From e13929cecb5ed29b369277ada3f9cba55b6c73ce Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 21:02:01 +0000 Subject: [PATCH] Nur noch die SwiftUI-App: Web-App, Lektionen und Webseite sind nach GitLab umgezogen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit web/, website/, der Workflow „Webseite veröffentlichen“ und der Web-Test-Job entfallen. Die Web-App liegt jetzt in gitlab.lgsit.de/visucode/visustruct-web. Das App-Symbol für die READMEs liegt jetzt in assets/. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Ugz28WZctz4XoTbKMHukUv --- .github/scripts/deploy-website.sh | 166 - .github/scripts/htaccess-cache.conf | 12 - .github/workflows/core-tests.yml | 22 - .github/workflows/deploy-website.yml | 76 - README.md | 8 +- VisuStruct-iOS/README.md | 2 +- .../assets => assets}/VisuStruct-icon.png | Bin web/.gitignore | 3 - web/README.md | 112 - web/index.html | 14 - web/laptop2.png | Bin 125328 -> 0 bytes web/lessons/README.md | 422 - web/lessons/bilder/ada-lovelace.jpg | Bin 70192 -> 0 bytes web/lessons/bilder/aufgabe-mehrwertsteuer.svg | 79 - web/lessons/bilder/ben-shneiderman.jpg | Bin 19298 -> 0 bytes web/lessons/bilder/caesar-ascii.svg | 98 - web/lessons/bilder/caesar-scheibe.svg | 62 - web/lessons/bilder/caesar-verschiebung.svg | 133 - .../bilder/en/aufgabe-mehrwertsteuer.svg | 79 - web/lessons/bilder/en/kino-saal.svg | 32 - web/lessons/bilder/en/kino-schleifen.svg | 49 - web/lessons/bilder/en/l01-pap.svg | 60 - web/lessons/bilder/en/l02-einfuegen.svg | 15 - .../bilder/en/l03-lochkarte-beschriftet.svg | 1019 - web/lessons/bilder/en/l03-lochkarte.svg | 998 - web/lessons/bilder/en/l04-camelcase.svg | 31 - web/lessons/bilder/en/l04-variable.svg | 22 - web/lessons/bilder/en/l04-zuweisung.svg | 15 - web/lessons/bilder/en/l05-tauschen.svg | 32 - web/lessons/bilder/en/l08-zahlenstrahl.svg | 21 - web/lessons/bilder/en/l10-kopfgesteuert.svg | 19 - web/lessons/bilder/en/l11-vergleich.svg | 27 - web/lessons/bilder/en/l12-for-ablauf.svg | 24 - web/lessons/bilder/en/l12-while-zu-for.svg | 44 - .../bilder/en/l13-verschachtelt-tabelle.svg | 193 - web/lessons/bilder/en/l14-array.svg | 15 - web/lessons/bilder/en/l20-cpp.svg | 35 - web/lessons/bilder/en/l20-jvm.svg | 31 - web/lessons/bilder/en/mvc-klick.svg | 75 - web/lessons/bilder/en/ss-binaere-suche.svg | 67 - web/lessons/bilder/en/ss-bubblesort.svg | 35 - web/lessons/bilder/en/ss-lineare-suche.svg | 23 - web/lessons/bilder/en/ss-vergleiche.svg | 22 - web/lessons/bilder/en/uebergabe.svg | 42 - web/lessons/bilder/en/zk-zeichen.svg | 29 - web/lessons/bilder/grace-hopper.jpg | Bin 46537 -> 0 bytes web/lessons/bilder/hedy-lamarr.jpg | Bin 40173 -> 0 bytes web/lessons/bilder/ike-nassi.jpg | Bin 19505 -> 0 bytes web/lessons/bilder/katherine-johnson.jpg | Bin 41104 -> 0 bytes web/lessons/bilder/kino-saal.svg | 32 - web/lessons/bilder/kino-schleifen.svg | 49 - web/lessons/bilder/l01-pap.svg | 60 - web/lessons/bilder/l02-einfuegen.svg | 15 - .../bilder/l03-lochkarte-beschriftet.svg | 1016 - web/lessons/bilder/l03-lochkarte.svg | 995 - web/lessons/bilder/l03-zuse-lochstreifen.svg | 226 - web/lessons/bilder/l04-camelcase.svg | 31 - web/lessons/bilder/l04-variable.svg | 22 - web/lessons/bilder/l04-zuweisung.svg | 15 - web/lessons/bilder/l05-tauschen.svg | 32 - .../bilder/l07-schreibtischtest-de.svg | 52 - .../bilder/l07-schreibtischtest-en.svg | 52 - .../bilder/l07-schreibtischtest-pt.svg | 52 - web/lessons/bilder/l08-zahlenstrahl.svg | 21 - web/lessons/bilder/l09-wahrheitstabelle.svg | 29 - web/lessons/bilder/l10-kopfgesteuert.svg | 19 - web/lessons/bilder/l11-vergleich.svg | 27 - web/lessons/bilder/l12-for-ablauf.svg | 24 - web/lessons/bilder/l12-while-zu-for.svg | 44 - .../bilder/l13-verschachtelt-tabelle.svg | 193 - web/lessons/bilder/l14-array.svg | 15 - web/lessons/bilder/l20-cpp.svg | 35 - web/lessons/bilder/l20-jvm.svg | 31 - web/lessons/bilder/margaret-hamilton.jpg | Bin 41701 -> 0 bytes web/lessons/bilder/mvc-klick.svg | 75 - .../bilder/pt/aufgabe-mehrwertsteuer.svg | 79 - web/lessons/bilder/pt/kino-saal.svg | 32 - web/lessons/bilder/pt/kino-schleifen.svg | 49 - web/lessons/bilder/pt/l01-pap.svg | 60 - web/lessons/bilder/pt/l02-einfuegen.svg | 15 - .../bilder/pt/l03-lochkarte-beschriftet.svg | 1015 - web/lessons/bilder/pt/l03-lochkarte.svg | 994 - web/lessons/bilder/pt/l04-camelcase.svg | 31 - web/lessons/bilder/pt/l04-variable.svg | 22 - web/lessons/bilder/pt/l04-zuweisung.svg | 15 - web/lessons/bilder/pt/l05-tauschen.svg | 32 - web/lessons/bilder/pt/l08-zahlenstrahl.svg | 20 - web/lessons/bilder/pt/l10-kopfgesteuert.svg | 19 - web/lessons/bilder/pt/l11-vergleich.svg | 27 - web/lessons/bilder/pt/l12-for-ablauf.svg | 24 - web/lessons/bilder/pt/l12-while-zu-for.svg | 44 - .../bilder/pt/l13-verschachtelt-tabelle.svg | 193 - web/lessons/bilder/pt/l14-array.svg | 15 - web/lessons/bilder/pt/l20-cpp.svg | 35 - web/lessons/bilder/pt/l20-jvm.svg | 31 - web/lessons/bilder/pt/mvc-klick.svg | 75 - web/lessons/bilder/pt/schiffe-versenken.svg | 55 - web/lessons/bilder/pt/ss-binaere-suche.svg | 67 - web/lessons/bilder/pt/ss-bubblesort.svg | 35 - web/lessons/bilder/pt/ss-lineare-suche.svg | 23 - web/lessons/bilder/pt/ss-vergleiche.svg | 22 - web/lessons/bilder/pt/uebergabe.svg | 42 - web/lessons/bilder/pt/zk-zeichen.svg | 31 - web/lessons/bilder/schiffe-versenken.svg | 55 - web/lessons/bilder/ss-binaere-suche.svg | 67 - web/lessons/bilder/ss-bubblesort.svg | 35 - web/lessons/bilder/ss-lineare-suche.svg | 23 - web/lessons/bilder/ss-vergleiche.svg | 22 - web/lessons/bilder/uebergabe.svg | 42 - web/lessons/bilder/zk-zeichen.svg | 27 - web/lessons/de/01-was-ist-ein-struktogramm.md | 229 - web/lessons/de/01-weitere-darstellungen.md | 246 - web/lessons/de/02-der-editor.md | 188 - .../de/03-speichern-oeffnen-exportieren.md | 171 - web/lessons/de/04-variablen-und-datentypen.md | 407 - web/lessons/de/05-sequenz.md | 253 - web/lessons/de/06-eingabe-und-ausgabe.md | 432 - .../de/07-simulation-und-schreibtischtest.md | 364 - web/lessons/de/08-verzweigung.md | 368 - web/lessons/de/09-bedingungen-verknuepfen.md | 328 - web/lessons/de/10-fallauswahl.md | 330 - web/lessons/de/11-while-schleife.md | 359 - web/lessons/de/12-do-while-schleife.md | 279 - web/lessons/de/13-for-schleife.md | 337 - web/lessons/de/14-verschachteln.md | 305 - web/lessons/de/15-arrays.md | 362 - web/lessons/de/16-zweidimensionale-arrays.md | 317 - web/lessons/de/17-zeichenketten.md | 528 - web/lessons/de/18-aufruf-und-aussprung.md | 483 - web/lessons/de/19-suchen-und-sortieren.md | 352 - web/lessons/de/20-java.md | 472 - web/lessons/de/21-python-und-javascript.md | 240 - web/lessons/de/22-try-und-catch.md | 293 - .../de/23-text-einlesen-und-speichern.md | 254 - web/lessons/de/24-zeile-fuer-zeile.md | 256 - web/lessons/de/25-tabellen-als-csv.md | 224 - web/lessons/de/26-json.md | 225 - web/lessons/de/27-formate-im-vergleich.md | 175 - web/lessons/de/28-erstes-fenster.md | 230 - web/lessons/de/29-knopf-im-fenster.md | 231 - web/lessons/de/30-der-knopf-reagiert.md | 356 - web/lessons/de/31-zahl-verdoppeln.md | 295 - web/lessons/de/32-klickzaehler.md | 246 - web/lessons/de/33-ampel.md | 290 - web/lessons/de/34-notenrechner.md | 290 - web/lessons/de/35-taschenrechner.md | 285 - web/lessons/de/36-zahlenraten.md | 242 - .../de/37-viele-knoepfe-ein-zuhoerer.md | 319 - web/lessons/de/38-innere-klassen.md | 246 - web/lessons/de/39-zwei-reiter.md | 295 - web/lessons/de/40-model-view-controller.md | 430 - .../de/aufgaben/alter-unterprogramm.md | 21 - web/lessons/de/aufgaben/ballwurf.md | 29 - web/lessons/de/aufgaben/bestenliste.md | 34 - web/lessons/de/aufgaben/binaerzahl.md | 42 - web/lessons/de/aufgaben/caesar.md | 134 - web/lessons/de/aufgaben/collatz.md | 44 - web/lessons/de/aufgaben/einheitenrechner.md | 55 - web/lessons/de/aufgaben/fibonacci.md | 54 - web/lessons/de/aufgaben/gerade-ungerade.md | 36 - web/lessons/de/aufgaben/mehrwertsteuer.md | 41 - web/lessons/de/aufgaben/notendurchschnitt.md | 35 - web/lessons/de/aufgaben/pin-pruefen.md | 40 - web/lessons/de/aufgaben/schiffe-versenken.md | 37 - web/lessons/de/aufgaben/speisekarte.md | 36 - web/lessons/de/aufgaben/summe-bilden.md | 16 - web/lessons/de/aufgaben/tafeldienst.md | 37 - web/lessons/de/aufgaben/taschenrechner.md | 36 - web/lessons/de/aufgaben/verleih-menue.md | 35 - web/lessons/de/aufgaben/vokabeltrainer.md | 35 - web/lessons/de/aufgaben/volljaehrig.md | 36 - web/lessons/de/aufgaben/wuerfel-mvc.md | 45 - web/lessons/de/aufgaben/zahl-verdoppeln.md | 16 - web/lessons/de/begriffe.md | 258 - web/lessons/de/nachschlagen.md | 169 - .../de/visubot/00-struktogramm-und-editor.md | 162 - web/lessons/de/visubot/01-der-mbot2.md | 416 - web/lessons/de/visubot/02-das-quadrat.md | 365 - web/lessons/de/visubot/02-quadrat-als-pap.md | 182 - .../de/visubot/03-variablen-und-ausgabe.md | 249 - .../de/visubot/03-zeile-fuer-zeile-testen.md | 183 - web/lessons/de/visubot/04-sensoren.md | 179 - web/lessons/de/visubot/05-bis-zur-wand.md | 207 - .../de/visubot/05-erst-fahren-dann-pruefen.md | 271 - .../de/visubot/05-zaehlen-und-summieren.md | 154 - web/lessons/de/visubot/06-abstand.md | 189 - web/lessons/de/visubot/06-konstanten-final.md | 151 - web/lessons/de/visubot/06-nah-mittel-weit.md | 189 - web/lessons/de/visubot/07-linie.md | 257 - web/lessons/de/visubot/07-und-oder.md | 257 - web/lessons/de/visubot/08-farben.md | 163 - web/lessons/de/visubot/08-groesster-wert.md | 162 - .../de/visubot/09-fallauswahl-mbot2.md | 231 - web/lessons/de/visubot/10-tasten-joystick.md | 177 - .../de/visubot/10-unterbrechen-mit-break.md | 230 - web/lessons/de/visubot/11-licht.md | 164 - web/lessons/de/visubot/11-merker-boolean.md | 155 - web/lessons/de/visubot/12-lautstaerke.md | 163 - web/lessons/de/visubot/13-neigung.md | 184 - web/lessons/de/visubot/14-leds.md | 216 - web/lessons/de/visubot/15-einzelne-leds.md | 209 - web/lessons/de/visubot/16-lautsprecher.md | 167 - web/lessons/de/visubot/17-arrays-melodie.md | 244 - web/lessons/de/visubot/18-bildschirm.md | 206 - web/lessons/de/visubot/19-zeichenketten.md | 192 - web/lessons/de/visubot/20-motoren.md | 171 - web/lessons/de/visubot/21-stoppuhr-akku.md | 173 - web/lessons/de/visubot/21-zustaende.md | 160 - web/lessons/de/visubot/22-eigene-methoden.md | 334 - .../de/visubot/23-wie-geht-es-weiter.md | 148 - .../de/visubot/aufgaben/alarmanlage.md | 19 - web/lessons/de/visubot/aufgaben/ausgang.md | 19 - .../de/visubot/aufgaben/binaer-zaehlen.md | 25 - web/lessons/de/visubot/aufgaben/dreieck.md | 23 - web/lessons/de/visubot/aufgaben/einparken.md | 20 - web/lessons/de/visubot/aufgaben/hindernis.md | 18 - .../de/visubot/aufgaben/knight-rider.md | 17 - web/lessons/de/visubot/aufgaben/labyrinth.md | 25 - .../de/visubot/aufgaben/linienfolger-stopp.md | 21 - web/lessons/de/visubot/aufgaben/morsen.md | 17 - .../de/visubot/aufgaben/nachtwaechter.md | 18 - web/lessons/de/visubot/aufgaben/slalom.md | 19 - web/lessons/de/visubot/aufgaben/spirale.md | 19 - web/lessons/de/visubot/aufgaben/treppe.md | 17 - web/lessons/de/visubot/aufgaben/tunnel.md | 21 - web/lessons/de/visubot/aufgaben/wald.md | 19 - .../de/visubot/bloecke/01-losfahren.md | 120 - .../de/visubot/bloecke/02-immer-wieder.md | 122 - .../de/visubot/bloecke/03-der-mbot2-misst.md | 112 - .../de/visubot/bloecke/04-entscheidungen.md | 109 - .../visubot/bloecke/05-lichter-und-toene.md | 134 - .../bloecke/06-immer-wieder-pruefen.md | 136 - .../de/visubot/bloecke/07-der-linie-folgen.md | 125 - web/lessons/de/visubot/bloecke/08-parcours.md | 123 - .../visubot/bloecke/aufgaben/block-ausgang.md | 19 - .../visubot/bloecke/aufgaben/block-disco.md | 19 - .../visubot/bloecke/aufgaben/block-slalom.md | 19 - .../de/visubot/bloecke/aufgaben/block-wald.md | 19 - web/lessons/de/visubot/nachschlagen.md | 168 - .../aufgabe-alter-haupt-loesung.visustruct | 12 - ...abe-alter-unterprogramm-loesung.visustruct | 19 - .../aufgabe-ballwurf-loesung.visustruct | 81 - .../aufgabe-ballwurf-start.visustruct | 9 - .../aufgabe-bestenliste-loesung.visustruct | 65 - .../aufgabe-binaer-loesung.visustruct | 26 - .../aufgabe-caesar-array-loesung.visustruct | 54 - .../aufgabe-caesar-array-start.visustruct | 6 - .../aufgabe-caesar-ascii-loesung.visustruct | 31 - ...e-caesar-entschluesseln-loesung.visustruct | 31 - .../aufgabe-collatz-loesung.visustruct | 36 - .../aufgabe-durchschnitt-loesung.visustruct | 28 - .../aufgabe-fibonacci-loesung.visustruct | 37 - .../aufgabe-gerade-loesung.visustruct | 19 - .../aufgabe-mehrwertsteuer-loesung.visustruct | 21 - .../aufgabe-pin-java-loesung.visustruct | 36 - .../diagramme/aufgabe-pin-loesung.visustruct | 36 - .../aufgabe-rechner-loesung.visustruct | 44 - .../aufgabe-schiffe-loesung.visustruct | 54 - .../aufgabe-schiffe-start.visustruct | 27 - .../aufgabe-speisekarte-loesung.visustruct | 29 - .../aufgabe-summe-loesung.visustruct | 15 - .../aufgabe-tafeldienst-loesung.visustruct | 22 - .../aufgabe-verdoppeln-loesung.visustruct | 12 - .../aufgabe-verleih-java-loesung.visustruct | 47 - .../aufgabe-verleih-loesung.visustruct | 37 - .../aufgabe-vokabeln-loesung.visustruct | 60 - .../aufgabe-vokabeln-start.visustruct | 9 - .../aufgabe-volljaehrig-loesung.visustruct | 19 - web/lessons/diagramme/dt-buffered.visustruct | 23 - web/lessons/diagramme/dt-csv.visustruct | 18 - web/lessons/diagramme/dt-json.visustruct | 18 - web/lessons/diagramme/dt-lesen.visustruct | 20 - .../en/aufgabe-alter-haupt-loesung.visustruct | 12 - ...abe-alter-unterprogramm-loesung.visustruct | 19 - .../en/aufgabe-ballwurf-loesung.visustruct | 81 - .../en/aufgabe-ballwurf-start.visustruct | 9 - .../en/aufgabe-bestenliste-loesung.visustruct | 65 - .../en/aufgabe-binaer-loesung.visustruct | 26 - .../aufgabe-caesar-array-loesung.visustruct | 54 - .../en/aufgabe-caesar-array-start.visustruct | 6 - .../aufgabe-caesar-ascii-loesung.visustruct | 31 - ...e-caesar-entschluesseln-loesung.visustruct | 31 - .../en/aufgabe-collatz-loesung.visustruct | 36 - .../aufgabe-durchschnitt-loesung.visustruct | 28 - .../en/aufgabe-fibonacci-loesung.visustruct | 37 - .../en/aufgabe-gerade-loesung.visustruct | 19 - .../aufgabe-mehrwertsteuer-loesung.visustruct | 21 - .../en/aufgabe-pin-java-loesung.visustruct | 36 - .../en/aufgabe-pin-loesung.visustruct | 36 - .../en/aufgabe-rechner-loesung.visustruct | 44 - .../en/aufgabe-schiffe-loesung.visustruct | 54 - .../en/aufgabe-schiffe-start.visustruct | 27 - .../en/aufgabe-speisekarte-loesung.visustruct | 29 - .../en/aufgabe-summe-loesung.visustruct | 15 - .../en/aufgabe-tafeldienst-loesung.visustruct | 22 - .../en/aufgabe-verdoppeln-loesung.visustruct | 12 - .../aufgabe-verleih-java-loesung.visustruct | 47 - .../en/aufgabe-verleih-loesung.visustruct | 37 - .../en/aufgabe-vokabeln-loesung.visustruct | 60 - .../en/aufgabe-vokabeln-start.visustruct | 9 - .../en/aufgabe-volljaehrig-loesung.visustruct | 19 - .../diagramme/en/dt-buffered.visustruct | 23 - web/lessons/diagramme/en/dt-csv.visustruct | 18 - web/lessons/diagramme/en/dt-json.visustruct | 18 - web/lessons/diagramme/en/dt-lesen.visustruct | 20 - .../en/kino-einmaleins-loesung.visustruct | 32 - .../diagramme/en/kino-frei-loesung.visustruct | 48 - .../diagramme/en/kino-frei-start.visustruct | 15 - .../en/kino-karte-loesung.visustruct | 34 - .../diagramme/en/kino-karte-start.visustruct | 18 - .../diagramme/en/kino-saalplan.visustruct | 48 - .../diagramme/en/kino-verkaufen.visustruct | 24 - .../en/l04-gross-klein-loesung.visustruct | 15 - .../en/l04-gross-klein-start.visustruct | 15 - .../en/l04-java-fehler-loesung.visustruct | 15 - .../en/l04-java-fehler-start.visustruct | 15 - .../l04-java-laeuft-nicht-loesung.visustruct | 12 - .../en/l04-java-laeuft-nicht-start.visustruct | 12 - .../en/l04-java-steckbrief-loesung.visustruct | 18 - .../diagramme/en/l04-rechnen.visustruct | 15 - .../en/l04-reihenfolge-loesung.visustruct | 15 - .../en/l04-reihenfolge-start.visustruct | 15 - .../en/l04-tauschen-loesung.visustruct | 24 - .../en/l04-tauschen-start.visustruct | 15 - .../diagramme/en/l04-tauschen.visustruct | 24 - .../diagramme/en/l05-datentypen.visustruct | 18 - .../diagramme/en/l05-division.visustruct | 15 - .../en/l05-einkauf-loesung.visustruct | 15 - .../en/l05-java-fehler-loesung.visustruct | 15 - .../en/l05-java-fehler-start.visustruct | 15 - .../en/l05-java-kino-loesung.visustruct | 15 - .../l05-java-laeuft-nicht-loesung.visustruct | 15 - .../en/l05-java-laeuft-nicht-start.visustruct | 15 - .../en/l05-rechteck-loesung.visustruct | 21 - .../en/l05-sekunden-loesung.visustruct | 15 - .../en/l05-sekunden-start.visustruct | 9 - .../diagramme/en/l05-sequenz.visustruct | 15 - .../en/l06-begruessung-loesung.visustruct | 9 - web/lessons/diagramme/en/l06-eva.visustruct | 15 - .../en/l06-java-fehler-loesung.visustruct | 12 - .../en/l06-java-fehler-start.visustruct | 12 - .../l06-java-laeuft-nicht-loesung.visustruct | 9 - .../en/l06-java-laeuft-nicht-start.visustruct | 9 - .../en/l06-java-tage-loesung.visustruct | 12 - .../en/l06-mittelwert-loesung.visustruct | 15 - .../en/l06-rechner-loesung.visustruct | 21 - .../diagramme/en/l07-alter-pruefen.visustruct | 19 - .../en/l07-betrag-loesung.visustruct | 22 - .../en/l07-gerade-loesung.visustruct | 19 - .../en/l07-java-fehler-loesung.visustruct | 18 - .../en/l07-java-fehler-start.visustruct | 18 - .../l07-java-laeuft-nicht-loesung.visustruct | 15 - .../en/l07-java-laeuft-nicht-start.visustruct | 15 - .../en/l07-java-pizza-loesung.visustruct | 18 - .../en/l07-java-pizza-start.visustruct | 18 - .../en/l07-maximum-loesung.visustruct | 22 - .../diagramme/en/l07-rabatt.visustruct | 22 - .../en/l08-gueltig-loesung.visustruct | 19 - .../en/l08-java-bestanden-loesung.visustruct | 19 - .../en/l08-java-fehler-loesung.visustruct | 19 - .../en/l08-java-fehler-start.visustruct | 19 - .../l08-java-laeuft-nicht-loesung.visustruct | 19 - .../en/l08-java-laeuft-nicht-start.visustruct | 19 - .../diagramme/en/l08-jugendticket.visustruct | 19 - web/lessons/diagramme/en/l08-note.visustruct | 19 - .../en/l08-schaltjahr-loesung.visustruct | 19 - .../en/l08-wochenende-loesung.visustruct | 19 - web/lessons/diagramme/en/l09-ampel.visustruct | 29 - .../diagramme/en/l09-automat.visustruct | 29 - .../en/l09-java-fehler-loesung.visustruct | 19 - .../en/l09-java-fehler-start.visustruct | 19 - .../l09-java-laeuft-nicht-loesung.visustruct | 19 - .../en/l09-java-laeuft-nicht-start.visustruct | 19 - .../en/l09-java-schule-loesung.visustruct | 19 - .../diagramme/en/l09-note-loesung.visustruct | 44 - .../en/l09-rechner-loesung.visustruct | 47 - .../diagramme/en/l09-verschachtelt.visustruct | 39 - .../diagramme/en/l1-grundbausteine.visustruct | 30 - .../diagramme/en/l1-sequenz.visustruct | 15 - web/lessons/diagramme/en/l1-tee.visustruct | 21 - .../diagramme/en/l1-verzweigung.visustruct | 19 - .../diagramme/en/l1-wiederholung.visustruct | 14 - .../diagramme/en/l10-bis-n-loesung.visustruct | 20 - .../diagramme/en/l10-countdown.visustruct | 20 - .../diagramme/en/l10-endlos.visustruct | 17 - .../diagramme/en/l10-fakultaet.visustruct | 26 - .../en/l10-java-fehler-loesung.visustruct | 35 - .../en/l10-java-fehler-start.visustruct | 35 - .../l10-java-laeuft-nicht-loesung.visustruct | 24 - .../en/l10-java-laeuft-nicht-start.visustruct | 24 - .../en/l10-java-wuerfel-loesung.visustruct | 29 - .../en/l10-verdoppeln-loesung.visustruct | 23 - .../en/l11-eingabe-pruefen.visustruct | 17 - .../diagramme/en/l11-einmal.visustruct | 17 - .../en/l11-java-fehler-loesung.visustruct | 26 - .../en/l11-java-fehler-start.visustruct | 26 - .../en/l11-java-gerade-loesung.visustruct | 20 - .../l11-java-laeuft-nicht-loesung.visustruct | 20 - .../en/l11-java-laeuft-nicht-start.visustruct | 20 - .../diagramme/en/l11-note-loesung.visustruct | 17 - .../diagramme/en/l11-summe-loesung.visustruct | 23 - .../en/l12-countdown-loesung.visustruct | 19 - .../en/l12-einmaleins-loesung.visustruct | 19 - .../en/l12-eins-bis-fuenf.visustruct | 13 - .../en/l12-java-fehler-loesung.visustruct | 17 - .../en/l12-java-fehler-start.visustruct | 17 - .../l12-java-laeuft-nicht-loesung.visustruct | 20 - .../en/l12-java-laeuft-nicht-start.visustruct | 20 - .../en/l12-java-verdoppeln-loesung.visustruct | 17 - web/lessons/diagramme/en/l12-summe.visustruct | 22 - .../diagramme/en/l13-dreieck.visustruct | 29 - .../en/l13-gerade-eingaben-loesung.visustruct | 32 - .../en/l13-gerade-zaehlen.visustruct | 32 - .../en/l13-java-fehler-loesung.visustruct | 16 - .../en/l13-java-fehler-start.visustruct | 16 - .../l13-java-laeuft-nicht-loesung.visustruct | 19 - .../en/l13-java-laeuft-nicht-start.visustruct | 16 - .../en/l13-java-quadrate-loesung.visustruct | 16 - .../en/l13-rechteck-loesung.visustruct | 32 - .../en/l14-array-durchlaufen.visustruct | 16 - .../en/l14-erster-letzter-loesung.visustruct | 15 - .../en/l14-java-fehler-loesung.visustruct | 32 - .../en/l14-java-fehler-start.visustruct | 32 - .../l14-java-laeuft-nicht-loesung.visustruct | 23 - .../en/l14-java-laeuft-nicht-start.visustruct | 23 - .../en/l14-java-treppe-loesung.visustruct | 29 - .../en/l14-namen-eingeben.visustruct | 19 - .../en/l14-rueckwaerts-loesung.visustruct | 26 - .../en/l14-summe-max-loesung.visustruct | 51 - .../diagramme/en/l14-summe-maximum.visustruct | 41 - .../en/l15-bis-null-loesung.visustruct | 23 - .../en/l15-endlos-aussprung.visustruct | 30 - .../en/l15-flaeche-loesung.visustruct | 15 - ...5-flaeche-unterprogramm-loesung.visustruct | 6 - .../diagramme/en/l15-hauptprogramm.visustruct | 12 - .../en/l15-java-fehler-loesung.visustruct | 32 - .../en/l15-java-fehler-start.visustruct | 32 - .../l15-java-laeuft-nicht-loesung.visustruct | 22 - .../en/l15-java-laeuft-nicht-start.visustruct | 22 - .../en/l15-java-noten-loesung.visustruct | 22 - .../diagramme/en/l15-quadrat-haupt.visustruct | 12 - .../diagramme/en/l15-quadrat.visustruct | 9 - .../diagramme/en/l15-titel-loesung.visustruct | 12 - .../diagramme/en/l15-unterprogramm.visustruct | 9 - .../en/l15-zeige-summe-haupt.visustruct | 12 - .../diagramme/en/l15-zeige-summe.visustruct | 9 - .../en/l16-countdown-loesung.visustruct | 23 - .../en/l16-countdown-start.visustruct | 23 - .../en/l16-java-fehler-loesung.visustruct | 22 - .../en/l16-java-fehler-start.visustruct | 22 - .../l16-java-laeuft-nicht-loesung.visustruct | 9 - .../en/l16-java-laeuft-nicht-start.visustruct | 9 - .../en/l16-java-punkte-loesung.visustruct | 29 - .../diagramme/en/l16-schreibtisch.visustruct | 23 - .../diagramme/en/l16-summe-loesung.visustruct | 22 - .../diagramme/en/l16-summe-start.visustruct | 22 - .../diagramme/en/l17-beispiel.visustruct | 32 - .../en/l17-fakultaet-loesung.visustruct | 22 - .../en/l17-java-brief-loesung.visustruct | 32 - .../en/l17-java-brief-start.visustruct | 6 - .../en/l17-java-fehler-loesung.visustruct | 12 - .../en/l17-java-fehler-start.visustruct | 12 - .../l17-java-laeuft-nicht-loesung.visustruct | 9 - .../en/l17-java-laeuft-nicht-start.visustruct | 9 - .../en/l17-java-passwort-loesung.visustruct | 19 - .../en/l17-ticket-loesung.visustruct | 29 - .../diagramme/en/l18-beispiel.visustruct | 20 - .../en/l18-java-fehler-loesung.visustruct | 33 - .../en/l18-java-fehler-start.visustruct | 33 - .../en/l18-java-kasse-loesung.visustruct | 42 - .../diagramme/en/l18-js-loesung.visustruct | 22 - .../en/l18-python-loesung.visustruct | 16 - .../en/l19-java-fehler-loesung.visustruct | 39 - .../en/l19-java-fehler-start.visustruct | 39 - .../l19-java-laeuft-nicht-loesung.visustruct | 35 - .../en/l19-java-laeuft-nicht-start.visustruct | 35 - .../en/l19-java-zaehlen-loesung.visustruct | 35 - .../diagramme/en/l2-ausgabe.visustruct | 9 - .../diagramme/en/l2-hallo-loesung.visustruct | 6 - .../en/l2-zwei-zeilen-loesung.visustruct | 9 - .../en/l23-java-ergaenzen-loesung.visustruct | 41 - .../en/l23-java-ergaenzen-start.visustruct | 9 - .../en/l23-java-nummern-loesung.visustruct | 26 - .../en/l23-java-nummern-start.visustruct | 6 - .../en/l24-java-fuchs-loesung.visustruct | 39 - .../en/l24-java-fuchs-start.visustruct | 9 - .../en/l24-java-laengster-loesung.visustruct | 35 - .../en/l24-java-laengster-start.visustruct | 9 - .../en/l25-java-beste-loesung.visustruct | 54 - .../en/l25-java-beste-start.visustruct | 9 - .../en/l25-java-schnitt-loesung.visustruct | 41 - .../en/l25-java-schnitt-start.visustruct | 9 - .../en/l26-java-namen-loesung.visustruct | 39 - .../en/l26-java-namen-start.visustruct | 9 - .../en/l26-java-schreiben-loesung.visustruct | 50 - .../en/l26-java-schreiben-start.visustruct | 18 - .../en/l27-java-json-loesung.visustruct | 53 - .../en/l27-java-json-start.visustruct | 21 - .../en/l27-java-saetze-loesung.visustruct | 44 - .../en/l27-java-saetze-start.visustruct | 21 - .../diagramme/en/sim-kino-loesung.visustruct | 12 - .../diagramme/en/sim-kino-start.visustruct | 12 - .../en/sim-tausch-loesung.visustruct | 24 - .../diagramme/en/sim-tausch-start.visustruct | 21 - .../diagramme/en/sim-tausch.visustruct | 24 - .../en/ss-absteigend-loesung.visustruct | 59 - .../en/ss-absteigend-start.visustruct | 59 - .../diagramme/en/ss-binaere-suche.visustruct | 74 - .../diagramme/en/ss-bubblesort.visustruct | 49 - .../en/ss-karte-suchen-loesung.visustruct | 49 - .../diagramme/en/ss-lineare-suche.visustruct | 58 - .../en/uebergabe-bonus-loesung.visustruct | 19 - .../en/uebergabe-bonus-start.visustruct | 19 - ...abe-bonus-unterprogramm-loesung.visustruct | 13 - .../diagramme/en/uebergabe-haupt.visustruct | 24 - .../diagramme/en/uebergabe-leeren.visustruct | 13 - .../en/uebergabe-verdopple.visustruct | 9 - .../en/vb-abstand-anzeigen-loesung.visustruct | 9 - .../en/vb-abstand-halten-loesung.visustruct | 26 - .../en/vb-alarmanlage-loesung.visustruct | 27 - .../diagramme/en/vb-ampel-loesung.visustruct | 18 - .../en/vb-ampel-zustand-loesung.visustruct | 43 - .../en/vb-ausgang-loesung.visustruct | 30 - .../en/vb-begruessung-loesung.visustruct | 12 - .../en/vb-binaer-zaehlen-loesung.visustruct | 52 - .../en/vb-bis-rot-loesung.visustruct | 11 - .../en/vb-bis-wand-loesung.visustruct | 11 - .../en/vb-bis-ziel-loesung.visustruct | 11 - .../en/vb-buchstaben-loesung.visustruct | 19 - .../en/vb-do-while-loesung.visustruct | 14 - .../en/vb-drei-lichter-loesung.visustruct | 12 - .../en/vb-dreieck-loesung.visustruct | 16 - .../en/vb-einparken-loesung.visustruct | 28 - .../en/vb-erster-plan-loesung.visustruct | 18 - .../diagramme/en/vb-farben-loesung.visustruct | 16 - .../en/vb-farbweiche-loesung.visustruct | 26 - .../en/vb-fehler-04-sensoren-start.visustruct | 16 - ...vb-fehler-05-bis-zur-wand-start.visustruct | 11 - ...-erst-fahren-dann-pruefen-start.visustruct | 20 - ...-05-zaehlen-und-summieren-start.visustruct | 31 - .../en/vb-fehler-06-abstand-start.visustruct | 14 - ...ehler-06-konstanten-final-start.visustruct | 19 - ...fehler-06-nah-mittel-weit-start.visustruct | 26 - .../en/vb-fehler-07-linie-start.visustruct | 30 - .../en/vb-fehler-07-und-oder-start.visustruct | 14 - .../en/vb-fehler-08-farben-start.visustruct | 24 - ...-fehler-08-groesster-wert-start.visustruct | 41 - ...hler-09-fallauswahl-mbot2-start.visustruct | 26 - ...fehler-10-tasten-joystick-start.visustruct | 33 - ...10-unterbrechen-mit-break-start.visustruct | 27 - .../en/vb-fehler-11-licht-start.visustruct | 19 - ...-fehler-11-merker-boolean-start.visustruct | 42 - .../vb-fehler-12-lautstaerke-start.visustruct | 16 - .../en/vb-fehler-13-neigung-start.visustruct | 16 - .../en/vb-fehler-14-leds-start.visustruct | 22 - ...b-fehler-15-einzelne-leds-start.visustruct | 19 - ...vb-fehler-16-lautsprecher-start.visustruct | 13 - ...-fehler-17-arrays-melodie-start.visustruct | 38 - .../vb-fehler-18-bildschirm-start.visustruct | 19 - ...b-fehler-19-zeichenketten-start.visustruct | 9 - .../en/vb-fehler-20-motoren-start.visustruct | 44 - ...b-fehler-21-stoppuhr-akku-start.visustruct | 19 - .../vb-fehler-21-zustaende-start.visustruct | 48 - ...fehler-22-eigene-methoden-start.visustruct | 22 - ...ler-23-wie-geht-es-weiter-start.visustruct | 11 - .../en/vb-gas-bis-wand-loesung.visustruct | 17 - .../diagramme/en/vb-gerade-loesung.visustruct | 18 - .../en/vb-hindernis-loesung.visustruct | 36 - .../en/vb-java-akku-loesung.visustruct | 19 - .../en/vb-java-ampel-text-loesung.visustruct | 48 - .../en/vb-java-blau-gruen-loesung.visustruct | 24 - .../en/vb-java-blinken-loesung.visustruct | 22 - .../en/vb-java-countdown-loesung.visustruct | 19 - .../en/vb-java-hoeher-loesung.visustruct | 13 - .../en/vb-java-joystick-loesung.visustruct | 33 - .../vb-java-klatsch-merker-loesung.visustruct | 42 - ...vb-java-konstante-seite-loesung.visustruct | 19 - .../en/vb-java-laermampel-loesung.visustruct | 16 - .../en/vb-java-lauflicht-loesung.visustruct | 19 - .../vb-java-linienfolger-loesung.visustruct | 44 - .../vb-java-nachtlicht-ton-loesung.visustruct | 19 - .../en/vb-java-rand-loesung.visustruct | 30 - .../en/vb-java-rechteck-loesung.visustruct | 28 - ...va-rechteck-umdrehungen-loesung.visustruct | 22 - .../en/vb-java-richtung-loesung.visustruct | 41 - ...b-java-schritte-zaehlen-loesung.visustruct | 20 - .../vb-java-sicher-fahren-loesung.visustruct | 14 - ...vb-java-spirale-strecke-loesung.visustruct | 31 - .../en/vb-java-tageszeit-loesung.visustruct | 26 - .../en/vb-java-taste-stopp-loesung.visustruct | 27 - .../en/vb-java-textlaenge-loesung.visustruct | 9 - .../en/vb-java-wand-piep-loesung.visustruct | 14 - .../en/vb-java-wasserwaage-loesung.visustruct | 16 - .../en/vb-klatschen-loesung.visustruct | 14 - .../en/vb-knight-rider-loesung.visustruct | 35 - .../en/vb-konstante-wand-loesung.visustruct | 17 - .../en/vb-l00-bausteine-loesung.visustruct | 26 - .../en/vb-l00-sequenz-loesung.visustruct | 12 - .../en/vb-l03-wachsend-loesung.visustruct | 22 - .../diagramme/en/vb-l06k-mit.visustruct | 25 - .../diagramme/en/vb-l06k-ohne.visustruct | 22 - .../en/vb-l06n-einparkhilfe.visustruct | 26 - .../en/vb-l21z-ausweichen.visustruct | 39 - .../en/vb-labyrinth-loesung.visustruct | 34 - .../en/vb-laufschrift-loesung.visustruct | 19 - .../vb-linienfolger-stopp-loesung.visustruct | 44 - .../en/vb-linienmuster-loesung.visustruct | 26 - .../en/vb-meister-platz-loesung.visustruct | 35 - .../en/vb-melodie-loesung.visustruct | 16 - .../en/vb-messreihe-loesung.visustruct | 38 - .../diagramme/en/vb-morsen-loesung.visustruct | 66 - .../en/vb-nachtlicht-loesung.visustruct | 16 - .../en/vb-nachtwaechter-loesung.visustruct | 17 - .../en/vb-notbremse-loesung.visustruct | 27 - .../diagramme/en/vb-oder-loesung.visustruct | 16 - .../en/vb-quadrat-loesung.visustruct | 75 - .../en/vb-quadrat-methode-loesung.visustruct | 9 - .../en/vb-quadrat-schleife-loesung.visustruct | 55 - ...b-quadrat-unterprogramm-loesung.visustruct | 16 - ...b-quadrat-verschachtelt-loesung.visustruct | 23 - .../diagramme/en/vb-rand-loesung.visustruct | 14 - .../en/vb-schraeglage-loesung.visustruct | 16 - .../en/vb-schritte-welt-loesung.visustruct | 20 - .../diagramme/en/vb-slalom-loesung.visustruct | 52 - .../en/vb-spirale-falsch-loesung.visustruct | 22 - .../en/vb-spirale-falsch-start.visustruct | 22 - .../en/vb-spirale-loesung.visustruct | 16 - .../en/vb-start-a-loesung.visustruct | 14 - .../en/vb-startsignal-loesung.visustruct | 34 - .../en/vb-strecke-anzeigen-loesung.visustruct | 34 - .../en/vb-tempo-abstand-loesung.visustruct | 26 - .../en/vb-tonleiter-loesung.visustruct | 18 - .../diagramme/en/vb-treppe-loesung.visustruct | 22 - .../diagramme/en/vb-tunnel-loesung.visustruct | 32 - ...b-ueberladung-umdrehung-loesung.visustruct | 16 - .../diagramme/en/vb-und-loesung.visustruct | 16 - .../en/vb-variable-seite-loesung.visustruct | 19 - .../en/vb-vier-quadrate-loesung.visustruct | 33 - .../diagramme/en/vb-wald-loesung.visustruct | 39 - .../en/vb-wand-vorn-loesung.visustruct | 16 - .../en/vb-wurde-es-dunkel-loesung.visustruct | 42 - .../en/vb-zentimeter-loesung.visustruct | 12 - ...entimeter-unterprogramm-loesung.visustruct | 6 - .../en/vb-zwei-sekunden-loesung.visustruct | 20 - .../en/zk-initialen-loesung.visustruct | 12 - web/lessons/diagramme/en/zk-mehr.visustruct | 39 - .../en/zk-rueckwaerts-loesung.visustruct | 22 - web/lessons/diagramme/en/zk-split.visustruct | 19 - .../en/zk-woerter-loesung.visustruct | 12 - .../diagramme/en/zk-zaehlen.visustruct | 32 - .../diagramme/en/zk-zeichen.visustruct | 24 - .../kino-einmaleins-loesung.visustruct | 32 - .../diagramme/kino-frei-loesung.visustruct | 48 - .../diagramme/kino-frei-start.visustruct | 15 - .../diagramme/kino-karte-loesung.visustruct | 34 - .../diagramme/kino-karte-start.visustruct | 18 - .../diagramme/kino-saalplan.visustruct | 48 - .../diagramme/kino-verkaufen.visustruct | 24 - .../l04-gross-klein-loesung.visustruct | 15 - .../l04-gross-klein-start.visustruct | 15 - .../l04-java-fehler-loesung.visustruct | 15 - .../l04-java-fehler-start.visustruct | 15 - .../l04-java-laeuft-nicht-loesung.visustruct | 12 - .../l04-java-laeuft-nicht-start.visustruct | 12 - .../l04-java-steckbrief-loesung.visustruct | 18 - web/lessons/diagramme/l04-rechnen.visustruct | 15 - .../l04-reihenfolge-loesung.visustruct | 15 - .../l04-reihenfolge-start.visustruct | 15 - .../diagramme/l04-tauschen-loesung.visustruct | 24 - .../diagramme/l04-tauschen-start.visustruct | 15 - web/lessons/diagramme/l04-tauschen.visustruct | 24 - .../diagramme/l05-datentypen.visustruct | 18 - web/lessons/diagramme/l05-division.visustruct | 15 - .../diagramme/l05-einkauf-loesung.visustruct | 15 - .../l05-java-fehler-loesung.visustruct | 15 - .../l05-java-fehler-start.visustruct | 15 - .../l05-java-kino-loesung.visustruct | 15 - .../l05-java-laeuft-nicht-loesung.visustruct | 15 - .../l05-java-laeuft-nicht-start.visustruct | 15 - .../diagramme/l05-rechteck-loesung.visustruct | 21 - .../diagramme/l05-sekunden-loesung.visustruct | 15 - .../diagramme/l05-sekunden-start.visustruct | 9 - web/lessons/diagramme/l05-sequenz.visustruct | 15 - .../l06-begruessung-loesung.visustruct | 9 - web/lessons/diagramme/l06-eva.visustruct | 15 - .../l06-java-fehler-loesung.visustruct | 12 - .../l06-java-fehler-start.visustruct | 12 - .../l06-java-laeuft-nicht-loesung.visustruct | 9 - .../l06-java-laeuft-nicht-start.visustruct | 9 - .../l06-java-tage-loesung.visustruct | 12 - .../l06-mittelwert-loesung.visustruct | 15 - .../diagramme/l06-rechner-loesung.visustruct | 21 - .../diagramme/l07-alter-pruefen.visustruct | 19 - .../diagramme/l07-betrag-loesung.visustruct | 22 - .../diagramme/l07-gerade-loesung.visustruct | 19 - .../l07-java-fehler-loesung.visustruct | 18 - .../l07-java-fehler-start.visustruct | 18 - .../l07-java-laeuft-nicht-loesung.visustruct | 15 - .../l07-java-laeuft-nicht-start.visustruct | 15 - .../l07-java-pizza-loesung.visustruct | 18 - .../diagramme/l07-java-pizza-start.visustruct | 18 - .../diagramme/l07-maximum-loesung.visustruct | 22 - web/lessons/diagramme/l07-rabatt.visustruct | 22 - .../diagramme/l08-gueltig-loesung.visustruct | 19 - .../l08-java-bestanden-loesung.visustruct | 19 - .../l08-java-fehler-loesung.visustruct | 19 - .../l08-java-fehler-start.visustruct | 19 - .../l08-java-laeuft-nicht-loesung.visustruct | 19 - .../l08-java-laeuft-nicht-start.visustruct | 19 - .../diagramme/l08-jugendticket.visustruct | 19 - web/lessons/diagramme/l08-note.visustruct | 19 - .../l08-schaltjahr-loesung.visustruct | 19 - .../l08-wochenende-loesung.visustruct | 19 - web/lessons/diagramme/l09-ampel.visustruct | 29 - web/lessons/diagramme/l09-automat.visustruct | 29 - .../l09-java-fehler-loesung.visustruct | 19 - .../l09-java-fehler-start.visustruct | 19 - .../l09-java-laeuft-nicht-loesung.visustruct | 19 - .../l09-java-laeuft-nicht-start.visustruct | 19 - .../l09-java-schule-loesung.visustruct | 19 - .../diagramme/l09-note-loesung.visustruct | 44 - .../diagramme/l09-rechner-loesung.visustruct | 47 - .../diagramme/l09-verschachtelt.visustruct | 39 - .../diagramme/l1-grundbausteine.visustruct | 30 - web/lessons/diagramme/l1-sequenz.visustruct | 15 - web/lessons/diagramme/l1-tee.visustruct | 21 - .../diagramme/l1-verzweigung.visustruct | 19 - .../diagramme/l1-wiederholung.visustruct | 14 - .../diagramme/l10-bis-n-loesung.visustruct | 20 - .../diagramme/l10-countdown.visustruct | 20 - web/lessons/diagramme/l10-endlos.visustruct | 17 - .../diagramme/l10-fakultaet.visustruct | 26 - .../l10-java-fehler-loesung.visustruct | 35 - .../l10-java-fehler-start.visustruct | 35 - .../l10-java-laeuft-nicht-loesung.visustruct | 24 - .../l10-java-laeuft-nicht-start.visustruct | 24 - .../l10-java-wuerfel-loesung.visustruct | 29 - .../l10-verdoppeln-loesung.visustruct | 23 - .../diagramme/l11-eingabe-pruefen.visustruct | 17 - web/lessons/diagramme/l11-einmal.visustruct | 17 - .../l11-java-fehler-loesung.visustruct | 26 - .../l11-java-fehler-start.visustruct | 26 - .../l11-java-gerade-loesung.visustruct | 20 - .../l11-java-laeuft-nicht-loesung.visustruct | 20 - .../l11-java-laeuft-nicht-start.visustruct | 20 - .../diagramme/l11-note-loesung.visustruct | 17 - .../diagramme/l11-summe-loesung.visustruct | 23 - .../l12-countdown-loesung.visustruct | 19 - .../l12-einmaleins-loesung.visustruct | 19 - .../diagramme/l12-eins-bis-fuenf.visustruct | 13 - .../l12-java-fehler-loesung.visustruct | 17 - .../l12-java-fehler-start.visustruct | 17 - .../l12-java-laeuft-nicht-loesung.visustruct | 20 - .../l12-java-laeuft-nicht-start.visustruct | 20 - .../l12-java-verdoppeln-loesung.visustruct | 17 - web/lessons/diagramme/l12-summe.visustruct | 22 - web/lessons/diagramme/l13-dreieck.visustruct | 29 - .../l13-gerade-eingaben-loesung.visustruct | 32 - .../diagramme/l13-gerade-zaehlen.visustruct | 32 - .../l13-java-fehler-loesung.visustruct | 16 - .../l13-java-fehler-start.visustruct | 16 - .../l13-java-laeuft-nicht-loesung.visustruct | 19 - .../l13-java-laeuft-nicht-start.visustruct | 16 - .../l13-java-quadrate-loesung.visustruct | 16 - .../diagramme/l13-rechteck-loesung.visustruct | 32 - .../l14-array-durchlaufen.visustruct | 16 - .../l14-erster-letzter-loesung.visustruct | 15 - .../l14-java-fehler-loesung.visustruct | 32 - .../l14-java-fehler-start.visustruct | 32 - .../l14-java-laeuft-nicht-loesung.visustruct | 23 - .../l14-java-laeuft-nicht-start.visustruct | 23 - .../l14-java-treppe-loesung.visustruct | 29 - .../diagramme/l14-namen-eingeben.visustruct | 19 - .../l14-rueckwaerts-loesung.visustruct | 26 - .../l14-summe-max-loesung.visustruct | 51 - .../diagramme/l14-summe-maximum.visustruct | 41 - .../diagramme/l15-bis-null-loesung.visustruct | 23 - .../diagramme/l15-endlos-aussprung.visustruct | 30 - .../diagramme/l15-flaeche-loesung.visustruct | 15 - ...5-flaeche-unterprogramm-loesung.visustruct | 6 - .../diagramme/l15-hauptprogramm.visustruct | 12 - .../l15-java-fehler-loesung.visustruct | 32 - .../l15-java-fehler-start.visustruct | 32 - .../l15-java-laeuft-nicht-loesung.visustruct | 22 - .../l15-java-laeuft-nicht-start.visustruct | 22 - .../l15-java-noten-loesung.visustruct | 22 - .../diagramme/l15-quadrat-haupt.visustruct | 12 - web/lessons/diagramme/l15-quadrat.visustruct | 9 - .../diagramme/l15-titel-loesung.visustruct | 12 - .../diagramme/l15-unterprogramm.visustruct | 9 - .../l15-zeige-summe-haupt.visustruct | 12 - .../diagramme/l15-zeige-summe.visustruct | 9 - .../l16-countdown-loesung.visustruct | 23 - .../diagramme/l16-countdown-start.visustruct | 23 - .../l16-java-fehler-loesung.visustruct | 22 - .../l16-java-fehler-start.visustruct | 22 - .../l16-java-laeuft-nicht-loesung.visustruct | 9 - .../l16-java-laeuft-nicht-start.visustruct | 9 - .../l16-java-punkte-loesung.visustruct | 29 - .../diagramme/l16-schreibtisch.visustruct | 23 - .../diagramme/l16-summe-loesung.visustruct | 22 - .../diagramme/l16-summe-start.visustruct | 22 - web/lessons/diagramme/l17-beispiel.visustruct | 32 - .../l17-fakultaet-loesung.visustruct | 22 - .../l17-java-brief-loesung.visustruct | 32 - .../diagramme/l17-java-brief-start.visustruct | 6 - .../l17-java-fehler-loesung.visustruct | 12 - .../l17-java-fehler-start.visustruct | 12 - .../l17-java-laeuft-nicht-loesung.visustruct | 9 - .../l17-java-laeuft-nicht-start.visustruct | 9 - .../l17-java-passwort-loesung.visustruct | 19 - .../diagramme/l17-ticket-loesung.visustruct | 29 - web/lessons/diagramme/l18-beispiel.visustruct | 20 - .../l18-java-fehler-loesung.visustruct | 33 - .../l18-java-fehler-start.visustruct | 33 - .../l18-java-kasse-loesung.visustruct | 42 - .../diagramme/l18-js-loesung.visustruct | 22 - .../diagramme/l18-python-loesung.visustruct | 16 - .../l19-java-fehler-loesung.visustruct | 39 - .../l19-java-fehler-start.visustruct | 39 - .../l19-java-laeuft-nicht-loesung.visustruct | 35 - .../l19-java-laeuft-nicht-start.visustruct | 35 - .../l19-java-zaehlen-loesung.visustruct | 35 - web/lessons/diagramme/l2-ausgabe.visustruct | 9 - .../diagramme/l2-hallo-loesung.visustruct | 6 - .../l2-zwei-zeilen-loesung.visustruct | 9 - .../l20-countdown-loesung.visustruct | 20 - .../l23-java-ergaenzen-loesung.visustruct | 41 - .../l23-java-ergaenzen-start.visustruct | 9 - .../l23-java-nummern-loesung.visustruct | 26 - .../l23-java-nummern-start.visustruct | 6 - .../l24-java-fuchs-loesung.visustruct | 39 - .../diagramme/l24-java-fuchs-start.visustruct | 9 - .../l24-java-laengster-loesung.visustruct | 35 - .../l24-java-laengster-start.visustruct | 9 - .../l25-java-beste-loesung.visustruct | 54 - .../diagramme/l25-java-beste-start.visustruct | 9 - .../l25-java-schnitt-loesung.visustruct | 41 - .../l25-java-schnitt-start.visustruct | 9 - .../l26-java-namen-loesung.visustruct | 39 - .../diagramme/l26-java-namen-start.visustruct | 9 - .../l26-java-schreiben-loesung.visustruct | 50 - .../l26-java-schreiben-start.visustruct | 18 - .../l27-java-json-loesung.visustruct | 53 - .../diagramme/l27-java-json-start.visustruct | 21 - .../l27-java-saetze-loesung.visustruct | 44 - .../l27-java-saetze-start.visustruct | 21 - .../pt/aufgabe-alter-haupt-loesung.visustruct | 12 - ...abe-alter-unterprogramm-loesung.visustruct | 19 - .../pt/aufgabe-ballwurf-loesung.visustruct | 81 - .../pt/aufgabe-ballwurf-start.visustruct | 9 - .../pt/aufgabe-bestenliste-loesung.visustruct | 65 - .../pt/aufgabe-binaer-loesung.visustruct | 26 - .../aufgabe-caesar-array-loesung.visustruct | 54 - .../pt/aufgabe-caesar-array-start.visustruct | 6 - .../aufgabe-caesar-ascii-loesung.visustruct | 31 - ...e-caesar-entschluesseln-loesung.visustruct | 31 - .../pt/aufgabe-collatz-loesung.visustruct | 36 - .../aufgabe-durchschnitt-loesung.visustruct | 28 - .../pt/aufgabe-fibonacci-loesung.visustruct | 37 - .../pt/aufgabe-gerade-loesung.visustruct | 19 - .../aufgabe-mehrwertsteuer-loesung.visustruct | 21 - .../pt/aufgabe-pin-java-loesung.visustruct | 36 - .../pt/aufgabe-pin-loesung.visustruct | 36 - .../pt/aufgabe-rechner-loesung.visustruct | 44 - .../pt/aufgabe-schiffe-loesung.visustruct | 54 - .../pt/aufgabe-schiffe-start.visustruct | 27 - .../pt/aufgabe-speisekarte-loesung.visustruct | 29 - .../pt/aufgabe-summe-loesung.visustruct | 15 - .../pt/aufgabe-tafeldienst-loesung.visustruct | 22 - .../pt/aufgabe-verdoppeln-loesung.visustruct | 12 - .../aufgabe-verleih-java-loesung.visustruct | 47 - .../pt/aufgabe-verleih-loesung.visustruct | 37 - .../pt/aufgabe-vokabeln-loesung.visustruct | 60 - .../pt/aufgabe-vokabeln-start.visustruct | 9 - .../pt/aufgabe-volljaehrig-loesung.visustruct | 19 - .../diagramme/pt/dt-buffered.visustruct | 23 - web/lessons/diagramme/pt/dt-csv.visustruct | 18 - web/lessons/diagramme/pt/dt-json.visustruct | 18 - web/lessons/diagramme/pt/dt-lesen.visustruct | 20 - .../pt/kino-einmaleins-loesung.visustruct | 32 - .../diagramme/pt/kino-frei-loesung.visustruct | 48 - .../diagramme/pt/kino-frei-start.visustruct | 15 - .../pt/kino-karte-loesung.visustruct | 34 - .../diagramme/pt/kino-karte-start.visustruct | 18 - .../diagramme/pt/kino-saalplan.visustruct | 48 - .../diagramme/pt/kino-verkaufen.visustruct | 24 - .../pt/l04-gross-klein-loesung.visustruct | 15 - .../pt/l04-gross-klein-start.visustruct | 15 - .../pt/l04-java-fehler-loesung.visustruct | 15 - .../pt/l04-java-fehler-start.visustruct | 15 - .../l04-java-laeuft-nicht-loesung.visustruct | 12 - .../pt/l04-java-laeuft-nicht-start.visustruct | 12 - .../pt/l04-java-steckbrief-loesung.visustruct | 18 - .../diagramme/pt/l04-rechnen.visustruct | 15 - .../pt/l04-reihenfolge-loesung.visustruct | 15 - .../pt/l04-reihenfolge-start.visustruct | 15 - .../pt/l04-tauschen-loesung.visustruct | 24 - .../pt/l04-tauschen-start.visustruct | 15 - .../diagramme/pt/l04-tauschen.visustruct | 24 - .../diagramme/pt/l05-datentypen.visustruct | 18 - .../diagramme/pt/l05-division.visustruct | 15 - .../pt/l05-einkauf-loesung.visustruct | 15 - .../pt/l05-java-fehler-loesung.visustruct | 15 - .../pt/l05-java-fehler-start.visustruct | 15 - .../pt/l05-java-kino-loesung.visustruct | 15 - .../l05-java-laeuft-nicht-loesung.visustruct | 15 - .../pt/l05-java-laeuft-nicht-start.visustruct | 15 - .../pt/l05-rechteck-loesung.visustruct | 21 - .../pt/l05-sekunden-loesung.visustruct | 15 - .../pt/l05-sekunden-start.visustruct | 9 - .../diagramme/pt/l05-sequenz.visustruct | 15 - .../pt/l06-begruessung-loesung.visustruct | 9 - web/lessons/diagramme/pt/l06-eva.visustruct | 15 - .../pt/l06-java-fehler-loesung.visustruct | 12 - .../pt/l06-java-fehler-start.visustruct | 12 - .../l06-java-laeuft-nicht-loesung.visustruct | 9 - .../pt/l06-java-laeuft-nicht-start.visustruct | 9 - .../pt/l06-java-tage-loesung.visustruct | 12 - .../pt/l06-mittelwert-loesung.visustruct | 15 - .../pt/l06-rechner-loesung.visustruct | 21 - .../diagramme/pt/l07-alter-pruefen.visustruct | 19 - .../pt/l07-betrag-loesung.visustruct | 22 - .../pt/l07-gerade-loesung.visustruct | 19 - .../pt/l07-java-fehler-loesung.visustruct | 18 - .../pt/l07-java-fehler-start.visustruct | 18 - .../l07-java-laeuft-nicht-loesung.visustruct | 15 - .../pt/l07-java-laeuft-nicht-start.visustruct | 15 - .../pt/l07-java-pizza-loesung.visustruct | 18 - .../pt/l07-java-pizza-start.visustruct | 18 - .../pt/l07-maximum-loesung.visustruct | 22 - .../diagramme/pt/l07-rabatt.visustruct | 22 - .../pt/l08-gueltig-loesung.visustruct | 19 - .../pt/l08-java-bestanden-loesung.visustruct | 19 - .../pt/l08-java-fehler-loesung.visustruct | 19 - .../pt/l08-java-fehler-start.visustruct | 19 - .../l08-java-laeuft-nicht-loesung.visustruct | 19 - .../pt/l08-java-laeuft-nicht-start.visustruct | 19 - .../diagramme/pt/l08-jugendticket.visustruct | 19 - web/lessons/diagramme/pt/l08-note.visustruct | 19 - .../pt/l08-schaltjahr-loesung.visustruct | 19 - .../pt/l08-wochenende-loesung.visustruct | 19 - web/lessons/diagramme/pt/l09-ampel.visustruct | 29 - .../diagramme/pt/l09-automat.visustruct | 29 - .../pt/l09-java-fehler-loesung.visustruct | 19 - .../pt/l09-java-fehler-start.visustruct | 19 - .../l09-java-laeuft-nicht-loesung.visustruct | 19 - .../pt/l09-java-laeuft-nicht-start.visustruct | 19 - .../pt/l09-java-schule-loesung.visustruct | 19 - .../diagramme/pt/l09-note-loesung.visustruct | 39 - .../pt/l09-rechner-loesung.visustruct | 47 - .../diagramme/pt/l09-verschachtelt.visustruct | 39 - .../diagramme/pt/l1-grundbausteine.visustruct | 30 - .../diagramme/pt/l1-sequenz.visustruct | 15 - web/lessons/diagramme/pt/l1-tee.visustruct | 21 - .../diagramme/pt/l1-verzweigung.visustruct | 19 - .../diagramme/pt/l1-wiederholung.visustruct | 14 - .../diagramme/pt/l10-bis-n-loesung.visustruct | 20 - .../diagramme/pt/l10-countdown.visustruct | 20 - .../diagramme/pt/l10-endlos.visustruct | 17 - .../diagramme/pt/l10-fakultaet.visustruct | 26 - .../pt/l10-java-fehler-loesung.visustruct | 35 - .../pt/l10-java-fehler-start.visustruct | 35 - .../l10-java-laeuft-nicht-loesung.visustruct | 24 - .../pt/l10-java-laeuft-nicht-start.visustruct | 24 - .../pt/l10-java-wuerfel-loesung.visustruct | 29 - .../pt/l10-verdoppeln-loesung.visustruct | 23 - .../pt/l11-eingabe-pruefen.visustruct | 17 - .../diagramme/pt/l11-einmal.visustruct | 17 - .../pt/l11-java-fehler-loesung.visustruct | 26 - .../pt/l11-java-fehler-start.visustruct | 26 - .../pt/l11-java-gerade-loesung.visustruct | 20 - .../l11-java-laeuft-nicht-loesung.visustruct | 20 - .../pt/l11-java-laeuft-nicht-start.visustruct | 20 - .../diagramme/pt/l11-note-loesung.visustruct | 17 - .../diagramme/pt/l11-summe-loesung.visustruct | 23 - .../pt/l12-countdown-loesung.visustruct | 19 - .../pt/l12-einmaleins-loesung.visustruct | 19 - .../pt/l12-eins-bis-fuenf.visustruct | 13 - .../pt/l12-java-fehler-loesung.visustruct | 17 - .../pt/l12-java-fehler-start.visustruct | 17 - .../l12-java-laeuft-nicht-loesung.visustruct | 20 - .../pt/l12-java-laeuft-nicht-start.visustruct | 20 - .../pt/l12-java-verdoppeln-loesung.visustruct | 17 - web/lessons/diagramme/pt/l12-summe.visustruct | 22 - .../diagramme/pt/l13-dreieck.visustruct | 29 - .../pt/l13-gerade-eingaben-loesung.visustruct | 32 - .../pt/l13-gerade-zaehlen.visustruct | 32 - .../pt/l13-java-fehler-loesung.visustruct | 16 - .../pt/l13-java-fehler-start.visustruct | 16 - .../l13-java-laeuft-nicht-loesung.visustruct | 19 - .../pt/l13-java-laeuft-nicht-start.visustruct | 16 - .../pt/l13-java-quadrate-loesung.visustruct | 16 - .../pt/l13-rechteck-loesung.visustruct | 32 - .../pt/l14-array-durchlaufen.visustruct | 16 - .../pt/l14-erster-letzter-loesung.visustruct | 15 - .../pt/l14-java-fehler-loesung.visustruct | 32 - .../pt/l14-java-fehler-start.visustruct | 32 - .../l14-java-laeuft-nicht-loesung.visustruct | 23 - .../pt/l14-java-laeuft-nicht-start.visustruct | 23 - .../pt/l14-java-treppe-loesung.visustruct | 29 - .../pt/l14-namen-eingeben.visustruct | 19 - .../pt/l14-rueckwaerts-loesung.visustruct | 26 - .../pt/l14-summe-max-loesung.visustruct | 51 - .../diagramme/pt/l14-summe-maximum.visustruct | 41 - .../pt/l15-bis-null-loesung.visustruct | 23 - .../pt/l15-endlos-aussprung.visustruct | 30 - .../pt/l15-flaeche-loesung.visustruct | 15 - .../diagramme/pt/l15-hauptprogramm.visustruct | 12 - .../pt/l15-java-fehler-loesung.visustruct | 32 - .../pt/l15-java-fehler-start.visustruct | 32 - .../l15-java-laeuft-nicht-loesung.visustruct | 22 - .../pt/l15-java-laeuft-nicht-start.visustruct | 22 - .../pt/l15-java-noten-loesung.visustruct | 22 - .../diagramme/pt/l15-quadrat-haupt.visustruct | 12 - .../diagramme/pt/l15-quadrat.visustruct | 9 - .../diagramme/pt/l15-titel-loesung.visustruct | 12 - .../diagramme/pt/l15-unterprogramm.visustruct | 9 - .../pt/l15-zeige-summe-haupt.visustruct | 12 - .../diagramme/pt/l15-zeige-summe.visustruct | 9 - .../pt/l16-countdown-loesung.visustruct | 23 - .../pt/l16-countdown-start.visustruct | 23 - .../pt/l16-java-fehler-loesung.visustruct | 22 - .../pt/l16-java-fehler-start.visustruct | 22 - .../l16-java-laeuft-nicht-loesung.visustruct | 9 - .../pt/l16-java-laeuft-nicht-start.visustruct | 9 - .../pt/l16-java-punkte-loesung.visustruct | 29 - .../diagramme/pt/l16-schreibtisch.visustruct | 23 - .../diagramme/pt/l16-summe-loesung.visustruct | 22 - .../diagramme/pt/l16-summe-start.visustruct | 22 - .../diagramme/pt/l17-beispiel.visustruct | 32 - .../pt/l17-fakultaet-loesung.visustruct | 22 - .../pt/l17-java-brief-loesung.visustruct | 32 - .../pt/l17-java-brief-start.visustruct | 6 - .../pt/l17-java-fehler-loesung.visustruct | 12 - .../pt/l17-java-fehler-start.visustruct | 12 - .../l17-java-laeuft-nicht-loesung.visustruct | 9 - .../pt/l17-java-laeuft-nicht-start.visustruct | 9 - .../pt/l17-java-passwort-loesung.visustruct | 19 - .../pt/l17-ticket-loesung.visustruct | 29 - .../diagramme/pt/l18-beispiel.visustruct | 20 - .../pt/l18-java-fehler-loesung.visustruct | 33 - .../pt/l18-java-fehler-start.visustruct | 33 - .../pt/l18-java-kasse-loesung.visustruct | 42 - .../diagramme/pt/l18-js-loesung.visustruct | 22 - .../pt/l18-python-loesung.visustruct | 16 - .../pt/l19-java-fehler-loesung.visustruct | 39 - .../pt/l19-java-fehler-start.visustruct | 39 - .../l19-java-laeuft-nicht-loesung.visustruct | 35 - .../pt/l19-java-laeuft-nicht-start.visustruct | 35 - .../pt/l19-java-zaehlen-loesung.visustruct | 35 - .../diagramme/pt/l2-ausgabe.visustruct | 9 - .../diagramme/pt/l2-hallo-loesung.visustruct | 6 - .../pt/l2-zwei-zeilen-loesung.visustruct | 9 - .../pt/l23-java-ergaenzen-loesung.visustruct | 41 - .../pt/l23-java-ergaenzen-start.visustruct | 9 - .../pt/l23-java-nummern-loesung.visustruct | 26 - .../pt/l23-java-nummern-start.visustruct | 6 - .../pt/l24-java-fuchs-loesung.visustruct | 39 - .../pt/l24-java-fuchs-start.visustruct | 9 - .../pt/l24-java-laengster-loesung.visustruct | 35 - .../pt/l24-java-laengster-start.visustruct | 9 - .../pt/l25-java-beste-loesung.visustruct | 54 - .../pt/l25-java-beste-start.visustruct | 9 - .../pt/l25-java-schnitt-loesung.visustruct | 41 - .../pt/l25-java-schnitt-start.visustruct | 9 - .../pt/l26-java-namen-loesung.visustruct | 39 - .../pt/l26-java-namen-start.visustruct | 9 - .../pt/l26-java-schreiben-loesung.visustruct | 50 - .../pt/l26-java-schreiben-start.visustruct | 18 - .../pt/l27-java-json-loesung.visustruct | 53 - .../pt/l27-java-json-start.visustruct | 21 - .../pt/l27-java-saetze-loesung.visustruct | 44 - .../pt/l27-java-saetze-start.visustruct | 21 - .../diagramme/pt/sim-kino-loesung.visustruct | 12 - .../diagramme/pt/sim-kino-start.visustruct | 12 - .../pt/sim-tausch-loesung.visustruct | 24 - .../diagramme/pt/sim-tausch-start.visustruct | 21 - .../diagramme/pt/sim-tausch.visustruct | 24 - .../pt/ss-absteigend-loesung.visustruct | 59 - .../pt/ss-absteigend-start.visustruct | 59 - .../diagramme/pt/ss-binaere-suche.visustruct | 74 - .../diagramme/pt/ss-bubblesort.visustruct | 49 - .../pt/ss-karte-suchen-loesung.visustruct | 49 - .../diagramme/pt/ss-lineare-suche.visustruct | 58 - .../pt/uebergabe-bonus-loesung.visustruct | 19 - .../pt/uebergabe-bonus-start.visustruct | 19 - ...abe-bonus-unterprogramm-loesung.visustruct | 13 - .../diagramme/pt/uebergabe-haupt.visustruct | 24 - .../diagramme/pt/uebergabe-leeren.visustruct | 13 - .../pt/uebergabe-verdopple.visustruct | 9 - .../pt/zk-initialen-loesung.visustruct | 12 - web/lessons/diagramme/pt/zk-mehr.visustruct | 39 - .../pt/zk-rueckwaerts-loesung.visustruct | 22 - web/lessons/diagramme/pt/zk-split.visustruct | 19 - .../pt/zk-woerter-loesung.visustruct | 12 - .../diagramme/pt/zk-zaehlen.visustruct | 32 - .../diagramme/pt/zk-zeichen.visustruct | 24 - .../diagramme/sim-kino-loesung.visustruct | 12 - .../diagramme/sim-kino-start.visustruct | 12 - .../diagramme/sim-tausch-loesung.visustruct | 24 - .../diagramme/sim-tausch-start.visustruct | 21 - web/lessons/diagramme/sim-tausch.visustruct | 24 - .../ss-absteigend-loesung.visustruct | 59 - .../diagramme/ss-absteigend-start.visustruct | 59 - .../diagramme/ss-binaere-suche.visustruct | 74 - .../diagramme/ss-bubblesort.visustruct | 49 - .../ss-karte-suchen-loesung.visustruct | 49 - .../diagramme/ss-lineare-suche.visustruct | 58 - .../uebergabe-bonus-loesung.visustruct | 19 - .../uebergabe-bonus-start.visustruct | 19 - ...abe-bonus-unterprogramm-loesung.visustruct | 13 - .../diagramme/uebergabe-haupt.visustruct | 24 - .../diagramme/uebergabe-leeren.visustruct | 13 - .../diagramme/uebergabe-verdopple.visustruct | 9 - .../vb-abstand-anzeigen-loesung.visustruct | 9 - .../vb-abstand-halten-loesung.visustruct | 26 - .../vb-alarmanlage-loesung.visustruct | 27 - .../diagramme/vb-ampel-loesung.visustruct | 18 - .../vb-ampel-zustand-loesung.visustruct | 43 - .../diagramme/vb-ausgang-loesung.visustruct | 30 - .../vb-begruessung-loesung.visustruct | 12 - .../vb-binaer-zaehlen-loesung.visustruct | 52 - .../diagramme/vb-bis-rot-loesung.visustruct | 11 - .../diagramme/vb-bis-wand-loesung.visustruct | 11 - .../diagramme/vb-bis-ziel-loesung.visustruct | 11 - .../vb-buchstaben-loesung.visustruct | 19 - .../diagramme/vb-do-while-loesung.visustruct | 14 - .../vb-drei-lichter-loesung.visustruct | 12 - .../diagramme/vb-dreieck-loesung.visustruct | 16 - .../diagramme/vb-einparken-loesung.visustruct | 28 - .../vb-erster-plan-loesung.visustruct | 18 - .../diagramme/vb-farben-loesung.visustruct | 16 - .../vb-farbweiche-loesung.visustruct | 26 - .../vb-fehler-04-sensoren-start.visustruct | 16 - ...vb-fehler-05-bis-zur-wand-start.visustruct | 11 - ...-erst-fahren-dann-pruefen-start.visustruct | 20 - ...-05-zaehlen-und-summieren-start.visustruct | 31 - .../vb-fehler-06-abstand-start.visustruct | 14 - ...ehler-06-konstanten-final-start.visustruct | 19 - ...fehler-06-nah-mittel-weit-start.visustruct | 26 - .../vb-fehler-07-linie-start.visustruct | 30 - .../vb-fehler-07-und-oder-start.visustruct | 14 - .../vb-fehler-08-farben-start.visustruct | 24 - ...-fehler-08-groesster-wert-start.visustruct | 41 - ...hler-09-fallauswahl-mbot2-start.visustruct | 26 - ...fehler-10-tasten-joystick-start.visustruct | 33 - ...10-unterbrechen-mit-break-start.visustruct | 27 - .../vb-fehler-11-licht-start.visustruct | 19 - ...-fehler-11-merker-boolean-start.visustruct | 42 - .../vb-fehler-12-lautstaerke-start.visustruct | 16 - .../vb-fehler-13-neigung-start.visustruct | 16 - .../vb-fehler-14-leds-start.visustruct | 22 - ...b-fehler-15-einzelne-leds-start.visustruct | 19 - ...vb-fehler-16-lautsprecher-start.visustruct | 13 - ...-fehler-17-arrays-melodie-start.visustruct | 38 - .../vb-fehler-18-bildschirm-start.visustruct | 19 - ...b-fehler-19-zeichenketten-start.visustruct | 9 - .../vb-fehler-20-motoren-start.visustruct | 44 - ...b-fehler-21-stoppuhr-akku-start.visustruct | 19 - .../vb-fehler-21-zustaende-start.visustruct | 48 - ...fehler-22-eigene-methoden-start.visustruct | 22 - ...ler-23-wie-geht-es-weiter-start.visustruct | 11 - .../vb-gas-bis-wand-loesung.visustruct | 17 - .../diagramme/vb-gerade-loesung.visustruct | 18 - .../diagramme/vb-hindernis-loesung.visustruct | 36 - .../diagramme/vb-java-akku-loesung.visustruct | 19 - .../vb-java-ampel-text-loesung.visustruct | 48 - .../vb-java-blau-gruen-loesung.visustruct | 24 - .../vb-java-blinken-loesung.visustruct | 22 - .../vb-java-countdown-loesung.visustruct | 19 - .../vb-java-hoeher-loesung.visustruct | 13 - .../vb-java-joystick-loesung.visustruct | 33 - .../vb-java-klatsch-merker-loesung.visustruct | 42 - ...vb-java-konstante-seite-loesung.visustruct | 19 - .../vb-java-laermampel-loesung.visustruct | 16 - .../vb-java-lauflicht-loesung.visustruct | 19 - .../vb-java-linienfolger-loesung.visustruct | 44 - .../vb-java-nachtlicht-ton-loesung.visustruct | 19 - .../diagramme/vb-java-rand-loesung.visustruct | 30 - .../vb-java-rechteck-loesung.visustruct | 28 - ...va-rechteck-umdrehungen-loesung.visustruct | 22 - .../vb-java-richtung-loesung.visustruct | 41 - ...b-java-schritte-zaehlen-loesung.visustruct | 20 - .../vb-java-sicher-fahren-loesung.visustruct | 14 - ...vb-java-spirale-strecke-loesung.visustruct | 31 - .../vb-java-tageszeit-loesung.visustruct | 26 - .../vb-java-taste-stopp-loesung.visustruct | 27 - .../vb-java-textlaenge-loesung.visustruct | 9 - .../vb-java-wand-piep-loesung.visustruct | 14 - .../vb-java-wasserwaage-loesung.visustruct | 16 - .../diagramme/vb-klatschen-loesung.visustruct | 14 - .../vb-knight-rider-loesung.visustruct | 35 - .../vb-konstante-wand-loesung.visustruct | 17 - .../vb-l00-bausteine-loesung.visustruct | 26 - .../vb-l00-sequenz-loesung.visustruct | 12 - .../vb-l03-wachsend-loesung.visustruct | 22 - web/lessons/diagramme/vb-l06k-mit.visustruct | 25 - web/lessons/diagramme/vb-l06k-ohne.visustruct | 22 - .../diagramme/vb-l06n-einparkhilfe.visustruct | 26 - .../diagramme/vb-l21z-ausweichen.visustruct | 39 - .../diagramme/vb-labyrinth-loesung.visustruct | 34 - .../vb-laufschrift-loesung.visustruct | 19 - .../vb-linienfolger-stopp-loesung.visustruct | 44 - .../vb-linienmuster-loesung.visustruct | 26 - .../vb-meister-platz-loesung.visustruct | 35 - .../diagramme/vb-melodie-loesung.visustruct | 16 - .../diagramme/vb-messreihe-loesung.visustruct | 38 - .../diagramme/vb-morsen-loesung.visustruct | 66 - .../vb-nachtlicht-loesung.visustruct | 16 - .../vb-nachtwaechter-loesung.visustruct | 17 - .../diagramme/vb-notbremse-loesung.visustruct | 27 - .../diagramme/vb-oder-loesung.visustruct | 16 - .../diagramme/vb-quadrat-loesung.visustruct | 75 - .../vb-quadrat-methode-loesung.visustruct | 9 - .../vb-quadrat-schleife-loesung.visustruct | 55 - ...b-quadrat-unterprogramm-loesung.visustruct | 16 - ...b-quadrat-verschachtelt-loesung.visustruct | 23 - .../diagramme/vb-rand-loesung.visustruct | 14 - .../vb-schraeglage-loesung.visustruct | 16 - .../vb-schritte-welt-loesung.visustruct | 20 - .../diagramme/vb-slalom-loesung.visustruct | 52 - .../vb-spirale-falsch-loesung.visustruct | 22 - .../vb-spirale-falsch-start.visustruct | 22 - .../diagramme/vb-spirale-loesung.visustruct | 16 - .../diagramme/vb-start-a-loesung.visustruct | 14 - .../vb-startsignal-loesung.visustruct | 34 - .../vb-strecke-anzeigen-loesung.visustruct | 34 - .../vb-tempo-abstand-loesung.visustruct | 26 - .../diagramme/vb-tonleiter-loesung.visustruct | 18 - .../diagramme/vb-treppe-loesung.visustruct | 22 - .../diagramme/vb-tunnel-loesung.visustruct | 32 - ...b-ueberladung-umdrehung-loesung.visustruct | 16 - .../diagramme/vb-und-loesung.visustruct | 16 - .../vb-variable-seite-loesung.visustruct | 19 - .../vb-vier-quadrate-loesung.visustruct | 33 - .../diagramme/vb-wald-loesung.visustruct | 39 - .../diagramme/vb-wand-vorn-loesung.visustruct | 16 - .../vb-wurde-es-dunkel-loesung.visustruct | 42 - .../vb-zentimeter-loesung.visustruct | 12 - ...entimeter-unterprogramm-loesung.visustruct | 6 - .../vb-zwei-sekunden-loesung.visustruct | 20 - .../vbb-abstand-zeigen-loesung.visustruct | 6 - .../diagramme/vbb-ampel-loesung.visustruct | 16 - .../diagramme/vbb-ausgang-loesung.visustruct | 30 - .../diagramme/vbb-bis-wand-loesung.visustruct | 11 - .../diagramme/vbb-blinken-loesung.visustruct | 22 - .../diagramme/vbb-disco-loesung.visustruct | 31 - .../diagramme/vbb-dreieck-loesung.visustruct | 16 - .../diagramme/vbb-ecke-loesung.visustruct | 12 - .../vbb-erster-block-loesung.visustruct | 6 - .../vbb-hin-und-zurueck-loesung.visustruct | 12 - .../diagramme/vbb-klotz-loesung.visustruct | 36 - .../vbb-licht-gruen-loesung.visustruct | 6 - .../vbb-linie-bis-rot-loesung.visustruct | 24 - .../vbb-linienfolger-loesung.visustruct | 24 - .../vbb-notbremse-loesung.visustruct | 27 - .../diagramme/vbb-quadrat-loesung.visustruct | 27 - .../vbb-quadrat-wiederhole-loesung.visustruct | 16 - .../diagramme/vbb-rand-loesung.visustruct | 14 - .../diagramme/vbb-sirene-loesung.visustruct | 16 - .../diagramme/vbb-slalom-loesung.visustruct | 52 - .../diagramme/vbb-start-a-loesung.visustruct | 14 - .../diagramme/vbb-wald-loesung.visustruct | 39 - .../vbb-wand-vorn-loesung.visustruct | 16 - .../diagramme/vbb-weiter-loesung.visustruct | 6 - .../diagramme/zk-initialen-loesung.visustruct | 12 - web/lessons/diagramme/zk-mehr.visustruct | 39 - .../zk-rueckwaerts-loesung.visustruct | 22 - web/lessons/diagramme/zk-split.visustruct | 19 - .../diagramme/zk-woerter-loesung.visustruct | 12 - web/lessons/diagramme/zk-zaehlen.visustruct | 32 - web/lessons/diagramme/zk-zeichen.visustruct | 24 - web/lessons/en/01-was-ist-ein-struktogramm.md | 229 - web/lessons/en/01-weitere-darstellungen.md | 239 - web/lessons/en/02-der-editor.md | 188 - .../en/03-speichern-oeffnen-exportieren.md | 171 - web/lessons/en/04-variablen-und-datentypen.md | 407 - web/lessons/en/05-sequenz.md | 253 - web/lessons/en/06-eingabe-und-ausgabe.md | 432 - .../en/07-simulation-und-schreibtischtest.md | 364 - web/lessons/en/08-verzweigung.md | 368 - web/lessons/en/09-bedingungen-verknuepfen.md | 328 - web/lessons/en/10-fallauswahl.md | 330 - web/lessons/en/11-while-schleife.md | 359 - web/lessons/en/12-do-while-schleife.md | 279 - web/lessons/en/13-for-schleife.md | 337 - web/lessons/en/14-verschachteln.md | 305 - web/lessons/en/15-arrays.md | 362 - web/lessons/en/16-zweidimensionale-arrays.md | 317 - web/lessons/en/17-zeichenketten.md | 526 - web/lessons/en/18-aufruf-und-aussprung.md | 482 - web/lessons/en/19-suchen-und-sortieren.md | 352 - web/lessons/en/20-java.md | 472 - web/lessons/en/21-python-und-javascript.md | 240 - web/lessons/en/22-try-und-catch.md | 293 - .../en/23-text-einlesen-und-speichern.md | 254 - web/lessons/en/24-zeile-fuer-zeile.md | 256 - web/lessons/en/25-tabellen-als-csv.md | 224 - web/lessons/en/26-json.md | 225 - web/lessons/en/27-formate-im-vergleich.md | 175 - web/lessons/en/28-erstes-fenster.md | 230 - web/lessons/en/29-knopf-im-fenster.md | 231 - web/lessons/en/30-der-knopf-reagiert.md | 356 - web/lessons/en/31-zahl-verdoppeln.md | 295 - web/lessons/en/32-klickzaehler.md | 246 - web/lessons/en/33-ampel.md | 290 - web/lessons/en/34-notenrechner.md | 285 - web/lessons/en/35-taschenrechner.md | 285 - web/lessons/en/36-zahlenraten.md | 242 - .../en/37-viele-knoepfe-ein-zuhoerer.md | 318 - web/lessons/en/38-innere-klassen.md | 246 - web/lessons/en/39-zwei-reiter.md | 295 - web/lessons/en/40-model-view-controller.md | 430 - .../en/aufgaben/alter-unterprogramm.md | 21 - web/lessons/en/aufgaben/ballwurf.md | 29 - web/lessons/en/aufgaben/bestenliste.md | 34 - web/lessons/en/aufgaben/binaerzahl.md | 42 - web/lessons/en/aufgaben/caesar.md | 134 - web/lessons/en/aufgaben/collatz.md | 44 - web/lessons/en/aufgaben/einheitenrechner.md | 55 - web/lessons/en/aufgaben/fibonacci.md | 54 - web/lessons/en/aufgaben/gerade-ungerade.md | 36 - web/lessons/en/aufgaben/mehrwertsteuer.md | 41 - web/lessons/en/aufgaben/notendurchschnitt.md | 35 - web/lessons/en/aufgaben/pin-pruefen.md | 40 - web/lessons/en/aufgaben/schiffe-versenken.md | 37 - web/lessons/en/aufgaben/speisekarte.md | 36 - web/lessons/en/aufgaben/summe-bilden.md | 16 - web/lessons/en/aufgaben/tafeldienst.md | 37 - web/lessons/en/aufgaben/taschenrechner.md | 36 - web/lessons/en/aufgaben/verleih-menue.md | 35 - web/lessons/en/aufgaben/vokabeltrainer.md | 35 - web/lessons/en/aufgaben/volljaehrig.md | 36 - web/lessons/en/aufgaben/wuerfel-mvc.md | 45 - web/lessons/en/aufgaben/zahl-verdoppeln.md | 16 - web/lessons/en/begriffe.md | 266 - web/lessons/en/nachschlagen.md | 169 - .../en/visubot/00-struktogramm-und-editor.md | 162 - web/lessons/en/visubot/01-der-mbot2.md | 416 - web/lessons/en/visubot/02-das-quadrat.md | 365 - web/lessons/en/visubot/02-quadrat-als-pap.md | 182 - .../en/visubot/03-variablen-und-ausgabe.md | 249 - .../en/visubot/03-zeile-fuer-zeile-testen.md | 183 - web/lessons/en/visubot/04-sensoren.md | 179 - web/lessons/en/visubot/05-bis-zur-wand.md | 207 - .../en/visubot/05-erst-fahren-dann-pruefen.md | 271 - .../en/visubot/05-zaehlen-und-summieren.md | 154 - web/lessons/en/visubot/06-abstand.md | 189 - web/lessons/en/visubot/06-konstanten-final.md | 151 - web/lessons/en/visubot/06-nah-mittel-weit.md | 189 - web/lessons/en/visubot/07-linie.md | 257 - web/lessons/en/visubot/07-und-oder.md | 257 - web/lessons/en/visubot/08-farben.md | 163 - web/lessons/en/visubot/08-groesster-wert.md | 162 - .../en/visubot/09-fallauswahl-mbot2.md | 231 - web/lessons/en/visubot/10-tasten-joystick.md | 177 - .../en/visubot/10-unterbrechen-mit-break.md | 230 - web/lessons/en/visubot/11-licht.md | 164 - web/lessons/en/visubot/11-merker-boolean.md | 155 - web/lessons/en/visubot/12-lautstaerke.md | 163 - web/lessons/en/visubot/13-neigung.md | 184 - web/lessons/en/visubot/14-leds.md | 216 - web/lessons/en/visubot/15-einzelne-leds.md | 209 - web/lessons/en/visubot/16-lautsprecher.md | 167 - web/lessons/en/visubot/17-arrays-melodie.md | 244 - web/lessons/en/visubot/18-bildschirm.md | 206 - web/lessons/en/visubot/19-zeichenketten.md | 192 - web/lessons/en/visubot/20-motoren.md | 171 - web/lessons/en/visubot/21-stoppuhr-akku.md | 173 - web/lessons/en/visubot/21-zustaende.md | 160 - web/lessons/en/visubot/22-eigene-methoden.md | 334 - .../en/visubot/23-wie-geht-es-weiter.md | 148 - .../en/visubot/aufgaben/alarmanlage.md | 19 - web/lessons/en/visubot/aufgaben/ausgang.md | 19 - .../en/visubot/aufgaben/binaer-zaehlen.md | 25 - web/lessons/en/visubot/aufgaben/dreieck.md | 23 - web/lessons/en/visubot/aufgaben/einparken.md | 20 - web/lessons/en/visubot/aufgaben/hindernis.md | 18 - .../en/visubot/aufgaben/knight-rider.md | 17 - web/lessons/en/visubot/aufgaben/labyrinth.md | 25 - .../en/visubot/aufgaben/linienfolger-stopp.md | 21 - web/lessons/en/visubot/aufgaben/morsen.md | 17 - .../en/visubot/aufgaben/nachtwaechter.md | 18 - web/lessons/en/visubot/aufgaben/slalom.md | 19 - web/lessons/en/visubot/aufgaben/spirale.md | 19 - web/lessons/en/visubot/aufgaben/treppe.md | 17 - web/lessons/en/visubot/aufgaben/tunnel.md | 21 - web/lessons/en/visubot/aufgaben/wald.md | 19 - web/lessons/en/visubot/nachschlagen.md | 168 - web/lessons/pt/01-was-ist-ein-struktogramm.md | 229 - web/lessons/pt/01-weitere-darstellungen.md | 246 - web/lessons/pt/02-der-editor.md | 188 - .../pt/03-speichern-oeffnen-exportieren.md | 171 - web/lessons/pt/04-variablen-und-datentypen.md | 407 - web/lessons/pt/05-sequenz.md | 253 - web/lessons/pt/06-eingabe-und-ausgabe.md | 432 - .../pt/07-simulation-und-schreibtischtest.md | 364 - web/lessons/pt/08-verzweigung.md | 368 - web/lessons/pt/09-bedingungen-verknuepfen.md | 328 - web/lessons/pt/10-fallauswahl.md | 330 - web/lessons/pt/11-while-schleife.md | 359 - web/lessons/pt/12-do-while-schleife.md | 279 - web/lessons/pt/13-for-schleife.md | 337 - web/lessons/pt/14-verschachteln.md | 305 - web/lessons/pt/15-arrays.md | 362 - web/lessons/pt/16-zweidimensionale-arrays.md | 317 - web/lessons/pt/17-zeichenketten.md | 528 - web/lessons/pt/18-aufruf-und-aussprung.md | 482 - web/lessons/pt/19-suchen-und-sortieren.md | 352 - web/lessons/pt/20-java.md | 472 - web/lessons/pt/21-python-und-javascript.md | 240 - web/lessons/pt/22-try-und-catch.md | 293 - .../pt/23-text-einlesen-und-speichern.md | 254 - web/lessons/pt/24-zeile-fuer-zeile.md | 256 - web/lessons/pt/25-tabellen-als-csv.md | 224 - web/lessons/pt/26-json.md | 225 - web/lessons/pt/27-formate-im-vergleich.md | 175 - web/lessons/pt/28-erstes-fenster.md | 230 - web/lessons/pt/29-knopf-im-fenster.md | 231 - web/lessons/pt/30-der-knopf-reagiert.md | 356 - web/lessons/pt/31-zahl-verdoppeln.md | 295 - web/lessons/pt/32-klickzaehler.md | 246 - web/lessons/pt/33-ampel.md | 290 - web/lessons/pt/34-notenrechner.md | 285 - web/lessons/pt/35-taschenrechner.md | 285 - web/lessons/pt/36-zahlenraten.md | 242 - .../pt/37-viele-knoepfe-ein-zuhoerer.md | 318 - web/lessons/pt/38-innere-klassen.md | 246 - web/lessons/pt/39-zwei-reiter.md | 295 - web/lessons/pt/40-model-view-controller.md | 430 - .../pt/aufgaben/alter-unterprogramm.md | 21 - web/lessons/pt/aufgaben/ballwurf.md | 29 - web/lessons/pt/aufgaben/bestenliste.md | 34 - web/lessons/pt/aufgaben/binaerzahl.md | 42 - web/lessons/pt/aufgaben/caesar.md | 134 - web/lessons/pt/aufgaben/collatz.md | 44 - web/lessons/pt/aufgaben/einheitenrechner.md | 55 - web/lessons/pt/aufgaben/fibonacci.md | 54 - web/lessons/pt/aufgaben/gerade-ungerade.md | 36 - web/lessons/pt/aufgaben/mehrwertsteuer.md | 41 - web/lessons/pt/aufgaben/notendurchschnitt.md | 35 - web/lessons/pt/aufgaben/pin-pruefen.md | 40 - web/lessons/pt/aufgaben/schiffe-versenken.md | 37 - web/lessons/pt/aufgaben/speisekarte.md | 36 - web/lessons/pt/aufgaben/summe-bilden.md | 16 - web/lessons/pt/aufgaben/tafeldienst.md | 37 - web/lessons/pt/aufgaben/taschenrechner.md | 36 - web/lessons/pt/aufgaben/verleih-menue.md | 35 - web/lessons/pt/aufgaben/vokabeltrainer.md | 35 - web/lessons/pt/aufgaben/volljaehrig.md | 36 - web/lessons/pt/aufgaben/wuerfel-mvc.md | 45 - web/lessons/pt/aufgaben/zahl-verdoppeln.md | 16 - web/lessons/pt/begriffe.md | 258 - web/lessons/pt/nachschlagen.md | 169 - web/lessons/welten/ausgang-1.txt | 7 - web/lessons/welten/ausgang-2.txt | 9 - web/lessons/welten/ecke.txt | 7 - web/lessons/welten/farbe-1.txt | 6 - web/lessons/welten/farbe-2.txt | 9 - web/lessons/welten/farbe-3.txt | 7 - web/lessons/welten/farbe-4.txt | 7 - web/lessons/welten/hindernis-1.txt | 11 - web/lessons/welten/hindernis-2.txt | 15 - web/lessons/welten/labyrinth-1.txt | 12 - web/lessons/welten/labyrinth-2.txt | 12 - web/lessons/welten/linie-1.txt | 15 - web/lessons/welten/linie-2.txt | 15 - web/lessons/welten/linie-rot-1.txt | 14 - web/lessons/welten/linie-rot-2.txt | 16 - web/lessons/welten/parken-1.txt | 13 - web/lessons/welten/parken-2.txt | 13 - web/lessons/welten/platz-1.txt | 8 - web/lessons/welten/platz-2.txt | 11 - web/lessons/welten/rand-1.txt | 7 - web/lessons/welten/rand-2.txt | 10 - web/lessons/welten/slalom.txt | 5 - web/lessons/welten/tunnel-1.txt | 5 - web/lessons/welten/tunnel-2.txt | 8 - web/lessons/welten/wald-1.txt | 5 - web/lessons/welten/wald-2.txt | 9 - web/lessons/welten/wand-frei.txt | 10 - web/lessons/welten/wand-kurz.txt | 7 - web/lessons/welten/wand-lang.txt | 16 - web/lessons/welten/wand-mittel.txt | 11 - web/lessons/welten/wand-nah.txt | 5 - web/lessons/welten/zeit-1.txt | 7 - web/lessons/welten/ziel-kurz.txt | 7 - web/lessons/welten/ziel-lang.txt | 13 - web/mbot2-labor/index.html | 316 - web/package-lock.json | 2390 - web/package.json | 34 - web/prog.png | Bin 225010 -> 0 bytes web/settings.png | Bin 188669 -> 0 bytes web/shots/e2e-1.png | Bin 57904 -> 0 bytes web/shots/e2e-2.png | Bin 60936 -> 0 bytes web/shots/e2e-3.png | Bin 72147 -> 0 bytes web/shots/e2e-4.png | Bin 70867 -> 0 bytes web/src/core/classModel.ts | 690 - web/src/core/codeGenerator.ts | 1842 - web/src/core/diagramText.ts | 100 - web/src/core/editing.ts | 241 - web/src/core/exerciseCheck.ts | 202 - web/src/core/flowModel.ts | 242 - web/src/core/javaFormat.ts | 191 - web/src/core/javaIndent.ts | 84 - web/src/core/javaMembers.ts | 507 - web/src/core/javaParser.ts | 895 - web/src/core/javaProject.ts | 375 - web/src/core/javaStringCoding.ts | 23 - web/src/core/layout.ts | 591 - web/src/core/lineEditorText.ts | 95 - web/src/core/liveSource.ts | 186 - web/src/core/mbot.ts | 415 - web/src/core/mbotLink.ts | 379 - web/src/core/mbotProgram.ts | 274 - web/src/core/memberEdit.ts | 189 - web/src/core/miniJava.ts | 1902 - web/src/core/miniJavaParser.ts | 798 - web/src/core/model.ts | 69 - web/src/core/objectModel.ts | 81 - web/src/core/ownTypes.ts | 82 - web/src/core/palette.ts | 62 - web/src/core/rename.ts | 172 - web/src/core/robotPreview.ts | 68 - web/src/core/robotWorld.ts | 352 - web/src/core/sections.ts | 113 - web/src/core/simulation.ts | 2368 - web/src/core/textMeasurement.ts | 108 - web/src/core/typeTypos.ts | 29 - web/src/core/umlRelations.ts | 221 - web/src/core/workspace.ts | 41 - web/src/core/xmlCodec.ts | 145 - web/src/i18n/ar.strings | 201 - web/src/i18n/da.strings | 201 - web/src/i18n/de.strings | 800 - web/src/i18n/el.strings | 201 - web/src/i18n/en.strings | 800 - web/src/i18n/es.strings | 201 - web/src/i18n/fr.strings | 201 - web/src/i18n/he.strings | 201 - web/src/i18n/it.strings | 201 - web/src/i18n/ja.strings | 201 - web/src/i18n/ko.strings | 201 - web/src/i18n/nb.strings | 201 - web/src/i18n/nl.strings | 201 - web/src/i18n/pl.strings | 201 - web/src/i18n/pt-PT.strings | 798 - web/src/i18n/ru.strings | 201 - web/src/i18n/sv.strings | 201 - web/src/i18n/tr.strings | 201 - web/src/i18n/uk.strings | 201 - web/src/i18n/zh-Hans.strings | 201 - web/src/i18n/zh-Hant.strings | 201 - web/src/learn/boolGame.ts | 194 - web/src/learn/cloze.ts | 96 - web/src/learn/content.ts | 234 - web/src/learn/driveGame.ts | 138 - web/src/learn/glossary.ts | 38 - web/src/learn/lessonFormat.ts | 543 - web/src/learn/markdown.ts | 103 - web/src/learn/pap.ts | 157 - web/src/learn/progress.ts | 210 - web/src/learn/rescueGame.ts | 273 - web/src/learn/roundGame.ts | 581 - web/src/learn/teacher.ts | 52 - web/src/main.ts | 85 - web/src/ui/app.ts | 3130 - web/src/ui/blockPicture.ts | 53 - web/src/ui/blockView.ts | 765 - web/src/ui/caesarDisc.ts | 185 - web/src/ui/clozeView.ts | 131 - web/src/ui/codePanel.ts | 398 - web/src/ui/driveGameView.ts | 165 - web/src/ui/exporter.ts | 239 - web/src/ui/filesPanel.ts | 485 - web/src/ui/flowApp.ts | 792 - web/src/ui/i18n.ts | 187 - web/src/ui/icons.ts | 29 - web/src/ui/inlineEdit.ts | 189 - web/src/ui/javaEditor.ts | 687 - web/src/ui/javaRuntime.ts | 298 - web/src/ui/learnPanel.ts | 1075 - web/src/ui/liveCodePanel.ts | 1023 - web/src/ui/ludwig.webp | Bin 14066 -> 0 bytes web/src/ui/mbot2Model.ts | 419 - web/src/ui/mbotUpload.ts | 73 - web/src/ui/objectApp.ts | 3452 - web/src/ui/objectDiagram.ts | 415 - web/src/ui/objectLayout.ts | 136 - web/src/ui/objectNew.ts | 243 - web/src/ui/objectWorkspace.ts | 181 - web/src/ui/papView.ts | 359 - web/src/ui/projectZip.ts | 62 - web/src/ui/renameDialog.ts | 117 - web/src/ui/renderer.ts | 386 - web/src/ui/rescueGameView.ts | 339 - web/src/ui/robot3d.ts | 443 - web/src/ui/robotPreview.ts | 253 - web/src/ui/roundGameView.ts | 353 - web/src/ui/sequenceDiagram.ts | 123 - web/src/ui/simulationPanel.ts | 427 - web/src/ui/site.ts | 40 - web/src/ui/styles.css | 7094 -- web/src/ui/termTips.ts | 311 - web/src/ui/textFileView.ts | 31 - web/src/ui/tooltip.ts | 49 - web/src/ui/visubot.webp | Bin 9042 -> 0 bytes web/src/ui/visubotModel.ts | 157 - web/src/ui/visubotView.ts | 536 - web/src/ui/workspaceStore.ts | 220 - web/start-visubot.png | Bin 173899 -> 0 bytes web/start.png | Bin 164660 -> 0 bytes web/test/blockLessons.test.ts | 92 - web/test/blockView.test.ts | 251 - web/test/boolGame.test.ts | 33 - web/test/classModel.test.ts | 152 - web/test/codeGenerator.test.ts | 355 - web/test/codeKeywords.test.ts | 23 - web/test/countLoop.test.ts | 47 - web/test/driveGame.test.ts | 52 - web/test/editing.test.ts | 71 - web/test/editingParity.test.ts | 115 - web/test/exporter.test.ts | 43 - web/test/flowModel.test.ts | 56 - web/test/glossary.test.ts | 86 - web/test/i18n.test.ts | 42 - web/test/inlineEdit.test.ts | 45 - web/test/javaEditor.test.ts | 101 - web/test/javaFormat.test.ts | 103 - web/test/javaIndent.test.ts | 58 - web/test/javaMembers.test.ts | 90 - web/test/javaParser.test.ts | 401 - web/test/javaProject.test.ts | 76 - web/test/javaRuntime.test.ts | 23 - web/test/layoutColumns.test.ts | 31 - web/test/lessonEnd.ts | 24 - web/test/lessons.test.ts | 573 - web/test/mbot.test.ts | 93 - web/test/mbotLink.test.ts | 34 - web/test/mbotProgram.test.ts | 90 - web/test/mbotUpload.fixture.json | 14 - web/test/memberEdit.test.ts | 56 - web/test/miniJava.test.ts | 283 - web/test/objectModel.test.ts | 26 - web/test/objectNew.test.ts | 28 - web/test/objectWorkspace.test.ts | 94 - web/test/ownTypes.test.ts | 53 - web/test/progressMerge.test.ts | 60 - web/test/pythonExport.test.ts | 55 - web/test/rename.test.ts | 52 - web/test/rescueGame.test.ts | 65 - web/test/robotPreview.test.ts | 47 - web/test/robotWorld.test.ts | 193 - web/test/sections.test.ts | 67 - web/test/simulation.test.ts | 763 - web/test/site.test.ts | 37 - web/test/umlNotes.test.ts | 16 - web/test/umlRelations.test.ts | 94 - web/test/visubotLessons.test.ts | 192 - web/test/visubotSensors.test.ts | 164 - web/test/workspace.test.ts | 39 - web/test/xmlCodec.test.ts | 65 - web/tsconfig.json | 14 - web/vite.config.ts | 80 - website/app/assets/Java-Bpx1Vwvg.js | 226 - website/app/assets/Localizable-1QZ0wfvJ.js | 240 - website/app/assets/Localizable-BAutdlBb.js | 153 - website/app/assets/Localizable-BJ55WGVD.js | 153 - website/app/assets/Localizable-BM86Igqt.js | 241 - website/app/assets/Localizable-BYJK0mdR.js | 241 - website/app/assets/Localizable-BudCXCER.js | 241 - website/app/assets/Localizable-ByPZS4RL.js | 241 - website/app/assets/Localizable-CHv0OL9S.js | 256 - website/app/assets/Localizable-CaVEL1es.js | 241 - website/app/assets/Localizable-CkJEmEEP.js | 241 - website/app/assets/Localizable-CxCno28C.js | 241 - website/app/assets/Localizable-DBLIUcBd.js | 255 - website/app/assets/Localizable-DSvkBkp-.js | 153 - website/app/assets/Localizable-DXAPah1g.js | 241 - website/app/assets/Localizable-Dk8F86qS.js | 255 - website/app/assets/Localizable-DqIDp_hh.js | 241 - website/app/assets/Localizable-LSTVB2Q5.js | 241 - website/app/assets/Localizable-M33nNbEe.js | 153 - website/app/assets/Localizable-R-16GCrk.js | 241 - website/app/assets/Localizable-UGog_aku.js | 238 - website/app/assets/Localizable-rqA-20hM.js | 238 - website/app/assets/ada-lovelace-DS_988PF.jpg | Bin 70192 -> 0 bytes website/app/assets/ar-AgbDXJ1P.js | 202 - .../aufgabe-mehrwertsteuer-C-TFTrWz.svg | 79 - .../aufgabe-mehrwertsteuer-CnrZ00ny.svg | 79 - .../aufgabe-mehrwertsteuer-KUkerRBd.svg | 79 - .../app/assets/ben-shneiderman-Cev5hrqS.jpg | Bin 19298 -> 0 bytes website/app/assets/caesar-ascii-Bix93F5i.svg | 98 - .../app/assets/caesar-scheibe-CMRPZI6Y.svg | 62 - .../assets/caesar-verschiebung-DIR-lDbs.svg | 133 - website/app/assets/da-DCJmT-QF.js | 202 - website/app/assets/de-Bw3STH-g.js | 801 - website/app/assets/el-MJ37lw3F.js | 202 - website/app/assets/en-gIMn8Pa3.js | 801 - website/app/assets/es-or5dA7qu.js | 202 - website/app/assets/flowApp-BYyoSxMn.js | 50 - website/app/assets/fr-D5Wy8Mcd.js | 202 - website/app/assets/grace-hopper-DltOT1I5.jpg | Bin 46537 -> 0 bytes website/app/assets/he-CYY5d1yw.js | 202 - website/app/assets/hedy-lamarr-MFZMAlPQ.jpg | Bin 40173 -> 0 bytes website/app/assets/ike-nassi-D2w47gvX.jpg | Bin 19505 -> 0 bytes website/app/assets/index-BqSgHxq8.js | 83699 ---------------- website/app/assets/index-CLK72BwI.css | 1 - website/app/assets/it-B0g-vqj6.js | 202 - website/app/assets/ja-BNDo5HzU.js | 202 - .../app/assets/katherine-johnson-k17EjVTs.jpg | Bin 41104 -> 0 bytes website/app/assets/kino-saal-BOvcmdzb.svg | 32 - website/app/assets/kino-saal-C8zaJk4X.svg | 32 - website/app/assets/kino-saal-CYMOok4_.svg | 32 - .../app/assets/kino-schleifen-Ci9yPnbo.svg | 49 - .../app/assets/kino-schleifen-D7sfo9iK.svg | 49 - .../app/assets/kino-schleifen-DrTQV7dq.svg | 49 - website/app/assets/ko-D37jf4Vi.js | 202 - website/app/assets/l03-lochkarte-BB3rWQOm.svg | 998 - website/app/assets/l03-lochkarte-BSn6oWaS.svg | 994 - .../l03-lochkarte-beschriftet-7hmU_7ct.svg | 1016 - .../l03-lochkarte-beschriftet-BjBFZjzb.svg | 1019 - .../l03-lochkarte-beschriftet-D1QjqGFo.svg | 1015 - website/app/assets/l03-lochkarte-gzfFEatc.svg | 995 - .../assets/l03-zuse-lochstreifen-B87kqGex.svg | 226 - .../app/assets/l12-while-zu-for-CM2--y57.svg | 44 - .../app/assets/l12-while-zu-for-Cu-8sS5S.svg | 44 - .../app/assets/l12-while-zu-for-DddKE_8R.svg | 44 - .../l13-verschachtelt-tabelle-CR2WySqU.svg | 193 - .../l13-verschachtelt-tabelle-CmsFvxQ5.svg | 193 - .../l13-verschachtelt-tabelle-jipYA7Ld.svg | 193 - website/app/assets/ludwig-Cus1i402.webp | Bin 14066 -> 0 bytes .../app/assets/margaret-hamilton-pYPKs1sU.jpg | Bin 41701 -> 0 bytes website/app/assets/mvc-klick-BIA_bYzu.svg | 75 - website/app/assets/mvc-klick-DKonBpbs.svg | 75 - website/app/assets/mvc-klick-KmFKqxH-.svg | 75 - website/app/assets/nb-CsT7SL7q.js | 202 - website/app/assets/nl-CPGJmQ49.js | 202 - website/app/assets/objectApp-ClGVaIKp.js | 421 - website/app/assets/pl-DDkdCN00.js | 202 - website/app/assets/projectZip-DtugKwEc.js | 1 - website/app/assets/pt-PT-aHTlqnII.js | 799 - website/app/assets/robot3d-CJE1N58D.js | 3955 - website/app/assets/ru-bst4sg1r.js | 202 - .../app/assets/schiffe-versenken-CXt1SF0S.svg | 55 - .../app/assets/schiffe-versenken-iEBDHIxD.svg | 55 - .../app/assets/ss-binaere-suche-CPsLGldq.svg | 67 - .../app/assets/ss-binaere-suche-D02W1TH_.svg | 67 - .../app/assets/ss-binaere-suche-DVVS2SNc.svg | 67 - website/app/assets/ss-bubblesort-AFDcFDah.svg | 35 - website/app/assets/ss-bubblesort-CmKEoNfO.svg | 35 - website/app/assets/ss-bubblesort-Dic2ZfaT.svg | 35 - website/app/assets/ss-vergleiche-DRqzU2TZ.svg | 22 - website/app/assets/ss-vergleiche-DWgkIvLr.svg | 22 - website/app/assets/ss-vergleiche-UczNldcC.svg | 22 - website/app/assets/sv-BZ9E37oq.js | 202 - website/app/assets/tr-C3W_u6Ol.js | 202 - website/app/assets/uk-D0HDyCtp.js | 202 - website/app/assets/visubot-CyGFOI9V.webp | Bin 9042 -> 0 bytes website/app/assets/zh-Hans-R_GuNvYU.js | 202 - website/app/assets/zh-Hant-DoE9BrE1.js | 202 - website/app/assets/zk-zeichen-8efNmpGx.svg | 31 - website/app/assets/zk-zeichen-CgUEhNoK.svg | 29 - website/app/assets/zk-zeichen-vYvc3iJg.svg | 27 - website/app/index.html | 15 - website/app/licenses.txt | 494 - ..._the_App_Store_Badge_DE_RGB_wht_092917.svg | 40 - ..._the_App_Store_Badge_ES_RGB_wht_100217.svg | 47 - ..._the_App_Store_Badge_FR_RGB_wht_100217.svg | 50 - ...he_App_Store_Badge_PTPT_RGB_wht_100317.svg | 46 - ...e_App_Store_Badge_US-UK_RGB_wht_092917.svg | 46 - ...visustruct-app-java-deutsch-switchCase.png | Bin 57906 -> 0 bytes .../javaApp/visustruct-app-java-deutsch.png | Bin 460315 -> 0 bytes ...visustruct-app-java-englisch-java_like.png | Bin 451726 -> 0 bytes .../javaApp/visustruct-app-java-english.png | Bin 451977 -> 0 bytes .../visustruct-app-java-generateCodeJS.png | Bin 321043 -> 0 bytes .../javaApp/visustruct-app-java-portugues.png | Bin 455373 -> 0 bytes website/assets/logo-mark.svg | 36 - ...isustruct-app-swift-deutsch-switchCase.png | Bin 79972 -> 0 bytes .../swiftApp/visustruct-app-swift-english.png | Bin 70344 -> 0 bytes .../swiftApp/visustruct-app-swift-german.png | Bin 72779 -> 0 bytes .../visustruct-app-swift-java_like.png | Bin 87018 -> 0 bytes .../visustruct-app-swift-portuguese.png | Bin 72864 -> 0 bytes .../assets/visubot/steps/step-build-de.png | Bin 30953 -> 0 bytes .../assets/visubot/steps/step-build-en.png | Bin 31090 -> 0 bytes .../assets/visubot/steps/step-build-pt.png | Bin 33673 -> 0 bytes website/assets/visubot/steps/step-drive.jpg | Bin 52706 -> 0 bytes website/assets/visubot/steps/step-test.png | Bin 89242 -> 0 bytes website/assets/visubot/visubot-app-de.png | Bin 271721 -> 0 bytes website/assets/visubot/visubot-app-en.png | Bin 262117 -> 0 bytes website/assets/visubot/visubot-app-pt.png | Bin 269868 -> 0 bytes website/assets/visubot/visubot-de.png | Bin 235148 -> 0 bytes website/assets/visubot/visubot-en.png | Bin 222246 -> 0 bytes website/assets/visubot/visubot-logo.svg | 7 - website/assets/visubot/visubot-mark.webp | Bin 9042 -> 0 bytes website/assets/visubot/visubot-pt.png | Bin 204781 -> 0 bytes website/assets/visuobject/inspektor-de.png | Bin 152876 -> 0 bytes website/assets/visuobject/step-debug.png | Bin 132310 -> 0 bytes website/assets/visuobject/step-draw.png | Bin 177657 -> 0 bytes website/assets/visuobject/step-objects.png | Bin 122625 -> 0 bytes .../assets/visuobject/visuobject-app-de.png | Bin 201055 -> 0 bytes website/assets/visuobject/visuobject-de.png | Bin 136438 -> 0 bytes website/assets/visuobject/visuobject-en.png | Bin 134206 -> 0 bytes website/assets/visuobject/visuobject-mark.svg | 7 - ...visustruct-app-java-deutsch-switchCase.png | Bin 57906 -> 0 bytes .../assets/visustruct-app-java-deutsch.png | Bin 460315 -> 0 bytes ...visustruct-app-java-englisch-java_like.png | Bin 451726 -> 0 bytes .../assets/visustruct-app-java-english.png | Bin 451977 -> 0 bytes .../visustruct-app-java-generateCodeJS.png | Bin 321043 -> 0 bytes .../assets/visustruct-app-java-portugues.png | Bin 455373 -> 0 bytes website/assets/visustruct-app-java.png | Bin 57906 -> 0 bytes website/assets/visustruct-app-mac-ipad.png | Bin 79972 -> 0 bytes ...isustruct-app-swift-deutsch-switchCase.png | Bin 79972 -> 0 bytes .../assets/visustruct-app-swift-english.png | Bin 591552 -> 0 bytes .../assets/visustruct-app-swift-german.png | Bin 602014 -> 0 bytes .../assets/visustruct-app-swift-java_like.png | Bin 563798 -> 0 bytes .../visustruct-app-swift-portuguese.png | Bin 600700 -> 0 bytes .../VisuStruct-Simulator.mp4 | Bin 402201 -> 0 bytes website/assets/webApp/steps/step-build-de.png | Bin 43593 -> 0 bytes website/assets/webApp/steps/step-build-en.png | Bin 65556 -> 0 bytes website/assets/webApp/steps/step-build-es.png | Bin 67758 -> 0 bytes website/assets/webApp/steps/step-build-fr.png | Bin 68091 -> 0 bytes website/assets/webApp/steps/step-build-pt.png | Bin 67408 -> 0 bytes website/assets/webApp/steps/step-code-de.png | Bin 64486 -> 0 bytes website/assets/webApp/steps/step-code-en.png | Bin 65161 -> 0 bytes website/assets/webApp/steps/step-code-es.png | Bin 65161 -> 0 bytes website/assets/webApp/steps/step-code-fr.png | Bin 65161 -> 0 bytes website/assets/webApp/steps/step-code-pt.png | Bin 65161 -> 0 bytes website/assets/webApp/steps/step-test-de.png | Bin 55454 -> 0 bytes website/assets/webApp/steps/step-test-en.png | Bin 52585 -> 0 bytes website/assets/webApp/steps/step-test-es.png | Bin 55104 -> 0 bytes website/assets/webApp/steps/step-test-fr.png | Bin 55453 -> 0 bytes website/assets/webApp/steps/step-test-pt.png | Bin 55770 -> 0 bytes website/assets/webApp/web-editor-de.png | Bin 105621 -> 0 bytes website/assets/webApp/web-editor-en.png | Bin 98400 -> 0 bytes website/assets/webApp/web-learn-de.png | Bin 277638 -> 0 bytes website/css/styles.css | 1045 - website/de/index.html | 288 - website/de/visubot.html | 229 - website/de/visuobject.html | 228 - website/en/index.html | 288 - website/en/visubot.html | 229 - website/en/visuobject.html | 228 - website/es/index.html | 230 - website/fr/index.html | 230 - website/index.html | 20 - website/luisa/index.html | 50 - website/pt/index.html | 288 - website/pt/visubot.html | 229 - website/pt/visuobject.html | 228 - website/visubot/index.html | 19 - .../visubot/messprotokoll-radumdrehung.pdf | Bin 43464 -> 0 bytes .../visubot/test-record-wheel-rotation.pdf | Bin 41216 -> 0 bytes website/visuobject/index.html | 19 - 1855 files changed, 4 insertions(+), 263289 deletions(-) delete mode 100755 .github/scripts/deploy-website.sh delete mode 100644 .github/scripts/htaccess-cache.conf delete mode 100644 .github/workflows/deploy-website.yml rename {website/assets => assets}/VisuStruct-icon.png (100%) delete mode 100644 web/.gitignore delete mode 100644 web/README.md delete mode 100644 web/index.html delete mode 100644 web/laptop2.png delete mode 100644 web/lessons/README.md delete mode 100644 web/lessons/bilder/ada-lovelace.jpg delete mode 100644 web/lessons/bilder/aufgabe-mehrwertsteuer.svg delete mode 100644 web/lessons/bilder/ben-shneiderman.jpg delete mode 100644 web/lessons/bilder/caesar-ascii.svg delete mode 100644 web/lessons/bilder/caesar-scheibe.svg delete mode 100644 web/lessons/bilder/caesar-verschiebung.svg delete mode 100644 web/lessons/bilder/en/aufgabe-mehrwertsteuer.svg delete mode 100644 web/lessons/bilder/en/kino-saal.svg delete mode 100644 web/lessons/bilder/en/kino-schleifen.svg delete mode 100644 web/lessons/bilder/en/l01-pap.svg delete mode 100644 web/lessons/bilder/en/l02-einfuegen.svg delete mode 100644 web/lessons/bilder/en/l03-lochkarte-beschriftet.svg delete mode 100644 web/lessons/bilder/en/l03-lochkarte.svg delete mode 100644 web/lessons/bilder/en/l04-camelcase.svg delete mode 100644 web/lessons/bilder/en/l04-variable.svg delete mode 100644 web/lessons/bilder/en/l04-zuweisung.svg delete mode 100644 web/lessons/bilder/en/l05-tauschen.svg delete mode 100644 web/lessons/bilder/en/l08-zahlenstrahl.svg delete mode 100644 web/lessons/bilder/en/l10-kopfgesteuert.svg delete mode 100644 web/lessons/bilder/en/l11-vergleich.svg delete mode 100644 web/lessons/bilder/en/l12-for-ablauf.svg delete mode 100644 web/lessons/bilder/en/l12-while-zu-for.svg delete mode 100644 web/lessons/bilder/en/l13-verschachtelt-tabelle.svg delete mode 100644 web/lessons/bilder/en/l14-array.svg delete mode 100644 web/lessons/bilder/en/l20-cpp.svg delete mode 100644 web/lessons/bilder/en/l20-jvm.svg delete mode 100644 web/lessons/bilder/en/mvc-klick.svg delete mode 100644 web/lessons/bilder/en/ss-binaere-suche.svg delete mode 100644 web/lessons/bilder/en/ss-bubblesort.svg delete mode 100644 web/lessons/bilder/en/ss-lineare-suche.svg delete mode 100644 web/lessons/bilder/en/ss-vergleiche.svg delete mode 100644 web/lessons/bilder/en/uebergabe.svg delete mode 100644 web/lessons/bilder/en/zk-zeichen.svg delete mode 100644 web/lessons/bilder/grace-hopper.jpg delete mode 100644 web/lessons/bilder/hedy-lamarr.jpg delete mode 100644 web/lessons/bilder/ike-nassi.jpg delete mode 100644 web/lessons/bilder/katherine-johnson.jpg delete mode 100644 web/lessons/bilder/kino-saal.svg delete mode 100644 web/lessons/bilder/kino-schleifen.svg delete mode 100644 web/lessons/bilder/l01-pap.svg delete mode 100644 web/lessons/bilder/l02-einfuegen.svg delete mode 100644 web/lessons/bilder/l03-lochkarte-beschriftet.svg delete mode 100644 web/lessons/bilder/l03-lochkarte.svg delete mode 100644 web/lessons/bilder/l03-zuse-lochstreifen.svg delete mode 100644 web/lessons/bilder/l04-camelcase.svg delete mode 100644 web/lessons/bilder/l04-variable.svg delete mode 100644 web/lessons/bilder/l04-zuweisung.svg delete mode 100644 web/lessons/bilder/l05-tauschen.svg delete mode 100644 web/lessons/bilder/l07-schreibtischtest-de.svg delete mode 100644 web/lessons/bilder/l07-schreibtischtest-en.svg delete mode 100644 web/lessons/bilder/l07-schreibtischtest-pt.svg delete mode 100644 web/lessons/bilder/l08-zahlenstrahl.svg delete mode 100644 web/lessons/bilder/l09-wahrheitstabelle.svg delete mode 100644 web/lessons/bilder/l10-kopfgesteuert.svg delete mode 100644 web/lessons/bilder/l11-vergleich.svg delete mode 100644 web/lessons/bilder/l12-for-ablauf.svg delete mode 100644 web/lessons/bilder/l12-while-zu-for.svg delete mode 100644 web/lessons/bilder/l13-verschachtelt-tabelle.svg delete mode 100644 web/lessons/bilder/l14-array.svg delete mode 100644 web/lessons/bilder/l20-cpp.svg delete mode 100644 web/lessons/bilder/l20-jvm.svg delete mode 100644 web/lessons/bilder/margaret-hamilton.jpg delete mode 100644 web/lessons/bilder/mvc-klick.svg delete mode 100644 web/lessons/bilder/pt/aufgabe-mehrwertsteuer.svg delete mode 100644 web/lessons/bilder/pt/kino-saal.svg delete mode 100644 web/lessons/bilder/pt/kino-schleifen.svg delete mode 100644 web/lessons/bilder/pt/l01-pap.svg delete mode 100644 web/lessons/bilder/pt/l02-einfuegen.svg delete mode 100644 web/lessons/bilder/pt/l03-lochkarte-beschriftet.svg delete mode 100644 web/lessons/bilder/pt/l03-lochkarte.svg delete mode 100644 web/lessons/bilder/pt/l04-camelcase.svg delete mode 100644 web/lessons/bilder/pt/l04-variable.svg delete mode 100644 web/lessons/bilder/pt/l04-zuweisung.svg delete mode 100644 web/lessons/bilder/pt/l05-tauschen.svg delete mode 100644 web/lessons/bilder/pt/l08-zahlenstrahl.svg delete mode 100644 web/lessons/bilder/pt/l10-kopfgesteuert.svg delete mode 100644 web/lessons/bilder/pt/l11-vergleich.svg delete mode 100644 web/lessons/bilder/pt/l12-for-ablauf.svg delete mode 100644 web/lessons/bilder/pt/l12-while-zu-for.svg delete mode 100644 web/lessons/bilder/pt/l13-verschachtelt-tabelle.svg delete mode 100644 web/lessons/bilder/pt/l14-array.svg delete mode 100644 web/lessons/bilder/pt/l20-cpp.svg delete mode 100644 web/lessons/bilder/pt/l20-jvm.svg delete mode 100644 web/lessons/bilder/pt/mvc-klick.svg delete mode 100644 web/lessons/bilder/pt/schiffe-versenken.svg delete mode 100644 web/lessons/bilder/pt/ss-binaere-suche.svg delete mode 100644 web/lessons/bilder/pt/ss-bubblesort.svg delete mode 100644 web/lessons/bilder/pt/ss-lineare-suche.svg delete mode 100644 web/lessons/bilder/pt/ss-vergleiche.svg delete mode 100644 web/lessons/bilder/pt/uebergabe.svg delete mode 100644 web/lessons/bilder/pt/zk-zeichen.svg delete mode 100644 web/lessons/bilder/schiffe-versenken.svg delete mode 100644 web/lessons/bilder/ss-binaere-suche.svg delete mode 100644 web/lessons/bilder/ss-bubblesort.svg delete mode 100644 web/lessons/bilder/ss-lineare-suche.svg delete mode 100644 web/lessons/bilder/ss-vergleiche.svg delete mode 100644 web/lessons/bilder/uebergabe.svg delete mode 100644 web/lessons/bilder/zk-zeichen.svg delete mode 100644 web/lessons/de/01-was-ist-ein-struktogramm.md delete mode 100644 web/lessons/de/01-weitere-darstellungen.md delete mode 100644 web/lessons/de/02-der-editor.md delete mode 100644 web/lessons/de/03-speichern-oeffnen-exportieren.md delete mode 100644 web/lessons/de/04-variablen-und-datentypen.md delete mode 100644 web/lessons/de/05-sequenz.md delete mode 100644 web/lessons/de/06-eingabe-und-ausgabe.md delete mode 100644 web/lessons/de/07-simulation-und-schreibtischtest.md delete mode 100644 web/lessons/de/08-verzweigung.md delete mode 100644 web/lessons/de/09-bedingungen-verknuepfen.md delete mode 100644 web/lessons/de/10-fallauswahl.md delete mode 100644 web/lessons/de/11-while-schleife.md delete mode 100644 web/lessons/de/12-do-while-schleife.md delete mode 100644 web/lessons/de/13-for-schleife.md delete mode 100644 web/lessons/de/14-verschachteln.md delete mode 100644 web/lessons/de/15-arrays.md delete mode 100644 web/lessons/de/16-zweidimensionale-arrays.md delete mode 100644 web/lessons/de/17-zeichenketten.md delete mode 100644 web/lessons/de/18-aufruf-und-aussprung.md delete mode 100644 web/lessons/de/19-suchen-und-sortieren.md delete mode 100644 web/lessons/de/20-java.md delete mode 100644 web/lessons/de/21-python-und-javascript.md delete mode 100644 web/lessons/de/22-try-und-catch.md delete mode 100644 web/lessons/de/23-text-einlesen-und-speichern.md delete mode 100644 web/lessons/de/24-zeile-fuer-zeile.md delete mode 100644 web/lessons/de/25-tabellen-als-csv.md delete mode 100644 web/lessons/de/26-json.md delete mode 100644 web/lessons/de/27-formate-im-vergleich.md delete mode 100644 web/lessons/de/28-erstes-fenster.md delete mode 100644 web/lessons/de/29-knopf-im-fenster.md delete mode 100644 web/lessons/de/30-der-knopf-reagiert.md delete mode 100644 web/lessons/de/31-zahl-verdoppeln.md delete mode 100644 web/lessons/de/32-klickzaehler.md delete mode 100644 web/lessons/de/33-ampel.md delete mode 100644 web/lessons/de/34-notenrechner.md delete mode 100644 web/lessons/de/35-taschenrechner.md delete mode 100644 web/lessons/de/36-zahlenraten.md delete mode 100644 web/lessons/de/37-viele-knoepfe-ein-zuhoerer.md delete mode 100644 web/lessons/de/38-innere-klassen.md delete mode 100644 web/lessons/de/39-zwei-reiter.md delete mode 100644 web/lessons/de/40-model-view-controller.md delete mode 100644 web/lessons/de/aufgaben/alter-unterprogramm.md delete mode 100644 web/lessons/de/aufgaben/ballwurf.md delete mode 100644 web/lessons/de/aufgaben/bestenliste.md delete mode 100644 web/lessons/de/aufgaben/binaerzahl.md delete mode 100644 web/lessons/de/aufgaben/caesar.md delete mode 100644 web/lessons/de/aufgaben/collatz.md delete mode 100644 web/lessons/de/aufgaben/einheitenrechner.md delete mode 100644 web/lessons/de/aufgaben/fibonacci.md delete mode 100644 web/lessons/de/aufgaben/gerade-ungerade.md delete mode 100644 web/lessons/de/aufgaben/mehrwertsteuer.md delete mode 100644 web/lessons/de/aufgaben/notendurchschnitt.md delete mode 100644 web/lessons/de/aufgaben/pin-pruefen.md delete mode 100644 web/lessons/de/aufgaben/schiffe-versenken.md delete mode 100644 web/lessons/de/aufgaben/speisekarte.md delete mode 100644 web/lessons/de/aufgaben/summe-bilden.md delete mode 100644 web/lessons/de/aufgaben/tafeldienst.md delete mode 100644 web/lessons/de/aufgaben/taschenrechner.md delete mode 100644 web/lessons/de/aufgaben/verleih-menue.md delete mode 100644 web/lessons/de/aufgaben/vokabeltrainer.md delete mode 100644 web/lessons/de/aufgaben/volljaehrig.md delete mode 100644 web/lessons/de/aufgaben/wuerfel-mvc.md delete mode 100644 web/lessons/de/aufgaben/zahl-verdoppeln.md delete mode 100644 web/lessons/de/begriffe.md delete mode 100644 web/lessons/de/nachschlagen.md delete mode 100644 web/lessons/de/visubot/00-struktogramm-und-editor.md delete mode 100644 web/lessons/de/visubot/01-der-mbot2.md delete mode 100644 web/lessons/de/visubot/02-das-quadrat.md delete mode 100644 web/lessons/de/visubot/02-quadrat-als-pap.md delete mode 100644 web/lessons/de/visubot/03-variablen-und-ausgabe.md delete mode 100644 web/lessons/de/visubot/03-zeile-fuer-zeile-testen.md delete mode 100644 web/lessons/de/visubot/04-sensoren.md delete mode 100644 web/lessons/de/visubot/05-bis-zur-wand.md delete mode 100644 web/lessons/de/visubot/05-erst-fahren-dann-pruefen.md delete mode 100644 web/lessons/de/visubot/05-zaehlen-und-summieren.md delete mode 100644 web/lessons/de/visubot/06-abstand.md delete mode 100644 web/lessons/de/visubot/06-konstanten-final.md delete mode 100644 web/lessons/de/visubot/06-nah-mittel-weit.md delete mode 100644 web/lessons/de/visubot/07-linie.md delete mode 100644 web/lessons/de/visubot/07-und-oder.md delete mode 100644 web/lessons/de/visubot/08-farben.md delete mode 100644 web/lessons/de/visubot/08-groesster-wert.md delete mode 100644 web/lessons/de/visubot/09-fallauswahl-mbot2.md delete mode 100644 web/lessons/de/visubot/10-tasten-joystick.md delete mode 100644 web/lessons/de/visubot/10-unterbrechen-mit-break.md delete mode 100644 web/lessons/de/visubot/11-licht.md delete mode 100644 web/lessons/de/visubot/11-merker-boolean.md delete mode 100644 web/lessons/de/visubot/12-lautstaerke.md delete mode 100644 web/lessons/de/visubot/13-neigung.md delete mode 100644 web/lessons/de/visubot/14-leds.md delete mode 100644 web/lessons/de/visubot/15-einzelne-leds.md delete mode 100644 web/lessons/de/visubot/16-lautsprecher.md delete mode 100644 web/lessons/de/visubot/17-arrays-melodie.md delete mode 100644 web/lessons/de/visubot/18-bildschirm.md delete mode 100644 web/lessons/de/visubot/19-zeichenketten.md delete mode 100644 web/lessons/de/visubot/20-motoren.md delete mode 100644 web/lessons/de/visubot/21-stoppuhr-akku.md delete mode 100644 web/lessons/de/visubot/21-zustaende.md delete mode 100644 web/lessons/de/visubot/22-eigene-methoden.md delete mode 100644 web/lessons/de/visubot/23-wie-geht-es-weiter.md delete mode 100644 web/lessons/de/visubot/aufgaben/alarmanlage.md delete mode 100644 web/lessons/de/visubot/aufgaben/ausgang.md delete mode 100644 web/lessons/de/visubot/aufgaben/binaer-zaehlen.md delete mode 100644 web/lessons/de/visubot/aufgaben/dreieck.md delete mode 100644 web/lessons/de/visubot/aufgaben/einparken.md delete mode 100644 web/lessons/de/visubot/aufgaben/hindernis.md delete mode 100644 web/lessons/de/visubot/aufgaben/knight-rider.md delete mode 100644 web/lessons/de/visubot/aufgaben/labyrinth.md delete mode 100644 web/lessons/de/visubot/aufgaben/linienfolger-stopp.md delete mode 100644 web/lessons/de/visubot/aufgaben/morsen.md delete mode 100644 web/lessons/de/visubot/aufgaben/nachtwaechter.md delete mode 100644 web/lessons/de/visubot/aufgaben/slalom.md delete mode 100644 web/lessons/de/visubot/aufgaben/spirale.md delete mode 100644 web/lessons/de/visubot/aufgaben/treppe.md delete mode 100644 web/lessons/de/visubot/aufgaben/tunnel.md delete mode 100644 web/lessons/de/visubot/aufgaben/wald.md delete mode 100644 web/lessons/de/visubot/bloecke/01-losfahren.md delete mode 100644 web/lessons/de/visubot/bloecke/02-immer-wieder.md delete mode 100644 web/lessons/de/visubot/bloecke/03-der-mbot2-misst.md delete mode 100644 web/lessons/de/visubot/bloecke/04-entscheidungen.md delete mode 100644 web/lessons/de/visubot/bloecke/05-lichter-und-toene.md delete mode 100644 web/lessons/de/visubot/bloecke/06-immer-wieder-pruefen.md delete mode 100644 web/lessons/de/visubot/bloecke/07-der-linie-folgen.md delete mode 100644 web/lessons/de/visubot/bloecke/08-parcours.md delete mode 100644 web/lessons/de/visubot/bloecke/aufgaben/block-ausgang.md delete mode 100644 web/lessons/de/visubot/bloecke/aufgaben/block-disco.md delete mode 100644 web/lessons/de/visubot/bloecke/aufgaben/block-slalom.md delete mode 100644 web/lessons/de/visubot/bloecke/aufgaben/block-wald.md delete mode 100644 web/lessons/de/visubot/nachschlagen.md delete mode 100644 web/lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-ballwurf-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-ballwurf-start.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-bestenliste-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-binaer-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-caesar-array-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-caesar-array-start.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-collatz-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-fibonacci-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-pin-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-pin-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-schiffe-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-schiffe-start.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-speisekarte-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-verleih-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-verleih-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-vokabeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-vokabeln-start.visustruct delete mode 100644 web/lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct delete mode 100644 web/lessons/diagramme/dt-buffered.visustruct delete mode 100644 web/lessons/diagramme/dt-csv.visustruct delete mode 100644 web/lessons/diagramme/dt-json.visustruct delete mode 100644 web/lessons/diagramme/dt-lesen.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-ballwurf-start.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-binaer-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-caesar-array-start.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-collatz-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-pin-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-schiffe-start.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-verleih-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-vokabeln-start.visustruct delete mode 100644 web/lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/dt-buffered.visustruct delete mode 100644 web/lessons/diagramme/en/dt-csv.visustruct delete mode 100644 web/lessons/diagramme/en/dt-json.visustruct delete mode 100644 web/lessons/diagramme/en/dt-lesen.visustruct delete mode 100644 web/lessons/diagramme/en/kino-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/kino-frei-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/kino-frei-start.visustruct delete mode 100644 web/lessons/diagramme/en/kino-karte-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/kino-karte-start.visustruct delete mode 100644 web/lessons/diagramme/en/kino-saalplan.visustruct delete mode 100644 web/lessons/diagramme/en/kino-verkaufen.visustruct delete mode 100644 web/lessons/diagramme/en/l04-gross-klein-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-gross-klein-start.visustruct delete mode 100644 web/lessons/diagramme/en/l04-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l04-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-rechnen.visustruct delete mode 100644 web/lessons/diagramme/en/l04-reihenfolge-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-reihenfolge-start.visustruct delete mode 100644 web/lessons/diagramme/en/l04-tauschen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l04-tauschen-start.visustruct delete mode 100644 web/lessons/diagramme/en/l04-tauschen.visustruct delete mode 100644 web/lessons/diagramme/en/l05-datentypen.visustruct delete mode 100644 web/lessons/diagramme/en/l05-division.visustruct delete mode 100644 web/lessons/diagramme/en/l05-einkauf-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l05-java-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l05-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-sekunden-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l05-sekunden-start.visustruct delete mode 100644 web/lessons/diagramme/en/l05-sequenz.visustruct delete mode 100644 web/lessons/diagramme/en/l06-begruessung-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l06-eva.visustruct delete mode 100644 web/lessons/diagramme/en/l06-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l06-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l06-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l06-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l06-java-tage-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l06-mittelwert-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l06-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-alter-pruefen.visustruct delete mode 100644 web/lessons/diagramme/en/l07-betrag-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-pizza-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-java-pizza-start.visustruct delete mode 100644 web/lessons/diagramme/en/l07-maximum-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l07-rabatt.visustruct delete mode 100644 web/lessons/diagramme/en/l08-gueltig-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l08-java-bestanden-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l08-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l08-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l08-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l08-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l08-jugendticket.visustruct delete mode 100644 web/lessons/diagramme/en/l08-note.visustruct delete mode 100644 web/lessons/diagramme/en/l08-schaltjahr-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l08-wochenende-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-ampel.visustruct delete mode 100644 web/lessons/diagramme/en/l09-automat.visustruct delete mode 100644 web/lessons/diagramme/en/l09-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l09-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l09-java-schule-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l09-verschachtelt.visustruct delete mode 100644 web/lessons/diagramme/en/l1-grundbausteine.visustruct delete mode 100644 web/lessons/diagramme/en/l1-sequenz.visustruct delete mode 100644 web/lessons/diagramme/en/l1-tee.visustruct delete mode 100644 web/lessons/diagramme/en/l1-verzweigung.visustruct delete mode 100644 web/lessons/diagramme/en/l1-wiederholung.visustruct delete mode 100644 web/lessons/diagramme/en/l10-bis-n-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l10-countdown.visustruct delete mode 100644 web/lessons/diagramme/en/l10-endlos.visustruct delete mode 100644 web/lessons/diagramme/en/l10-fakultaet.visustruct delete mode 100644 web/lessons/diagramme/en/l10-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l10-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l10-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l10-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l10-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l11-eingabe-pruefen.visustruct delete mode 100644 web/lessons/diagramme/en/l11-einmal.visustruct delete mode 100644 web/lessons/diagramme/en/l11-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l11-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l11-java-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l11-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l11-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l11-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l11-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-eins-bis-fuenf.visustruct delete mode 100644 web/lessons/diagramme/en/l12-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l12-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l12-summe.visustruct delete mode 100644 web/lessons/diagramme/en/l13-dreieck.visustruct delete mode 100644 web/lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l13-gerade-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/en/l13-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l13-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l13-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l13-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l13-java-quadrate-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l13-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-array-durchlaufen.visustruct delete mode 100644 web/lessons/diagramme/en/l14-erster-letzter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l14-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l14-java-treppe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-namen-eingeben.visustruct delete mode 100644 web/lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-summe-max-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l14-summe-maximum.visustruct delete mode 100644 web/lessons/diagramme/en/l15-bis-null-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-endlos-aussprung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-flaeche-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-hauptprogramm.visustruct delete mode 100644 web/lessons/diagramme/en/l15-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l15-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l15-java-noten-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-quadrat-haupt.visustruct delete mode 100644 web/lessons/diagramme/en/l15-quadrat.visustruct delete mode 100644 web/lessons/diagramme/en/l15-titel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l15-unterprogramm.visustruct delete mode 100644 web/lessons/diagramme/en/l15-zeige-summe-haupt.visustruct delete mode 100644 web/lessons/diagramme/en/l15-zeige-summe.visustruct delete mode 100644 web/lessons/diagramme/en/l16-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l16-countdown-start.visustruct delete mode 100644 web/lessons/diagramme/en/l16-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l16-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l16-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l16-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l16-java-punkte-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l16-schreibtisch.visustruct delete mode 100644 web/lessons/diagramme/en/l16-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l16-summe-start.visustruct delete mode 100644 web/lessons/diagramme/en/l17-beispiel.visustruct delete mode 100644 web/lessons/diagramme/en/l17-fakultaet-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-brief-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-brief-start.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l17-java-passwort-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l17-ticket-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l18-beispiel.visustruct delete mode 100644 web/lessons/diagramme/en/l18-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l18-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l18-java-kasse-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l18-js-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l18-python-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l19-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l19-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/en/l19-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l19-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l2-ausgabe.visustruct delete mode 100644 web/lessons/diagramme/en/l2-hallo-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l23-java-ergaenzen-start.visustruct delete mode 100644 web/lessons/diagramme/en/l23-java-nummern-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l23-java-nummern-start.visustruct delete mode 100644 web/lessons/diagramme/en/l24-java-fuchs-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l24-java-fuchs-start.visustruct delete mode 100644 web/lessons/diagramme/en/l24-java-laengster-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l24-java-laengster-start.visustruct delete mode 100644 web/lessons/diagramme/en/l25-java-beste-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l25-java-beste-start.visustruct delete mode 100644 web/lessons/diagramme/en/l25-java-schnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l25-java-schnitt-start.visustruct delete mode 100644 web/lessons/diagramme/en/l26-java-namen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l26-java-namen-start.visustruct delete mode 100644 web/lessons/diagramme/en/l26-java-schreiben-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l26-java-schreiben-start.visustruct delete mode 100644 web/lessons/diagramme/en/l27-java-json-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l27-java-json-start.visustruct delete mode 100644 web/lessons/diagramme/en/l27-java-saetze-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/l27-java-saetze-start.visustruct delete mode 100644 web/lessons/diagramme/en/sim-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/sim-kino-start.visustruct delete mode 100644 web/lessons/diagramme/en/sim-tausch-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/sim-tausch-start.visustruct delete mode 100644 web/lessons/diagramme/en/sim-tausch.visustruct delete mode 100644 web/lessons/diagramme/en/ss-absteigend-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/ss-absteigend-start.visustruct delete mode 100644 web/lessons/diagramme/en/ss-binaere-suche.visustruct delete mode 100644 web/lessons/diagramme/en/ss-bubblesort.visustruct delete mode 100644 web/lessons/diagramme/en/ss-karte-suchen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/ss-lineare-suche.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-bonus-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-bonus-start.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-haupt.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-leeren.visustruct delete mode 100644 web/lessons/diagramme/en/uebergabe-verdopple.visustruct delete mode 100644 web/lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-abstand-halten-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-alarmanlage-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-ampel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-ampel-zustand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-ausgang-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-begruessung-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-bis-rot-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-bis-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-bis-ziel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-buchstaben-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-do-while-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-drei-lichter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-dreieck-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-einparken-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-erster-plan-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-farben-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-farbweiche-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-04-sensoren-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-05-bis-zur-wand-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-05-zaehlen-und-summieren-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-06-abstand-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-06-konstanten-final-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-06-nah-mittel-weit-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-07-linie-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-07-und-oder-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-08-farben-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-08-groesster-wert-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-09-fallauswahl-mbot2-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-10-tasten-joystick-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-10-unterbrechen-mit-break-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-11-licht-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-11-merker-boolean-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-12-lautstaerke-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-13-neigung-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-14-leds-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-15-einzelne-leds-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-16-lautsprecher-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-17-arrays-melodie-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-18-bildschirm-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-19-zeichenketten-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-20-motoren-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-21-stoppuhr-akku-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-21-zustaende-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-22-eigene-methoden-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-fehler-23-wie-geht-es-weiter-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-hindernis-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-akku-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-ampel-text-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-blinken-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-hoeher-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-joystick-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-klatsch-merker-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-konstante-seite-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-laermampel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-rand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-rechteck-umdrehungen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-richtung-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-schritte-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-sicher-fahren-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-spirale-strecke-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-tageszeit-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-taste-stopp-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-klatschen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-knight-rider-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-konstante-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l00-bausteine-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l00-sequenz-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l03-wachsend-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l06k-mit.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l06k-ohne.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l06n-einparkhilfe.visustruct delete mode 100644 web/lessons/diagramme/en/vb-l21z-ausweichen.visustruct delete mode 100644 web/lessons/diagramme/en/vb-labyrinth-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-laufschrift-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-linienmuster-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-meister-platz-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-melodie-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-messreihe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-morsen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-nachtlicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-notbremse-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-oder-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-quadrat-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-rand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-schraeglage-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-schritte-welt-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-slalom-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-spirale-falsch-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-spirale-falsch-start.visustruct delete mode 100644 web/lessons/diagramme/en/vb-spirale-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-start-a-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-startsignal-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-strecke-anzeigen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-tempo-abstand-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-tonleiter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-treppe-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-tunnel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-ueberladung-umdrehung-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-und-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-variable-seite-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-wald-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-wand-vorn-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-wurde-es-dunkel-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-zentimeter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-zentimeter-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/zk-initialen-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/zk-mehr.visustruct delete mode 100644 web/lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/zk-split.visustruct delete mode 100644 web/lessons/diagramme/en/zk-woerter-loesung.visustruct delete mode 100644 web/lessons/diagramme/en/zk-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/en/zk-zeichen.visustruct delete mode 100644 web/lessons/diagramme/kino-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/kino-frei-loesung.visustruct delete mode 100644 web/lessons/diagramme/kino-frei-start.visustruct delete mode 100644 web/lessons/diagramme/kino-karte-loesung.visustruct delete mode 100644 web/lessons/diagramme/kino-karte-start.visustruct delete mode 100644 web/lessons/diagramme/kino-saalplan.visustruct delete mode 100644 web/lessons/diagramme/kino-verkaufen.visustruct delete mode 100644 web/lessons/diagramme/l04-gross-klein-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-gross-klein-start.visustruct delete mode 100644 web/lessons/diagramme/l04-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l04-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l04-java-steckbrief-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-rechnen.visustruct delete mode 100644 web/lessons/diagramme/l04-reihenfolge-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-reihenfolge-start.visustruct delete mode 100644 web/lessons/diagramme/l04-tauschen-loesung.visustruct delete mode 100644 web/lessons/diagramme/l04-tauschen-start.visustruct delete mode 100644 web/lessons/diagramme/l04-tauschen.visustruct delete mode 100644 web/lessons/diagramme/l05-datentypen.visustruct delete mode 100644 web/lessons/diagramme/l05-division.visustruct delete mode 100644 web/lessons/diagramme/l05-einkauf-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l05-java-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l05-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-sekunden-loesung.visustruct delete mode 100644 web/lessons/diagramme/l05-sekunden-start.visustruct delete mode 100644 web/lessons/diagramme/l05-sequenz.visustruct delete mode 100644 web/lessons/diagramme/l06-begruessung-loesung.visustruct delete mode 100644 web/lessons/diagramme/l06-eva.visustruct delete mode 100644 web/lessons/diagramme/l06-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l06-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l06-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l06-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l06-java-tage-loesung.visustruct delete mode 100644 web/lessons/diagramme/l06-mittelwert-loesung.visustruct delete mode 100644 web/lessons/diagramme/l06-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-alter-pruefen.visustruct delete mode 100644 web/lessons/diagramme/l07-betrag-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l07-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l07-java-pizza-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-java-pizza-start.visustruct delete mode 100644 web/lessons/diagramme/l07-maximum-loesung.visustruct delete mode 100644 web/lessons/diagramme/l07-rabatt.visustruct delete mode 100644 web/lessons/diagramme/l08-gueltig-loesung.visustruct delete mode 100644 web/lessons/diagramme/l08-java-bestanden-loesung.visustruct delete mode 100644 web/lessons/diagramme/l08-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l08-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l08-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l08-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l08-jugendticket.visustruct delete mode 100644 web/lessons/diagramme/l08-note.visustruct delete mode 100644 web/lessons/diagramme/l08-schaltjahr-loesung.visustruct delete mode 100644 web/lessons/diagramme/l08-wochenende-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-ampel.visustruct delete mode 100644 web/lessons/diagramme/l09-automat.visustruct delete mode 100644 web/lessons/diagramme/l09-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l09-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l09-java-schule-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/l09-verschachtelt.visustruct delete mode 100644 web/lessons/diagramme/l1-grundbausteine.visustruct delete mode 100644 web/lessons/diagramme/l1-sequenz.visustruct delete mode 100644 web/lessons/diagramme/l1-tee.visustruct delete mode 100644 web/lessons/diagramme/l1-verzweigung.visustruct delete mode 100644 web/lessons/diagramme/l1-wiederholung.visustruct delete mode 100644 web/lessons/diagramme/l10-bis-n-loesung.visustruct delete mode 100644 web/lessons/diagramme/l10-countdown.visustruct delete mode 100644 web/lessons/diagramme/l10-endlos.visustruct delete mode 100644 web/lessons/diagramme/l10-fakultaet.visustruct delete mode 100644 web/lessons/diagramme/l10-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l10-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l10-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l10-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l10-java-wuerfel-loesung.visustruct delete mode 100644 web/lessons/diagramme/l10-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/l11-eingabe-pruefen.visustruct delete mode 100644 web/lessons/diagramme/l11-einmal.visustruct delete mode 100644 web/lessons/diagramme/l11-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l11-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l11-java-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/l11-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l11-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l11-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/l11-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-eins-bis-fuenf.visustruct delete mode 100644 web/lessons/diagramme/l12-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l12-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l12-java-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/l12-summe.visustruct delete mode 100644 web/lessons/diagramme/l13-dreieck.visustruct delete mode 100644 web/lessons/diagramme/l13-gerade-eingaben-loesung.visustruct delete mode 100644 web/lessons/diagramme/l13-gerade-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/l13-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l13-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l13-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l13-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l13-java-quadrate-loesung.visustruct delete mode 100644 web/lessons/diagramme/l13-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-array-durchlaufen.visustruct delete mode 100644 web/lessons/diagramme/l14-erster-letzter-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l14-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l14-java-treppe-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-namen-eingeben.visustruct delete mode 100644 web/lessons/diagramme/l14-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-summe-max-loesung.visustruct delete mode 100644 web/lessons/diagramme/l14-summe-maximum.visustruct delete mode 100644 web/lessons/diagramme/l15-bis-null-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-endlos-aussprung.visustruct delete mode 100644 web/lessons/diagramme/l15-flaeche-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-hauptprogramm.visustruct delete mode 100644 web/lessons/diagramme/l15-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l15-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l15-java-noten-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-quadrat-haupt.visustruct delete mode 100644 web/lessons/diagramme/l15-quadrat.visustruct delete mode 100644 web/lessons/diagramme/l15-titel-loesung.visustruct delete mode 100644 web/lessons/diagramme/l15-unterprogramm.visustruct delete mode 100644 web/lessons/diagramme/l15-zeige-summe-haupt.visustruct delete mode 100644 web/lessons/diagramme/l15-zeige-summe.visustruct delete mode 100644 web/lessons/diagramme/l16-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/l16-countdown-start.visustruct delete mode 100644 web/lessons/diagramme/l16-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l16-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l16-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l16-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l16-java-punkte-loesung.visustruct delete mode 100644 web/lessons/diagramme/l16-schreibtisch.visustruct delete mode 100644 web/lessons/diagramme/l16-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/l16-summe-start.visustruct delete mode 100644 web/lessons/diagramme/l17-beispiel.visustruct delete mode 100644 web/lessons/diagramme/l17-fakultaet-loesung.visustruct delete mode 100644 web/lessons/diagramme/l17-java-brief-loesung.visustruct delete mode 100644 web/lessons/diagramme/l17-java-brief-start.visustruct delete mode 100644 web/lessons/diagramme/l17-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l17-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l17-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l17-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l17-java-passwort-loesung.visustruct delete mode 100644 web/lessons/diagramme/l17-ticket-loesung.visustruct delete mode 100644 web/lessons/diagramme/l18-beispiel.visustruct delete mode 100644 web/lessons/diagramme/l18-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l18-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l18-java-kasse-loesung.visustruct delete mode 100644 web/lessons/diagramme/l18-js-loesung.visustruct delete mode 100644 web/lessons/diagramme/l18-python-loesung.visustruct delete mode 100644 web/lessons/diagramme/l19-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/l19-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/l19-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/l19-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/l19-java-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/l2-ausgabe.visustruct delete mode 100644 web/lessons/diagramme/l2-hallo-loesung.visustruct delete mode 100644 web/lessons/diagramme/l2-zwei-zeilen-loesung.visustruct delete mode 100644 web/lessons/diagramme/l20-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/l23-java-ergaenzen-loesung.visustruct delete mode 100644 web/lessons/diagramme/l23-java-ergaenzen-start.visustruct delete mode 100644 web/lessons/diagramme/l23-java-nummern-loesung.visustruct delete mode 100644 web/lessons/diagramme/l23-java-nummern-start.visustruct delete mode 100644 web/lessons/diagramme/l24-java-fuchs-loesung.visustruct delete mode 100644 web/lessons/diagramme/l24-java-fuchs-start.visustruct delete mode 100644 web/lessons/diagramme/l24-java-laengster-loesung.visustruct delete mode 100644 web/lessons/diagramme/l24-java-laengster-start.visustruct delete mode 100644 web/lessons/diagramme/l25-java-beste-loesung.visustruct delete mode 100644 web/lessons/diagramme/l25-java-beste-start.visustruct delete mode 100644 web/lessons/diagramme/l25-java-schnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/l25-java-schnitt-start.visustruct delete mode 100644 web/lessons/diagramme/l26-java-namen-loesung.visustruct delete mode 100644 web/lessons/diagramme/l26-java-namen-start.visustruct delete mode 100644 web/lessons/diagramme/l26-java-schreiben-loesung.visustruct delete mode 100644 web/lessons/diagramme/l26-java-schreiben-start.visustruct delete mode 100644 web/lessons/diagramme/l27-java-json-loesung.visustruct delete mode 100644 web/lessons/diagramme/l27-java-json-start.visustruct delete mode 100644 web/lessons/diagramme/l27-java-saetze-loesung.visustruct delete mode 100644 web/lessons/diagramme/l27-java-saetze-start.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-pin-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-schiffe-start.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct delete mode 100644 web/lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/dt-buffered.visustruct delete mode 100644 web/lessons/diagramme/pt/dt-csv.visustruct delete mode 100644 web/lessons/diagramme/pt/dt-json.visustruct delete mode 100644 web/lessons/diagramme/pt/dt-lesen.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-frei-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-frei-start.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-karte-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-karte-start.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-saalplan.visustruct delete mode 100644 web/lessons/diagramme/pt/kino-verkaufen.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-gross-klein-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-gross-klein-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-rechnen.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-reihenfolge-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-tauschen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-tauschen-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l04-tauschen.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-datentypen.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-division.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-einkauf-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-java-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-sekunden-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-sekunden-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l05-sequenz.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-begruessung-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-eva.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-java-tage-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-mittelwert-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l06-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-alter-pruefen.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-betrag-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-pizza-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-java-pizza-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-maximum-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l07-rabatt.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-gueltig-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-jugendticket.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-note.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l08-wochenende-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-ampel.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-automat.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-java-schule-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-rechner-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l09-verschachtelt.visustruct delete mode 100644 web/lessons/diagramme/pt/l1-grundbausteine.visustruct delete mode 100644 web/lessons/diagramme/pt/l1-sequenz.visustruct delete mode 100644 web/lessons/diagramme/pt/l1-tee.visustruct delete mode 100644 web/lessons/diagramme/pt/l1-verzweigung.visustruct delete mode 100644 web/lessons/diagramme/pt/l1-wiederholung.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-bis-n-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-countdown.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-endlos.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-fakultaet.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-eingabe-pruefen.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-einmal.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-java-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-note-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l11-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-einmaleins-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l12-summe.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-dreieck.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-gerade-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l13-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-array-durchlaufen.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-java-treppe-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-namen-eingeben.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-summe-max-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l14-summe-maximum.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-bis-null-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-endlos-aussprung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-flaeche-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-hauptprogramm.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-java-noten-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-quadrat-haupt.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-quadrat.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-titel-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-unterprogramm.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct delete mode 100644 web/lessons/diagramme/pt/l15-zeige-summe.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-countdown-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-java-punkte-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-schreibtisch.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-summe-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l16-summe-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-beispiel.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-fakultaet-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-brief-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-brief-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-java-passwort-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l17-ticket-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-beispiel.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-java-kasse-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-js-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l18-python-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l19-java-fehler-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l19-java-fehler-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l19-java-laeuft-nicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l19-java-laeuft-nicht-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l2-ausgabe.visustruct delete mode 100644 web/lessons/diagramme/pt/l2-hallo-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l23-java-nummern-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l23-java-nummern-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l24-java-fuchs-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l24-java-laengster-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l24-java-laengster-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l25-java-beste-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l25-java-beste-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l25-java-schnitt-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l26-java-namen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l26-java-namen-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l26-java-schreiben-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l27-java-json-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l27-java-json-start.visustruct delete mode 100644 web/lessons/diagramme/pt/l27-java-saetze-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/l27-java-saetze-start.visustruct delete mode 100644 web/lessons/diagramme/pt/sim-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/sim-kino-start.visustruct delete mode 100644 web/lessons/diagramme/pt/sim-tausch-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/sim-tausch-start.visustruct delete mode 100644 web/lessons/diagramme/pt/sim-tausch.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-absteigend-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-absteigend-start.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-binaere-suche.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-bubblesort.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/ss-lineare-suche.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-bonus-start.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-haupt.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-leeren.visustruct delete mode 100644 web/lessons/diagramme/pt/uebergabe-verdopple.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-initialen-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-mehr.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-split.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-woerter-loesung.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/pt/zk-zeichen.visustruct delete mode 100644 web/lessons/diagramme/sim-kino-loesung.visustruct delete mode 100644 web/lessons/diagramme/sim-kino-start.visustruct delete mode 100644 web/lessons/diagramme/sim-tausch-loesung.visustruct delete mode 100644 web/lessons/diagramme/sim-tausch-start.visustruct delete mode 100644 web/lessons/diagramme/sim-tausch.visustruct delete mode 100644 web/lessons/diagramme/ss-absteigend-loesung.visustruct delete mode 100644 web/lessons/diagramme/ss-absteigend-start.visustruct delete mode 100644 web/lessons/diagramme/ss-binaere-suche.visustruct delete mode 100644 web/lessons/diagramme/ss-bubblesort.visustruct delete mode 100644 web/lessons/diagramme/ss-karte-suchen-loesung.visustruct delete mode 100644 web/lessons/diagramme/ss-lineare-suche.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-bonus-loesung.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-bonus-start.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-haupt.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-leeren.visustruct delete mode 100644 web/lessons/diagramme/uebergabe-verdopple.visustruct delete mode 100644 web/lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-abstand-halten-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-alarmanlage-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-ampel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-ampel-zustand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-ausgang-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-begruessung-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-bis-rot-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-bis-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-bis-ziel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-buchstaben-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-do-while-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-drei-lichter-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-dreieck-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-einparken-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-erster-plan-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-farben-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-farbweiche-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-04-sensoren-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-05-bis-zur-wand-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-05-zaehlen-und-summieren-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-06-abstand-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-06-konstanten-final-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-06-nah-mittel-weit-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-07-linie-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-07-und-oder-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-08-farben-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-08-groesster-wert-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-09-fallauswahl-mbot2-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-10-tasten-joystick-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-10-unterbrechen-mit-break-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-11-licht-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-11-merker-boolean-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-12-lautstaerke-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-13-neigung-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-14-leds-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-15-einzelne-leds-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-16-lautsprecher-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-17-arrays-melodie-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-18-bildschirm-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-19-zeichenketten-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-20-motoren-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-21-stoppuhr-akku-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-21-zustaende-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-22-eigene-methoden-start.visustruct delete mode 100644 web/lessons/diagramme/vb-fehler-23-wie-geht-es-weiter-start.visustruct delete mode 100644 web/lessons/diagramme/vb-gas-bis-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-gerade-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-hindernis-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-akku-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-ampel-text-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-blau-gruen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-blinken-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-countdown-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-hoeher-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-joystick-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-klatsch-merker-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-konstante-seite-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-laermampel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-lauflicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-linienfolger-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-rand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-rechteck-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-rechteck-umdrehungen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-richtung-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-schritte-zaehlen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-sicher-fahren-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-spirale-strecke-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-tageszeit-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-taste-stopp-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-textlaenge-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-wand-piep-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-java-wasserwaage-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-klatschen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-knight-rider-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-konstante-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-l00-bausteine-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-l00-sequenz-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-l03-wachsend-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-l06k-mit.visustruct delete mode 100644 web/lessons/diagramme/vb-l06k-ohne.visustruct delete mode 100644 web/lessons/diagramme/vb-l06n-einparkhilfe.visustruct delete mode 100644 web/lessons/diagramme/vb-l21z-ausweichen.visustruct delete mode 100644 web/lessons/diagramme/vb-labyrinth-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-laufschrift-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-linienmuster-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-meister-platz-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-melodie-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-messreihe-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-morsen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-nachtlicht-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-nachtwaechter-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-notbremse-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-oder-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-quadrat-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-quadrat-methode-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-quadrat-schleife-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-rand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-schraeglage-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-schritte-welt-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-slalom-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-spirale-falsch-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-spirale-falsch-start.visustruct delete mode 100644 web/lessons/diagramme/vb-spirale-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-start-a-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-startsignal-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-strecke-anzeigen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-tempo-abstand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-tonleiter-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-treppe-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-tunnel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-ueberladung-umdrehung-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-und-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-variable-seite-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-vier-quadrate-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-wald-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-wand-vorn-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-wurde-es-dunkel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-zentimeter-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-zentimeter-unterprogramm-loesung.visustruct delete mode 100644 web/lessons/diagramme/vb-zwei-sekunden-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-abstand-zeigen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-ampel-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-ausgang-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-bis-wand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-blinken-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-disco-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-dreieck-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-ecke-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-erster-block-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-hin-und-zurueck-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-klotz-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-licht-gruen-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-linie-bis-rot-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-linienfolger-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-notbremse-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-quadrat-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-quadrat-wiederhole-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-rand-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-sirene-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-slalom-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-start-a-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-wald-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-wand-vorn-loesung.visustruct delete mode 100644 web/lessons/diagramme/vbb-weiter-loesung.visustruct delete mode 100644 web/lessons/diagramme/zk-initialen-loesung.visustruct delete mode 100644 web/lessons/diagramme/zk-mehr.visustruct delete mode 100644 web/lessons/diagramme/zk-rueckwaerts-loesung.visustruct delete mode 100644 web/lessons/diagramme/zk-split.visustruct delete mode 100644 web/lessons/diagramme/zk-woerter-loesung.visustruct delete mode 100644 web/lessons/diagramme/zk-zaehlen.visustruct delete mode 100644 web/lessons/diagramme/zk-zeichen.visustruct delete mode 100644 web/lessons/en/01-was-ist-ein-struktogramm.md delete mode 100644 web/lessons/en/01-weitere-darstellungen.md delete mode 100644 web/lessons/en/02-der-editor.md delete mode 100644 web/lessons/en/03-speichern-oeffnen-exportieren.md delete mode 100644 web/lessons/en/04-variablen-und-datentypen.md delete mode 100644 web/lessons/en/05-sequenz.md delete mode 100644 web/lessons/en/06-eingabe-und-ausgabe.md delete mode 100644 web/lessons/en/07-simulation-und-schreibtischtest.md delete mode 100644 web/lessons/en/08-verzweigung.md delete mode 100644 web/lessons/en/09-bedingungen-verknuepfen.md delete mode 100644 web/lessons/en/10-fallauswahl.md delete mode 100644 web/lessons/en/11-while-schleife.md delete mode 100644 web/lessons/en/12-do-while-schleife.md delete mode 100644 web/lessons/en/13-for-schleife.md delete mode 100644 web/lessons/en/14-verschachteln.md delete mode 100644 web/lessons/en/15-arrays.md delete mode 100644 web/lessons/en/16-zweidimensionale-arrays.md delete mode 100644 web/lessons/en/17-zeichenketten.md delete mode 100644 web/lessons/en/18-aufruf-und-aussprung.md delete mode 100644 web/lessons/en/19-suchen-und-sortieren.md delete mode 100644 web/lessons/en/20-java.md delete mode 100644 web/lessons/en/21-python-und-javascript.md delete mode 100644 web/lessons/en/22-try-und-catch.md delete mode 100644 web/lessons/en/23-text-einlesen-und-speichern.md delete mode 100644 web/lessons/en/24-zeile-fuer-zeile.md delete mode 100644 web/lessons/en/25-tabellen-als-csv.md delete mode 100644 web/lessons/en/26-json.md delete mode 100644 web/lessons/en/27-formate-im-vergleich.md delete mode 100644 web/lessons/en/28-erstes-fenster.md delete mode 100644 web/lessons/en/29-knopf-im-fenster.md delete mode 100644 web/lessons/en/30-der-knopf-reagiert.md delete mode 100644 web/lessons/en/31-zahl-verdoppeln.md delete mode 100644 web/lessons/en/32-klickzaehler.md delete mode 100644 web/lessons/en/33-ampel.md delete mode 100644 web/lessons/en/34-notenrechner.md delete mode 100644 web/lessons/en/35-taschenrechner.md delete mode 100644 web/lessons/en/36-zahlenraten.md delete mode 100644 web/lessons/en/37-viele-knoepfe-ein-zuhoerer.md delete mode 100644 web/lessons/en/38-innere-klassen.md delete mode 100644 web/lessons/en/39-zwei-reiter.md delete mode 100644 web/lessons/en/40-model-view-controller.md delete mode 100644 web/lessons/en/aufgaben/alter-unterprogramm.md delete mode 100644 web/lessons/en/aufgaben/ballwurf.md delete mode 100644 web/lessons/en/aufgaben/bestenliste.md delete mode 100644 web/lessons/en/aufgaben/binaerzahl.md delete mode 100644 web/lessons/en/aufgaben/caesar.md delete mode 100644 web/lessons/en/aufgaben/collatz.md delete mode 100644 web/lessons/en/aufgaben/einheitenrechner.md delete mode 100644 web/lessons/en/aufgaben/fibonacci.md delete mode 100644 web/lessons/en/aufgaben/gerade-ungerade.md delete mode 100644 web/lessons/en/aufgaben/mehrwertsteuer.md delete mode 100644 web/lessons/en/aufgaben/notendurchschnitt.md delete mode 100644 web/lessons/en/aufgaben/pin-pruefen.md delete mode 100644 web/lessons/en/aufgaben/schiffe-versenken.md delete mode 100644 web/lessons/en/aufgaben/speisekarte.md delete mode 100644 web/lessons/en/aufgaben/summe-bilden.md delete mode 100644 web/lessons/en/aufgaben/tafeldienst.md delete mode 100644 web/lessons/en/aufgaben/taschenrechner.md delete mode 100644 web/lessons/en/aufgaben/verleih-menue.md delete mode 100644 web/lessons/en/aufgaben/vokabeltrainer.md delete mode 100644 web/lessons/en/aufgaben/volljaehrig.md delete mode 100644 web/lessons/en/aufgaben/wuerfel-mvc.md delete mode 100644 web/lessons/en/aufgaben/zahl-verdoppeln.md delete mode 100644 web/lessons/en/begriffe.md delete mode 100644 web/lessons/en/nachschlagen.md delete mode 100644 web/lessons/en/visubot/00-struktogramm-und-editor.md delete mode 100644 web/lessons/en/visubot/01-der-mbot2.md delete mode 100644 web/lessons/en/visubot/02-das-quadrat.md delete mode 100644 web/lessons/en/visubot/02-quadrat-als-pap.md delete mode 100644 web/lessons/en/visubot/03-variablen-und-ausgabe.md delete mode 100644 web/lessons/en/visubot/03-zeile-fuer-zeile-testen.md delete mode 100644 web/lessons/en/visubot/04-sensoren.md delete mode 100644 web/lessons/en/visubot/05-bis-zur-wand.md delete mode 100644 web/lessons/en/visubot/05-erst-fahren-dann-pruefen.md delete mode 100644 web/lessons/en/visubot/05-zaehlen-und-summieren.md delete mode 100644 web/lessons/en/visubot/06-abstand.md delete mode 100644 web/lessons/en/visubot/06-konstanten-final.md delete mode 100644 web/lessons/en/visubot/06-nah-mittel-weit.md delete mode 100644 web/lessons/en/visubot/07-linie.md delete mode 100644 web/lessons/en/visubot/07-und-oder.md delete mode 100644 web/lessons/en/visubot/08-farben.md delete mode 100644 web/lessons/en/visubot/08-groesster-wert.md delete mode 100644 web/lessons/en/visubot/09-fallauswahl-mbot2.md delete mode 100644 web/lessons/en/visubot/10-tasten-joystick.md delete mode 100644 web/lessons/en/visubot/10-unterbrechen-mit-break.md delete mode 100644 web/lessons/en/visubot/11-licht.md delete mode 100644 web/lessons/en/visubot/11-merker-boolean.md delete mode 100644 web/lessons/en/visubot/12-lautstaerke.md delete mode 100644 web/lessons/en/visubot/13-neigung.md delete mode 100644 web/lessons/en/visubot/14-leds.md delete mode 100644 web/lessons/en/visubot/15-einzelne-leds.md delete mode 100644 web/lessons/en/visubot/16-lautsprecher.md delete mode 100644 web/lessons/en/visubot/17-arrays-melodie.md delete mode 100644 web/lessons/en/visubot/18-bildschirm.md delete mode 100644 web/lessons/en/visubot/19-zeichenketten.md delete mode 100644 web/lessons/en/visubot/20-motoren.md delete mode 100644 web/lessons/en/visubot/21-stoppuhr-akku.md delete mode 100644 web/lessons/en/visubot/21-zustaende.md delete mode 100644 web/lessons/en/visubot/22-eigene-methoden.md delete mode 100644 web/lessons/en/visubot/23-wie-geht-es-weiter.md delete mode 100644 web/lessons/en/visubot/aufgaben/alarmanlage.md delete mode 100644 web/lessons/en/visubot/aufgaben/ausgang.md delete mode 100644 web/lessons/en/visubot/aufgaben/binaer-zaehlen.md delete mode 100644 web/lessons/en/visubot/aufgaben/dreieck.md delete mode 100644 web/lessons/en/visubot/aufgaben/einparken.md delete mode 100644 web/lessons/en/visubot/aufgaben/hindernis.md delete mode 100644 web/lessons/en/visubot/aufgaben/knight-rider.md delete mode 100644 web/lessons/en/visubot/aufgaben/labyrinth.md delete mode 100644 web/lessons/en/visubot/aufgaben/linienfolger-stopp.md delete mode 100644 web/lessons/en/visubot/aufgaben/morsen.md delete mode 100644 web/lessons/en/visubot/aufgaben/nachtwaechter.md delete mode 100644 web/lessons/en/visubot/aufgaben/slalom.md delete mode 100644 web/lessons/en/visubot/aufgaben/spirale.md delete mode 100644 web/lessons/en/visubot/aufgaben/treppe.md delete mode 100644 web/lessons/en/visubot/aufgaben/tunnel.md delete mode 100644 web/lessons/en/visubot/aufgaben/wald.md delete mode 100644 web/lessons/en/visubot/nachschlagen.md delete mode 100644 web/lessons/pt/01-was-ist-ein-struktogramm.md delete mode 100644 web/lessons/pt/01-weitere-darstellungen.md delete mode 100644 web/lessons/pt/02-der-editor.md delete mode 100644 web/lessons/pt/03-speichern-oeffnen-exportieren.md delete mode 100644 web/lessons/pt/04-variablen-und-datentypen.md delete mode 100644 web/lessons/pt/05-sequenz.md delete mode 100644 web/lessons/pt/06-eingabe-und-ausgabe.md delete mode 100644 web/lessons/pt/07-simulation-und-schreibtischtest.md delete mode 100644 web/lessons/pt/08-verzweigung.md delete mode 100644 web/lessons/pt/09-bedingungen-verknuepfen.md delete mode 100644 web/lessons/pt/10-fallauswahl.md delete mode 100644 web/lessons/pt/11-while-schleife.md delete mode 100644 web/lessons/pt/12-do-while-schleife.md delete mode 100644 web/lessons/pt/13-for-schleife.md delete mode 100644 web/lessons/pt/14-verschachteln.md delete mode 100644 web/lessons/pt/15-arrays.md delete mode 100644 web/lessons/pt/16-zweidimensionale-arrays.md delete mode 100644 web/lessons/pt/17-zeichenketten.md delete mode 100644 web/lessons/pt/18-aufruf-und-aussprung.md delete mode 100644 web/lessons/pt/19-suchen-und-sortieren.md delete mode 100644 web/lessons/pt/20-java.md delete mode 100644 web/lessons/pt/21-python-und-javascript.md delete mode 100644 web/lessons/pt/22-try-und-catch.md delete mode 100644 web/lessons/pt/23-text-einlesen-und-speichern.md delete mode 100644 web/lessons/pt/24-zeile-fuer-zeile.md delete mode 100644 web/lessons/pt/25-tabellen-als-csv.md delete mode 100644 web/lessons/pt/26-json.md delete mode 100644 web/lessons/pt/27-formate-im-vergleich.md delete mode 100644 web/lessons/pt/28-erstes-fenster.md delete mode 100644 web/lessons/pt/29-knopf-im-fenster.md delete mode 100644 web/lessons/pt/30-der-knopf-reagiert.md delete mode 100644 web/lessons/pt/31-zahl-verdoppeln.md delete mode 100644 web/lessons/pt/32-klickzaehler.md delete mode 100644 web/lessons/pt/33-ampel.md delete mode 100644 web/lessons/pt/34-notenrechner.md delete mode 100644 web/lessons/pt/35-taschenrechner.md delete mode 100644 web/lessons/pt/36-zahlenraten.md delete mode 100644 web/lessons/pt/37-viele-knoepfe-ein-zuhoerer.md delete mode 100644 web/lessons/pt/38-innere-klassen.md delete mode 100644 web/lessons/pt/39-zwei-reiter.md delete mode 100644 web/lessons/pt/40-model-view-controller.md delete mode 100644 web/lessons/pt/aufgaben/alter-unterprogramm.md delete mode 100644 web/lessons/pt/aufgaben/ballwurf.md delete mode 100644 web/lessons/pt/aufgaben/bestenliste.md delete mode 100644 web/lessons/pt/aufgaben/binaerzahl.md delete mode 100644 web/lessons/pt/aufgaben/caesar.md delete mode 100644 web/lessons/pt/aufgaben/collatz.md delete mode 100644 web/lessons/pt/aufgaben/einheitenrechner.md delete mode 100644 web/lessons/pt/aufgaben/fibonacci.md delete mode 100644 web/lessons/pt/aufgaben/gerade-ungerade.md delete mode 100644 web/lessons/pt/aufgaben/mehrwertsteuer.md delete mode 100644 web/lessons/pt/aufgaben/notendurchschnitt.md delete mode 100644 web/lessons/pt/aufgaben/pin-pruefen.md delete mode 100644 web/lessons/pt/aufgaben/schiffe-versenken.md delete mode 100644 web/lessons/pt/aufgaben/speisekarte.md delete mode 100644 web/lessons/pt/aufgaben/summe-bilden.md delete mode 100644 web/lessons/pt/aufgaben/tafeldienst.md delete mode 100644 web/lessons/pt/aufgaben/taschenrechner.md delete mode 100644 web/lessons/pt/aufgaben/verleih-menue.md delete mode 100644 web/lessons/pt/aufgaben/vokabeltrainer.md delete mode 100644 web/lessons/pt/aufgaben/volljaehrig.md delete mode 100644 web/lessons/pt/aufgaben/wuerfel-mvc.md delete mode 100644 web/lessons/pt/aufgaben/zahl-verdoppeln.md delete mode 100644 web/lessons/pt/begriffe.md delete mode 100644 web/lessons/pt/nachschlagen.md delete mode 100644 web/lessons/welten/ausgang-1.txt delete mode 100644 web/lessons/welten/ausgang-2.txt delete mode 100644 web/lessons/welten/ecke.txt delete mode 100644 web/lessons/welten/farbe-1.txt delete mode 100644 web/lessons/welten/farbe-2.txt delete mode 100644 web/lessons/welten/farbe-3.txt delete mode 100644 web/lessons/welten/farbe-4.txt delete mode 100644 web/lessons/welten/hindernis-1.txt delete mode 100644 web/lessons/welten/hindernis-2.txt delete mode 100644 web/lessons/welten/labyrinth-1.txt delete mode 100644 web/lessons/welten/labyrinth-2.txt delete mode 100644 web/lessons/welten/linie-1.txt delete mode 100644 web/lessons/welten/linie-2.txt delete mode 100644 web/lessons/welten/linie-rot-1.txt delete mode 100644 web/lessons/welten/linie-rot-2.txt delete mode 100644 web/lessons/welten/parken-1.txt delete mode 100644 web/lessons/welten/parken-2.txt delete mode 100644 web/lessons/welten/platz-1.txt delete mode 100644 web/lessons/welten/platz-2.txt delete mode 100644 web/lessons/welten/rand-1.txt delete mode 100644 web/lessons/welten/rand-2.txt delete mode 100644 web/lessons/welten/slalom.txt delete mode 100644 web/lessons/welten/tunnel-1.txt delete mode 100644 web/lessons/welten/tunnel-2.txt delete mode 100644 web/lessons/welten/wald-1.txt delete mode 100644 web/lessons/welten/wald-2.txt delete mode 100644 web/lessons/welten/wand-frei.txt delete mode 100644 web/lessons/welten/wand-kurz.txt delete mode 100644 web/lessons/welten/wand-lang.txt delete mode 100644 web/lessons/welten/wand-mittel.txt delete mode 100644 web/lessons/welten/wand-nah.txt delete mode 100644 web/lessons/welten/zeit-1.txt delete mode 100644 web/lessons/welten/ziel-kurz.txt delete mode 100644 web/lessons/welten/ziel-lang.txt delete mode 100644 web/mbot2-labor/index.html delete mode 100644 web/package-lock.json delete mode 100644 web/package.json delete mode 100644 web/prog.png delete mode 100644 web/settings.png delete mode 100644 web/shots/e2e-1.png delete mode 100644 web/shots/e2e-2.png delete mode 100644 web/shots/e2e-3.png delete mode 100644 web/shots/e2e-4.png delete mode 100644 web/src/core/classModel.ts delete mode 100644 web/src/core/codeGenerator.ts delete mode 100644 web/src/core/diagramText.ts delete mode 100644 web/src/core/editing.ts delete mode 100644 web/src/core/exerciseCheck.ts delete mode 100644 web/src/core/flowModel.ts delete mode 100644 web/src/core/javaFormat.ts delete mode 100644 web/src/core/javaIndent.ts delete mode 100644 web/src/core/javaMembers.ts delete mode 100644 web/src/core/javaParser.ts delete mode 100644 web/src/core/javaProject.ts delete mode 100644 web/src/core/javaStringCoding.ts delete mode 100644 web/src/core/layout.ts delete mode 100644 web/src/core/lineEditorText.ts delete mode 100644 web/src/core/liveSource.ts delete mode 100644 web/src/core/mbot.ts delete mode 100644 web/src/core/mbotLink.ts delete mode 100644 web/src/core/mbotProgram.ts delete mode 100644 web/src/core/memberEdit.ts delete mode 100644 web/src/core/miniJava.ts delete mode 100644 web/src/core/miniJavaParser.ts delete mode 100644 web/src/core/model.ts delete mode 100644 web/src/core/objectModel.ts delete mode 100644 web/src/core/ownTypes.ts delete mode 100644 web/src/core/palette.ts delete mode 100644 web/src/core/rename.ts delete mode 100644 web/src/core/robotPreview.ts delete mode 100644 web/src/core/robotWorld.ts delete mode 100644 web/src/core/sections.ts delete mode 100644 web/src/core/simulation.ts delete mode 100644 web/src/core/textMeasurement.ts delete mode 100644 web/src/core/typeTypos.ts delete mode 100644 web/src/core/umlRelations.ts delete mode 100644 web/src/core/workspace.ts delete mode 100644 web/src/core/xmlCodec.ts delete mode 100644 web/src/i18n/ar.strings delete mode 100644 web/src/i18n/da.strings delete mode 100644 web/src/i18n/de.strings delete mode 100644 web/src/i18n/el.strings delete mode 100644 web/src/i18n/en.strings delete mode 100644 web/src/i18n/es.strings delete mode 100644 web/src/i18n/fr.strings delete mode 100644 web/src/i18n/he.strings delete mode 100644 web/src/i18n/it.strings delete mode 100644 web/src/i18n/ja.strings delete mode 100644 web/src/i18n/ko.strings delete mode 100644 web/src/i18n/nb.strings delete mode 100644 web/src/i18n/nl.strings delete mode 100644 web/src/i18n/pl.strings delete mode 100644 web/src/i18n/pt-PT.strings delete mode 100644 web/src/i18n/ru.strings delete mode 100644 web/src/i18n/sv.strings delete mode 100644 web/src/i18n/tr.strings delete mode 100644 web/src/i18n/uk.strings delete mode 100644 web/src/i18n/zh-Hans.strings delete mode 100644 web/src/i18n/zh-Hant.strings delete mode 100644 web/src/learn/boolGame.ts delete mode 100644 web/src/learn/cloze.ts delete mode 100644 web/src/learn/content.ts delete mode 100644 web/src/learn/driveGame.ts delete mode 100644 web/src/learn/glossary.ts delete mode 100644 web/src/learn/lessonFormat.ts delete mode 100644 web/src/learn/markdown.ts delete mode 100644 web/src/learn/pap.ts delete mode 100644 web/src/learn/progress.ts delete mode 100644 web/src/learn/rescueGame.ts delete mode 100644 web/src/learn/roundGame.ts delete mode 100644 web/src/learn/teacher.ts delete mode 100644 web/src/main.ts delete mode 100644 web/src/ui/app.ts delete mode 100644 web/src/ui/blockPicture.ts delete mode 100644 web/src/ui/blockView.ts delete mode 100644 web/src/ui/caesarDisc.ts delete mode 100644 web/src/ui/clozeView.ts delete mode 100644 web/src/ui/codePanel.ts delete mode 100644 web/src/ui/driveGameView.ts delete mode 100644 web/src/ui/exporter.ts delete mode 100644 web/src/ui/filesPanel.ts delete mode 100644 web/src/ui/flowApp.ts delete mode 100644 web/src/ui/i18n.ts delete mode 100644 web/src/ui/icons.ts delete mode 100644 web/src/ui/inlineEdit.ts delete mode 100644 web/src/ui/javaEditor.ts delete mode 100644 web/src/ui/javaRuntime.ts delete mode 100644 web/src/ui/learnPanel.ts delete mode 100644 web/src/ui/liveCodePanel.ts delete mode 100644 web/src/ui/ludwig.webp delete mode 100644 web/src/ui/mbot2Model.ts delete mode 100644 web/src/ui/mbotUpload.ts delete mode 100644 web/src/ui/objectApp.ts delete mode 100644 web/src/ui/objectDiagram.ts delete mode 100644 web/src/ui/objectLayout.ts delete mode 100644 web/src/ui/objectNew.ts delete mode 100644 web/src/ui/objectWorkspace.ts delete mode 100644 web/src/ui/papView.ts delete mode 100644 web/src/ui/projectZip.ts delete mode 100644 web/src/ui/renameDialog.ts delete mode 100644 web/src/ui/renderer.ts delete mode 100644 web/src/ui/rescueGameView.ts delete mode 100644 web/src/ui/robot3d.ts delete mode 100644 web/src/ui/robotPreview.ts delete mode 100644 web/src/ui/roundGameView.ts delete mode 100644 web/src/ui/sequenceDiagram.ts delete mode 100644 web/src/ui/simulationPanel.ts delete mode 100644 web/src/ui/site.ts delete mode 100644 web/src/ui/styles.css delete mode 100644 web/src/ui/termTips.ts delete mode 100644 web/src/ui/textFileView.ts delete mode 100644 web/src/ui/tooltip.ts delete mode 100644 web/src/ui/visubot.webp delete mode 100644 web/src/ui/visubotModel.ts delete mode 100644 web/src/ui/visubotView.ts delete mode 100644 web/src/ui/workspaceStore.ts delete mode 100644 web/start-visubot.png delete mode 100644 web/start.png delete mode 100644 web/test/blockLessons.test.ts delete mode 100644 web/test/blockView.test.ts delete mode 100644 web/test/boolGame.test.ts delete mode 100644 web/test/classModel.test.ts delete mode 100644 web/test/codeGenerator.test.ts delete mode 100644 web/test/codeKeywords.test.ts delete mode 100644 web/test/countLoop.test.ts delete mode 100644 web/test/driveGame.test.ts delete mode 100644 web/test/editing.test.ts delete mode 100644 web/test/editingParity.test.ts delete mode 100644 web/test/exporter.test.ts delete mode 100644 web/test/flowModel.test.ts delete mode 100644 web/test/glossary.test.ts delete mode 100644 web/test/i18n.test.ts delete mode 100644 web/test/inlineEdit.test.ts delete mode 100644 web/test/javaEditor.test.ts delete mode 100644 web/test/javaFormat.test.ts delete mode 100644 web/test/javaIndent.test.ts delete mode 100644 web/test/javaMembers.test.ts delete mode 100644 web/test/javaParser.test.ts delete mode 100644 web/test/javaProject.test.ts delete mode 100644 web/test/javaRuntime.test.ts delete mode 100644 web/test/layoutColumns.test.ts delete mode 100644 web/test/lessonEnd.ts delete mode 100644 web/test/lessons.test.ts delete mode 100644 web/test/mbot.test.ts delete mode 100644 web/test/mbotLink.test.ts delete mode 100644 web/test/mbotProgram.test.ts delete mode 100644 web/test/mbotUpload.fixture.json delete mode 100644 web/test/memberEdit.test.ts delete mode 100644 web/test/miniJava.test.ts delete mode 100644 web/test/objectModel.test.ts delete mode 100644 web/test/objectNew.test.ts delete mode 100644 web/test/objectWorkspace.test.ts delete mode 100644 web/test/ownTypes.test.ts delete mode 100644 web/test/progressMerge.test.ts delete mode 100644 web/test/pythonExport.test.ts delete mode 100644 web/test/rename.test.ts delete mode 100644 web/test/rescueGame.test.ts delete mode 100644 web/test/robotPreview.test.ts delete mode 100644 web/test/robotWorld.test.ts delete mode 100644 web/test/sections.test.ts delete mode 100644 web/test/simulation.test.ts delete mode 100644 web/test/site.test.ts delete mode 100644 web/test/umlNotes.test.ts delete mode 100644 web/test/umlRelations.test.ts delete mode 100644 web/test/visubotLessons.test.ts delete mode 100644 web/test/visubotSensors.test.ts delete mode 100644 web/test/workspace.test.ts delete mode 100644 web/test/xmlCodec.test.ts delete mode 100644 web/tsconfig.json delete mode 100644 web/vite.config.ts delete mode 100644 website/app/assets/Java-Bpx1Vwvg.js delete mode 100644 website/app/assets/Localizable-1QZ0wfvJ.js delete mode 100644 website/app/assets/Localizable-BAutdlBb.js delete mode 100644 website/app/assets/Localizable-BJ55WGVD.js delete mode 100644 website/app/assets/Localizable-BM86Igqt.js delete mode 100644 website/app/assets/Localizable-BYJK0mdR.js delete mode 100644 website/app/assets/Localizable-BudCXCER.js delete mode 100644 website/app/assets/Localizable-ByPZS4RL.js delete mode 100644 website/app/assets/Localizable-CHv0OL9S.js delete mode 100644 website/app/assets/Localizable-CaVEL1es.js delete mode 100644 website/app/assets/Localizable-CkJEmEEP.js delete mode 100644 website/app/assets/Localizable-CxCno28C.js delete mode 100644 website/app/assets/Localizable-DBLIUcBd.js delete mode 100644 website/app/assets/Localizable-DSvkBkp-.js delete mode 100644 website/app/assets/Localizable-DXAPah1g.js delete mode 100644 website/app/assets/Localizable-Dk8F86qS.js delete mode 100644 website/app/assets/Localizable-DqIDp_hh.js delete mode 100644 website/app/assets/Localizable-LSTVB2Q5.js delete mode 100644 website/app/assets/Localizable-M33nNbEe.js delete mode 100644 website/app/assets/Localizable-R-16GCrk.js delete mode 100644 website/app/assets/Localizable-UGog_aku.js delete mode 100644 website/app/assets/Localizable-rqA-20hM.js delete mode 100644 website/app/assets/ada-lovelace-DS_988PF.jpg delete mode 100644 website/app/assets/ar-AgbDXJ1P.js delete mode 100644 website/app/assets/aufgabe-mehrwertsteuer-C-TFTrWz.svg delete mode 100644 website/app/assets/aufgabe-mehrwertsteuer-CnrZ00ny.svg delete mode 100644 website/app/assets/aufgabe-mehrwertsteuer-KUkerRBd.svg delete mode 100644 website/app/assets/ben-shneiderman-Cev5hrqS.jpg delete mode 100644 website/app/assets/caesar-ascii-Bix93F5i.svg delete mode 100644 website/app/assets/caesar-scheibe-CMRPZI6Y.svg delete mode 100644 website/app/assets/caesar-verschiebung-DIR-lDbs.svg delete mode 100644 website/app/assets/da-DCJmT-QF.js delete mode 100644 website/app/assets/de-Bw3STH-g.js delete mode 100644 website/app/assets/el-MJ37lw3F.js delete mode 100644 website/app/assets/en-gIMn8Pa3.js delete mode 100644 website/app/assets/es-or5dA7qu.js delete mode 100644 website/app/assets/flowApp-BYyoSxMn.js delete mode 100644 website/app/assets/fr-D5Wy8Mcd.js delete mode 100644 website/app/assets/grace-hopper-DltOT1I5.jpg delete mode 100644 website/app/assets/he-CYY5d1yw.js delete mode 100644 website/app/assets/hedy-lamarr-MFZMAlPQ.jpg delete mode 100644 website/app/assets/ike-nassi-D2w47gvX.jpg delete mode 100644 website/app/assets/index-BqSgHxq8.js delete mode 100644 website/app/assets/index-CLK72BwI.css delete mode 100644 website/app/assets/it-B0g-vqj6.js delete mode 100644 website/app/assets/ja-BNDo5HzU.js delete mode 100644 website/app/assets/katherine-johnson-k17EjVTs.jpg delete mode 100644 website/app/assets/kino-saal-BOvcmdzb.svg delete mode 100644 website/app/assets/kino-saal-C8zaJk4X.svg delete mode 100644 website/app/assets/kino-saal-CYMOok4_.svg delete mode 100644 website/app/assets/kino-schleifen-Ci9yPnbo.svg delete mode 100644 website/app/assets/kino-schleifen-D7sfo9iK.svg delete mode 100644 website/app/assets/kino-schleifen-DrTQV7dq.svg delete mode 100644 website/app/assets/ko-D37jf4Vi.js delete mode 100644 website/app/assets/l03-lochkarte-BB3rWQOm.svg delete mode 100644 website/app/assets/l03-lochkarte-BSn6oWaS.svg delete mode 100644 website/app/assets/l03-lochkarte-beschriftet-7hmU_7ct.svg delete mode 100644 website/app/assets/l03-lochkarte-beschriftet-BjBFZjzb.svg delete mode 100644 website/app/assets/l03-lochkarte-beschriftet-D1QjqGFo.svg delete mode 100644 website/app/assets/l03-lochkarte-gzfFEatc.svg delete mode 100644 website/app/assets/l03-zuse-lochstreifen-B87kqGex.svg delete mode 100644 website/app/assets/l12-while-zu-for-CM2--y57.svg delete mode 100644 website/app/assets/l12-while-zu-for-Cu-8sS5S.svg delete mode 100644 website/app/assets/l12-while-zu-for-DddKE_8R.svg delete mode 100644 website/app/assets/l13-verschachtelt-tabelle-CR2WySqU.svg delete mode 100644 website/app/assets/l13-verschachtelt-tabelle-CmsFvxQ5.svg delete mode 100644 website/app/assets/l13-verschachtelt-tabelle-jipYA7Ld.svg delete mode 100644 website/app/assets/ludwig-Cus1i402.webp delete mode 100644 website/app/assets/margaret-hamilton-pYPKs1sU.jpg delete mode 100644 website/app/assets/mvc-klick-BIA_bYzu.svg delete mode 100644 website/app/assets/mvc-klick-DKonBpbs.svg delete mode 100644 website/app/assets/mvc-klick-KmFKqxH-.svg delete mode 100644 website/app/assets/nb-CsT7SL7q.js delete mode 100644 website/app/assets/nl-CPGJmQ49.js delete mode 100644 website/app/assets/objectApp-ClGVaIKp.js delete mode 100644 website/app/assets/pl-DDkdCN00.js delete mode 100644 website/app/assets/projectZip-DtugKwEc.js delete mode 100644 website/app/assets/pt-PT-aHTlqnII.js delete mode 100644 website/app/assets/robot3d-CJE1N58D.js delete mode 100644 website/app/assets/ru-bst4sg1r.js delete mode 100644 website/app/assets/schiffe-versenken-CXt1SF0S.svg delete mode 100644 website/app/assets/schiffe-versenken-iEBDHIxD.svg delete mode 100644 website/app/assets/ss-binaere-suche-CPsLGldq.svg delete mode 100644 website/app/assets/ss-binaere-suche-D02W1TH_.svg delete mode 100644 website/app/assets/ss-binaere-suche-DVVS2SNc.svg delete mode 100644 website/app/assets/ss-bubblesort-AFDcFDah.svg delete mode 100644 website/app/assets/ss-bubblesort-CmKEoNfO.svg delete mode 100644 website/app/assets/ss-bubblesort-Dic2ZfaT.svg delete mode 100644 website/app/assets/ss-vergleiche-DRqzU2TZ.svg delete mode 100644 website/app/assets/ss-vergleiche-DWgkIvLr.svg delete mode 100644 website/app/assets/ss-vergleiche-UczNldcC.svg delete mode 100644 website/app/assets/sv-BZ9E37oq.js delete mode 100644 website/app/assets/tr-C3W_u6Ol.js delete mode 100644 website/app/assets/uk-D0HDyCtp.js delete mode 100644 website/app/assets/visubot-CyGFOI9V.webp delete mode 100644 website/app/assets/zh-Hans-R_GuNvYU.js delete mode 100644 website/app/assets/zh-Hant-DoE9BrE1.js delete mode 100644 website/app/assets/zk-zeichen-8efNmpGx.svg delete mode 100644 website/app/assets/zk-zeichen-CgUEhNoK.svg delete mode 100644 website/app/assets/zk-zeichen-vYvc3iJg.svg delete mode 100644 website/app/index.html delete mode 100644 website/app/licenses.txt delete mode 100755 website/assets/Download-on-the-App-Store/DE/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_DE_RGB_wht_092917.svg delete mode 100755 website/assets/Download-on-the-App-Store/ES/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_ES_RGB_wht_100217.svg delete mode 100755 website/assets/Download-on-the-App-Store/FR/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_FR_RGB_wht_100217.svg delete mode 100755 website/assets/Download-on-the-App-Store/PTPT/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_PTPT_RGB_wht_100317.svg delete mode 100755 website/assets/Download-on-the-App-Store/US/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917.svg delete mode 100644 website/assets/javaApp/visustruct-app-java-deutsch-switchCase.png delete mode 100644 website/assets/javaApp/visustruct-app-java-deutsch.png delete mode 100644 website/assets/javaApp/visustruct-app-java-englisch-java_like.png delete mode 100644 website/assets/javaApp/visustruct-app-java-english.png delete mode 100644 website/assets/javaApp/visustruct-app-java-generateCodeJS.png delete mode 100644 website/assets/javaApp/visustruct-app-java-portugues.png delete mode 100644 website/assets/logo-mark.svg delete mode 100755 website/assets/swiftApp/visustruct-app-swift-deutsch-switchCase.png delete mode 100644 website/assets/swiftApp/visustruct-app-swift-english.png delete mode 100644 website/assets/swiftApp/visustruct-app-swift-german.png delete mode 100644 website/assets/swiftApp/visustruct-app-swift-java_like.png delete mode 100644 website/assets/swiftApp/visustruct-app-swift-portuguese.png delete mode 100644 website/assets/visubot/steps/step-build-de.png delete mode 100644 website/assets/visubot/steps/step-build-en.png delete mode 100644 website/assets/visubot/steps/step-build-pt.png delete mode 100644 website/assets/visubot/steps/step-drive.jpg delete mode 100644 website/assets/visubot/steps/step-test.png delete mode 100644 website/assets/visubot/visubot-app-de.png delete mode 100644 website/assets/visubot/visubot-app-en.png delete mode 100644 website/assets/visubot/visubot-app-pt.png delete mode 100644 website/assets/visubot/visubot-de.png delete mode 100644 website/assets/visubot/visubot-en.png delete mode 100644 website/assets/visubot/visubot-logo.svg delete mode 100644 website/assets/visubot/visubot-mark.webp delete mode 100644 website/assets/visubot/visubot-pt.png delete mode 100644 website/assets/visuobject/inspektor-de.png delete mode 100644 website/assets/visuobject/step-debug.png delete mode 100644 website/assets/visuobject/step-draw.png delete mode 100644 website/assets/visuobject/step-objects.png delete mode 100644 website/assets/visuobject/visuobject-app-de.png delete mode 100644 website/assets/visuobject/visuobject-de.png delete mode 100644 website/assets/visuobject/visuobject-en.png delete mode 100644 website/assets/visuobject/visuobject-mark.svg delete mode 100644 website/assets/visustruct-app-java-deutsch-switchCase.png delete mode 100644 website/assets/visustruct-app-java-deutsch.png delete mode 100644 website/assets/visustruct-app-java-englisch-java_like.png delete mode 100644 website/assets/visustruct-app-java-english.png delete mode 100644 website/assets/visustruct-app-java-generateCodeJS.png delete mode 100644 website/assets/visustruct-app-java-portugues.png delete mode 100644 website/assets/visustruct-app-java.png delete mode 100644 website/assets/visustruct-app-mac-ipad.png delete mode 100755 website/assets/visustruct-app-swift-deutsch-switchCase.png delete mode 100755 website/assets/visustruct-app-swift-english.png delete mode 100755 website/assets/visustruct-app-swift-german.png delete mode 100755 website/assets/visustruct-app-swift-java_like.png delete mode 100755 website/assets/visustruct-app-swift-portuguese.png delete mode 100644 website/assets/visustruct-movies/VisuStruct-Simulator.mp4 delete mode 100644 website/assets/webApp/steps/step-build-de.png delete mode 100644 website/assets/webApp/steps/step-build-en.png delete mode 100644 website/assets/webApp/steps/step-build-es.png delete mode 100644 website/assets/webApp/steps/step-build-fr.png delete mode 100644 website/assets/webApp/steps/step-build-pt.png delete mode 100644 website/assets/webApp/steps/step-code-de.png delete mode 100644 website/assets/webApp/steps/step-code-en.png delete mode 100644 website/assets/webApp/steps/step-code-es.png delete mode 100644 website/assets/webApp/steps/step-code-fr.png delete mode 100644 website/assets/webApp/steps/step-code-pt.png delete mode 100644 website/assets/webApp/steps/step-test-de.png delete mode 100644 website/assets/webApp/steps/step-test-en.png delete mode 100644 website/assets/webApp/steps/step-test-es.png delete mode 100644 website/assets/webApp/steps/step-test-fr.png delete mode 100644 website/assets/webApp/steps/step-test-pt.png delete mode 100644 website/assets/webApp/web-editor-de.png delete mode 100644 website/assets/webApp/web-editor-en.png delete mode 100644 website/assets/webApp/web-learn-de.png delete mode 100644 website/css/styles.css delete mode 100644 website/de/index.html delete mode 100644 website/de/visubot.html delete mode 100644 website/de/visuobject.html delete mode 100644 website/en/index.html delete mode 100644 website/en/visubot.html delete mode 100644 website/en/visuobject.html delete mode 100644 website/es/index.html delete mode 100644 website/fr/index.html delete mode 100644 website/index.html delete mode 100644 website/luisa/index.html delete mode 100644 website/pt/index.html delete mode 100644 website/pt/visubot.html delete mode 100644 website/pt/visuobject.html delete mode 100644 website/visubot/index.html delete mode 100644 website/visubot/messprotokoll-radumdrehung.pdf delete mode 100644 website/visubot/test-record-wheel-rotation.pdf delete mode 100644 website/visuobject/index.html diff --git a/.github/scripts/deploy-website.sh b/.github/scripts/deploy-website.sh deleted file mode 100755 index 9528d8c8..00000000 --- a/.github/scripts/deploy-website.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env bash -# Lädt den Ordner website/ per FTPS (oder SFTP) zu All-Inkl hoch. -# -# Auf dem Server wird nur gelöscht, was ein früherer Lauf dieses Skripts selbst -# hochgeladen hat (Liste in .visustruct-deploy-manifest.txt im Zielordner), und -# veraltete Build-Dateien in app/assets/. -# Fremde Dateien im Zielordner und alles außerhalb davon bleiben unangetastet. -# -# Umgebung: -# DEPLOY_HOST, DEPLOY_USER, LFTP_PASSWORD Pflicht -# DEPLOY_PROTOCOL auto (Standard: erst SFTP, dann FTPS), sftp oder ftps -# DEPLOY_DIR Zielordner relativ zum Login; ohne Angabe visustruct.org -# oder der Startordner, je nachdem, wo die Webseite liegt -# SOURCE_DIR Standard website -# DRY_RUN=1 nur anzeigen, nichts hochladen oder löschen -set -euo pipefail - -# Beim Einfügen ins Secret-Feld rutscht leicht ein Zeilenumbruch mit hinein -DEPLOY_USER="$(printf '%s' "${DEPLOY_USER:-}" | tr -d '\r\n' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')" -LFTP_PASSWORD="$(printf '%s' "${LFTP_PASSWORD:-}" | tr -d '\r\n')" -: "${DEPLOY_HOST:?DEPLOY_HOST fehlt}" -: "${DEPLOY_USER:?DEPLOY_USER fehlt}" -: "${LFTP_PASSWORD:?LFTP_PASSWORD fehlt}" -export LFTP_PASSWORD - -PROTOCOL="${DEPLOY_PROTOCOL:-auto}" -REMOTE_DIR="${DEPLOY_DIR:-}" -SOURCE_DIR="${SOURCE_DIR:-website}" -DRY_RUN="${DRY_RUN:-0}" -MANIFEST=".visustruct-deploy-manifest.txt" - -case "$REMOTE_DIR" in - "/"|"~"|*..*|*'"'*) echo "Ungültiger Zielordner: '$REMOTE_DIR'" >&2; exit 1 ;; -esac -[ -f "$SOURCE_DIR/index.html" ] || { echo "$SOURCE_DIR/index.html fehlt" >&2; exit 1; } - -work="$(mktemp -d)" -trap 'rm -rf "$work"' EXIT - -connect_for() { - local url settings - case "$1" in - sftp) url="sftp://$DEPLOY_HOST" - settings="set sftp:auto-confirm yes" ;; - ftps) url="ftp://$DEPLOY_HOST" - settings="set ftp:ssl-force true; set ftp:ssl-protect-data true; set ssl:verify-certificate ${DEPLOY_VERIFY_CERT:-yes}" ;; - *) echo "DEPLOY_PROTOCOL muss auto, sftp oder ftps sein" >&2; exit 1 ;; - esac - # use-temp-file: erst unter einem Hilfsnamen hochladen, dann umbenennen. So sieht niemand halb hochgeladene Seiten. - printf '%s' "$settings; set net:max-retries 3; set net:timeout 30; set cmd:fail-exit yes; set xfer:use-temp-file yes -open --env-password -u \"$DEPLOY_USER\" $url" -} - -# auto: SFTP versuchen, bei All-Inkl geht das nur mit SSH-Zugang; sonst FTPS -if [ "$PROTOCOL" = "auto" ]; then - for p in sftp ftps; do - if lftp -c "$(connect_for $p); cls -1 >/dev/null" 2> "$work/probe-$p"; then - PROTOCOL=$p; break - fi - echo "$p: $(grep -v '^$' "$work/probe-$p" | tail -n 1)" >&2 - done - if [ "$PROTOCOL" = "auto" ]; then - echo "::error::Anmeldung fehlgeschlagen. SFTP: $(grep -v '^$' "$work/probe-sftp" | tail -n 1) FTPS: $(grep -v '^$' "$work/probe-ftps" | tail -n 1)" - exit 1 - fi -fi -echo "Verbindung über $PROTOCOL" - -# Zielordner: ohne DEPLOY_DIR erst visustruct.org, dann der Startordner des -# Logins (FTP-Benutzer, die direkt in visustruct.org landen). Hochgeladen wird -# nur in einen Ordner, in dem schon VisuStruct liegt (index.html nennt -# VisuStruct oder ein früherer Lauf hat seine Dateiliste hinterlassen). -looks_like_site() { - lftp -c "$(connect_for "$PROTOCOL"); set cmd:fail-exit no; cd \"$1\" || exit 1; cat index.html" 2>/dev/null | grep -q VisuStruct \ - || lftp -c "$(connect_for "$PROTOCOL"); cd \"$1\"; cls -1 $MANIFEST" >/dev/null 2>&1 -} -if [ -z "$REMOTE_DIR" ]; then - for d in visustruct.org .; do - if looks_like_site "$d"; then REMOTE_DIR="$d"; break; fi - done - if [ -z "$REMOTE_DIR" ]; then - echo "::error::Kein Zielordner gefunden: weder visustruct.org noch der Startordner des Logins enthalten die VisuStruct-Webseite. Bitte die Variable DEPLOY_DIR setzen." - exit 1 - fi -elif ! looks_like_site "$REMOTE_DIR"; then - echo "::error::Im Zielordner '$REMOTE_DIR' liegt keine VisuStruct-Webseite (index.html), es wird nichts hochgeladen." - exit 1 -fi -echo "Zielordner: $REMOTE_DIR" -connect="$(connect_for "$PROTOCOL") -cd \"$REMOTE_DIR\"" - -# Fehlermeldungen von lftp zusätzlich als Annotation ausgeben (in der Übersicht -# des Laufs sichtbar, ohne das Log zu öffnen) -fail() { - local msg - msg="$(grep -v '^$' "$work/err" | tail -n 3 | tr '\n' ' ')" - echo "::error::Upload fehlgeschlagen: ${msg:-unbekannter Fehler}" - exit 1 -} - -# Neue Dateiliste -(cd "$SOURCE_DIR" && find . -type f ! -name .DS_Store ! -name "$MANIFEST" | sed 's|^\./||' | LC_ALL=C sort) > "$work/new" - -# Alte Dateiliste vom Server (fehlt beim ersten Lauf) -if ! lftp -c "$connect; get $MANIFEST -o \"$work/old\"" 2>/dev/null; then - echo "Keine frühere Dateiliste auf dem Server gefunden, es wird nichts gelöscht." - : > "$work/old" -fi - -# Die Assets des vorigen Builds bleiben eine Version lang liegen: Ein Browser, der noch -# die alte Seite offen oder im Cache hat, findet so seine Skripte (sonst bleibt sie leer). -grep '^app/assets/' "$work/old" | LC_ALL=C sort -u > "$work/keep" || true - -# app/assets/ wird von Vite bei jedem Build komplett neu erzeugt (Dateinamen mit -# Hash). Was dort auf dem Server liegt und nicht mehr zum Build gehört, ist veraltet, -# auch wenn es noch von Hand hochgeladen wurde. -lftp -c "$connect; cls -1 app/assets/" 2>/dev/null | sed 's|^.*/||; s|^|app/assets/|' | grep -v '/$' >> "$work/old" || true - -# Dateien, die früher hochgeladen wurden und jetzt nicht mehr dazugehören -LC_ALL=C sort -u "$work/old" | LC_ALL=C comm -23 - "$work/new" | LC_ALL=C comm -23 - "$work/keep" > "$work/stale" -: > "$work/rm.lftp" -while IFS= read -r f; do - case "$f" in - ""|/*|*..*|*'"'*|*'\'*) echo "Überspringe verdächtigen Eintrag: '$f'" >&2; continue ;; - esac - echo "rm -f \"$f\"" >> "$work/rm.lftp" -done < "$work/stale" - -echo "Dateien: $(wc -l < "$work/new") hochladen, $(wc -l < "$work/rm.lftp") veraltete löschen (Ziel: $REMOTE_DIR)" -sed 's/^rm -f / löschen: /' "$work/rm.lftp" - -# .htaccess: Ein vorhandenes (z. B. mit HTTPS-Weiterleitung) bleibt erhalten, -# nur unser Block zwischen den BEGIN/END-Zeilen wird ersetzt bzw. angehängt. -cache_conf="$(dirname "$0")/htaccess-cache.conf" -if ! lftp -c "$connect; get .htaccess -o \"$work/htaccess.old\"" 2>/dev/null; then - : > "$work/htaccess.old" -fi -sed '/^# BEGIN VisuStruct-Cache/,/^# END VisuStruct-Cache/d' "$work/htaccess.old" > "$work/htaccess" -[ -s "$work/htaccess" ] && [ -n "$(tail -c 1 "$work/htaccess")" ] && echo >> "$work/htaccess" -echo ".htaccess: $(grep -vc '^#\|^$' "$work/htaccess" || true) vorhandene Zeilen bleiben erhalten, der Cache-Block wird gesetzt." -cat "$cache_conf" >> "$work/htaccess" - -if [ "$DRY_RUN" = "1" ]; then - lftp -c "$connect; mirror -R --dry-run --no-perms --exclude-glob .DS_Store \"$SOURCE_DIR\" ." 2> >(tee "$work/err" >&2) || fail - echo "Trockenlauf: nichts geändert." - exit 0 -fi - -# Erst alles außer HTML (Skripte, Bilder, CSS), dann die Seiten selbst, -# damit keine Seite live ist, deren Assets noch fehlen. -lftp 2> >(tee "$work/err" >&2) < - - Header set Cache-Control "no-cache" - - - Header set Cache-Control "public, max-age=31536000, immutable" - - -# END VisuStruct-Cache diff --git a/.github/workflows/core-tests.yml b/.github/workflows/core-tests.yml index 18f50a5b..db26bad1 100644 --- a/.github/workflows/core-tests.yml +++ b/.github/workflows/core-tests.yml @@ -32,25 +32,3 @@ jobs: -destination 'generic/platform=iOS Simulator' \ CODE_SIGNING_ALLOWED=NO - web-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: web - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: npm - cache-dependency-path: web/package-lock.json - - run: npm ci - - name: Test (Dateiformat gegen VisuStruct-Dateien) - run: npm test - - name: Build - run: npm run build - - name: website/app ist aktuell - run: | - npm run build:site - git diff --exit-code -- ../website/app || (echo "website/app ist veraltet: in web/ 'npm run build:site' ausführen und committen." && exit 1) - test -z "$(git status --porcelain -- ../website/app)" diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml deleted file mode 100644 index 8d498652..00000000 --- a/.github/workflows/deploy-website.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Webseite veröffentlichen - -# Lädt website/ nach All-Inkl (visustruct.org) hoch. -# Start: Tag web-v… anlegen (z. B. web-v1.0, auch über „Draft a new release“) -# oder von Hand unter Actions → „Webseite veröffentlichen“ → „Run workflow“. -# Ändert ein PR den Upload selbst, läuft nur ein Trockenlauf gegen den Server. -on: - pull_request: - paths: - - '.github/workflows/deploy-website.yml' - - '.github/scripts/deploy-website.sh' - push: - tags: ['web-v*'] - workflow_dispatch: - inputs: - dry_run: - description: 'Trockenlauf: nur anzeigen, was hochgeladen und gelöscht würde' - type: boolean - default: false - -permissions: - contents: read - -concurrency: - group: deploy-website - cancel-in-progress: false - -jobs: - check: - runs-on: ubuntu-latest - defaults: - run: - working-directory: web - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: npm - cache-dependency-path: web/package-lock.json - - run: npm ci - - name: Test - run: npm test - - name: website/app ist aktuell - run: | - npm run build:site - git diff --exit-code -- ../website/app || (echo "website/app ist veraltet: in web/ 'npm run build:site' ausführen und committen." && exit 1) - test -z "$(git status --porcelain -- ../website/app)" - - deploy: - needs: check - # PRs aus Forks bekommen keine Secrets - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Zugangsdaten vorhanden? - env: - SFTP_USER: ${{ secrets.SFTP_USER }} - SFTP_PASSWORD: ${{ secrets.SFTP_PASSWORD }} - run: | - if [ -z "$SFTP_USER" ] || [ -z "$SFTP_PASSWORD" ]; then - echo "::error::Die Secrets SFTP_USER und SFTP_PASSWORD fehlen (Settings → Secrets and variables → Actions)." - exit 1 - fi - - name: lftp installieren - run: sudo apt-get update -q && sudo apt-get install -y -q lftp - - name: Hochladen - env: - DEPLOY_HOST: ${{ vars.DEPLOY_HOST || 'w0103087.kasserver.com' }} - DEPLOY_PROTOCOL: ${{ vars.DEPLOY_PROTOCOL || 'ftps' }} - DEPLOY_DIR: ${{ vars.DEPLOY_DIR }} - DEPLOY_USER: ${{ secrets.SFTP_USER }} - LFTP_PASSWORD: ${{ secrets.SFTP_PASSWORD }} - DRY_RUN: ${{ (inputs.dry_run || github.event_name == 'pull_request') && '1' || '0' }} - run: .github/scripts/deploy-website.sh diff --git a/README.md b/README.md index adc7c5af..ea5bd3e8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@

- VisuStruct + VisuStruct

# VisuStruct (SwiftUI) -Visual **Nassi–Shneiderman** structograms for **Mac, iPad, and iPhone**, and as a web app in the browser (`web/`, with VisuBot for the mBot2 robot, including a Scratch-like block view). Same **`.visustruct`** / XML as the open-source **[Java editor](https://github.com/code4teaching/VisuStruct)** — drag-and-drop. +Visual **Nassi–Shneiderman** structograms for **Mac, iPad, and iPhone**. Same **`.visustruct`** / XML as the open-source **[Java editor](https://github.com/code4teaching/VisuStruct)** — drag-and-drop. **Localization:** The app ships a large set of UI translations (strings + Settings), with English and German treated as primary “source of truth” strings during development. @@ -28,9 +28,7 @@ git clone https://github.com/code4teaching/VisuStruct-SwiftUI.git ## Web app and website -The web app in `web/` (VisuStruct, VisuBot, VisuObject, VisuFlow) is built with `npm run build:site` into `website/app/`. Since 2026-11-03 it is published on **[visucode.de](https://visucode.de)**, one subdomain per world: [visustruct.visucode.de](https://visustruct.visucode.de), [visubot.visucode.de](https://visubot.visucode.de), [visuobject.visucode.de](https://visuobject.visucode.de). The website itself lives in a separate GitLab repository (`visucode/website`); its script `app-aktualisieren.sh` copies the built app from here, and a push to its `main` branch deploys it. - -The workflow **Webseite veröffentlichen** (`.github/workflows/deploy-website.yml`) for the old site visustruct.org is no longer used for new releases. +This repository contains only the SwiftUI app (iPad, iPhone, Mac). The web app (VisuStruct, VisuBot, VisuObject, VisuFlow), its lessons and the websites moved on 2026-11-05 to GitLab (`gitlab.lgsit.de/visucode/visustruct-web` and `visucode/website`) and are published on **[visucode.de](https://visucode.de)**. ## Changelog / release notes diff --git a/VisuStruct-iOS/README.md b/VisuStruct-iOS/README.md index 5d925de9..6710e3bc 100644 --- a/VisuStruct-iOS/README.md +++ b/VisuStruct-iOS/README.md @@ -1,6 +1,6 @@

- VisuStruct + VisuStruct

diff --git a/website/assets/VisuStruct-icon.png b/assets/VisuStruct-icon.png similarity index 100% rename from website/assets/VisuStruct-icon.png rename to assets/VisuStruct-icon.png diff --git a/web/.gitignore b/web/.gitignore deleted file mode 100644 index 8806551e..00000000 --- a/web/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -dist/ -dist-single/ diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 162730b2..00000000 --- a/web/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# VisuStruct Web - -VisuStruct im Browser: `.visustruct`-Dateien öffnen, als Struktogramm zeichnen, -Elemente per Drag & Drop einfügen oder verschieben, Texte im Objektinspektor oder per Doppelklick/Doppeltipp direkt im -Struktogramm bearbeiten (`src/ui/inlineEdit.ts`), Schritt für Schritt simulieren, -Java-, Python- oder JavaScript-Code erzeugen (JavaScript direkt im Browser ausführen) und wieder speichern. -Läuft komplett im Browser, ohne Server. - -## Ausprobieren - -```bash -cd web -npm install -npm run dev # http://localhost:5173 -npm test # Dateiformat-, Bearbeitungs-, Simulations- und Codegenerator-Tests -npm run build # statische Dateien in web/dist/ (relative Pfade, z. B. für website/app/) -npm run build:single # eine einzelne, eigenständige index.html in web/dist-single/ -npm run build:site # baut die App nach website/app/ (wird mit der Webseite veröffentlicht) -``` - -## Aufbau - -Der Kern ist eine Datei-für-Datei-Übertragung von `VisuStruct-iOS/VisuStructCore` nach TypeScript, -damit Änderungen in Swift leicht nachgezogen werden können: - -| TypeScript | Swift-Vorlage | -| --- | --- | -| `src/core/model.ts` | `VisuStructElement.swift`, `VisuStructDocument.swift` | -| `src/core/javaStringCoding.ts` | `VisuStructJavaStringCoding.swift` | -| `src/core/xmlCodec.ts` | `VisuStructXMLCodec.swift` | -| `src/core/layout.ts` | `VisuStructLayout.swift`, `Layout/VisuStructLayoutEngineMetrics.swift` | -| `src/core/diagramText.ts` | `Layout/VisuStructDiagramText.swift`, `VisuStructLayoutTextMeasurement.swift` | -| `src/core/editing.ts` | `VisuStructDocumentEditing.swift` | -| `src/core/lineEditorText.ts` | `Editing/VisuStructLineEditorText.swift`, `Inspector/StatementIOMode.swift` | -| `src/core/palette.ts` | `Palette/ElementPalette.swift` | -| `src/core/simulation.ts` | `VisuStructSimulationEngine.swift` | -| `src/core/codeGenerator.ts` | `VisuStructCodeGenerator.swift`, `CodeGeneration/*.swift` | -| `src/ui/renderer.ts` | `Canvas/DiagramCanvasRenderer.swift` (als SVG) | -| `src/ui/exporter.ts` | `Export/DiagramSnapshotAndExport.swift`, `Export/DiagramExporter.swift` | -| `src/ui/i18n.ts` | `AppLanguage.swift` mit `*.lproj/Localizable.strings` und `Java.strings` | -| `src/ui/codePanel.ts` | `CodeGeneration/CodeGeneratorPanels.swift`, `Runner/JavaScriptRunner.swift` | -| `src/ui/simulationPanel.ts` | `Simulation/SimulationController.swift`, `Simulation/SimulationPanels.swift` | - -`test/editingParity.test.ts` überträgt `MultiwayPathTests.swift` und `LineEditorTextTests.swift`, -`test/simulation.test.ts` überträgt `SimulationEngineTests.swift` und `SimulationConditionTests.swift`, -`test/codeGenerator.test.ts` überträgt `CodeGeneratorTests.swift` (die erzeugten `.java`-Dateien für Collatz und -Fibonacci müssen byte-gleich zu denen in `VisuStruct-Dateien` sein). - -JavaScript läuft beim Testen in einem Web Worker: `prompt()` wird zu einem Eingabefeld, `while (true)` bricht wie in der -App nach 100 000 Durchläufen ab, und „Stopp“ beendet jeden Lauf. - -`test/xmlCodec.test.ts` lädt jede Datei aus `VisuStruct-Dateien`, speichert sie wieder und verlangt -**byte-gleiche** Ausgabe zum Swift-Encoder (nur CRLF aus Windows wird zu LF, wie in Swift). - -Mehrere Diagramme sind als Reiter offen (wie `Tabs/` in der App); jeder Reiter hat eigenes Rückgängig. -Kopieren/Ausschneiden/Einfügen, Textgröße und das Feld für Fallnamen folgen der Mac-App. - -„Exportieren…“ speichert das Diagramm mit Titel als PNG, SVG oder einseitiges A4-PDF (Hoch- oder Querformat wie in -der App, ohne zusätzliche Bibliothek) oder druckt es (Strg+P). `test/exporter.test.ts` prüft Dateinamen, Seitenformat -und den Aufbau der PDF-Datei. - -Die Oberfläche spricht dieselben 21 Sprachen wie die App (plus „Java (Keywords)“). Die Texte kommen direkt aus den -`Localizable.strings` der App; nur Texte, die es nur im Web gibt, stehen in `src/i18n/.strings`. Fehlt ein Text, -gilt wie in der App der englische. Beim ersten Start wird die Browsersprache gewählt; Arabisch und Hebräisch laufen von -rechts nach links, das Struktogramm und der Code bleiben links nach rechts. `test/i18n.test.ts` prüft, dass jeder im Code -benutzte Schlüssel einen englischen Text hat und jede Sprache alle Web-Texte mit denselben Platzhaltern enthält. - -## Lernbereich - -Neben dem Editor liegt ein Lernbereich mit **Lektionen**, **Aufgaben** und **Nachschlagen** (Vorbild: PicoJavaGoat). -Die Inhalte sind Markdown-Dateien in `lessons/` und werden beim Bauen eingebunden; das Format steht in -[`lessons/README.md`](lessons/README.md). Übungen werden automatisch geprüft: `src/core/exerciseCheck.ts` simuliert das -Diagramm mit den Eingaben der Übung und vergleicht die Ausgabe. Der Fortschritt liegt nur im `localStorage` des Browsers. -`test/lessons.test.ts` prüft alle Lektionen: Format, vorhandene Diagramme und dass jede Musterlösung ihre Tests besteht. -`…/app/?learn` öffnet die App mit eingeblendetem Lernbereich (Link „Zu den Lektionen“ der Webseite). - -## Veröffentlichen - -Die App liegt fertig gebaut in `website/app/`. Veröffentlicht wird sie über das GitLab-Repo `visucode/website` -(Skript `app-aktualisieren.sh`, Push auf `main` = live): unter `visustruct.visucode.de/app/`, `visubot.visucode.de/app/` -und `visuobject.visucode.de/app/`. Auf diesen Adressen öffnet die App immer die Welt der Seite. -Nach Änderungen in `web/` oder an den `Localizable.strings` der App `npm run build:site` ausführen und `website/app/` -mitcommitten; der CI-Schritt „website/app ist aktuell“ schlägt sonst fehl. Es gibt keinen Server: Dateien werden nur im -Browser geöffnet und gespeichert. - -Drag & Drop nutzt Zeiger-Ereignisse statt HTML5-Drag-and-Drop, damit Maus, Stift und Finger gleich funktionieren. - -## Noch nicht enthalten - -Verschieben vorhandener Elemente mit dem Finger im Struktogramm. - -## VisuBot (Welt `?visubot`) - -Den Lernroboter mBot2 programmieren: mBot2-Befehle und Sensoren in „Elemente“, 3D-Simulator (`src/ui/robot3d.ts`), -echter mBot2 per USB in Chrome oder Edge (`src/ui/mbotUpload.ts`), eigene Lektionen in `lessons//visubot/`. -Der Knopf **Blöcke** in den Werkzeugen zeigt dasselbe Struktogramm als Blöcke wie in Scratch (`src/ui/blockView.ts`, -Test `blockView.test.ts`): Blöcke ziehen, verschieben, in den Papierkorb werfen, Werte direkt in den weißen Feldern -ändern, Sensoren auf Felder oder Bedingungen ziehen. Die Regeln für kinderfreundliche Blöcke (z. B. die Zählschleife -„zähle mit i von [0] bis unter [10] in Schritten von [1]“) kommen aus der gemeinsamen Bibliothek -[VisuBlocks](https://github.com/code4teaching/visublocks) (MIT), eingebunden als Paket `visublocks` mit fester Commit-Nummer. - -## VisuObject (Welt `?visuobject`) - -Dritte Welt neben VisuStruct und VisuBot, für Objektorientierung ab Klasse 12 (Plan: `docs/visuobject/PLAN.md`). -`src/ui/objectApp.ts` zeigt links den Java-Code (CodeMirror wie in „Code“) und rechts das Klassendiagramm. -`src/core/classModel.ts` liest Klassen, Attribute, Methoden-Köpfe, `extends` und `implements` aus dem Code und schreibt -Änderungen im Diagramm an genau diese Stelle zurück (Rümpfe, Startwerte und Kommentare bleiben). Tests: `test/classModel.test.ts`. -Ein Projekt hat mehrere Dateien in Packages (`src/core/javaProject.ts`, eine Datei pro Klasse, die Zeile `package …;` folgt -dem Ordner). Links zeigt der Package Explorer Projekt › src › Packages › Dateien › Klassen › Attribute/Methoden; jede Ebene -und die ganze Spalte lassen sich einklappen. Das Klassendiagramm zeigt alle Klassen, jedes Package als UML-Rahmen. -Öffnen und Speichern als ZIP wie aus Eclipse oder BlueJ (`Name/src/package/Klasse.java`, `src/ui/projectZip.ts`, fflate). -Tests: `test/javaProject.test.ts`. diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 38a4ff63..00000000 --- a/web/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - VisuStruct Web - - - - -
- - - diff --git a/web/laptop2.png b/web/laptop2.png deleted file mode 100644 index 0a46c5862cf664ce2cfd013ed7ce487f2d7c22dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125328 zcmbrmWmJ`2*T+kDcZWzfNO!6Tf*{=>-O@;>G}4VAph$OjH;8n1xAca6md|tF@B5B% zKAmws$Z%}--q&@lHP?*a{7=GF-oC^{BSV9Mfx&$JN>&vH22leB1|9|l4!k0%SDXX` zg9GzgR_eV+=Fu|ZdjdORn6)?V-(N7nv3w3#US6I9|CX1-BbGx-KS!gWp((H~FGI5^ zp{^1p^C5`g51C?_^Ydx$=0VGiH|&F%nG`g^IMOJz;KwUDMy!ATk5Yudgedu+m%)$s zXo+zD^EMVl1=xQ+fkK-ER{-#BS%rO7`UKHAV)i?y{Csq*=5m8Yd zAt6FDbMt_+=k)YjTOZ8Kwq0Ca^z%pO+H46oWpG>dwqM}9;6Mz5t^CvFO5k82;+L|TgM0Gyq&42Hv=)EkSS49NA zzY3Z^gpiVwoI1zI!~`X8^OQQjq$Izr49)DK0Tng8uMbJ3sh|G8cm1A)9`~Xm7*q1c zB+nguf-3!aZVz1L+}xZXQ)EA(6NGcX3H9$nfyY)r4H0EChQ|R*A@Anq=IHop(1$4~ z(AUCZH?d%I$1#R=iS6#Iz(Pgg_PZS2%5=UA_#+2#j*RL=% zW(L+Qz8q$`Jp+S-h57l?1ri+pz14hG=KYBvdJh=sQWz9EUfyEC1XThw^l|r<;UPD@ ze|Em$neE>C#>THaIo1{-!AwGL&Q5q7+P89Z_mGVmN*c3?#ro5;&4DaA9ubkn@o~S0 z>rx&b`jwJ`#NNI>{bo0IK|#Ui&uesQe=c3Ue*L<^9CGVaS63VGkDbV}@bS5hq&n4F zPxn;VOcjm>A!EnK#ld`G>5NeMf`Wn)6&3YEvz#i zz0DGy&wq{okIlwybpGsbbl!cqy&Xy8EmlZkA&Iq}uOdCvCVye+a&sc)=LhW$i~U_@ zSM7SJp|4NLROgor*Wh-1-y50Y2wVK+-1FnC=}5cd`ZGNeac|4RnbKyrVYiou&I_a(lb66x?lB!iD7Lr3)kh%FqZ0&k`b^-LOxV-a7- zp0F<@xH}9xTofILfZ%ueDvXbh*!3nZ5fT4~feE|Cy1j#gkM&=Yl4>g}aqUcwo*t3c z*Vj2X#$u_&7TSEihxJ>W$S}Um?BGj{BjYxCZU+0$8SJh1IRCY__SJkeon5N~q3h~! zR)CwkGvwVjd8KSoIX%4=hgES-L*a6*%8Q9ycoo~;=z#f|CpnVK@u8ui`FYaR&xhjT z0w-RKjErt#NT0M2iwg>pl9L%2HA~jk@ASh$b@ZXDD(A#F5#PsyyMyVB^UaqsuN7W>uCJ&VAh#_yY_}hbFR*>Z zw!j9nW5f0G@@QU-UoGLw7jFBd;Qc9!odrd0?Yp6*H_6G#G|z4o2?+@?G0`*YF9*KJ z+;?vUhcXs$qdd`HL&6U$%a5FG0%*-VFSY90@fx80-u8Rq; z8a_wd2ksq{1{%z!AOGzx2g=y5UwL3{4cmQv&emuh(AFmD7*xu2>&vpUskl%Bo4L6w zdu`7g_a=;^{yMFl(G1;oUoi=Z_UYo;rshw;=n#u*o!~WRm9=)4np|0#V2g^1Y*p#F zxx>fJg@uKEeV-)!?sc@eC)sAokddKaS*&bqx*H!}D=G1j`tcDvlU(y6tE{jb9aM#0|9BIPYSU2b;R=s_i++x1FR zLcYDf&lYjF-|WMrL6cL4JqvwoPzh#}thd+aMqJz2z#}Iw{yEfB&&|yZHmfg$LtnUh zF^XdFy}fdlaHG{!VZ++-vGef)A2l_#tLqgJyUv>V#>PlKQn6ulah{Pj%K}O#ydz_x^2-QXQoXenR4k9SwQ;>x*sHv@~sxz1Inava-RO_s+Xx z5gSH|6;WjeJ;#K~;hq8=4ur)i>}t|@rYNieg;ed5KYD=N-R z`(qyN?uLe0f0ych2S-9HEvoXo&TerYGnrl2-rfKl!P2`nGLm&0D=QOqi9#4I8~^k6 z0y9_dwp6%*fdLE*4C~)NV0Y;wTt9jR`?0f)=+;>Fl_uX@KRMl;_}JN%0uS_~xL9hC z_r(j##X37x)n^v-XS3yoAfz>(3=a%!mAbaO?Blg5sKAl&+xma}Sk-9b;_52mc7&42 z)=_Et@?fSE3eNri#M%f3At7xkDOw&Lo@dYCh`F8_G`lS)Fe)xvXYiM%u{*mw9r3G_}b;U~xE(j7^1*IrDJ2Gm88c zBbM)OcU)wqRQIMURiHJyY?q(v!;&D0+e+H|ExSd9#8l8-R175>!a{;vc6pp z__tO5%Xp7luauShEr~Sc<>Zzdorzg}=V{_@6mi;Q8bU=nzlDYMPvmxg`}S?VS+m?g z3>+)qj`H&IxD`HV`riLxrl(IEM-QBjpqB7E4!y z{hI{EJ?ngB0Xz-KA^2_lF|^%jb0?CRv(|o@EX4_SbJX>42AHGk?V0h^_wl&I#H9-3 z$FEZGxg-(5EOd7bgF|7wyu94p6vYl6AKu!c`5%|9ehr{pM5jqfU{qdT1;=VUO9a`l zP%bk0b7bV>)8pdENE9@nFNSh+>kk(Phy4>IWH`C>2k+E4qx z=t%~_i+J^oJ`Wnl3;f<_og`0JhxJ;!(8p%?T5EN7_F}^ZM^aufadC-rQFV27`_;DZ zd3jYvofN>8k@1yWpNMgJa7`(S(b1WLEo+eS_71DH5oq&y$o0I8r!2CEKEbEL2|5}{ zByuTYv+L9}OpJmRS}xX9R#H;>H~wC%b%jJ?lJo1e`?9-_G-#G*B4g~0*HPqfnez{$r@1l$F_N#S@5B9N5I^~J4%S#EOeCg>PW;pCo3ii`8OJ`&<;g=yMquB_rw zO9LqgB{>#G9ij+|TGpq-nP`v&Y_wTfS(OXMPzbpl&Ecx4O$A&WjA>u4z5epWIjARa4BHJ?2L>$EVf!Uj1T5w zDMeOtWgdW=xtK3g&S|r@wtf~1rhqd2_O?QKpxamUeehz$-re z`}ceAF)=Tfare#93;}FXlUUq~RBqD%{5hXXEi8ymE72TtDIB;aQvYVjvpZ z8%(cCzyzJ}+v!x2?;Rd0rSSx~1Ap(kc^FCxTSw}xqa$pOL~p(~vEJ6!c68wn8#FRH znj`9oKo2iLlB(MaXm~9fJcV;C;SjhUu?hWk0PCI zb~lWo2JtNlRzHD32_y-Duo4W2_RCGn<%WiC!<|9Ll~07lw7{t%_tNR1NyeQS{9yA> zPSyZ!jf>%>ZQVBz@f&znqm>k+Kp=qa*5##!QaPb4I8bf_sT? z$(_aSS+|#m;%aM1K*3^l{)09Ww6uWF+&)wjE%<{ZJaiG_T5j#e;1iX z7RA*&NMKM3fA)!SSZS%QE{2|eJ3L*b1>P|bZ*$F2SWqyPa?^1va~=r^NyP+&^q=a* zeKGA?aln{}!Lk{d$N|H=Jzv7ak&mSsemKGZCx^#1I(t~}ZU&han|2jKw{DaT5l3cD zae)MmD9f3@AP2n(6X!)V+bR+8(#XAL;D#H6GE3l4uh zF7ztjN2DkR?jx{Iv@2u+_7RnP<2j1aHFb6TT${&@z=Dl%+WerfCo#7R`t82(@H@cm zoX%IjQBXjO^ty{DUBq_Aw1teDRH`6;un@ zRD!_U;?Z5xze(P>*qi(YY@3$h+9IlH>w|9sTooHT`{}CRTtzPBjlJHIHZQMQo%ZL_ zQl(-I_OWc&o{X9rmxpV+IXASQKUo3-q=-56`nEwT$M>= z{o|dCTl{D5f`Wq81}EpM19g>WAI~}ey?RwiCCr(dK&&L;SHx#&L?Sh=@7tSKrcM$T^=rM_p&A7FE~CI$AQ86+_`r>m~6uH9W- z-rlKJTSv!X738U@sR#%NC(F&JSBCCz%&XEdONzMj!sv z!;8)kf=t%waK;V<2Dgu1B$SlV7J-Mlbsywmf6vZ>klM?#&8$}Fx;K#xb%`k~>}z&= z%;HlqFo?O~I9P6e*&lOE_v{%4Cgz;->jZ}Avru%92lci1M?~->wt!c{!==K}&`iup zdz5jZ*zuvENFt5!|D4)Hk?+bmRN~&LX=$Vu_P1-+(?2T@r>3SPd?A*mra|WneY4-+ zW@U?d;t^!vF#BVY&!E><`ZL3nblNZ0Va}v&eylcELO($CpD8ztB&-HeYoRS`Fj7nF zJ#a6rS^7Rk!UZ?j*x2oE$LaO;*nPo^^$rfRWn%9AsQ7)wKYko7)IK01J03v4D`iCR zT^}K#6OG(lU3Dw?5)%`1a+Z6?f zv5WP4ax$CGMgzEJ|DqSkOEp&A8@+G1?ZHLw@2?Icgxo225Tl}_FUn?rv2>oF@$uDi z1;m4OtrMxJtlSX~W^MPm+_~%{98KpdKD+!{RMhFmtEQ%Q@;mBT0CiGNkF0mfokJ)& zsA9t*+W#C}7Q!e?gEkj~HgCik0Z@0DX0}^SO6y5j|K0=l3d%AJ60S9H!y#{j8EFFK z2|nmvq4WLr`*OoV(8iQ0Xt>zA#a z9U=uHS9yMZKDC4|3p4XZbL!!es@hbW@8dI0P6snHM6=lD=9Fm6c6?osQv%m`XUk>v zE5A3A812(%=~!LwE-KomwAYinvi@xv?fsP_fChs6&+!R#Pi{X z8Ze0*5%)67X3^>)Lsl47JixI)PF|3&aBvy-<;$1Tt;nR~hW}nMPC;&N;+r4T*8`pw zmC7Hb=F7mtWkQww+qeAm^y&%1jMBBl`*afAN-r@Rl+7N&*`O4RMgqYNj8!G-lSWc#MHq5 z*V_RN7WDV4&~e zfi)<20GA@N8-W1Q1F&69&0lP%_!9NPsl@hwFZm2rOsg05?wBZJ&b~f0KsrahowEKXAgfv{Ty7)?!~J{Z|1YQ%g;p*p zK0ZAyEiEZ2DT{q?;^)SO$;QS8z!IQPgga3ce!0&1KQwi{5v3s|KOZ66zoaBHCI%^6 zId@Sr|C{8z$0oS9ImV3m_-DTpl2TH-ohN2y2=MV)T^>|Fy+&pJ9zSI~jqkC8Y=9dV zhm>!k5+6XOGx3W+qaL0V?dKEX{S`A=IxbkdkN8^;EMj5+Q@l1X(2$l^m6p~!%fW#( z4sCSYg7{$|FMppyU7*6v?bO*x+tj23z~yZQDDd`@-pb1}WJ`jg=+&!+04YK~z9fZ@ zi98p5fE!jT6Ad#jBw%9pG8TXT`E$f#^Oq;MtM<2zU2`^ZX_)zW@i;;FKE_&fs>S)+VZLdO2QbTSXP9~->a|JzVr4rDb*pO5nW*<$H9qGuKUWG|KH2chy}58 zGCh^ARedyCutRwh+&CJL81oBqRpeoZ`5)`)dTp`Mi~-73CVsZ(w6xre$QK&d$z$)( zdQs`{6%{dZ=PGa@xrD^TYU=7m9WR;b9Q15$MNe#OOR#&*ZEgLPH53)u9CZEvdEBP1 z9bz11b|`B=!+WhuftBLif&rLmHzBlVXyHV zmg>#x*WAp^LJlbhDL!C-LS_NKP&@X!VLDVh1E&(q%4JE!#QtZ7%1; zvx-uZi^w9v%hU<6-YBfi3>rk^b>nf{*$OGgRI@vQxN_jB3PofaC-%sRghia>Pt zDGF3>iHsJ=Wfe3vMKmi3_nFMLqS4VKOH}2^Wzo>1K7al_GqY93oRyLocVW}*97pt> z112f5FL%qsvfU#DJi>~ z3tj%McDaRboFZXYlA-Gq{_nS<&SPgc399BP?9P7QS|F4B zvV}R~>0mQcqN=G$EXuX(Zg;%DKV4%r1&pAnscA!>oIE42?!BrinV@6G_Hc@rXq#kZ z76c{3P<7Z(nuQFc`)X=*677;DTbw_Vs!+h<;;p|jou3zaMmBmOWqo(ieNMV_o%wy!^yx>&uqu#jP6Y|guV`G=QoNRmV7{7-JI2a(~HoELzfFyHyS!`rv zgx_9oTpwhid7w|z=5_Vc^Kz#<6f+6`r-&~s1OoAe+@{$SG8*{IG`^5 zy51$Dr;}r|mMMoFT^Uxd@ne!5Vg*RmnLL$!Xz7E5q4=s_28V~`w`hK5f2snI1 zi~}itKiL&vkW%juk&udh{`B(j9($Mo?SndpRoG`AH~U8Ct9P|@btA*2+ThgzCo0vh z)_C)#*!|Q%<@xQ2tgP(XDri{(8%Q14&EmsZ<#TYLhHNo0F?|jXx3RWPl%_&%^?mf3 ztH3>?c-64>-<|`F>iPNkt){ki+BlgsN^u(Zh&5XGK}TYS<0O29{2MCUD;g%Ew#WA7 z$|j0TY7}a}ZWBhPww*pj)|+v-SSPL`*tx~7Tbngf*yo(c$jA`=+q+APm9R4wX#)c) zKZ}4wQh=#|xhW|qY?O5xx{W2tJOvczd!t1xi#Y)Jqh2=~umlUukY0+{HC<=qG`>zm9zo`fdrZfUfTD#Tu*9GK0XzsFpKF zj|oQQ>{MOI)1dt-^Or{L#-mik{ zy1D`LmQMhfMiPyVXS*6*F2f^XZ1@oP$#P#%i_TH;ipaf%1!XQUGZx0M*W4AY_ogO1 z4Y3<&kdX=@I6xr_l`_&(Nn}vFZ~XvQ0u-_1jiM-%!Ni*Wq&X~TfP!sZZSkxI#ekz` znSS$1@AfosJQZFD!1j`o;K?#S`?OF-wW2+BVVLOZ!^d0)>@fJ9JVlxJO}AZAM!nAs z653-4r$PMs4TZC>8{N;+Grz;`z;S^`^d{&qvr=I(Lq^T?hkil6Doi7mCYneDP9Kzo zg~dA%qFZmj&W~v4xY0A%&>*sDQsYLWE4B7dgB>rHXd9y1`_CpKB|up3K)2HO_G~?n3UntFqscT#ra&vh4xC?32M{BQKw~}6 z4d643>^DpboReLRRaI47h!vmdzFdgTbq@N z+-1Pwf`Wo_3B*2KLw*;j-B!n3y@1rSi6Z(FOWM{-)>`)}WG3=Baqk(Up89o`dj!;J zrUVf&jHJA0StZr8;0qC1?GQm@VOLgGZZYXA)`G3SxxNM0E7!#YGRN$;!UK`KmYzOVdQI$VHc72-wrb`FUeW^j?3>bz|doPh}cD zzR}qm3&7mIW->jnm;3K$o%CGuc>LLODhoR^Ey>G^;490shDPPo11e>_l$xBZob%3m zwbH!Vv_F1GSio)pLE=5=Hz2>onLeHT`^VQ(EqCMN**r>9aB69O0 zGq^1U%C$^aR<4C|7YLq()A%xkA{6HkT%t4;H(Bj^<4Pp3wl8q0qKU4xg5=f$=Zv{$jym?lwM*q(+fqS~(A$}u zau$#P*UI&IzH%OFI*v@2_CofCw-I}x83|u*GgpnrXqS~C`NR-iqt=Xy%m@<`Gk1`d zM3cHnSIU;9#aJg+idBt79Xm>$RuC)3=Yufx*@^Z(OBW6KS%iNn=emu@Nq1UNXHDP8 zXH<#2^%M7oowV`w3o+K38bW6>@|^BOd7O9{f!2%pN;`EDbz+S7Yq|)$T-uUHtCTPG z0_R7+hVr+d8KH&azO(7_UWB68Vm?i5a?&`m&@R-UI$j;{)tytWfF4pa=srJfI12Pp zr~CVN)YQ}*Opo^Vpq1PA1`8U*?3D8NN6DzDa1jC8Gv1u7D|o8F1`7`>BLfefND2+) z6+K*wLqn=H>}1cMKOf5!;&a(M13+HCVNGj`O;S~rXXnq~9_yMT)#>%YbQbj5%d1IB zs{Jd0da(v!dH>nt=%<1&kwEX$k{xs*uLDQotDZF9Ok;%r=E(t@gbStEI4jHWtgi{N^YrT%x|haDY`zpB(a->^z-Dq* z{uE9_B(s$iPO2c}Mbpv+5d0ch0b6$h-BG{*1LEM|gU(!^E_$-%4_ElH# zfv99}uJUrWoNBw^rTx5vC*sJgeeK?!d#Vo?KmXv>W_o-)1um}B>55NDCZ{j@_1T$Y z$w5Ct7=UP*OMbroLK0_BKwLsEj0YQ9Bw(-ScmF3XHWvFSW~1MAzG~aUl9#s{JU@V1 zMH5TTxD?{v1cu%FQ{T7KeQ3D2aBQSQv1*C$5MZB$m1hJ8dw6+~wP^sidHZo)!3|bT z=(a_H@d?>H!tjt%q;6LyT-!fOM2@QqF6TB!P8&uVAvmQ9Y3R(B!kJlQlSuYCaRa@E zq49{J68ub!>BhEiva4hmpI<)pQ(S_BK z5A|_KkolX8`lgaf%f$0{i>NY|3F=$}etanGm!cGFFacVb9cL3QEUI@QQ{C9uF3G%E zY03msMzE(?tv#ZA*Ch;mAKvou!OPEt#O$cJvgV&r)Kt=nlEGIpJMN=9dubl$p3Zw? zrJQPuLC$wy)VYKPzxX`N>0e)tX>reMH}2SYWYuR+2or{zRWNN8ne*J`(@(ZbM4Jps5g^!8ls^=s5(`sBpws)Q+1rZ;Rt2=noVXfUSyBTN1r zT5NjaO!*ix8V15&!>(!md}8=90@$~SwRK)uSwQFUT%{@6vbd<|GbSb!e1`(j z7Yh=!tgM&o-N+Dg3a+mbIA2))I_3np4nqxydiN?g{_C3#@t{`~D`FWKXE|=UgpqTL|;r{2=&2Dz*eJj0;%^y&CZH}Tyr$B=Oo_=lWyD|whmXufc z6mUiC)pn@LwHi#vpSi?NS!-`^2*_9F*;tzWJz+^nNtvMW@$vW9$DGW}o$d7!8Hjtc zx-5O9KOQMe*a}|I!or=ag z!kkGxfMFqcXn&&5B^EGV*p2G(Cjs^1G}^!R7^?Am{qFbNpq{M+6{g)!9@mTdcIa|_ zICnMdOvk1aeXp_8o6m~oWG}ab_1Y{#I1vvgW7|uge>`p|6m$Nvde5W=m%W&^UQtQs zBJyZqTEEJ5%s*u?_lbYX99E5YpI)%=)4Mf9e;`|kqm^;Io2%T^a*rG?DzXBVQb%eF zkd5iq*_Nt($I|fM9KTsf%+OLA)v*I?8KUP*& zK0aW#fcJuyEjkP2VA>{?`S#BsVX^9&fX~sKQ)(=ew9;H(G^|gtB&ze*5yr{xN$f7` zS=#!tGGbYFxDXWeT=1?#W4C>k;M;*THmgdU`GWYdAH0**$WWGk+O=ltvtCZh(^qrb z7vE_$NL?Q9M}a2l@bJ(yIVJ0EhFaL=cD*~S0jb^p zY!R6^rsM9uLlo}m4G0u4)V-WoBj|A7+dED=TyQL17dvB;VcL-EEqgtPq^GQ-;H=T1IWeCnU)IiV`)PpVvlIk2k#%@{P(B z?GU79h0L2ng`n*#{fK(n(%pjFR}VK1kU;hy3AkU3LI#n=+hTwb-H_VT;G=g!S zsy?O~!#%&N!xz2^Z&anUK(-r6^(Q?n%OKe{vM75dQJjJ3@}T(zR*mm0GJxC9+KrZ$vc%K()qEvJ zo?7ambBjiKp@9a2pvT!-KzTW*0n>)rOE)(xUBr--F92`=)m2q>^B=K$DuSZ& z@?tyEcD+@|zfqw*HYMStzQz4&KhWUipi#71Vc?m(3 zaGpUzTg}J4ofMnKFo*(IqxfppU1_FlQKzRY$k<>l7LsDsQctUR?N#&>_67Kki837# z<*atdF?mtMzbKv%;b-<)a|Q7F@NpX5tLf3SsFjbXF)=-C?wwxjDzUF`TY9<<0|S6y zIUbFPzc@vo_H%?O&tUX)caB$Ouw*-w}MPe01$-G2%9x-6B386 z-lCblpdukjw9#{iyfPK1=jTU?pyl8oLLXd=#8%@Xfo|r$VSMVB#Py@(GB#{&^0c&s zW@^g(%K}JzY1hK2{VL9V`oreNt+@w>SpmOaE6-|u#F1*EOhV`3`L(})hq0=XUJ6sO zVt%qDWP3Q;!eP)-GQ}!&0H3iLXYkX1LKOF|AYpCAcjo*Ud%VBni3xbhx z^zSB%5zNg4-R|64(kX8m2RY5QQOu7Y(Znku8Yd@xe@6P7USJGxdz2NzLW%~tm7j<2 zK5!=E2UtJ){b?G3GRE-=lIovBsjggcUWlVyrt>QO`ToL0SUjp33Cq4KOI-tY{9Vu` zeemlD1}Jp04^3z#xAS9;F7wqq9zp2Tn`E{=7GeJSW|Q8F+9+3#*Wt6{z`^!LkhaM8 z8d{@g{t>1ZO87fZUVwP(^Kk8Qyg(QMgkz^qK7}#W zX2a$x5f_*vje_0pw*Q=tyNxmdK%N5Ev3ddS$oT3js2)B|t4_E`Y54%38=#rfOVL_F zFya7fuUMu>^ZjovV2tuGFoo=y%dTqTL^uCh4(JGRHqy=QxH+cYf17 zy5(K+hk9F@X%MNwq_zT0LT|bvh6I;{I}pJ<5#Ix4Iv~jmeFp$6y?F7W$Au2*7^n}; z)w}>EsHwIYun(UeK*l=iKBd#MpZFTk*oer$$9<2uGbFePPLW3sU|7a3O`mQI6k*rg zM?rW7+yQvg1|{GKfGle5<6`5jR_)#D4`u zqMmeiBT*X?v?6$dE4}y5kovCA3nAxZ<#qFgXt!b>R|l>q27ss=9c}?HAC!iBJ?#rL zZjH`ZM-)d5K*GTLo0>rcqy>$S9_LVQ!CPfYK?Cb{uPZ!f)&|iJpT*2|5rnwK9cF<1 zjqCd`gB}-VxC5HK=hi^ZyC4R|+fQSu!9;dwYlgKgctoLMK)++mJKy*@a?_$wYZeRf z*#5(Z;GD}}q)V{H_dv*Sb;mp9oshL>ztm89w2SY@3^KxKC`vCi77Vm}JX;JLcr1vw zNj5qQf|V6%)b(W<=coous@ChbPvoyt)6>s9Yf#XR4-EH=V1scqyoiDs&|Xl`Xeg~x zqY^I}Pay8tzenSB)HkIoboaqE`pUuHsrSW1NNcl{Bjr;j+lzeuslaJ#M(6lcOA?El zoR__q`IvAfvt9(u?;t5bQ>CFrlHufmM=-KWn_?<#hZjKX z5Tk%r4@E9d3WPQe^e0Mn!~4zD^Ms7ks$4sT!Ec#aS*@>i^e}?n%k_0PkbwPecIRv{ z0fMl1Wt}aRJN`H55<++5Ux(Fy?p<6L{<*oSuQoMMC>ifg&1t487Pg+Pdk2K{!?FJU zFqD)G=>GdiEqEPC4cs&1=e86-zJDM8?zq$n1brU+=)KNc1Cu}{zgEEZ)YjtrD3B#) zg{Q_-*2!96^49xXZY~fXCOMB4EbQ?(7#ZM5!Cgu}b6cu5?Z@&6ipVSEzih4kHk{L} zwP=`dd0jcEsYvZs9en?g>JTSA>`8fh!+~^dvjDXl>p3pDS|^U$_J&=5ch- zL-l%lN;gt)WF_1m?=hEH{GF*ovO3vC^XHW`<{`Kv-%!!vb8fc-oxjqJ;4WEM~*tR|dXzFxz zXE)r`E4J58rfc?d(q>9aOR=e+cu^fdWU7ccnPLKG(#_eQucsTpc zZ5hQ#B5M+B-V@%$n z`AbxS9#U9@oV>g+E$x@bx0}Az>u@`WiHT36bD7Vqs=lD-u)zQs4$8A2XQhUn@UIDQ z;y3W)j)kEV?V7&*ygqM`XG2SDJ@jtlF7Iyf`d)aonv9RoO>|~j5$0&V=b7sBO=Z8_ z+j;9Z`_eIQz<@6meZO=JI&Zd0ZvG>1v3nh2QBiM}{-@j%4Nhk+e*Pwrb&5th$9Zy# zIAMGpO}Mz_ijauf z&s78*6O-cM1tOaK?)ZKNe5k{GRqdOUF|C4tPop{QAV11zYLf1s1FpEcUBG^+N4Jf9 zi>#>`r2?tVc~_OvG5t+&fTwnO4Y80=5mb@?7$0@jldMb2nd8-2j>PGQ=bpoZTl;^8 z_$_{3K;HufPHrUa+2dZXzPy}b~08{H+>p8$|5n>;Z#LYXWTUs!hSc!Qwvm>(dhAFGto%$;jknxpKI?8AL5I$OT-(I03=MYQyCMTE*G++vXM&bS(FH%p1fX3Qd z8EAbl`r4N1HOih#&^A^?|2*S-x^Fu(C2M*>U2?!+t^AZ3@U1m1w3tm1p~MR=M<((Y zj?t#GdCyaF;fN)iu7Pw;x+2}3p80Bs+T)rfb)h{ppOx2wA3XtgRy0k#R96_97VnQf z{=JF8IrLaa6SHAfAt2!{!+=X4Nq#m6*EOvO4`q(X;?+yw1f?#Y1KGEXk@Z?#WA@VODDPG~n%s2V6DjV)$zrVc%oEgE7KN_@~#a-<3~y$8&&zB~sS3YnEppd5zFDG&R*(O~qv48Vx6p9?@eO zU@K;e)=CA*r#f}KxJlz35sXM>n5(hc>Fsyw^zd5@H4uHP?K_-5NO0x3RW0yi5;DxhK7cswmqJ%<~E=wzE0vmT*F6X_<0wl zHgw>dem5kt6iG_7J$55KRJq>hZ)Mw~D0$BwNQy#Zcx1_{we#(n*#~Ija7ww+QKjdl z{7E{{|1UQ~L>y$ni+5=SzY5aobHlWaO|SweLn- zFqtcVQ@r()tIhsZCo*X#=!w;3$h*jI{tRU16iAXAl+= z(%9r{ME61QOVt;C-)d?xFE+79WpX2omUFW$i3CP_f5Q|HbQBZ{F|R*^3E$6^IzM_? zNOqPpdaEH6;dAWu+_q?Yu$6>l3ppbtHu+6o{IopFy1$)F%6Q%Bg3X| z)fTxclPYb0J?dM~=^x3FsPDo!k^F4=`ZG8DvZ>>zNtrz#KY89(y=e6`E)k|=E2D9= z*D#gze#zV{;`{gR#KrAC1;*deolV!<)axI8EC-?Fe4+GD>}Z^pm;&5(w}!|(s3`Uw zQLZ{Z9@bhf4bAMA!jOc!0v|?5O_UbPZz1E>o9H{qZ%l-FQ=xgtDy#lhrya`zv+ETK z606l4V$t62vUD8X7cWN|8y}xUj-<;dn{!}syHp@xO_rO9=jw5(w|RAjroP`j0~u5sT!O8Dl3cB_xf@qK0zS+xX3 zz+THYDy>N+)$lm}7%+>UR{2`lFL0r$B9DElgSmQ5XS_qO5DLvT7%5?QZ_UkxdSR zon1gBz9ujUl)#PqVlB_3V=dao&f#1DjcN({y&HK~BKHGuP~cfyTw1_7A!u_P> z%NJTlFA;~8k~*&|vJ$plM$k^x5fG?bi~`}?CjhZ1`1WnI4uRDQ zTCuH;dnPY#ZT*waW(H?^7oQUa6eM91Ik%ob#4-A*A%3RDDgkJO3Y8vs?di>_D_BHk z`ES4Up;QY_QSbb!vm=L40BH@!sf!l(m=i66{6 zDT!bP1Bw1$$zqdall#Du2i_3mie1~30DAc1cjt2U(w7otc{D=!*_MB8rs+# zwjADR@@xlA-`GJh;IC=Mr+LLt$P%? zfnRk#V&`!=rdfm>GpSg9_su$m*vX zoJ=)Kw9*`ez?5j0qdNfE3kwTiMhwh%2{u!~51el@u6b!|&x7&i3j;bVD$zY~^uSCj zV&R>80Q?uk!Zgx%N517GfY582vB8$jaatCsp1d%pI7L0gVm?D-*EG$^g_Q^@M8a=!CiBgIr+aox^Q{YU!3 z*V2I~DC58_M{i0s)=&(X^)6Z8<+naqtf!ty22dPLP^>^qOl)*y-ZQSN9n#1xwlSHFJug;LO_s%{&)Sig+zBzdW?l+p0H-7QLdNOYt zETrY+vm7Z{aldOpU u4zR(toNG=Y3v9x|VDO(%mR+;5z?q;dFx%l=;`(k#{YXLr z&G+~6(h?e(A+cHlKR-XB&)^n|Mw|c^bn^@v`H7g5`Qsz!u6o+4AW(Y#YAmETQ%P%r zlz9LlV*fa&ij0iDwl=OTqqsON3(L&!-#7?@0eI^BeQ-v-`9w~MzxDFe&>Z3uhiA{a z`pHUu06_gEGxLStlQ$TJ1>+y!Zv`~jFY8>>D#n9BdZYIAgXv3Z*=2wDAyoC4mcz;w zs%jD%E@yf1Lv(99^_ss6K`SKGxba;RQL|9TAUu+njxxfHNt}&K^Dy?8kV5W7VMipV z0~#cU8nOFR$s^J`3b{CevI&2QlxHnYw=Y;n$X~v?D`4v$`Sg;7+zc06`sGJfAXjaf zQF_BFU!Msv3IGap6{N&QYMq@!o-1hgUP6Q!7@7xvwBdB2mfSJ@)Z`VI!bHtiWSJCT z<>f_hZv)h0Po(vhyAI0u(rkAmqW(yo?K89r;)H%G!m*FNf>iHYx-nco$5RCegK z`~6q<3&xe0!x>pQq1gY?(2^~jF`&FMQ!A#3($;HB8Y_>jtLvLBU(wOYqbOp0{(Nbn zNwG)Vi~~_cEsV4;;r%P1M*TZ1tV)%*m!UqPE}nDh5>-@EYO{{1u+|{mX@nuegNx;Y ze77yDu*(#}l11PlC#*o~xw*Byjdn1r@?n3U6uL!EpAWINlV|oH`cX<6ho>&wF7B~y zWu(%(DlyR0gCpBH&N(sgs{KX3!_K!6CCSwxg0G44j5NUza*~MQp`8pkoJV(I&M&gW znW7<|b=`bJzczv|oC zJWSqk>Z12&n1=5HO=0oniyrTP6cvFU(%oG+O+r}6kDot({3H@Lb>C-lW`@~0tQyH8 zpq2dqL`tS6CVVe0_ObNwR`*+E3H6N#ZA?t?KBExzipc3PQ-?^{qfy8{U;X>cXo=AR zSmS6pwvv)upFg+zaf#3WKU{rvT$Jk;E+9j9OC!<>LnBBCil`_^BMlNthjh0}NhlpE zpwiOaAc%s}(yfG)z#s#2*X(`Hx%YSd@0_jh&3tdH^{gk1h3;&@C(lfL5xx}g-qxGv zH9tAUIsOCz*Zkv+H>IT?3JNwC7U-#|={a&zU%Vj319?Yuyha<_%uF*fBUqYWyx;gH z_IW7Pn{|sH-6!U<*3%pkAt#r7^ypU;<NTJZh5W${t9Urld;_}jUG+*iHq zcm1-lkOHx&!7Otmowc#eg(@KIx8DT$1Ss0xynd~%r6n$o$Qro|5{i5G^h{01e*E}& z@#7RB1uL9}0Bv0&(wL`H()0CvP+aGq{q*_nipF#5r2Dv{FTV6kH3{SQc7BXXAP-M? z1{Nyf{6D36H6h zIAtDjTKwuE&!0cHATie0H&Rt4&`{m6@D@eH@g=-`$xcHPC%~lOeC^*gxI?y^*x9+1 zQCh0^BFDkb4qsu?egTbJ=X%fLmx!t1K4OGlEb z+z|!JR#r<$L(TAQ57X|a!ubA;yBp$?lJrT;Ox4z;{;p9P9G%Ki(w9CR=DWk2&4UlS zZS_rS9xLH_+a~n=e*Y(ys6uLX_LKpinhr(7E4U|LlfPn@eo8j65JxAi;tp99e!4*U zYt5Gys{wXa1VvN#PcT7mE}Z@)qPH(LZ6+uhqoJh*86Ja(DUq_^B}76}%Hc1i$n7mf zuWlYCEmd_bWntU+0!85xNojXzXxiGWrPP#!gkwa12dr(<@ zQjE~e{rHjT^BpU6Jaq&p6}IHE^j%x#1eR3(krv&KooCDeCl)As{r`M|Mf=`%aMpRY z4t8Y-lH|S7=V$0W>9gLFgD=+P7rCOydzVsKrmW10uSd$hco}}c7D7iEA^O%>FwC*^ zU#Ze@Er3T8c`AM?Dg}cMK&gZOdC@^7SoueB^wa%iqAs3`)dv_3%-WAQRk{DT6j3SP zzU}Q@7Z%o;ERZzW2qr4>Pu6wR)nky>L`c@$x(|^tx+=uK$ka{{RH+zM%kTeHu!Sci z?ru)*1G5VRG#|YH*_Z|-%Xkt%-F8xeO9)P0fqb6JFP6@s8yBBHw;8$cudo=NbXn3| zDX3|;bh5@#23jBH}!jWogM z`gteMpWh-u_99}zPU^jZohpu2KXL;GEhJbC)q8)SlcSt>VEh1F9iZ??IZeO2l>}9s zbVXHF@CAWOO^mdRw07xt9{*oAs_0qZXH3s1fg&$WM-Mw*EP+8JJ3K{C3t## zdwXk1*rZ`%a#W-$vqKAKF_Dw&@TfGEN$q@ajN~W1bHtYuG%d#dr|NpEV`pav#Km*Y zb(iXNU>+(se;AREL-$9? zwG!tI!GFxJKt!f44p@$0UQj82Qhb6r3j?x6L!FEeKYzJB zfS#kTZ|uXzCNjX&-Ns5$S8!Cz0X6~7TYCEX-X8qKkBR<08zn6>`koGsR4f_`3Y0d+1aU(kkD{Phx*N%K=sP|-h&~^k!!(2 z$<7yrl-*JaR%}u5uhCFbgRi2xrlxE2X=37Q&0WQgt&|jcSF=l8l9Gr@;(vaj-2U32 zqT8|^7=j6NfH4ICexRWZ-M;sa9ogIB&T?(=H5nLC(@IR=K8+|NXyGLx+4Jvk^XHeB zAMNVGx!yi9lJF60WOh~pZZN4C899nUv)$b*FlYvz8O>v_hD1(!ZE*ea_I~IlX44Bd z%jW^5;lAcKZW@E0aO%#CEIl86}HQi^P;P|Ht# z`7%@=1I%9wX)^bZen!*Mbif%eOIy+;mlNzQUi{)wL zSXf$$IsTyY@mW~id_($J3-^ESXmEv+POVisEFNAz{X06h6SFPxG;2RdH;?6(ksI;W6-|X$_<%_QQ zx|Y**|=sd{-LV`{K)wdAeRry~Ox; z<#(hP=9b}yIfhVuqq((_cR^x;8lNGWOE@8PVPhYp5Zri+ccQj=qnUYq0kFXOm>qk0 zcvRt5UGok#T_j_X0v%?lZv2DKnb=NA_8i;H8P1{+iI6n55a z(3hO$FcwHfnnbo#E2aOqPWz2ocZ17qVDfbwU}B%YB6pmx~LN^0k+*x3zf0u(;;nwU8HxA=@ZdsAr92fU^QWTUqIzTLrwBL&;v~Y+&T~Gf9j;^z7|%I^2Y^ELKUx+wb@i?$V(coR&rmD)-t$OZ9iT<`_wBoJ^e>Cb>}s6Kq!8Fd(#*f_Z7|z zX$OP&>LY}s&#&*+Xw1i&8iuz9{sqUL{+B)IlrH-iOg}p>f?USDF%)q`Ti05Aie>gqzZhxz#wei34X@q3Hg$_M!JgHSuTw|fS2T41h!_y>)Ly-y4e{vOyX z#Q&I>Fn>o8LCtU4k-D}%Dg>0Jnp%#2cbp9X>~zYUDDqbVkhB#=M0%ey(ups}Bg0-F ze?ge!w{D!sw6&WKl`#~1?rmqGcw2S9^|iku_T1{1U4#q5Y3@ za?w+>MG6FhhbN+LLu6(Qj8*JAh{pejAtQH}D%lBteBlXg;LwLl#qbhqv#> z512f;VlYF2w{%v36Zu2=a#qLZ_O6g*{9%V-6p&6Q{H*Ln}9@~Z3;#U@=i5egMt;~Na zs52TY9io2ZH})1&dm^e$n1%@qTAoQA&11e^*cN4m$c~S@;QckcPkJ8R>SU}Wn3rfL z-&F)VJ^u}iGMHuo4DKBt*SL8T)GBF?(J+03MeVn|ygV^Ei6F#0C^x5G73hgMpY`I! zw?;1xP~O3KbuecpN8T^4(ZEo&&zY>l^@^b2Z9~IbhK5(<<(qHDn<@sKRaF+n`?1Nm z49zLd?<|C&zC>o+xE>C}(P%SgkQUt6(E*6C9`HSov3v8z#jT}FIX=6E>nVQa%JIlZ zGQ3?IYipARkI9J%>=+bI8epgum!8!=At<;Ej|UVzTpk>4_EcgLO3GfoYT!+o6I>D7 z_@+`Wh%Gwb(jgFta?(_#-iNY1=;QUq_fn_2)L0=w^wW@F{7J7?b##&ND?2|VGB?>$KqDgKcT zsP|Zjp@B|sqjy>~V;5j&wj7euwRM4~f;KY*lr_@GA*@HHp2Y&srP=Ohr`N&=7Ntr{ zOSx~xd3t$uS_7sJg9Q+C3h?tU(jULzj@n5~_q$a5ibbreMI&bxIJTiQJ6%VEg%s6d z=U(Bc4Ti^!rqKnzygH0;-ti=XE-ER&B3KgDjm+sgKAIo$vpK0vN*y%d=KlG)4@vQ! zJl&p4_%bHeeN2>PsdeiHCDTuX`Qvb&&{KqrVsxKCrUyc~pD4ybREL6`ytDk}pbhZc z4TPK?J-Yw;efWjW$3bLGz};+5lSfgK73!B7-v@?=kWdi}I(}4dfQcZPHV$l<4pb|A zH$a90j|z6l#~!8M%PDdkuTybwC_4VoX}So0f0t*srt3GL60H}3&TMn3mlE_^;A!Qz zxBMPRMSp$`ufa44JV(2B*tKysZBPwaSKOJ;Z4;0)Z_PHZbw9U-;V9SyO}Ao#f%HGi z$*REwS1Q#752)vbwEFJ-Tj{GPqu{l%4eZMm^!UC zWP;4}+_OlRwijyqGo@Y|#9|US<#n}P;+xqt$%RDoL$;l`@Eez}DMkElT$6MN#1-jL z(UY3cv$$6fL2Tf%9w6U|>Dt*7!zH++e)^YZ~jWs$q-l5@>q#S&9-irQVuMLLn`&;Bhk-Vr=sNesSuA8TzNV7sd2 z%}IAyBM&*cwb$o@%z-X;hyU!RSBt2L`M^kh%Ysv+X!gx>zwH?I-Kq3!#LuKqxSTR{u4K zji1D?Nx24=Hxt`h#iN7;rlGgae{?+AjaYd(1}3)9lTCLI4b2~IQ^jEFGk7j0n~vuK ze{FsaPCqPZV@u^4wvDoW_Kc*juW!0BwGO11x;i>E59d07?Dq@n&sJ@(4+afeTTuu? zLLqRCxFYW`G{4staxOO<1ea$rv^Y5@1JiEp{ESxHOa z{?<^ww_i0fnrhmBp@|0=vjN#7ns`XzAqY7A z7lZylWAg6ZyY?{5pJmY0vo!`=FZsq`8a;j)zkZc>R-s<-zKCaf&+9<&w>Viqg+Q$y!7^`c1k}4XF6e>;S(Ry%OOJT_J~3sy_mObUwUOfDOCR(k ztu#`+-Iujn`dAGxdSIWR27N*%vYFqHqls$tag|4%h+HPQ0d#s>52LHwW-YKIzT zX7K&>SU+`oOAUQ|(2;zt)@cU3Wh-t6bww{ghwlF5bSjc> zuB^XFX#Z51p0?>cI~+b*hPtrjkVv>m+q%O0YOMO%Mf8#R!k=0|SPssGAn0EoFN^;S zSEe`SEC9qSy|FBy&Ysdz!!>_*Ntht=!w|By(8{pw`n}XkOvWdJ)!mv#21jHyUIOKg ztwu!JyLHEySGxjf38`OoR!PMSVTo0Atn@S1&Eu{SGAPV*tWu|Epqr=imjw!r)G=>k@C%>e%pb7|r28 z{G%tK7~|5`w79?VL7|x!C6K|qJ>?tpl_3RqF_l(-YsxLPuRVC(_8sMrsi$;qJs$q1 zV7-L6#aRIRY53j+0fFO%&S~xoz%vVx9^<#PbA0$PRS24+KJ~8%S@Z^l^}x~gESxw}o%l++;uDKtC)A3gQhwLFvxFw!;G& z85wMcwSueqv)T6mT-S_1Uk30{W@aXo%e>~?r*P%~9~5)|yu7@ilLvV@Awu+(47eNr z{+%!Crq3qtElK@@)%x!Q=>#<=f83*cZUeJl}c4 z6IbM;in4P3QUdV&Va9St4e89HcP8yHVGgLEp599sa+#Aw>Yi@MAxQ^MWi+^wez|@B zlKAU24Bp#*a7y1F;+h;;Ing&c|@w&0$3Co)6gqFeWS*mTdS}s zzHCWDJT}1@%FSXAUxUXUT`!>Y_r&RKzFy*Q3?aR?&ojy%dMfzM}oxgtlB0!vmig5}G zV%;B6X}f>^fd1@!prPZBDlYxUT1Td}692^lRKkwi>->(gtDlqryye>ZrNL{v#qVeq zoE9v+;}uVVoGSd2-+>r>J_rc@Lf_JjfR$hsZ`O)M7?NoLM=mxxT7-^k=K+`xmOxuW z>(UFWz~F-3%X`^ZpL~By3^x9$DDcVt8bQkVpo%}=^{}LBeiYx%FXq>SrhOb#*9Xf#9ab$`S(PLvk`QkTAju*ZBfm?$r9R=y(x zg9cZY>oQlK+EEP9Fi=xhI8J$@wL0dTpv6MThnZ>D*Q7~2T7=qUyx8zL$J_QWLRUi7 z?y>?XRZGA*W-z-MTHW65eBewh`y~U(2K01CU|!>GKhr>O>It@eEdA^Qr8W;AKJ$Ou z6B9!w<%~^SKnsE67qC-0S%_}sa&#~Crac`7v+aJYF}!aS1zX*lS1EYnPrR>Wzh|!+ zvSdEo_xejq_A$is>bYhsHSu2r!|evbtxC;a&-5by_S0q)u%P zc7-6)hFJ^dELCYYoxhMtOqeUuUMH`@y}${+HH1;(%*^X(X*u6N-tY&gP5=0BLti~r z?+z?pM5tfw*~yI&Z?I4iV#(DdcsRV^JJ-RCx`N$=M^ad@Ks3u1fJ3~G(jzQ zfwgm)@5t8F7q}E=W{P09crEO&pSSMNaNbcaEbN~0k%Q*s7M-LwFE^> z1u>C&E?sbWYaLI!5@J>zPjXUO%8#}SpKEFBtdd3?FBQ+lBkKOKWbwilLiR?`5_173Z(|XLiJ_$EW0fp%9fXEu%bbB)1{CcMxXr z%Djhd^|z8e*g~LKOyb{{v-w2S--^DLlOE(}NsFsn=4AR)3c#K=quB$4PS5ob;@>ld zl{Ozqfg-yyLnh(_kV8i^U_?28C4hYeCMADSC~#E-$6sgzAHrJoF9+j1r z3agRK_a&`OuN2&6an;5FPgP)~0-q%;evndHx*#a9+4sp_0S?Izwy+8?1A)e3d$Id7 zFrV-(>grForoiC#mH>`kmTWaf@nf?^%aTB{y`Elu)U(rr4MrO&IHiZ728wY5pX#`$ z=M?nmQ*Q@bCZcml{%vb%wm4R z5i;#v;PH+WDdfVf!Yek25W;BdV+`Yr|Jp7vYv4QOBU;?kM8AuAm!+9~w!gLO|7@kz zdE|TR=b|am+NRGBF~+-?Y6}2<%-(}we!e{&$UM(AIZc!bKZqtL}w9cR=qOq`r`nO1?Sp zua1lNWa^`}_&fY^g`l~XW+?1a6@&6hOXIS#W}sw8uo720bdcRsQUaT4*=QZ`G<^E> zAH+FdNdJiyOy$51eRq#CoJ+HOd3_zO-1@mzl{$McQUa*atl90njEfS~(0S-i&Q`tq zjV6q?W~R@+4^61mnMf>0%;w{DHVh@&?HEceh_8&D?pdxcgynV=>1u^tMEmI$rCT&_ zL{XN)m;?M}2^J214exL0i|Ff1b9RIGtA*27_5Rmyv|Sb5F{2e$giY6Ogq)WE7xo|w zCv8&4>MC_=nRD*Tmkf7J)nJ~J1GxM8_xyeE7H;sMe!W<`Lx(eV8ybbYyBT9m+$({{ zdkAs7x&k^I5$@|sFb(ASHecz`VVmwul3V>KUk$fPGVEiR*Cm{hVnf;*4oP%vSishg zvFW}CK63j;hKA-7gEMSP&l;ZCD+crrNItgJSDfSCn`Dz2CV^t;2rL~q$!4`j$HpEH z!m220oQBc@6H#Y+g1ZqG=5ybRW^5L%~Sl5YFNHWg9P5pWDVUPc3 zGgNJ7VTAELJ7h2Z*C4(a%*6rTF{@(WhdZxeE>OdWrt*;%m;BNyl9Q9e5x_~>y@q(W zaB$Dqm`rsKm|KR1hMY*S+EZtRdUR=AxEjL;tsf0Ox+G|Cxi6eJskpcp#Oy2#46BQK z4Uj-WK|%5HqcT~tt~Uc~&=&IS=!jAVY>Kd6DQA6nQCjSje)vFuoom!fdi_R&EFaLdsOF6Hba0Yx1@!1% zrp&b+W&FoPM>`8|Ky5Akcmy0^q@X36X$$~3PZsPKT2!=X_nhAs6+L_Y+{fGd*E&Of zyX|Dx6xrw}wHyuf;Dc$B7+njL^`}xLdA#!VFL{b&rR3qsc<94aN&6q;W!bR(U_@6J z$;OBjxpk{gQ1`>gJBwRsu5iDFCub%kP{s86{rTB$5|)AiJ<2iM!{J;*F2OJ zTqctA)+B5Pcb)(7<8^pHK$mDz*^3Gfe{5$Lj3j9lZhxo(|E1g_sIVNoBs(6$2J5&h zdspod4I?AWwnO{xKA;&JHdqbc(fywEltCiMwgpHWB)*?!W=Pd6P))(uci|KD;XP^!_csAP@~H* zSb1$5%km(i?t+9X)fn>!D^>%oj#G!sl8>Kk&%V(uk|Jl8fR>CMDr<{pUcaYPyz(O= zZoo%m5H^(0#;(l3oxK(yJWhd`Z#hkc^6Zx3H%Kbk-o z2=lG2(}*KsmX6$83jp@utcSE9p)ICYvb0=Gm)ro=T<@%;s3_#&I06gxe^$?2JT`}$ zhHwA?PQff}RpJjN9rRC=)*vE)PdNe+B|G2oZ{rSR%L9LO8A2yuIwp=pCcJtD9a!j_ zrF!t(`=5)n@@-Wx3kSE)&BZK{>B(Z7nVALKc82!m-?GreL<&4~_}M4OmYu`>R<%DS$@e z!%*yQX1$}hCWIP19;4fJd5ZF%Yd#5fj!j9i9xjN5S4#3D2J<Ks9wKL@=-q9z07n5qAeyHfmR#3S?w_S0sLlk z-fN+H01#;OJHjP6gbol6+ye;mvKjc~UpsJQ-PirKG#h$EVHvqb^M3O`KdF_o$o})F z30mduYo$#>moHtC_48~j_#kKYysp}3vkJKj`rg4q~WEB2?OR(xY2xDC2r`mF)^Gt(vsqcZ$zKy*14%HpnO?=#8@>HG$lYKzrV%~8m_gyrR0koh$el)Bu^$zan2JCiBj*aznyq3lA{aoBDupM-&wl`Y(2yUqAgaENG z5HFdj>q1%?|#(Kj^x{(u2|=G%N_DvVV^eV1Wp1Z5|;ZIevZ= zfPPnVfK{;|)afU7{(KtDiV=uYF)1krXuVrB|GPEbdNhNLL}O-B(*CbuzL*(^4m#Jt z@2`pza~br&vH^d=VV$hWZ#4#tG1*2&C9#zg25-y(_BbIo8e{?3D&a?UMpL|HvES+6 z61dBM{j{@M#Vh(f$vHQ9{KUh9O!%rlipd#r>>k_OZ%=tqEm;@?r1WH=gPtrA*7xpm z-##UWvCn4*DBX-SOj*70YzJkbonA6T;N#26n%2~mMnt)LG|{oMTReUo^PWVV6)>=! zpwKptLuA08pTq=PZR!?0vn58hQWma1heTu6L5NpSsBhgHHle*{wX$IyaC3$(S zm=^6ojh!-3^MJ|;=m><;HPzKUmZE0Ck0KHh62RiaQnsz9;3Xt|WqfRB4B1)}5f%=) zLR5o)6=qON-bS+X=NGTc>vFf$ZxU?wfsBoXmR2s{??dCKK1sSoV;1XqpG*Xa-g_gr zdDU$5{jbQ#^nhJTq_DU+9MFDs(;uzf2dZHx3Q~DpJcdwABEYas_TiWFV&*+>_v=H2 z^Y}5f*;;?w;NUi(Qqu;^K~(mmA4colZQ(5NBtN@=O|@a<)yQ_Rw8Z1tg#NP^LbEE{ zAqUUH!vk#ILULxInuGk2h1+QQ&Wm+04qN?s4F_NhNJ_+6mG%<<=S@-)1i&;OvM&H9 zRF2u?)g-~Gu)?i!oMJeWEFS2sqZ4tNY=l~l>5b*pxbb#_j2SRul{y>LS60SDny{RC zxb|uu!d~@E+u{x`SIBf^*5q&M`3U4V%S4TS#Jw z+pUnp7yStDHvv<_(a&%6odn=W2Vfh_cXtNTw0Hm30Rdt9U5jBQZ+$i+!SSOIL|yOmA*(#&ej!jrP<>*8EIJvL)!~-o1N1hnqKieZlSH2q^EsJO4W6NJwenXrgVB zb=-sc^Q#gfbZm(05s)AXJ^ui>8Li%`=P|zki{T8U;rH)<8~u=0?KqXbWe`5cCZQ6NtRK`ef&n^E=S zkU4K}&Eg_yF|jV1@~V(?ClDVbBrDsXN-lJj#5t+}#%8m6l-`!mb2$`V^o*@NiibN3 z4p-pL4E6UXnxrKq1sv}|kRQ?P?*~4$m#VDvyO*Hf29E~+!krsq-@kX5k^4`|gSC2d zGfV<5l)cm!NEbqj~lskZS(DiKKd|= zez-m&pt%me6bqI#p9Jl(1_r7>ftS}A&w2&SC`xi`sOm&a1po?N)CGCXfI#==B!qt5 zce?;gP6(mvbzydA0M018xDCFuc7%TpC!^`I5A5fNr{EP19sEwB*W}01)JkCQj^aPV zXDE8}CRTueGkhl^Pa(3J$;!(544i>tW64F)3SPhQ2-X4SIY#XcN091AQgU?6u)mRv zc_~@|8Z*fh%`iqCCFp4+oO@eOoUO#X3Qn zCB~%jaO}Od(VaU}*ri>2S4u;lMy~k-jqoAU@fg zpa^q8FPhZ55f|Wqg`m{~TH54P=84*ED)w4W$Ba9#O8Y;5UYn{S3DZ^gncu+4ymu?L z59_MV-qF6`53bQWM!&%gJyo`%rWBDGXbPLRLqy*AsgY&Ku~Xl#>E)@G0G6v3goHOe z@4TynctK!qhbxjZt%KYw{qBk7lfU2I+!Wo|nx8K>Zx1y-*Po0>N=oYVrKzk8d(gPz z4&q}3yru0w<6>(lYISVP+lR=A2#}36fG0%ipWe@(2*|@5N2vJ`ZE{DPrWN&db<4{{ z@~64)<|Tzp*Cp*Vfwe>kCSX4vPavB6yF5N+c->v8HF>8iijt!2S*@^qL)^fBKYE2LO zZj+%D13kLcGE5#hI8^x_5I8-WKD(VN*gefLwqvz`DxsmG3T|BTMW=VO@(9nrq8!^= zx{us=X7&MfBV0(d_s5%?`edkGQZV==G+-_*HfyB_Oxf*OK>1IWV@3oB{l}!Fs=aew zBn`hQHIb{Ff{ZaR3{MBs7Dk)W-wzOuhT(B0E8{?6+_CO8tA!}h{=U8np(364md?)c zuZU6;+`M{4T#SAnqPPP=F#*KUg{UthBURAfIT*x600)kU(WMvYdw$;D0Of*!(?#0c z!fgRUeN(;KyjT_4At9}@M)>a_KLb5Gd)(+5KnU0bUTfoHD6gR*TIvTv|1)$ntRl7J z2*t550`gMRtooh|q{a6PX<;b8fZ}tQC07f1ZoJ-CfV*t-b%0*|Ynm9MD8fBgXXmg8 z;t)ynaG(61UYKvU0tP?$x`SkKIlR{Z(UGYEiCkcH3*m+e_G1$E8|em!wUvX|S{lEf zL+u9A2Me7yr)zEQ7QtD2jd)((wpbNLHi+#vP_Tp016-2MnN}{Q$g2{y{h=uDNtcMJ zf=PJB94*=&<>J@m1cQw8V_z4Z942s`OG!zqAb?NfzcWwm=;&CSy8(EQX+#)uNA?V& zk73I`sB@v%?u%iO{=52R3VPCB5+46sldj}MTs{JVZYQ(?6~vOo7a={9LC?(UF^<)Y z@zhe#@1Nhek+y3KyYxk0fDr8W=ac;K?YtS!os8{G!<*9uP_6rLbO+B3?PyFPV`v}_ z4f&ptp1!2;sIZVm)yqKxpP{xjF+9BP)wq|223c>*Qmv2;|HQ#`%Z)^`)vm59NbBIn z`B(HOUpfQpU2D6_#kcD%y5ji6L0WFS0g^b;)}6nS;@g)3yDNUFeJX2wId7zA&Qx?x zJTa6_`pgzC{qsyr_=JQ(r+-tV5%WOq+uo+k{Dupci0Ec-zmI<ErRcNmwqQYrveD)if zgrEbB$qRJZ5rMeqngH&x+ZFWMc0;*mn|NbS7h+9JKR#4w%zg8w*=>bpno(qI^03No zzAbRN1NhS&TWW(s+xhjHYXkDQZ}amZ??JiguzN#?jD8};pfRpCG@DbTSRNcs?_a-u z(UgASK-TMA%oOa1*zUz{`KjTMBkONtV?W9*?v|!B4Vq|chsgypZTCUSUY5A6s)2!w z-Wg+%4ZgAD&ZICPMD@Z*QWO zq{(b>CT|B)cWl=}$Mhvjj@vo(++e-mkucN@5eyelFX`!9Zi1Ah4PEtX8PWzwk!?Np zh}o1nkh)v#aurL1apW}zhfQFBLVWU<8Jssxv*f^Gfpor#MK(o0FaSn1hB4v*-Lr=> zG9!bf6#K&!`fcghugwRwgNZ2&=KJIrl%BGKyoN}?3(3%#PTzFaZjBZ|1M&rl$MBH? z(5MQ{6}tQ&PE%5aK=j2q(m1WKSM|`7-q@J?g7+J`k zg7#;^=59R`)6dE&D>ebS%ls~~c=P)0(bR|FS_C2IpL9d>tq-8L>FyQh&I>%-%uY;v zW_GFCe##%U(>FCm_@=!v*Ti@7zgU3R_L|%me6zSvZ8=?k|s;pPs{D*P_ z>wP0DKj=#b!4V-h7+P8R8PGja!J9jmg#?{$tKAaFF{9PhwPBq!?(BlV2nc3ghpGs! zDr>W#;%93!I6@QqGo0{8OpGRoXu^(ld;$cS^eBfr_%DP`xv^3x>of>9;q3>q6-j1G zW@`OU1ZoPZ=GmdR)R{<2NvUZx7 zB)&n29fK%GD`l6i=)6teX_#t^!aE(%HIHYXfqmKtD9i`lFLhzrmT%+DJ~Q#&O+`W+ z_7?nV28Pjko{1@`jkTN<3|!HxQc}NRId9I$K6wlkW6X)&+E+G!ubOSXs6rM9R7m&VMAGZT!5O48 zorA8ct80q?DCBPK49q?6SEBA+TT1OgVZc|PzsNRGacaQy+MR=@{=4D@EV9-EAW#gu zd<_^Mc$-9}NO*TvVa=uTNT_{flt#+T<|x>HRGtnJbG;RV1dq#&ZBvs`EJK#T5biex z5#atT2NHIgfKE2Fx3?k_hDXra9B~<6auhQf$(?K2)M){j5Y^|JUV8lKk<;YIY?IZ? zd9eI}JObcC$H?W{QAlKzHzv-sz+gcr{!eSZBp^>WsdI4xpOvRiMQh!0opat#Ru;Oy zf|t}Kyg6MTVN(9_`)x&v-b4#Ktc|nZBQjx7j6KrxW#+d68bgpQ~}5`cj6*Xnmvuv zN{|5SKc|hE=l=r(E14(bafT<{CM^0QHHn zL9n^O1As`gGBd%;YH@WHdKb9jw%698_<&2SNQJn2w_x;XW20PwIP{NTC8zoQ-!B>a z7I$Y4c6K!N^w`B7B8kHO0f^PE=t0Cu%rn5uqN&B?ZU#dVj~qN>yiLsui(tp=%^5FWNzem|mHd^K#M7WzlO?tb@yV z9w|yU82$^}Cb)eW8j=}jhD3o_mhmuT|6Od0mMim#p+S4Zf;l}{mFS;;j@@G)pss<* zN}i_xVF?bNRfIhzhw*n@gwFVKE%Y-SW-T5)2sXAXY&$iMfej5-=5?IByi!&@9>4#B zZWT`4iqB9G!xlljfLX>YYL^yHFjlrf7{*cEz60#K=2K0evA|xIk;x3P`~*7yGFO2h z52=Tcj#i}e%@Nem&<*BYwAc&Hx=c%{Q|n~H>A#@g1B4|Y;j%I?MCPCY{Q_fMCB2tF z2CyF;PRdm{dY&H%_c#Hc(Fk&hh~5+z;=Ii zbMy(g4Ls$6!SW`5CFd3+h)4!XUqK$D#G?z*KMFOR+I+N4OiU2!xL{L5Bi$1L6j!(b zXrDnA;J4vn($vgoA$B%*D$R?tvkEYq-rL!kH}L_b5G)8dP19H&W-A6MT)M={2-s|2 z7UsPS^2~OQQC*fU84t*5a9l758yFfw>x?T{1cQ}pVUhR*1bd}jU1Rxo7}eF)|1;vy zdRd;5WeiS6Fi_qA7c8PT>V-JvhYAw7*AdUPQV^~cXbwOPTM`o?uTj~}O^l!vY?3U- zK?n7+5n4g#I)Pw#7nP*oIVt?~(KFGK;1`0c+(;<~7e-s#H9$ueLt9z`Uufe1Dg?g+ z9_$djUZ1mKtg12d?JB@(m~3Qv1gUypJI}t63Fv=_J=j5gQCR-z{o<|>NO*2u6u`NL zIzFy=6bfPxy;ZulKflB$QLT`$iaLh58&BW|6%`fmXL_>KBZ<{LVh;iyI0zyvg@y%! z>vTR12>VywF`GY>E{F`esUMhOao-^K0WLXi`48wWAV`%mgm$)401lo^fQVdbeLyq> z)6|I-N)Cl`QWyq@(Bu{rc*5ub#Yo_;Bzo0*zN-fVca@y$V%<|>aj$MT*$By*S?TE` z41?)~Ucy)m@7N27nG=IZo96(iKmC;r?IiffI_r$FqKO#6Ne7bF zjE&El7GdfIHU25a^hBkdnO zvgmvHQnK#kYqmV0Gl=}!Z|=X$eDPvo-sP|@Bn;v%yvN6C4&j1>USwbd3xei|AiHL z&NI+>7`Hv!@HaYZtgC~tsLulf5GUB+w(`9r;`yW}VO!O;y5L%N`3BJ5zB1VdR?bZ0 z(MJ|0W@c=V^IWcR2^XwEphO)2mk+E{(`BE)@ih{RJ1|du`uAX_BFrbRZtWPtV?g0I z-Rw6$F@fr*x4BM?o|u>W`TI9JD=XX%21PFq+CokCNS!c ziI4BCrL25#c6J89nhDtG#xf7wL?|jleqIlv>9fK$e<5WE8_ zH2r#725AW+7aJ(LT*&o`z>gwTt|JJ}59sg+o_QC;P+!>s*^qk0ok2BwTC$YYU@q|2 z_ZtEN*XDYMhBRZ+L^ayoKjZ+)CF6H^iHz}h`{bZ#4Zgk$lK zARjY!pK)B1CTW!FRpKQ}K4z_1>xZjv3knPK3j4fYVClBY3#G+j^SK4fUm^6vF23wpY5zp7s{tl$Tb+`L-$L z(2DaLNd{*)Jy2uRvSTqYK;2r}XPaa4{Eb7lr;#bs=k%1+0j&u1y`Z2uI2Mpb=hSr$ z(Vzm*WQy6CKw(eP>}<0gDuX`COdrne>3Zz=bUVB>|Kf)zu|mO6!63FlMthLv!vyv0HBhL{fQf{eZZ+ zM<9=4x?_bG+DJY&v2@F=@|*!>yjO)~W@9_R45DW+n58e^LxunL@9OCROSZ@_hV!3C zo311+0{imd^$pTVav;7wC(KgF@~Qlq>1w_dL>BM51pJhbjwCxXlU0vM8=Iq|2w5;o z8F34%U6psHdU#pqzrzVDTj!VZFl!^=|aY60S>dK16MEs-8jVjVf!jy7^lI zv>^IBPjh6S;3-~iJ5TTS=Vt{pf>bmM+60k8?4nS@bx6Ewn}qCaDGz4ans_gi|KG9 z0ewx^1MT^ksCWy$sqv1lr7bXghG^H~W3Z|`eRrR`{&HW2#G{xX5D0KPg2(wTRL2vJP|xi+%_@UkYF}KBt)pYW>VQDaIb}#?g^4{JD$tu8!$rD(B?`(L zz&z7Uegolc^%~Nni;-j>ufC?Me+^AqyrXdR)Eb|*1&p!hVpGkHk+r-(*ij8{LHdFcX z<-5O0yIaiKE^;3NO@J=-Rn;v}-X$d_e$7#g-=-^wx|j8L|BvVgaPwey;WcY(BB-ra z6ZRg0Xu6NFA-mNL0VlkACrh-p;&+*rA);pKJbc9S@vn1p+h)E^On@JWZN?as7Z{+> zj_rU^a|Bx~O(hKsn(=s7y?QD6yhQwIMN2vv;)p}xa$PV5G}`hc?2>Vv3kXOuo3C;n zZ8X`Rc&@snCSqsR@UDW1Ecib^sQauvQ&8tv8r_CcDrF`+YlZ#X1F}o>bjv2j zrY9)0_t9??%f*~DvI&}C+GDd8e*`0h|5!VkkSeVL%oK|30l@cz<0{vk=jr@+he z_xEQ9&B7LL$XZT9La-|@9YKzBjzaS_HKs?Eq`)P&W%&+~xuHf|W(mQ;N}gzCb(Qj6 zMHk+iKd0+yPf9J4ON*v(=Zp`zoGkIgDS#k%nIC}_w>sIHPk$d7p&OR26OEj9a>^04 zv=yf_=!>7^nWa;LDz4t|*Uz8jRzfZ}b>|N&+w>EUTtE)tfF7J&9SnW(;(n=Q{b2_s z{Z!SpJ9jpw>no?Ph(vP&h#MBBQr^Ny)JJK9+j54EJ^#?vHRMNRU85f^wr5hq1u^ql z^K)1Ho@~B*tmiC}fBhe#-ZCodt^59_C8VSj5CbHoB&89N4(Se&mXdA+0Rd^0?(WVD z0YN~zrAtZ>Y3cYcJiq&S&I`vGB69hSz1LoA&d((F$*L3aL`I`i)oAR!i`Ozeok+1( zna(jbWX(YA+-jw$N0m%Zcx7yw|{$8*pE$qZet^vwQigva>8i3z>Wzpt;E)gA% zx7sOl&j?*Twl3>y;@u>6tLI*_jwah?3aEKA+2DPJ+zTN3Z{PO*q*EVWN$h)T?%j3& zh_DlN_YVjtyY~?p^;G$swP#{!HX4XWJyx)17x-L6@FLluAW9rCFO@0<4CzgLWn+CgC`42isDVj zH-S$UdR0zdBN4s@1E)MVAI&$_Yb%%PeR(^G*qZZ?|(i*^9;>KdN_%Z{px|j&`Ms-AFT-p_DFpflEl} zO+Hq}n(XWA@tVe-M?kMF)n3vcbbaZw$yX>Oy{y~}87y(6Cc^fiRsj-Mhh#k9gr133-wuFi@Wrk#_il8G$ST1r#7Bdn>=MlN0f&dVeq*5zjVXfzA>SS&@E=&Fl8$ zUd={lB^OUAtx77&C7him?1*;7VbNknJfWs;o1ahBWzlL7)x8*?bcqxEN|3<34|y?{!)BS5;=_a9JGW7NgUmOjx6A zy4`#=S&roD>dp~8*V)kl3C^_RVvy=Z`Q)3|;pS7QE?W?wW!kLrl~gFjCN=@VKG?)` zn>^b4lM!rN=q6LXl7|mqzTzYb_8DE5>+3jPTF<;#UjUE}A%AEiz&V$llk;ZCRJoBU zXsjMH7eked`EVF~Lr#YMN%fG6@CB+*AYOs1$Y8B78X60O>4J!NpMRvss^0x7o=;|$u~ zE;K5`g5UbQ<$Gl2gzi+8d7FIHIN~U^91G4oApKhEB{g5~Un%Wcn_j zB$_PZIY+Jg8ZnIyi;1AUz-)8p?#1XQK$-~z(dl<96a(0V(jPm=7YE7S&$r@*7-`o4NVP4Ve1)Q zr+UZVYH&1cX;^{haLEc{Y3kHV-g4W_eaJ`qD1dKkJI=(&2#Q$T=huesW8Veb5rR!c z2m&k8==dW%4_xM6E#zEu9Jan2Tl?`>HV`=t0-^AbkhWk?kDQiu{XvMK1$Ho56;4wP zOx`*pgt)n#eiUi0^|N2l?xccbasm(`FiwKT#}*J`K$ns$8-ETt2Is7;wc-4NRJJ+l z6BWiph>!6h(CSKtLN7YHO^DUw0&2fXxUcj#y(A~lXLjL>AV`dijEozFRF5=k;YXcA zyU$dJIcz3DL{nE!@sN>e{LkOhOQPqU-5DF*kCdwD=!(r2 zspORnV8Tg1dI z?q>(%w{)7ljHasATg>yzAsPLW!qnLK+HJ7&MNlkWYk>n@epg zwNy`V->};rKR$O~JisIH7i}|L6A8jf6#)n_KFR3)*6Hcap`l$!e}^vZpZV1IUF2xY8Lw;Cnr|ym z`+z_ub|))-8X?w%5ZFwWl|*Hqt2~}}Fjg33V863_R*OzRhH9j0 zq9OV$cmN<;$Ge%(w8g{1vU7A?DcOcIPxq&umE~ohh$l-UrUQgaq^ew8jm{TrF0H>guU8X`lMCDXpfZb^4AvtZwOZa;I3^!*US; z&i~dvYuMOe6n_CvS6f>fNHD(G%nN}R29^uhky4b99y_|0jrtaBq-7&PmKAkZ)nO+E z%Yv>I`s#xjkz{gXqGybSYyI21Hv6=W+O=f}$0IC?wan!h&b9G-rv3Bx+shsPmh|z5 zEu9wRbd1{w;^BrM<=ptnvo@Z(CFJsT>+QgLwl4~YGgiQ^Cx!y_`!}Zxjdr%n=KOLX zLSymtUeh~d(Pp~`w6xX>J5K=*of&Wx`8f*oUs|tKZkAjvoO01}r!X_~Q|zGKidLGq z8=l(qc74NdW3^*Iuj!AV3m;Fh&pK9aXK90zMSgZZx8-HWTK~PDL{a}r>8x8lU0v~9 zmWRXHGVqAQINWJ-VsY*Z0(9=+2O=y;daEhJLW_Yt+#3qdv>wm4fYpyIaAUaqCdFN2 zojv?Hc0*@Dh|lZ5XG>RWsWk-^@Ae{V0)PKEje&}Wb)2S3f62>t^yjE0Nnw`1G21oL&oCmkWFN{jB}Ob@IPnz|UK& zeU!{F>Zp5XrOH9AN|N2$ud+G!SIi~F-t?oz@Q=%-TvlDa8jt<0eMC5wO$uK@KKn?5 z+R&Jj>lxO+MVYY{G{>W(qlRq(Z^!8w82eTs=OAcK;k!oFg1MXirQHu(!=Ld^EH6-Mg*QDffJ z`*KMGr=T0#IX+;u&tLJVhMXcB=^V-)1myVhV= z^=q4il2pHLfnMe5zi~14%HbDNxJ$RK=cB)bJUIBaUdYBe*sMS&ZK-1eZ6MqzmPq!yZXECa24Ut!HTno~yfv^Trl=_AEm+1fx@4|1NhO|D2WL zfZL(3oKzPB#dxm?&uziRfnZ1X>S|8DYMX#A-%Bx5xy0A=^Ox0n-tR94q)Oc*_8 z>FJhMNaU@0iAqZ+==d|DJUZ5Si%V2Y*Kxn0J}h=?R~T2|Ajt2xTG4E!%Zj|VWyq{{ ztkdSx|3=D;Utkek)6IwIYHOBn0xPewf3ytG&h~V4V1tLPmuTkE&%s4=23k4+T{jL7|~X_~*u&v$ASxwDY(^UZ>cyecsi++yu`Z9Et$sibzUG zFwxBYom_asLJMnmS}n)pB>urdXIFOtIp)XWUpZ<>CmCdcaG6eiuKX2?C`1<%TWVxF z`}-SV)agWUyBg#Q1P|#|RgJY(jfE&i3zdn2>7G8#mPrjt=I6Y}kx{Bg@~5qn^`|~l zNWp&xlzL$3*~Y@&4IXMu@NZheOns2T(GuAIKQuniDs?4<_G9K3?Su3jC`oj6cW6!|AXGQgFf4OTk(8 z8^UPj-ZQ3qWFhqmUb#>1{$pI0!rhN$vDi5HFVq3>pUT&E&QAA+>q9?7>)Oc9u-|`6G z7VrJ+Y_MvKnM@`TQxMT_XS|d%(brFQ0wAPxxy` z2SitC!|?-n`Jkr}wix{ddSy7k$?ZJ5ZfD-+v|wo2aC){`@hu4J{Lq0+^koKfsJyHS z-H)}$I{RpbkS`w_xU3hnOQ**Ad&9zy?U`6xWktn4Mus@O+?Aa9ZO~ZVS4N0t&{{(-V$QH&K{Iijn%gO&CM{aYe@+eah7rGj7~0W3m44 zW75z$4U!K`-55>G!T4 znEWtwp*}#D>iPaTTHVJRc?pmoV(BQAOiZ}G@YqEtMa0KHqNZkMy-JlC009mdxd>jw zmo)M%VtWR2wmHme+5XHl3%+G#?(nLeb)!XFl3wWx-d6QdpZ5;~%z}&zG;v>ku-yb_ zaT1cMnk#JTgJSb$2&pxun$qO^7c0MhnW6l9ba&zZ65~}tp?J6UL34Qc0CWwYnLsVe zZj2ylStH09ae?kTO6s%c%KtqoUN7|s6(OGBlF0&k`rI|_+?QY7;;rVmw>#8>219H`x z9M&t^L&z5Qf=QTQegVB{&2$qqOa;c*m<_(a7}>?TgR&1CRr{nuD*0V^Zs|xXA21Ea8(Dkjx#9#@3ToGU%xdULPFMm zVG64MyGNK0P#Ro@A`waP@z>e$fcgWqIc96x^=kC5U?x!d0WF!hBWuuz0nHx3iAFF= zybtKHuK_>Txapn@Ec`4l#w~T(SS8iR?b_B;GBkdCdCpSu@%K>W2 zY3s~t8to17n#(&hyB{&Wls%&F5{X1_|C+ol`%bVpEdhggGEAKy{veerbAzO?1vrYa zf^4KEUjBK+^kJaLgOSX8e}9mxyv)0zX9373G$Ely*fDh~oH_*ZibXLktpxC{D65g? zrP@A!{ta@xA?qBZ?cIL|VMcy&e*PkiGQFSx+n2$N3^Mwly$UfBR$~R(5T-#rP2%th zBsd-riya&+4Vd2D();3I_J+16EghZd<^;RzJqQ#M05d059^}FP+cBPDF0ws&;W54(qP@ui2iWH4$=0GVeata}H&fdT@tHt!Spk%Kc4|2rFf( zE`+$%I;;$eG`4 zAKsgVX(&vN!J~}%-)8p!2}CG>_X3gwH+Sn;aBPnnQV3N`%GS;<&pD%jJj1uCTmUN} z5bQm2AL9l+wT$Q!#uU;rpHi;(JwB=p;Bz;0`5EVh)1cj&ub`OpGTV0v>1gf; zI*oYb&eu06KgMiURZg8s@V-zQMBqwFi4gW$oI0QExDTqEXekhfdRm!T+{C%pl0&Ab zdRHg+3G3xjtI@!Du}-}kP$yuH_iY8H17UYKN}y{9u11tCDgpvq=(|CN7L>Y4&VoPU zjVRrJLrjqj&UyGo|JbN4JzUt<=#owJ%y z<;44SZa$KEd_*$pPjPHc`M+m~qJHzLRLw@wuk5~G_U|?gm?$B&6W+ejAl+;ESLpWR z>fkX*=Rl{r^sz@>)MeXe}yw}^U{urC_6QuXPByve0BNj3e= zC3xaw1%q(-9KKEsbaLpqUyEX06L?2WPfE37@sn@sJE|BIUJH)V8+^?>iqaX z_{Y$0qpxo(3=ixt&+On`oCX~d$W|vRF_4L?LXwhZ{BhPm?-Td+k1FJd<1jPN6M-cb zgez-vs%mPa%c&0S!7Cc0FbA;Tn|Ax^D-N^T58>hAA3y$c+d-ksG`EQKt_$-v*i?NY z;0mSjioRj_dvL{4>W)qQo0R=>?erFgjqgH>w#NLT&D(TLB@V-0)rlbzV&3G6kmya! zkN$NkiuyeV=nd_@ z9Fl$sw`%%3WDfbSNeD$wjj=a|hP!~6hK^R_*#)Au*}DZg`)I79YTQ@&W|ES5kwfzj z9zK3t07EEILr}$8coGIHy?mJub<9Pv4>i zzl_OT@`q3)yQL26Y1(hHbXU(IFG2(IBHmh9NL#>Fiuf1ep$1Vz^70ZAs2raEmaT_; z^#Q1l$rA_{!kJmW3dZEmv*h&XFPxi7cGFvv`DEjNRrC)UQ+|>brkMTCdlf}}NbHiYW z-$K3#Dy>q@$`|VDH*6H&fL0j9S2GBJ`9jygnC?#7>@zs$hIS`2p*DpXN6K$EMs@3Z?NKR!Y%Og;}uzQtE{$x7HaS41Fa8-XWp=RG=ka& zMz6^I^r!mGZZIIh2`*MEP5^Qu^gp5^3<4AYm_FIjfzgd2PzapB+js7OtpO|e>&VDH z%yu(hu!~_q;tEiB+!tEDDyl#Q0L>;aN(ngk!J07NOlJKfItqH_WF(1cdByne&to&f zL{*MirLfpl$FS!}(UC9YSn&8j^5T?Oz~X8Ys8)fC?5wUbdhiH(9Sij zb|q;jFwv8Xk>qfFJwNNU|2F+`+CV$|gD18ILPtcE6tV``zw8*T^4AI9>KHS{;BTS3 z9o52_L!Yp)uyC?Z<^iHrdU~_<;T5Q!38k2PKr-=rUG;0ipNR?Ho5s)-<#@X+Nl!t_ ztW}heQQ>}6^6F3z`ZhC-uD?rk5zyL%h@KMt<{>z((K8A+r;3UqZvtqN0p!t-EqA?P znXt9RY`@C7e>{nK^E^3OcQf6xr;Pt7l~2$~$j)qJ=z^lb(K<7u=)G%s6(?bz*foEV z;3boHF%sz0-7n@5WCCeTLXD|6#eu8%o=)`Q!h4)I+%zYa$yadJaLkA{-A8rnZB$tn z7l(nD=3qS^<)1#;Ri4dT^iqCH_jBADzxU(652F)_;vn?NrX6w5_^$K>!mKBz?*`kf z7_q4a&T*x&o7M?#OUAv8mU1QTYxTzgzw}J$yiZmZ4a63L?gg{@41|JkK>fzj?0)1m z*LZTfiA96$UfdzN1k|x_tgJE%3L2dLSnwmB1&DkM3oFq*v$+=p_G3;n1Lu`)V}ln% z`XJrHa`N0?W!~M6=g0-$cvo(fualjVlaP1H9i0P+dfLncN0A`#n+WA0Q})-)(?Hnk z7jehO!F+tQm8=*ipWNU9W)k!tn!hyE9v$vh-sAe+8ZT(YH!bXP{Pt(vgX@(!q9XS^8>xyouEFl5t00Wz)NXM* zyw1sV#zD5!T`iIPE)}$JGBw>AF$Fc#=%@+yV>}|RV{RNhbl>2cqoWLJs9plmdD-`G zN!=OTrp)VlqAY;c`L*_^92Ffkb*0Bi1rT}8PyZHzPwEZA^Q+_fFuG;&zNe(R`VstY zQ&ZFF>8T4b{l|s|H&JnLqujE&|IydU9Ntb*35M1nX!fr`Fhom>2y}}93Q5p%appfT z-?FOMoshMxV(0&g)9=A2pSl=_w{OL%2=8;V=!uIn2nm&sw*+bbV6~X4W4YX3lD5I*ZAdWhgRo zQmSf9H;PHV3)3)AQ{4N6O%fXvDXOFMEO3kZ#=)QAW(8CA+EQ>!0bk+YM8o)2A0}K> zaS-;4FI^E`?hyH=66Mul{M`or;9q{4BJWfd{VyJ*%+pGx^2H^|TK`lz-82m@k08UW z!n3Ua-$qA8MKwhD%m_>}9y)Kn1jw1NY9YUmxf5G5XEoZw4OyEVB{*}{CFXWZ!w(G4 z6bP?Zk5R>cy`SK-+;CyfCME_ZibOS%*9U>VV2DINzL5Q(0A>Kl2#8ud^xVAhHzqcA z|NKx)N47VkL6e=1^t!r}4En!@kgMwndG#A0AD?@A_v%$uSe7>3Z{!~@eKTLCB%?h( zIH95@kB7-1Qy1+#nss?~{jIJd`EKA85`DY3ms>isK3ut-@W_5m{tg8h1@&=L9s8Cq zztj38KF-&Se?8~-5wGY+7?7;cF=gIA#FRt2D?UX0XlnS^w_yDkCH4+|^~-J0_TK_j zj3P}P^%l$j&f-txwY1#&e|~ZgOF7xt;?8q-kBuEbo5bO13$-JgvFrayqVeIrJNoIF zo4aRU^%G|1zQ41-kL!4kC3cFa=9~ZP(Jt$Q03T_Zae)*?e1`#TLxoW8U*n_bSbS{I z_hDiBMJfVjqxt#bNkvSL9szGajV3#&EKl0~)rzm~l1W%CmDZ0uF87~#f0;*5+|rm2 zoh^q-XV2$h-2$G`?~t7T^#e?}k^3H22dKsRP0C#&Ug$pJ=B5g!;pUbH^!@+$LHvUY zrozPN$ci+M77iWH^pa15{t7HYrJ${DL86F=4R|E~><=2wmS2OwLGdHsjOW_q$#IhM zZxpTIU^a;6K&*GGBRRK#)>YBs(3ZOErsV*Nsk!S>8Lh zJ7W=?Knzd`YE-`7`l+d0qASp8vJZD$cO6_TJpQo}hQ* ztFN+7?!8ZX6WDI?EPW0-tLT~2)2}Vj74n`sUb=Dg{C%K3&qUo@c0>~BH&=gs_2;0w zJ5$Xi@c7Nw1FSa#=yO(sp*>-B$SmjB*x!gSch2fxAI7*Ucj|tz&U_ zOt;F5>8ACrs3kOEg(h7=j+g&_Y9MqPq2cT2>($vwM>@rNm#3xAb_on-f`Z9EW8fuV;XCr|h1clMo{$Y6BD6CXpF*8EC@8q9rZ~j8@Ynj} zk6I%eP0c%yPg9U@c{^Us-S+H-iw3>*&e-gqi$ryWq)U}eVNVzR6b_a2>CU62fWuEQ zQ5(aRHovwP><&GnZpFV8c}U$_PfgsL%C~hA9cabxq&hyTRc&^dsLpze=%>AvpVy5W ziv9IKXHjau(sOciL$nm%qesvR!@;IyV0b`BSD2I2or|s20_{EGWR0hfATq-E z5ana9I!h7^e4>934-N~toWAHuFuOaaB-Fnf6L+56rj`}K4n;+ zc&7`?P`wLe$&S zU+=~eow=_EhjSNjQ%qqd3^FCMj|)po9WhiDMELsAVZ;?S|5b=;?u*MkHs~} zlQsO+LESrPc_e|m8Pr3^I;WzdiEtI z_&lzz{>#fWh>kuxKbw@T1~=8PyAyrZsmaNI_GhDOd*R(KvY4{H!E1JK6@{bPyqLN( zm+_)F1dpy>Ay=<0XVc9Qw@<73_kSJ3#X^`%z#f>Pq@?!ahhYQv2bxP$$E~3=c)XhZ z{E||Ixu38b6<#Rs^@LI7>8Ig-Up<4Q&S2=oF3n(M~$ z=P|dNyq6v_Kbp-m$I;Y`hcV_s73bVra!&J-T$}IOCKl39wsmJ7ZQJcXdhno2P@(tn z0?O)LTjx0|w8tv`9n8Ur(VM&^+g!z#WLmB9 znKuN5JOw;g@U~TatA9^HuXq;W+MW}ZoYd%%N!vG&!s{F9Tv&70hv;3RTCw#Ttv;{O zI^SR}PVT>_4NO8T@|xo4+f8;}{kTiU#w%b^uGfC?J`hDeZmOlZWLqbp%FGXkeduKh zRqAh^|AI*$Wc}x=#m+OTr7BGkygazSxZ@R9uD@KHK<>i{#WJ1qoVHkh7?|@wR z7uz#Fo^}JxOq1`W3vj0qM|T$1&X(Gy$JMw_{*t%mj#R79<1&%q-{aTR)m_@`%G8=# z@k;uB>*t+Ef(r#KD#ZHK#z@!{8K1AOKl;CRvWmzbe&_iwuDb9xyV8-xvDYqAAmVHf~WM=%K5IJ`%XuRW{ovd$8-zlLo>(tIl=S)^#Zn6t1;vf7ApY9 z7plcgxVSjQ=iS=VFX(o5cB#=7&re`<=9G-!v6)S&eLZ75{muyd&@+v0QlVPa>QdmP_^Y2P0L)5mWDh|JW6^wI;<2D^a@4t;qQ)+V= zIe(sxl75^D{}cwkave_wnJ@$*HZ+vvx{9S+I3lsmF?{va6qS2o&U={f_?AQEOTPzn zxr2S!{-6HXm9wvY<|6p~|t=s@8kwJfZHGdgQ5y12_%7G`Tc zy6xs*$lXV~#&kZUxgI89GCa~SYBuTFk}D+D=e0-SZ6ht2sS^VZZ}98Gj1|CoP;y1w z*;W)+wVE5|8Y|F7IcX*-uKZVaE;rL(3z{B%Uqg_M_@uIK+oZJA?62vM@+jDcyq!-j zaGE_`v*vwAZ}$6_^^7CIb#e6UL(6~Pw4y+C)Ec0ZZ>=d7(Z_aKs&=W21YZW;^u7P; z<`}q{|2M)genIGN@EHdhEFi!Jmq1_-bhtU$*}=5~cksgp(2cz|HAZ=W-qYXvI6a>1 z-wz5-dzgy^_Dld$!>^OZ?Cj;=zR|$SO&Iwpx=&UH{TcS>_!LGax*Pv~tg)E*7N#N$ zbHNc0jlQKlkPX6kA{%u2aIGF<@4XGW!@0}5NXJ2~E2VcmK99I6cP6t{ee6!z61cUs zMJlUA^H{MQQI23MM}RXP8G(+Y{gON~#(Le&USqpnfDjFBo6u{%Hg(^`+0^u?Wmo6& zYBCvl;ik7Jc3N544j5jchYECPHcn1T0hfq^4OWw?un!+>o%KadZ7a6O5Q$|q{06|~0-s#q_0V7i7ZZ}Cda5e@}>?gBoFz_g4^-cTU zT259x%D)FkXYe6_fa(u;KqY7Mb4?1VA3uHr+>fduu?I4n`Vak5Q}uOqi@{c8 zH8oMeGmO8O_c9X)N0TQ4Y+~u>B^#7@Nn(0>v_rzrC7&fAsXXLimKrBkCP6_$Ldsn@ z0B@mNhYvF9#l=PZ81#tl3Aoq}qzFRSr|@SU3@qssQrP_Wromy85*yozHVg{&s<8BQ zzyP@LlB1O+_9)^$gPK}u0~dF6T@%7prIHJ-KlRh6@j1a}UuQk_ zxbO|HZuLMy!^D51?XDsrmz^B|9mxV_qrt;PKe_Fly{)}{VLsy{+K%AvLINM`id(Nn z$5hSm5=JQ!=xN|%BaL;e8zFG$%tN5LGBZ3s-UYZs ze|I-FF0RqD%y}{j3Lto$fWsal4Z$@FeYW9Hl6ypP5S{@COfU)oMWKHa$}<32F2kb% z-DU#=1Gd-S34o2A^VY;iN6!z5qdM!0#Vrlw9N??9(vb$NbL3E*RxLYme1Lzn*|Gw)}g+QHT= zKR*5ds=w`5`>ktFyKDR0~VLNt1EaW=@}Vo02QN5 zx0Z^R2_lavVAV)VO1_z@dUvS-<`_IG0SH4@(a?BpW+tLQ2j|vH%^_v*>~90R_aK*s zl@)@WN>eW<3Y*w!fHVwE-Q#0{u;5_$|Fg+RN zR0zmA@CEmwoH}%@*i8Fp;FOVo4!IZ-T=;Y?uFJ1!PF(6T9{T!cExVi?yP~7jyRyw& zP^$ufR3$=PM9u!r{;~t`T0`w;ML({aIZ?22u}fC7@)B?2Gc!HLJTFAU?R`S z>v48i3=T{XR6}le+#k-$mYGNWmp!Zk=Qy*^3fT+cl}yhy>gLRWzkfb~t1$59on9ey zIRYJoQ!>NIw{L*cF@NFrS=eLe+D!g|@?M87uNF^I?5pnmbu);>|5y4-xkgoc(D z20^boKCX{F{ruuD3uFdSy*5H*knd9R%vUb+B4gf2cX*w;7s8aH^fcb{CN z0l=+06{x_!219D#Q;T`mRGDZ@tkKHJf(8l3_|mKf5bazwo%&)EX75tc(pumn3{7|u zPQ?X0ARybTj}z+YsRP|!w34P*f9N259Y%*kwPHB@PMZb|^FW6aM|FWbEw`^#fUF%K zocRXMtzX$s$iz4Z4~&RN#4C9SAtorj{0LSy@8b(KJHwU2p;Y|PD|15tXIGh~=G*6uDkTO+y7#>^vg?l~e$ zV{vgCLPj1d!8bg!%XtJ@aiz^~`~{_>fM97%bFSw?3o-!4z)25x=#lZ=g@eDK>E>)T z4GRqpW@KThs5YM6w1u@^ziBc!DLEPFdhLO@bzw2xq?PRhXv9#27l2VW;|b$x zXKIR#tgYpBX4Fk0B&T@o@ljw$VCS?<%g!DHyK$F)9_38Ir*>FHdsr%pKYfChAD+Do3I|%6pPwK@k1|X+GWi0D{#|sR`IaGP zWZ+cPH-u$H3WrKUJTnM9oWP|7%7cN#wUYGo{`dK+Mn{EL4xg0N)H3ci%f`P5S~e}$ zH--gp(wJO5H!F*ncsaTv#VN ztSZ{c6w>ibtlqKwf5xuT!^+BRPf#wfh<-%x5cYP!{`jesl9>3QhetayIQYrgACN$e z)DjR9N_D&S;NRt2UUBT3pT7#!N3%!n?q=MaN0)nXKDe1FF(>=Zbu={wH{~8#=jltZ zCf0cLou8jWb*6IonMp`cyWRg2-NT2^ycuA>^;Qgs30>oH-OEZ5bib^+gr_YYMa~M! z4Ht-z%6h|slz@KU*hml-zEDzF@78S=fzuC$qw|%;e-{p^*)LNW>Fd`AvIAGZN6@Z* zHH!}$J10KA!jz@w?;n2{m5^X7lzoRW2bt^5o(TaVoV+weang~x(d&E0Yy(;&$DdAe1R*F&;cmMY<-LsVh!E#OBkf+IDu zf*mCedy_6S-X-b*G;|MHo=j^0QV3rq_lg%Xuolf716-Qw<*rwX7OpwiygOJp$f#NR zPa|10%67n(0h5=x8mq#J3fR(W@hN$aub@9&xphD$;VrkqKLM#4vT}(4iZKMO9XI!n zDslT zuQY6POUR3gh=33e6Prf6C3hR){j?j?u(E>Jdt$&+#fkUdrEJ+=_;mvrMpE(5BqcGG zB^4BMBX6DLO7Ji-S%Pivp3w1y?S0(rxbmYKt7%}nDM027ED8}7B4EVy4s^|QeFrwN z=!&o-*i?s6IDYX(KL;fw_(U`PLD8TloCS@uhsM!gfJh5*(?$>wCOo4lqHs-Rf}=^d z7MP^dN;x~(UDygKyul>eYg~3?@#ygIfw9ps_%VGvi8(xyAtq&{_G-0{!ri?SV#Cj$ zARC&QNh0dv(cU}WNqB{cf7LoLAYl>aG|mx(Mcx6^w6Jq~_jcH2fBlA17$SziA@Nd3 zx#i=q0tf%QckimeISlIr0Z}w9;CMIrfO#TlYaompWS(OH2FR?(aw8SSGD?T+1}upt zxPa1l!ciHAMO@(dHJlMqw)cy5Xx3Bc+FDp?w}b(3D--tT+`+g@I2se(N+jO{^&DFXt(%yLTyhwIHk zax!@ijFoWC?45&1Uqb2^L$?#Ha}7<$ss>1f1hAQZ6Dw_XdS)h+UN8S@J{K2$NT=73a!N|dq^PK8$~2o|X7~bq&H_-_ z>@1{%l8AF6XWO?%`EuRa%ggID=hvgqd%}^IvOs-(Hopz2^FTv{-4pza!oM~)2E!!) zWd;YZR+rYb6$hVJoS5JpyXF~o5`cO3j2zbpx;o}!}53k~oC z0_`<22MJVnqW`Tr8@Raxm}Q=4HFxuTd>_aN@#`|VhKnhJ2srUb7*&EQ z#(JXc5^lwqEb`#Q-;PjAC?#@VKKvq|pbS1jVt(}d%*^5(c>2v95VUwv!7!Eh#jvdb z85LuQ*BjndSm41fPzgjZI4lfdn17SZbauiP0iWsSA6RZ!)SmseM} zAbT4iE?JK`er^es{!~O68!FM&KF!R*LQhyt`$H+{7N^p&bVz)*goPIV}aC!T-A|-{2$X#6@ zln5>^ycZA5EG@5AKmMrVPsXT%RC3Pp);USxH&waG9W5(#4D{ibgHYDMxz^&K4RYPn z?)hzQQi6$`adoY*m6f%q5n`WC&9hSZAXo|oS4FP5ba?m)B)7cJdhL3Q=5m5w=gKRH z!2X++RhLIETv}JgMkgpGrz#~~(7^Ca=`f$;$?zk%2!qFH7y)B^8YTJ7)aX0TuBQj< zgXwMN$AHsh6cV}w%$1vq%kUpPy=%xd9a77##ewIiq@5pLa6$Z-Dg9oCjs$;FKNrDOwkT`F{`wrP%!{n!E3#Mk) z^o$QRbaavu&uXcPuiGejOp?f>Wa#K8P$3W?nbqAQiuTWDqd`*9k6f{v8OnmGR0-C?`tH#|Z zAbm9d_X%-aBR@u(9ml9Sc?YXBWyZ^iw5DsRxrj+AdEbiQKQJW3l47|2mm?`^-^L?A zN~6NU#AeYbzuZfvy9f-!#KntyYIm@Zl5DMi#0bf0COGkT?o`r-6B6J0F*Lrm+7Zir z{mr9PmkDS{dCo9A=U8PvY`l6i`aWN3*G^_t7J^%cmd@j$D$}PznEi-(Usq~byR}+6 zw~6`{Id!hdL(fY}TDGX@t)8BjnIe+%B_;W-yCkB#BCno#w9qvNPxt6E|N9Xr*B93N z!~6Hkaa|l{4-NKYkIv5ix+NDO=XQ&W19Ps?O+LT3kPQX{49GG?2W! z-k~8aG#i+hJm>X`DBFpMG&;kh@*3IS>uPg%w$`#gZ?SHeviXIXKuxb7?X<8xUp_gU z)AzwHT1xKbJr29pgURdm64Jue#SpQG+!flIR*M_6uBx9Hv_?@-e9a+p4u;`ePoBU< z&E6cPZES3`nfFRFW?+C&wPHwd0>M&)g+Uqe-<^NWi~ zD9*SbJ7f#w|73)O0OS+1vkS`0`;eaQ_4cjw^XJ5~;;eppADg{lcc;2{&t@bi2bPAf zUkx2%3koVSGJrJZ;^u~-Yc-T%{_@+2fWX=rGM#%Sd}!lI2enp{-W z*zFX0oBcfcicZ&4426rB;;yQOBBW}EbTfVkQav)#39-Szqq%>7Fmt}e+VgZC;dpWU zRWR`Ijj-c^$dM3gz(-0}I#z{l>wr`q&kWzFz2H!OAn|^;VPauvvfY?a-VU6Z(P8;= z>iBC}Nql9eY)}kQYhv=6F`qs>`H8Yxn4?tq*6g9@PeGe?i=42v_DUElEamn+G)5&A zYIJ9MOd~na^1Uk?kr41h8JGvwI=V1CnU!g7GEpF(ZBia*5p?7DGiba%)%Pj+!|v44 zdVXf$w{Oq+9k;KYQiCycG69~2~&jAj%XQ4)qH z7eRRJ4gIUT{La}u9H}=Xj<%mV|NOpENyqQ_`>E~mFXMfa)s@vvp|@H(&wS6hPtl(k z&0rF~B!p$bjM4sL&mVk62aUqTvaBZSjq%o7AuA-r<^iuZem$TooymwzNQ$|A>(@ZZ zAr~#*!=z6Yy^;!vzxc}B=iglf))ye|19{9b2($Y?r5$p54P&0G$7-9DlcUQg?-39XSaHrTC>Zo_Nd+JsC5j@^15som-5V;ow5+V*AM(r& zYi;ym`$zn(BV(fG8cj4$at?4q3rC1U+wlKP_QybWQs75QnPw4;(A!osS@G{_n9_Hi zavtX&`E@HHoxYG$vzjurwvy?Q)7Ijx;tUSP93TBryy-x=m07Zo^{vSL*#d<`;aUeE9-WTY4{qezV_dss9Qf-XZJp;5wfAGHd(NHBxEk`ZJ zxr4f~J6+gqNog4=t~hQhA&b`0J?$oA<4}qp3O=dL{{EjL%05H|YgtGu83(%S@-+dPhh0nfEVQ3b@a}5TBZ=E-IRW zgmixMPpE>tY~9vH6lB;4)wyevFd&8R=LUqw^L_`e0L62I?ZePsCsEP#swx$y>a1@r zPW4$?S@Q(y4UHa$Ai)_D!ryY*_)%$&vk#!$M7`MFgv61Zx$d04eCiu!BHM!{Mq_l> zd#{gMs~kBH=9s0r_-^z4-o6EkG%f9CBqWt*FVt%C^4RG36F;{-`+t+~~0RaIO1!<*2LQ%SulvbomNof=TX_N-(?(P&6q@=sMyKAj8m+$xPy~l|khaU_F z>f(tz=6%g8J`1wN%|$?<*TDF-x|o=|j>1zPTS8$%Lc)y`VW;zg(p)MAr%_>M&f~c=oN6o2*RwyDZXx%Jo+lG%8}~pYT^sqSNA?=pL~FA@c~@M zf9hFIwY*X>QYV4*w6K zV2Z!-)V-PE(WB+L7R0~03VvAWWk)75R%Z9&MS#U-#`*c@?>DX`V>S3Z^SJbyXIu69 zjbBn@7wFj_>Vdg`4cSfg7X4Y>ceqM!ihwsZ>=JC2bJ6R;@$vbEwfgS$pIM0uQD%Qg zTtw&E?3BwQno(8%s%DsYMn)f!gSt3mW%2RxZF?hcQBuBPMj#007wf*DKNIo(nm^VO z-2;FCt|KI$KUM0!{?5Q4CEf5k;>D`}6&N6p#lo=TR5Z}CU5BYABtZ)nH?Z<>dPhmFk= zE?*MI)JDYBbniCmJe zw`i0v4%@d*6EAkt^IXr?we}xk2E+vg9f4tJ+>@QcLStx&&_J#b=7IckwPlSr7#JCv zFW-EMEVzRnN7L8vS+IiR;$~JHVo9&zA3(PUB5C-U{RadmA>CG36Z zQ&qW~QBOc{#(2)_KEp0&aKc(P0i*k-MxlDggK+F6$lSBD%e^=kIz7A6t0gD50g)L1 zXsf`=$;8x`sR)*=S9PW$Y$9@V0|2rEIBi8A4;L5w7HC;n0a+8bAv6CG*VwWoX|}Ff z#s6M+YJB_&VNiBSPIfjVznsA3BqUs~TAiKE$;)eN@-XD5NdEejErL}GOzb7(l&WtYZ^~u7b9@dX+}`CMOw0kVq#?{%LQ&f9iczQi9lBYCi43N;Jg{^gI09pse2d zvETMDdiv!U=)JaP(X9>7yXWQ!F>=dmYjADe4LYn$etni3X?)41Lr(;sQAxXumlHnce7W_4?=(ohhCgg2{qLWvd;+jAHa~pyC@1ZwRqh))KKJ@o=u$s< z!V1=)I&vyisyr=%G2^l4iyyI?F6o}MC+9HBtQ48-q?ndd$JaYsj+QW#2oyo;j-ccIqsPY2 z5(59UO6=~ufAQino@DFJ?#>?WRja+}?9y*<@%LZ-?}p^(V;cC~y!c4D+)Eq=GE+tR zOis2CAbL5074~*GE`M~?2Adl$)1)nKeTDoyb1*34Uh+&x5Q(SWSlR8mgn1+%%b%E@ zK9nrZ7L6DDz0rEz7M7}Knwn1@Gw=xr2y#3KBFDW+ahIB!`sv-fFNvN~DT)G>0lg?S zym>?_LIoCkB}GLLg_)!eaXvKh;*nUV`OP?b7~lXAf{ofQ{x!ZWoMD;n%X2+vr}yNG0(}{za-D2BM$D9}b&{ZljCVLc}9~XR3r+HvmB2wt;W5*g0Y8 z;?fc1dZZ2xE?QXhz3}u6+SEEcY+doRZti~r{x{Uuhf78`nu?1x2LCd4NGC5P8Kx{9 z?460gXToW0rqKgo>yd^4lUf#9+Ob+E9!v#MNl71S=7@UdledG<-3I&bmR8Kvr@4L< znf^Y6Hn@X|@MwJ`8z>M~R=bz~eGUaFfC64X_k}pd$G<50CA77Xuz)-fWCLZCCJZL~ zqq0k9%o$?@s8!vrJKM7Z>3G!k0BfNwgETb8EG8VQDk}b+!x2UgDR$Kmo}Ql2vx4Bf z^4xyI* zn?TR*?&||zHMv)>aA|0!+%a4LYyg3yxP4SK1&`_A{?42s5mC-h6p(Ku-GZUPl&CK& z8^CRDHd*JgwM8SL8vA3ky}dnF(CM3Y(2pPf#n!N(bk)_dt*~lnP_nQDKmi6T`&H;@ zuJrw%E6VK8OIyRk`8KxG4RsC<4yt*Ysrp)4RHmkWa7O^-bSsmQEhQzr1(#VYESs^x z0O3cZ4d6&`6pz{%7g~cY| zbf?J)SXJsUpqp%~{8W;|jH4_Pz5B$BsMJFyu9|-$Kh*%|l)7-s_*y?c+mk~#-v54M z65tYCJ=~}c56=bl7f!$DsWe9S%`WgoMhi_zNc#Gf>Mer^1grT6kML2Yr18O4hqJkU zaYy%(XF2=1s%*D<;K@a^(H>l4Kp4#jqbH0}3Gy9o!d>C3B9{zAMK96u8ium%g}%w} z6^YhLd*g5t&8c7*VVt1tN@f`qUxsSR+ucCDU;WRw03|zUp;2sXp>1fnlwXGj zs4p!Yot(DPGxrG9;D~s_zR#R0p1*%Pynv(Z3!K+0Stf0-UfmcFCbj<$WLJTgKmgT* z=a(;B#&4fd@I$!g-Mbi=KkoDMpSFcb$Hl3l%i!o$wn(n;A#lTVPoI98oEYozyl`)T zj8kCXR~J)XUrtU*c}|htKi}`)FQbPgSD$+ciHN?KnIpP~`CRNdGb2N0NrjTS%6Ig{ ze(#SRgLxJ2OjAKYf&v5fMpo9pv$Jn6BTYduTMe;XEn!Ssll37HAuAKL8}5^GKirz! zWG}Ye8z86(Jo-l1}Q0BfTTJU%j#)WDa;thZmZv|US_tA*JytK&Q(E% z{%r}`T*Eg-Y;4T>(hO1(!TWxG_TE<%%34TB2%7AhkWUdGzco8<(2QINw6k?+a+5Lp zoF(NF&~)Sh!rZSJ`C{0kn)}7d52W|#Y+hFy-GD_EWQs5WClfss!IU;9*Ia^D0Ujzb zu{Y8!<60*^*7FxINvy4{iO?57(52kml_t8enm3PgOsUOeR|>H=BA?Z8&7NP#zi{PC!+?{0m7^`Umqz?MH!! z^Xo&*j?RG0LN(xL-l^kT2nT$-&fB%Z-s}U2u7%D$fbrx|) ziU6Vv!0cqUDh(X*df$Tu7t`0bw+J$PYa;Jo{CLRN_CJ^VND%?R2ME}clH87xhXxWM zZt+fo_;i<)d{>3*1>?pc3erZbn@|aLf1@cFQx*d^wZwETE;Skaow8bM%ZndOY|Zf= zItr;eJdG7Tp~osP?;?-JOmG<$IE<~GE7Z`EH9lx=iW{PljeS&bijRah+ZxgWaXw=; z4twxs?N<9!pCX+)T3f>wO*ILHL}YQccheT;|5NRB!}ZnGK2XA zOjtyOu$9pf{#anWi&fhBC*}3pc?Z;VA=CF8Z}}=6#O>HzP>+w#!>VnZ2Frg8=lh(T zU|kZgV2cqJTJ9uCgO*a==NisTlEX`wJevj7*VT&N?EvRzwA6GeSECC=e8JfF*?4pm zu6ooyRle+SV$IR_@6cvw6v^PeysV}-C(N1N==Ko21ppMpJYeJHT?TVJn0DZy9uu{~ zro)?PUv786+34o{Y&Q$vn_x>F(8oIKsgZ!OAhsVIULz#rB;^iEt=8g03{0&wd@DOm za2G5rEciiRD{ZVi3JR{9Lt!u{egGhGdUfO(%5uuhb@2~HniYUwNhH-ebtjxoqwjYq zjTVzs%k6A@=SJKa z5Ti~bIZ?0mKH^TV4e=@ujE*}Ka6zxR9o<_x)_JPkJep)oxwd$~(=@dgL4)h(8yHt5 z)xJXhI)4hQz`m!*Wle>%F?~UfYIJ?rDG&V?7G`IoIn&~gLU?{AeyhtDS~XEUa7K0t z$e*8!vfiG$!>GekY)*2;US_)I(z8aW97^`&cY` z4kG%c;E;Uv>ec0C&MySbI_x}_tzA>PS8V1Vih5m3ZeQwpgC>KxEv&|Qkil#`+~}!G z^FS#RMx=bnNOd4K`2G82N?@t7vT_#>7s-J7s7B({*T->I{WpgD%^mY_uPKI1@)Rq^ zwq1_&YayXI9>#RD#IIn3wf;G${rp`{aq(U_%h<;Hx}@H-Ih1?wbv+lCS7b(t{|cRH z9?k~D?uw!gOiPCoY@u^_F|epbfA6JQj?~q6smo$2Ocd?7^&4pCYOgV!@~Vn z&U|+dFYw3y_XvH#`L3p>Jr)7)%!Z~WEd>RLiI#6at)i%`JelX2UmzK;*gHO7aFTbK zii+kYXSY#`U}e2=Bf!SQh5{8o;pX4(i7}@snOyk^y@4TCFYy?^hg`YPkdO!X6H8q> zpFej$IGzIkO{hy_^0%^qi6q{fMo3v*p&#=TT)mQ9Cg#gCA2M~s^A$~PJFvQ>ZwfnR zD&r;ZR+Dy63!1Ip;}SKz`}C9V6_v7bpTfM1uL?u1iY&LiNJ(7Wm`6q%*XKtl{Z!V| z76Q$4W1Zw&w_2+7FMf@z#n{K)FWuceNFTu~=Qb78{e4P%D%M$BlNS#JzwU&e0o=$d z=qsLnh`+(={^iSkEiH4XuzS0q!vnGHH;%Wy`uX)uhXX6{8;pqx=Yiru!mE+DR>I?n zg6)O`?2V{ykQyhXw>n40PYATFTNRiO6q{h397$+pgjwwc#C~rz3dQA_mtnxX0+l%acwQ_C)A(x1b0X* z3!6$xO-#LWRLvtsa`Wb8Pfs}FXJ=u;TkZ|W{Bj)t%$hE{w zH-Y~C{rwpa9b*O}5|W;Q0ZBPIAD=e|eI~}4(h?HTLtj`T16NgYN=nG!`r<9#tHsFJ z25rqZZ)Q5Cx;vwz;EeqEVxy?2H!Caa@#Dv>t(i6hfBv|~$D`nkp2AE4;cYS!68?UE z>DizShAK5)=%kNYmEr?A1qD>Q&z~2Jswyjg3k$=+J3HUd;11Y~=H}{bZ3SYV9;>#b zBm=ZuSXg57xQ*Y+sPS+WhIe3Hr3GpvX;f&1`JM4PB1)r5doa(j}BU| z3y}?5!gm@vJIyol51N{5YCgw#7?zcpNeT0*<_X?j8_hm-VsNSDM>d?pUUrdQX9@5C zHa>MvsVR@mF=|Q0Vr2U4RR4r!jg)0;Dw*d5f6dOU&h;oT+SddKi;f1T(Vp!r8YMYN z$iGcaB<~i;sya{JoW+V0vg#b|^V*daT`IONvZtEt>S~#)RU~_LsEzsAdb3Ye{crmm%8<-7 zEF5M0CBLL3<^1Ks=+fL0N;@qdq9~FQ6M(~da=4Nib=V#oU2aC!Cq%|VMn-ngcU9;0 zSm*8;tKP>41A{K#Q4;zOUM8?5RsE7uTxpCiW?L zg{{MoPw|k^=jrjDQdxi7?D}$xTIY+E&n>mtJT8~9JdK8h?UA@z6OK=`E^+9Zu^4Jx zyNbg;$de=2DM{Ph5%(mv|6BV|ticXvdl>Al8#K~F4- zRE4o!DIULHZisXF*97hN#E!&NP*qLEb1GHNUR*D#snI-ng9%5d5&hB5$)bgNF4**k z^#Kdotp=2Oxlx;?-cM|CK{bYpLq7rZQf^c^ZIg)TpH zFZTKR6-*R@Sb;?kj7k7pbfI+ZtJUht3#{k!Km_cyC@oLsFHTOijBm?(p#Eg!Q}NrV z)w_lOKLL~L>6{yCT9?=Zb;lFjDs4bk8?iOnD`cl3oh_v0^k}T5D^4h9%NkWd*AfsWC8Rtp#bX;KQ+D%6ea+W2i#UP+qIr z+NrNdc^~uK<5HJ{rmyr@9xjXCdZ(=^x2k`g(ZZjhR<^nz`QJYP#->i)7c@t@2uP5C z%=!AZf&Iwx?yP6NcT3nnOdzvnVYVOf8pfxxLtAc-1{w%(bGtYU*^Af`blL$qt!znt0isZ$_oZDk-e zCfe8cgutjk8bZ-?i5Je&@;`bw8P=z|;sZrPlTlf3-KA0LKZ3={5( z;wBJ)lg9Ya5tbq_$mQaN>JK_tIG==vtJu6QdN%?Alg6yN$Gn4=F#mJx%gIfZ;vM!= zjc5HhUTe2jnBcBU7LjK?9mQ!@>Hg7S4x3 zUHnej7+Z>A>-mI48F^RxC06J$<>i$AtUYUSz8KXzZZM#e&FRbq_IwPvTYQF9`{YD2 zHok4lBhTYRn%$P+$1g9p+rgmS&Wex#3q@oA-RZJkKdNCNu9aL$yBfLunP>^M3&tP9!{W@bK} zqTYbmi%(S~|La6fn_O3BI%KgiiVv1f^xHgmxOiM#>~Ck?q;$l^<;23h#$|9DhNsWQ zL+UKG5*coB|H;0bVAp>P##w58CQe&B;4{EXZHU9JTQG_wNH_$kg!+?a0AI zdgr@{T=m!8$MKqk!~syL8FpsfU)9W|fqrB=PZB38#5mohrnq$Fw&!sk-__W*7~YGpBXL zNeujI(4A^FU+0g`Lb=BD)Lm$6RrTn%Eq}0^h!rTcE;5=-%Bc7n;k}eTq~I!G4kU14 z%`U=&D~GG;i7G28B(R2^V4W<`JC~N4fZ7+Y!4q!FD<2KXBr!q&}i$3 zZ+V-%O?ulAd$Lf;Vpm>TlJ--$I4dXPKJ5b%O0xEWq|~~y&GcyzQ)_7h)#o-T-)r95 z8sK*K=yp07Tbhr7+j=H8#d)9gijheW75`_rG+?fLAkM%W92|sh?%-fJ>{*u+=wQ4+ zl;`1=@chQb$3NXf_SAL7Tb!e*TP1qwc?Jfqvl`*JZ%ux#4y?rq zIX!kmV*Wzm%U5$BzWV;1sXQl0`YU13IlJ4ztL*Sa<#Ah`xSAYh!R=Y)ApZ`3SVu@= z1{dZROHJCMbAH)2OgE*=A3t%E3c*AE{3Pf_Sc5u#X*(Jk{+*&bxvPf6&tgv6}@`8M>l98gilYoSlQU>L1Iy0 zF&s`zMivwpn5a=vS!ruivK$}R(^HsY_Fb5qdNln~*RK|W3FDGCWGzwgob#ADJ3Bk^m{D@M%Ga|Ok6IA9CYpw{*Aq}w5gvVTCh@+_f>(bS?JhNY)70VTHsGfTTvdq*^H zuC-IT33qk3`Qf{x*O!`$n)ir_Nn-d7YKq<}hs5<-yC81}xy)#)FD@)>j22ou35fq^ zM*UPirBsv|_!_SRW$w!Wf|-A;nHNZZkgdWA^9o@NwBeyUvrGy$D&S8HAS(b)AFTI= zN7eh5FD{&f8*$f_OG`LmiiLbv`&m<3`rtzH^tA4Nj))v=I@9eDSEB_IvZ2oGdC~|0 z)Y4MEP^&}w7zJ6xbqWe8d#ECzHB#$*;$=Vz5G^oxrQ9#Q(_bL^`~K`u7Kq-KTi#Yh zy|vZl7Z+D9JL|YI1E2&)S{a$>>wh6tRjo4`-P`!rjPyxTCn1SEE<3;JPExK!!@;1t z5vYF?qENqh188StY82*{SI2ME;$-x(q9i3H+IN+(B`q!W#qZ`@Ym|@V$@?WbhK5W0 zZS-73Qtl8#+ zeLTdXx&UW-Xh(YfU8<9<_3i%hK0?B)q17|-`PLD6eTJ-@T)Bf4YYI!4kf_MBjjE=2 z9;tC^+N1Qops-E|J&O?;xy^Byf7(t-DNaX*j|m0sUs8eQ#MxP*Q$!i^@5Cea_x*u8 zir&-&oHL`M-o$TibZAga!8H5aarlkCWbl2tG6YEGQw9K8l=pQ_Q z()4IexB}XHR#uVmyY=Po$^`yh?ewhxL2%&5X~9#USGF#aHy2P5aEJkE>H}_ zu)cZormE`J%k!?8g&78B*2U~eg~M*%9{HsZ#v~=(X#7xN!mmSy zcq91Y^D!#u#*LdDOpMb2%Ob-5Ffm`haca8A25-V0JHId;0WOffetrOQ;LyVD}+MkdD64HZ=9dO?{HUqud;l$q;I$c=X>w>x8m3@BY0zKYGj_N zU_(>4vHThqR>v=NP5&baJ{d+l>}wEMd9~$u`zPC@N4E$u5$}cI7^Td$kg@*`bDQJa zO6%$>aQ?Sv7(~uo_0fVC0(B)S);0r`p`raLDetWJNTHLB4Pfhy-W%VHB`;5- zdgMJr{bB6zq95M$tw^^xuHCrsaD(U1l}t>c>*}c4w%qnOP7YaOKy2zo3|KRK0(EcE ztMQs~jF&yTNjET^oj=!{N75$rFfz0LWn%ur#wzot4Nf6X&k4~tfX(2(#mO~*&b^DR z9?sPu!@=1R4|0~0#<^I_b=Wf~EYuNw)@VdUOiT+e3NQnRw!po5b$D0}ghayi@?W@^ zVnF0H3Ze&N>Q8z6yd{aY+I7yd(4dyW#&#^h8YR#wEiih(%nS*rdg`DAF&XXWWM?0p z5_V5RfPWRE|I1_q@)=0w0E?IOX*C|iU$l?=Xd^#1!z-K1L5#g)*{RJ z>lq53hdX#9Z?jqNh1-Bgcxh<~OeGmuSV(T%NYW=KHwNJ2m0b&)7RVT({F$DcOV*F3 z)wS#4w*gc?O6wFrifygnwNFbCoieoO3jq?z!Pj0^)cU&fFO&lL=}1ES^(WEo;oss&NpEPXZ>o^1 z6Acoq;L$*23Hzt%627cMi@q{Cl=75?$|G&FueeX$nmEtE}#`vp4opqPE># zIO3_ktZ{s%6L2wPL++ zSlsyebGi`W)pKkL)Riw^g884tWQ~3K_vxJ6@ac%rQfWk%w*kgwEYum&oVC&RpzS32 ziv5P5<5P7nuJYT}PQvs8)!vG00`il60l=hnIz7G%MN8k}Vu(Qp0O3iLmLIin_mA2; zBxu;JYAW?jtA4NT@&)0gJDhwJuwR=?pc2s z!Nzi9sGpy2q}!9O_>V`cJYUmghT<+<;-6R5WOuVZOu&iiP&Ik-W7;_TXZ)lr3HNLoZ!e9myi(S^WX z8W`CgKha%&SQQ<5i|qkR%la#YSAhXO_t0Yt(XGH)a0R1V7<=INT^!ncrX}p^KtV@c zLm*@8+fLRv59X@6VPIgWQ*(Uqs!PNvo@g8mucIK3c@cp>adbR00d(`ZEB5icCEk91 zYn|CkHp$UxWxk9|mAXb|6f|TSg&*))HYP85_r{AUJ?DKRoA5{Z)$Y~==du-Y?Tff8 z3>nt?g^iY@pKsnQl-D>Pao=TNpr>y+I)K6~{>c+tfLop4VzP7(5hCLyatoTn{Lg1; zZmVeq{M=>~cnSP?kw0v4E+2PiPtN3NM(71yP8x5Ow~BYg-ACV@0>+|*x0tW!=dnsZ z75OMWotLlmQGaDSNTH8!;Ea4`XV#3{?)JR^vJmN}JPvQ9MFY38ScTMPh3DP#a_viM zwiU<|p1%isIo@eyd6oKWg(2f*c{)#3Ny0+wo5eV)lkU|$%+9!Roc&SQiT~~DV!y@2e>W4{;<+b4f96fP9IoYkRR3`=I(+MiW5K%%saMu< zJo#hxTO~#tSpyn8ulWUf3u;zR_n-R>-n8BlgFfbpN?eI*BXCY&choP7leLHH1s#>7`@17gfq|eHnq7Xl1sw?t&s!Oi!&W zT}myc;0NA-p6bqh_%qFHCr0~WJfSn+xG zt<;&U%$Qf_sz>)JPx0h?%af1wr{Dy1NP>gh8>Z^>$KCb0xflB%LjKi+=ht2#5GX;S zmpvqub{#Q7hrfPnh>FXq)xJC2@u)7b#gDAzJa#*re{)1I*p{^l=fBwM1Eeu+iTZp* z*F|+12@x^JBhHl(dj$gnF%tTX9>ea@1@M48xRaVH#hBG+z?MWgX19Esnu6W&eOGVq zcY@fe$6XX6R7pGaZtn|xK4E0iIF9l&O0{wB8oojR;1UIJB*-6WQJb+<*9R35`Q{xg z4i5EhCoR8Rv}!C!HcsqIN@=>2d4P60!Rvas|INeeHK*mvI{j!8e#gyz!1R7Uf5AUo zZf?2s=bH5E9*ufJ_E)_!=kl*h%}UJ<&)0uw8gL2HUTm)re@grb7zA*SI%6)J!VTG6 zj^dxtu`-U1rB>H=$_qJxmtOta#T|N{@={ObE!GLZ3|5+R&+Mh8rEHD2IBkFa*#5)D znacICak{bDe5F%q%`y_uN#HjgMPX9$}10mF|fySFYmV z_G%(RFcUmyF0K?ab!ikn7gvl43UZr?UU;mdwFEgK zpKMMqQgM^2*r=MQpPmo2Q>l-+;$FKYq(9!X;Y6ig&M>tOu;}4!LEfLXB{ezYuYt}R zcY1rc;}qc*cojv*B;R)%{BuEW67l_pdT`h`*{(nDsk__z|5R9(Ya^dxcr*v`*IDZn z(;1-ahXf+ibp~`J>g3D~D%s=xRyOdEIj06UCpy^<8MWxIU%y^=uWIsNJ(7Ob*eG*O z7!YpD)DB3@x1tuLFcwxxVG$7#=}3hWW$}Y`>5ry((sm1lqT-J}od$}Y)IZzo5hUM7;ucX(5y092)7+0ST8FtOJ%_E9<=LVxg`EK?$t|` z(Hdub#gOmzPt0MIBi6BNI29Kqyo0lEf=qjcsF_9pUoEms*p(Xv(AWZJorO0Mt zV)VI+Cm$uu#7=j5a8^!{Wim>kzTU>YIMs)d=GA;fUd7S!nSxqIg8TFg$CUR-S65f^ z#R*Z*w`dazQaOTk6U7#pTfOPREc+{?$)+uGK`!wCkz0&3+g1nN=B?0=_)_uwy;_Dt zpWD{Cp@p*Uvhm8J9pM+3&bI%2-6ezd=|wR@sIF_d(Ts?U82=j1+jInD(o$Pj*OZ+u zVKK!87xx|BNc0_YS_E)nZO?jc%|5_OPENWaPhqe%o00S~qA9NB`E%j@s&f0SI7%K1 zh-2>^AO8&0dWIr)c3IhI*aAm|AG-T&w>P6qSIeZ5R`;_($97V?}0{#y(}t@y;Oys=SXi!X%QrDLS~W68BlhmixsTHj+V!r2Z-2d)G;ZY* z=ZSpHNoy;stZ2U6PgJr{YLV?lNaHyBYbBgTbdFDFc@l@~eh&D82N zh#v-Aa4(XUh$1_^?ThJUX}QvqGhYbIwBS?y^lwn5wl;KiIFr9EDJK~v>_S@H*3y!m zol3mN6+RH?r6ThFPPKva+oXcvgo;SslLf5MiAvr7!A7YaC6vrK_Y}~N81bk=k`}6L zjxHC10F=Gvhz8A$u!dsxqJZFG4{>F6S0ep`QW7dEs@u1fUTkUBo^H=*85kJI1|_}R zY>!}TW82yJFz|%?$+@+e8S_bupxdnZ$n!a`A^k(r)3vq99)sDh7$weUr(v{b_Dc1o z<@ws(p8c9OO24{=VkL9;ZHi>&r5|h$nV7#hIBgpH6KNFVw)w2+arwT>g|9{82*xYx zjnQFg(DCVT@~lhqY6)5|Jd6J(D#b(|6Wly`MUHv`#*849R_(`uxzkz=^BglHz)3&J z>(ueut~eX07)Y6{9*-#UY)vS~;syVo2x}TD;dA3N<{!7~R8D@gmrNmOrVKTXw&bMc zle0NUEAuDne9+Ga#vm(Jfk9_heqo`7>5^3YfD=!Se@%z~K(XH2w}bgQ(k6joNC*>F zujqEUIJISEjdgLZiQ0hhK3`woJXe9qNkSKw_z?9dunsXYdYGB`<;!K&p*IT=KqFPz z8-{>YoqE@R^G;x`Uki}U*WzoLoIUFofAuOl6yJNW_DH1MK{|UXdg^S*<}QNkO;3&f zvsZ8T=nOiRU6k6>IzwKCtdL6jj9znm=Cpg1GevQeVzf?PwKJR!dMF<#g)56BF~&yt z*43+5mPbMkCt{5k2FAE8G>fvNuh4_sPu8WcXn=`3pUb+SY<0X$xsTMEUe&%M)YGDv zgybf+KUJQ&#i)IM!DCUaFp{vWjQq^BLYD!ri> zi^@%hpLOOfLu_hIkq%lyWTZDFiV-F0E`R>)$Wu?GYDJgmT8u>3`l*anIt2WvNy@5f z<_f~I;X2b8Od;RH6gn~2s`o#vp@@l;jTDM-O=9HUZ3@fL5)%G1C9n3}tgYijj4q9Q z#kifcqochQh?1MV5LEfJ$+*<}$Rbwo12iFZB-D&{vN~sHr$m1N1ae|Q99{N^hSOO_ z-K4GUcX7SGz7)h8#?&fEzOWs^vco(=u71D{&lxqOzf(vb-$Y=M1oZ=mj4R` zrjFZ6zO}Aa`^{x~6-&BZ$16myn#bN{xw2nbDdm1Dx=IvD9;(>H+y?rzPBs3@Q)GgL zsAI3hdSAMHidRx{vUFQfE`M;z5QcuZs=)& zbH~}WZAiO*V!c=bmZqT$A&}3uz1-6Tjz@Aa+y~x=uo|Vw#~YZN&&>9ooS(Q==fI$t zo$s%+He3Q5f+C*9rKNnW>d~Kx0mas5(EB92d9yo!j4dvG10C?(TcplFq7F7HbKrN! z&c#K|V_{~qf8<2&>=KWr?+p$b3}h(-MQ;6cA9J~MWLOPWIavvbJ8nUZpD`(`%Q#cg z7y3iz?eldaxlyej!7ngLn(si_7>w`T+MH^y@r2N-qpZL()*)R9DpTi|e04>1C^MRUhaA2MMg*(7_kL5iX&O zCs%xbaf&bKXcPNbFRheo?dPb=nVo=u{o!_`$lM9FU{xPKFx5evlbCoHxZd;7%+qrF z@ZrP$c54WV4NE~u3Bsa}p}GU>DFIGSvzcf1FJBgd@0U*Ps>5o(4=5*1jg9kk>V+Qf zI8E0YcCkA8LT71dVF9AtR~tTEgwV+b`uJ2@Ewm+yiud=sT1hv?@Z^t(I>$tDrD_e9 zAYmzi?WuCnP8n*Qf$4wUE#dY_5y6}UfJzo%E~ZnRsGFjbDbLe+siZV)cxSEIINIf_@729Jw-{C%F7|srsO9i-+bsBl zgF^vfko+3dH#qPQz(O?qq)^4Zb7wlFDv+OTipFKg`P{i}l@W>Ls>5sOG!IWq+==3# zSIt%L$qG9euiV=|z<14P8mADElx_!;z24&Pn+UCqf$Z`~HDy6FuoRJzlZ)dpq{f%+ z?CfmuCtq7}h)P31S_Qx3z8alIq3+K{N}f95a5pg4XpayK4OROzJ6uQ%wmCA2h!Qi) zt%m38Bmv|c-?i!-_5!`IO;1@tbwz>ddj^&xEdi9$c#r{7Qe3<>m@B|iT@_g2bVOkN z)w|_^s;cUu6xjOcnVWx$i@VG4I;JHORnW`s+r}sx&7J;u&$bH>aGH)k64`1Yt$3lb z%_?m-hnuoVNJ&*P{yt#6+mkbJ)H5*(?0jR|g^Q_&-!;d9w?a>_b#j}ux71J=@T(&) zvf|{FV|owStc*+@A^Tl0?e2v0aC2pa!*F^Uma7o5NYTyhX3gr!JVm8@a4--B+jFsd zhITbfx}h!eVMG`$qd~Zj8lyM0hMbCJ;j2m}RCjtJ&wu&!$;Y3TS(po0&41nBr)l~F zYgdoN*hpp5aA7hyS3s2+wNdYURTv;+Ny(@QF7S<^B5tDa7Jl#`%x8}QCPvy1$unn; z-my|^Ff>ZQ6PyFC50dX?>ZRK?E^B1huXixRX;qD90ha^o&6{tQQ$=lmBcFwkttUgK zQxs-xT&4BWBSTIeOBhAaihYV?oN&T_;%Y>=aert4_)RV^9xTYyOm+uJsTeG-k;z8| zfKJ&#zb}Tz^bPe6pOT_Tv^I1 z!J?*~%rESbDQ1fomU~F~`eMK@y`u?lA5z_e*OJ0wNIOCP^y5B#z6ggDr>O{`(km5^ zXDcd5d==rkwL)I>*)DqY#PIQ8y2iD3%S`06m?Zpv^l0}{6HR-JZn*=f-RBn;ac~FB z-qlTgi;tioCYq?XM^R9P1z+EqnR#q6{!tyu0r0= zbt)B9}hru8sXB+2_CCuWwo&;%4!#z<92^8rAJtOuxZzW498W zt1-lqPUG|A$GRlPB2h-%gW`#QtTRN5ktPG;(j}EE>dz%A-YDwrrhmaIpc~*|XV2_; z3Ft7Sq9tBzUz`ypd>eypd2Vj*T6^4@!BISHkG+%XK1B?5KtuqEkHGusU|-puz@wZT z8gCPh$Hw=7IAGl8wbC~sHrEw8evyXF0NYptxZt%jFuFpkC~f~Y1XbnQ&58V zI=I2r*{(Hzqiu0JeJ+?@SXP>j$58zOwOYF+n$w5e3l~=lVYgX35G1!*I3!NH!+g(b zuE#VDS>{6TYSj6wWM!jeE7EF=AeL&B&)eH`d71nXErF8R7g<@Yy=`Mcb?_8Xda0aF zA~ACOdFja(J>9QNQ>4H>u^=Ij+X6O{{-`WN-TkK0%D|}SWa`~KoFgvtngC(>wq;>r z<~YfO=bYN_{}fHn3l{T<@J=tNh|C`q?R!f5T=;Iy@fY-BfPMw;X|gfBs`(+*;3G3_ z`%q-INhH()7XWo8D7F+3*>{Lz&>FtexW?yDN(oEi5L%3AoDUjiAP4sVQ*C zziduu-G7j(URv~s{S@h;UShNZ_E2Dh*8+H%H7?Xu$OR3fo<@JIxF-&)zkEVm)n#R6 z&Cd>Fiw&!LG_eC%&h}T@&1l%)J?xY%G1kk?$%zgR=hkoQufK=Px7_zu=xo6q9{waK zsvwc!eBKrOP}KE>sI<2T-?Pu3L7(INJa9j=}Ok>U{_n)nSLyvwShKB<67gwNCC=43f7}+7D7|O7EPzxPB1eJn%W;n z1+&w2M((SvtQbc{O~LvmkqZu6OpJ^`=Z%<(3=0EoD9>R6;@as;pMRc-y@PpYyagE< z%Wwd7bQC6FfH1De(9n0fx_=Z2Cyd^{6-HH`r_-dcYVnT@m&fy)Vtkr<B^4tR=+;b*W|QQ0dL^E&NoPY_Ag5)5fMEiOadAHnz182-&DS0hJt&%RmlW*^_^+0=H8>;9vPO2p*Sg`D+kE zSz*_?wn03|y9(6^J1+bD(fwa^_g!Um+iIPTAmAu2GV&INJGQL4if>GW0H`9+!ml9t z;0PM)%be<-p!@Q~I{EF1^O_ub>tFx1g!?#qZzA4wR?*kFUU)g|EuNfR0o)bHCEyMj zJk?iZjF*f-2jmMeF|Xd<`WOX-ob~E5lB0$2#xXwhRXfIs@uA&*`9cbS1G)CUt(`JV zjI4Cs4|jIALA40t@F)|CS)?00o@tQ)9;}9hPmVEwy+|ph%K_Qx{`Oe^0GEX5FYpsp z2zWV#evAmDC@>xn3Sd_l`wuloG)(0@Cb;sSKO?%qRUiGY;H&%Lo&VQA>hg*p-1$L+ z^*u89M@UFaL`0Az1|`d2iu-5G&y9_^xa{NO5=H1K)q?h8nzm2<|JmXNk-ns?T&F}Q zr;5UZ?&Y3!LYkoKM0eQly?rSunfg1mx9B_inC`AO&HV!E8gRD%BhjuD5&8fDwlJ?) zX}N&<00x}DfSPBEm009!6x0)qP}tV@@YAv_KIu0%kdn0oRBM`YphM~6NutAAUX;r*cV z-2Y+$=-myPlUP`5kyF<5 zPfm*I0+;2lF5-Ag0q=jZ+MehBeO?w8xD^(*t@;&?n<+CnDIh9KsjGVmN0}r@OU_bK z()2$;C7A3JKl^VhTKAQRJE}KXoDkyY*DjWciW##X(zDRh-uWYs#3NsM{VDNN>yBhe z&HEYWmNMY4u2~u`i6oSTo2wDuqIkX<_$_Yc`^YBx@gfpbAQs!k$H#|=NJqVteQ7c8 ztdR2JLKyT15HS6{fyVyquv5^<&il)k{@u%qI9XAn)ufP;?k`{TyM5}A2D`64{FA@Fa3btTBEMVgSD>UG;4mCG> z^_K$Fl%8&Q2WxwYMQz#@g4Js2PTLRjO!N((^7`i$Qfr+CQSOf}E%V* zDVtvHza4<;+7xcqrg~(@>%vl>dW!9D{U9|``=76)2_XX_P^@~{I8^A}pKhQc4T|IH zHv30iM&|hY`@uu}q(k*h0mv^1OQ_9(AFd3p;eKmoM?1qeIr^1gvHQ8B!*s-fXw z-Jv|H4xi=M5PaGi>f%goK3P*(RICUzqV{kWz$z&CZLZgvIbvLP_3}Z9cijGcvLih9 z1uMi`h8%f%u!ck2Of>y5{xhbtPJK$dU%BNyy(B+hUx`{Dd70yBROakqM^1+#nEd2Z zskFE%Dx2v^9-2QoEBd_Ffd-bK%B>j7>;AuE%Zg?%iaSts)p;O$q-QuuTE$xtbbhTiXD4gqyF* z_Mz)7aJHTGWMdI_IgJD{XHbwO*dc&XCXn5xs%%@T?JWs!56d4xHaKjkeT_cEEyi2> zxf(~{LAL`>bGoP{%;Pg=Z||$95V{8syuG}X?d+;tAl(#XMTTA4Y8CHyz{EXH*i9_q zGi>C&$8Oyzi7sOJcih505qn+x!TZJ4ij+-T!o4_myy#6s1(D5)utB7Yy_x zZlW-mn8h9(Z9&txt_4xtU<#3r1=^C)JsJ`c$vI~yrz>>Zt`Jn3z4jHzPoZJ)rN(;l zcu+IP@L30@rNQC32hO%e(Fy03R@T-am^W%*V_+G-r7^#S`OOCwTZ#PsV$DR%d_Xfok_M?^p_v-o43V@6)<^+d*`f zgm|&z<6&>a`P0Qt_2WtBjNHT*CZ?TbouK#Uk<;NXU7GIXh?F ztNo!{N5&lV0k=ibQ=Q_rKin`J&>0yS7iT_r7A#^(d^{hfzk65v>CguDH8P&=y0=|U)`hmaqN5^z=)PYujK&#jw zEH;)3BM|MklaUVOKqm|B%|j0-Gv=JgjUyN83CE9Y987&3!#4d1Z$No3EO`ENPF%a( z(n6~;FdQb3SZCz(VjP#M!-Q;fpY>pRGMr>e&njAH*ljnmBE!fsV)Kx@%tl&CrsOP3 z|BT0+m}1fPfw#PzHPi9N=d??%!RRVWvmZ=KBN^2a5i-|6IOG!zbcQd=tig(32Lfa)WL*mL= z*~Z3gV`QjHX*z3c{Z^AyP*uKW(!=};mjmp@&dCGU;EB%jjA5s`10a^+)Hn>^>E5X=)#f-iB~y=B>!?!R{oR^TlS4 z7}FJvgN@NLo7mhmo{5dQ;m%Ss>3j{o3a676=CD`1{R6vi&x>^qwLu!O@3_41cJ<6;6tA2L!Ve@cpKOVX(e6!1!8x=T zKksXmH7w^)tL^<}r-4JM(H5}~Kj!d~9f{l8*}{&xsUF1>TjX}VgSh#LY@f2a-LdAN zHHlVy#Z@vvAr?lpjl}%tE63TSUi4m09L~^}*P|?K5f7Yr<5e326=SPSV?E=?_2(cp z$jZv>wX+zjU7Xv%218MAHPCn(0%iMnTYOx+^yqtqU{1w&2(V59M2JVQ95!Va*=3ZN zso-2VQn3k-kDvIa9CD9MtqfTTy$Y~_ewDaRv330a=sR%F%ju1}mo)y|M;lyDC5@nm)uX34M|3U3@xD@CRdI?@cU zPghj4u(ZsJCf2na9jli0^?ee&CGgR&1%2@D#JkgU4m7n=nzN`tXqG`puTkj>3{t5&5iy2m&G$(W}LB8Rs{T z4I-~o-Hb_0tX;1=B-Y&<8upxit$wteMKU*cU^#sAfbn!$cFHK<&1AUNZNqz#eFEW( z2g_0W`pH%BpvWah%MdB@>WUu|i~URGGe-}A&*G2A9Qgc^`sFjdQdXdc9Is-iJbTU;zLb>g|2dE~TY4u@h9Jpw%)W3n55s+Ew8ZB5uyi zFQ8<*acx_F@aV1KO~cezw;uhnimM)dE2g4oXVPLqN|2B{M(k{MqQ#g6#vY?ELo5&Y3G)&deEVlN`t8UQs+f9o<9y(>Eg8HA0G8eS@tl zs6?;o6O&96wC2{c_NF36&}C@Q@$-`+aoyj~9wa2*2P#485rI z2U(fsyZtrTIzx{W3npLQ_fp>`B%pzzJqwU*I?#^A&`Jj?u2YNV)8eQhdWX~=>8yx-*#9Z?da>9ovg0R)fi*fs_?E8 zg@nAc`8Q9rH13;jobyy>>?K&cjrDMLN?=bR5Krd%RzvdEFInkSz12J9w4$li8zMZp zc7N35=tM1>`H-yA{@2&4I88;38;VekOMbz$^GR3t@1%qBQqz-|PvDVeENWM)**d7l zVO?NL8cRz{y|lMfZHR2F>zfII zx8`_jve3aI{TX&`>CSd$=7mS9n}z?_;TCiu4ei#L4Hqa zP(M!EH429hJ62)h1rZq@vw!}!&3}y;NtWHgKiLf~zk~!j_LMCR7SGcvx7x_fk!-1s zz~fdXS=rMV>$#09;=0L7mBERlZ{6m9I!H=Nj@`7R5Ev*?s%78HBnczs^6y^PAT_7p zLxjpB2QMC9Ts6wAaNAQfaJqRKT3luBBA|#-QV3p;tXy<{!u+=BTNO*^9_V>ekXLK? z-Mut8(za%K;A?5e)E?bqBF3Q}@g;)4$|B^QvvSCKx5yTlsz+4|H&&DJW5{D~GcmHZ zvVMx`d)YT!V_F|5xm&t1CaIzk#cP+i@Jel-Va%yAU;X#IS=hf=z>2^=k`4P=@OtSN zd4=XG-|eCdE~}rRd?A@|aJC2G4>nII6r6pXqV3N2hZ?mO0h-ir!{zJ2oCGg-I#5Q*9JXJ#h*LF-Y; zUih9Jva>*C(L%j06(eS>nD}07Y;Kmpu3)5P&#y(#u5$kJPItk+@199whq~3g?b`L` z8RVG2c0H)YsMRkch$Pg>binnD3|Zuxy565ygbaRJsPgjh-cje-i$YHF=xDzR7r@_@ zd8I0xRunyIJkMes!>0suro<`=RE!i7I*Gvzd~4FJmJO_H(rdWfp$NMnW}xpYK7I^O zCC;LPRI&O}5W`007n-(y1D(_S)UOX(I7=GMEgi`$7>-v_E5Uq~!AVINNUYWn(#(`B z_sy?Ek(p0i!t){=8?w{NZ#YKt4}lhMnJ3jCm2#C52FrieDz(|Cm}F#RU(OJm$3@1c zsIIJJ&QJ(CxQb6#D=sdnJCN)^QntH;pgj$2oNJKGA#`+k`YkGzOz=)<_&JS%L28)1an4wGW{yer{;nu_!BOP&*b{VG@ia% zSSUA}@Y@6JMzzggz(}4!CPOxzo#Ek!WF_f2x3)YK<0lkGxk(5iP z#Z2pSiKV|R28s>JI40XWTGsheo%K@V|Y&Z?h z9-A!gB_$RT(<*^`tqWV(lVl#Xk7rSv_-M2XqaRnrg!;_lMApN@%g~T#m3QuLrA4j1 zvcswo*atmLiHL|!mk&;k=QR}>`PaleUwcV-kl4XCY>HK`-+l)z`c!&-4D9YO9;P@ z1e)RY%LzeE^i^1)ge#9|j^p2uvH2hvVa|xi#kU(wXUt&NEO;+QPJcbw`|BgD=jDIx zU-bXLglNsJ1axJb9IPW&f9>PpbcWV;FHbPjYE_ClZ*{}ce(eqe2S?baFXHgqw%8=Z zF}aM<|1?7k7h}3hte;b&Qlcr_RrpO5j(rqlqf>5w69q((&{>a zBYYhj_7st$n$?ja(rR-Xn+sf`^lYq*xpdUmXyZ@WxL8F=0bV!UD@*(m85QZ}aQ{9-!6mNq0+{qUbc8@5M{l_u>97Wfru?pw?@j+?*ujA` zAwgkbY!=UxZcr3etW8$0j+Ylnmr;Gio4Av4hl7oyo}*6s9Iu@JEji1w%=U-&Z*g&_ z{aJlYA&Fv16ySR%{tu^@rv&7%saHBWym=E2y?I6RF!l5D^5WutoFk0k)MxTK0d>ml z3b*4M=YJXkAn6n~Y+$26lsQ*R$HHckYH^#5EiEg{z{EsG=N~qfo9+pw^&O!7aB!L+ ztdvCU&#LupihcQ=_p|3E{7uVt08rL<3e#Bs8QD! zc-y)*>p>hN`S=|g8C-3T;Tdafjd|7F(E;Un>rmkYc5y8&=>!pX=o4hHM^03h?eF6+ zkI@Hx0h&5lv5Y~3!c9BJAp14@cb_y0E^nqXM3>b3ydADh}+Wfu2H)eG`F~& z4*R2*8Bn^pKf?928yORHLq?p<)C;QDIIf$Hm99%Ze*EZ>H?&~G8v)i>pfFbfP42UF zb9ARz!Ml99`+Kw+7YJY=!;pg`AG$c9#1evSWuHE+L7+B31Gl}cBj~ho3NJI5BxA%2 z%E~hQyD$7~kGA9HDY=Rt)EFE;y?$13+R%+hChTGkTrS*2@LNAd?q=6GyJY=~X~sCc z|M)RAA39I)Zr*#TqQZ6me(LfS$9X7;yh{Ec{NHZ@`KECI3Fku<(WvZHvB@qaUmg&} zA>j^fh~pcU=H_*I3roWhESGU{BSeKnMG+vCf*Zxh#f8jBPsz`>f^@I)@-&Frf{ra< z^&x%HSS$ewoIZb^%!|iHT2s_VTCqW8n9MTr{snk>0hLUBI!{PSL8x>{xQ9>L#QYHN!yT{JINMHlY;lW=KmH!Fhn zTTVZOm%12~Nzh(OCFGn0bRhTR42{4bc{t5NcmZ_X!sBS{{d%}yhFVYnWj&oHOFC8U z>U6Mnyh90kM-rNIen!T(e}2nA^>=G)D{wLul^k?APZF9sJJFS?&>+Ts_bzlPW`T|T zco_rT>IBVZ*w_pf7P$ZzTHEd39|O=;yK2k9(eatAECdEXIff#MRfcrPB#prz^%q{jgD`l^wTkW3Wl?uIhrX=%a%#)r^j}# zNM0y&bVHpBBagBC!jv*#B_d_Fr{y)z%*~}1?5E{1ZQor~h~?&_;O{MgJP765NT7yI zOiiKl&1ijefI&Lg(5lJWb4x{5{+YbOQ?6Ifzksob=-Q*xsi>YQk+ZAK@86TNeoJFc zOJ~YJi|jF;{c5;+9ffmrd=bL%29~a|zd~`dXem#esHwe8wYhWe-qkBt(uKF$U!Oaq znUB|G{`qsu!Xo}-B`~m12X9=SlvFo4c`*I6o{35Ri9F!Ka5Z}FU1CEVZCOHXUsq!7 zZ4@;p=g&k-D4eRS?d~-$YA`AeEI}ighP(kYHu@V?) zkKQ4;MZCOpdGI65@CmU_zZ@MMnNoPD;E)_3 zr24_NpuBbsD!xu2Qx+b+(c$51p0#T5 zIr_nUZ|U>a))sgcp)w_`@%P}M<9w?!ylAi#evXI`v7IC1LcR`?i+-@)7(@wOPe4$@ z(HlBjeE~HEzJug(1F*Am4Y!vUAHR4JjK09u7^xWFpi&DeJ+2{DIZEPG^Brqu6#l>lwi0EQH=f~8ZERNIsX9T-XHJv|E?V2G=y4Vmv z`t6R4PG!N_Xv2C(`&EbuSfA^k0dXfdpf6xhq@iuQ+8*#fIJwf&(Xe$3K0+M}e7%o} zQ~pqs3hH2A|H`B8JVuo+D>Kt?Q^g-d*r>+KRmHVU+al!Q`2&sTPLq`K1&q!YK=E#) zlK+$9ofh{@M4s}S?=A!p(u#yfhG|!tuXu_)6GEZDczbdJO;HLm^77l;+vSMO14w#@9m@CJ1&~bHFHOto zWb>1d_tXA0?2--jIANi!*zo7{QYywdK+`1%RE<(bFewQMA$7MwW9rWb4?=5&J~CZS zSD=tvwVHgp(+_?OS4ZfX1d4YN+*{c`ZPD+5sba56@RZRF9B?{2R!WC z2WN{z)t&dW*Cv0beyElZ1m@Plf*K2T{XfDKuO#rJZ>;B(CozVsxcE;%u?W|u!V*4@ zK!#D}*kyVAd5RLTu#4Fdax}A}X8Y;&@T`FjluE$e)glvheB-9}gwSE3luHWkmp0Sy(uFT)d zmsDs9wlNqtI5@gs-f3)TfP!t+a%Y1+rjlBNNG5^}77h?!r2aRqY_XzNdsR;GHmBkDG&cMAr#@~#< zFGE5f_W<`3_tut{ZM>uYZ)yP_b-v_J)(-S^hem{cTN?(J8rYJ3n`L&oIv2e*FUZSKG8=u=1i4 z9FRz}{`h+?SbzB*wQQP8G!P9q-R(H?eI79V;z!!r34VTqVD$SlJ1ZST zQE0!sv(q#CO_>#VLSswIZ3vV%XuAmvJ`A0`PH=i!{J5#t7Gcpo0O8RJYHAH|1fc=q z7edcE`}@P6#aH~O?8;zHBLPzc2sJs`*@G?HyEy3Z)nC0Dgn6&3npWsw`#LG9<>u=` z^YhHXR~<6cFJ69fpdJrmHwd{>ReiWLpX7rCnt+OGtVhQlrq#>+TofoI4o)l?*{2h3 zliyJzVHsgkbyaG3Q?Z26J58P#F$Jmuu7BfhJfA`pjM$qu&}0+~6ddENTQB$Fdgq^p zW4aP(QQc3{f#(W>GE|){nCitXuX}WI0*|P)xVR0h=CC{I6uhRN zfb{zdtgNdr;k%z6nJo880&l%H+!R6!O3dIZqrhLRZ$M1>Ov*fE#s?n=_}Lh9`c%qm z8onCJ7y#oC+pSvyZb#jab`8P!3aoHUY5t_kEeBqtHSipG{HOwG&Cc%C)pDyTOQXe3 z8X6)P24OXw{BF>;vwUemiLF4)xq~!*!e3eQ1hOb_ix|&)5Z{i1BQ@dW0TRz9=(%chuW$ElvB7cQ+Et|>KZ2| zbTU`lzHobF8_RpZP5s))2;DxMxg~fe8Jii2z12u!WW5EUjME*Vp5Xz_1=le z#)y$GiHV4%y$^)v9w(y}5+?+w%QJuoGlSp%c!N!pwl+6SIWbQ-YW+itjEbe^*)&S# z#j~0eeL*0R+8sBI6qa^)=;2}qh_FvY(|C+FXUQ(=RJpUUv6xJ>ez!vgLxP&zS=5hw zFxmr$==j%|?bJ|g?jm*aGpq?LcCaM5*gKl&8O!lWH9Q8Ww-nJ=Dru&2=>krgk>S;Z z`=gEHw!O`qdz$|z2S2ii-fN7DDPG{x!B~B`p#>7+^!XW|idS}Zs3{eXR?k_ZJODwS0AkI*R%(G33J?uV$xAdPlyef==7-1Yr}=K?nM z#rEi?jt+TjeuzgrKR>sx{KuY<9_uui!#_B9b9tFuRE|QLvcLPaZ#=hg#@RYVp2_jw zy5-$}p@ZT6#SlV zJ%!q>a7O0IQ@5kNZQ(>|i?Lz%|1womsgLz&F=Qx!b(V4xVQp*raZK+JPGTSZLt=T@ zgcUvBTx3>C6W99x;2~#4IJ$)IdTOUjHM&>s z?-1gWaeMS{$0K8SINMq}Tu*lRgAO_ZW9LZcm~S(KXgLdvtc2wMquX2seapLl@O&l4 zz>hU~DTjBr6?c3bC9ZRAeKkEJ_$=o6SwbdlBNl|IW#q$wy#4OF{#2z?7c5$Hb8nV4 zQV>6h2JdaReEj&dT`;YL6yL(ks(2@A{Ys}}*otlmg-FYVIP%8lkOj*?rvBWWtU#mP<$)Cq3j$;rO zo*0WAm_h9=6RDB6I36slMkr*~Yn&l)kepuQ<5kijQ{%3Cwx}9mm^2Ky@Jc~&cG0W$ zcS&X0Bod*QZ>dwFEu|h);4-T3E@Z_iflUzoa1=SB1PSyrCzQ2iHGDKrpBC79f85#O z&OA^4`QH(p>0GttCPmM%fllTQ=iOhKhz+YGP>n5Oiv4trl#k~@vaeI3hA@CF1KMu~cB-Pg6+8s$c8jHmVm%RHW7cAvZHW2a!pI`w`B z=O29H7{B2%8^KENRnMQ0=X5SEj?O{tBq6)ueCQn+b%!-0JtLQE#2pQW!=Io#7sXst z0TbnRJ9^Ki!Arxx>~P*XvCV+&U-iMbN`bK{Y;UtU6TqFm4hY@nlp<(cmeCr9+Gmg} zWh^Q~f+xIaY3$9$Coc}E2%+-?b(SuWM8Kyq@~{Oissrq+E!|( z#sS~QNivq*n5baxr?4;$Niz_b{`~2+HV_qMyio2}`^?(1Pr)6qnkGvlB_+?h z{;;Q_{(aw~)#+Z|(3Etnu*1eB;fuo8g{g&EgdMaRP^spc!q=}~r&#H$4HOn)=cJUE zive4h`S=eJVd0K3a8Ls4?YsVunVDOJO2KC+WfEH( z8<}ulA}AFA-0dtGiHLFb^t_O+@O?qG-9TOdlGZY*lJkTDh(n8>Fw;ET>kx zuNLY{#|bz*pr=p3kTx|L4R`b_B28zGD>&aji#?dXrOC*c^Z6oB^bp@TGA0S(fRkB| zSK%Q1W$G5w-I#s0fba>u`vuZdo}cQj_c0YOFA!h5@mRI&3U{^rQEF0B_hgE{z`^Q5 zjqS1mB}+);A+jE|w? zy{@@=>1aC)1b+bj#8o;Yz4U1|EE!fz6~!)bu}m*+8ADzq3G2{M)3^s99I*SFMzTMH z^?`tZ0HzWq1O0235Iwlu%LsXe<`xzJy}}e2VhR3?C5ZdC7*%Cu%}!5ClaGGz<*YzV zUQJas;5`)-&_A@Di%LryAan(+2=w|r843!cTKP#y#=6^KG?IK}Y9Riyb4rxW?}k0- zqa93}7E?8L2j+Y+N?dWAm0r}1c1BD||=Z)3uOuD|wpL(mK%e)aC%{tFsh&vul z=h^Gh5dAUB!m*HkicYWWn)1ws0~w#8mtAA%KQQ)&_S zxO8d|;4Pb)s;fV?53dQPVaqT`b=vIrW&h0Cqd(3>E$U>r{?(xPBFmMQWqoF-pY&Lq zIg349ixM(jBMf@8_$DJQBm1t3S-}-*{M^i8;{_&^>A+C`*Yyxe0q=6wzY1b9NQI~? zC@M<%dJznId%O+_Kbj8AH8+PUrO23oNc%-QL zbz))&3pt!r!N(7Ra;*zEIABhCfKcQzmWE~*Wb{t51P+{1+jw`NTHFN+;sJfRbjgoI zdMrU?Vm)IXP%BiyXYIy9eP)@909;fV#G8ZB7@#>F!v#Kv{X~U_n``4A*hS5SZ2oXp zjzgJT#eD-avsj252FH{nh>@)Ci`EjhOPqUoiAO9La_{IoFe(Txr7*F+E5tNiY2I?0 zI>#*tidBC{KxlBUT)CbZhp^s4M+0^A5IBOoW2OJ}A5DX+vZRcfd|EFuWG%;>G+(3o zaCqhegA}Cb<&PDX{5h0>fLcmMMiomn(Vq_7>z{OL?Xs0+?YN-V@tt$!MrZaS$MRTi z#`{kNnFUebLvQ5P+SjifCY}bb4|A~4C+8&Hxp(^>1EW^WbrYGaFR^@XTPWwVJxN7; z2_(Mt%9P#e`9wVuKRh%%rm$H{{F&oqfAp7ujK$F^C*+=_osoQ8dUl#Sw0_E}2y;*g zc*&q|U(#o@eijS}^)o56oG^I^%th82(y?+cdh}le!9daO`ez*#D*?CNP9jnT+0uWp zfD;u^BJBbMr77|tpRjlcf>)3HgP{E@mdDIezwZR}myoL;CG_^LYh+xU5LYK6ehkjf zs;Zd@lZO`|;gVSE3H1yJ@!O9?nVA=t`E^>0yXjNDfSUQbr9~N;1Jcw9LI-04n@vB9lyn6l zkMpa#!i`og#%-4B&lR6j4LVIjeD3lil}bS;at+?ONzVj#8e#YGoLqb*qoL6tIjhrz zeGO^(#NXV#J<03m@?+WLVP@Y<%ymk18^6BQI9&gl%_bLHu3(q_Rit|QyPdq{R0gYV zkWFU6+Y!^>Xu=LdGp&}h%|7VA@YcMGIYYh51G$M`zDRpWz_}5Qr+^G-zkDh5Lnnix zgCZ(4w8mg4D{RrSo8}0PwP53aCAX%au-+&&^*$q`2@cIQ?rpaA_EZnvkYyo2wQkb; zJDePA%Zi@qU{~-R;#mA+P>}o4mdN@R;$W>j-Om(9Ish<}T(+23Id2!wcV)E+HE}Ad zT!=o!hpmd(z1gJa;)oxA>?FMJKGfbnowey7yq?4L;JYFFu$%Q_Xlv&WxApT4EvlH9 z^9{DU%9#r+pcQo?j23n{_4F6XH^KF!*^%&tGQ>@0t4(1yn<*rTJm$lPr6pwmIGR57 zNc*lMEy;6cnCWZkq0?i^^ig?Y>F3_Te}&V@n3!ml9QZ)z_NT3`iWqg}zVua@`o^e|Bb*c^&w^6=VRPu?3R^F_s}#d;lFkHMO- zcWVIh7rsU6rqT{^y!gDQ=z!|eeS9{X@;~*7HhPeXz2!D`vWw*bYCB%AEb*c1@z=%b z6*=-cnk`X2zFJW97q@9a!^&yK5+yk}0JWNF=T-!~x$U{L|E!;NBYWz*W@cX9lphm} z%GZAQeMRHUM}nc!!BnCM+x~cqbFOi{$!42{xl@z2zv~#9P1=TN06FX#8u%1SEGyr( z)NSFNM2DIyJc}P4yPc6*&M|SFH1QtOU0d_12c!Min~{|Sab4}Fj(_TKp_Ywgl>h>N zp&ct#c&k|Bd?bMI1?P4mmI&==iK_fQ^3$f({B=$@>mgwrK;&&h49^xi z$Y#cW8ZNI?%PtnBztJg~nQmvvQD~c#AQeG;80dSUQRW8WPtT8)-haTg827lfs^O?1 zC|fb~Tqlf)Q1rzAm0KGe9Exo!x_4Yf2hFi$NxRZE^Mc|f;I)LDn=970M`f)H%@rM} zM@uaAw!%;kmrYie&QitESd*wlYD@^%O8`Fl`%`81SBos^dI#yz@5dHlDu%~n>?0D^ zS3RDN08GR>#yzw-IB92*I5~9uc4Q4K{q{&e8Q-Q*bX53L!7(VW%+AV^OrnQsm9yjB zMc96%>i12EPD+Z(?jf=fBz^=-LKYiRA*&%S4i>VmNE2FQG7*ggj$=z_=knl4vQpDv z(=)B=w};Ena&_f{2_L&9SjWjkEDNhG+Ms$VgtDhn883{1S=fZ?S?t#rhk-2;3mjwO zN>>0`{PJb)W*4O^ss~R!SyHKfFEFRW%+N*Cb;+ULwRiZueT3ufgieX`_Y&XbYX6+3 zUtfslH{PyaIisq!Y`aeJ73YGx?zfA+kMD=+6`NaD8LeWC{wnNKF`-F5Wnl{5SVgYP zcC-mbOBgew&KV;4a^kf2$E*wupG1!I`5}U2tK3l|eXm4*1C2FgShq?pbzKF&@m_DdBGApCPM^Zs8YN>mZHdj&l1&TbiqJ@Y24lZlE z-DAj~jq4ecNMC``5?kZl)eM^3j13{{8Z_6B_h)8RibyTfUI-M$Lyg+LAj-)@Tz97D zl1t8qR)>;-+qYE-LyS%CNI4JTV`CVlido*O18I3kbCNM8z>O95aCFI{UAyNBL=K zCGN=1gLT1c#uwz;a1g&k`gUqLXKvLMXyr)x@z>?cZ-Abkfs`_66M!Ve)yLA zR!dZp7ezvpZJ5*oavI^lJ%<~FLbV%vqaT*;=a3z22K^_gZICbo7~V{8Bu_;RbmHyI zvx3oDI%yloFWoM+qq!C$+D)Y3L01GZsl{UVxAr7(7?G%D2ZC0~P`o78dRzJ_6`^zUjUnvu0yhUz>8Adx^Y@e6njw;!xrKS@ppOobW5 zBmtU-B&sUf2`C0AEwdPy{5hWIfJf01CI!&inYP+6YRxw>*~=@wI>pB)_vu|I-79+Vy>Yu?x7JGVfg`gd+1nD-`mBJv9tUuqLWxm!K78kd-GoKBa zE<{HmOA(MAWA5V8INKzmUAEb!Q#$rsC%Zc3EsnIT0}o^G^pQKRfxu~s{ta`Bv0|r{ zBKw9xlr?)h>fNWL*V->I!MTc=`B+=m>(e#GM)*}|9?D{RuN%gtGjy>XVM(BM^zxFEp@VvTdm1~ zH6yj~#*OQDo7rw-L1KB@P5`d&yX`CJ+4LDSZ%9moDuVsO!@#%E(M1c5jg25zM~sPt zT?M%5dt^j zA6xlRgzh(AaVq!?o=V_ZO9n0uJdH!yDv1EvgQPozg2x5SYwdYJ2`4oW+;pdW;3OGoL&3)sxbK&NgCvYoZFrJphK z(#qlUu#1=3-RGO>&p^2AoJ_dx?VP8msEw4v(G&Yp$fT)3(2M)6vkMEal$C;?K7EDu z0h2sVX9h(MFuH$R7CV9C^9Pl@`}t|Km)Fk#(tI#uf|kz0&~Om+B>y1mmdm~KrlzK7 zMS)YI>(N#Z$Zik_gbOhngs$5G$9sM*4%nKVUF`O>R~bO)n4Mxp{L}&udwdK0&QCz` z(rs}LoWvZIzOGZ>8y)6Gbs^N2m!k>Yv?pATpys$NCPv-SF?f}afRp(@Vnp{~z6AfOG{6j+@0_YuN3cuwDPr%6PDP@S2HNyKGu>$k6~ zp(<6>OM=f=g`3BV)z{-A$A`5FovK5quv`B`Z6h3LkO_KuEZ->9fz zpl`Z;wV3bT{evRBt{d6#`>~x}(G_c6IBt5Jo%H!efP)oUpuSEL7a+v+H&4LKJaUQ=*@07zklL77O_sH%5WL%AE8rFb?dfRv+2G$ z#4+W@ZPELCGI_m6pR2#W|MDpfC>1VB3gN+51>6ds#j`dr*CG~J76=tIu|h?2WmrvA z*vvKCVBrUQdC_Y%2E~H9ePjJ>X>9rNq*@>Gj?Q0;?>qS}kI{?=( z3&C9F-C##_{Ub}`c7B3+Y5)?#lVdy8SYBv)`DS8bqLeN-54ptM)-q3@I&Mz-uothb zBFAA|$ZTN^2*4d1(I~dN?^Mi{|7WC zALw^uM7%?Hh^Tcmk}Ur15cyYc^5p4LInYQ{{}v*1SmS&D;mplLuoFcm`Pl94(N=QE zAym=QWxq;ar|uZzS7m9I<#Ls%zh&Z&!cH7Y#QN2)QS#l%cyW6A4hKrQi8RNz)q|R3 zU@tcLrs=l(#jV(-jL!E;8J91@3gSXSMt0D2e)L-l1Hs78|F+_qaSjN`qym%LngQ>C zp;E}r8nK_Aa`)+uAyb8dj@zBP><%zcQS1< z=_TES|L?RIIt>04Qc44(qVjQj#~*vH3@1Jl*vQG74b%0-USw`ELu$XCLNgO} zevRz(~$Z#+)uKmY3MpBp0DsTfIj|Mz?W49}DA_5+=D(_N_>WaLZt zwC+cvzZJ;4!N9+IhJ=0N;u_Qru(-RsBTx$PuCr;B-rff#8z&=ULwEOk$ag>o0X+Xv zn9R$DbK$!!W}}nB(<8*j{Xsv5%V3_ma0Hq_D>W*zYgy7a$g3Y zmG)HGCLN|{h1e|0uBoj15lWY9iB&1DW=9&IY~j_@`_)u`KNAhCp+SCsETDwG)&Ont zNB>vAZWch#qq6`oFS7!T5h*AkVH_8-93KWH#|jnNUk#2`Rkdh^SYAeeY)8n5h`21r z$z z&90UfMgtpks=)sl2v@c;2xRkHXeS@Y9$Hym?)#N0L(~<=FO70b6ng6oNi(A*t1x5~ zziD|iN|zfK5h37y(hmt1aEJ$`huN=p+t3zEbn_;9N6gEcL>|(%g(zVJ!fCtKWj|DG z9)@oa2RunSuSQNG!w-ueu{;q+?)8()|*w}LOb@Yv&q^G9JsYI_+P{hdL z((&>x{PMN4*QI^Ng@uYEeKD@^SV{`&FxaC?+^j`^KN8h7Pu8`xl$j0zBI7HIXUFP7 zTAI;YZP&VIn2#k94mwp1sLr%ow{kZ94?VmD58{N1jRpeC&9JdVGmPHg({MI5ej7=( z@o7}h60m<>2ADA%$$D_hHbk~Pc5FKy@TJEWk>*J^F$GeMnyusvB-TC#8FVkUbos&8 za*Thz_*E!gxy8T$8CmHWDFB*EuDp~olzO7t4P`o}6sRF@P)d4V47fW6eneVI%C_+3 z#I+YMdO&*)ZXgIPi-6D|HE3DBlkT0FIqZpv4bz@_jW1k6tS`>{D;M2Mj7{W|yoWYb zyQG1gB06HIO04>tZ(*(uZ8iBLKc?IV$!KV3Dj1phP%XQBkVPa{vKMH@p^ZrOO;5iB zIhR*tT5jgbm6Y@^MGRS;Vf%Yy}wmJ(pDM^J*dWm;*R>33chrg;(Y@D2% zTjY-91#}5q6`#KUMhnCI2&kWhVL`?M5bbG{78Vv6^05yL+tJM@qP2&z5%)%*cGuhc zhS$?7w`0Xen%;(=;rZL?usiu!iE&Prze;Ffq261SkP<&1=Ns#mP?PR^ccqeG8A=}( zXvugjdY>OOZm_S9r~i0m6CM?HIhQsu>ZPWp;<*_5m6}$4f>}@n((9Re9NC53yxk+w zdqTfg8|TTn3_&6u8Ux{T+?7DO*e!Ki;s2T{OtFKpI`ahsJfQaWd+;hZH#JGC`V6l} z3%jO6oQk94L4j`lR4qc5FD9CYn$Oa^$POolj4xqR#l-qZeO}e20cKB1qJsZ42PcnmF?r_&*|vsqQovj4J(9%EU<0S z?R8ZkDju6s{gPVgG4H){&&7>Y}~8TyIAeJsDUQH!_gn`Z$Jqoxj`&Vfm7S{ zgHO&54agSv(PLQgrGhDhprF1M^1>SB*tf9Zs0nu*tJd2KH;1s4`N7{#@f_W-|uUMMhIrc({}ncVopR<9W{K!z|6ilH|KFgcG`YO z4dV-pMbGsWFsTF`x%v4`dg4e@^R)JaC`qUbK@W-*Bqoo874^_=E>p&5`GHYSKLhh2 zC@??ARK7hN&BN9h$!>Z^t661g3C$logk9~eRD$~oS7-d-Dx|h0IFZbyS>$SjPYu_n zt%ogc{virAe)}`7P{m59xOh|4_;*~5aD4Vi&S$UA_sPPMd7}pXzYMy(xZGX&{~pMW z@OV~mFnjy@K+7~yEo-H~8Gx)oV(XW%?sGm!@!wk+-0be`D?cuWYxTMmF5iT^ z^X^f!#OD_}QEVbzG`)95-J{1!g(*Eo`#UO!O4rn-$6hGu2JKiM^tR-07q;hB5?Z-m z-O_I@{u#CyvL;%=D$Ee?ZvNEt!GtaHe19#@{Gf5`{e2hALz)Tpd#55e7y1^mcAGji zg{~)Flm3Q}jlR$Da0NHUV!aOxdh9r{%aWP zWwgCkzjq@QjHCU=!wiFPuO38(DXW%RdJP4&+0TY8PU1y?+2H2D^S+ZARY140%Y-8G zH3|?&8)`OT!&zU}jM+c659V=1oUnXE3n{kuql=usg})1|__pwgvzq9}tjx%J5@`i$ zW5dxu@l&zOc1@iALN0EI;|gE6l0TEZ@`x^hKAqFTa-!s!tb~7JNNrP6@ciz@+M}7* zbbr4KMsSZa?F9&F$pyNeY)B?G&tjxH7!rYcQ(G=j_{R`jc>X!U&(YqTn5{cXM_J8c z%+yr%AG zIW^GO8*y_(=*Rid2*cum))SuBbe^6`TbT8#Wvw_DJks;!$}jmx3bu+a6~Sct_ts?Q zO2uF~AMZ3kB3ER)2HWjBk5^u*I$sX@Gd_-9yl)s^Fy*`^COP%Jw&!8oP47piI#nJb zroFEX1%tMTZV(xZOUsu1c>&V2E^SD`S^u$_&Ac1gA@pPSjR8@4MtT|$+E7W*(2fwN zgp6T>PT8BGSdtcLBm;Q&~JoSR=BtO%B#MKlPW8tdh30w&GJRJY9JL z#VL<}M}ljjynOXAD+uxndwcbSs-7#AP+p#HlA1i><+OaNT9l9Hv@vY)XUSxM|D)gP zI(3|R?pk}S1_8wY`W>mq2}&P>N~M5+S_RJMn!H0876%%RuRw{-frCd(qAO2Y3y&QP z1UqA}Bq}s@p&}F|dr;q6-^P$N-KGy@y(Tt}n%^+Tf#NJu3 zE3J&ow~;=J7m!Ty`^JB*E~73)rsYFo?K_a}ofWKZ)N8;?OUC(b|4vPbZ|>rLz~`RN z?ewy*Dpe-#(Q>SYG11W#*vtnD`FAxt!-qHx8mGl09+^RSri_MQIk(Z^Z4 z(lTm`C|EH3)=hVsIUg3L!# zE5e?dnykoCaOrpc$tuo9v_34W`{X$(A+RY>kS5u;DZC}Sn9J`pe_PmOQG_63f%nzI z7wz3|4Y6PKZV4XRqz>JrxVa~&WXOBug#m&8JGh^)JipD&N8(<={pWz$y+m{2q08PA zTif1bYKN%__nuwzm-fGx`;25J$`Po9;9$$4ya}AEOM-~=N1)rO=mF~uT_F;kzvkJ7?XUd`H21MpghERk2XUZ zPPXW-n~zF|7shwH?{>Sk@3<$oVT*Rw^mmkZjO|2talCdalYPYOcb?S zRxqm|pi%O0Sn~XApL|h`yj(bz5cOP5NdkFt><c}mi?`DN8G;5oc(U&riJ!jy7YleN z`H$E$}(IdCu{o(kCnLV#$a;zEudEWT{FJJ8hi7Z+LwLZO|V8Bf{ zei<1K?llAqp##)FIH0RbkN+Hs90cAp7i6ngf!nO_@O+=uEbk#<2rG9W0txl!hqTyO zSjNs>+z!YCHW*1(hpZ0PM&PJu1L(BhiQ5EM}*6wsypG zUxvjUNQ`eZJ)ipVETNGjgxA=7_}vE-LPlIWSs+r~xAFcp&#Ef(N2XVxv(oKpmbdpk z^cp#RHE0!j+hh_VBT29AnH(K?q&`bCN=-{oYmeji?~e}*yh;n2x?_blphtc#7U_iV}c~`7aNntKjZ^to!h} z#b*1baj;&4M=&CSShA7P|3=rrSl7jNr>>zXKzmB+TR|o_M=f`461PanV=XO7Ma4My z*cjHKQhZd?Q@8HkJ%RfxBBJo-O^xW|y9^9=2W#XYIMsE7-SF{mQhE8@|Har_#znz* z@4h35C&A^pqFlPXpJZ*-Rd0mcwolLKdYfYiRI6$#P#^%2dup zmgU;@58v&P;DJF>PA@Rf)GMcCQO-lm8ZO5`*`6={6to{ zNNxP*HnWb7wy}J((9QF}M*}3fRZf(;p3So_DqP+X#(;SVm`R4Ykq^eJK*nVu zDK0K%)+qZOM)T&Lw6dYQ?b>AJ;R9CI`ntLx=OY*+`@UxS>CYb-uu(AG*ldWQqos}K zv7x4?&nhePE_pLWQ7d>$NF4exuOIa(ev64bof#-h{DauNtHc-+HR)`>YGwb*)RaSz z!WA!406M^lfu$Q-v-9)(wkL^t3?yod?2PkC-PJQ8GXVi{0J{D_mSBK~afHE_qy7CD zLsz(O$N&BNw8gpkS9g?(o4cziQyNA`Y;NLULw}Ej%@C%!I(NI7#}5ZWdm5<69Ie&G zBm(+lWaB#0ccn8L#fw}fW}`A22$kY%1%yIkxZIrb3W2PlqStOfFk;Y z0#(>!uAr@*K!z&h1W3Yz3+7y@YnQU~apxfRN5U2s`Kw>9__W^We50PnbF9rjFxVd) z5u&8r_v{bbyP?QX*{8<6v0&?FyT(9A-|XZc&+7QmR10^U-JvZgZ%anaerL?_*N$p( zeKN6;n&30b>9*xE`@!s>7~5=q*W>TWRXc;@BqeKFC_1-rwdBr%^oK?HMQo5j-TyME zbnsnCtIB0C!}MRcj5uPLVsi6*BPt4`MSak1yWEQF6O)AowfXrs+$*+D(XWINMQ(-L z4vh|T(bLl|FW-Yt8yowEgm`Q3(}|X;N$serSia8Ne}v+=b5B`IpF4ZmS*(b*%Z12+ zwos+^9WP_)N7M4R2bK##zWy&ooy$+RPKtN&U>qCX|D~}Z_u(#KE5z7j?JerB(XX{J z5AMG5~H#sjmrI1U{p$<3ERVL=@y5sg}U zG`MQ)r84reG&WcMn-fxh2lR0^eA2Yck66!+hJ~>Waz7Z2)Q=>0o(7tI0K!is4Ff}= zZ%THD2`>5Q`0ujJyr3GxNs?+5ReQ!R{pNL_1R3j}XwU0yo? z@K(Tb^YaUfxZ}2R6nDRJ)%F46wd`{b&v}zdHKVN6-!#8XRSP3ci_FGtmx&Jzn8_(d zY*y06{O=1Gwr|*spOiu+mYJ4TrPN8ik%y4v_N`lgYg{Hn26hKcwFVnf19f8#CMWwz zCfOnb?9A6*x=7EGUVp&INJ+i$&;?=GO0b3l%p6&S~6aG*=E zxp;U6>9(W<_?Pt#v1j+l7WHu-7=O*N#nInPp@DftownIDoYj%?Qa^b+IWb#`u@WoP z0*KfK_nsqQEZb->dzn+1v4825o}G%DjbBmowr0(i>!VqT$KT(7Pu0s(P56ILWB+_U zjv@4!2f8!SOX(i{N^y8s>k@Uid0BG>9zIVZZbUs><UWD|=5#=VZ$CqE4nZJ8Ca|pb>1Gco;59=QGf{T{;*9E}N) z_sLJVWfj6GFFz5|#3cSI7zsyoym~X|?k|k@q)Y73}LR+$mG_9x|D(p5H)XsLHd+L;DSF z{?8F=Y@4y@smVcfOU6-*@&WWYL)7j+?f4n?)`9!-?ako7JSE=3WXjdV1p$mN4jR>^ z4$FIL&Hse5h*~`9c63C4rAK>-p;5-owIPqQ=iS;hc&Iy)m%oj;aKFrESBCsYCpHDH zk`I^q#+-KRX-+y{zbDY7DJHR=*6i}HyC8GT4i5PK6u8~OR}WM{eqxLgTMXH&xGvOU`4 zL}uf)R+--3Pc@x4iOO`lTZJ8!dMw|`wGrkzZk~T4Bzzw`GODKfj7qQYp2l_sYGu8- zzW$x#s1ko=@#4(PJL2Ig(~afbp--P0{BK$}1*|bVdGd1AY#gZ}F3Utuy>af9IPXX8 zar**QB8r7(}QRNpJ*=Ed( zj(7=~Kj`oP`DTay8FS&z>6hw+>13tvOh^^LP_PK=x zOCkS%+aHt4eQY&Q)efeUjw?So_QMm#v@sb-Zr#e?n2^@$^XEN`o3PsYNMzt8z|XtE zYwa>yLb)cI)~!WJP2XE=r9K(C>Gd_b{n?$ntxvf*4~12MI~`HOR% zyn*8e{;i#zqs~(u2mZStJm_0jx~m^?fc|gM^ppKtG}^BvZumDC-gP^BK0M5Aw;{MX zGVGrB3CWUv@RL7B;Amb}YTcxClPBL1b$^p4SDoGL5fjsEPM*K2&>Ac>8S;s-b5aPK zV`mQ=-jAZepp}&kzANefxB6Vvb7a5=MMpg@#Lm(aDE%tU!#m^e+S=Hl663e^0#-T3 z===Zb#u>c-`tU@Ggc!sqv%e1BXU{oJPr;`rAUaQ`A&*S6Do3!&3Psn6t>D}rAi0Zq zusQ?%pLb(UqX)uhpHv>w89G2O{Xe{b>eZn5Rprh%lI`CL&E+LVYa;nK3s(KY_`%F1 z=oVDu_1gx%qUeC0bMTNVmFi1)Rm=H9O}X_;l^G&Y?O%7F8R9|uww*}6jcZ<_L4xxm zonmouYhC1%zn>Tcn0$|XzKdoJtYd_;q(t|7BkHjIYPO}zPL!>Q>fY9ZES-41ZhF;H zQ&klj8~(W-HjSXGd4(=-44I>J{;Jm(k%D%egp>~jDKp^^g#D-8(H^&vUc|1ryjn=K z`E4L9Z12$J*S}M01^05sZvU0Itdgp@ORMktT;MAy@m-f42N_o)V?X_lce=w>g`w4p z#i!P}710H;*?V2i=^viOM@PF1ui{!MXgGxw&(^_0?J4l~4$8>z_6;Frv|DF$8Sr$5 z69VRw;gjePZ8{jIG5q9qHz2m`jEXf)SUtv zNOuQp_;FJ3&ReXf9k$$nvg7;zSx;~(B35ogCF&FRY<%t6R^4c1f9?OzzDE?+YhTNT zYc>h&uAe=1DkFZLW@OR_kPQc#COk9ETP()pk&NAou{~L$D0sL1%r*v&j}pr@=~Y-T z_OmO)&pKtd-(56MXu646*ytbxEGReJ@7;Rw;1hcUh-(a(&YbttJozYY)7pPIcM9hBs%&9iOT818HC&o-5~Tt70FVQtw7^muq?%0u-wYu}$q z?|rNGMzqPjc!Bjis&8N*tnmGPC$^Sj=f=iZSKyuLH^iFID{Xo7FTl9g%xFlV z^RLdja;&@h(MZK@Zl4k2Y1i&=_2B2~ORoIe$zit?(Gc8kzHK3egdRN4hf#dfuGrkn z5R07IE%97j31!pO(Mn3OE`@kQW5c44gEC_YuC396W;=L-KbHqw@8FRTubl6l_m323 z{k!19Zo!J0yF+>=r97GF?r8PtU77vC%lGfEDpG3+mAVT~89UkFWT)cCTz9)tn zej7o6dAYAezNh|-^CdvcF|hMXNT~k{zX-t41Ag*eU;obCI1vOA+rN#2lk?%_FExTH zNvJUr#C-TzJdD1 z>O@J;Qny2~sR~1GNO~Xzt}`mgG!mf%*1 z6asbkR*24r_wU{&{!^)7p>twfrL{rD98#igG+3oef9y*#)}rc85HM0403g26ZLLnR z1eed5uYCD*Qs2G*n4Fz_P=8om9vtFXQIO^t5>2n>%#gYFbuFxat-omP&(af;n5=8p z94?Q##8+_k((>AwY2sl!m)Z|g@Hw4rX`5*wyJLA1yoR2f4)=FF;^uBW^;pbG6~rax zD3LGK`VqmjW4|LKEZ;Czu!83ovHthW>u3P%Ik)D-@YZA%<<}=FCuz>Tw%(lB8ghT^ z_#LCn3>uGZH^?sLNuxhX#z?ARa;(&-ySbbVe%LG6bfgf!=e8EoodCaEmStvSx>Y}XQ$6cNrujt zqR@f}Zr?s=_rs(dJ87~+btGC?DVJuHmE8Qtw!7bMB zIDg1N?a;gA{)1zKg`JHuC^0+xy=ef?f1f8S6b-`bDPWG^@{e+>;rwdOB5CwJ=6Y z!w&1{gQ+U}lV>maCLprWXB;&@>uy;8&ZJmovH!ySErPit$+@z>|5+7Z!kx>%j|k)B z!bT)Mi4}C_V`X((%GjP^A+0b#Ig1_d?Ty8?^1GOuov%>M)_l`3);`~t*c>aAmn+CN z(#)0BC7%-$ZU`(T#qVOC;x^EmM;1DmX5VENQW~u7QYI2q4B?S>$L8hXCLt!l-uz%9 zANTJMCRY7YMIcg{_?~ zzh$b4D0LTJqEgRADe^{<)dW|T6yZg3e9^tb9jBSY1Ak|KwQ{ZXJ~MN-gv~^)bsK9N zGUK6j-nZ8Y)!B_>q%m=3J&Ll_e#(~$lxvX*A{Tb3urUve5jgz+Vb6N0e4q+vp$QJHKc+PaPTH-kcthzSaPWk=e~b$X)!k@ z;icyezCC?^c^Nrw_muC6g0Q^2_N1GyQQM+$=huDLQIR*#8MRz@kqFK^{RtIjf|oq7!)$@Z5x zo?;^AkknLUgD1}8$!Z6iN*)`55_@1h)gWhMA|g!9%+#wZs-NyOc;PAMXb^dV4EzZr zV_e*7MrP)AU$2V(F@uu2`Vak1VpawYS5;M2=qAlxk&y5M)s$Z|_K$`iKtvSNdE?|% z55&m*{e87!BbZP=TZ>B1%oGo$-Z+y3ip}wEq`livBaIM02~FH|Zc%@b zAdFXFbiY=49RD3&+`@wXj2--!)LRA{6V;m+=Uy}1=GOdrZ7%~z1f5>B6~CpXZt6>u z?CI-c^w(qh*l2mPyD+tW>bFw+NQB3zbZge!X_- zkquU~-nW17P@wDY)#{BaLZ$!^oqifVngK$%re6=eoB;jGZ8`Th=;7zzdVqMWzoHIh zo&;ClNBpLDI9XZSTuX9tn1Gal@9A-1B@X)@0;Q=3<+{xWFLrJG?sj^JTAJD}U`%aQ zisHyh6x^DVn7y_oh#KQH9xT$B<*uKjniJY?XQr`GKhM#0Bo}mX0A+icBndVK*BS*^ z9tB=3zoUDKc7Sf9v06d<6W2yjQBi0E?)9Y50Q2mplBDe-9V@@flh=>T$GWTzwvmnN zyX9Dz{I-DP|-(C3mG=6josRXhvQk2ydD=Vw*$H3UREp_Xy zzJ9suYpm>Dv{nr%+tUNh02H@+PmU%@JZil1klU=lV)pLxIxYf%B7{ruwF)d{&O&Mr zFVB@_lB-9jE*u{_{>aYiMXZgc&cje2&P|k!MvYBFmIDs)kBqE|N@wSdL%+-nf%Ori z)d}5leI~pp2@C|*BOab;N@?7Da0#zppWySP%%^ZU@|i7#gKBwo^+qGt2WxAB@i%j0 zTmrL`}-GX+Cq@>*YAdP5z@l z)z~AQ*!eW9)#ZV!ZDV6YzBIInkNc7e|87-ueeC|;p3AXbCKrNfSdU4ek%uQFcT=4S zwK48^ERTS`B8;g185o%7u$8*P2QJF7XhGS@0K$d=AHJcYfB;<5)ZG|MEVtbUidhQN zlf>i?WFHABJd~0O2$?4%HM(y6P~P1pJ`ycbzU+lN{;m3OjACQnkzot^72y{z9!bG^ zl(_}Da#-G}o#|sL>J2_~UoZ6Y$pF%Rt3P=xV;zqc=L&08X>S&-f}uR(Vtu^w)*TFc z_QosmX=zKJT&24gK`3%^V)G@KRLe5xF1$iQ!U14M=<3d*Eyh|UAKlmaJ5muH6XSQ3 z3OHHw7Nhs?0X32LNMnfc@q=h~Xp zN9-g+Cg2%{S&_LIJ}HbPWSF{k?B*s!9;DSp#9Z}4xM8H!jNv>jKAxG&6dcffhJv;C zx9q#buT0NjB>AqbufqjXHe4kh+T`F+5z=Ql;VzFL-L0(ToGUFUE}jmlI!ShHo_mbO z^*7=PjD#Zz!vkx1$#{zJbM$V7)^=I7x>DTd2>Nd=fV;1c%{~%b=58N8sT(OVf$H0T zqD&p9{_yCCCND7<^Wd-@$Q|3g(`2Svx-;m{;M6~_H0iwamAk%YdU@8XO56T-b0aPZ zTTivP->etPVYkh3VeI&TYCL!dKs~&sf-FcE=x?kj0V3ptiOh zE(Eypbce_rn%~US^G)}lJ1Pt)R32^|ilZK~60NPZQl8qGNlQwSb6M|s4%8;poIK6F z0ds{;D@!htjB)P5qBhGtUd{IWhbsB+uTY#0WUlfUo{$Q#YCSd6FE%R4)ph_abcyMZ z;nW}5tB6!)DiQ0UUJaZoXdZ{*NBTCyH3bbZtGZSelF~2Oldq1uqvWrh(cH9(rMoYM zJ=DE>v!Q_!%VwhTG4S?aZV$%C4qAd|4-RZ+wqxUg*4PeW21}vSt!dp0kQX);8HP5l zwzSv2Ya}MWj_cAK2;%|t{(2FG?*P!tR6a-Ay%^n{B;3rk{-}_s3GU|JN!4pE;grZO zH1jn^CYb8!!r1}8(D7Q-6c}YcPA4QjM(QE6z&;Q>mUcPzcXt=}z65=3v61{W-#+xa zfl=*QXE+*dUe|8qkR=vjqu{OjKG;owlu^G&{w%{4x~jlhB|yMkMwPAF&LK@PP9l)# zXhO4ytLeaDHV`4E#bq_q^SN@hPk!O zbV$O2$++X#SpCkzfCQmfnfN)Y3%2^L!DAItsG93A zy1$W=liURI0K4%T=b`%gSV{xj#9V`DxzDrz8Kx6%ub!os*DXQMW{40-Xw%Y$^Cg5Lqqz09T!o8y(~Tl6%nT!Zrj z*K&C|KkSBtHL zyq~=ezm-5pU!S@(fzxotWpe_(wdUkoO-)T^<_%_Y%=IuUImFPS2X^GKAwbwuQ$=#x zcOsvthPm=3z+Jp-sCCCDwJkZ8mzAI__TLg_KVCZE-BVNXg~AV)!+Umc4&5ZVI5>H#IfOb|HWB1F{g2Bpp=cqXSB1O z=$O#L)v@JSX$rwLx!T~Ua_&VmVD~L_#ycGj?&t8I?rg)(|34BMr@aG6XqKbw`H+9V zi;x7MkYy}%(!)E~!d*aUY-*iD8HwmPp}iaiuwI&&=Kz9SiA@Mn1;0>7DQFcsXsXpzuu4Qg;*H70?FSb8&M= zS*k5yI|%pqOo9@_a3ISgRNe%a2m%vvkw%N7pohtMp@oQ<;7d6Zhe^qwVF9sn9O8Z= z=Db8B#UJ4ekxW1zq=ajXq;*?BL{*=gA;OBGP+xME!zsWLR9?*d6hx5~WV|Jj0*m#1 zyBG!^e<)-=dXEDe@JKx}6pb%IgG%tc2#+W<`_Xea&&PJUNrGz+*4Nje+19n+dYfy} zyz%fjR9?Ww^xdNh{ol=tdX@!CMb{^!zjSz5Cw%H{Z#AA3>65h%&n|~WAkLz)=e%WLB?rFUI$=s$gDX)upB@=lHtO7 zZ9e4lQR+9CE-%M>PpA4OUA4hw(gUF5Eyx`{&ZAvQ15EHlwKqA-Qgl5!shPKH9l)zi zOIv`kUmynu8()4Z`*%st0x-W!;+pyrnd+!i+HMHkraDD4x3ugi-Z<_rkBj>W7F_A* zF6TCoAV|gD^6~d)?yIX{B?aSh6W zZg-j_=O??P=x;g-y51!uY+awj8IOq*aCzmua=1CsWwOJXUYu9taItpVtMA74Hs0oV za%{W2D{3ASQe5W~Jc}QbEzRw_;ekWJpB=&HWU@+;*YpfYM9{+K`hR81bo`4BIAfb* zRe(t0X||cnVZ7XARY=MHR4bL1Q(n%TGWL%heJ7_iC55@IjRKD!*SO3JBeo`|Z5J}- zYp0Y{1L)xxd#9r#U^4RFV9~X)Lps61{Ig&)inIoB+L1KV!9Zl3dE%CkfVw<=Dj}}H zJyYQGF>kk<-kfP<=-vF0p5BgA%a^CyY`R=xeC)g<&I}V1+wuXrVqfpIxfhj|;&E14 zEp@r4I{iGSs_NKL$gXQ@8tLo|S8o9!+8ayIKH*!k;1Hi#jnw|Jx>6f#jdT$|ac;B_ zC@sQ9e=#d)_72l)%;1VfjgzDX+Y49skey5`;Lj4xBAdN^eCEHRH={J{cjj)e@?wW+ zNl{X!fSa8~+j3`2DIYidNPn&+2|_L^>VKbF+*3ycv zS#9LrbOVj1T5Roc*k{!JP|>F5M$wmFtm-z^a(fbWQX-iyE_ROlR#u4FjkvqCt3Da9 z8;l&4l`RDwZeGJB;*!$on$3mWa|_7H(Os|TyEtT|A^UEIWq&Z&qd7WQi(KZ1 zQ`zefMQ4pk%m0vB@lXH~7aodxTeiJLx!3S0+8dd)xvF*cH(|pOM@JXdXe~`G{r=IH zWzu{Q_i~8fE7{25Duqj?YI}ZNThz|644dxxq>DQBc}PwUb!+;~n)|+6&KNRpMEx)yhqtmPVW8tvSNR-`RZ4s)4O$}oVm5}+}pXc zkvmaO=QN*+or*T0G~^#t?Dxkgvy+ngnM*unfh1|?Q#IsEiM{mg4TwD`;DYzi-5C>c z#UH~m!Ar}_y9smmj7df{^ooj#cYRQxd2Ghn9Lf;4!ky}l|B(7cZ8($~CeeWM|~3BUxN5L{IQVe;@uZJ$4t`&HLNj|H^z_;5P)x5ZH5;q6VtdX4Mb-VKp3ndOx2amFQ@d%TNyQOU zP)N&sT`!$`I7V>nS;=fVCa zgbeF-IE75<>5nwR*!#KNVncdAjNSGXJHtZ|1{W7AT3bJXY>iftYwcQ#q@<)r;>XM% zDP33Qc6Qn2nx#1r3Nr9;o}MSc!9DOiuQlIBltXpJ@IzvHM*%R8)4o87aL#HVFog9w zA~CslaPYOHBqf5D9iCrHVopw*58_jA^Zr+P_`eo!zeXSkzXjl?Bg`Kngy>#ClY@hd z3`gqftuX2wog4!+M0pYsl-vHoI6iEE8;I99k4WA43_oOKWzoZ2o4%f&!L}>M^KBTF zK0z%uxw5kp?xFqb=*dJtO}+)MIpezgmBe1w+!vkM%ZAsFo8>a2dp=1W|M@}t>CWwY z_rN}gx0MB)4k24@YHo&<@LiqT1u-!d^4j2MOg!WM4AAGld{8)3YKD9E63aJpW#UkNADeU@Y#B$R(nhN8{?Ju z2%-D%W?nw64<=%^p3hKsaI9~iuiNifoGo4JZ;J1#N@kAnsh}A<{&IlyZbA))vlbd| zln3@*4EkT#dFGt@#pf(Nr|A7KfzhjwYBu7_#58py(6KKkJuJMhv#pV(=o~$l~VPm7&@~{rEB5IgP)P7FvQSjrubl z5@6%t01;1KMn)z@)F0ULY_1od0Mfa8)X~vlGFqZtVGT7(!#|17p{#nRo11~bsyQGI zIDLQ`nQIvw8Bx0jGpv;sv(yw66ui8Z(t_)&Yinb^K|g^xSZ*F3H7A_L zqiuXal+%-RGkY#ZMw7Xg9*8W1O0fYc>NNN3GbYUGL;AQ7O<-|0ub+-L)bDzl(Q`Vtp&(VzqtG;gLG8*D|RC41^-ZK%c?LbDN0-S z3W)8yuqa3d9^fWFG)>-4@<9=-s>Tqj$(E{7B;fuO+nfuYMh z|I%1S;Or?^PreSp@$<0wC3Ug>At6nxPv5`K0X)Vsuerf&qG}jm;uq(bq-4gL<(8?^ z2{k%8(_#2Uhik)Zj~*q1_@0l?pi3kEi{*>oIt`*gm)wLhU?3^C<*!d3q|LsIFiHEm zi+OML&=A~r4mbEw@roMhQkq&dPOy!HOib3Ff4*jw_c|yPZK)@Pw;6b^B{Wj81c6|B zqVwj>*Qc@J;hpRW-;UhjPSe_LrdYMFG#><^6He`Ui2^M^{{I4_X4f8UkPQ3Mv@31- z1+@0WPtOna{D@F|`W+u8REBaVk1kFrew$fb8Y*pqIvTuPEWouXA_g-~6&=&Li8^@vptk^cVS zXyc`<<7vEsbzNwLEhUZoPC%lPt#!SZ+K3O9c}#8oT{0&otj6O39)_2O7z>0_>Vm18 z7tVCn_{I)r@k$eSaRhO07o&)lq#odmGZQaq#suKdkT_#~O({2dnNIUY;30AC?2Y4& z#I^<4K5%Xk3ZBpSi32hwj6N02>h43A0(EX?+n3e}A?IJ%A+XdGf2x@PqU?;7^BS|p z(QJxX;H!SYoVG7FW>*J(7`#pFmM+&p^`^EvpX}Y$|7|h?hZQ59^>QyacnHL#)gJ3_ z!1P3!h(r5b*{8$B#*u4lYal!NTVzP7XbN0ppy+Cq%k}f3d(FU13JJI6%ZpHe?Pi-z zN`t$cMDoY>O~tIGojNGDZupI{J$p8nuB4;{ej9h&tXz^D4^2rscDG`=>9t*s=fT?S zOJr|vFQ@5P9pl;AV3ml{PqjYqS&IMDzS;Bq{kbY7kGQ2O=cXZ5^p<3#R|sDoA9HQGX?{$D5fr@NeYEzmhYtOd zUrm1wPjx`@qE2#MJZ1%#3=JmFq1s+n$w=+QBdR#1u{%^4kK%P|Tu);9h18))p7*VWn+t29WVi#IvEjM^QZe^V@XL&kw_d%5b@%)q|BYF3-8yw+TnVGi{3NQbKnsv2HhTbpi0=hkHZIt>{ z`l}OSF!-@M&FW_-o>e3*-E=jzF;JfH<-z@^5UwA4hkxJafr*VQ>XSt#vdbO)DDP#o zt*?Gu5|yUN&=zyqOCQ7J$R}A&Rd>wN8T|g201ernA$#5xS2>do z#~tA{po0M25CgLcG(H8p8T6$bZaFZQY~1U(a72(I_~s#igZ{ z?=`re=j%3e%`G6}+303!5HEyL-29%STjjqJgims7PA1_^C|{13N5smh=D)+>9J1>2 zc&WY;9rPR0a$cZywuaJ-jlGPs8iUO^+ax)odU=cU0jH>`rR9~fa%3ri!Ch*p*at{` zOoW2M67FSKf1#HVvqa#Qkn=}&GtgDSOwOFt|D#OZ7v*zWMq%q3@Mc5}D?e*dBxYNI_kmwaOAERyq@{l9`;L1{+kMi0 zWsULb3rJywpGJ+8ytZp^^%QL&#sK@rzXf`$(5d*cc9Vu^Z*T95%N1_2Jj;2bRt!k7 z>C9Bgy#oTY3f>zg2snRHy-!U1CXPq))vdMR!gRAqm*McOx%+NyN%ip-&S`>w0vlq zjEmu%BEpHSGFI-^sN&-Hwdf_cU()`EPR$<08|zu}sWa>A{N_^zGwDDEA~0Q3eqeg* zVz*lpNE%Try82)z4{m`^-+O1M{{o`s*Ly5u!>avxaQ(-@JZ}vkHuwgJwBJN?ZDUJI zOOr1&y~kBW)^&B6c190C$5p%JWBF4r#tU{P`y8yMCnTe6y@c87%pfGrfh~& z@MJzxzUk|6l|-Z|fbk?EFG}n-o7>-}y@}e{ADT3`b@N&su)^mtp0lnCARDbY-EegA z5wpZfl&9&z6b4&10G(?)v2b&64A$2>L6kXTiZ(p;E5U;J-P+%7WSL~lAe(^{k$$no ztfy>BQ<3q|bCvHfPCac-keDn-UwAVCW~v}{NTQaFrg7-ddg(z(LP9}G3gw@yq@*0E z7pE!VvXVh)+1g46va6(|>47ZO`}bNbqA7(^73R#Y9TQHUVkLf?8(aNyUaQfkK&UBG zhe>hxS&!&XU*f@lNasZ>T1Z{I%PjwjItV@MMaBg8Md{)lyHuqv)~UTyEZ zC@Dc%leRD(Lo>GC9HjpcSpa-U5yI=(^h`KRY%MM2Ks*~yVs;xEG8)de^xwY+qfd)D zRD#{Go3>8Imp04NTsMO&zkmO3Y^DLjKDqLGBo=!y{o|FwAzEO2$g@FC390r2_lDUc z1^OX5)+H@-7YuuhKnHo2&P}0NVjms?t_6{jYsn;}uO=QKcDBKe@(TL3i=)|kNO>SJ z-WVzN8})6>C7ui7e&`hq&I`S>u;{<|^(JuvpYBN7@(o0mLpjMYDCdjgOFli=4)3Ix zQwrU&Sx%o`TZm6 zPtWjm5;M zwzJ5ToKJ|0D^5=jtf?W-X@Jls-*#Zx^wx9tJAIJ6_fQc0GDyIg5k&J?+?ZH`xoCxa zb1VcWHKg%`D^J|=@?J@_`}PUcuim+RTO6LV>uC~y<^y)94JhdAE4_J>ou7Z@icn^z z3>~72*yw{o?C3?tj~`$aiVx!rlg|_kjRj=`;r9roW&ZH$>Iw^7gNJ4(e1Z|A5iCUt zff*E=ASSpkn^0pU!bJ!rnUL7i+gAbqAM@?rZA4fa)&P-^sHlE<87d*xUen$mQuL|G zghDZ!ktcyW|*Q;PJyxM~>h<5d1 zIt^Clq6*vP#ZY>@|3swJj#}m|)KP>%5iBnc>W=Y=2{mcZTUI zR;v$uM-Bo_q8J@-i=lUA{>zAJpBk70b}DI*|7#3znhyEPxeV5-iJJY9vW9o zU+*(AtxZoO=UQ%4Bt(LO04xdk|EIJ>oAo*x?Vfw&}{7Qc%2XmJf5r;&NheH0t*eg z8C9N6j*WfAM(q!2gZCn&aL2)vV(>eSy3m?owcnCqlKByVP9$KzH3g{~Owu+5QW$*v z*nt7mlvXR1l8?)f4mdk$aTxa6cYNzP+xS;EgAc&-4_Tr&0Kf#{+_hwy0*pLZA!(MH zqR+>!bW5J|QM0f-r#)WqXBLDmgT-!YdnEJW%7Eigj^Jc1-tlap4cH?BX(2f_6vIBG z+^QCNvNv35_pA17XLU&1RTy5hNO)A#^6F{Ch4HUnn@3(D1fx(dFDNXWe{y#4lVXUm zm63;s=g}iM%bUtAt)T`-fd(RkvLI{uscwh$q-o&Zty{Fa_Tuq|ggS?wGYngOH0L)$ zCPQhuk3IvJ7lU41R#rrN0d>ojyqqe8K>gLL4^B>>&gNmQqM?7b^ap!n*3Ek`VE(8D zjJ}<&;-3v^pCS|CAg%wFmzM|m2#6UfVV)K#$*xm>gn{icT7$KVzSUe_sg z?;zDGw_U#$4)gC)N2i!FQKuV~7?A7Ty@1Ri!F3t{04)h$~6DfoF#^9z=@Q!w+8|y1uAF;GY2Rwu+A#m=A{h*2oCO z(=qk-fk71&;b^_b(SGB@+f+5S)xAPTMQn@-=T zsFc}P0pF^_?ded!L#xAu&R<@q8jdrStnd(E5h@+->I|9YHO$&}c2))kKe3&zSd>Q; zYdRyH)0@AU@?H&Ifzq)@$d4b#;2f;Ia46XdIXfkvcN()l#Agx+7uPWsdb5N7I7k&e z)()CUM6SnMZqPd48+-49GJnz*sIQ+ELWM+4J9oFVc<(e}a9!`m?@5&l9TH2a^OxYB ztOM)ia;2Xw_AF&N{R0DBLAL`t6nD{B?JR~`GEo7ax#nq8PmiqpZbB}jqGEV0 zW%q8RuD{xdCe2oLXe!b%*4w354p3`k8RfdPJ&&b(rO}RT|L%oS)7TPzgtVgfB z195kGY=h$?#Jb|o_qzp|=dPKUrp$^4%BFZitmHo#j5>N6*ANaTq3!yJ&r2G#*w@n1 zvz)|0@&mP|J=hI{HO%JBQEa5n$sS$(uT^(+uj8qX=0!zY+q+_(l%h9NXQuNaB3~}0 zrGEokMPN`g=)4!j)p<-om!nlJ1=k-Q759r--PZz-=8C`ZJMz@Ft*cet1=-%B4l{EC zkUzG+fB_^02vM{)EqCUkKtZaMncP6Q(@2E>p8WGpNVZD8ZCjX+6Rp$5S*o|UH;5@y z-c4=!1dgOihlNMP$6u@r7)wYlWk1#+>nd$fnAx6pFj?bv`$8 zc-{=l2~_0^#ou$!E@9%RMDH(IqrRF%qw=Hu->=V|P6 z0{z8uKEe6M#8@n-SC#qsv2pT|^V)`RGIhIlM(=~$^o(FspPUbvoA1LRel!lo+J7o+ zupcIdyH3t}wt){O7)dh2uroBe&oaO7D4{=I#eb}c&KE-B2$yJw_G^#|!3E#Jut|A- z-jG?!sBXLE&gqpMYa7KfE1`vLYO~1iTU&O7h@b2quTJVHx45qr@*5zZ)!Cl^xl-n)0yPBDFRGndMJXTIEX7mN2RGGa685p}sWGnlSd1uLhR6fdQaI znL`wJS&cVW23BDncTXBNGEkD0!Z@CXHGe(jy{84$SvG}23 zx>%X1>Jm}^XvaerKA%-^X<#?%e*i_XI|Hc_G^Qz#^>VfbpJDGe;O!n=--$7Exzq~^ z+?+{?1$UvHO(MZgSI^$QwkLyy26h79W(Rk`4|e_Ub~>P18(vB=nM-W8g&RZG1QjbF zmY_gm_4DTs;Po6W^@KXL(7x&F)Bpv?JZ(TAvtF0$axY=XI>*^5!#Kf{sRgzcZC$@%9=nUP#*=-`7qFI=*D-EB~X?vlXW={ixxjg;)#2NRl7CxTPB zk#=RDl)e;?oVMQ|X6yFAuAL2^nO%l0Q)Jlpy5e4`Ee^@SeTsBTwy^X?tBFsnlfi+` zP&%aN_AFIf9c0YBcXZEl7J??c{tTUNq}RLn^t#h)n|M$zBYu`Kl=$4a%WmsrXA-1C zF?`4uIren_IXkoaI47MNqi#!m+`c=VRxa!n@RgkZQ;G-Zi@`~qIhSfWF4T^G;!{X? zYq0p~fk|1Dy(?%H@Vmbd6}vc>g3BWmkIZYnrc73)g;S$k+9|Mfl<AKCUlnG|?pN zjR4;kvrgFaCV^;M?dE*{o3+D9zg~)ZWVW6RdatqUo8E*6%fwS*6t3PbC(D>QEV$v& zuWCC+TULeBT*4K#mD7m4I&Exne$okQ&MD^*uOCXqGlW19pDJx4gm_c_ zcCv`X5kuFXKMxigl71)gx@JJu{Fp7SnT5OgM~Lp&mpw5S{+u|0i@hoh5Gw|z~13>Ge6v`GSaFzAm?{rHR{hBDJDBMj#5sTySR$9 zx3{e8)((Ucqu}|T-%~mL&i2^YzFQg+Rg)kHKV9hLtl09m2 zk(G?!AvRLg@}{ehWgKUcj5+5i+E({XA2|yNd(8cVgWK8#RO`Fl%{eOhmf$nHv9SR` z_Gq3CW%@l(qg-Y@{(^cBj*M9;Z>G(V1`}Qw>Gipc2(NG!@ zq7%!tUxhPuneyql8tZW5%qzX4zj=J99tBlksRV(c5)%d;=H&V{$FC&59-#?T(xYA4 zK0`t*5QKd`DU>ewp((^!_R-x;-aMy@<;t;}O~pJ-LNaIEoX`Xre*>Vs??TgHGp$25pK|;QB*f4y=kV z=0XLk9ri&*8`BZOrvIj!JIWkm-f0J10Gf3n6HVO9%sA@<2jA++dG?=Ww^eou*mYw6 zpi%EymSjKaDT)BgJVqRtkuIr(|B9DX6PEo*l6qOTW|8qZ(e9x-m0A zpq%pl{5n=uv~jt6vs{km}MC;)JzZ9eFbofV{u(C7b2g}W+h=_Emv{E8SN{6(dNT^FJNJ&X4-5@Q}h@do5qDV@Yg2d8@(ha-k zUhsXd|A%wVb)64qzPPfpGqbbL^UNK;s7K8)Rw#gMS66DiUlC`k7;PzktIGhWKq$wn z-h6h@%3F&b4Q1&pu`8*WrXvhYghyRgV@sL6g(vUG@I7LW$`u1zu609|-m;+_wW5`k zm(Z;I`=i7bB;uVG`?Jw)#_(K|o@H5EqH~=r(wdY>lBog^y=5XxGt~1~ut+wHVXPnl zXs;}NG6&fyLW08rVpGh(kK#$wv`O$lAwEe;FBrj-jAHIP0Du$;5m7!=*JHUZ6=m;Z z_Lq0mjGheSQy<{GcCtdknS5Um+556yGdBKJS?Pj|_1Il=!mw6p+$oGm8761^B{6+Z|IV|z@&D~^NQr`?6?t<2qeD=0tdClfjAqkK)D59h~8e7Vk!AT_I_H%Lt$puO2La4 z#Td9Q1dCTza;C4{o`-#Z{>;k8g23d4(|bPfErh8~?-jbThGJ$C5`t&DvkZ}R>R~gS zV{g+i2DOPVG9+T99uBb&1on}Uku^O|P6aidhj$KoCU|UITq=u)W17P>J^~--vzNB# z1dlhxqhuU*N6DwV>(ZqkEbQ!{LjJ8m+H{^mkqvo%Yi-Ts(=*>UZ*IM*zK-n6o>?65 z0_QJ7L%r|69Ubv5;ltiHgoW!&>m`jKHrx%>Eix%8DryeQJay{SuBn4Q{%H5t%S1&k zb}Rcf1MdI;qSDk?g=(he9^BihX=`aYE22wI-;eEn^A;iuT^*hCl13Xe2Vv#qgAA`x zN#)a#H;QI$>v`woCEd!)-?N20>HX>fz9Ufhp27>W5ltx4>v95j_EF)~goGCPpzHkj z6KCfkuLdo2^c7n&9+9VLg(te0%`_>=m)OOE8&kIh{!X-Y&ycfFVCDwpH(*v!P|D>dZ7`{M0# zm|vev>+5jAxl63?HR{-dut!xSdKl1SbloSq7-ip4?s=G7SH{qP$JFQZzl@EkCTF1^O{%8+Tqg`Y>24za zdR&S@6C~Lh$H%33d25R=z64A6#O>)=?x8iw)>mSad@POD9E}c`gY{mBMyRD8>rTk~ zKJ?&)a+FzL_ERJGgUOjcqR3IJRXz2djXxuEV2ECzd-(ZxdzvY-xwBw4s}QJMB7`{( zP&R8ilx-=&R#sPoeR5jGxg5mT@rLVZT__%VaB44PXzAvaE^75imT-z5;wZ04<7s0jHlN^i_FVN5cThRD^m)htC6*V=l zYco&N=fI{K8wREsuVB%(g+hD>(t#uEmpbz`Hsr-&}4*fmqm%mbS^1ewVr#5NJ0lp$INh5uUm=6!NI7zltzYEbEV}zII8@ z3a=ZbIJfApAGlI&U(?{Iac>v*x>Y@EG3aeV#-(75y&B6;%|*~4HJRMP|K~aCHLf|T zBNqn1uJn0`8+1AhM}1h3C@VInyf{J)G@5cXdVOiD>1CN zkJC5Y()3rtvwHlPwq8J`39P?NCRkl@_Y5`%%}O%spf4RAJBRyM^Eq6MJHEI7B}+Sg zQ~iTZE|s*ZC50~76=`F3_X$USayiNi{d>1gJC_Ra3Yh|6@*=&l5(ER5m|F(k(*&?7 z^nlL5%k&7Y`+@7weran{N==odp~;2<6hz50XhuBfhr)Ns%Y%m0IbmU)%}pox#Kbso zo#J@(fm43|Qri9d=};t_TU=bcuDrKbC*gUZegD4t(EAhsOR|Us0@n3?M#gpbEk`JG zdn;v|kD8a$8^65G$S?;o0~AdZC!v4iP%dL=*xr*Y>2z2(-yb>e1f9(vuEYFT6ZipkfNbT zXqm59F((B^Sir-DXPIedUaG`;NN}*>2lKnoe*#DMu#2BySqAJQLj5(gLe~+{!N;%Q3K`9Zyb{63+y(5#Gp^DoZp?(kEDDI|~kR*k^+2`nFetczP z+#N%BH);YNK)JIv6o=aRz`iUOj{HZU_Rs3(^bQk}3kP_GcS6L8dG%=AClKkyZMTRf z5=3f)SP&^Ll6Nj=L9f>GPc4i+4)P(yZ<`J*9W{lgtFH zhwzy^!L6%>RowJr5-;-?ph*TBl}|@lj_o!P9P~O|msh(4vGfEng3@ zxFZu_T4ygIHLq44gVf>dnxM~ey!~HarZ<8sFe~inUH?YU4E_n4>djJyM3t0;1nT!- zhSvhrBba4-u~R8<8B>&zf!9UVDCL#PAy zb#%yrYBYigo|?WkR?ydr*gTUyLnJ*+HRPOA^f_G~^gXrfs*}DFO03rqNxss9+Qqs*c(s8Emd!jDH zq{>kI~yAtZqZl~kyHCG zSU@*RsdcbCvEJ*f$n1m>BBFf#%%NL~xmNDlOT{<-@vTbnk|?;=87R&|I_>D}3sapF`(AwZd4dN_nh#MZCsFW?tU!xxG_LP|RmRoT)du5*jqhe#f&^dm;Y!@nUzh z)=p1T0evBV1DY|>QBh~48?!2667Ixm$pESWH{##{$3vio#{#C(nprtnS+76>XiYqX zt0ZR`H%y>cqWq?d1qR2v;caX*rQQiW0z8G61uC@&@ICy`0sJNZ+k{s-mUF;;GWNvL zKs|aXGgI4(0iDtF=NGE(R9975KYkoN3R;3tcf4WM-7q{n3~XF7y6!Y0w>}`YT{wUK zob>Br0VWaU8?%R?wmQ%vo1|L5XQ_g^(AJUR{`uovcXtrIZdNEcZq~yb{zT+L;|&x7 z85tR$CN`A>Q9vhEVW1hBclEi4hu*t;=NTC>fH2W1&;{8Is-5g)0w(W|<`1Oh10xHX zq#g)wXK7t&RoYIw=0%q2+3DK(rh@Xj^`ZSv#rx?;w~o%CuBuZ?)lg!|_$43|2&d0{ zSfN}?M@7Yi`3?2*A`=NHgsJ*ZqS0#;pCtf|5_a(>U_wYMuHws~ex)%-=iUwtSNmR| zZj2&Q&NL~L3d^&W-3oBTIHjU?CMgDX4yRW7XQ%J0u;$teRSO1e2>$zO(hx|xxVe#C zk~E*~I1d~$&VE0b^`F3iFK2k>U7{h(nouwbB^*Me~d-OC8 zm~idt)dkk}kl!%bXQ(3>C zA<8~rMMnpGn5DXfq-^$`KNggnY|81KslYwlO5K@^&nvfA2Wy^u(L*|4)YUTR{r4`j zki}k}z(vNr)vTH}+huvm(S^UVJr6ME(QN{+lzx442nDf| zM(!C9{x}@5tp~~HhT)wD`?H{9^1$5OZ}Q!{CBUS!u?3+Ip!*JxZ+?T);m@Bx_x3V# za=tdjrR+)&v_a{?lx_^XK%prudh;gv1>ud+Dq^V7w{2zvz5$0j0RP3Fe%bkxS-;y1 zZOr!VD~+A1FLK-vk`@mrIazUngFDGhw72P6Oq}A)w3m%*Bb2RzIffzmZW+H%NA=0& z;qw8IJAC}rw>hmkL*Bg)l(iw54V5S2{^(GZ4NKGKJDTG!#{)g#gHA!*K`Fo-ODwVcTwFm~BuZj1z%WzcQc#^4>iIx}7xNL2>NSKy zd2EX-MX?tPt8eE#x4O%p|3Jy)Tt*#2Z~PoJ;DmT<6~~ilNp0O#)Uvzdzc1_uU$UgY z_&iF^=1=TR&2e0j!<%vHhZv_eIR5dfOXtOkmz_MKLQ!r@>EsK?3rkk!i%bMy5MyIw z3*Wt496&{T3Z-!$Kz(=r@2`EhoJdfBdFr<#bqRyPBokQmW`0=F*3v=&y06g=ysKb! z1b77?SuS0trB464+Z<&p==4tU+@;*=a~IbsLS3m9jUQ_$ozm&cp_I%pclyrB5ff!m70ZMVtU$fWdZ}d1gIRl zu1s`IC%3h?KOV>*XpcKYnwvAvv5W?o-hU0kEI{#6Rcv{_3CMWxqXj6-pTRVfx}_qKN?=S+yp<{U}qFRDq8A=g*#{Qg({+?nQ5* zENzg=>-_%)K`K$yiTlu_8?N^n2SUgdX69_w!;cMXV)2NM#nGyDXc4t;Mu7)%CBJuf zcSOx>dSPKxxRIu*sZ`Fx`Eg}U2?2riCSraO5k0dG=;-25=88T9#Iv8OtG57A15^kY z-%Q@U&aLsf8<}6VHTV(eYwhmp1_2zj4Ie+s{lH5*y|?wkNPy?b?sK}wJ*l@c^X~kr znBqE`h2Fh7Z~mUX|MY3C?f4iRNXeOy>FG?H4s^`ZJcQ@NK(hhgv-Q8ASB6&G(Mryu zIIjyAE&%5OYzzGY0_5c7FWqodptF7WP|#(?GMI*UZELHuvvUk)V>qJ(d}V(Vw&pOzaQ@BGsSmkH4a3WvOBXbVv41VA=GK47(T}{$sE@69?vwcAQ~ofxjvq5SX%aEY-8(Q&ZpP2Pq3rm~IH=UGE!WI@*VW z2X?Wtv4NykJ*zo3z0kPoq-2Ch4ILdUf`Tu&Y9k`-Q0r~KW{EZHY)xIY5HTftM`t|BE!8zO z^L4*p2QVquH81Ra(C5Qnv0daUEi|=QIw!4`@{Igl{{rL+5biQ-ZQMLTM>h|mI}UUz zu@ps>K0bUy2t0-Jy5V)m+xfAabhLR8L^t$B}glPF=JjWe2G!IvSk)L+`zF33ssc z`8Ii;!lI(NrFXQ9jIf-5{WwJHiq!EqQll6EwT+ByD5Y-&R0819!0t8QZj_#AQ;sIV z+aidi^J*n{m;C;d<7JHs=AcfdS5;jD@7sp@yu5C;6j`Va;I>`$4M0^MZ|Sm31pi*D zn?tlC9hA?!T|jvJC-pc{%s4bWIJu6fOzKErS7zo|;*uKt8N(M1P36048}*EW$1OM0c)ZX!lM`q&+zrI_dKr9U-@Ge>uwf z6yNWd(!qmF1k@o3e2*BiRd3$CGb&7k{=-=qbl&C>=dt^{1V4whbu=}Z|Lx;yZk1b< zlk-@Y) z!i$i@)W@Wzrb1?#m`FoGfqbB)b8X7&h|iKPjxHyVkf?q6vIQ(YBqv&0T3Fx|JIin@ z95hV~4f~q1%1@+X`2&tGHWMd2h&&n_4!2EV&!g>s2C)Almi_cCaAl6cUOhbaX1XXJ`lnNmYIQ7)h6%l~tgd zLUUDy2&limL1YJTmtYHDkd+ndHR-WWrk$732cVIosgB^_BD)QOX;`#>e0BAm!#yOf zFTtiHoS|RusfER)B__~m$x$&fez5E^6;FpJtd*5|1u_L>=K8!I&UH$FMpB`{K#)>e zjU^sn%Aw7YYgo|!5^@o}91_V3-ImHb9hA zdmge;2Z&~HHkS4t9GvibG(q%A?+?_~!|WhoQwPm0q?qKhrH7I;%9%>*6jW3lJq6;d z!IyaRJJO^~Qyl;-_O~}Hy0$hYG}H-1@t~Ix9v%+N&pRqAPaZzhF0;|;>+Mxd6$d*e zz%hRR{(WO})BlXCvy}5+b4SOJ{QN~I=!<^%O#SE2;Tk}7AxgJ5@G<>ak6nRBs%fno zzy+KjV@n-?s^*S;SL&gpBtIbgFN(WN1Be;GPQ{=;#S)q`7Yvr!C7@>xQVxcONr7U& zHuuVkK75FTCEVpTVAmitgRYuAAYME30R0_oimrf5d#9O2M4pqAlO~2r)#GJh30Wr) zr!*-8gixxKR}VnaAeVP(b$xAGvobp{y;egf?ixxz;5yv5E=K#wVI~oj!-|B|nxa=o z2Ku#K6!B3l z;=;mz8}wX`hxrUqMJ#fp90mRf&l_wXJ!-q9rLA3>m&Zv+#&8;p?ojFt8YImQ^5Llf z>y~ULld)hgT>qJWYydr%L ztaha?Sj=s*4be>Iywl1F~gg_3JTVPobRMQm^Dn@&5hNlbRYprl-N%3smN)N6k*O+-NISE+SDc{z=xDO6B^L;LkX z<(}xxiOJQP$3v>(X#fda(FLT#pUvMDqVeAdz!(bZGQjQm1C20;@&ICIXp1~{g$`d- zd#iw>gF{Re(ZS^!hnecD9ZAuYq%}!vPsFazU90&~2|$G>Mfv$_L#BZ&deO3+-YjER zT)`PO!r6+Jb`Fp*sN^nv33qqHPTCc>Rl{|Im9dUb{OrUolIYi3szlx*m&rkw#u)Tt zENMj7zm7!Fz8ZQ_&z7&s)&39r9$VrHEnWC(>aQRay}SSalnVkqshiwrAX1&T?cBbGZ;+*yLK zrr6y%Mu5jO6}xYnGKdkQCem*^7*H7Z)kfZqWxGqiIt3k9zmh8A8GuAFkXJk%NxTvd z=^CIQ(5#U0i9K7wpZTi9;ECetOTTrvv*R~VfSnNZyE*_F6tEN58e5DEklh|TE7$Z+ z$Um!z5RY~AW9LD^R%6dVNO^dkPF3(Vyn=ua=}Km{3b4~RoQEgyd5S*XlRr}9=Lc; zKcQjwAtBii!+upf-5K1Ga*!eYX4)GGiHqCx+ofK};U*y= z5lx`&9G+_iT>8prCD-ni&po2y)7mGNDQnDJDxW=-AN%5$Xw#P+`}RR$a>b{pn3%6x z)RhMST!o-|(;F{s?K;e|bbvQU71eoNTKqfqa?aY;wz(><=27GC7X8;yK3$o6jgm?Z zMpIAfOyQ7`*DS4E^njr8GU8LztDy?ZF62R|bcQO8qpQW{rrZS~Vd1#(e}cLU^diU& zP$2W%nPl%Ifc{gZehJ$sx`h*AVL?49I^LSMwXvW@LP{zoi_R5gVruwNMHW8SjRXjA zql)P4bhq~dsC;oC`JO#{-%i>;D%l}+g2JDI7Kndr`0}G9t)E%sI~)Cs?uhdeCWC6T zR*vUqu-z-Fxc`|M8Bg=moH)y(ordAXkC74kQAvw776>uJCde+{;HqgOU87|8d=H?L z`nr(}xq3JE`sv)%W)ws7IZ1N6awxE{;MgkH;CocU z;=x8^eWH8f_sUrk+svIzseeWEm7mwnL2C@f%NE}%FN>+9>AlvI+G#2r4(5o37U zKfr?QidcV470YM{k7Fd8I5b6OiVL6xhjg8lpCs|RjEM^Agg(B1`+Kny=+}Y%{%3mL z*~z$@D34S-1p`~*aBIXNEGJRK_Kt(>y)}N#b6=a;?Meh&gPyVmx4zRf(Y7aP$K&BQ zghT@LaeFWD6~R=zNbyI!TAa5vkQ>#PUFdsibLx(j7(1sqk@uG=BfWgv;bMQoDSx9D zz~L&ElIdI*C=q3&eJ>pOqZV&y79hqTGdc>8W6v8Nd)VA}E6qz|wSni(MS_B>jO3kn za>0)dnt#N=QvyVUEtiHPYp9#pJ6^ieOj94AgI8->$7@!Bvcyi?&K@#HUbVphJrk%2 zAIDByM3Rkj3EhCQOyU)rpKuBP(qzQx4Izv@9f&EMMmC8%Ek5zN^%)i`LXsUpCZ-ke z_xkX`p25|gqo+X68F{M9ONQ@TVN{j}p-3w}eqd2mBe&VL%=p2vF;L#uXK;Z|=ZmRn z*Y(+!kYdp&3PN>;`OM(&Y@AsDZ4-^zCl*Liu?Nzwy2)R3^8oVVnDvu zn<cqM{8Fyljij|D>>oyTPssj4Zp@WgMgj%XWR#@C-11Ew3`7u0+Bzbvz^+k zV`eH7Pik;kFOLV>`6-Cif)w@#2sEPaspNJ* zMPvm~^Q&wt+vN9Z_sEe7w5lc%VNdfEbhuDoT0`(GqN>nQJ!rVEAYZh2GRQ(z!=bLbG5D5$Jw1{FvgF=Qk#<%V}(F)p*|N#o4-Gt5xXc-f7a2^rc%I!~kVJ~O#`9ft zWmzT#grafz6V`A?6zZIk!M%H6e7**%%#8y?HB(XZqtx+tlgbAQ=6=??)3*L_5cWYy z;V{TxhpgI#y~R@9lG*+()Nt2Q%h|Ljbva-NT37V1!BEx&c6o%^BygQ*$K|h20HERe9spP)%MTbAG1!3c z&5DbMhXj{319h5&`y?b+qsYC5oV3#yG0IU@rQk*ePi-mpt>>DW4j_;xCU%Z`;dB9* z0Ro20q;!4=x*^1Gj1(ugQ-q%i*K2GpJ`26@DYytP{`|*mt0 zAHJ^?H8@x-I1h0*I;6MbHOem@g0e5fDg+u_p97r9>|KMEOzIjH&w-rqFp+FXaP?3liAvKo}M<13SO9>R~QQ^E*2G&6-!Y&?viSs zW|*}*`LVoQIMC}lu^m+e;N1#+9k$TlZn0Geqk`W}E07s7UwP~2PBhEU!;_q3oTb*o zUk6tP-nW*E{rs?OciCS4TXr{bqnD`Ss-TESv{5ly{$3ON#Sx|G5+w^{CHCqm9&=N~ zb;X<_QGZHWTD_uF!-o&2Ap#ZCXO^ID9wr*zm$2lUUShdD+9VfwdFN>QIH0lT&M0}(6cs}PUjMbB$At9j{??+H2Yg%tN{42E}g3|4r|C6$NI}mZ= z(sJ0ml|Zcfc>6!SoW#QWSnRX&9)LF C5!ssn diff --git a/web/lessons/README.md b/web/lessons/README.md deleted file mode 100644 index f5a539b8..00000000 --- a/web/lessons/README.md +++ /dev/null @@ -1,422 +0,0 @@ -# Lektionen und Aufgaben - -Alles in diesem Ordner erscheint im Lernbereich der Web-App. Nach einer Änderung `npm test` (prüft alle Dateien) und -`npm run build:site` ausführen. - -``` -lessons/ - de/01-was-ist-ein-struktogramm.md Lektionen, die Nummer am Anfang bestimmt die Reihenfolge - de/nachschlagen.md Seite „Nachschlagen“ - de/begriffe.md Fachbegriffe mit Erklärung (Hovern oder Antippen im Lektionstext) - de/aufgaben/summe-bilden.md Aufgaben - diagramme/l1-tee.visustruct Diagramme für Lektionen, Startdiagramme und Musterlösungen -``` - -Diagramme sind normale `.visustruct`-Dateien: in VisuStruct bauen, speichern und hier ablegen. - -## Lektion - -```markdown ---- -titel: Der Editor -bereich: Erste Schritte -kurz: Elemente einfügen, Text eingeben, verschieben und löschen. ---- - -## Die Oberfläche - -Normaler Text mit **fett**, *kursiv*, `Code`, Listen und [Links](https://…). - -> Ein Zitat erscheint als hervorgehobener Hinweis. - -## Nächster Schritt -… -``` - -Jede `## Überschrift` beginnt einen neuen Schritt (eine Seite mit „Weiter“). `bereich` gruppiert die Lektionen in der -Übersicht. Innerhalb eines Schritts gehen `###`-Zwischenüberschriften und Codeblöcke mit drei Backticks. - -## Bausteine - -Ein Diagramm mit Vorschau und Knopf „Im Editor öffnen“, die Zeilen bis `:::` sind die Bildunterschrift: - -``` -::: diagramm l2-ausgabe.visustruct -Eine Ausgabe mit Text in Anführungszeichen. -::: -``` - -Ein Java-Beispiel im Text mit Knopf „Im Editor öffnen“: Statt ```` ```java ```` schreibt man ```` ```java editor ````. Der Knopf -öffnet das Beispiel in einem neuen Reiter, die Spalte Code auf Java; dort kann man es ausführen und verändern. -Der Test prüft, dass jedes solche Beispiel ohne Fehler geparst wird. - -Eine Übung, die VisuStruct beim Klick auf „Prüfen“ automatisch kontrolliert: - -``` -::: übung l2-hallo -titel: Hallo Welt -auftrag: Baue ein Struktogramm, das „Hallo Welt“ ausgibt. - Weitere Zeilen gehören noch zum Auftrag. -start: l2-start.visustruct -test: - -> Hallo Welt -test: 3, 4 -> 7 | fertig -braucht: verzweigung, whileSchleife -tipp: Du brauchst nur einen einzigen Kasten. -tipp: Ziehe eine Anweisung auf den Platzhalter und wähle oben „Ausgabe“. -lösung: l2-hallo-loesung.visustruct -::: -``` - -- `test:` Eingaben durch Kommas getrennt, dann `->`, dann die erwarteten Ausgabezeilen durch `|` getrennt. - `-` heißt „keine Eingabe“. Leerzeichen am Rand zählen nicht, `2.0` gilt wie `2`. Mehrere `test:`-Zeilen sind erlaubt. -- `start:` (optional) Diagramm, mit dem die Übung beginnt; sonst ein leeres Diagramm. -- `braucht:` (optional) Elemente, die vorkommen müssen: `anweisung`, `verzweigung`, `fallauswahl`, `forSchleife`, - `whileSchleife`, `doUntilSchleife`, `endlosschleife`, `aussprung`, `aufruf`. -- `tipp:` gestufte Tipps, eine Zeile je Tipp, vom allgemeinen zum genauen. Jeder Klick auf **Tipp** deckt den nächsten auf. Jede Übung hat mindestens zwei. -- `lösung:` (optional) Musterlösung. Sichtbar ist sie nur im Lehrermodus (Lehrercode unten in der Lektions- oder Aufgabenliste, im Code steht nur sein SHA-256-Hash in `src/learn/teacher.ts`). Der Test prüft, dass sie alle Tests besteht. -- `unterprogramm:` (optional) Unterprogramme zur Musterlösung, durch Komma getrennt. Ihr Titel ist der Name im Aufruf. Beim Prüfen findet VisuStruct Unterprogramme in den anderen offenen Reitern. -- `datei:` (optional, nach einem `test:`) Diese Datei soll das Programm in diesem Test speichern, zum Beispiel - `datei: einkauf-neu.txt -> Heu | Äpfel | Kuchen`. Verglichen wird Zeile für Zeile wie bei den Ausgaben. -- `code: java` (optional) Die Übung wird im Bereich Code in Java gelöst. „Im Editor öffnen“ öffnet die Spalte gleich mit und stellt sie auf Java. Geprüft wird wie sonst das Struktogramm, das beim Tippen entsteht. Eine Musterlösung ist Pflicht, der Test tippt sie als Java und prüft sie. -- `bereich: struktogramm | code | beide` (optional) Wo man die Übung löst. Die Karte zeigt es farbig an (Struktogramm grün, Code violett), und „Im Editor öffnen“ zeigt genau diese Bereiche: Lektionen bleiben offen, alles andere (Dateien, mBot2 live, bei `struktogramm` der Code, bei `code` das Struktogramm) wird geschlossen. Ohne Angabe gilt `code` bei `code: java`, sonst `struktogramm`. Für Übungen, bei denen man Code tippt und das Struktogramm liest (oder umgekehrt), `beide` nehmen. -- Die Kennung (`l2-hallo`) muss überall eindeutig sein, denn unter ihr wird der Fortschritt gespeichert. - -Eine Checkliste zum Abhaken: - -``` -::: checkliste -- Ich kann ein Element einfügen. -- Ich kann einen Kasten löschen. → Verschieben, kopieren, löschen -::: -``` - -Steht hinter einem Punkt `→` und der Titel eines Schritts dieser Lektion, zeigt die Checkliste daneben **Nachlesen**. Ein Klick springt zu diesem Schritt. Ein falscher Titel fällt beim Bauen und in den Tests auf. - -Die Punkte sind kompetenzorientiert formuliert („Ich kann …“). Rechts neben jedem Punkt schätzt man sich ein: ☂️ noch nicht, -⛅ teilweise, ☀️ kann ich sicher; danach folgt **Nachlesen**. Die Wahl steht wie der übrige Lernstand in `learnProgress.json` (ältere Häkchen gelten als ☀️). - -Am Anfang einer Lektion stehen die Kompetenzen, die man erwirbt, als eigener erster Schritt „Diese Kompetenzen erwerbe -ich jetzt“; die Lektion selbst beginnt mit Schritt 2. Der Kasten beginnt mit „Am Ende dieser Lektion kann ich …“, die Punkte -also so formulieren, dass sie daran anschließen: - -``` -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Algorithmus ist -- ein Struktogramm lesen -::: -``` - -Eine Quizfrage kann mit `→ Titel eines Schritts` sagen, was sie prüft. Ist der Wissenstest fertig, zeigt er darunter die -Checkliste noch einmal mit den Abweichungen: ☀️ gewählt, aber eine Frage zu diesem Schritt falsch (mit **Nachlesen**), -oder ⛅/☂️ gewählt und alle Fragen dazu richtig. Zu jedem Schritt aus `→` muss es einen Checklistenpunkt geben. - -``` -::: quiz -? In welcher Richtung wird ein Struktogramm gelesen? -→ So liest du ein Struktogramm -- [x] Von oben nach unten -- [ ] Von links nach rechts -::: -``` - -Ein oder mehrere Bilder aus `lessons/bilder/` nebeneinander, die Zeilen bis `:::` sind die Bildunterschrift (dort auch den -Bildnachweis angeben): - -``` -::: bild ike-nassi.jpg ben-shneiderman.jpg -Links Ike Nassi, rechts Ben Shneiderman (Fotos: …). -::: -``` - -Eine Erklärgrafik in voller Breite aus `lessons/bilder/`, am besten als SVG (bleibt auf jedem Bildschirm scharf). Die -Zeilen bis `:::` sind die Bildunterschrift: - -``` -::: grafik l14-array.svg -Fünf Fächer mit den Indizes 0 bis 4. -::: -``` - -Steht hinter der Grafik eine zweite Datei, ist das eine beschriftete Fassung. Ein Klick auf die Grafik blendet sie ein und -wieder aus, darunter steht ein Hinweis darauf: - -``` -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -So sah eine Lochkarte aus. -::: -``` - -Tabellen schreibst du mit senkrechten Strichen, die zweite Zeile trennt die Überschrift ab: - -``` -| Schritt | summe | i | -|---|---|---| -| `int summe = 0` | 0 | – | -``` - -Ein Zeiger auf den Editor ist ein Link auf `#zeige-…`, zum Beispiel `[Elemente](#zeige-elemente)`. Beim Hovern oder Antippen -leuchtet der Bereich im Editor auf. Bekannte Bereiche: leiste, elemente, struktogramm, objektinspektor, reiter, titel, neu, -oeffnen, speichern, exportieren, rueckgaengig, textgroesse, einstellungen, lernen, code, simulation (Liste in `src/ui/termTips.ts`). - -Ein Kasten „Angeberwissen mit Ludwig“, in dem unser Maskottchen Ludwig der Geißbock eine Hintergrundgeschichte erzählt. -Der Text darf Markdown und Links enthalten: - -``` -::: angeberwissen -Ben Shneiderman hatte die Idee 1972. [Mehr dazu](https://visustruct.visucode.de/de/angeberwissen.html) -::: -``` - -Ein Spiel „Wahr oder falsch?“: oben die Variablen (`name: von..bis` für ganze Zahlen, `name: boolean`), darunter mit `?` die -Bedingungen vom leichten zum schweren. Zehn Runden; Werte knapp an den Grenzen der Vergleiche kommen öfter vor: - -``` -::: spiel -alter: 8..20 -schueler: boolean -? alter >= 18 -? alter >= 12 && alter < 18 || schueler -::: -``` - -Rundenspiele `::: spiel zuhoerer`, `vertrag` und `layout` (Swing) sind in `src/learn/roundGame.ts` beschrieben. Dort steht -auch „Bombe entschärfen“: Code mit genau einem Fehler, man tippt vor Ablauf der Zeit auf die falsche Zeile. - -In `zuhoerer` darf ein Zuhörer auch als Variable stehen (`ActionListener z = e -> …;` oder als Block bis `};`) und mit -`knopf.addActionListener(z);` an mehreren Knöpfen hängen. Im Zuhörer gehen `if`/`else` (auch verschachtelt), -`e.getActionCommand()` (Beschriftung des geklickten Knopfs) und `e.getSource() == knopf`. - -`::: spiel reihenfolge` („Wer ist dran?“): Die Antworten jeder Runde stehen in der richtigen Reihenfolge da, ohne `[x]`, -mindestens drei. Das Spiel mischt sie, man tippt sie der Reihe nach an. - -``` -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt genau ein Fehler. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Soll 1, 2 und 3 ausgeben. -fehler: 2 -besser: System.out.println(i); -> Am Ende der Anweisung fehlt das Semikolon. -::: -``` - -`fehler:` ist die Nummer der falschen Zeile (ab 1), `besser:` die richtige Zeile. Der Test setzt sie ein und prüft, dass -Java dann keinen Fehler mehr meldet. - -Mit `stelle:` (nach `fehler:`) tippt man in dieser Runde nicht ganze Zeilen an, sondern Teile davon: die drei Felder -einer `for`-Schleife, die Bedingung von `if`/`while`, Ziel und Wert einer Zuweisung, Aufruf und Argumente (an `+` -geteilt). `stelle:` ist genau der falsche Teil, z. B. `stelle: i++`. Ist es kein Teil der Zeile, nennt die Fehlermeldung -die möglichen Teile. Fehler wie ein fehlendes `;` bleiben ohne `stelle:`. - -Mit `daten: csv` (vor der ersten Runde) ist der Code einer Bombe eine CSV-Datei. Der Test prüft dann, dass jede Zeile mit -`besser:` so viele Felder hat wie die Kopfzeile und die falsche Zeile nicht. - -`::: spiel frage` zeigt in jeder Runde Code (er darf auch fehlen) und eine Frage mit Antworten. `\n` in einer Antwort -beginnt eine neue Zeile, solche Antworten erscheinen als kleine Datei. Mit `antworten: txt | CSV | JSON` vor der ersten -Runde gelten die Antworten für alle Runden, je Runde steht dann `richtig: CSV`: - -``` -::: spiel frage -titel: Spiel: Was steht in der Datei? -intro: Sag voraus, was danach in der Datei steht. -frage: Was steht danach in der Datei? - -runde: - PrintWriter aus = new PrintWriter("gruss.txt"); - aus.println("Hallo"); - aus.println("Zora"); - aus.close(); -- [x] Hallo\nZora -- HalloZora -> `println` beginnt nach jedem Text eine neue Zeile. -::: -``` - -„Prinzessin retten“ (`::: spiel prinzessin`, beschrieben in `src/learn/rescueGame.ts`): An jeder Station kommt eine Zahl -heraus, `alphabet.charAt(zahl)` füllt damit ein Feld im Kreuzworträtsel. Die Felder bei `lösung:` ergeben das Wort, das am -Ende in den Code bei `tor:` (statt `___`) eingetippt wird. Der Test prüft, dass jeder Buchstabe ins Rätsel passt. - -``` -::: spiel prinzessin -titel: Spiel: Prinzessin retten -intro: … - -station: Am Burggraben - int zahl = " Zora ".trim().length(); -frage: Welche Zahl steht in `zahl`? -zahl: 4 -feld: 5 1 -tipp: `trim()` schneidet die Leerzeichen ab. -> Übrig bleibt "Zora" mit 4 Zeichen. - -kreuzwort: Fülle die Felder mit Fachbegriffen aus Java. -- → 4 1 STRING: Datentyp für Text -- ↓ 2 1 ELSE: Der „sonst“-Teil einer Verzweigung -lösung: 4 1, 2 1 - -tor: Trag das geheime Wort ein. - String wort = "___"; -ende: Zora ist frei! -::: -``` - -`feld:` und die Wörter haben Zeile und Spalte ab 1, `→` ist waagrecht, `↓` senkrecht. - -Ein Kasten „Ludwigs Tipp“: Ludwig gibt einen Hinweis zum Vorgehen, z. B. eine Brücke zu einer früheren Lektion: - -``` -::: ludwig -Wie beim Tauschen gilt: Überschreibe keinen Wert, den du noch brauchst. -::: -``` - -Eine digitale Caesar-Scheibe zum Drehen: außen der Klartext, innen der Geheimtext, darunter ein Eingabefeld, das live ver- oder -entschlüsselt. Hinter `caesar` steht der Startschlüssel (0 bis 25), die Zeile darin ist der Starttext: - -``` -::: caesar 3 -LUDWIG -::: -``` - -In der Simulation rechnet ein `char` wie in Java mit seinem Zeichencode: `(int) wort.charAt(i)` liefert z. B. 65 für A, -`'A'` zählt in einer Rechnung als 65 und `(char) 68` ergibt `'D'`. - -Eine Textdatei zum Einlesen. Der Inhalt bleibt Zeile für Zeile so, wie er dasteht. Java liest ihn mit -`Files.readString(Path.of("brief.txt"))`, `new Scanner(new File(…))` oder `new BufferedReader(new FileReader(…))`, in der -Simulation, im Python- und JavaScript-Export und im echten Java. Was ein Programm mit `PrintWriter` speichert, zeigt -VisuStruct nach dem Lauf unter der Ausgabe: - -``` -::: datei brief.txt -Lieber Ludwig, -der Fuchs hat mich in seinen Turm gesperrt. -::: -``` - -Der Name endet auf `.txt`, `.csv` oder `.json` und gilt für alle Lektionen einer Sprache. Verschiedene Dateien brauchen deshalb verschiedene Namen. - -Ein Lückentext: fertiger Java-Code, in dem einzelne Wörter fehlen. Jede Lücke `[[…]]` wird ein Eingabefeld, „Prüfen“ -färbt richtige Lücken grün und falsche rot, nach einem Fehlversuch zeigt „Lösung zeigen“ die Antworten. Weitere richtige -Antworten stehen mit ` | ` (Leerzeichen davor und danach) in derselben Lücke. Leerzeichen zählen beim Vergleich nicht, -Groß- und Kleinschreibung schon. `erklärung:` erscheint, wenn alles stimmt. Ein Test prüft, dass der Code mit jeder -richtigen Antwort fehlerfreies Java ist: - -```` -::: lückentext -titel: Summe von 1 bis 10 -auftrag: Ergänze die fehlenden Wörter. -```java -int summe = 0; -for ([[int]] i = 1; i [[<=]] 10; [[i++ | i += 1 | i = i + 1]]) { - summe = summe + i; -} -``` -erklärung: Ausgabe: Summe: 55 -::: -```` - -Mehrere ```java-Blöcke stehen untereinander, z. B. eine Methode und das Hauptprogramm wie in eigenen Reitern; jeder wird -für sich geprüft. - -Für „Fehler finden“ eignet sich eine normale Übung mit `code: java`, deren `start:`-Diagramm einen Fehler enthält. - -„PAP bauen“: Ein Programmablaufplan mit leeren Plätzen, darunter liegen die fertigen Elemente gemischt. Man tippt ein -Element und dann seinen Platz an oder zieht es hin. `start:`/`ende:` sind Ovale, `anweisung:` Rechtecke, `eingabe:`/ -`ausgabe:` Parallelogramme, `frage:` Rauten. Die Zeilen stehen von oben nach unten. Eine Frage braucht nach ` | ` ihren -zweiten Ausgang: `nein -> Text` ist ein Pfeil zurück nach oben zum Element mit diesem Text, `nein: Text` eine Anweisung -rechts daneben, von der ein Pfeil zurück zur Raute führt. Statt `nein` geht auch `ja`. `legende: ja` zeigt unter dem Plan die vier Symbole mit -ihrer Bedeutung. Die Schlüsselwörter bleiben auch in -en/pt deutsch, die Beschriftung ja/nein kommt aus der Oberflächensprache. - -``` -::: pap -titel: Übung: Kuchen backen als PAP -auftrag: Lege jedes Element an seinen Platz. -start: Start -anweisung: Teig rühren -frage: Teig glatt? | nein -> Teig rühren -frage: Stäbchen sauber? | nein: 5 Minuten weiterbacken -ausgabe: „Der Kuchen ist fertig!“ -ende: Ende -erklärung: Wird gezeigt, wenn alles stimmt. -::: -``` - -Ein Quiz, `[x]` markiert richtige Antworten, `>` ist die Erklärung nach dem Antworten: - -``` -::: quiz -? Was bedeutet ø? -- [x] Ein leerer Platzhalter -- [ ] Eine Ausgabe -> Den Platzhalter ersetzt du durch ein Element. -::: -``` - -Eine Quizfrage kann statt Antworten auch eine Zuordnung sein: jede Zeile `= links -> rechts`. Neben jedem linken Begriff -erscheint eine Auswahl mit allen rechten Begriffen (alphabetisch). Die rechten Seiten müssen verschieden sein. - -``` -::: quiz -? Ordne jedem Begriff den anderen Namen zu. -= Fallauswahl -> Mehrfachauswahl -= Schleife -> Wiederholungsstruktur -::: -``` - -## Aufgabe - -Wie eine Lektion, aber ohne Schritte. `nach` ist die Nummer der Lektion, die man vorher kennen sollte, `stufe` die -Schwierigkeit von 1 bis 3 (Sterne). - -```markdown ---- -titel: Summe bilden -nach: 2 -stufe: 1 ---- - -Kurze Einleitung. - -::: übung aufgabe-summe -… -::: -``` - -## Hinweis zur Ausgabe - -In einer Ausgabe hängt `+` Texte aneinander, auch bei Zahlen: `zahl1 + zahl2` gibt bei 3 und 4 „34“ aus. Für eine -Summe zuerst rechnen (`int summe = zahl1 + zahl2`) und dann `summe` ausgeben. - -## Fachbegriffe - -In `de/begriffe.md` steht jeder Begriff als `### Begriff`, darunter optional `auch: Form, Form` und die Erklärung in ein bis -zwei Sätzen. In den Lektionen und Aufgaben wird jeder Begriff einmal pro Schritt markiert und zeigt beim Hovern oder -Antippen seine Erklärung. Steht der Begriff im Schritt **fett**, wird er dort gerade erklärt und bleibt unmarkiert. Code, -Überschriften und Links werden nie markiert. Unter „Nachschlagen“ erscheinen alle Begriffe als Liste. - -## Englisch - -Die englische Fassung liegt unter gleichen Dateinamen in `en/` (Lektionen, `begriffe.md`, `nachschlagen.md`, -`aufgaben/`). Diagramme mit englischen Variablen und Texten liegen in `diagramme/en/`, Grafiken in `bilder/en/`. -Deutsch zeigt `de/`, Portugiesisch (pt-PT) zeigt `pt/`, alle anderen Oberflächensprachen zeigen `en/`. Fehlt eine Datei in einer Sprache, gilt die englische (Rückfall ist immer Englisch). -Kennungen von Übungen und die Blöcke (`::: übung`, `titel:`, `tipp:` …) bleiben gleich, nur der Inhalt wird übersetzt. -In `begriffe.md` darf statt `auch:` auch `also:` stehen. Die Lektionen verwenden die englischen Wörter der Oberfläche -(Elements, Object Inspector, Statement, Branch, Switch …). Wer eine deutsche Lektion ändert, sollte die englische -mitziehen; die Tests prüfen, dass es jede Datei in allen Sprachen gibt und jede Musterlösung ihre Tests besteht. - -## Portugiesisch (Portugal) - -Die pt-PT-Fassung liegt in `pt/`, `diagramme/pt/` und `bilder/pt/` (Diagramme, die mit `en/` identisch wären, fehlen dort -und kommen per Rückfall aus `en/`). Die Lektionen verwenden die Wörter aus `pt-PT.lproj/Localizable.strings` -(Elementos, Inspetor de objetos, Instrução, Decisão, Seleção, Ciclo while …) und sprechen mit „tu“ an. -Lokal angepasst: Noten auf der portugiesischen Skala 1–5 (5 ist die beste), IVA 23 %, Wahlalter 18. diff --git a/web/lessons/bilder/ada-lovelace.jpg b/web/lessons/bilder/ada-lovelace.jpg deleted file mode 100644 index 1c5802bd67caa16e84f2d4c5405c1e99e91df09c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70192 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 diff --git a/web/lessons/bilder/aufgabe-mehrwertsteuer.svg b/web/lessons/bilder/aufgabe-mehrwertsteuer.svg deleted file mode 100644 index 57094a66..00000000 --- a/web/lessons/bilder/aufgabe-mehrwertsteuer.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - zu: Handy - - - - aufklappen - - - - - - - - - - - - - - - NEU - - auf: Tablet - - - - - KASSENBON - Falt-Handy - netto1000,00 € - +19% MwSt190,00 € - - SUMME1190,00 € - - - - So setzt sich der Preis zusammen: - - netto 1000 € - - 190 € - - - - - - - - - - - Finanzamt - - - - - - brutto 1190 € - Das zahlst du an der Kasse. - diff --git a/web/lessons/bilder/ben-shneiderman.jpg b/web/lessons/bilder/ben-shneiderman.jpg deleted file mode 100644 index 369a8ef07074183e428aa69f946f13fe0940d2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19298 zcmbSyWmFtN*XH07+#P~@&;)mP7~B#VoFId12oP+r0D%C(-Q6wt;BLWvaCcqa@7uF` z&i>ln>eKb7tGnwteQ(vh&wcuJ;dLE=qa>#&2Y`bE0N~yZ!0Qq~8i0(5h=hoUjD&=Q zjEszehJ}WPii(DZiHVLyh(|<3h(|y`O!l6Fn1q^?fPj*TlA4x|fq{XDf`y%#p6xw7 z1O0y<0{3<+8Y&tt8X7J=2>}WH|8slo1mL2={e)vjfTIP#w4?agp%eb4w!QYnq|Zf(dv6 zggL8 zf-EeptZi)VT;1F~JiWYqf`5dBhJ{B!;uC%)CjCxMNzKX4%P%M_DlVz1t*dWnY-(=l z?&(+TPiP?d>0&UtC^Y-`w8aKl}$5901|JVZHVL4ebBG zh5LpJ9uW}%5#>L);NU&qP6S*;r1#v&c#@hZW?+0;olAbdHFeQlYkrua}~)$(V;$B z7%th`tWRp!Ou$Sk^qA^}_>PI2c_jL}AW$vgG}XbKbU{;D3Sua&pv0U{lE=-$YD0^6 zAJT{ut`E0-MLkwumx*dmRyWk};6D=4wQA0qEPhOZZj&^%+>_Vm!x7uHhChzWy<`{! zrLP;(_o+aZC?CfD-V)Mf@FB0Rao|2D&2RN@fACsNRYeuz=Kn- zA1i`>RHc$8_v5dSP=+LSMrsa(7l9@I+pd|k=Sd82}6@hZolj~N_|4&M(eg&$^P#@=$nnV`jDJ#D(6Z4&Z7~T#li#JXFlWKXFy~%m$v02RB3FxK zk$WlNtdJqDWT({1rUMg@?FmyWgYKemuDi>(p0O5Z( z_U(MUk}f^$A#m9)|GmwD}Bk58BiCNq@GIRP}|g!z?YMR zIdaE>fRQfE-Il&l+UBZd3K4qKqOSmSnERS*zS(bcmV&rkL1Iqfr_#o&vUjI^mUHvY z+uPR_F}AxF{j-+9&VI1AV_F(ADaR7zH?SI<>oCT7p&X>BL*oOGENd`23_~Z=aP6c& zH<@YiZc^D$6SgKK-^UtA#*kQ7%EbtqY;W(=YHL7q>2Xa^#j~|$qc1w7M%>;}|LYU) zgdHhGNv~z>@`-Teh@9jJ({_1DrE(Wav=4$N6E|HG9EOH^(Q)(AfP*nQzhp}Ie!47; zg77R z`2CM#+~QafK@zsB!jZvhsMqfv-I$SkeGA}3aNxZjVd=iroYp{Bm=xS8T;@3m# z1eNmQAMh%aZf+c@`pq(KHT9)(BMzY{IaftFbIXXv*2(p45Sr6%DA2(50u6eqQmRLT8Xo ztF8mX)u$Sr0_Jq78W!HH6zQB=R{D;4+vt?cPqVH97g;|IPDR|O^)vjQD%hWJMEB6; zyaT;y{o`^FZ&w#>ix&5i&unt0ASxTDrexnuEp04^)y{;_pPG zqCHVpNVnH1K=ZGFa$|@CT;MPmT42AjLf6c*w4Br6Wl7uix8IapNOf2p5j5bpWxGzT zq9;RtW3I}ZK%bB>Gi|F%SoI^1uONY-w>KwP79J16EyoPV<+FkSZhe&88LYgew5USU zRh?RF5Xc^%EzRxiOhrr3n6fAj9j~km`{oiGERAd_PR6)T^`CS1m;=yA$gC2<0X&Ju z@_)_Dg&*|Vo&?UW>(k3zTfHLy|Jr{eHa(7Jsyo@8I|zY%-JKjWG#AA@-UlAWdu_I# z_Vm`L7i4~o?$FnEU_xPcaowLuFhRQ(v^V)jnUS%!SQCslP?bf^O#{BF2qM=BKkqE! z8xgCC*WLbs>o8m!dJIpmx9j0?irvtonc&Ev{ zr{(jD^qXVwYRQ1}YHk6hK7IHt{5yofQR$E9J1ukU6Ea9xa4^B_;ih{RD&A)B?f27I zV{o4yUh?)jEHy(=1d1f7MNWFP*^t{j9v%~XjkeX+fbBArAm2SwXhSE0aH=1#ru_%p zlTFXEB`AtyXV=d!C$C|aOlW!a3b^KX(K2}j<36Rnk7_(hO{+>On;H8IVvDyJMl*xLt3&&C29!JvJ3%X z*}D3HidE18|HDt50Z;!`S4e5Aoor?G=(57Ov0ow6Hz?B;KT)fBvGWmBI@z_c8*ubme zvY(6P7yE!rvZ#;v9oa^n06hROZa0V5@{z>0?!dMjmtBeZRF0Wm$&fhJ>l+ z`;2>~{R;R2F~x3-S>09slU7=R3%8dtW)fzKBDws`wx=GVJLrkOMwurkQil-Ve0|$V zo$hyAV0VB=QYeFLD_z^4DF9f{94?&eNV*fXFgp{=q;}_Y~AH_Ibk%8&C1{D)I=gtdZ9HH2ure=c;#WETt=(WZwvhGlQap~qy%*wH$?s6Shc`X6oY^H|2H-HJ4B=H_mSw1np?5g)mK1yU?S=>B$OmMDKLETk_Ty!Vss84PW2g)rMO-8}$uf zrjq8GR^B6V_IY1JzAs^VT9k#=I>38e)8yc@eD1$eoNmnm!M|<4?RB@4|H$A zosfZ#c*I%P<*g{hjq^N0_+)>76;>g<0xE&b#jTXdo`Y1@O}legS$>hNUa5>Ebb_5_ zCQ74q&3Uolj~CIC)z_4zg)>+FN!CjIH zE^=CUiVLR0^Z2uRb093?N~k#yLk_zxnAJFKv`+1A}FrkrNqVmFhf&imB(L6O3E^koE}GAw786ZDd-*1I)hf=Qlo$W3gIMt$IVUwViK8cTEFCwifuu0+^rf*=ZGHetHSIZ$gLjN)FdtBFo{{{ zS*a1WFD>3jTb#2)9aShZS_ zozIiMkl3C|ZCQ1?Z$1FZL)X3BGrD)m>>t+Ot#m%I9gQO?QbI%A8h@Dc zI%b3S1S+H0cZe?02AIs&eNrDzH|STbzq`e?di1hnnyTN;wPUb;@aC=2++QrvoX+ge z(LyoJ94o-X&}ML{ppn4Zn9&+=1`HC+$EoSX_36Z4t9T2n3QgC4PwcK7dj%v~uO2j< zDaP^}N`V9C#S)`8)$!yDB}~%wM6jBl*v59xIbMq0&h?G9K`A6pqlfWA*k*S#4WS7> z8GrmYm+alSbDa`M7qQhV^Ie60hnpIUcrvHJ>?%KxC*14GCPjmNM3$D)i^K!J>3kk8 zw^1yx)h$Broab>DGjtr^w4=(^Y}gfE8|4^Jo*tWYj~AF!Zmfv`JlX!{T&2rU)^|*C zE4V1Ml+xU^eC$g5QpMyI^F7i|wn2-D9F$P&Ml69ijbq?OGLMMc`;=Wq{pkB#$6R(^S z;HEN_*|u1Pxi1FU3>UZLLY6L#>fURGy?m47{5cRd-uW ztFZo_6t07{k2d_p`nu%I6!8x`PvE1+!*qeHN@&Vb1|*BQq>}c#lttW_y3ZI-Ek9V* z&dIn%8KDMu94#Y7WP6TbLZOUGlK(3`Jkk~gh)}ur#eDyKS*|IOUhA*Q1*;A9S9H6vZ1@8ra96ACI&7+D zvcRqDqHe&!^3kMV!FEh$Pcz31#LSNxO9_Xbomj2AggZHV@tXl{{ zHoG0W)k!T>pU+KqvS;H!V_V1q5A(l1D@==Bz5?K>u2=n}=gel>G+p98`i0*(`_y}1 zh1|wNQxEdWVui{o1@*(HfYA(Jtv*5wRWxXFk|5@If7JRInGsg26(L}PCl+ zs}d-N*;0N});tT}*gEptEmi#@?kHG{;}u{K>(jrODUEWH`)8b_viKX)=lcu-BCG&! zM`@5K9O1>Rul3PsSzMX1p>X3k6_*cw>ZH4zPEtgsR3SY)OYP8mlwE$Lv24s1ZWMN* zN4@uDUiq^_{pT{gQR6fy7l#_Dv@l!3A!7jV;QB0w9A{ZnSG&B=y4ktqNv5acD4bhL z!zt#4;MF+D#3Q8)8{ep{#juspnUle!I_^NYaU<|ld2?Y>3^>+i=g2U#D!8NZlZF-0 zB^(;?uohx<2hwe5Xl%yn{xs%&AZvH`sMIlCiMMIgm=3d4J%P``R)K@gi|BFZ5;k;z zM3`$!Yue=RED$EHwzBu^Ne-K5rfTG_$hK?vej^j7N`R4SqOfoOOx48%mV1>GKicgd zUClxtIGUL&kJN#8v*~14qc}0Et0XA_KbXXUM#Fh_o*R0{@B)t~JFy#!4U>M1c#(hG zvvn8Q{5ehlE`o7V5tsWyH1jo;MWn}Ybl4$l07QvPMOae211($oBU z#-2z&>s{<$w63R8tj8he@ezo?wu^YVQ3iR)&Q4DNUTmv21)4z&dd>O#TXa-rNp#D} z!4X9%r46%7$bePY6B+!W|1L>spV!_99234OvoGodMft{DCzd%8yNafRFEY}mC0E8Z zrD-t0-?7D&^h2pB!Foi3v^HxwnfbQ1cb50DYzFZ`Itt>SjDdy^M#{DYQI2sMi73s4 zg(y&(8A_NB5Z7#P{jy80;j4olv?%$zsgPGG`wzh)X>NNSHL1RW5UMWPI4CdB{L26*9TowDaf?6 zym3bFlB&gpBJFWcI7z5_E>_ri=^BbVOQY$&mLmCcI_^wmfdVPDL}83z8JiQl@rpy! zIp*a%X9R}4&$QH)MHQ7@9~+WPX<9$p;IVMfk!yc}uaLj!v)Rm@*JRvzdqF>$kDYUy z77epJaIS5^R=r@k_8!@5;B7|tHl_O~qNVfhKM|2`9HD2GJ}|mQgQb)2M)CH6jika< zdjfUAEyh{Sab!-a(*-; z?zjj8fpi%@*8J>0U^JkNSsVdU`WL=tRZit50nF)%)F5{%2&Wwf$%&7ECp+)=#usS2`7P?4=JHmBCQK&_S6lVUe-;Ek6bDwwW1PZ| zV(q2haA5|=f)0(DBCbA8Tz{a)J5%ZS${7%$eoeTxx#OquEH0fXh~ z?U_1uzG_0M%*Q1aZ#+a%2tV@e%KESl)Vi+Ne(Q$aC8erlc-^v2UYBP68w&{63a}bJ zsB@{hi97L4V&PWH%R2AvV-&M<2Uvz+w0tI`ru}yG%r+|Wmg7@<-BxP2i)lXSC42R} zh_m7EX$HdgPnC=)NY7JzYcDOIsc-eHZs?dU%Z{;p?ya?`g$JNx`9$Xew$jM94sQMw z*N3MPM_4s9!C6Iz(IfoSzM-27t-ummzE%%2e6Z8#NMtJ+c5c4JCRhK0(p0HE>89_N zPDRjIe`(0)FopCkEp2{$6?b|!^7Ax99mo|VI-_K%R=v|ACbs`@W`A&~zaBI_lH4EH zuQ>dZFaY16PWI?2M%1m`TE9sy5metOu=8RCEfD=yUzy9$au<3cK+WQS;gL(R6Ue^( z!XUry&)T=Lvs)I874ajY$^Q0pqI>{5b=&GQO1tTF-J>YgA~~DRyT&A@B+zoga=fcl zB)^Nww}Pkv91taTQH9IBY7RGWK5(&>Lu$n@j^~Olb^BVsH(9FF720lQ`bQ0>OJ%3j z&rlG)I82l(N7@hIXUxwxusI_N)y2p9o?7cr1kGPkY=x`ttibN2qEFCh^~x6BJ}F%~ z+&7R_Gn6?Fnr;5-Ziw7*8^_IC!&9x5w{5*x_n}@8B*%{N-Bay)U{B-TBLZ(DnX>n4 zx2_^DUR!6p-oxg~ntt z#)k72gYKYLqulx11t+wk%r$(-C3l7NHTiwggdVEqOixJ3Q#JP~RQ%hH(vfp6pD(Oe z#m9?&+EWM}IXsVhKTa9VzBA_QN$JT2U>p&p8=Q;<5WTK?%=HNBysKK2PPp+s$4b;wfMue@cC0R-69c4UZ^q0t@F zs7xgpB-q(qPqw5pkjacK_7aL5=h8q3EJ4G&O@15YUY8M+@yxnCPogXKQr~?bls4zH zY0}%{W{pVog9^25xn5p})p&5JdVlJ3_ym&=pvDvsXd z#q<}pwf_bKiu0!E!p#PaqZ~nNdq@uZ2NO&p*7FdS3T-D{hq|~*(AR31IJ2?EjOQ)5 zUvAkE0TGt3*)g|X8?~!CzQ4pjx@Nj+D$}S{v$*j4c{}d{UnDgt!3Sqa>C!5+bW_;Z zPsW;2{=HO;{%ktZ$!_`uSKQy#PfTg%-9!_9)6&|2klE^F zzX@32gbt+~XD|)c-{>zBGi66s#+-W#R9^eWJBQz&Kos-ptV!YLvA+c?^mJ5z_@=57 zk7g6F8VSB|vOd>5wQV`&1Lc@=o9Xh6>Je%B{cRV14S5bjJC0m+cBBS0!;!MWLAF#(|mjID@T&C5Eq9gD6j*om8WUY2hU)NoAa*g8*aTx8w zWypS!Mp#k&5_x770DS#&K37l1aZY$7hiNHM@Gi9B8w-iln;kB}cHPvEIwS37nUTB%p%>Q*HZhvESx=XJ2 zS(y&V{WR4U*86mzZjkY?Jb?TQ=sOh*k$wNKJQM9MG~nIgTxuC9Bhmfzz~ z2-Pfu;RCgi(LuFcs^6!i8niFz2)V&CxW*0DZ2 zWD@UI&wj@A)qX3>#w9HZ?$&}?qaEd~ti81E9EdK`iuW_Fr-p59vcn;WC`}q{iBkrqCP|Q=iTpl!C>jzp<{8!LW!noALc)W`DW1hy*DE>sPw|I~ zx-4z^$mnYBzqv_$T#E5NBCimdw=E6mmflh|pw_I9RGlhc@~U=ihM7$a#*R~p)lVAi z-G1UGkBHlZ7(2?5V8_}in}%q$#{WuR+XhpSpVg5W{;A2^khpKzZD|){TxqUO7*#ET zQfQUez(GZ@3JPlj{rX^za%@a&wGH{X8g*Zc|D*M9Z;KFmh?h%b?7D}o z6xWw%=B)A2#pCL>oK54~c-p1@nc@$+Shd7j>_Gq&rc(4%Whu|atIs`yw1G%SpxOO- zrxOqKoZ0?Rg8g{XY)>iV0Ma0ei$}mAZHJ?=zOL9k(Lpao4~c@S_9u?cy}%7vldH?c zt|NrqXvX;+LCpk3$N#Fs#VKC)ou;H+6Qb0c4bm@hxNN zp89Y~w*0TLLY4gkxu#&qU&oYw-&vcV$a`#3s1MfdT5_J%X82LMR^=8-Xj{}Ge$TRw zP%6EAxyj&WrQpn|I`Bl~uexTWUZtKr`Fy*Ob$9-8`EZ(T>C;5g3s{(1iT^S9Zfn2FWS zc%zy&7eLoc5b8B@7*)}r+UijRA?-}vO13hN*#5D;k6y^;RE70#wSQKQf86p3{6?n* z_Ani7WgU`(ut(HT>J8fKXoyvgMa~y1czl0Y{ch%n$ZnV}(;IKGY)%fmt&VzF2kSqq zwlb{uddcj;KWMeLCea|HJEI-g(G>!c!A-?uX#FfhF7egn;?|hDWdq9A=@}m8+!L_& zulpZ4n3B-1ozzzAJ;qfo&zk`##pS-_W*B|nyE!G8+RbMnzwQ%QKX>g2pv(D!jpZXa zP3JZk#-)GyAJ)!%Aao@4x|bI`Hg(@@?H(EOLFkjVkhQZpxD7p+5L+j9(lnMUSm2oP zU~DwquK%tfKP1O(ys{l?6rCHFVH*^k7*anH6B#(4x(sUIryi>=195PVOZK@vF#dcP zJ&TM({6b3cm(BmO&e?RzPHvxnfl z>-=-3Q;)zapuwGgc1ZO-cj1Wy9Dd;t0R1oIi27z`7Sw&A{E&GX@NoYM_?y$(tfebY z{+st}*>aM=eY@!W+np031`z`2g}Wl~0RU`R)s#FIDy6=gSmFF7dce94D{azZVem!p z^*Z&F7j<`*b@Y>JpkALApNerCcP+~cZtSmsHJWekeS_G7hpDF>jQ8?=^u5U-biPdB z0CmtY;h+eW*>Wz*{k#LeSMG4dv1W<`!iSN1ml5kzaLmk2sGPW4l*e^3ZEzC_zakH3 zE&lEpOLQM?zh~}Q zK0>Oo7Rj=COC{3XE5PWieMs7tY0-hS!`?uV?fUacX1+_WubzC?z7%uEH0{pY>RIm~ zhviZ|8c|Flb@V{p-N7~OCsjoIJUT&YL-Ex4=mR-2(@EkS!4|0ey^*18tE->B6^ErW zvmShG+Ilt*ZS*OJ-nd^OE8_9I_(Wmm7Mm>{n&@y<2=!jFY&NIoH?Jw1Ai3nfC^!Qxouli?2tY1zW(5Wo75*=YWLF6)SX~>((0}XCWF>buBbgOMobGjDVD>6 z%i0tP34NAEv308{s1CUyDARK__0g++j}hHQQD+imCcC=U;`uhF4U;=t2@g67<}e#V zMO^cj6rx^I4gEC8mHj)oygg0HPbaW+zr!Guk?dbT#Y%|+NM(U%#9_2Xy0g~+v9a$z z5Iq1%P6K3(MW&;!Yy*!nQU73B4xKMXH?et)Ew<3#x~?;+-ws%Xi9Fb)T$H)?3Yo;? zR=>q@$X%?joAaJNQNQHIK3>_?&D%u&(2^(DX%_%c_k0mQ6$O4WIBoK2eq4neu06x9 z%99EhteHR(B(Rns{-WgsBj?EuOo_(1*p1;Kc6U3WfG`(y6A%jQkt z*d|eN?90{a7KCx1!=Re#UA?=1ta3F$s3LB8OFL(W(A)3(*TrT7;vp&;g!GqtY}#M? zb3&q!-Um|3YNuM%h8h$IYw>d==o&Icg+_%i6(I!Q=`umSbj&zt%}p%?rVY7p`EyI# z(&#luWGyL{A6$H1#;7>@9w2ElR51&17ORiTGK3Z^oT-y>YuM$*}r2_Y^6iLz19q7{bi3gjOZzbcaOuA)a_k$_R zBzK^m&{x3c>vFd7B#bCZexb+#ryvoJ8=~R@dwfz5bWjjxCf@DeepsEU-^le_UQdn` zBRcLuFS2qtPQ%1b>)(5BReGD{wnubT`W5aH=aP)aafJ_q;CZTG5$h{{Y3(`s z8Pg9UBo5}}?;C=@2T%Ck(!*x9wnD&hw%@5 zUIF#Wd8VTMY38gNiybqAf(!pdpRodXO;j0O=qC#q{<*j)iakHP0wP`k9mzgg-q2#f zTXERa3uEb7AyceUp}TKw2p-IAO`Z9@F2=b; zaIoT!^b~Eq*KS*Hd_0)2mi?Bf=( z^L?0lKL{Pl)cwqiC;vfmwL&DGntFMWY-U1mEuRuG1^S64P zkprjBG4Foy?xdKK%jL*4)SRK1DuRhzm&jCq1PBV|amy&)6Fkc*Nt^~M{-UhC16EZS zwx@# zd=Cuc_m$JgK&GH}bG{QaLB5@qaiG@vq@7i%iPIK8sf!?T5!!*IIK{MrU^J?e2{!#) zefxSGvZ^bsaYnt%BFvUz%DIU(w6E8miME!r{4FSx1-H4_PBXg?RCvqgR-~)_Xpspi z2Z(or^%Mp=DRjU6;+kTrIlj%ZhUvsE!jkJ+{$BiR~x_3*81U=R}@-=-y3Y*Q<8_G?3?(?F~kz4 z=}bmdq->jt*EZG8loKeBVvvksQ*-aX>CGs3(7p@ON8x#+i$1G2DqV>~ln`vs8zjk> z=%Qi-9`x|x2Tl|=Toj*1-DFqDr|*=e4DZ*gDd1)7!la8h4p00Rc*mh6~fbm6J|S8{$!v22(d;P=~qq zvMgXvuYio}#!}mco12PgUhhAiypHQQyaQKd;}{DohZr@By{G*=a=7xwu&3)iRyr{& z>ruDQQ{~_KyX7<)rm-u8&hG>7=RfD!%%=uFg&W0YQA!NHd8pl73s0jQBIkIKY{|_XQeDVS0hL1++WCY zT7rV)2jie?Z^Ev)%AX)n@Ubebkr2KkHoxxi4<%onQ+}oEG86N4BpR~I1Ab6Pszb6* z$e^dloIQ;oV?p9DH$P&91b@8Mg-X6NU=--lb*O8(d|wjJ$g;xwF_j_4__nz5TwCW{ zi@lko(9D(SN85EN*WgrbqpNQDVrq0x@=U0oXKB@NQ()?#N<6orZn%yl|EP}sem>iQ z{l6vV`^))ygLp3FSwgvY<-w$-RYUZrbEVjye@od{QjdI@X-?zxf{zioI3vSkJFUxPBd2vu zF6UL0lH)r@o4Gl^lsk1=oqf~t&UU+ARby%xmT>)&@52DBg^w8UulCWOq&_KtuiF ztKxlEgds|Lp0Ys4IkqQ7dv92c)YeD{X_^nb9Pd5Zr795E$z}8e;cX5B_Iyjzt!OS@ zSsR)sMq0_ECayX^DQ@qN0qE3NSJB35jq5)6)R4AUQmp6y)@HZDgG0Ls^kr#W(gQuRj7Mg<2#O?Oij0Nc2C zI(S2JNXa!s->_XXVQNN*k|8nd?t@XT%1z$EDAXaw*nu-I+A>;F&yDZqYAPK?=0tXL zcry)uREeaX?=X&A;Z*ftU8?$u%q9=;JK*rlGz?AjCXL(d8#Fp^@lTnshVVzY1}Wr| za`UBx(DJ0(xUeZHAXvkfD1McfH0t-{O610^)hpMD*vzi0u@;$YBl-i_tZ$E+ac5`@ zBjI;$iUQ@!(Z6?>Wbt2cce2EoH#bKy%M%N^LOqFao_{hR%-W|Q;I0dSkp6}-Ijq02sHj2*I zm(Q!7L2LA@w*XW}6smM6!o3mU^gTnC6~Wq@{7oeQrml7GPbZFa>Kl|4?rGpyxP}p4 zb;|-sWhAfQD;N4&bFPM-_Qi~keDp9-iTfEx5!$ntxUx4`viGrLxb48!~WMP>EGeFc6tRmnaW$7E+8DhI$dh;ma zBO>k=Jxm|I{YY{1Rz>_&>(<0?as6a*4 zCs~?9isUU33fy^=Y{D>#Qa-x_7t}4}j>x;e`Oxw^Y`v=ZdAp^>w*3!qGI2YhD8}ax z^TQ8>(3C>CfBgT#iWX}H5BeM-f1(+;bd%P+`xL%9^FlThZs^N&BbrOks*kk|L~4PO z?}0#iE1^5fw{Y0ym!I#vvWql>t0Ba4jMc0uzv`y~RXIEQN+~B1>ue!nN}sJo2(im? zc~d!Ih>jdmN?$)5;cr(qag~`mQJLq4_s^1Niemb@1mR3W%gtLbPj}jMK*J|mxqWhflXeXX@ zvXL#j3%R58PIME~+T?6XwG@8({USvaF;)G>D)QNtPk$-iP-_k_sj`3%HM_Px29-`* z763qIEBTS$7M_MTvkYuQcUH}U<rQ>Ktg7d6*`?>We#=}<>$XfvW3C`c+nyu}tI~^E_4WF{s;Px3 zdmm;aM?NKzzAz3_^`yoqN^!a_q#{iiq|s(Nor!N4+8wqKrOuF@p;puq=$OS~}hmJ4{ z9`wGn{_U?|MckiBdntU&S?^~W&6D!%9diXwpx1Bewmx9QX>7oDz+H)+S&Wa*H|mY2 z;xgVYk*g=y7lEfk;Uqbzqu~D9Th#?%j{x;hExwc1sh5!&bsTAZV9_uV*C70>wBkY% zIH|seC7w$?RAM4axUK3S&OKHji0l*E>9l(_ja*UYm&js8x+q`BzqeNV+?R8=bL>QJ zw`|x_I2t{I`W3?;d&d~_%ATTzd9SSVo1eC!Sh;J?LBnE5ZppX&Y?p1n6) zDV4{_Lu7A@S}wQ9yn^wGptRtRK3XHV3k2WiWbd6 zy$&ya87p=NX5%6hYwB<3|88?U%nxL1+u_Cc*wlHM757w#LW$cn^vq^tc%B*ZB<^@i zoSK+zgGQ&0XXo{aJV8}@a?Ok7+gRdhI%lm0|7l-m~L33y<_nWK<3hk9qBgGiOkNqT|DT1)wal8`bMMbNF3j4saPIS3ulCIL_!4yv-Uo_g{CRTf0Z#d-I9r)Z|e!a8~_4JBVvaPhCY~FUr z==vp`nh@+*ny2pSiG~s_bBXPp8l?VcUEtmm?|X}jnt@+GW`LEEYDUHSNljhf7=;jf zSB7RkDLOcb4LLv|T%XdGU;%bJL?H>-^6Oo^cvCKQ1fj%`^_#Hbdg;wxwei=yQ%8^9 z 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 diff --git a/web/lessons/bilder/caesar-ascii.svg b/web/lessons/bilder/caesar-ascii.svg deleted file mode 100644 index d6beace8..00000000 --- a/web/lessons/bilder/caesar-ascii.svg +++ /dev/null @@ -1,98 +0,0 @@ - - -A -65 - -B -66 - -C -67 - -D -68 - -E -69 - -F -70 - -G -71 - -H -72 - -I -73 - -J -74 - -K -75 - -L -76 - -M -77 - -N -78 - -O -79 - -P -80 - -Q -81 - -R -82 - -S -83 - -T -84 - -U -85 - -V -86 - -W -87 - -X -88 - -Y -89 - -Z -90 -(int) 'X' -→ -88 -88 - 65 -→ -23 -23 + 3 -→ -26 -26 % 26 -→ -0 -0 + 65 -→ -65 -(char) 65 -→ -'A' - \ No newline at end of file diff --git a/web/lessons/bilder/caesar-scheibe.svg b/web/lessons/bilder/caesar-scheibe.svg deleted file mode 100644 index 8d8484de..00000000 --- a/web/lessons/bilder/caesar-scheibe.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z - -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z - - - - \ No newline at end of file diff --git a/web/lessons/bilder/caesar-verschiebung.svg b/web/lessons/bilder/caesar-verschiebung.svg deleted file mode 100644 index 81035fc3..00000000 --- a/web/lessons/bilder/caesar-verschiebung.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - -A - -B - -C - -D - -E - -F - -G - -H - -I - -J - -K - -L - -M - -D - -E - -F - -G - -H - -I - -J - -K - -L - -M - -N - -O - -P - - - - - - - - - - - - - - -N - -O - -P - -Q - -R - -S - -T - -U - -V - -W - -X - -Y - -Z - -Q - -R - -S - -T - -U - -V - -W - -X - -Y - -Z - -A - -B - -C - - - - - - - - - - - - - - \ No newline at end of file diff --git a/web/lessons/bilder/en/aufgabe-mehrwertsteuer.svg b/web/lessons/bilder/en/aufgabe-mehrwertsteuer.svg deleted file mode 100644 index 920b4411..00000000 --- a/web/lessons/bilder/en/aufgabe-mehrwertsteuer.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - phone - - - - unfold - - - - - - - - - - - - - - - NEW - - tablet - - - - - RECEIPT - Folding phone - net€1,000.00 - +19% VAT€190.00 - - TOTAL€1,190.00 - - - - This is how the price is made up: - - net €1,000 - - €190 - - - - - - - - - - - Tax office - - - - - - gross €1,190 - You pay this at the till. - diff --git a/web/lessons/bilder/en/kino-saal.svg b/web/lessons/bilder/en/kino-saal.svg deleted file mode 100644 index 4e49fc22..00000000 --- a/web/lessons/bilder/en/kino-saal.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Screen -Seat (second index) -0 -1 -2 -3 -4 -Row(firstindex) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Dashed: seats[1][2], row 1, seat 2 -sold = truefree = false - diff --git a/web/lessons/bilder/en/kino-schleifen.svg b/web/lessons/bilder/en/kino-schleifen.svg deleted file mode 100644 index 2698fc0a..00000000 --- a/web/lessons/bilder/en/kino-schleifen.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -outer loop: row = 0, 1, 2 -inner loop: seat = 0 … 4 -seats[row][seat]look at -seat -0 -1 -2 -3 -4 -row0 - -1 - -2 - -3 - -4 - -5 - -row1 - -6 - -7 - -8 - -9 - -10 - -row2 - -11 - -12 - -13 - -14 - -15 -Inside, seat runs through, only then row moves on by one. - diff --git a/web/lessons/bilder/en/l01-pap.svg b/web/lessons/bilder/en/l01-pap.svg deleted file mode 100644 index fc2912ae..00000000 --- a/web/lessons/bilder/en/l01-pap.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start - Put a cup on the table - Sugar wanted? - Add sugar - Tea still too hot? - Wait 1 minute - Drink the tea - End - - - yes - no - yes - no - - - - - - - - - - - Start or end - Statement - Decision - Input or output - - diff --git a/web/lessons/bilder/en/l02-einfuegen.svg b/web/lessons/bilder/en/l02-einfuegen.svg deleted file mode 100644 index 3891d11a..00000000 --- a/web/lessons/bilder/en/l02-einfuegen.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - Where does the element land? - - - - - top half - bottom half - → goes in front - → goes after - - ø - → replaces it - diff --git a/web/lessons/bilder/en/l03-lochkarte-beschriftet.svg b/web/lessons/bilder/en/l03-lochkarte-beschriftet.svg deleted file mode 100644 index b5080535..00000000 --- a/web/lessons/bilder/en/l03-lochkarte-beschriftet.svg +++ /dev/null @@ -1,1019 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Cut corner: -so all cards lie the right way round - -Printed text to read along - - - - -Rows 12 and 11: extra holes for letters -1 column = 1 character -here P: holes in 11 and 7 - -punched hole - - -80 columns = at most 80 characters per line - diff --git a/web/lessons/bilder/en/l03-lochkarte.svg b/web/lessons/bilder/en/l03-lochkarte.svg deleted file mode 100644 index 8eea3c50..00000000 --- a/web/lessons/bilder/en/l03-lochkarte.svg +++ /dev/null @@ -1,998 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/web/lessons/bilder/en/l04-camelcase.svg b/web/lessons/bilder/en/l04-camelcase.svg deleted file mode 100644 index 82c4ff01..00000000 --- a/web/lessons/bilder/en/l04-camelcase.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -priceWithTax - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/en/l04-variable.svg b/web/lessons/bilder/en/l04-variable.svg deleted file mode 100644 index 05bbc57c..00000000 --- a/web/lessons/bilder/en/l04-variable.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - int age = 14 - - - 14 - - - - age - - int - - - - - - Value - Name - Data type - The name gets you to the value. - diff --git a/web/lessons/bilder/en/l04-zuweisung.svg b/web/lessons/bilder/en/l04-zuweisung.svg deleted file mode 100644 index e77c3776..00000000 --- a/web/lessons/bilder/en/l04-zuweisung.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - points - = - points + 5 - - - ① work out the right: 10 + 5 = 15 - - ② store the result on the left - - points before: 10 → points after: 15 - diff --git a/web/lessons/bilder/en/l05-tauschen.svg b/web/lessons/bilder/en/l05-tauschen.svg deleted file mode 100644 index 3bc0bd56..00000000 --- a/web/lessons/bilder/en/l05-tauschen.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - left - juice - temp - empty - right - water - - - - - - - 1 - 2 - 3 - - - 1: temp = left - 2: left = right - 3: right = temp - - diff --git a/web/lessons/bilder/en/l08-zahlenstrahl.svg b/web/lessons/bilder/en/l08-zahlenstrahl.svg deleted file mode 100644 index d564b7a8..00000000 --- a/web/lessons/bilder/en/l08-zahlenstrahl.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - valid - invalidinvalid - - grade >= 1 && grade <= 6 - grade < 1 || grade > 6 - - diff --git a/web/lessons/bilder/en/l10-kopfgesteuert.svg b/web/lessons/bilder/en/l10-kopfgesteuert.svg deleted file mode 100644 index 681b1b15..00000000 --- a/web/lessons/bilder/en/l10-kopfgesteuert.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - How the while loop runs - - ① check the condition - - ② run the inside - - - - - - true - back - to the top - false - continue below the loop - diff --git a/web/lessons/bilder/en/l11-vergleich.svg b/web/lessons/bilder/en/l11-vergleich.svg deleted file mode 100644 index 8ba822a0..00000000 --- a/web/lessons/bilder/en/l11-vergleich.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - pre-test (while) - post-test (do-while) - - - ① condition - - ② inside - - ① inside - - ② condition - - - - - - - true - true - If the condition is false at once, - the inside runs never. - The inside always runs - at least once. - diff --git a/web/lessons/bilder/en/l12-for-ablauf.svg b/web/lessons/bilder/en/l12-for-ablauf.svg deleted file mode 100644 index 83185841..00000000 --- a/web/lessons/bilder/en/l12-for-ablauf.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - ① Start (only once) - - ② check the condition - - ③ run the inside - - ④ step, e.g. i++ - - - - - - - - true - back - to ② - false - done - diff --git a/web/lessons/bilder/en/l12-while-zu-for.svg b/web/lessons/bilder/en/l12-while-zu-for.svg deleted file mode 100644 index 6b2f4ede..00000000 --- a/web/lessons/bilder/en/l12-while-zu-for.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Init - Condition - Step - InitConditionStep - diff --git a/web/lessons/bilder/en/l13-verschachtelt-tabelle.svg b/web/lessons/bilder/en/l13-verschachtelt-tabelle.svg deleted file mode 100644 index 6065b866..00000000 --- a/web/lessons/bilder/en/l13-verschachtelt-tabelle.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String text = "" - for int j = 1; j <= 4; j++ - text = text + i * j + " " - output: text - - VARIABLESCONSOLE - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - text = - "" - text = - "1 " - text = - "1 2 " - text = - "1 2 3 " - text = - "1 2 3 4 " - text = - "2 " - text = - "2 4 " - text = - "2 4 6 " - text = - "2 4 6 8 " - text = - "3 " - text = - "3 6 " - text = - "3 6 9 " - text = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/web/lessons/bilder/en/l14-array.svg b/web/lessons/bilder/en/l14-array.svg deleted file mode 100644 index 33e751c5..00000000 --- a/web/lessons/bilder/en/l14-array.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - int[] numbers = {2, 4, 6, 8, 10} - Index - 02 - 14 - 26 - 38 - 410 - Value - - numbers[0] is 2numbers[4] is 10 - 5 slots, counting starts at 0: the last index is 4. - diff --git a/web/lessons/bilder/en/l20-cpp.svg b/web/lessons/bilder/en/l20-cpp.svg deleted file mode 100644 index e8b890e7..00000000 --- a/web/lessons/bilder/en/l20-cpp.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - calculator.cpp - source code in C++ - - - - - - - - - - compiler - - machine code - - Windows - - compiler - - machine code - - macOS - - compiler - - machine code - - Linux - Compile again - for every system - diff --git a/web/lessons/bilder/en/l20-jvm.svg b/web/lessons/bilder/en/l20-jvm.svg deleted file mode 100644 index e15359be..00000000 --- a/web/lessons/bilder/en/l20-jvm.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - TimesTable.java - source code, for people - - TimesTable.class - bytecode: CA FE BA BE … - - - - - - - compiler javac - - JVM - - Windows - - JVM - - macOS - - JVM - - Linux - Write once, - run anywhere - diff --git a/web/lessons/bilder/en/mvc-klick.svg b/web/lessons/bilder/en/mvc-klick.svg deleted file mode 100644 index a885cc70..00000000 --- a/web/lessons/bilder/en/mvc-klick.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - View - the display - - Controller - the listener - - Model - Counter - - 0 - 1 - 2 - 3 - - +1 - - value = 0 - value = 1 - value = 2 - value = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 increase() - 2 increase() - - - 3 getValue() - 3 getValue() - - - 4 update(value) - 4 update(value) - - The model knows neither the view nor the controller. - diff --git a/web/lessons/bilder/en/ss-binaere-suche.svg b/web/lessons/bilder/en/ss-binaere-suche.svg deleted file mode 100644 index e5250f36..00000000 --- a/web/lessons/bilder/en/ss-binaere-suche.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Looking for the 27. The cards are sorted. -1st middle: 13 < 27, drop the left -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2nd middle: 21 < 27, drop the left -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3rd middle: found after 3 comparisons -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/web/lessons/bilder/en/ss-bubblesort.svg b/web/lessons/bilder/en/ss-bubblesort.svg deleted file mode 100644 index a584b009..00000000 --- a/web/lessons/bilder/en/ss-bubblesort.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -One round: compare neighbours -7♥ -3♠ -10♦ -5♣ -2♥ -Start -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: swap -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: fine -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: swap -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: swap -The largest card rises to the right like a bubble. - diff --git a/web/lessons/bilder/en/ss-lineare-suche.svg b/web/lessons/bilder/en/ss-lineare-suche.svg deleted file mode 100644 index fe95a205..00000000 --- a/web/lessons/bilder/en/ss-lineare-suche.svg +++ /dev/null @@ -1,23 +0,0 @@ - - -Looking for the 9. The cards are mixed up. -7♥ -✗ -1. -3♠ -✗ -2. -10♦ -✗ -3. -5♣ -✗ -4. -9♠ -✓ -5. - - - -Turn them over from left to right:After 5 comparisons the 9 is found. - diff --git a/web/lessons/bilder/en/ss-vergleiche.svg b/web/lessons/bilder/en/ss-vergleiche.svg deleted file mode 100644 index 57a87c8a..00000000 --- a/web/lessons/bilder/en/ss-vergleiche.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Comparisons in the worst case -Linear searchBinary search -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Number of cards -Comparisons - - -100 comparisons -7 comparisons - diff --git a/web/lessons/bilder/en/uebergabe.svg b/web/lessons/bilder/en/uebergabe.svg deleted file mode 100644 index 6b311d36..00000000 --- a/web/lessons/bilder/en/uebergabe.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - -Call by value: a copy - -Main program -number - -5 - -doubleIt -x - -5 10 - -copy -x becomes 10, but number stays 5. -Like a photocopy: writing on the copy -does not change the original. - -Call by reference: the same array - -Main program -row - - -clear -seats - - - - - - - -false -false -false -false -There is only one array. What clear changes through seats, -the main program sees under row. - diff --git a/web/lessons/bilder/en/zk-zeichen.svg b/web/lessons/bilder/en/zk-zeichen.svg deleted file mode 100644 index 0eb01ebf..00000000 --- a/web/lessons/bilder/en/zk-zeichen.svg +++ /dev/null @@ -1,29 +0,0 @@ - - -String word = "Billygoat" -0 -B -1 -i -2 -l -3 -l -4 -y -5 -g -6 -o -7 -a -8 -t -substring(0, 5) -→ "Billy" -substring(5) -→ "goat" -charAt(0) → 'B'length() → 9 -indexOf("goat") → 5 -The end of substring is not included. - diff --git a/web/lessons/bilder/grace-hopper.jpg b/web/lessons/bilder/grace-hopper.jpg deleted file mode 100644 index d767c68d6484b9567f67a3aae2c9f8d81dad74f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46537 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 Zf;K7Rl4XzR6)vMJBpOpaC&2$L{13pmwzvQQ diff --git a/web/lessons/bilder/hedy-lamarr.jpg b/web/lessons/bilder/hedy-lamarr.jpg deleted file mode 100644 index e304bd1ea5eb654db50e2fa478ba0c1f0380aa0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40173 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 TY5~!oi!C$;v5o4KWX1p4xzFi$ diff --git a/web/lessons/bilder/ike-nassi.jpg b/web/lessons/bilder/ike-nassi.jpg deleted file mode 100644 index a0a78f3730fd90e8dd4f0bfab7c5bd2563c81dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19505 zcmbTdWmH^E)GpX~AV`oVxD%uU!QBZS+%>p0F2MtVV2!)GOE2>N&f%)~$MC!r>LPee&fKtRqwPDw*cPft%s#`KYq4n$2y zPxs#>2(LrY-=O27qvO&M5fIV+e=h$z0l04vVi7(fAg75FLZ?JrOYp{Raj{CT1>f9$r3v0m;u&(lWAg^6DCzTG~3g zdS>PpmR8m_wytjO-#k3Myn}uQhlGZOL*f$>lafRWGjYbJ;rQ`}Kq4-$x(l6_Q|%mR>N1Hz zNXNB7fAJr*|BdYb9k9UvU&#J1VE;F+B>*N8!YlERZ~>x#gL*}fOS0x3Fv-zjG9Ehd z4fewwIgO`zTgz^$pKMinuCj~0M*m~%4yqF2kqk!C65Om4gT`#bP#b;AAF)&`p`4=R!8;>V`;E2|NJHW0yg{L3@~sT~J@q zNg(~b%5Ax3pIlo7RS!{ae>o^)(HMx2oTa7Hoz%CVFgy4wr8mEe_eXB3!sg;6$@%Y; zzn-F@Y@4^TNl{q}omc~S?SQd+uC7e1 zP*W({uM?e_g~Pn&0!Le}t3V(@OuMF*d-Lx^nMP0QUp_JNvu%w&rNjw4R1{ft0Po6Fh2hAR{duK>l*@E<;oR|{_Nd8E*t~$85HJy=0HQ9qt zMWlXc{6e(5%JUXl){WuZ-f@c7P8YHY;Z66I|3S>*RmF1=8rl_Cq#~o%rVU+NT{IAz z#~sI)>O$rUHAtD4 zGhnJFE@7M^Nlh=UbC)|x^K50vg%*zQ)Ftu{Am3vuevsbk!D%3`yv~djQU{??+MDEk zpP(n}n$=OS5v~_#Q%d*5f#Fl1=*$5M%Z@A7MM!W!%VjNcu1jy-(jC&l^j9;fr|@0gZ5b zh6gUkoc#j`l-gOTOS@JOV=j$j~N_!2!Nr5!VG zLkSgBGro%&2O5o`*~m=Hq(|BVmr+M?Omai0-Uzvm`XLo~LYC&A1O(k=A_hNaFd$Rp zY=ZX|h7rb#+_Uj6ICbGP=>}dhxV4vnYucvD;yT{^n_7`#eI1nY27EJ^3y$pu_wR@X z5z60$0`8&9_W46x8Mh&#$2pGPR|>zwT55E$c*fSH5CaS0y{Bl6!k{#8f0Bk^B&+lN zJXcoqLh+qQ@N@^uy}s&?FY~BF5-!6uWHG%M<{dQC?nfcuw=>pM4>`N=i+#@ND!qrh z6UKUYO?ZZ#>{W~6k%HZQ!S`P_SRAn3eH4v9@4dgZ9lTHmHC8g z5A@aW@p-0uSf}fq)30*So*O!dZd7edM*fqGgCpyk@&jD|;~T+RnY}M)}f`{j-`2~j+3@v=+i{%9NTlesibE_HcS4h>l`vxW4TbN8M4 z`qjBIpKu1VV7fb@c;O>x%io->zZ*64MU<=f5;(i!rPozKSQc30w|!eeJ&3f{3mE)^ z{A3Brxy?$h+H+8cU3U*qwzex$PEWn7-j85PUk=p0`fqB_0@F0D$^5KUE}V7oZD!|{ zhTtw6uyekCB{27cV7sEo?$F_ymb5R98Z&B$U4S_n zQoU^gJN-`_P8&WTwKKsmo!HYONlAE(7iE;;%fN5XNC@r>Hatqj!J9JR#-4(3C3d-w zIgbd*hT+K2Et{$?jHT3i?VHna!LO6d>neEe zjXM---@%Yw@B%uwbf@! zhR7e&{{U55r|w8)U#tY@@11lmAc|35Im%LYHT|P%9n-2^-P3m58jJ;=&qrFQ3i0ey zA+7~!B+`3Nbq{qsThXBMCz66ljM`gwPq=o`hmf@G7mlfy!90TjR1xdn*QWCcwlX}o z{{Y%A?ymv?9~$S&;L-{3U66VC3|wz1H(gu)dmx&n!NXbBEWgAi>EB}82g?BUv0IF7 zTt;rc7?zL4l(Y{!fS%gkDMP`1gz$GC!^#U1GI1`r<)X6$53Ouo$P!Z*N-3F$Z^}-E z1nr&Kl68p$&6#u1IG{4sZ) zw&scZlw3h^&enUC{P;s-`+O;D9Ld-<=Zl}uytY@Kf!KG65|4A_!N=WdRy){4!<|z> zOr;>G!4mTU0xxn>*xI{J@s zk_2K-RkWuJFNmV>GTSA^k=v14+xf|%m0i>~1^aAZKb2S5^o+=j zs_SrS#p=TrNZC#VN4)c?lv<2@OVWhDy)7x4NI$qlDTtt&1uuNL0 z`AR4lpDb2DE4)VU>vx1UJDz{7(wX9B-E${^T8{2T z(@2h2x^UZ_Qr_6>wzlLj$HwM4gLXbRuEt+}kCmk!Eh#Oxk^hS`_1+cm;I3i0w$4YJ z-NRTVTi99R8`Ggzas9?}^SkOgvO7GhM{QgW%w!LG3uyz2n`;(m;5d4;__JuX5;)-^ zC2-5#2A6+(t~y8Ba>G4uD}E%E3U%4x0E?cQH>yczN`hgu-ZFRo12Ff`SFu>uIqx9` zf7?Tg7scp4{}YkEr2Jtg)hrOb&-?AFzHQ6*o23r5{lX^)AA!@qcfivW|zZ4CyB z{1!?Q9hQ#5uhxKVZ9Y@wBDa1G6K+d)BLWRgx|*wn^!*P_(Y#B@?x7oe>l*X{qqcwg z-!uv8M{2pOG}%T!p1!R>cjAQX3kjFW%ZHAE@@DH8S+{gm5G#>D*z2BUZB#;)?L4P|IWTGkXF`uR${s3&d;7vlMI!fL!;fGy-df8{)ffqEUOc+qX}0(G7=E3&X1kN0f<0r6ImdrbnpyND-@yGCW^O@M{dK~!QHXt`%*aZaX@YU_ z&hJurLuagIk)oZ9K}*3RHzHAT8!H!(mqIz5a0AsmuT%TnI)i#GMSH`&v~a*C0l^62 zgRgbN=o8;H4pj&GXo+0c3nct>lR-fXrfMYpOg)pC8Lj*epqC{Y%CZv`ce1&JCQa^- zaRQ@`L0(5a(bcwo_w;J`jCmL;g~@a5dwr`uzf(#XwT8}qpba7CJTuTd3#tcc8IR=C z@zLX#-Ef~Y#=aj8nyW=N<Xl=4oXMQoz%L;z4 zFY1kC{G^AjkW35;5I&Mro^#N=wciqo1!HWk$r=DrV#@YG3eu5jAx@*wtA7vjIKPui zTf&b^X#;0A{KGF*pWDdCeEu?>OVST>$OiIFJM=W+?KStCe2JfuRq7!oRaTvdo>>M) zG{i^bb|M9O;|5A8u%?j>VULA!i=^1$;VnD8kGFjW9sPmXN}DJY(7;Y2;#M#Qe@~AL zOeWFe{Jw;3Y=!4{G0PDl34=+jO*x2$VHa?w;Bn;p@QwT9e*kas)j*l4w$n9NYI~h;XoHc8SHUexq0u@n%bz{2`p%Z04pa^zqU_B7nz90?29M*53`bE>+6l%q^`^I84embk}Y zap+<=P#R7CYHr3o2X%!Ty2ROwjbuh#RZNqpKp}@&=^SIbE<%5A`bVYS12<~fLoIS` zq*+Q~=KK%tVJsN;p8;2WM2!V;irQG}I>i8{}y_4PkO6ao& ziAL$B7svOBh#*Om)x?^j@JeHv!xsrel;xe!D5DgvfRg!-$F(k69|M>4r)6%*bXGOPTEK zZ}*@gt28V5rcOPLwro51Fp(Q^h#i$yLW$0%xmDEyO_stZe@nHp`HC48Q<(^Q|WrHUQ9HK%soUd?-^m!%L zc666>Ha@_P)ac=n-C{dB7q1>FpX1L<_LSY36CoC8RhXNg!f12S{2su~q^lyHQOmU{ z(A5B~`>(W4ar5*$Gzh&MZjFd0KiXB5coVI#pC_h&l8Ks7jrADzeoxCcZN9x6y`i=` zIRmWl)-$~KP`lN>_JNbkIrCH6gd~xZ=z7$!f!1k)Tm%oYE2Zh{W4XX~=QzkphXL0&&;yjpYN$G)A22q-y$O@Fd~2J(`$y%i(xSFUGEm?hd_jK)dO&7auvEhW>}55 z;&;-K{bkpZTG(G-I7C3k9TOy}7SflN5r?CByD{S+W3bi~28gL}N(Jute47zF*u21m`9C`u70VvF|~kcZOy;V@%P4iL*BlbrfeZ<&?+f_&>-H=qAh ze!#h)qyQtxW{x#%n^%yR-SvnN$(R&Uu=2Bu!Ot`0V}L-b6unsLBKqKGiFO8C&rkD- z_aHR{6?C>EIH)5<>+<6;lVBLkMq*sj+qGja+OwtScqxc)jA;F0t@*M*t&nkt^HA)Vs`rNvN}n_?u23q8AcV&FIPPQFI6_|@9Ikp88UU54?(oT!90Vqj}_gI zHd8|EC5ufxmExJ+oG$)ZhH`2dGYakcOvMYhh`Gv+F&S`9@d zVilR6NBo*A)%hAiczjbFTOjC`A_3Tn_V-a13hE!<7!CnD`Nn;zPdiAai)E1Ka3hf~vB0wwE^Ls67FWJ?{M8DM%p zxM9s+ZPG-b+4{iqvY|*Nj z-@l-=#=x6ea~gHlhFNO+xzOti!wEJ&kE;%DYaw@#*L;wvo2}Z7jmdB;{_?n2uk$PD zn8aeXFumY}t>(dz$O%c>pIZsB_%m=5#JSQ`=cmNGeb%f+o5UkyBlJlU-wl24nB2UZA97^Owj!$W#Wr;aT%Qo=alL@ zw(c4f%3iIY&vC64I5xODv^}<_lcLZ?zNRf=v#c-kli-K|eU4;va_-~tBNROH2;51n z<;DJ4rn-yW$q#VcjpgwD9zTE(}XJuEG%8Ni}%vioL=TKy_ z@3arvAd8aaMcbGvmf z{LFMxM0fnK&C%mZK|gpTVk z);(ygj)q3aYDM%cncv>&KEOoAJU*(H?e`b!th?X9$~PyczhDylgipvQCG{R8*nCI& zrO3Q%eR9fRe|##&Nm=Dzy20 zVmkHw`u0Mg+*zC!?IT^;vfk(&W`CY$vV-J5Y1{~~m`Uir6`u1ZUp_?+pq8Ea2lylN zsGZ@Nq25v#B70gVry?t+WlY41?cC?BcORl(DzDgXD59mszzjyxP3MQCV2JTQPL3o@ zEU`NfX76S6yOu31Dmd9$5JpM@`ccpi#jar-{{X&$nqj|8(Fch8+kK=9%x*JG-<_(l z2OStVq;34HNj{Y${r(S-Bu?q(Q64!xvtFUtQ0b*EBQ&pdyZ^MLi-;(A^$###RpGYG zX$A&^n{t>5B*!=;HrwIOwCE8Ecx2qo^-lkVE#_&G}mA6 z!|9lOR+M$&+q)Q}xw0#OlsBEqfs{Vxw%0=?^mXyE7yc0 z^+7k5e5|Kplg<_Agp>51`Dbmb!f<312L?5u%6VQ)8O&C;-VtvFot5HKEh~aa(u%T* zAPQw#F^GK0_HF!Fhy>f4m|T&x;(>9tv8#kJK)JVN`kb?ur9_uELO|{##$?PJrSE1l zkrT8D^C#xGY$^y;H~#=f+DTyB+bg!Q)7cZf3gUGa34r(>If_?kc-{WkuHlyF0J3p< zQ@ix+8G;R=R63Y@6Ahmv<3LP7lB zn~<(ce>N+CGbB4Ptd;@;BF(s6RqMfmWi+&T<&n;YzWt!+LPZ3Asuy?0M&{OFe)+f< zy_8@hW#T?olglKzts*{^PB(%bIP-Kf3#DWDk9}KyT5J~(JF5=cV8x_z8#b5|udmLN zJ2%&~Ov3is3M59H&7f&dq0&R^LfOm4-8(=*tR=OLJJsrlAGtsM1QacW>G93!1aJ@Q zyDkma{RrK}(pl2wij>^~U|0HJOrG;Zr)##Qq%iQNcyjO>7S!OF{8`I#&s|;}ws+fd z)f?RXIgaVv=epEUwkd0stjHt`ktz~2Y=`nnd~S9I09C4PQ5Uhyv&E0?vnW~jb}?R8&y?!oo4^T1`RjUmZvEOSp= zL-MZEPDg$2U(X}&(;2NoL3%E~jQ`io8s+YvV37ktcRM-HO_zgw;JO+JsSbN)_4mEF6OGEXH!O(_69v>_LJ3E@E%3?% z>uywBCi2G#I`_CEL>rOOcg$#O362NK9UYgnZt7`omYT_MytnH9+Ue>sOY_S1$M1<6 z;OHfjTd*?7qNR{UrBLyB-iRb3RJpK|BDC+AOb#x6FLbN)b6JB=O>>SETb}yl*v>}} zDAQC_tDxSR9h?}9M^t{FB3F3`FpvB-Kq-$Q^A^=n5v{3oxlsL1TGNVOsA!h{Ebh$p6X~!ZovwqU;`VW~tZBsC zoU0>E_bb*SE1^5q$#O(PRrn0RZTzb8W@c(tf+jgGLrXfx zNpnCZc@K;y5}{u&Fur=*h%TP^j6}f{PNOvExLK(tkbdNAQt~(Ixkj6rv+f(E((K?x zPCsz+eO}^RKGkaCpuvl~>md4jx@4p>a@%y{X8uEVLyPDnd@)JCO+I0{yl^tu`U-a4 zCnb=w?qpQbF!102(*MoE1r3UuAd#s2E6aed?`uFT0`OyUuBd!HYTUQMW|kt*QA6oA zB~pC-H=esutUX>qbUq(zHt0`)+VtWczo7V|X@&(p!xB=-AF6mT4|-}%OD6Ws)bbn4 z8q>n}{i6mY)jXB1E=%2wq`y>Kwn^q{+t@!3sqxF5t*8x}VU7^}dbR}%vl1rSCpeLd z0ilAy@+o?$>1BA$(q=)k8kra+_5{ud!9-|9Zc9l~Nlgzw#=N*ACwp2)MBUV~BTGkz zKD0QbzgevfCIXHf;fL?ymaS8G9cejoZ#UL1wu=h`xPPV~itknrvk#1#-n|jTvwaV8 zw2ljk%6+NtIuu)3K@F9C3Xu)9gLkyUE42d!^$G|yZL8GAqQ9w9Qzq0i5 z#}$BYJePak#^_yRf?UYjgF@*;hDjIkHTQf=^+rqfKLF>US3@36TW3ydplAP{&QebJ z>2<7BN3fS0XY55lPmBtGmGT8;57UMuPlD4t71Q6|AZ(fHeQ;V`2xHb(j-66rh!!8! z#av#2^&ofN_T3uwO#O*AtwQsAtVp;SEx^wkV}AOCyU5+fK8@&Nq@oU|$U8Akza@ZP zGKuyKqifbQ-&=)v43Bc7&-Bh8iNJJ`MTe>V{S!!2lR(2^~x_il_d01YVr zICeNRn#@T1hTk~iN_KS&tmiIb(^A~ddK>ZRK74YO_|HSmz^T;!sFwz%D>t+LM)r7OF}r5ncHysp~in308ToAg73hKtd%IUkl?VY z;dy(f^yGlRi+=!*93y5mE~}MC%V4aZVsf;GqnT+INc^`*0U!nIKE{G}uvu7)HUGM0 z67AcYl1<1*B#aQdM@>WNZqg?vsCksGp)BC>mfOjRnfTPWUhxiJ2Jf-eSVN9wQLc60 z)1d%!Nq8l8D1=9PX~_TQKR_@Kx$|+fhb7PY)l@5Gc)GbjaQYF6E8Q7|*4K~Q0@1Gy z--~XQNR39k5Rja$GjcwIg+A|0rF0L))kRol{A=9f^(~YXw8+v!=H)3A@1y;;BBGr_ zv|*vs!9FF;L_M7L?yKsFCd;!|$!dPpvTq7yk3f>>hBooS!LHU$+^X%J^d8o43^oO; zde`)jU)8;89JI%-?H|c{JT+ThYgg|2 zgEh7Np#Ulw=4pMBQStQaSopWV5Yw2!FU~S8u7Xj{(DU&gKW(^)gM(#?!lZZG!Ar;1 z-_)xK@8)M=@H9&$*KZu1;*%bR{bs1i zH`if_x`;qvaxJ$qw#`z`xU&srjsLhrF5k01ym1jhC~{g4@cp1-2QR5XXixpzx_2r#{WE;{k+&>nb0x{g5O;%JfKtxNerpdiRGpvYW8X#BHe) zPq4$@h)24c+Lx~UD6cJBNUeQ-*GDQZc862nYQsN}@9%91IsGaW|F}BvTQC1L^}mq3 zDJM*)@1~-(qHYa>Gx3^PSe5g=T@^g8sRq~!|Kcm-S`SevBG{Y3IJ&V%+;uY{Zyw_t z1V&hFfbVyZJ3FiB)OQt;!hLo1$Ou<$oibEK{AUM@d?dmz0p69OsTJ zGYUf;B!IczPf1n>xtmyqY0@Zp@3!P%9eBIuqt%B;3)Jj3SC_1Q#hZjX^+$ti&reh6 znDeEW#rC+i2j$We_FE(d;zh zXhu){1Dp`z0eU|%`veL=Hte}XS!bU`%c=?0-t$Ze`~&pYZf}G(mR8}ayNS9r?EeEu z&K2mrJUvv+Y@OV2r6C}@fIexQ?}nDKC;K?X^J<5kFq|K#9ksZ%VCT^%EqS?=Tzpz_ zUQC%)RM%#i{Xvl*Y&16RIvMq0cCNIm?L0aSf0JpizXRmoLxIqgVR!q@g~wZ&cOd8w z!=twL`Zz|Huf9g>=VYQ~bJgaJ6?cXi9Hre>uP*mtzJ<)adX3^0hcWM@MEYT1ndpya z(xQXIMh*iRKkv*;%#Sh)6u;FCMasT6TmaEN`e>)KwmRFCNxE7`Bl4{%lcoqkPAEBK zr$;=;hd>oL;St4KK+Bjax1VQZBB)|m;;rAi~5s?C60H_H{~r26_^-$ay+G5 zGYR`>u7)z9TzhrZx(qSH*fp0jSOA5iOEI z!=!DBoRxE@f5EuS)d;YZ`T%ObhA#C{M@o(>0QR3rfhoL0>$ytJfoXR0?C+B>wXB zsI6&Z^6uv^ql(O&9ob9qHW_3~$;eE%uddq0*=*Gn#;A8^2a5R)y z>Y5W$>A~PNtcY|>jDW|*M+>}^MwbBQ@gi0J&0jbvx6)TT9sdCtw*5B1pJYdb>fYUf zrFbb95uJ$qXlkQT6$w>5x${G9{VL;{E+2*m#wUB}n0QuWHUptAZ55`;m>SW~U04@qOX{mEJ)KkgM=acgx~k;Yci%=;;o<*y$cei*9= zG6A-+e`k4q>Nd17@vm)=+j^VheYfnTr$g&PVEzqe168Ct_WopxCNJ4p1WR-dCQz{k zu5Pi)J==i7|OG#8>#SZc0`TzTM41kxDVKCC!pV>I>u`gOd>+)wcHTe9Axv$dan(pGodOE)R@hGkAdiHXp2o_5C`hB4 zj&wZqpwM!%jf`Ky;L$#l16RX#Wp%XZG9{sg7Jh$>gZw|;w_m}Mq~ud^6VLr6I}k-> z^+;f_HZ5#&L8GxHF(q2g4tp)IzKwlj;Z$_f%#~yW{qIua>f_TKd+{MRQJg@ykqbv% z7Kfq4CMf)5JAN&4Jf=q*#s{h@ti_pilF*NbIsR_E`AoA$NHd4J?eKDO zL(|TaS63GTUjkXbqjP4|M4BqDl1>tlUD(ci$m&$P&WFqdj8b!{*Z{1!+RKU)Nn}kF z{cXRw%32#s$TFmxIXTGyX{)$;E+Z*!FbmaM4KTMrM+XL9A%9A>c$ng;v!J$IvAH?de>d{`9ZF>v9ZT^yvzk#fYm zBfo1db=Qm`_Y*N#Bh`PM=bCAo>R*H}4;TPeZxhDnYCrl8JK66NQ-v6;(H*=iH}+KJ})HkBWo~1ypw&nP$(n zveye%EwSY)Cs2)on7?BpW&?O97d$p@##4xE+6dJJ}O|ga~0g6GI{2FKB1Oz(S3l z38#3O=Q2((@-F z>wAsdnHwWfHseXzUNE>jAMNy|Z}ZN(n(Sczuouk354s)w*xyd zT6HxeuT>ci_O6$Duu8>n1B#LV;|m(Wb&XFHh#*@_?XGwqCr)Ne`)naRbUR;A<>RYShk zeH9ToHlvLCk~+zYX!bHux*h3Y7Go-Gs~@~v-*4*@(Blqp5uu&POW)zvh^(J^Gu;1N zr~cRP2!nAoYdh(E>3Vi?>r<&XvRTknTg9dk)OCYgKtIAXZ`-Nb+@+UW$PmJq_ucwKSX zSjtVhe*h&#_qb=~j$bvZe{1P3Kd0^h09*M_?r>X*kn&~H7FY%F77!EYu#ofmAcq@y;K`YeH>?>u7u^kaoaTyXr}j`r zRTEuz#ooqjoMZ*hRmp%6zB1DYs@aq}l+g=lLMw7#*{)A}q+zl_VUcIYV9ZZNAuxp) z6R3(8zW!?UR{}AyAsOLc4EM75Y-Vwag($D;mn9qHT;!Y+Js&M|lit@I`HQ%Q^#DdQ zQ7B3lv`0ifz2>YmO*{S(wVA!)Kkf0y>n39UaV&OVl&uwCdMFZ>#=^4l$k0WSxKt9# zVwK~tF7!(bF0qdBr!oe^=Fj4H%9?sw%<2%wvc1Q-b}#7aD#0t^sa}^BfMFhzqcUV` zeoaCsqNt!MK2T;I-PtQ_V}nIr7FOlwMAc|@HlaZxWUim4tc&fc;l5nOVSS=0&@pMN~g9-}f{_vAEX^cmt)8|eeEIjht)ls@ls zCY$<%LSx+P=Xccq!tALwEq?JiHk_OH$t-OnT;f3?VF3BMpL?*it6;g6es#6}GP5rn zi8Ep4WF6sQxA|7k&U+rh)vlnzSYYmSMjYiOvdA6E8^8j+avCa?rOwRBxZs1mSGf2S zZnp<{b4Kl%KWuu^#4w)_4_45^ z&i%T@KT+bXqB6HppxW1MF1*r+43!Wbb?eTTAL({(Z4vz(Dz7TbWIHC74`B{q%!mBP za{vNW2;=KUzyhds$ifOCQ#w ztJo#qZiEfPC4%AX1Q=f?Tar4NtaCHf5o$yx&ol?DxY?2Tg(jL# zbcfYKrCX($X8P=!2_EaKX-FWu?v25PX5Eo99XG?C(>jD&FS4TSdqAMoFlmaC&{z+b zmH@1ou0Qo8Z`RAwUcVu2z`}m(VSDSi2gx1tt;QNWGiZxI1nej)hSaR=oPf{v_K7T{SK}fwo9x zzHr%CgUrDgXPV0{gJd?oPf&!{MN#2Q15bh$nI!vdkpp^ZWD9$pj(RwX@=~tQMzFko z?hO?8Bhd+Rc3|5?t!EYdEw(GNeS13()T3o}uwe>Tq&@_H4b16pWT(}9VhBX^;m(db-;db_jDV#@_v)#X~S zTB*$S8#1@b>`+riTLF(OVt7x|A%7L$tk8!kBf%f@2}X@{MAELqTakVs3O`QQpvKa2 zwO>#_ocy^=rV1rkqSwa%k*xtL)^J9G0I^qv)-}rKR`@D?RlgwB(|@v+2N>0TJx%pVXuR#@6AAE6-bAf~X zS$-k0Vp;Du{q@ByFksR*9H2@tm3ye@wulga#;30eD~Mwo7+ z$je`Dif9{M*{drrV_00JNv^7})Pz*eWT)Xldw!A|q#PBt^T1sy1Jvu95@dYOhk)|M z0_D5a>_+m;9gVvx=L@Wsub|F*5KWS3lyBLlRns)L zLI%Ib$A(J+yC;&-?&G79Pi{9pSaOckn3MsoKh~hhk=JlgzgrHeFyz5_j|?OI>w6;u z{@Ag>1tPwnHw>Msi*DQ zE)Q4>Y@<9vj5DM>mEBU5LFSiF<-bV$yZiTyANC*wLXIeT$x^<3dR&ON2(!kv|MilJNGpy zBwas8ha@J=tLKL88iN!)RdsKzDGaxYIki^IL z;yoYpY;fMKP}yH8E$ZPxq)q#D$o^dYpzV{l--?`=LoRbUFdfFtP#-nw;cUCXyAvfBH zF#5XGD;)0n94zB{ez~?{Z>Tc-DZj6OFMTJY0^E+ZzHU0Y36%E8A2=(Q)C}Dm0?MHQUpxD~tBGja9`p5{=e$TR46Tct1WtkixygK+%5Gmc}0yDN@ z*=00Z#4O$AfOAbmpHFzOtf;ziI^i@VzBW;Bp>EncU4Sy|v^aKoFfk6k^U!4XtqUr+ zs)i*5chJm>>IBh5mWqT{a;{Vd74H>wjQDtLAGn| zz$%6kqmbxKt#<52g}K>0ye{Tp+%2lvX7^uzFRoz>-RBC$D{DG~Lu9g{)yMut4gyJZ zyX|DcUP|e9+huZ0ToEaH9et}go!VHhmutZ-iQk+DGsG!!{j6*}k> zPa^#}wcFkn6Tg|={kmHGnJT8u?|V{~eD>V;QQuJlzf7-}t>W{>pLV{S=y77nm*P)@ zsV<_66oK`h9Fw`I`OP{J^C@jI_lQsnnXtmHEV>dJ>ph^f!&uld?Q4|~UPGF0{fvZA zs#dFdXUQ+E7Zj!Lq}S$Ql&jMI!G6lku<}!#vqd#6QeN{Iy}EqvFCUl-fQ{n(+*gcJ z4!?3WRRCL%vAKr!%1QjJ0ht56dAzW$&ev;HvuPAE&lL)IbwamKayHZ|`1}-EptKpg z-RM12<^aHvQ4UIt!E%M4`129!l}r?jr~$1QjFq8`G#|p zK!rc|)v3=#X2y~}2YoBEE}Syfy2QvvCs;Q(D&Q7jLPso#^&pPj!emCPN8aXtRNrlZ zun%Jtu{`Fqw$!Fatdy>}B{L*M?zKy^5Pd6+IvLnOA~E@20o@8B_0;c^??aJLq>)Z7 zjJUNkOsS8Qa%xF$Ak)W`qjb2&(b|NpyP%|8pj!h{x{t=~Z%;_Y$ zypynBgRN=A(L^yA*gdKHvOe+r>Qx)N&D?HpWLEzGgm+J60pJbp zNv8h*!a1ZbTV($LzKvTXQ+KHBD_%(UBJa6P^gSyCEG$3VV^tf%noG9lwqifqkea)7 zsYh(NEHha5I<(XDV;X*@u&M0U=++8M(P?!3B0ZMSM6Hg9pjV!F=Jx7flR+Vlc9}5g z!2x;y01D}MdAY$M2i|XAYOxoF;npu95~2G%KQnuuO5nsP)?UsU9Ww3exd1aVzFx7^7}+Z@B_7l-B(5$#I~U)m5H?^@~HgHSwb{b}-BVRJXR zlwD+8vf!G?*Y4u8)25Y(0Ti0s)S_E^c_q#;GhR>e4_}n&ixgQcEA0c<6<4uPS9djh zC8)`JqNJZHxp&Tg-Zf8Gd*{B8MA0g)6l7;L&uW^D_rkp&L%F?*Nn*WOB)E?pq@6z{XH7XJ6x%+>T6n0`)4{HUaE}ys zq|FsV6!0@Z=}m5!^)$Jr0_KWJC;@XuX(*%uGvceruQA4OJ*vjqF;dmWR2DJkEH@u| zkXoSVpnWQ0D5c7Waxn@Z&ILm82RYkT7?awNFC5U&6du>U38n~&AG?8CSRRy~SUst7 zj^=O-#{#WK2@94rVPRG00;}pbvDw?Ry8r;9*42jkA_-;*o_bbBp{*=n#}N$O&tX{l zmb~+l5sD|Tb6M8V-s;R&)*?_IT$};;*DUI{q)np)wPlNqOLG=x+}@_8wY0sz!-$wg z*KyzxTRLBbZLL6->-{2LxIc7#1#L$dl0cwgM;NJ8TikB1Vuqcdv+Oq?EJ|`C?%!JI zB8?(lsG&xB0g6;mqMcn-=|&qEN^V=3o+X^ycz;osI4f--A6=%o4+&~(cc)w2O6BHQ zlMCD&V4u#qPaHna3|}sP)+W!)*B{}{G4%Zs4Mhn%9ortj@;-!Sy!>37u9E1Ex(RzN zdb6;O;$OY7uzhPz-bI=*kV*ox8-{n1w8)Dm&XWN$-SsYUEVi$sN3nq!^4YF3p%$u*aIc5vG}3TzR9 z;|*2(p=EFLODV<&rE%8Y9Xj`m^y>)*_$^1BG4=;PslcwS?SxMElYG*i7e4i^;TZ!wdR>k8g`Vd3Od5*WxRqfDSo8Aa07h||^6ev4 zp4P%RG>s|jEaMnRS_a%Zl6dNC+WcX7milQAj6M`(_pT)`7krz_t{>$9_V@Rwp65k1 z?xWXK)T>p|s%160ILQYTQVI?YRlrTau;!hgN@f9U0n?gzoDjC_c*&%Il;vP*OdqX2ZQCwb}6)jnTSFHZ2J2n4r;&i?@2KXiT_>uxv_ zFclOkj)6u1sdI(J0P{^jEs4FvY=KrS5ROemIUrT2Mg>w@iIa*cGm2W&lbP}RAM8;W z{y9{CI!z7*hr;%O#zO{TKBUrk-0!r32mJKU=~kwQ!=qW+slh0qpFxgm&XP{FrQ~%d zYH>w<7DK0LZ4`&)NnA(Ha+%_xM4MTd;h7*)hGE~>REcZ$*9pqPoN>l$UL;6kR8SQ_ zzyq~h7c#d*Or5seTT2^zWC)7VHoI0IIt25?fiUN%EpD z(e$iME9JVu9Ga8FTFh3<8vk!)HeoMDu(;PLjM3$MkQIq3+eKXe^Xi{?BElD?NZs(9ZyU{nwLtC#ScrmnUH(a zPHEgkz=K6rG8oT2DrA&6;)KG&lTF=9X@uf{6q*YFDl+vHvK(MixXDa{lYLj+fk&C| zQ*g02nM|1PjE`DqaY$c-MaD-QN`nAYn{i03PM`$ECwg@tOwa@48LKLADij+)r-r74 z$-&5=8e*C^aa1Fo@hTgOt7rh@c7HR9(7Ovf<`qBclmb07QC`L+)$McZ{Hn#Y1HEO5UxkSe1Jsk)3gkRn_Jy)bDJ55y;$>H1(C5%llGzlKTb6Wt1k?1`Vu?zl<@xKD z=bz53vW$@1W1dpcMSk-8cKtsh^4Vaaxlx>c+cGw4mty(z= zqB%fm)f{xY^Ii$@y zhr)a#X873^G<5ckzN+uwPN1wWf*P^3SGxyM+8(Za%#z@ zv|)`lgjVZKBBwE8m{z5skdsJQ;+(>wV~Rr*NrO`?nW{|u(6enlXiO|<1Dbd>NiGMi zPLhLFaTDgAwFqp~s@zi$@Nh*VzA7e^168KE_oUd;BEFEU(Mr8RAbn2)v=&2df(^fP z04p)$7e*|S3P`W@!L6wySqN_8u!?-mqej)0%D=pmh2VPA{-f1BC~sPY3+WjGq_@l zr@I}REe|HvGC&HTWSaAhZ^inDi?wFZJTdndiSIcIgFKx2e>!i9b*)Fm`jhx)Kw^<0 z#r5AsjDL4M>!Z<`j)93%!e^VOD~~41$G*>n7W(FndB|Jn0|(i#8& diff --git a/web/lessons/bilder/katherine-johnson.jpg b/web/lessons/bilder/katherine-johnson.jpg deleted file mode 100644 index c2df60c5ef351c1f770fa455c5a1c39734441df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41104 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 diff --git a/web/lessons/bilder/kino-saal.svg b/web/lessons/bilder/kino-saal.svg deleted file mode 100644 index 18c5a30a..00000000 --- a/web/lessons/bilder/kino-saal.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Leinwand -Platz (zweiter Index) -0 -1 -2 -3 -4 -Reihe(ersterIndex) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Gestrichelt: sitze[1][2], Reihe 1, Platz 2 -verkauft = truefrei = false - diff --git a/web/lessons/bilder/kino-schleifen.svg b/web/lessons/bilder/kino-schleifen.svg deleted file mode 100644 index 486b7ca5..00000000 --- a/web/lessons/bilder/kino-schleifen.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -äußere Schleife: reihe = 0, 1, 2 -innere Schleife: platz = 0 … 4 -sitze[reihe][platz]ansehen -platz -0 -1 -2 -3 -4 -reihe0 - -1 - -2 - -3 - -4 - -5 - -reihe1 - -6 - -7 - -8 - -9 - -10 - -reihe2 - -11 - -12 - -13 - -14 - -15 -Innen läuft platz durch, erst dann geht reihe eins weiter. - diff --git a/web/lessons/bilder/l01-pap.svg b/web/lessons/bilder/l01-pap.svg deleted file mode 100644 index db333bfd..00000000 --- a/web/lessons/bilder/l01-pap.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start - Tasse auf den Tisch stellen - Zucker gewünscht? - Zucker hineingeben - Tee noch zu heiß? - 1 Minute warten - Tee trinken - Ende - - - ja - nein - ja - nein - - - - - - - - - - - Start oder Ende - Anweisung - Verzweigung - Ein- oder Ausgabe - - diff --git a/web/lessons/bilder/l02-einfuegen.svg b/web/lessons/bilder/l02-einfuegen.svg deleted file mode 100644 index b33a3b6e..00000000 --- a/web/lessons/bilder/l02-einfuegen.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - Wohin landet das Element? - - - - - obere Hälfte - untere Hälfte - → kommt davor - → kommt dahinter - - ø - → ersetzt den Platzhalter - diff --git a/web/lessons/bilder/l03-lochkarte-beschriftet.svg b/web/lessons/bilder/l03-lochkarte-beschriftet.svg deleted file mode 100644 index ac9ff74d..00000000 --- a/web/lessons/bilder/l03-lochkarte-beschriftet.svg +++ /dev/null @@ -1,1016 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Ecke abgeschnitten: -so liegen alle Karten richtig herum - -Aufdruck zum Mitlesen - - - - -Zeilen 12 und 11: Extralöcher für Buchstaben -1 Spalte = 1 Zeichen -hier P: Löcher in 11 und 7 - -gestanztes Loch - - -80 Spalten = höchstens 80 Zeichen pro Zeile - diff --git a/web/lessons/bilder/l03-lochkarte.svg b/web/lessons/bilder/l03-lochkarte.svg deleted file mode 100644 index a5cbccfb..00000000 --- a/web/lessons/bilder/l03-lochkarte.svg +++ /dev/null @@ -1,995 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/web/lessons/bilder/l03-zuse-lochstreifen.svg b/web/lessons/bilder/l03-zuse-lochstreifen.svg deleted file mode 100644 index d379feb7..00000000 --- a/web/lessons/bilder/l03-zuse-lochstreifen.svg +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 -0 -1 -1 -0 -0 -1 -0 - - - -= 1 - -= 0 - diff --git a/web/lessons/bilder/l04-camelcase.svg b/web/lessons/bilder/l04-camelcase.svg deleted file mode 100644 index 49bfc6c8..00000000 --- a/web/lessons/bilder/l04-camelcase.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -preisMitSteuer - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/l04-variable.svg b/web/lessons/bilder/l04-variable.svg deleted file mode 100644 index fa80702f..00000000 --- a/web/lessons/bilder/l04-variable.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - int alter = 14 - - - 14 - - - - alter - - int - - - - - - Wert - Name - Datentyp - Über den Namen kommst du an den Wert. - diff --git a/web/lessons/bilder/l04-zuweisung.svg b/web/lessons/bilder/l04-zuweisung.svg deleted file mode 100644 index 1fce2904..00000000 --- a/web/lessons/bilder/l04-zuweisung.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - punkte - = - punkte + 5 - - - ① rechts ausrechnen: 10 + 5 = 15 - - ② Ergebnis links speichern - - punkte vorher: 10 → punkte nachher: 15 - diff --git a/web/lessons/bilder/l05-tauschen.svg b/web/lessons/bilder/l05-tauschen.svg deleted file mode 100644 index 1658c6b3..00000000 --- a/web/lessons/bilder/l05-tauschen.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - links - Saft - hilf - leer - rechts - Wasser - - - - - - - 1 - 2 - 3 - - - 1: hilf = links - 2: links = rechts - 3: rechts = hilf - - diff --git a/web/lessons/bilder/l07-schreibtischtest-de.svg b/web/lessons/bilder/l07-schreibtischtest-de.svg deleted file mode 100644 index 8cd90476..00000000 --- a/web/lessons/bilder/l07-schreibtischtest-de.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - -a -b -hilf -3 -– -– -3 -5 -– -3 -5 -3 -5 -5 -3 -5 -3 -3 - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/l07-schreibtischtest-en.svg b/web/lessons/bilder/l07-schreibtischtest-en.svg deleted file mode 100644 index ec89eb8e..00000000 --- a/web/lessons/bilder/l07-schreibtischtest-en.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - -a -b -temp -3 -– -– -3 -5 -– -3 -5 -3 -5 -5 -3 -5 -3 -3 - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/l07-schreibtischtest-pt.svg b/web/lessons/bilder/l07-schreibtischtest-pt.svg deleted file mode 100644 index b60eafe9..00000000 --- a/web/lessons/bilder/l07-schreibtischtest-pt.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - -a -b -aux -3 -– -– -3 -5 -– -3 -5 -3 -5 -5 -3 -5 -3 -3 - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/l08-zahlenstrahl.svg b/web/lessons/bilder/l08-zahlenstrahl.svg deleted file mode 100644 index 8381d353..00000000 --- a/web/lessons/bilder/l08-zahlenstrahl.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - gültig - ungültigungültig - - note >= 1 && note <= 6 - note < 1 || note > 6 - - diff --git a/web/lessons/bilder/l09-wahrheitstabelle.svg b/web/lessons/bilder/l09-wahrheitstabelle.svg deleted file mode 100644 index 3f80291e..00000000 --- a/web/lessons/bilder/l09-wahrheitstabelle.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - a - b - a && b - a || b - !a - true - true - true - true - false - true - false - false - true - false - false - true - false - true - true - false - false - false - false - true - - diff --git a/web/lessons/bilder/l10-kopfgesteuert.svg b/web/lessons/bilder/l10-kopfgesteuert.svg deleted file mode 100644 index 48281954..00000000 --- a/web/lessons/bilder/l10-kopfgesteuert.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - Ablauf der While-Schleife - - ① Bedingung prüfen - - ② Inhalt ausführen - - - - - - true - wieder - nach oben - false - weiter unter der Schleife - diff --git a/web/lessons/bilder/l11-vergleich.svg b/web/lessons/bilder/l11-vergleich.svg deleted file mode 100644 index 48d918dd..00000000 --- a/web/lessons/bilder/l11-vergleich.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - kopfgesteuert (While) - fußgesteuert (Do-while) - - - ① Bedingung - - ② Inhalt - - ① Inhalt - - ② Bedingung - - - - - - - true - true - Ist die Bedingung gleich false, - läuft der Inhalt nie. - Der Inhalt läuft immer - mindestens einmal. - diff --git a/web/lessons/bilder/l12-for-ablauf.svg b/web/lessons/bilder/l12-for-ablauf.svg deleted file mode 100644 index 4cbb5765..00000000 --- a/web/lessons/bilder/l12-for-ablauf.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - ① Start (nur einmal) - - ② Bedingung prüfen - - ③ Inhalt ausführen - - ④ Schritt, z. B. i++ - - - - - - - - true - zurück - zu ② - false - fertig - diff --git a/web/lessons/bilder/l12-while-zu-for.svg b/web/lessons/bilder/l12-while-zu-for.svg deleted file mode 100644 index 8aa5bd82..00000000 --- a/web/lessons/bilder/l12-while-zu-for.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Start - Bedingung - Schritt - StartBedingungSchritt - diff --git a/web/lessons/bilder/l13-verschachtelt-tabelle.svg b/web/lessons/bilder/l13-verschachtelt-tabelle.svg deleted file mode 100644 index dd830d43..00000000 --- a/web/lessons/bilder/l13-verschachtelt-tabelle.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String text = "" - for int j = 1; j <= 4; j++ - text = text + i * j + " " - output: text - - VARIABLENKONSOLE - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - text = - "" - text = - "1 " - text = - "1 2 " - text = - "1 2 3 " - text = - "1 2 3 4 " - text = - "2 " - text = - "2 4 " - text = - "2 4 6 " - text = - "2 4 6 8 " - text = - "3 " - text = - "3 6 " - text = - "3 6 9 " - text = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/web/lessons/bilder/l14-array.svg b/web/lessons/bilder/l14-array.svg deleted file mode 100644 index f1fbf46a..00000000 --- a/web/lessons/bilder/l14-array.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - int[] zahlen = {2, 4, 6, 8, 10} - Index - 02 - 14 - 26 - 38 - 410 - Wert - - zahlen[0] ist 2zahlen[4] ist 10 - 5 Fächer, gezählt wird ab 0: der letzte Index ist 4. - diff --git a/web/lessons/bilder/l20-cpp.svg b/web/lessons/bilder/l20-cpp.svg deleted file mode 100644 index e1261a7d..00000000 --- a/web/lessons/bilder/l20-cpp.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - rechner.cpp - Quellcode in C++ - - - - - - - - - - Compiler - - Maschinencode - - Windows - - Compiler - - Maschinencode - - macOS - - Compiler - - Maschinencode - - Linux - Für jedes System - neu übersetzen - diff --git a/web/lessons/bilder/l20-jvm.svg b/web/lessons/bilder/l20-jvm.svg deleted file mode 100644 index b8a3d152..00000000 --- a/web/lessons/bilder/l20-jvm.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Einmaleins.java - Quellcode, für Menschen - - Einmaleins.class - Bytecode: CA FE BA BE … - - - - - - - Compiler javac - - JVM - - Windows - - JVM - - macOS - - JVM - - Linux - Einmal schreiben, - überall ausführen - diff --git a/web/lessons/bilder/margaret-hamilton.jpg b/web/lessons/bilder/margaret-hamilton.jpg deleted file mode 100644 index 9a5ae22de88d9c85636758b399257539db7be976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41701 zcmbUIcT`hP)ISOz2u-Sh^b)0rQl*2GfJm1n(vgUC=^z+tC<+Ln3n*O$5h)SrNR=*9 zr1z3gq$kt>A>4eQ`+J}FpZmvMcjv5}SvfPa&Ys!X?X%}<`f3@tuBWA|1(1*cfDZ8k zT&(~RnlLwK05C8BgaH7c0?0@>0diuC*ac7};ridU7Rem|^gq9o0zj-AK=yz77!vRQ z5plNv8S{VNL4_p$r#Eq)Lel?VZxYc$(Eqkm{u_4H4lq)Yq>zY$NcaF!MiLMs$yFBs zCeB4p@;~%nr~inA6huZ&K}mIunuge+_BudH0s@hefyl|ph_6BtMtlyCF_JUgl2oT) zHnFGV^SvPznfj56|3Os;%j3To0qN&{QP-$h+1NQa1#b)8xhpIqD<`j@cwgh8rk1vj zuAb==Gjj_|D{BWwCubK|w-^2|0|H;cf`X%8zln*BdmEpY{w^ak>-~r9PoIm5zm$9} z{r01}rnauWp|R;#XIFPmZ(slK(XsJ~$*Jj?*%cIeb!~m)-{uzf;PB}9

*y{vTh& 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 - - - - - - - - View - die Anzeige - - Controller - der Zuhörer - - Model - Zaehler - - 0 - 1 - 2 - 3 - - +1 - - wert = 0 - wert = 1 - wert = 2 - wert = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 erhoehen() - 2 erhoehen() - - - 3 getWert() - 3 getWert() - - - 4 aktualisieren(wert) - 4 aktualisieren(wert) - - Das Model kennt weder die View noch den Controller. - diff --git a/web/lessons/bilder/pt/aufgabe-mehrwertsteuer.svg b/web/lessons/bilder/pt/aufgabe-mehrwertsteuer.svg deleted file mode 100644 index 70b4b6bb..00000000 --- a/web/lessons/bilder/pt/aufgabe-mehrwertsteuer.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - telemóvel - - - - abrir - - - - - - - - - - - - - - - NOVO - - tablet - - - - - TALÃO - Telem. dobrável - s/ IVA1000,00 € - +23% IVA230,00 € - - TOTAL1230,00 € - - - - Assim se forma o preço: - - sem IVA 1000 € - - 230 € - - - - - - - - - - - Finanças - - - - - - com IVA 1230 € - É isto que pagas na caixa. - diff --git a/web/lessons/bilder/pt/kino-saal.svg b/web/lessons/bilder/pt/kino-saal.svg deleted file mode 100644 index 65dc50de..00000000 --- a/web/lessons/bilder/pt/kino-saal.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Ecrã -Lugar (segundo índice) -0 -1 -2 -3 -4 -Fila(primeiroíndice) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Tracejado: lugares[1][2], fila 1, lugar 2 -vendido = truelivre = false - diff --git a/web/lessons/bilder/pt/kino-schleifen.svg b/web/lessons/bilder/pt/kino-schleifen.svg deleted file mode 100644 index c9788f21..00000000 --- a/web/lessons/bilder/pt/kino-schleifen.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -ciclo exterior: fila = 0, 1, 2 -ciclo interior: lugar = 0 … 4 -lugares[fila][lugar]ver -lugar -0 -1 -2 -3 -4 -fila0 - -1 - -2 - -3 - -4 - -5 - -fila1 - -6 - -7 - -8 - -9 - -10 - -fila2 - -11 - -12 - -13 - -14 - -15 -Lá dentro, lugar percorre tudo; só depois fila avança um. - diff --git a/web/lessons/bilder/pt/l01-pap.svg b/web/lessons/bilder/pt/l01-pap.svg deleted file mode 100644 index 21554373..00000000 --- a/web/lessons/bilder/pt/l01-pap.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Início - Pôr uma chávena na mesa - Quer açúcar? - Juntar açúcar - Chá muito quente? - Esperar 1 minuto - Beber o chá - Fim - - - sim - não - sim - não - - - - - - - - - - - Início ou fim - Instrução - Decisão - Entrada ou saída - - diff --git a/web/lessons/bilder/pt/l02-einfuegen.svg b/web/lessons/bilder/pt/l02-einfuegen.svg deleted file mode 100644 index 135f76b4..00000000 --- a/web/lessons/bilder/pt/l02-einfuegen.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - Onde fica o elemento? - - - - - metade de cima - metade de baixo - → fica antes - → fica depois - - ø - → substitui-o - diff --git a/web/lessons/bilder/pt/l03-lochkarte-beschriftet.svg b/web/lessons/bilder/pt/l03-lochkarte-beschriftet.svg deleted file mode 100644 index 89cefb22..00000000 --- a/web/lessons/bilder/pt/l03-lochkarte-beschriftet.svg +++ /dev/null @@ -1,1015 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -M - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -U - -1 -2 -3 - -5 -6 -7 -8 -9 -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Canto cortado: -assim todos os cartões ficam na posição certa - -Texto impresso para ler - - - - -Linhas 12 e 11: furos extra para letras -1 coluna = 1 carácter -aqui P: furos em 11 e 7 - -furo perfurado - - -80 colunas = no máximo 80 caracteres por linha - diff --git a/web/lessons/bilder/pt/l03-lochkarte.svg b/web/lessons/bilder/pt/l03-lochkarte.svg deleted file mode 100644 index 1b08640f..00000000 --- a/web/lessons/bilder/pt/l03-lochkarte.svg +++ /dev/null @@ -1,994 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -M - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -U - -1 -2 -3 - -5 -6 -7 -8 -9 -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/web/lessons/bilder/pt/l04-camelcase.svg b/web/lessons/bilder/pt/l04-camelcase.svg deleted file mode 100644 index 282a1364..00000000 --- a/web/lessons/bilder/pt/l04-camelcase.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -precoComIva - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/lessons/bilder/pt/l04-variable.svg b/web/lessons/bilder/pt/l04-variable.svg deleted file mode 100644 index adcbe73b..00000000 --- a/web/lessons/bilder/pt/l04-variable.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - int idade = 14 - - - 14 - - - - idade - - int - - - - - - Valor - Nome - Tipo de dados - Pelo nome chegas ao valor. - diff --git a/web/lessons/bilder/pt/l04-zuweisung.svg b/web/lessons/bilder/pt/l04-zuweisung.svg deleted file mode 100644 index 509b8fa9..00000000 --- a/web/lessons/bilder/pt/l04-zuweisung.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - pontos - = - pontos + 5 - - - ① calcular a direita: 10 + 5 = 15 - - ② guardar o resultado à esquerda - - pontos antes: 10 → pontos depois: 15 - diff --git a/web/lessons/bilder/pt/l05-tauschen.svg b/web/lessons/bilder/pt/l05-tauschen.svg deleted file mode 100644 index 26136056..00000000 --- a/web/lessons/bilder/pt/l05-tauschen.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - esquerda - sumo - aux - vazio - direita - água - - - - - - - 1 - 2 - 3 - - - 1: aux = esquerda - 2: esquerda = direita - 3: direita = aux - - diff --git a/web/lessons/bilder/pt/l08-zahlenstrahl.svg b/web/lessons/bilder/pt/l08-zahlenstrahl.svg deleted file mode 100644 index 7c20196b..00000000 --- a/web/lessons/bilder/pt/l08-zahlenstrahl.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - - válida - inválidainválida - - nota >= 1 && nota <= 5 - nota < 1 || nota > 5 - - diff --git a/web/lessons/bilder/pt/l10-kopfgesteuert.svg b/web/lessons/bilder/pt/l10-kopfgesteuert.svg deleted file mode 100644 index bc6c0131..00000000 --- a/web/lessons/bilder/pt/l10-kopfgesteuert.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - Como funciona o ciclo while - - ① verificar a condição - - ② executar o interior - - - - - - true - voltar - para cima - false - continuar por baixo do ciclo - diff --git a/web/lessons/bilder/pt/l11-vergleich.svg b/web/lessons/bilder/pt/l11-vergleich.svg deleted file mode 100644 index 32376a16..00000000 --- a/web/lessons/bilder/pt/l11-vergleich.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - pré-teste (while) - pós-teste (do-while) - - - ① condição - - ② interior - - ① interior - - ② condição - - - - - - - true - true - Se a condição for logo falsa, - o interior nunca é executado. - O interior é sempre executado - pelo menos uma vez. - diff --git a/web/lessons/bilder/pt/l12-for-ablauf.svg b/web/lessons/bilder/pt/l12-for-ablauf.svg deleted file mode 100644 index 7436cda1..00000000 --- a/web/lessons/bilder/pt/l12-for-ablauf.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - ① Início (só uma vez) - - ② verificar a condição - - ③ executar o interior - - ④ passo, p. ex. i++ - - - - - - - - true - voltar - ao ② - false - fim - diff --git a/web/lessons/bilder/pt/l12-while-zu-for.svg b/web/lessons/bilder/pt/l12-while-zu-for.svg deleted file mode 100644 index ffba5bc5..00000000 --- a/web/lessons/bilder/pt/l12-while-zu-for.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Início - Condição - Passo - InícioCondiçãoPasso - diff --git a/web/lessons/bilder/pt/l13-verschachtelt-tabelle.svg b/web/lessons/bilder/pt/l13-verschachtelt-tabelle.svg deleted file mode 100644 index 070abbc1..00000000 --- a/web/lessons/bilder/pt/l13-verschachtelt-tabelle.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String texto = "" - for int j = 1; j <= 4; j++ - texto = texto + i * j + " " - output: texto - - VARIÁVEISCONSOLA - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - texto = - "" - texto = - "1 " - texto = - "1 2 " - texto = - "1 2 3 " - texto = - "1 2 3 4 " - texto = - "2 " - texto = - "2 4 " - texto = - "2 4 6 " - texto = - "2 4 6 8 " - texto = - "3 " - texto = - "3 6 " - texto = - "3 6 9 " - texto = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/web/lessons/bilder/pt/l14-array.svg b/web/lessons/bilder/pt/l14-array.svg deleted file mode 100644 index 9e19b6bc..00000000 --- a/web/lessons/bilder/pt/l14-array.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - int[] numeros = {2, 4, 6, 8, 10} - Índice - 02 - 14 - 26 - 38 - 410 - Valor - - numeros[0] é 2numeros[4] é 10 - 5 posições, conta-se a partir de 0: o último índice é 4. - diff --git a/web/lessons/bilder/pt/l20-cpp.svg b/web/lessons/bilder/pt/l20-cpp.svg deleted file mode 100644 index 96ebab28..00000000 --- a/web/lessons/bilder/pt/l20-cpp.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - calculadora.cpp - código-fonte em C++ - - - - - - - - - - compilador - - código máquina - - Windows - - compilador - - código máquina - - macOS - - compilador - - código máquina - - Linux - Compilar de novo - para cada sistema - diff --git a/web/lessons/bilder/pt/l20-jvm.svg b/web/lessons/bilder/pt/l20-jvm.svg deleted file mode 100644 index 87866b70..00000000 --- a/web/lessons/bilder/pt/l20-jvm.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Tabuada.java - código-fonte, para pessoas - - Tabuada.class - bytecode: CA FE BA BE … - - - - - - - compilador javac - - JVM - - Windows - - JVM - - macOS - - JVM - - Linux - Escrever uma vez, - executar em qualquer lado - diff --git a/web/lessons/bilder/pt/mvc-klick.svg b/web/lessons/bilder/pt/mvc-klick.svg deleted file mode 100644 index 08d276a8..00000000 --- a/web/lessons/bilder/pt/mvc-klick.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - View - o visor - - Controller - o ouvinte - - Model - Contador - - 0 - 1 - 2 - 3 - - +1 - - valor = 0 - valor = 1 - valor = 2 - valor = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 aumentar() - 2 aumentar() - - - 3 getValor() - 3 getValor() - - - 4 atualizar(valor) - 4 atualizar(valor) - - O model não conhece nem a view nem o controller. - diff --git a/web/lessons/bilder/pt/schiffe-versenken.svg b/web/lessons/bilder/pt/schiffe-versenken.svg deleted file mode 100644 index 8aeefaab..00000000 --- a/web/lessons/bilder/pt/schiffe-versenken.svg +++ /dev/null @@ -1,55 +0,0 @@ - - -A -0 -B -1 -C -2 -D -3 -E -4 -1 -0 - - - - - -2 -1 - - - - - -3 -2 - - - - - -4 -3 - - - - - -5 -4 - - - - - - - - - - - -Índice - diff --git a/web/lessons/bilder/pt/ss-binaere-suche.svg b/web/lessons/bilder/pt/ss-binaere-suche.svg deleted file mode 100644 index 8caadd8c..00000000 --- a/web/lessons/bilder/pt/ss-binaere-suche.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Procura-se o 27. As cartas estão ordenadas. -1.º meio: 13 < 27, a esquerda sai -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2.º meio: 21 < 27, a esquerda sai -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3.º meio: encontrado após 3 comparações -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/web/lessons/bilder/pt/ss-bubblesort.svg b/web/lessons/bilder/pt/ss-bubblesort.svg deleted file mode 100644 index 9b13f206..00000000 --- a/web/lessons/bilder/pt/ss-bubblesort.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -Uma ronda: comparar vizinhos -7♥ -3♠ -10♦ -5♣ -2♥ -Início -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: trocar -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: certo -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: trocar -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: trocar -A carta maior sobe para a direita como uma bolha. - diff --git a/web/lessons/bilder/pt/ss-lineare-suche.svg b/web/lessons/bilder/pt/ss-lineare-suche.svg deleted file mode 100644 index 02ac3cd4..00000000 --- a/web/lessons/bilder/pt/ss-lineare-suche.svg +++ /dev/null @@ -1,23 +0,0 @@ - - -Procura-se o 9. As cartas estão baralhadas. -7♥ -✗ -1. -3♠ -✗ -2. -10♦ -✗ -3. -5♣ -✗ -4. -9♠ -✓ -5. - - - -Virar da esquerda para a direita:Após 5 comparações, o 9 é encontrado. - diff --git a/web/lessons/bilder/pt/ss-vergleiche.svg b/web/lessons/bilder/pt/ss-vergleiche.svg deleted file mode 100644 index 672279b3..00000000 --- a/web/lessons/bilder/pt/ss-vergleiche.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Comparações no pior caso -Pesquisa linearPesquisa binária -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Número de cartas -Comparações - - -100comparações -7 comparações - diff --git a/web/lessons/bilder/pt/uebergabe.svg b/web/lessons/bilder/pt/uebergabe.svg deleted file mode 100644 index 2fd20235..00000000 --- a/web/lessons/bilder/pt/uebergabe.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - -Passagem por valor: uma cópia - -Programa principal -numero - -5 - -duplicar -x - -5 10 - -cópia -x passa a 10, mas numero fica 5. -Como uma fotocópia: escrever na cópia -não altera o original. - -Passagem por referência: o mesmo array - -Programa principal -fila - - -limpar -lugares - - - - - - - -false -false -false -false -Só há um array. O que limpar altera através de lugares, -o programa principal vê em fila. - diff --git a/web/lessons/bilder/pt/zk-zeichen.svg b/web/lessons/bilder/pt/zk-zeichen.svg deleted file mode 100644 index eac69023..00000000 --- a/web/lessons/bilder/pt/zk-zeichen.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -String palavra = "Passatempo" -0 -P -1 -a -2 -s -3 -s -4 -a -5 -t -6 -e -7 -m -8 -p -9 -o -substring(0, 5) -→ "Passa" -substring(5) -→ "tempo" -charAt(0) → 'P'length() → 10 -indexOf("tempo") → 5 -O fim de substring não está incluído. - diff --git a/web/lessons/bilder/schiffe-versenken.svg b/web/lessons/bilder/schiffe-versenken.svg deleted file mode 100644 index 289e2fd5..00000000 --- a/web/lessons/bilder/schiffe-versenken.svg +++ /dev/null @@ -1,55 +0,0 @@ - - -A -0 -B -1 -C -2 -D -3 -E -4 -1 -0 - - - - - -2 -1 - - - - - -3 -2 - - - - - -4 -3 - - - - - -5 -4 - - - - - - - - - - - -Index - diff --git a/web/lessons/bilder/ss-binaere-suche.svg b/web/lessons/bilder/ss-binaere-suche.svg deleted file mode 100644 index c05c4a47..00000000 --- a/web/lessons/bilder/ss-binaere-suche.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Gesucht: die 27. Die Karten sind sortiert. -1. Mitte: 13 < 27, links fällt weg -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2. Mitte: 21 < 27, links fällt weg -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3. Mitte: gefunden nach 3 Vergleichen -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/web/lessons/bilder/ss-bubblesort.svg b/web/lessons/bilder/ss-bubblesort.svg deleted file mode 100644 index 6c47eef5..00000000 --- a/web/lessons/bilder/ss-bubblesort.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -Ein Durchgang: Nachbarn vergleichen -7♥ -3♠ -10♦ -5♣ -2♥ -Start -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: tauschen -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: passt -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: tauschen -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: tauschen -Die größte Karte steigt wie eine Blase nach rechts. - diff --git a/web/lessons/bilder/ss-lineare-suche.svg b/web/lessons/bilder/ss-lineare-suche.svg deleted file mode 100644 index edc27702..00000000 --- a/web/lessons/bilder/ss-lineare-suche.svg +++ /dev/null @@ -1,23 +0,0 @@ - - -Gesucht: die 9. Die Karten sind gemischt. -7♥ -✗ -1. -3♠ -✗ -2. -10♦ -✗ -3. -5♣ -✗ -4. -9♠ -✓ -5. - - - -Von links nach rechts umdrehen:Nach 5 Vergleichen ist die 9 gefunden. - diff --git a/web/lessons/bilder/ss-vergleiche.svg b/web/lessons/bilder/ss-vergleiche.svg deleted file mode 100644 index 1cf631a0..00000000 --- a/web/lessons/bilder/ss-vergleiche.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Vergleiche im schlimmsten Fall -Lineare SucheBinäre Suche -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Anzahl der Karten -Vergleiche - - -100 Vergleiche -7 Vergleiche - diff --git a/web/lessons/bilder/uebergabe.svg b/web/lessons/bilder/uebergabe.svg deleted file mode 100644 index 7e5b81f5..00000000 --- a/web/lessons/bilder/uebergabe.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - -Wertübergabe: eine Kopie - -Hauptprogramm -zahl - -5 - -verdopple -x - -5 10 - -Kopie -x wird 10, aber zahl bleibt 5. -Wie bei einer Fotokopie: Wer auf der Kopie schreibt, -ändert das Original nicht. - -Referenzübergabe: dasselbe Array - -Hauptprogramm -reihe - - -leeren -plaetze - - - - - - - -false -false -false -false -Es gibt nur ein Array. Was leeren über plaetze ändert, -sieht das Hauptprogramm unter reihe. - diff --git a/web/lessons/bilder/zk-zeichen.svg b/web/lessons/bilder/zk-zeichen.svg deleted file mode 100644 index 030e9d81..00000000 --- a/web/lessons/bilder/zk-zeichen.svg +++ /dev/null @@ -1,27 +0,0 @@ - - -String wort = "Geißbock" -0 -G -1 -e -2 -i -3 -ß -4 -b -5 -o -6 -c -7 -k -substring(0, 4) -→ "Geiß" -substring(4) -→ "bock" -charAt(0) → 'G'length() → 8 -indexOf("bock") → 4 -Das Ende von substring gehört nicht dazu. - diff --git a/web/lessons/de/01-was-ist-ein-struktogramm.md b/web/lessons/de/01-was-ist-ein-struktogramm.md deleted file mode 100644 index ccaf69d1..00000000 --- a/web/lessons/de/01-was-ist-ein-struktogramm.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -titel: Was ist ein Struktogramm? -bereich: Erste Schritte -kurz: Algorithmen als Folge klarer Schritte darstellen und lesen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Algorithmus ist -- ein Struktogramm lesen -- die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen -::: - -## Ein Algorithmus ist eine genaue Anleitung - -Ein **Algorithmus** beschreibt Schritt für Schritt, wie man eine Aufgabe löst. Jeder Schritt muss so eindeutig sein, dass ihn jemand ohne Nachfragen ausführen kann, ein Mensch genauso wie ein Computer. - -Du kennst Algorithmen aus dem Alltag: ein Kochrezept, eine Wegbeschreibung oder die Anleitung für einen Schrank. - -::: diagramm l1-tee.visustruct -Tee kochen als Struktogramm: Jeder Kasten ist ein Schritt. -::: - -::: angeberwissen -Määäh, wer hat das erste Programm geschrieben? Eine Frau, und zwar schon 1843, lange vor dem ersten Computer! **Ada Lovelace** beschrieb Schritt für Schritt, wie die *Analytical Engine* (Analytische Maschine) von Charles Babbage die sogenannten Bernoulli-Zahlen ausrechnen sollte. Das war ein echter Algorithmus für eine Maschine. Die Befehle sollten auf Lochkarten stehen (mehr dazu in Lektion 3). Gebaut wurde die Maschine allerdings nie. - -Ada hatte noch eine geniale Idee: Eine solche Maschine kann mehr als rechnen. Sie könnte auch mit Buchstaben, Zeichen oder sogar Musik arbeiten. Genau das machen Computer heute. Ihr zu Ehren heißt eine Programmiersprache **Ada**. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), Mathematikerin (Bild: Aquarell von Alfred Edward Chalon, um 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), gemeinfrei). -::: - -## So liest du ein Struktogramm - -Ein Struktogramm wird **von oben nach unten** gelesen. Jeder Kasten ist ein Schritt. Erst wenn ein Schritt fertig ist, kommt der nächste dran. - -Die Darstellung stammt von **Isaac Nassi und Ben Shneiderman** (1973). Deshalb heißt sie auch Nassi-Shneiderman-Diagramm. In Deutschland ist sie als DIN 66261 genormt. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -Links Isaac „Ike“ Nassi (Foto: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/deed.de), zugeschnitten), rechts Ben Shneiderman (Foto: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> Ein Struktogramm hat immer genau einen Anfang (oben) und ein Ende (unten). Es gibt keine Pfeile und keine Sprünge kreuz und quer. Programme, die kreuz und quer springen, nennt man **Spaghetticode**, weil sich ihr Ablauf verheddert wie Nudeln auf dem Teller. Mehr dazu in der nächsten Lektion. - -::: angeberwissen -Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der Stony Brook University bei New York, Shneiderman etwa 25 und Nassi etwa 23. Also quasi zwei Studis, die nebenbei Informatikgeschichte geschrieben haben. -::: - -## Baustein 1: Die Sequenz - -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: **Sequenz**, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen: [Anweisungen]{.gelb} sind gelb, Verzweigungen blau, Schleifen rosa. Die Sequenz hat keine eigene Farbe, sie ist einfach die Reihe von Anweisungen untereinander. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. - -Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. - -So sieht sie aus: - -- Jede Anweisung ist ein **einfaches Rechteck**. -- Die Rechtecke stehen ohne Lücke **untereinander**. -- Ausgeführt wird von oben nach unten, eine Anweisung nach der anderen. - -::: diagramm l1-sequenz.visustruct -Vier Anweisungen als Sequenz. Erst wird aufgestanden, dann Zähne geputzt und so weiter. -::: - -> Auch das Tee-Beispiel von oben ist eine Sequenz. - -::: angeberwissen -15 Minuten! So lange hat Shneiderman für die erste Skizze mit Sequenz, Verzweigung und Schleife gebraucht. Ich brauche länger, um mich zwischen Heu und Klee zu entscheiden. -::: - -## Baustein 2: Die Verzweigung - -Oft hängt der nächste Schritt von einer **Bedingung** ab. Eine Bedingung ist eine Frage, die man nur mit **ja oder nein** beantworten kann, zum Beispiel *Regnet es?* In VisuStruct heißt ja **true** (wahr) und nein **false** (falsch). - -Für solche Entscheidungen gibt es die **Verzweigung**. So sieht sie aus: - -- Oben steht die Bedingung in einem **Dreieck**. -- Darunter teilt sich der Kasten in **zwei Spalten**: links der Weg für **true**, rechts der Weg für **false**. -- Es wird **immer nur einer** der beiden Wege ausgeführt. Danach geht es unter der Verzweigung für beide gemeinsam weiter. - -::: diagramm l1-verzweigung.visustruct -Regnet es, wird der linke Weg ausgeführt, sonst der rechte. Danach geht es in beiden Fällen mit „Losgehen“ weiter. -::: - -> Soll in einem Fall nichts passieren, bleibt dieser Weg leer. Das zeigt das Zeichen **ø**. - -::: angeberwissen -Rechtschreib-Alarm! Es heißt Shneiderman, ohne c. Wer „Schneiderman“ schreibt, bekommt von mir einen sanften Hornstupser. Er selbst weist übrigens darauf hin, dass ihm ständig ein c untergeschmuggelt wird. -::: - -## Baustein 3: Die Wiederholung - -Soll etwas **mehrmals** passieren, schreibt man es nicht mehrmals hin. Stattdessen benutzt man eine **Wiederholung**, auch **Schleife** genannt. - -So sieht sie aus: - -- Oben steht die Bedingung, zum Beispiel *Teller nicht leer*. -- Die Schritte, die wiederholt werden, stehen **eingerückt** darunter. Oben und links bildet der Kasten ein **gekipptes L** um sie. -- Vor jedem Durchlauf wird die Bedingung geprüft. Solange sie **true** ist, werden die Schritte im gekippten L noch einmal ausgeführt. Ist sie **false**, geht es unter der Schleife weiter. - -::: diagramm l1-wiederholung.visustruct -Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Teller abgeräumt. -::: - -> Es gibt noch weitere Arten von Schleifen. Du lernst sie in späteren Lektionen kennen. - -## Alle drei zusammen - -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine Sequenz von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen [Anweisungen]{.gelb}. Auch die Anweisungen in einer Verzweigung oder Schleife sind gelb. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. - -::: diagramm l1-grundbausteine.visustruct -Die Verzweigung erkennst du am Dreieck, die Schleife am gekippten L. Alles zusammen steht in einer Sequenz. -::: - -Die Kästen können auch **ineinander geschachtelt** werden: In einer Schleife oder einem Zweig können wieder Sequenzen, Verzweigungen und Schleifen stehen. - -::: angeberwissen -Trostpflaster für alle mit einer verpatzten Arbeit: Die berühmte Fachzeitschrift *Communications of the ACM* hat den Struktogramm-Artikel abgelehnt. Laut Nassi meinte der Gutachter sogar, sie sollten alle Exemplare einsammeln und verbrennen. Autsch! Er erschien 1973 dann in einem kleineren Heft und wird heute tausendfach zitiert. Ätsch! -::: - -## Erst die Struktur, dann der Code - -Beim Programmieren passieren zwei Dinge gleichzeitig: Du musst dir den Ablauf überlegen und die Schreibweise der Programmiersprache beachten. Mit einem Struktogramm trennst du beides. - -1. Du denkst zuerst über die **Logik** nach: Welche Schritte, welche Bedingungen, welche Wiederholungen? -2. Danach übersetzt du die fertige Struktur in **Java, Python oder JavaScript**. VisuStruct kann dir den Code sogar erzeugen. - -Mit der **Simulation** kannst du dein Struktogramm außerdem Schritt für Schritt ausführen und prüfen, ob es wirklich tut, was es soll. - -## Spiel: Welcher Baustein? - -::: spiel frage -titel: Spiel: Welcher Baustein? -intro: Ludwig beschreibt Dinge aus seinem Alltag. Welcher der drei Bausteine steckt darin? Acht Runden. -antworten: Sequenz | Verzweigung | Wiederholung - -runde: -frage: „Zahnpasta auf die Bürste, Zähne putzen, Mund ausspülen.“ -richtig: Sequenz -> Drei Schritte, jeder genau einmal und immer in dieser Reihenfolge. - -runde: -frage: „Wenn es regnet, nimm den Schirm mit, sonst die Sonnenbrille.“ -richtig: Verzweigung -> Eine Bedingung entscheidet, welcher der zwei Wege genommen wird. - -runde: -frage: „Rühre, bis der Teig glatt ist.“ -richtig: Wiederholung -> Das Rühren wird wiederholt, solange der Teig noch nicht glatt ist. - -runde: -frage: „Laufe zehn Runden um den Sportplatz.“ -richtig: Wiederholung -> Dieselbe Runde wird zehnmal gelaufen. - -runde: -frage: „Schuhe an, Jacke an, Tür auf, losgehen.“ -richtig: Sequenz -> Ein Schritt nach dem anderen, nichts wird übersprungen oder wiederholt. - -runde: -frage: „Ist die Ampel grün, gehst du über die Straße.“ -richtig: Verzweigung -> Auch ohne „sonst“ ist es eine Verzweigung. Der Sonst-Zweig ist einfach leer. - -runde: -frage: „Würfle so lange, bis du eine Sechs hast.“ -richtig: Wiederholung -> Du weißt vorher nicht, wie oft. Gewürfelt wird, bis die Bedingung erfüllt ist. - -runde: -frage: „Sagt jemand ‚Herein‘, gehst du hinein. Sonst wartest du vor der Tür.“ -richtig: Verzweigung -> Die Antwort entscheidet zwischen zwei Wegen: hineingehen oder warten. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Algorithmus ist. → Ein Algorithmus ist eine genaue Anleitung -- Ich kann ein Struktogramm von oben nach unten lesen. → So liest du ein Struktogramm -- Ich kann die drei Grundbausteine Sequenz, Verzweigung und Wiederholung nennen. → Baustein 1: Die Sequenz -- Ich kann jeden Baustein im Struktogramm an seiner Form erkennen. → Alle drei zusammen -::: - -## Wissenstest - -::: quiz -? In welcher Richtung wird ein Struktogramm gelesen? -→ So liest du ein Struktogramm -- [ ] Von links nach rechts -- [x] Von oben nach unten -- [ ] Von unten nach oben -> Jeder Kasten ist ein Schritt, und die Schritte folgen von oben nach unten aufeinander. - -? Welcher Baustein gehört NICHT zu den drei Grundbausteinen? -→ Baustein 1: Die Sequenz -- [ ] Sequenz -- [ ] Verzweigung -- [x] Sprung -- [ ] Wiederholung -> Sprünge gibt es im Struktogramm nicht. Sequenz, Verzweigung und Wiederholung reichen für jeden Algorithmus. - -? Woran erkennst du im Struktogramm eine Verzweigung? -→ Alle drei zusammen -- [ ] An einem gekippten L -- [x] An einem Dreieck mit der Bedingung und zwei Spalten darunter -- [ ] An mehreren Rechtecken untereinander -> Das gekippte L gehört zur Schleife, Rechtecke untereinander sind eine Sequenz. - -? Wann wird der Inhalt einer Schleife noch einmal ausgeführt? -→ Alle drei zusammen -- [x] Solange die Bedingung true ist -- [ ] Nur, wenn die Bedingung false ist -- [ ] Immer genau zweimal -> Vor jedem Durchlauf wird die Bedingung geprüft. Ist sie false, geht es unter der Schleife weiter. - -? Was ist ein Algorithmus? -→ Ein Algorithmus ist eine genaue Anleitung -- [x] Eine eindeutige Schritt-für-Schritt-Anleitung zum Lösen einer Aufgabe -- [ ] Ein bestimmtes Programm in Java -- [ ] Ein Bild, das ein Programm erklärt -> Ein Algorithmus ist unabhängig von der Programmiersprache. Ein Struktogramm ist eine Möglichkeit, ihn aufzuschreiben. -::: diff --git a/web/lessons/de/01-weitere-darstellungen.md b/web/lessons/de/01-weitere-darstellungen.md deleted file mode 100644 index 950d0286..00000000 --- a/web/lessons/de/01-weitere-darstellungen.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: PAP und Pseudocode -bereich: Erste Schritte -kurz: Algorithmen als Programmablaufplan und als Pseudocode darstellen und mit dem Struktogramm vergleichen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen PAP (englisch *flowchart*) lesen und selbst zusammenbauen -- erklären, warum Sprünge im PAP zu Fehlern führen -- einen einfachen Algorithmus als Pseudocode lesen -::: - -## Andere Darstellungen: Der PAP - -Es gibt noch zwei weitere Arten, Algorithmen darzustellen: den **Programmablaufplan**, kurz **PAP**, und den **Pseudocode**. Beide wirst du im Unterricht treffen. Auf Englisch heißt der PAP **flowchart**, auf Deutsch auch Flussdiagramm. Das englische Wort begegnet dir oft, zum Beispiel in Programmen und im Internet. - -Hier siehst du noch einmal unser Struktogramm zum Teetrinken aus der letzten Lektion. Als Nächstes schauen wir uns den PAP an, und zwar mit demselben Beispiel. - -::: diagramm l1-grundbausteine.visustruct -Das Tee-Beispiel als Struktogramm: erst die Tasse, dann die Verzweigung für den Zucker, dann die Schleife. -::: - -### Derselbe Algorithmus als PAP - -::: grafik l01-pap.svg -Das Tee-Beispiel als Programmablaufplan. Der Pfeil von „1 Minute warten“ zurück nach oben bildet die Schleife. -::: - -### Die Elemente - -Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. - -- **Oval:** Start oder Ende. Jeder PAP hat genau einen Start und ein Ende. -- **Rechteck:** eine Anweisung, zum Beispiel *Tasse auf den Tisch stellen*. -- **Raute:** eine Verzweigung. In der Raute steht eine Frage, heraus führen zwei Pfeile: **ja** und **nein**. -- **Parallelogramm:** eine Ein- oder Ausgabe. Im Tee-Beispiel kommt sie nicht vor. -- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. - -Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie daran, dass ein Pfeil **zurück nach oben** führt. - -### Die Vorteile - -- **Sehr gut lesbar**, auch für Leute, die noch nie einen PAP gesehen haben. Man folgt einfach den Pfeilen mit dem Finger. -- Flussdiagramme benutzt man nicht nur beim Programmieren, sondern überall, wo ein Ablauf erklärt wird: in Bedienungsanleitungen, bei der Fehlersuche („Leuchtet die Lampe? Nein: Steckt der Stecker?“) oder in Firmen für Arbeitsabläufe. - -## Übung: Kuchen backen als PAP - -Jetzt baust du selbst einen PAP. Ludwig backt einen Kuchen und geht so vor: - -Er gibt die Zutaten in die Schüssel und rührt den Teig. Ist der Teig noch nicht glatt, rührt er weiter. Ist er glatt, füllt er den Teig in die Form und backt den Kuchen 30 Minuten. Dann prüft er mit einem Holzstäbchen: Klebt noch Teig daran, backt er 5 Minuten weiter und prüft noch einmal. Ist das Stäbchen sauber, nimmt er den Kuchen heraus und ruft: „Der Kuchen ist fertig!“ - -::: pap -titel: Übung: Kuchen backen als PAP -auftrag: Die Plätze im Plan sind leer. Lege jedes Element an seinen Platz. Die Form des Platzes hilft dir. -start: Start -anweisung: Zutaten in die Schüssel geben -anweisung: Teig rühren -frage: Teig glatt? | nein -> Teig rühren -anweisung: Teig in die Form füllen -anweisung: Kuchen 30 Minuten backen -frage: Stäbchen sauber? | nein: 5 Minuten weiterbacken -anweisung: Kuchen herausnehmen -ausgabe: „Der Kuchen ist fertig!“ -ende: Ende -erklärung: Zwei Schleifen, zwei Pfeile zurück nach oben: Beim Rühren führt der Pfeil zurück zu „Teig rühren“, beim Backen von „5 Minuten weiterbacken“ zurück zur Frage. Die Ausgabe steht im Parallelogramm. -legende: ja -::: - -**Eigene PAPs zeichnen:** Mit **VisuFlow** zeichnest du deinen PAP ganz leicht selbst. Die Symbole liegen fertig in einer Leiste: Antippen hängt das nächste Symbol an und verbindet es gleich mit einem Pfeil. Zum Start kannst du das Tee-Beispiel laden. Deinen PAP speicherst du als Datei und exportierst ihn als Bild oder PDF, zum Beispiel für dein Heft oder eine Präsentation. [VisuFlow öffnen](https://visustruct.visucode.de/app/?visuflow) - -## Nachteile des PAP: Sprünge - -Ein Pfeil im PAP darf von jedem Symbol zu jedem anderen führen. Das klingt praktisch, ist aber gefährlich. - -Früher hat man Programme genau so geschrieben. Jede Zeile hatte eine **Nummer**, und der Befehl **GOTO**, auf Deutsch „gehe zu“, sprang zu einer Zeilennummer. Jedes GEHE ZU ist ein Pfeil aus dem PAP. Unser Tee-Beispiel sähe so aus: - -``` -10 Tasse auf den Tisch stellen -20 WENN kein Zucker gewünscht, GEHE ZU 40 -30 Zucker hineingeben -40 WENN Tee nicht zu heiß, GEHE ZU 70 -50 1 Minute warten -60 GEHE ZU 40 -70 Tee trinken -``` - -### Eine Zeile mehr, und schon springt es falsch - -Jetzt verbesserst du den Algorithmus: Nach dem Zucker soll der Teebeutel heraus. Du fügst die neue Zeile 40 ein, und alle Zeilen darunter rutschen eine Nummer weiter. Die Sprünge zeigen aber noch auf die alten Nummern: - -``` -10 Tasse auf den Tisch stellen -20 WENN kein Zucker gewünscht, GEHE ZU 40 -30 Zucker hineingeben -40 Teebeutel herausnehmen -50 WENN Tee nicht zu heiß, GEHE ZU 70 -60 1 Minute warten -70 GEHE ZU 40 -80 Tee trinken -``` - -Spiel es durch: Zeile 70 schickt dich nicht mehr zur Prüfung in Zeile 50, sondern zum Teebeutel. Und wenn der Tee kühl genug ist, springt Zeile 50 zu Zeile 70 und nicht mehr zu *Tee trinken*. Du nimmst also immer wieder den Teebeutel heraus und trinkst nie. Bei jeder Änderung musst du jedes GEHE ZU prüfen. In einem großen Programm mit Hunderten Sprüngen geht dabei leicht etwas schief. - -### Kreuz und quer: Spaghetticode - -Mit Pfeilen kann man auch mitten aus einer Schleife herausspringen oder von außen mitten in eine Schleife hinein. Solche **Aussprünge** und Einsprünge machen den Plan schnell unübersichtlich. Bei vielen Sprüngen kreuzen sich die Pfeile, bis der Plan aussieht wie ein Teller Spaghetti. Deshalb nennt man das **Spaghetticode**. Den Ablauf kann man kaum noch verfolgen, und Fehler verstecken sich gut. - -Im Struktogramm gibt es keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit, und kein Sprung kann auf die falsche Stelle zeigen. Für das vorzeitige Verlassen einer Schleife gibt es dort einen eigenen, ordentlichen Kasten, den Aussprung. Den lernst du in Lektion 18 kennen. - -::: angeberwissen -1968 schrieb der Informatiker Edsger Dijkstra einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist `goto` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. -::: - -## Pseudocode und Vergleich - -**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Sprünge gibt es auch hier nicht. Das ist unser Tee-Beispiel: - -``` -Tasse auf den Tisch stellen -WENN Zucker gewünscht DANN - Zucker hineingeben -ENDE WENN -SOLANGE Tee noch zu heiß - 1 Minute warten -ENDE SOLANGE -Tee trinken -``` - -Pseudocode hat **keine feste Schreibweise**. Manche schreiben FALLS statt WENN, andere setzen einen Pfeil für die Zuweisung (`zahl ← 5`) oder schreiben ganz ohne ENDE-Zeilen. Das ist alles erlaubt. Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. Pseudocode ist also keine weitere Programmiersprache, die man lernen muss. - -::: angeberwissen -Kommt dir Pseudocode bekannt vor? Die Programmiersprache Python sieht ihm sehr ähnlich, und das ist Absicht: Ihr Erfinder Guido van Rossum wollte, dass sich Programme fast wie normaler Text lesen. Auch Python zeigt mit der Einrückung, was zusammengehört. Aber Vorsicht: Python ist eine echte Programmiersprache mit festen Regeln. Ein Leerzeichen zu viel, und der Computer meckert. Pseudocode ist da großzügiger, so wie ich beim Frühstück. -::: - -### Im Vergleich - -- **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick, wilde Sprünge sind unmöglich. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich, und Sprünge kreuz und quer sind möglich. -- **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen SOLANGE und ENDE SOLANGE. Schnell geschrieben und schon nah am Programmcode. - -> Alle drei beschreiben denselben Algorithmus. Wenn du eine Form lesen kannst, lernst du die anderen schnell. - -::: angeberwissen -Nassi und Shneiderman wollten den Pfeilen an den Kragen! Ihr Artikel von 1973 hieß „Flowchart Techniques for Structured Programming“. Flowchart ist das englische Wort für Ablaufplan. Mit Pfeilen kann man nämlich kreuz und quer springen, bis der Plan aussieht wie ein Teller Spaghetti. Im Struktogramm geht das gar nicht. Mäh, so mag ich das: ordentlich, wie mein Stall. -::: - -## Spiel: Welche Darstellung? - -::: spiel frage -titel: Spiel: Welche Darstellung? -intro: Ludwig beschreibt eine Darstellung, ohne ihren Namen zu verraten. Ist es das Struktogramm, der PAP oder der Pseudocode? Acht Runden. -antworten: Struktogramm | PAP | Pseudocode - -runde: -frage: „Bei mir zeigt ein Pfeil zurück nach oben, wenn etwas wiederholt wird.“ -richtig: PAP -> Im PAP hat die Schleife kein eigenes Symbol. Ein Pfeil führt zurück nach oben. - -runde: -frage: „Meine Schleife sieht aus wie ein gekipptes L.“ -richtig: Struktogramm -> Oben und links umschließt der Kasten die Schritte, die wiederholt werden. - -runde: -frage: „Ich bestehe aus Wörtern wie WENN und SOLANGE, und die Einrückung zeigt, was dazugehört.“ -richtig: Pseudocode -> Pseudocode ist Text in normaler Sprache, der wie ein Programm aufgebaut ist. - -runde: -frage: „Meine Verzweigung ist eine Raute mit den Ausgängen ja und nein.“ -richtig: PAP -> Im Struktogramm steht die Bedingung dagegen in einem Dreieck. - -runde: -frage: „Bei mir können sich die Pfeile kreuz und quer verheddern wie Spaghetti.“ -richtig: PAP -> Weil Pfeile überallhin führen dürfen, ist im PAP Spaghetticode möglich. - -runde: -frage: „Ich habe keine feste Schreibweise. FALLS statt WENN ist bei mir auch erlaubt.“ -richtig: Pseudocode -> Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. - -runde: -frage: „Die Bedingung steht oben in einem Dreieck, darunter teile ich mich in zwei Spalten.“ -richtig: Struktogramm -> So sieht die Verzweigung im Struktogramm aus: links true, rechts false. - -runde: -frage: „Fügst du einen Kasten ein, rutscht alles darunter einfach mit. Kein Sprung kann danebengehen.“ -richtig: Struktogramm -> Im Struktogramm gibt es keine Pfeile und keine Sprünge, deshalb kann nichts auf die falsche Stelle zeigen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Elemente eines PAP benennen und einen einfachen PAP lesen. → Andere Darstellungen: Der PAP -- Ich kann einen einfachen Algorithmus selbst als PAP zusammenbauen. → Übung: Kuchen backen als PAP -- Ich kann erklären, warum Sprünge mit GOTO zu Fehlern und Spaghetticode führen. → Nachteile des PAP: Sprünge -- Ich kann einen einfachen Algorithmus als Pseudocode lesen. → Pseudocode und Vergleich -::: - -## Wissenstest - -::: quiz -? Woran erkennst du in einem Programmablaufplan (PAP) eine Schleife? -→ Andere Darstellungen: Der PAP -- [ ] An einem gekippten L -- [x] An einem Pfeil, der zurück nach oben führt -- [ ] Am Wort SOLANGE -> Das gekippte L gehört zum Struktogramm, SOLANGE zum Pseudocode. - -? Ordne jedem Symbol im PAP seine Bedeutung zu. -→ Andere Darstellungen: Der PAP -= Oval -> Start oder Ende -= Rechteck -> Anweisung -= Raute -> Verzweigung -= Parallelogramm -> Ein- oder Ausgabe -> Die Raute hat zwei Ausgänge: ja und nein. - -? Wie heißt der Programmablaufplan auf Englisch? -→ Andere Darstellungen: Der PAP -- [x] Flowchart -- [ ] Structure chart -- [ ] Pseudocode -> Auf Deutsch sagt man auch Flussdiagramm. Structure chart ist das Struktogramm. - -? Du fügst in ein Programm mit GOTO eine neue Zeile ein. Was kann passieren? -→ Nachteile des PAP: Sprünge -- [x] Die Sprünge zeigen auf die falschen Zeilen, weil sich die Nummern verschoben haben -- [ ] Nichts, die Sprünge passen sich von selbst an -- [ ] Das Programm wird automatisch schneller -> Jedes GEHE ZU zeigt auf eine feste Zeilennummer. Rutschen die Zeilen weiter, springt das Programm an die falsche Stelle. - -? Was zeigt im Pseudocode, welche Zeilen zu einer Schleife gehören? -→ Pseudocode und Vergleich -- [ ] Die Farbe -- [x] Die Einrückung und das ENDE SOLANGE -- [ ] Ein Pfeil -> Alles zwischen SOLANGE und ENDE SOLANGE ist eingerückt und wird wiederholt. -::: diff --git a/web/lessons/de/02-der-editor.md b/web/lessons/de/02-der-editor.md deleted file mode 100644 index b0980a0d..00000000 --- a/web/lessons/de/02-der-editor.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -titel: Der Editor -bereich: Erste Schritte -kurz: Elemente einfügen, Text eingeben, verschieben und löschen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Element aus dem Bereich Elemente einfügen und einen Platzhalter ersetzen -- den Text eines Kastens ändern und zwischen Anweisung, Eingabe und Ausgabe umschalten -- Kästen verschieben, kopieren, löschen und Schritte rückgängig machen -::: - -## Die Oberfläche - -VisuStruct hat zwei Editoren: den [Struktogramm-Editor](#zeige-editor), um den es in dieser Lektion geht, und rechts den Bereich [Code](#zeige-codelive) für Java-Code (ab Lektion 4). Ist der Struktogramm-Editor eingeklappt, öffnet ihn diese Lektion von selbst. Die blauen Wörter zeigen dir die Bereiche, auch wenn sie gerade eingeklappt sind: Fährst du mit der Maus darüber, öffnet sich der Bereich neben dem Lernbereich und leuchtet auf. Klickst du darauf (oder tippst es an), bleibt er offen. - -Der Struktogramm-Editor besteht aus mehreren Bereichen. Fahre mit der Maus über ein blaues Wort oder tippe es an, dann leuchtet der Bereich im Editor auf, eingeklappte Bereiche wie die Elemente öffnen sich dabei. - -- **Ganz oben die [Leiste](#zeige-leiste):** Neu, Öffnen und Speichern. Ganz rechts das Zahnrad für die [Einstellungen](#zeige-einstellungen): Textgröße und Sprache. -- **Darunter die [Werkzeuge](#zeige-werkzeuge)** über den Elementen und dem Struktogramm: Rückgängig, Ausschneiden, Kopieren, Einfügen, Löschen, Exportieren, Code und Simulation. Die Knöpfe zeigen nur Symbole. Hältst du die Maus darüber, erscheint ihr Name. -- **Links die [Elemente](#zeige-elemente):** Hier liegen alle Bausteine, die du ins Struktogramm ziehen kannst. Manche nennen diesen Bereich auch Palette. -- **In der Mitte das [Struktogramm](#zeige-struktogramm):** Ein neues Diagramm enthält nur einen leeren Platzhalter, erkennbar an **ø**. -- **Unten der [Objektinspektor](#zeige-objektinspektor):** Hier bearbeitest du den Text des ausgewählten Elements. Ist er dir zu klein oder zu groß, ziehst du die Linie mit dem Griff darüber nach oben oder unten. - -> Diesen Lernbereich kannst du jederzeit mit dem [Seitenleisten-Symbol](#zeige-lernen) oben in diesem Bereich einklappen. Dann bleibt links nur die schmale Leiste „🎓 Lernen“, ein Klick darauf öffnet ihn wieder. Er bleibt neben dem Editor offen, damit du gleich ausprobieren kannst, was du liest. Genauso gibt es links die Spalte [📁 Dateien](#zeige-dateien) für deine gespeicherten Programme (Lektion 3) und rechts den Bereich [Code](#zeige-codelive) für Java (ab Lektion 4). - -## Ein Element einfügen - -Ziehe ein Element aus dem Bereich **Elemente** auf das Struktogramm. Beim Ziehen zeigt eine blaue Linie, wo es landet: - -- **Auf den Platzhalter ø:** Das Element ersetzt den Platzhalter. -- **Auf die obere Hälfte eines Kastens:** Das Element kommt davor. -- **Auf die untere Hälfte eines Kastens:** Das Element kommt dahinter. - -::: grafik l02-einfuegen.svg -Wohin du ziehst, entscheidet, wo das neue Element landet. -::: - -Es geht auch ohne Ziehen: **Klicke** auf ein Element im Bereich Elemente (oder tippe es an). Dann wird es hinter dem ausgewählten Kasten eingefügt. Ist der Platzhalter **ø** ausgewählt, ersetzt es ihn. - -Mit der Tastatur springst du mit der **Tab**-Taste zu einem Element und drückst **Enter**. Das neue Element landet dann ebenfalls hinter dem ausgewählten Kasten. - -::: angeberwissen -Kästen packen und herumziehen, so wie du gerade, hat einen schicken Namen: **direkte Manipulation**. Den Begriff hat 1982 Ben Shneiderman geprägt, genau, der vom Struktogramm. Der Mann war fleißiger als ich beim Grasen. -::: - -## Text eingeben - -Klicke einen Kasten an. Er wird blau umrandet, und im Objektinspektor unter dem Diagramm erscheint sein Text. Was du dort tippst, siehst du sofort im Diagramm. - -Schneller geht es mit einem **Doppelklick** auf den Kasten, auf dem Tablet mit einem **Doppeltipp**. Dann tippst du den Text direkt im Struktogramm. **Enter** übernimmt ihn, **Esc** bricht ab. Mit der Tastatur wählst du den Kasten aus und drückst **Enter**. - -Der Kasten aus dem Bereich Elemente heißt **Anweisung**. Oben wählst du, welche Art von Anweisung er sein soll: - -- **Anweisung:** etwas berechnen oder festlegen, z. B. `int zahl = 5`. Wie das geht, lernst du in Lektion 4. -- **Eingabe:** beim Ausführen einen Wert abfragen. Das kommt in Lektion 6. -- **Ausgabe:** etwas anzeigen. Im Diagramm steht dann `output:` davor, z. B. `output: "Hallo"`. - -Für den Anfang brauchst du nur die Ausgabe. Texte, die genau so angezeigt werden sollen, schreibst du in **Anführungszeichen**. - -::: diagramm l2-ausgabe.visustruct -Zwei Ausgaben nacheinander. Öffne das Diagramm im Editor und starte die [Simulation](#zeige-simulation) in den Werkzeugen, um die Ausgabe zu sehen. Genauer lernst du sie in Lektion 7 kennen. -::: - -## Verschieben, kopieren, löschen - -- **Verschieben:** Einen vorhandenen Kasten mit der Maus an eine neue Stelle ziehen. -- **Kopieren und Einfügen:** Kasten auswählen, dann Strg+C und Strg+V (am Mac ⌘C und ⌘V). Die Kopie kommt hinter den ausgewählten Kasten. Ohne Tastatur, zum Beispiel auf dem Tablet, tippst du in den [Werkzeugen](#zeige-werkzeuge) auf **Kopieren** und **Einfügen**. -- **Löschen:** Kasten auswählen und Entf drücken oder in den Werkzeugen auf den [Mülleimer](#zeige-loeschen) „Auswahl löschen“ klicken. -- **Rückgängig:** Strg+Z macht den letzten Schritt rückgängig, Strg+Umschalt+Z stellt ihn wieder her (am Mac ⌘Z und ⌘⇧Z). Ohne Tastatur tippst du in den Werkzeugen auf [Rückgängig](#zeige-rueckgaengig). - -## Übung: Hallo Welt - -::: übung l2-hallo -titel: Hallo Welt -auftrag: Baue ein Struktogramm, das **Hallo Welt** ausgibt. -Ziehe eine **Anweisung** aus den Elementen auf den Platzhalter **ø** und klicke den Kasten an. Im Objektinspektor unter dem Struktogramm stehen oben drei Knöpfe: Anweisung, Eingabe und Ausgabe. Klicke auf **Ausgabe**. Schreibe dann in das Textfeld darunter `"Hallo Welt"`, mit Anführungszeichen. -test: - -> Hallo Welt -braucht: anweisung -tipp: Du brauchst nur einen einzigen Kasten. Der Text, der erscheinen soll, steht im Objektinspektor im Eingabefeld. -tipp: Achte auf die Anführungszeichen. Ohne sie sucht VisuStruct nach einer Variablen mit dem Namen Hallo. -lösung: l2-hallo-loesung.visustruct -::: - -Klicke auf **Prüfen**, wenn du fertig bist. VisuStruct führt dein Struktogramm aus und vergleicht die Ausgabe. - -## Übung: Zwei Zeilen - -::: übung l2-zwei-zeilen -titel: Zwei Zeilen -auftrag: Gib zuerst **Hallo** und danach **Ich lerne Struktogramme** aus, jeweils in einer eigenen Zeile. -test: - -> Hallo | Ich lerne Struktogramme -tipp: Zwei Zeilen heißt: zwei Ausgaben. Die Kästen stehen untereinander und werden von oben nach unten ausgeführt. -tipp: Jede Ausgabe ist ein eigener Kasten. Ziehe die zweite Anweisung auf die untere Hälfte der ersten. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Spiel: Editor-Profi - -::: spiel frage -titel: Spiel: Editor-Profi -intro: Ludwig testet, ob du den Editor im Griff hast. Sieben Runden. - -runde: -frage: Du ziehst eine Anweisung auf den Platzhalter **ø**. Was passiert? -- [x] Die Anweisung ersetzt den Platzhalter. -- Die Anweisung kommt hinter den Platzhalter. -- Nichts, auf ø darf man nichts ziehen. -> Der Platzhalter hält nur den Platz frei. Das neue Element nimmt ihn ein. - -runde: -frage: Du ziehst ein Element auf die **obere** Hälfte eines Kastens. Wo landet es? -- [x] davor -- dahinter -- Es ersetzt den Kasten. -> Obere Hälfte heißt davor, untere Hälfte heißt dahinter. Die blaue Linie zeigt es dir beim Ziehen. - -runde: -frage: Du ziehst ein Element auf die **untere** Hälfte eines Kastens. Wo landet es? -- davor -- [x] dahinter -- ganz am Ende des Struktogramms -> Untere Hälfte heißt: direkt hinter diesen Kasten. - -runde: -frage: Du hast aus Versehen einen Kasten gelöscht. Was holt ihn zurück? -- Strg+C / ⌘C -- [x] Strg+Z / ⌘Z -- Strg+V / ⌘V -> Strg+Z / ⌘Z macht den letzten Schritt rückgängig. Strg+C / ⌘C kopiert, Strg+V / ⌘V fügt ein. - -runde: -frage: Beim Ausführen soll genau **Hallo** erscheinen. Was steht im Kasten? -- [x] output: "Hallo" -- output: Hallo -- "Hallo" -> Text, der genau so angezeigt werden soll, steht in Anführungszeichen. Das `output:` setzt der Editor davor, wenn du die Art Ausgabe wählst. - -runde: -frage: Wo änderst du den Text des ausgewählten Kastens? -- in den Elementen -- [x] im Objektinspektor -- in der Leiste ganz oben -> Der Objektinspektor unter dem Diagramm zeigt den Text des ausgewählten Kastens. - -runde: -frage: Du klickst im Bereich Elemente auf ein Element, ohne zu ziehen. Wo landet es? -- [x] hinter dem ausgewählten Kasten -- ganz am Anfang -- ganz am Ende -> Ohne Ziehen (Klick oder Tab und Enter) kommt das neue Element hinter den Kasten, der gerade ausgewählt ist. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Element aus dem Bereich Elemente einfügen und einen Platzhalter ersetzen. → Ein Element einfügen -- Ich kann den Text eines Kastens ändern und zwischen Anweisung, Eingabe und Ausgabe umschalten. → Text eingeben -- Ich kann Kästen verschieben, kopieren, löschen und Schritte rückgängig machen. → Verschieben, kopieren, löschen -::: - -## Wissenstest - -::: quiz -? Was bedeutet das Zeichen ø in einem Kasten? -→ Ein Element einfügen -- [ ] Der Kasten enthält einen Fehler. -- [x] Hier ist noch ein leerer Platzhalter. -- [ ] Das Programm endet hier. -> Ein Platzhalter wird ersetzt, wenn du ein Element darauf ziehst. - -? Du ziehst eine Anweisung auf die untere Hälfte eines Kastens. Wo landet sie? -→ Ein Element einfügen -- [ ] Davor -- [x] Dahinter -- [ ] Der Kasten wird ersetzt. - -? Wie gibst du den Text Guten Tag genau so aus? -→ Text eingeben -- [ ] output: Guten Tag -- [x] output: "Guten Tag" -- [ ] input: "Guten Tag" -> Ohne Anführungszeichen wird Guten Tag als Name einer Variablen verstanden. -::: diff --git a/web/lessons/de/03-speichern-oeffnen-exportieren.md b/web/lessons/de/03-speichern-oeffnen-exportieren.md deleted file mode 100644 index a7e15afe..00000000 --- a/web/lessons/de/03-speichern-oeffnen-exportieren.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -titel: Speichern, Öffnen, Exportieren -bereich: Erste Schritte -kurz: Dateien sichern, deinen Workspace nutzen, mehrere Diagramme öffnen und als Bild oder PDF weitergeben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einem Diagramm einen Titel geben -- ein Diagramm als .visustruct-Datei speichern und wieder öffnen -- ein Diagramm als Bild (PNG) oder PDF exportieren -- ein zweites Diagramm in einem neuen Reiter öffnen -- meinen Workspace `VisuStruct-Dateien` anlegen -- ein Programm in meinem Workspace speichern -::: - -## Die Datei .visustruct - -Struktogramme werden als **.visustruct**-Datei gespeichert. Dasselbe Format nutzen alle VisuStruct-Versionen: im Browser, auf Mac, iPad und iPhone und die Java-App am Rechner. Du kannst also in der Schule im Browser anfangen und zu Hause in der App weitermachen. - -::: angeberwissen -Zu Nassis Studienzeit gab es keine Dateien zum Speichern, sondern Lochkarten. Nassi erzählt, dass ein Date am Samstagabend so aussah: seine spätere Frau saß mit ihm im Rechenzentrum und stanzte seine Lochkarten. Romantik, Informatik-Style! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -So sah eine Lochkarte aus. Eine Karte war eine Zeile Programm, hier `PRINT *, 'HALLO WELT'` in der Sprache Fortran. Jede Spalte ist ein Zeichen, die Löcher darin sind sein Code. Ein ganzes Programm war ein Stapel solcher Karten. Fiel er herunter, musste man alles wieder sortieren. -::: - -::: angeberwissen -Ein Computerpionier aus unserer Gegend: **Konrad Zuse**. Am 12. Mai 1941 stellte er in Berlin die **Z3** vor, den ersten funktionsfähigen programmgesteuerten Digitalrechner der Welt. Sie rechnete schon im **Binärsystem**, also nur mit 0 und 1, mit rund 2000 Relais (elektrischen Schaltern). Ihr Programm stand nicht auf Lochkarten, sondern als Löcher in einem gebrauchten Kinofilm. Danach erfand Zuse den **Plankalkül**, eine der ersten Programmiersprachen überhaupt. Später lebte er bis zu seinem Tod 1995 in **Hünfeld** bei Fulda. Im Konrad-Zuse-Museum dort stehen Nachbauten der Z3. Mein Ausflugstipp für eure Klasse! Wann es offen hat, steht auf der Webseite der Stadt Hünfeld. -::: - -::: grafik l03-zuse-lochstreifen.svg -So ungefähr sah Zuses Programmstreifen aus: ein alter Kinofilm mit gestanzten Löchern. Jede Spalte ist ein Befehl aus 8 Stellen. Ein Loch heißt 1, kein Loch heißt 0. Die Maschine las den Streifen Befehl für Befehl. -::: - -## Speichern und Öffnen - -- **[Speichern](#zeige-speichern)** (Strg+S, am Mac ⌘S): Das Diagramm wird als Datei gespeichert. Ist die Spalte **Dateien** eingerichtet (siehe unten), landet es dort. Sonst fragt der Browser nach dem Ort oder legt die Datei in den Download-Ordner. -- **[Öffnen](#zeige-oeffnen)** (Strg+O, am Mac ⌘O): Eine gespeicherte Datei wieder laden. Du kannst eine Datei auch einfach ins Browserfenster ziehen. - -> Deine Übungen merkt sich der Browser automatisch. Das klappt aber nur in diesem Browser auf diesem Gerät. Wichtige Arbeiten solltest du deshalb immer zusätzlich als Datei speichern. - -## Die Spalte Dateien - -Links neben dem Lernbereich findest du die Spalte [📁 Dateien](#zeige-dateien). Dort sammelst du alle deine Programme an einem Ort, deinem **Workspace** (Arbeitsbereich). - -**Jetzt du:** Richte deinen Workspace jetzt gleich ein, bevor du weiterliest. Ab heute speicherst du alle deine Programme dort. - -1. Lege einen Workspace an: Öffne die Spalte und klicke auf **Ordner wählen**. Gehe im Fenster zu deinen **Dokumenten**, lege dort mit **Neuer Ordner** einen Ordner namens `VisuStruct-Dateien` an und wähle ihn aus. Erlaube VisuStruct, den Ordner zu benutzen. Das geht in Chrome und Edge. Auf dem iPad und in anderen Browsern klickst du stattdessen auf **Im Browser speichern**. -2. Speichere wie gewohnt. VisuStruct legt in deinem Workspace automatisch einen Ordner mit dem heutigen Datum an, zum Beispiel `2026-10-23`, und speichert das Programm darin. Der Dateiname kommt aus dem Titel. - -So sieht dein Workspace danach aus: - -```text -VisuStruct-Dateien ← Workspace -└── 2026-10-23 ← Tag - └── Fakultaet.visustruct -``` - -Ein Klick auf ein Programm in der Spalte öffnet es wieder. So findest du später jede Stunde schnell wieder. - -Auch dein **Lernstand** landet im Workspace: in der Datei `learnProgress.json` stehen deine erledigten Lektionen und Übungen. Öffnest du den Workspace in einem anderen Browser, ist dein Lernstand wieder da. - -> Warum ein echter Ordner? Dein Lernstand und deine Programme liegen dann als Dateien darin. Den Ordner kannst du mitnehmen, zum Beispiel auf einem USB-Stick oder in deinem Cloud-Ordner wie OneDrive. So machst du zu Hause an einem anderen Rechner genau da weiter, wo du aufgehört hast. Speicherst du nur im Browser, bleibt alles in diesem einen Browser auf diesem Gerät. Löscht jemand die Browserdaten, ist auch dein Lernstand weg. - -## Mehrere Diagramme in Reitern - -Über dem Struktogramm siehst du die [Reiter](#zeige-reiter). Mit **+** oder [Neu](#zeige-neu) öffnest du ein weiteres, leeres Diagramm. Ein Punkt • vor dem Namen zeigt, dass es ungespeicherte Änderungen gibt. - -Den [Titel](#zeige-titel) eines Diagramms trägst du in das Feld über dem Struktogramm ein. Er erscheint auch beim Exportieren und wird als Dateiname vorgeschlagen. - -## Weitergeben: Bild, PDF oder Datei - -Über [Exportieren](#zeige-exportieren) bei den Werkzeugen (Symbol mit Pfeil nach oben) gibst du dein Struktogramm weiter: - -- **Bild (PNG):** zum Einfügen in ein Arbeitsblatt oder eine Präsentation -- **Vektorgrafik (SVG):** bleibt in jeder Größe scharf -- **PDF (A4):** eine Seite zum Abgeben oder Ausdrucken -- **VisuStruct-Datei (.visustruct):** zum Weitergeben an jemanden, der dein Struktogramm in VisuStruct öffnen und weiterbearbeiten soll, zum Beispiel per Mail oder über die Lernplattform -- **Drucken** (Strg+P, am Mac ⌘P): direkt auf den Drucker - -Unter dem [Zahnrad](#zeige-textgroesse) oben rechts stellst du bei Textgröße die Schriftgröße ein. Ein größerer Text wirkt auch beim Exportieren als Bild. - -## Ausprobieren - -Öffne eine deiner Übungen aus Lektion 2 und probiere Folgendes aus: - -1. Gib dem Diagramm im Feld [Titel](#zeige-titel) über dem Struktogramm einen Namen, zum Beispiel `Hallo Welt`. -2. [Speichere](#zeige-speichern) es in deinem Workspace. Schau in der Spalte [📁 Dateien](#zeige-dateien) nach: Steht es im Ordner von heute? -3. Öffne mit **+** einen zweiten Reiter und klicke dort in der Spalte Dateien auf dein Programm. Es öffnet sich wieder. -4. [Exportiere](#zeige-exportieren) es als **Bild (PNG)** und als **PDF (A4)**. Öffne beide Dateien und vergleiche sie. - -Klappt alles? Dann weißt du, wo deine Programme liegen, und kannst sie weitergeben. - -## Spiel: Wie gibst du es weiter? - -::: spiel frage -titel: Spiel: Wie gibst du es weiter? -intro: Ludwig will sein Struktogramm weitergeben. Welches Format passt am besten? Sechs Runden. -frage: Welches Format passt? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: Du willst morgen an deinem Struktogramm weiterarbeiten. -richtig: .visustruct -> Nur die .visustruct-Datei kann VisuStruct wieder öffnen und bearbeiten. - -runde: -frage: Das Struktogramm soll als Bild in eine Präsentation. -richtig: PNG -> Ein PNG-Bild lässt sich in jede Präsentation und jedes Arbeitsblatt einfügen. - -runde: -frage: Die Lehrkraft will deine Abgabe als eine A4-Seite ausdrucken. -richtig: PDF -> Das PDF ist genau eine A4-Seite zum Abgeben oder Ausdrucken. - -runde: -frage: Das Struktogramm kommt auf ein Plakat und soll auch riesig noch scharf sein. -richtig: SVG -> Eine Vektorgrafik bleibt in jeder Größe scharf. Ein PNG wird beim Vergrößern pixelig. - -runde: -frage: Deine Freundin soll das Struktogramm in ihrer VisuStruct-App auf dem iPad ändern. -richtig: .visustruct -> Alle VisuStruct-Versionen öffnen dieselbe .visustruct-Datei: im Browser, auf Mac, iPad und iPhone. - -runde: -frage: Du willst ein Bild schnell in einen Chat schicken. -richtig: PNG -> Ein PNG kann jeder sofort ansehen, ohne VisuStruct. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einem Diagramm einen Titel geben. → Ausprobieren -- Ich kann ein Diagramm als .visustruct-Datei speichern und wieder öffnen. → Speichern und Öffnen -- Ich kann ein Diagramm als Bild (PNG) oder PDF exportieren. → Weitergeben: Bild, PDF oder Datei -- Ich kann ein zweites Diagramm in einem neuen Reiter öffnen. → Mehrere Diagramme in Reitern -- Ich kann meinen Workspace `VisuStruct-Dateien` anlegen. → Die Spalte Dateien -- Ich kann ein Programm in meinem Workspace speichern. → Die Spalte Dateien -::: - -## Wissenstest - -::: quiz -? Welche Datei kannst du in der Mac-App und in der Java-App wieder öffnen? -→ Speichern und Öffnen -- [x] Die .visustruct-Datei -- [ ] Das exportierte PNG-Bild -- [ ] Das exportierte PDF -> Bilder und PDFs sind nur zum Ansehen. Weiterbearbeiten kannst du nur die .visustruct-Datei. - -? Deine Übungen werden im Browser gemerkt. Warum solltest du trotzdem speichern? -→ Speichern und Öffnen -- [ ] Weil die Übungen sonst nicht geprüft werden -- [x] Weil der Browser die Daten nur auf diesem Gerät behält und sie verloren gehen können -- [ ] Weil man ohne Speichern nicht exportieren kann - -? Du speicherst heute ein Programm in deinem Workspace. Wo landet es? -→ Die Spalte Dateien -- [ ] Im Download-Ordner -- [x] Im Workspace in einem Ordner mit dem heutigen Datum -- [ ] Direkt im Workspace ohne Unterordner -> VisuStruct legt für jeden Tag automatisch einen Datumsordner an. So bleiben die Programme nach Stunden sortiert. -::: diff --git a/web/lessons/de/04-variablen-und-datentypen.md b/web/lessons/de/04-variablen-und-datentypen.md deleted file mode 100644 index c98f4a68..00000000 --- a/web/lessons/de/04-variablen-und-datentypen.md +++ /dev/null @@ -1,407 +0,0 @@ ---- -titel: Variablen und Datentypen -bereich: Grundlagen -kurz: Werte speichern, die Datentypen int, double, String und boolean kennen und rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable mit Datentyp, Namen und Wert anlegen -- erklären, dass Java Groß- und Kleinschreibung unterscheidet (`zahl` ist nicht `Zahl`) -- die Datentypen int, double, String und boolean unterscheiden -- erklären, dass = eine Zuweisung ist und kein Vergleich -- mit + - * / % rechnen und die ganzzahlige Division anwenden -- Variablen in Java anlegen und ausgeben -::: - -## Was ist eine Variable? - -Eine **Variable** ist wie eine beschriftete Kiste. Sie hat einen **Namen**, einen **Datentyp** und einen **Wert**. - -``` -int alter = 14 -``` - -Hier heißt die Variable `alter`, ihr Datentyp ist `int` (ganze Zahl), und ihr Wert ist 14. Über den Namen kannst du den Wert später wieder benutzen. - -::: grafik l04-variable.svg -Die Variable als Kiste: Name auf dem Etikett, Datentyp als Aufkleber, Wert darin. -::: - -> Variablennamen beginnen mit einem **Kleinbuchstaben** und enthalten keine Leerzeichen. Gute Namen sagen, was drinsteht: `preis` ist besser als `p`. - -::: angeberwissen -Im September 1999 ging die Mars-Sonde Mars Climate Orbiter verloren. Ein Team rechnete die Schubkraft in amerikanischen Einheiten (Pfund), das andere erwartete metrische Einheiten (Newton). In den Daten stand nur die Zahl, nicht die Einheit. Die Sonde flog zu tief in die Mars-Atmosphäre und verglühte, Schaden rund 125 Millionen Dollar. Ein sprechender Name wie `impulsInNewtonSekunden` hätte gesagt, was drinsteht. Ich schreibe auf mein Heufach übrigens immer `heuInKilo`. -::: - -Besteht ein Name aus mehreren Wörtern, schreibst du sie zusammen und beginnst jedes weitere Wort mit einem Großbuchstaben: `preisMitSteuer`, `anzahlSchueler`. Diese Schreibweise heißt **CamelCase**. - -::: angeberwissen -CamelCase heißt so, weil die Großbuchstaben in der Mitte wie die Höcker eines Kamels aus dem Wort ragen: `preisMitSteuer` hat zwei Höcker. Ich als Geißbock habe übrigens null Höcker, dafür zwei Hörner. Leider hat noch niemand die GeißbockSchreibweise erfunden. -::: - -::: grafik l04-camelcase.svg -Die Großbuchstaben M und S ragen heraus wie die zwei Höcker des Kamels. -::: - -## Groß- und Kleinschreibung - -Java unterscheidet **Groß- und Kleinschreibung**. Auf Englisch heißt das **case-sensitive**. Für Java sind `zahl`, `Zahl` und `ZAHL` drei verschiedene Namen, also drei verschiedene Kisten: - -``` -int zahl = 4 -int Zahl = 6 -``` - -Hier gibt es zwei Variablen. Schreibst du später `ZAHL`, findet Java keine Variable mit diesem Namen. Das Programm läuft nicht, und du bekommst eine Fehlermeldung. - -> Das gilt auch für Java-Wörter: `String` und `System` schreibt man groß, `int` und `double` klein. Lege in deinen eigenen Programmen nie zwei Variablen an, die sich nur in der Groß- und Kleinschreibung unterscheiden. Das verwirrt dich und alle, die deinen Code lesen. - -## Übung: Drei Namen - -::: übung l04-gross-klein -titel: Drei Namen -auftrag: Ludwig hat zwei Variablen angelegt: `zahl` mit dem Wert 4 und `Zahl` mit dem Wert 6. Das Struktogramm soll beide malnehmen und **Ergebnis: 24** ausgeben. Es läuft aber nicht. - Klicke auf „Im Editor öffnen“, dann auf Prüfen, und lies die Fehlermeldung. Repariere die Anweisung und klicke noch einmal auf Prüfen. -start: l04-gross-klein-start.visustruct -test: - -> Ergebnis: 24 -braucht: anweisung -tipp: Wie viele verschiedene Namen stehen im Struktogramm? `zahl`, `Zahl` und `ZAHL` sind für den Computer drei verschiedene Namen. -tipp: `ZAHL` gibt es nicht. Für 24 brauchst du 4 mal 6, also `zahl` mal `Zahl`: `int ergebnis = zahl * Zahl`. Mit `zahl * zahl` kommt 16 heraus. -lösung: l04-gross-klein-loesung.visustruct -::: - -## Die vier Datentypen - -Der Datentyp legt fest, welche Art von Wert in der Variablen stehen darf. - -- **int:** ganze Zahlen, z. B. `int anzahl = 3` oder `int temperatur = -5` -- **double:** Kommazahlen, z. B. `double preis = 2.5`. Statt Komma schreibst du einen **Punkt**. -- **String:** Text, z. B. `String name = "Mia"`. Text steht in Anführungszeichen. -- **boolean:** Wahrheitswerte, nur `true` (wahr) oder `false` (falsch) - -Es gibt noch mehr Datentypen. Einen wirst du bald brauchen: `char` für ein **einzelnes Zeichen**, z. B. `char note = 'C'`. Ein `char` steht in **einfachen** Anführungszeichen. Genauer lernst du ihn in Lektion 17 kennen. - -::: diagramm l05-datentypen.visustruct -Drei Variablen mit verschiedenen Datentypen. Öffne das Diagramm und starte die [Simulation](#zeige-simulation). -::: - -Wahrheitswerte begegnen dir vor allem in **Bedingungen**: `alter >= 18` ist entweder `true` oder `false`. Darum geht es in Lektion 8. Eine Variable vom Typ `boolean` bekommt einfach `true` oder `false`: - -``` -boolean volljaehrig = false -``` - -::: angeberwissen -Am 4. Juni 1996 explodierte die Rakete Ariane 5 schon 37 Sekunden nach dem Start. Schuld war eine einzige Zeile: Eine Kommazahl für die Geschwindigkeit wurde in eine Ganzzahl-Variable gesteckt, die für so große Werte zu klein war. Der Datentyp ist also keine Nebensache, er kann eine halbe Milliarde Euro kosten. -::: - -## Zuweisung mit = - -Das Zeichen `=` heißt **Zuweisung**. Es bedeutet nicht „ist gleich“ wie in Mathe, sondern: Berechne die rechte Seite und speichere das Ergebnis in der Variablen links. - -``` -int punkte = 10 -punkte = punkte + 5 -``` - -In Mathe wäre die zweite Zeile falsch, denn keine Zahl ist gleich sich selbst plus 5. Beim Programmieren liest du sie so: Nimm den alten Wert 10, rechne plus 5 und speichere 15 in `punkte`. Den Datentyp schreibst du nur beim ersten Mal, wenn die Variable angelegt wird. - -::: grafik l04-zuweisung.svg -Erst wird rechts gerechnet, dann landet das Ergebnis in der Variablen links. -::: - -## Rechnen - -Mit Zahlen kannst du rechnen: - -- `+` plus, `-` minus, `*` mal, `/` geteilt -- `%` Rest beim Teilen (gesprochen „Modulo“), z. B. ist `17 % 5` gleich 2 - -**Teilen mit Rest** kennst du aus der Grundschule, als du noch keine Kommazahlen hattest: 17 : 5 = 3 Rest 2. Die 5 passt dreimal in die 17, das sind 15. Bis 17 fehlen dann noch 2, das ist der Rest. Genau so rechnet der Computer mit ganzen Zahlen: `/` liefert das Ergebnis ohne Rest, `%` nur den Rest. - -| Grundschule | mit `/` | mit `%` | -|---|---|---| -| 17 : 5 = 3 Rest 2 | `17 / 5` ergibt 3 | `17 % 5` ergibt 2 | -| 20 : 5 = 4 Rest 0 | `20 / 5` ergibt 4 | `20 % 5` ergibt 0 | -| 3 : 5 = 0 Rest 3 | `3 / 5` ergibt 0 | `3 % 5` ergibt 3 | - -Ist der Rest 0, geht die Teilung auf. So prüfst du später, ob eine Zahl gerade ist: Bei geraden Zahlen ist `zahl % 2` gleich 0. - -Es gilt **Punkt vor Strich**, und Klammern werden zuerst ausgerechnet: `2 * (3 + 4)` ist 14. - -### Text und Ergebnis zusammen ausgeben - -Ein Ergebnis allein sagt wenig. Mit `+` hängst du einen Text und den Wert einer Variablen aneinander: - -``` -int alter = 14 -output: "Alter: " + alter -``` - -Das zeigt **Alter: 14**. Der Text in Anführungszeichen erscheint genau so, für `alter` setzt der Computer den Wert ein. Das Leerzeichen nach dem Doppelpunkt gehört zum Text, sonst steht dort `Alter:14`. - -## Übung: Rechteck - -::: übung l05-rechteck -titel: Rechteck berechnen -auftrag: Ein Rechteck ist 7 lang und 4 breit. Lege die Variablen `laenge` und `breite` an. Berechne die Fläche und den Umfang in eigenen Variablen und gib beide aus, so wie hier: -`Fläche: 28` und in der nächsten Zeile `Umfang: 22`. -test: - -> Fläche: 28 | Umfang: 22 -braucht: anweisung -tipp: Überlege zuerst, welche Variablen du brauchst: zwei für die Maße und zwei für die Ergebnisse. Alle sind ganze Zahlen. -tipp: Die Fläche ist Länge mal Breite, der Umfang ist 2 mal (Länge plus Breite). Für die Ausgabe schreibst du z. B. `output: "Fläche: " + flaeche`. Das `+` hängt dabei den Text und den Wert der Variablen aneinander. -lösung: l05-rechteck-loesung.visustruct -::: - -## Ganzzahlige Division - -Teilst du zwei ganze Zahlen und speicherst das Ergebnis in einer `int`-Variablen, fällt alles nach dem Komma weg. Es wird **nicht gerundet**. - -``` -int x = 7 / 2 ergibt 3 -int r = 7 % 2 ergibt 1 (der Rest) -double d = 7.0 / 2 ergibt 3.5 -``` - -Mit `/` und `%` zusammen kannst du gut umrechnen, zum Beispiel Minuten in Stunden und Minuten: - -::: diagramm l05-division.visustruct -135 Minuten sind 2 Stunden (135 / 60) und 15 Minuten Rest (135 % 60). -::: - -## Übung: Sekunden umrechnen - -::: übung l05-sekunden -titel: Sekunden umrechnen -auftrag: 200 Sekunden sollen als Minuten und Sekunden ausgegeben werden. Die erste und die letzte Anweisung sind schon da. Füge dazwischen Anweisungen ein, die `minuten` und `rest` berechnen. -start: l05-sekunden-start.visustruct -test: - -> 3 Minuten und 20 Sekunden -braucht: anweisung -tipp: Wie viele ganze Minuten passen in 200 Sekunden, und wie viele Sekunden bleiben übrig? Rechne es erst im Kopf aus. -tipp: Eine Minute hat 60 Sekunden. Nutze `/` für die ganzen Minuten und `%` für den Rest. Beide Variablen sind vom Typ `int`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Übung: Einkauf - -::: übung l05-einkauf -titel: Einkauf -auftrag: Du kaufst 3 Hefte zu je 2.5 Euro. Lege `anzahl` als `int` und `preis` als `double` an, berechne den Gesamtpreis in einer Variablen `gesamtPreis` und gib `Gesamt: 7.5 Euro` aus. -test: - -> Gesamt: 7.5 Euro -braucht: anweisung -tipp: Anzahl mal Preis ergibt den Gesamtpreis. Überlege für jede Variable, ob sie eine ganze Zahl oder eine Kommazahl ist. -tipp: Der Gesamtpreis ist eine Kommazahl, also braucht `gesamtPreis` den Typ `double`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Jetzt in Java - -Ein Struktogramm ist ein Plan. In **Java** wird daraus ein Programm, das der Computer ausführt. Dein Einkauf aus der Übung sieht so aus: - -```java editor -int anzahl = 3; -double preis = 2.5; -double gesamtPreis = anzahl * preis; -System.out.println("Gesamt: " + gesamtPreis + " Euro"); -``` - -- Erst der Datentyp, dann der Name, dann der Wert, genau wie im Kasten. -- Jede Anweisung endet mit einem **Semikolon** `;`. -- Eine Ausgabe heißt in Java `System.out.println(…)`. - -Wie der Computer deinen Java-Code versteht und warum er auf Windows, macOS und Linux gleich läuft, erfährst du in der Lektion „Struktogramm und Code“. - -::: angeberwissen -Java hieß zuerst **Oak** (Eiche), nach dem Baum vor dem Bürofenster von James Gosling. Sein Team bei Sun Microsystems wollte ab 1991 kleine Geräte wie Fernseh-Boxen programmieren. Den Namen Oak hatte aber schon eine andere Firma. Also wurde es 1995 **Java**, wie der Kaffee von der Insel Java. -::: - -## Text in Java - -Variablen speichern nicht nur Zahlen. Für Text gibt es den Datentyp `String`: - -```java editor -String name = "Mia"; -int alter = 14; -double groesse = 1.62; -System.out.println(name + " ist " + alter + " Jahre alt."); -System.out.println("Größe: " + groesse + " m"); -``` - -- Text steht in Anführungszeichen. -- `String` schreibst du groß, `int`, `double` und `boolean` klein. Java unterscheidet das. -- Mit `+` hängst du Text und Zahlen aneinander. - -Java tippst du im Bereich [Code](#zeige-codelive). Das Struktogramm entsteht dabei von selbst. „Im Editor öffnen“ holt das Beispiel in den Bereich Code. Klicke dort auf „Ausführen“, ändere dann Name, Alter oder Größe und probiere es noch einmal. - -::: übung l04-java-steckbrief -titel: Steckbrief in Java -bereich: beide -code: java -auftrag: Schreibe einen Steckbrief für Ludwig den Geißbock. Lege drei Variablen an: den Namen **Ludwig**, das Alter **7** und die Größe **1.2**. Gib dann diese zwei Zeilen aus: - **Ludwig ist 7 Jahre alt.** und **Größe: 1.2 m** - „Im Editor öffnen“ öffnet rechts auch den Bereich Code. Tippe dort deinen Code, das Struktogramm entsteht dabei von selbst. Klicke dann auf Prüfen. -test: - -> Ludwig ist 7 Jahre alt. | Größe: 1.2 m -braucht: anweisung -tipp: Du brauchst einen `String`, einen `int` und einen `double`. Jede Zeile endet mit einem Semikolon. -tipp: `String name = "Ludwig";`, `int alter = 7;` und `double groesse = 1.2;`. Die Ausgabe setzt du mit `+` zusammen: `System.out.println(name + " ist " + alter + " Jahre alt.");` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Lückentext: Datentypen - -::: lückentext -titel: Steckbrief in Java -auftrag: Ergänze die fehlenden Wörter. Ganz außen steht der Rahmen, den jedes Java-Programm in einer eigenen Datei braucht. Darin stehen die Variablen. -```java -[[public]] class Steckbrief { - public static [[void]] main(String[] args) { - [[int]] alter = 14; - [[double]] groesse = 1.62; - [[String]] name = "Mia"; - [[boolean]] hatHaustier = true; - System.out.[[println]](name + " ist " + alter + " Jahre alt."); - } -} -``` -erklärung: Ganze Zahlen sind `int`, Kommazahlen `double`, Texte `String` (groß geschrieben) und Wahrheitswerte `boolean`. `public class` und `public static void main` bilden den Rahmen. Im Bereich Code darfst du ihn weglassen, mehr dazu in der Lektion „Struktogramm und Code“. -::: - -## Fehler finden: Sekunden - -::: übung l04-java-fehler -titel: Sekunden reparieren -code: java -auftrag: Das Programm soll 200 Sekunden in Minuten und Sekunden umrechnen und **3 min 20 s** ausgeben. Es gibt aber **20 min 3 s** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: `/` teilt ganzzahlig, `%` liefert den Rest. Welches Zeichen brauchst du für die Minuten, welches für die übrigen Sekunden? -tipp: Die beiden Zeichen sind vertauscht: `int minuten = sekunden / 60;` und `int rest = sekunden % 60;` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l04-java-laeuft-nicht -titel: Steckbrief reparieren -code: java -auftrag: Das Programm soll **Ludwig ist 7 Jahre alt.** ausgeben. Es läuft aber nicht, denn zwei Wörter sind falsch geschrieben. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig ist 7 Jahre alt. -braucht: anweisung -tipp: Java unterscheidet Groß- und Kleinschreibung. Vergleiche jedes Wort in der Ausgabe genau mit dem, was oben angelegt ist. -tipp: `System` schreibt man mit großem S. Die Variable heißt `alter` mit kleinem a: `System.out.println(name + " ist " + alter + " Jahre alt.");` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Datentyp? - -::: spiel frage -titel: Spiel: Welcher Datentyp? -intro: Ludwig hat Werte gesammelt. Welcher Datentyp passt zu jedem Wert? Acht Runden. -antworten: int | double | String | boolean - -runde: -frage: Welcher Datentyp passt zu `17`? -richtig: int -> Eine ganze Zahl ohne Komma ist ein `int`. - -runde: -frage: Welcher Datentyp passt zu `3.5`? -richtig: double -> Kommazahlen sind `double`. In Java steht statt des Kommas ein Punkt. - -runde: -frage: Welcher Datentyp passt zu `"Hallo"`? -richtig: String -> Text in Anführungszeichen ist ein `String`. - -runde: -frage: Welcher Datentyp passt zu `true`? -richtig: boolean -> `true` und `false` sind die beiden Wahrheitswerte, Datentyp `boolean`. - -runde: -frage: Welcher Datentyp passt zu `"17"`? -richtig: String -> Vorsicht, Anführungszeichen! Hier ist 17 ein Text, mit dem man nicht rechnen kann. - -runde: -frage: Welcher Datentyp passt zu `-4`? -richtig: int -> Auch negative ganze Zahlen sind `int`. - -runde: -frage: Welcher Datentyp passt zu `0.0`? -richtig: double -> Der Punkt macht es zur Kommazahl, auch wenn hinten nur eine 0 steht. - -runde: -frage: Welcher Datentyp passt zu `"false"`? -richtig: String -> In Anführungszeichen ist auch false nur ein Text. Der Wahrheitswert steht ohne Anführungszeichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable mit Datentyp, Namen und Wert anlegen. → Was ist eine Variable? -- Ich kann erklären, dass Java Groß- und Kleinschreibung unterscheidet (`zahl` ist nicht `Zahl`). → Groß- und Kleinschreibung -- Ich kann die Datentypen int, double, String und boolean unterscheiden. → Die vier Datentypen -- Ich kann erklären, dass = eine Zuweisung ist und kein Vergleich. → Zuweisung mit = -- Ich kann mit + - * / % rechnen und die ganzzahlige Division anwenden. → Rechnen -- Ich kann Variablen in Java anlegen und ausgeben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welcher Datentyp passt zu dem Wert 3.75? -→ Die vier Datentypen -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Kommazahlen haben den Typ double. In VisuStruct schreibst du sie mit Punkt. - -? Wie viele Variablen legen `int zahl = 1`, `int Zahl = 2` und `int ZAHL = 3` an? -→ Groß- und Kleinschreibung -- [ ] eine -- [ ] zwei -- [x] drei -> Java unterscheidet Groß- und Kleinschreibung. Die drei Namen sind verschieden, also gibt es drei Variablen. - -? Welchen Wert hat x nach `int x = 17 / 5`? -→ Rechnen -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> Bei ganzen Zahlen fällt alles nach dem Komma weg. Es wird nicht gerundet. - -? Was ergibt `17 % 5`? -→ Rechnen -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 geteilt durch 5 ist 3, Rest 2. Der Operator % liefert den Rest. - -? Am Anfang ist `int punkte = 10`. Was steht nach `punkte = punkte * 2` in punkte? -→ Zuweisung mit = -- [ ] 10 -- [ ] 12 -- [x] 20 -> Rechts wird mit dem alten Wert 10 gerechnet, das Ergebnis 20 wird in punkte gespeichert. - -? Welche Zeile legt in Java richtig eine Kommazahl an? -→ Jetzt in Java -- [ ] double preis = 2,5; -- [x] double preis = 2.5; -- [ ] Double preis = 2.5 -> Kommazahlen schreibst du mit Punkt, und am Ende steht ein Semikolon. -::: diff --git a/web/lessons/de/05-sequenz.md b/web/lessons/de/05-sequenz.md deleted file mode 100644 index be834a66..00000000 --- a/web/lessons/de/05-sequenz.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -titel: Sequenz -bereich: Grundlagen -kurz: Schritte nacheinander ausführen, auf die Reihenfolge achten und Werte tauschen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass eine Sequenz von oben nach unten ausgeführt wird -- erklären, warum die Reihenfolge der Schritte wichtig ist -- zwei Werte mit einer Hilfsvariablen tauschen -- eine Sequenz in Java schreiben -::: - -## Schritt für Schritt - -Eine **Sequenz** ist eine Folge von Schritten, die genau einmal und genau in dieser Reihenfolge ausgeführt werden. Im Struktogramm stehen die Kästen einfach untereinander. - -Jeder Kasten wird erst begonnen, wenn der Kasten darüber fertig ist. Es wird nichts übersprungen und nichts wiederholt. - -::: diagramm l05-sequenz.visustruct -Eine Sequenz aus vier Kästen: Zuerst bekommen `laenge` und `breite` ihre Werte, dann wird die Fläche berechnet, und zum Schluss wird sie ausgegeben. Jeder Kasten läuft genau einmal, von oben nach unten. Ausgabe: 15. -::: - -> Die Sequenz ist der einfachste der drei Grundbausteine. Fast jedes Struktogramm besteht zum größten Teil aus Sequenzen. - -## Die Reihenfolge zählt - -Beim Tee kochen merkst du sofort, wenn die Reihenfolge falsch ist. Bei Rechnungen ist es genauso, nur fällt es weniger auf. - -::: diagramm l04-rechnen.visustruct -Erst verdoppeln, dann 1 addieren: Das Ergebnis ist 7. Tauschst du die beiden mittleren Kästen, kommt 8 heraus. -::: - -Die Anweisung `zahl = zahl * 2` bedeutet: Nimm den Wert von `zahl`, rechne mal 2 und speichere das Ergebnis wieder in `zahl`. Was in `zahl` steht, hängt also davon ab, was vorher passiert ist. - -::: angeberwissen -Struktogramme sind kein reiner Schulkram. Laut Shneiderman haben auch Firmen wie IBM und Siemens damit ihre Programme geplant. Du lernst hier also Profi-Zeug. Määäh-ga! -::: - -## Übung: Reihenfolge ordnen - -::: übung l04-reihenfolge -titel: Reihenfolge ordnen -auftrag: Im Startdiagramm stehen die richtigen Kästen, aber in der falschen Reihenfolge. Verschiebe sie so, dass am Ende **20** ausgegeben wird. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Lies jeden Kasten und frage dich: Welche Variable braucht er, und wo bekommt diese Variable ihren Wert? -tipp: Eine Variable muss zuerst angelegt werden, bevor du mit ihr rechnest. Die Ausgabe kommt ganz zum Schluss. Rechne im Kopf nach: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Zwei Werte tauschen - -Stell dir zwei Gläser vor: eins mit Saft, eins mit Wasser. Willst du die Inhalte tauschen, brauchst du ein drittes, leeres Glas. - -Mit Variablen ist es genauso. Schreibst du einfach `a = b` und danach `b = a`, ist der alte Wert von `a` schon verloren. Am Ende haben beide Variablen denselben Wert. - -Die Lösung ist eine **Hilfsvariable**, die den alten Wert kurz aufbewahrt: - -::: grafik l05-tauschen.svg -Drei Schritte mit einem leeren Glas: erst Saft in hilf, dann Wasser nach links, dann den Saft aus hilf nach rechts. -::: - -::: diagramm l04-tauschen.visustruct -Zuerst wird a in hilf gemerkt. Dann bekommt a den Wert von b, und b bekommt den gemerkten Wert aus hilf. -::: - -## Übung: Gläser tauschen - -::: übung l04-glaeser-tauschen -titel: Gläser tauschen -auftrag: Im linken Glas ist Saft, im rechten Wasser. Tausche die Inhalte der Variablen `links` und `rechts`, bevor sie ausgegeben werden. -Ändere dazu nicht die ersten beiden Kästen, sondern füge dazwischen neue Anweisungen ein. -start: l04-tauschen-start.visustruct -test: - -> Links: Wasser | Rechts: Saft -braucht: anweisung -tipp: Wie tauschst du zwei volle Gläser im echten Leben? Du brauchst ein drittes, leeres Glas. -tipp: Lege mit `String hilf = links` eine Hilfsvariable an. Danach brauchst du noch zwei Zuweisungen. -lösung: l04-tauschen-loesung.visustruct -::: - -## Jetzt in Java - -Wie in Lektion 4 kannst du auch eine Sequenz direkt in Java schreiben. Das Tauschen von oben sieht so aus: - -```java editor -int a = 5; -int b = 9; -int hilf = a; -a = b; -b = hilf; -System.out.println("a = " + a); -System.out.println("b = " + b); -``` - -- Jeder Kasten wird zu einer Zeile. Die Zeilen laufen von oben nach unten, genau wie die Kästen. -- Am Ende jeder Anweisung steht ein **Semikolon** `;`. -- Eine Ausgabe heißt in Java `System.out.println(…)`. Achte auf das große S bei `System`, Java unterscheidet Groß- und Kleinbuchstaben. - -Java tippst du im Bereich [Code](#zeige-codelive) rechts neben dem Struktogramm. Während du tippst, baut VisuStruct das Struktogramm mit. So siehst du sofort, welcher Kasten zu welcher Zeile gehört. - -::: übung l05-java-kino -titel: Kinokarten in Java -bereich: beide -code: java -auftrag: Eine Kinokarte kostet 9 Euro. Schreibe ein Java-Programm, das den Preis für 3 Karten ausrechnet und **Gesamt: 27** ausgibt. - „Im Editor öffnen“ öffnet rechts auch den Bereich Code. Tippe dort deinen Code, das Struktogramm entsteht dabei von selbst. Klicke dann auf Prüfen. -test: - -> Gesamt: 27 -braucht: anweisung -tipp: Du brauchst drei Variablen: den Preis, die Anzahl und das Ergebnis. Jede Zeile endet mit einem Semikolon. -tipp: `int preis = 9;` und `int anzahl = 3;` legen die Variablen an. `int gesamt = preis * anzahl;` rechnet, und `System.out.println("Gesamt: " + gesamt);` gibt das Ergebnis aus. -lösung: l05-java-kino-loesung.visustruct -::: - -## Lückentext: Gläser tauschen - -::: lückentext -titel: Zwei Werte tauschen -auftrag: Die Werte von `a` und `b` sollen getauscht werden. Ergänze die fehlenden Wörter. -```java -int a = 3; -int b = 8; -[[int]] hilf = [[a]]; -a = [[b]]; -b = [[hilf]]; -System.out.println("a = " + a + ", b = " + b); -``` -erklärung: Erst rettest du `a` in die Hilfsvariable, dann bekommt `a` den Wert von `b`, und zuletzt bekommt `b` den geretteten Wert. Ausgabe: **a = 8, b = 3** -::: - -## Fehler finden: Guthaben - -::: übung l05-java-fehler -titel: Guthaben reparieren -code: java -auftrag: Auf der Mensakarte sind 20 Euro. Ein Essen kostet 7 Euro. Das Programm soll das Guthaben **nach** dem Bezahlen ausgeben, also **Übrig: 13**. Es gibt aber **Übrig: 20** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l05-java-fehler-start.visustruct -test: - -> Übrig: 13 -braucht: anweisung -tipp: Alle Zeilen stimmen, nur die Reihenfolge nicht. Wann wird das Guthaben ausgegeben, wann wird bezahlt? -tipp: Tausche die letzten beiden Zeilen: erst `guthaben = guthaben - preis;`, dann die Ausgabe. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l05-java-laeuft-nicht -titel: Pizza teilen -code: java -auftrag: Eine Pizza hat 8 Stücke, 4 Freunde teilen sie. Das Programm soll **Jeder bekommt 2 Stücke.** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Jeder bekommt 2 Stücke. -braucht: anweisung -tipp: Vergleiche den Namen in der Ausgabe Buchstabe für Buchstabe mit dem Namen, der in der dritten Zeile angelegt wird. -tipp: Die Variable heißt `proPerson` mit großem P (CamelCase). Schreibe sie in der Ausgabe genauso. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Kästen sortieren - -::: spiel reihenfolge -titel: Spiel: Kästen sortieren -intro: Ludwig hat die Kästen durcheinandergeworfen. Bring sie in die richtige Reihenfolge. Vier Runden. - -runde: -frage: Am Ende soll **7** ausgegeben werden. -- `int zahl = 3` -- `zahl = zahl * 2` -- `zahl = zahl + 1` -- `output: zahl` -> Erst verdoppeln, dann 1 dazu: 3 · 2 + 1 = 7. Andersherum käme (3 + 1) · 2 = 8 heraus. - -runde: -frage: Am Ende soll **8** ausgegeben werden. -- `int zahl = 3` -- `zahl = zahl + 1` -- `zahl = zahl * 2` -- `output: zahl` -> Dieselben Kästen, andere Reihenfolge, anderes Ergebnis: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a und b sollen ihre Werte tauschen. -- `int hilf = a` -- `a = b` -- `b = hilf` -- `output: a + " " + b` -> Zuerst wird a in hilf gerettet. Sonst ist der alte Wert weg, sobald a den Wert von b bekommt. - -runde: -frage: Ludwig kocht Tee. -- Wasser in den Wasserkocher füllen -- Wasserkocher einschalten -- Warten, bis das Wasser kocht -- Wasser über den Teebeutel gießen -- Tee ziehen lassen -> Jeder Schritt braucht den vorherigen. Genau wie im Struktogramm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass eine Sequenz von oben nach unten ausgeführt wird. → Schritt für Schritt -- Ich kann erklären, warum die Reihenfolge der Schritte wichtig ist. → Die Reihenfolge zählt -- Ich kann zwei Werte mit einer Hilfsvariablen tauschen. → Zwei Werte tauschen -- Ich kann eine Sequenz in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie oft wird jeder Kasten einer Sequenz ausgeführt? -→ Schritt für Schritt -- [ ] So oft, bis eine Bedingung falsch ist -- [x] Genau einmal -- [ ] Gar nicht, wenn er leer ist -> In einer Sequenz wird nichts wiederholt und nichts übersprungen. Für Wiederholungen gibt es Schleifen. - -? Am Anfang ist a = 5 und b = 9. Danach wird `a = b` und dann `b = a` ausgeführt. Was steht am Ende in den Variablen? -→ Zwei Werte tauschen -- [ ] a = 9 und b = 5 -- [x] a = 9 und b = 9 -- [ ] a = 5 und b = 5 -> Nach `a = b` ist der alte Wert 5 verloren. `b = a` kopiert dann nur die 9 zurück. - -? Wozu brauchst du beim Tauschen eine Hilfsvariable? -→ Zwei Werte tauschen -- [x] Damit ein Wert nicht überschrieben wird, bevor er gebraucht wird -- [ ] Damit das Struktogramm länger wird -- [ ] Weil man Variablen sonst nicht ausgeben kann - -? Was gibt die Sequenz `int x = 4`, `x = x + 1`, `x = x * 3`, `output: x` aus? -→ Die Reihenfolge zählt -- [ ] 13 -- [x] 15 -- [ ] 4 -> Erst wird x zu 5, dann zu 15. - -? Womit endet in Java jede Anweisung? -→ Jetzt in Java -- [ ] Mit einem Punkt . -- [x] Mit einem Semikolon ; -- [ ] Mit einem Doppelpunkt : -> Fehlt das Semikolon, zeigt VisuStruct unter dem Code einen Hinweis. -::: diff --git a/web/lessons/de/06-eingabe-und-ausgabe.md b/web/lessons/de/06-eingabe-und-ausgabe.md deleted file mode 100644 index 9858d258..00000000 --- a/web/lessons/de/06-eingabe-und-ausgabe.md +++ /dev/null @@ -1,432 +0,0 @@ ---- -titel: Eingabe und Ausgabe -bereich: Grundlagen -kurz: Werte abfragen, Ergebnisse anzeigen und das EVA-Prinzip anwenden. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- das EVA-Prinzip erklären -- eine Eingabe mit Datentyp, Namen und Frage schreiben -- Text und Variablen in einer Ausgabe mit + verbinden -- ein Ergebnis zuerst ausrechnen und in einer Variablen speichern, dann diese Variable ausgeben, z. B. `int summe = a + b`, danach `output: summe` -- aus einem Aufgabentext Eingabe, Verarbeitung und Ausgabe herauslesen -- in Java mit dem Scanner Zahlen einlesen -- Kommentare mit `//` und `/* */` schreiben und damit meinen Code einteilen und erklären -::: - -## Das EVA-Prinzip - -Viele Programme arbeiten in drei Teilen: - -1. **Eingabe:** Das Programm fragt Werte ab, z. B. zwei Zahlen. -2. **Verarbeitung:** Es rechnet mit den Werten. -3. **Ausgabe:** Es zeigt das Ergebnis an. - -Die Anfangsbuchstaben ergeben **EVA**. Bisher standen die Werte fest im Struktogramm. Mit einer Eingabe kann bei jedem Durchlauf ein anderer Wert verwendet werden. - -::: diagramm l06-eva.visustruct -Oben die Eingabe, in der Mitte die Verarbeitung, unten die Ausgabe. Starte die Simulation und probiere verschiedene Zahlen aus. -::: - -## Eingabe mit input: - -Eine Eingabe fragt beim Ausführen einen Wert ab und speichert ihn in einer Variablen. Du schreibst den **Datentyp**, den **Namen** und eine **Frage** in Anführungszeichen: - -``` -input: int alter "Wie alt bist du?" -input: double preis "Preis in Euro?" -input: String name "Wie heißt du?" -``` - -Im Editor wählst du bei einer Anweisung oben die Art **Eingabe**. Das Wort `input:` steht dann schon davor, und du tippst nur noch `int alter "Wie alt bist du?"`. - -> Der Datentyp entscheidet, was eingegeben werden darf. Bei `int` meldet die Simulation einen Fehler, wenn jemand 2.5 oder Hallo eintippt. - -## Ausgabe mit output: - -Eine Ausgabe zeigt Text und Werte an. Text steht in Anführungszeichen, Variablen ohne. Mit `+` hängst du die Teile **aneinander**: - -``` -output: "Hallo " + name + "!" -output: "Du bist " + alter + " Jahre alt." -``` - -Achte auf die Leerzeichen innerhalb der Anführungszeichen. Ohne sie klebt alles zusammen, und du siehst `HalloMia!` statt `Hallo Mia!`. - -## Übung: Begrüßung - -::: übung l06-begruessung -titel: Begrüßung -auftrag: Frage nach dem Namen und begrüße die Person. Bei der Eingabe Ada soll **Hallo Ada!** ausgegeben werden. -test: Ada -> Hallo Ada! -test: Ben -> Hallo Ben! -braucht: anweisung -tipp: Zuerst kommt eine Eingabe für den Namen, danach eine Ausgabe, die den Namen benutzt. -tipp: Der Name ist Text, die Eingabe braucht also den Typ `String`. In der Ausgabe verbindest du `"Hallo "`, die Variable und `"!"` mit `+`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Vorsicht mit + in der Ausgabe - -In einer Ausgabe hängt `+` die Teile **immer** aneinander, auch bei Zahlen. Sind `a` gleich 3 und `b` gleich 4, dann zeigt - -``` -output: a + b -``` - -nicht 7, sondern **34**. Rechne deshalb vorher in einer Variablen und gib dann die Variable aus: - -``` -int summe = a + b -output: "Summe: " + summe -``` - -Das passt auch zum EVA-Prinzip: Gerechnet wird in der Verarbeitung, nicht in der Ausgabe. - -## Vom Aufgabentext zum Struktogramm - -Bevor du den ersten Kasten ziehst, liest du die Aufgabe genau und zerlegst sie. Das nennt man **Problemanalyse**. Drei Fragen helfen dir dabei: - -1. **Was ist gegeben?** Diese Werte werden zur **Eingabe**. Überlege auch den Datentyp. -2. **Was ist gesucht?** Das wird zur **Ausgabe**. -3. **Wie kommt man vom Gegebenen zum Gesuchten?** Das ist die **Verarbeitung**, oft eine Formel. - -Ein Beispiel: *Eine Kinokarte kostet 9 €. Das Programm fragt, wie viele Karten jemand kauft, und zeigt den Gesamtpreis an.* - -- Gegeben: die Anzahl der Karten → `input: int anzahl "Wie viele Karten?"` -- Gesucht: der Gesamtpreis → `output: "Gesamtpreis: " + gesamt` -- Weg: Anzahl mal 9 → `int gesamt = anzahl * 9` - -Jetzt musst du die drei Teile nur noch in der Reihenfolge E, V, A untereinander setzen. - -> Achte im Aufgabentext auf Signalwörter: *fragt*, *liest ein* oder *gibt ein* deuten auf eine Eingabe. *Zeigt*, *gibt aus* oder *meldet* deuten auf eine Ausgabe. - -## Übung: Rechner - -::: übung l06-rechner -titel: Summe und Produkt -auftrag: Frage zwei ganze Zahlen ab. Gib danach ihre Summe und ihr Produkt aus, jeweils in einer eigenen Zeile. -Bei 3 und 4 sieht das so aus: `Summe: 7` und `Produkt: 12`. -test: 3, 4 -> Summe: 7 | Produkt: 12 -test: 10, -2 -> Summe: 8 | Produkt: -20 -test: 0, 5 -> Summe: 5 | Produkt: 0 -braucht: anweisung -tipp: Plane die Reihenfolge: erst beide Zahlen einlesen, dann rechnen, dann ausgeben. -tipp: Du brauchst zwei Eingaben, zwei Anweisungen zum Rechnen und zwei Ausgaben. Rechne die Summe in einer eigenen Variablen, sonst hängt `+` die Zahlen aneinander. -lösung: l06-rechner-loesung.visustruct -::: - -## Übung: Mittelwert - -::: übung l06-mittelwert -titel: Mittelwert -auftrag: Frage zwei Zahlen ab, die auch Kommazahlen sein dürfen. Gib ihren Mittelwert aus, bei 2 und 3 also `Mittelwert: 2.5`. -test: 2, 3 -> Mittelwert: 2.5 -test: 4, 6 -> Mittelwert: 5.0 -test: 1.5, 2 -> Mittelwert: 1.75 -braucht: anweisung -tipp: Den Mittelwert zweier Zahlen bekommst du, wenn du sie addierst und das Ergebnis halbierst. -tipp: Für Kommazahlen nimmst du den Typ `double`. Der Mittelwert ist die Summe geteilt durch 2. Denk an die Klammern: `(x + y) / 2`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Jetzt in Java - -So sieht das EVA-Beispiel vom Anfang in Java aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Erste Zahl?"); -int a = scanner.nextInt(); -System.out.println("Zweite Zahl?"); -int b = scanner.nextInt(); -int summe = a + b; -System.out.println("Summe: " + summe); -``` - -- Für Eingaben braucht Java einen **Scanner**. Die ersten beiden Zeilen schreibst du einmal ganz oben, dann kannst du beliebig oft einlesen. -- `scanner.nextInt()` liest eine ganze Zahl, `scanner.nextDouble()` eine Kommazahl und `scanner.next()` ein Wort. -- Die Frage an den Benutzer ist eine normale Ausgabe direkt davor. VisuStruct macht aus beiden Zeilen zusammen einen Eingabe-Kasten. - -::: angeberwissen -Java sollte ursprünglich kleine Geräte steuern, und das tut es heute noch: Auf vielen SIM-Karten im Handy und auf Bankkarten läuft eine Mini-Version namens **Java Card**. Gut möglich, dass du gerade Java in der Hosentasche hast. -::: - -::: übung l06-java-tage -titel: Alter in Tagen -code: java -auftrag: Schreibe ein Java-Programm, das nach dem Alter in Jahren fragt und ausgibt, wie viele Tage das ungefähr sind. Rechne mit 365 Tagen pro Jahr. Bei 2 Jahren erscheint **Das sind etwa 730 Tage.** -test: 2 -> Das sind etwa 730 Tage. -test: 10 -> Das sind etwa 3650 Tage. -test: 1 -> Das sind etwa 365 Tage. -braucht: anweisung -tipp: Erst die beiden Scanner-Zeilen, dann Frage und Eingabe, dann rechnen, dann ausgeben. -tipp: `int jahre = scanner.nextInt();` liest ein. `int tage = jahre * 365;` rechnet, und `System.out.println("Das sind etwa " + tage + " Tage.");` gibt aus. -lösung: l06-java-tage-loesung.visustruct -::: - -## Kommentare im Code - -Im Code darfst du dir Notizen machen. Sie heißen **Kommentare** (englisch *comments*). Java überspringt sie beim Ausführen, das Programm und das Struktogramm bleiben also gleich. Es gibt zwei Arten: - -- `//` macht den Rest der Zeile zum Kommentar. Das ist ein **einzeiliger Kommentar**. -- `/*` beginnt einen **mehrzeiligen Kommentar**, `*/` beendet ihn. Alles dazwischen gehört zum Kommentar, egal wie viele Zeilen. Die Sternchen am Anfang der Zeilen dazwischen braucht Java nicht, sie sehen nur ordentlich aus. - -In fertigen Programmen siehst du manchmal auch `/** … */` mit zwei Sternchen am Anfang. Das ist ein **Javadoc-Kommentar**, aus dem Java eine Beschreibung des Programms erzeugen kann. Für dich reichen `//` und `/* */`. - -So sieht das EVA-Beispiel mit Kommentaren aus: - -```java editor -/* - * Aufgabe: Das Programm fragt nach zwei Zahlen - * und gibt ihre Summe aus. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Eingabe -System.out.println("Erste Zahl?"); -int a = scanner.nextInt(); -System.out.println("Zweite Zahl?"); -int b = scanner.nextInt(); - -// Verarbeitung -int summe = a + b; // die beiden Zahlen addieren - -// Ausgabe -System.out.println("Summe: " + summe); // bei 3 und 4 erwarte ich: Summe: 7 - -// Nächstes Mal: auch Kommazahlen erlauben -``` - -Wofür Kommentare gut sind: - -- **Aufgabenstellung:** Oben im mehrzeiligen Kommentar steht, was das Programm können soll. -- **Einteilung:** `// Eingabe`, `// Verarbeitung` und `// Ausgabe` teilen den Code nach dem EVA-Prinzip ein. -- **Erklärung:** Ein Kommentar hinter einer Zeile sagt, was dein Algorithmus dort macht. -- **Erwartung:** Schreib auf, welche Ausgabe du erwartest. Beim Testen vergleichst du dann. -- **Klammern zuordnen:** Später kommen Blöcke in geschweiften Klammern `{ }` dazu. Dann zeigt z. B. `} // Ende for`, welche Klammer was schließt. -- **Gedanken festhalten:** Woran musst du denken, wenn du nächstes Mal weiterarbeitest? - -Klicke auf **Im Editor öffnen**, ändere einen Kommentar oder schreib einen neuen dazu. Das Struktogramm bleibt gleich, und VisuStruct behält deine Kommentare. - -> Schreib nicht hinter jede Zeile einen Kommentar. Erkläre, was dein Algorithmus macht und warum, nicht jedes einzelne Zeichen. - -::: angeberwissen -Beide Arten sind viel älter als Java: `/* … */` stammt aus der Sprache PL/I von 1964, `//` aus BCPL von 1967. Java hat sie über C und C++ geerbt. -::: - -## Lückentext: Kommentare - -::: lückentext -titel: Kommentare ergänzen -auftrag: Ergänze die Zeichen, damit oben ein mehrzeiliger Kommentar mit der Aufgabe steht und die anderen beiden Notizen einzeilige Kommentare sind. -```java -[[/*]] - * Aufgabe: Das Programm rechnet Euro in Cent um. - [[*/]] -int euro = 3; -[[//]] Verarbeitung -int cent = euro * 100; -[[//]] Ausgabe, erwartet: 300 -System.out.println(cent); -``` -erklärung: `/*` öffnet den mehrzeiligen Kommentar und `*/` schließt ihn. `//` gilt nur bis zum Ende der Zeile, darum braucht jede Notiz ihr eigenes `//`. -::: - -## Lückentext: Eingabe - -::: lückentext -titel: Name und Alter einlesen -auftrag: Ergänze die fehlenden Wörter, damit das Programm einen Namen und ein Alter einliest. -```java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("Wie heißt du?"); -[[String]] name = scanner.[[next]](); -System.out.println("Wie alt bist du?"); -int alter = scanner.[[nextInt]](); -System.out.println("Hallo " + name + ", nächstes Jahr bist du " + [[(alter + 1)]] + "."); -``` -erklärung: `scanner.next()` liest ein Wort, `scanner.nextInt()` eine ganze Zahl. Die Klammern um `alter + 1` sind wichtig: Ohne sie hängt Java erst `alter` und dann `1` an den Text an, aus 14 würde **141**. -::: - -## Fehler finden: Summe - -::: übung l06-java-fehler -titel: Summe reparieren -code: java -auftrag: Das Programm liest zwei Zahlen ein und soll ihre Summe ausgeben. Bei 3 und 4 erscheint aber **Summe: 34** statt **Summe: 7**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Summe: 7 -test: 10, 5 -> Summe: 15 -test: 0, 9 -> Summe: 9 -braucht: anweisung -tipp: Lies die Ausgabe von links nach rechts: Was ergibt `"Summe: " + a`? Und was passiert, wenn danach noch `+ b` kommt? -tipp: Setze Klammern, damit Java zuerst rechnet: `System.out.println("Summe: " + (a + b));` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l06-java-laeuft-nicht -titel: Alter im nächsten Jahr -code: java -auftrag: Das Programm fragt nach deinem Alter und soll sagen, wie alt du nächstes Jahr bist. Bei 14 also **Nächstes Jahr bist du 15**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> Nächstes Jahr bist du 15 -test: 9 -> Nächstes Jahr bist du 10 -braucht: anweisung -tipp: Die Eingabe landet in einer Variablen. Wie genau heißt sie, und wie heißt sie in der Ausgabe? -tipp: Die Variable heißt `alter` mit kleinem a: `System.out.println("Nächstes Jahr bist du " + (alter + 1));` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Was wird ausgegeben? - -::: spiel frage -titel: Spiel: Was wird ausgegeben? -intro: Ludwig hat Ein- und Ausgaben gebaut. Sag vorher, was passiert. Sieben Runden. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: Was wird ausgegeben? -- 7 -- [x] 34 -- a + b -> In einer Ausgabe hängt `+` die Teile immer aneinander, auch bei Zahlen. - -runde: - int a = 3 - int b = 4 - int summe = a + b - output: "Summe: " + summe -frage: Was wird ausgegeben? -- [x] Summe: 7 -- Summe: 34 -- Summe: summe -> Gerechnet wird vorher in einer Variablen. Die Ausgabe hängt nur noch Text und Ergebnis aneinander. - -runde: - input: String name "Wie heißt du?" - output: "Hallo" + name + "!" -frage: Du tippst Mia. Was wird ausgegeben? -- Hallo Mia! -- [x] HalloMia! -- Hallo name! -> Im Text `"Hallo"` fehlt das Leerzeichen am Ende. Darum klebt alles zusammen. - -runde: - input: int alter "Wie alt bist du?" -frage: Du tippst 2.5. Was passiert? -- alter ist 2. -- alter ist 2.5. -- [x] Die Simulation meldet einen Fehler. -> Der Datentyp `int` erlaubt nur ganze Zahlen. - -runde: - input: double preis "Preis in Euro?" -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- [x] Eingabe -- Verarbeitung -- Ausgabe -> `input:` fragt einen Wert ab. Das ist die Eingabe. - -runde: - double mittel = (a + b) / 2.0 -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- Eingabe -- [x] Verarbeitung -- Ausgabe -> Hier wird gerechnet. Das ist die Verarbeitung. - -runde: - output: "Mittelwert: " + mittel -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- Eingabe -- Verarbeitung -- [x] Ausgabe -> `output:` zeigt das Ergebnis an. Das ist die Ausgabe. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann das EVA-Prinzip erklären. → Das EVA-Prinzip -- Ich kann eine Eingabe mit Datentyp, Namen und Frage schreiben. → Eingabe mit input: -- Ich kann Text und Variablen in einer Ausgabe mit + verbinden. → Vorsicht mit + in der Ausgabe -- Ich kann ein Ergebnis zuerst ausrechnen und in einer Variablen speichern, dann diese Variable ausgeben, z. B. `int summe = a + b`, danach `output: summe`. → Vorsicht mit + in der Ausgabe -- Ich kann aus einem Aufgabentext Eingabe, Verarbeitung und Ausgabe herauslesen. → Vom Aufgabentext zum Struktogramm -- Ich kann in Java mit dem Scanner Zahlen einlesen. → Jetzt in Java -- Ich kann Kommentare mit `//` und `/* */` schreiben und damit meinen Code einteilen und erklären. → Kommentare im Code -::: - -## Wissenstest - -::: quiz -? Wofür steht EVA? -→ Das EVA-Prinzip -- [x] Eingabe, Verarbeitung, Ausgabe -- [ ] Eingabe, Variable, Anweisung -- [ ] Erst Variablen anlegen -> Viele Programme fragen erst Werte ab, verarbeiten sie und zeigen dann das Ergebnis. - -? Die Variablen a und b haben die Werte 3 und 4. Was zeigt `output: a + b`? -→ Vorsicht mit + in der Ausgabe -- [ ] 7 -- [x] 34 -- [ ] a + b -> In der Ausgabe hängt + die Teile aneinander. Rechne die Summe vorher in einer Variablen aus. - -? Welche Eingabe passt, wenn ein Preis wie 4.99 eingegeben werden soll? -→ Eingabe mit input: -- [ ] input: int preis "Preis?" -- [x] input: double preis "Preis?" -- [ ] input: String "Preis?" -> 4.99 ist eine Kommazahl, also double. Außerdem braucht jede Eingabe einen Variablennamen. - -? Was zeigt `output: "Alter: " + alter`, wenn alter den Wert 12 hat? -→ Vorsicht mit + in der Ausgabe -- [x] Alter: 12 -- [ ] "Alter: " + 12 -- [ ] Alter: alter - -? Aufgabe: *Das Programm fragt nach dem Radius eines Kreises und zeigt seinen Umfang an.* Ordne jedem Teil des Textes zu, wohin er im EVA-Prinzip gehört. -→ Vom Aufgabentext zum Struktogramm -= fragt nach dem Radius -> Eingabe -= Umfang = 2 * 3.14 * Radius -> Verarbeitung -= zeigt seinen Umfang an -> Ausgabe -> Gegeben ist der Radius, gesucht der Umfang. Die Formel verbindet beides. - -? Was liest `scanner.nextInt()` ein? -→ Jetzt in Java -- [x] Eine ganze Zahl -- [ ] Eine Kommazahl -- [ ] Einen ganzen Satz -> Für Kommazahlen gibt es `scanner.nextDouble()`, für ein Wort `scanner.next()`. - -? Was macht Java mit einem Kommentar? -→ Kommentare im Code -- [ ] Es gibt ihn als Text aus. -- [x] Es überspringt ihn. -- [ ] Es meldet einen Fehler. -> Kommentare sind Notizen für Menschen. Das Programm läuft mit und ohne sie genau gleich. - -? Wo endet ein Kommentar, der mit `/*` beginnt? -→ Kommentare im Code -- [x] Bei `*/` -- [ ] Am Ende der Zeile -- [ ] Bei der nächsten Leerzeile -> Darum kann ein Kommentar mit `/*` über mehrere Zeilen gehen. Ein Kommentar mit `//` endet dagegen am Zeilenende. -::: diff --git a/web/lessons/de/07-simulation-und-schreibtischtest.md b/web/lessons/de/07-simulation-und-schreibtischtest.md deleted file mode 100644 index 2f0ee800..00000000 --- a/web/lessons/de/07-simulation-und-schreibtischtest.md +++ /dev/null @@ -1,364 +0,0 @@ ---- -titel: Simulation und Schreibtischtest -bereich: Grundlagen -kurz: Ein Struktogramm Schritt für Schritt ausführen, von Hand nachrechnen und Fehler finden. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Simulation starten, anhalten, einzelne Schritte ausführen und stoppen -- während der Simulation Variablen, Ausgabe und den letzten Schritt ablesen -- einen Schreibtischtest als Tabelle von Hand durchführen -- Syntaxfehler, Laufzeitfehler und Logikfehler unterscheiden -- einen Fehler finden, indem ich die Werte mit meiner Erwartung vergleiche -- Java-Code mit dem Einzelschritt und Haltepunkten verfolgen -::: - -## Die Simulation starten - -Bevor es mit Verzweigungen und Schleifen weitergeht, lernst du dein wichtigstes Werkzeug kennen. Mit der Simulation prüfst du ab jetzt jede Übung selbst. - -Mit dem Knopf [▶︎ Simulation starten](#zeige-simulation) rechts bei den Werkzeugen führt VisuStruct dein Struktogramm aus. Solange die Simulation läuft, kannst du das Diagramm nicht bearbeiten. Derselbe Knopf heißt dann **■ Simulation beenden**, damit kehrst du zum Bearbeiten zurück. - -Rechts erscheint die **Steuerung**: - -- **Start** führt das Diagramm automatisch Schritt für Schritt aus. Wie lange zwischen zwei Schritten gewartet wird, stellst du bei **Pause pro Schritt** ein. -- **Pause** hält an. Danach geht es mit Start oder Schritt weiter. -- **Schritt** führt genau einen Schritt aus. So kannst du in Ruhe zuschauen. -- **Stopp** bricht ab und setzt alles auf den Anfang zurück. - -Öffne das folgende Diagramm im Editor und gehe es mit **Schritt** durch: - -::: diagramm sim-tausch.visustruct -Die Werte von a und b werden vertauscht. Die Variable hilf merkt sich dabei einen Wert. -::: - -## Was die Simulation anzeigt - -- **Markierung:** Ein Kasten im Diagramm ist farbig hervorgehoben. Bei **Letzter Schritt** ist es der Kasten, der gerade ausgeführt wurde. Bei **Nächster Schritt** ist es der Kasten, der als Nächstes drankommt. -- **Eingabe:** Fragt das Diagramm nach einem Wert, tippst du ihn hier ein und bestätigst mit **OK**. -- **Letzter Schritt:** Hier steht, was gerade passiert ist, z. B. `a = 5 -> 5` nach dem Kasten `a = b`. Links sind die Variablen schon durch ihre Werte ersetzt, rechts vom Pfeil steht das Ergebnis. -- **Variablen:** Alle Variablen mit ihren aktuellen Werten. -- **Ausgabe:** Alles, was mit `output:` ausgegeben wurde. - -Ist rechts der Bereich [Code](#zeige-codelive) geöffnet, läuft dort zusätzlich die [Konsole](#zeige-konsole) mit. Sie wird beim Start geleert und zeigt dann die Ausgaben und Eingaben so, wie sie auch beim echten Programm erscheinen würden. - -Am Ende erscheint **Simulation beendet**. Geht etwas schief, bleibt die Simulation auf dem fehlerhaften Kasten stehen und zeigt eine Meldung, z. B. **Unbekannte Variable: gesamt**. - -## Der Schreibtischtest - -Beim **Schreibtischtest** spielst du selbst den Computer. Du gehst das Struktogramm mit Stift und Papier durch und schreibst nach jedem Schritt die Werte der Variablen auf. Am besten machst du eine Tabelle: eine Spalte für den Schritt, eine für jede Variable und eine für die Ausgabe. - -::: grafik l07-schreibtischtest-de.svg -Ein Blatt Papier und ein Stift genügen: Du schreibst nach jedem Schritt die neuen Werte in eine neue Zeile. -::: - -Für das Diagramm oben sieht die Tabelle so aus: - -| Schritt | a | b | hilf | Ausgabe | -|---|---|---|---|---| -| `int a = 3` | 3 | – | – | | -| `int b = 5` | 3 | 5 | – | | -| `int hilf = a` | 3 | 5 | 3 | | -| `a = b` | 5 | 5 | 3 | | -| `b = hilf` | 5 | 3 | 3 | | -| `output: "a = " + a` | 5 | 3 | 3 | a = 5 | -| `output: "b = " + b` | 5 | 3 | 3 | b = 3 | - -Vergleiche danach deine Tabelle mit der Simulation. Stimmen die Werte unter **Variablen** nach jedem Schritt mit deiner Zeile überein? - -> Der Schreibtischtest lohnt sich besonders in Prüfungen. Dort hast du keinen Computer, aber du kannst trotzdem zeigen, was dein Struktogramm tut. - -::: angeberwissen -Früher war „Computer“ ein Beruf: Menschen, die mit Stift, Papier und Rechenmaschine rechneten. Eine der besten war die Mathematikerin Katherine Johnson bei der NASA. Sie berechnete Flugbahnen für Raumkapseln, später auch für den Flug von Apollo 11 zum Mond. - -1962 sollte John Glenn als erster Amerikaner die Erde umkreisen. Die Flugbahn hatte ein neuer IBM-Computer berechnet. Glenn traute der Maschine nicht ganz und sagte: „Holt das Mädchen, sie soll die Zahlen prüfen. Wenn sie sagt, sie stimmen, fliege ich.“ Katherine Johnson rechnete alles von Hand nach, also ein echter Schreibtischtest. Ihre Zahlen stimmten, und Glenn flog. - -Katherine Johnson war Schwarz, und im US-Bundesstaat Virginia trennten damals Gesetze Schwarze und Weiße. Im Film „Hidden Figures“ (2016) muss sie für jeden Toilettengang quer über das Gelände laufen. Das ist für den Film zugespitzt: Getrennte Toiletten gab es wirklich, aber Katherine Johnson hat das Schild nach eigener Aussage einfach ignoriert. - -Ihre Kollegin Dorothy Vaughan merkte früh, dass die IBM-Computer die Rechenarbeit übernehmen würden. Sie brachte sich und ihrem ganzen Team die Programmiersprache FORTRAN bei. So wurden aus menschlichen Computern Programmiererinnen. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), Mathematikerin bei der NASA (Foto: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), gemeinfrei). -::: - -## Drei Arten von Fehlern - -Fehler gehören zum Programmieren dazu, auch bei Profis. Man unterscheidet drei Arten, denn jede findest du auf einem anderen Weg: - -- **Syntaxfehler** (syntax error): Der Text hält sich nicht an die Regeln der Sprache, z. B. fehlt am Ende ein `;`. Das Programm startet gar nicht. -- **Laufzeitfehler** (runtime error): Das Programm startet, bricht aber an einer Stelle ab, z. B. beim Teilen durch 0. -- **Logikfehler** (logic error): Das Programm läuft bis zum Ende, aber das Ergebnis ist falsch, z. B. weil Klammern fehlen: `a + b / 2` statt `(a + b) / 2`. - -So zeigt dir VisuStruct die Fehler: - -- **Syntaxfehler:** Im Struktogramm passieren sie seltener, weil die Kästen die Form vorgeben. Im Bereich [Code](#zeige-codelive) wird die Stelle rot unterstrichen, die Zeilennummer wird rot, und dazu steht z. B. **Zeile 2: Hier fehlt noch: ;**. -- **Laufzeitfehler:** Die Simulation bleibt auf dem Kasten stehen und meldet z. B. **Division durch null.** Im Bereich Code wird die Zeilennummer rot, und die [Konsole](#zeige-konsole) nennt die Zeile: **Zeile 3: Division durch null.** -- **Logikfehler:** Hier meldet niemand etwas. Der Computer weiß nicht, was du eigentlich wolltest. Nur du kennst das richtige Ergebnis, darum hilft hier der Schreibtischtest. - -> Eine rote Zeilennummer zeigt einen Fehler. Der runde rote Punkt vor der Zeilennummer ist etwas anderes: ein Haltepunkt. Den lernst du unten bei „Jetzt in Java“ kennen. - -## Fehler finden - -Gibt ein Struktogramm etwas Falsches aus, ist das ein Logikfehler. Dann gehst du so vor: - -1. **Erwartung aufschreiben:** Was soll bei einer bestimmten Eingabe herauskommen? -2. **Schritt für Schritt ausführen:** Starte die Simulation mit **Schritt** und beobachte die Variablen. -3. **Die Stelle finden:** Wo weicht ein Wert zum ersten Mal von deiner Erwartung ab? Genau dort steckt der Fehler. - -Häufige Fehler in einer Sequenz sind: - -- Die **Reihenfolge** stimmt nicht: Eine Variable wird benutzt, bevor sie einen Wert hat. -- Ein Wert wird **überschrieben**, bevor er gebraucht wird. -- **Klammern** fehlen: `a + b / 2` ist etwas anderes als `(a + b) / 2`. -- Zwei ganze Zahlen werden geteilt: `7 / 2` ergibt `3`, weil bei `int` die Nachkommastellen wegfallen. - -> Später kommen Verzweigungen und Schleifen dazu. Dann zeigt dir die Simulation auch, welcher Weg genommen wird und wie oft eine Schleife läuft. - -::: angeberwissen -Am 9. September 1947 fand das Team von Grace Hopper im Rechner Harvard Mark II eine echte Motte, die zwischen zwei Kontakten klemmte. Sie klebten sie ins Logbuch und schrieben dazu: „Erster echter Fall, dass ein Bug gefunden wurde.“ Die Motte liegt heute in einem Museum in Washington. - -Grace Hopper war eine der ersten Programmiererinnen der Welt. 1952 baute sie einen der ersten **Compiler**: ein Programm, das Code in Maschinencode übersetzt. Sie fand, dass man Computern Befehle in fast normalem Englisch geben sollte. Daraus entstand die Programmiersprache COBOL, mit der viele Banken bis heute rechnen. Bei der US-Marine wurde sie sogar Admiralin. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), Informatikerin und Admiralin (Foto: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), gemeinfrei). -::: - -## Übung: Tauschen reparieren - -::: übung sim-tausch -titel: Tauschen reparieren -auftrag: Das Struktogramm soll zwei Zahlen einlesen und sie vertauscht wieder ausgeben. Bei 3 und 5 soll also erst **5** und dann **3** erscheinen. Es gibt aber zweimal 5 aus. - Mache einen Schreibtischtest oder nutze **Schritt** und repariere den Fehler. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Gehe das Diagramm mit **Schritt** durch und schreibe nach jedem Schritt die Werte von a und b auf. Wo verschwindet die 3? -tipp: Schau dir a nach dem Schritt `a = b` an. Wo ist der alte Wert von a geblieben? Merke ihn dir vorher in einer Hilfsvariablen, wie im Beispiel oben. -lösung: sim-tausch-loesung.visustruct -::: - -## Übung: Kinokarten reparieren - -::: übung sim-kino -titel: Kinokarten reparieren -auftrag: Eine Kinokarte kostet 8.50 €. Das Struktogramm soll nach der Anzahl fragen und den Gesamtpreis ausgeben, bei 2 Karten also `Gesamt: 17.0`. - Starte die Simulation. Sie bleibt mit einer Fehlermeldung stehen. Finde heraus, warum, und repariere das Struktogramm. -start: sim-kino-start.visustruct -test: 2 -> Gesamt: 17.0 -test: 3 -> Gesamt: 25.5 -test: 0 -> Gesamt: 0.0 -braucht: anweisung -tipp: Lies die Fehlermeldung der Simulation genau. Welche Variable kennt sie noch nicht? -tipp: Die Simulation führt die Kästen von oben nach unten aus. Hat gesamt schon einen Wert, wenn die Ausgabe drankommt? Du kannst Kästen mit der Maus verschieben. -lösung: sim-kino-loesung.visustruct -::: - -> Läuft eine Simulation endlos weiter, klicke auf **Stopp**. Beim **Prüfen** einer Übung bricht VisuStruct nach sehr vielen Schritten von selbst ab. - -## Jetzt in Java - -Auch Java-Code kannst du Schritt für Schritt ausführen. Im Bereich [Code](#zeige-codelive) heißt das Werkzeug dafür **Debugger**: - -- Klicke links auf eine Zeilennummer. Ein roter Punkt erscheint, das ist ein **Haltepunkt**. [▶︎ Ausführen](#zeige-ausfuehren) hält vor dieser Zeile an. -- Der Knopf [Einzelschritt](#zeige-einzelschritt) führt genau eine Zeile aus, wie **Schritt** in der Simulation. -- Unter dem Code steht, welchen Wert jede Variable gerade hat. Das ist dein Schreibtischtest, nur dass der Computer mitschreibt. - -::: übung l07-java-pizza -titel: Pizzabestellung reparieren -code: java -auftrag: Eine Pizza kostet 8 Euro, Extra-Käse 2 Euro. Für 3 Pizzen mit Extra-Käse soll das Programm **Gesamt: 30** ausgeben. Es gibt aber 14 aus. - Gehe den Java-Code mit dem Einzelschritt durch und beobachte `gesamt`. Finde den Fehler und repariere ihn im Code. -start: l07-java-pizza-start.visustruct -test: - -> Gesamt: 30 -braucht: anweisung -tipp: Welcher Wert steht nach der vierten Zeile in `gesamt`? Rechne im Kopf nach, was Java zuerst ausrechnet. -tipp: Wie in Mathe gilt Punkt vor Strich: `preis + kaese * anzahl` ist `8 + 6`. Setze Klammern: `(preis + kaese) * anzahl`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Lückentext: Schreibtischtest - -::: lückentext -titel: Was steht in den Variablen? -auftrag: Mach einen Schreibtischtest im Kopf. Trage hinter jeder Zeile ein, welchen Wert die Variable danach hat, und in der letzten Zeile, was ausgegeben wird. -```java -int a = 5; -int b = 2; -a = a + b; // a ist jetzt [[7]] -b = a * 2; // b ist jetzt [[14]] -a = b - a; // a ist jetzt [[7]] -System.out.println(a + b); // Ausgabe: [[21]] -``` -erklärung: Jede Zeile rechnet mit den Werten, die gerade in den Variablen stehen: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, Ausgabe 7 + 14 = 21. Mit dem Einzelschritt im Bereich Code kannst du es nachprüfen. -::: - -## Fehler finden: Spielstand - -::: übung l07-java-fehler -titel: Spielstand reparieren -code: java -auftrag: Ludwig bekommt in einem Spiel erst 10 Punkte, dann 5 Punkte, dann verliert er 3 Punkte. Am Ende soll **Punkte: 12** erscheinen. Es erscheint aber **Punkte: 3**. - Gehe den Code mit dem Einzelschritt durch und beobachte `punkte`. Repariere die falsche Zeile und klicke auf Prüfen. -start: l07-java-fehler-start.visustruct -test: - -> Punkte: 12 -braucht: anweisung -tipp: Nach welcher Zeile hat `punkte` plötzlich den Wert 3? Was soll in dieser Zeile eigentlich passieren? -tipp: Ludwig verliert 3 Punkte, also wird vom alten Wert abgezogen: `punkte = punkte - 3;` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l07-java-laeuft-nicht -titel: Bonus reparieren -code: java -auftrag: Ludwig hat 10 Punkte und bekommt 5 Bonuspunkte. Am Ende soll **Punkte: 15** erscheinen. Der Code läuft aber nicht. Gehe ihn auch mit dem Einzelschritt durch: In welcher Zeile bleibt er stehen? - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Punkte: 15 -braucht: anweisung -tipp: Java arbeitet den Code von oben nach unten ab. Gibt es `bonus` schon, wenn damit gerechnet wird? -tipp: Lege `bonus` vor der Rechnung an: erst `int bonus = 5;`, dann `punkte = punkte + bonus;` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Mach im Kopf den Schreibtischtest und tippe auf die falsche Zeile, bevor die Zeit abläuft. Die Programme sind in Java, aber jede Zeile ist ein Kasten wie im Struktogramm. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int hilf = a; - a = b; - b = a; -frage: Soll die Werte von a und b tauschen. -fehler: 5 -besser: b = hilf; -> In a steht schon der Wert von b. Der alte Wert von a steckt in hilf. - -runde: - int a = 4; - int b = 6; - double mittel = a + b / 2; - System.out.println(mittel); -frage: Soll den Mittelwert 5.0 ausgeben. -fehler: 3 -besser: double mittel = (a + b) / 2.0; -> Ohne Klammern wird zuerst geteilt: 4 + 6 / 2 = 7. - -runde: - int karten = 3; - double preis = 8.5; - double gesamt = karten + preis; - System.out.println("Gesamt: " + gesamt); -frage: Soll den Preis für 3 Kinokarten zu je 8,50 € ausgeben. -fehler: 3 -besser: double gesamt = karten * preis; -> Für den Gesamtpreis wird malgenommen, nicht addiert. - -runde: - int minuten = 135; - int stunden = minuten / 60; - int rest = minuten / 60; - System.out.println(stunden + " h " + rest + " min"); -frage: Soll 2 h 15 min ausgeben. -fehler: 3 -besser: int rest = minuten % 60; -> Den Rest beim Teilen liefert `%`. Mit `/` stünde auch in rest eine 2. - -runde: - String name = "Ada"; - System.out.println("Hallo " + "name" + "!"); -frage: Soll „Hallo Ada!“ ausgeben. -fehler: 2 -besser: System.out.println("Hallo " + name + "!"); -> In Anführungszeichen ist name nur ein Text. Die Variable steht ohne Anführungszeichen. - -runde: - double preis = 100; - preis = preis * 0.1; - System.out.println(preis); -frage: Soll den Preis um 10 % erhöhen, also 110.0 ausgeben. -fehler: 2 -besser: preis = preis + preis * 0.1; -> Mal 0.1 ergibt nur die 10 %, also 10.0. Die müssen zum alten Preis dazukommen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Simulation starten, anhalten, einzelne Schritte ausführen und stoppen. → Die Simulation starten -- Ich kann während der Simulation Variablen, Ausgabe und den letzten Schritt ablesen. → Was die Simulation anzeigt -- Ich kann einen Schreibtischtest als Tabelle von Hand durchführen. → Der Schreibtischtest -- Ich kann Syntaxfehler, Laufzeitfehler und Logikfehler unterscheiden. → Drei Arten von Fehlern -- Ich kann einen Fehler finden, indem ich die Werte mit meiner Erwartung vergleiche. → Fehler finden -- Ich kann Java-Code mit dem Einzelschritt und Haltepunkten verfolgen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Mit welchem Knopf führst du genau einen Schritt aus? -→ Die Simulation starten -- [ ] Start -- [x] Schritt -- [ ] Stopp -> Start läuft automatisch weiter, Schritt führt nur einen Schritt aus. - -? Was schreibst du beim Schreibtischtest nach jedem Schritt auf? -→ Der Schreibtischtest -- [ ] Nur die Ausgabe am Ende -- [x] Die aktuellen Werte aller Variablen -- [ ] Den erzeugten Java-Code -> So siehst du genau, an welcher Stelle ein Wert anders ist als erwartet. - -? Erst `int a = 3`, dann `int b = 5`, dann `a = b`. Welche Werte haben a und b danach? -→ Der Schreibtischtest -- [ ] a = 5 und b = 3 -- [x] a = 5 und b = 5 -- [ ] a = 3 und b = 5 -> Der alte Wert von a ist überschrieben. Darum braucht man beim Tauschen eine Hilfsvariable. - -? Im Feld Letzter Schritt steht `preis = 4 * 2.5 -> 10.0`. Was bedeutet das? -→ Was die Simulation anzeigt -- [ ] Die Variable preis hat jetzt den Wert 4. -- [x] 4 * 2.5 wurde ausgerechnet und das Ergebnis 10.0 in preis gespeichert. -- [ ] Die Simulation hat einen Fehler gefunden. - -? Die Simulation meldet **Unbekannte Variable: summe**. Was ist ein wahrscheinlicher Grund? -→ Fehler finden -- [x] summe wird benutzt, bevor sie einen Wert bekommen hat. -- [ ] summe ist zu groß. -- [ ] Das Struktogramm hat zu viele Kästen. - -? Was macht ein roter Punkt vor einer Zeilennummer im Bereich Code? -→ Jetzt in Java -- [ ] Er markiert einen Fehler. -- [x] Das Programm hält vor dieser Zeile an. -- [ ] Die Zeile wird übersprungen. -> Das ist ein Haltepunkt. Mit ▶︎ oder dem Einzelschritt geht es weiter. -? Ordne jedem Fehler seine Fehlerart zu. -→ Drei Arten von Fehlern -= Am Zeilenende fehlt das Semikolon. -> Syntaxfehler -= Das Programm teilt durch 0 und bricht ab. -> Laufzeitfehler -= Der Durchschnitt ist zu groß, weil Klammern fehlen. -> Logikfehler - -? Das Programm läuft ohne Meldung bis zum Ende, gibt aber 12 statt 21 aus. Welche Fehlerart ist das? -→ Drei Arten von Fehlern -- [ ] Syntaxfehler -- [ ] Laufzeitfehler -- [x] Logikfehler -> Es gibt keine Meldung, das Ergebnis ist trotzdem falsch. So einen Fehler findest du nur mit deiner Erwartung und dem Schreibtischtest. -::: diff --git a/web/lessons/de/08-verzweigung.md b/web/lessons/de/08-verzweigung.md deleted file mode 100644 index 094d8f14..00000000 --- a/web/lessons/de/08-verzweigung.md +++ /dev/null @@ -1,368 +0,0 @@ ---- -titel: Verzweigung -bereich: Grundlagen -kurz: Mit einer Bedingung entscheiden, welcher von zwei Wegen ausgeführt wird. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass bei einer Verzweigung genau ein Zweig ausgeführt wird -- die Vergleichsoperatoren == != < <= > >= anwenden -- == und = unterscheiden -- eine Verzweigung mit einem leeren Zweig bauen -- eine Verzweigung mit if und else in Java schreiben -::: - -## Wenn, dann, sonst - -Bisher wurden alle Kästen immer ausgeführt. Oft soll ein Programm aber **entscheiden**: Wenn eine Bedingung erfüllt ist, tue das eine, sonst das andere. - -::: diagramm l07-alter-pruefen.visustruct -Je nach eingegebenem Alter erscheint die eine oder die andere Meldung. Probiere in der Simulation 17 und 18 aus. -::: - -Dafür gibt es die **Verzweigung**. Oben im Dreieck steht die Bedingung. Darunter teilt sich das Struktogramm in zwei Zweige: - -- **true** (links): wird ausgeführt, wenn die Bedingung wahr ist -- **false** (rechts): wird ausgeführt, wenn die Bedingung falsch ist - -Es wird immer **genau einer** der beiden Zweige ausgeführt. Danach geht es unter der Verzweigung weiter. - -## Eine Verzweigung einfügen - -Ziehe die **Verzweigung** aus dem Bereich Elemente ins Struktogramm. Klicke das Dreieck an und schreibe im Objektinspektor die Bedingung, z. B. `alter >= 18`. Das Wort `if` steht schon davor. - -In jedem Zweig liegt zuerst ein Platzhalter ø. Ziehe dort Anweisungen hinein. In einem Zweig dürfen auch mehrere Kästen untereinander stehen. - -## Vergleichsoperatoren - -Eine Bedingung ist meistens ein **Vergleich**. Sein Ergebnis ist immer `true` oder `false`. - -- `==` gleich, z. B. `zahl == 0` -- `!=` ungleich, z. B. `antwort != 42` -- `<` kleiner, `<=` kleiner oder gleich -- `>` größer, `>=` größer oder gleich - -> Verwechsle `==` nicht mit `=`. Ein einzelnes `=` ist eine Zuweisung und speichert einen Wert. Zum Vergleichen brauchst du zwei Gleichheitszeichen. - -Mit `%` prüfst du, ob eine Zahl durch eine andere teilbar ist: `zahl % 2 == 0` ist wahr, wenn `zahl` gerade ist. - -## Übung: Gerade oder ungerade - -::: übung l07-gerade -titel: Gerade oder ungerade -auftrag: Frage eine ganze Zahl ab. Gib **gerade** aus, wenn sie gerade ist, und sonst **ungerade**. -test: 4 -> gerade -test: 7 -> ungerade -test: 0 -> gerade -braucht: verzweigung -tipp: Hier gibt es zwei Möglichkeiten, also brauchst du eine Verzweigung. Woran erkennst du eine gerade Zahl? -tipp: Eine Zahl ist gerade, wenn beim Teilen durch 2 kein Rest bleibt. Die Bedingung lautet `zahl % 2 == 0`. -lösung: l07-gerade-loesung.visustruct -::: - -## Übung: Die größere Zahl - -::: übung l07-maximum -titel: Die größere Zahl -auftrag: Frage zwei ganze Zahlen ab und gib nur die größere von beiden aus. Sind beide gleich, gib diese Zahl aus. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: Eine Verzweigung vergleicht die beiden Zahlen. In jedem Zweig steht genau eine Ausgabe. -tipp: Vergleiche mit `a > b`. Im true-Zweig gibst du `a` aus, im false-Zweig `b`. -lösung: l07-maximum-loesung.visustruct -::: - -## Ein leerer Zweig - -Manchmal soll nur dann etwas passieren, wenn die Bedingung wahr ist, und sonst gar nichts. Dann bleibt der false-Zweig **leer**. Im Struktogramm steht dort der Platzhalter **ø**. - -::: diagramm l07-rabatt.visustruct -Ab 50 Euro gibt es 5 Euro Rabatt. Sonst passiert nichts, der false-Zweig ist leer. Die Ausgabe darunter wird in beiden Fällen ausgeführt. -::: - -::: angeberwissen -Eine einzige vergessene Verzweigung hat 2014 halb das Internet in Aufregung versetzt: die Sicherheitslücke **Heartbleed** in OpenSSL, einem Programm, das viele Webseiten für die Verschlüsselung benutzen. Ein Computer konnte dem Server sagen: „Schick mir das Wort *Hut* zurück, es hat 500 Buchstaben.“ Der Server hat nicht geprüft, ob die 500 zur echten Länge 3 passen, und einfach 500 Zeichen aus seinem Speicher zurückgeschickt. Darin standen manchmal Passwörter anderer Leute. Gefehlt hat nur ein if: Wenn die angegebene Länge größer ist als die echte, dann nichts zurückschicken. Mit Klammern hatte das übrigens nichts zu tun. Mäh, prüf deine Eingaben, bevor du ihnen glaubst. -::: - -## Übung: Betrag - -::: übung l07-betrag -titel: Betrag einer Zahl -auftrag: Frage eine ganze Zahl ab. Ist sie negativ, mache sie positiv. Gib danach die Zahl aus. Aus -5 wird also 5, und 7 bleibt 7. -Nutze eine Verzweigung mit einem leeren Zweig und nur **einer** Ausgabe unter der Verzweigung. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Nur negative Zahlen müssen verändert werden. Was passiert mit einer Zahl, wenn du sie mal -1 nimmst? -tipp: Die Bedingung ist `zahl < 0`. Im true-Zweig drehst du das Vorzeichen um, z. B. mit `zahl = 0 - zahl`. Der false-Zweig bleibt leer. -lösung: l07-betrag-loesung.visustruct -::: - -## Jetzt in Java - -So sieht die Altersprüfung vom Anfang dieser Lektion in Java aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie alt bist du?"); -int alter = scanner.nextInt(); -if (alter >= 18) { - System.out.println("Du bist volljährig."); -} else { - System.out.println("Du bist noch nicht volljährig."); -} -``` - -- Die Bedingung steht nach `if` in **runden Klammern** `( )`. -- Der true-Zweig steht in **geschweiften Klammern** `{ }`, der false-Zweig folgt nach `else` in eigenen geschweiften Klammern. Hinter einer geschweiften Klammer steht kein Semikolon. -- Ist der false-Zweig leer, lässt du `else { }` einfach weg. -- Die ersten beiden Zeilen braucht dein Programm einmal, sobald es etwas einliest. Danach liest `scanner.nextInt()` eine ganze Zahl ein. Die Frage davor ist eine normale Ausgabe. - -::: angeberwissen -Java hat auch ein Maskottchen: **Duke**, ein kleiner schwarz-weißer Kerl mit großer roter Nase. Er wurde 1992 im Team von Java gezeichnet und winkt seitdem von Konferenzen und T-Shirts. Ludwig findet, ein Geißbock hätte besser gepasst. -::: - -::: übung l08-java-bestanden -titel: Bestanden in Java -code: java -auftrag: Schreibe ein Java-Programm, das nach der Punktzahl fragt. Ab 50 Punkten gibt es **bestanden** aus, sonst **nicht bestanden**. - Tippe den Code im Bereich Code und klicke dann auf Prüfen. -test: 50 -> bestanden -test: 49 -> nicht bestanden -test: 100 -> bestanden -test: 0 -> nicht bestanden -braucht: verzweigung -tipp: Fang mit den beiden Zeilen für den Scanner an. Dann fragst du nach den Punkten, liest sie ein und vergleichst sie mit `if`. -tipp: Die Bedingung lautet `punkte >= 50`. In den Zweigen steht `System.out.println("bestanden");` und nach `else` `System.out.println("nicht bestanden");`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Lückentext: Gerade oder ungerade - -::: lückentext -titel: Gerade oder ungerade -auftrag: Ergänze die fehlenden Wörter und Zeichen. Das Programm soll ausgeben, ob eine Zahl gerade ist. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Zahl?"); -int zahl = scanner.nextInt(); -[[if]] (zahl [[%]] 2 [[==]] 0) [[{]] - System.out.println("gerade"); -[[}]] [[else]] { - System.out.println("ungerade"); -} -``` -erklärung: `zahl % 2` ist der Rest beim Teilen durch 2. Ist er 0, ist die Zahl gerade. Zum Vergleichen brauchst du `==`, ein einzelnes `=` ist eine Zuweisung. Beide Zweige stehen in geschweiften Klammern. -::: - -::: angeberwissen -Steht im Zweig nur eine einzige Anweisung, darf man in Java die geschweiften Klammern sogar weglassen. Wir machen das trotzdem nie, und zwar aus diesem Grund: - -```java -if (alter >= 18) - System.out.println("Du bist volljährig."); - System.out.println("Du darfst den Film sehen."); -``` - -Ohne Klammern gehört nur die erste Zeile zum if. Die zweite läuft immer, auch für Zwölfjährige. Die Einrückung täuscht, denn Java achtet nicht auf Leerzeichen. - -Genau so ein Fehler steckte 2014 in iPhones und Macs, bekannt als **„goto fail“**. In der Sprache C stand unter einem if ohne Klammern die Zeile `goto fail;` aus Versehen zweimal. Die zweite lief immer und übersprang die Prüfung der Sicherheitszertifikate. In einem offenen WLAN hätte sich ein Angreifer so zum Beispiel als deine Bank ausgeben können. Mäh, Klammern kosten zwei Zeichen, eine Sicherheitslücke kostet viel mehr. -::: - -## Fehler finden: Eintritt - -::: übung l08-java-fehler -titel: Eintritt reparieren -code: java -auftrag: Im Zoo haben Kinder **unter** 6 Jahren freien Eintritt, alle anderen zahlen 4 Euro. Das Programm lässt aber auch Sechsjährige umsonst hinein. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l08-java-fehler-start.visustruct -test: 5 -> Eintritt frei -test: 6 -> 4 Euro -test: 10 -> 4 Euro -test: 0 -> Eintritt frei -braucht: verzweigung -tipp: Probiere das Programm mit 6 aus. Welcher Vergleichsoperator lässt die 6 noch durch? -tipp: „Unter 6“ heißt `alter < 6`. `<=` bedeutet „kleiner oder gleich“. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l08-java-laeuft-nicht -titel: Film ab 16 -code: java -auftrag: Der Film ist ab 16. Ludwig ist 15, also soll das Programm **Kein Einlass** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> Kein Einlass -braucht: verzweigung -tipp: Schau dir die Bedingung in der Klammer nach `if` genau an. Gibt es diese Variable? -tipp: Die Variable heißt `alter` mit kleinem a: `if (alter >= 16) {` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Weg? - -::: spiel frage -titel: Spiel: Welcher Weg? -intro: Ludwig hat Verzweigungen in Java geschrieben. Rechne die Bedingung im Kopf aus und sag vorher, was ausgegeben wird. Sieben Runden. - -runde: - int x = 5; - if (x > 5) { - System.out.println("groß"); - } else { - System.out.println("klein"); - } -frage: Was wird ausgegeben? -- groß -- [x] klein -- nichts -> 5 > 5 ist falsch, denn 5 ist nicht größer als 5. Also der false-Zweig. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("groß"); - } else { - System.out.println("klein"); - } -frage: Was wird ausgegeben? -- [x] groß -- klein -- groß und klein -> `>=` heißt „größer oder gleich“. 5 >= 5 ist wahr. - -runde: - int zahl = 7; - if (zahl % 2 == 0) { - System.out.println("gerade"); - } else { - System.out.println("ungerade"); - } -frage: Was wird ausgegeben? -- gerade -- [x] ungerade -- 1 -> 7 % 2 ist der Rest 1, also nicht 0. Die Zahl ist ungerade. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: Was wird ausgegeben? -- -4 -- [x] 4 -- nichts -> -4 < 0 ist wahr, also wird das Vorzeichen umgedreht. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: Was wird ausgegeben? -- -4 -- [x] 4 -- nichts -> 4 < 0 ist falsch. Der false-Zweig ist leer, das Programm macht einfach unten weiter. - -runde: - int note = 3; - if (note != 3) { - System.out.println("anders"); - } else { - System.out.println("drei"); - } -frage: Was wird ausgegeben? -- anders -- [x] drei -- nichts -> `!=` heißt „ungleich“. 3 != 3 ist falsch. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: Was wird ausgegeben? -- 8 -- [x] 12 -- 20 -> Das Programm gibt die größere der beiden Zahlen aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass bei einer Verzweigung genau ein Zweig ausgeführt wird. → Wenn, dann, sonst -- Ich kann die Vergleichsoperatoren == != < <= > >= anwenden. → Vergleichsoperatoren -- Ich kann == und = unterscheiden. → Vergleichsoperatoren -- Ich kann eine Verzweigung mit einem leeren Zweig bauen. → Ein leerer Zweig -- Ich kann eine Verzweigung mit if und else in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welcher Zweig wird ausgeführt, wenn die Bedingung falsch ist? -→ Wenn, dann, sonst -- [ ] Der true-Zweig -- [x] Der false-Zweig -- [ ] Beide Zweige -- [ ] Keiner, das Programm endet -> Bei false wird der rechte Zweig ausgeführt. Danach geht es unter der Verzweigung weiter. - -? Mit welcher Bedingung prüfst du, ob alter genau 18 ist? -→ Vergleichsoperatoren -- [ ] alter = 18 -- [x] alter == 18 -- [ ] alter >= 18 -> Ein einzelnes = ist eine Zuweisung. Zum Vergleichen brauchst du ==. - -? Was bedeutet ø in einem Zweig? -→ Ein leerer Zweig -- [x] In diesem Fall passiert nichts. -- [ ] Das Programm endet hier. -- [ ] Die Bedingung ist falsch. - -? Die Bedingung lautet `punkte >= 50`. Bei welchem Wert ist sie wahr? -→ Vergleichsoperatoren -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= heißt größer oder gleich. 50 gehört also dazu. - -? In Schulbüchern hat die Verzweigung oft noch einen anderen Namen. Welchen? -→ Wenn, dann, sonst -- [ ] Mehrfachauswahl -- [x] Bedingte Anweisung -- [ ] Wiederholungsstruktur -> Die Anweisungen in einem Zweig werden nur unter einer Bedingung ausgeführt. Darum heißt sie auch bedingte Anweisung. - -? Wo steht in Java die Bedingung einer Verzweigung? -→ Jetzt in Java -- [x] In runden Klammern direkt nach if -- [ ] In geschweiften Klammern nach else -- [ ] Hinter einem Semikolon -> `if (alter >= 18) { … }`: Die runden Klammern gehören zur Bedingung, die geschweiften zum Zweig. -::: diff --git a/web/lessons/de/09-bedingungen-verknuepfen.md b/web/lessons/de/09-bedingungen-verknuepfen.md deleted file mode 100644 index 0ecd38fc..00000000 --- a/web/lessons/de/09-bedingungen-verknuepfen.md +++ /dev/null @@ -1,328 +0,0 @@ ---- -titel: Bedingungen verknüpfen -bereich: Grundlagen -kurz: Mehrere Bedingungen mit und, oder und nicht verbinden und Wertebereiche prüfen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, wann eine Verknüpfung mit && wahr ist -- erklären, wann eine Verknüpfung mit || wahr ist -- eine Bedingung mit ! umdrehen -- prüfen, ob ein Wert in einem Bereich wie 1 bis 6 liegt -- die Wahrheitstabelle für &&, || und ! lesen -- das Ergebnis einer Bedingung in einer boolean-Variablen speichern -- zusammengesetzte Bedingungen sicher auswerten -- Bedingungen in Java mit && und || verknüpfen -::: - -## Und: && - -Manchmal reicht ein einzelner Vergleich nicht. Ein Jugendticket gibt es zum Beispiel nur, wenn jemand **mindestens 12 und jünger als 18** ist. - -Mit `&&` (und) verbindest du zwei Bedingungen. Das Ergebnis ist nur dann `true`, wenn **beide** Bedingungen wahr sind. - -::: diagramm l08-jugendticket.visustruct -Beide Vergleiche müssen stimmen. Probiere in der Simulation 11, 12, 17 und 18 aus. -::: - -## Oder: || - -Mit `||` (oder) ist das Ergebnis `true`, wenn **mindestens eine** der Bedingungen wahr ist. Es dürfen auch beide wahr sein. - -``` -tag == 6 || tag == 7 -``` - -Diese Bedingung ist wahr, wenn `tag` den Wert 6 oder den Wert 7 hat, also am Samstag oder Sonntag. - -> Die beiden senkrechten Striche `|` tippst du auf vielen Tastaturen mit AltGr und der Taste `<`, am Mac mit Option und 7. - -## Übung: Wochenende - -::: übung l08-wochenende -titel: Wochenende -auftrag: Frage einen Wochentag als Zahl ab (1 ist Montag, 7 ist Sonntag). Gib **Wochenende** aus, wenn es Samstag oder Sonntag ist, sonst **Werktag**. -test: 6 -> Wochenende -test: 7 -> Wochenende -test: 1 -> Werktag -test: 5 -> Werktag -braucht: verzweigung -tipp: Wochenende ist, wenn der Tag 6 **oder** 7 ist. Dafür brauchst du zwei Vergleiche in einer Bedingung. -tipp: Samstag ist 6, Sonntag ist 7. Verbinde die beiden Vergleiche mit `||`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Wertebereiche prüfen - -Schulnoten gehen von 1 bis 6. Ob eine Note **im Bereich** liegt, prüfst du mit zwei Vergleichen und `&&`: - -``` -note >= 1 && note <= 6 -``` - -::: grafik l08-zahlenstrahl.svg -Gültig ist der grüne Bereich von 1 bis 6, beide Ränder gehören dazu. -::: - -Umgekehrt ist eine Note **außerhalb** des Bereichs, wenn sie zu klein **oder** zu groß ist: - -::: diagramm l08-note.visustruct -Eine Note kleiner als 1 oder größer als 6 gibt es nicht. -::: - -> Die Schreibweise aus Mathe `1 <= note <= 6` funktioniert nicht. Du musst sie in zwei Vergleiche aufteilen und mit `&&` verbinden. - -## Übung: Gültige Note - -::: übung l08-note-gueltig -titel: Gültige Note -auftrag: Frage eine Note als ganze Zahl ab. Gib **gültig** aus, wenn sie zwischen 1 und 6 liegt (1 und 6 gehören dazu), sonst **ungültig**. -test: 1 -> gültig -test: 6 -> gültig -test: 3 -> gültig -test: 0 -> ungültig -test: 7 -> ungültig -braucht: verzweigung -tipp: Eine gültige Note muss zwei Dinge gleichzeitig erfüllen: nicht zu klein **und** nicht zu groß. -tipp: Die Note muss größer oder gleich 1 und gleichzeitig kleiner oder gleich 6 sein. -lösung: l08-gueltig-loesung.visustruct -::: - -## Nicht und Klammern - -Mit `!` (nicht) drehst du eine Bedingung um: Aus `true` wird `false` und umgekehrt. - -``` -!(note >= 1 && note <= 6) -``` - -Das ist wahr, wenn die Note **nicht** im Bereich liegt, und bedeutet dasselbe wie `note < 1 || note > 6`. - -Kommen `&&` und `||` zusammen vor, wird `&&` zuerst ausgewertet, so wie Punkt vor Strich. Setze lieber **Klammern**, dann ist klar, was zusammengehört: - -``` -(alter >= 12 && alter < 18) || schueler == 1 -``` - -## Die Wahrheitstabelle - -Eine **Wahrheitstabelle** zeigt auf einen Blick, was bei `&&`, `||` und `!` herauskommt. Links stehen alle vier Möglichkeiten für zwei Bedingungen `a` und `b`, rechts das Ergebnis: - -::: grafik l09-wahrheitstabelle.svg -Grün ist true, rot ist false. Bei && gibt es nur eine grüne Zeile, bei || nur eine rote. -::: - -Merksätze: - -- `a && b` ist nur wahr, wenn **beide** wahr sind. -- `a || b` ist nur falsch, wenn **beide** falsch sind. -- `!a` dreht den Wert um. - -::: angeberwissen -Der Datentyp `boolean` heißt nach **George Boole**. Der Engländer hat schon 1847 gezeigt, dass man mit wahr und falsch rechnen kann wie mit Zahlen, fast hundert Jahre bevor es den ersten Computer gab. Heute steckt seine Logik in jedem Chip. -::: - -## Wahrheitswerte in Variablen - -Das Ergebnis einer Bedingung ist ein **Wahrheitswert** vom Typ `boolean`. Du kannst ihn wie eine Zahl in einer Variablen speichern und später benutzen: - -``` -boolean wochenende = tag == 6 || tag == 7 -``` - -In der Verzweigung steht dann nur noch `wochenende`. Das liest sich fast wie ein Satz: „Wenn Wochenende, dann …“. Schreibe nicht `wochenende == true`, denn `wochenende` ist ja schon true oder false. - -Mit `!wochenende` fragst du nach dem Gegenteil, also nach einem Werktag. - -::: ludwig -Lange Bedingungen werden übersichtlich, wenn du Teile davon in boolean-Variablen mit sprechenden Namen packst, zum Beispiel `boolean jugendlich = alter >= 12 && alter < 18`. -::: - -## Spiel: Wahr oder falsch? - -Jetzt bist du dran. Rechne jede Bedingung im Kopf aus. Nach jeder Antwort siehst du, wie VisuStruct sie Schritt für Schritt auswertet. - -::: spiel -alter: 8..20 -tag: 1..7 -note: 0..7 -schueler: boolean -wochenende: boolean -? alter >= 18 -? tag == 6 -? note != 3 -? alter >= 12 && alter < 18 -? tag == 6 || tag == 7 -? schueler && wochenende -? !schueler -? note >= 1 && note <= 6 -? !(alter < 18) -? schueler || alter >= 18 -? (alter >= 12 && alter < 18) || schueler -? !(note >= 1 && note <= 6) -? !wochenende && tag != 3 -? alter >= 12 && alter < 18 && !schueler -::: - -## Übung: Schaltjahr - -::: übung l08-schaltjahr -titel: Schaltjahr -auftrag: Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, aber nicht durch 100. Jahre, die durch 400 teilbar sind, sind trotzdem Schaltjahre. -Frage eine Jahreszahl ab und gib **Schaltjahr** oder **kein Schaltjahr** aus. -test: 2024 -> Schaltjahr -test: 2023 -> kein Schaltjahr -test: 1900 -> kein Schaltjahr -test: 2000 -> Schaltjahr -braucht: verzweigung -tipp: Prüfe die Regel zuerst an Beispielen: 2024 ist ein Schaltjahr, 1900 nicht, 2000 schon. Teilbar heißt: Der Rest ist 0. -tipp: Teilbar durch 4 heißt `jahr % 4 == 0`, nicht teilbar durch 100 heißt `jahr % 100 != 0`. Verbinde diese beiden mit `&&`, setze Klammern darum und hänge mit `||` den Fall für 400 an. -tipp: Fast die Lösung: Eine einzige Verzweigung mit der Bedingung `(jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0`. Im true-Zweig steht `output: "Schaltjahr"`, im false-Zweig `output: "kein Schaltjahr"`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Jetzt in Java - -Das Jugendticket vom Anfang sieht in Java so aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie alt bist du?"); -int alter = scanner.nextInt(); -if (alter >= 12 && alter < 18) { - System.out.println("Jugendticket"); -} else { - System.out.println("Kein Jugendticket"); -} -``` - -Die Zeichen `&&`, `||` und `!` sind genau die, die du schon im Struktogramm benutzt. Sie kommen aus Java. Die ganze Bedingung steht wie immer in den runden Klammern nach `if`. - -::: übung l09-java-schule -titel: Schule oder Freizeit -code: java -auftrag: Schreibe ein Java-Programm, das nach der Stunde fragt (0 bis 23). Von 8 bis einschließlich 15 Uhr gibt es **Schule** aus, sonst **Freizeit**. -test: 8 -> Schule -test: 15 -> Schule -test: 16 -> Freizeit -test: 7 -> Freizeit -braucht: verzweigung -tipp: Die Stunde muss zwei Bedingungen gleichzeitig erfüllen. Welcher Operator heißt „und“? -tipp: `if (stunde >= 8 && stunde <= 15) { … } else { … }` -lösung: l09-java-schule-loesung.visustruct -::: - -## Lückentext: Bedingungen - -::: lückentext -titel: Note und Wochenende -auftrag: Ergänze die fehlenden Operatoren und Wörter. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Note?"); -int note = scanner.nextInt(); -if (note >= 1 [[&&]] note [[<=]] 6) { - System.out.println("gültige Note"); -} else { - System.out.println("ungültige Note"); -} -System.out.println("Welcher Tag (1 bis 7)?"); -int tag = scanner.nextInt(); -[[boolean]] wochenende = tag == 6 [[||]] tag == 7; -if ([[!]]wochenende) { - System.out.println("Schultag"); -} -``` -erklärung: Eine Note ist gültig, wenn **beide** Bedingungen stimmen, also `&&`. Wochenende ist, wenn **eine** der beiden stimmt, also `||`. Das Ergebnis passt in eine `boolean`-Variable, und `!` dreht es um. -::: - -## Fehler finden: Schulfrei - -::: übung l09-java-fehler -titel: Schulfrei reparieren -code: java -auftrag: Das Programm soll bei Tag 6 (Samstag) und Tag 7 (Sonntag) **schulfrei** ausgeben, sonst **Schule**. Es gibt aber immer **Schule** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l09-java-fehler-start.visustruct -test: 6 -> schulfrei -test: 7 -> schulfrei -test: 3 -> Schule -test: 1 -> Schule -braucht: verzweigung -tipp: Kann `tag` gleichzeitig 6 **und** 7 sein? -tipp: Es reicht, wenn eine der beiden Bedingungen stimmt: `tag == 6 || tag == 7`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l09-java-laeuft-nicht -titel: Wochenende reparieren -code: java -auftrag: Tag 6 ist Samstag, Tag 7 ist Sonntag. Heute ist Tag 7, also soll **schulfrei** erscheinen. Das Programm läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> schulfrei -braucht: verzweigung -tipp: Die Bedingung besteht aus zwei Teilen. Vergleiche in beiden Teilen den Namen der Variablen. -tipp: Auch im zweiten Teil heißt die Variable `tag` mit kleinem t: `if (tag == 6 || tag == 7) {` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, wann eine Verknüpfung mit && wahr ist. → Und: && -- Ich kann erklären, wann eine Verknüpfung mit || wahr ist. → Oder: || -- Ich kann eine Bedingung mit ! umdrehen. → Nicht und Klammern -- Ich kann prüfen, ob ein Wert in einem Bereich wie 1 bis 6 liegt. → Wertebereiche prüfen -- Ich kann die Wahrheitstabelle für &&, || und ! lesen. → Die Wahrheitstabelle -- Ich kann das Ergebnis einer Bedingung in einer boolean-Variablen speichern. → Wahrheitswerte in Variablen -- Ich kann zusammengesetzte Bedingungen sicher auswerten (im Spiel mindestens 8 von 10 richtig). → Spiel: Wahr oder falsch? -- Ich kann Bedingungen in Java mit && und || verknüpfen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wann ist `a && b` wahr? -→ Und: && -- [ ] Wenn a oder b wahr ist -- [x] Nur wenn a und b beide wahr sind -- [ ] Wenn genau eins von beiden wahr ist -> Bei && müssen beide Teile stimmen. Ist einer falsch, ist das Ganze falsch. - -? Die Variable tag hat den Wert 6. Was ergibt `tag == 6 || tag == 7`? -→ Oder: || -- [x] true -- [ ] false -> Bei || reicht es, wenn eine Seite wahr ist. - -? Mit welcher Bedingung prüfst du, ob zahl zwischen 10 und 20 liegt (beide eingeschlossen)? -→ Wertebereiche prüfen -- [ ] 10 <= zahl <= 20 -- [ ] zahl >= 10 || zahl <= 20 -- [x] zahl >= 10 && zahl <= 20 -> Mit || wäre jede Zahl erlaubt, denn jede Zahl ist größer als 10 oder kleiner als 20. - -? Was ergibt `!(5 > 3)`? -→ Nicht und Klammern -- [ ] true -- [x] false -> 5 > 3 ist wahr, und ! dreht das um. - -? Wie schreibst du in Java „alter ist mindestens 12 und kleiner als 18“? -→ Jetzt in Java -- [ ] if (12 <= alter < 18) -- [x] if (alter >= 12 && alter < 18) -- [ ] if (alter >= 12 || alter < 18) -> Jeder Vergleich steht für sich, verbunden mit `&&`. -::: diff --git a/web/lessons/de/10-fallauswahl.md b/web/lessons/de/10-fallauswahl.md deleted file mode 100644 index e1ceb0b1..00000000 --- a/web/lessons/de/10-fallauswahl.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -titel: Fallauswahl -bereich: Grundlagen -kurz: Je nach Wert einer Variablen einen von vielen Fällen ausführen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Fallauswahl einfügen, Fälle hinzufügen und Fallnamen ändern -- erklären, wann der Fall default ausgeführt wird -- entscheiden, ob eine Fallauswahl oder eine Verzweigung besser passt -- eine Fallauswahl in Java mit switch schreiben -::: - -## Viele Möglichkeiten, eine Variable - -Ein Getränkeautomat hat drei Tasten: 1 für Wasser, 2 für Saft, 3 für Kakao. Mit Verzweigungen brauchst du dafür drei ineinander geschachtelte Kästen. Das wird schnell breit und unübersichtlich. - -::: diagramm l09-verschachtelt.visustruct -Der Automat mit drei verschachtelten Verzweigungen. Jede Verzweigung prüft wieder dieselbe Variable wahl. -::: - -Immer wenn du **eine Variable** mit **mehreren festen Werten** vergleichst, geht es einfacher: mit der **Fallauswahl**. - -## So ist die Fallauswahl aufgebaut - -Oben im Kasten steht die Variable, nach der ausgewählt wird. Darunter steht für jeden Fall eine eigene Spalte. Über jeder Spalte steht der Wert, zu dem sie gehört. - -::: diagramm l09-automat.visustruct -Derselbe Automat als Fallauswahl. Hat wahl den Wert 2, wird nur die Spalte 2 ausgeführt. -::: - -- Die Simulation sucht den Fall, dessen Name genau zum Wert passt. -- Passt kein Fall, wird **default** ausgeführt. Dieser Fall steht immer ganz rechts. -- Danach geht es unter der Fallauswahl weiter. Es wird immer nur **ein** Fall ausgeführt. - -> Eine neue Fallauswahl hat die Fälle 1, 2 und default. Klicke einen Fall an, um im Objektinspektor seinen **Fallnamen** zu ändern. Mit **Weiteren Fall hinzufügen** bekommst du eine neue Spalte vor default. - -## Fälle mit Texten - -Die Fälle müssen keine Zahlen sein. Du kannst auch nach dem Inhalt einer `String`-Variablen auswählen. Als Fallname schreibst du dann den Text in Anführungszeichen, zum Beispiel `"rot"`. So erkennt man wie im Code, dass es ein Text ist. - -::: diagramm l09-ampel.visustruct -Eine Ampel: Je nach eingegebener Farbe erscheint ein anderer Hinweis. Probiere in der Simulation auch eine Farbe aus, die es nicht gibt. -::: - -Groß- und Kleinschreibung zählt: `Rot` passt nicht zum Fall `"rot"`. - -## Übung: Note in Worten - -::: übung l09-note -titel: Note in Worten -auftrag: Frage eine Note als ganze Zahl ab und gib sie in Worten aus: 1 sehr gut, 2 gut, 3 befriedigend, 4 ausreichend, 5 mangelhaft, 6 ungenügend. - Bei jeder anderen Zahl soll **Keine gültige Note** erscheinen. -test: 1 -> sehr gut -test: 4 -> ausreichend -test: 6 -> ungenügend -test: 9 -> Keine gültige Note -braucht: fallauswahl -tipp: Für viele feste Werte ist die Fallauswahl übersichtlicher als viele Verzweigungen. Jede Note bekommt ihren eigenen Fall. -tipp: Füge mit „Weiteren Fall hinzufügen“ so lange Fälle hinzu, bis du die Fälle 1 bis 6 und default hast. Oben in die Fallauswahl schreibst du `note`. -lösung: l09-note-loesung.visustruct -::: - -## Übung: Taschenrechner - -::: übung l09-rechner -titel: Taschenrechner -auftrag: Frage nacheinander eine ganze Zahl `a`, ein Rechenzeichen als `String` und eine zweite ganze Zahl `b` ab. - Bei `+`, `-` und `*` gibst du das Ergebnis aus. Bei jedem anderen Zeichen erscheint **Unbekanntes Rechenzeichen**. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Lies erst alle drei Werte ein. Danach entscheidet eine Fallauswahl über das Rechenzeichen, was gerechnet wird. -tipp: Lege vor der Fallauswahl `int ergebnis = 0` an. In jedem Fall rechnest du zum Beispiel `ergebnis = a + b` und gibst danach `ergebnis` aus. Die Fallnamen sind `"+"`, `"-"` und `"*"` in Anführungszeichen, weil das Rechenzeichen ein `String` ist. -tipp: Das Gerüst von oben nach unten: drei Eingaben (`int a`, `String zeichen`, `int b`), dann `int ergebnis = 0`, dann eine Fallauswahl über `zeichen`. Im Fall `"+"` stehen `ergebnis = a + b` und `output: ergebnis`, bei `"-"` und `"*"` genauso. Im Sonst-Fall steht `output: "Unbekanntes Rechenzeichen"`. -lösung: l09-rechner-loesung.visustruct -::: - -## Fallauswahl oder Verzweigung? - -Die Fallauswahl prüft nur, ob ein Wert **genau gleich** einem Fallnamen ist. Daraus folgt: - -- **Fallauswahl:** eine Variable, mehrere feste Werte. Beispiele: Menüauswahl, Wochentag als Zahl, Noten. -- **Verzweigung:** Bereiche und verknüpfte Bedingungen. Beispiele: `alter >= 18`, `temperatur < 0 || temperatur > 30`. - -Für „Alter ab 18“ brauchst du also weiter die Verzweigung. Du kannst nicht für jedes mögliche Alter einen eigenen Fall anlegen. - -## Jetzt in Java - -Der Getränkeautomat sieht in Java so aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 Wasser, 2 Saft, 3 Kakao"); -int wahl = scanner.nextInt(); -switch (wahl) { - case 1 -> { - System.out.println("Hier ist dein Wasser."); - } - case 2 -> { - System.out.println("Hier ist dein Saft."); - } - case 3 -> { - System.out.println("Hier ist dein Kakao."); - } - default -> { - System.out.println("Diese Taste gibt es nicht."); - } -} -``` - -- Nach `switch` steht in runden Klammern die Variable, die verglichen wird. -- Jeder Fall beginnt mit `case`, dem Wert und einem Pfeil `->`. Dahinter steht in geschweiften Klammern, was passieren soll. -- `default` ist der Sonst-Fall. Er läuft, wenn kein Wert passt. - -::: angeberwissen -Den Pfeil `case 1 ->` gibt es in Java erst seit 2020 (Java 14). Davor schrieb man `case 1:` und musste jeden Fall mit `break;` beenden. Wer das vergaß, lief einfach in den nächsten Fall weiter. Der Pfeil hat also sehr vielen Programmierern Ärger erspart. -::: - -::: übung l10-java-wuerfel -titel: Würfel in Worten -code: java -auftrag: Schreibe ein Java-Programm mit `switch`, das eine Zahl einliest. Bei 1 gibt es **eins** aus, bei 2 **zwei**, bei 3 **drei** und sonst **kenne ich nicht**. -test: 1 -> eins -test: 2 -> zwei -test: 3 -> drei -test: 7 -> kenne ich nicht -braucht: fallauswahl -tipp: Du brauchst drei `case`-Fälle und einen `default`-Fall. -tipp: `switch (zahl) { case 1 -> { System.out.println("eins"); } … default -> { System.out.println("kenne ich nicht"); } }` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Lückentext: switch - -::: lückentext -titel: Monate in Worten -auftrag: Ergänze die fehlenden Wörter und Zeichen der Fallauswahl. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welcher Monat (1 bis 3)?"); -int monat = scanner.nextInt(); -[[switch]] (monat) { - [[case]] 1 -> { - System.out.println("Januar"); - } - case 2 [[->]] { - System.out.println("Februar"); - } - [[case]] 3 -> { - System.out.println("März"); - } - [[default]] -> { - System.out.println("Kenne ich nicht"); - } -} -``` -erklärung: Nach `switch` steht die Variable in runden Klammern. Jeder Fall beginnt mit `case`, dem Wert und dem Pfeil `->`. `default` läuft, wenn kein Fall passt. -::: - -## Fehler finden: Rechner - -::: übung l10-java-fehler -titel: Rechner reparieren -code: java -auftrag: Der Rechner liest zwei Zahlen und eine Wahl ein: 1 plus, 2 minus, 3 mal. Bei 7, 3 und Wahl 2 soll **4** herauskommen, er rechnet aber **-4**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Gibt es nicht -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Plus und mal stimmen. Schau dir den Fall `case 2` genau an. -tipp: Beim Minus zählt die Reihenfolge: `a - b` statt `b - a`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l10-java-laeuft-nicht -titel: Note reparieren -code: java -auftrag: Ludwig hat die Note 2 geschrieben. Das Programm soll **gut** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> gut -braucht: fallauswahl -tipp: Welche Variable prüft die Fallauswahl? Steht sie genauso oben? -tipp: In der Klammer nach `switch` muss `note` mit kleinem n stehen: `switch (note) {` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Fall? - -::: spiel frage -titel: Spiel: Welcher Fall? -intro: Ludwig drückt Tasten am Getränkeautomaten und an anderen Fallauswahlen. Was passiert? Sechs Runden. - -runde: - int wahl = 2; - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - case 2 -> { System.out.println("Saft"); } - case 3 -> { System.out.println("Kakao"); } - default -> { System.out.println("Diese Taste gibt es nicht."); } - } -frage: Was wird ausgegeben? -- Wasser -- [x] Saft -- Diese Taste gibt es nicht. -> wahl ist 2, also läuft genau der Fall `case 2`. - -runde: - int wahl = 4; - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - case 2 -> { System.out.println("Saft"); } - case 3 -> { System.out.println("Kakao"); } - default -> { System.out.println("Diese Taste gibt es nicht."); } - } -frage: Was wird ausgegeben? -- Kakao -- nichts -- [x] Diese Taste gibt es nicht. -> Kein Fall passt zu 4, also läuft `default`. - -runde: - String tag = "montag"; - switch (tag) { - case "Montag" -> { System.out.println("Mathe"); } - case "Dienstag" -> { System.out.println("Sport"); } - default -> { System.out.println("frei"); } - } -frage: Was wird ausgegeben? -- Mathe -- Sport -- [x] frei -> Bei Texten zählt jeder Buchstabe: "montag" mit kleinem m ist nicht "Montag". - -runde: - int note = 0; - switch (note) { - case 1 -> { System.out.println("sehr gut"); } - case 2 -> { System.out.println("gut"); } - case 3 -> { System.out.println("befriedigend"); } - } -frage: Was wird ausgegeben? -- sehr gut -- [x] nichts -- befriedigend -> Kein Fall passt, und es gibt kein `default`. Dann passiert einfach nichts. - -runde: -frage: Du willst prüfen, ob `alter >= 18` ist. Was passt besser? -- [x] eine Verzweigung -- eine Fallauswahl -> Eine Fallauswahl vergleicht nur mit festen Werten. Für „größer oder gleich“ brauchst du eine Verzweigung. - -runde: -frage: Ein Würfel zeigt 1 bis 6, und für jede Zahl soll ein anderes Wort erscheinen. Was passt besser? -- eine Verzweigung -- [x] eine Fallauswahl -> Eine Variable, sechs feste Werte: genau dafür ist die Fallauswahl da. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Fallauswahl einfügen, Fälle hinzufügen und Fallnamen ändern. → So ist die Fallauswahl aufgebaut -- Ich kann erklären, wann der Fall default ausgeführt wird. → So ist die Fallauswahl aufgebaut -- Ich kann entscheiden, ob eine Fallauswahl oder eine Verzweigung besser passt. → Fallauswahl oder Verzweigung? -- Ich kann eine Fallauswahl in Java mit switch schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Die Variable tag hat den Wert 5. Es gibt die Fälle 1, 2, 3 und default. Was wird ausgeführt? -→ So ist die Fallauswahl aufgebaut -- [ ] Gar nichts -- [ ] Der Fall 3 -- [x] Der Fall default -> Kein Fallname passt zu 5, deshalb greift default. - -? Wie viele Fälle werden bei einem Durchlauf der Fallauswahl ausgeführt? -→ So ist die Fallauswahl aufgebaut -- [x] Genau einer -- [ ] Alle Fälle ab dem passenden -- [ ] Alle Fälle -> Nach dem passenden Fall geht es direkt unter der Fallauswahl weiter. - -? Wofür ist eine Fallauswahl NICHT geeignet? -→ Fallauswahl oder Verzweigung? -- [ ] Menüpunkt 1, 2 oder 3 auswählen -- [x] Prüfen, ob eine Temperatur über 30 Grad liegt -- [ ] Eine Farbe wie rot, gelb oder grün auswerten -> „Über 30“ ist ein Bereich. Dafür brauchst du eine Verzweigung mit einem Vergleich. - -? Du gibst bei der Ampel `Rot` ein, der Fall heißt `"rot"`. Was passiert? -→ So ist die Fallauswahl aufgebaut -- [ ] Der Fall `"rot"` wird ausgeführt. -- [x] Der Fall default wird ausgeführt. -- [ ] Die Simulation meldet einen Fehler. -> Groß- und Kleinschreibung zählt. Rot und rot sind verschiedene Texte. - -? Unter welchem Namen findest du die Fallauswahl auch in Schulbüchern? -→ So ist die Fallauswahl aufgebaut -- [ ] Bedingte Anweisung -- [ ] Sequenz -- [x] Mehrfachauswahl -> Aus vielen Fällen wird einer ausgewählt. Darum heißt sie auch Mehrfachauswahl. - -? Wie heißt in Java der Sonst-Fall einer Fallauswahl? -→ Jetzt in Java -- [ ] else -- [x] default -- [ ] case 0 -::: diff --git a/web/lessons/de/11-while-schleife.md b/web/lessons/de/11-while-schleife.md deleted file mode 100644 index 409538ba..00000000 --- a/web/lessons/de/11-while-schleife.md +++ /dev/null @@ -1,359 +0,0 @@ ---- -titel: While-Schleife -bereich: Grundlagen -kurz: Schritte wiederholen, solange eine Bedingung wahr ist. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die While-Schleife ihre Bedingung vor jedem Durchlauf prüft -- eine Zählvariable mit Startwert, Bedingung und Veränderung verwenden -- erkennen, wenn eine Schleife nie endet, und den Fehler beheben -- eine Schleife im Schreibtischtest Durchlauf für Durchlauf verfolgen -- eine While-Schleife in Java schreiben -::: - -## Wiederholen, solange etwas gilt - -Oft soll ein Programm etwas mehrmals tun. Statt denselben Kasten fünfmal hinzuschreiben, nimmst du eine **Schleife**. - -Die **While-Schleife** wiederholt ihren Inhalt, **solange** ihre Bedingung wahr ist. Die Bedingung steht oben im Kopf des Kastens. Der Inhalt steht eingerückt darunter, links von einer Klammer eingefasst. - -::: diagramm l10-countdown.visustruct -Ein Countdown: Solange zahl größer als 0 ist, wird zahl ausgegeben und um 1 kleiner. Danach erscheint Start! -::: - -## Die Bedingung kommt zuerst - -Die While-Schleife ist **kopfgesteuert**. Vor **jedem** Durchlauf wird die Bedingung geprüft: - -1. Bedingung prüfen. -2. Ist sie wahr, den Inhalt einmal ausführen und wieder bei 1 anfangen. -3. Ist sie falsch, geht es unter der Schleife weiter. - -::: grafik l10-kopfgesteuert.svg -Nach jedem Durchlauf geht es zurück zur Bedingung. Erst wenn sie false ist, geht es unter der Schleife weiter. -::: - -Im Countdown wird die Bedingung viermal geprüft: bei 3, 2 und 1 ist sie wahr, bei 0 ist sie falsch. - -> Ist die Bedingung schon beim ersten Prüfen falsch, wird der Inhalt **kein einziges Mal** ausgeführt. Starte den Countdown mit `int zahl = 0`, dann erscheint nur Start! - -## Eine Zählvariable - -Viele Schleifen zählen mit. Dafür brauchst du drei Dinge: - -- **Startwert vor der Schleife**, z. B. `int i = 1` -- **Bedingung im Kopf**, z. B. `i <= 5` -- **Veränderung im Inhalt**, z. B. `i = i + 1` (kurz `i++`) - -Fehlt einer dieser Teile, zählt die Schleife falsch oder gar nicht. - -::: angeberwissen -Zählschleifen sind uralt! Im Artikel von 1973 haben Nassi und Shneiderman ihre Idee unter anderem an der **Fakultät** gezeigt: 5! = 1 · 2 · 3 · 4 · 5 = 120. Hier ist meine Ziegen-Version davon. Probier sie mit **Schritt** in der Simulation aus und schau zu, wie `fakultaet` wächst. Määäh, das geht schnell! -::: - -::: diagramm l10-fakultaet.visustruct -Die Fakultät mit einer Zählvariable `i`, nachgebaut nach einem Beispiel aus dem Artikel von 1973. -::: - -## Übung: Zählen bis n - -::: übung l10-bis-n -titel: Zählen bis n -auftrag: Frage eine ganze Zahl `n` ab und gib alle Zahlen von 1 bis `n` aus, jede in einer eigenen Zeile. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: Du brauchst eine Zählvariable, die bei 1 beginnt und in jedem Durchlauf um 1 wächst. -tipp: Lege vor der Schleife `int i = 1` an. Die Bedingung ist `i <= n`. Im Inhalt gibst du `i` aus und erhöhst danach `i` um 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Vorsicht, Endlosschleife - -Wenn sich im Inhalt nichts an der Bedingung ändert, bleibt sie für immer wahr. Die Schleife hört nie auf. Das nennt man **Endlosschleife**. - -::: diagramm l10-endlos.visustruct -Hier fehlt zahl = zahl - 1. Die Schleife gibt immer wieder 3 aus und erreicht Start! nie. -::: - -Frage dich bei jeder Schleife: **Was im Inhalt sorgt dafür, dass die Bedingung irgendwann falsch wird?** Beim Prüfen einer Übung bricht VisuStruct nach sehr vielen Schritten ab und meldet eine mögliche Endlosschleife. - -## Übung: Verdoppeln bis 100 - -::: übung l10-verdoppeln -titel: Verdoppeln bis 100 -auftrag: Frage eine ganze Zahl ab. Verdopple sie so lange, bis sie mindestens 100 ist. - Gib am Ende aus, **wie oft** du verdoppelt hast. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: Die Schleife läuft, solange die Zahl noch zu klein ist. Zähle nebenbei mit, wie oft sie gelaufen ist. -tipp: Du brauchst eine zweite Variable `int schritte = 0`. Die Bedingung lautet `zahl < 100`. Im Inhalt verdoppelst du die Zahl mit `zahl = zahl * 2` und erhöhst `schritte` um 1. Ist die Zahl schon 100, läuft die Schleife gar nicht. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Schleifen im Schreibtischtest - -Bei einer Schleife wird der **Schreibtischtest** besonders wertvoll. Du siehst genau, wie oft die Schleife läuft und mit welchem Wert sie aufhört. Jede Prüfung der Bedingung bekommt eine eigene Zeile. - -::: diagramm l16-schreibtisch.visustruct -Eine While-Schleife zählt die Zahlen 1, 2 und 3 zusammen. -::: - -| Schritt | summe | i | Ausgabe | -|---|---|---|---| -| `int summe = 0` | 0 | – | | -| `int i = 1` | 0 | 1 | | -| `i <= 3` → wahr | 0 | 1 | | -| `summe = summe + i` | 1 | 1 | | -| `i = i + 1` | 1 | 2 | | -| `i <= 3` → wahr | 1 | 2 | | -| `summe = summe + i` | 3 | 2 | | -| `i = i + 1` | 3 | 3 | | -| `i <= 3` → wahr | 3 | 3 | | -| `summe = summe + i` | 6 | 3 | | -| `i = i + 1` | 6 | 4 | | -| `i <= 3` → falsch | 6 | 4 | | -| `output: summe` | 6 | 4 | 6 | - -Häufige Fehler in Schleifen sind: - -- Die Schleife läuft **einmal zu oft oder zu wenig**, z. B. `<` statt `<=`. -- Eine Variable wird in der Schleife **nicht verändert** oder in die falsche Richtung. Dann endet die Schleife nie. -- Eine Variable bekommt ihren Startwert **in** der Schleife statt davor und wird bei jedem Durchlauf zurückgesetzt. - -## Übung: Countdown reparieren - -::: übung l16-countdown -titel: Countdown reparieren -auftrag: Der Countdown soll vom Startwert herunterzählen und am Ende **Los!** ausgeben. Bei 3 also 3, 2, 1, Los! - Im Startdiagramm stecken zwei Fehler. Finde und behebe beide. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Los! -test: 1 -> 1 | Los! -test: 0 -> Los! -tipp: Es gibt zwei Fehler. Einer betrifft das Zählen, der andere die Ausgabe am Ende. -tipp: Starte die Simulation mit Startwert 3 und beobachte i unter Variablen. Wird i kleiner? Vergleiche außerdem die letzte Ausgabe genau mit dem Auftrag. -lösung: l16-countdown-loesung.visustruct -::: - -## Jetzt in Java - -Der Countdown vom Anfang dieser Lektion sieht in Java so aus: - -```java editor -int zahl = 3; -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -``` - -- Nach `while` steht die Bedingung in runden Klammern, wie bei `if`. -- Alles, was wiederholt wird, steht in geschweiften Klammern. Das ist der Rumpf der Schleife. -- Der Rumpf ist eingerückt. So erkennst du wie im Struktogramm, was zur Schleife gehört. - -::: übung l11-java-gerade -titel: Gerade Zahlen in Java -code: java -auftrag: Schreibe ein Java-Programm, das eine ganze Zahl `n` einliest und mit einer While-Schleife alle geraden Zahlen von 2 bis höchstens `n` ausgibt. Bei 7 also 2, 4 und 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: Du brauchst eine Zählvariable, die bei 2 beginnt. Die Schleife läuft, solange sie nicht größer als `n` ist. -tipp: `int zahl = 2;` vor der Schleife, dann `while (zahl <= n) { … }`. Im Rumpf gibst du `zahl` aus und erhöhst sie mit `zahl = zahl + 2;`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Lückentext: while - -::: lückentext -titel: Summe von 1 bis 10 -auftrag: Das Programm soll die Zahlen von 1 bis 10 zusammenzählen. Ergänze die fehlenden Wörter und Zeichen. -```java -int summe = 0; -int zahl = 1; -[[while]] (zahl [[<=]] 10) [[{]] - summe = summe + [[zahl]]; - [[zahl]] = zahl + 1; -} -System.out.println("Summe: " + summe); -``` -erklärung: Die Schleife läuft, solange `zahl` höchstens 10 ist. In jedem Durchlauf kommt `zahl` zur Summe dazu, danach wird `zahl` um 1 größer. Ohne diese Zeile wäre es eine Endlosschleife. Ausgabe: **Summe: 55** -::: - -## Fehler finden: Sparen - -::: übung l11-java-fehler -titel: Sparplan reparieren -code: java -auftrag: Ludwig spart jede Woche 5 Euro. Das Programm fragt nach dem Sparziel und soll ausgeben, nach wie vielen Wochen er es erreicht hat. Bei 50 Euro sind das 10 Wochen, das Programm sagt aber **Wochen: 11**. - Gehe den Code mit dem Einzelschritt durch und beobachte `geld` und `wochen`. Repariere den Fehler und klicke auf Prüfen. -start: l11-java-fehler-start.visustruct -test: 50 -> Wochen: 10 -test: 12 -> Wochen: 3 -test: 5 -> Wochen: 1 -test: 1 -> Wochen: 1 -braucht: whileSchleife -tipp: Wie viel Geld hat Ludwig, wenn die Schleife zum letzten Mal läuft? Muss er dann wirklich noch eine Woche sparen? -tipp: Gespart wird nur, solange das Ziel noch **nicht erreicht** ist: `while (geld < ziel)`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l11-java-laeuft-nicht -titel: Countdown reparieren -code: java -auftrag: Der Countdown soll **3**, **2**, **1** und dann **Start!** ausgeben. Er läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Start! -braucht: whileSchleife -tipp: Der Fehler steckt in der Schleife. Welche Variable soll ausgegeben werden, und wie heißt sie wirklich? -tipp: Gib `zahl` mit kleinem z aus: `System.out.println(zahl);` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Wie oft? - -::: spiel frage -titel: Spiel: Wie oft? -intro: Ludwig hat While-Schleifen geschrieben. Mach im Kopf den Schreibtischtest. Sechs Runden. - -runde: - int zahl = 3; - while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; - } - System.out.println("Start!"); -frage: Was wird ausgegeben? -- [x] 3\n2\n1\nStart! -- 3\n2\n1\n0\nStart! -- Start! -> Bei zahl gleich 0 ist `zahl > 0` falsch, die 0 wird also nicht mehr ausgegeben. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: Was wird ausgegeben? -- [x] nichts -- 10 -- 10 bis 4 -> Die Bedingung wird zuerst geprüft. 10 < 5 ist falsch, der Rumpf läuft kein einziges Mal. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: Was passiert? -- 1, 2 und 3 werden ausgegeben. -- [x] Die Schleife hört nie auf. -- Es wird nichts ausgegeben. -> i wird im Rumpf nie größer. Die Bedingung bleibt immer wahr: eine Endlosschleife. - -runde: - int zahl = 1; - while (zahl < 100) { - zahl = zahl * 2; - } - System.out.println(zahl); -frage: Was wird ausgegeben? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Erst bei 128 ist `zahl < 100` falsch. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: Was wird ausgegeben? -- 4 -- 5 -- [x] 6 -> i läuft 0, 2, 4, 6. Bei 6 ist `i < 5` falsch. Die 5 wird übersprungen. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: Wie oft läuft der Rumpf? -- 3-mal -- [x] 4-mal -- 10-mal -> Der Rumpf läuft bei i = 1, 4, 7 und 10. Danach ist i 13. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die While-Schleife ihre Bedingung vor jedem Durchlauf prüft. → Die Bedingung kommt zuerst -- Ich kann eine Zählvariable mit Startwert, Bedingung und Veränderung verwenden. → Eine Zählvariable -- Ich kann erkennen, wenn eine Schleife nie endet, und den Fehler beheben. → Vorsicht, Endlosschleife -- Ich kann eine Schleife im Schreibtischtest Durchlauf für Durchlauf verfolgen. → Schleifen im Schreibtischtest -- Ich kann eine While-Schleife in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet kopfgesteuert? -→ Die Bedingung kommt zuerst -- [x] Die Bedingung wird vor jedem Durchlauf geprüft. -- [ ] Die Bedingung wird nach jedem Durchlauf geprüft. -- [ ] Die Schleife läuft immer genau einmal. -> Der Kopf mit der Bedingung steht oben und wird zuerst ausgewertet. - -? `int i = 5`, danach eine While-Schleife mit der Bedingung `i < 3`. Wie oft läuft der Inhalt? -→ Die Bedingung kommt zuerst -- [x] Keinmal -- [ ] Einmal -- [ ] Dreimal -> Schon beim ersten Prüfen ist 5 < 3 falsch. - -? Warum endet eine Schleife mit der Bedingung `zahl > 0` nie, wenn im Inhalt nur `output: zahl` steht? -→ Vorsicht, Endlosschleife -- [ ] Weil output die Zahl vergrößert -- [x] Weil sich zahl nie ändert und die Bedingung wahr bleibt -- [ ] Weil die Bedingung falsch geschrieben ist -> Im Inhalt muss etwas passieren, das die Bedingung irgendwann falsch macht. - -? Wie nennt man Schleifen in Schulbüchern auch? -→ Die Bedingung kommt zuerst -- [x] Wiederholungsstrukturen -- [ ] Verzweigungen -- [ ] Unterprogramme -> Eine Schleife wiederholt Anweisungen. Darum heißt sie auch Wiederholungsstruktur. - -? Eine Schleife soll von 1 bis 5 zählen, läuft aber nur bis 4. Was ist der wahrscheinliche Fehler? -→ Eine Zählvariable -- [x] In der Bedingung steht i < 5 statt i <= 5. -- [ ] Die Schleife ist eine While-Schleife. -- [ ] Die Variable i heißt falsch. - -? Welche Zeile startet in Java eine While-Schleife richtig? -→ Jetzt in Java -- [ ] while zahl > 0 { -- [x] while (zahl > 0) { -- [ ] while (zahl > 0); -> Die Bedingung steht in runden Klammern, danach öffnet `{` den Rumpf. -::: diff --git a/web/lessons/de/12-do-while-schleife.md b/web/lessons/de/12-do-while-schleife.md deleted file mode 100644 index 2953f0b4..00000000 --- a/web/lessons/de/12-do-while-schleife.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -titel: Do-while-Schleife -bereich: Grundlagen -kurz: Erst ausführen, dann prüfen: Schleifen mit mindestens einem Durchlauf. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft -- erklären, warum der Inhalt mindestens einmal ausgeführt wird -- eine Eingabe so lange wiederholen lassen, bis sie gültig ist -- eine Do-while-Schleife in Java schreiben -::: - -## Erst machen, dann prüfen - -Die **Do-while-Schleife** ist **fußgesteuert**. Die Bedingung steht unten im Fuß des Kastens. Der Ablauf ist: - -1. Den Inhalt einmal ausführen. -2. Die Bedingung prüfen. -3. Ist sie wahr, wieder bei 1 anfangen. Ist sie falsch, geht es unter der Schleife weiter. - -::: grafik l11-vergleich.svg -Links prüft die While-Schleife zuerst, rechts führt die Do-while-Schleife zuerst aus. -::: - -Oben im Kasten steht `do`, unten im Fuß die Bedingung. Wenn du die Schleife anklickst, steht im Objektinspektor vor dem Textfeld das Wort `while`: Die Bedingung bedeutet „wiederhole, solange …“. - -> Die Bedingung sagt wie bei der While-Schleife, **wann wiederholt wird**. Solange sie wahr ist, läuft die Schleife weiter. - -::: angeberwissen -Python hat gar keine Do-while-Schleife. Wer dort „erst machen, dann prüfen“ will, schreibt `while True:` und verlässt die Schleife mit `break`. Java, C und JavaScript haben `do … while` dagegen schon seit Jahrzehnten. -::: - -## Mindestens ein Durchlauf - -Weil die Bedingung erst am Ende geprüft wird, läuft der Inhalt **immer mindestens einmal**. Das ist der wichtigste Unterschied zur While-Schleife. - -::: diagramm l11-einmal.visustruct -i ist 10 und damit nicht kleiner als 5. Trotzdem wird 10 einmal ausgegeben, denn geprüft wird erst danach. -::: - -Mit einer While-Schleife und derselben Bedingung `i < 5` würde hier gar nichts ausgegeben. - -## Typisch: Eingabe wiederholen - -Die Do-while-Schleife passt immer dann, wenn etwas zuerst passieren muss, bevor man es prüfen kann. Das beste Beispiel ist eine Eingabe: Erst wenn jemand etwas eingegeben hat, weißt du, ob es gültig ist. - -::: diagramm l11-eingabe-pruefen.visustruct -Die Frage kommt so lange wieder, bis eine Zahl von 1 bis 10 eingegeben wurde. Probiere in der Simulation zuerst 0 und dann 12 aus. -::: - -Die Bedingung beschreibt hier die **ungültige** Eingabe: `zahl < 1 || zahl > 10`. Solange die Eingabe ungültig ist, wird noch einmal gefragt. - -## Übung: Gültige Note - -::: übung l11-note -titel: Gültige Note -auftrag: Frage eine Note ab. Ist sie nicht zwischen 1 und 6, frage noch einmal. Ist sie gültig, gib sie aus, zum Beispiel **Deine Note: 3**. -test: 3 -> Deine Note: 3 -test: 0, 7, 2 -> Deine Note: 2 -test: 9, 6 -> Deine Note: 6 -test: -1, 1 -> Deine Note: 1 -braucht: doUntilSchleife -tipp: Die Note wird mindestens einmal abgefragt. Danach entscheidet die Bedingung, ob noch einmal gefragt wird. -tipp: Lege vor der Schleife `int note = 0` an. In die Schleife kommt die Eingabe `input: note "Note von 1 bis 6"`. Die Bedingung lautet `note < 1 || note > 6`. -lösung: l11-note-loesung.visustruct -::: - -## Übung: Summe bis 0 - -::: übung l11-summe -titel: Summe bis 0 -auftrag: Frage so lange Zahlen ab, bis eine 0 eingegeben wird. Gib danach die Summe aller eingegebenen Zahlen aus. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: Du brauchst eine Variable für die Summe, die vor der Schleife bei 0 beginnt. In jedem Durchlauf kommt die neue Zahl dazu. -tipp: Lege vor der Schleife `int summe = 0` und `int zahl = 0` an. In der Schleife fragst du `zahl` ab und rechnest `summe = summe + zahl`. Die 0 zu addieren schadet nicht. Die Schleife läuft weiter, solange `zahl != 0` ist. -tipp: Das Gerüst: `int summe = 0` und `int zahl = 0`, dann eine Do-while-Schleife mit der Bedingung `zahl != 0`. In ihr stehen die Eingabe von `zahl` und `summe = summe + zahl`. Unter der Schleife steht `output: summe`. -lösung: l11-summe-loesung.visustruct -::: - -## Jetzt in Java - -Die Schleife, die trotzdem einmal läuft, sieht in Java so aus: - -```java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -``` - -- Der Rumpf steht zwischen `do {` und `}`, die Bedingung kommt erst danach. -- Hinter `while (…)` steht hier ein **Semikolon**. Das ist anders als bei der While-Schleife. - -::: übung l12-java-verdoppeln -titel: Mindestens einmal verdoppeln -code: java -auftrag: Schreibe ein Java-Programm, das eine Startzahl einliest. Mit einer Do-while-Schleife wird sie verdoppelt und ausgegeben, solange sie kleiner als 100 ist. Auch eine Zahl ab 100 wird mindestens einmal verdoppelt: Aus 200 wird 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: Im Rumpf verdoppelst du die Zahl und gibst sie aus. Die Bedingung steht am Ende. -tipp: `do { zahl = zahl * 2; System.out.println(zahl); } while (zahl < 100);` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Lückentext: do-while - -::: lückentext -titel: Verdreifachen -auftrag: Die Zahl wird verdreifacht und ausgegeben, solange sie kleiner als 100 ist. Ergänze die fehlenden Wörter und Zeichen. -```java -int zahl = 1; -[[do]] { - zahl = zahl * 3; - System.out.println(zahl); -} [[while]] (zahl [[<]] 100)[[;]] -``` -erklärung: Der Rumpf steht zwischen `do {` und `}`, die Bedingung erst danach. Hinter `while (…)` steht bei der Do-while-Schleife ein Semikolon. Ausgabe: 3, 9, 27, 81 und 243. -::: - -## Fehler finden: Halbieren - -::: übung l12-java-fehler -titel: Halbieren reparieren -code: java -auftrag: Das Programm liest eine Startzahl ein und teilt sie mit einer Do-while-Schleife immer wieder ganzzahlig durch 2. Jedes Ergebnis wird ausgegeben, bis **0** erreicht ist. Bei 10 also 5, 2, 1 und 0. Die 0 fehlt aber. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: Welchen Wert hat `zahl`, nachdem die 1 ausgegeben wurde? Läuft die Schleife dann noch einmal? -tipp: Die Schleife soll weiterlaufen, solange die Zahl größer als 0 ist: `while (zahl > 0);` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l12-java-laeuft-nicht -titel: Verdoppeln reparieren -code: java -auftrag: Das Programm soll ab 1 immer verdoppeln, solange die Zahl kleiner als 20 ist: **1**, **2**, **4**, **8**, **16**. Es gibt nur die 1 aus und bleibt dann stehen. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: Die erste Runde läuft noch. Der Fehler kommt erst, wenn die Bedingung unten zum ersten Mal geprüft wird. -tipp: In der Bedingung muss `grenze` mit kleinem g stehen: `} while (zahl < grenze);` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Mindestens einmal? - -::: spiel frage -titel: Spiel: Mindestens einmal? -intro: While oder do-while? Ludwig zeigt dir Schleifen. Sag vorher, was passiert. Sechs Runden. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: Was wird ausgegeben? -- nichts -- [x] 10 -- 10 bis 4 -> Erst machen, dann prüfen: Der Rumpf läuft einmal, danach ist 11 < 5 falsch. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: Was wird ausgegeben? -- [x] nichts -- 10 -- 11 -> Bei der While-Schleife kommt die Bedingung zuerst. 10 < 5 ist falsch, also läuft gar nichts. - -runde: - int zahl = 200; - do { - zahl = zahl * 2; - } while (zahl < 100); - System.out.println(zahl); -frage: Was wird ausgegeben? -- 200 -- [x] 400 -- 800 -> Einmal wird auf jeden Fall verdoppelt. Danach ist 400 < 100 falsch. - -runde: - int zahl = 30; - do { - zahl = zahl * 2; - System.out.println(zahl); - } while (zahl < 100); -frage: Was wird ausgegeben? -- 60 -- [x] 60\n120 -- 60\n120\n240 -> Nach 60 ist 60 < 100 wahr, es geht weiter. Nach 120 ist Schluss. - -runde: -frage: Welche Zeile beendet eine Do-while-Schleife in Java richtig? -- [x] `} while (i < 5);` -- `} while (i < 5)` -- `while (i < 5) {` -> Hinter dem `while (…)` der Do-while-Schleife steht ein Semikolon. - -runde: -frage: Wofür nimmt man typischerweise eine Do-while-Schleife? -- [x] eine Eingabe wiederholen, bis sie gültig ist -- von 1 bis 10 zählen -- zwei Werte tauschen -> Gefragt wird mindestens einmal. Erst danach weiß man, ob die Eingabe gültig war. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft. → Erst machen, dann prüfen -- Ich kann erklären, warum der Inhalt mindestens einmal ausgeführt wird. → Mindestens ein Durchlauf -- Ich kann eine Eingabe so lange wiederholen lassen, bis sie gültig ist. → Typisch: Eingabe wiederholen -- Ich kann eine Do-while-Schleife in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet fußgesteuert? -→ Erst machen, dann prüfen -- [ ] Die Bedingung wird vor jedem Durchlauf geprüft. -- [x] Die Bedingung wird nach jedem Durchlauf geprüft. -- [ ] Die Schleife hat keine Bedingung. -> Die Bedingung steht im Fuß, also unten, und wird nach dem Inhalt ausgewertet. - -? Die Bedingung einer Do-while-Schleife ist von Anfang an falsch. Wie oft läuft der Inhalt? -→ Mindestens ein Durchlauf -- [ ] Keinmal -- [x] Genau einmal -- [ ] Endlos -> Der Inhalt läuft zuerst. Erst danach merkt die Schleife, dass sie aufhören soll. - -? Du willst eine Zahl von 1 bis 10 abfragen. Welche Bedingung gehört in den Fuß? -→ Typisch: Eingabe wiederholen -- [ ] `zahl >= 1 && zahl <= 10` -- [x] `zahl < 1 || zahl > 10` -- [ ] `zahl == 10` -> Wiederholt wird, solange die Eingabe ungültig ist, also kleiner als 1 oder größer als 10. - -? Wann ist eine Do-while-Schleife besser als eine While-Schleife? -→ Mindestens ein Durchlauf -- [x] Wenn der Inhalt auf jeden Fall einmal laufen muss, z. B. bei einer Eingabe -- [ ] Wenn die Schleife vielleicht gar nicht laufen soll -- [ ] Wenn man genau bis 10 zählen will - -? Was steht in Java am Ende einer Do-while-Schleife? -→ Jetzt in Java -- [ ] } while (bedingung) { -- [x] } while (bedingung); -- [ ] } until (bedingung); -> Nach der Bedingung kommt ein Semikolon. -::: diff --git a/web/lessons/de/13-for-schleife.md b/web/lessons/de/13-for-schleife.md deleted file mode 100644 index 231e7575..00000000 --- a/web/lessons/de/13-for-schleife.md +++ /dev/null @@ -1,337 +0,0 @@ ---- -titel: For-Schleife -bereich: Grundlagen -kurz: Mit Start, Bedingung und Schritt eine feste Anzahl von Durchläufen zählen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die drei Teile Start, Bedingung und Schritt der For-Schleife benennen -- erklären, in welcher Reihenfolge die drei Teile ausgeführt werden -- mit einer For-Schleife vorwärts, rückwärts und in größeren Schritten zählen -- eine For-Schleife in Java schreiben und ihre drei Felder erklären -::: - -## Zählen mit festem Plan - -In der While-Schleife hast du schon mitgezählt: Startwert vor der Schleife, Bedingung im Kopf, Veränderung im Inhalt. Die **For-Schleife** schreibt diese drei Teile zusammen in den Kopf. So siehst du auf einen Blick, wie gezählt wird. - -::: grafik l12-while-zu-for.svg animiert -Aus der While-Schleife wird eine For-Schleife: Start, Bedingung und Schritt wandern zusammen in den Kopf. -::: - -Wenn du eine For-Schleife anklickst, hat sie rechts drei Felder: - -- **Start:** `int i = 1` legt die Zählvariable an. -- **Bedingung:** `i <= 5` sagt, wie lange gezählt wird. -- **Schritt:** `i++` erhöht `i` nach jedem Durchlauf um 1. - -::: diagramm l12-eins-bis-fuenf.visustruct -Eine For-Schleife, die die Zahlen von 1 bis 5 ausgibt. -::: - -::: angeberwissen -Warum heißt die Zählvariable fast immer `i`? In der Mathematik steht `i` schon lange für einen Index. Und in FORTRAN, einer der ersten Programmiersprachen von 1957, waren alle Variablen, die mit I bis N anfingen, automatisch ganze Zahlen. Programmierer haben sich das bis heute nicht abgewöhnt. -::: - -## In welcher Reihenfolge? - -Die drei Teile kommen zu unterschiedlichen Zeiten dran: - -1. **Start** wird genau einmal ausgeführt, ganz am Anfang. -2. **Bedingung** wird vor jedem Durchlauf geprüft. Ist sie falsch, ist die Schleife fertig. -3. Nach dem Inhalt kommt der **Schritt**, dann wieder die Bedingung. - -::: grafik l12-for-ablauf.svg -Der Start kommt nur einmal dran. Danach wiederholen sich Bedingung, Inhalt und Schritt. -::: - -Die For-Schleife ist also kopfgesteuert wie die While-Schleife. Gehe das Beispiel in der Simulation mit **Schritt** durch und beobachte, wie sich `i` verändert. - -> Nimm die For-Schleife, wenn du schon vorher weißt, wie oft etwas passieren soll. Hängt das Ende von etwas ab, das erst während der Schleife passiert, zum Beispiel einer Eingabe, ist die While- oder Do-while-Schleife besser. - -## Beispiel: Summe von 1 bis n - -Eine For-Schleife eignet sich gut, um Zahlen aufzusummieren. Vor der Schleife steht `int summe = 0`. In jedem Durchlauf kommt die aktuelle Zahl `i` dazu. - -::: diagramm l12-summe.visustruct -Bei n = 4 rechnet die Schleife 0 + 1 + 2 + 3 + 4. Am Ende wird 10 ausgegeben. -::: - -## Andere Schritte - -Der Schritt muss nicht immer `i++` sein: - -- `i--` zählt rückwärts, zum Beispiel mit Start `int i = 10` und Bedingung `i >= 1`. -- `i = i + 2` springt in Zweierschritten, zum Beispiel 0, 2, 4, 6. - -Achte darauf, dass Start, Bedingung und Schritt zusammenpassen. Mit Start `int i = 1`, Bedingung `i >= 1` und Schritt `i++` wird die Bedingung nie falsch. - -::: übung l12-countdown -titel: Countdown -auftrag: Frage eine ganze Zahl `n` ab. Zähle mit einer For-Schleife von `n` rückwärts bis 1 und gib jede Zahl aus. Gib danach **Los!** aus. -test: 3 -> 3 | 2 | 1 | Los! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Los! -test: 1 -> 1 | Los! -braucht: forSchleife -tipp: Diesmal zählt die For-Schleife rückwärts. Überlege, wo sie beginnt, wann sie aufhört und wie sie zählt. -tipp: Start ist `int i = n`, die Bedingung `i >= 1` und der Schritt `i--`. Die Ausgabe Los! steht unter der Schleife, nicht darin. -lösung: l12-countdown-loesung.visustruct -::: - -## Übung: Einmaleins - -::: übung l12-einmaleins -titel: Einmaleins -auftrag: Frage eine Zahl ab und gib ihre Einmaleins-Reihe von 1 bis 10 aus. Jede Zeile sieht so aus: **3 x 1 = 3**, **3 x 2 = 6** und so weiter. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: Die Schleife zählt von 1 bis 10. In jedem Durchlauf gibst du eine Zeile der Reihe aus. -tipp: Rechne im Inhalt zuerst `int produkt = zahl * i`. Danach gibst du `zahl + " x " + i + " = " + produkt` aus. Denk an die Leerzeichen innerhalb der Anführungszeichen. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Übung: Summe reparieren - -::: übung l16-summe -titel: Summe reparieren -auftrag: Das Struktogramm soll alle Zahlen von 1 bis n zusammenzählen. Bei n = 4 soll also 1 + 2 + 3 + 4 = **10** herauskommen. Es gibt aber 6 aus. - Mache einen Schreibtischtest oder nutze **Schritt** und repariere den Fehler. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Gehe die Schleife mit n = 4 im Kopf oder mit **Schritt** durch. Welche Zahlen werden wirklich addiert? -tipp: Schau, mit welchem Wert von i die Schleife zuletzt läuft. Bei n = 4 muss auch i = 4 noch dazugezählt werden. -lösung: l16-summe-loesung.visustruct -::: - -## Jetzt in Java - -Die Summe von 1 bis n sieht in Java so aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Bis zu welcher Zahl?"); -int n = scanner.nextInt(); -int summe = 0; -for (int i = 1; i <= n; i++) { - summe = summe + i; -} -System.out.println(summe); -``` - -In den runden Klammern nach `for` stehen die drei Felder der For-Schleife, getrennt durch Semikolons: - -| Feld | In Java | Bedeutung | -|---|---|---| -| Startwert | `int i = 1` | `i` beginnt bei 1. | -| Bedingung | `i <= n` | Die Schleife läuft, solange das gilt. | -| Schritt | `i++` | Nach jedem Durchlauf wird `i` um 1 größer. | - -`i++` ist die Kurzform von `i = i + 1`. Rückwärts zählst du mit `i--`. - -::: übung l13-java-quadrate -titel: Quadratzahlen in Java -code: java -auftrag: Schreibe ein Java-Programm, das eine ganze Zahl `n` einliest und mit einer For-Schleife die Quadratzahlen von 1 bis `n` ausgibt, jede in einer eigenen Zeile. Bei 3 also 1, 4 und 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: Die Schleife zählt `i` von 1 bis `n`. Die Quadratzahl von `i` ist `i * i`. -tipp: `for (int i = 1; i <= n; i++) { … }` und im Rumpf `System.out.println(i * i);`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Lückentext: for - -::: lückentext -titel: Hoch- und runterzählen -auftrag: Die erste Schleife zählt die Zahlen von 1 bis 5 zusammen, die zweite zählt von 10 bis 0 rückwärts. Ergänze die fehlenden Wörter und Zeichen. -```java -int summe = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -``` -erklärung: In den runden Klammern stehen Startwert, Bedingung und Schritt, getrennt durch Semikolons. `i++` zählt hoch, `i--` zählt runter. Beim Rückwärtszählen bis 0 heißt die Bedingung `i >= 0`. -::: - -## Fehler finden: Einmaleins - -::: übung l13-java-fehler -titel: Einmaleins reparieren -code: java -auftrag: Das Programm fragt nach einer Reihe und soll sie vom 1-fachen bis zum 10-fachen ausgeben, bei 7 also 7, 14, … bis 70. Die 70 fehlt aber. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: Wie oft läuft die Schleife? Zähle nach, welche Werte `i` annimmt. -tipp: `i` soll auch den Wert 10 annehmen: `i <= 10` statt `i < 10`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l13-java-laeuft-nicht -titel: Treppe reparieren -code: java -auftrag: Ludwig klettert 5 Stufen hoch, jede ist 20 cm hoch. Das Programm soll **Höhe: 100 cm** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Höhe: 100 cm -braucht: forSchleife -tipp: Mit `hoehe` wird gerechnet, aber wo wird die Variable angelegt? Und mit welchem Wert startet Ludwig? -tipp: Lege `hoehe` vor der Schleife an: `int hoehe = 0;` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was das Programm tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sind die Teile einer Zeile umrandet, tippst du genau auf den falschen Teil, zum Beispiel nur auf `i++`. Acht Runden, je 25 Sekunden. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Soll 1, 2 und 3 ausgeben. -fehler: 2 -besser: System.out.println(i); -> Am Ende der Anweisung fehlt das Semikolon. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Soll 1 bis 5 ausgeben. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> Die drei Felder der For-Schleife werden mit Semikolons getrennt, nicht mit Kommas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Soll von 10 bis 1 rückwärts zählen. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> Mit `i++` wird `i` immer größer, die Bedingung `i >= 1` bleibt wahr: eine Endlosschleife. Rückwärts zählst du mit `i--`. - -runde: - int summe = 0; - for (int i = 1; i <= 4; i++) { - summe = i; - } - System.out.println(summe); -frage: Soll die Summe 1 + 2 + 3 + 4 = 10 ausgeben. -fehler: 3 -stelle: i -besser: summe = summe + i; -> `summe = i` überschreibt die Summe in jedem Durchlauf. Am Ende steht dort nur 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Määäh"); - } -frage: Soll genau fünfmal Määäh ausgeben. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> Von 0 bis einschließlich 5 sind es sechs Durchläufe. Wer bei 0 anfängt, nimmt `<`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Soll 1, 2 und 3 ausgeben. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> Java unterscheidet Groß- und Kleinbuchstaben: `System` schreibt man mit großem S. - -runde: - int zahl = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(zahl + " x " + i + " = " + zahl * zahl); - } -frage: Soll die Siebenerreihe ausgeben: 7 x 1 = 7, 7 x 2 = 14 und so weiter. -fehler: 3 -stelle: zahl * zahl -besser: System.out.println(zahl + " x " + i + " = " + zahl * i); -> `zahl * zahl` ist immer 49. Gerechnet werden muss `zahl * i`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Soll die geraden Zahlen 2, 4, 6, 8 und 10 ausgeben. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> `i + 2` rechnet nur, speichert aber nichts. Damit `i` wirklich wächst, braucht es `i = i + 2`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die drei Teile Start, Bedingung und Schritt der For-Schleife benennen. → Zählen mit festem Plan -- Ich kann erklären, in welcher Reihenfolge die drei Teile ausgeführt werden. → In welcher Reihenfolge? -- Ich kann mit einer For-Schleife vorwärts, rückwärts und in größeren Schritten zählen. → Andere Schritte -- Ich kann eine For-Schleife in Java schreiben und ihre drei Felder erklären. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie oft wird der Start einer For-Schleife ausgeführt? -→ In welcher Reihenfolge? -- [x] Genau einmal -- [ ] Vor jedem Durchlauf -- [ ] Nach jedem Durchlauf -> Der Start legt die Zählvariable einmal am Anfang an. - -? Start `int i = 0`, Bedingung `i < 3`, Schritt `i++`. Welche Werte hat i im Inhalt? -→ Zählen mit festem Plan -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> Bei i = 3 ist die Bedingung falsch, deshalb läuft der Inhalt dann nicht mehr. - -? Start `int i = 2`, Bedingung `i <= 10`, Schritt `i = i + 2`. Wie oft läuft der Inhalt? -→ Andere Schritte -- [ ] 4-mal -- [x] 5-mal -- [ ] 10-mal -> i nimmt die Werte 2, 4, 6, 8 und 10 an. - -? Wann passt eine For-Schleife am besten? -→ Zählen mit festem Plan -- [x] Wenn vorher feststeht, wie oft wiederholt wird -- [ ] Wenn so lange gefragt wird, bis eine Eingabe gültig ist -- [ ] Wenn nur ein einziger Wert geprüft wird - -? Was bedeutet `i++` in einer For-Schleife? -→ Zählen mit festem Plan -- [ ] i wird verdoppelt. -- [x] i wird um 1 größer. -- [ ] i wird ausgegeben. -> `i++` ist die Kurzform von `i = i + 1`. -::: diff --git a/web/lessons/de/14-verschachteln.md b/web/lessons/de/14-verschachteln.md deleted file mode 100644 index 62b0050d..00000000 --- a/web/lessons/de/14-verschachteln.md +++ /dev/null @@ -1,305 +0,0 @@ ---- -titel: Verschachteln -bereich: Grundlagen -kurz: Verzweigungen in Schleifen und Schleifen in Schleifen kombinieren. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Verzweigung in eine Schleife setzen -- eine Schleife in eine andere Schleife setzen -- erklären, dass die innere Schleife bei jedem Durchlauf der äußeren komplett durchläuft -- verschachtelte Schleifen und Verzweigungen in Java schreiben -::: - -## Bausteine ineinander - -Du kennst jetzt alle wichtigen Bausteine: Sequenz, Verzweigung, Fallauswahl und drei Arten von Schleifen. Richtig stark werden sie erst zusammen. - -Jeder Zweig und jeder Schleifeninhalt ist selbst wieder eine Sequenz. Dort darfst du jedes Element einsetzen, auch weitere Verzweigungen und Schleifen. Das nennt man **Verschachteln**. - -> Ziehe dazu ein Element einfach auf den Platzhalter ø im Inneren einer Schleife oder eines Zweigs. - -## Verzweigung in der Schleife - -Die Schleife geht alle Zahlen durch, die Verzweigung entscheidet bei jeder einzelnen Zahl, ob etwas passiert. So kannst du zum Beispiel zählen, wie viele gerade Zahlen es von 1 bis n gibt. - -::: diagramm l13-gerade-zaehlen.visustruct -Bei jedem Durchlauf prüft die Verzweigung mit i % 2 == 0, ob i gerade ist. Nur dann wird anzahl um 1 erhöht. Der false-Zweig bleibt leer. -::: - -Bei n = 7 sind das die Zahlen 2, 4 und 6, also wird 3 ausgegeben. - -## Übung: Gerade Eingaben zählen - -::: übung l13-gerade-eingaben -titel: Gerade Eingaben zählen -auftrag: Frage nacheinander genau **fünf** ganze Zahlen ab. Gib danach aus, wie viele davon gerade waren. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Fünfmal dasselbe tun heißt: Schleife. In jedem Durchlauf wird eine Zahl eingelesen und geprüft. -tipp: Eine For-Schleife von 1 bis 5. Im Inhalt steht zuerst die Eingabe `input: int zahl "Zahl eingeben"`, darunter eine Verzweigung mit `zahl % 2 == 0`. Im true-Zweig erhöhst du `anzahl` um 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## Schleife in der Schleife - -Steht eine Schleife in einer anderen, läuft die **innere Schleife bei jedem Durchlauf der äußeren komplett durch**. Damit kannst du Muster aus Zeilen und Spalten bauen. - -::: diagramm l13-dreieck.visustruct -Die äußere Schleife zählt die Zeilen. Die innere hängt so viele Sterne an den Text, wie die Zeilennummer angibt. Bei n = 3 entsteht ein Dreieck aus 1, 2 und 3 Sternen. -::: - -Mit `String text = ""` beginnt jede Zeile leer. `text = text + "*"` hängt einen Stern an. Erst wenn die Zeile fertig ist, wird sie ausgegeben. - -Erfahrene Programmierer nennen die Zählvariablen kurz `i` und `j`: außen `i`, innen `j`. Dann sieht es so aus, hier mit einer kleinen Einmaleins-Tabelle: - -::: grafik l13-verschachtelt-tabelle.svg animiert -Die äußere Schleife zählt mit `i` die Zeilen, die innere mit `j` die Zahlen in einer Zeile. Bei jeder neuen Zeile fängt `j` wieder bei 1 an. -::: - -## Übung: Rechteck - -::: übung l13-rechteck -titel: Rechteck -auftrag: Frage eine Breite und eine Höhe ab. Gib ein Rechteck aus `#` aus: so viele Zeilen wie die Höhe, und in jeder Zeile so viele `#` wie die Breite. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: Du brauchst zwei Schleifen ineinander: eine für die Zeilen und darin eine für die Zeichen einer Zeile. -tipp: Baue es wie das Dreieck. Der Unterschied: Die innere Schleife zählt immer bis `breite`, nicht bis zur Zeilennummer. Die äußere Schleife zählt bis `hoehe`. -tipp: Das Gerüst: Eingaben `breite` und `hoehe`. Äußere For-Schleife `int zeile = 1`, `zeile <= hoehe`, `zeile++`. Darin zuerst `String text = ""`, dann die innere For-Schleife `int spalte = 1`, `spalte <= breite`, `spalte++` mit `text = text + "#"`, und unter der inneren Schleife `output: text`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Den Überblick behalten - -Bei verschachtelten Diagrammen hilft dir die Darstellung: Was weiter innen steht, ist eingerückt und von seiner Schleife oder seinem Zweig umschlossen. - -- Lies von außen nach innen: Was wiederholt sich? Was wird bei jedem Durchlauf entschieden? -- Gib Zählvariablen sprechende Namen wie `zeile` und `spalte`. Zwei Schleifen dürfen nicht dieselbe Zählvariable verändern. -- Gehe ein Beispiel in der Simulation mit **Schritt** durch und beobachte die Variablen. - -::: angeberwissen -Genau dafür wurde das Struktogramm erfunden. Shneiderman fragte sich: Wenn man auf GOTO verzichten soll, warum dann nicht gleich auf die Pfeile im Flussdiagramm? Ergebnis: kein Pfeil-Spaghetti, und jeder Block bleibt brav in seinem Gatter. -::: - -## Jetzt in Java - -Das Zählen der geraden Zahlen sieht in Java so aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Bis zu welcher Zahl?"); -int n = scanner.nextInt(); -int anzahl = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - anzahl++; - } // Ende if -} // Ende for -System.out.println(anzahl); -``` - -Was im Struktogramm ineinander steckt, steht in Java in geschweiften Klammern ineinander. Jede Ebene ist vier Leerzeichen weiter eingerückt. Ist dein Code durcheinander, hilft der Knopf **Einrücken** oben im Bereich Code. - -Bei vielen schließenden Klammern `}` verliert man leicht den Überblick: Welche Klammer gehört zu welchem Block? Ein Kommentar dahinter sagt es dir, z. B. `} // Ende if` und `} // Ende for`. Das hilft dir auch, wenn du später weiterarbeitest. - -`anzahl++` ist die Kurzform von `anzahl = anzahl + 1`. - -::: übung l14-java-treppe -titel: Treppe aus Sternen -code: java -auftrag: Schreibe ein Java-Programm, das die Anzahl der Stufen einliest und eine Treppe aus Sternchen ausgibt. Bei 3 Stufen also `*`, `**` und `***`, jede Stufe in einer eigenen Zeile. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: Eine äußere Schleife zählt die Stufen. In jeder Stufe baut eine innere Schleife einen Text aus Sternchen zusammen. -tipp: In der äußeren Schleife: `String zeile = "";`, dann `for (int j = 1; j <= i; j++) { zeile = zeile + "*"; }` und danach `System.out.println(zeile);`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Lückentext: verschachteln - -::: lückentext -titel: Rechteck aus Sternen -auftrag: Das Programm gibt ein Rechteck aus 3 Zeilen mit je 4 Sternchen aus. Ergänze die fehlenden Wörter und Zeichen. -```java -for (int zeile = 1; zeile <= 3; zeile++) { - String text = [[""]]; - [[for]] (int spalte = 1; spalte [[<=]] 4; [[spalte++ | spalte += 1 | spalte = spalte + 1]]) { - text = text [[+]] "*"; - } - System.out.[[println]](text); -[[}]] -``` -erklärung: Die innere Schleife baut eine Zeile aus 4 Sternchen, die äußere wiederholt das dreimal. Jede Zeile beginnt mit einem leeren Text `""`. Die letzte Klammer schließt die äußere Schleife. -::: - -## Fehler finden: durch 3 teilbar - -::: übung l14-java-fehler -titel: Zählen reparieren -code: java -auftrag: Das Programm soll zählen, wie viele Zahlen von 1 bis `n` durch 3 teilbar sind, und **einmal** das Ergebnis ausgeben. Bei 10 also nur **Anzahl: 3**. Es gibt aber viel zu viele Zeilen aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l14-java-fehler-start.visustruct -test: 10 -> Anzahl: 3 -test: 3 -> Anzahl: 1 -test: 2 -> Anzahl: 0 -braucht: forSchleife, verzweigung -tipp: Achte auf die geschweiften Klammern: Steht die Ausgabe in der Schleife oder dahinter? -tipp: Verschiebe die Zeile `System.out.println("Anzahl: " + anzahl);` hinter die schließende Klammer der Schleife. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l14-java-laeuft-nicht -titel: Gerade Zahlen reparieren -code: java -auftrag: Das Programm soll die geraden Zahlen von 1 bis 10 ausgeben: **2**, **4**, **6**, **8**, **10**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: Der Fehler steckt ganz innen, in der Ausgabe. Wie heißt die Zählvariable der Schleife? -tipp: Die Zählvariable heißt `i` mit kleinem i: `System.out.println(i);` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Innen und außen - -::: spiel frage -titel: Spiel: Innen und außen -intro: Ludwig hat Bausteine ineinander gesteckt. Lies von außen nach innen und sag vorher, was passiert. Sechs Runden. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: Wie viele Sterne werden ausgegeben? -- 3 -- 5 -- [x] 6 -> Die innere Schleife läuft bei jedem der 3 Durchläufe der äußeren komplett durch: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Welche Zeile wird als vierte ausgegeben? -- 1 4 -- [x] 2 1 -- 2 2 -> Erst läuft j für i = 1 durch: 1 1, 1 2, 1 3. Danach beginnt j wieder bei 1, jetzt mit i = 2. - -runde: - int anzahl = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - anzahl++; - } - } - System.out.println(anzahl); -frage: Was wird ausgegeben? -- [x] 3 -- 10 -- 4 -> Die Verzweigung zählt nur 3, 6 und 9 mit. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("gerade"); - } else { - System.out.println(i); - } - } -frage: Was wird ausgegeben? -- 1\n2\n3\n4 -- [x] 1\ngerade\n3\ngerade -- gerade\ngerade -> Bei jeder Zahl entscheidet die Verzweigung neu: ungerade Zahlen selbst, gerade als Wort. - -runde: - for (int i = 1; i <= 3; i++) { - String zeile = ""; - for (int j = 1; j <= i; j++) { - zeile = zeile + "*"; - } - System.out.println(zeile); - } -frage: Was wird ausgegeben? -- ***\n***\n*** -- [x] *\n**\n*** -- ***\n**\n* -> Die innere Schleife läuft bis i. Darum wird jede Zeile einen Stern länger. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: Was passiert? -- 1 bis 3 wird dreimal ausgegeben. -- 1 bis 3 wird einmal ausgegeben. -- [x] Java meldet einen Fehler. -> Zwei Schleifen ineinander brauchen zwei verschiedene Zählvariablen, zum Beispiel `zeile` und `spalte`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Verzweigung in eine Schleife setzen. → Verzweigung in der Schleife -- Ich kann eine Schleife in eine andere Schleife setzen. → Schleife in der Schleife -- Ich kann erklären, dass die innere Schleife bei jedem Durchlauf der äußeren komplett durchläuft. → Schleife in der Schleife -- Ich kann verschachtelte Schleifen und Verzweigungen in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Die äußere Schleife läuft 3-mal, die innere 4-mal. Wie oft wird der Inhalt der inneren Schleife insgesamt ausgeführt? -→ Schleife in der Schleife -- [ ] 7-mal -- [x] 12-mal -- [ ] 4-mal -> Bei jedem der 3 äußeren Durchläufe läuft die innere Schleife 4-mal, also 3 · 4 = 12. - -? Woran erkennst du, ob eine Zahl gerade ist? -→ Verzweigung in der Schleife -- [ ] `zahl / 2 == 0` -- [x] `zahl % 2 == 0` -- [ ] `zahl == 2` -> % liefert den Rest beim Teilen. Bei geraden Zahlen ist der Rest beim Teilen durch 2 null. - -? In einer For-Schleife steht eine Verzweigung. Wie oft wird die Bedingung der Verzweigung geprüft? -→ Verzweigung in der Schleife -- [ ] Einmal -- [x] Einmal pro Durchlauf der Schleife -- [ ] Nur wenn sie wahr ist -> Die Verzweigung gehört zum Inhalt und kommt bei jedem Durchlauf dran. - -? Woran erkennst du in Java, was zu einer Schleife gehört? -→ Jetzt in Java -- [ ] An der Farbe -- [x] An den geschweiften Klammern und der Einrückung -- [ ] An den Semikolons -::: diff --git a/web/lessons/de/15-arrays.md b/web/lessons/de/15-arrays.md deleted file mode 100644 index ac126a3f..00000000 --- a/web/lessons/de/15-arrays.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -titel: Arrays -bereich: Grundlagen -kurz: Viele Werte unter einem Namen speichern, mit dem Index darauf zugreifen und sie mit einer Schleife durchlaufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Array mit Werten oder mit `new int[5]` anlegen -- erklären, dass der Index bei 0 beginnt und der letzte Index `length - 1` ist -- ein Array mit einer For-Schleife durchlaufen und füllen -- die Summe und das Maximum eines Arrays berechnen -- in Java ein Array anlegen und mit einer Schleife durchlaufen -::: - -## Viele Werte unter einem Namen - -Stell dir vor, du willst die Punkte von fünf Tests speichern. Mit fünf Variablen `punkte1` bis `punkte5` wird das schnell unübersichtlich. Ein **Array** ist eine Reihe von Fächern, die alle denselben Namen und denselben Datentyp haben. - -Du legst ein Array mit einer Anweisung an. Hinter den Datentyp schreibst du eckige Klammern `[]`: - -``` -int[] zahlen = {2, 4, 6, 8, 10} -String[] namen = {"Ada", "Ben", "Cem"} -``` - -Die Werte in den geschweiften Klammern stehen gleich in den Fächern. Du kannst auch ein leeres Array mit einer festen Anzahl von Fächern anlegen: - -``` -int[] punkte = new int[5] -String[] namen = new String[3] -``` - -Bei `new int[5]` stehen in allen fünf Fächern zuerst Nullen, bei `new String[3]` leere Texte. - -## Der Index beginnt bei 0 - -Jedes Fach hat eine Nummer, den **Index**. Gezählt wird ab **0**. Bei `int[] zahlen = {2, 4, 6, 8, 10}` gilt also: - -- `zahlen[0]` ist 2 -- `zahlen[1]` ist 4 -- `zahlen[4]` ist 10 - -::: grafik l14-array.svg -Fünf Fächer mit den Indizes 0 bis 4. Der Index steht über dem Fach, der Wert darin. -::: - -**Warum beginnt man bei 0?** In der Informatik ist der Index kein „wievieltes Fach“, sondern der **Abstand vom Anfang**. Das erste Fach liegt direkt am Anfang, also 0 Schritte entfernt. Das zweite liegt 1 Schritt entfernt, das dritte 2 Schritte. Du kennst das aus dem Aufzug: Das Erdgeschoss ist die **0**, der erste Stock liegt eine Etage darüber. - -Daraus folgt eine Regel, die du dir merken solltest: Bei 5 Fächern ist der **letzte Index 4**, also immer eins weniger als die Anzahl. - -::: angeberwissen -Dass ab 0 gezählt wird, ist ziemlich alt. Schon die Programmiersprache C von 1972 rechnet so: Der Computer kennt die Adresse des ersten Fachs und rechnet für `zahlen[i]` einfach „Anfang plus i Fächer weiter“. Bei i = 0 bleibt er am Anfang stehen, das spart eine Rechnung. Java, Python und JavaScript haben das übernommen. Ich zähle meine Hörner übrigens auch ab 0: Horn 0 links, Horn 1 rechts. -::: - -Mit dem Index liest du einen Wert oder schreibst einen neuen hinein: - -``` -output: zahlen[0] -zahlen[1] = 99 -``` - -> Ein Array mit 5 Fächern hat die Indizes 0 bis 4. `zahlen[5]` gibt es nicht. Die Simulation meldet dann einen ungültigen Ausdruck. - -## Die Länge eines Arrays - -Wie viele Fächer ein Array hat, verrät `zahlen.length`. Bei fünf Werten ist das 5. Der **letzte** Index ist deshalb immer `zahlen.length - 1`: - -``` -output: zahlen.length -output: zahlen[zahlen.length - 1] -``` - -Die zweite Zeile gibt den letzten Wert aus, egal wie lang das Array ist. VisuStruct versteht auch die Schreibweise `zahlen.length()`. - -::: übung l14-erster-letzter -titel: Erster und letzter Wert -auftrag: Lege das Array `int[] werte = {4, 8, 15, 16, 23, 42}` an. Gib danach in drei Zeilen aus: den ersten Wert, den letzten Wert und die Anzahl der Werte. - Für den letzten Wert sollst du die Länge benutzen und nicht einfach den Index 5 hinschreiben. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Gezählt wird ab 0. Das erste Fach hat also den Index 0. Und wie heißt der Index des letzten Fachs? -tipp: Der erste Wert ist `werte[0]`. Der letzte ist `werte[werte.length - 1]`. Die Anzahl ist `werte.length`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Ein Array mit der Schleife durchlaufen - -Seine Stärke zeigt ein Array zusammen mit einer **For-Schleife**. Die Zählvariable `i` läuft von 0 bis zum letzten Index und dient als Index: - -``` -int i = 0 -i < zahlen.length -i++ -``` - -Im ersten Durchlauf ist `i` gleich 0, im letzten gleich 4. Weil die Bedingung `i < zahlen.length` lautet, passt die Schleife zu jeder Länge. - -::: diagramm l14-array-durchlaufen.visustruct -Die For-Schleife gibt alle fünf Werte nacheinander aus. Schau in der Simulation unter Variablen zu, wie i von 0 bis 4 zählt. -::: - -So füllst du ein leeres Array auch mit Eingaben. Als Ziel der Eingabe schreibst du das Fach `namen[i]`: - -::: diagramm l14-namen-eingeben.visustruct -Drei Namen werden abgefragt und in die Fächer 0, 1 und 2 geschrieben. -::: - -::: übung l14-rueckwaerts -titel: Rückwärts ausgeben -auftrag: Lege ein Array für 4 ganze Zahlen an und lies die 4 Zahlen mit einer Schleife ein. Gib sie danach in **umgekehrter** Reihenfolge aus, jede in einer eigenen Zeile. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: Du brauchst zwei Schleifen: eine zum Einlesen von vorn nach hinten und eine zum Ausgeben von hinten nach vorn. -tipp: Mit `int[] zahlen = new int[4]` legst du das Array an. Die Eingabe lautet `input: zahlen[i] "Zahl eingeben"`. Für die zweite Schleife beginnst du bei `int i = zahlen.length - 1`, prüfst `i >= 0` und zählst mit `i--` herunter. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr** aus Wien war in den 1940er-Jahren ein berühmter Hollywood-Filmstar. In ihrer Freizeit erfand sie gern. 1942 bekam sie zusammen mit dem Komponisten George Antheil ein Patent auf eine Funkverbindung, die der Feind nicht stören sollte: Sender und Empfänger springen gemeinsam durch eine Liste von **88 Frequenzen**, so viele, wie ein Klavier Tasten hat. Die Liste stand auf einem Lochstreifen wie bei einem selbstspielenden Klavier. Beide gehen dieselbe Liste in derselben Reihenfolge durch, so wie deine Schleife mit `i` durch ein Array. Wer nur eine Frequenz abhört oder stört, bekommt fast nichts mit. - -Dieses **Frequenzsprungverfahren** (englisch *frequency hopping*) steckt heute zum Beispiel in Bluetooth. Ganz allein erfunden hat sie es nicht, es gab schon frühere Ideen. Ihr Patent gilt aber als wichtiger Vorläufer, und 1997 wurde sie dafür ausgezeichnet. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), Schauspielerin und Erfinderin, 1944 (Pressefoto: [unbekannt](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), gemeinfrei). -::: - -## Summe und Maximum - -Zwei Aufgaben kommen bei Arrays immer wieder vor: - -- **Summe:** Du beginnst mit `summe = 0` und zählst in der Schleife jeden Wert dazu. -- **Maximum:** Du merkst dir zuerst den Wert im Fach 0 als bisher größten. In der Schleife prüfst du jeden Wert. Ist er größer, wird er das neue Maximum. - -::: diagramm l14-summe-maximum.visustruct -Summe und Maximum in einem einzigen Durchlauf. Das Maximum beginnt mit punkte[0] und nicht mit 0, damit es auch bei negativen Zahlen stimmt. -::: - -::: übung l14-summe-max -titel: Summe und Maximum -auftrag: Lies 5 ganze Zahlen in ein Array ein. Gib danach **Summe: …** und in der nächsten Zeile **Maximum: …** aus. -test: 3, 9, 2, 9, 1 -> Summe: 24 | Maximum: 9 -test: 10, 20, 30, 40, 50 -> Summe: 150 | Maximum: 50 -test: -5, -2, -9, -1, -3 -> Summe: -20 | Maximum: -1 -braucht: forSchleife, verzweigung -tipp: Gehe das Array mit einer Schleife durch. Zähle jeden Wert zur Summe und merke dir den größten bisher gesehenen Wert. -tipp: Rechne Summe und Maximum in eigenen Variablen aus und gib sie erst am Ende aus, z. B. mit `output: "Summe: " + summe`. Beginnt dein Maximum bei 0, scheitert der dritte Test. -tipp: Das Gerüst: Array anlegen und mit einer Schleife einlesen. Dann `int summe = 0` und `int max = zahlen[0]`. Eine zweite Schleife rechnet `summe = summe + zahlen[i]`, und eine Verzweigung `zahlen[i] > max` setzt im true-Zweig `max = zahlen[i]`. Zum Schluss die beiden Ausgaben. -lösung: l14-summe-max-loesung.visustruct -::: - -## Jetzt in Java - -Das Durchlaufen eines Arrays sieht in Java so aus: - -```java editor -int[] zahlen = {2, 4, 6, 8, 10}; -for (int i = 0; i < zahlen.length; i++) { - System.out.println(zahlen[i]); -} -``` - -- `int[]` heißt „Array aus ganzen Zahlen“. Die Werte stehen in geschweiften Klammern. -- Ein leeres Array mit 5 Fächern legst du mit `new int[5]` an. -- `zahlen[i]` ist das Fach mit dem Index `i`, `zahlen.length` die Länge. - -Gibst du das ganze Array aus, also `System.out.println(zahlen);`, zeigt Java nicht die Zahlen. Du siehst nur einen Text wie `[I@1b6d3586`. Das ist die **Referenz**, also die Stelle, an der das Array im Speicher liegt. Den Inhalt zeigt erst `Arrays.toString(zahlen)`, das ergibt `[2, 4, 6, 8, 10]`. Dafür schreibst du ganz oben `import java.util.Arrays;`. - -::: übung l15-java-noten -titel: Notensumme in Java -code: java -auftrag: Lege in Java das Array `noten` mit den Werten 2, 3, 1 und 4 an. Zähle alle Noten mit einer For-Schleife zusammen und gib **Summe: 10** aus. -test: - -> Summe: 10 -braucht: forSchleife -tipp: Lege vor der Schleife `int summe = 0;` an. Die Schleife läuft von 0 bis `noten.length - 1`. -tipp: `int[] noten = {2, 3, 1, 4};`, dann `for (int i = 0; i < noten.length; i++) { summe = summe + noten[i]; }` und zum Schluss `System.out.println("Summe: " + summe);`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Lückentext: Arrays - -::: lückentext -titel: Das Maximum suchen -auftrag: Das Programm sucht den größten Wert im Array. Ergänze die fehlenden Wörter und Zeichen. -```java -[[int]][] werte = {3, 7, 1, 9, 4}; -int max = werte[0]; -[[for]] (int i = 1; i < werte.[[length]]; i++) { - if (werte[i] [[>]] max) { - max = werte[i]; - } -} -System.out.println("Maximum: " + max); -``` -erklärung: `int[]` ist ein Array aus ganzen Zahlen, `werte.length` seine Länge. `max` beginnt mit dem ersten Wert, die Schleife vergleicht alle weiteren damit. Ausgabe: **Maximum: 9** -::: - -## Fehler finden: Temperaturen - -::: übung l15-java-fehler -titel: Höchste Temperatur reparieren -code: java -auftrag: Im Januar wurden die Temperaturen -5, -2, -8 und -3 Grad gemessen. Das Programm soll die höchste ausgeben, also **Höchste Temperatur: -2**. Es behauptet aber 0 Grad, obwohl es so warm nie war. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l15-java-fehler-start.visustruct -test: - -> Höchste Temperatur: -2 -braucht: forSchleife, verzweigung -tipp: Mit welchem Wert beginnt `max`? Ist irgendeine der Temperaturen größer als dieser Startwert? -tipp: `max` muss mit einem Wert aus dem Array beginnen: `int max = temperaturen[0];` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l15-java-laeuft-nicht -titel: Punkte zusammenzählen -code: java -auftrag: Im Array `punkte` stehen 4, 7, 2 und 5. Das Programm soll alle zusammenzählen und **Summe: 18** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Summe: 18 -braucht: forSchleife -tipp: Der Code-Bereich unterstreicht das falsche Wort rot. Wie schreibt man die Länge eines Arrays? -tipp: `length` schreibt man ganz klein: `i < punkte.length` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler** rund um Arrays, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Sind die Teile einer Zeile umrandet, tippst du genau auf den falschen Teil. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - for (int i = 0; i <= zahlen.length; i++) { - System.out.println(zahlen[i]); - } -frage: Soll alle fünf Werte ausgeben. -fehler: 2 -stelle: i <= zahlen.length -besser: for (int i = 0; i < zahlen.length; i++) { -> Mit `<=` läuft i bis 5. Das Fach `zahlen[5]` gibt es nicht. - -runde: - String[] namen = {"Ada", "Ben", "Cem"}; - System.out.println(namen[1]); -frage: Soll den ersten Namen ausgeben, also Ada. -fehler: 2 -stelle: namen[1] -besser: System.out.println(namen[0]); -> Gezählt wird ab 0. `namen[1]` ist schon Ben. - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - System.out.println(zahlen[zahlen.length]); -frage: Soll den letzten Wert ausgeben, also 10. -fehler: 2 -stelle: zahlen[zahlen.length] -besser: System.out.println(zahlen[zahlen.length - 1]); -> Der letzte Index ist immer eins weniger als die Länge. - -runde: - int[] punkte = {3, 9, 2}; - int summe = 0; - for (int i = 0; i < punkte.length; i++) { - summe = punkte[i]; - } - System.out.println(summe); -frage: Soll die Summe 14 ausgeben. -fehler: 4 -stelle: punkte[i] -besser: summe = summe + punkte[i]; -> So überschreibt jeder Wert den vorigen, am Ende steht nur 2 in summe. - -runde: - int[] punkte = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < punkte.length; i++) { - if (punkte[i] > max) { - max = punkte[i]; - } - } - System.out.println(max); -frage: Soll das Maximum -2 ausgeben. -fehler: 2 -stelle: 0 -besser: int max = punkte[0]; -> Keine der Zahlen ist größer als 0, also bliebe max bei 0. Das Maximum beginnt deshalb mit dem ersten Fach. - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - for (int i = zahlen.length; i >= 0; i--) { - System.out.println(zahlen[i]); - } -frage: Soll die Werte rückwärts ausgeben, von 10 bis 2. -fehler: 2 -stelle: int i = zahlen.length -besser: for (int i = zahlen.length - 1; i >= 0; i--) { -> Rückwärts beginnt man beim letzten Index, und der ist `zahlen.length - 1`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Array mit Werten oder mit `new int[5]` anlegen. → Viele Werte unter einem Namen -- Ich kann erklären, dass der Index bei 0 beginnt und der letzte Index `length - 1` ist. → Der Index beginnt bei 0 -- Ich kann ein Array mit einer For-Schleife durchlaufen und füllen. → Ein Array mit der Schleife durchlaufen -- Ich kann die Summe und das Maximum eines Arrays berechnen. → Summe und Maximum -- Ich kann in Java ein Array anlegen und mit einer Schleife durchlaufen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was gibt `output: zahlen[2]` bei `int[] zahlen = {5, 10, 15, 20}` aus? -→ Der Index beginnt bei 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Gezählt wird ab 0: zahlen[0] ist 5, zahlen[1] ist 10, zahlen[2] ist 15. - -? Ein Array hat 8 Fächer. Welcher Index ist der letzte? -→ Der Index beginnt bei 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> Der letzte Index ist immer length - 1. - -? Welche Bedingung passt in eine For-Schleife, die alle Werte von `zahlen` durchläuft und bei `int i = 0` beginnt? -→ Ein Array mit der Schleife durchlaufen -- [x] i < zahlen.length -- [ ] i <= zahlen.length -- [ ] i > zahlen.length -> Mit <= würde die Schleife auch zahlen[length] lesen, und dieses Fach gibt es nicht. - -? Womit sollte das Maximum beginnen, bevor die Schleife startet? -→ Summe und Maximum -- [ ] Immer mit 0 -- [x] Mit dem ersten Wert des Arrays -- [ ] Mit der Länge des Arrays -> Beginnt es mit 0, wäre bei lauter negativen Zahlen 0 das Ergebnis, obwohl 0 gar nicht im Array steht. - -? Welches deutsche Wort wird oft für Array benutzt? -→ Viele Werte unter einem Namen -- [ ] Zweig -- [x] Feld -- [ ] Fall -> Ein Array heißt auf Deutsch oft Feld. Gemeint ist dasselbe: viele Fächer unter einem Namen. - -? Welche Zeile legt in Java ein Array mit drei Zahlen an? -→ Jetzt in Java -- [x] int[] zahlen = {1, 2, 3}; -- [ ] int zahlen = [1, 2, 3]; -- [ ] array zahlen = (1, 2, 3); -::: diff --git a/web/lessons/de/16-zweidimensionale-arrays.md b/web/lessons/de/16-zweidimensionale-arrays.md deleted file mode 100644 index 8e919c66..00000000 --- a/web/lessons/de/16-zweidimensionale-arrays.md +++ /dev/null @@ -1,317 +0,0 @@ ---- -titel: Zweidimensionale Arrays -bereich: Grundlagen -kurz: Werte in Zeilen und Spalten speichern, wie die Sitze in einem Kinosaal, und mit zwei verschachtelten Schleifen durchlaufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein 2D-Array anlegen und erklären, was die beiden Zahlen bedeuten -- ein Fach mit Reihe und Platz lesen und schreiben -- `sitze.length` und `sitze[0].length` unterscheiden -- erklären, in welcher Reihenfolge zwei verschachtelte Schleifen die Fächer besuchen -- in Java ein zweidimensionales Array anlegen und durchlaufen -::: - -## Ein Kinosaal als Tabelle - -Ein Kinosaal hat mehrere **Reihen**, und jede Reihe hat mehrere **Plätze**. Für jeden Sitz wollen wir uns merken, ob die Karte schon verkauft ist. Das ist eine Ja-oder-nein-Frage, also passt der Datentyp `boolean`: `true` heißt verkauft, `false` heißt frei. - -Ein normales Array ist eine einzige Reihe von Fächern. Für den Saal brauchen wir eine **Tabelle** mit Zeilen und Spalten. Das ist ein **zweidimensionales Array**, kurz 2D-Array. Du schreibst dafür zwei Paar eckige Klammern: - -``` -boolean[][] sitze = new boolean[3][5] -``` - -Das ergibt 3 Reihen mit je 5 Plätzen, also 15 Fächer. Am Anfang steht in allen Fächern `false`: Alle Plätze sind frei. - -::: grafik kino-saal.svg -Der erste Index ist die Reihe, der zweite der Platz. Beide werden ab 0 gezählt. -::: - -## Ein Fach ansprechen - -Für ein Fach brauchst du jetzt **zwei** Indizes: zuerst die Reihe, dann den Platz. - -``` -sitze[1][2] = true -``` - -Damit ist in Reihe 1 der Platz 2 verkauft. Gelesen wird genauso: `sitze[1][2]` ist jetzt `true`. - -Auch die Größe kannst du abfragen: - -- `sitze.length` ist die Anzahl der **Reihen**, hier 3. -- `sitze[0].length` ist die Anzahl der **Plätze** in Reihe 0, hier 5. - -::: diagramm kino-verkaufen.visustruct -Drei Karten werden verkauft. Danach gibt das Diagramm die Größe des Saals aus und ob Reihe 1, Platz 2 verkauft ist. Schau in der Simulation unter Variablen zu: sitze wird Zeile für Zeile angezeigt. -::: - -> Wie beim normalen Array gibt es kein Fach `sitze[3][0]`, denn die Reihen heißen 0, 1 und 2. Die Simulation meldet dann einen ungültigen Ausdruck. - -## Zwei Schleifen ineinander - -Um **alle** Plätze anzusehen, brauchst du zwei For-Schleifen ineinander: - -- Die **äußere Schleife** zählt die Reihe: `reihe` läuft von 0 bis 2. -- Die **innere Schleife** zählt den Platz: `platz` läuft von 0 bis 4. - -::: grafik kino-schleifen.svg -Blau ist die äußere Schleife, Orange die innere. Die Zahlen zeigen, in welcher Reihenfolge die Plätze drankommen. -::: - -Für jede Reihe läuft die innere Schleife einmal **komplett** durch. Erst wenn `platz` alle fünf Plätze besucht hat, zählt die äußere Schleife `reihe` um eins weiter. Danach beginnt `platz` wieder bei 0. So kommen alle 3 · 5 = 15 Plätze genau einmal dran. - -Die Bedingungen lauten `reihe < sitze.length` und `platz < sitze[reihe].length`. So passen die Schleifen zu jeder Saalgröße. - -::: diagramm kino-saalplan.visustruct -Der Saalplan: Für jede Reihe wird eine Zeile aus X (verkauft) und O (frei) zusammengesetzt und ausgegeben. Gehe es mit Schritt durch und beobachte, wie platz immer wieder von vorn beginnt, während reihe nur langsam weiterzählt. -::: - -::: angeberwissen -Jedes Handyfoto ist ein 2D-Array! Ein Foto mit 4000 · 3000 Pixeln hat 3000 Zeilen mit je 4000 Fächern, also 12 Millionen Pixel. In jedem Fach steht die Farbe eines Punkts. Wenn du ein Foto heller machst, läuft das Handy mit zwei verschachtelten Schleifen über alle Pixel. Mein Profilbild hat übrigens nur ein Fach: braun. -::: - -## Übung: Freie Plätze zählen - -::: übung kino-frei -titel: Freie Plätze zählen -auftrag: Im Startdiagramm sind schon drei Karten verkauft. Zähle mit zwei verschachtelten Schleifen, wie viele Plätze noch **frei** sind, und gib z. B. `Frei: 12` aus. -start: kino-frei-start.visustruct -test: - -> Frei: 12 -braucht: forSchleife, verzweigung -tipp: Du gehst wie beim Saalplan mit zwei Schleifen über alle Plätze. Statt etwas auszugeben, zählst du mit. -tipp: Lege vor den Schleifen `int frei = 0` an. Ein Platz ist frei, wenn `sitze[reihe][platz]` falsch ist. Die Bedingung dafür lautet `!sitze[reihe][platz]`. -lösung: kino-frei-loesung.visustruct -::: - -## Übung: Karte verkaufen - -::: übung kino-karte -titel: Karte verkaufen -auftrag: Das Startdiagramm fragt nach Reihe und Platz. Ist der Platz schon verkauft, gib `Schon verkauft` aus. Sonst markiere ihn als verkauft und gib z. B. `Verkauft: Reihe 0, Platz 4` aus. -start: kino-karte-start.visustruct -test: 1, 2 -> Schon verkauft -test: 0, 4 -> Verkauft: Reihe 0, Platz 4 -test: 2, 0 -> Verkauft: Reihe 2, Platz 0 -braucht: verzweigung -tipp: Zuerst wird geprüft, ob der Platz verkauft ist. Je nach Antwort passiert etwas anderes. -tipp: Hier brauchst du keine Schleife. Eine Verzweigung mit der Bedingung `sitze[reihe][platz]` genügt. Im false-Zweig setzt du das Fach auf `true`. -lösung: kino-karte-loesung.visustruct -::: - -## Übung: Einmaleins-Tabelle - -::: übung kino-einmaleins -titel: Einmaleins-Tabelle -auftrag: Lege `int[][] tabelle = new int[10][10]` an und fülle sie mit zwei Schleifen mit dem kleinen Einmaleins. Frage danach zwei Zahlen von 1 bis 10 ab und lies das Ergebnis aus der Tabelle, z. B. `3 · 4 = 12`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: Erst füllen zwei verschachtelte Schleifen die Tabelle, danach liest du nur ein einziges Fach aus. -tipp: Die Indizes laufen von 0 bis 9, die Zahlen aber von 1 bis 10. Darum steht im Fach `tabelle[i][j]` der Wert `(i + 1) * (j + 1)`, und für 3 · 4 liest du `tabelle[a - 1][b - 1]`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Jetzt in Java - -Der Kinosaal sieht in Java so aus: - -```java editor -boolean[][] sitze = new boolean[3][5]; -sitze[0][2] = true; -sitze[1][1] = true; -sitze[1][2] = true; -System.out.println("Reihen: " + sitze.length); -System.out.println("Plätze pro Reihe: " + sitze[0].length); -System.out.println("Reihe 1, Platz 2 verkauft? " + sitze[1][2]); -``` - -- Zwei Paar eckige Klammern `[][]` stehen für eine Tabelle: erst die Reihe, dann der Platz. -- `sitze.length` ist die Zahl der Reihen, `sitze[0].length` die Zahl der Plätze in einer Reihe. -- Mit festen Werten schreibst du jede Reihe in eigene geschweifte Klammern: `int[][] t = {{1, 2}, {3, 4}};` - -::: übung l16-java-punkte -titel: Punkte zusammenzählen -code: java -auftrag: Drei Spieler haben je zwei Runden gespielt. Lege in Java die Tabelle `punkte` mit den Reihen {3, 5}, {4, 1} und {2, 2} an. Zähle mit zwei verschachtelten For-Schleifen alle Punkte zusammen und gib **Summe: 17** aus. -test: - -> Summe: 17 -braucht: forSchleife -tipp: Die äußere Schleife geht durch die Reihen, die innere durch die Plätze einer Reihe. -tipp: `int[][] punkte = {{3, 5}, {4, 1}, {2, 2}};` und in der inneren Schleife `summe = summe + punkte[i][j];`. Die innere Schleife läuft bis `punkte[i].length`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Lückentext: Tabellen - -::: lückentext -titel: Alle Felder zusammenzählen -auftrag: Das Programm zählt alle Zahlen in der Tabelle zusammen. Ergänze die fehlenden Wörter und Zeichen. -```java -[[int]][][] feld = {{1, 2, 3}, {4, 5, 6}}; -int summe = 0; -for (int r = 0; r < feld.[[length]]; r++) { - for (int s = 0; s < feld[r].[[length]]; s++) { - summe = summe [[+]] feld[r][s]; - } -} -System.out.println("Summe: " + summe); -``` -erklärung: `int[][]` ist eine Tabelle. `feld.length` ist die Zahl der Reihen (2), `feld[r].length` die Zahl der Felder in Reihe `r` (3). Ausgabe: **Summe: 21** -::: - -## Fehler finden: Punkte - -::: übung l16-java-fehler -titel: Spieler 2 reparieren -code: java -auftrag: In der Tabelle `punkte` steht jede Reihe für einen Spieler. Das Programm soll die Punkte von Spieler 2 (Reihe 1) zusammenzählen, also **Spieler 2: 11**. Stattdessen meldet es einen Fehler. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l16-java-fehler-start.visustruct -test: - -> Spieler 2: 11 -braucht: forSchleife -tipp: Bei `punkte[a][b]` ist `a` die Reihe und `b` der Platz in der Reihe. Welche Zahl steht für die Reihe von Spieler 2? -tipp: Die Indizes sind vertauscht: `punkte[1][j]` statt `punkte[j][1]`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l16-java-laeuft-nicht -titel: Spielstand ablesen -code: java -auftrag: In der Tabelle `punkte` steht jede Reihe für einen Spieler, jede Spalte für eine Runde. Das Programm soll die Punkte von Spieler 2 in Runde 1 ausgeben, also **Spieler 2, Runde 1: 4**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Spieler 2, Runde 1: 4 -braucht: anweisung -tipp: Die Fächer `[1][0]` stimmen. Schau dir den Namen der Tabelle an. -tipp: Die Tabelle heißt `punkte` mit kleinem p: `punkte[1][0]` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Platz? - -::: spiel frage -titel: Spiel: Welcher Platz? -intro: Ludwig verkauft Kinokarten. Erst die Reihe, dann der Platz, beide ab 0. Sieben Runden. - -runde: - boolean[][] sitze = new boolean[3][5]; - System.out.println(sitze.length); -frage: Was wird ausgegeben? -- [x] 3 -- 5 -- 15 -> `sitze.length` ist die Anzahl der Reihen. - -runde: - boolean[][] sitze = new boolean[3][5]; - System.out.println(sitze[0].length); -frage: Was wird ausgegeben? -- 3 -- [x] 5 -- 15 -> `sitze[0]` ist die Reihe 0. Ihre Länge ist die Anzahl der Plätze in dieser Reihe. - -runde: - int[][] tabelle = new int[4][6]; -frage: Wie viele Fächer hat die Tabelle? -- 10 -- [x] 24 -- 35 -> 4 Reihen mit je 6 Plätzen: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: Was wird ausgegeben? -- 2 -- [x] 3 -- 4 -> Reihe 1 ist `{3, 4}`, darin Platz 0 die 3. - -runde: - boolean[][] sitze = new boolean[3][5]; - sitze[3][0] = true; -frage: Was passiert? -- Der erste Platz in Reihe 3 ist verkauft. -- Der erste Platz in der letzten Reihe ist verkauft. -- [x] Es gibt einen Fehler, denn die Reihen heißen 0, 1 und 2. -> Wie beim normalen Array ist der letzte Index eins weniger als die Länge. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int summe = 0; - for (int reihe = 0; reihe < t.length; reihe++) { - for (int platz = 0; platz < t[reihe].length; platz++) { - summe = summe + t[reihe][platz]; - } - } - System.out.println(summe); -frage: Was wird ausgegeben? -- 6 -- 15 -- [x] 21 -> Die zwei Schleifen besuchen alle sechs Fächer: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Zwei Schleifen gehen den Saal `new boolean[3][5]` durch. Welches Fach kommt direkt nach `sitze[0][4]`? -- `sitze[0][5]` -- [x] `sitze[1][0]` -- `sitze[1][4]` -> Reihe 0 ist fertig. Die äußere Schleife zählt weiter, und der Platz beginnt wieder bei 0. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein 2D-Array anlegen und erklären, was die beiden Zahlen bedeuten. → Ein Kinosaal als Tabelle -- Ich kann ein Fach mit Reihe und Platz lesen und schreiben. → Ein Fach ansprechen -- Ich kann `sitze.length` und `sitze[0].length` unterscheiden. → Ein Fach ansprechen -- Ich kann erklären, in welcher Reihenfolge zwei verschachtelte Schleifen die Fächer besuchen. → Zwei Schleifen ineinander -- Ich kann in Java ein zweidimensionales Array anlegen und durchlaufen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie viele Fächer hat `boolean[][] sitze = new boolean[4][6]`? -→ Ein Kinosaal als Tabelle -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 Reihen mit je 6 Plätzen: 4 · 6 = 24. - -? Was steht nach `new boolean[3][5]` in allen Fächern? -→ Ein Kinosaal als Tabelle -- [ ] true -- [x] false -- [ ] Nichts, die Fächer sind leer -> Ein neues boolean-Array ist mit false gefüllt. Im Kino heißt das: alle Plätze frei. - -? Zwei verschachtelte Schleifen laufen über 3 Reihen mit 5 Plätzen. Wie oft wird der Inhalt der **inneren** Schleife ausgeführt? -→ Zwei Schleifen ineinander -- [ ] 3-mal -- [ ] 8-mal -- [x] 15-mal -> Für jede der 3 Reihen läuft die innere Schleife 5-mal: 3 · 5 = 15. - -? Ordne zu, was der Ausdruck im Kinosaal bedeutet. -→ Ein Fach ansprechen -= sitze.length -> Anzahl der Reihen -= sitze[0].length -> Anzahl der Plätze in Reihe 0 -= sitze[2][4] -> Reihe 2, Platz 4 -= sitze[1][0] = true -> In Reihe 1 ist Platz 0 verkauft - -? Was gibt `sitze.length` bei `new boolean[3][5]` an? -→ Ein Fach ansprechen -- [x] 3, die Zahl der Reihen -- [ ] 5, die Zahl der Plätze -- [ ] 15, alle Plätze zusammen -::: diff --git a/web/lessons/de/17-zeichenketten.md b/web/lessons/de/17-zeichenketten.md deleted file mode 100644 index cf127b50..00000000 --- a/web/lessons/de/17-zeichenketten.md +++ /dev/null @@ -1,528 +0,0 @@ ---- -titel: Zeichenketten -bereich: Grundlagen -kurz: Mit Texten arbeiten, also einzelne Zeichen lesen, Teile herausschneiden, suchen, vergleichen und zerlegen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass auch die Zeichen eines Strings ab 0 gezählt werden -- mit `length()` und `charAt(i)` arbeiten -- einen `char` von einem String unterscheiden und mit `(int)` und `(char)` den Zeichencode nutzen -- mit `substring` einen Teil aus einem Text schneiden -- `indexOf`, `contains`, `toUpperCase` und `equals` anwenden -- einen Text mit einer Schleife Zeichen für Zeichen durchgehen -- einen Text mit `split` in ein String-Array zerlegen -- in Java einen Text einlesen und mit `equals` vergleichen -- weitere Methoden wie `lastIndexOf`, `replace`, `compareTo` und `Integer.parseInt` anwenden -- einen Text aus einer Datei mit `split("\n")` in Zeilen zerlegen -- eine Methode in der Java-API nachschlagen und ihre Beschreibung lesen -::: - -## Text ist eine Reihe von Zeichen - -Einen `String` kennst du schon: `String name = "Ludwig"`. In der Informatik heißt so ein Text auch **Zeichenkette**, weil die Zeichen wie Perlen an einer Kette hintereinander hängen. Jedes Zeichen hat einen Platz mit einem Index, genau wie bei einem Array. Auch hier wird **ab 0 gezählt**: Das erste Zeichen ist 0 Schritte vom Anfang entfernt. - -::: grafik zk-zeichen.svg -Die acht Zeichen von „Geißbock“ mit ihren Indizes 0 bis 7. -::: - -Ein String bringt **Methoden** mit. Du schreibst den Namen der Variablen, einen Punkt und die Methode: - -- `wort.length()` liefert die Anzahl der Zeichen, hier 8. -- `wort.charAt(0)` liefert das Zeichen mit dem Index 0, hier `'G'`. - -> Bei Strings schreibst du `length()` **mit** Klammern, bei Arrays `length` **ohne**. Das ist in Java leider so. - -Das letzte Zeichen hat wie beim Array den Index `length() - 1`. - -## Ein einzelnes Zeichen: char - -Für ein einzelnes Zeichen hat Java einen eigenen Datentyp: **char**, kurz für englisch *character* (Zeichen). Ein `char` steht in **einfachen** Anführungszeichen, ein String in doppelten: - -- `'C'` ist ein `char`: genau ein Zeichen. -- `"C"` ist ein String: ein Text, der nur ein Zeichen lang ist. -- Ein `char` hat immer genau ein Zeichen. Einen leeren `char` wie `''` gibt es nicht, einen leeren String `""` schon. - -`charAt` liefert dir so ein Zeichen aus einem Text: - -``` -char erster = wort.charAt(0) -char letzter = wort.charAt(wort.length() - 1) -``` - -Zwei `char` vergleichst du mit `==`: `wort.charAt(0) == 'G'` ist `true`. - -Hinter jedem Zeichen steckt eine Zahl, sein **Zeichencode**. Welche Zahl zu welchem Zeichen gehört, steht in der ASCII-Tabelle: `'A'` hat den Code 65, `'B'` 66, `'C'` 67 und so weiter bis `'Z'` mit 90. Mit `(int)` bekommst du den Code eines Zeichens, mit `(char)` wird aus einem Code wieder ein Zeichen: - -``` -int code = (int) 'C' -code = code + 1 -char naechstes = (char) code -``` - -Danach ist `code` 68 und `naechstes` ist `'D'`. So verschiebst du einen Buchstaben im Alphabet, und genau das brauchst du später bei der Caesar-Verschlüsselung. - -## Teile herausschneiden - -Mit `substring` schneidest du einen Teil aus dem Text: - -- `wort.substring(0, 4)` liefert die Zeichen von Index 0 **bis vor** Index 4, also `"Geiß"`. -- `wort.substring(4)` liefert alles ab Index 4 bis zum Ende, also `"bock"`. - -Das Ende gehört **nicht** mehr dazu. Praktisch ist: `substring(0, 4)` liefert genau 4 Zeichen. - -::: diagramm zk-zeichen.visustruct -Alle Methoden aus dieser Lektion an einem Beispiel. Gehe es in der Simulation durch und vergleiche jede Ausgabe mit der Grafik. -::: - -## Suchen und vergleichen - -Weitere Methoden, die du oft brauchst: - -| Methode | Bedeutung | Beispiel mit `"Geißbock"` | -|---|---|---| -| `indexOf("bock")` | Wo beginnt der Text? | 4 | -| `indexOf("x")` | nicht gefunden | -1 | -| `contains("eiß")` | Kommt der Text vor? | true | -| `toUpperCase()` | alles groß | GEISSBOCK | -| `toLowerCase()` | alles klein | geißbock | -| `equals("Geißbock")` | gleicher Text? | true | - -> Zwei Strings vergleichst du in Java mit `equals`, nicht mit `==`. Zwei einzelne Zeichen (`char`) vergleichst du dagegen mit `==`, z. B. `wort.charAt(i) == 'e'`. - -::: angeberwissen -Probier mal `"Geißbock".toUpperCase()` aus. Heraus kommt GEISSBOCK, und das Wort ist plötzlich ein Zeichen **länger**! Ein großes ß gab es auf Schreibmaschinen nie, darum wird es zu SS. Erst seit 2017 ist das große ẞ offiziell erlaubt, aber Java bleibt beim SS. In meinem Namen kommt zum Glück kein ß vor, nur im Wort Geißbock. -::: - -## Zeichen für Zeichen - -Mit einer For-Schleife gehst du einen Text Zeichen für Zeichen durch. Der Index `i` läuft von 0 bis `wort.length() - 1`, genau wie bei einem Array: - -::: diagramm zk-zaehlen.visustruct -Zählt, wie oft der Buchstabe e vorkommt. Probiere in der Simulation „Kaffeebecher“ aus und beobachte i und anzahl. -::: - -## Zerlegen mit split - -Oft stehen mehrere Angaben in einer einzigen Zeile, getrennt durch ein Zeichen, z. B. `"Ludwig;Geißbock;7"`. Mit `split` zerlegst du die Zeile an diesem Zeichen. Heraus kommt ein **String-Array**: - -``` -String[] teile = zeile.split(";") -``` - -Danach ist `teile[0]` gleich `"Ludwig"`, `teile[1]` gleich `"Geißbock"` und `teile[2]` gleich `"7"`. Mit `teile.length` erfährst du, wie viele Teile es sind. - -::: diagramm zk-split.visustruct -Die Zeile wird am Semikolon zerlegt und jeder Teil mit seinem Index ausgegeben. -::: - -> So sind auch CSV-Dateien aufgebaut, die du aus Tabellenkalkulationen kennst: eine Zeile pro Datensatz, die Werte durch Semikolon getrennt. - -## Übung: Initialen - -::: übung zk-initialen -titel: Initialen -auftrag: Frage nach Vorname und Nachname und gib die Initialen aus. Bei Ludwig Geißbock also `L. G.` -test: Ludwig, Geißbock -> L. G. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: Die Initiale ist der erste Buchstabe eines Namens. Welche Methode liefert ein Zeichen an einer bestimmten Stelle? -tipp: Den ersten Buchstaben liefert `vorname.charAt(0)`. Die Ausgabe ist dann `vorname.charAt(0) + ". " + nachname.charAt(0) + "."` -lösung: zk-initialen-loesung.visustruct -::: - -## Übung: Rückwärts - -::: übung zk-rueckwaerts -titel: Rückwärts -auftrag: Frage nach einem Wort und gib es rückwärts aus. Aus Ludwig wird `giwduL`. -test: Ludwig -> giwduL -test: Anna -> annA -test: a -> a -braucht: forSchleife -tipp: Gehe das Wort Zeichen für Zeichen durch, aber von hinten nach vorn, und baue dabei einen neuen Text zusammen. -tipp: Lege `String rueckwaerts = ""` an. Die Schleife beginnt beim letzten Index `wort.length() - 1` und zählt mit `i--` bis 0 herunter. In jedem Durchlauf hängst du `wort.charAt(i)` hinten an. -tipp: Das Gerüst: Eingabe `wort`, dann `String rueckwaerts = ""`. For-Schleife mit Start `int i = wort.length() - 1`, Bedingung `i >= 0` und Schritt `i--`. Darin `rueckwaerts = rueckwaerts + wort.charAt(i)`. Unter der Schleife `output: rueckwaerts`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Übung: Wörter zählen - -::: übung zk-woerter -titel: Wörter zählen -auftrag: Frage nach einem Satz und gib aus, wie viele Wörter er hat, z. B. `Wörter: 4` bei „Ludwig ist ein Geißbock“. Die Wörter sind durch genau ein Leerzeichen getrennt. -test: Ludwig ist ein Geißbock -> Wörter: 4 -test: Hallo -> Wörter: 1 -test: Struktogramme machen Spaß -> Wörter: 3 -braucht: anweisung -tipp: Zwischen den Wörtern steht immer ein Leerzeichen. Welche Methode zerlegt einen Text an einem Zeichen? -tipp: Zerlege den Satz mit `satz.split(" ")` in ein String-Array. Seine Länge ist die Anzahl der Wörter. -tipp: Das ganze Programm hat drei Kästen: die Eingabe `satz`, dann `String[] woerter = satz.split(" ")` und zum Schluss `output: "Wörter: " + woerter.length`. -lösung: zk-woerter-loesung.visustruct -::: - -## Jetzt in Java - -Die Methoden in dieser Lektion sind schon Java. Ein ganzes Programm mit einem Text sieht so aus: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie heißt du?"); -String name = scanner.next(); -System.out.println("Hallo " + name.toUpperCase() + "!"); -System.out.println("Dein Name hat " + name.length() + " Buchstaben."); -``` - -- `scanner.next()` liest ein Wort, also Text bis zum nächsten Leerzeichen. Für Zahlen nimmst du weiter `scanner.nextInt()`. -- Text steht in **doppelten** Anführungszeichen `"Ludwig"`, ein einzelnes Zeichen in **einfachen** `'L'`. -- Hinter `length()`, `toUpperCase()` und den anderen Methoden stehen immer runde Klammern, auch wenn nichts darin steht. -- Zwei Texte vergleichst du mit `equals`. Dabei zählt jeder Buchstabe: `"Ludwig".equals("ludwig")` ist false. - -::: übung l17-java-passwort -titel: Passwort prüfen -code: java -auftrag: Schreibe in Java ein Programm, das nach dem Passwort fragt. Ist es **Ludwig**, gibt es **Willkommen!** aus, sonst **Falsches Passwort**. - Achte auf Groß- und Kleinschreibung: `ludwig` ist falsch. -test: Ludwig -> Willkommen! -test: ludwig -> Falsches Passwort -test: Geißbock -> Falsches Passwort -braucht: verzweigung -tipp: Lies das Passwort mit `scanner.next()` in eine String-Variable. Dann vergleichst du in einer Verzweigung. -tipp: Die Bedingung heißt `eingabe.equals("Ludwig")`. Mit `==` klappt der Vergleich von Texten in Java nicht zuverlässig. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Lückentext: Texte - -::: lückentext -titel: Ein Wort untersuchen -auftrag: Ergänze die fehlenden Methoden und Wörter. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Ein Wort?"); -[[String]] wort = scanner.next(); -System.out.println("Länge: " + wort.[[length]]()); -System.out.println("Groß: " + wort.[[toUpperCase]]()); -System.out.println("Erster Buchstabe: " + wort.[[charAt]](0)); -if (wort.[[equals]]("Ludwig")) { - System.out.println("Hallo Ludwig!"); -} -``` -erklärung: `length()` zählt die Zeichen, `toUpperCase()` macht alles groß, `charAt(0)` liefert das erste Zeichen. Texte vergleichst du mit `equals`, nicht mit `==`. -::: - -## Fehler finden: Initialen - -::: übung l17-java-fehler -titel: Initialen reparieren -code: java -auftrag: Das Programm liest Vor- und Nachnamen ein und soll die Initialen ausgeben. Bei Ludwig Geißbock also **L. G.** Es gibt aber **u. e.** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: Bei welchem Index beginnt Java zu zählen? -tipp: Das erste Zeichen hat den Index 0: `vorname.charAt(0)` und `nachname.charAt(0)`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l17-java-laeuft-nicht -titel: Buchstaben zählen -code: java -auftrag: Das Programm soll den ersten Buchstaben und die Länge von **Ludwig** ausgeben, also **L hat 6 Buchstaben**. Es läuft aber nicht, denn zwei Methoden sind falsch geschrieben. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L hat 6 Buchstaben -braucht: anweisung -tipp: Methodennamen sind auch CamelCase: Sie beginnen klein, jedes weitere Wort beginnt groß. -tipp: Richtig sind `name.charAt(0)` mit großem A und `name.length()` ganz klein. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Noch mehr Methoden - -Ein String kann noch viel mehr. Diese Methoden brauchst du auch oft: - -| Methode | Bedeutung | Beispiel | Ergebnis | -|---|---|---|---| -| `lastIndexOf("e")` | Wo steht das letzte e? | `"Ziegenbock".lastIndexOf("e")` | 4 | -| `isEmpty()` | Ist der Text leer? | `"".isEmpty()` | true | -| `equalsIgnoreCase(…)` | gleicher Text, egal ob groß oder klein? | `"Ziegenbock".equalsIgnoreCase("ZIEGENBOCK")` | true | -| `replace(alt, neu)` | ersetzt jede Stelle | `"Ziegenbock".replace("bock", "käse")` | Ziegenkäse | -| `repeat(n)` | den Text n-mal hintereinander | `"Mäh".repeat(3)` | MähMähMäh | -| `concat(…)` | hängt Text an, wie `+` | `"Ziegen".concat("bock")` | Ziegenbock | -| `compareTo(…)` | Wer kommt im Alphabet zuerst? | `"Anna".compareTo("Ben")` | -1 | - -`compareTo` liefert eine Zahl: **negativ**, wenn der Text im Alphabet vorher kommt, **0**, wenn beide gleich sind, und **positiv**, wenn er danach kommt. Damit kannst du Namen sortieren. - -Zwei Methoden gehören nicht zu einem Text, sondern zu einer Klasse. Davor steht deshalb der Name der Klasse: - -- `Integer.parseInt("7")` macht aus dem Text "7" die Zahl 7. Mit ihr kannst du rechnen. -- `String.valueOf(7)` macht aus der Zahl 7 den Text "7". - -::: diagramm zk-mehr.visustruct -Alle neuen Methoden an einem Beispiel. Gehe es in der Simulation durch und vergleiche jede Ausgabe mit der Tabelle. -::: - -## Text aus einer Datei - -Programme bekommen Text oft aus einer **Datei**. Prinzessin Zora hat Ludwig einen Brief geschrieben. Er liegt als Datei `brief.txt` bereit: - -::: datei brief.txt -Lieber Ludwig, -der Fuchs hat mich in seinen Turm gesperrt. -Die Tür hat ein Schloss mit einem geheimen Wort. -Das Wort findest du nur mit Java. -Bitte hilf mir! -Deine Prinzessin Zora -::: - -Diese Zeilen lesen die ganze Datei in einen String: - -``` -import java.nio.file.*; - -String brief = Files.readString(Path.of("brief.txt")); -``` - -Wie das Lesen genau funktioniert, lernst du später in einer eigenen Lektion über Dateien. Hier reicht: Danach steht der ganze Brief in `brief`, mit allen Zeilen. - -Am Ende jeder Zeile steht ein unsichtbares Zeichen für den **Zeilenumbruch**. In Java schreibst du es als `"\n"`. Mit `brief.split("\n")` zerlegst du den Brief deshalb in seine Zeilen. - -::: übung l17-java-brief -titel: Wo steckt der Fuchs? -code: java -auftrag: Im Startcode wird der Brief schon gelesen. Zerlege ihn in Zeilen und gib **Zeilen:** und die Anzahl aus. Suche dann die Zeile, in der **Fuchs** steht, und gib **Fuchs in Zeile** und ihre Nummer aus. Die erste Zeile hat die Nummer 1. -start: l17-java-brief-start.visustruct -test: - -> Zeilen: 6 | Fuchs in Zeile 2 -braucht: forSchleife, verzweigung -tipp: `String[] zeilen = brief.split("\n");` zerlegt den Brief. Mit einer For-Schleife gehst du dann alle Zeilen durch. -tipp: In der Schleife prüfst du `zeilen[i].contains("Fuchs")`. Der Index beginnt bei 0, deshalb gibst du `(i + 1)` aus. Die Klammern brauchst du, damit Java rechnet und nicht 1 an den Text hängt. -lösung: l17-java-brief-loesung.visustruct -::: - -## Die Java-API - -Niemand kennt alle Methoden auswendig, auch Profis nicht. Sie schlagen nach, in der **Java-API**. API heißt Application Programming Interface. Gemeint ist die Beschreibung von allem, was Java schon mitbringt. - -Alle Methoden von String findest du hier: [String in der Java-API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Scrolle dort zur Tabelle **Method Summary**. Jede Zeile beschreibt eine Methode: - -| Spalte | Beispiel | Bedeutung | -|---|---|---| -| Modifier and Type | `int` | Was die Methode zurückgibt | -| Method | `lastIndexOf(String str)` | Name und Parameter mit ihrem Datentyp | -| Description | Returns the index within this string of the last occurrence … | Was die Methode macht | - -Die API ist auf Englisch. Dein Browser kann die Seite übersetzen. Die Namen der Methoden bleiben englisch, denn so schreibst du sie auch in Java. - -::: ludwig -Die Seite ist sehr lang. Mit Strg+F (am Mac ⌘+F) suchst du nach dem Namen der Methode und bist sofort da. -::: - -Schlag diese Methoden nach. Sie stehen nicht in dieser Lektion: - -::: quiz -? Schlag `strip()` nach. Was macht die Methode? -- [ ] Sie entfernt alle Leerzeichen im Text. -- [x] Sie entfernt die Leerzeichen am Anfang und am Ende. -- [ ] Sie schneidet das letzte Zeichen ab. -> Wie `trim()`. `strip()` kennt aber auch besondere Leerzeichen aus anderen Schriften. - -? Schlag `isBlank()` nach. Was liefert `" ".isBlank()`? -- [x] true -- [ ] false -- [ ] 3 -> isBlank prüft, ob der Text leer ist oder nur aus Leerzeichen besteht. `" ".isEmpty()` wäre dagegen false. - -? Schlag `toCharArray()` nach. Welchen Datentyp liefert die Methode? -- [ ] String -- [ ] String[] -- [x] char[] -> Ein Array mit allen Zeichen des Textes, für jedes Zeichen ein Fach. - -? Schlag `indexOf` mit zwei Parametern nach. Was liefert `"Ziegenbock".indexOf("e", 3)`? -- [ ] 2 -- [x] 4 -- [ ] -1 -> Die Suche beginnt erst bei Index 3. Das erste e ab dort steht bei Index 4. - -? Schlag `startsWith` nach. Welchen Datentyp liefert die Methode? -- [x] boolean -- [ ] int -- [ ] String -> In der Spalte „Modifier and Type“ steht boolean: Die Antwort ist true oder false. -::: - -## Spiel: Prinzessin retten - -Jetzt hilfst du Ludwig. Der Fuchs hat Prinzessin Zora in seinen Turm gesperrt, und das Tor öffnet sich nur mit einem geheimen Wort. - -::: spiel prinzessin -titel: Spiel: Prinzessin retten -intro: Auf dem Weg zum Turm kommt Ludwig an **sechs Stationen**. An jeder steht ein Stück Java-Code, und heraus kommt eine Zahl. Mit `alphabet.charAt(zahl)` wird aus der Zahl ein Buchstabe, der im **Kreuzworträtsel** landet. Löst du das Rätsel, ergeben die gelben Felder das geheime Wort für das Tor. - -station: Am Burggraben - String name = " Zora "; - int zahl = name.trim().length(); -frage: Welche Zahl steht in `zahl`? -zahl: 4 -feld: 5 1 -tipp: `trim()` schneidet die Leerzeichen vorne und hinten ab. Zähle danach die Zeichen. -> Nach `trim()` bleibt `"Zora"` übrig, und das sind 4 Zeichen. - -station: Im Fuchswald - String ort = "Fuchsbau"; - int zahl = ort.length(); -frage: Welche Zahl steht in `zahl`? -zahl: 8 -feld: 4 4 -tipp: `length()` zählt alle Zeichen. Zähle F-u-c-h-s-b-a-u. -> „Fuchsbau“ hat 8 Zeichen. - -station: Am Ziegenfelsen - String wort = "Ziegenbock"; - int zahl = wort.indexOf("bock"); -frage: Welche Zahl steht in `zahl`? -zahl: 6 -feld: 4 6 -tipp: `indexOf` gibt die Stelle zurück, an der „bock“ anfängt. Das Z hat den Index 0. -> Z i e g e n hat die Indizes 0 bis 5, also beginnt „bock“ bei Index 6. - -station: Auf der Turmtreppe - String wort = "Prinzessin"; - int zahl = wort.indexOf("s", 7); -frage: Welche Zahl steht in `zahl`? Schlag `indexOf(String str, int fromIndex)` in der Java-API nach. -zahl: 7 -feld: 6 6 -tipp: Die Suche beginnt bei Index 7, und Index 7 zählt schon mit. Schreib dir die Indizes unter die Buchstaben. -> P r i n z e s s i n hat die Indizes 0 bis 9. Ab Index 7 gesucht, steht das erste „s“ genau bei 7. - -station: Vor der Fuchshöhle - int zahl = "Zora".compareTo("Zoe"); -frage: Welche Zahl steht in `zahl`? -zahl: 13 -feld: 1 9 -tipp: `compareTo` sucht die erste Stelle, an der sich die Texte unterscheiden, und rechnet die Differenz der Zeichencodes aus. `'r'` ist 114, `'e'` ist 101. -> „Zo“ ist gleich, dann kommt `'r'` gegen `'e'`: 114 − 101 = 13. - -station: Am Turmtor - int zahl = Integer.parseInt("1" + "1") / 5; -frage: Welche Zahl steht in `zahl`? -zahl: 2 -feld: 6 5 -tipp: Zuerst werden die Texte verbunden, dann wird daraus eine Zahl. Bei `int` wird beim Teilen der Rest weggelassen. -> `"1" + "1"` ist `"11"`, `parseInt` macht daraus 11, und 11 / 5 ist bei ganzen Zahlen 2. - -kreuzwort: Die blauen Buchstaben hast du schon. Fülle die anderen Felder mit Fachbegriffen aus Java. Klick auf einen Hinweis, um zum Wort zu springen. -- → 1 3 BOOLEAN: Datentyp für wahr oder falsch -- → 4 1 STRING: Datentyp für Text, also für eine Zeichenkette -- → 6 5 CHAR: Datentyp für ein einzelnes Zeichen -- ↓ 1 6 LENGTH: Methode, die die Zeichen eines Strings zählt -- ↓ 2 1 ELSE: Der „sonst“-Teil einer Verzweigung -- ↓ 3 3 BREAK: Springt sofort aus einer Schleife heraus -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: Ludwig steht vor dem Tor. Das Schloss vergleicht dein Wort mit `equals`. Trag das geheime Wort ein. - String wort = "___"; - if (wort.equals(geheimesWort)) { - tor.oeffnen(); - } -ende: Zora ist frei, und der Fuchs ist schnell davongelaufen. Das geheime Wort war `BREAK`: Mit `break` kommt man aus jeder Schleife heraus, und Zora aus dem Turm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass auch die Zeichen eines Strings ab 0 gezählt werden. → Text ist eine Reihe von Zeichen -- Ich kann mit `length()` und `charAt(i)` arbeiten. → Text ist eine Reihe von Zeichen -- Ich kann einen `char` von einem String unterscheiden und mit `(int)` und `(char)` den Zeichencode nutzen. → Ein einzelnes Zeichen: char -- Ich kann mit `substring` einen Teil aus einem Text schneiden. → Teile herausschneiden -- Ich kann `indexOf`, `contains`, `toUpperCase` und `equals` anwenden. → Suchen und vergleichen -- Ich kann einen Text mit einer Schleife Zeichen für Zeichen durchgehen. → Zeichen für Zeichen -- Ich kann einen Text mit `split` in ein String-Array zerlegen. → Zerlegen mit split -- Ich kann in Java einen Text einlesen und mit `equals` vergleichen. → Jetzt in Java -- Ich kann weitere Methoden wie `lastIndexOf`, `replace`, `compareTo` und `Integer.parseInt` anwenden. → Noch mehr Methoden -- Ich kann einen Text aus einer Datei mit `split("\n")` in Zeilen zerlegen. → Text aus einer Datei -- Ich kann eine Methode in der Java-API nachschlagen und ihre Beschreibung lesen. → Die Java-API -::: - -## Wissenstest - -::: quiz -? Was liefert `"Ludwig".charAt(1)`? -→ Text ist eine Reihe von Zeichen -- [ ] L -- [x] u -- [ ] d -> Gezählt wird ab 0: L hat den Index 0, u den Index 1. - -? Was ist `'C'`? -→ Ein einzelnes Zeichen: char -- [x] ein `char`, also genau ein Zeichen -- [ ] ein String -- [ ] eine Variable mit dem Namen C -> Einfache Anführungszeichen stehen für ein einzelnes Zeichen, also einen `char`. `"C"` in doppelten wäre ein String. - -? `'A'` hat den Zeichencode 65. Was ergibt `(char) 67`? -→ Ein einzelnes Zeichen: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 ist A, 66 ist B, 67 ist C. Mit `(char)` wird aus dem Code wieder ein Zeichen. - -? Was liefert `"Struktogramm".substring(0, 6)`? -→ Teile herausschneiden -- [x] Strukt -- [ ] Struktog -- [ ] truktog -> Die Zeichen mit den Indizes 0 bis 5. Das Ende 6 gehört nicht mehr dazu. - -? Ein Wort hat 7 Zeichen. Welchen Index hat das letzte Zeichen? -→ Text ist eine Reihe von Zeichen -- [ ] 7 -- [x] 6 -- [ ] 8 -> Wie beim Array: immer eins weniger als die Länge. - -? Wie vergleichst du in Java zwei Strings auf gleichen Inhalt? -→ Suchen und vergleichen -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Ordne jeder Methode zu, was sie bei `"Geißbock"` liefert. -→ Suchen und vergleichen -= length() -> 8 -= charAt(0) -> G -= indexOf("bock") -> 4 -= substring(4) -> bock - -? Welche Bedingung prüft in Java, ob in `eingabe` der Text Ludwig steht? -→ Jetzt in Java -- [ ] eingabe = "Ludwig" -- [ ] eingabe == 'Ludwig' -- [x] eingabe.equals("Ludwig") -> Texte vergleichst du mit equals. Einfache Anführungszeichen sind nur für ein einzelnes Zeichen. - -? Was liefert `Integer.parseInt("12") + 1`? -→ Noch mehr Methoden -- [ ] "121" -- [x] 13 -- [ ] eine Fehlermeldung -> parseInt macht aus dem Text eine Zahl. Danach rechnet Java ganz normal. -::: diff --git a/web/lessons/de/18-aufruf-und-aussprung.md b/web/lessons/de/18-aufruf-und-aussprung.md deleted file mode 100644 index 1fca1042..00000000 --- a/web/lessons/de/18-aufruf-und-aussprung.md +++ /dev/null @@ -1,483 +0,0 @@ ---- -titel: Aufruf und Aussprung -bereich: Grundlagen -kurz: Große Aufgaben in Unterprogramme zerlegen und Schleifen vorzeitig verlassen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine große Aufgabe in Teilprobleme zerlegen -- einen Aufruf einfügen und ein Unterprogramm in einem eigenen Reiter bauen -- einem Unterprogramm mit Parametern Werte übergeben -- mit return einen Rückgabewert liefern und ihn beim Aufruf speichern -- erklären, warum ein Unterprogramm eine Zahl nicht verändern kann, ein Array aber schon -- erklären, was ein Aussprung macht und warum er in einer Verzweigung steht -- eine Schleife mit einem Aussprung oder über ihre Bedingung beenden -- in Java eine Methode erkennen und eine Schleife mit `break` verlassen -::: - -## Große Aufgaben zerlegen - -Lange Struktogramme werden schnell unübersichtlich. Deshalb zerlegst du eine große Aufgabe in **Teilprobleme**. Jedes Teilproblem bekommt einen eigenen Namen und ein eigenes Struktogramm, ein **Unterprogramm**. - -Ein Quiz besteht zum Beispiel aus drei Teilen: begrüßen, Fragen stellen, Ergebnis zeigen. Das Hauptprogramm nennt nur noch diese drei Teile: - -::: diagramm l15-hauptprogramm.visustruct -Das Hauptprogramm besteht nur aus drei Aufrufen. Was in jedem Teil passiert, steht in einem eigenen Struktogramm. -::: - -So siehst du auf einen Blick, wie das Programm aufgebaut ist. Die Einzelheiten stehen woanders. - -## Der Aufruf - -Ein **Aufruf** ist ein Kasten mit doppelten senkrechten Linien links und rechts. Er bedeutet: Führe hier das Unterprogramm mit diesem Namen aus und mache danach weiter. - -- Du ziehst **Aufruf** aus dem Bereich Elemente und schreibst den Namen hinein, z. B. `zeigeBegruessung()`. -- Die runden Klammern am Ende zeigen, dass es ein Unterprogramm ist. So schreibt man es auch in Java, Python und JavaScript. -- Das Unterprogramm selbst baust du als eigenes Struktogramm in einem neuen Reiter. Als Titel trägst du denselben Namen ein. - -::: diagramm l15-unterprogramm.visustruct -Das Unterprogramm zeigeBegruessung() als eigenes Struktogramm. -::: - -> **In der Simulation:** Erreicht die Simulation einen Aufruf, sucht sie unter den offenen Reitern das Struktogramm mit diesem Titel und führt es aus. Danach macht sie im Hauptprogramm weiter. Solange das Unterprogramm läuft, bleibt der Aufruf-Kasten markiert. Ein Unterprogramm wie dieses, nur mit Namen als Titel, teilt sich die Variablen mit dem Hauptprogramm. Wie ein Unterprogramm eigene Variablen bekommt, lernst du gleich. Gibt es keinen passenden Reiter, überspringt die Simulation den Aufruf und zeigt einen Hinweis. - -::: angeberwissen -Warum sagt dein Lehrer bei Java immer „Methode“ und nie „Funktion“ oder „Prozedur“? Weil in Java jedes Unterprogramm zu einer Klasse gehören muss, und Unterprogramme einer Klasse heißen Methoden. Den Unterschied gibt es trotzdem: Liefert eine Methode ein Ergebnis zurück, ist sie eigentlich eine Funktion. Steht `void` davor, liefert sie nichts und ist eigentlich eine Prozedur. Java ist da einfach bequem und nennt beide Methode. Ich auch: Meine Methode heißt Fressen. -::: - -## Übung: Aufruf einbauen - -::: übung l15-titel -titel: Begrüßung mit Aufruf -auftrag: Stell dir vor, das Unterprogramm `zeigeTitel()` gibt es schon. Baue das Hauptprogramm: Es ruft zuerst `zeigeTitel()` auf. Danach fragt es nach dem Namen und gibt **Hallo** und den Namen aus. - Bei der Eingabe Ada erscheint also **Hallo Ada**. -test: Ada -> Hallo Ada -test: Ben -> Hallo Ben -braucht: aufruf -tipp: Das Hauptprogramm hat drei Teile: den Aufruf, die Eingabe und die Ausgabe. -tipp: Ziehe einen Aufruf aus dem Bereich Elemente ganz nach oben und schreibe `zeigeTitel()` hinein. Darunter kommen die Eingabe `input: String name "Wie heißt du?"` und die Ausgabe. -lösung: l15-titel-loesung.visustruct -::: - -## Werte übergeben: Parameter - -Oft soll ein Unterprogramm mit Werten arbeiten, die erst beim Aufruf feststehen. Dann bekommt es als Titel eine **Kopfzeile**: - -``` -void zeigeSumme(int a, int b) -``` - -- `void` heißt: Das Unterprogramm liefert kein Ergebnis zurück. -- `zeigeSumme` ist der Name. -- In den Klammern stehen die **Parameter**: Variablen mit Datentyp, die beim Aufruf ihre Werte bekommen. Mehrere trennst du mit Komma. - -::: diagramm l15-zeige-summe.visustruct -Das Unterprogramm mit der Kopfzeile als Titel. Es rechnet mit a und b, als wären es normale Variablen. -::: - -Im Aufruf-Kasten schreibst du die Werte in die Klammern, z. B. `zeigeSumme(3, 4)`. Der erste Wert kommt in `a`, der zweite in `b`. Statt Zahlen gehen auch Variablen und Rechnungen wie `zeigeSumme(x, x + 1)`. - -::: diagramm l15-zeige-summe-haupt.visustruct -Das Hauptprogramm ruft zeigeSumme zweimal mit anderen Werten auf. Öffne beide Diagramme und starte hier die Simulation. -::: - -> **Lokale Variablen:** Die Parameter und alle Variablen, die im Unterprogramm entstehen, gehören nur dem Unterprogramm. Es bekommt **Kopien** der Werte, mehr dazu weiter unten bei der Wertübergabe (call by value). In der Simulation siehst du während des Aufrufs nur die Variablen des Unterprogramms. - -## Ergebnis zurückgeben: return - -Ein Unterprogramm kann auch ein Ergebnis liefern, den **Rückgabewert**. Dann steht in der Kopfzeile statt `void` der Datentyp des Ergebnisses: - -``` -int quadrat(int x) -``` - -Die Anweisung `return ergebnis` gibt den Wert zurück und beendet das Unterprogramm sofort. Beim Aufruf speicherst du das Ergebnis in einer Variablen: Nach `int q = quadrat(5)` steht in `q` der Wert 25. - -::: diagramm l15-quadrat.visustruct -Das Unterprogramm quadrat rechnet und gibt das Ergebnis mit return zurück. -::: - -::: diagramm l15-quadrat-haupt.visustruct -Das Hauptprogramm speichert den Rückgabewert in q. Öffne beide Diagramme und probiere die Simulation aus. -::: - -> Ein Unterprogramm mit Rückgabewert muss mit `return` enden. Fehlt das return, meldet die Simulation einen Fehler. - -In der **Code-Ansicht** wird aus der Kopfzeile eine Java-Methode (`public static int quadrat(int x)`), in Python ein `def` und in JavaScript eine `function`. Sind die Unterprogramme in anderen Reitern offen, stehen sie beim Hauptprogramm mit im Code. - -## Übung: Fläche berechnen - -::: übung l15-flaeche -titel: Fläche berechnen -auftrag: Baue zwei Diagramme. Das Unterprogramm `int flaeche(int a, int b)` gibt die Fläche eines Rechtecks zurück, also a mal b. Das Hauptprogramm fragt nach Länge und Breite, ruft `flaeche` auf und gibt **Fläche:** und das Ergebnis aus. - Bei 3 und 4 erscheint **Fläche: 12**. -test: 3, 4 -> Fläche: 12 -test: 5, 5 -> Fläche: 25 -test: 7, 0 -> Fläche: 0 -braucht: aufruf -tipp: Du baust zwei Diagramme: ein Unterprogramm, das nur rechnet und das Ergebnis zurückgibt, und ein Hauptprogramm für Eingabe und Ausgabe. -tipp: Lege mit **+** einen neuen Reiter an und gib ihm den Titel `int flaeche(int a, int b)`. Darin reicht eine Anweisung: `return a * b`. Im Hauptprogramm schreibst du in den Aufruf-Kasten `int f = flaeche(laenge, breite)`. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Kopie oder Original: call by value und call by reference - -Was passiert, wenn ein Unterprogramm seinen Parameter verändert? Das hängt davon ab, **was** übergeben wird. - -**Wertübergabe**, englisch **call by value**: Bei `int`, `double`, `boolean`, `char` und `String` bekommt das Unterprogramm eine **Kopie** des Werts. Ändert es seinen Parameter, bleibt die Variable des Aufrufers, wie sie war. - -**Referenzübergabe**, englisch **call by reference**: Bei einem **Array** bekommt das Unterprogramm keine Kopie, sondern einen Verweis auf dasselbe Array. Ändert es ein Fach, ist das Fach auch beim Aufrufer geändert. Die Kopfzeile dafür sieht so aus: - -``` -void leeren(boolean[] plaetze) -``` - -::: grafik uebergabe.svg -Oben bekommt verdopple eine Kopie von zahl. Unten zeigen reihe und plaetze auf dasselbe Array. -::: - -Probiere beides aus. Öffne die drei Diagramme und starte im Hauptprogramm die Simulation: - -::: diagramm uebergabe-verdopple.visustruct -verdopple ändert nur seine Kopie x. -::: - -::: diagramm uebergabe-leeren.visustruct -leeren setzt alle Plätze auf false, zum Beispiel wenn eine Vorstellung ausfällt. -::: - -::: diagramm uebergabe-haupt.visustruct -zahl ist nach dem Aufruf immer noch 5. Die Plätze in reihe sind nach dem Aufruf dagegen frei. -::: - -> Willst du mit einer Zahl aus einem Unterprogramm etwas zurückbekommen, nimmst du `return`, z. B. `zahl = verdopple(zahl)` mit der Kopfzeile `int verdopple(int x)`. Ein Array dagegen kann das Unterprogramm direkt verändern. - -::: angeberwissen -Ganz genau genommen kennt Java nur die Wertübergabe, also call by value. Bei einem Array wird aber nicht das ganze Array kopiert, sondern nur seine **Adresse** im Speicher. Mit der kopierten Adresse findet das Unterprogramm dasselbe Array. Das ist so, als würde ich dir eine Kopie meines Schließfachschlüssels geben: Der Schlüssel ist kopiert, das Heu im Fach gibt es nur einmal. -::: - -## Übung: Bonuspunkte - -::: übung uebergabe-bonus -titel: Bonuspunkte -auftrag: Das Hauptprogramm ruft `bonus(punkte)` auf und gibt danach alle Punkte aus. Baue das Unterprogramm `void bonus(int[] punkte)`, das jede Punktzahl im Array um 1 erhöht. Statt 3, 5 und 8 erscheinen dann **4**, **6** und **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: Das Hauptprogramm ist schon fertig. Du baust nur das Unterprogramm in einem neuen Reiter. -tipp: Lege mit **+** einen neuen Reiter mit dem Titel `void bonus(int[] punkte)` an. Darin läuft eine For-Schleife über alle Fächer und rechnet `punkte[i] = punkte[i] + 1`. Ein return brauchst du nicht, denn das Array wird direkt geändert. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## Der Aussprung - -Manchmal soll eine Schleife **vorzeitig** enden, mitten im Rumpf. Dafür gibt es den **Aussprung**. Er verlässt sofort die Schleife, in der er steht. Das Programm macht mit dem ersten Kasten nach der Schleife weiter. In Java, Python und JavaScript heißt das `break`. - -Den Aussprung erkennst du an der Spitze am linken Rand. In den Kasten kannst du einen kurzen Kommentar schreiben, z. B. `Schleife verlassen`. Er erscheint im Code als Kommentar hinter `break`. - -Ein Aussprung steht fast immer in einer **Verzweigung**: Nur wenn eine Bedingung zutrifft, wird die Schleife verlassen. - -Typisch ist die **Endlosschleife mit Aussprung**. Die Schleife selbst hat keine Bedingung. Sie läuft so lange, bis der Aussprung erreicht wird: - -::: diagramm l15-endlos-aussprung.visustruct -Die Schleife fragt immer wieder nach einer Zahl. Bei 0 springt sie heraus, sonst zählt sie die Zahl zur Summe. -::: - -Ohne Aussprung würde eine Endlosschleife wirklich nie enden. - -## Aussprung in der Simulation - -Die Simulation führt den Aussprung aus wie `break`: Sie verlässt die innerste Schleife und macht nach ihr weiter. Steht ein Aussprung außerhalb jeder Schleife, endet das Unterprogramm, im Hauptprogramm das ganze Programm. Dasselbe macht `return`. - -Oft geht es auch ganz ohne Aussprung: Du schreibst die Abbruchbedingung direkt in die Schleife. Das ist meist sogar übersichtlicher. - -## Übung: Summe bis 0 - -::: übung l15-bis-null -titel: Summe bis 0 -auftrag: Baue das Programm „Summe bis 0“ **ohne** Aussprung nach. Es fragt so lange nach ganzen Zahlen, bis jemand 0 eingibt. Danach gibt es **Summe:** und die Summe aller eingegebenen Zahlen aus. -test: 3, 4, 0 -> Summe: 7 -test: 0 -> Summe: 0 -test: 10, -2, 5, 0 -> Summe: 13 -tipp: Ohne Aussprung muss die Bedingung der Schleife selbst prüfen, ob die 0 eingegeben wurde. -tipp: Frage die erste Zahl schon vor der Schleife ab. Die While-Schleife läuft mit der Bedingung `zahl != 0`. Im Rumpf zählst du die Zahl zur Summe und fragst danach die nächste Zahl ab. Bei der zweiten Eingabe schreibst du nur `input: zahl "…"`, weil es `zahl` schon gibt. -lösung: l15-bis-null-loesung.visustruct -::: - -## Jetzt in Java - -Ein Unterprogramm heißt in Java **Methode**. Das Quadrat von oben sieht so aus: - -```java -public static int quadrat(int x) { - int ergebnis = x * x; - return ergebnis; -} -``` - -Das Hauptprogramm ruft die Methode mit ihrem Namen auf und gibt ihr den Wert in runden Klammern mit: - -```java -int q = quadrat(zahl); -System.out.println("Das Quadrat ist " + q); -``` - -- In der Kopfzeile steht vor dem Namen, was die Methode zurückgibt (`int`). Gibt sie nichts zurück, steht dort `void`. -- Die Parameter stehen mit Datentyp in den runden Klammern: `(int x)`. Mehrere trennst du mit Komma. -- Im Bereich Code schreibst du jede Methode in einen eigenen Reiter, so wie jedes Unterprogramm ein eigenes Struktogramm hat. -- Der Aussprung heißt in Java `break`. Mit `while (true)` baust du eine Schleife, die nur durch `break` endet. - -::: übung l18-java-kasse -titel: Kasse mit break -code: java -auftrag: Schreibe in Java eine Kasse. Sie fragt immer wieder nach einem Preis in ganzen Euro. Bei 0 verlässt sie die Schleife mit `break`. Danach gibt sie aus, wie viele Artikel es waren und was alles zusammen kostet. - Bei 3, 4 und dann 0 erscheint **Artikel: 2** und **Gesamt: 7**. -test: 3, 4, 0 -> Artikel: 2 | Gesamt: 7 -test: 0 -> Artikel: 0 | Gesamt: 0 -test: 10, 2, 5, 0 -> Artikel: 3 | Gesamt: 17 -braucht: endlosschleife, aussprung -tipp: Du brauchst zwei Variablen, die vor der Schleife mit 0 anfangen: eine für die Summe und eine für die Anzahl. -tipp: In `while (true) { … }` liest du den Preis ein. Gleich danach prüfst du `if (preis == 0) { break; }`. Erst dahinter zählst du den Preis zur Summe und die Anzahl um 1 hoch. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Lückentext: Methoden und break - -::: lückentext -titel: Methode und Aussprung -auftrag: Ergänze die fehlenden Wörter. Oben steht die Methode, die ein Quadrat ausrechnet. Darunter steht das Hauptprogramm, das sie aufruft. Im Bereich Code stehen beide in eigenen Reitern. -```java -public static [[int]] quadrat(int x) { - [[return]] x * x; -} -``` -```java -int zahl = 1; -while ([[true]]) { - int q = [[quadrat]](zahl); - if (q > 50) { - [[break]]; - } - System.out.println(q); - zahl = zahl + 1; -} -``` -erklärung: `int` vor dem Methodennamen heißt: Die Methode gibt eine ganze Zahl zurück, und zwar mit `return`. Gibt eine Methode nichts zurück, steht dort `void`. `while (true)` läuft endlos, bis `break` die Schleife verlässt. Ausgabe: 1, 4, 9, 16, 25, 36 und 49. -::: - -## Fehler finden: Raten - -::: übung l18-java-fehler -titel: Versuche zählen reparieren -code: java -auftrag: Beim Zahlenraten ist die gesuchte Zahl 7. Das Programm fragt so lange nach einem Tipp, bis die 7 kommt, und gibt dann die Zahl der Versuche aus. Bei 3, 5 und 7 waren es 3 Versuche, das Programm sagt aber **Versuche: 2**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Versuche: 3 -test: 7 -> Versuche: 1 -test: 1, 2, 3, 7 -> Versuche: 4 -braucht: endlosschleife, aussprung -tipp: Was passiert beim richtigen Tipp? Wird er noch mitgezählt, bevor `break` die Schleife verlässt? -tipp: Zähle zuerst hoch und prüfe danach: `versuche = versuche + 1;` gehört vor das `if` mit dem `break`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Spiel: Was kommt zurück? - -::: spiel frage -titel: Spiel: Was kommt zurück? -intro: Ludwig ruft Methoden auf und springt aus Schleifen. Sag vorher, was ausgegeben wird. Sieben Runden. - -runde: - public static int quadrat(int x) { - return x * x; - } - - int q = quadrat(5); - System.out.println(q); -frage: Was wird ausgegeben? -- 5 -- 10 -- [x] 25 -> Der Aufruf gibt 5 in x, return liefert 5 · 5 zurück. - -runde: - public static void zeigeSumme(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - zeigeSumme(x, x + 1); -frage: Was wird ausgegeben? -- [x] 5 -- 23 -- 3 -> Der erste Wert 2 kommt in a, der zweite 3 in b. In Java rechnet `a + b` mit Zahlen ganz normal. - -runde: -frage: Was liefert eine Methode zurück, vor deren Namen `void` steht? -- eine ganze Zahl -- [x] nichts -- immer 0 -> `void` heißt: kein Rückgabewert. Steht dort `int`, kommt eine ganze Zahl zurück. - -runde: - public static void verdopple(int x) { - x = x * 2; - } - - int zahl = 5; - verdopple(zahl); - System.out.println(zahl); -frage: Was wird ausgegeben? -- [x] 5 -- 10 -- 0 -> Call by value: verdopple bekommt eine Kopie. zahl bleibt 5. - -runde: - public static void leeren(boolean[] plaetze) { - for (int i = 0; i < plaetze.length; i++) { - plaetze[i] = false; - } - } - - boolean[] reihe = {true, true}; - leeren(reihe); - System.out.println(reihe[0]); -frage: Was wird ausgegeben? -- true -- [x] false -> Bei einem Array zeigen reihe und plaetze auf dasselbe Array. Die Änderung sieht auch der Aufrufer. - -runde: - int summe = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - summe = summe + i; - } - System.out.println(summe); -frage: Was wird ausgegeben? -- [x] 6 -- 10 -- 55 -> Bei i = 4 springt `break` sofort aus der Schleife. Gezählt sind nur 1 + 2 + 3. - -runde: - int zahl = 1; - while (true) { - zahl = zahl * 3; - if (zahl > 20) { - break; - } - } - System.out.println(zahl); -frage: Was wird ausgegeben? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Erst 27 ist größer als 20, dann endet die Endlosschleife mit break. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine große Aufgabe in Teilprobleme zerlegen. → Große Aufgaben zerlegen -- Ich kann einen Aufruf einfügen und ein Unterprogramm in einem eigenen Reiter bauen. → Der Aufruf -- Ich kann einem Unterprogramm mit Parametern Werte übergeben. → Werte übergeben: Parameter -- Ich kann mit return einen Rückgabewert liefern und ihn beim Aufruf speichern. → Ergebnis zurückgeben: return -- Ich kann erklären, warum ein Unterprogramm eine Zahl nicht verändern kann, ein Array aber schon. → Kopie oder Original: call by value und call by reference -- Ich kann erklären, was ein Aussprung macht und warum er in einer Verzweigung steht. → Der Aussprung -- Ich kann eine Schleife mit einem Aussprung oder über ihre Bedingung beenden. → Aussprung in der Simulation -- Ich kann in Java eine Methode erkennen und eine Schleife mit `break` verlassen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet ein Aufruf-Kasten mit dem Text `zeigeErgebnis()`? -→ Der Aufruf -- [ ] Das Programm endet hier. -- [x] Hier wird das Unterprogramm zeigeErgebnis() ausgeführt, danach geht es weiter. -- [ ] Hier wird das Wort zeigeErgebnis() ausgegeben. - -? Wo geht es nach einem Aussprung weiter? -→ Der Aussprung -- [ ] Am Anfang der Schleife -- [x] Beim ersten Kasten nach der Schleife -- [ ] Ganz am Anfang des Programms -> Der Aussprung verlässt die Schleife, in der er steht. In Java, Python und JavaScript heißt er break. - -? Warum steht ein Aussprung meistens in einer Verzweigung? -→ Der Aussprung -- [x] Damit die Schleife nur verlassen wird, wenn eine Bedingung zutrifft -- [ ] Weil ein Aussprung sonst nicht gespeichert werden kann -- [ ] Weil eine Verzweigung selbst eine Schleife ist -> Ohne Verzweigung würde die Schleife schon im ersten Durchlauf verlassen. - -? Wo findet die Simulation das Unterprogramm zu einem Aufruf `zeigeErgebnis()`? -→ Der Aufruf -- [ ] Es muss im selben Struktogramm stehen. -- [x] In einem offenen Reiter mit dem Titel zeigeErgebnis() -- [ ] Die Simulation kann keine Unterprogramme ausführen. -> Baue jedes Unterprogramm in einem eigenen Reiter und gib ihm als Titel den Namen aus dem Aufruf. - -? Das Unterprogramm hat die Kopfzeile `void zeigeSumme(int a, int b)`. Welcher Aufruf passt? -→ Werte übergeben: Parameter -- [ ] zeigeSumme() -- [x] zeigeSumme(3, 4) -- [ ] int s = zeigeSumme(3, 4) -> Zwei Parameter brauchen zwei Werte. Und `void` heißt: Es kommt nichts zurück, das man speichern könnte. - -? Nach `int q = quadrat(5)` steht in q die 25. Was steht im Unterprogramm quadrat am Ende? -→ Ergebnis zurückgeben: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> Mit return gibt das Unterprogramm den Wert an den Aufruf zurück. Eine Ausgabe würde ihn nur anzeigen. - -? `void verdopple(int x)` rechnet `x = x * 2`. Im Hauptprogramm steht `int zahl = 5` und dann der Aufruf `verdopple(zahl)`. Welchen Wert hat zahl danach? -→ Kopie oder Original: call by value und call by reference -- [x] 5 -- [ ] 10 -- [ ] 0 -> Wertübergabe (call by value): verdopple hat nur eine Kopie von zahl verändert. - -? `void leeren(boolean[] plaetze)` setzt alle Fächer auf false. Was gilt nach `leeren(reihe)` für das Array reihe im Hauptprogramm? -→ Kopie oder Original: call by value und call by reference -- [ ] Es ist unverändert, weil das Unterprogramm eine Kopie bekommt. -- [x] Alle Fächer sind false, weil plaetze und reihe dasselbe Array sind. -- [ ] Das Array ist gelöscht. -> Referenzübergabe (call by reference): Ein Array wird als Referenz übergeben. Änderungen an den Fächern sieht auch der Aufrufer. - -? Wie heißt ein Unterprogramm in Java? -→ Jetzt in Java -- [ ] Klasse -- [x] Methode -- [ ] Schleife -> In Java ist ein Unterprogramm eine Methode, zum Beispiel die `main`-Methode. Je nach Art sagt man auch Prozedur oder Funktion. - -? Viele Bausteine haben in Schulbüchern einen zweiten Namen. Ordne jedem Begriff aus VisuStruct den anderen Namen zu. -→ Jetzt in Java -= Verzweigung -> Bedingte Anweisung -= Fallauswahl -> Mehrfachauswahl -= Schleife -> Wiederholungsstruktur -= Array -> Feld -= Unterprogramm -> Methode -> Beide Namen meinen dasselbe. Wenn du einen davon kennst, verstehst du auch den anderen. - -? Was steht in Java in der Kopfzeile einer Methode, die nichts zurückgibt? -→ Ergebnis zurückgeben: return -- [ ] int -- [x] void -- [ ] return -> void heißt „leer“: Die Methode macht etwas, gibt aber keinen Wert zurück. -::: diff --git a/web/lessons/de/19-suchen-und-sortieren.md b/web/lessons/de/19-suchen-und-sortieren.md deleted file mode 100644 index c72fe26e..00000000 --- a/web/lessons/de/19-suchen-und-sortieren.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -titel: Suchen und Sortieren -bereich: Grundlagen -kurz: Mit Spielkarten verstehen, wie lineare und binäre Suche und Bubblesort arbeiten und warum manche Verfahren viel schneller sind. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, wie die lineare Suche ein Array durchsucht -- eine lineare Suche als Struktogramm bauen -- erklären, warum die binäre Suche nur bei sortierten Werten funktioniert -- begründen, warum die binäre Suche bei vielen Werten viel schneller ist -- einen Durchgang von Bubblesort mit Spielkarten vormachen -- in Java ein Array durchsuchen und Treffer zählen -::: - -## Eine Karte suchen - -Du hast einen Stapel Spielkarten verdeckt in einer Reihe vor dir liegen. Gesucht ist die 9. Was machst du? Du drehst eine Karte nach der anderen um, bis du die 9 findest oder alle Karten umgedreht hast. - -::: grafik ss-lineare-suche.svg -Die Karten liegen durcheinander. Jede umgedrehte Karte ist ein Vergleich: Ist das die 9? -::: - -Genau so arbeitet die **lineare Suche**: Sie geht das Array vom Index 0 bis zum Ende durch und vergleicht jedes Fach mit dem gesuchten Wert. Sie funktioniert immer, auch wenn die Werte durcheinander liegen. - -Im Array stehen unsere Karten als Zahlen. Bube, Dame und König lassen wir weg. - -::: diagramm ss-lineare-suche.visustruct -Die Schleife läuft, bis die Karte gefunden ist oder kein Fach mehr übrig ist. Die Variable vergleiche zählt mit, wie oft verglichen wurde. Suche in der Simulation die 2, die 27 und die 4. -::: - -> Ist die Karte nicht dabei, bleibt `position` bei **-1**. Einen Index -1 gibt es nicht, darum bedeutet -1 hier „nicht gefunden“. - -## Übung: Karte suchen - -::: übung ss-karte-suchen -titel: Karte suchen -auftrag: Lege das Array `int[] karten = {8, 4, 11, 4, 6}` an und frage nach einer Karte. Gib die Position der **ersten** passenden Karte aus, z. B. `Position: 1` bei der 4. Ist die Karte nicht dabei, gib `Nicht gefunden` aus. -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 8 -> Position: 0 -test: 9 -> Nicht gefunden -braucht: whileSchleife, verzweigung -tipp: Gehe das Array von vorn nach hinten durch und vergleiche jede Karte mit der gesuchten. -tipp: Baue das Beispiel oben nach. Die Variable vergleiche brauchst du hier nicht. Die Schleife muss aufhören, sobald `position` nicht mehr -1 ist, sonst findest du bei der 4 die zweite statt der ersten. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Binäre Suche: sortiert geht es schneller - -Jetzt liegen die Karten **sortiert** vor dir, von klein nach groß. Gesucht ist die 27. Du drehst nicht mehr vorne die erste Karte um, sondern die **mittlere**: - -- Ist sie die gesuchte, bist du fertig. -- Ist sie kleiner, kann die gesuchte Karte nur noch rechts liegen. Die ganze linke Hälfte fällt weg. -- Ist sie größer, fällt die rechte Hälfte weg. - -Mit dem Rest machst du dasselbe noch einmal. Bei jedem Vergleich halbiert sich der Stapel. - -::: grafik ss-binaere-suche.svg -Drei Vergleiche statt vierzehn: Mit jeder Mitte fällt die Hälfte der übrigen Karten weg. -::: - -Im Struktogramm merken sich zwei Variablen den Bereich, in dem noch gesucht wird: `links` und `rechts`. Die Mitte ist `(links + rechts) / 2`. Weil das eine Ganzzahldivision ist, kommt immer ein ganzer Index heraus. - -::: diagramm ss-binaere-suche.visustruct -Dasselbe Array wie bei der linearen Suche. Suche in der Simulation wieder die 27 und vergleiche die Ausgabe Vergleiche mit der linearen Suche. -::: - -> Die binäre Suche funktioniert **nur bei sortierten Werten**. Bei durcheinander liegenden Karten weißt du nach dem Blick auf die Mitte nicht, in welcher Hälfte du weitersuchen musst. - -::: angeberwissen -Ich denke mir eine Zahl von 1 bis 100, du darfst raten und ich sage nur „größer“ oder „kleiner“. Mit der binären Suche brauchst du höchstens **7** Versuche. Bei einer Zahl bis eine Million sind es höchstens 20, bei einer Milliarde 30. Jede Verdopplung kostet nur einen einzigen Versuch mehr. So suchen auch Datenbanken in Millionen von Einträgen in Sekundenbruchteilen. Ich suche übrigens linear: Ich fresse die Wiese von links nach rechts ab. -::: - -## Wie schnell ist das? - -Wie gut ein Verfahren ist, misst man an der Zahl der Vergleiche, die es **im schlimmsten Fall** braucht. Bei der linearen Suche ist das der Fall, dass die Karte ganz hinten liegt oder fehlt. - -::: grafik ss-vergleiche.svg -Bei 100 Karten braucht die lineare Suche bis zu 100 Vergleiche, die binäre höchstens 7. -::: - -| Anzahl Karten | Lineare Suche | Binäre Suche | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1 000 | 1 000 | 10 | -| 1 000 000 | 1 000 000 | 20 | - -Die lineare Suche wächst im gleichen Maß wie die Kartenzahl. Bei der binären Suche kommt bei doppelt so vielen Karten nur **ein** Vergleich dazu. - -## Sortieren mit Bubblesort - -Für die binäre Suche müssen die Werte sortiert sein. Eines der einfachsten Sortierverfahren ist **Bubblesort**. Du gehst die Reihe von links nach rechts durch und vergleichst immer **zwei Nachbarn**. Steht die größere Karte links, tauschst du die beiden. - -::: grafik ss-bubblesort.svg -Nach einem Durchgang steht die größte Karte ganz rechts. -::: - -Nach dem ersten Durchgang steht die größte Karte ganz rechts, wie eine Luftblase, die nach oben steigt. Daher kommt der Name. Danach wiederholst du den Durchgang für die übrigen Karten. Bei 5 Karten brauchst du 4 Durchgänge. - -Im Struktogramm stecken zwei For-Schleifen ineinander. Die äußere zählt die Durchgänge, die innere vergleicht die Nachbarn `karten[i]` und `karten[i + 1]`. Das Tauschen kennst du schon: Es braucht eine **Hilfsvariable**. - -::: diagramm ss-bubblesort.visustruct -Die innere Schleife wird mit jedem Durchgang kürzer, weil rechts schon die größten Karten richtig stehen. Gehe es in der Simulation mit Schritt durch und beobachte das Array unter Variablen. -::: - -Bubblesort ist leicht zu verstehen, aber langsam. Bei n Karten braucht es bis zu n · (n − 1) / 2 Vergleiche: bei 10 Karten 45, bei 100 Karten schon 4 950 und bei 1 000 Karten fast eine halbe Million. Schnellere Verfahren wie Quicksort lernst du vielleicht später kennen. - -## Übung: Absteigend sortieren - -::: übung ss-absteigend -titel: Absteigend sortieren -auftrag: Das Startdiagramm liest 5 Karten ein und sortiert sie mit Bubblesort **aufsteigend**, also von klein nach groß. Ändere es so, dass die Karten **absteigend** ausgegeben werden, die größte zuerst. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Schau dir die Bedingung in der Verzweigung an. Sie entscheidet, wann zwei Nachbarn getauscht werden. -tipp: Du musst nur ein einziges Zeichen ändern. Wann sollen zwei Nachbarn getauscht werden, wenn die größere Karte nach links soll? -tipp: Ändere in der Verzweigung `karten[i] > karten[i + 1]` in `karten[i] < karten[i + 1]`. Dann wird getauscht, wenn rechts die größere Karte liegt, und die große Karte wandert nach links. -lösung: ss-absteigend-loesung.visustruct -::: - -## Jetzt in Java - -Die lineare Suche aus der Übung sieht in Java so aus: - -```java editor -int[] karten = {8, 4, 11, 4, 6}; -int gesucht = 4; -int position = -1; -int i = 0; -while (position == -1 && i < karten.length) { - if (karten[i] == gesucht) { - position = i; - } - i = i + 1; -} -System.out.println("Position: " + position); -``` - -- `&&` heißt „und“: Die Schleife läuft nur, solange noch nichts gefunden ist **und** es noch Karten gibt. -- Ist der false-Zweig leer, lässt du `else` einfach weg. -- Der Tausch beim Bubblesort braucht auch in Java eine Hilfsvariable: `int hilf = karten[i];` - -::: übung l19-java-zaehlen -titel: Karten zählen -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Schreibe in Java ein Programm, das nach einer Karte fragt und zählt, wie oft sie vorkommt. Es gibt **Anzahl:** und die Zahl aus. - Bei 4 erscheint **Anzahl: 2**. -test: 4 -> Anzahl: 2 -test: 8 -> Anzahl: 1 -test: 9 -> Anzahl: 0 -braucht: forSchleife, verzweigung -tipp: Anders als bei der Suche hörst du beim ersten Treffer nicht auf. Eine For-Schleife geht alle Karten durch. -tipp: `for (int i = 0; i < karten.length; i++)` und darin `if (karten[i] == gesucht) { anzahl = anzahl + 1; }`. `anzahl` startet vor der Schleife mit 0. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Lückentext: Bubblesort - -::: lückentext -titel: Karten sortieren -auftrag: Das Programm sortiert die Karten mit Bubblesort aufsteigend. Ergänze die fehlenden Wörter und Zeichen. -```java -int[] karten = {5, 2, 8, 1}; -for (int runde = 0; runde < karten.[[length]] - 1; runde++) { - for (int i = 0; i < karten.length - 1; i++) { - if (karten[i] [[>]] karten[i + 1]) { - [[int]] hilf = karten[i]; - karten[i] = karten[i + 1]; - karten[i + 1] = [[hilf]]; - } - } -} -for (int i = 0; i < karten.length; i++) { - System.out.println(karten[i]); -} -``` -erklärung: Ist eine Karte größer als ihre rechte Nachbarin, werden die beiden getauscht, mit einer Hilfsvariablen wie beim Gläsertauschen. Nach `length - 1` Runden ist alles sortiert: 1, 2, 5, 8. -::: - -## Fehler finden: Suche - -::: übung l19-java-fehler -titel: Lineare Suche reparieren -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Das Programm soll die **erste** Position der gesuchten Karte ausgeben, bei 4 also **Position: 1**. Es gibt aber **Position: 3** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l19-java-fehler-start.visustruct -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 9 -> Position: -1 -test: 8 -> Position: 0 -braucht: whileSchleife, verzweigung -tipp: Die Schleife läuft immer bis zur letzten Karte. Was passiert, wenn die 4 ein zweites Mal kommt? -tipp: Die Schleife soll aufhören, sobald etwas gefunden ist: `while (position == -1 && i < karten.length)`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l19-java-laeuft-nicht -titel: Karte suchen -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Das Programm sucht die 11 und soll **Position: 2** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Position: 2 -braucht: forSchleife, verzweigung -tipp: Vergleiche die Namen in der Bedingung mit den Namen, die oben angelegt werden. -tipp: Die gesuchte Karte steht in `gesucht` mit kleinem g: `if (karten[i] == gesucht) {` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Suchprofi - -::: spiel frage -titel: Spiel: Suchprofi -intro: Ludwig sucht und sortiert Karten. Wie schnell geht das, und was kommt heraus? Sieben Runden. - -runde: - int[] karten = {8, 4, 11, 4, 6}; - int gesucht = 4; - int position = -1; - int i = 0; - while (position == -1 && i < karten.length) { - if (karten[i] == gesucht) { - position = i; - } - i = i + 1; - } - System.out.println("Position: " + position); -frage: Was wird ausgegeben? -- [x] Position: 1 -- Position: 3 -- Position: 2 -> Die Suche hört bei der ersten 4 auf. Sie liegt im Fach 1, gezählt wird ab 0. - -runde: - int[] karten = {8, 4, 11, 4, 6}; - int gesucht = 7; -frage: Mit derselben linearen Suche: Was steht danach in position? -- 0 -- 5 -- [x] -1 -> Die 7 ist nicht dabei. position bleibt bei -1, das bedeutet „nicht gefunden“. - -runde: -frage: Bei welchen Karten funktioniert die binäre Suche? -- bei allen -- [x] nur bei sortierten -- nur bei weniger als 100 -> Nur wenn die Karten sortiert sind, weißt du nach dem Blick auf die Mitte, in welcher Hälfte du weitersuchen musst. - -runde: -frage: Wie viele Vergleiche braucht die binäre Suche bei 100 Karten höchstens? -- 50 -- [x] 7 -- 100 -> Jeder Vergleich halbiert den Stapel. 7-mal halbieren reicht bis 128 Karten, also auch für 100. - -runde: -frage: Statt 1 000 Karten sind es jetzt 2 000. Wie viele Vergleiche braucht die binäre Suche höchstens mehr? -- [x] einen -- doppelt so viele -- 1 000 -> Der erste Vergleich halbiert 2 000 auf 1 000. Danach geht es weiter wie vorher. - -runde: - int[] karten = {5, 3, 8, 1}; -frage: Ein Durchgang Bubblesort vergleicht von links nach rechts immer zwei Nachbarn. Wie liegen die Karten danach? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 und 3 tauschen, 5 und 8 bleiben, 8 und 1 tauschen. Die größte Karte ist ganz rechts. - -runde: -frage: Bubblesort tauscht `karten[i]` und `karten[i + 1]`. Was braucht es dafür? -- [x] eine Hilfsvariable -- ein zweites Array -- eine binäre Suche -> Wie beim Tauschen zweier Variablen: `int hilf = karten[i];`, sonst geht ein Wert verloren. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, wie die lineare Suche ein Array durchsucht. → Eine Karte suchen -- Ich kann eine lineare Suche als Struktogramm bauen. → Übung: Karte suchen -- Ich kann erklären, warum die binäre Suche nur bei sortierten Werten funktioniert. → Binäre Suche: sortiert geht es schneller -- Ich kann begründen, warum die binäre Suche bei vielen Werten viel schneller ist. → Wie schnell ist das? -- Ich kann einen Durchgang von Bubblesort mit Spielkarten vormachen. → Sortieren mit Bubblesort -- Ich kann in Java ein Array durchsuchen und Treffer zählen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welche Voraussetzung braucht die binäre Suche? -→ Binäre Suche: sortiert geht es schneller -- [ ] Das Array muss genau 100 Fächer haben. -- [x] Die Werte müssen sortiert sein. -- [ ] Der gesuchte Wert muss vorkommen. -> Nur bei sortierten Werten weißt du nach dem Blick auf die Mitte, in welcher Hälfte du weitersuchst. - -? Ein sortiertes Array hat 1 000 Werte. Wie viele Vergleiche braucht die binäre Suche höchstens? -→ Wie schnell ist das? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1 000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: Nach etwa 10 Halbierungen bleibt ein Wert übrig. - -? Was vergleicht Bubblesort in jedem Schritt? -→ Sortieren mit Bubblesort -- [ ] Die erste und die letzte Karte -- [x] Zwei benachbarte Karten -- [ ] Jede Karte mit der Mitte -> Steht die größere Karte links, werden die Nachbarn getauscht. - -? Wo steht nach dem ersten Durchgang von Bubblesort die größte Karte? -→ Sortieren mit Bubblesort -- [ ] Ganz links -- [ ] In der Mitte -- [x] Ganz rechts -> Sie wird bei jedem Vergleich weitergetauscht und steigt wie eine Blase nach rechts. - -? Was bedeutet `position = -1` in der linearen Suche? -→ Eine Karte suchen -- [x] Die Karte wurde (noch) nicht gefunden. -- [ ] Die Karte liegt ganz hinten. -- [ ] Das Array ist leer. - -? Ordne jedem Verfahren die passende Beschreibung zu. -→ Eine Karte suchen -= Lineare Suche -> eine Karte nach der anderen ansehen -= Binäre Suche -> die Mitte ansehen und eine Hälfte weglassen -= Bubblesort -> Nachbarn vergleichen und tauschen - -? Warum nimmst du zum Zählen eine For-Schleife und keine Suche, die beim ersten Treffer aufhört? -→ Jetzt in Java -- [ ] Eine For-Schleife ist immer schneller. -- [x] Du musst jede Karte ansehen, sonst fehlen spätere Treffer. -- [ ] Eine While-Schleife kann keine Arrays durchlaufen. -> Die Karte kann mehrmals vorkommen. Darum gehst du alle Karten bis zum Ende durch. -::: diff --git a/web/lessons/de/20-java.md b/web/lessons/de/20-java.md deleted file mode 100644 index c3a0706e..00000000 --- a/web/lessons/de/20-java.md +++ /dev/null @@ -1,472 +0,0 @@ ---- -titel: Struktogramm und Code -bereich: Vom Struktogramm zum Code -kurz: Alle Elemente in Java auf einen Blick, Code erzeugen, im Bereich Code Java schreiben, ausführen und Fehler suchen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Code-Ansicht öffnen und Java als Sprache wählen -- Ausgabe, Eingabe, Verzweigung und Schleifen in Java erkennen -- den Unterschied zwischen Snippet und Class erklären -- erklären, wie Java-Code mit Compiler, Bytecode und JVM auf jedem Betriebssystem läuft -- JDK und JRE unterscheiden -- erklären, warum man ein C++-Programm für jedes Betriebssystem neu kompilieren muss, ein Java-Programm aber nicht -- ein kurzes Java-Programm als Struktogramm nachbauen -- im Bereich Code Java tippen und das entstehende Struktogramm lesen -- ein Programm mit ▶︎ ausführen und Ein- und Ausgaben in der Konsole nutzen -- an der roten Zeilennummer einen Syntaxfehler oder Laufzeitfehler finden -- Haltepunkte setzen und ein Programm im Einzelschritt verfolgen -::: - -## Die Code-Ansicht - -In den Lektionen 4 bis 19 hast du jedes Element schon einmal in Java geschrieben. Hier siehst du alles auf einen Blick und lernst, wie VisuStruct aus einem ganzen Struktogramm ein Java-Programm macht. - -Ein Struktogramm beschreibt einen Ablauf. Damit ein Computer ihn ausführt, brauchst du ein Programm in einer Programmiersprache. VisuStruct schreibt diesen Code für dich. - -Klicke bei den Werkzeugen auf [Code](#zeige-code) (Symbol mit spitzen Klammern). Rechts erscheint der **Code-Generator**: - -- Oben wählst du die Sprache: **Java**, **Python** oder **JavaScript**. -- Bei Java wählst du zusätzlich **Snippet** (nur die Anweisungen) oder **Class** (eine vollständige Java-Datei). -- **Diagramm-Text als Kommentare** schreibt den Text jedes Kastens als Kommentar über den Code. -- **Kopieren** legt den Code in die Zwischenablage, **Java speichern …** speichert eine `.java`-Datei. - -Der Code ändert sich sofort mit, wenn du am Struktogramm etwas änderst. - -::: angeberwissen -Nassi hat später an der Programmiersprache Ada mitgearbeitet und war bei Apple für Software zuständig. Wer Struktogramme erfindet, landet also nicht im Ziegenstall, sondern bei Apple. -::: - -::: diagramm l17-beispiel.visustruct -Ein kleines Programm mit Eingabe, For-Schleife und Verzweigung. Öffne es und schau dir den Java-Code dazu an. -::: - -## So sieht das Beispiel in Java aus - -Für das Diagramm oben erzeugt VisuStruct als **Snippet** diesen Code: - -``` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Reihe?"); -int zahl = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int ergebnis = zahl * i; - System.out.println(i + " mal " + zahl + " = " + ergebnis); -} -if (zahl > 10) { - System.out.println("Das war schwer!"); -} else { - System.out.println("Das war leicht."); -} -``` - -Jede Anweisung endet in Java mit einem **Semikolon** `;`. Was in einem Kasten steht, steht in Java in **geschweiften Klammern** `{ }`. Die Einrückung zeigt dir, was zusammengehört. - -## Die Elemente in Java - -| Element | Java | Lektion | -|---|---|---| -| Anweisung | `int summe = 0;` | 4, 5 | -| Ausgabe | `System.out.println(summe);` | 6 | -| Eingabe | `int zahl = scanner.nextInt();` | 6 | -| Verzweigung | `if (bedingung) { … } else { … }` | 8, 9 | -| Fallauswahl | `switch (wert) { case 1 -> { … } default -> { … } }` | 10 | -| While-Schleife | `while (bedingung) { … }` | 11 | -| Do-while-Schleife | `do { … } while (bedingung);` | 12 | -| For-Schleife | `for (int i = 0; i < 5; i++) { … }` | 13 | -| Endlosschleife | `while (true) { … }` | 11, 18 | -| Aussprung | `break;` | 18 | -| Aufruf | `berechne();` | 18 | -| Array | `int[] zahlen = new int[5];` | 15, 16 | -| Text (String) | `String name = scanner.next();` | 17 | - -Für Eingaben steht ganz oben einmal `import java.util.Scanner;` und `Scanner scanner = new Scanner(System.in);`. Vor jeder Eingabe gibt VisuStruct die Frage mit `System.out.println(…)` aus. - -Ist der Nein-Zweig einer Verzweigung leer, erzeugt VisuStruct trotzdem einen `else`-Teil, in dem nur der Kommentar `// empty element` steht. Wenn du **Leeren else-Zweig im Code ausgeben** ausschaltest, fällt der leere `else`-Teil weg. - -## Snippet oder Class - -Ein **Snippet** kannst du in ein vorhandenes Java-Programm in die `main`-Methode einfügen. Mit **Class** bekommst du eine vollständige Datei, die du sofort übersetzen und starten kannst: - -``` -import java.util.Scanner; - -public class Einmaleins { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Welche Reihe?"); - int zahl = scanner.nextInt(); - ... - } // Ende main -} // Ende Klasse -``` - -Die Kommentare `// Ende main` und `// Ende Klasse` hinter den letzten beiden Klammern sind nicht nötig, aber sehr hilfreich: So siehst du sofort, welche Klammer was schließt, und vergisst keine. - -Der Name der Klasse kommt aus dem **Titel** des Diagramms. Die Datei muss genauso heißen, hier also `Einmaleins.java`. Das erledigt **Java speichern …** für dich. - -> Der erzeugte Code ist ein guter Anfang, aber prüfe ihn. Legst du eine Variable zuerst an und liest sie später mit einer Eingabe neu ein, schreibt VisuStruct trotzdem `int pin = scanner.nextInt();`. Java meldet dann, dass es `pin` schon gibt. Lösche in dieser Zeile einfach das `int`. - -## Wie Java auf jedem Computer läuft - -Deine Datei `Einmaleins.java` ist **Quellcode**: Text für Menschen. Der Prozessor deines Computers versteht ihn nicht direkt. Deshalb läuft Java in zwei Schritten: - -1. Der **Compiler** `javac` übersetzt den Quellcode in **Bytecode**. Heraus kommt die Datei `Einmaleins.class`. -2. Die **JVM** (Java Virtual Machine) liest den Bytecode und übersetzt ihn beim Ausführen in **Maschinencode**, also in Befehle für den Prozessor deines Computers. - -::: grafik l20-jvm.svg -Einmal kompilieren: Derselbe Bytecode läuft auf jeder JVM. -::: - -Den Bytecode gibt es nur einmal. Die JVM gibt es dagegen für Windows, macOS, Linux und viele andere Systeme. Deshalb läuft dieselbe `.class`-Datei auf jedem Computer, auf dem eine JVM installiert ist. Das nennt man **plattformunabhängig**. Der Werbespruch dazu heißt **„Write once, run anywhere“**: einmal schreiben, überall ausführen. - -::: angeberwissen -Einen der ersten Compiler hat 1952 **Grace Hopper** gebaut, die du schon aus Lektion 7 kennst. Viele sagten ihr damals, Computer könnten nur rechnen und keine Programme übersetzen. Sie hat es trotzdem gemacht. -::: - -Zum Vergleich **C++**: Dort übersetzt der Compiler den Quellcode direkt in Maschinencode für genau einen Prozessor und ein Betriebssystem. Das fertige Programm läuft nur dort. Für Windows, macOS und Linux musst du es jeweils neu kompilieren. - -::: grafik l20-cpp.svg -C++ wird für jedes System einzeln zu Maschinencode kompiliert. -::: - -| | C++ | Java | -|---|---|---| -| Der Compiler erzeugt | Maschinencode | Bytecode | -| Wie oft kompilieren? | für jedes System neu | einmal | -| Was braucht der Computer zum Ausführen? | nichts weiter | eine JVM | - -Ist Java dadurch langsamer? Kaum. Programmteile, die oft laufen, zum Beispiel Schleifen, übersetzt der **JIT-Compiler** der JVM („just in time“, gerade rechtzeitig) einmal komplett in Maschinencode. Danach laufen sie fast so schnell wie C++. - -> Stell dir die JVM wie einen kleinen Computer aus Software vor, fast wie ein eigenes Betriebssystem nur für Java-Programme. Genau genommen ist sie aber kein Betriebssystem, sondern eine **virtuelle Maschine**: ein Programm, das selbst auf Windows, macOS oder Linux läuft und darin einen gedachten Computer nachspielt. - -Beim Installieren begegnen dir zwei Abkürzungen: - -| Abkürzung | Was steckt drin? | Wofür? | -|---|---|---| -| **JRE** (Java Runtime Environment) | die JVM und fertige Bausteine wie `Scanner` | Java-Programme ausführen | -| **JDK** (Java Development Kit) | die JRE und dazu den Compiler `javac` und weitere Werkzeuge | Java-Programme schreiben und übersetzen | - -Zum Programmieren brauchst du also das JDK. Heute lädt man meist nur noch das JDK herunter, die JRE steckt darin. Für VisuStruct im Browser musst du nichts davon installieren. - -::: angeberwissen -Mit einem JDK kannst du alles auch selbst in der Konsole machen, also im Terminal oder in der Eingabeaufforderung: - -``` -java -version -javac Einmaleins.java -java Einmaleins -``` - -- `java -version` zeigt, welche Java-Version installiert ist. Kommt eine Fehlermeldung, fehlt Java noch. -- `javac Einmaleins.java` startet den Compiler. Danach hast du zwei Dateien im Ordner: `Einmaleins.java` mit deinem Quellcode und neu `Einmaleins.class` mit dem Bytecode. -- `java Einmaleins` startet die JVM mit deinem Bytecode. Den Klassennamen schreibst du hier ohne `.class`. - -Klappt `java -version`, aber `javac -version` nicht, ist nur eine JRE installiert. Dann fehlt dir das JDK. -::: - -::: angeberwissen -Jede übersetzte Java-Datei (`.class`) beginnt mit denselben vier Bytes, in Hexadezimal geschrieben: `CA FE BA BE`. Daran erkennt der Computer, dass es Java ist. Das „Kaffee-Baby“ hat sich James Gosling ausgedacht, passend zum Kaffee im Namen. -::: - -## Der Java-Sprachmodus - -Unter dem [Zahnrad](#zeige-einstellungen) oben rechts kannst du **Code-Keywords** einschalten. Dann heißen die Bausteine im Bereich Elemente so wie die Befehle in Java: `if`, `switch`, `for`, `while`, `do`, `while(true)`, `break` und `call`. Die übrige Oberfläche bleibt in deiner Sprache. - -Das hilft dir, die Kästen und die Java-Befehle einander zuzuordnen. Dein Diagramm selbst bleibt dabei unverändert. - -## Java direkt schreiben - -Bisher hast du zuerst das Struktogramm gezeichnet und dann den Code angesehen. Im Bereich [Code](#zeige-codelive) geht es auch andersherum. Klicke rechts auf die schmale Leiste **Code**. Neben dem Struktogramm erscheint eine Spalte, in die du Java selbst tippst. - -- **Struktogramm zu Code:** Änderst du etwas im Struktogramm, ändert sich der Java-Code sofort mit. -- **Code zu Struktogramm:** Tippst du Java, baut VisuStruct beim Tippen das Struktogramm dazu. Fehlt noch etwas, zum Beispiel eine schließende Klammer `}`, steht unter dem Code ein Hinweis. -- **Vorschläge:** Beim Tippen schlägt VisuStruct Vorlagen vor, etwa für `if`, `for` oder `while`. Mit der Eingabetaste übernimmst du eine Vorlage. Grau geschriebene Platzhalter ersetzt du einfach durch deinen Text. -- **Einrücken:** Ist dein Code durcheinandergeraten, klicke oben im Bereich Code auf den Knopf **Einrücken**. Jede Ebene steht dann vier Leerzeichen tiefer, wie in Eclipse oder IntelliJ. Hast du Zeilen markiert, rückt VisuStruct nur diese ein. - -So kannst du beide Wege ausprobieren. Erst das Struktogramm zeichnen ist gut, um einen Ablauf zu planen. Direkt Code schreiben ist schneller, wenn du schon weißt, was du willst. Das Struktogramm hilft dir dann, deinen Code zu kontrollieren. - -## Das Programm ausführen - -Oben im Bereich Code startet [▶︎ Ausführen](#zeige-ausfuehren) dein Programm, **■ Stopp** bricht es ab, zum Beispiel bei einer Endlosschleife. Was dein Programm ausgibt, erscheint unten in der [Konsole](#zeige-konsole). Fragt es nach einer Eingabe, tippst du sie dort ein und drückst die Eingabetaste. - -Die Grenze zwischen Code und Konsole kannst du mit der Maus nach oben oder unten ziehen. - -Geht etwas schief, wird die Zeilennummer rot. Bei einem Syntaxfehler ist die Stelle zusätzlich rot unterstrichen, und es steht z. B. **Zeile 2: Hier fehlt noch: ;** darunter. Dann startet ▶︎ das Programm gar nicht erst. Bricht das Programm beim Ausführen ab, ist es ein Laufzeitfehler, und die Konsole nennt die Zeile, z. B. **Zeile 3: Division durch null.** Die drei Fehlerarten kennst du aus der Lektion „Simulation und Schreibtischtest“. - -Weiß VisuStruct genau, was fehlt, steht am Ende der Zeile eine 💡. Fährst du mit der Maus darauf, siehst du den Vorschlag, z. B. **Vorschlag: import java.util.Scanner; einfügen**. Ein Klick übernimmt ihn. Lies trotzdem nach, was eingefügt wurde, damit du es beim nächsten Mal selbst weißt. - -> Der Bereich Code versteht die Java-Befehle, die es auch als Kasten im Struktogramm gibt. Eigene Klassen und Objekte kennt es noch nicht. Fenster mit Swing gehen trotzdem: Schalte dafür im Zahnrad **Echtes Java (mit Swing)** ein (Lektion „Dein erstes Fenster“). - -::: angeberwissen -Profis nennen ein Programm, in dem man Code schreibt, ausführt und Fehler sucht, eine **IDE** (Integrated Development Environment). Mit dem Bereich Code ist VisuStruct eine kleine IDE mit eingebautem Struktogramm. -::: - -## Fehler suchen mit dem Debugger - -Manchmal läuft ein Programm, rechnet aber falsch. Das ist ein Logikfehler. Dann hilft der **Debugger**: Er führt dein Programm langsam aus, und du schaust ihm dabei zu. - -- **Haltepunkt:** Klicke links auf eine Zeilennummer. Ein roter Punkt erscheint. [▶︎ Ausführen](#zeige-ausfuehren) hält vor dieser Zeile an. Ein zweiter Klick nimmt den Punkt wieder weg. -- **Gelbe Zeile:** Sie wird als Nächstes ausgeführt. Im Struktogramm ist der passende Kasten markiert. -- **Variablen:** Unter dem Code steht, welchen Wert jede Variable gerade hat. Was sich seit dem letzten Anhalten geändert hat, leuchtet kurz gelb. -- **Einzelschritt:** Der Knopf [Einzelschritt](#zeige-einzelschritt) neben ▶︎ führt genau eine Zeile aus und hält wieder an. Ohne Haltepunkt startet er das Programm und hält vor der ersten Zeile. -- **Weiter:** ▶︎ läuft bis zum nächsten Haltepunkt oder bis zum Ende. **■ Stopp** bricht ab. - -Probier es mit diesem Programm aus. Setze einen Haltepunkt in Zeile 3 und drücke mehrmals ▶︎. Wie wachsen `i` und `summe`? - -``` -int summe = 0; -for (int i = 1; i <= 4; i++) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -``` - -::: ludwig -Das ist ein Schreibtischtest, nur dass der Computer für dich mitschreibt. Überleg dir vor jedem Schritt, welchen Wert die Variable gleich haben müsste. Stimmt die Tabelle nicht mit deiner Vermutung überein, hast du die Stelle mit dem Fehler gefunden. -::: - -## Übung: Erst Code, dann Struktogramm - -Diesmal zeichnest du nicht. Öffne den Bereich Code und tippe diesen Java-Code ab: - -``` -System.out.println("Startzahl?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -``` - -::: übung l20-countdown -titel: Countdown -bereich: beide -auftrag: Tippe den Java-Code oben im Bereich Code ab. Führe ihn mit ▶︎ aus und gib in der Konsole eine Startzahl ein. - Sieh dir dann das Struktogramm an, das dabei entstanden ist, und klicke auf Prüfen. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Öffne den Bereich Code mit der schmalen Leiste ganz rechts und tippe einfach los. -tipp: Achte auf das Semikolon am Ende jeder Anweisung und auf die geschweiften Klammern der While-Schleife. Unter dem Code steht ein Hinweis, wenn noch etwas fehlt. -lösung: l20-countdown-loesung.visustruct -::: - -## Übung: Java als Struktogramm - -Jetzt andersherum: Hier ist ein Stück Java-Code. Baue es als Struktogramm nach. - -``` -System.out.println("Zahl eingeben"); -int n = scanner.nextInt(); -int fakultaet = 1; -for (int i = 1; i <= n; i++) { - fakultaet = fakultaet * i; -} -System.out.println(fakultaet); -``` - -::: übung l17-fakultaet -titel: Fakultät aus Java -bereich: beide -auftrag: Baue den Java-Code oben als Struktogramm nach. Das Programm liest eine Zahl n ein und gibt das Produkt 1 · 2 · … · n aus. - Kontrolliere am Ende in der Code-Ansicht, ob dein Java-Code genauso aussieht. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Lies den Java-Code Zeile für Zeile und überlege, welcher Kasten zu jeder Zeile passt. -tipp: Die beiden ersten Java-Zeilen sind zusammen eine einzige Eingabe: `input: int n "Zahl eingeben"`. Die For-Schleife hat die drei Felder `int i = 1`, `i <= n` und `i++`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Übung: else if - -In Java schreibt man mehrere Fälle oft als `else if`: - -``` -if (alter < 6) { - System.out.println("Eintritt frei"); -} else if (alter < 18) { - System.out.println("Kinderticket: 4 Euro"); -} else { - System.out.println("Erwachsenenticket: 8 Euro"); -} -``` - -Im Struktogramm gibt es kein `else if`. Dort steckt eine zweite Verzweigung im Nein-Zweig der ersten. Steht im Nein-Zweig nur diese eine Verzweigung, macht VisuStruct beim Erzeugen des Codes daraus wieder `else if`, in Python `elif`. - -::: übung l17-ticket -titel: Ticketpreis -bereich: beide -auftrag: Frage nach dem Alter als ganze Zahl und baue den Java-Code oben als Struktogramm nach. -test: 5 -> Eintritt frei -test: 6 -> Kinderticket: 4 Euro -test: 17 -> Kinderticket: 4 Euro -test: 18 -> Erwachsenenticket: 8 Euro -braucht: verzweigung -tipp: Im Java-Code steckt in einem `else` ein weiteres `if`. Im Struktogramm ist das eine Verzweigung in einem Zweig. -tipp: Ziehe in den false-Zweig der ersten Verzweigung eine zweite Verzweigung mit der Bedingung `alter < 18`. -lösung: l17-ticket-loesung.visustruct -::: - -## Spiel: Welcher Kasten? - -::: spiel frage -titel: Spiel: Welcher Kasten? -intro: Ludwig zeigt dir Java. Welcher Kasten aus dem Struktogramm steckt dahinter? Acht Runden. -frage: Welcher Kasten ist das? - -runde: - do { - zahl = zahl * 2; - } while (zahl < 100); -- While-Schleife -- [x] Do-while-Schleife -- For-Schleife -> Die Bedingung steht unten. Der Rumpf läuft also mindestens einmal. - -runde: - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - default -> { System.out.println("Gibt es nicht."); } - } -- Verzweigung -- [x] Fallauswahl -- Aufruf -> Eine Variable wird mit festen Werten verglichen: Das ist die Fallauswahl. - -runde: - break; -- Aufruf -- Endlosschleife -- [x] Aussprung -> `break` verlässt sofort die Schleife, in der es steht. - -runde: - berechne(); -- [x] Aufruf -- Ausgabe -- Anweisung -> Name mit runden Klammern: Hier wird ein Unterprogramm aufgerufen. - -runde: - int zahl = scanner.nextInt(); -- Ausgabe -- [x] Eingabe -- Aufruf -> Der Scanner liest einen Wert ein. Das ist eine Eingabe. - -runde: - while (true) { - System.out.println("Hallo"); - } -- While-Schleife mit Bedingung -- [x] Endlosschleife -- Do-while-Schleife -> `while (true)` hat keine echte Bedingung. Nur ein break könnte sie beenden. - -runde: -frage: Du willst eine vollständige Java-Datei, die du sofort übersetzen und starten kannst. Was wählst du in der Code-Ansicht? -- Snippet -- [x] Class -> Ein Snippet sind nur die Anweisungen für die `main`-Methode. Class erzeugt die ganze Datei. - -runde: -frage: Im Debugger ist eine Zeile gelb. Was bedeutet das? -- Sie hat einen Fehler. -- [x] Sie wird als Nächstes ausgeführt. -- Dort steht ein Haltepunkt. -> Gelb ist die nächste Zeile. Ein Haltepunkt ist ein roter Punkt an der Zeilennummer. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Code-Ansicht öffnen und Java als Sprache wählen. → Die Code-Ansicht -- Ich kann Ausgabe, Eingabe, Verzweigung und Schleifen in Java erkennen. → Die Elemente in Java -- Ich kann den Unterschied zwischen Snippet und Class erklären. → Snippet oder Class -- Ich kann erklären, wie Java-Code mit Compiler, Bytecode und JVM auf jedem Betriebssystem läuft. → Wie Java auf jedem Computer läuft -- Ich kann JDK und JRE unterscheiden. → Wie Java auf jedem Computer läuft -- Ich kann erklären, warum man ein C++-Programm für jedes Betriebssystem neu kompilieren muss, ein Java-Programm aber nicht. → Wie Java auf jedem Computer läuft -- Ich kann ein kurzes Java-Programm als Struktogramm nachbauen. → Übung: Java als Struktogramm -- Ich kann im Bereich Code Java tippen und das entstehende Struktogramm lesen. → Java direkt schreiben -- Ich kann ein Programm mit ▶︎ ausführen und Ein- und Ausgaben in der Konsole nutzen. → Das Programm ausführen -- Ich kann an der roten Zeilennummer einen Syntaxfehler oder Laufzeitfehler finden. → Das Programm ausführen -- Ich kann Haltepunkte setzen und ein Programm im Einzelschritt verfolgen. → Fehler suchen mit dem Debugger -::: - -## Wissenstest - -::: quiz -? Wie sieht `output: "Hallo"` in Java aus? -→ Die Elemente in Java -- [ ] print("Hallo") -- [x] System.out.println("Hallo"); -- [ ] console.log("Hallo"); -> print ist Python, console.log ist JavaScript. - -? Woher kommt der Klassenname bei Class? -→ Snippet oder Class -- [ ] Er heißt immer Main. -- [x] Aus dem Titel des Diagramms -- [ ] Aus dem ersten Kasten -> Ohne Titel heißt die Klasse Main. - -? Welcher Java-Code gehört zu einer Do-while-Schleife? -→ Die Elemente in Java -- [ ] while (bedingung) { … } -- [x] do { … } while (bedingung); -- [ ] for (;;) { … } -> Bei do-while steht die Bedingung am Ende, deshalb läuft der Rumpf mindestens einmal. - -? Was wird aus einem Aussprung im Java-Code? -→ Die Elemente in Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? Was passiert an einem roten Punkt vor der Zeilennummer? -→ Fehler suchen mit dem Debugger -- [ ] Die Zeile wird übersprungen. -- [x] Das Programm hält vor dieser Zeile an. -- [ ] Die Zeile enthält einen Fehler. -> Das ist ein Haltepunkt. Danach geht es mit ▶︎ oder dem Einzelschritt weiter. - -? Warum läuft dieselbe `.class`-Datei auf Windows, macOS und Linux? -→ Wie Java auf jedem Computer läuft -- [ ] Der Compiler erzeugt für jedes Betriebssystem eine eigene Datei. -- [x] Auf jedem Betriebssystem führt eine JVM denselben Bytecode aus. -- [ ] Java-Programme brauchen kein Betriebssystem. -> Der Bytecode bleibt gleich. Nur die JVM gibt es für jedes System extra. - -? Was brauchst du, um Java-Programme zu schreiben und zu übersetzen? -→ Wie Java auf jedem Computer läuft -- [ ] nur die JRE -- [x] das JDK -- [ ] nur die JVM -> Die JRE reicht zum Ausführen. Den Compiler `javac` gibt es nur im JDK. - -? Du willst dein Programm auf Windows und auf dem Mac nutzen. Was stimmt? -→ Wie Java auf jedem Computer läuft -- [ ] Java musst du für jedes System neu kompilieren, C++ nicht. -- [x] C++ musst du für jedes System neu kompilieren, Java nicht. -- [ ] Beide musst du nur einmal kompilieren. -> C++ wird direkt zu Maschinencode für ein System. Java wird zu Bytecode, und den führt auf jedem System die JVM aus. - -? Die Zeilennummer 3 im Bereich Code ist rot. Was heißt das? -→ Das Programm ausführen -- [ ] In Zeile 3 ist ein Haltepunkt. -- [x] In Zeile 3 steckt ein Fehler. -- [ ] Zeile 3 wird als Nächstes ausgeführt. -> Der Haltepunkt ist ein runder roter Punkt, die nächste Zeile ist gelb. Eine rote Zeilennummer zeigt einen Syntaxfehler oder einen Laufzeitfehler. -::: diff --git a/web/lessons/de/21-python-und-javascript.md b/web/lessons/de/21-python-und-javascript.md deleted file mode 100644 index d73a08d3..00000000 --- a/web/lessons/de/21-python-und-javascript.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -titel: Python und JavaScript -bereich: Vom Struktogramm zum Code -kurz: Python- und JavaScript-Code aus dem Struktogramm erzeugen und JavaScript direkt im Browser ausführen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Python und JavaScript in der Code-Ansicht auswählen und vergleichen -- erklären, dass Python Blöcke durch Einrückung bildet und keine Datentypen braucht -- erklären, was VisuStruct beim Übersetzen nach Python anpasst -- JavaScript mit Im Browser testen ausführen -::: - -## Dasselbe Diagramm, drei Sprachen - -In der Code-Ansicht ([Code](#zeige-code) bei den Werkzeugen) wählst du oben die Sprache. Das Struktogramm bleibt gleich, nur die Schreibweise ändert sich. So kannst du die Sprachen gut vergleichen. - -::: diagramm l18-beispiel.visustruct -Eine Zahl wird so lange um 3 verkleinert, bis sie nicht mehr größer als 0 ist. -::: - -## Python - -Für das Diagramm oben erzeugt VisuStruct diesen Python-Code: - -``` -zahl = int(input("Startwert?")) -while zahl > 0: - print(zahl) - zahl = zahl - 3 -print("Ende") -``` - -Was in Python anders ist als in Java: - -- Es gibt **keine Semikolons** und **keine geschweiften Klammern**. Was zu einer Schleife oder Verzweigung gehört, erkennt Python allein an der **Einrückung**. Hinter `while`, `if` und `else` steht ein Doppelpunkt. -- Variablen bekommen **keinen Datentyp**: aus `int zahl = 5` wird `zahl = 5`. -- Die Ausgabe heißt `print(…)`, die Eingabe `input(…)`. Für eine Zahl steht `int(…)` darum herum. -- Arrays heißen in Python **Listen**: aus `int[] zahlen = {2, 4, 6}` wird `zahlen = [2, 4, 6]`, und aus `zahlen.length` wird `len(zahlen)`. -- Eine einfache For-Schleife wie `int i = 0`, `i < 5`, `i++` wird zu `for i in range(5):`. - -## Worauf du bei Python achten musst - -Python ist an einigen Stellen strenger als Java. VisuStruct übersetzt die Java-Schreibweise beim Export deshalb gleich mit: - -- **Text und Zahl mit +:** `"Summe: " + summe` wird zu `"Summe: " + str(summe)`. Ohne `str(…)` bricht Python ab. -- **i++ gibt es nicht:** daraus wird `i += 1`. -- **&&, || und !** heißen in Python `and`, `or` und `not`, `true` und `false` werden zu `True` und `False`. -- **Ganzzahlige Division:** In Python ergibt `7 / 2` immer 3.5. Teilt das Struktogramm zwei `int`-Werte, schreibt VisuStruct deshalb `7 // 2`, das ergibt wie in Java 3. -- **For-Schleifen:** Zählschleifen werden zu `for … in range(…)`, auch mit `i <= n`, Rückwärtszählen oder Schritten wie `i = i + 2`. Passt eine Schleife nicht dazu, wird daraus eine `while`-Schleife. -- **do-while gibt es nicht:** daraus wird `while True:` mit `if not (…): break` am Ende. - -Ist ein Diagramm als **Pseudocode** markiert, steht nur ein Hinweis über dem Code. Dann ist der Text eine Skizze und kein lauffähiges Programm. - -## JavaScript - -Dasselbe Diagramm in JavaScript: - -``` -"use strict"; - -let zahl = parseInt((prompt("Startwert?") ?? "0"), 10); -while (zahl > 0) { - console.log(zahl); - zahl = zahl - 3; -} -console.log("Ende"); -``` - -JavaScript sieht Java ähnlich: geschweifte Klammern, Semikolons, `while (…)` und `if (…)`. Die Unterschiede: - -- Variablen werden mit `let` angelegt, ohne Datentyp. Konstanten mit `const`. -- Die Ausgabe heißt `console.log(…)`, die Eingabe `prompt(…)`. Mit `parseInt(…)` wird aus der Eingabe eine ganze Zahl. -- Arrays stehen in eckigen Klammern: `let zahlen = [2, 4, 6];`. -- `"use strict";` ganz oben sorgt dafür, dass JavaScript bei Tippfehlern in Variablennamen meckert. -- JavaScript kennt nur einen Zahlentyp. Teilt das Struktogramm zwei `int`-Werte, schreibt VisuStruct `Math.trunc(a / b)`. Dann fallen die Nachkommastellen wie in Java weg. - -::: angeberwissen -JavaScript hat mit Java fast nichts zu tun. Brendan Eich hat es 1995 in nur zehn Tagen für den Browser Netscape gebaut. Erst hieß es Mocha, dann LiveScript. Weil Java gerade alle begeisterte, wurde es kurz vor dem Start aus Werbegründen in JavaScript umbenannt. Seitdem werden die beiden ständig verwechselt, bis heute. Programmierer sagen dazu: Java und JavaScript haben so viel gemeinsam wie Auto und Autogramm. -::: - -## JavaScript im Browser ausführen - -JavaScript ist die Sprache der Browser. Deshalb kann VisuStruct den Code **sofort ausführen**: - -::: angeberwissen -Warum sind Links im Browser eigentlich blau? Ben Shneidermans Team hat 1985 untersucht, welche Farbe man gut sieht und die beim Lesen nicht stört. Gewonnen hat Hellblau. Rot fiel zwar mehr auf, aber man konnte sich den Text danach schlechter merken. -::: - -1. Wähle in der Code-Ansicht **JavaScript**. -2. Klicke auf **Im Browser testen**. -3. Unter **Ausgabe** erscheint, was `console.log` ausgibt. Fragt das Programm mit `prompt` nach einem Wert, tippst du ihn ein und klickst auf **OK**. -4. Mit **Stopp** brichst du das Programm ab. - -Eine Endlosschleife `while (true)` hält VisuStruct nach 100 000 Durchläufen von selbst an und meldet **Ausführung gestoppt: mögliche Endlosschleife.** - -> Ein **Aufruf** braucht im JavaScript-Code ein Unterprogramm mit diesem Namen, sonst meldet JavaScript einen Fehler. Anders als die Simulation sucht der Browser nicht in den anderen Reitern. - -## Übung: Python als Struktogramm - -Dieses Python-Programm gibt alle geraden Zahlen von 0 bis zu einer Grenze aus: - -``` -grenze = int(input("Bis wohin?")) -for i in range(0, grenze + 1, 2): - print(i) -``` - -`range(0, grenze + 1, 2)` heißt: bei 0 anfangen, vor `grenze + 1` aufhören, in Zweierschritten zählen. - -::: übung l18-python -titel: Gerade Zahlen -bereich: beide -auftrag: Baue das Python-Programm oben als Struktogramm mit einer For-Schleife nach. Bei der Grenze 7 gibt es 0, 2, 4 und 6 aus. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: `range(0, grenze + 1, 2)` zählt von 0 bis zur Grenze in Zweierschritten. Das ist eine For-Schleife. -tipp: Die drei Felder der For-Schleife sind `int i = 0`, `i <= grenze` und `i = i + 2`. -lösung: l18-python-loesung.visustruct -::: - -## Übung: JavaScript als Struktogramm - -``` -let alter = parseInt((prompt("Wie alt bist du?") ?? "0"), 10); -if (alter >= 16) { - console.log("Du darfst wählen."); -} else { - let jahre = 16 - alter; - console.log("Noch " + jahre + " Jahre warten."); -} -``` - -::: übung l18-js -titel: Wählen ab 16 -bereich: beide -auftrag: Baue den JavaScript-Code oben als Struktogramm nach. Teste danach in der Code-Ansicht mit **JavaScript** und **Im Browser testen**, ob dein Code dasselbe ausgibt wie die Simulation. -test: 12 -> Noch 4 Jahre warten. -test: 16 -> Du darfst wählen. -test: 13 -> Noch 3 Jahre warten. -test: 40 -> Du darfst wählen. -braucht: verzweigung -tipp: Lies den Code Zeile für Zeile. `if` und `else` werden zu einer Verzweigung. -tipp: `prompt` und `parseInt` sind zusammen eine Eingabe: `input: int alter "Wie alt bist du?"`. Im false-Zweig stehen zwei Kästen: erst `int jahre = 16 - alter`, dann die Ausgabe. -lösung: l18-js-loesung.visustruct -::: - -## Spiel: Welche Sprache? - -::: spiel frage -titel: Spiel: Welche Sprache? -intro: Ludwig hat Zeilen aus drei Sprachen gemischt. Erkennst du, woher jede stammt? Acht Runden. -frage: In welcher Sprache ist das geschrieben? -antworten: Java | Python | JavaScript - -runde: - print(zahl) -richtig: Python -> Die Ausgabe heißt in Python `print(…)`, ohne Semikolon. - -runde: - console.log(zahl); -richtig: JavaScript -> `console.log` ist die Ausgabe in JavaScript. - -runde: - System.out.println(zahl); -richtig: Java -> Die lange Ausgabe mit `System.out` gibt es nur in Java. - -runde: - let zahlen = [2, 4, 6]; -richtig: JavaScript -> `let` und eckige Klammern: ein Array in JavaScript. - -runde: - for i in range(5): -richtig: Python -> Doppelpunkt statt geschweifter Klammern und `range`: typisch Python. - -runde: - int[] zahlen = {2, 4, 6}; -richtig: Java -> Nur Java schreibt den Datentyp `int[]` davor. - -runde: - zahl = int(input("Startwert?")) -richtig: Python -> Kein Datentyp vor der Variablen, kein Semikolon, und `int(…)` um die Eingabe. - -runde: - let zahl = parseInt(prompt("Startwert?"), 10); -richtig: JavaScript -> `prompt` fragt im Browser nach einem Wert, `parseInt` macht eine Zahl daraus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Python und JavaScript in der Code-Ansicht auswählen und vergleichen. → Dasselbe Diagramm, drei Sprachen -- Ich kann erklären, dass Python Blöcke durch Einrückung bildet und keine Datentypen braucht. → Python -- Ich kann erklären, was VisuStruct beim Übersetzen nach Python anpasst. → Worauf du bei Python achten musst -- Ich kann JavaScript mit Im Browser testen ausführen. → JavaScript im Browser ausführen -::: - -## Wissenstest - -::: quiz -? Woran erkennt Python, welche Zeilen zu einer Schleife gehören? -→ Python -- [ ] An den geschweiften Klammern -- [x] An der Einrückung -- [ ] Am Semikolon am Zeilenende - -? Wie heißt `output: summe` in JavaScript? -→ Dasselbe Diagramm, drei Sprachen -- [ ] print(summe) -- [ ] System.out.println(summe); -- [x] console.log(summe); - -? Welche Sprache kann VisuStruct direkt im Browser ausführen? -→ JavaScript im Browser ausführen -- [ ] Java -- [ ] Python -- [x] JavaScript -> Jeder Browser kann JavaScript ausführen. Für Java und Python brauchst du ein eigenes Programm. - -? Was passiert in Python bei `print("Summe: " + summe)`, wenn summe die Zahl 7 ist? -→ Worauf du bei Python achten musst -- [ ] Es wird Summe: 7 ausgegeben. -- [x] Python meldet einen Fehler, weil Text und Zahl nicht mit + verbunden werden können. -- [ ] Es wird Summe: ausgegeben. -> Mit str(summe) wird aus der Zahl ein Text. -::: diff --git a/web/lessons/de/22-try-und-catch.md b/web/lessons/de/22-try-und-catch.md deleted file mode 100644 index dd0444fc..00000000 --- a/web/lessons/de/22-try-und-catch.md +++ /dev/null @@ -1,293 +0,0 @@ ---- -titel: Wenn das Programm abstürzt: try und catch -bereich: Fehler abfangen -kurz: Mit echtem Java Fehlermeldungen lesen und Abstürze mit try und catch abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- echtes Java im Bereich Code einschalten -- aus einer Fehlermeldung die Exception und die Zeile ablesen -- eine Exception mit try und catch auffangen -- Text mit Integer.parseInt in eine Zahl umwandeln und die NumberFormatException abfangen -- ein Programm schreiben, das sicher teilt, auch durch 0 -::: - -## Abgestürzt! - -Dieses Programm soll drei Noten ausgeben. Tippe es im Bereich [Code](#zeige-codelive) ab und klicke auf [▶︎ Ausführen](#zeige-ausfuehren): - -```java -int[] noten = {2, 3, 1}; -System.out.println("Erste Note: " + noten[0]); -System.out.println("Vierte Note: " + noten[3]); -System.out.println("Fertig!"); -``` - -Die erste Note erscheint, dann ist Schluss. VisuStruct meldet „Ungültiger Ausdruck: noten[3]“, und „Fertig!“ kommt nie an. Das Array hat nur die Fächer 0, 1 und 2, ein Fach 3 gibt es nicht. - -::: ludwig -Ist dir das auch schon passiert? Ein kleiner Fehler, und das ganze Programm ist weg. Mir ist das so oft passiert, dass ich vor dem Bildschirm geweint habe. Aber es gibt eine Lösung, und die heißt **try** und **catch**. -::: - -::: angeberwissen -1947 fand das Team von Grace Hopper im Rechner Mark II an der Universität Harvard eine Motte, die einen Fehler verursacht hatte. Sie klebten sie ins Logbuch und schrieben dazu: „First actual case of bug being found“. Seitdem heißen Programmfehler **Bugs** (englisch für Käfer). -::: - -## Echtes Java einschalten - -Der Bereich Code rechnet normalerweise mit derselben Simulation wie das Struktogramm. Die hält bei einem Fehler einfach an. Um zu sehen, was echtes Java macht, schaltest du echtes Java ein: - -1. Klicke oben rechts auf das [Zahnrad](#zeige-einstellungen) und wähle als **Programmiersprache** Java. -2. Setze im Abschnitt Java den Haken bei **Echtes Java (mit Swing)**. - -Beim ersten Ausführen lädt VisuStruct einmalig etwa 40 MB. Danach wird dein Code wie in einer richtigen Java-Entwicklungsumgebung übersetzt und ausgeführt. - -> Mit echtem Java funktionieren Eingaben über die Konsole (`Scanner`) noch nicht. Unsere Beispiele kommen deshalb ohne Eingabe aus. - -Schreib das Programm jetzt als ganze Klasse, damit die Zeilennummern stimmen, und führe es aus: - -```java -public class Noten { - public static void main(String[] args) { - int[] noten = {2, 3, 1}; - System.out.println("Erste Note: " + noten[0]); - System.out.println("Vierte Note: " + noten[3]); - System.out.println("Fertig!"); - } -} -``` - -In der [Konsole](#zeige-konsole) steht jetzt: - -``` -Erste Note: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Noten.main(Noten.java:5) -``` - -## Die Fehlermeldung lesen - -So eine Meldung sieht erst einmal erschreckend aus. Sie verrät dir aber genau, was los ist: - -| Teil | Bedeutung | -|---|---| -| `ArrayIndexOutOfBoundsException` | Die Art des Fehlers: Der Index liegt außerhalb des Arrays. | -| `3` | Der falsche Index. | -| `Noten.java:5` | Die Zeile, in der es passiert ist: Zeile 5. | - -So einen Laufzeitfehler nennt Java eine **Exception** (englisch für Ausnahme). Man sagt: Java *wirft* eine Exception. Fängt sie niemand auf, bricht das Programm ab. Deshalb erscheint „Fertig!“ nicht. - -::: ludwig -Lies Fehlermeldungen immer von oben: Erst der Name der Exception, dann die Zeilennummer. Die Zeilennummern stehen im Bereich Code links neben dem Code. -::: - -## try und catch - -Mit **try** und **catch** fängst du die Exception auf. Ändere die Zeile mit `noten[3]` so: - -```java -try { - System.out.println("Vierte Note: " + noten[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Diese Note gibt es nicht."); -} -System.out.println("Fertig!"); -``` - -- `try` heißt „versuche“. Java führt den Block in den geschweiften Klammern ganz normal aus. -- Wirft eine Zeile darin eine Exception, springt Java sofort in den `catch`-Block. Der Rest des `try`-Blocks wird übersprungen. -- In der Klammer hinter `catch` steht, welche Exception aufgefangen wird, und ein Name dafür, meistens `e`. -- Danach geht das Programm normal weiter. Jetzt erscheint auch „Fertig!“. - -Läuft im `try`-Block alles gut, wird der `catch`-Block einfach übersprungen. - -::: ludwig -try und catch sind wie das Netz unter dem Trapez im Zirkus: Solange alles klappt, merkst du nichts davon. Fällt jemand, fängt das Netz ihn auf, und die Vorstellung geht weiter. -::: - -> Im Struktogramm gibt es keinen Kasten für try und catch. VisuStruct zeigt den ganzen Block deshalb als eine Anweisung. Ausführen kannst du ihn nur mit echtem Java. - -::: angeberwissen -Im Juli 1969 landete Apollo 11 auf dem Mond. Kurz vor der Landung meldete der Bordcomputer plötzlich die Fehler **1202** und **1201**: Er hatte mehr zu tun, als er schaffen konnte. Abgestürzt ist er trotzdem nicht. Das Team von **Margaret Hamilton** hatte die Software so gebaut, dass sie solche Fehler erkennt, Unwichtiges liegen lässt und nur das Wichtigste weiterrechnet. Die Landung klappte. - -Margaret Hamilton leitete am MIT die Gruppe, die die Software für die Apollo-Raumschiffe schrieb. Sie plante immer ein, dass etwas schiefgehen kann, so wie du mit `try` und `catch`. Damit Software genauso ernst genommen wird wie Hardware, nannte sie ihre Arbeit **Software Engineering**. Heute heißt so ein ganzes Fach der Informatik. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (geb. 1936) im Jahr 1969 neben den ausgedruckten Programmen, die ihr Team für Apollo geschrieben hat (Foto: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), gemeinfrei). -::: - -## Text in eine Zahl umwandeln - -Oft steht eine Zahl zuerst als Text da, zum Beispiel später in einem Textfeld im Fenster. `Integer.parseInt` wandelt Text in eine ganze Zahl um: - -```java -String eingabe = "zwölf"; -try { - int zahl = Integer.parseInt(eingabe); - System.out.println("Doppelt: " + zahl * 2); -} catch (NumberFormatException e) { - System.out.println("Das ist keine Zahl: " + eingabe); -} -``` - -„zwölf“ kann Java nicht umwandeln und wirft eine `NumberFormatException`. Das Programm gibt „Das ist keine Zahl: zwölf“ aus. Ändere die erste Zeile in `String eingabe = "12";` und führe es noch einmal aus: Jetzt erscheint „Doppelt: 24“. - -## Exceptions sind Objekte - -Das steht nicht im Lehrplan, ist aber praktisch zu wissen. - -::: angeberwissen -Jede Exception ist ein Objekt einer eigenen Klasse, zum Beispiel `ArithmeticException` für das Teilen durch 0. `e.getMessage()` liefert ihre Meldung, etwa `/ by zero`. - -Hinter einem `try` dürfen mehrere `catch`-Blöcke stehen, für jede Art von Fehler einer. `catch (Exception e)` fängt alle Exceptions auf, verrät dir dann aber weniger darüber, was passiert ist. Und ein Block `finally { … }` am Ende läuft immer, egal ob es einen Fehler gab oder nicht. -::: - -## Spiel: Fängt das Netz? - -::: spiel frage -titel: Spiel: Fängt das Netz? -intro: Ludwig turnt am Trapez. Fängt try und catch ihn auf, oder stürzt das Programm ab? Sieben Runden. - -runde: - int[] noten = {2, 3, 1}; - System.out.println(noten[3]); - System.out.println("Fertig!"); -frage: Was passiert mit echtem Java? -- Es erscheint 1 und Fertig! -- Es erscheint nur Fertig! -- [x] Das Programm stürzt mit einer ArrayIndexOutOfBoundsException ab. -> Ein Fach 3 gibt es nicht. Niemand fängt die Exception auf, also kommt Fertig! nie an. - -runde: - int[] noten = {2, 3, 1}; - try { - System.out.println(noten[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Diese Note gibt es nicht."); - } - System.out.println("Fertig!"); -frage: Was wird ausgegeben? -- Fertig! -- [x] Diese Note gibt es nicht.\nFertig! -- Diese Note gibt es nicht. -> Der catch-Block fängt die Exception auf, danach geht das Programm normal weiter. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: Was wird ausgegeben? -- A\nB\nC -- [x] A\nC -- C -> Bei 10 / 0 springt Java sofort in den catch-Block. Der Rest des try-Blocks, also B, wird übersprungen. - -runde: - String eingabe = "12"; - try { - int zahl = Integer.parseInt(eingabe); - System.out.println("Doppelt: " + zahl * 2); - } catch (NumberFormatException e) { - System.out.println("Das ist keine Zahl: " + eingabe); - } -frage: Was wird ausgegeben? -- [x] Doppelt: 24 -- Das ist keine Zahl: 12 -- Doppelt: 1212 -> „12“ lässt sich umwandeln. Läuft im try-Block alles gut, wird catch übersprungen. - -runde: -frage: Welche Exception wirft `Integer.parseInt("2.5")`? -- ArithmeticException -- [x] NumberFormatException -- keine, das Ergebnis ist 2 -> parseInt wandelt nur ganze Zahlen um. Mit Komma oder Punkt ist es kein gültiges Format. - -runde: -frage: Welche Exception wirft `12 / 0` mit `int`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Durch 0 teilen geht mit ganzen Zahlen nicht. Die Meldung lautet `/ by zero`. - -runde: - try { - int stuecke = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Fehler!"); - } - System.out.println("Fertig!"); -frage: Was passiert? -- Es erscheint Fehler! und Fertig! -- Es erscheint nur Fertig! -- [x] Das Programm stürzt ab. -> catch fängt nur die Exception, die in der Klammer steht. Eine ArithmeticException fällt durch das Netz. -::: - -## Aufgabe: Sicher teilen - -Dieses Programm stürzt ab: - -```java -int kuchen = 12; -int personen = 0; -System.out.println("Jeder bekommt " + kuchen / personen + " Stücke."); -System.out.println("Guten Appetit!"); -``` - -1. Führe es mit echtem Java aus und lies die Fehlermeldung. Welche Exception ist es? -2. Fange sie mit try und catch ab. Statt des Absturzes soll „Ohne Personen kann man nicht teilen.“ erscheinen, und „Guten Appetit!“ soll trotzdem kommen. -3. Setze `personen` auf 4 und prüfe, dass dann „Jeder bekommt 3 Stücke.“ erscheint. - -::: ludwig -Die Exception heißt `ArithmeticException`. Schreib in den `try`-Block nur die Zeile, die abstürzen kann. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann echtes Java im Bereich Code einschalten. → Echtes Java einschalten -- Ich kann aus einer Fehlermeldung die Exception und die Zeile ablesen. → Die Fehlermeldung lesen -- Ich kann eine Exception mit try und catch auffangen. → try und catch -- Ich kann Text mit Integer.parseInt in eine Zahl umwandeln und die NumberFormatException abfangen. → Text in eine Zahl umwandeln -- Ich kann ein Programm schreiben, das sicher teilt, auch durch 0. → Aufgabe: Sicher teilen -::: - -## Wissenstest - -::: quiz -? Was passiert, wenn eine Exception nicht aufgefangen wird? -→ Die Fehlermeldung lesen -- [ ] Java überspringt die Zeile und macht weiter. -- [x] Das Programm bricht ab. -- [ ] Der Computer startet neu. -> Deshalb erscheint im ersten Beispiel „Fertig!“ nicht. - -? Was passiert im try-Block nach der Zeile, die eine Exception wirft? -→ try und catch -- [ ] Die restlichen Zeilen laufen trotzdem. -- [x] Der Rest wird übersprungen, Java springt in den catch-Block. -- [ ] Java beginnt den try-Block von vorne. - -? Welche Exception wirft Integer.parseInt("zwölf")? -→ Text in eine Zahl umwandeln -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> „zwölf“ hat kein Zahlenformat, das Java versteht. - -? Ordne jeder Exception ihre Ursache zu. -→ Die Fehlermeldung lesen -= ArrayIndexOutOfBoundsException -> Index außerhalb des Arrays -= ArithmeticException -> Teilen durch 0 -= NumberFormatException -> Text ist keine Zahl -::: diff --git a/web/lessons/de/23-text-einlesen-und-speichern.md b/web/lessons/de/23-text-einlesen-und-speichern.md deleted file mode 100644 index 62429a1b..00000000 --- a/web/lessons/de/23-text-einlesen-und-speichern.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -titel: Text einlesen und speichern -bereich: Dateien -kurz: Mit Scanner eine Textdatei Zeile für Zeile lesen und mit PrintWriter eine Datei speichern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, warum Programme Daten in Dateien speichern -- eine Textdatei mit Scanner, hasNextLine und nextLine Zeile für Zeile lesen -- erklären, warum Java bei Dateien try und catch oder throws verlangt -- mit PrintWriter eine Datei schreiben und sie mit close() abschließen -- eine Datei lesen, ergänzen und nummeriert wieder speichern -::: - -## Warum Dateien? - -Alles, was in Variablen steht, ist weg, sobald das Programm endet. Soll sich ein Programm etwas merken, zum Beispiel einen Spielstand, eine Liste oder Noten, speichert es die Daten in einer **Datei**. Beim nächsten Start liest es die Datei wieder ein. - -Zora ist frei, und Ludwig plant ein Fest. Seine Einkaufsliste liegt als Datei `einkauf.txt` bereit: - -::: datei einkauf.txt -Heu -Äpfel -Karotten -Löwenzahn -::: - -Eine Datei mit der Endung `.txt` enthält nur Text, Zeile für Zeile. Du kannst sie mit jedem Editor öffnen, zum Beispiel mit dem Editor von Windows oder TextEdit am Mac. - -## Eine Datei lesen mit Scanner - -Den `Scanner` kennst du schon: `new Scanner(System.in)` liest von der Tastatur. Gibst du ihm statt `System.in` eine Datei, liest er aus der Datei: - -```java -import java.io.*; -import java.util.Scanner; - -Scanner datei = new Scanner(new File("einkauf.txt")); -while (datei.hasNextLine()) { - String zeile = datei.nextLine(); - System.out.println(zeile); -} -datei.close(); -``` - -| Methode | Bedeutung | -|---|---| -| `new File("einkauf.txt")` | die Datei mit diesem Namen | -| `hasNextLine()` | Gibt es noch eine Zeile? `true` oder `false` | -| `nextLine()` | liefert die nächste Zeile und rückt eine Zeile weiter | -| `close()` | schließt die Datei, wenn du fertig bist | - -Die Schleife läuft, solange es noch eine Zeile gibt. In jedem Durchlauf holt `nextLine()` die nächste Zeile. `File` steht im Paket `java.io`, deshalb brauchst du `import java.io.*;`. - -::: diagramm dt-lesen.visustruct -So sieht das Lesen im Struktogramm aus. Probier es in der Simulation aus. -::: - -::: ludwig -Stell dir den Scanner wie einen Finger vor, der auf eine Zeile zeigt. `nextLine()` liest die Zeile unter dem Finger und schiebt ihn eine Zeile weiter. Ist der Finger unter der letzten Zeile, liefert `hasNextLine()` `false`. -::: - -## Was, wenn die Datei fehlt? - -Gibt es die Datei nicht, kann Java sie nicht lesen und wirft eine `FileNotFoundException`. Java verlangt, dass dein Programm damit rechnet. Entweder du fängst sie mit try und catch auf, wie in Lektion 22: - -```java -try { - Scanner datei = new Scanner(new File("einkauf.txt")); - // ... lesen ... - datei.close(); -} catch (FileNotFoundException e) { - System.out.println("Die Datei einkauf.txt fehlt!"); -} -``` - -Oder du schreibst hinter `main` den Zusatz `throws Exception`. Das heißt: „Diese Methode kann eine Exception werfen, ich kümmere mich nicht darum.“ Dann bricht das Programm ab, wenn die Datei fehlt. - -```java -public static void main(String[] args) throws Exception { -``` - -> VisuStruct schreibt `throws Exception` automatisch hinter `main`, sobald dein Programm mit Dateien arbeitet. In der Simulation meldet VisuStruct eine fehlende Datei mit „Es gibt keine Datei …“. - -## Übung: Einkaufsliste nummerieren - -::: übung l23-java-nummern -titel: Einkaufsliste nummerieren -code: java -auftrag: Lies `einkauf.txt` Zeile für Zeile und gib jede Zeile mit ihrer Nummer aus: **1. Heu**, **2. Äpfel** und so weiter. -start: l23-java-nummern-start.visustruct -test: - -> 1. Heu | 2. Äpfel | 3. Karotten | 4. Löwenzahn -braucht: whileSchleife -tipp: Lege vor der Schleife `int nummer = 1;` an und erhöhe die Nummer am Ende jedes Durchlaufs. -tipp: Die Ausgabe ist `System.out.println(nummer + ". " + zeile);` -lösung: l23-java-nummern-loesung.visustruct -::: - -## In eine Datei schreiben mit PrintWriter - -Zum Schreiben gibt es den `PrintWriter`. Seine Methoden heißen wie bei `System.out`: - -```java -PrintWriter aus = new PrintWriter("gruss.txt"); -aus.println("Hallo Zora!"); -aus.println("Bis morgen, Ludwig"); -aus.close(); -``` - -Danach steht in `gruss.txt`: - -``` -Hallo Zora! -Bis morgen, Ludwig -``` - -- `println` schreibt den Text und beginnt danach eine neue Zeile, `print` schreibt ohne neue Zeile. -- Gibt es die Datei schon, wird sie **überschrieben**. Der alte Inhalt ist dann weg. -- Nach dem Lauf zeigt VisuStruct unter der Ausgabe, was in der Datei gespeichert wurde. - -::: ludwig -Vergiss `close()` nicht! Der PrintWriter sammelt den Text erst in einem Zwischenspeicher und schreibt ihn beim Schließen in die Datei. Ohne `close()` bleibt die Datei leer. Mir ist so schon eine ganze Geschichte verloren gegangen. -::: - -## Übung: Einkaufsliste ergänzen - -::: übung l23-java-ergaenzen -titel: Einkaufsliste ergänzen -code: java -auftrag: Ludwig braucht noch Kuchen. Lies `einkauf.txt` und schreibe jede Zeile in die neue Datei `einkauf-neu.txt`. Schreibe danach **Kuchen** als letzte Zeile dazu. Gib am Ende aus, wie viele Zeilen gespeichert wurden: **5 Zeilen gespeichert**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 Zeilen gespeichert -datei: einkauf-neu.txt -> Heu | Äpfel | Karotten | Löwenzahn | Kuchen -braucht: whileSchleife -tipp: In der Schleife liest du eine Zeile mit `datei.nextLine()` und schreibst sie mit `aus.println(zeile)` gleich wieder hinaus. -tipp: Nach der Schleife kommt `aus.println("Kuchen");`. Schließe beide Dateien mit `close()`, sonst bleibt `einkauf-neu.txt` leer. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Spiel: Was steht in der Datei? - -::: spiel frage -titel: Spiel: Was steht in der Datei? -intro: Ludwig schreibt Dateien mit dem PrintWriter. Lies den Code und sag voraus, was danach in der Datei steht. Sechs Runden. -frage: Was steht danach in der Datei? - -runde: - PrintWriter aus = new PrintWriter("gruss.txt"); - aus.println("Hallo"); - aus.println("Zora"); - aus.close(); -- [x] Hallo\nZora -- HalloZora -- Zora -> `println` beginnt nach jedem Text eine neue Zeile. - -runde: - PrintWriter aus = new PrintWriter("wort.txt"); - aus.print("Ha"); - aus.print("llo"); - aus.println("!"); - aus.close(); -- Ha\nllo\n! -- [x] Hallo! -- Ha llo ! -> `print` schreibt ohne neue Zeile weiter, die Teile hängen direkt aneinander. - -runde: - PrintWriter aus = new PrintWriter("geheim.txt"); - aus.println("Der Schatz liegt im Turm"); -- Der Schatz liegt im Turm -- [x] Nichts, die Datei bleibt leer. -- Java meldet einen Fehler. -> Ohne `close()` landet der Text nie in der Datei. Er bleibt im Zwischenspeicher. - -runde: - // In notiz.txt steht vorher: Alt - PrintWriter aus = new PrintWriter("notiz.txt"); - aus.println("Neu"); - aus.close(); -- Alt\nNeu -- [x] Neu -- Neu\nAlt -> Ein neuer PrintWriter überschreibt die Datei. Der alte Inhalt ist weg. - -runde: - PrintWriter aus = new PrintWriter("zahlen.txt"); - for (int i = 1; i <= 3; i++) { - aus.println(i * 2); - } - aus.close(); -- 1\n2\n3 -- 246 -- [x] 2\n4\n6 -> Die Schleife schreibt 2, 4 und 6, jede Zahl in eine eigene Zeile. - -runde: - // In einkauf.txt steht: Heu, Äpfel (je eine Zeile) - Scanner datei = new Scanner(new File("einkauf.txt")); - PrintWriter aus = new PrintWriter("gross.txt"); - while (datei.hasNextLine()) { - aus.println(datei.nextLine().toUpperCase()); - } - datei.close(); - aus.close(); -- Heu\nÄpfel -- [x] HEU\nÄPFEL -- HEUÄPFEL -> Jede Zeile wird gelesen, in Großbuchstaben verwandelt und in eine eigene Zeile geschrieben. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, warum Programme Daten in Dateien speichern. → Warum Dateien? -- Ich kann eine Textdatei mit Scanner, hasNextLine und nextLine Zeile für Zeile lesen. → Eine Datei lesen mit Scanner -- Ich kann erklären, warum Java bei Dateien try und catch oder throws verlangt. → Was, wenn die Datei fehlt? -- Ich kann mit PrintWriter eine Datei schreiben und sie mit close() abschließen. → In eine Datei schreiben mit PrintWriter -- Ich kann eine Datei lesen, ergänzen und nummeriert wieder speichern. → Übung: Einkaufsliste ergänzen -::: - -## Wissenstest - -::: quiz -? Was liefert hasNextLine()? -→ Eine Datei lesen mit Scanner -- [ ] die nächste Zeile -- [x] true, wenn es noch eine Zeile gibt, sonst false -- [ ] die Anzahl der Zeilen -> Mit hasNextLine() prüft die Schleife, ob es weitergeht. - -? Was passiert, wenn du new PrintWriter("liste.txt") für eine Datei aufrufst, die es schon gibt? -→ In eine Datei schreiben mit PrintWriter -- [ ] Der neue Text wird hinten angehängt. -- [x] Die Datei wird überschrieben. -- [ ] Java meldet einen Fehler. - -? Warum bleibt eine Datei leer, obwohl println aufgerufen wurde? -→ In eine Datei schreiben mit PrintWriter -- [ ] Weil println nur in die Konsole schreibt. -- [x] Weil close() fehlt. -- [ ] Weil der Dateiname auf .txt endet. -> Erst close() schreibt den Zwischenspeicher in die Datei. - -? Ordne jeder Methode ihre Aufgabe zu. -→ Eine Datei lesen mit Scanner -= nextLine() -> liest die nächste Zeile -= println(text) -> schreibt eine Zeile -= close() -> schließt die Datei -::: diff --git a/web/lessons/de/24-zeile-fuer-zeile.md b/web/lessons/de/24-zeile-fuer-zeile.md deleted file mode 100644 index 385844ed..00000000 --- a/web/lessons/de/24-zeile-fuer-zeile.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -titel: Zeile für Zeile mit BufferedReader -bereich: Dateien -kurz: Mit BufferedReader und readLine lesen, bis null kommt, und mit Files eine ganze Datei auf einmal lesen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Datei mit BufferedReader und readLine lesen -- das Dateiende erkennen, weil readLine dort null liefert -- zählen, wie oft ein Wort in einer Datei vorkommt -- eine ganze Datei mit Files.readString lesen und mit split in Zeilen zerlegen -- den längsten Eintrag einer Datei finden -::: - -## Der Kuchen ist weg! - -Am Morgen nach dem Fest ist Ludwigs Kuchen verschwunden. Zum Glück führt die Burg ein Logbuch. Jede Zeile beginnt mit dem Tag und der Uhrzeit: - -::: datei logbuch.txt -Mo 08:15 Ludwig füttert die Ziegen -Mo 12:30 Zora liest im Turm -Mo 18:00 Fuchs schleicht am Tor vorbei -Di 09:00 Ludwig backt einen Kuchen -Di 14:45 Hase bringt Karotten -Di 16:20 Fuchs fragt nach dem Rezept -Di 23:55 Der Kuchen ist weg -Mi 07:00 Zora findet Krümel vor dem Fuchsbau -::: - -Mit dem Scanner aus Lektion 23 könntest du es schon lesen. Profis nehmen für Dateien aber oft den **BufferedReader**. - -## Lesen mit BufferedReader - -```java -import java.io.*; - -BufferedReader leser = new BufferedReader(new FileReader("logbuch.txt")); -String zeile = leser.readLine(); -while (zeile != null) { - System.out.println(zeile); - zeile = leser.readLine(); -} -leser.close(); -``` - -- `new FileReader("logbuch.txt")` öffnet die Datei, `new BufferedReader(…)` legt einen Puffer drumherum. Er holt die Datei in großen Stücken und ist deshalb bei langen Dateien schneller. -- `readLine()` liefert die nächste Zeile. Gibt es keine Zeile mehr, liefert es **null**. -- Die Schleife läuft deshalb, solange `zeile != null` ist. Am Ende jedes Durchlaufs liest sie die nächste Zeile. - -::: diagramm dt-buffered.visustruct -Erst eine Zeile lesen, dann prüfen, dann am Ende des Durchlaufs die nächste lesen. -::: - -**null** heißt „gar nichts“. Es ist nicht der leere Text `""`, sondern kein Text. Eine Variable mit `null` hat keine Methoden: `zeile.length()` bricht dann mit einer `NullPointerException` ab. Prüfe deshalb immer zuerst `zeile != null`. - -| | Scanner | BufferedReader | -|---|---|---| -| Anlegen | `new Scanner(new File(…))` | `new BufferedReader(new FileReader(…))` | -| Gibt es noch eine Zeile? | `hasNextLine()` | `readLine()` liefert `null` | -| Nächste Zeile | `nextLine()` | `readLine()` | -| Stärke | kann auch Zahlen lesen (`nextInt()`) | schnell, auch bei großen Dateien | - -::: ludwig -Die Schleife sieht anders aus als beim Scanner: Die erste Zeile wird **vor** der Schleife gelesen, jede weitere **am Ende** des Durchlaufs. Vergisst du das Lesen am Ende, liest das Programm immer wieder dieselbe Zeile und hört nie auf. -::: - -::: angeberwissen -Wo eine Zeile endet, ist nicht überall gleich: Windows schreibt zwei unsichtbare Zeichen, „Wagenrücklauf“ und „Zeilenvorschub“, Linux und macOS nur den Zeilenvorschub. Die Namen stammen von der Schreibmaschine, bei der der Papierwagen zurückfuhr und das Papier eine Zeile weiterrückte. `readLine()` kommt mit beidem klar. -::: - -## Übung: Wie oft kommt der Fuchs vor? - -::: übung l24-java-fuchs -titel: Wie oft kommt der Fuchs vor? -code: java -auftrag: Lies das Logbuch mit dem BufferedReader und zähle die Zeilen, in denen **Fuchs** vorkommt. Gib am Ende **Fuchs:** und die Anzahl aus. -start: l24-java-fuchs-start.visustruct -test: - -> Fuchs: 3 -braucht: whileSchleife, verzweigung -tipp: Lege vor der Schleife `int anzahl = 0;` an. In der Schleife prüfst du `zeile.contains("Fuchs")`. -tipp: Das `zeile = leser.readLine();` gehört ans Ende der Schleife, nach dem if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Automatisch schließen - -Damit `close()` auch nach einer Exception nicht vergessen wird, gibt es eine Kurzform von try: Was in den runden Klammern hinter `try` angelegt wird, schließt Java am Ende von selbst. - -```java -try (BufferedReader leser = new BufferedReader(new FileReader("logbuch.txt"))) { - String zeile = leser.readLine(); - while (zeile != null) { - System.out.println(zeile); - zeile = leser.readLine(); - } -} catch (IOException e) { - System.out.println("Das Logbuch fehlt."); -} -``` - -Das heißt **try-with-resources**. `IOException` fängt alle Fehler beim Lesen und Schreiben auf, auch eine fehlende Datei. - -> Wie try und catch läuft auch try-with-resources nur mit echtem Java (Lektion 22). In der Simulation schreibst du `close()` selbst. - -## Die Abkürzung: Files - -Seit Java 11 geht es noch kürzer. `Files.readString` liest die ganze Datei auf einmal, das kennst du aus Lektion 17. Mit `split("\n")` zerlegst du den Text in ein Array von Zeilen: - -```java -import java.nio.file.*; - -String text = Files.readString(Path.of("logbuch.txt")); -String[] zeilen = text.split("\n"); -for (int i = 0; i < zeilen.length; i++) { - System.out.println(zeilen[i]); -} -``` - -Jetzt stehen alle Zeilen im Array. Du kannst sie in beliebiger Reihenfolge ansehen, zum Beispiel rückwärts oder nur jede zweite. - -| Weg | Gut für | -|---|---| -| `Scanner` | kleine Dateien, Zahlen und Wörter lesen | -| `BufferedReader` | große Dateien, Zeile für Zeile | -| `Files.readString` | kleine Dateien, die ganz ins Programm passen | - -::: ludwig -Eine Datei mit einer Million Zeilen liest du besser mit dem BufferedReader Zeile für Zeile. Mit `Files.readString` müsste die ganze Datei auf einmal in den Speicher. -::: - -## Übung: Der längste Eintrag - -::: übung l24-java-laengster -titel: Der längste Eintrag -code: java -auftrag: Im Startcode stehen die Zeilen des Logbuchs schon im Array `zeilen`. Finde die längste Zeile und gib sie so aus: **Längster Eintrag:** und dann die Zeile. -start: l24-java-laengster-start.visustruct -test: - -> Längster Eintrag: Mi 07:00 Zora findet Krümel vor dem Fuchsbau -braucht: forSchleife, verzweigung -tipp: Merke dir die bisher längste Zeile in `String laengster = zeilen[0];` und gehe die anderen Zeilen mit einer for-Schleife durch. -tipp: Ist `zeilen[i].length() > laengster.length()`, wird `zeilen[i]` der neue Längste. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Spiel: Datei-Detektiv - -::: spiel frage -titel: Spiel: Datei-Detektiv -intro: Wer hat den Kuchen genommen? Jedes Programm durchsucht das **Logbuch** von oben. Sag voraus, was es ausgibt, und sammle so die Hinweise. Fünf Runden. -frage: Was gibt das Programm aus? - -runde: - String zeile = leser.readLine(); - zeile = leser.readLine(); - System.out.println(zeile.substring(9)); -- Ludwig füttert die Ziegen -- [x] Zora liest im Turm -- Mo 12:30 Zora liest im Turm -> Das zweite `readLine()` liefert die zweite Zeile. Ab Index 9 beginnt der Text nach der Uhrzeit. - -runde: - int n = 0; - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.startsWith("Di")) n++; - zeile = leser.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Vier Einträge stammen vom Dienstag. - -runde: - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.contains("Kuchen")) { - System.out.println(zeile.substring(3, 8)); - } - zeile = leser.readLine(); - } -- [x] 09:00\n23:55 -- 09:00 -- Di\nDi -> Zwei Zeilen enthalten „Kuchen“. `substring(3, 8)` schneidet die Uhrzeit heraus. - -runde: - String zeile = leser.readLine(); - String letzte = ""; - while (zeile != null) { - if (zeile.contains("Fuchs")) letzte = zeile; - zeile = leser.readLine(); - } - System.out.println(letzte); -- Di 16:20 Fuchs fragt nach dem Rezept -- [x] Mi 07:00 Zora findet Krümel vor dem Fuchsbau -- Mo 18:00 Fuchs schleicht am Tor vorbei -> `letzte` wird bei jedem Treffer überschrieben. Am Ende steht der letzte Treffer darin. „Fuchsbau“ enthält auch „Fuchs“. - -runde: - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.contains("Krümel")) { - int bei = zeile.indexOf("vor dem "); - System.out.println(zeile.substring(bei + 8)); - } - zeile = leser.readLine(); - } -- [x] Fuchsbau -- vor dem Fuchsbau -- Krümel -> Die Krümel liegen vor dem Fuchsbau. Der Fuchs hat nach dem Rezept gefragt, und um 23:55 war der Kuchen weg. Fall gelöst! -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Datei mit BufferedReader und readLine lesen. → Lesen mit BufferedReader -- Ich kann das Dateiende erkennen, weil readLine dort null liefert (zeile != null). → Lesen mit BufferedReader -- Ich kann zählen, wie oft ein Wort in einer Datei vorkommt. → Übung: Wie oft kommt der Fuchs vor? -- Ich kann eine ganze Datei mit Files.readString lesen und mit split in Zeilen zerlegen. → Die Abkürzung: Files -- Ich kann den längsten Eintrag einer Datei finden. → Übung: Der längste Eintrag -::: - -## Wissenstest - -::: quiz -? Was liefert readLine(), wenn die Datei zu Ende ist? -→ Lesen mit BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null heißt: Es gibt keinen Text mehr. - -? Warum steht in der Schleife am Ende noch einmal zeile = leser.readLine()? -→ Lesen mit BufferedReader -- [ ] Damit die Datei geschlossen wird. -- [x] Sonst bleibt zeile immer gleich, und die Schleife hört nie auf. -- [ ] Damit die erste Zeile doppelt ausgegeben wird. - -? Was macht try-with-resources? -→ Lesen mit BufferedReader -- [ ] Es liest die Datei schneller. -- [x] Es schließt die Datei am Ende von selbst. -- [ ] Es verhindert jede Exception. - -? Ordne jedem Weg zu, wofür er gut ist. -→ Die Abkürzung: Files -= BufferedReader -> große Dateien, Zeile für Zeile -= Files.readString -> kleine Dateien auf einmal -= Scanner -> Zahlen und Wörter lesen -::: diff --git a/web/lessons/de/25-tabellen-als-csv.md b/web/lessons/de/25-tabellen-als-csv.md deleted file mode 100644 index c4421843..00000000 --- a/web/lessons/de/25-tabellen-als-csv.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -titel: Tabellen als CSV -bereich: Dateien -kurz: Eine Tabelle als CSV-Datei lesen, jede Zeile mit split zerlegen und mit den Zahlen rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- den Aufbau einer CSV-Datei erklären: Kopfzeile, Datensätze, Trennzeichen -- eine Zeile mit split zerlegen und mit Integer.parseInt eine Zahl daraus machen -- die Kopfzeile überspringen, bevor ich rechne -- einen Durchschnitt aus einer Spalte einer CSV-Datei berechnen -- den besten Wert in einer Spalte einer CSV-Datei finden -- eine Stärke und eine Schwäche von CSV nennen -::: - -## Eine Tabelle in einer Textdatei - -Frau Ziege, die Lehrerin der Burgschule, hat die Noten ihrer Klasse als Tabelle gespeichert: - -| Name | Mathe | Deutsch | Englisch | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Fuchs | 4 | 3 | 5 | -| Hase | 2 | 1 | 3 | - -In der Datei sieht die Tabelle so aus: - -::: datei klasse.csv -Name;Mathe;Deutsch;Englisch -Ludwig;2;3;1 -Zora;1;2;2 -Fuchs;4;3;5 -Hase;2;1;3 -::: - -Das ist eine **CSV-Datei**. CSV heißt „Comma-Separated Values“, also „durch Kommas getrennte Werte“. Jede Zeile ist eine Zeile der Tabelle, die Spalten sind durch ein Trennzeichen getrennt. In Deutschland nimmt man meist das **Semikolon** `;`, weil das Komma schon in Zahlen wie `2,5` steckt. - -- Die erste Zeile ist die **Kopfzeile**. Sie sagt, was in den Spalten steht. -- Jede weitere Zeile ist ein **Datensatz**, hier eine Schülerin oder ein Schüler. -- Excel, LibreOffice und Numbers öffnen CSV-Dateien direkt als Tabelle. - -## Eine Zeile zerlegen mit split - -`split(";")` kennst du aus Lektion 17. Es zerlegt einen Text an jedem Semikolon und liefert ein Array: - -```java -String zeile = "Zora;1;2;2"; -String[] teile = zeile.split(";"); -// teile[0] ist "Zora", teile[1] ist "1", teile[2] ist "2", teile[3] ist "2" -``` - -Die Noten sind danach noch **Text**. Rechnen kannst du erst, wenn du sie mit `Integer.parseInt` in eine Zahl verwandelst: - -```java -int mathe = Integer.parseInt(teile[1]); -``` - -::: diagramm dt-csv.visustruct -Eine CSV-Zeile zerlegen und die Mathenote als Zahl lesen. -::: - -## Die ganze Datei lesen - -Für die ganze Datei kombinierst du den BufferedReader aus Lektion 24 mit `split`. Die Kopfzeile enthält keine Noten, deshalb liest du sie vor der Schleife und überspringst sie: - -```java -BufferedReader leser = new BufferedReader(new FileReader("klasse.csv")); -String zeile = leser.readLine(); // Kopfzeile -zeile = leser.readLine(); // erster Datensatz -while (zeile != null) { - String[] teile = zeile.split(";"); - System.out.println(teile[0] + ": Mathe " + teile[1]); - zeile = leser.readLine(); -} -leser.close(); -``` - -::: ludwig -Ohne das zweite `readLine()` vor der Schleife landet die Kopfzeile in der Schleife. Dann versucht `Integer.parseInt("Mathe")` aus dem Wort eine Zahl zu machen, und Java bricht mit einer `NumberFormatException` ab. -::: - -## Übung: Notenschnitt in Mathe - -::: übung l25-java-schnitt -titel: Notenschnitt in Mathe -code: java -auftrag: Berechne den Notenschnitt in Mathe. Überspringe die Kopfzeile, addiere die Mathenoten (Spalte 1) und teile durch die Anzahl der Datensätze. Gib **Schnitt Mathe:** und den Schnitt aus. -start: l25-java-schnitt-start.visustruct -test: - -> Schnitt Mathe: 2.25 -braucht: whileSchleife -tipp: Lege vor der Schleife `double summe = 0;` und `int anzahl = 0;` an. Mit `double` wird beim Teilen nichts abgeschnitten. -tipp: In der Schleife: `String[] teile = zeile.split(";");`, dann `summe = summe + Integer.parseInt(teile[1]);` und `anzahl++;`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Übung: Beste Note in Englisch - -::: übung l25-java-beste -titel: Beste Note in Englisch -code: java -auftrag: Wer hat die beste Note in Englisch (Spalte 3)? Gib **Beste Note in Englisch:**, den Namen und in Klammern die Note aus. -start: l25-java-beste-start.visustruct -test: - -> Beste Note in Englisch: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Merke dir die bisher beste Note in `int besteNote = 7;` und den Namen in `String besterName = "";`. Jede echte Note ist besser als 7. -tipp: Ist `note < besteNote`, merkst du dir die neue Note und `teile[0]` als Namen. -lösung: l25-java-beste-loesung.visustruct -::: - -## Stärken und Schwächen von CSV - -| Gut | Schwierig | -|---|---| -| Tabellen brauchen wenig Platz. | Steht das Trennzeichen im Text, zum Beispiel `Hase;sehr gut; fleißig`, zerfällt die Zeile in zu viele Teile. | -| Excel und andere Programme öffnen die Datei direkt. | Alles ist eine flache Tabelle. Hat ein Tier mehrere Lieblingsessen, passt das nicht gut in eine Zelle. | -| Jedes Programm kann sie mit `split` lesen. | Die Datei sagt nicht, ob `1` eine Zahl oder ein Text ist. | - -::: ludwig -Excel speichert CSV-Dateien in Deutschland mit Semikolon, in England und den USA mit Komma. Wer eine Datei aus dem Ausland öffnet, sieht deshalb manchmal alles in einer einzigen Spalte. -::: - -## Spiel: Kaputte Zeile - -::: spiel bombe -titel: Spiel: Kaputte Zeile -intro: In jeder CSV-Datei ist **genau eine Zeile kaputt**, und die Bombe tickt. Vergleiche jede Zeile mit der Kopfzeile und tippe auf die kaputte Zeile, bevor die Zeit abläuft. Fünf Runden, je 20 Sekunden. -zeit: 20 -daten: csv - -runde: - Name;Mathe;Deutsch;Englisch - Ludwig;2;3;1 - Zora;1 - Fuchs;4;3;5 -frage: Jede Zeile braucht vier Spalten. -fehler: 3 -besser: Zora;1;2;2 -> Bei Zora fehlen zwei Noten. `teile[3]` gibt es dann nicht, und Java bricht mit einer `ArrayIndexOutOfBoundsException` ab. - -runde: - Name;Note;Bemerkung - Ludwig;2;arbeitet gut mit - Hase;1;sehr gut; fleißig - Zora;1;liest viel -frage: Jede Zeile braucht drei Spalten. -fehler: 3 -besser: Hase;1;sehr gut, fleißig -> Das Semikolon in der Bemerkung trennt eine vierte Spalte ab. Im Text darf das Trennzeichen nicht vorkommen. - -runde: - Name;Mathe;Deutsch;Englisch - Ludwig;2;3;1 - Zora;1;2;2 - Fuchs,4,3,5 -frage: Getrennt wird mit Semikolon. -fehler: 4 -besser: Fuchs;4;3;5 -> Hier stehen Kommas statt Semikolons. `split(";")` findet kein Semikolon und liefert die ganze Zeile als ein einziges Teil. - -runde: - Name;Mathe;Deutsch;Englisch - Hase;2;1;3 - Fuchs;vier;3;5 - Ludwig;2;3;1 -frage: Noten sind Zahlen. -fehler: 3 -besser: Fuchs;4;3;5 -> `Integer.parseInt("vier")` kann aus dem Wort keine Zahl machen und wirft eine `NumberFormatException`. - -runde: - Name;Mathe;Deutsch;Englisch - Zora;1;2;2 - Hase;2;1;3 - Ludwig;2;;1 -frage: Kein Feld darf leer sein. -fehler: 4 -besser: Ludwig;2;3;1 -> Zwischen den beiden Semikolons steht nichts. `Integer.parseInt("")` wirft eine `NumberFormatException`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann den Aufbau einer CSV-Datei erklären: Kopfzeile, Datensätze, Trennzeichen. → Eine Tabelle in einer Textdatei -- Ich kann eine Zeile mit split zerlegen und mit Integer.parseInt eine Zahl daraus machen. → Eine Zeile zerlegen mit split -- Ich kann die Kopfzeile überspringen, bevor ich rechne. → Die ganze Datei lesen -- Ich kann einen Durchschnitt aus einer Spalte einer CSV-Datei berechnen. → Übung: Notenschnitt in Mathe -- Ich kann den besten Wert in einer Spalte einer CSV-Datei finden. → Übung: Beste Note in Englisch -- Ich kann eine Stärke und eine Schwäche von CSV nennen. → Stärken und Schwächen von CSV -::: - -## Wissenstest - -::: quiz -? Was liefert "Hase;2;1;3".split(";")[2]? -→ Eine Zeile zerlegen mit split -- [ ] "2" -- [x] "1" -- [ ] 1 -> Die Zählung beginnt bei 0. Und das Ergebnis ist ein Text, keine Zahl. - -? Warum liest das Programm vor der Schleife zweimal readLine()? -→ Die ganze Datei lesen -- [ ] Damit die Datei schneller gelesen wird. -- [x] Die erste Zeile ist die Kopfzeile ohne Noten. Sie wird übersprungen. -- [ ] Weil readLine immer zwei Zeilen braucht. - -? Was passiert bei Integer.parseInt("Mathe")? -→ Eine Zeile zerlegen mit split -- [ ] Es liefert 0. -- [x] Java wirft eine NumberFormatException. -- [ ] Es liefert die Länge des Wortes. - -? Ordne zu. -→ Stärken und Schwächen von CSV -= Kopfzeile -> sagt, was in den Spalten steht -= Datensatz -> eine Zeile mit Werten -= Trennzeichen -> trennt die Spalten, meist ; -::: diff --git a/web/lessons/de/26-json.md b/web/lessons/de/26-json.md deleted file mode 100644 index d6384c18..00000000 --- a/web/lessons/de/26-json.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -titel: Daten als JSON -bereich: Dateien -kurz: JSON-Dateien verstehen, Werte mit indexOf und substring herausholen und selbst JSON schreiben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Objekte, Schlüssel, Werte und Listen in JSON erkennen -- mit indexOf und substring einen Wert aus einer JSON-Zeile holen -- alle Werte zu einem Schlüssel aus einer JSON-Datei ausgeben -- mit + und \" einen JSON-Eintrag bauen und speichern -- Daten als JSON-Datei speichern -- eine Stärke und eine Schwäche von JSON nennen -::: - -## Daten mit Namen - -Der Burgzoo speichert seine Tiere in einer Datei `zoo.json`: - -::: datei zoo.json -{ - "zoo": "Burgzoo", - "tiere": [ - {"name": "Ludwig", "art": "Geißbock", "alter": 7}, - {"name": "Zora", "art": "Ziege", "alter": 6}, - {"name": "Fuchs", "art": "Rotfuchs", "alter": 4}, - {"name": "Hase", "art": "Feldhase", "alter": 2} - ] -} -::: - -Das ist **JSON**, die „JavaScript Object Notation“. Fast jede Web-App und jedes Spiel schickt und speichert Daten so. Anders als in einer CSV-Datei steht vor jedem Wert sein **Name**, der **Schlüssel**. - -| Zeichen | Bedeutung | Beispiel | -|---|---|---| -| `{ … }` | ein **Objekt**: Paare aus Schlüssel und Wert | `{"name": "Zora", "alter": 6}` | -| `"schlüssel": wert` | ein Paar, getrennt durch einen Doppelpunkt | `"alter": 6` | -| `[ … ]` | eine **Liste** von Werten, wie ein Array | `"tiere": [ … ]` | -| `,` | trennt die Paare und die Einträge einer Liste | | -| `"…"` | ein Text. Zahlen und `true`/`false` stehen ohne Anführungszeichen. | `"Ziege"`, `6` | - -Objekte und Listen lassen sich **verschachteln**: Das ganze Zoo-Objekt enthält die Liste `tiere`, und jedes Tier ist wieder ein Objekt. Wie bei Arrays zählt die Liste ab 0: `tiere[1].name` ist `"Zora"`. - -::: angeberwissen -JSON hat Douglas Crockford Anfang der 2000er bekannt gemacht. In die Lizenz seines JSON-Programms schrieb er: „Die Software soll für Gutes verwendet werden, nicht für Böses.“ Die Firma IBM fragte deshalb nach, ob sie es trotzdem benutzen darf. Er antwortete, IBM und seine Kunden dürften es auch für Böses verwenden. -::: - -## Einen Wert herausholen - -Profis lesen JSON mit einer Bibliothek, zum Beispiel **Gson**. Sie gehört nicht zu Java und muss erst eingebunden werden. Für unsere Zoo-Datei reichen die String-Methoden aus Lektion 17, denn jedes Tier steht in einer eigenen Zeile. - -Ein Anführungszeichen im Text schreibst du in Java als `\"`. Der Text `"\"name\": \""` ist also `"name": "`, genau das, was vor jedem Namen steht. - -```java -String zeile = "{\"name\": \"Zora\", \"art\": \"Ziege\", \"alter\": 6},"; -int start = zeile.indexOf("\"name\": \"") + 9; -int ende = zeile.indexOf("\"", start); -String name = zeile.substring(start, ende); -``` - -- `indexOf("\"name\": \"")` findet den Anfang von `"name": "`. Das sind 9 Zeichen, also beginnt der Name 9 Zeichen weiter. -- `indexOf("\"", start)` sucht **ab** `start` das nächste Anführungszeichen. Dort endet der Name. -- `substring(start, ende)` schneidet den Namen heraus: `Zora`. - -::: diagramm dt-json.visustruct -Den Namen aus einer JSON-Zeile holen. -::: - -## Übung: Alle Namen aus dem Zoo - -::: übung l26-java-namen -titel: Alle Namen aus dem Zoo -code: java -auftrag: Lies `zoo.json` Zeile für Zeile. Gib in jeder Zeile, die `"name"` enthält, nur den Namen aus. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Fuchs | Hase -braucht: whileSchleife, verzweigung -tipp: Prüfe mit `zeile.contains("\"name\"")`, ob in der Zeile ein Name steht. Die anderen Zeilen überspringst du. -tipp: Im if: `int start = zeile.indexOf("\"name\": \"") + 9;`, dann `int ende = zeile.indexOf("\"", start);` und `System.out.println(zeile.substring(start, ende));`. -lösung: l26-java-namen-loesung.visustruct -::: - -## JSON schreiben - -Zum Schreiben setzt du den Text mit `+` zusammen und schreibst ihn mit dem PrintWriter aus Lektion 23 in die Datei. Texte im JSON brauchen Anführungszeichen, also `\"` im Java-Text, Zahlen nicht: - -```java -String name = "Zora"; -int punkte = 15; -String eintrag = "{\"name\": \"" + name + "\", \"punkte\": " + punkte + "}"; -// eintrag ist {"name": "Zora", "punkte": 15} -``` - -Bei einer Liste steht zwischen den Einträgen ein Komma, hinter dem letzten aber **keins**. Das prüfst du mit einem if. - -::: ludwig -Ein einziges vergessenes Anführungszeichen oder ein Komma zu viel, und kein Programm kann die Datei mehr lesen. JSON ist streng. Darum benutzen Profis zum Schreiben auch eine Bibliothek. -::: - -## Übung: Punkte als JSON speichern - -::: übung l26-java-schreiben -titel: Punkte als JSON speichern -code: java -auftrag: Speichere die Punkte aus dem Quiz-Turnier als Liste in `punkte.json`. Jede Zeile enthält ein Objekt mit **name** und **punkte**, zwischen den Objekten steht ein Komma. Gib am Ende **3 Einträge gespeichert** aus. -start: l26-java-schreiben-start.visustruct -test: - -> 3 Einträge gespeichert -datei: punkte.json -> [ | {"name": "Ludwig", "punkte": 12}, | {"name": "Zora", "punkte": 15}, | {"name": "Fuchs", "punkte": 9} | ] -braucht: forSchleife, verzweigung -tipp: Gehe mit `for (int i = 0; i < namen.length; i++)` durch die Arrays. Baue den Eintrag mit `" {\"name\": \"" + namen[i] + "\", \"punkte\": " + punkte[i] + "}"`. -tipp: Ist `i < namen.length - 1`, hängst du noch `","` an. Schreibe nach der Schleife `"]"` und schließe die Datei. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Stärken und Schwächen von JSON - -| Gut | Schwierig | -|---|---| -| Jeder Wert hat einen Namen. Man sieht sofort, was `6` bedeutet. | Die Datei ist länger als eine CSV-Datei, weil die Schlüssel in jeder Zeile stehen. | -| Daten lassen sich verschachteln, zum Beispiel eine Liste in einem Objekt. | Java kann JSON nicht von selbst lesen. Man braucht eine Bibliothek wie Gson. | -| JSON ist der Standard im Web. Fast jede Programmiersprache kennt es. | Ein Zeichen zu viel oder zu wenig macht die ganze Datei unlesbar. | - -## Spiel: Welcher Schlüssel? - -::: spiel frage -titel: Spiel: Welcher Schlüssel? -intro: Ludwig sucht Werte in JSON-Dateien. Lies die Datei und sag, welcher Wert gemeint ist. Fünf Runden. - -runde: - {"name": "Zora", "art": "Ziege", "alter": 6} -frage: Was ist der Wert von **alter**? -- "alter" -- [x] 6 -- "Ziege" -> Vor dem Doppelpunkt steht der Schlüssel, dahinter der Wert. Zahlen stehen ohne Anführungszeichen. - -runde: - { - "tiere": [ - {"name": "Ludwig", "alter": 7}, - {"name": "Zora", "alter": 6}, - {"name": "Fuchs", "alter": 4} - ] - } -frage: Was ist **tiere[1].name**? -- Ludwig -- [x] Zora -- Fuchs -> Die Liste zählt wie ein Array ab 0. `tiere[1]` ist das zweite Tier. - -runde: - { - "zoo": "Burgzoo", - "chef": {"name": "Ludwig", "art": "Geißbock"} - } -frage: Wie kommst du an **Geißbock**? -- [x] chef.art -- art -- zoo.chef.art -> `art` steckt im Objekt `chef`. Darum geht der Weg über `chef`. - -runde: - { - "name": "Hase", - "lieblingsessen": ["Karotten", "Klee", "Löwenzahn"] - } -frage: Was ist **lieblingsessen[2]**? -- Klee -- Karotten -- [x] Löwenzahn -> Index 0 ist Karotten, 1 ist Klee, 2 ist Löwenzahn. So etwas passt in CSV nur schwer in eine Zelle. - -runde: - {"name": "Fuchs", "alter": 4, "hungrig": true} -frage: Welcher Schlüssel hat einen Wahrheitswert? -- name -- alter -- [x] hungrig -> `true` und `false` stehen wie Zahlen ohne Anführungszeichen. In Java wäre das ein `boolean`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Objekte, Schlüssel, Werte und Listen in JSON erkennen. → Daten mit Namen -- Ich kann mit indexOf und substring einen Wert aus einer JSON-Zeile holen. → Einen Wert herausholen -- Ich kann alle Werte zu einem Schlüssel aus einer JSON-Datei ausgeben. → Übung: Alle Namen aus dem Zoo -- Ich kann mit + und \" einen JSON-Eintrag bauen und speichern. → JSON schreiben -- Ich kann Daten als JSON-Datei speichern. → Übung: Punkte als JSON speichern -- Ich kann eine Stärke und eine Schwäche von JSON nennen. → Stärken und Schwächen von JSON -::: - -## Wissenstest - -::: quiz -? Was steht in JSON vor jedem Wert? -→ Daten mit Namen -- [ ] seine Zeilennummer -- [x] sein Schlüssel, zum Beispiel "name" -- [ ] ein Semikolon -> Schlüssel und Wert werden durch einen Doppelpunkt getrennt. - -? Wie schreibst du ein Anführungszeichen in einem Java-Text? -→ JSON schreiben -- [ ] "" -- [x] \" -- [ ] '"' - -? Was ist bei {"tiere": [{"name": "Ludwig"}, {"name": "Zora"}]} der Wert von tiere[0].name? -→ Daten mit Namen -- [x] Ludwig -- [ ] Zora -- [ ] tiere -> Die Liste zählt ab 0. - -? Ordne zu. -→ Stärken und Schwächen von JSON -= { } -> ein Objekt mit Schlüsseln und Werten -= [ ] -> eine Liste -= : -> trennt Schlüssel und Wert -::: diff --git a/web/lessons/de/27-formate-im-vergleich.md b/web/lessons/de/27-formate-im-vergleich.md deleted file mode 100644 index e671a2ba..00000000 --- a/web/lessons/de/27-formate-im-vergleich.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -titel: Formate im Vergleich -bereich: Dateien -kurz: Dieselben Daten als txt, CSV und JSON vergleichen, das passende Format wählen und eine Datei in ein anderes Format umwandeln. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- dieselben Daten als txt, CSV und JSON erkennen -- Stärken und Schwächen von txt, CSV und JSON vergleichen -- eine CSV-Datei in Sätze umwandeln -- eine CSV-Datei in JSON umwandeln -::: - -## Dreimal dieselben Tiere - -Ludwig hat die Tiere der Burg in drei Dateien gespeichert. In allen steht dasselbe, nur anders aufgeschrieben. - -Als Text, so wie man es einem Menschen schreiben würde: - -::: datei tiere.txt -Ludwig (Geißbock) ist 7 Jahre alt. -Zora (Ziege) ist 6 Jahre alt. -Fuchs (Rotfuchs) ist 4 Jahre alt. -::: - -Als Tabelle in CSV: - -::: datei tiere.csv -Name;Art;Alter -Ludwig;Geißbock;7 -Zora;Ziege;6 -Fuchs;Rotfuchs;4 -::: - -Als JSON: - -::: datei tiere.json -[ - {"name": "Ludwig", "art": "Geißbock", "alter": 7}, - {"name": "Zora", "art": "Ziege", "alter": 6}, - {"name": "Fuchs", "art": "Rotfuchs", "alter": 4} -] -::: - -## Was kann welches Format? - -| | txt | CSV | JSON | -|---|---|---|---| -| Für Menschen gut lesbar | ja | geht so | geht so | -| Feste Ordnung für Programme | nein | ja, Spalten | ja, Schlüssel | -| Was bedeutet ein Wert? | steht im Satz | steht in der Kopfzeile | steht direkt davor | -| Verschachteln (Liste in einem Eintrag) | nein | schwer | ja | -| Öffnen in Excel | nein | ja | nein | -| Lesen in Java | Scanner, BufferedReader | dazu `split` | String-Methoden oder eine Bibliothek | -| Größe | klein | am kleinsten | am größten | - -Kurz gesagt: - -- **txt** für Texte, die Menschen lesen: Briefe, Notizen, ein Logbuch. -- **CSV** für Tabellen: Noten, Messwerte, eine Bestenliste. Jede Zeile hat dieselben Spalten. -- **JSON** für Daten mit Struktur: Spielstände, Einstellungen, alles, was zwischen Programmen und im Web hin- und hergeht. - -::: ludwig -Wenn deine Wetter-App die Temperatur holt, kommt die Antwort fast immer als JSON. Und wenn die Lehrkraft die Noten aus dem Schulprogramm exportiert, bekommt sie oft eine CSV-Datei. -::: - -## Übung: Aus CSV werden Sätze - -::: übung l27-java-saetze -titel: Aus CSV werden Sätze -code: java -auftrag: Wandle `tiere.csv` in Text um. Schreibe für jedes Tier einen Satz wie **Ludwig (Geißbock) ist 7 Jahre alt.** in die Datei `saetze.txt`. Gib am Ende **3 Sätze gespeichert** aus. -start: l27-java-saetze-start.visustruct -test: - -> 3 Sätze gespeichert -datei: saetze.txt -> Ludwig (Geißbock) ist 7 Jahre alt. | Zora (Ziege) ist 6 Jahre alt. | Fuchs (Rotfuchs) ist 4 Jahre alt. -braucht: whileSchleife -tipp: Die Kopfzeile ist im Startcode schon übersprungen. Zerlege jede Zeile mit `String[] teile = zeile.split(";");`. -tipp: Der Satz ist `teile[0] + " (" + teile[1] + ") ist " + teile[2] + " Jahre alt."`. Zähle mit `anzahl++` mit und lies am Ende der Schleife die nächste Zeile. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Übung: Aus CSV wird JSON - -::: übung l27-java-json -titel: Aus CSV wird JSON -code: java -auftrag: Wandle `tiere.csv` in JSON um und speichere es in `tiere-neu.json`, genau wie `tiere.json` oben. Gib am Ende **3 Tiere gespeichert** aus. -start: l27-java-json-start.visustruct -test: - -> 3 Tiere gespeichert -datei: tiere-neu.json -> [ | {"name": "Ludwig", "art": "Geißbock", "alter": 7}, | {"name": "Zora", "art": "Ziege", "alter": 6}, | {"name": "Fuchs", "art": "Rotfuchs", "alter": 4} | ] -braucht: forSchleife, verzweigung -tipp: `zeilen[0]` ist die Kopfzeile. Beginne die for-Schleife deshalb bei `i = 1` und zerlege `zeilen[i]` mit `split(";")`. -tipp: Baue den Eintrag wie in Lektion 26 mit `\"`. Das Alter ist eine Zahl und steht ohne Anführungszeichen. Ein Komma hängst du nur an, wenn `i < zeilen.length - 1` ist. -lösung: l27-java-json-loesung.visustruct -::: - -## Spiel: Welches Format passt? - -::: spiel frage -titel: Spiel: Welches Format passt? -intro: Ludwig will Daten speichern und weiß nicht, welches Format er nehmen soll. Hilf ihm. Sechs Runden. -antworten: txt | CSV | JSON - -runde: -frage: Die Noten der ganzen Klasse sollen in Excel geöffnet werden. -richtig: CSV -> Noten sind eine Tabelle, und Excel öffnet CSV-Dateien direkt. - -runde: -frage: Ludwig schreibt Zora einen Brief. -richtig: txt -> Ein Brief ist Text für Menschen. Er braucht keine Spalten und keine Schlüssel. - -runde: -frage: Ein Spielstand mit Name, Level und einer Liste aller gesammelten Schlüssel. -richtig: JSON -> Eine Liste in einem Eintrag lässt sich in JSON verschachteln. In CSV passt sie nur schwer in eine Zelle. - -runde: -frage: Ein Messgerät speichert jede Minute Uhrzeit und Temperatur, ein ganzes Jahr lang. -richtig: CSV -> Viele gleiche Zeilen mit denselben Spalten: CSV ist dafür am kleinsten. JSON würde die Schlüssel in jeder Zeile wiederholen. - -runde: -frage: Eine Wetter-App holt die Vorhersage von einem Server im Internet. -richtig: JSON -> JSON ist der Standard im Web. Fast jede App bekommt ihre Daten so. - -runde: -frage: Das Logbuch der Burg, in dem jeder Eintrag ein kurzer Satz ist. -richtig: txt -> Jede Zeile ist ein Satz für Menschen. Gelesen wird sie Zeile für Zeile, wie in Lektion 24. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann dieselben Daten als txt, CSV und JSON erkennen. → Dreimal dieselben Tiere -- Ich kann Stärken und Schwächen von txt, CSV und JSON vergleichen. → Was kann welches Format? -- Ich kann eine CSV-Datei in Sätze umwandeln. → Übung: Aus CSV werden Sätze -- Ich kann eine CSV-Datei in JSON umwandeln. → Übung: Aus CSV wird JSON -::: - -## Wissenstest - -::: quiz -? Welches Format öffnet Excel direkt als Tabelle? -→ Was kann welches Format? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Warum ist eine JSON-Datei meist größer als eine CSV-Datei mit denselben Daten? -→ Was kann welches Format? -- [ ] Weil JSON mehr Zahlen speichert. -- [x] Weil die Schlüssel in jedem Eintrag wiederholt werden. -- [ ] Weil JSON keine Kommas benutzt. - -? In welchem Format sagt jeder Wert selbst, was er bedeutet? -→ Was kann welches Format? -- [ ] txt -- [ ] CSV -- [x] JSON -> In JSON steht der Schlüssel direkt vor dem Wert, zum Beispiel "alter": 7. - -? Ordne jedem Zweck ein Format zu. -→ Was kann welches Format? -= ein Brief an Zora -> txt -= die Notenliste der Klasse -> CSV -= ein Spielstand mit Listen -> JSON -::: diff --git a/web/lessons/de/28-erstes-fenster.md b/web/lessons/de/28-erstes-fenster.md deleted file mode 100644 index 72760ef5..00000000 --- a/web/lessons/de/28-erstes-fenster.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -titel: Dein erstes Fenster -bereich: Fenster mit Swing -kurz: Mit Java und Swing ein eigenes Fenster öffnen, Zeile für Zeile erklärt. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- im Bereich Code „Echtes Java“ einschalten -- ein Fenster mit Titel und Größe öffnen -- erklären, was jede Zeile des Fensterprogramms macht -- erklären, warum setVisible(true) am Ende steht -::: - -## Programme mit Fenstern - -Bisher haben deine Programme Text in die Konsole geschrieben. Die meisten Programme, die du kennst, haben aber **Fenster** mit Knöpfen und Textfeldern. Das nennt man eine grafische Oberfläche. - -Java bringt dafür einen Werkzeugkasten mit: **Swing**. In VisuStruct schaltest du ihn so ein: - -1. Öffne rechts den Bereich [Code](#zeige-codelive). -2. Klicke oben rechts auf das [Zahnrad](#zeige-einstellungen) und wähle als **Programmiersprache** Java. -3. Setze darunter im Abschnitt Java den Haken bei **Echtes Java (mit Swing)**. - -Beim ersten [▶︎ Ausführen](#zeige-ausfuehren) lädt VisuStruct einmalig etwa 40 MB, das dauert einen Moment. Danach läuft dein Code als echtes Java, und deine Fenster erscheinen im Bereich Code im Feld **Java-Fenster** über der Konsole. - -> Mit „Echtes Java“ funktionieren Eingaben über die Konsole (`Scanner`) noch nicht. Für Programme mit Eingabe schaltest du den Haken wieder aus. - -::: angeberwissen -Swing gibt es seit 1998. Davor hatte Java nur das ältere AWT mit einer Klasse `Frame`. Damit man die neuen Bausteine nicht verwechselt, beginnen in Swing fast alle Namen mit **J**: `JFrame`, `JButton`, `JLabel`. Am J erkennst du Swing also sofort. -::: - -## Das ganze Programm - -So sieht das kleinste Programm aus, das ein Fenster öffnet. Tippe es im Bereich Code ab und klicke auf [▶︎ Ausführen](#zeige-ausfuehren): - -```java -import javax.swing.*; - -public class MeinFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Mein erstes Fenster"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); - } -} -``` - -Ein leeres graues Fenster mit dem Titel „Mein erstes Fenster“ erscheint. Mehr nicht, aber es ist dein eigenes Fenster! - -Den Rahmen mit `public class` und `main` kennst du schon aus der Lektion Java. Neu sind die erste Zeile und die vier Zeilen in `main`. Die schauen wir uns jetzt einzeln an. - -::: ludwig -Schau dir das Struktogramm neben dem Code an: Jede Zeile in `main` ist ein Kasten, alle untereinander. Ein Fensterprogramm ist am Anfang also nur eine Sequenz. -::: - -## Zeile für Zeile - -| Zeile | Was sie macht | -|---|---| -| `import javax.swing.*;` | Holt den Werkzeugkasten Swing ins Programm. Ohne diese Zeile kennt Java `JFrame` nicht. | -| `JFrame fenster = new JFrame("Mein erstes Fenster");` | Baut ein neues Fenster. Der Text in Klammern ist der Titel oben im Fensterrahmen. Über die Variable `fenster` sprichst du es danach an. | -| `fenster.setSize(300, 200);` | Das Fenster wird 300 Pixel breit und 200 Pixel hoch. | -| `fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);` | Schließt jemand das Fenster, endet auch das Programm. | -| `fenster.setVisible(true);` | Jetzt erst wird das Fenster sichtbar. | - -Der Punkt in `fenster.setSize(…)` bedeutet: „Fenster, mach das!“ Vor dem Punkt steht, wer etwas tun soll, dahinter, was es tun soll. - -> Ohne `setDefaultCloseOperation` versteckt Java das Fenster beim Schließen nur. Das Programm läuft dann unsichtbar weiter. - -::: quiz -? Was bedeutet der Punkt in `fenster.setSize(300, 200)`? -- [x] „Fenster, mach das!“: Vor dem Punkt steht, wer etwas tut, dahinter, was es tut. -- [ ] Er trennt die beiden Zahlen. -- [ ] Er beendet die Zeile. -> Vor dem Punkt steht das Objekt `fenster`, dahinter seine Methode `setSize`. -::: - -## Warum setVisible am Ende steht - -`setVisible(true)` zeigt das Fenster so, wie es in diesem Moment ist. Deshalb richtest du zuerst alles ein: Titel, Größe, später auch Knöpfe. Erst ganz am Ende machst du das Fenster sichtbar. - -Was du erst nach `setVisible(true)` ins Fenster legst, erscheint oft nicht. Java zeichnet das Fenster nämlich nicht von selbst neu. Manchmal taucht es erst auf, wenn man die Größe des Fensters ändert. Solche Fehler sind schwer zu finden. - -::: ludwig -Erst einrichten, dann zeigen. Wie im Theater: Der Vorhang geht erst auf, wenn die Bühne fertig aufgebaut ist. -::: - -Probier es aus: Lösche die Zeile mit `setVisible(true)` und führe das Programm noch einmal aus. Das Programm läuft, aber du siehst kein Fenster. - -## Klassen und Objekte - -Das steht nicht im Lehrplan, hilft dir aber, Swing zu verstehen. - -::: angeberwissen -Java ist eigentlich eine **objektorientierte** Sprache. `JFrame` ist eine Klasse, also ein Bauplan für Fenster. Mit `new JFrame(…)` baut Java nach diesem Bauplan ein echtes Fenster, ein **Objekt**. Du könntest mit zwei `new` auch zwei Fenster bauen, beide nach demselben Bauplan. - -`setSize` und `setVisible` sind Methoden, die jedes Fenster-Objekt kann. Deshalb schreibst du `fenster.setSize(…)`: Das Objekt `fenster` führt seine Methode aus. Auch dein Programm selbst ist eine Klasse, nämlich `MeinFenster`. -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Ludwig hat am Fensterprogramm herumgebastelt. Lies die Zeilen und sag vorher, was passiert. Sechs Runden. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: Was siehst du nach dem Ausführen? -- ein Fenster mit dem Titel „Hallo“ -- [x] gar kein Fenster -- eine Fehlermeldung -> `setVisible(true)` fehlt. Das Fenster ist gebaut, bleibt aber unsichtbar. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(200, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); -frage: Wie sieht das Fenster aus? -- breiter als hoch -- [x] höher als breit -- quadratisch -> Die erste Zahl ist die Breite, die zweite die Höhe: 200 breit, 300 hoch. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(300, 200); - fenster.setVisible(true); -frage: Du schließt das Fenster. Was passiert mit dem Programm? -- Es endet. -- [x] Es läuft unsichtbar weiter. -- Das Fenster geht sofort wieder auf. -> Ohne `setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)` versteckt Java das Fenster nur. - -runde: - JFrame fenster = new JFrame(); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); -frage: Was steht oben im Fensterrahmen? -- fenster -- JFrame -- [x] nichts, der Titel ist leer -> Ohne Text in den Klammern hat das Fenster keinen Titel. Der Variablenname `fenster` erscheint nie im Fenster. - -runde: - public class Test { - public static void main(String[] args) { - JFrame fenster = new JFrame("Test"); - fenster.setVisible(true); - } - } -frage: Was meldet javac? -- [x] cannot find symbol: class JFrame -- nichts, das Fenster erscheint -- missing return statement -> Die Zeile `import javax.swing.*;` fehlt. Ohne sie kennt Java `JFrame` nicht. - -runde: - JFrame a = new JFrame("Eins"); - JFrame b = new JFrame("Zwei"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: Was siehst du? -- [x] ein Fenster mit dem Titel „Eins“ -- zwei Fenster -- ein Fenster mit dem Titel „Zwei“ -> Zwei Fenster nach demselben Bauplan, aber nur `a` wird sichtbar gemacht. -::: - -## Aufgabe: Dein eigenes Fenster - -Ändere das Programm so, dass - -- im Titel „Hallo“ und dein Name steht, -- das Fenster 400 Pixel breit und 300 Pixel hoch ist, -- das Programm endet, wenn du das Fenster schließt. - -Führe es aus und prüfe alle drei Punkte. - -::: ludwig -Du willst nicht so viel tippen? Mit „Echtes Java“ darfst du im Bereich Code auch nur die vier Zeilen aus `main` schreiben. VisuStruct packt sie dann selbst in eine Klasse und ergänzt die `import`-Zeilen. In einer richtigen Java-Entwicklungsumgebung brauchst du aber das ganze Programm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann im Bereich Code „Echtes Java“ einschalten. → Programme mit Fenstern -- Ich kann ein Fenster mit Titel und Größe öffnen. → Das ganze Programm -- Ich kann erklären, was jede Zeile des Fensterprogramms macht. → Zeile für Zeile -- Ich kann erklären, warum setVisible(true) am Ende steht. → Warum setVisible am Ende steht -::: - -## Wissenstest - -::: quiz -? Welche Zeile macht das Fenster sichtbar? -→ Warum setVisible am Ende steht -- [ ] fenster.setSize(300, 200); -- [x] fenster.setVisible(true); -- [ ] new JFrame("Hallo"); -> Ohne setVisible(true) bleibt das Fenster unsichtbar. - -? Wo steht fenster.setVisible(true) am besten? -→ Warum setVisible am Ende steht -- [ ] Ganz am Anfang von main -- [x] Am Ende, wenn das Fenster fertig eingerichtet ist -- [ ] Das ist egal. -> Was nach setVisible(true) dazukommt, erscheint oft nicht. - -? Was bewirkt setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)? -→ Zeile für Zeile -- [ ] Das Fenster schließt sich sofort. -- [x] Schließt man das Fenster, endet das Programm. -- [ ] Das Fenster lässt sich nicht mehr schließen. - -? Woran erkennst du Bausteine aus Swing? -→ Zeile für Zeile -- [x] Ihr Name beginnt mit J, z. B. JFrame. -- [ ] Sie stehen in geschweiften Klammern. -- [ ] Sie enden mit Window. -::: diff --git a/web/lessons/de/29-knopf-im-fenster.md b/web/lessons/de/29-knopf-im-fenster.md deleted file mode 100644 index 18d08938..00000000 --- a/web/lessons/de/29-knopf-im-fenster.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -titel: Ein Knopf im Fenster -bereich: Fenster mit Swing -kurz: Einen Knopf ins Fenster legen und mit einem Layout ordentlich anordnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Knopf bauen und mit add ins Fenster legen -- erklären, warum der Knopf vor setVisible(true) hineinkommt -- mit FlowLayout dafür sorgen, dass der Knopf normal groß ist -- ein Fenster mit einem Knopf bauen, den man drücken kann -::: - -## Einen Knopf bauen - -Ein leeres Fenster ist langweilig. Jetzt kommt ein Knopf hinein. In Swing heißt ein Knopf **JButton** (button ist englisch für Knopf). - -Zwei neue Zeilen brauchst du dafür: - -```java -JButton knopf = new JButton("Klick mich"); -fenster.add(knopf); -``` - -- `new JButton("Klick mich")` baut einen Knopf. Der Text in Klammern steht später auf dem Knopf. -- `fenster.add(knopf)` legt den Knopf ins Fenster. Ohne `add` gibt es den Knopf zwar, aber er liegt nirgends und du siehst ihn nicht. - -::: quiz -? Was steht auf dem Knopf nach `new JButton("Start")`? -- [ ] knopf -- [x] Start -- [ ] JButton -> Der Text in Klammern ist die Beschriftung. `knopf` ist nur der Name der Variable. -::: - -## Das ganze Programm - -Beide Zeilen kommen **vor** `setVisible(true)`, denn das Fenster soll erst fertig eingerichtet und dann gezeigt werden: - -```java -import javax.swing.*; - -public class KnopfFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton knopf = new JButton("Klick mich"); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -``` - -Führe das Programm aus. Überraschung: Der Knopf ist riesig und füllt das ganze Fenster! - -::: ludwig -Die Reihenfolge ist wie beim ersten Fenster: einrichten, Knopf bauen, Knopf hineinlegen und ganz zum Schluss zeigen. Die Leerzeilen im Code helfen dir, diese Teile zu sehen. -::: - -## Der Riesenknopf - -Wie ein Fenster seine Teile anordnet, bestimmt sein **Layout**. Ein `JFrame` legt ohne weitere Angabe alles in die Mitte und macht es so groß wie das ganze Fenster. - -Mit einem anderen Layout bekommt der Knopf seine normale Größe. Das **FlowLayout** stellt alles wie Wörter in einer Zeile nebeneinander, so groß wie nötig: - -```java -import javax.swing.*; -import java.awt.*; - -public class KnopfFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new FlowLayout()); - - JButton knopf = new JButton("Klick mich"); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -``` - -`FlowLayout` gehört zum älteren Werkzeugkasten AWT. Deshalb steht oben eine zweite Zeile: `import java.awt.*;`. - -::: angeberwissen -Beim FlowLayout fließen die Bausteine wie Text: Passt ein Knopf nicht mehr in die Zeile, rutscht er in die nächste. Mach das Fenster schmal und schau zu, wie die Knöpfe umbrechen. Flow ist englisch für Fluss. -::: - -## Klicken geht, aber nichts passiert - -Klicke auf den Knopf. Er wird kurz dunkler, wenn du ihn drückst. Swing zeigt also, dass er gedrückt wurde. Sonst passiert aber nichts. - -Das ist kein Fehler: Du hast dem Programm noch nicht gesagt, **was** beim Klick passieren soll. Das lernst du in der nächsten Lektion. - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Fensterprogramm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was das Programm tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sechs Runden, je 25 Sekunden. -zeit: 25 - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - JButton knopf = new JButton(Klick mich); - fenster.add(knopf); - fenster.setVisible(true); -frage: Soll einen Knopf „Klick mich“ zeigen. -fehler: 3 -besser: JButton knopf = new JButton("Klick mich"); -> Die Beschriftung ist ein Text und braucht Anführungszeichen. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - JButton knopf = new JButton("OK"); - fenster.add(fenster); - fenster.setVisible(true); -frage: Soll den Knopf „OK“ ins Fenster legen. -fehler: 4 -besser: fenster.add(knopf); -> Ins Fenster gehört der Knopf, nicht das Fenster selbst. - -runde: - import java.swing.*; - import java.awt.*; -frage: Soll Swing und das FlowLayout ins Programm holen. -fehler: 1 -besser: import javax.swing.*; -> Swing liegt in `javax.swing`, mit x. Das FlowLayout kommt aus `java.awt`, ohne x. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout); - fenster.add(new JButton("OK")); - fenster.setVisible(true); -frage: Soll den Knopf in normaler Größe zeigen. -fehler: 3 -besser: fenster.setLayout(new FlowLayout()); -> Nach `new` und dem Namen kommen immer runde Klammern, auch wenn nichts darin steht. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout()); - JButton knopf = new Jbutton("OK"); - fenster.add(knopf); - fenster.setVisible(true); -frage: Soll einen Knopf „OK“ zeigen. -fehler: 4 -besser: JButton knopf = new JButton("OK"); -> Java unterscheidet Groß- und Kleinschreibung: `JButton` mit großem B. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout()); - fenster.add(new JButton("OK")); - fenster.setVisible(false); -frage: Soll das Fenster mit dem Knopf zeigen. -fehler: 5 -besser: fenster.setVisible(true); -> Mit `false` bleibt das Fenster unsichtbar. -::: - -## Aufgabe: Klick mich - -Baue ein Fenster mit dem Titel „Knopf-Test“, 300 mal 200 Pixel groß, mit einem Knopf „Klick mich“ in normaler Größe. Der Knopf soll sich drücken lassen, auch wenn noch nichts passiert. - -Zusatz: Lege einen zweiten Knopf „Ich auch“ daneben. In welcher Reihenfolge stehen die Knöpfe? Tausche die beiden `add`-Zeilen und probiere es noch einmal. - -**Du bist fertig, wenn …** - -- oben im Fenster „Knopf-Test“ steht, -- das Fenster 300 Pixel breit und 200 Pixel hoch ist, -- der Knopf „Klick mich“ nur so groß ist wie seine Schrift und nicht das ganze Fenster füllt, -- sich der Knopf beim Klicken sichtbar eindrückt. - -::: ludwig -Jeder Knopf braucht eine eigene Variable, zum Beispiel `knopf` und `knopf2`, und ein eigenes `add`. Das FlowLayout stellt die Knöpfe in der Reihenfolge der `add`-Zeilen auf. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Knopf bauen und mit add ins Fenster legen. → Einen Knopf bauen -- Ich kann erklären, warum der Knopf vor setVisible(true) hineinkommt. → Das ganze Programm -- Ich kann mit FlowLayout dafür sorgen, dass der Knopf normal groß ist. → Der Riesenknopf -- Ich kann ein Fenster mit einem Knopf bauen, den man drücken kann. → Aufgabe: Klick mich -::: - -## Wissenstest - -::: quiz -? Was macht fenster.add(knopf)? -→ Einen Knopf bauen -- [ ] Es baut einen neuen Knopf. -- [x] Es legt den Knopf ins Fenster. -- [ ] Es macht den Knopf klickbar. -> Gebaut wird der Knopf mit new JButton(…). - -? Warum füllt der Knopf ohne FlowLayout das ganze Fenster? -→ Der Riesenknopf -- [ ] Weil der Text zu lang ist -- [x] Weil das Fenster ohne eigenes Layout alles so groß wie das Fenster macht -- [ ] Weil setSize fehlt - -? Welche import-Zeile brauchst du für FlowLayout? -→ Der Riesenknopf -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> FlowLayout stammt aus dem älteren AWT. - -? Was passiert beim Klick auf den Knopf in dieser Lektion? -→ Aufgabe: Klick mich -- [ ] Das Programm endet. -- [x] Der Knopf wird kurz dunkler, sonst passiert nichts. -- [ ] Auf dem Knopf steht „Ich wurde geklickt“. -> Was beim Klick passieren soll, lernst du in der nächsten Lektion. -::: diff --git a/web/lessons/de/30-der-knopf-reagiert.md b/web/lessons/de/30-der-knopf-reagiert.md deleted file mode 100644 index 2104a6ee..00000000 --- a/web/lessons/de/30-der-knopf-reagiert.md +++ /dev/null @@ -1,356 +0,0 @@ ---- -titel: Der Knopf reagiert -bereich: Fenster mit Swing -kurz: Mit einem ActionListener festlegen, was beim Klick passiert. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Ereignis ist -- mit addActionListener festlegen, was beim Klick passiert -- beim Klick mehrere Anweisungen ausführen -- einen Knopf bauen, der nach dem Klick seinen Text ändert -::: - -## Ein Klick ist ein Ereignis - -In der letzten Lektion ließ sich der Knopf drücken, aber nichts geschah. Bei einem Fensterprogramm bestimmt nämlich der Mensch, wann etwas passiert: Er klickt, tippt oder schließt ein Fenster. Jede solche Aktion heißt **Ereignis**. - -Dein Programm muss deshalb auf den Klick warten und ihn bemerken. Dafür meldest du beim Knopf einen Zuhörer an, einen **ActionListener** (englisch für „Aktions-Zuhörer“). Bei jedem Klick ruft der Knopf seinen Zuhörer, und der führt deinen Code aus. - -::: ludwig -Bisher lief dein Programm von oben nach unten durch, wie im Struktogramm. Der Code im Zuhörer läuft dagegen erst später, nämlich immer dann, wenn jemand klickt. Wie oft das ist, weiß vorher niemand. -::: - -## Die Zeile mit dem Pfeil - -So meldest du den Zuhörer an: - -```java -knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); -``` - -Von außen nach innen gelesen: - -- `knopf.addActionListener( … )` meldet beim Knopf einen Zuhörer an. -- `e` ist das Ereignis. Darin steht zum Beispiel, wann geklickt wurde. Hier brauchst du es nicht, aber der Name muss dastehen. -- `->` liest du als „dann mach“. -- `knopf.setText("Ich wurde geklickt")` ist das, was beim Klick passiert: Der Knopf bekommt eine neue Beschriftung. - -Die Zeile steht nach `new JButton(…)`, denn den Knopf muss es schon geben. Und wie alles andere kommt sie vor `setVisible(true)`. - -::: quiz -? Wofür steht das `e` in `e -> knopf.setText(…)`? -- [x] Für das Ereignis, also den Klick -- [ ] Für „Ende“ -- [ ] Für einen Fehler -> Hier brauchst du `e` nicht, aber der Name muss dastehen. -::: - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; - -public class KlickMich { - public static void main(String[] args) { - JFrame fenster = new JFrame("Klick mich"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new FlowLayout()); - - JButton knopf = new JButton("Klick mich"); - knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -``` - -Führe es aus und klicke auf den Knopf. Jetzt steht darauf „Ich wurde geklickt“. - -> Ist der neue Text länger als der alte, macht das FlowLayout den Knopf von selbst breiter. - -## Mehrere Anweisungen beim Klick - -Soll beim Klick mehr als eine Sache passieren, setzt du hinter den Pfeil geschweifte Klammern. Darin steht jede Anweisung mit Semikolon, wie in einem Schleifenrumpf: - -```java -knopf.addActionListener(e -> { - knopf.setText("Ich wurde geklickt"); - fenster.setTitle("Danke!"); - System.out.println("Klick!"); -}); -``` - -`System.out.println` schreibt wie gewohnt in die [Konsole](#zeige-konsole). Klicke mehrmals: Bei jedem Klick erscheint eine neue Zeile „Klick!“. So siehst du, dass der Code im Zuhörer wirklich bei jedem Klick läuft. - -::: ludwig -Achte auf das Ende: Erst schließt `}` den Block, dann `)` die Klammer von `addActionListener`, dann kommt das Semikolon. Also `});`. Fehlt etwas davon, steht unter dem Code ein Hinweis. -::: - -## Spiel: Wer hört zu? - -::: spiel zuhoerer -titel: Spiel: Wer hört zu? -intro: Ludwig zeigt dir Code und das Fenster dazu. Darunter steht, welche Knöpfe nacheinander geklickt werden. Was passiert? Nach deiner Antwort spielt Ludwig die Klicks ab: Du siehst, welcher Zuhörer das Ereignis hört und welche Zeilen dann laufen. -frage: Was steht nach den Klicks in der Beschriftung? - -runde: - JFrame fenster = new JFrame("Gruß"); - JLabel text = new JLabel("Start"); - JButton knopf = new JButton("Hallo"); - knopf.addActionListener(e -> text.setText("Hallo Welt")); -klicks: Hallo -- Start -- [x] Hallo Welt -- Hallo -> Der Knopf hat einen Zuhörer. Beim Klick führt er `text.setText("Hallo Welt")` aus, und die Beschriftung zeigt „Hallo Welt“. - -runde: - JFrame fenster = new JFrame("Obst"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apfel")); - b.addActionListener(e -> text.setText("Birne")); -klicks: A, B -- Apfel -- [x] Birne -- Apfel Birne -> Jeder Knopf hat seinen eigenen Zuhörer. Erst schreibt A „Apfel“ hinein, dann überschreibt B das mit „Birne“. `setText` ersetzt den alten Text, es hängt nichts an. - -runde: - JFrame fenster = new JFrame("Obst"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apfel")); -klicks: B -- Apfel -- Birne -- [x] ? -> Beim Knopf B hat sich niemand angemeldet: Es gibt kein `b.addActionListener`. Der Klick ist ein Ereignis, aber niemand hört zu. Deshalb bleibt das Fragezeichen stehen. - -runde: - JFrame fenster = new JFrame("Farben"); - JLabel text = new JLabel("keine"); - JButton rot = new JButton("Rot"); - JButton blau = new JButton("Blau"); - rot.addActionListener(e -> text.setText("Blau")); - blau.addActionListener(e -> text.setText("Rot")); -klicks: Rot -- Rot -- [x] Blau -- keine -> Aufgepasst: Was passiert, entscheidet der Code im Zuhörer, nicht die Beschriftung des Knopfs. Der Zuhörer am Knopf „Rot“ schreibt „Blau“ hinein. - -runde: - JFrame fenster = new JFrame("Knopf"); - JLabel text = new JLabel("Bitte klicken"); - JButton knopf = new JButton("Klick mich"); - knopf.addActionListener(e -> { - knopf.setText("Danke!"); - text.setText("Geklickt"); - }); -klicks: Klick mich -frage: Was steht nach dem Klick auf dem Knopf? -- Klick mich -- [x] Danke! -- Geklickt -> Im Block hinter dem Pfeil stehen zwei Anweisungen. Beide laufen beim Klick nacheinander: Der Knopf bekommt „Danke!“, die Beschriftung „Geklickt“. - -runde: - JFrame fenster = new JFrame("Konsole"); - JButton knopf = new JButton("Los"); - knopf.addActionListener(e -> System.out.println("Klick!")); -klicks: Los, Los, Los -frage: Wie viele Zeilen „Klick!“ stehen danach in der Konsole? -- 1 -- [x] 3 -- 0 -> Der Zuhörer läuft bei **jedem** Klick, nicht nur beim ersten. Drei Klicks, drei Zeilen. -::: - -## ActionListener ist ein Interface - -Das steht nicht im Lehrplan. Wenn du wissen willst, was hinter dem Pfeil steckt, lies weiter. - -::: angeberwissen -`ActionListener` ist ein **Interface**, eine Art Vertrag. Darin steht: Wer ein ActionListener sein will, muss eine Methode `actionPerformed(ActionEvent e)` haben. Der Knopf ruft bei jedem Klick genau diese Methode auf. -::: - -Die Zeile mit dem Pfeil kennst du schon aus Schritt 3: - -```java -knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); -``` - -Ohne Pfeil schreibt man den Zuhörer als Klasse ohne Namen, die den Vertrag erfüllt (eine anonyme Klasse): - -```java -knopf.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - knopf.setText("Ich wurde geklickt"); - } -}); -``` - -Dafür brauchst du oben noch `import java.awt.event.*;`. Beide Schreibweisen machen genau dasselbe. Der Pfeil `e -> …` ist die Kurzform (ein Lambda-Ausdruck, seit Java 8): `e` ist der Parameter von `actionPerformed`, und hinter dem Pfeil steht ihr Rumpf. Die Kurzform geht, weil das Interface nur eine einzige Methode hat. Java weiß also, welche Methode gemeint ist. - -## Spiel: Vertrag erfüllt? - -::: spiel vertrag -titel: Spiel: Vertrag erfüllt? -intro: Der Vertrag `ActionListener` verlangt genau eine Methode: `public void actionPerformed(ActionEvent e)`. Ludwig zeigt dir Code. Erfüllt er den Vertrag, sodass man ihn beim Knopf anmelden kann? Jede Antwort hat Ludwig mit dem echten Java-Compiler geprüft. -frage: Erfüllt das den Vertrag ActionListener? -antworten: erfüllt | nicht erfüllt - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Alles da: `implements ActionListener` unterschreibt den Vertrag, und die Methode heißt genau `actionPerformed`, ist `public`, gibt nichts zurück (`void`) und bekommt ein `ActionEvent`. - -runde: - class Gruss implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Schau genau hin: `actionPerfomed` statt `actionPerformed`, ein r fehlt. Für Java ist das eine ganz andere Methode. Der Compiler meldet, dass `actionPerformed` fehlt. - -runde: - class Gruss implements ActionListener { - public void actionPerformed() { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Der Parameter fehlt. Der Vertrag verlangt `actionPerformed(ActionEvent e)`, denn der Knopf übergibt beim Klick das Ereignis. - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent ereignis) { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Der Name des Parameters ist frei wählbar. Wichtig ist nur der Typ `ActionEvent`. Statt `e` darf er also auch `ereignis` heißen. - -runde: - class Gruss implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Das `public` fehlt. Alle Methoden eines Interfaces sind öffentlich, denn der Knopf muss sie von außen aufrufen können. Ohne `public` meldet der Compiler einen Fehler. - -runde: - class Gruss implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: nicht erfüllt -> Der Vertrag sagt `void`: Die Methode gibt nichts zurück. Mit `int` als Rückgabetyp passt sie nicht mehr. - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - sagHallo(); - } - void sagHallo() { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Zusätzliche Methoden sind erlaubt. Der Vertrag verlangt nur, dass `actionPerformed` da ist, nicht, dass sonst nichts da ist. - -runde: - class Gruss { - public void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } - knopf.addActionListener(new Gruss()); -richtig: nicht erfüllt -> Die Methode stimmt, aber der Vertrag ist nicht unterschrieben: Es fehlt `implements ActionListener`. Java nimmt beim Knopf nur Objekte an, die den Vertrag offiziell erfüllen. - -runde: - knopf.addActionListener(e -> System.out.println("Hallo")); -richtig: erfüllt -> Der Pfeil ist die Kurzform. Weil der Vertrag nur eine Methode hat, weiß Java: `e` ist der Parameter von `actionPerformed`, und hinter dem Pfeil steht ihr Rumpf. - -runde: - knopf.addActionListener((a, b) -> System.out.println("Hallo")); -richtig: nicht erfüllt -> Hier hat der Pfeil zwei Parameter. `actionPerformed` bekommt aber genau einen, das Ereignis. Darum passt diese Kurzform nicht zum Vertrag. -::: - -## Aufgabe: Ich wurde geklickt - -Jetzt machst du die Aufgabe fertig: Baue ein Fenster mit einem Knopf „Klick mich“ in normaler Größe. Nach dem Klick steht auf dem Knopf „Ich wurde geklickt“. - -Zusatz: Baue zwei Knöpfe „Rot“ und „Blau“. Ein Klick auf einen Knopf schreibt seinen Namen in den Titel des Fensters, zum Beispiel „Du hast Rot gewählt“. - -**Du bist fertig, wenn …** - -- vor dem Klick „Klick mich“ auf dem Knopf steht, -- nach dem Klick „Ich wurde geklickt“ darauf steht, -- der Knopf nicht das ganze Fenster füllt. - -::: ludwig -Jeder Knopf bekommt seinen eigenen Zuhörer mit eigenem `addActionListener`. Den Titel änderst du mit `fenster.setTitle(…)`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Ereignis ist. → Ein Klick ist ein Ereignis -- Ich kann mit addActionListener festlegen, was beim Klick passiert. → Die Zeile mit dem Pfeil -- Ich kann beim Klick mehrere Anweisungen ausführen. → Mehrere Anweisungen beim Klick -- Ich kann einen Knopf bauen, der nach dem Klick seinen Text ändert. → Aufgabe: Ich wurde geklickt -::: - -## Wissenstest - -::: quiz -? Was ist ein ActionListener? -→ Ein Klick ist ein Ereignis -- [ ] Ein Knopf mit Text -- [x] Ein Zuhörer, der bei jedem Klick deinen Code ausführt -- [ ] Ein Layout für Fenster -> Du meldest ihn mit addActionListener beim Knopf an. - -? Wann läuft knopf.setText("Ich wurde geklickt") im Zuhörer? -→ Die Zeile mit dem Pfeil -- [ ] Sofort beim Start des Programms -- [x] Jedes Mal, wenn jemand auf den Knopf klickt -- [ ] Nur beim ersten Klick -> Der Code im Zuhörer läuft erst, wenn das Ereignis eintritt. - -? Wie endet ein Zuhörer mit geschweiften Klammern? -→ Die Zeile mit dem Pfeil -- [ ] };) -- [x] }); -- [ ] );} -> Erst schließt der Block, dann die Klammer von addActionListener, dann das Semikolon. - -? Ordne jedem Teil seine Aufgabe zu. -→ Die Zeile mit dem Pfeil -= JButton -> ein Knopf -= addActionListener -> Zuhörer anmelden -= setText -> Beschriftung ändern -= setVisible(true) -> Fenster zeigen -::: diff --git a/web/lessons/de/31-zahl-verdoppeln.md b/web/lessons/de/31-zahl-verdoppeln.md deleted file mode 100644 index a9e9c576..00000000 --- a/web/lessons/de/31-zahl-verdoppeln.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Zahl verdoppeln im Fenster -bereich: Fenster mit Swing -kurz: Beschriftung, Textfeld und Knopf mit einem GridLayout anordnen und mit dem Text im Textfeld rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- JLabel und JTextField ins Fenster legen -- erklären, warum ohne Layout nur der letzte Baustein zu sehen ist -- mit GridLayout(0, 1) alles untereinander anordnen -- mit getText, Integer.parseInt und setText rechnen -- ein Programm schreiben, das bei „abc“ nicht abstürzt -::: - -## Das Ziel - -Wir bauen ein kleines Rechenprogramm mit Fenster: Oben steht eine Beschriftung, darunter ein Textfeld und ein Knopf **Berechne**. Gibst du 2 ein und klickst, steht im Textfeld 4. Klickst du noch einmal, wird daraus 8, dann 16 und so weiter. - -Dafür brauchst du zwei neue Bausteine: - -- **JLabel**: eine Beschriftung, also einfacher Text im Fenster. -- **JTextField**: ein Textfeld, in das man etwas tippen kann. - -Schalte wie in den letzten Lektionen im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Drei Bausteine ins Fenster - -Wir legen alle drei Bausteine ins Fenster, genau wie den Knopf in Lektion 29: - -```java -import javax.swing.*; - -public class Verdoppeln { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahl verdoppeln"); - fenster.setSize(250, 150); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel beschriftung = new JLabel("Gib eine Zahl ein:"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Berechne"); - fenster.add(beschriftung); - fenster.add(feld); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -``` - -Führe das Programm aus. Hoppla: Man sieht nur den riesigen Knopf. Wo sind die Beschriftung und das Textfeld? - -## Warum nur der Knopf zu sehen ist - -::: ludwig -Erinnerst du dich an den Riesenknopf? Ein `JFrame` hat ohne eigenes Layout nur **einen** Platz: die Mitte. Jedes `add` legt den neuen Baustein genau dorthin, so groß wie das ganze Fenster. Die drei Bausteine landen also übereinander auf demselben Platz, und das Fenster zeigt nur den zuletzt hineingelegten: den Knopf. Benutzen kannst du das Programm so nicht. -::: - -Die Lösung ist wieder ein Layout. Diesmal nehmen wir das **GridLayout**. Es teilt das Fenster in gleich große Zellen wie ein Gitter: - -```java -fenster.setLayout(new GridLayout(0, 1)); -``` - -Die beiden Zahlen sind Zeilen und Spalten. `0` Zeilen heißt „so viele wie nötig“, `1` Spalte heißt: alles untereinander. Für `GridLayout` brauchst du oben außerdem `import java.awt.*;`. - -| Layout | So ordnet es an | -|---|---| -| ohne Layout | alles in die Mitte, übereinander | -| `FlowLayout` | nebeneinander wie Wörter, Zeilenumbruch wenn nötig | -| `GridLayout(0, 1)` | untereinander, jede Zeile gleich hoch | - -## Das Fenster mit GridLayout - -```java -import javax.swing.*; -import java.awt.*; - -public class Verdoppeln { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahl verdoppeln"); - fenster.setSize(250, 150); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel beschriftung = new JLabel("Gib eine Zahl ein:"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Berechne"); - fenster.add(beschriftung); - fenster.add(feld); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -``` - -Jetzt stehen alle drei untereinander. Du kannst ins Textfeld tippen und den Knopf drücken. Rechnen tut das Programm aber noch nicht. - -::: angeberwissen -Mit `new GridLayout(2, 3)` bekommst du 2 Zeilen mit je 3 Spalten, also 6 gleich große Zellen. So baut man zum Beispiel die Tasten eines Taschenrechners. Die Bausteine füllen die Zellen in der Reihenfolge der `add`-Zeilen, Zeile für Zeile von links nach rechts. -::: - -## Mit dem Text im Textfeld rechnen - -Beim Klick soll das Programm die Zahl aus dem Textfeld holen, verdoppeln und wieder hineinschreiben. Das machen drei Methoden: - -- `feld.getText()` liefert den Text im Textfeld, zum Beispiel `"2"`. -- `Integer.parseInt(…)` macht daraus die Zahl 2. Das kennst du aus Lektion 22. -- `feld.setText(…)` schreibt einen neuen Text ins Textfeld. - -Zusammen mit dem ActionListener aus Lektion 30 sieht das so aus: - -```java -knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); -}); -``` - -`setText` braucht einen Text. `"" + zahl * 2` hängt das Ergebnis an einen leeren Text und macht so aus der Zahl einen Text. - -## Keine Zahl? Kein Absturz! - -Tippe „abc“ ins Textfeld und klicke auf Berechne. Das Fenster bleibt, aber es passiert nichts, und in der [Konsole](#zeige-konsole) steht eine `NumberFormatException`. Aus Lektion 22 weißt du, was zu tun ist: - -```java -knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } -}); -``` - -Statt eines Fehlers in der Konsole sieht man jetzt einen Hinweis im Fenster. - -::: ludwig -Der Pfeil hat schon ein `e` für das Ereignis. Deshalb braucht die Exception im `catch` einen anderen Namen, hier `fehler`. Zwei Variablen mit demselben Namen erlaubt Java nicht. -::: - -::: quiz -? Warum heißt die Exception im `catch` hier `fehler` und nicht `e`? -- [ ] `catch` verlangt immer den Namen `fehler`. -- [x] `e` ist schon das Ereignis des Pfeils, und zwei Variablen mit demselben Namen erlaubt Java nicht. -- [ ] `e` ist nur für Zahlen erlaubt. -> Den Namen darfst du frei wählen, nur nicht doppelt. -::: - -## Spiel: Was steht danach im Fenster? - -::: spiel frage -titel: Spiel: Was steht danach im Fenster? -intro: Ludwig tippt etwas ins Textfeld und klickt auf Berechne. Lies den Zuhörer und sag vorher, was danach im Fenster steht. Sechs Runden. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - }); -frage: Im Textfeld steht 21. Was steht nach dem Klick darin? -- 2121 -- [x] 42 -- 21 -> `parseInt` macht aus dem Text die Zahl 21. Das Doppelte ist 42. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - }); -frage: Im Textfeld steht 21. Du klickst zweimal. Was steht danach darin? -- 42 -- [x] 84 -- 4242 -> Jeder Klick verdoppelt, was gerade im Feld steht: 21, 42, 84. - -runde: - knopf.addActionListener(e -> { - feld.setText(feld.getText() + feld.getText()); - }); -frage: Im Textfeld steht 21. Was steht nach dem Klick darin? -- 42 -- [x] 2121 -- 21 -> Ohne `parseInt` bleibt es ein Text, und `+` hängt Texte aneinander. - -runde: - knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } - }); -frage: Im Textfeld steht abc. Was passiert beim Klick? -- [x] Die Beschriftung zeigt „Bitte eine ganze Zahl eingeben!“ -- Im Textfeld steht abcabc. -- Das Fenster stürzt ab. -> `parseInt` wirft eine NumberFormatException, und `catch` fängt sie ab. - -runde: - knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } - }); -frage: Im Textfeld steht 2.5. Was passiert beim Klick? -- Im Textfeld steht 5.0. -- Im Textfeld steht 5. -- [x] Die Beschriftung zeigt „Bitte eine ganze Zahl eingeben!“ -> `Integer.parseInt` kennt nur ganze Zahlen. 2.5 ist für ihn keine Zahl. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl + zahl); - }); -frage: Im Textfeld steht 5. Was steht nach dem Klick darin? -- 10 -- [x] 55 -- 5 -> `"" + zahl` ist schon ein Text, und das zweite `+` hängt die 5 noch einmal an. Mit `"" + (zahl + zahl)` wird zuerst gerechnet. -::: - -## Aufgabe: Zahl verdoppeln - -Baue das ganze Programm zusammen: - -- ein Fenster mit dem Titel „Zahl verdoppeln“, 250 Pixel breit und 150 Pixel hoch, -- untereinander eine Beschriftung, ein Textfeld und ein Knopf „Berechne“, -- jeder Klick verdoppelt die Zahl im Textfeld: 2, 4, 8, 16, … -- bei „abc“ erscheint in der Beschriftung ein Hinweis statt eines Absturzes. - -Zusatz: Ein zweiter Knopf „Halbieren“ teilt die Zahl durch 2. Was passiert bei 5? - -**Du bist fertig, wenn …** - -- der Titel „Zahl verdoppeln“ heißt und Beschriftung, Textfeld und Knopf untereinander stehen, -- aus 2 nach drei Klicks nacheinander 4, 8 und 16 werden, -- bei „abc“ ein Hinweis in der Beschriftung steht und das Programm weiterläuft. - -::: ludwig -Der Knopf „Halbieren“ kommt als vierte Zeile ins GridLayout und bekommt seinen eigenen ActionListener. Bei `int` schneidet Java beim Teilen die Nachkommastellen ab. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann JLabel und JTextField ins Fenster legen. → Drei Bausteine ins Fenster -- Ich kann erklären, warum ohne Layout nur der letzte Baustein zu sehen ist. → Warum nur der Knopf zu sehen ist -- Ich kann mit GridLayout(0, 1) alles untereinander anordnen. → Das Fenster mit GridLayout -- Ich kann mit getText, Integer.parseInt und setText rechnen. → Mit dem Text im Textfeld rechnen -- Ich kann ein Programm schreiben, das bei „abc“ nicht abstürzt. → Keine Zahl? Kein Absturz! -::: - -## Wissenstest - -::: quiz -? Warum ist ohne Layout nur der Knopf zu sehen? -→ Warum nur der Knopf zu sehen ist -- [ ] Weil Beschriftung und Textfeld fehlen -- [x] Weil alle Bausteine in der Mitte übereinander liegen und der letzte die anderen verdeckt -- [ ] Weil das Fenster zu klein ist - -? Was bedeutet new GridLayout(0, 1)? -→ Das Fenster mit GridLayout -- [ ] Keine Zeile und eine Spalte, also ist das Fenster leer -- [x] So viele Zeilen wie nötig in einer Spalte, also alles untereinander -- [ ] Eine Zeile, alles nebeneinander - -? Was liefert feld.getText()? -→ Mit dem Text im Textfeld rechnen -- [ ] Immer eine Zahl -- [x] Den Text im Textfeld -- [ ] Den Titel des Fensters -> Für eine Zahl brauchst du noch Integer.parseInt. - -? Ordne jedem Baustein seine Aufgabe zu. -→ Drei Bausteine ins Fenster -= JLabel -> Beschriftung -= JTextField -> Textfeld zum Tippen -= JButton -> Knopf -= GridLayout -> Anordnung im Gitter -::: diff --git a/web/lessons/de/32-klickzaehler.md b/web/lessons/de/32-klickzaehler.md deleted file mode 100644 index 750a8b04..00000000 --- a/web/lessons/de/32-klickzaehler.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Klickzähler mit Reset -bereich: Fenster mit Swing -kurz: Zwei Knöpfe ändern dieselbe Zahl: eine Variable für die ganze Klasse anlegen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, warum ein Zuhörer eine Variable aus main nicht ändern darf -- eine static-Variable in der Klasse anlegen -- zwei Knöpfe dieselbe Zahl ändern lassen -- einen Zähler mit −1 bauen, der nie unter 0 fällt -::: - -## Das Ziel - -Ein Fenster zählt Klicks: Oben steht die Zahl, darunter zwei Knöpfe. **+1** zählt eins hoch, **Reset** setzt die Zahl wieder auf 0. - -Neu ist diesmal: Zwei Knöpfe arbeiten mit **derselben** Zahl. Dafür brauchst du eine Variable, die beide Zuhörer kennen. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Der erste Versuch - -Naheliegend wäre, die Zahl wie gewohnt in `main` anzulegen und im Zuhörer hochzuzählen: - -```java -int anzahl = 0; -knopf.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); -}); -``` - -Führst du das mit echtem Java aus, meldet der Compiler einen Fehler: - -``` -local variables referenced from a lambda expression must be final or effectively final -``` - -::: ludwig -Der Zuhörer läuft erst später, bei jedem Klick, wenn `main` längst fertig ist. Deshalb darf er die Variablen aus `main` zwar lesen, aber nicht verändern. Java besteht darauf: Eine Variable aus `main`, die im Pfeil vorkommt, muss gleich bleiben. Für eine Zahl, die sich bei jedem Klick ändert, brauchen wir einen anderen Platz. -::: - -## Eine Variable für die ganze Klasse - -Die Lösung: Die Variable kommt **nicht** in `main`, sondern direkt in die Klasse, über `main`. Dann gehört sie der ganzen Klasse, und jeder Zuhörer darf sie ändern: - -```java -public class Zaehler { - static int anzahl = 0; - - public static void main(String[] args) { - // hier wie gewohnt das Fenster - } -} -``` - -- `static` heißt: Die Variable gehört zur Klasse selbst. Weil `main` auch `static` ist, braucht es das hier. -- Eine solche Variable nennt man **Attribut** der Klasse. Sie lebt so lange wie das Programm, nicht nur so lange wie `main`. - -::: quiz -? Wie nennt man eine Variable, die direkt in der Klasse steht und nicht in `main`? -- [ ] Parameter -- [x] Attribut -- [ ] Zuhörer -> Ein Attribut lebt so lange wie das Programm, nicht nur so lange wie `main`. -::: - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; - -public class Zaehler { - static int anzahl = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - reset.addActionListener(e -> { - anzahl = 0; - zahl.setText("0"); - }); - - fenster.add(zahl); - fenster.add(plus); - fenster.add(reset); - fenster.setVisible(true); - } -} -``` - -`SwingConstants.CENTER` setzt den Text der Beschriftung in die Mitte. Klicke ein paarmal auf +1 und dann auf Reset. - -::: angeberwissen -Mit `zahl.setFont(new Font("SansSerif", Font.BOLD, 48));` wird die Zahl groß und fett. `Font` kommt aus `java.awt`, das du schon importiert hast. -::: - -## Spiel: Wer zählt mit? - -::: spiel zuhoerer -titel: Spiel: Wer zählt mit? -intro: Jetzt rechnen die Zuhörer mit der Variable aus der Klasse. Ludwig zeigt dir Code, Fenster und die Klicks. Welche Zahl steht am Ende da? Danach spielt Ludwig die Klicks ab. -frage: Was steht nach den Klicks in der Beschriftung? - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> Die Variable steht in der Klasse und behält ihren Wert zwischen den Klicks. Jeder Klick zählt eins hoch: 1, 2, 3. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - reset.addActionListener(e -> { - anzahl = 0; - zahl.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> Nach zwei Klicks steht 2 da. Reset setzt die Variable auf 0, und der letzte Klick zählt wieder auf 1. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> anzahl++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> Die Variable ist danach 2, aber niemand schreibt sie in die Beschriftung. Ohne `zahl.setText(…)` zeigt das Fenster weiter 0. Rechnen und Anzeigen sind zwei verschiedene Dinge. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("Klicks: 0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("Klicks: " + anzahl + 1); - }); -klicks: +1 -- Klicks: 2 -- Klicks: 1 -- [x] Klicks: 11 -> Die Klammerfalle: Java rechnet von links nach rechts. `"Klicks: " + anzahl` ergibt den Text „Klicks: 1“, und `+ 1` hängt eine weitere 1 an. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton eins = new JButton("+1"); - JButton zehn = new JButton("+10"); - eins.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - zehn.addActionListener(e -> { - anzahl += 10; - zahl.setText("" + anzahl); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Beide Zuhörer ändern dieselbe Variable: 10, dann 11, dann 21. `anzahl += 10` ist die Kurzform von `anzahl = anzahl + 10`. -::: - -## Aufgabe: Klickzähler - -Baue den Klickzähler nach und erweitere ihn: - -- ein Knopf **−1**, der eins herunterzählt, -- die Zahl soll nie unter 0 fallen. Steht sie auf 0, passiert bei −1 nichts. - -**Du bist fertig, wenn …** - -- **+1** eins hochzählt und **−1** eins herunterzählt, -- bei 0 ein Klick auf **−1** nichts ändert, -- **Reset** die Zahl wieder auf 0 setzt. - -::: ludwig -Für „nie unter 0“ brauchst du im Zuhörer von −1 ein `if`: Nur wenn `anzahl > 0` ist, wird heruntergezählt. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, warum ein Zuhörer eine Variable aus main nicht ändern darf. → Der erste Versuch -- Ich kann eine static-Variable in der Klasse anlegen. → Eine Variable für die ganze Klasse -- Ich kann zwei Knöpfe dieselbe Zahl ändern lassen. → Das ganze Programm -- Ich kann einen Zähler mit −1 bauen, der nie unter 0 fällt. → Aufgabe: Klickzähler -::: - -## Wissenstest - -::: quiz -? Warum darf der Zuhörer die Variable anzahl aus main nicht verändern? -→ Der erste Versuch -- [ ] Weil Zahlen in Swing nicht erlaubt sind -- [x] Weil der Zuhörer erst später läuft und Java Variablen aus main im Pfeil nicht verändern lässt -- [ ] Weil anzahl zu groß wird - -? Wo steht static int anzahl = 0;? -→ Eine Variable für die ganze Klasse -- [ ] In main, ganz oben -- [x] In der Klasse, außerhalb von main -- [ ] Im Zuhörer - -? Was macht SwingConstants.CENTER bei new JLabel("0", SwingConstants.CENTER)? -→ Das ganze Programm -- [x] Es setzt den Text in die Mitte der Beschriftung. -- [ ] Es setzt das Fenster in die Mitte des Bildschirms. -- [ ] Es macht die Schrift größer. -::: diff --git a/web/lessons/de/33-ampel.md b/web/lessons/de/33-ampel.md deleted file mode 100644 index 479b89a6..00000000 --- a/web/lessons/de/33-ampel.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -titel: Eine Ampel mit Farben -bereich: Fenster mit Swing -kurz: Hintergrundfarben setzen und mit einer Zustandsvariable eine Ampel weiterschalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit setOpaque und setBackground eine Beschriftung färben -- mir mit einer static-Variable einen Zustand merken -- mit BorderLayout etwas groß in die Mitte und etwas schmal nach unten setzen -- erklären, wofür FlowLayout, GridLayout und BorderLayout gut sind -- eine Ampel mit vier Phasen programmieren -::: - -## Das Ziel - -Wir bauen eine Ampel: Eine große Fläche leuchtet rot. Bei jedem Klick auf **Weiter** schaltet sie um: Rot, Grün, Gelb und wieder Rot. - -Neu sind diesmal **Farben** und ein **Zustand**: Das Programm muss sich merken, welche Farbe gerade dran ist. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Farben in Swing - -Farben stehen in der Klasse `Color` aus `java.awt`. Fertige Farben sind zum Beispiel `Color.RED`, `Color.GREEN`, `Color.YELLOW`, `Color.ORANGE` und `Color.WHITE`. - -Eine Beschriftung färbst du so: - -```java -JLabel licht = new JLabel("", SwingConstants.CENTER); -licht.setOpaque(true); -licht.setBackground(Color.RED); -``` - -- `setBackground(…)` legt die Hintergrundfarbe fest. -- `setOpaque(true)` braucht ein `JLabel` dazu. Ohne diese Zeile ist der Hintergrund durchsichtig, und die Farbe bleibt unsichtbar. - -::: ludwig -`opaque` ist englisch für „undurchsichtig“. Eine Beschriftung ist normalerweise durchsichtig wie Schrift auf einer Glasscheibe. Erst mit `setOpaque(true)` bekommt sie eine eigene Fläche, die man anmalen kann. -::: - -::: quiz -? Welche Zeile malt den Hintergrund der Beschriftung `licht` grün an? -- [ ] `licht.setText(Color.GREEN);` -- [x] `licht.setBackground(Color.GREEN);` -- [ ] `licht.setColor("grün");` -> Die Hintergrundfarbe setzt `setBackground`. Damit man sie sieht, braucht ein `JLabel` vorher `setOpaque(true)`. -::: - -## Sich die Farbe merken - -Damit die Ampel weiß, was als Nächstes kommt, merkt sie sich ihren Zustand in einer Zahl: 0 heißt Rot, 1 heißt Grün, 2 heißt Gelb. Wie beim Klickzähler aus Lektion 32 steht die Variable in der Klasse, damit der Zuhörer sie ändern darf: - -```java -static int phase = 0; -``` - -Bei jedem Klick geht die Phase eins weiter. Nach Gelb (2) kommt wieder Rot (0): - -```java -weiter.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - licht.setBackground(Color.RED); - } else if (phase == 1) { - licht.setBackground(Color.GREEN); - } else { - licht.setBackground(Color.YELLOW); - } -}); -``` - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; - -public class Ampel { - static int phase = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Ampel"); - fenster.setSize(200, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new BorderLayout()); - - JLabel licht = new JLabel("", SwingConstants.CENTER); - licht.setOpaque(true); - licht.setBackground(Color.RED); - JButton weiter = new JButton("Weiter"); - - weiter.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - licht.setBackground(Color.RED); - } else if (phase == 1) { - licht.setBackground(Color.GREEN); - } else { - licht.setBackground(Color.YELLOW); - } - }); - - fenster.add(licht, BorderLayout.CENTER); - fenster.add(weiter, BorderLayout.SOUTH); - fenster.setVisible(true); - } -} -``` - -Hier kommt ein neues Layout zum Einsatz, das **BorderLayout**. Es hat fünf Plätze: `NORTH` (oben), `SOUTH` (unten), `WEST` (links), `EAST` (rechts) und `CENTER` (Mitte). Die Mitte bekommt allen Platz, der übrig bleibt. So wird das Licht groß, und der Knopf bleibt unten schmal. - -::: angeberwissen -Das BorderLayout ist das Layout, das ein `JFrame` ohne eigenes Layout benutzt. Ein `add` ohne Platzangabe landet in `CENTER`. Deshalb lagen in Lektion 31 alle Bausteine übereinander. -::: - -::: angeberwissen -Profis schreiben das Weiterschalten in einer Zeile: `phase = (phase + 1) % 3;`. Der Rest-Operator `%` liefert den Rest beim Teilen. 3 % 3 ist 0, also beginnt es nach 2 wieder bei 0. -::: - -## Welches Layout wofür? - -Du kennst jetzt drei Layouts. Jedes ordnet die Bausteine anders an: - -| Layout | So ordnet es an | Gut für | -|---|---|---| -| `FlowLayout` (Lektion 29) | nebeneinander wie Wörter in einer Zeile, jeder Baustein so groß wie nötig | ein paar Knöpfe in einer Reihe | -| `GridLayout` (Lektion 31) | ein Gitter aus gleich großen Zellen, Zeile für Zeile gefüllt | Formulare, Tastenfelder wie beim Taschenrechner | -| `BorderLayout` (diese Lektion) | fünf Plätze: oben, unten, links, rechts und die Mitte, die den Rest bekommt | etwas Großes in der Mitte, z. B. ein Bild oder eine Anzeige, mit Knöpfen am Rand | - -Ohne `setLayout` benutzt ein Fenster das BorderLayout. Darum landet dann alles in der Mitte. - -::: ludwig -Frag dich beim Planen: Sollen alle Teile gleich groß sein? Dann GridLayout. Soll ein Teil groß sein und der Rest schmal am Rand? Dann BorderLayout. Sollen die Teile einfach ihre normale Größe behalten? Dann FlowLayout. -::: - -## Spiel: Wo landet der Knopf? - -::: spiel layout -titel: Spiel: Wo landet der Knopf? -intro: Du kennst jetzt drei Layouts und das Fenster ganz ohne Layout. Ludwig zeigt dir Code mit den Knöpfen A, B, C … Wie sieht das Fenster aus? Tippe auf das richtige Bild. -frage: Wie sieht das Fenster aus? - -runde: - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Ohne eigenes Layout landet jedes `add` in der Mitte, so groß wie das Fenster. Die drei liegen übereinander, man sieht nur den letzten: C. - -runde: - fenster.setLayout(new FlowLayout()); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> FlowLayout setzt die Knöpfe in normaler Größe nebeneinander, wie Wörter in einer Zeile, und zentriert sie. - -runde: - fenster.setLayout(new GridLayout(0, 1)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> Eine Spalte, so viele Zeilen wie nötig: alles untereinander, jede Zeile gleich hoch und so breit wie das Fenster. - -runde: - fenster.setLayout(new GridLayout(0, 2)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); - fenster.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Zwei Spalten. Die Zellen werden Zeile für Zeile gefüllt, immer erst links, dann rechts: A B, dann C D. - -runde: - fenster.setLayout(new GridLayout(2, 3)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); - fenster.add(new JButton("D")); - fenster.add(new JButton("E")); - fenster.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Erst kommen die Zeilen, dann die Spalten: 2 Zeilen mit je 3 Spalten. - -runde: - fenster.setLayout(new GridLayout(0, 2)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Zwei Spalten, drei Knöpfe: Die erste Zeile ist voll, in der zweiten steht C links, und rechts bleibt die Zelle leer. - -runde: - fenster.setLayout(new BorderLayout()); - fenster.add(new JButton("A"), BorderLayout.NORTH); - fenster.add(new JButton("B"), BorderLayout.CENTER); - fenster.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH ist oben, SOUTH unten. Die Mitte bekommt den ganzen übrigen Platz, darum ist B groß. - -runde: - fenster.setLayout(new BorderLayout()); - fenster.add(new JButton("A"), BorderLayout.WEST); - fenster.add(new JButton("B")); - fenster.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST ist links, EAST rechts. B hat keine Platzangabe und landet deshalb in CENTER. -::: - -## Aufgabe: Ampel - -Baue die Ampel nach und mach sie echter. In Deutschland leuchten nach Rot kurz Rot und Gelb zusammen. Nimm deshalb eine vierte Phase dazu: - -- 0: Rot -- 1: Rot-Gelb (nimm dafür `Color.ORANGE`) -- 2: Grün -- 3: Gelb - -Zusatz: Schreib in jeder Phase zusätzlich mit `licht.setText(…)`, was die Ampel bedeutet, zum Beispiel „Stehen“ oder „Gehen“. - -**Du bist fertig, wenn …** - -- jeder Klick die nächste Phase zeigt: Rot, Rot-Gelb (orange), Grün, Gelb, -- nach Gelb wieder Rot kommt, -- im Zusatz zu jeder Phase der passende Text steht. - -::: ludwig -Mit vier Phasen kommt nach 3 wieder 0. Pass also die Zahl in `if (phase > 2)` an. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit setOpaque und setBackground eine Beschriftung färben. → Farben in Swing -- Ich kann mir mit einer static-Variable einen Zustand merken. → Sich die Farbe merken -- Ich kann mit BorderLayout etwas groß in die Mitte und etwas schmal nach unten setzen. → Das ganze Programm -- Ich kann erklären, wofür FlowLayout, GridLayout und BorderLayout gut sind. → Welches Layout wofür? -- Ich kann eine Ampel mit vier Phasen programmieren. → Aufgabe: Ampel -::: - -## Wissenstest - -::: quiz -? Warum bleibt die Farbe ohne setOpaque(true) unsichtbar? -→ Farben in Swing -- [ ] Weil Color.RED nicht existiert -- [x] Weil eine Beschriftung sonst durchsichtig ist -- [ ] Weil das Fenster zu klein ist - -? Welcher Platz im BorderLayout bekommt den übrigen Platz? -→ Das ganze Programm -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? phase ist 2 und der Zuhörer führt phase++ und dann if (phase > 2) { phase = 0; } aus. Welchen Wert hat phase danach? -→ Sich die Farbe merken -- [x] 0 -- [ ] 2 -- [ ] 3 -> Nach phase++ ist sie 3, das ist größer als 2, also wird sie 0. -::: diff --git a/web/lessons/de/34-notenrechner.md b/web/lessons/de/34-notenrechner.md deleted file mode 100644 index f5e7eae5..00000000 --- a/web/lessons/de/34-notenrechner.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -titel: Notenrechner im Fenster -bereich: Fenster mit Swing -kurz: Punkte eingeben, mit else if die Note bestimmen und falsche Eingaben abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit else if Punkte in eine Note umrechnen -- die Note im Fenster anzeigen -- „abc“ und Punkte außerhalb von 0 bis 100 abfangen und melden -- ein Programm an den Grenzen testen, zum Beispiel mit 92 und 91 -::: - -## Das Ziel - -Ein Fenster rechnet Punkte in eine Note um: Du tippst die Punkte einer Klassenarbeit ein (0 bis 100), klickst auf **Note berechnen**, und unten steht die Note. - -Diesmal kommt kein neuer Swing-Baustein dazu. Neu ist, dass du alles Bisherige kombinierst: Textfeld, Knopf, `else if` aus Lektion 20 und try/catch aus Lektion 22. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Der Notenschlüssel - -Wir nehmen den Notenschlüssel der IHK-Prüfungen: - -| Punkte | Note | -|---|---| -| 92 bis 100 | 1 | -| 81 bis 91 | 2 | -| 67 bis 80 | 3 | -| 50 bis 66 | 4 | -| 30 bis 49 | 5 | -| 0 bis 29 | 6 | - -Mit `else if` prüfst du von oben nach unten. Die erste Bedingung, die zutrifft, gewinnt: - -```java -int note; -if (punkte >= 92) { - note = 1; -} else if (punkte >= 81) { - note = 2; -} else if (punkte >= 67) { - note = 3; -} else if (punkte >= 50) { - note = 4; -} else if (punkte >= 30) { - note = 5; -} else { - note = 6; -} -``` - -::: ludwig -Bei 85 Punkten ist `punkte >= 92` falsch, aber `punkte >= 81` wahr. Also Note 2, und die restlichen Bedingungen werden gar nicht mehr geprüft. Deshalb reicht jeweils die untere Grenze. -::: - -Du kannst diesen Teil ohne Fenster im Bereich [Code](#zeige-codelive) ausprobieren. Schreib `int punkte = 85;` davor und `System.out.println("Note: " + note);` dahinter. Das Struktogramm zeigt dir die verschachtelten Verzweigungen. - -::: quiz -? Welche Note ergibt der Schlüssel bei 29 Punkten? -- [ ] 4 -- [ ] 5 -- [x] 6 -> Alle Bedingungen sind falsch, auch `punkte >= 30`. Dann gilt der `else`-Zweig. -::: - -## Das Fenster - -```java -import javax.swing.*; -import java.awt.*; - -public class Notenrechner { - public static void main(String[] args) { - JFrame fenster = new JFrame("Notenrechner"); - fenster.setSize(260, 180); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel frage = new JLabel("Punkte (0 bis 100):"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Note berechnen"); - JLabel ergebnis = new JLabel("Note: ?"); - - knopf.addActionListener(e -> { - int punkte = Integer.parseInt(feld.getText()); - int note; - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else if (punkte >= 50) { - note = 4; - } else if (punkte >= 30) { - note = 5; - } else { - note = 6; - } - ergebnis.setText("Note: " + note); - }); - - fenster.add(frage); - fenster.add(feld); - fenster.add(knopf); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -``` - -Probiere 100, 85, 50 und 12 aus. - -## Falsche Eingaben abfangen - -Zwei Dinge können noch schiefgehen: - -1. Jemand tippt „abc“. Dann wirft `Integer.parseInt` eine `NumberFormatException`. -2. Jemand tippt 150 oder −5. Das ist zwar eine Zahl, aber keine gültige Punktzahl. - -Den ersten Fall fängst du mit try/catch ab, den zweiten mit einem `if` vor der Notenberechnung: - -```java -knopf.addActionListener(e -> { - try { - int punkte = Integer.parseInt(feld.getText()); - if (punkte < 0 || punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - // hier die Notenberechnung von oben - } - } catch (NumberFormatException fehler) { - ergebnis.setText("Das ist keine Zahl."); - } -}); -``` - -::: ludwig -`||` heißt „oder“ (Lektion 9). Die Bedingung ist wahr, wenn die Punkte zu klein **oder** zu groß sind. -::: - -## Spiel: Welche Note? - -::: spiel frage -titel: Spiel: Welche Note? -intro: Ludwig hat Notenrechner gebaut, aber nicht alle sind richtig. Rechne nach, welche Note herauskommt. Sechs Runden. - -runde: - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else { - note = 4; - } -frage: punkte ist 81. Welche Note kommt heraus? -- 1 -- [x] 2 -- 3 -> 81 >= 92 ist falsch, 81 >= 81 ist wahr. Die Grenze gehört noch zur 2. - -runde: - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else if (punkte >= 50) { - note = 4; - } else { - note = 5; - } -frage: punkte ist 66. Welche Note kommt heraus? -- 3 -- [x] 4 -- 5 -> 66 >= 67 ist knapp falsch, 66 >= 50 ist wahr. Also Note 4. - -runde: - if (punkte >= 50) { - note = 4; - } else if (punkte >= 92) { - note = 1; - } else { - note = 6; - } -frage: punkte ist 95. Welche Note kommt heraus? -- 1 -- [x] 4 -- 6 -> Die erste wahre Bedingung gewinnt. 95 >= 50 ist schon wahr, die 1 wird nie erreicht. Deshalb prüft man von den hohen Punkten nach unten. - -runde: - note = 6; - if (punkte >= 30) { - note = 5; - } - if (punkte >= 50) { - note = 4; - } -frage: punkte ist 70. Welche Note steht danach in note? -- 6 -- 5 -- [x] 4 -> Ohne `else` wird jedes `if` geprüft. Beide sind wahr, das letzte setzt die Note 4. - -runde: - // note ist schon berechnet - if (punkte < 0 || punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - ergebnis.setText("Note: " + note); - } -frage: Im Textfeld steht 100. Was zeigt das Fenster? -- [x] Note: 1 -- Bitte 0 bis 100 eingeben. -- Das ist keine Zahl. -> 100 > 100 ist falsch. 100 Punkte sind also gültig und ergeben die Note 1. - -runde: - // note ist schon berechnet - if (punkte < 0 && punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - ergebnis.setText("Note: " + note); - } -frage: Im Textfeld steht 150. Was zeigt das Fenster? -- Bitte 0 bis 100 eingeben. -- [x] eine Note, obwohl 150 ungültig ist -- Das ist keine Zahl. -> Mit `&&` müssten die Punkte gleichzeitig unter 0 und über 100 sein. Das geht nie, also warnt das Programm nie. Richtig ist `||`. -::: - -## Aufgabe: Notenrechner - -Baue den Notenrechner zusammen, mit beiden Prüfungen aus dem letzten Schritt. Teste ihn mit 92, 91, 0, 100, 101 und „zehn“. - -Zusatz: Schreib die Note zusätzlich als Wort hin, zum Beispiel „Note: 2 (gut)“. Die Wörter sind sehr gut, gut, befriedigend, ausreichend, mangelhaft und ungenügend. - -**Du bist fertig, wenn …** - -- 92 und 100 eine 1 ergeben, 91 eine 2 und 0 eine 6, -- bei 101 der Hinweis „Bitte 0 bis 100 eingeben.“ erscheint, -- bei „zehn“ ein Hinweis erscheint und das Programm weiterläuft. - -::: ludwig -Teste immer die Grenzen: 92 muss eine 1 sein, 91 eine 2. An den Grenzen stecken die meisten Fehler, zum Beispiel `>` statt `>=`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit else if Punkte in eine Note umrechnen. → Der Notenschlüssel -- Ich kann die Note im Fenster anzeigen. → Das Fenster -- Ich kann „abc“ und Punkte außerhalb von 0 bis 100 abfangen und melden. → Falsche Eingaben abfangen -- Ich kann ein Programm an den Grenzen testen, zum Beispiel mit 92 und 91. → Aufgabe: Notenrechner -::: - -## Wissenstest - -::: quiz -? Welche Note ergibt der Schlüssel bei 67 Punkten? -→ Der Notenschlüssel -- [ ] 2 -- [x] 3 -- [ ] 4 -> 67 ist die untere Grenze für die 3. - -? Warum reicht in jeder Bedingung die untere Grenze? -→ Der Notenschlüssel -- [x] Weil else if die oberen Fälle schon vorher aussortiert hat -- [ ] Weil Java obere Grenzen nicht kennt -- [ ] Weil die Punkte immer 100 sind - -? Welche Bedingung erkennt ungültige Punkte? -→ Falsche Eingaben abfangen -- [ ] punkte < 0 && punkte > 100 -- [x] punkte < 0 || punkte > 100 -- [ ] punkte >= 0 || punkte <= 100 -> Eine Zahl kann nicht gleichzeitig kleiner als 0 und größer als 100 sein, deshalb braucht es oder. -::: diff --git a/web/lessons/de/35-taschenrechner.md b/web/lessons/de/35-taschenrechner.md deleted file mode 100644 index d281d9e7..00000000 --- a/web/lessons/de/35-taschenrechner.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -titel: Ein Taschenrechner -bereich: Fenster mit Swing -kurz: Zwei Spalten mit GridLayout, vier Rechenknöpfe und die Division durch 0 abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit GridLayout(0, 2) zwei Spalten bauen -- erklären, warum "" + (a + b) Klammern braucht -- alle vier Rechenknöpfe programmieren -- einen Rechner bauen, der bei 0 und bei „abc“ nicht abstürzt -::: - -## Das Ziel - -Wir bauen einen kleinen Taschenrechner: zwei Textfelder für die Zahlen, vier Knöpfe **+**, **-**, **\*** und **/** und eine Zeile für das Ergebnis. - -Neu sind diesmal **zwei Spalten** im GridLayout und **mehrere Knöpfe**, die alle mit denselben Textfeldern rechnen. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Zwei Spalten - -Bisher stand mit `GridLayout(0, 1)` alles untereinander. Mit `GridLayout(0, 2)` gibt es zwei Spalten. Die Bausteine füllen die Zellen in der Reihenfolge der `add`-Zeilen, immer erst links, dann rechts: - -| links | rechts | -|---|---| -| Erste Zahl: | Textfeld | -| Zweite Zahl: | Textfeld | -| + | - | -| \* | / | -| Ergebnis: | ? | - -Die Beschriftungen links brauchst du später nicht mehr. Du kannst sie deshalb direkt in `add` bauen, ohne Variable: - -```java -fenster.add(new JLabel("Erste Zahl:")); -fenster.add(feld1); -``` - -## Das Fenster mit dem ersten Knopf - -```java -import javax.swing.*; -import java.awt.*; - -public class Rechner { - public static void main(String[] args) { - JFrame fenster = new JFrame("Rechner"); - fenster.setSize(280, 220); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 2)); - - JTextField feld1 = new JTextField(); - JTextField feld2 = new JTextField(); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - JButton mal = new JButton("*"); - JButton geteilt = new JButton("/"); - JLabel ergebnis = new JLabel("?"); - - plus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a + b)); - }); - - fenster.add(new JLabel("Erste Zahl:")); - fenster.add(feld1); - fenster.add(new JLabel("Zweite Zahl:")); - fenster.add(feld2); - fenster.add(plus); - fenster.add(minus); - fenster.add(mal); - fenster.add(geteilt); - fenster.add(new JLabel("Ergebnis:")); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -``` - -Tippe 3 und 4 ein und klicke auf +. Unten steht 7. - -::: ludwig -Achte auf die Klammern in `"" + (a + b)`. Ohne sie rechnet Java von links nach rechts: `"" + a` ergibt den Text „3“, und `"3" + b` hängt die 4 hinten an. Heraus kommt „34“ statt 7. Die Klammer sorgt dafür, dass zuerst gerechnet wird. -::: - -## Die anderen drei Knöpfe - -Die Knöpfe -, \* und / funktionieren genauso. Nur das Rechenzeichen in der letzten Zeile ändert sich: - -```java -minus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a - b)); -}); -``` - -Bei / gibt es zwei Besonderheiten: - -- Mit `int` schneidet Java beim Teilen die Nachkommastellen ab. 7 / 2 ergibt 3. -- Bei 0 als zweiter Zahl wirft Java eine `ArithmeticException`, wie bei der Aufgabe „Sicher teilen“ in Lektion 22. - -## Division durch 0 abfangen - -```java -geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } -}); -``` - -::: angeberwissen -Mit `double` und `Double.parseDouble(…)` gibt es Nachkommastellen: 7 / 2 ergibt 3.5. Dafür wirft Java bei Kommazahlen keine Exception beim Teilen durch 0. Das Ergebnis heißt dann `Infinity`, also „unendlich“. -::: - -::: quiz -? Was zeigt der Rechner bei 8 geteilt durch 0? -- [ ] 0 -- [ ] Infinity -- [x] Nicht durch 0! -> Mit `int` wirft `a / b` eine `ArithmeticException`. Das `catch` fängt sie ab und zeigt den Hinweis. -::: - -## Eine eigene Methode - -Das steht nicht im Lehrplan, macht den Code aber kürzer. - -::: angeberwissen -Jeder Zuhörer liest dieselben zwei Felder. Diese Wiederholung kannst du in eine eigene Methode auslagern, ein Unterprogramm wie in Lektion 18. Sie steht in der Klasse neben `main`: - -`static int zahl(JTextField feld) { return Integer.parseInt(feld.getText()); }` - -Im Zuhörer heißt es dann nur noch `ergebnis.setText("" + (zahl(feld1) + zahl(feld2)));`. -::: - -## Spiel: Was zeigt der Rechner? - -::: spiel frage -titel: Spiel: Was zeigt der Rechner? -intro: Ludwig hat am Taschenrechner geschraubt. Lies den Zuhörer und sag vorher, was im Ergebnis steht. Sechs Runden. - -runde: - plus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + a + b); - }); -frage: Du tippst 3 und 4 und klickst auf +. Was steht im Ergebnis? -- 7 -- [x] 34 -- 12 -> Ohne Klammern rechnet Java von links nach rechts: `"" + 3` ist der Text „3“, und `+ 4` hängt die 4 an. - -runde: - mal.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + a * b); - }); -frage: Du tippst 3 und 4 und klickst auf *. Was steht im Ergebnis? -- 34 -- [x] 12 -- 7 -> Punkt vor Strich gilt auch hier: Erst rechnet Java 3 * 4, dann hängt es die 12 an den Text. Beim Plus fehlt dieser Vorrang, darum braucht es dort die Klammern. - -runde: - geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a / b)); - }); -frage: Du tippst 7 und 2 und klickst auf /. Was steht im Ergebnis? -- 3.5 -- [x] 3 -- 4 -> Mit `int` schneidet Java die Nachkommastellen ab. Es wird nicht gerundet. - -runde: - geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } - }); -frage: Du tippst 8 und 0 und klickst auf /. Was steht im Ergebnis? -- 0 -- [x] Nicht durch 0! -- Infinity -> Bei `int` wirft das Teilen durch 0 eine ArithmeticException, und `catch` schreibt den Hinweis. - -runde: - geteilt.addActionListener(e -> { - double a = Double.parseDouble(feld1.getText()); - double b = Double.parseDouble(feld2.getText()); - ergebnis.setText("" + (a / b)); - }); -frage: Du tippst 7 und 2 und klickst auf /. Was steht im Ergebnis? -- 3 -- [x] 3.5 -- 3.0 -> Mit `double` bleiben die Nachkommastellen erhalten. - -runde: - geteilt.addActionListener(e -> { - double a = Double.parseDouble(feld1.getText()); - double b = Double.parseDouble(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } - }); -frage: Du tippst 8 und 0 und klickst auf /. Was steht im Ergebnis? -- Nicht durch 0! -- [x] Infinity -- 0.0 -> Bei `double` gibt es keine Exception. Das Ergebnis ist `Infinity`, also „unendlich“, und das `catch` kommt nie dran. -::: - -## Aufgabe: Taschenrechner - -Baue den Rechner fertig: - -- alle vier Knöpfe rechnen, -- / meldet „Nicht durch 0!“ statt abzustürzen, -- steht in einem Feld „abc“ oder nichts, erscheint „Bitte zwei Zahlen eingeben“. - -Zusatz: Ein fünfter Knopf **C** leert beide Felder und setzt das Ergebnis wieder auf „?“. - -**Du bist fertig, wenn …** - -- 7 und 2 bei +, −, * und / die Ergebnisse 9, 5, 14 und 3 zeigen, -- 7 / 0 „Nicht durch 0!“ meldet, -- bei „abc“ oder einem leeren Feld „Bitte zwei Zahlen eingeben“ erscheint und nichts abstürzt. - -::: ludwig -Für „abc“ brauchst du in jedem Zuhörer ein try/catch mit `NumberFormatException`. Hinter einem `try` dürfen auch zwei `catch` stehen, einer für `NumberFormatException` und einer für `ArithmeticException`. Ein leeres Feld liefert übrigens den Text `""`, und auch der ist keine Zahl. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit GridLayout(0, 2) zwei Spalten bauen. → Zwei Spalten -- Ich kann erklären, warum "" + (a + b) Klammern braucht. → Das Fenster mit dem ersten Knopf -- Ich kann alle vier Rechenknöpfe programmieren. → Die anderen drei Knöpfe -- Ich kann einen Rechner bauen, der bei 0 und bei „abc“ nicht abstürzt. → Aufgabe: Taschenrechner -::: - -## Wissenstest - -::: quiz -? a ist 3 und b ist 4. Was ergibt "" + a + b? -→ Das Fenster mit dem ersten Knopf -- [ ] 7 -- [x] 34 -- [ ] Einen Fehler -> Java rechnet von links nach rechts: Erst entsteht der Text "3", dann wird die 4 angehängt. - -? Was ergibt 7 / 2 mit int? -→ Die anderen drei Knöpfe -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? In welcher Reihenfolge füllt GridLayout(0, 2) die Zellen? -→ Zwei Spalten -- [x] Zeile für Zeile, jeweils erst links, dann rechts -- [ ] Spalte für Spalte, erst ganz links von oben nach unten -- [ ] Zufällig -::: diff --git a/web/lessons/de/36-zahlenraten.md b/web/lessons/de/36-zahlenraten.md deleted file mode 100644 index f315f56e..00000000 --- a/web/lessons/de/36-zahlenraten.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -titel: Zahlenraten -bereich: Fenster mit Swing -kurz: Ein Spiel mit Zufallszahl, Versuchszähler und einem Knopf, der sich am Ende abschaltet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit Math.random eine ganze Zufallszahl von 1 bis 100 erzeugen -- entscheiden, welche Variablen in die Klasse gehören -- einen Knopf mit setEnabled abschalten -- ein Ratespiel mit einem Knopf „Neues Spiel“ bauen -::: - -## Das Ziel - -Jetzt wird gespielt: Der Computer denkt sich eine Zahl von 1 bis 100 aus. Du rätst, und das Fenster sagt dir „zu klein“ oder „zu groß“. Hast du sie gefunden, verrät es dir, wie viele Versuche du gebraucht hast. - -Neu sind diesmal **Zufallszahlen** und ein Knopf, der sich am Ende **abschaltet**. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Eine Zufallszahl - -`Math.random()` liefert eine zufällige Kommazahl von 0 bis knapp unter 1, zum Beispiel 0.4173. Daraus wird in drei Schritten eine ganze Zahl von 1 bis 100: - -```java -int geheim = (int) (Math.random() * 100) + 1; -``` - -| Schritt | Beispiel | -|---|---| -| `Math.random()` | 0.4173 | -| `* 100` | 41.73 | -| `(int)` schneidet die Nachkommastellen ab | 41 | -| `+ 1` | 42 | - -Ohne `+ 1` käme 0 bis 99 heraus. - -Probiere es im Bereich [Code](#zeige-codelive) aus: `int geheim = (int) (Math.random() * 100) + 1;` und `System.out.println(geheim);`. Jedes Ausführen liefert eine andere Zahl. - -::: angeberwissen -Computer können eigentlich gar nicht würfeln. `Math.random()` rechnet mit einer Formel eine lange Folge von Zahlen aus, die nur zufällig **aussehen**. Man nennt sie Pseudozufallszahlen. Für Spiele reicht das völlig. -::: - -## Was sich das Spiel merkt - -Zwei Dinge muss sich das Spiel über alle Klicks hinweg merken: die geheime Zahl und die Zahl der Versuche. Wie beim Klickzähler aus Lektion 32 stehen beide in der Klasse: - -```java -static int geheim = (int) (Math.random() * 100) + 1; -static int versuche = 0; -``` - -::: quiz -? Warum stehen `geheim` und `versuche` in der Klasse und nicht in `main`? -- [ ] Weil `Math.random()` nur in der Klasse funktioniert -- [x] Weil sie über alle Klicks erhalten bleiben und der Zuhörer `versuche` ändern muss -- [ ] Weil `main` keine Zahlen speichern kann -> Wie beim Klickzähler: Variablen aus `main` darf der Zuhörer nicht verändern. -::: - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; - -public class Zahlenraten { - static int geheim = (int) (Math.random() * 100) + 1; - static int versuche = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahlenraten"); - fenster.setSize(320, 180); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel hinweis = new JLabel("Ich denke mir eine Zahl von 1 bis 100."); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Raten"); - - knopf.addActionListener(e -> { - int tipp = Integer.parseInt(feld.getText()); - versuche++; - if (tipp < geheim) { - hinweis.setText(tipp + " ist zu klein."); - } else if (tipp > geheim) { - hinweis.setText(tipp + " ist zu groß."); - } else { - hinweis.setText("Richtig! Du hast " + versuche + " Versuche gebraucht."); - knopf.setEnabled(false); - } - feld.setText(""); - }); - - fenster.add(hinweis); - fenster.add(feld); - fenster.add(knopf); - fenster.setVisible(true); - } -} -``` - -- `feld.setText("")` leert das Textfeld nach jedem Tipp, damit du gleich den nächsten eintippen kannst. -- `knopf.setEnabled(false)` schaltet den Knopf ab. Er wird grau und lässt sich nicht mehr klicken. Das Spiel ist vorbei. - -::: ludwig -Mit `setEnabled(true)` schaltest du einen Knopf wieder ein. So kannst du zum Beispiel einen Knopf erst freigeben, wenn etwas eingegeben wurde. -::: - -## Mit 7 Versuchen gewinnen - -::: angeberwissen -Wer geschickt rät, braucht nie mehr als 7 Versuche. Rate immer die Mitte des Bereichs, der noch übrig ist: erst 50, dann 25 oder 75 und so weiter. Jeder Tipp halbiert den Bereich: 100, 50, 25, 13, 7, 4, 2, 1. Das ist die **binäre Suche** aus Lektion 19. Weil 2 hoch 7 = 128 größer als 100 ist, reichen 7 Tipps. -::: - -## Aufgabe: Zahlenraten - -Baue das Spiel nach und mach es besser: - -- Eine Eingabe wie „abc“ zählt nicht als Versuch und bringt den Hinweis „Bitte eine Zahl eingeben“. -- Ein zweiter Knopf **Neues Spiel** denkt sich eine neue Zahl aus, setzt die Versuche auf 0, schaltet den Knopf Raten wieder ein und setzt den Hinweis zurück. - -Zusatz: Nach 7 Fehlversuchen ist das Spiel verloren. Das Fenster verrät dann die geheime Zahl. - -**Du bist fertig, wenn …** - -- du bei jedem falschen Tipp „zu klein“ oder „zu groß“ siehst, -- „abc“ den Hinweis „Bitte eine Zahl eingeben“ bringt und die Versuche dabei gleich bleiben, -- **Neues Spiel** die Versuche auf 0 setzt, den Knopf Raten wieder einschaltet und den Hinweis zurücksetzt. - -::: ludwig -Für „zählt nicht als Versuch“ muss `versuche++` **hinter** `Integer.parseInt` stehen, beides im `try`-Block. Wirft `parseInt` eine Exception, wird die Zeile mit `versuche++` übersprungen. -::: - -## Spiel: Zu klein oder zu groß? - -::: spiel frage -titel: Spiel: Zu klein oder zu groß? -intro: Ludwig spielt Zahlenraten. Lies den Code und sag vorher, was passiert. Sieben Runden. - -runde: - // geheim ist 42 - if (tipp < geheim) { - hinweis.setText(tipp + " ist zu klein."); - } else if (tipp > geheim) { - hinweis.setText(tipp + " ist zu groß."); - } else { - hinweis.setText("Richtig!"); - } -frage: Ludwig tippt 50. Was steht im Hinweis? -- 50 ist zu klein. -- [x] 50 ist zu groß. -- Richtig! -> 50 ist größer als 42. - -runde: -frage: Die Zahl liegt von 1 bis 100. 50 war zu groß, 25 war zu klein. Welche Zahl rät Ludwig klug als Nächstes? -- 26 -- [x] 37 -- 49 -> Übrig sind 26 bis 49. Die Mitte davon ist 37 (oder 38). So halbiert jeder Tipp den Bereich. - -runde: - int wurf = (int) (Math.random() * 6) + 1; -frage: Welche Zahlen kann `wurf` haben? -- 0 bis 6 -- [x] 1 bis 6 -- 1 bis 7 -> `Math.random() * 6` liegt von 0 bis knapp unter 6. `(int)` macht 0 bis 5 daraus, `+ 1` dann 1 bis 6. Ein Würfel! - -runde: - int zahl = (int) (Math.random() * 10); -frage: Welche Zahlen kann `zahl` haben? -- [x] 0 bis 9 -- 1 bis 10 -- 0 bis 10 -> Ohne `+ 1` fängt es bei 0 an, und die 10 wird nie erreicht. - -runde: - // geheim ist 42 - versuche++; - if (tipp == geheim) { - hinweis.setText("Richtig! Du hast " + versuche + " Versuche gebraucht."); - } -frage: Ludwig tippt 50, dann 25, dann 42. Was steht am Ende im Hinweis? -- Richtig! Du hast 2 Versuche gebraucht. -- [x] Richtig! Du hast 3 Versuche gebraucht. -- Richtig! Du hast 42 Versuche gebraucht. -> `versuche++` zählt bei jedem Klick hoch, auch beim Treffer. - -runde: - knopf.setEnabled(false); -frage: Ludwig hat die Zahl gefunden und klickt noch einmal auf **Raten**. Was passiert? -- Das Spiel beginnt von vorn. -- Es zählt einen Versuch mehr. -- [x] Nichts, der Knopf ist grau und lässt sich nicht klicken. -> `setEnabled(false)` schaltet den Knopf ab. - -runde: -frage: Die Zahl liegt jetzt von 1 bis 1000. Wie viele Tipps braucht man mit der binären Suche höchstens? -- 7 -- [x] 10 -- 500 -> 2 hoch 10 = 1024 ist größer als 1000. Zehn Halbierungen reichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit Math.random eine ganze Zufallszahl von 1 bis 100 erzeugen. → Eine Zufallszahl -- Ich kann entscheiden, welche Variablen in die Klasse gehören. → Was sich das Spiel merkt -- Ich kann einen Knopf mit setEnabled abschalten. → Das ganze Programm -- Ich kann ein Ratespiel mit einem Knopf „Neues Spiel“ bauen. → Aufgabe: Zahlenraten -::: - -## Wissenstest - -::: quiz -? Welche Zahlen liefert (int) (Math.random() * 100) + 1? -→ Eine Zufallszahl -- [ ] 0 bis 100 -- [x] 1 bis 100 -- [ ] 1 bis 101 - -? Was macht knopf.setEnabled(false)? -→ Das ganze Programm -- [ ] Es löscht den Knopf aus dem Fenster. -- [x] Der Knopf wird grau und lässt sich nicht mehr klicken. -- [ ] Es ändert die Beschriftung des Knopfs. - -? Wie viele Versuche braucht man mit der binären Suche höchstens bei 1 bis 100? -→ Aufgabe: Zahlenraten -- [ ] 50 -- [ ] 10 -- [x] 7 -> Jeder Tipp halbiert den Bereich, und 2 hoch 7 = 128 ist größer als 100. -::: diff --git a/web/lessons/de/37-viele-knoepfe-ein-zuhoerer.md b/web/lessons/de/37-viele-knoepfe-ein-zuhoerer.md deleted file mode 100644 index ecdc2b58..00000000 --- a/web/lessons/de/37-viele-knoepfe-ein-zuhoerer.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -titel: Viele Knöpfe, ein Zuhörer -bereich: Fenster mit Swing -kurz: Ein Zuhörer für viele Knöpfe, mit getActionCommand und getSource herausfinden, welcher Knopf geklickt wurde. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Zuhörer in einer Variable vom Typ ActionListener speichern und bei mehreren Knöpfen anmelden -- erklären, was getActionCommand und getSource liefern -- Knöpfe in einer Schleife auf ein JPanel setzen -- ein Zahlenschloss bauen, das sich nur mit dem richtigen Code öffnet -::: - -## Das Ziel - -Seit der Sache mit dem Kuchen will Ludwig seinen Stall abschließen. Er baut ein **Zahlenschloss**: neun Zifferntasten, eine Null, **C** zum Löschen und **OK** zum Prüfen. Nur wer 1234 eintippt, bekommt „Tor offen!“. - -Das sind zwölf Knöpfe. Bisher hatte jeder Knopf seinen eigenen Zuhörer, wie beim Taschenrechner in Lektion 35. Heute lernst du, wie **ein** Zuhörer für alle Knöpfe reicht. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Neun fast gleiche Zuhörer - -So sähe es mit einem Zuhörer pro Taste aus: - -```java -eins.addActionListener(e -> anzeige.setText(anzeige.getText() + "1")); -zwei.addActionListener(e -> anzeige.setText(anzeige.getText() + "2")); -drei.addActionListener(e -> anzeige.setText(anzeige.getText() + "3")); -// ... und so weiter bis 9 -``` - -Die Zeilen unterscheiden sich nur in der Ziffer. Wer eine Kleinigkeit ändern will, muss es neunmal tun und vergisst bestimmt eine Zeile. - -## Ein Zuhörer als Variable - -Ein Zuhörer kann auch in einer **Variable** stehen. Ihr Datentyp ist `ActionListener`, der Vertrag aus Lektion 30. Danach meldest du denselben Zuhörer bei mehreren Knöpfen an: - -```java -ActionListener ziffer = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - -eins.addActionListener(ziffer); -zwei.addActionListener(ziffer); -drei.addActionListener(ziffer); -``` - -`ActionListener` steht im Paket `java.awt.event`. Du brauchst deshalb oben `import java.awt.event.*;`. - -Jetzt gibt es den Code nur einmal. Aber woher weiß der Zuhörer, welche Ziffer er anhängen soll? - -## Wer hat geklickt? - -Das `e` vor dem Pfeil ist das **Ereignis**, ein Objekt vom Typ `ActionEvent`. Der Knopf gibt es bei jedem Klick mit, und darin steht, was passiert ist: - -| Aufruf | Liefert | Beispiel | -|---|---|---| -| `e.getActionCommand()` | die Beschriftung des geklickten Knopfs, als Text | `"7"` | -| `e.getSource()` | den geklickten Knopf selbst | der Knopf `ok` | - -- `getActionCommand()` ist praktisch, wenn die Beschriftung schon sagt, was zu tun ist, wie bei den Ziffern. -- `getSource()` vergleichst du mit `==` mit einem Knopf: `if (e.getSource() == ok)`. Hier ist `==` richtig, denn es geht um genau dieses eine Objekt, nicht um einen Text. - -::: ludwig -Texte vergleichst du mit `equals`, Knöpfe mit `==`. Willst du über die Beschriftung entscheiden, schreibst du `e.getActionCommand().equals("OK")`. Das geht auch, bricht aber, sobald jemand die Beschriftung in „Öffnen“ ändert. `e.getSource() == ok` bleibt richtig. -::: - -## Knöpfe in einer Schleife - -Mit einem gemeinsamen Zuhörer kannst du die Zifferntasten sogar in einer Schleife bauen. Damit sie ordentlich im Raster stehen, kommen sie auf ein **JPanel**. Ein JPanel ist eine Fläche im Fenster mit einem eigenen Layout: - -```java -JPanel tasten = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton ziffer = new JButton("" + i); - ziffer.addActionListener(taste); - tasten.add(ziffer); -} -``` - -- `"" + i` macht aus der Zahl `i` den Text für die Beschriftung. -- In jedem Durchlauf entsteht ein neuer Knopf. Alle bekommen denselben Zuhörer `taste`. -- `fenster.add(tasten, BorderLayout.CENTER)` setzt die ganze Fläche mit allen Tasten ins Fenster. - -::: quiz -? Wie viele Knöpfe und wie viele Zuhörer entstehen in dieser Schleife? -- [ ] 9 Knöpfe und 9 Zuhörer -- [x] 9 Knöpfe und 1 Zuhörer -- [ ] 1 Knopf und 9 Zuhörer -> In jedem Durchlauf kommt ein neuer Knopf dazu. Alle bekommen denselben Zuhörer `taste`. -::: - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Zahlenschloss { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahlenschloss"); - fenster.setSize(240, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new BorderLayout()); - - JLabel anzeige = new JLabel("", SwingConstants.CENTER); - JPanel tasten = new JPanel(new GridLayout(0, 3)); - JButton loeschen = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener taste = e -> { - if (e.getSource() == loeschen) { - anzeige.setText(""); - } else if (e.getSource() == ok) { - if (anzeige.getText().equals("1234")) { - anzeige.setText("Tor offen!"); - } else { - anzeige.setText("Falsch"); - } - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton ziffer = new JButton("" + i); - ziffer.addActionListener(taste); - tasten.add(ziffer); - } - JButton nullTaste = new JButton("0"); - nullTaste.addActionListener(taste); - loeschen.addActionListener(taste); - ok.addActionListener(taste); - tasten.add(loeschen); - tasten.add(nullTaste); - tasten.add(ok); - - fenster.add(anzeige, BorderLayout.NORTH); - fenster.add(tasten, BorderLayout.CENTER); - fenster.setVisible(true); - } -} -``` - -- `loeschen` und `ok` werden **vor** dem Zuhörer angelegt, denn der Zuhörer vergleicht mit ihnen. -- Der Zuhörer prüft erst die beiden besonderen Knöpfe. Alle anderen sind Ziffern und hängen ihre Beschriftung an. -- Die Null heißt `nullTaste`, weil `null` in Java schon ein Wort mit fester Bedeutung ist. - -::: angeberwissen -Das Zahlenfeld am Telefon hat die 1 oben links, das am Taschenrechner und an der Computertastatur hat die 7 oben links. Warum? Als die Tastentelefone kamen, gab es Tests mit Leuten, die damit wählen sollten. Mit der 1 oben ging es schneller, und Rechenmaschinen hatten ihre Anordnung da schon längst. Ludwigs Schloss macht es wie das Telefon. -::: - -## Spiel: Wer hat geklickt? - -::: spiel zuhoerer -titel: Spiel: Wer hat geklickt? -intro: In jeder Runde hört **ein** Zuhörer an mehreren Knöpfen. Ludwig zeigt dir Code, Fenster und die Klicks. Was steht am Ende in der Anzeige? Danach spielt Ludwig die Klicks ab. -frage: Was steht nach den Klicks in der Anzeige? - -runde: - JFrame fenster = new JFrame("Buchstaben"); - JLabel anzeige = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> Ein Zuhörer, zwei Knöpfe. `e.getActionCommand()` liefert jedes Mal die Beschriftung des geklickten Knopfs, und sie wird hinten angehängt. - -runde: - JFrame fenster = new JFrame("Zähler"); - static int zahl = 0; - JLabel anzeige = new JLabel("0"); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == plus) { - zahl++; - } else { - zahl--; - } - anzeige.setText("" + zahl); - }; - plus.addActionListener(z); - minus.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> `e.getSource()` sagt, welcher Knopf es war. Zweimal plus, einmal minus: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame fenster = new JFrame("Buchstaben"); - JLabel anzeige = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> Der Zuhörer ist nur bei A und B angemeldet. Beim Klick auf C hört niemand zu. - -runde: - JFrame fenster = new JFrame("Tasten"); - JLabel anzeige = new JLabel(""); - JButton eins = new JButton("1"); - JButton zwei = new JButton("2"); - JButton weg = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - anzeige.setText(""); - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - eins.addActionListener(z); - zwei.addActionListener(z); - weg.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> Nach 1 und 2 steht „12“ da. C löscht alles, und die letzte 1 steht allein. - -runde: - JFrame fenster = new JFrame("Schloss"); - JLabel anzeige = new JLabel(""); - JButton vier = new JButton("4"); - JButton zwei = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (anzeige.getText().equals("42")) { - anzeige.setText("Tor offen!"); - } else { - anzeige.setText("Falsch"); - } - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - vier.addActionListener(z); - zwei.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Tor offen! -- [x] Falsch -- 24OK -> Eingetippt ist „24“, das Geheimnis ist aber „42“. Die Reihenfolge der Klicks zählt. -::: - -## Aufgabe: Zahlenschloss - -Baue das Zahlenschloss nach und probiere es aus. - -Dann mach es besser: - -- Nach drei falschen Versuchen schaltet sich **OK** ab, wie der Knopf beim Zahlenraten in Lektion 36. Zähle die Versuche in einer `static int`-Variable in der Klasse. -- Zusatz: Die Anzeige zeigt `*` statt der Ziffern. Merke dir die echte Eingabe in einer `static String eingabe = "";` und hänge an die Anzeige nur einen Stern an. - -**Du bist fertig, wenn …** - -- der richtige Code das Schloss öffnet und ein falscher nicht, -- nach drei falschen Versuchen **OK** ausgeschaltet ist, -- im Zusatz die Anzeige nur Sterne zeigt, der Code aber trotzdem geprüft wird. - -::: ludwig -Zähle im Zweig für **OK** bei jedem falschen Code `versuche++` und prüfe danach `if (versuche >= 3)`. Dann schaltet `ok.setEnabled(false)` den Knopf ab, wie beim Zahlenraten. Für die Sterne: `eingabe = eingabe + e.getActionCommand();` und `anzeige.setText(anzeige.getText() + "*");`. Verglichen wird dann `eingabe`, nicht der Text der Anzeige. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Zuhörer in einer Variable vom Typ ActionListener speichern und bei mehreren Knöpfen anmelden. → Ein Zuhörer als Variable -- Ich kann erklären, was getActionCommand und getSource liefern. → Wer hat geklickt? -- Ich kann Knöpfe in einer Schleife auf ein JPanel setzen. → Knöpfe in einer Schleife -- Ich kann ein Zahlenschloss bauen, das sich nur mit dem richtigen Code öffnet. → Aufgabe: Zahlenschloss -::: - -## Wissenstest - -::: quiz -? Was liefert e.getActionCommand() bei einem Klick auf den Knopf new JButton("7")? -→ Wer hat geklickt? -- [ ] die Zahl 7 -- [x] den Text "7" -- [ ] den Knopf selbst - -? Wie prüfst du, ob der Knopf ok geklickt wurde? -→ Wer hat geklickt? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource liefert den Knopf selbst, und den vergleichst du mit ==. - -? Warum steht ein Zuhörer in einer Variable? -→ Ein Zuhörer als Variable -- [ ] Damit er schneller läuft. -- [x] Damit man ihn bei mehreren Knöpfen anmelden kann und den Code nur einmal schreibt. -- [ ] Weil Lambdas sonst nicht erlaubt sind. - -? Ordne zu. -→ Wer hat geklickt? -= ActionListener -> Datentyp eines Zuhörers -= ActionEvent -> das Ereignis e mit den Infos zum Klick -= JPanel -> eine Fläche mit eigenem Layout -::: diff --git a/web/lessons/de/38-innere-klassen.md b/web/lessons/de/38-innere-klassen.md deleted file mode 100644 index d9b376b0..00000000 --- a/web/lessons/de/38-innere-klassen.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Innere Klassen -bereich: Fenster mit Swing -kurz: Einen Zuhörer als benannte innere Klasse, als anonyme Klasse und als Lambda schreiben und wissen, wer was sehen darf. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Zuhörer als benannte innere Klasse schreiben -- einen Zuhörer als anonyme Klasse schreiben -- erklären, was beim Lambda weggelassen wird -- erklären, welche Schreibweise welche Variablen sieht -- einen Zähler mit drei Knöpfen in drei Schreibweisen bauen -::: - -## Das Ziel - -Den Klickzähler aus Lektion 32 kennst du schon. Heute schreibst du seinen Zuhörer auf **drei Arten**, die alle genau dasselbe tun: - -1. als **benannte innere Klasse**, wie man es vor Java 8 meistens gemacht hat, -2. als **anonyme Klasse**, die du aus Lektion 30 („ActionListener ist ein Interface“) kennst, -3. als **Lambda** mit dem Pfeil, so wie bisher. - -In fremdem Code, in Büchern und im Internet triffst du alle drei Schreibweisen. Nach dieser Lektion erkennst du sie. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Erinnerung: der Vertrag - -Ein Zuhörer ist alles, was den Vertrag `ActionListener` erfüllt. Darin steht genau eine Methode: - -``` -public void actionPerformed(ActionEvent e) -``` - -Der Knopf ruft sie bei jedem Klick auf. Die drei Schreibweisen sind drei Wege, diese eine Methode zu liefern. - -## 1. Die benannte innere Klasse - -Eine **innere Klasse** steht innerhalb einer anderen Klasse. Sie hat einen Namen, hier `Plus`, und erfüllt den Vertrag mit `implements ActionListener`: - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Zaehler { - static int anzahl = 0; - static JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - static class Plus implements ActionListener { - public void actionPerformed(ActionEvent e) { - anzahl++; - zahl.setText("" + anzahl); - } - } - - public static void main(String[] args) { - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - JButton nochmal = new JButton("Auch +1"); - plus.addActionListener(new Plus()); - nochmal.addActionListener(new Plus()); - - fenster.add(zahl); - fenster.add(plus); - fenster.add(nochmal); - fenster.setVisible(true); - } -} -``` - -- `new Plus()` erzeugt ein Objekt der Klasse `Plus`. Das ist der Zuhörer, den der Knopf bekommt. -- Weil die Klasse einen Namen hat, kannst du sie bei mehreren Knöpfen benutzen, hier bei `plus` und `nochmal`. -- Die Klasse steht **außerhalb** von `main`. Darum sieht sie nur, was in der Klasse `Zaehler` steht: `anzahl` und `zahl`. Deshalb ist `zahl` diesmal eine Variable der Klasse und nicht von `main`. -- `static class` brauchst du, weil `main` static ist. Ohne `static` meldet javac „non-static variable this cannot be referenced from a static context“. - -## 2. Die anonyme Klasse - -Brauchst du den Zuhörer nur an einer Stelle, kannst du die Klasse direkt dort schreiben, wo das Objekt gebraucht wird. Sie bekommt dann keinen Namen: - -```java -plus.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - anzahl++; - zahl.setText("" + anzahl); - } -}); -``` - -- `new ActionListener() { … }` heißt: „ein neues Objekt, das den Vertrag ActionListener erfüllt, und zwar so: …“. -- Am Ende steht `});`: die geschweifte Klammer schließt die Klasse, die runde den Aufruf von `addActionListener`. -- Die anonyme Klasse steht **in** `main`. Sie sieht deshalb auch die Variablen von `main`, solange diese sich nicht mehr ändern. - -::: quiz -? Was schließt `});` am Ende der anonymen Klasse? -- [x] `}` schließt die Klasse, `)` den Aufruf von `addActionListener`. -- [ ] `}` schließt `main`, `)` die Klasse. -- [ ] Beides schließt die Methode `actionPerformed`. -> Die Methode `actionPerformed` endet schon eine Zeile davor mit ihrer eigenen `}`. -::: - -## 3. Das Lambda - -Das Lambda ist die Kurzform der anonymen Klasse, seit Java 8: - -```java -plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); -}); -``` - -Weggelassen wird alles, was Java sowieso weiß: `new ActionListener()`, der Name `actionPerformed`, `public void` und der Typ `ActionEvent`. Übrig bleiben der Parameter `e`, der Pfeil und der Rumpf. Das geht nur, weil der Vertrag genau **eine** Methode hat. - -## Die drei im Vergleich - -| | benannte innere Klasse | anonyme Klasse | Lambda | -|---|---|---|---| -| hat einen Namen | ja, z. B. `Plus` | nein | nein | -| steht | in der Klasse, außerhalb von `main` | direkt beim Knopf | direkt beim Knopf | -| für mehrere Knöpfe | ja, `new Plus()` | nein | ja, in einer Variable (Lektion 37) | -| sieht Variablen von `main` | nein | ja, wenn sie sich nicht ändern | ja, wenn sie sich nicht ändern | -| Länge | am längsten | mittel | am kürzesten | - -::: ludwig -Wenn sich eine Variable von `main` im Zuhörer ändern soll, wie `anzahl++`, muss sie in die Klasse, egal welche Schreibweise du nimmst. Das war das Problem aus Lektion 32. -::: - -::: angeberwissen -Schau nach dem Übersetzen in den Ordner mit den `.class`-Dateien. Für jede Klasse legt javac eine Datei an: `Zaehler.class`, für die innere Klasse `Zaehler$Plus.class` und für die anonyme Klasse `Zaehler$1.class`. Weil sie keinen Namen hat, bekommt sie eine Nummer. Für ein Lambda gibt es keine eigene Datei, Java baut es erst beim Start. -::: - -## Spiel: Welche Schreibweise? - -::: spiel frage -titel: Spiel: Welche Schreibweise? -intro: Ludwig zeigt dir Zuhörer aus fremden Programmen. Welche Schreibweise ist das? Sechs Runden. -frage: Welche Schreibweise ist das? -antworten: benannte innere Klasse | anonyme Klasse | Lambda - -runde: - knopf.addActionListener(e -> text.setText("Hallo")); -richtig: Lambda -> Der Pfeil `->` verrät das Lambda. - -runde: - knopf.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - text.setText("Hallo"); - } - }); -richtig: anonyme Klasse -> `new ActionListener() {` und dahinter eine ganze Methode: Hier wird eine Klasse ohne Namen geschrieben. - -runde: - static class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - text.setText("Hallo"); - } - } -richtig: benannte innere Klasse -> Die Klasse heißt `Gruss` und erfüllt den Vertrag mit `implements ActionListener`. - -runde: - knopf.addActionListener(new Gruss()); -richtig: benannte innere Klasse -> `new Gruss()` erzeugt ein Objekt der Klasse `Gruss`. Die Klasse selbst steht woanders, sie hat einen Namen. - -runde: - ActionListener taste = e -> { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - }; -richtig: Lambda -> Ein Lambda in einer Variable, wie beim Zahlenschloss in Lektion 37. Der Pfeil verrät es. - -runde: - ActionListener taste = new ActionListener() { - public void actionPerformed(ActionEvent e) { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; -richtig: anonyme Klasse -> Auch eine anonyme Klasse kann in einer Variable stehen. Dann kann man sie wie das Lambda bei mehreren Knöpfen anmelden. -::: - -## Aufgabe: Ein Zähler, drei Schreibweisen - -Baue den Klickzähler mit drei Knöpfen: - -- **+1** bekommt die benannte innere Klasse `Plus`. -- **-1** bekommt eine anonyme Klasse. -- **Reset** bekommt ein Lambda. - -Probiere aus, ob alle drei Knöpfe wie erwartet zählen. Lass dann bei der Klasse `Plus` das `static` weg und lies die Fehlermeldung von javac. - -**Du bist fertig, wenn …** - -- **+1** hoch-, **-1** herunterzählt und **Reset** auf 0 setzt, -- im Code genau eine benannte innere Klasse, eine anonyme Klasse und ein Lambda stehen, -- du ohne `static` bei `Plus` die Fehlermeldung von javac gelesen hast und erklären kannst, was sie bedeutet. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Zuhörer als benannte innere Klasse schreiben. → 1. Die benannte innere Klasse -- Ich kann einen Zuhörer als anonyme Klasse schreiben. → 2. Die anonyme Klasse -- Ich kann erklären, was beim Lambda weggelassen wird. → 3. Das Lambda -- Ich kann erklären, welche Schreibweise welche Variablen sieht. → Die drei im Vergleich -- Ich kann einen Zähler mit drei Knöpfen in drei Schreibweisen bauen. → Aufgabe: Ein Zähler, drei Schreibweisen -::: - -## Wissenstest - -::: quiz -? Warum geht die Kurzform mit dem Pfeil bei ActionListener? -→ 3. Das Lambda -- [ ] Weil ActionListener eine Klasse ist. -- [x] Weil der Vertrag genau eine Methode hat. -- [ ] Weil der Knopf es so verlangt. - -? Welche Schreibweise kannst du mit new Plus() bei mehreren Knöpfen benutzen, ohne sie in eine Variable zu speichern? -→ 1. Die benannte innere Klasse -- [x] die benannte innere Klasse -- [ ] die anonyme Klasse -- [ ] das Lambda - -? Warum steht static vor class Plus? -→ 1. Die benannte innere Klasse -- [ ] Damit die Klasse schneller ist. -- [x] Weil main static ist und sonst kein Objekt von Plus erzeugen kann. -- [ ] Weil jede Klasse static sein muss. - -? Ordne zu. -→ Die drei im Vergleich -= class Plus implements ActionListener -> benannte innere Klasse -= new ActionListener() { … } -> anonyme Klasse -= der Pfeil hinter e -> Lambda -::: diff --git a/web/lessons/de/39-zwei-reiter.md b/web/lessons/de/39-zwei-reiter.md deleted file mode 100644 index d0842199..00000000 --- a/web/lessons/de/39-zwei-reiter.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Zwei Reiter -bereich: Fenster mit Swing -kurz: Ein Fenster mit zwei Reitern bauen, Daten von einem Reiter zum anderen bringen und die Liste als Textdatei speichern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Fenster mit zwei Reitern bauen -- mit append Zeilen an eine JTextArea anhängen -- erklären, warum ein Zuhörer Bausteine auf beiden Reitern benutzen kann -- im Zuhörer mit try und catch eine Datei speichern -- eine Einkaufsliste bauen, die mitzählt, wie viele Dinge darauf stehen -::: - -## Das Ziel - -Ludwigs Einkaufsliste aus Lektion 23 bekommt ein Fenster. Es hat zwei **Reiter**, wie die Tabs im Browser: - -- Im Reiter **Eingabe** tippst du ein, was du brauchst, und klickst auf **Hinzufügen**. -- Im Reiter **Liste** steht alles, was du eingegeben hast. Ein Knopf **Speichern** schreibt die Liste in eine Textdatei. - -Neu sind die Reiter (`JTabbedPane`), ein Textbereich mit mehreren Zeilen (`JTextArea`) und das Speichern aus einem Zuhörer heraus. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Reiter mit JTabbedPane - -Jeder Reiter zeigt eine eigene Fläche. Die Flächen sind JPanels, wie das Tastenfeld beim Zahlenschloss in Lektion 37: - -```java -JTabbedPane reiter = new JTabbedPane(); -JPanel eingabe = new JPanel(new GridLayout(0, 1)); -JPanel liste = new JPanel(new BorderLayout()); - -reiter.addTab("Eingabe", eingabe); -reiter.addTab("Liste", liste); -fenster.add(reiter); -``` - -| Aufruf | Bedeutung | -|---|---| -| `addTab("Eingabe", eingabe)` | neuer Reiter mit der Beschriftung „Eingabe“, er zeigt das JPanel `eingabe` | -| `setSelectedIndex(1)` | wechselt zum zweiten Reiter, gezählt wird ab 0 | -| `setTitleAt(1, "Liste (3)")` | ändert die Beschriftung des zweiten Reiters | - -Beim Start ist der Reiter offen, der zuerst hinzugefügt wurde. - -## Ein Textbereich mit mehreren Zeilen - -Ein `JTextField` hat nur eine Zeile. Für die Liste brauchst du eine `JTextArea`: - -```java -JTextArea bereich = new JTextArea(); -bereich.setEditable(false); -bereich.append("Heu\n"); -``` - -- `append` hängt Text hinten an. Das `"\n"` beginnt danach eine neue Zeile, wie beim Zerlegen mit `split("\n")` in Lektion 24. -- `setEditable(false)` verhindert, dass man in der Liste selbst herumtippt. -- `getText()` liefert den ganzen Text mit allen Zeilen. - -::: quiz -? Was macht `bereich.append("Heu\n")`? -- [ ] Es ersetzt den ganzen Text durch „Heu“. -- [x] Es hängt „Heu“ hinten an und beginnt danach eine neue Zeile. -- [ ] Es schreibt „Heu\n“ genau so in die Liste. -> `append` hängt an, `"\n"` ist der Zeilenumbruch. -::: - -## Von einem Reiter zum anderen - -Der Knopf **Hinzufügen** steht im Reiter Eingabe, der Textbereich im Reiter Liste. Trotzdem kann der Zuhörer beide benutzen. Alle Bausteine sind Variablen in `main`, und das Lambda sieht sie alle, egal auf welchem Reiter sie später angezeigt werden: - -```java -hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\n"); - info.setText(feld.getText() + " steht auf der Liste."); - feld.setText(""); -}); -``` - -::: ludwig -Ein Baustein kann nur auf **einer** Fläche liegen. Fügst du denselben Knopf erst zu `eingabe` und dann zu `liste` hinzu, nimmt Swing ihn bei `eingabe` wieder weg. Er erscheint nur im Reiter Liste. -::: - -## Speichern im Zuhörer - -Zum Speichern nimmst du den `PrintWriter` aus Lektion 23. Im Zuhörer gibt es aber einen Haken: Den Ausweg `throws Exception` aus Lektion 23 gibt es hier nicht. Das Lambda ist eine eigene Methode, `actionPerformed`, und die darf laut Vertrag keine `FileNotFoundException` weiterwerfen. Darum steht das Speichern in try und catch: - -```java -speichern.addActionListener(e -> { - try { - PrintWriter aus = new PrintWriter("einkaufsliste.txt"); - aus.print(bereich.getText()); - aus.close(); - info.setText("Gespeichert in einkaufsliste.txt"); - reiter.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Speichern ging nicht."); - } -}); -``` - -- Die Exception heißt hier `ex`, weil der Name `e` schon für das Ereignis vergeben ist. -- Nach dem Speichern springt das Fenster mit `setSelectedIndex(0)` zurück zum Reiter Eingabe, wo die Meldung steht. -- VisuStruct zeigt die gespeicherte Datei unter der Konsole, sobald du auf Speichern geklickt hast. - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class Einkaufsliste { - public static void main(String[] args) { - JFrame fenster = new JFrame("Einkaufsliste"); - fenster.setSize(300, 250); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane reiter = new JTabbedPane(); - - JPanel eingabe = new JPanel(new GridLayout(0, 1)); - JTextField feld = new JTextField(); - JButton hinzufuegen = new JButton("Hinzufügen"); - JLabel info = new JLabel("Noch nichts auf der Liste."); - eingabe.add(new JLabel("Was brauchst du?")); - eingabe.add(feld); - eingabe.add(hinzufuegen); - eingabe.add(info); - - JPanel liste = new JPanel(new BorderLayout()); - JTextArea bereich = new JTextArea(); - bereich.setEditable(false); - JButton speichern = new JButton("Speichern"); - liste.add(bereich, BorderLayout.CENTER); - liste.add(speichern, BorderLayout.SOUTH); - - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); - - hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\n"); - info.setText(feld.getText() + " steht auf der Liste."); - feld.setText(""); - }); - - speichern.addActionListener(e -> { - try { - PrintWriter aus = new PrintWriter("einkaufsliste.txt"); - aus.print(bereich.getText()); - aus.close(); - info.setText("Gespeichert in einkaufsliste.txt"); - reiter.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Speichern ging nicht."); - } - }); - - fenster.add(reiter); - fenster.setVisible(true); - } -} -``` - -Tippe Heu ein, klicke auf Hinzufügen, dann Äpfel und noch einmal Hinzufügen. Wechsle zum Reiter Liste und klicke auf Speichern. - -## Spiel: Wo landet es? - -::: spiel frage -titel: Spiel: Wo landet es? -intro: Ludwig baut Fenster mit Reitern. Lies den Code und sag voraus, was du siehst. Sechs Runden. - -runde: - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); -frage: Welcher Reiter ist beim Start offen? -- [x] Eingabe -- Liste -- keiner -> Beim Start ist der Reiter offen, der zuerst hinzugefügt wurde. - -runde: - reiter.addTab("Liste", liste); - reiter.addTab("Eingabe", eingabe); -frage: Welcher Reiter ist beim Start offen? -- Eingabe -- [x] Liste -- beide -> Diesmal kommt Liste zuerst. Die Reihenfolge von `addTab` bestimmt die Reihenfolge der Reiter. - -runde: - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); - reiter.addTab("Hilfe", hilfe); - reiter.setSelectedIndex(1); -frage: Welcher Reiter ist offen? -- Eingabe -- [x] Liste -- Hilfe -> Gezählt wird ab 0: 0 ist Eingabe, 1 ist Liste, 2 ist Hilfe. - -runde: - hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\n"); - feld.setText(""); - }); - // Du tippst Heu, klickst Hinzufügen, tippst Äpfel, klickst Hinzufügen. -frage: Was steht danach im Reiter Liste? -- Äpfel -- HeuÄpfel -- [x] Heu\nÄpfel -> `append` hängt an, und jedes `"\n"` beginnt eine neue Zeile. - -runde: - JButton knopf = new JButton("OK"); - eingabe.add(knopf); - liste.add(knopf); -frage: Wo erscheint der Knopf OK? -- in beiden Reitern -- nur im Reiter Eingabe -- [x] nur im Reiter Liste -> Ein Baustein kann nur auf einer Fläche liegen. Beim zweiten `add` nimmt Swing ihn von `eingabe` weg. - -runde: - speichern.addActionListener(e -> { - bereich.setText(""); - reiter.setTitleAt(1, "Liste (leer)"); - reiter.setSelectedIndex(0); - }); - // Der Knopf speichern liegt im Reiter Liste. -frage: Was siehst du nach dem Klick? -- den leeren Reiter Liste -- [x] den Reiter Eingabe, und der zweite Reiter heißt „Liste (leer)“ -- den Reiter Eingabe, der zweite Reiter heißt weiter „Liste“ -> Der Zuhörer leert den Bereich, benennt den Reiter um und wechselt zu Reiter 0. Alles passiert bei einem Klick. -::: - -## Aufgabe: Einkaufsliste mit Reitern - -Baue das Programm nach und probiere es aus. - -Dann mach es besser: - -- Leere Eingaben kommen nicht auf die Liste. Prüfe vorher `feld.getText().isEmpty()` (Lektion 17). -- Der Reiter Liste zeigt in seinem Titel, wie viele Dinge auf der Liste stehen: „Liste (3)“. Zähle in einer `static int`-Variable mit und benutze `setTitleAt`. -- Zusatz: Ein dritter Reiter **Hilfe** mit einem JLabel, das erklärt, wie das Programm geht. - -**Du bist fertig, wenn …** - -- ein eingegebener Eintrag nach dem Klick im Reiter Liste steht, -- ein leeres Feld nichts zur Liste hinzufügt, -- der Reiter nach drei Einträgen „Liste (3)“ heißt. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Fenster mit zwei Reitern bauen. → Reiter mit JTabbedPane -- Ich kann mit append Zeilen an eine JTextArea anhängen. → Ein Textbereich mit mehreren Zeilen -- Ich kann erklären, warum ein Zuhörer Bausteine auf beiden Reitern benutzen kann. → Von einem Reiter zum anderen -- Ich kann im Zuhörer mit try und catch eine Datei speichern. → Speichern im Zuhörer -- Ich kann eine Einkaufsliste bauen, die mitzählt, wie viele Dinge darauf stehen. → Aufgabe: Einkaufsliste mit Reitern -::: - -## Wissenstest - -::: quiz -? Welcher Reiter ist nach reiter.setSelectedIndex(0) offen? -→ Reiter mit JTabbedPane -- [x] der erste -- [ ] der zweite -- [ ] keiner - -? Warum steht das Speichern im Zuhörer in try und catch? -→ Speichern im Zuhörer -- [ ] Weil PrintWriter nur in try funktioniert. -- [x] Weil actionPerformed keine FileNotFoundException weiterwerfen darf. -- [ ] Weil main kein throws hat. - -? Was ist der Unterschied zwischen JTextField und JTextArea? -→ Ein Textbereich mit mehreren Zeilen -- [ ] Es gibt keinen. -- [x] JTextArea kann mehrere Zeilen zeigen. -- [ ] JTextField kann man nicht beschreiben. - -? Ordne zu. -→ Reiter mit JTabbedPane -= JTabbedPane -> eine Fläche mit Reitern -= JPanel -> die Fläche eines Reiters -= JTextArea -> ein Textbereich mit mehreren Zeilen -::: diff --git a/web/lessons/de/40-model-view-controller.md b/web/lessons/de/40-model-view-controller.md deleted file mode 100644 index b6b6f6c7..00000000 --- a/web/lessons/de/40-model-view-controller.md +++ /dev/null @@ -1,430 +0,0 @@ ---- -titel: Model View Controller -bereich: Fenster mit Swing -kurz: Den Klickzähler in Model, View und Controller zerlegen und verstehen, wer mit wem redet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- sagen, was Model, View und Controller jeweils tun -- ein Model ohne Swing schreiben und ohne Fenster testen -- erklären, was new Zaehler() baut und warum dort kein static steht -- die vier Nachrichten nach einem Klick nennen -- eine zweite View dazubauen, ohne das Model zu ändern -- einen Zähler mit −1, Reset und Grenzen im Model bauen -::: - -## Das Ziel - -Große Programme mit Fenstern haben fast immer denselben Aufbau. Er heißt **Model View Controller**, kurz **MVC**: - -- Das **Model** hält die Daten und kennt ihre Regeln. -- Die **View** zeigt die Daten nur an. -- Der **Controller** reagiert auf Klicks und gibt Bescheid. - -Du lernst MVC am Klickzähler aus Lektion 32. Er wird Schritt für Schritt in drei Teile zerlegt. Am Ende zeigt er denselben Zählerstand zweimal an: als Zahl und als Balken. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Alles in einer Klasse - -So sah der Klickzähler bisher aus, alles steckt in `main` und einer Variable der Klasse: - -```java -static int anzahl = 0; - -public static void main(String[] args) { - // ... Fenster bauen ... - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); -} -``` - -Das läuft. Aber stell dir vor, der Zählerstand soll zusätzlich als Balken erscheinen, später noch in einem zweiten Fenster und in einer Datei. Dann muss jeder Zuhörer an alle Anzeigen denken. Rechnen und Anzeigen sind ineinander verknotet, und mit jeder Anzeige wird der Knoten größer. - -MVC löst den Knoten: Jede Aufgabe bekommt ihre eigene Klasse. - -## Das Model - -Das Model ist der Zähler selbst, ganz ohne Swing: - -```java -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} -``` - -- Diesmal steht vor `wert` und den Methoden kein `static`. Dann gehören sie zu einem **Objekt**: `new Zaehler()` baut einen Zähler mit eigenem `wert`, so wie `new JButton("+1")` einen Knopf mit eigener Beschriftung baut. -- `model.erhoehen()` ruft die Methode dieses einen Zählers auf, genau wie `knopf.setText(…)`. -- Wer den Wert wissen will, fragt mit `getWert()`. Ändern geht nur über `erhoehen()`. - -Weil das Model kein Fenster braucht, kannst du es ganz ohne Fenster ausprobieren: - -```java -public class ZaehlerTest { - public static void main(String[] args) { - Zaehler model = new Zaehler(); - model.erhoehen(); - model.erhoehen(); - System.out.println(model.getWert()); - } -} - -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} -``` - -Die Ausgabe ist 2. Mehrere Klassen dürfen in einer Datei stehen. Nur eine davon ist `public`, und die enthält `main`. - -## Die View - -Die View zeigt den Wert an und macht sonst nichts. Sie rechnet nicht und weiß nicht, woher die Zahl kommt: - -```java -class ZahlAnzeige { - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - void aktualisieren(int wert) { - zahl.setText("" + wert); - } -} -``` - -- Die View bekommt den Wert mit `aktualisieren(int wert)` geliefert und schreibt ihn in ihr JLabel. -- Fenster und Knopf baust du wie immer in `main`. Mit `fenster.add(view.zahl)` kommt das JLabel der View ins Fenster. - -## Der Controller - -Der Controller ist der Zuhörer am Knopf. Er verbindet Model und View: - -```java -Zaehler model = new Zaehler(); -ZahlAnzeige view = new ZahlAnzeige(); - -plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); -}); -``` - -- Erst ändert er das Model, dann holt er den neuen Wert und gibt ihn der View. -- Das Problem aus Lektion 32 ist weg: Die Variable `model` ändert sich nie, sie zeigt immer auf denselben Zähler. Nur der `wert` darin ändert sich. Deshalb darf das Lambda `model` benutzen, ganz ohne `static`. - -## Wer redet mit wem? - -Bei jedem Klick laufen vier Nachrichten, immer in derselben Reihenfolge: - -::: grafik mvc-klick.svg -Die Pfeile leuchten der Reihe nach auf. Das Model zählt beim zweiten Pfeil hoch, die Anzeige erst beim vierten. -::: - -1. Der Knopf meldet den Klick an den Controller (`actionPerformed`). -2. Der Controller sagt dem Model: `erhoehen()`. -3. Der Controller fragt das Model nach dem neuen Wert: `getWert()`. -4. Der Controller gibt den Wert an die View: `aktualisieren(wert)`. - -Das Model redet mit niemandem. Es wartet, bis es gefragt wird. - -::: ludwig -Merk dir: Das Model weiß nichts von Fenstern. In `Zaehler` steht kein einziges `JLabel` und kein `import javax.swing`. Wenn du dort Swing brauchst, gehört der Code in die View. -::: - -::: quiz -? Mit wem redet das Model von sich aus? -- [ ] Mit der View -- [ ] Mit dem Knopf -- [x] Mit niemandem -> Das Model wartet, bis der Controller es fragt. -::: - -## Der Gewinn: eine zweite View - -Jetzt soll der Zählerstand zusätzlich als Balken erscheinen. Dafür kommt eine zweite View dazu. Ein `JProgressBar` ist ein Balken, der sich füllt, hier von 0 bis 10: - -```java -class BalkenAnzeige { - JProgressBar balken = new JProgressBar(0, 10); - - void aktualisieren(int wert) { - balken.setValue(wert); - } -} -``` - -Der Controller bekommt eine Zeile mehr. Das Model bleibt genau, wie es war: - -```java -plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); -}); -``` - -Genau das ist der Gewinn von MVC: Du kannst Anzeigen dazubauen oder austauschen, ohne das Model anzufassen. - -## Das ganze Programm - -```java -import javax.swing.*; -import java.awt.*; - -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} - -class ZahlAnzeige { - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - void aktualisieren(int wert) { - zahl.setText("" + wert); - } -} - -class BalkenAnzeige { - JProgressBar balken = new JProgressBar(0, 10); - - void aktualisieren(int wert) { - balken.setValue(wert); - } -} - -public class KlickZaehler { - public static void main(String[] args) { - Zaehler model = new Zaehler(); - ZahlAnzeige view = new ZahlAnzeige(); - BalkenAnzeige balken = new BalkenAnzeige(); - - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); - }); - - fenster.add(view.zahl); - fenster.add(balken.balken); - fenster.add(plus); - fenster.setVisible(true); - } -} -``` - -Klick ein paar Mal auf +1 und sieh zu, wie Zahl und Balken gemeinsam wachsen. - -::: angeberwissen -MVC hat sich der Norweger Trygve Reenskaug 1979 ausgedacht, im Forschungszentrum Xerox PARC in Kalifornien. Dort standen damals schon Computer mit Fenstern und Maus. Im selben Jahr besuchte Steve Jobs das Labor und war so begeistert, dass Apple danach Computer mit Fenstern und Maus baute. -::: - -## Spiel: Wohin gehört der Code? - -::: spiel frage -titel: Spiel: Wohin gehört der Code? -intro: Ludwig hat Code aus einem MVC-Programm auf einen Haufen geworfen. Sortier jedes Stück ein. Acht Runden. -frage: Wohin gehört dieser Code? -antworten: Model | View | Controller - -runde: - int wert = 0; -richtig: Model -> Der Zählerstand sind die Daten. Daten wohnen im Model. - -runde: - zahl.setText("" + wert); -richtig: View -> Etwas auf dem Bildschirm anzeigen ist die Aufgabe der View. - -runde: - plus.addActionListener(e -> model.erhoehen()); -richtig: Controller -> Auf einen Klick reagieren und dem Model Bescheid geben: Das macht der Controller. - -runde: - void erhoehen() { - wert++; - } -richtig: Model -> Das Model weiß selbst, wie es seine Daten ändert. - -runde: - balken.setValue(wert); -richtig: View -> Ein Balken, der sich füllt, zeigt nur an. Also View. - -runde: - void erhoehen() { - if (wert < 10) { - wert++; - } - } -richtig: Model -> „Höchstens 10“ ist eine Regel für die Daten. Regeln gehören ins Model, dann gelten sie für jeden Knopf und jede View. - -runde: - view.aktualisieren(model.getWert()); -richtig: Controller -> Den Wert beim Model abholen und der View geben: Das ist der Controller in der Mitte. - -runde: - JLabel zahl = new JLabel("0", SwingConstants.CENTER); -richtig: View -> Ein JLabel ist ein Baustein der Oberfläche. Im Model steht kein Swing. -::: - -## Spiel: Wer ist dran? - -::: spiel reihenfolge -titel: Spiel: Wer ist dran? -intro: Nach einem Klick reden Model, View und Controller miteinander, aber nur in einer Reihenfolge funktioniert es. Bring die Schritte in die richtige Reihenfolge. Fünf Runden. - -runde: -frage: Du klickst im Klickzähler auf +1. Was passiert der Reihe nach? -- Du klickst auf +1. -- Der Controller bekommt `actionPerformed`. -- Der Controller ruft `model.erhoehen()` auf. -- Das Model zählt `wert` hoch. -- Der Controller holt `model.getWert()`. -- Die View zeigt die neue Zahl. -> Klick, Controller, Model ändern, Wert holen, anzeigen. Das sind die vier Pfeile aus der Grafik, mit dem Hochzählen in der Mitte. - -runde: - plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); - }); -frage: Was passiert nach einem Klick auf +1 der Reihe nach? -- Der Klick auf +1 -- `model.erhoehen()` -- Die Zahl zeigt den neuen Wert. -- Der Balken wächst. -> Der Zuhörer arbeitet seine Zeilen von oben nach unten ab: erst das Model, dann die Zahl, dann der Balken. - -runde: -frage: Bring den Controller in die richtige Reihenfolge, damit die View die neue Zahl zeigt. -- `plus.addActionListener(e -> {` -- `model.erhoehen();` -- `view.aktualisieren(model.getWert());` -- `});` -> Erst ändern, dann anzeigen. Andersherum zeigt die View noch den alten Wert. - -runde: - reset.addActionListener(e -> { - model.zuruecksetzen(); - view.aktualisieren(model.getWert()); - }); -frage: Der Zähler steht auf 5. Du klickst auf Reset. Was passiert der Reihe nach? -- Du klickst auf Reset. -- Das Model setzt `wert` auf 0. -- `model.getWert()` liefert 0. -- Die View zeigt 0. -> Auch Reset läuft über den Controller ins Model. Die View erfährt den neuen Wert erst ganz am Schluss. - -runde: -frage: Ein Test ohne Fenster soll 1 ausgeben. In welcher Reihenfolge stehen die Zeilen in main? -- `Zaehler model = new Zaehler();` -- `model.erhoehen();` -- `System.out.println(model.getWert());` -> Erst das Objekt bauen, dann damit arbeiten, zum Schluss nachsehen. Das Model lässt sich ganz ohne Fenster testen. -::: - -## Aufgabe: Ein Zähler mit Grenzen - -Baue das ganze Programm und probier es aus. - -Dann mach es besser: - -- Ein Knopf **−1** zählt herunter. Das Model bekommt dafür eine Methode `verringern()`, der Controller einen zweiten Zuhörer. -- Ein Knopf **Reset** setzt den Zähler mit `zuruecksetzen()` auf 0. -- Das Model achtet selbst auf die Grenzen: nie unter 0 und nie über 10, denn dann ist der Balken voll. -- Extra: eine dritte View `KonsolenAnzeige`, deren `aktualisieren` mit `System.out.println` „Neuer Wert: 3“ ausgibt. Eine View muss kein Fenster sein. - -**Du bist fertig, wenn …** - -- **+1**, **−1** und **Reset** richtig zählen, -- der Zähler nie unter 0 und nie über 10 geht, egal wie oft du klickst, -- Zahl und Balken immer denselben Wert zeigen, -- in der Klasse des Model kein `JButton`, `JLabel` oder anderes Swing vorkommt. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann sagen, was Model, View und Controller jeweils tun. → Das Ziel -- Ich kann ein Model ohne Swing schreiben und ohne Fenster testen. → Das Model -- Ich kann erklären, was new Zaehler() baut und warum dort kein static steht. → Das Model -- Ich kann die vier Nachrichten nach einem Klick nennen. → Wer redet mit wem? -- Ich kann eine zweite View dazubauen, ohne das Model zu ändern. → Der Gewinn: eine zweite View -- Ich kann einen Zähler mit −1, Reset und Grenzen im Model bauen. → Aufgabe: Ein Zähler mit Grenzen -::: - -## Wissenstest - -::: quiz -? Wo steht die Regel „Der Zähler geht nie über 10“? -→ Das Model -- [x] im Model -- [ ] in der View -- [ ] im Controller -> Regeln über die Daten gehören ins Model. Dann gelten sie, egal welcher Knopf drückt. - -? Was macht die View? -→ Das Ziel -- [ ] Sie rechnet den neuen Wert aus. -- [x] Sie zeigt den Wert an, den sie bekommt. -- [ ] Sie hört auf Klicks. - -? Warum darf das Lambda model benutzen, obwohl model eine Variable von main ist? -→ Wer redet mit wem? -- [ ] Weil Zaehler public ist. -- [x] Weil model immer auf denselben Zähler zeigt; nur der wert darin ändert sich. -- [ ] Weil Lambdas alle Variablen ändern dürfen. - -? Was musst du am Model ändern, wenn eine zweite View dazukommt? -→ Der Gewinn: eine zweite View -- [x] nichts -- [ ] eine zweite Methode erhoehen -- [ ] ein zweites JLabel - -? Ordne zu. -→ Das Ziel -= Zaehler mit wert und erhoehen() -> Model -= ZahlAnzeige mit aktualisieren(int wert) -> View -= der Zuhörer am Knopf -> Controller -::: diff --git a/web/lessons/de/aufgaben/alter-unterprogramm.md b/web/lessons/de/aufgaben/alter-unterprogramm.md deleted file mode 100644 index 3d1d972e..00000000 --- a/web/lessons/de/aufgaben/alter-unterprogramm.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Alter im Unterprogramm -nach: 18 -stufe: 2 ---- - -Die Altersprüfung aus „Volljährig?“ wird jetzt ein eigenes Unterprogramm. Das Hauptprogramm ruft es nur noch auf. - -::: übung aufgabe-alter-unterprogramm -titel: Alter im Unterprogramm -auftrag: Baue zwei Diagramme. Das Hauptprogramm gibt **Willkommen** aus, ruft dann `pruefeAlter()` auf und gibt zum Schluss **Auf Wiedersehen** aus. - Das Unterprogramm `pruefeAlter` steht in einem eigenen Reiter: Es fragt nach dem Alter und gibt **volljährig** oder **minderjährig** aus. -test: 20 -> Willkommen | volljährig | Auf Wiedersehen -test: 18 -> Willkommen | volljährig | Auf Wiedersehen -test: 12 -> Willkommen | minderjährig | Auf Wiedersehen -braucht: aufruf -tipp: Das Hauptprogramm hat drei Kästen. Die eigentliche Arbeit macht das Unterprogramm. -tipp: Öffne die Übung im Editor und baue dort das Hauptprogramm mit dem Aufruf `pruefeAlter()`. Lege dann mit **+** einen neuen Reiter an und gib ihm den Titel `pruefeAlter`. Darin baust du die Eingabe und die Verzweigung. Prüfen findet das Unterprogramm über den Titel des Reiters. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/ballwurf.md b/web/lessons/de/aufgaben/ballwurf.md deleted file mode 100644 index f01c2f81..00000000 --- a/web/lessons/de/aufgaben/ballwurf.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -titel: Ballwurf auswerten -nach: 25 -stufe: 2 ---- - -Beim Sportfest haben alle ihre Weite beim Ballwurf in eine Tabelle eingetragen: - -::: datei ballwurf.csv -Name;Weite -Ludwig;28 -Zora;42 -Fuchs;35 -Hase;21 -::: - -::: übung aufgabe-ballwurf -titel: Ballwurf auswerten -code: java -auftrag: Lies die Datei ein und überspringe die Kopfzeile. Gib aus, wie viele mitgemacht haben (**Teilnehmer: 4**) und wie weit im Schnitt geworfen wurde (**Schnitt: 31.5 m**). - Speichere den weitesten Wurf in der Datei **sieger.txt**, zum Beispiel **Sieger: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Teilnehmer: 4 | Schnitt: 31.5 m -datei: sieger.txt -> Sieger: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: Du brauchst vier Variablen vor der Schleife: die Anzahl, die Summe als `double`, die beste Weite und den besten Namen. -tipp: In der Schleife: `String[] teile = zeile.split(";");` und `int weite = Integer.parseInt(teile[1]);`. Ist `weite > besteWeite`, merkst du dir Weite und Namen. Zum Speichern: `PrintWriter aus = new PrintWriter("sieger.txt");`, `aus.println(…)` und `aus.close();`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/bestenliste.md b/web/lessons/de/aufgaben/bestenliste.md deleted file mode 100644 index 83eda4c0..00000000 --- a/web/lessons/de/aufgaben/bestenliste.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -titel: Bestenliste -nach: 19 -stufe: 2 ---- - -Fünf Ziegen sind beim Hindernislauf gestartet. Jetzt soll die Bestenliste an die Stalltür: die meisten Punkte oben, die wenigsten unten. - -::: übung aufgabe-bestenliste -titel: Bestenliste -auftrag: Lies 5 Punktzahlen in ein Array ein. Sortiere das Array mit Bubblesort **absteigend**, also die größte Zahl zuerst. Gib danach die Liste mit Platz aus, zum Beispiel **1. 9**, in der nächsten Zeile **2. 9** und so weiter. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Bubblesort aus Lektion 19 sortiert aufsteigend. Für absteigend drehst du nur den Vergleich der Nachbarn um. -tipp: Getauscht wird, wenn `punkte[i] < punkte[i + 1]` ist, mit einer Hilfsvariablen. Für die Ausgabe rechnest du zuerst `int platz = i + 1` aus und gibst dann `platz + ". " + punkte[i]` aus. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-bestenliste-java -titel: Bestenliste in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Lies jede Zahl erst in eine Variable ein und schreibe sie dann ins Array: `int zahl = scanner.nextInt();` und `punkte[i] = zahl;`. -tipp: Der Tausch braucht auch in Java eine Hilfsvariable: `int hilf = punkte[i]; punkte[i] = punkte[i + 1]; punkte[i + 1] = hilf;`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/binaerzahl.md b/web/lessons/de/aufgaben/binaerzahl.md deleted file mode 100644 index d7cbbe1d..00000000 --- a/web/lessons/de/aufgaben/binaerzahl.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -titel: Binärzahl -nach: 11 -stufe: 3 ---- - -Computer rechnen mit nur zwei Ziffern: 0 und 1. So wandelst du eine Zahl ins **Binärsystem** um: - -1. Teile die Zahl durch 2 und merke dir den Rest (0 oder 1). -2. Rechne mit dem Ergebnis ohne Rest weiter. -3. Wiederhole das, bis die Zahl 0 ist. - -Die Reste von **unten nach oben** gelesen ergeben die Binärzahl. Bei 6 sind die Reste 0, 1, 1, also lautet die Binärzahl 110. - -::: übung aufgabe-binaer -titel: Binärzahl -auftrag: Frage nach einer ganzen Zahl größer als 0 und gib sie als Binärzahl aus. Bei 6 lautet die Ausgabe **110**, bei 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Teile die Zahl immer wieder durch 2 und merke dir jeden Rest. Die Reste rückwärts gelesen ergeben die Binärzahl. -tipp: Sammle die Ziffern in einem Text: `String binaer = ""`. In der Schleife berechnest du `int rest = zahl % 2` und hängst den Rest **vorne** an: `binaer = rest + binaer`. Danach `zahl = zahl / 2`. Weil zahl eine ganze Zahl ist, fällt der Rest dabei weg. -lösung: aufgabe-binaer-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-binaer-java -titel: Binärzahl in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Fang mit `String binaer = "";` an. Die Schleife läuft mit `while (zahl > 0)`. -tipp: Im Rumpf: `int rest = zahl % 2;`, dann `binaer = rest + binaer;` und `zahl = zahl / 2;`. Weil `binaer` ein String ist, hängt `+` den Rest vorne an. -lösung: aufgabe-binaer-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/caesar.md b/web/lessons/de/aufgaben/caesar.md deleted file mode 100644 index d1003f7a..00000000 --- a/web/lessons/de/aufgaben/caesar.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -titel: Caesar-Verschlüsselung -nach: 17 -stufe: 3 ---- - -Schon vor über 2000 Jahren schickte der römische Feldherr Julius Caesar geheime Nachrichten an seine Truppen. Sein Trick war einfach: Er ersetzte jeden Buchstaben durch den Buchstaben, der **drei Stellen weiter** im Alphabet steht. Aus A wird D, aus B wird E und so weiter. Die lesbare Nachricht heißt **Klartext**, die verschlüsselte **Geheimtext**. Um wie viele Stellen verschoben wird, ist der **Schlüssel**, oft kurz `k` genannt. - -::: grafik caesar-verschiebung.svg -Verschlüsselung mit dem Schlüssel 3: Jeder Buchstabe oben wird zum Buchstaben darunter. Am Ende geht es von vorn weiter, aus X, Y und Z werden A, B und C. -::: - -Aus `HALLO` wird so `KDOOR`. Wer den Schlüssel kennt, schiebt einfach drei Stellen zurück und kann die Nachricht wieder lesen. - -### Die Chiffrierscheibe - -Damit man nicht jedes Mal abzählen muss, baute man sich eine **Chiffrierscheibe**: zwei Scheiben mit dem Alphabet, eine kleine auf einer großen, in der Mitte drehbar befestigt. Außen steht der Klartext, innen der Geheimtext. Dreht man die innere Scheibe um drei Buchstaben, steht unter jedem Buchstaben außen sein Geheimbuchstabe. Solche Scheiben gibt es seit dem 15. Jahrhundert. Im Amerikanischen Bürgerkrieg (1861–1865) trugen Soldaten kleine Scheiben aus Messing bei sich. - -::: grafik caesar-scheibe.svg -Eine Chiffrierscheibe nach dem Vorbild historischer Messingscheiben. Das blaue Fenster zeigt: Mit dem Schlüssel 3 steht unter A das D. -::: - -::: angeberwissen -Caesar selbst hatte noch gar keine Scheibe! Das wissen wir vom römischen Geschichtsschreiber Sueton: Caesar verschob in seinen Briefen jeden Buchstaben um drei Stellen und zählte das einfach im Kopf ab. Die Scheibe erfand erst Leon Battista Alberti um 1467, also rund 1500 Jahre später. Ich zähle übrigens auch im Kopf, ich habe ja keine Finger, nur Hufe. -::: - -Probiere es selbst aus. Drehe die innere Scheibe, tippe einen Text ein und schau zu, wie der Geheimtext entsteht. Mit **Entschlüsseln** geht es rückwärts. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -Eine echte Scheibe kannst du ganz leicht selbst basteln: zwei Kreise aus Pappe, einer etwas kleiner, je 26 gleich große Felder mit dem Alphabet und in der Mitte eine Musterklammer. Fertig ist dein Geheimdienst-Werkzeug! -::: - -::: quiz -? Was wird mit dem Schlüssel 3 aus dem Buchstaben Y? -- [ ] A -- [x] B -- [ ] C -> Nach Y kommen Z, dann geht es von vorn los mit A und B. Drei Stellen weiter ist also B. - -? Ein Geheimtext wurde mit dem Schlüssel 5 verschlüsselt. Wie entschlüsselst du ihn? -- [ ] Noch einmal 5 Stellen weiter schieben -- [x] 5 Stellen zurück schieben -- [ ] Die Buchstaben rückwärts lesen -> Entschlüsseln ist das Gegenteil vom Verschlüsseln. Fünf Stellen zurück ist übrigens dasselbe wie 21 Stellen weiter, denn 5 + 21 = 26. -::: - -### Das Programm: Es gibt mehr als einen Weg - -Wie bringst du dem Computer bei, einen Buchstaben um `k` Stellen zu verschieben? Dafür gibt es nicht *die eine* richtige Lösung. Wir schauen uns zwei Wege an. Beide gehen den Text mit einer For-Schleife Zeichen für Zeichen durch, so wie in der Lektion Zeichenketten. Der Unterschied ist, wie sie einen einzelnen Buchstaben verschieben. - -In beiden Wegen hilft der Rest-Operator `%`. Er sorgt dafür, dass es nach Z wieder bei A weitergeht: Die Positionen 0 bis 25 bleiben, wie sie sind, aus 26 wird 0, aus 27 wird 1 und so weiter. - -### Weg 1: Das Alphabet in einem Array - -Du legst das Alphabet in ein Array `char[] alphabet = {'A', 'B', …, 'Z'}`. Für jeden Buchstaben des Wortes suchst du im Array seine Position `pos`, also seinen Index. Der Geheimbuchstabe steht dann im selben Array an der Stelle `(pos + k) % 26`. - -Ein Beispiel mit dem Schlüssel 3: X steht an der Position 23. Dann ist `(23 + 3) % 26 = 0`, und an der Position 0 steht A. - -::: übung aufgabe-caesar-array -titel: Caesar mit Array -auftrag: Das Startdiagramm enthält schon das Array `alphabet`. Frage nach einem Wort aus Großbuchstaben und nach dem Schlüssel `k`. Gib dann das verschlüsselte Wort aus. Bei HALLO und 3 also `KDOOR`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Lege einen leeren Text `String geheim = ""` an. Gehe das Wort mit einer For-Schleife Zeichen für Zeichen durch. In jedem Durchlauf hängst du einen Geheimbuchstaben hinten an `geheim` an. -tipp: Um die Position eines Buchstabens zu finden, brauchst du eine zweite, innere Schleife über das Array: Ist `alphabet[j] == zeichen`, merkst du dir `pos = j`. -tipp: Nach der inneren Schleife hängst du `alphabet[(pos + k) % 26]` an: `geheim = geheim + alphabet[(pos + k) % 26]`. Nach der äußeren Schleife gibst du `geheim` aus. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Weg 2: Rechnen mit der ASCII-Tabelle - -Für den Computer ist jedes Zeichen eigentlich eine Zahl. Welche Zahl zu welchem Zeichen gehört, steht in der **ASCII-Tabelle**. Dort hat A den Code 65, B den Code 66 und so weiter bis Z mit 90. In Java wandelst du ein Zeichen mit `(int)` in seinen Code um und einen Code mit `(char)` zurück in ein Zeichen: - -``` -int code = (int) 'A' -char zeichen = (char) 68 -``` - -Danach ist `code` gleich 65 und `zeichen` gleich `'D'`. So eine Umwandlung von einem Datentyp in einen anderen heißt **Typumwandlung** (englisch *cast*). - -Jetzt kannst du mit dem Buchstaben rechnen. Damit der Sprung von Z zurück zu A klappt, ziehst du erst 65 ab. Dann hat A die Position 0 und Z die Position 25, genau wie in Weg 1. Du verschiebst mit `% 26` und zählst am Ende die 65 wieder dazu: - -::: grafik caesar-ascii.svg -Oben die Großbuchstaben mit ihren ASCII-Codes. Unten der Rechenweg für X mit dem Schlüssel 3: Heraus kommt A. -::: - -::: übung aufgabe-caesar-ascii -titel: Caesar mit ASCII -code: java -auftrag: Schreibe ein Java-Programm, das ein Wort aus Großbuchstaben und den Schlüssel `k` einliest und das verschlüsselte Wort ausgibt. Diesmal ohne Array: Rechne mit `(int)` und `(char)`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Gehe das Wort mit einer For-Schleife durch. Den Code des Zeichens an der Stelle `i` bekommst du mit `int code = (int) wort.charAt(i);`. -tipp: Rechne `code = (code - 65 + k) % 26 + 65;` und hänge das Zeichen an: `geheim = geheim + (char) code;`. Vor der Schleife steht `String geheim = "";`, nach der Schleife `System.out.println(geheim);`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Welcher Weg ist besser? - -**Weg 1: Array.** Die Idee ist, die Position im Array zu suchen. -- Vorteil: leicht zu verstehen, und auch eigene Alphabete gehen, z. B. mit Ä, Ö und Ü. -- Nachteil: Für jeden Buchstaben muss gesucht werden. - -**Weg 2: ASCII.** Die Idee ist, mit dem Zeichencode zu rechnen. -- Vorteil: kurz und ohne Suche, darum schneller. -- Nachteil: Man muss die ASCII-Codes kennen. - -Beide Programme liefern dasselbe Ergebnis. Genau so ist es oft beim Programmieren: Es gibt mehrere richtige Lösungen, und du wählst die, die am besten zu deiner Aufgabe passt. - -::: übung aufgabe-caesar-entschluesseln -titel: Caesar entschlüsseln -code: java -auftrag: Jetzt drehst du den Spieß um. Lies einen Geheimtext aus Großbuchstaben und den Schlüssel `k` ein und gib den Klartext aus. Bei KDOOR und 3 also `HALLO`. Welchen Weg du nimmst, entscheidest du. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Entschlüsseln heißt: `k` Stellen zurück statt vor. Aus dem `+ k` wird also ein `- k`. -tipp: Vorsicht bei A: `0 - 3` ergibt -3, und `%` macht daraus in Java keine positive Zahl. Zähle darum noch 26 dazu: `code = (code - 65 - k + 26) % 26 + 65;` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Sicher ist Caesar leider nicht. Es gibt nur 25 Schlüssel, die kann man in ein paar Minuten alle ausprobieren. Noch schneller geht es mit einem Trick: Im Deutschen ist E der häufigste Buchstabe. Kommt im Geheimtext H am häufigsten vor, war der Schlüssel wohl 3. Im Internet gibt es übrigens ROT13, das ist Caesar mit dem Schlüssel 13. Zweimal ROT13 ergibt wieder den Klartext, weil 13 + 13 = 26. -::: diff --git a/web/lessons/de/aufgaben/collatz.md b/web/lessons/de/aufgaben/collatz.md deleted file mode 100644 index 0f52054f..00000000 --- a/web/lessons/de/aufgaben/collatz.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -titel: Collatz-Folge -nach: 11 -stufe: 2 ---- - -Die Collatz-Folge ist ein berühmtes Rätsel der Mathematik. Du beginnst mit einer Zahl und wendest immer wieder dieselbe Regel an: - -- Ist die Zahl **gerade**, teilst du sie durch 2. -- Ist sie **ungerade**, rechnest du mal 3 plus 1. - -Bisher endet die Folge bei jeder ausprobierten Startzahl irgendwann bei 1. Ob das für alle Zahlen gilt, weiß bis heute niemand. - -::: übung aufgabe-collatz -titel: Collatz-Folge -auftrag: Frage nach einer Startzahl. Wende die Regel so lange an, bis die Zahl 1 ist, und gib nach jedem Schritt die neue Zahl aus. Zähle dabei die Schritte mit und gib am Ende **Schritte:** und die Anzahl aus. - Bei der Startzahl 6 lautet die Folge 3, 10, 5, 16, 8, 4, 2, 1. Das sind 8 Schritte. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 7 -test: 1 -> Schritte: 0 -braucht: whileSchleife, verzweigung -tipp: Du weißt nicht, wie viele Schritte es werden. Darum passt eine While-Schleife besser als eine For-Schleife. -tipp: Die While-Schleife läuft, solange `zahl != 1` gilt. Ob eine Zahl gerade ist, prüfst du mit `zahl % 2 == 0`. Die Ausgabe und `schritte++` kommen nach der Verzweigung, aber noch in die Schleife. -lösung: aufgabe-collatz-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-collatz-java -titel: Collatz-Folge in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 7 -test: 1 -> Schritte: 0 -braucht: whileSchleife, verzweigung -tipp: Eine `while`-Schleife läuft, solange `zahl != 1` ist. Darin entscheidet ein `if` mit `zahl % 2 == 0`. -tipp: Im Rumpf: halbieren oder `zahl = zahl * 3 + 1;`, dann `System.out.println(zahl);` und `schritte++;`. Nach der Schleife kommt `"Schritte: " + schritte`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -Mit dieser Aufgabe kann man reich werden! Der Mathematiker Paul Erdős setzte für einen Beweis 500 Dollar aus. 2021 legte die japanische Firma Bakuage noch einiges drauf: 120 Millionen Yen, damals umgerechnet rund eine Million Dollar, für einen Beweis oder ein Gegenbeispiel. Abgeholt hat das Geld bis heute niemand. Erfunden hat das Rätsel übrigens der deutsche Mathematiker Lothar Collatz im Jahr 1937. Ich rechne gleich mal los, für so viel Geld gibt es eine Menge Heu. -::: diff --git a/web/lessons/de/aufgaben/einheitenrechner.md b/web/lessons/de/aufgaben/einheitenrechner.md deleted file mode 100644 index fc8b829a..00000000 --- a/web/lessons/de/aufgaben/einheitenrechner.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -titel: Einheitenrechner -nach: 35 -stufe: 2 ---- - -Baue ein Fenster, das Längen umrechnet. Oben tippst du eine Länge in Metern ein, darunter stehen drei Knöpfe: - -- **in cm** zeigt die Länge in Zentimetern, aus 1.5 wird „150.0 cm“, -- **in mm** zeigt sie in Millimetern, aus 1.5 wird „1500.0 mm“, -- **in km** zeigt sie in Kilometern, aus 1500 wird „1.5 km“. - -Das Ergebnis steht in einem JLabel unter den Knöpfen. Steht im Feld keine Zahl, erscheint dort „Bitte eine Zahl eingeben“, und das Programm stürzt nicht ab. - -So kannst du anfangen: - -```java -import javax.swing.*; -import java.awt.*; - -public class Einheiten { - public static void main(String[] args) { - JFrame fenster = new JFrame("Einheitenrechner"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JTextField meter = new JTextField(); - JButton inCm = new JButton("in cm"); - JLabel ergebnis = new JLabel("?", SwingConstants.CENTER); - - inCm.addActionListener(e -> { - double m = Double.parseDouble(meter.getText()); - ergebnis.setText((m * 100) + " cm"); - }); - - fenster.add(meter); - fenster.add(inCm); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -``` - -**Du bist fertig, wenn …** - -- 1.5 nach **in cm** „150.0 cm“ zeigt, nach **in mm** „1500.0 mm“, -- 1500 nach **in km** „1.5 km“ zeigt, -- „abc“ im Feld „Bitte eine Zahl eingeben“ zeigt und das Fenster offen bleibt. - -Zusatz: Ein vierter Knopf **in Fuß** rechnet in die englische Einheit um. Ein Fuß sind 0.3048 m. - -::: ludwig -Tick im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** an. Für „abc“ im Feld brauchst du in jedem Zuhörer ein try/catch mit `NumberFormatException`, wie beim Taschenrechner. -::: diff --git a/web/lessons/de/aufgaben/fibonacci.md b/web/lessons/de/aufgaben/fibonacci.md deleted file mode 100644 index 795b1487..00000000 --- a/web/lessons/de/aufgaben/fibonacci.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -titel: Fibonacci-Zahlen -nach: 13 -stufe: 2 ---- - -Bei den Fibonacci-Zahlen ist jede Zahl die Summe der beiden Zahlen davor. Die Folge beginnt mit 1 und 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -Diese Zahlen findest du erstaunlich oft in der Natur, zum Beispiel bei der Anordnung von Sonnenblumenkernen. - -::: ludwig -Erinnerst du dich ans **Tauschen** aus Lektion 5? Dort brauchtest du eine Hilfsvariable, weil `a = b` den alten Wert von `a` überschreibt. Hier ist es genauso: Bevor `zahl2` die neue Zahl bekommt, muss ihr alter Wert in `zahl1` gerettet sein. Achte also auf die **Reihenfolge**: erst `zahl1 = zahl2`, dann `zahl2 = zahl3`. Dieses Weiterschieben und Tauschen brauchst du später wieder, zum Beispiel beim Sortieren in Lektion 19. -::: - -::: angeberwissen -Leonardo von Pisa, genannt Fibonacci, stellte 1202 in seinem Rechenbuch eine Aufgabe über Kaninchen: Jedes Kaninchenpaar bekommt ab dem zweiten Monat jeden Monat ein neues Paar. Wie viele Paare gibt es nach einem Jahr? Die Antwort ist diese Zahlenfolge. Ziegen kamen in dem Buch leider nicht vor. -::: - -::: übung aufgabe-fibonacci -titel: Fibonacci-Zahlen -auftrag: Frage, wie viele Fibonacci-Zahlen ausgegeben werden sollen. Gib dann genau so viele aus, jede in einer eigenen Zeile. Du kannst davon ausgehen, dass mindestens 2 eingegeben wird. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Jede neue Zahl ist die Summe der beiden vorherigen. Du musst dir also immer die letzten zwei Zahlen merken. -tipp: Merke dir die beiden letzten Zahlen in `zahl1` und `zahl2` und gib beide vor der Schleife aus. Die Schleife beginnt bei `int i = 2`. Darin berechnest du `int zahl3 = zahl1 + zahl2`, gibst sie aus und schiebst dann weiter: `zahl1 = zahl2` und `zahl2 = zahl3`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-fibonacci-java -titel: Fibonacci-Zahlen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Die ersten beiden Zahlen gibst du vor der Schleife aus. Die `for`-Schleife beginnt dann bei `int i = 2`. -tipp: Im Rumpf: `int zahl3 = zahl1 + zahl2;`, ausgeben, dann `zahl1 = zahl2;` und `zahl2 = zahl3;`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Warum muss in der Schleife `zahl1 = zahl2` vor `zahl2 = zahl3` stehen? -- [ ] Weil Java die Zuweisungen sonst nicht erlaubt -- [x] Weil sonst der alte Wert von zahl2 überschrieben ist, bevor zahl1 ihn bekommt -- [ ] Die Reihenfolge ist egal -> Andersherum hätten zahl1 und zahl2 danach denselben Wert. Wie beim Tauschen gilt: Erst retten, dann überschreiben. -::: diff --git a/web/lessons/de/aufgaben/gerade-ungerade.md b/web/lessons/de/aufgaben/gerade-ungerade.md deleted file mode 100644 index 7e40ff2a..00000000 --- a/web/lessons/de/aufgaben/gerade-ungerade.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Gerade oder ungerade -nach: 8 -stufe: 1 ---- - -Eine Zahl ist gerade, wenn beim Teilen durch 2 kein Rest bleibt. Den Rest berechnest du mit `%`: `8 % 2` ist 0, `7 % 2` ist 1. - -::: übung aufgabe-gerade -titel: Gerade oder ungerade -auftrag: Frage nach einer ganzen Zahl. Gib aus, ob sie gerade oder ungerade ist. Bei 4 lautet die Ausgabe **4 ist gerade**, bei 7 **7 ist ungerade**. -test: 4 -> 4 ist gerade -test: 7 -> 7 ist ungerade -test: 0 -> 0 ist gerade -test: 15 -> 15 ist ungerade -braucht: verzweigung -tipp: Eine Verzweigung entscheidet zwischen gerade und ungerade. Gerade heißt: durch 2 teilbar ohne Rest. -tipp: Die Bedingung lautet `zahl % 2 == 0`. In der Ausgabe verbindest du die Zahl und den Text mit `+`, z. B. `zahl + " ist gerade"`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-gerade-java -titel: Gerade oder ungerade in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 4 -> 4 ist gerade -test: 7 -> 7 ist ungerade -test: 0 -> 0 ist gerade -test: 15 -> 15 ist ungerade -braucht: verzweigung -tipp: Eine Zahl liest du mit `int zahl = scanner.nextInt();` ein. Vorher fragst du mit `System.out.println(…)`. -tipp: `if (zahl % 2 == 0) { … } else { … }`. Die Ausgabe ist `System.out.println(zahl + " ist gerade");`. -lösung: aufgabe-gerade-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/mehrwertsteuer.md b/web/lessons/de/aufgaben/mehrwertsteuer.md deleted file mode 100644 index 7682f7a4..00000000 --- a/web/lessons/de/aufgaben/mehrwertsteuer.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -titel: Mehrwertsteuer -nach: 6 -stufe: 1 ---- - -Auf fast alles, was du kaufst, kommen 19 % **Mehrwertsteuer**. Der Laden rechnet mit dem Nettopreis (ohne Steuer) und schlägt die Steuer drauf. So entsteht der Bruttopreis, den du an der Kasse zahlst. - -Ein Beispiel: Du kaufst ein Falt-Handy, das aufgeklappt zum Tablet wird. Auf dem Preisschild des Händlers stehen 1000 € netto. Dazu kommen 19 %, also 190 €. An der Kasse zahlst du 1190 €. Die 190 € darf der Händler nicht behalten: Er führt sie an das Finanzamt ab. - -::: grafik aufgabe-mehrwertsteuer.svg -Nettopreis plus Mehrwertsteuer ergibt den Bruttopreis. Die Mehrwertsteuer geht an das Finanzamt. -::: - -::: angeberwissen -Mäh, der Händler hat das Handy ja selbst eingekauft: beim Hersteller für 800 € plus 152 € Mehrwertsteuer. Diese 152 € heißen **Vorsteuer**, und die darf er von den 190 € abziehen. Ans Finanzamt überweist er also nur 38 €. Die ganze Steuer zahlt am Ende nur einer: der Kunde an der Kasse. Also du. Ich zahle übrigens gar keine, ich fresse nur Gras. -::: - -Der Steuersatz ändert sich beim Rechnen nie. Darum legst du ihn als **Konstante** an: Das ist eine Variable, deren Wert nach dem Festlegen gleich bleibt. Du schreibst `const` davor, zum Beispiel `const double MWST = 0.19`. Namen von Konstanten schreibt man in Großbuchstaben, dann erkennt man sie sofort. Im Java-Code wird daraus `final double MWST = 0.19;`. - -Wenn sich der Steuersatz einmal ändert, musst du nur diese eine Zeile anpassen. - -::: übung aufgabe-mehrwertsteuer -titel: Mehrwertsteuer -auftrag: Lege die Konstante `MWST` mit dem Wert 0.19 an. Frage dann nach dem Nettopreis. Gib zuerst die Steuer und danach den Bruttopreis aus, jeweils nur die Zahl. - Bei einem Nettopreis von 100 lauten die Ausgaben **19** und **119**. -test: 100 -> 19 | 119 -test: 50 -> 9.5 | 59.5 -test: 0 -> 0 | 0 -tipp: Die Steuer ist 19 Prozent vom Nettopreis. Der Bruttopreis ist das, was man am Ende bezahlt. -tipp: Die Steuer ist `nettopreis * MWST`. Den Bruttopreis bekommst du, wenn du die Steuer zum Nettopreis addierst. Beide Werte sind Kommazahlen, also `double`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Warum legst du den Steuersatz als Konstante an? -- [ ] Weil Konstanten schneller gerechnet werden -- [x] Weil sich sein Wert im Programm nicht ändern soll -- [ ] Weil man Kommazahlen nur als Konstante speichern kann -> Eine Konstante behält ihren Wert. Ändert sich der Steuersatz einmal, passt du nur die eine Zeile mit `const` an. -::: diff --git a/web/lessons/de/aufgaben/notendurchschnitt.md b/web/lessons/de/aufgaben/notendurchschnitt.md deleted file mode 100644 index 5de7647a..00000000 --- a/web/lessons/de/aufgaben/notendurchschnitt.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Notendurchschnitt -nach: 13 -stufe: 2 ---- - -Wie gut war die letzte Zeit? Der Durchschnitt ist die Summe aller Noten geteilt durch ihre Anzahl. - -::: übung aufgabe-durchschnitt -titel: Notendurchschnitt -auftrag: Frage zuerst, wie viele Noten eingegeben werden. Lies dann genau so viele Noten ein und gib den Durchschnitt aus, nur die Zahl. - Bei den Noten 1 und 2 ist der Durchschnitt **1.5**. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: Du brauchst die Summe aller Noten und ihre Anzahl. Der Durchschnitt ist die Summe geteilt durch die Anzahl. -tipp: Die For-Schleife läuft von `int i = 0` bis `i < anzahl`. Darin liest du eine Note ein und zählst sie zur Summe. Den Durchschnitt speicherst du als Kommazahl: `double schnitt = summe * 1.0 / anzahl`. Das `* 1.0` sorgt dafür, dass auch in Java nicht ganzzahlig geteilt wird. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-durchschnitt-java -titel: Notendurchschnitt in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: `for (int i = 0; i < anzahl; i++)` liest genau so viele Noten ein, wie vorher angegeben. -tipp: Teile mit `double schnitt = summe * 1.0 / anzahl;`. Ohne `* 1.0` teilt Java zwei `int` ganzzahlig, und aus 1.5 wird 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/pin-pruefen.md b/web/lessons/de/aufgaben/pin-pruefen.md deleted file mode 100644 index 9b70098e..00000000 --- a/web/lessons/de/aufgaben/pin-pruefen.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -titel: PIN prüfen -nach: 12 -stufe: 2 ---- - -Am Geldautomaten hast du drei Versuche für deine PIN. Gibst du dreimal eine falsche PIN ein, wird die Karte gesperrt. - -::: angeberwissen -John Shepherd-Barron, der 1967 den ersten Geldautomaten in London aufstellte, wollte eigentlich sechsstellige PINs. Seine Frau sagte aber, sie könne sich höchstens vier Ziffern merken. Deshalb hat deine PIN heute vier Stellen. -::: - -::: übung aufgabe-pin -titel: PIN prüfen -auftrag: Die richtige PIN ist 1234. Frage so lange nach der PIN, bis sie richtig ist oder drei Versuche verbraucht sind. Gib danach **PIN richtig** oder **Karte gesperrt** aus. -test: 1234 -> PIN richtig -test: 1111, 1234 -> PIN richtig -test: 1, 2, 1234 -> PIN richtig -test: 1, 2, 3 -> Karte gesperrt -braucht: doUntilSchleife, verzweigung -tipp: Die Schleife endet in zwei Fällen: wenn die PIN stimmt oder wenn drei Versuche verbraucht sind. Zähle die Versuche mit. -tipp: Die PIN wird mindestens einmal abgefragt, deshalb passt eine Do-while-Schleife. Lege vorher `int pin = 0` und `int versuche = 0` an. Die Schleife wiederholt sich, solange `pin != 1234 && versuche < 3` gilt. Nach der Schleife entscheidet eine Verzweigung, was ausgegeben wird. -lösung: aufgabe-pin-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-pin-java -titel: PIN prüfen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 1234 -> PIN richtig -test: 1111, 1234 -> PIN richtig -test: 1, 2, 1234 -> PIN richtig -test: 1, 2, 3 -> Karte gesperrt -braucht: doUntilSchleife, verzweigung -tipp: `do { … } while (…);` fragt mindestens einmal. Hinter `while (…)` steht ein Semikolon. -tipp: Lege vorher `int pin = 0;` und `int versuche = 0;` an. In der Schleife: `int eingabe = scanner.nextInt();`, `pin = eingabe;` und `versuche++;`. Die Bedingung ist `pin != 1234 && versuche < 3`. -lösung: aufgabe-pin-java-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/schiffe-versenken.md b/web/lessons/de/aufgaben/schiffe-versenken.md deleted file mode 100644 index 5209b37b..00000000 --- a/web/lessons/de/aufgaben/schiffe-versenken.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Schiffe versenken -nach: 16 -stufe: 2 ---- - -Beim Spiel Schiffe versenken ist das Meer ein Gitter. Die Spalten heißen A bis E, die Reihen 1 bis 5. Im Startdiagramm steht das Meer als 2D-Array `meer`: `true` heißt, auf diesem Feld liegt ein Teil eines Schiffs. - -::: grafik schiffe-versenken.svg -Grau heißt `true`: Hier liegt ein Schiff. Die kleinen grauen Zahlen sind die Indizes im Array, sie beginnen bei 0. Im Spiel heißen die Felder dagegen A bis E und 1 bis 5. -::: - -::: übung aufgabe-schiffe -titel: Schiffe versenken -auftrag: Gib alle Felder aus, auf denen ein Schiff liegt, jedes Feld in einer eigenen Zeile, z. B. **B1**. Gehe dafür mit zwei verschachtelten Schleifen Reihe für Reihe durch das Meer. - Für das Startdiagramm erscheinen **B1**, **C1**, **D1**, **E3**, **E4** und **A5**. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Gehe das Meer wie den Kinosaal mit zwei verschachtelten Schleifen durch. Gib nur die Felder aus, auf denen `true` steht. -tipp: Die äußere Schleife zählt `reihe`, die innere `spalte`, beide ab 0. Liegt auf `meer[reihe][spalte]` ein Schiff, gibst du den Buchstaben aus `spalten[spalte]` und die Reihennummer aus: `output: spalten[spalte] + (reihe + 1)`. Das `+ 1` braucht es, weil das Spiel bei 1 zu zählen beginnt. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-schiffe-java -titel: Schiffe versenken in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Zwei `for`-Schleifen ineinander: außen die Reihe, innen die Spalte, beide bis `.length`. -tipp: `if (meer[reihe][spalte]) { System.out.println(spalten[spalte] + (reihe + 1)); }`. Die Klammer um `reihe + 1` sorgt dafür, dass Java erst rechnet. -lösung: aufgabe-schiffe-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/speisekarte.md b/web/lessons/de/aufgaben/speisekarte.md deleted file mode 100644 index 2139f210..00000000 --- a/web/lessons/de/aufgaben/speisekarte.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Speisekarte -nach: 10 -stufe: 1 ---- - -In der Mensa bestellst du über eine Nummer. Das Programm sagt dir, welches Gericht zu der Nummer gehört. - -::: übung aufgabe-speisekarte -titel: Speisekarte -auftrag: Frage nach einer Nummer. Gib bei 1 **Griechischer Salat**, bei 2 **Reis-Bowl** und bei 3 **Falafel-Wrap** aus. Bei jeder anderen Nummer gib **Bitte eine gültige Nummer wählen** aus. -test: 1 -> Griechischer Salat -test: 2 -> Reis-Bowl -test: 3 -> Falafel-Wrap -test: 7 -> Bitte eine gültige Nummer wählen -braucht: fallauswahl -tipp: Für mehrere feste Nummern passt eine Fallauswahl. Was passiert mit allen anderen Nummern? -tipp: Lies die Nummer mit `input: int nummer "Welches Gericht?"` ein. Die Fallauswahl prüft `nummer`, die Fälle heißen `1`, `2` und `3`. Alle anderen Nummern landen im Fall `default`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-speisekarte-java -titel: Speisekarte in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 1 -> Griechischer Salat -test: 2 -> Reis-Bowl -test: 3 -> Falafel-Wrap -test: 7 -> Bitte eine gültige Nummer wählen -braucht: fallauswahl -tipp: In Java ist das eine Fallauswahl mit `switch (nummer) { … }`. -tipp: Jeder Fall sieht so aus: `case 1 -> { System.out.println("…"); }`. Für alle anderen Nummern gibt es `default -> { … }`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/summe-bilden.md b/web/lessons/de/aufgaben/summe-bilden.md deleted file mode 100644 index 56fee122..00000000 --- a/web/lessons/de/aufgaben/summe-bilden.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Summe bilden -nach: 2 -stufe: 1 ---- - -Lege zwei Zahlen fest, addiere sie und gib das Ergebnis aus. - -::: übung aufgabe-summe -titel: Summe bilden -auftrag: Lege `zahl1` mit dem Wert 4 und `zahl2` mit dem Wert 3 fest. Berechne die Summe in einer dritten Variablen und gib nur die Summe aus. -test: - -> 7 -tipp: Du brauchst drei Variablen: zwei für die Zahlen und eine für das Ergebnis. -tipp: Eine Variable legst du mit einer Anweisung wie `int zahl1 = 4` fest. Für die Ausgabe schreibst du den Namen der Variablen ohne Anführungszeichen. -lösung: aufgabe-summe-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/tafeldienst.md b/web/lessons/de/aufgaben/tafeldienst.md deleted file mode 100644 index a63ed175..00000000 --- a/web/lessons/de/aufgaben/tafeldienst.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Tafeldienst auslosen -nach: 15 -stufe: 2 ---- - -Wer hat diese Woche Tafeldienst? Fünf Namen kommen in ein Array, dann wird eine Losnummer gezogen. - -::: übung aufgabe-tafeldienst -titel: Tafeldienst auslosen -auftrag: Lies fünf Namen in ein String-Array ein. Frage danach nach einer Losnummer von 1 bis 5 und gib **Tafeldienst:** und den passenden Namen aus. - Die Losnummer 1 gehört zum ersten Namen, die 5 zum letzten. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Tafeldienst: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Tafeldienst: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Tafeldienst: Pia -braucht: forSchleife -tipp: Erst liest eine Schleife die fünf Namen ein. Danach brauchst du keine Schleife mehr, nur noch einen Zugriff auf ein Fach. -tipp: Mit `String[] namen = new String[5]` legst du das Array an. Achtung: Die Losnummer beginnt bei 1, der Index bei 0. Der Name steht also in `namen[nummer - 1]`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-tafeldienst-java -titel: Tafeldienst auslosen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Tafeldienst: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Tafeldienst: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Tafeldienst: Pia -braucht: forSchleife -tipp: Ein Array für fünf Namen legst du mit `String[] namen = new String[5];` an. -tipp: In der Schleife: `namen[i] = scanner.next();`. Die Losnummer 1 gehört zum Fach 0, darum gibst du `namen[nummer - 1]` aus. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> Mit `int nummer = (int) (Math.random() * 5) + 1` kannst du die Losnummer auch vom Zufall ziehen lassen. Für die automatische Prüfung brauchen wir aber eine feste Eingabe. diff --git a/web/lessons/de/aufgaben/taschenrechner.md b/web/lessons/de/aufgaben/taschenrechner.md deleted file mode 100644 index 9777a910..00000000 --- a/web/lessons/de/aufgaben/taschenrechner.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Taschenrechner -nach: 10 -stufe: 2 ---- - -Ein kleiner Taschenrechner: zwei Zahlen und ein Rechenzeichen eingeben, das Ergebnis erscheint. - -::: übung aufgabe-rechner -titel: Taschenrechner -auftrag: Frage nach zwei ganzen Zahlen und danach nach einem Rechenzeichen als Text: `+`, `-` oder `*`. Gib das Ergebnis aus. Bei einem anderen Zeichen gib **Unbekanntes Rechenzeichen** aus. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Lies alle drei Werte ein. Eine Fallauswahl über das Rechenzeichen entscheidet dann, was gerechnet wird. -tipp: Das Rechenzeichen liest du mit `input: String zeichen "Rechenzeichen"` ein. Die Fallauswahl prüft `zeichen`, die Fälle heißen `"+"`, `"-"` und `"*"`, der letzte Fall ist `default`. Rechne in jedem Fall erst in einer Variablen und gib sie dann aus, sonst hängt `+` die Zahlen nur aneinander. -lösung: aufgabe-rechner-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-rechner-java -titel: Taschenrechner in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Das Rechenzeichen ist ein Text. Du liest es mit `String zeichen = scanner.next();` ein. -tipp: `switch (zeichen) { case "+" -> { … } … default -> { … } }`. Bei Texten stehen die Fälle in Anführungszeichen. -lösung: aufgabe-rechner-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/verleih-menue.md b/web/lessons/de/aufgaben/verleih-menue.md deleted file mode 100644 index 3f437eba..00000000 --- a/web/lessons/de/aufgaben/verleih-menue.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Verleih-Menü -nach: 18 -stufe: 2 ---- - -Am Verleih-Automaten kannst du nacheinander mehrere Fahrzeuge buchen. Das Menü erscheint immer wieder, bis du **0** für Ende wählst. - -::: übung aufgabe-verleih -titel: Verleih-Menü -auftrag: Frage immer wieder nach einer Auswahl: 1 = E-Bike, 2 = E-Scooter, 0 = Ende. Gib bei 1 **E-Bike gebucht** und bei 2 **E-Scooter gebucht** aus, bei jeder anderen Zahl **Ungültige Auswahl**. - Bei 0 gibt das Programm **Tschüss** aus und verlässt die Schleife mit einem Aussprung. -test: 0 -> Tschüss -test: 1, 2, 0 -> E-Bike gebucht | E-Scooter gebucht | Tschüss -test: 2, 5, 1, 0 -> E-Scooter gebucht | Ungültige Auswahl | E-Bike gebucht | Tschüss -braucht: endlosschleife, aussprung -tipp: Das Menü läuft immer wieder, bis jemand 0 wählt. Dafür eignet sich eine Endlosschleife mit einem Aussprung. -tipp: Nimm eine Endlosschleife. Darin steht zuerst die Eingabe `input: int wahl "1 = E-Bike, 2 = E-Scooter, 0 = Ende"`, danach eine Fallauswahl über `wahl` mit den Fällen `0`, `1`, `2` und `default`. Im Fall `0` stehen die Ausgabe und darunter der Aussprung. -lösung: aufgabe-verleih-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-verleih-java -titel: Verleih-Menü in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 0 -> Tschüss -test: 1, 2, 0 -> E-Bike gebucht | E-Scooter gebucht | Tschüss -test: 2, 5, 1, 0 -> E-Scooter gebucht | Ungültige Auswahl | E-Bike gebucht | Tschüss -braucht: endlosschleife, aussprung -tipp: `while (true) { … }` läuft endlos, bis ein `break;` kommt. -tipp: Nimm in Java hier `if`/`else if` statt `switch`: Ein `break;` in einem `switch` verlässt nur den `switch`, nicht die Schleife. `if (wahl == 0) { System.out.println("Tschüss"); break; } else if (wahl == 1) { … }`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/vokabeltrainer.md b/web/lessons/de/aufgaben/vokabeltrainer.md deleted file mode 100644 index 187b0bf3..00000000 --- a/web/lessons/de/aufgaben/vokabeltrainer.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Vokabeltrainer -nach: 27 -stufe: 3 ---- - -Ludwig lernt Englisch. Seine Vokabeln stehen in einer CSV-Datei, links Deutsch, rechts Englisch: - -::: datei vokabeln.csv -Deutsch;Englisch -Ziege;goat -Heu;hay -Wiese;meadow -::: - -Weil nur die Datei die Wörter kennt, kannst du später einfach neue Zeilen anhängen, ohne das Programm zu ändern. - -::: angeberwissen -Die Lernkartei mit mehreren Fächern hat Sebastian Leitner 1972 bekannt gemacht: Gewusste Karten wandern ein Fach weiter und kommen seltener dran, falsche wandern zurück ins erste Fach. Viele Vokabel-Apps arbeiten bis heute nach diesem Prinzip. -::: - -::: übung aufgabe-vokabeln -titel: Vokabeltrainer -code: java -auftrag: Frage jede Vokabel aus der Datei ab: Gib **Was heißt Ziege?** aus und lies die Antwort mit `scanner.next()` ein. Ist sie richtig, gib **Richtig!** aus, sonst zum Beispiel **Falsch, richtig ist goat.** - Am Ende steht da, wie viele richtig waren, zum Beispiel **2 von 3 richtig**. -start: aufgabe-vokabeln-start.visustruct -test: goat, hay, meadow -> Was heißt Ziege? | Richtig! | Was heißt Heu? | Richtig! | Was heißt Wiese? | Richtig! | 3 von 3 richtig -test: cow, hay, meadow -> Was heißt Ziege? | Falsch, richtig ist goat. | Was heißt Heu? | Richtig! | Was heißt Wiese? | Richtig! | 2 von 3 richtig -test: goat, heu, wiese -> Was heißt Ziege? | Richtig! | Was heißt Heu? | Falsch, richtig ist hay. | Was heißt Wiese? | Falsch, richtig ist meadow. | 1 von 3 richtig -braucht: whileSchleife, verzweigung -tipp: Überspringe die Kopfzeile. In der Schleife zerlegst du jede Zeile mit `split(";")`: `teile[0]` ist das deutsche Wort, `teile[1]` das englische. -tipp: Texte vergleichst du mit `antwort.equals(teile[1])`, nicht mit `==`. Zähle vor der Schleife mit `int richtig = 0;` und `int anzahl = 0;` mit. -lösung: aufgabe-vokabeln-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/volljaehrig.md b/web/lessons/de/aufgaben/volljaehrig.md deleted file mode 100644 index 64c725ef..00000000 --- a/web/lessons/de/aufgaben/volljaehrig.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Volljährig? -nach: 8 -stufe: 1 ---- - -Im Kino, beim Führerschein oder bei der Wahl: Oft kommt es darauf an, ob jemand schon 18 ist. - -::: übung aufgabe-volljaehrig -titel: Volljährig? -auftrag: Frage nach dem Alter. Ist die Person 18 oder älter, gib **volljährig** aus, sonst **minderjährig**. -test: 18 -> volljährig -test: 35 -> volljährig -test: 17 -> minderjährig -test: 6 -> minderjährig -braucht: verzweigung -tipp: Es gibt zwei mögliche Ausgaben, also brauchst du eine Verzweigung. -tipp: Lies das Alter mit `input: int alter "Wie alt bist du?"` ein. Die Bedingung der Verzweigung lautet `alter >= 18`. Achte darauf, dass 18 schon volljährig ist. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-volljaehrig-java -titel: Volljährig? in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 18 -> volljährig -test: 35 -> volljährig -test: 17 -> minderjährig -test: 6 -> minderjährig -braucht: verzweigung -tipp: Lies das Alter mit `int alter = scanner.nextInt();` ein. -tipp: `if (alter >= 18) { … } else { … }`, in jedem Zweig ein `System.out.println(…)`. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: diff --git a/web/lessons/de/aufgaben/wuerfel-mvc.md b/web/lessons/de/aufgaben/wuerfel-mvc.md deleted file mode 100644 index e3d055bf..00000000 --- a/web/lessons/de/aufgaben/wuerfel-mvc.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -titel: Würfeln mit MVC -nach: 40 -stufe: 3 ---- - -Baue ein Würfelspiel nach Model View Controller. Ein Knopf **Würfeln** würfelt, und zwei Views zeigen das Ergebnis. - -Das Model ist schon fertig. Es würfelt und zählt mit, wie oft gewürfelt wurde und wie viele Sechsen dabei waren: - -```java -class Wuerfel { - int augen = 1; - int wuerfe = 0; - int sechsen = 0; - - void wuerfeln() { - augen = (int) (Math.random() * 6) + 1; - wuerfe++; - if (augen == 6) { - sechsen++; - } - } -} -``` - -Deine Aufgabe: - -1. Teste das Model zuerst ohne Fenster: Würfle in `main` zehnmal und gib danach `wuerfe` und `sechsen` aus. -2. Schreibe die View `AugenAnzeige`. Sie zeigt in einem großen JLabel die gewürfelte Zahl, zum Beispiel „4“. -3. Schreibe die View `StatistikAnzeige`. Sie zeigt zum Beispiel „Sechsen: 2 von 10 Würfen“. -4. Der Controller ist der Zuhörer am Knopf: Er lässt das Model würfeln und gibt beiden Views die neuen Werte. - -**Du bist fertig, wenn …** - -- in der Konsole nach zehn Würfen `wuerfe` gleich 10 ist und `sechsen` zwischen 0 und 10 liegt, -- jeder Klick auf **Würfeln** eine neue Zahl von 1 bis 6 in der `AugenAnzeige` zeigt, -- die `StatistikAnzeige` nach jedem Klick einen Wurf mehr zählt und Sechsen richtig mitzählt, -- im Model kein `JLabel` und in den Views kein `Math.random` steht. - -Zusatz: Ein Knopf **Neues Spiel** setzt alles auf Anfang. Die Methode dafür gehört ins Model. - -::: ludwig -Denk an die Regel aus Lektion 40: Im Model steht kein einziges `JLabel`. Wenn du beim Würfeln die Schriftgröße änderst, gehört das in die View. -::: diff --git a/web/lessons/de/aufgaben/zahl-verdoppeln.md b/web/lessons/de/aufgaben/zahl-verdoppeln.md deleted file mode 100644 index 4bb26cdb..00000000 --- a/web/lessons/de/aufgaben/zahl-verdoppeln.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Zahl verdoppeln -nach: 2 -stufe: 1 ---- - -Eine Variable kann ihren Wert ändern. Hier wird eine Zahl verdoppelt. - -::: übung aufgabe-verdoppeln -titel: Zahl verdoppeln -auftrag: Lege die Variable `zahl` mit dem Wert 4 fest. Verdopple sie in einer zweiten Anweisung, ohne eine neue Variable anzulegen. Gib danach **Verdoppelte Zahl: 8** aus, wobei die 8 aus der Variablen kommt. -test: - -> Verdoppelte Zahl: 8 -tipp: Verdoppeln heißt: mal 2. Das Ergebnis speicherst du wieder in derselben Variablen. -tipp: `zahl = zahl * 2` rechnet mit dem alten Wert und speichert das Ergebnis wieder in `zahl`. Text und Variable verbindest du mit `+`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: diff --git a/web/lessons/de/begriffe.md b/web/lessons/de/begriffe.md deleted file mode 100644 index 83ec1c59..00000000 --- a/web/lessons/de/begriffe.md +++ /dev/null @@ -1,258 +0,0 @@ -Fachbegriffe für den Lernbereich. Kommt ein Begriff in einem Schritt vor, wird er dort einmal markiert und zeigt beim -Hovern oder Antippen seine Erklärung. Steht er im Schritt fett, wird er gerade erklärt und deshalb nicht markiert. -`auch:` nennt weitere Formen, die ebenfalls erkannt werden. Groß- und Kleinschreibung zählt. - -### Algorithmus -auch: Algorithmen -Eine genaue Schritt-für-Schritt-Anleitung, mit der man eine Aufgabe löst. Jeder Schritt ist eindeutig. - -### Struktogramm -auch: Struktogramme, Struktogramms, Struktogrammen -Ein Algorithmus als Bild aus Kästen. Es wird von oben nach unten gelesen. - -### Programmablaufplan -auch: PAP, Programmablaufpläne, Programmablaufplans -Ein Algorithmus als Bild aus Symbolen, die mit Pfeilen verbunden sind (DIN 66001). Eine Raute ist eine Verzweigung. - -### Pseudocode -Ein Algorithmus als Text in normaler Sprache mit festen Wörtern wie WENN und SOLANGE. Die Einrückung zeigt, was zusammengehört. - -### Anweisung -auch: Anweisungen -Ein einzelner Schritt im Struktogramm, zum Beispiel eine Rechnung, eine Eingabe oder eine Ausgabe. - -### Sequenz -auch: Sequenzen -Schritte, die nacheinander von oben nach unten ausgeführt werden, jeder genau einmal. - -### Verzweigung -auch: Verzweigungen, bedingte Anweisung, bedingte Anweisungen -Ein Baustein, der mit einer Bedingung entscheidet, welcher von zwei Wegen ausgeführt wird. Im Lehrplan heißt sie auch bedingte Anweisung. - -### Zweig -auch: Zweige, Zweigen -Einer der beiden Wege einer Verzweigung: links für true, rechts für false. - -### Schleife -auch: Schleifen, Wiederholung, Wiederholungen, Wiederholungsstruktur, Wiederholungsstrukturen -Ein Baustein, der Schritte wiederholt, solange eine Bedingung gilt. Im Lehrplan heißt sie auch Wiederholungsstruktur. - -### Rumpf -Der Inhalt einer Schleife, also die Schritte, die wiederholt werden. - -### Durchlauf -auch: Durchläufe, Durchlaufs, Durchläufen -Ein einmaliges Ausführen des Inhalts einer Schleife. - -### Bedingung -auch: Bedingungen -Eine Frage, die nur mit ja (true) oder nein (false) beantwortet wird, zum Beispiel alter >= 18. - -### Platzhalter -Ein leerer Kasten mit dem Zeichen ø. Ziehst du ein Element darauf, wird er ersetzt. - -### Objektinspektor -Der Bereich unter dem Diagramm. Hier bearbeitest du Text und Einstellungen des Kastens, den du gerade angeklickt hast. - -### Simulation -Führt dein Struktogramm im Editor aus, auf Wunsch Schritt für Schritt. So siehst du, was passiert. - -### Variable -auch: Variablen -Eine beschriftete Kiste für einen Wert. Sie hat einen Namen, einen Datentyp und einen Wert. - -### CamelCase -auch: camelCase -Schreibweise für Namen aus mehreren Wörtern: zusammengeschrieben, jedes weitere Wort beginnt groß, z. B. `preisMitSteuer`. - -### case-sensitive -auch: Groß- und Kleinschreibung -Java unterscheidet Groß- und Kleinbuchstaben: `zahl`, `Zahl` und `ZAHL` sind drei verschiedene Namen. `system` statt `System` ist ein Fehler. - -### Konstante -auch: Konstanten -Eine Variable, deren Wert nach dem Festlegen gleich bleibt. Man schreibt `const` davor, z. B. `const double MWST = 0.19`. - -### Datentyp -auch: Datentypen, Datentyps -Legt fest, welche Art von Wert in eine Variable passt: int (ganze Zahl), double (Kommazahl), String (Text), boolean (true oder false) oder char (ein einzelnes Zeichen). - -### Zuweisung -auch: Zuweisungen -Das Zeichen =. Es rechnet die rechte Seite aus und speichert das Ergebnis in der Variablen links. - -### Hilfsvariable -auch: Hilfsvariablen -Eine zusätzliche Variable, die einen Wert kurz aufbewahrt, zum Beispiel beim Tauschen. - -### EVA-Prinzip -Eingabe, Verarbeitung, Ausgabe: erst Werte abfragen, dann rechnen, dann das Ergebnis anzeigen. - -### Problemanalyse -Du liest eine Aufgabe genau und klärst, was gegeben ist, was gesucht ist und wie man vom einen zum anderen kommt. - -### Vergleichsoperator -auch: Vergleichsoperatoren -Ein Zeichen, das zwei Werte vergleicht, zum Beispiel == oder <. Das Ergebnis ist true oder false. - -### Fallauswahl -auch: Mehrfachauswahl -Ein Baustein, der je nach Wert einer Variablen genau einen von mehreren Fällen ausführt. Im Lehrplan heißt sie auch Mehrfachauswahl. - -### kopfgesteuert -auch: kopfgesteuerte, kopfgesteuerten -Die Schleife prüft ihre Bedingung vor jedem Durchlauf. Ist sie gleich zu Beginn falsch, läuft die Schleife kein einziges Mal. - -### fußgesteuert -auch: fußgesteuerte, fußgesteuerten -Die Schleife prüft ihre Bedingung erst nach jedem Durchlauf. Sie läuft also mindestens einmal. - -### Zählvariable -auch: Zählvariablen -Eine Variable, die in einer Schleife mitzählt, meistens i. - -### Endlosschleife -auch: Endlosschleifen -Eine Schleife, deren Bedingung nie falsch wird. Sie hört nie von selbst auf. - -### Merker -Eine Variable vom Typ boolean, die mit false anfängt und auf true gesetzt wird, sobald etwas passiert ist. - -### Zustandsautomat -auch: Zustandsautomaten, Zustandsvariable, Zustandsvariablen -Ein Programm, das immer in genau einem Zustand ist und nach festen Regeln in den nächsten Zustand wechselt, z. B. eine Ampel. - -### Array -auch: Arrays -Eine Reihe von Fächern mit einem gemeinsamen Namen und demselben Datentyp. Im Lehrplan heißt es auch Feld. - -### Index -Die Nummer eines Fachs in einem Array. Gezählt wird ab 0. - -### char -Der Datentyp für ein einzelnes Zeichen. Er steht in einfachen Anführungszeichen, z. B. 'C'. "C" mit doppelten Anführungszeichen ist dagegen ein String. - -### Zeichencode -auch: Zeichencodes, ASCII-Code, ASCII-Tabelle -Die Zahl, die hinter einem Zeichen steckt. In der ASCII-Tabelle hat A den Code 65, B 66 und so weiter. In Java wird mit (int) aus einem Zeichen sein Code und mit (char) aus einem Code das Zeichen. - -### Zeichenkette -auch: Zeichenketten -Ein Text, also eine Reihe von Zeichen. In Java heißt der Datentyp String. Die Zeichen werden ab 0 gezählt. - -### 2D-Array -auch: 2D-Arrays, zweidimensionales Array, zweidimensionale Arrays -Ein Array mit Zeilen und Spalten, wie eine Tabelle. Ein Fach braucht zwei Indizes, z. B. `sitze[1][2]`. - -### Unterprogramm -auch: Unterprogramme, Unterprogramms, Unterprogrammen, Methode, Methoden, Prozedur, Prozeduren, Funktion, Funktionen -Ein eigenes Struktogramm für eine Teilaufgabe. Es wird mit einem Aufruf ausgeführt. Im Lehrplan und in Java heißt es auch Methode, je nach Art auch Prozedur oder Funktion. - -### Parameter -auch: Parametern -Eine Variable in der Kopfzeile eines Unterprogramms. Beim Aufruf bekommt sie den Wert aus den Klammern. - -### Überladung -auch: überladen, überladene, überladenen, overloading -Mehrere Methoden mit demselben Namen, aber verschiedenen Parametern, z. B. `mbot.forward(30)` und `mbot.forward(2, "Umdrehungen")`. Java wählt beim Aufruf die passende nach Anzahl und Typ der Parameter. - -### Spaghetticode -Ein Programm, das so kreuz und quer springt, dass man den Ablauf kaum noch verfolgen kann. Struktogramme verhindern das. - -### Wertübergabe -auch: call by value -Englisch call by value. Ein Unterprogramm bekommt eine Kopie des Werts. Ändert es seinen Parameter, bleibt die Variable des Aufrufers unverändert. - -### Referenzübergabe -auch: call by reference -Englisch call by reference. Ein Unterprogramm bekommt einen Verweis auf dieselben Daten, z. B. auf ein Array. Ändert es ein Fach, sieht auch der Aufrufer die Änderung. - -### Rückgabewert -auch: Rückgabewerte -Das Ergebnis, das ein Unterprogramm mit return an den Aufruf zurückgibt. - -### Aussprung -Verlässt sofort die Schleife, in der er steht. Danach geht es unter der Schleife weiter. - -### Syntaxfehler -auch: Syntaxfehlern, Syntaxfehlers -Ein Fehler in der Schreibweise, zum Beispiel ein fehlendes `;`. Das Programm startet gar nicht. Englisch: syntax error. - -### Laufzeitfehler -auch: Laufzeitfehlern, Laufzeitfehlers -Ein Fehler, der erst beim Ausführen auftritt, zum Beispiel Teilen durch 0. Das Programm bricht an dieser Stelle ab. Englisch: runtime error. - -### Logikfehler -auch: Logikfehlern, Logikfehlers -Das Programm läuft ohne Meldung, liefert aber ein falsches Ergebnis. Du findest ihn mit dem Schreibtischtest. Englisch: logic error. - -### Schreibtischtest -auch: Schreibtischtests -Du führst ein Struktogramm auf Papier aus und notierst nach jedem Schritt die Werte der Variablen. - -### lineare Suche -auch: Lineare Suche -Ein Suchverfahren, das alle Werte der Reihe nach mit dem gesuchten Wert vergleicht. Es funktioniert auch bei unsortierten Werten. - -### binäre Suche -auch: Binäre Suche -Ein Suchverfahren für sortierte Werte. Es sieht sich die Mitte an und sucht nur in der passenden Hälfte weiter. - -### Bubblesort -Ein einfaches Sortierverfahren. Es vergleicht immer zwei Nachbarn und tauscht sie, wenn sie falsch herum stehen. - -### Ereignis -auch: Ereignisse, Ereignissen, Ereignisses -Etwas, das der Mensch an einem Fensterprogramm tut, zum Beispiel einen Knopf anklicken. Das Programm reagiert darauf mit einem Zuhörer (ActionListener). - -### Interface -auch: Interfaces -Eine Art Vertrag in Java: Er legt fest, welche Methoden eine Klasse haben muss. `ActionListener` ist ein Interface mit der Methode `actionPerformed`. - -### Exception -auch: Exceptions -Ein Fehler, der erst beim Ausführen auftritt, zum Beispiel ein Index außerhalb des Arrays. Fängt ihn kein `catch` auf, bricht das Programm ab. - -### Attribut -auch: Attribute, Attributs -Eine Variable, die direkt in der Klasse steht und nicht in einer Methode. Mit `static` gehört sie zur Klasse selbst und lebt so lange wie das Programm, zum Beispiel ein Klickzähler, den mehrere Zuhörer ändern. - -### Scanner -Ein fertiger Baustein von Java, der Eingaben über die Tastatur liest, z. B. mit `scanner.nextInt()` eine Zahl. Er braucht ganz oben `import java.util.Scanner;`. - -### Kommentar -auch: Kommentare, Kommentaren, Kommentars -Eine Notiz im Code für Menschen. Java überspringt sie beim Ausführen. `//` gilt bis zum Ende der Zeile, `/* … */` kann über mehrere Zeilen gehen. - -### import -Eine Zeile ganz oben im Java-Code, die einen fertigen Baustein aus einem Paket holt, z. B. `import java.util.Scanner;`. Ohne sie kennt Java den Namen nicht. - -### Quellcode -Der Programmtext, den Menschen schreiben und lesen, zum Beispiel in einer Datei `Einmaleins.java`. - -### Compiler -auch: Compilers -Ein Programm, das Quellcode übersetzt. In Java heißt er `javac` und macht aus einer `.java`-Datei Bytecode in einer `.class`-Datei. - -### Bytecode -Die übersetzte Form eines Java-Programms in einer `.class`-Datei. Ihn liest nicht der Mensch, sondern die JVM. - -### JVM -auch: Java Virtual Machine, virtuelle Maschine -Die Java Virtual Machine führt Bytecode aus. Sie ist ein Programm, das wie ein kleiner Computer aus Software auf Windows, macOS oder Linux läuft. Deshalb ist Java plattformunabhängig. - -### JRE -Java Runtime Environment: die JVM und fertige Bausteine. Damit kann man Java-Programme ausführen, aber nicht übersetzen. - -### JDK -Java Development Kit: die JRE und dazu den Compiler `javac` und weitere Werkzeuge. Das braucht man zum Programmieren. - -### plattformunabhängig -Ein Programm läuft ohne Änderung auf verschiedenen Betriebssystemen. Bei Java sorgt die JVM dafür: „Write once, run anywhere“. - -### Maschinencode -Befehle als Zahlen, die der Prozessor direkt ausführt. Jede Prozessorart hat ihren eigenen Maschinencode. - -### JIT-Compiler -auch: JIT -Ein Teil der JVM, der oft benutzten Bytecode während des Ausführens („just in time“) in Maschinencode übersetzt. Dadurch wird Java schneller. diff --git a/web/lessons/de/nachschlagen.md b/web/lessons/de/nachschlagen.md deleted file mode 100644 index 4c461117..00000000 --- a/web/lessons/de/nachschlagen.md +++ /dev/null @@ -1,169 +0,0 @@ -## Grundbausteine - -### Anweisung - -Ein einzelner Schritt. Damit legst du Variablen an oder rechnest. - -``` -int zahl = 5 -double preis = 2.5 -String name = "Ada" -zahl = zahl + 1 -``` - -### Datentypen - -Der Datentyp steht vor dem Namen der Variablen. - -| Datentyp | Bedeutung | Beispiel | -|---|---|---| -| `int` | ganze Zahl | `int anzahl = 3` | -| `double` | Kommazahl (mit Punkt) | `double preis = 2.5` | -| `String` | Text in doppelten Anführungszeichen | `String name = "Ada"` | -| `boolean` | Wahrheitswert | `boolean fertig = false` | -| `char` | ein einzelnes Zeichen in einfachen Anführungszeichen | `char note = 'C'` | - -`'C'` ist ein `char`, `"C"` ein String. Ein Zeichen aus einem Text holst du mit `charAt`: `char erster = name.charAt(0)`. Jedes Zeichen hat einen Zeichencode: `(int) 'A'` ist 65, `(char) 66` ist `'B'`. - -### Eingabe - -Fragt beim Ausführen einen Wert ab und speichert ihn in einer Variablen. Der Text in Anführungszeichen ist die Frage. - -``` -input: int alter "Wie alt bist du?" -input: double preis "Preis eingeben" -input: String name "Wie heißt du?" -``` - -### Ausgabe - -Zeigt einen Text oder einen Wert an. Texte stehen in Anführungszeichen, mit `+` verbindest du Text und Variablen. - -``` -output: "Hallo" -output: summe -output: "Du bist " + alter + " Jahre alt." -``` - -> In der Ausgabe hängt `+` die Teile immer aneinander: `output: a + b` zeigt bei 3 und 4 also 34. Rechne deshalb vorher in einer Variablen, z. B. `int summe = a + b`, und gib dann `summe` aus. - -## Verzweigungen - -### Verzweigung - -Prüft eine Bedingung. Ist sie wahr, wird der linke Zweig (true) ausgeführt, sonst der rechte (false). - -``` -alter >= 18 -zahl % 2 == 0 -note < 1 || note > 6 -``` - -### Fallauswahl - -Wählt je nach Wert einer Variablen einen von mehreren Fällen. Passt kein Fall, gilt `default`. Fälle fügst du rechts mit **Weiteren Fall hinzufügen** hinzu. - -## Schleifen - -### While-Schleife - -Wiederholt den Inhalt, **solange** die Bedingung wahr ist. Die Bedingung wird vor jedem Durchlauf geprüft. - -``` -zahl != 1 -i < 10 -``` - -### Do-while-Schleife - -Führt den Inhalt **mindestens einmal** aus und prüft die Bedingung erst danach. - -### For-Schleife - -Zählt eine Variable von einem Startwert bis zu einer Grenze. Die drei Felder sind Start, Bedingung und Schritt. - -``` -int i = 0 -i < 5 -i++ -``` - -### Endlosschleife - -Wiederholt den Inhalt ohne Bedingung. Mit einem **Aussprung** im Inneren verlässt du sie. - -### Aussprung - -Verlässt die umgebende Schleife (`break`). - -## Unterprogramme - -### Aufruf - -Steht für ein Unterprogramm, z. B. `berechneSumme()`. Mit Parametern und Rückgabewert hat das Unterprogramm eine Kopfzeile als Titel: - -``` -int quadrat(int x) Kopfzeile des Unterprogramms -return x * x gibt das Ergebnis zurück -int q = quadrat(5) Aufruf, q bekommt 25 -zeigeSumme(3, 4) Aufruf eines void-Unterprogramms -``` - -## Rechnen und Vergleichen - -### Rechenzeichen und Vergleiche - -- `+ - * /` Grundrechenarten -- `%` Rest beim Teilen (`7 % 2` ist 1) -- `==` gleich, `!=` ungleich -- `<` `<=` `>` `>=` kleiner, kleiner gleich, größer, größer gleich -- `&&` und, `||` oder - -## Arrays - -### Arrays - -Mehrere Werte unter einem Namen. Gezählt wird ab 0. - -``` -int[] zahlen = {3, 7, 1} -output: zahlen[0] -int[] leer = new int[5] -``` - -Ein **2D-Array** ist eine Tabelle mit Zeilen und Spalten: - -``` -boolean[][] sitze = new boolean[3][5] -sitze[1][4] = true -output: sitze.length + " Reihen, " + sitze[0].length + " Plätze" -``` - -## Java - -### Vom Code zum Programm - -Der Compiler `javac` übersetzt `Datei.java` in Bytecode (`Datei.class`). Die JVM übersetzt den Bytecode beim Ausführen in Maschinencode, auf Windows, macOS und Linux gleich. C++ wird dagegen direkt zu Maschinencode und muss für jedes System neu kompiliert werden. - -| | enthält | wofür | -|---|---|---| -| JRE | JVM und Bibliotheken | ausführen | -| JDK | JRE, Compiler `javac`, Werkzeuge | programmieren | - -### Kommentare - -Notizen im Code. Java überspringt sie, das Struktogramm bleibt gleich. - -```java -/* - * Aufgabe: die Zahlen von 1 bis 10 addieren - * (mehrzeiliger Kommentar) - */ -// Verarbeitung (einzeiliger Kommentar) -int summe = 0; -for (int i = 1; i <= 10; i++) { - summe = summe + i; // Kommentar hinter dem Code -} // Ende for -``` - -Gut für: die Aufgabenstellung, die Einteilung in Eingabe, Verarbeitung und Ausgabe, eine Erklärung, das Ende eines Blocks hinter `}`, die erwartete Ausgabe und Notizen fürs nächste Mal. diff --git a/web/lessons/de/visubot/00-struktogramm-und-editor.md b/web/lessons/de/visubot/00-struktogramm-und-editor.md deleted file mode 100644 index ae945027..00000000 --- a/web/lessons/de/visubot/00-struktogramm-und-editor.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -titel: Struktogramm und Editor -bereich: Losfahren -kurz: Was ein Struktogramm ist, wie du den Editor bedienst und deine Programme speicherst. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Algorithmus und ein Struktogramm ist -- die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen -- im Editor Elemente einfügen, verschieben und löschen -- ein Struktogramm speichern und wieder öffnen -::: - -## Ein Plan für den Roboter - -Ein Roboter denkt nicht mit. Er tut genau das, was in seinem Programm steht, nicht mehr und nicht weniger. Bevor du ihn programmierst, brauchst du deshalb einen genauen Plan. So eine genaue Schritt-für-Schritt-Anleitung heißt **Algorithmus**. - -Ein **Struktogramm** zeichnet den Plan als Kästen. Du liest es von oben nach unten. Jeder Kasten ist ein Schritt. Erfunden haben es 1973 Isaac Nassi und Ben Shneiderman, deshalb heißt es auch **Nassi-Shneiderman-Diagramm**. - -::: diagramm vb-l00-sequenz-loesung.visustruct -Fahre vor, drehe nach rechts, fahre vor: drei Kästen, von oben nach unten. -::: - -::: angeberwissen -Das erste Programm für eine Maschine schrieb Ada Lovelace schon 1843, für eine Rechenmaschine, die nie fertig gebaut wurde. Sie ahnte damals schon, dass solche Maschinen einmal mehr können als rechnen, zum Beispiel Musik machen. Dein mBot2 kann beides. -::: - -## Drei Bausteine - -Jedes Programm, auch das für einen Roboter, besteht aus nur drei Bausteinen: - -| Baustein | Was er tut | Beispiel mit dem mBot2 | -|---|---|---| -| **Sequenz** | Schritte nacheinander | vorfahren, drehen, vorfahren | -| **Verzweigung** | je nach Bedingung das eine oder das andere | Ist die Wand nah? Dann drehen, sonst vorfahren. | -| **Wiederholung** | Schritte mehrmals | viermal das Gleiche tun | - -Im Struktogramm sieht man die Bausteine sofort: Die Verzweigung hat oben ein Dreieck und zwei Spalten: links **true** (wahr), rechts **false** (falsch). Die Wiederholung (Schleife) umschließt ihre Kästen wie ein gekipptes L. - -::: diagramm vb-l00-bausteine-loesung.visustruct -Alle drei Bausteine: erst ein Kasten, dann eine Schleife, darin eine Verzweigung. -::: - -## Der Editor - -Der [Struktogramm-Editor](#zeige-editor) besteht aus mehreren Bereichen. Fahre mit der Maus über ein blaues Wort oder tippe es an, dann leuchtet der Bereich auf: - -- **Links die [Elemente](#zeige-elemente):** alle Bausteine zum Hineinziehen. In der Gruppe **mBot2-Befehle** liegen die Befehle für den mBot2 wie **fahre vor** und **drehe rechts**. -- **In der Mitte das [Struktogramm](#zeige-struktogramm):** Ein neues Diagramm enthält nur einen leeren Platzhalter, erkennbar an **ø**. -- **Unten der [Objektinspektor](#zeige-objektinspektor):** Hier änderst du den Text des ausgewählten Kastens, zum Beispiel `mbot.forward(30)` statt `mbot.forward()`. Die Linie mit dem Griff darüber kannst du nach oben oder unten ziehen. -- **Darüber die [Werkzeuge](#zeige-werkzeuge):** Rückgängig, Kopieren, Löschen, Exportieren und rechts die **Simulation**. - -So baust du: - -- **Einfügen:** Zieh ein Element aus den Elementen auf das Struktogramm. Auf den Platzhalter **ø** ersetzt es ihn. Auf die obere Hälfte eines Kastens kommt es davor, auf die untere Hälfte dahinter. Eine blaue Linie zeigt dir, wo es landet. -- **Text ändern:** Doppelklick auf einen Kasten, auf dem Tablet Doppeltipp. Dann tippst du direkt im Struktogramm, **Enter** übernimmt. -- **Verschieben:** einen Kasten an eine andere Stelle ziehen. -- **Löschen:** Kasten anklicken und Entf drücken oder auf den [Mülleimer](#zeige-loeschen) klicken. -- **Rückgängig:** Strg+Z, am Mac ⌘Z. - -> 🧩 **Lieber Blöcke wie in Scratch?** Klicke in den Werkzeugen auf [Blöcke](#zeige-bloecke). Dann siehst du dasselbe Programm als Blöcke, die du zusammensteckst. Zahlen tippst du direkt in die weißen Felder, Sensoren ziehst du hinein. Mit **Struktogramm** kommst du zurück. Es bleibt dasselbe Programm, du kannst jederzeit wechseln. - -::: übung vb-erster-plan -titel: Um die Ecke -auftrag: Baue ein Struktogramm: Der mBot2 fährt vor, dreht nach rechts, fährt vor, dreht nach links und fährt noch einmal vor. Starte danach die Simulation und schau zu. -fahrt: forward, turnRight, forward, turnLeft, forward -braucht: anweisung -tipp: Zieh **fahre vor** auf den Platzhalter ø. Die nächsten Befehle ziehst du jeweils auf die untere Hälfte des letzten Kastens. -tipp: Von oben nach unten: **fahre vor**, **drehe rechts**, **fahre vor**, **drehe links**, **fahre vor**. -lösung: vb-erster-plan-loesung.visustruct -::: - -> Bist du fertig, klickst du in der Übung auf **Prüfen**. VisuStruct lässt dein Struktogramm dann laufen und schaut nach, ob der mBot2 genau so fährt wie verlangt. Später prüft es dein Programm oft in mehreren Welten, zum Beispiel einmal mit Wand und einmal ohne. Klappt es nicht, helfen dir die **Tipps**. - -## Speichern und Öffnen - -- **[Speichern](#zeige-speichern)** (Strg+S, am Mac ⌘S): Das Struktogramm wird als Datei mit der Endung `.visustruct` gespeichert. Den Dateinamen schlägt der [Titel](#zeige-titel) über dem Struktogramm vor. -- **[Öffnen](#zeige-oeffnen)** (Strg+O, am Mac ⌘O): eine gespeicherte Datei wieder laden. - -In der Spalte [📁 Dateien](#zeige-dateien) richtest du einmal einen Ordner ein, deinen **Workspace**. Dort landen alle deine Programme und auch dein Lernstand. Den Ordner kannst du mitnehmen und zu Hause weitermachen. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektionen [„Was ist ein Struktogramm?“](?visustruct&lektion=01-was-ist-ein-struktogramm), [„Der Editor“](?visustruct&lektion=02-der-editor) und [„Speichern, Öffnen, Exportieren“](?visustruct&lektion=03-speichern-oeffnen-exportieren). Sie öffnen sich in einem neuen Fenster. - -## Spiel: Welcher Baustein? - -::: spiel frage -titel: Spiel: Welcher Baustein? -intro: Ludwig beschreibt, was sein mBot2 tun soll. Ist das eine Sequenz, eine Verzweigung oder eine Wiederholung? Sechs Runden. -antworten: Sequenz | Verzweigung | Wiederholung - -runde: -frage: Der mBot2 fährt vor, dreht sich nach rechts und fährt wieder vor. -richtig: Sequenz -> Drei Schritte nacheinander, jeder genau einmal. - -runde: -frage: Ist die Wand nah, dreht er sich. Sonst fährt er vor. -richtig: Verzweigung -> Je nach Bedingung passiert das eine oder das andere. - -runde: -frage: Er fährt viermal 10 cm vor. -richtig: Wiederholung -> Derselbe Schritt kommt mehrmals dran. - -runde: -frage: Solange keine Linie kommt, fährt er weiter. -richtig: Wiederholung -> „Solange“ heißt: immer wieder, bis die Bedingung nicht mehr stimmt. - -runde: -frage: Steht er auf Rot, piept er. -richtig: Verzweigung -> Nur wenn die Bedingung stimmt, piept er. - -runde: -frage: Er zeigt „Hallo“ auf dem Bildschirm und spielt danach einen Ton. -richtig: Sequenz -> Zwei Schritte nacheinander, ohne Bedingung und ohne Wiederholung. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Algorithmus und ein Struktogramm ist. → Ein Plan für den Roboter -- Ich kann die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen. → Drei Bausteine -- Ich kann im Editor Elemente einfügen, verschieben und löschen. → Der Editor -- Ich kann ein Struktogramm speichern und wieder öffnen. → Speichern und Öffnen -::: - -## Wissenstest - -::: quiz -? Was ist ein Algorithmus? -→ Ein Plan für den Roboter -- [ ] ein Bauteil des mBot2 -- [x] eine genaue Schritt-für-Schritt-Anleitung -- [ ] eine Programmiersprache -> Ein Algorithmus sagt genau, was in welcher Reihenfolge passiert. Das Struktogramm zeichnet ihn. -? Welcher Baustein entscheidet je nach Bedingung? -→ Drei Bausteine -- [ ] die Sequenz -- [x] die Verzweigung -- [ ] die Wiederholung -> Die Verzweigung hat oben ein Dreieck und zwei Spalten für true und false. -? Du ziehst **fahre vor** auf die untere Hälfte eines Kastens. Wo landet es? -→ Der Editor -- [ ] davor -- [x] dahinter -- [ ] es ersetzt den Kasten -> Obere Hälfte heißt davor, untere Hälfte dahinter. -? Welche Endung hat eine gespeicherte Struktogramm-Datei? -→ Speichern und Öffnen -- [ ] `.java` -- [x] `.visustruct` -- [ ] `.png` -> `.png` ist ein Bild zum Weitergeben. Weiterbearbeiten kannst du nur die `.visustruct`-Datei. -::: diff --git a/web/lessons/de/visubot/01-der-mbot2.md b/web/lessons/de/visubot/01-der-mbot2.md deleted file mode 100644 index 17a56684..00000000 --- a/web/lessons/de/visubot/01-der-mbot2.md +++ /dev/null @@ -1,416 +0,0 @@ ---- -titel: Der mBot2 -bereich: Losfahren -kurz: Lerne den Roboter kennen, den du gleich programmierst. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Teile des mBot2 benennen -- erklären, wie der mBot2 Abstände misst -- erklären, wie der mBot2 eine Linie erkennt -- erklären, was Sensoren und Aktoren sind -- den mBot2 mit Elementen aus der Gruppe mBot2-Befehle steuern -- den mBot2 im Simulator fahren lassen -- den echten mBot2 per USB-C verbinden und wieder trennen -- prüfen, ob alle Sensoren und Aktoren funktionieren -::: - -## Hallo mBot2 - -::: mbot2 -fokus: -drehen: ja -::: - -Der **mBot2** ist ein kleiner Roboter der Firma Makeblock. In dieser Lektion machst du eine Tour durch alle seine Teile: - -- den [CyberPi]{teil=cyberpi}, den kleinen Computer hinten oben -- das durchsichtige [Shield mit Akku]{teil=shield} in der Mitte -- zwei [Motoren]{teil=motors} mit [Rädern]{teil=wheels} -- den [Ultraschallsensor]{teil=ultrasonic} vorn, der wie zwei Augen aussieht -- den [Liniensensor]{teil=lineSensor} unten an der Nase -- das türkise [Chassis]{teil=chassis}, das alles zusammenhält - -In VisuBot programmierst du ihn mit Struktogrammen. Jedes Programm kannst du zuerst im Simulator ausprobieren, auch ganz ohne echten Roboter. - -> Fahr mit der Maus über ein gelb unterstrichenes Wort, dann leuchtet das Teil im Modell auf. Tippst du darauf, fährt die Kamera hin. Das Modell kannst du mit der Maus oder dem Finger drehen und mit dem Mausrad heranzoomen. - -## Der CyberPi - -::: mbot2 -fokus: cyberpi, screen, joystick, buttons, leds, lightSensor, microphone -ansicht: hinten -::: - -Der [CyberPi]{teil=cyberpi,screen,joystick,buttons,leds,lightSensor,microphone} ist das Gehirn des mBot2: ein **Mikrocontroller**, also ein kleiner Computer ohne Tastatur. Er führt dein Programm aus. Er liegt quer hinten oben auf dem Roboter und lässt sich auch abnehmen. - -Auf ihm ist schon eine Menge eingebaut: - -- ein farbiger [Bildschirm]{teil=screen}, auf dem Text und Bilder erscheinen -- ein [Joystick]{teil=joystick}, den du in vier Richtungen drücken kannst -- zwei [Tasten]{teil=buttons}, eine mit Dreieck und eine mit Quadrat, und an der Seite neben dem USB-Anschluss die Home-Taste -- fünf bunte [LEDs]{teil=leds} als Lichtleiste an der Rückseite -- ein [Lichtsensor]{teil=lightSensor} und ein [Mikrofon]{teil=microphone} - -Dazu kommen ein Lautsprecher und ein Lagesensor, die du von außen nicht siehst. Der Lagesensor merkt, ob der CyberPi gekippt oder gedreht wird. - -> Das Modell ist nach Fotos nachgebaut. Schau dir deinen eigenen mBot2 an und vergleiche. - -## Bildschirm, LEDs und Lautsprecher - -::: mbot2 -fokus: screen, leds -ansicht: hinten -::: - -Mit dem [Bildschirm]{teil=screen} und den fünf [LEDs]{teil=leds} zeigt dir der mBot2, was er gerade tut. Jede LED kann in fast jeder Farbe leuchten, weil sie Rot, Grün und Blau mischt. Darum heißen sie **RGB-LEDs**. - -Später lässt du die LEDs mit `mbot.setLed(255, 0, 0)` rot leuchten. Die drei Zahlen sind Rot, Grün und Blau, jeweils von 0 bis 255. - -Im [CyberPi]{teil=cyberpi} steckt außerdem ein kleiner **Lautsprecher**. Mit `mbot.playTone(440, 300)` spielt er einen Ton: 440 Schwingungen pro Sekunde (Hertz), 300 Millisekunden lang. - -## Licht und Geräusche messen - -::: mbot2 -fokus: lightSensor, microphone -ansicht: oben -::: - -Der [Lichtsensor]{teil=lightSensor} misst, wie hell es ist. Das [Mikrofon]{teil=microphone} misst, wie laut es ist. So kann der mBot2 zum Beispiel losfahren, wenn du in die Hände klatschst. - -## Tasten und Joystick - -::: mbot2 -fokus: joystick, buttons -ansicht: oben -::: - -Die [Tasten]{teil=buttons} A und B und der [Joystick]{teil=joystick} sind auch Sensoren: Sie merken, ob du sie drückst. Dein Programm kann zum Beispiel warten, bis du A drückst, und erst dann losfahren. Mit dem Joystick lenkst du den mBot2 wie mit einer Fernbedienung. - -## Der Lagesensor - -::: mbot2 -fokus: cyberpi -drehen: ja -::: - -Im [CyberPi]{teil=cyberpi} steckt ein Sensor, den du nicht siehst: der **Lagesensor** (ein Gyroskop mit Beschleunigungssensor). Er merkt, ob der mBot2 nach vorn, nach hinten oder zur Seite geneigt ist, wie weit er sich gedreht hat und ob ihn jemand schüttelt. Dein Handy hat so einen Sensor auch: Darum dreht sich das Bild, wenn du es quer hältst. - -## Strom: das Shield mit Akku - -::: mbot2 -fokus: shield, powerSwitch -ansicht: seite -::: - -Das große durchsichtige Gehäuse ist das [mBot2-Shield]{teil=shield}. Durch den Deckel siehst du den grauen **Akku**, der den Roboter mit Strom versorgt. Hinten am Shield stecken die Kabel der Motoren (M1 und M2) und des Ultraschallsensors. - -Links an der Seite ist der [Ein-Aus-Schalter]{teil=powerSwitch} mit der Aufschrift ON/OFF. Daneben liegen zwei Buchsen S1 und S2 für kleine Servomotoren. Schalte den mBot2 aus, wenn du ihn nicht brauchst, dann hält der Akku länger. Geladen wird er über das USB-Kabel am CyberPi. - -## Motoren und Räder - -::: mbot2 -fokus: motors, wheels -ansicht: seite -::: - -Zwei [Motoren]{teil=motors} treiben die beiden [Räder]{teil=wheels} an, jeder sein eigenes. Du siehst sie von unten: silberne Motoren in hellblauen Getrieben. - -- Drehen sich beide Räder gleich schnell vorwärts, fährt der mBot2 **geradeaus**. -- Dreht sich ein Rad vorwärts und das andere rückwärts, dreht er sich **auf der Stelle**. - -Die Motoren sind **Encoder-Motoren**: Sie zählen mit, wie weit sich das Rad gedreht hat. Darum weiß der mBot2, wann er genau 10 cm gefahren ist oder sich genau um 90° gedreht hat. - -## Der Ultraschallsensor - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Vorn sitzt der schwarze [Ultraschallsensor]{teil=ultrasonic}. Er sieht aus wie zwei Augen, ist aber eher ein Ohr: Der eine Kreis schickt einen sehr hohen Ton los, den wir nicht hören. Der andere wartet auf das Echo. Je länger das Echo braucht, desto weiter ist die Wand weg. - -So misst der mBot2 Abstände in Zentimetern. Die Ringe um die Kreise können außerdem blau leuchten. - -::: angeberwissen -Fledermäuse machen es genau wie der Ultraschallsensor: Sie rufen so hoch, dass wir es nicht hören, und lauschen auf das Echo. Schall ist etwa 343 Meter pro Sekunde schnell. Steht eine Wand einen Meter vor dem mBot2, ist das Echo schon nach knapp 6 Tausendstel Sekunden zurück. -::: - -## Unter dem Roboter - -::: mbot2 -fokus: lineSensor, caster -ansicht: unten -::: - -Jetzt schaust du von unten. Ganz vorn schaut die schwarze Platine des [Liniensensors]{teil=lineSensor} heraus. Er hat **vier** kleine Fühler nebeneinander. Jeder leuchtet den Boden an und misst, wie viel Licht zurückkommt. Auf einer schwarzen Linie kommt wenig zurück, auf hellem Boden viel. So erkennt der mBot2, ob er auf einer Linie fährt. - -Der Sensor heißt **Quad-RGB-Sensor**, weil er noch mehr kann: Er erkennt auch **Farben**, zum Beispiel ein rotes oder grünes Feld auf dem Boden. - -Die [Kugelrolle]{teil=caster} dahinter ist das dritte Bein. Sie hat keinen Motor und rollt einfach in jede Richtung mit. - -## Das Chassis - -::: mbot2 -fokus: chassis -::: - -Das [Chassis]{teil=chassis} ist der türkise Rahmen aus Aluminium. Er hält alle Teile zusammen. Vorn hat er zwei runde „Ohren“, hinten ein großes **M** für Makeblock. Die vielen Löcher sind kein Zufall: Dort kannst du weitere Teile anschrauben. - -## Sensoren und Aktoren - -Ein Roboter hat zwei Arten von Teilen: - -- **Sensoren** messen etwas: den Abstand, eine Linie, eine Farbe, die Helligkeit, die Lautstärke, die Neigung oder ob eine Taste gedrückt ist. -- **Aktoren** tun etwas: Die Motoren bewegen die Räder, die LEDs leuchten, der Bildschirm zeigt etwas an, der Lautsprecher piept. - -Das Wort kommt vom lateinischen *agere*, „handeln“: Aktoren handeln, Sensoren (von *sentire*, „fühlen“) fühlen. - -Dein Programm liest die Sensoren und steuert die Aktoren. Das kennst du schon als Eingabe, Verarbeitung und Ausgabe. - -## Finde die Bauteile - -Jetzt bist du dran: Klicke im Modell auf das gesuchte Teil. Liegst du richtig, kommt die nächste Frage. - -::: mbot2quiz -- ultrasonic: Womit misst der mBot2, wie weit die Wand weg ist? -- screen: Wo erscheint Text, den dein Programm ausgibt? -- wheels: Was bewegt den mBot2 vorwärts? -- lineSensor: Was erkennt eine schwarze Linie auf dem Boden? (Tipp: Dreh das Modell.) -- powerSwitch: Wo schaltest du den mBot2 ein und aus? -- leds: Was leuchtet bei `mbot.setLed(255, 0, 0)` rot? -fertig: Super, du kennst dich am mBot2 aus! -::: - -## Befehle für den mBot2 - -Unter den [Elementen](#zeige-elemente) gibt es in VisuBot eine eigene Gruppe **mBot2-Befehle**. Jeder Kasten darin ist eine Anweisung an den Roboter: - -| Element | Text im Kasten | Was passiert | -|---|---|---| -| fahre vor | `mbot.forward()` | 10 cm vorwärts | -| fahre zurück | `mbot.backward()` | 10 cm rückwärts | -| drehe rechts | `mbot.turnRight()` | 90° nach rechts drehen | -| drehe links | `mbot.turnLeft()` | 90° nach links drehen | -| LEDs an | `mbot.setLed(255, 0, 0)` | die LEDs leuchten rot | - -In die Klammern darfst du auch eine Zahl schreiben: `mbot.forward(30)` fährt 30 cm, `mbot.turnRight(45)` dreht nur 45°. - -> Die Anweisungen sind echtes Java. `mbot` ist der Roboter, hinter dem Punkt steht, was er tun soll. - -## Erste Fahrt - -Starte nach dem Bauen die [Simulation](#zeige-simulation). Rechts erscheint die VisuBot-Welt mit dem mBot2. Das Gitter auf dem Boden hat Kästchen von 10 cm, also genau ein **fahre vor**. - -::: übung vb-gerade -titel: Geradeaus -auftrag: Ziehe fünfmal **fahre vor** in das Struktogramm. Starte dann die Simulation und schau zu, wie der mBot2 50 cm geradeaus fährt. -fahrt: 5 x (forward) -tipp: Die Gruppe mBot2-Befehle findest du unter den normalen Elementen. -tipp: Fünf Kästen `mbot.forward()` untereinander. Jeder fährt 10 cm. -lösung: vb-gerade-loesung.visustruct -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - mbot.forward(60); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,0 -> Zwei Felder nach vorn, nach rechts drehen, ein Feld weiter. - -runde: - mbot.forward(30); - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,1 -> Ein Feld nach vorn, dann schaut er nach links und fährt zwei Felder. - -runde: - mbot.turnRight(); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Zweimal rechts drehen heißt: Er schaut nach hinten. Dann fährt er ein Feld zurück, nach unten. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: .... | .... | .^.. -ziel: 2,2 -> Hoch, nach rechts, und nach der zweiten Drehung schaut er nach unten. -::: - -## Den echten mBot2 verbinden - -::: mbot2 -fokus: cyberpi, powerSwitch, joystick, buttons -ansicht: seite -::: - -Alles, was du im Simulator baust, kann auch der echte mBot2 fahren. So verbindest du ihn: - -1. Steck ein **USB-C-Kabel** in deinen Computer (zum Beispiel ein MacBook) und das andere Ende in den USB-C-Anschluss rechts am [CyberPi]{teil=cyberpi}, neben der Home-Taste. -2. Schieb den [Schiebeschalter ON/OFF]{teil=powerSwitch} links am Shield auf ON. Der Bildschirm des CyberPi leuchtet. -3. Auf dem Bildschirm erscheint ein Menü, in dem **neu starten** markiert ist. Drück den [Joystick]{teil=joystick} wie eine Taste nach unten, um das zu bestätigen. -4. Nach dem Neustart steht dort „Press B to start“. Drück **Taste B**, das ist die [Taste mit dem Dreieck]{teil=buttons}. -5. Öffne VisuStruct in **Chrome** oder **Edge**. Safari und das iPad können keine USB-Geräte ansprechen. -6. Sobald der CyberPi hochgefahren ist, klick oben auf **🔌 mBot2** (oder im Zahnrad auf „Mit mBot2 verbinden“). -7. Chrome zeigt eine Liste mit Anschlüssen. Wähle den Eintrag **USB Serial** (zum Beispiel „USB Serial (cu.usbserial-110)“). Er steht oft ganz unten, eventuell musst du nach unten scrollen. Dann klick auf **Verbinden**. -8. Der CyberPi startet kurz neu (⏳). Dann steht „Hallo VisuBot!“ auf seinem Bildschirm und der Knopf zeigt 🟢. - -Jetzt fährt der mBot2 bei jedem Schritt der Simulation mit. Stell ihn auf den Boden und lass ihm Platz! - -> Fertig? Klick noch einmal auf **🟢 mBot2**. Dann hält er an, zeigt „Bis bald!“ und gibt den Anschluss frei. Erst danach das Kabel ziehen. - -> Ganz ohne Kabel fahren? Das lernst du in Lektion 2 bei **Ohne Kabel fahren**. - -## Den mBot2 testen - -Ist der mBot2 verbunden, erscheint unter der Welt **🔧 mBot2 testen**. Klapp es auf: - -- Mit den Knöpfen probierst du jeden Aktor einmal aus: LEDs, Ton, Text auf dem Bildschirm und die Räder. Heb den mBot2 dafür hoch, damit er nicht vom Tisch fährt. -- Darunter stehen alle Sensoren mit ihren Werten, und die laufen live mit. Halte die Hand vor den Ultraschallsensor, drück Taste A, neige ihn, klatsch in die Hände oder stell ihn auf ein rotes Blatt. - -Ändert sich ein Wert nicht, obwohl du etwas tust, stimmt etwas nicht. Dann sag deiner Lehrkraft Bescheid, bevor du programmierst. - -## Spiel: Sensor oder Aktor? - -::: spiel frage -titel: Spiel: Sensor oder Aktor? -intro: Misst das Bauteil etwas, oder tut es etwas? Zehn Runden. -antworten: Sensor | Aktor - -runde: -frage: Der Ultraschallsensor misst, wie weit die Wand weg ist. -richtig: Sensor -> Er misst etwas: den Abstand. - -runde: -frage: Die Motoren drehen die Räder. -richtig: Aktor -> Sie tun etwas: Sie bewegen den mBot2. - -runde: -frage: Die LEDs leuchten rot. -richtig: Aktor -> Leuchten ist etwas tun, nicht messen. - -runde: -frage: Der Liniensensor erkennt das schwarze Klebeband. -richtig: Sensor -> Er misst, wie viel Licht vom Boden zurückkommt. - -runde: -frage: Der Lautsprecher piept. -richtig: Aktor -> Er gibt einen Ton aus. - -runde: -frage: Das Mikrofon hört dein Klatschen. -richtig: Sensor -> Es misst die Lautstärke. - -runde: -frage: Der Bildschirm zeigt „Hallo VisuBot!“. -richtig: Aktor -> Anzeigen ist eine Ausgabe. - -runde: -frage: Taste A merkt, dass du drückst. -richtig: Sensor -> Tasten sind Sensoren: Sie melden, ob sie gedrückt sind. - -runde: -frage: Der Lagesensor merkt, dass der mBot2 schief steht. -richtig: Sensor -> Er misst die Neigung. - -runde: -frage: Die Ringe am Ultraschallsensor leuchten blau. -richtig: Aktor -> Gemein! Das Bauteil ist ein Sensor, aber das Leuchten der Ringe ist eine Ausgabe. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Teile des mBot2 benennen. → Hallo mBot2 -- Ich kann erklären, wie der mBot2 Abstände misst. → Der Ultraschallsensor -- Ich kann erklären, wie der mBot2 eine Linie erkennt. → Unter dem Roboter -- Ich kann erklären, was Sensoren und Aktoren sind. → Sensoren und Aktoren -- Ich kann den mBot2 mit Elementen aus der Gruppe mBot2-Befehle steuern. → Befehle für den mBot2 -- Ich kann den mBot2 im Simulator fahren lassen. → Erste Fahrt -- Ich kann den echten mBot2 per USB-C verbinden und wieder trennen. → Den echten mBot2 verbinden -- Ich kann prüfen, ob alle Sensoren und Aktoren funktionieren. → Den mBot2 testen -::: - -## Wissenstest - -::: quiz -? Ordne jedes Teil seiner Aufgabe zu. -→ Hallo mBot2 -= Ultraschallsensor -> misst den Abstand -= Motoren -> bewegen die Räder -= CyberPi -> führt das Programm aus -= Liniensensor -> erkennt eine dunkle Linie -? Welche Teile sind Aktoren? -→ Sensoren und Aktoren -- [x] Motoren -- [ ] Ultraschallsensor -- [x] LEDs -- [ ] Liniensensor -> Aktoren tun etwas, Sensoren messen etwas. -? Wie misst der Ultraschallsensor den Abstand? -→ Der Ultraschallsensor -- [ ] Er fotografiert die Wand. -- [x] Er schickt einen sehr hohen Ton los und wartet auf das Echo. -- [ ] Er tastet die Wand mit seinen blauen Ringen ab. -> Je länger das Echo braucht, desto weiter ist die Wand weg. -? Woran erkennt der Liniensensor eine schwarze Linie? -→ Unter dem Roboter -- [x] Von der schwarzen Linie kommt wenig Licht zurück. -- [ ] Die Linie ist wärmer als der Boden. -- [ ] Er hört, wie die Räder über die Linie rollen. -> Jeder Fühler leuchtet den Boden an. Heller Boden wirft viel Licht zurück, eine schwarze Linie wenig. -? Was tut `mbot.turnRight()`? -→ Befehle für den mBot2 -- [ ] Der mBot2 fährt 10 cm nach rechts. -- [x] Der mBot2 dreht sich um 90° nach rechts. -- [ ] Die rechte LED geht an. -> Ohne Zahl in den Klammern dreht er sich um 90°. `mbot.turnRight(45)` dreht nur 45°. -? Im Struktogramm stehen fünf Kästen `mbot.forward()` untereinander. Wie weit fährt der mBot2 in der Simulation? -→ Erste Fahrt -- [ ] 5 cm -- [x] 50 cm -- [ ] 10 cm -> Jedes `mbot.forward()` fährt 10 cm, also ein Kästchen im Gitter. -? Du bist mit dem echten mBot2 fertig. Was machst du, bevor du das Kabel ziehst? -→ Den echten mBot2 verbinden -- [x] Noch einmal auf **🟢 mBot2** klicken und warten, bis „Bis bald!“ dasteht -- [ ] Den Schiebeschalter auf OFF schieben -- [ ] Nichts, das Kabel darf sofort raus -> Erst nach „Bis bald!“ ist der Anschluss frei. -? Du hältst die Hand vor den Ultraschallsensor, aber unter **🔧 mBot2 testen** ändert sich der Wert nicht. Was tust du? -→ Den mBot2 testen -- [ ] Trotzdem losprogrammieren -- [x] Der Lehrkraft Bescheid sagen, bevor du programmierst -- [ ] Den Wert in der Simulation von Hand ändern -> Ändert sich ein Wert nicht, obwohl du etwas tust, stimmt am Roboter etwas nicht. -::: diff --git a/web/lessons/de/visubot/02-das-quadrat.md b/web/lessons/de/visubot/02-das-quadrat.md deleted file mode 100644 index 7e58c265..00000000 --- a/web/lessons/de/visubot/02-das-quadrat.md +++ /dev/null @@ -1,365 +0,0 @@ ---- -titel: Das Quadrat -bereich: Losfahren -kurz: Vom langen Struktogramm zur dreifach verschachtelten Schleife. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Ablauf erst ohne Schleife bauen -- Wiederholungen erkennen und durch eine For-Schleife ersetzen -- zwei Schleifen ineinander schachteln -- drei Schleifen ineinander schachteln -- mein Programm auf den mBot2 übertragen und ohne Kabel mit Taste A starten -::: - -## Ein Quadrat fahren - -Der mBot2 soll ein Quadrat mit 50 cm Seitenlänge fahren. Eine Seite kennst du schon: fünfmal **fahre vor**. Danach dreht er sich nach rechts, und die nächste Seite beginnt. - -::: übung vb-quadrat -titel: Das Quadrat -auftrag: Baue ein Struktogramm, mit dem der mBot2 ein Quadrat fährt: fünfmal **fahre vor**, dann **drehe rechts**. Und das viermal. -fahrt: 4 x (5 x (forward), turnRight) -tipp: Eine Seite besteht aus fünfmal fahre vor und einmal drehe rechts. -tipp: Insgesamt sind es 24 Kästen: viermal fünf `mbot.forward()` und danach jeweils `mbot.turnRight()`. -lösung: vb-quadrat-loesung.visustruct -::: - -Ganz schön viele Kästen, oder? Wenn du dich beim Zählen vertust, fährt der mBot2 kein Quadrat mehr. - -## Immer das Gleiche - -Schau dein Struktogramm genau an: Fünfmal **fahre vor** steht viermal da. Wenn sich etwas wiederholt, nimmt man eine **Schleife**. Wir wissen genau, wie oft gefahren wird, nämlich fünfmal. Dafür passt die For-Schleife. - -Ziehe eine For-Schleife ins Struktogramm und gib ihr diese drei Teile: - -- Start: `int i = 0` -- Bedingung: `i < 5` -- Schritt: `i++` - -In den Inhalt der Schleife kommt ein einziges **fahre vor**. Die Schleife zählt `i` von 0 bis 4, das sind fünf Durchläufe. - -`i` ist ein **Zähler**. Der Computer merkt sich darin, im wievielten Durchlauf er gerade ist. So einen Speicher mit Namen nennt man **Variable**, genauer lernst du sie in Lektion 3 kennen. Die drei Teile bedeuten: - -| Teil | Bedeutung | -|---|---| -| `int i = 0` | Der Zähler `i` ist eine ganze Zahl (`int`) und fängt bei 0 an. | -| `i < 5` | Solange `i` kleiner als 5 ist, läuft die Schleife noch einmal. | -| `i++` | Nach jedem Durchlauf wird `i` um 1 größer. | - -So zählt die Schleife: - -| Durchlauf | 1 | 2 | 3 | 4 | 5 | danach | -|---|---|---|---|---|---|---| -| `i` | 0 | 1 | 2 | 3 | 4 | 5 | -| `i < 5`? | true | true | true | true | true | false, fertig | - -::: übung vb-quadrat-schleife -titel: Seiten mit Schleife -auftrag: Ersetze in deinem Quadrat jede Reihe aus fünf **fahre vor** durch eine For-Schleife, die fünfmal fährt. Der mBot2 fährt danach genau dasselbe Quadrat. -fahrt: 4 x (5 x (forward), turnRight) -braucht: forSchleife -tipp: Start `int i = 0`, Bedingung `i < 5`, Schritt `i++`. Im Inhalt steht nur `mbot.forward()`. -tipp: Viermal untereinander: die For-Schleife und danach `mbot.turnRight()`. -lösung: vb-quadrat-schleife-loesung.visustruct -::: - -## Schleife in der Schleife - -Jetzt steht viermal dasselbe Paar da: eine For-Schleife und **drehe rechts**. Auch das ist eine Wiederholung! Packe beides in eine zweite For-Schleife, die viermal läuft. Eine Schleife in einer Schleife heißt **verschachtelte Schleife**. - -Jede Schleife braucht ihre eigene Zählvariable, sonst kommen sich die beiden in die Quere. Üblich ist: Die äußere Schleife zählt mit `i`, die innere mit `j`. Benenne deine innere Schleife also in `j` um. - -::: übung vb-quadrat-verschachtelt -titel: Quadrat verschachtelt -auftrag: Baue das Quadrat mit zwei ineinander geschachtelten For-Schleifen. Die äußere läuft viermal, einmal für jede Seite. Die innere läuft fünfmal, einmal für jeden Schritt. -fahrt: 4 x (5 x (forward), turnRight) -schleifentiefe: 2 -tipp: Außen: Start `int i = 0`, Bedingung `i < 4`, Schritt `i++`. Innen: `int j = 0`, `j < 5`, `j++`. -tipp: In die äußere Schleife kommen die innere Schleife mit `mbot.forward()` und darunter `mbot.turnRight()`. -lösung: vb-quadrat-verschachtelt-loesung.visustruct -::: - -Aus 24 Kästen sind vier geworden. Gehe das Programm in der Simulation mit **Schritt** durch und beobachte die Variablen `i` und `j`. - -::: quiz -? Wie oft führt der mBot2 im verschachtelten Quadrat `mbot.forward()` aus? -- [ ] 9-mal -- [x] 20-mal -- [ ] 5-mal -> Die innere Schleife läuft fünfmal, und das in jedem der vier Durchläufe der äußeren Schleife: 4 · 5 = 20. -::: - -## Vier Quadrate - -Jetzt wird es richtig schön: Der mBot2 soll vier Quadrate fahren. Nach jedem Quadrat dreht er sich einmal nach rechts. So entsteht ein großes Fenster mit Fensterkreuz. - -Du könntest dein Quadrat viermal untereinander kopieren und nach jedem Quadrat ein **drehe rechts** einfügen. Probier es ruhig aus! Merkst du es? Schon wieder steht dasselbe viermal da. - -::: ludwig -Immer wenn du Kästen kopierst, frag dich: Wiederholt sich hier etwas? Dann passt eine Schleife. -::: - -::: übung vb-vier-quadrate -titel: Vier Quadrate -auftrag: Lass den mBot2 vier Quadrate fahren. Nach jedem Quadrat dreht er sich einmal nach rechts. Benutze drei ineinander geschachtelte Schleifen. -fahrt: 4 x (4 x (5 x (forward), turnRight), turnRight) -schleifentiefe: 3 -tipp: Lege um dein verschachteltes Quadrat noch eine dritte For-Schleife, die viermal läuft. -tipp: Ganz außen zählt jetzt `i` (`int i = 0`, `i < 4`, `i++`). Die Schleifen darin heißen dann `j` und `k`. In die äußere Schleife kommen dein Quadrat und danach `mbot.turnRight()`. -lösung: vb-vier-quadrate-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektionen [„For-Schleife“](?visustruct&lektion=13-for-schleife) und [„Verschachteln“](?visustruct&lektion=14-verschachteln). Sie öffnen sich in einem neuen Fenster. - -::: quiz -? Wie oft fährt der mBot2 bei den vier Quadraten 10 cm vor? -→ Vier Quadrate -- [ ] 20-mal -- [ ] 60-mal -- [x] 80-mal -> 4 Quadrate · 4 Seiten · 5 Schritte = 80. Ohne Schleifen wären das 80 Kästen. -::: - -## Ohne Kabel fahren - -::: mbot2 -fokus: cyberpi, buttons -ansicht: oben -::: - -Bisher hängt der mBot2 am Kabel, solange er fährt. Du kannst dein Programm aber auch **auf den mBot2 übertragen**. Dann merkt er es sich und fährt ganz allein, zum Beispiel durch ein Labyrinth auf dem Boden. - -1. Schließ den mBot2 mit dem USB-Kabel an und schalte ihn ein, wie in Lektion 1. Das geht nur in **Chrome** oder **Edge**. -2. Öffne dein Programm, zum Beispiel die vier Quadrate. -3. Klick oben auf **⬆ Übertragen** und dann auf **Jetzt übertragen**. Wähle wieder **USB Serial**. -4. Warte, bis „Fertig!“ dasteht. Der mBot2 startet neu und zeigt **A = Start**. -5. Zieh das Kabel ab und setz den mBot2 an den Start. -6. Drück **Taste A**, das ist die [Taste mit dem Quadrat]{teil=buttons}. Jetzt fährt dein Programm los. - -Das Programm bleibt gespeichert, auch wenn du den mBot2 aus- und wieder einschaltest. Erst das nächste Übertragen ersetzt es. - -> Fährt er los, bevor du bereit bist? Keine Sorge: Er wartet immer auf Taste A. Drückst du A noch einmal, während er fährt, passiert nichts. Ist er fertig, startet A das Programm von vorn. - -## Spiel: Wie oft fährt er? - -::: spiel frage -titel: Spiel: Wie oft fährt er? -intro: Zähle mit, ohne die Simulation zu starten. Wie oft fährt oder dreht sich der mBot2? Sechs Runden. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(); - mbot.turnRight(); - } -frage: Wie oft fährt der mBot2 vor? -- 3-mal -- [x] 4-mal -- 5-mal -> `i` zählt 0, 1, 2 und 3. Das sind vier Durchläufe. - -runde: - for (int i = 1; i <= 4; i++) { - mbot.forward(); - } -frage: Wie oft fährt der mBot2 vor? -- 3-mal -- [x] 4-mal -- 5-mal -> Diesmal zählt `i` von 1 bis 4, wegen `<=`. Auch das sind vier Durchläufe. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Wie oft fährt der mBot2 vor? -- 8-mal -- [x] 15-mal -- 5-mal -> Die innere Schleife läuft in jedem der drei äußeren Durchläufe fünfmal: 3 · 5 = 15. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Wie oft dreht sich der mBot2 nach rechts? -- [x] 3-mal -- 15-mal -- 5-mal -> `mbot.turnRight()` steht in der äußeren Schleife, nicht in der inneren. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - } - mbot.turnRight(); -frage: Fährt der mBot2 ein Quadrat? -- Ja, mit 50 cm Seitenlänge. -- [x] Nein, er fährt 200 cm geradeaus und dreht sich erst am Ende. -- Ja, aber nur ein halbes. -> `mbot.turnRight()` steht unter der Schleife. Es läuft erst, wenn die Schleife fertig ist. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 4; j++) { - mbot.forward(30); - mbot.turnRight(); - } - mbot.turnRight(); - } -frage: Wie viele Quadrate fährt der mBot2? -- [x] 2 -- 4 -- 8 -> Die innere Schleife fährt ein Quadrat. Die äußere wiederholt das zweimal. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 fahren soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(50); - mbot.turnRight(); - } -frage: Soll ein Quadrat mit 50 cm Seitenlänge fahren. -fehler: 1 -besser: for (int i = 0; i < 4; i++) { -> Ein Quadrat hat vier Seiten. Mit `i < 3` fährt er nur drei. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(180); - } -frage: Soll ein Quadrat mit 50 cm Seitenlänge fahren. -fehler: 3 -besser: mbot.turnRight(); -> Mit 180° kehrt er um und fährt immer hin und her. Ein Quadrat braucht 90°. - -runde: - for (int i = 0; i < 4; i++) { - for (int i = 0; i < 5; i++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Soll ein Quadrat aus viermal fünf Schritten fahren. -fehler: 2 -besser: for (int j = 0; j < 5; j++) { -> Die innere Schleife braucht ihre eigene Zählvariable `j`. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnLeft(45); - } -frage: Soll ein Quadrat mit 30 cm Seitenlänge fahren. -fehler: 3 -besser: mbot.turnLeft(); -> Ein Quadrat braucht rechte Winkel, also 90°. Ohne Zahl dreht er sich 90°. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..... | ..^.. -ziel: 2,0 -> Dreimal ein Feld nach vorn. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 1,2 -> Ein ganzes Quadrat: Er kommt genau dort an, wo er losgefahren ist. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 2,2 -> Nur drei Seiten: Die vierte fehlt, also steht er rechts neben dem Start. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 2; j++) { - mbot.forward(30); - } - mbot.turnRight(); - } -karte: .... | .... | .... | ^... -ziel: 2,1 -> Die innere Schleife fährt zwei Felder, dann dreht er sich. Das Ganze zweimal: zwei Felder hoch, zwei nach rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Ablauf erst ohne Schleife bauen. → Ein Quadrat fahren -- Ich kann Wiederholungen erkennen und durch eine For-Schleife ersetzen. → Immer das Gleiche -- Ich kann zwei Schleifen ineinander schachteln. → Schleife in der Schleife -- Ich kann drei Schleifen ineinander schachteln. → Vier Quadrate -- Ich kann mein Programm auf den mBot2 übertragen und ohne Kabel mit Taste A starten. → Ohne Kabel fahren -::: - -## Wissenstest - -::: quiz -? Der mBot2 soll noch ohne Schleife eine Seite von 50 cm fahren und sich dann drehen. Welche Kästen brauchst du? -→ Ein Quadrat fahren -- [ ] einmal `mbot.forward()` und einmal `mbot.turnRight()` -- [x] fünfmal `mbot.forward()` und einmal `mbot.turnRight()` -- [ ] fünfmal `mbot.turnRight()` -> Jedes `mbot.forward()` fährt 10 cm, fünf davon sind 50 cm. -? Eine For-Schleife hat den Start `int i = 0`, die Bedingung `i < 5` und den Schritt `i++`. Wie oft läuft sie? -→ Immer das Gleiche -- [ ] 4-mal -- [x] 5-mal -- [ ] 6-mal -> `i` zählt 0, 1, 2, 3, 4. Das sind fünf Durchläufe. -? Warum heißt die Zählvariable der inneren Schleife `j` und nicht auch `i`? -→ Schleife in der Schleife -- [ ] In einem Programm darf jeder Buchstabe nur einmal vorkommen. -- [x] Jede Schleife braucht ihre eigene Zählvariable, sonst kommen sich die beiden in die Quere. -- [ ] `j` zählt schneller als `i`. -> Würden beide mit `i` zählen, würde die innere Schleife die äußere durcheinanderbringen. -? Wie oft führt der mBot2 bei den vier Quadraten `mbot.turnRight()` aus? -→ Vier Quadrate -- [ ] 4-mal -- [ ] 16-mal -- [x] 20-mal -> In jedem Quadrat dreht er sich viermal, das sind 4 · 4 = 16. Dazu kommt nach jedem Quadrat noch eine Drehung: 16 + 4 = 20. -? Dein Programm ist übertragen und das Kabel ist ab. Wie startest du es? -→ Ohne Kabel fahren -- [ ] mit Taste B -- [x] mit Taste A -- [ ] mit **⬆ Übertragen** -> Nach dem Übertragen zeigt der mBot2 **A = Start** und wartet auf Taste A. -::: diff --git a/web/lessons/de/visubot/02-quadrat-als-pap.md b/web/lessons/de/visubot/02-quadrat-als-pap.md deleted file mode 100644 index 3fc9a0b6..00000000 --- a/web/lessons/de/visubot/02-quadrat-als-pap.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -titel: PAP und Pseudocode -bereich: Losfahren -kurz: Den Plan für das Quadrat als Programmablaufplan und als Pseudocode aufschreiben und mit dem Struktogramm vergleichen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen PAP (englisch *flowchart*) für den mBot2 lesen und selbst zusammenbauen -- einen Plan als Pseudocode lesen -- Struktogramm, PAP und Pseudocode vergleichen -::: - -## Drei Arten, einen Plan aufzuschreiben - -Den Plan für das Quadrat kennst du als **Struktogramm**: eine Schleife, die viermal läuft, darin eine Seite fahren und rechts drehen. - -Es gibt noch zwei weitere Arten, denselben Plan aufzuschreiben. Beide wirst du im Unterricht und im Internet oft treffen: - -- den **Programmablaufplan**, kurz **PAP**, auf Englisch **flowchart**, auf Deutsch auch Flussdiagramm, -- den **Pseudocode**, einen Plan aus Text in normaler Sprache. - -Den mBot2 kannst du damit nicht direkt steuern. Aber mit allen drei kannst du einen Plan aufschreiben, bevor du ihn als Struktogramm oder in Java baust. - -## Der PAP - -Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind: - -- **Oval:** Start oder Ende. -- **Rechteck:** eine Anweisung, zum Beispiel *50 cm vorwärts fahren*. -- **Raute:** eine Frage mit zwei Ausgängen: **ja** und **nein**. -- **Parallelogramm:** eine Ein- oder Ausgabe, zum Beispiel ein Text auf dem Bildschirm. -- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. - -Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie an einem Pfeil, der **zurück nach oben** führt. So lange die Antwort in der Raute **nein** ist, geht es zurück, und die Schritte laufen noch einmal. - -> Vorsicht: Ein Pfeil darf im PAP überallhin zeigen, auch kreuz und quer. Bei großen Plänen wird das schnell unübersichtlich. Das nennt man **Spaghetticode**. Im Struktogramm kann das nicht passieren, weil es keine Pfeile gibt. - -## Übung: Das Quadrat als PAP - -Der mBot2 fährt eine Seite, dreht sich rechts und zählt die Seite mit. Nach vier Seiten zeigt er auf dem Bildschirm „Quadrat fertig!“. - -::: pap -titel: Übung: Das Quadrat als PAP -auftrag: Die Plätze im Plan sind leer. Lege jedes Element an seinen Platz. Die Form des Platzes hilft dir. -start: Start -anweisung: 50 cm vorwärts fahren -anweisung: rechts drehen -anweisung: Seite mitzählen -frage: 4 Seiten gefahren? | nein -> 50 cm vorwärts fahren -ausgabe: „Quadrat fertig!“ anzeigen -ende: Ende -erklärung: Solange noch keine vier Seiten gefahren sind, führt der Pfeil von der Raute zurück zu „50 cm vorwärts fahren“. Das ist die Schleife. Die Anzeige auf dem Bildschirm ist eine Ausgabe und steht deshalb im Parallelogramm. -legende: ja -::: - -**Eigene PAPs zeichnen:** Mit **VisuFlow** zeichnest du deinen PAP ganz leicht selbst, zum Beispiel für deine nächste Roboterfahrt. Die Symbole liegen fertig in einer Leiste: Antippen hängt das nächste Symbol an und verbindet es gleich mit einem Pfeil. Deinen PAP speicherst du als Datei und exportierst ihn als Bild oder PDF, zum Beispiel für dein Heft oder eine Präsentation. [VisuFlow öffnen](https://visustruct.visucode.de/app/?visuflow) - -## Pseudocode - -**Pseudocode** ist Text, der wie ein Programm aufgebaut ist, aber in normaler Sprache geschrieben wird. Feste Wörter wie WIEDERHOLE, WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Das Quadrat sieht so aus: - -``` -WIEDERHOLE 4-mal - 50 cm vorwärts fahren - rechts drehen -ENDE WIEDERHOLE -"Quadrat fertig!" anzeigen -``` - -Und so sieht derselbe Plan in Java aus: - -```java -for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(); -} -mbot.showText("Quadrat fertig!"); -``` - -Pseudocode hat **keine feste Schreibweise**. Manche schreiben FÜR i VON 1 BIS 4, andere WIEDERHOLE 4-mal. Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. Den Computer kannst du damit nicht steuern, dafür brauchst du Java. - -### Im Vergleich - -- **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen unübersichtlich. -- **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen WIEDERHOLE und ENDE WIEDERHOLE. Schnell geschrieben und schon nah an Java. - -::: angeberwissen -Määäh, wer hat die Ablaufpläne erfunden? Eine Frau und ihr Mann: **Lillian und Frank Gilbreth** stellten 1921 ihre „Process Charts“ vor, lange vor dem ersten Computer. Damit zeichneten sie Arbeitsabläufe in Fabriken auf, um sie einfacher zu machen. Lillian Gilbreth hatte einen Doktortitel in Psychologie und wurde 1965 als erste Frau in die amerikanische Akademie der Ingenieure gewählt. Programmierer haben die Idee später für ihre Pläne übernommen. -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„PAP und Pseudocode“](?visustruct&lektion=01-weitere-darstellungen) mit Kuchenbacken als PAP und dem Befehl GOTO. Sie öffnet sich in einem neuen Fenster. - -## Spiel: Welche Darstellung? - -::: spiel frage -titel: Spiel: Welche Darstellung? -intro: Ludwig beschreibt einen Plan für den mBot2, ohne zu sagen, wie er aufgeschrieben ist. Ist es das Struktogramm, der PAP oder der Pseudocode? Sechs Runden. -antworten: Struktogramm | PAP | Pseudocode - -runde: -frage: „Ein Pfeil führt von der Raute zurück zu ‚50 cm vorwärts fahren‘.“ -richtig: PAP -> Eine Schleife im PAP erkennst du am Pfeil zurück nach oben. - -runde: -frage: „Die Schleife sieht aus wie ein gekipptes L, darin stehen fahre vor und drehe rechts.“ -richtig: Struktogramm -> Das gekippte L ist die Schleife im Struktogramm. - -runde: -frage: „WIEDERHOLE 4-mal, darunter eingerückt zwei Zeilen.“ -richtig: Pseudocode -> Feste Wörter und Einrückung: Das ist Pseudocode. - -runde: -frage: „‚Quadrat fertig!‘ steht in einem schrägen Kasten.“ -richtig: PAP -> Der schräge Kasten ist das Parallelogramm für Ein- und Ausgabe. - -runde: -frage: „Es gibt keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit.“ -richtig: Struktogramm -> Ohne Pfeile kann im Struktogramm kein Sprung auf die falsche Stelle zeigen. - -runde: -frage: „Manche schreiben FÜR i VON 1 BIS 4, andere WIEDERHOLE 4-mal. Beides ist richtig.“ -richtig: Pseudocode -> Pseudocode hat keine feste Schreibweise. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Elemente eines PAP benennen. → Der PAP -- Ich kann das Quadrat selbst als PAP zusammenbauen. → Übung: Das Quadrat als PAP -- Ich kann einen Plan als Pseudocode lesen. → Pseudocode -- Ich kann Struktogramm, PAP und Pseudocode vergleichen. → Drei Arten, einen Plan aufzuschreiben -::: - -## Wissenstest - -::: quiz -? Woran erkennst du im PAP eine Schleife? -→ Der PAP -- [ ] An einem gekippten L -- [x] An einem Pfeil, der zurück nach oben führt -- [ ] Am Wort WIEDERHOLE -> Das gekippte L gehört zum Struktogramm, WIEDERHOLE zum Pseudocode. - -? Ordne jedem Symbol im PAP seine Bedeutung zu. -→ Der PAP -= Oval -> Start oder Ende -= Rechteck -> Anweisung -= Raute -> Frage mit ja und nein -= Parallelogramm -> Ein- oder Ausgabe -> „50 cm vorwärts fahren“ ist eine Anweisung, „Quadrat fertig!“ anzeigen eine Ausgabe. - -? Im Quadrat-PAP steht „4 Seiten gefahren?“ in der Raute. Wohin führt der Pfeil bei **nein**? -→ Übung: Das Quadrat als PAP -- [x] Zurück zu „50 cm vorwärts fahren“ -- [ ] Zum Ende -- [ ] Zu „Quadrat fertig!“ anzeigen -> Bei nein ist das Quadrat noch nicht fertig, also fährt der mBot2 die nächste Seite. - -? Was zeigt im Pseudocode, welche Zeilen zur Schleife gehören? -→ Pseudocode -- [ ] Ein Pfeil -- [x] Die Einrückung und das ENDE WIEDERHOLE -- [ ] Die Farbe -> Alles zwischen WIEDERHOLE und ENDE WIEDERHOLE ist eingerückt und wird wiederholt. - -? Kann der mBot2 Pseudocode direkt ausführen? -→ Drei Arten, einen Plan aufzuschreiben -- [ ] Ja, wie Java -- [x] Nein, Pseudocode ist nur ein Plan für Menschen -> Ausführen kann der mBot2 das Struktogramm oder Java. Pseudocode hilft beim Planen. -::: diff --git a/web/lessons/de/visubot/03-variablen-und-ausgabe.md b/web/lessons/de/visubot/03-variablen-und-ausgabe.md deleted file mode 100644 index 064d7a4f..00000000 --- a/web/lessons/de/visubot/03-variablen-und-ausgabe.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -titel: Variablen und Ausgabe -bereich: Losfahren -kurz: Werte in Variablen speichern, den mBot2 damit fahren lassen und Ergebnisse auf dem Bildschirm zeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable anlegen und benutzen -- ein kurzes Java-Programm lesen und im Bereich Code tippen -- die Datentypen `int`, `double`, `String` und `boolean` unterscheiden -- mit zwei Variablen ein Rechteck in Java fahren -- mit `mbot.showText` ein Ergebnis auf dem Bildschirm zeigen -::: - -## Eine Variable für die Seite - -Mit `mbot.forward(30)` fährt der mBot2 30 cm am Stück. Fährst du damit ein Quadrat ohne Schleife, steht die 30 aber viermal im Programm. Soll das Quadrat größer werden, musst du sie an vier Stellen ändern. Besser ist es, die Seitenlänge **einmal** zu speichern und dann überall zu benutzen. - -Dafür gibt es **Variablen**. Eine Variable ist ein Kästchen mit einem Namen, in dem ein Wert liegt: - -```java -int seite = 30; -mbot.forward(seite); -``` - -- `int` ist der **Datentyp**: eine ganze Zahl. -- `seite` ist der **Name**. Du darfst ihn selbst wählen. -- `30` ist der **Wert**. Das `=` legt ihn in das Kästchen. - -Wo danach `seite` steht, setzt der Computer den Wert ein. `mbot.forward(seite)` fährt also 30 cm. - -::: übung vb-variable-seite -titel: Quadrat mit Variable -auftrag: Lege in einer Anweisung die Variable `int seite = 30` an. Danach fährt der mBot2 ein Quadrat: viermal `seite` Zentimeter vor und nach rechts drehen. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: Die erste Anweisung ist `int seite = 30`. Darunter kommt eine For-Schleife, die viermal läuft. -tipp: In der Schleife stehen `mbot.forward(seite)` und `mbot.turnRight()`. -lösung: vb-variable-seite-loesung.visustruct -::: - -> Ändere jetzt nur die 30 in eine 60 und starte die Simulation. Das ganze Quadrat wird doppelt so groß. - -## Welche Datentypen gibt es? - -Jede Variable hat einen Datentyp. Er legt fest, welche Werte hineinpassen: - -| Datentyp | Was passt hinein? | Beispiel | -|---|---|---| -| `int` | ganze Zahlen | `int seite = 30;` | -| `double` | Kommazahlen, mit Punkt geschrieben | `double radumfang = 20.4;` | -| `String` | Text in Anführungszeichen | `String name = "Ludwig";` | -| `boolean` | wahr oder falsch | `boolean wandNah = mbot.getDistance() < 20;` | - -Ein Rad des mBot2 kommt mit einer Umdrehung etwa 20.4 cm weit, das ist eine Kommazahl. In `wandNah` steht `true`, wenn die Wand näher als 20 cm ist. Den Abstandssensor lernst du in Lektion 4 kennen. - -Mit Variablen kannst du auch rechnen: `int strecke = 4 * seite;` rechnet die ganze Strecke des Quadrats aus. - -## So sieht Java aus - -Bisher hast du Kästen gezogen. Ab jetzt schreibst du manche Programme auch in **Java**. Die Kästen kennst du schon, denn ihr Text ist bereits echtes Java. Rechts neben dem Struktogramm liegt der Bereich [Code](#zeige-codelive). Dort steht dein Struktogramm als Java-Code, und was du dort tippst, wird sofort zum Struktogramm. - -Das Quadrat mit Variable sieht in Java so aus: - -```java -int seite = 30; -for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); -} -``` - -- Jeder Kasten ist eine Zeile. Am Ende jeder Anweisung steht ein **Semikolon** `;`. -- Die For-Schleife heißt `for`. In den runden Klammern stehen ihre drei Teile Start, Bedingung und Schritt, getrennt durch `;`. -- Was in der Schleife wiederholt wird, steht in **geschweiften Klammern** `{ }`. Rücke es ein, dann siehst du sofort, was dazugehört. Hinter `{` und `}` kommt kein Semikolon. -- Groß- und Kleinschreibung zählt: `mbot.turnRight()` geht, `mbot.turnright()` nicht. - -> So löst du eine Java-Übung: Klicke auf **Im Editor öffnen**. Dann öffnet sich rechts der Bereich Code. Tippe dort dein Programm, sieh in der Simulation zu und klicke zum Schluss auf **Prüfen**. - -## Jetzt in Java: Rechteck - -Ein Rechteck hat zwei verschiedene Seiten. Also brauchst du zwei Variablen. - -::: übung vb-java-rechteck -titel: Rechteck mit Variablen -code: java -auftrag: Schreibe in Java: Lege `int laenge = 60` und `int breite = 30` an. Der mBot2 fährt ein Rechteck: Länge, rechts drehen, Breite, rechts drehen, und das zweimal. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -braucht: forSchleife -tipp: Zwei Variablen oben: `int laenge = 60;` und `int breite = 30;`. Darunter eine For-Schleife, die zweimal läuft. -tipp: In der Schleife: `mbot.forward(laenge);`, `mbot.turnRight();`, `mbot.forward(breite);`, `mbot.turnRight();` -lösung: vb-java-rechteck-loesung.visustruct -::: - -## Ergebnis auf dem Bildschirm - -Der mBot2 kann nicht nur fahren, er kann dir auch etwas zeigen. Mit `mbot.showText(…)` steht ein Text auf dem [Bildschirm]{teil=screen} des CyberPi. Mit `+` hängst du Text und Werte aneinander: - -```java -int seite = 30; -int strecke = 4 * seite; -mbot.showText("Strecke: " + strecke + " cm"); -``` - -Der Bildschirm zeigt dann **Strecke: 120 cm**. Den Bildschirm lernst du in Lektion 18 noch genauer kennen. - -::: übung vb-strecke-anzeigen -titel: Wie weit fährt er? -code: java -auftrag: Lege `int laenge = 60` und `int breite = 30` an und fahre das Rechteck wie eben. Berechne danach in einer Variablen `strecke`, wie weit der mBot2 einmal ganz herum gefahren ist, und zeige **Strecke: 180 cm** auf dem Bildschirm. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -befehle: showText "Strecke: 180 cm" -braucht: forSchleife -tipp: Einmal herum sind zweimal die Länge und zweimal die Breite: `int strecke = 2 * laenge + 2 * breite;` -tipp: Nach der Schleife: `mbot.showText("Strecke: " + strecke + " cm");` -lösung: vb-strecke-anzeigen-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Eingabe und Ausgabe“](?visustruct&lektion=06-eingabe-und-ausgabe). Sie öffnet sich in einem neuen Fenster. Dort gibst du Ergebnisse mit `System.out.println` in der Konsole aus. - -## Spiel: Welcher Datentyp? - -::: spiel frage -titel: Spiel: Welcher Datentyp? -intro: Ludwig hat die Datentypen weggewischt. Welcher passt in die Lücke? Sieben Runden. -antworten: int | double | String | boolean - -runde: - ___ seite = 30; -frage: Welcher Datentyp passt? -richtig: int -> 30 ist eine ganze Zahl. - -runde: - ___ radumfang = 20.4; -frage: Welcher Datentyp passt? -richtig: double -> 20.4 ist eine Kommazahl, in Java mit Punkt geschrieben. - -runde: - ___ name = "Ludwig"; -frage: Welcher Datentyp passt? -richtig: String -> Text in Anführungszeichen ist ein `String`. - -runde: - ___ wandNah = mbot.getDistance() < 20; -frage: Welcher Datentyp passt? -richtig: boolean -> Ein Vergleich ist wahr oder falsch, also `boolean`. - -runde: - ___ abstand = mbot.getDistance(); -frage: Welcher Datentyp passt? -richtig: int -> Der Abstandssensor liefert ganze Zentimeter, zum Beispiel 38. - -runde: - ___ gruss = "Hallo " + "Klasse"; -frage: Welcher Datentyp passt? -richtig: String -> Zwei Texte mit `+` ergeben wieder einen Text. - -runde: - ___ mittelwert = 120 / 5.0; -frage: Welcher Datentyp passt? -richtig: double -> Mit `5.0` rechnet Java mit Kommazahlen. Das Ergebnis ist 24.0. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Achte auf die Werte in den Variablen. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - int seite = 60; - mbot.forward(seite); - mbot.turnRight(); - mbot.forward(seite); -karte: ... | ... | ^.. -ziel: 2,0 -> `seite` ist 60, also zwei Felder hoch und zwei nach rechts. - -runde: - int a = 30; - int b = a * 3; - mbot.forward(b); -karte: ... | ... | ... | ^.. -ziel: 0,0 -> `b` ist 3 · 30 = 90 cm, also drei Felder. - -runde: - int strecke = 30 * 2; - mbot.backward(strecke); -karte: ..^.. | ..... | ..... -ziel: 2,2 -> `backward` fährt rückwärts: Er schaut nach oben, fährt aber 60 cm nach unten. - -runde: - int seite = 30; - for (int i = 0; i < 2; i++) { - mbot.forward(seite); - mbot.turnRight(); - seite = seite + 30; - } -karte: .... | .... | .... | ^... -ziel: 2,2 -> Erst 30 cm hoch, dann wächst `seite` auf 60: zwei Felder nach rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable anlegen und benutzen. → Eine Variable für die Seite -- Ich kann ein kurzes Java-Programm lesen und im Bereich Code tippen. → So sieht Java aus -- Ich kann die Datentypen `int`, `double`, `String` und `boolean` unterscheiden. → Welche Datentypen gibt es? -- Ich kann mit zwei Variablen ein Rechteck in Java fahren. → Jetzt in Java: Rechteck -- Ich kann mit `mbot.showText` ein Ergebnis auf dem Bildschirm zeigen. → Ergebnis auf dem Bildschirm -::: - -## Wissenstest - -::: quiz -? Was fährt `mbot.forward(seite)`, wenn vorher `int seite = 40;` steht? -→ Eine Variable für die Seite -- [ ] 4 cm -- [x] 40 cm -- [ ] gar nichts, `seite` ist kein Befehl -> Wo `seite` steht, setzt Java den Wert 40 ein. -? Welcher Datentyp passt zu `"Ludwig"`? -→ Welche Datentypen gibt es? -- [ ] `int` -- [ ] `double` -- [x] `String` -> Text in Anführungszeichen ist ein `String`. -? Was zeigt `mbot.showText("Seite: " + 30);` auf dem Bildschirm? -→ Ergebnis auf dem Bildschirm -- [x] Seite: 30 -- [ ] "Seite: " + 30 -- [ ] 30 -> Das `+` hängt den Text und die Zahl aneinander. -::: diff --git a/web/lessons/de/visubot/03-zeile-fuer-zeile-testen.md b/web/lessons/de/visubot/03-zeile-fuer-zeile-testen.md deleted file mode 100644 index 622a0f89..00000000 --- a/web/lessons/de/visubot/03-zeile-fuer-zeile-testen.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -titel: Schritt für Schritt testen -bereich: Losfahren -kurz: Mit der Simulation und dem Schreibtischtest herausfinden, was dein Programm wirklich tut. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Simulation mit Start, Schritt und Stopp steuern -- in der Simulation die Variablen beobachten -- einen Schreibtischtest mit einer Tabelle machen -- mit der Simulation einen Fehler finden und reparieren -::: - -## Die Simulation steuern - -Mit dem Knopf [▶︎ Simulation starten](#zeige-simulation) rechts bei den Werkzeugen führt VisuStruct dein Struktogramm aus. In der VisuBot-Welt fährt der mBot2 dabei mit. Rechts erscheint die **Steuerung**: - -- **Start** führt das Programm automatisch Schritt für Schritt aus. Wie schnell, stellst du bei **Pause pro Schritt** ein. -- **Pause** hält an. Danach geht es mit Start oder Schritt weiter. -- **Schritt** führt genau einen Kasten aus. So kannst du in Ruhe zuschauen. -- **Stopp** bricht ab und stellt den mBot2 zurück an den Start. - -Während der Simulation ist ein Kasten farbig markiert. Unter **Letzter Schritt** steht, was gerade passiert ist, unter **Variablen** stehen alle Variablen mit ihren Werten. - -::: diagramm vb-l03-wachsend-loesung.visustruct -Jede Seite wird 10 cm länger. Öffne das Diagramm im Editor und gehe es mit **Schritt** durch. Beobachte dabei `seite` und `i`. -::: - -## Der Schreibtischtest - -Beim **Schreibtischtest** spielst du selbst den Computer. Du gehst das Struktogramm mit Stift und Papier durch und schreibst nach jedem Schritt die Werte der Variablen auf. Für das Diagramm oben sieht die Tabelle so aus: - -| Schritt | `i` | `seite` | Der mBot2 … | -|---|---|---|---| -| `int seite = 20` | – | 20 | | -| `mbot.forward(seite)` | 0 | 20 | fährt 20 cm | -| `mbot.turnRight()` | 0 | 20 | dreht rechts | -| `seite = seite + 10` | 0 | 30 | | -| `mbot.forward(seite)` | 1 | 30 | fährt 30 cm | -| … | … | … | … | - -Vergleiche deine Tabelle danach mit der Simulation. Stimmen die Werte unter **Variablen** nach jedem Schritt? - -::: angeberwissen -Früher war „Computer“ ein Beruf: Menschen, die mit Stift und Papier rechneten. Eine der besten war Katherine Johnson bei der NASA. 1962 wollte der Astronaut John Glenn erst losfliegen, als sie die Flugbahn des neuen IBM-Rechners von Hand nachgerechnet hatte: „Wenn sie sagt, die Zahlen stimmen, fliege ich.“ -::: - -## Fehler finden mit der Simulation - -Ludwig wollte die Spirale von oben bauen: 20 cm, 30 cm, 40 cm. Sein mBot2 fährt aber 30, 40 und 50 cm. Das Programm läuft ohne Fehlermeldung, es tut nur das Falsche. So einen Fehler nennt man **logischen Fehler**. Ihn findest du am besten mit **Schritt** und den Variablen. - -::: übung vb-spirale-falsch -titel: Die Spirale reparieren -auftrag: „Im Editor öffnen“ lädt Ludwigs Struktogramm. Gehe es mit **Schritt** durch und beobachte `seite`. Finde heraus, warum die erste Seite 30 cm lang ist, und repariere es. Der mBot2 soll 20, 30 und 40 cm fahren und nach jeder Seite rechts drehen. -start: vb-spirale-falsch-start.visustruct -fahrt: forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -braucht: forSchleife -tipp: Achte darauf, welchen Wert `seite` hat, wenn `mbot.forward(seite)` drankommt. Ist die Reihenfolge in der Schleife richtig? -tipp: `seite = seite + 10` muss **nach** `mbot.forward(seite)` und `mbot.turnRight()` stehen. Zieh den Kasten ans Ende der Schleife. -lösung: vb-spirale-falsch-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Simulation und Schreibtischtest“](?visustruct&lektion=07-simulation-und-schreibtischtest). Sie öffnet sich in einem neuen Fenster. - -## Spiel: Spiel den Computer - -::: spiel frage -titel: Spiel: Spiel den Computer -intro: Mach in deinem Kopf den Schreibtischtest. Was tut der mBot2, und welche Werte haben die Variablen? Fünf Runden. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite + 10; - } -frage: Welchen Wert hat `seite` nach der Schleife? -- 40 -- [x] 50 -- 30 -> 20, dann 30, 40 und nach dem dritten Durchgang 50. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite + 10; - } -frage: Wie weit fährt der mBot2 beim dritten Mal? -- [x] 40 cm -- 50 cm -- 30 cm -> Er fährt 20, 30 und 40 cm. Die 50 steht erst danach in `seite`. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - seite = seite + 10; - mbot.forward(seite); - } -frage: Wie weit fährt der mBot2 beim ersten Mal? -- 20 cm -- [x] 30 cm -- 10 cm -> `seite` wächst schon vor dem Fahren. Genau das war Ludwigs logischer Fehler. - -runde: - int strecke = 0; - for (int i = 0; i < 4; i++) { - mbot.forward(25); - strecke = strecke + 25; - } - mbot.showText("Strecke: " + strecke); -frage: Was zeigt der Bildschirm am Ende? -- Strecke: 25 -- [x] Strecke: 100 -- Strecke: 0 -> Viermal kommen 25 dazu: 25, 50, 75, 100. - -runde: - int seite = 10; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite * 2; - } -frage: Wie weit fährt der mBot2 insgesamt? -- 60 cm -- [x] 70 cm -- 80 cm -> Er fährt 10, 20 und 40 cm. Zusammen sind das 70 cm. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 8 4 SCHLEIFE: wiederholt Schritte, im Struktogramm wie ein gekipptes L -- ↓ 1 6 ALGORITHMUS: genaue Schritt-für-Schritt-Anleitung -- ↓ 4 8 SEQUENZ: Schritte, die nacheinander kommen -- → 1 1 SIMULATION: führt dein Programm am Bildschirm aus, auch ohne Roboter -- ↓ 8 4 STRUKTOGRAMM: Plan aus Kästen, den du von oben nach unten liest -- → 16 2 VARIABLE: Kästchen mit Namen, in dem ein Wert liegt -- → 13 2 DATENTYP: legt fest, welche Werte in eine Variable passen, z. B. int -- ↓ 4 11 SCHREIBTISCHTEST: du spielst mit Stift und Papier den Computer -lösung: 10 4, 4 6, 16 7, 14 4, 13 4, 13 5, 7 11 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Simulation mit Start, Schritt und Stopp steuern. → Die Simulation steuern -- Ich kann in der Simulation die Variablen beobachten. → Die Simulation steuern -- Ich kann einen Schreibtischtest mit einer Tabelle machen. → Der Schreibtischtest -- Ich kann mit der Simulation einen Fehler finden und reparieren. → Fehler finden mit der Simulation -::: - -## Wissenstest - -::: quiz -? Welcher Knopf führt genau einen Kasten aus? -→ Die Simulation steuern -- [ ] Start -- [x] Schritt -- [ ] Stopp -> Mit Schritt geht es Kasten für Kasten. Start läuft von allein weiter. -? Wie lang fährt der mBot2 im zweiten Durchgang von „Wachsende Seiten“? -→ Der Schreibtischtest -- [ ] 20 cm -- [x] 30 cm -- [ ] 40 cm -> Nach dem ersten Durchgang ist `seite` um 10 gewachsen, also 30. -? Das Programm läuft ohne Meldung, der mBot2 fährt aber falsch. Was für ein Fehler ist das? -→ Fehler finden mit der Simulation -- [ ] ein Tippfehler -- [x] ein logischer Fehler -- [ ] ein Fehler im Roboter -> Das Programm tut genau, was dasteht, nur nicht das, was gemeint war. -::: diff --git a/web/lessons/de/visubot/04-sensoren.md b/web/lessons/de/visubot/04-sensoren.md deleted file mode 100644 index f905b0d8..00000000 --- a/web/lessons/de/visubot/04-sensoren.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -titel: Sensoren abfragen -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 misst etwas, und dein Programm entscheidet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- den Unterschied zwischen Befehl und Sensor erklären -- einen Sensor in eine Bedingung einbauen -::: - -## Befehle und Sensoren - -Bisher hast du dem mBot2 nur **Befehle** gegeben: fahre vor, drehe rechts. Er hat sie ausgeführt, ohne auf seine Umgebung zu achten. - -Jetzt kommen die **Sensoren** dazu. Unter den [Elementen](#zeige-elemente) gibt es dafür die Gruppe **mBot2-Sensoren**: - -| Sensor | Text | Was du bekommst | -|---|---|---| -| Abstand | `mbot.getDistance()` | Abstand bis zur nächsten Wand in cm, z. B. `38` | -| Linie | `mbot.getLine()` | `0`, wenn unter dem Liniensensor alles hell ist, sonst eine Zahl größer als 0 | - -Der mBot2 hat noch mehr Sensoren: Farben, Tasten und Joystick, Licht, Lautstärke und Neigung. Jeden lernst du in den Lektionen 6 bis 13 einzeln kennen, die Motoren in Lektion 20 und Stoppuhr und Akku in Lektion 21. - -Ein Sensor ist **kein eigener Kasten**. Er liefert eine Zahl, und mit der baust du eine **Bedingung**: - -```java -mbot.getDistance() < 20 -``` - -Das heißt: „Ist die Wand näher als 20 cm?“ Die Antwort ist wahr oder falsch. - -> So baust du es: Zieh zuerst eine **Verzweigung** ins Struktogramm. Dann ziehst du den Sensor **Abstand** auf die Verzweigung. In der Bedingung steht jetzt `mbot.getDistance()`. Den Vergleich `< 20` schreibst du selbst dazu. - -## Wand vorn? - -Der mBot2 soll selbst entscheiden: Ist vorn eine Wand, dreht er sich nach rechts. Ist frei, fährt er ein Stück vor. - -Diese Übung hat **zwei Welten**: In der einen steht die Wand direkt vor ihm, in der anderen ist viel Platz. Dein Programm muss in beiden das Richtige tun. - -::: übung vb-wand-vorn -titel: Wand vorn? -auftrag: Baue eine Verzweigung mit der Bedingung `mbot.getDistance() < 20`. Bei **true** dreht sich der mBot2 nach rechts, bei **false** fährt er vor. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und dann den Sensor **Abstand** auf die Verzweigung. Schreib dahinter `< 20`. -tipp: Im true-Zweig steht `mbot.turnRight()`, im false-Zweig `mbot.forward()`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -Im Bereich [Code](#zeige-codelive) siehst du dein Struktogramm auch als Java. Eine Verzweigung heißt dort **if**, der false-Zweig **else**. Die Bedingung steht in runden Klammern, jeder Zweig in geschweiften Klammern: - -```java -if (mbot.getDistance() < 20) { - mbot.turnRight(); -} else { - mbot.forward(); -} -``` - -> Selbst tippen musst du `if` noch nicht. Mehr dazu kommt in der Lektion über den Ultraschallsensor. - -## Was liefert der Sensor? - -Ein Sensor liefert einen **Wert**, so wie eine Variable. Fährt der mBot2 weiter, ändert sich der Wert: Der Abstand wird kleiner, je näher die Wand kommt. Erst ein **Vergleich** macht aus dem Wert eine Frage mit der Antwort `true` (wahr) oder `false` (falsch). - -| Bedingung | Frage | Antwort bei 38 cm Abstand | -|---|---|---| -| `mbot.getDistance() < 20` | Ist die Wand näher als 20 cm? | `false` | -| `mbot.getDistance() > 30` | Ist mehr als 30 cm Platz? | `true` | -| `mbot.getLine() == 0` | Ist unter dem mBot2 alles hell? | hängt vom Boden ab | - -Vergleichen kannst du mit `<` (kleiner), `>` (größer), `<=` (kleiner oder gleich), `>=` (größer oder gleich), `==` (gleich) und `!=` (ungleich). - -> Für „gleich“ schreibst du **zwei** Gleichheitszeichen: `==`. Ein einzelnes `=` legt einen Wert in eine Variable, das ist etwas ganz anderes. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Verzweigung“](?visustruct&lektion=08-verzweigung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-04-sensoren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wand vorn?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-04-sensoren-start.visustruct -welt: wand-nah -> turnRight -welt: wand-frei -> forward -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.turnRight()`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -## Spiel: Befehl oder Sensor? - -::: spiel frage -titel: Spiel: Befehl oder Sensor? -intro: Tut die Zeile etwas, oder liefert sie einen Wert? Acht Runden. -antworten: Befehl | Sensor - -runde: - mbot.forward(30) -frage: Befehl oder Sensor? -richtig: Befehl -> Er fährt 30 cm. Das ist etwas tun. - -runde: - mbot.getDistance() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert den Abstand in cm, zum Beispiel 38. - -runde: - mbot.turnRight() -frage: Befehl oder Sensor? -richtig: Befehl -> Drehen ist etwas tun. - -runde: - mbot.getLine() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert 0 oder eine Zahl größer als 0. - -runde: - mbot.playTone(440, 300) -frage: Befehl oder Sensor? -richtig: Befehl -> Ein Ton ist eine Ausgabe. - -runde: - mbot.isButtonA() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert wahr oder falsch: Wird Taste A gedrückt? - -runde: - mbot.showText("Hallo") -frage: Befehl oder Sensor? -richtig: Befehl -> Etwas anzeigen ist etwas tun. - -runde: - mbot.getBrightness() -frage: Befehl oder Sensor? -richtig: Sensor -> Er misst, wie hell es ist, von 0 bis 100. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann den Unterschied zwischen Befehl und Sensor erklären. → Befehle und Sensoren -- Ich kann einen Sensor in eine Bedingung einbauen. → Wand vorn? -::: - -## Wissenstest - -::: quiz -? Die Wand ist 12 cm entfernt. Ist `mbot.getDistance() < 20` wahr oder falsch? -→ Wand vorn? -- [x] wahr -- [ ] falsch -> 12 ist kleiner als 20, also ist die Bedingung wahr. -? Der mBot2 steht auf hellem Boden. Was liefert `mbot.getLine()`? -→ Befehle und Sensoren -- [x] 0 -- [ ] 15 -- [ ] den Abstand in cm -> 0 heißt: Keiner der vier Fühler sieht etwas Dunkles. -? Warum ist der Sensor kein eigener Kasten im Struktogramm? -→ Wand vorn? -- [x] Er tut nichts, er liefert nur einen Wert. Den braucht man in einer Bedingung. -- [ ] Weil der mBot2 sonst zu langsam wird. -- [ ] Weil Sensoren nur in Java gehen. -> Befehle sind Anweisungen. Sensoren sind Werte, so wie eine Variable. -::: diff --git a/web/lessons/de/visubot/05-bis-zur-wand.md b/web/lessons/de/visubot/05-bis-zur-wand.md deleted file mode 100644 index 4229363b..00000000 --- a/web/lessons/de/visubot/05-bis-zur-wand.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -titel: Bis zur Wand -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 misst den Abstand und hält rechtzeitig an. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit `mbot.getDistance()` den Abstand abfragen -- entscheiden, wann ich eine While-Schleife statt einer For-Schleife nehme -- mit dem Liniensensor ein Ziel finden -::: - -## Wie weit ist die Wand? - -Bisher hast du genau gesagt, wie weit der mBot2 fahren soll. Jetzt soll er selbst merken, wann er anhalten muss. - -Dafür gibt es den Ultraschallsensor. `mbot.getDistance()` liefert den Abstand bis zur nächsten Wand in Zentimetern, zum Beispiel `38`. Du kannst ihn wie eine Zahl benutzen: - -```java -mbot.getDistance() > 15 -``` - -Das ist eine **Bedingung**: Sie ist wahr, solange die Wand mehr als 15 cm entfernt ist. - -> Starte die [Simulation](#zeige-simulation): Unter der Welt steht immer der aktuelle Abstand. Fährt der mBot2 näher an die Wand, wird die Zahl kleiner. - -## Drei Welten, ein Programm - -Diese Übung hat **drei Welten**. In jeder steht die Wand woanders, und der mBot2 soll jedes Mal im Ziel mit der grünen Fahne anhalten, ohne anzustoßen. - -Mit einer festen Anzahl **fahre vor** klappt das nur in einer Welt. Du brauchst eine Schleife, die so lange fährt, wie die Bedingung wahr ist: die **While-Schleife**. - -::: übung vb-bis-wand -titel: Bis zur Wand -auftrag: Der mBot2 soll vorwärts fahren, bis die Wand höchstens 15 cm entfernt ist. Dein Programm muss in allen drei Welten funktionieren. Über der Simulation wählst du, welche Welt du siehst. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Abstand** auf die Schleife. Dann fehlt nur noch der Vergleich. -tipp: Eine While-Schleife mit der Bedingung `mbot.getDistance() > 15`, darin ein `mbot.forward()`. -lösung: vb-bis-wand-loesung.visustruct -::: - -::: ludwig -Eine Schleife, die eine Bedingung prüft, bevor sie fährt, ist wie ich am Futtertrog: Ich frage zuerst, ob noch etwas drin ist, und erst dann fresse ich weiter. -::: - -## Bis zum Ziel - -Jetzt kommt der zweite Sensor dran. Das Ziel ist ein schwarzes Feld mit grüner Fahne. Fährt der mBot2 darauf, sieht es sein Liniensensor: `mbot.getLine()` ist dann nicht mehr `0`. - -::: übung vb-bis-ziel -titel: Fahre bis zum Ziel -auftrag: Der mBot2 soll so lange vorwärts fahren, bis er auf dem Ziel steht. Auch hier gibt es zwei Welten. -welt: ziel-kurz, ziel-lang -braucht: whileSchleife -tipp: Die Schleife soll laufen, solange der Liniensensor **nichts** sieht. Zieh den Sensor **Linie** auf die While-Schleife. -tipp: Die Bedingung heißt `mbot.getLine() == 0`. In der Schleife steht `mbot.forward()`. -lösung: vb-bis-ziel-loesung.visustruct -::: - -## Was prüft die Schleife? - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„While-Schleife“](?visustruct&lektion=11-while-schleife). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-05-bis-zur-wand -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Wand“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-bis-zur-wand-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.forward()`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Spiel: Wie oft fährt er? - -::: spiel frage -titel: Spiel: Wie oft fährt er? -intro: Jede Fahrt ist 10 cm lang. Rechne aus, wie oft der mBot2 vorfährt, bevor die Schleife aufhört. Sechs Runden. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 40 cm entfernt. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- 4-mal -> 40, 30 und 20 sind größer als 15: drei Fahrten. Bei 10 hört die Schleife auf. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 15 cm entfernt. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- 2-mal -> 15 ist nicht größer als 15. Die Bedingung ist gleich am Anfang falsch. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 50 cm entfernt. Wo hält er an? -- 15 cm vor der Wand -- [x] 10 cm vor der Wand -- 0 cm, er stößt an -> 50, 40, 30, 20: viermal vor. Dann ist die Wand 10 cm weg, und die Schleife hört auf. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } -frage: Der mBot2 steht schon auf dem schwarzen Ziel. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- immer weiter -> Auf Schwarz ist `mbot.getLine()` nicht 0. Die Bedingung ist sofort falsch. - -runde: -frage: Der mBot2 soll genau fünfmal vorfahren. Welche Schleife passt am besten? -- [x] eine For-Schleife -- eine While-Schleife mit `mbot.getDistance()` -- gar keine Schleife -> Die Anzahl steht vorher fest. Dafür ist die For-Schleife da. - -runde: -frage: Der mBot2 soll fahren, bis er die Wand fast berührt. Welche Schleife passt? -- eine For-Schleife, die zehnmal läuft -- [x] eine While-Schleife mit `mbot.getDistance()` -- gar keine Schleife -> Wie weit die Wand weg ist, weiß man vorher nicht. Die While-Schleife fragt unterwegs nach. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Grau ist eine Wand. Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß, der Sensor sitzt vorn am mBot2. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, solange vorn mehr als 15 cm frei sind. Direkt vor der Wand hält er an. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,1 -> Egal wie weit die Wand weg ist: Die While-Schleife hält ihn direkt davor an. - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(60); -karte: ##### | ..... | ..... | ..... | ^.... -ziel: 2,2 -> Bei mehr als 45 cm hört er schon ein Feld früher auf, dreht sich und fährt zwei Felder nach rechts. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,0 -> Er fährt, bis sein Liniensensor Schwarz sieht. Dann steht er auf dem schwarzen Feld. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit `mbot.getDistance()` den Abstand abfragen. → Wie weit ist die Wand? -- Ich kann entscheiden, wann ich eine While-Schleife statt einer For-Schleife nehme. → Drei Welten, ein Programm -- Ich kann mit dem Liniensensor ein Ziel finden. → Bis zum Ziel -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht 40 cm vor der Wand. Wie oft fährt er mit `while (mbot.getDistance() > 15) mbot.forward();` vor, wenn jede Fahrt 10 cm ist? -→ Wie weit ist die Wand? -- [ ] gar nicht -- [ ] einmal -- [x] so oft, bis die Wand höchstens 15 cm weg ist -- [ ] immer genau fünfmal -> Die While-Schleife prüft vor jeder Fahrt die Bedingung. Ist die Wand nah genug, hört sie auf. -? Warum reicht hier keine For-Schleife mit fester Anzahl? -→ Drei Welten, ein Programm -- [x] Weil die Wand in jeder Welt anders weit weg ist. -- [ ] Weil eine For-Schleife keine Anweisungen enthalten darf. -- [ ] Weil der mBot2 For-Schleifen nicht versteht. -> Die For-Schleife weiß vorher, wie oft sie läuft. Die While-Schleife entscheidet unterwegs. -::: diff --git a/web/lessons/de/visubot/05-erst-fahren-dann-pruefen.md b/web/lessons/de/visubot/05-erst-fahren-dann-pruefen.md deleted file mode 100644 index f122d8a1..00000000 --- a/web/lessons/de/visubot/05-erst-fahren-dann-pruefen.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -titel: Erst fahren, dann prüfen -bereich: Sensoren und Entscheidungen -kurz: Die Do-while-Schleife fährt immer mindestens einmal und prüft erst danach. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft -- eine While- und eine Do-while-Schleife vergleichen -- eine Do-while-Schleife in Java schreiben -::: - -## Erst fahren, dann prüfen - -Die While-Schleife aus Lektion 5 prüft **zuerst** und fährt dann. Steht die Wand schon direkt vor dem mBot2, fährt er gar nicht los. Sie ist **kopfgesteuert**: Die Bedingung steht oben im Kopf. - -Die **Do-while-Schleife** ist **fußgesteuert**. Die Bedingung steht unten im Fuß des Kastens: - -1. Den Inhalt einmal ausführen. -2. Die Bedingung prüfen. -3. Ist sie wahr, wieder bei 1 anfangen. Ist sie falsch, geht es unter der Schleife weiter. - -Deshalb läuft der Inhalt **immer mindestens einmal**. Wenn du die Schleife anklickst, steht im Objektinspektor vor dem Textfeld `while`: Die Bedingung heißt „wiederhole, solange …“. - -| Abstand am Anfang | While-Schleife | Do-while-Schleife | -|---|---|---| -| 50 cm | fährt bis 15 cm | fährt bis 15 cm | -| 10 cm | fährt **gar nicht** | fährt **einmal** 10 cm | - -::: übung vb-do-while -titel: Mindestens ein Schritt -auftrag: Baue ein Struktogramm mit einer Do-while-Schleife: Der mBot2 fährt vor, solange der Abstand größer als 15 cm ist, aber **mindestens einmal**. Danach spielt er einen Ton. -messwerte: getDistance=10 -> forward, tone -welt: wand-kurz -> tone -braucht: doUntilSchleife -tipp: Zieh die **Do-while-Schleife** aus den Elementen ins Struktogramm. In den Kasten kommt **fahre vor**, in den Fuß die Bedingung `mbot.getDistance() > 15`. -tipp: Unter die Schleife (nicht hinein) kommt `mbot.playTone(440, 300)`. -lösung: vb-do-while-loesung.visustruct -::: - -> Beim Prüfen steht die Wand einmal nur 10 cm vor dem mBot2. Eine While-Schleife würde dann gar nicht fahren. - -## Jetzt in Java: Schritte zählen - -In Java steht `do` oben und `while (…)` mit Semikolon unten: - -```java -do { - mbot.forward(); -} while (mbot.getDistance() > 15); -``` - -::: übung vb-java-schritte-zaehlen -titel: Schritte zählen -code: java -auftrag: Schreibe in Java: Lege `int schritte = 0` an. In einer Do-while-Schleife fährt der mBot2 vor und zählt `schritte` um eins hoch, solange der Abstand größer als 15 cm ist. Danach zeigt der Bildschirm zum Beispiel **Schritte: 3**. -welt: wand-kurz -> screen "Schritte: 3" -messwerte: getDistance=10 -> forward, screen "Schritte: 1" -braucht: doUntilSchleife -tipp: `do { mbot.forward(); schritte = schritte + 1; } while (mbot.getDistance() > 15);` -tipp: Nach der Schleife `mbot.showText("Schritte: " + schritte);`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Do-while-Schleife“](?visustruct&lektion=12-do-while-schleife). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-05-erst-fahren-dann-pruefen -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Schritte zählen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct -welt: wand-kurz -> screen "Schritte: 3" -messwerte: getDistance=10 -> forward, screen "Schritte: 1" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.showText("Schritte: " + schritte)`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -## Spiel: Kopf oder Fuß? - -::: spiel frage -titel: Spiel: Kopf oder Fuß? -intro: While oder Do-while: Wie oft fährt der mBot2 vor? Jede Fahrt ist 10 cm lang. Sechs Runden. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand steht 10 cm vor dem mBot2. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- 2-mal -> Die While-Schleife prüft zuerst. 10 ist nicht größer als 15. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Die Wand steht 10 cm vor dem mBot2. Wie oft fährt er vor? -- gar nicht -- [x] 1-mal -- 2-mal -> Die Do-while-Schleife fährt erst und prüft dann. Einmal fährt sie immer. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Die Wand steht 40 cm vor dem mBot2. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- 4-mal -> Nach der ersten Fahrt sind es 30 cm, dann 20, dann 10. Bei 10 ist Schluss. Hier fahren beide Schleifen gleich oft. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte = schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + schritte); -frage: Die Wand steht 10 cm vor dem mBot2. Was zeigt der Bildschirm? -- Schritte: 0 -- [x] Schritte: 1 -- Schritte: 2 -> Der Inhalt läuft einmal, also zählt `schritte` einmal hoch. - -runde: -frage: Welche Schleife ist fußgesteuert? -- die While-Schleife -- [x] die Do-while-Schleife -- die For-Schleife -> Ihre Bedingung steht unten im Fuß. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15) -frage: Warum läuft dieser Code nicht? -- `do` muss großgeschrieben werden. -- [x] Hinter `while (…)` fehlt das Semikolon. -- Die Bedingung muss oben stehen. -> Die Do-while-Schleife endet mit `} while (Bedingung);`. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() < 15); -frage: Soll mindestens einmal vorfahren und weiter, solange die Wand mehr als 15 cm weg ist. -fehler: 3 -besser: } while (mbot.getDistance() > 15); -> „Mehr als 15 cm“ heißt `> 15`. - -runde: - do - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Soll mindestens einmal vorfahren und weiter, solange die Wand mehr als 15 cm weg ist. -fehler: 1 -besser: do { -> Hinter `do` fehlt die öffnende geschweifte Klammer. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + schritte); -frage: Soll die Schritte zählen und am Ende anzeigen. -fehler: 4 -besser: schritte = schritte + 1; -> `schritte + 1` rechnet nur, speichert aber nichts. Das Ergebnis muss mit `=` zurück in `schritte`. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte = schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + Schritte); -frage: Soll die Schritte zählen und am Ende anzeigen. -fehler: 6 -besser: mbot.showText("Schritte: " + schritte); -> Java unterscheidet Groß- und Kleinschreibung. `Schritte` gibt es nicht. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Grau ist eine Wand. While oder Do-while: Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,2 -> Die Wand ist schon nah. Die While-Schleife prüft zuerst und fährt gar nicht los. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 45); -karte: ##### | ..... | ..^.. -ziel: 2,1 -> Die Do-while-Schleife fährt erst einmal und prüft dann. Ein Feld weiter hört sie auf. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); - mbot.turnLeft(); - mbot.forward(30); -karte: ##### | ..... | ..^.. -ziel: 1,1 -> Ein Feld vor, dann ist die Wand direkt davor. Danach links und ein Feld weiter. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> Ist die Wand weit weg, fahren While und Do-while gleich weit: bis direkt vor die Wand. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft. → Erst fahren, dann prüfen -- Ich kann eine While- und eine Do-while-Schleife vergleichen. → Erst fahren, dann prüfen -- Ich kann eine Do-while-Schleife in Java schreiben. → Jetzt in Java: Schritte zählen -::: - -## Wissenstest - -::: quiz -? Wo steht bei der Do-while-Schleife die Bedingung? -→ Erst fahren, dann prüfen -- [ ] oben im Kopf -- [x] unten im Fuß -- [ ] gar nicht -> Fußgesteuert heißt: erst der Inhalt, dann die Bedingung. -? Die Wand steht 10 cm vor dem mBot2. Wie oft fährt `do { mbot.forward(); } while (mbot.getDistance() > 15);`? -→ Erst fahren, dann prüfen -- [ ] gar nicht -- [x] einmal -- [ ] bis er anstößt -> Der Inhalt läuft immer mindestens einmal. Danach ist die Bedingung falsch. -? Was gehört in Java hinter `while (…)` am Ende der Do-while-Schleife? -→ Jetzt in Java: Schritte zählen -- [x] ein Semikolon `;` -- [ ] eine geschweifte Klammer `{` -- [ ] nichts -> `} while (Bedingung);` endet mit einem Semikolon. -::: diff --git a/web/lessons/de/visubot/05-zaehlen-und-summieren.md b/web/lessons/de/visubot/05-zaehlen-und-summieren.md deleted file mode 100644 index 13a687b2..00000000 --- a/web/lessons/de/visubot/05-zaehlen-und-summieren.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -titel: Zählen und Summieren -bereich: Sensoren und Entscheidungen -kurz: Mit einer Variablen mitzählen und Werte zusammenzählen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Zählvariable anlegen und in einer Schleife hochzählen -- in einer Schleife eine Summe bilden -- das Ergebnis nach der Schleife auf dem Bildschirm zeigen -::: - -## Mitzählen - -Wie viele Schritte fährt der mBot2 bis zur Wand? Das weißt du vorher nicht, die Welt ist jedes Mal anders. Der mBot2 soll deshalb **mitzählen**. Dafür brauchst du drei Kästen: - -1. **Vor** der Schleife: `int schritte = 0`. Am Anfang ist noch nichts gezählt. -2. **In** der Schleife: `schritte = schritte + 1`. Nach jedem Schritt eins mehr. -3. **Nach** der Schleife: das Ergebnis zeigen, zum Beispiel mit `mbot.showText("Schritte: " + schritte)`. - -Lies `schritte = schritte + 1` von rechts nach links: Nimm den alten Wert von `schritte`, zähle 1 dazu und speichere das Ergebnis wieder in `schritte`. So eine Variable heißt **Zählvariable** oder kurz Zähler. - -> Achtung: Steht `int schritte = 0` **in** der Schleife, fängt der Zähler bei jedem Durchgang wieder bei 0 an. Am Ende steht dann immer 1 da. - -::: angeberwissen -Dein Handy zählt deine Schritte genau so: Bei jedem Schritt rechnet es `schritte = schritte + 1`. Ich zähle lieber meine Grashalme. Ich bin bei 4 Millionen. -::: - -::: übung vb-schritte-welt -titel: Schritte bis zur Wand -auftrag: Baue ein Struktogramm: Der mBot2 fährt vor, solange der Abstand größer als 15 ist. Dabei zählt er seine Schritte mit. Danach zeigt er zum Beispiel **Schritte: 3** auf dem Bildschirm. Es gibt drei Welten. -welt: wand-kurz -> screen "Schritte: 3" -welt: wand-mittel -> screen "Schritte: 7" -welt: wand-lang -> screen "Schritte: 12" -braucht: whileSchleife -tipp: Der erste Kasten ist `int schritte = 0`. Danach kommt die While-Schleife mit `mbot.getDistance() > 15`. -tipp: In der Schleife stehen **fahre vor** und `schritte = schritte + 1`. Nach der Schleife steht `mbot.showText("Schritte: " + schritte)`. -lösung: vb-schritte-welt-loesung.visustruct -::: - -## Zusammenzählen - -Ein Zähler wächst immer um 1. Eine **Summe** wächst um verschiedene Werte. Der mBot2 fährt eine Spirale: erst 10 cm, dann 20, dann 30, dann 40. Wie weit ist er insgesamt gefahren? - -| Durchgang | `seite` | `gesamt` danach | -|---|---|---| -| vorher | 10 | 0 | -| 1 | 10 | 0 + 10 = 10 | -| 2 | 20 | 10 + 20 = 30 | -| 3 | 30 | 30 + 30 = 60 | -| 4 | 40 | 60 + 40 = 100 | - -Das Muster ist dasselbe wie beim Zählen. Nur steht statt der 1 jetzt der Wert, der dazukommt: `gesamt = gesamt + seite`. - -## Jetzt in Java: Spirale mit Strecke - -::: übung vb-java-spirale-strecke -titel: Spirale mit Strecke -code: java -auftrag: Schreibe in Java: Lege `int seite = 10` und `int gesamt = 0` an. Fahre viermal: `seite` cm vor, rechts drehen, `seite` zu `gesamt` dazuzählen, `seite` um 10 größer machen. Zeige danach **Strecke: 100 cm** auf dem Bildschirm. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Strecke: 100 cm" -braucht: forSchleife -tipp: In der For-Schleife stehen vier Zeilen: `mbot.forward(seite);`, `mbot.turnRight();`, `gesamt = gesamt + seite;` und `seite = seite + 10;`. -tipp: Nach der Schleife steht `mbot.showText("Strecke: " + gesamt + " cm");`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -::: übung vb-fehler-05-zaehlen-und-summieren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Spirale mit Strecke“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-zaehlen-und-summieren-start.visustruct -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Strecke: 100 cm" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `gesamt = gesamt + seite`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -## Spiel: Was steht am Ende in der Variablen? - -::: spiel frage -titel: Spiel: Was steht am Ende in der Variablen? -intro: Ludwig hat kleine Programme geschrieben. Rechne im Kopf mit. Fünf Runden. - -runde: -frage: `int z = 0`, dann dreimal `z = z + 1`. Was ist `z`? -- 1 -- [x] 3 -- 0 -> Jeder Durchgang zählt 1 dazu: 1, 2, 3. - -runde: -frage: `int summe = 0`, dann `summe = summe + 5` und `summe = summe + 7`. Was ist `summe`? -- 7 -- [x] 12 -- 5 -> 0 + 5 = 5, dann 5 + 7 = 12. - -runde: -frage: Eine Schleife läuft viermal. In ihr stehen `int z = 0` und `z = z + 1`. Was ist `z` am Ende? -- 4 -- [x] 1 -- 0 -> Der Zähler wird in jedem Durchgang wieder auf 0 gesetzt. Er gehört vor die Schleife. - -runde: -frage: `int gesamt = 0`. Der mBot2 fährt 20, 20 und 30 cm und zählt jedes Mal dazu. Was ist `gesamt`? -- 30 -- 20 -- [x] 70 -> 20 + 20 + 30 = 70. - -runde: -frage: `int schritte = 10`, dann zweimal `schritte = schritte + 1`. Was ist `schritte`? -- 2 -- [x] 12 -- 11 -> Der Zähler fängt hier bei 10 an, nicht bei 0. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Zählvariable anlegen und in einer Schleife hochzählen. → Mitzählen -- Ich kann in einer Schleife eine Summe bilden. → Zusammenzählen -- Ich kann das Ergebnis nach der Schleife auf dem Bildschirm zeigen. → Jetzt in Java: Spirale mit Strecke -::: - -## Wissenstest - -::: quiz -? Wo legst du die Zählvariable `int schritte = 0` an? -→ Mitzählen -- [x] Vor der Schleife -- [ ] In der Schleife -- [ ] Nach der Schleife -> In der Schleife würde sie bei jedem Durchgang wieder 0. -? Was macht `schritte = schritte + 1`? -→ Mitzählen -- [ ] Es vergleicht schritte mit schritte + 1. -- [x] Es nimmt den alten Wert, zählt 1 dazu und speichert das Ergebnis. -- [ ] Es setzt schritte auf 1. -? Wie zählst du die Seitenlänge `seite` zur Summe `gesamt` dazu? -→ Zusammenzählen -- [ ] `gesamt = seite` -- [ ] `seite = gesamt + seite` -- [x] `gesamt = gesamt + seite` -::: diff --git a/web/lessons/de/visubot/06-abstand.md b/web/lessons/de/visubot/06-abstand.md deleted file mode 100644 index 8c14ba25..00000000 --- a/web/lessons/de/visubot/06-abstand.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -titel: Der Ultraschallsensor -bereich: Sensoren und Entscheidungen -kurz: Abstand messen, Abstand halten und das Ganze in Java. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was `mbot.getDistance()` misst -- zwei Verzweigungen ineinander bauen -- eine While-Schleife mit dem Abstand in Java schreiben -::: - -## Wie misst der mBot2 den Abstand? - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Der [Ultraschallsensor]{teil=ultrasonic} schickt einen sehr hohen Ton los und wartet auf das Echo. Je länger das Echo braucht, desto weiter ist die Wand weg. `mbot.getDistance()` liefert den Abstand in **Zentimetern**, von etwa 3 bis 300. - -| Sensor | Text | Wert | -|---|---|---| -| Abstand | `mbot.getDistance()` | ganze Zahl in cm, z. B. `38` | - -> In der [Simulation](#zeige-simulation) steht unter der Welt immer der aktuelle Abstand. Mit einem echten mBot2 kannst du die Hand vor den Sensor halten und zusehen, wie sich die Zahl ändert. - -## Abstand halten im Struktogramm - -Der mBot2 soll wie ein Hund an der Leine sein: Ist deine Hand zu nah (unter 10 cm), weicht er zurück. Ist sie zu weit weg (über 20 cm), kommt er näher. Dazwischen bleibt er stehen. - -Dafür brauchst du zwei Verzweigungen ineinander. Die äußere prüft „zu nah?“, die innere im false-Zweig prüft „zu weit?“. - -::: übung vb-abstand-halten -titel: Abstand halten -auftrag: Baue ein Struktogramm: Ist der Abstand kleiner als 10, fährt der mBot2 zurück. Sonst: Ist der Abstand größer als 20, fährt er vor. Sonst tut er nichts. -messwerte: getDistance=5 -> backward -messwerte: getDistance=35 -> forward -messwerte: getDistance=15 -> none -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und den Sensor **Abstand** darauf. Schreib `< 10` dahinter. Im true-Zweig steht **fahre zurück**. -tipp: In den false-Zweig kommt eine zweite Verzweigung mit `mbot.getDistance() > 20` und **fahre vor** im true-Zweig. Ihr false-Zweig bleibt leer. -lösung: vb-abstand-halten-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand nacheinander auf 5, 35 und 15 cm und schaut, was dein mBot2 tut. - -## Jetzt in Java - -Im Bereich [Code](#zeige-codelive) siehst du dein Struktogramm schon als Java-Code. Eine Verzweigung heißt dort `if`, der false-Zweig `else`: - -```java -if (mbot.getDistance() < 10) { - mbot.backward(); -} else { - ... -} -``` - -Den Sensor tippst du wie einen Befehl: `mbot.` und dann `getDistance()`. Nach dem Punkt schlägt dir der Editor alle Befehle und Sensoren vor. - -::: übung vb-java-wand-piep -titel: Bis zur Wand und piepen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange die Wand mehr als 15 cm entfernt ist. Danach spielt er einen Ton. Es gibt drei Welten. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: Eine While-Schleife heißt in Java `while (Bedingung) { … }`. Die Bedingung ist `mbot.getDistance() > 15`. -tipp: In der Schleife steht `mbot.forward();`, nach der Schleife `mbot.playTone(440, 300);`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -::: übung vb-fehler-06-abstand -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Wand und piepen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-abstand-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es `mbot.playTone(440, 300)`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - if (mbot.getDistance() < 10) { - mbot.forward(); - } - if (mbot.getDistance() > 20) { - mbot.forward(); - } -frage: Unter 10 cm soll er zurückfahren, über 20 cm vorfahren. -fehler: 2 -besser: mbot.backward(); -> Ist die Hand zu nah, muss er zurück, nicht vor. - -runde: - while (mbot.getDistance() < 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll vorfahren, solange die Wand mehr als 15 cm weg ist, und dann piepen. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> „Mehr als 15 cm weg“ heißt `> 15`. - -runde: - while (mbot.getDistance > 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll bis zur Wand fahren und dann piepen. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> Ein Sensor ist eine Methode. Ohne Klammern findet Java ihn nicht. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } els { - mbot.forward(); - } -frage: Unter 10 cm soll er zurückfahren, sonst vorfahren. -fehler: 3 -besser: } else { -> Der false-Zweig heißt `else`. - -runde: - while (mbot.getDistance() > 15) { - mbot.turnRight(); - } - mbot.playTone(440, 300); -frage: Soll bis zur Wand fahren und dann piepen. -fehler: 2 -besser: mbot.forward(); -> Er soll vorfahren, nicht sich drehen. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } else { - if (mbot.getDistance() < 20) { - mbot.forward(); - } - } -frage: Unter 10 cm zurück, über 20 cm vor, dazwischen stehen bleiben. -fehler: 4 -besser: if (mbot.getDistance() > 20) { -> Vorfahren soll er nur, wenn die Hand weiter als 20 cm weg ist. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was `mbot.getDistance()` misst. → Wie misst der mBot2 den Abstand? -- Ich kann zwei Verzweigungen ineinander bauen. → Abstand halten im Struktogramm -- Ich kann eine While-Schleife mit dem Abstand in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? `mbot.getDistance()` liefert `8`. Was tut das Programm aus „Abstand halten“? -→ Abstand halten im Struktogramm -- [x] Es fährt zurück. -- [ ] Es fährt vor. -- [ ] Es bleibt stehen. -> 8 ist kleiner als 10, also ist schon die erste Bedingung wahr. -? Wie heißt der false-Zweig einer Verzweigung in Java? -→ Jetzt in Java -- [ ] `then` -- [x] `else` -- [ ] `otherwise` -> `if` ist der Anfang, `else` der false-Zweig. -::: diff --git a/web/lessons/de/visubot/06-konstanten-final.md b/web/lessons/de/visubot/06-konstanten-final.md deleted file mode 100644 index 5f223b97..00000000 --- a/web/lessons/de/visubot/06-konstanten-final.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -titel: Feste Werte mit final -bereich: Sensoren und Entscheidungen -kurz: Eine Konstante anlegen, damit eine wichtige Zahl nur an einer Stelle steht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was eine Konstante ist -- eine Konstante im Struktogramm und in Java anlegen -- eine Konstante in einer Bedingung und in einem Befehl benutzen -::: - -## Eine Zahl an vielen Stellen - -Ludwig hat ein Programm für den Flur geschrieben: Der mBot2 fährt bis 20 cm vor die Wand, dreht sich um und fährt bis 20 cm vor die andere Wand. - -::: diagramm vb-l06k-ohne.visustruct -Hin und zurück. Die Zahl 20 steht an zwei Stellen. -::: - -Jetzt soll der mBot2 schon bei 30 cm anhalten. Ludwig muss jede 20 suchen und ändern. Vergisst er eine, hält der mBot2 einmal bei 30 und einmal bei 20 cm. In langen Programmen passiert so etwas schnell. - -::: angeberwissen -Profis nennen eine Zahl, die einfach so im Programm steht, eine **magische Zahl**. Magisch, weil niemand mehr weiß, was sie bedeutet. Ich mag nur magische Grashalme. -::: - -## Eine Konstante anlegen - -Besser ist eine **Konstante**. Das ist eine Variable, deren Wert nach dem Festlegen gleich bleibt. Du legst sie einmal ganz oben an und benutzt danach nur noch ihren Namen. - -| | Struktogramm | Java | -|---|---|---| -| anlegen | `const int ABSTAND = 20` | `final int ABSTAND = 20;` | -| benutzen | `mbot.getDistance() > ABSTAND` | `mbot.getDistance() > ABSTAND` | - -Im Struktogramm schreibst du `const` davor, in Java `final`. Beides heißt: Dieser Wert ändert sich nicht mehr. Namen von Konstanten schreibt man in **Großbuchstaben**, dann erkennt man sie sofort. - -::: diagramm vb-l06k-mit.visustruct -Dasselbe Programm mit der Konstanten ABSTAND. Für 30 cm änderst du nur die erste Zeile. -::: - -::: übung vb-konstante-wand -titel: Wand mit Konstante -auftrag: Lege die Konstante `ABSTAND` mit dem Wert 20 an. Der mBot2 fährt vor, solange der Abstand größer als `ABSTAND` ist. Danach spielt er einen Ton. Es gibt drei Welten. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: Der erste Kasten ist eine Anweisung mit `const int ABSTAND = 20`. Darunter kommt eine While-Schleife. -tipp: Die Bedingung der Schleife ist `mbot.getDistance() > ABSTAND`. In der Schleife steht **fahre vor**, nach der Schleife **spiele Ton**. -lösung: vb-konstante-wand-loesung.visustruct -::: - -## Jetzt in Java: Quadrat mit Konstante - -Eine Konstante passt auch in einen Befehl. Mit `final int SEITE = 30;` fährt `mbot.forward(SEITE);` genau 30 cm. Soll das Quadrat größer werden, änderst du nur die eine Zeile. - -::: übung vb-java-konstante-seite -titel: Quadrat mit Konstante -code: java -auftrag: Schreibe in Java: Lege die Konstante `SEITE` mit dem Wert 30 an. Fahre dann mit einer For-Schleife ein Quadrat mit der Seitenlänge `SEITE`. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: Die erste Zeile ist `final int SEITE = 30;`. Danach kommt `for (int i = 0; i < 4; i++) { … }`. -tipp: In der Schleife stehen `mbot.forward(SEITE);` und `mbot.turnRight();`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -::: übung vb-fehler-06-konstanten-final -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Quadrat mit Konstante“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-konstanten-final-start.visustruct -fahrt: 4 x (forward 30, turnRight) -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Konstante dort, wo sie angelegt wird? Konstanten schreibt man in Großbuchstaben. -tipp: Richtig heißt es `mbot.forward(SEITE)`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -## Spiel: Konstante oder Variable? - -::: spiel frage -titel: Spiel: Konstante oder Variable? -intro: Ludwig sortiert Werte. Bleibt der Wert im ganzen Programm gleich, ist er eine Konstante. Ändert er sich, ist er eine Variable. Sechs Runden. -frage: Konstante oder Variable? -antworten: Konstante | Variable - -runde: -frage: Die Anzahl der Ecken eines Quadrats -richtig: Konstante -> Ein Quadrat hat immer vier Ecken. - -runde: -frage: Der Abstand, den der Ultraschallsensor gerade misst -richtig: Variable -> Fährt der mBot2, ändert sich der Abstand ständig. - -runde: -frage: Der Mindestabstand, bei dem der mBot2 immer anhalten soll -richtig: Konstante -> Du legst ihn einmal fest, zum Beispiel `final int ABSTAND = 20;`. - -runde: -frage: Die Zahl der Schritte, die der mBot2 schon gefahren ist -richtig: Variable -> Nach jedem Schritt wird sie um 1 größer. - -runde: -frage: Die Tonhöhe des Warntons, immer 440 Hz -richtig: Konstante -> Der Warnton klingt immer gleich. - -runde: -frage: Der Akkustand in Prozent -richtig: Variable -> Der Akku wird beim Fahren langsam leer. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was eine Konstante ist. → Eine Konstante anlegen -- Ich kann eine Konstante im Struktogramm und in Java anlegen. → Eine Konstante anlegen -- Ich kann eine Konstante in einer Bedingung und in einem Befehl benutzen. → Jetzt in Java: Quadrat mit Konstante -::: - -## Wissenstest - -::: quiz -? Was ist eine Konstante? -→ Eine Konstante anlegen -- [ ] Eine Variable, die sich in jedem Durchgang ändert -- [x] Eine Variable, deren Wert nach dem Festlegen gleich bleibt -- [ ] Ein Sensor, der immer denselben Wert misst -> Eine Konstante legst du einmal fest. Danach benutzt du nur ihren Namen. -? Wie legst du in Java die Konstante `ABSTAND` mit dem Wert 20 an? -→ Eine Konstante anlegen -- [ ] `const ABSTAND = 20;` -- [x] `final int ABSTAND = 20;` -- [ ] `int final = 20;` -> In Java steht `final` vor dem Datentyp. Im Struktogramm schreibst du `const`. -? Warum ist eine Konstante besser als die Zahl 20 an vielen Stellen? -→ Eine Konstante anlegen -- [ ] Weil das Programm dann schneller fährt -- [x] Weil du den Wert nur an einer Stelle ändern musst -- [ ] Weil der Sensor dann genauer misst -::: diff --git a/web/lessons/de/visubot/06-nah-mittel-weit.md b/web/lessons/de/visubot/06-nah-mittel-weit.md deleted file mode 100644 index 21152384..00000000 --- a/web/lessons/de/visubot/06-nah-mittel-weit.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -titel: Nah, mittel oder weit? -bereich: Sensoren und Entscheidungen -kurz: Eine Verzweigung mit drei Fällen bauen und in Java mit else if schreiben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Verzweigung mit drei Fällen bauen -- `else if` in Java lesen und schreiben -- die Bedingungen in der richtigen Reihenfolge prüfen -::: - -## Drei Fälle statt zwei - -Viele Autos haben eine **Einparkhilfe**. Ist die Wand weit weg, ist alles frei. Kommt sie näher, heißt es: langsam. Ist sie ganz nah: Stopp! - -Eine Verzweigung hat nur zwei Zweige, Ja und Nein. Für drei Fälle setzt du eine zweite Verzweigung in den Nein-Zweig der ersten: - -1. Ist der Abstand kleiner als 10? Dann **Stopp**. -2. Sonst: Ist der Abstand kleiner als 30? Dann **Langsam**. -3. Sonst: **Frei**. - -::: diagramm vb-l06n-einparkhilfe.visustruct -Die Einparkhilfe. Die zweite Frage wird nur gestellt, wenn die Antwort auf die erste Nein war. -::: - -Probiere es in der [Simulation](#zeige-simulation) aus: Öffne das Diagramm im Editor und stelle den Abstand auf 5, 20 und 50 cm. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Verzweigung“](?visustruct&lektion=08-verzweigung). Sie öffnet sich in einem neuen Fenster. - -## Tempo nach Abstand im Struktogramm - -::: übung vb-tempo-abstand -titel: Tempo nach Abstand -auftrag: Baue ein Struktogramm mit drei Fällen: Ist der Abstand kleiner als 10, fährt der mBot2 5 cm zurück. Sonst: Ist der Abstand kleiner als 30, fährt er 5 cm vor. Sonst fährt er 20 cm vor. -messwerte: getDistance=5 -> backward 5 -messwerte: getDistance=20 -> forward 5 -messwerte: getDistance=50 -> forward 20 -braucht: verzweigung -tipp: Baue es wie die Einparkhilfe: eine Verzweigung mit `mbot.getDistance() < 10` und im Nein-Zweig eine zweite mit `mbot.getDistance() < 30`. -tipp: Die Befehle sind `mbot.backward(5)`, `mbot.forward(5)` und `mbot.forward(20)`. Der letzte steht im Nein-Zweig der zweiten Verzweigung. -lösung: vb-tempo-abstand-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand nacheinander auf 5, 20 und 50 cm. - -## Jetzt in Java: else if - -Schau in den Bereich [Code](#zeige-codelive). Die Verzweigung im Nein-Zweig sieht so aus: - -```java -if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} else { - if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); - } else { - mbot.showText("Frei"); - } -} -``` - -In Java darfst du das kürzer schreiben. Das `if` rutscht direkt hinter das `else`: - -```java -if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} else if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); -} else { - mbot.showText("Frei"); -} -``` - -Beides bedeutet genau dasselbe. Mit `else if` ist es aber besser zu lesen. Die geschweiften Klammern `{ }` schreibst du trotzdem immer. - -::: übung vb-java-tageszeit -titel: Tag oder Nacht? -code: java -auftrag: Schreibe in Java mit `else if`: Ist die Helligkeit kleiner als 20, zeigt der mBot2 **Nacht**. Sonst: Ist sie kleiner als 60, zeigt er **Dämmerung**. Sonst zeigt er **Tag**. -messwerte: getBrightness=10 -> none, screen "Nacht" -messwerte: getBrightness=40 -> none, screen "Dämmerung" -messwerte: getBrightness=80 -> none, screen "Tag" -braucht: verzweigung -tipp: Die Helligkeit liest du mit `mbot.getBrightness()`. Die erste Bedingung ist `mbot.getBrightness() < 20`. -tipp: `if (…) { mbot.showText("Nacht"); } else if (mbot.getBrightness() < 60) { mbot.showText("Dämmerung"); } else { mbot.showText("Tag"); }` -lösung: vb-java-tageszeit-loesung.visustruct -::: - -::: übung vb-fehler-06-nah-mittel-weit -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Tag oder Nacht?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-nah-mittel-weit-start.visustruct -messwerte: getBrightness=10 -> none, screen "Nacht" -messwerte: getBrightness=40 -> none, screen "Dämmerung" -messwerte: getBrightness=80 -> none, screen "Tag" -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es `mbot.showText("Nacht")`. -lösung: vb-java-tageszeit-loesung.visustruct -::: - -## Auf die Reihenfolge kommt es an - -Ludwig hat die Einparkhilfe umgebaut und die Fragen getauscht: - -```java -if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); -} else if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} -``` - -Bei 5 cm zeigt sein mBot2 **Langsam** statt **Stopp**. Denn 5 ist auch kleiner als 30. Die erste Bedingung ist schon wahr, die zweite wird gar nicht mehr geprüft. **Stopp** erscheint nie. - -> Merke: Bei `<` prüfst du zuerst den kleinsten Wert, dann den nächstgrößeren. - -::: spiel frage -titel: Spiel: Was zeigt die Einparkhilfe? -intro: Ludwigs Einparkhilfe von oben: unter 10 cm **Stopp**, unter 30 cm **Langsam**, sonst **Frei**. Was zeigt sie? Sechs Runden. -frage: Was zeigt die Einparkhilfe? -antworten: Stopp | Langsam | Frei - -runde: -frage: Der Abstand ist **5 cm**. -richtig: Stopp -> 5 ist kleiner als 10. Schon die erste Frage ist wahr. - -runde: -frage: Der Abstand ist **25 cm**. -richtig: Langsam -> 25 ist nicht kleiner als 10, aber kleiner als 30. - -runde: -frage: Der Abstand ist **80 cm**. -richtig: Frei -> Beide Fragen sind falsch, also bleibt der letzte Nein-Zweig. - -runde: -frage: Der Abstand ist genau **10 cm**. -richtig: Langsam -> 10 ist nicht kleiner als 10. Die erste Frage ist falsch, die zweite wahr. - -runde: -frage: Der Abstand ist genau **30 cm**. -richtig: Frei -> 30 ist nicht kleiner als 30. Beide Fragen sind falsch. - -runde: -frage: Der Abstand ist **9 cm**. -richtig: Stopp -> 9 ist kleiner als 10. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Verzweigung mit drei Fällen bauen. → Drei Fälle statt zwei -- Ich kann `else if` in Java lesen und schreiben. → Jetzt in Java: else if -- Ich kann die Bedingungen in der richtigen Reihenfolge prüfen. → Auf die Reihenfolge kommt es an -::: - -## Wissenstest - -::: quiz -? Wie viele Verzweigungen brauchst du im Struktogramm für drei Fälle? -→ Drei Fälle statt zwei -- [ ] Eine -- [x] Zwei, die zweite im Nein-Zweig der ersten -- [ ] Drei nebeneinander -> Jede Verzweigung teilt in zwei Zweige. Die zweite teilt den Nein-Zweig noch einmal. -? Was bedeutet `else if` in Java? -→ Jetzt in Java: else if -- [x] Sonst prüfe noch eine Bedingung -- [ ] Wiederhole die Bedingung -- [ ] Prüfe beide Bedingungen gleichzeitig -> `else if` ist die kurze Schreibweise für ein `if` im `else`-Zweig. -? Ludwig prüft zuerst `< 30` und danach `< 10`. Was passiert bei 5 cm? -→ Auf die Reihenfolge kommt es an -- [ ] Es erscheint Stopp. -- [x] Es erscheint Langsam. -- [ ] Es erscheint gar nichts. -> 5 ist auch kleiner als 30. Die zweite Bedingung wird nicht mehr geprüft. -::: diff --git a/web/lessons/de/visubot/07-linie.md b/web/lessons/de/visubot/07-linie.md deleted file mode 100644 index 58c29276..00000000 --- a/web/lessons/de/visubot/07-linie.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -titel: Der Liniensensor -bereich: Sensoren und Entscheidungen -kurz: Dunkle Linien auf dem Boden erkennen und nicht vom Tisch fallen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was die Zahl von `mbot.getLine()` bedeutet -- bis zu einer Linie fahren -- in Java mit einer Variable Schritte zählen -::: - -## Vier Fühler unter der Nase - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der [Liniensensor]{teil=lineSensor} hat vier Fühler nebeneinander. Jeder leuchtet den Boden an und misst, wie viel Licht zurückkommt. Schwarz schluckt das Licht, Weiß wirft es zurück. - -| Sensor | Text | Wert | -|---|---|---| -| Linie | `mbot.getLine()` | `0` = alles hell, größer als `0` = mindestens ein Fühler sieht Schwarz | - -Für den Anfang reicht dir: **`mbot.getLine() == 0` heißt „keine Linie“**, `mbot.getLine() != 0` heißt „Linie gefunden“. - -::: angeberwissen -`mbot.getLine()` ist eigentlich eine Binärzahl mit vier Stellen, eine für jeden Fühler: `1111` (also 15) heißt „alle vier sehen Schwarz“, `0110` (6) „nur die mittleren“. Damit kann ein mBot2 sogar einer Linie folgen. -::: - -## Am Rand umkehren im Struktogramm - -Stell dir einen Tisch mit schwarzem Klebeband am Rand vor. Der mBot2 soll vorfahren, bis er das Band sieht, und dann umkehren, damit er nicht herunterfällt. - -::: übung vb-rand -titel: Am Rand umkehren -auftrag: Der mBot2 fährt vor, solange `mbot.getLine() == 0` ist. Danach dreht er sich um 180°. Es gibt zwei Welten mit unterschiedlich weitem Weg. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Linie** darauf. Schreib `== 0` dahinter. In die Schleife kommt **fahre vor**. -tipp: Nach der Schleife (darunter, nicht darin) steht `mbot.turnRight(180)`. -lösung: vb-rand-loesung.visustruct -::: - -## Jetzt in Java: hin und zurück - -Jetzt soll der mBot2 nach dem Umkehren genau bis zum Start zurückfahren. Dafür zählt er mit einer **Variable**, wie oft er vorgefahren ist. - -```java -int schritte = 0; -while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; -} -``` - -::: übung vb-java-rand -titel: Bis zur Linie und zurück -code: java -auftrag: Schreibe in Java: Der mBot2 fährt bis zur Linie und zählt dabei seine Schritte. Dann dreht er sich um 180° und fährt mit einer For-Schleife genauso viele Schritte zurück. -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -braucht: whileSchleife, forSchleife -tipp: Nach der While-Schleife: `mbot.turnRight(180);` und dann `for (int i = 0; i < schritte; i++) { … }`. -tipp: In der For-Schleife steht nur `mbot.forward();`. -lösung: vb-java-rand-loesung.visustruct -::: - -::: übung vb-fehler-07-linie -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Linie und zurück“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-07-linie-start.visustruct -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `schritte = schritte + 1`. -lösung: vb-java-rand-loesung.visustruct -::: - -## Spiel: Linie oder nicht? - -::: spiel frage -titel: Spiel: Linie oder nicht? -intro: Wo steht der mBot2, und ist die Bedingung wahr oder falsch? Sechs Runden. -antworten: wahr | falsch - -runde: - mbot.getLine() == 0 -frage: Der mBot2 steht auf weißem Papier. Ist die Bedingung wahr? -richtig: wahr -> Kein Fühler sieht Schwarz, also liefert `mbot.getLine()` 0. - -runde: - mbot.getLine() == 0 -frage: Die beiden mittleren Fühler stehen auf dem schwarzen Klebeband. Ist die Bedingung wahr? -richtig: falsch -> Zwei Fühler sehen Schwarz, also ist `mbot.getLine()` größer als 0. - -runde: - mbot.getLine() != 0 -frage: Nur der äußere linke Fühler sieht Schwarz. Ist die Bedingung wahr? -richtig: wahr -> Ein Fühler reicht schon, dann ist der Wert nicht mehr 0. - -runde: - mbot.getLine() != 0 -frage: Der mBot2 steht auf weißem Boden. Ist die Bedingung wahr? -richtig: falsch -> Auf Weiß ist der Wert 0, und `0 != 0` ist falsch. - -runde: - mbot.getLine() == 15 -frage: Eine Querlinie: Alle vier Fühler sehen Schwarz. Ist die Bedingung wahr? -richtig: wahr -> Alle vier Fühler ergeben die Binärzahl `1111`, also 15. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; - } -frage: Die Linie ist 30 cm entfernt, jede Fahrt ist 10 cm lang. Ist danach `schritte == 3`? -richtig: wahr -> Nach drei Fahrten steht er auf der Linie, und die Schleife hört auf. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getLine() != 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Soll bis zum schwarzen Rand fahren und dann umkehren. -fehler: 1 -besser: while (mbot.getLine() == 0) { -> Er soll fahren, solange **keine** Linie da ist, also `== 0`. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(); -frage: Soll bis zum schwarzen Rand fahren und dann umkehren. -fehler: 4 -besser: mbot.turnRight(180); -> Umkehren heißt 180°. Ohne Zahl dreht er sich nur 90°. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte - 1; - } -frage: Soll bis zur Linie fahren und die Schritte zählen. -fehler: 4 -besser: schritte = schritte + 1; -> Zählen heißt eins dazu, nicht eins weg. - -runde: - int schritte = "0"; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; - } -frage: Soll bis zur Linie fahren und die Schritte zählen. -fehler: 1 -besser: int schritte = 0; -> In Anführungszeichen ist die 0 ein Text. In ein `int` passt nur eine Zahl. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schwarz ist Klebeband. Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ..=.. | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, bis er auf dem schwarzen Feld steht. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } - mbot.turnRight(180); - mbot.forward(60); -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> Bis zum Rand, umkehren und zwei Felder zurück. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(30); - schritte = schritte + 1; - } - mbot.turnRight(180); - for (int i = 0; i < schritte; i++) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..^.. -ziel: 2,3 -> Er zählt drei Schritte bis zur Linie und fährt genau drei zurück: wieder am Start. - -runde: - mbot.turnRight(); - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ^...= | ..... -ziel: 4,1 -> Erst nach rechts drehen, dann bis zum schwarzen Feld ganz rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was die Zahl von `mbot.getLine()` bedeutet. → Vier Fühler unter der Nase -- Ich kann bis zu einer Linie fahren. → Am Rand umkehren im Struktogramm -- Ich kann in Java mit einer Variable Schritte zählen. → Jetzt in Java: hin und zurück -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf weißem Papier. Was liefert `mbot.getLine()`? -→ Vier Fühler unter der Nase -- [x] 0 -- [ ] 15 -- [ ] 1 -> Kein Fühler sieht Schwarz, also 0. -? Welche Bedingung heißt „Linie gefunden“? -→ Am Rand umkehren im Struktogramm -- [ ] `mbot.getLine() == 0` -- [x] `mbot.getLine() != 0` -- [ ] `mbot.getLine() < 0` -> `!=` heißt „ungleich“. -::: diff --git a/web/lessons/de/visubot/07-und-oder.md b/web/lessons/de/visubot/07-und-oder.md deleted file mode 100644 index c08d55ee..00000000 --- a/web/lessons/de/visubot/07-und-oder.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -titel: Und, oder, nicht -bereich: Sensoren und Entscheidungen -kurz: Zwei Sensoren in einer Bedingung prüfen: und, oder, nicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- zwei Bedingungen mit `&&` (und) verknüpfen -- zwei Bedingungen mit `||` (oder) verknüpfen -- eine Bedingung mit `!` (nicht) umdrehen -- eine verknüpfte Bedingung in einer Java-Schleife schreiben -::: - -## Wand und Linie: und - -Der mBot2 soll nur vorfahren, wenn vorn frei ist **und** unter ihm keine Linie ist. Zwei Sensoren, eine Bedingung. In Java heißt **und** `&&`: - -```java -mbot.getDistance() > 15 && mbot.getLine() == 0 -``` - -Die ganze Bedingung ist nur wahr, wenn **beide** Teile wahr sind: - -| vorn frei? | keine Linie? | frei `&&` keine Linie | -|---|---|---| -| wahr | wahr | **wahr** | -| wahr | falsch | falsch | -| falsch | wahr | falsch | -| falsch | falsch | falsch | - -So eine Tabelle heißt **Wahrheitstabelle** (englisch *truth table*). - -::: übung vb-und -titel: Frei und keine Linie -auftrag: Baue ein Struktogramm mit einer Verzweigung: Ist der Abstand größer als 15 **und** `mbot.getLine() == 0`, fährt der mBot2 vor. Sonst tut er nichts. -messwerte: getDistance=50, getLine=0 -> forward -messwerte: getDistance=10, getLine=0 -> none -messwerte: getDistance=50, getLine=6 -> none -braucht: verzweigung -tipp: Zieh den Sensor **Abstand** auf die Verzweigung und schreib `> 15` dahinter. Dann tippst du ` && ` und den zweiten Teil `mbot.getLine() == 0`. -tipp: Im true-Zweig steht **fahre vor**, der false-Zweig bleibt leer. -lösung: vb-und-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand und die Linie auf verschiedene Werte. Nur wenn beides passt, darf der mBot2 fahren. - -## Taste A oder Taste B: oder - -Jetzt soll der mBot2 piepen, wenn du Taste A **oder** Taste B drückst. Es reicht, wenn eine der beiden gedrückt ist. In Java heißt **oder** `||`. Die beiden Striche findest du auf der Tastatur meist mit **Alt Gr** und **<** (Windows) oder **Option** und **7** (Mac). - -| Taste A? | Taste B? | A oder B | -|---|---|---| -| wahr | wahr | **wahr** | -| wahr | falsch | **wahr** | -| falsch | wahr | **wahr** | -| falsch | falsch | falsch | - -::: übung vb-oder -titel: Taste A oder B -auftrag: Baue ein Struktogramm: Ist Taste A **oder** Taste B gedrückt, spielt der mBot2 einen Ton. Sonst tut er nichts. -messwerte: isButtonA=true, isButtonB=false -> tone -messwerte: isButtonA=false, isButtonB=true -> tone -messwerte: isButtonA=false, isButtonB=false -> noTone -braucht: verzweigung -tipp: Die Bedingung der Verzweigung ist `mbot.isButtonA() || mbot.isButtonB()`. -tipp: Im true-Zweig steht `mbot.playTone(440, 300)`, der false-Zweig bleibt leer. -lösung: vb-oder-loesung.visustruct -::: - -## Nicht: das Gegenteil - -Manchmal willst du das Gegenteil einer Bedingung. Dafür gibt es `!`, gesprochen **nicht**. `mbot.isButtonA()` ist wahr, wenn Taste A gedrückt ist. `!mbot.isButtonA()` ist wahr, wenn sie **nicht** gedrückt ist. - -```java -while (!mbot.isButtonA()) { - mbot.pause(100); -} -mbot.forward(30); -``` - -Der mBot2 wartet, solange Taste A nicht gedrückt ist. Danach fährt er los. - -## Jetzt in Java: Sicher fahren - -Jetzt kommt alles zusammen. Der mBot2 fährt, solange vorn frei ist **und** keine Linie kommt. Egal, was zuerst kommt, die Wand oder der Rand: Er hält an und piept. - -::: übung vb-java-sicher-fahren -titel: Sicher fahren -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange der Abstand größer als 15 ist **und** `mbot.getLine() == 0` ist. Danach spielt er einen Ton. In zwei Welten wartet eine Wand, in zwei Welten ein schwarzer Rand. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -braucht: whileSchleife -tipp: `while (mbot.getDistance() > 15 && mbot.getLine() == 0) { … }` -tipp: In der Schleife steht `mbot.forward();`, nach der Schleife `mbot.playTone(440, 300);`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Bedingungen verknüpfen“](?visustruct&lektion=09-bedingungen-verknuepfen). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-07-und-oder -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Sicher fahren“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-07-und-oder-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.playTone(440, 300)`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -## Spiel: Wahr oder falsch? - -::: spiel frage -titel: Spiel: Wahr oder falsch? -intro: Ludwig stellt den mBot2 in eine Lage. Ist die Bedingung wahr oder falsch? Acht Runden. -antworten: wahr | falsch - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: Die Wand ist 50 cm weg, unter ihm ist keine Linie. -richtig: wahr -> Beide Teile sind wahr, also ist auch das Ganze wahr. - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: Die Wand ist 10 cm weg, unter ihm ist keine Linie. -richtig: falsch -> Bei `&&` müssen beide Teile wahr sein. Der Abstand stimmt nicht. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Nur Taste B ist gedrückt. -richtig: wahr -> Bei `||` reicht ein wahrer Teil. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Keine Taste ist gedrückt. -richtig: falsch -> Beide Teile sind falsch, dann ist auch `||` falsch. - -runde: - !mbot.isButtonA() -frage: Taste A ist gedrückt. -richtig: falsch -> `mbot.isButtonA()` ist wahr, das `!` macht daraus falsch. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: Die Wand ist 10 cm weg, und er steht auf einer Linie. -richtig: falsch -> Kein Teil ist wahr, also ist auch `||` falsch. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: Die Wand ist 50 cm weg, und er steht auf einer Linie. -richtig: wahr -> Der erste Teil ist wahr, das reicht bei `||`. - -runde: - !mbot.isButtonA() && mbot.getDistance() > 15 -frage: Niemand drückt eine Taste, die Wand ist 30 cm weg. -richtig: wahr -> A ist nicht gedrückt, also ist `!mbot.isButtonA()` wahr. Der Abstand stimmt auch. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getDistance() > 15 || mbot.getLine() == 0) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll fahren, solange vorn frei ist **und** keine Linie kommt. -fehler: 1 -besser: while (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> Mit `||` fährt er weiter, wenn nur einer der Teile stimmt, zum Beispiel über den Rand. - -runde: - if (mbot.isButtonA() && mbot.isButtonB()) { - mbot.playTone(440, 300); - } -frage: Soll piepen, wenn Taste A **oder** Taste B gedrückt ist. -fehler: 1 -besser: if (mbot.isButtonA() || mbot.isButtonB()) { -> „Oder“ heißt in Java `||`. Mit `&&` piept er nur, wenn beide gedrückt sind. - -runde: - while (mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Soll warten, bis Taste A gedrückt wird, und dann losfahren. -fehler: 1 -besser: while (!mbot.isButtonA()) { -> Warten heißt: Schleife, solange A **nicht** gedrückt ist. Das `!` fehlt. - -runde: - if (mbot.getDistance() > 15 & mbot.getLine() == 0) { - mbot.forward(); - } -frage: Soll vorfahren, wenn vorn frei ist und keine Linie da ist. -fehler: 1 -besser: if (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> „Und“ schreibt man mit zwei Zeichen: `&&`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann zwei Bedingungen mit `&&` (und) verknüpfen. → Wand und Linie: und -- Ich kann zwei Bedingungen mit `||` (oder) verknüpfen. → Taste A oder Taste B: oder -- Ich kann eine Bedingung mit `!` (nicht) umdrehen. → Nicht: das Gegenteil -- Ich kann eine verknüpfte Bedingung in einer Java-Schleife schreiben. → Jetzt in Java: Sicher fahren -::: - -## Wissenstest - -::: quiz -? Der Abstand ist 50 und `mbot.getLine()` liefert 6. Fährt der mBot2 bei „Frei und keine Linie“? -→ Wand und Linie: und -- [ ] Ja, vorn ist ja frei. -- [x] Nein, denn bei `&&` müssen beide Teile wahr sein. -- [ ] Nur halb so weit. -> Er steht auf einer Linie. Damit ist ein Teil falsch, also die ganze Bedingung. -? Nur Taste B ist gedrückt. Ist `mbot.isButtonA() || mbot.isButtonB()` wahr? -→ Taste A oder Taste B: oder -- [x] Ja -- [ ] Nein -> Bei `||` reicht es, wenn ein Teil wahr ist. -? Taste A ist gedrückt. Was ist `!mbot.isButtonA()`? -→ Nicht: das Gegenteil -- [ ] wahr -- [x] falsch -> `!` dreht den Wert um: aus wahr wird falsch. -? Welche Bedingung hält den mBot2 an der Wand **und** am Rand an? -→ Jetzt in Java: Sicher fahren -- [x] `while (mbot.getDistance() > 15 && mbot.getLine() == 0)` -- [ ] `while (mbot.getDistance() > 15 || mbot.getLine() == 0)` -- [ ] `while (mbot.getDistance() > 15)` -> Mit `||` würde er weiterfahren, solange nur einer der Teile stimmt, also zum Beispiel über den Rand hinaus. -::: diff --git a/web/lessons/de/visubot/08-farben.md b/web/lessons/de/visubot/08-farben.md deleted file mode 100644 index 6ea8bd77..00000000 --- a/web/lessons/de/visubot/08-farben.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -titel: Farben erkennen -bereich: Sensoren und Entscheidungen -kurz: Der Quad-RGB-Sensor sagt, auf welcher Farbe der mBot2 steht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit `mbot.getColor().equals(…)` eine Farbe abfragen -- mit `!` eine Bedingung umdrehen -- eine Verzweigung in eine Schleife schreiben -::: - -## Ein Sensor, der Farben sieht - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der [Liniensensor]{teil=lineSensor} heißt eigentlich **Quad-RGB-Sensor**. „Quad“ heißt vier (vier Fühler), „RGB“ steht für Rot, Grün und Blau. Er leuchtet den Boden in diesen drei Farben an und misst, welche Farbe zurückkommt. So erkennt er farbige Felder. - -`mbot.getColor()` liefert den Namen der Farbe unter dem mBot2, und zwar als **Text**: - -| Boden | `mbot.getColor()` | -|---|---| -| rotes Feld | `"rot"` | -| grünes Feld | `"grün"` | -| blaues Feld | `"blau"` | -| gelbes Feld | `"gelb"` | -| schwarzes Feld oder Linie | `"schwarz"` | -| heller Boden | `"weiß"` | - -Ob es eine bestimmte Farbe ist, fragst du mit `.equals(…)`: `mbot.getColor().equals("rot")` ist **wahr**, wenn der mBot2 auf Rot steht, sonst **falsch**. Das ist also schon eine fertige Bedingung. - -> Texte vergleichst du in Java immer mit `.equals(…)`, **nicht** mit `==`. Das `==` sieht richtig aus, klappt bei Texten aber oft nicht. - -> Mit dem `!` davor drehst du eine Bedingung um: `!mbot.getColor().equals("rot")` heißt „**nicht** rot“. - -## Fahre bis Rot im Struktogramm - -::: übung vb-bis-rot -titel: Fahre bis Rot -auftrag: Der mBot2 fährt vor, solange er **nicht** auf einem roten Feld steht. In der zweiten Welt liegt vorher ein grünes Feld, das soll ihn nicht stören. -welt: farbe-1 -> forward 20 -welt: farbe-2 -> forward 50 -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Farbe ist rot?** darauf. Schreib ein `!` vor `mbot.getColor().equals("rot")`. -tipp: Die Bedingung heißt `!mbot.getColor().equals("rot")`, in der Schleife steht **fahre vor**. -lösung: vb-bis-rot-loesung.visustruct -::: - -## Jetzt in Java: bei Grün piepen - -Jetzt kombinierst du eine Schleife mit einer Verzweigung: Der mBot2 fährt bis Blau. Kommt er unterwegs über ein grünes Feld, piept er. - -::: übung vb-java-blau-gruen -titel: Bis Blau, bei Grün piepen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange er nicht auf Blau steht. Nach jedem Schritt prüft er: Steht er auf Grün, spielt er einen Ton. In der zweiten Welt gibt es kein grünes Feld, da darf er nicht piepen. -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -braucht: whileSchleife, verzweigung -tipp: Außen steht `while (!mbot.getColor().equals("blau")) { … }`. Darin zuerst `mbot.forward();`. -tipp: Danach, noch in der Schleife: `if (mbot.getColor().equals("grün")) { mbot.playTone(880, 200); }`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -::: übung vb-fehler-08-farben -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis Blau, bei Grün piepen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-08-farben-start.visustruct -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es `equals("grün")`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Fünf Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getColor().equals("rot")) { - mbot.forward(); - } -frage: Soll vorfahren, bis er auf Rot steht. -fehler: 1 -besser: while (!mbot.getColor().equals("rot")) { -> Er soll fahren, solange er **nicht** auf Rot steht. Dafür fehlt das `!`. - -runde: - if (mbot.getColor() == "grün") { - mbot.playTone(440, 300); - } -frage: Soll piepen, wenn er auf Grün steht. -fehler: 1 -besser: if (mbot.getColor().equals("grün")) { -> Texte vergleichst du mit `.equals(…)`, nicht mit `==`. - -runde: - while (!mbot.getColor().equals("blau")) { - mbot.forward(); - if (mbot.getColor().equals("grün")) { - mbot.turnRight(); - } - } -frage: Soll bis Blau fahren und bei Grün piepen. -fehler: 4 -besser: mbot.playTone(440, 300); -> Bei Grün soll er piepen, nicht abbiegen. - -runde: - if (mbot.getColor().equals(rot)) { - mbot.turnRight(); - } -frage: Soll sich auf Rot nach rechts drehen. -fehler: 1 -besser: if (mbot.getColor().equals("rot")) { -> Ohne Anführungszeichen sucht Java eine Variable `rot`. Der Farbname ist ein Text. - -runde: - while (!mbot.getColor().equals("rot")) { - mbot.forward(); - } - mbot.playTone(440, 300) -frage: Soll bis Rot fahren und dann piepen. -fehler: 4 -besser: mbot.playTone(440, 300); -> Am Ende der Anweisung fehlt das Semikolon. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit `mbot.getColor().equals(…)` eine Farbe abfragen. → Ein Sensor, der Farben sieht -- Ich kann mit `!` eine Bedingung umdrehen. → Fahre bis Rot im Struktogramm -- Ich kann eine Verzweigung in eine Schleife schreiben. → Jetzt in Java: bei Grün piepen -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf einem roten Feld. Was ist `!mbot.getColor().equals("rot")`? -→ Fahre bis Rot im Struktogramm -- [ ] wahr -- [x] falsch -> `mbot.getColor().equals("rot")` ist wahr, das `!` macht daraus falsch. Die Schleife hört also auf. -? Womit vergleichst du die Farbe mit `"grün"`? -→ Ein Sensor, der Farben sieht -- [x] `mbot.getColor().equals("grün")` -- [ ] `mbot.getColor() == "grün"` -- [ ] `mbot.getColor() = "grün"` -> `mbot.getColor()` liefert einen Text, und Texte vergleicht man mit `.equals(…)`. Ein einzelnes `=` ist eine Zuweisung, gar kein Vergleich. -::: diff --git a/web/lessons/de/visubot/08-groesster-wert.md b/web/lessons/de/visubot/08-groesster-wert.md deleted file mode 100644 index 561ff125..00000000 --- a/web/lessons/de/visubot/08-groesster-wert.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -titel: Der größte Wert -bereich: Sensoren und Entscheidungen -kurz: Rundum messen und sich den größten Wert merken: Wo ist am meisten Platz? ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit einer Variablen den bisher größten Wert merken -- in einer Schleife jeden neuen Messwert mit dem bisher größten vergleichen -- mit dem mBot2 herausfinden, in welcher Richtung am meisten Platz ist -::: - -## Den Rekord merken - -Beim Weitsprung gibt es eine Tafel mit dem **Rekord**. Nach jedem Sprung schaut die Schiedsrichterin: Ist der neue Sprung weiter als der Rekord? Dann kommt er an die Tafel. Sonst bleibt der alte Rekord stehen. - -Genau so findet ein Programm den größten Wert. Die Tafel ist eine Variable `max`: - -1. **Vor** der Schleife: `int max = 0`. Noch steht nichts an der Tafel. -2. **In** der Schleife: Ist der neue Wert größer als `max`? Dann `max = wert`. -3. **Nach** der Schleife steht in `max` der größte Wert. - -Der mBot2 dreht sich viermal und misst jedes Mal den Abstand. So sieht das im Schreibtischtest aus: - -| Richtung | gemessen | größer als `max`? | `max` danach | -|---|---|---|---| -| vorher | | | 0 | -| vorn | 16 | ja | 16 | -| rechts | 36 | ja | 36 | -| hinten | 6 | nein | 36 | -| links | 26 | nein | 36 | - -> Wichtig: Die Verzweigung hat nur einen Ja-Zweig. Ist der Wert nicht größer, passiert nichts. Der alte Rekord bleibt. - -## Wo ist am meisten Platz? - -::: übung vb-meister-platz -titel: Wo ist am meisten Platz? -auftrag: Baue ein Struktogramm: Lege `int max = 0` an. Der mBot2 misst viermal den Abstand und dreht sich danach jeweils nach rechts. Ist ein Abstand größer als `max`, merkt er ihn sich in `max`. Zum Schluss zeigt er zum Beispiel **Am weitesten: 36 cm**. Es gibt zwei Welten. -welt: platz-1 -> screen "Am weitesten: 36 cm" -welt: platz-2 -> screen "Am weitesten: 46 cm" -braucht: forSchleife, verzweigung -tipp: Die For-Schleife läuft viermal. In ihr stehen drei Kästen: `int abstand = mbot.getDistance()`, eine Verzweigung und **drehe rechts**. -tipp: Die Verzweigung prüft `abstand > max`. Im Ja-Zweig steht `max = abstand`, der Nein-Zweig bleibt leer. Nach der Schleife: `mbot.showText("Am weitesten: " + max + " cm")`. -lösung: vb-meister-platz-loesung.visustruct -::: - -::: angeberwissen -Viele Saugroboter haben oben einen kleinen Turm mit einem Laser. Er dreht sich und misst ringsum die Abstände. So zeichnet der Roboter eine Karte der Wohnung. Bei mir zu Hause misst niemand. Ich fresse mir einfach den Weg frei. -::: - -## Jetzt in Java: Die Richtung merken - -Jetzt weiß der mBot2, **wie viel** Platz es höchstens gibt. Aber **wo**? Dafür merkt er sich in einer zweiten Variablen auch die Richtung. Die Zählvariable `i` sagt dir, die wievielte Messung es war: 0 ist vorn, 1 ist rechts, 2 ist hinten und 3 ist links. - -```java -if (abstand > max) { - max = abstand; - richtung = i; -} -``` - -Beide Zeilen stehen im Ja-Zweig. Nur wenn es einen neuen Rekord gibt, ändert sich auch die Richtung. - -::: übung vb-java-richtung -titel: Die Richtung merken -code: java -auftrag: Schreibe „Wo ist am meisten Platz?“ in Java. Merke dir zusätzlich in `int richtung = 0` die Nummer der Messung mit dem größten Abstand. Zeige zum Schluss zum Beispiel **Richtung: 1**. -welt: platz-1 -> screen "Richtung: 1" -welt: platz-2 -> screen "Richtung: 0" -braucht: forSchleife, verzweigung -tipp: Vor der Schleife stehen `int max = 0;` und `int richtung = 0;`. In der Schleife: `int abstand = mbot.getDistance();`, die Verzweigung und `mbot.turnRight();`. -tipp: Im Ja-Zweig stehen `max = abstand;` und `richtung = i;`. Nach der Schleife: `mbot.showText("Richtung: " + richtung);` -lösung: vb-java-richtung-loesung.visustruct -::: - -::: übung vb-fehler-08-groesster-wert -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Die Richtung merken“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-08-groesster-wert-start.visustruct -welt: platz-1 -> screen "Richtung: 1" -welt: platz-2 -> screen "Richtung: 0" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `richtung = i`. -lösung: vb-java-richtung-loesung.visustruct -::: - -## Spiel: Neuer Rekord? - -::: spiel frage -titel: Spiel: Neuer Rekord? -intro: Der mBot2 misst nacheinander mehrere Abstände. Was steht am Ende in `max`? Fünf Runden. - -runde: -frage: Gemessen: 20, 50, 30 -- 30 -- [x] 50 -- 100 -> 50 ist der größte Wert. Die 30 danach ist kein neuer Rekord. - -runde: -frage: Gemessen: 10, 20, 30, 40 -- 10 -- [x] 40 -- 100 -> Jeder Wert ist ein neuer Rekord. Am Ende steht der letzte da. - -runde: -frage: Gemessen: 90, 10, 20, 30 -- 30 -- [x] 90 -- 10 -> Der Rekord kommt gleich am Anfang. Danach ist kein Wert größer. - -runde: -frage: Gemessen: 15, 15, 15 -- 45 -- 0 -- [x] 15 -> 15 ist nicht größer als 15. `max` bleibt 15. - -runde: -frage: Gemessen: 25, 60, 60, 5. In welcher Richtung (`i`) ist der Rekord? -- 0 -- [x] 1 -- 2 -> Bei `i = 1` kommt die 60. Die zweite 60 ist nicht **größer**, also bleibt `richtung` bei 1. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit einer Variablen den bisher größten Wert merken. → Den Rekord merken -- Ich kann in einer Schleife jeden neuen Messwert mit dem bisher größten vergleichen. → Wo ist am meisten Platz? -- Ich kann mit dem mBot2 herausfinden, in welcher Richtung am meisten Platz ist. → Jetzt in Java: Die Richtung merken -::: - -## Wissenstest - -::: quiz -? Womit fängt `max` vor der Schleife an? -→ Den Rekord merken -- [x] Mit 0, weil noch nichts gemessen ist -- [ ] Mit dem größten Wert -- [ ] Mit 100 -> Jeder Abstand ist größer als 0, also wird schon der erste Messwert der Rekord. -? Was steht im Nein-Zweig der Verzweigung `abstand > max`? -→ Den Rekord merken -- [ ] `max = 0` -- [ ] `max = abstand` -- [x] Nichts, der alte Rekord bleibt. -? Wann ändert sich `richtung`? -→ Jetzt in Java: Die Richtung merken -- [ ] In jedem Durchgang -- [x] Nur wenn es einen neuen Rekord gibt -- [ ] Nur in der letzten Runde -::: diff --git a/web/lessons/de/visubot/09-fallauswahl-mbot2.md b/web/lessons/de/visubot/09-fallauswahl-mbot2.md deleted file mode 100644 index d24c0ba3..00000000 --- a/web/lessons/de/visubot/09-fallauswahl-mbot2.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -titel: Fallauswahl mit Farben -bereich: Sensoren und Entscheidungen -kurz: Je nach Farbe oder Linie etwas anderes tun, mit einer Fallauswahl statt vieler Verzweigungen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Fallauswahl mit Texten bauen -- eine Fallauswahl mit Zahlen in Java schreiben -- je nach Zahl einen anderen Text auf dem Bildschirm zeigen -::: - -## Viele Farben, viele Fälle - -Der mBot2 soll auf jede Farbe anders reagieren: bei Rot rechts abbiegen, bei Grün ein Stück vorfahren, bei Blau piepen. Mit Verzweigungen bräuchtest du drei ineinander. Übersichtlicher ist die **Fallauswahl**, in Java `switch`: - -```java -switch (mbot.getColor()) { - case "rot" -> { - mbot.turnRight(); - } - case "grün" -> { - mbot.forward(20); - } - default -> { - mbot.forward(10); - } -} -``` - -- Oben in den Klammern steht der Wert, der geprüft wird, hier die Farbe. -- Jeder `case` ist ein **Fall**. Passt der Wert, läuft genau dieser Fall. -- `default` ist der Fall für **alles andere**. - -Im Struktogramm ist die Fallauswahl ein Kasten mit mehreren Spalten, für jeden Fall eine. - -::: übung vb-farbweiche -titel: Farbweiche -auftrag: Baue eine Fallauswahl über `mbot.getColor()`. Bei `"rot"` dreht sich der mBot2 nach rechts. Bei `"grün"` fährt er 20 cm vor. Bei `"blau"` spielt er einen Ton mit 880 Hertz, 200 Millisekunden lang. In allen anderen Fällen fährt er 10 cm vor. -messwerte: getColor=rot -> turnRight -messwerte: getColor=grün -> forward 20 -messwerte: getColor=blau -> none, tone -messwerte: getColor=weiß -> forward 10 -braucht: fallauswahl -tipp: Zieh eine Fallauswahl ins Struktogramm. Oben steht `mbot.getColor()`, die Fälle heißen `"rot"`, `"grün"` und `"blau"`, dazu der Fall für alles andere. -tipp: Bei Rot `mbot.turnRight()`, bei Grün `mbot.forward(20)`, bei Blau `mbot.playTone(880, 200)`, sonst `mbot.forward(10)`. -lösung: vb-farbweiche-loesung.visustruct -::: - -## Jetzt in Java: Linienmuster - -Auch eine Zahl kann der Wert einer Fallauswahl sein. `mbot.getLine()` aus Lektion 7 liefert zum Beispiel: - -| Wert | Bedeutung | -|---|---| -| `0` | keine Linie | -| `6` | die beiden mittleren Fühler sehen die Linie: Er steht genau drauf | -| `15` | alle vier sehen Schwarz: eine Querlinie | - -Bei Zahlen schreibst du den Fall ohne Anführungszeichen: `case 6 -> { … }`. - -::: übung vb-linienmuster -titel: Linienmuster -code: java -auftrag: Schreibe in Java eine Fallauswahl über `mbot.getLine()`. Bei 6 fährt der mBot2 10 cm vor. Bei 0 dreht er sich nach rechts. Bei 15 zeigt er **Querlinie!** auf dem Bildschirm. In allen anderen Fällen fährt er 5 cm vor. -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Querlinie!" -messwerte: getLine=4 -> forward 5 -braucht: fallauswahl -tipp: `switch (mbot.getLine()) { case 6 -> { … } case 0 -> { … } case 15 -> { … } default -> { … } }` -tipp: Bei 6 `mbot.forward(10);`, bei 0 `mbot.turnRight();`, bei 15 `mbot.showText("Querlinie!");`, sonst `mbot.forward(5);`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Jetzt in Java: Startsignal - -Vor einem Rennen zeigt der mBot2 nacheinander drei Texte und fährt dann los. Eine For-Schleife zählt die Runden 1, 2 und 3. Die Fallauswahl sucht zu jeder Runde den passenden Text: - -```java -for (int runde = 1; runde <= 3; runde++) { - switch (runde) { - case 1 -> { mbot.showText("Auf die Plätze"); } - ... - } - mbot.pause(1000); -} -``` - -::: übung vb-startsignal -titel: Startsignal -code: java -auftrag: Schreibe in Java: Eine Schleife zählt `runde` von 1 bis 3. In Runde 1 zeigt der Bildschirm **Auf die Plätze**, in Runde 2 **Fertig**, sonst **Los!**. Nach jedem Text wartet der mBot2 eine Sekunde. Nach der Schleife fährt er 50 cm vor. -befehle: showText "Auf die Plätze", pause 1000, showText "Fertig", pause 1000, showText "Los!", pause 1000 -fahrt: forward 50 -braucht: fallauswahl -tipp: Die Schleife heißt `for (int runde = 1; runde <= 3; runde++) { … }`. Darin steht `switch (runde) { … }` und danach `mbot.pause(1000);`. -tipp: `case 1 -> { mbot.showText("Auf die Plätze"); }`, `case 2 -> { … }` und `default -> { mbot.showText("Los!"); }`. Nach der Schleife `mbot.forward(50);`. -lösung: vb-startsignal-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Fallauswahl“](?visustruct&lektion=10-fallauswahl). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-09-fallauswahl-mbot2 -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Linienmuster“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-09-fallauswahl-mbot2-start.visustruct -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Querlinie!" -messwerte: getLine=4 -> forward 5 -tipp: Lies die Fehlermeldung genau. Ist der Befehl richtig geschrieben? Nach `mbot.` schlägt dir der Editor alle Befehle vor. -tipp: Richtig heißt es `mbot.turnRight()`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Spiel: Welcher Fall läuft? - -::: spiel frage -titel: Spiel: Welcher Fall läuft? -intro: Lies die Fallauswahl und sag vorher, was der mBot2 tut. Sechs Runden. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Grün. Was tut er? -- Er dreht sich nach rechts. -- [x] Er fährt 20 cm vor. -- Er fährt 10 cm vor. -> Der Fall `"grün"` passt, also läuft genau dieser. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Gelb. Was tut er? -- Gar nichts. -- Er piept. -- [x] Er fährt 10 cm vor. -> Für Gelb gibt es keinen Fall, also läuft `default`. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Blau. Was tut er? -- [x] Er piept. -- Er piept und fährt dann 10 cm vor. -- Er dreht sich nach rechts. -> Es läuft nur der passende Fall. `default` kommt nur dran, wenn kein anderer Fall passt. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Querlinie!"); } - default -> { mbot.stop(); } - } -frage: Alle vier Fühler sehen Schwarz. Was tut der mBot2? -- Er fährt 10 cm vor. -- [x] Er zeigt **Querlinie!** -- Er hält an. -> Vier Fühler auf Schwarz ergeben 15. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Querlinie!"); } - default -> { mbot.stop(); } - } -frage: Unter dem mBot2 ist alles weiß. Was tut er? -- Er fährt 10 cm vor. -- [x] Er dreht sich nach rechts. -- Er hält an. -> Kein Fühler sieht Schwarz, also liefert `mbot.getLine()` 0. - -runde: - for (int runde = 1; runde <= 3; runde++) { - switch (runde) { - case 1 -> { mbot.showText("Auf die Plätze"); } - case 2 -> { mbot.showText("Fertig"); } - default -> { mbot.showText("Los!"); } - } - } -frage: Was zeigt der Bildschirm in Runde 3? -- Fertig -- [x] Los! -- Auf die Plätze -> Für 3 gibt es keinen eigenen Fall, also läuft `default`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Fallauswahl mit Texten bauen. → Viele Farben, viele Fälle -- Ich kann eine Fallauswahl mit Zahlen in Java schreiben. → Jetzt in Java: Linienmuster -- Ich kann je nach Zahl einen anderen Text auf dem Bildschirm zeigen. → Jetzt in Java: Startsignal -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf Gelb. Welcher Fall der Farbweiche läuft? -→ Viele Farben, viele Fälle -- [ ] der Fall `"rot"` -- [ ] gar keiner -- [x] `default` -> Für Gelb gibt es keinen eigenen Fall. Dann läuft der Fall für alles andere. -? Wie schreibst du den Fall für die Zahl 6? -→ Jetzt in Java: Linienmuster -- [x] `case 6 -> { … }` -- [ ] `case "6" -> { … }` -- [ ] `if 6 -> { … }` -> Zahlen stehen ohne Anführungszeichen, Texte wie `"rot"` mit. -::: diff --git a/web/lessons/de/visubot/10-tasten-joystick.md b/web/lessons/de/visubot/10-tasten-joystick.md deleted file mode 100644 index a0780669..00000000 --- a/web/lessons/de/visubot/10-tasten-joystick.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -titel: Tasten und Joystick -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 wartet auf dich und lässt sich fernsteuern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Sensoren für Tasten und Joystick abfragen -- auf eine Taste warten -- den mBot2 mit dem Joystick steuern -::: - -## Drücken als Sensor - -::: mbot2 -fokus: joystick, buttons -ansicht: oben -::: - -Auf dem CyberPi sitzen zwei [Tasten]{teil=buttons} (A und B) und ein [Joystick]{teil=joystick}. Für dein Programm sind das Sensoren: Sie liefern **wahr**, solange du drückst. - -| Sensor | Text | -|---|---| -| Taste A / B gedrückt? | `mbot.isButtonA()`, `mbot.isButtonB()` | -| Joystick nach oben / unten | `mbot.isJoystickUp()`, `mbot.isJoystickDown()` | -| Joystick nach links / rechts | `mbot.isJoystickLeft()`, `mbot.isJoystickRight()` | - -> Ohne echten mBot2 klappst du in der [Simulation](#zeige-simulation) unter der Welt **🎛 Sensoren ausprobieren** auf. Dort gibt es die Knöpfe A, B und die Pfeile für den Joystick. Ein Klick hält sie eine Sekunde lang gedrückt. - -## Warten auf Taste A im Struktogramm - -Ein Roboter soll nicht sofort losfahren, wenn das Programm startet. Besser: Er wartet, bis du A drückst. - -Warten heißt: eine Schleife, die so lange läuft, wie A **nicht** gedrückt ist. Damit sie nicht ganz leer ist, wartet der mBot2 darin kurz mit **kurz warten** (`mbot.pause(100)`, also 100 Millisekunden). - -::: übung vb-start-a -titel: Start mit Taste A -auftrag: Der mBot2 wartet, bis Taste A gedrückt ist. Dann fährt er 30 cm vor. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: Eine While-Schleife mit der Bedingung `!mbot.isButtonA()`. Darin steht **kurz warten**. -tipp: Nach der Schleife steht `mbot.forward(30)`. -lösung: vb-start-a-loesung.visustruct -::: - -> Beim Prüfen ist Taste A erst eine Weile nicht gedrückt und dann gedrückt. Fährt dein mBot2 zu früh los, fällt das auf. - -## Jetzt in Java: Fernsteuerung - -Mit dem Joystick lenkst du den mBot2. Das Programm fragt fünfmal nacheinander den Joystick ab: nach oben heißt vorfahren, nach unten zurückfahren. - -::: übung vb-java-joystick -titel: Fernsteuerung -code: java -auftrag: Schreibe in Java eine For-Schleife, die fünfmal läuft. Darin: Ist der Joystick oben, fährt der mBot2 vor. Sonst: Ist er unten, fährt er zurück. -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -braucht: forSchleife, verzweigung -tipp: `for (int i = 0; i < 5; i++) { … }` und darin `if (mbot.isJoystickUp()) { … } else { … }`. -tipp: Im `else` steht noch eine Verzweigung: `if (mbot.isJoystickDown()) { mbot.backward(); }`. -lösung: vb-java-joystick-loesung.visustruct -::: - -::: übung vb-fehler-10-tasten-joystick -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Fernsteuerung“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-10-tasten-joystick-start.visustruct -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.backward()`. -lösung: vb-java-joystick-loesung.visustruct -::: - -## Spiel: Was tut der mBot2? - -::: spiel frage -titel: Spiel: Was tut der mBot2? -intro: Du drückst eine Taste oder den Joystick. Was tut der mBot2? Sechs Runden. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Niemand drückt eine Taste. Was tut der mBot2? -- Er fährt 30 cm vor. -- [x] Er wartet weiter. -- Er piept. -> Solange A nicht gedrückt ist, bleibt er in der Warteschleife. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du drückst Taste B. Was tut der mBot2? -- Er fährt 30 cm vor. -- [x] Er wartet weiter. -- Er fährt 30 cm zurück. -> Die Schleife fragt nur nach Taste A. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du drückst Taste A. Was tut der mBot2? -- [x] Er fährt 30 cm vor. -- Er wartet weiter. -- Er wartet 100 ms und hört dann auf. -> Jetzt ist `!mbot.isButtonA()` falsch, die Schleife endet, und er fährt los. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: Du drückst den Joystick nach unten. Was tut der mBot2? -- Er fährt vor. -- [x] Er fährt zurück. -- Gar nichts. -> Die erste Bedingung ist falsch, die zweite wahr. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: Du drückst den Joystick nach links. Was tut der mBot2? -- Er dreht sich nach links. -- Er fährt zurück. -- [x] Gar nichts. -> Für links gibt es keinen Zweig. Beide Bedingungen sind falsch. - -runde: -frage: Du hältst Taste A gedrückt. Was liefert `mbot.isButtonA()`? -- [x] true -- false -- 1 -> Tasten liefern wahr oder falsch, und gedrückt heißt wahr. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Sensoren für Tasten und Joystick abfragen. → Drücken als Sensor -- Ich kann auf eine Taste warten. → Warten auf Taste A im Struktogramm -- Ich kann den mBot2 mit dem Joystick steuern. → Jetzt in Java: Fernsteuerung -::: - -## Wissenstest - -::: quiz -? Was liefert `mbot.isButtonB()`, wenn niemand drückt? -→ Drücken als Sensor -- [ ] 0 -- [x] false -- [ ] B -> Tasten liefern wahr oder falsch. -? Warum steht in der Warteschleife **kurz warten**? -→ Warten auf Taste A im Struktogramm -- [x] Damit die Schleife nicht leer ist und der CyberPi nicht unnötig schnell im Kreis rennt. -- [ ] Damit die Taste länger leuchtet. -- [ ] Ohne Pause fährt der mBot2 rückwärts. -> Die Schleife fragt alle 100 Millisekunden nach, das reicht völlig. -::: diff --git a/web/lessons/de/visubot/10-unterbrechen-mit-break.md b/web/lessons/de/visubot/10-unterbrechen-mit-break.md deleted file mode 100644 index 556fadf2..00000000 --- a/web/lessons/de/visubot/10-unterbrechen-mit-break.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -titel: Notbremse mit break -bereich: Sensoren und Entscheidungen -kurz: Eine Endlosschleife mit Aussprung: Der mBot2 fährt immer weiter, bis die Notbremse greift. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Endlosschleife mit einem Aussprung beenden -- erklären, warum der Aussprung in einer Verzweigung steht -- in Java eine Schleife mit `while (true)` und `break` schreiben -::: - -## Endlosschleife mit Aussprung - -Viele Roboter-Programme laufen „für immer“: Der mBot2 fährt, misst, fährt, misst … Dafür gibt es die **Endlosschleife**. Sie hat keine Bedingung und hört von selbst nie auf. - -Damit der mBot2 trotzdem anhalten kann, brauchst du eine **Notbremse**: den **Aussprung**. Er verlässt sofort die Schleife, in der er steht. Das Programm macht mit dem ersten Kasten **nach** der Schleife weiter. Du erkennst ihn an der Spitze am linken Rand. In den Kasten schreibst du einen kurzen Kommentar, zum Beispiel `Schleife verlassen`. - -Ein Aussprung steht fast immer in einer **Verzweigung**. Sonst würde die Schleife schon beim ersten Durchgang enden. - -::: übung vb-notbremse -titel: Notbremse an der Wand -auftrag: Baue eine Endlosschleife. Darin prüft eine Verzweigung: Ist der Abstand kleiner als 15 cm, kommt ein Aussprung. Danach (unter der Verzweigung, noch in der Schleife) fährt der mBot2 vor. Nach der Schleife spielt er einen Ton. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -braucht: endlosschleife, aussprung -tipp: Zieh die **Endlosschleife** ins Struktogramm. In die Schleife kommt zuerst eine Verzweigung mit `mbot.getDistance() < 15`, im true-Zweig der **Aussprung**, der false-Zweig bleibt leer. -tipp: Unter die Verzweigung (in der Schleife) kommt **fahre vor**, unter die Schleife `mbot.playTone(440, 300)`. -lösung: vb-notbremse-loesung.visustruct -::: - -## Jetzt in Java: Stopp mit Taste A - -In Java ist die Endlosschleife `while (true)`. Der Aussprung heißt `break`: - -```java -while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); -} -``` - -::: übung vb-java-taste-stopp -titel: Stopp mit Taste A -code: java -auftrag: Schreibe in Java: Der mBot2 fährt in einer Endlosschleife immer weiter vor. Wird Taste A gedrückt, verlässt er die Schleife mit `break`. Danach zeigt der Bildschirm **Gestoppt**. -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -braucht: endlosschleife, aussprung -tipp: `while (true) { … }` mit `if (mbot.isButtonA()) { break; }` und danach `mbot.forward();`. -tipp: Nach der Schleife `mbot.showText("Gestoppt");`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Aufruf und Aussprung“](?visustruct&lektion=18-aufruf-und-aussprung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-10-unterbrechen-mit-break -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Stopp mit Taste A“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-10-unterbrechen-mit-break-start.visustruct -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es `mbot.showText("Gestoppt")`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -## Spiel: Notbremse - -::: spiel frage -titel: Spiel: Notbremse -intro: Wann greift der Aussprung, und was passiert danach? Jede Fahrt ist 10 cm lang. Fünf Runden. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Die Wand ist am Anfang 40 cm entfernt. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- immer weiter -> Bei 40, 30 und 20 fährt er. Bei 10 greift die Notbremse. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Was passiert direkt nach `break`? -- Die Schleife beginnt von vorn. -- Er fährt noch einmal vor. -- [x] Er piept. -> `break` verlässt die Schleife. Weiter geht es mit dem ersten Befehl danach. - -runde: - while (true) { - mbot.forward(); - break; - } -frage: Wie oft fährt der mBot2 vor? -- [x] 1-mal -- gar nicht -- immer weiter -> Der Aussprung steht nicht in einer Verzweigung. Die Schleife endet schon im ersten Durchgang. - -runde: - while (true) { - mbot.forward(); - } -frage: Wann hört diese Schleife auf? -- nach 10 Fahrten -- an der Wand -- [x] nie -> Ohne `break` ist `while (true)` wirklich endlos. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Du drückst Taste A, nachdem er zweimal vorgefahren ist. Wie oft ist er vorgefahren? -- [x] 2-mal -- 3-mal -- gar nicht -> Beim nächsten Durchgang merkt er die Taste und springt aus der Schleife. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (true) { - if (mbot.getDistance() > 15) { - break; - } - mbot.forward(); - } -frage: Soll vorfahren und an der Wand mit der Notbremse anhalten. -fehler: 2 -besser: if (mbot.getDistance() < 15) { -> Die Notbremse soll greifen, wenn die Wand **nah** ist. - -runde: - while (true) { - if (mbot.isButtonB()) { - break; - } - mbot.forward(); - } - mbot.showText("Gestoppt"); -frage: Soll vorfahren, bis Taste A gedrückt wird, und dann „Gestoppt“ zeigen. -fehler: 2 -besser: if (mbot.isButtonA()) { -> Gebremst werden soll mit Taste A, nicht mit B. - -runde: - while (true) { - if (mbot.isButtonA()) { - brake; - } - mbot.forward(); - } -frage: Soll vorfahren, bis Taste A gedrückt wird. -fehler: 3 -besser: break; -> Der Aussprung heißt `break`, nicht `brake`. - -runde: - while (false) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Soll in einer Endlosschleife fahren, bis Taste A gedrückt wird. -fehler: 1 -besser: while (true) { -> Die Endlosschleife heißt `while (true)`. Mit `false` läuft sie kein einziges Mal. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Endlosschleife mit einem Aussprung beenden. → Endlosschleife mit Aussprung -- Ich kann erklären, warum der Aussprung in einer Verzweigung steht. → Endlosschleife mit Aussprung -- Ich kann in Java eine Schleife mit `while (true)` und `break` schreiben. → Jetzt in Java: Stopp mit Taste A -::: - -## Wissenstest - -::: quiz -? Wo macht das Programm nach einem Aussprung weiter? -→ Endlosschleife mit Aussprung -- [ ] am Anfang der Schleife -- [x] beim ersten Kasten nach der Schleife -- [ ] ganz am Anfang des Programms -> Der Aussprung verlässt die Schleife sofort. -? Warum steht der Aussprung in einer Verzweigung? -→ Endlosschleife mit Aussprung -- [x] Sonst endet die Schleife schon im ersten Durchgang. -- [ ] Sonst fährt der mBot2 rückwärts. -- [ ] Das ist nur schöner. -> Nur wenn die Bedingung zutrifft, soll die Notbremse greifen. -? Wie heißt die Endlosschleife in Java? -→ Jetzt in Java: Stopp mit Taste A -- [ ] `while (false)` -- [x] `while (true)` -- [ ] `for (;;) break;` -> `true` ist immer wahr, die Schleife hört nur mit `break` auf. -::: diff --git a/web/lessons/de/visubot/11-licht.md b/web/lessons/de/visubot/11-licht.md deleted file mode 100644 index 66881c98..00000000 --- a/web/lessons/de/visubot/11-licht.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -titel: Der Lichtsensor -bereich: Sensoren und Entscheidungen -kurz: Hell oder dunkel? Der mBot2 wird zum Nachtlicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Helligkeit abfragen -- mit einer Verzweigung die LEDs schalten -- mehrere Befehle in einen Zweig schreiben -::: - -## Wie hell ist es? - -::: mbot2 -fokus: lightSensor -ansicht: oben -::: - -Der [Lichtsensor]{teil=lightSensor} sitzt auf dem CyberPi. `mbot.getBrightness()` liefert eine Zahl von **0** (stockdunkel) bis **100** (sehr hell). - -| Sensor | Text | Wert | -|---|---|---| -| Helligkeit | `mbot.getBrightness()` | 0 bis 100 | - -> In der Simulation stellst du die Helligkeit mit dem Regler unter **🎛 Sensoren ausprobieren** ein. Mit einem echten mBot2 hältst du einfach die Hand über den CyberPi. - -## Nachtlicht im Struktogramm - -::: übung vb-nachtlicht -titel: Nachtlicht -auftrag: Ist die Helligkeit kleiner als 30, leuchten die LEDs weiß (`mbot.setLed(255, 255, 255)`). Sonst gehen die LEDs aus (`mbot.ledOff()`). -messwerte: getBrightness=10 -> ledOn -messwerte: getBrightness=80 -> ledOff -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und den Sensor **Helligkeit** darauf. Schreib `< 30` dahinter. -tipp: Im true-Zweig steht **LEDs an** mit `mbot.setLed(255, 255, 255)`, im false-Zweig **LEDs aus**. -lösung: vb-nachtlicht-loesung.visustruct -::: - -::: angeberwissen -Straßenlaternen machen es genauso: Ein Lichtsensor merkt, wann es dämmert, und schaltet sie ein. Darum gehen sie im Winter früher an als im Sommer, ohne dass jemand eine Uhr umstellt. -::: - -## Jetzt in Java: Nachtlicht mit Ton - -::: übung vb-java-nachtlicht-ton -titel: Nachtlicht mit Ton -code: java -auftrag: Schreibe das Nachtlicht in Java, aber mit zwei Änderungen: Im Dunkeln leuchten die LEDs gelb (`mbot.setLed(255, 200, 0)`) **und** der mBot2 spielt einen Ton. Im Hellen gehen die LEDs aus, ohne Ton. -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -braucht: verzweigung -tipp: `if (mbot.getBrightness() < 30) { … } else { … }` -tipp: Im `if`-Teil stehen zwei Zeilen: `mbot.setLed(255, 200, 0);` und `mbot.playTone(440, 300);`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -::: übung vb-fehler-11-licht -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Nachtlicht mit Ton“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-11-licht-start.visustruct -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es `mbot.setLed(255, 200, 0)`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -## Spiel: Licht an oder aus? - -::: spiel frage -titel: Spiel: Licht an oder aus? -intro: Wie hell ist es, und was tun die LEDs? Sechs Runden. -antworten: LEDs an | LEDs aus - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Es ist fast dunkel, die Helligkeit ist 10. -richtig: LEDs an -> 10 ist kleiner als 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist 45. -richtig: LEDs aus -> 45 ist nicht kleiner als 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist genau 30. -richtig: LEDs aus -> 30 ist nicht kleiner als 30. Für „bis einschließlich 30“ bräuchtest du `<=`. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist 29. -richtig: LEDs an -> 29 ist gerade noch kleiner als 30. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: Die Helligkeit ist 50. -richtig: LEDs an -> Achtung, hier ist es umgekehrt: 50 ist nicht größer als 70, also läuft der false-Zweig. Die LEDs leuchten gelb. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: Die Sonne scheint, die Helligkeit ist 100. -richtig: LEDs aus -> 100 ist größer als 70, also läuft der true-Zweig. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Helligkeit abfragen. → Wie hell ist es? -- Ich kann mit einer Verzweigung die LEDs schalten. → Nachtlicht im Struktogramm -- Ich kann mehrere Befehle in einen Zweig schreiben. → Jetzt in Java: Nachtlicht mit Ton -::: - -## Wissenstest - -::: quiz -? `mbot.getBrightness()` liefert 45. Was tut das Nachtlicht? -→ Nachtlicht im Struktogramm -- [ ] Die LEDs leuchten. -- [x] Die LEDs gehen aus. -> 45 ist nicht kleiner als 30. -? In welchem Bereich liegen die Werte des Lichtsensors? -→ Wie hell ist es? -- [ ] 0 bis 255 -- [x] 0 bis 100 -- [ ] -100 bis 100 -::: diff --git a/web/lessons/de/visubot/11-merker-boolean.md b/web/lessons/de/visubot/11-merker-boolean.md deleted file mode 100644 index e8c53ec6..00000000 --- a/web/lessons/de/visubot/11-merker-boolean.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -titel: Ein Merker mit boolean -bereich: Sensoren und Entscheidungen -kurz: Mit einer Variablen vom Typ boolean festhalten, ob etwas passiert ist. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable vom Typ `boolean` anlegen -- mit einem Merker festhalten, ob etwas passiert ist -- einen Merker nach der Schleife in einer Bedingung abfragen -::: - -## Wahr oder falsch - -Eine Variable vom Typ `boolean` kennt nur zwei Werte: `true` (wahr) und `false` (falsch). Du kennst das schon von den Sensoren: `mbot.isButtonA()` liefert `true` oder `false`. Auch ein Vergleich wie `mbot.getDistance() < 10` ist am Ende `true` oder `false`. - -| Anlegen | Bedeutung | -|---|---| -| `boolean dunkel = false` | Es war noch nicht dunkel. | -| `dunkel = true` | Jetzt war es dunkel. | -| `if (dunkel)` | Ist `dunkel` wahr? | - -Bei `if (dunkel)` brauchst du kein `== true`. Die Variable ist ja selbst schon wahr oder falsch. - -## Der Merker - -Der mBot2 soll drei Sekunden lang Wache halten. Er misst immer wieder die Helligkeit. Danach soll er sagen, ob es **irgendwann** dunkel war. - -Dafür nimmst du einen **Merker**: eine `boolean`-Variable, die mit `false` anfängt. Wird es dunkel, setzt du sie auf `true`. Danach setzt sie niemand mehr zurück. Nach der Schleife weißt du also: War es auch nur ein einziges Mal dunkel? - -::: übung vb-wurde-es-dunkel -titel: Wurde es dunkel? -auftrag: Baue ein Struktogramm: Lege `boolean dunkel = false` an. Prüfe in einer For-Schleife 30-mal: Ist die Helligkeit kleiner als 20, wird `dunkel` wahr. Warte in jedem Durchgang 100 ms. Zeige danach **Es war dunkel** oder **Immer hell**. -messwerte: getBrightness=80/10/80 -> none, screen "Es war dunkel" -messwerte: getBrightness=80 -> none, screen "Immer hell" -braucht: forSchleife, verzweigung -tipp: In der Schleife steht eine Verzweigung mit `mbot.getBrightness() < 20`. Im Ja-Zweig steht `dunkel = true`, der Nein-Zweig bleibt leer. Danach kommt `mbot.pause(100)`. -tipp: Nach der Schleife kommt eine zweite Verzweigung mit der Bedingung `dunkel`. Ja: `mbot.showText("Es war dunkel")`, Nein: `mbot.showText("Immer hell")`. -lösung: vb-wurde-es-dunkel-loesung.visustruct -::: - -> Beim Prüfen wird es in der Mitte der Wache kurz dunkel und dann wieder hell. Zeigt dein mBot2 trotzdem **Es war dunkel**? - -## Jetzt in Java: Wurde geklatscht? - -In Java sieht der Merker so aus: - -```java -boolean laut = false; -for (int i = 0; i < 30; i++) { - if (mbot.getLoudness() > 60) { - laut = true; - } - mbot.pause(100); -} -``` - -`true` und `false` schreibst du in Java immer klein. - -::: übung vb-java-klatsch-merker -titel: Wurde geklatscht? -code: java -auftrag: Schreibe in Java: Der mBot2 hört drei Sekunden lang zu (30-mal mit 100 ms Pause). Ist die Lautstärke einmal größer als 60, merkt er sich das in `boolean laut`. Danach zeigt er **Geklatscht!** oder **Alles still**. -messwerte: getLoudness=0/90/0 -> none, screen "Geklatscht!" -messwerte: getLoudness=0 -> none, screen "Alles still" -braucht: forSchleife, verzweigung -tipp: Nimm den Code oben und schreibe danach `if (laut) { … } else { … }`. -tipp: In die Zweige kommen `mbot.showText("Geklatscht!");` und `mbot.showText("Alles still");`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -::: übung vb-fehler-11-merker-boolean -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wurde geklatscht?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-11-merker-boolean-start.visustruct -messwerte: getLoudness=0/90/0 -> none, screen "Geklatscht!" -messwerte: getLoudness=0 -> none, screen "Alles still" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie schreibt man wahr und falsch in Java? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `laut = true`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -## Spiel: true oder false? - -::: spiel frage -titel: Spiel: true oder false? -intro: Ludwig fragt, was in der Bedingung herauskommt. Sechs Runden. -frage: Ist es true oder false? -antworten: true | false - -runde: -frage: `mbot.getDistance() < 10`, der Abstand ist 25 cm. -richtig: false -> 25 ist nicht kleiner als 10. - -runde: -frage: `mbot.isButtonA()`, und du drückst gerade Taste A. -richtig: true -> Der Sensor meldet: gedrückt. - -runde: -frage: `boolean dunkel = false`. In der Schleife wird es nie dunkel. Was ist `dunkel` danach? -richtig: false -> Niemand hat den Merker auf `true` gesetzt. - -runde: -frage: `boolean dunkel = false`. In der Schleife wird es einmal dunkel, danach wieder hell. Was ist `dunkel` danach? -richtig: true -> Ein Merker bleibt `true`, wenn er einmal gesetzt wurde. - -runde: -frage: `mbot.getBrightness() > 50`, die Helligkeit ist 50. -richtig: false -> 50 ist nicht größer als 50. - -runde: -frage: `!mbot.isButtonA()`, und du drückst Taste A nicht. -richtig: true -> Taste A ist nicht gedrückt, also `false`. Das `!` dreht es um: `true`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable vom Typ `boolean` anlegen. → Wahr oder falsch -- Ich kann mit einem Merker festhalten, ob etwas passiert ist. → Der Merker -- Ich kann einen Merker nach der Schleife in einer Bedingung abfragen. → Jetzt in Java: Wurde geklatscht? -::: - -## Wissenstest - -::: quiz -? Welche Werte kann eine Variable vom Typ `boolean` haben? -→ Wahr oder falsch -- [ ] Jede ganze Zahl -- [x] Nur `true` und `false` -- [ ] Nur 0 und 1 -? Womit fängt ein Merker an? -→ Der Merker -- [x] Mit `false`, weil noch nichts passiert ist -- [ ] Mit `true` -- [ ] Mit dem ersten Messwert -> Erst wenn das Ereignis passiert, wird er `true`. -? Wie fragst du in Java ab, ob der Merker `laut` wahr ist? -→ Jetzt in Java: Wurde geklatscht? -- [x] `if (laut)` -- [ ] `if (laut = true)` -- [ ] `if laut` -> `laut` ist selbst schon wahr oder falsch. Ein einzelnes `=` wäre eine Zuweisung. -::: diff --git a/web/lessons/de/visubot/12-lautstaerke.md b/web/lessons/de/visubot/12-lautstaerke.md deleted file mode 100644 index ad8b47ce..00000000 --- a/web/lessons/de/visubot/12-lautstaerke.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -titel: Das Mikrofon -bereich: Sensoren und Entscheidungen -kurz: Klatschen zum Losfahren und eine Lärmampel für das Klassenzimmer. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Lautstärke abfragen -- warten, bis etwas passiert -- eine Lärmampel in Java schreiben -::: - -## Wie laut ist es? - -::: mbot2 -fokus: microphone -ansicht: oben -::: - -Das [Mikrofon]{teil=microphone} des CyberPi misst die Lautstärke. `mbot.getLoudness()` liefert **0** (still) bis **100** (sehr laut). Ein Klatschen in der Nähe ergibt ungefähr 60 bis 90. - -| Sensor | Text | Wert | -|---|---|---| -| Lautstärke | `mbot.getLoudness()` | 0 bis 100 | - -## Klatschen zum Losfahren im Struktogramm - -Wie beim Warten auf Taste A: Eine Schleife wartet, solange es leise ist. Erst dann fährt der mBot2 los. - -::: übung vb-klatschen -titel: Klatschen zum Losfahren -auftrag: Der mBot2 wartet, solange die Lautstärke kleiner als 50 ist. Danach fährt er 30 cm vor. -messwerte: getLoudness=0/80 -> forward 30 -messwerte: getLoudness=90 -> forward 30 -braucht: whileSchleife -tipp: Eine While-Schleife mit der Bedingung `mbot.getLoudness() < 50`, darin **kurz warten**. -tipp: Nach der Schleife: `mbot.forward(30)`. -lösung: vb-klatschen-loesung.visustruct -::: - -> In der Simulation schiebst du den Regler **Lautstärke** nach rechts, während das Programm wartet. - -## Jetzt in Java: Lärmampel - -::: übung vb-java-laermampel -titel: Lärmampel -code: java -auftrag: Schreibe in Java: Ist die Lautstärke größer als 60, leuchten die LEDs rot. Sonst sind sie aus. -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -braucht: verzweigung -tipp: `if (mbot.getLoudness() > 60) { … } else { … }` -tipp: Rot ist `mbot.setLed(255, 0, 0);`, aus ist `mbot.ledOff();`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -::: angeberwissen -Lautstärke misst man eigentlich in **Dezibel** (dB). Flüstern hat etwa 30 dB, ein Klassenzimmer 60 bis 70 dB, ein Presslufthammer 100 dB. Der CyberPi rechnet das in eine einfache Zahl von 0 bis 100 um. -::: - -::: übung vb-fehler-12-lautstaerke -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Lärmampel“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-12-lautstaerke-start.visustruct -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.ledOff()`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -## Spiel: Laut oder leise? - -::: spiel frage -titel: Spiel: Laut oder leise? -intro: Wie laut ist es, und was tut der mBot2? Sechs Runden. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: In der Klasse ist es ruhig, die Lautstärke ist 30. -- [x] Er wartet weiter. -- Er fährt 30 cm vor. -> 30 ist kleiner als 50, die Warteschleife läuft weiter. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du klatschst, die Lautstärke ist 70. -- Er wartet weiter. -- [x] Er fährt 30 cm vor. -> 70 ist nicht kleiner als 50. Die Schleife endet, und er fährt los. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: Die Lautstärke ist genau 50. -- Er wartet weiter. -- [x] Er fährt 30 cm vor. -> 50 ist nicht kleiner als 50. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Die Lautstärke ist 65. -- [x] Die LEDs leuchten rot. -- Die LEDs sind aus. -> 65 ist größer als 60: zu laut. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Die Lautstärke ist genau 60. -- Die LEDs leuchten rot. -- [x] Die LEDs sind aus. -> 60 ist nicht größer als 60. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Jemand flüstert, die Lautstärke ist 10. -- Die LEDs leuchten rot. -- [x] Die LEDs sind aus. -> Flüstern ist leise. Die Lärmampel bleibt aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Lautstärke abfragen. → Wie laut ist es? -- Ich kann warten, bis etwas passiert. → Klatschen zum Losfahren im Struktogramm -- Ich kann eine Lärmampel in Java schreiben. → Jetzt in Java: Lärmampel -::: - -## Wissenstest - -::: quiz -? Die Klatsch-Schleife lautet `while (mbot.getLoudness() < 50)`. Es ist 30 laut. Was passiert? -→ Klatschen zum Losfahren im Struktogramm -- [x] Der mBot2 wartet weiter. -- [ ] Der mBot2 fährt los. -> 30 ist kleiner als 50, die Bedingung ist wahr, die Schleife läuft weiter. -::: diff --git a/web/lessons/de/visubot/13-neigung.md b/web/lessons/de/visubot/13-neigung.md deleted file mode 100644 index 31914e86..00000000 --- a/web/lessons/de/visubot/13-neigung.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -titel: Der Lagesensor -bereich: Sensoren und Entscheidungen -kurz: Neigung messen und Schütteln erkennen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was der Lagesensor misst -- zwei Bedingungen mit „oder“ verbinden -- mehrere Bedingungen mit „und“ verbinden -::: - -## Schief oder gerade? - -::: mbot2 -fokus: cyberpi -drehen: ja -::: - -Im [CyberPi]{teil=cyberpi} steckt ein **Lagesensor** (Gyroskop). Er misst, wie schief der mBot2 steht, in Grad: - -| Sensor | Text | Wert | -|---|---|---| -| Neigung vorn/hinten | `mbot.getPitch()` | Nase nach unten: positiv, nach oben: negativ (−90 bis 90) | -| Neigung seitlich | `mbot.getRoll()` | zur einen Seite positiv, zur anderen negativ | -| Geschüttelt? | `mbot.isShaken()` | `true` oder `false` | - -Steht der mBot2 flach auf dem Tisch, sind beide Neigungen ungefähr **0**. - -> In der Simulation gibt es dafür zwei Regler unter **🎛 Sensoren ausprobieren** und den Knopf **schütteln**. Mit einem echten mBot2 kippst du ihn vorsichtig in der Hand. - -## Schräglage-Warnung im Struktogramm - -Fährt der mBot2 eine zu steile Rampe hoch oder runter, soll er warnen. Zu steil heißt: mehr als 20° nach vorn **oder** mehr als 20° nach hinten. - -::: übung vb-schraeglage -titel: Schräglage-Warnung -auftrag: Ist die Neigung vorn/hinten größer als 20 **oder** kleiner als −20, spielt der mBot2 einen Ton. Sonst tut er nichts. -messwerte: getPitch=30 -> tone -messwerte: getPitch=-30 -> tone -messwerte: getPitch=5 -> noTone -braucht: verzweigung -tipp: „oder“ heißt in einer Bedingung `||`. Zieh den Sensor **Neigung vorn/hinten** zweimal auf die Verzweigung. -tipp: Die Bedingung heißt `mbot.getPitch() > 20 || mbot.getPitch() < -20`, im true-Zweig steht **Ton spielen**. -lösung: vb-schraeglage-loesung.visustruct -::: - -## Jetzt in Java: Wasserwaage - -Eine Wasserwaage zeigt, ob etwas genau gerade ist. Der mBot2 leuchtet grün, wenn beide Neigungen zwischen −5 und 5 liegen. - -::: übung vb-java-wasserwaage -titel: Wasserwaage -code: java -auftrag: Schreibe in Java: Liegen `mbot.getPitch()` und `mbot.getRoll()` beide zwischen −5 und 5, leuchten die LEDs grün. Sonst sind sie aus. -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -braucht: verzweigung -tipp: „und“ heißt `&&`. Du brauchst vier Vergleiche: `mbot.getPitch() > -5 && mbot.getPitch() < 5 && …` -tipp: Grün ist `mbot.setLed(0, 255, 0);`, im `else` steht `mbot.ledOff();`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -::: übung vb-fehler-13-neigung -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wasserwaage“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-13-neigung-start.visustruct -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.setLed(0, 255, 0)`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -## Spiel: Zu schief? - -::: spiel frage -titel: Spiel: Zu schief? -intro: Ludwig kippt den mBot2. Was tut er? Sechs Runden. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Die Nase zeigt 30° nach unten, `mbot.getPitch()` liefert 30. -- [x] Er piept. -- Er piept nicht. -> 30 ist größer als 20. Ein wahrer Teil reicht bei `||`. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Die Nase zeigt nach oben, `mbot.getPitch()` liefert −25. -- [x] Er piept. -- Er piept nicht. -> −25 ist kleiner als −20, also ist der zweite Teil wahr. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Eine flache Rampe, `mbot.getPitch()` liefert 10. -- Er piept. -- [x] Er piept nicht. -> 10 liegt zwischen −20 und 20. Beide Teile sind falsch. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: `mbot.getPitch()` liefert genau 20. -- Er piept. -- [x] Er piept nicht. -> 20 ist nicht größer als 20. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: `mbot.getPitch()` liefert 0, `mbot.getRoll()` liefert 3. -- [x] Die LEDs leuchten grün. -- Die LEDs sind aus. -> Alle vier Teile sind wahr. Der mBot2 liegt fast gerade. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: `mbot.getPitch()` liefert 2, `mbot.getRoll()` liefert −8. -- Die LEDs leuchten grün. -- [x] Die LEDs sind aus. -> −8 ist nicht größer als −5. Bei `&&` macht ein falscher Teil alles falsch. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- ↓ 1 7 JOYSTICK: kleiner Hebel auf dem CyberPi -- → 4 1 FALLAUSWAHL: switch: für jeden Wert ein eigener Fall -- → 2 3 SENSOR: Bauteil, das etwas misst -- → 6 1 VERZWEIGUNG: je nach Bedingung das eine oder das andere -- ↓ 6 9 ULTRASCHALL: damit misst der mBot2 den Abstand: ein sehr hoher Ton und sein Echo -- → 8 3 BREAK: Notbremse: verlässt sofort die Schleife -- ↓ 8 3 BEDINGUNG: ist wahr oder falsch, z. B. mbot.getDistance() < 20 -- ↓ 1 11 HELLIGKEIT: mbot.getBrightness() misst sie -lösung: 4 7, 6 6, 12 3, 2 6, 2 7, 8 4 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was der Lagesensor misst. → Schief oder gerade? -- Ich kann zwei Bedingungen mit „oder“ verbinden. → Schräglage-Warnung im Struktogramm -- Ich kann mehrere Bedingungen mit „und“ verbinden. → Jetzt in Java: Wasserwaage -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht flach auf dem Tisch. Was liefert `mbot.getPitch()` ungefähr? -→ Schief oder gerade? -- [x] 0 -- [ ] 90 -- [ ] 100 -? Was macht `mbot.isShaken()`? -→ Schief oder gerade? -- [ ] Es schüttelt den mBot2. -- [x] Es meldet, ob jemand den mBot2 schüttelt. -> Sensoren tun nichts, sie messen nur. -::: diff --git a/web/lessons/de/visubot/14-leds.md b/web/lessons/de/visubot/14-leds.md deleted file mode 100644 index 4a7426cd..00000000 --- a/web/lessons/de/visubot/14-leds.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -titel: Die LEDs -bereich: Licht, Ton und Bildschirm -kurz: Farben mischen, eine Ampel bauen und blinken lassen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Farbe aus Rot, Grün und Blau mischen -- Farben mit Pausen nacheinander zeigen -- die LEDs in Java blinken lassen -::: - -## Rot, Grün und Blau mischen - -::: mbot2 -fokus: leds -ansicht: hinten -::: - -Die fünf [LEDs]{teil=leds} sind ein **Aktor**: Sie tun etwas, sie leuchten. Jede LED mischt ihre Farbe aus Rot, Grün und Blau, jeweils von 0 (aus) bis 255 (ganz hell). - -| Befehl | Kasten | Was passiert | -|---|---|---| -| `mbot.setLed(255, 0, 0)` | **LEDs an** | alle LEDs rot | -| `mbot.ledOff()` | **LEDs aus** | alle LEDs aus | -| `mbot.pause(1000)` | **kurz warten** | 1000 Millisekunden (1 Sekunde) warten | - -| Farbe | Rot | Grün | Blau | -|---|---|---|---| -| Rot | 255 | 0 | 0 | -| Gelb | 255 | 200 | 0 | -| Grün | 0 | 255 | 0 | -| Blau | 0 | 0 | 255 | -| Weiß | 255 | 255 | 255 | -| Lila | 160 | 0 | 255 | - -> Ohne **kurz warten** schaltet der mBot2 die Farben so schnell um, dass du nur die letzte siehst. In der Simulation siehst du die Farbe an den LEDs des 3D-Modells. - -## Ampel im Struktogramm - -::: übung vb-ampel -titel: Ampel -auftrag: Die LEDs zeigen nacheinander Rot, Gelb und Grün wie eine Ampel. Zwischen den Farben wartet der mBot2 jeweils 1000 Millisekunden. Gelb ist `255, 200, 0`. -befehle: setLed 255 0 0, pause 1000, setLed 255 200 0, pause 1000, setLed 0 255 0 -tipp: Zieh dreimal **LEDs an** und zweimal **kurz warten** ins Struktogramm, abwechselnd. -tipp: Ändere die Zahlen: `mbot.setLed(255, 0, 0)`, `mbot.pause(1000)`, `mbot.setLed(255, 200, 0)`, `mbot.pause(1000)`, `mbot.setLed(0, 255, 0)`. -lösung: vb-ampel-loesung.visustruct -::: - -## Jetzt in Java: Blaulicht - -Blinken heißt: an, warten, aus, warten, und das immer wieder. Das „immer wieder“ ist eine Schleife. - -::: übung vb-java-blinken -titel: Blaulicht -code: java -auftrag: Schreibe in Java eine For-Schleife, die dreimal läuft. Darin gehen die LEDs blau an, der mBot2 wartet 500 Millisekunden, die LEDs gehen aus, und er wartet wieder 500 Millisekunden. -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: `for (int i = 0; i < 3; i++) { … }` -tipp: In der Schleife: `mbot.setLed(0, 0, 255);`, `mbot.pause(500);`, `mbot.ledOff();`, `mbot.pause(500);`. -lösung: vb-java-blinken-loesung.visustruct -::: - -::: übung vb-fehler-14-leds -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Blaulicht“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-14-leds-start.visustruct -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.pause(500)`. -lösung: vb-java-blinken-loesung.visustruct -::: - -## Spiel: Welche Farbe? - -::: spiel frage -titel: Spiel: Welche Farbe? -intro: Rot, Grün und Blau gemischt: Welche Farbe zeigen die LEDs? Sieben Runden. - -runde: - mbot.setLed(255, 0, 0); -frage: Welche Farbe leuchtet? -- [x] Rot -- Grün -- Blau -> Nur der erste Wert, Rot, ist an. - -runde: - mbot.setLed(0, 0, 255); -frage: Welche Farbe leuchtet? -- Rot -- Grün -- [x] Blau -> Die Reihenfolge ist immer Rot, Grün, Blau. Nur Blau ist an. - -runde: - mbot.setLed(255, 255, 255); -frage: Welche Farbe leuchtet? -- Gelb -- [x] Weiß -- aus -> Alle drei Farben ganz hell ergeben Weiß. - -runde: - mbot.setLed(255, 200, 0); -frage: Welche Farbe leuchtet? -- [x] Gelb -- Lila -- Weiß -> Rot und Grün zusammen ergeben Gelb. - -runde: - mbot.setLed(160, 0, 255); -frage: Welche Farbe leuchtet? -- Gelb -- [x] Lila -- Grün -> Rot und Blau zusammen ergeben Lila. - -runde: - mbot.setLed(0, 0, 0); -frage: Welche Farbe leuchtet? -- Weiß -- Schwarz -- [x] keine, die LEDs sind aus -> Alle drei Werte sind 0. Eine LED kann nicht schwarz leuchten. - -runde: - mbot.setLed(255, 0, 0); - mbot.setLed(0, 255, 0); - mbot.pause(1000); -frage: Welche Farbe siehst du eine Sekunde lang? -- Rot -- [x] Grün -- erst Rot, dann Grün -> Ohne **kurz warten** zwischen den Farben ist Rot sofort wieder weg. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.setLed(255, 0, 0); - mbot.pause(1000); - mbot.setLed(255, 200, 0); - mbot.pause(1000); - mbot.setLed(0, 0, 255); -frage: Soll wie eine Ampel Rot, Gelb und Grün zeigen. -fehler: 5 -besser: mbot.setLed(0, 255, 0); -> Grün ist `0, 255, 0`. `0, 0, 255` ist Blau. - -runde: - for (int i = 0; i < 3; i++) { - mbot.setLed(0, 0, 255); - mbot.pause(500); - mbot.ledOff; - mbot.pause(500); - } -frage: Soll dreimal blau blinken. -fehler: 4 -besser: mbot.ledOff(); -> Auch ein Befehl ohne Zahl braucht seine Klammern. - -runde: - mbot.setLed(0, 0, 300); - mbot.pause(1000); - mbot.ledOff(); -frage: Soll eine Sekunde ganz hell blau leuchten. -fehler: 1 -besser: mbot.setLed(0, 0, 255); -> Jede Farbe geht nur von 0 bis 255. - -runde: - mbot.setLed(255, 255, 255); - mbot.pause(1000); - mbot.setLed(0, 0, 0, 0); -frage: Soll eine Sekunde weiß leuchten und dann ausgehen. -fehler: 3 -besser: mbot.ledOff(); -> `setLed` hat genau drei Zahlen: Rot, Grün, Blau. Zum Ausschalten gibt es `mbot.ledOff()`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Farbe aus Rot, Grün und Blau mischen. → Rot, Grün und Blau mischen -- Ich kann Farben mit Pausen nacheinander zeigen. → Ampel im Struktogramm -- Ich kann die LEDs in Java blinken lassen. → Jetzt in Java: Blaulicht -::: - -## Wissenstest - -::: quiz -? Welche Farbe ergibt `mbot.setLed(0, 255, 0)`? -→ Rot, Grün und Blau mischen -- [ ] Rot -- [x] Grün -- [ ] Blau -> Die Zahlen sind Rot, Grün, Blau. Nur Grün ist an. -? Warum braucht das Blaulicht **kurz warten**? -→ Jetzt in Java: Blaulicht -- [x] Sonst wechselt es so schnell, dass man kein Blinken sieht. -- [ ] Sonst gehen die LEDs kaputt. -- [ ] Weil `ledOff()` sonst nicht geht. -::: diff --git a/web/lessons/de/visubot/15-einzelne-leds.md b/web/lessons/de/visubot/15-einzelne-leds.md deleted file mode 100644 index 77e0ea03..00000000 --- a/web/lessons/de/visubot/15-einzelne-leds.md +++ /dev/null @@ -1,209 +0,0 @@ ---- -titel: Einzelne LEDs -bereich: Licht, Ton und Bildschirm -kurz: Jede der fünf LEDs bekommt ihre eigene Farbe, bis zum Lauflicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die LEDs über ihre Nummern 0 bis 4 ansprechen -- einzelne LEDs in verschiedenen Farben leuchten lassen -- mit einer Schleife ein Lauflicht bauen -::: - -## Jede LED hat eine Nummer - -::: mbot2 -fokus: leds -ansicht: hinten -::: - -Bisher haben alle fünf [LEDs]{teil=leds} dieselbe Farbe gezeigt. Du kannst aber auch jede LED einzeln ansprechen. Dafür hat jede LED eine **Nummer**. Wie bei Arrays fängt das Zählen bei **0** an: Die fünf LEDs heißen 0, 1, 2, 3 und 4. - -| Befehl | Kasten | Was passiert | -|---|---|---| -| `mbot.led(0).setColor("grün")` | **LED-Farbe setzen** | LED 0 leuchtet grün | -| `mbot.led(3).setColor("aus")` | **LED-Farbe setzen** | LED 3 geht aus | - -Die Farbe schreibst du als Namen in Anführungszeichen: - -| Farbname | Farbname | Farbname | -|---|---|---| -| `"rot"` | `"orange"` | `"gelb"` | -| `"grün"` | `"türkis"` | `"blau"` | -| `"lila"` | `"pink"` | `"weiß"` | - -Mit `"aus"` schaltest du eine LED aus. - -> Die Nummer darf auch eine Variable sein: `mbot.led(i).setColor("rot")`. So kann eine Schleife eine LED nach der anderen einschalten. - -## Drei Lichter im Struktogramm - -::: übung vb-drei-lichter -titel: Drei Lichter -auftrag: Schalte LED 0 rot, LED 2 gelb und LED 4 grün. Die LEDs 1 und 3 bleiben aus. -befehle: ledColor 0 "rot", ledColor 2 "gelb", ledColor 4 "grün" -tipp: Zieh dreimal **LED-Farbe setzen** ins Struktogramm. -tipp: Ändere Nummer und Farbe: `mbot.led(0).setColor("rot")`, `mbot.led(2).setColor("gelb")`, `mbot.led(4).setColor("grün")`. -lösung: vb-drei-lichter-loesung.visustruct -::: - -## Jetzt in Java: Lauflicht - -Bei einem Lauflicht wandert ein Licht von einer LED zur nächsten. Die Schleifenvariable `i` ist dabei die Nummer der LED. - -::: übung vb-java-lauflicht -titel: Lauflicht -code: java -auftrag: Schreibe in Java eine For-Schleife, in der `i` von 0 bis 4 läuft. Darin geht LED `i` blau an, der mBot2 wartet 200 Millisekunden, und LED `i` geht wieder aus. -befehle: ledColor 0 "blau", pause 200, ledColor 0 "aus", ledColor 1 "blau", pause 200, ledColor 1 "aus", ledColor 2 "blau", pause 200, ledColor 2 "aus", ledColor 3 "blau", pause 200, ledColor 3 "aus", ledColor 4 "blau", pause 200, ledColor 4 "aus" -braucht: forSchleife -tipp: `for (int i = 0; i < 5; i++) { … }` -tipp: In der Schleife: `mbot.led(i).setColor("blau");`, `mbot.pause(200);`, `mbot.led(i).setColor("aus");`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -::: übung vb-fehler-15-einzelne-leds -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Lauflicht“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-15-einzelne-leds-start.visustruct -befehle: ledColor 0 "blau", pause 200, ledColor 0 "aus", ledColor 1 "blau", pause 200, ledColor 1 "aus", ledColor 2 "blau", pause 200, ledColor 2 "aus", ledColor 3 "blau", pause 200, ledColor 3 "aus", ledColor 4 "blau", pause 200, ledColor 4 "aus" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.led(i)`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -## Spiel: Welche LED leuchtet? - -::: spiel frage -titel: Spiel: Welche LED leuchtet? -intro: Fünf LEDs mit den Nummern 0 bis 4. Welche leuchten? Sechs Runden. - -runde: - mbot.led(0).setColor("rot"); -frage: Welche LED leuchtet rot? -- [x] die erste -- die zweite -- alle -> Die Nummern fangen bei 0 an. LED 0 ist die erste. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blau"); - } -frage: Welche LEDs leuchten blau? -- LED 0 bis 3 -- [x] alle fünf -- nur LED 4 -> `i` läuft von 0 bis 4, das sind alle fünf. - -runde: - for (int i = 0; i < 5; i = i + 2) { - mbot.led(i).setColor("grün"); - } -frage: Welche LEDs leuchten grün? -- LED 1 und 3 -- [x] LED 0, 2 und 4 -- LED 2 und 4 -> `i` springt in Zweierschritten: 0, 2, 4. - -runde: - mbot.led(2).setColor("gelb"); - mbot.led(2).setColor("aus"); -frage: Welche LED leuchtet am Ende? -- LED 2 gelb -- [x] keine -- LED 3 gelb -> LED 2 geht an und gleich wieder aus. - -runde: - for (int i = 4; i >= 0; i--) { - mbot.led(i).setColor("rot"); - mbot.pause(200); - mbot.led(i).setColor("aus"); - } -frage: Bei welcher LED beginnt dieses Lauflicht? -- LED 0 -- [x] LED 4 -- LED 5 -> `i` beginnt bei 4 und zählt rückwärts. Das Licht läuft andersherum. - -runde: -frage: Ludwig schreibt `mbot.led(5).setColor("rot");`. Welche LED leuchtet? -- die fünfte -- die sechste -- [x] keine, eine LED 5 gibt es nicht -> Die fünf LEDs haben die Nummern 0 bis 4. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.led(1).setColor("rot"); - mbot.led(2).setColor("gelb"); - mbot.led(4).setColor("grün"); -frage: Soll LED 0 rot, LED 2 gelb und LED 4 grün schalten. -fehler: 1 -besser: mbot.led(0).setColor("rot"); -> Die erste LED hat die Nummer 0. - -runde: - for (int i = 1; i <= 5; i++) { - mbot.led(i).setColor("blau"); - } -frage: Soll alle fünf LEDs blau schalten. -fehler: 1 -besser: for (int i = 0; i < 5; i++) { -> Die LEDs haben die Nummern 0 bis 4. Eine LED 5 gibt es nicht. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blau"); - mbot.pause(200); - mbot.led(0).setColor("aus"); - } -frage: Lauflicht: Jede LED geht kurz blau an und wieder aus. -fehler: 4 -besser: mbot.led(i).setColor("aus"); -> Ausgehen soll dieselbe LED `i`, nicht immer LED 0. - -runde: - mbot.led(3).setColor(rot); -frage: Soll LED 3 rot schalten. -fehler: 1 -besser: mbot.led(3).setColor("rot"); -> Der Farbname ist ein Text und braucht Anführungszeichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die LEDs über ihre Nummern 0 bis 4 ansprechen. → Jede LED hat eine Nummer -- Ich kann einzelne LEDs in verschiedenen Farben leuchten lassen. → Drei Lichter im Struktogramm -- Ich kann mit einer Schleife ein Lauflicht bauen. → Jetzt in Java: Lauflicht -::: - -## Wissenstest - -::: quiz -? Welche Nummer hat die erste LED? -→ Jede LED hat eine Nummer -- [x] 0 -- [ ] 1 -- [ ] 5 -> Wie bei Arrays zählt man ab 0. Die fünf LEDs haben die Nummern 0 bis 4. -? Was macht `mbot.led(4).setColor("aus")`? -→ Drei Lichter im Struktogramm -- [ ] Alle LEDs gehen aus. -- [x] Nur LED 4 geht aus. -- [ ] Vier LEDs gehen aus. -::: diff --git a/web/lessons/de/visubot/16-lautsprecher.md b/web/lessons/de/visubot/16-lautsprecher.md deleted file mode 100644 index 2e3a7716..00000000 --- a/web/lessons/de/visubot/16-lautsprecher.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -titel: Der Lautsprecher -bereich: Licht, Ton und Bildschirm -kurz: Töne, eine Tonleiter und eine Sirene. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was die beiden Zahlen bei `playTone` bedeuten -- eine Tonfolge bauen -- in Java mit der Zählvariable rechnen -- den mBot2 ein Gefühl zeigen lassen -::: - -## Wie hoch, wie lang? - -::: mbot2 -fokus: cyberpi -ansicht: oben -::: - -Im [CyberPi]{teil=cyberpi} steckt ein kleiner Lautsprecher. `mbot.playTone(440, 300)` spielt einen Ton: - -- Die erste Zahl ist die **Tonhöhe** in Hertz (Schwingungen pro Sekunde). Je größer, desto höher. -- Die zweite Zahl ist die **Länge** in Millisekunden. - -| Ton | c | d | e | f | g | a | h | c' | -|---|---|---|---|---|---|---|---|---| -| Hertz | 262 | 294 | 330 | 349 | 392 | 440 | 494 | 523 | - -> In der Simulation hörst du die Töne über die Lautsprecher deines Computers. Dreh ruhig etwas leiser. - -## Tonleiter im Struktogramm - -::: übung vb-tonleiter -titel: Tonleiter -auftrag: Der mBot2 spielt die Töne c, d, e, f, g nacheinander, jeden 300 Millisekunden lang. Die Hertz-Zahlen stehen in der Tabelle. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -tipp: Zieh fünfmal **Ton spielen** ins Struktogramm. -tipp: Die Kästen heißen `mbot.playTone(262, 300)`, `mbot.playTone(294, 300)` und so weiter. -lösung: vb-tonleiter-loesung.visustruct -::: - -::: angeberwissen -Der Ton a mit 440 Hertz heißt **Kammerton**. Nach ihm stimmen Orchester ihre Instrumente. Eine Oktave höher hat genau doppelt so viele Schwingungen: 880 Hertz. -::: - -## Jetzt in Java: immer höher - -In einer For-Schleife kannst du mit der Zählvariable rechnen. So wird jeder Ton höher als der letzte: - -```java -mbot.playTone(i * 200, 200); -``` - -::: übung vb-java-hoeher -titel: Immer höher -code: java -auftrag: Schreibe in Java eine For-Schleife, in der `i` von 1 bis 5 zählt. In jedem Durchgang spielt der mBot2 einen Ton mit `i * 200` Hertz, 200 Millisekunden lang. -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -braucht: forSchleife -tipp: `for (int i = 1; i <= 5; i++) { … }` -tipp: In der Schleife steht nur `mbot.playTone(i * 200, 200);`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Gefühle zeigen - -Der mBot2 kann auch fröhlich, traurig oder müde sein. Mit **Gefühl zeigen** (`mbot.emotion("smile")`) spielt er eine kleine Vorführung: Die LEDs leuchten, er macht ein Geräusch und wackelt ein bisschen. - -| Text | Gefühl | -|---|---| -| `mbot.emotion("smile")` | lacht | -| `mbot.emotion("hello")` | grüßt | -| `mbot.emotion("sad")` | ist traurig | -| `mbot.emotion("angry")` | ist wütend | -| `mbot.emotion("dizzy")` | ist schwindelig | -| `mbot.emotion("zzz")` | schläft | - -> Probier es mit dem echten mBot2 aus. Im Simulator siehst du davon nichts, er zeigt nur den Befehl an. Weitere Gefühle stehen unter **Nachschlagen**. - -::: übung vb-fehler-16-lautsprecher -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Immer höher“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-16-lautsprecher-start.visustruct -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es `mbot.playTone(i * 200, 200)`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Spiel: Von tief nach hoch - -::: spiel reihenfolge -titel: Spiel: Von tief nach hoch -intro: Tippe die Antworten in der richtigen Reihenfolge an. Ein falscher Tipp beendet die Runde. Fünf Runden. - -runde: -frage: Tippe die Töne von tief nach hoch an. -- `mbot.playTone(262, 300)` -- `mbot.playTone(330, 300)` -- `mbot.playTone(440, 300)` -- `mbot.playTone(880, 300)` -> Je mehr Hertz, desto höher der Ton. - -runde: -frage: Tippe die Töne von kurz nach lang an. -- `mbot.playTone(440, 100)` -- `mbot.playTone(440, 300)` -- `mbot.playTone(440, 1000)` -- `mbot.playTone(440, 2000)` -> Die zweite Zahl ist die Länge in Millisekunden. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.playTone(i * 200, 200); - } -frage: Tippe die Töne in der Reihenfolge an, in der sie klingen. -- 600 Hertz -- 400 Hertz -- 200 Hertz -> `i` zählt rückwärts: 3, 2, 1. Die Töne werden immer tiefer. - -runde: -frage: Tippe die Töne von tief nach hoch an. -- c mit 262 Hertz -- der Kammerton a -- a eine Oktave höher -> Der Kammerton a hat 440 Hertz, eine Oktave höher sind es doppelt so viele: 880 Hertz. - -runde: -frage: Tippe die Zeiten von kurz nach lang an. -- 300 Millisekunden -- 1 Sekunde -- 1500 Millisekunden -- 2 Sekunden -> 1 Sekunde sind 1000 Millisekunden, 2 Sekunden sind 2000. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was die beiden Zahlen bei `playTone` bedeuten. → Wie hoch, wie lang? -- Ich kann eine Tonfolge bauen. → Tonleiter im Struktogramm -- Ich kann in Java mit der Zählvariable rechnen. → Jetzt in Java: immer höher -- Ich kann den mBot2 ein Gefühl zeigen lassen. → Gefühle zeigen -::: - -## Wissenstest - -::: quiz -? Welcher Ton ist höher? -→ Wie hoch, wie lang? -- [x] `mbot.playTone(880, 300)` -- [ ] `mbot.playTone(440, 300)` -> Mehr Hertz heißt höher. -? Wie lange klingt `mbot.playTone(440, 1000)`? -→ Wie hoch, wie lang? -- [ ] 440 Sekunden -- [x] 1 Sekunde -- [ ] 1000 Sekunden -> 1000 Millisekunden sind eine Sekunde. -::: diff --git a/web/lessons/de/visubot/17-arrays-melodie.md b/web/lessons/de/visubot/17-arrays-melodie.md deleted file mode 100644 index 1c789deb..00000000 --- a/web/lessons/de/visubot/17-arrays-melodie.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -titel: Arrays und Melodien -bereich: Licht, Ton und Bildschirm -kurz: Viele Werte in einem Array speichern und mit einer Schleife abarbeiten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Array anlegen und mit einer Schleife abspielen -- ein Array mit Texten in Java benutzen -- Messwerte in einem Array sammeln und den Mittelwert ausrechnen -::: - -## Eine Melodie als Array - -Eine Melodie ist eine Reihe von Tönen. Statt fünf Variablen `ton1`, `ton2`, … nimmst du ein **Array**. Ein Array ist eine Reihe von Fächern unter **einem** Namen: - -```java -int[] toene = {262, 294, 330, 349, 392}; -``` - -- `int[]` heißt: ein Array aus ganzen Zahlen. -- Die Fächer sind von **0** an nummeriert. `toene[0]` ist 262, `toene[4]` ist 392. -- `toene.length` sagt, wie viele Fächer es gibt, hier 5. - -Eine For-Schleife mit `i` von 0 bis `toene.length - 1` kommt so an jedes Fach. - -::: übung vb-melodie -titel: Melodie -auftrag: Lege ein Array `toene` mit den Tonhöhen 262, 294, 330, 349 und 392 an. Eine For-Schleife spielt sie nacheinander, jeden 300 Millisekunden lang. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -braucht: forSchleife -tipp: `int[] toene = {262, 294, 330, 349, 392}` legt das Array an. -tipp: Die Schleife läuft von `i = 0` bis `i < toene.length`. Darin steht `mbot.playTone(toene[i], 300)`. -lösung: vb-melodie-loesung.visustruct -::: - -> Willst du eine andere Melodie, änderst du nur das Array. Die Schleife bleibt gleich. - -## Jetzt in Java: Regenbogen - -Die fünf LEDs haben die Nummern 0 bis 4, genau wie die Fächer eines Arrays mit fünf Werten. Ein Array kann auch Texte enthalten: `String[] farben = {"rot", "gelb"};`. LED `i` bekommt dann die Farbe aus Fach `i`: `mbot.led(i).setColor(farben[i])`. - -::: übung vb-farben -titel: Regenbogen -code: java -auftrag: Schreibe in Java: Lege ein Array `farben` mit den Texten `"rot"`, `"gelb"`, `"grün"`, `"blau"` und `"lila"` an. Eine For-Schleife gibt jeder LED `i` die Farbe aus `farben[i]`. -befehle: ledColor 0 "rot", ledColor 1 "gelb", ledColor 2 "grün", ledColor 3 "blau", ledColor 4 "lila" -braucht: forSchleife -tipp: `String[] farben = {"rot", "gelb", "grün", "blau", "lila"};` legt das Array an. -tipp: `for (int i = 0; i < farben.length; i++) { mbot.led(i).setColor(farben[i]); }` -lösung: vb-farben-loesung.visustruct -::: - -## Jetzt in Java: Messreihe - -Sensoren messen nie ganz genau. Halte die Hand vor den Ultraschallsensor: Die Zahl springt immer ein bisschen hin und her. Profis messen deshalb mehrmals und rechnen den **Mittelwert** aus. - -Die Messwerte kommen in ein Array. `new int[5]` legt ein Array mit fünf leeren Fächern an: - -```java -int[] werte = new int[5]; -for (int i = 0; i < werte.length; i++) { - werte[i] = mbot.getDistance(); - mbot.pause(100); -} -``` - -Danach zählst du alle Werte zusammen. Dafür brauchst du eine Variable, die mit 0 anfängt und in jedem Durchgang wächst: - -```java -int summe = 0; -for (int i = 0; i < werte.length; i++) { - summe = summe + werte[i]; -} -``` - -Der Mittelwert ist die Summe geteilt durch die Anzahl. Schreib `5.0` statt `5`, dann rechnet Java mit Kommazahlen: `double mittelwert = summe / 5.0;` - -::: übung vb-messreihe -titel: Messreihe -code: java -auftrag: Miss den Abstand fünfmal in ein Array `int[] werte = new int[5]`, mit 100 ms Pause dazwischen. Zähle danach alle Werte zusammen, rechne den Mittelwert aus und zeige zum Beispiel **Mittelwert: 40.0** auf dem Bildschirm. -messwerte: getDistance=40 -> screen "Mittelwert: 40.0" -messwerte: getDistance=25 -> screen "Mittelwert: 25.0" -braucht: forSchleife -tipp: Zwei For-Schleifen: Die erste füllt das Array mit `werte[i] = mbot.getDistance();`, die zweite rechnet `summe = summe + werte[i];`. -tipp: Danach `double mittelwert = summe / 5.0;` und `mbot.showText("Mittelwert: " + mittelwert);`. -lösung: vb-messreihe-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Arrays“](?visustruct&lektion=15-arrays). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-17-arrays-melodie -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Messreihe“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-17-arrays-melodie-start.visustruct -messwerte: getDistance=40 -> screen "Mittelwert: 40.0" -messwerte: getDistance=25 -> screen "Mittelwert: 25.0" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `summe = summe + werte[i]`. -lösung: vb-messreihe-loesung.visustruct -::: - -## Spiel: Welches Fach? - -::: spiel frage -titel: Spiel: Welches Fach? -intro: Fächer zählen ab 0. Was steht wo im Array? Sechs Runden. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist `toene[2]`? -- 294 -- [x] 330 -- 349 -> Fach 0 ist 262, Fach 1 ist 294, Fach 2 ist 330. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist `toene.length`? -- 4 -- [x] 5 -- 392 -> `length` zählt die Fächer. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist `toene[toene.length - 1]`? -- 349 -- [x] 392 -- Fehler -> `toene.length - 1` ist 4, das letzte Fach. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was passiert bei `mbot.playTone(toene[5], 300)`? -- Er spielt 392 Hertz. -- Er spielt gar nichts und macht weiter. -- [x] Fehler: Fach 5 gibt es nicht. -> Die Fächer haben die Nummern 0 bis 4. Java meldet `ArrayIndexOutOfBoundsException`. - -runde: - String[] farben = {"rot", "gelb", "grün", "blau", "lila"}; - for (int i = 0; i < farben.length; i++) { - mbot.led(i).setColor(farben[i]); - } -frage: Welche Farbe hat LED 3? -- grün -- [x] blau -- lila -> LED 3 bekommt `farben[3]`, das vierte Wort. - -runde: - int[] werte = {20, 22, 18, 20, 20}; - int summe = 0; - for (int i = 0; i < werte.length; i++) { - summe = summe + werte[i]; - } - double mittelwert = summe / 5.0; -frage: Welchen Wert hat `mittelwert`? -- 18.0 -- [x] 20.0 -- 100.0 -> Die Summe ist 100, und 100 / 5.0 ist 20.0. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - int[] toene = {262, 294, 330, 349, 392}; - for (int i = 0; i <= toene.length; i++) { - mbot.playTone(toene[i], 300); - } -frage: Soll alle fünf Töne spielen. -fehler: 2 -besser: for (int i = 0; i < toene.length; i++) { -> Mit `<=` will die Schleife auch `toene[5]` spielen. Das Fach gibt es nicht. - -runde: - int[] toene = {262, 294, 330, 349, 392}; - for (int i = 0; i < toene.length; i++) { - mbot.playTone(toene, 300); - } -frage: Soll alle fünf Töne spielen. -fehler: 3 -besser: mbot.playTone(toene[i], 300); -> Gespielt wird ein Fach, `toene[i]`, nicht das ganze Array. - -runde: - String[] farben = {"rot", "gelb", "grün", "blau", "lila"}; - for (int i = 0; i < farben.length(); i++) { - mbot.led(i).setColor(farben[i]); - } -frage: Soll jeder LED eine Farbe aus dem Array geben. -fehler: 2 -besser: for (int i = 0; i < farben.length; i++) { -> Bei Arrays steht `length` ohne Klammern. Klammern braucht nur `length()` bei Strings. - -runde: - int[] werte = new int[5]; - int summe = 0; - for (int i = 0; i < werte.length; i++) { - summe = werte[i]; - } -frage: Soll alle Messwerte zusammenzählen. -fehler: 4 -besser: summe = summe + werte[i]; -> So steht am Ende nur der letzte Wert in `summe`. Der neue Wert muss dazukommen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Array anlegen und mit einer Schleife abspielen. → Eine Melodie als Array -- Ich kann ein Array mit Texten in Java benutzen. → Jetzt in Java: Regenbogen -- Ich kann Messwerte in einem Array sammeln und den Mittelwert ausrechnen. → Jetzt in Java: Messreihe -::: - -## Wissenstest - -::: quiz -? Was ist `toene[1]`, wenn `int[] toene = {262, 294, 330};`? -→ Eine Melodie als Array -- [ ] 262 -- [x] 294 -- [ ] 1 -> Die Fächer zählen ab 0. Fach 1 ist also das zweite. -? Wie viele Fächer hat `{262, 294, 330}`, also was ist `toene.length`? -→ Eine Melodie als Array -- [ ] 2 -- [x] 3 -- [ ] 330 -> `length` zählt die Fächer, hier drei. Das letzte Fach hat deshalb die Nummer 2. -::: diff --git a/web/lessons/de/visubot/18-bildschirm.md b/web/lessons/de/visubot/18-bildschirm.md deleted file mode 100644 index 35f92e65..00000000 --- a/web/lessons/de/visubot/18-bildschirm.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -titel: Der Bildschirm -bereich: Licht, Ton und Bildschirm -kurz: Text, Zahlen und Messwerte auf dem CyberPi anzeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Text auf dem Bildschirm anzeigen -- mehrere Texte nacheinander zeigen -- Zahlen und Messwerte anzeigen -- einen Countdown in Java schreiben -::: - -## Text anzeigen - -::: mbot2 -fokus: screen -ansicht: hinten -::: - -Der farbige [Bildschirm]{teil=screen} des CyberPi ist auch ein Aktor. Mit **Text anzeigen** schreibst du etwas darauf: - -```java -mbot.showText("Hallo!") -``` - -Der Text steht in Anführungszeichen, wie bei `System.out.println`. Ein neuer Text ersetzt den alten. - -> In der Simulation erscheint der Text auf dem Bildschirm des 3D-Modells und unter der Welt hinter 📺. - -## Begrüßung im Struktogramm - -::: übung vb-begruessung -titel: Begrüßung -auftrag: Der mBot2 zeigt zuerst „Hallo!“, wartet 1000 Millisekunden und zeigt dann „Ich bin VisuBot“. -befehle: showText "Hallo!", pause 1000, showText "Ich bin VisuBot" -tipp: Zieh zweimal **Text anzeigen** und einmal **kurz warten** ins Struktogramm. -tipp: `mbot.showText("Hallo!")`, `mbot.pause(1000)`, `mbot.showText("Ich bin VisuBot")`. -lösung: vb-begruessung-loesung.visustruct -::: - -## Zahlen und Messwerte - -Statt Text kannst du auch Zahlen und Variablen anzeigen, und mit `+` setzt du alles zusammen: - -```java -mbot.showText(i) -mbot.showText("Abstand: " + mbot.getDistance()) -``` - -So zeigt der mBot2 dir, was seine Sensoren gerade messen. - -## Jetzt in Java: Countdown - -::: übung vb-java-countdown -titel: Countdown -code: java -auftrag: Schreibe in Java einen Countdown: Eine For-Schleife zählt `i` von 3 rückwärts bis 1. In jedem Durchgang zeigt der mBot2 `i` an und wartet 1000 Millisekunden. Danach zeigt er „Los!“. -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Los!" -braucht: forSchleife -tipp: Rückwärts zählen: `for (int i = 3; i >= 1; i--) { … }` -tipp: In der Schleife: `mbot.showText(i);` und `mbot.pause(1000);`. Nach der Schleife `mbot.showText("Los!");`. -lösung: vb-java-countdown-loesung.visustruct -::: - -::: übung vb-fehler-18-bildschirm -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Countdown“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-18-bildschirm-start.visustruct -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Los!" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.showText(i)`. -lösung: vb-java-countdown-loesung.visustruct -::: - -## Spiel: Was steht auf dem Bildschirm? - -::: spiel frage -titel: Spiel: Was steht auf dem Bildschirm? -intro: Lies den Code und sag vorher, was der Bildschirm am Ende zeigt. Sechs Runden. - -runde: - mbot.showText("Hallo!"); - mbot.pause(1000); - mbot.showText("Ich bin VisuBot"); -frage: Was steht am Ende auf dem Bildschirm? -- Hallo! Ich bin VisuBot -- [x] Ich bin VisuBot -- Hallo! -> Ein neuer Text ersetzt den alten. - -runde: - mbot.showText("Abstand: " + 25); -frage: Was steht auf dem Bildschirm? -- [x] Abstand: 25 -- "Abstand: " + 25 -- Abstand: -> Das `+` hängt die Zahl an den Text. - -runde: - int i = 3; - mbot.showText("i"); -frage: Was steht auf dem Bildschirm? -- 3 -- [x] i -- "i" -> In Anführungszeichen ist `i` ein Text, keine Variable. Die Anführungszeichen selbst erscheinen nicht. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.showText(i); - mbot.pause(1000); - } - mbot.showText("Start!"); -frage: Welche Zahl steht direkt vor „Start!“ da? -- 0 -- [x] 1 -- 3 -> Der Countdown zeigt 3, 2, 1. Bei 0 ist `i >= 1` falsch. - -runde: - mbot.showText("Summe: " + 2 + 3); -frage: Was steht auf dem Bildschirm? -- Summe: 5 -- [x] Summe: 23 -- Summe: 2 + 3 -> Java rechnet von links nach rechts: Erst kommt die 2 an den Text, dann die 3. - -runde: - mbot.showText("Summe: " + (2 + 3)); -frage: Was steht auf dem Bildschirm? -- [x] Summe: 5 -- Summe: 23 -- Summe: (2 + 3) -> Die Klammern rechnet Java zuerst aus. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.showText("Hallo!"); - mbot.pause(1); - mbot.showText("Ich bin VisuBot"); -frage: Soll „Hallo!“ zeigen, eine Sekunde warten und dann „Ich bin VisuBot“ zeigen. -fehler: 2 -besser: mbot.pause(1000); -> `pause` zählt in Millisekunden. Eine Sekunde sind 1000. - -runde: - for (int i = 3; i >= 1; i++) { - mbot.showText(i); - mbot.pause(1000); - } -frage: Countdown: soll 3, 2, 1 zeigen. -fehler: 1 -besser: for (int i = 3; i >= 1; i--) { -> Rückwärts zählen heißt `i--`. Mit `i++` hört die Schleife nie auf. - -runde: - mbot.showText(Hallo!); -frage: Soll „Hallo!“ zeigen. -fehler: 1 -besser: mbot.showText("Hallo!"); -> Text steht in Anführungszeichen. - -runde: - mbot.showText("Abstand: " - mbot.getDistance()); -frage: Soll zum Beispiel „Abstand: 25“ zeigen. -fehler: 1 -besser: mbot.showText("Abstand: " + mbot.getDistance()); -> Text und Zahl hängst du mit `+` aneinander. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Text auf dem Bildschirm anzeigen. → Text anzeigen -- Ich kann mehrere Texte nacheinander zeigen. → Begrüßung im Struktogramm -- Ich kann Zahlen und Messwerte anzeigen. → Zahlen und Messwerte -- Ich kann einen Countdown in Java schreiben. → Jetzt in Java: Countdown -::: - -## Wissenstest - -::: quiz -? Was zeigt `mbot.showText("Abstand: " + 25)`? -→ Zahlen und Messwerte -- [x] Abstand: 25 -- [ ] "Abstand: " + 25 -- [ ] 25 -> Das `+` hängt die Zahl an den Text. -? Was passiert mit dem alten Text, wenn du einen neuen anzeigst? -→ Text anzeigen -- [x] Er wird ersetzt. -- [ ] Der neue kommt darunter. -::: diff --git a/web/lessons/de/visubot/19-zeichenketten.md b/web/lessons/de/visubot/19-zeichenketten.md deleted file mode 100644 index 191afef3..00000000 --- a/web/lessons/de/visubot/19-zeichenketten.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -titel: Zeichenketten -bereich: Licht, Ton und Bildschirm -kurz: Mit Texten rechnen, Buchstaben herausholen und auf dem Bildschirm zeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit `length()` und `substring(…)` arbeiten -- Texte und Zahlen mit `+` verbinden -- mit `charAt(…)` einzelne Zeichen holen -::: - -## Buchstabe für Buchstabe - -Ein Text heißt in Java **Zeichenkette** oder `String`. Er besteht aus einzelnen Zeichen, die wie bei einem Array ab **0** nummeriert sind: - -| Zeichen | V | i | s | u | B | o | t | -|---|---|---|---|---|---|---|---| -| Nummer | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - -- `wort.length()` liefert die Anzahl der Zeichen, hier 7. -- `wort.substring(0, 3)` liefert die ersten 3 Zeichen: `"Vis"`. - -Der mBot2 soll seinen Namen auf dem [Bildschirm]{teil=screen} aufbauen: erst **V**, dann **Vi**, dann **Vis** und so weiter bis **VisuBot**. - -::: übung vb-buchstaben -titel: Name aufbauen -auftrag: Lege `String wort = "VisuBot"` an. Eine For-Schleife zählt `i` von 1 bis `wort.length()`. Darin zeigt der mBot2 `wort.substring(0, i)` und wartet 300 Millisekunden. -befehle: showText "V", pause 300, showText "Vi", pause 300, showText "Vis", pause 300, showText "Visu", pause 300, showText "VisuB", pause 300, showText "VisuBo", pause 300, showText "VisuBot", pause 300 -braucht: forSchleife -tipp: Die Schleife beginnt bei `int i = 1` und läuft, solange `i <= wort.length()`. -tipp: In der Schleife: `mbot.showText(wort.substring(0, i))` und `mbot.pause(300)`. -lösung: vb-buchstaben-loesung.visustruct -::: - -## Jetzt in Java: Text und Länge - -Mit `+` hängst du Texte und Zahlen aneinander. So zeigt der mBot2 einen Text und dahinter seine Länge. - -::: übung vb-java-textlaenge -titel: Wie lang ist der Text? -code: java -auftrag: Schreibe in Java: Lege `String text = "Hallo Klasse"` an. Der mBot2 zeigt den Text und in Klammern seine Länge, also **Hallo Klasse (12)**. -befehle: showText "Hallo Klasse (12)" -tipp: Die Länge liefert `text.length()`. Auch das Leerzeichen zählt mit. -tipp: `mbot.showText(text + " (" + text.length() + ")");` -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Jetzt in Java: Laufschrift - -`wort.charAt(i)` liefert das Zeichen mit der Nummer `i`. Zeigst du die Zeichen nacheinander mit einer Pause, läuft das Wort Buchstabe für Buchstabe über den Bildschirm: - -```java -String wort = "Ludwig"; -for (int i = 0; i < wort.length(); i++) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); -} -``` - -| Durchgang | `i` | Bildschirm | -|---|---|---| -| 1 | 0 | L | -| 2 | 1 | u | -| 3 | 2 | d | - -::: übung vb-laufschrift -titel: Ludwig rückwärts -code: java -auftrag: Lege `String wort = "Ludwig"` an. Zeige das Wort **rückwärts** Buchstabe für Buchstabe auf dem Bildschirm, also g, i, w, d, u, L, mit 500 ms Pause nach jedem Buchstaben. -befehle: showText "g", pause 500, showText "i", pause 500, showText "w", pause 500, showText "d", pause 500, showText "u", pause 500, showText "L", pause 500 -braucht: forSchleife -tipp: Das letzte Zeichen hat die Nummer `wort.length() - 1`. Die Schleife zählt rückwärts: `for (int i = wort.length() - 1; i >= 0; i--)`. -tipp: In der Schleife: `mbot.showText(wort.charAt(i));` und `mbot.pause(500);`. -lösung: vb-laufschrift-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Zeichenketten“](?visustruct&lektion=17-zeichenketten). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-19-zeichenketten -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wie lang ist der Text?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-19-zeichenketten-start.visustruct -befehle: showText "Hallo Klasse (12)" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.showText(text +`. -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 zeigen soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Fünf Runden, je 30 Sekunden. -zeit: 30 - -runde: - String wort = "VisuBot"; - for (int i = 1; i <= wort.length(); i++) { - mbot.showText(wort.substring(1, i)); - mbot.pause(300); - } -frage: Soll V, Vi, Vis und so weiter bis VisuBot zeigen. -fehler: 3 -besser: mbot.showText(wort.substring(0, i)); -> Das erste Zeichen hat die Nummer 0. Mit `substring(1, i)` fehlt das V. - -runde: - String text = "Hallo Klasse"; - mbot.showText(text + " (" + text.length + ")"); -frage: Soll **Hallo Klasse (12)** zeigen. -fehler: 2 -besser: mbot.showText(text + " (" + text.length() + ")"); -> Bei einem String ist `length()` eine Methode und braucht Klammern. Nur bei Arrays steht `length` ohne Klammern. - -runde: - String wort = "Ludwig"; - for (int i = 0; i <= wort.length(); i++) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); - } -frage: Soll L, u, d, w, i, g zeigen. -fehler: 2 -besser: for (int i = 0; i < wort.length(); i++) { -> Das letzte Zeichen hat die Nummer 5. Bei `i = 6` gibt es kein Zeichen mehr. - -runde: - String wort = "Ludwig"; - for (int i = wort.length(); i >= 0; i--) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); - } -frage: Soll das Wort rückwärts zeigen: g, i, w, d, u, L. -fehler: 2 -besser: for (int i = wort.length() - 1; i >= 0; i--) { -> Rückwärts beginnt man beim letzten Zeichen, und das hat die Nummer `wort.length() - 1`. - -runde: - String name = 'Ludwig'; - mbot.showText("Hallo " + name); -frage: Soll **Hallo Ludwig** zeigen. -fehler: 1 -besser: String name = "Ludwig"; -> Texte stehen in doppelten Anführungszeichen. Einfache gibt es nur für ein einzelnes Zeichen (`char`). -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 6 1 LAUFSCHRIFT: ein Wort Buchstabe für Buchstabe über den Bildschirm -- ↓ 4 1 BILDSCHIRM: zeigt mit mbot.showText einen Text -- ↓ 6 7 HERTZ: Einheit der Tonhöhe: Schwingungen pro Sekunde -- ↓ 4 11 AKTOR: Bauteil, das etwas tut, z. B. leuchten -- ↓ 4 3 LAUTSPRECHER: spielt mit mbot.playTone einen Ton -- ↓ 4 9 ZEICHENKETTE: anderes Wort für String -- ↓ 1 5 MILLISEKUNDE: ein Tausendstel einer Sekunde -- → 15 1 ARRAY: Reihe von Fächern unter einem Namen -lösung: 6 2, 8 5, 9 7, 7 11, 10 3 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit `length()` und `substring(…)` arbeiten. → Buchstabe für Buchstabe -- Ich kann Texte und Zahlen mit `+` verbinden. → Jetzt in Java: Text und Länge -- Ich kann mit `charAt(…)` einzelne Zeichen holen. → Jetzt in Java: Laufschrift -::: - -## Wissenstest - -::: quiz -? Was liefert `"VisuBot".substring(0, 4)`? -→ Buchstabe für Buchstabe -- [ ] `"VisuB"` -- [x] `"Visu"` -- [ ] `"uBot"` -> `substring(0, 4)` nimmt die Zeichen 0, 1, 2 und 3, also vier Stück. -? Was liefert `"Ludwig".charAt(0)`? -→ Jetzt in Java: Laufschrift -- [x] `L` -- [ ] `u` -- [ ] `g` -> Die Zeichen werden ab 0 gezählt. Zeichen 0 ist das erste. -::: diff --git a/web/lessons/de/visubot/20-motoren.md b/web/lessons/de/visubot/20-motoren.md deleted file mode 100644 index 2f090e00..00000000 --- a/web/lessons/de/visubot/20-motoren.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -titel: Motoren und Geschwindigkeit -bereich: Motoren und Methoden -kurz: Gas geben, lenken und einer Linie folgen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit Räder einzeln Gas geben und anhalten -- fahren, bis ein Sensor etwas meldet -- einen Linienfolger in Java schreiben -::: - -## Zwei Motoren, zwei Räder - -::: mbot2 -fokus: motors, wheels -ansicht: unten -::: - -Der mBot2 hat zwei [Motoren]{teil=motors}, jeder treibt ein [Rad]{teil=wheels} an. Bisher hast du **fahre vor** und **drehe rechts** benutzt. Diese Befehle fahren eine feste Strecke und warten, bis der mBot2 angekommen ist. - -Mit **Räder einzeln** (`mbot.drive(links, rechts)`) gibst du stattdessen Gas: Du sagst, wie stark sich jedes Rad dreht, in Prozent von −100 bis 100. Der mBot2 fährt dann **weiter**, bis du ihm etwas anderes sagst. Mit **anhalten** (`mbot.stop()`) bleibt er stehen. - -| Befehl | Was passiert? | -|---|---| -| `mbot.drive(40, 40)` | beide Räder gleich schnell: geradeaus | -| `mbot.drive(-40, -40)` | rückwärts | -| `mbot.drive(10, 40)` | rechts schneller: Kurve nach links | -| `mbot.drive(40, -40)` | Räder gegeneinander: dreht auf der Stelle nach rechts | -| `mbot.stop()` | anhalten | - -> Im Simulator fährt `mbot.drive(100, 100)` 20 cm pro Sekunde. Probier es in der [Simulation](#zeige-simulation) aus. - -## Gas geben bis zur Wand im Struktogramm - -In Lektion 5 ist der mBot2 in 10-cm-Schritten bis zur Wand gefahren. Mit **Räder einzeln** geht das ohne Ruckeln: einmal Gas geben, dann warten, bis die Wand nah ist, dann anhalten. - -::: übung vb-gas-bis-wand -titel: Gas geben bis zur Wand -auftrag: Der mBot2 gibt mit 50 % Gas. Solange die Wand mehr als 15 cm entfernt ist, wartet er kurz. Danach hält er an. Es gibt drei Welten. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Ganz oben steht `mbot.drive(50, 50)`. Darunter eine While-Schleife mit der Bedingung `mbot.getDistance() > 15`. -tipp: In der Schleife steht nur **kurz warten**. Der mBot2 fährt dabei weiter! Nach der Schleife steht **anhalten**. -lösung: vb-gas-bis-wand-loesung.visustruct -::: - -## Der Linienfolger - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Ein Klassiker: Der mBot2 folgt einer schwarzen Linie auf dem Boden. Dafür schaut er auf die beiden mittleren Fühler des [Liniensensors]{teil=lineSensor}: - -| Sensor | Text | -|---|---| -| linker mittlerer Fühler sieht Schwarz | `mbot.isLineLeft()` | -| rechter mittlerer Fühler sieht Schwarz | `mbot.isLineRight()` | - -Die Idee: Sehen **beide** die Linie, fährt er geradeaus. Sieht nur der **linke** sie, ist die Linie nach links gewandert: Er lenkt nach links, also dreht sich das rechte Rad schneller. Sieht nur der **rechte** sie, lenkt er nach rechts. - -## Jetzt in Java: Linienfolger - -::: übung vb-java-linienfolger -titel: Linienfolger -code: java -auftrag: Schreibe in Java einen Linienfolger. Solange die Wand mehr als 15 cm entfernt ist, prüft der mBot2 seine beiden Fühler und lenkt. Danach hält er an. In der ersten Welt biegt die Linie nach rechts ab, in der zweiten nach links. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: `while (mbot.getDistance() > 15) { … }` und danach `mbot.stop();`. -tipp: In der Schleife: `if (mbot.isLineLeft() && mbot.isLineRight()) { mbot.drive(40, 40); } else if (mbot.isLineLeft()) { mbot.drive(10, 40); } else if (mbot.isLineRight()) { mbot.drive(40, 10); }` -lösung: vb-java-linienfolger-loesung.visustruct -::: - -> Am echten mBot2 klebst du die Linie mit schwarzem Isolierband auf einen hellen Boden. Fahr anfangs langsam, sonst schießt er in der Kurve über die Linie hinaus. - -::: übung vb-fehler-20-motoren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Linienfolger“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-20-motoren-start.visustruct -welt: linie-1, linie-2 -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es `mbot.stop()`. -lösung: vb-java-linienfolger-loesung.visustruct -::: - -## Spiel: Wohin fährt er? - -::: spiel frage -titel: Spiel: Wohin fährt er? -intro: Links und rechts Gas in Prozent: Wohin fährt der mBot2? Sieben Runden. -antworten: geradeaus | rückwärts | Kurve nach links | Kurve nach rechts | dreht sich auf der Stelle - -runde: - mbot.drive(40, 40); -frage: Wohin fährt er? -richtig: geradeaus -> Beide Räder drehen sich gleich schnell. - -runde: - mbot.drive(-40, -40); -frage: Wohin fährt er? -richtig: rückwärts -> Minus heißt rückwärts, und beide Räder sind gleich. - -runde: - mbot.drive(10, 40); -frage: Wohin fährt er? -richtig: Kurve nach links -> Das rechte Rad ist schneller, also lenkt er nach links. - -runde: - mbot.drive(40, 10); -frage: Wohin fährt er? -richtig: Kurve nach rechts -> Das linke Rad ist schneller, also lenkt er nach rechts. - -runde: - mbot.drive(40, -40); -frage: Wohin fährt er? -richtig: dreht sich auf der Stelle -> Ein Rad vor, eins zurück: Er dreht sich nach rechts, ohne vom Fleck zu kommen. - -runde: - mbot.drive(-40, 40); -frage: Wohin fährt er? -richtig: dreht sich auf der Stelle -> Diesmal dreht er sich nach links. - -runde: - if (mbot.isLineLeft() && !mbot.isLineRight()) { - ... - } -frage: Linienfolger: Nur der linke Fühler sieht die Linie. Was gehört in die Lücke? -- `mbot.drive(40, 10);` -- [x] `mbot.drive(10, 40);` -- `mbot.stop();` -> Die Linie ist nach links gewandert. Er lenkt nach links, also dreht sich das rechte Rad schneller. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit Räder einzeln Gas geben und anhalten. → Zwei Motoren, zwei Räder -- Ich kann fahren, bis ein Sensor etwas meldet. → Gas geben bis zur Wand im Struktogramm -- Ich kann einen Linienfolger in Java schreiben. → Jetzt in Java: Linienfolger -::: - -## Wissenstest - -::: quiz -? Was macht `mbot.drive(30, 30)`? -→ Zwei Motoren, zwei Räder -- [ ] Er fährt 30 cm und hält an. -- [x] Er fährt geradeaus und hört nicht auf, bis ein anderer Fahrbefehl kommt. -- [ ] Er dreht sich um 30°. -> **Räder einzeln** gibt nur Gas. Anhalten musst du selbst. -? Der mBot2 soll nach rechts lenken. Welcher Befehl passt? -→ Zwei Motoren, zwei Räder -- [ ] `mbot.drive(10, 40)` -- [x] `mbot.drive(40, 10)` -- [ ] `mbot.drive(-40, -40)` -> Dreht sich das linke Rad schneller, fährt er eine Rechtskurve. -::: diff --git a/web/lessons/de/visubot/21-stoppuhr-akku.md b/web/lessons/de/visubot/21-stoppuhr-akku.md deleted file mode 100644 index 409fa0e6..00000000 --- a/web/lessons/de/visubot/21-stoppuhr-akku.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -titel: Stoppuhr und Akku -bereich: Motoren und Methoden -kurz: Zeit messen und den Akku im Blick behalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Stoppuhr auf 0 setzen und ablesen -- eine bestimmte Zeit lang fahren -- den Akkustand anzeigen -::: - -## Die Stoppuhr - -::: mbot2 -fokus: cyberpi -ansicht: oben -::: - -Im [CyberPi]{teil=cyberpi} läuft eine Stoppuhr. Sie zählt die Sekunden, seit das Programm läuft. Mit **Stoppuhr auf 0** (`mbot.resetTimer()`) fängt sie wieder bei 0 an. - -| Sensor oder Befehl | Text | Wert | -|---|---|---| -| Stoppuhr auf 0 | `mbot.resetTimer()` | | -| Stoppuhr | `mbot.getTimer()` | Sekunden mit Nachkommastelle, z. B. `1.5` | - -So fährst du eine bestimmte Zeit lang: Stoppuhr auf 0, Gas geben, warten, solange die Stoppuhr noch nicht weit genug ist, anhalten. - -## Zwei Sekunden fahren im Struktogramm - -::: übung vb-zwei-sekunden -titel: Zwei Sekunden -auftrag: Der mBot2 setzt die Stoppuhr auf 0 und gibt mit 50 % Gas. Solange die Stoppuhr unter 2 Sekunden ist, wartet er kurz. Danach hält er an. Mit 50 % schafft er 10 cm pro Sekunde, er muss also 20 cm weiter stehen bleiben. -welt: zeit-1 -braucht: whileSchleife -tipp: Oben stehen **Stoppuhr auf 0** und `mbot.drive(50, 50)`. Darunter eine While-Schleife mit `mbot.getTimer() < 2`. -tipp: In der Schleife steht **kurz warten**, nach der Schleife **anhalten**. -lösung: vb-zwei-sekunden-loesung.visustruct -::: - -## Der Akku - -::: mbot2 -fokus: shield -ansicht: oben -::: - -Unter dem durchsichtigen [Shield]{teil=shield} siehst du den Akku. Wie voll er ist, liefert `mbot.getBattery()` in Prozent: `100` ist ganz voll. Ist er fast leer, fahren die Motoren schwächer. Dann wird es Zeit zum Laden. - -::: angeberwissen -Auch dein Handy misst seinen Akku nicht direkt in Prozent. Es misst die Spannung: Ein voller Lithium-Akku hat etwas über 4 Volt, ein leerer gut 3. Daraus rechnet es die Prozente aus, genau wie der CyberPi. -::: - -## Jetzt in Java: Akku-Anzeige - -::: übung vb-java-akku -titel: Akku-Anzeige -code: java -auftrag: Schreibe in Java: Der mBot2 zeigt auf dem Bildschirm zum Beispiel **Akku: 80 %**. Ist der Akku unter 20 %, leuchten zusätzlich die LEDs rot. -messwerte: getBattery=80 -> none, ledOff, screen "Akku: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Akku: 15 %" -braucht: verzweigung -tipp: `mbot.showText("Akku: " + mbot.getBattery() + " %");` setzt den Text aus drei Teilen zusammen. -tipp: Danach: `if (mbot.getBattery() < 20) { mbot.setLed(255, 0, 0); }` -lösung: vb-java-akku-loesung.visustruct -::: - -::: übung vb-fehler-21-stoppuhr-akku -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Akku-Anzeige“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-21-stoppuhr-akku-start.visustruct -messwerte: getBattery=80 -> none, ledOff, screen "Akku: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Akku: 15 %" -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es `mbot.setLed(255, 0, 0)`. -lösung: vb-java-akku-loesung.visustruct -::: - -## Spiel: Stoppuhr und Akku - -::: spiel frage -titel: Spiel: Stoppuhr und Akku -intro: Lies den Code und sag vorher, was passiert. Fünf Runden. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: Wie lange fährt der mBot2? -- 0,1 Sekunden -- [x] 2 Sekunden -- bis zur Wand -> Er wartet, bis die Stoppuhr 2 Sekunden zeigt, dann hält er an. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: Mit 50 % schafft er 10 cm pro Sekunde. Wie weit fährt er? -- 10 cm -- [x] 20 cm -- 50 cm -> 2 Sekunden mal 10 cm pro Sekunde sind 20 cm. - -runde: - mbot.pause(3000); - mbot.resetTimer(); - mbot.pause(1000); - mbot.showText(mbot.getTimer()); -frage: Welche Zahl zeigt der Bildschirm ungefähr? -- 0 -- [x] 1 -- 4 -> Die Stoppuhr fängt nach `mbot.resetTimer()` wieder bei 0 an. Danach vergeht nur noch 1 Sekunde. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Akku: " + mbot.getBattery() + " %"); -frage: Der Akku hat noch 15 %. Was passiert? -- Nur der Bildschirm zeigt **Akku: 15 %**. -- Nur die LEDs leuchten rot. -- [x] Der Bildschirm zeigt **Akku: 15 %**, und die LEDs leuchten rot. -> 15 ist kleiner als 20. Die Anzeige steht unter der Verzweigung und kommt immer. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Akku: " + mbot.getBattery() + " %"); -frage: Der Akku hat 80 %. Was passiert? -- [x] Nur der Bildschirm zeigt **Akku: 80 %**. -- Nur die LEDs leuchten rot. -- Gar nichts. -> 80 ist nicht kleiner als 20, die LEDs bleiben aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Stoppuhr auf 0 setzen und ablesen. → Die Stoppuhr -- Ich kann eine bestimmte Zeit lang fahren. → Zwei Sekunden fahren im Struktogramm -- Ich kann den Akkustand anzeigen. → Jetzt in Java: Akku-Anzeige -::: - -## Wissenstest - -::: quiz -? Was liefert `mbot.getTimer()` direkt nach `mbot.resetTimer()`? -→ Die Stoppuhr -- [x] 0 -- [ ] 100 -- [ ] Die Uhrzeit -> Die Stoppuhr fängt wieder bei 0 an. -? Warum wartet der mBot2 in der Schleife nur **kurz** und hält nicht an? -→ Zwei Sekunden fahren im Struktogramm -- [ ] Weil die Schleife sonst nicht startet. -- [x] Weil er weiterfahren soll, bis die Zeit um ist. -- [ ] Weil die Stoppuhr sonst stehen bleibt. -> Gas geben gilt weiter, auch während er wartet. -::: diff --git a/web/lessons/de/visubot/21-zustaende.md b/web/lessons/de/visubot/21-zustaende.md deleted file mode 100644 index 2cfa993f..00000000 --- a/web/lessons/de/visubot/21-zustaende.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -titel: Zustände: Was mache ich gerade? -bereich: Motoren und Methoden -kurz: Mit einer Zustandsvariablen und einer Fallauswahl eine Robo-Ampel weiterschalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Zustand ist -- mit einer Fallauswahl je nach Zustand handeln und in den nächsten Zustand wechseln -- Zustände in Java mit Namen und `.equals` unterscheiden -::: - -## Was ist ein Zustand? - -Eine Ampel ist immer in genau einem **Zustand**: rot, grün oder gelb. In jedem Zustand weiß sie zwei Dinge: Was zeige ich? Und was kommt danach? - -Unsere Robo-Ampel hat drei Zustände. Jeder bekommt eine Nummer: - -| Zustand | LEDs | danach | -|---|---|---| -| 0 | rot | 1 | -| 1 | grün | 2 | -| 2 | gelb | 0 | - -Den aktuellen Zustand speicherst du in einer Variablen: `int zustand = 0`. So eine Variable heißt **Zustandsvariable**. Ein Programm, das so von Zustand zu Zustand springt, heißt **Zustandsautomat**. - -> Eine echte Ampel in Deutschland hat vier Zustände: rot, rot-gelb, grün, gelb. Unsere Robo-Ampel lässt rot-gelb weg. - -::: angeberwissen -Auch ein Saugroboter ist ein Zustandsautomat: saugen, ausweichen, zur Ladestation fahren. Ich habe nur zwei Zustände: fressen und schlafen. -::: - -## Die Robo-Ampel im Struktogramm - -Die Fallauswahl passt perfekt: Für jeden Zustand gibt es einen Fall. In jedem Fall stehen zwei Kästen: Was tue ich? Und welcher Zustand kommt als Nächstes? - -::: übung vb-ampel-zustand -titel: Robo-Ampel -auftrag: Baue ein Struktogramm: Lege `int zustand = 0` an. Eine For-Schleife läuft sechsmal. In ihr steht eine Fallauswahl über `zustand`. Fall 0: LEDs rot, `zustand = 1`. Fall 1: LEDs grün, `zustand = 2`. Sonst: LEDs gelb, `zustand = 0`. Nach der Fallauswahl wartet der mBot2 eine Sekunde. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, fallauswahl -tipp: Die Fallauswahl findest du bei den Elementen. Schreib `zustand` hinein. Die Fälle heißen 0, 1 und sonst (default). -tipp: Die Farben sind `mbot.setLed(255, 0, 0)` für rot, `mbot.setLed(0, 255, 0)` für grün und `mbot.setLed(255, 200, 0)` für gelb. Unter der Fallauswahl, noch in der Schleife, steht `mbot.pause(1000)`. -lösung: vb-ampel-zustand-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Fallauswahl“](?visustruct&lektion=10-fallauswahl). Sie öffnet sich in einem neuen Fenster. - -## Jetzt in Java: Zustände mit Namen - -Nummern sind schnell vergessen. Was war noch mal Zustand 2? Lesbarer sind Namen. Dann ist der Zustand ein Text: - -```java -String zustand = "rot"; -... -if (zustand.equals("rot")) { - mbot.setLed(255, 0, 0); - zustand = "grün"; -} else if (zustand.equals("grün")) { - ... -``` - -Texte vergleichst du in Java mit `.equals("…")`, nicht mit `==`. - -::: übung vb-java-ampel-text -titel: Ampel mit Namen -code: java -auftrag: Schreibe die Robo-Ampel in Java mit `String zustand = "rot";`. Prüfe mit `if` und `else if`, in welchem Zustand die Ampel ist: rot, dann grün, dann gelb, dann wieder rot. Die Schleife läuft sechsmal, nach jedem Durchgang 1 Sekunde Pause. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, verzweigung -tipp: In der Schleife: `if (zustand.equals("rot")) { … } else if (zustand.equals("grün")) { … } else { … }` und danach `mbot.pause(1000);`. -tipp: Im Fall rot stehen `mbot.setLed(255, 0, 0);` und `zustand = "grün";`. Grün schaltet auf `"gelb"`, gelb wieder auf `"rot"`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -::: übung vb-fehler-21-zustaende -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Ampel mit Namen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-21-zustaende-start.visustruct -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es `zustand = "grün"`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -## Zustände beim Fahren - -Mit Zuständen kann der mBot2 auch fahren. Im Zustand **fahren** fährt er vor. Sieht er eine Wand, wechselt er in den Zustand **drehen**. Dort dreht er sich einmal und wechselt zurück zu **fahren**. - -::: diagramm vb-l21z-ausweichen.visustruct -Fahren und Ausweichen mit zwei Zuständen. Öffne das Diagramm im Editor und probiere es in einer Welt aus. -::: - -## Spiel: Welcher Zustand kommt jetzt? - -::: spiel frage -titel: Spiel: Welcher Zustand kommt jetzt? -intro: Die Robo-Ampel schaltet: 0 rot → 1 grün → 2 gelb → 0 rot. Welcher Zustand kommt als Nächstes? Fünf Runden. -frage: Welcher Zustand kommt danach? -antworten: 0 | 1 | 2 - -runde: -frage: Die Ampel ist gerade in Zustand **0** (rot). -richtig: 1 -> Nach rot kommt grün. - -runde: -frage: Die Ampel ist gerade in Zustand **2** (gelb). -richtig: 0 -> Nach gelb geht es wieder von vorn los. - -runde: -frage: Die Ampel ist gerade in Zustand **1** (grün). -richtig: 2 -> Nach grün kommt gelb. - -runde: -frage: Die Ampel startet in Zustand 0 und schaltet **zweimal** weiter. -richtig: 2 -> 0 → 1 → 2. - -runde: -frage: Die Ampel startet in Zustand 0 und schaltet **dreimal** weiter. -richtig: 0 -> 0 → 1 → 2 → 0. Nach drei Schritten ist sie wieder am Anfang. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Zustand ist. → Was ist ein Zustand? -- Ich kann mit einer Fallauswahl je nach Zustand handeln und in den nächsten Zustand wechseln. → Die Robo-Ampel im Struktogramm -- Ich kann Zustände in Java mit Namen und `.equals` unterscheiden. → Jetzt in Java: Zustände mit Namen -::: - -## Wissenstest - -::: quiz -? Was speichert eine Zustandsvariable? -→ Was ist ein Zustand? -- [ ] Wie oft die Schleife gelaufen ist -- [x] Was das Programm gerade macht, zum Beispiel rot oder grün -- [ ] Den größten Messwert -? Was steht in jedem Fall der Fallauswahl? -→ Die Robo-Ampel im Struktogramm -- [x] Was zu tun ist und welcher Zustand als Nächstes kommt -- [ ] Nur eine Pause -- [ ] Eine neue Schleife -? Wie prüfst du in Java, ob `zustand` den Text `"rot"` enthält? -→ Jetzt in Java: Zustände mit Namen -- [ ] `zustand == rot` -- [x] `zustand.equals("rot")` -- [ ] `zustand = "rot"` -> Texte vergleichst du mit `.equals`. Ein einzelnes `=` würde `"rot"` zuweisen. -::: diff --git a/web/lessons/de/visubot/22-eigene-methoden.md b/web/lessons/de/visubot/22-eigene-methoden.md deleted file mode 100644 index 650a590f..00000000 --- a/web/lessons/de/visubot/22-eigene-methoden.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -titel: Eigene Methoden -bereich: Motoren und Methoden -kurz: Eigene Befehle mit Parametern und Rückgabewert schreiben und aufrufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Unterprogramm mit Parameter bauen und aufrufen -- Methoden in Java erkennen -- eine überladene Methode erkennen und aufrufen -- eine Methode mit Rückgabewert schreiben -::: - -## Ein Unterprogramm für das Quadrat - -Ein Quadrat fahren kann der mBot2 schon. Jetzt soll er zwei verschieden große Quadrate fahren. Statt die Schleife zweimal zu bauen, schreibst du ein **Unterprogramm**. In Java heißt es **Methode**. Es ist ein eigener Befehl, den du so oft aufrufen kannst, wie du willst. - -Die Kopfzeile `void quadrat(int seite)` sagt: - -- `void`: Die Methode liefert kein Ergebnis zurück, sie **tut** nur etwas. -- `quadrat`: So heißt dein neuer Befehl. -- `int seite`: Beim Aufruf gibst du eine Zahl mit, den **Parameter**. - -::: übung vb-quadrat-methode -titel: Zwei Quadrate -auftrag: Baue ein Unterprogramm `void quadrat(int seite)`, das ein Quadrat mit der Seitenlänge `seite` fährt. Das Hauptprogramm ruft es zweimal auf: erst mit 30, dann mit 50. -fahrt: 4 x (forward 30, turnRight), 4 x (forward 50, turnRight) -braucht: aufruf -tipp: Lege mit **+** einen neuen Reiter an und gib ihm den Titel `void quadrat(int seite)`. Darin steht eine For-Schleife, die viermal `mbot.forward(seite)` und `mbot.turnRight()` ausführt. -tipp: Im Hauptprogramm stehen zwei Aufruf-Kästen: `quadrat(30)` und `quadrat(50)`. -lösung: vb-quadrat-methode-loesung.visustruct -unterprogramm: vb-quadrat-unterprogramm-loesung.visustruct -::: - -## Methoden in Java - -In Java steht jede Methode in einer Klasse. Das Programm beginnt immer in der Methode `main`. Von dort wird `quadrat` aufgerufen: - -```java -public class Quadrate { - public static void main(String[] args) { - quadrat(30); - quadrat(50); - } - - static void quadrat(int seite) { - for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); - } - } -} -``` - -Im Bereich [Code](#zeige-codelive) siehst du jede Methode in ihrem eigenen Reiter, so wie im Struktogramm. - -::: quiz -? Was bedeutet `void` in `void quadrat(int seite)`? -→ Methoden in Java -- [ ] Die Methode hat keinen Parameter. -- [x] Die Methode liefert kein Ergebnis zurück. -- [ ] Die Methode darf nur einmal aufgerufen werden. -> `void` heißt „leer“: Es kommt kein Wert zurück. Der Parameter steht in den Klammern. -? Mit welchem Wert für `seite` läuft `quadrat(50)`? -→ Ein Unterprogramm für das Quadrat -- [ ] 30 -- [x] 50 -- [ ] mit keinem -> Der Wert in den Klammern des Aufrufs wird zum Parameter `seite`. -::: - -## Gleicher Name, andere Parameter: Überladung - -Du kennst `mbot.forward()` und `mbot.forward(30)`. Das sind **zwei verschiedene Methoden mit demselben Namen**. Java erkennt am Aufruf, welche gemeint ist: an der **Anzahl** und am **Typ** der Parameter. Das nennt man **Überladung** (englisch *overloading*). - -Es gibt noch eine dritte `forward`-Methode. Sie hat zwei Parameter: eine Zahl und eine **Einheit** als Text. - -```java -mbot.forward(); // 10 cm (Standardwert) -mbot.forward(30); // 30 cm -mbot.forward(30, "cm"); // 30 cm, Einheit ausdrücklich -mbot.forward(2, "Umdrehungen"); // die Räder drehen sich zweimal -``` - -Eine Radumdrehung ist so weit wie der Umfang des Rads: π · 6,5 cm ≈ 20,4 cm. Zwei Umdrehungen sind also etwa 40,8 cm. Für `mbot.backward` gibt es dieselben drei Varianten. - -So sehen die drei Kopfzeilen aus. Der Methodenname ist gleich, die Parameterlisten sind verschieden: - -```java -void forward() -void forward(int cm) -void forward(int wert, String einheit) -``` - -Überladung kennst du schon: `System.out.println` gibt es für `int`, für `double`, für `String` und noch mehr. Deshalb kannst du jeden dieser Werte einfach in die Klammern schreiben. - -::: angeberwissen -Stimmen die 20,4 cm bei **deinem** mBot2 wirklich? Profis glauben keiner Zahl, die sie nicht nachgemessen haben. Miss den Raddurchmesser und lass `mbot.forward(5, "Umdrehungen")` fahren: Soll sind 102,1 cm. So testet man Softwaresysteme: Jeder **Testfall** hat ein erwartetes Ergebnis (**Soll**) und ein gemessenes (**Ist**). Man testet mehrmals und schreibt alles in ein **Protokoll**. Hier ist dein [Messprotokoll zum Ausdrucken (PDF)](https://visubot.visucode.de/messprotokoll-radumdrehung.pdf). Gib es deiner Lehrkraft, dann sieht sie, ob alle Roboter gleich weit fahren. -::: - -::: übung vb-ueberladung-umdrehung -titel: Quadrat mit Umdrehungen -auftrag: Fahre ein Quadrat, bei dem jede Seite genau **eine Radumdrehung** lang ist. Nimm dafür die überladene Methode `mbot.forward(1, "Umdrehungen")`. -fahrt: 4 x (forward 20.42, turnRight) -braucht: forSchleife -tipp: Eine For-Schleife mit `int i = 0`, `i < 4`, `i++`. -tipp: Im Inhalt stehen `mbot.forward(1, "Umdrehungen")` und `mbot.turnRight()`. -lösung: vb-ueberladung-umdrehung-loesung.visustruct -::: - -::: übung vb-java-rechteck-umdrehungen -titel: Rechteck mit Umdrehungen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt ein Rechteck. Die langen Seiten sind **zwei** Radumdrehungen lang, die kurzen **eine**. Benutze `mbot.forward(2, "Umdrehungen")` und `mbot.forward(1, "Umdrehungen")`. -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -braucht: forSchleife -tipp: Eine For-Schleife, die zweimal läuft: `for (int i = 0; i < 2; i++) { … }`. -tipp: In der Schleife: `mbot.forward(2, "Umdrehungen");`, `mbot.turnRight();`, `mbot.forward(1, "Umdrehungen");`, `mbot.turnRight();` -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -::: quiz -? Welche Methode ruft `mbot.forward(3, "Umdrehungen")` auf? -→ Gleicher Name, andere Parameter: Überladung -- [ ] `forward()` -- [ ] `forward(int cm)` -- [x] `forward(int wert, String einheit)` -> Java wählt die Variante, deren Parameter passen: zwei Parameter, eine Zahl und ein Text. -::: - -## Methode mit Rückgabe - -Eine Methode kann auch etwas **ausrechnen** und das Ergebnis zurückgeben. Statt `void` steht dann der Datentyp des Ergebnisses in der Kopfzeile, und `return` gibt den Wert zurück: - -```java -static int zentimeter(int umdrehungen) { - return umdrehungen * 20; -} -``` - -Eine Radumdrehung sind rund 20 cm. Der Aufruf `int strecke = zentimeter(3);` legt also 60 in `strecke`. - -::: übung vb-zentimeter -titel: Umdrehungen in Zentimeter -auftrag: Baue ein Unterprogramm `int zentimeter(int umdrehungen)`, das `umdrehungen * 20` zurückgibt. Das Hauptprogramm ruft es mit 3 auf, fährt die Strecke und zeigt **Strecke: 60 cm** auf dem Bildschirm. -fahrt: forward 60 -befehle: showText "Strecke: 60 cm" -braucht: aufruf -tipp: Neuer Reiter mit dem Titel `int zentimeter(int umdrehungen)`. Darin reicht eine Anweisung: `return umdrehungen * 20`. -tipp: Im Hauptprogramm: Aufruf `int strecke = zentimeter(3)`, danach `mbot.forward(strecke)` und `mbot.showText("Strecke: " + strecke + " cm")`. -lösung: vb-zentimeter-loesung.visustruct -unterprogramm: vb-zentimeter-unterprogramm-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Aufruf und Aussprung“](?visustruct&lektion=18-aufruf-und-aussprung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-22-eigene-methoden -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Rechteck mit Umdrehungen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-22-eigene-methoden-start.visustruct -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es `mbot.forward(1, "Umdrehungen")`. -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -## Spiel: Welche Methode? - -::: spiel frage -titel: Spiel: Welche Methode? -intro: Gleicher Name, andere Parameter: Welche Methode ruft Java auf, und was kommt heraus? Sechs Runden. - -runde: - mbot.forward(30, "cm"); -frage: Welche `forward`-Methode läuft? -- `forward()` -- `forward(int cm)` -- [x] `forward(int wert, String einheit)` -> Zwei Parameter, eine Zahl und ein Text: Das passt nur zur dritten. - -runde: - mbot.forward(); -frage: Wie weit fährt der mBot2? -- [x] 10 cm -- gar nicht, die Zahl fehlt -- eine Radumdrehung -> Ohne Parameter fährt `forward` 10 cm. Das ist die Variante ohne Parameter. - -runde: - mbot.forward(2, "Umdrehungen"); -frage: Wie weit fährt der mBot2 ungefähr? -- 2 cm -- 20 cm -- [x] 41 cm -> Eine Radumdrehung sind etwa 20,4 cm, zwei also etwa 40,8 cm. - -runde: - static int zentimeter(int umdrehungen) { - return umdrehungen * 20; - } -frage: Was liefert `zentimeter(4)`? -- 4 -- 24 -- [x] 80 -> Der Parameter `umdrehungen` ist 4, und `return` gibt 4 · 20 zurück. - -runde: - public static void main(String[] args) { - quadrat(30); - quadrat(50); - } -frage: Wie viele Quadrate fährt der mBot2, und wie groß ist das zweite? -- eins mit 80 cm -- [x] zwei, das zweite mit 50 cm Seitenlänge -- zwei, beide mit 30 cm Seitenlänge -> Jeder Aufruf fährt ein Quadrat. Der Wert in den Klammern wird zu `seite`. - -runde: -frage: Welche Kopfzeile passt zu einer Methode, die eine Zahl zurückgibt? -- `void zentimeter(int umdrehungen)` -- [x] `int zentimeter(int umdrehungen)` -- `zentimeter(int umdrehungen)` -> Vor dem Namen steht der Datentyp des Ergebnisses. `void` heißt: kein Ergebnis. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - static void quadrat(int seite) { - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } - } -frage: Soll ein Quadrat mit der Seitenlänge `seite` fahren. -fehler: 3 -besser: mbot.forward(seite); -> Mit `30` ist jedes Quadrat gleich groß, egal was man übergibt. - -runde: - static void zentimeter(int umdrehungen) { - return umdrehungen * 20; - } -frage: Soll die Strecke in cm zurückgeben. -fehler: 1 -besser: static int zentimeter(int umdrehungen) { -> Wer etwas zurückgibt, braucht den Datentyp des Ergebnisses statt `void`. - -runde: - static int zentimeter(int umdrehungen) { - int cm = umdrehungen * 20; - } -frage: Soll die Strecke in cm zurückgeben. -fehler: 2 -besser: return umdrehungen * 20; -> Die Methode rechnet, gibt aber nichts zurück. Es fehlt `return`. - -runde: - mbot.forward(2, Umdrehungen); -frage: Soll zwei Radumdrehungen weit fahren. -fehler: 1 -besser: mbot.forward(2, "Umdrehungen"); -> Die Einheit ist ein Text und braucht Anführungszeichen. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 5 3 PARAMETER: Wert, den du beim Aufruf in die Klammern schreibst -- ↓ 1 3 STOPPUHR: mbot.getTimer() liest sie ab -- ↓ 5 5 RÜCKGABE: mit return liefert eine Methode ein Ergebnis zurück -- ↓ 3 8 ÜBERLADUNG: gleicher Methodenname, andere Parameter -- → 2 1 METHODE: eigener Befehl mit Namen, z. B. quadrat(30) -- → 10 5 AKKU: mbot.getBattery() sagt, wie voll er ist -- ↓ 2 1 MOTOR: jedes Rad hat einen eigenen -- ↓ 1 10 LINIENFOLGER: fährt einer schwarzen Linie nach -lösung: 5 7, 5 10, 4 1, 7 3, 3 3, 9 8, 5 8 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Unterprogramm mit Parameter bauen und aufrufen. → Ein Unterprogramm für das Quadrat -- Ich kann Methoden in Java erkennen. → Methoden in Java -- Ich kann eine überladene Methode erkennen und aufrufen. → Gleicher Name, andere Parameter: Überladung -- Ich kann eine Methode mit Rückgabewert schreiben. → Methode mit Rückgabe -::: - -## Wissenstest - -::: quiz -? Das Unterprogramm `void quadrat(int seite)` soll ein Quadrat mit 30 cm Seitenlänge fahren. Wie sieht der Aufruf aus? -→ Ein Unterprogramm für das Quadrat -- [ ] `quadrat()` -- [x] `quadrat(30)` -- [ ] `int seite = quadrat(30)` -> Der Wert in den Klammern wird zum Parameter `seite`. Weil `quadrat` nichts zurückgibt, gibt es keine Zuweisung. -? In welcher Methode beginnt ein Java-Programm? -→ Methoden in Java -- [ ] in der ersten Methode der Klasse -- [x] in der Methode `main` -- [ ] in der Methode `quadrat` -> Das Programm beginnt immer in `main`. Von dort werden die anderen Methoden aufgerufen. -? Woran unterscheidet Java die überladenen Methoden `forward()`, `forward(int cm)` und `forward(int wert, String einheit)`? -→ Gleicher Name, andere Parameter: Überladung -- [ ] am Namen -- [x] an der Anzahl und am Typ der Parameter -- [ ] an der Reihenfolge im Programm -> Der Name ist bei allen gleich. Java wählt die Variante, deren Parameter zum Aufruf passen. -? `static int zentimeter(int umdrehungen) { return umdrehungen * 20; }`: Was liegt nach `int strecke = zentimeter(2);` in `strecke`? -→ Methode mit Rückgabe -- [ ] 2 -- [ ] 20 -- [x] 40 -> `return` gibt 2 · 20 = 40 zurück, und dieser Wert landet in `strecke`. -? Was steht in der Kopfzeile einer Methode, die eine ganze Zahl zurückgibt, statt `void`? -→ Methode mit Rückgabe -- [ ] `return` -- [x] `int` -- [ ] `static` -> Statt `void` steht der Datentyp des Ergebnisses in der Kopfzeile. -::: diff --git a/web/lessons/de/visubot/23-wie-geht-es-weiter.md b/web/lessons/de/visubot/23-wie-geht-es-weiter.md deleted file mode 100644 index fbeb461b..00000000 --- a/web/lessons/de/visubot/23-wie-geht-es-weiter.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -titel: Wie geht es weiter? -bereich: Ausblick -kurz: Zurückblicken, was du mit dem mBot2 gelernt hast, und sehen, was in VisuStruct noch auf dich wartet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- sagen, welche Grundlagen der Programmierung ich mit dem mBot2 gelernt habe -- einen Fehler in einem Roboterprogramm allein finden und reparieren -- die Themen nennen, die in VisuStruct noch auf mich warten -::: - -## Das kannst du jetzt - -Glückwunsch, du hast alle Roboter-Lektionen geschafft! Mit dem mBot2 hast du die **Grundlagen der strukturierten Programmierung** gelernt: - -- ein **Struktogramm** lesen und bauen und es mit dem **Schreibtischtest** prüfen, einen Plan als **PAP** und als **Pseudocode** aufschreiben, -- **Sequenz**, **Verzweigung** und **Fallauswahl**, Bedingungen mit **und**, **oder** und **nicht**, -- die Schleifen **for**, **while** und **do-while**, auch ineinander verschachtelt, und den Aussprung mit **break**, -- **Variablen**, **Datentypen** und **Konstanten** mit `final`, Zählen, Summieren und den größten Wert finden, -- **Arrays** und **Zeichenketten**, -- eigene **Methoden** mit Parametern und Rückgabewert. - -Das alles gilt nicht nur für Roboter. Jedes Java-Programm ist aus genau diesen Bausteinen gebaut, auch ein Spiel oder eine App. - -::: angeberwissen -Määäh, weißt du, was du mit dem mBot2 eigentlich gebaut hast? Ein **eingebettetes System**: einen kleinen Computer, der in einem Gerät steckt und mit Sensoren seine Umwelt misst. Solche Systeme stecken in Waschmaschinen, Autos und Herzschrittmachern. In einem modernen Auto sind es über hundert. Und programmiert werden sie mit genau den Bausteinen, die du jetzt kennst. -::: - -## Noch einmal: Warum läuft das nicht? - -Zum Schluss eine letzte Fehlersuche. Diesmal ist es ein Fehler, den auch Profis oft machen. - -::: übung vb-fehler-23-wie-geht-es-weiter -titel: Warum läuft das nicht? -code: java -auftrag: Das Programm soll bis kurz vor die Wand fahren, aber es läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-23-wie-geht-es-weiter-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Lies die Fehlermeldung genau. Vergleiche den Sensor mit den anderen Befehlen: Was steht hinter `mbot.forward`? -tipp: Hinter einem Befehl stehen immer runde Klammern, auch wenn nichts darin steht. Richtig heißt es `mbot.getDistance() > 15`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Was noch fehlt - -Einige Themen der Programmierung haben mit dem Roboter wenig zu tun. Du findest sie in **VisuStruct**, der Welt ohne Roboter. Weil du die Grundlagen schon kennst, kommst du dort schnell voran. Die Links öffnen sich in einem neuen Fenster. - -- **Eingabe mit der Tastatur:** Werte beim Ausführen abfragen, in [„Eingabe und Ausgabe“](?visustruct&lektion=06-eingabe-und-ausgabe). -- **Tabellen im Speicher:** Arrays mit Zeilen und Spalten, zum Beispiel für einen Kinosaal, in [„Zweidimensionale Arrays“](?visustruct&lektion=16-zweidimensionale-arrays). -- **Suchen und Sortieren:** einen Wert schnell finden und eine Liste der Größe nach ordnen, in [„Suchen und Sortieren“](?visustruct&lektion=19-suchen-und-sortieren). -- **Andere Sprachen:** dasselbe Programm in Python und JavaScript, in [„Python und JavaScript“](?visustruct&lektion=21-python-und-javascript). -- **Abstürze abfangen:** was passiert, wenn jemand „abc“ statt einer Zahl eintippt, in [„Wenn das Programm abstürzt: try und catch“](?visustruct&lektion=22-try-und-catch). -- **Dateien:** Text, Tabellen und Daten lesen und speichern, ab [„Text einlesen und speichern“](?visustruct&lektion=23-text-einlesen-und-speichern) über [„Tabellen als CSV“](?visustruct&lektion=25-tabellen-als-csv) bis [„Daten als JSON“](?visustruct&lektion=26-json). -- **Fenster mit Knöpfen:** eigene Programme mit Fenster, Textfeld und Knopf, ab [„Dein erstes Fenster“](?visustruct&lektion=28-erstes-fenster) bis [„Model View Controller“](?visustruct&lektion=40-model-view-controller). - -> Den mBot2 brauchst du dafür nicht. Du kannst aber jederzeit zurückkommen und ihm neue Kunststücke beibringen. - -## Spiel: Welche Welt? - -::: spiel frage -titel: Spiel: Welche Welt? -intro: Ludwig hat Ideen für neue Programme. Lernst du das mit dem mBot2 in VisuBot oder ohne Roboter in VisuStruct? Acht Runden. -antworten: VisuBot | VisuStruct - -runde: -frage: „Fahre bis zur Wand und piepe dann.“ -richtig: VisuBot -> Abstandssensor, Motoren und Lautsprecher: Das ist ein Fall für den mBot2. - -runde: -frage: „Ein Fenster mit einem Knopf, der bis 10 zählt.“ -richtig: VisuStruct -> Fenster mit Knöpfen baust du mit Swing in VisuStruct. - -runde: -frage: „Spiele eine Melodie, die in einem Array steht.“ -richtig: VisuBot -> Arrays und Melodien hast du mit dem Lautsprecher des mBot2 gelernt. - -runde: -frage: „Lies die Noten der Klasse aus einer CSV-Datei.“ -richtig: VisuStruct -> Dateien lesen und speichern lernst du in VisuStruct. - -runde: -frage: „Tippt jemand ‚abc‘ statt einer Zahl ein, soll das Programm nicht abstürzen.“ -richtig: VisuStruct -> Abstürze fängst du mit try und catch ab. Das steht in VisuStruct. - -runde: -frage: „Folge mit dem Liniensensor einer schwarzen Linie.“ -richtig: VisuBot -> Der Liniensensor sitzt unter dem mBot2. - -runde: -frage: „Sortiere zehn Zahlen der Größe nach.“ -richtig: VisuStruct -> Suchen und Sortieren steht in VisuStruct. Den größten Wert finden kannst du aber schon. - -runde: -frage: „Speichere die Bestenliste in einer Datei.“ -richtig: VisuStruct -> Dateien schreiben lernst du in VisuStruct in „Text einlesen und speichern“. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann sagen, welche Grundlagen der Programmierung ich mit dem mBot2 gelernt habe. → Das kannst du jetzt -- Ich kann einen Fehler in einem Roboterprogramm allein finden und reparieren. → Noch einmal: Warum läuft das nicht? -- Ich kann die Themen nennen, die in VisuStruct noch auf mich warten. → Was noch fehlt -::: - -## Wissenstest - -::: quiz -? Gelten die Bausteine aus den Roboter-Lektionen auch für Programme ohne Roboter? -→ Das kannst du jetzt -- [x] Ja, jedes Java-Programm ist aus Sequenz, Verzweigung, Schleife, Variablen und Methoden gebaut -- [ ] Nein, ohne Roboter braucht man ganz andere Befehle -- [ ] Nur die Schleifen -> Nur die `mbot.`-Befehle gehören zum Roboter. Alles andere ist ganz normales Java. - -? Warum läuft `mbot.getDistance > 15` nicht? -→ Noch einmal: Warum läuft das nicht? -- [ ] Weil 15 zu klein ist -- [x] Weil hinter dem Befehl die runden Klammern fehlen -- [ ] Weil man `<` schreiben muss -> Ohne Klammern sucht Java eine Variable `getDistance` und findet keine. - -? Wo lernst du, wie ein Programm Abstürze mit try und catch abfängt? -→ Was noch fehlt -- [ ] In VisuBot -- [x] In VisuStruct -> Dort steht die Lektion „Wenn das Programm abstürzt: try und catch“. - -? Welche Themen findest du in VisuStruct? Wähle die passende Liste. -→ Was noch fehlt -- [x] Sortieren, Dateien und Fenster mit Knöpfen -- [ ] Liniensensor, LEDs und Motoren -- [ ] Nur die for-Schleife -> Liniensensor, LEDs und Motoren gehören zum mBot2, die for-Schleife kennst du schon. -::: diff --git a/web/lessons/de/visubot/aufgaben/alarmanlage.md b/web/lessons/de/visubot/aufgaben/alarmanlage.md deleted file mode 100644 index b5219824..00000000 --- a/web/lessons/de/visubot/aufgaben/alarmanlage.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Die Alarmanlage -nach: 16 -stufe: 2 ---- - -Der mBot2 bewacht dein Zimmer. Kommt jemand näher als 20 cm **oder** wird es laut (Lautstärke über 60), schlägt er Alarm: Die LEDs leuchten rot und er piept. Sonst sind die LEDs aus. Mit Taste B schaltest du die Alarmanlage ab. - -::: übung vb-alarmanlage -titel: Die Alarmanlage -auftrag: Solange Taste B nicht gedrückt ist, prüft der mBot2 immer wieder: Ist der Abstand unter 20 cm oder die Lautstärke über 60, leuchten die LEDs rot und er spielt einen Ton. Sonst gehen die LEDs aus. Danach wartet er kurz. -messwerte: getDistance=10, isButtonB=false/true -> none, tone -messwerte: getLoudness=80, isButtonB=false/true -> none, tone -messwerte: getDistance=100, getLoudness=0, isButtonB=false/true -> none, noTone, ledOff -braucht: whileSchleife, verzweigung -tipp: Außen steht eine While-Schleife mit `!mbot.isButtonB()`. Darin eine Verzweigung und danach **kurz warten**. -tipp: Die Bedingung der Verzweigung: `mbot.getDistance() < 20 || mbot.getLoudness() > 60`. Im true-Zweig `mbot.setLed(255, 0, 0)` und `mbot.playTone(880, 200)`, im false-Zweig `mbot.ledOff()`. -lösung: vb-alarmanlage-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/ausgang.md b/web/lessons/de/visubot/aufgaben/ausgang.md deleted file mode 100644 index 60a7c61d..00000000 --- a/web/lessons/de/visubot/aufgaben/ausgang.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Labyrinth mit Ausgängen -nach: 5 -stufe: 3 ---- - -Der mBot2 steht unten links und schaut nach rechts. Über ihm liegen Wandreihen. Jede hat genau eine Lücke, und jede Lücke liegt weiter rechts als die darunter. Ganz oben ist das Ziel. - -Der mBot2 fährt nach rechts und schaut in jedem Feld nach oben. Ist dort eine Lücke, fährt er hindurch in den nächsten Gang. - -::: übung vb-ausgang -titel: Labyrinth mit Ausgängen -auftrag: Programmiere den mBot2 so, dass er in beiden Welten durch alle Lücken bis zum Ziel fährt, ohne anzustoßen. Ein Feld ist 30 cm groß. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: In jedem Durchlauf dreht sich der mBot2 zuerst nach links und misst. Ist oben frei, sind es mehr als 20 cm. -tipp: Durch die Lücke sind es zwei Felder bis in den nächsten Gang. Danach soll er wieder nach rechts schauen. Ist oben eine Wand, dreht er sich zurück und fährt ein Feld weiter. -lösung: vb-ausgang-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/binaer-zaehlen.md b/web/lessons/de/visubot/aufgaben/binaer-zaehlen.md deleted file mode 100644 index 1812269a..00000000 --- a/web/lessons/de/visubot/aufgaben/binaer-zaehlen.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -titel: Binär zählen -nach: 15 -stufe: 3 ---- - -Computer rechnen mit nur zwei Ziffern: 0 und 1. Das heißt **binär**. Mit drei LEDs kannst du die Zahlen 0 bis 7 binär zeigen: LED 0 zählt 1, LED 1 zählt 2 und LED 2 zählt 4. Die Zahl 5 ist 4 + 1, also leuchten LED 2 und LED 0. - -| Zahl | LED 2 (4) | LED 1 (2) | LED 0 (1) | -|---|---|---|---| -| 0 | aus | aus | aus | -| 1 | aus | aus | an | -| 2 | aus | an | aus | -| 3 | aus | an | an | -| 5 | an | aus | an | - -::: übung vb-binaer-zaehlen -titel: Binär zählen -auftrag: Eine For-Schleife zählt `zahl` von 0 bis 7. Für jede Zahl leuchtet jede der LEDs 0, 1 und 2 grün oder ist aus, genau wie in der Tabelle. Danach wartet der mBot2 1000 Millisekunden. Schalte die LEDs immer in der Reihenfolge 0, 1, 2. -befehle: ledColor 0 "aus", ledColor 1 "aus", ledColor 2 "aus", pause 1000, ledColor 0 "grün", ledColor 1 "aus", ledColor 2 "aus", pause 1000, ledColor 0 "aus", ledColor 1 "grün", ledColor 2 "aus", pause 1000, ledColor 0 "grün", ledColor 1 "grün", ledColor 2 "aus", pause 1000, ledColor 0 "aus", ledColor 1 "aus", ledColor 2 "grün", pause 1000, ledColor 0 "grün", ledColor 1 "aus", ledColor 2 "grün", pause 1000, ledColor 0 "aus", ledColor 1 "grün", ledColor 2 "grün", pause 1000, ledColor 0 "grün", ledColor 1 "grün", ledColor 2 "grün", pause 1000 -braucht: forSchleife, verzweigung -tipp: Ob LED 0 an ist, verrät der Rest beim Teilen durch 2: `zahl % 2 == 1`. Für LED 1 teilst du erst durch 2: `zahl / 2 % 2 == 1`. Für LED 2 durch 4: `zahl / 4 % 2 == 1`. -tipp: In der Schleife stehen drei Verzweigungen und danach **kurz warten**. Im true-Zweig zum Beispiel `mbot.led(0).setColor("grün")`, im false-Zweig `mbot.led(0).setColor("aus")`. -lösung: vb-binaer-zaehlen-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/dreieck.md b/web/lessons/de/visubot/aufgaben/dreieck.md deleted file mode 100644 index d75c8c94..00000000 --- a/web/lessons/de/visubot/aufgaben/dreieck.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -titel: Das Dreieck -nach: 2 -stufe: 1 ---- - -Beim Quadrat dreht sich der mBot2 viermal um 90°. Zusammen sind das 360°, eine ganze Runde. Bei einem Dreieck dreht er sich auch einmal ganz herum, aber nur in drei Ecken. - -In die Klammer von **drehe rechts** kannst du schreiben, wie weit er sich drehen soll: `mbot.turnRight(45)` dreht nur 45°. - -::: übung vb-dreieck -titel: Das Dreieck -auftrag: Lass den mBot2 ein Dreieck mit drei gleich langen Seiten fahren. Jede Seite ist 30 cm lang. Benutze eine Schleife. -fahrt: 3 x (forward 30, turnRight 120) -braucht: forSchleife -tipp: Wie viel Grad muss eine Ecke sein, damit drei Ecken zusammen eine ganze Runde (360°) ergeben? -tipp: In der Schleife fährt der mBot2 eine Seite und dreht sich dann um 120°. -lösung: vb-dreieck-loesung.visustruct -::: - -::: angeberwissen -Die Idee, mit einem fahrenden Roboter Figuren zu zeichnen, ist über 50 Jahre alt: Ende der 1960er-Jahre entstand die Sprache **Logo**. Kinder steuerten damit eine „Schildkröte“, die mit einem Stift über das Papier fuhr. -::: diff --git a/web/lessons/de/visubot/aufgaben/einparken.md b/web/lessons/de/visubot/aufgaben/einparken.md deleted file mode 100644 index 4132bf34..00000000 --- a/web/lessons/de/visubot/aufgaben/einparken.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -titel: Rückwärts einparken -nach: 16 -stufe: 2 ---- - -Rechts von der Straße parken Autos (die Klötze). Irgendwo ist eine Lücke, und genau davor klebt eine blaue Markierung auf der Straße. Der mBot2 sucht die Lücke und parkt rückwärts ein, wie ein Auto. - -Hinten hat er keinen Sensor. Er schaut deshalb nach vorn auf die Wand gegenüber: Je weiter er rückwärts in die Lücke fährt, desto größer wird der Abstand dorthin. - -::: übung vb-einparken -titel: Rückwärts einparken -auftrag: Der mBot2 fährt in 10-cm-Schritten vor, bis er auf Blau steht. Dann dreht er sich nach links, sodass sein Heck zur Lücke zeigt. Er fährt rückwärts, solange der Abstand zur Wand vor ihm unter 45 cm ist. Zum Schluss leuchten die LEDs grün und er zeigt **Geparkt!**. Es gibt zwei Straßen mit verschiedenen Lücken. -welt: parken-1 -> ledOn, screen "Geparkt!" -welt: parken-2 -> ledOn, screen "Geparkt!" -braucht: whileSchleife -tipp: Zwei While-Schleifen hintereinander: erst `!mbot.getColor().equals("blau")` mit `mbot.forward()` darin, dann `mbot.getDistance() < 45` mit `mbot.backward()` darin. Dazwischen steht `mbot.turnLeft()`. -tipp: Am Ende: `mbot.setLed(0, 255, 0)` und `mbot.showText("Geparkt!")`. -lösung: vb-einparken-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/hindernis.md b/web/lessons/de/visubot/aufgaben/hindernis.md deleted file mode 100644 index 3942b474..00000000 --- a/web/lessons/de/visubot/aufgaben/hindernis.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -titel: Hindernis ausweichen -nach: 16 -stufe: 2 ---- - -Auf dem Weg zum roten Feld stehen Klötze im Weg. Der mBot2 fährt in 10-cm-Schritten vor. Taucht ein Klotz auf (näher als 20 cm), warnt er mit Licht und Ton und fährt außen herum: nach rechts drehen, 30 cm vor, nach links drehen. Dann geht es weiter geradeaus. - -::: übung vb-hindernis -titel: Hindernis ausweichen -auftrag: Der mBot2 fährt, solange er nicht auf Rot steht. Ist ein Klotz näher als 20 cm, leuchten die LEDs orange (`mbot.setLed(255, 128, 0)`), er piept und weicht aus. Danach gehen die LEDs aus. Sonst fährt er 10 cm vor. Es gibt zwei Welten. -welt: hindernis-1 -> tone -welt: hindernis-2 -> tone -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, darin eine Verzweigung mit `mbot.getDistance() < 20`. -tipp: Im true-Zweig: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. Im false-Zweig: `mbot.forward()`. -lösung: vb-hindernis-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/knight-rider.md b/web/lessons/de/visubot/aufgaben/knight-rider.md deleted file mode 100644 index ad95a901..00000000 --- a/web/lessons/de/visubot/aufgaben/knight-rider.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: Knight Rider -nach: 15 -stufe: 2 ---- - -In der Fernsehserie „Knight Rider“ hat das sprechende Auto KITT vorn ein rotes Licht, das immer hin und her läuft. Das baust du mit den fünf LEDs nach. - -::: übung vb-knight-rider -titel: Knight Rider -auftrag: Ein rotes Licht läuft von LED 0 bis LED 4 und wieder zurück bis LED 1. Jede LED leuchtet 100 Millisekunden und geht dann aus. Benutze zwei For-Schleifen: eine zählt hoch, eine zählt runter. -befehle: ledColor 0 "rot", pause 100, ledColor 0 "aus", ledColor 1 "rot", pause 100, ledColor 1 "aus", ledColor 2 "rot", pause 100, ledColor 2 "aus", ledColor 3 "rot", pause 100, ledColor 3 "aus", ledColor 4 "rot", pause 100, ledColor 4 "aus", ledColor 3 "rot", pause 100, ledColor 3 "aus", ledColor 2 "rot", pause 100, ledColor 2 "aus", ledColor 1 "rot", pause 100, ledColor 1 "aus" -braucht: forSchleife -tipp: Die erste Schleife zählt `i` von 0 bis 4 hoch. Die zweite startet bei 3 und zählt mit `i--` runter, solange `i > 0`. -tipp: In beiden Schleifen: `mbot.led(i).setColor("rot")`, `mbot.pause(100)`, `mbot.led(i).setColor("aus")`. -lösung: vb-knight-rider-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/labyrinth.md b/web/lessons/de/visubot/aufgaben/labyrinth.md deleted file mode 100644 index 0272a546..00000000 --- a/web/lessons/de/visubot/aufgaben/labyrinth.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -titel: Das Labyrinth -nach: 5 -stufe: 2 ---- - -Der mBot2 steht in einem Labyrinth. Das Ziel ist ein schwarzes Feld mit grüner Fahne. Die Gänge sind 30 cm breit. - -Eine einfache Regel bringt ihn hindurch: **Ist vorn frei, fahr vor. Sonst dreh dich nach rechts. Ist dort auch eine Wand, dreh dich ganz um.** - -Woran merkt der mBot2, dass er im Ziel ist? Der Liniensensor unten sieht das schwarze Feld: `mbot.getLine()` ist dann nicht mehr `0`. - -::: übung vb-labyrinth -titel: Das Labyrinth -auftrag: Programmiere den mBot2 so, dass er in beiden Labyrinthen ins Ziel findet, ohne anzustoßen. -welt: labyrinth-1, labyrinth-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit der Bedingung `mbot.getLine() == 0`. Sie läuft, bis der mBot2 auf dem Ziel steht. -tipp: In der Schleife eine Verzweigung `mbot.getDistance() > 15`: Ja → `mbot.forward()`. Nein → `mbot.turnRight()`, danach noch eine Verzweigung `mbot.getDistance() < 15` mit `mbot.turnRight(180)`. -lösung: vb-labyrinth-loesung.visustruct -::: - -::: angeberwissen -Mit der Regel „Hand immer an der Wand“ findet man aus jedem Labyrinth, dessen Wände alle zusammenhängen. Schon die Griechen erzählten von Theseus, der sich im Labyrinth des Minotaurus mit einem Wollfaden half. -::: diff --git a/web/lessons/de/visubot/aufgaben/linienfolger-stopp.md b/web/lessons/de/visubot/aufgaben/linienfolger-stopp.md deleted file mode 100644 index 22e48d87..00000000 --- a/web/lessons/de/visubot/aufgaben/linienfolger-stopp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Linienfolger mit Stopp -nach: 20 -stufe: 3 ---- - -Der mBot2 folgt einer schwarzen Linie und hält am roten Feld an ihrem Ende an. - -Dafür gibt er mit **Räder einzeln** Gas: `mbot.drive(40, 40)` lässt beide Räder gleich schnell drehen, er fährt geradeaus weiter, bis ein anderer Fahrbefehl kommt. `mbot.drive(10, 40)` macht eine Linkskurve, `mbot.drive(40, 10)` eine Rechtskurve. `mbot.stop()` hält ihn an. - -Die beiden mittleren Fühler des Liniensensors fragst du mit `mbot.isLineLeft()` und `mbot.isLineRight()` ab. Sehen beide die Linie, fährt er geradeaus. Sieht nur der linke sie, lenkt er nach links, sieht nur der rechte sie, nach rechts. - -::: übung vb-linienfolger-stopp -titel: Linienfolger mit Stopp -auftrag: Solange der mBot2 nicht auf Rot steht, folgt er der Linie. Danach hält er an. In der zweiten Welt schlängelt sich die Linie. -welt: linie-rot-1, linie-rot-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, danach **anhalten**. -tipp: In der Schleife: Sind `mbot.isLineLeft() && mbot.isLineRight()`, dann `mbot.drive(40, 40)`. Sonst, wenn `mbot.isLineLeft()`, dann `mbot.drive(10, 40)`. Sonst, wenn `mbot.isLineRight()`, dann `mbot.drive(40, 10)`. -lösung: vb-linienfolger-stopp-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/morsen.md b/web/lessons/de/visubot/aufgaben/morsen.md deleted file mode 100644 index b138ca96..00000000 --- a/web/lessons/de/visubot/aufgaben/morsen.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: Morsen -nach: 15 -stufe: 2 ---- - -Früher haben Schiffe mit Licht Nachrichten geschickt, im **Morsecode**: Jeder Buchstabe besteht aus kurzen und langen Signalen. Der bekannteste Notruf ist **SOS**: S ist dreimal kurz, O ist dreimal lang. - -::: übung vb-morsen -titel: SOS morsen -auftrag: LED 2 morst SOS in Weiß. Kurz heißt: 200 Millisekunden an, dann 200 aus. Lang heißt: 600 Millisekunden an, dann 200 aus. Zwischen den Buchstaben wartet der mBot2 zusätzlich 400 Millisekunden. Benutze für jeden Buchstaben eine Schleife. -befehle: 3 x (ledColor 2 "weiß", pause 200, ledColor 2 "aus", pause 200), pause 400, 3 x (ledColor 2 "weiß", pause 600, ledColor 2 "aus", pause 200), pause 400, 3 x (ledColor 2 "weiß", pause 200, ledColor 2 "aus", pause 200) -braucht: forSchleife -tipp: Drei For-Schleifen hintereinander, jede läuft dreimal. Dazwischen steht jeweils **kurz warten** mit 400. -tipp: In der ersten und dritten Schleife: `mbot.led(2).setColor("weiß")`, `mbot.pause(200)`, `mbot.led(2).setColor("aus")`, `mbot.pause(200)`. In der mittleren wartet er nach dem Einschalten 600. -lösung: vb-morsen-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/nachtwaechter.md b/web/lessons/de/visubot/aufgaben/nachtwaechter.md deleted file mode 100644 index 4c03cdf2..00000000 --- a/web/lessons/de/visubot/aufgaben/nachtwaechter.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -titel: Der Nachtwächter -nach: 18 -stufe: 1 ---- - -Der mBot2 ist ein Nachtwächter. Solange es dunkel ist (Helligkeit unter 20), läuft er Streife: 30 cm vor und dann umdrehen. Sobald es hell wird, ist seine Schicht vorbei: Er zeigt **Zzz** auf dem Bildschirm und schläft. - -::: übung vb-nachtwaechter -titel: Der Nachtwächter -auftrag: Solange die Helligkeit unter 20 ist, fährt der mBot2 30 cm vor und dreht sich um 180°. Danach zeigt er **Zzz** auf dem Bildschirm. -messwerte: getBrightness=5/80 -> drives, screen "Zzz" -messwerte: getBrightness=80 -> none, screen "Zzz" -braucht: whileSchleife -tipp: Eine While-Schleife mit `mbot.getBrightness() < 20`. Darin `mbot.forward(30)` und `mbot.turnRight(180)`. -tipp: Nach der Schleife steht `mbot.showText("Zzz")`. -lösung: vb-nachtwaechter-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/slalom.md b/web/lessons/de/visubot/aufgaben/slalom.md deleted file mode 100644 index b26b07ec..00000000 --- a/web/lessons/de/visubot/aufgaben/slalom.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Vor dem mBot2 stehen vier Pylonen in einer Reihe. Er fährt Slalom: am ersten Pylon oben vorbei, am zweiten unten, dann wieder oben und unten. Hinter dem letzten Pylon ist das Ziel. - -In dieser Welt ist ein Feld 30 cm groß, so breit wie der mBot2. Ein Schritt von Feld zu Feld ist also `mbot.forward(30)`. - -::: übung vb-slalom -titel: Slalom -auftrag: Fahre den Slalom bis ins Ziel, ohne einen Pylon zu berühren. Benutze eine Schleife. -welt: slalom -braucht: forSchleife -tipp: Überlege zuerst, wie der mBot2 oben um einen einzigen Pylon herumfährt: Er steht danach zwei Felder weiter in derselben Reihe und schaut wieder nach rechts. -tipp: Unten herum geht genauso, nur mit links und rechts vertauscht. „Oben herum, dann unten herum“ wiederholt sich zweimal. -lösung: vb-slalom-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/spirale.md b/web/lessons/de/visubot/aufgaben/spirale.md deleted file mode 100644 index d09c7ca4..00000000 --- a/web/lessons/de/visubot/aufgaben/spirale.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Die Spirale -nach: 2 -stufe: 2 ---- - -Der mBot2 soll eine eckige Spirale fahren: Die erste Seite ist 10 cm lang, die zweite 20 cm, die dritte 30 cm und so weiter. Nach jeder Seite dreht er sich nach rechts. - -Die Zählvariable einer For-Schleife kannst du auch in der Schleife benutzen, zum Beispiel in der Klammer von **fahre vor**. Dort darf auch eine Rechnung stehen, etwa `mbot.forward(i * 5)`. - -::: übung vb-spirale -titel: Die Spirale -auftrag: Lass den mBot2 eine Spirale mit 8 Seiten fahren: 10 cm, 20 cm, 30 cm … bis 80 cm. Nach jeder Seite dreht er sich nach rechts. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight, forward 50, turnRight, forward 60, turnRight, forward 70, turnRight, forward 80, turnRight -braucht: forSchleife -tipp: Lass die Zählvariable von 1 bis 8 laufen. Wie lang ist dann die Seite in jedem Durchlauf? -tipp: In der Klammer von **fahre vor** steht eine Rechnung mit der Zählvariable. -lösung: vb-spirale-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/treppe.md b/web/lessons/de/visubot/aufgaben/treppe.md deleted file mode 100644 index 6d48ee46..00000000 --- a/web/lessons/de/visubot/aufgaben/treppe.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: Die Treppe -nach: 2 -stufe: 1 ---- - -Der mBot2 steigt eine Treppe hinauf, von oben gesehen: Jede Stufe ist 20 cm tief und 20 cm breit. - -::: übung vb-treppe -titel: Die Treppe -auftrag: Lass den mBot2 drei Stufen fahren. Eine Stufe: 20 cm vor, nach links drehen, 20 cm vor, nach rechts drehen. Benutze eine Schleife. -fahrt: 3 x (forward 20, turnLeft, forward 20, turnRight) -braucht: forSchleife -tipp: Schreib zuerst eine Stufe auf. Dann packst du sie in eine For-Schleife, die dreimal läuft. -tipp: In der Schleife: `mbot.forward(20)`, `mbot.turnLeft()`, `mbot.forward(20)`, `mbot.turnRight()`. -lösung: vb-treppe-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/tunnel.md b/web/lessons/de/visubot/aufgaben/tunnel.md deleted file mode 100644 index 5871205d..00000000 --- a/web/lessons/de/visubot/aufgaben/tunnel.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Der Tunnelsucher -nach: 5 -stufe: 3 ---- - -Der mBot2 soll im ersten **Tunnelfeld** anhalten: Das ist ein Feld mit einer Wand links **und** einer Wand rechts. Felder mit nur einer Wand zählen nicht. In der Simulation ist das richtige Feld hellgrün, der Liniensensor sieht es aber nicht. - -Der Ultraschallsensor schaut nur nach vorn. Um nach links zu schauen, dreht sich der mBot2 nach links, misst und dreht sich wieder zurück. - -Den Messwert merkst du dir in einer **Variable**, zum Beispiel in einer Anweisung `links = mbot.getDistance()`. Am Anfang legst du sie an: `int links = 99`. - -::: übung vb-tunnel -titel: Der Tunnelsucher -auftrag: Programmiere den mBot2 so, dass er in beiden Welten im ersten Tunnelfeld anhält. Ein Feld ist 30 cm groß. -welt: tunnel-1, tunnel-2 -braucht: doUntilSchleife -tipp: In jedem Durchlauf fährt der mBot2 ein Feld vor und schaut sich dann nach links und nach rechts um. Merk dir beide Abstände in Variablen. Am Ende schaut er wieder nach vorn. -tipp: Hier passt eine Schleife, die erst fährt und danach prüft. Sie läuft weiter, solange links **oder** rechts mindestens 20 cm frei ist: `links >= 20 || rechts >= 20`. -lösung: vb-tunnel-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/aufgaben/wald.md b/web/lessons/de/visubot/aufgaben/wald.md deleted file mode 100644 index 33ae6531..00000000 --- a/web/lessons/de/visubot/aufgaben/wald.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Kleeblatt im Wald -nach: 5 -stufe: 2 ---- - -Das Ziel liegt geradeaus. Auf dem Weg stehen Bäume, aber nie zwei direkt hintereinander. Steht ein Baum vor dem mBot2, fährt er außen herum und dann weiter geradeaus. - -Ein Feld ist 30 cm groß. Steht ein Baum im nächsten Feld, misst der Ultraschallsensor weniger als 20 cm. - -::: übung vb-wald -titel: Kleeblatt im Wald -auftrag: Der mBot2 soll in beiden Welten bis zum Ziel fahren und dabei jeden Baum umfahren, ohne anzustoßen. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: Wie bei „Fahre bis zum Ziel“ läuft außen eine Schleife, bis der Liniensensor das Ziel sieht. In jedem Durchlauf gibt es zwei Möglichkeiten: Baum vorn oder frei. -tipp: Um einen Baum herum: nach links drehen, ein Feld vor, nach rechts drehen, zwei Felder vor, nach rechts drehen, ein Feld vor, nach links drehen. -lösung: vb-wald-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/bloecke/01-losfahren.md b/web/lessons/de/visubot/bloecke/01-losfahren.md deleted file mode 100644 index 652a8d37..00000000 --- a/web/lessons/de/visubot/bloecke/01-losfahren.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -titel: Losfahren -bereich: Erste Schritte -kurz: Den mBot2 mit Blöcken fahren und drehen lassen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 mit Blöcken fahren lassen -- die Zahl in einem Block ändern -- den mBot2 drehen lassen -::: - -Du baust dein Programm aus **Blöcken**, wie aus Bausteinen. Probier ruhig alles aus. Kaputt machen kannst du nichts. - -## Dein erster Block - -Links unter **Elemente** findest du die Gruppe **🚗 Fahren und Drehen**. Zieh den Block **fahre vor** nach rechts und lass ihn direkt unter **🏁 Wenn das Programm startet** los. - -Im Block steht jetzt `mbot.forward( )`. Das ist Englisch: *forward* heißt vorwärts. Ganz rechts unter **mBot2 Live** siehst du sofort, wohin dein mBot2 fährt. - -::: übung vbb-erster-block -titel: Der erste Block -auftrag: Zieh einen Block **fahre vor** unter **🏁 Wenn das Programm startet**. Klick dann auf **Simulation starten** und schau zu. -fahrt: forward -tipp: Die Blöcke liegen links unter **Elemente**, in der Gruppe **🚗 Fahren und Drehen**. -tipp: Lass den Block los, wenn er genau unter dem Block mit der Zielflagge 🏁 hängt. -lösung: vbb-erster-block-loesung.visustruct -::: - -## Weiter fahren - -Ist das weiße Feld im Block leer, fährt der mBot2 nur 10 cm. Das ist eine Kästchenbreite im Gitter. Klick auf das weiße Feld und tipp eine Zahl ein, zum Beispiel **50**. Jetzt fährt er 50 cm. - -::: übung vbb-weiter -titel: 50 cm -auftrag: Lass den mBot2 genau 50 cm vorwärts fahren. Benutze dafür nur **einen** Block. -fahrt: forward 50 -tipp: Klick in das weiße Feld im Block **fahre vor**. -tipp: Tipp **50** ein und drück Enter. Im Block steht dann `mbot.forward(50)`. -lösung: vbb-weiter-loesung.visustruct -::: - -Probier aus: Was passiert bei **200**? Und was bei **fahre zurück**? - -## Um die Ecke - -Mit **drehe rechts** dreht sich der mBot2 auf der Stelle. Ist das Feld leer, dreht er sich um 90 Grad, also eine Ecke wie bei einem Blatt Papier. Die Blöcke werden von oben nach unten ausgeführt, einer nach dem anderen. - -::: übung vbb-ecke -titel: Um die Ecke -auftrag: Der mBot2 fährt 50 cm vor, dreht sich nach rechts und fährt dann noch 30 cm. -fahrt: forward 50, turnRight 90, forward 30 -tipp: Du brauchst drei Blöcke: **fahre vor**, **drehe rechts** und noch einmal **fahre vor**. -tipp: Im ersten Block steht 50, im letzten 30. Das Feld von **drehe rechts** bleibt leer. -lösung: vbb-ecke-loesung.visustruct -::: - -Jetzt du: Tipp bei **drehe rechts** mal **180** ein. Wohin schaut der mBot2 danach? - -::: übung vbb-hin-und-zurueck -titel: Hin und zurück -auftrag: Der mBot2 fährt 50 cm vor, dreht sich um und fährt zurück zum Start. -fahrt: forward 50, turnRight 180, forward 50 -tipp: Umdrehen heißt: einmal halb herum, das sind 180 Grad. -tipp: **fahre vor** mit 50, **drehe rechts** mit 180, **fahre vor** mit 50. -lösung: vbb-hin-und-zurueck-loesung.visustruct -::: - -::: ludwig -Zwei Blöcke **drehe rechts** mit leerem Feld hintereinander gehen auch. 90 und 90 sind zusammen 180. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 2,0 -> 60 cm sind zwei Felder. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,1 -> Ein Feld nach vorn, nach rechts drehen, ein Feld weiter. - -runde: - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,2 -> Erst dreht er sich nach links, dann fährt er zwei Felder. - -runde: - mbot.forward(30); - mbot.turnRight(180); - mbot.forward(60); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Ein Feld vor, umdrehen, und dann zwei Felder zurück. Er landet unter dem Start. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann einen Block ins Programm ziehen und starten. → Dein erster Block -- Ich kann die Zahl in einem Block ändern. → Weiter fahren -- Ich kann den mBot2 um die Ecke fahren lassen. → Um die Ecke -::: diff --git a/web/lessons/de/visubot/bloecke/02-immer-wieder.md b/web/lessons/de/visubot/bloecke/02-immer-wieder.md deleted file mode 100644 index 7b15b26a..00000000 --- a/web/lessons/de/visubot/bloecke/02-immer-wieder.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -titel: Immer wieder -bereich: Erste Schritte -kurz: Ein Quadrat fahren und mit „wiederhole“ Blöcke sparen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 ein Quadrat fahren lassen -- mit dem Block „wiederhole“ Blöcke sparen -- eigene Formen ausprobieren -::: - -## Ein Quadrat - -Ein Quadrat hat vier gleich lange Seiten und vier Ecken. Für jede Seite fährt der mBot2 ein Stück vor und dreht sich dann nach rechts. - -::: übung vbb-quadrat -titel: Das Quadrat -auftrag: Lass den mBot2 ein Quadrat mit 50 cm langen Seiten fahren. Am Ende steht er wieder am Start. -fahrt: 4 x (forward 50, turnRight 90) -tipp: Eine Seite sind zwei Blöcke: **fahre vor** mit 50 und **drehe rechts**. -tipp: Diese zwei Blöcke brauchst du viermal untereinander, zusammen also acht Blöcke. -lösung: vbb-quadrat-loesung.visustruct -::: - -Acht Blöcke, und immer wieder dieselben zwei. Das geht auch kürzer! - -## Wiederhole - -In der Gruppe **Steuerung** liegt der Block **wiederhole 10 mal**. Er sieht aus wie ein Maul. Alles, was du hineinlegst, macht der mBot2 so oft, wie die Zahl sagt. So eine Wiederholung heißt beim Programmieren **Schleife**. - -::: übung vbb-quadrat-wiederhole -titel: Quadrat mit wiederhole -auftrag: Baue das Quadrat noch einmal, aber nur mit **wiederhole** und zwei Blöcken darin. -fahrt: 4 x (forward 50, turnRight 90) -braucht: forSchleife -tipp: Zieh **wiederhole 10 mal** unter 🏁. Leg **fahre vor** und **drehe rechts** in das Maul. -tipp: Klick auf die 10 und tipp **4** ein, denn ein Quadrat hat vier Seiten. -lösung: vbb-quadrat-wiederhole-loesung.visustruct -::: - -Aus acht Blöcken sind drei geworden. Starte die Simulation und schau zu, wie der mBot2 viermal dasselbe macht. - -## Neue Formen - -Jetzt bist du dran. Ändere nur die Zahlen in deinem Programm und schau, was passiert. - -::: übung vbb-dreieck -titel: Das Dreieck -auftrag: Lass den mBot2 ein Dreieck mit 50 cm langen Seiten fahren. -fahrt: 3 x (forward 50, turnRight 120) -braucht: forSchleife -tipp: Ein Dreieck hat drei Seiten. Also **wiederhole 3 mal**. -tipp: Bei drei Ecken muss er sich jedes Mal um 120 Grad drehen. Tipp **120** in **drehe rechts**. -lösung: vbb-dreieck-loesung.visustruct -::: - -Noch mehr zum Ausprobieren: - -- **wiederhole 5 mal** und **drehe rechts** mit **72** ergibt ein Fünfeck. -- **wiederhole 6 mal** mit **60** ergibt ein Sechseck. -- Was passiert mit **wiederhole 36 mal**, **fahre vor** mit 10 und **drehe rechts** mit 10? - -::: ludwig -Fällt dir etwas auf? Die Zahl beim Wiederholen mal die Zahl beim Drehen ergibt immer 360. Einmal ganz herum! -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - for (int i = 0; i < 2; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..^.. -ziel: 2,0 -> Zweimal ein Feld vor, das sind zwei Felder. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: ..... | ..... | ..^.. -ziel: 2,2 -> Das ist ein Quadrat. Am Ende steht er wieder am Start. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..... | ..^.. -ziel: 3,0 -> Erst dreimal vor, dann nach rechts drehen und noch ein Feld. Der letzte Block steht nicht mehr im Maul von wiederhole. - -runde: - for (int i = 0; i < 2; i++) { - mbot.forward(30); - mbot.turnLeft(); - } -karte: ..... | ..... | ..^.. -ziel: 1,1 -> Vor, links drehen, vor, links drehen. Er steht links neben dem Feld über dem Start. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 ein Quadrat fahren lassen. → Ein Quadrat -- Ich kann mit „wiederhole“ Blöcke sparen. → Wiederhole -- Ich kann neue Formen ausprobieren. → Neue Formen -::: diff --git a/web/lessons/de/visubot/bloecke/03-der-mbot2-misst.md b/web/lessons/de/visubot/bloecke/03-der-mbot2-misst.md deleted file mode 100644 index c4e65451..00000000 --- a/web/lessons/de/visubot/bloecke/03-der-mbot2-misst.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -titel: Der mBot2 misst -bereich: Sensoren und Entscheidungen -kurz: Den Abstand zur Wand messen und rechtzeitig anhalten. ---- - -## Das schaffst du heute - -::: kompetenzen -- den Abstand messen und auf dem Bildschirm zeigen -- fahren lassen, solange vorn frei ist -::: - -## Die Augen vorn - -Vorn am mBot2 sitzen zwei runde „Augen“. Das ist der **Ultraschallsensor**. Er schickt ein Geräusch los, das du nicht hören kannst, und wartet auf das Echo. So weiß er, wie weit die nächste Wand weg ist, in Zentimetern. - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Links unter **Elemente** findest du weiter unten die **mBot2-Sensoren**. Ein Sensor ist kein eigener Block. Er ist ein runder Baustein, den du in ein weißes Feld legst. - -::: übung vbb-abstand-zeigen -titel: Abstand anzeigen -auftrag: Der mBot2 soll den Abstand zur Wand auf seinem Bildschirm zeigen. Nimm dafür den Block **Text anzeigen** und leg den Sensor **Abstand** in sein weißes Feld. -messwerte: getDistance=35 -> screen "35" -messwerte: getDistance=12 -> screen "12" -tipp: **Text anzeigen** liegt in der Gruppe **🖥️ Bildschirm**, **Abstand** in der Gruppe **📏 Abstand**. -tipp: Zieh **Abstand** genau auf das weiße Feld mit „Hallo“. Dann steht im Block `mbot.showText(mbot.getDistance())`. -lösung: vbb-abstand-zeigen-loesung.visustruct -::: - -## Fahren, solange frei ist - -Der mBot2 soll auf eine Wand zufahren und kurz davor anhalten. Wie weit die Wand weg ist, weiß er vorher nicht. Er muss also immer wieder messen. - -Dafür gibt es die **While-Schleife**. Im Block steht oben **solange**. Sie wiederholt ihren Inhalt, solange die Frage oben drin mit **ja** beantwortet wird. So baust du die Frage „Ist mehr als 15 cm frei?“: - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **größer als** auf die Frage hinter **solange**. -3. Leg den Sensor **Abstand** in das linke Feld und tipp rechts **15** ein. -4. Leg **fahre vor** in die Schleife. - -::: übung vbb-bis-wand -titel: Bis zur Wand -auftrag: Der mBot2 fährt vor, solange mehr als 15 cm frei sind. Dein Programm muss in drei Welten klappen, die Wand steht jedes Mal woanders. Über der Simulation kannst du die Welt wechseln. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Die Frage der Schleife heißt `mbot.getDistance() > 15`. -tipp: In der Schleife liegt nur **fahre vor** mit leerem Feld. So fährt er immer 10 cm und misst dann neu. -lösung: vbb-bis-wand-loesung.visustruct -::: - -Probier aus: Was passiert, wenn du statt 15 eine **5** eintippst? Und was bei **100**? - -::: ludwig -Mit fünfmal **fahre vor** klappt es nur in einer Welt. Mit dem Sensor findet der mBot2 die Wand überall. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..#.. | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, solange mehr als 15 cm frei sind. Direkt vor der Wand bleibt er stehen. - -runde: - while (mbot.getDistance() > 40) { - mbot.forward(30); - } -karte: ..#.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> Zwei Felder vor der Wand sind schon weniger als 40 cm frei. Dort hält er an. - -runde: - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..... | ..^.# | ..... -ziel: 3,1 -> Erst dreht er sich zur Wand, dann fährt er bis kurz davor. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnLeft(); - mbot.forward(60); -karte: ..#.. | ..... | ..... | ..^.. -ziel: 0,1 -> Bis vor die Wand, dann nach links drehen und zwei Felder weiter. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den Abstand auf dem Bildschirm zeigen. → Die Augen vorn -- Ich kann den mBot2 fahren lassen, solange vorn frei ist. → Fahren, solange frei ist -::: diff --git a/web/lessons/de/visubot/bloecke/04-entscheidungen.md b/web/lessons/de/visubot/bloecke/04-entscheidungen.md deleted file mode 100644 index 0484bcd5..00000000 --- a/web/lessons/de/visubot/bloecke/04-entscheidungen.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -titel: Entscheidungen -bereich: Sensoren und Entscheidungen -kurz: Mit „wenn“ und „sonst“ entscheidet der mBot2 selbst, was er tut. ---- - -## Das schaffst du heute - -::: kompetenzen -- mit **wenn** und **sonst** eine Entscheidung bauen -- den mBot2 auf eine Wand reagieren lassen -- den mBot2 auf eine Farbe reagieren lassen -::: - -## Wenn … sonst … - -Du entscheidest jeden Tag: **Wenn** es regnet, nimmst du einen Schirm mit, **sonst** nicht. Der mBot2 kann das auch. - -Zieh eine **Verzweigung** unter 🏁. Oben steht **wenn** und dahinter eine Frage. Darunter kommt alles, was passiert, wenn die Antwort **ja** ist. Bei **sonst** steht, was bei **nein** passiert. Der mBot2 macht immer nur einen der beiden Teile. In Java heißen die beiden übrigens `if` und `else`. - -::: übung vbb-wand-vorn -titel: Wand vorn? -auftrag: Wenn die Wand näher als 20 cm ist, dreht sich der mBot2 nach rechts. Sonst fährt er vor. Dein Programm wird in zwei Welten geprüft, einmal mit Wand direkt vor ihm und einmal mit viel Platz. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Zieh **kleiner als** aus **Operatoren** auf die Frage bei **wenn**. Leg **Abstand** in das linke Feld und tipp rechts **20** ein. -tipp: Unter **wenn** liegt **drehe rechts**, unter **sonst** liegt **fahre vor**. -lösung: vbb-wand-vorn-loesung.visustruct -::: - -## Rot heißt Stopp - -Unten am mBot2 sitzt ein Farbsensor. Der Baustein **Farbe ist rot?** liefert schon ja oder nein. Du kannst ihn darum direkt auf die Frage bei **wenn** ziehen, ohne **kleiner als**. - -::: übung vbb-ampel -titel: Rote Ampel -auftrag: Steht der mBot2 auf Rot, hält er an. Sonst fährt er ein Stück vor. -messwerte: getColor=rot -> none -messwerte: getColor=grün -> forward -braucht: verzweigung -tipp: **Farbe ist rot?** liegt in der Gruppe **🎨 Farben** bei den Sensoren. -tipp: Unter **wenn** liegt **anhalten**, unter **sonst** liegt **fahre vor**. -lösung: vbb-ampel-loesung.visustruct -::: - -Probier aus: Klick im Block auf „rot“ und tipp **grün** ein. Was macht der mBot2 jetzt? - -::: ludwig -Ich entscheide auch so: Wenn Löwenzahn da ist, fresse ich. Sonst suche ich weiter. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Überleg, ob der mBot2 den wenn-Teil oder den sonst-Teil nimmt, und tipp auf das Feld, auf dem er am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } -karte: ..#.. | ..^.. | ..... -ziel: 2,1 -> Die Wand ist direkt vor ihm. Er nimmt den wenn-Teil, dreht sich nur und bleibt auf seinem Feld. - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } -karte: ..#.. | ..... | ..^.. -ziel: 2,1 -> Die Wand ist noch weit weg. Er nimmt den sonst-Teil und fährt ein Feld vor. - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } - mbot.forward(30); -karte: ..#.. | ..^.. | ..... -ziel: 3,1 -> Die Wand ist nah, also dreht er sich nach rechts. Der Block unter der Verzweigung läuft immer, also fährt er danach ein Feld nach rechts. - -runde: - if (mbot.getDistance() > 50) { - mbot.forward(60); - } else { - mbot.turnLeft(); - mbot.forward(30); - } -karte: ..#.. | ..... | ..^.. -ziel: 1,2 -> Bis zur Wand sind es weniger als 50 cm. Also nimmt er den sonst-Teil: links drehen und ein Feld fahren. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann mit wenn und sonst eine Entscheidung bauen. → Wenn … sonst … -- Ich kann den mBot2 auf eine Wand reagieren lassen. → Wenn … sonst … -- Ich kann den mBot2 auf eine Farbe reagieren lassen. → Rot heißt Stopp -::: diff --git a/web/lessons/de/visubot/bloecke/05-lichter-und-toene.md b/web/lessons/de/visubot/bloecke/05-lichter-und-toene.md deleted file mode 100644 index 1a1a142b..00000000 --- a/web/lessons/de/visubot/bloecke/05-lichter-und-toene.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -titel: Lichter und Töne -bereich: Licht und Ton -kurz: LEDs in allen Farben leuchten lassen, blinken und Töne spielen. ---- - -## Das schaffst du heute - -::: kompetenzen -- die LEDs in einer Farbe leuchten lassen -- die LEDs blinken lassen -- Töne spielen -::: - -## Licht an - -Hinten auf dem mBot2 sitzt eine Leiste mit fünf bunten **LEDs**. Das sind kleine Lampen. - -::: mbot2 -fokus: leds -ansicht: oben -::: - -Zieh aus der Gruppe **💡 Licht** den Block **LEDs an** unter 🏁. Im Block stehen drei Zahlen: wie viel **Rot**, wie viel **Grün** und wie viel **Blau** die LEDs mischen. Jede Zahl geht von **0** (gar nicht) bis **255** (ganz hell). `mbot.setLed(255, 0, 0)` ist also ganz rot. - -::: übung vbb-licht-gruen -titel: Grünes Licht -auftrag: Lass die LEDs grün leuchten. -befehle: setLed 0 255 0 -tipp: Rot und Blau brauchst du nicht, sie bekommen eine 0. -tipp: Im Block steht dann `mbot.setLed(0, 255, 0)`. -lösung: vbb-licht-gruen-loesung.visustruct -::: - -Probier aus: Welche Farbe gibt `255, 255, 0`? Und `255, 0, 255`? Findest du Orange? - -## Blinken - -Ein Blinklicht geht an, wartet, geht aus und wartet wieder. Und das immer wieder. Den Block **kurz warten** findest du in der Gruppe **⏱️ Warten und Stoppuhr**. Die Zahl darin sind **Millisekunden**: 1000 Millisekunden sind eine Sekunde, 500 also eine halbe. - -::: übung vbb-blinken -titel: Blinklicht -auftrag: Die LEDs blinken dreimal rot: eine halbe Sekunde an, eine halbe Sekunde aus. -befehle: 3 x (setLed 255 0 0, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: Du brauchst **wiederhole 3 mal** und darin vier Blöcke: **LEDs an**, **kurz warten**, **LEDs aus**, **kurz warten**. -tipp: In beiden Blöcken **kurz warten** steht **500**. -lösung: vbb-blinken-loesung.visustruct -::: - -::: ludwig -Ohne **kurz warten** geht das Licht so schnell an und aus, dass du gar nichts siehst. Der mBot2 ist viel schneller als deine Augen! -::: - -## Töne - -Mit **Ton spielen** aus der Gruppe **🔊 Ton** piept der mBot2. Die erste Zahl sagt, wie **hoch** der Ton ist: 200 ist tief, 1000 ist hoch. Die zweite Zahl sagt, wie **lange** er klingt, wieder in Millisekunden. - -::: übung vbb-sirene -titel: Sirene -auftrag: Baue eine Sirene: dreimal hintereinander ein hoher Ton mit 800 und ein tiefer mit 600, jeder 300 Millisekunden lang. -befehle: 3 x (playTone 800 300, playTone 600 300) -braucht: forSchleife -tipp: Leg zwei Blöcke **Ton spielen** in **wiederhole 3 mal**. -tipp: Im ersten steht `mbot.playTone(800, 300)`, im zweiten `mbot.playTone(600, 300)`. -lösung: vbb-sirene-loesung.visustruct -::: - -Jetzt du: Bau eine **Lichtshow**. Lass die LEDs abwechselnd in verschiedenen Farben leuchten und spiel bei jeder Farbe einen anderen Ton. Je mehr Farben, desto besser! - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Fünf Runden. - -runde: - mbot.setLed(0, 0, 255); -frage: Welche Farbe leuchtet? -- rot -- grün -- [x] blau -> Rot 0, Grün 0, Blau 255: nur Blau leuchtet. - -runde: - mbot.setLed(255, 255, 0); -frage: Welche Farbe leuchtet? -- [x] gelb -- lila -- weiß -> Rot und Grün zusammen ergeben bei Licht Gelb. - -runde: - for (int i = 0; i < 4; i++) { - mbot.playTone(440, 300); - } -frage: Wie oft piept der mBot2? -- 1-mal -- 3-mal -- [x] 4-mal -> Der Block **Ton spielen** liegt in **wiederhole 4 mal**. - -runde: - for (int i = 0; i < 2; i++) { - mbot.setLed(255, 0, 0); - mbot.pause(500); - mbot.ledOff(); - mbot.pause(500); - } -frage: Wie lange dauert das Programm? -- eine Sekunde -- [x] zwei Sekunden -- vier Sekunden -> Jede Runde dauert 500 + 500 Millisekunden, also eine Sekunde. Zwei Runden sind zwei Sekunden. - -runde: - mbot.playTone(1000, 200); - mbot.playTone(200, 200); -frage: Wie klingt das? -- erst tief, dann hoch -- [x] erst hoch, dann tief -- zweimal gleich -> 1000 ist ein hoher Ton, 200 ein tiefer. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann die LEDs in einer Farbe leuchten lassen. → Licht an -- Ich kann die LEDs blinken lassen. → Blinken -- Ich kann Töne spielen. → Töne -::: diff --git a/web/lessons/de/visubot/bloecke/06-immer-wieder-pruefen.md b/web/lessons/de/visubot/bloecke/06-immer-wieder-pruefen.md deleted file mode 100644 index e8289b47..00000000 --- a/web/lessons/de/visubot/bloecke/06-immer-wieder-pruefen.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -titel: Immer wieder prüfen -bereich: Sensoren und Entscheidungen -kurz: Auf Taste A warten, immer wieder prüfen und Hindernissen ausweichen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 auf Taste A warten lassen -- eine Schleife mit „wiederhole immer“ bauen und wieder verlassen -- den mBot2 Hindernissen ausweichen lassen -::: - -## Start mit Taste A - -Oben auf dem mBot2 sitzt die Taste **A**, das ist die [Taste mit dem Quadrat]{teil=buttons}. Der mBot2 soll erst losfahren, wenn du sie drückst. Bis dahin wartet er. - -Warten heißt: **solange** die Taste **nicht** gedrückt ist, kurz warten. So baust du das: - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **nicht** auf die Frage hinter **solange**. -3. Zieh den Sensor **Taste A gedrückt?** in den Baustein **nicht**. -4. Leg **kurz warten** in die Schleife und **fahre vor** darunter. - -::: übung vbb-start-a -titel: Start mit Taste A -auftrag: Der mBot2 wartet, bis Taste A gedrückt ist. Dann fährt er 30 cm vor. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: Im Kopf der Schleife steht **solange nicht** und dann `mbot.isButtonA()`. -tipp: In der Schleife liegt **kurz warten**, unter der Schleife **fahre vor** mit 30. -lösung: vbb-start-a-loesung.visustruct -::: - -> Beim Prüfen drückt VisuBot die Taste für dich: erst eine Weile nicht, dann schon. Fährt dein mBot2 zu früh los, fällt das auf. - -## Wiederhole immer - -Manche Programme sollen nie aufhören: Der mBot2 fährt, schaut, fährt, schaut … Dafür gibt es die **Endlosschleife**. Im Block steht **wiederhole immer**. - -Damit du ihn trotzdem anhalten kannst, baust du eine **Notbremse** ein: **Wenn** Taste A gedrückt ist, **verlasse die Schleife**. Den Block dafür findest du unter **Elemente**, er heißt **Aussprung**. Danach macht das Programm unter der Schleife weiter. - -::: übung vbb-notbremse -titel: Notbremse -auftrag: Der mBot2 fährt immer weiter vor. Wird Taste A gedrückt, verlässt er die Schleife und zeigt **Gestoppt** auf dem Bildschirm. -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -braucht: endlosschleife, aussprung -tipp: In **wiederhole immer** liegt zuerst eine Verzweigung mit **Taste A gedrückt?**. Unter **wenn** kommt der **Aussprung**, **sonst** bleibt leer. -tipp: Unter der Verzweigung, noch in der Schleife, liegt **fahre vor**. Unter der Schleife liegt **Text anzeigen** mit „Gestoppt“. -lösung: vbb-notbremse-loesung.visustruct -::: - -## Ausweichen - -Jetzt wird es spannend! Der mBot2 soll durch einen Raum fahren, ohne irgendwo anzustoßen. Baue dafür: - -- **wiederhole immer** -- darin: **wenn** der Abstand kleiner als 20 ist, **drehe rechts**, **sonst** **fahre vor** - -Starte die Simulation und schau zu, wie er sich seinen Weg sucht. Mit **Simulation beenden** hältst du ihn an. - -Probier aus: - -- Was passiert, wenn du statt **drehe rechts** mal **drehe links** nimmst? -- Was passiert bei **drehe rechts** mit **45**? -- Kannst du ihn bei jeder Drehung piepen lassen? - -::: ludwig -So einen Roboter gibt es wirklich: Viele Staubsauger-Roboter fahren genau so durch die Wohnung. Wand vorn? Drehen! Frei? Weiter! -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Vier Runden. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(50); -frage: Niemand drückt eine Taste. Was tut der mBot2? -- Er fährt 50 cm. -- [x] Er wartet und wartet. -- Er fährt immer weiter. -> Solange Taste A nicht gedrückt ist, wartet er in der Schleife. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(50); -frage: Du drückst Taste A. Was tut der mBot2? -- [x] Er fährt 50 cm und hört dann auf. -- Er fährt immer weiter. -- Er wartet weiter. -> Jetzt ist die Schleife zu Ende, und der Block darunter läuft einmal. - -runde: - while (true) { - mbot.playTone(440, 300); - } -frage: Wie oft piept der mBot2? -- einmal -- zehnmal -- [x] immer weiter, ohne Ende -> **wiederhole immer** hört nie von selbst auf. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } - mbot.setLed(255, 0, 0); -frage: Wann leuchten die LEDs rot? -- sofort -- [x] wenn jemand Taste A drückt -- nie -> Erst die Notbremse verlässt die Schleife. Dann geht es unter der Schleife weiter. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 auf Taste A warten lassen. → Start mit Taste A -- Ich kann eine Schleife mit „wiederhole immer“ bauen und wieder verlassen. → Wiederhole immer -- Ich kann den mBot2 Hindernissen ausweichen lassen. → Ausweichen -::: diff --git a/web/lessons/de/visubot/bloecke/07-der-linie-folgen.md b/web/lessons/de/visubot/bloecke/07-der-linie-folgen.md deleted file mode 100644 index 367d33ed..00000000 --- a/web/lessons/de/visubot/bloecke/07-der-linie-folgen.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -titel: Der Linie folgen -bereich: Sensoren und Entscheidungen -kurz: Mit dem Liniensensor am Rand umkehren und einer schwarzen Linie folgen. ---- - -## Das schaffst du heute - -::: kompetenzen -- mit dem Liniensensor eine schwarze Linie erkennen -- den mBot2 am Rand umkehren lassen -- den mBot2 einer Linie folgen lassen -::: - -## Augen nach unten - -Unter dem mBot2 sitzt vorn der **Liniensensor**. Er leuchtet auf den Boden und sieht, ob es dort hell oder dunkel ist. - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der Sensor **Linie** aus der Gruppe **➖ Linie** liefert **0**, wenn unter dem mBot2 alles hell ist. Sieht er etwas Schwarzes, ist die Zahl größer als 0. - -## Am Rand umkehren - -Stell dir einen Tisch vor, um den schwarzes Klebeband klebt. Der mBot2 soll vorfahren, bis er das Band sieht, und dann umkehren. So fällt er nicht herunter. - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **gleich** auf die Frage hinter **solange**. -3. Leg den Sensor **Linie** in das linke Feld und tipp rechts **0** ein. -4. Leg **fahre vor** in die Schleife und **drehe rechts** mit **180** darunter. - -::: übung vbb-rand -titel: Am Rand umkehren -auftrag: Der mBot2 fährt vor, solange er keine Linie sieht. Dann dreht er sich um. Es gibt zwei Welten, der Rand ist mal näher und mal weiter weg. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Die Frage der Schleife heißt `mbot.getLine() == 0`. -tipp: **drehe rechts** mit 180 liegt unter der Schleife, nicht darin. -lösung: vbb-rand-loesung.visustruct -::: - -## Der Linie folgen - -Jetzt kommt ein Klassiker: Der mBot2 fährt eine schwarze Linie entlang, auch durch Kurven. Dafür brauchst du zwei neue Dinge: - -- **Linie links?** aus der Gruppe **➖ Linie** sagt ja, wenn der linke Fühler Schwarz sieht. -- **Räder einzeln** aus der Gruppe **⚙️ Räder einzeln** lässt jedes Rad anders schnell drehen. Die erste Zahl ist das linke Rad, die zweite das rechte. Dreht das rechte schneller, fährt er eine Linkskurve. - -Die Idee ist ganz einfach: **Wenn** links Schwarz ist, lenkt er nach links. **Sonst** lenkt er nach rechts. So wackelt er an der Linie entlang. - -::: übung vbb-linienfolger -titel: Linienfolger -auftrag: Solange die Wand mehr als 15 cm weg ist, folgt der mBot2 der Linie. Danach hält er an. In der einen Welt biegt die Linie nach rechts ab, in der anderen nach links. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit `mbot.getDistance() > 15`. Darin eine Verzweigung mit **Linie links?**. Unter der Schleife liegt **anhalten**. -tipp: Unter **wenn** liegt **Räder einzeln** mit `10, 40`, unter **sonst** **Räder einzeln** mit `40, 10`. -lösung: vbb-linienfolger-loesung.visustruct -::: - -Probier aus: Was passiert mit `20, 60` und `60, 20`? Wird er schneller oder fliegt er aus der Kurve? - -::: ludwig -Am echten mBot2 klebst du die Linie mit schwarzem Isolierband auf einen hellen Boden. Fang langsam an, sonst schießt er in der Kurve über die Linie hinaus. -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Vier Runden. - -runde: - mbot.drive(40, 40); -frage: Wie fährt der mBot2? -- [x] geradeaus -- Linkskurve -- Rechtskurve -> Beide Räder drehen gleich schnell. - -runde: - mbot.drive(10, 40); -frage: Wie fährt der mBot2? -- geradeaus -- [x] Linkskurve -- Rechtskurve -> Das rechte Rad ist schneller, also schiebt es ihn nach links. - -runde: - if (mbot.isLineLeft()) { - mbot.drive(10, 40); - } else { - mbot.drive(40, 10); - } -frage: Nur der rechte Fühler sieht die Linie. Wie fährt er? -- Linkskurve -- [x] Rechtskurve -- Er hält an. -> Links ist kein Schwarz, also nimmt er den sonst-Teil: das linke Rad ist schneller. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Der mBot2 steht schon auf der schwarzen Linie. Was tut er? -- Er fährt erst ein Stück vor. -- [x] Er dreht sich sofort um. -- Er fährt immer weiter. -> Die Frage der Schleife ist gleich am Anfang nein, also läuft sie gar nicht. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann mit dem Liniensensor eine Linie erkennen. → Augen nach unten -- Ich kann den mBot2 am Rand umkehren lassen. → Am Rand umkehren -- Ich kann den mBot2 einer Linie folgen lassen. → Der Linie folgen -::: diff --git a/web/lessons/de/visubot/bloecke/08-parcours.md b/web/lessons/de/visubot/bloecke/08-parcours.md deleted file mode 100644 index 69130411..00000000 --- a/web/lessons/de/visubot/bloecke/08-parcours.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -titel: Parcours -bereich: Sensoren und Entscheidungen -kurz: Alles zusammen: der Linie bis Rot folgen, Klötzen ausweichen und einen eigenen Parcours bauen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 einer Linie bis zum roten Feld folgen lassen -- den mBot2 vor einem Klotz warnen und ausweichen lassen -- einen eigenen Parcours planen und Stück für Stück bauen -::: - -## Station 1: Bis zum roten Feld - -Ein Parcours besteht aus Stationen. Bei der ersten folgt der mBot2 einer schwarzen Linie. Am Ende der Linie liegt ein rotes Feld, dort soll er anhalten. - -Du kennst schon alles dafür. Den Linienfolger hast du in der letzten Lektion gebaut. Neu ist nur die Frage hinter **solange**: Er fährt, solange er **nicht** auf Rot steht. - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh **nicht** aus **Operatoren** auf die Frage und leg **Farbe ist rot?** hinein. -3. Leg in die Schleife eine **Verzweigung** mit **Linie links?**. -4. Unter **wenn** kommt **Räder einzeln** mit `10, 40`, unter **sonst** mit `40, 10`. -5. Unter die Schleife legst du **anhalten**. - -::: übung vbb-linie-bis-rot -titel: Bis zum roten Feld -auftrag: Der mBot2 folgt der Linie, solange er nicht auf Rot steht. Dann hält er an. In der zweiten Welt schlängelt sich die Linie. -welt: linie-rot-1, linie-rot-2 -braucht: whileSchleife, verzweigung -tipp: Die Frage der Schleife heißt `!mbot.getColor().equals("rot")`. Im Block steht dort **nicht Farbe ist rot?**. -tipp: In der Schleife liegt dieselbe Verzweigung wie beim Linienfolger aus Lektion 7. -lösung: vbb-linie-bis-rot-loesung.visustruct -::: - -## Station 2: Achtung, Klotz! - -Bei der zweiten Station stehen Klötze im Weg. Der mBot2 fährt in kleinen Schritten vor. Ist ein Klotz näher als 20 cm, warnt er mit oranger Lampe und Piepton und fährt außen herum. Danach geht die Lampe aus. - -Außen herum heißt: **drehe rechts**, **fahre vor** mit 30, **drehe links**. Dann steht er neben dem Klotz und schaut wieder nach vorn. - -::: übung vbb-klotz -titel: Achtung, Klotz! -auftrag: Solange der mBot2 nicht auf Rot steht: Ist ein Klotz näher als 20 cm, leuchtet er orange, piept und weicht aus. Sonst fährt er ein Stück vor. Es gibt zwei Welten, in der zweiten stehen zwei Klötze. -welt: hindernis-1 -> tone -welt: hindernis-2 -> tone -braucht: whileSchleife, verzweigung -tipp: Außen dieselbe Schleife wie bei Station 1. Darin eine Verzweigung mit **Abstand** **kleiner als** 20. Unter **sonst** liegt **fahre vor**. -tipp: Unter **wenn**: **LEDs an** mit `255, 128, 0`, **Ton spielen** mit `880, 200`, **drehe rechts**, **fahre vor** mit 30, **drehe links**, **LEDs aus**. -lösung: vbb-klotz-loesung.visustruct -::: - -## Dein eigener Parcours - -Jetzt bist du dran! Bau mit Klebeband und Kartons einen Parcours auf dem Boden. Plane erst, dann programmier Station für Station: - -- **Start:** Der mBot2 wartet, bis du Taste A drückst. -- **Linie:** Er folgt einer schwarzen Linie bis zu einem roten Blatt Papier. -- **Klotz:** Danach weicht er einem Karton aus. -- **Ziel:** Am Ende blinkt er grün und spielt eine Melodie. - -Probier jede Station erst allein aus. Klappt sie, hängst du die nächste unten an. So findest du Fehler viel schneller. - -::: ludwig -Profis machen das genauso: Sie testen jedes kleine Stück, bevor sie alles zusammenstecken. Bei Robotik-Wettbewerben gewinnt oft nicht der schnellste Roboter, sondern der, der zuverlässig ins Ziel kommt. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Drei Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: #.... | ..... | ^...# -ziel: 4,1 -> Er fährt bis vor die Wand, dreht sich nach rechts und fährt wieder, bis der Rand kommt. - -runde: - for (int i = 0; i < 3; i++) { - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } - } -karte: ..#.. | ..... | ..^.. -ziel: 3,1 -> Erst ist frei, er fährt ein Feld. Dann ist die Wand direkt vor ihm, er dreht sich. Beim dritten Mal ist wieder frei, er fährt nach rechts. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnLeft(); - mbot.forward(30); - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..... | ..#.. | ..... | ..^.. -ziel: 1,0 -> Er fährt bis vor den Klotz, weicht nach links aus und fährt dann geradeaus weiter bis zum Rand. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 einer Linie bis zum roten Feld folgen lassen. → Station 1: Bis zum roten Feld -- Ich kann den mBot2 vor einem Klotz warnen und ausweichen lassen. → Station 2: Achtung, Klotz! -- Ich kann einen eigenen Parcours Station für Station bauen. → Dein eigener Parcours -::: diff --git a/web/lessons/de/visubot/bloecke/aufgaben/block-ausgang.md b/web/lessons/de/visubot/bloecke/aufgaben/block-ausgang.md deleted file mode 100644 index 30bfa68d..00000000 --- a/web/lessons/de/visubot/bloecke/aufgaben/block-ausgang.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Ausgang finden -nach: 8 -stufe: 3 ---- - -Der mBot2 steht unten links und schaut nach rechts. Über ihm liegen Wände. Jede Wand hat genau eine Lücke, und jede Lücke liegt weiter rechts als die darunter. Ganz oben ist das schwarze Ziel. - -Der mBot2 fährt nach rechts und schaut in jedem Feld nach oben. Ist dort eine Lücke, fährt er hindurch in den nächsten Gang. - -::: übung vbb-ausgang -titel: Ausgang finden -auftrag: Der mBot2 fährt in beiden Welten durch alle Lücken bis zum Ziel, ohne anzustoßen. Ein Feld ist 30 cm groß. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit **Linie** **gleich** 0. Darin dreht sich der mBot2 zuerst nach links und schaut: Ist oben frei, misst er mehr als 20 cm. -tipp: **Wenn** frei: 60 vor (durch die Lücke in den nächsten Gang), dann rechts drehen. **Sonst**: rechts drehen und 30 vor. -lösung: vbb-ausgang-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/bloecke/aufgaben/block-disco.md b/web/lessons/de/visubot/bloecke/aufgaben/block-disco.md deleted file mode 100644 index 63142e47..00000000 --- a/web/lessons/de/visubot/bloecke/aufgaben/block-disco.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Disco -nach: 5 -stufe: 1 ---- - -Der mBot2 macht Party! Seine LEDs wechseln die Farbe: rot, grün, blau, immer wieder. - -::: übung vbb-disco -titel: Disco -auftrag: Die LEDs leuchten nacheinander rot, grün und blau, jede Farbe eine halbe Sekunde lang. Das Ganze dreimal. Danach gehen die LEDs aus. -befehle: 3 x (setLed 255 0 0, pause 500, setLed 0 255 0, pause 500, setLed 0 0 255, pause 500), ledOff -braucht: forSchleife -tipp: In **wiederhole 3 mal** liegen drei Blöcke **LEDs an**, nach jedem ein **kurz warten** mit 500. -tipp: Rot ist `255, 0, 0`, grün `0, 255, 0`, blau `0, 0, 255`. **LEDs aus** liegt unter der Schleife. -lösung: vbb-disco-loesung.visustruct -::: - -Probier aus: Mach eine eigene Farbe, zum Beispiel lila mit `255, 0, 255`. diff --git a/web/lessons/de/visubot/bloecke/aufgaben/block-slalom.md b/web/lessons/de/visubot/bloecke/aufgaben/block-slalom.md deleted file mode 100644 index 65d8c2d7..00000000 --- a/web/lessons/de/visubot/bloecke/aufgaben/block-slalom.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Vor dem mBot2 stehen vier Pylonen in einer Reihe. Er fährt Slalom: am ersten Pylon oben vorbei, am zweiten unten, dann wieder oben und unten. Hinter dem letzten Pylon ist das Ziel. - -Ein Feld ist 30 cm groß, so breit wie der mBot2. Ein Schritt von Feld zu Feld ist also **fahre vor** mit 30. - -::: übung vbb-slalom -titel: Slalom -auftrag: Fahre den Slalom bis ins Ziel, ohne einen Pylon zu berühren. Benutze **wiederhole**. -welt: slalom -braucht: forSchleife -tipp: Fahr erst nur oben um den ersten Pylon herum: links drehen, ein Feld vor, rechts drehen, zwei Felder vor, rechts drehen, ein Feld vor, links drehen. -tipp: Unten herum geht genauso, nur mit links und rechts vertauscht. „Oben herum, dann unten herum“ kommt in **wiederhole 2 mal**. -lösung: vbb-slalom-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/bloecke/aufgaben/block-wald.md b/web/lessons/de/visubot/bloecke/aufgaben/block-wald.md deleted file mode 100644 index abb44459..00000000 --- a/web/lessons/de/visubot/bloecke/aufgaben/block-wald.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Kleeblatt im Wald -nach: 7 -stufe: 3 ---- - -Ganz hinten im Wald liegt ein Kleeblatt auf einem schwarzen Feld. Auf dem Weg dorthin stehen Bäume, aber nie zwei direkt hintereinander. Steht ein Baum vor dem mBot2, fährt er außen herum und dann weiter geradeaus. - -Ein Feld ist 30 cm groß. Steht ein Baum im nächsten Feld, misst der Abstandssensor weniger als 20 cm. - -::: übung vbb-wald -titel: Kleeblatt im Wald -auftrag: Der mBot2 fährt in beiden Welten bis zum schwarzen Feld und umfährt dabei jeden Baum, ohne anzustoßen. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit **Linie** **gleich** 0, so wie beim Rand in Lektion 7. Darin eine Verzweigung: **wenn** **Abstand** **kleiner als** 20, **sonst** **fahre vor** mit 30. -tipp: Um einen Baum herum: links drehen, 30 vor, rechts drehen, 60 vor, rechts drehen, 30 vor, links drehen. -lösung: vbb-wald-loesung.visustruct -::: diff --git a/web/lessons/de/visubot/nachschlagen.md b/web/lessons/de/visubot/nachschlagen.md deleted file mode 100644 index ee264907..00000000 --- a/web/lessons/de/visubot/nachschlagen.md +++ /dev/null @@ -1,168 +0,0 @@ -## 🤖 mBot2-Befehle - -Ein Befehl sagt dem mBot2, was er **tun** soll. Jeder Befehl beginnt mit `mbot.` und endet mit Klammern. In die Klammern schreibst du oft eine Zahl. - -### 🚗 Fahren und Drehen {.bot-fahren} - -Der mBot2 fährt geradeaus oder dreht sich auf der Stelle. - -``` -mbot.forward() fährt 10 cm nach vorn -mbot.forward(30) fährt 30 cm nach vorn -mbot.forward(2, "Umdrehungen") die Räder drehen sich 2-mal (≈ 41 cm) -mbot.backward(1, "Umdrehungen") eine Radumdrehung zurück (≈ 20 cm) -mbot.backward(20) fährt 20 cm zurück -mbot.turnRight() dreht sich nach rechts (90°) -mbot.turnLeft() dreht sich nach links (90°) -mbot.turnLeft(45) dreht sich nur ein bisschen nach links (45°) -mbot.turnRight(180) dreht sich ganz um -``` - -> `forward` und `backward` sind **überladen**: gleicher Name, verschiedene Parameter. Als Einheit gehen `"cm"` und `"Umdrehungen"`. Eine Radumdrehung sind etwa 20,4 cm. - -> Ohne Zahl fährt er 10 cm oder dreht sich 90°. 90° ist ein rechter Winkel, wie die Ecke von einem Blatt Papier. - -> Für ein Vieleck dreht er sich insgesamt einmal ganz herum: Dreieck 3 × 120°, Quadrat 4 × 90°, Sechseck 6 × 60°. - -### ⚙️ Räder einzeln {.bot-fahren} - -Hier gibst du jedem Rad selbst Gas. Die Zahlen sind Prozent: 100 ist volles Gas, 0 ist Stillstand, eine Zahl mit Minus fährt rückwärts. Der mBot2 fährt so lange weiter, bis ein anderer Fahrbefehl kommt. - -``` -mbot.drive(40, 40) beide Räder gleich: geradeaus -mbot.drive(10, 40) links langsamer: Kurve nach links -mbot.drive(40, -40) ein Rad vor, eins zurück: dreht sich -mbot.stop() hält an -``` - -### 💡 Licht {.bot-licht} - -Der mBot2 hat fünf LEDs mit den Nummern 0 bis 4. - -``` -mbot.setLed(255, 0, 0) alle LEDs leuchten rot -mbot.ledOff() alle LEDs aus -mbot.led(0).setColor("grün") nur LED 0 leuchtet grün -mbot.led(0).setColor("aus") nur LED 0 aus -``` - -Bei `setLed` mischst du Rot, Grün und Blau, jedes von 0 (aus) bis 255 (ganz hell). - -### 🔊 Ton {.bot-ton} - -``` -mbot.playTone(440, 300) spielt einen Ton -``` - -Die erste Zahl ist die Tonhöhe. Je größer, desto höher. Die zweite Zahl ist die Länge in Millisekunden (1000 Millisekunden sind 1 Sekunde). - -### 🖥️ Bildschirm {.bot-anzeige} - -``` -mbot.showText("Hallo") zeigt Hallo auf dem Bildschirm -``` - -Mit `+` hängst du Text und Zahlen aneinander: `mbot.showText("Abstand: " + mbot.getDistance())`. - -### 😊 Gefühle {.bot-anzeige} - -Der mBot2 zeigt ein Gefühl mit Licht, Ton und Wackeln. Das siehst du nur am echten mBot2. - -``` -mbot.emotion("smile") lacht -mbot.emotion("sad") ist traurig -mbot.emotion("wow") staunt -``` - -Weitere Gefühle: hello, yeah, proud, yummy, naughty, uh_oh, hurt, angry, startle, shiver, dizzy, sleepy, zzz, wake_up, blink, yes, no, look_up, look_down, look_left, look_right, look_around - -### ⏱️ Warten und Stoppuhr {.bot-warten} - -``` -mbot.pause(1000) wartet 1 Sekunde -mbot.resetTimer() stellt die Stoppuhr auf 0 -``` - -Die Zeit der Stoppuhr liest du mit dem Sensor `mbot.getTimer()` (unten bei **Stoppuhr und Akku**). - -## 📡 mBot2-Sensoren - -Ein Sensor **misst** etwas und gibt dir einen Wert zurück. Den Wert benutzt du in einer Bedingung, zum Beispiel in einer Schleife oder Verzweigung. Manche Sensoren liefern eine **Zahl**, manche **wahr oder falsch**, einer einen **Text**. - -### 📏 Abstand {.bot-sensor} - -Der Ultraschallsensor vorn misst, wie weit die nächste Wand weg ist, in Zentimetern. - -``` -mbot.getDistance() Abstand in cm, z. B. 25 -mbot.getDistance() > 15 ist vorn mehr als 15 cm frei? -int abstand = mbot.getDistance() Abstand in einer Variablen merken -``` - -### ➖ Linie {.bot-sensor} - -Unter dem mBot2 sitzen vier Fühler. Sie sehen, ob der Boden schwarz ist. - -``` -mbot.getLine() Zahl: 0 heißt, kein Fühler sieht Schwarz -mbot.getLine() == 0 kein Schwarz, weiterfahren -mbot.getLine() != 0 ein Fühler sieht Schwarz -mbot.isLineLeft() sieht der linke mittlere Fühler Schwarz? -mbot.isLineRight() sieht der rechte mittlere Fühler Schwarz? -``` - -### 🎨 Farben {.bot-sensor} - -Derselbe Sensor unten erkennt auch Farben. `mbot.getColor()` gibt dir den Namen der Farbe als Text: `"rot"`, `"grün"`, `"blau"`, `"gelb"`, `"weiß"` oder `"schwarz"`. - -``` -mbot.getColor().equals("rot") steht er auf Rot? -!mbot.getColor().equals("rot") steht er nicht auf Rot? -``` - -> Texte vergleichst du mit `.equals(…)`, nicht mit `==`. Das `!` davor heißt **nicht**. - -### 🕹️ Tasten und Joystick {.bot-sensor} - -Auf dem CyberPi gibt es die Tasten A und B und einen kleinen Joystick. Jeder Sensor sagt **wahr**, solange gedrückt wird. - -``` -mbot.isButtonA() wird Taste A gedrückt? -mbot.isButtonB() wird Taste B gedrückt? -mbot.isJoystickUp() Joystick nach oben gedrückt? -mbot.isJoystickDown() Joystick nach unten gedrückt? -mbot.isJoystickLeft() Joystick nach links gedrückt? -mbot.isJoystickRight() Joystick nach rechts gedrückt? -``` - -### 🔆 Licht und Lautstärke {.bot-sensor} - -``` -mbot.getBrightness() wie hell? 0 ist dunkel, 100 ist hell -mbot.getLoudness() wie laut? 0 ist still, 100 ist laut -``` - -### 📐 Neigung und Schütteln {.bot-sensor} - -``` -mbot.getPitch() nach vorn oder hinten gekippt? (in Grad) -mbot.getRoll() zur Seite gekippt? (in Grad) -mbot.isShaken() wird er geschüttelt? -``` - -> Liegt der mBot2 flach, sind beide Neigungen 0. In der Simulation stellst du diese Werte unter **🎛 Sensoren ausprobieren** ein. - -### 🔋 Stoppuhr und Akku {.bot-sensor} - -``` -mbot.getTimer() Sekunden seit dem Start oder seit resetTimer() -mbot.getBattery() wie voll ist der Akku? (in Prozent) -``` - -### Echter mBot2 - -Mit **🔌 mBot2** neben „Simulation starten“ verbindest du den echten Roboter mit dem USB-Kabel. Das geht nur in Chrome oder Edge. Dann fährt er jeden Schritt der Simulation mit, und die Sensoren messen echte Werte. Ein zweiter Klick trennt ihn wieder. - -### Ohne Kabel fahren - -Mit **⬆ Übertragen** speicherst du dein Programm fest auf dem mBot2. Danach Kabel ab, mBot2 an den Start und **Taste A** drücken: Er fährt dein Programm allein. Es bleibt gespeichert, bis du ein neues überträgst. Eingaben mit der Tastatur gehen am mBot2 nicht. diff --git a/web/lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct b/web/lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct deleted file mode 100644 index 9d9471d9..00000000 --- a/web/lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;34; - - - 112;114;117;101;102;101;65;108;116;101;114;40;41; - - - 111;117;116;112;117;116;58;32;34;65;117;102;32;87;105;101;100;101;114;115;101;104;101;110;34; - - diff --git a/web/lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct b/web/lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct deleted file mode 100644 index e55b871e..00000000 --- a/web/lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;118;111;108;108;106;228;104;114;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;100;101;114;106;228;104;114;105;103;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-ballwurf-loesung.visustruct b/web/lessons/diagramme/aufgabe-ballwurf-loesung.visustruct deleted file mode 100644 index 56a88d26..00000000 --- a/web/lessons/diagramme/aufgabe-ballwurf-loesung.visustruct +++ /dev/null @@ -1,81 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 100;111;117;98;108;101;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;98;101;115;116;101;87;101;105;116;101;32;61;32;48; - - - 83;116;114;105;110;103;32;98;101;115;116;101;114;78;97;109;101;32;61;32;34;34; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;119;101;105;116;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 97;110;122;97;104;108;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;119;101;105;116;101; - - - 119;101;105;116;101;32;62;32;98;101;115;116;101;87;101;105;116;101; - - - 98;101;115;116;101;87;101;105;116;101;32;61;32;119;101;105;116;101; - - - 98;101;115;116;101;114;78;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;115;99;104;110;105;116;116;32;61;32;115;117;109;109;101;32;47;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;84;101;105;108;110;101;104;109;101;114;58;32;34;32;43;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;83;99;104;110;105;116;116;58;32;34;32;43;32;115;99;104;110;105;116;116;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;105;101;103;101;114;46;116;120;116;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;83;105;101;103;101;114;58;32;34;32;43;32;98;101;115;116;101;114;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;101;87;101;105;116;101;32;43;32;34;32;109;41;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/aufgabe-ballwurf-start.visustruct b/web/lessons/diagramme/aufgabe-ballwurf-start.visustruct deleted file mode 100644 index 3b6a805c..00000000 --- a/web/lessons/diagramme/aufgabe-ballwurf-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/aufgabe-bestenliste-loesung.visustruct b/web/lessons/diagramme/aufgabe-bestenliste-loesung.visustruct deleted file mode 100644 index 37326674..00000000 --- a/web/lessons/diagramme/aufgabe-bestenliste-loesung.visustruct +++ /dev/null @@ -1,65 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;80;117;110;107;116;101;63;34; - - - 112;117;110;107;116;101;91;105;93;32;61;32;122;97;104;108; - - - - - 105;110;116;32;100;117;114;99;104;103;97;110;103;32;61;32;49; - 100;117;114;99;104;103;97;110;103;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 100;117;114;99;104;103;97;110;103;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104;32;45;32;100;117;114;99;104;103;97;110;103; - 105;43;43; - - - 112;117;110;107;116;101;91;105;93;32;60;32;112;117;110;107;116;101;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;112;117;110;107;116;101;91;105;93; - - - 112;117;110;107;116;101;91;105;93;32;61;32;112;117;110;107;116;101;91;105;32;43;32;49;93; - - - 112;117;110;107;116;101;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;112;108;97;116;122;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;112;108;97;116;122;32;43;32;34;46;32;34;32;43;32;112;117;110;107;116;101;91;105;93; - - - - diff --git a/web/lessons/diagramme/aufgabe-binaer-loesung.visustruct b/web/lessons/diagramme/aufgabe-binaer-loesung.visustruct deleted file mode 100644 index 02784eef..00000000 --- a/web/lessons/diagramme/aufgabe-binaer-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;71;97;110;122;101;32;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;32;98;105;110;97;101;114;32;61;32;34;34; - - - 122;97;104;108;32;62;32;48; - - - 105;110;116;32;114;101;115;116;32;61;32;122;97;104;108;32;37;32;50; - - - 98;105;110;97;101;114;32;61;32;114;101;115;116;32;43;32;98;105;110;97;101;114; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;101;114; - - diff --git a/web/lessons/diagramme/aufgabe-caesar-array-loesung.visustruct b/web/lessons/diagramme/aufgabe-caesar-array-loesung.visustruct deleted file mode 100644 index 7917ec47..00000000 --- a/web/lessons/diagramme/aufgabe-caesar-array-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;101;108;99;104;101;115;32;87;111;114;116;32;40;110;117;114;32;71;114;111;223;98;117;99;104;115;116;97;98;101;110;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;103;101;104;101;105;109;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;112;104;97;98;101;116;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;112;104;97;98;101;116;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 103;101;104;101;105;109;32;61;32;103;101;104;101;105;109;32;43;32;97;108;112;104;97;98;101;116;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;103;101;104;101;105;109; - - diff --git a/web/lessons/diagramme/aufgabe-caesar-array-start.visustruct b/web/lessons/diagramme/aufgabe-caesar-array-start.visustruct deleted file mode 100644 index 4de2d6ca..00000000 --- a/web/lessons/diagramme/aufgabe-caesar-array-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - diff --git a/web/lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct b/web/lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct deleted file mode 100644 index 62bfacda..00000000 --- a/web/lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;101;108;99;104;101;115;32;87;111;114;116;32;40;110;117;114;32;71;114;111;223;98;117;99;104;115;116;97;98;101;110;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;103;101;104;101;105;109;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 103;101;104;101;105;109;32;61;32;103;101;104;101;105;109;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;103;101;104;101;105;109; - - diff --git a/web/lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct b/web/lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct deleted file mode 100644 index 4233ee2c..00000000 --- a/web/lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;103;101;104;101;105;109;32;34;87;101;108;99;104;101;114;32;71;101;104;101;105;109;116;101;120;116;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;107;108;97;114;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;103;101;104;101;105;109;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;103;101;104;101;105;109;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 107;108;97;114;116;101;120;116;32;61;32;107;108;97;114;116;101;120;116;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;107;108;97;114;116;101;120;116; - - diff --git a/web/lessons/diagramme/aufgabe-collatz-loesung.visustruct b/web/lessons/diagramme/aufgabe-collatz-loesung.visustruct deleted file mode 100644 index ba7fd99d..00000000 --- a/web/lessons/diagramme/aufgabe-collatz-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 122;97;104;108;32;33;61;32;49; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 115;99;104;114;105;116;116;101;43;43; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101; - - diff --git a/web/lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct b/web/lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct deleted file mode 100644 index f11069f1..00000000 --- a/web/lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;78;111;116;101;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;97;110;122;97;104;108; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;32;101;105;110;103;101;98;101;110;34; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;110;111;116;101; - - - - - 100;111;117;98;108;101;32;115;99;104;110;105;116;116;32;61;32;115;117;109;109;101;32;42;32;49;46;48;32;47;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;115;99;104;110;105;116;116; - - diff --git a/web/lessons/diagramme/aufgabe-fibonacci-loesung.visustruct b/web/lessons/diagramme/aufgabe-fibonacci-loesung.visustruct deleted file mode 100644 index 9dcb78e7..00000000 --- a/web/lessons/diagramme/aufgabe-fibonacci-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;90;97;104;108;101;110;63;34; - - - 105;110;116;32;122;97;104;108;49;32;61;32;49; - - - 105;110;116;32;122;97;104;108;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;97;110;122;97;104;108; - 105;43;43; - - - 105;110;116;32;122;97;104;108;51;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108;51; - - - 122;97;104;108;49;32;61;32;122;97;104;108;50; - - - 122;97;104;108;50;32;61;32;122;97;104;108;51; - - - - diff --git a/web/lessons/diagramme/aufgabe-gerade-loesung.visustruct b/web/lessons/diagramme/aufgabe-gerade-loesung.visustruct deleted file mode 100644 index c42d90f3..00000000 --- a/web/lessons/diagramme/aufgabe-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;105;115;116;32;103;101;114;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;105;115;116;32;117;110;103;101;114;97;100;101;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct b/web/lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct deleted file mode 100644 index 6295e6a9..00000000 --- a/web/lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;77;87;83;84;32;61;32;48;46;49;57; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;110;101;116;116;111;112;114;101;105;115;32;34;78;101;116;116;111;112;114;101;105;115;63;34; - - - 100;111;117;98;108;101;32;115;116;101;117;101;114;32;61;32;110;101;116;116;111;112;114;101;105;115;32;42;32;77;87;83;84; - - - 100;111;117;98;108;101;32;98;114;117;116;116;111;112;114;101;105;115;32;61;32;110;101;116;116;111;112;114;101;105;115;32;43;32;115;116;101;117;101;114; - - - 111;117;116;112;117;116;58;32;115;116;101;117;101;114; - - - 111;117;116;112;117;116;58;32;98;114;117;116;116;111;112;114;101;105;115; - - diff --git a/web/lessons/diagramme/aufgabe-pin-java-loesung.visustruct b/web/lessons/diagramme/aufgabe-pin-java-loesung.visustruct deleted file mode 100644 index 894de023..00000000 --- a/web/lessons/diagramme/aufgabe-pin-java-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;118;101;114;115;117;99;104;101;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;105;110;103;97;98;101;32;34;80;73;78;32;101;105;110;103;101;98;101;110;34; - - - 112;105;110;32;61;32;101;105;110;103;97;98;101; - - - 118;101;114;115;117;99;104;101;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;114;105;99;104;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;75;97;114;116;101;32;103;101;115;112;101;114;114;116;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-pin-loesung.visustruct b/web/lessons/diagramme/aufgabe-pin-loesung.visustruct deleted file mode 100644 index 638ecac4..00000000 --- a/web/lessons/diagramme/aufgabe-pin-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;118;101;114;115;117;99;104;101;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;80;73;78;32;101;105;110;103;101;98;101;110;34; - - - 118;101;114;115;117;99;104;101;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;114;105;99;104;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;75;97;114;116;101;32;103;101;115;112;101;114;114;116;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-rechner-loesung.visustruct b/web/lessons/diagramme/aufgabe-rechner-loesung.visustruct deleted file mode 100644 index 08edeb78..00000000 --- a/web/lessons/diagramme/aufgabe-rechner-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;49;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;50;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;122;101;105;99;104;101;110;32;34;82;101;99;104;101;110;122;101;105;99;104;101;110;32;40;43;44;32;45;32;111;100;101;114;32;42;41;34; - - - 122;101;105;99;104;101;110; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;45;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;42;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 111;117;116;112;117;116;58;32;34;85;110;98;101;107;97;110;110;116;101;115;32;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-schiffe-loesung.visustruct b/web/lessons/diagramme/aufgabe-schiffe-loesung.visustruct deleted file mode 100644 index deb1fd61..00000000 --- a/web/lessons/diagramme/aufgabe-schiffe-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;101;101;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;115;112;97;108;116;101;110;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;109;101;101;114;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 105;110;116;32;115;112;97;108;116;101;32;61;32;48; - 115;112;97;108;116;101;32;60;32;109;101;101;114;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 115;112;97;108;116;101;43;43; - - - 109;101;101;114;91;114;101;105;104;101;93;91;115;112;97;108;116;101;93; - - - 111;117;116;112;117;116;58;32;115;112;97;108;116;101;110;91;115;112;97;108;116;101;93;32;43;32;40;114;101;105;104;101;32;43;32;49;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/aufgabe-schiffe-start.visustruct b/web/lessons/diagramme/aufgabe-schiffe-start.visustruct deleted file mode 100644 index db6d3c2d..00000000 --- a/web/lessons/diagramme/aufgabe-schiffe-start.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;101;101;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;115;112;97;108;116;101;110;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - diff --git a/web/lessons/diagramme/aufgabe-speisekarte-loesung.visustruct b/web/lessons/diagramme/aufgabe-speisekarte-loesung.visustruct deleted file mode 100644 index 87a4310f..00000000 --- a/web/lessons/diagramme/aufgabe-speisekarte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;109;101;114;32;34;87;101;108;99;104;101;115;32;71;101;114;105;99;104;116;63;32;40;49;44;32;50;32;111;100;101;114;32;51;41;34; - - - 110;117;109;109;101;114; - - - 111;117;116;112;117;116;58;32;34;71;114;105;101;99;104;105;115;99;104;101;114;32;83;97;108;97;116;34; - - - - - 111;117;116;112;117;116;58;32;34;82;101;105;115;45;66;111;119;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;97;102;101;108;45;87;114;97;112;34; - - - - - 111;117;116;112;117;116;58;32;34;66;105;116;116;101;32;101;105;110;101;32;103;252;108;116;105;103;101;32;78;117;109;109;101;114;32;119;228;104;108;101;110;34; - - - - diff --git a/web/lessons/diagramme/aufgabe-summe-loesung.visustruct b/web/lessons/diagramme/aufgabe-summe-loesung.visustruct deleted file mode 100644 index 9a6eb376..00000000 --- a/web/lessons/diagramme/aufgabe-summe-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;49;32;61;32;52; - - - 105;110;116;32;122;97;104;108;50;32;61;32;51; - - - 105;110;116;32;115;117;109;109;101;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct b/web/lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct deleted file mode 100644 index ef844b15..00000000 --- a/web/lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;110;91;105;93;32;34;78;97;109;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;109;101;114;32;34;76;111;115;110;117;109;109;101;114;32;40;49;32;98;105;115;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;84;97;102;101;108;100;105;101;110;115;116;58;32;34;32;43;32;110;97;109;101;110;91;110;117;109;109;101;114;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct b/web/lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct deleted file mode 100644 index be4e5a84..00000000 --- a/web/lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;86;101;114;100;111;112;112;101;108;116;101;32;90;97;104;108;58;32;34;32;43;32;122;97;104;108; - - diff --git a/web/lessons/diagramme/aufgabe-verleih-java-loesung.visustruct b/web/lessons/diagramme/aufgabe-verleih-java-loesung.visustruct deleted file mode 100644 index 65852aa0..00000000 --- a/web/lessons/diagramme/aufgabe-verleih-java-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;61;32;69;45;66;105;107;101;44;32;50;32;61;32;69;45;83;99;111;111;116;101;114;44;32;48;32;61;32;69;110;100;101;34; - - - 119;97;104;108;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;84;115;99;104;252;115;115;34; - - - -1; - - - - - 119;97;104;108;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;69;45;66;105;107;101;32;103;101;98;117;99;104;116;34; - - - - - 119;97;104;108;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;69;45;83;99;111;111;116;101;114;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;85;110;103;252;108;116;105;103;101;32;65;117;115;119;97;104;108;34; - - - - - - - - - - diff --git a/web/lessons/diagramme/aufgabe-verleih-loesung.visustruct b/web/lessons/diagramme/aufgabe-verleih-loesung.visustruct deleted file mode 100644 index 2af6fe0b..00000000 --- a/web/lessons/diagramme/aufgabe-verleih-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;61;32;69;45;66;105;107;101;44;32;50;32;61;32;69;45;83;99;111;111;116;101;114;44;32;48;32;61;32;69;110;100;101;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;34;84;115;99;104;252;115;115;34; - - - 77;101;110;252;32;118;101;114;108;97;115;115;101;110; - - - - - 111;117;116;112;117;116;58;32;34;69;45;66;105;107;101;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;69;45;83;99;111;111;116;101;114;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;85;110;103;252;108;116;105;103;101;32;65;117;115;119;97;104;108;34; - - - - - - diff --git a/web/lessons/diagramme/aufgabe-vokabeln-loesung.visustruct b/web/lessons/diagramme/aufgabe-vokabeln-loesung.visustruct deleted file mode 100644 index fa79ca01..00000000 --- a/web/lessons/diagramme/aufgabe-vokabeln-loesung.visustruct +++ /dev/null @@ -1,60 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;114;105;99;104;116;105;103;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;87;97;115;32;104;101;105;223;116;32;34;32;43;32;116;101;105;108;101;91;48;93;32;43;32;34;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;110;116;119;111;114;116; - - - 97;110;122;97;104;108;43;43; - - - 97;110;116;119;111;114;116;46;101;113;117;97;108;115;40;116;101;105;108;101;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;82;105;99;104;116;105;103;33;34; - - - 114;105;99;104;116;105;103;43;43; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;115;99;104;44;32;114;105;99;104;116;105;103;32;105;115;116;32;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;46;34; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;114;105;99;104;116;105;103;32;43;32;34;32;118;111;110;32;34;32;43;32;97;110;122;97;104;108;32;43;32;34;32;114;105;99;104;116;105;103;34; - - diff --git a/web/lessons/diagramme/aufgabe-vokabeln-start.visustruct b/web/lessons/diagramme/aufgabe-vokabeln-start.visustruct deleted file mode 100644 index 8b730fcc..00000000 --- a/web/lessons/diagramme/aufgabe-vokabeln-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct b/web/lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct deleted file mode 100644 index 8a0aed43..00000000 --- a/web/lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;118;111;108;108;106;228;104;114;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;100;101;114;106;228;104;114;105;103;34; - - - - diff --git a/web/lessons/diagramme/dt-buffered.visustruct b/web/lessons/diagramme/dt-buffered.visustruct deleted file mode 100644 index d5e5a97c..00000000 --- a/web/lessons/diagramme/dt-buffered.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/dt-csv.visustruct b/web/lessons/diagramme/dt-csv.visustruct deleted file mode 100644 index 8516e71d..00000000 --- a/web/lessons/diagramme/dt-csv.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - 105;110;116;32;109;97;116;104;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;104;97;116;32;105;110;32;77;97;116;104;101;32;101;105;110;101;32;34;32;43;32;109;97;116;104;101; - - diff --git a/web/lessons/diagramme/dt-json.visustruct b/web/lessons/diagramme/dt-json.visustruct deleted file mode 100644 index 857bd493..00000000 --- a/web/lessons/diagramme/dt-json.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;97;114;116;92;34;58;32;92;34;90;105;101;103;101;92;34;44;32;92;34;97;108;116;101;114;92;34;58;32;54;125;44;34; - - - 105;110;116;32;115;116;97;114;116;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;101;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;122;101;105;108;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;101;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101; - - diff --git a/web/lessons/diagramme/dt-lesen.visustruct b/web/lessons/diagramme/dt-lesen.visustruct deleted file mode 100644 index d4c59b35..00000000 --- a/web/lessons/diagramme/dt-lesen.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct deleted file mode 100644 index 31e46f70..00000000 --- a/web/lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;34; - - - 99;104;101;99;107;65;103;101;40;41; - - - 111;117;116;112;117;116;58;32;34;71;111;111;100;98;121;101;34; - - diff --git a/web/lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct deleted file mode 100644 index 7c2f1f90..00000000 --- a/web/lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;97;100;117;108;116;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;111;114;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct deleted file mode 100644 index c81a418e..00000000 --- a/web/lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct +++ /dev/null @@ -1,81 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 100;111;117;98;108;101;32;115;117;109;32;61;32;48; - - - 105;110;116;32;98;101;115;116;68;105;115;116;97;110;99;101;32;61;32;48; - - - 83;116;114;105;110;103;32;98;101;115;116;78;97;109;101;32;61;32;34;34; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 99;111;117;110;116;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;100;105;115;116;97;110;99;101; - - - 100;105;115;116;97;110;99;101;32;62;32;98;101;115;116;68;105;115;116;97;110;99;101; - - - 98;101;115;116;68;105;115;116;97;110;99;101;32;61;32;100;105;115;116;97;110;99;101; - - - 98;101;115;116;78;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;99;105;112;97;110;116;115;58;32;34;32;43;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;119;105;110;110;101;114;46;116;120;116;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;87;105;110;110;101;114;58;32;34;32;43;32;98;101;115;116;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;68;105;115;116;97;110;99;101;32;43;32;34;32;109;41;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/aufgabe-ballwurf-start.visustruct b/web/lessons/diagramme/en/aufgabe-ballwurf-start.visustruct deleted file mode 100644 index 77de888b..00000000 --- a/web/lessons/diagramme/en/aufgabe-ballwurf-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct deleted file mode 100644 index cdf49686..00000000 --- a/web/lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct +++ /dev/null @@ -1,65 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;80;111;105;110;116;115;63;34; - - - 112;111;105;110;116;115;91;105;93;32;61;32;110;117;109;98;101;114; - - - - - 105;110;116;32;114;117;110;32;61;32;49; - 114;117;110;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 114;117;110;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104;32;45;32;114;117;110; - 105;43;43; - - - 112;111;105;110;116;115;91;105;93;32;60;32;112;111;105;110;116;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;112;111;105;110;116;115;91;105;93; - - - 112;111;105;110;116;115;91;105;93;32;61;32;112;111;105;110;116;115;91;105;32;43;32;49;93; - - - 112;111;105;110;116;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;112;108;97;99;101;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;112;108;97;99;101;32;43;32;34;46;32;34;32;43;32;112;111;105;110;116;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-binaer-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-binaer-loesung.visustruct deleted file mode 100644 index 42958038..00000000 --- a/web/lessons/diagramme/en/aufgabe-binaer-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;119;104;111;108;101;32;110;117;109;98;101;114;34; - - - 83;116;114;105;110;103;32;98;105;110;97;114;121;32;61;32;34;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;110;117;109;98;101;114;32;37;32;50; - - - 98;105;110;97;114;121;32;61;32;114;101;109;97;105;110;100;101;114;32;43;32;98;105;110;97;114;121; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;114;121; - - diff --git a/web/lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct deleted file mode 100644 index 94eae79f..00000000 --- a/web/lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;87;104;105;99;104;32;119;111;114;100;32;40;99;97;112;105;116;97;108;32;108;101;116;116;101;114;115;32;111;110;108;121;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;99;114;101;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;112;104;97;98;101;116;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;112;104;97;98;101;116;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 115;101;99;114;101;116;32;61;32;115;101;99;114;101;116;32;43;32;97;108;112;104;97;98;101;116;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;115;101;99;114;101;116; - - diff --git a/web/lessons/diagramme/en/aufgabe-caesar-array-start.visustruct b/web/lessons/diagramme/en/aufgabe-caesar-array-start.visustruct deleted file mode 100644 index 4de2d6ca..00000000 --- a/web/lessons/diagramme/en/aufgabe-caesar-array-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - diff --git a/web/lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct deleted file mode 100644 index 636d4cea..00000000 --- a/web/lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;87;104;105;99;104;32;119;111;114;100;32;40;99;97;112;105;116;97;108;32;108;101;116;116;101;114;115;32;111;110;108;121;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;99;114;101;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 115;101;99;114;101;116;32;61;32;115;101;99;114;101;116;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;115;101;99;114;101;116; - - diff --git a/web/lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct deleted file mode 100644 index a351d25c..00000000 --- a/web/lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;99;114;101;116;32;34;87;104;105;99;104;32;115;101;99;114;101;116;32;116;101;120;116;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;112;108;97;105;110;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;99;114;101;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;115;101;99;114;101;116;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 112;108;97;105;110;32;61;32;112;108;97;105;110;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;112;108;97;105;110; - - diff --git a/web/lessons/diagramme/en/aufgabe-collatz-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-collatz-loesung.visustruct deleted file mode 100644 index 2979ede0..00000000 --- a/web/lessons/diagramme/en/aufgabe-collatz-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;115;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 110;117;109;98;101;114;32;33;61;32;49; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 115;116;101;112;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115; - - diff --git a/web/lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct deleted file mode 100644 index b0eed491..00000000 --- a/web/lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;103;114;97;100;101;115;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;111;117;110;116; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;69;110;116;101;114;32;97;32;103;114;97;100;101;34; - - - 115;117;109;32;61;32;115;117;109;32;43;32;103;114;97;100;101; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;42;32;49;46;48;32;47;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;97;118;101;114;97;103;101; - - diff --git a/web/lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct deleted file mode 100644 index b17fca56..00000000 --- a/web/lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;110;117;109;98;101;114;115;63;34; - - - 105;110;116;32;110;117;109;98;101;114;49;32;61;32;49; - - - 105;110;116;32;110;117;109;98;101;114;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;99;111;117;110;116; - 105;43;43; - - - 105;110;116;32;110;117;109;98;101;114;51;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;51; - - - 110;117;109;98;101;114;49;32;61;32;110;117;109;98;101;114;50; - - - 110;117;109;98;101;114;50;32;61;32;110;117;109;98;101;114;51; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-gerade-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-gerade-loesung.visustruct deleted file mode 100644 index 63aaa2ca..00000000 --- a/web/lessons/diagramme/en/aufgabe-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;105;115;32;101;118;101;110;34; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;105;115;32;111;100;100;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct deleted file mode 100644 index 9c302d7d..00000000 --- a/web/lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;86;65;84;32;61;32;48;46;49;57; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;110;101;116;80;114;105;99;101;32;34;78;101;116;32;112;114;105;99;101;63;34; - - - 100;111;117;98;108;101;32;116;97;120;32;61;32;110;101;116;80;114;105;99;101;32;42;32;86;65;84; - - - 100;111;117;98;108;101;32;103;114;111;115;115;80;114;105;99;101;32;61;32;110;101;116;80;114;105;99;101;32;43;32;116;97;120; - - - 111;117;116;112;117;116;58;32;116;97;120; - - - 111;117;116;112;117;116;58;32;103;114;111;115;115;80;114;105;99;101; - - diff --git a/web/lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct deleted file mode 100644 index dc2d28f7..00000000 --- a/web/lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;97;116;116;101;109;112;116;115;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;97;116;116;101;109;112;116;115;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;110;116;101;114;101;100;32;34;69;110;116;101;114;32;80;73;78;34; - - - 112;105;110;32;61;32;101;110;116;101;114;101;100; - - - 97;116;116;101;109;112;116;115;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;99;116;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;100;32;98;108;111;99;107;101;100;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-pin-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-pin-loesung.visustruct deleted file mode 100644 index 05ef36ec..00000000 --- a/web/lessons/diagramme/en/aufgabe-pin-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;97;116;116;101;109;112;116;115;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;97;116;116;101;109;112;116;115;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;69;110;116;101;114;32;80;73;78;34; - - - 97;116;116;101;109;112;116;115;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;99;116;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;100;32;98;108;111;99;107;101;100;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-rechner-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-rechner-loesung.visustruct deleted file mode 100644 index c6f6dec5..00000000 --- a/web/lessons/diagramme/en/aufgabe-rechner-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;49;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;50;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;116;111;114;32;34;79;112;101;114;97;116;111;114;32;40;43;44;32;45;32;111;114;32;42;41;34; - - - 111;112;101;114;97;116;111;114; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;45;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;42;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 111;117;116;112;117;116;58;32;34;85;110;107;110;111;119;110;32;111;112;101;114;97;116;111;114;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct deleted file mode 100644 index a1a40b7f..00000000 --- a/web/lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 115;101;97;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 115;101;97;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;109;110;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 105;110;116;32;99;111;108;117;109;110;32;61;32;48; - 99;111;108;117;109;110;32;60;32;115;101;97;91;114;111;119;93;46;108;101;110;103;116;104; - 99;111;108;117;109;110;43;43; - - - 115;101;97;91;114;111;119;93;91;99;111;108;117;109;110;93; - - - 111;117;116;112;117;116;58;32;99;111;108;117;109;110;115;91;99;111;108;117;109;110;93;32;43;32;40;114;111;119;32;43;32;49;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/en/aufgabe-schiffe-start.visustruct b/web/lessons/diagramme/en/aufgabe-schiffe-start.visustruct deleted file mode 100644 index d7fedb33..00000000 --- a/web/lessons/diagramme/en/aufgabe-schiffe-start.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 115;101;97;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 115;101;97;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;109;110;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - diff --git a/web/lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct deleted file mode 100644 index cb639931..00000000 --- a/web/lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;112;105;99;107;32;34;87;104;105;99;104;32;100;105;115;104;63;32;40;49;44;32;50;32;111;114;32;51;41;34; - - - 112;105;99;107; - - - 111;117;116;112;117;116;58;32;34;71;114;101;101;107;32;115;97;108;97;100;34; - - - - - 111;117;116;112;117;116;58;32;34;82;105;99;101;32;98;111;119;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;97;102;101;108;32;119;114;97;112;34; - - - - - 111;117;116;112;117;116;58;32;34;80;108;101;97;115;101;32;99;104;111;111;115;101;32;97;32;118;97;108;105;100;32;110;117;109;98;101;114;34; - - - - diff --git a/web/lessons/diagramme/en/aufgabe-summe-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-summe-loesung.visustruct deleted file mode 100644 index 6096ca91..00000000 --- a/web/lessons/diagramme/en/aufgabe-summe-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;49;32;61;32;52; - - - 105;110;116;32;110;117;109;98;101;114;50;32;61;32;51; - - - 105;110;116;32;115;117;109;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct deleted file mode 100644 index 396c9c11..00000000 --- a/web/lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;97;109;101;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;112;105;99;107;32;34;68;114;97;119;32;110;117;109;98;101;114;32;40;49;32;116;111;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;66;111;97;114;100;32;100;117;116;121;58;32;34;32;43;32;110;97;109;101;115;91;112;105;99;107;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct deleted file mode 100644 index c07822b9..00000000 --- a/web/lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;68;111;117;98;108;101;100;32;110;117;109;98;101;114;58;32;34;32;43;32;110;117;109;98;101;114; - - diff --git a/web/lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct deleted file mode 100644 index 01fc108c..00000000 --- a/web/lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;61;32;101;45;98;105;107;101;44;32;50;32;61;32;101;45;115;99;111;111;116;101;114;44;32;48;32;61;32;113;117;105;116;34; - - - 99;104;111;105;99;101;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;66;121;101;34; - - - -1; - - - - - 99;104;111;105;99;101;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;69;45;98;105;107;101;32;98;111;111;107;101;100;34; - - - - - 99;104;111;105;99;101;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;69;45;115;99;111;111;116;101;114;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;73;110;118;97;108;105;100;32;99;104;111;105;99;101;34; - - - - - - - - - - diff --git a/web/lessons/diagramme/en/aufgabe-verleih-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-verleih-loesung.visustruct deleted file mode 100644 index fd944af2..00000000 --- a/web/lessons/diagramme/en/aufgabe-verleih-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;61;32;101;45;98;105;107;101;44;32;50;32;61;32;101;45;115;99;111;111;116;101;114;44;32;48;32;61;32;113;117;105;116;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;34;66;121;101;34; - - - 76;101;97;118;101;32;116;104;101;32;109;101;110;117; - - - - - 111;117;116;112;117;116;58;32;34;69;45;98;105;107;101;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;69;45;115;99;111;111;116;101;114;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;73;110;118;97;108;105;100;32;99;104;111;105;99;101;34; - - - - - - diff --git a/web/lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct deleted file mode 100644 index 6bd86b9d..00000000 --- a/web/lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct +++ /dev/null @@ -1,60 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;114;105;103;104;116;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;87;104;97;116;32;105;115;32;34;32;43;32;112;97;114;116;115;91;48;93;32;43;32;34;32;105;110;32;71;101;114;109;97;110;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;110;115;119;101;114; - - - 99;111;117;110;116;43;43; - - - 97;110;115;119;101;114;46;101;113;117;97;108;115;40;112;97;114;116;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;33;34; - - - 114;105;103;104;116;43;43; - - - - - 111;117;116;112;117;116;58;32;34;87;114;111;110;103;44;32;105;116;32;105;115;32;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;46;34; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;114;105;103;104;116;32;43;32;34;32;111;102;32;34;32;43;32;99;111;117;110;116;32;43;32;34;32;114;105;103;104;116;34; - - diff --git a/web/lessons/diagramme/en/aufgabe-vokabeln-start.visustruct b/web/lessons/diagramme/en/aufgabe-vokabeln-start.visustruct deleted file mode 100644 index e39c9c06..00000000 --- a/web/lessons/diagramme/en/aufgabe-vokabeln-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct b/web/lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct deleted file mode 100644 index 7456f320..00000000 --- a/web/lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;97;100;117;108;116;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;111;114;34; - - - - diff --git a/web/lessons/diagramme/en/dt-buffered.visustruct b/web/lessons/diagramme/en/dt-buffered.visustruct deleted file mode 100644 index f429b106..00000000 --- a/web/lessons/diagramme/en/dt-buffered.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/dt-csv.visustruct b/web/lessons/diagramme/en/dt-csv.visustruct deleted file mode 100644 index 7307e33a..00000000 --- a/web/lessons/diagramme/en/dt-csv.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - 105;110;116;32;109;97;116;104;115;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;103;111;116;32;97;32;34;32;43;32;109;97;116;104;115;32;43;32;34;32;105;110;32;109;97;116;104;115;34; - - diff --git a/web/lessons/diagramme/en/dt-json.visustruct b/web/lessons/diagramme/en/dt-json.visustruct deleted file mode 100644 index 9ce6fa1f..00000000 --- a/web/lessons/diagramme/en/dt-json.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;115;112;101;99;105;101;115;92;34;58;32;92;34;103;111;97;116;92;34;44;32;92;34;97;103;101;92;34;58;32;54;125;44;34; - - - 105;110;116;32;115;116;97;114;116;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;108;105;110;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101; - - diff --git a/web/lessons/diagramme/en/dt-lesen.visustruct b/web/lessons/diagramme/en/dt-lesen.visustruct deleted file mode 100644 index 77040d10..00000000 --- a/web/lessons/diagramme/en/dt-lesen.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/kino-einmaleins-loesung.visustruct b/web/lessons/diagramme/en/kino-einmaleins-loesung.visustruct deleted file mode 100644 index 5a4b5479..00000000 --- a/web/lessons/diagramme/en/kino-einmaleins-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;116;97;98;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;108;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;108;101;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;32;40;49;32;116;111;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;32;40;49;32;116;111;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/en/kino-frei-loesung.visustruct b/web/lessons/diagramme/en/kino-frei-loesung.visustruct deleted file mode 100644 index fb714da3..00000000 --- a/web/lessons/diagramme/en/kino-frei-loesung.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;114;101;101;32;61;32;48; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 105;110;116;32;115;101;97;116;32;61;32;48; - 115;101;97;116;32;60;32;115;101;97;116;115;91;114;111;119;93;46;108;101;110;103;116;104; - 115;101;97;116;43;43; - - - 33;115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 102;114;101;101;32;61;32;102;114;101;101;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;58;32;34;32;43;32;102;114;101;101; - - diff --git a/web/lessons/diagramme/en/kino-frei-start.visustruct b/web/lessons/diagramme/en/kino-frei-start.visustruct deleted file mode 100644 index 8cb1dbd7..00000000 --- a/web/lessons/diagramme/en/kino-frei-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - diff --git a/web/lessons/diagramme/en/kino-karte-loesung.visustruct b/web/lessons/diagramme/en/kino-karte-loesung.visustruct deleted file mode 100644 index c233b2fa..00000000 --- a/web/lessons/diagramme/en/kino-karte-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;82;111;119;34; - - - 105;110;112;117;116;58;32;105;110;116;32;115;101;97;116;32;34;83;101;97;116;34; - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 111;117;116;112;117;116;58;32;34;65;108;114;101;97;100;121;32;115;111;108;100;34; - - - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;83;111;108;100;58;32;114;111;119;32;34;32;43;32;114;111;119;32;43;32;34;44;32;115;101;97;116;32;34;32;43;32;115;101;97;116; - - - - diff --git a/web/lessons/diagramme/en/kino-karte-start.visustruct b/web/lessons/diagramme/en/kino-karte-start.visustruct deleted file mode 100644 index ca7633b6..00000000 --- a/web/lessons/diagramme/en/kino-karte-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;82;111;119;34; - - - 105;110;112;117;116;58;32;105;110;116;32;115;101;97;116;32;34;83;101;97;116;34; - - diff --git a/web/lessons/diagramme/en/kino-saalplan.visustruct b/web/lessons/diagramme/en/kino-saalplan.visustruct deleted file mode 100644 index 04b08949..00000000 --- a/web/lessons/diagramme/en/kino-saalplan.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;34; - - - 105;110;116;32;115;101;97;116;32;61;32;48; - 115;101;97;116;32;60;32;115;101;97;116;115;91;114;111;119;93;46;108;101;110;103;116;104; - 115;101;97;116;43;43; - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;88;34; - - - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - diff --git a/web/lessons/diagramme/en/kino-verkaufen.visustruct b/web/lessons/diagramme/en/kino-verkaufen.visustruct deleted file mode 100644 index db41d7e6..00000000 --- a/web/lessons/diagramme/en/kino-verkaufen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;82;111;119;115;58;32;34;32;43;32;115;101;97;116;115;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;83;101;97;116;115;32;112;101;114;32;114;111;119;58;32;34;32;43;32;115;101;97;116;115;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;82;111;119;32;49;44;32;115;101;97;116;32;50;32;115;111;108;100;63;32;34;32;43;32;115;101;97;116;115;91;49;93;91;50;93; - - diff --git a/web/lessons/diagramme/en/l04-gross-klein-loesung.visustruct b/web/lessons/diagramme/en/l04-gross-klein-loesung.visustruct deleted file mode 100644 index 30fa15a4..00000000 --- a/web/lessons/diagramme/en/l04-gross-klein-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 105;110;116;32;78;117;109;98;101;114;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;78;117;109;98;101;114; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;58;32;34;32;43;32;114;101;115;117;108;116; - - diff --git a/web/lessons/diagramme/en/l04-gross-klein-start.visustruct b/web/lessons/diagramme/en/l04-gross-klein-start.visustruct deleted file mode 100644 index 8dca0580..00000000 --- a/web/lessons/diagramme/en/l04-gross-klein-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 105;110;116;32;78;117;109;98;101;114;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;78;85;77;66;69;82; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;58;32;34;32;43;32;114;101;115;117;108;116; - - diff --git a/web/lessons/diagramme/en/l04-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l04-java-fehler-loesung.visustruct deleted file mode 100644 index aec94c4f..00000000 --- a/web/lessons/diagramme/en/l04-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/en/l04-java-fehler-start.visustruct b/web/lessons/diagramme/en/l04-java-fehler-start.visustruct deleted file mode 100644 index f85f7d6a..00000000 --- a/web/lessons/diagramme/en/l04-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/en/l04-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l04-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 7c5a77ad..00000000 --- a/web/lessons/diagramme/en/l04-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - diff --git a/web/lessons/diagramme/en/l04-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l04-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 452fedd5..00000000 --- a/web/lessons/diagramme/en/l04-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;65;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34;41; - - diff --git a/web/lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct b/web/lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct deleted file mode 100644 index 60dc368e..00000000 --- a/web/lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 100;111;117;98;108;101;32;104;101;105;103;104;116;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/en/l04-rechnen.visustruct b/web/lessons/diagramme/en/l04-rechnen.visustruct deleted file mode 100644 index c12f157a..00000000 --- a/web/lessons/diagramme/en/l04-rechnen.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - diff --git a/web/lessons/diagramme/en/l04-reihenfolge-loesung.visustruct b/web/lessons/diagramme/en/l04-reihenfolge-loesung.visustruct deleted file mode 100644 index 6ed4eb6a..00000000 --- a/web/lessons/diagramme/en/l04-reihenfolge-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;51; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;52; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - diff --git a/web/lessons/diagramme/en/l04-reihenfolge-start.visustruct b/web/lessons/diagramme/en/l04-reihenfolge-start.visustruct deleted file mode 100644 index 9ccd6139..00000000 --- a/web/lessons/diagramme/en/l04-reihenfolge-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;52; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;51; - - diff --git a/web/lessons/diagramme/en/l04-tauschen-loesung.visustruct b/web/lessons/diagramme/en/l04-tauschen-loesung.visustruct deleted file mode 100644 index 7ed3afd9..00000000 --- a/web/lessons/diagramme/en/l04-tauschen-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; - - - 83;116;114;105;110;103;32;114;105;103;104;116;32;61;32;34;119;97;116;101;114;34; - - - 83;116;114;105;110;103;32;116;101;109;112;32;61;32;108;101;102;116; - - - 108;101;102;116;32;61;32;114;105;103;104;116; - - - 114;105;103;104;116;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;108;101;102;116; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; - - diff --git a/web/lessons/diagramme/en/l04-tauschen-start.visustruct b/web/lessons/diagramme/en/l04-tauschen-start.visustruct deleted file mode 100644 index 9804141c..00000000 --- a/web/lessons/diagramme/en/l04-tauschen-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; - - - 83;116;114;105;110;103;32;114;105;103;104;116;32;61;32;34;119;97;116;101;114;34; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;108;101;102;116; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; - - diff --git a/web/lessons/diagramme/en/l04-tauschen.visustruct b/web/lessons/diagramme/en/l04-tauschen.visustruct deleted file mode 100644 index 43bbf624..00000000 --- a/web/lessons/diagramme/en/l04-tauschen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/en/l05-datentypen.visustruct b/web/lessons/diagramme/en/l05-datentypen.visustruct deleted file mode 100644 index ebc2eff8..00000000 --- a/web/lessons/diagramme/en/l05-datentypen.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;97;103;101;32;61;32;49;52; - - - 100;111;117;98;108;101;32;104;101;105;103;104;116;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;77;105;97;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/en/l05-division.visustruct b/web/lessons/diagramme/en/l05-division.visustruct deleted file mode 100644 index 2ee5bda6..00000000 --- a/web/lessons/diagramme/en/l05-division.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;49;51;53; - - - 105;110;116;32;104;111;117;114;115;32;61;32;109;105;110;117;116;101;115;32;47;32;54;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;109;105;110;117;116;101;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;104;111;117;114;115;32;43;32;34;32;104;111;117;114;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;109;105;110;117;116;101;115;34; - - diff --git a/web/lessons/diagramme/en/l05-einkauf-loesung.visustruct b/web/lessons/diagramme/en/l05-einkauf-loesung.visustruct deleted file mode 100644 index 1e9f4026..00000000 --- a/web/lessons/diagramme/en/l05-einkauf-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;105;99;101;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;116;111;116;97;108;80;114;105;99;101;32;61;32;99;111;117;110;116;32;42;32;112;114;105;99;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108;80;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; - - diff --git a/web/lessons/diagramme/en/l05-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l05-java-fehler-loesung.visustruct deleted file mode 100644 index 93bfc1fc..00000000 --- a/web/lessons/diagramme/en/l05-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; - - - 105;110;116;32;112;114;105;99;101;32;61;32;55; - - - 99;114;101;100;105;116;32;61;32;99;114;101;100;105;116;32;45;32;112;114;105;99;101; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;99;114;101;100;105;116; - - diff --git a/web/lessons/diagramme/en/l05-java-fehler-start.visustruct b/web/lessons/diagramme/en/l05-java-fehler-start.visustruct deleted file mode 100644 index 7302db48..00000000 --- a/web/lessons/diagramme/en/l05-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; - - - 105;110;116;32;112;114;105;99;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;99;114;101;100;105;116; - - - 99;114;101;100;105;116;32;61;32;99;114;101;100;105;116;32;45;32;112;114;105;99;101; - - diff --git a/web/lessons/diagramme/en/l05-java-kino-loesung.visustruct b/web/lessons/diagramme/en/l05-java-kino-loesung.visustruct deleted file mode 100644 index 7c17f7c9..00000000 --- a/web/lessons/diagramme/en/l05-java-kino-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;114;105;99;101;32;61;32;57; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;105;99;101;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/l05-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l05-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 10d41a69..00000000 --- a/web/lessons/diagramme/en/l05-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;108;105;99;101;115;32;61;32;56; - - - 105;110;116;32;112;101;111;112;108;101;32;61;32;52; - - - 105;110;116;32;112;101;114;80;101;114;115;111;110;32;61;32;115;108;105;99;101;115;32;47;32;112;101;111;112;108;101; - - - 111;117;116;112;117;116;58;32;34;69;118;101;114;121;111;110;101;32;103;101;116;115;32;34;32;43;32;112;101;114;80;101;114;115;111;110;32;43;32;34;32;115;108;105;99;101;115;46;34; - - diff --git a/web/lessons/diagramme/en/l05-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l05-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 85a73dc7..00000000 --- a/web/lessons/diagramme/en/l05-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;108;105;99;101;115;32;61;32;56; - - - 105;110;116;32;112;101;111;112;108;101;32;61;32;52; - - - 105;110;116;32;112;101;114;80;101;114;115;111;110;32;61;32;115;108;105;99;101;115;32;47;32;112;101;111;112;108;101; - - - 111;117;116;112;117;116;58;32;34;69;118;101;114;121;111;110;101;32;103;101;116;115;32;34;32;43;32;112;101;114;112;101;114;115;111;110;32;43;32;34;32;115;108;105;99;101;115;46;34; - - diff --git a/web/lessons/diagramme/en/l05-rechteck-loesung.visustruct b/web/lessons/diagramme/en/l05-rechteck-loesung.visustruct deleted file mode 100644 index 0a7e5133..00000000 --- a/web/lessons/diagramme/en/l05-rechteck-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;55; - - - 105;110;116;32;119;105;100;116;104;32;61;32;52; - - - 105;110;116;32;97;114;101;97;32;61;32;108;101;110;103;116;104;32;42;32;119;105;100;116;104; - - - 105;110;116;32;112;101;114;105;109;101;116;101;114;32;61;32;50;32;42;32;40;108;101;110;103;116;104;32;43;32;119;105;100;116;104;41; - - - 111;117;116;112;117;116;58;32;34;65;114;101;97;58;32;34;32;43;32;97;114;101;97; - - - 111;117;116;112;117;116;58;32;34;80;101;114;105;109;101;116;101;114;58;32;34;32;43;32;112;101;114;105;109;101;116;101;114; - - diff --git a/web/lessons/diagramme/en/l05-sekunden-loesung.visustruct b/web/lessons/diagramme/en/l05-sekunden-loesung.visustruct deleted file mode 100644 index 938d0a94..00000000 --- a/web/lessons/diagramme/en/l05-sekunden-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; - - diff --git a/web/lessons/diagramme/en/l05-sekunden-start.visustruct b/web/lessons/diagramme/en/l05-sekunden-start.visustruct deleted file mode 100644 index 0bd403b8..00000000 --- a/web/lessons/diagramme/en/l05-sekunden-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; - - diff --git a/web/lessons/diagramme/en/l05-sequenz.visustruct b/web/lessons/diagramme/en/l05-sequenz.visustruct deleted file mode 100644 index b315fd06..00000000 --- a/web/lessons/diagramme/en/l05-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;53; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51; - - - 105;110;116;32;97;114;101;97;32;61;32;108;101;110;103;116;104;32;42;32;119;105;100;116;104; - - - 111;117;116;112;117;116;58;32;97;114;101;97; - - diff --git a/web/lessons/diagramme/en/l06-begruessung-loesung.visustruct b/web/lessons/diagramme/en/l06-begruessung-loesung.visustruct deleted file mode 100644 index d9b1e9cf..00000000 --- a/web/lessons/diagramme/en/l06-begruessung-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;104;97;116;32;105;115;32;121;111;117;114;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; - - diff --git a/web/lessons/diagramme/en/l06-eva.visustruct b/web/lessons/diagramme/en/l06-eva.visustruct deleted file mode 100644 index f74ce1e2..00000000 --- a/web/lessons/diagramme/en/l06-eva.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l06-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l06-java-fehler-loesung.visustruct deleted file mode 100644 index 61159adb..00000000 --- a/web/lessons/diagramme/en/l06-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;40;97;32;43;32;98;41; - - diff --git a/web/lessons/diagramme/en/l06-java-fehler-start.visustruct b/web/lessons/diagramme/en/l06-java-fehler-start.visustruct deleted file mode 100644 index 53a94d8c..00000000 --- a/web/lessons/diagramme/en/l06-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;97;32;43;32;98; - - diff --git a/web/lessons/diagramme/en/l06-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l06-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index b5f1eb55..00000000 --- a/web/lessons/diagramme/en/l06-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;101;120;116;32;121;101;97;114;32;121;111;117;32;119;105;108;108;32;98;101;32;34;32;43;32;40;97;103;101;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/en/l06-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l06-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 6d6dbef3..00000000 --- a/web/lessons/diagramme/en/l06-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;101;120;116;32;121;101;97;114;32;121;111;117;32;119;105;108;108;32;98;101;32;34;32;43;32;40;65;103;101;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/en/l06-java-tage-loesung.visustruct b/web/lessons/diagramme/en/l06-java-tage-loesung.visustruct deleted file mode 100644 index 9871e49a..00000000 --- a/web/lessons/diagramme/en/l06-java-tage-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;115;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 105;110;116;32;100;97;121;115;32;61;32;121;101;97;114;115;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;105;115;32;97;98;111;117;116;32;34;32;43;32;100;97;121;115;32;43;32;34;32;100;97;121;115;46;34; - - diff --git a/web/lessons/diagramme/en/l06-mittelwert-loesung.visustruct b/web/lessons/diagramme/en/l06-mittelwert-loesung.visustruct deleted file mode 100644 index 012401fa..00000000 --- a/web/lessons/diagramme/en/l06-mittelwert-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 100;111;117;98;108;101;32;109;101;97;110;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;101;97;110;58;32;34;32;43;32;109;101;97;110; - - diff --git a/web/lessons/diagramme/en/l06-rechner-loesung.visustruct b/web/lessons/diagramme/en/l06-rechner-loesung.visustruct deleted file mode 100644 index 96bd5f54..00000000 --- a/web/lessons/diagramme/en/l06-rechner-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;99;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;99;116;58;32;34;32;43;32;112;114;111;100;117;99;116; - - diff --git a/web/lessons/diagramme/en/l07-alter-pruefen.visustruct b/web/lessons/diagramme/en/l07-alter-pruefen.visustruct deleted file mode 100644 index edc4d5ad..00000000 --- a/web/lessons/diagramme/en/l07-alter-pruefen.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;97;114;101;32;97;110;32;97;100;117;108;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;97;114;101;32;110;111;116;32;97;110;32;97;100;117;108;116;32;121;101;116;46;34; - - - - diff --git a/web/lessons/diagramme/en/l07-betrag-loesung.visustruct b/web/lessons/diagramme/en/l07-betrag-loesung.visustruct deleted file mode 100644 index a45f87ba..00000000 --- a/web/lessons/diagramme/en/l07-betrag-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;60;32;48; - - - 110;117;109;98;101;114;32;61;32;48;32;45;32;110;117;109;98;101;114; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - diff --git a/web/lessons/diagramme/en/l07-gerade-loesung.visustruct b/web/lessons/diagramme/en/l07-gerade-loesung.visustruct deleted file mode 100644 index 212aad9a..00000000 --- a/web/lessons/diagramme/en/l07-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;101;118;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;111;100;100;34; - - - - diff --git a/web/lessons/diagramme/en/l07-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l07-java-fehler-loesung.visustruct deleted file mode 100644 index c0ed691d..00000000 --- a/web/lessons/diagramme/en/l07-java-fehler-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;53; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - diff --git a/web/lessons/diagramme/en/l07-java-fehler-start.visustruct b/web/lessons/diagramme/en/l07-java-fehler-start.visustruct deleted file mode 100644 index 86a4c589..00000000 --- a/web/lessons/diagramme/en/l07-java-fehler-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;53; - - - 112;111;105;110;116;115;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - diff --git a/web/lessons/diagramme/en/l07-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l07-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index d24a1154..00000000 --- a/web/lessons/diagramme/en/l07-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - diff --git a/web/lessons/diagramme/en/l07-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l07-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 83da3485..00000000 --- a/web/lessons/diagramme/en/l07-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - diff --git a/web/lessons/diagramme/en/l07-java-pizza-loesung.visustruct b/web/lessons/diagramme/en/l07-java-pizza-loesung.visustruct deleted file mode 100644 index c652b5a2..00000000 --- a/web/lessons/diagramme/en/l07-java-pizza-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;105;99;101;32;61;32;56; - - - 105;110;116;32;99;104;101;101;115;101;32;61;32;50; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;40;112;114;105;99;101;32;43;32;99;104;101;101;115;101;41;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/l07-java-pizza-start.visustruct b/web/lessons/diagramme/en/l07-java-pizza-start.visustruct deleted file mode 100644 index ecdbe774..00000000 --- a/web/lessons/diagramme/en/l07-java-pizza-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;105;99;101;32;61;32;56; - - - 105;110;116;32;99;104;101;101;115;101;32;61;32;50; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;105;99;101;32;43;32;99;104;101;101;115;101;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/l07-maximum-loesung.visustruct b/web/lessons/diagramme/en/l07-maximum-loesung.visustruct deleted file mode 100644 index 94c35760..00000000 --- a/web/lessons/diagramme/en/l07-maximum-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - diff --git a/web/lessons/diagramme/en/l07-rabatt.visustruct b/web/lessons/diagramme/en/l07-rabatt.visustruct deleted file mode 100644 index 61f79e1d..00000000 --- a/web/lessons/diagramme/en/l07-rabatt.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;105;99;101;32;34;80;114;105;99;101;32;105;110;32;101;117;114;111;115;63;34; - - - 112;114;105;99;101;32;62;32;53;48; - - - 112;114;105;99;101;32;61;32;112;114;105;99;101;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;84;111;32;112;97;121;58;32;34;32;43;32;112;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; - - diff --git a/web/lessons/diagramme/en/l08-gueltig-loesung.visustruct b/web/lessons/diagramme/en/l08-gueltig-loesung.visustruct deleted file mode 100644 index cb8fe90c..00000000 --- a/web/lessons/diagramme/en/l08-gueltig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; - - - 103;114;97;100;101;32;62;61;32;49;32;38;38;32;103;114;97;100;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;118;97;108;105;100;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;118;97;108;105;100;34; - - - - diff --git a/web/lessons/diagramme/en/l08-java-bestanden-loesung.visustruct b/web/lessons/diagramme/en/l08-java-bestanden-loesung.visustruct deleted file mode 100644 index 642975e7..00000000 --- a/web/lessons/diagramme/en/l08-java-bestanden-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;112;111;105;110;116;115;32;34;72;111;119;32;109;97;110;121;32;112;111;105;110;116;115;63;34; - - - 112;111;105;110;116;115;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;112;97;115;115;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;110;111;116;32;112;97;115;115;101;100;34; - - - - diff --git a/web/lessons/diagramme/en/l08-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l08-java-fehler-loesung.visustruct deleted file mode 100644 index c706fc3d..00000000 --- a/web/lessons/diagramme/en/l08-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - diff --git a/web/lessons/diagramme/en/l08-java-fehler-start.visustruct b/web/lessons/diagramme/en/l08-java-fehler-start.visustruct deleted file mode 100644 index dcdb17ca..00000000 --- a/web/lessons/diagramme/en/l08-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - diff --git a/web/lessons/diagramme/en/l08-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l08-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index c9c94139..00000000 --- a/web/lessons/diagramme/en/l08-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;97;103;101;32;61;32;49;53; - - - 97;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;101;110;116;114;121;34; - - - - diff --git a/web/lessons/diagramme/en/l08-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l08-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 93d3ebc2..00000000 --- a/web/lessons/diagramme/en/l08-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;97;103;101;32;61;32;49;53; - - - 65;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;101;110;116;114;121;34; - - - - diff --git a/web/lessons/diagramme/en/l08-jugendticket.visustruct b/web/lessons/diagramme/en/l08-jugendticket.visustruct deleted file mode 100644 index f89ebbcc..00000000 --- a/web/lessons/diagramme/en/l08-jugendticket.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;50;32;38;38;32;97;103;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;89;111;117;116;104;32;116;105;99;107;101;116;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;121;111;117;116;104;32;116;105;99;107;101;116;34; - - - - diff --git a/web/lessons/diagramme/en/l08-note.visustruct b/web/lessons/diagramme/en/l08-note.visustruct deleted file mode 100644 index 05ea3c05..00000000 --- a/web/lessons/diagramme/en/l08-note.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; - - - 103;114;97;100;101;32;60;32;49;32;124;124;32;103;114;97;100;101;32;62;32;54; - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;103;114;97;100;101;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;71;114;97;100;101;32;34;32;43;32;103;114;97;100;101;32;43;32;34;32;105;115;32;118;97;108;105;100;46;34; - - - - diff --git a/web/lessons/diagramme/en/l08-schaltjahr-loesung.visustruct b/web/lessons/diagramme/en/l08-schaltjahr-loesung.visustruct deleted file mode 100644 index 654a6aac..00000000 --- a/web/lessons/diagramme/en/l08-schaltjahr-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;32;34;89;101;97;114;63;34; - - - 40;121;101;97;114;32;37;32;52;32;61;61;32;48;32;38;38;32;121;101;97;114;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;121;101;97;114;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;76;101;97;112;32;121;101;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;32;108;101;97;112;32;121;101;97;114;34; - - - - diff --git a/web/lessons/diagramme/en/l08-wochenende-loesung.visustruct b/web/lessons/diagramme/en/l08-wochenende-loesung.visustruct deleted file mode 100644 index 475e2355..00000000 --- a/web/lessons/diagramme/en/l08-wochenende-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;68;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;100;97;121;34; - - - - diff --git a/web/lessons/diagramme/en/l09-ampel.visustruct b/web/lessons/diagramme/en/l09-ampel.visustruct deleted file mode 100644 index 1fdeb21e..00000000 --- a/web/lessons/diagramme/en/l09-ampel.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;108;111;114;32;34;87;104;97;116;32;99;111;108;111;114;32;105;115;32;116;104;101;32;116;114;97;102;102;105;99;32;108;105;103;104;116;63;34; - - - 99;111;108;111;114; - - - 111;117;116;112;117;116;58;32;34;83;116;111;112;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;105;116;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;108;107;34; - - - - - 111;117;116;112;117;116;58;32;34;73;32;100;111;32;110;111;116;32;107;110;111;119;32;116;104;105;115;32;99;111;108;111;114;46;34; - - - - diff --git a/web/lessons/diagramme/en/l09-automat.visustruct b/web/lessons/diagramme/en/l09-automat.visustruct deleted file mode 100644 index d7d2b9bc..00000000 --- a/web/lessons/diagramme/en/l09-automat.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;119;97;116;101;114;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;106;117;105;99;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;99;111;99;111;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;98;117;116;116;111;110;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - diff --git a/web/lessons/diagramme/en/l09-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l09-java-fehler-loesung.visustruct deleted file mode 100644 index 241a6703..00000000 --- a/web/lessons/diagramme/en/l09-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - diff --git a/web/lessons/diagramme/en/l09-java-fehler-start.visustruct b/web/lessons/diagramme/en/l09-java-fehler-start.visustruct deleted file mode 100644 index 8bec3a7d..00000000 --- a/web/lessons/diagramme/en/l09-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;38;38;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - diff --git a/web/lessons/diagramme/en/l09-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l09-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 4b1a2f88..00000000 --- a/web/lessons/diagramme/en/l09-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;100;97;121;32;61;32;55; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - diff --git a/web/lessons/diagramme/en/l09-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l09-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 83a4aaab..00000000 --- a/web/lessons/diagramme/en/l09-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;100;97;121;32;61;32;55; - - - 100;97;121;32;61;61;32;54;32;124;124;32;68;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - diff --git a/web/lessons/diagramme/en/l09-java-schule-loesung.visustruct b/web/lessons/diagramme/en/l09-java-schule-loesung.visustruct deleted file mode 100644 index 4ea562a6..00000000 --- a/web/lessons/diagramme/en/l09-java-schule-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;117;114;32;34;87;104;97;116;32;116;105;109;101;32;105;115;32;105;116;32;40;106;117;115;116;32;116;104;101;32;104;111;117;114;41;63;34; - - - 104;111;117;114;32;62;61;32;56;32;38;38;32;104;111;117;114;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;83;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;116;105;109;101;34; - - - - diff --git a/web/lessons/diagramme/en/l09-note-loesung.visustruct b/web/lessons/diagramme/en/l09-note-loesung.visustruct deleted file mode 100644 index 99a442a5..00000000 --- a/web/lessons/diagramme/en/l09-note-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;87;104;105;99;104;32;103;114;97;100;101;63;34; - - - 103;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;115;97;116;105;115;102;97;99;116;111;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;115;117;102;102;105;99;105;101;110;116;34; - - - - - 111;117;116;112;117;116;58;32;34;112;111;111;114;34; - - - - - 111;117;116;112;117;116;58;32;34;102;97;105;108;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;32;118;97;108;105;100;32;103;114;97;100;101;34; - - - - diff --git a/web/lessons/diagramme/en/l09-rechner-loesung.visustruct b/web/lessons/diagramme/en/l09-rechner-loesung.visustruct deleted file mode 100644 index 796dff90..00000000 --- a/web/lessons/diagramme/en/l09-rechner-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;116;111;114;32;34;79;112;101;114;97;116;111;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;48; - - - 111;112;101;114;97;116;111;114; - - - 114;101;115;117;108;116;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 114;101;115;117;108;116;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 114;101;115;117;108;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 111;117;116;112;117;116;58;32;34;85;110;107;110;111;119;110;32;111;112;101;114;97;116;111;114;34; - - - - diff --git a/web/lessons/diagramme/en/l09-verschachtelt.visustruct b/web/lessons/diagramme/en/l09-verschachtelt.visustruct deleted file mode 100644 index ae78ad18..00000000 --- a/web/lessons/diagramme/en/l09-verschachtelt.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; - - - 99;104;111;105;99;101;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;119;97;116;101;114;46;34; - - - - - 99;104;111;105;99;101;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;106;117;105;99;101;46;34; - - - - - 99;104;111;105;99;101;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;99;111;99;111;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;98;117;116;116;111;110;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - - - - - diff --git a/web/lessons/diagramme/en/l1-grundbausteine.visustruct b/web/lessons/diagramme/en/l1-grundbausteine.visustruct deleted file mode 100644 index c53c4f4a..00000000 --- a/web/lessons/diagramme/en/l1-grundbausteine.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 80;117;116;32;97;32;99;117;112;32;111;110;32;116;104;101;32;116;97;98;108;101; - - - 83;117;103;97;114;32;119;97;110;116;101;100;63; - - - 65;100;100;32;115;117;103;97;114; - - - - - 248; - - - - - 84;101;97;32;115;116;105;108;108;32;116;111;111;32;104;111;116; - - - 87;97;105;116;32;49;32;109;105;110;117;116;101; - - - - - 68;114;105;110;107;32;116;104;101;32;116;101;97; - - diff --git a/web/lessons/diagramme/en/l1-sequenz.visustruct b/web/lessons/diagramme/en/l1-sequenz.visustruct deleted file mode 100644 index cbd0c58e..00000000 --- a/web/lessons/diagramme/en/l1-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 71;101;116;32;117;112; - - - 66;114;117;115;104;32;116;101;101;116;104; - - - 71;101;116;32;100;114;101;115;115;101;100; - - - 72;97;118;101;32;98;114;101;97;107;102;97;115;116; - - diff --git a/web/lessons/diagramme/en/l1-tee.visustruct b/web/lessons/diagramme/en/l1-tee.visustruct deleted file mode 100644 index 55b442e6..00000000 --- a/web/lessons/diagramme/en/l1-tee.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 70;105;108;108;32;116;104;101;32;107;101;116;116;108;101;32;119;105;116;104;32;119;97;116;101;114; - - - 83;119;105;116;99;104;32;111;110;32;116;104;101;32;107;101;116;116;108;101; - - - 80;117;116;32;97;32;116;101;97;32;98;97;103;32;105;110;32;116;104;101;32;99;117;112; - - - 80;111;117;114;32;104;111;116;32;119;97;116;101;114;32;105;110;116;111;32;116;104;101;32;99;117;112; - - - 87;97;105;116;32;51;32;109;105;110;117;116;101;115; - - - 84;97;107;101;32;111;117;116;32;116;104;101;32;116;101;97;32;98;97;103; - - diff --git a/web/lessons/diagramme/en/l1-verzweigung.visustruct b/web/lessons/diagramme/en/l1-verzweigung.visustruct deleted file mode 100644 index fa580c28..00000000 --- a/web/lessons/diagramme/en/l1-verzweigung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 73;115;32;105;116;32;114;97;105;110;105;110;103;63; - - - 80;97;99;107;32;97;110;32;117;109;98;114;101;108;108;97; - - - - - 80;97;99;107;32;115;117;110;103;108;97;115;115;101;115; - - - - - 76;101;97;118;101; - - diff --git a/web/lessons/diagramme/en/l1-wiederholung.visustruct b/web/lessons/diagramme/en/l1-wiederholung.visustruct deleted file mode 100644 index 1ab21c7a..00000000 --- a/web/lessons/diagramme/en/l1-wiederholung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 80;108;97;116;101;32;110;111;116;32;101;109;112;116;121; - - - 84;97;107;101;32;97;32;98;105;116;101; - - - - - 67;108;101;97;114;32;116;104;101;32;112;108;97;116;101; - - diff --git a/web/lessons/diagramme/en/l10-bis-n-loesung.visustruct b/web/lessons/diagramme/en/l10-bis-n-loesung.visustruct deleted file mode 100644 index 4a72f1f5..00000000 --- a/web/lessons/diagramme/en/l10-bis-n-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;117;110;116;32;117;112;32;116;111;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/en/l10-countdown.visustruct b/web/lessons/diagramme/en/l10-countdown.visustruct deleted file mode 100644 index 7ecd64b3..00000000 --- a/web/lessons/diagramme/en/l10-countdown.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/en/l10-endlos.visustruct b/web/lessons/diagramme/en/l10-endlos.visustruct deleted file mode 100644 index 54f4322b..00000000 --- a/web/lessons/diagramme/en/l10-endlos.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/en/l10-fakultaet.visustruct b/web/lessons/diagramme/en/l10-fakultaet.visustruct deleted file mode 100644 index f08f6787..00000000 --- a/web/lessons/diagramme/en/l10-fakultaet.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;99;116;111;114;105;97;108;32;111;102;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;102;97;99;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;99;116;111;114;105;97;108;32;61;32;102;97;99;116;111;114;105;97;108;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;99;116;111;114;105;97;108; - - diff --git a/web/lessons/diagramme/en/l10-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l10-java-fehler-loesung.visustruct deleted file mode 100644 index ed31dcc2..00000000 --- a/web/lessons/diagramme/en/l10-java-fehler-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;116;105;109;101;115;63;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;110;32;111;112;116;105;111;110;34; - - - - diff --git a/web/lessons/diagramme/en/l10-java-fehler-start.visustruct b/web/lessons/diagramme/en/l10-java-fehler-start.visustruct deleted file mode 100644 index 3af2e7be..00000000 --- a/web/lessons/diagramme/en/l10-java-fehler-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;116;105;109;101;115;63;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;110;32;111;112;116;105;111;110;34; - - - - diff --git a/web/lessons/diagramme/en/l10-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l10-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index e4ac0ac4..00000000 --- a/web/lessons/diagramme/en/l10-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;103;114;97;100;101;32;61;32;50; - - - 103;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;101;112;32;112;114;97;99;116;105;115;105;110;103;34; - - - - diff --git a/web/lessons/diagramme/en/l10-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l10-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 4e9df662..00000000 --- a/web/lessons/diagramme/en/l10-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;103;114;97;100;101;32;61;32;50; - - - 71;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;101;112;32;112;114;97;99;116;105;115;105;110;103;34; - - - - diff --git a/web/lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct b/web/lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct deleted file mode 100644 index a93c6b77..00000000 --- a/web/lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114; - - - 111;117;116;112;117;116;58;32;34;111;110;101;34; - - - - - 111;117;116;112;117;116;58;32;34;116;119;111;34; - - - - - 111;117;116;112;117;116;58;32;34;116;104;114;101;101;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;107;110;111;119;110;34; - - - - diff --git a/web/lessons/diagramme/en/l10-verdoppeln-loesung.visustruct b/web/lessons/diagramme/en/l10-verdoppeln-loesung.visustruct deleted file mode 100644 index 6e4cd880..00000000 --- a/web/lessons/diagramme/en/l10-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 110;117;109;98;101;114;32;60;32;49;48;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;116;101;112;115; - - diff --git a/web/lessons/diagramme/en/l11-eingabe-pruefen.visustruct b/web/lessons/diagramme/en/l11-eingabe-pruefen.visustruct deleted file mode 100644 index a5bb5f3c..00000000 --- a/web/lessons/diagramme/en/l11-eingabe-pruefen.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - - - 110;117;109;98;101;114;32;60;32;49;32;124;124;32;110;117;109;98;101;114;32;62;32;49;48; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;32;102;114;111;109;32;49;32;116;111;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;97;110;107;32;121;111;117;33;34; - - diff --git a/web/lessons/diagramme/en/l11-einmal.visustruct b/web/lessons/diagramme/en/l11-einmal.visustruct deleted file mode 100644 index a28efef4..00000000 --- a/web/lessons/diagramme/en/l11-einmal.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/en/l11-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l11-java-fehler-loesung.visustruct deleted file mode 100644 index d1a4bd25..00000000 --- a/web/lessons/diagramme/en/l11-java-fehler-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; - - - 105;110;116;32;109;111;110;101;121;32;61;32;48; - - - 105;110;116;32;119;101;101;107;115;32;61;32;48; - - - 109;111;110;101;121;32;60;32;103;111;97;108; - - - 109;111;110;101;121;32;61;32;109;111;110;101;121;32;43;32;53; - - - 119;101;101;107;115;32;61;32;119;101;101;107;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; - - diff --git a/web/lessons/diagramme/en/l11-java-fehler-start.visustruct b/web/lessons/diagramme/en/l11-java-fehler-start.visustruct deleted file mode 100644 index db908019..00000000 --- a/web/lessons/diagramme/en/l11-java-fehler-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; - - - 105;110;116;32;109;111;110;101;121;32;61;32;48; - - - 105;110;116;32;119;101;101;107;115;32;61;32;48; - - - 109;111;110;101;121;32;60;61;32;103;111;97;108; - - - 109;111;110;101;121;32;61;32;109;111;110;101;121;32;43;32;53; - - - 119;101;101;107;115;32;61;32;119;101;101;107;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; - - diff --git a/web/lessons/diagramme/en/l11-java-gerade-loesung.visustruct b/web/lessons/diagramme/en/l11-java-gerade-loesung.visustruct deleted file mode 100644 index ce913b19..00000000 --- a/web/lessons/diagramme/en/l11-java-gerade-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;101;114;101;63;34; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;50; - - - - diff --git a/web/lessons/diagramme/en/l11-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l11-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 36b01ec6..00000000 --- a/web/lessons/diagramme/en/l11-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - diff --git a/web/lessons/diagramme/en/l11-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l11-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 4e2756c2..00000000 --- a/web/lessons/diagramme/en/l11-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;78;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - diff --git a/web/lessons/diagramme/en/l11-note-loesung.visustruct b/web/lessons/diagramme/en/l11-note-loesung.visustruct deleted file mode 100644 index 264996bd..00000000 --- a/web/lessons/diagramme/en/l11-note-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;103;114;97;100;101;32;61;32;48; - - - 103;114;97;100;101;32;60;32;49;32;124;124;32;103;114;97;100;101;32;62;32;54; - - - 105;110;112;117;116;58;32;103;114;97;100;101;32;34;71;114;97;100;101;32;102;114;111;109;32;49;32;116;111;32;54;34; - - - - - 111;117;116;112;117;116;58;32;34;89;111;117;114;32;103;114;97;100;101;58;32;34;32;43;32;103;114;97;100;101; - - diff --git a/web/lessons/diagramme/en/l11-summe-loesung.visustruct b/web/lessons/diagramme/en/l11-summe-loesung.visustruct deleted file mode 100644 index 83b77da4..00000000 --- a/web/lessons/diagramme/en/l11-summe-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - - - 110;117;109;98;101;114;32;33;61;32;48; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;32;40;48;32;115;116;111;112;115;41;34; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l12-countdown-loesung.visustruct b/web/lessons/diagramme/en/l12-countdown-loesung.visustruct deleted file mode 100644 index 8fb911b8..00000000 --- a/web/lessons/diagramme/en/l12-countdown-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - diff --git a/web/lessons/diagramme/en/l12-einmaleins-loesung.visustruct b/web/lessons/diagramme/en/l12-einmaleins-loesung.visustruct deleted file mode 100644 index b42072e7..00000000 --- a/web/lessons/diagramme/en/l12-einmaleins-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;99;116;32;61;32;110;117;109;98;101;114;32;42;32;105; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;99;116; - - - - diff --git a/web/lessons/diagramme/en/l12-eins-bis-fuenf.visustruct b/web/lessons/diagramme/en/l12-eins-bis-fuenf.visustruct deleted file mode 100644 index 155894b1..00000000 --- a/web/lessons/diagramme/en/l12-eins-bis-fuenf.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/en/l12-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l12-java-fehler-loesung.visustruct deleted file mode 100644 index d33f5ffa..00000000 --- a/web/lessons/diagramme/en/l12-java-fehler-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - diff --git a/web/lessons/diagramme/en/l12-java-fehler-start.visustruct b/web/lessons/diagramme/en/l12-java-fehler-start.visustruct deleted file mode 100644 index 0fdbe953..00000000 --- a/web/lessons/diagramme/en/l12-java-fehler-start.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;62;32;49; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - diff --git a/web/lessons/diagramme/en/l12-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l12-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 572b6780..00000000 --- a/web/lessons/diagramme/en/l12-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;32;61;32;50;48; - - - 110;117;109;98;101;114;32;60;32;108;105;109;105;116; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/en/l12-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l12-java-laeuft-nicht-start.visustruct deleted file mode 100644 index d232f1da..00000000 --- a/web/lessons/diagramme/en/l12-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;32;61;32;50;48; - - - 110;117;109;98;101;114;32;60;32;76;105;109;105;116; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct b/web/lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct deleted file mode 100644 index dbad0a20..00000000 --- a/web/lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;60;32;49;48;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - diff --git a/web/lessons/diagramme/en/l12-summe.visustruct b/web/lessons/diagramme/en/l12-summe.visustruct deleted file mode 100644 index aaf24ec0..00000000 --- a/web/lessons/diagramme/en/l12-summe.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l13-dreieck.visustruct b/web/lessons/diagramme/en/l13-dreieck.visustruct deleted file mode 100644 index 1d6f21e0..00000000 --- a/web/lessons/diagramme/en/l13-dreieck.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;108;105;110;101;115;63;34; - - - 105;110;116;32;108;105;110;101;32;61;32;49; - 108;105;110;101;32;60;61;32;110; - 108;105;110;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;116;97;114;32;61;32;49; - 115;116;97;114;32;60;61;32;108;105;110;101; - 115;116;97;114;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - diff --git a/web/lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct b/web/lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct deleted file mode 100644 index ab694474..00000000 --- a/web/lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l13-gerade-zaehlen.visustruct b/web/lessons/diagramme/en/l13-gerade-zaehlen.visustruct deleted file mode 100644 index 9ff2a3b7..00000000 --- a/web/lessons/diagramme/en/l13-gerade-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l13-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l13-java-fehler-loesung.visustruct deleted file mode 100644 index 6e5e6717..00000000 --- a/web/lessons/diagramme/en/l13-java-fehler-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;111;119;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/en/l13-java-fehler-start.visustruct b/web/lessons/diagramme/en/l13-java-fehler-start.visustruct deleted file mode 100644 index 78e44f69..00000000 --- a/web/lessons/diagramme/en/l13-java-fehler-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;111;119;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/en/l13-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l13-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 228ddea0..00000000 --- a/web/lessons/diagramme/en/l13-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;104;101;105;103;104;116;32;61;32;48; - - - 105;110;116;32;115;116;101;112;32;61;32;49; - 115;116;101;112;32;60;61;32;53; - 115;116;101;112;43;43; - - - 104;101;105;103;104;116;32;61;32;104;101;105;103;104;116;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/en/l13-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l13-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 2a399b98..00000000 --- a/web/lessons/diagramme/en/l13-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;32;61;32;49; - 115;116;101;112;32;60;61;32;53; - 115;116;101;112;43;43; - - - 104;101;105;103;104;116;32;61;32;104;101;105;103;104;116;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/en/l13-java-quadrate-loesung.visustruct b/web/lessons/diagramme/en/l13-java-quadrate-loesung.visustruct deleted file mode 100644 index 5bbbb82a..00000000 --- a/web/lessons/diagramme/en/l13-java-quadrate-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/en/l13-rechteck-loesung.visustruct b/web/lessons/diagramme/en/l13-rechteck-loesung.visustruct deleted file mode 100644 index d93cdb1d..00000000 --- a/web/lessons/diagramme/en/l13-rechteck-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;119;105;100;116;104;32;34;87;105;100;116;104;34; - - - 105;110;112;117;116;58;32;105;110;116;32;104;101;105;103;104;116;32;34;72;101;105;103;104;116;34; - - - 105;110;116;32;108;105;110;101;32;61;32;49; - 108;105;110;101;32;60;61;32;104;101;105;103;104;116; - 108;105;110;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;99;111;108;117;109;110;32;61;32;49; - 99;111;108;117;109;110;32;60;61;32;119;105;100;116;104; - 99;111;108;117;109;110;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - diff --git a/web/lessons/diagramme/en/l14-array-durchlaufen.visustruct b/web/lessons/diagramme/en/l14-array-durchlaufen.visustruct deleted file mode 100644 index 4efa7d30..00000000 --- a/web/lessons/diagramme/en/l14-array-durchlaufen.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/l14-erster-letzter-loesung.visustruct b/web/lessons/diagramme/en/l14-erster-letzter-loesung.visustruct deleted file mode 100644 index 281631b7..00000000 --- a/web/lessons/diagramme/en/l14-erster-letzter-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;91;48;93; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;91;118;97;108;117;101;115;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/en/l14-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l14-java-fehler-loesung.visustruct deleted file mode 100644 index fe123b96..00000000 --- a/web/lessons/diagramme/en/l14-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l14-java-fehler-start.visustruct b/web/lessons/diagramme/en/l14-java-fehler-start.visustruct deleted file mode 100644 index a05e8472..00000000 --- a/web/lessons/diagramme/en/l14-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - - - diff --git a/web/lessons/diagramme/en/l14-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l14-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 39f22d7f..00000000 --- a/web/lessons/diagramme/en/l14-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/l14-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l14-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 549a55f6..00000000 --- a/web/lessons/diagramme/en/l14-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/l14-java-treppe-loesung.visustruct b/web/lessons/diagramme/en/l14-java-treppe-loesung.visustruct deleted file mode 100644 index 918f79b4..00000000 --- a/web/lessons/diagramme/en/l14-java-treppe-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;115;116;101;112;115;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - diff --git a/web/lessons/diagramme/en/l14-namen-eingeben.visustruct b/web/lessons/diagramme/en/l14-namen-eingeben.visustruct deleted file mode 100644 index 3d06c9e9..00000000 --- a/web/lessons/diagramme/en/l14-namen-eingeben.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;97;109;101;34; - - - - - 111;117;116;112;117;116;58;32;34;70;105;114;115;116;32;110;97;109;101;58;32;34;32;43;32;110;97;109;101;115;91;48;93; - - diff --git a/web/lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct deleted file mode 100644 index cce8dc60..00000000 --- a/web/lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - - - 105;110;116;32;105;32;61;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/l14-summe-max-loesung.visustruct b/web/lessons/diagramme/en/l14-summe-max-loesung.visustruct deleted file mode 100644 index 30956b18..00000000 --- a/web/lessons/diagramme/en/l14-summe-max-loesung.visustruct +++ /dev/null @@ -1,51 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;110;117;109;98;101;114;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114;115;91;105;93; - - - 110;117;109;98;101;114;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;110;117;109;98;101;114;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/en/l14-summe-maximum.visustruct b/web/lessons/diagramme/en/l14-summe-maximum.visustruct deleted file mode 100644 index ed53ee55..00000000 --- a/web/lessons/diagramme/en/l14-summe-maximum.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;111;105;110;116;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - 112;111;105;110;116;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;111;105;110;116;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/en/l15-bis-null-loesung.visustruct b/web/lessons/diagramme/en/l15-bis-null-loesung.visustruct deleted file mode 100644 index f24b61cf..00000000 --- a/web/lessons/diagramme/en/l15-bis-null-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - 110;117;109;98;101;114;32;33;61;32;48; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l15-endlos-aussprung.visustruct b/web/lessons/diagramme/en/l15-endlos-aussprung.visustruct deleted file mode 100644 index df565e07..00000000 --- a/web/lessons/diagramme/en/l15-endlos-aussprung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - 110;117;109;98;101;114;32;61;61;32;48; - - - 76;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l15-flaeche-loesung.visustruct b/web/lessons/diagramme/en/l15-flaeche-loesung.visustruct deleted file mode 100644 index 88b730bd..00000000 --- a/web/lessons/diagramme/en/l15-flaeche-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;108;101;110;103;116;104;32;34;76;101;110;103;116;104;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;105;100;116;104;32;34;87;105;100;116;104;63;34; - - - 105;110;116;32;102;32;61;32;97;114;101;97;40;108;101;110;103;116;104;44;32;119;105;100;116;104;41; - - - 111;117;116;112;117;116;58;32;34;65;114;101;97;58;32;34;32;43;32;102; - - diff --git a/web/lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct b/web/lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct deleted file mode 100644 index 8b67013e..00000000 --- a/web/lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 114;101;116;117;114;110;32;97;32;42;32;98; - - diff --git a/web/lessons/diagramme/en/l15-hauptprogramm.visustruct b/web/lessons/diagramme/en/l15-hauptprogramm.visustruct deleted file mode 100644 index 879ab87a..00000000 --- a/web/lessons/diagramme/en/l15-hauptprogramm.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 115;104;111;119;71;114;101;101;116;105;110;103;40;41; - - - 97;115;107;81;117;101;115;116;105;111;110;115;40;41; - - - 115;104;111;119;82;101;115;117;108;116;40;41; - - diff --git a/web/lessons/diagramme/en/l15-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l15-java-fehler-loesung.visustruct deleted file mode 100644 index c91c9cbe..00000000 --- a/web/lessons/diagramme/en/l15-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/en/l15-java-fehler-start.visustruct b/web/lessons/diagramme/en/l15-java-fehler-start.visustruct deleted file mode 100644 index 262b5c76..00000000 --- a/web/lessons/diagramme/en/l15-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/en/l15-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l15-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index b3d70e69..00000000 --- a/web/lessons/diagramme/en/l15-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l15-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l15-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 03818a5c..00000000 --- a/web/lessons/diagramme/en/l15-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;76;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l15-java-noten-loesung.visustruct b/web/lessons/diagramme/en/l15-java-noten-loesung.visustruct deleted file mode 100644 index d9470357..00000000 --- a/web/lessons/diagramme/en/l15-java-noten-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;103;114;97;100;101;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;103;114;97;100;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;103;114;97;100;101;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l15-quadrat-haupt.visustruct b/web/lessons/diagramme/en/l15-quadrat-haupt.visustruct deleted file mode 100644 index 4f1308dd..00000000 --- a/web/lessons/diagramme/en/l15-quadrat-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;113;32;61;32;115;113;117;97;114;101;40;110;117;109;98;101;114;41; - - - 111;117;116;112;117;116;58;32;34;84;104;101;32;115;113;117;97;114;101;32;105;115;32;34;32;43;32;113; - - diff --git a/web/lessons/diagramme/en/l15-quadrat.visustruct b/web/lessons/diagramme/en/l15-quadrat.visustruct deleted file mode 100644 index 093d2a63..00000000 --- a/web/lessons/diagramme/en/l15-quadrat.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;114;101;115;117;108;116; - - diff --git a/web/lessons/diagramme/en/l15-titel-loesung.visustruct b/web/lessons/diagramme/en/l15-titel-loesung.visustruct deleted file mode 100644 index 121b951e..00000000 --- a/web/lessons/diagramme/en/l15-titel-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 115;104;111;119;84;105;116;108;101;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;104;97;116;32;105;115;32;121;111;117;114;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101; - - diff --git a/web/lessons/diagramme/en/l15-unterprogramm.visustruct b/web/lessons/diagramme/en/l15-unterprogramm.visustruct deleted file mode 100644 index 1c38f9f3..00000000 --- a/web/lessons/diagramme/en/l15-unterprogramm.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;32;116;111;32;116;104;101;32;113;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;103;101;116;32;116;104;114;101;101;32;113;117;101;115;116;105;111;110;115;46;34; - - diff --git a/web/lessons/diagramme/en/l15-zeige-summe-haupt.visustruct b/web/lessons/diagramme/en/l15-zeige-summe-haupt.visustruct deleted file mode 100644 index 6ccf3351..00000000 --- a/web/lessons/diagramme/en/l15-zeige-summe-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 115;104;111;119;83;117;109;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 115;104;111;119;83;117;109;40;120;44;32;120;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/en/l15-zeige-summe.visustruct b/web/lessons/diagramme/en/l15-zeige-summe.visustruct deleted file mode 100644 index cb3267d2..00000000 --- a/web/lessons/diagramme/en/l15-zeige-summe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l16-countdown-loesung.visustruct b/web/lessons/diagramme/en/l16-countdown-loesung.visustruct deleted file mode 100644 index 6454fc18..00000000 --- a/web/lessons/diagramme/en/l16-countdown-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - diff --git a/web/lessons/diagramme/en/l16-countdown-start.visustruct b/web/lessons/diagramme/en/l16-countdown-start.visustruct deleted file mode 100644 index 8803f9d5..00000000 --- a/web/lessons/diagramme/en/l16-countdown-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;34; - - diff --git a/web/lessons/diagramme/en/l16-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l16-java-fehler-loesung.visustruct deleted file mode 100644 index f4d1b3bb..00000000 --- a/web/lessons/diagramme/en/l16-java-fehler-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;112;111;105;110;116;115;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/l16-java-fehler-start.visustruct b/web/lessons/diagramme/en/l16-java-fehler-start.visustruct deleted file mode 100644 index 2edead6a..00000000 --- a/web/lessons/diagramme/en/l16-java-fehler-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;112;111;105;110;116;115;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/l16-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l16-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index e5ae3c20..00000000 --- a/web/lessons/diagramme/en/l16-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;44;32;114;111;117;110;100;32;49;58;32;34;32;43;32;112;111;105;110;116;115;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/en/l16-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l16-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 71267d5a..00000000 --- a/web/lessons/diagramme/en/l16-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;44;32;114;111;117;110;100;32;49;58;32;34;32;43;32;80;111;105;110;116;115;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/en/l16-java-punkte-loesung.visustruct b/web/lessons/diagramme/en/l16-java-punkte-loesung.visustruct deleted file mode 100644 index 3fe97f87..00000000 --- a/web/lessons/diagramme/en/l16-java-punkte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l16-schreibtisch.visustruct b/web/lessons/diagramme/en/l16-schreibtisch.visustruct deleted file mode 100644 index 4f13f95b..00000000 --- a/web/lessons/diagramme/en/l16-schreibtisch.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l16-summe-loesung.visustruct b/web/lessons/diagramme/en/l16-summe-loesung.visustruct deleted file mode 100644 index 180eadae..00000000 --- a/web/lessons/diagramme/en/l16-summe-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l16-summe-start.visustruct b/web/lessons/diagramme/en/l16-summe-start.visustruct deleted file mode 100644 index 8ffa0ab9..00000000 --- a/web/lessons/diagramme/en/l16-summe-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l17-beispiel.visustruct b/web/lessons/diagramme/en/l17-beispiel.visustruct deleted file mode 100644 index 6e13646e..00000000 --- a/web/lessons/diagramme/en/l17-beispiel.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;116;105;109;101;115;32;34;32;43;32;110;117;109;98;101;114;32;43;32;34;32;61;32;34;32;43;32;114;101;115;117;108;116; - - - - - 110;117;109;98;101;114;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;119;97;115;32;104;97;114;100;33;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;119;97;115;32;101;97;115;121;46;34; - - - - diff --git a/web/lessons/diagramme/en/l17-fakultaet-loesung.visustruct b/web/lessons/diagramme/en/l17-fakultaet-loesung.visustruct deleted file mode 100644 index 277fc32b..00000000 --- a/web/lessons/diagramme/en/l17-fakultaet-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 105;110;116;32;102;97;99;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;99;116;111;114;105;97;108;32;61;32;102;97;99;116;111;114;105;97;108;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;99;116;111;114;105;97;108; - - diff --git a/web/lessons/diagramme/en/l17-java-brief-loesung.visustruct b/web/lessons/diagramme/en/l17-java-brief-loesung.visustruct deleted file mode 100644 index a501b4f4..00000000 --- a/web/lessons/diagramme/en/l17-java-brief-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;108;101;116;116;101;114;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;76;105;110;101;115;58;32;34;32;43;32;108;105;110;101;115;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;101;115;91;105;93;46;99;111;110;116;97;105;110;115;40;34;102;111;120;34;41; - - - 111;117;116;112;117;116;58;32;34;70;111;120;32;105;110;32;108;105;110;101;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/l17-java-brief-start.visustruct b/web/lessons/diagramme/en/l17-java-brief-start.visustruct deleted file mode 100644 index 428bff3c..00000000 --- a/web/lessons/diagramme/en/l17-java-brief-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/en/l17-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l17-java-fehler-loesung.visustruct deleted file mode 100644 index 63a44d42..00000000 --- a/web/lessons/diagramme/en/l17-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;32;34;76;97;115;116;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/en/l17-java-fehler-start.visustruct b/web/lessons/diagramme/en/l17-java-fehler-start.visustruct deleted file mode 100644 index 13a7f753..00000000 --- a/web/lessons/diagramme/en/l17-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;32;34;76;97;115;116;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/en/l17-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l17-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index dadd5b88..00000000 --- a/web/lessons/diagramme/en/l17-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;104;97;115;32;34;32;43;32;110;97;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;116;101;114;115;34; - - diff --git a/web/lessons/diagramme/en/l17-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l17-java-laeuft-nicht-start.visustruct deleted file mode 100644 index f5a73be8..00000000 --- a/web/lessons/diagramme/en/l17-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;104;97;115;32;34;32;43;32;110;97;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;116;101;114;115;34; - - diff --git a/web/lessons/diagramme/en/l17-java-passwort-loesung.visustruct b/web/lessons/diagramme/en/l17-java-passwort-loesung.visustruct deleted file mode 100644 index a812c6cd..00000000 --- a/web/lessons/diagramme/en/l17-java-passwort-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;105;110;112;117;116;32;34;80;97;115;115;119;111;114;100;63;34; - - - 105;110;112;117;116;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;33;34; - - - - - 111;117;116;112;117;116;58;32;34;87;114;111;110;103;32;112;97;115;115;119;111;114;100;34; - - - - diff --git a/web/lessons/diagramme/en/l17-ticket-loesung.visustruct b/web/lessons/diagramme/en/l17-ticket-loesung.visustruct deleted file mode 100644 index 2b5ead64..00000000 --- a/web/lessons/diagramme/en/l17-ticket-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 97;103;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;67;104;105;108;100;32;116;105;99;107;101;116;58;32;52;32;101;117;114;111;115;34; - - - - - 111;117;116;112;117;116;58;32;34;65;100;117;108;116;32;116;105;99;107;101;116;58;32;56;32;101;117;114;111;115;34; - - - - - - diff --git a/web/lessons/diagramme/en/l18-beispiel.visustruct b/web/lessons/diagramme/en/l18-beispiel.visustruct deleted file mode 100644 index 269f6139..00000000 --- a/web/lessons/diagramme/en/l18-beispiel.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;118;97;108;117;101;63;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;69;110;100;34; - - diff --git a/web/lessons/diagramme/en/l18-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l18-java-fehler-loesung.visustruct deleted file mode 100644 index 6907b0c1..00000000 --- a/web/lessons/diagramme/en/l18-java-fehler-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;116;114;105;101;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;103;117;101;115;115;32;34;89;111;117;114;32;103;117;101;115;115;63;34; - - - 116;114;105;101;115;32;61;32;116;114;105;101;115;32;43;32;49; - - - 103;117;101;115;115;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; - - diff --git a/web/lessons/diagramme/en/l18-java-fehler-start.visustruct b/web/lessons/diagramme/en/l18-java-fehler-start.visustruct deleted file mode 100644 index 2b41a1b3..00000000 --- a/web/lessons/diagramme/en/l18-java-fehler-start.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;116;114;105;101;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;103;117;101;115;115;32;34;89;111;117;114;32;103;117;101;115;115;63;34; - - - 103;117;101;115;115;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 116;114;105;101;115;32;61;32;116;114;105;101;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; - - diff --git a/web/lessons/diagramme/en/l18-java-kasse-loesung.visustruct b/web/lessons/diagramme/en/l18-java-kasse-loesung.visustruct deleted file mode 100644 index 95c939ad..00000000 --- a/web/lessons/diagramme/en/l18-java-kasse-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;105;99;101;32;34;80;114;105;99;101;63;32;40;48;32;61;32;101;110;100;41;34; - - - 112;114;105;99;101;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;114;105;99;101; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;73;116;101;109;115;58;32;34;32;43;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;117;109; - - diff --git a/web/lessons/diagramme/en/l18-js-loesung.visustruct b/web/lessons/diagramme/en/l18-js-loesung.visustruct deleted file mode 100644 index 6c39c541..00000000 --- a/web/lessons/diagramme/en/l18-js-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;109;97;121;32;118;111;116;101;46;34; - - - - - 105;110;116;32;121;101;97;114;115;32;61;32;49;54;32;45;32;97;103;101; - - - 111;117;116;112;117;116;58;32;34;87;97;105;116;32;34;32;43;32;121;101;97;114;115;32;43;32;34;32;109;111;114;101;32;121;101;97;114;115;46;34; - - - - diff --git a/web/lessons/diagramme/en/l18-python-loesung.visustruct b/web/lessons/diagramme/en/l18-python-loesung.visustruct deleted file mode 100644 index 86574e55..00000000 --- a/web/lessons/diagramme/en/l18-python-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;108;105;109;105;116; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/en/l19-java-fehler-loesung.visustruct b/web/lessons/diagramme/en/l19-java-fehler-loesung.visustruct deleted file mode 100644 index a4251365..00000000 --- a/web/lessons/diagramme/en/l19-java-fehler-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/en/l19-java-fehler-start.visustruct b/web/lessons/diagramme/en/l19-java-fehler-start.visustruct deleted file mode 100644 index f76b8c49..00000000 --- a/web/lessons/diagramme/en/l19-java-fehler-start.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/en/l19-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/en/l19-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 091030c3..00000000 --- a/web/lessons/diagramme/en/l19-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;119;97;110;116;101;100;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/en/l19-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/en/l19-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 82c8278c..00000000 --- a/web/lessons/diagramme/en/l19-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;119;97;110;116;101;100;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;87;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct b/web/lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct deleted file mode 100644 index eace5f66..00000000 --- a/web/lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l2-ausgabe.visustruct b/web/lessons/diagramme/en/l2-ausgabe.visustruct deleted file mode 100644 index 45cdd7f5..00000000 --- a/web/lessons/diagramme/en/l2-ausgabe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;71;111;111;100;32;109;111;114;110;105;110;103;34; - - - 111;117;116;112;117;116;58;32;34;84;111;100;97;121;32;119;101;32;108;101;97;114;110;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;46;34; - - diff --git a/web/lessons/diagramme/en/l2-hallo-loesung.visustruct b/web/lessons/diagramme/en/l2-hallo-loesung.visustruct deleted file mode 100644 index 2b9af12a..00000000 --- a/web/lessons/diagramme/en/l2-hallo-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;87;111;114;108;100;34; - - diff --git a/web/lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct b/web/lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct deleted file mode 100644 index 596bcf57..00000000 --- a/web/lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;34; - - - 111;117;116;112;117;116;58;32;34;73;32;97;109;32;108;101;97;114;110;105;110;103;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;34; - - diff --git a/web/lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct b/web/lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct deleted file mode 100644 index 2e952151..00000000 --- a/web/lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;104;111;112;112;105;110;103;45;110;101;119;46;116;120;116;34;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;108;105;110;101;41; - - - 99;111;117;110;116;43;43; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;67;97;107;101;34;41; - - - 99;111;117;110;116;43;43; - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;108;105;110;101;115;32;115;97;118;101;100;34; - - diff --git a/web/lessons/diagramme/en/l23-java-ergaenzen-start.visustruct b/web/lessons/diagramme/en/l23-java-ergaenzen-start.visustruct deleted file mode 100644 index c3833f76..00000000 --- a/web/lessons/diagramme/en/l23-java-ergaenzen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;104;111;112;112;105;110;103;45;110;101;119;46;116;120;116;34;41; - - diff --git a/web/lessons/diagramme/en/l23-java-nummern-loesung.visustruct b/web/lessons/diagramme/en/l23-java-nummern-loesung.visustruct deleted file mode 100644 index 67eedb87..00000000 --- a/web/lessons/diagramme/en/l23-java-nummern-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;46;32;34;32;43;32;108;105;110;101; - - - 110;117;109;98;101;114;43;43; - - - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/l23-java-nummern-start.visustruct b/web/lessons/diagramme/en/l23-java-nummern-start.visustruct deleted file mode 100644 index c8802a36..00000000 --- a/web/lessons/diagramme/en/l23-java-nummern-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/en/l24-java-fuchs-loesung.visustruct b/web/lessons/diagramme/en/l24-java-fuchs-loesung.visustruct deleted file mode 100644 index 301ee130..00000000 --- a/web/lessons/diagramme/en/l24-java-fuchs-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 108;105;110;101;46;99;111;110;116;97;105;110;115;40;34;70;111;120;34;41; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;70;111;120;58;32;34;32;43;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l24-java-fuchs-start.visustruct b/web/lessons/diagramme/en/l24-java-fuchs-start.visustruct deleted file mode 100644 index 0e414b70..00000000 --- a/web/lessons/diagramme/en/l24-java-fuchs-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/l24-java-laengster-loesung.visustruct b/web/lessons/diagramme/en/l24-java-laengster-loesung.visustruct deleted file mode 100644 index 6b82902c..00000000 --- a/web/lessons/diagramme/en/l24-java-laengster-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;108;111;110;103;101;115;116;32;61;32;108;105;110;101;115;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;101;115;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;108;111;110;103;101;115;116;46;108;101;110;103;116;104;40;41; - - - 108;111;110;103;101;115;116;32;61;32;108;105;110;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;76;111;110;103;101;115;116;32;101;110;116;114;121;58;32;34;32;43;32;108;111;110;103;101;115;116; - - diff --git a/web/lessons/diagramme/en/l24-java-laengster-start.visustruct b/web/lessons/diagramme/en/l24-java-laengster-start.visustruct deleted file mode 100644 index 2ca812d9..00000000 --- a/web/lessons/diagramme/en/l24-java-laengster-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - diff --git a/web/lessons/diagramme/en/l25-java-beste-loesung.visustruct b/web/lessons/diagramme/en/l25-java-beste-loesung.visustruct deleted file mode 100644 index 12b27e5e..00000000 --- a/web/lessons/diagramme/en/l25-java-beste-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;98;101;115;116;78;97;109;101;32;61;32;34;34; - - - 105;110;116;32;98;101;115;116;71;114;97;100;101;32;61;32;55; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;103;114;97;100;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;51;93;41; - - - 103;114;97;100;101;32;60;32;98;101;115;116;71;114;97;100;101; - - - 98;101;115;116;71;114;97;100;101;32;61;32;103;114;97;100;101; - - - 98;101;115;116;78;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;66;101;115;116;32;103;114;97;100;101;32;105;110;32;69;110;103;108;105;115;104;58;32;34;32;43;32;98;101;115;116;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;71;114;97;100;101;32;43;32;34;41;34; - - diff --git a/web/lessons/diagramme/en/l25-java-beste-start.visustruct b/web/lessons/diagramme/en/l25-java-beste-start.visustruct deleted file mode 100644 index 7a42ab68..00000000 --- a/web/lessons/diagramme/en/l25-java-beste-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/l25-java-schnitt-loesung.visustruct b/web/lessons/diagramme/en/l25-java-schnitt-loesung.visustruct deleted file mode 100644 index 68e2b79a..00000000 --- a/web/lessons/diagramme/en/l25-java-schnitt-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;117;109;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 115;117;109;32;61;32;115;117;109;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 99;111;117;110;116;43;43; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;97;116;104;115;32;97;118;101;114;97;103;101;58;32;34;32;43;32;115;117;109;32;47;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/l25-java-schnitt-start.visustruct b/web/lessons/diagramme/en/l25-java-schnitt-start.visustruct deleted file mode 100644 index 423b5c40..00000000 --- a/web/lessons/diagramme/en/l25-java-schnitt-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/l26-java-namen-loesung.visustruct b/web/lessons/diagramme/en/l26-java-namen-loesung.visustruct deleted file mode 100644 index 6eed226b..00000000 --- a/web/lessons/diagramme/en/l26-java-namen-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 108;105;110;101;46;99;111;110;116;97;105;110;115;40;34;92;34;110;97;109;101;92;34;34;41; - - - 105;110;116;32;115;116;97;114;116;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 111;117;116;112;117;116;58;32;108;105;110;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;41; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/l26-java-namen-start.visustruct b/web/lessons/diagramme/en/l26-java-namen-start.visustruct deleted file mode 100644 index 018f8bf5..00000000 --- a/web/lessons/diagramme/en/l26-java-namen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/en/l26-java-schreiben-loesung.visustruct b/web/lessons/diagramme/en/l26-java-schreiben-loesung.visustruct deleted file mode 100644 index 75af86d7..00000000 --- a/web/lessons/diagramme/en/l26-java-schreiben-loesung.visustruct +++ /dev/null @@ -1,50 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;105;110;116;115;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;110;116;114;121;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;110;97;109;101;115;91;105;93;32;43;32;34;92;34;44;32;92;34;112;111;105;110;116;115;92;34;58;32;34;32;43;32;112;111;105;110;116;115;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;121;32;61;32;101;110;116;114;121;32;43;32;34;44;34; - - - - - 248; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;101;110;116;114;121;41; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;105;101;115;32;115;97;118;101;100;34; - - diff --git a/web/lessons/diagramme/en/l26-java-schreiben-start.visustruct b/web/lessons/diagramme/en/l26-java-schreiben-start.visustruct deleted file mode 100644 index 7607ec6f..00000000 --- a/web/lessons/diagramme/en/l26-java-schreiben-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;105;110;116;115;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/l27-java-json-loesung.visustruct b/web/lessons/diagramme/en/l27-java-json-loesung.visustruct deleted file mode 100644 index 443fb708..00000000 --- a/web/lessons/diagramme/en/l27-java-json-loesung.visustruct +++ /dev/null @@ -1,53 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;108;115;45;110;101;119;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;115;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;110;116;114;121;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;115;91;48;93;32;43;32;34;92;34;44;32;92;34;115;112;101;99;105;101;115;92;34;58;32;92;34;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;92;34;44;32;92;34;97;103;101;92;34;58;32;34;32;43;32;112;97;114;116;115;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;121;32;61;32;101;110;116;114;121;32;43;32;34;44;34; - - - - - 248; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;101;110;116;114;121;41; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;108;105;110;101;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;108;115;32;115;97;118;101;100;34; - - diff --git a/web/lessons/diagramme/en/l27-java-json-start.visustruct b/web/lessons/diagramme/en/l27-java-json-start.visustruct deleted file mode 100644 index dbe66c3b..00000000 --- a/web/lessons/diagramme/en/l27-java-json-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;108;115;45;110;101;119;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/l27-java-saetze-loesung.visustruct b/web/lessons/diagramme/en/l27-java-saetze-loesung.visustruct deleted file mode 100644 index a1778889..00000000 --- a/web/lessons/diagramme/en/l27-java-saetze-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;101;110;116;101;110;99;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;112;97;114;116;115;91;48;93;32;43;32;34;32;40;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;41;32;105;115;32;34;32;43;32;112;97;114;116;115;91;50;93;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34;41; - - - 99;111;117;110;116;43;43; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;115;101;110;116;101;110;99;101;115;32;115;97;118;101;100;34; - - diff --git a/web/lessons/diagramme/en/l27-java-saetze-start.visustruct b/web/lessons/diagramme/en/l27-java-saetze-start.visustruct deleted file mode 100644 index dc1b3285..00000000 --- a/web/lessons/diagramme/en/l27-java-saetze-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;101;110;116;101;110;99;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/en/sim-kino-loesung.visustruct b/web/lessons/diagramme/en/sim-kino-loesung.visustruct deleted file mode 100644 index 2c4e777a..00000000 --- a/web/lessons/diagramme/en/sim-kino-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;99;111;117;110;116;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/en/sim-kino-start.visustruct b/web/lessons/diagramme/en/sim-kino-start.visustruct deleted file mode 100644 index 283546b9..00000000 --- a/web/lessons/diagramme/en/sim-kino-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;99;111;117;110;116;32;42;32;56;46;53; - - diff --git a/web/lessons/diagramme/en/sim-tausch-loesung.visustruct b/web/lessons/diagramme/en/sim-tausch-loesung.visustruct deleted file mode 100644 index 5045661f..00000000 --- a/web/lessons/diagramme/en/sim-tausch-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/en/sim-tausch-start.visustruct b/web/lessons/diagramme/en/sim-tausch-start.visustruct deleted file mode 100644 index 36ce1dea..00000000 --- a/web/lessons/diagramme/en/sim-tausch-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/en/sim-tausch.visustruct b/web/lessons/diagramme/en/sim-tausch.visustruct deleted file mode 100644 index 29061b19..00000000 --- a/web/lessons/diagramme/en/sim-tausch.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/en/ss-absteigend-loesung.visustruct b/web/lessons/diagramme/en/ss-absteigend-loesung.visustruct deleted file mode 100644 index 46bd866c..00000000 --- a/web/lessons/diagramme/en/ss-absteigend-loesung.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;100;115;91;105;93;32;34;69;110;116;101;114;32;97;32;99;97;114;100;34; - - - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;60;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/ss-absteigend-start.visustruct b/web/lessons/diagramme/en/ss-absteigend-start.visustruct deleted file mode 100644 index 9774c469..00000000 --- a/web/lessons/diagramme/en/ss-absteigend-start.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;100;115;91;105;93;32;34;69;110;116;101;114;32;97;32;99;97;114;100;34; - - - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;62;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/ss-binaere-suche.visustruct b/web/lessons/diagramme/en/ss-binaere-suche.visustruct deleted file mode 100644 index 099c6c14..00000000 --- a/web/lessons/diagramme/en/ss-binaere-suche.visustruct +++ /dev/null @@ -1,74 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;32;97;114;101;32;121;111;117;32;108;111;111;107;105;110;103;32;102;111;114;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;105;115;111;110;115;32;61;32;48; - - - 105;110;116;32;108;101;102;116;32;61;32;48; - - - 105;110;116;32;114;105;103;104;116;32;61;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;105;100;100;108;101;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;108;101;102;116;32;60;61;32;114;105;103;104;116; - - - 109;105;100;100;108;101;32;61;32;40;108;101;102;116;32;43;32;114;105;103;104;116;41;32;47;32;50; - - - 99;111;109;112;97;114;105;115;111;110;115;32;61;32;99;111;109;112;97;114;105;115;111;110;115;32;43;32;49; - - - 99;97;114;100;115;91;109;105;100;100;108;101;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;109;105;100;100;108;101; - - - - - 99;97;114;100;115;91;109;105;100;100;108;101;93;32;60;32;116;97;114;103;101;116; - - - 108;101;102;116;32;61;32;109;105;100;100;108;101;32;43;32;49; - - - - - 114;105;103;104;116;32;61;32;109;105;100;100;108;101;32;45;32;49; - - - - - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;70;111;117;110;100;32;97;116;32;112;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; - - diff --git a/web/lessons/diagramme/en/ss-bubblesort.visustruct b/web/lessons/diagramme/en/ss-bubblesort.visustruct deleted file mode 100644 index 33b474ee..00000000 --- a/web/lessons/diagramme/en/ss-bubblesort.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;62;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/ss-karte-suchen-loesung.visustruct b/web/lessons/diagramme/en/ss-karte-suchen-loesung.visustruct deleted file mode 100644 index 1e8d853c..00000000 --- a/web/lessons/diagramme/en/ss-karte-suchen-loesung.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - diff --git a/web/lessons/diagramme/en/ss-lineare-suche.visustruct b/web/lessons/diagramme/en/ss-lineare-suche.visustruct deleted file mode 100644 index 303acf52..00000000 --- a/web/lessons/diagramme/en/ss-lineare-suche.visustruct +++ /dev/null @@ -1,58 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;32;97;114;101;32;121;111;117;32;108;111;111;107;105;110;103;32;102;111;114;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;105;115;111;110;115;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;111;109;112;97;114;105;115;111;110;115;32;61;32;99;111;109;112;97;114;105;115;111;110;115;32;43;32;49; - - - 99;97;114;100;115;91;105;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;70;111;117;110;100;32;97;116;32;112;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; - - diff --git a/web/lessons/diagramme/en/uebergabe-bonus-loesung.visustruct b/web/lessons/diagramme/en/uebergabe-bonus-loesung.visustruct deleted file mode 100644 index d6f52036..00000000 --- a/web/lessons/diagramme/en/uebergabe-bonus-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;105;110;116;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;105;110;116;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/uebergabe-bonus-start.visustruct b/web/lessons/diagramme/en/uebergabe-bonus-start.visustruct deleted file mode 100644 index d6f52036..00000000 --- a/web/lessons/diagramme/en/uebergabe-bonus-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;105;110;116;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;105;110;116;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct b/web/lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct deleted file mode 100644 index 905cf79e..00000000 --- a/web/lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 112;111;105;110;116;115;91;105;93;32;61;32;112;111;105;110;116;115;91;105;93;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/en/uebergabe-haupt.visustruct b/web/lessons/diagramme/en/uebergabe-haupt.visustruct deleted file mode 100644 index bff4adbe..00000000 --- a/web/lessons/diagramme/en/uebergabe-haupt.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;53; - - - 100;111;117;98;108;101;73;116;40;110;117;109;98;101;114;41; - - - 111;117;116;112;117;116;58;32;34;73;110;32;116;104;101;32;109;97;105;110;32;112;114;111;103;114;97;109;58;32;110;117;109;98;101;114;32;61;32;34;32;43;32;110;117;109;98;101;114; - - - 98;111;111;108;101;97;110;91;93;32;114;111;119;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;66;101;102;111;114;101;58;32;34;32;43;32;114;111;119;91;48;93;32;43;32;34;44;32;34;32;43;32;114;111;119;91;49;93; - - - 99;108;101;97;114;40;114;111;119;41; - - - 111;117;116;112;117;116;58;32;34;65;102;116;101;114;58;32;34;32;43;32;114;111;119;91;48;93;32;43;32;34;44;32;34;32;43;32;114;111;119;91;49;93; - - diff --git a/web/lessons/diagramme/en/uebergabe-leeren.visustruct b/web/lessons/diagramme/en/uebergabe-leeren.visustruct deleted file mode 100644 index 1cbf7323..00000000 --- a/web/lessons/diagramme/en/uebergabe-leeren.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;101;97;116;115;91;105;93;32;61;32;102;97;108;115;101; - - - - diff --git a/web/lessons/diagramme/en/uebergabe-verdopple.visustruct b/web/lessons/diagramme/en/uebergabe-verdopple.visustruct deleted file mode 100644 index 61f5ad5a..00000000 --- a/web/lessons/diagramme/en/uebergabe-verdopple.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;73;110;32;116;104;101;32;115;117;98;112;114;111;103;114;97;109;58;32;120;32;61;32;34;32;43;32;120; - - diff --git a/web/lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct b/web/lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct deleted file mode 100644 index 62a97ee4..00000000 --- a/web/lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-abstand-halten-loesung.visustruct b/web/lessons/diagramme/en/vb-abstand-halten-loesung.visustruct deleted file mode 100644 index 4f13f463..00000000 --- a/web/lessons/diagramme/en/vb-abstand-halten-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/vb-alarmanlage-loesung.visustruct b/web/lessons/diagramme/en/vb-alarmanlage-loesung.visustruct deleted file mode 100644 index 7b9743b1..00000000 --- a/web/lessons/diagramme/en/vb-alarmanlage-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-ampel-loesung.visustruct b/web/lessons/diagramme/en/vb-ampel-loesung.visustruct deleted file mode 100644 index 90df2995..00000000 --- a/web/lessons/diagramme/en/vb-ampel-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - diff --git a/web/lessons/diagramme/en/vb-ampel-zustand-loesung.visustruct b/web/lessons/diagramme/en/vb-ampel-zustand-loesung.visustruct deleted file mode 100644 index 3512436d..00000000 --- a/web/lessons/diagramme/en/vb-ampel-zustand-loesung.visustruct +++ /dev/null @@ -1,43 +0,0 @@ - - - - 105;110;116;32;115;116;97;116;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;49; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;50; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;48; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-ausgang-loesung.visustruct b/web/lessons/diagramme/en/vb-ausgang-loesung.visustruct deleted file mode 100644 index 1cd50df8..00000000 --- a/web/lessons/diagramme/en/vb-ausgang-loesung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-begruessung-loesung.visustruct b/web/lessons/diagramme/en/vb-begruessung-loesung.visustruct deleted file mode 100644 index 910b16f6..00000000 --- a/web/lessons/diagramme/en/vb-begruessung-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;101;108;108;111;33;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;32;97;109;32;86;105;115;117;66;111;116;34;41; - - diff --git a/web/lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct b/web/lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct deleted file mode 100644 index 19d58d84..00000000 --- a/web/lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct +++ /dev/null @@ -1,52 +0,0 @@ - - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - 110;117;109;98;101;114;32;60;32;56; - 110;117;109;98;101;114;43;43; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 110;117;109;98;101;114;32;47;32;50;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 110;117;109;98;101;114;32;47;32;52;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-bis-rot-loesung.visustruct b/web/lessons/diagramme/en/vb-bis-rot-loesung.visustruct deleted file mode 100644 index 6d8842c9..00000000 --- a/web/lessons/diagramme/en/vb-bis-rot-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-bis-wand-loesung.visustruct b/web/lessons/diagramme/en/vb-bis-wand-loesung.visustruct deleted file mode 100644 index 7ccb357f..00000000 --- a/web/lessons/diagramme/en/vb-bis-wand-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-bis-ziel-loesung.visustruct b/web/lessons/diagramme/en/vb-bis-ziel-loesung.visustruct deleted file mode 100644 index ba017755..00000000 --- a/web/lessons/diagramme/en/vb-bis-ziel-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-buchstaben-loesung.visustruct b/web/lessons/diagramme/en/vb-buchstaben-loesung.visustruct deleted file mode 100644 index c5eb152e..00000000 --- a/web/lessons/diagramme/en/vb-buchstaben-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;86;105;115;117;66;111;116;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;48;44;32;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;51;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-do-while-loesung.visustruct b/web/lessons/diagramme/en/vb-do-while-loesung.visustruct deleted file mode 100644 index 8e0323b6..00000000 --- a/web/lessons/diagramme/en/vb-do-while-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-drei-lichter-loesung.visustruct b/web/lessons/diagramme/en/vb-drei-lichter-loesung.visustruct deleted file mode 100644 index 157f1b2c..00000000 --- a/web/lessons/diagramme/en/vb-drei-lichter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;121;101;108;108;111;119;34;41; - - - 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - diff --git a/web/lessons/diagramme/en/vb-dreieck-loesung.visustruct b/web/lessons/diagramme/en/vb-dreieck-loesung.visustruct deleted file mode 100644 index deeed0c6..00000000 --- a/web/lessons/diagramme/en/vb-dreieck-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-einparken-loesung.visustruct b/web/lessons/diagramme/en/vb-einparken-loesung.visustruct deleted file mode 100644 index c6b81b56..00000000 --- a/web/lessons/diagramme/en/vb-einparken-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;52;53; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;80;97;114;107;101;100;33;34;41; - - diff --git a/web/lessons/diagramme/en/vb-erster-plan-loesung.visustruct b/web/lessons/diagramme/en/vb-erster-plan-loesung.visustruct deleted file mode 100644 index 582403ed..00000000 --- a/web/lessons/diagramme/en/vb-erster-plan-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/en/vb-farben-loesung.visustruct b/web/lessons/diagramme/en/vb-farben-loesung.visustruct deleted file mode 100644 index 538a2ee9..00000000 --- a/web/lessons/diagramme/en/vb-farben-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;99;111;108;111;117;114;115;32;61;32;123;34;114;101;100;34;44;32;34;121;101;108;108;111;119;34;44;32;34;103;114;101;101;110;34;44;32;34;98;108;117;101;34;44;32;34;112;117;114;112;108;101;34;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;111;108;111;117;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;99;111;108;111;117;114;115;91;105;93;41; - - - - diff --git a/web/lessons/diagramme/en/vb-farbweiche-loesung.visustruct b/web/lessons/diagramme/en/vb-farbweiche-loesung.visustruct deleted file mode 100644 index 150365b3..00000000 --- a/web/lessons/diagramme/en/vb-farbweiche-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-04-sensoren-start.visustruct b/web/lessons/diagramme/en/vb-fehler-04-sensoren-start.visustruct deleted file mode 100644 index 0d30993a..00000000 --- a/web/lessons/diagramme/en/vb-fehler-04-sensoren-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;114;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-05-bis-zur-wand-start.visustruct b/web/lessons/diagramme/en/vb-fehler-05-bis-zur-wand-start.visustruct deleted file mode 100644 index ae5f42e4..00000000 --- a/web/lessons/diagramme/en/vb-fehler-05-bis-zur-wand-start.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;70;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct b/web/lessons/diagramme/en/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct deleted file mode 100644 index 623b3d9f..00000000 --- a/web/lessons/diagramme/en/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;83;116;101;112;115;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-05-zaehlen-und-summieren-start.visustruct b/web/lessons/diagramme/en/vb-fehler-05-zaehlen-und-summieren-start.visustruct deleted file mode 100644 index 5469aca6..00000000 --- a/web/lessons/diagramme/en/vb-fehler-05-zaehlen-und-summieren-start.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;49;48; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 116;111;116;97;108;32;61;32;84;111;116;97;108;32;43;32;115;105;100;101; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;116;111;116;97;108;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-06-abstand-start.visustruct b/web/lessons/diagramme/en/vb-fehler-06-abstand-start.visustruct deleted file mode 100644 index 1c84e7f1..00000000 --- a/web/lessons/diagramme/en/vb-fehler-06-abstand-start.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-06-konstanten-final-start.visustruct b/web/lessons/diagramme/en/vb-fehler-06-konstanten-final-start.visustruct deleted file mode 100644 index e8778244..00000000 --- a/web/lessons/diagramme/en/vb-fehler-06-konstanten-final-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;83;73;68;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-06-nah-mittel-weit-start.visustruct b/web/lessons/diagramme/en/vb-fehler-06-nah-mittel-weit-start.visustruct deleted file mode 100644 index da7d550f..00000000 --- a/web/lessons/diagramme/en/vb-fehler-06-nah-mittel-weit-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;78;105;103;104;116;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;117;115;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;97;121;34;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-07-linie-start.visustruct b/web/lessons/diagramme/en/vb-fehler-07-linie-start.visustruct deleted file mode 100644 index d1f2f64e..00000000 --- a/web/lessons/diagramme/en/vb-fehler-07-linie-start.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;83;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;116;101;112;115; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-07-und-oder-start.visustruct b/web/lessons/diagramme/en/vb-fehler-07-und-oder-start.visustruct deleted file mode 100644 index 95f7f458..00000000 --- a/web/lessons/diagramme/en/vb-fehler-07-und-oder-start.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;116;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-08-farben-start.visustruct b/web/lessons/diagramme/en/vb-fehler-08-farben-start.visustruct deleted file mode 100644 index 841ab1fa..00000000 --- a/web/lessons/diagramme/en/vb-fehler-08-farben-start.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;103;114;101;101;110;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-08-groesster-wert-start.visustruct b/web/lessons/diagramme/en/vb-fehler-08-groesster-wert-start.visustruct deleted file mode 100644 index d795bd53..00000000 --- a/web/lessons/diagramme/en/vb-fehler-08-groesster-wert-start.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;100;105;114;101;99;116;105;111;110;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - 100;105;114;101;99;116;105;111;110;32;61;32;73; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;114;101;99;116;105;111;110;58;32;34;32;43;32;100;105;114;101;99;116;105;111;110;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-09-fallauswahl-mbot2-start.visustruct b/web/lessons/diagramme/en/vb-fehler-09-fallauswahl-mbot2-start.visustruct deleted file mode 100644 index 7e04b84f..00000000 --- a/web/lessons/diagramme/en/vb-fehler-09-fallauswahl-mbot2-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;116;104;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;114;111;115;115;32;108;105;110;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-10-tasten-joystick-start.visustruct b/web/lessons/diagramme/en/vb-fehler-10-tasten-joystick-start.visustruct deleted file mode 100644 index 6529b132..00000000 --- a/web/lessons/diagramme/en/vb-fehler-10-tasten-joystick-start.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;66;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-10-unterbrechen-mit-break-start.visustruct b/web/lessons/diagramme/en/vb-fehler-10-unterbrechen-mit-break-start.visustruct deleted file mode 100644 index badfbbd5..00000000 --- a/web/lessons/diagramme/en/vb-fehler-10-unterbrechen-mit-break-start.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;83;116;111;112;112;101;100;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-11-licht-start.visustruct b/web/lessons/diagramme/en/vb-fehler-11-licht-start.visustruct deleted file mode 100644 index b9a15503..00000000 --- a/web/lessons/diagramme/en/vb-fehler-11-licht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-11-merker-boolean-start.visustruct b/web/lessons/diagramme/en/vb-fehler-11-merker-boolean-start.visustruct deleted file mode 100644 index f1b27d79..00000000 --- a/web/lessons/diagramme/en/vb-fehler-11-merker-boolean-start.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;108;111;117;100;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;111;117;100;32;61;32;84;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;111;117;100; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;108;97;112;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;32;113;117;105;101;116;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-12-lautstaerke-start.visustruct b/web/lessons/diagramme/en/vb-fehler-12-lautstaerke-start.visustruct deleted file mode 100644 index acc3ba5d..00000000 --- a/web/lessons/diagramme/en/vb-fehler-12-lautstaerke-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;111;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-13-neigung-start.visustruct b/web/lessons/diagramme/en/vb-fehler-13-neigung-start.visustruct deleted file mode 100644 index 23bd3839..00000000 --- a/web/lessons/diagramme/en/vb-fehler-13-neigung-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;108;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-14-leds-start.visustruct b/web/lessons/diagramme/en/vb-fehler-14-leds-start.visustruct deleted file mode 100644 index 6806f5d0..00000000 --- a/web/lessons/diagramme/en/vb-fehler-14-leds-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;80;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-15-einzelne-leds-start.visustruct b/web/lessons/diagramme/en/vb-fehler-15-einzelne-leds-start.visustruct deleted file mode 100644 index ae5fd96d..00000000 --- a/web/lessons/diagramme/en/vb-fehler-15-einzelne-leds-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;73;41;46;115;101;116;67;111;108;111;114;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-16-lautsprecher-start.visustruct b/web/lessons/diagramme/en/vb-fehler-16-lautsprecher-start.visustruct deleted file mode 100644 index 48b53da8..00000000 --- a/web/lessons/diagramme/en/vb-fehler-16-lautsprecher-start.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-17-arrays-melodie-start.visustruct b/web/lessons/diagramme/en/vb-fehler-17-arrays-melodie-start.visustruct deleted file mode 100644 index 0d59e016..00000000 --- a/web/lessons/diagramme/en/vb-fehler-17-arrays-melodie-start.visustruct +++ /dev/null @@ -1,38 +0,0 @@ - - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 118;97;108;117;101;115;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;86;97;108;117;101;115;91;105;93; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-18-bildschirm-start.visustruct b/web/lessons/diagramme/en/vb-fehler-18-bildschirm-start.visustruct deleted file mode 100644 index 08edc257..00000000 --- a/web/lessons/diagramme/en/vb-fehler-18-bildschirm-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;73;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-19-zeichenketten-start.visustruct b/web/lessons/diagramme/en/vb-fehler-19-zeichenketten-start.visustruct deleted file mode 100644 index 771732b2..00000000 --- a/web/lessons/diagramme/en/vb-fehler-19-zeichenketten-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;101;108;108;111;32;99;108;97;115;115;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;84;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-20-motoren-start.visustruct b/web/lessons/diagramme/en/vb-fehler-20-motoren-start.visustruct deleted file mode 100644 index 629c5ddd..00000000 --- a/web/lessons/diagramme/en/vb-fehler-20-motoren-start.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;83;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/en/vb-fehler-21-stoppuhr-akku-start.visustruct b/web/lessons/diagramme/en/vb-fehler-21-stoppuhr-akku-start.visustruct deleted file mode 100644 index 75fb4d99..00000000 --- a/web/lessons/diagramme/en/vb-fehler-21-stoppuhr-akku-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;66;97;116;116;101;114;121;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-21-zustaende-start.visustruct b/web/lessons/diagramme/en/vb-fehler-21-zustaende-start.visustruct deleted file mode 100644 index 77445908..00000000 --- a/web/lessons/diagramme/en/vb-fehler-21-zustaende-start.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;114;101;100;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;103;114;101;101;110; - - - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;121;101;108;108;111;119;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;114;101;100;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-22-eigene-methoden-start.visustruct b/web/lessons/diagramme/en/vb-fehler-22-eigene-methoden-start.visustruct deleted file mode 100644 index 4188b4dd..00000000 --- a/web/lessons/diagramme/en/vb-fehler-22-eigene-methoden-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;114;111;116;97;116;105;111;110;115;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-fehler-23-wie-geht-es-weiter-start.visustruct b/web/lessons/diagramme/en/vb-fehler-23-wie-geht-es-weiter-start.visustruct deleted file mode 100644 index ef1117ee..00000000 --- a/web/lessons/diagramme/en/vb-fehler-23-wie-geht-es-weiter-start.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct b/web/lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct deleted file mode 100644 index a65735d2..00000000 --- a/web/lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/en/vb-gerade-loesung.visustruct b/web/lessons/diagramme/en/vb-gerade-loesung.visustruct deleted file mode 100644 index 84b341ea..00000000 --- a/web/lessons/diagramme/en/vb-gerade-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/en/vb-hindernis-loesung.visustruct b/web/lessons/diagramme/en/vb-hindernis-loesung.visustruct deleted file mode 100644 index bf15d030..00000000 --- a/web/lessons/diagramme/en/vb-hindernis-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-java-akku-loesung.visustruct b/web/lessons/diagramme/en/vb-java-akku-loesung.visustruct deleted file mode 100644 index d32e7083..00000000 --- a/web/lessons/diagramme/en/vb-java-akku-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;66;97;116;116;101;114;121;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/en/vb-java-ampel-text-loesung.visustruct b/web/lessons/diagramme/en/vb-java-ampel-text-loesung.visustruct deleted file mode 100644 index 6eb4839c..00000000 --- a/web/lessons/diagramme/en/vb-java-ampel-text-loesung.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;114;101;100;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;103;114;101;101;110;34; - - - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;121;101;108;108;111;119;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;114;101;100;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct b/web/lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct deleted file mode 100644 index b9e896a9..00000000 --- a/web/lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/en/vb-java-blinken-loesung.visustruct b/web/lessons/diagramme/en/vb-java-blinken-loesung.visustruct deleted file mode 100644 index 967e1494..00000000 --- a/web/lessons/diagramme/en/vb-java-blinken-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-countdown-loesung.visustruct b/web/lessons/diagramme/en/vb-java-countdown-loesung.visustruct deleted file mode 100644 index 5ddc447c..00000000 --- a/web/lessons/diagramme/en/vb-java-countdown-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;105;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - diff --git a/web/lessons/diagramme/en/vb-java-hoeher-loesung.visustruct b/web/lessons/diagramme/en/vb-java-hoeher-loesung.visustruct deleted file mode 100644 index d455d6ec..00000000 --- a/web/lessons/diagramme/en/vb-java-hoeher-loesung.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;44;32;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-joystick-loesung.visustruct b/web/lessons/diagramme/en/vb-java-joystick-loesung.visustruct deleted file mode 100644 index 979fa644..00000000 --- a/web/lessons/diagramme/en/vb-java-joystick-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/en/vb-java-klatsch-merker-loesung.visustruct b/web/lessons/diagramme/en/vb-java-klatsch-merker-loesung.visustruct deleted file mode 100644 index b609f3f5..00000000 --- a/web/lessons/diagramme/en/vb-java-klatsch-merker-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;108;111;117;100;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;111;117;100;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;111;117;100; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;108;97;112;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;32;113;117;105;101;116;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-konstante-seite-loesung.visustruct b/web/lessons/diagramme/en/vb-java-konstante-seite-loesung.visustruct deleted file mode 100644 index bccd6cdc..00000000 --- a/web/lessons/diagramme/en/vb-java-konstante-seite-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;83;73;68;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;83;73;68;69;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-laermampel-loesung.visustruct b/web/lessons/diagramme/en/vb-java-laermampel-loesung.visustruct deleted file mode 100644 index 6825f78b..00000000 --- a/web/lessons/diagramme/en/vb-java-laermampel-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct b/web/lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct deleted file mode 100644 index 98246fc5..00000000 --- a/web/lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct b/web/lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct deleted file mode 100644 index 7458d58e..00000000 --- a/web/lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct b/web/lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct deleted file mode 100644 index 8a99c683..00000000 --- a/web/lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-rand-loesung.visustruct b/web/lessons/diagramme/en/vb-java-rand-loesung.visustruct deleted file mode 100644 index 3ee464e1..00000000 --- a/web/lessons/diagramme/en/vb-java-rand-loesung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;116;101;112;115; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-rechteck-loesung.visustruct b/web/lessons/diagramme/en/vb-java-rechteck-loesung.visustruct deleted file mode 100644 index 72754fe0..00000000 --- a/web/lessons/diagramme/en/vb-java-rechteck-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;101;110;103;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;119;105;100;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-rechteck-umdrehungen-loesung.visustruct b/web/lessons/diagramme/en/vb-java-rechteck-umdrehungen-loesung.visustruct deleted file mode 100644 index 8a8e8928..00000000 --- a/web/lessons/diagramme/en/vb-java-rechteck-umdrehungen-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-java-richtung-loesung.visustruct b/web/lessons/diagramme/en/vb-java-richtung-loesung.visustruct deleted file mode 100644 index 567aab66..00000000 --- a/web/lessons/diagramme/en/vb-java-richtung-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;100;105;114;101;99;116;105;111;110;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - 100;105;114;101;99;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;114;101;99;116;105;111;110;58;32;34;32;43;32;100;105;114;101;99;116;105;111;110;41; - - diff --git a/web/lessons/diagramme/en/vb-java-schritte-zaehlen-loesung.visustruct b/web/lessons/diagramme/en/vb-java-schritte-zaehlen-loesung.visustruct deleted file mode 100644 index e8a25d4d..00000000 --- a/web/lessons/diagramme/en/vb-java-schritte-zaehlen-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115;41; - - diff --git a/web/lessons/diagramme/en/vb-java-sicher-fahren-loesung.visustruct b/web/lessons/diagramme/en/vb-java-sicher-fahren-loesung.visustruct deleted file mode 100644 index 3c5b79f3..00000000 --- a/web/lessons/diagramme/en/vb-java-sicher-fahren-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-java-spirale-strecke-loesung.visustruct b/web/lessons/diagramme/en/vb-java-spirale-strecke-loesung.visustruct deleted file mode 100644 index 680ade9b..00000000 --- a/web/lessons/diagramme/en/vb-java-spirale-strecke-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;49;48; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;115;105;100;101; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;116;111;116;97;108;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-java-tageszeit-loesung.visustruct b/web/lessons/diagramme/en/vb-java-tageszeit-loesung.visustruct deleted file mode 100644 index 0cbbcf06..00000000 --- a/web/lessons/diagramme/en/vb-java-tageszeit-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;78;105;103;104;116;34;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;117;115;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;97;121;34;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-java-taste-stopp-loesung.visustruct b/web/lessons/diagramme/en/vb-java-taste-stopp-loesung.visustruct deleted file mode 100644 index fd1d4c96..00000000 --- a/web/lessons/diagramme/en/vb-java-taste-stopp-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;112;101;100;34;41; - - diff --git a/web/lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct b/web/lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct deleted file mode 100644 index 8316ea11..00000000 --- a/web/lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;101;108;108;111;32;99;108;97;115;115;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - diff --git a/web/lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct b/web/lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct deleted file mode 100644 index 7e824d34..00000000 --- a/web/lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct b/web/lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct deleted file mode 100644 index 657b6703..00000000 --- a/web/lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-klatschen-loesung.visustruct b/web/lessons/diagramme/en/vb-klatschen-loesung.visustruct deleted file mode 100644 index e0a9bbd1..00000000 --- a/web/lessons/diagramme/en/vb-klatschen-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/en/vb-knight-rider-loesung.visustruct b/web/lessons/diagramme/en/vb-knight-rider-loesung.visustruct deleted file mode 100644 index 11023bfe..00000000 --- a/web/lessons/diagramme/en/vb-knight-rider-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;32;48; - 105;45;45; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-konstante-wand-loesung.visustruct b/web/lessons/diagramme/en/vb-konstante-wand-loesung.visustruct deleted file mode 100644 index a3fd1d85..00000000 --- a/web/lessons/diagramme/en/vb-konstante-wand-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;68;73;83;84;65;78;67;69;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-l00-bausteine-loesung.visustruct b/web/lessons/diagramme/en/vb-l00-bausteine-loesung.visustruct deleted file mode 100644 index 124f0ff6..00000000 --- a/web/lessons/diagramme/en/vb-l00-bausteine-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-l00-sequenz-loesung.visustruct b/web/lessons/diagramme/en/vb-l00-sequenz-loesung.visustruct deleted file mode 100644 index d6c8354c..00000000 --- a/web/lessons/diagramme/en/vb-l00-sequenz-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/en/vb-l03-wachsend-loesung.visustruct b/web/lessons/diagramme/en/vb-l03-wachsend-loesung.visustruct deleted file mode 100644 index 9f4154f1..00000000 --- a/web/lessons/diagramme/en/vb-l03-wachsend-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - diff --git a/web/lessons/diagramme/en/vb-l06k-mit.visustruct b/web/lessons/diagramme/en/vb-l06k-mit.visustruct deleted file mode 100644 index 36bfc964..00000000 --- a/web/lessons/diagramme/en/vb-l06k-mit.visustruct +++ /dev/null @@ -1,25 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;68;73;83;84;65;78;67;69;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-l06k-ohne.visustruct b/web/lessons/diagramme/en/vb-l06k-ohne.visustruct deleted file mode 100644 index 5bd24605..00000000 --- a/web/lessons/diagramme/en/vb-l06k-ohne.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-l06n-einparkhilfe.visustruct b/web/lessons/diagramme/en/vb-l06n-einparkhilfe.visustruct deleted file mode 100644 index 5a30edf7..00000000 --- a/web/lessons/diagramme/en/vb-l06n-einparkhilfe.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;34;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;108;111;119;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;114;101;101;34;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-l21z-ausweichen.visustruct b/web/lessons/diagramme/en/vb-l21z-ausweichen.visustruct deleted file mode 100644 index 6e91129f..00000000 --- a/web/lessons/diagramme/en/vb-l21z-ausweichen.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;100;114;105;118;101;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50;48; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;100;114;105;118;101;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 115;116;97;116;101;32;61;32;34;116;117;114;110;34; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;116;97;116;101;32;61;32;34;100;114;105;118;101;34; - - - - - - diff --git a/web/lessons/diagramme/en/vb-labyrinth-loesung.visustruct b/web/lessons/diagramme/en/vb-labyrinth-loesung.visustruct deleted file mode 100644 index ba2defc6..00000000 --- a/web/lessons/diagramme/en/vb-labyrinth-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/en/vb-laufschrift-loesung.visustruct b/web/lessons/diagramme/en/vb-laufschrift-loesung.visustruct deleted file mode 100644 index bb8c77d1..00000000 --- a/web/lessons/diagramme/en/vb-laufschrift-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;32;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;100;46;99;104;97;114;65;116;40;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct b/web/lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct deleted file mode 100644 index 8e5c7464..00000000 --- a/web/lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/en/vb-linienmuster-loesung.visustruct b/web/lessons/diagramme/en/vb-linienmuster-loesung.visustruct deleted file mode 100644 index c25e550b..00000000 --- a/web/lessons/diagramme/en/vb-linienmuster-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;114;111;115;115;32;108;105;110;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - diff --git a/web/lessons/diagramme/en/vb-meister-platz-loesung.visustruct b/web/lessons/diagramme/en/vb-meister-platz-loesung.visustruct deleted file mode 100644 index 353b2534..00000000 --- a/web/lessons/diagramme/en/vb-meister-platz-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;97;114;116;104;101;115;116;58;32;34;32;43;32;109;97;120;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-melodie-loesung.visustruct b/web/lessons/diagramme/en/vb-melodie-loesung.visustruct deleted file mode 100644 index fe45889f..00000000 --- a/web/lessons/diagramme/en/vb-melodie-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;91;93;32;116;111;110;101;115;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;111;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;116;111;110;101;115;91;105;93;44;32;51;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-messreihe-loesung.visustruct b/web/lessons/diagramme/en/vb-messreihe-loesung.visustruct deleted file mode 100644 index 2698ac48..00000000 --- a/web/lessons/diagramme/en/vb-messreihe-loesung.visustruct +++ /dev/null @@ -1,38 +0,0 @@ - - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 118;97;108;117;101;115;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;118;97;108;117;101;115;91;105;93; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;41; - - diff --git a/web/lessons/diagramme/en/vb-morsen-loesung.visustruct b/web/lessons/diagramme/en/vb-morsen-loesung.visustruct deleted file mode 100644 index baac3335..00000000 --- a/web/lessons/diagramme/en/vb-morsen-loesung.visustruct +++ /dev/null @@ -1,66 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;54;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/en/vb-nachtlicht-loesung.visustruct b/web/lessons/diagramme/en/vb-nachtlicht-loesung.visustruct deleted file mode 100644 index a949bf3e..00000000 --- a/web/lessons/diagramme/en/vb-nachtlicht-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;53;53;44;32;50;53;53;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct b/web/lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct deleted file mode 100644 index cc286ed3..00000000 --- a/web/lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; - - diff --git a/web/lessons/diagramme/en/vb-notbremse-loesung.visustruct b/web/lessons/diagramme/en/vb-notbremse-loesung.visustruct deleted file mode 100644 index 990cf19a..00000000 --- a/web/lessons/diagramme/en/vb-notbremse-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-oder-loesung.visustruct b/web/lessons/diagramme/en/vb-oder-loesung.visustruct deleted file mode 100644 index 85324cdf..00000000 --- a/web/lessons/diagramme/en/vb-oder-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41;32;124;124;32;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/en/vb-quadrat-loesung.visustruct b/web/lessons/diagramme/en/vb-quadrat-loesung.visustruct deleted file mode 100644 index bec34a5a..00000000 --- a/web/lessons/diagramme/en/vb-quadrat-loesung.visustruct +++ /dev/null @@ -1,75 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - diff --git a/web/lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct b/web/lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct deleted file mode 100644 index c8f98385..00000000 --- a/web/lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 115;113;117;97;114;101;40;51;48;41; - - - 115;113;117;97;114;101;40;53;48;41; - - diff --git a/web/lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct b/web/lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct deleted file mode 100644 index b3d6af97..00000000 --- a/web/lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct +++ /dev/null @@ -1,55 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - diff --git a/web/lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct b/web/lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct deleted file mode 100644 index ccc90b31..00000000 --- a/web/lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct b/web/lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct deleted file mode 100644 index e0f4e19a..00000000 --- a/web/lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;53; - 106;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-rand-loesung.visustruct b/web/lessons/diagramme/en/vb-rand-loesung.visustruct deleted file mode 100644 index c1c0ac7e..00000000 --- a/web/lessons/diagramme/en/vb-rand-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - diff --git a/web/lessons/diagramme/en/vb-schraeglage-loesung.visustruct b/web/lessons/diagramme/en/vb-schraeglage-loesung.visustruct deleted file mode 100644 index 0ef75ac0..00000000 --- a/web/lessons/diagramme/en/vb-schraeglage-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;51;48;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/en/vb-schritte-welt-loesung.visustruct b/web/lessons/diagramme/en/vb-schritte-welt-loesung.visustruct deleted file mode 100644 index 63fa86cd..00000000 --- a/web/lessons/diagramme/en/vb-schritte-welt-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115;41; - - diff --git a/web/lessons/diagramme/en/vb-slalom-loesung.visustruct b/web/lessons/diagramme/en/vb-slalom-loesung.visustruct deleted file mode 100644 index 885ff4a4..00000000 --- a/web/lessons/diagramme/en/vb-slalom-loesung.visustruct +++ /dev/null @@ -1,52 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-spirale-falsch-loesung.visustruct b/web/lessons/diagramme/en/vb-spirale-falsch-loesung.visustruct deleted file mode 100644 index 9f4154f1..00000000 --- a/web/lessons/diagramme/en/vb-spirale-falsch-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - diff --git a/web/lessons/diagramme/en/vb-spirale-falsch-start.visustruct b/web/lessons/diagramme/en/vb-spirale-falsch-start.visustruct deleted file mode 100644 index b1826439..00000000 --- a/web/lessons/diagramme/en/vb-spirale-falsch-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-spirale-loesung.visustruct b/web/lessons/diagramme/en/vb-spirale-loesung.visustruct deleted file mode 100644 index 7f972ce7..00000000 --- a/web/lessons/diagramme/en/vb-spirale-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;56; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;105;32;42;32;49;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-start-a-loesung.visustruct b/web/lessons/diagramme/en/vb-start-a-loesung.visustruct deleted file mode 100644 index 1f22c3d1..00000000 --- a/web/lessons/diagramme/en/vb-start-a-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/en/vb-startsignal-loesung.visustruct b/web/lessons/diagramme/en/vb-startsignal-loesung.visustruct deleted file mode 100644 index 8dbf8eaf..00000000 --- a/web/lessons/diagramme/en/vb-startsignal-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;61;32;51; - 114;117;110;100;101;43;43; - - - 114;117;110;100;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;79;110;32;121;111;117;114;32;109;97;114;107;115;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;116;32;115;101;116;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - diff --git a/web/lessons/diagramme/en/vb-strecke-anzeigen-loesung.visustruct b/web/lessons/diagramme/en/vb-strecke-anzeigen-loesung.visustruct deleted file mode 100644 index 39aa8985..00000000 --- a/web/lessons/diagramme/en/vb-strecke-anzeigen-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;101;110;103;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;119;105;100;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;50;32;42;32;108;101;110;103;116;104;32;43;32;50;32;42;32;119;105;100;116;104; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-tempo-abstand-loesung.visustruct b/web/lessons/diagramme/en/vb-tempo-abstand-loesung.visustruct deleted file mode 100644 index 5e76eef7..00000000 --- a/web/lessons/diagramme/en/vb-tempo-abstand-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-tonleiter-loesung.visustruct b/web/lessons/diagramme/en/vb-tonleiter-loesung.visustruct deleted file mode 100644 index ab95a780..00000000 --- a/web/lessons/diagramme/en/vb-tonleiter-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;57;52;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;51;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;52;57;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/en/vb-treppe-loesung.visustruct b/web/lessons/diagramme/en/vb-treppe-loesung.visustruct deleted file mode 100644 index 40845b7e..00000000 --- a/web/lessons/diagramme/en/vb-treppe-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-tunnel-loesung.visustruct b/web/lessons/diagramme/en/vb-tunnel-loesung.visustruct deleted file mode 100644 index 7e6d8fe8..00000000 --- a/web/lessons/diagramme/en/vb-tunnel-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;32;108;101;102;116;32;61;32;57;57; - - - 105;110;116;32;114;105;103;104;116;32;61;32;57;57; - - - 108;101;102;116;32;62;61;32;50;48;32;124;124;32;114;105;103;104;116;32;62;61;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 108;101;102;116;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 114;105;103;104;116;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-ueberladung-umdrehung-loesung.visustruct b/web/lessons/diagramme/en/vb-ueberladung-umdrehung-loesung.visustruct deleted file mode 100644 index 1ca9ed45..00000000 --- a/web/lessons/diagramme/en/vb-ueberladung-umdrehung-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-und-loesung.visustruct b/web/lessons/diagramme/en/vb-und-loesung.visustruct deleted file mode 100644 index 975a49dc..00000000 --- a/web/lessons/diagramme/en/vb-und-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/en/vb-variable-seite-loesung.visustruct b/web/lessons/diagramme/en/vb-variable-seite-loesung.visustruct deleted file mode 100644 index cc5a5268..00000000 --- a/web/lessons/diagramme/en/vb-variable-seite-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;115;105;100;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct b/web/lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct deleted file mode 100644 index f0dafc40..00000000 --- a/web/lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;52; - 106;43;43; - - - 105;110;116;32;107;32;61;32;48; - 107;32;60;32;53; - 107;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-wald-loesung.visustruct b/web/lessons/diagramme/en/vb-wald-loesung.visustruct deleted file mode 100644 index 0de1caa5..00000000 --- a/web/lessons/diagramme/en/vb-wald-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/en/vb-wand-vorn-loesung.visustruct b/web/lessons/diagramme/en/vb-wand-vorn-loesung.visustruct deleted file mode 100644 index 07622693..00000000 --- a/web/lessons/diagramme/en/vb-wand-vorn-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/en/vb-wurde-es-dunkel-loesung.visustruct b/web/lessons/diagramme/en/vb-wurde-es-dunkel-loesung.visustruct deleted file mode 100644 index 68ae8a5c..00000000 --- a/web/lessons/diagramme/en/vb-wurde-es-dunkel-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;100;97;114;107;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 100;97;114;107;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 100;97;114;107; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;116;32;119;97;115;32;100;97;114;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;119;97;121;115;32;98;114;105;103;104;116;34;41; - - - - diff --git a/web/lessons/diagramme/en/vb-zentimeter-loesung.visustruct b/web/lessons/diagramme/en/vb-zentimeter-loesung.visustruct deleted file mode 100644 index 56306e9b..00000000 --- a/web/lessons/diagramme/en/vb-zentimeter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;99;101;110;116;105;109;101;116;114;101;115;40;51;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;100;105;115;116;97;110;99;101;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/en/vb-zentimeter-unterprogramm-loesung.visustruct b/web/lessons/diagramme/en/vb-zentimeter-unterprogramm-loesung.visustruct deleted file mode 100644 index 983acbf4..00000000 --- a/web/lessons/diagramme/en/vb-zentimeter-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 114;101;116;117;114;110;32;114;111;116;97;116;105;111;110;115;32;42;32;50;48; - - diff --git a/web/lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct b/web/lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct deleted file mode 100644 index 68d640e4..00000000 --- a/web/lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;84;105;109;101;114;40;41;32;60;32;50; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/en/zk-initialen-loesung.visustruct b/web/lessons/diagramme/en/zk-initialen-loesung.visustruct deleted file mode 100644 index b29508f7..00000000 --- a/web/lessons/diagramme/en/zk-initialen-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;78;97;109;101;32;34;70;105;114;115;116;32;110;97;109;101;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;78;97;109;101;32;34;76;97;115;116;32;110;97;109;101;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/en/zk-mehr.visustruct b/web/lessons/diagramme/en/zk-mehr.visustruct deleted file mode 100644 index de73dfda..00000000 --- a/web/lessons/diagramme/en/zk-mehr.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;110;100;101;120;79;102;40;34;108;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;108;97;115;116;73;110;100;101;120;79;102;40;34;108;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;66;73;76;76;89;71;79;65;84;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;114;101;112;108;97;99;101;40;34;66;105;108;108;121;34;44;32;34;78;97;110;110;121;34;41; - - - 111;117;116;112;117;116;58;32;34;66;97;97;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;97;103;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;97;103;101;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;97;103;101;41;32;43;32;34;32;121;101;97;114;115;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - diff --git a/web/lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct deleted file mode 100644 index 19cb5586..00000000 --- a/web/lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; - - - 83;116;114;105;110;103;32;98;97;99;107;119;97;114;100;115;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 98;97;99;107;119;97;114;100;115;32;61;32;98;97;99;107;119;97;114;100;115;32;43;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;98;97;99;107;119;97;114;100;115; - - diff --git a/web/lessons/diagramme/en/zk-split.visustruct b/web/lessons/diagramme/en/zk-split.visustruct deleted file mode 100644 index 72e0d231..00000000 --- a/web/lessons/diagramme/en/zk-split.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;76;117;100;119;105;103;59;98;105;108;108;121;32;103;111;97;116;59;55;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;114;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;112;97;114;116;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/en/zk-woerter-loesung.visustruct b/web/lessons/diagramme/en/zk-woerter-loesung.visustruct deleted file mode 100644 index 7a3ec793..00000000 --- a/web/lessons/diagramme/en/zk-woerter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;110;116;101;110;99;101;32;34;69;110;116;101;114;32;97;32;115;101;110;116;101;110;99;101;34; - - - 83;116;114;105;110;103;91;93;32;119;111;114;100;115;32;61;32;115;101;110;116;101;110;99;101;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;87;111;114;100;115;58;32;34;32;43;32;119;111;114;100;115;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/en/zk-zaehlen.visustruct b/web/lessons/diagramme/en/zk-zaehlen.visustruct deleted file mode 100644 index 353fc38e..00000000 --- a/web/lessons/diagramme/en/zk-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 119;111;114;100;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;101;39; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;78;117;109;98;101;114;32;111;102;32;101;58;32;34;32;43;32;99;111;117;110;116; - - diff --git a/web/lessons/diagramme/en/zk-zeichen.visustruct b/web/lessons/diagramme/en/zk-zeichen.visustruct deleted file mode 100644 index 2801bbde..00000000 --- a/web/lessons/diagramme/en/zk-zeichen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;48;44;32;53;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;53;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;110;100;101;120;79;102;40;34;103;111;97;116;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - diff --git a/web/lessons/diagramme/kino-einmaleins-loesung.visustruct b/web/lessons/diagramme/kino-einmaleins-loesung.visustruct deleted file mode 100644 index f7549528..00000000 --- a/web/lessons/diagramme/kino-einmaleins-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;116;97;98;101;108;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;101;108;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;101;108;108;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;101;108;108;101;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;32;40;49;32;98;105;115;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;32;40;49;32;98;105;115;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/kino-frei-loesung.visustruct b/web/lessons/diagramme/kino-frei-loesung.visustruct deleted file mode 100644 index da83706e..00000000 --- a/web/lessons/diagramme/kino-frei-loesung.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;114;101;105;32;61;32;48; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;115;105;116;122;101;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 105;110;116;32;112;108;97;116;122;32;61;32;48; - 112;108;97;116;122;32;60;32;115;105;116;122;101;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 112;108;97;116;122;43;43; - - - 33;115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 102;114;101;105;32;61;32;102;114;101;105;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;105;58;32;34;32;43;32;102;114;101;105; - - diff --git a/web/lessons/diagramme/kino-frei-start.visustruct b/web/lessons/diagramme/kino-frei-start.visustruct deleted file mode 100644 index 566b4520..00000000 --- a/web/lessons/diagramme/kino-frei-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;50;93;91;51;93;32;61;32;116;114;117;101; - - diff --git a/web/lessons/diagramme/kino-karte-loesung.visustruct b/web/lessons/diagramme/kino-karte-loesung.visustruct deleted file mode 100644 index d8d27e81..00000000 --- a/web/lessons/diagramme/kino-karte-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;82;101;105;104;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;112;108;97;116;122;32;34;80;108;97;116;122;34; - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 111;117;116;112;117;116;58;32;34;83;99;104;111;110;32;118;101;114;107;97;117;102;116;34; - - - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;86;101;114;107;97;117;102;116;58;32;82;101;105;104;101;32;34;32;43;32;114;101;105;104;101;32;43;32;34;44;32;80;108;97;116;122;32;34;32;43;32;112;108;97;116;122; - - - - diff --git a/web/lessons/diagramme/kino-karte-start.visustruct b/web/lessons/diagramme/kino-karte-start.visustruct deleted file mode 100644 index f9a257e6..00000000 --- a/web/lessons/diagramme/kino-karte-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;82;101;105;104;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;112;108;97;116;122;32;34;80;108;97;116;122;34; - - diff --git a/web/lessons/diagramme/kino-saalplan.visustruct b/web/lessons/diagramme/kino-saalplan.visustruct deleted file mode 100644 index 6898beaa..00000000 --- a/web/lessons/diagramme/kino-saalplan.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;115;105;116;122;101;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;34; - - - 105;110;116;32;112;108;97;116;122;32;61;32;48; - 112;108;97;116;122;32;60;32;115;105;116;122;101;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 112;108;97;116;122;43;43; - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;88;34; - - - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - diff --git a/web/lessons/diagramme/kino-verkaufen.visustruct b/web/lessons/diagramme/kino-verkaufen.visustruct deleted file mode 100644 index cf1d33d5..00000000 --- a/web/lessons/diagramme/kino-verkaufen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;82;101;105;104;101;110;58;32;34;32;43;32;115;105;116;122;101;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;80;108;228;116;122;101;32;112;114;111;32;82;101;105;104;101;58;32;34;32;43;32;115;105;116;122;101;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;82;101;105;104;101;32;49;44;32;80;108;97;116;122;32;50;32;118;101;114;107;97;117;102;116;63;32;34;32;43;32;115;105;116;122;101;91;49;93;91;50;93; - - diff --git a/web/lessons/diagramme/l04-gross-klein-loesung.visustruct b/web/lessons/diagramme/l04-gross-klein-loesung.visustruct deleted file mode 100644 index e2f906ab..00000000 --- a/web/lessons/diagramme/l04-gross-klein-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 105;110;116;32;90;97;104;108;32;61;32;54; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;90;97;104;108; - - - 111;117;116;112;117;116;58;32;34;69;114;103;101;98;110;105;115;58;32;34;32;43;32;101;114;103;101;98;110;105;115; - - diff --git a/web/lessons/diagramme/l04-gross-klein-start.visustruct b/web/lessons/diagramme/l04-gross-klein-start.visustruct deleted file mode 100644 index 6888d8ea..00000000 --- a/web/lessons/diagramme/l04-gross-klein-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 105;110;116;32;90;97;104;108;32;61;32;54; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;90;65;72;76; - - - 111;117;116;112;117;116;58;32;34;69;114;103;101;98;110;105;115;58;32;34;32;43;32;101;114;103;101;98;110;105;115; - - diff --git a/web/lessons/diagramme/l04-java-fehler-loesung.visustruct b/web/lessons/diagramme/l04-java-fehler-loesung.visustruct deleted file mode 100644 index d3380a78..00000000 --- a/web/lessons/diagramme/l04-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/l04-java-fehler-start.visustruct b/web/lessons/diagramme/l04-java-fehler-start.visustruct deleted file mode 100644 index fdd86a60..00000000 --- a/web/lessons/diagramme/l04-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/l04-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l04-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 28528731..00000000 --- a/web/lessons/diagramme/l04-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - diff --git a/web/lessons/diagramme/l04-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l04-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 0b0c5f6a..00000000 --- a/web/lessons/diagramme/l04-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;65;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34;41; - - diff --git a/web/lessons/diagramme/l04-java-steckbrief-loesung.visustruct b/web/lessons/diagramme/l04-java-steckbrief-loesung.visustruct deleted file mode 100644 index fa64abcf..00000000 --- a/web/lessons/diagramme/l04-java-steckbrief-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 100;111;117;98;108;101;32;103;114;111;101;115;115;101;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - - 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/l04-rechnen.visustruct b/web/lessons/diagramme/l04-rechnen.visustruct deleted file mode 100644 index cd0d36a8..00000000 --- a/web/lessons/diagramme/l04-rechnen.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - diff --git a/web/lessons/diagramme/l04-reihenfolge-loesung.visustruct b/web/lessons/diagramme/l04-reihenfolge-loesung.visustruct deleted file mode 100644 index 21a9fac3..00000000 --- a/web/lessons/diagramme/l04-reihenfolge-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;52; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - diff --git a/web/lessons/diagramme/l04-reihenfolge-start.visustruct b/web/lessons/diagramme/l04-reihenfolge-start.visustruct deleted file mode 100644 index 1c43ff05..00000000 --- a/web/lessons/diagramme/l04-reihenfolge-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;52; - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; - - diff --git a/web/lessons/diagramme/l04-tauschen-loesung.visustruct b/web/lessons/diagramme/l04-tauschen-loesung.visustruct deleted file mode 100644 index 4376ee6e..00000000 --- a/web/lessons/diagramme/l04-tauschen-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; - - - 83;116;114;105;110;103;32;114;101;99;104;116;115;32;61;32;34;87;97;115;115;101;114;34; - - - 83;116;114;105;110;103;32;104;105;108;102;32;61;32;108;105;110;107;115; - - - 108;105;110;107;115;32;61;32;114;101;99;104;116;115; - - - 114;101;99;104;116;115;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;76;105;110;107;115;58;32;34;32;43;32;108;105;110;107;115; - - - 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; - - diff --git a/web/lessons/diagramme/l04-tauschen-start.visustruct b/web/lessons/diagramme/l04-tauschen-start.visustruct deleted file mode 100644 index 675b73f6..00000000 --- a/web/lessons/diagramme/l04-tauschen-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; - - - 83;116;114;105;110;103;32;114;101;99;104;116;115;32;61;32;34;87;97;115;115;101;114;34; - - - 111;117;116;112;117;116;58;32;34;76;105;110;107;115;58;32;34;32;43;32;108;105;110;107;115; - - - 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; - - diff --git a/web/lessons/diagramme/l04-tauschen.visustruct b/web/lessons/diagramme/l04-tauschen.visustruct deleted file mode 100644 index 990611d9..00000000 --- a/web/lessons/diagramme/l04-tauschen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/l05-datentypen.visustruct b/web/lessons/diagramme/l05-datentypen.visustruct deleted file mode 100644 index c7309f40..00000000 --- a/web/lessons/diagramme/l05-datentypen.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;52; - - - 100;111;117;98;108;101;32;103;114;111;101;115;115;101;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;77;105;97;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - - 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/l05-division.visustruct b/web/lessons/diagramme/l05-division.visustruct deleted file mode 100644 index 116cec6f..00000000 --- a/web/lessons/diagramme/l05-division.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;49;51;53; - - - 105;110;116;32;115;116;117;110;100;101;110;32;61;32;109;105;110;117;116;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;109;105;110;117;116;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;115;116;117;110;100;101;110;32;43;32;34;32;83;116;117;110;100;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;77;105;110;117;116;101;110;34; - - diff --git a/web/lessons/diagramme/l05-einkauf-loesung.visustruct b/web/lessons/diagramme/l05-einkauf-loesung.visustruct deleted file mode 100644 index 35de6502..00000000 --- a/web/lessons/diagramme/l05-einkauf-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;101;105;115;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;80;114;101;105;115;32;61;32;97;110;122;97;104;108;32;42;32;112;114;101;105;115; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116;80;114;101;105;115;32;43;32;34;32;69;117;114;111;34; - - diff --git a/web/lessons/diagramme/l05-java-fehler-loesung.visustruct b/web/lessons/diagramme/l05-java-fehler-loesung.visustruct deleted file mode 100644 index bbf789a5..00000000 --- a/web/lessons/diagramme/l05-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; - - - 105;110;116;32;112;114;101;105;115;32;61;32;55; - - - 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; - - - 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; - - diff --git a/web/lessons/diagramme/l05-java-fehler-start.visustruct b/web/lessons/diagramme/l05-java-fehler-start.visustruct deleted file mode 100644 index 84a28ed4..00000000 --- a/web/lessons/diagramme/l05-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; - - - 105;110;116;32;112;114;101;105;115;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; - - - 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; - - diff --git a/web/lessons/diagramme/l05-java-kino-loesung.visustruct b/web/lessons/diagramme/l05-java-kino-loesung.visustruct deleted file mode 100644 index 7be38767..00000000 --- a/web/lessons/diagramme/l05-java-kino-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;114;101;105;115;32;61;32;57; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;112;114;101;105;115;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - diff --git a/web/lessons/diagramme/l05-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l05-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 1e053fec..00000000 --- a/web/lessons/diagramme/l05-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;116;117;101;99;107;101;32;61;32;56; - - - 105;110;116;32;112;101;114;115;111;110;101;110;32;61;32;52; - - - 105;110;116;32;112;114;111;80;101;114;115;111;110;32;61;32;115;116;117;101;99;107;101;32;47;32;112;101;114;115;111;110;101;110; - - - 111;117;116;112;117;116;58;32;34;74;101;100;101;114;32;98;101;107;111;109;109;116;32;34;32;43;32;112;114;111;80;101;114;115;111;110;32;43;32;34;32;83;116;252;99;107;101;46;34; - - diff --git a/web/lessons/diagramme/l05-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l05-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 4a751c92..00000000 --- a/web/lessons/diagramme/l05-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;116;117;101;99;107;101;32;61;32;56; - - - 105;110;116;32;112;101;114;115;111;110;101;110;32;61;32;52; - - - 105;110;116;32;112;114;111;80;101;114;115;111;110;32;61;32;115;116;117;101;99;107;101;32;47;32;112;101;114;115;111;110;101;110; - - - 111;117;116;112;117;116;58;32;34;74;101;100;101;114;32;98;101;107;111;109;109;116;32;34;32;43;32;112;114;111;112;101;114;115;111;110;32;43;32;34;32;83;116;252;99;107;101;46;34; - - diff --git a/web/lessons/diagramme/l05-rechteck-loesung.visustruct b/web/lessons/diagramme/l05-rechteck-loesung.visustruct deleted file mode 100644 index 4f32d414..00000000 --- a/web/lessons/diagramme/l05-rechteck-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;55; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;52; - - - 105;110;116;32;102;108;97;101;99;104;101;32;61;32;108;97;101;110;103;101;32;42;32;98;114;101;105;116;101; - - - 105;110;116;32;117;109;102;97;110;103;32;61;32;50;32;42;32;40;108;97;101;110;103;101;32;43;32;98;114;101;105;116;101;41; - - - 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102;108;97;101;99;104;101; - - - 111;117;116;112;117;116;58;32;34;85;109;102;97;110;103;58;32;34;32;43;32;117;109;102;97;110;103; - - diff --git a/web/lessons/diagramme/l05-sekunden-loesung.visustruct b/web/lessons/diagramme/l05-sekunden-loesung.visustruct deleted file mode 100644 index 92d4d865..00000000 --- a/web/lessons/diagramme/l05-sekunden-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; - - diff --git a/web/lessons/diagramme/l05-sekunden-start.visustruct b/web/lessons/diagramme/l05-sekunden-start.visustruct deleted file mode 100644 index 0899268f..00000000 --- a/web/lessons/diagramme/l05-sekunden-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; - - diff --git a/web/lessons/diagramme/l05-sequenz.visustruct b/web/lessons/diagramme/l05-sequenz.visustruct deleted file mode 100644 index 415fd4d4..00000000 --- a/web/lessons/diagramme/l05-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;53; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51; - - - 105;110;116;32;102;108;97;101;99;104;101;32;61;32;108;97;101;110;103;101;32;42;32;98;114;101;105;116;101; - - - 111;117;116;112;117;116;58;32;102;108;97;101;99;104;101; - - diff --git a/web/lessons/diagramme/l06-begruessung-loesung.visustruct b/web/lessons/diagramme/l06-begruessung-loesung.visustruct deleted file mode 100644 index 5ec8cc19..00000000 --- a/web/lessons/diagramme/l06-begruessung-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; - - diff --git a/web/lessons/diagramme/l06-eva.visustruct b/web/lessons/diagramme/l06-eva.visustruct deleted file mode 100644 index c1a79f58..00000000 --- a/web/lessons/diagramme/l06-eva.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l06-java-fehler-loesung.visustruct b/web/lessons/diagramme/l06-java-fehler-loesung.visustruct deleted file mode 100644 index 3a0494e4..00000000 --- a/web/lessons/diagramme/l06-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;40;97;32;43;32;98;41; - - diff --git a/web/lessons/diagramme/l06-java-fehler-start.visustruct b/web/lessons/diagramme/l06-java-fehler-start.visustruct deleted file mode 100644 index 6b2a18bd..00000000 --- a/web/lessons/diagramme/l06-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;97;32;43;32;98; - - diff --git a/web/lessons/diagramme/l06-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l06-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 060902e2..00000000 --- a/web/lessons/diagramme/l06-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;228;99;104;115;116;101;115;32;74;97;104;114;32;98;105;115;116;32;100;117;32;34;32;43;32;40;97;108;116;101;114;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/l06-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l06-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 03658422..00000000 --- a/web/lessons/diagramme/l06-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;228;99;104;115;116;101;115;32;74;97;104;114;32;98;105;115;116;32;100;117;32;34;32;43;32;40;65;108;116;101;114;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/l06-java-tage-loesung.visustruct b/web/lessons/diagramme/l06-java-tage-loesung.visustruct deleted file mode 100644 index 566b02ae..00000000 --- a/web/lessons/diagramme/l06-java-tage-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;101;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 105;110;116;32;116;97;103;101;32;61;32;106;97;104;114;101;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;115;105;110;100;32;101;116;119;97;32;34;32;43;32;116;97;103;101;32;43;32;34;32;84;97;103;101;46;34; - - diff --git a/web/lessons/diagramme/l06-mittelwert-loesung.visustruct b/web/lessons/diagramme/l06-mittelwert-loesung.visustruct deleted file mode 100644 index b08f004a..00000000 --- a/web/lessons/diagramme/l06-mittelwert-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108; - - diff --git a/web/lessons/diagramme/l06-rechner-loesung.visustruct b/web/lessons/diagramme/l06-rechner-loesung.visustruct deleted file mode 100644 index 9900f0cb..00000000 --- a/web/lessons/diagramme/l06-rechner-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;107;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;107;116;58;32;34;32;43;32;112;114;111;100;117;107;116; - - diff --git a/web/lessons/diagramme/l07-alter-pruefen.visustruct b/web/lessons/diagramme/l07-alter-pruefen.visustruct deleted file mode 100644 index 1465a7a5..00000000 --- a/web/lessons/diagramme/l07-alter-pruefen.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;105;115;116;32;118;111;108;108;106;228;104;114;105;103;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;105;115;116;32;110;111;99;104;32;110;105;99;104;116;32;118;111;108;108;106;228;104;114;105;103;46;34; - - - - diff --git a/web/lessons/diagramme/l07-betrag-loesung.visustruct b/web/lessons/diagramme/l07-betrag-loesung.visustruct deleted file mode 100644 index e50936bc..00000000 --- a/web/lessons/diagramme/l07-betrag-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; - - - 122;97;104;108;32;60;32;48; - - - 122;97;104;108;32;61;32;48;32;45;32;122;97;104;108; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - diff --git a/web/lessons/diagramme/l07-gerade-loesung.visustruct b/web/lessons/diagramme/l07-gerade-loesung.visustruct deleted file mode 100644 index c872e462..00000000 --- a/web/lessons/diagramme/l07-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;103;101;114;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;101;114;97;100;101;34; - - - - diff --git a/web/lessons/diagramme/l07-java-fehler-loesung.visustruct b/web/lessons/diagramme/l07-java-fehler-loesung.visustruct deleted file mode 100644 index aad15b91..00000000 --- a/web/lessons/diagramme/l07-java-fehler-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;53; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - diff --git a/web/lessons/diagramme/l07-java-fehler-start.visustruct b/web/lessons/diagramme/l07-java-fehler-start.visustruct deleted file mode 100644 index 7c8b52da..00000000 --- a/web/lessons/diagramme/l07-java-fehler-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;53; - - - 112;117;110;107;116;101;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - diff --git a/web/lessons/diagramme/l07-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l07-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 0ec83a9a..00000000 --- a/web/lessons/diagramme/l07-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - diff --git a/web/lessons/diagramme/l07-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l07-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 436bf3d4..00000000 --- a/web/lessons/diagramme/l07-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - diff --git a/web/lessons/diagramme/l07-java-pizza-loesung.visustruct b/web/lessons/diagramme/l07-java-pizza-loesung.visustruct deleted file mode 100644 index dd5c9bbd..00000000 --- a/web/lessons/diagramme/l07-java-pizza-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;101;105;115;32;61;32;56; - - - 105;110;116;32;107;97;101;115;101;32;61;32;50; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;40;112;114;101;105;115;32;43;32;107;97;101;115;101;41;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - diff --git a/web/lessons/diagramme/l07-java-pizza-start.visustruct b/web/lessons/diagramme/l07-java-pizza-start.visustruct deleted file mode 100644 index 71f8f387..00000000 --- a/web/lessons/diagramme/l07-java-pizza-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;101;105;115;32;61;32;56; - - - 105;110;116;32;107;97;101;115;101;32;61;32;50; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;112;114;101;105;115;32;43;32;107;97;101;115;101;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - diff --git a/web/lessons/diagramme/l07-maximum-loesung.visustruct b/web/lessons/diagramme/l07-maximum-loesung.visustruct deleted file mode 100644 index 93a51295..00000000 --- a/web/lessons/diagramme/l07-maximum-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - diff --git a/web/lessons/diagramme/l07-rabatt.visustruct b/web/lessons/diagramme/l07-rabatt.visustruct deleted file mode 100644 index 361f9cce..00000000 --- a/web/lessons/diagramme/l07-rabatt.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;105;115;32;34;80;114;101;105;115;32;105;110;32;69;117;114;111;63;34; - - - 112;114;101;105;115;32;62;32;53;48; - - - 112;114;101;105;115;32;61;32;112;114;101;105;115;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;90;117;32;122;97;104;108;101;110;58;32;34;32;43;32;112;114;101;105;115;32;43;32;34;32;69;117;114;111;34; - - diff --git a/web/lessons/diagramme/l08-gueltig-loesung.visustruct b/web/lessons/diagramme/l08-gueltig-loesung.visustruct deleted file mode 100644 index bf26ecc6..00000000 --- a/web/lessons/diagramme/l08-gueltig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; - - - 110;111;116;101;32;62;61;32;49;32;38;38;32;110;111;116;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;103;252;108;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;252;108;116;105;103;34; - - - - diff --git a/web/lessons/diagramme/l08-java-bestanden-loesung.visustruct b/web/lessons/diagramme/l08-java-bestanden-loesung.visustruct deleted file mode 100644 index cacba37f..00000000 --- a/web/lessons/diagramme/l08-java-bestanden-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;112;117;110;107;116;101;32;34;87;105;101;32;118;105;101;108;101;32;80;117;110;107;116;101;63;34; - - - 112;117;110;107;116;101;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;98;101;115;116;97;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;110;105;99;104;116;32;98;101;115;116;97;110;100;101;110;34; - - - - diff --git a/web/lessons/diagramme/l08-java-fehler-loesung.visustruct b/web/lessons/diagramme/l08-java-fehler-loesung.visustruct deleted file mode 100644 index 261b7255..00000000 --- a/web/lessons/diagramme/l08-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;69;117;114;111;34; - - - - diff --git a/web/lessons/diagramme/l08-java-fehler-start.visustruct b/web/lessons/diagramme/l08-java-fehler-start.visustruct deleted file mode 100644 index b2687615..00000000 --- a/web/lessons/diagramme/l08-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;69;117;114;111;34; - - - - diff --git a/web/lessons/diagramme/l08-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l08-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 698dac33..00000000 --- a/web/lessons/diagramme/l08-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;53; - - - 97;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;108;97;115;115;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;69;105;110;108;97;115;115;34; - - - - diff --git a/web/lessons/diagramme/l08-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l08-java-laeuft-nicht-start.visustruct deleted file mode 100644 index f94df1e8..00000000 --- a/web/lessons/diagramme/l08-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;53; - - - 65;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;108;97;115;115;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;69;105;110;108;97;115;115;34; - - - - diff --git a/web/lessons/diagramme/l08-jugendticket.visustruct b/web/lessons/diagramme/l08-jugendticket.visustruct deleted file mode 100644 index fb1ab7da..00000000 --- a/web/lessons/diagramme/l08-jugendticket.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;50;32;38;38;32;97;108;116;101;114;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;74;117;103;101;110;100;116;105;99;107;101;116;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;74;117;103;101;110;100;116;105;99;107;101;116;34; - - - - diff --git a/web/lessons/diagramme/l08-note.visustruct b/web/lessons/diagramme/l08-note.visustruct deleted file mode 100644 index c7525b9b..00000000 --- a/web/lessons/diagramme/l08-note.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; - - - 110;111;116;101;32;60;32;49;32;124;124;32;110;111;116;101;32;62;32;54; - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;78;111;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;101;32;34;32;43;32;110;111;116;101;32;43;32;34;32;105;115;116;32;103;252;108;116;105;103;46;34; - - - - diff --git a/web/lessons/diagramme/l08-schaltjahr-loesung.visustruct b/web/lessons/diagramme/l08-schaltjahr-loesung.visustruct deleted file mode 100644 index 67f92162..00000000 --- a/web/lessons/diagramme/l08-schaltjahr-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;32;34;74;97;104;114;63;34; - - - 40;106;97;104;114;32;37;32;52;32;61;61;32;48;32;38;38;32;106;97;104;114;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;106;97;104;114;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;83;99;104;97;108;116;106;97;104;114;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;105;110;32;83;99;104;97;108;116;106;97;104;114;34; - - - - diff --git a/web/lessons/diagramme/l08-wochenende-loesung.visustruct b/web/lessons/diagramme/l08-wochenende-loesung.visustruct deleted file mode 100644 index 86550145..00000000 --- a/web/lessons/diagramme/l08-wochenende-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;101;110;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;87;101;114;107;116;97;103;34; - - - - diff --git a/web/lessons/diagramme/l09-ampel.visustruct b/web/lessons/diagramme/l09-ampel.visustruct deleted file mode 100644 index ee5cd3f7..00000000 --- a/web/lessons/diagramme/l09-ampel.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;97;114;98;101;32;34;87;101;108;99;104;101;32;70;97;114;98;101;32;104;97;116;32;100;105;101;32;65;109;112;101;108;63;34; - - - 102;97;114;98;101; - - - 111;117;116;112;117;116;58;32;34;83;116;101;104;101;110;32;98;108;101;105;98;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;114;116;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;71;101;104;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;70;97;114;98;101;32;107;101;110;110;101;32;105;99;104;32;110;105;99;104;116;46;34; - - - - diff --git a/web/lessons/diagramme/l09-automat.visustruct b/web/lessons/diagramme/l09-automat.visustruct deleted file mode 100644 index ce611c37..00000000 --- a/web/lessons/diagramme/l09-automat.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;87;97;115;115;101;114;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;83;97;102;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;75;97;107;97;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;84;97;115;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - diff --git a/web/lessons/diagramme/l09-java-fehler-loesung.visustruct b/web/lessons/diagramme/l09-java-fehler-loesung.visustruct deleted file mode 100644 index 2a159522..00000000 --- a/web/lessons/diagramme/l09-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - diff --git a/web/lessons/diagramme/l09-java-fehler-start.visustruct b/web/lessons/diagramme/l09-java-fehler-start.visustruct deleted file mode 100644 index 607d5414..00000000 --- a/web/lessons/diagramme/l09-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;38;38;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - diff --git a/web/lessons/diagramme/l09-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l09-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 9ed82396..00000000 --- a/web/lessons/diagramme/l09-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;116;97;103;32;61;32;55; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - diff --git a/web/lessons/diagramme/l09-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l09-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 986f59b3..00000000 --- a/web/lessons/diagramme/l09-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;116;97;103;32;61;32;55; - - - 116;97;103;32;61;61;32;54;32;124;124;32;84;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - diff --git a/web/lessons/diagramme/l09-java-schule-loesung.visustruct b/web/lessons/diagramme/l09-java-schule-loesung.visustruct deleted file mode 100644 index e1fd1be2..00000000 --- a/web/lessons/diagramme/l09-java-schule-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;117;110;100;101;32;34;87;105;101;32;115;112;228;116;32;105;115;116;32;101;115;32;40;110;117;114;32;100;105;101;32;83;116;117;110;100;101;41;63;34; - - - 115;116;117;110;100;101;32;62;61;32;56;32;38;38;32;115;116;117;110;100;101;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;105;122;101;105;116;34; - - - - diff --git a/web/lessons/diagramme/l09-note-loesung.visustruct b/web/lessons/diagramme/l09-note-loesung.visustruct deleted file mode 100644 index 0dcdd181..00000000 --- a/web/lessons/diagramme/l09-note-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;87;101;108;99;104;101;32;78;111;116;101;63;34; - - - 110;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;98;101;102;114;105;101;100;105;103;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;97;117;115;114;101;105;99;104;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;109;97;110;103;101;108;104;97;102;116;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;101;110;252;103;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;101;32;103;252;108;116;105;103;101;32;78;111;116;101;34; - - - - diff --git a/web/lessons/diagramme/l09-rechner-loesung.visustruct b/web/lessons/diagramme/l09-rechner-loesung.visustruct deleted file mode 100644 index 3e16b2c8..00000000 --- a/web/lessons/diagramme/l09-rechner-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;122;101;105;99;104;101;110;32;34;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;48; - - - 122;101;105;99;104;101;110; - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 111;117;116;112;117;116;58;32;34;85;110;98;101;107;97;110;110;116;101;115;32;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - - diff --git a/web/lessons/diagramme/l09-verschachtelt.visustruct b/web/lessons/diagramme/l09-verschachtelt.visustruct deleted file mode 100644 index 5c0c9593..00000000 --- a/web/lessons/diagramme/l09-verschachtelt.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; - - - 119;97;104;108;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;87;97;115;115;101;114;46;34; - - - - - 119;97;104;108;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;83;97;102;116;46;34; - - - - - 119;97;104;108;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;75;97;107;97;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;84;97;115;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - - - - - diff --git a/web/lessons/diagramme/l1-grundbausteine.visustruct b/web/lessons/diagramme/l1-grundbausteine.visustruct deleted file mode 100644 index 15b1d94b..00000000 --- a/web/lessons/diagramme/l1-grundbausteine.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 84;97;115;115;101;32;97;117;102;32;100;101;110;32;84;105;115;99;104;32;115;116;101;108;108;101;110; - - - 90;117;99;107;101;114;32;103;101;119;252;110;115;99;104;116;63; - - - 90;117;99;107;101;114;32;104;105;110;101;105;110;103;101;98;101;110; - - - - - 248; - - - - - 84;101;101;32;110;111;99;104;32;122;117;32;104;101;105;223; - - - 49;32;77;105;110;117;116;101;32;119;97;114;116;101;110; - - - - - 84;101;101;32;116;114;105;110;107;101;110; - - diff --git a/web/lessons/diagramme/l1-sequenz.visustruct b/web/lessons/diagramme/l1-sequenz.visustruct deleted file mode 100644 index 9f84605a..00000000 --- a/web/lessons/diagramme/l1-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 65;117;102;115;116;101;104;101;110; - - - 90;228;104;110;101;32;112;117;116;122;101;110; - - - 65;110;122;105;101;104;101;110; - - - 70;114;252;104;115;116;252;99;107;101;110; - - diff --git a/web/lessons/diagramme/l1-tee.visustruct b/web/lessons/diagramme/l1-tee.visustruct deleted file mode 100644 index 1a69335a..00000000 --- a/web/lessons/diagramme/l1-tee.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 87;97;115;115;101;114;32;105;110;32;100;101;110;32;87;97;115;115;101;114;107;111;99;104;101;114;32;102;252;108;108;101;110; - - - 87;97;115;115;101;114;107;111;99;104;101;114;32;101;105;110;115;99;104;97;108;116;101;110; - - - 84;101;101;98;101;117;116;101;108;32;105;110;32;100;105;101;32;84;97;115;115;101;32;108;101;103;101;110; - - - 72;101;105;223;101;115;32;87;97;115;115;101;114;32;105;110;32;100;105;101;32;84;97;115;115;101;32;103;105;101;223;101;110; - - - 51;32;77;105;110;117;116;101;110;32;119;97;114;116;101;110; - - - 84;101;101;98;101;117;116;101;108;32;104;101;114;97;117;115;110;101;104;109;101;110; - - diff --git a/web/lessons/diagramme/l1-verzweigung.visustruct b/web/lessons/diagramme/l1-verzweigung.visustruct deleted file mode 100644 index 0cbc066c..00000000 --- a/web/lessons/diagramme/l1-verzweigung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 82;101;103;110;101;116;32;101;115;63; - - - 82;101;103;101;110;115;99;104;105;114;109;32;101;105;110;112;97;99;107;101;110; - - - - - 83;111;110;110;101;110;98;114;105;108;108;101;32;101;105;110;112;97;99;107;101;110; - - - - - 76;111;115;103;101;104;101;110; - - diff --git a/web/lessons/diagramme/l1-wiederholung.visustruct b/web/lessons/diagramme/l1-wiederholung.visustruct deleted file mode 100644 index 95569e48..00000000 --- a/web/lessons/diagramme/l1-wiederholung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 84;101;108;108;101;114;32;110;105;99;104;116;32;108;101;101;114; - - - 69;105;110;101;110;32;66;105;115;115;101;110;32;101;115;115;101;110; - - - - - 84;101;108;108;101;114;32;97;98;114;228;117;109;101;110; - - diff --git a/web/lessons/diagramme/l10-bis-n-loesung.visustruct b/web/lessons/diagramme/l10-bis-n-loesung.visustruct deleted file mode 100644 index 85431a06..00000000 --- a/web/lessons/diagramme/l10-bis-n-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;32;122;228;104;108;101;110;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/l10-countdown.visustruct b/web/lessons/diagramme/l10-countdown.visustruct deleted file mode 100644 index baed185c..00000000 --- a/web/lessons/diagramme/l10-countdown.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/l10-endlos.visustruct b/web/lessons/diagramme/l10-endlos.visustruct deleted file mode 100644 index 7bf0dfe5..00000000 --- a/web/lessons/diagramme/l10-endlos.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/l10-fakultaet.visustruct b/web/lessons/diagramme/l10-fakultaet.visustruct deleted file mode 100644 index 158e98dc..00000000 --- a/web/lessons/diagramme/l10-fakultaet.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;107;117;108;116;228;116;32;118;111;110;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;102;97;107;117;108;116;97;101;116;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;107;117;108;116;97;101;116;32;61;32;102;97;107;117;108;116;97;101;116;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;107;117;108;116;97;101;116; - - diff --git a/web/lessons/diagramme/l10-java-fehler-loesung.visustruct b/web/lessons/diagramme/l10-java-fehler-loesung.visustruct deleted file mode 100644 index 52d83b56..00000000 --- a/web/lessons/diagramme/l10-java-fehler-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;109;97;108;63;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;71;105;98;116;32;101;115;32;110;105;99;104;116;34; - - - - diff --git a/web/lessons/diagramme/l10-java-fehler-start.visustruct b/web/lessons/diagramme/l10-java-fehler-start.visustruct deleted file mode 100644 index d92715a6..00000000 --- a/web/lessons/diagramme/l10-java-fehler-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;109;97;108;63;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;71;105;98;116;32;101;115;32;110;105;99;104;116;34; - - - - diff --git a/web/lessons/diagramme/l10-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l10-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index a7c9ac48..00000000 --- a/web/lessons/diagramme/l10-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;111;116;101;32;61;32;50; - - - 110;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;119;101;105;116;101;114;32;252;98;101;110;34; - - - - diff --git a/web/lessons/diagramme/l10-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l10-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 37aadd29..00000000 --- a/web/lessons/diagramme/l10-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;111;116;101;32;61;32;50; - - - 78;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;119;101;105;116;101;114;32;252;98;101;110;34; - - - - diff --git a/web/lessons/diagramme/l10-java-wuerfel-loesung.visustruct b/web/lessons/diagramme/l10-java-wuerfel-loesung.visustruct deleted file mode 100644 index 88351962..00000000 --- a/web/lessons/diagramme/l10-java-wuerfel-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; - - - 122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;101;105;110;115;34; - - - - - 111;117;116;112;117;116;58;32;34;122;119;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;100;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;110;110;101;32;105;99;104;32;110;105;99;104;116;34; - - - - diff --git a/web/lessons/diagramme/l10-verdoppeln-loesung.visustruct b/web/lessons/diagramme/l10-verdoppeln-loesung.visustruct deleted file mode 100644 index 320cd62b..00000000 --- a/web/lessons/diagramme/l10-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;34; - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 122;97;104;108;32;60;32;49;48;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;99;104;114;105;116;116;101; - - diff --git a/web/lessons/diagramme/l11-eingabe-pruefen.visustruct b/web/lessons/diagramme/l11-eingabe-pruefen.visustruct deleted file mode 100644 index b3d1e5d6..00000000 --- a/web/lessons/diagramme/l11-eingabe-pruefen.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;48; - - - 122;97;104;108;32;60;32;49;32;124;124;32;122;97;104;108;32;62;32;49;48; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;118;111;110;32;49;32;98;105;115;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;68;97;110;107;101;33;34; - - diff --git a/web/lessons/diagramme/l11-einmal.visustruct b/web/lessons/diagramme/l11-einmal.visustruct deleted file mode 100644 index 8757f666..00000000 --- a/web/lessons/diagramme/l11-einmal.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/l11-java-fehler-loesung.visustruct b/web/lessons/diagramme/l11-java-fehler-loesung.visustruct deleted file mode 100644 index 1510d0be..00000000 --- a/web/lessons/diagramme/l11-java-fehler-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; - - - 105;110;116;32;103;101;108;100;32;61;32;48; - - - 105;110;116;32;119;111;99;104;101;110;32;61;32;48; - - - 103;101;108;100;32;60;32;122;105;101;108; - - - 103;101;108;100;32;61;32;103;101;108;100;32;43;32;53; - - - 119;111;99;104;101;110;32;61;32;119;111;99;104;101;110;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; - - diff --git a/web/lessons/diagramme/l11-java-fehler-start.visustruct b/web/lessons/diagramme/l11-java-fehler-start.visustruct deleted file mode 100644 index 51ce7be1..00000000 --- a/web/lessons/diagramme/l11-java-fehler-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; - - - 105;110;116;32;103;101;108;100;32;61;32;48; - - - 105;110;116;32;119;111;99;104;101;110;32;61;32;48; - - - 103;101;108;100;32;60;61;32;122;105;101;108; - - - 103;101;108;100;32;61;32;103;101;108;100;32;43;32;53; - - - 119;111;99;104;101;110;32;61;32;119;111;99;104;101;110;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; - - diff --git a/web/lessons/diagramme/l11-java-gerade-loesung.visustruct b/web/lessons/diagramme/l11-java-gerade-loesung.visustruct deleted file mode 100644 index d59ba6e5..00000000 --- a/web/lessons/diagramme/l11-java-gerade-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;50; - - - - diff --git a/web/lessons/diagramme/l11-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l11-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index baed185c..00000000 --- a/web/lessons/diagramme/l11-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/l11-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l11-java-laeuft-nicht-start.visustruct deleted file mode 100644 index f6132fea..00000000 --- a/web/lessons/diagramme/l11-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;90;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/l11-note-loesung.visustruct b/web/lessons/diagramme/l11-note-loesung.visustruct deleted file mode 100644 index dbfae923..00000000 --- a/web/lessons/diagramme/l11-note-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;111;116;101;32;61;32;48; - - - 110;111;116;101;32;60;32;49;32;124;124;32;110;111;116;101;32;62;32;54; - - - 105;110;112;117;116;58;32;110;111;116;101;32;34;78;111;116;101;32;118;111;110;32;49;32;98;105;115;32;54;34; - - - - - 111;117;116;112;117;116;58;32;34;68;101;105;110;101;32;78;111;116;101;58;32;34;32;43;32;110;111;116;101; - - diff --git a/web/lessons/diagramme/l11-summe-loesung.visustruct b/web/lessons/diagramme/l11-summe-loesung.visustruct deleted file mode 100644 index 93764ea4..00000000 --- a/web/lessons/diagramme/l11-summe-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;122;97;104;108;32;61;32;48; - - - 122;97;104;108;32;33;61;32;48; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;40;48;32;98;101;101;110;100;101;116;41;34; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l12-countdown-loesung.visustruct b/web/lessons/diagramme/l12-countdown-loesung.visustruct deleted file mode 100644 index e1c2d476..00000000 --- a/web/lessons/diagramme/l12-countdown-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;122;97;104;108;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;33;34; - - diff --git a/web/lessons/diagramme/l12-einmaleins-loesung.visustruct b/web/lessons/diagramme/l12-einmaleins-loesung.visustruct deleted file mode 100644 index 0f4f4f10..00000000 --- a/web/lessons/diagramme/l12-einmaleins-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;107;116;32;61;32;122;97;104;108;32;42;32;105; - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;107;116; - - - - diff --git a/web/lessons/diagramme/l12-eins-bis-fuenf.visustruct b/web/lessons/diagramme/l12-eins-bis-fuenf.visustruct deleted file mode 100644 index f1fb1e1a..00000000 --- a/web/lessons/diagramme/l12-eins-bis-fuenf.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/l12-java-fehler-loesung.visustruct b/web/lessons/diagramme/l12-java-fehler-loesung.visustruct deleted file mode 100644 index 00157fb0..00000000 --- a/web/lessons/diagramme/l12-java-fehler-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - diff --git a/web/lessons/diagramme/l12-java-fehler-start.visustruct b/web/lessons/diagramme/l12-java-fehler-start.visustruct deleted file mode 100644 index 9e7ffef5..00000000 --- a/web/lessons/diagramme/l12-java-fehler-start.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;49; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - diff --git a/web/lessons/diagramme/l12-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l12-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 415e2068..00000000 --- a/web/lessons/diagramme/l12-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;49; - - - 105;110;116;32;103;114;101;110;122;101;32;61;32;50;48; - - - 122;97;104;108;32;60;32;103;114;101;110;122;101; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/l12-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l12-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 2ce71b70..00000000 --- a/web/lessons/diagramme/l12-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;49; - - - 105;110;116;32;103;114;101;110;122;101;32;61;32;50;48; - - - 122;97;104;108;32;60;32;71;114;101;110;122;101; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/l12-java-verdoppeln-loesung.visustruct b/web/lessons/diagramme/l12-java-verdoppeln-loesung.visustruct deleted file mode 100644 index f94a1b68..00000000 --- a/web/lessons/diagramme/l12-java-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;60;32;49;48;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - diff --git a/web/lessons/diagramme/l12-summe.visustruct b/web/lessons/diagramme/l12-summe.visustruct deleted file mode 100644 index f1174faa..00000000 --- a/web/lessons/diagramme/l12-summe.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l13-dreieck.visustruct b/web/lessons/diagramme/l13-dreieck.visustruct deleted file mode 100644 index 78052335..00000000 --- a/web/lessons/diagramme/l13-dreieck.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;90;101;105;108;101;110;63;34; - - - 105;110;116;32;122;101;105;108;101;32;61;32;49; - 122;101;105;108;101;32;60;61;32;110; - 122;101;105;108;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;116;101;114;110;32;61;32;49; - 115;116;101;114;110;32;60;61;32;122;101;105;108;101; - 115;116;101;114;110;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - diff --git a/web/lessons/diagramme/l13-gerade-eingaben-loesung.visustruct b/web/lessons/diagramme/l13-gerade-eingaben-loesung.visustruct deleted file mode 100644 index 4d308c89..00000000 --- a/web/lessons/diagramme/l13-gerade-eingaben-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l13-gerade-zaehlen.visustruct b/web/lessons/diagramme/l13-gerade-zaehlen.visustruct deleted file mode 100644 index c096a48b..00000000 --- a/web/lessons/diagramme/l13-gerade-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l13-java-fehler-loesung.visustruct b/web/lessons/diagramme/l13-java-fehler-loesung.visustruct deleted file mode 100644 index 7e087fc5..00000000 --- a/web/lessons/diagramme/l13-java-fehler-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;101;105;104;101;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/l13-java-fehler-start.visustruct b/web/lessons/diagramme/l13-java-fehler-start.visustruct deleted file mode 100644 index 9b64cf71..00000000 --- a/web/lessons/diagramme/l13-java-fehler-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;101;105;104;101;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/l13-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l13-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index b9832516..00000000 --- a/web/lessons/diagramme/l13-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;104;111;101;104;101;32;61;32;48; - - - 105;110;116;32;115;116;117;102;101;32;61;32;49; - 115;116;117;102;101;32;60;61;32;53; - 115;116;117;102;101;43;43; - - - 104;111;101;104;101;32;61;32;104;111;101;104;101;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;246;104;101;58;32;34;32;43;32;104;111;101;104;101;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/l13-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l13-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 8fb62110..00000000 --- a/web/lessons/diagramme/l13-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;115;116;117;102;101;32;61;32;49; - 115;116;117;102;101;32;60;61;32;53; - 115;116;117;102;101;43;43; - - - 104;111;101;104;101;32;61;32;104;111;101;104;101;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;246;104;101;58;32;34;32;43;32;104;111;101;104;101;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/l13-java-quadrate-loesung.visustruct b/web/lessons/diagramme/l13-java-quadrate-loesung.visustruct deleted file mode 100644 index f02d9d44..00000000 --- a/web/lessons/diagramme/l13-java-quadrate-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/l13-rechteck-loesung.visustruct b/web/lessons/diagramme/l13-rechteck-loesung.visustruct deleted file mode 100644 index f0249c0f..00000000 --- a/web/lessons/diagramme/l13-rechteck-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;101;104;101;32;34;72;246;104;101;34; - - - 105;110;116;32;122;101;105;108;101;32;61;32;49; - 122;101;105;108;101;32;60;61;32;104;111;101;104;101; - 122;101;105;108;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;112;97;108;116;101;32;61;32;49; - 115;112;97;108;116;101;32;60;61;32;98;114;101;105;116;101; - 115;112;97;108;116;101;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - diff --git a/web/lessons/diagramme/l14-array-durchlaufen.visustruct b/web/lessons/diagramme/l14-array-durchlaufen.visustruct deleted file mode 100644 index 427a092d..00000000 --- a/web/lessons/diagramme/l14-array-durchlaufen.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;122;97;104;108;101;110;91;105;93; - - - - diff --git a/web/lessons/diagramme/l14-erster-letzter-loesung.visustruct b/web/lessons/diagramme/l14-erster-letzter-loesung.visustruct deleted file mode 100644 index 980c1bcb..00000000 --- a/web/lessons/diagramme/l14-erster-letzter-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;91;48;93; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;91;119;101;114;116;101;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/l14-java-fehler-loesung.visustruct b/web/lessons/diagramme/l14-java-fehler-loesung.visustruct deleted file mode 100644 index cc8989c0..00000000 --- a/web/lessons/diagramme/l14-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l14-java-fehler-start.visustruct b/web/lessons/diagramme/l14-java-fehler-start.visustruct deleted file mode 100644 index acf58235..00000000 --- a/web/lessons/diagramme/l14-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - - - diff --git a/web/lessons/diagramme/l14-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l14-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 74d801ff..00000000 --- a/web/lessons/diagramme/l14-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/l14-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l14-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 3bab3941..00000000 --- a/web/lessons/diagramme/l14-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/l14-java-treppe-loesung.visustruct b/web/lessons/diagramme/l14-java-treppe-loesung.visustruct deleted file mode 100644 index bd136c79..00000000 --- a/web/lessons/diagramme/l14-java-treppe-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;83;116;117;102;101;110;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - diff --git a/web/lessons/diagramme/l14-namen-eingeben.visustruct b/web/lessons/diagramme/l14-namen-eingeben.visustruct deleted file mode 100644 index 0c7709ad..00000000 --- a/web/lessons/diagramme/l14-namen-eingeben.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;110;91;105;93;32;34;78;97;109;101;32;101;105;110;103;101;98;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;69;114;115;116;101;114;32;78;97;109;101;58;32;34;32;43;32;110;97;109;101;110;91;48;93; - - diff --git a/web/lessons/diagramme/l14-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/l14-rueckwaerts-loesung.visustruct deleted file mode 100644 index 0e2991ed..00000000 --- a/web/lessons/diagramme/l14-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;122;97;104;108;101;110;91;105;93;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;105;32;61;32;122;97;104;108;101;110;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;122;97;104;108;101;110;91;105;93; - - - - diff --git a/web/lessons/diagramme/l14-summe-max-loesung.visustruct b/web/lessons/diagramme/l14-summe-max-loesung.visustruct deleted file mode 100644 index 1244c8e6..00000000 --- a/web/lessons/diagramme/l14-summe-max-loesung.visustruct +++ /dev/null @@ -1,51 +0,0 @@ - - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;122;97;104;108;101;110;91;105;93;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;122;97;104;108;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108;101;110;91;105;93; - - - 122;97;104;108;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;122;97;104;108;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/l14-summe-maximum.visustruct b/web/lessons/diagramme/l14-summe-maximum.visustruct deleted file mode 100644 index 40c44c84..00000000 --- a/web/lessons/diagramme/l14-summe-maximum.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;117;110;107;116;101;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - 112;117;110;107;116;101;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;117;110;107;116;101;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/l15-bis-null-loesung.visustruct b/web/lessons/diagramme/l15-bis-null-loesung.visustruct deleted file mode 100644 index 018c60ae..00000000 --- a/web/lessons/diagramme/l15-bis-null-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - 122;97;104;108;32;33;61;32;48; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l15-endlos-aussprung.visustruct b/web/lessons/diagramme/l15-endlos-aussprung.visustruct deleted file mode 100644 index 5fe0b250..00000000 --- a/web/lessons/diagramme/l15-endlos-aussprung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - 122;97;104;108;32;61;61;32;48; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l15-flaeche-loesung.visustruct b/web/lessons/diagramme/l15-flaeche-loesung.visustruct deleted file mode 100644 index 04f013e6..00000000 --- a/web/lessons/diagramme/l15-flaeche-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;101;110;103;101;32;34;76;228;110;103;101;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;63;34; - - - 105;110;116;32;102;32;61;32;102;108;97;101;99;104;101;40;108;97;101;110;103;101;44;32;98;114;101;105;116;101;41; - - - 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102; - - diff --git a/web/lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct b/web/lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct deleted file mode 100644 index a05b965b..00000000 --- a/web/lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 114;101;116;117;114;110;32;97;32;42;32;98; - - diff --git a/web/lessons/diagramme/l15-hauptprogramm.visustruct b/web/lessons/diagramme/l15-hauptprogramm.visustruct deleted file mode 100644 index 33679bef..00000000 --- a/web/lessons/diagramme/l15-hauptprogramm.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 122;101;105;103;101;66;101;103;114;117;101;115;115;117;110;103;40;41; - - - 115;116;101;108;108;101;70;114;97;103;101;110;40;41; - - - 122;101;105;103;101;69;114;103;101;98;110;105;115;40;41; - - diff --git a/web/lessons/diagramme/l15-java-fehler-loesung.visustruct b/web/lessons/diagramme/l15-java-fehler-loesung.visustruct deleted file mode 100644 index bb4e237a..00000000 --- a/web/lessons/diagramme/l15-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/l15-java-fehler-start.visustruct b/web/lessons/diagramme/l15-java-fehler-start.visustruct deleted file mode 100644 index 6992a54b..00000000 --- a/web/lessons/diagramme/l15-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/l15-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l15-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index f27992de..00000000 --- a/web/lessons/diagramme/l15-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l15-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l15-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 18654a09..00000000 --- a/web/lessons/diagramme/l15-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;76;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l15-java-noten-loesung.visustruct b/web/lessons/diagramme/l15-java-noten-loesung.visustruct deleted file mode 100644 index a19f8aed..00000000 --- a/web/lessons/diagramme/l15-java-noten-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;110;111;116;101;110;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;110;111;116;101;110;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l15-quadrat-haupt.visustruct b/web/lessons/diagramme/l15-quadrat-haupt.visustruct deleted file mode 100644 index 0d79bc87..00000000 --- a/web/lessons/diagramme/l15-quadrat-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; - - - 105;110;116;32;113;32;61;32;113;117;97;100;114;97;116;40;122;97;104;108;41; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;81;117;97;100;114;97;116;32;105;115;116;32;34;32;43;32;113; - - diff --git a/web/lessons/diagramme/l15-quadrat.visustruct b/web/lessons/diagramme/l15-quadrat.visustruct deleted file mode 100644 index f60e1982..00000000 --- a/web/lessons/diagramme/l15-quadrat.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;101;114;103;101;98;110;105;115; - - diff --git a/web/lessons/diagramme/l15-titel-loesung.visustruct b/web/lessons/diagramme/l15-titel-loesung.visustruct deleted file mode 100644 index aca606ab..00000000 --- a/web/lessons/diagramme/l15-titel-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 122;101;105;103;101;84;105;116;101;108;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101; - - diff --git a/web/lessons/diagramme/l15-unterprogramm.visustruct b/web/lessons/diagramme/l15-unterprogramm.visustruct deleted file mode 100644 index 79262ab3..00000000 --- a/web/lessons/diagramme/l15-unterprogramm.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;32;122;117;109;32;81;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;101;107;111;109;109;115;116;32;100;114;101;105;32;70;114;97;103;101;110;46;34; - - diff --git a/web/lessons/diagramme/l15-zeige-summe-haupt.visustruct b/web/lessons/diagramme/l15-zeige-summe-haupt.visustruct deleted file mode 100644 index 77b3ed07..00000000 --- a/web/lessons/diagramme/l15-zeige-summe-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 122;101;105;103;101;83;117;109;109;101;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 122;101;105;103;101;83;117;109;109;101;40;120;44;32;120;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/l15-zeige-summe.visustruct b/web/lessons/diagramme/l15-zeige-summe.visustruct deleted file mode 100644 index a29894d7..00000000 --- a/web/lessons/diagramme/l15-zeige-summe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-countdown-loesung.visustruct b/web/lessons/diagramme/l16-countdown-loesung.visustruct deleted file mode 100644 index 66eeaf1f..00000000 --- a/web/lessons/diagramme/l16-countdown-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;33;34; - - diff --git a/web/lessons/diagramme/l16-countdown-start.visustruct b/web/lessons/diagramme/l16-countdown-start.visustruct deleted file mode 100644 index b137abdb..00000000 --- a/web/lessons/diagramme/l16-countdown-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;34; - - diff --git a/web/lessons/diagramme/l16-java-fehler-loesung.visustruct b/web/lessons/diagramme/l16-java-fehler-loesung.visustruct deleted file mode 100644 index 4df77770..00000000 --- a/web/lessons/diagramme/l16-java-fehler-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-java-fehler-start.visustruct b/web/lessons/diagramme/l16-java-fehler-start.visustruct deleted file mode 100644 index aacc051d..00000000 --- a/web/lessons/diagramme/l16-java-fehler-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l16-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 01d3fff6..00000000 --- a/web/lessons/diagramme/l16-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;44;32;82;117;110;100;101;32;49;58;32;34;32;43;32;112;117;110;107;116;101;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/l16-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l16-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 1cb5a556..00000000 --- a/web/lessons/diagramme/l16-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;44;32;82;117;110;100;101;32;49;58;32;34;32;43;32;80;117;110;107;116;101;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/l16-java-punkte-loesung.visustruct b/web/lessons/diagramme/l16-java-punkte-loesung.visustruct deleted file mode 100644 index 233400c3..00000000 --- a/web/lessons/diagramme/l16-java-punkte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-schreibtisch.visustruct b/web/lessons/diagramme/l16-schreibtisch.visustruct deleted file mode 100644 index 75ee4239..00000000 --- a/web/lessons/diagramme/l16-schreibtisch.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-summe-loesung.visustruct b/web/lessons/diagramme/l16-summe-loesung.visustruct deleted file mode 100644 index 9df43c16..00000000 --- a/web/lessons/diagramme/l16-summe-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l16-summe-start.visustruct b/web/lessons/diagramme/l16-summe-start.visustruct deleted file mode 100644 index d698bdd3..00000000 --- a/web/lessons/diagramme/l16-summe-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l17-beispiel.visustruct b/web/lessons/diagramme/l17-beispiel.visustruct deleted file mode 100644 index 5cb8029d..00000000 --- a/web/lessons/diagramme/l17-beispiel.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;109;97;108;32;34;32;43;32;122;97;104;108;32;43;32;34;32;61;32;34;32;43;32;101;114;103;101;98;110;105;115; - - - - - 122;97;104;108;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;119;97;114;32;115;99;104;119;101;114;33;34; - - - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;119;97;114;32;108;101;105;99;104;116;46;34; - - - - diff --git a/web/lessons/diagramme/l17-fakultaet-loesung.visustruct b/web/lessons/diagramme/l17-fakultaet-loesung.visustruct deleted file mode 100644 index 2aabf78a..00000000 --- a/web/lessons/diagramme/l17-fakultaet-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;102;97;107;117;108;116;97;101;116;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;107;117;108;116;97;101;116;32;61;32;102;97;107;117;108;116;97;101;116;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;107;117;108;116;97;101;116; - - diff --git a/web/lessons/diagramme/l17-java-brief-loesung.visustruct b/web/lessons/diagramme/l17-java-brief-loesung.visustruct deleted file mode 100644 index 8d1e922b..00000000 --- a/web/lessons/diagramme/l17-java-brief-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;98;114;105;101;102;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;90;101;105;108;101;110;58;32;34;32;43;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 122;101;105;108;101;110;91;105;93;46;99;111;110;116;97;105;110;115;40;34;70;117;99;104;115;34;41; - - - 111;117;116;112;117;116;58;32;34;70;117;99;104;115;32;105;110;32;90;101;105;108;101;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/l17-java-brief-start.visustruct b/web/lessons/diagramme/l17-java-brief-start.visustruct deleted file mode 100644 index 7e7dc36c..00000000 --- a/web/lessons/diagramme/l17-java-brief-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/l17-java-fehler-loesung.visustruct b/web/lessons/diagramme/l17-java-fehler-loesung.visustruct deleted file mode 100644 index 45333fd6..00000000 --- a/web/lessons/diagramme/l17-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/l17-java-fehler-start.visustruct b/web/lessons/diagramme/l17-java-fehler-start.visustruct deleted file mode 100644 index 6288efa3..00000000 --- a/web/lessons/diagramme/l17-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/l17-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l17-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 5081c927..00000000 --- a/web/lessons/diagramme/l17-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;104;97;116;32;34;32;43;32;110;97;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;66;117;99;104;115;116;97;98;101;110;34; - - diff --git a/web/lessons/diagramme/l17-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l17-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 00940be2..00000000 --- a/web/lessons/diagramme/l17-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;104;97;116;32;34;32;43;32;110;97;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;66;117;99;104;115;116;97;98;101;110;34; - - diff --git a/web/lessons/diagramme/l17-java-passwort-loesung.visustruct b/web/lessons/diagramme/l17-java-passwort-loesung.visustruct deleted file mode 100644 index 5a2eaabc..00000000 --- a/web/lessons/diagramme/l17-java-passwort-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;105;110;103;97;98;101;32;34;80;97;115;115;119;111;114;116;63;34; - - - 101;105;110;103;97;98;101;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;33;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;115;99;104;101;115;32;80;97;115;115;119;111;114;116;34; - - - - diff --git a/web/lessons/diagramme/l17-ticket-loesung.visustruct b/web/lessons/diagramme/l17-ticket-loesung.visustruct deleted file mode 100644 index 1199fcd2..00000000 --- a/web/lessons/diagramme/l17-ticket-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 97;108;116;101;114;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;75;105;110;100;101;114;116;105;99;107;101;116;58;32;52;32;69;117;114;111;34; - - - - - 111;117;116;112;117;116;58;32;34;69;114;119;97;99;104;115;101;110;101;110;116;105;99;107;101;116;58;32;56;32;69;117;114;111;34; - - - - - - diff --git a/web/lessons/diagramme/l18-beispiel.visustruct b/web/lessons/diagramme/l18-beispiel.visustruct deleted file mode 100644 index f72ef250..00000000 --- a/web/lessons/diagramme/l18-beispiel.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;119;101;114;116;63;34; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;69;110;100;101;34; - - diff --git a/web/lessons/diagramme/l18-java-fehler-loesung.visustruct b/web/lessons/diagramme/l18-java-fehler-loesung.visustruct deleted file mode 100644 index 420f688a..00000000 --- a/web/lessons/diagramme/l18-java-fehler-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;116;105;112;112;32;34;68;101;105;110;32;84;105;112;112;63;34; - - - 118;101;114;115;117;99;104;101;32;61;32;118;101;114;115;117;99;104;101;32;43;32;49; - - - 116;105;112;112;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; - - diff --git a/web/lessons/diagramme/l18-java-fehler-start.visustruct b/web/lessons/diagramme/l18-java-fehler-start.visustruct deleted file mode 100644 index 2a299b4b..00000000 --- a/web/lessons/diagramme/l18-java-fehler-start.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;116;105;112;112;32;34;68;101;105;110;32;84;105;112;112;63;34; - - - 116;105;112;112;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 118;101;114;115;117;99;104;101;32;61;32;118;101;114;115;117;99;104;101;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; - - diff --git a/web/lessons/diagramme/l18-java-kasse-loesung.visustruct b/web/lessons/diagramme/l18-java-kasse-loesung.visustruct deleted file mode 100644 index cd891002..00000000 --- a/web/lessons/diagramme/l18-java-kasse-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;101;105;115;32;34;80;114;101;105;115;63;32;40;48;32;61;32;69;110;100;101;41;34; - - - 112;114;101;105;115;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;114;101;105;115; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;65;114;116;105;107;101;108;58;32;34;32;43;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;115;117;109;109;101; - - diff --git a/web/lessons/diagramme/l18-js-loesung.visustruct b/web/lessons/diagramme/l18-js-loesung.visustruct deleted file mode 100644 index 607195f0..00000000 --- a/web/lessons/diagramme/l18-js-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;68;117;32;100;97;114;102;115;116;32;119;228;104;108;101;110;46;34; - - - - - 105;110;116;32;106;97;104;114;101;32;61;32;49;54;32;45;32;97;108;116;101;114; - - - 111;117;116;112;117;116;58;32;34;78;111;99;104;32;34;32;43;32;106;97;104;114;101;32;43;32;34;32;74;97;104;114;101;32;119;97;114;116;101;110;46;34; - - - - diff --git a/web/lessons/diagramme/l18-python-loesung.visustruct b/web/lessons/diagramme/l18-python-loesung.visustruct deleted file mode 100644 index dd5f0cca..00000000 --- a/web/lessons/diagramme/l18-python-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;101;110;122;101;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;103;114;101;110;122;101; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/l19-java-fehler-loesung.visustruct b/web/lessons/diagramme/l19-java-fehler-loesung.visustruct deleted file mode 100644 index 6da69702..00000000 --- a/web/lessons/diagramme/l19-java-fehler-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/l19-java-fehler-start.visustruct b/web/lessons/diagramme/l19-java-fehler-start.visustruct deleted file mode 100644 index a7f08974..00000000 --- a/web/lessons/diagramme/l19-java-fehler-start.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/l19-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/l19-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index c3ad8012..00000000 --- a/web/lessons/diagramme/l19-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;103;101;115;117;99;104;116;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/l19-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/l19-java-laeuft-nicht-start.visustruct deleted file mode 100644 index e0b9623b..00000000 --- a/web/lessons/diagramme/l19-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;103;101;115;117;99;104;116;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;71;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - diff --git a/web/lessons/diagramme/l19-java-zaehlen-loesung.visustruct b/web/lessons/diagramme/l19-java-zaehlen-loesung.visustruct deleted file mode 100644 index edd45620..00000000 --- a/web/lessons/diagramme/l19-java-zaehlen-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l2-ausgabe.visustruct b/web/lessons/diagramme/l2-ausgabe.visustruct deleted file mode 100644 index e3b67b58..00000000 --- a/web/lessons/diagramme/l2-ausgabe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;71;117;116;101;110;32;77;111;114;103;101;110;34; - - - 111;117;116;112;117;116;58;32;34;72;101;117;116;101;32;108;101;114;110;101;110;32;119;105;114;32;83;116;114;117;107;116;111;103;114;97;109;109;101;46;34; - - diff --git a/web/lessons/diagramme/l2-hallo-loesung.visustruct b/web/lessons/diagramme/l2-hallo-loesung.visustruct deleted file mode 100644 index 57737002..00000000 --- a/web/lessons/diagramme/l2-hallo-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;87;101;108;116;34; - - diff --git a/web/lessons/diagramme/l2-zwei-zeilen-loesung.visustruct b/web/lessons/diagramme/l2-zwei-zeilen-loesung.visustruct deleted file mode 100644 index 76211f5b..00000000 --- a/web/lessons/diagramme/l2-zwei-zeilen-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;34; - - - 111;117;116;112;117;116;58;32;34;73;99;104;32;108;101;114;110;101;32;83;116;114;117;107;116;111;103;114;97;109;109;101;34; - - diff --git a/web/lessons/diagramme/l20-countdown-loesung.visustruct b/web/lessons/diagramme/l20-countdown-loesung.visustruct deleted file mode 100644 index 1c79f478..00000000 --- a/web/lessons/diagramme/l20-countdown-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - diff --git a/web/lessons/diagramme/l23-java-ergaenzen-loesung.visustruct b/web/lessons/diagramme/l23-java-ergaenzen-loesung.visustruct deleted file mode 100644 index fb42bf3c..00000000 --- a/web/lessons/diagramme/l23-java-ergaenzen-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;101;105;110;107;97;117;102;45;110;101;117;46;116;120;116;34;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;122;101;105;108;101;41; - - - 97;110;122;97;104;108;43;43; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;75;117;99;104;101;110;34;41; - - - 97;110;122;97;104;108;43;43; - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;90;101;105;108;101;110;32;103;101;115;112;101;105;99;104;101;114;116;34; - - diff --git a/web/lessons/diagramme/l23-java-ergaenzen-start.visustruct b/web/lessons/diagramme/l23-java-ergaenzen-start.visustruct deleted file mode 100644 index 91054e69..00000000 --- a/web/lessons/diagramme/l23-java-ergaenzen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;101;105;110;107;97;117;102;45;110;101;117;46;116;120;116;34;41; - - diff --git a/web/lessons/diagramme/l23-java-nummern-loesung.visustruct b/web/lessons/diagramme/l23-java-nummern-loesung.visustruct deleted file mode 100644 index 8271df50..00000000 --- a/web/lessons/diagramme/l23-java-nummern-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;109;101;114;32;61;32;49; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;109;101;114;32;43;32;34;46;32;34;32;43;32;122;101;105;108;101; - - - 110;117;109;109;101;114;43;43; - - - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/l23-java-nummern-start.visustruct b/web/lessons/diagramme/l23-java-nummern-start.visustruct deleted file mode 100644 index 0781b837..00000000 --- a/web/lessons/diagramme/l23-java-nummern-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/l24-java-fuchs-loesung.visustruct b/web/lessons/diagramme/l24-java-fuchs-loesung.visustruct deleted file mode 100644 index 6fd1cd06..00000000 --- a/web/lessons/diagramme/l24-java-fuchs-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 122;101;105;108;101;46;99;111;110;116;97;105;110;115;40;34;70;117;99;104;115;34;41; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;70;117;99;104;115;58;32;34;32;43;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l24-java-fuchs-start.visustruct b/web/lessons/diagramme/l24-java-fuchs-start.visustruct deleted file mode 100644 index de3bd722..00000000 --- a/web/lessons/diagramme/l24-java-fuchs-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/l24-java-laengster-loesung.visustruct b/web/lessons/diagramme/l24-java-laengster-loesung.visustruct deleted file mode 100644 index 65d97f21..00000000 --- a/web/lessons/diagramme/l24-java-laengster-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;108;97;101;110;103;115;116;101;114;32;61;32;122;101;105;108;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 122;101;105;108;101;110;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;108;97;101;110;103;115;116;101;114;46;108;101;110;103;116;104;40;41; - - - 108;97;101;110;103;115;116;101;114;32;61;32;122;101;105;108;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;76;228;110;103;115;116;101;114;32;69;105;110;116;114;97;103;58;32;34;32;43;32;108;97;101;110;103;115;116;101;114; - - diff --git a/web/lessons/diagramme/l24-java-laengster-start.visustruct b/web/lessons/diagramme/l24-java-laengster-start.visustruct deleted file mode 100644 index 6f4e03c7..00000000 --- a/web/lessons/diagramme/l24-java-laengster-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - diff --git a/web/lessons/diagramme/l25-java-beste-loesung.visustruct b/web/lessons/diagramme/l25-java-beste-loesung.visustruct deleted file mode 100644 index 69d1fe2d..00000000 --- a/web/lessons/diagramme/l25-java-beste-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;98;101;115;116;101;114;78;97;109;101;32;61;32;34;34; - - - 105;110;116;32;98;101;115;116;101;78;111;116;101;32;61;32;55; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;110;111;116;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;51;93;41; - - - 110;111;116;101;32;60;32;98;101;115;116;101;78;111;116;101; - - - 98;101;115;116;101;78;111;116;101;32;61;32;110;111;116;101; - - - 98;101;115;116;101;114;78;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;66;101;115;116;101;32;78;111;116;101;32;105;110;32;69;110;103;108;105;115;99;104;58;32;34;32;43;32;98;101;115;116;101;114;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;101;78;111;116;101;32;43;32;34;41;34; - - diff --git a/web/lessons/diagramme/l25-java-beste-start.visustruct b/web/lessons/diagramme/l25-java-beste-start.visustruct deleted file mode 100644 index 8f27c0f9..00000000 --- a/web/lessons/diagramme/l25-java-beste-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/l25-java-schnitt-loesung.visustruct b/web/lessons/diagramme/l25-java-schnitt-loesung.visustruct deleted file mode 100644 index 68bfb6b5..00000000 --- a/web/lessons/diagramme/l25-java-schnitt-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 97;110;122;97;104;108;43;43; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;83;99;104;110;105;116;116;32;77;97;116;104;101;58;32;34;32;43;32;115;117;109;109;101;32;47;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/l25-java-schnitt-start.visustruct b/web/lessons/diagramme/l25-java-schnitt-start.visustruct deleted file mode 100644 index 428dd67d..00000000 --- a/web/lessons/diagramme/l25-java-schnitt-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/l26-java-namen-loesung.visustruct b/web/lessons/diagramme/l26-java-namen-loesung.visustruct deleted file mode 100644 index abf1a2c7..00000000 --- a/web/lessons/diagramme/l26-java-namen-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 122;101;105;108;101;46;99;111;110;116;97;105;110;115;40;34;92;34;110;97;109;101;92;34;34;41; - - - 105;110;116;32;115;116;97;114;116;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;101;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;101;41; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/l26-java-namen-start.visustruct b/web/lessons/diagramme/l26-java-namen-start.visustruct deleted file mode 100644 index e5e3e85d..00000000 --- a/web/lessons/diagramme/l26-java-namen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/l26-java-schreiben-loesung.visustruct b/web/lessons/diagramme/l26-java-schreiben-loesung.visustruct deleted file mode 100644 index 2b799fab..00000000 --- a/web/lessons/diagramme/l26-java-schreiben-loesung.visustruct +++ /dev/null @@ -1,50 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;117;110;107;116;101;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;105;110;116;114;97;103;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;110;97;109;101;110;91;105;93;32;43;32;34;92;34;44;32;92;34;112;117;110;107;116;101;92;34;58;32;34;32;43;32;112;117;110;107;116;101;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 101;105;110;116;114;97;103;32;61;32;101;105;110;116;114;97;103;32;43;32;34;44;34; - - - - - 248; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;101;105;110;116;114;97;103;41; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;110;46;108;101;110;103;116;104;32;43;32;34;32;69;105;110;116;114;228;103;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - diff --git a/web/lessons/diagramme/l26-java-schreiben-start.visustruct b/web/lessons/diagramme/l26-java-schreiben-start.visustruct deleted file mode 100644 index 369984a1..00000000 --- a/web/lessons/diagramme/l26-java-schreiben-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;117;110;107;116;101;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/l27-java-json-loesung.visustruct b/web/lessons/diagramme/l27-java-json-loesung.visustruct deleted file mode 100644 index 714b7b27..00000000 --- a/web/lessons/diagramme/l27-java-json-loesung.visustruct +++ /dev/null @@ -1,53 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;116;105;101;114;101;45;110;101;117;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;110;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;105;110;116;114;97;103;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;116;101;105;108;101;91;48;93;32;43;32;34;92;34;44;32;92;34;97;114;116;92;34;58;32;92;34;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;92;34;44;32;92;34;97;108;116;101;114;92;34;58;32;34;32;43;32;116;101;105;108;101;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 101;105;110;116;114;97;103;32;61;32;101;105;110;116;114;97;103;32;43;32;34;44;34; - - - - - 248; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;101;105;110;116;114;97;103;41; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;122;101;105;108;101;110;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;84;105;101;114;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - diff --git a/web/lessons/diagramme/l27-java-json-start.visustruct b/web/lessons/diagramme/l27-java-json-start.visustruct deleted file mode 100644 index b0e4e82f..00000000 --- a/web/lessons/diagramme/l27-java-json-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;116;105;101;114;101;45;110;101;117;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/l27-java-saetze-loesung.visustruct b/web/lessons/diagramme/l27-java-saetze-loesung.visustruct deleted file mode 100644 index e551cbc1..00000000 --- a/web/lessons/diagramme/l27-java-saetze-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;97;101;116;122;101;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;116;101;105;108;101;91;48;93;32;43;32;34;32;40;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;41;32;105;115;116;32;34;32;43;32;116;101;105;108;101;91;50;93;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34;41; - - - 97;110;122;97;104;108;43;43; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;83;228;116;122;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - diff --git a/web/lessons/diagramme/l27-java-saetze-start.visustruct b/web/lessons/diagramme/l27-java-saetze-start.visustruct deleted file mode 100644 index 6472f015..00000000 --- a/web/lessons/diagramme/l27-java-saetze-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;97;101;116;122;101;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct deleted file mode 100644 index 3a22dad0..00000000 --- a/web/lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;34; - - - 118;101;114;105;102;105;99;97;114;73;100;97;100;101;40;41; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - diff --git a/web/lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct deleted file mode 100644 index a92d0fe8..00000000 --- a/web/lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;109;97;105;111;114;32;100;101;32;105;100;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;109;101;110;111;114;32;100;101;32;105;100;97;100;101;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct deleted file mode 100644 index 2c73ab7d..00000000 --- a/web/lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct +++ /dev/null @@ -1,81 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;110;116;97;103;101;109;32;61;32;48; - - - 100;111;117;98;108;101;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;61;32;48; - - - 83;116;114;105;110;103;32;109;101;108;104;111;114;78;111;109;101;32;61;32;34;34; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;100;105;115;116;97;110;99;105;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 99;111;110;116;97;103;101;109;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;100;105;115;116;97;110;99;105;97; - - - 100;105;115;116;97;110;99;105;97;32;62;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97; - - - 109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;61;32;100;105;115;116;97;110;99;105;97; - - - 109;101;108;104;111;114;78;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;115;111;109;97;32;47;32;99;111;110;116;97;103;101;109; - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;99;105;112;97;110;116;101;115;58;32;34;32;43;32;99;111;110;116;97;103;101;109; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;58;32;34;32;43;32;109;101;100;105;97;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;118;101;110;99;101;100;111;114;46;116;120;116;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;86;101;110;99;101;100;111;114;58;32;34;32;43;32;109;101;108;104;111;114;78;111;109;101;32;43;32;34;32;40;34;32;43;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;43;32;34;32;109;41;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct b/web/lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct deleted file mode 100644 index b089d7a2..00000000 --- a/web/lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct deleted file mode 100644 index 3e727f4c..00000000 --- a/web/lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct +++ /dev/null @@ -1,65 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;80;111;110;116;111;115;63;34; - - - 112;111;110;116;111;115;91;105;93;32;61;32;110;117;109;101;114;111; - - - - - 105;110;116;32;112;97;115;115;97;103;101;109;32;61;32;49; - 112;97;115;115;97;103;101;109;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 112;97;115;115;97;103;101;109;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104;32;45;32;112;97;115;115;97;103;101;109; - 105;43;43; - - - 112;111;110;116;111;115;91;105;93;32;60;32;112;111;110;116;111;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;112;111;110;116;111;115;91;105;93; - - - 112;111;110;116;111;115;91;105;93;32;61;32;112;111;110;116;111;115;91;105;32;43;32;49;93; - - - 112;111;110;116;111;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;108;117;103;97;114;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;108;117;103;97;114;32;43;32;34;46;32;34;32;43;32;112;111;110;116;111;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct deleted file mode 100644 index 8565916a..00000000 --- a/web/lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;116;101;105;114;111;34; - - - 83;116;114;105;110;103;32;98;105;110;97;114;105;111;32;61;32;34;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;110;117;109;101;114;111;32;37;32;50; - - - 98;105;110;97;114;105;111;32;61;32;114;101;115;116;111;32;43;32;98;105;110;97;114;105;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;114;105;111; - - diff --git a/web/lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct deleted file mode 100644 index 99c6a896..00000000 --- a/web/lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;81;117;101;32;112;97;108;97;118;114;97;32;40;115;243;32;109;97;105;250;115;99;117;108;97;115;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;102;97;98;101;116;111;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;102;97;98;101;116;111;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 115;101;103;114;101;100;111;32;61;32;115;101;103;114;101;100;111;32;43;32;97;108;102;97;98;101;116;111;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; - - diff --git a/web/lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct b/web/lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct deleted file mode 100644 index cba5fadf..00000000 --- a/web/lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - diff --git a/web/lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct deleted file mode 100644 index 20bd7ef5..00000000 --- a/web/lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;81;117;101;32;112;97;108;97;118;114;97;32;40;115;243;32;109;97;105;250;115;99;117;108;97;115;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;105;103;111;32;61;32;40;105;110;116;41;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;105;103;111;32;61;32;40;99;111;100;105;103;111;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 115;101;103;114;101;100;111;32;61;32;115;101;103;114;101;100;111;32;43;32;40;99;104;97;114;41;32;99;111;100;105;103;111; - - - - - 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; - - diff --git a/web/lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct deleted file mode 100644 index 8cb285f3..00000000 --- a/web/lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;34;81;117;97;108;32;233;32;111;32;116;101;120;116;111;32;99;105;102;114;97;100;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;103;114;101;100;111;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;105;103;111;32;61;32;40;105;110;116;41;32;115;101;103;114;101;100;111;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;105;103;111;32;61;32;40;99;111;100;105;103;111;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;40;99;104;97;114;41;32;99;111;100;105;103;111; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - diff --git a/web/lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct deleted file mode 100644 index 89d47a06..00000000 --- a/web/lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;112;97;115;115;111;115;32;61;32;48; - - - 110;117;109;101;114;111;32;33;61;32;49; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 112;97;115;115;111;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;80;97;115;115;111;115;58;32;34;32;43;32;112;97;115;115;111;115; - - diff --git a/web/lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct deleted file mode 100644 index 494e08e8..00000000 --- a/web/lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;97;115;32;110;111;116;97;115;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;113;117;97;110;116;105;100;97;100;101; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;110;111;116;97;34; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;111;116;97; - - - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;115;111;109;97;32;42;32;49;46;48;32;47;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;109;101;100;105;97; - - diff --git a/web/lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct deleted file mode 100644 index bb998bde..00000000 --- a/web/lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;110;250;109;101;114;111;115;63;34; - - - 105;110;116;32;110;117;109;101;114;111;49;32;61;32;49; - - - 105;110;116;32;110;117;109;101;114;111;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;113;117;97;110;116;105;100;97;100;101; - 105;43;43; - - - 105;110;116;32;110;117;109;101;114;111;51;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;51; - - - 110;117;109;101;114;111;49;32;61;32;110;117;109;101;114;111;50; - - - 110;117;109;101;114;111;50;32;61;32;110;117;109;101;114;111;51; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct deleted file mode 100644 index d55cbaf9..00000000 --- a/web/lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;233;32;112;97;114;34; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;233;32;237;109;112;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct deleted file mode 100644 index ec2a5ffc..00000000 --- a/web/lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;73;86;65;32;61;32;48;46;50;51; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;99;111;83;101;109;73;118;97;32;34;80;114;101;231;111;32;115;101;109;32;73;86;65;63;34; - - - 100;111;117;98;108;101;32;105;109;112;111;115;116;111;32;61;32;112;114;101;99;111;83;101;109;73;118;97;32;42;32;73;86;65; - - - 100;111;117;98;108;101;32;112;114;101;99;111;67;111;109;73;118;97;32;61;32;112;114;101;99;111;83;101;109;73;118;97;32;43;32;105;109;112;111;115;116;111; - - - 111;117;116;112;117;116;58;32;105;109;112;111;115;116;111; - - - 111;117;116;112;117;116;58;32;112;114;101;99;111;67;111;109;73;118;97; - - diff --git a/web/lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct deleted file mode 100644 index 6e65f4ec..00000000 --- a/web/lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;116;101;110;116;97;116;105;118;97;115;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;110;116;114;97;100;97;32;34;73;110;116;114;111;100;117;122;32;111;32;80;73;78;34; - - - 112;105;110;32;61;32;101;110;116;114;97;100;97; - - - 116;101;110;116;97;116;105;118;97;115;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;116;227;111;32;98;108;111;113;117;101;97;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-pin-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-pin-loesung.visustruct deleted file mode 100644 index 91c73954..00000000 --- a/web/lessons/diagramme/pt/aufgabe-pin-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;116;101;110;116;97;116;105;118;97;115;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;73;110;116;114;111;100;117;122;32;111;32;80;73;78;34; - - - 116;101;110;116;97;116;105;118;97;115;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;116;227;111;32;98;108;111;113;117;101;97;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct deleted file mode 100644 index 1e718be1..00000000 --- a/web/lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;49;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;50;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;100;111;114;32;34;79;112;101;114;97;100;111;114;32;40;43;44;32;45;32;111;117;32;42;41;34; - - - 111;112;101;114;97;100;111;114; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;45;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;42;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 111;117;116;112;117;116;58;32;34;79;112;101;114;97;100;111;114;32;100;101;115;99;111;110;104;101;99;105;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct deleted file mode 100644 index 72a9a1c8..00000000 --- a/web/lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;97;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;97;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;110;97;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;109;97;114;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 105;110;116;32;99;111;108;117;110;97;32;61;32;48; - 99;111;108;117;110;97;32;60;32;109;97;114;91;102;105;108;97;93;46;108;101;110;103;116;104; - 99;111;108;117;110;97;43;43; - - - 109;97;114;91;102;105;108;97;93;91;99;111;108;117;110;97;93; - - - 111;117;116;112;117;116;58;32;99;111;108;117;110;97;115;91;99;111;108;117;110;97;93;32;43;32;40;102;105;108;97;32;43;32;49;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-schiffe-start.visustruct b/web/lessons/diagramme/pt/aufgabe-schiffe-start.visustruct deleted file mode 100644 index 57468b14..00000000 --- a/web/lessons/diagramme/pt/aufgabe-schiffe-start.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;97;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;97;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;110;97;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - diff --git a/web/lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct deleted file mode 100644 index 4ff18c2b..00000000 --- a/web/lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;97;116;111;32;34;81;117;101;32;112;114;97;116;111;63;32;40;49;44;32;50;32;111;117;32;51;41;34; - - - 112;114;97;116;111; - - - 111;117;116;112;117;116;58;32;34;83;97;108;97;100;97;32;103;114;101;103;97;34; - - - - - 111;117;116;112;117;116;58;32;34;66;97;99;97;108;104;97;117;32;224;32;66;114;225;115;34; - - - - - 111;117;116;112;117;116;58;32;34;87;114;97;112;32;100;101;32;102;97;108;97;102;101;108;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;101;32;117;109;32;110;250;109;101;114;111;32;118;225;108;105;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-summe-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-summe-loesung.visustruct deleted file mode 100644 index 24676f08..00000000 --- a/web/lessons/diagramme/pt/aufgabe-summe-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;49;32;61;32;52; - - - 105;110;116;32;110;117;109;101;114;111;50;32;61;32;51; - - - 105;110;116;32;115;111;109;97;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct deleted file mode 100644 index 07781f6a..00000000 --- a/web/lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;111;109;101;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;111;109;101;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;115;111;114;116;101;97;100;111;32;34;78;250;109;101;114;111;32;115;111;114;116;101;97;100;111;32;40;49;32;97;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;76;105;109;112;97;32;111;32;113;117;97;100;114;111;58;32;34;32;43;32;110;111;109;101;115;91;115;111;114;116;101;97;100;111;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct deleted file mode 100644 index 7a6c95a4..00000000 --- a/web/lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;117;112;108;105;99;97;100;111;58;32;34;32;43;32;110;117;109;101;114;111; - - diff --git a/web/lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct deleted file mode 100644 index b2fffdcb..00000000 --- a/web/lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;61;32;98;105;99;105;99;108;101;116;97;32;101;108;233;116;114;105;99;97;44;32;50;32;61;32;116;114;111;116;105;110;101;116;101;32;101;108;233;116;114;105;99;97;44;32;48;32;61;32;115;97;105;114;34; - - - 101;115;99;111;108;104;97;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - - -1; - - - - - 101;115;99;111;108;104;97;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;66;105;99;105;99;108;101;116;97;32;114;101;115;101;114;118;97;100;97;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;84;114;111;116;105;110;101;116;101;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;97;32;105;110;118;225;108;105;100;97;34; - - - - - - - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct deleted file mode 100644 index c24b29ce..00000000 --- a/web/lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;61;32;98;105;99;105;99;108;101;116;97;32;101;108;233;116;114;105;99;97;44;32;50;32;61;32;116;114;111;116;105;110;101;116;101;32;101;108;233;116;114;105;99;97;44;32;48;32;61;32;115;97;105;114;34; - - - 101;115;99;111;108;104;97; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - - 83;97;105;114;32;100;111;32;109;101;110;117; - - - - - 111;117;116;112;117;116;58;32;34;66;105;99;105;99;108;101;116;97;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;84;114;111;116;105;110;101;116;101;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;97;32;105;110;118;225;108;105;100;97;34; - - - - - - diff --git a/web/lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct deleted file mode 100644 index 8428b1f0..00000000 --- a/web/lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct +++ /dev/null @@ -1,60 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;101;114;116;97;115;32;61;32;48; - - - 105;110;116;32;99;111;110;116;97;103;101;109;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;67;111;109;111;32;115;101;32;100;105;122;32;34;32;43;32;112;97;114;116;101;115;91;48;93;32;43;32;34;32;101;109;32;105;110;103;108;234;115;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;114;101;115;112;111;115;116;97; - - - 99;111;110;116;97;103;101;109;43;43; - - - 114;101;115;112;111;115;116;97;46;101;113;117;97;108;115;40;112;97;114;116;101;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;67;101;114;116;111;33;34; - - - 99;101;114;116;97;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;69;114;114;97;100;111;44;32;233;32;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;46;34; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;101;114;116;97;115;32;43;32;34;32;100;101;32;34;32;43;32;99;111;110;116;97;103;101;109;32;43;32;34;32;99;101;114;116;97;115;34; - - diff --git a/web/lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct b/web/lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct deleted file mode 100644 index 878d7ebb..00000000 --- a/web/lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct b/web/lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct deleted file mode 100644 index c6df7fd9..00000000 --- a/web/lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;109;97;105;111;114;32;100;101;32;105;100;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;109;101;110;111;114;32;100;101;32;105;100;97;100;101;34; - - - - diff --git a/web/lessons/diagramme/pt/dt-buffered.visustruct b/web/lessons/diagramme/pt/dt-buffered.visustruct deleted file mode 100644 index 27a64807..00000000 --- a/web/lessons/diagramme/pt/dt-buffered.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/dt-csv.visustruct b/web/lessons/diagramme/pt/dt-csv.visustruct deleted file mode 100644 index 600f54e2..00000000 --- a/web/lessons/diagramme/pt/dt-csv.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - 105;110;116;32;109;97;116;101;109;97;116;105;99;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;109;97;116;101;109;97;116;105;99;97;32;43;32;34;32;97;32;77;97;116;101;109;225;116;105;99;97;34; - - diff --git a/web/lessons/diagramme/pt/dt-json.visustruct b/web/lessons/diagramme/pt/dt-json.visustruct deleted file mode 100644 index 7b3c846a..00000000 --- a/web/lessons/diagramme/pt/dt-json.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;123;92;34;110;111;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;101;115;112;101;99;105;101;92;34;58;32;92;34;99;97;98;114;97;92;34;44;32;92;34;105;100;97;100;101;92;34;58;32;54;125;44;34; - - - 105;110;116;32;105;110;105;99;105;111;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;110;111;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;102;105;109;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;105;110;105;99;105;111;41; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;108;105;110;104;97;46;115;117;98;115;116;114;105;110;103;40;105;110;105;99;105;111;44;32;102;105;109;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101; - - diff --git a/web/lessons/diagramme/pt/dt-lesen.visustruct b/web/lessons/diagramme/pt/dt-lesen.visustruct deleted file mode 100644 index 2b271a1b..00000000 --- a/web/lessons/diagramme/pt/dt-lesen.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/kino-einmaleins-loesung.visustruct b/web/lessons/diagramme/pt/kino-einmaleins-loesung.visustruct deleted file mode 100644 index 46fa2078..00000000 --- a/web/lessons/diagramme/pt/kino-einmaleins-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;116;97;98;101;108;97;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;101;108;97;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;101;108;97;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;101;108;97;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;32;40;49;32;97;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;32;40;49;32;97;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;97;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - diff --git a/web/lessons/diagramme/pt/kino-frei-loesung.visustruct b/web/lessons/diagramme/pt/kino-frei-loesung.visustruct deleted file mode 100644 index b41a0636..00000000 --- a/web/lessons/diagramme/pt/kino-frei-loesung.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;108;105;118;114;101;115;32;61;32;48; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 105;110;116;32;108;117;103;97;114;32;61;32;48; - 108;117;103;97;114;32;60;32;108;117;103;97;114;101;115;91;102;105;108;97;93;46;108;101;110;103;116;104; - 108;117;103;97;114;43;43; - - - 33;108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 108;105;118;114;101;115;32;61;32;108;105;118;114;101;115;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;76;105;118;114;101;115;58;32;34;32;43;32;108;105;118;114;101;115; - - diff --git a/web/lessons/diagramme/pt/kino-frei-start.visustruct b/web/lessons/diagramme/pt/kino-frei-start.visustruct deleted file mode 100644 index 3f5fcdb7..00000000 --- a/web/lessons/diagramme/pt/kino-frei-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - diff --git a/web/lessons/diagramme/pt/kino-karte-loesung.visustruct b/web/lessons/diagramme/pt/kino-karte-loesung.visustruct deleted file mode 100644 index fe0340b2..00000000 --- a/web/lessons/diagramme/pt/kino-karte-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;102;105;108;97;32;34;70;105;108;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;117;103;97;114;32;34;76;117;103;97;114;34; - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 111;117;116;112;117;116;58;32;34;74;225;32;118;101;110;100;105;100;111;34; - - - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;86;101;110;100;105;100;111;58;32;102;105;108;97;32;34;32;43;32;102;105;108;97;32;43;32;34;44;32;108;117;103;97;114;32;34;32;43;32;108;117;103;97;114; - - - - diff --git a/web/lessons/diagramme/pt/kino-karte-start.visustruct b/web/lessons/diagramme/pt/kino-karte-start.visustruct deleted file mode 100644 index eeefcbdc..00000000 --- a/web/lessons/diagramme/pt/kino-karte-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;102;105;108;97;32;34;70;105;108;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;117;103;97;114;32;34;76;117;103;97;114;34; - - diff --git a/web/lessons/diagramme/pt/kino-saalplan.visustruct b/web/lessons/diagramme/pt/kino-saalplan.visustruct deleted file mode 100644 index f725ccea..00000000 --- a/web/lessons/diagramme/pt/kino-saalplan.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;34; - - - 105;110;116;32;108;117;103;97;114;32;61;32;48; - 108;117;103;97;114;32;60;32;108;117;103;97;114;101;115;91;102;105;108;97;93;46;108;101;110;103;116;104; - 108;117;103;97;114;43;43; - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;88;34; - - - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - diff --git a/web/lessons/diagramme/pt/kino-verkaufen.visustruct b/web/lessons/diagramme/pt/kino-verkaufen.visustruct deleted file mode 100644 index 12d70197..00000000 --- a/web/lessons/diagramme/pt/kino-verkaufen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;70;105;108;97;115;58;32;34;32;43;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;76;117;103;97;114;101;115;32;112;111;114;32;102;105;108;97;58;32;34;32;43;32;108;117;103;97;114;101;115;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;70;105;108;97;32;49;44;32;108;117;103;97;114;32;50;32;118;101;110;100;105;100;111;63;32;34;32;43;32;108;117;103;97;114;101;115;91;49;93;91;50;93; - - diff --git a/web/lessons/diagramme/pt/l04-gross-klein-loesung.visustruct b/web/lessons/diagramme/pt/l04-gross-klein-loesung.visustruct deleted file mode 100644 index 94febc4d..00000000 --- a/web/lessons/diagramme/pt/l04-gross-klein-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 105;110;116;32;78;117;109;101;114;111;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;78;117;109;101;114;111; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;97;100;111;58;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - diff --git a/web/lessons/diagramme/pt/l04-gross-klein-start.visustruct b/web/lessons/diagramme/pt/l04-gross-klein-start.visustruct deleted file mode 100644 index 070d436d..00000000 --- a/web/lessons/diagramme/pt/l04-gross-klein-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 105;110;116;32;78;117;109;101;114;111;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;78;85;77;69;82;79; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;97;100;111;58;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - diff --git a/web/lessons/diagramme/pt/l04-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l04-java-fehler-loesung.visustruct deleted file mode 100644 index 358965fd..00000000 --- a/web/lessons/diagramme/pt/l04-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/pt/l04-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l04-java-fehler-start.visustruct deleted file mode 100644 index 68c8d7f3..00000000 --- a/web/lessons/diagramme/pt/l04-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; - - diff --git a/web/lessons/diagramme/pt/l04-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l04-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 486512b0..00000000 --- a/web/lessons/diagramme/pt/l04-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l04-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l04-java-laeuft-nicht-start.visustruct deleted file mode 100644 index f836ebf2..00000000 --- a/web/lessons/diagramme/pt/l04-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;73;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34;41; - - diff --git a/web/lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct b/web/lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct deleted file mode 100644 index 37b12afd..00000000 --- a/web/lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 100;111;117;98;108;101;32;97;108;116;117;114;97;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/pt/l04-rechnen.visustruct b/web/lessons/diagramme/pt/l04-rechnen.visustruct deleted file mode 100644 index 009f1905..00000000 --- a/web/lessons/diagramme/pt/l04-rechnen.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - diff --git a/web/lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct b/web/lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct deleted file mode 100644 index 623b29c5..00000000 --- a/web/lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;51; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;52; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - diff --git a/web/lessons/diagramme/pt/l04-reihenfolge-start.visustruct b/web/lessons/diagramme/pt/l04-reihenfolge-start.visustruct deleted file mode 100644 index 1dbafec0..00000000 --- a/web/lessons/diagramme/pt/l04-reihenfolge-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;52; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;51; - - diff --git a/web/lessons/diagramme/pt/l04-tauschen-loesung.visustruct b/web/lessons/diagramme/pt/l04-tauschen-loesung.visustruct deleted file mode 100644 index 6b244a71..00000000 --- a/web/lessons/diagramme/pt/l04-tauschen-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; - - - 83;116;114;105;110;103;32;100;105;114;101;105;116;97;32;61;32;34;225;103;117;97;34; - - - 83;116;114;105;110;103;32;97;117;120;32;61;32;101;115;113;117;101;114;100;97; - - - 101;115;113;117;101;114;100;97;32;61;32;100;105;114;101;105;116;97; - - - 100;105;114;101;105;116;97;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;69;115;113;117;101;114;100;97;58;32;34;32;43;32;101;115;113;117;101;114;100;97; - - - 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; - - diff --git a/web/lessons/diagramme/pt/l04-tauschen-start.visustruct b/web/lessons/diagramme/pt/l04-tauschen-start.visustruct deleted file mode 100644 index af12d118..00000000 --- a/web/lessons/diagramme/pt/l04-tauschen-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; - - - 83;116;114;105;110;103;32;100;105;114;101;105;116;97;32;61;32;34;225;103;117;97;34; - - - 111;117;116;112;117;116;58;32;34;69;115;113;117;101;114;100;97;58;32;34;32;43;32;101;115;113;117;101;114;100;97; - - - 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; - - diff --git a/web/lessons/diagramme/pt/l04-tauschen.visustruct b/web/lessons/diagramme/pt/l04-tauschen.visustruct deleted file mode 100644 index 4be6aae1..00000000 --- a/web/lessons/diagramme/pt/l04-tauschen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/pt/l05-datentypen.visustruct b/web/lessons/diagramme/pt/l05-datentypen.visustruct deleted file mode 100644 index 599ee696..00000000 --- a/web/lessons/diagramme/pt/l05-datentypen.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;52; - - - 100;111;117;98;108;101;32;97;108;116;117;114;97;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;73;110;234;115;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; - - diff --git a/web/lessons/diagramme/pt/l05-division.visustruct b/web/lessons/diagramme/pt/l05-division.visustruct deleted file mode 100644 index 01533e16..00000000 --- a/web/lessons/diagramme/pt/l05-division.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;49;51;53; - - - 105;110;116;32;104;111;114;97;115;32;61;32;109;105;110;117;116;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;109;105;110;117;116;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;104;111;114;97;115;32;43;32;34;32;104;111;114;97;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;109;105;110;117;116;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l05-einkauf-loesung.visustruct b/web/lessons/diagramme/pt/l05-einkauf-loesung.visustruct deleted file mode 100644 index 85deedd6..00000000 --- a/web/lessons/diagramme/pt/l05-einkauf-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;101;99;111;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;112;114;101;99;111;84;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;112;114;101;99;111; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;112;114;101;99;111;84;111;116;97;108;32;43;32;34;32;101;117;114;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l05-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l05-java-fehler-loesung.visustruct deleted file mode 100644 index 29a4d575..00000000 --- a/web/lessons/diagramme/pt/l05-java-fehler-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;97;108;100;111;32;61;32;50;48; - - - 105;110;116;32;112;114;101;99;111;32;61;32;55; - - - 115;97;108;100;111;32;61;32;115;97;108;100;111;32;45;32;112;114;101;99;111; - - - 111;117;116;112;117;116;58;32;34;82;101;115;116;97;58;32;34;32;43;32;115;97;108;100;111; - - diff --git a/web/lessons/diagramme/pt/l05-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l05-java-fehler-start.visustruct deleted file mode 100644 index 9c7b9e8d..00000000 --- a/web/lessons/diagramme/pt/l05-java-fehler-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;97;108;100;111;32;61;32;50;48; - - - 105;110;116;32;112;114;101;99;111;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;82;101;115;116;97;58;32;34;32;43;32;115;97;108;100;111; - - - 115;97;108;100;111;32;61;32;115;97;108;100;111;32;45;32;112;114;101;99;111; - - diff --git a/web/lessons/diagramme/pt/l05-java-kino-loesung.visustruct b/web/lessons/diagramme/pt/l05-java-kino-loesung.visustruct deleted file mode 100644 index 1a4fd66f..00000000 --- a/web/lessons/diagramme/pt/l05-java-kino-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;114;101;99;111;32;61;32;57; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;101;99;111;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/pt/l05-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l05-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 3dcbf271..00000000 --- a/web/lessons/diagramme/pt/l05-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;102;97;116;105;97;115;32;61;32;56; - - - 105;110;116;32;112;101;115;115;111;97;115;32;61;32;52; - - - 105;110;116;32;112;111;114;80;101;115;115;111;97;32;61;32;102;97;116;105;97;115;32;47;32;112;101;115;115;111;97;115; - - - 111;117;116;112;117;116;58;32;34;67;97;100;97;32;117;109;32;114;101;99;101;98;101;32;34;32;43;32;112;111;114;80;101;115;115;111;97;32;43;32;34;32;102;97;116;105;97;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l05-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l05-java-laeuft-nicht-start.visustruct deleted file mode 100644 index c43a4807..00000000 --- a/web/lessons/diagramme/pt/l05-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;102;97;116;105;97;115;32;61;32;56; - - - 105;110;116;32;112;101;115;115;111;97;115;32;61;32;52; - - - 105;110;116;32;112;111;114;80;101;115;115;111;97;32;61;32;102;97;116;105;97;115;32;47;32;112;101;115;115;111;97;115; - - - 111;117;116;112;117;116;58;32;34;67;97;100;97;32;117;109;32;114;101;99;101;98;101;32;34;32;43;32;112;111;114;112;101;115;115;111;97;32;43;32;34;32;102;97;116;105;97;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l05-rechteck-loesung.visustruct b/web/lessons/diagramme/pt/l05-rechteck-loesung.visustruct deleted file mode 100644 index a3934ea2..00000000 --- a/web/lessons/diagramme/pt/l05-rechteck-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;61;32;55; - - - 105;110;116;32;108;97;114;103;117;114;97;32;61;32;52; - - - 105;110;116;32;97;114;101;97;32;61;32;99;111;109;112;114;105;109;101;110;116;111;32;42;32;108;97;114;103;117;114;97; - - - 105;110;116;32;112;101;114;105;109;101;116;114;111;32;61;32;50;32;42;32;40;99;111;109;112;114;105;109;101;110;116;111;32;43;32;108;97;114;103;117;114;97;41; - - - 111;117;116;112;117;116;58;32;34;193;114;101;97;58;32;34;32;43;32;97;114;101;97; - - - 111;117;116;112;117;116;58;32;34;80;101;114;237;109;101;116;114;111;58;32;34;32;43;32;112;101;114;105;109;101;116;114;111; - - diff --git a/web/lessons/diagramme/pt/l05-sekunden-loesung.visustruct b/web/lessons/diagramme/pt/l05-sekunden-loesung.visustruct deleted file mode 100644 index 62eb9940..00000000 --- a/web/lessons/diagramme/pt/l05-sekunden-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l05-sekunden-start.visustruct b/web/lessons/diagramme/pt/l05-sekunden-start.visustruct deleted file mode 100644 index f5803d1d..00000000 --- a/web/lessons/diagramme/pt/l05-sekunden-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l05-sequenz.visustruct b/web/lessons/diagramme/pt/l05-sequenz.visustruct deleted file mode 100644 index 380d07db..00000000 --- a/web/lessons/diagramme/pt/l05-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;61;32;53; - - - 105;110;116;32;108;97;114;103;117;114;97;32;61;32;51; - - - 105;110;116;32;97;114;101;97;32;61;32;99;111;109;112;114;105;109;101;110;116;111;32;42;32;108;97;114;103;117;114;97; - - - 111;117;116;112;117;116;58;32;97;114;101;97; - - diff --git a/web/lessons/diagramme/pt/l06-begruessung-loesung.visustruct b/web/lessons/diagramme/pt/l06-begruessung-loesung.visustruct deleted file mode 100644 index dd754a20..00000000 --- a/web/lessons/diagramme/pt/l06-begruessung-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;67;111;109;111;32;116;101;32;99;104;97;109;97;115;63;34; - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101;32;43;32;34;33;34; - - diff --git a/web/lessons/diagramme/pt/l06-eva.visustruct b/web/lessons/diagramme/pt/l06-eva.visustruct deleted file mode 100644 index a695c357..00000000 --- a/web/lessons/diagramme/pt/l06-eva.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l06-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l06-java-fehler-loesung.visustruct deleted file mode 100644 index 8ecbd2e7..00000000 --- a/web/lessons/diagramme/pt/l06-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;40;97;32;43;32;98;41; - - diff --git a/web/lessons/diagramme/pt/l06-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l06-java-fehler-start.visustruct deleted file mode 100644 index 4e4723bc..00000000 --- a/web/lessons/diagramme/pt/l06-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;97;32;43;32;98; - - diff --git a/web/lessons/diagramme/pt/l06-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l06-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 90dc1170..00000000 --- a/web/lessons/diagramme/pt/l06-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;243;120;105;109;111;32;97;110;111;32;116;101;110;115;32;34;32;43;32;40;105;100;97;100;101;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/pt/l06-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l06-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 9b16b8f4..00000000 --- a/web/lessons/diagramme/pt/l06-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;243;120;105;109;111;32;97;110;111;32;116;101;110;115;32;34;32;43;32;40;73;100;97;100;101;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/pt/l06-java-tage-loesung.visustruct b/web/lessons/diagramme/pt/l06-java-tage-loesung.visustruct deleted file mode 100644 index a3a2bd8b..00000000 --- a/web/lessons/diagramme/pt/l06-java-tage-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;111;115;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;110;116;32;100;105;97;115;32;61;32;97;110;111;115;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;83;227;111;32;99;101;114;99;97;32;100;101;32;34;32;43;32;100;105;97;115;32;43;32;34;32;100;105;97;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l06-mittelwert-loesung.visustruct b/web/lessons/diagramme/pt/l06-mittelwert-loesung.visustruct deleted file mode 100644 index 55e47560..00000000 --- a/web/lessons/diagramme/pt/l06-mittelwert-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;58;32;34;32;43;32;109;101;100;105;97; - - diff --git a/web/lessons/diagramme/pt/l06-rechner-loesung.visustruct b/web/lessons/diagramme/pt/l06-rechner-loesung.visustruct deleted file mode 100644 index ff67d0d6..00000000 --- a/web/lessons/diagramme/pt/l06-rechner-loesung.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;116;111;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;116;111;58;32;34;32;43;32;112;114;111;100;117;116;111; - - diff --git a/web/lessons/diagramme/pt/l07-alter-pruefen.visustruct b/web/lessons/diagramme/pt/l07-alter-pruefen.visustruct deleted file mode 100644 index 16636f6a..00000000 --- a/web/lessons/diagramme/pt/l07-alter-pruefen.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;201;115;32;109;97;105;111;114;32;100;101;32;105;100;97;100;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;105;110;100;97;32;110;227;111;32;233;115;32;109;97;105;111;114;32;100;101;32;105;100;97;100;101;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l07-betrag-loesung.visustruct b/web/lessons/diagramme/pt/l07-betrag-loesung.visustruct deleted file mode 100644 index 014d3bd4..00000000 --- a/web/lessons/diagramme/pt/l07-betrag-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111;32;60;32;48; - - - 110;117;109;101;114;111;32;61;32;48;32;45;32;110;117;109;101;114;111; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - diff --git a/web/lessons/diagramme/pt/l07-gerade-loesung.visustruct b/web/lessons/diagramme/pt/l07-gerade-loesung.visustruct deleted file mode 100644 index 62a33245..00000000 --- a/web/lessons/diagramme/pt/l07-gerade-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;112;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;237;109;112;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/l07-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l07-java-fehler-loesung.visustruct deleted file mode 100644 index 70c44da2..00000000 --- a/web/lessons/diagramme/pt/l07-java-fehler-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;53; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - diff --git a/web/lessons/diagramme/pt/l07-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l07-java-fehler-start.visustruct deleted file mode 100644 index d6df005e..00000000 --- a/web/lessons/diagramme/pt/l07-java-fehler-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;53; - - - 112;111;110;116;111;115;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - diff --git a/web/lessons/diagramme/pt/l07-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l07-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 817d1131..00000000 --- a/web/lessons/diagramme/pt/l07-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - diff --git a/web/lessons/diagramme/pt/l07-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l07-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 666440a0..00000000 --- a/web/lessons/diagramme/pt/l07-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - diff --git a/web/lessons/diagramme/pt/l07-java-pizza-loesung.visustruct b/web/lessons/diagramme/pt/l07-java-pizza-loesung.visustruct deleted file mode 100644 index d720f965..00000000 --- a/web/lessons/diagramme/pt/l07-java-pizza-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;101;99;111;32;61;32;56; - - - 105;110;116;32;113;117;101;105;106;111;32;61;32;50; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;40;112;114;101;99;111;32;43;32;113;117;101;105;106;111;41;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/pt/l07-java-pizza-start.visustruct b/web/lessons/diagramme/pt/l07-java-pizza-start.visustruct deleted file mode 100644 index 76b1479e..00000000 --- a/web/lessons/diagramme/pt/l07-java-pizza-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 105;110;116;32;112;114;101;99;111;32;61;32;56; - - - 105;110;116;32;113;117;101;105;106;111;32;61;32;50; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;101;99;111;32;43;32;113;117;101;105;106;111;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/pt/l07-maximum-loesung.visustruct b/web/lessons/diagramme/pt/l07-maximum-loesung.visustruct deleted file mode 100644 index f810fd6d..00000000 --- a/web/lessons/diagramme/pt/l07-maximum-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - diff --git a/web/lessons/diagramme/pt/l07-rabatt.visustruct b/web/lessons/diagramme/pt/l07-rabatt.visustruct deleted file mode 100644 index e27b79bd..00000000 --- a/web/lessons/diagramme/pt/l07-rabatt.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;99;111;32;34;80;114;101;231;111;32;101;109;32;101;117;114;111;115;63;34; - - - 112;114;101;99;111;32;62;32;53;48; - - - 112;114;101;99;111;32;61;32;112;114;101;99;111;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;65;32;112;97;103;97;114;58;32;34;32;43;32;112;114;101;99;111;32;43;32;34;32;101;117;114;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l08-gueltig-loesung.visustruct b/web/lessons/diagramme/pt/l08-gueltig-loesung.visustruct deleted file mode 100644 index 50359443..00000000 --- a/web/lessons/diagramme/pt/l08-gueltig-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; - - - 110;111;116;97;32;62;61;32;49;32;38;38;32;110;111;116;97;32;60;61;32;53; - - - 111;117;116;112;117;116;58;32;34;118;225;108;105;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;118;225;108;105;100;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct b/web/lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct deleted file mode 100644 index b2ad09c2..00000000 --- a/web/lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;112;111;110;116;111;115;32;34;81;117;97;110;116;111;115;32;112;111;110;116;111;115;63;34; - - - 112;111;110;116;111;115;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;97;112;114;111;118;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;114;101;112;114;111;118;97;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l08-java-fehler-loesung.visustruct deleted file mode 100644 index 6cfd1f42..00000000 --- a/web/lessons/diagramme/pt/l08-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l08-java-fehler-start.visustruct deleted file mode 100644 index 2032550c..00000000 --- a/web/lessons/diagramme/pt/l08-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l08-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index e67f03cf..00000000 --- a/web/lessons/diagramme/pt/l08-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;53; - - - 105;100;97;100;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;32;101;110;116;114;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;112;111;100;101;32;101;110;116;114;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l08-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 81e5beaa..00000000 --- a/web/lessons/diagramme/pt/l08-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;53; - - - 73;100;97;100;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;32;101;110;116;114;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;112;111;100;101;32;101;110;116;114;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-jugendticket.visustruct b/web/lessons/diagramme/pt/l08-jugendticket.visustruct deleted file mode 100644 index cbca48c0..00000000 --- a/web/lessons/diagramme/pt/l08-jugendticket.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;50;32;38;38;32;105;100;97;100;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;106;111;118;101;109;34; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;32;98;105;108;104;101;116;101;32;106;111;118;101;109;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-note.visustruct b/web/lessons/diagramme/pt/l08-note.visustruct deleted file mode 100644 index f29ec9a0..00000000 --- a/web/lessons/diagramme/pt/l08-note.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; - - - 110;111;116;97;32;60;32;49;32;124;124;32;110;111;116;97;32;62;32;53; - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;110;111;116;97;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;32;110;111;116;97;32;34;32;43;32;110;111;116;97;32;43;32;34;32;233;32;118;225;108;105;100;97;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct b/web/lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct deleted file mode 100644 index abfb9f9a..00000000 --- a/web/lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;111;32;34;65;110;111;63;34; - - - 40;97;110;111;32;37;32;52;32;61;61;32;48;32;38;38;32;97;110;111;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;97;110;111;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;65;110;111;32;98;105;115;115;101;120;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;233;32;97;110;111;32;98;105;115;115;101;120;116;111;34; - - - - diff --git a/web/lessons/diagramme/pt/l08-wochenende-loesung.visustruct b/web/lessons/diagramme/pt/l08-wochenende-loesung.visustruct deleted file mode 100644 index 8f51bddc..00000000 --- a/web/lessons/diagramme/pt/l08-wochenende-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;68;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;70;105;109;32;100;101;32;115;101;109;97;110;97;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;97;32;250;116;105;108;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-ampel.visustruct b/web/lessons/diagramme/pt/l09-ampel.visustruct deleted file mode 100644 index 404bd545..00000000 --- a/web/lessons/diagramme/pt/l09-ampel.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;114;32;34;68;101;32;113;117;101;32;99;111;114;32;101;115;116;225;32;111;32;115;101;109;225;102;111;114;111;63;34; - - - 99;111;114; - - - 111;117;116;112;117;116;58;32;34;80;97;114;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;112;101;114;97;34; - - - - - 111;117;116;112;117;116;58;32;34;65;118;97;110;231;97;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;99;111;110;104;101;231;111;32;101;115;116;97;32;99;111;114;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-automat.visustruct b/web/lessons/diagramme/pt/l09-automat.visustruct deleted file mode 100644 index d516cbce..00000000 --- a/web/lessons/diagramme/pt/l09-automat.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; - - - 101;115;99;111;108;104;97; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;97;32;116;117;97;32;225;103;117;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;115;117;109;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;101;32;98;111;116;227;111;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l09-java-fehler-loesung.visustruct deleted file mode 100644 index 55e1be7e..00000000 --- a/web/lessons/diagramme/pt/l09-java-fehler-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l09-java-fehler-start.visustruct deleted file mode 100644 index 7af9c76e..00000000 --- a/web/lessons/diagramme/pt/l09-java-fehler-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;38;38;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l09-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 8b4ae283..00000000 --- a/web/lessons/diagramme/pt/l09-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;100;105;97;32;61;32;55; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l09-java-laeuft-nicht-start.visustruct deleted file mode 100644 index a374f5c3..00000000 --- a/web/lessons/diagramme/pt/l09-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;100;105;97;32;61;32;55; - - - 100;105;97;32;61;61;32;54;32;124;124;32;68;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-java-schule-loesung.visustruct b/web/lessons/diagramme/pt/l09-java-schule-loesung.visustruct deleted file mode 100644 index 92ecaa0c..00000000 --- a/web/lessons/diagramme/pt/l09-java-schule-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;114;97;32;34;81;117;101;32;104;111;114;97;115;32;115;227;111;32;40;115;243;32;97;32;104;111;114;97;41;63;34; - - - 104;111;114;97;32;62;61;32;56;32;38;38;32;104;111;114;97;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;111;32;108;105;118;114;101;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-note-loesung.visustruct b/web/lessons/diagramme/pt/l09-note-loesung.visustruct deleted file mode 100644 index e0a05f0a..00000000 --- a/web/lessons/diagramme/pt/l09-note-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;81;117;101;32;110;111;116;97;63;34; - - - 110;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;105;110;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;97;32;105;110;118;225;108;105;100;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-rechner-loesung.visustruct b/web/lessons/diagramme/pt/l09-rechner-loesung.visustruct deleted file mode 100644 index 1cfedbf0..00000000 --- a/web/lessons/diagramme/pt/l09-rechner-loesung.visustruct +++ /dev/null @@ -1,47 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;100;111;114;32;34;79;112;101;114;97;100;111;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;48; - - - 111;112;101;114;97;100;111;114; - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 111;117;116;112;117;116;58;32;34;79;112;101;114;97;100;111;114;32;100;101;115;99;111;110;104;101;99;105;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/l09-verschachtelt.visustruct b/web/lessons/diagramme/pt/l09-verschachtelt.visustruct deleted file mode 100644 index ef157db2..00000000 --- a/web/lessons/diagramme/pt/l09-verschachtelt.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; - - - 101;115;99;111;108;104;97;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;97;32;116;117;97;32;225;103;117;97;46;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;115;117;109;111;46;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;101;32;98;111;116;227;111;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - - - - - diff --git a/web/lessons/diagramme/pt/l1-grundbausteine.visustruct b/web/lessons/diagramme/pt/l1-grundbausteine.visustruct deleted file mode 100644 index 23018719..00000000 --- a/web/lessons/diagramme/pt/l1-grundbausteine.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 80;244;114;32;117;109;97;32;99;104;225;118;101;110;97;32;110;97;32;109;101;115;97; - - - 81;117;101;114;32;97;231;250;99;97;114;63; - - - 74;117;110;116;97;114;32;97;231;250;99;97;114; - - - - - 248; - - - - - 67;104;225;32;97;105;110;100;97;32;100;101;109;97;115;105;97;100;111;32;113;117;101;110;116;101; - - - 69;115;112;101;114;97;114;32;49;32;109;105;110;117;116;111; - - - - - 66;101;98;101;114;32;111;32;99;104;225; - - diff --git a/web/lessons/diagramme/pt/l1-sequenz.visustruct b/web/lessons/diagramme/pt/l1-sequenz.visustruct deleted file mode 100644 index efca5ad9..00000000 --- a/web/lessons/diagramme/pt/l1-sequenz.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 76;101;118;97;110;116;97;114; - - - 76;97;118;97;114;32;111;115;32;100;101;110;116;101;115; - - - 86;101;115;116;105;114; - - - 84;111;109;97;114;32;111;32;112;101;113;117;101;110;111;45;97;108;109;111;231;111; - - diff --git a/web/lessons/diagramme/pt/l1-tee.visustruct b/web/lessons/diagramme/pt/l1-tee.visustruct deleted file mode 100644 index 11dfc44b..00000000 --- a/web/lessons/diagramme/pt/l1-tee.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 69;110;99;104;101;114;32;97;32;99;104;97;108;101;105;114;97;32;99;111;109;32;225;103;117;97; - - - 76;105;103;97;114;32;97;32;99;104;97;108;101;105;114;97; - - - 80;244;114;32;117;109;97;32;115;97;113;117;101;116;97;32;100;101;32;99;104;225;32;110;97;32;99;104;225;118;101;110;97; - - - 68;101;105;116;97;114;32;225;103;117;97;32;113;117;101;110;116;101;32;110;97;32;99;104;225;118;101;110;97; - - - 69;115;112;101;114;97;114;32;51;32;109;105;110;117;116;111;115; - - - 84;105;114;97;114;32;97;32;115;97;113;117;101;116;97;32;100;101;32;99;104;225; - - diff --git a/web/lessons/diagramme/pt/l1-verzweigung.visustruct b/web/lessons/diagramme/pt/l1-verzweigung.visustruct deleted file mode 100644 index eb6d5fcc..00000000 --- a/web/lessons/diagramme/pt/l1-verzweigung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 69;115;116;225;32;97;32;99;104;111;118;101;114;63; - - - 76;101;118;97;114;32;103;117;97;114;100;97;45;99;104;117;118;97; - - - - - 76;101;118;97;114;32;243;99;117;108;111;115;32;100;101;32;115;111;108; - - - - - 83;97;105;114; - - diff --git a/web/lessons/diagramme/pt/l1-wiederholung.visustruct b/web/lessons/diagramme/pt/l1-wiederholung.visustruct deleted file mode 100644 index 0bca7c36..00000000 --- a/web/lessons/diagramme/pt/l1-wiederholung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 80;114;97;116;111;32;110;227;111;32;118;97;122;105;111; - - - 68;97;114;32;117;109;97;32;103;97;114;102;97;100;97; - - - - - 76;101;118;97;110;116;97;114;32;111;32;112;114;97;116;111; - - diff --git a/web/lessons/diagramme/pt/l10-bis-n-loesung.visustruct b/web/lessons/diagramme/pt/l10-bis-n-loesung.visustruct deleted file mode 100644 index 4967e8b1..00000000 --- a/web/lessons/diagramme/pt/l10-bis-n-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;110;116;97;114;32;97;116;233;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/pt/l10-countdown.visustruct b/web/lessons/diagramme/pt/l10-countdown.visustruct deleted file mode 100644 index 6940e6b8..00000000 --- a/web/lessons/diagramme/pt/l10-countdown.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - diff --git a/web/lessons/diagramme/pt/l10-endlos.visustruct b/web/lessons/diagramme/pt/l10-endlos.visustruct deleted file mode 100644 index aeeb24d8..00000000 --- a/web/lessons/diagramme/pt/l10-endlos.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - diff --git a/web/lessons/diagramme/pt/l10-fakultaet.visustruct b/web/lessons/diagramme/pt/l10-fakultaet.visustruct deleted file mode 100644 index 27730b0c..00000000 --- a/web/lessons/diagramme/pt/l10-fakultaet.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;116;111;114;105;97;108;32;100;101;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;102;97;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;116;111;114;105;97;108;32;61;32;102;97;116;111;114;105;97;108;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;116;111;114;105;97;108; - - diff --git a/web/lessons/diagramme/pt/l10-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l10-java-fehler-loesung.visustruct deleted file mode 100644 index c664b769..00000000 --- a/web/lessons/diagramme/pt/l10-java-fehler-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;111;112;99;97;111;32;34;49;32;109;97;105;115;44;32;50;32;109;101;110;111;115;44;32;51;32;118;101;122;101;115;63;34; - - - 111;112;99;97;111; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;120;105;115;116;101;34; - - - - diff --git a/web/lessons/diagramme/pt/l10-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l10-java-fehler-start.visustruct deleted file mode 100644 index 9c434d97..00000000 --- a/web/lessons/diagramme/pt/l10-java-fehler-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;111;112;99;97;111;32;34;49;32;109;97;105;115;44;32;50;32;109;101;110;111;115;44;32;51;32;118;101;122;101;115;63;34; - - - 111;112;99;97;111; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;120;105;115;116;101;34; - - - - diff --git a/web/lessons/diagramme/pt/l10-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l10-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index ae44f8ff..00000000 --- a/web/lessons/diagramme/pt/l10-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;111;116;97;32;61;32;50; - - - 110;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;99;111;110;116;105;110;117;97;32;97;32;112;114;97;116;105;99;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/l10-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l10-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 70376ff5..00000000 --- a/web/lessons/diagramme/pt/l10-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;111;116;97;32;61;32;50; - - - 78;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;99;111;110;116;105;110;117;97;32;97;32;112;114;97;116;105;99;97;114;34; - - - - diff --git a/web/lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct b/web/lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct deleted file mode 100644 index 45271a75..00000000 --- a/web/lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111; - - - 111;117;116;112;117;116;58;32;34;117;109;34; - - - - - 111;117;116;112;117;116;58;32;34;100;111;105;115;34; - - - - - 111;117;116;112;117;116;58;32;34;116;114;234;115;34; - - - - - 111;117;116;112;117;116;58;32;34;110;227;111;32;99;111;110;104;101;231;111;34; - - - - diff --git a/web/lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct b/web/lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct deleted file mode 100644 index a8f63a40..00000000 --- a/web/lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;112;97;115;115;111;115;32;61;32;48; - - - 110;117;109;101;114;111;32;60;32;49;48;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 112;97;115;115;111;115;32;61;32;112;97;115;115;111;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;112;97;115;115;111;115; - - diff --git a/web/lessons/diagramme/pt/l11-eingabe-pruefen.visustruct b/web/lessons/diagramme/pt/l11-eingabe-pruefen.visustruct deleted file mode 100644 index 776d30c5..00000000 --- a/web/lessons/diagramme/pt/l11-eingabe-pruefen.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;48; - - - 110;117;109;101;114;111;32;60;32;49;32;124;124;32;110;117;109;101;114;111;32;62;32;49;48; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;100;101;32;49;32;97;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;79;98;114;105;103;97;100;111;33;34; - - diff --git a/web/lessons/diagramme/pt/l11-einmal.visustruct b/web/lessons/diagramme/pt/l11-einmal.visustruct deleted file mode 100644 index 6b74149f..00000000 --- a/web/lessons/diagramme/pt/l11-einmal.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/pt/l11-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l11-java-fehler-loesung.visustruct deleted file mode 100644 index 99c1af17..00000000 --- a/web/lessons/diagramme/pt/l11-java-fehler-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; - - - 105;110;116;32;100;105;110;104;101;105;114;111;32;61;32;48; - - - 105;110;116;32;115;101;109;97;110;97;115;32;61;32;48; - - - 100;105;110;104;101;105;114;111;32;60;32;111;98;106;101;116;105;118;111; - - - 100;105;110;104;101;105;114;111;32;61;32;100;105;110;104;101;105;114;111;32;43;32;53; - - - 115;101;109;97;110;97;115;32;61;32;115;101;109;97;110;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; - - diff --git a/web/lessons/diagramme/pt/l11-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l11-java-fehler-start.visustruct deleted file mode 100644 index 2470765d..00000000 --- a/web/lessons/diagramme/pt/l11-java-fehler-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; - - - 105;110;116;32;100;105;110;104;101;105;114;111;32;61;32;48; - - - 105;110;116;32;115;101;109;97;110;97;115;32;61;32;48; - - - 100;105;110;104;101;105;114;111;32;60;61;32;111;98;106;101;116;105;118;111; - - - 100;105;110;104;101;105;114;111;32;61;32;100;105;110;104;101;105;114;111;32;43;32;53; - - - 115;101;109;97;110;97;115;32;61;32;115;101;109;97;110;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; - - diff --git a/web/lessons/diagramme/pt/l11-java-gerade-loesung.visustruct b/web/lessons/diagramme/pt/l11-java-gerade-loesung.visustruct deleted file mode 100644 index d6d6f9cd..00000000 --- a/web/lessons/diagramme/pt/l11-java-gerade-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;111;110;100;101;63;34; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;50; - - - - diff --git a/web/lessons/diagramme/pt/l11-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l11-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 6940e6b8..00000000 --- a/web/lessons/diagramme/pt/l11-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - diff --git a/web/lessons/diagramme/pt/l11-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l11-java-laeuft-nicht-start.visustruct deleted file mode 100644 index b68d74fe..00000000 --- a/web/lessons/diagramme/pt/l11-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;78;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - diff --git a/web/lessons/diagramme/pt/l11-note-loesung.visustruct b/web/lessons/diagramme/pt/l11-note-loesung.visustruct deleted file mode 100644 index bd138ce6..00000000 --- a/web/lessons/diagramme/pt/l11-note-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;116;32;110;111;116;97;32;61;32;48; - - - 110;111;116;97;32;60;32;49;32;124;124;32;110;111;116;97;32;62;32;53; - - - 105;110;112;117;116;58;32;110;111;116;97;32;34;78;111;116;97;32;100;101;32;49;32;97;32;53;34; - - - - - 111;117;116;112;117;116;58;32;34;65;32;116;117;97;32;110;111;116;97;58;32;34;32;43;32;110;111;116;97; - - diff --git a/web/lessons/diagramme/pt/l11-summe-loesung.visustruct b/web/lessons/diagramme/pt/l11-summe-loesung.visustruct deleted file mode 100644 index 6500954c..00000000 --- a/web/lessons/diagramme/pt/l11-summe-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;48; - - - 110;117;109;101;114;111;32;33;61;32;48; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;40;48;32;116;101;114;109;105;110;97;41;34; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l12-countdown-loesung.visustruct b/web/lessons/diagramme/pt/l12-countdown-loesung.visustruct deleted file mode 100644 index dad90eb6..00000000 --- a/web/lessons/diagramme/pt/l12-countdown-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;74;225;33;34; - - diff --git a/web/lessons/diagramme/pt/l12-einmaleins-loesung.visustruct b/web/lessons/diagramme/pt/l12-einmaleins-loesung.visustruct deleted file mode 100644 index 5e2c1d8d..00000000 --- a/web/lessons/diagramme/pt/l12-einmaleins-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;116;111;32;61;32;110;117;109;101;114;111;32;42;32;105; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;116;111; - - - - diff --git a/web/lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct b/web/lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct deleted file mode 100644 index 42e13a57..00000000 --- a/web/lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/pt/l12-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l12-java-fehler-loesung.visustruct deleted file mode 100644 index 09c07721..00000000 --- a/web/lessons/diagramme/pt/l12-java-fehler-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - diff --git a/web/lessons/diagramme/pt/l12-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l12-java-fehler-start.visustruct deleted file mode 100644 index ff756bd3..00000000 --- a/web/lessons/diagramme/pt/l12-java-fehler-start.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;49; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - diff --git a/web/lessons/diagramme/pt/l12-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l12-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index cb93db74..00000000 --- a/web/lessons/diagramme/pt/l12-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;101;32;61;32;50;48; - - - 110;117;109;101;114;111;32;60;32;108;105;109;105;116;101; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/pt/l12-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l12-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 999008ed..00000000 --- a/web/lessons/diagramme/pt/l12-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;101;32;61;32;50;48; - - - 110;117;109;101;114;111;32;60;32;76;105;109;105;116;101; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - - diff --git a/web/lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct b/web/lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct deleted file mode 100644 index daef2150..00000000 --- a/web/lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;60;32;49;48;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - diff --git a/web/lessons/diagramme/pt/l12-summe.visustruct b/web/lessons/diagramme/pt/l12-summe.visustruct deleted file mode 100644 index a84881b4..00000000 --- a/web/lessons/diagramme/pt/l12-summe.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l13-dreieck.visustruct b/web/lessons/diagramme/pt/l13-dreieck.visustruct deleted file mode 100644 index 9ecddb9c..00000000 --- a/web/lessons/diagramme/pt/l13-dreieck.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;97;115;32;108;105;110;104;97;115;63;34; - - - 105;110;116;32;108;105;110;104;97;32;61;32;49; - 108;105;110;104;97;32;60;61;32;110; - 108;105;110;104;97;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;101;115;116;114;101;108;97;32;61;32;49; - 101;115;116;114;101;108;97;32;60;61;32;108;105;110;104;97; - 101;115;116;114;101;108;97;43;43; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - - - diff --git a/web/lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct b/web/lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct deleted file mode 100644 index 95b8c1f2..00000000 --- a/web/lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l13-gerade-zaehlen.visustruct b/web/lessons/diagramme/pt/l13-gerade-zaehlen.visustruct deleted file mode 100644 index 89219f45..00000000 --- a/web/lessons/diagramme/pt/l13-gerade-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l13-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l13-java-fehler-loesung.visustruct deleted file mode 100644 index 0fb53e25..00000000 --- a/web/lessons/diagramme/pt/l13-java-fehler-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;116;97;98;117;97;100;97;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/pt/l13-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l13-java-fehler-start.visustruct deleted file mode 100644 index faecf13b..00000000 --- a/web/lessons/diagramme/pt/l13-java-fehler-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;116;97;98;117;97;100;97;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/pt/l13-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l13-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 4405cc20..00000000 --- a/web/lessons/diagramme/pt/l13-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;97;108;116;117;114;97;32;61;32;48; - - - 105;110;116;32;100;101;103;114;97;117;32;61;32;49; - 100;101;103;114;97;117;32;60;61;32;53; - 100;101;103;114;97;117;43;43; - - - 97;108;116;117;114;97;32;61;32;97;108;116;117;114;97;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/pt/l13-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l13-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 4704c0ef..00000000 --- a/web/lessons/diagramme/pt/l13-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;100;101;103;114;97;117;32;61;32;49; - 100;101;103;114;97;117;32;60;61;32;53; - 100;101;103;114;97;117;43;43; - - - 97;108;116;117;114;97;32;61;32;97;108;116;117;114;97;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;99;109;34; - - diff --git a/web/lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct b/web/lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct deleted file mode 100644 index 15b96e15..00000000 --- a/web/lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - diff --git a/web/lessons/diagramme/pt/l13-rechteck-loesung.visustruct b/web/lessons/diagramme/pt/l13-rechteck-loesung.visustruct deleted file mode 100644 index a07dee28..00000000 --- a/web/lessons/diagramme/pt/l13-rechteck-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;114;103;117;114;97;32;34;76;97;114;103;117;114;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;117;114;97;32;34;65;108;116;117;114;97;34; - - - 105;110;116;32;108;105;110;104;97;32;61;32;49; - 108;105;110;104;97;32;60;61;32;97;108;116;117;114;97; - 108;105;110;104;97;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;99;111;108;117;110;97;32;61;32;49; - 99;111;108;117;110;97;32;60;61;32;108;97;114;103;117;114;97; - 99;111;108;117;110;97;43;43; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - - - diff --git a/web/lessons/diagramme/pt/l14-array-durchlaufen.visustruct b/web/lessons/diagramme/pt/l14-array-durchlaufen.visustruct deleted file mode 100644 index 1d5a3397..00000000 --- a/web/lessons/diagramme/pt/l14-array-durchlaufen.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct b/web/lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct deleted file mode 100644 index eb88c1fe..00000000 --- a/web/lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;116;91;93;32;118;97;108;111;114;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;91;48;93; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;91;118;97;108;111;114;101;115;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/pt/l14-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l14-java-fehler-loesung.visustruct deleted file mode 100644 index 7d784caf..00000000 --- a/web/lessons/diagramme/pt/l14-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l14-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l14-java-fehler-start.visustruct deleted file mode 100644 index 537cd1a1..00000000 --- a/web/lessons/diagramme/pt/l14-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - - - diff --git a/web/lessons/diagramme/pt/l14-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l14-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index c0e3899f..00000000 --- a/web/lessons/diagramme/pt/l14-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/pt/l14-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l14-java-laeuft-nicht-start.visustruct deleted file mode 100644 index c3a6d24f..00000000 --- a/web/lessons/diagramme/pt/l14-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/pt/l14-java-treppe-loesung.visustruct b/web/lessons/diagramme/pt/l14-java-treppe-loesung.visustruct deleted file mode 100644 index a6b51157..00000000 --- a/web/lessons/diagramme/pt/l14-java-treppe-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;111;115;32;100;101;103;114;97;117;115;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - diff --git a/web/lessons/diagramme/pt/l14-namen-eingeben.visustruct b/web/lessons/diagramme/pt/l14-namen-eingeben.visustruct deleted file mode 100644 index 989d5d79..00000000 --- a/web/lessons/diagramme/pt/l14-namen-eingeben.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;111;109;101;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;111;109;101;34; - - - - - 111;117;116;112;117;116;58;32;34;80;114;105;109;101;105;114;111;32;110;111;109;101;58;32;34;32;43;32;110;111;109;101;115;91;48;93; - - diff --git a/web/lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct deleted file mode 100644 index e825ebe1..00000000 --- a/web/lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - - - 105;110;116;32;105;32;61;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/l14-summe-max-loesung.visustruct b/web/lessons/diagramme/pt/l14-summe-max-loesung.visustruct deleted file mode 100644 index 6def81d3..00000000 --- a/web/lessons/diagramme/pt/l14-summe-max-loesung.visustruct +++ /dev/null @@ -1,51 +0,0 @@ - - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;110;117;109;101;114;111;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111;115;91;105;93; - - - 110;117;109;101;114;111;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;110;117;109;101;114;111;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/pt/l14-summe-maximum.visustruct b/web/lessons/diagramme/pt/l14-summe-maximum.visustruct deleted file mode 100644 index a5d0df14..00000000 --- a/web/lessons/diagramme/pt/l14-summe-maximum.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;111;110;116;111;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - 112;111;110;116;111;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;111;110;116;111;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/pt/l15-bis-null-loesung.visustruct b/web/lessons/diagramme/pt/l15-bis-null-loesung.visustruct deleted file mode 100644 index 9c9551e2..00000000 --- a/web/lessons/diagramme/pt/l15-bis-null-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - 110;117;109;101;114;111;32;33;61;32;48; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l15-endlos-aussprung.visustruct b/web/lessons/diagramme/pt/l15-endlos-aussprung.visustruct deleted file mode 100644 index 042883f8..00000000 --- a/web/lessons/diagramme/pt/l15-endlos-aussprung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - 110;117;109;101;114;111;32;61;61;32;48; - - - 83;97;105;114;32;100;111;32;99;105;99;108;111; - - - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l15-flaeche-loesung.visustruct b/web/lessons/diagramme/pt/l15-flaeche-loesung.visustruct deleted file mode 100644 index 08e4e5a9..00000000 --- a/web/lessons/diagramme/pt/l15-flaeche-loesung.visustruct +++ /dev/null @@ -1,15 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;34;67;111;109;112;114;105;109;101;110;116;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;114;103;117;114;97;32;34;76;97;114;103;117;114;97;63;34; - - - 105;110;116;32;102;32;61;32;97;114;101;97;40;99;111;109;112;114;105;109;101;110;116;111;44;32;108;97;114;103;117;114;97;41; - - - 111;117;116;112;117;116;58;32;34;193;114;101;97;58;32;34;32;43;32;102; - - diff --git a/web/lessons/diagramme/pt/l15-hauptprogramm.visustruct b/web/lessons/diagramme/pt/l15-hauptprogramm.visustruct deleted file mode 100644 index 97eb67fd..00000000 --- a/web/lessons/diagramme/pt/l15-hauptprogramm.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;111;115;116;114;97;114;66;111;97;115;86;105;110;100;97;115;40;41; - - - 102;97;122;101;114;80;101;114;103;117;110;116;97;115;40;41; - - - 109;111;115;116;114;97;114;82;101;115;117;108;116;97;100;111;40;41; - - diff --git a/web/lessons/diagramme/pt/l15-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l15-java-fehler-loesung.visustruct deleted file mode 100644 index cb14d2d2..00000000 --- a/web/lessons/diagramme/pt/l15-java-fehler-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;97;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/pt/l15-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l15-java-fehler-start.visustruct deleted file mode 100644 index 46805c96..00000000 --- a/web/lessons/diagramme/pt/l15-java-fehler-start.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;97;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; - - diff --git a/web/lessons/diagramme/pt/l15-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l15-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 6509da2a..00000000 --- a/web/lessons/diagramme/pt/l15-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l15-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l15-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 8d70b22e..00000000 --- a/web/lessons/diagramme/pt/l15-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;76;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l15-java-noten-loesung.visustruct b/web/lessons/diagramme/pt/l15-java-noten-loesung.visustruct deleted file mode 100644 index c0d6db16..00000000 --- a/web/lessons/diagramme/pt/l15-java-noten-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;32;110;111;116;97;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;111;116;97;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l15-quadrat-haupt.visustruct b/web/lessons/diagramme/pt/l15-quadrat-haupt.visustruct deleted file mode 100644 index 10561fa4..00000000 --- a/web/lessons/diagramme/pt/l15-quadrat-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;32;61;32;113;117;97;100;114;97;100;111;40;110;117;109;101;114;111;41; - - - 111;117;116;112;117;116;58;32;34;79;32;113;117;97;100;114;97;100;111;32;233;32;34;32;43;32;113; - - diff --git a/web/lessons/diagramme/pt/l15-quadrat.visustruct b/web/lessons/diagramme/pt/l15-quadrat.visustruct deleted file mode 100644 index 66780122..00000000 --- a/web/lessons/diagramme/pt/l15-quadrat.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;114;101;115;117;108;116;97;100;111; - - diff --git a/web/lessons/diagramme/pt/l15-titel-loesung.visustruct b/web/lessons/diagramme/pt/l15-titel-loesung.visustruct deleted file mode 100644 index 86d1d7bd..00000000 --- a/web/lessons/diagramme/pt/l15-titel-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;111;115;116;114;97;114;84;105;116;117;108;111;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;67;111;109;111;32;116;101;32;99;104;97;109;97;115;63;34; - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101; - - diff --git a/web/lessons/diagramme/pt/l15-unterprogramm.visustruct b/web/lessons/diagramme/pt/l15-unterprogramm.visustruct deleted file mode 100644 index 33e486a2..00000000 --- a/web/lessons/diagramme/pt/l15-unterprogramm.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;32;97;111;32;113;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;86;97;105;115;32;116;101;114;32;116;114;234;115;32;112;101;114;103;117;110;116;97;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct b/web/lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct deleted file mode 100644 index c0e2892f..00000000 --- a/web/lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;111;115;116;114;97;114;83;111;109;97;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 109;111;115;116;114;97;114;83;111;109;97;40;120;44;32;120;32;43;32;49;41; - - diff --git a/web/lessons/diagramme/pt/l15-zeige-summe.visustruct b/web/lessons/diagramme/pt/l15-zeige-summe.visustruct deleted file mode 100644 index daafa9a8..00000000 --- a/web/lessons/diagramme/pt/l15-zeige-summe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-countdown-loesung.visustruct b/web/lessons/diagramme/pt/l16-countdown-loesung.visustruct deleted file mode 100644 index 5fdb9321..00000000 --- a/web/lessons/diagramme/pt/l16-countdown-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;105;110;105;99;105;111; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;74;225;33;34; - - diff --git a/web/lessons/diagramme/pt/l16-countdown-start.visustruct b/web/lessons/diagramme/pt/l16-countdown-start.visustruct deleted file mode 100644 index a63d2edd..00000000 --- a/web/lessons/diagramme/pt/l16-countdown-start.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;105;110;105;99;105;111; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;74;225;34; - - diff --git a/web/lessons/diagramme/pt/l16-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l16-java-fehler-loesung.visustruct deleted file mode 100644 index 1b12d5da..00000000 --- a/web/lessons/diagramme/pt/l16-java-fehler-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l16-java-fehler-start.visustruct deleted file mode 100644 index 2144f0e0..00000000 --- a/web/lessons/diagramme/pt/l16-java-fehler-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l16-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 6482c7ed..00000000 --- a/web/lessons/diagramme/pt/l16-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;44;32;114;111;110;100;97;32;49;58;32;34;32;43;32;112;111;110;116;111;115;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/pt/l16-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l16-java-laeuft-nicht-start.visustruct deleted file mode 100644 index c871b3e2..00000000 --- a/web/lessons/diagramme/pt/l16-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;44;32;114;111;110;100;97;32;49;58;32;34;32;43;32;80;111;110;116;111;115;91;49;93;91;48;93; - - diff --git a/web/lessons/diagramme/pt/l16-java-punkte-loesung.visustruct b/web/lessons/diagramme/pt/l16-java-punkte-loesung.visustruct deleted file mode 100644 index a6c2cbd6..00000000 --- a/web/lessons/diagramme/pt/l16-java-punkte-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-schreibtisch.visustruct b/web/lessons/diagramme/pt/l16-schreibtisch.visustruct deleted file mode 100644 index 5c73af64..00000000 --- a/web/lessons/diagramme/pt/l16-schreibtisch.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-summe-loesung.visustruct b/web/lessons/diagramme/pt/l16-summe-loesung.visustruct deleted file mode 100644 index 1a76018e..00000000 --- a/web/lessons/diagramme/pt/l16-summe-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l16-summe-start.visustruct b/web/lessons/diagramme/pt/l16-summe-start.visustruct deleted file mode 100644 index a62097a0..00000000 --- a/web/lessons/diagramme/pt/l16-summe-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l17-beispiel.visustruct b/web/lessons/diagramme/pt/l17-beispiel.visustruct deleted file mode 100644 index b97bc3ed..00000000 --- a/web/lessons/diagramme/pt/l17-beispiel.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;118;101;122;101;115;32;34;32;43;32;110;117;109;101;114;111;32;43;32;34;32;61;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - - - - 110;117;109;101;114;111;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;102;111;105;32;100;105;102;237;99;105;108;33;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;102;111;105;32;102;225;99;105;108;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l17-fakultaet-loesung.visustruct b/web/lessons/diagramme/pt/l17-fakultaet-loesung.visustruct deleted file mode 100644 index b5bf4434..00000000 --- a/web/lessons/diagramme/pt/l17-fakultaet-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 105;110;116;32;102;97;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;116;111;114;105;97;108;32;61;32;102;97;116;111;114;105;97;108;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;116;111;114;105;97;108; - - diff --git a/web/lessons/diagramme/pt/l17-java-brief-loesung.visustruct b/web/lessons/diagramme/pt/l17-java-brief-loesung.visustruct deleted file mode 100644 index 917ec89e..00000000 --- a/web/lessons/diagramme/pt/l17-java-brief-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;99;97;114;116;97;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;76;105;110;104;97;115;58;32;34;32;43;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;104;97;115;91;105;93;46;99;111;110;116;97;105;110;115;40;34;114;97;112;111;115;97;34;41; - - - 111;117;116;112;117;116;58;32;34;82;97;112;111;115;97;32;110;97;32;108;105;110;104;97;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/pt/l17-java-brief-start.visustruct b/web/lessons/diagramme/pt/l17-java-brief-start.visustruct deleted file mode 100644 index 659154a6..00000000 --- a/web/lessons/diagramme/pt/l17-java-brief-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/pt/l17-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l17-java-fehler-loesung.visustruct deleted file mode 100644 index e1efa3af..00000000 --- a/web/lessons/diagramme/pt/l17-java-fehler-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;63;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/pt/l17-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l17-java-fehler-start.visustruct deleted file mode 100644 index 2238e0f6..00000000 --- a/web/lessons/diagramme/pt/l17-java-fehler-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;63;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/pt/l17-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l17-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 606502e3..00000000 --- a/web/lessons/diagramme/pt/l17-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;116;101;109;32;34;32;43;32;110;111;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;114;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l17-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l17-java-laeuft-nicht-start.visustruct deleted file mode 100644 index 70fdf064..00000000 --- a/web/lessons/diagramme/pt/l17-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;116;101;109;32;34;32;43;32;110;111;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;114;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l17-java-passwort-loesung.visustruct b/web/lessons/diagramme/pt/l17-java-passwort-loesung.visustruct deleted file mode 100644 index 70dbb1c2..00000000 --- a/web/lessons/diagramme/pt/l17-java-passwort-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;34;80;97;108;97;118;114;97;45;112;97;115;115;101;63;34; - - - 101;110;116;114;97;100;97;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;33;34; - - - - - 111;117;116;112;117;116;58;32;34;80;97;108;97;118;114;97;45;112;97;115;115;101;32;101;114;114;97;100;97;34; - - - - diff --git a/web/lessons/diagramme/pt/l17-ticket-loesung.visustruct b/web/lessons/diagramme/pt/l17-ticket-loesung.visustruct deleted file mode 100644 index 1dcf2f37..00000000 --- a/web/lessons/diagramme/pt/l17-ticket-loesung.visustruct +++ /dev/null @@ -1,29 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 105;100;97;100;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;100;101;32;99;114;105;97;110;231;97;58;32;52;32;101;117;114;111;115;34; - - - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;100;101;32;97;100;117;108;116;111;58;32;56;32;101;117;114;111;115;34; - - - - - - diff --git a/web/lessons/diagramme/pt/l18-beispiel.visustruct b/web/lessons/diagramme/pt/l18-beispiel.visustruct deleted file mode 100644 index dc416e8c..00000000 --- a/web/lessons/diagramme/pt/l18-beispiel.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;70;105;109;34; - - diff --git a/web/lessons/diagramme/pt/l18-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l18-java-fehler-loesung.visustruct deleted file mode 100644 index 0f0179c2..00000000 --- a/web/lessons/diagramme/pt/l18-java-fehler-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;97;108;112;105;116;101;32;34;79;32;116;101;117;32;112;97;108;112;105;116;101;63;34; - - - 116;101;110;116;97;116;105;118;97;115;32;61;32;116;101;110;116;97;116;105;118;97;115;32;43;32;49; - - - 112;97;108;112;105;116;101;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; - - diff --git a/web/lessons/diagramme/pt/l18-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l18-java-fehler-start.visustruct deleted file mode 100644 index 79911b46..00000000 --- a/web/lessons/diagramme/pt/l18-java-fehler-start.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;97;108;112;105;116;101;32;34;79;32;116;101;117;32;112;97;108;112;105;116;101;63;34; - - - 112;97;108;112;105;116;101;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 116;101;110;116;97;116;105;118;97;115;32;61;32;116;101;110;116;97;116;105;118;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; - - diff --git a/web/lessons/diagramme/pt/l18-java-kasse-loesung.visustruct b/web/lessons/diagramme/pt/l18-java-kasse-loesung.visustruct deleted file mode 100644 index a2f4509b..00000000 --- a/web/lessons/diagramme/pt/l18-java-kasse-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;97;114;116;105;103;111;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;101;99;111;32;34;80;114;101;231;111;63;32;40;48;32;61;32;102;105;109;41;34; - - - 112;114;101;99;111;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;114;101;99;111; - - - 97;114;116;105;103;111;115;32;61;32;97;114;116;105;103;111;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;65;114;116;105;103;111;115;58;32;34;32;43;32;97;114;116;105;103;111;115; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;111;109;97; - - diff --git a/web/lessons/diagramme/pt/l18-js-loesung.visustruct b/web/lessons/diagramme/pt/l18-js-loesung.visustruct deleted file mode 100644 index 4217b90b..00000000 --- a/web/lessons/diagramme/pt/l18-js-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;115;32;118;111;116;97;114;46;34; - - - - - 105;110;116;32;97;110;111;115;32;61;32;49;56;32;45;32;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;69;115;112;101;114;97;32;109;97;105;115;32;34;32;43;32;97;110;111;115;32;43;32;34;32;97;110;111;115;46;34; - - - - diff --git a/web/lessons/diagramme/pt/l18-python-loesung.visustruct b/web/lessons/diagramme/pt/l18-python-loesung.visustruct deleted file mode 100644 index 9d8b4c5e..00000000 --- a/web/lessons/diagramme/pt/l18-python-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;101;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;108;105;109;105;116;101; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - diff --git a/web/lessons/diagramme/pt/l19-java-fehler-loesung.visustruct b/web/lessons/diagramme/pt/l19-java-fehler-loesung.visustruct deleted file mode 100644 index c05bcaaa..00000000 --- a/web/lessons/diagramme/pt/l19-java-fehler-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - diff --git a/web/lessons/diagramme/pt/l19-java-fehler-start.visustruct b/web/lessons/diagramme/pt/l19-java-fehler-start.visustruct deleted file mode 100644 index 444f29de..00000000 --- a/web/lessons/diagramme/pt/l19-java-fehler-start.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - diff --git a/web/lessons/diagramme/pt/l19-java-laeuft-nicht-loesung.visustruct b/web/lessons/diagramme/pt/l19-java-laeuft-nicht-loesung.visustruct deleted file mode 100644 index 9203c8e1..00000000 --- a/web/lessons/diagramme/pt/l19-java-laeuft-nicht-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;112;114;111;99;117;114;97;100;97;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - diff --git a/web/lessons/diagramme/pt/l19-java-laeuft-nicht-start.visustruct b/web/lessons/diagramme/pt/l19-java-laeuft-nicht-start.visustruct deleted file mode 100644 index bd4d1442..00000000 --- a/web/lessons/diagramme/pt/l19-java-laeuft-nicht-start.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;112;114;111;99;117;114;97;100;97;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;80;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - diff --git a/web/lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct b/web/lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct deleted file mode 100644 index 4ca71157..00000000 --- a/web/lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l2-ausgabe.visustruct b/web/lessons/diagramme/pt/l2-ausgabe.visustruct deleted file mode 100644 index 047d0205..00000000 --- a/web/lessons/diagramme/pt/l2-ausgabe.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;66;111;109;32;100;105;97;34; - - - 111;117;116;112;117;116;58;32;34;72;111;106;101;32;97;112;114;101;110;100;101;109;111;115;32;101;115;116;114;117;116;111;103;114;97;109;97;115;46;34; - - diff --git a/web/lessons/diagramme/pt/l2-hallo-loesung.visustruct b/web/lessons/diagramme/pt/l2-hallo-loesung.visustruct deleted file mode 100644 index c6a771f6..00000000 --- a/web/lessons/diagramme/pt/l2-hallo-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;77;117;110;100;111;34; - - diff --git a/web/lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct b/web/lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct deleted file mode 100644 index f9cc8582..00000000 --- a/web/lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 111;117;116;112;117;116;58;32;34;79;108;225;34; - - - 111;117;116;112;117;116;58;32;34;69;115;116;111;117;32;97;32;97;112;114;101;110;100;101;114;32;101;115;116;114;117;116;111;103;114;97;109;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct b/web/lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct deleted file mode 100644 index 91c05d85..00000000 --- a/web/lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;99;111;109;112;114;97;115;45;110;111;118;97;46;116;120;116;34;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;108;105;110;104;97;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;66;111;108;111;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;108;105;110;104;97;115;32;103;117;97;114;100;97;100;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct b/web/lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct deleted file mode 100644 index d28b8702..00000000 --- a/web/lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;99;111;109;112;114;97;115;45;110;111;118;97;46;116;120;116;34;41; - - diff --git a/web/lessons/diagramme/pt/l23-java-nummern-loesung.visustruct b/web/lessons/diagramme/pt/l23-java-nummern-loesung.visustruct deleted file mode 100644 index 830311d6..00000000 --- a/web/lessons/diagramme/pt/l23-java-nummern-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;46;32;34;32;43;32;108;105;110;104;97; - - - 110;117;109;101;114;111;43;43; - - - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l23-java-nummern-start.visustruct b/web/lessons/diagramme/pt/l23-java-nummern-start.visustruct deleted file mode 100644 index e707e408..00000000 --- a/web/lessons/diagramme/pt/l23-java-nummern-start.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - diff --git a/web/lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct b/web/lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct deleted file mode 100644 index e7f198e1..00000000 --- a/web/lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 108;105;110;104;97;46;99;111;110;116;97;105;110;115;40;34;82;97;112;111;115;97;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;82;97;112;111;115;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l24-java-fuchs-start.visustruct b/web/lessons/diagramme/pt/l24-java-fuchs-start.visustruct deleted file mode 100644 index db31f1f2..00000000 --- a/web/lessons/diagramme/pt/l24-java-fuchs-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l24-java-laengster-loesung.visustruct b/web/lessons/diagramme/pt/l24-java-laengster-loesung.visustruct deleted file mode 100644 index e710d151..00000000 --- a/web/lessons/diagramme/pt/l24-java-laengster-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;109;97;105;115;76;111;110;103;97;32;61;32;108;105;110;104;97;115;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;104;97;115;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;109;97;105;115;76;111;110;103;97;46;108;101;110;103;116;104;40;41; - - - 109;97;105;115;76;111;110;103;97;32;61;32;108;105;110;104;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;109;97;105;115;32;108;111;110;103;97;58;32;34;32;43;32;109;97;105;115;76;111;110;103;97; - - diff --git a/web/lessons/diagramme/pt/l24-java-laengster-start.visustruct b/web/lessons/diagramme/pt/l24-java-laengster-start.visustruct deleted file mode 100644 index 09ce6c3c..00000000 --- a/web/lessons/diagramme/pt/l24-java-laengster-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - diff --git a/web/lessons/diagramme/pt/l25-java-beste-loesung.visustruct b/web/lessons/diagramme/pt/l25-java-beste-loesung.visustruct deleted file mode 100644 index 63be9499..00000000 --- a/web/lessons/diagramme/pt/l25-java-beste-loesung.visustruct +++ /dev/null @@ -1,54 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;109;101;108;104;111;114;78;111;109;101;32;61;32;34;34; - - - 105;110;116;32;109;101;108;104;111;114;78;111;116;97;32;61;32;55; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;110;111;116;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;51;93;41; - - - 110;111;116;97;32;60;32;109;101;108;104;111;114;78;111;116;97; - - - 109;101;108;104;111;114;78;111;116;97;32;61;32;110;111;116;97; - - - 109;101;108;104;111;114;78;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;101;108;104;111;114;32;110;111;116;97;32;97;32;73;110;103;108;234;115;58;32;34;32;43;32;109;101;108;104;111;114;78;111;109;101;32;43;32;34;32;40;34;32;43;32;109;101;108;104;111;114;78;111;116;97;32;43;32;34;41;34; - - diff --git a/web/lessons/diagramme/pt/l25-java-beste-start.visustruct b/web/lessons/diagramme/pt/l25-java-beste-start.visustruct deleted file mode 100644 index a7648532..00000000 --- a/web/lessons/diagramme/pt/l25-java-beste-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct b/web/lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct deleted file mode 100644 index ad056f90..00000000 --- a/web/lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;32;100;101;32;77;97;116;101;109;225;116;105;99;97;58;32;34;32;43;32;115;111;109;97;32;47;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/l25-java-schnitt-start.visustruct b/web/lessons/diagramme/pt/l25-java-schnitt-start.visustruct deleted file mode 100644 index 05d2cf0e..00000000 --- a/web/lessons/diagramme/pt/l25-java-schnitt-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l26-java-namen-loesung.visustruct b/web/lessons/diagramme/pt/l26-java-namen-loesung.visustruct deleted file mode 100644 index be24ee8d..00000000 --- a/web/lessons/diagramme/pt/l26-java-namen-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 108;105;110;104;97;46;99;111;110;116;97;105;110;115;40;34;92;34;110;111;109;101;92;34;34;41; - - - 105;110;116;32;105;110;105;99;105;111;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;110;111;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;102;105;109;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;105;110;105;99;105;111;41; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97;46;115;117;98;115;116;114;105;110;103;40;105;110;105;99;105;111;44;32;102;105;109;41; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l26-java-namen-start.visustruct b/web/lessons/diagramme/pt/l26-java-namen-start.visustruct deleted file mode 100644 index 0d79a5d2..00000000 --- a/web/lessons/diagramme/pt/l26-java-namen-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct b/web/lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct deleted file mode 100644 index fe0810ae..00000000 --- a/web/lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct +++ /dev/null @@ -1,50 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;110;116;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;61;32;34;32;32;123;92;34;110;111;109;101;92;34;58;32;92;34;34;32;43;32;110;111;109;101;115;91;105;93;32;43;32;34;92;34;44;32;92;34;112;111;110;116;111;115;92;34;58;32;34;32;43;32;112;111;110;116;111;115;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;97;100;97;32;61;32;101;110;116;114;97;100;97;32;43;32;34;44;34; - - - - - 248; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;101;110;116;114;97;100;97;41; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;97;100;97;115;32;103;117;97;114;100;97;100;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l26-java-schreiben-start.visustruct b/web/lessons/diagramme/pt/l26-java-schreiben-start.visustruct deleted file mode 100644 index 3d85129b..00000000 --- a/web/lessons/diagramme/pt/l26-java-schreiben-start.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;110;116;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l27-java-json-loesung.visustruct b/web/lessons/diagramme/pt/l27-java-json-loesung.visustruct deleted file mode 100644 index 2ae1ee3d..00000000 --- a/web/lessons/diagramme/pt/l27-java-json-loesung.visustruct +++ /dev/null @@ -1,53 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;105;115;45;110;111;118;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;115;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;61;32;34;32;32;123;92;34;110;111;109;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;101;115;91;48;93;32;43;32;34;92;34;44;32;92;34;101;115;112;101;99;105;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;92;34;44;32;92;34;105;100;97;100;101;92;34;58;32;34;32;43;32;112;97;114;116;101;115;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;97;100;97;32;61;32;101;110;116;114;97;100;97;32;43;32;34;44;34; - - - - - 248; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;101;110;116;114;97;100;97;41; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;108;105;110;104;97;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;105;115;32;103;117;97;114;100;97;100;111;115;34; - - diff --git a/web/lessons/diagramme/pt/l27-java-json-start.visustruct b/web/lessons/diagramme/pt/l27-java-json-start.visustruct deleted file mode 100644 index f071efef..00000000 --- a/web/lessons/diagramme/pt/l27-java-json-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;105;115;45;110;111;118;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/l27-java-saetze-loesung.visustruct b/web/lessons/diagramme/pt/l27-java-saetze-loesung.visustruct deleted file mode 100644 index d6736a5a..00000000 --- a/web/lessons/diagramme/pt/l27-java-saetze-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;102;114;97;115;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;112;97;114;116;101;115;91;48;93;32;43;32;34;32;40;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;41;32;116;101;109;32;34;32;43;32;112;97;114;116;101;115;91;50;93;32;43;32;34;32;97;110;111;115;46;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;102;114;97;115;101;115;32;103;117;97;114;100;97;100;97;115;34; - - diff --git a/web/lessons/diagramme/pt/l27-java-saetze-start.visustruct b/web/lessons/diagramme/pt/l27-java-saetze-start.visustruct deleted file mode 100644 index 8f71f062..00000000 --- a/web/lessons/diagramme/pt/l27-java-saetze-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;102;114;97;115;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - diff --git a/web/lessons/diagramme/pt/sim-kino-loesung.visustruct b/web/lessons/diagramme/pt/sim-kino-loesung.visustruct deleted file mode 100644 index c271c3d1..00000000 --- a/web/lessons/diagramme/pt/sim-kino-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - diff --git a/web/lessons/diagramme/pt/sim-kino-start.visustruct b/web/lessons/diagramme/pt/sim-kino-start.visustruct deleted file mode 100644 index afd9c58f..00000000 --- a/web/lessons/diagramme/pt/sim-kino-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;56;46;53; - - diff --git a/web/lessons/diagramme/pt/sim-tausch-loesung.visustruct b/web/lessons/diagramme/pt/sim-tausch-loesung.visustruct deleted file mode 100644 index f51751e9..00000000 --- a/web/lessons/diagramme/pt/sim-tausch-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/pt/sim-tausch-start.visustruct b/web/lessons/diagramme/pt/sim-tausch-start.visustruct deleted file mode 100644 index df460a35..00000000 --- a/web/lessons/diagramme/pt/sim-tausch-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/pt/sim-tausch.visustruct b/web/lessons/diagramme/pt/sim-tausch.visustruct deleted file mode 100644 index 2fefd778..00000000 --- a/web/lessons/diagramme/pt/sim-tausch.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/pt/ss-absteigend-loesung.visustruct b/web/lessons/diagramme/pt/ss-absteigend-loesung.visustruct deleted file mode 100644 index 47cc9481..00000000 --- a/web/lessons/diagramme/pt/ss-absteigend-loesung.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;116;97;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;99;97;114;116;97;34; - - - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;60;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/ss-absteigend-start.visustruct b/web/lessons/diagramme/pt/ss-absteigend-start.visustruct deleted file mode 100644 index 2356a9f7..00000000 --- a/web/lessons/diagramme/pt/ss-absteigend-start.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;116;97;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;99;97;114;116;97;34; - - - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;62;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/ss-binaere-suche.visustruct b/web/lessons/diagramme/pt/ss-binaere-suche.visustruct deleted file mode 100644 index 33b16cb5..00000000 --- a/web/lessons/diagramme/pt/ss-binaere-suche.visustruct +++ /dev/null @@ -1,74 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;32;112;114;111;99;117;114;97;115;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;97;99;111;101;115;32;61;32;48; - - - 105;110;116;32;101;115;113;117;101;114;100;97;32;61;32;48; - - - 105;110;116;32;100;105;114;101;105;116;97;32;61;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;101;105;111;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;101;115;113;117;101;114;100;97;32;60;61;32;100;105;114;101;105;116;97; - - - 109;101;105;111;32;61;32;40;101;115;113;117;101;114;100;97;32;43;32;100;105;114;101;105;116;97;41;32;47;32;50; - - - 99;111;109;112;97;114;97;99;111;101;115;32;61;32;99;111;109;112;97;114;97;99;111;101;115;32;43;32;49; - - - 99;97;114;116;97;115;91;109;101;105;111;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;109;101;105;111; - - - - - 99;97;114;116;97;115;91;109;101;105;111;93;32;60;32;112;114;111;99;117;114;97;100;97; - - - 101;115;113;117;101;114;100;97;32;61;32;109;101;105;111;32;43;32;49; - - - - - 100;105;114;101;105;116;97;32;61;32;109;101;105;111;32;45;32;49; - - - - - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;69;110;99;111;110;116;114;97;100;97;32;110;97;32;112;111;115;105;231;227;111;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; - - diff --git a/web/lessons/diagramme/pt/ss-bubblesort.visustruct b/web/lessons/diagramme/pt/ss-bubblesort.visustruct deleted file mode 100644 index 1180b076..00000000 --- a/web/lessons/diagramme/pt/ss-bubblesort.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;62;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct b/web/lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct deleted file mode 100644 index 729671f4..00000000 --- a/web/lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - diff --git a/web/lessons/diagramme/pt/ss-lineare-suche.visustruct b/web/lessons/diagramme/pt/ss-lineare-suche.visustruct deleted file mode 100644 index 1c25999b..00000000 --- a/web/lessons/diagramme/pt/ss-lineare-suche.visustruct +++ /dev/null @@ -1,58 +0,0 @@ - - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;32;112;114;111;99;117;114;97;115;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;97;99;111;101;115;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;111;109;112;97;114;97;99;111;101;115;32;61;32;99;111;109;112;97;114;97;99;111;101;115;32;43;32;49; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;69;110;99;111;110;116;114;97;100;97;32;110;97;32;112;111;115;105;231;227;111;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; - - diff --git a/web/lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct b/web/lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct deleted file mode 100644 index 6b82b34a..00000000 --- a/web/lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;110;116;111;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;110;116;111;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/uebergabe-bonus-start.visustruct b/web/lessons/diagramme/pt/uebergabe-bonus-start.visustruct deleted file mode 100644 index 6b82b34a..00000000 --- a/web/lessons/diagramme/pt/uebergabe-bonus-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;110;116;111;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;110;116;111;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct b/web/lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct deleted file mode 100644 index eb9ddb8b..00000000 --- a/web/lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 112;111;110;116;111;115;91;105;93;32;61;32;112;111;110;116;111;115;91;105;93;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/pt/uebergabe-haupt.visustruct b/web/lessons/diagramme/pt/uebergabe-haupt.visustruct deleted file mode 100644 index ead09f46..00000000 --- a/web/lessons/diagramme/pt/uebergabe-haupt.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;53; - - - 100;117;112;108;105;99;97;114;40;110;117;109;101;114;111;41; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;111;103;114;97;109;97;32;112;114;105;110;99;105;112;97;108;58;32;110;117;109;101;114;111;32;61;32;34;32;43;32;110;117;109;101;114;111; - - - 98;111;111;108;101;97;110;91;93;32;102;105;108;97;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;65;110;116;101;115;58;32;34;32;43;32;102;105;108;97;91;48;93;32;43;32;34;44;32;34;32;43;32;102;105;108;97;91;49;93; - - - 108;105;109;112;97;114;40;102;105;108;97;41; - - - 111;117;116;112;117;116;58;32;34;68;101;112;111;105;115;58;32;34;32;43;32;102;105;108;97;91;48;93;32;43;32;34;44;32;34;32;43;32;102;105;108;97;91;49;93; - - diff --git a/web/lessons/diagramme/pt/uebergabe-leeren.visustruct b/web/lessons/diagramme/pt/uebergabe-leeren.visustruct deleted file mode 100644 index f1e5d98f..00000000 --- a/web/lessons/diagramme/pt/uebergabe-leeren.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;117;103;97;114;101;115;91;105;93;32;61;32;102;97;108;115;101; - - - - diff --git a/web/lessons/diagramme/pt/uebergabe-verdopple.visustruct b/web/lessons/diagramme/pt/uebergabe-verdopple.visustruct deleted file mode 100644 index 6b4b81c4..00000000 --- a/web/lessons/diagramme/pt/uebergabe-verdopple.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;78;111;32;115;117;98;112;114;111;103;114;97;109;97;58;32;120;32;61;32;34;32;43;32;120; - - diff --git a/web/lessons/diagramme/pt/zk-initialen-loesung.visustruct b/web/lessons/diagramme/pt/zk-initialen-loesung.visustruct deleted file mode 100644 index b6724323..00000000 --- a/web/lessons/diagramme/pt/zk-initialen-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/pt/zk-mehr.visustruct b/web/lessons/diagramme/pt/zk-mehr.visustruct deleted file mode 100644 index d3269eed..00000000 --- a/web/lessons/diagramme/pt/zk-mehr.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;110;100;101;120;79;102;40;34;97;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;108;97;115;116;73;110;100;101;120;79;102;40;34;97;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;80;65;83;83;65;84;69;77;80;79;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;114;101;112;108;97;99;101;40;34;116;101;109;112;111;34;44;32;34;112;111;114;116;101;34;41; - - - 111;117;116;112;117;116;58;32;34;77;233;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;105;100;97;100;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;105;100;97;100;101;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;105;100;97;100;101;41;32;43;32;34;32;97;110;111;115;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - diff --git a/web/lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct deleted file mode 100644 index 596c3389..00000000 --- a/web/lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; - - - 83;116;114;105;110;103;32;105;110;118;101;114;116;105;100;97;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 105;110;118;101;114;116;105;100;97;32;61;32;105;110;118;101;114;116;105;100;97;32;43;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;105;110;118;101;114;116;105;100;97; - - diff --git a/web/lessons/diagramme/pt/zk-split.visustruct b/web/lessons/diagramme/pt/zk-split.visustruct deleted file mode 100644 index bbfd79fd..00000000 --- a/web/lessons/diagramme/pt/zk-split.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;76;117;100;119;105;103;59;98;111;100;101;59;55;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;114;116;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;112;97;114;116;101;115;91;105;93; - - - - diff --git a/web/lessons/diagramme/pt/zk-woerter-loesung.visustruct b/web/lessons/diagramme/pt/zk-woerter-loesung.visustruct deleted file mode 100644 index 54901704..00000000 --- a/web/lessons/diagramme/pt/zk-woerter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;114;97;115;101;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;102;114;97;115;101;34; - - - 83;116;114;105;110;103;91;93;32;112;97;108;97;118;114;97;115;32;61;32;102;114;97;115;101;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;80;97;108;97;118;114;97;115;58;32;34;32;43;32;112;97;108;97;118;114;97;115;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/pt/zk-zaehlen.visustruct b/web/lessons/diagramme/pt/zk-zaehlen.visustruct deleted file mode 100644 index 1ff7ff80..00000000 --- a/web/lessons/diagramme/pt/zk-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;97;39; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;101;32;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - diff --git a/web/lessons/diagramme/pt/zk-zeichen.visustruct b/web/lessons/diagramme/pt/zk-zeichen.visustruct deleted file mode 100644 index 9b2b37ce..00000000 --- a/web/lessons/diagramme/pt/zk-zeichen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;115;117;98;115;116;114;105;110;103;40;48;44;32;53;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;115;117;98;115;116;114;105;110;103;40;53;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;110;100;101;120;79;102;40;34;116;101;109;112;111;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - diff --git a/web/lessons/diagramme/sim-kino-loesung.visustruct b/web/lessons/diagramme/sim-kino-loesung.visustruct deleted file mode 100644 index f8e2ebce..00000000 --- a/web/lessons/diagramme/sim-kino-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;32;61;32;97;110;122;97;104;108;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - diff --git a/web/lessons/diagramme/sim-kino-start.visustruct b/web/lessons/diagramme/sim-kino-start.visustruct deleted file mode 100644 index 5b619568..00000000 --- a/web/lessons/diagramme/sim-kino-start.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;32;61;32;97;110;122;97;104;108;32;42;32;56;46;53; - - diff --git a/web/lessons/diagramme/sim-tausch-loesung.visustruct b/web/lessons/diagramme/sim-tausch-loesung.visustruct deleted file mode 100644 index e09714c2..00000000 --- a/web/lessons/diagramme/sim-tausch-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/sim-tausch-start.visustruct b/web/lessons/diagramme/sim-tausch-start.visustruct deleted file mode 100644 index dc6a1728..00000000 --- a/web/lessons/diagramme/sim-tausch-start.visustruct +++ /dev/null @@ -1,21 +0,0 @@ - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - diff --git a/web/lessons/diagramme/sim-tausch.visustruct b/web/lessons/diagramme/sim-tausch.visustruct deleted file mode 100644 index 25f7665e..00000000 --- a/web/lessons/diagramme/sim-tausch.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - diff --git a/web/lessons/diagramme/ss-absteigend-loesung.visustruct b/web/lessons/diagramme/ss-absteigend-loesung.visustruct deleted file mode 100644 index 480da713..00000000 --- a/web/lessons/diagramme/ss-absteigend-loesung.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;107;97;114;116;101;110;91;105;93;32;34;75;97;114;116;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;60;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - diff --git a/web/lessons/diagramme/ss-absteigend-start.visustruct b/web/lessons/diagramme/ss-absteigend-start.visustruct deleted file mode 100644 index 837c83a8..00000000 --- a/web/lessons/diagramme/ss-absteigend-start.visustruct +++ /dev/null @@ -1,59 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;107;97;114;116;101;110;91;105;93;32;34;75;97;114;116;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;62;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - diff --git a/web/lessons/diagramme/ss-binaere-suche.visustruct b/web/lessons/diagramme/ss-binaere-suche.visustruct deleted file mode 100644 index a40c3658..00000000 --- a/web/lessons/diagramme/ss-binaere-suche.visustruct +++ /dev/null @@ -1,74 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;32;115;117;99;104;115;116;32;100;117;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;118;101;114;103;108;101;105;99;104;101;32;61;32;48; - - - 105;110;116;32;108;105;110;107;115;32;61;32;48; - - - 105;110;116;32;114;101;99;104;116;115;32;61;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;105;116;116;101;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;108;105;110;107;115;32;60;61;32;114;101;99;104;116;115; - - - 109;105;116;116;101;32;61;32;40;108;105;110;107;115;32;43;32;114;101;99;104;116;115;41;32;47;32;50; - - - 118;101;114;103;108;101;105;99;104;101;32;61;32;118;101;114;103;108;101;105;99;104;101;32;43;32;49; - - - 107;97;114;116;101;110;91;109;105;116;116;101;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;109;105;116;116;101; - - - - - 107;97;114;116;101;110;91;109;105;116;116;101;93;32;60;32;103;101;115;117;99;104;116; - - - 108;105;110;107;115;32;61;32;109;105;116;116;101;32;43;32;49; - - - - - 114;101;99;104;116;115;32;61;32;109;105;116;116;101;32;45;32;49; - - - - - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;71;101;102;117;110;100;101;110;32;97;110;32;80;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; - - diff --git a/web/lessons/diagramme/ss-bubblesort.visustruct b/web/lessons/diagramme/ss-bubblesort.visustruct deleted file mode 100644 index 90cdc3ba..00000000 --- a/web/lessons/diagramme/ss-bubblesort.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;62;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - diff --git a/web/lessons/diagramme/ss-karte-suchen-loesung.visustruct b/web/lessons/diagramme/ss-karte-suchen-loesung.visustruct deleted file mode 100644 index 025e8169..00000000 --- a/web/lessons/diagramme/ss-karte-suchen-loesung.visustruct +++ /dev/null @@ -1,49 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - diff --git a/web/lessons/diagramme/ss-lineare-suche.visustruct b/web/lessons/diagramme/ss-lineare-suche.visustruct deleted file mode 100644 index d1046f38..00000000 --- a/web/lessons/diagramme/ss-lineare-suche.visustruct +++ /dev/null @@ -1,58 +0,0 @@ - - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;32;115;117;99;104;115;116;32;100;117;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;118;101;114;103;108;101;105;99;104;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 118;101;114;103;108;101;105;99;104;101;32;61;32;118;101;114;103;108;101;105;99;104;101;32;43;32;49; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;71;101;102;117;110;100;101;110;32;97;110;32;80;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; - - diff --git a/web/lessons/diagramme/uebergabe-bonus-loesung.visustruct b/web/lessons/diagramme/uebergabe-bonus-loesung.visustruct deleted file mode 100644 index a920297f..00000000 --- a/web/lessons/diagramme/uebergabe-bonus-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;117;110;107;116;101;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;117;110;107;116;101;91;105;93; - - - - diff --git a/web/lessons/diagramme/uebergabe-bonus-start.visustruct b/web/lessons/diagramme/uebergabe-bonus-start.visustruct deleted file mode 100644 index a920297f..00000000 --- a/web/lessons/diagramme/uebergabe-bonus-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;117;110;107;116;101;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;117;110;107;116;101;91;105;93; - - - - diff --git a/web/lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct b/web/lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct deleted file mode 100644 index 8a89de99..00000000 --- a/web/lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 112;117;110;107;116;101;91;105;93;32;61;32;112;117;110;107;116;101;91;105;93;32;43;32;49; - - - - diff --git a/web/lessons/diagramme/uebergabe-haupt.visustruct b/web/lessons/diagramme/uebergabe-haupt.visustruct deleted file mode 100644 index 4ee3ce0f..00000000 --- a/web/lessons/diagramme/uebergabe-haupt.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;53; - - - 118;101;114;100;111;112;112;108;101;40;122;97;104;108;41; - - - 111;117;116;112;117;116;58;32;34;73;109;32;72;97;117;112;116;112;114;111;103;114;97;109;109;58;32;122;97;104;108;32;61;32;34;32;43;32;122;97;104;108; - - - 98;111;111;108;101;97;110;91;93;32;114;101;105;104;101;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;86;111;114;104;101;114;58;32;34;32;43;32;114;101;105;104;101;91;48;93;32;43;32;34;44;32;34;32;43;32;114;101;105;104;101;91;49;93; - - - 108;101;101;114;101;110;40;114;101;105;104;101;41; - - - 111;117;116;112;117;116;58;32;34;78;97;99;104;104;101;114;58;32;34;32;43;32;114;101;105;104;101;91;48;93;32;43;32;34;44;32;34;32;43;32;114;101;105;104;101;91;49;93; - - diff --git a/web/lessons/diagramme/uebergabe-leeren.visustruct b/web/lessons/diagramme/uebergabe-leeren.visustruct deleted file mode 100644 index 512dad1a..00000000 --- a/web/lessons/diagramme/uebergabe-leeren.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;108;97;101;116;122;101;46;108;101;110;103;116;104; - 105;43;43; - - - 112;108;97;101;116;122;101;91;105;93;32;61;32;102;97;108;115;101; - - - - diff --git a/web/lessons/diagramme/uebergabe-verdopple.visustruct b/web/lessons/diagramme/uebergabe-verdopple.visustruct deleted file mode 100644 index d46d3925..00000000 --- a/web/lessons/diagramme/uebergabe-verdopple.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;73;109;32;85;110;116;101;114;112;114;111;103;114;97;109;109;58;32;120;32;61;32;34;32;43;32;120; - - diff --git a/web/lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct b/web/lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct deleted file mode 100644 index 649275b4..00000000 --- a/web/lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;98;115;116;97;110;100;58;32;34;32;43;32;97;98;115;116;97;110;100;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-abstand-halten-loesung.visustruct b/web/lessons/diagramme/vb-abstand-halten-loesung.visustruct deleted file mode 100644 index 44439995..00000000 --- a/web/lessons/diagramme/vb-abstand-halten-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/vb-alarmanlage-loesung.visustruct b/web/lessons/diagramme/vb-alarmanlage-loesung.visustruct deleted file mode 100644 index 17f707f6..00000000 --- a/web/lessons/diagramme/vb-alarmanlage-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-ampel-loesung.visustruct b/web/lessons/diagramme/vb-ampel-loesung.visustruct deleted file mode 100644 index 3829666b..00000000 --- a/web/lessons/diagramme/vb-ampel-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - diff --git a/web/lessons/diagramme/vb-ampel-zustand-loesung.visustruct b/web/lessons/diagramme/vb-ampel-zustand-loesung.visustruct deleted file mode 100644 index e8c16ca2..00000000 --- a/web/lessons/diagramme/vb-ampel-zustand-loesung.visustruct +++ /dev/null @@ -1,43 +0,0 @@ - - - - 105;110;116;32;122;117;115;116;97;110;100;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;49; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;50; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;48; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-ausgang-loesung.visustruct b/web/lessons/diagramme/vb-ausgang-loesung.visustruct deleted file mode 100644 index f8d71eef..00000000 --- a/web/lessons/diagramme/vb-ausgang-loesung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/vb-begruessung-loesung.visustruct b/web/lessons/diagramme/vb-begruessung-loesung.visustruct deleted file mode 100644 index e8753e35..00000000 --- a/web/lessons/diagramme/vb-begruessung-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;97;108;108;111;33;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;99;104;32;98;105;110;32;86;105;115;117;66;111;116;34;41; - - diff --git a/web/lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct b/web/lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct deleted file mode 100644 index 5e14345b..00000000 --- a/web/lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct +++ /dev/null @@ -1,52 +0,0 @@ - - - - 105;110;116;32;122;97;104;108;32;61;32;48; - 122;97;104;108;32;60;32;56; - 122;97;104;108;43;43; - - - 122;97;104;108;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 122;97;104;108;32;47;32;50;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 122;97;104;108;32;47;32;52;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-bis-rot-loesung.visustruct b/web/lessons/diagramme/vb-bis-rot-loesung.visustruct deleted file mode 100644 index d34d1bf7..00000000 --- a/web/lessons/diagramme/vb-bis-rot-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-bis-wand-loesung.visustruct b/web/lessons/diagramme/vb-bis-wand-loesung.visustruct deleted file mode 100644 index 61006955..00000000 --- a/web/lessons/diagramme/vb-bis-wand-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-bis-ziel-loesung.visustruct b/web/lessons/diagramme/vb-bis-ziel-loesung.visustruct deleted file mode 100644 index c4406947..00000000 --- a/web/lessons/diagramme/vb-bis-ziel-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-buchstaben-loesung.visustruct b/web/lessons/diagramme/vb-buchstaben-loesung.visustruct deleted file mode 100644 index 7e525c62..00000000 --- a/web/lessons/diagramme/vb-buchstaben-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;86;105;115;117;66;111;116;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;48;44;32;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;51;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-do-while-loesung.visustruct b/web/lessons/diagramme/vb-do-while-loesung.visustruct deleted file mode 100644 index f2700981..00000000 --- a/web/lessons/diagramme/vb-do-while-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-drei-lichter-loesung.visustruct b/web/lessons/diagramme/vb-drei-lichter-loesung.visustruct deleted file mode 100644 index 0fc5644e..00000000 --- a/web/lessons/diagramme/vb-drei-lichter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;101;108;98;34;41; - - - 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - diff --git a/web/lessons/diagramme/vb-dreieck-loesung.visustruct b/web/lessons/diagramme/vb-dreieck-loesung.visustruct deleted file mode 100644 index a9274899..00000000 --- a/web/lessons/diagramme/vb-dreieck-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - diff --git a/web/lessons/diagramme/vb-einparken-loesung.visustruct b/web/lessons/diagramme/vb-einparken-loesung.visustruct deleted file mode 100644 index c7d76ec8..00000000 --- a/web/lessons/diagramme/vb-einparken-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;52;53; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;112;97;114;107;116;33;34;41; - - diff --git a/web/lessons/diagramme/vb-erster-plan-loesung.visustruct b/web/lessons/diagramme/vb-erster-plan-loesung.visustruct deleted file mode 100644 index 8b9629d1..00000000 --- a/web/lessons/diagramme/vb-erster-plan-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/vb-farben-loesung.visustruct b/web/lessons/diagramme/vb-farben-loesung.visustruct deleted file mode 100644 index 8f0297c6..00000000 --- a/web/lessons/diagramme/vb-farben-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 83;116;114;105;110;103;91;93;32;102;97;114;98;101;110;32;61;32;123;34;114;111;116;34;44;32;34;103;101;108;98;34;44;32;34;103;114;252;110;34;44;32;34;98;108;97;117;34;44;32;34;108;105;108;97;34;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;102;97;114;98;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;102;97;114;98;101;110;91;105;93;41; - - - - diff --git a/web/lessons/diagramme/vb-farbweiche-loesung.visustruct b/web/lessons/diagramme/vb-farbweiche-loesung.visustruct deleted file mode 100644 index fced2c4e..00000000 --- a/web/lessons/diagramme/vb-farbweiche-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-04-sensoren-start.visustruct b/web/lessons/diagramme/vb-fehler-04-sensoren-start.visustruct deleted file mode 100644 index a9c2f881..00000000 --- a/web/lessons/diagramme/vb-fehler-04-sensoren-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;114;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-05-bis-zur-wand-start.visustruct b/web/lessons/diagramme/vb-fehler-05-bis-zur-wand-start.visustruct deleted file mode 100644 index 7067b49d..00000000 --- a/web/lessons/diagramme/vb-fehler-05-bis-zur-wand-start.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;70;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct b/web/lessons/diagramme/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct deleted file mode 100644 index d1c948e7..00000000 --- a/web/lessons/diagramme/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;83;99;104;114;105;116;116;101;41; - - diff --git a/web/lessons/diagramme/vb-fehler-05-zaehlen-und-summieren-start.visustruct b/web/lessons/diagramme/vb-fehler-05-zaehlen-und-summieren-start.visustruct deleted file mode 100644 index ada1a5f9..00000000 --- a/web/lessons/diagramme/vb-fehler-05-zaehlen-und-summieren-start.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;49;48; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 103;101;115;97;109;116;32;61;32;71;101;115;97;109;116;32;43;32;115;101;105;116;101; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;103;101;115;97;109;116;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-fehler-06-abstand-start.visustruct b/web/lessons/diagramme/vb-fehler-06-abstand-start.visustruct deleted file mode 100644 index bf9d17e6..00000000 --- a/web/lessons/diagramme/vb-fehler-06-abstand-start.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;41; - - diff --git a/web/lessons/diagramme/vb-fehler-06-konstanten-final-start.visustruct b/web/lessons/diagramme/vb-fehler-06-konstanten-final-start.visustruct deleted file mode 100644 index 5a1b924b..00000000 --- a/web/lessons/diagramme/vb-fehler-06-konstanten-final-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;83;69;73;84;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-06-nah-mittel-weit-start.visustruct b/web/lessons/diagramme/vb-fehler-06-nah-mittel-weit-start.visustruct deleted file mode 100644 index 5a614024..00000000 --- a/web/lessons/diagramme/vb-fehler-06-nah-mittel-weit-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;78;97;99;104;116;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;228;109;109;101;114;117;110;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;84;97;103;34;41; - - - - - - diff --git a/web/lessons/diagramme/vb-fehler-07-linie-start.visustruct b/web/lessons/diagramme/vb-fehler-07-linie-start.visustruct deleted file mode 100644 index 31bc2281..00000000 --- a/web/lessons/diagramme/vb-fehler-07-linie-start.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;83;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;99;104;114;105;116;116;101; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-07-und-oder-start.visustruct b/web/lessons/diagramme/vb-fehler-07-und-oder-start.visustruct deleted file mode 100644 index 3e2a4c3d..00000000 --- a/web/lessons/diagramme/vb-fehler-07-und-oder-start.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;116;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-fehler-08-farben-start.visustruct b/web/lessons/diagramme/vb-fehler-08-farben-start.visustruct deleted file mode 100644 index 76621b0f..00000000 --- a/web/lessons/diagramme/vb-fehler-08-farben-start.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;103;114;252;110;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/vb-fehler-08-groesster-wert-start.visustruct b/web/lessons/diagramme/vb-fehler-08-groesster-wert-start.visustruct deleted file mode 100644 index b8b7ab73..00000000 --- a/web/lessons/diagramme/vb-fehler-08-groesster-wert-start.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;114;105;99;104;116;117;110;103;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - 114;105;99;104;116;117;110;103;32;61;32;73; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;82;105;99;104;116;117;110;103;58;32;34;32;43;32;114;105;99;104;116;117;110;103;41; - - diff --git a/web/lessons/diagramme/vb-fehler-09-fallauswahl-mbot2-start.visustruct b/web/lessons/diagramme/vb-fehler-09-fallauswahl-mbot2-start.visustruct deleted file mode 100644 index cb289a8e..00000000 --- a/web/lessons/diagramme/vb-fehler-09-fallauswahl-mbot2-start.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;116;104;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;81;117;101;114;108;105;110;105;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-10-tasten-joystick-start.visustruct b/web/lessons/diagramme/vb-fehler-10-tasten-joystick-start.visustruct deleted file mode 100644 index d23f531a..00000000 --- a/web/lessons/diagramme/vb-fehler-10-tasten-joystick-start.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;66;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/vb-fehler-10-unterbrechen-mit-break-start.visustruct b/web/lessons/diagramme/vb-fehler-10-unterbrechen-mit-break-start.visustruct deleted file mode 100644 index 60311a88..00000000 --- a/web/lessons/diagramme/vb-fehler-10-unterbrechen-mit-break-start.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;71;101;115;116;111;112;112;116;41; - - diff --git a/web/lessons/diagramme/vb-fehler-11-licht-start.visustruct b/web/lessons/diagramme/vb-fehler-11-licht-start.visustruct deleted file mode 100644 index b6402b72..00000000 --- a/web/lessons/diagramme/vb-fehler-11-licht-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-11-merker-boolean-start.visustruct b/web/lessons/diagramme/vb-fehler-11-merker-boolean-start.visustruct deleted file mode 100644 index 54781a09..00000000 --- a/web/lessons/diagramme/vb-fehler-11-merker-boolean-start.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;108;97;117;116;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;97;117;116;32;61;32;84;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;97;117;116; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;107;108;97;116;115;99;104;116;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;101;115;32;115;116;105;108;108;34;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-12-lautstaerke-start.visustruct b/web/lessons/diagramme/vb-fehler-12-lautstaerke-start.visustruct deleted file mode 100644 index 6d30b64d..00000000 --- a/web/lessons/diagramme/vb-fehler-12-lautstaerke-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;111;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-13-neigung-start.visustruct b/web/lessons/diagramme/vb-fehler-13-neigung-start.visustruct deleted file mode 100644 index 2ee2a480..00000000 --- a/web/lessons/diagramme/vb-fehler-13-neigung-start.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;108;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-14-leds-start.visustruct b/web/lessons/diagramme/vb-fehler-14-leds-start.visustruct deleted file mode 100644 index 47876f0f..00000000 --- a/web/lessons/diagramme/vb-fehler-14-leds-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;80;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-15-einzelne-leds-start.visustruct b/web/lessons/diagramme/vb-fehler-15-einzelne-leds-start.visustruct deleted file mode 100644 index b0bb8ff1..00000000 --- a/web/lessons/diagramme/vb-fehler-15-einzelne-leds-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;73;41;46;115;101;116;67;111;108;111;114;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-16-lautsprecher-start.visustruct b/web/lessons/diagramme/vb-fehler-16-lautsprecher-start.visustruct deleted file mode 100644 index 1769d482..00000000 --- a/web/lessons/diagramme/vb-fehler-16-lautsprecher-start.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-17-arrays-melodie-start.visustruct b/web/lessons/diagramme/vb-fehler-17-arrays-melodie-start.visustruct deleted file mode 100644 index d576d3f6..00000000 --- a/web/lessons/diagramme/vb-fehler-17-arrays-melodie-start.visustruct +++ /dev/null @@ -1,38 +0,0 @@ - - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 119;101;114;116;101;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;87;101;114;116;101;91;105;93; - - - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;119;101;114;116;32;61;32;115;117;109;109;101;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108;119;101;114;116;41; - - diff --git a/web/lessons/diagramme/vb-fehler-18-bildschirm-start.visustruct b/web/lessons/diagramme/vb-fehler-18-bildschirm-start.visustruct deleted file mode 100644 index e183bcee..00000000 --- a/web/lessons/diagramme/vb-fehler-18-bildschirm-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;73;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - diff --git a/web/lessons/diagramme/vb-fehler-19-zeichenketten-start.visustruct b/web/lessons/diagramme/vb-fehler-19-zeichenketten-start.visustruct deleted file mode 100644 index 471458ae..00000000 --- a/web/lessons/diagramme/vb-fehler-19-zeichenketten-start.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;97;108;108;111;32;75;108;97;115;115;101;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;84;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - diff --git a/web/lessons/diagramme/vb-fehler-20-motoren-start.visustruct b/web/lessons/diagramme/vb-fehler-20-motoren-start.visustruct deleted file mode 100644 index 7bb29edd..00000000 --- a/web/lessons/diagramme/vb-fehler-20-motoren-start.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;83;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vb-fehler-21-stoppuhr-akku-start.visustruct b/web/lessons/diagramme/vb-fehler-21-stoppuhr-akku-start.visustruct deleted file mode 100644 index 91981c2d..00000000 --- a/web/lessons/diagramme/vb-fehler-21-stoppuhr-akku-start.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;107;107;117;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/vb-fehler-21-zustaende-start.visustruct b/web/lessons/diagramme/vb-fehler-21-zustaende-start.visustruct deleted file mode 100644 index 086ea035..00000000 --- a/web/lessons/diagramme/vb-fehler-21-zustaende-start.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;103;114;252;110; - - - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;101;108;98;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-22-eigene-methoden-start.visustruct b/web/lessons/diagramme/vb-fehler-22-eigene-methoden-start.visustruct deleted file mode 100644 index a297bf57..00000000 --- a/web/lessons/diagramme/vb-fehler-22-eigene-methoden-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;85;109;100;114;101;104;117;110;103;101;110;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-fehler-23-wie-geht-es-weiter-start.visustruct b/web/lessons/diagramme/vb-fehler-23-wie-geht-es-weiter-start.visustruct deleted file mode 100644 index 4a79ee1a..00000000 --- a/web/lessons/diagramme/vb-fehler-23-wie-geht-es-weiter-start.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-gas-bis-wand-loesung.visustruct b/web/lessons/diagramme/vb-gas-bis-wand-loesung.visustruct deleted file mode 100644 index 9bde42e9..00000000 --- a/web/lessons/diagramme/vb-gas-bis-wand-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vb-gerade-loesung.visustruct b/web/lessons/diagramme/vb-gerade-loesung.visustruct deleted file mode 100644 index f4a8d0dc..00000000 --- a/web/lessons/diagramme/vb-gerade-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/vb-hindernis-loesung.visustruct b/web/lessons/diagramme/vb-hindernis-loesung.visustruct deleted file mode 100644 index a55408ef..00000000 --- a/web/lessons/diagramme/vb-hindernis-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - diff --git a/web/lessons/diagramme/vb-java-akku-loesung.visustruct b/web/lessons/diagramme/vb-java-akku-loesung.visustruct deleted file mode 100644 index 27293e85..00000000 --- a/web/lessons/diagramme/vb-java-akku-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;107;107;117;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/vb-java-ampel-text-loesung.visustruct b/web/lessons/diagramme/vb-java-ampel-text-loesung.visustruct deleted file mode 100644 index 97995a57..00000000 --- a/web/lessons/diagramme/vb-java-ampel-text-loesung.visustruct +++ /dev/null @@ -1,48 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;114;252;110;34; - - - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;101;108;98;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-java-blau-gruen-loesung.visustruct b/web/lessons/diagramme/vb-java-blau-gruen-loesung.visustruct deleted file mode 100644 index a02ee1e4..00000000 --- a/web/lessons/diagramme/vb-java-blau-gruen-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - diff --git a/web/lessons/diagramme/vb-java-blinken-loesung.visustruct b/web/lessons/diagramme/vb-java-blinken-loesung.visustruct deleted file mode 100644 index dabcffb1..00000000 --- a/web/lessons/diagramme/vb-java-blinken-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-java-countdown-loesung.visustruct b/web/lessons/diagramme/vb-java-countdown-loesung.visustruct deleted file mode 100644 index 1cb55130..00000000 --- a/web/lessons/diagramme/vb-java-countdown-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;105;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - diff --git a/web/lessons/diagramme/vb-java-hoeher-loesung.visustruct b/web/lessons/diagramme/vb-java-hoeher-loesung.visustruct deleted file mode 100644 index fb887f9b..00000000 --- a/web/lessons/diagramme/vb-java-hoeher-loesung.visustruct +++ /dev/null @@ -1,13 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;44;32;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-java-joystick-loesung.visustruct b/web/lessons/diagramme/vb-java-joystick-loesung.visustruct deleted file mode 100644 index c6f2fdfb..00000000 --- a/web/lessons/diagramme/vb-java-joystick-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/vb-java-klatsch-merker-loesung.visustruct b/web/lessons/diagramme/vb-java-klatsch-merker-loesung.visustruct deleted file mode 100644 index c378e8fa..00000000 --- a/web/lessons/diagramme/vb-java-klatsch-merker-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;108;97;117;116;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;97;117;116;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;97;117;116; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;107;108;97;116;115;99;104;116;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;101;115;32;115;116;105;108;108;34;41; - - - - diff --git a/web/lessons/diagramme/vb-java-konstante-seite-loesung.visustruct b/web/lessons/diagramme/vb-java-konstante-seite-loesung.visustruct deleted file mode 100644 index 4709b9a9..00000000 --- a/web/lessons/diagramme/vb-java-konstante-seite-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;83;69;73;84;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;83;69;73;84;69;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-laermampel-loesung.visustruct b/web/lessons/diagramme/vb-java-laermampel-loesung.visustruct deleted file mode 100644 index e53abe39..00000000 --- a/web/lessons/diagramme/vb-java-laermampel-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-lauflicht-loesung.visustruct b/web/lessons/diagramme/vb-java-lauflicht-loesung.visustruct deleted file mode 100644 index c0d1c576..00000000 --- a/web/lessons/diagramme/vb-java-lauflicht-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - diff --git a/web/lessons/diagramme/vb-java-linienfolger-loesung.visustruct b/web/lessons/diagramme/vb-java-linienfolger-loesung.visustruct deleted file mode 100644 index 88c13463..00000000 --- a/web/lessons/diagramme/vb-java-linienfolger-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct b/web/lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct deleted file mode 100644 index 1af2e87b..00000000 --- a/web/lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-rand-loesung.visustruct b/web/lessons/diagramme/vb-java-rand-loesung.visustruct deleted file mode 100644 index cd17afc4..00000000 --- a/web/lessons/diagramme/vb-java-rand-loesung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;99;104;114;105;116;116;101; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-rechteck-loesung.visustruct b/web/lessons/diagramme/vb-java-rechteck-loesung.visustruct deleted file mode 100644 index cc3578d7..00000000 --- a/web/lessons/diagramme/vb-java-rechteck-loesung.visustruct +++ /dev/null @@ -1,28 +0,0 @@ - - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;97;101;110;103;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;98;114;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-rechteck-umdrehungen-loesung.visustruct b/web/lessons/diagramme/vb-java-rechteck-umdrehungen-loesung.visustruct deleted file mode 100644 index 67b9f72f..00000000 --- a/web/lessons/diagramme/vb-java-rechteck-umdrehungen-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-java-richtung-loesung.visustruct b/web/lessons/diagramme/vb-java-richtung-loesung.visustruct deleted file mode 100644 index 9eb32a98..00000000 --- a/web/lessons/diagramme/vb-java-richtung-loesung.visustruct +++ /dev/null @@ -1,41 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;114;105;99;104;116;117;110;103;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - 114;105;99;104;116;117;110;103;32;61;32;105; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;82;105;99;104;116;117;110;103;58;32;34;32;43;32;114;105;99;104;116;117;110;103;41; - - diff --git a/web/lessons/diagramme/vb-java-schritte-zaehlen-loesung.visustruct b/web/lessons/diagramme/vb-java-schritte-zaehlen-loesung.visustruct deleted file mode 100644 index dba178f6..00000000 --- a/web/lessons/diagramme/vb-java-schritte-zaehlen-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101;41; - - diff --git a/web/lessons/diagramme/vb-java-sicher-fahren-loesung.visustruct b/web/lessons/diagramme/vb-java-sicher-fahren-loesung.visustruct deleted file mode 100644 index 0aea9179..00000000 --- a/web/lessons/diagramme/vb-java-sicher-fahren-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-java-spirale-strecke-loesung.visustruct b/web/lessons/diagramme/vb-java-spirale-strecke-loesung.visustruct deleted file mode 100644 index 9f6a7df9..00000000 --- a/web/lessons/diagramme/vb-java-spirale-strecke-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;49;48; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 103;101;115;97;109;116;32;61;32;103;101;115;97;109;116;32;43;32;115;101;105;116;101; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;103;101;115;97;109;116;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-java-tageszeit-loesung.visustruct b/web/lessons/diagramme/vb-java-tageszeit-loesung.visustruct deleted file mode 100644 index 766d96d2..00000000 --- a/web/lessons/diagramme/vb-java-tageszeit-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;78;97;99;104;116;34;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;228;109;109;101;114;117;110;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;84;97;103;34;41; - - - - - - diff --git a/web/lessons/diagramme/vb-java-taste-stopp-loesung.visustruct b/web/lessons/diagramme/vb-java-taste-stopp-loesung.visustruct deleted file mode 100644 index 30a7a776..00000000 --- a/web/lessons/diagramme/vb-java-taste-stopp-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;115;116;111;112;112;116;34;41; - - diff --git a/web/lessons/diagramme/vb-java-textlaenge-loesung.visustruct b/web/lessons/diagramme/vb-java-textlaenge-loesung.visustruct deleted file mode 100644 index 61824d1c..00000000 --- a/web/lessons/diagramme/vb-java-textlaenge-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;97;108;108;111;32;75;108;97;115;115;101;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - diff --git a/web/lessons/diagramme/vb-java-wand-piep-loesung.visustruct b/web/lessons/diagramme/vb-java-wand-piep-loesung.visustruct deleted file mode 100644 index 13a3d130..00000000 --- a/web/lessons/diagramme/vb-java-wand-piep-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-java-wasserwaage-loesung.visustruct b/web/lessons/diagramme/vb-java-wasserwaage-loesung.visustruct deleted file mode 100644 index 82c30a84..00000000 --- a/web/lessons/diagramme/vb-java-wasserwaage-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-klatschen-loesung.visustruct b/web/lessons/diagramme/vb-klatschen-loesung.visustruct deleted file mode 100644 index c61e7e6e..00000000 --- a/web/lessons/diagramme/vb-klatschen-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/vb-knight-rider-loesung.visustruct b/web/lessons/diagramme/vb-knight-rider-loesung.visustruct deleted file mode 100644 index b4ea5574..00000000 --- a/web/lessons/diagramme/vb-knight-rider-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;32;48; - 105;45;45; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - diff --git a/web/lessons/diagramme/vb-konstante-wand-loesung.visustruct b/web/lessons/diagramme/vb-konstante-wand-loesung.visustruct deleted file mode 100644 index cab9e6a1..00000000 --- a/web/lessons/diagramme/vb-konstante-wand-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;65;66;83;84;65;78;68;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-l00-bausteine-loesung.visustruct b/web/lessons/diagramme/vb-l00-bausteine-loesung.visustruct deleted file mode 100644 index f8e6edf9..00000000 --- a/web/lessons/diagramme/vb-l00-bausteine-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - diff --git a/web/lessons/diagramme/vb-l00-sequenz-loesung.visustruct b/web/lessons/diagramme/vb-l00-sequenz-loesung.visustruct deleted file mode 100644 index 28be0d65..00000000 --- a/web/lessons/diagramme/vb-l00-sequenz-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/vb-l03-wachsend-loesung.visustruct b/web/lessons/diagramme/vb-l03-wachsend-loesung.visustruct deleted file mode 100644 index 13ec1e5f..00000000 --- a/web/lessons/diagramme/vb-l03-wachsend-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - diff --git a/web/lessons/diagramme/vb-l06k-mit.visustruct b/web/lessons/diagramme/vb-l06k-mit.visustruct deleted file mode 100644 index 46fc7980..00000000 --- a/web/lessons/diagramme/vb-l06k-mit.visustruct +++ /dev/null @@ -1,25 +0,0 @@ - - - - 99;111;110;115;116;32;105;110;116;32;65;66;83;84;65;78;68;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-l06k-ohne.visustruct b/web/lessons/diagramme/vb-l06k-ohne.visustruct deleted file mode 100644 index 35c22f4c..00000000 --- a/web/lessons/diagramme/vb-l06k-ohne.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-l06n-einparkhilfe.visustruct b/web/lessons/diagramme/vb-l06n-einparkhilfe.visustruct deleted file mode 100644 index f41c348f..00000000 --- a/web/lessons/diagramme/vb-l06n-einparkhilfe.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;112;34;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;97;110;103;115;97;109;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;114;101;105;34;41; - - - - - - diff --git a/web/lessons/diagramme/vb-l21z-ausweichen.visustruct b/web/lessons/diagramme/vb-l21z-ausweichen.visustruct deleted file mode 100644 index eee0f567..00000000 --- a/web/lessons/diagramme/vb-l21z-ausweichen.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;102;97;104;114;101;110;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50;48; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;102;97;104;114;101;110;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 122;117;115;116;97;110;100;32;61;32;34;100;114;101;104;101;110;34; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 122;117;115;116;97;110;100;32;61;32;34;102;97;104;114;101;110;34; - - - - - - diff --git a/web/lessons/diagramme/vb-labyrinth-loesung.visustruct b/web/lessons/diagramme/vb-labyrinth-loesung.visustruct deleted file mode 100644 index 1ce4696e..00000000 --- a/web/lessons/diagramme/vb-labyrinth-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 248; - - - - - - - - diff --git a/web/lessons/diagramme/vb-laufschrift-loesung.visustruct b/web/lessons/diagramme/vb-laufschrift-loesung.visustruct deleted file mode 100644 index 40558b46..00000000 --- a/web/lessons/diagramme/vb-laufschrift-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;32;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;116;46;99;104;97;114;65;116;40;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct b/web/lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct deleted file mode 100644 index 2364830d..00000000 --- a/web/lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct +++ /dev/null @@ -1,44 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vb-linienmuster-loesung.visustruct b/web/lessons/diagramme/vb-linienmuster-loesung.visustruct deleted file mode 100644 index 33a0442b..00000000 --- a/web/lessons/diagramme/vb-linienmuster-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;81;117;101;114;108;105;110;105;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - diff --git a/web/lessons/diagramme/vb-meister-platz-loesung.visustruct b/web/lessons/diagramme/vb-meister-platz-loesung.visustruct deleted file mode 100644 index 59d5aac8..00000000 --- a/web/lessons/diagramme/vb-meister-platz-loesung.visustruct +++ /dev/null @@ -1,35 +0,0 @@ - - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;109;32;119;101;105;116;101;115;116;101;110;58;32;34;32;43;32;109;97;120;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-melodie-loesung.visustruct b/web/lessons/diagramme/vb-melodie-loesung.visustruct deleted file mode 100644 index 8e93cb1f..00000000 --- a/web/lessons/diagramme/vb-melodie-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;91;93;32;116;111;101;110;101;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;111;101;110;101;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;116;111;101;110;101;91;105;93;44;32;51;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-messreihe-loesung.visustruct b/web/lessons/diagramme/vb-messreihe-loesung.visustruct deleted file mode 100644 index 3a8edb7d..00000000 --- a/web/lessons/diagramme/vb-messreihe-loesung.visustruct +++ /dev/null @@ -1,38 +0,0 @@ - - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 119;101;114;116;101;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;119;101;114;116;101;91;105;93; - - - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;119;101;114;116;32;61;32;115;117;109;109;101;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108;119;101;114;116;41; - - diff --git a/web/lessons/diagramme/vb-morsen-loesung.visustruct b/web/lessons/diagramme/vb-morsen-loesung.visustruct deleted file mode 100644 index f571cbeb..00000000 --- a/web/lessons/diagramme/vb-morsen-loesung.visustruct +++ /dev/null @@ -1,66 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;54;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - diff --git a/web/lessons/diagramme/vb-nachtlicht-loesung.visustruct b/web/lessons/diagramme/vb-nachtlicht-loesung.visustruct deleted file mode 100644 index 0fbf4b85..00000000 --- a/web/lessons/diagramme/vb-nachtlicht-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;53;53;44;32;50;53;53;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - diff --git a/web/lessons/diagramme/vb-nachtwaechter-loesung.visustruct b/web/lessons/diagramme/vb-nachtwaechter-loesung.visustruct deleted file mode 100644 index 281f3984..00000000 --- a/web/lessons/diagramme/vb-nachtwaechter-loesung.visustruct +++ /dev/null @@ -1,17 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; - - diff --git a/web/lessons/diagramme/vb-notbremse-loesung.visustruct b/web/lessons/diagramme/vb-notbremse-loesung.visustruct deleted file mode 100644 index f719d9a6..00000000 --- a/web/lessons/diagramme/vb-notbremse-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-oder-loesung.visustruct b/web/lessons/diagramme/vb-oder-loesung.visustruct deleted file mode 100644 index 3522ff31..00000000 --- a/web/lessons/diagramme/vb-oder-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41;32;124;124;32;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/vb-quadrat-loesung.visustruct b/web/lessons/diagramme/vb-quadrat-loesung.visustruct deleted file mode 100644 index 0c141aac..00000000 --- a/web/lessons/diagramme/vb-quadrat-loesung.visustruct +++ /dev/null @@ -1,75 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - diff --git a/web/lessons/diagramme/vb-quadrat-methode-loesung.visustruct b/web/lessons/diagramme/vb-quadrat-methode-loesung.visustruct deleted file mode 100644 index 66f40d9d..00000000 --- a/web/lessons/diagramme/vb-quadrat-methode-loesung.visustruct +++ /dev/null @@ -1,9 +0,0 @@ - - - - 113;117;97;100;114;97;116;40;51;48;41; - - - 113;117;97;100;114;97;116;40;53;48;41; - - diff --git a/web/lessons/diagramme/vb-quadrat-schleife-loesung.visustruct b/web/lessons/diagramme/vb-quadrat-schleife-loesung.visustruct deleted file mode 100644 index 994ab632..00000000 --- a/web/lessons/diagramme/vb-quadrat-schleife-loesung.visustruct +++ /dev/null @@ -1,55 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - diff --git a/web/lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct b/web/lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct deleted file mode 100644 index 77a676ba..00000000 --- a/web/lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct b/web/lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct deleted file mode 100644 index dcff5999..00000000 --- a/web/lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct +++ /dev/null @@ -1,23 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;53; - 106;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-rand-loesung.visustruct b/web/lessons/diagramme/vb-rand-loesung.visustruct deleted file mode 100644 index 776c42d4..00000000 --- a/web/lessons/diagramme/vb-rand-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - diff --git a/web/lessons/diagramme/vb-schraeglage-loesung.visustruct b/web/lessons/diagramme/vb-schraeglage-loesung.visustruct deleted file mode 100644 index 30ebd3a7..00000000 --- a/web/lessons/diagramme/vb-schraeglage-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;51;48;48;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/vb-schritte-welt-loesung.visustruct b/web/lessons/diagramme/vb-schritte-welt-loesung.visustruct deleted file mode 100644 index a30a0ede..00000000 --- a/web/lessons/diagramme/vb-schritte-welt-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101;41; - - diff --git a/web/lessons/diagramme/vb-slalom-loesung.visustruct b/web/lessons/diagramme/vb-slalom-loesung.visustruct deleted file mode 100644 index 885ff4a4..00000000 --- a/web/lessons/diagramme/vb-slalom-loesung.visustruct +++ /dev/null @@ -1,52 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-spirale-falsch-loesung.visustruct b/web/lessons/diagramme/vb-spirale-falsch-loesung.visustruct deleted file mode 100644 index 13ec1e5f..00000000 --- a/web/lessons/diagramme/vb-spirale-falsch-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - diff --git a/web/lessons/diagramme/vb-spirale-falsch-start.visustruct b/web/lessons/diagramme/vb-spirale-falsch-start.visustruct deleted file mode 100644 index 21998266..00000000 --- a/web/lessons/diagramme/vb-spirale-falsch-start.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-spirale-loesung.visustruct b/web/lessons/diagramme/vb-spirale-loesung.visustruct deleted file mode 100644 index 04f5926b..00000000 --- a/web/lessons/diagramme/vb-spirale-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;56; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;105;32;42;32;49;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-start-a-loesung.visustruct b/web/lessons/diagramme/vb-start-a-loesung.visustruct deleted file mode 100644 index 7e4f2167..00000000 --- a/web/lessons/diagramme/vb-start-a-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/vb-startsignal-loesung.visustruct b/web/lessons/diagramme/vb-startsignal-loesung.visustruct deleted file mode 100644 index 418c547d..00000000 --- a/web/lessons/diagramme/vb-startsignal-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;61;32;51; - 114;117;110;100;101;43;43; - - - 114;117;110;100;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;117;102;32;100;105;101;32;80;108;228;116;122;101;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;101;114;116;105;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - diff --git a/web/lessons/diagramme/vb-strecke-anzeigen-loesung.visustruct b/web/lessons/diagramme/vb-strecke-anzeigen-loesung.visustruct deleted file mode 100644 index d86bfed5..00000000 --- a/web/lessons/diagramme/vb-strecke-anzeigen-loesung.visustruct +++ /dev/null @@ -1,34 +0,0 @@ - - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;97;101;110;103;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;98;114;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 105;110;116;32;115;116;114;101;99;107;101;32;61;32;50;32;42;32;108;97;101;110;103;101;32;43;32;50;32;42;32;98;114;101;105;116;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;115;116;114;101;99;107;101;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-tempo-abstand-loesung.visustruct b/web/lessons/diagramme/vb-tempo-abstand-loesung.visustruct deleted file mode 100644 index 63518a55..00000000 --- a/web/lessons/diagramme/vb-tempo-abstand-loesung.visustruct +++ /dev/null @@ -1,26 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - - diff --git a/web/lessons/diagramme/vb-tonleiter-loesung.visustruct b/web/lessons/diagramme/vb-tonleiter-loesung.visustruct deleted file mode 100644 index 6e401309..00000000 --- a/web/lessons/diagramme/vb-tonleiter-loesung.visustruct +++ /dev/null @@ -1,18 +0,0 @@ - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;57;52;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;51;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;52;57;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; - - diff --git a/web/lessons/diagramme/vb-treppe-loesung.visustruct b/web/lessons/diagramme/vb-treppe-loesung.visustruct deleted file mode 100644 index d59d8d3f..00000000 --- a/web/lessons/diagramme/vb-treppe-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-tunnel-loesung.visustruct b/web/lessons/diagramme/vb-tunnel-loesung.visustruct deleted file mode 100644 index f831c2f5..00000000 --- a/web/lessons/diagramme/vb-tunnel-loesung.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;116;32;108;105;110;107;115;32;61;32;57;57; - - - 105;110;116;32;114;101;99;104;116;115;32;61;32;57;57; - - - 108;105;110;107;115;32;62;61;32;50;48;32;124;124;32;114;101;99;104;116;115;32;62;61;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 108;105;110;107;115;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 114;101;99;104;116;115;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-ueberladung-umdrehung-loesung.visustruct b/web/lessons/diagramme/vb-ueberladung-umdrehung-loesung.visustruct deleted file mode 100644 index e53e0ec0..00000000 --- a/web/lessons/diagramme/vb-ueberladung-umdrehung-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-und-loesung.visustruct b/web/lessons/diagramme/vb-und-loesung.visustruct deleted file mode 100644 index 09977d66..00000000 --- a/web/lessons/diagramme/vb-und-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - diff --git a/web/lessons/diagramme/vb-variable-seite-loesung.visustruct b/web/lessons/diagramme/vb-variable-seite-loesung.visustruct deleted file mode 100644 index dfc419ae..00000000 --- a/web/lessons/diagramme/vb-variable-seite-loesung.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 105;110;116;32;115;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-vier-quadrate-loesung.visustruct b/web/lessons/diagramme/vb-vier-quadrate-loesung.visustruct deleted file mode 100644 index c1ec5583..00000000 --- a/web/lessons/diagramme/vb-vier-quadrate-loesung.visustruct +++ /dev/null @@ -1,33 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;52; - 106;43;43; - - - 105;110;116;32;107;32;61;32;48; - 107;32;60;32;53; - 107;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vb-wald-loesung.visustruct b/web/lessons/diagramme/vb-wald-loesung.visustruct deleted file mode 100644 index da9a53f0..00000000 --- a/web/lessons/diagramme/vb-wald-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/vb-wand-vorn-loesung.visustruct b/web/lessons/diagramme/vb-wand-vorn-loesung.visustruct deleted file mode 100644 index 259f2533..00000000 --- a/web/lessons/diagramme/vb-wand-vorn-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vb-wurde-es-dunkel-loesung.visustruct b/web/lessons/diagramme/vb-wurde-es-dunkel-loesung.visustruct deleted file mode 100644 index 910f2711..00000000 --- a/web/lessons/diagramme/vb-wurde-es-dunkel-loesung.visustruct +++ /dev/null @@ -1,42 +0,0 @@ - - - - 98;111;111;108;101;97;110;32;100;117;110;107;101;108;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 100;117;110;107;101;108;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 100;117;110;107;101;108; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;69;115;32;119;97;114;32;100;117;110;107;101;108;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;109;109;101;114;32;104;101;108;108;34;41; - - - - diff --git a/web/lessons/diagramme/vb-zentimeter-loesung.visustruct b/web/lessons/diagramme/vb-zentimeter-loesung.visustruct deleted file mode 100644 index 24f26469..00000000 --- a/web/lessons/diagramme/vb-zentimeter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;116;32;115;116;114;101;99;107;101;32;61;32;122;101;110;116;105;109;101;116;101;114;40;51;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;116;114;101;99;107;101;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;115;116;114;101;99;107;101;32;43;32;34;32;99;109;34;41; - - diff --git a/web/lessons/diagramme/vb-zentimeter-unterprogramm-loesung.visustruct b/web/lessons/diagramme/vb-zentimeter-unterprogramm-loesung.visustruct deleted file mode 100644 index e2931b4b..00000000 --- a/web/lessons/diagramme/vb-zentimeter-unterprogramm-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 114;101;116;117;114;110;32;117;109;100;114;101;104;117;110;103;101;110;32;42;32;50;48; - - diff --git a/web/lessons/diagramme/vb-zwei-sekunden-loesung.visustruct b/web/lessons/diagramme/vb-zwei-sekunden-loesung.visustruct deleted file mode 100644 index cc9ce11d..00000000 --- a/web/lessons/diagramme/vb-zwei-sekunden-loesung.visustruct +++ /dev/null @@ -1,20 +0,0 @@ - - - - 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;84;105;109;101;114;40;41;32;60;32;50; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vbb-abstand-zeigen-loesung.visustruct b/web/lessons/diagramme/vbb-abstand-zeigen-loesung.visustruct deleted file mode 100644 index f003bf79..00000000 --- a/web/lessons/diagramme/vbb-abstand-zeigen-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;41; - - diff --git a/web/lessons/diagramme/vbb-ampel-loesung.visustruct b/web/lessons/diagramme/vbb-ampel-loesung.visustruct deleted file mode 100644 index 083e58e2..00000000 --- a/web/lessons/diagramme/vbb-ampel-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;116;111;112;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vbb-ausgang-loesung.visustruct b/web/lessons/diagramme/vbb-ausgang-loesung.visustruct deleted file mode 100644 index 7bfd3115..00000000 --- a/web/lessons/diagramme/vbb-ausgang-loesung.visustruct +++ /dev/null @@ -1,30 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/vbb-bis-wand-loesung.visustruct b/web/lessons/diagramme/vbb-bis-wand-loesung.visustruct deleted file mode 100644 index 1d0a17e3..00000000 --- a/web/lessons/diagramme/vbb-bis-wand-loesung.visustruct +++ /dev/null @@ -1,11 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vbb-blinken-loesung.visustruct b/web/lessons/diagramme/vbb-blinken-loesung.visustruct deleted file mode 100644 index 777aa971..00000000 --- a/web/lessons/diagramme/vbb-blinken-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - diff --git a/web/lessons/diagramme/vbb-disco-loesung.visustruct b/web/lessons/diagramme/vbb-disco-loesung.visustruct deleted file mode 100644 index 00343e1e..00000000 --- a/web/lessons/diagramme/vbb-disco-loesung.visustruct +++ /dev/null @@ -1,31 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - diff --git a/web/lessons/diagramme/vbb-dreieck-loesung.visustruct b/web/lessons/diagramme/vbb-dreieck-loesung.visustruct deleted file mode 100644 index d51a7ac6..00000000 --- a/web/lessons/diagramme/vbb-dreieck-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - diff --git a/web/lessons/diagramme/vbb-ecke-loesung.visustruct b/web/lessons/diagramme/vbb-ecke-loesung.visustruct deleted file mode 100644 index 58855c8b..00000000 --- a/web/lessons/diagramme/vbb-ecke-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/vbb-erster-block-loesung.visustruct b/web/lessons/diagramme/vbb-erster-block-loesung.visustruct deleted file mode 100644 index c80687be..00000000 --- a/web/lessons/diagramme/vbb-erster-block-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - diff --git a/web/lessons/diagramme/vbb-hin-und-zurueck-loesung.visustruct b/web/lessons/diagramme/vbb-hin-und-zurueck-loesung.visustruct deleted file mode 100644 index 92e16818..00000000 --- a/web/lessons/diagramme/vbb-hin-und-zurueck-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - diff --git a/web/lessons/diagramme/vbb-klotz-loesung.visustruct b/web/lessons/diagramme/vbb-klotz-loesung.visustruct deleted file mode 100644 index 77449c19..00000000 --- a/web/lessons/diagramme/vbb-klotz-loesung.visustruct +++ /dev/null @@ -1,36 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - diff --git a/web/lessons/diagramme/vbb-licht-gruen-loesung.visustruct b/web/lessons/diagramme/vbb-licht-gruen-loesung.visustruct deleted file mode 100644 index f94e4eea..00000000 --- a/web/lessons/diagramme/vbb-licht-gruen-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - diff --git a/web/lessons/diagramme/vbb-linie-bis-rot-loesung.visustruct b/web/lessons/diagramme/vbb-linie-bis-rot-loesung.visustruct deleted file mode 100644 index 460b38e9..00000000 --- a/web/lessons/diagramme/vbb-linie-bis-rot-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vbb-linienfolger-loesung.visustruct b/web/lessons/diagramme/vbb-linienfolger-loesung.visustruct deleted file mode 100644 index 0b3e617a..00000000 --- a/web/lessons/diagramme/vbb-linienfolger-loesung.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - diff --git a/web/lessons/diagramme/vbb-notbremse-loesung.visustruct b/web/lessons/diagramme/vbb-notbremse-loesung.visustruct deleted file mode 100644 index 42dbd492..00000000 --- a/web/lessons/diagramme/vbb-notbremse-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - -1; - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - -1; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;115;116;111;112;112;116;34;41; - - diff --git a/web/lessons/diagramme/vbb-quadrat-loesung.visustruct b/web/lessons/diagramme/vbb-quadrat-loesung.visustruct deleted file mode 100644 index 8eb8fcf9..00000000 --- a/web/lessons/diagramme/vbb-quadrat-loesung.visustruct +++ /dev/null @@ -1,27 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - diff --git a/web/lessons/diagramme/vbb-quadrat-wiederhole-loesung.visustruct b/web/lessons/diagramme/vbb-quadrat-wiederhole-loesung.visustruct deleted file mode 100644 index 6e483de3..00000000 --- a/web/lessons/diagramme/vbb-quadrat-wiederhole-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vbb-rand-loesung.visustruct b/web/lessons/diagramme/vbb-rand-loesung.visustruct deleted file mode 100644 index cad8cce9..00000000 --- a/web/lessons/diagramme/vbb-rand-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - diff --git a/web/lessons/diagramme/vbb-sirene-loesung.visustruct b/web/lessons/diagramme/vbb-sirene-loesung.visustruct deleted file mode 100644 index f3628547..00000000 --- a/web/lessons/diagramme/vbb-sirene-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;48;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;54;48;48;44;32;51;48;48;41; - - - - diff --git a/web/lessons/diagramme/vbb-slalom-loesung.visustruct b/web/lessons/diagramme/vbb-slalom-loesung.visustruct deleted file mode 100644 index 4a6ca877..00000000 --- a/web/lessons/diagramme/vbb-slalom-loesung.visustruct +++ /dev/null @@ -1,52 +0,0 @@ - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - diff --git a/web/lessons/diagramme/vbb-start-a-loesung.visustruct b/web/lessons/diagramme/vbb-start-a-loesung.visustruct deleted file mode 100644 index 555cc6f9..00000000 --- a/web/lessons/diagramme/vbb-start-a-loesung.visustruct +++ /dev/null @@ -1,14 +0,0 @@ - - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - diff --git a/web/lessons/diagramme/vbb-wald-loesung.visustruct b/web/lessons/diagramme/vbb-wald-loesung.visustruct deleted file mode 100644 index 4d06b675..00000000 --- a/web/lessons/diagramme/vbb-wald-loesung.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - diff --git a/web/lessons/diagramme/vbb-wand-vorn-loesung.visustruct b/web/lessons/diagramme/vbb-wand-vorn-loesung.visustruct deleted file mode 100644 index 22d28eab..00000000 --- a/web/lessons/diagramme/vbb-wand-vorn-loesung.visustruct +++ /dev/null @@ -1,16 +0,0 @@ - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - diff --git a/web/lessons/diagramme/vbb-weiter-loesung.visustruct b/web/lessons/diagramme/vbb-weiter-loesung.visustruct deleted file mode 100644 index e92baa3f..00000000 --- a/web/lessons/diagramme/vbb-weiter-loesung.visustruct +++ /dev/null @@ -1,6 +0,0 @@ - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - diff --git a/web/lessons/diagramme/zk-initialen-loesung.visustruct b/web/lessons/diagramme/zk-initialen-loesung.visustruct deleted file mode 100644 index eea530b2..00000000 --- a/web/lessons/diagramme/zk-initialen-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - diff --git a/web/lessons/diagramme/zk-mehr.visustruct b/web/lessons/diagramme/zk-mehr.visustruct deleted file mode 100644 index 43785a3b..00000000 --- a/web/lessons/diagramme/zk-mehr.visustruct +++ /dev/null @@ -1,39 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;90;105;101;103;101;110;98;111;99;107;34; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;110;100;101;120;79;102;40;34;101;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;108;97;115;116;73;110;100;101;120;79;102;40;34;101;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;90;73;69;71;69;78;66;79;67;75;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;114;101;112;108;97;99;101;40;34;98;111;99;107;34;44;32;34;107;228;115;101;34;41; - - - 111;117;116;112;117;116;58;32;34;77;228;104;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;97;108;116;101;114;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;97;108;116;101;114;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;97;108;116;101;114;41;32;43;32;34;32;74;97;104;114;101;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - diff --git a/web/lessons/diagramme/zk-rueckwaerts-loesung.visustruct b/web/lessons/diagramme/zk-rueckwaerts-loesung.visustruct deleted file mode 100644 index 6d84212f..00000000 --- a/web/lessons/diagramme/zk-rueckwaerts-loesung.visustruct +++ /dev/null @@ -1,22 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;32;114;117;101;99;107;119;97;101;114;116;115;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 114;117;101;99;107;119;97;101;114;116;115;32;61;32;114;117;101;99;107;119;97;101;114;116;115;32;43;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;114;117;101;99;107;119;97;101;114;116;115; - - diff --git a/web/lessons/diagramme/zk-split.visustruct b/web/lessons/diagramme/zk-split.visustruct deleted file mode 100644 index 11b53fd4..00000000 --- a/web/lessons/diagramme/zk-split.visustruct +++ /dev/null @@ -1,19 +0,0 @@ - - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;76;117;100;119;105;103;59;71;101;105;223;98;111;99;107;59;55;34; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;105;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;116;101;105;108;101;91;105;93; - - - - diff --git a/web/lessons/diagramme/zk-woerter-loesung.visustruct b/web/lessons/diagramme/zk-woerter-loesung.visustruct deleted file mode 100644 index ac607d14..00000000 --- a/web/lessons/diagramme/zk-woerter-loesung.visustruct +++ /dev/null @@ -1,12 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;97;116;122;32;34;83;97;116;122;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;91;93;32;119;111;101;114;116;101;114;32;61;32;115;97;116;122;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;87;246;114;116;101;114;58;32;34;32;43;32;119;111;101;114;116;101;114;46;108;101;110;103;116;104; - - diff --git a/web/lessons/diagramme/zk-zaehlen.visustruct b/web/lessons/diagramme/zk-zaehlen.visustruct deleted file mode 100644 index 9a440e5b..00000000 --- a/web/lessons/diagramme/zk-zaehlen.visustruct +++ /dev/null @@ -1,32 +0,0 @@ - - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 119;111;114;116;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;101;39; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;32;101;58;32;34;32;43;32;97;110;122;97;104;108; - - diff --git a/web/lessons/diagramme/zk-zeichen.visustruct b/web/lessons/diagramme/zk-zeichen.visustruct deleted file mode 100644 index a8e82425..00000000 --- a/web/lessons/diagramme/zk-zeichen.visustruct +++ /dev/null @@ -1,24 +0,0 @@ - - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;71;101;105;223;98;111;99;107;34; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;48;44;32;52;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;52;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;110;100;101;120;79;102;40;34;98;111;99;107;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - diff --git a/web/lessons/en/01-was-ist-ein-struktogramm.md b/web/lessons/en/01-was-ist-ein-struktogramm.md deleted file mode 100644 index 25a7198f..00000000 --- a/web/lessons/en/01-was-ist-ein-struktogramm.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -titel: What is a structure chart? -bereich: First steps -kurz: Show and read algorithms as a series of clear steps. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an algorithm is -- read a structure chart -- recognise the three basic building blocks: sequence, branch and loop -::: - -## An algorithm is an exact set of instructions - -An **algorithm** describes step by step how to solve a task. Every step must be so clear that someone can carry it out without asking, a person just as well as a computer. - -You know algorithms from everyday life: a recipe, directions to a place or the instructions for building a wardrobe. - -::: diagramm l1-tee.visustruct -Making tea as a structure chart: every box is one step. -::: - -::: angeberwissen -Baaah, who wrote the first program? A woman, back in 1843, long before the first computer! **Ada Lovelace** described step by step how Charles Babbage's *Analytical Engine* should calculate the so-called Bernoulli numbers. That was a real algorithm for a machine. The instructions were meant to be stored on punched cards (more on this in lesson 3). However, the machine was never built. - -Ada had another brilliant idea: a machine like this can do more than calculate. It could also work with letters, symbols or even music. That is exactly what computers do today. A programming language called **Ada** is named after her. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), mathematician (picture: watercolour by Alfred Edward Chalon, around 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), public domain). -::: - -## How to read a structure chart - -You read a structure chart **from top to bottom**. Every box is one step. Only when a step is finished does the next one start. - -This way of drawing was invented by **Isaac Nassi and Ben Shneiderman** (1973). That is why it is also called a Nassi-Shneiderman diagram. In Germany it is standardised as DIN 66261. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -Left: Isaac “Ike” Nassi (photo: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/), cropped), right: Ben Shneiderman (photo: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> A structure chart always has exactly one start (at the top) and one end (at the bottom). There are no arrows and no jumps all over the place. Programs that jump all over the place are called **spaghetti code**, because their flow gets tangled like noodles on a plate. More on this in the next lesson. - -::: angeberwissen -Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony Brook University near New York. Shneiderman was about 25 and Nassi about 23. So basically two students who wrote computer science history on the side. -::: - -## Building block 1: the sequence - -Every algorithm can be built from just **three basic building blocks**: **sequence**, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them: [statements]{.gelb} are yellow, branches blue, loops pink. The sequence has no colour of its own, it is simply the row of statements one below the other. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. - -The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. - -This is what it looks like: - -- Every statement is a **simple rectangle**. -- The rectangles sit **on top of each other** without a gap. -- They run from top to bottom, one statement after the other. - -::: diagramm l1-sequenz.visustruct -Four statements as a sequence. First you get up, then you brush your teeth, and so on. -::: - -> The tea example above is a sequence, too. - -::: angeberwissen -15 minutes! That is how long Shneiderman needed for the first sketch with sequence, branch and loop. I need longer than that to choose between hay and clover. -::: - -## Building block 2: the branch - -Often the next step depends on a **condition**. A condition is a question you can only answer with **yes or no**, for example *Is it raining?* In VisuStruct yes is **true** and no is **false**. - -For decisions like this there is the **branch**. This is what it looks like: - -- At the top, the condition sits in a **triangle**. -- Below it, the box splits into **two columns**: on the left the path for **true**, on the right the path for **false**. -- **Only one** of the two paths ever runs. After that, both paths continue together below the branch. - -::: diagramm l1-verzweigung.visustruct -If it is raining, the left path runs, otherwise the right one. After that, both cases continue with “Leave”. -::: - -> If nothing should happen in one case, that path stays empty. The sign **ø** shows this. - -::: angeberwissen -Spelling alert! It is Shneiderman, with no c. Anyone who writes “Schneiderman” gets a gentle nudge from my horns. He himself points out that people keep sneaking a c into his name. -::: - -## Building block 3: the loop - -If something should happen **several times**, you do not write it down several times. Instead you use a **loop**, also called repetition. - -This is what it looks like: - -- At the top is the condition, for example *Plate not empty*. -- The steps that are repeated are **indented** below it. At the top and on the left, the box forms an **upside-down L** around them. -- Before every pass the condition is checked. As long as it is **true**, the steps inside the upside-down L run once more. If it is **false**, the program continues below the loop. - -::: diagramm l1-wiederholung.visustruct -As long as the plate is not empty, you take a bite. After that, the plate is cleared. -::: - -> There are more kinds of loops. You will meet them in later lessons. - -## All three together - -The building blocks become really useful when you combine them. This diagram contains all three: a sequence from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple [statements]{.gelb}. The statements inside a branch or a loop are yellow too. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. - -::: diagramm l1-grundbausteine.visustruct -You recognise the branch by its triangle and the loop by its upside-down L. Everything together sits in a sequence. -::: - -The boxes can also be **nested** inside each other: a loop or a path can contain sequences, branches and loops again. - -::: angeberwissen -Comfort for anyone who has messed up a test: the famous journal *Communications of the ACM* rejected the structure chart article. According to Nassi, the reviewer even said they should collect every copy and burn it. Ouch! It then appeared in 1973 in a smaller journal and today it is quoted thousands of times. Ha! -::: - -## Structure first, then code - -When you program, two things happen at once: you have to think about the steps and pay attention to how the programming language is written. A structure chart lets you keep the two apart. - -1. First you think about the **logic**: which steps, which conditions, which repetitions? -2. Then you translate the finished structure into **Java, Python or JavaScript**. VisuStruct can even generate the code for you. - -With the **simulation** you can also run your structure chart step by step and check whether it really does what it should. - -## Game: Which building block? - -::: spiel frage -titel: Game: Which building block? -intro: Ludwig describes things from his everyday life. Which of the three building blocks is hidden in each? Eight rounds. -antworten: sequence | branch | loop - -runde: -frage: "Toothpaste on the brush, brush your teeth, rinse your mouth." -richtig: sequence -> Three steps, each exactly once and always in this order. - -runde: -frage: "If it rains, take the umbrella, otherwise the sunglasses." -richtig: branch -> A condition decides which of the two ways is taken. - -runde: -frage: "Stir until the dough is smooth." -richtig: loop -> Stirring is repeated as long as the dough isn't smooth yet. - -runde: -frage: "Run ten laps around the sports field." -richtig: loop -> The same lap is run ten times. - -runde: -frage: "Shoes on, jacket on, door open, off you go." -richtig: sequence -> One step after the other, nothing is skipped or repeated. - -runde: -frage: "If the light is green, you cross the street." -richtig: branch -> Even without "otherwise" it is a branch. The otherwise branch is simply empty. - -runde: -frage: "Roll the dice until you get a six." -richtig: loop -> You don't know beforehand how often. You roll until the condition is met. - -runde: -frage: "If someone says 'Come in', you go in. Otherwise you wait at the door." -richtig: branch -> The answer decides between two ways: go in or wait. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an algorithm is. → An algorithm is an exact set of instructions -- I can read a structure chart from top to bottom. → How to read a structure chart -- I can name the three basic building blocks: sequence, branch and loop. → Building block 1: the sequence -- I can recognise every building block in a structure chart by its shape. → All three together -::: - -## Quiz - -::: quiz -? In which direction do you read a structure chart? -→ How to read a structure chart -- [ ] From left to right -- [x] From top to bottom -- [ ] From bottom to top -> Every box is one step, and the steps follow each other from top to bottom. - -? Which building block is NOT one of the three basic building blocks? -→ Building block 1: the sequence -- [ ] Sequence -- [ ] Branch -- [x] Jump -- [ ] Loop -> There are no jumps in a structure chart. Sequence, branch and loop are enough for every algorithm. - -? How do you recognise a branch in a structure chart? -→ All three together -- [ ] By an upside-down L -- [x] By a triangle with the condition and two columns below it -- [ ] By several rectangles on top of each other -> The upside-down L belongs to the loop, and rectangles on top of each other are a sequence. - -? When does the inside of a loop run once more? -→ All three together -- [x] As long as the condition is true -- [ ] Only if the condition is false -- [ ] Always exactly twice -> The condition is checked before every pass. If it is false, the program continues below the loop. - -? What is an algorithm? -→ An algorithm is an exact set of instructions -- [x] Clear step-by-step instructions for solving a task -- [ ] A particular program in Java -- [ ] A picture that explains a program -> An algorithm does not depend on a programming language. A structure chart is one way to write it down. -::: diff --git a/web/lessons/en/01-weitere-darstellungen.md b/web/lessons/en/01-weitere-darstellungen.md deleted file mode 100644 index 94816fce..00000000 --- a/web/lessons/en/01-weitere-darstellungen.md +++ /dev/null @@ -1,239 +0,0 @@ ---- -titel: Flowcharts and pseudocode -bereich: First steps -kurz: Show algorithms as a flowchart and as pseudocode, and compare them with the structure chart. ---- - -## Skills I will gain now - -::: kompetenzen -- read a flowchart and build one myself -- explain why jumps in a flowchart lead to mistakes -- read a simple algorithm as pseudocode -::: - -## Other ways to draw it: the flowchart - -There are two more ways to show an algorithm: the **flowchart** and **pseudocode**. You will meet both in class. - -Here you see our structure chart for drinking tea from the last lesson once more. Next we look at the flowchart, using the same example. - -::: diagramm l1-grundbausteine.visustruct -The tea example as a structure chart: first the cup, then the branch for the sugar, then the loop. -::: - -### The same algorithm as a flowchart - -::: grafik l01-pap.svg -The tea example as a flowchart. The arrow from “Wait 1 minute” back up forms the loop. -::: - -### The symbols - -A flowchart is made of a few symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). - -- **Oval:** start or end. Every flowchart has exactly one start and one end. -- **Rectangle:** a statement, for example *Put a cup on the table*. -- **Diamond:** a decision. The diamond holds a question, and two arrows lead out of it: **yes** and **no**. -- **Parallelogram:** an input or output. The tea example does not have one. -- **Arrow:** shows which step comes next. - -A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. - -### The advantages - -- **Very easy to read**, even for people who have never seen a flowchart. You simply follow the arrows with your finger. -- Flowcharts are not only used in programming but wherever a process is explained: in user manuals, for troubleshooting (“Is the lamp on? No: is it plugged in?”) or in companies for work processes. - -## Exercise: Baking a cake as a flowchart - -Now you build a flowchart yourself. Ludwig bakes a cake like this: - -He puts the ingredients in the bowl and stirs the batter. If the batter is not smooth yet, he keeps stirring. Once it is smooth, he pours the batter into the tin and bakes the cake for 30 minutes. Then he checks with a wooden skewer: if batter still sticks to it, he bakes for 5 more minutes and checks again. Once the skewer comes out clean, he takes the cake out and calls: “The cake is ready!” - -::: pap -titel: Exercise: Baking a cake as a flowchart -auftrag: The places in the chart are empty. Put each element in its place. The shape of the place helps you. -start: Start -anweisung: Put ingredients in the bowl -anweisung: Stir the batter -frage: Batter smooth? | nein -> Stir the batter -anweisung: Pour batter into the tin -anweisung: Bake for 30 minutes -frage: Skewer clean? | nein: Bake 5 more minutes -anweisung: Take the cake out -ausgabe: “The cake is ready!” -ende: End -erklärung: Two loops, two arrows back up: when stirring, the arrow leads back to “Stir the batter”; when baking, it leads from “Bake 5 more minutes” back to the question. The output sits in the parallelogram. -legende: ja -::: - -**Draw your own flowcharts:** With **VisuFlow** you can easily draw your own flowchart. The symbols are ready in a bar: tapping one adds the next symbol and connects it with an arrow right away. To get started you can load the tea example. You save your flowchart as a file and export it as an image or PDF, for example for your notebook or a presentation. [Open VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Drawbacks of the flowchart: jumps - -An arrow in a flowchart may lead from any symbol to any other. That sounds handy, but it is dangerous. - -In the old days, programs were written exactly like that. Every line had a **number**, and the command **GOTO** jumped to a line number. Every GOTO is an arrow from the flowchart. Our tea example would look like this: - -``` -10 Put a cup on the table -20 IF no sugar wanted, GOTO 40 -30 Add sugar -40 IF tea not too hot, GOTO 70 -50 Wait 1 minute -60 GOTO 40 -70 Drink the tea -``` - -### One more line, and the jumps go wrong - -Now you improve the algorithm: after the sugar, the tea bag should come out. You insert the new line 40, and all lines below move down one number. But the jumps still point to the old numbers: - -``` -10 Put a cup on the table -20 IF no sugar wanted, GOTO 40 -30 Add sugar -40 Take out the tea bag -50 IF tea not too hot, GOTO 70 -60 Wait 1 minute -70 GOTO 40 -80 Drink the tea -``` - -Play it through: line 70 no longer sends you to the check in line 50 but to the tea bag. And when the tea is cool enough, line 50 jumps to line 70 instead of *Drink the tea*. So you keep taking out the tea bag and never drink. With every change you have to check every GOTO. In a big program with hundreds of jumps, something easily goes wrong. - -### All over the place: spaghetti code - -With arrows you can also jump out of the middle of a loop, or from outside into the middle of a loop. Such jumps quickly make the chart confusing. With many jumps the arrows cross until the chart looks like a plate of spaghetti. That is why it is called **spaghetti code**. You can hardly follow the flow any more, and mistakes hide well. - -A structure chart has no arrows. If you insert a box, everything below simply moves down with it, and no jump can point to the wrong place. For leaving a loop early there is a separate, tidy box, the break. You will meet it in lesson 18. - -::: angeberwissen -In 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, `goto` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. -::: - -## Pseudocode and comparison - -**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. There are no jumps here either. This is our tea example: - -``` -Put a cup on the table -IF sugar wanted THEN - Add sugar -END IF -WHILE tea still too hot - Wait 1 minute -END WHILE -Drink the tea -``` - -Pseudocode has **no fixed notation**. Some people write WHEN instead of IF, others use an arrow for assignment (`number ← 5`) or leave out the END lines. All of that is fine. What matters is that anyone can understand it without an explanation. So pseudocode is not another programming language you have to learn. - -::: angeberwissen -Does pseudocode look familiar? The programming language Python looks very similar, and that is on purpose: its inventor Guido van Rossum wanted programs to read almost like plain text. Python also uses indentation to show what belongs together. But careful: Python is a real programming language with strict rules. One space too many and the computer complains. Pseudocode is more relaxed, just like me at breakfast. -::: - -### Compared - -- **Structure chart:** boxes inside boxes, the loop is an upside-down L. You see the structure at a glance, and wild jumps are impossible. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing, and jumps all over the place are possible. -- **Pseudocode:** text with indentation, the loop sits between WHILE and END WHILE. Quick to write and already close to program code. - -> All three describe the same algorithm. Once you can read one form, you learn the others quickly. - -::: angeberwissen -Nassi and Shneiderman were out to get the arrows! Their 1973 article was called “Flowchart Techniques for Structured Programming”. With arrows you can jump all over the place until the chart looks like a plate of spaghetti. In a structure chart that is simply impossible. Baah, that is how I like it: tidy, like my stable. -::: - -## Game: Which way of drawing? - -::: spiel frage -titel: Game: Which way of drawing? -intro: Ludwig describes a way of drawing an algorithm without saying its name. Is it the structure chart, the flowchart or pseudocode? Eight rounds. -antworten: structure chart | flowchart | pseudocode - -runde: -frage: “When something is repeated, one of my arrows points back up.” -richtig: flowchart -> A flowchart has no special symbol for a loop. An arrow leads back up. - -runde: -frage: “My loop looks like an upside-down L.” -richtig: structure chart -> The box wraps around the repeated steps at the top and on the left. - -runde: -frage: “I am made of words like IF and WHILE, and the indentation shows what belongs together.” -richtig: pseudocode -> Pseudocode is text in plain language that is laid out like a program. - -runde: -frage: “My branch is a diamond with the exits yes and no.” -richtig: flowchart -> In a structure chart, the condition sits in a triangle instead. - -runde: -frage: “My arrows can get tangled all over the place like spaghetti.” -richtig: flowchart -> Because arrows may lead anywhere, spaghetti code is possible in a flowchart. - -runde: -frage: “I have no fixed way of writing. You may write WHEN instead of IF.” -richtig: pseudocode -> All that matters is that anyone can understand it without an explanation. - -runde: -frage: “The condition sits at the top in a triangle, and below it I split into two columns.” -richtig: structure chart -> This is how a branch looks in a structure chart: true on the left, false on the right. - -runde: -frage: “If you insert a box, everything below simply moves down with it. No jump can go wrong.” -richtig: structure chart -> A structure chart has no arrows and no jumps, so nothing can point to the wrong place. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the symbols of a flowchart and read a simple flowchart. → Other ways to draw it: the flowchart -- I can build a simple algorithm as a flowchart myself. → Exercise: Baking a cake as a flowchart -- I can explain why jumps with GOTO lead to mistakes and spaghetti code. → Drawbacks of the flowchart: jumps -- I can read a simple algorithm as pseudocode. → Pseudocode and comparison -::: - -## Quiz - -::: quiz -? How do you recognise a loop in a flowchart? -→ Other ways to draw it: the flowchart -- [ ] By an upside-down L -- [x] By an arrow that leads back up -- [ ] By the word WHILE -> The upside-down L belongs to the structure chart, and WHILE to pseudocode. - -? Match each flowchart symbol to its meaning. -→ Other ways to draw it: the flowchart -= Oval -> Start or end -= Rectangle -> Statement -= Diamond -> Decision -= Parallelogram -> Input or output -> The diamond has two exits: yes and no. - -? You insert a new line into a program with GOTO. What can happen? -→ Drawbacks of the flowchart: jumps -- [x] The jumps point to the wrong lines because the numbers have moved -- [ ] Nothing, the jumps adjust by themselves -- [ ] The program automatically gets faster -> Every GOTO points to a fixed line number. If the lines move down, the program jumps to the wrong place. - -? In pseudocode, what shows which lines belong to a loop? -→ Pseudocode and comparison -- [ ] The colour -- [x] The indentation and the END WHILE -- [ ] An arrow -> Everything between WHILE and END WHILE is indented and is repeated. -::: diff --git a/web/lessons/en/02-der-editor.md b/web/lessons/en/02-der-editor.md deleted file mode 100644 index 2c3abebd..00000000 --- a/web/lessons/en/02-der-editor.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -titel: The editor -bereich: First steps -kurz: Insert elements, type text, move and delete. ---- - -## Skills I will gain now - -::: kompetenzen -- insert an element from the Elements area and replace a placeholder -- change the text of a box and switch between Statement, Input and Output -- move, copy and delete boxes and undo steps -::: - -## The screen - -VisuStruct has two editors: the [structure chart editor](#zeige-editor), which this lesson is about, and on the right the [Code](#zeige-codelive) area for Java code (from lesson 4). If the structure chart editor is collapsed, this lesson opens it for you. The blue words show you the areas, even when they are collapsed: move the mouse over one, and the area opens next to the learning area and lights up. Click it (or tap it), and it stays open. - -The structure chart editor has several areas. Move the mouse over a blue word or tap it, and that area lights up in the editor; collapsed areas such as Elements open. - -- **At the very top, the [toolbar](#zeige-leiste):** New, Open and Save. On the far right, the gear for [Settings](#zeige-einstellungen): text size and language. -- **Below it, the [tools](#zeige-werkzeuge)** above the elements and the structure chart: Undo, Cut, Copy, Paste, Delete, Export, Code and Simulation. The buttons only show icons. Hold the mouse over one and its name appears. -- **On the left, the [Elements](#zeige-elemente):** Here are all the building blocks you can drag into the structure chart. Some people also call this area the palette. -- **In the middle, the [structure chart](#zeige-struktogramm):** A new diagram contains only an empty placeholder, marked with **ø**. -- **At the bottom, the [Object Inspector](#zeige-objektinspektor):** Here you edit the text of the selected element. If it is too small or too big, drag the line with the grip above it up or down. - -> You can collapse this learning area at any time with the [sidebar icon](#zeige-lernen) at the top of this area. Then only the slim “🎓 Learn” strip stays on the left; click it to open the area again. It stays open next to the editor so you can try out right away what you read. In the same way there is the [📁 Files](#zeige-dateien) column on the left for your saved programs (lesson 3) and the [Code](#zeige-codelive) area on the right for Java (from lesson 4). - -## Insert an element - -Drag an element from the **Elements** area onto the structure chart. While you drag, a blue line shows where it will land: - -- **Onto the placeholder ø:** The element replaces the placeholder. -- **Onto the top half of a box:** The element goes in front of it. -- **Onto the bottom half of a box:** The element goes after it. - -::: grafik l02-einfuegen.svg -Where you drop it decides where the new element lands. -::: - -It also works without dragging: **click** an element in the Elements area (or tap it). Then it is inserted after the selected box. If the placeholder **ø** is selected, it replaces it. - -With the keyboard, press **Tab** to jump to an element and press **Enter**. The new element also goes after the selected box. - -::: angeberwissen -Grabbing boxes and dragging them around, just like you are doing now, has a fancy name: **direct manipulation**. Ben Shneiderman coined the term in 1982. Yes, the structure chart guy. That man worked harder than I do when I graze. -::: - -## Type text - -Click a box. It gets a blue outline, and its text appears in the Object Inspector below the diagram. Whatever you type there shows up in the diagram straight away. - -It is quicker to **double-click** the box, or **double-tap** it on a tablet. Then you type the text right in the structure chart. **Enter** takes it, **Esc** cancels. With the keyboard, select the box and press **Enter**. - -The box from the Elements area is called a **Statement**. At the top of the Object Inspector you choose what sort of statement it should be: - -- **Statement:** calculate or set something, e.g. `int number = 5`. You will learn how in lesson 4. -- **Input:** ask for a value while the chart runs. That comes in lesson 6. -- **Output:** show something. In the diagram it then has `output:` in front, e.g. `output: "Hello"`. - -To start with, you only need Output. Texts that should be shown exactly as they are go in **quotation marks**. - -::: diagramm l2-ausgabe.visustruct -Two outputs one after the other. Open the diagram in the editor and start the [simulation](#zeige-simulation) in the tools to see the output. You will learn more about it in lesson 7. -::: - -## Move, copy, delete - -- **Move:** Drag an existing box to a new place with the mouse. -- **Copy and paste:** Select a box, then press Ctrl+C and Ctrl+V (on a Mac ⌘C and ⌘V). The copy goes after the selected box. Without a keyboard, for example on a tablet, tap **Copy** and **Paste** in the [tools](#zeige-werkzeuge). -- **Delete:** Select a box and press Del, or click the [trash can](#zeige-loeschen) „Delete Selection“ in the tools. -- **Undo:** Ctrl+Z undoes the last step, Ctrl+Shift+Z brings it back (on a Mac ⌘Z and ⌘⇧Z). Without a keyboard, tap [Undo](#zeige-rueckgaengig) in the tools. - -## Exercise: Hello World - -::: übung l2-hallo -titel: Hello World -auftrag: Build a structure chart that outputs **Hello World**. -Drag a **Statement** from the Elements onto the placeholder **ø** and click the box. In the Object Inspector below the structure chart there are three buttons at the top: Statement, Input and Output. Click **Output**. Then type `"Hello World"` in the text field below, with quotation marks. -test: - -> Hello World -braucht: anweisung -tipp: You only need one single box. The text that should appear goes into the text field in the Object Inspector. -tipp: Watch out for the quotation marks. Without them, VisuStruct looks for a variable called Hello. -lösung: l2-hallo-loesung.visustruct -::: - -Click **Check** when you are done. VisuStruct runs your structure chart and compares the output. - -## Exercise: Two lines - -::: übung l2-zwei-zeilen -titel: Two lines -auftrag: First output **Hello** and then **I am learning structure charts**, each on its own line. -test: - -> Hello | I am learning structure charts -tipp: Two lines means two outputs. The boxes sit on top of each other and run from top to bottom. -tipp: Every output is a box of its own. Drag the second Statement onto the bottom half of the first one. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Game: Editor pro - -::: spiel frage -titel: Game: Editor pro -intro: Ludwig tests whether you have the editor under control. Seven rounds. - -runde: -frage: You drag a statement onto the placeholder **ø**. What happens? -- [x] The statement replaces the placeholder. -- The statement goes after the placeholder. -- Nothing, you can't drop anything on ø. -> The placeholder only keeps the place free. The new element takes it. - -runde: -frage: You drag an element onto the **top** half of a box. Where does it end up? -- [x] in front of it -- after it -- It replaces the box. -> Top half means in front, bottom half means after. The blue line shows you while dragging. - -runde: -frage: You drag an element onto the **bottom** half of a box. Where does it end up? -- in front of it -- [x] after it -- at the very end of the structure chart -> Bottom half means: directly after this box. - -runde: -frage: You deleted a box by accident. What brings it back? -- Ctrl+C / ⌘C -- [x] Ctrl+Z / ⌘Z -- Ctrl+V / ⌘V -> Ctrl+Z / ⌘Z undoes the last step. Ctrl+C / ⌘C copies, Ctrl+V / ⌘V pastes. - -runde: -frage: When it runs, exactly **Hello** should appear. What is in the box? -- [x] output: "Hello" -- output: Hello -- "Hello" -> Text that should be shown exactly like that goes in quotation marks. The editor puts `output:` in front when you choose the kind Output. - -runde: -frage: Where do you change the text of the selected box? -- in the Elements -- [x] in the Object Inspector -- in the toolbar at the very top -> The Object Inspector below the diagram shows the text of the selected box. - -runde: -frage: You click an element in the Elements area without dragging. Where does it end up? -- [x] after the selected box -- at the very beginning -- at the very end -> Without dragging (click, or Tab and Enter) the new element goes after the box that is selected right now. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can insert an element from the Elements area and replace a placeholder. → Insert an element -- I can change the text of a box and switch between Statement, Input and Output. → Type text -- I can move, copy and delete boxes and undo steps. → Move, copy, delete -::: - -## Quiz - -::: quiz -? What does the sign ø in a box mean? -→ Insert an element -- [ ] The box contains a mistake. -- [x] There is still an empty placeholder here. -- [ ] The program ends here. -> A placeholder is replaced when you drag an element onto it. - -? You drag a Statement onto the bottom half of a box. Where does it land? -→ Insert an element -- [ ] In front of it -- [x] After it -- [ ] The box is replaced. - -? How do you output the text Good morning exactly as it is? -→ Type text -- [ ] output: Good morning -- [x] output: "Good morning" -- [ ] input: "Good morning" -> Without quotation marks, Good morning is understood as the name of a variable. -::: diff --git a/web/lessons/en/03-speichern-oeffnen-exportieren.md b/web/lessons/en/03-speichern-oeffnen-exportieren.md deleted file mode 100644 index a4710e76..00000000 --- a/web/lessons/en/03-speichern-oeffnen-exportieren.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -titel: Save, open, export -bereich: First steps -kurz: Keep your files safe, use your workspace, open several diagrams and share them as an image or PDF. ---- - -## Skills I will gain now - -::: kompetenzen -- give a diagram a title -- save a diagram as a .visustruct file and open it again -- export a diagram as an image (PNG) or PDF -- open a second diagram in a new tab -- create my workspace `VisuStruct-Files` -- save a program in my workspace -::: - -## The .visustruct file - -Structure charts are saved as **.visustruct** files. All versions of VisuStruct use the same format: in the browser, on Mac, iPad and iPhone, and the Java app on the computer. So you can start in the browser at school and carry on in the app at home. - -::: angeberwissen -When Nassi was a student, there were no files to save. There were punched cards. Nassi says a Saturday night date looked like this: his future wife sat with him in the computer centre and punched his cards. Romance, computer science style! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -This is what a punched card looked like. One card held one line of a program, here `PRINT *, 'HELLO WORLD'` in the Fortran language. Each column is one character, and the holes in it are its code. A whole program was a stack of these cards. If you dropped it, you had to sort everything again. -::: - -::: angeberwissen -A computer pioneer from my home region in Germany: **Konrad Zuse**. On 12 May 1941 he presented the **Z3** in Berlin, the world's first working program-controlled digital computer. It already calculated in the **binary system**, using only 0 and 1, with about 2,000 relays (electric switches). Its program was not on punched cards but punched as holes into used cinema film. Zuse then invented **Plankalkül**, one of the very first programming languages. Later he lived in **Hünfeld** near Fulda until his death in 1995. The Konrad Zuse Museum there shows replicas of the Z3. My tip for a school trip! The town of Hünfeld's website tells you when it is open. -::: - -::: grafik l03-zuse-lochstreifen.svg -Roughly what Zuse's program strip looked like: old cinema film with punched holes. Each column is one instruction with 8 positions. A hole means 1, no hole means 0. The machine read the strip one instruction after another. -::: - -## Save and open - -- **[Save](#zeige-speichern)** (Ctrl+S, on a Mac ⌘S): The diagram is saved as a file. If the **Files** column is set up (see below), it goes there. Otherwise the browser asks where to put it or puts the file in your downloads folder. -- **[Open](#zeige-oeffnen)** (Ctrl+O, on a Mac ⌘O): Load a saved file again. You can also simply drag a file into the browser window. - -> The browser remembers your exercises automatically. But that only works in this browser on this device. So always save important work as a file as well. - -## The Files column - -To the left of the learning area you find the [📁 Files](#zeige-dateien) column. There you keep all your programs in one place, your **workspace**. - -**Your turn:** Set up your workspace right now, before you read on. From today on you save all your programs there. - -1. Create a workspace: open the column and click **Choose folder**. In the window, go to your **Documents**, use **New Folder** to create a folder called `VisuStruct-Files` there and select it. Allow VisuStruct to use the folder. This works in Chrome and Edge. On the iPad and in other browsers, click **Save in the browser** instead. -2. Save as usual. In your workspace, VisuStruct automatically creates a folder with today's date, for example `2026-10-23`, and saves the program in it. The file name comes from the title. - -This is what your workspace looks like then: - -```text -VisuStruct-Files ← workspace -└── 2026-10-23 ← day - └── Factorial.visustruct -``` - -Clicking a program in the column opens it again. That way you quickly find every lesson later. - -Your **learning progress** goes into the workspace too: the file `learnProgress.json` lists the lessons and exercises you have finished. If you open the workspace in another browser, your progress is back. - -> Why a real folder? Your learning progress and your programs are stored in it as files. You can take the folder with you, for example on a USB stick or in your cloud folder such as OneDrive. That way you carry on at home on another computer exactly where you stopped. If you only save in the browser, everything stays in this one browser on this device. If someone deletes the browser data, your learning progress is gone too. - -## Several diagrams in tabs - -Above the structure chart you see the [tabs](#zeige-reiter). With **+** or [New](#zeige-neu) you open another, empty diagram. A dot • in front of the name shows that there are unsaved changes. - -You type the [title](#zeige-titel) of a diagram into the field above the structure chart. It also appears when you export and is suggested as the file name. - -## Share: image, PDF or file - -With [Export](#zeige-exportieren) in the tools (icon with an arrow pointing up) you can share your structure chart: - -- **Image (PNG):** to put into a worksheet or a presentation -- **Vector graphic (SVG):** stays sharp at any size -- **PDF (A4):** one page to hand in or print -- **VisuStruct file (.visustruct):** to pass on to someone who should open and keep editing your structure chart in VisuStruct, for example by email or through the learning platform -- **Print** (Ctrl+P, on a Mac ⌘P): straight to the printer - -Under the [gear](#zeige-textgroesse) at the top right, Text size sets the font size. Larger text also shows when you export an image. - -## Try it out - -Open one of your exercises from lesson 2 and try the following: - -1. Give the diagram a name in the [title](#zeige-titel) field above the structure chart, for example `Hello World`. -2. [Save](#zeige-speichern) it in your workspace. Look in the [📁 Files](#zeige-dateien) column: is it in today's folder? -3. Open a second tab with **+** and click your program in the Files column there. It opens again. -4. [Export](#zeige-exportieren) it as an **image (PNG)** and as a **PDF (A4)**. Open both files and compare them. - -Did everything work? Then you know where your programs are and how to share them. - -## Game: How do you pass it on? - -::: spiel frage -titel: Game: How do you pass it on? -intro: Ludwig wants to pass on his structure chart. Which format fits best? Six rounds. -frage: Which format fits? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: You want to keep working on your structure chart tomorrow. -richtig: .visustruct -> Only the .visustruct file can be opened and edited in VisuStruct again. - -runde: -frage: The structure chart should go into a presentation as a picture. -richtig: PNG -> A PNG image can be put into any presentation and any worksheet. - -runde: -frage: Your teacher wants to print your work as one A4 page. -richtig: PDF -> The PDF is exactly one A4 page to hand in or print. - -runde: -frage: The structure chart goes on a poster and should stay sharp even when huge. -richtig: SVG -> A vector graphic stays sharp at any size. A PNG gets pixelated when you enlarge it. - -runde: -frage: Your friend should change the structure chart in her VisuStruct app on the iPad. -richtig: .visustruct -> All VisuStruct versions open the same .visustruct file: in the browser, on Mac, iPad and iPhone. - -runde: -frage: You want to send a picture into a chat quickly. -richtig: PNG -> Anyone can look at a PNG straight away, without VisuStruct. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can give a diagram a title. → Try it out -- I can save a diagram as a .visustruct file and open it again. → Save and open -- I can export a diagram as an image (PNG) or PDF. → Share: image, PDF or file -- I can open a second diagram in a new tab. → Several diagrams in tabs -- I can create my workspace `VisuStruct-Files`. → The Files column -- I can save a program in my workspace. → The Files column -::: - -## Quiz - -::: quiz -? Which file can you open again in the Mac app and in the Java app? -→ Save and open -- [x] The .visustruct file -- [ ] The exported PNG image -- [ ] The exported PDF -> Images and PDFs are only for looking at. You can only keep editing the .visustruct file. - -? The browser remembers your exercises. Why should you still save? -→ Save and open -- [ ] Because otherwise the exercises are not checked -- [x] Because the browser only keeps the data on this device and it can get lost -- [ ] Because you cannot export without saving - -? Today you save a program in your workspace. Where does it end up? -→ The Files column -- [ ] In the downloads folder -- [x] In the workspace, inside a folder with today's date -- [ ] Directly in the workspace without a subfolder -> VisuStruct automatically creates a date folder for each day. That keeps the programs sorted by lesson. -::: diff --git a/web/lessons/en/04-variablen-und-datentypen.md b/web/lessons/en/04-variablen-und-datentypen.md deleted file mode 100644 index 0b920edb..00000000 --- a/web/lessons/en/04-variablen-und-datentypen.md +++ /dev/null @@ -1,407 +0,0 @@ ---- -titel: Variables and data types -bereich: Basics -kurz: Store values, get to know the data types int, double, String and boolean, and calculate. ---- - -## Skills I will gain now - -::: kompetenzen -- create a variable with a data type, a name and a value -- explain that Java is case-sensitive (`number` is not `Number`) -- tell the data types int, double, String and boolean apart -- explain that = is an assignment and not a comparison -- calculate with + - * / % and use whole-number division -- create and output variables in Java -::: - -## What is a variable? - -A **variable** is like a labelled box. It has a **name**, a **data type** and a **value**. - -``` -int age = 14 -``` - -Here the variable is called `age`, its data type is `int` (whole number), and its value is 14. You can use the value again later through its name. - -::: grafik l04-variable.svg -The variable as a box: the name on the label, the data type as a sticker, the value inside. -::: - -> Variable names start with a **lowercase letter** and contain no spaces. Good names say what is inside: `price` is better than `p`. - -::: angeberwissen -In September 1999 the Mars Climate Orbiter space probe was lost. One team calculated the thrust in American units (pounds), the other expected metric units (newtons). The data only contained the number, not the unit. The probe flew too low into the Martian atmosphere and burned up, a loss of about 125 million dollars. A meaningful name like `impulseInNewtonSeconds` would have said what is inside. By the way, I always label my hay box `hayInKilos`. -::: - -If a name is made of several words, you write them together and start every further word with a capital letter: `priceWithTax`, `numberOfStudents`. This way of writing is called **camelCase**. - -::: angeberwissen -camelCase got its name because the capital letters in the middle stick out of the word like the humps of a camel: `priceWithTax` has two humps. Me, I'm a billy goat with zero humps but two horns. Sadly, nobody has invented GoatCase yet. -::: - -::: grafik l04-camelcase.svg -The capitals W and T stick out like the camel's two humps. -::: - -## Upper and lower case - -Java tells **upper and lower case** apart. The English word for this is **case-sensitive**. For Java, `number`, `Number` and `NUMBER` are three different names, so three different boxes: - -``` -int number = 4 -int Number = 6 -``` - -There are two variables here. If you later write `NUMBER`, Java finds no variable with that name. The program doesn’t run and you get an error message. - -> This also applies to Java words: `String` and `System` start with a capital, `int` and `double` are small. In your own programs, never create two variables that differ only in upper and lower case. It confuses you and everyone who reads your code. - -## Exercise: Three names - -::: übung l04-gross-klein -titel: Three names -auftrag: Ludwig created two variables: `number` with the value 4 and `Number` with the value 6. The structure chart should multiply them and output **Result: 24**. But it doesn’t run. - Click “Open in editor”, then Check, and read the error message. Fix the statement and click Check again. -start: l04-gross-klein-start.visustruct -test: - -> Result: 24 -braucht: anweisung -tipp: How many different names are in the structure chart? `number`, `Number` and `NUMBER` are three different names for the computer. -tipp: `NUMBER` doesn’t exist. For 24 you need 4 times 6, so `number` times `Number`: `int result = number * Number`. `number * number` gives 16. -lösung: l04-gross-klein-loesung.visustruct -::: - -## The four data types - -The data type says what kind of value may be stored in the variable. - -- **int:** whole numbers, e.g. `int count = 3` or `int temperature = -5` -- **double:** decimal numbers, e.g. `double price = 2.5`. You write a **point**, never a comma. -- **String:** text, e.g. `String name = "Mia"`. Text goes in quotation marks. -- **boolean:** truth values, only `true` or `false` - -There are more data types. You will soon need one of them: `char` for a **single character**, e.g. `char grade = 'C'`. A `char` goes in **single** quotation marks. You will get to know it better in lesson 17. - -::: diagramm l05-datentypen.visustruct -Three variables with different data types. Open the diagram and start the [simulation](#zeige-simulation). -::: - -You mostly meet truth values in **conditions**: `age >= 18` is either `true` or `false`. That is what lesson 8 is about. A variable of type `boolean` simply gets `true` or `false`: - -``` -boolean adult = false -``` - -::: angeberwissen -On 4 June 1996 the Ariane 5 rocket exploded just 37 seconds after launch. The cause was a single line: a decimal number for the speed was put into a whole-number variable that was too small for such large values. So the data type is no small matter, it can cost half a billion euros. -::: - -## Assignment with = - -The sign `=` is called an **assignment**. It does not mean “equals” as in maths. It means: work out the right-hand side and store the result in the variable on the left. - -``` -int points = 10 -points = points + 5 -``` - -In maths the second line would be wrong, because no number equals itself plus 5. In programming you read it like this: take the old value 10, add 5 and store 15 in `points`. You only write the data type the first time, when the variable is created. - -::: grafik l04-zuweisung.svg -First the right-hand side is calculated, then the result lands in the variable on the left. -::: - -## Calculating - -You can calculate with numbers: - -- `+` plus, `-` minus, `*` times, `/` divided by -- `%` remainder of a division (called “modulo”), e.g. `17 % 5` is 2 - -You know **division with remainder** from primary school, before you learned about decimals: 17 ÷ 5 = 3 remainder 2. 5 fits into 17 three times, that makes 15. To get to 17, 2 are still missing: that is the remainder. The computer calculates with whole numbers in exactly this way: `/` gives the result without the remainder, `%` gives only the remainder. - -| Primary school | with `/` | with `%` | -|---|---|---| -| 17 ÷ 5 = 3 remainder 2 | `17 / 5` gives 3 | `17 % 5` gives 2 | -| 20 ÷ 5 = 4 remainder 0 | `20 / 5` gives 4 | `20 % 5` gives 0 | -| 3 ÷ 5 = 0 remainder 3 | `3 / 5` gives 0 | `3 % 5` gives 3 | - -If the remainder is 0, the division works out exactly. Later you use this to check whether a number is even: for even numbers, `number % 2` is 0. - -**Multiplication and division come before addition and subtraction**, and brackets are worked out first: `2 * (3 + 4)` is 14. - -### Output text and result together - -A result on its own says little. With `+` you join a text and the value of a variable: - -``` -int age = 14 -output: "Age: " + age -``` - -This shows **Age: 14**. The text in quotation marks appears exactly as written; for `age` the computer puts in the value. The space after the colon belongs to the text, otherwise you get `Age:14`. - -## Exercise: Rectangle - -::: übung l05-rechteck -titel: Work out a rectangle -auftrag: A rectangle is 7 long and 4 wide. Create the variables `length` and `width`. Calculate the area and the perimeter in variables of their own and output both, like this: -`Area: 28` and on the next line `Perimeter: 22`. -test: - -> Area: 28 | Perimeter: 22 -braucht: anweisung -tipp: First think about which variables you need: two for the measurements and two for the results. They are all whole numbers. -tipp: The area is length times width, the perimeter is 2 times (length plus width). For the output you write e.g. `output: "Area: " + area`. The `+` joins the text and the value of the variable together. -lösung: l05-rechteck-loesung.visustruct -::: - -## Whole-number division - -If you divide two whole numbers and store the result in an `int` variable, everything after the decimal point is dropped. It is **not rounded**. - -``` -int x = 7 / 2 gives 3 -int r = 7 % 2 gives 1 (the remainder) -double d = 7.0 / 2 gives 3.5 -``` - -With `/` and `%` together you can convert things nicely, for example minutes into hours and minutes: - -::: diagramm l05-division.visustruct -135 minutes are 2 hours (135 / 60) with 15 minutes left over (135 % 60). -::: - -## Exercise: Convert seconds - -::: übung l05-sekunden -titel: Convert seconds -auftrag: 200 seconds should be output as minutes and seconds. The first and the last statement are already there. Insert statements between them that calculate `minutes` and `remainder`. -start: l05-sekunden-start.visustruct -test: - -> 3 minutes and 20 seconds -braucht: anweisung -tipp: How many whole minutes fit into 200 seconds, and how many seconds are left over? Work it out in your head first. -tipp: A minute has 60 seconds. Use `/` for the whole minutes and `%` for the remainder. Both variables have the type `int`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Exercise: Shopping - -::: übung l05-einkauf -titel: Shopping -auftrag: You buy 3 exercise books at 2.5 euros each. Create `count` as an `int` and `price` as a `double`, calculate the total price in a variable `totalPrice` and output `Total: 7.5 euros`. -test: - -> Total: 7.5 euros -braucht: anweisung -tipp: The count times the price gives the total price. For each variable, think about whether it is a whole number or a decimal number. -tipp: The total price is a decimal number, so `totalPrice` needs the type `double`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Now in Java - -A structure chart is a plan. In **Java** it becomes a program that the computer runs. Your shopping from the exercise looks like this: - -```java editor -int count = 3; -double price = 2.5; -double totalPrice = count * price; -System.out.println("Total: " + totalPrice + " euros"); -``` - -- First the data type, then the name, then the value, just like in the box. -- Every statement ends with a **semicolon** `;`. -- Output in Java is written `System.out.println(…)`. - -How the computer understands your Java code and why it runs the same on Windows, macOS and Linux is explained in the lesson “Structure chart and code”. - -::: angeberwissen -Java was first called **Oak**, after the tree outside James Gosling’s office window. From 1991 his team at Sun Microsystems wanted to program small devices such as TV set-top boxes. But another company already had the name Oak. So in 1995 it became **Java**, like the coffee from the island of Java. -::: - -## Text in Java - -Variables do not only store numbers. For text there is the data type `String`: - -```java editor -String name = "Mia"; -int age = 14; -double height = 1.62; -System.out.println(name + " is " + age + " years old."); -System.out.println("Height: " + height + " m"); -``` - -- Text goes in quotation marks. -- You write `String` with a capital letter, `int`, `double` and `boolean` in lowercase. Java tells them apart. -- With `+` you join text and numbers together. - -You type Java in the [Code](#zeige-codelive) area. The structure chart builds itself as you type. “Open in editor” brings the example into the Code area. Click “Run” there, then change the name, age or height and try again. - -::: übung l04-java-steckbrief -titel: Profile in Java -bereich: beide -code: java -auftrag: Write a profile of Ludwig the billy goat. Create three variables: the name **Ludwig**, the age **7** and the height **1.2**. Then output these two lines: - **Ludwig is 7 years old.** and **Height: 1.2 m** - “Open in editor” also opens the Code area on the right. Type your code there; the structure chart builds itself. Then click Check. -test: - -> Ludwig is 7 years old. | Height: 1.2 m -braucht: anweisung -tipp: You need a `String`, an `int` and a `double`. Every line ends with a semicolon. -tipp: `String name = "Ludwig";`, `int age = 7;` and `double height = 1.2;`. You join the output with `+`: `System.out.println(name + " is " + age + " years old.");` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Fill in the gaps: data types - -::: lückentext -titel: Profile in Java -auftrag: Fill in the missing words. On the outside is the frame that every Java program in its own file needs. The variables go inside it. -```java -[[public]] class Profile { - public static [[void]] main(String[] args) { - [[int]] age = 14; - [[double]] height = 1.62; - [[String]] name = "Mia"; - [[boolean]] hasPet = true; - System.out.[[println]](name + " is " + age + " years old."); - } -} -``` -erklärung: Whole numbers are `int`, decimal numbers `double`, texts `String` (with a capital S) and truth values `boolean`. `public class` and `public static void main` make up the frame. In the Code area you may leave it out, more on this in the lesson “Structure chart and code”. -::: - -## Find the bug: seconds - -::: übung l04-java-fehler -titel: Fix the seconds -code: java -auftrag: The program should convert 200 seconds into minutes and seconds and output **3 min 20 s**. But it outputs **20 min 3 s**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: `/` divides without a remainder, `%` gives the remainder. Which one do you need for the minutes, which one for the seconds left over? -tipp: The two operators are swapped: `int minutes = seconds / 60;` and `int rest = seconds % 60;` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l04-java-laeuft-nicht -titel: Fix the profile -code: java -auftrag: The program should output **Ludwig is 7 years old.** But it doesn’t run, because two words are spelled wrong. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig is 7 years old. -braucht: anweisung -tipp: Java is case-sensitive. Compare every word in the output carefully with what was created above. -tipp: `System` is written with a capital S. The variable is called `age` with a small a: `System.out.println(name + " is " + age + " years old.");` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which data type? - -::: spiel frage -titel: Game: Which data type? -intro: Ludwig has collected values. Which data type fits each value? Eight rounds. -antworten: int | double | String | boolean - -runde: -frage: Which data type fits `17`? -richtig: int -> A whole number without a decimal point is an `int`. - -runde: -frage: Which data type fits `3.5`? -richtig: double -> Numbers with a decimal point are `double`. - -runde: -frage: Which data type fits `"Hello"`? -richtig: String -> Text in quotation marks is a `String`. - -runde: -frage: Which data type fits `true`? -richtig: boolean -> `true` and `false` are the two truth values, data type `boolean`. - -runde: -frage: Which data type fits `"17"`? -richtig: String -> Careful, quotation marks! Here 17 is a text you can't calculate with. - -runde: -frage: Which data type fits `-4`? -richtig: int -> Negative whole numbers are `int` as well. - -runde: -frage: Which data type fits `0.0`? -richtig: double -> The point makes it a decimal number, even if there is only a 0 behind it. - -runde: -frage: Which data type fits `"false"`? -richtig: String -> In quotation marks, false is just a text too. The truth value has no quotation marks. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a variable with a data type, a name and a value. → What is a variable? -- I can explain that Java is case-sensitive (`number` is not `Number`). → Upper and lower case -- I can tell the data types int, double, String and boolean apart. → The four data types -- I can explain that = is an assignment and not a comparison. → Assignment with = -- I can calculate with + - * / % and use whole-number division. → Calculating -- I can create and output variables in Java. → Now in Java -::: - -## Quiz - -::: quiz -? Which data type fits the value 3.75? -→ The four data types -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Decimal numbers have the type double. In VisuStruct you write them with a point. - -? How many variables do `int number = 1`, `int Number = 2` and `int NUMBER = 3` create? -→ Upper and lower case -- [ ] one -- [ ] two -- [x] three -> Java is case-sensitive. The three names are different, so there are three variables. - -? What value does x have after `int x = 17 / 5`? -→ Calculating -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> With whole numbers, everything after the decimal point is dropped. It is not rounded. - -? What does `17 % 5` give? -→ Calculating -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 divided by 5 is 3, remainder 2. The operator % gives the remainder. - -? At the start, `int points = 10`. What is in points after `points = points * 2`? -→ Assignment with = -- [ ] 10 -- [ ] 12 -- [x] 20 -> The right-hand side is calculated with the old value 10, and the result 20 is stored in points. - -? Which line correctly creates a decimal number in Java? -→ Now in Java -- [ ] double price = 2,5; -- [x] double price = 2.5; -- [ ] Double price = 2.5 -> Decimal numbers use a point, and the line ends with a semicolon. -::: diff --git a/web/lessons/en/05-sequenz.md b/web/lessons/en/05-sequenz.md deleted file mode 100644 index fa7f9d02..00000000 --- a/web/lessons/en/05-sequenz.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -titel: Sequence -bereich: Basics -kurz: Run steps one after another, watch the order and swap values. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that a sequence runs from top to bottom -- explain why the order of the steps matters -- swap two values with a temporary variable -- write a sequence in Java -::: - -## Step by step - -A **sequence** is a series of steps that run exactly once and in exactly this order. In the structure chart the boxes simply sit on top of each other. - -Each box only starts when the box above it is finished. Nothing is skipped and nothing is repeated. - -::: diagramm l05-sequenz.visustruct -A sequence of four boxes: first `length` and `width` get their values, then the area is calculated, and finally it is output. Each box runs exactly once, from top to bottom. Output: 15. -::: - -> The sequence is the simplest of the three basic building blocks. Almost every structure chart is mostly made of sequences. - -## Order matters - -When you make tea, you notice straight away if the order is wrong. With calculations it is just the same, only it is harder to spot. - -::: diagramm l04-rechnen.visustruct -First double, then add 1: the result is 7. If you swap the two middle boxes, you get 8. -::: - -The statement `number = number * 2` means: take the value of `number`, multiply it by 2 and store the result in `number` again. So what is in `number` depends on what happened before. - -::: angeberwissen -Structure charts are not just school stuff. According to Shneiderman, companies like IBM and Siemens planned their programs with them too. So you are learning pro stuff here. Baaa-mazing! -::: - -## Exercise: Put in order - -::: übung l04-reihenfolge -titel: Put in order -auftrag: The start diagram has the right boxes, but in the wrong order. Move them so that **20** is output at the end. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Read each box and ask yourself: which variable does it need, and where does that variable get its value? -tipp: A variable has to be created before you calculate with it. The output comes right at the end. Check in your head: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Swap two values - -Imagine two glasses: one with juice, one with water. If you want to swap what is in them, you need a third, empty glass. - -It is exactly the same with variables. If you simply write `a = b` and then `b = a`, the old value of `a` is already lost. In the end both variables have the same value. - -The solution is a **temporary variable** that keeps the old value for a short time: - -::: grafik l05-tauschen.svg -Three steps with an empty glass: first the juice into temp, then the water to the left, then the juice from temp to the right. -::: - -::: diagramm l04-tauschen.visustruct -First a is kept in temp. Then a gets the value of b, and b gets the kept value from temp. -::: - -## Exercise: Swap glasses - -::: übung l04-glaeser-tauschen -titel: Swap glasses -auftrag: The left glass holds juice, the right one water. Swap the contents of the variables `left` and `right` before they are output. -Do not change the first two boxes. Insert new statements between them instead. -start: l04-tauschen-start.visustruct -test: - -> Left: water | Right: juice -braucht: anweisung -tipp: How do you swap two full glasses in real life? You need a third, empty glass. -tipp: Create a temporary variable with `String temp = left`. After that you need two more assignments. -lösung: l04-tauschen-loesung.visustruct -::: - -## Now in Java - -As in lesson 4, you can also write a sequence directly in Java. The swap from above looks like this: - -```java editor -int a = 5; -int b = 9; -int temp = a; -a = b; -b = temp; -System.out.println("a = " + a); -System.out.println("b = " + b); -``` - -- Every box becomes one line. The lines run from top to bottom, just like the boxes. -- Every statement ends with a **semicolon** `;`. -- An output is called `System.out.println(…)` in Java. Mind the capital S in `System`: Java tells upper and lower case apart. - -You type Java in the [Code](#zeige-codelive) area to the right of the structure chart. While you type, VisuStruct builds the structure chart along with it. So you see straight away which box belongs to which line. - -::: übung l05-java-kino -titel: Cinema tickets in Java -bereich: beide -code: java -auftrag: A cinema ticket costs 9 euros. Write a Java program that calculates the price of 3 tickets and outputs **Total: 27**. - “Open in editor” also opens the Code area on the right. Type your code there; the structure chart builds itself. Then click Check. -test: - -> Total: 27 -braucht: anweisung -tipp: You need three variables: the price, the number of tickets and the result. Every line ends with a semicolon. -tipp: `int price = 9;` and `int count = 3;` create the variables. `int total = price * count;` calculates, and `System.out.println("Total: " + total);` outputs the result. -lösung: l05-java-kino-loesung.visustruct -::: - -## Fill in the gaps: swapping glasses - -::: lückentext -titel: Swap two values -auftrag: The values of `a` and `b` should be swapped. Fill in the missing words. -```java -int a = 3; -int b = 8; -[[int]] temp = [[a]]; -a = [[b]]; -b = [[temp]]; -System.out.println("a = " + a + ", b = " + b); -``` -erklärung: First you save `a` in the helper variable, then `a` gets the value of `b`, and finally `b` gets the saved value. Output: **a = 8, b = 3** -::: - -## Find the bug: credit - -::: übung l05-java-fehler -titel: Fix the credit -code: java -auftrag: The canteen card holds 20 euros. A meal costs 7 euros. The program should output the credit **after** paying, so **Left: 13**. But it outputs **Left: 20**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l05-java-fehler-start.visustruct -test: - -> Left: 13 -braucht: anweisung -tipp: All lines are right, only their order is not. When is the credit output, and when is the meal paid? -tipp: Swap the last two lines: first `credit = credit - price;`, then the output. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l05-java-laeuft-nicht -titel: Share a pizza -code: java -auftrag: A pizza has 8 slices and 4 friends share it. The program should output **Everyone gets 2 slices.** But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Everyone gets 2 slices. -braucht: anweisung -tipp: Compare the name in the output letter by letter with the name created in the third line. -tipp: The variable is called `perPerson` with a capital P (camelCase). Write it exactly like that in the output. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Sort the boxes - -::: spiel reihenfolge -titel: Game: Sort the boxes -intro: Ludwig has mixed up the boxes. Put them in the right order. Four rounds. - -runde: -frage: At the end, **7** should be output. -- `int number = 3` -- `number = number * 2` -- `number = number + 1` -- `output: number` -> First double, then add 1: 3 · 2 + 1 = 7. The other way round you'd get (3 + 1) · 2 = 8. - -runde: -frage: At the end, **8** should be output. -- `int number = 3` -- `number = number + 1` -- `number = number * 2` -- `output: number` -> The same boxes, a different order, a different result: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a and b should swap their values. -- `int temp = a` -- `a = b` -- `b = temp` -- `output: a + " " + b` -> First a is saved in temp. Otherwise the old value is gone as soon as a gets the value of b. - -runde: -frage: Ludwig makes tea. -- Fill the kettle with water -- Switch the kettle on -- Wait until the water boils -- Pour the water over the tea bag -- Let the tea brew -> Every step needs the one before. Just like in a structure chart. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that a sequence runs from top to bottom. → Step by step -- I can explain why the order of the steps matters. → Order matters -- I can swap two values with a temporary variable. → Swap two values -- I can write a sequence in Java. → Now in Java -::: - -## Quiz - -::: quiz -? How often does each box of a sequence run? -→ Step by step -- [ ] Until a condition is false -- [x] Exactly once -- [ ] Not at all if it is empty -> In a sequence nothing is repeated and nothing is skipped. Loops are there for repetition. - -? At the start a = 5 and b = 9. Then `a = b` runs and after that `b = a`. What is in the variables at the end? -→ Swap two values -- [ ] a = 9 and b = 5 -- [x] a = 9 and b = 9 -- [ ] a = 5 and b = 5 -> After `a = b` the old value 5 is lost. `b = a` then only copies the 9 back. - -? Why do you need a temporary variable when swapping? -→ Swap two values -- [x] So that a value is not overwritten before it is needed -- [ ] So that the structure chart gets longer -- [ ] Because otherwise you cannot output variables - -? What does the sequence `int x = 4`, `x = x + 1`, `x = x * 3`, `output: x` output? -→ Order matters -- [ ] 13 -- [x] 15 -- [ ] 4 -> First x becomes 5, then 15. - -? What does every statement end with in Java? -→ Now in Java -- [ ] With a full stop . -- [x] With a semicolon ; -- [ ] With a colon : -> If the semicolon is missing, VisuStruct shows a hint below the code. -::: diff --git a/web/lessons/en/06-eingabe-und-ausgabe.md b/web/lessons/en/06-eingabe-und-ausgabe.md deleted file mode 100644 index 50056621..00000000 --- a/web/lessons/en/06-eingabe-und-ausgabe.md +++ /dev/null @@ -1,432 +0,0 @@ ---- -titel: Input and output -bereich: Basics -kurz: Ask for values, show results and use the IPO model. ---- - -## Skills I will gain now - -::: kompetenzen -- explain the IPO model -- write an input with a data type, a name and a question -- join text and variables in an output with + -- work out a result first and store it in a variable, then output that variable, e.g. `int sum = a + b`, then `output: sum` -- pick out input, process and output from a task -- read numbers in Java with the scanner -- write comments with `//` and `/* */` and use them to structure and explain my code -::: - -## The IPO model - -Many programs work in three parts: - -1. **Input:** The program asks for values, e.g. two numbers. -2. **Process:** It calculates with the values. -3. **Output:** It shows the result. - -The first letters give **IPO**. So far the values were fixed in the structure chart. With an input, a different value can be used every time the chart runs. - -::: diagramm l06-eva.visustruct -Input at the top, process in the middle, output at the bottom. Start the simulation and try different numbers. -::: - -## Input with input: - -An input asks for a value while the chart runs and stores it in a variable. You write the **data type**, the **name** and a **question** in quotation marks: - -``` -input: int age "How old are you?" -input: double price "Price in euros?" -input: String name "What is your name?" -``` - -In the editor you choose the kind **Input** at the top of a Statement. The word `input:` is then already in front, and you only type `int age "How old are you?"`. - -> The data type decides what may be typed in. With `int`, the simulation reports an error if someone types 2.5 or Hello. - -## Output with output: - -An output shows text and values. Text goes in quotation marks, variables do not. With `+` you **join** the parts together: - -``` -output: "Hello " + name + "!" -output: "You are " + age + " years old." -``` - -Watch out for the spaces inside the quotation marks. Without them everything sticks together, and you see `HelloMia!` instead of `Hello Mia!`. - -## Exercise: Greeting - -::: übung l06-begruessung -titel: Greeting -auftrag: Ask for a name and greet the person. When Ada is typed in, **Hello Ada!** should be output. -test: Ada -> Hello Ada! -test: Ben -> Hello Ben! -braucht: anweisung -tipp: First comes an input for the name, then an output that uses the name. -tipp: The name is text, so the input needs the type `String`. In the output you join `"Hello "`, the variable and `"!"` with `+`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Careful with + in an output - -In an output, `+` **always** joins the parts together, even with numbers. If `a` is 3 and `b` is 4, then - -``` -output: a + b -``` - -does not show 7 but **34**. So calculate in a variable first and then output the variable: - -``` -int sum = a + b -output: "Sum: " + sum -``` - -That also fits the IPO model: you calculate in the process part, not in the output. - -## From the task to the structure chart - -Before you drag the first box, read the task carefully and take it apart. This is called **problem analysis**. Three questions help you: - -1. **What is given?** These values become the **input**. Also think about the data type. -2. **What are you looking for?** That becomes the **output**. -3. **How do you get from what is given to what you are looking for?** That is the **process**, often a formula. - -An example: *A cinema ticket costs 9 euros. The program asks how many tickets someone buys and shows the total price.* - -- Given: the number of tickets → `input: int count "How many tickets?"` -- Looking for: the total price → `output: "Total price: " + total` -- Way: count times 9 → `int total = count * 9` - -Now you only have to put the three parts on top of each other in the order I, P, O. - -> Look out for signal words in the task: *asks*, *reads in* or *enters* point to an input. *Shows*, *outputs* or *reports* point to an output. - -## Exercise: Calculator - -::: übung l06-rechner -titel: Sum and product -auftrag: Ask for two whole numbers. Then output their sum and their product, each on its own line. -With 3 and 4 it looks like this: `Sum: 7` and `Product: 12`. -test: 3, 4 -> Sum: 7 | Product: 12 -test: 10, -2 -> Sum: 8 | Product: -20 -test: 0, 5 -> Sum: 5 | Product: 0 -braucht: anweisung -tipp: Plan the order: first read in both numbers, then calculate, then output. -tipp: You need two inputs, two statements for calculating and two outputs. Calculate the sum in a variable of its own, otherwise `+` joins the numbers together. -lösung: l06-rechner-loesung.visustruct -::: - -## Exercise: Mean - -::: übung l06-mittelwert -titel: Mean -auftrag: Ask for two numbers, which may also be decimal numbers. Output their mean, so for 2 and 3 that is `Mean: 2.5`. -test: 2, 3 -> Mean: 2.5 -test: 4, 6 -> Mean: 5.0 -test: 1.5, 2 -> Mean: 1.75 -braucht: anweisung -tipp: You get the mean of two numbers by adding them and halving the result. -tipp: For decimal numbers you use the type `double`. The mean is the sum divided by 2. Remember the brackets: `(x + y) / 2`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Now in Java - -This is the IPO example from the start in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("First number?"); -int a = scanner.nextInt(); -System.out.println("Second number?"); -int b = scanner.nextInt(); -int sum = a + b; -System.out.println("Sum: " + sum); -``` - -- For input, Java needs a **Scanner**. You write the first two lines once at the very top, then you can read as often as you like. -- `scanner.nextInt()` reads a whole number, `scanner.nextDouble()` a decimal number and `scanner.next()` a word. -- The question to the user is a normal output right before it. VisuStruct turns both lines together into one input box. - -::: angeberwissen -Java was originally meant to control small devices, and it still does: many SIM cards in phones and many bank cards run a mini version called **Java Card**. Quite possibly you have Java in your pocket right now. -::: - -::: übung l06-java-tage -titel: Age in days -code: java -auftrag: Write a Java program that asks for the age in years and outputs roughly how many days that is. Use 365 days per year. For 2 years it shows **That is about 730 days.** -test: 2 -> That is about 730 days. -test: 10 -> That is about 3650 days. -test: 1 -> That is about 365 days. -braucht: anweisung -tipp: First the two scanner lines, then the question and the input, then the calculation, then the output. -tipp: `int years = scanner.nextInt();` reads. `int days = years * 365;` calculates, and `System.out.println("That is about " + days + " days.");` outputs. -lösung: l06-java-tage-loesung.visustruct -::: - -## Comments in code - -You may write notes in your code. They are called **comments**. Java skips them when it runs, so the program and the structure chart stay the same. There are two kinds: - -- `//` turns the rest of the line into a comment. This is a **single-line comment**. -- `/*` starts a **multi-line comment** and `*/` ends it. Everything in between belongs to the comment, however many lines. Java does not need the stars at the start of the lines in between, they just look tidy. - -In finished programs you sometimes also see `/** … */` with two stars at the start. That is a **Javadoc comment**, from which Java can create a description of the program. For you, `//` and `/* */` are enough. - -This is the IPO example with comments: - -```java editor -/* - * Task: The program asks for two numbers - * and outputs their sum. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Input -System.out.println("First number?"); -int a = scanner.nextInt(); -System.out.println("Second number?"); -int b = scanner.nextInt(); - -// Process -int sum = a + b; // add the two numbers - -// Output -System.out.println("Sum: " + sum); // for 3 and 4 I expect: Sum: 7 - -// Next time: allow decimal numbers too -``` - -What comments are good for: - -- **The task:** the multi-line comment at the top says what the program should do. -- **Structure:** `// Input`, `// Process` and `// Output` divide the code by the IPO model. -- **Explanation:** a comment after a line says what your algorithm does there. -- **Expectation:** write down which output you expect. When you test, you compare. -- **Matching brackets:** later you will meet blocks in curly brackets `{ }`. Then, for example, `} // end for` shows which bracket closes what. -- **Keeping your thoughts:** what do you need to remember when you carry on next time? - -Click **Open in editor**, change a comment or add a new one. The structure chart stays the same, and VisuStruct keeps your comments. - -> Don't put a comment after every line. Explain what your algorithm does and why, not every single character. - -::: angeberwissen -Both kinds are much older than Java: `/* … */` comes from the language PL/I from 1964, `//` from BCPL from 1967. Java inherited them via C and C++. -::: - -## Fill in the gaps: comments - -::: lückentext -titel: Add the comments -auftrag: Add the characters so that a multi-line comment with the task is at the top and the other two notes are single-line comments. -```java -[[/*]] - * Task: The program converts euros to cents. - [[*/]] -int euros = 3; -[[//]] Process -int cents = euros * 100; -[[//]] Output, expected: 300 -System.out.println(cents); -``` -erklärung: `/*` opens the multi-line comment and `*/` closes it. `//` only lasts until the end of the line, so every note needs its own `//`. -::: - -## Fill in the gaps: input - -::: lückentext -titel: Read a name and an age -auftrag: Fill in the missing words so that the program reads a name and an age. -```java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("What is your name?"); -[[String]] name = scanner.[[next]](); -System.out.println("How old are you?"); -int age = scanner.[[nextInt]](); -System.out.println("Hello " + name + ", next year you will be " + [[(age + 1)]] + "."); -``` -erklärung: `scanner.next()` reads a word, `scanner.nextInt()` a whole number. The brackets around `age + 1` matter: without them Java first appends `age` and then `1` to the text, and 14 would become **141**. -::: - -## Find the bug: sum - -::: übung l06-java-fehler -titel: Fix the sum -code: java -auftrag: The program reads two numbers and should output their sum. For 3 and 4, however, it shows **Sum: 34** instead of **Sum: 7**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Sum: 7 -test: 10, 5 -> Sum: 15 -test: 0, 9 -> Sum: 9 -braucht: anweisung -tipp: Read the output from left to right: what is `"Sum: " + a`? And what happens when `+ b` comes after it? -tipp: Add brackets so that Java calculates first: `System.out.println("Sum: " + (a + b));` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l06-java-laeuft-nicht -titel: Age next year -code: java -auftrag: The program asks for your age and should say how old you will be next year. For 14 that is **Next year you will be 15**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> Next year you will be 15 -test: 9 -> Next year you will be 10 -braucht: anweisung -tipp: The input ends up in a variable. What exactly is it called, and what is it called in the output? -tipp: The variable is called `age` with a small a: `System.out.println("Next year you will be " + (age + 1));` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Game: What is output? - -::: spiel frage -titel: Game: What is output? -intro: Ludwig has built inputs and outputs. Predict what happens. Seven rounds. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: What is output? -- 7 -- [x] 34 -- a + b -> In an output, `+` always joins the parts together, even numbers. - -runde: - int a = 3 - int b = 4 - int sum = a + b - output: "Sum: " + sum -frage: What is output? -- [x] Sum: 7 -- Sum: 34 -- Sum: sum -> The calculating happens before, in a variable. The output only joins text and result. - -runde: - input: String name "What is your name?" - output: "Hello" + name + "!" -frage: You type Mia. What is output? -- Hello Mia! -- [x] HelloMia! -- Hello name! -> The text `"Hello"` has no space at the end. That's why everything sticks together. - -runde: - input: int age "How old are you?" -frage: You type 2.5. What happens? -- age is 2. -- age is 2.5. -- [x] The simulation reports an error. -> The data type `int` only allows whole numbers. - -runde: - input: double price "Price in euros?" -frage: Which part of IPO does this box belong to? -- [x] Input -- Process -- Output -> `input:` asks for a value. That is the input. - -runde: - double mean = (a + b) / 2.0 -frage: Which part of IPO does this box belong to? -- Input -- [x] Process -- Output -> Here something is calculated. That is the process. - -runde: - output: "Mean: " + mean -frage: Which part of IPO does this box belong to? -- Input -- Process -- [x] Output -> `output:` shows the result. That is the output. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain the IPO model. → The IPO model -- I can write an input with a data type, a name and a question. → Input with input: -- I can join text and variables in an output with +. → Careful with + in an output -- I can work out a result first and store it in a variable, then output that variable, e.g. `int sum = a + b`, then `output: sum`. → Careful with + in an output -- I can pick out input, process and output from a task. → From the task to the structure chart -- I can read numbers in Java with the scanner. → Now in Java -- I can write comments with `//` and `/* */` and use them to structure and explain my code. → Comments in code -::: - -## Quiz - -::: quiz -? What does IPO stand for? -→ The IPO model -- [x] Input, process, output -- [ ] Input, program, order -- [ ] Insert, paste, open -> Many programs first ask for values, process them and then show the result. - -? The variables a and b have the values 3 and 4. What does `output: a + b` show? -→ Careful with + in an output -- [ ] 7 -- [x] 34 -- [ ] a + b -> In an output, + joins the parts together. Calculate the sum in a variable first. - -? Which input fits if a price such as 4.99 should be typed in? -→ Input with input: -- [ ] input: int price "Price?" -- [x] input: double price "Price?" -- [ ] input: String "Price?" -> 4.99 is a decimal number, so double. Also, every input needs a variable name. - -? What does `output: "Age: " + age` show if age has the value 12? -→ Careful with + in an output -- [x] Age: 12 -- [ ] "Age: " + 12 -- [ ] Age: age - -? Task: *The program asks for the radius of a circle and shows its circumference.* Match each part of the text to where it belongs in the IPO model. -→ From the task to the structure chart -= asks for the radius -> Input -= circumference = 2 * 3.14 * radius -> Process -= shows its circumference -> Output -> The radius is given, the circumference is what you are looking for. The formula connects the two. - -? What does `scanner.nextInt()` read? -→ Now in Java -- [x] A whole number -- [ ] A decimal number -- [ ] A whole sentence -> For decimal numbers there is `scanner.nextDouble()`, for a word `scanner.next()`. - -? What does Java do with a comment? -→ Comments in code -- [ ] It outputs it as text. -- [x] It skips it. -- [ ] It reports an error. -> Comments are notes for people. The program runs exactly the same with or without them. - -? Where does a comment that starts with `/*` end? -→ Comments in code -- [x] At `*/` -- [ ] At the end of the line -- [ ] At the next empty line -> That is why a comment with `/*` can span several lines. A comment with `//`, on the other hand, ends at the end of the line. -::: diff --git a/web/lessons/en/07-simulation-und-schreibtischtest.md b/web/lessons/en/07-simulation-und-schreibtischtest.md deleted file mode 100644 index 6ef19a48..00000000 --- a/web/lessons/en/07-simulation-und-schreibtischtest.md +++ /dev/null @@ -1,364 +0,0 @@ ---- -titel: Simulation and desk check -bereich: Basics -kurz: Run a structure chart step by step, work it out by hand and find mistakes. ---- - -## Skills I will gain now - -::: kompetenzen -- start the simulation, pause it, run single steps and stop it -- read the variables, the output and the last step during the simulation -- do a desk check by hand as a table -- tell syntax errors, runtime errors and logic errors apart -- find a mistake by comparing the values with what I expect -- follow Java code with Step and breakpoints -::: - -## Start the simulation - -Before branches and loops come along, you get to know your most important tool. From now on you can use the simulation to check every exercise yourself. - -With the [▶︎ Start simulation](#zeige-simulation) button on the right of the tools, VisuStruct runs your structure chart. While the simulation is running, you cannot edit the diagram. The same button is then called **■ End simulation**; it takes you back to editing. - -On the right, the **Controls** appear: - -- **Play** runs the diagram automatically, step by step. You set how long it waits between two steps under **Pause per step**. -- **Pause** stops for a moment. Then you carry on with Play or Step. -- **Step** runs exactly one step. That way you can watch calmly. -- **Stop** cancels and resets everything to the start. - -Open the following diagram in the editor and go through it with **Step**: - -::: diagramm sim-tausch.visustruct -The values of a and b are swapped. The variable temp keeps one value meanwhile. -::: - -## What the simulation shows - -- **Highlight:** One box in the diagram is coloured. With **Last step** it is the box that has just run. With **Next step** it is the box that comes next. -- **Input:** If the diagram asks for a value, you type it in here and confirm with **OK**. -- **Last Step:** Here you see what has just happened, e.g. `a = 5 -> 5` after the box `a = b`. On the left, the variables have already been replaced by their values; to the right of the arrow is the result. -- **Variables:** All variables with their current values. -- **Output:** Everything that was output with `output:`. - -If the [Code](#zeige-codelive) area is open on the right, the [console](#zeige-konsole) runs along there as well. It is cleared at the start and then shows output and input just as they would appear in the real program. - -At the end, **Simulation finished.** appears. If something goes wrong, the simulation stops on the faulty box and shows a message, e.g. **Unknown variable: total**. - -## The desk check - -In a **desk check** you play the computer yourself. You go through the structure chart with pen and paper and write down the values of the variables after every step. It is best to make a table: one column for the step, one for each variable and one for the output. - -::: grafik l07-schreibtischtest-en.svg -A sheet of paper and a pen are all you need: after each step you write the new values in a new row. -::: - -For the diagram above, the table looks like this: - -| Step | a | b | temp | Output | -|---|---|---|---|---| -| `int a = 3` | 3 | – | – | | -| `int b = 5` | 3 | 5 | – | | -| `int temp = a` | 3 | 5 | 3 | | -| `a = b` | 5 | 5 | 3 | | -| `b = temp` | 5 | 3 | 3 | | -| `output: "a = " + a` | 5 | 3 | 3 | a = 5 | -| `output: "b = " + b` | 5 | 3 | 3 | b = 3 | - -Then compare your table with the simulation. Do the values under **Variables** match your row after every step? - -> A desk check is especially useful in tests. There you have no computer, but you can still show what your structure chart does. - -::: angeberwissen -“Computer” used to be a job: people who did calculations with pencil, paper and a calculating machine. One of the best was the mathematician Katherine Johnson at NASA. She calculated flight paths for space capsules, and later also for the Apollo 11 flight to the Moon. - -In 1962 John Glenn was to become the first American to orbit the Earth. A new IBM computer had calculated the flight path. Glenn did not fully trust the machine and said: “Get the girl to check the numbers. If she says they’re good, I’m ready to go.” Katherine Johnson checked everything by hand, a real desk check. Her numbers were right, and Glenn flew. - -Katherine Johnson was Black, and at that time laws in the US state of Virginia separated Black and white people. In the film “Hidden Figures” (2016) she has to run across the whole site every time she needs the toilet. The film exaggerates this: separate toilets really existed, but Katherine Johnson said she simply ignored the sign. - -Her colleague Dorothy Vaughan saw early on that the IBM computers would take over the calculating work. She taught herself and her whole team the programming language FORTRAN. That is how human computers became programmers. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), mathematician at NASA (photo: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), public domain). -::: - -## Three kinds of errors - -Errors are part of programming, even for professionals. There are three kinds, and you find each of them in a different way: - -- **Syntax error**: The text breaks the rules of the language, e.g. a `;` is missing at the end. The program does not start at all. -- **Runtime error**: The program starts but stops at one point, e.g. when it divides by 0. -- **Logic error**: The program runs to the end, but the result is wrong, e.g. because brackets are missing: `a + b / 2` instead of `(a + b) / 2`. - -This is how VisuStruct shows you the errors: - -- **Syntax error:** They happen less often in a structure chart, because the boxes give you the shape. In the [Code](#zeige-codelive) area the spot is underlined in red, the line number turns red, and you read e.g. **Line 2: Still missing here: ;**. -- **Runtime error:** The simulation stops on the box and reports e.g. **Division by zero.** In the Code area the line number turns red, and the [console](#zeige-konsole) names the line: **Line 3: Division by zero.** -- **Logic error:** Nobody reports anything here. The computer does not know what you actually wanted. Only you know the right result, so the desk check helps here. - -> A red line number shows an error. The round red dot in front of the line number is something else: a breakpoint. You will meet it below in “Now in Java”. - -## Find mistakes - -If a structure chart outputs something wrong, that is a logic error. Then do this: - -1. **Write down what you expect:** What should come out for a particular input? -2. **Run it step by step:** Start the simulation with **Step** and watch the variables. -3. **Find the spot:** Where does a value first differ from what you expected? That is exactly where the mistake is. - -Common mistakes in a sequence are: - -- The **order** is wrong: a variable is used before it has a value. -- A value is **overwritten** before it is needed. -- **Brackets** are missing: `a + b / 2` is not the same as `(a + b) / 2`. -- Two whole numbers are divided: `7 / 2` gives `3`, because with `int` everything after the decimal point is dropped. - -> Later, branches and loops come along. Then the simulation also shows you which path is taken and how often a loop runs. - -::: angeberwissen -On 9 September 1947 Grace Hopper’s team found a real moth stuck between two contacts in the Harvard Mark II computer. They taped it into the logbook and wrote: “First actual case of bug being found.” Today the moth is in a museum in Washington. - -Grace Hopper was one of the first programmers in the world. In 1952 she built one of the first **compilers**: a program that translates code into machine code. She believed people should be able to give computers instructions in almost normal English. This led to the programming language COBOL, which many banks still use today. She even became an admiral in the US Navy. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), computer scientist and admiral (photo: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), public domain). -::: - -## Exercise: Fix the swap - -::: übung sim-tausch -titel: Fix the swap -auftrag: The structure chart should read in two numbers and output them swapped. So with 3 and 5, first **5** and then **3** should appear. But it outputs 5 twice. - Do a desk check or use **Step** and fix the mistake. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Go through the diagram with **Step** and write down the values of a and b after every step. Where does the 3 disappear? -tipp: Look at a after the step `a = b`. Where did the old value of a go? Keep it in a temporary variable first, as in the example above. -lösung: sim-tausch-loesung.visustruct -::: - -## Exercise: Fix the cinema tickets - -::: übung sim-kino -titel: Fix the cinema tickets -auftrag: A cinema ticket costs 8.50 euros. The structure chart should ask for the number of tickets and output the total price, so for 2 tickets `Total: 17.0`. - Start the simulation. It stops with an error message. Find out why and fix the structure chart. -start: sim-kino-start.visustruct -test: 2 -> Total: 17.0 -test: 3 -> Total: 25.5 -test: 0 -> Total: 0.0 -braucht: anweisung -tipp: Read the error message of the simulation carefully. Which variable does it not know yet? -tipp: The simulation runs the boxes from top to bottom. Does total already have a value when the output comes? You can move boxes with the mouse. -lösung: sim-kino-loesung.visustruct -::: - -> If a simulation keeps running forever, click **Stop**. When you **Check** an exercise, VisuStruct stops by itself after a very large number of steps. - -## Now in Java - -You can run Java code step by step too. In the [Code](#zeige-codelive) area the tool for this is called the **debugger**: - -- Click a line number on the left. A red dot appears: that is a **breakpoint**. [▶︎ Run](#zeige-ausfuehren) pauses before this line. -- The [Step](#zeige-einzelschritt) button runs exactly one line, like **Step** in the simulation. -- Below the code you see the current value of every variable. That is your desk check, except that the computer writes it down for you. - -::: übung l07-java-pizza -titel: Fix the pizza order -code: java -auftrag: A pizza costs 8 euros, extra cheese 2 euros. For 3 pizzas with extra cheese the program should output **Total: 30**. But it outputs 14. - Go through the Java code with Step and watch `total`. Find the mistake and fix it in the code. -start: l07-java-pizza-start.visustruct -test: - -> Total: 30 -braucht: anweisung -tipp: What value is in `total` after the fourth line? Work out in your head what Java calculates first. -tipp: As in maths, multiplication comes before addition: `price + cheese * count` is `8 + 6`. Add brackets: `(price + cheese) * count`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Fill in the gaps: desk check - -::: lückentext -titel: What is in the variables? -auftrag: Do a desk check in your head. After each line, write down the value the variable has afterwards, and in the last line what is output. -```java -int a = 5; -int b = 2; -a = a + b; // a is now [[7]] -b = a * 2; // b is now [[14]] -a = b - a; // a is now [[7]] -System.out.println(a + b); // output: [[21]] -``` -erklärung: Each line calculates with the values that are in the variables right now: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, output 7 + 14 = 21. You can check it with Step in the Code area. -::: - -## Find the bug: score - -::: übung l07-java-fehler -titel: Fix the score -code: java -auftrag: In a game Ludwig first gets 10 points, then 5 points, then he loses 3 points. At the end **Points: 12** should appear. But **Points: 3** appears. - Go through the code with Step and watch `points`. Fix the wrong line and click Check. -start: l07-java-fehler-start.visustruct -test: - -> Points: 12 -braucht: anweisung -tipp: After which line does `points` suddenly have the value 3? What should actually happen in that line? -tipp: Ludwig loses 3 points, so 3 is subtracted from the old value: `points = points - 3;` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l07-java-laeuft-nicht -titel: Fix the bonus -code: java -auftrag: Ludwig has 10 points and gets 5 bonus points. At the end **Points: 15** should appear. But the code doesn’t run. Also step through it with Single step: in which line does it stop? - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Points: 15 -braucht: anweisung -tipp: Java runs the code from top to bottom. Does `bonus` already exist when it is used in the calculation? -tipp: Create `bonus` before the calculation: first `int bonus = 5;`, then `points = points + bonus;` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Do the desk check in your head and tap the wrong line before time runs out. The programs are in Java, but every line is a box like in the structure chart. Six rounds, 30 seconds each. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int temp = a; - a = b; - b = a; -frage: Should swap the values of a and b. -fehler: 5 -besser: b = temp; -> a already holds the value of b. The old value of a is in temp. - -runde: - int a = 4; - int b = 6; - double mean = a + b / 2; - System.out.println(mean); -frage: Should output the mean 5.0. -fehler: 3 -besser: double mean = (a + b) / 2.0; -> Without brackets the division comes first: 4 + 6 / 2 = 7. - -runde: - int tickets = 3; - double price = 8.5; - double total = tickets + price; - System.out.println("Total: " + total); -frage: Should output the price for 3 cinema tickets at €8.50 each. -fehler: 3 -besser: double total = tickets * price; -> For the total price you multiply, you don't add. - -runde: - int minutes = 135; - int hours = minutes / 60; - int rest = minutes / 60; - System.out.println(hours + " h " + rest + " min"); -frage: Should output 2 h 15 min. -fehler: 3 -besser: int rest = minutes % 60; -> `%` gives the remainder of a division. With `/` rest would hold a 2 as well. - -runde: - String name = "Ada"; - System.out.println("Hello " + "name" + "!"); -frage: Should output "Hello Ada!". -fehler: 2 -besser: System.out.println("Hello " + name + "!"); -> In quotation marks, name is just a text. The variable has no quotation marks. - -runde: - double price = 100; - price = price * 0.1; - System.out.println(price); -frage: Should raise the price by 10 %, so output 110.0. -fehler: 2 -besser: price = price + price * 0.1; -> Times 0.1 only gives the 10 %, so 10.0. That has to be added to the old price. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can start the simulation, pause it, run single steps and stop it. → Start the simulation -- I can read the variables, the output and the last step during the simulation. → What the simulation shows -- I can do a desk check by hand as a table. → The desk check -- I can tell syntax errors, runtime errors and logic errors apart. → Three kinds of errors -- I can find a mistake by comparing the values with what I expect. → Find mistakes -- I can follow Java code with Step and breakpoints. → Now in Java -::: - -## Quiz - -::: quiz -? Which button runs exactly one step? -→ Start the simulation -- [ ] Play -- [x] Step -- [ ] Stop -> Play keeps going automatically, Step runs only one step. - -? What do you write down after every step in a desk check? -→ The desk check -- [ ] Only the output at the end -- [x] The current values of all variables -- [ ] The generated Java code -> That way you see exactly where a value is different from what you expected. - -? First `int a = 3`, then `int b = 5`, then `a = b`. What values do a and b have afterwards? -→ The desk check -- [ ] a = 5 and b = 3 -- [x] a = 5 and b = 5 -- [ ] a = 3 and b = 5 -> The old value of a has been overwritten. That is why you need a temporary variable when swapping. - -? The Last Step field shows `price = 4 * 2.5 -> 10.0`. What does that mean? -→ What the simulation shows -- [ ] The variable price now has the value 4. -- [x] 4 * 2.5 was worked out and the result 10.0 was stored in price. -- [ ] The simulation has found a mistake. - -? The simulation reports **Unknown variable: sum**. What is a likely reason? -→ Find mistakes -- [x] sum is used before it has been given a value. -- [ ] sum is too big. -- [ ] The structure chart has too many boxes. - -? What does a red dot in front of a line number in the Code area do? -→ Now in Java -- [ ] It marks an error. -- [x] The program pauses before this line. -- [ ] The line is skipped. -> That is a breakpoint. ▶︎ or Step carries on. -? Match each error to its kind. -→ Three kinds of errors -= The semicolon at the end of the line is missing. -> Syntax error -= The program divides by 0 and stops. -> Runtime error -= The average is too big because brackets are missing. -> Logic error - -? The program runs to the end without any message but prints 12 instead of 21. What kind of error is that? -→ Three kinds of errors -- [ ] Syntax error -- [ ] Runtime error -- [x] Logic error -> There is no message, but the result is still wrong. You only find an error like this with your expectation and a desk check. -::: diff --git a/web/lessons/en/08-verzweigung.md b/web/lessons/en/08-verzweigung.md deleted file mode 100644 index 2e92d4b7..00000000 --- a/web/lessons/en/08-verzweigung.md +++ /dev/null @@ -1,368 +0,0 @@ ---- -titel: Branch -bereich: Basics -kurz: Use a condition to decide which of two paths runs. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that exactly one path of a branch runs -- use the comparison operators == != < <= > >= -- tell == and = apart -- build a branch with an empty path -- write a branch with if and else in Java -::: - -## If, then, else - -So far every box always ran. But often a program should **decide**: if a condition is met, do one thing, otherwise do the other. - -::: diagramm l07-alter-pruefen.visustruct -Depending on the age typed in, one message or the other appears. Try 17 and 18 in the simulation. -::: - -That is what the **branch** is for. The condition sits in the triangle at the top. Below it, the structure chart splits into two paths: - -- **true** (left): runs if the condition is true -- **false** (right): runs if the condition is false - -Always **exactly one** of the two paths runs. After that, the program continues below the branch. - -## Insert a branch - -Drag the **Branch** from the Elements area into the structure chart. Click the triangle and type the condition in the Object Inspector, e.g. `age >= 18`. The word `if` is already in front. - -Each path starts with a placeholder ø. Drag statements into it. A path may also hold several boxes on top of each other. - -## Comparison operators - -A condition is usually a **comparison**. Its result is always `true` or `false`. - -- `==` equal, e.g. `number == 0` -- `!=` not equal, e.g. `answer != 42` -- `<` less than, `<=` less than or equal -- `>` greater than, `>=` greater than or equal - -> Do not mix up `==` and `=`. A single `=` is an assignment and stores a value. To compare, you need two equals signs. - -With `%` you check whether a number can be divided by another: `number % 2 == 0` is true if `number` is even. - -## Exercise: Even or odd - -::: übung l07-gerade -titel: Even or odd -auftrag: Ask for a whole number. Output **even** if it is even, otherwise **odd**. -test: 4 -> even -test: 7 -> odd -test: 0 -> even -braucht: verzweigung -tipp: There are two possibilities here, so you need a branch. How do you recognise an even number? -tipp: A number is even if there is no remainder when you divide it by 2. The condition is `number % 2 == 0`. -lösung: l07-gerade-loesung.visustruct -::: - -## Exercise: The larger number - -::: übung l07-maximum -titel: The larger number -auftrag: Ask for two whole numbers and output only the larger one. If both are the same, output that number. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: A branch compares the two numbers. Each path holds exactly one output. -tipp: Compare with `a > b`. In the true path you output `a`, in the false path `b`. -lösung: l07-maximum-loesung.visustruct -::: - -## An empty path - -Sometimes something should only happen if the condition is true, and otherwise nothing at all. Then the false path stays **empty**. In the structure chart it shows the placeholder **ø**. - -::: diagramm l07-rabatt.visustruct -From 50 euros on, you get 5 euros off. Otherwise nothing happens; the false path is empty. The output below runs in both cases. -::: - -::: angeberwissen -A single forgotten branch caused a stir across half the internet in 2014: the security hole **Heartbleed** in OpenSSL, a program that many websites use for encryption. A computer could tell the server: “Send me back the word *hat*, it has 500 letters.” The server did not check whether 500 matched the real length of 3 and simply sent back 500 characters from its memory. Sometimes they contained other people's passwords. All that was missing was one if: if the stated length is greater than the real one, then send nothing back. By the way, this had nothing to do with brackets. Baah, check your inputs before you believe them. -::: - -## Exercise: Absolute value - -::: übung l07-betrag -titel: Absolute value of a number -auftrag: Ask for a whole number. If it is negative, make it positive. Then output the number. So -5 becomes 5, and 7 stays 7. -Use a branch with an empty path and only **one** output below the branch. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Only negative numbers need to be changed. What happens to a number if you multiply it by -1? -tipp: The condition is `number < 0`. In the true path you flip the sign, e.g. with `number = 0 - number`. The false path stays empty. -lösung: l07-betrag-loesung.visustruct -::: - -## Now in Java - -This is the age check from the start of this lesson in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("How old are you?"); -int age = scanner.nextInt(); -if (age >= 18) { - System.out.println("You are an adult."); -} else { - System.out.println("You are not an adult yet."); -} -``` - -- The condition comes after `if` in **round brackets** `( )`. -- The true branch is in **curly brackets** `{ }`, the false branch follows after `else` in its own curly brackets. There is no semicolon after a curly bracket. -- If the false branch is empty, simply leave out `else { }`. -- Your program needs the first two lines once as soon as it reads input. After that, `scanner.nextInt()` reads a whole number. The question before it is a normal output. - -::: angeberwissen -Java has a mascot too: **Duke**, a little black-and-white fellow with a big red nose. He was drawn by the Java team in 1992 and has been waving from conferences and T-shirts ever since. Ludwig thinks a billy goat would have been a better fit. -::: - -::: übung l08-java-bestanden -titel: Passed in Java -code: java -auftrag: Write a Java program that asks for the number of points. From 50 points on it outputs **passed**, otherwise **not passed**. - Type the code in the Code area and then click Check. -test: 50 -> passed -test: 49 -> not passed -test: 100 -> passed -test: 0 -> not passed -braucht: verzweigung -tipp: Start with the two lines for the scanner. Then ask for the points, read them and compare them with `if`. -tipp: The condition is `points >= 50`. One branch has `System.out.println("passed");`, and after `else` comes `System.out.println("not passed");`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Fill in the gaps: even or odd - -::: lückentext -titel: Even or odd -auftrag: Fill in the missing words and symbols. The program should output whether a number is even. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which number?"); -int number = scanner.nextInt(); -[[if]] (number [[%]] 2 [[==]] 0) [[{]] - System.out.println("even"); -[[}]] [[else]] { - System.out.println("odd"); -} -``` -erklärung: `number % 2` is the remainder when dividing by 2. If it is 0, the number is even. To compare you need `==`, a single `=` is an assignment. Both branches are in curly brackets. -::: - -::: angeberwissen -If a branch holds only a single statement, Java even lets you leave out the curly brackets. We never do that, and here is why: - -```java -if (age >= 18) - System.out.println("You are an adult."); - System.out.println("You may watch the film."); -``` - -Without brackets only the first line belongs to the if. The second one always runs, even for twelve-year-olds. The indentation is misleading, because Java ignores spaces. - -Exactly this kind of mistake was hidden in iPhones and Macs in 2014, known as **“goto fail”**. In the language C, the line `goto fail;` accidentally appeared twice under an if without brackets. The second one always ran and skipped the check of the security certificates. On an open Wi-Fi network, an attacker could have pretended to be your bank, for example. Baah, brackets cost two characters, a security hole costs much more. -::: - -## Find the bug: admission - -::: übung l08-java-fehler -titel: Fix the admission -code: java -auftrag: At the zoo, children **under** 6 get in for free, everyone else pays 4 euros. But the program also lets six-year-olds in for free. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l08-java-fehler-start.visustruct -test: 5 -> Free entry -test: 6 -> 4 euros -test: 10 -> 4 euros -test: 0 -> Free entry -braucht: verzweigung -tipp: Try the program with 6. Which comparison operator still lets 6 through? -tipp: “Under 6” means `age < 6`. `<=` means “less than or equal to”. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l08-java-laeuft-nicht -titel: Rated 16 -code: java -auftrag: The film is rated 16. Ludwig is 15, so the program should output **No entry**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> No entry -braucht: verzweigung -tipp: Look closely at the condition in the brackets after `if`. Does this variable exist? -tipp: The variable is called `age` with a small a: `if (age >= 16) {` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which way? - -::: spiel frage -titel: Game: Which way? -intro: Ludwig has written branches in Java. Work out the condition in your head and predict what is output. Seven rounds. - -runde: - int x = 5; - if (x > 5) { - System.out.println("big"); - } else { - System.out.println("small"); - } -frage: What is output? -- big -- [x] small -- nothing -> 5 > 5 is false, because 5 is not greater than 5. So the false branch. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("big"); - } else { - System.out.println("small"); - } -frage: What is output? -- [x] big -- small -- big and small -> `>=` means "greater than or equal". 5 >= 5 is true. - -runde: - int number = 7; - if (number % 2 == 0) { - System.out.println("even"); - } else { - System.out.println("odd"); - } -frage: What is output? -- even -- [x] odd -- 1 -> 7 % 2 is the remainder 1, so not 0. The number is odd. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: What is output? -- -4 -- [x] 4 -- nothing -> -4 < 0 is true, so the sign is turned around. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: What is output? -- -4 -- [x] 4 -- nothing -> 4 < 0 is false. The false branch is empty, the program simply carries on below. - -runde: - int grade = 3; - if (grade != 3) { - System.out.println("different"); - } else { - System.out.println("three"); - } -frage: What is output? -- different -- [x] three -- nothing -> `!=` means "not equal". 3 != 3 is false. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: What is output? -- 8 -- [x] 12 -- 20 -> The program outputs the bigger of the two numbers. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that exactly one path of a branch runs. → If, then, else -- I can use the comparison operators == != < <= > >=. → Comparison operators -- I can tell == and = apart. → Comparison operators -- I can build a branch with an empty path. → An empty path -- I can write a branch with if and else in Java. → Now in Java -::: - -## Quiz - -::: quiz -? Which path runs if the condition is false? -→ If, then, else -- [ ] The true path -- [x] The false path -- [ ] Both paths -- [ ] Neither, the program ends -> With false, the right path runs. After that, the program continues below the branch. - -? Which condition checks whether age is exactly 18? -→ Comparison operators -- [ ] age = 18 -- [x] age == 18 -- [ ] age >= 18 -> A single = is an assignment. To compare, you need ==. - -? What does ø in a path mean? -→ An empty path -- [x] Nothing happens in this case. -- [ ] The program ends here. -- [ ] The condition is false. - -? The condition is `points >= 50`. For which value is it true? -→ Comparison operators -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= means greater than or equal. So 50 is included. - -? In textbooks the branch often has another name. Which one? -→ If, then, else -- [ ] Multiple selection -- [x] Conditional statement -- [ ] Iteration -> The statements in a path only run under a condition. That is why it is also called a conditional statement. - -? Where does the condition of a branch go in Java? -→ Now in Java -- [x] In round brackets right after if -- [ ] In curly brackets after else -- [ ] After a semicolon -> `if (age >= 18) { … }`: the round brackets belong to the condition, the curly ones to the branch. -::: diff --git a/web/lessons/en/09-bedingungen-verknuepfen.md b/web/lessons/en/09-bedingungen-verknuepfen.md deleted file mode 100644 index 07be3712..00000000 --- a/web/lessons/en/09-bedingungen-verknuepfen.md +++ /dev/null @@ -1,328 +0,0 @@ ---- -titel: Combining conditions -bereich: Basics -kurz: Join several conditions with and, or and not, and check ranges of values. ---- - -## Skills I will gain now - -::: kompetenzen -- explain when a combination with && is true -- explain when a combination with || is true -- turn a condition round with ! -- check whether a value is in a range such as 1 to 6 -- read the truth table for &&, || and ! -- store the result of a condition in a boolean variable -- evaluate combined conditions confidently -- combine conditions in Java with && and || -::: - -## And: && - -Sometimes a single comparison is not enough. For example, you only get a youth ticket if you are **at least 12 and younger than 18**. - -With `&&` (and) you join two conditions. The result is only `true` if **both** conditions are true. - -::: diagramm l08-jugendticket.visustruct -Both comparisons must be right. Try 11, 12, 17 and 18 in the simulation. -::: - -## Or: || - -With `||` (or) the result is `true` if **at least one** of the conditions is true. Both may be true as well. - -``` -day == 6 || day == 7 -``` - -This condition is true if `day` has the value 6 or the value 7, so on Saturday or Sunday. - -> On many keyboards you type the vertical bar `|` with Shift and the backslash key. On a German keyboard it is AltGr and `<`, on a Mac Option and 7. - -## Exercise: Weekend - -::: übung l08-wochenende -titel: Weekend -auftrag: Ask for a day of the week as a number (1 is Monday, 7 is Sunday). Output **Weekend** if it is Saturday or Sunday, otherwise **Weekday**. -test: 6 -> Weekend -test: 7 -> Weekend -test: 1 -> Weekday -test: 5 -> Weekday -braucht: verzweigung -tipp: It is the weekend if the day is 6 **or** 7. For that you need two comparisons in one condition. -tipp: Saturday is 6, Sunday is 7. Join the two comparisons with `||`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Check ranges of values - -In German schools, grades go from 1 (best) to 6. You check whether a grade is **in the range** with two comparisons and `&&`: - -``` -grade >= 1 && grade <= 6 -``` - -::: grafik l08-zahlenstrahl.svg -The green range from 1 to 6 is valid; both ends are included. -::: - -The other way round, a grade is **outside** the range if it is too small **or** too big: - -::: diagramm l08-note.visustruct -There is no grade smaller than 1 or bigger than 6. -::: - -> The way you write it in maths, `1 <= grade <= 6`, does not work. You have to split it into two comparisons and join them with `&&`. - -## Exercise: Valid grade - -::: übung l08-note-gueltig -titel: Valid grade -auftrag: Ask for a grade as a whole number. Output **valid** if it is between 1 and 6 (1 and 6 are included), otherwise **invalid**. -test: 1 -> valid -test: 6 -> valid -test: 3 -> valid -test: 0 -> invalid -test: 7 -> invalid -braucht: verzweigung -tipp: A valid grade has to meet two things at once: not too small **and** not too big. -tipp: The grade must be greater than or equal to 1 and at the same time less than or equal to 6. -lösung: l08-gueltig-loesung.visustruct -::: - -## Not and brackets - -With `!` (not) you turn a condition round: `true` becomes `false` and the other way round. - -``` -!(grade >= 1 && grade <= 6) -``` - -This is true if the grade is **not** in the range, and it means the same as `grade < 1 || grade > 6`. - -If `&&` and `||` appear together, `&&` is worked out first, just like multiplication before addition. It is better to use **brackets**; then it is clear what belongs together: - -``` -(age >= 12 && age < 18) || student == 1 -``` - -## The truth table - -A **truth table** shows at a glance what `&&`, `||` and `!` produce. On the left are all four possibilities for two conditions `a` and `b`, on the right the result: - -::: grafik l09-wahrheitstabelle.svg -Green is true, red is false. With && there is only one green row, with || only one red one. -::: - -Rules of thumb: - -- `a && b` is only true if **both** are true. -- `a || b` is only false if **both** are false. -- `!a` flips the value. - -::: angeberwissen -The data type `boolean` is named after **George Boole**. As early as 1847 this Englishman showed that you can calculate with true and false just like with numbers, almost a hundred years before the first computer existed. Today his logic is in every chip. -::: - -## Truth values in variables - -The result of a condition is a **truth value** of type `boolean`. You can store it in a variable just like a number and use it later: - -``` -boolean weekend = day == 6 || day == 7 -``` - -The branch then only says `weekend`. That reads almost like a sentence: "If weekend, then …". Don't write `weekend == true`, because `weekend` already is true or false. - -With `!weekend` you ask for the opposite, a weekday. - -::: ludwig -Long conditions become clearer when you put parts of them into boolean variables with meaningful names, for example `boolean teenager = age >= 12 && age < 18`. -::: - -## Game: True or false? - -Now it's your turn. Work out each condition in your head. After every answer you see how VisuStruct evaluates it step by step. - -::: spiel -age: 8..20 -day: 1..7 -grade: 0..7 -student: boolean -weekend: boolean -? age >= 18 -? day == 6 -? grade != 3 -? age >= 12 && age < 18 -? day == 6 || day == 7 -? student && weekend -? !student -? grade >= 1 && grade <= 6 -? !(age < 18) -? student || age >= 18 -? (age >= 12 && age < 18) || student -? !(grade >= 1 && grade <= 6) -? !weekend && day != 3 -? age >= 12 && age < 18 && !student -::: - -## Exercise: Leap year - -::: übung l08-schaltjahr -titel: Leap year -auftrag: A year is a leap year if it can be divided by 4 but not by 100. Years that can be divided by 400 are leap years anyway. -Ask for a year and output **Leap year** or **Not a leap year**. -test: 2024 -> Leap year -test: 2023 -> Not a leap year -test: 1900 -> Not a leap year -test: 2000 -> Leap year -braucht: verzweigung -tipp: Check the rule with examples first: 2024 is a leap year, 1900 is not, 2000 is. “Can be divided” means the remainder is 0. -tipp: Divisible by 4 means `year % 4 == 0`, not divisible by 100 means `year % 100 != 0`. Join these two with `&&`, put brackets around them and add the case for 400 with `||`. -tipp: Almost the solution: one single branch with the condition `(year % 4 == 0 && year % 100 != 0) || year % 400 == 0`. The true branch has `output: "Leap year"`, the false branch `output: "Not a leap year"`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Now in Java - -The youth ticket from the start looks like this in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("How old are you?"); -int age = scanner.nextInt(); -if (age >= 12 && age < 18) { - System.out.println("Youth ticket"); -} else { - System.out.println("No youth ticket"); -} -``` - -The symbols `&&`, `||` and `!` are exactly the ones you already use in the structure chart. They come from Java. As always, the whole condition is in the round brackets after `if`. - -::: übung l09-java-schule -titel: School or free time -code: java -auftrag: Write a Java program that asks for the hour (0 to 23). From 8 up to and including 15 it outputs **School**, otherwise **Free time**. -test: 8 -> School -test: 15 -> School -test: 16 -> Free time -test: 7 -> Free time -braucht: verzweigung -tipp: The hour has to meet two conditions at the same time. Which operator means “and”? -tipp: `if (hour >= 8 && hour <= 15) { … } else { … }` -lösung: l09-java-schule-loesung.visustruct -::: - -## Fill in the gaps: conditions - -::: lückentext -titel: Grade and weekend -auftrag: Fill in the missing operators and words. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which grade?"); -int grade = scanner.nextInt(); -if (grade >= 1 [[&&]] grade [[<=]] 6) { - System.out.println("valid grade"); -} else { - System.out.println("invalid grade"); -} -System.out.println("Which day (1 to 7)?"); -int day = scanner.nextInt(); -[[boolean]] weekend = day == 6 [[||]] day == 7; -if ([[!]]weekend) { - System.out.println("school day"); -} -``` -erklärung: A grade is valid when **both** conditions are true, so `&&`. It is the weekend when **one** of the two is true, so `||`. The result fits into a `boolean` variable, and `!` turns it around. -::: - -## Find the bug: no school - -::: übung l09-java-fehler -titel: Fix the day off -code: java -auftrag: The program should output **no school** for day 6 (Saturday) and day 7 (Sunday), otherwise **school**. But it always outputs **school**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l09-java-fehler-start.visustruct -test: 6 -> no school -test: 7 -> no school -test: 3 -> school -test: 1 -> school -braucht: verzweigung -tipp: Can `day` be 6 **and** 7 at the same time? -tipp: It is enough if one of the two conditions is true: `day == 6 || day == 7`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l09-java-laeuft-nicht -titel: Fix the weekend -code: java -auftrag: Day 6 is Saturday, day 7 is Sunday. Today is day 7, so **no school** should appear. But the program doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> no school -braucht: verzweigung -tipp: The condition has two parts. Compare the variable name in both parts. -tipp: In the second part the variable is also called `day` with a small d: `if (day == 6 || day == 7) {` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain when a combination with && is true. → And: && -- I can explain when a combination with || is true. → Or: || -- I can turn a condition round with !. → Not and brackets -- I can check whether a value is in a range such as 1 to 6. → Check ranges of values -- I can read the truth table for &&, || and !. → The truth table -- I can store the result of a condition in a boolean variable. → Truth values in variables -- I can evaluate combined conditions confidently (at least 8 of 10 right in the game). → Game: True or false? -- I can combine conditions in Java with && and ||. → Now in Java -::: - -## Quiz - -::: quiz -? When is `a && b` true? -→ And: && -- [ ] If a or b is true -- [x] Only if a and b are both true -- [ ] If exactly one of them is true -> With && both parts must be right. If one is false, the whole thing is false. - -? The variable day has the value 6. What does `day == 6 || day == 7` give? -→ Or: || -- [x] true -- [ ] false -> With || it is enough if one side is true. - -? Which condition checks whether number is between 10 and 20 (both included)? -→ Check ranges of values -- [ ] 10 <= number <= 20 -- [ ] number >= 10 || number <= 20 -- [x] number >= 10 && number <= 20 -> With || every number would be allowed, because every number is greater than 10 or less than 20. - -? What does `!(5 > 3)` give? -→ Not and brackets -- [ ] true -- [x] false -> 5 > 3 is true, and ! turns that round. - -? How do you write “age is at least 12 and less than 18” in Java? -→ Now in Java -- [ ] if (12 <= age < 18) -- [x] if (age >= 12 && age < 18) -- [ ] if (age >= 12 || age < 18) -> Each comparison stands on its own, joined with `&&`. -::: diff --git a/web/lessons/en/10-fallauswahl.md b/web/lessons/en/10-fallauswahl.md deleted file mode 100644 index 7ce8219e..00000000 --- a/web/lessons/en/10-fallauswahl.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -titel: Switch -bereich: Basics -kurz: Run one of many cases, depending on the value of a variable. ---- - -## Skills I will gain now - -::: kompetenzen -- insert a switch, add cases and change case names -- explain when the case default runs -- decide whether a switch or a branch fits better -- write a case selection in Java with switch -::: - -## Many possibilities, one variable - -A drinks machine has three buttons: 1 for water, 2 for juice, 3 for cocoa. With branches you need three boxes nested inside each other. That quickly gets wide and confusing. - -::: diagramm l09-verschachtelt.visustruct -The machine with three nested branches. Each branch checks the same variable choice again. -::: - -Whenever you compare **one variable** with **several fixed values**, there is an easier way: the **switch**. - -## How a switch is built - -At the top of the box is the variable that decides. Below it there is a column of its own for every case. Above each column is the value it belongs to. - -::: diagramm l09-automat.visustruct -The same machine as a switch. If choice has the value 2, only column 2 runs. -::: - -- The simulation looks for the case whose name matches the value exactly. -- If no case matches, **default** runs. This case is always on the far right. -- After that, the program continues below the switch. Only **one** case ever runs. - -> A new switch has the cases 1, 2 and default. Click a case to change its **Case name** in the Object Inspector. With **Add Case** you get a new column in front of default. - -## Cases with text - -The cases do not have to be numbers. You can also choose by the content of a `String` variable. Then you write the text in quotation marks as the case name, for example `"red"`. Just like in code, this shows that it is a text. - -::: diagramm l09-ampel.visustruct -A traffic light: depending on the colour typed in, a different message appears. In the simulation, also try a colour that does not exist. -::: - -Upper and lower case matter: `Red` does not match the case `"red"`. - -## Exercise: Grade in words - -::: übung l09-note -titel: Grade in words -auftrag: Ask for a grade as a whole number and output it in words: 1 very good, 2 good, 3 satisfactory, 4 sufficient, 5 poor, 6 fail. - For any other number, **Not a valid grade** should appear. -test: 1 -> very good -test: 4 -> sufficient -test: 6 -> fail -test: 9 -> Not a valid grade -braucht: fallauswahl -tipp: For many fixed values, a switch is clearer than lots of branches. Every grade gets a case of its own. -tipp: Keep using “Add Case” until you have the cases 1 to 6 and default. At the top of the switch you write `grade`. -lösung: l09-note-loesung.visustruct -::: - -## Exercise: Calculator - -::: übung l09-rechner -titel: Calculator -auftrag: Ask, one after another, for a whole number `a`, an operator as a `String` and a second whole number `b`. - For `+`, `-` and `*` you output the result. For any other sign, **Unknown operator** appears. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Unknown operator -braucht: fallauswahl -tipp: First read in all three values. After that, a switch on the operator decides what is calculated. -tipp: Before the switch, create `int result = 0`. In each case you calculate, for example, `result = a + b` and then output `result`. The case names are `"+"`, `"-"` and `"*"` in quotation marks, because the operator is a `String`. -tipp: The outline from top to bottom: three inputs (`int a`, `String operator`, `int b`), then `int result = 0`, then a switch over `operator`. Case `"+"` holds `result = a + b` and `output: result`, cases `"-"` and `"*"` the same. The default case holds `output: "Unknown operator"`. -lösung: l09-rechner-loesung.visustruct -::: - -## Switch or branch? - -The switch only checks whether a value is **exactly equal** to a case name. So: - -- **Switch:** one variable, several fixed values. Examples: choosing from a menu, day of the week as a number, grades. -- **Branch:** ranges and combined conditions. Examples: `age >= 18`, `temperature < 0 || temperature > 30`. - -So for “age 18 or older” you still need the branch. You cannot create a case of its own for every possible age. - -## Now in Java - -The drinks machine looks like this in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 water, 2 juice, 3 cocoa"); -int choice = scanner.nextInt(); -switch (choice) { - case 1 -> { - System.out.println("Here is your water."); - } - case 2 -> { - System.out.println("Here is your juice."); - } - case 3 -> { - System.out.println("Here is your cocoa."); - } - default -> { - System.out.println("This button does not exist."); - } -} -``` - -- After `switch`, the variable being compared is in round brackets. -- Every case starts with `case`, the value and an arrow `->`. After it, curly brackets hold what should happen. -- `default` is the otherwise case. It runs when no value matches. - -::: angeberwissen -The arrow `case 1 ->` has only existed in Java since 2020 (Java 14). Before that you wrote `case 1:` and had to end every case with `break;`. If you forgot it, the program simply ran on into the next case. So the arrow has saved a lot of programmers a lot of trouble. -::: - -::: übung l10-java-wuerfel -titel: Dice in words -code: java -auftrag: Write a Java program with `switch` that reads a number. For 1 it outputs **one**, for 2 **two**, for 3 **three** and otherwise **unknown**. -test: 1 -> one -test: 2 -> two -test: 3 -> three -test: 7 -> unknown -braucht: fallauswahl -tipp: You need three `case` branches and one `default` branch. -tipp: `switch (number) { case 1 -> { System.out.println("one"); } … default -> { System.out.println("unknown"); } }` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Fill in the gaps: switch - -::: lückentext -titel: Months in words -auftrag: Fill in the missing words and symbols of the case selection. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which month (1 to 3)?"); -int month = scanner.nextInt(); -[[switch]] (month) { - [[case]] 1 -> { - System.out.println("January"); - } - case 2 [[->]] { - System.out.println("February"); - } - [[case]] 3 -> { - System.out.println("March"); - } - [[default]] -> { - System.out.println("Unknown"); - } -} -``` -erklärung: After `switch` the variable is in round brackets. Each case starts with `case`, the value and the arrow `->`. `default` runs when no case matches. -::: - -## Find the bug: calculator - -::: übung l10-java-fehler -titel: Fix the calculator -code: java -auftrag: The calculator reads two numbers and a choice: 1 plus, 2 minus, 3 times. For 7, 3 and choice 2 the result should be **4**, but it calculates **-4**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Not an option -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Plus and times are right. Take a close look at `case 2`. -tipp: With minus the order matters: `a - b` instead of `b - a`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l10-java-laeuft-nicht -titel: Fix the grade -code: java -auftrag: Ludwig got grade 2. The program should output **good**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> good -braucht: fallauswahl -tipp: Which variable does the case selection check? Is it written the same way above? -tipp: The brackets after `switch` need `grade` with a small g: `switch (grade) {` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which case? - -::: spiel frage -titel: Game: Which case? -intro: Ludwig presses buttons on the drinks machine and other case selections. What happens? Six rounds. - -runde: - int choice = 2; - switch (choice) { - case 1 -> { System.out.println("water"); } - case 2 -> { System.out.println("juice"); } - case 3 -> { System.out.println("cocoa"); } - default -> { System.out.println("There is no such button."); } - } -frage: What is output? -- water -- [x] juice -- There is no such button. -> choice is 2, so exactly `case 2` runs. - -runde: - int choice = 4; - switch (choice) { - case 1 -> { System.out.println("water"); } - case 2 -> { System.out.println("juice"); } - case 3 -> { System.out.println("cocoa"); } - default -> { System.out.println("There is no such button."); } - } -frage: What is output? -- cocoa -- nothing -- [x] There is no such button. -> No case fits 4, so `default` runs. - -runde: - String day = "monday"; - switch (day) { - case "Monday" -> { System.out.println("maths"); } - case "Tuesday" -> { System.out.println("sports"); } - default -> { System.out.println("free"); } - } -frage: What is output? -- maths -- sports -- [x] free -> With texts every letter counts: "monday" with a small m is not "Monday". - -runde: - int grade = 0; - switch (grade) { - case 1 -> { System.out.println("very good"); } - case 2 -> { System.out.println("good"); } - case 3 -> { System.out.println("satisfactory"); } - } -frage: What is output? -- very good -- [x] nothing -- satisfactory -> No case fits, and there is no `default`. Then simply nothing happens. - -runde: -frage: You want to check whether `age >= 18`. What fits better? -- [x] a branch -- a case selection -> A case selection only compares with fixed values. For "greater than or equal" you need a branch. - -runde: -frage: A dice shows 1 to 6, and for every number a different word should appear. What fits better? -- a branch -- [x] a case selection -> One variable, six fixed values: that's exactly what the case selection is for. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can insert a switch, add cases and change case names. → How a switch is built -- I can explain when the case default runs. → How a switch is built -- I can decide whether a switch or a branch fits better. → Switch or branch? -- I can write a case selection in Java with switch. → Now in Java -::: - -## Quiz - -::: quiz -? The variable day has the value 5. There are the cases 1, 2, 3 and default. What runs? -→ How a switch is built -- [ ] Nothing at all -- [ ] The case 3 -- [x] The case default -> No case name matches 5, so default applies. - -? How many cases run each time the switch runs? -→ How a switch is built -- [x] Exactly one -- [ ] All cases from the matching one on -- [ ] All cases -> After the matching case, the program continues straight below the switch. - -? What is a switch NOT suitable for? -→ Switch or branch? -- [ ] Choosing menu item 1, 2 or 3 -- [x] Checking whether a temperature is above 30 degrees -- [ ] Handling a colour such as red, yellow or green -> “Above 30” is a range. For that you need a branch with a comparison. - -? At the traffic light you type `Red`, and the case is called `"red"`. What happens? -→ How a switch is built -- [ ] The case `"red"` runs. -- [x] The case default runs. -- [ ] The simulation reports an error. -> Upper and lower case matter. Red and red are different texts. - -? Under which name do you also find the switch in textbooks? -→ How a switch is built -- [ ] Conditional statement -- [ ] Sequence -- [x] Multiple selection -> One of many cases is selected. That is why it is also called multiple selection. - -? What is the otherwise case of a switch called in Java? -→ Now in Java -- [ ] else -- [x] default -- [ ] case 0 -::: diff --git a/web/lessons/en/11-while-schleife.md b/web/lessons/en/11-while-schleife.md deleted file mode 100644 index 6e494266..00000000 --- a/web/lessons/en/11-while-schleife.md +++ /dev/null @@ -1,359 +0,0 @@ ---- -titel: While loop -bereich: Basics -kurz: Repeat steps as long as a condition is true. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the while loop checks its condition before every pass -- use a counter variable with a start value, a condition and a change -- notice when a loop never ends and fix the mistake -- follow a loop pass by pass in a desk check -- write a while loop in Java -::: - -## Repeat as long as something holds - -Often a program should do something several times. Instead of writing the same box five times, you use a **loop**. - -The **while loop** repeats its inside **as long as** its condition is true. The condition is at the top, in the head of the box. The inside is indented below it, framed by a bracket on the left. - -::: diagramm l10-countdown.visustruct -A countdown: as long as number is greater than 0, number is output and gets smaller by 1. After that, Start! appears. -::: - -## The condition comes first - -The while loop is a **pre-test loop**. Before **every** pass, the condition is checked: - -1. Check the condition. -2. If it is true, run the inside once and start again at 1. -3. If it is false, the program continues below the loop. - -::: grafik l10-kopfgesteuert.svg -After every pass it goes back to the condition. Only when it is false does the program continue below the loop. -::: - -In the countdown the condition is checked four times: with 3, 2 and 1 it is true, with 0 it is false. - -> If the condition is already false the first time it is checked, the inside runs **not even once**. Start the countdown with `int number = 0` and only Start! appears. - -## A counter variable - -Many loops count along. For that you need three things: - -- **A start value before the loop**, e.g. `int i = 1` -- **A condition in the head**, e.g. `i <= 5` -- **A change inside**, e.g. `i = i + 1` (short: `i++`) - -If one of these parts is missing, the loop counts wrongly or not at all. - -::: angeberwissen -Counting loops are ancient! In their 1973 article, Nassi and Shneiderman showed their idea using the **factorial**, among other things: 5! = 1 · 2 · 3 · 4 · 5 = 120. Here is my goat version of it. Try it with **Step** in the simulation and watch `factorial` grow. Baaah, that goes fast! -::: - -::: diagramm l10-fakultaet.visustruct -The factorial with a counter variable `i`, rebuilt from an example in the 1973 article. -::: - -## Exercise: Count to n - -::: übung l10-bis-n -titel: Count to n -auftrag: Ask for a whole number `n` and output all numbers from 1 to `n`, each on its own line. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: You need a counter variable that starts at 1 and grows by 1 in every pass. -tipp: Before the loop, create `int i = 1`. The condition is `i <= n`. Inside, you output `i` and then increase `i` by 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Watch out: endless loop - -If nothing inside the loop changes the condition, it stays true forever. The loop never stops. This is called an **endless loop**. - -::: diagramm l10-endlos.visustruct -Here number = number - 1 is missing. The loop outputs 3 again and again and never reaches Start! -::: - -Ask yourself for every loop: **What inside makes sure that the condition becomes false at some point?** When an exercise is checked, VisuStruct stops after a very large number of steps and reports a possible endless loop. - -## Exercise: Double up to 100 - -::: übung l10-verdoppeln -titel: Double up to 100 -auftrag: Ask for a whole number. Keep doubling it until it is at least 100. - At the end, output **how often** you doubled it. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: The loop runs as long as the number is still too small. Count along how often it has run. -tipp: You need a second variable `int steps = 0`. The condition is `number < 100`. Inside, you double the number with `number = number * 2` and increase `steps` by 1. If the number is already 100, the loop does not run at all. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Loops in a desk check - -With a loop, the **desk check** is especially valuable. You see exactly how often the loop runs and with which value it stops. Every check of the condition gets a row of its own. - -::: diagramm l16-schreibtisch.visustruct -A while loop adds up the numbers 1, 2 and 3. -::: - -| Step | sum | i | Output | -|---|---|---|---| -| `int sum = 0` | 0 | – | | -| `int i = 1` | 0 | 1 | | -| `i <= 3` → true | 0 | 1 | | -| `sum = sum + i` | 1 | 1 | | -| `i = i + 1` | 1 | 2 | | -| `i <= 3` → true | 1 | 2 | | -| `sum = sum + i` | 3 | 2 | | -| `i = i + 1` | 3 | 3 | | -| `i <= 3` → true | 3 | 3 | | -| `sum = sum + i` | 6 | 3 | | -| `i = i + 1` | 6 | 4 | | -| `i <= 3` → false | 6 | 4 | | -| `output: sum` | 6 | 4 | 6 | - -Common mistakes in loops are: - -- The loop runs **once too often or once too few**, e.g. `<` instead of `<=`. -- A variable is **not changed** in the loop, or changed in the wrong direction. Then the loop never ends. -- A variable gets its start value **inside** the loop instead of before it and is reset in every pass. - -## Exercise: Fix the countdown - -::: übung l16-countdown -titel: Fix the countdown -auftrag: The countdown should count down from the start value and output **Go!** at the end. So with 3: 3, 2, 1, Go! - The start diagram has two mistakes. Find and fix both. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Go! -test: 1 -> 1 | Go! -test: 0 -> Go! -tipp: There are two mistakes. One is about counting, the other about the output at the end. -tipp: Start the simulation with start value 3 and watch i under Variables. Does i get smaller? Also compare the last output carefully with the task. -lösung: l16-countdown-loesung.visustruct -::: - -## Now in Java - -The countdown from the start of this lesson looks like this in Java: - -```java editor -int number = 3; -while (number > 0) { - System.out.println(number); - number = number - 1; -} -System.out.println("Start!"); -``` - -- After `while` the condition is in round brackets, as with `if`. -- Everything that is repeated is in curly brackets. That is the body of the loop. -- The body is indented. As in the structure chart, you can see what belongs to the loop. - -::: übung l11-java-gerade -titel: Even numbers in Java -code: java -auftrag: Write a Java program that reads a whole number `n` and uses a while loop to output all even numbers from 2 up to at most `n`. For 7 that is 2, 4 and 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: You need a counter variable that starts at 2. The loop runs as long as it is not greater than `n`. -tipp: `int number = 2;` before the loop, then `while (number <= n) { … }`. In the body you output `number` and increase it with `number = number + 2;`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Fill in the gaps: while - -::: lückentext -titel: Sum from 1 to 10 -auftrag: The program should add up the numbers from 1 to 10. Fill in the missing words and symbols. -```java -int sum = 0; -int number = 1; -[[while]] (number [[<=]] 10) [[{]] - sum = sum + [[number]]; - [[number]] = number + 1; -} -System.out.println("Sum: " + sum); -``` -erklärung: The loop runs as long as `number` is at most 10. In each pass `number` is added to the sum, then `number` goes up by 1. Without that line it would be an endless loop. Output: **Sum: 55** -::: - -## Find the bug: saving - -::: übung l11-java-fehler -titel: Fix the savings plan -code: java -auftrag: Ludwig saves 5 euros every week. The program asks for the savings goal and should output after how many weeks he has reached it. For 50 euros that is 10 weeks, but the program says **Weeks: 11**. - Go through the code with Step and watch `money` and `weeks`. Fix the bug and click Check. -start: l11-java-fehler-start.visustruct -test: 50 -> Weeks: 10 -test: 12 -> Weeks: 3 -test: 5 -> Weeks: 1 -test: 1 -> Weeks: 1 -braucht: whileSchleife -tipp: How much money does Ludwig have when the loop runs for the last time? Does he really need to save for another week? -tipp: He only saves as long as the goal has **not been reached** yet: `while (money < goal)`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l11-java-laeuft-nicht -titel: Fix the countdown -code: java -auftrag: The countdown should output **3**, **2**, **1** and then **Go!** But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Go! -braucht: whileSchleife -tipp: The bug is inside the loop. Which variable should be output, and what is it really called? -tipp: Output `number` with a small n: `System.out.println(number);` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Game: How often? - -::: spiel frage -titel: Game: How often? -intro: Ludwig has written while loops. Do the desk check in your head. Six rounds. - -runde: - int number = 3; - while (number > 0) { - System.out.println(number); - number = number - 1; - } - System.out.println("Go!"); -frage: What is output? -- [x] 3\n2\n1\nGo! -- 3\n2\n1\n0\nGo! -- Go! -> When number is 0, `number > 0` is false, so the 0 is not output any more. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: What is output? -- [x] nothing -- 10 -- 10 to 4 -> The condition is checked first. 10 < 5 is false, the body doesn't run even once. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: What happens? -- 1, 2 and 3 are output. -- [x] The loop never stops. -- Nothing is output. -> i never gets bigger in the body. The condition always stays true: an endless loop. - -runde: - int number = 1; - while (number < 100) { - number = number * 2; - } - System.out.println(number); -frage: What is output? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Only at 128 is `number < 100` false. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: What is output? -- 4 -- 5 -- [x] 6 -> i runs 0, 2, 4, 6. At 6, `i < 5` is false. The 5 is skipped. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: How often does the body run? -- 3 times -- [x] 4 times -- 10 times -> The body runs at i = 1, 4, 7 and 10. After that i is 13. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the while loop checks its condition before every pass. → The condition comes first -- I can use a counter variable with a start value, a condition and a change. → A counter variable -- I can notice when a loop never ends and fix the mistake. → Watch out: endless loop -- I can follow a loop pass by pass in a desk check. → Loops in a desk check -- I can write a while loop in Java. → Now in Java -::: - -## Quiz - -::: quiz -? What does pre-test loop mean? -→ The condition comes first -- [x] The condition is checked before every pass. -- [ ] The condition is checked after every pass. -- [ ] The loop always runs exactly once. -> The head with the condition is at the top and is worked out first. - -? `int i = 5`, then a while loop with the condition `i < 3`. How often does the inside run? -→ The condition comes first -- [x] Not at all -- [ ] Once -- [ ] Three times -> The very first time it is checked, 5 < 3 is false. - -? Why does a loop with the condition `number > 0` never end if the inside only contains `output: number`? -→ Watch out: endless loop -- [ ] Because output makes the number bigger -- [x] Because number never changes and the condition stays true -- [ ] Because the condition is written wrongly -> Something has to happen inside that makes the condition false at some point. - -? What else are loops called in textbooks? -→ The condition comes first -- [x] Iteration or repetition -- [ ] Branches -- [ ] Subprograms -> A loop repeats statements. That is why it is also called iteration or repetition. - -? A loop should count from 1 to 5, but it only goes up to 4. What is the likely mistake? -→ A counter variable -- [x] The condition says i < 5 instead of i <= 5. -- [ ] The loop is a while loop. -- [ ] The variable i has the wrong name. - -? Which line starts a while loop correctly in Java? -→ Now in Java -- [ ] while number > 0 { -- [x] while (number > 0) { -- [ ] while (number > 0); -> The condition is in round brackets, then `{` opens the body. -::: diff --git a/web/lessons/en/12-do-while-schleife.md b/web/lessons/en/12-do-while-schleife.md deleted file mode 100644 index fc12d7aa..00000000 --- a/web/lessons/en/12-do-while-schleife.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -titel: Do-while loop -bereich: Basics -kurz: Run first, check afterwards: loops with at least one pass. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the do-while loop only checks its condition after the inside -- explain why the inside runs at least once -- repeat an input until it is valid -- write a do-while loop in Java -::: - -## Do first, check afterwards - -The **do-while loop** is a **post-test loop**. The condition is at the bottom, in the foot of the box. This is how it runs: - -1. Run the inside once. -2. Check the condition. -3. If it is true, start again at 1. If it is false, the program continues below the loop. - -::: grafik l11-vergleich.svg -On the left, the while loop checks first; on the right, the do-while loop runs first. -::: - -At the top of the box is `do`, and the condition is in the foot. When you click the loop, the word `while` is in front of the text field in the Object Inspector: the condition means “repeat as long as …”. - -> Just like with the while loop, the condition says **when the loop repeats**. As long as it is true, the loop keeps running. - -::: angeberwissen -Python has no do-while loop at all. If you want “do first, check later” there, you write `while True:` and leave the loop with `break`. Java, C and JavaScript, on the other hand, have had `do … while` for decades. -::: - -## At least one pass - -Because the condition is only checked at the end, the inside **always runs at least once**. That is the most important difference from the while loop. - -::: diagramm l11-einmal.visustruct -i is 10 and so it is not less than 5. Still, 10 is output once, because the check only comes afterwards. -::: - -With a while loop and the same condition `i < 5`, nothing at all would be output here. - -## Typical use: repeat an input - -The do-while loop fits whenever something has to happen first before you can check it. The best example is an input: only after someone has typed something do you know whether it is valid. - -::: diagramm l11-eingabe-pruefen.visustruct -The question comes again until a number from 1 to 10 has been typed in. In the simulation, first try 0 and then 12. -::: - -Here the condition describes the **invalid** input: `number < 1 || number > 10`. As long as the input is invalid, the question is asked again. - -## Exercise: Valid grade - -::: übung l11-note -titel: Valid grade -auftrag: Ask for a grade. If it is not between 1 and 6, ask again. If it is valid, output it, for example **Your grade: 3**. -test: 3 -> Your grade: 3 -test: 0, 7, 2 -> Your grade: 2 -test: 9, 6 -> Your grade: 6 -test: -1, 1 -> Your grade: 1 -braucht: doUntilSchleife -tipp: The grade is asked for at least once. After that, the condition decides whether to ask again. -tipp: Before the loop, create `int grade = 0`. The input `input: grade "Grade from 1 to 6"` goes inside the loop. The condition is `grade < 1 || grade > 6`. -lösung: l11-note-loesung.visustruct -::: - -## Exercise: Sum until 0 - -::: übung l11-summe -titel: Sum until 0 -auftrag: Keep asking for numbers until a 0 is typed in. Then output the sum of all the numbers typed in. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: You need a variable for the sum that starts at 0 before the loop. In every pass the new number is added. -tipp: Before the loop, create `int sum = 0` and `int number = 0`. In the loop you ask for `number` and calculate `sum = sum + number`. Adding the 0 does no harm. The loop keeps running as long as `number != 0`. -tipp: The outline: `int sum = 0` and `int number = 0`, then a do-while loop with the condition `number != 0`. Inside it: the input of `number` and `sum = sum + number`. Below the loop: `output: sum`. -lösung: l11-summe-loesung.visustruct -::: - -## Now in Java - -The loop that still runs once looks like this in Java: - -```java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -``` - -- The body is between `do {` and `}`, the condition only comes afterwards. -- Here there is a **semicolon** after `while (…)`. That is different from the while loop. - -::: übung l12-java-verdoppeln -titel: Double at least once -code: java -auftrag: Write a Java program that reads a start number. A do-while loop doubles it and outputs it as long as it is less than 100. A number of 100 or more is still doubled at least once: 200 becomes 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: In the body you double the number and output it. The condition comes at the end. -tipp: `do { number = number * 2; System.out.println(number); } while (number < 100);` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Fill in the gaps: do-while - -::: lückentext -titel: Tripling -auftrag: The number is tripled and output as long as it is less than 100. Fill in the missing words and symbols. -```java -int number = 1; -[[do]] { - number = number * 3; - System.out.println(number); -} [[while]] (number [[<]] 100)[[;]] -``` -erklärung: The body is between `do {` and `}`, the condition only comes afterwards. In a do-while loop there is a semicolon after `while (…)`. Output: 3, 9, 27, 81 and 243. -::: - -## Find the bug: halving - -::: übung l12-java-fehler -titel: Fix the halving -code: java -auftrag: The program reads a start number and keeps dividing it by 2 (whole-number division) with a do-while loop. Every result is output until **0** is reached. For 10 that is 5, 2, 1 and 0. But the 0 is missing. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: What value does `number` have after the 1 has been output? Does the loop run once more then? -tipp: The loop should keep going as long as the number is greater than 0: `while (number > 0);` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l12-java-laeuft-nicht -titel: Fix the doubling -code: java -auftrag: Starting at 1, the program should keep doubling as long as the number is less than 20: **1**, **2**, **4**, **8**, **16**. It outputs only the 1 and then stops. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: The first round still runs. The bug appears when the condition at the bottom is checked for the first time. -tipp: The condition needs `limit` with a small l: `} while (number < limit);` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Game: At least once? - -::: spiel frage -titel: Game: At least once? -intro: While or do-while? Ludwig shows you loops. Predict what happens. Six rounds. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: What is output? -- nothing -- [x] 10 -- 10 to 4 -> First do, then check: the body runs once, after that 11 < 5 is false. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: What is output? -- [x] nothing -- 10 -- 11 -> In a while loop the condition comes first. 10 < 5 is false, so nothing runs at all. - -runde: - int number = 200; - do { - number = number * 2; - } while (number < 100); - System.out.println(number); -frage: What is output? -- 200 -- [x] 400 -- 800 -> It is doubled once no matter what. After that 400 < 100 is false. - -runde: - int number = 30; - do { - number = number * 2; - System.out.println(number); - } while (number < 100); -frage: What is output? -- 60 -- [x] 60\n120 -- 60\n120\n240 -> After 60, 60 < 100 is true, so it goes on. After 120 it stops. - -runde: -frage: Which line ends a do-while loop in Java correctly? -- [x] `} while (i < 5);` -- `} while (i < 5)` -- `while (i < 5) {` -> After the `while (…)` of a do-while loop there is a semicolon. - -runde: -frage: What is a do-while loop typically used for? -- [x] repeating an input until it is valid -- counting from 1 to 10 -- swapping two values -> The question is asked at least once. Only after that do you know whether the input was valid. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the do-while loop only checks its condition after the inside. → Do first, check afterwards -- I can explain why the inside runs at least once. → At least one pass -- I can repeat an input until it is valid. → Typical use: repeat an input -- I can write a do-while loop in Java. → Now in Java -::: - -## Quiz - -::: quiz -? What does post-test loop mean? -→ Do first, check afterwards -- [ ] The condition is checked before every pass. -- [x] The condition is checked after every pass. -- [ ] The loop has no condition. -> The condition is in the foot, at the bottom, and is worked out after the inside. - -? The condition of a do-while loop is false from the start. How often does the inside run? -→ At least one pass -- [ ] Not at all -- [x] Exactly once -- [ ] Forever -> The inside runs first. Only then does the loop notice that it should stop. - -? You want to ask for a number from 1 to 10. Which condition goes in the foot? -→ Typical use: repeat an input -- [ ] `number >= 1 && number <= 10` -- [x] `number < 1 || number > 10` -- [ ] `number == 10` -> The loop repeats as long as the input is invalid, that is, less than 1 or greater than 10. - -? When is a do-while loop better than a while loop? -→ At least one pass -- [x] When the inside has to run at least once, e.g. for an input -- [ ] When the loop might not need to run at all -- [ ] When you want to count exactly to 10 - -? What comes at the end of a do-while loop in Java? -→ Now in Java -- [ ] } while (condition) { -- [x] } while (condition); -- [ ] } until (condition); -> A semicolon follows the condition. -::: diff --git a/web/lessons/en/13-for-schleife.md b/web/lessons/en/13-for-schleife.md deleted file mode 100644 index 720f8e2d..00000000 --- a/web/lessons/en/13-for-schleife.md +++ /dev/null @@ -1,337 +0,0 @@ ---- -titel: For loop -bereich: Basics -kurz: Count a fixed number of passes with Init, Condition and Step. ---- - -## Skills I will gain now - -::: kompetenzen -- name the three parts Init, Condition and Step of the for loop -- explain in which order the three parts run -- count forwards, backwards and in bigger steps with a for loop -- write a for loop in Java and explain its three fields -::: - -## Counting with a fixed plan - -In the while loop you already counted along: a start value before the loop, a condition in the head, a change inside. The **for loop** puts these three parts together in the head. That way you see at a glance how it counts. - -::: grafik l12-while-zu-for.svg animiert -The while loop becomes a for loop: init, condition and step move together into the head. -::: - -When you click a for loop, it has three fields on the right: - -- **Init:** `int i = 1` creates the counter variable. -- **Condition:** `i <= 5` says how long to count. -- **Step:** `i++` increases `i` by 1 after every pass. - -::: diagramm l12-eins-bis-fuenf.visustruct -A for loop that outputs the numbers from 1 to 5. -::: - -::: angeberwissen -Why is the counting variable almost always called `i`? In maths `i` has long stood for an index. And in FORTRAN, one of the first programming languages from 1957, all variables starting with I to N were automatically whole numbers. Programmers have not broken the habit to this day. -::: - -## In which order? - -The three parts run at different times: - -1. **Init** runs exactly once, right at the start. -2. **Condition** is checked before every pass. If it is false, the loop is finished. -3. After the inside comes the **Step**, then the condition again. - -::: grafik l12-for-ablauf.svg -Init only runs once. After that, condition, inside and step repeat. -::: - -So the for loop is a pre-test loop, like the while loop. Go through the example in the simulation with **Step** and watch how `i` changes. - -> Use the for loop when you know beforehand how often something should happen. If the end depends on something that only happens during the loop, for example an input, the while or do-while loop is better. - -## Example: sum from 1 to n - -A for loop is good for adding up numbers. Before the loop there is `int sum = 0`. In every pass the current number `i` is added. - -::: diagramm l12-summe.visustruct -With n = 4 the loop calculates 0 + 1 + 2 + 3 + 4. At the end, 10 is output. -::: - -## Other steps - -The step does not always have to be `i++`: - -- `i--` counts backwards, for example with Init `int i = 10` and Condition `i >= 1`. -- `i = i + 2` jumps in steps of two, for example 0, 2, 4, 6. - -Make sure that Init, Condition and Step fit together. With Init `int i = 1`, Condition `i >= 1` and Step `i++`, the condition never becomes false. - -::: übung l12-countdown -titel: Countdown -auftrag: Ask for a whole number `n`. Use a for loop to count backwards from `n` to 1 and output each number. Then output **Go!**. -test: 3 -> 3 | 2 | 1 | Go! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Go! -test: 1 -> 1 | Go! -braucht: forSchleife -tipp: This time the for loop counts backwards. Think about where it starts, when it stops and how it counts. -tipp: Init is `int i = n`, the condition `i >= 1` and the step `i--`. The output Go! goes below the loop, not inside it. -lösung: l12-countdown-loesung.visustruct -::: - -## Exercise: Times table - -::: übung l12-einmaleins -titel: Times table -auftrag: Ask for a number and output its times table from 1 to 10. Each line looks like this: **3 x 1 = 3**, **3 x 2 = 6** and so on. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: The loop counts from 1 to 10. In every pass you output one line of the table. -tipp: Inside, first calculate `int product = number * i`. Then output `number + " x " + i + " = " + product`. Remember the spaces inside the quotation marks. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Exercise: Fix the sum - -::: übung l16-summe -titel: Fix the sum -auftrag: The structure chart should add up all numbers from 1 to n. So with n = 4 the result should be 1 + 2 + 3 + 4 = **10**. But it outputs 6. - Do a desk check or use **Step** and fix the mistake. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Go through the loop with n = 4 in your head or with **Step**. Which numbers are really added? -tipp: Look at the last value of i the loop runs with. With n = 4, i = 4 must be added too. -lösung: l16-summe-loesung.visustruct -::: - -## Now in Java - -The sum from 1 to n looks like this in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Up to which number?"); -int n = scanner.nextInt(); -int sum = 0; -for (int i = 1; i <= n; i++) { - sum = sum + i; -} -System.out.println(sum); -``` - -The round brackets after `for` hold the three fields of the for loop, separated by semicolons: - -| Field | In Java | Meaning | -|---|---|---| -| Init | `int i = 1` | `i` starts at 1. | -| Condition | `i <= n` | The loop runs as long as this is true. | -| Step | `i++` | After every pass `i` gets 1 bigger. | - -`i++` is short for `i = i + 1`. To count backwards, use `i--`. - -::: übung l13-java-quadrate -titel: Square numbers in Java -code: java -auftrag: Write a Java program that reads a whole number `n` and uses a for loop to output the square numbers from 1 to `n`, each on its own line. For 3 that is 1, 4 and 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: The loop counts `i` from 1 to `n`. The square of `i` is `i * i`. -tipp: `for (int i = 1; i <= n; i++) { … }` and in the body `System.out.println(i * i);`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Fill in the gaps: for - -::: lückentext -titel: Counting up and down -auftrag: The first loop adds up the numbers from 1 to 5, the second counts down from 10 to 0. Fill in the missing words and symbols. -```java -int sum = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - sum = sum + i; -} -System.out.println("Sum: " + sum); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -``` -erklärung: The round brackets hold the start value, the condition and the step, separated by semicolons. `i++` counts up, `i--` counts down. When counting down to 0 the condition is `i >= 0`. -::: - -## Find the bug: times table - -::: übung l13-java-fehler -titel: Fix the times table -code: java -auftrag: The program asks for a times table and should output it from 1 times to 10 times, for 7 that is 7, 14, … up to 70. But the 70 is missing. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: How often does the loop run? Count which values `i` takes. -tipp: `i` should also take the value 10: `i <= 10` instead of `i < 10`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l13-java-laeuft-nicht -titel: Fix the stairs -code: java -auftrag: Ludwig climbs 5 steps, each 20 cm high. The program should output **Height: 100 cm**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Height: 100 cm -braucht: forSchleife -tipp: `height` is used in a calculation, but where is the variable created? And at what height does Ludwig start? -tipp: Create `height` before the loop: `int height = 0;` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program hides **exactly one mistake**, and the bomb is ticking. Read what the program should do and tap the wrong line before time runs out. If the parts of a line have a border, tap exactly the wrong part, for example just `i++`. Eight rounds, 25 seconds each. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Should output 1, 2 and 3. -fehler: 2 -besser: System.out.println(i); -> The semicolon at the end of the statement is missing. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Should output 1 to 5. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> The three fields of the for loop are separated by semicolons, not commas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Should count backwards from 10 to 1. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> With `i++`, `i` keeps growing and the condition `i >= 1` stays true: an endless loop. To count backwards, use `i--`. - -runde: - int sum = 0; - for (int i = 1; i <= 4; i++) { - sum = i; - } - System.out.println(sum); -frage: Should output the sum 1 + 2 + 3 + 4 = 10. -fehler: 3 -stelle: i -besser: sum = sum + i; -> `sum = i` overwrites the sum in every pass. In the end it only holds 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Baaa"); - } -frage: Should output Baaa exactly five times. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> From 0 up to and including 5 there are six passes. If you start at 0, use `<`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Should output 1, 2 and 3. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> Java tells upper and lower case apart: `System` is written with a capital S. - -runde: - int number = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(number + " x " + i + " = " + number * number); - } -frage: Should output the 7 times table: 7 x 1 = 7, 7 x 2 = 14 and so on. -fehler: 3 -stelle: number * number -besser: System.out.println(number + " x " + i + " = " + number * i); -> `number * number` is always 49. It has to be `number * i`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Should output the even numbers 2, 4, 6, 8 and 10. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> `i + 2` only calculates and stores nothing. For `i` to really grow, you need `i = i + 2`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the three parts Init, Condition and Step of the for loop. → Counting with a fixed plan -- I can explain in which order the three parts run. → In which order? -- I can count forwards, backwards and in bigger steps with a for loop. → Other steps -- I can write a for loop in Java and explain its three fields. → Now in Java -::: - -## Quiz - -::: quiz -? How often does the Init of a for loop run? -→ In which order? -- [x] Exactly once -- [ ] Before every pass -- [ ] After every pass -> Init creates the counter variable once at the start. - -? Init `int i = 0`, Condition `i < 3`, Step `i++`. Which values does i have inside the loop? -→ Counting with a fixed plan -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> With i = 3 the condition is false, so the inside does not run any more. - -? Init `int i = 2`, Condition `i <= 10`, Step `i = i + 2`. How often does the inside run? -→ Other steps -- [ ] 4 times -- [x] 5 times -- [ ] 10 times -> i takes the values 2, 4, 6, 8 and 10. - -? When does a for loop fit best? -→ Counting with a fixed plan -- [x] When you know beforehand how often to repeat -- [ ] When you keep asking until an input is valid -- [ ] When only a single value is checked - -? What does `i++` mean in a for loop? -→ Counting with a fixed plan -- [ ] i is doubled. -- [x] i gets 1 bigger. -- [ ] i is output. -> `i++` is short for `i = i + 1`. -::: diff --git a/web/lessons/en/14-verschachteln.md b/web/lessons/en/14-verschachteln.md deleted file mode 100644 index f9641fb1..00000000 --- a/web/lessons/en/14-verschachteln.md +++ /dev/null @@ -1,305 +0,0 @@ ---- -titel: Nesting -bereich: Basics -kurz: Combine branches inside loops and loops inside loops. ---- - -## Skills I will gain now - -::: kompetenzen -- put a branch inside a loop -- put a loop inside another loop -- explain that the inner loop runs all the way through in every pass of the outer one -- write nested loops and branches in Java -::: - -## Building blocks inside each other - -You now know all the important building blocks: sequence, branch, switch and three kinds of loops. They only get really powerful together. - -Every path and every loop body is a sequence itself. You may put any element there, including more branches and loops. This is called **nesting**. - -> To do this, simply drag an element onto the placeholder ø inside a loop or a path. - -## A branch inside a loop - -The loop goes through all the numbers, and the branch decides for each single number whether something happens. That way you can count, for example, how many even numbers there are from 1 to n. - -::: diagramm l13-gerade-zaehlen.visustruct -In every pass the branch checks with i % 2 == 0 whether i is even. Only then is count increased by 1. The false path stays empty. -::: - -With n = 7 these are the numbers 2, 4 and 6, so 3 is output. - -## Exercise: Count even inputs - -::: übung l13-gerade-eingaben -titel: Count even inputs -auftrag: Ask for exactly **five** whole numbers, one after another. Then output how many of them were even. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Doing the same thing five times means: loop. In every pass a number is read in and checked. -tipp: A for loop from 1 to 5. Inside, first comes the input `input: int number "Enter a number"`, below it a branch with `number % 2 == 0`. In the true path you increase `count` by 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## A loop inside a loop - -If one loop sits inside another, the **inner loop runs all the way through in every pass of the outer one**. With this you can build patterns of rows and columns. - -::: diagramm l13-dreieck.visustruct -The outer loop counts the lines. The inner one adds as many stars to the text as the line number says. With n = 3 you get a triangle of 1, 2 and 3 stars. -::: - -With `String text = ""` every line starts empty. `text = text + "*"` adds a star. Only when the line is finished is it output. - -Experienced programmers give the counter variables the short names `i` and `j`: `i` outside, `j` inside. Then it looks like this, here with a small times table: - -::: grafik l13-verschachtelt-tabelle.svg animiert -The outer loop counts the lines with `i`, the inner one counts the numbers in a line with `j`. On every new line, `j` starts again at 1. -::: - -## Exercise: Rectangle - -::: übung l13-rechteck -titel: Rectangle -auftrag: Ask for a width and a height. Output a rectangle made of `#`: as many lines as the height, and in each line as many `#` as the width. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: You need two loops inside each other: one for the lines and inside it one for the characters of a line. -tipp: Build it like the triangle. The difference: the inner loop always counts up to `width`, not up to the line number. The outer loop counts up to `height`. -tipp: The outline: inputs `width` and `height`. Outer for loop `int line = 1`, `line <= height`, `line++`. Inside it first `String text = ""`, then the inner for loop `int column = 1`, `column <= width`, `column++` with `text = text + "#"`, and below the inner loop `output: text`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Keep track - -With nested diagrams, the drawing helps you: whatever is further inside is indented and surrounded by its loop or path. - -- Read from the outside in: what repeats? What is decided in every pass? -- Give counter variables meaningful names such as `line` and `column`. Two loops must not change the same counter variable. -- Go through an example in the simulation with **Step** and watch the variables. - -::: angeberwissen -This is exactly what the structure chart was invented for. Shneiderman asked himself: if we are supposed to do without GOTO, why not do without the arrows in the flowchart as well? The result: no arrow spaghetti, and every block stays nicely in its pen. -::: - -## Now in Java - -Counting the even numbers looks like this in Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Up to which number?"); -int n = scanner.nextInt(); -int count = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - count++; - } // end if -} // end for -System.out.println(count); -``` - -What is nested in the structure chart is nested in curly brackets in Java. Every level is indented four spaces further. If your code gets messy, the **Indent** button at the top of the Code area helps. - -With many closing brackets `}` it is easy to lose track: which bracket belongs to which block? A comment after it tells you, for example `} // end if` and `} // end for`. This also helps when you carry on later. - -`count++` is short for `count = count + 1`. - -::: übung l14-java-treppe -titel: Stairs of stars -code: java -auftrag: Write a Java program that reads the number of steps and outputs stairs made of stars. For 3 steps that is `*`, `**` and `***`, each step on its own line. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: An outer loop counts the steps. In each step an inner loop builds a text of stars. -tipp: In the outer loop: `String line = "";`, then `for (int j = 1; j <= i; j++) { line = line + "*"; }` and after that `System.out.println(line);`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Fill in the gaps: nesting - -::: lückentext -titel: Rectangle of stars -auftrag: The program outputs a rectangle of 3 lines with 4 stars each. Fill in the missing words and symbols. -```java -for (int line = 1; line <= 3; line++) { - String text = [[""]]; - [[for]] (int column = 1; column [[<=]] 4; [[column++ | column += 1 | column = column + 1]]) { - text = text [[+]] "*"; - } - System.out.[[println]](text); -[[}]] -``` -erklärung: The inner loop builds one line of 4 stars, the outer loop repeats that three times. Each line starts with an empty text `""`. The last bracket closes the outer loop. -::: - -## Find the bug: divisible by 3 - -::: übung l14-java-fehler -titel: Fix the counting -code: java -auftrag: The program should count how many numbers from 1 to `n` are divisible by 3 and output the result **once**. For 10 that is just **Count: 3**. But it outputs far too many lines. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l14-java-fehler-start.visustruct -test: 10 -> Count: 3 -test: 3 -> Count: 1 -test: 2 -> Count: 0 -braucht: forSchleife, verzweigung -tipp: Look at the curly brackets: is the output inside the loop or after it? -tipp: Move the line `System.out.println("Count: " + count);` after the closing bracket of the loop. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l14-java-laeuft-nicht -titel: Fix the even numbers -code: java -auftrag: The program should output the even numbers from 1 to 10: **2**, **4**, **6**, **8**, **10**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: The bug is right inside, in the output. What is the loop’s counter variable called? -tipp: The counter variable is `i` with a small i: `System.out.println(i);` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Inside and outside - -::: spiel frage -titel: Game: Inside and outside -intro: Ludwig has put building blocks inside each other. Read from the outside in and predict what happens. Six rounds. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: How many stars are output? -- 3 -- 5 -- [x] 6 -> The inner loop runs completely in each of the 3 runs of the outer loop: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Which line is output fourth? -- 1 4 -- [x] 2 1 -- 2 2 -> First j runs through for i = 1: 1 1, 1 2, 1 3. Then j starts again at 1, now with i = 2. - -runde: - int count = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - count++; - } - } - System.out.println(count); -frage: What is output? -- [x] 3 -- 10 -- 4 -> The branch only counts 3, 6 and 9. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("even"); - } else { - System.out.println(i); - } - } -frage: What is output? -- 1\n2\n3\n4 -- [x] 1\neven\n3\neven -- even\neven -> For every number the branch decides again: odd numbers themselves, even ones as a word. - -runde: - for (int i = 1; i <= 3; i++) { - String line = ""; - for (int j = 1; j <= i; j++) { - line = line + "*"; - } - System.out.println(line); - } -frage: What is output? -- ***\n***\n*** -- [x] *\n**\n*** -- ***\n**\n* -> The inner loop runs up to i. That's why every line gets one star longer. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: What happens? -- 1 to 3 is output three times. -- 1 to 3 is output once. -- [x] Java reports an error. -> Two loops inside each other need two different counter variables, for example `row` and `column`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can put a branch inside a loop. → A branch inside a loop -- I can put a loop inside another loop. → A loop inside a loop -- I can explain that the inner loop runs all the way through in every pass of the outer one. → A loop inside a loop -- I can write nested loops and branches in Java. → Now in Java -::: - -## Quiz - -::: quiz -? The outer loop runs 3 times, the inner one 4 times. How often does the inside of the inner loop run in total? -→ A loop inside a loop -- [ ] 7 times -- [x] 12 times -- [ ] 4 times -> In each of the 3 outer passes, the inner loop runs 4 times, so 3 · 4 = 12. - -? How can you tell whether a number is even? -→ A branch inside a loop -- [ ] `number / 2 == 0` -- [x] `number % 2 == 0` -- [ ] `number == 2` -> % gives the remainder of a division. For even numbers, the remainder when dividing by 2 is zero. - -? There is a branch inside a for loop. How often is the condition of the branch checked? -→ A branch inside a loop -- [ ] Once -- [x] Once per pass of the loop -- [ ] Only if it is true -> The branch is part of the inside and runs in every pass. - -? How can you tell in Java what belongs to a loop? -→ Now in Java -- [ ] By the colour -- [x] By the curly brackets and the indentation -- [ ] By the semicolons -::: diff --git a/web/lessons/en/15-arrays.md b/web/lessons/en/15-arrays.md deleted file mode 100644 index f2a73902..00000000 --- a/web/lessons/en/15-arrays.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -titel: Arrays -bereich: Basics -kurz: Store many values under one name, reach them with the index and go through them with a loop. ---- - -## Skills I will gain now - -::: kompetenzen -- create an array with values or with `new int[5]` -- explain that the index starts at 0 and that the last index is `length - 1` -- go through and fill an array with a for loop -- calculate the sum and the maximum of an array -- create an array in Java and go through it with a loop -::: - -## Many values under one name - -Imagine you want to store the points from five tests. With five variables `points1` to `points5` that quickly gets confusing. An **array** is a row of slots that all have the same name and the same data type. - -You create an array with a statement. After the data type you write square brackets `[]`: - -``` -int[] numbers = {2, 4, 6, 8, 10} -String[] names = {"Ada", "Ben", "Cem"} -``` - -The values in the curly brackets go straight into the slots. You can also create an empty array with a fixed number of slots: - -``` -int[] points = new int[5] -String[] names = new String[3] -``` - -With `new int[5]` all five slots hold zeros at first, with `new String[3]` empty texts. - -## The index starts at 0 - -Every slot has a number, the **index**. Counting starts at **0**. So with `int[] numbers = {2, 4, 6, 8, 10}`: - -- `numbers[0]` is 2 -- `numbers[1]` is 4 -- `numbers[4]` is 10 - -::: grafik l14-array.svg -Five slots with the indices 0 to 4. The index is above the slot, the value inside it. -::: - -**Why start at 0?** In computer science the index is not “which slot” but the **distance from the start**. The first slot is right at the start, so 0 steps away. The second is 1 step away, the third 2 steps. You know this from a lift: the ground floor is **0**, and the first floor is one level above it. - -This gives you a rule worth remembering: with 5 slots the **last index is 4**, always one less than the number of slots. - -::: angeberwissen -Counting from 0 is pretty old. The programming language C from 1972 already works like this: the computer knows the address of the first slot, and for `numbers[i]` it simply calculates “start plus i slots further”. With i = 0 it stays at the start, which saves a calculation. Java, Python and JavaScript took this over. By the way, I count my horns from 0 as well: horn 0 on the left, horn 1 on the right. -::: - -With the index you read a value or write a new one into it: - -``` -output: numbers[0] -numbers[1] = 99 -``` - -> An array with 5 slots has the indices 0 to 4. `numbers[5]` does not exist. The simulation then reports an invalid expression. - -## The length of an array - -`numbers.length` tells you how many slots an array has. With five values it is 5. So the **last** index is always `numbers.length - 1`: - -``` -output: numbers.length -output: numbers[numbers.length - 1] -``` - -The second line outputs the last value, however long the array is. VisuStruct also understands `numbers.length()`. - -::: übung l14-erster-letzter -titel: First and last value -auftrag: Create the array `int[] values = {4, 8, 15, 16, 23, 42}`. Then output on three lines: the first value, the last value and the number of values. - For the last value, use the length and do not simply write the index 5. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Counting starts at 0, so the first slot has the index 0. And what is the index of the last slot? -tipp: The first value is `values[0]`. The last one is `values[values.length - 1]`. The number of values is `values.length`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Go through an array with a loop - -An array shows its strength together with a **for loop**. The counter variable `i` runs from 0 to the last index and is used as the index: - -``` -int i = 0 -i < numbers.length -i++ -``` - -In the first pass `i` is 0, in the last one 4. Because the condition is `i < numbers.length`, the loop fits any length. - -::: diagramm l14-array-durchlaufen.visustruct -The for loop outputs all five values one after another. Under Variables in the simulation, watch i count from 0 to 4. -::: - -This is also how you fill an empty array with inputs. As the target of the input you write the slot `names[i]`: - -::: diagramm l14-namen-eingeben.visustruct -Three names are asked for and written into the slots 0, 1 and 2. -::: - -::: übung l14-rueckwaerts -titel: Print backwards -auftrag: Create an array for 4 whole numbers and read in the 4 numbers with a loop. Then output them in **reverse** order, each on its own line. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: You need two loops: one for reading in from front to back and one for outputting from back to front. -tipp: You create the array with `int[] numbers = new int[4]`. The input is `input: numbers[i] "Enter a number"`. For the second loop you start at `int i = numbers.length - 1`, check `i >= 0` and count down with `i--`. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr** from Vienna was a famous Hollywood film star in the 1940s. In her spare time she liked to invent things. In 1942, together with the composer George Antheil, she received a patent for a radio link that an enemy should not be able to jam: sender and receiver jump together through a list of **88 frequencies**, as many as a piano has keys. The list was punched into a paper strip like the roll of a self-playing piano. Both go through the same list in the same order, just like your loop goes through an array with `i`. Anyone who listens to or jams only one frequency gets almost nothing. - -This method, **frequency hopping**, is used today in Bluetooth, for example. She did not invent it all by herself; there were earlier ideas. But her patent is seen as an important forerunner, and in 1997 she received an award for it. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), actress and inventor, 1944 (publicity photo: [unknown](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), public domain). -::: - -## Sum and maximum - -Two tasks come up with arrays again and again: - -- **Sum:** You start with `sum = 0` and add every value in the loop. -- **Maximum:** First you remember the value in slot 0 as the largest so far. In the loop you check every value. If it is larger, it becomes the new maximum. - -::: diagramm l14-summe-maximum.visustruct -Sum and maximum in one single pass. The maximum starts with points[0] and not with 0, so that it is also right for negative numbers. -::: - -::: übung l14-summe-max -titel: Sum and maximum -auftrag: Read 5 whole numbers into an array. Then output **Sum: …** and on the next line **Maximum: …**. -test: 3, 9, 2, 9, 1 -> Sum: 24 | Maximum: 9 -test: 10, 20, 30, 40, 50 -> Sum: 150 | Maximum: 50 -test: -5, -2, -9, -1, -3 -> Sum: -20 | Maximum: -1 -braucht: forSchleife, verzweigung -tipp: Go through the array with a loop. Add every value to the sum and remember the largest value seen so far. -tipp: Calculate the sum and the maximum in variables of their own and only output them at the end, e.g. with `output: "Sum: " + sum`. If your maximum starts at 0, the third test fails. -tipp: The outline: create the array and read it in with a loop. Then `int sum = 0` and `int max = numbers[0]`. A second loop calculates `sum = sum + numbers[i]`, and a branch `numbers[i] > max` sets `max = numbers[i]` in its true branch. Finally the two outputs. -lösung: l14-summe-max-loesung.visustruct -::: - -## Now in Java - -Going through an array looks like this in Java: - -```java editor -int[] numbers = {2, 4, 6, 8, 10}; -for (int i = 0; i < numbers.length; i++) { - System.out.println(numbers[i]); -} -``` - -- `int[]` means “array of whole numbers”. The values are in curly brackets. -- You create an empty array with 5 slots with `new int[5]`. -- `numbers[i]` is the slot with index `i`, `numbers.length` is the length. - -If you output the whole array, that is `System.out.println(numbers);`, Java does not show the numbers. You only see a text like `[I@1b6d3586`. This is the **reference**, the place where the array is stored in memory. `Arrays.toString(numbers)` shows the content: `[2, 4, 6, 8, 10]`. For this you write `import java.util.Arrays;` at the very top. - -::: übung l15-java-noten -titel: Sum of grades in Java -code: java -auftrag: Create the array `grades` in Java with the values 2, 3, 1 and 4. Add up all grades with a for loop and output **Sum: 10**. -test: - -> Sum: 10 -braucht: forSchleife -tipp: Create `int sum = 0;` before the loop. The loop runs from 0 to `grades.length - 1`. -tipp: `int[] grades = {2, 3, 1, 4};`, then `for (int i = 0; i < grades.length; i++) { sum = sum + grades[i]; }` and finally `System.out.println("Sum: " + sum);`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Fill in the gaps: arrays - -::: lückentext -titel: Finding the maximum -auftrag: The program looks for the largest value in the array. Fill in the missing words and symbols. -```java -[[int]][] values = {3, 7, 1, 9, 4}; -int max = values[0]; -[[for]] (int i = 1; i < values.[[length]]; i++) { - if (values[i] [[>]] max) { - max = values[i]; - } -} -System.out.println("Maximum: " + max); -``` -erklärung: `int[]` is an array of whole numbers, `values.length` is its length. `max` starts with the first value, and the loop compares all the others with it. Output: **Maximum: 9** -::: - -## Find the bug: temperatures - -::: übung l15-java-fehler -titel: Fix the highest temperature -code: java -auftrag: In January the temperatures -5, -2, -8 and -3 degrees were measured. The program should output the highest, so **Highest temperature: -2**. But it claims 0 degrees, although it was never that warm. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l15-java-fehler-start.visustruct -test: - -> Highest temperature: -2 -braucht: forSchleife, verzweigung -tipp: What value does `max` start with? Is any of the temperatures greater than this start value? -tipp: `max` has to start with a value from the array: `int max = temperatures[0];` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l15-java-laeuft-nicht -titel: Add up the points -code: java -auftrag: The array `points` holds 4, 7, 2 and 5. The program should add them all up and output **Sum: 18**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Sum: 18 -braucht: forSchleife -tipp: The Code area underlines the wrong word in red. How do you write the length of an array? -tipp: `length` is written all in small letters: `i < points.length` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake** to do with arrays, and the bomb is ticking. Tap the wrong line before time runs out. If the parts of a line have a border, tap exactly the wrong part. Six rounds, 30 seconds each. -zeit: 30 - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - for (int i = 0; i <= numbers.length; i++) { - System.out.println(numbers[i]); - } -frage: Should output all five values. -fehler: 2 -stelle: i <= numbers.length -besser: for (int i = 0; i < numbers.length; i++) { -> With `<=`, i runs up to 5. There is no slot `numbers[5]`. - -runde: - String[] names = {"Ada", "Ben", "Cem"}; - System.out.println(names[1]); -frage: Should output the first name, Ada. -fehler: 2 -stelle: names[1] -besser: System.out.println(names[0]); -> Counting starts at 0. `names[1]` is already Ben. - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - System.out.println(numbers[numbers.length]); -frage: Should output the last value, 10. -fehler: 2 -stelle: numbers[numbers.length] -besser: System.out.println(numbers[numbers.length - 1]); -> The last index is always one less than the length. - -runde: - int[] points = {3, 9, 2}; - int sum = 0; - for (int i = 0; i < points.length; i++) { - sum = points[i]; - } - System.out.println(sum); -frage: Should output the sum 14. -fehler: 4 -stelle: points[i] -besser: sum = sum + points[i]; -> Like this every value overwrites the one before, and at the end sum only holds 2. - -runde: - int[] points = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < points.length; i++) { - if (points[i] > max) { - max = points[i]; - } - } - System.out.println(max); -frage: Should output the maximum -2. -fehler: 2 -stelle: 0 -besser: int max = points[0]; -> None of the numbers is greater than 0, so max would stay 0. That's why the maximum starts with the first slot. - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - for (int i = numbers.length; i >= 0; i--) { - System.out.println(numbers[i]); - } -frage: Should output the values backwards, from 10 to 2. -fehler: 2 -stelle: int i = numbers.length -besser: for (int i = numbers.length - 1; i >= 0; i--) { -> Backwards you start at the last index, and that is `numbers.length - 1`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create an array with values or with `new int[5]`. → Many values under one name -- I can explain that the index starts at 0 and that the last index is `length - 1`. → The index starts at 0 -- I can go through and fill an array with a for loop. → Go through an array with a loop -- I can calculate the sum and the maximum of an array. → Sum and maximum -- I can create an array in Java and go through it with a loop. → Now in Java -::: - -## Quiz - -::: quiz -? What does `output: numbers[2]` output with `int[] numbers = {5, 10, 15, 20}`? -→ The index starts at 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Counting starts at 0: numbers[0] is 5, numbers[1] is 10, numbers[2] is 15. - -? An array has 8 slots. Which index is the last one? -→ The index starts at 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> The last index is always length - 1. - -? Which condition fits a for loop that goes through all values of `numbers` and starts at `int i = 0`? -→ Go through an array with a loop -- [x] i < numbers.length -- [ ] i <= numbers.length -- [ ] i > numbers.length -> With <= the loop would also read numbers[length], and that slot does not exist. - -? What should the maximum start with before the loop begins? -→ Sum and maximum -- [ ] Always with 0 -- [x] With the first value of the array -- [ ] With the length of the array -> If it starts with 0, then with only negative numbers the result would be 0, although 0 is not in the array at all. - -? What does `output: numbers.length` output with `int[] numbers = {5, 10, 15, 20}`? -→ Many values under one name -- [ ] 3 -- [x] 4 -- [ ] 20 -> length is the number of slots, not the last index and not the last value. - -? Which line creates an array with three numbers in Java? -→ Now in Java -- [x] int[] numbers = {1, 2, 3}; -- [ ] int numbers = [1, 2, 3]; -- [ ] array numbers = (1, 2, 3); -::: diff --git a/web/lessons/en/16-zweidimensionale-arrays.md b/web/lessons/en/16-zweidimensionale-arrays.md deleted file mode 100644 index 11264a18..00000000 --- a/web/lessons/en/16-zweidimensionale-arrays.md +++ /dev/null @@ -1,317 +0,0 @@ ---- -titel: Two-dimensional arrays -bereich: Basics -kurz: Store values in rows and columns, like the seats in a cinema, and go through them with two nested loops. ---- - -## Skills I will gain now - -::: kompetenzen -- create a 2D array and explain what the two numbers mean -- read and write a slot with a row and a seat -- tell `seats.length` and `seats[0].length` apart -- explain in which order two nested loops visit the slots -- create and go through a two-dimensional array in Java -::: - -## A cinema as a table - -A cinema has several **rows**, and every row has several **seats**. For every seat we want to remember whether its ticket has already been sold. That is a yes-or-no question, so the data type `boolean` fits: `true` means sold, `false` means free. - -A normal array is one single row of slots. For the cinema we need a **table** with rows and columns. That is a **two-dimensional array**, 2D array for short. You write two pairs of square brackets for it: - -``` -boolean[][] seats = new boolean[3][5] -``` - -That gives 3 rows with 5 seats each, so 15 slots. At the start every slot holds `false`: all seats are free. - -::: grafik kino-saal.svg -The first index is the row, the second the seat. Both are counted from 0. -::: - -## Reach a slot - -For a slot you now need **two** indices: first the row, then the seat. - -``` -seats[1][2] = true -``` - -Now seat 2 in row 1 is sold. Reading works the same way: `seats[1][2]` is now `true`. - -You can also ask for the size: - -- `seats.length` is the number of **rows**, here 3. -- `seats[0].length` is the number of **seats** in row 0, here 5. - -::: diagramm kino-verkaufen.visustruct -Three tickets are sold. After that, the diagram outputs the size of the cinema and whether row 1, seat 2 is sold. Watch under Variables in the simulation: seats is shown row by row. -::: - -> Just like with a normal array, there is no slot `seats[3][0]`, because the rows are called 0, 1 and 2. The simulation then reports an invalid expression. - -## Two loops inside each other - -To look at **all** seats, you need two for loops inside each other: - -- The **outer loop** counts the row: `row` runs from 0 to 2. -- The **inner loop** counts the seat: `seat` runs from 0 to 4. - -::: grafik kino-schleifen.svg -Blue is the outer loop, orange the inner one. The numbers show the order in which the seats come up. -::: - -For every row, the inner loop runs **all the way** through once. Only when `seat` has visited all five seats does the outer loop move `row` on by one. Then `seat` starts at 0 again. That way all 3 · 5 = 15 seats come up exactly once. - -The conditions are `row < seats.length` and `seat < seats[row].length`. That way the loops fit a cinema of any size. - -::: diagramm kino-saalplan.visustruct -The seating plan: for every row, a line of X (sold) and O (free) is put together and output. Go through it with Step and watch how seat keeps starting again from the beginning while row only slowly counts on. -::: - -::: angeberwissen -Every phone photo is a 2D array! A photo with 4000 · 3000 pixels has 3000 rows with 4000 slots each, so 12 million pixels. Every slot holds the colour of one dot. When you make a photo brighter, the phone runs over all the pixels with two nested loops. My profile picture, by the way, has only one slot: brown. -::: - -## Exercise: Count free seats - -::: übung kino-frei -titel: Count free seats -auftrag: In the start diagram three tickets have already been sold. Use two nested loops to count how many seats are still **free**, and output e.g. `Free: 12`. -start: kino-frei-start.visustruct -test: - -> Free: 12 -braucht: forSchleife, verzweigung -tipp: Just like for the seating plan, you go over all seats with two loops. Instead of outputting something, you count. -tipp: Before the loops, create `int free = 0`. A seat is free if `seats[row][seat]` is false. The condition for that is `!seats[row][seat]`. -lösung: kino-frei-loesung.visustruct -::: - -## Exercise: Sell a ticket - -::: übung kino-karte -titel: Sell a ticket -auftrag: The start diagram asks for a row and a seat. If the seat is already sold, output `Already sold`. Otherwise mark it as sold and output e.g. `Sold: row 0, seat 4`. -start: kino-karte-start.visustruct -test: 1, 2 -> Already sold -test: 0, 4 -> Sold: row 0, seat 4 -test: 2, 0 -> Sold: row 2, seat 0 -braucht: verzweigung -tipp: First check whether the seat is sold. Depending on the answer, something different happens. -tipp: You do not need a loop here. A branch with the condition `seats[row][seat]` is enough. In the false path you set the slot to `true`. -lösung: kino-karte-loesung.visustruct -::: - -## Exercise: Times table grid - -::: übung kino-einmaleins -titel: Times table grid -auftrag: Create `int[][] table = new int[10][10]` and fill it with the times tables up to 10 using two loops. Then ask for two numbers from 1 to 10 and read the result from the table, e.g. `3 · 4 = 12`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: First two nested loops fill the table; after that you read only one single slot. -tipp: The indices run from 0 to 9, but the numbers from 1 to 10. That is why the slot `table[i][j]` holds the value `(i + 1) * (j + 1)`, and for 3 · 4 you read `table[a - 1][b - 1]`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Now in Java - -The cinema looks like this in Java: - -```java editor -boolean[][] seats = new boolean[3][5]; -seats[0][2] = true; -seats[1][1] = true; -seats[1][2] = true; -System.out.println("Rows: " + seats.length); -System.out.println("Seats per row: " + seats[0].length); -System.out.println("Row 1, seat 2 sold? " + seats[1][2]); -``` - -- Two pairs of square brackets `[][]` stand for a table: first the row, then the seat. -- `seats.length` is the number of rows, `seats[0].length` the number of seats in one row. -- With fixed values you write every row in its own curly brackets: `int[][] t = {{1, 2}, {3, 4}};` - -::: übung l16-java-punkte -titel: Add up the points -code: java -auftrag: Three players have played two rounds each. Create the table `points` in Java with the rows {3, 5}, {4, 1} and {2, 2}. Add up all points with two nested for loops and output **Sum: 17**. -test: - -> Sum: 17 -braucht: forSchleife -tipp: The outer loop goes through the rows, the inner one through the seats of a row. -tipp: `int[][] points = {{3, 5}, {4, 1}, {2, 2}};` and in the inner loop `sum = sum + points[i][j];`. The inner loop runs up to `points[i].length`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Fill in the gaps: tables - -::: lückentext -titel: Adding up all fields -auftrag: The program adds up all numbers in the table. Fill in the missing words and symbols. -```java -[[int]][][] grid = {{1, 2, 3}, {4, 5, 6}}; -int sum = 0; -for (int r = 0; r < grid.[[length]]; r++) { - for (int c = 0; c < grid[r].[[length]]; c++) { - sum = sum [[+]] grid[r][c]; - } -} -System.out.println("Sum: " + sum); -``` -erklärung: `int[][]` is a table. `grid.length` is the number of rows (2), `grid[r].length` the number of fields in row `r` (3). Output: **Sum: 21** -::: - -## Find the bug: points - -::: übung l16-java-fehler -titel: Fix player 2 -code: java -auftrag: In the table `points` each row stands for one player. The program should add up the points of player 2 (row 1), so **Player 2: 11**. Instead it reports an error. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l16-java-fehler-start.visustruct -test: - -> Player 2: 11 -braucht: forSchleife -tipp: In `points[a][b]`, `a` is the row and `b` the place in the row. Which number stands for the row of player 2? -tipp: The indices are swapped: `points[1][j]` instead of `points[j][1]`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l16-java-laeuft-nicht -titel: Read the score -code: java -auftrag: In the table `points` each row is a player and each column a round. The program should output player 2’s points in round 1, so **Player 2, round 1: 4**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Player 2, round 1: 4 -braucht: anweisung -tipp: The cells `[1][0]` are right. Look at the name of the table. -tipp: The table is called `points` with a small p: `points[1][0]` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which seat? - -::: spiel frage -titel: Game: Which seat? -intro: Ludwig is selling cinema tickets. First the row, then the seat, both from 0. Seven rounds. - -runde: - boolean[][] seats = new boolean[3][5]; - System.out.println(seats.length); -frage: What is output? -- [x] 3 -- 5 -- 15 -> `seats.length` is the number of rows. - -runde: - boolean[][] seats = new boolean[3][5]; - System.out.println(seats[0].length); -frage: What is output? -- 3 -- [x] 5 -- 15 -> `seats[0]` is row 0. Its length is the number of seats in this row. - -runde: - int[][] table = new int[4][6]; -frage: How many slots does the table have? -- 10 -- [x] 24 -- 35 -> 4 rows with 6 seats each: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: What is output? -- 2 -- [x] 3 -- 4 -> Row 1 is `{3, 4}`, and seat 0 in it is the 3. - -runde: - boolean[][] seats = new boolean[3][5]; - seats[3][0] = true; -frage: What happens? -- The first seat in row 3 is sold. -- The first seat in the last row is sold. -- [x] There is an error, because the rows are called 0, 1 and 2. -> Just like with a normal array, the last index is one less than the length. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int sum = 0; - for (int row = 0; row < t.length; row++) { - for (int seat = 0; seat < t[row].length; seat++) { - sum = sum + t[row][seat]; - } - } - System.out.println(sum); -frage: What is output? -- 6 -- 15 -- [x] 21 -> The two loops visit all six slots: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Two loops go through the cinema `new boolean[3][5]`. Which slot comes right after `seats[0][4]`? -- `seats[0][5]` -- [x] `seats[1][0]` -- `seats[1][4]` -> Row 0 is done. The outer loop counts on, and the seat starts again at 0. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a 2D array and explain what the two numbers mean. → A cinema as a table -- I can read and write a slot with a row and a seat. → Reach a slot -- I can tell `seats.length` and `seats[0].length` apart. → Reach a slot -- I can explain in which order two nested loops visit the slots. → Two loops inside each other -- I can create and go through a two-dimensional array in Java. → Now in Java -::: - -## Quiz - -::: quiz -? How many slots does `boolean[][] seats = new boolean[4][6]` have? -→ A cinema as a table -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 rows with 6 seats each: 4 · 6 = 24. - -? What is in all slots after `new boolean[3][5]`? -→ A cinema as a table -- [ ] true -- [x] false -- [ ] Nothing, the slots are empty -> A new boolean array is filled with false. In the cinema that means: all seats are free. - -? Two nested loops run over 3 rows with 5 seats. How often does the inside of the **inner** loop run? -→ Two loops inside each other -- [ ] 3 times -- [ ] 8 times -- [x] 15 times -> For each of the 3 rows the inner loop runs 5 times: 3 · 5 = 15. - -? Match what each expression means in the cinema. -→ Reach a slot -= seats.length -> Number of rows -= seats[0].length -> Number of seats in row 0 -= seats[2][4] -> Row 2, seat 4 -= seats[1][0] = true -> Seat 0 in row 1 is sold - -? What does `seats.length` give for `new boolean[3][5]`? -→ Reach a slot -- [x] 3, the number of rows -- [ ] 5, the number of seats -- [ ] 15, all seats together -::: diff --git a/web/lessons/en/17-zeichenketten.md b/web/lessons/en/17-zeichenketten.md deleted file mode 100644 index f856513e..00000000 --- a/web/lessons/en/17-zeichenketten.md +++ /dev/null @@ -1,526 +0,0 @@ ---- -titel: Strings -bereich: Basics -kurz: Work with text: read single characters, cut out parts, search, compare and split. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the characters of a String are also counted from 0 -- work with `length()` and `charAt(i)` -- tell a `char` from a String and use the character code with `(int)` and `(char)` -- cut a part out of a text with `substring` -- use `indexOf`, `contains`, `toUpperCase` and `equals` -- go through a text character by character with a loop -- split a text into a String array with `split` -- read a text in Java and compare it with `equals` -- use more methods such as `lastIndexOf`, `replace`, `compareTo` and `Integer.parseInt` -- split a text from a file into lines with `split("\n")` -- look up a method in the Java API and read its description -::: - -## Text is a row of characters - -You already know `String`: `String name = "Ludwig"`. In computer science such a text is called a **string**, because the characters hang one after another like beads on a string. Every character has a place with an index, just like in an array. Here, too, **counting starts at 0**: the first character is 0 steps away from the start. - -::: grafik zk-zeichen.svg -The nine characters of “Billygoat” with their indices 0 to 8. -::: - -A String comes with **methods**. You write the name of the variable, a dot and the method: - -- `word.length()` gives the number of characters, here 9. -- `word.charAt(0)` gives the character with the index 0, here `'B'`. - -> With Strings you write `length()` **with** brackets, with arrays `length` **without**. Sadly, that is just how Java is. - -Just like in an array, the last character has the index `length() - 1`. - -## A single character: char - -Java has its own data type for a single character: **char**, short for *character*. A `char` goes in **single** quotation marks, a String in double ones: - -- `'C'` is a `char`: exactly one character. -- `"C"` is a String: a text that is only one character long. -- A `char` always holds exactly one character. There is no empty `char` like `''`, but there is an empty String `""`. - -`charAt` gives you such a character from a text: - -``` -char first = word.charAt(0) -char last = word.charAt(word.length() - 1) -``` - -You compare two `char` values with `==`: `word.charAt(0) == 'B'` is `true`. - -Behind every character there is a number, its **character code**. Which number belongs to which character is listed in the ASCII table: `'A'` has the code 65, `'B'` 66, `'C'` 67 and so on up to `'Z'` with 90. With `(int)` you get the code of a character, with `(char)` a code turns back into a character: - -``` -int code = (int) 'C' -code = code + 1 -char next = (char) code -``` - -After that `code` is 68 and `next` is `'D'`. This is how you shift a letter in the alphabet, and that is exactly what you will need later for the Caesar cipher. - -## Cut out parts - -With `substring` you cut a part out of the text: - -- `word.substring(0, 5)` gives the characters from index 0 **up to just before** index 5, so `"Billy"`. -- `word.substring(5)` gives everything from index 5 to the end, so `"goat"`. - -The end is **not** included. Handy: `substring(0, 5)` gives exactly 5 characters. - -::: diagramm zk-zeichen.visustruct -All the methods from this lesson in one example. Go through it in the simulation and compare every output with the picture. -::: - -## Search and compare - -More methods you often need: - -| Method | Meaning | Example with `"Billygoat"` | -|---|---|---| -| `indexOf("goat")` | Where does the text start? | 5 | -| `indexOf("x")` | not found | -1 | -| `contains("lly")` | Does the text appear? | true | -| `toUpperCase()` | all capitals | BILLYGOAT | -| `toLowerCase()` | all small letters | billygoat | -| `equals("Billygoat")` | same text? | true | - -> In Java you compare two Strings with `equals`, not with `==`. Two single characters (`char`), on the other hand, you compare with `==`, e.g. `word.charAt(i) == 'e'`. - -::: angeberwissen -Try `"Billygoat".equals("billygoat")`. The answer is false! For a computer, B and b are completely different characters. Inside, every character is stored as a number: B is 66 and b is 98. This numbering is called ASCII and dates from 1963. Baah, so for a computer Ludwig and ludwig are two different goats. I am the one with the capital L. -::: - -## Character by character - -With a for loop you go through a text character by character. The index `i` runs from 0 to `word.length() - 1`, just like with an array: - -::: diagramm zk-zaehlen.visustruct -Counts how often the letter e appears. In the simulation, try “cheese” and watch i and count. -::: - -## Split with split - -Often several pieces of information sit in one single line, separated by a character, e.g. `"Ludwig;billy goat;7"`. With `split` you cut the line apart at this character. The result is a **String array**: - -``` -String[] parts = line.split(";") -``` - -After that, `parts[0]` is `"Ludwig"`, `parts[1]` is `"billy goat"` and `parts[2]` is `"7"`. With `parts.length` you find out how many parts there are. - -::: diagramm zk-split.visustruct -The line is split at the semicolon, and every part is output with its index. -::: - -> CSV files, which you know from spreadsheets, are built the same way: one line per record, the values separated by a comma or semicolon. - -## Exercise: Initials - -::: übung zk-initialen -titel: Initials -auftrag: Ask for a first name and a last name and output the initials. So for Ludwig Billygoat that is `L. B.` -test: Ludwig, Billygoat -> L. B. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: The initial is the first letter of a name. Which method gives the character at a particular place? -tipp: `firstName.charAt(0)` gives the first letter. The output is then `firstName.charAt(0) + ". " + lastName.charAt(0) + "."` -lösung: zk-initialen-loesung.visustruct -::: - -## Exercise: Backwards - -::: übung zk-rueckwaerts -titel: Backwards -auftrag: Ask for a word and output it backwards. Ludwig becomes `giwduL`. -test: Ludwig -> giwduL -test: Anna -> annA -test: a -> a -braucht: forSchleife -tipp: Go through the word character by character, but from back to front, and build a new text as you go. -tipp: Create `String backwards = ""`. The loop starts at the last index `word.length() - 1` and counts down to 0 with `i--`. In every pass you add `word.charAt(i)` at the end. -tipp: The outline: input `word`, then `String backwards = ""`. For loop with start `int i = word.length() - 1`, condition `i >= 0` and step `i--`. Inside it `backwards = backwards + word.charAt(i)`. Below the loop `output: backwards`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Exercise: Count words - -::: übung zk-woerter -titel: Count words -auftrag: Ask for a sentence and output how many words it has, e.g. `Words: 4` for “Ludwig is a goat”. The words are separated by exactly one space. -test: Ludwig is a goat -> Words: 4 -test: Hello -> Words: 1 -test: I like goats -> Words: 3 -braucht: anweisung -tipp: There is always a space between the words. Which method splits a text at a character? -tipp: Split the sentence into a String array with `sentence.split(" ")`. Its length is the number of words. -tipp: The whole program has three boxes: the input `sentence`, then `String[] words = sentence.split(" ")` and finally `output: "Words: " + words.length`. -lösung: zk-woerter-loesung.visustruct -::: - -## Now in Java - -The methods in this lesson already are Java. A whole program with a text looks like this: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("What is your name?"); -String name = scanner.next(); -System.out.println("Hello " + name.toUpperCase() + "!"); -System.out.println("Your name has " + name.length() + " letters."); -``` - -- `scanner.next()` reads one word, that is text up to the next space. For numbers you keep using `scanner.nextInt()`. -- Text goes in **double** quotes `"Ludwig"`, a single character in **single** quotes `'L'`. -- `length()`, `toUpperCase()` and the other methods always have round brackets after them, even when nothing is inside. -- You compare two texts with `equals`. Every letter counts: `"Ludwig".equals("ludwig")` is false. - -::: übung l17-java-passwort -titel: Check the password -code: java -auftrag: Write a Java program that asks for the password. If it is **Ludwig**, it outputs **Welcome!**, otherwise **Wrong password**. - Mind upper and lower case: `ludwig` is wrong. -test: Ludwig -> Welcome! -test: ludwig -> Wrong password -test: Geißbock -> Wrong password -braucht: verzweigung -tipp: Read the password with `scanner.next()` into a String variable. Then compare it in a selection. -tipp: The condition is `input.equals("Ludwig")`. In Java, `==` does not reliably compare texts. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Fill in the gaps: texts - -::: lückentext -titel: Examining a word -auftrag: Fill in the missing methods and words. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("A word?"); -[[String]] word = scanner.next(); -System.out.println("Length: " + word.[[length]]()); -System.out.println("Capitals: " + word.[[toUpperCase]]()); -System.out.println("First letter: " + word.[[charAt]](0)); -if (word.[[equals]]("Ludwig")) { - System.out.println("Hello Ludwig!"); -} -``` -erklärung: `length()` counts the characters, `toUpperCase()` makes everything upper case, `charAt(0)` gives the first character. You compare texts with `equals`, not with `==`. -::: - -## Find the bug: initials - -::: übung l17-java-fehler -titel: Fix the initials -code: java -auftrag: The program reads a first name and a last name and should output the initials. For Ludwig Geißbock that is **L. G.** But it outputs **u. e.** - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: At which index does Java start counting? -tipp: The first character has the index 0: `first.charAt(0)` and `last.charAt(0)`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l17-java-laeuft-nicht -titel: Count the letters -code: java -auftrag: The program should output the first letter and the length of **Ludwig**, so **L has 6 letters**. But it doesn’t run, because two methods are spelled wrong. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L has 6 letters -braucht: anweisung -tipp: Method names are camelCase too: they start small, and every further word starts with a capital. -tipp: Correct are `name.charAt(0)` with a capital A and `name.length()` all small. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Even more methods - -A String can do much more. You will often need these methods too: - -| Method | Meaning | Example | Result | -|---|---|---|---| -| `lastIndexOf("l")` | Where is the last l? | `"Billygoat".lastIndexOf("l")` | 3 | -| `isEmpty()` | Is the text empty? | `"".isEmpty()` | true | -| `equalsIgnoreCase(…)` | same text, whether upper or lower case? | `"Billygoat".equalsIgnoreCase("BILLYGOAT")` | true | -| `replace(old, new)` | replaces every occurrence | `"Billygoat".replace("Billy", "Nanny")` | Nannygoat | -| `repeat(n)` | the text n times in a row | `"Baa".repeat(3)` | BaaBaaBaa | -| `concat(…)` | adds text to the end, like `+` | `"Billy".concat("goat")` | Billygoat | -| `compareTo(…)` | Which comes first in the alphabet? | `"Anna".compareTo("Ben")` | -1 | - -`compareTo` returns a number: **negative** if the text comes earlier in the alphabet, **0** if both are the same, and **positive** if it comes later. You can use it to sort names. - -Two methods do not belong to a text but to a class. That is why the class name comes first: - -- `Integer.parseInt("7")` turns the text "7" into the number 7. You can calculate with it. -- `String.valueOf(7)` turns the number 7 into the text "7". - -::: diagramm zk-mehr.visustruct -All the new methods in one example. Go through it in the simulation and compare every output with the table. -::: - -## Text from a file - -Programs often get their text from a **file**. Princess Zora has written Ludwig a letter. It is ready as the file `letter.txt`: - -::: datei letter.txt -Dear Ludwig, -the fox has locked me in his tower. -The door has a lock with a secret word. -You can only find the word with Java. -Please help me! -Yours, Princess Zora -::: - -These lines read the whole file into a String: - -``` -import java.nio.file.*; - -String letter = Files.readString(Path.of("letter.txt")); -``` - -You will learn exactly how reading works later, in a lesson of its own about files. For now this is enough: afterwards the whole letter is in `letter`, with all its lines. - -At the end of every line there is an invisible character for the **line break**. In Java you write it as `"\n"`. So `letter.split("\n")` splits the letter into its lines. - -::: übung l17-java-brief -titel: Where is the fox? -code: java -auftrag: The start code already reads the letter. Split it into lines and output **Lines:** and the number of lines. Then find the line that contains **fox** and output **Fox in line** and its number. The first line has the number 1. -start: l17-java-brief-start.visustruct -test: - -> Lines: 6 | Fox in line 2 -braucht: forSchleife, verzweigung -tipp: `String[] lines = letter.split("\n");` splits the letter. Then a for loop goes through all the lines. -tipp: In the loop you check `lines[i].contains("fox")`. The index starts at 0, so you output `(i + 1)`. You need the brackets so that Java calculates instead of adding 1 to the text. -lösung: l17-java-brief-loesung.visustruct -::: - -## The Java API - -Nobody knows all methods by heart, not even professionals. They look them up in the **Java API**. API stands for Application Programming Interface. It means the description of everything Java already brings along. - -You can find all methods of String here: [String in the Java API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Scroll down to the table **Method Summary**. Each row describes one method: - -| Column | Example | Meaning | -|---|---|---| -| Modifier and Type | `int` | What the method returns | -| Method | `lastIndexOf(String str)` | Name and parameters with their data type | -| Description | Returns the index within this string of the last occurrence … | What the method does | - -::: ludwig -The page is very long. Press Ctrl+F (on a Mac ⌘+F) and search for the name of the method to get there at once. -::: - -Look up these methods. They are not in this lesson: - -::: quiz -? Look up `strip()`. What does the method do? -- [ ] It removes all spaces in the text. -- [x] It removes the spaces at the beginning and the end. -- [ ] It cuts off the last character. -> Like `trim()`. But `strip()` also knows special spaces from other writing systems. - -? Look up `isBlank()`. What does `" ".isBlank()` return? -- [x] true -- [ ] false -- [ ] 3 -> isBlank checks whether the text is empty or only contains spaces. `" ".isEmpty()`, on the other hand, would be false. - -? Look up `toCharArray()`. Which data type does the method return? -- [ ] String -- [ ] String[] -- [x] char[] -> An array with all characters of the text, one element for each character. - -? Look up `indexOf` with two parameters. What does `"Billygoat".indexOf("l", 3)` return? -- [ ] 2 -- [x] 3 -- [ ] -1 -> The search only starts at index 3. The first l from there is at index 3. - -? Look up `startsWith`. Which data type does the method return? -- [x] boolean -- [ ] int -- [ ] String -> The column “Modifier and Type” says boolean: the answer is true or false. -::: - -## Game: Rescue the princess - -Now you help Ludwig. The fox has locked Princess Zora in his tower, and the gate only opens with a secret word. - -::: spiel prinzessin -titel: Game: Rescue the princess -intro: On the way to the tower Ludwig comes to **six stations**. Each one has a piece of Java code, and a number comes out. `alphabet.charAt(number)` turns the number into a letter that goes into the **crossword**. Solve the crossword, and the yellow squares spell the secret word for the gate. - -station: At the moat - String name = " Zora "; - int number = name.trim().length(); -frage: Which number is in `number`? -zahl: 4 -feld: 5 1 -tipp: `trim()` cuts off the spaces at the front and the back. Then count the characters. -> After `trim()` only `"Zora"` is left, and that is 4 characters. - -station: In the fox forest - String place = "Fox lair"; - int number = place.length(); -frage: Which number is in `number`? -zahl: 8 -feld: 4 4 -tipp: `length()` counts every character, the space too. -> F-o-x, the space and l-a-i-r make 8 characters. - -station: At the goat rock - String text = "Ludwig the goat"; - int number = text.indexOf(" "); -frage: Which number is in `number`? -zahl: 6 -feld: 4 6 -tipp: `indexOf` returns the position of the first space. The L has index 0. -> L u d w i g has the indexes 0 to 5, so the first space is at index 6. - -station: On the tower stairs - String word = "Princess"; - int number = word.indexOf("s", 7); -frage: Which number is in `number`? Look up `indexOf(String str, int fromIndex)` in the Java API. -zahl: 7 -feld: 6 6 -tipp: The search starts at index 7, and index 7 itself counts. Write the indexes under the letters. -> P r i n c e s s has the indexes 0 to 7. Searching from index 7, the first “s” is right at 7. - -station: In front of the fox den - int number = "Zora".compareTo("Zoe"); -frage: Which number is in `number`? -zahl: 13 -feld: 1 9 -tipp: `compareTo` looks for the first position where the texts differ and subtracts the character codes. `'r'` is 114, `'e'` is 101. -> “Zo” is the same, then `'r'` meets `'e'`: 114 − 101 = 13. - -station: At the tower gate - int number = Integer.parseInt("1" + "1") / 5; -frage: Which number is in `number`? -zahl: 2 -feld: 6 5 -tipp: First the texts are joined, then they become a number. With `int`, division drops the remainder. -> `"1" + "1"` is `"11"`, `parseInt` makes 11 of it, and 11 / 5 is 2 for whole numbers. - -kreuzwort: You already have the blue letters. Fill the other squares with Java terms. Click a clue to jump to its word. -- → 1 3 BOOLEAN: Data type for true or false -- → 4 1 STRING: Data type for text -- → 6 5 CHAR: Data type for a single character -- ↓ 1 6 LENGTH: Method that counts the characters of a string -- ↓ 2 1 ELSE: The “otherwise” part of a branch -- ↓ 3 3 BREAK: Jumps straight out of a loop -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: Ludwig stands in front of the gate. The lock compares your word with `equals`. Enter the secret word. - String word = "___"; - if (word.equals(secretWord)) { - gate.open(); - } -ende: Zora is free, and the fox has run off. The secret word was `BREAK`: with `break` you get out of any loop, and Zora gets out of the tower. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the characters of a String are also counted from 0. → Text is a row of characters -- I can work with `length()` and `charAt(i)`. → Text is a row of characters -- I can tell a `char` from a String and use the character code with `(int)` and `(char)`. → A single character: char -- I can cut a part out of a text with `substring`. → Cut out parts -- I can use `indexOf`, `contains`, `toUpperCase` and `equals`. → Search and compare -- I can go through a text character by character with a loop. → Character by character -- I can split a text into a String array with `split`. → Split with split -- I can read a text in Java and compare it with `equals`. → Now in Java -- I can use more methods such as `lastIndexOf`, `replace`, `compareTo` and `Integer.parseInt`. → Even more methods -- I can split a text from a file into lines with `split("\n")`. → Text from a file -- I can look up a method in the Java API and read its description. → The Java API -::: - -## Quiz - -::: quiz -? What does `"Ludwig".charAt(1)` give? -→ Text is a row of characters -- [ ] L -- [x] u -- [ ] d -> Counting starts at 0: L has the index 0, u the index 1. - -? What is `'C'`? -→ A single character: char -- [x] a `char`, that is, exactly one character -- [ ] a String -- [ ] a variable called C -> Single quotation marks stand for a single character, a `char`. `"C"` in double ones would be a String. - -? `'A'` has the character code 65. What does `(char) 67` give? -→ A single character: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 is A, 66 is B, 67 is C. With `(char)` the code turns back into a character. - -? What does `"Structure".substring(0, 6)` give? -→ Cut out parts -- [x] Struct -- [ ] Structu -- [ ] tructu -> The characters with the indices 0 to 5. The end 6 is not included. - -? A word has 7 characters. Which index does the last character have? -→ Text is a row of characters -- [ ] 7 -- [x] 6 -- [ ] 8 -> Just like with an array: always one less than the length. - -? How do you compare two Strings for the same content in Java? -→ Search and compare -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Match each method to what it gives for `"Billygoat"`. -→ Search and compare -= length() -> 9 -= charAt(0) -> B -= indexOf("goat") -> 5 -= substring(5) -> goat - -? Which condition checks in Java whether `input` contains the text Ludwig? -→ Now in Java -- [ ] input = "Ludwig" -- [ ] input == 'Ludwig' -- [x] input.equals("Ludwig") -> You compare texts with equals. Single quotes are only for a single character. - -? What does `Integer.parseInt("12") + 1` return? -→ Even more methods -- [ ] "121" -- [x] 13 -- [ ] an error message -> parseInt turns the text into a number. After that Java calculates as usual. -::: diff --git a/web/lessons/en/18-aufruf-und-aussprung.md b/web/lessons/en/18-aufruf-und-aussprung.md deleted file mode 100644 index 9b977298..00000000 --- a/web/lessons/en/18-aufruf-und-aussprung.md +++ /dev/null @@ -1,482 +0,0 @@ ---- -titel: Call and break -bereich: Basics -kurz: Split big tasks into subprograms and leave loops early. ---- - -## Skills I will gain now - -::: kompetenzen -- split a big task into smaller problems -- insert a call and build a subprogram in a tab of its own -- pass values to a subprogram with parameters -- hand back a return value with return and store it when calling -- explain why a subprogram cannot change a number but can change an array -- explain what a Break does and why it sits in a branch -- end a loop with a Break or through its condition -- recognise a method in Java and leave a loop with `break` -::: - -## Split big tasks - -Long structure charts quickly get confusing. That is why you split a big task into **smaller problems**. Every smaller problem gets a name of its own and a structure chart of its own, a **subprogram**. - -A quiz, for example, has three parts: greet, ask questions, show the result. The main program only names these three parts: - -::: diagramm l15-hauptprogramm.visustruct -The main program is made of just three calls. What happens in each part is in a structure chart of its own. -::: - -That way you see at a glance how the program is built. The details are somewhere else. - -## The call - -A **call** is a box with double vertical lines on the left and right. It means: run the subprogram with this name here, then carry on. - -- You drag **Call** from the Elements area and type the name into it, e.g. `showGreeting()`. -- The round brackets at the end show that it is a subprogram. That is how you write it in Java, Python and JavaScript, too. -- You build the subprogram itself as a structure chart of its own in a new tab. As the title you type the same name. - -::: diagramm l15-unterprogramm.visustruct -The subprogram showGreeting() as a structure chart of its own. -::: - -> **In the simulation:** When the simulation reaches a call, it looks among the open tabs for the structure chart with this title and runs it. Then it carries on in the main program. While the subprogram is running, the call box stays highlighted. A subprogram like this one, with only a name as its title, shares its variables with the main program. You will soon learn how a subprogram gets variables of its own. If there is no matching tab, the simulation skips the call and shows a note. - -::: angeberwissen -Why does your teacher always say “method” in Java and never “function” or “procedure”? Because in Java every subprogram has to belong to a class, and the subprograms of a class are called methods. The difference still exists, though: if a method hands back a result, it is really a function. If it has `void` in front, it hands back nothing and is really a procedure. Java just keeps it simple and calls both methods. So do I: my method is called Munching. -::: - -## Exercise: Add a call - -::: übung l15-titel -titel: Greeting with a call -auftrag: Imagine the subprogram `showTitle()` already exists. Build the main program: first it calls `showTitle()`. Then it asks for a name and outputs **Hello** and the name. - So when Ada is typed in, **Hello Ada** appears. -test: Ada -> Hello Ada -test: Ben -> Hello Ben -braucht: aufruf -tipp: The main program has three parts: the call, the input and the output. -tipp: Drag a Call from the Elements area right to the top and type `showTitle()` into it. Below it come the input `input: String name "What is your name?"` and the output. -lösung: l15-titel-loesung.visustruct -::: - -## Pass values: parameters - -Often a subprogram should work with values that are only known when it is called. Then it gets a **header line** as its title: - -``` -void showSum(int a, int b) -``` - -- `void` means: the subprogram does not hand back a result. -- `showSum` is the name. -- The brackets hold the **parameters**: variables with a data type that get their values when the subprogram is called. You separate several of them with commas. - -::: diagramm l15-zeige-summe.visustruct -The subprogram with the header line as its title. It calculates with a and b as if they were normal variables. -::: - -In the call box you write the values in the brackets, e.g. `showSum(3, 4)`. The first value goes into `a`, the second into `b`. Instead of numbers you can also use variables and calculations such as `showSum(x, x + 1)`. - -::: diagramm l15-zeige-summe-haupt.visustruct -The main program calls showSum twice with different values. Open both diagrams and start the simulation here. -::: - -> **Local variables:** The parameters and all variables created in the subprogram belong only to the subprogram. It gets **copies** of the values; more on that below under call by value. During the call, the simulation only shows the variables of the subprogram. - -## Hand back a result: return - -A subprogram can also hand back a result, the **return value**. Then the header line has the data type of the result instead of `void`: - -``` -int square(int x) -``` - -The statement `return result` hands back the value and ends the subprogram straight away. When you call it, you store the result in a variable: after `int q = square(5)`, `q` holds the value 25. - -::: diagramm l15-quadrat.visustruct -The subprogram square calculates and hands back the result with return. -::: - -::: diagramm l15-quadrat-haupt.visustruct -The main program stores the return value in q. Open both diagrams and try the simulation. -::: - -> A subprogram with a return value has to end with `return`. If the return is missing, the simulation reports an error. - -In the **code view**, the header line becomes a Java method (`public static int square(int x)`), a `def` in Python and a `function` in JavaScript. If the subprograms are open in other tabs, they appear in the code together with the main program. - -## Exercise: Calculate the area - -::: übung l15-flaeche -titel: Calculate the area -auftrag: Build two diagrams. The subprogram `int area(int a, int b)` hands back the area of a rectangle, that is a times b. The main program asks for the length and the width, calls `area` and outputs **Area:** and the result. - With 3 and 4, **Area: 12** appears. -test: 3, 4 -> Area: 12 -test: 5, 5 -> Area: 25 -test: 7, 0 -> Area: 0 -braucht: aufruf -tipp: You build two diagrams: a subprogram that only calculates and hands back the result, and a main program for input and output. -tipp: Open a new tab with **+** and give it the title `int area(int a, int b)`. One statement is enough inside: `return a * b`. In the main program you type `int f = area(length, width)` into the call box. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Copy or original: call by value and call by reference - -What happens if a subprogram changes its parameter? That depends on **what** is passed. - -**Call by value:** With `int`, `double`, `boolean`, `char` and `String`, the subprogram gets a **copy** of the value. If it changes its parameter, the caller's variable stays as it was. - -**Call by reference:** With an **array**, the subprogram does not get a copy but a reference to the same array. If it changes a slot, the slot is changed for the caller too. The header line for this looks like this: - -``` -void clear(boolean[] seats) -``` - -::: grafik uebergabe.svg -At the top, doubleIt gets a copy of number. At the bottom, row and seats point to the same array. -::: - -Try out both. Open the three diagrams and start the simulation in the main program: - -::: diagramm uebergabe-verdopple.visustruct -doubleIt only changes its copy x. -::: - -::: diagramm uebergabe-leeren.visustruct -clear sets all seats to false, for example when a showing is cancelled. -::: - -::: diagramm uebergabe-haupt.visustruct -number is still 5 after the call. The seats in row, on the other hand, are free after the call. -::: - -> If you want to get a number back from a subprogram, use `return`, e.g. `number = doubleIt(number)` with the header line `int doubleIt(int x)`. An array, on the other hand, can be changed by the subprogram directly. - -::: angeberwissen -Strictly speaking, Java only knows call by value. But with an array, the whole array is not copied, only its **address** in memory. With the copied address, the subprogram finds the same array. It is as if I gave you a copy of my locker key: the key is copied, but the hay in the locker only exists once. -::: - -## Exercise: Bonus points - -::: übung uebergabe-bonus -titel: Bonus points -auftrag: The main program calls `bonus(points)` and then outputs all the points. Build the subprogram `void bonus(int[] points)` that increases every score in the array by 1. Instead of 3, 5 and 8 you then see **4**, **6** and **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: The main program is already finished. You only build the subprogram in a new tab. -tipp: Open a new tab with **+** and the title `void bonus(int[] points)`. Inside, a for loop runs over all slots and calculates `points[i] = points[i] + 1`. You do not need a return, because the array is changed directly. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## The break - -Sometimes a loop should end **early**, in the middle of its body. That is what the **Break** is for. It leaves the loop it is in straight away. The program carries on with the first box after the loop. In Java, Python and JavaScript this is called `break`. - -You recognise the Break by the point on its left edge. You can write a short comment into the box, e.g. `Leave the loop`. It appears in the code as a comment after `break`. - -A Break almost always sits in a **branch**: the loop is only left if a condition is met. - -A typical case is the **endless loop with a Break**. The loop itself has no condition. It runs until the Break is reached: - -::: diagramm l15-endlos-aussprung.visustruct -The loop keeps asking for a number. With 0 it jumps out, otherwise it adds the number to the sum. -::: - -Without a Break, an endless loop would really never end. - -## Break in the simulation - -The simulation runs the Break like `break`: it leaves the innermost loop and carries on after it. If a Break is outside every loop, the subprogram ends; in the main program, the whole program ends. `return` does the same. - -Often you can do without a Break altogether: you write the stop condition straight into the loop. That is usually even clearer. - -## Exercise: Sum until 0 - -::: übung l15-bis-null -titel: Sum until 0 -auftrag: Rebuild the program “Sum until 0” **without** a Break. It keeps asking for whole numbers until someone types 0. Then it outputs **Sum:** and the sum of all the numbers typed in. -test: 3, 4, 0 -> Sum: 7 -test: 0 -> Sum: 0 -test: 10, -2, 5, 0 -> Sum: 13 -tipp: Without a Break, the condition of the loop itself has to check whether 0 was typed in. -tipp: Ask for the first number before the loop. The while loop runs with the condition `number != 0`. In the body you add the number to the sum and then ask for the next number. For the second input you only write `input: number "…"`, because `number` already exists. -lösung: l15-bis-null-loesung.visustruct -::: - -## Now in Java - -In Java a subprogram is called a **method**. The square from above looks like this: - -```java -public static int square(int x) { - int result = x * x; - return result; -} -``` - -The main program calls the method by its name and passes the value in round brackets: - -```java -int q = square(number); -System.out.println("The square is " + q); -``` - -- In the header, what the method returns (`int`) comes before the name. If it returns nothing, it says `void`. -- The parameters go in the round brackets with their data type: `(int x)`. You separate several with commas. -- In the Code area you write every method in its own tab, just as every subprogram has its own structure chart. -- In Java the exit is called `break`. With `while (true)` you build a loop that only ends through `break`. - -::: übung l18-java-kasse -titel: Till with break -code: java -auftrag: Write a till in Java. It keeps asking for a price in whole euros. At 0 it leaves the loop with `break`. Then it outputs how many items there were and what they cost altogether. - For 3, 4 and then 0 you see **Items: 2** and **Total: 7**. -test: 3, 4, 0 -> Items: 2 | Total: 7 -test: 0 -> Items: 0 | Total: 0 -test: 10, 2, 5, 0 -> Items: 3 | Total: 17 -braucht: endlosschleife, aussprung -tipp: You need two variables that start at 0 before the loop: one for the sum and one for the count. -tipp: Inside `while (true) { … }` you read the price. Right after that you check `if (price == 0) { break; }`. Only after that do you add the price to the sum and increase the count by 1. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Fill in the gaps: methods and break - -::: lückentext -titel: Method and exit -auftrag: Fill in the missing words. At the top is the method that calculates a square. Below is the main program that calls it. In the Code area both are in tabs of their own. -```java -public static [[int]] square(int x) { - [[return]] x * x; -} -``` -```java -int number = 1; -while ([[true]]) { - int q = [[square]](number); - if (q > 50) { - [[break]]; - } - System.out.println(q); - number = number + 1; -} -``` -erklärung: `int` before the method name means: the method returns a whole number, with `return`. If a method returns nothing, it says `void` there. `while (true)` runs endlessly until `break` leaves the loop. Output: 1, 4, 9, 16, 25, 36 and 49. -::: - -## Find the bug: guessing - -::: übung l18-java-fehler -titel: Fix the try counter -code: java -auftrag: In this guessing game the secret number is 7. The program keeps asking for a guess until 7 comes, then it outputs the number of tries. For 3, 5 and 7 that was 3 tries, but the program says **Tries: 2**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Tries: 3 -test: 7 -> Tries: 1 -test: 1, 2, 3, 7 -> Tries: 4 -braucht: endlosschleife, aussprung -tipp: What happens with the right guess? Is it still counted before `break` leaves the loop? -tipp: Count first, then check: `tries = tries + 1;` belongs before the `if` with the `break`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Game: What comes back? - -::: spiel frage -titel: Game: What comes back? -intro: Ludwig calls methods and jumps out of loops. Predict what is output. Seven rounds. - -runde: - public static int square(int x) { - return x * x; - } - - int q = square(5); - System.out.println(q); -frage: What is output? -- 5 -- 10 -- [x] 25 -> The call puts 5 into x, and return gives back 5 · 5. - -runde: - public static void showSum(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - showSum(x, x + 1); -frage: What is output? -- [x] 5 -- 23 -- 3 -> The first value 2 goes into a, the second value 3 into b. In Java, `a + b` calculates with numbers as usual. - -runde: -frage: What does a method return when `void` stands in front of its name? -- a whole number -- [x] nothing -- always 0 -> `void` means: no return value. With `int` there, a whole number comes back. - -runde: - public static void doubleIt(int x) { - x = x * 2; - } - - int number = 5; - doubleIt(number); - System.out.println(number); -frage: What is output? -- [x] 5 -- 10 -- 0 -> Call by value: doubleIt gets a copy. number stays 5. - -runde: - public static void clear(boolean[] seats) { - for (int i = 0; i < seats.length; i++) { - seats[i] = false; - } - } - - boolean[] row = {true, true}; - clear(row); - System.out.println(row[0]); -frage: What is output? -- true -- [x] false -> With an array, row and seats point to the same array. The caller sees the change too. - -runde: - int sum = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - sum = sum + i; - } - System.out.println(sum); -frage: What is output? -- [x] 6 -- 10 -- 55 -> At i = 4, `break` jumps out of the loop straight away. Only 1 + 2 + 3 have been added. - -runde: - int number = 1; - while (true) { - number = number * 3; - if (number > 20) { - break; - } - } - System.out.println(number); -frage: What is output? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Only 27 is greater than 20, then the endless loop ends with break. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can split a big task into smaller problems. → Split big tasks -- I can insert a call and build a subprogram in a tab of its own. → The call -- I can pass values to a subprogram with parameters. → Pass values: parameters -- I can hand back a return value with return and store it when calling. → Hand back a result: return -- I can explain why a subprogram cannot change a number but can change an array. → Copy or original: call by value and call by reference -- I can explain what a Break does and why it sits in a branch. → The break -- I can end a loop with a Break or through its condition. → Break in the simulation -- I can recognise a method in Java and leave a loop with `break`. → Now in Java -::: - -## Quiz - -::: quiz -? What does a call box with the text `showResult()` mean? -→ The call -- [ ] The program ends here. -- [x] The subprogram showResult() runs here, and then the program carries on. -- [ ] The word showResult() is output here. - -? Where does the program carry on after a Break? -→ The break -- [ ] At the start of the loop -- [x] At the first box after the loop -- [ ] Right at the start of the program -> The Break leaves the loop it is in. In Java, Python and JavaScript it is called break. - -? Why does a Break usually sit in a branch? -→ The break -- [x] So that the loop is only left if a condition is met -- [ ] Because otherwise a Break cannot be saved -- [ ] Because a branch is a loop itself -> Without a branch, the loop would be left in the very first pass. - -? Where does the simulation find the subprogram for a call `showResult()`? -→ The call -- [ ] It has to be in the same structure chart. -- [x] In an open tab with the title showResult() -- [ ] The simulation cannot run subprograms. -> Build every subprogram in a tab of its own and give it the name from the call as its title. - -? The subprogram has the header line `void showSum(int a, int b)`. Which call fits? -→ Pass values: parameters -- [ ] showSum() -- [x] showSum(3, 4) -- [ ] int s = showSum(3, 4) -> Two parameters need two values. And `void` means nothing comes back that you could store. - -? After `int q = square(5)`, q holds 25. What is at the end of the subprogram square? -→ Hand back a result: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> With return the subprogram hands the value back to the call. An output would only show it. - -? `void doubleIt(int x)` calculates `x = x * 2`. The main program has `int number = 5` and then the call `doubleIt(number)`. What value does number have afterwards? -→ Copy or original: call by value and call by reference -- [x] 5 -- [ ] 10 -- [ ] 0 -> Call by value: doubleIt only changed a copy of number. - -? `void clear(boolean[] seats)` sets all slots to false. What is true for the array row in the main program after `clear(row)`? -→ Copy or original: call by value and call by reference -- [ ] It is unchanged, because the subprogram gets a copy. -- [x] All slots are false, because seats and row are the same array. -- [ ] The array is deleted. -> Call by reference: an array is passed as a reference. The caller sees changes to the slots too. - -? What is a subprogram called in Java? -→ Now in Java -- [ ] Class -- [x] Method -- [ ] Loop -> In Java a subprogram is a method, for example the `main` method. Depending on its kind, it is also called a procedure or a function. - -? Many building blocks have a second name in textbooks. Match each term from VisuStruct to its other name. -→ Now in Java -= Branch -> Conditional statement -= Switch -> Multiple selection -= Loop -> Iteration -= Subprogram -> Method -> Both names mean the same thing. If you know one of them, you understand the other as well. - -? What is written in the header of a Java method that returns nothing? -→ Hand back a result: return -- [ ] int -- [x] void -- [ ] return -> void means “empty”: the method does something but returns no value. -::: diff --git a/web/lessons/en/19-suchen-und-sortieren.md b/web/lessons/en/19-suchen-und-sortieren.md deleted file mode 100644 index 40a8b852..00000000 --- a/web/lessons/en/19-suchen-und-sortieren.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -titel: Searching and sorting -bereich: Basics -kurz: Use playing cards to understand how linear search, binary search and bubble sort work, and why some methods are much faster. ---- - -## Skills I will gain now - -::: kompetenzen -- explain how linear search goes through an array -- build a linear search as a structure chart -- explain why binary search only works with sorted values -- explain why binary search is much faster with many values -- show one round of bubble sort with playing cards -- search an array in Java and count matches -::: - -## Look for a card - -A pile of playing cards lies face down in a row in front of you. You are looking for the 9. What do you do? You turn over one card after another until you find the 9 or have turned over all the cards. - -::: grafik ss-lineare-suche.svg -The cards are mixed up. Every card you turn over is one comparison: is this the 9? -::: - -This is exactly how **linear search** works: it goes through the array from index 0 to the end and compares every slot with the value it is looking for. It always works, even if the values are mixed up. - -In the array our cards are numbers. We leave out jack, queen and king. - -::: diagramm ss-lineare-suche.visustruct -The loop runs until the card is found or there is no slot left. The variable comparisons counts how often a comparison was made. In the simulation, look for the 2, the 27 and the 4. -::: - -> If the card is not there, `position` stays at **-1**. There is no index -1, so here -1 means “not found”. - -## Exercise: Find a card - -::: übung ss-karte-suchen -titel: Find a card -auftrag: Create the array `int[] cards = {8, 4, 11, 4, 6}` and ask for a card. Output the position of the **first** matching card, e.g. `Position: 1` for the 4. If the card is not there, output `Not found`. -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 8 -> Position: 0 -test: 9 -> Not found -braucht: whileSchleife, verzweigung -tipp: Go through the array from front to back and compare every card with the one you are looking for. -tipp: Rebuild the example above. You do not need the variable comparisons here. The loop has to stop as soon as `position` is no longer -1, otherwise for the 4 you find the second one instead of the first. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Binary search: sorted is faster - -Now the cards lie in front of you **sorted**, from small to large. You are looking for the 27. You no longer turn over the first card at the front, but the **middle** one: - -- If it is the one you are looking for, you are done. -- If it is smaller, the card you are looking for can only be on the right. The whole left half drops out. -- If it is larger, the right half drops out. - -You do the same again with the rest. With every comparison the pile is halved. - -::: grafik ss-binaere-suche.svg -Three comparisons instead of fourteen: with every middle, half of the remaining cards drop out. -::: - -In the structure chart, two variables remember the range that is still being searched: `left` and `right`. The middle is `(left + right) / 2`. Because this is whole-number division, the result is always a whole index. - -::: diagramm ss-binaere-suche.visustruct -The same array as for the linear search. In the simulation, look for the 27 again and compare the output Comparisons with the linear search. -::: - -> Binary search **only works with sorted values**. With mixed-up cards, after looking at the middle you do not know which half to keep searching in. - -::: angeberwissen -I think of a number from 1 to 100. You may guess, and I only say “higher” or “lower”. With binary search you need at most **7** guesses. For a number up to a million it is at most 20, for a billion 30. Every doubling costs only one single extra guess. This is how databases search millions of entries in a fraction of a second. I search linearly, by the way: I eat the meadow from left to right. -::: - -## How fast is it? - -How good a method is gets measured by the number of comparisons it needs **in the worst case**. For linear search, that is the case where the card is right at the back or missing. - -::: grafik ss-vergleiche.svg -With 100 cards, linear search needs up to 100 comparisons, binary search at most 7. -::: - -| Number of cards | Linear search | Binary search | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1,000 | 1,000 | 10 | -| 1,000,000 | 1,000,000 | 20 | - -Linear search grows at the same rate as the number of cards. With binary search, twice as many cards add only **one** comparison. - -## Sorting with bubble sort - -For binary search the values must be sorted. One of the simplest ways of sorting is **bubble sort**. You go through the row from left to right and always compare **two neighbours**. If the larger card is on the left, you swap the two. - -::: grafik ss-bubblesort.svg -After one round, the largest card is on the far right. -::: - -After the first round the largest card is on the far right, like an air bubble rising to the top. That is where the name comes from. Then you repeat the round for the remaining cards. With 5 cards you need 4 rounds. - -The structure chart has two for loops inside each other. The outer one counts the rounds, the inner one compares the neighbours `cards[i]` and `cards[i + 1]`. You already know how to swap: it needs a **temporary variable**. - -::: diagramm ss-bubblesort.visustruct -The inner loop gets shorter with every round, because the largest cards on the right are already in the right place. Go through it in the simulation with Step and watch the array under Variables. -::: - -Bubble sort is easy to understand, but slow. With n cards it needs up to n · (n − 1) / 2 comparisons: with 10 cards 45, with 100 cards already 4,950 and with 1,000 cards almost half a million. You may get to know faster methods such as quicksort later. - -## Exercise: Sort descending - -::: übung ss-absteigend -titel: Sort descending -auftrag: The start diagram reads in 5 cards and sorts them with bubble sort **ascending**, that is from small to large. Change it so that the cards are output **descending**, the largest first. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Look at the condition in the branch. It decides when two neighbours are swapped. -tipp: You only need to change one single character. When should two neighbours be swapped if the larger card is supposed to go to the left? -tipp: In the branch, change `cards[i] > cards[i + 1]` to `cards[i] < cards[i + 1]`. Then two neighbours swap when the bigger card is on the right, and the big card moves to the left. -lösung: ss-absteigend-loesung.visustruct -::: - -## Now in Java - -The linear search from the exercise looks like this in Java: - -```java editor -int[] cards = {8, 4, 11, 4, 6}; -int wanted = 4; -int position = -1; -int i = 0; -while (position == -1 && i < cards.length) { - if (cards[i] == wanted) { - position = i; - } - i = i + 1; -} -System.out.println("Position: " + position); -``` - -- `&&` means “and”: the loop only runs while nothing has been found **and** there are still cards left. -- If the false branch is empty, you simply leave out `else`. -- The swap in bubble sort needs a helper variable in Java too: `int temp = cards[i];` - -::: übung l19-java-zaehlen -titel: Count cards -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. Write a Java program that asks for a card and counts how often it appears. It outputs **Count:** and the number. - For 4 you see **Count: 2**. -test: 4 -> Count: 2 -test: 8 -> Count: 1 -test: 9 -> Count: 0 -braucht: forSchleife, verzweigung -tipp: Unlike the search, you do not stop at the first match. A for loop goes through all cards. -tipp: `for (int i = 0; i < cards.length; i++)` and inside it `if (cards[i] == wanted) { count = count + 1; }`. `count` starts at 0 before the loop. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Fill in the gaps: bubble sort - -::: lückentext -titel: Sorting cards -auftrag: The program sorts the cards in ascending order with bubble sort. Fill in the missing words and symbols. -```java -int[] cards = {5, 2, 8, 1}; -for (int round = 0; round < cards.[[length]] - 1; round++) { - for (int i = 0; i < cards.length - 1; i++) { - if (cards[i] [[>]] cards[i + 1]) { - [[int]] temp = cards[i]; - cards[i] = cards[i + 1]; - cards[i + 1] = [[temp]]; - } - } -} -for (int i = 0; i < cards.length; i++) { - System.out.println(cards[i]); -} -``` -erklärung: If a card is larger than its right neighbour, the two are swapped, with a helper variable as when swapping glasses. After `length - 1` rounds everything is sorted: 1, 2, 5, 8. -::: - -## Find the bug: search - -::: übung l19-java-fehler -titel: Fix the linear search -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. The program should output the **first** position of the card you are looking for, so for 4 **Position: 1**. But it outputs **Position: 3**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l19-java-fehler-start.visustruct -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 9 -> Position: -1 -test: 8 -> Position: 0 -braucht: whileSchleife, verzweigung -tipp: The loop always runs up to the last card. What happens when the 4 comes a second time? -tipp: The loop should stop as soon as something has been found: `while (position == -1 && i < cards.length)`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l19-java-laeuft-nicht -titel: Find a card -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. The program searches for the 11 and should output **Position: 2**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Position: 2 -braucht: forSchleife, verzweigung -tipp: Compare the names in the condition with the names created above. -tipp: The card you are looking for is in `wanted` with a small w: `if (cards[i] == wanted) {` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Search pro - -::: spiel frage -titel: Game: Search pro -intro: Ludwig searches and sorts cards. How fast is it, and what comes out? Seven rounds. - -runde: - int[] cards = {8, 4, 11, 4, 6}; - int wanted = 4; - int position = -1; - int i = 0; - while (position == -1 && i < cards.length) { - if (cards[i] == wanted) { - position = i; - } - i = i + 1; - } - System.out.println("Position: " + position); -frage: What is output? -- [x] Position: 1 -- Position: 3 -- Position: 2 -> The search stops at the first 4. It lies in slot 1, counting from 0. - -runde: - int[] cards = {8, 4, 11, 4, 6}; - int wanted = 7; -frage: With the same linear search: what is in position afterwards? -- 0 -- 5 -- [x] -1 -> The 7 isn't there. position stays -1, which means "not found". - -runde: -frage: For which cards does binary search work? -- for all of them -- [x] only for sorted ones -- only for fewer than 100 -> Only if the cards are sorted do you know, after looking at the middle, in which half to keep searching. - -runde: -frage: How many comparisons does binary search need at most for 100 cards? -- 50 -- [x] 7 -- 100 -> Every comparison halves the pile. Halving 7 times is enough for up to 128 cards, so for 100 as well. - -runde: -frage: Instead of 1,000 cards there are now 2,000. How many more comparisons does binary search need at most? -- [x] one -- twice as many -- 1,000 -> The first comparison halves 2,000 to 1,000. After that it goes on as before. - -runde: - int[] cards = {5, 3, 8, 1}; -frage: One pass of bubble sort compares two neighbours at a time, from left to right. What is the order of the cards afterwards? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 and 3 swap, 5 and 8 stay, 8 and 1 swap. The biggest card is on the far right. - -runde: -frage: Bubble sort swaps `cards[i]` and `cards[i + 1]`. What does it need for that? -- [x] a temporary variable -- a second array -- a binary search -> Just like swapping two variables: `int temp = cards[i];`, otherwise a value gets lost. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain how linear search goes through an array. → Look for a card -- I can build a linear search as a structure chart. → Exercise: Find a card -- I can explain why binary search only works with sorted values. → Binary search: sorted is faster -- I can explain why binary search is much faster with many values. → How fast is it? -- I can show one round of bubble sort with playing cards. → Sorting with bubble sort -- I can search an array in Java and count matches. → Now in Java -::: - -## Quiz - -::: quiz -? What does binary search need? -→ Binary search: sorted is faster -- [ ] The array must have exactly 100 slots. -- [x] The values must be sorted. -- [ ] The value you are looking for must be there. -> Only with sorted values do you know, after looking at the middle, which half to keep searching in. - -? A sorted array has 1,000 values. How many comparisons does binary search need at most? -→ How fast is it? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1,000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: after about 10 halvings, one value is left. - -? What does bubble sort compare in every step? -→ Sorting with bubble sort -- [ ] The first and the last card -- [x] Two neighbouring cards -- [ ] Every card with the middle -> If the larger card is on the left, the neighbours are swapped. - -? Where is the largest card after the first round of bubble sort? -→ Sorting with bubble sort -- [ ] On the far left -- [ ] In the middle -- [x] On the far right -> It is swapped on with every comparison and rises to the right like a bubble. - -? What does `position = -1` mean in linear search? -→ Look for a card -- [x] The card has not been found (yet). -- [ ] The card is right at the back. -- [ ] The array is empty. - -? Match each method to the right description. -→ Look for a card -= Linear search -> look at one card after another -= Binary search -> look at the middle and drop one half -= Bubble sort -> compare neighbours and swap them - -? Why do you use a for loop for counting and not a search that stops at the first match? -→ Now in Java -- [ ] A for loop is always faster. -- [x] You have to look at every card, otherwise later matches are missing. -- [ ] A while loop cannot go through arrays. -> The card can appear several times. That is why you go through all cards to the end. -::: diff --git a/web/lessons/en/20-java.md b/web/lessons/en/20-java.md deleted file mode 100644 index d6c18740..00000000 --- a/web/lessons/en/20-java.md +++ /dev/null @@ -1,472 +0,0 @@ ---- -titel: Structure chart and code -bereich: From structure chart to code -kurz: All elements in Java at a glance, generate code, write Java in the Code area, run it and find mistakes. ---- - -## Skills I will gain now - -::: kompetenzen -- open the code view and choose Java as the language -- recognise output, input, branches and loops in Java -- explain the difference between Snippet and Class -- explain how Java code runs on every operating system with the compiler, bytecode and the JVM -- tell the JDK and the JRE apart -- explain why a C++ program has to be compiled again for every operating system but a Java program does not -- rebuild a short Java program as a structure chart -- type Java in the Code area and read the structure chart that is built -- run a program with ▶︎ and use input and output in the console -- find a syntax error or a runtime error by its red line number -- set breakpoints and follow a program step by step -::: - -## The code view - -In lessons 4 to 19 you have already written every element in Java. Here you see everything at a glance and learn how VisuStruct turns a whole structure chart into a Java program. - -A structure chart describes a process. For a computer to run it, you need a program in a programming language. VisuStruct writes this code for you. - -Click [Code](#zeige-code) in the tools (icon with angle brackets). On the right, the **Code generator** appears: - -- At the top you choose the language: **Java**, **Python** or **JavaScript**. -- For Java you also choose under **Java output** between **Snippet** (only the statements) and **Class** (a complete Java file). -- **Diagram text as comments** writes the text of every box as a comment above the code. -- **Copy** puts the code on the clipboard, **Save Java…** saves a `.java` file. - -The code changes straight away whenever you change something in the structure chart. - -::: angeberwissen -Later on, Nassi worked on the programming language Ada and was in charge of software at Apple. So if you invent structure charts, you do not end up in a goat shed, you end up at Apple. -::: - -::: diagramm l17-beispiel.visustruct -A small program with an input, a for loop and a branch. Open it and look at the Java code for it. -::: - -## This is the example in Java - -For the diagram above, VisuStruct generates this code as a **Snippet**: - -``` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which times table?"); -int number = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int result = number * i; - System.out.println(i + " times " + number + " = " + result); -} -if (number > 10) { - System.out.println("That was hard!"); -} else { - System.out.println("That was easy."); -} -``` - -In Java every statement ends with a **semicolon** `;`. Whatever is inside a box goes in **curly brackets** `{ }` in Java. The indentation shows you what belongs together. - -## The elements in Java - -| Element | Java | Lesson | -|---|---|---| -| Statement | `int sum = 0;` | 4, 5 | -| Output | `System.out.println(sum);` | 6 | -| Input | `int number = scanner.nextInt();` | 6 | -| Branch | `if (condition) { … } else { … }` | 8, 9 | -| Switch | `switch (value) { case 1 -> { … } default -> { … } }` | 10 | -| While loop | `while (condition) { … }` | 11 | -| Do-while loop | `do { … } while (condition);` | 12 | -| For loop | `for (int i = 0; i < 5; i++) { … }` | 13 | -| Endless loop | `while (true) { … }` | 11, 18 | -| Break | `break;` | 18 | -| Call | `calculate();` | 18 | -| Array | `int[] numbers = new int[5];` | 15, 16 | -| Text (String) | `String name = scanner.next();` | 17 | - -For input, `import java.util.Scanner;` and `Scanner scanner = new Scanner(System.in);` are written once at the very top. Before every input VisuStruct outputs the question with `System.out.println(…)`. - -If the false path of a branch is empty, VisuStruct still generates an `else` part that contains only the comment `// empty element`. If you switch off **Emit empty else branch in code**, the empty `else` part disappears. - -## Snippet or Class - -You can paste a **Snippet** into the `main` method of an existing Java program. With **Class** you get a complete file that you can compile and run straight away: - -``` -import java.util.Scanner; - -public class TimesTable { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Which times table?"); - int number = scanner.nextInt(); - ... - } // end main -} // end class -``` - -The comments `// end main` and `// end class` after the last two brackets are not needed, but very helpful: you see at once which bracket closes what, and you don't forget one. - -The name of the class comes from the **title** of the diagram. The file must have exactly the same name, so here `TimesTable.java`. **Save Java…** takes care of that for you. - -> The generated code is a good start, but check it. If you first create a variable and later read it in again with an input, VisuStruct still writes `int pin = scanner.nextInt();`. Java then reports that `pin` already exists. Simply delete the `int` in that line. - -## How Java runs on every computer - -Your file `TimesTable.java` is **source code**: text for people. The processor in your computer cannot understand it directly. That is why Java runs in two steps: - -1. The **compiler** `javac` translates the source code into **bytecode**. The result is the file `TimesTable.class`. -2. The **JVM** (Java Virtual Machine) reads the bytecode and, while running it, translates it into **machine code**: instructions for the processor in your computer. - -::: grafik l20-jvm.svg -Compile once: the same bytecode runs on every JVM. -::: - -There is only one bytecode. But there is a JVM for Windows, macOS, Linux and many other systems. That is why the same `.class` file runs on every computer that has a JVM installed. This is called **platform independent**. The slogan for it is **“Write once, run anywhere”**. - -::: angeberwissen -One of the first compilers was built in 1952 by **Grace Hopper**, whom you already know from lesson 7. Back then many people told her that computers could only do arithmetic and could not translate programs. She did it anyway. -::: - -Compare this with **C++**: there the compiler translates the source code directly into machine code for exactly one processor and one operating system. The finished program only runs there. For Windows, macOS and Linux you have to compile it again each time. - -::: grafik l20-cpp.svg -C++ is compiled to machine code separately for every system. -::: - -| | C++ | Java | -|---|---|---| -| The compiler creates | machine code | bytecode | -| How often do you compile? | again for every system | once | -| What does the computer need to run it? | nothing else | a JVM | - -Does that make Java slower? Hardly. Parts of a program that run often, loops for example, are translated completely into machine code once by the JVM’s **JIT compiler** (“just in time”). After that they run almost as fast as C++. - -> Think of the JVM as a small computer made of software, almost like an operating system of its own just for Java programs. Strictly speaking it is not an operating system, though, but a **virtual machine**: a program that itself runs on Windows, macOS or Linux and pretends to be a computer inside it. - -When you install Java you meet two abbreviations: - -| Abbreviation | What is inside? | What for? | -|---|---|---| -| **JRE** (Java Runtime Environment) | the JVM and ready-made building blocks such as `Scanner` | running Java programs | -| **JDK** (Java Development Kit) | the JRE plus the compiler `javac` and other tools | writing and compiling Java programs | - -So to program you need the JDK. Today you usually only download the JDK, the JRE is inside it. For VisuStruct in the browser you don't need to install any of this. - -::: angeberwissen -With a JDK you can do all of this yourself in the console, that is in the terminal or the command prompt: - -``` -java -version -javac TimesTable.java -java TimesTable -``` - -- `java -version` shows which Java version is installed. If you get an error message, Java is still missing. -- `javac TimesTable.java` starts the compiler. Afterwards there are two files in the folder: `TimesTable.java` with your source code and the new `TimesTable.class` with the bytecode. -- `java TimesTable` starts the JVM with your bytecode. Here you write the class name without `.class`. - -If `java -version` works but `javac -version` doesn't, only a JRE is installed. Then you are missing the JDK. -::: - -::: angeberwissen -Every compiled Java file (`.class`) starts with the same four bytes, written in hexadecimal: `CA FE BA BE`. That is how the computer recognises it as Java. James Gosling came up with this “cafe babe”, to go with the coffee in the name. -::: - -## The Java language mode - -Under the [gear](#zeige-einstellungen) at the top right you can switch on **Code keywords**. Then the building blocks in the Elements area have the same names as the commands in Java: `if`, `switch`, `for`, `while`, `do`, `while(true)`, `break` and `call`. The rest of the interface stays in your language. - -This helps you match the boxes to the Java commands. Your diagram itself stays unchanged. - -## Write Java directly - -So far you drew the structure chart first and then looked at the code. In the [Code](#zeige-codelive) area it also works the other way round. Click the slim **Code** strip on the right. Next to the structure chart a column appears where you type Java yourself. - -- **Structure chart to code:** When you change something in the structure chart, the Java code changes right away. -- **Code to structure chart:** When you type Java, VisuStruct builds the structure chart as you type. If something is still missing, for example a closing bracket `}`, a hint appears below the code. -- **Suggestions:** While you type, VisuStruct suggests templates, for example for `if`, `for` or `while`. Press Enter to accept a template. Simply replace the grey placeholders with your own text. -- **Indent:** If your code has got messy, click the **Indent** button at the top of the Code area. Every level then sits four spaces deeper, as in Eclipse or IntelliJ. If you have selected lines, VisuStruct only indents those. - -So you can try both ways. Drawing the structure chart first is good for planning a process. Writing code directly is faster when you already know what you want. The structure chart then helps you check your code. - -## Run the program - -At the top of the Code area, [▶︎ Run](#zeige-ausfuehren) starts your program and **■ Stop** ends it, for example in an endless loop. What your program outputs appears below in the [console](#zeige-konsole). If it asks for input, type it there and press Enter. - -You can drag the border between code and console up or down with the mouse. - -If something goes wrong, the line number turns red. With a syntax error the spot is also underlined in red, and below it you read e.g. **Line 2: Still missing here: ;**. Then ▶︎ does not even start the program. If the program stops while it runs, it is a runtime error, and the console names the line, e.g. **Line 3: Division by zero.** You know the three kinds of errors from the lesson “Simulation and desk check”. - -If VisuStruct knows exactly what is missing, there is a 💡 at the end of the line. Move the mouse onto it to see the suggestion, e.g. **Suggestion: insert import java.util.Scanner;**. A click applies it. Still read what was inserted, so that you know it yourself next time. - -> The Code area understands the Java commands that also exist as boxes in the structure chart. It does not know your own classes and objects yet. Windows with Swing work anyway: turn on **Real Java (with Swing)** under the gear (lesson “Your first window”). - -::: angeberwissen -Professionals call a program where you write code, run it and look for mistakes an **IDE** (Integrated Development Environment). With the Code area, VisuStruct is a small IDE with a built-in structure chart. -::: - -## Find mistakes with the debugger - -Sometimes a program runs but calculates something wrong. That is a logic error. Then the **debugger** helps: it runs your program slowly while you watch. - -- **Breakpoint:** Click a line number on the left. A red dot appears. [▶︎ Run](#zeige-ausfuehren) pauses before this line. Click again to remove the dot. -- **Yellow line:** This line runs next. The matching box is selected in the structure chart. -- **Variables:** Below the code you see the current value of every variable. Whatever changed since the last pause lights up yellow for a moment. -- **Step:** The [Step](#zeige-einzelschritt) button next to ▶︎ runs exactly one line and pauses again. Without a breakpoint it starts the program and pauses before the first line. -- **Continue:** ▶︎ runs to the next breakpoint or to the end. **■ Stop** ends it. - -Try it with this program. Set a breakpoint on line 3 and press ▶︎ several times. How do `i` and `summe` grow? - -``` -int summe = 0; -for (int i = 1; i <= 4; i++) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -``` - -::: ludwig -This is a desk check, except the computer takes the notes for you. Before each step, think about which value the variable should have next. When the table doesn't match your guess, you have found the place with the mistake. -::: - -## Exercise: Code first, then the structure chart - -This time you don't draw. Open the Code area and type in this Java code: - -``` -System.out.println("Start number?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -``` - -::: übung l20-countdown -titel: Countdown -bereich: beide -auftrag: Type the Java code above into the Code area. Run it with ▶︎ and enter a start number in the console. - Then look at the structure chart that was built and click Check. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Open the Code area with the slim strip on the far right and just start typing. -tipp: Watch out for the semicolon at the end of every statement and the curly brackets of the while loop. A hint below the code tells you when something is still missing. -lösung: l20-countdown-loesung.visustruct -::: - -## Exercise: Java as a structure chart - -Now the other way round: here is a piece of Java code. Rebuild it as a structure chart. - -``` -System.out.println("Enter a number"); -int n = scanner.nextInt(); -int factorial = 1; -for (int i = 1; i <= n; i++) { - factorial = factorial * i; -} -System.out.println(factorial); -``` - -::: übung l17-fakultaet -titel: Factorial from Java -bereich: beide -auftrag: Rebuild the Java code above as a structure chart. The program reads in a number n and outputs the product 1 · 2 · … · n. - At the end, check in the code view whether your Java code looks the same. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Read the Java code line by line and think about which box fits each line. -tipp: The first two Java lines together are one single input: `input: int n "Enter a number"`. The for loop has the three fields `int i = 1`, `i <= n` and `i++`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Exercise: else if - -In Java, several cases are often written as `else if`: - -``` -if (age < 6) { - System.out.println("Free entry"); -} else if (age < 18) { - System.out.println("Child ticket: 4 euros"); -} else { - System.out.println("Adult ticket: 8 euros"); -} -``` - -There is no `else if` in a structure chart. There, a second branch sits in the false path of the first one. If the false path holds only this one branch, VisuStruct turns it back into `else if` when it generates the code, and into `elif` in Python. - -::: übung l17-ticket -titel: Ticket price -bereich: beide -auftrag: Ask for the age as a whole number and rebuild the Java code above as a structure chart. -test: 5 -> Free entry -test: 6 -> Child ticket: 4 euros -test: 17 -> Child ticket: 4 euros -test: 18 -> Adult ticket: 8 euros -braucht: verzweigung -tipp: In the Java code there is another `if` inside an `else`. In the structure chart that is a branch inside a path. -tipp: Drag a second branch with the condition `age < 18` into the false path of the first branch. -lösung: l17-ticket-loesung.visustruct -::: - -## Game: Which box? - -::: spiel frage -titel: Game: Which box? -intro: Ludwig shows you Java. Which box from the structure chart is behind it? Eight rounds. -frage: Which box is this? - -runde: - do { - number = number * 2; - } while (number < 100); -- While loop -- [x] Do-while loop -- For loop -> The condition is at the bottom. So the body runs at least once. - -runde: - switch (choice) { - case 1 -> { System.out.println("water"); } - default -> { System.out.println("There is no such button."); } - } -- Branch -- [x] Switch -- Call -> One variable is compared with fixed values: that is the switch. - -runde: - break; -- Call -- Endless loop -- [x] Break -> `break` leaves the loop it stands in straight away. - -runde: - calculate(); -- [x] Call -- Output -- Statement -> A name with round brackets: a subprogram is called here. - -runde: - int number = scanner.nextInt(); -- Output -- [x] Input -- Call -> The scanner reads in a value. That is an input. - -runde: - while (true) { - System.out.println("Hello"); - } -- While loop with a condition -- [x] Endless loop -- Do-while loop -> `while (true)` has no real condition. Only a break could end it. - -runde: -frage: You want a complete Java file that you can compile and run straight away. What do you choose in the code view? -- Snippet -- [x] Class -> A snippet is only the statements for the `main` method. Class creates the whole file. - -runde: -frage: In the debugger, a line is yellow. What does that mean? -- It has a mistake. -- [x] It runs next. -- There is a breakpoint there. -> Yellow is the next line. A breakpoint is a red dot at the line number. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can open the code view and choose Java as the language. → The code view -- I can recognise output, input, branches and loops in Java. → The elements in Java -- I can explain the difference between Snippet and Class. → Snippet or Class -- I can explain how Java code runs on every operating system with the compiler, bytecode and the JVM. → How Java runs on every computer -- I can tell the JDK and the JRE apart. → How Java runs on every computer -- I can explain why a C++ program has to be compiled again for every operating system but a Java program does not. → How Java runs on every computer -- I can rebuild a short Java program as a structure chart. → Exercise: Java as a structure chart -- I can type Java in the Code area and read the structure chart that is built. → Write Java directly -- I can run a program with ▶︎ and use input and output in the console. → Run the program -- I can find a syntax error or a runtime error by its red line number. → Run the program -- I can set breakpoints and follow a program step by step. → Find mistakes with the debugger -::: - -## Quiz - -::: quiz -? What does `output: "Hello"` look like in Java? -→ The elements in Java -- [ ] print("Hello") -- [x] System.out.println("Hello"); -- [ ] console.log("Hello"); -> print is Python, console.log is JavaScript. - -? Where does the class name come from with Class? -→ Snippet or Class -- [ ] It is always called Main. -- [x] From the title of the diagram -- [ ] From the first box -> Without a title, the class is called Main. - -? Which Java code belongs to a do-while loop? -→ The elements in Java -- [ ] while (condition) { … } -- [x] do { … } while (condition); -- [ ] for (;;) { … } -> With do-while the condition is at the end, so the body runs at least once. - -? What does a Break become in Java code? -→ The elements in Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? What happens at a red dot before the line number? -→ Find mistakes with the debugger -- [ ] The line is skipped. -- [x] The program pauses before this line. -- [ ] The line contains a mistake. -> That is a breakpoint. Continue with ▶︎ or Step. - -? Why does the same `.class` file run on Windows, macOS and Linux? -→ How Java runs on every computer -- [ ] The compiler creates a separate file for every operating system. -- [x] On every operating system a JVM runs the same bytecode. -- [ ] Java programs don't need an operating system. -> The bytecode stays the same. Only the JVM exists separately for each system. - -? What do you need to write and compile Java programs? -→ How Java runs on every computer -- [ ] only the JRE -- [x] the JDK -- [ ] only the JVM -> The JRE is enough to run programs. The compiler `javac` only comes with the JDK. - -? You want to use your program on Windows and on a Mac. What is true? -→ How Java runs on every computer -- [ ] You have to compile Java again for every system, but not C++. -- [x] You have to compile C++ again for every system, but not Java. -- [ ] You only compile both once. -> C++ becomes machine code for one system directly. Java becomes bytecode, and the JVM runs it on every system. - -? Line number 3 in the Code area is red. What does that mean? -→ Run the program -- [ ] There is a breakpoint in line 3. -- [x] There is an error in line 3. -- [ ] Line 3 runs next. -> A breakpoint is a round red dot, and the next line is yellow. A red line number shows a syntax error or a runtime error. -::: diff --git a/web/lessons/en/21-python-und-javascript.md b/web/lessons/en/21-python-und-javascript.md deleted file mode 100644 index f40cb8ec..00000000 --- a/web/lessons/en/21-python-und-javascript.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -titel: Python and JavaScript -bereich: From structure chart to code -kurz: Generate Python and JavaScript code from the structure chart and run JavaScript straight in the browser. ---- - -## Skills I will gain now - -::: kompetenzen -- choose and compare Python and JavaScript in the code view -- explain that Python forms blocks by indentation and needs no data types -- explain what VisuStruct adjusts when translating to Python -- run JavaScript with Test in browser -::: - -## The same diagram, three languages - -In the code view ([Code](#zeige-code) in the tools) you choose the language at the top. The structure chart stays the same; only the way it is written changes. That way you can compare the languages easily. - -::: diagramm l18-beispiel.visustruct -A number is made smaller by 3 again and again until it is no longer greater than 0. -::: - -## Python - -For the diagram above, VisuStruct generates this Python code: - -``` -number = int(input("Start value?")) -while number > 0: - print(number) - number = number - 3 -print("End") -``` - -What is different in Python compared with Java: - -- There are **no semicolons** and **no curly brackets**. Python recognises what belongs to a loop or a branch by the **indentation** alone. After `while`, `if` and `else` there is a colon. -- Variables get **no data type**: `int number = 5` becomes `number = 5`. -- Output is called `print(…)`, input `input(…)`. For a number, `int(…)` goes around it. -- In Python, arrays are called **lists**: `int[] numbers = {2, 4, 6}` becomes `numbers = [2, 4, 6]`, and `numbers.length` becomes `len(numbers)`. -- A simple for loop such as `int i = 0`, `i < 5`, `i++` becomes `for i in range(5):`. - -## What to watch out for in Python - -In some places Python is stricter than Java. That is why VisuStruct translates the Java way of writing things when it exports: - -- **Text and number with +:** `"Sum: " + sum` becomes `"Sum: " + str(sum)`. Without `str(…)`, Python stops with an error. -- **There is no i++:** it becomes `i += 1`. -- **&&, || and !** are called `and`, `or` and `not` in Python, and `true` and `false` become `True` and `False`. -- **Whole-number division:** In Python, `7 / 2` always gives 3.5. If the structure chart divides two `int` values, VisuStruct writes `7 // 2`, which gives 3, just like in Java. -- **For loops:** Counting loops become `for … in range(…)`, also with `i <= n`, counting backwards or steps such as `i = i + 2`. If a loop does not fit that pattern, it becomes a `while` loop. -- **There is no do-while:** it becomes `while True:` with `if not (…): break` at the end. - -If a diagram is marked as **pseudocode**, only a note appears above the code. Then the text is a sketch and not a runnable program. - -## JavaScript - -The same diagram in JavaScript: - -``` -"use strict"; - -let number = parseInt((prompt("Start value?") ?? "0"), 10); -while (number > 0) { - console.log(number); - number = number - 3; -} -console.log("End"); -``` - -JavaScript looks similar to Java: curly brackets, semicolons, `while (…)` and `if (…)`. The differences: - -- Variables are created with `let`, without a data type. Constants with `const`. -- Output is called `console.log(…)`, input `prompt(…)`. `parseInt(…)` turns the input into a whole number. -- Arrays go in square brackets: `let numbers = [2, 4, 6];`. -- `"use strict";` at the very top makes JavaScript complain about typos in variable names. -- JavaScript has only one number type. If the structure chart divides two `int` values, VisuStruct writes `Math.trunc(a / b)`. Then the digits after the decimal point are dropped, just like in Java. - -::: angeberwissen -JavaScript has almost nothing to do with Java. Brendan Eich built it in 1995 in just ten days for the Netscape browser. First it was called Mocha, then LiveScript. Because everyone was excited about Java at the time, it was renamed JavaScript shortly before launch, for advertising reasons. People have been mixing the two up ever since. Programmers say: Java is to JavaScript as car is to carpet. -::: - -## Run JavaScript in the browser - -JavaScript is the language of browsers. That is why VisuStruct can **run the code straight away**: - -::: angeberwissen -Why are links in the browser blue, anyway? In 1985 Ben Shneiderman's team tested which colour is easy to see but does not get in the way when you read. Light blue won. Red stood out more, but people remembered the text less well afterwards. -::: - -1. Choose **JavaScript** in the code view. -2. Click **Test in browser**. -3. Whatever `console.log` outputs appears under **Output**. If the program asks for a value with `prompt`, type it in and click **OK**. -4. **Stop** cancels the program. - -VisuStruct stops an endless loop `while (true)` by itself after 100,000 passes and reports **Execution stopped: possible infinite loop.** - -> In JavaScript code, a **Call** needs a subprogram with that name, otherwise JavaScript reports an error. Unlike the simulation, the browser does not look in the other tabs. - -## Exercise: Python as a structure chart - -This Python program outputs all even numbers from 0 up to a limit: - -``` -limit = int(input("Up to which number?")) -for i in range(0, limit + 1, 2): - print(i) -``` - -`range(0, limit + 1, 2)` means: start at 0, stop before `limit + 1`, count in steps of two. - -::: übung l18-python -titel: Even numbers -bereich: beide -auftrag: Rebuild the Python program above as a structure chart with a for loop. With the limit 7 it outputs 0, 2, 4 and 6. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: `range(0, limit + 1, 2)` counts from 0 up to the limit in steps of two. That is a for loop. -tipp: The three fields of the for loop are `int i = 0`, `i <= limit` and `i = i + 2`. -lösung: l18-python-loesung.visustruct -::: - -## Exercise: JavaScript as a structure chart - -``` -let age = parseInt((prompt("How old are you?") ?? "0"), 10); -if (age >= 16) { - console.log("You may vote."); -} else { - let years = 16 - age; - console.log("Wait " + years + " more years."); -} -``` - -::: übung l18-js -titel: Voting from 16 -bereich: beide -auftrag: Rebuild the JavaScript code above as a structure chart. Then test in the code view with **JavaScript** and **Test in browser** whether your code outputs the same as the simulation. -test: 12 -> Wait 4 more years. -test: 16 -> You may vote. -test: 13 -> Wait 3 more years. -test: 40 -> You may vote. -braucht: verzweigung -tipp: Read the code line by line. `if` and `else` become a branch. -tipp: `prompt` and `parseInt` together are one input: `input: int age "How old are you?"`. The false path holds two boxes: first `int years = 16 - age`, then the output. -lösung: l18-js-loesung.visustruct -::: - -## Game: Which language? - -::: spiel frage -titel: Game: Which language? -intro: Ludwig has mixed up lines from three languages. Can you tell where each comes from? Eight rounds. -frage: Which language is this written in? -antworten: Java | Python | JavaScript - -runde: - print(number) -richtig: Python -> In Python the output is called `print(…)`, without a semicolon. - -runde: - console.log(number); -richtig: JavaScript -> `console.log` is the output in JavaScript. - -runde: - System.out.println(number); -richtig: Java -> The long output with `System.out` only exists in Java. - -runde: - let numbers = [2, 4, 6]; -richtig: JavaScript -> `let` and square brackets: an array in JavaScript. - -runde: - for i in range(5): -richtig: Python -> A colon instead of curly brackets, and `range`: typical Python. - -runde: - int[] numbers = {2, 4, 6}; -richtig: Java -> Only Java writes the data type `int[]` in front. - -runde: - number = int(input("Start value?")) -richtig: Python -> No data type in front of the variable, no semicolon, and `int(…)` around the input. - -runde: - let number = parseInt(prompt("Start value?"), 10); -richtig: JavaScript -> `prompt` asks for a value in the browser, `parseInt` turns it into a number. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can choose and compare Python and JavaScript in the code view. → The same diagram, three languages -- I can explain that Python forms blocks by indentation and needs no data types. → Python -- I can explain what VisuStruct adjusts when translating to Python. → What to watch out for in Python -- I can run JavaScript with Test in browser. → Run JavaScript in the browser -::: - -## Quiz - -::: quiz -? How does Python recognise which lines belong to a loop? -→ Python -- [ ] By the curly brackets -- [x] By the indentation -- [ ] By the semicolon at the end of the line - -? What is `output: sum` in JavaScript? -→ The same diagram, three languages -- [ ] print(sum) -- [ ] System.out.println(sum); -- [x] console.log(sum); - -? Which language can VisuStruct run straight in the browser? -→ Run JavaScript in the browser -- [ ] Java -- [ ] Python -- [x] JavaScript -> Every browser can run JavaScript. For Java and Python you need a program of its own. - -? What happens in Python with `print("Sum: " + sum)` if sum is the number 7? -→ What to watch out for in Python -- [ ] Sum: 7 is output. -- [x] Python reports an error, because text and a number cannot be joined with +. -- [ ] Sum: is output. -> str(sum) turns the number into text. -::: diff --git a/web/lessons/en/22-try-und-catch.md b/web/lessons/en/22-try-und-catch.md deleted file mode 100644 index 5c1aec01..00000000 --- a/web/lessons/en/22-try-und-catch.md +++ /dev/null @@ -1,293 +0,0 @@ ---- -titel: When the program crashes: try and catch -bereich: Catching errors -kurz: Use real Java to read error messages and catch crashes with try and catch. ---- - -## Skills I will gain now - -::: kompetenzen -- switch on real Java in the Code area -- read the exception and the line from an error message -- catch an exception with try and catch -- turn text into a number with Integer.parseInt and catch the NumberFormatException -- write a program that divides safely, even by 0 -::: - -## Crashed! - -This program should print three grades. Type it into the [Code](#zeige-codelive) area and click [▶︎ Run](#zeige-ausfuehren): - -```java -int[] grades = {2, 3, 1}; -System.out.println("First grade: " + grades[0]); -System.out.println("Fourth grade: " + grades[3]); -System.out.println("Done!"); -``` - -The first grade appears, then it stops. VisuStruct reports “Invalid expression: grades[3]”, and “Done!” never shows up. The array only has the slots 0, 1 and 2; there is no slot 3. - -::: ludwig -Has this ever happened to you? One small mistake, and the whole program is gone. It happened to me so often that I cried in front of the screen. But there is a solution, and it is called **try** and **catch**. -::: - -::: angeberwissen -In 1947 Grace Hopper's team found a moth in the Mark II computer at Harvard University that had caused a fault. They taped it into the logbook and wrote: “First actual case of bug being found”. Since then, program errors have been called **bugs**. -::: - -## Switching on real Java - -The Code area normally calculates with the same simulation as the structure chart. It simply stops when there is an error. To see what real Java does, switch on real Java: - -1. Click the [gear](#zeige-einstellungen) at the top right and choose Java as the **Programming language**. -2. In the Java section, tick **Real Java (with Swing)**. - -The first time you run a program, VisuStruct downloads about 40 MB once. After that your code is compiled and run just like in a real Java development environment. - -> With real Java, input from the console (`Scanner`) does not work yet. That is why our examples work without input. - -Now write the program as a whole class, so that the line numbers match, and run it: - -```java -public class Grades { - public static void main(String[] args) { - int[] grades = {2, 3, 1}; - System.out.println("First grade: " + grades[0]); - System.out.println("Fourth grade: " + grades[3]); - System.out.println("Done!"); - } -} -``` - -The [console](#zeige-konsole) now shows: - -``` -First grade: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Grades.main(Grades.java:5) -``` - -## Reading the error message - -A message like this looks scary at first. But it tells you exactly what is going on: - -| Part | Meaning | -|---|---| -| `ArrayIndexOutOfBoundsException` | The kind of error: the index is outside the array. | -| `3` | The wrong index. | -| `Grades.java:5` | The line where it happened: line 5. | - -Java calls a runtime error like this an **exception**. We say: Java *throws* an exception. If nobody catches it, the program stops. That is why “Done!” does not appear. - -::: ludwig -Always read error messages from the top: first the name of the exception, then the line number. In the Code area the line numbers are on the left next to the code. -::: - -## try and catch - -With **try** and **catch** you catch the exception. Change the line with `grades[3]` like this: - -```java -try { - System.out.println("Fourth grade: " + grades[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("This grade does not exist."); -} -System.out.println("Done!"); -``` - -- `try` means “give it a go”. Java runs the block in curly brackets as usual. -- If a line in it throws an exception, Java jumps straight into the `catch` block. The rest of the `try` block is skipped. -- The brackets after `catch` say which exception is caught, plus a name for it, usually `e`. -- After that the program carries on as normal. Now “Done!” appears too. - -If everything in the `try` block goes well, the `catch` block is simply skipped. - -::: ludwig -try and catch are like the net under the trapeze at the circus: as long as everything works, you don't notice it. If someone falls, the net catches them and the show goes on. -::: - -> The structure chart has no box for try and catch. So VisuStruct shows the whole block as one statement. You can only run it with real Java. - -::: angeberwissen -In July 1969, Apollo 11 landed on the Moon. Shortly before touchdown, the onboard computer suddenly reported the errors **1202** and **1201**: it had more work than it could handle. Still, it did not crash. **Margaret Hamilton**'s team had built the software so that it recognised such errors, put aside the unimportant jobs and kept only the most important ones running. The landing succeeded. - -Margaret Hamilton led the group at MIT that wrote the software for the Apollo spacecraft. She always planned for things going wrong, just like you do with `try` and `catch`. So that software would be taken as seriously as hardware, she called her work **software engineering**. Today a whole field of computer science has that name. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (born 1936) in 1969, next to the printed programs her team wrote for Apollo (photo: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), public domain). -::: - -## Turning text into a number - -Often a number is text at first, for example later in a text field in a window. `Integer.parseInt` turns text into a whole number: - -```java -String input = "twelve"; -try { - int number = Integer.parseInt(input); - System.out.println("Double: " + number * 2); -} catch (NumberFormatException e) { - System.out.println("That is not a number: " + input); -} -``` - -Java cannot convert “twelve” and throws a `NumberFormatException`. The program prints “That is not a number: twelve”. Change the first line to `String input = "12";` and run it again: now “Double: 24” appears. - -## Exceptions are objects - -This is not in the curriculum, but it is useful to know. - -::: angeberwissen -Every exception is an object of its own class, for example `ArithmeticException` for dividing by 0. `e.getMessage()` gives you its message, such as `/ by zero`. - -A `try` may be followed by several `catch` blocks, one for each kind of error. `catch (Exception e)` catches all exceptions, but then tells you less about what happened. And a `finally { … }` block at the end always runs, whether there was an error or not. -::: - -## Game: Does the net catch it? - -::: spiel frage -titel: Game: Does the net catch it? -intro: Ludwig is swinging on the trapeze. Do try and catch save him, or does the program crash? Seven rounds. - -runde: - int[] grades = {2, 3, 1}; - System.out.println(grades[3]); - System.out.println("Done!"); -frage: What happens with real Java? -- 1 and Done! appear. -- Only Done! appears. -- [x] The program crashes with an ArrayIndexOutOfBoundsException. -> There is no slot 3. Nobody catches the exception, so Done! never arrives. - -runde: - int[] grades = {2, 3, 1}; - try { - System.out.println(grades[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("This grade does not exist."); - } - System.out.println("Done!"); -frage: What is output? -- Done! -- [x] This grade does not exist.\nDone! -- This grade does not exist. -> The catch block catches the exception, and after that the program carries on as normal. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: What is output? -- A\nB\nC -- [x] A\nC -- C -> At 10 / 0, Java jumps straight into the catch block. The rest of the try block, B, is skipped. - -runde: - String input = "12"; - try { - int number = Integer.parseInt(input); - System.out.println("Double: " + number * 2); - } catch (NumberFormatException e) { - System.out.println("That is not a number: " + input); - } -frage: What is output? -- [x] Double: 24 -- That is not a number: 12 -- Double: 1212 -> "12" can be converted. If everything goes well in the try block, catch is skipped. - -runde: -frage: Which exception does `Integer.parseInt("2.5")` throw? -- ArithmeticException -- [x] NumberFormatException -- none, the result is 2 -> parseInt only converts whole numbers. With a point it isn't a valid format. - -runde: -frage: Which exception does `12 / 0` throw with `int`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Dividing by 0 doesn't work with whole numbers. The message is `/ by zero`. - -runde: - try { - int pieces = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Error!"); - } - System.out.println("Done!"); -frage: What happens? -- Error! and Done! appear. -- Only Done! appears. -- [x] The program crashes. -> catch only catches the exception named in the brackets. An ArithmeticException falls through the net. -::: - -## Task: dividing safely - -This program crashes: - -```java -int cake = 12; -int people = 0; -System.out.println("Everyone gets " + cake / people + " pieces."); -System.out.println("Enjoy!"); -``` - -1. Run it with real Java and read the error message. Which exception is it? -2. Catch it with try and catch. Instead of the crash, “You can't share without people.” should appear, and “Enjoy!” should still be printed. -3. Set `people` to 4 and check that “Everyone gets 3 pieces.” appears. - -::: ludwig -The exception is called `ArithmeticException`. Only put the line that can crash into the `try` block. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can switch on real Java in the Code area. → Switching on real Java -- I can read the exception and the line from an error message. → Reading the error message -- I can catch an exception with try and catch. → try and catch -- I can turn text into a number with Integer.parseInt and catch the NumberFormatException. → Turning text into a number -- I can write a program that divides safely, even by 0. → Task: dividing safely -::: - -## Quiz - -::: quiz -? What happens if an exception is not caught? -→ Reading the error message -- [ ] Java skips the line and carries on. -- [x] The program stops. -- [ ] The computer restarts. -> That is why “Done!” does not appear in the first example. - -? What happens in the try block after the line that throws an exception? -→ try and catch -- [ ] The remaining lines run anyway. -- [x] The rest is skipped and Java jumps into the catch block. -- [ ] Java starts the try block again. - -? Which exception does Integer.parseInt("twelve") throw? -→ Turning text into a number -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> “twelve” is not in a number format that Java understands. - -? Match each exception to its cause. -→ Reading the error message -= ArrayIndexOutOfBoundsException -> index outside the array -= ArithmeticException -> dividing by 0 -= NumberFormatException -> text is not a number -::: diff --git a/web/lessons/en/23-text-einlesen-und-speichern.md b/web/lessons/en/23-text-einlesen-und-speichern.md deleted file mode 100644 index 5086c763..00000000 --- a/web/lessons/en/23-text-einlesen-und-speichern.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -titel: Reading and saving text -bereich: Files -kurz: Read a text file line by line with Scanner and save a file with PrintWriter. ---- - -## Skills I will gain now - -::: kompetenzen -- explain why programs save data in files -- read a text file line by line with Scanner, hasNextLine and nextLine -- explain why Java requires try and catch or throws for files -- write a file with PrintWriter and finish it with close -- read a file, add to it and save it again with numbers -::: - -## Why files? - -Everything stored in variables is gone as soon as the program ends. If a program should remember something, for example a game score, a list or grades, it saves the data in a **file**. The next time it starts, it reads the file again. - -Zora is free, and Ludwig is planning a party. His shopping list is ready in the file `shopping.txt`: - -::: datei shopping.txt -Hay -Apples -Carrots -Dandelions -::: - -A file ending in `.txt` contains only text, line by line. You can open it with any editor, for example Notepad on Windows or TextEdit on a Mac. - -## Reading a file with Scanner - -You already know the `Scanner`: `new Scanner(System.in)` reads from the keyboard. If you give it a file instead of `System.in`, it reads from the file: - -```java -import java.io.*; -import java.util.Scanner; - -Scanner file = new Scanner(new File("shopping.txt")); -while (file.hasNextLine()) { - String line = file.nextLine(); - System.out.println(line); -} -file.close(); -``` - -| Method | Meaning | -|---|---| -| `new File("shopping.txt")` | the file with this name | -| `hasNextLine()` | Is there another line? `true` or `false` | -| `nextLine()` | returns the next line and moves on by one line | -| `close()` | closes the file when you are done | - -The loop runs as long as there is another line. In each pass, `nextLine()` fetches the next line. `File` belongs to the package `java.io`, so you need `import java.io.*;`. - -::: diagramm dt-lesen.visustruct -This is what reading looks like in a structure chart. Try it in the simulation. -::: - -::: ludwig -Imagine the Scanner as a finger pointing at a line. `nextLine()` reads the line under the finger and moves the finger down one line. Once the finger is below the last line, `hasNextLine()` returns `false`. -::: - -## What if the file is missing? - -If the file does not exist, Java cannot read it and throws a `FileNotFoundException`. Java insists that your program is prepared for this. Either you catch it with try and catch, as in lesson 22: - -```java -try { - Scanner file = new Scanner(new File("shopping.txt")); - // ... read ... - file.close(); -} catch (FileNotFoundException e) { - System.out.println("The file shopping.txt is missing!"); -} -``` - -Or you write `throws Exception` after `main`. It means: "This method may throw an exception, I won't deal with it." Then the program stops if the file is missing. - -```java -public static void main(String[] args) throws Exception { -``` - -> VisuStruct adds `throws Exception` after `main` automatically as soon as your program works with files. In the simulation, VisuStruct reports a missing file with "There is no file called …". - -## Exercise: Numbering the shopping list - -::: übung l23-java-nummern -titel: Numbering the shopping list -code: java -auftrag: Read `shopping.txt` line by line and print each line with its number: **1. Hay**, **2. Apples** and so on. -start: l23-java-nummern-start.visustruct -test: - -> 1. Hay | 2. Apples | 3. Carrots | 4. Dandelions -braucht: whileSchleife -tipp: Create `int number = 1;` before the loop and increase the number at the end of each pass. -tipp: The output is `System.out.println(number + ". " + line);` -lösung: l23-java-nummern-loesung.visustruct -::: - -## Writing to a file with PrintWriter - -For writing there is the `PrintWriter`. Its methods have the same names as those of `System.out`: - -```java -PrintWriter out = new PrintWriter("greeting.txt"); -out.println("Hello Zora!"); -out.println("See you tomorrow, Ludwig"); -out.close(); -``` - -Afterwards `greeting.txt` contains: - -``` -Hello Zora! -See you tomorrow, Ludwig -``` - -- `println` writes the text and then starts a new line, `print` writes without a new line. -- If the file already exists, it is **overwritten**. The old content is gone. -- After the run, VisuStruct shows below the output what was saved in the file. - -::: ludwig -Don't forget `close()`! The PrintWriter first collects the text in a buffer and only writes it to the file when it is closed. Without `close()` the file stays empty. I once lost a whole story that way. -::: - -## Exercise: Adding to the shopping list - -::: übung l23-java-ergaenzen -titel: Adding to the shopping list -code: java -auftrag: Ludwig still needs cake. Read `shopping.txt` and write each line to the new file `shopping-new.txt`. Then add **Cake** as the last line. At the end, print how many lines were saved: **5 lines saved**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 lines saved -datei: shopping-new.txt -> Hay | Apples | Carrots | Dandelions | Cake -braucht: whileSchleife -tipp: In the loop, read a line with `file.nextLine()` and write it straight out again with `out.println(line)`. -tipp: After the loop comes `out.println("Cake");`. Close both files with `close()`, otherwise `shopping-new.txt` stays empty. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Game: What is in the file? - -::: spiel frage -titel: Game: What is in the file? -intro: Ludwig writes files with the PrintWriter. Read the code and predict what is in the file afterwards. Six rounds. -frage: What is in the file afterwards? - -runde: - PrintWriter out = new PrintWriter("greeting.txt"); - out.println("Hello"); - out.println("Zora"); - out.close(); -- [x] Hello\nZora -- HelloZora -- Zora -> `println` starts a new line after each text. - -runde: - PrintWriter out = new PrintWriter("word.txt"); - out.print("He"); - out.print("llo"); - out.println("!"); - out.close(); -- He\nllo\n! -- [x] Hello! -- He llo ! -> `print` carries on without a new line, so the parts are joined directly. - -runde: - PrintWriter out = new PrintWriter("secret.txt"); - out.println("The treasure is in the tower"); -- The treasure is in the tower -- [x] Nothing, the file stays empty. -- Java reports an error. -> Without `close()` the text never reaches the file. It stays in the buffer. - -runde: - // Before, note.txt contains: Old - PrintWriter out = new PrintWriter("note.txt"); - out.println("New"); - out.close(); -- Old\nNew -- [x] New -- New\nOld -> A new PrintWriter overwrites the file. The old content is gone. - -runde: - PrintWriter out = new PrintWriter("numbers.txt"); - for (int i = 1; i <= 3; i++) { - out.println(i * 2); - } - out.close(); -- 1\n2\n3 -- 246 -- [x] 2\n4\n6 -> The loop writes 2, 4 and 6, each number on its own line. - -runde: - // shopping.txt contains: Hay, Apples (one per line) - Scanner file = new Scanner(new File("shopping.txt")); - PrintWriter out = new PrintWriter("big.txt"); - while (file.hasNextLine()) { - out.println(file.nextLine().toUpperCase()); - } - file.close(); - out.close(); -- Hay\nApples -- [x] HAY\nAPPLES -- HAYAPPLES -> Each line is read, turned into capital letters and written on its own line. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain why programs save data in files. → Why files? -- I can read a text file line by line with Scanner, hasNextLine and nextLine. → Reading a file with Scanner -- I can explain why Java requires try and catch or throws for files. → What if the file is missing? -- I can write a file with PrintWriter and finish it with close(). → Writing to a file with PrintWriter -- I can read a file, add to it and save it again with numbers. → Exercise: Adding to the shopping list -::: - -## Quiz - -::: quiz -? What does hasNextLine() return? -→ Reading a file with Scanner -- [ ] the next line -- [x] true if there is another line, otherwise false -- [ ] the number of lines -> With hasNextLine() the loop checks whether to carry on. - -? What happens if you call new PrintWriter("list.txt") for a file that already exists? -→ Writing to a file with PrintWriter -- [ ] The new text is added at the end. -- [x] The file is overwritten. -- [ ] Java reports an error. - -? Why does a file stay empty even though println was called? -→ Writing to a file with PrintWriter -- [ ] Because println only writes to the console. -- [x] Because close() is missing. -- [ ] Because the file name ends in .txt. -> Only close() writes the buffer into the file. - -? Match each method to its job. -→ Reading a file with Scanner -= nextLine() -> reads the next line -= println(text) -> writes a line -= close() -> closes the file -::: diff --git a/web/lessons/en/24-zeile-fuer-zeile.md b/web/lessons/en/24-zeile-fuer-zeile.md deleted file mode 100644 index 12a69712..00000000 --- a/web/lessons/en/24-zeile-fuer-zeile.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -titel: Line by line with BufferedReader -bereich: Files -kurz: Read with BufferedReader and readLine until null comes, and read a whole file at once with Files. ---- - -## Skills I will gain now - -::: kompetenzen -- read a file with BufferedReader and readLine -- spot the end of a file, because readLine returns null there -- count how often a word appears in a file -- read a whole file with Files.readString and split it into lines with split -- find the longest entry in a file -::: - -## The cake is gone! - -The morning after the party, Ludwig's cake has disappeared. Luckily the castle keeps a logbook. Every line starts with the day and the time: - -::: datei logbook.txt -Mo 08:15 Ludwig feeds the goats -Mo 12:30 Zora reads in the tower -Mo 18:00 Fox sneaks past the gate -Tu 09:00 Ludwig bakes a cake -Tu 14:45 Hare brings carrots -Tu 16:20 Fox asks for the recipe -Tu 23:55 The cake is gone -We 07:00 Zora finds crumbs at Fox's den -::: - -You could already read it with the Scanner from lesson 23. For files, though, professionals often use the **BufferedReader**. - -## Reading with BufferedReader - -```java -import java.io.*; - -BufferedReader reader = new BufferedReader(new FileReader("logbook.txt")); -String line = reader.readLine(); -while (line != null) { - System.out.println(line); - line = reader.readLine(); -} -reader.close(); -``` - -- `new FileReader("logbook.txt")` opens the file, and `new BufferedReader(…)` puts a buffer around it. It fetches the file in large chunks and is therefore faster for long files. -- `readLine()` returns the next line. When there are no more lines, it returns **null**. -- That is why the loop runs as long as `line != null`. At the end of each pass it reads the next line. - -::: diagramm dt-buffered.visustruct -First read a line, then check, then read the next one at the end of the pass. -::: - -**null** means "nothing at all". It is not the empty text `""`, but no text. A variable holding `null` has no methods: `line.length()` then stops with a `NullPointerException`. So always check `line != null` first. - -| | Scanner | BufferedReader | -|---|---|---| -| Create | `new Scanner(new File(…))` | `new BufferedReader(new FileReader(…))` | -| Is there another line? | `hasNextLine()` | `readLine()` returns `null` | -| Next line | `nextLine()` | `readLine()` | -| Strength | can also read numbers (`nextInt()`) | fast, even with large files | - -::: ludwig -The loop looks different from the Scanner one: the first line is read **before** the loop, every further one **at the end** of the pass. If you forget the read at the end, the program reads the same line again and again and never stops. -::: - -::: angeberwissen -Where a line ends is not the same everywhere: Windows writes two invisible characters, “carriage return” and “line feed”, Linux and macOS only the line feed. The names come from the typewriter, where the carriage moved back and the paper moved up one line. `readLine()` copes with both. -::: - -## Exercise: How often does the fox appear? - -::: übung l24-java-fuchs -titel: How often does the fox appear? -code: java -auftrag: Read the logbook with the BufferedReader and count the lines that contain **Fox**. At the end, print **Fox:** and the count. -start: l24-java-fuchs-start.visustruct -test: - -> Fox: 3 -braucht: whileSchleife, verzweigung -tipp: Create `int count = 0;` before the loop. In the loop, check `line.contains("Fox")`. -tipp: The `line = reader.readLine();` belongs at the end of the loop, after the if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Closing automatically - -So that `close()` isn't forgotten even after an exception, there is a short form of try: whatever is created in the round brackets after `try` is closed by Java on its own at the end. - -```java -try (BufferedReader reader = new BufferedReader(new FileReader("logbook.txt"))) { - String line = reader.readLine(); - while (line != null) { - System.out.println(line); - line = reader.readLine(); - } -} catch (IOException e) { - System.out.println("The logbook is missing."); -} -``` - -This is called **try-with-resources**. `IOException` catches all errors while reading and writing, including a missing file. - -> Like try and catch, try-with-resources only runs with real Java (lesson 22). In the simulation, you write `close()` yourself. - -## The shortcut: Files - -Since Java 11 it is even shorter. `Files.readString` reads the whole file at once, as you know from lesson 17. With `split("\n")` you split the text into an array of lines: - -```java -import java.nio.file.*; - -String text = Files.readString(Path.of("logbook.txt")); -String[] lines = text.split("\n"); -for (int i = 0; i < lines.length; i++) { - System.out.println(lines[i]); -} -``` - -Now all lines are in the array. You can look at them in any order, for example backwards or only every second one. - -| Way | Good for | -|---|---| -| `Scanner` | small files, reading numbers and words | -| `BufferedReader` | large files, line by line | -| `Files.readString` | small files that fit into the program as a whole | - -::: ludwig -A file with a million lines is better read line by line with the BufferedReader. With `Files.readString` the whole file would have to go into memory at once. -::: - -## Exercise: The longest entry - -::: übung l24-java-laengster -titel: The longest entry -code: java -auftrag: In the start code, the lines of the logbook are already in the array `lines`. Find the longest line and print it like this: **Longest entry:** followed by the line. -start: l24-java-laengster-start.visustruct -test: - -> Longest entry: We 07:00 Zora finds crumbs at Fox's den -braucht: forSchleife, verzweigung -tipp: Remember the longest line so far in `String longest = lines[0];` and go through the other lines with a for loop. -tipp: If `lines[i].length() > longest.length()`, then `lines[i]` becomes the new longest. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Game: File detective - -::: spiel frage -titel: Game: File detective -intro: Who took the cake? Each program searches the **logbook** from the top. Predict what it prints and collect the clues. Five rounds. -frage: What does the program print? - -runde: - String line = reader.readLine(); - line = reader.readLine(); - System.out.println(line.substring(9)); -- Ludwig feeds the goats -- [x] Zora reads in the tower -- Mo 12:30 Zora reads in the tower -> The second `readLine()` returns the second line. The text after the time starts at index 9. - -runde: - int n = 0; - String line = reader.readLine(); - while (line != null) { - if (line.startsWith("Tu")) n++; - line = reader.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Four entries are from Tuesday. - -runde: - String line = reader.readLine(); - while (line != null) { - if (line.contains("cake")) { - System.out.println(line.substring(3, 8)); - } - line = reader.readLine(); - } -- [x] 09:00\n23:55 -- 09:00 -- Tu\nTu -> Two lines contain "cake". `substring(3, 8)` cuts out the time. - -runde: - String line = reader.readLine(); - String last = ""; - while (line != null) { - if (line.contains("Fox")) last = line; - line = reader.readLine(); - } - System.out.println(last); -- Tu 16:20 Fox asks for the recipe -- [x] We 07:00 Zora finds crumbs at Fox's den -- Mo 18:00 Fox sneaks past the gate -> `last` is overwritten at every match. At the end it holds the last match. "Fox's den" contains "Fox" too. - -runde: - String line = reader.readLine(); - while (line != null) { - if (line.contains("crumbs")) { - int at = line.indexOf("at "); - System.out.println(line.substring(at + 3)); - } - line = reader.readLine(); - } -- [x] Fox's den -- at Fox's den -- crumbs -> The crumbs are at Fox's den. The fox asked for the recipe, and at 23:55 the cake was gone. Case solved! -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can read a file with BufferedReader and readLine. → Reading with BufferedReader -- I can spot the end of a file, because readLine returns null there (line != null). → Reading with BufferedReader -- I can count how often a word appears in a file. → Exercise: How often does the fox appear? -- I can read a whole file with Files.readString and split it into lines with split. → The shortcut: Files -- I can find the longest entry in a file. → Exercise: The longest entry -::: - -## Quiz - -::: quiz -? What does readLine() return when the file has ended? -→ Reading with BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null means: there is no more text. - -? Why is there another line = reader.readLine() at the end of the loop? -→ Reading with BufferedReader -- [ ] So that the file is closed. -- [x] Otherwise line never changes and the loop never stops. -- [ ] So that the first line is printed twice. - -? What does try-with-resources do? -→ Reading with BufferedReader -- [ ] It reads the file faster. -- [x] It closes the file on its own at the end. -- [ ] It prevents every exception. - -? Match each way to what it is good for. -→ The shortcut: Files -= BufferedReader -> large files, line by line -= Files.readString -> small files all at once -= Scanner -> reading numbers and words -::: diff --git a/web/lessons/en/25-tabellen-als-csv.md b/web/lessons/en/25-tabellen-als-csv.md deleted file mode 100644 index 1757c55c..00000000 --- a/web/lessons/en/25-tabellen-als-csv.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -titel: Tables as CSV -bereich: Files -kurz: Read a table as a CSV file, split each line with split and calculate with the numbers. ---- - -## Skills I will gain now - -::: kompetenzen -- explain how a CSV file is built: header, records, separator -- split a line with split and make a number out of it with Integer.parseInt -- skip the header before calculating -- calculate an average from a column of a CSV file -- find the best value in a column of a CSV file -- name one strength and one weakness of CSV -::: - -## A table in a text file - -Mrs Goat, the teacher at the castle school, has saved her class's grades as a table. As in Germany, 1 is the best grade and 6 the worst: - -| Name | Maths | German | English | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Fox | 4 | 3 | 5 | -| Hare | 2 | 1 | 3 | - -In the file, the table looks like this: - -::: datei class.csv -Name;Maths;German;English -Ludwig;2;3;1 -Zora;1;2;2 -Fox;4;3;5 -Hare;2;1;3 -::: - -This is a **CSV file**. CSV stands for "Comma-Separated Values". Each line is a row of the table, and the columns are separated by a separator character. In English-speaking countries this is usually a comma, in Germany and many other countries a **semicolon** `;`, because the comma is already used in numbers like `2,5`. We use the semicolon. - -- The first line is the **header**. It says what is in the columns. -- Every further line is a **record**, here one pupil. -- Excel, LibreOffice and Numbers open CSV files directly as a table. - -## Splitting a line with split - -You know `split(";")` from lesson 17. It splits a text at every semicolon and returns an array: - -```java -String line = "Zora;1;2;2"; -String[] parts = line.split(";"); -// parts[0] is "Zora", parts[1] is "1", parts[2] is "2", parts[3] is "2" -``` - -Afterwards the grades are still **text**. You can only calculate with them once you have turned them into a number with `Integer.parseInt`: - -```java -int maths = Integer.parseInt(parts[1]); -``` - -::: diagramm dt-csv.visustruct -Split a CSV line and read the maths grade as a number. -::: - -## Reading the whole file - -For the whole file, you combine the BufferedReader from lesson 24 with `split`. The header contains no grades, so you read it before the loop and skip it: - -```java -BufferedReader reader = new BufferedReader(new FileReader("class.csv")); -String line = reader.readLine(); // header -line = reader.readLine(); // first record -while (line != null) { - String[] parts = line.split(";"); - System.out.println(parts[0] + ": Maths " + parts[1]); - line = reader.readLine(); -} -reader.close(); -``` - -::: ludwig -Without the second `readLine()` before the loop, the header ends up in the loop. Then `Integer.parseInt("Maths")` tries to make a number out of the word, and Java stops with a `NumberFormatException`. -::: - -## Exercise: Maths average - -::: übung l25-java-schnitt -titel: Maths average -code: java -auftrag: Calculate the average maths grade. Skip the header, add up the maths grades (column 1) and divide by the number of records. Print **Maths average:** and the average. -start: l25-java-schnitt-start.visustruct -test: - -> Maths average: 2.25 -braucht: whileSchleife -tipp: Create `double sum = 0;` and `int count = 0;` before the loop. With `double`, nothing is cut off when dividing. -tipp: In the loop: `String[] parts = line.split(";");`, then `sum = sum + Integer.parseInt(parts[1]);` and `count++;`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Exercise: Best grade in English - -::: übung l25-java-beste -titel: Best grade in English -code: java -auftrag: Who has the best grade in English (column 3)? Print **Best grade in English:**, the name and the grade in brackets. -start: l25-java-beste-start.visustruct -test: - -> Best grade in English: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Remember the best grade so far in `int bestGrade = 7;` and the name in `String bestName = "";`. Every real grade is better than 7. -tipp: If `grade < bestGrade`, remember the new grade and `parts[0]` as the name. -lösung: l25-java-beste-loesung.visustruct -::: - -## Strengths and weaknesses of CSV - -| Good | Tricky | -|---|---| -| Tables take up little space. | If the separator appears in the text, for example `Hare;very good; hard-working`, the line falls apart into too many parts. | -| Excel and other programs open the file directly. | Everything is a flat table. If an animal has several favourite foods, that doesn't fit well into one cell. | -| Every program can read it with `split`. | The file doesn't say whether `1` is a number or a text. | - -::: ludwig -Excel saves CSV files with semicolons in Germany and with commas in England and the USA. That is why someone opening a file from another country sometimes sees everything in one single column. -::: - -## Game: Broken line - -::: spiel bombe -titel: Game: Broken line -intro: In every CSV file **exactly one line is broken**, and the bomb is ticking. Compare each line with the header and tap the broken line before time runs out. Five rounds, 20 seconds each. -zeit: 20 -daten: csv - -runde: - Name;Maths;German;English - Ludwig;2;3;1 - Zora;1 - Fox;4;3;5 -frage: Every line needs four columns. -fehler: 3 -besser: Zora;1;2;2 -> Two grades are missing for Zora. Then there is no `parts[3]`, and Java stops with an `ArrayIndexOutOfBoundsException`. - -runde: - Name;Grade;Comment - Ludwig;2;works well with others - Hare;1;very good; hard-working - Zora;1;reads a lot -frage: Every line needs three columns. -fehler: 3 -besser: Hare;1;very good, hard-working -> The semicolon in the comment splits off a fourth column. The separator must not appear in the text. - -runde: - Name;Maths;German;English - Ludwig;2;3;1 - Zora;1;2;2 - Fox,4,3,5 -frage: The separator is a semicolon. -fehler: 4 -besser: Fox;4;3;5 -> Here there are commas instead of semicolons. `split(";")` finds no semicolon and returns the whole line as a single part. - -runde: - Name;Maths;German;English - Hare;2;1;3 - Fox;four;3;5 - Ludwig;2;3;1 -frage: Grades are numbers. -fehler: 3 -besser: Fox;4;3;5 -> `Integer.parseInt("four")` cannot make a number out of the word and throws a `NumberFormatException`. - -runde: - Name;Maths;German;English - Zora;1;2;2 - Hare;2;1;3 - Ludwig;2;;1 -frage: No field may be empty. -fehler: 4 -besser: Ludwig;2;3;1 -> There is nothing between the two semicolons. `Integer.parseInt("")` throws a `NumberFormatException`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain how a CSV file is built: header, records, separator. → A table in a text file -- I can split a line with split and make a number out of it with Integer.parseInt. → Splitting a line with split -- I can skip the header before calculating. → Reading the whole file -- I can calculate an average from a column of a CSV file. → Exercise: Maths average -- I can find the best value in a column of a CSV file. → Exercise: Best grade in English -- I can name one strength and one weakness of CSV. → Strengths and weaknesses of CSV -::: - -## Quiz - -::: quiz -? What does "Hare;2;1;3".split(";")[2] return? -→ Splitting a line with split -- [ ] "2" -- [x] "1" -- [ ] 1 -> Counting starts at 0. And the result is a text, not a number. - -? Why does the program call readLine() twice before the loop? -→ Reading the whole file -- [ ] So that the file is read faster. -- [x] The first line is the header without grades. It is skipped. -- [ ] Because readLine always needs two lines. - -? What happens with Integer.parseInt("Maths")? -→ Splitting a line with split -- [ ] It returns 0. -- [x] Java throws a NumberFormatException. -- [ ] It returns the length of the word. - -? Match. -→ Strengths and weaknesses of CSV -= header -> says what is in the columns -= record -> a line with values -= separator -> separates the columns, often ; -::: diff --git a/web/lessons/en/26-json.md b/web/lessons/en/26-json.md deleted file mode 100644 index 145782ef..00000000 --- a/web/lessons/en/26-json.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -titel: Data as JSON -bereich: Files -kurz: Understand JSON files, get values out with indexOf and substring, and write JSON yourself. ---- - -## Skills I will gain now - -::: kompetenzen -- recognise objects, keys, values and lists in JSON -- get a value out of a JSON line with indexOf and substring -- output all values of one key from a JSON file -- build and save a JSON entry with + and \" -- save data as a JSON file -- name one strength and one weakness of JSON -::: - -## Data with names - -The castle zoo stores its animals in a file `zoo.json`: - -::: datei zoo.json -{ - "zoo": "Castle Zoo", - "animals": [ - {"name": "Ludwig", "species": "billy goat", "age": 7}, - {"name": "Zora", "species": "goat", "age": 6}, - {"name": "Fox", "species": "red fox", "age": 4}, - {"name": "Hare", "species": "brown hare", "age": 2} - ] -} -::: - -This is **JSON**, the "JavaScript Object Notation". Almost every web app and every game sends and stores data like this. Unlike in a CSV file, each value has its **name** in front of it, the **key**. - -| Character | Meaning | Example | -|---|---|---| -| `{ … }` | an **object**: pairs of key and value | `{"name": "Zora", "age": 6}` | -| `"key": value` | a pair, separated by a colon | `"age": 6` | -| `[ … ]` | a **list** of values, like an array | `"animals": [ … ]` | -| `,` | separates the pairs and the entries of a list | | -| `"…"` | a text. Numbers and `true`/`false` have no quotation marks. | `"goat"`, `6` | - -Objects and lists can be **nested**: the whole zoo object contains the list `animals`, and each animal is an object again. As with arrays, the list counts from 0: `animals[1].name` is `"Zora"`. - -::: angeberwissen -Douglas Crockford made JSON popular in the early 2000s. In the licence of his JSON program he wrote: “The Software shall be used for Good, not Evil.” So the company IBM asked whether it could use it anyway. He replied that IBM and its customers were allowed to use it for evil. -::: - -## Getting a value out - -Professionals read JSON with a library, for example **Gson**. It is not part of Java and has to be added first. For our zoo file, the string methods from lesson 17 are enough, because each animal is on its own line. - -In Java you write a quotation mark inside a text as `\"`. So the text `"\"name\": \""` is `"name": "`, exactly what comes before each name. - -```java -String line = "{\"name\": \"Zora\", \"species\": \"goat\", \"age\": 6},"; -int start = line.indexOf("\"name\": \"") + 9; -int end = line.indexOf("\"", start); -String name = line.substring(start, end); -``` - -- `indexOf("\"name\": \"")` finds the start of `"name": "`. That is 9 characters, so the name begins 9 characters further on. -- `indexOf("\"", start)` searches for the next quotation mark **from** `start`. That is where the name ends. -- `substring(start, end)` cuts out the name: `Zora`. - -::: diagramm dt-json.visustruct -Getting the name out of a JSON line. -::: - -## Exercise: All the names in the zoo - -::: übung l26-java-namen -titel: All the names in the zoo -code: java -auftrag: Read `zoo.json` line by line. In every line that contains `"name"`, print only the name. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Fox | Hare -braucht: whileSchleife, verzweigung -tipp: Check with `line.contains("\"name\"")` whether there is a name in the line. Skip the other lines. -tipp: Inside the if: `int start = line.indexOf("\"name\": \"") + 9;`, then `int end = line.indexOf("\"", start);` and `System.out.println(line.substring(start, end));`. -lösung: l26-java-namen-loesung.visustruct -::: - -## Writing JSON - -To write, you put the text together with `+` and write it to the file with the PrintWriter from lesson 23. Texts in JSON need quotation marks, so `\"` in the Java text, numbers don't: - -```java -String name = "Zora"; -int points = 15; -String entry = "{\"name\": \"" + name + "\", \"points\": " + points + "}"; -// entry is {"name": "Zora", "points": 15} -``` - -In a list there is a comma between the entries, but **none** after the last one. You check that with an if. - -::: ludwig -A single forgotten quotation mark or one comma too many, and no program can read the file any more. JSON is strict. That is why professionals also use a library for writing. -::: - -## Exercise: Saving points as JSON - -::: übung l26-java-schreiben -titel: Saving points as JSON -code: java -auftrag: Save the points from the quiz tournament as a list in `points.json`. Each line contains an object with **name** and **points**, and there is a comma between the objects. At the end, print **3 entries saved**. -start: l26-java-schreiben-start.visustruct -test: - -> 3 entries saved -datei: points.json -> [ | {"name": "Ludwig", "points": 12}, | {"name": "Zora", "points": 15}, | {"name": "Fox", "points": 9} | ] -braucht: forSchleife, verzweigung -tipp: Go through the arrays with `for (int i = 0; i < names.length; i++)`. Build the entry with `" {\"name\": \"" + names[i] + "\", \"points\": " + points[i] + "}"`. -tipp: If `i < names.length - 1`, add `","`. After the loop, write `"]"` and close the file. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Strengths and weaknesses of JSON - -| Good | Tricky | -|---|---| -| Every value has a name. You can see at once what `6` means. | The file is longer than a CSV file, because the keys appear on every line. | -| Data can be nested, for example a list inside an object. | Java can't read JSON on its own. You need a library such as Gson. | -| JSON is the standard on the web. Almost every programming language knows it. | One character too many or too few makes the whole file unreadable. | - -## Game: Which key? - -::: spiel frage -titel: Game: Which key? -intro: Ludwig is looking for values in JSON files. Read the file and say which value is meant. Five rounds. - -runde: - {"name": "Zora", "species": "goat", "age": 6} -frage: What is the value of **age**? -- "age" -- [x] 6 -- "goat" -> The key comes before the colon, the value after it. Numbers have no quotation marks. - -runde: - { - "animals": [ - {"name": "Ludwig", "age": 7}, - {"name": "Zora", "age": 6}, - {"name": "Fox", "age": 4} - ] - } -frage: What is **animals[1].name**? -- Ludwig -- [x] Zora -- Fox -> The list counts from 0, like an array. `animals[1]` is the second animal. - -runde: - { - "zoo": "Castle Zoo", - "boss": {"name": "Ludwig", "species": "billy goat"} - } -frage: How do you get to **billy goat**? -- [x] boss.species -- species -- zoo.boss.species -> `species` is inside the object `boss`. So the way goes through `boss`. - -runde: - { - "name": "Hare", - "favouriteFood": ["carrots", "clover", "dandelions"] - } -frage: What is **favouriteFood[2]**? -- clover -- carrots -- [x] dandelions -> Index 0 is carrots, 1 is clover, 2 is dandelions. Something like this hardly fits into one cell in CSV. - -runde: - {"name": "Fox", "age": 4, "hungry": true} -frage: Which key has a truth value? -- name -- age -- [x] hungry -> `true` and `false` have no quotation marks, like numbers. In Java this would be a `boolean`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can recognise objects, keys, values and lists in JSON. → Data with names -- I can get a value out of a JSON line with indexOf and substring. → Getting a value out -- I can output all values of one key from a JSON file. → Exercise: All the names in the zoo -- I can build and save a JSON entry with + and \". → Writing JSON -- I can save data as a JSON file. → Exercise: Saving points as JSON -- I can name one strength and one weakness of JSON. → Strengths and weaknesses of JSON -::: - -## Quiz - -::: quiz -? What comes before each value in JSON? -→ Data with names -- [ ] its line number -- [x] its key, for example "name" -- [ ] a semicolon -> Key and value are separated by a colon. - -? How do you write a quotation mark inside a Java text? -→ Writing JSON -- [ ] "" -- [x] \" -- [ ] '"' - -? In {"animals": [{"name": "Ludwig"}, {"name": "Zora"}]}, what is the value of animals[0].name? -→ Data with names -- [x] Ludwig -- [ ] Zora -- [ ] animals -> The list counts from 0. - -? Match. -→ Strengths and weaknesses of JSON -= { } -> an object with keys and values -= [ ] -> a list -= : -> separates key and value -::: diff --git a/web/lessons/en/27-formate-im-vergleich.md b/web/lessons/en/27-formate-im-vergleich.md deleted file mode 100644 index f5bc1b51..00000000 --- a/web/lessons/en/27-formate-im-vergleich.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -titel: Comparing formats -bereich: Files -kurz: Compare the same data as txt, CSV and JSON, choose the right format and convert a file into another format. ---- - -## Skills I will gain now - -::: kompetenzen -- recognise the same data as txt, CSV and JSON -- compare strengths and weaknesses of txt, CSV and JSON -- convert a CSV file into sentences -- convert a CSV file into JSON -::: - -## The same animals three times - -Ludwig has saved the castle's animals in three files. They all contain the same, just written down differently. - -As text, the way you would write it to a person: - -::: datei animals.txt -Ludwig (billy goat) is 7 years old. -Zora (goat) is 6 years old. -Fox (red fox) is 4 years old. -::: - -As a table in CSV: - -::: datei animals.csv -Name;Species;Age -Ludwig;billy goat;7 -Zora;goat;6 -Fox;red fox;4 -::: - -As JSON: - -::: datei animals.json -[ - {"name": "Ludwig", "species": "billy goat", "age": 7}, - {"name": "Zora", "species": "goat", "age": 6}, - {"name": "Fox", "species": "red fox", "age": 4} -] -::: - -## What can each format do? - -| | txt | CSV | JSON | -|---|---|---|---| -| Easy for people to read | yes | so-so | so-so | -| Fixed order for programs | no | yes, columns | yes, keys | -| What does a value mean? | it's in the sentence | it's in the header | it's right in front of it | -| Nesting (a list inside an entry) | no | hard | yes | -| Opens in Excel | no | yes | no | -| Reading in Java | Scanner, BufferedReader | plus `split` | string methods or a library | -| Size | small | smallest | largest | - -In short: - -- **txt** for texts that people read: letters, notes, a logbook. -- **CSV** for tables: grades, measurements, a high-score list. Every line has the same columns. -- **JSON** for data with structure: game saves, settings, everything that goes back and forth between programs and on the web. - -::: ludwig -When your weather app fetches the temperature, the answer almost always comes as JSON. And when a teacher exports the grades from the school software, they often get a CSV file. -::: - -## Exercise: From CSV to sentences - -::: übung l27-java-saetze -titel: From CSV to sentences -code: java -auftrag: Convert `animals.csv` into text. For each animal, write a sentence like **Ludwig (billy goat) is 7 years old.** into the file `sentences.txt`. At the end, print **3 sentences saved**. -start: l27-java-saetze-start.visustruct -test: - -> 3 sentences saved -datei: sentences.txt -> Ludwig (billy goat) is 7 years old. | Zora (goat) is 6 years old. | Fox (red fox) is 4 years old. -braucht: whileSchleife -tipp: The start code already skips the header. Split each line with `String[] parts = line.split(";");`. -tipp: The sentence is `parts[0] + " (" + parts[1] + ") is " + parts[2] + " years old."`. Count along with `count++` and read the next line at the end of the loop. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Exercise: From CSV to JSON - -::: übung l27-java-json -titel: From CSV to JSON -code: java -auftrag: Convert `animals.csv` into JSON and save it in `animals-new.json`, exactly like `animals.json` above. At the end, print **3 animals saved**. -start: l27-java-json-start.visustruct -test: - -> 3 animals saved -datei: animals-new.json -> [ | {"name": "Ludwig", "species": "billy goat", "age": 7}, | {"name": "Zora", "species": "goat", "age": 6}, | {"name": "Fox", "species": "red fox", "age": 4} | ] -braucht: forSchleife, verzweigung -tipp: `lines[0]` is the header. So start the for loop at `i = 1` and split `lines[i]` with `split(";")`. -tipp: Build the entry with `\"` as in lesson 26. The age is a number and has no quotation marks. Only add a comma if `i < lines.length - 1`. -lösung: l27-java-json-loesung.visustruct -::: - -## Game: Which format fits? - -::: spiel frage -titel: Game: Which format fits? -intro: Ludwig wants to save data and doesn't know which format to use. Help him. Six rounds. -antworten: txt | CSV | JSON - -runde: -frage: The grades of the whole class should be opened in Excel. -richtig: CSV -> Grades are a table, and Excel opens CSV files directly. - -runde: -frage: Ludwig writes a letter to Zora. -richtig: txt -> A letter is text for people. It needs no columns and no keys. - -runde: -frage: A game save with a name, a level and a list of all the keys collected. -richtig: JSON -> A list inside an entry can be nested in JSON. In CSV it hardly fits into one cell. - -runde: -frage: A measuring device saves the time and temperature every minute, for a whole year. -richtig: CSV -> Many identical lines with the same columns: CSV is the smallest for this. JSON would repeat the keys on every line. - -runde: -frage: A weather app fetches the forecast from a server on the internet. -richtig: JSON -> JSON is the standard on the web. Almost every app gets its data this way. - -runde: -frage: The castle logbook, where every entry is a short sentence. -richtig: txt -> Every line is a sentence for people. It is read line by line, as in lesson 24. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can recognise the same data as txt, CSV and JSON. → The same animals three times -- I can compare strengths and weaknesses of txt, CSV and JSON. → What can each format do? -- I can convert a CSV file into sentences. → Exercise: From CSV to sentences -- I can convert a CSV file into JSON. → Exercise: From CSV to JSON -::: - -## Quiz - -::: quiz -? Which format does Excel open directly as a table? -→ What can each format do? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Why is a JSON file usually larger than a CSV file with the same data? -→ What can each format do? -- [ ] Because JSON stores more numbers. -- [x] Because the keys are repeated in every entry. -- [ ] Because JSON uses no commas. - -? In which format does every value say what it means? -→ What can each format do? -- [ ] txt -- [ ] CSV -- [x] JSON -> In JSON the key comes right before the value, for example "age": 7. - -? Match each purpose with a format. -→ What can each format do? -= a letter to Zora -> txt -= the class grade list -> CSV -= a game save with lists -> JSON -::: diff --git a/web/lessons/en/28-erstes-fenster.md b/web/lessons/en/28-erstes-fenster.md deleted file mode 100644 index 2ff87904..00000000 --- a/web/lessons/en/28-erstes-fenster.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -titel: Your first window -bereich: Windows with Swing -kurz: Open your own window with Java and Swing, explained line by line. ---- - -## Skills I will gain now - -::: kompetenzen -- switch on “Real Java” in the Code area -- open a window with a title and a size -- explain what each line of the window program does -- explain why setVisible(true) comes last -::: - -## Programs with windows - -So far your programs have written text to the console. Most programs you know, however, have **windows** with buttons and text fields. This is called a graphical user interface. - -Java comes with a toolbox for this: **Swing**. In VisuStruct you switch it on like this: - -1. Open the [Code](#zeige-codelive) area on the right. -2. Click the [gear](#zeige-einstellungen) at the top right and choose Java as the **Programming language**. -3. Below that, in the Java section, tick **Real Java (with Swing)**. - -The first time you click [▶︎ Run](#zeige-ausfuehren), VisuStruct downloads about 40 MB once, which takes a moment. After that your code runs as real Java, and your windows appear in the Code area in the **Java windows** box above the console. - -> With “Real Java”, input from the console (`Scanner`) does not work yet. For programs with input, untick the box again. - -::: angeberwissen -Swing has been around since 1998. Before that, Java only had the older AWT with a class called `Frame`. So that nobody mixes up the new building blocks, almost all names in Swing start with **J**: `JFrame`, `JButton`, `JLabel`. The J tells you straight away that it is Swing. -::: - -## The whole program - -This is the smallest program that opens a window. Type it into the Code area and click [▶︎ Run](#zeige-ausfuehren): - -```java -import javax.swing.*; - -public class MyWindow { - public static void main(String[] args) { - JFrame window = new JFrame("My first window"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); - } -} -``` - -An empty grey window with the title “My first window” appears. That's all, but it is your very own window! - -You already know the frame with `public class` and `main` from the Java lesson. The first line and the four lines inside `main` are new. Let's look at them one by one. - -::: ludwig -Look at the structure chart next to the code: every line in `main` is a box, one below the other. So at the start, a window program is just a sequence. -::: - -## Line by line - -| Line | What it does | -|---|---| -| `import javax.swing.*;` | Brings the Swing toolbox into the program. Without this line Java does not know `JFrame`. | -| `JFrame window = new JFrame("My first window");` | Builds a new window. The text in brackets is the title at the top of the window frame. After that you talk to it through the variable `window`. | -| `window.setSize(300, 200);` | The window becomes 300 pixels wide and 200 pixels high. | -| `window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);` | When someone closes the window, the program ends too. | -| `window.setVisible(true);` | Only now does the window become visible. | - -The dot in `window.setSize(…)` means: “Window, do this!” Before the dot is who should do something, after it is what they should do. - -> Without `setDefaultCloseOperation`, Java only hides the window when it is closed. The program then keeps running invisibly. - -::: quiz -? What does the dot in `window.setSize(300, 200)` mean? -- [x] “Window, do this!”: before the dot is who does something, after it what they do. -- [ ] It separates the two numbers. -- [ ] It ends the line. -> Before the dot is the object `window`, after it its method `setSize`. -::: - -## Why setVisible comes last - -`setVisible(true)` shows the window exactly as it is at that moment. So you set everything up first: title, size, and later buttons too. Only at the very end do you make the window visible. - -Things you put into the window after `setVisible(true)` often do not appear. Java does not redraw the window on its own. Sometimes they only show up when you resize the window. Mistakes like that are hard to find. - -::: ludwig -Set up first, then show. Like in the theatre: the curtain only goes up once the stage is ready. -::: - -Try it: delete the line with `setVisible(true)` and run the program again. The program runs, but you do not see a window. - -## Classes and objects - -This is not in the curriculum, but it helps you understand Swing. - -::: angeberwissen -Java is really an **object-oriented** language. `JFrame` is a class, a blueprint for windows. With `new JFrame(…)` Java builds a real window from this blueprint, an **object**. With two `new` you could build two windows, both from the same blueprint. - -`setSize` and `setVisible` are methods that every window object has. That is why you write `window.setSize(…)`: the object `window` runs its method. Your program itself is a class too, namely `MyWindow`. -::: - -## Game: What happens? - -::: spiel frage -titel: Game: What happens? -intro: Ludwig has been tinkering with the window program. Read the lines and predict what happens. Six rounds. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: What do you see after running it? -- a window with the title "Hello" -- [x] no window at all -- an error message -> `setVisible(true)` is missing. The window is built, but it stays invisible. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(200, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); -frage: What does the window look like? -- wider than high -- [x] higher than wide -- square -> The first number is the width, the second the height: 200 wide, 300 high. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(300, 200); - window.setVisible(true); -frage: You close the window. What happens to the program? -- It ends. -- [x] It keeps running invisibly. -- The window opens again right away. -> Without `setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)` Java only hides the window. - -runde: - JFrame window = new JFrame(); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); -frage: What is written at the top of the window frame? -- window -- JFrame -- [x] nothing, the title is empty -> Without text in the brackets the window has no title. The variable name `window` never shows up in the window. - -runde: - public class Test { - public static void main(String[] args) { - JFrame window = new JFrame("Test"); - window.setVisible(true); - } - } -frage: What does javac report? -- [x] cannot find symbol: class JFrame -- nothing, the window appears -- missing return statement -> The line `import javax.swing.*;` is missing. Without it Java doesn't know `JFrame`. - -runde: - JFrame a = new JFrame("One"); - JFrame b = new JFrame("Two"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: What do you see? -- [x] one window with the title "One" -- two windows -- one window with the title "Two" -> Two windows from the same blueprint, but only `a` is made visible. -::: - -## Task: your own window - -Change the program so that - -- the title says “Hello” and your name, -- the window is 400 pixels wide and 300 pixels high, -- the program ends when you close the window. - -Run it and check all three points. - -::: ludwig -Don't feel like typing so much? With “Real Java” you may type just the four lines from `main` into the Code area. VisuStruct then wraps them in a class itself and adds the `import` lines. In a real Java development environment, though, you need the whole program. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can switch on “Real Java” in the Code area. → Programs with windows -- I can open a window with a title and a size. → The whole program -- I can explain what each line of the window program does. → Line by line -- I can explain why setVisible(true) comes last. → Why setVisible comes last -::: - -## Quiz - -::: quiz -? Which line makes the window visible? -→ Why setVisible comes last -- [ ] window.setSize(300, 200); -- [x] window.setVisible(true); -- [ ] new JFrame("Hello"); -> Without setVisible(true) the window stays invisible. - -? Where is the best place for window.setVisible(true)? -→ Why setVisible comes last -- [ ] At the very start of main -- [x] At the end, once the window is set up -- [ ] It does not matter. -> Things added after setVisible(true) often do not appear. - -? What does setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) do? -→ Line by line -- [ ] The window closes immediately. -- [x] When you close the window, the program ends. -- [ ] The window can no longer be closed. - -? How do you recognise building blocks from Swing? -→ Line by line -- [x] Their name starts with J, e.g. JFrame. -- [ ] They are in curly brackets. -- [ ] They end in Window. -::: diff --git a/web/lessons/en/29-knopf-im-fenster.md b/web/lessons/en/29-knopf-im-fenster.md deleted file mode 100644 index 873942a2..00000000 --- a/web/lessons/en/29-knopf-im-fenster.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -titel: A button in the window -bereich: Windows with Swing -kurz: Put a button into the window and arrange it neatly with a layout. ---- - -## Skills I will gain now - -::: kompetenzen -- build a button and put it into the window with add -- explain why the button goes in before setVisible -- use FlowLayout so that the button has its normal size -- build a window with a button you can press -::: - -## Building a button - -An empty window is boring. Now a button goes in. In Swing a button is called **JButton**. - -You need two new lines for it: - -```java -JButton button = new JButton("Click me"); -window.add(button); -``` - -- `new JButton("Click me")` builds a button. The text in brackets will be written on the button. -- `window.add(button)` puts the button into the window. Without `add` the button exists, but it is not placed anywhere and you cannot see it. - -::: quiz -? What is written on the button after `new JButton("Start")`? -- [ ] button -- [x] Start -- [ ] JButton -> The text in brackets is the label. `button` is only the name of the variable. -::: - -## The whole program - -Both lines go **before** `setVisible(true)`, because the window should be set up completely first and then shown: - -```java -import javax.swing.*; - -public class ButtonWindow { - public static void main(String[] args) { - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton button = new JButton("Click me"); - window.add(button); - - window.setVisible(true); - } -} -``` - -Run the program. Surprise: the button is huge and fills the whole window! - -::: ludwig -The order is the same as with your first window: set up, build the button, put the button in and show everything at the very end. The empty lines in the code help you see these parts. -::: - -## The giant button - -How a window arranges its parts is decided by its **layout**. Without further instructions, a `JFrame` puts everything in the middle and makes it as big as the whole window. - -With a different layout the button gets its normal size. The **FlowLayout** places everything side by side like words in a line, only as big as needed: - -```java -import javax.swing.*; -import java.awt.*; - -public class ButtonWindow { - public static void main(String[] args) { - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new FlowLayout()); - - JButton button = new JButton("Click me"); - window.add(button); - - window.setVisible(true); - } -} -``` - -`FlowLayout` belongs to the older AWT toolbox. That is why there is a second line at the top: `import java.awt.*;`. - -::: angeberwissen -With FlowLayout the building blocks flow like text: if a button no longer fits into the line, it moves to the next one. Make the window narrow and watch the buttons wrap. That is where the name comes from. -::: - -## Clicking works, but nothing happens - -Click the button. It turns a little darker while you press it. So Swing shows that it was pressed. Apart from that, nothing happens. - -That is not a mistake: you have not told the program **what** should happen on a click yet. You will learn that in the next lesson. - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every window program contains **exactly one mistake**, and the bomb is ticking. Read what the program should do and tap the wrong line before time runs out. Six rounds, 25 seconds each. -zeit: 25 - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - JButton button = new JButton(Click me); - window.add(button); - window.setVisible(true); -frage: Should show a button "Click me". -fehler: 3 -besser: JButton button = new JButton("Click me"); -> The caption is a text and needs quotation marks. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - JButton button = new JButton("OK"); - window.add(window); - window.setVisible(true); -frage: Should put the button "OK" into the window. -fehler: 4 -besser: window.add(button); -> The button goes into the window, not the window itself. - -runde: - import java.swing.*; - import java.awt.*; -frage: Should bring Swing and the FlowLayout into the program. -fehler: 1 -besser: import javax.swing.*; -> Swing lives in `javax.swing`, with an x. The FlowLayout comes from `java.awt`, without an x. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout); - window.add(new JButton("OK")); - window.setVisible(true); -frage: Should show the button at its normal size. -fehler: 3 -besser: window.setLayout(new FlowLayout()); -> After `new` and the name there are always round brackets, even if nothing is inside. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout()); - JButton button = new Jbutton("OK"); - window.add(button); - window.setVisible(true); -frage: Should show a button "OK". -fehler: 4 -besser: JButton button = new JButton("OK"); -> Java tells capital and small letters apart: `JButton` with a capital B. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout()); - window.add(new JButton("OK")); - window.setVisible(false); -frage: Should show the window with the button. -fehler: 5 -besser: window.setVisible(true); -> With `false` the window stays invisible. -::: - -## Task: click me - -Build a window with the title “Button test”, 300 by 200 pixels, with a button “Click me” in normal size. It should be possible to press the button, even though nothing happens yet. - -Extra: put a second button “Me too” next to it. In which order are the buttons? Swap the two `add` lines and try again. - -**You are done when …** - -- the window title says “Button test”, -- the window is 300 pixels wide and 200 pixels high, -- the “Click me” button is only as big as its text and does not fill the whole window, -- the button visibly presses down when you click it. - -::: ludwig -Every button needs its own variable, for example `button` and `button2`, and its own `add`. FlowLayout places the buttons in the order of the `add` lines. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a button and put it into the window with add. → Building a button -- I can explain why the button goes in before setVisible(true). → The whole program -- I can use FlowLayout so that the button has its normal size. → The giant button -- I can build a window with a button you can press. → Task: click me -::: - -## Quiz - -::: quiz -? What does window.add(button) do? -→ Building a button -- [ ] It builds a new button. -- [x] It puts the button into the window. -- [ ] It makes the button clickable. -> The button is built with new JButton(…). - -? Why does the button fill the whole window without FlowLayout? -→ The giant button -- [ ] Because the text is too long -- [x] Because without its own layout the window makes everything as big as the window -- [ ] Because setSize is missing - -? Which import line do you need for FlowLayout? -→ The giant button -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> FlowLayout comes from the older AWT. - -? What happens when you click the button in this lesson? -→ Task: click me -- [ ] The program ends. -- [x] The button turns darker for a moment, nothing else happens. -- [ ] The button says “I was clicked”. -> What should happen on a click is what you learn in the next lesson. -::: diff --git a/web/lessons/en/30-der-knopf-reagiert.md b/web/lessons/en/30-der-knopf-reagiert.md deleted file mode 100644 index 77e236b5..00000000 --- a/web/lessons/en/30-der-knopf-reagiert.md +++ /dev/null @@ -1,356 +0,0 @@ ---- -titel: The button reacts -bereich: Windows with Swing -kurz: Use an ActionListener to decide what happens on a click. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an event is -- use addActionListener to decide what happens on a click -- run several statements on a click -- build a button that changes its text after the click -::: - -## A click is an event - -In the last lesson you could press the button, but nothing happened. In a window program it is the person who decides when something happens: they click, type or close a window. Each such action is called an **event**. - -So your program has to wait for the click and notice it. For this you register a listener with the button, an **ActionListener**. On every click the button calls its listener, and the listener runs your code. - -::: ludwig -Until now your program ran from top to bottom, just like the structure chart. The code in the listener only runs later, whenever someone clicks. Nobody knows in advance how often that will be. -::: - -## The line with the arrow - -This is how you register the listener: - -```java -button.addActionListener(e -> button.setText("I was clicked")); -``` - -Read from the outside in: - -- `button.addActionListener( … )` registers a listener with the button. -- `e` is the event. It contains, for example, when the click happened. You do not need it here, but the name has to be there. -- Read `->` as “then do”. -- `button.setText("I was clicked")` is what happens on a click: the button gets a new label. - -The line comes after `new JButton(…)`, because the button has to exist already. And like everything else it comes before `setVisible(true)`. - -::: quiz -? What does the `e` in `e -> button.setText(…)` stand for? -- [x] The event, that is the click -- [ ] “End” -- [ ] An error -> You do not need `e` here, but the name has to be there. -::: - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; - -public class ClickMe { - public static void main(String[] args) { - JFrame window = new JFrame("Click me"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new FlowLayout()); - - JButton button = new JButton("Click me"); - button.addActionListener(e -> button.setText("I was clicked")); - window.add(button); - - window.setVisible(true); - } -} -``` - -Run it and click the button. Now it says “I was clicked”. - -> If the new text is longer than the old one, FlowLayout makes the button wider on its own. - -## Several statements on a click - -If more than one thing should happen on a click, put curly brackets after the arrow. Inside, every statement has its semicolon, just like in a loop body: - -```java -button.addActionListener(e -> { - button.setText("I was clicked"); - window.setTitle("Thank you!"); - System.out.println("Click!"); -}); -``` - -`System.out.println` writes to the [console](#zeige-konsole) as usual. Click several times: every click adds a new line “Click!”. That shows you that the code in the listener really runs on every click. - -::: ludwig -Watch the ending: first `}` closes the block, then `)` closes the bracket of `addActionListener`, then comes the semicolon. So `});`. If any of it is missing, a hint appears below the code. -::: - -## Game: Who is listening? - -::: spiel zuhoerer -titel: Game: Who is listening? -intro: Ludwig shows you code and the window that goes with it. Below it you see which buttons are clicked, one after the other. What happens? After your answer Ludwig plays the clicks: you see which listener hears the event and which lines then run. -frage: What does the label say after the clicks? - -runde: - JFrame window = new JFrame("Greeting"); - JLabel text = new JLabel("Start"); - JButton button = new JButton("Hello"); - button.addActionListener(e -> text.setText("Hello world")); -klicks: Hello -- Start -- [x] Hello world -- Hello -> The button has a listener. On a click it runs `text.setText("Hello world")`, and the label shows “Hello world”. - -runde: - JFrame window = new JFrame("Fruit"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apple")); - b.addActionListener(e -> text.setText("Pear")); -klicks: A, B -- Apple -- [x] Pear -- Apple Pear -> Each button has its own listener. First A writes “Apple”, then B overwrites it with “Pear”. `setText` replaces the old text, it doesn't add anything. - -runde: - JFrame window = new JFrame("Fruit"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apple")); -klicks: B -- Apple -- Pear -- [x] ? -> Nobody signed up at button B: there is no `b.addActionListener`. The click is an event, but nobody is listening. So the question mark stays. - -runde: - JFrame window = new JFrame("Colours"); - JLabel text = new JLabel("none"); - JButton red = new JButton("Red"); - JButton blue = new JButton("Blue"); - red.addActionListener(e -> text.setText("Blue")); - blue.addActionListener(e -> text.setText("Red")); -klicks: Red -- Red -- [x] Blue -- none -> Careful: what happens is decided by the code in the listener, not by the caption of the button. The listener on the button “Red” writes “Blue”. - -runde: - JFrame window = new JFrame("Button"); - JLabel text = new JLabel("Please click"); - JButton button = new JButton("Click me"); - button.addActionListener(e -> { - button.setText("Thanks!"); - text.setText("Clicked"); - }); -klicks: Click me -frage: What does the button say after the click? -- Click me -- [x] Thanks! -- Clicked -> The block after the arrow has two statements. Both run on the click, one after the other: the button gets “Thanks!”, the label “Clicked”. - -runde: - JFrame window = new JFrame("Console"); - JButton button = new JButton("Go"); - button.addActionListener(e -> System.out.println("Click!")); -klicks: Go, Go, Go -frage: How many lines “Click!” are in the console afterwards? -- 1 -- [x] 3 -- 0 -> The listener runs on **every** click, not only on the first one. Three clicks, three lines. -::: - -## ActionListener is an interface - -This is not in the curriculum. If you want to know what is behind the arrow, read on. - -::: angeberwissen -`ActionListener` is an **interface**, a kind of contract. It says: whoever wants to be an ActionListener must have a method `actionPerformed(ActionEvent e)`. On every click the button calls exactly this method. -::: - -You already know the line with the arrow from step 3: - -```java -button.addActionListener(e -> button.setText("I was clicked")); -``` - -Without the arrow you write the listener as a class without a name that fulfils the contract (an anonymous class): - -```java -button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - button.setText("I was clicked"); - } -}); -``` - -For this you also need `import java.awt.event.*;` at the top. Both ways do exactly the same. The arrow `e -> …` is the short form (a lambda expression, since Java 8): `e` is the parameter of `actionPerformed`, and after the arrow comes its body. The short form works because the interface has only one method. So Java knows which method is meant. - -## Game: Contract fulfilled? - -::: spiel vertrag -titel: Game: Contract fulfilled? -intro: The contract `ActionListener` asks for exactly one method: `public void actionPerformed(ActionEvent e)`. Ludwig shows you code. Does it fulfil the contract, so that you can sign it up at a button? Ludwig checked every answer with the real Java compiler. -frage: Does this fulfil the contract ActionListener? -antworten: fulfilled | not fulfilled - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: fulfilled -> Everything is there: `implements ActionListener` signs the contract, and the method is called exactly `actionPerformed`, is `public`, returns nothing (`void`) and gets an `ActionEvent`. - -runde: - class Greeting implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> Look closely: `actionPerfomed` instead of `actionPerformed`, an r is missing. For Java that is a completely different method. The compiler reports that `actionPerformed` is missing. - -runde: - class Greeting implements ActionListener { - public void actionPerformed() { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> The parameter is missing. The contract asks for `actionPerformed(ActionEvent e)`, because on a click the button hands over the event. - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent event) { - System.out.println("Hello"); - } - } -richtig: fulfilled -> You can choose the name of the parameter freely. Only the type `ActionEvent` matters. So instead of `e` it may also be called `event`. - -runde: - class Greeting implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> The `public` is missing. All methods of an interface are public, because the button has to be able to call them from outside. Without `public` the compiler reports an error. - -runde: - class Greeting implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: not fulfilled -> The contract says `void`: the method returns nothing. With `int` as the return type it no longer fits. - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - sayHello(); - } - void sayHello() { - System.out.println("Hello"); - } - } -richtig: fulfilled -> Extra methods are allowed. The contract only asks that `actionPerformed` is there, not that nothing else is there. - -runde: - class Greeting { - public void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } - button.addActionListener(new Greeting()); -richtig: not fulfilled -> The method is right, but the contract isn't signed: `implements ActionListener` is missing. At a button Java only accepts objects that officially fulfil the contract. - -runde: - button.addActionListener(e -> System.out.println("Hello")); -richtig: fulfilled -> The arrow is the short form. Because the contract has only one method, Java knows: `e` is the parameter of `actionPerformed`, and after the arrow comes its body. - -runde: - button.addActionListener((a, b) -> System.out.println("Hello")); -richtig: not fulfilled -> Here the arrow has two parameters. But `actionPerformed` gets exactly one, the event. So this short form doesn't fit the contract. -::: - -## Task: I was clicked - -Now you finish the task: build a window with a button “Click me” in normal size. After the click the button says “I was clicked”. - -Extra: build two buttons “Red” and “Blue”. Clicking a button writes its name into the window title, for example “You chose Red”. - -**You are done when …** - -- the button says “Click me” before the click, -- it says “I was clicked” after the click, -- the button does not fill the whole window. - -::: ludwig -Every button gets its own listener with its own `addActionListener`. You change the title with `window.setTitle(…)`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an event is. → A click is an event -- I can use addActionListener to decide what happens on a click. → The line with the arrow -- I can run several statements on a click. → Several statements on a click -- I can build a button that changes its text after the click. → Task: I was clicked -::: - -## Quiz - -::: quiz -? What is an ActionListener? -→ A click is an event -- [ ] A button with text -- [x] A listener that runs your code on every click -- [ ] A layout for windows -> You register it with the button using addActionListener. - -? When does button.setText("I was clicked") in the listener run? -→ The line with the arrow -- [ ] Right when the program starts -- [x] Every time someone clicks the button -- [ ] Only on the first click -> The code in the listener only runs when the event happens. - -? How does a listener with curly brackets end? -→ The line with the arrow -- [ ] };) -- [x] }); -- [ ] );} -> First the block closes, then the bracket of addActionListener, then the semicolon. - -? Match each part to its job. -→ The line with the arrow -= JButton -> a button -= addActionListener -> register a listener -= setText -> change the label -= setVisible(true) -> show the window -::: diff --git a/web/lessons/en/31-zahl-verdoppeln.md b/web/lessons/en/31-zahl-verdoppeln.md deleted file mode 100644 index 4ab802c8..00000000 --- a/web/lessons/en/31-zahl-verdoppeln.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Doubling a number in a window -bereich: Windows with Swing -kurz: Arrange a label, a text field and a button with a GridLayout and calculate with the text in the text field. ---- - -## Skills I will gain now - -::: kompetenzen -- put a JLabel and a JTextField into the window -- explain why only the last building block shows without a layout -- arrange everything below each other with GridLayout -- calculate with getText, Integer.parseInt and setText -- write a program that doesn't crash with “abc” -::: - -## The goal - -We build a small calculator with a window: at the top there is a label, below it a text field and a button **Calculate**. If you type 2 and click, the text field shows 4. Click again and it becomes 8, then 16 and so on. - -For this you need two new building blocks: - -- **JLabel**: a label, simply text in the window. -- **JTextField**: a text field you can type into. - -As in the last lessons, tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Three building blocks in the window - -We put all three building blocks into the window, just like the button in lesson 29: - -```java -import javax.swing.*; - -public class Doubling { - public static void main(String[] args) { - JFrame window = new JFrame("Double the number"); - window.setSize(250, 150); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel label = new JLabel("Enter a number:"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate"); - window.add(label); - window.add(field); - window.add(button); - - window.setVisible(true); - } -} -``` - -Run the program. Oops: all you can see is the giant button. Where are the label and the text field? - -## Why only the button shows - -::: ludwig -Remember the giant button? Without a layout of its own, a `JFrame` has only **one** place: the middle. Every `add` puts the new building block exactly there, as big as the whole window. So the three building blocks land on top of each other in the same place, and the window only shows the last one you put in: the button. You can't use the program like this. -::: - -The solution is a layout again. This time we use the **GridLayout**. It divides the window into cells of equal size, like a grid: - -```java -window.setLayout(new GridLayout(0, 1)); -``` - -The two numbers are rows and columns. `0` rows means “as many as needed”, `1` column means: everything below each other. For `GridLayout` you also need `import java.awt.*;` at the top. - -| Layout | How it arranges things | -|---|---| -| no layout | everything in the middle, on top of each other | -| `FlowLayout` | side by side like words, with a line break when needed | -| `GridLayout(0, 1)` | below each other, every row the same height | - -## The window with GridLayout - -```java -import javax.swing.*; -import java.awt.*; - -public class Doubling { - public static void main(String[] args) { - JFrame window = new JFrame("Double the number"); - window.setSize(250, 150); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel label = new JLabel("Enter a number:"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate"); - window.add(label); - window.add(field); - window.add(button); - - window.setVisible(true); - } -} -``` - -Now all three are below each other. You can type into the text field and press the button. But the program doesn't calculate anything yet. - -::: angeberwissen -With `new GridLayout(2, 3)` you get 2 rows with 3 columns each, so 6 cells of the same size. That is how you build the keys of a calculator, for example. The building blocks fill the cells in the order of the `add` lines, row by row from left to right. -::: - -## Calculating with the text in the text field - -On a click, the program should take the number from the text field, double it and write it back. Three methods do this: - -- `field.getText()` gives you the text in the text field, for example `"2"`. -- `Integer.parseInt(…)` turns it into the number 2. You know this from lesson 22. -- `field.setText(…)` writes a new text into the text field. - -Together with the ActionListener from lesson 30 it looks like this: - -```java -button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); -}); -``` - -`setText` needs a text. `"" + number * 2` appends the result to an empty text and so turns the number into a text. - -## Not a number? No crash! - -Type “abc” into the text field and click Calculate. The window stays, but nothing happens, and the [console](#zeige-konsole) shows a `NumberFormatException`. From lesson 22 you know what to do: - -```java -button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } -}); -``` - -Instead of an error in the console, you now see a hint in the window. - -::: ludwig -The arrow already has an `e` for the event. That is why the exception in `catch` needs a different name, here `error`. Java doesn't allow two variables with the same name. -::: - -::: quiz -? Why is the exception in `catch` called `error` here and not `e`? -- [ ] `catch` always needs the name `error`. -- [x] `e` is already the event of the arrow, and Java does not allow two variables with the same name. -- [ ] `e` is only allowed for numbers. -> You can choose the name freely, just not twice. -::: - -## Game: What is in the window afterwards? - -::: spiel frage -titel: Game: What is in the window afterwards? -intro: Ludwig types something into the text field and clicks Calculate. Read the listener and predict what the window shows afterwards. Six rounds. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - }); -frage: The text field says 21. What does it say after the click? -- 2121 -- [x] 42 -- 21 -> `parseInt` turns the text into the number 21. Double that is 42. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - }); -frage: The text field says 21. You click twice. What does it say afterwards? -- 42 -- [x] 84 -- 4242 -> Every click doubles whatever is in the field right now: 21, 42, 84. - -runde: - button.addActionListener(e -> { - field.setText(field.getText() + field.getText()); - }); -frage: The text field says 21. What does it say after the click? -- 42 -- [x] 2121 -- 21 -> Without `parseInt` it stays a text, and `+` joins texts together. - -runde: - button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } - }); -frage: The text field says abc. What happens on the click? -- [x] The label shows "Please enter a whole number!" -- The text field says abcabc. -- The window crashes. -> `parseInt` throws a NumberFormatException, and `catch` catches it. - -runde: - button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } - }); -frage: The text field says 2.5. What happens on the click? -- The text field says 5.0. -- The text field says 5. -- [x] The label shows "Please enter a whole number!" -> `Integer.parseInt` only knows whole numbers. For it, 2.5 is not a number. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number + number); - }); -frage: The text field says 5. What does it say after the click? -- 10 -- [x] 55 -- 5 -> `"" + number` is already a text, and the second `+` adds the 5 once more. With `"" + (number + number)` Java calculates first. -::: - -## Task: doubling a number - -Put the whole program together: - -- a window with the title “Double the number”, 250 pixels wide and 150 pixels high, -- below each other a label, a text field and a button “Calculate”, -- every click doubles the number in the text field: 2, 4, 8, 16, … -- with “abc” a hint appears in the label instead of a crash. - -Extra: a second button “Halve” divides the number by 2. What happens with 5? - -**You are done when …** - -- the title is “Double the number” and label, text field and button are stacked, -- 2 becomes 4, 8 and 16 after three clicks, -- with “abc” a hint appears in the label and the program keeps running. - -::: ludwig -The “Halve” button goes into the GridLayout as the fourth row and gets its own ActionListener. With `int`, Java cuts off the decimal places when dividing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can put a JLabel and a JTextField into the window. → Three building blocks in the window -- I can explain why only the last building block shows without a layout. → Why only the button shows -- I can arrange everything below each other with GridLayout(0, 1). → The window with GridLayout -- I can calculate with getText, Integer.parseInt and setText. → Calculating with the text in the text field -- I can write a program that doesn't crash with “abc”. → Not a number? No crash! -::: - -## Quiz - -::: quiz -? Why does only the button show without a layout? -→ Why only the button shows -- [ ] Because the label and the text field are missing -- [x] Because all building blocks lie on top of each other in the middle and the last one hides the others -- [ ] Because the window is too small - -? What does new GridLayout(0, 1) mean? -→ The window with GridLayout -- [ ] No row and one column, so the window is empty -- [x] As many rows as needed in one column, so everything below each other -- [ ] One row, everything side by side - -? What does field.getText() give you? -→ Calculating with the text in the text field -- [ ] Always a number -- [x] The text in the text field -- [ ] The title of the window -> For a number you still need Integer.parseInt. - -? Match each building block to its job. -→ Three building blocks in the window -= JLabel -> label -= JTextField -> text field for typing -= JButton -> button -= GridLayout -> arrangement in a grid -::: diff --git a/web/lessons/en/32-klickzaehler.md b/web/lessons/en/32-klickzaehler.md deleted file mode 100644 index 7b04576e..00000000 --- a/web/lessons/en/32-klickzaehler.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Click counter with reset -bereich: Windows with Swing -kurz: Two buttons change the same number: create a variable for the whole class. ---- - -## Skills I will gain now - -::: kompetenzen -- explain why a listener may not change a variable from main -- create a static variable in the class -- let two buttons change the same number -- build a counter with −1 that never goes below 0 -::: - -## The goal - -A window counts clicks: the number is at the top, two buttons below it. **+1** counts up by one, **Reset** sets the number back to 0. - -What's new this time: two buttons work with the **same** number. For that you need a variable that both listeners know. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## The first attempt - -The obvious idea is to create the number in `main` as usual and count it up in the listener: - -```java -int count = 0; -button.addActionListener(e -> { - count++; - number.setText("" + count); -}); -``` - -If you run this with real Java, the compiler reports an error: - -``` -local variables referenced from a lambda expression must be final or effectively final -``` - -::: ludwig -The listener only runs later, on every click, long after `main` has finished. That is why it may read the variables from `main`, but not change them. Java insists: a variable from `main` that appears in the arrow must stay the same. For a number that changes on every click, we need a different place. -::: - -## A variable for the whole class - -The solution: the variable does **not** go into `main`, but directly into the class, above `main`. Then it belongs to the whole class, and every listener may change it: - -```java -public class Counter { - static int count = 0; - - public static void main(String[] args) { - // the window as usual - } -} -``` - -- `static` means: the variable belongs to the class itself. Because `main` is `static` too, it is needed here. -- A variable like this is called a **field** of the class. It lives as long as the program, not just as long as `main`. - -::: quiz -? What do you call a variable that sits directly in the class and not in `main`? -- [ ] A parameter -- [x] A field -- [ ] A listener -> A field lives as long as the program, not just as long as `main`. -::: - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; - -public class Counter { - static int count = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel number = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); - reset.addActionListener(e -> { - count = 0; - number.setText("0"); - }); - - window.add(number); - window.add(plus); - window.add(reset); - window.setVisible(true); - } -} -``` - -`SwingConstants.CENTER` puts the text of the label in the middle. Click +1 a few times and then Reset. - -::: angeberwissen -With `number.setFont(new Font("SansSerif", Font.BOLD, 48));` the number becomes big and bold. `Font` comes from `java.awt`, which you have already imported. -::: - -## Game: Who is counting? - -::: spiel zuhoerer -titel: Game: Who is counting? -intro: Now the listeners calculate with the variable of the class. Ludwig shows you code, window and the clicks. Which number is shown at the end? Afterwards Ludwig plays the clicks. -frage: What does the label say after the clicks? - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> The variable is in the class and keeps its value between the clicks. Every click counts up by one: 1, 2, 3. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); - reset.addActionListener(e -> { - count = 0; - number.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> After two clicks it shows 2. Reset sets the variable to 0, and the last click counts up to 1 again. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> count++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> Afterwards the variable is 2, but nobody writes it into the label. Without `number.setText(…)` the window keeps showing 0. Calculating and showing are two different things. - -runde: - static int count = 0; - JLabel number = new JLabel("Clicks: 0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("Clicks: " + count + 1); - }); -klicks: +1 -- Clicks: 2 -- Clicks: 1 -- [x] Clicks: 11 -> The bracket trap: Java works from left to right. `"Clicks: " + count` gives the text “Clicks: 1”, and `+ 1` adds another 1 to the end. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton one = new JButton("+1"); - JButton ten = new JButton("+10"); - one.addActionListener(e -> { - count++; - number.setText("" + count); - }); - ten.addActionListener(e -> { - count += 10; - number.setText("" + count); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Both listeners change the same variable: 10, then 11, then 21. `count += 10` is the short form of `count = count + 10`. -::: - -## Task: click counter - -Rebuild the click counter and extend it: - -- a button **−1** that counts down by one, -- the number should never go below 0. If it is 0, −1 does nothing. - -**You are done when …** - -- **+1** counts up by one and **−1** counts down by one, -- at 0 a click on **−1** changes nothing, -- **Reset** sets the number back to 0. - -::: ludwig -For “never below 0” the listener of −1 needs an `if`: only if `count > 0` does it count down. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain why a listener may not change a variable from main. → The first attempt -- I can create a static variable in the class. → A variable for the whole class -- I can let two buttons change the same number. → The whole program -- I can build a counter with −1 that never goes below 0. → Task: click counter -::: - -## Quiz - -::: quiz -? Why may the listener not change the variable count from main? -→ The first attempt -- [ ] Because numbers are not allowed in Swing -- [x] Because the listener runs later and Java doesn't let the arrow change variables from main -- [ ] Because count gets too big - -? Where does static int count = 0; go? -→ A variable for the whole class -- [ ] In main, at the very top -- [x] In the class, outside main -- [ ] In the listener - -? What does SwingConstants.CENTER do in new JLabel("0", SwingConstants.CENTER)? -→ The whole program -- [x] It puts the text in the middle of the label. -- [ ] It puts the window in the middle of the screen. -- [ ] It makes the font bigger. -::: diff --git a/web/lessons/en/33-ampel.md b/web/lessons/en/33-ampel.md deleted file mode 100644 index 39ac7b4a..00000000 --- a/web/lessons/en/33-ampel.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -titel: A traffic light with colours -bereich: Windows with Swing -kurz: Set background colours and switch a traffic light on with a state variable. ---- - -## Skills I will gain now - -::: kompetenzen -- colour a label with setOpaque and setBackground -- remember a state with a static variable -- use BorderLayout to put something big in the middle and something narrow at the bottom -- explain what FlowLayout, GridLayout and BorderLayout are good for -- program a traffic light with four phases -::: - -## The goal - -We build a traffic light: a large area lights up red. Each click on **Next** switches it on: red, green, yellow and red again. - -New this time are **colours** and a **state**: the program has to remember which colour is currently showing. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Colours in Swing - -Colours live in the class `Color` from `java.awt`. Ready-made colours are, for example, `Color.RED`, `Color.GREEN`, `Color.YELLOW`, `Color.ORANGE` and `Color.WHITE`. - -This is how you colour a label: - -```java -JLabel light = new JLabel("", SwingConstants.CENTER); -light.setOpaque(true); -light.setBackground(Color.RED); -``` - -- `setBackground(…)` sets the background colour. -- A `JLabel` also needs `setOpaque(true)`. Without this line the background is transparent and the colour stays invisible. - -::: ludwig -`opaque` means “not see-through”. A label is normally transparent, like writing on a pane of glass. Only with `setOpaque(true)` does it get its own area that can be painted. -::: - -::: quiz -? Which line paints the background of the label `light` green? -- [ ] `light.setText(Color.GREEN);` -- [x] `light.setBackground(Color.GREEN);` -- [ ] `light.setColor("green");` -> `setBackground` sets the background colour. To see it, a `JLabel` first needs `setOpaque(true)`. -::: - -## Remembering the colour - -So that the traffic light knows what comes next, it remembers its state in a number: 0 means red, 1 means green, 2 means yellow. As with the click counter from lesson 32, the variable is in the class so that the listener may change it: - -```java -static int phase = 0; -``` - -On every click the phase moves on by one. After yellow (2) comes red (0) again: - -```java -next.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - light.setBackground(Color.RED); - } else if (phase == 1) { - light.setBackground(Color.GREEN); - } else { - light.setBackground(Color.YELLOW); - } -}); -``` - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; - -public class TrafficLight { - static int phase = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Traffic light"); - window.setSize(200, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new BorderLayout()); - - JLabel light = new JLabel("", SwingConstants.CENTER); - light.setOpaque(true); - light.setBackground(Color.RED); - JButton next = new JButton("Next"); - - next.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - light.setBackground(Color.RED); - } else if (phase == 1) { - light.setBackground(Color.GREEN); - } else { - light.setBackground(Color.YELLOW); - } - }); - - window.add(light, BorderLayout.CENTER); - window.add(next, BorderLayout.SOUTH); - window.setVisible(true); - } -} -``` - -This uses a new layout, the **BorderLayout**. It has five places: `NORTH` (top), `SOUTH` (bottom), `WEST` (left), `EAST` (right) and `CENTER` (middle). The middle gets all the space that is left. So the light becomes big, and the button stays narrow at the bottom. - -::: angeberwissen -BorderLayout is the layout a `JFrame` uses when you don't give it one. An `add` without a place lands in `CENTER`. That is why all the building blocks lay on top of each other in lesson 31. -::: - -::: angeberwissen -Professionals switch on in one line: `phase = (phase + 1) % 3;`. The remainder operator `%` gives the remainder of a division. 3 % 3 is 0, so after 2 it starts at 0 again. -::: - -## Which layout for what? - -You now know three layouts. Each one arranges the building blocks differently: - -| Layout | How it arranges | Good for | -|---|---|---| -| `FlowLayout` (lesson 29) | next to each other like words in a line, each block as big as needed | a few buttons in a row | -| `GridLayout` (lesson 31) | a grid of cells of the same size, filled row by row | forms, keypads like on a calculator | -| `BorderLayout` (this lesson) | five places: top, bottom, left, right and the middle, which gets the rest | something big in the middle, such as a picture or a display, with buttons at the edge | - -Without `setLayout` a window uses the BorderLayout. That is why everything then lands in the middle. - -::: ludwig -Ask yourself when planning: should all parts be the same size? Then GridLayout. Should one part be big and the rest narrow at the edge? Then BorderLayout. Should the parts simply keep their normal size? Then FlowLayout. -::: - -## Game: Where does the button go? - -::: spiel layout -titel: Game: Where does the button go? -intro: You now know three layouts and the window with no layout at all. Ludwig shows you code with the buttons A, B, C … What does the window look like? Tap the right picture. -frage: What does the window look like? - -runde: - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Without a layout of its own, every `add` lands in the centre, as big as the window. The three lie on top of each other, and you only see the last one: C. - -runde: - window.setLayout(new FlowLayout()); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> FlowLayout puts the buttons next to each other at their normal size, like words in a line, and centres them. - -runde: - window.setLayout(new GridLayout(0, 1)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> One column, as many rows as needed: everything below each other, every row the same height and as wide as the window. - -runde: - window.setLayout(new GridLayout(0, 2)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); - window.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Two columns. The cells are filled row by row, always left first, then right: A B, then C D. - -runde: - window.setLayout(new GridLayout(2, 3)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); - window.add(new JButton("D")); - window.add(new JButton("E")); - window.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Rows come first, then columns: 2 rows with 3 columns each. - -runde: - window.setLayout(new GridLayout(0, 2)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Two columns, three buttons: the first row is full, in the second C is on the left, and the cell on the right stays empty. - -runde: - window.setLayout(new BorderLayout()); - window.add(new JButton("A"), BorderLayout.NORTH); - window.add(new JButton("B"), BorderLayout.CENTER); - window.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH is at the top, SOUTH at the bottom. The centre gets all the remaining space, which is why B is big. - -runde: - window.setLayout(new BorderLayout()); - window.add(new JButton("A"), BorderLayout.WEST); - window.add(new JButton("B")); - window.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST is on the left, EAST on the right. B has no place given, so it lands in CENTER. -::: - -## Task: traffic light - -Rebuild the traffic light and make it more realistic. In the UK and Germany, red and amber light up together briefly after red. So add a fourth phase: - -- 0: red -- 1: red and amber (use `Color.ORANGE`) -- 2: green -- 3: amber (yellow) - -Extra: in each phase, also write with `light.setText(…)` what the light means, for example “Stop” or “Go”. - -**You are done when …** - -- every click shows the next phase: red, red-yellow (orange), green, yellow, -- red comes again after yellow, -- for the extra, every phase shows its matching text. - -::: ludwig -With four phases, 0 comes after 3. So change the number in `if (phase > 2)`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can colour a label with setOpaque and setBackground. → Colours in Swing -- I can remember a state with a static variable. → Remembering the colour -- I can use BorderLayout to put something big in the middle and something narrow at the bottom. → The whole program -- I can explain what FlowLayout, GridLayout and BorderLayout are good for. → Which layout for what? -- I can program a traffic light with four phases. → Task: traffic light -::: - -## Quiz - -::: quiz -? Why does the colour stay invisible without setOpaque(true)? -→ Colours in Swing -- [ ] Because Color.RED doesn't exist -- [x] Because a label is transparent otherwise -- [ ] Because the window is too small - -? Which place in the BorderLayout gets the space that is left? -→ The whole program -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? phase is 2 and the listener runs phase++ and then if (phase > 2) { phase = 0; }. What is phase afterwards? -→ Remembering the colour -- [x] 0 -- [ ] 2 -- [ ] 3 -> After phase++ it is 3, which is greater than 2, so it becomes 0. -::: diff --git a/web/lessons/en/34-notenrechner.md b/web/lessons/en/34-notenrechner.md deleted file mode 100644 index 5e015fd1..00000000 --- a/web/lessons/en/34-notenrechner.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -titel: Grade calculator in a window -bereich: Windows with Swing -kurz: Enter points, work out the grade with else if and catch wrong input. ---- - -## Skills I will gain now - -::: kompetenzen -- turn points into a grade with else if -- show the grade in the window -- catch and report “abc” and points outside 0 to 100 -- test a program at the limits, for example with 90 and 89 -::: - -## The goal - -A window turns points into a grade: you type the points of a test (0 to 100), click **Calculate grade**, and the grade appears at the bottom. - -This time there is no new Swing building block. What's new is that you combine everything so far: text field, button, `else if` from lesson 20 and try/catch from lesson 22. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## The grading scale - -We use this grading scale: - -| Points | Grade | -|---|---| -| 90 to 100 | A | -| 80 to 89 | B | -| 70 to 79 | C | -| 60 to 69 | D | -| 0 to 59 | F | - -With `else if` you check from top to bottom. The first condition that is true wins: - -```java -String grade; -if (points >= 90) { - grade = "A"; -} else if (points >= 80) { - grade = "B"; -} else if (points >= 70) { - grade = "C"; -} else if (points >= 60) { - grade = "D"; -} else { - grade = "F"; -} -``` - -::: ludwig -With 85 points, `points >= 90` is false, but `points >= 80` is true. So grade B, and the remaining conditions are not checked at all. That is why the lower limit is enough each time. -::: - -You can try this part without a window in the [Code](#zeige-codelive) area. Put `int points = 85;` in front of it and `System.out.println("Grade: " + grade);` after it. The structure chart shows you the nested branches. - -::: quiz -? Which grade does the key give for 29 points? -- [ ] 4 -- [ ] 5 -- [x] 6 -> All conditions are false, even `points >= 30`. Then the `else` branch applies. -::: - -## The window - -```java -import javax.swing.*; -import java.awt.*; - -public class GradeCalculator { - public static void main(String[] args) { - JFrame window = new JFrame("Grade calculator"); - window.setSize(260, 180); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel question = new JLabel("Points (0 to 100):"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate grade"); - JLabel result = new JLabel("Grade: ?"); - - button.addActionListener(e -> { - int points = Integer.parseInt(field.getText()); - String grade; - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else if (points >= 60) { - grade = "D"; - } else { - grade = "F"; - } - result.setText("Grade: " + grade); - }); - - window.add(question); - window.add(field); - window.add(button); - window.add(result); - window.setVisible(true); - } -} -``` - -Try 100, 85, 60 and 12. - -## Catching wrong input - -Two things can still go wrong: - -1. Someone types “abc”. Then `Integer.parseInt` throws a `NumberFormatException`. -2. Someone types 150 or −5. That is a number, but not a valid score. - -You catch the first case with try/catch, the second with an `if` before working out the grade: - -```java -button.addActionListener(e -> { - try { - int points = Integer.parseInt(field.getText()); - if (points < 0 || points > 100) { - result.setText("Please enter 0 to 100."); - } else { - // the grade calculation from above goes here - } - } catch (NumberFormatException error) { - result.setText("That is not a number."); - } -}); -``` - -::: ludwig -`||` means “or” (lesson 9). The condition is true if the points are too small **or** too big. -::: - -## Game: Which grade? - -::: spiel frage -titel: Game: Which grade? -intro: Ludwig has built grade calculators, but not all of them are right. Work out which grade comes out. Six rounds. - -runde: - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else { - grade = "D"; - } -frage: points is 80. Which grade comes out? -- A -- [x] B -- C -> 80 >= 90 is false, 80 >= 80 is true. The limit still belongs to B. - -runde: - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else if (points >= 60) { - grade = "D"; - } else { - grade = "F"; - } -frage: points is 69. Which grade comes out? -- C -- [x] D -- F -> 69 >= 70 is only just false, 69 >= 60 is true. So grade D. - -runde: - if (points >= 60) { - grade = "D"; - } else if (points >= 90) { - grade = "A"; - } else { - grade = "F"; - } -frage: points is 95. Which grade comes out? -- A -- [x] D -- F -> The first true condition wins. 95 >= 60 is already true, so A is never reached. That's why you check from the high points downwards. - -runde: - grade = "F"; - if (points >= 60) { - grade = "D"; - } - if (points >= 70) { - grade = "C"; - } -frage: points is 85. What is in grade afterwards? -- F -- D -- [x] C -> Without `else` every `if` is checked. Both are true, and the last one sets grade C. - -runde: - // grade has already been worked out - if (points < 0 || points > 100) { - result.setText("Please enter 0 to 100."); - } else { - result.setText("Grade: " + grade); - } -frage: The text field says 100. What does the window show? -- [x] Grade: A -- Please enter 0 to 100. -- That is not a number. -> 100 > 100 is false. So 100 points are valid and give grade A. - -runde: - // grade has already been worked out - if (points < 0 && points > 100) { - result.setText("Please enter 0 to 100."); - } else { - result.setText("Grade: " + grade); - } -frage: The text field says 150. What does the window show? -- Please enter 0 to 100. -- [x] a grade, although 150 is not valid -- That is not a number. -> With `&&` the points would have to be below 0 and above 100 at the same time. That never happens, so the program never warns. The right one is `||`. -::: - -## Task: grade calculator - -Put the grade calculator together, with both checks from the last step. Test it with 90, 89, 0, 100, 101 and “ten”. - -Extra: also write a word for the grade, for example “Grade: B (good)”. The words are excellent, good, satisfactory, poor and fail. - -**You are done when …** - -- 92 and 100 give a 1, 91 a 2 and 0 a 6, -- 101 shows the hint to enter 0 to 100, -- “ten” shows a hint and the program keeps running. - -::: ludwig -Always test the limits: 90 must be an A, 89 a B. Most mistakes hide at the limits, for example `>` instead of `>=`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can turn points into a grade with else if. → The grading scale -- I can show the grade in the window. → The window -- I can catch and report “abc” and points outside 0 to 100. → Catching wrong input -- I can test a program at the limits, for example with 90 and 89. → Task: grade calculator -::: - -## Quiz - -::: quiz -? Which grade does the scale give for 70 points? -→ The grading scale -- [ ] B -- [x] C -- [ ] D -> 70 is the lower limit for a C. - -? Why is the lower limit enough in each condition? -→ The grading scale -- [x] Because else if has already sorted out the higher cases -- [ ] Because Java doesn't know upper limits -- [ ] Because the points are always 100 - -? Which condition detects invalid points? -→ Catching wrong input -- [ ] points < 0 && points > 100 -- [x] points < 0 || points > 100 -- [ ] points >= 0 || points <= 100 -> A number can't be smaller than 0 and bigger than 100 at the same time, so you need or. -::: diff --git a/web/lessons/en/35-taschenrechner.md b/web/lessons/en/35-taschenrechner.md deleted file mode 100644 index 221721dd..00000000 --- a/web/lessons/en/35-taschenrechner.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -titel: A calculator -bereich: Windows with Swing -kurz: Two columns with GridLayout, four arithmetic buttons and catching division by 0. ---- - -## Skills I will gain now - -::: kompetenzen -- build two columns with GridLayout -- explain why "" + (a + b) needs brackets -- program all four arithmetic buttons -- build a calculator that doesn't crash with 0 or “abc” -::: - -## The goal - -We build a small calculator: two text fields for the numbers, four buttons **+**, **-**, **\*** and **/** and a line for the result. - -New this time are **two columns** in the GridLayout and **several buttons** that all calculate with the same text fields. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Two columns - -So far `GridLayout(0, 1)` put everything below each other. `GridLayout(0, 2)` gives you two columns. The building blocks fill the cells in the order of the `add` lines, always left first, then right: - -| left | right | -|---|---| -| First number: | text field | -| Second number: | text field | -| + | - | -| \* | / | -| Result: | ? | - -You won't need the labels on the left later. So you can build them directly inside `add`, without a variable: - -```java -window.add(new JLabel("First number:")); -window.add(field1); -``` - -## The window with the first button - -```java -import javax.swing.*; -import java.awt.*; - -public class Calculator { - public static void main(String[] args) { - JFrame window = new JFrame("Calculator"); - window.setSize(280, 220); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 2)); - - JTextField field1 = new JTextField(); - JTextField field2 = new JTextField(); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - JButton times = new JButton("*"); - JButton divide = new JButton("/"); - JLabel result = new JLabel("?"); - - plus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a + b)); - }); - - window.add(new JLabel("First number:")); - window.add(field1); - window.add(new JLabel("Second number:")); - window.add(field2); - window.add(plus); - window.add(minus); - window.add(times); - window.add(divide); - window.add(new JLabel("Result:")); - window.add(result); - window.setVisible(true); - } -} -``` - -Type 3 and 4 and click +. The result shows 7. - -::: ludwig -Watch the brackets in `"" + (a + b)`. Without them Java works from left to right: `"" + a` gives the text “3”, and `"3" + b` appends the 4. You get “34” instead of 7. The bracket makes sure the calculation happens first. -::: - -## The other three buttons - -The buttons -, \* and / work the same way. Only the operator in the last line changes: - -```java -minus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a - b)); -}); -``` - -/ has two special features: - -- With `int`, Java cuts off the decimal places when dividing. 7 / 2 gives 3. -- If the second number is 0, Java throws an `ArithmeticException`, as in the task “Dividing safely” in lesson 22. - -## Catching division by 0 - -```java -divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } -}); -``` - -::: angeberwissen -With `double` and `Double.parseDouble(…)` you get decimal places: 7 / 2 gives 3.5. In return, Java throws no exception when dividing decimal numbers by 0. The result is then `Infinity`. -::: - -::: quiz -? What does the calculator show for 8 divided by 0? -- [ ] 0 -- [ ] Infinity -- [x] Not by 0! -> With `int`, `a / b` throws an `ArithmeticException`. The `catch` catches it and shows the message. -::: - -## A method of your own - -This is not in the curriculum, but it makes the code shorter. - -::: angeberwissen -Every listener reads the same two fields. You can move this repetition into a method of your own, a subprogram like in lesson 18. It goes in the class next to `main`: - -`static int number(JTextField field) { return Integer.parseInt(field.getText()); }` - -The listener then just says `result.setText("" + (number(field1) + number(field2)));`. -::: - -## Game: What does the calculator show? - -::: spiel frage -titel: Game: What does the calculator show? -intro: Ludwig has been tinkering with the calculator. Read the listener and predict what the result shows. Six rounds. - -runde: - plus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + a + b); - }); -frage: You type 3 and 4 and click +. What does the result show? -- 7 -- [x] 34 -- 12 -> Without brackets Java works from left to right: `"" + 3` is the text "3", and `+ 4` adds the 4 to the end. - -runde: - times.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + a * b); - }); -frage: You type 3 and 4 and click *. What does the result show? -- 34 -- [x] 12 -- 7 -> Multiplication comes before addition here too: Java first works out 3 * 4, then adds the 12 to the text. Plus doesn't get this priority, which is why it needs the brackets. - -runde: - divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a / b)); - }); -frage: You type 7 and 2 and click /. What does the result show? -- 3.5 -- [x] 3 -- 4 -> With `int` Java cuts off the decimal places. It doesn't round. - -runde: - divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } - }); -frage: You type 8 and 0 and click /. What does the result show? -- 0 -- [x] Not by 0! -- Infinity -> With `int`, dividing by 0 throws an ArithmeticException, and `catch` writes the hint. - -runde: - divide.addActionListener(e -> { - double a = Double.parseDouble(field1.getText()); - double b = Double.parseDouble(field2.getText()); - result.setText("" + (a / b)); - }); -frage: You type 7 and 2 and click /. What does the result show? -- 3 -- [x] 3.5 -- 3.0 -> With `double` the decimal places are kept. - -runde: - divide.addActionListener(e -> { - double a = Double.parseDouble(field1.getText()); - double b = Double.parseDouble(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } - }); -frage: You type 8 and 0 and click /. What does the result show? -- Not by 0! -- [x] Infinity -- 0.0 -> With `double` there is no exception. The result is `Infinity`, and the `catch` never gets its turn. -::: - -## Task: calculator - -Finish the calculator: - -- all four buttons calculate, -- / reports “Not by 0!” instead of crashing, -- if a field contains “abc” or nothing, “Please enter two numbers” appears. - -Extra: a fifth button **C** empties both fields and sets the result back to “?”. - -**You are done when …** - -- 7 and 2 give 9, 5, 14 and 3 for +, −, * and /, -- 7 / 0 shows the “not by 0” message, -- “abc” or an empty field shows the “enter two numbers” message and nothing crashes. - -::: ludwig -For “abc” every listener needs a try/catch with `NumberFormatException`. A `try` may also be followed by two `catch` blocks, one for `NumberFormatException` and one for `ArithmeticException`. By the way, an empty field gives the text `""`, and that isn't a number either. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build two columns with GridLayout(0, 2). → Two columns -- I can explain why "" + (a + b) needs brackets. → The window with the first button -- I can program all four arithmetic buttons. → The other three buttons -- I can build a calculator that doesn't crash with 0 or “abc”. → Task: calculator -::: - -## Quiz - -::: quiz -? a is 3 and b is 4. What does "" + a + b give? -→ The window with the first button -- [ ] 7 -- [x] 34 -- [ ] An error -> Java works from left to right: first the text "3" is created, then the 4 is appended. - -? What does 7 / 2 give with int? -→ The other three buttons -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? In which order does GridLayout(0, 2) fill the cells? -→ Two columns -- [x] Row by row, left first, then right -- [ ] Column by column, starting top to bottom on the far left -- [ ] Randomly -::: diff --git a/web/lessons/en/36-zahlenraten.md b/web/lessons/en/36-zahlenraten.md deleted file mode 100644 index 9e3a5942..00000000 --- a/web/lessons/en/36-zahlenraten.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -titel: Guess the number -bereich: Windows with Swing -kurz: A game with a random number, a counter for the guesses and a button that switches itself off at the end. ---- - -## Skills I will gain now - -::: kompetenzen -- create a random whole number from 1 to 100 with Math.random -- decide which variables belong in the class -- switch a button off with setEnabled -- build a guessing game with a “New game” button -::: - -## The goal - -Time for a game: the computer thinks of a number from 1 to 100. You guess, and the window tells you “too small” or “too big”. Once you have found it, it tells you how many guesses you needed. - -New this time are **random numbers** and a button that **switches itself off** at the end. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## A random number - -`Math.random()` gives a random decimal number from 0 to just under 1, for example 0.4173. Three steps turn it into a whole number from 1 to 100: - -```java -int secret = (int) (Math.random() * 100) + 1; -``` - -| Step | Example | -|---|---| -| `Math.random()` | 0.4173 | -| `* 100` | 41.73 | -| `(int)` cuts off the decimal places | 41 | -| `+ 1` | 42 | - -Without `+ 1` you would get 0 to 99. - -Try it in the [Code](#zeige-codelive) area: `int secret = (int) (Math.random() * 100) + 1;` and `System.out.println(secret);`. Every run gives a different number. - -::: angeberwissen -Computers can't actually roll dice. `Math.random()` uses a formula to calculate a long sequence of numbers that only **look** random. They are called pseudo-random numbers. For games that is perfectly fine. -::: - -## What the game remembers - -The game has to remember two things across all clicks: the secret number and the number of guesses. As with the click counter from lesson 32, both go in the class: - -```java -static int secret = (int) (Math.random() * 100) + 1; -static int guesses = 0; -``` - -::: quiz -? Why are `secret` and `guesses` in the class and not in `main`? -- [ ] Because `Math.random()` only works in the class -- [x] Because they must last over all clicks and the listener has to change `guesses` -- [ ] Because `main` cannot store numbers -> Like in the click counter: the listener must not change variables from `main`. -::: - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; - -public class GuessTheNumber { - static int secret = (int) (Math.random() * 100) + 1; - static int guesses = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Guess the number"); - window.setSize(320, 180); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel hint = new JLabel("I'm thinking of a number from 1 to 100."); - JTextField field = new JTextField(); - JButton button = new JButton("Guess"); - - button.addActionListener(e -> { - int guess = Integer.parseInt(field.getText()); - guesses++; - if (guess < secret) { - hint.setText(guess + " is too small."); - } else if (guess > secret) { - hint.setText(guess + " is too big."); - } else { - hint.setText("Correct! You needed " + guesses + " guesses."); - button.setEnabled(false); - } - field.setText(""); - }); - - window.add(hint); - window.add(field); - window.add(button); - window.setVisible(true); - } -} -``` - -- `field.setText("")` empties the text field after each guess, so you can type the next one straight away. -- `button.setEnabled(false)` switches the button off. It turns grey and can't be clicked any more. The game is over. - -::: ludwig -`setEnabled(true)` switches a button back on. That way you can, for example, only allow a button once something has been entered. -::: - -## Winning in 7 guesses - -::: angeberwissen -If you guess cleverly, you never need more than 7 guesses. Always guess the middle of the range that is left: first 50, then 25 or 75 and so on. Each guess halves the range: 100, 50, 25, 13, 7, 4, 2, 1. That is the **binary search** from lesson 19. Because 2 to the power of 7 = 128 is bigger than 100, 7 guesses are enough. -::: - -## Task: guess the number - -Rebuild the game and improve it: - -- An input like “abc” doesn't count as a guess and shows the hint “Please enter a number”. -- A second button **New game** thinks of a new number, sets the guesses to 0, switches the Guess button back on and resets the hint. - -Extra: after 7 wrong guesses the game is lost. The window then reveals the secret number. - -**You are done when …** - -- every wrong guess shows “too small” or “too big”, -- “abc” shows the hint to enter a number and the number of guesses stays the same, -- **New game** sets the guesses to 0, turns the guess button back on and resets the hint. - -::: ludwig -For “doesn't count as a guess”, `guesses++` must come **after** `Integer.parseInt`, both in the `try` block. If `parseInt` throws an exception, the line with `guesses++` is skipped. -::: - -## Game: Too small or too big? - -::: spiel frage -titel: Game: Too small or too big? -intro: Ludwig is playing guess the number. Read the code and predict what happens. Seven rounds. - -runde: - // secret is 42 - if (guess < secret) { - hint.setText(guess + " is too small."); - } else if (guess > secret) { - hint.setText(guess + " is too big."); - } else { - hint.setText("Correct!"); - } -frage: Ludwig types 50. What does the hint say? -- 50 is too small. -- [x] 50 is too big. -- Correct! -> 50 is greater than 42. - -runde: -frage: The number is between 1 and 100. 50 was too big, 25 was too small. Which number does Ludwig cleverly guess next? -- 26 -- [x] 37 -- 49 -> 26 to 49 are left. The middle of that is 37 (or 38). That way every guess halves the range. - -runde: - int roll = (int) (Math.random() * 6) + 1; -frage: Which numbers can `roll` have? -- 0 to 6 -- [x] 1 to 6 -- 1 to 7 -> `Math.random() * 6` is from 0 to just under 6. `(int)` turns that into 0 to 5, and `+ 1` into 1 to 6. A dice! - -runde: - int number = (int) (Math.random() * 10); -frage: Which numbers can `number` have? -- [x] 0 to 9 -- 1 to 10 -- 0 to 10 -> Without `+ 1` it starts at 0, and 10 is never reached. - -runde: - // secret is 42 - guesses++; - if (guess == secret) { - hint.setText("Correct! You needed " + guesses + " guesses."); - } -frage: Ludwig types 50, then 25, then 42. What does the hint say at the end? -- Correct! You needed 2 guesses. -- [x] Correct! You needed 3 guesses. -- Correct! You needed 42 guesses. -> `guesses++` counts up with every click, including the hit. - -runde: - button.setEnabled(false); -frage: Ludwig has found the number and clicks **Guess** once more. What happens? -- The game starts again. -- It counts one more guess. -- [x] Nothing, the button is grey and can't be clicked. -> `setEnabled(false)` switches the button off. - -runde: -frage: The number is now between 1 and 1000. How many guesses do you need at most with binary search? -- 7 -- [x] 10 -- 500 -> 2 to the power of 10 = 1024 is greater than 1000. Ten halvings are enough. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a random whole number from 1 to 100 with Math.random. → A random number -- I can decide which variables belong in the class. → What the game remembers -- I can switch a button off with setEnabled. → The whole program -- I can build a guessing game with a “New game” button. → Task: guess the number -::: - -## Quiz - -::: quiz -? Which numbers does (int) (Math.random() * 100) + 1 give? -→ A random number -- [ ] 0 to 100 -- [x] 1 to 100 -- [ ] 1 to 101 - -? What does button.setEnabled(false) do? -→ The whole program -- [ ] It removes the button from the window. -- [x] The button turns grey and can't be clicked any more. -- [ ] It changes the text on the button. - -? With binary search, how many guesses do you need at most for 1 to 100? -→ Task: guess the number -- [ ] 50 -- [ ] 10 -- [x] 7 -> Each guess halves the range, and 2 to the power of 7 = 128 is bigger than 100. -::: diff --git a/web/lessons/en/37-viele-knoepfe-ein-zuhoerer.md b/web/lessons/en/37-viele-knoepfe-ein-zuhoerer.md deleted file mode 100644 index cd9f2ca8..00000000 --- a/web/lessons/en/37-viele-knoepfe-ein-zuhoerer.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -titel: Many buttons, one listener -bereich: Windows with Swing -kurz: One listener for many buttons, and finding out with getActionCommand and getSource which button was clicked. ---- - -## Skills I will gain now - -::: kompetenzen -- store a listener in a variable of type ActionListener and sign it up at several buttons -- explain what getActionCommand and getSource return -- put buttons onto a JPanel in a loop -- build a code lock that only opens with the right code -::: - -## The goal - -Since the business with the cake, Ludwig wants to lock his stable. He builds a **code lock**: nine digit keys, a zero, **C** to clear and **OK** to check. Only someone who types 1234 gets "Gate open!". - -That's twelve buttons. Until now every button had its own listener, as with the calculator in lesson 35. Today you learn how **one** listener is enough for all buttons. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Nine almost identical listeners - -With one listener per key it would look like this: - -```java -one.addActionListener(e -> display.setText(display.getText() + "1")); -two.addActionListener(e -> display.setText(display.getText() + "2")); -three.addActionListener(e -> display.setText(display.getText() + "3")); -// ... and so on up to 9 -``` - -The lines only differ in the digit. If you want to change a small detail, you have to do it nine times and are bound to forget one line. - -## A listener as a variable - -A listener can also be stored in a **variable**. Its data type is `ActionListener`, the contract from lesson 30. Then you sign up the same listener at several buttons: - -```java -ActionListener digit = e -> display.setText(display.getText() + e.getActionCommand()); - -one.addActionListener(digit); -two.addActionListener(digit); -three.addActionListener(digit); -``` - -`ActionListener` is in the package `java.awt.event`. So you need `import java.awt.event.*;` at the top. - -Now the code exists only once. But how does the listener know which digit to add? - -## Who clicked? - -The `e` before the arrow is the **event**, an object of type `ActionEvent`. The button passes it along with every click, and it contains what happened: - -| Call | Returns | Example | -|---|---|---| -| `e.getActionCommand()` | the caption of the clicked button, as text | `"7"` | -| `e.getSource()` | the clicked button itself | the button `ok` | - -- `getActionCommand()` is handy when the caption already says what to do, as with the digits. -- You compare `getSource()` with a button using `==`: `if (e.getSource() == ok)`. Here `==` is right, because it is about exactly this one object, not about a text. - -::: ludwig -You compare texts with `equals` and buttons with `==`. If you want to decide by the caption, you write `e.getActionCommand().equals("OK")`. That works too, but breaks as soon as someone changes the caption to "Open". `e.getSource() == ok` stays correct. -::: - -## Buttons in a loop - -With a shared listener you can even build the digit keys in a loop. So that they line up neatly in a grid, they go onto a **JPanel**. A JPanel is an area in the window with its own layout: - -```java -JPanel keys = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton digit = new JButton("" + i); - digit.addActionListener(key); - keys.add(digit); -} -``` - -- `"" + i` turns the number `i` into the text for the caption. -- Each pass creates a new button. All of them get the same listener `key`. -- `window.add(keys, BorderLayout.CENTER)` puts the whole area with all the keys into the window. - -::: quiz -? How many buttons and how many listeners does this loop create? -- [ ] 9 buttons and 9 listeners -- [x] 9 buttons and 1 listener -- [ ] 1 button and 9 listeners -> Each pass adds a new button. All of them get the same listener `key`. -::: - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class CodeLock { - public static void main(String[] args) { - JFrame window = new JFrame("Code lock"); - window.setSize(240, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new BorderLayout()); - - JLabel display = new JLabel("", SwingConstants.CENTER); - JPanel keys = new JPanel(new GridLayout(0, 3)); - JButton clear = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener key = e -> { - if (e.getSource() == clear) { - display.setText(""); - } else if (e.getSource() == ok) { - if (display.getText().equals("1234")) { - display.setText("Gate open!"); - } else { - display.setText("Wrong"); - } - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton digit = new JButton("" + i); - digit.addActionListener(key); - keys.add(digit); - } - JButton zeroKey = new JButton("0"); - zeroKey.addActionListener(key); - clear.addActionListener(key); - ok.addActionListener(key); - keys.add(clear); - keys.add(zeroKey); - keys.add(ok); - - window.add(display, BorderLayout.NORTH); - window.add(keys, BorderLayout.CENTER); - window.setVisible(true); - } -} -``` - -- `clear` and `ok` are created **before** the listener, because the listener compares with them. -- The listener first checks the two special buttons. All the others are digits and add their caption. - -::: angeberwissen -The keypad on a phone has the 1 at the top left, the one on a calculator and a computer keyboard has the 7 at the top left. Why? When push-button phones came along, there were tests with people who had to dial with them. With the 1 at the top they were faster, and calculating machines had their layout long before that. Ludwig's lock does it like the phone. -::: - -## Game: Who clicked? - -::: spiel zuhoerer -titel: Game: Who clicked? -intro: In every round **one** listener listens at several buttons. Ludwig shows you code, the window and the clicks. What does the display say at the end? Afterwards Ludwig plays the clicks. -frage: What does the display say after the clicks? - -runde: - JFrame window = new JFrame("Letters"); - JLabel display = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> display.setText(display.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> One listener, two buttons. Each time, `e.getActionCommand()` returns the caption of the clicked button, and it is added at the end. - -runde: - JFrame window = new JFrame("Counter"); - static int number = 0; - JLabel display = new JLabel("0"); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == plus) { - number++; - } else { - number--; - } - display.setText("" + number); - }; - plus.addActionListener(z); - minus.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> `e.getSource()` tells you which button it was. Plus twice, minus once: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame window = new JFrame("Letters"); - JLabel display = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> display.setText(display.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> The listener is only signed up at A and B. Nobody is listening when C is clicked. - -runde: - JFrame window = new JFrame("Keys"); - JLabel display = new JLabel(""); - JButton one = new JButton("1"); - JButton two = new JButton("2"); - JButton del = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - display.setText(""); - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - one.addActionListener(z); - two.addActionListener(z); - del.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> After 1 and 2 the display says "12". C clears everything, and the last 1 stands alone. - -runde: - JFrame window = new JFrame("Lock"); - JLabel display = new JLabel(""); - JButton four = new JButton("4"); - JButton two = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (display.getText().equals("42")) { - display.setText("Gate open!"); - } else { - display.setText("Wrong"); - } - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - four.addActionListener(z); - two.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Gate open! -- [x] Wrong -- 24OK -> "24" was typed, but the secret is "42". The order of the clicks matters. -::: - -## Task: Code lock - -Build the code lock and try it out. - -Then make it better: - -- After three wrong attempts, **OK** switches itself off, like the button in Guess the number in lesson 36. Count the attempts in a `static int` variable in the class. -- Extra: the display shows `*` instead of the digits. Remember the real input in a `static String input = "";` and only add a star to the display. - -**You are done when …** - -- the right code opens the lock and a wrong one doesn’t, -- after three wrong tries **OK** is switched off, -- for the extra, the display only shows stars but the code is still checked. - -::: ludwig -In the branch for **OK**, count `attempts++` for every wrong code and then check `if (attempts >= 3)`. Then `ok.setEnabled(false)` switches the button off, like in the guessing game. For the stars: `input = input + e.getActionCommand();` and `display.setText(display.getText() + "*");`. Then you compare `input`, not the text of the display. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can store a listener in a variable of type ActionListener and sign it up at several buttons. → A listener as a variable -- I can explain what getActionCommand and getSource return. → Who clicked? -- I can put buttons onto a JPanel in a loop. → Buttons in a loop -- I can build a code lock that only opens with the right code. → Task: Code lock -::: - -## Quiz - -::: quiz -? What does e.getActionCommand() return for a click on the button new JButton("7")? -→ Who clicked? -- [ ] the number 7 -- [x] the text "7" -- [ ] the button itself - -? How do you check whether the button ok was clicked? -→ Who clicked? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource returns the button itself, and you compare it with ==. - -? Why is a listener stored in a variable? -→ A listener as a variable -- [ ] So that it runs faster. -- [x] So that you can sign it up at several buttons and write the code only once. -- [ ] Because lambdas aren't allowed otherwise. - -? Match. -→ Who clicked? -= ActionListener -> data type of a listener -= ActionEvent -> the event e with the information about the click -= JPanel -> an area with its own layout -::: diff --git a/web/lessons/en/38-innere-klassen.md b/web/lessons/en/38-innere-klassen.md deleted file mode 100644 index 30aa2cc2..00000000 --- a/web/lessons/en/38-innere-klassen.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Inner classes -bereich: Windows with Swing -kurz: Write a listener as a named inner class, as an anonymous class and as a lambda, and know who can see what. ---- - -## Skills I will gain now - -::: kompetenzen -- write a listener as a named inner class -- write a listener as an anonymous class -- explain what is left out in a lambda -- explain which way of writing sees which variables -- build a counter with three buttons written in three ways -::: - -## The goal - -You already know the click counter from lesson 32. Today you write its listener in **three ways**, all of which do exactly the same: - -1. as a **named inner class**, the way it was mostly done before Java 8, -2. as an **anonymous class**, which you know from lesson 30 (“ActionListener is an interface”), -3. as a **lambda** with the arrow, as before. - -In other people's code, in books and on the internet you will meet all three. After this lesson you will recognise them. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Reminder: the contract - -A listener is anything that fulfils the contract `ActionListener`. It contains exactly one method: - -``` -public void actionPerformed(ActionEvent e) -``` - -The button calls it with every click. The three ways of writing are three ways of providing this one method. - -## 1. The named inner class - -An **inner class** is a class inside another class. It has a name, here `Plus`, and fulfils the contract with `implements ActionListener`: - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Counter { - static int count = 0; - static JLabel number = new JLabel("0", SwingConstants.CENTER); - - static class Plus implements ActionListener { - public void actionPerformed(ActionEvent e) { - count++; - number.setText("" + count); - } - } - - public static void main(String[] args) { - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - JButton again = new JButton("Also +1"); - plus.addActionListener(new Plus()); - again.addActionListener(new Plus()); - - window.add(number); - window.add(plus); - window.add(again); - window.setVisible(true); - } -} -``` - -- `new Plus()` creates an object of the class `Plus`. That is the listener the button gets. -- Because the class has a name, you can use it for several buttons, here for `plus` and `again`. -- The class is **outside** `main`. So it only sees what is in the class `Counter`: `count` and `number`. That's why `number` is a variable of the class this time and not of `main`. -- You need `static class` because `main` is static. Without `static`, javac reports "non-static variable this cannot be referenced from a static context". - -## 2. The anonymous class - -If you only need the listener in one place, you can write the class right where the object is needed. Then it gets no name: - -```java -plus.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - count++; - number.setText("" + count); - } -}); -``` - -- `new ActionListener() { … }` means: "a new object that fulfils the contract ActionListener, like this: …". -- At the end there is `});`: the curly bracket closes the class, the round one closes the call to `addActionListener`. -- The anonymous class is **inside** `main`. So it also sees the variables of `main`, as long as they don't change any more. - -::: quiz -? What does `});` close at the end of the anonymous class? -- [x] `}` closes the class, `)` closes the call of `addActionListener`. -- [ ] `}` closes `main`, `)` closes the class. -- [ ] Both close the method `actionPerformed`. -> The method `actionPerformed` already ends one line earlier with its own `}`. -::: - -## 3. The lambda - -The lambda is the short form of the anonymous class, since Java 8: - -```java -plus.addActionListener(e -> { - count++; - number.setText("" + count); -}); -``` - -Everything Java knows anyway is left out: `new ActionListener()`, the name `actionPerformed`, `public void` and the type `ActionEvent`. What remains is the parameter `e`, the arrow and the body. This only works because the contract has exactly **one** method. - -## The three compared - -| | named inner class | anonymous class | lambda | -|---|---|---|---| -| has a name | yes, e.g. `Plus` | no | no | -| stands | in the class, outside `main` | right at the button | right at the button | -| for several buttons | yes, `new Plus()` | no | yes, in a variable (lesson 37) | -| sees variables of `main` | no | yes, if they don't change | yes, if they don't change | -| length | longest | medium | shortest | - -::: ludwig -If a variable of `main` should change in the listener, like `count++`, it has to go into the class, whichever way you write the listener. That was the problem from lesson 32. -::: - -::: angeberwissen -After compiling, look into the folder with the `.class` files. javac creates one file for every class: `Counter.class`, `Counter$Plus.class` for the inner class and `Counter$1.class` for the anonymous class. As it has no name, it gets a number. A lambda gets no file of its own, Java only builds it when the program starts. -::: - -## Game: Which way of writing? - -::: spiel frage -titel: Game: Which way of writing? -intro: Ludwig shows you listeners from other people's programs. Which way of writing is it? Six rounds. -frage: Which way of writing is this? -antworten: named inner class | anonymous class | lambda - -runde: - button.addActionListener(e -> text.setText("Hello")); -richtig: lambda -> The arrow `->` gives the lambda away. - -runde: - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - text.setText("Hello"); - } - }); -richtig: anonymous class -> `new ActionListener() {` followed by a whole method: a class without a name is being written here. - -runde: - static class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - text.setText("Hello"); - } - } -richtig: named inner class -> The class is called `Greeting` and fulfils the contract with `implements ActionListener`. - -runde: - button.addActionListener(new Greeting()); -richtig: named inner class -> `new Greeting()` creates an object of the class `Greeting`. The class itself is somewhere else and has a name. - -runde: - ActionListener key = e -> { - display.setText(display.getText() + e.getActionCommand()); - }; -richtig: lambda -> A lambda in a variable, as with the code lock in lesson 37. The arrow gives it away. - -runde: - ActionListener key = new ActionListener() { - public void actionPerformed(ActionEvent e) { - display.setText(display.getText() + e.getActionCommand()); - } - }; -richtig: anonymous class -> An anonymous class can be stored in a variable too. Then it can be signed up at several buttons, just like the lambda. -::: - -## Task: One counter, three ways - -Build the click counter with three buttons: - -- **+1** gets the named inner class `Plus`. -- **-1** gets an anonymous class. -- **Reset** gets a lambda. - -Check that all three buttons count as expected. Then remove the `static` from the class `Plus` and read javac's error message. - -**You are done when …** - -- **+1** counts up, **-1** counts down and **Reset** sets 0, -- the code contains exactly one named inner class, one anonymous class and one lambda, -- you have read javac’s error message without `static` on `Plus` and can explain what it means. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can write a listener as a named inner class. → 1. The named inner class -- I can write a listener as an anonymous class. → 2. The anonymous class -- I can explain what is left out in a lambda. → 3. The lambda -- I can explain which way of writing sees which variables. → The three compared -- I can build a counter with three buttons written in three ways. → Task: One counter, three ways -::: - -## Quiz - -::: quiz -? Why does the short form with the arrow work for ActionListener? -→ 3. The lambda -- [ ] Because ActionListener is a class. -- [x] Because the contract has exactly one method. -- [ ] Because the button demands it. - -? Which way of writing can you use with new Plus() for several buttons without storing it in a variable? -→ 1. The named inner class -- [x] the named inner class -- [ ] the anonymous class -- [ ] the lambda - -? Why is there static in front of class Plus? -→ 1. The named inner class -- [ ] So that the class is faster. -- [x] Because main is static and couldn't create an object of Plus otherwise. -- [ ] Because every class has to be static. - -? Match. -→ The three compared -= class Plus implements ActionListener -> named inner class -= new ActionListener() { … } -> anonymous class -= the arrow after e -> lambda -::: diff --git a/web/lessons/en/39-zwei-reiter.md b/web/lessons/en/39-zwei-reiter.md deleted file mode 100644 index 03bc438a..00000000 --- a/web/lessons/en/39-zwei-reiter.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Two tabs -bereich: Windows with Swing -kurz: Build a window with two tabs, bring data from one tab to the other and save the list as a text file. ---- - -## Skills I will gain now - -::: kompetenzen -- build a window with two tabs -- add lines to a JTextArea with append -- explain why a listener can use building blocks on both tabs -- save a file inside a listener with try and catch -- build a shopping list that counts how many things are on it -::: - -## The goal - -Ludwig's shopping list from lesson 23 gets a window. It has two **tabs**, like the tabs in a browser: - -- In the tab **Input** you type what you need and click **Add**. -- The tab **List** shows everything you have entered. A button **Save** writes the list into a text file. - -New are the tabs (`JTabbedPane`), a text area with several lines (`JTextArea`) and saving from inside a listener. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Tabs with JTabbedPane - -Each tab shows its own area. The areas are JPanels, like the keypad of the code lock in lesson 37: - -```java -JTabbedPane tabs = new JTabbedPane(); -JPanel input = new JPanel(new GridLayout(0, 1)); -JPanel list = new JPanel(new BorderLayout()); - -tabs.addTab("Input", input); -tabs.addTab("List", list); -window.add(tabs); -``` - -| Call | Meaning | -|---|---| -| `addTab("Input", input)` | a new tab with the caption "Input", it shows the JPanel `input` | -| `setSelectedIndex(1)` | switches to the second tab, counting starts at 0 | -| `setTitleAt(1, "List (3)")` | changes the caption of the second tab | - -At the start, the tab that was added first is open. - -## A text area with several lines - -A `JTextField` has only one line. For the list you need a `JTextArea`: - -```java -JTextArea area = new JTextArea(); -area.setEditable(false); -area.append("Hay\n"); -``` - -- `append` adds text at the end. The `"\n"` then starts a new line, as when splitting with `split("\n")` in lesson 24. -- `setEditable(false)` stops people from typing into the list itself. -- `getText()` returns the whole text with all lines. - -::: quiz -? What does `area.append("Hay\n")` do? -- [ ] It replaces the whole text with “Hay”. -- [x] It adds “Hay” at the end and then starts a new line. -- [ ] It writes “Hay\n” into the list exactly like that. -> `append` adds at the end, `"\n"` is the line break. -::: - -## From one tab to the other - -The button **Add** is on the tab Input, the text area on the tab List. Still, the listener can use both. All building blocks are variables in `main`, and the lambda sees all of them, no matter on which tab they are shown later: - -```java -add.addActionListener(e -> { - area.append(field.getText() + "\n"); - info.setText(field.getText() + " is on the list."); - field.setText(""); -}); -``` - -::: ludwig -A building block can only lie on **one** area. If you add the same button first to `input` and then to `list`, Swing takes it away from `input`. It only shows up on the tab List. -::: - -## Saving inside the listener - -To save, you use the `PrintWriter` from lesson 23. Inside the listener there is a catch, though: the way out with `throws Exception` from lesson 23 doesn't exist here. The lambda is a method of its own, `actionPerformed`, and according to the contract it must not pass on a `FileNotFoundException`. That's why saving goes into try and catch: - -```java -save.addActionListener(e -> { - try { - PrintWriter out = new PrintWriter("shoppinglist.txt"); - out.print(area.getText()); - out.close(); - info.setText("Saved in shoppinglist.txt"); - tabs.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Saving didn't work."); - } -}); -``` - -- The exception is called `ex` here, because the name `e` is already taken by the event. -- After saving, the window jumps back to the tab Input with `setSelectedIndex(0)`, where the message is. -- VisuStruct shows the saved file below the console as soon as you have clicked Save. - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class ShoppingList { - public static void main(String[] args) { - JFrame window = new JFrame("Shopping list"); - window.setSize(300, 250); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane tabs = new JTabbedPane(); - - JPanel input = new JPanel(new GridLayout(0, 1)); - JTextField field = new JTextField(); - JButton add = new JButton("Add"); - JLabel info = new JLabel("Nothing on the list yet."); - input.add(new JLabel("What do you need?")); - input.add(field); - input.add(add); - input.add(info); - - JPanel list = new JPanel(new BorderLayout()); - JTextArea area = new JTextArea(); - area.setEditable(false); - JButton save = new JButton("Save"); - list.add(area, BorderLayout.CENTER); - list.add(save, BorderLayout.SOUTH); - - tabs.addTab("Input", input); - tabs.addTab("List", list); - - add.addActionListener(e -> { - area.append(field.getText() + "\n"); - info.setText(field.getText() + " is on the list."); - field.setText(""); - }); - - save.addActionListener(e -> { - try { - PrintWriter out = new PrintWriter("shoppinglist.txt"); - out.print(area.getText()); - out.close(); - info.setText("Saved in shoppinglist.txt"); - tabs.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Saving didn't work."); - } - }); - - window.add(tabs); - window.setVisible(true); - } -} -``` - -Type Hay, click Add, then Apples and Add again. Switch to the tab List and click Save. - -## Game: Where does it end up? - -::: spiel frage -titel: Game: Where does it end up? -intro: Ludwig builds windows with tabs. Read the code and predict what you see. Six rounds. - -runde: - tabs.addTab("Input", input); - tabs.addTab("List", list); -frage: Which tab is open at the start? -- [x] Input -- List -- none -> At the start, the tab that was added first is open. - -runde: - tabs.addTab("List", list); - tabs.addTab("Input", input); -frage: Which tab is open at the start? -- Input -- [x] List -- both -> This time List comes first. The order of `addTab` decides the order of the tabs. - -runde: - tabs.addTab("Input", input); - tabs.addTab("List", list); - tabs.addTab("Help", help); - tabs.setSelectedIndex(1); -frage: Which tab is open? -- Input -- [x] List -- Help -> Counting starts at 0: 0 is Input, 1 is List, 2 is Help. - -runde: - add.addActionListener(e -> { - area.append(field.getText() + "\n"); - field.setText(""); - }); - // You type Hay, click Add, type Apples, click Add. -frage: What is on the tab List afterwards? -- Apples -- HayApples -- [x] Hay\nApples -> `append` adds at the end, and each `"\n"` starts a new line. - -runde: - JButton button = new JButton("OK"); - input.add(button); - list.add(button); -frage: Where does the button OK show up? -- on both tabs -- only on the tab Input -- [x] only on the tab List -> A building block can only lie on one area. With the second `add`, Swing takes it away from `input`. - -runde: - save.addActionListener(e -> { - area.setText(""); - tabs.setTitleAt(1, "List (empty)"); - tabs.setSelectedIndex(0); - }); - // The button save is on the tab List. -frage: What do you see after the click? -- the empty tab List -- [x] the tab Input, and the second tab is called "List (empty)" -- the tab Input, the second tab is still called "List" -> The listener empties the area, renames the tab and switches to tab 0. All of it happens with one click. -::: - -## Task: Shopping list with tabs - -Build the program and try it out. - -Then make it better: - -- Empty inputs don't go onto the list. Check `field.getText().isEmpty()` first (lesson 17). -- The tab List shows in its title how many things are on the list: "List (3)". Count along in a `static int` variable and use `setTitleAt`. -- Extra: a third tab **Help** with a JLabel that explains how the program works. - -**You are done when …** - -- an entry you type appears in the list tab after the click, -- an empty field adds nothing to the list, -- after three entries the tab title shows the count, e.g. “List (3)”. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a window with two tabs. → Tabs with JTabbedPane -- I can add lines to a JTextArea with append. → A text area with several lines -- I can explain why a listener can use building blocks on both tabs. → From one tab to the other -- I can save a file inside a listener with try and catch. → Saving inside the listener -- I can build a shopping list that counts how many things are on it. → Task: Shopping list with tabs -::: - -## Quiz - -::: quiz -? Which tab is open after tabs.setSelectedIndex(0)? -→ Tabs with JTabbedPane -- [x] the first one -- [ ] the second one -- [ ] none - -? Why is saving inside the listener in try and catch? -→ Saving inside the listener -- [ ] Because PrintWriter only works inside try. -- [x] Because actionPerformed must not pass on a FileNotFoundException. -- [ ] Because main has no throws. - -? What is the difference between JTextField and JTextArea? -→ A text area with several lines -- [ ] There is none. -- [x] JTextArea can show several lines. -- [ ] You can't write into a JTextField. - -? Match. -→ Tabs with JTabbedPane -= JTabbedPane -> an area with tabs -= JPanel -> the area of a tab -= JTextArea -> a text area with several lines -::: diff --git a/web/lessons/en/40-model-view-controller.md b/web/lessons/en/40-model-view-controller.md deleted file mode 100644 index 6d577637..00000000 --- a/web/lessons/en/40-model-view-controller.md +++ /dev/null @@ -1,430 +0,0 @@ ---- -titel: Model View Controller -bereich: Windows with Swing -kurz: Split the click counter into model, view and controller and understand who talks to whom. ---- - -## Skills I will gain now - -::: kompetenzen -- say what model, view and controller each do -- write a model without Swing and test it without a window -- explain what new Counter() builds and why there is no static -- name the four messages after a click -- add a second view without changing the model -- build a counter with −1, Reset and limits in the model -::: - -## The goal - -Big programs with windows almost always share the same structure. It is called **Model View Controller**, **MVC** for short: - -- The **model** holds the data and knows its rules. -- The **view** only shows the data. -- The **controller** reacts to clicks and passes the word on. - -You learn MVC with the click counter from lesson 32. It is split into three parts, step by step. In the end it shows the same count twice: as a number and as a bar. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Everything in one class - -This is what the click counter looked like so far, everything sits in `main` and in one variable of the class: - -```java -static int count = 0; - -public static void main(String[] args) { - // ... build the window ... - JLabel number = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); -} -``` - -That works. But imagine the count should also show up as a bar, later in a second window and in a file as well. Then every listener has to think of every display. Counting and showing are tied up in a knot, and with every display the knot gets bigger. - -MVC unties the knot: every job gets its own class. - -## The model - -The model is the counter itself, without any Swing: - -```java -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} -``` - -- This time there is no `static` in front of `value` and the methods. That makes them belong to an **object**: `new Counter()` builds a counter with its own `value`, just as `new JButton("+1")` builds a button with its own caption. -- `model.increase()` calls the method of this one counter, just like `button.setText(…)`. -- Whoever wants to know the value asks with `getValue()`. It can only be changed through `increase()`. - -As the model needs no window, you can try it out without a window at all: - -```java -public class CounterTest { - public static void main(String[] args) { - Counter model = new Counter(); - model.increase(); - model.increase(); - System.out.println(model.getValue()); - } -} - -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} -``` - -The output is 2. Several classes may stand in one file. Only one of them is `public`, and that one contains `main`. - -## The view - -The view shows the value and does nothing else. It doesn't calculate, and it doesn't know where the number comes from: - -```java -class NumberView { - JLabel number = new JLabel("0", SwingConstants.CENTER); - - void update(int value) { - number.setText("" + value); - } -} -``` - -- The view is handed the value with `update(int value)` and writes it into its JLabel. -- You build the window and the button in `main`, as always. `window.add(view.number)` puts the view's JLabel into the window. - -## The controller - -The controller is the listener at the button. It connects model and view: - -```java -Counter model = new Counter(); -NumberView view = new NumberView(); - -plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); -}); -``` - -- First it changes the model, then it fetches the new value and hands it to the view. -- The problem from lesson 32 is gone: the variable `model` never changes, it always points to the same counter. Only the `value` inside it changes. That's why the lambda may use `model`, without any `static`. - -## Who talks to whom? - -With every click four messages run, always in the same order: - -::: grafik mvc-klick.svg -The arrows light up one after the other. The model counts up at the second arrow, the display only at the fourth. -::: - -1. The button reports the click to the controller (`actionPerformed`). -2. The controller tells the model: `increase()`. -3. The controller asks the model for the new value: `getValue()`. -4. The controller hands the value to the view: `update(value)`. - -The model talks to nobody. It waits until it is asked. - -::: ludwig -Remember: the model knows nothing about windows. In `Counter` there isn't a single `JLabel` and no `import javax.swing`. If you need Swing there, the code belongs in the view. -::: - -::: quiz -? Who does the model talk to on its own? -- [ ] The view -- [ ] The button -- [x] Nobody -> The model waits until the controller asks it. -::: - -## The pay-off: a second view - -Now the count should also show up as a bar. For that a second view joins in. A `JProgressBar` is a bar that fills up, here from 0 to 10: - -```java -class BarView { - JProgressBar bar = new JProgressBar(0, 10); - - void update(int value) { - bar.setValue(value); - } -} -``` - -The controller gets one more line. The model stays exactly as it was: - -```java -plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); -}); -``` - -That is exactly the pay-off of MVC: you can add or swap displays without touching the model. - -## The whole program - -```java -import javax.swing.*; -import java.awt.*; - -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} - -class NumberView { - JLabel number = new JLabel("0", SwingConstants.CENTER); - - void update(int value) { - number.setText("" + value); - } -} - -class BarView { - JProgressBar bar = new JProgressBar(0, 10); - - void update(int value) { - bar.setValue(value); - } -} - -public class ClickCounter { - public static void main(String[] args) { - Counter model = new Counter(); - NumberView view = new NumberView(); - BarView bar = new BarView(); - - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); - }); - - window.add(view.number); - window.add(bar.bar); - window.add(plus); - window.setVisible(true); - } -} -``` - -Click +1 a few times and watch the number and the bar grow together. - -::: angeberwissen -MVC was invented in 1979 by the Norwegian Trygve Reenskaug, at the research centre Xerox PARC in California. Back then there were already computers with windows and a mouse there. In the same year Steve Jobs visited the lab and was so excited that Apple went on to build computers with windows and a mouse. -::: - -## Game: Where does the code belong? - -::: spiel frage -titel: Game: Where does the code belong? -intro: Ludwig has thrown code from an MVC program onto a pile. Sort every piece. Eight rounds. -frage: Where does this code belong? -antworten: Model | View | Controller - -runde: - int value = 0; -richtig: Model -> The count is the data. Data lives in the model. - -runde: - number.setText("" + value); -richtig: View -> Showing something on the screen is the view's job. - -runde: - plus.addActionListener(e -> model.increase()); -richtig: Controller -> Reacting to a click and telling the model: that's what the controller does. - -runde: - void increase() { - value++; - } -richtig: Model -> The model itself knows how to change its data. - -runde: - bar.setValue(value); -richtig: View -> A bar that fills up only shows something. So: view. - -runde: - void increase() { - if (value < 10) { - value++; - } - } -richtig: Model -> "At most 10" is a rule for the data. Rules belong in the model, then they hold for every button and every view. - -runde: - view.update(model.getValue()); -richtig: Controller -> Fetching the value from the model and handing it to the view: that's the controller in the middle. - -runde: - JLabel number = new JLabel("0", SwingConstants.CENTER); -richtig: View -> A JLabel is a building block of the screen. There is no Swing in the model. -::: - -## Game: Whose turn is it? - -::: spiel reihenfolge -titel: Game: Whose turn is it? -intro: After a click, model, view and controller talk to each other, but it only works in one order. Put the steps in the right order. Five rounds. - -runde: -frage: You click +1 in the click counter. What happens, one after the other? -- You click +1. -- The controller gets `actionPerformed`. -- The controller calls `model.increase()`. -- The model counts `value` up. -- The controller fetches `model.getValue()`. -- The view shows the new number. -> Click, controller, change the model, fetch the value, show it. Those are the four arrows from the picture, with counting up in the middle. - -runde: - plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); - }); -frage: What happens after a click on +1, one after the other? -- The click on +1 -- `model.increase()` -- The number shows the new value. -- The bar grows. -> The listener works through its lines from top to bottom: first the model, then the number, then the bar. - -runde: -frage: Put the controller in the right order so that the view shows the new number. -- `plus.addActionListener(e -> {` -- `model.increase();` -- `view.update(model.getValue());` -- `});` -> First change, then show. The other way round, the view still shows the old value. - -runde: - reset.addActionListener(e -> { - model.reset(); - view.update(model.getValue()); - }); -frage: The counter is at 5. You click Reset. What happens, one after the other? -- You click Reset. -- The model sets `value` to 0. -- `model.getValue()` returns 0. -- The view shows 0. -> Reset also runs through the controller into the model. The view only learns about the new value at the very end. - -runde: -frage: A test without a window should print 1. In which order do the lines stand in main? -- `Counter model = new Counter();` -- `model.increase();` -- `System.out.println(model.getValue());` -> First build the object, then work with it, and look at the result last. The model can be tested without any window. -::: - -## Task: A counter with limits - -Build the whole program and try it out. - -Then make it better: - -- A button **−1** counts down. The model gets a method `decrease()` for it, the controller a second listener. -- A button **Reset** sets the counter back to 0 with `reset()`. -- The model itself takes care of the limits: never below 0 and never above 10, because then the bar is full. -- Extra: a third view `ConsoleView` whose `update` prints "New value: 3" with `System.out.println`. A view doesn't have to be a window. - -**You are done when …** - -- **+1**, **−1** and **Reset** count correctly, -- the counter never goes below 0 or above 10, however often you click, -- number and bar always show the same value, -- the model class contains no `JButton`, `JLabel` or other Swing. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can say what model, view and controller each do. → The goal -- I can write a model without Swing and test it without a window. → The model -- I can explain what new Counter() builds and why there is no static. → The model -- I can name the four messages after a click. → Who talks to whom? -- I can add a second view without changing the model. → The pay-off: a second view -- I can build a counter with −1, Reset and limits in the model. → Task: A counter with limits -::: - -## Quiz - -::: quiz -? Where does the rule "The counter never goes above 10" belong? -→ The model -- [x] in the model -- [ ] in the view -- [ ] in the controller -> Rules about the data belong in the model. Then they hold no matter which button is pressed. - -? What does the view do? -→ The goal -- [ ] It calculates the new value. -- [x] It shows the value it is given. -- [ ] It listens for clicks. - -? Why may the lambda use model, even though model is a variable of main? -→ Who talks to whom? -- [ ] Because Counter is public. -- [x] Because model always points to the same counter; only the value inside it changes. -- [ ] Because lambdas may change any variable. - -? What do you have to change in the model when a second view joins in? -→ The pay-off: a second view -- [x] nothing -- [ ] a second method increase -- [ ] a second JLabel - -? Match. -→ The goal -= Counter with value and increase() -> model -= NumberView with update(int value) -> view -= the listener at the button -> controller -::: diff --git a/web/lessons/en/aufgaben/alter-unterprogramm.md b/web/lessons/en/aufgaben/alter-unterprogramm.md deleted file mode 100644 index fc8b888f..00000000 --- a/web/lessons/en/aufgaben/alter-unterprogramm.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Age in a subprogram -nach: 18 -stufe: 2 ---- - -The age check from “Adult?” now becomes a subprogram of its own. The main program only calls it. - -::: übung aufgabe-alter-unterprogramm -titel: Age in a subprogram -auftrag: Build two diagrams. The main program outputs **Welcome**, then calls `checkAge()` and finally outputs **Goodbye**. - The subprogram `checkAge` is in a tab of its own: it asks for the age and outputs **adult** or **minor**. -test: 20 -> Welcome | adult | Goodbye -test: 18 -> Welcome | adult | Goodbye -test: 12 -> Welcome | minor | Goodbye -braucht: aufruf -tipp: The main program has three boxes. The subprogram does the real work. -tipp: Open the exercise in the editor and build the main program there with the call `checkAge()`. Then open a new tab with **+** and give it the title `checkAge`. Build the input and the branch in it. Check finds the subprogram by the title of the tab. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/ballwurf.md b/web/lessons/en/aufgaben/ballwurf.md deleted file mode 100644 index 868b5cd5..00000000 --- a/web/lessons/en/aufgaben/ballwurf.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -titel: Ball throw results -nach: 25 -stufe: 2 ---- - -At sports day everyone wrote their ball throw distance into a table: - -::: datei throw.csv -Name;Distance -Ludwig;28 -Zora;42 -Fox;35 -Hare;21 -::: - -::: übung aufgabe-ballwurf -titel: Ball throw results -code: java -auftrag: Read the file and skip the header line. Output how many took part (**Participants: 4**) and how far they threw on average (**Average: 31.5 m**). - Save the longest throw in the file **winner.txt**, for example **Winner: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Participants: 4 | Average: 31.5 m -datei: winner.txt -> Winner: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: You need four variables before the loop: the count, the sum as a `double`, the best distance and the best name. -tipp: In the loop: `String[] parts = line.split(";");` and `int distance = Integer.parseInt(parts[1]);`. If `distance > bestDistance`, remember the distance and the name. To save: `PrintWriter out = new PrintWriter("winner.txt");`, `out.println(…)` and `out.close();`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/bestenliste.md b/web/lessons/en/aufgaben/bestenliste.md deleted file mode 100644 index 68ec396a..00000000 --- a/web/lessons/en/aufgaben/bestenliste.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -titel: Leaderboard -nach: 19 -stufe: 2 ---- - -Five goats have run the obstacle race. Now the leaderboard goes on the stable door: most points at the top, fewest at the bottom. - -::: übung aufgabe-bestenliste -titel: Leaderboard -auftrag: Read 5 scores into an array. Sort the array with bubble sort in **descending** order, so the biggest number comes first. Then output the list with places, for example **1. 9**, on the next line **2. 9** and so on. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Bubble sort from lesson 19 sorts in ascending order. For descending order you only turn round the comparison of the neighbours. -tipp: Swap when `points[i] < points[i + 1]`, using a temporary variable. For the output, first work out `int place = i + 1` and then output `place + ". " + points[i]`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-bestenliste-java -titel: Leaderboard in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Read each number into a variable first and then put it into the array: `int number = scanner.nextInt();` and `points[i] = number;`. -tipp: The swap needs a temporary variable in Java too: `int temp = points[i]; points[i] = points[i + 1]; points[i + 1] = temp;`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/binaerzahl.md b/web/lessons/en/aufgaben/binaerzahl.md deleted file mode 100644 index 69c5b325..00000000 --- a/web/lessons/en/aufgaben/binaerzahl.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -titel: Binary number -nach: 11 -stufe: 3 ---- - -Computers calculate with only two digits: 0 and 1. This is how you convert a number into the **binary system**: - -1. Divide the number by 2 and remember the remainder (0 or 1). -2. Carry on with the result without the remainder. -3. Repeat this until the number is 0. - -The remainders read **from bottom to top** give the binary number. For 6 the remainders are 0, 1, 1, so the binary number is 110. - -::: übung aufgabe-binaer -titel: Binary number -auftrag: Ask for a whole number greater than 0 and output it as a binary number. For 6 the output is **110**, for 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Keep dividing the number by 2 and remember every remainder. The remainders read backwards give the binary number. -tipp: Collect the digits in a text: `String binary = ""`. In the loop you calculate `int remainder = number % 2` and add the remainder at the **front**: `binary = remainder + binary`. After that, `number = number / 2`. Because number is a whole number, the remainder is dropped. -lösung: aufgabe-binaer-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-binaer-java -titel: Binary number in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Start with `String binary = "";`. The loop runs with `while (number > 0)`. -tipp: In the body: `int remainder = number % 2;`, then `binary = remainder + binary;` and `number = number / 2;`. Because `binary` is a String, `+` puts the remainder at the front. -lösung: aufgabe-binaer-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/caesar.md b/web/lessons/en/aufgaben/caesar.md deleted file mode 100644 index b147e7e2..00000000 --- a/web/lessons/en/aufgaben/caesar.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -titel: Caesar cipher -nach: 17 -stufe: 3 ---- - -More than 2000 years ago, the Roman general Julius Caesar sent secret messages to his troops. His trick was simple: he replaced every letter with the letter **three places further on** in the alphabet. A becomes D, B becomes E and so on. The readable message is called the **plain text**, the encrypted one the **secret text**. The number of places you shift by is the **key**, often just called `k`. - -::: grafik caesar-verschiebung.svg -Encryption with the key 3: each letter at the top becomes the letter below it. At the end you start again from the beginning, so X, Y and Z become A, B and C. -::: - -This turns `HALLO` into `KDOOR`. Anyone who knows the key simply shifts three places back and can read the message again. - -### The cipher wheel - -To avoid counting every time, people built a **cipher wheel**: two discs with the alphabet, a small one on top of a large one, fixed in the middle so it can turn. The outer ring shows the plain text, the inner ring the secret text. Turn the inner disc by three letters, and below every outer letter you find its secret letter. Wheels like this have existed since the 15th century. In the American Civil War (1861–1865), soldiers carried small brass wheels. - -::: grafik caesar-scheibe.svg -A cipher wheel modelled on historical brass wheels. The blue window shows: with the key 3, D is below A. -::: - -::: angeberwissen -Caesar himself didn’t even have a wheel! We know this from the Roman historian Suetonius: in his letters, Caesar shifted every letter by three places and simply counted it out in his head. The wheel was only invented by Leon Battista Alberti around 1467, about 1500 years later. By the way, I count in my head too. I don’t have fingers, only hooves. -::: - -Try it yourself. Turn the inner wheel, type a text and watch the secret text appear. **Decrypt** goes the other way. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -You can easily make a real wheel yourself: two circles of cardboard, one a bit smaller, each with 26 equal fields for the alphabet, and a paper fastener in the middle. Your secret agent tool is ready! -::: - -::: quiz -? What does the letter Y become with the key 3? -- [ ] A -- [x] B -- [ ] C -> After Y comes Z, then you start again with A and B. Three places further on is therefore B. - -? A secret text was encrypted with the key 5. How do you decrypt it? -- [ ] Shift it 5 places further on again -- [x] Shift it 5 places back -- [ ] Read the letters backwards -> Decrypting is the opposite of encrypting. By the way, 5 places back is the same as 21 places forward, because 5 + 21 = 26. -::: - -### The program: there is more than one way - -How do you teach the computer to shift a letter by `k` places? There is no *single* right solution. We look at two ways. Both go through the text character by character with a for loop, just like in the lesson on strings. The difference is how they shift a single letter. - -In both ways the remainder operator `%` helps. It makes sure that after Z you continue with A: positions 0 to 25 stay as they are, 26 becomes 0, 27 becomes 1 and so on. - -### Way 1: the alphabet in an array - -You put the alphabet into an array `char[] alphabet = {'A', 'B', …, 'Z'}`. For every letter of the word you search the array for its position `pos`, that is its index. The secret letter is then in the same array at position `(pos + k) % 26`. - -An example with the key 3: X is at position 23. Then `(23 + 3) % 26 = 0`, and position 0 holds A. - -::: übung aufgabe-caesar-array -titel: Caesar with an array -auftrag: The start diagram already contains the array `alphabet`. Ask for a word in capital letters and for the key `k`. Then output the encrypted word. For HALLO and 3 that is `KDOOR`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Create an empty text `String secret = ""`. Go through the word character by character with a for loop. In every pass you append one secret letter to `secret`. -tipp: To find the position of a letter you need a second, inner loop over the array: if `alphabet[j] == letter`, remember `pos = j`. -tipp: After the inner loop, append `alphabet[(pos + k) % 26]`: `secret = secret + alphabet[(pos + k) % 26]`. After the outer loop, output `secret`. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Way 2: calculating with the ASCII table - -For the computer, every character is really a number. Which number belongs to which character is listed in the **ASCII table**. There A has the code 65, B the code 66 and so on up to Z with 90. In Java you turn a character into its code with `(int)` and a code back into a character with `(char)`: - -``` -int code = (int) 'A' -char letter = (char) 68 -``` - -After that, `code` is 65 and `letter` is `'D'`. Changing a value from one data type into another like this is called a **type cast**. - -Now you can calculate with the letter. So that the jump from Z back to A works, first subtract 65. Then A has position 0 and Z position 25, exactly as in way 1. Shift with `% 26` and add the 65 back at the end: - -::: grafik caesar-ascii.svg -At the top the capital letters with their ASCII codes. Below, the calculation for X with the key 3: the result is A. -::: - -::: übung aufgabe-caesar-ascii -titel: Caesar with ASCII -code: java -auftrag: Write a Java program that reads a word in capital letters and the key `k` and outputs the encrypted word. This time without an array: calculate with `(int)` and `(char)`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Go through the word with a for loop. You get the code of the character at position `i` with `int code = (int) word.charAt(i);`. -tipp: Calculate `code = (code - 65 + k) % 26 + 65;` and append the character: `secret = secret + (char) code;`. Before the loop write `String secret = "";`, after the loop `System.out.println(secret);`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Which way is better? - -**Way 1: array.** The idea is to search for the position in the array. -- Advantage: easy to understand, and your own alphabets work too, e.g. with Ä, Ö and Ü. -- Disadvantage: every letter has to be searched for. - -**Way 2: ASCII.** The idea is to calculate with the character code. -- Advantage: short and without searching, therefore faster. -- Disadvantage: you need to know the ASCII codes. - -Both programs give the same result. That is often how programming works: there are several correct solutions, and you choose the one that fits your task best. - -::: übung aufgabe-caesar-entschluesseln -titel: Decrypt Caesar -code: java -auftrag: Now turn the tables. Read a secret text in capital letters and the key `k` and output the plain text. For KDOOR and 3 that is `HALLO`. You decide which way to use. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Decrypting means shifting `k` places back instead of forward. So `+ k` becomes `- k`. -tipp: Careful with A: `0 - 3` gives -3, and in Java `%` does not turn that into a positive number. So add another 26: `code = (code - 65 - k + 26) % 26 + 65;` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Unfortunately, Caesar is not secure. There are only 25 keys, and you can try them all in a few minutes. It is even quicker with a trick: in English, E is the most common letter. If H is the most common letter in the secret text, the key was probably 3. On the internet there is also ROT13, which is Caesar with the key 13. Applying ROT13 twice gives you the plain text again, because 13 + 13 = 26. -::: diff --git a/web/lessons/en/aufgaben/collatz.md b/web/lessons/en/aufgaben/collatz.md deleted file mode 100644 index 0bf3000e..00000000 --- a/web/lessons/en/aufgaben/collatz.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -titel: Collatz sequence -nach: 11 -stufe: 2 ---- - -The Collatz sequence is a famous puzzle in mathematics. You start with a number and apply the same rule again and again: - -- If the number is **even**, you divide it by 2. -- If it is **odd**, you multiply it by 3 and add 1. - -So far, for every start number anyone has tried, the sequence ends at 1 at some point. Whether this is true for all numbers, nobody knows to this day. - -::: übung aufgabe-collatz -titel: Collatz sequence -auftrag: Ask for a start number. Apply the rule until the number is 1, and output the new number after every step. Count the steps as you go and output **Steps:** and the count at the end. - With the start number 6 the sequence is 3, 10, 5, 16, 8, 4, 2, 1. That is 8 steps. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 7 -test: 1 -> Steps: 0 -braucht: whileSchleife, verzweigung -tipp: You do not know how many steps there will be. That is why a while loop fits better than a for loop. -tipp: The while loop runs as long as `number != 1`. You check whether a number is even with `number % 2 == 0`. The output and `steps++` come after the branch, but still inside the loop. -lösung: aufgabe-collatz-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-collatz-java -titel: Collatz sequence in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 7 -test: 1 -> Steps: 0 -braucht: whileSchleife, verzweigung -tipp: A `while` loop runs as long as `number != 1`. Inside it, an `if` with `number % 2 == 0` decides. -tipp: In the body: halve it or `number = number * 3 + 1;`, then `System.out.println(number);` and `steps++;`. After the loop comes `"Steps: " + steps`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -This task could make you rich! The mathematician Paul Erdős offered 500 dollars for a proof. In 2021 the Japanese company Bakuage added quite a bit more: 120 million yen, about a million dollars at the time, for a proof or a counterexample. Nobody has collected the money yet. By the way, the puzzle was invented by the German mathematician Lothar Collatz in 1937. I am going to start calculating right now; that much money buys a lot of hay. -::: diff --git a/web/lessons/en/aufgaben/einheitenrechner.md b/web/lessons/en/aufgaben/einheitenrechner.md deleted file mode 100644 index 50aac46e..00000000 --- a/web/lessons/en/aufgaben/einheitenrechner.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -titel: Unit converter -nach: 35 -stufe: 2 ---- - -Build a window that converts lengths. At the top you type a length in metres, below it there are three buttons: - -- **in cm** shows the length in centimetres, 1.5 becomes "150.0 cm", -- **in mm** shows it in millimetres, 1.5 becomes "1500.0 mm", -- **in km** shows it in kilometres, 1500 becomes "1.5 km". - -The result is shown in a JLabel below the buttons. If the field doesn't contain a number, it says "Please enter a number", and the program doesn't crash. - -You can start like this: - -```java -import javax.swing.*; -import java.awt.*; - -public class Units { - public static void main(String[] args) { - JFrame window = new JFrame("Unit converter"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JTextField metres = new JTextField(); - JButton inCm = new JButton("in cm"); - JLabel result = new JLabel("?", SwingConstants.CENTER); - - inCm.addActionListener(e -> { - double m = Double.parseDouble(metres.getText()); - result.setText((m * 100) + " cm"); - }); - - window.add(metres); - window.add(inCm); - window.add(result); - window.setVisible(true); - } -} -``` - -**You are done when …** - -- 1.5 shows "150.0 cm" after **in cm** and "1500.0 mm" after **in mm**, -- 1500 shows "1.5 km" after **in km**, -- "abc" in the field shows "Please enter a number" and the window stays open. - -Extra: a fourth button **in feet** converts to the imperial unit. One foot is 0.3048 m. - -::: ludwig -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). For "abc" in the field, every listener needs a try/catch with `NumberFormatException`, just like the calculator. -::: diff --git a/web/lessons/en/aufgaben/fibonacci.md b/web/lessons/en/aufgaben/fibonacci.md deleted file mode 100644 index ba2b4c4f..00000000 --- a/web/lessons/en/aufgaben/fibonacci.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -titel: Fibonacci numbers -nach: 13 -stufe: 2 ---- - -With the Fibonacci numbers, every number is the sum of the two numbers before it. The sequence starts with 1 and 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -You find these numbers surprisingly often in nature, for example in the way sunflower seeds are arranged. - -::: ludwig -Do you remember **swapping** from lesson 5? There you needed a helper variable, because `a = b` overwrites the old value of `a`. It is the same here: before `number2` gets the new number, its old value must be saved in `number1`. So watch the **order**: first `number1 = number2`, then `number2 = number3`. You will need this moving on and swapping again later, for example when sorting in lesson 19. -::: - -::: angeberwissen -In 1202 Leonardo of Pisa, known as Fibonacci, set a puzzle about rabbits in his arithmetic book: from its second month on, every pair of rabbits has a new pair every month. How many pairs are there after a year? The answer is this sequence. Sadly, there were no goats in the book. -::: - -::: übung aufgabe-fibonacci -titel: Fibonacci numbers -auftrag: Ask how many Fibonacci numbers should be output. Then output exactly that many, each on its own line. You can assume that at least 2 is typed in. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Every new number is the sum of the two before it. So you always have to remember the last two numbers. -tipp: Keep the last two numbers in `number1` and `number2` and output both before the loop. The loop starts at `int i = 2`. Inside it you calculate `int number3 = number1 + number2`, output it and then move on: `number1 = number2` and `number2 = number3`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-fibonacci-java -titel: Fibonacci numbers in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Output the first two numbers before the loop. The `for` loop then starts at `int i = 2`. -tipp: In the body: `int number3 = number1 + number2;`, output it, then `number1 = number2;` and `number2 = number3;`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Why must `number1 = number2` come before `number2 = number3` in the loop? -- [ ] Because otherwise Java does not allow the assignments -- [x] Because otherwise the old value of number2 is overwritten before number1 gets it -- [ ] The order does not matter -> The other way round, number1 and number2 would have the same value afterwards. Just like swapping: first save, then overwrite. -::: diff --git a/web/lessons/en/aufgaben/gerade-ungerade.md b/web/lessons/en/aufgaben/gerade-ungerade.md deleted file mode 100644 index 7955d3e7..00000000 --- a/web/lessons/en/aufgaben/gerade-ungerade.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Even or odd -nach: 8 -stufe: 1 ---- - -A number is even if there is no remainder when you divide it by 2. You calculate the remainder with `%`: `8 % 2` is 0, `7 % 2` is 1. - -::: übung aufgabe-gerade -titel: Even or odd -auftrag: Ask for a whole number. Output whether it is even or odd. For 4 the output is **4 is even**, for 7 **7 is odd**. -test: 4 -> 4 is even -test: 7 -> 7 is odd -test: 0 -> 0 is even -test: 15 -> 15 is odd -braucht: verzweigung -tipp: A branch decides between even and odd. Even means: can be divided by 2 without a remainder. -tipp: The condition is `number % 2 == 0`. In the output you join the number and the text with `+`, e.g. `number + " is even"`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-gerade-java -titel: Even or odd in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 4 -> 4 is even -test: 7 -> 7 is odd -test: 0 -> 0 is even -test: 15 -> 15 is odd -braucht: verzweigung -tipp: Read a number with `int number = scanner.nextInt();`. Ask with `System.out.println(…)` before that. -tipp: `if (number % 2 == 0) { … } else { … }`. The output is `System.out.println(number + " is even");`. -lösung: aufgabe-gerade-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/mehrwertsteuer.md b/web/lessons/en/aufgaben/mehrwertsteuer.md deleted file mode 100644 index a615a34b..00000000 --- a/web/lessons/en/aufgaben/mehrwertsteuer.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -titel: Sales tax -nach: 6 -stufe: 1 ---- - -In Germany, 19 % **VAT** (value added tax, a kind of sales tax) is added to almost everything you buy. The shop calculates with the net price (without tax) and adds the tax on top. That gives the gross price you pay at the till. - -An example: you buy a folding phone that opens up into a tablet. The shop's price tag says 1000 euros net. On top of that come 19 %, so 190 euros. At the till you pay 1190 euros. The shop is not allowed to keep the 190 euros: it passes them on to the tax office. - -::: grafik aufgabe-mehrwertsteuer.svg -Net price plus VAT gives the gross price. The VAT goes to the tax office. -::: - -::: angeberwissen -Baah, the shop bought the phone itself, of course: from the manufacturer for 800 euros plus 152 euros VAT. These 152 euros are called **input tax**, and the shop may subtract them from the 190 euros. So it only transfers 38 euros to the tax office. In the end only one person pays the whole tax: the customer at the till. That is you. I pay no tax at all, by the way. I just eat grass. -::: - -The tax rate never changes while you calculate. That is why you create it as a **constant**: a variable whose value stays the same once it is set. You write `const` in front of it, for example `const double VAT = 0.19`. Names of constants are written in capital letters so you recognise them straight away. In Java code this becomes `final double VAT = 0.19;`. - -If the tax rate ever changes, you only have to change this one line. - -::: übung aufgabe-mehrwertsteuer -titel: Sales tax -auftrag: Create the constant `VAT` with the value 0.19. Then ask for the net price. First output the tax and then the gross price, only the number each time. - For a net price of 100 the outputs are **19** and **119**. -test: 100 -> 19 | 119 -test: 50 -> 9.5 | 59.5 -test: 0 -> 0 | 0 -tipp: The tax is 19 percent of the net price. The gross price is what you pay in the end. -tipp: The tax is `netPrice * VAT`. You get the gross price by adding the tax to the net price. Both values are decimal numbers, so `double`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Why do you create the tax rate as a constant? -- [ ] Because constants are calculated faster -- [x] Because its value should not change in the program -- [ ] Because decimal numbers can only be stored as constants -> A constant keeps its value. If the tax rate ever changes, you only change the one line with `const`. -::: diff --git a/web/lessons/en/aufgaben/notendurchschnitt.md b/web/lessons/en/aufgaben/notendurchschnitt.md deleted file mode 100644 index aae55cc0..00000000 --- a/web/lessons/en/aufgaben/notendurchschnitt.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Grade average -nach: 13 -stufe: 2 ---- - -How did you do lately? The average is the sum of all grades divided by how many there are. - -::: übung aufgabe-durchschnitt -titel: Grade average -auftrag: First ask how many grades will be typed in. Then read in exactly that many grades and output the average, only the number. - For the grades 1 and 2 the average is **1.5**. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: You need the sum of all grades and how many there are. The average is the sum divided by the count. -tipp: The for loop runs from `int i = 0` while `i < count`. Inside it you read in a grade and add it to the sum. You store the average as a decimal number: `double average = sum * 1.0 / count`. The `* 1.0` makes sure that Java does not do whole-number division either. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-durchschnitt-java -titel: Grade average in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: `for (int i = 0; i < count; i++)` reads exactly as many grades as were given before. -tipp: Divide with `double average = sum * 1.0 / count;`. Without `* 1.0`, Java divides two `int` values as whole numbers, and 1.5 becomes 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/pin-pruefen.md b/web/lessons/en/aufgaben/pin-pruefen.md deleted file mode 100644 index 5c73caa5..00000000 --- a/web/lessons/en/aufgaben/pin-pruefen.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -titel: Check the PIN -nach: 12 -stufe: 2 ---- - -At a cash machine you have three tries for your PIN. If you type a wrong PIN three times, the card is blocked. - -::: angeberwissen -John Shepherd-Barron, who set up the first cash machine in London in 1967, actually wanted six-digit PINs. But his wife said she could remember four digits at most. That is why your PIN has four digits today. -::: - -::: übung aufgabe-pin -titel: Check the PIN -auftrag: The right PIN is 1234. Keep asking for the PIN until it is right or three tries have been used. Then output **PIN correct** or **Card blocked**. -test: 1234 -> PIN correct -test: 1111, 1234 -> PIN correct -test: 1, 2, 1234 -> PIN correct -test: 1, 2, 3 -> Card blocked -braucht: doUntilSchleife, verzweigung -tipp: The loop ends in two cases: when the PIN is right or when three tries have been used. Count the tries. -tipp: The PIN is asked for at least once, so a do-while loop fits. Create `int pin = 0` and `int attempts = 0` before it. The loop repeats as long as `pin != 1234 && attempts < 3`. After the loop, a branch decides what is output. -lösung: aufgabe-pin-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-pin-java -titel: Check the PIN in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 1234 -> PIN correct -test: 1111, 1234 -> PIN correct -test: 1, 2, 1234 -> PIN correct -test: 1, 2, 3 -> Card blocked -braucht: doUntilSchleife, verzweigung -tipp: `do { … } while (…);` asks at least once. There is a semicolon after `while (…)`. -tipp: Create `int pin = 0;` and `int attempts = 0;` first. In the loop: `int entered = scanner.nextInt();`, `pin = entered;` and `attempts++;`. The condition is `pin != 1234 && attempts < 3`. -lösung: aufgabe-pin-java-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/schiffe-versenken.md b/web/lessons/en/aufgaben/schiffe-versenken.md deleted file mode 100644 index 6dd3a355..00000000 --- a/web/lessons/en/aufgaben/schiffe-versenken.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Battleship -nach: 16 -stufe: 2 ---- - -In the game Battleship the sea is a grid. The columns are called A to E, the rows 1 to 5. In the start diagram the sea is the 2D array `sea`: `true` means that part of a ship is on this square. - -::: grafik schiffe-versenken.svg -Grey means `true`: there is a ship here. The small grey numbers are the indices in the array; they start at 0. In the game, on the other hand, the squares are called A to E and 1 to 5. -::: - -::: übung aufgabe-schiffe -titel: Battleship -auftrag: Output all squares that have a ship on them, each square on its own line, e.g. **B1**. Go through the sea row by row with two nested loops. - For the start diagram, **B1**, **C1**, **D1**, **E3**, **E4** and **A5** appear. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Go through the sea with two nested loops, just like the cinema. Only output the squares that hold `true`. -tipp: The outer loop counts `row`, the inner one `column`, both from 0. If there is a ship on `sea[row][column]`, you output the letter from `columns[column]` and the row number: `output: columns[column] + (row + 1)`. You need the `+ 1` because the game starts counting at 1. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-schiffe-java -titel: Battleship in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Two `for` loops inside each other: the row outside, the column inside, both up to `.length`. -tipp: `if (sea[row][column]) { System.out.println(columns[column] + (row + 1)); }`. The brackets around `row + 1` make Java calculate first. -lösung: aufgabe-schiffe-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/speisekarte.md b/web/lessons/en/aufgaben/speisekarte.md deleted file mode 100644 index 6ef39a05..00000000 --- a/web/lessons/en/aufgaben/speisekarte.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Menu -nach: 10 -stufe: 1 ---- - -In the school canteen you order by number. The program tells you which dish belongs to the number. - -::: übung aufgabe-speisekarte -titel: Menu -auftrag: Ask for a number. For 1 output **Greek salad**, for 2 **Rice bowl** and for 3 **Falafel wrap**. For any other number output **Please choose a valid number**. -test: 1 -> Greek salad -test: 2 -> Rice bowl -test: 3 -> Falafel wrap -test: 7 -> Please choose a valid number -braucht: fallauswahl -tipp: A switch fits several fixed numbers. What happens with all the other numbers? -tipp: Read in the number with `input: int pick "Which dish?"`. The switch checks `pick`, and the cases are called `1`, `2` and `3`. All other numbers end up in the case `default`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-speisekarte-java -titel: Menu in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 1 -> Greek salad -test: 2 -> Rice bowl -test: 3 -> Falafel wrap -test: 7 -> Please choose a valid number -braucht: fallauswahl -tipp: In Java this is a switch: `switch (pick) { … }`. -tipp: Every case looks like this: `case 1 -> { System.out.println("…"); }`. All other numbers go to `default -> { … }`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/summe-bilden.md b/web/lessons/en/aufgaben/summe-bilden.md deleted file mode 100644 index 31ec656d..00000000 --- a/web/lessons/en/aufgaben/summe-bilden.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Add up -nach: 2 -stufe: 1 ---- - -Set two numbers, add them and output the result. - -::: übung aufgabe-summe -titel: Add up -auftrag: Set `number1` to the value 4 and `number2` to the value 3. Calculate the sum in a third variable and output only the sum. -test: - -> 7 -tipp: You need three variables: two for the numbers and one for the result. -tipp: You set a variable with a statement such as `int number1 = 4`. For the output you write the name of the variable without quotation marks. -lösung: aufgabe-summe-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/tafeldienst.md b/web/lessons/en/aufgaben/tafeldienst.md deleted file mode 100644 index 2aab5429..00000000 --- a/web/lessons/en/aufgaben/tafeldienst.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Draw for board duty -nach: 15 -stufe: 2 ---- - -Who is on board duty this week, cleaning the board? Five names go into an array, then a number is drawn. - -::: übung aufgabe-tafeldienst -titel: Draw for board duty -auftrag: Read five names into a String array. Then ask for a draw number from 1 to 5 and output **Board duty:** and the matching name. - Draw number 1 belongs to the first name, 5 to the last one. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Board duty: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Board duty: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Board duty: Pia -braucht: forSchleife -tipp: First a loop reads in the five names. After that you do not need a loop any more, just one look into a slot. -tipp: You create the array with `String[] names = new String[5]`. Careful: the draw number starts at 1, the index at 0. So the name is in `names[pick - 1]`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-tafeldienst-java -titel: Draw for board duty in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Board duty: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Board duty: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Board duty: Pia -braucht: forSchleife -tipp: Create an array for five names with `String[] names = new String[5];`. -tipp: In the loop: `names[i] = scanner.next();`. Ticket number 1 belongs to slot 0, so you output `names[pick - 1]`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> With `int pick = (int) (Math.random() * 5) + 1` you can also let chance draw the number. But for the automatic check we need a fixed input. diff --git a/web/lessons/en/aufgaben/taschenrechner.md b/web/lessons/en/aufgaben/taschenrechner.md deleted file mode 100644 index a5606940..00000000 --- a/web/lessons/en/aufgaben/taschenrechner.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Calculator -nach: 10 -stufe: 2 ---- - -A small calculator: type in two numbers and an operator, and the result appears. - -::: übung aufgabe-rechner -titel: Calculator -auftrag: Ask for two whole numbers and then for an operator as text: `+`, `-` or `*`. Output the result. For any other sign output **Unknown operator**. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unknown operator -braucht: fallauswahl -tipp: Read in all three values. A switch on the operator then decides what is calculated. -tipp: You read in the operator with `input: String operator "Operator"`. The switch checks `operator`, the cases are called `"+"`, `"-"` and `"*"`, and the last case is `default`. In every case, first calculate in a variable and then output it, otherwise `+` only joins the numbers together. -lösung: aufgabe-rechner-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-rechner-java -titel: Calculator in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unknown operator -braucht: fallauswahl -tipp: The operator is a text. Read it with `String operator = scanner.next();`. -tipp: `switch (operator) { case "+" -> { … } … default -> { … } }`. With texts, the cases are in quotation marks. -lösung: aufgabe-rechner-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/verleih-menue.md b/web/lessons/en/aufgaben/verleih-menue.md deleted file mode 100644 index b8676fc9..00000000 --- a/web/lessons/en/aufgaben/verleih-menue.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Rental menu -nach: 18 -stufe: 2 ---- - -At the rental machine you can book several vehicles one after another. The menu keeps coming back until you choose **0** to quit. - -::: übung aufgabe-verleih -titel: Rental menu -auftrag: Keep asking for a choice: 1 = e-bike, 2 = e-scooter, 0 = quit. For 1 output **E-bike booked**, for 2 **E-scooter booked**, and for any other number **Invalid choice**. - For 0 the program outputs **Bye** and leaves the loop with a Break. -test: 0 -> Bye -test: 1, 2, 0 -> E-bike booked | E-scooter booked | Bye -test: 2, 5, 1, 0 -> E-scooter booked | Invalid choice | E-bike booked | Bye -braucht: endlosschleife, aussprung -tipp: The menu runs again and again until someone chooses 0. An endless loop with a Break is good for that. -tipp: Use an endless loop. Inside it, first comes the input `input: int choice "1 = e-bike, 2 = e-scooter, 0 = quit"`, then a switch on `choice` with the cases `0`, `1`, `2` and `default`. The case `0` holds the output and, below it, the Break. -lösung: aufgabe-verleih-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-verleih-java -titel: Rental menu in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 0 -> Bye -test: 1, 2, 0 -> E-bike booked | E-scooter booked | Bye -test: 2, 5, 1, 0 -> E-scooter booked | Invalid choice | E-bike booked | Bye -braucht: endlosschleife, aussprung -tipp: `while (true) { … }` runs forever until a `break;` comes. -tipp: In Java, use `if`/`else if` here instead of `switch`: a `break;` inside a `switch` only leaves the `switch`, not the loop. `if (choice == 0) { System.out.println("Bye"); break; } else if (choice == 1) { … }`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/vokabeltrainer.md b/web/lessons/en/aufgaben/vokabeltrainer.md deleted file mode 100644 index a5ae4cc6..00000000 --- a/web/lessons/en/aufgaben/vokabeltrainer.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Vocabulary trainer -nach: 27 -stufe: 3 ---- - -Ludwig is learning German. His words are in a CSV file, English on the left, German on the right: - -::: datei words.csv -English;German -goat;Ziege -hay;Heu -meadow;Wiese -::: - -Because only the file knows the words, you can simply add new lines later without changing the program. - -::: angeberwissen -Sebastian Leitner made the flashcard box with several compartments popular in 1972: cards you know move one compartment further and come up less often, wrong ones go back to the first compartment. Many vocabulary apps still work on this principle today. -::: - -::: übung aufgabe-vokabeln -titel: Vocabulary trainer -code: java -auftrag: Ask for every word in the file: output **What is goat in German?** and read the answer with `scanner.next()`. If it is right, output **Right!**, otherwise for example **Wrong, it is Ziege.** - At the end, show how many were right, for example **2 of 3 right**. -start: aufgabe-vokabeln-start.visustruct -test: Ziege, Heu, Wiese -> What is goat in German? | Right! | What is hay in German? | Right! | What is meadow in German? | Right! | 3 of 3 right -test: Kuh, Heu, Wiese -> What is goat in German? | Wrong, it is Ziege. | What is hay in German? | Right! | What is meadow in German? | Right! | 2 of 3 right -test: Ziege, hay, wiese -> What is goat in German? | Right! | What is hay in German? | Wrong, it is Heu. | What is meadow in German? | Wrong, it is Wiese. | 1 of 3 right -braucht: whileSchleife, verzweigung -tipp: Skip the header line. In the loop, split every line with `split(";")`: `parts[0]` is the English word, `parts[1]` the German one. -tipp: Compare texts with `answer.equals(parts[1])`, not with `==`. Count along with `int right = 0;` and `int count = 0;` before the loop. -lösung: aufgabe-vokabeln-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/volljaehrig.md b/web/lessons/en/aufgaben/volljaehrig.md deleted file mode 100644 index be9ae873..00000000 --- a/web/lessons/en/aufgaben/volljaehrig.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Adult? -nach: 8 -stufe: 1 ---- - -At the cinema, for a driving licence or for voting: it often matters whether someone is already 18. - -::: übung aufgabe-volljaehrig -titel: Adult? -auftrag: Ask for the age. If the person is 18 or older, output **adult**, otherwise **minor**. -test: 18 -> adult -test: 35 -> adult -test: 17 -> minor -test: 6 -> minor -braucht: verzweigung -tipp: There are two possible outputs, so you need a branch. -tipp: Read in the age with `input: int age "How old are you?"`. The condition of the branch is `age >= 18`. Make sure that 18 already counts as adult. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-volljaehrig-java -titel: Adult? in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 18 -> adult -test: 35 -> adult -test: 17 -> minor -test: 6 -> minor -braucht: verzweigung -tipp: Read the age with `int age = scanner.nextInt();`. -tipp: `if (age >= 18) { … } else { … }`, with a `System.out.println(…)` in each branch. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: diff --git a/web/lessons/en/aufgaben/wuerfel-mvc.md b/web/lessons/en/aufgaben/wuerfel-mvc.md deleted file mode 100644 index 78d521c6..00000000 --- a/web/lessons/en/aufgaben/wuerfel-mvc.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -titel: Rolling dice with MVC -nach: 40 -stufe: 3 ---- - -Build a dice game with Model View Controller. A button **Roll** rolls the dice, and two views show the result. - -The model is already finished. It rolls and counts how often it was rolled and how many sixes came up: - -```java -class Dice { - int pips = 1; - int rolls = 0; - int sixes = 0; - - void roll() { - pips = (int) (Math.random() * 6) + 1; - rolls++; - if (pips == 6) { - sixes++; - } - } -} -``` - -Your task: - -1. Test the model without a window first: roll ten times in `main` and then output `rolls` and `sixes`. -2. Write the view `PipsView`. It shows the number rolled in a big JLabel, for example "4". -3. Write the view `StatsView`. It shows for example "Sixes: 2 of 10 rolls". -4. The controller is the listener at the button: it lets the model roll and hands the new values to both views. - -**You are done when …** - -- after ten rolls in the console `rolls` is 10 and `sixes` is between 0 and 10, -- every click on **Roll** shows a new number from 1 to 6 in the `PipsView`, -- the `StatsView` counts one more roll after every click and counts the sixes correctly, -- there is no `JLabel` in the model and no `Math.random` in the views. - -Extra: a button **New game** resets everything. The method for that belongs in the model. - -::: ludwig -Remember the rule from lesson 40: there isn't a single `JLabel` in the model. If you change the font size when rolling, that belongs in the view. -::: diff --git a/web/lessons/en/aufgaben/zahl-verdoppeln.md b/web/lessons/en/aufgaben/zahl-verdoppeln.md deleted file mode 100644 index e5dc9e5b..00000000 --- a/web/lessons/en/aufgaben/zahl-verdoppeln.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Double a number -nach: 2 -stufe: 1 ---- - -A variable can change its value. Here a number is doubled. - -::: übung aufgabe-verdoppeln -titel: Double a number -auftrag: Set the variable `number` to the value 4. Double it in a second statement without creating a new variable. Then output **Doubled number: 8**, where the 8 comes from the variable. -test: - -> Doubled number: 8 -tipp: Doubling means: times 2. You store the result in the same variable again. -tipp: `number = number * 2` calculates with the old value and stores the result in `number` again. You join text and a variable with `+`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: diff --git a/web/lessons/en/begriffe.md b/web/lessons/en/begriffe.md deleted file mode 100644 index 5f3cfa84..00000000 --- a/web/lessons/en/begriffe.md +++ /dev/null @@ -1,266 +0,0 @@ -Technical terms for the learning area. When a term appears in a step, it is marked there once and shows its explanation -on hover or tap. If it is in bold in that step, it is being explained right there and is not marked. -`also:` lists other forms that are recognised too. Upper and lower case matter. - -### Algorithm -also: algorithm, algorithms, Algorithms -Exact step-by-step instructions for solving a task. Every step is clear. - -### Structure chart -also: structure chart, structure charts, Structure charts, Nassi-Shneiderman diagram, Nassi-Shneiderman diagrams -An algorithm drawn as a picture made of boxes. You read it from top to bottom. It is also called a Nassi-Shneiderman diagram. - -### Flowchart -also: flowchart, flowcharts, Flowcharts -An algorithm drawn as symbols joined by arrows (DIN 66001 / ISO 5807). A diamond is a decision. - -### Pseudocode -also: pseudocode -An algorithm written as text in plain language with fixed words such as IF and WHILE. The indentation shows what belongs together. - -### Statement -also: statement, statements, Statements -A single step in the structure chart, for example a calculation, an input or an output. - -### Sequence -also: sequence, sequences, Sequences -Steps that run one after another from top to bottom, each exactly once. - -### Branch -also: branch, branches, Branches, conditional statement, conditional statements -A block that uses a condition to decide which of two paths runs. It is also called a conditional statement. - -### Path -also: path, paths -One of the two ways through a branch: left for true, right for false. - -### Loop -also: loop, loops, Loops, iteration, repetition -A block that repeats steps as long as a condition holds. - -### Loop body -also: loop body -The inside of a loop, that is, the steps that are repeated. - -### Pass -also: passes -Running the inside of a loop once. - -### Condition -also: condition, conditions, Conditions -A question that can only be answered with yes (true) or no (false), for example age >= 18. - -### Placeholder -also: placeholder, placeholders -An empty box with the sign ø. If you drag an element onto it, the element replaces it. - -### Object Inspector -The area below the diagram. Here you edit the text and settings of the box you just clicked. - -### Simulation -also: simulation -Runs your structure chart in the editor, step by step if you like. That way you see what happens. - -### Variable -also: variable, variables, Variables -A labelled box for a value. It has a name, a data type and a value. - -### camelCase -also: CamelCase -A way of writing names made of several words: written together, every further word starts with a capital, e.g. `priceWithTax`. - -### case-sensitive -Java tells upper and lower case apart: `number`, `Number` and `NUMBER` are three different names. `system` instead of `System` is an error. - -### Constant -also: constant, constants, Constants -A variable whose value stays the same once it is set. You write `const` in front of it, e.g. `const double VAT = 0.19`. - -### Data type -also: data type, data types, Data types -Says what kind of value fits into a variable: int (whole number), double (decimal number), String (text), boolean (true or false) or char (a single character). - -### Assignment -also: assignment, assignments, Assignments -The sign =. It works out the right-hand side and stores the result in the variable on the left. - -### Temporary variable -also: temporary variable, temporary variables, helper variable -An extra variable that keeps a value for a short time, for example when swapping. - -### IPO model -also: input-process-output -Input, process, output: first ask for values, then calculate, then show the result. - -### Problem analysis -also: problem analysis -You read a task carefully and work out what is given, what you are looking for and how to get from one to the other. - -### Comparison operator -also: comparison operator, comparison operators, Comparison operators -A sign that compares two values, for example == or <. The result is true or false. - -### Switch -also: switch, multiple selection -A block that runs exactly one of several cases, depending on the value of a variable. It is also called multiple selection. - -### Pre-test loop -also: pre-test loop, pre-test loops, head-controlled -The loop checks its condition before every pass. If the condition is false right at the start, the loop does not run even once. - -### Post-test loop -also: post-test loop, post-test loops, foot-controlled -The loop checks its condition only after every pass. So it always runs at least once. - -### Counter variable -also: counter variable, counter variables, counter -A variable that counts along in a loop, usually i. - -### Endless loop -also: endless loop, endless loops, infinite loop, infinite loops -A loop whose condition never becomes false. It never stops by itself. - -### Flag -also: flag, flags -A boolean variable that starts with false and is set to true as soon as something has happened. - -### State machine -also: state machine, state machines, state variable, state variables -A program that is always in exactly one state and changes to the next state by fixed rules, e.g. a traffic light. - -### Array -also: array, arrays, Arrays -A row of slots with one shared name and the same data type. - -### Index -also: index, indices, indexes -The number of a slot in an array. Counting starts at 0. - -### char -The data type for a single character. It goes in single quotation marks, e.g. 'C'. "C" with double quotation marks, on the other hand, is a String. - -### Character code -also: character code, character codes, ASCII code, ASCII table -The number behind a character. In the ASCII table A has the code 65, B 66 and so on. In Java (int) turns a character into its code and (char) turns a code into the character. - -### String -also: strings, Strings -A text, that is, a row of characters. In Java the data type is called String. The characters are counted from 0. - -### 2D array -also: 2D arrays, two-dimensional array, two-dimensional arrays -An array with rows and columns, like a table. A slot needs two indices, e.g. `seats[1][2]`. - -### Subprogram -also: subprogram, subprograms, Subprograms, method, methods, Methods, procedure, procedures, function, functions, Functions -A structure chart of its own for part of a task. It runs when it is called. In Java it is called a method; depending on its kind also a procedure or a function. - -### Parameter -also: parameter, parameters, Parameters -A variable in the header line of a subprogram. When it is called, it gets the value from the parentheses. - -### Overloading -also: overloaded, overload -Several methods with the same name but different parameters, e.g. `mbot.forward(30)` and `mbot.forward(2, "rotations")`. When calling, Java picks the right one by the number and type of the parameters. - -### Spaghetti code -also: spaghetti code -A program that jumps around so wildly that you can hardly follow what happens. Structure charts prevent that. - -### Call by value -also: call by value -A subprogram gets a copy of the value. If it changes its parameter, the caller's variable stays the same. - -### Call by reference -also: call by reference -A subprogram gets a reference to the same data, e.g. to an array. If it changes a slot, the caller sees the change too. - -### Return value -also: return value, return values, Return values -The result that a subprogram hands back to the call with return. - -### Break -A block that leaves the loop it is in straight away. Then the program continues below the loop. - -### Syntax error -also: syntax error, syntax errors, Syntax errors -A mistake in how the code is written, for example a missing `;`. The program does not start at all. - -### Runtime error -also: runtime error, runtime errors, Runtime errors -An error that only happens while the program runs, for example dividing by 0. The program stops at that point. - -### Logic error -also: logic error, logic errors, Logic errors -The program runs without any message but gives a wrong result. You find it with a desk check. - -### Desk check -also: desk check, desk checks, Desk checks -You run a structure chart on paper and write down the values of the variables after every step. - -### Linear search -also: linear search -A way of searching that compares all values one after another with the value you are looking for. It also works with unsorted values. - -### Binary search -also: binary search -A way of searching sorted values. It looks at the middle and keeps searching only in the matching half. - -### Bubble sort -also: bubble sort, Bubblesort -A simple way of sorting. It always compares two neighbours and swaps them if they are the wrong way round. - -### Event -also: event, events, Events -Something a person does in a window program, for example clicking a button. The program reacts to it with a listener (ActionListener). - -### Interface -also: Interfaces -A kind of contract in Java: it states which methods a class must have. `ActionListener` is an interface with the method `actionPerformed`. - -### Exception -also: exception, exceptions, Exceptions -An error that only happens while the program runs, for example an index outside the array. If no `catch` catches it, the program stops. - -### Scanner -A ready-made Java building block that reads input from the keyboard, for example a number with `scanner.nextInt()`. It needs `import java.util.Scanner;` at the very top. - -### comment -auch: comments, Comment, Comments -A note in the code for people. Java skips it when it runs. `//` lasts until the end of the line, `/* … */` can span several lines. - -### import -A line at the very top of Java code that fetches a ready-made building block from a package, for example `import java.util.Scanner;`. Without it, Java doesn't know the name. - -### source code -auch: Source code -The program text that people write and read, for example in a file `TimesTable.java`. - -### compiler -auch: compilers, Compiler -A program that translates source code. In Java it is called `javac` and turns a `.java` file into bytecode in a `.class` file. - -### bytecode -auch: Bytecode -The translated form of a Java program in a `.class` file. It is read by the JVM, not by people. - -### JVM -auch: Java Virtual Machine, virtual machine -The Java Virtual Machine runs bytecode. It is a program that works like a small computer made of software on Windows, macOS or Linux. That is why Java is platform independent. - -### JRE -Java Runtime Environment: the JVM and ready-made building blocks. You can run Java programs with it, but not compile them. - -### JDK -Java Development Kit: the JRE plus the compiler `javac` and other tools. You need it to program. - -### platform independent -A program runs without changes on different operating systems. In Java the JVM makes this possible: “Write once, run anywhere”. - -### machine code -auch: Machine code -Instructions as numbers that the processor runs directly. Every kind of processor has its own machine code. - -### JIT compiler -auch: JIT -A part of the JVM that translates often-used bytecode into machine code while the program runs (“just in time”). This makes Java faster. diff --git a/web/lessons/en/nachschlagen.md b/web/lessons/en/nachschlagen.md deleted file mode 100644 index 8711c1a9..00000000 --- a/web/lessons/en/nachschlagen.md +++ /dev/null @@ -1,169 +0,0 @@ -## Basics - -### Statement - -A single step. You use it to create variables or to calculate. - -``` -int number = 5 -double price = 2.5 -String name = "Ada" -number = number + 1 -``` - -### Data types - -The data type comes before the name of the variable. - -| Data type | Meaning | Example | -|---|---|---| -| `int` | whole number | `int count = 3` | -| `double` | decimal number (with a point) | `double price = 2.5` | -| `String` | text in double quotation marks | `String name = "Ada"` | -| `boolean` | truth value | `boolean done = false` | -| `char` | a single character in single quotation marks | `char grade = 'C'` | - -`'C'` is a `char`, `"C"` is a String. You get a character from a text with `charAt`: `char first = name.charAt(0)`. Every character has a character code: `(int) 'A'` is 65, `(char) 66` is `'B'`. - -### Input - -Asks for a value while the chart runs and stores it in a variable. The text in quotation marks is the question. - -``` -input: int age "How old are you?" -input: double price "Enter a price" -input: String name "What is your name?" -``` - -### Output - -Shows a text or a value. Texts go in quotation marks; you join text and variables with `+`. - -``` -output: "Hello" -output: sum -output: "You are " + age + " years old." -``` - -> In an output, `+` always joins the parts together: with 3 and 4, `output: a + b` shows 34. So calculate in a variable first, e.g. `int sum = a + b`, and then output `sum`. - -## Branches - -### Branch - -Checks a condition. If it is true, the left path (true) runs, otherwise the right one (false). - -``` -age >= 18 -number % 2 == 0 -grade < 1 || grade > 6 -``` - -### Switch - -Picks one of several cases, depending on the value of a variable. If no case fits, `default` applies. You add cases on the right with **Add Case**. - -## Loops - -### While loop - -Repeats its inside **as long as** the condition is true. The condition is checked before every pass. - -``` -number != 1 -i < 10 -``` - -### Do-while loop - -Runs its inside **at least once** and checks the condition only afterwards. - -### For loop - -Counts a variable from a start value up to a limit. The three fields are Init, Condition and Step. - -``` -int i = 0 -i < 5 -i++ -``` - -### Endless loop - -Repeats its inside without a condition. A **Break** inside it lets you leave it. - -### Break - -Leaves the loop around it (`break`). - -## Subprograms - -### Call - -Stands for a subprogram, e.g. `calculateSum()`. With parameters and a return value, the subprogram has a header line as its title: - -``` -int square(int x) header line of the subprogram -return x * x hands back the result -int q = square(5) call, q gets 25 -showSum(3, 4) call of a void subprogram -``` - -## Calculating and comparing - -### Operators and comparisons - -- `+ - * /` the four basic operations -- `%` remainder of a division (`7 % 2` is 1) -- `==` equal, `!=` not equal -- `<` `<=` `>` `>=` less than, less than or equal, greater than, greater than or equal -- `&&` and, `||` or - -## Arrays - -### Arrays - -Several values under one name. Counting starts at 0. - -``` -int[] numbers = {3, 7, 1} -output: numbers[0] -int[] empty = new int[5] -``` - -A **2D array** is a table with rows and columns: - -``` -boolean[][] seats = new boolean[3][5] -seats[1][4] = true -output: seats.length + " rows, " + seats[0].length + " seats" -``` - -## Java - -### From code to program - -The compiler `javac` translates `File.java` into bytecode (`File.class`). The JVM translates the bytecode into machine code while it runs, the same way on Windows, macOS and Linux. C++, on the other hand, becomes machine code directly and has to be compiled again for every system. - -| | contains | for | -|---|---|---| -| JRE | JVM and libraries | running | -| JDK | JRE, compiler `javac`, tools | programming | - -### Comments - -Notes in the code. Java skips them, the structure chart stays the same. - -```java -/* - * Task: add the numbers from 1 to 10 - * (multi-line comment) - */ -// Process (single-line comment) -int sum = 0; -for (int i = 1; i <= 10; i++) { - sum = sum + i; // comment after the code -} // end for -``` - -Good for: the task, dividing the code into input, process and output, an explanation, the end of a block after `}`, the expected output and notes for next time. diff --git a/web/lessons/en/visubot/00-struktogramm-und-editor.md b/web/lessons/en/visubot/00-struktogramm-und-editor.md deleted file mode 100644 index 74554afb..00000000 --- a/web/lessons/en/visubot/00-struktogramm-und-editor.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -titel: Structure chart and editor -bereich: Getting started -kurz: What a structure chart is, how to use the editor and how to save your programs. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an algorithm and a structure chart are -- recognise the three building blocks sequence, branch and repetition -- insert, move and delete elements in the editor -- save a structure chart and open it again -::: - -## A plan for the robot - -A robot does not think for itself. It does exactly what is in its program, no more and no less. So before you program it, you need an exact plan. Such an exact step-by-step instruction is called an **algorithm**. - -A **structure chart** draws the plan as boxes. You read it from top to bottom. Each box is one step. It was invented in 1973 by Isaac Nassi and Ben Shneiderman, which is why it is also called a **Nassi-Shneiderman diagram**. - -::: diagramm vb-l00-sequenz-loesung.visustruct -Drive forward, turn right, drive forward: three boxes, from top to bottom. -::: - -::: angeberwissen -Ada Lovelace wrote the first program for a machine back in 1843, for a calculating machine that was never finished. Even then she guessed that such machines would one day do more than calculate, for example make music. Your mBot2 can do both. -::: - -## Three building blocks - -Every program, including one for a robot, is made of only three building blocks: - -| Building block | What it does | Example with the mBot2 | -|---|---|---| -| **Sequence** | steps one after the other | drive forward, turn, drive forward | -| **Branch** | one thing or the other, depending on a condition | Is the wall close? Then turn, otherwise drive forward. | -| **Repetition** | steps several times | do the same thing four times | - -In a structure chart you see the building blocks straight away: the branch has a triangle and two columns: **true** on the left, **false** on the right. The repetition (loop) wraps around its boxes like a tilted L. - -::: diagramm vb-l00-bausteine-loesung.visustruct -All three building blocks: first a box, then a loop, inside it a branch. -::: - -## The editor - -The [structure chart editor](#zeige-editor) has several areas. Move the mouse over a blue word or tap it, and the area lights up: - -- **On the left the [Elements](#zeige-elemente):** all building blocks to drag in. The group **mBot2 commands** has the commands for the mBot2 such as **drive forward** and **turn right**. -- **In the middle the [structure chart](#zeige-struktogramm):** a new diagram only contains an empty placeholder, shown as **ø**. -- **Below it the [Object Inspector](#zeige-objektinspektor):** here you change the text of the selected box, for example `mbot.forward(30)` instead of `mbot.forward()`. You can drag the line with the grip above it up or down. -- **Above it the [tools](#zeige-werkzeuge):** undo, copy, delete, export and, on the right, the **simulation**. - -This is how you build: - -- **Insert:** drag an element from the Elements onto the structure chart. On the placeholder **ø** it replaces it. On the top half of a box it goes before it, on the bottom half after it. A blue line shows you where it lands. -- **Change text:** double-click a box, or double-tap it on a tablet. Then you type right in the structure chart, **Enter** takes it. -- **Move:** drag a box to another place. -- **Delete:** click the box and press Delete, or click the [trash can](#zeige-loeschen). -- **Undo:** Ctrl+Z, on a Mac ⌘Z. - -> 🧩 **Prefer blocks like in Scratch?** Click [Blocks](#zeige-bloecke) in the tools. Then you see the same program as blocks that snap together. You type numbers right into the white fields and drag sensors in. **Structure chart** takes you back. It stays the same program, so you can switch at any time. - -::: übung vb-erster-plan -titel: Round the corner -auftrag: Build a structure chart: the mBot2 drives forward, turns right, drives forward, turns left and drives forward once more. Then start the simulation and watch. -fahrt: forward, turnRight, forward, turnLeft, forward -braucht: anweisung -tipp: Drag **drive forward** onto the placeholder ø. Drag each next command onto the bottom half of the last box. -tipp: From top to bottom: **drive forward**, **turn right**, **drive forward**, **turn left**, **drive forward**. -lösung: vb-erster-plan-loesung.visustruct -::: - -> When you are done, click **Check** in the exercise. VisuStruct then runs your structure chart and checks whether the mBot2 drives exactly as required. Later it often checks your program in several worlds, for example once with a wall and once without. If it doesn't work, the **hints** help you. - -## Saving and opening - -- **[Save](#zeige-speichern)** (Ctrl+S, on a Mac ⌘S): the structure chart is saved as a file ending in `.visustruct`. The [title](#zeige-titel) above the structure chart suggests the file name. -- **[Open](#zeige-oeffnen)** (Ctrl+O, on a Mac ⌘O): load a saved file again. - -In the column [📁 Files](#zeige-dateien) you set up a folder once, your **workspace**. All your programs and your learning progress go there. You can take the folder with you and carry on at home. - -> 📘 **More without the robot:** VisuStruct has the lessons ["What is a structure chart?"](?visustruct&lektion=01-was-ist-ein-struktogramm), ["The editor"](?visustruct&lektion=02-der-editor) and ["Save, open, export"](?visustruct&lektion=03-speichern-oeffnen-exportieren). They open in a new window. - -## Game: Which building block? - -::: spiel frage -titel: Game: Which building block? -intro: Ludwig describes what his mBot2 should do. Is it a sequence, a branch or a loop? Six rounds. -antworten: sequence | branch | loop - -runde: -frage: The mBot2 drives forward, turns right and drives forward again. -richtig: sequence -> Three steps one after another, each exactly once. - -runde: -frage: If the wall is close, it turns. Otherwise it drives forward. -richtig: branch -> Depending on the condition, one thing or the other happens. - -runde: -frage: It drives forward 10 cm four times. -richtig: loop -> The same step happens several times. - -runde: -frage: As long as no line comes, it keeps driving. -richtig: loop -> "As long as" means: again and again until the condition is no longer true. - -runde: -frage: If it is standing on red, it beeps. -richtig: branch -> It only beeps if the condition is true. - -runde: -frage: It shows "Hello" on the screen and then plays a tone. -richtig: sequence -> Two steps one after another, with no condition and no repetition. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an algorithm and a structure chart are. → A plan for the robot -- I can recognise the three building blocks sequence, branch and repetition. → Three building blocks -- I can insert, move and delete elements in the editor. → The editor -- I can save a structure chart and open it again. → Saving and opening -::: - -## Quiz - -::: quiz -? What is an algorithm? -→ A plan for the robot -- [ ] a part of the mBot2 -- [x] an exact step-by-step instruction -- [ ] a programming language -> An algorithm says exactly what happens in which order. The structure chart draws it. -? Which building block decides depending on a condition? -→ Three building blocks -- [ ] the sequence -- [x] the branch -- [ ] the repetition -> The branch has a triangle and two columns for true and false. -? You drag **drive forward** onto the bottom half of a box. Where does it land? -→ The editor -- [ ] before it -- [x] after it -- [ ] it replaces the box -> Top half means before, bottom half means after. -? Which ending does a saved structure chart file have? -→ Saving and opening -- [ ] `.java` -- [x] `.visustruct` -- [ ] `.png` -> `.png` is a picture to pass on. You can only keep editing the `.visustruct` file. -::: diff --git a/web/lessons/en/visubot/01-der-mbot2.md b/web/lessons/en/visubot/01-der-mbot2.md deleted file mode 100644 index 21bf1a7e..00000000 --- a/web/lessons/en/visubot/01-der-mbot2.md +++ /dev/null @@ -1,416 +0,0 @@ ---- -titel: The mBot2 -bereich: Getting started -kurz: Get to know the robot you are about to program. ---- - -## Skills I will gain now - -::: kompetenzen -- name the parts of the mBot2 -- explain how the mBot2 measures distances -- explain how the mBot2 detects a line -- explain what sensors and actuators are -- control the mBot2 with elements from the group mBot2 commands -- let the mBot2 drive in the simulator -- connect the real mBot2 with USB-C and disconnect it again -- check that all sensors and actuators work -::: - -## Hello mBot2 - -::: mbot2 -focus: -spin: yes -::: - -The **mBot2** is a small robot made by Makeblock. In this lesson you take a tour through all its parts: - -- the [CyberPi]{part=cyberpi}, the small computer at the back on top -- the see-through [shield with battery]{part=shield} in the middle -- two [motors]{part=motors} with [wheels]{part=wheels} -- the [ultrasonic sensor]{part=ultrasonic} at the front, which looks like two eyes -- the [line sensor]{part=lineSensor} under the nose -- the turquoise [chassis]{part=chassis} that holds everything together - -In VisuBot you program it with structure charts. You can try every program in the simulator first, even without a real robot. - -> Move the mouse over a word underlined in yellow and the part lights up in the model. Tap the word and the camera flies there. You can rotate the model with the mouse or your finger and zoom with the mouse wheel. - -## The CyberPi - -::: mbot2 -focus: cyberpi, screen, joystick, buttons, leds, lightSensor, microphone -view: back -::: - -The [CyberPi]{part=cyberpi,screen,joystick,buttons,leds,lightSensor,microphone} is the brain of the mBot2: a **microcontroller**, a small computer without a keyboard. It runs your program. It lies crosswise at the back on top of the robot and can be taken off. - -A lot is already built in: - -- a colour [screen]{part=screen} that shows text and pictures -- a [joystick]{part=joystick} you can push in four directions -- two [buttons]{part=buttons}, one with a triangle and one with a square, and the Home button on the side next to the USB port -- five colourful [LEDs]{part=leds} as a light bar along the back -- a [light sensor]{part=lightSensor} and a [microphone]{part=microphone} - -There is also a speaker and a motion sensor that you cannot see from outside. The motion sensor notices when the CyberPi is tilted or turned. - -> The model was built from photos. Look at your own mBot2 and compare. - -## Screen, LEDs and speaker - -::: mbot2 -focus: screen, leds -view: back -::: - -With the [screen]{part=screen} and the five [LEDs]{part=leds} the mBot2 shows you what it is doing. Each LED can glow in almost any colour because it mixes red, green and blue. That is why they are called **RGB LEDs**. - -Later you make the LEDs glow red with `mbot.setLed(255, 0, 0)`. The three numbers are red, green and blue, each from 0 to 255. - -The [CyberPi]{part=cyberpi} also has a small **speaker**. With `mbot.playTone(440, 300)` it plays a tone: 440 vibrations per second (hertz), 300 milliseconds long. - -## Measuring light and sound - -::: mbot2 -focus: lightSensor, microphone -view: top -::: - -The [light sensor]{part=lightSensor} measures how bright it is. The [microphone]{part=microphone} measures how loud it is. For example, the mBot2 can start driving when you clap your hands. - -## Buttons and joystick - -::: mbot2 -focus: joystick, buttons -view: top -::: - -The [buttons]{part=buttons} A and B and the [joystick]{part=joystick} are sensors too: they notice when you press them. Your program can, for example, wait until you press A and only then start driving. With the joystick you steer the mBot2 like with a remote control. - -## The motion sensor - -::: mbot2 -focus: cyberpi -spin: yes -::: - -Inside the [CyberPi]{part=cyberpi} there is a sensor you cannot see: the **motion sensor** (a gyroscope with an accelerometer). It notices whether the mBot2 is tilted forward, backward or to the side, how far it has turned and whether someone shakes it. Your phone has such a sensor too: that is why the picture turns when you hold it sideways. - -## Power: the shield with battery - -::: mbot2 -focus: shield, powerSwitch -view: side -::: - -The big see-through case is the [mBot2 shield]{part=shield}. Through the lid you see the grey **battery** that powers the robot. At the back of the shield the cables of the motors (M1 and M2) and of the ultrasonic sensor are plugged in. - -On the left side is the [power switch]{part=powerSwitch} labelled ON/OFF. Next to it are two sockets S1 and S2 for small servo motors. Switch the mBot2 off when you do not need it, so the battery lasts longer. You charge it with the USB cable on the CyberPi. - -## Motors and wheels - -::: mbot2 -focus: motors, wheels -view: side -::: - -Two [motors]{part=motors} drive the two [wheels]{part=wheels}, each its own. You see them from below: silver motors in light blue gearboxes. - -- If both wheels turn forward at the same speed, the mBot2 drives **straight**. -- If one wheel turns forward and the other backward, it turns **on the spot**. - -The motors are **encoder motors**: they count how far the wheel has turned. That is how the mBot2 knows when it has driven exactly 10 cm or turned exactly 90°. - -## The ultrasonic sensor - -::: mbot2 -focus: ultrasonic -view: front -::: - -At the front sits the black [ultrasonic sensor]{part=ultrasonic}. It looks like two eyes but is more like an ear: one circle sends out a very high sound we cannot hear. The other waits for the echo. The longer the echo takes, the farther away the wall is. - -That is how the mBot2 measures distances in centimetres. The rings around the circles can also glow blue. - -::: angeberwissen -Bats do exactly what the ultrasonic sensor does: they call so high that we cannot hear it and listen for the echo. Sound travels about 343 metres per second. If a wall is one metre in front of the mBot2, the echo is back after just under 6 thousandths of a second. -::: - -## Under the robot - -::: mbot2 -focus: lineSensor, caster -view: bottom -::: - -Now you look from below. Right at the front the black board of the [line sensor]{part=lineSensor} sticks out. It has **four** small probes side by side. Each one shines light on the floor and measures how much comes back. A black line reflects little, a bright floor a lot. That is how the mBot2 knows whether it is on a line. - -The sensor is called a **quad RGB sensor** because it can do even more: it also recognises **colours**, for example a red or green field on the floor. - -The [ball caster]{part=caster} behind it is the third leg. It has no motor and simply rolls along in any direction. - -## The chassis - -::: mbot2 -focus: chassis -::: - -The [chassis]{part=chassis} is the turquoise aluminium frame. It holds all the parts together. At the front it has two round "ears", at the back a big **M** for Makeblock. The many holes are there on purpose: you can screw more parts onto them. - -## Sensors and actuators - -A robot has two kinds of parts: - -- **Sensors** measure something: the distance, a line, a colour, the brightness, the loudness, the tilt or whether a button is pressed. -- **Actuators** do something: the motors turn the wheels, the LEDs light up, the screen shows something, the speaker beeps. - -The word comes from the Latin *agere*, “to act”: actuators act, sensors (from *sentire*, “to feel”) feel. - -Your program reads the sensors and controls the actuators. You already know this as input, processing and output. - -## Find the parts - -Your turn: click the part you are looking for in the model. If you are right, the next question appears. - -::: mbot2quiz -- ultrasonic: What does the mBot2 use to measure how far away the wall is? -- screen: Where does text from your program appear? -- wheels: What moves the mBot2 forward? -- lineSensor: What detects a black line on the floor? (Hint: rotate the model.) -- powerSwitch: Where do you switch the mBot2 on and off? -- leds: What glows red with `mbot.setLed(255, 0, 0)`? -done: Great, you know your way around the mBot2! -::: - -## Commands for the mBot2 - -In VisuBot the [Elements](#zeige-elemente) have their own group **mBot2 commands**. Each box in it is a command for the robot: - -| Element | Text in the box | What happens | -|---|---|---| -| move forward | `mbot.forward()` | 10 cm forward | -| move back | `mbot.backward()` | 10 cm back | -| turn right | `mbot.turnRight()` | turn 90° to the right | -| turn left | `mbot.turnLeft()` | turn 90° to the left | -| LEDs on | `mbot.setLed(255, 0, 0)` | the LEDs light up red | - -You may also put a number in the brackets: `mbot.forward(30)` drives 30 cm, `mbot.turnRight(45)` turns only 45°. - -> The commands are real Java. `mbot` is the robot, and after the dot comes what it should do. - -## First drive - -After building, start the [simulation](#zeige-simulation). The VisuBot world with the mBot2 appears on the right. The grid on the floor has squares of 10 cm, exactly one **move forward**. - -::: übung vb-gerade -titel: Straight ahead -auftrag: Drag **move forward** into the structure chart five times. Then start the simulation and watch the mBot2 drive 50 cm straight ahead. -fahrt: 5 x (forward) -tipp: You find the group mBot2 commands below the normal elements. -tipp: Five boxes `mbot.forward()` one below the other. Each drives 10 cm. -lösung: vb-gerade-loesung.visustruct -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Then it drives the route for you. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - mbot.forward(60); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,0 -> Two fields forward, turn right, one more field. - -runde: - mbot.forward(30); - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,1 -> One field forward, then it faces left and drives two fields. - -runde: - mbot.turnRight(); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Turning right twice means it faces backwards. Then it drives one field down. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: .... | .... | .^.. -ziel: 2,2 -> Up, to the right, and after the second turn it faces down. -::: - -## Connecting the real mBot2 - -::: mbot2 -focus: cyberpi, powerSwitch, joystick, buttons -view: side -::: - -Everything you build in the simulator can also be driven by the real mBot2. This is how you connect it: - -1. Plug a **USB-C cable** into your computer (for example a MacBook) and the other end into the USB-C port on the right of the [CyberPi]{part=cyberpi}, next to the Home button. -2. Push the [ON/OFF slide switch]{part=powerSwitch} on the left of the shield to ON. The CyberPi's screen lights up. -3. A menu appears on the screen with **restart** highlighted (on a German CyberPi: „neu starten“). Press the [joystick]{part=joystick} down like a button to confirm it. -4. After the restart it says “Press B to start”. Press **button B**, that is the [button with the triangle]{part=buttons}. -5. Open VisuStruct in **Chrome** or **Edge**. Safari and the iPad cannot talk to USB devices. -6. As soon as the CyberPi has started up, click **🔌 mBot2** at the top (or “Connect mBot2” in the gear menu). -7. Chrome shows a list of ports. Choose the entry **USB Serial** (for example “USB Serial (cu.usbserial-110)”). It is often at the very bottom, so you may have to scroll down. Then click **Connect**. -8. The CyberPi restarts briefly (⏳). Then “Hallo VisuBot!” appears on its screen and the button shows 🟢. - -Now the mBot2 drives along with every step of the simulation. Put it on the floor and give it room! - -> Finished? Click **🟢 mBot2** once more. It stops, shows “Bis bald!” and releases the port. Only then pull out the cable. - -> Want to drive with no cable at all? You learn that in lesson 2 under **Driving without a cable**. - -## Testing the mBot2 - -When the mBot2 is connected, **🔧 Test the mBot2** appears below the world. Open it: - -- With the buttons you try each actuator once: LEDs, tone, text on the screen and the wheels. Lift the mBot2 up for this so it does not drive off the table. -- Below are all sensors with their values, and they update live. Hold your hand in front of the ultrasonic sensor, press button A, tilt it, clap your hands or put it on a red sheet of paper. - -If a value does not change although you do something, something is wrong. Then tell your teacher before you start programming. - -## Game: Sensor or actuator? - -::: spiel frage -titel: Game: sensor or actuator? -intro: Does the part measure something, or does it do something? Ten rounds. -antworten: Sensor | Actuator - -runde: -frage: The ultrasonic sensor measures how far away the wall is. -richtig: Sensor -> It measures something: the distance. - -runde: -frage: The motors turn the wheels. -richtig: Actuator -> They do something: they move the mBot2. - -runde: -frage: The LEDs glow red. -richtig: Actuator -> Glowing is doing something, not measuring. - -runde: -frage: The line sensor recognises the black tape. -richtig: Sensor -> It measures how much light comes back from the floor. - -runde: -frage: The speaker beeps. -richtig: Actuator -> It outputs a sound. - -runde: -frage: The microphone hears you clap. -richtig: Sensor -> It measures the loudness. - -runde: -frage: The screen shows “Hello VisuBot!”. -richtig: Actuator -> Showing something is an output. - -runde: -frage: Button A notices that you press it. -richtig: Sensor -> Buttons are sensors: they report whether they are pressed. - -runde: -frage: The motion sensor notices that the mBot2 is tilted. -richtig: Sensor -> It measures the tilt. - -runde: -frage: The rings on the ultrasonic sensor glow blue. -richtig: Actuator -> Tricky! The part is a sensor, but the glowing rings are an output. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the parts of the mBot2. → Hello mBot2 -- I can explain how the mBot2 measures distances. → The ultrasonic sensor -- I can explain how the mBot2 detects a line. → Under the robot -- I can explain what sensors and actuators are. → Sensors and actuators -- I can control the mBot2 with elements from the group mBot2 commands. → Commands for the mBot2 -- I can let the mBot2 drive in the simulator. → First drive -- I can connect the real mBot2 with USB-C and disconnect it again. → Connecting the real mBot2 -- I can check that all sensors and actuators work. → Testing the mBot2 -::: - -## Quiz - -::: quiz -? Match each part to its job. -→ Hello mBot2 -= Ultrasonic sensor -> measures the distance -= Motors -> move the wheels -= CyberPi -> runs the program -= Line sensor -> detects a dark line -? Which parts are actuators? -→ Sensors and actuators -- [x] Motors -- [ ] Ultrasonic sensor -- [x] LEDs -- [ ] Line sensor -> Actuators do something, sensors measure something. -? How does the ultrasonic sensor measure the distance? -→ The ultrasonic sensor -- [ ] It takes a photo of the wall. -- [x] It sends out a very high sound and waits for the echo. -- [ ] It feels the wall with its blue rings. -> The longer the echo takes, the further away the wall is. -? How does the line sensor detect a black line? -→ Under the robot -- [x] Little light comes back from the black line. -- [ ] The line is warmer than the floor. -- [ ] It hears the wheels rolling over the line. -> Each feeler shines light on the floor. A light floor reflects a lot of light, a black line only a little. -? What does `mbot.turnRight()` do? -→ Commands for the mBot2 -- [ ] The mBot2 drives 10 cm to the right. -- [x] The mBot2 turns 90° to the right. -- [ ] The right LED switches on. -> With no number in the brackets it turns 90°. `mbot.turnRight(45)` turns only 45°. -? The structure chart has five boxes `mbot.forward()` one below the other. How far does the mBot2 drive in the simulation? -→ First drive -- [ ] 5 cm -- [x] 50 cm -- [ ] 10 cm -> Each `mbot.forward()` drives 10 cm, which is one square of the grid. -? You have finished with the real mBot2. What do you do before you pull out the cable? -→ Connecting the real mBot2 -- [x] Click **🟢 mBot2** once more and wait until “Bis bald!” appears -- [ ] Push the slide switch to OFF -- [ ] Nothing, the cable can come out right away -> Only after “Bis bald!” is the port free. -? You hold your hand in front of the ultrasonic sensor, but the value under **🔧 Test the mBot2** does not change. What do you do? -→ Testing the mBot2 -- [ ] Start programming anyway -- [x] Tell your teacher before you start programming -- [ ] Change the value in the simulation by hand -> If a value does not change although you do something, something is wrong with the robot. -::: diff --git a/web/lessons/en/visubot/02-das-quadrat.md b/web/lessons/en/visubot/02-das-quadrat.md deleted file mode 100644 index d11d4912..00000000 --- a/web/lessons/en/visubot/02-das-quadrat.md +++ /dev/null @@ -1,365 +0,0 @@ ---- -titel: The square -bereich: Getting started -kurz: From a long structure chart to a triple nested loop. ---- - -## Skills I will gain now - -::: kompetenzen -- build a sequence without a loop first -- spot repetitions and replace them with a for loop -- nest two loops -- nest three loops -- upload my program to the mBot2 and start it with button A without a cable -::: - -## Driving a square - -The mBot2 should drive a square with sides of 50 cm. You already know one side: **move forward** five times. Then it turns right, and the next side begins. - -::: übung vb-quadrat -titel: The square -auftrag: Build a structure chart that makes the mBot2 drive a square: **move forward** five times, then **turn right**. And all of that four times. -fahrt: 4 x (5 x (forward), turnRight) -tipp: One side is five times move forward and once turn right. -tipp: That makes 24 boxes: four times five `mbot.forward()`, each followed by `mbot.turnRight()`. -lösung: vb-quadrat-loesung.visustruct -::: - -Quite a lot of boxes, right? If you miscount, the mBot2 no longer drives a square. - -## Always the same - -Look closely at your structure chart: five times **move forward** appears four times. When something repeats, you use a **loop**. We know exactly how often to drive, five times. The for loop fits that. - -Drag a for loop into the structure chart and give it these three parts: - -- Start: `int i = 0` -- Condition: `i < 5` -- Step: `i++` - -The body of the loop gets a single **move forward**. The loop counts `i` from 0 to 4, that is five runs. - -`i` is a **counter**. The computer uses it to remember which run it is in. Such a named store is called a **variable**; you will get to know it properly in lesson 3. The three parts mean: - -| Part | Meaning | -|---|---| -| `int i = 0` | The counter `i` is a whole number (`int`) and starts at 0. | -| `i < 5` | As long as `i` is less than 5, the loop runs once more. | -| `i++` | After every run `i` gets 1 bigger. | - -This is how the loop counts: - -| Run | 1 | 2 | 3 | 4 | 5 | after that | -|---|---|---|---|---|---|---| -| `i` | 0 | 1 | 2 | 3 | 4 | 5 | -| `i < 5`? | true | true | true | true | true | false, done | - -::: übung vb-quadrat-schleife -titel: Sides with a loop -auftrag: In your square, replace each row of five **move forward** with a for loop that drives five times. The mBot2 then drives exactly the same square. -fahrt: 4 x (5 x (forward), turnRight) -braucht: forSchleife -tipp: Start `int i = 0`, condition `i < 5`, step `i++`. The body only contains `mbot.forward()`. -tipp: Four times one below the other: the for loop and then `mbot.turnRight()`. -lösung: vb-quadrat-schleife-loesung.visustruct -::: - -## A loop in a loop - -Now the same pair appears four times: a for loop and **turn right**. That is a repetition too! Put both into a second for loop that runs four times. A loop inside a loop is called a **nested loop**. - -Each loop needs its own counter variable, otherwise the two get in each other's way. The usual way: the outer loop counts with `i`, the inner one with `j`. So rename your inner loop to `j`. - -::: übung vb-quadrat-verschachtelt -titel: Nested square -auftrag: Build the square with two nested for loops. The outer one runs four times, once for each side. The inner one runs five times, once for each step. -fahrt: 4 x (5 x (forward), turnRight) -schleifentiefe: 2 -tipp: Outside: start `int i = 0`, condition `i < 4`, step `i++`. Inside: `int j = 0`, `j < 5`, `j++`. -tipp: The outer loop contains the inner loop with `mbot.forward()` and below it `mbot.turnRight()`. -lösung: vb-quadrat-verschachtelt-loesung.visustruct -::: - -24 boxes have become four. Step through the program in the simulation with **Step** and watch the variables. - -::: quiz -? How often does the mBot2 run `mbot.forward()` in the nested square? -- [ ] 9 times -- [x] 20 times -- [ ] 5 times -> The inner loop runs five times, in each of the four runs of the outer loop: 4 · 5 = 20. -::: - -## Four squares - -Now it gets really nice: the mBot2 should drive four squares. After each square it turns right once. That makes a big window with a cross. - -You could copy your square four times and add a **turn right** after each square. Go ahead and try it! Notice something? Again the same thing appears four times. - -::: ludwig -Whenever you copy boxes, ask yourself: does something repeat here? Then a loop fits. -::: - -::: übung vb-vier-quadrate -titel: Four squares -auftrag: Let the mBot2 drive four squares. After each square it turns right once. Use three nested loops. -fahrt: 4 x (4 x (5 x (forward), turnRight), turnRight) -schleifentiefe: 3 -tipp: Put a third for loop that runs four times around your nested square. -tipp: Now `i` counts on the very outside (`int i = 0`, `i < 4`, `i++`). The loops inside are then called `j` and `k`. Inside the outer loop goes your square and then `mbot.turnRight()`. -lösung: vb-vier-quadrate-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lessons ["For loop"](?visustruct&lektion=13-for-schleife) and ["Nesting"](?visustruct&lektion=14-verschachteln). They open in a new window. - -::: quiz -? How often does the mBot2 drive 10 cm forward for the four squares? -→ Four squares -- [ ] 20 times -- [ ] 60 times -- [x] 80 times -> 4 squares · 4 sides · 5 steps = 80. Without loops that would be 80 boxes. -::: - -## Driving without a cable - -::: mbot2 -fokus: cyberpi, buttons -ansicht: oben -::: - -So far the mBot2 hangs on the cable while it drives. But you can also **upload your program to the mBot2**. Then it remembers it and drives all by itself, for example through a maze on the floor. - -1. Connect the mBot2 with the USB cable and switch it on, as in lesson 1. This only works in **Chrome** or **Edge**. -2. Open your program, for example the four squares. -3. Click **⬆ Upload** at the top and then **Upload now**. Choose **USB Serial** again. -4. Wait until it says “Done!”. The mBot2 restarts and shows **A = Start**. -5. Unplug the cable and put the mBot2 at the start. -6. Press **button A**, that is the [button with the square]{teil=buttons}. Now your program starts. - -The program stays saved, even when you switch the mBot2 off and on again. Only the next upload replaces it. - -> Afraid it drives off before you are ready? Don't worry: it always waits for button A. If you press A again while it drives, nothing happens. When it has finished, A starts the program again from the beginning. - -## Game: How often does it drive? - -::: spiel frage -titel: Game: How often does it drive? -intro: Count along without starting the simulation. How often does the mBot2 drive or turn? Six rounds. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(); - mbot.turnRight(); - } -frage: How often does the mBot2 drive forward? -- 3 times -- [x] 4 times -- 5 times -> `i` counts 0, 1, 2 and 3. That is four runs. - -runde: - for (int i = 1; i <= 4; i++) { - mbot.forward(); - } -frage: How often does the mBot2 drive forward? -- 3 times -- [x] 4 times -- 5 times -> This time `i` counts from 1 to 4 because of `<=`. That is four runs too. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: How often does the mBot2 drive forward? -- 8 times -- [x] 15 times -- 5 times -> The inner loop runs five times in each of the three outer runs: 3 · 5 = 15. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: How often does the mBot2 turn right? -- [x] 3 times -- 15 times -- 5 times -> `mbot.turnRight()` is in the outer loop, not in the inner one. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - } - mbot.turnRight(); -frage: Does the mBot2 drive a square? -- Yes, with 50 cm sides. -- [x] No, it drives 200 cm straight ahead and only turns at the end. -- Yes, but only half of one. -> `mbot.turnRight()` is below the loop. It only runs when the loop has finished. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 4; j++) { - mbot.forward(30); - mbot.turnRight(); - } - mbot.turnRight(); - } -frage: How many squares does the mBot2 drive? -- [x] 2 -- 4 -- 8 -> The inner loop drives one square. The outer loop repeats that twice. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should drive and tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(50); - mbot.turnRight(); - } -frage: Should drive a square with 50 cm sides. -fehler: 1 -besser: for (int i = 0; i < 4; i++) { -> A square has four sides. With `i < 3` it only drives three. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(180); - } -frage: Should drive a square with 50 cm sides. -fehler: 3 -besser: mbot.turnRight(); -> With 180° it turns round and just drives back and forth. A square needs 90°. - -runde: - for (int i = 0; i < 4; i++) { - for (int i = 0; i < 5; i++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Should drive a square made of four times five steps. -fehler: 2 -besser: for (int j = 0; j < 5; j++) { -> The inner loop needs its own counter `j`. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnLeft(45); - } -frage: Should drive a square with 30 cm sides. -fehler: 3 -besser: mbot.turnLeft(); -> A square needs right angles, so 90°. Without a number it turns 90°. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Then it drives the route for you. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..... | ..^.. -ziel: 2,0 -> One field forward, three times. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 1,2 -> A whole square: it arrives exactly where it started. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 2,2 -> Only three sides: the fourth is missing, so it ends up to the right of the start. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 2; j++) { - mbot.forward(30); - } - mbot.turnRight(); - } -karte: .... | .... | .... | ^... -ziel: 2,1 -> The inner loop drives two fields, then it turns. All that twice: two fields up, two to the right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a sequence without a loop first. → Driving a square -- I can spot repetitions and replace them with a for loop. → Always the same -- I can nest two loops. → A loop in a loop -- I can nest three loops. → Four squares -- I can upload my program to the mBot2 and start it with button A without a cable. → Driving without a cable -::: - -## Quiz - -::: quiz -? Still without a loop, the mBot2 should drive one side of 50 cm and then turn. Which boxes do you need? -→ Driving a square -- [ ] one `mbot.forward()` and one `mbot.turnRight()` -- [x] five `mbot.forward()` and one `mbot.turnRight()` -- [ ] five `mbot.turnRight()` -> Each `mbot.forward()` drives 10 cm, five of them are 50 cm. -? A for loop has the start `int i = 0`, the condition `i < 5` and the step `i++`. How often does it run? -→ Always the same -- [ ] 4 times -- [x] 5 times -- [ ] 6 times -> `i` counts 0, 1, 2, 3, 4. That is five runs. -? Why is the counter of the inner loop called `j` and not `i` as well? -→ A loop in a loop -- [ ] Each letter may only appear once in a program. -- [x] Each loop needs its own counter, otherwise the two get in each other's way. -- [ ] `j` counts faster than `i`. -> If both counted with `i`, the inner loop would mix up the outer one. -? How often does the mBot2 run `mbot.turnRight()` for the four squares? -→ Four squares -- [ ] 4 times -- [ ] 16 times -- [x] 20 times -> In each square it turns four times, that is 4 · 4 = 16. After each square there is one more turn: 16 + 4 = 20. -? Your program has been transferred and the cable is out. How do you start it? -→ Driving without a cable -- [ ] with button B -- [x] with button A -- [ ] with **⬆ Transfer** -> After the transfer the mBot2 shows **A = Start** and waits for button A. -::: diff --git a/web/lessons/en/visubot/02-quadrat-als-pap.md b/web/lessons/en/visubot/02-quadrat-als-pap.md deleted file mode 100644 index 52ca3801..00000000 --- a/web/lessons/en/visubot/02-quadrat-als-pap.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -titel: Flowcharts and pseudocode -bereich: Getting started -kurz: Write the plan for the square as a flowchart and as pseudocode and compare them with the structure chart. ---- - -## Skills I will gain now - -::: kompetenzen -- read a flowchart for the mBot2 and build one myself -- read a plan written as pseudocode -- compare structure chart, flowchart and pseudocode -::: - -## Three ways to write down a plan - -You know the plan for the square as a **structure chart**: a loop that runs four times, with driving one side and turning right inside it. - -There are two more ways to write down the same plan. You will meet both often, in class and on the internet: - -- the **flowchart**, -- **pseudocode**, a plan made of text in plain language. - -You can't control the mBot2 with them directly. But with all three you can write down a plan before you build it as a structure chart or in Java. - -## The flowchart - -A flowchart is made of a few symbols connected by **arrows**: - -- **Oval:** start or end. -- **Rectangle:** a statement, for example *drive forward 50 cm*. -- **Diamond:** a question with two exits: **yes** and **no**. -- **Parallelogram:** an input or output, for example a text on the screen. -- **Arrow:** shows which step comes next. - -A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. As long as the answer in the diamond is **no**, it goes back and the steps run again. - -> Careful: in a flowchart an arrow may point anywhere, even all over the place. In big charts this quickly becomes confusing. This is called **spaghetti code**. It can't happen in a structure chart, because there are no arrows. - -## Exercise: The square as a flowchart - -The mBot2 drives one side, turns right and counts the side. After four sides it shows "Square done!" on the screen. - -::: pap -titel: Exercise: The square as a flowchart -auftrag: The places in the chart are empty. Put each element in its place. The shape of the place helps you. -start: Start -anweisung: Drive forward 50 cm -anweisung: Turn right -anweisung: Count the side -frage: 4 sides driven? | nein -> Drive forward 50 cm -ausgabe: Show “Square done!” -ende: End -erklärung: As long as four sides have not been driven yet, the arrow leads from the diamond back to “Drive forward 50 cm”. That is the loop. Showing a text on the screen is an output, so it sits in the parallelogram. -legende: ja -::: - -**Draw your own flowcharts:** With **VisuFlow** you can easily draw your own flowchart, for example for your robot's next drive. The symbols are ready in a bar: tapping one adds the next symbol and connects it with an arrow right away. You save your flowchart as a file and export it as an image or PDF, for example for your notebook or a presentation. [Open VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Pseudocode - -**Pseudocode** is text that is laid out like a program but written in plain language. Fixed words like REPEAT, IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. The square looks like this: - -``` -REPEAT 4 times - drive forward 50 cm - turn right -END REPEAT -show "Square done!" -``` - -And this is the same plan in Java: - -```java -for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(); -} -mbot.showText("Square done!"); -``` - -Pseudocode has **no fixed way of writing**. Some people write FOR i FROM 1 TO 4, others REPEAT 4 times. All that matters is that anyone can understand it without an explanation. You can't control the computer with it, for that you need Java. - -### Comparison - -- **Structure chart:** boxes inside each other, the loop is an upside-down L. You see the structure at a glance. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very clear, but big charts get confusing. -- **Pseudocode:** text with indentation, the loop sits between REPEAT and END REPEAT. Quick to write and already close to Java. - -::: angeberwissen -Baah, who invented flowcharts? A woman and her husband: **Lillian and Frank Gilbreth** presented their "process charts" in 1921, long before the first computer. They used them to draw work steps in factories so they could make them simpler. Lillian Gilbreth had a doctorate in psychology and in 1965 became the first woman elected to the American National Academy of Engineering. Programmers later took over the idea for their plans. -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Flowcharts and pseudocode"](?visustruct&lektion=01-weitere-darstellungen) with baking a cake as a flowchart and the GOTO command. It opens in a new window. - -## Game: Which way of drawing? - -::: spiel frage -titel: Game: Which way of drawing? -intro: Ludwig describes a plan for the mBot2 without saying how it is written down. Is it the structure chart, the flowchart or pseudocode? Six rounds. -antworten: structure chart | flowchart | pseudocode - -runde: -frage: "An arrow leads from the diamond back to 'Drive forward 50 cm'." -richtig: flowchart -> You recognise a loop in a flowchart by the arrow back up. - -runde: -frage: "The loop looks like an upside-down L, with drive forward and turn right inside." -richtig: structure chart -> The upside-down L is the loop in a structure chart. - -runde: -frage: "REPEAT 4 times, with two indented lines below." -richtig: pseudocode -> Fixed words and indentation: that is pseudocode. - -runde: -frage: "'Square done!' sits in a slanted box." -richtig: flowchart -> The slanted box is the parallelogram for input and output. - -runde: -frage: "There are no arrows. If you insert a box, everything below simply moves down." -richtig: structure chart -> Without arrows, no jump in a structure chart can point to the wrong place. - -runde: -frage: "Some write FOR i FROM 1 TO 4, others REPEAT 4 times. Both are right." -richtig: pseudocode -> Pseudocode has no fixed way of writing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the elements of a flowchart. → The flowchart -- I can build the square as a flowchart myself. → Exercise: The square as a flowchart -- I can read a plan written as pseudocode. → Pseudocode -- I can compare structure chart, flowchart and pseudocode. → Three ways to write down a plan -::: - -## Quiz - -::: quiz -? How do you recognise a loop in a flowchart? -→ The flowchart -- [ ] By an upside-down L -- [x] By an arrow that leads back up -- [ ] By the word REPEAT -> The upside-down L belongs to the structure chart, REPEAT to pseudocode. - -? Match each flowchart symbol to its meaning. -→ The flowchart -= Oval -> Start or end -= Rectangle -> Statement -= Diamond -> Question with yes and no -= Parallelogram -> Input or output -> "Drive forward 50 cm" is a statement, showing "Square done!" is an output. - -? In the square flowchart, the diamond says "4 sides driven?". Where does the arrow lead for **no**? -→ Exercise: The square as a flowchart -- [x] Back to "Drive forward 50 cm" -- [ ] To the end -- [ ] To showing "Square done!" -> With no, the square isn't finished yet, so the mBot2 drives the next side. - -? In pseudocode, what shows which lines belong to the loop? -→ Pseudocode -- [ ] An arrow -- [x] The indentation and the END REPEAT -- [ ] The colour -> Everything between REPEAT and END REPEAT is indented and repeated. - -? Can the mBot2 run pseudocode directly? -→ Three ways to write down a plan -- [ ] Yes, like Java -- [x] No, pseudocode is only a plan for people -> The mBot2 can run the structure chart or Java. Pseudocode helps with planning. -::: diff --git a/web/lessons/en/visubot/03-variablen-und-ausgabe.md b/web/lessons/en/visubot/03-variablen-und-ausgabe.md deleted file mode 100644 index f6fa78f8..00000000 --- a/web/lessons/en/visubot/03-variablen-und-ausgabe.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -titel: Variables and output -bereich: Getting started -kurz: Store values in variables, drive the mBot2 with them and show results on the screen. ---- - -## Skills I will gain now - -::: kompetenzen -- create and use a variable -- read a short Java program and type it in the Code area -- tell the data types `int`, `double`, `String` and `boolean` apart -- drive a rectangle in Java with two variables -- show a result on the screen with `mbot.showText` -::: - -## A variable for the side - -With `mbot.forward(30)` the mBot2 drives 30 cm in one go. If you drive a square with it and no loop, the 30 appears four times in your program. To make the square bigger, you have to change it in four places. It is better to store the side length **once** and then use it everywhere. - -That is what **variables** are for. A variable is a box with a name that holds a value: - -```java -int side = 30; -mbot.forward(side); -``` - -- `int` is the **data type**: a whole number. -- `side` is the **name**. You may choose it yourself. -- `30` is the **value**. The `=` puts it into the box. - -Wherever `side` appears afterwards, the computer uses its value. So `mbot.forward(side)` drives 30 cm. - -::: übung vb-variable-seite -titel: Square with a variable -auftrag: In one statement, create the variable `int side = 30`. After that the mBot2 drives a square: four times `side` centimetres forward and turn right. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: The first statement is `int side = 30`. Below it comes a for loop that runs four times. -tipp: Inside the loop are `mbot.forward(side)` and `mbot.turnRight()`. -lösung: vb-variable-seite-loesung.visustruct -::: - -> Now change only the 30 to 60 and start the simulation. The whole square becomes twice as big. - -## Which data types are there? - -Every variable has a data type. It decides which values fit inside: - -| Data type | What fits inside? | Example | -|---|---|---| -| `int` | whole numbers | `int side = 30;` | -| `double` | decimal numbers, written with a point | `double wheelCircumference = 20.4;` | -| `String` | text in quotation marks | `String name = "Ludwig";` | -| `boolean` | true or false | `boolean wallNear = mbot.getDistance() < 20;` | - -One wheel rotation takes the mBot2 about 20.4 cm, which is a decimal number. `wallNear` holds `true` if the wall is closer than 20 cm. You will meet the distance sensor in Lesson 4. - -You can also calculate with variables: `int distance = 4 * side;` works out the whole distance around the square. - -## This is what Java looks like - -So far you have dragged boxes. From now on you will also write some programs in **Java**. You already know the boxes, because their text is real Java already. To the right of the structure chart is the [Code](#zeige-codelive) area. It shows your structure chart as Java code, and whatever you type there turns into the structure chart straight away. - -The square with a variable looks like this in Java: - -```java -int seite = 30; -for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); -} -``` - -- Every box is one line. Every statement ends with a **semicolon** `;`. -- The for loop is called `for`. Its three parts start, condition and step stand in round brackets, separated by `;`. -- Whatever the loop repeats stands in **curly brackets** `{ }`. Indent it so you can see at once what belongs to the loop. There is no semicolon after `{` and `}`. -- Upper and lower case matter: `mbot.turnRight()` works, `mbot.turnright()` doesn't. - -> How to solve a Java exercise: click **Open in editor**. The Code area opens on the right. Type your program there, watch the simulation and finally click **Check**. - -## Now in Java: rectangle - -A rectangle has two different sides. So you need two variables. - -::: übung vb-java-rechteck -titel: Rectangle with variables -code: java -auftrag: Write in Java: create `int length = 60` and `int width = 30`. The mBot2 drives a rectangle: length, turn right, width, turn right, and all that twice. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -braucht: forSchleife -tipp: Two variables at the top: `int length = 60;` and `int width = 30;`. Below them a for loop that runs twice. -tipp: Inside the loop: `mbot.forward(length);`, `mbot.turnRight();`, `mbot.forward(width);`, `mbot.turnRight();` -lösung: vb-java-rechteck-loesung.visustruct -::: - -## Result on the screen - -The mBot2 can do more than drive, it can also show you something. With `mbot.showText(…)` a text appears on the CyberPi's [screen]{teil=screen}. With `+` you join text and values: - -```java -int side = 30; -int distance = 4 * side; -mbot.showText("Distance: " + distance + " cm"); -``` - -The screen then shows **Distance: 120 cm**. You will learn more about the screen in Lesson 18. - -::: übung vb-strecke-anzeigen -titel: How far does it drive? -code: java -auftrag: Create `int length = 60` and `int width = 30` and drive the rectangle as before. Then work out in a variable `distance` how far the mBot2 drove all the way round, and show **Distance: 180 cm** on the screen. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -befehle: showText "Distance: 180 cm" -braucht: forSchleife -tipp: All the way round is twice the length and twice the width: `int distance = 2 * length + 2 * width;` -tipp: After the loop: `mbot.showText("Distance: " + distance + " cm");` -lösung: vb-strecke-anzeigen-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Input and output"](?visustruct&lektion=06-eingabe-und-ausgabe). It opens in a new window. There you print results to the console with `System.out.println`. - -## Game: Which data type? - -::: spiel frage -titel: Game: Which data type? -intro: Ludwig has wiped out the data types. Which one fits the gap? Seven rounds. -antworten: int | double | String | boolean - -runde: - ___ side = 30; -frage: Which data type fits? -richtig: int -> 30 is a whole number. - -runde: - ___ wheelCircumference = 20.4; -frage: Which data type fits? -richtig: double -> 20.4 is a decimal number, written with a point in Java. - -runde: - ___ name = "Ludwig"; -frage: Which data type fits? -richtig: String -> Text in quotation marks is a `String`. - -runde: - ___ wallNear = mbot.getDistance() < 20; -frage: Which data type fits? -richtig: boolean -> A comparison is true or false, so `boolean`. - -runde: - ___ distance = mbot.getDistance(); -frage: Which data type fits? -richtig: int -> The distance sensor gives whole centimetres, for example 38. - -runde: - ___ greeting = "Hello " + "class"; -frage: Which data type fits? -richtig: String -> Two texts joined with `+` give a text again. - -runde: - ___ average = 120 / 5.0; -frage: Which data type fits? -richtig: double -> With `5.0`, Java calculates with decimal numbers. The result is 24.0. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Watch the values in the variables. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - int side = 60; - mbot.forward(side); - mbot.turnRight(); - mbot.forward(side); -karte: ... | ... | ^.. -ziel: 2,0 -> `side` is 60, so two fields up and two to the right. - -runde: - int a = 30; - int b = a * 3; - mbot.forward(b); -karte: ... | ... | ... | ^.. -ziel: 0,0 -> `b` is 3 · 30 = 90 cm, so three fields. - -runde: - int distance = 30 * 2; - mbot.backward(distance); -karte: ..^.. | ..... | ..... -ziel: 2,2 -> `backward` drives in reverse: it faces up but drives 60 cm down. - -runde: - int side = 30; - for (int i = 0; i < 2; i++) { - mbot.forward(side); - mbot.turnRight(); - side = side + 30; - } -karte: .... | .... | .... | ^... -ziel: 2,2 -> First 30 cm up, then `side` grows to 60: two fields to the right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create and use a variable. → A variable for the side -- I can read a short Java program and type it in the Code area. → This is what Java looks like -- I can tell the data types `int`, `double`, `String` and `boolean` apart. → Which data types are there? -- I can drive a rectangle in Java with two variables. → Now in Java: rectangle -- I can show a result on the screen with `mbot.showText`. → Result on the screen -::: - -## Quiz - -::: quiz -? What does `mbot.forward(side)` drive if `int side = 40;` comes first? -→ A variable for the side -- [ ] 4 cm -- [x] 40 cm -- [ ] nothing, `side` is not a command -> Wherever `side` appears, Java uses the value 40. -? Which data type fits `"Ludwig"`? -→ Which data types are there? -- [ ] `int` -- [ ] `double` -- [x] `String` -> Text in quotation marks is a `String`. -? What does `mbot.showText("Side: " + 30);` show on the screen? -→ Result on the screen -- [x] Side: 30 -- [ ] "Side: " + 30 -- [ ] 30 -> The `+` joins the text and the number. -::: diff --git a/web/lessons/en/visubot/03-zeile-fuer-zeile-testen.md b/web/lessons/en/visubot/03-zeile-fuer-zeile-testen.md deleted file mode 100644 index 10ff30fd..00000000 --- a/web/lessons/en/visubot/03-zeile-fuer-zeile-testen.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -titel: Testing step by step -bereich: Getting started -kurz: Use the simulation and a desk check to find out what your program really does. ---- - -## Skills I will gain now - -::: kompetenzen -- control the simulation with Play, Step and Stop -- watch the variables in the simulation -- do a desk check with a table -- find and fix a mistake with the simulation -::: - -## Controlling the simulation - -With the [▶︎ Start simulation](#zeige-simulation) button on the right of the tools, VisuStruct runs your structogram. In the VisuBot world the mBot2 drives along. On the right, the **Controls** appear: - -- **Play** runs the program automatically, step by step. You set how fast under **Pause per step**. -- **Pause** stops for a moment. Then you carry on with Play or Step. -- **Step** runs exactly one box. That way you can watch calmly. -- **Stop** cancels and puts the mBot2 back at the start. - -During the simulation one box is highlighted. **Last step** shows what has just happened, **Variables** shows all variables with their values. - -::: diagramm vb-l03-wachsend-loesung.visustruct -Each side gets 10 cm longer. Open the diagram in the editor and go through it with **Step**. Watch `side` and `i`. -::: - -## The desk check - -In a **desk check** you play the computer yourself. You go through the structogram with pen and paper and write down the values of the variables after every step. For the diagram above the table looks like this: - -| Step | `i` | `side` | The mBot2 … | -|---|---|---|---| -| `int side = 20` | – | 20 | | -| `mbot.forward(side)` | 0 | 20 | drives 20 cm | -| `mbot.turnRight()` | 0 | 20 | turns right | -| `side = side + 10` | 0 | 30 | | -| `mbot.forward(side)` | 1 | 30 | drives 30 cm | -| … | … | … | … | - -Then compare your table with the simulation. Do the values under **Variables** match after every step? - -::: angeberwissen -"Computer" used to be a job: people who calculated with pen and paper. One of the best was Katherine Johnson at NASA. In 1962 the astronaut John Glenn only wanted to fly once she had checked the new IBM computer's orbit by hand: "If she says they're good, I'm ready to go." -::: - -## Finding mistakes with the simulation - -Ludwig wanted to build the spiral from above: 20 cm, 30 cm, 40 cm. But his mBot2 drives 30, 40 and 50 cm. The program runs without an error message, it just does the wrong thing. This kind of mistake is called a **logic error**. You find it best with **Step** and the variables. - -::: übung vb-spirale-falsch -titel: Fix the spiral -auftrag: "Open in editor" loads Ludwig's structogram. Go through it with **Step** and watch `side`. Find out why the first side is 30 cm long and fix it. The mBot2 should drive 20, 30 and 40 cm and turn right after each side. -start: vb-spirale-falsch-start.visustruct -fahrt: forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -braucht: forSchleife -tipp: Look at the value of `side` when `mbot.forward(side)` comes up. Is the order inside the loop right? -tipp: `side = side + 10` must come **after** `mbot.forward(side)` and `mbot.turnRight()`. Drag the box to the end of the loop. -lösung: vb-spirale-falsch-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Simulation and desk check"](?visustruct&lektion=07-simulation-und-schreibtischtest). It opens in a new window. - -## Game: Be the computer - -::: spiel frage -titel: Game: Be the computer -intro: Do the desk check in your head. What does the mBot2 do, and what values do the variables have? Five rounds. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side + 10; - } -frage: What value does `side` have after the loop? -- 40 -- [x] 50 -- 30 -> 20, then 30, 40 and after the third run 50. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side + 10; - } -frage: How far does the mBot2 drive the third time? -- [x] 40 cm -- 50 cm -- 30 cm -> It drives 20, 30 and 40 cm. The 50 only ends up in `side` afterwards. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - side = side + 10; - mbot.forward(side); - } -frage: How far does the mBot2 drive the first time? -- 20 cm -- [x] 30 cm -- 10 cm -> `side` grows before driving. That was exactly Ludwig's logic error. - -runde: - int distance = 0; - for (int i = 0; i < 4; i++) { - mbot.forward(25); - distance = distance + 25; - } - mbot.showText("Distance: " + distance); -frage: What does the screen show at the end? -- Distance: 25 -- [x] Distance: 100 -- Distance: 0 -> 25 is added four times: 25, 50, 75, 100. - -runde: - int side = 10; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side * 2; - } -frage: How far does the mBot2 drive in total? -- 60 cm -- [x] 70 cm -- 80 cm -> It drives 10, 20 and 40 cm. Together that is 70 cm. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 6 1 SIMULATION: runs your program on the screen, even without a robot -- ↓ 1 10 SEQUENCE: steps that come one after another -- ↓ 3 4 STRUCTOGRAM: another name for a Nassi-Shneiderman diagram -- ↓ 3 6 DATATYPE: decides which values fit into a variable, e.g. int -- ↓ 1 8 ALGORITHM: exact step-by-step instructions -- → 9 3 LOOP: repeats steps, looks like a tilted L in the structure chart -- → 12 3 VARIABLE: a little box with a name that holds a value -- ↓ 4 1 DESKCHECK: you play the computer with pen and paper -lösung: 11 4, 9 4, 12 8, 6 9, 7 6 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can control the simulation with Play, Step and Stop. → Controlling the simulation -- I can watch the variables in the simulation. → Controlling the simulation -- I can do a desk check with a table. → The desk check -- I can find and fix a mistake with the simulation. → Finding mistakes with the simulation -::: - -## Quiz - -::: quiz -? Which button runs exactly one box? -→ Controlling the simulation -- [ ] Play -- [x] Step -- [ ] Stop -> With Step you go box by box. Play carries on by itself. -? How far does the mBot2 drive in the second pass of "Growing sides"? -→ The desk check -- [ ] 20 cm -- [x] 30 cm -- [ ] 40 cm -> After the first pass `side` has grown by 10, so it is 30. -? The program runs without a message, but the mBot2 drives the wrong way. What kind of mistake is it? -→ Finding mistakes with the simulation -- [ ] a typo -- [x] a logic error -- [ ] a fault in the robot -> The program does exactly what it says, just not what was meant. -::: diff --git a/web/lessons/en/visubot/04-sensoren.md b/web/lessons/en/visubot/04-sensoren.md deleted file mode 100644 index bb67cd31..00000000 --- a/web/lessons/en/visubot/04-sensoren.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -titel: Reading sensors -bereich: Sensors and decisions -kurz: The mBot2 measures something, and your program decides. ---- - -## Skills I will gain now - -::: kompetenzen -- explain the difference between a command and a sensor -- build a sensor into a condition -::: - -## Commands and sensors - -So far you have only given the mBot2 **commands**: move forward, turn right. It carried them out without paying attention to its surroundings. - -Now the **sensors** join in. Among the [elements](#zeige-elemente) there is a group **mBot2 sensors** for them: - -| Sensor | Text | What you get | -|---|---|---| -| Distance | `mbot.getDistance()` | distance to the next wall in cm, e.g. `38` | -| Line | `mbot.getLine()` | `0` if everything under the line sensor is bright, otherwise a number greater than 0 | - -The mBot2 has even more sensors: colours, buttons and joystick, light, loudness and tilt. You get to know each of them in lessons 6 to 13, the motors in lesson 20 and the stopwatch and battery in lesson 21. - -A sensor is **not a box of its own**. It gives you a number, and with that number you build a **condition**: - -```java -mbot.getDistance() < 20 -``` - -This means: "Is the wall closer than 20 cm?" The answer is true or false. - -> How to build it: first drag a **branch** into the structure chart. Then drag the sensor **Distance** onto the branch. The condition now says `mbot.getDistance()`. You add the comparison `< 20` yourself. - -## Wall ahead? - -The mBot2 should decide by itself: if there is a wall ahead, it turns right. If the way is free, it drives forward a bit. - -This exercise has **two worlds**: in one the wall is right in front of it, in the other there is plenty of space. Your program must do the right thing in both. - -::: übung vb-wand-vorn -titel: Wall ahead? -auftrag: Build a branch with the condition `mbot.getDistance() < 20`. If **true**, the mBot2 turns right; if **false**, it moves forward. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Drag a branch into the structure chart and then the sensor **Distance** onto the branch. Write `< 20` after it. -tipp: The true branch contains `mbot.turnRight()`, the false branch `mbot.forward()`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -In the [Code](#zeige-codelive) area you can also see your structure chart as Java. A branch is called **if** there, and the false branch **else**. The condition goes in round brackets, each branch in curly brackets: - -```java -if (mbot.getDistance() < 20) { - mbot.turnRight(); -} else { - mbot.forward(); -} -``` - -> You don't have to type `if` yourself yet. There is more about it in the lesson on the ultrasonic sensor. - -## What does the sensor give you? - -A sensor gives you a **value**, just like a variable. When the mBot2 drives on, the value changes: the distance gets smaller as the wall comes closer. Only a **comparison** turns the value into a question with the answer `true` or `false`. - -| Condition | Question | Answer at a distance of 38 cm | -|---|---|---| -| `mbot.getDistance() < 20` | Is the wall closer than 20 cm? | `false` | -| `mbot.getDistance() > 30` | Is there more than 30 cm of space? | `true` | -| `mbot.getLine() == 0` | Is everything bright under the mBot2? | depends on the floor | - -You can compare with `<` (less than), `>` (greater than), `<=` (less than or equal), `>=` (greater than or equal), `==` (equal) and `!=` (not equal). - -> For "equal" you write **two** equals signs: `==`. A single `=` puts a value into a variable, which is something completely different. - -> 📘 **More without the robot:** VisuStruct has the lesson ["Branch"](?visustruct&lektion=08-verzweigung). It opens in a new window. - -::: übung vb-fehler-04-sensoren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Wall ahead?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-04-sensoren-start.visustruct -welt: wand-nah -> turnRight -welt: wand-frei -> forward -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.turnRight()`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -## Game: Command or sensor? - -::: spiel frage -titel: Game: Command or sensor? -intro: Does the line do something, or does it give a value? Eight rounds. -antworten: command | sensor - -runde: - mbot.forward(30) -frage: Command or sensor? -richtig: command -> It drives 30 cm. That is doing something. - -runde: - mbot.getDistance() -frage: Command or sensor? -richtig: sensor -> It gives the distance in cm, for example 38. - -runde: - mbot.turnRight() -frage: Command or sensor? -richtig: command -> Turning is doing something. - -runde: - mbot.getLine() -frage: Command or sensor? -richtig: sensor -> It gives 0 or a number greater than 0. - -runde: - mbot.playTone(440, 300) -frage: Command or sensor? -richtig: command -> A tone is an output. - -runde: - mbot.isButtonA() -frage: Command or sensor? -richtig: sensor -> It gives true or false: is button A pressed? - -runde: - mbot.showText("Hello") -frage: Command or sensor? -richtig: command -> Showing something is doing something. - -runde: - mbot.getBrightness() -frage: Command or sensor? -richtig: sensor -> It measures how bright it is, from 0 to 100. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain the difference between a command and a sensor. → Commands and sensors -- I can build a sensor into a condition. → Wall ahead? -::: - -## Quiz - -::: quiz -? The wall is 12 cm away. Is `mbot.getDistance() < 20` true or false? -→ Wall ahead? -- [x] true -- [ ] false -> 12 is less than 20, so the condition is true. -? The mBot2 is standing on a bright floor. What does `mbot.getLine()` give you? -→ Commands and sensors -- [x] 0 -- [ ] 15 -- [ ] the distance in cm -> 0 means: none of the four probes sees anything dark. -? Why is the sensor not a box of its own in the structure chart? -→ Wall ahead? -- [x] It does nothing, it only gives a value. You need that value in a condition. -- [ ] Because the mBot2 would get too slow otherwise. -- [ ] Because sensors only work in Java. -> Commands are statements. Sensors are values, just like a variable. -::: diff --git a/web/lessons/en/visubot/05-bis-zur-wand.md b/web/lessons/en/visubot/05-bis-zur-wand.md deleted file mode 100644 index 97bde0cc..00000000 --- a/web/lessons/en/visubot/05-bis-zur-wand.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -titel: Up to the wall -bereich: Sensors and decisions -kurz: The mBot2 measures the distance and stops in time. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the distance with `mbot.getDistance()` -- decide when to use a while loop instead of a for loop -- find a goal with the line sensor -::: - -## How far away is the wall? - -So far you told the mBot2 exactly how far to drive. Now it should notice by itself when to stop. - -That is what the ultrasonic sensor is for. `mbot.getDistance()` gives the distance to the next wall in centimetres, for example `38`. You can use it like a number: - -```java -mbot.getDistance() > 15 -``` - -This is a **condition**: it is true as long as the wall is more than 15 cm away. - -> Start the [simulation](#zeige-simulation): below the world you always see the current distance. When the mBot2 gets closer to the wall, the number gets smaller. - -## Three worlds, one program - -This exercise has **three worlds**. In each one the wall is somewhere else, and the mBot2 should stop at the goal with the green flag every time, without bumping into it. - -A fixed number of **move forward** only works in one world. You need a loop that keeps driving as long as the condition is true: the **while loop**. - -::: übung vb-bis-wand -titel: Up to the wall -auftrag: The mBot2 should drive forward until the wall is at most 15 cm away. Your program must work in all three worlds. Above the simulation you choose which world you see. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Distance** onto the loop. Then only the comparison is missing. -tipp: A while loop with the condition `mbot.getDistance() > 15`, with `mbot.forward()` inside. -lösung: vb-bis-wand-loesung.visustruct -::: - -::: ludwig -A loop that checks a condition before it drives is like me at the feeding trough: first I check whether there is anything left, and only then do I keep eating. -::: - -## To the goal - -Now it is the second sensor's turn. The goal is a black square with a green flag. When the mBot2 drives onto it, its line sensor sees it: `mbot.getLine()` is then no longer `0`. - -::: übung vb-bis-ziel -titel: Drive to the goal -auftrag: The mBot2 should keep driving forward until it is on the goal. Again there are two worlds. -welt: ziel-kurz, ziel-lang -braucht: whileSchleife -tipp: The loop should run as long as the line sensor sees **nothing**. Drag the sensor **Line** onto the while loop. -tipp: The condition is `mbot.getLine() == 0`. Inside the loop is `mbot.forward()`. -lösung: vb-bis-ziel-loesung.visustruct -::: - -## What does the loop check? - -> 📘 **More without the robot:** VisuStruct has the lesson ["While loop"](?visustruct&lektion=11-while-schleife). It opens in a new window. - -::: übung vb-fehler-05-bis-zur-wand -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Up to the wall", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-bis-zur-wand-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.forward()`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Game: How often does it drive? - -::: spiel frage -titel: Game: How often does it drive? -intro: Each drive is 10 cm long. Work out how often the mBot2 drives forward before the loop stops. Six rounds. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 40 cm away. How often does it drive forward? -- 2 times -- [x] 3 times -- 4 times -> 40, 30 and 20 are greater than 15: three drives. At 10 the loop stops. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 15 cm away. How often does it drive forward? -- [x] not at all -- once -- 2 times -> 15 is not greater than 15. The condition is false right at the start. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 50 cm away. Where does it stop? -- 15 cm from the wall -- [x] 10 cm from the wall -- 0 cm, it bumps into it -> 50, 40, 30, 20: four drives. Then the wall is 10 cm away and the loop stops. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } -frage: The mBot2 is already standing on the black goal. How often does it drive forward? -- [x] not at all -- once -- forever -> On black, `mbot.getLine()` is not 0. The condition is false straight away. - -runde: -frage: The mBot2 should drive forward exactly five times. Which loop fits best? -- [x] a for loop -- a while loop with `mbot.getDistance()` -- no loop at all -> The number is known in advance. That is what the for loop is for. - -runde: -frage: The mBot2 should drive until it almost touches the wall. Which loop fits? -- a for loop that runs ten times -- [x] a while loop with `mbot.getDistance()` -- no loop at all -> You don't know in advance how far away the wall is. The while loop checks on the way. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Grey is a wall. Tap the field where the mBot2 is at the end. Each field is 30 cm, and the sensor is at the front of the mBot2. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> It drives as long as more than 15 cm ahead are free. It stops right in front of the wall. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,1 -> However far away the wall is, the while loop stops it right in front of it. - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(60); -karte: ##### | ..... | ..... | ..... | ^.... -ziel: 2,2 -> With more than 45 cm it stops one field earlier, turns and drives two fields to the right. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,0 -> It drives until its line sensor sees black. Then it is standing on the black field. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the distance with `mbot.getDistance()`. → How far away is the wall? -- I can decide when to use a while loop instead of a for loop. → Three worlds, one program -- I can find a goal with the line sensor. → To the goal -::: - -## Quiz - -::: quiz -? The mBot2 is 40 cm in front of the wall. How often does it drive forward with `while (mbot.getDistance() > 15) mbot.forward();` if each move is 10 cm? -→ How far away is the wall? -- [ ] not at all -- [ ] once -- [x] until the wall is at most 15 cm away -- [ ] always exactly five times -> The while loop checks the condition before every move. When the wall is close enough, it stops. -? Why is a for loop with a fixed count not enough here? -→ Three worlds, one program -- [x] Because the wall is at a different distance in every world. -- [ ] Because a for loop must not contain statements. -- [ ] Because the mBot2 does not understand for loops. -> The for loop knows beforehand how often it runs. The while loop decides on the way. -::: diff --git a/web/lessons/en/visubot/05-erst-fahren-dann-pruefen.md b/web/lessons/en/visubot/05-erst-fahren-dann-pruefen.md deleted file mode 100644 index 04b18a7e..00000000 --- a/web/lessons/en/visubot/05-erst-fahren-dann-pruefen.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -titel: Drive first, then check -bereich: Sensors and decisions -kurz: The do-while loop always drives at least once and only checks afterwards. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the do-while loop checks its condition only after the body -- compare a while loop and a do-while loop -- write a do-while loop in Java -::: - -## Drive first, then check - -The while loop from Lesson 5 checks **first** and then drives. If the wall is already right in front of the mBot2, it does not drive off at all. It is a **pre-test loop**: the condition is at the top, in the head. - -The **do-while loop** is a **post-test loop**. The condition is at the bottom, in the foot of the box: - -1. Run the body once. -2. Check the condition. -3. If it is true, start again at 1. If it is false, carry on below the loop. - -That is why the body **always runs at least once**. When you click the loop, the word `while` is in front of the text field in the Object Inspector: the condition means "repeat as long as …". - -| Distance at the start | While loop | Do-while loop | -|---|---|---| -| 50 cm | drives until 15 cm | drives until 15 cm | -| 10 cm | does **not drive at all** | drives 10 cm **once** | - -::: übung vb-do-while -titel: At least one step -auftrag: Build a structogram with a do-while loop: the mBot2 drives forward as long as the distance is greater than 15 cm, but **at least once**. Then it plays a tone. -messwerte: getDistance=10 -> forward, tone -welt: wand-kurz -> tone -braucht: doUntilSchleife -tipp: Drag the **do-while loop** from the Elements into the structogram. **Drive forward** goes into the box, the condition `mbot.getDistance() > 15` into the foot. -tipp: Below the loop (not inside it) goes `mbot.playTone(440, 300)`. -lösung: vb-do-while-loesung.visustruct -::: - -> When checking, the wall is once only 10 cm in front of the mBot2. A while loop would not drive at all then. - -## Now in Java: counting steps - -In Java, `do` is at the top and `while (…)` with a semicolon at the bottom: - -```java -do { - mbot.forward(); -} while (mbot.getDistance() > 15); -``` - -::: übung vb-java-schritte-zaehlen -titel: Count the steps -code: java -auftrag: Write in Java: create `int steps = 0`. In a do-while loop the mBot2 drives forward and counts `steps` up by one, as long as the distance is greater than 15 cm. Then the screen shows for example **Steps: 3**. -welt: wand-kurz -> screen "Steps: 3" -messwerte: getDistance=10 -> forward, screen "Steps: 1" -braucht: doUntilSchleife -tipp: `do { mbot.forward(); steps = steps + 1; } while (mbot.getDistance() > 15);` -tipp: After the loop `mbot.showText("Steps: " + steps);`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Do-while loop"](?visustruct&lektion=12-do-while-schleife). It opens in a new window. - -::: übung vb-fehler-05-erst-fahren-dann-pruefen -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Count the steps", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct -welt: wand-kurz -> screen "Steps: 3" -messwerte: getDistance=10 -> forward, screen "Steps: 1" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `mbot.showText("Steps: " + steps)`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -## Game: Head or foot? - -::: spiel frage -titel: Game: Head or foot? -intro: While or do-while: how often does the mBot2 drive forward? Each drive is 10 cm long. Six rounds. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall is 10 cm in front of the mBot2. How often does it drive forward? -- [x] not at all -- once -- 2 times -> The while loop checks first. 10 is not greater than 15. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: The wall is 10 cm in front of the mBot2. How often does it drive forward? -- not at all -- [x] once -- 2 times -> The do-while loop drives first and checks afterwards. It always drives once. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: The wall is 40 cm in front of the mBot2. How often does it drive forward? -- 2 times -- [x] 3 times -- 4 times -> After the first drive it is 30 cm, then 20, then 10. At 10 it stops. Here both loops drive the same number of times. - -runde: - int steps = 0; - do { - mbot.forward(); - steps = steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + steps); -frage: The wall is 10 cm in front of the mBot2. What does the screen show? -- Steps: 0 -- [x] Steps: 1 -- Steps: 2 -> The body runs once, so `steps` counts up once. - -runde: -frage: Which loop is foot-controlled? -- the while loop -- [x] the do-while loop -- the for loop -> Its condition is at the bottom, in the foot. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15) -frage: Why doesn't this code run? -- `do` must be written with a capital letter. -- [x] The semicolon after `while (…)` is missing. -- The condition must be at the top. -> The do-while loop ends with `} while (condition);`. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() < 15); -frage: Should drive forward at least once, and keep going as long as the wall is more than 15 cm away. -fehler: 3 -besser: } while (mbot.getDistance() > 15); -> "More than 15 cm" means `> 15`. - -runde: - do - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Should drive forward at least once, and keep going as long as the wall is more than 15 cm away. -fehler: 1 -besser: do { -> The opening curly bracket after `do` is missing. - -runde: - int steps = 0; - do { - mbot.forward(); - steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + steps); -frage: Should count the steps and show them at the end. -fehler: 4 -besser: steps = steps + 1; -> `steps + 1` only calculates, it doesn't store anything. The result has to go back into `steps` with `=`. - -runde: - int steps = 0; - do { - mbot.forward(); - steps = steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + Steps); -frage: Should count the steps and show them at the end. -fehler: 6 -besser: mbot.showText("Steps: " + steps); -> Java tells capital and small letters apart. There is no `Steps`. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Grey is a wall. While or do-while: tap the field where the mBot2 is at the end. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,2 -> The wall is already close. The while loop checks first and doesn't set off at all. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 45); -karte: ##### | ..... | ..^.. -ziel: 2,1 -> The do-while loop drives once first and checks afterwards. One field further on it stops. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); - mbot.turnLeft(); - mbot.forward(30); -karte: ##### | ..... | ..^.. -ziel: 1,1 -> One field forward, then the wall is right in front. Then left and one more field. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> If the wall is far away, while and do-while drive the same distance: right up to the wall. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the do-while loop checks its condition only after the body. → Drive first, then check -- I can compare a while loop and a do-while loop. → Drive first, then check -- I can write a do-while loop in Java. → Now in Java: counting steps -::: - -## Quiz - -::: quiz -? Where is the condition of a do-while loop? -→ Drive first, then check -- [ ] at the top, in the head -- [x] at the bottom, in the foot -- [ ] nowhere -> Post-test means: first the body, then the condition. -? The wall is 10 cm in front of the mBot2. How often does `do { mbot.forward(); } while (mbot.getDistance() > 15);` drive? -→ Drive first, then check -- [ ] not at all -- [x] once -- [ ] until it bumps -> The body always runs at least once. After that the condition is false. -? What comes after `while (…)` at the end of a do-while loop in Java? -→ Now in Java: counting steps -- [x] a semicolon `;` -- [ ] a curly bracket `{` -- [ ] nothing -> `} while (condition);` ends with a semicolon. -::: diff --git a/web/lessons/en/visubot/05-zaehlen-und-summieren.md b/web/lessons/en/visubot/05-zaehlen-und-summieren.md deleted file mode 100644 index ca2ef274..00000000 --- a/web/lessons/en/visubot/05-zaehlen-und-summieren.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -titel: Counting and adding up -bereich: Sensors and decisions -kurz: Count along with a variable and add values together. ---- - -## Skills I will gain now - -::: kompetenzen -- create a counter variable and count it up in a loop -- build a sum in a loop -- show the result on the screen after the loop -::: - -## Counting along - -How many steps does the mBot2 drive to the wall? You don't know in advance, the world is different every time. So the mBot2 should **count along**. You need three boxes for that: - -1. **Before** the loop: `int steps = 0`. At the start nothing has been counted yet. -2. **Inside** the loop: `steps = steps + 1`. One more after every step. -3. **After** the loop: show the result, for example with `mbot.showText("Steps: " + steps)`. - -Read `steps = steps + 1` from right to left: take the old value of `steps`, add 1 and store the result in `steps` again. A variable like this is called a **counter variable**, or counter for short. - -> Careful: if `int steps = 0` is **inside** the loop, the counter starts again at 0 in every pass. Then the result is always 1. - -::: angeberwissen -Your phone counts your steps exactly like this: with every step it calculates `steps = steps + 1`. I prefer counting my blades of grass. I'm at 4 million. -::: - -::: übung vb-schritte-welt -titel: Steps to the wall -auftrag: Build a structure chart: the mBot2 drives forward as long as the distance is greater than 15. It counts its steps along the way. Then it shows, for example, **Steps: 3** on the screen. There are three worlds. -welt: wand-kurz -> screen "Steps: 3" -welt: wand-mittel -> screen "Steps: 7" -welt: wand-lang -> screen "Steps: 12" -braucht: whileSchleife -tipp: The first box is `int steps = 0`. Then comes the while loop with `mbot.getDistance() > 15`. -tipp: Inside the loop are **drive forward** and `steps = steps + 1`. After the loop is `mbot.showText("Steps: " + steps)`. -lösung: vb-schritte-welt-loesung.visustruct -::: - -## Adding up - -A counter always grows by 1. A **sum** grows by different values. The mBot2 drives a spiral: first 10 cm, then 20, then 30, then 40. How far has it driven in total? - -| Pass | `side` | `total` afterwards | -|---|---|---| -| before | 10 | 0 | -| 1 | 10 | 0 + 10 = 10 | -| 2 | 20 | 10 + 20 = 30 | -| 3 | 30 | 30 + 30 = 60 | -| 4 | 40 | 60 + 40 = 100 | - -The pattern is the same as for counting. Only instead of 1 you now add the value that comes in: `total = total + side`. - -## Now in Java: spiral with distance - -::: übung vb-java-spirale-strecke -titel: Spiral with distance -code: java -auftrag: Write in Java: create `int side = 10` and `int total = 0`. Four times: drive `side` cm forward, turn right, add `side` to `total`, make `side` 10 bigger. Then show **Distance: 100 cm** on the screen. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Distance: 100 cm" -braucht: forSchleife -tipp: The for loop has four lines: `mbot.forward(side);`, `mbot.turnRight();`, `total = total + side;` and `side = side + 10;`. -tipp: After the loop comes `mbot.showText("Distance: " + total + " cm");`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -::: übung vb-fehler-05-zaehlen-und-summieren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Spiral with distance", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-zaehlen-und-summieren-start.visustruct -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Distance: 100 cm" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `total = total + side`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -## Game: what is in the variable at the end? - -::: spiel frage -titel: Game: what is in the variable at the end? -intro: Ludwig has written small programs. Work them out in your head. Five rounds. - -runde: -frage: `int z = 0`, then three times `z = z + 1`. What is `z`? -- 1 -- [x] 3 -- 0 -> Each pass adds 1: 1, 2, 3. - -runde: -frage: `int sum = 0`, then `sum = sum + 5` and `sum = sum + 7`. What is `sum`? -- 7 -- [x] 12 -- 5 -> 0 + 5 = 5, then 5 + 7 = 12. - -runde: -frage: A loop runs four times. Inside it are `int z = 0` and `z = z + 1`. What is `z` at the end? -- 4 -- [x] 1 -- 0 -> The counter is set back to 0 in every pass. It belongs before the loop. - -runde: -frage: `int total = 0`. The mBot2 drives 20, 20 and 30 cm and adds each one. What is `total`? -- 30 -- 20 -- [x] 70 -> 20 + 20 + 30 = 70. - -runde: -frage: `int steps = 10`, then twice `steps = steps + 1`. What is `steps`? -- 2 -- [x] 12 -- 11 -> Here the counter starts at 10, not at 0. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a counter variable and count it up in a loop. → Counting along -- I can build a sum in a loop. → Adding up -- I can show the result on the screen after the loop. → Now in Java: spiral with distance -::: - -## Quiz - -::: quiz -? Where do you create the counter variable `int steps = 0`? -→ Counting along -- [x] Before the loop -- [ ] Inside the loop -- [ ] After the loop -> Inside the loop it would become 0 again in every pass. -? What does `steps = steps + 1` do? -→ Counting along -- [ ] It compares steps with steps + 1. -- [x] It takes the old value, adds 1 and stores the result. -- [ ] It sets steps to 1. -? How do you add the side length `side` to the sum `total`? -→ Adding up -- [ ] `total = side` -- [ ] `side = total + side` -- [x] `total = total + side` -::: diff --git a/web/lessons/en/visubot/06-abstand.md b/web/lessons/en/visubot/06-abstand.md deleted file mode 100644 index 8b8f2d63..00000000 --- a/web/lessons/en/visubot/06-abstand.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -titel: The ultrasonic sensor -bereich: Sensors and decisions -kurz: Measure the distance, keep your distance, and do it all in Java. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what `mbot.getDistance()` measures -- put one branch inside another -- write a while loop with the distance in Java -::: - -## How does the mBot2 measure distance? - -::: mbot2 -focus: ultrasonic -view: front -::: - -The [ultrasonic sensor]{part=ultrasonic} sends out a very high sound and waits for the echo. The longer the echo takes, the further away the wall is. `mbot.getDistance()` gives you the distance in **centimetres**, from about 3 to 300. - -| Sensor | Text | Value | -|---|---|---| -| Distance | `mbot.getDistance()` | whole number in cm, e.g. `38` | - -> In the [simulation](#zeige-simulation) the current distance is always shown below the world. With a real mBot2 you can hold your hand in front of the sensor and watch the number change. - -## Keep your distance in the structure chart - -The mBot2 should behave like a dog on a lead: if your hand is too close (under 10 cm), it backs away. If it is too far away (over 20 cm), it comes closer. In between, it stays where it is. - -For this you need two branches, one inside the other. The outer one checks “too close?”, the inner one in the false branch checks “too far?”. - -::: übung vb-abstand-halten -titel: Keep your distance -auftrag: Build a structure chart: if the distance is less than 10, the mBot2 drives back. Otherwise: if the distance is greater than 20, it drives forward. Otherwise it does nothing. -messwerte: getDistance=5 -> backward -messwerte: getDistance=35 -> forward -messwerte: getDistance=15 -> none -braucht: verzweigung -tipp: Drag a branch into the structure chart and the sensor **Distance** onto it. Write `< 10` after it. The true branch gets **move back**. -tipp: The false branch gets a second branch with `mbot.getDistance() > 20` and **move forward** in its true branch. Its false branch stays empty. -lösung: vb-abstand-halten-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance to 5, 35 and 15 cm one after the other and looks at what your mBot2 does. - -## Now in Java - -In the [Code](#zeige-codelive) area you already see your structure chart as Java code. A branch is called `if` there, the false branch is `else`: - -```java -if (mbot.getDistance() < 10) { - mbot.backward(); -} else { - ... -} -``` - -You type a sensor like a command: `mbot.` and then `getDistance()`. After the dot the editor suggests all commands and sensors. - -::: übung vb-java-wand-piep -titel: To the wall and beep -code: java -auftrag: Write in Java: the mBot2 drives forward as long as the wall is more than 15 cm away. Then it plays a tone. There are three worlds. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: A while loop in Java is `while (condition) { … }`. The condition is `mbot.getDistance() > 15`. -tipp: Inside the loop is `mbot.forward();`, after the loop `mbot.playTone(440, 300);`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -::: übung vb-fehler-06-abstand -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To the wall and beep", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-abstand-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be `mbot.playTone(440, 300)`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should do and tap the wrong line before time runs out. Six rounds, 30 seconds each. -zeit: 30 - -runde: - if (mbot.getDistance() < 10) { - mbot.forward(); - } - if (mbot.getDistance() > 20) { - mbot.forward(); - } -frage: Under 10 cm it should drive back, over 20 cm forward. -fehler: 2 -besser: mbot.backward(); -> If the hand is too close, it has to go back, not forward. - -runde: - while (mbot.getDistance() < 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive forward as long as the wall is more than 15 cm away, then beep. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> "More than 15 cm away" means `> 15`. - -runde: - while (mbot.getDistance > 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive to the wall and then beep. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> A sensor is a method. Without brackets, Java can't find it. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } els { - mbot.forward(); - } -frage: Under 10 cm it should drive back, otherwise forward. -fehler: 3 -besser: } else { -> The false branch is called `else`. - -runde: - while (mbot.getDistance() > 15) { - mbot.turnRight(); - } - mbot.playTone(440, 300); -frage: Should drive to the wall and then beep. -fehler: 2 -besser: mbot.forward(); -> It should drive forward, not turn. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } else { - if (mbot.getDistance() < 20) { - mbot.forward(); - } - } -frage: Under 10 cm back, over 20 cm forward, in between stand still. -fehler: 4 -besser: if (mbot.getDistance() > 20) { -> It should only drive forward if the hand is more than 20 cm away. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what `mbot.getDistance()` measures. → How does the mBot2 measure distance? -- I can put one branch inside another. → Keep your distance in the structure chart -- I can write a while loop with the distance in Java. → Now in Java -::: - -## Quiz - -::: quiz -? `mbot.getDistance()` gives `8`. What does the program from “Keep your distance” do? -→ Keep your distance in the structure chart -- [x] It drives back. -- [ ] It drives forward. -- [ ] It stays where it is. -> 8 is less than 10, so the first condition is already true. -? What is the false branch of a branch called in Java? -→ Now in Java -- [ ] `then` -- [x] `else` -- [ ] `otherwise` -> `if` is the start, `else` the false branch. -::: diff --git a/web/lessons/en/visubot/06-konstanten-final.md b/web/lessons/en/visubot/06-konstanten-final.md deleted file mode 100644 index 91468c84..00000000 --- a/web/lessons/en/visubot/06-konstanten-final.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -titel: Fixed values with final -bereich: Sensors and decisions -kurz: Create a constant so that an important number appears in only one place. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what a constant is -- create a constant in the structure chart and in Java -- use a constant in a condition and in a command -::: - -## One number in many places - -Ludwig has written a program for the hallway: the mBot2 drives up to 20 cm from the wall, turns around and drives up to 20 cm from the other wall. - -::: diagramm vb-l06k-ohne.visustruct -There and back. The number 20 appears in two places. -::: - -Now the mBot2 should stop at 30 cm instead. Ludwig has to find and change every 20. If he forgets one, the mBot2 stops once at 30 and once at 20 cm. In long programs this happens quickly. - -::: angeberwissen -Professionals call a number that just sits in the program a **magic number**. Magic, because nobody remembers what it means. The only magic I like is magic grass. -::: - -## Creating a constant - -A **constant** is better. It is a variable whose value stays the same once it is set. You create it once at the very top and after that you only use its name. - -| | Structure chart | Java | -|---|---|---| -| create | `const int DISTANCE = 20` | `final int DISTANCE = 20;` | -| use | `mbot.getDistance() > DISTANCE` | `mbot.getDistance() > DISTANCE` | - -In the structure chart you write `const` in front, in Java `final`. Both mean: this value does not change any more. Names of constants are written in **capital letters**, so you can spot them right away. - -::: diagramm vb-l06k-mit.visustruct -The same program with the constant DISTANCE. For 30 cm you only change the first line. -::: - -::: übung vb-konstante-wand -titel: Wall with a constant -auftrag: Create the constant `DISTANCE` with the value 20. The mBot2 drives forward as long as the distance is greater than `DISTANCE`. Then it plays a tone. There are three worlds. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: The first box is a statement with `const int DISTANCE = 20`. Below it comes a while loop. -tipp: The loop condition is `mbot.getDistance() > DISTANCE`. Inside the loop is **drive forward**, after the loop **play tone**. -lösung: vb-konstante-wand-loesung.visustruct -::: - -## Now in Java: square with a constant - -A constant also fits into a command. With `final int SIDE = 30;`, `mbot.forward(SIDE);` drives exactly 30 cm. If the square should get bigger, you only change that one line. - -::: übung vb-java-konstante-seite -titel: Square with a constant -code: java -auftrag: Write in Java: create the constant `SIDE` with the value 30. Then use a for loop to drive a square with side length `SIDE`. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: The first line is `final int SIDE = 30;`. Then comes `for (int i = 0; i < 4; i++) { … }`. -tipp: Inside the loop are `mbot.forward(SIDE);` and `mbot.turnRight();`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -::: übung vb-fehler-06-konstanten-final -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Square with a constant", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-konstanten-final-start.visustruct -fahrt: 4 x (forward 30, turnRight) -tipp: The error message names an unknown variable. What is the constant called where it is created? Constants are written in capital letters. -tipp: It should be `mbot.forward(SIDE)`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -## Game: constant or variable? - -::: spiel frage -titel: Game: constant or variable? -intro: Ludwig is sorting values. If the value stays the same in the whole program, it is a constant. If it changes, it is a variable. Six rounds. -frage: Constant or variable? -antworten: Constant | Variable - -runde: -frage: The number of corners of a square -richtig: Constant -> A square always has four corners. - -runde: -frage: The distance the ultrasonic sensor is measuring right now -richtig: Variable -> When the mBot2 drives, the distance changes all the time. - -runde: -frage: The minimum distance at which the mBot2 should always stop -richtig: Constant -> You set it once, for example `final int DISTANCE = 20;`. - -runde: -frage: The number of steps the mBot2 has already driven -richtig: Variable -> It grows by 1 after every step. - -runde: -frage: The pitch of the warning tone, always 440 Hz -richtig: Constant -> The warning tone always sounds the same. - -runde: -frage: The battery level in percent -richtig: Variable -> The battery slowly runs down while driving. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what a constant is. → Creating a constant -- I can create a constant in the structure chart and in Java. → Creating a constant -- I can use a constant in a condition and in a command. → Now in Java: square with a constant -::: - -## Quiz - -::: quiz -? What is a constant? -→ Creating a constant -- [ ] A variable that changes in every pass -- [x] A variable whose value stays the same once it is set -- [ ] A sensor that always measures the same value -> You set a constant once. After that you only use its name. -? How do you create the constant `DISTANCE` with the value 20 in Java? -→ Creating a constant -- [ ] `const DISTANCE = 20;` -- [x] `final int DISTANCE = 20;` -- [ ] `int final = 20;` -> In Java, `final` comes before the data type. In the structure chart you write `const`. -? Why is a constant better than the number 20 in many places? -→ Creating a constant -- [ ] Because the program drives faster -- [x] Because you only have to change the value in one place -- [ ] Because the sensor measures more precisely -::: diff --git a/web/lessons/en/visubot/06-nah-mittel-weit.md b/web/lessons/en/visubot/06-nah-mittel-weit.md deleted file mode 100644 index 3a8a8ae6..00000000 --- a/web/lessons/en/visubot/06-nah-mittel-weit.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -titel: Near, medium or far? -bereich: Sensors and decisions -kurz: Build a branch with three cases and write it in Java with else if. ---- - -## Skills I will gain now - -::: kompetenzen -- build a branch with three cases -- read and write `else if` in Java -- check the conditions in the right order -::: - -## Three cases instead of two - -Many cars have a **parking aid**. If the wall is far away, everything is free. When it gets closer, it says: slow. When it is very close: stop! - -A branch has only two branches, yes and no. For three cases you put a second branch into the no branch of the first one: - -1. Is the distance less than 10? Then **Stop**. -2. Otherwise: is the distance less than 30? Then **Slow**. -3. Otherwise: **Free**. - -::: diagramm vb-l06n-einparkhilfe.visustruct -The parking aid. The second question is only asked if the answer to the first one was no. -::: - -Try it in the [simulation](#zeige-simulation): open the diagram in the editor and set the distance to 5, 20 and 50 cm. - -> 📘 **More without the robot:** VisuStruct has the lesson ["Branch"](?visustruct&lektion=08-verzweigung). It opens in a new window. - -## Speed by distance in the structure chart - -::: übung vb-tempo-abstand -titel: Speed by distance -auftrag: Build a structure chart with three cases: if the distance is less than 10, the mBot2 drives 5 cm backward. Otherwise: if the distance is less than 30, it drives 5 cm forward. Otherwise it drives 20 cm forward. -messwerte: getDistance=5 -> backward 5 -messwerte: getDistance=20 -> forward 5 -messwerte: getDistance=50 -> forward 20 -braucht: verzweigung -tipp: Build it like the parking aid: a branch with `mbot.getDistance() < 10` and in its no branch a second one with `mbot.getDistance() < 30`. -tipp: The commands are `mbot.backward(5)`, `mbot.forward(5)` and `mbot.forward(20)`. The last one goes into the no branch of the second branch. -lösung: vb-tempo-abstand-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance to 5, 20 and 50 cm one after the other. - -## Now in Java: else if - -Look at the [Code](#zeige-codelive) area. The branch inside the no branch looks like this: - -```java -if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} else { - if (mbot.getDistance() < 30) { - mbot.showText("Slow"); - } else { - mbot.showText("Free"); - } -} -``` - -In Java you may write this more briefly. The `if` moves right behind the `else`: - -```java -if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} else if (mbot.getDistance() < 30) { - mbot.showText("Slow"); -} else { - mbot.showText("Free"); -} -``` - -Both mean exactly the same. With `else if` it is easier to read, though. You still always write the curly brackets `{ }`. - -::: übung vb-java-tageszeit -titel: Day or night? -code: java -auftrag: Write in Java with `else if`: if the brightness is less than 20, the mBot2 shows **Night**. Otherwise: if it is less than 60, it shows **Dusk**. Otherwise it shows **Day**. -messwerte: getBrightness=10 -> none, screen "Night" -messwerte: getBrightness=40 -> none, screen "Dusk" -messwerte: getBrightness=80 -> none, screen "Day" -braucht: verzweigung -tipp: You read the brightness with `mbot.getBrightness()`. The first condition is `mbot.getBrightness() < 20`. -tipp: `if (…) { mbot.showText("Night"); } else if (mbot.getBrightness() < 60) { mbot.showText("Dusk"); } else { mbot.showText("Day"); }` -lösung: vb-java-tageszeit-loesung.visustruct -::: - -::: übung vb-fehler-06-nah-mittel-weit -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Day or night?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-nah-mittel-weit-start.visustruct -messwerte: getBrightness=10 -> none, screen "Night" -messwerte: getBrightness=40 -> none, screen "Dusk" -messwerte: getBrightness=80 -> none, screen "Day" -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be `mbot.showText("Night")`. -lösung: vb-java-tageszeit-loesung.visustruct -::: - -## The order matters - -Ludwig rebuilt the parking aid and swapped the questions: - -```java -if (mbot.getDistance() < 30) { - mbot.showText("Slow"); -} else if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} -``` - -At 5 cm his mBot2 shows **Slow** instead of **Stop**. That is because 5 is also less than 30. The first condition is already true, so the second one is never checked. **Stop** never appears. - -> Remember: with `<`, check the smallest value first, then the next bigger one. - -::: spiel frage -titel: Game: what does the parking aid show? -intro: Ludwig's parking aid from above: under 10 cm **Stop**, under 30 cm **Slow**, otherwise **Free**. What does it show? Six rounds. -frage: What does the parking aid show? -antworten: Stop | Slow | Free - -runde: -frage: The distance is **5 cm**. -richtig: Stop -> 5 is less than 10. The very first question is true. - -runde: -frage: The distance is **25 cm**. -richtig: Slow -> 25 is not less than 10, but it is less than 30. - -runde: -frage: The distance is **80 cm**. -richtig: Free -> Both questions are false, so the last no branch is left. - -runde: -frage: The distance is exactly **10 cm**. -richtig: Slow -> 10 is not less than 10. The first question is false, the second true. - -runde: -frage: The distance is exactly **30 cm**. -richtig: Free -> 30 is not less than 30. Both questions are false. - -runde: -frage: The distance is **9 cm**. -richtig: Stop -> 9 is less than 10. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a branch with three cases. → Three cases instead of two -- I can read and write `else if` in Java. → Now in Java: else if -- I can check the conditions in the right order. → The order matters -::: - -## Quiz - -::: quiz -? How many branches do you need in the structure chart for three cases? -→ Three cases instead of two -- [ ] One -- [x] Two, the second in the no branch of the first -- [ ] Three side by side -> Each branch splits into two. The second one splits the no branch again. -? What does `else if` mean in Java? -→ Now in Java: else if -- [x] Otherwise, check another condition -- [ ] Repeat the condition -- [ ] Check both conditions at the same time -> `else if` is the short way of writing an `if` inside the `else` branch. -? Ludwig checks `< 30` first and then `< 10`. What happens at 5 cm? -→ The order matters -- [ ] Stop appears. -- [x] Slow appears. -- [ ] Nothing appears. -> 5 is also less than 30. The second condition is no longer checked. -::: diff --git a/web/lessons/en/visubot/07-linie.md b/web/lessons/en/visubot/07-linie.md deleted file mode 100644 index 1518879f..00000000 --- a/web/lessons/en/visubot/07-linie.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -titel: The line sensor -bereich: Sensors and decisions -kurz: Detect dark lines on the floor and don't fall off the table. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the number from `mbot.getLine()` means -- drive up to a line -- count steps with a variable in Java -::: - -## Four probes under the nose - -::: mbot2 -focus: lineSensor -view: bottom -::: - -The [line sensor]{part=lineSensor} has four probes side by side. Each one shines light on the floor and measures how much comes back. Black swallows the light, white reflects it. - -| Sensor | Text | Value | -|---|---|---| -| Line | `mbot.getLine()` | `0` = all bright, greater than `0` = at least one probe sees black | - -To start with, this is all you need: **`mbot.getLine() == 0` means “no line”**, `mbot.getLine() != 0` means “line found”. - -::: angeberwissen -`mbot.getLine()` is really a binary number with four digits, one for each probe: `1111` (that is 15) means “all four see black”, `0110` (6) “only the middle two”. With that an mBot2 can even follow a line. -::: - -## Turn round at the edge in the structure chart - -Imagine a table with black tape along the edge. The mBot2 should drive forward until it sees the tape and then turn round so it doesn't fall off. - -::: übung vb-rand -titel: Turn round at the edge -auftrag: The mBot2 drives forward as long as `mbot.getLine() == 0`. Then it turns 180°. There are two worlds with different distances. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Line** onto it. Write `== 0` after it. **move forward** goes inside the loop. -tipp: After the loop (below it, not inside) is `mbot.turnRight(180)`. -lösung: vb-rand-loesung.visustruct -::: - -## Now in Java: there and back - -Now the mBot2 should drive exactly back to the start after turning round. To do that it counts with a **variable** how often it drove forward. - -```java -int steps = 0; -while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; -} -``` - -::: übung vb-java-rand -titel: To the line and back -code: java -auftrag: Write in Java: the mBot2 drives to the line and counts its steps. Then it turns 180° and uses a for loop to drive the same number of steps back. -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -braucht: whileSchleife, forSchleife -tipp: After the while loop: `mbot.turnRight(180);` and then `for (int i = 0; i < steps; i++) { … }`. -tipp: The for loop only contains `mbot.forward();`. -lösung: vb-java-rand-loesung.visustruct -::: - -::: übung vb-fehler-07-linie -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To the line and back", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-07-linie-start.visustruct -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `steps = steps + 1`. -lösung: vb-java-rand-loesung.visustruct -::: - -## Game: Line or no line? - -::: spiel frage -titel: Game: Line or no line? -intro: Where is the mBot2 standing, and is the condition true or false? Six rounds. -antworten: true | false - -runde: - mbot.getLine() == 0 -frage: The mBot2 is standing on white paper. Is the condition true? -richtig: true -> No sensor sees black, so `mbot.getLine()` gives 0. - -runde: - mbot.getLine() == 0 -frage: The two middle sensors are on the black tape. Is the condition true? -richtig: false -> Two sensors see black, so `mbot.getLine()` is greater than 0. - -runde: - mbot.getLine() != 0 -frage: Only the outer left sensor sees black. Is the condition true? -richtig: true -> One sensor is enough, then the value is no longer 0. - -runde: - mbot.getLine() != 0 -frage: The mBot2 is standing on a white floor. Is the condition true? -richtig: false -> On white the value is 0, and `0 != 0` is false. - -runde: - mbot.getLine() == 15 -frage: A cross line: all four sensors see black. Is the condition true? -richtig: true -> All four sensors give the binary number `1111`, which is 15. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; - } -frage: The line is 30 cm away, each drive is 10 cm long. Is `steps == 3` afterwards? -richtig: true -> After three drives it is on the line, and the loop stops. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getLine() != 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Should drive to the black edge and then turn round. -fehler: 1 -besser: while (mbot.getLine() == 0) { -> It should drive as long as there is **no** line, so `== 0`. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(); -frage: Should drive to the black edge and then turn round. -fehler: 4 -besser: mbot.turnRight(180); -> Turning round means 180°. Without a number it only turns 90°. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps - 1; - } -frage: Should drive to the line and count the steps. -fehler: 4 -besser: steps = steps + 1; -> Counting means adding one, not taking one away. - -runde: - int steps = "0"; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; - } -frage: Should drive to the line and count the steps. -fehler: 1 -besser: int steps = 0; -> In quotation marks, the 0 is a text. Only a number fits into an `int`. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Black is tape. Tap the field where the mBot2 is at the end. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ..=.. | ..... | ..... | ..^.. -ziel: 2,1 -> It drives until it is standing on the black field. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } - mbot.turnRight(180); - mbot.forward(60); -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> To the edge, turn round and two fields back. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(30); - steps = steps + 1; - } - mbot.turnRight(180); - for (int i = 0; i < steps; i++) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..^.. -ziel: 2,3 -> It counts three steps to the line and drives exactly three back: at the start again. - -runde: - mbot.turnRight(); - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ^...= | ..... -ziel: 4,1 -> First turn right, then on to the black field on the far right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the number from `mbot.getLine()` means. → Four probes under the nose -- I can drive up to a line. → Turn round at the edge in the structure chart -- I can count steps with a variable in Java. → Now in Java: there and back -::: - -## Quiz - -::: quiz -? The mBot2 is on white paper. What does `mbot.getLine()` give? -→ Four probes under the nose -- [x] 0 -- [ ] 15 -- [ ] 1 -> No probe sees black, so 0. -? Which condition means “line found”? -→ Turn round at the edge in the structure chart -- [ ] `mbot.getLine() == 0` -- [x] `mbot.getLine() != 0` -- [ ] `mbot.getLine() < 0` -> `!=` means “not equal”. -::: diff --git a/web/lessons/en/visubot/07-und-oder.md b/web/lessons/en/visubot/07-und-oder.md deleted file mode 100644 index 64925a18..00000000 --- a/web/lessons/en/visubot/07-und-oder.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -titel: And, or, not -bereich: Sensors and decisions -kurz: Check two sensors in one condition: and, or, not. ---- - -## Skills I will gain now - -::: kompetenzen -- combine two conditions with `&&` (and) -- combine two conditions with `||` (or) -- turn a condition around with `!` (not) -- write a combined condition in a Java loop -::: - -## Wall and line: and - -The mBot2 should only drive forward if the way ahead is clear **and** there is no line under it. Two sensors, one condition. In Java, **and** is written `&&`: - -```java -mbot.getDistance() > 15 && mbot.getLine() == 0 -``` - -The whole condition is only true if **both** parts are true: - -| clear ahead? | no line? | clear `&&` no line | -|---|---|---| -| true | true | **true** | -| true | false | false | -| false | true | false | -| false | false | false | - -A table like this is called a **truth table**. - -::: übung vb-und -titel: Clear and no line -auftrag: Build a structogram with a branch: if the distance is greater than 15 **and** `mbot.getLine() == 0`, the mBot2 drives forward. Otherwise it does nothing. -messwerte: getDistance=50, getLine=0 -> forward -messwerte: getDistance=10, getLine=0 -> none -messwerte: getDistance=50, getLine=6 -> none -braucht: verzweigung -tipp: Drag the **distance** sensor onto the branch and write `> 15` after it. Then type ` && ` and the second part `mbot.getLine() == 0`. -tipp: The true branch contains **drive forward**, the false branch stays empty. -lösung: vb-und-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance and the line to different values. Only if both fit may the mBot2 drive. - -## Button A or button B: or - -Now the mBot2 should beep when you press button A **or** button B. It is enough if one of them is pressed. In Java, **or** is written `||`. - -| Button A? | Button B? | A or B | -|---|---|---| -| true | true | **true** | -| true | false | **true** | -| false | true | **true** | -| false | false | false | - -::: übung vb-oder -titel: Button A or B -auftrag: Build a structogram: if button A **or** button B is pressed, the mBot2 plays a tone. Otherwise it does nothing. -messwerte: isButtonA=true, isButtonB=false -> tone -messwerte: isButtonA=false, isButtonB=true -> tone -messwerte: isButtonA=false, isButtonB=false -> noTone -braucht: verzweigung -tipp: The condition of the branch is `mbot.isButtonA() || mbot.isButtonB()`. -tipp: The true branch contains `mbot.playTone(440, 300)`, the false branch stays empty. -lösung: vb-oder-loesung.visustruct -::: - -## Not: the opposite - -Sometimes you want the opposite of a condition. That is what `!` is for, read as **not**. `mbot.isButtonA()` is true when button A is pressed. `!mbot.isButtonA()` is true when it is **not** pressed. - -```java -while (!mbot.isButtonA()) { - mbot.pause(100); -} -mbot.forward(30); -``` - -The mBot2 waits as long as button A is not pressed. Then it drives off. - -## Now in Java: drive safely - -Now everything comes together. The mBot2 drives as long as the way is clear **and** no line comes. Whatever comes first, the wall or the edge: it stops and beeps. - -::: übung vb-java-sicher-fahren -titel: Drive safely -code: java -auftrag: Write in Java: the mBot2 drives forward as long as the distance is greater than 15 **and** `mbot.getLine() == 0`. Then it plays a tone. In two worlds a wall is waiting, in two worlds a black edge. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -braucht: whileSchleife -tipp: `while (mbot.getDistance() > 15 && mbot.getLine() == 0) { … }` -tipp: Inside the loop is `mbot.forward();`, after the loop `mbot.playTone(440, 300);`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Combining conditions"](?visustruct&lektion=09-bedingungen-verknuepfen). It opens in a new window. - -::: übung vb-fehler-07-und-oder -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Drive safely", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-07-und-oder-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.playTone(440, 300)`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -## Game: True or false? - -::: spiel frage -titel: Game: True or false? -intro: Ludwig puts the mBot2 into a situation. Is the condition true or false? Eight rounds. -antworten: true | false - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: The wall is 50 cm away, there is no line underneath. -richtig: true -> Both parts are true, so the whole thing is true. - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: The wall is 10 cm away, there is no line underneath. -richtig: false -> With `&&`, both parts must be true. The distance part isn't. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Only button B is pressed. -richtig: true -> With `||`, one true part is enough. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: No button is pressed. -richtig: false -> Both parts are false, so `||` is false too. - -runde: - !mbot.isButtonA() -frage: Button A is pressed. -richtig: false -> `mbot.isButtonA()` is true, and the `!` turns it into false. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: The wall is 10 cm away, and it is standing on a line. -richtig: false -> No part is true, so `||` is false too. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: The wall is 50 cm away, and it is standing on a line. -richtig: true -> The first part is true, and that is enough for `||`. - -runde: - !mbot.isButtonA() && mbot.getDistance() > 15 -frage: Nobody is pressing a button, the wall is 30 cm away. -richtig: true -> A isn't pressed, so `!mbot.isButtonA()` is true. The distance part is true as well. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getDistance() > 15 || mbot.getLine() == 0) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive as long as the way ahead is clear **and** no line comes. -fehler: 1 -besser: while (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> With `||` it keeps going if only one part is true, for example over the edge. - -runde: - if (mbot.isButtonA() && mbot.isButtonB()) { - mbot.playTone(440, 300); - } -frage: Should beep when button A **or** button B is pressed. -fehler: 1 -besser: if (mbot.isButtonA() || mbot.isButtonB()) { -> "Or" is `||` in Java. With `&&` it only beeps when both are pressed. - -runde: - while (mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Should wait until button A is pressed and then set off. -fehler: 1 -besser: while (!mbot.isButtonA()) { -> Waiting means: loop as long as A is **not** pressed. The `!` is missing. - -runde: - if (mbot.getDistance() > 15 & mbot.getLine() == 0) { - mbot.forward(); - } -frage: Should drive forward if the way ahead is clear and there is no line. -fehler: 1 -besser: if (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> "And" is written with two characters: `&&`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can combine two conditions with `&&` (and). → Wall and line: and -- I can combine two conditions with `||` (or). → Button A or button B: or -- I can turn a condition around with `!` (not). → Not: the opposite -- I can write a combined condition in a Java loop. → Now in Java: drive safely -::: - -## Quiz - -::: quiz -? The distance is 50 and `mbot.getLine()` gives 6. Does the mBot2 drive in "Clear and no line"? -→ Wall and line: and -- [ ] Yes, the way ahead is clear. -- [x] No, because with `&&` both parts must be true. -- [ ] Only half as far. -> It is standing on a line. So one part is false, and so is the whole condition. -? Only button B is pressed. Is `mbot.isButtonA() || mbot.isButtonB()` true? -→ Button A or button B: or -- [x] Yes -- [ ] No -> With `||` it is enough if one part is true. -? Button A is pressed. What is `!mbot.isButtonA()`? -→ Not: the opposite -- [ ] true -- [x] false -> `!` turns the value around: true becomes false. -? Which condition stops the mBot2 at the wall **and** at the edge? -→ Now in Java: drive safely -- [x] `while (mbot.getDistance() > 15 && mbot.getLine() == 0)` -- [ ] `while (mbot.getDistance() > 15 || mbot.getLine() == 0)` -- [ ] `while (mbot.getDistance() > 15)` -> With `||` it would keep driving as long as just one part is true, for example over the edge. -::: diff --git a/web/lessons/en/visubot/08-farben.md b/web/lessons/en/visubot/08-farben.md deleted file mode 100644 index e975de14..00000000 --- a/web/lessons/en/visubot/08-farben.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -titel: Recognising colours -bereich: Sensors and decisions -kurz: The quad RGB sensor tells you which colour the mBot2 is standing on. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for a colour with `mbot.getColor().equals(…)` -- turn a condition round with `!` -- put a branch inside a loop -::: - -## A sensor that sees colours - -::: mbot2 -focus: lineSensor -view: bottom -::: - -The [line sensor]{part=lineSensor} is really called a **quad RGB sensor**. “Quad” means four (four probes), “RGB” stands for red, green and blue. It shines these three colours on the floor and measures which colour comes back. That is how it recognises coloured fields. - -`mbot.getColor()` gives the name of the colour under the mBot2, as **text**: - -| Floor | `mbot.getColor()` | -|---|---| -| red field | `"red"` | -| green field | `"green"` | -| blue field | `"blue"` | -| yellow field | `"yellow"` | -| black field or line | `"black"` | -| light floor | `"white"` | - -You ask whether it is a certain colour with `.equals(…)`: `mbot.getColor().equals("red")` is **true** when the mBot2 stands on red, otherwise **false**. So it is already a complete condition. - -> In Java you always compare texts with `.equals(…)`, **not** with `==`. The `==` looks right but often doesn't work with texts. - -> With a `!` in front you turn a condition round: `!mbot.getColor().equals("red")` means “**not** red”. - -## Drive to red in the structure chart - -::: übung vb-bis-rot -titel: Drive to red -auftrag: The mBot2 drives forward as long as it is **not** on a red field. In the second world there is a green field first, which should not bother it. -welt: farbe-1 -> forward 20 -welt: farbe-2 -> forward 50 -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Colour is red?** onto it. Write a `!` in front of `mbot.getColor().equals("red")`. -tipp: The condition is `!mbot.getColor().equals("red")`, inside the loop is **move forward**. -lösung: vb-bis-rot-loesung.visustruct -::: - -## Now in Java: beep on green - -Now you combine a loop with a branch: the mBot2 drives to blue. If it passes over a green field on the way, it beeps. - -::: übung vb-java-blau-gruen -titel: To blue, beep on green -code: java -auftrag: Write in Java: the mBot2 drives forward as long as it is not on blue. After each step it checks: if it is on green, it plays a tone. In the second world there is no green field, so it must not beep there. -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -braucht: whileSchleife, verzweigung -tipp: Outside is `while (!mbot.getColor().equals("blue")) { … }`. Inside, first `mbot.forward();`. -tipp: After that, still inside the loop: `if (mbot.getColor().equals("green")) { mbot.playTone(880, 200); }`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -::: übung vb-fehler-08-farben -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To blue, beep on green", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-08-farben-start.visustruct -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be `equals("green")`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should do and tap the wrong line before time runs out. Five rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getColor().equals("red")) { - mbot.forward(); - } -frage: Should drive forward until it is standing on red. -fehler: 1 -besser: while (!mbot.getColor().equals("red")) { -> It should drive as long as it is **not** on red. The `!` is missing. - -runde: - if (mbot.getColor() == "green") { - mbot.playTone(440, 300); - } -frage: Should beep when it is standing on green. -fehler: 1 -besser: if (mbot.getColor().equals("green")) { -> You compare texts with `.equals(…)`, not with `==`. - -runde: - while (!mbot.getColor().equals("blue")) { - mbot.forward(); - if (mbot.getColor().equals("green")) { - mbot.turnRight(); - } - } -frage: Should drive to blue and beep on green. -fehler: 4 -besser: mbot.playTone(440, 300); -> On green it should beep, not turn. - -runde: - if (mbot.getColor().equals(red)) { - mbot.turnRight(); - } -frage: Should turn right on red. -fehler: 1 -besser: if (mbot.getColor().equals("red")) { -> Without quotation marks, Java looks for a variable called `red`. The colour name is a text. - -runde: - while (!mbot.getColor().equals("red")) { - mbot.forward(); - } - mbot.playTone(440, 300) -frage: Should drive to red and then beep. -fehler: 4 -besser: mbot.playTone(440, 300); -> The semicolon at the end of the statement is missing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for a colour with `mbot.getColor().equals(…)`. → A sensor that sees colours -- I can turn a condition round with `!`. → Drive to red in the structure chart -- I can put a branch inside a loop. → Now in Java: beep on green -::: - -## Quiz - -::: quiz -? The mBot2 is on a red field. What is `!mbot.getColor().equals("red")`? -→ Drive to red in the structure chart -- [ ] true -- [x] false -> `mbot.getColor().equals("red")` is true, the `!` turns it into false. So the loop stops. -? How do you compare the colour with `"green"`? -→ A sensor that sees colours -- [x] `mbot.getColor().equals("green")` -- [ ] `mbot.getColor() == "green"` -- [ ] `mbot.getColor() = "green"` -> `mbot.getColor()` gives a text, and texts are compared with `.equals(…)`. A single `=` is an assignment, not a comparison at all. -::: diff --git a/web/lessons/en/visubot/08-groesster-wert.md b/web/lessons/en/visubot/08-groesster-wert.md deleted file mode 100644 index 11506f2e..00000000 --- a/web/lessons/en/visubot/08-groesster-wert.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -titel: The biggest value -bereich: Sensors and decisions -kurz: Measure all around and remember the biggest value: where is the most space? ---- - -## Skills I will gain now - -::: kompetenzen -- remember the biggest value so far in a variable -- compare every new reading with the biggest so far in a loop -- find out with the mBot2 in which direction there is the most space -::: - -## Remembering the record - -In the long jump there is a board showing the **record**. After every jump the referee checks: is the new jump longer than the record? Then it goes on the board. Otherwise the old record stays. - -A program finds the biggest value in exactly the same way. The board is a variable `max`: - -1. **Before** the loop: `int max = 0`. Nothing is on the board yet. -2. **Inside** the loop: is the new value bigger than `max`? Then `max = value`. -3. **After** the loop, `max` holds the biggest value. - -The mBot2 turns four times and measures the distance each time. This is how it looks in a desk check: - -| Direction | measured | bigger than `max`? | `max` afterwards | -|---|---|---|---| -| before | | | 0 | -| ahead | 16 | yes | 16 | -| right | 36 | yes | 36 | -| behind | 6 | no | 36 | -| left | 26 | no | 36 | - -> Important: the branch only has a yes branch. If the value is not bigger, nothing happens. The old record stays. - -## Where is the most space? - -::: übung vb-meister-platz -titel: Where is the most space? -auftrag: Build a structure chart: create `int max = 0`. The mBot2 measures the distance four times and turns right after each one. If a distance is bigger than `max`, it remembers it in `max`. At the end it shows, for example, **Farthest: 36 cm**. There are two worlds. -welt: platz-1 -> screen "Farthest: 36 cm" -welt: platz-2 -> screen "Farthest: 46 cm" -braucht: forSchleife, verzweigung -tipp: The for loop runs four times. It contains three boxes: `int distance = mbot.getDistance()`, a branch and **turn right**. -tipp: The branch checks `distance > max`. The yes branch has `max = distance`, the no branch stays empty. After the loop: `mbot.showText("Farthest: " + max + " cm")`. -lösung: vb-meister-platz-loesung.visustruct -::: - -::: angeberwissen -Many robot vacuums have a small tower with a laser on top. It spins and measures the distances all around. That way the robot draws a map of the home. Nobody measures anything at my place. I just eat my way through. -::: - -## Now in Java: remembering the direction - -Now the mBot2 knows **how much** space there is at most. But **where**? For that it also remembers the direction in a second variable. The counter variable `i` tells you which measurement it was: 0 is ahead, 1 is right, 2 is behind and 3 is left. - -```java -if (distance > max) { - max = distance; - direction = i; -} -``` - -Both lines are in the yes branch. The direction only changes when there is a new record. - -::: übung vb-java-richtung -titel: Remembering the direction -code: java -auftrag: Write "Where is the most space?" in Java. Also remember in `int direction = 0` the number of the measurement with the biggest distance. At the end show, for example, **Direction: 1**. -welt: platz-1 -> screen "Direction: 1" -welt: platz-2 -> screen "Direction: 0" -braucht: forSchleife, verzweigung -tipp: Before the loop are `int max = 0;` and `int direction = 0;`. Inside the loop: `int distance = mbot.getDistance();`, the branch and `mbot.turnRight();`. -tipp: The yes branch has `max = distance;` and `direction = i;`. After the loop: `mbot.showText("Direction: " + direction);` -lösung: vb-java-richtung-loesung.visustruct -::: - -::: übung vb-fehler-08-groesster-wert -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Remembering the direction", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-08-groesster-wert-start.visustruct -welt: platz-1 -> screen "Direction: 1" -welt: platz-2 -> screen "Direction: 0" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `direction = i`. -lösung: vb-java-richtung-loesung.visustruct -::: - -## Game: new record? - -::: spiel frage -titel: Game: new record? -intro: The mBot2 measures several distances one after the other. What is in `max` at the end? Five rounds. - -runde: -frage: Measured: 20, 50, 30 -- 30 -- [x] 50 -- 100 -> 50 is the biggest value. The 30 after it is not a new record. - -runde: -frage: Measured: 10, 20, 30, 40 -- 10 -- [x] 40 -- 100 -> Every value is a new record. At the end the last one is there. - -runde: -frage: Measured: 90, 10, 20, 30 -- 30 -- [x] 90 -- 10 -> The record comes right at the start. After that no value is bigger. - -runde: -frage: Measured: 15, 15, 15 -- 45 -- 0 -- [x] 15 -> 15 is not bigger than 15. `max` stays 15. - -runde: -frage: Measured: 25, 60, 60, 5. In which direction (`i`) is the record? -- 0 -- [x] 1 -- 2 -> At `i = 1` the 60 comes. The second 60 is not **bigger**, so `direction` stays at 1. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can remember the biggest value so far in a variable. → Remembering the record -- I can compare every new reading with the biggest so far in a loop. → Where is the most space? -- I can find out with the mBot2 in which direction there is the most space. → Now in Java: remembering the direction -::: - -## Quiz - -::: quiz -? What does `max` start with before the loop? -→ Remembering the record -- [x] With 0, because nothing has been measured yet -- [ ] With the biggest value -- [ ] With 100 -> Every distance is bigger than 0, so the very first reading becomes the record. -? What is in the no branch of the branch `distance > max`? -→ Remembering the record -- [ ] `max = 0` -- [ ] `max = distance` -- [x] Nothing, the old record stays. -? When does `direction` change? -→ Now in Java: remembering the direction -- [ ] In every pass -- [x] Only when there is a new record -- [ ] Only in the last round -::: diff --git a/web/lessons/en/visubot/09-fallauswahl-mbot2.md b/web/lessons/en/visubot/09-fallauswahl-mbot2.md deleted file mode 100644 index 68a002f4..00000000 --- a/web/lessons/en/visubot/09-fallauswahl-mbot2.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -titel: Case selection with colours -bereich: Sensors and decisions -kurz: Do something different for each colour or line, with one case selection instead of many branches. ---- - -## Skills I will gain now - -::: kompetenzen -- build a case selection with texts -- write a case selection with numbers in Java -- show a different text on the screen depending on a number -::: - -## Many colours, many cases - -The mBot2 should react differently to each colour: turn right on red, drive forward a bit on green, beep on blue. With branches you would need three inside each other. A **case selection** is clearer, in Java `switch`: - -```java -switch (mbot.getColor()) { - case "red" -> { - mbot.turnRight(); - } - case "green" -> { - mbot.forward(20); - } - default -> { - mbot.forward(10); - } -} -``` - -- The value being checked goes in the brackets at the top, here the colour. -- Each `case` is one **case**. If the value matches, exactly this case runs. -- `default` is the case for **everything else**. - -In the structogram the case selection is a box with several columns, one for each case. - -::: übung vb-farbweiche -titel: Colour switch -auftrag: Build a case selection on `mbot.getColor()`. For `"red"` the mBot2 turns right. For `"green"` it drives forward 20 cm. For `"blue"` it plays a tone of 880 hertz for 200 milliseconds. In all other cases it drives forward 10 cm. -messwerte: getColor=red -> turnRight -messwerte: getColor=green -> forward 20 -messwerte: getColor=blue -> none, tone -messwerte: getColor=white -> forward 10 -braucht: fallauswahl -tipp: Drag a case selection into the structogram. At the top goes `mbot.getColor()`, the cases are `"red"`, `"green"` and `"blue"`, plus the case for everything else. -tipp: For red `mbot.turnRight()`, for green `mbot.forward(20)`, for blue `mbot.playTone(880, 200)`, otherwise `mbot.forward(10)`. -lösung: vb-farbweiche-loesung.visustruct -::: - -## Now in Java: line patterns - -A number can also be the value of a case selection. `mbot.getLine()` from lesson 7 gives for example: - -| Value | Meaning | -|---|---| -| `0` | no line | -| `6` | the two middle sensors see the line: it is right on it | -| `15` | all four see black: a cross line | - -For numbers you write the case without quotation marks: `case 6 -> { … }`. - -::: übung vb-linienmuster -titel: Line patterns -code: java -auftrag: Write a case selection on `mbot.getLine()` in Java. For 6 the mBot2 drives forward 10 cm. For 0 it turns right. For 15 it shows **Cross line!** on its screen. In all other cases it drives forward 5 cm. -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Cross line!" -messwerte: getLine=4 -> forward 5 -braucht: fallauswahl -tipp: `switch (mbot.getLine()) { case 6 -> { … } case 0 -> { … } case 15 -> { … } default -> { … } }` -tipp: For 6 `mbot.forward(10);`, for 0 `mbot.turnRight();`, for 15 `mbot.showText("Cross line!");`, otherwise `mbot.forward(5);`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Now in Java: start signal - -Before a race the mBot2 shows three texts one after the other and then drives off. A for loop counts the rounds 1, 2 and 3. The case selection finds the right text for each round: - -```java -for (int round = 1; round <= 3; round++) { - switch (round) { - case 1 -> { mbot.showText("On your marks"); } - ... - } - mbot.pause(1000); -} -``` - -::: übung vb-startsignal -titel: Start signal -code: java -auftrag: Write in Java: a loop counts `round` from 1 to 3. In round 1 the screen shows **On your marks**, in round 2 **Get set**, otherwise **Go!**. After each text the mBot2 waits one second. After the loop it drives 50 cm forward. -befehle: showText "On your marks", pause 1000, showText "Get set", pause 1000, showText "Go!", pause 1000 -fahrt: forward 50 -braucht: fallauswahl -tipp: The loop is `for (int round = 1; round <= 3; round++) { … }`. Inside it is `switch (round) { … }` and after that `mbot.pause(1000);`. -tipp: `case 1 -> { mbot.showText("On your marks"); }`, `case 2 -> { … }` and `default -> { mbot.showText("Go!"); }`. After the loop `mbot.forward(50);`. -lösung: vb-startsignal-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Switch"](?visustruct&lektion=10-fallauswahl). It opens in a new window. - -::: übung vb-fehler-09-fallauswahl-mbot2 -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Line patterns", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-09-fallauswahl-mbot2-start.visustruct -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Cross line!" -messwerte: getLine=4 -> forward 5 -tipp: Read the error message carefully. Is the command spelled correctly? After `mbot.` the editor suggests all commands. -tipp: It should be `mbot.turnRight()`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Game: Which case runs? - -::: spiel frage -titel: Game: Which case runs? -intro: Read the switch and predict what the mBot2 does. Six rounds. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on green. What does it do? -- It turns right. -- [x] It drives forward 20 cm. -- It drives forward 10 cm. -> The case `"green"` matches, so exactly that one runs. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on yellow. What does it do? -- Nothing at all. -- It beeps. -- [x] It drives forward 10 cm. -> There is no case for yellow, so `default` runs. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on blue. What does it do? -- [x] It beeps. -- It beeps and then drives forward 10 cm. -- It turns right. -> Only the matching case runs. `default` only runs when no other case matches. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Cross line!"); } - default -> { mbot.stop(); } - } -frage: All four sensors see black. What does the mBot2 do? -- It drives forward 10 cm. -- [x] It shows **Cross line!** -- It stops. -> Four sensors on black give 15. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Cross line!"); } - default -> { mbot.stop(); } - } -frage: Everything under the mBot2 is white. What does it do? -- It drives forward 10 cm. -- [x] It turns right. -- It stops. -> No sensor sees black, so `mbot.getLine()` gives 0. - -runde: - for (int round = 1; round <= 3; round++) { - switch (round) { - case 1 -> { mbot.showText("On your marks"); } - case 2 -> { mbot.showText("Get set"); } - default -> { mbot.showText("Go!"); } - } - } -frage: What does the screen show in round 3? -- Get set -- [x] Go! -- On your marks -> There is no case of its own for 3, so `default` runs. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a case selection with texts. → Many colours, many cases -- I can write a case selection with numbers in Java. → Now in Java: line patterns -- I can show a different text on the screen depending on a number. → Now in Java: start signal -::: - -## Quiz - -::: quiz -? The mBot2 is on yellow. Which case of the colour switch runs? -→ Many colours, many cases -- [ ] the case `"red"` -- [ ] none at all -- [x] `default` -> There is no case of its own for yellow. So the case for everything else runs. -? How do you write the case for the number 6? -→ Now in Java: line patterns -- [x] `case 6 -> { … }` -- [ ] `case "6" -> { … }` -- [ ] `if 6 -> { … }` -> Numbers have no quotation marks, texts like `"red"` do. -::: diff --git a/web/lessons/en/visubot/10-tasten-joystick.md b/web/lessons/en/visubot/10-tasten-joystick.md deleted file mode 100644 index 18ec5955..00000000 --- a/web/lessons/en/visubot/10-tasten-joystick.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -titel: Buttons and joystick -bereich: Sensors and decisions -kurz: The mBot2 waits for you and can be remote controlled. ---- - -## Skills I will gain now - -::: kompetenzen -- ask the sensors for buttons and joystick -- wait for a button -- steer the mBot2 with the joystick -::: - -## Pressing as a sensor - -::: mbot2 -focus: joystick, buttons -view: top -::: - -On the CyberPi there are two [buttons]{part=buttons} (A and B) and a [joystick]{part=joystick}. For your program these are sensors: they give **true** as long as you press them. - -| Sensor | Text | -|---|---| -| Button A / B pressed? | `mbot.isButtonA()`, `mbot.isButtonB()` | -| Joystick up / down | `mbot.isJoystickUp()`, `mbot.isJoystickDown()` | -| Joystick left / right | `mbot.isJoystickLeft()`, `mbot.isJoystickRight()` | - -> Without a real mBot2, open **🎛 Try the sensors** below the world in the [simulation](#zeige-simulation). There you find the buttons A, B and the arrows for the joystick. A click keeps them pressed for one second. - -## Waiting for button A in the structure chart - -A robot should not drive off as soon as the program starts. Better: it waits until you press A. - -Waiting means: a loop that runs as long as A is **not** pressed. So that it is not completely empty, the mBot2 waits briefly inside with **wait a moment** (`mbot.pause(100)`, that is 100 milliseconds). - -::: übung vb-start-a -titel: Start with button A -auftrag: The mBot2 waits until button A is pressed. Then it drives forward 30 cm. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: A while loop with the condition `!mbot.isButtonA()`. Inside is **wait a moment**. -tipp: After the loop is `mbot.forward(30)`. -lösung: vb-start-a-loesung.visustruct -::: - -> When checking, button A is not pressed for a while and then pressed. If your mBot2 drives off too early, it shows. - -## Now in Java: remote control - -With the joystick you steer the mBot2. The program asks the joystick five times in a row: up means drive forward, down means drive back. - -::: übung vb-java-joystick -titel: Remote control -code: java -auftrag: Write a for loop in Java that runs five times. Inside: if the joystick is up, the mBot2 drives forward. Otherwise: if it is down, it drives back. -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -braucht: forSchleife, verzweigung -tipp: `for (int i = 0; i < 5; i++) { … }` and inside `if (mbot.isJoystickUp()) { … } else { … }`. -tipp: The `else` contains another branch: `if (mbot.isJoystickDown()) { mbot.backward(); }`. -lösung: vb-java-joystick-loesung.visustruct -::: - -::: übung vb-fehler-10-tasten-joystick -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Remote control", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-10-tasten-joystick-start.visustruct -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.backward()`. -lösung: vb-java-joystick-loesung.visustruct -::: - -## Game: What does the mBot2 do? - -::: spiel frage -titel: Game: What does the mBot2 do? -intro: You press a button or the joystick. What does the mBot2 do? Six rounds. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Nobody presses a button. What does the mBot2 do? -- It drives forward 30 cm. -- [x] It keeps waiting. -- It beeps. -> As long as A isn't pressed, it stays in the waiting loop. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: You press button B. What does the mBot2 do? -- It drives forward 30 cm. -- [x] It keeps waiting. -- It drives back 30 cm. -> The loop only asks about button A. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: You press button A. What does the mBot2 do? -- [x] It drives forward 30 cm. -- It keeps waiting. -- It waits 100 ms and then stops. -> Now `!mbot.isButtonA()` is false, the loop ends, and it sets off. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: You push the joystick down. What does the mBot2 do? -- It drives forward. -- [x] It drives back. -- Nothing at all. -> The first condition is false, the second is true. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: You push the joystick to the left. What does the mBot2 do? -- It turns left. -- It drives back. -- [x] Nothing at all. -> There is no branch for left. Both conditions are false. - -runde: -frage: You hold button A down. What does `mbot.isButtonA()` give? -- [x] true -- false -- 1 -> Buttons give true or false, and pressed means true. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask the sensors for buttons and joystick. → Pressing as a sensor -- I can wait for a button. → Waiting for button A in the structure chart -- I can steer the mBot2 with the joystick. → Now in Java: remote control -::: - -## Quiz - -::: quiz -? What does `mbot.isButtonB()` give when nobody presses it? -→ Pressing as a sensor -- [ ] 0 -- [x] false -- [ ] B -> Buttons give true or false. -? Why is there **wait a moment** in the waiting loop? -→ Waiting for button A in the structure chart -- [x] So the loop is not empty and the CyberPi doesn't race round in circles for nothing. -- [ ] So the button glows longer. -- [ ] Without a pause the mBot2 drives backwards. -> The loop checks every 100 milliseconds, that is plenty. -::: diff --git a/web/lessons/en/visubot/10-unterbrechen-mit-break.md b/web/lessons/en/visubot/10-unterbrechen-mit-break.md deleted file mode 100644 index 7b445db0..00000000 --- a/web/lessons/en/visubot/10-unterbrechen-mit-break.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -titel: Emergency brake with break -bereich: Sensors and decisions -kurz: An endless loop with a Break: the mBot2 keeps driving until the emergency brake kicks in. ---- - -## Skills I will gain now - -::: kompetenzen -- end an endless loop with a Break -- explain why the Break sits inside a branch -- write a loop with `while (true)` and `break` in Java -::: - -## Endless loop with a Break - -Many robot programs run "forever": the mBot2 drives, measures, drives, measures … That is what the **endless loop** is for. It has no condition and never stops by itself. - -So that the mBot2 can still stop, you need an **emergency brake**: the **Break**. It leaves the loop it is in straight away. The program carries on with the first box **after** the loop. You recognise it by the point on its left edge. In the box you write a short comment, for example `leave the loop`. - -A Break almost always sits inside a **branch**. Otherwise the loop would end in the very first pass. - -::: übung vb-notbremse -titel: Emergency brake at the wall -auftrag: Build an endless loop. Inside it a branch checks: if the distance is less than 15 cm, there is a Break. After that (below the branch, still inside the loop) the mBot2 drives forward. After the loop it plays a tone. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -braucht: endlosschleife, aussprung -tipp: Drag the **endless loop** into the structogram. First a branch with `mbot.getDistance() < 15` goes into the loop, the **Break** into its true branch, the false branch stays empty. -tipp: Below the branch (inside the loop) goes **drive forward**, below the loop `mbot.playTone(440, 300)`. -lösung: vb-notbremse-loesung.visustruct -::: - -## Now in Java: stop with button A - -In Java the endless loop is `while (true)`. The Break is called `break`: - -```java -while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); -} -``` - -::: übung vb-java-taste-stopp -titel: Stop with button A -code: java -auftrag: Write in Java: the mBot2 keeps driving forward in an endless loop. When button A is pressed, it leaves the loop with `break`. Then the screen shows **Stopped**. -messwerte: isButtonA=true -> none, screen "Stopped" -messwerte: isButtonA=false/true -> drives, screen "Stopped" -braucht: endlosschleife, aussprung -tipp: `while (true) { … }` with `if (mbot.isButtonA()) { break; }` and then `mbot.forward();`. -tipp: After the loop `mbot.showText("Stopped");`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Call and break"](?visustruct&lektion=18-aufruf-und-aussprung). It opens in a new window. - -::: übung vb-fehler-10-unterbrechen-mit-break -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Stop with button A", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-10-unterbrechen-mit-break-start.visustruct -messwerte: isButtonA=true -> none, screen "Stopped" -messwerte: isButtonA=false/true -> drives, screen "Stopped" -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be `mbot.showText("Stopped")`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -## Game: Emergency brake - -::: spiel frage -titel: Game: Emergency brake -intro: When does the break kick in, and what happens afterwards? Each drive is 10 cm long. Five rounds. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: The wall starts 40 cm away. How often does it drive forward? -- 2 times -- [x] 3 times -- forever -> At 40, 30 and 20 it drives. At 10 the emergency brake kicks in. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: What happens straight after `break`? -- The loop starts again. -- It drives forward once more. -- [x] It beeps. -> `break` leaves the loop. The program carries on with the first command after it. - -runde: - while (true) { - mbot.forward(); - break; - } -frage: How often does the mBot2 drive forward? -- [x] once -- not at all -- forever -> The break isn't inside a branch. The loop ends in its first run. - -runde: - while (true) { - mbot.forward(); - } -frage: When does this loop stop? -- after 10 drives -- at the wall -- [x] never -> Without `break`, `while (true)` really is endless. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: You press button A after it has driven forward twice. How often has it driven forward? -- [x] 2 times -- 3 times -- not at all -> In the next run it notices the button and jumps out of the loop. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (true) { - if (mbot.getDistance() > 15) { - break; - } - mbot.forward(); - } -frage: Should drive forward and stop at the wall with the emergency brake. -fehler: 2 -besser: if (mbot.getDistance() < 15) { -> The emergency brake should kick in when the wall is **close**. - -runde: - while (true) { - if (mbot.isButtonB()) { - break; - } - mbot.forward(); - } - mbot.showText("Stopped"); -frage: Should drive forward until button A is pressed, then show "Stopped". -fehler: 2 -besser: if (mbot.isButtonA()) { -> The brake should be button A, not B. - -runde: - while (true) { - if (mbot.isButtonA()) { - brake; - } - mbot.forward(); - } -frage: Should drive forward until button A is pressed. -fehler: 3 -besser: break; -> The exit is called `break`, not `brake`. - -runde: - while (false) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Should drive in an endless loop until button A is pressed. -fehler: 1 -besser: while (true) { -> The endless loop is `while (true)`. With `false` it doesn't run even once. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can end an endless loop with a Break. → Endless loop with a Break -- I can explain why the Break sits inside a branch. → Endless loop with a Break -- I can write a loop with `while (true)` and `break` in Java. → Now in Java: stop with button A -::: - -## Quiz - -::: quiz -? Where does the program carry on after a Break? -→ Endless loop with a Break -- [ ] at the start of the loop -- [x] at the first box after the loop -- [ ] at the very start of the program -> The Break leaves the loop straight away. -? Why does the Break sit inside a branch? -→ Endless loop with a Break -- [x] Otherwise the loop ends in the first pass. -- [ ] Otherwise the mBot2 drives backwards. -- [ ] It just looks nicer. -> The emergency brake should only kick in when the condition is true. -? What is the endless loop called in Java? -→ Now in Java: stop with button A -- [ ] `while (false)` -- [x] `while (true)` -- [ ] `for (;;) break;` -> `true` is always true, the loop only stops with `break`. -::: diff --git a/web/lessons/en/visubot/11-licht.md b/web/lessons/en/visubot/11-licht.md deleted file mode 100644 index fa3409ab..00000000 --- a/web/lessons/en/visubot/11-licht.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -titel: The light sensor -bereich: Sensors and decisions -kurz: Bright or dark? The mBot2 becomes a night light. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the brightness -- switch the LEDs with a branch -- write several commands in one branch -::: - -## How bright is it? - -::: mbot2 -focus: lightSensor -view: top -::: - -The [light sensor]{part=lightSensor} is on the CyberPi. `mbot.getBrightness()` gives a number from **0** (pitch dark) to **100** (very bright). - -| Sensor | Text | Value | -|---|---|---| -| Brightness | `mbot.getBrightness()` | 0 to 100 | - -> In the simulation you set the brightness with the slider under **🎛 Try the sensors**. With a real mBot2 you simply hold your hand over the CyberPi. - -## Night light in the structure chart - -::: übung vb-nachtlicht -titel: Night light -auftrag: If the brightness is less than 30, the LEDs glow white (`mbot.setLed(255, 255, 255)`). Otherwise the LEDs go off (`mbot.ledOff()`). -messwerte: getBrightness=10 -> ledOn -messwerte: getBrightness=80 -> ledOff -braucht: verzweigung -tipp: Drag a branch into the structure chart and the sensor **Brightness** onto it. Write `< 30` after it. -tipp: The true branch gets **LEDs on** with `mbot.setLed(255, 255, 255)`, the false branch **LEDs off**. -lösung: vb-nachtlicht-loesung.visustruct -::: - -::: angeberwissen -Street lights do the same: a light sensor notices when it gets dark and switches them on. That is why they come on earlier in winter than in summer, without anyone changing a clock. -::: - -## Now in Java: night light with sound - -::: übung vb-java-nachtlicht-ton -titel: Night light with sound -code: java -auftrag: Write the night light in Java, but with two changes: in the dark the LEDs glow yellow (`mbot.setLed(255, 200, 0)`) **and** the mBot2 plays a tone. In the light the LEDs go off, without a tone. -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -braucht: verzweigung -tipp: `if (mbot.getBrightness() < 30) { … } else { … }` -tipp: The `if` part has two lines: `mbot.setLed(255, 200, 0);` and `mbot.playTone(440, 300);`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -::: übung vb-fehler-11-licht -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Night light with sound", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-11-licht-start.visustruct -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be `mbot.setLed(255, 200, 0)`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -## Game: Lights on or off? - -::: spiel frage -titel: Game: Lights on or off? -intro: How bright is it, and what do the LEDs do? Six rounds. -antworten: LEDs on | LEDs off - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: It is almost dark, the brightness is 10. -richtig: LEDs on -> 10 is less than 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is 45. -richtig: LEDs off -> 45 is not less than 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is exactly 30. -richtig: LEDs off -> 30 is not less than 30. For "up to and including 30" you would need `<=`. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is 29. -richtig: LEDs on -> 29 is just less than 30. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: The brightness is 50. -richtig: LEDs on -> Careful, it's the other way round here: 50 is not greater than 70, so the false branch runs. The LEDs light up yellow. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: The sun is shining, the brightness is 100. -richtig: LEDs off -> 100 is greater than 70, so the true branch runs. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the brightness. → How bright is it? -- I can switch the LEDs with a branch. → Night light in the structure chart -- I can write several commands in one branch. → Now in Java: night light with sound -::: - -## Quiz - -::: quiz -? `mbot.getBrightness()` gives 45. What does the night light do? -→ Night light in the structure chart -- [ ] The LEDs glow. -- [x] The LEDs go off. -> 45 is not less than 30. -? What range do the light sensor's values have? -→ How bright is it? -- [ ] 0 to 255 -- [x] 0 to 100 -- [ ] -100 to 100 -::: diff --git a/web/lessons/en/visubot/11-merker-boolean.md b/web/lessons/en/visubot/11-merker-boolean.md deleted file mode 100644 index c6fb016f..00000000 --- a/web/lessons/en/visubot/11-merker-boolean.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -titel: A flag with boolean -bereich: Sensors and decisions -kurz: Use a variable of type boolean to remember whether something happened. ---- - -## Skills I will gain now - -::: kompetenzen -- create a variable of type `boolean` -- use a flag to remember whether something happened -- check a flag in a condition after the loop -::: - -## True or false - -A variable of type `boolean` knows only two values: `true` and `false`. You already know this from the sensors: `mbot.isButtonA()` gives you `true` or `false`. A comparison like `mbot.getDistance() < 10` is also `true` or `false` in the end. - -| Code | Meaning | -|---|---| -| `boolean dark = false` | It has not been dark yet. | -| `dark = true` | Now it has been dark. | -| `if (dark)` | Is `dark` true? | - -With `if (dark)` you don't need `== true`. The variable itself is already true or false. - -## The flag - -The mBot2 should keep watch for three seconds. It measures the brightness again and again. Afterwards it should say whether it was dark **at any point**. - -For this you use a **flag**: a `boolean` variable that starts with `false`. When it gets dark, you set it to `true`. After that nobody sets it back. So after the loop you know: was it dark even just once? - -::: übung vb-wurde-es-dunkel -titel: Did it get dark? -auftrag: Build a structure chart: create `boolean dark = false`. In a for loop, check 30 times: if the brightness is less than 20, `dark` becomes true. Wait 100 ms in every pass. Then show **It was dark** or **Always bright**. -messwerte: getBrightness=80/10/80 -> none, screen "It was dark" -messwerte: getBrightness=80 -> none, screen "Always bright" -braucht: forSchleife, verzweigung -tipp: Inside the loop is a branch with `mbot.getBrightness() < 20`. The yes branch has `dark = true`, the no branch stays empty. Then comes `mbot.pause(100)`. -tipp: After the loop comes a second branch with the condition `dark`. Yes: `mbot.showText("It was dark")`, no: `mbot.showText("Always bright")`. -lösung: vb-wurde-es-dunkel-loesung.visustruct -::: - -> When checking, it gets dark for a moment in the middle of the watch and then bright again. Does your mBot2 still show **It was dark**? - -## Now in Java: was there a clap? - -In Java the flag looks like this: - -```java -boolean loud = false; -for (int i = 0; i < 30; i++) { - if (mbot.getLoudness() > 60) { - loud = true; - } - mbot.pause(100); -} -``` - -In Java you always write `true` and `false` in lower case. - -::: übung vb-java-klatsch-merker -titel: Was there a clap? -code: java -auftrag: Write in Java: the mBot2 listens for three seconds (30 times with a 100 ms pause). If the loudness is ever greater than 60, it remembers this in `boolean loud`. Then it shows **Clap!** or **All quiet**. -messwerte: getLoudness=0/90/0 -> none, screen "Clap!" -messwerte: getLoudness=0 -> none, screen "All quiet" -braucht: forSchleife, verzweigung -tipp: Take the code above and then write `if (loud) { … } else { … }`. -tipp: The branches get `mbot.showText("Clap!");` and `mbot.showText("All quiet");`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -::: übung vb-fehler-11-merker-boolean -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Was there a clap?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-11-merker-boolean-start.visustruct -messwerte: getLoudness=0/90/0 -> none, screen "Clap!" -messwerte: getLoudness=0 -> none, screen "All quiet" -tipp: The error message names an unknown variable. How do you write true and false in Java? Java is case-sensitive. -tipp: It should be `loud = true`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -## Game: true or false? - -::: spiel frage -titel: Game: true or false? -intro: Ludwig asks what the condition comes out as. Six rounds. -frage: Is it true or false? -antworten: true | false - -runde: -frage: `mbot.getDistance() < 10`, the distance is 25 cm. -richtig: false -> 25 is not less than 10. - -runde: -frage: `mbot.isButtonA()`, and you are pressing button A right now. -richtig: true -> The sensor reports: pressed. - -runde: -frage: `boolean dark = false`. It never gets dark in the loop. What is `dark` afterwards? -richtig: false -> Nobody set the flag to `true`. - -runde: -frage: `boolean dark = false`. It gets dark once in the loop, then bright again. What is `dark` afterwards? -richtig: true -> A flag stays `true` once it has been set. - -runde: -frage: `mbot.getBrightness() > 50`, the brightness is 50. -richtig: false -> 50 is not greater than 50. - -runde: -frage: `!mbot.isButtonA()`, and you are not pressing button A. -richtig: true -> Button A is not pressed, so `false`. The `!` turns it around: `true`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a variable of type `boolean`. → True or false -- I can use a flag to remember whether something happened. → The flag -- I can check a flag in a condition after the loop. → Now in Java: was there a clap? -::: - -## Quiz - -::: quiz -? Which values can a variable of type `boolean` have? -→ True or false -- [ ] Any whole number -- [x] Only `true` and `false` -- [ ] Only 0 and 1 -? What does a flag start with? -→ The flag -- [x] With `false`, because nothing has happened yet -- [ ] With `true` -- [ ] With the first reading -> Only when the event happens does it become `true`. -? How do you check in Java whether the flag `loud` is true? -→ Now in Java: was there a clap? -- [x] `if (loud)` -- [ ] `if (loud = true)` -- [ ] `if loud` -> `loud` itself is already true or false. A single `=` would be an assignment. -::: diff --git a/web/lessons/en/visubot/12-lautstaerke.md b/web/lessons/en/visubot/12-lautstaerke.md deleted file mode 100644 index cd679d70..00000000 --- a/web/lessons/en/visubot/12-lautstaerke.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -titel: The microphone -bereich: Sensors and decisions -kurz: Clap to start, and a noise light for the classroom. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the loudness -- wait until something happens -- write a noise light in Java -::: - -## How loud is it? - -::: mbot2 -focus: microphone -view: top -::: - -The CyberPi's [microphone]{part=microphone} measures the loudness. `mbot.getLoudness()` gives **0** (silent) to **100** (very loud). A clap nearby gives about 60 to 90. - -| Sensor | Text | Value | -|---|---|---| -| Loudness | `mbot.getLoudness()` | 0 to 100 | - -## Clap to start in the structure chart - -Just like waiting for button A: a loop waits as long as it is quiet. Only then does the mBot2 drive off. - -::: übung vb-klatschen -titel: Clap to start -auftrag: The mBot2 waits as long as the loudness is less than 50. Then it drives forward 30 cm. -messwerte: getLoudness=0/80 -> forward 30 -messwerte: getLoudness=90 -> forward 30 -braucht: whileSchleife -tipp: A while loop with the condition `mbot.getLoudness() < 50`, with **wait a moment** inside. -tipp: After the loop: `mbot.forward(30)`. -lösung: vb-klatschen-loesung.visustruct -::: - -> In the simulation you push the **Loudness** slider to the right while the program is waiting. - -## Now in Java: noise light - -::: übung vb-java-laermampel -titel: Noise light -code: java -auftrag: Write in Java: if the loudness is greater than 60, the LEDs glow red. Otherwise they are off. -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -braucht: verzweigung -tipp: `if (mbot.getLoudness() > 60) { … } else { … }` -tipp: Red is `mbot.setLed(255, 0, 0);`, off is `mbot.ledOff();`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -::: angeberwissen -Loudness is really measured in **decibels** (dB). Whispering is about 30 dB, a classroom 60 to 70 dB, a pneumatic drill 100 dB. The CyberPi turns that into a simple number from 0 to 100. -::: - -::: übung vb-fehler-12-lautstaerke -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Noise light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-12-lautstaerke-start.visustruct -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.ledOff()`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -## Game: Loud or quiet? - -::: spiel frage -titel: Game: Loud or quiet? -intro: How loud is it, and what does the mBot2 do? Six rounds. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: The class is quiet, the loudness is 30. -- [x] It keeps waiting. -- It drives forward 30 cm. -> 30 is less than 50, the waiting loop keeps running. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: You clap, the loudness is 70. -- It keeps waiting. -- [x] It drives forward 30 cm. -> 70 is not less than 50. The loop ends and it sets off. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: The loudness is exactly 50. -- It keeps waiting. -- [x] It drives forward 30 cm. -> 50 is not less than 50. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: The loudness is 65. -- [x] The LEDs light up red. -- The LEDs are off. -> 65 is greater than 60: too loud. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: The loudness is exactly 60. -- The LEDs light up red. -- [x] The LEDs are off. -> 60 is not greater than 60. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Someone whispers, the loudness is 10. -- The LEDs light up red. -- [x] The LEDs are off. -> Whispering is quiet. The noise light stays off. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the loudness. → How loud is it? -- I can wait until something happens. → Clap to start in the structure chart -- I can write a noise light in Java. → Now in Java: noise light -::: - -## Quiz - -::: quiz -? The clap loop is `while (mbot.getLoudness() < 50)`. The loudness is 30. What happens? -→ Clap to start in the structure chart -- [x] The mBot2 keeps waiting. -- [ ] The mBot2 drives off. -> 30 is less than 50, the condition is true, the loop keeps running. -::: diff --git a/web/lessons/en/visubot/13-neigung.md b/web/lessons/en/visubot/13-neigung.md deleted file mode 100644 index a64c00a6..00000000 --- a/web/lessons/en/visubot/13-neigung.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -titel: The motion sensor -bereich: Sensors and decisions -kurz: Measure tilt and detect shaking. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the motion sensor measures -- join two conditions with “or” -- join several conditions with “and” -::: - -## Tilted or level? - -::: mbot2 -focus: cyberpi -spin: yes -::: - -Inside the [CyberPi]{part=cyberpi} there is a **motion sensor** (gyroscope). It measures how tilted the mBot2 is, in degrees: - -| Sensor | Text | Value | -|---|---|---| -| Tilt forward/back | `mbot.getPitch()` | nose down: positive, nose up: negative (−90 to 90) | -| Tilt sideways | `mbot.getRoll()` | positive to one side, negative to the other | -| Shaken? | `mbot.isShaken()` | `true` or `false` | - -When the mBot2 is lying flat on the table, both tilts are about **0**. - -> In the simulation there are two sliders for this under **🎛 Try the sensors** and the button **shake**. With a real mBot2 you tilt it carefully in your hand. - -## Tilt warning in the structure chart - -If the mBot2 drives up or down a ramp that is too steep, it should warn you. Too steep means: more than 20° forward **or** more than 20° back. - -::: übung vb-schraeglage -titel: Tilt warning -auftrag: If the forward/back tilt is greater than 20 **or** less than −20, the mBot2 plays a tone. Otherwise it does nothing. -messwerte: getPitch=30 -> tone -messwerte: getPitch=-30 -> tone -messwerte: getPitch=5 -> noTone -braucht: verzweigung -tipp: “or” in a condition is `||`. Drag the sensor **Tilt forward/back** onto the branch twice. -tipp: The condition is `mbot.getPitch() > 20 || mbot.getPitch() < -20`, the true branch gets **play a tone**. -lösung: vb-schraeglage-loesung.visustruct -::: - -## Now in Java: spirit level - -A spirit level shows whether something is exactly level. The mBot2 glows green when both tilts are between −5 and 5. - -::: übung vb-java-wasserwaage -titel: Spirit level -code: java -auftrag: Write in Java: if `mbot.getPitch()` and `mbot.getRoll()` are both between −5 and 5, the LEDs glow green. Otherwise they are off. -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -braucht: verzweigung -tipp: “and” is `&&`. You need four comparisons: `mbot.getPitch() > -5 && mbot.getPitch() < 5 && …` -tipp: Green is `mbot.setLed(0, 255, 0);`, the `else` has `mbot.ledOff();`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -::: übung vb-fehler-13-neigung -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Spirit level", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-13-neigung-start.visustruct -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.setLed(0, 255, 0)`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -## Game: Too steep? - -::: spiel frage -titel: Game: Too steep? -intro: Ludwig tilts the mBot2. What does it do? Six rounds. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: The nose points 30° down, `mbot.getPitch()` gives 30. -- [x] It beeps. -- It doesn't beep. -> 30 is greater than 20. One true part is enough for `||`. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: The nose points up, `mbot.getPitch()` gives −25. -- [x] It beeps. -- It doesn't beep. -> −25 is less than −20, so the second part is true. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: A gentle ramp, `mbot.getPitch()` gives 10. -- It beeps. -- [x] It doesn't beep. -> 10 is between −20 and 20. Both parts are false. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: `mbot.getPitch()` gives exactly 20. -- It beeps. -- [x] It doesn't beep. -> 20 is not greater than 20. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: `mbot.getPitch()` gives 0, `mbot.getRoll()` gives 3. -- [x] The LEDs light up green. -- The LEDs are off. -> All four parts are true. The mBot2 is almost level. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: `mbot.getPitch()` gives 2, `mbot.getRoll()` gives −8. -- The LEDs light up green. -- [x] The LEDs are off. -> −8 is not greater than −5. With `&&`, one false part makes everything false. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 6 2 CONDITION: is true or false, e.g. mbot.getDistance() < 20 -- ↓ 4 4 SENSOR: a part that measures something -- ↓ 3 10 BRANCH: does one thing or the other, depending on a condition -- ↓ 4 6 BRIGHTNESS: mbot.getBrightness() measures it -- → 11 4 BREAK: emergency brake: leaves the loop straight away -- → 13 1 ULTRASOUND: how the mBot2 measures distance: a very high sound and its echo -- ↓ 1 8 JOYSTICK: small lever on the CyberPi -- ↓ 2 2 SWITCH: one case of its own for each value -lösung: 7 4, 11 6, 10 6, 4 8, 6 9, 9 4 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the motion sensor measures. → Tilted or level? -- I can join two conditions with “or”. → Tilt warning in the structure chart -- I can join several conditions with “and”. → Now in Java: spirit level -::: - -## Quiz - -::: quiz -? The mBot2 is lying flat on the table. What does `mbot.getPitch()` give, roughly? -→ Tilted or level? -- [x] 0 -- [ ] 90 -- [ ] 100 -? What does `mbot.isShaken()` do? -→ Tilted or level? -- [ ] It shakes the mBot2. -- [x] It reports whether someone is shaking the mBot2. -> Sensors don't do anything, they only measure. -::: diff --git a/web/lessons/en/visubot/14-leds.md b/web/lessons/en/visubot/14-leds.md deleted file mode 100644 index 15121599..00000000 --- a/web/lessons/en/visubot/14-leds.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -titel: The LEDs -bereich: Light, sound and screen -kurz: Mix colours, build a traffic light and make it blink. ---- - -## Skills I will gain now - -::: kompetenzen -- mix a colour from red, green and blue -- show colours one after the other with pauses -- make the LEDs blink in Java -::: - -## Mixing red, green and blue - -::: mbot2 -focus: leds -view: back -::: - -The five [LEDs]{part=leds} are an **actuator**: they do something, they light up. Each LED mixes its colour from red, green and blue, each from 0 (off) to 255 (fully bright). - -| Command | Box | What happens | -|---|---|---| -| `mbot.setLed(255, 0, 0)` | **LEDs on** | all LEDs red | -| `mbot.ledOff()` | **LEDs off** | all LEDs off | -| `mbot.pause(1000)` | **wait a moment** | wait 1000 milliseconds (1 second) | - -| Colour | Red | Green | Blue | -|---|---|---|---| -| Red | 255 | 0 | 0 | -| Yellow | 255 | 200 | 0 | -| Green | 0 | 255 | 0 | -| Blue | 0 | 0 | 255 | -| White | 255 | 255 | 255 | -| Purple | 160 | 0 | 255 | - -> Without **wait a moment** the mBot2 switches the colours so fast that you only see the last one. In the simulation you see the colour on the LEDs of the 3D model. - -## Traffic light in the structure chart - -::: übung vb-ampel -titel: Traffic light -auftrag: The LEDs show red, yellow and green one after the other like a traffic light. Between the colours the mBot2 waits 1000 milliseconds each time. Yellow is `255, 200, 0`. -befehle: setLed 255 0 0, pause 1000, setLed 255 200 0, pause 1000, setLed 0 255 0 -tipp: Drag **LEDs on** three times and **wait a moment** twice into the structure chart, taking turns. -tipp: Change the numbers: `mbot.setLed(255, 0, 0)`, `mbot.pause(1000)`, `mbot.setLed(255, 200, 0)`, `mbot.pause(1000)`, `mbot.setLed(0, 255, 0)`. -lösung: vb-ampel-loesung.visustruct -::: - -## Now in Java: blue light - -Blinking means: on, wait, off, wait, again and again. “Again and again” is a loop. - -::: übung vb-java-blinken -titel: Blue light -code: java -auftrag: Write a for loop in Java that runs three times. Inside, the LEDs go blue, the mBot2 waits 500 milliseconds, the LEDs go off, and it waits 500 milliseconds again. -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: `for (int i = 0; i < 3; i++) { … }` -tipp: Inside the loop: `mbot.setLed(0, 0, 255);`, `mbot.pause(500);`, `mbot.ledOff();`, `mbot.pause(500);`. -lösung: vb-java-blinken-loesung.visustruct -::: - -::: übung vb-fehler-14-leds -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Blue light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-14-leds-start.visustruct -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.pause(500)`. -lösung: vb-java-blinken-loesung.visustruct -::: - -## Game: Which colour? - -::: spiel frage -titel: Game: Which colour? -intro: Red, green and blue mixed together: which colour do the LEDs show? Seven rounds. - -runde: - mbot.setLed(255, 0, 0); -frage: Which colour lights up? -- [x] red -- green -- blue -> Only the first value, red, is on. - -runde: - mbot.setLed(0, 0, 255); -frage: Which colour lights up? -- red -- green -- [x] blue -> The order is always red, green, blue. Only blue is on. - -runde: - mbot.setLed(255, 255, 255); -frage: Which colour lights up? -- yellow -- [x] white -- off -> All three colours at full brightness make white. - -runde: - mbot.setLed(255, 200, 0); -frage: Which colour lights up? -- [x] yellow -- purple -- white -> Red and green together make yellow. - -runde: - mbot.setLed(160, 0, 255); -frage: Which colour lights up? -- yellow -- [x] purple -- green -> Red and blue together make purple. - -runde: - mbot.setLed(0, 0, 0); -frage: Which colour lights up? -- white -- black -- [x] none, the LEDs are off -> All three values are 0. An LED can't shine black. - -runde: - mbot.setLed(255, 0, 0); - mbot.setLed(0, 255, 0); - mbot.pause(1000); -frage: Which colour do you see for one second? -- red -- [x] green -- first red, then green -> Without **wait a moment** between the colours, red is gone immediately. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.setLed(255, 0, 0); - mbot.pause(1000); - mbot.setLed(255, 200, 0); - mbot.pause(1000); - mbot.setLed(0, 0, 255); -frage: Should show red, yellow and green like a traffic light. -fehler: 5 -besser: mbot.setLed(0, 255, 0); -> Green is `0, 255, 0`. `0, 0, 255` is blue. - -runde: - for (int i = 0; i < 3; i++) { - mbot.setLed(0, 0, 255); - mbot.pause(500); - mbot.ledOff; - mbot.pause(500); - } -frage: Should flash blue three times. -fehler: 4 -besser: mbot.ledOff(); -> A command without a number still needs its brackets. - -runde: - mbot.setLed(0, 0, 300); - mbot.pause(1000); - mbot.ledOff(); -frage: Should shine bright blue for one second. -fehler: 1 -besser: mbot.setLed(0, 0, 255); -> Each colour only goes from 0 to 255. - -runde: - mbot.setLed(255, 255, 255); - mbot.pause(1000); - mbot.setLed(0, 0, 0, 0); -frage: Should shine white for one second and then go off. -fehler: 3 -besser: mbot.ledOff(); -> `setLed` has exactly three numbers: red, green, blue. To switch off there is `mbot.ledOff()`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can mix a colour from red, green and blue. → Mixing red, green and blue -- I can show colours one after the other with pauses. → Traffic light in the structure chart -- I can make the LEDs blink in Java. → Now in Java: blue light -::: - -## Quiz - -::: quiz -? Which colour does `mbot.setLed(0, 255, 0)` give? -→ Mixing red, green and blue -- [ ] Red -- [x] Green -- [ ] Blue -> The numbers are red, green, blue. Only green is on. -? Why does the blue light need **wait a moment**? -→ Now in Java: blue light -- [x] Otherwise it changes so fast that you can't see any blinking. -- [ ] Otherwise the LEDs break. -- [ ] Because `ledOff()` doesn't work otherwise. -::: diff --git a/web/lessons/en/visubot/15-einzelne-leds.md b/web/lessons/en/visubot/15-einzelne-leds.md deleted file mode 100644 index bd217f24..00000000 --- a/web/lessons/en/visubot/15-einzelne-leds.md +++ /dev/null @@ -1,209 +0,0 @@ ---- -titel: Single LEDs -bereich: Light, sound and screen -kurz: Each of the five LEDs gets its own colour, all the way to a running light. ---- - -## Skills I will gain now - -::: kompetenzen -- address the LEDs by their numbers 0 to 4 -- make single LEDs light up in different colours -- build a running light with a loop -::: - -## Every LED has a number - -::: mbot2 -focus: leds -view: back -::: - -So far all five [LEDs]{part=leds} showed the same colour. But you can also address each LED on its own. For that, every LED has a **number**. As with arrays, counting starts at **0**: the five LEDs are called 0, 1, 2, 3 and 4. - -| Command | Box | What happens | -|---|---|---| -| `mbot.led(0).setColor("green")` | **set LED colour** | LED 0 lights up green | -| `mbot.led(3).setColor("off")` | **set LED colour** | LED 3 goes off | - -You write the colour as a name in quotes: - -| Colour name | Colour name | Colour name | -|---|---|---| -| `"red"` | `"orange"` | `"yellow"` | -| `"green"` | `"cyan"` | `"blue"` | -| `"purple"` | `"pink"` | `"white"` | - -With `"off"` you switch an LED off. - -> The number can also be a variable: `mbot.led(i).setColor("red")`. That way a loop can switch on one LED after the other. - -## Three lights in the structogram - -::: übung vb-drei-lichter -titel: Three lights -auftrag: Switch LED 0 red, LED 2 yellow and LED 4 green. LEDs 1 and 3 stay off. -befehle: ledColor 0 "red", ledColor 2 "yellow", ledColor 4 "green" -tipp: Drag **set LED colour** into the structogram three times. -tipp: Change number and colour: `mbot.led(0).setColor("red")`, `mbot.led(2).setColor("yellow")`, `mbot.led(4).setColor("green")`. -lösung: vb-drei-lichter-loesung.visustruct -::: - -## Now in Java: running light - -In a running light, a light moves from one LED to the next. The loop variable `i` is the number of the LED. - -::: übung vb-java-lauflicht -titel: Running light -code: java -auftrag: Write a for loop in Java in which `i` runs from 0 to 4. Inside, LED `i` turns blue, the mBot2 waits 200 milliseconds, and LED `i` goes off again. -befehle: ledColor 0 "blue", pause 200, ledColor 0 "off", ledColor 1 "blue", pause 200, ledColor 1 "off", ledColor 2 "blue", pause 200, ledColor 2 "off", ledColor 3 "blue", pause 200, ledColor 3 "off", ledColor 4 "blue", pause 200, ledColor 4 "off" -braucht: forSchleife -tipp: `for (int i = 0; i < 5; i++) { … }` -tipp: Inside the loop: `mbot.led(i).setColor("blue");`, `mbot.pause(200);`, `mbot.led(i).setColor("off");`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -::: übung vb-fehler-15-einzelne-leds -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Running light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-15-einzelne-leds-start.visustruct -befehle: ledColor 0 "blue", pause 200, ledColor 0 "off", ledColor 1 "blue", pause 200, ledColor 1 "off", ledColor 2 "blue", pause 200, ledColor 2 "off", ledColor 3 "blue", pause 200, ledColor 3 "off", ledColor 4 "blue", pause 200, ledColor 4 "off" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `mbot.led(i)`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -## Game: Which LED is on? - -::: spiel frage -titel: Game: Which LED is on? -intro: Five LEDs numbered 0 to 4. Which ones light up? Six rounds. - -runde: - mbot.led(0).setColor("red"); -frage: Which LED lights up red? -- [x] the first one -- the second one -- all of them -> The numbers start at 0. LED 0 is the first one. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blue"); - } -frage: Which LEDs light up blue? -- LEDs 0 to 3 -- [x] all five -- only LED 4 -> `i` runs from 0 to 4, that is all five. - -runde: - for (int i = 0; i < 5; i = i + 2) { - mbot.led(i).setColor("green"); - } -frage: Which LEDs light up green? -- LEDs 1 and 3 -- [x] LEDs 0, 2 and 4 -- LEDs 2 and 4 -> `i` jumps in steps of two: 0, 2, 4. - -runde: - mbot.led(2).setColor("yellow"); - mbot.led(2).setColor("off"); -frage: Which LED is on at the end? -- LED 2 yellow -- [x] none -- LED 3 yellow -> LED 2 goes on and straight off again. - -runde: - for (int i = 4; i >= 0; i--) { - mbot.led(i).setColor("red"); - mbot.pause(200); - mbot.led(i).setColor("off"); - } -frage: At which LED does this running light start? -- LED 0 -- [x] LED 4 -- LED 5 -> `i` starts at 4 and counts down. The light runs the other way round. - -runde: -frage: Ludwig writes `mbot.led(5).setColor("red");`. Which LED lights up? -- the fifth one -- the sixth one -- [x] none, there is no LED 5 -> The five LEDs are numbered 0 to 4. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.led(1).setColor("red"); - mbot.led(2).setColor("yellow"); - mbot.led(4).setColor("green"); -frage: Should switch LED 0 red, LED 2 yellow and LED 4 green. -fehler: 1 -besser: mbot.led(0).setColor("red"); -> The first LED has the number 0. - -runde: - for (int i = 1; i <= 5; i++) { - mbot.led(i).setColor("blue"); - } -frage: Should switch all five LEDs blue. -fehler: 1 -besser: for (int i = 0; i < 5; i++) { -> The LEDs are numbered 0 to 4. There is no LED 5. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blue"); - mbot.pause(200); - mbot.led(0).setColor("off"); - } -frage: Running light: each LED goes blue for a moment and then off again. -fehler: 4 -besser: mbot.led(i).setColor("off"); -> The same LED `i` should go off, not always LED 0. - -runde: - mbot.led(3).setColor(red); -frage: Should switch LED 3 red. -fehler: 1 -besser: mbot.led(3).setColor("red"); -> The colour name is a text and needs quotation marks. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can address the LEDs by their numbers 0 to 4. → Every LED has a number -- I can make single LEDs light up in different colours. → Three lights in the structogram -- I can build a running light with a loop. → Now in Java: running light -::: - -## Quiz - -::: quiz -? Which number does the first LED have? -→ Every LED has a number -- [x] 0 -- [ ] 1 -- [ ] 5 -> As with arrays, you count from 0. The five LEDs have the numbers 0 to 4. -? What does `mbot.led(4).setColor("off")` do? -→ Three lights in the structogram -- [ ] All LEDs go off. -- [x] Only LED 4 goes off. -- [ ] Four LEDs go off. -::: diff --git a/web/lessons/en/visubot/16-lautsprecher.md b/web/lessons/en/visubot/16-lautsprecher.md deleted file mode 100644 index fda4d446..00000000 --- a/web/lessons/en/visubot/16-lautsprecher.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -titel: The speaker -bereich: Light, sound and screen -kurz: Tones, a scale and a siren. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the two numbers in `playTone` mean -- build a sequence of tones -- calculate with the counting variable in Java -- make the mBot2 show a feeling -::: - -## How high, how long? - -::: mbot2 -focus: cyberpi -view: top -::: - -The [CyberPi]{part=cyberpi} has a small speaker. `mbot.playTone(440, 300)` plays a tone: - -- The first number is the **pitch** in hertz (vibrations per second). The bigger, the higher. -- The second number is the **length** in milliseconds. - -| Note | C | D | E | F | G | A | B | C' | -|---|---|---|---|---|---|---|---|---| -| Hertz | 262 | 294 | 330 | 349 | 392 | 440 | 494 | 523 | - -> In the simulation you hear the tones through your computer's speakers. Feel free to turn it down a bit. - -## Scale in the structure chart - -::: übung vb-tonleiter -titel: Scale -auftrag: The mBot2 plays the notes C, D, E, F, G one after the other, each 300 milliseconds long. The hertz numbers are in the table. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -tipp: Drag **play a tone** into the structure chart five times. -tipp: The boxes are `mbot.playTone(262, 300)`, `mbot.playTone(294, 300)` and so on. -lösung: vb-tonleiter-loesung.visustruct -::: - -::: angeberwissen -The note A at 440 hertz is called **concert pitch**. Orchestras tune their instruments to it. One octave higher has exactly twice as many vibrations: 880 hertz. -::: - -## Now in Java: higher and higher - -In a for loop you can calculate with the counting variable. That way each tone is higher than the last: - -```java -mbot.playTone(i * 200, 200); -``` - -::: übung vb-java-hoeher -titel: Higher and higher -code: java -auftrag: Write a for loop in Java in which `i` counts from 1 to 5. In each round the mBot2 plays a tone with `i * 200` hertz, 200 milliseconds long. -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -braucht: forSchleife -tipp: `for (int i = 1; i <= 5; i++) { … }` -tipp: The loop only contains `mbot.playTone(i * 200, 200);`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Showing feelings - -The mBot2 can also be happy, sad or sleepy. With **show a feeling** (`mbot.emotion("smile")`) it plays a little show: the LEDs light up, it makes a sound and wiggles a bit. - -| Text | Feeling | -|---|---| -| `mbot.emotion("smile")` | laughs | -| `mbot.emotion("hello")` | says hello | -| `mbot.emotion("sad")` | is sad | -| `mbot.emotion("angry")` | is angry | -| `mbot.emotion("dizzy")` | is dizzy | -| `mbot.emotion("zzz")` | sleeps | - -> Try it with the real mBot2. The simulator only shows the command. More feelings are listed under **Reference**. - -::: übung vb-fehler-16-lautsprecher -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Higher and higher", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-16-lautsprecher-start.visustruct -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be `mbot.playTone(i * 200, 200)`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Game: From low to high - -::: spiel reihenfolge -titel: Game: From low to high -intro: Tap the answers in the right order. One wrong tap ends the round. Five rounds. - -runde: -frage: Tap the tones from low to high. -- `mbot.playTone(262, 300)` -- `mbot.playTone(330, 300)` -- `mbot.playTone(440, 300)` -- `mbot.playTone(880, 300)` -> The more hertz, the higher the tone. - -runde: -frage: Tap the tones from short to long. -- `mbot.playTone(440, 100)` -- `mbot.playTone(440, 300)` -- `mbot.playTone(440, 1000)` -- `mbot.playTone(440, 2000)` -> The second number is the length in milliseconds. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.playTone(i * 200, 200); - } -frage: Tap the tones in the order in which they sound. -- 600 hertz -- 400 hertz -- 200 hertz -> `i` counts down: 3, 2, 1. The tones get lower and lower. - -runde: -frage: Tap the tones from low to high. -- C at 262 hertz -- concert pitch A -- A one octave higher -> Concert pitch A has 440 hertz; one octave higher has twice as many: 880 hertz. - -runde: -frage: Tap the times from short to long. -- 300 milliseconds -- 1 second -- 1500 milliseconds -- 2 seconds -> 1 second is 1000 milliseconds, 2 seconds are 2000. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the two numbers in `playTone` mean. → How high, how long? -- I can build a sequence of tones. → Scale in the structure chart -- I can calculate with the counting variable in Java. → Now in Java: higher and higher -- I can make the mBot2 show a feeling. → Showing feelings -::: - -## Quiz - -::: quiz -? Which tone is higher? -→ How high, how long? -- [x] `mbot.playTone(880, 300)` -- [ ] `mbot.playTone(440, 300)` -> More hertz means higher. -? How long does `mbot.playTone(440, 1000)` sound? -→ How high, how long? -- [ ] 440 seconds -- [x] 1 second -- [ ] 1000 seconds -> 1000 milliseconds are one second. -::: diff --git a/web/lessons/en/visubot/17-arrays-melodie.md b/web/lessons/en/visubot/17-arrays-melodie.md deleted file mode 100644 index 818fe6d2..00000000 --- a/web/lessons/en/visubot/17-arrays-melodie.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -titel: Arrays and melodies -bereich: Light, sound and screen -kurz: Store many values in one array and work through them with a loop. ---- - -## Skills I will gain now - -::: kompetenzen -- create an array and play it with a loop -- use an array of texts in Java -- collect measurements in an array and work out the average -::: - -## A melody as an array - -A melody is a row of tones. Instead of five variables `tone1`, `tone2`, … you use an **array**. An array is a row of slots under **one** name: - -```java -int[] tones = {262, 294, 330, 349, 392}; -``` - -- `int[]` means: an array of whole numbers. -- The slots are numbered from **0**. `tones[0]` is 262, `tones[4]` is 392. -- `tones.length` tells you how many slots there are, here 5. - -A for loop with `i` from 0 to `tones.length - 1` reaches every slot. - -::: übung vb-melodie -titel: Melody -auftrag: Create an array `tones` with the pitches 262, 294, 330, 349 and 392. A for loop plays them one after the other, each for 300 milliseconds. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -braucht: forSchleife -tipp: `int[] tones = {262, 294, 330, 349, 392}` creates the array. -tipp: The loop runs from `i = 0` while `i < tones.length`. Inside is `mbot.playTone(tones[i], 300)`. -lösung: vb-melodie-loesung.visustruct -::: - -> If you want a different melody, you only change the array. The loop stays the same. - -## Now in Java: rainbow - -The five LEDs have the numbers 0 to 4, just like the slots of an array with five values. An array can hold texts too: `String[] colours = {"red", "yellow"};`. LED `i` then gets the colour from slot `i`: `mbot.led(i).setColor(colours[i])`. - -::: übung vb-farben -titel: Rainbow -code: java -auftrag: Write in Java: create an array `colours` with the texts `"red"`, `"yellow"`, `"green"`, `"blue"` and `"purple"`. A for loop gives every LED `i` the colour from `colours[i]`. -befehle: ledColor 0 "red", ledColor 1 "yellow", ledColor 2 "green", ledColor 3 "blue", ledColor 4 "purple" -braucht: forSchleife -tipp: `String[] colours = {"red", "yellow", "green", "blue", "purple"};` creates the array. -tipp: `for (int i = 0; i < colours.length; i++) { mbot.led(i).setColor(colours[i]); }` -lösung: vb-farben-loesung.visustruct -::: - -## Now in Java: measurement series - -Sensors never measure exactly. Hold your hand in front of the ultrasonic sensor: the number always jumps around a little. That is why professionals measure several times and work out the **average**. - -The measurements go into an array. `new int[5]` creates an array with five empty slots: - -```java -int[] values = new int[5]; -for (int i = 0; i < values.length; i++) { - values[i] = mbot.getDistance(); - mbot.pause(100); -} -``` - -Then you add up all the values. For that you need a variable that starts at 0 and grows in every pass: - -```java -int sum = 0; -for (int i = 0; i < values.length; i++) { - sum = sum + values[i]; -} -``` - -The average is the sum divided by the number of values. Write `5.0` instead of `5`, then Java calculates with decimal numbers: `double average = sum / 5.0;` - -::: übung vb-messreihe -titel: Measurement series -code: java -auftrag: Measure the distance five times into an array `int[] values = new int[5]`, with a 100 ms pause in between. Then add up all values, work out the average and show for example **Average: 40.0** on the screen. -messwerte: getDistance=40 -> screen "Average: 40.0" -messwerte: getDistance=25 -> screen "Average: 25.0" -braucht: forSchleife -tipp: Two for loops: the first fills the array with `values[i] = mbot.getDistance();`, the second calculates `sum = sum + values[i];`. -tipp: Then `double average = sum / 5.0;` and `mbot.showText("Average: " + average);`. -lösung: vb-messreihe-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Arrays"](?visustruct&lektion=15-arrays). It opens in a new window. - -::: übung vb-fehler-17-arrays-melodie -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Measurement series", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-17-arrays-melodie-start.visustruct -messwerte: getDistance=40 -> screen "Average: 40.0" -messwerte: getDistance=25 -> screen "Average: 25.0" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `sum = sum + values[i]`. -lösung: vb-messreihe-loesung.visustruct -::: - -## Game: Which slot? - -::: spiel frage -titel: Game: Which slot? -intro: Slots are counted from 0. What is where in the array? Six rounds. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is `tones[2]`? -- 294 -- [x] 330 -- 349 -> Slot 0 is 262, slot 1 is 294, slot 2 is 330. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is `tones.length`? -- 4 -- [x] 5 -- 392 -> `length` counts the slots. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is `tones[tones.length - 1]`? -- 349 -- [x] 392 -- an error -> `tones.length - 1` is 4, the last slot. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What happens with `mbot.playTone(tones[5], 300)`? -- It plays 392 hertz. -- It plays nothing and carries on. -- [x] An error: there is no slot 5. -> The slots are numbered 0 to 4. Java reports an `ArrayIndexOutOfBoundsException`. - -runde: - String[] colours = {"red", "yellow", "green", "blue", "purple"}; - for (int i = 0; i < colours.length; i++) { - mbot.led(i).setColor(colours[i]); - } -frage: Which colour does LED 3 have? -- green -- [x] blue -- purple -> LED 3 gets `colours[3]`, the fourth word. - -runde: - int[] values = {20, 22, 18, 20, 20}; - int sum = 0; - for (int i = 0; i < values.length; i++) { - sum = sum + values[i]; - } - double average = sum / 5.0; -frage: What value does `average` have? -- 18.0 -- [x] 20.0 -- 100.0 -> The sum is 100, and 100 / 5.0 is 20.0. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - int[] tones = {262, 294, 330, 349, 392}; - for (int i = 0; i <= tones.length; i++) { - mbot.playTone(tones[i], 300); - } -frage: Should play all five tones. -fehler: 2 -besser: for (int i = 0; i < tones.length; i++) { -> With `<=` the loop also tries to play `tones[5]`. That slot doesn't exist. - -runde: - int[] tones = {262, 294, 330, 349, 392}; - for (int i = 0; i < tones.length; i++) { - mbot.playTone(tones, 300); - } -frage: Should play all five tones. -fehler: 3 -besser: mbot.playTone(tones[i], 300); -> One slot is played, `tones[i]`, not the whole array. - -runde: - String[] colours = {"red", "yellow", "green", "blue", "purple"}; - for (int i = 0; i < colours.length(); i++) { - mbot.led(i).setColor(colours[i]); - } -frage: Should give each LED a colour from the array. -fehler: 2 -besser: for (int i = 0; i < colours.length; i++) { -> Arrays have `length` without brackets. Only `length()` for Strings needs brackets. - -runde: - int[] values = new int[5]; - int sum = 0; - for (int i = 0; i < values.length; i++) { - sum = values[i]; - } -frage: Should add up all the measurements. -fehler: 4 -besser: sum = sum + values[i]; -> Like this, only the last value ends up in `sum`. The new value has to be added on. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create an array and play it with a loop. → A melody as an array -- I can use an array of texts in Java. → Now in Java: rainbow -- I can collect measurements in an array and work out the average. → Now in Java: measurement series -::: - -## Quiz - -::: quiz -? What is `tones[1]` if `int[] tones = {262, 294, 330};`? -→ A melody as an array -- [ ] 262 -- [x] 294 -- [ ] 1 -> The slots count from 0. So slot 1 is the second one. -? How many slots does `{262, 294, 330}` have, so what is `tones.length`? -→ A melody as an array -- [ ] 2 -- [x] 3 -- [ ] 330 -> `length` counts the slots, here three. That is why the last slot has the number 2. -::: diff --git a/web/lessons/en/visubot/18-bildschirm.md b/web/lessons/en/visubot/18-bildschirm.md deleted file mode 100644 index e2aae904..00000000 --- a/web/lessons/en/visubot/18-bildschirm.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -titel: The screen -bereich: Light, sound and screen -kurz: Show text, numbers and sensor values on the CyberPi. ---- - -## Skills I will gain now - -::: kompetenzen -- show text on the screen -- show several texts one after the other -- show numbers and sensor values -- write a countdown in Java -::: - -## Showing text - -::: mbot2 -focus: screen -view: back -::: - -The CyberPi's colour [screen]{part=screen} is an actuator too. With **show text** you write something on it: - -```java -mbot.showText("Hello!") -``` - -The text is in quotation marks, as with `System.out.println`. A new text replaces the old one. - -> In the simulation the text appears on the screen of the 3D model and below the world after 📺. - -## Greeting in the structure chart - -::: übung vb-begruessung -titel: Greeting -auftrag: The mBot2 first shows “Hello!”, waits 1000 milliseconds and then shows “I am VisuBot”. -befehle: showText "Hello!", pause 1000, showText "I am VisuBot" -tipp: Drag **show text** twice and **wait a moment** once into the structure chart. -tipp: `mbot.showText("Hello!")`, `mbot.pause(1000)`, `mbot.showText("I am VisuBot")`. -lösung: vb-begruessung-loesung.visustruct -::: - -## Numbers and sensor values - -Instead of text you can also show numbers and variables, and with `+` you join everything together: - -```java -mbot.showText(i) -mbot.showText("Distance: " + mbot.getDistance()) -``` - -That way the mBot2 shows you what its sensors are measuring right now. - -## Now in Java: countdown - -::: übung vb-java-countdown -titel: Countdown -code: java -auftrag: Write a countdown in Java: a for loop counts `i` backwards from 3 to 1. In each round the mBot2 shows `i` and waits 1000 milliseconds. After that it shows “Go!”. -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Go!" -braucht: forSchleife -tipp: Counting backwards: `for (int i = 3; i >= 1; i--) { … }` -tipp: Inside the loop: `mbot.showText(i);` and `mbot.pause(1000);`. After the loop `mbot.showText("Go!");`. -lösung: vb-java-countdown-loesung.visustruct -::: - -::: übung vb-fehler-18-bildschirm -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Countdown", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-18-bildschirm-start.visustruct -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Go!" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `mbot.showText(i)`. -lösung: vb-java-countdown-loesung.visustruct -::: - -## Game: What's on the screen? - -::: spiel frage -titel: Game: What's on the screen? -intro: Read the code and predict what the screen shows at the end. Six rounds. - -runde: - mbot.showText("Hello!"); - mbot.pause(1000); - mbot.showText("I am VisuBot"); -frage: What is on the screen at the end? -- Hello! I am VisuBot -- [x] I am VisuBot -- Hello! -> A new text replaces the old one. - -runde: - mbot.showText("Distance: " + 25); -frage: What is on the screen? -- [x] Distance: 25 -- "Distance: " + 25 -- Distance: -> The `+` attaches the number to the text. - -runde: - int i = 3; - mbot.showText("i"); -frage: What is on the screen? -- 3 -- [x] i -- "i" -> In quotation marks, `i` is a text, not a variable. The quotation marks themselves don't appear. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.showText(i); - mbot.pause(1000); - } - mbot.showText("Start!"); -frage: Which number is shown just before "Start!"? -- 0 -- [x] 1 -- 3 -> The countdown shows 3, 2, 1. At 0, `i >= 1` is false. - -runde: - mbot.showText("Sum: " + 2 + 3); -frage: What is on the screen? -- Sum: 5 -- [x] Sum: 23 -- Sum: 2 + 3 -> Java works from left to right: first the 2 is attached to the text, then the 3. - -runde: - mbot.showText("Sum: " + (2 + 3)); -frage: What is on the screen? -- [x] Sum: 5 -- Sum: 23 -- Sum: (2 + 3) -> Java works out the brackets first. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.showText("Hello!"); - mbot.pause(1); - mbot.showText("I am VisuBot"); -frage: Should show "Hello!", wait one second and then show "I am VisuBot". -fehler: 2 -besser: mbot.pause(1000); -> `pause` counts in milliseconds. One second is 1000. - -runde: - for (int i = 3; i >= 1; i++) { - mbot.showText(i); - mbot.pause(1000); - } -frage: Countdown: should show 3, 2, 1. -fehler: 1 -besser: for (int i = 3; i >= 1; i--) { -> Counting down means `i--`. With `i++` the loop never stops. - -runde: - mbot.showText(Hello!); -frage: Should show "Hello!". -fehler: 1 -besser: mbot.showText("Hello!"); -> Text goes in quotation marks. - -runde: - mbot.showText("Distance: " - mbot.getDistance()); -frage: Should show for example "Distance: 25". -fehler: 1 -besser: mbot.showText("Distance: " + mbot.getDistance()); -> You join text and number with `+`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can show text on the screen. → Showing text -- I can show several texts one after the other. → Greeting in the structure chart -- I can show numbers and sensor values. → Numbers and sensor values -- I can write a countdown in Java. → Now in Java: countdown -::: - -## Quiz - -::: quiz -? What does `mbot.showText("Distance: " + 25)` show? -→ Numbers and sensor values -- [x] Distance: 25 -- [ ] "Distance: " + 25 -- [ ] 25 -> The `+` adds the number to the text. -? What happens to the old text when you show a new one? -→ Showing text -- [x] It is replaced. -- [ ] The new one appears below it. -::: diff --git a/web/lessons/en/visubot/19-zeichenketten.md b/web/lessons/en/visubot/19-zeichenketten.md deleted file mode 100644 index a19f283b..00000000 --- a/web/lessons/en/visubot/19-zeichenketten.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -titel: Strings -bereich: Light, sound and screen -kurz: Work with texts, pick out letters and show them on the screen. ---- - -## Skills I will gain now - -::: kompetenzen -- work with `length()` and `substring(…)` -- join texts and numbers with `+` -- get single characters with `charAt(…)` -::: - -## Letter by letter - -In Java a text is called a **string** or `String`. It consists of single characters, numbered from **0** just like an array: - -| Character | V | i | s | u | B | o | t | -|---|---|---|---|---|---|---|---| -| Number | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - -- `word.length()` gives the number of characters, here 7. -- `word.substring(0, 3)` gives the first 3 characters: `"Vis"`. - -The mBot2 should build its name on the [screen]{part=screen}: first **V**, then **Vi**, then **Vis** and so on up to **VisuBot**. - -::: übung vb-buchstaben -titel: Build the name -auftrag: Create `String word = "VisuBot"`. A for loop counts `i` from 1 to `word.length()`. Inside, the mBot2 shows `word.substring(0, i)` and waits 300 milliseconds. -befehle: showText "V", pause 300, showText "Vi", pause 300, showText "Vis", pause 300, showText "Visu", pause 300, showText "VisuB", pause 300, showText "VisuBo", pause 300, showText "VisuBot", pause 300 -braucht: forSchleife -tipp: The loop starts at `int i = 1` and runs as long as `i <= word.length()`. -tipp: Inside the loop: `mbot.showText(word.substring(0, i))` and `mbot.pause(300)`. -lösung: vb-buchstaben-loesung.visustruct -::: - -## Now in Java: text and length - -With `+` you join texts and numbers. This way the mBot2 shows a text followed by its length. - -::: übung vb-java-textlaenge -titel: How long is the text? -code: java -auftrag: Write in Java: create `String text = "Hello class"`. The mBot2 shows the text and its length in brackets, so **Hello class (11)**. -befehle: showText "Hello class (11)" -tipp: `text.length()` gives the length. The space counts too. -tipp: `mbot.showText(text + " (" + text.length() + ")");` -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Now in Java: scrolling text - -`word.charAt(i)` gives the character with the number `i`. If you show the characters one after the other with a pause, the word runs across the screen letter by letter: - -```java -String word = "Ludwig"; -for (int i = 0; i < word.length(); i++) { - mbot.showText(word.charAt(i)); - mbot.pause(500); -} -``` - -| Pass | `i` | Screen | -|---|---|---| -| 1 | 0 | L | -| 2 | 1 | u | -| 3 | 2 | d | - -::: übung vb-laufschrift -titel: Ludwig backwards -code: java -auftrag: Create `String word = "Ludwig"`. Show the word **backwards** letter by letter on the screen, so g, i, w, d, u, L, with a 500 ms pause after each letter. -befehle: showText "g", pause 500, showText "i", pause 500, showText "w", pause 500, showText "d", pause 500, showText "u", pause 500, showText "L", pause 500 -braucht: forSchleife -tipp: The last character has the number `word.length() - 1`. The loop counts backwards: `for (int i = word.length() - 1; i >= 0; i--)`. -tipp: Inside the loop: `mbot.showText(word.charAt(i));` and `mbot.pause(500);`. -lösung: vb-laufschrift-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Strings"](?visustruct&lektion=17-zeichenketten). It opens in a new window. - -::: übung vb-fehler-19-zeichenketten -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "How long is the text?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-19-zeichenketten-start.visustruct -befehle: showText "Hello class (11)" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be `mbot.showText(text +`. -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should show and tap the wrong line before time runs out. Five rounds, 30 seconds each. -zeit: 30 - -runde: - String word = "VisuBot"; - for (int i = 1; i <= word.length(); i++) { - mbot.showText(word.substring(1, i)); - mbot.pause(300); - } -frage: Should show V, Vi, Vis and so on up to VisuBot. -fehler: 3 -besser: mbot.showText(word.substring(0, i)); -> The first character has the number 0. With `substring(1, i)` the V is missing. - -runde: - String text = "Hello class"; - mbot.showText(text + " (" + text.length + ")"); -frage: Should show **Hello class (11)**. -fehler: 2 -besser: mbot.showText(text + " (" + text.length() + ")"); -> For a String, `length()` is a method and needs brackets. Only arrays have `length` without brackets. - -runde: - String word = "Ludwig"; - for (int i = 0; i <= word.length(); i++) { - mbot.showText(word.charAt(i)); - mbot.pause(500); - } -frage: Should show L, u, d, w, i, g. -fehler: 2 -besser: for (int i = 0; i < word.length(); i++) { -> The last character has the number 5. At `i = 6` there is no character left. - -runde: - String word = "Ludwig"; - for (int i = word.length(); i >= 0; i--) { - mbot.showText(word.charAt(i)); - mbot.pause(500); - } -frage: Should show the word backwards: g, i, w, d, u, L. -fehler: 2 -besser: for (int i = word.length() - 1; i >= 0; i--) { -> Backwards you start at the last character, and that has the number `word.length() - 1`. - -runde: - String name = 'Ludwig'; - mbot.showText("Hello " + name); -frage: Should show **Hello Ludwig**. -fehler: 1 -besser: String name = "Ludwig"; -> Texts go in double quotation marks. Single ones are only for a single character (`char`). -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 8 6 LED: the mBot2 has five of these little lights -- ↓ 2 7 MILLISECOND: a thousandth of a second -- → 11 2 SCREEN: mbot.showText shows a text on it -- ↓ 4 4 ACTUATOR: a part that does something, e.g. light up -- → 4 1 ARRAY: a row of slots under one name -- → 9 1 HERTZ: unit of pitch: vibrations per second -- ↓ 1 1 SPEAKER: mbot.playTone plays a tone through it -- → 1 1 STRING: a text in Java -lösung: 7 7, 10 7, 7 4, 11 7, 12 7 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can work with `length()` and `substring(…)`. → Letter by letter -- I can join texts and numbers with `+`. → Now in Java: text and length -- I can get single characters with `charAt(…)`. → Now in Java: scrolling text -::: - -## Quiz - -::: quiz -? What does `"VisuBot".substring(0, 4)` give? -→ Letter by letter -- [ ] `"VisuB"` -- [x] `"Visu"` -- [ ] `"uBot"` -> `substring(0, 4)` takes the characters 0, 1, 2 and 3, so four of them. -? What does `"Ludwig".charAt(0)` give? -→ Now in Java: scrolling text -- [x] `L` -- [ ] `u` -- [ ] `g` -> Characters are counted from 0. Character 0 is the first one. -::: diff --git a/web/lessons/en/visubot/20-motoren.md b/web/lessons/en/visubot/20-motoren.md deleted file mode 100644 index 892e2feb..00000000 --- a/web/lessons/en/visubot/20-motoren.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -titel: Motors and speed -bereich: Motors and methods -kurz: Step on the gas, steer and follow a line. ---- - -## Skills I will gain now - -::: kompetenzen -- step on the gas with wheels separately and stop -- drive until a sensor reports something -- write a line follower in Java -::: - -## Two motors, two wheels - -::: mbot2 -focus: motors, wheels -view: bottom -::: - -The mBot2 has two [motors]{part=motors}, each drives one [wheel]{part=wheels}. So far you have used **move forward** and **turn right**. These commands drive a fixed distance and wait until the mBot2 has arrived. - -With **wheels separately** (`mbot.drive(left, right)`) you step on the gas instead: you say how strongly each wheel turns, in percent from −100 to 100. The mBot2 then **keeps going** until you tell it something else. With **stop** (`mbot.stop()`) it stops. - -| Command | What happens? | -|---|---| -| `mbot.drive(40, 40)` | both wheels equally fast: straight ahead | -| `mbot.drive(-40, -40)` | backwards | -| `mbot.drive(10, 40)` | right faster: curve to the left | -| `mbot.drive(40, -40)` | wheels against each other: turns right on the spot | -| `mbot.stop()` | stop | - -> In the simulator `mbot.drive(100, 100)` drives 20 cm per second. Try it in the [simulation](#zeige-simulation). - -## Full speed to the wall in the structure chart - -In lesson 5 the mBot2 drove to the wall in steps of 10 cm. With **wheels separately** it works without jerking: step on the gas once, wait until the wall is close, then stop. - -::: übung vb-gas-bis-wand -titel: Full speed to the wall -auftrag: The mBot2 steps on the gas with 50 %. As long as the wall is more than 15 cm away, it waits a moment. Then it stops. There are three worlds. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: At the top is `mbot.drive(50, 50)`. Below it a while loop with the condition `mbot.getDistance() > 15`. -tipp: Inside the loop is only **wait a moment**. The mBot2 keeps driving meanwhile! After the loop is **stop**. -lösung: vb-gas-bis-wand-loesung.visustruct -::: - -## The line follower - -::: mbot2 -focus: lineSensor -view: bottom -::: - -A classic: the mBot2 follows a black line on the floor. For this it looks at the two middle probes of the [line sensor]{part=lineSensor}: - -| Sensor | Text | -|---|---| -| left middle probe sees black | `mbot.isLineLeft()` | -| right middle probe sees black | `mbot.isLineRight()` | - -The idea: if **both** see the line, it drives straight ahead. If only the **left** one sees it, the line has moved to the left: it steers left, so the right wheel turns faster. If only the **right** one sees it, it steers right. - -## Now in Java: line follower - -::: übung vb-java-linienfolger -titel: Line follower -code: java -auftrag: Write a line follower in Java. As long as the wall is more than 15 cm away, the mBot2 checks its two probes and steers. Then it stops. In the first world the line bends to the right, in the second to the left. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: `while (mbot.getDistance() > 15) { … }` and after it `mbot.stop();`. -tipp: Inside the loop: `if (mbot.isLineLeft() && mbot.isLineRight()) { mbot.drive(40, 40); } else if (mbot.isLineLeft()) { mbot.drive(10, 40); } else if (mbot.isLineRight()) { mbot.drive(40, 10); }` -lösung: vb-java-linienfolger-loesung.visustruct -::: - -> For the real mBot2, stick the line with black insulating tape on a light floor. Drive slowly at first, otherwise it shoots past the line in the curve. - -::: übung vb-fehler-20-motoren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Line follower", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-20-motoren-start.visustruct -welt: linie-1, linie-2 -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be `mbot.stop()`. -lösung: vb-java-linienfolger-loesung.visustruct -::: - -## Game: Where does it go? - -::: spiel frage -titel: Game: Where does it go? -intro: Power for left and right in percent: where does the mBot2 go? Seven rounds. -antworten: straight ahead | backwards | curve to the left | curve to the right | turns on the spot - -runde: - mbot.drive(40, 40); -frage: Where does it go? -richtig: straight ahead -> Both wheels turn at the same speed. - -runde: - mbot.drive(-40, -40); -frage: Where does it go? -richtig: backwards -> Minus means backwards, and both wheels are the same. - -runde: - mbot.drive(10, 40); -frage: Where does it go? -richtig: curve to the left -> The right wheel is faster, so it steers to the left. - -runde: - mbot.drive(40, 10); -frage: Where does it go? -richtig: curve to the right -> The left wheel is faster, so it steers to the right. - -runde: - mbot.drive(40, -40); -frage: Where does it go? -richtig: turns on the spot -> One wheel forward, one back: it turns right without moving from the spot. - -runde: - mbot.drive(-40, 40); -frage: Where does it go? -richtig: turns on the spot -> This time it turns to the left. - -runde: - if (mbot.isLineLeft() && !mbot.isLineRight()) { - ... - } -frage: Line follower: only the left sensor sees the line. What goes in the gap? -- `mbot.drive(40, 10);` -- [x] `mbot.drive(10, 40);` -- `mbot.stop();` -> The line has moved to the left. It steers to the left, so the right wheel turns faster. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can step on the gas with wheels separately and stop. → Two motors, two wheels -- I can drive until a sensor reports something. → Full speed to the wall in the structure chart -- I can write a line follower in Java. → Now in Java: line follower -::: - -## Quiz - -::: quiz -? What does `mbot.drive(30, 30)` do? -→ Two motors, two wheels -- [ ] It drives 30 cm and stops. -- [x] It drives straight ahead and does not stop until another driving command comes. -- [ ] It turns by 30°. -> **wheels separately** only steps on the gas. You have to stop it yourself. -? The mBot2 should steer to the right. Which command fits? -→ Two motors, two wheels -- [ ] `mbot.drive(10, 40)` -- [x] `mbot.drive(40, 10)` -- [ ] `mbot.drive(-40, -40)` -> If the left wheel turns faster, it drives a right curve. -::: diff --git a/web/lessons/en/visubot/21-stoppuhr-akku.md b/web/lessons/en/visubot/21-stoppuhr-akku.md deleted file mode 100644 index 15408a29..00000000 --- a/web/lessons/en/visubot/21-stoppuhr-akku.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -titel: Stopwatch and battery -bereich: Motors and methods -kurz: Measure time and keep an eye on the battery. ---- - -## Skills I will gain now - -::: kompetenzen -- reset the stopwatch and read it -- drive for a certain time -- show the battery level -::: - -## The stopwatch - -::: mbot2 -focus: cyberpi -view: top -::: - -A stopwatch runs inside the [CyberPi]{part=cyberpi}. It counts the seconds since the program started. With **reset stopwatch** (`mbot.resetTimer()`) it starts again at 0. - -| Sensor or command | Text | Value | -|---|---|---| -| reset stopwatch | `mbot.resetTimer()` | | -| stopwatch | `mbot.getTimer()` | seconds with a decimal place, e.g. `1.5` | - -This is how you drive for a certain time: reset the stopwatch, step on the gas, wait as long as the stopwatch is not far enough yet, stop. - -## Driving two seconds in the structure chart - -::: übung vb-zwei-sekunden -titel: Two seconds -auftrag: The mBot2 resets the stopwatch and steps on the gas with 50 %. As long as the stopwatch is below 2 seconds, it waits a moment. Then it stops. With 50 % it manages 10 cm per second, so it must stop 20 cm further on. -welt: zeit-1 -braucht: whileSchleife -tipp: At the top are **reset stopwatch** and `mbot.drive(50, 50)`. Below it a while loop with `mbot.getTimer() < 2`. -tipp: Inside the loop is **wait a moment**, after the loop **stop**. -lösung: vb-zwei-sekunden-loesung.visustruct -::: - -## The battery - -::: mbot2 -focus: shield -view: top -::: - -Under the transparent [shield]{part=shield} you see the battery. How full it is comes from `mbot.getBattery()` in percent: `100` is completely full. When it is almost empty, the motors get weaker. Then it is time to charge. - -::: angeberwissen -Your phone does not measure its battery directly in percent either. It measures the voltage: a full lithium battery has a little over 4 volts, an empty one just over 3. From that it calculates the percentage, just like the CyberPi. -::: - -## Now in Java: battery display - -::: übung vb-java-akku -titel: Battery display -code: java -auftrag: Write in Java: the mBot2 shows for example **Battery: 80 %** on the screen. If the battery is below 20 %, the LEDs also light up red. -messwerte: getBattery=80 -> none, ledOff, screen "Battery: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Battery: 15 %" -braucht: verzweigung -tipp: `mbot.showText("Battery: " + mbot.getBattery() + " %");` puts the text together from three parts. -tipp: After it: `if (mbot.getBattery() < 20) { mbot.setLed(255, 0, 0); }` -lösung: vb-java-akku-loesung.visustruct -::: - -::: übung vb-fehler-21-stoppuhr-akku -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Battery display", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-21-stoppuhr-akku-start.visustruct -messwerte: getBattery=80 -> none, ledOff, screen "Battery: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Battery: 15 %" -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be `mbot.setLed(255, 0, 0)`. -lösung: vb-java-akku-loesung.visustruct -::: - -## Game: Stopwatch and battery - -::: spiel frage -titel: Game: Stopwatch and battery -intro: Read the code and predict what happens. Five rounds. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: How long does the mBot2 drive? -- 0.1 seconds -- [x] 2 seconds -- until it reaches the wall -> It waits until the stopwatch shows 2 seconds, then it stops. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: At 50 % it manages 10 cm per second. How far does it drive? -- 10 cm -- [x] 20 cm -- 50 cm -> 2 seconds times 10 cm per second is 20 cm. - -runde: - mbot.pause(3000); - mbot.resetTimer(); - mbot.pause(1000); - mbot.showText(mbot.getTimer()); -frage: Roughly which number does the screen show? -- 0 -- [x] 1 -- 4 -> After `mbot.resetTimer()` the stopwatch starts again at 0. After that only 1 second passes. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Battery: " + mbot.getBattery() + " %"); -frage: The battery has 15 % left. What happens? -- Only the screen shows **Battery: 15 %**. -- Only the LEDs light up red. -- [x] The screen shows **Battery: 15 %**, and the LEDs light up red. -> 15 is less than 20. The display is below the branch and always comes. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Battery: " + mbot.getBattery() + " %"); -frage: The battery has 80 %. What happens? -- [x] Only the screen shows **Battery: 80 %**. -- Only the LEDs light up red. -- Nothing at all. -> 80 is not less than 20, so the LEDs stay off. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can reset the stopwatch and read it. → The stopwatch -- I can drive for a certain time. → Driving two seconds in the structure chart -- I can show the battery level. → Now in Java: battery display -::: - -## Quiz - -::: quiz -? What does `mbot.getTimer()` give right after `mbot.resetTimer()`? -→ The stopwatch -- [x] 0 -- [ ] 100 -- [ ] The time of day -> The stopwatch starts again at 0. -? Why does the mBot2 only wait **a moment** in the loop instead of stopping? -→ Driving two seconds in the structure chart -- [ ] Because otherwise the loop does not start. -- [x] Because it should keep driving until the time is up. -- [ ] Because otherwise the stopwatch stops. -> Stepping on the gas still applies while it waits. -::: diff --git a/web/lessons/en/visubot/21-zustaende.md b/web/lessons/en/visubot/21-zustaende.md deleted file mode 100644 index c93c9cd7..00000000 --- a/web/lessons/en/visubot/21-zustaende.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -titel: States: what am I doing right now? -bereich: Motors and methods -kurz: Switch a robo traffic light on with a state variable and a switch. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what a state is -- act depending on the state with a switch and change to the next state -- tell states apart in Java with names and `.equals` -::: - -## What is a state? - -A traffic light is always in exactly one **state**: red, green or yellow. In each state it knows two things: what do I show? And what comes next? - -Our robo traffic light has three states. Each gets a number: - -| State | LEDs | next | -|---|---|---| -| 0 | red | 1 | -| 1 | green | 2 | -| 2 | yellow | 0 | - -You store the current state in a variable: `int state = 0`. A variable like this is called a **state variable**. A program that jumps from state to state like this is called a **state machine**. - -> A real traffic light in Germany has four states: red, red-yellow, green, yellow. Our robo traffic light leaves out red-yellow. - -::: angeberwissen -A robot vacuum is a state machine too: vacuuming, avoiding, driving back to the charging station. I only have two states: eating and sleeping. -::: - -## The robo traffic light in the structure chart - -The switch fits perfectly: there is one case for each state. Each case has two boxes: what do I do? And which state comes next? - -::: übung vb-ampel-zustand -titel: Robo traffic light -auftrag: Build a structure chart: create `int state = 0`. A for loop runs six times. Inside it is a switch on `state`. Case 0: LEDs red, `state = 1`. Case 1: LEDs green, `state = 2`. Otherwise: LEDs yellow, `state = 0`. After the switch the mBot2 waits one second. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, fallauswahl -tipp: You will find the switch among the Elements. Write `state` into it. The cases are called 0, 1 and default. -tipp: The colours are `mbot.setLed(255, 0, 0)` for red, `mbot.setLed(0, 255, 0)` for green and `mbot.setLed(255, 200, 0)` for yellow. Below the switch, still inside the loop, is `mbot.pause(1000)`. -lösung: vb-ampel-zustand-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Switch"](?visustruct&lektion=10-fallauswahl). It opens in a new window. - -## Now in Java: states with names - -Numbers are easy to forget. What was state 2 again? Names are easier to read. Then the state is a text: - -```java -String state = "red"; -... -if (state.equals("red")) { - mbot.setLed(255, 0, 0); - state = "green"; -} else if (state.equals("green")) { - ... -``` - -In Java you compare texts with `.equals("…")`, not with `==`. - -::: übung vb-java-ampel-text -titel: Traffic light with names -code: java -auftrag: Write the robo traffic light in Java with `String state = "red";`. Use `if` and `else if` to check which state the light is in: red, then green, then yellow, then red again. The loop runs six times, with a 1 second pause after each pass. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, verzweigung -tipp: Inside the loop: `if (state.equals("red")) { … } else if (state.equals("green")) { … } else { … }` and then `mbot.pause(1000);`. -tipp: In the red case are `mbot.setLed(255, 0, 0);` and `state = "green";`. Green switches to `"yellow"`, yellow back to `"red"`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -::: übung vb-fehler-21-zustaende -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Traffic light with names", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-21-zustaende-start.visustruct -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be `state = "green"`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -## States while driving - -The mBot2 can also drive with states. In the state **drive** it drives forward. When it sees a wall, it changes to the state **turn**. There it turns once and changes back to **drive**. - -::: diagramm vb-l21z-ausweichen.visustruct -Driving and avoiding with two states. Open the diagram in the editor and try it out in a world. -::: - -## Game: which state comes now? - -::: spiel frage -titel: Game: which state comes now? -intro: The robo traffic light switches: 0 red → 1 green → 2 yellow → 0 red. Which state comes next? Five rounds. -frage: Which state comes next? -antworten: 0 | 1 | 2 - -runde: -frage: The light is in state **0** (red) right now. -richtig: 1 -> After red comes green. - -runde: -frage: The light is in state **2** (yellow) right now. -richtig: 0 -> After yellow it starts all over again. - -runde: -frage: The light is in state **1** (green) right now. -richtig: 2 -> After green comes yellow. - -runde: -frage: The light starts in state 0 and switches on **twice**. -richtig: 2 -> 0 → 1 → 2. - -runde: -frage: The light starts in state 0 and switches on **three times**. -richtig: 0 -> 0 → 1 → 2 → 0. After three steps it is back at the start. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what a state is. → What is a state? -- I can act depending on the state with a switch and change to the next state. → The robo traffic light in the structure chart -- I can tell states apart in Java with names and `.equals`. → Now in Java: states with names -::: - -## Quiz - -::: quiz -? What does a state variable store? -→ What is a state? -- [ ] How often the loop has run -- [x] What the program is doing right now, for example red or green -- [ ] The biggest reading -? What is in each case of the switch? -→ The robo traffic light in the structure chart -- [x] What to do and which state comes next -- [ ] Only a pause -- [ ] A new loop -? How do you check in Java whether `state` contains the text `"red"`? -→ Now in Java: states with names -- [ ] `state == red` -- [x] `state.equals("red")` -- [ ] `state = "red"` -> You compare texts with `.equals`. A single `=` would assign `"red"`. -::: diff --git a/web/lessons/en/visubot/22-eigene-methoden.md b/web/lessons/en/visubot/22-eigene-methoden.md deleted file mode 100644 index 2980f731..00000000 --- a/web/lessons/en/visubot/22-eigene-methoden.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -titel: Your own methods -bereich: Motors and methods -kurz: Write and call your own commands with parameters and return values. ---- - -## Skills I will gain now - -::: kompetenzen -- build and call a subprogram with a parameter -- recognise methods in Java -- recognise and call an overloaded method -- write a method with a return value -::: - -## A subprogram for the square - -The mBot2 can already drive a square. Now it should drive two squares of different sizes. Instead of building the loop twice, you write a **subprogram**. In Java it is called a **method**. It is a command of your own that you can call as often as you like. - -The header `void square(int side)` says: - -- `void`: the method gives no result back, it only **does** something. -- `square`: that is the name of your new command. -- `int side`: when you call it, you pass a number, the **parameter**. - -::: übung vb-quadrat-methode -titel: Two squares -auftrag: Build a subprogram `void square(int side)` that drives a square with side length `side`. The main program calls it twice: first with 30, then with 50. -fahrt: 4 x (forward 30, turnRight), 4 x (forward 50, turnRight) -braucht: aufruf -tipp: Create a new tab with **+** and give it the title `void square(int side)`. Inside is a for loop that runs `mbot.forward(side)` and `mbot.turnRight()` four times. -tipp: The main program contains two call boxes: `square(30)` and `square(50)`. -lösung: vb-quadrat-methode-loesung.visustruct -unterprogramm: vb-quadrat-unterprogramm-loesung.visustruct -::: - -## Methods in Java - -In Java every method lives in a class. The program always starts in the method `main`. From there `square` is called: - -```java -public class Squares { - public static void main(String[] args) { - square(30); - square(50); - } - - static void square(int side) { - for (int i = 0; i < 4; i++) { - mbot.forward(side); - mbot.turnRight(); - } - } -} -``` - -In [Code](#zeige-codelive) you see each method in its own tab, just like in the structogram. - -::: quiz -? What does `void` mean in `void square(int side)`? -→ Methods in Java -- [ ] The method has no parameter. -- [x] The method gives no result back. -- [ ] The method may only be called once. -> `void` means "empty": no value comes back. The parameter is in the brackets. -? With which value for `side` does `square(50)` run? -→ A subprogram for the square -- [ ] 30 -- [x] 50 -- [ ] with none -> The value in the brackets of the call becomes the parameter `side`. -::: - -## Same name, different parameters: overloading - -You know `mbot.forward()` and `mbot.forward(30)`. These are **two different methods with the same name**. Java can tell from the call which one is meant: by the **number** and the **type** of the parameters. This is called **overloading**. - -There is a third `forward` method. It has two parameters: a number and a **unit** as text. - -```java -mbot.forward(); // 10 cm (default) -mbot.forward(30); // 30 cm -mbot.forward(30, "cm"); // 30 cm, unit written out -mbot.forward(2, "rotations"); // the wheels turn twice -``` - -One wheel rotation is as far as the wheel's circumference: π · 6.5 cm ≈ 20.4 cm. So two rotations are about 40.8 cm. `mbot.backward` has the same three versions. - -These are the three headers. The method name is the same, the parameter lists are different: - -```java -void forward() -void forward(int cm) -void forward(int value, String unit) -``` - -You already know overloading: `System.out.println` exists for `int`, for `double`, for `String` and more. That is why you can simply put any of these values in the brackets. - -::: angeberwissen -Are the 20.4 cm really true for **your** mBot2? Professionals don't trust a number they haven't measured. Measure the wheel diameter and run `mbot.forward(5, "rotations")`: the expected distance is 102.1 cm. This is how software systems are tested: every **test case** has an expected result and an actual (measured) result. You test several times and write everything into a **test record**. Here is your [test record to print (PDF)](https://visubot.visucode.de/test-record-wheel-rotation.pdf). Give it to your teacher, so they can see whether all robots drive the same distance. -::: - -::: übung vb-ueberladung-umdrehung -titel: Square with rotations -auftrag: Drive a square in which every side is exactly **one wheel rotation** long. Use the overloaded method `mbot.forward(1, "rotations")`. -fahrt: 4 x (forward 20.42, turnRight) -braucht: forSchleife -tipp: A for loop with `int i = 0`, `i < 4`, `i++`. -tipp: Inside are `mbot.forward(1, "rotations")` and `mbot.turnRight()`. -lösung: vb-ueberladung-umdrehung-loesung.visustruct -::: - -::: übung vb-java-rechteck-umdrehungen -titel: Rectangle with rotations -code: java -auftrag: Write in Java: the mBot2 drives a rectangle. The long sides are **two** wheel rotations long, the short ones **one**. Use `mbot.forward(2, "rotations")` and `mbot.forward(1, "rotations")`. -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -braucht: forSchleife -tipp: A for loop that runs twice: `for (int i = 0; i < 2; i++) { … }`. -tipp: Inside the loop: `mbot.forward(2, "rotations");`, `mbot.turnRight();`, `mbot.forward(1, "rotations");`, `mbot.turnRight();` -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -::: quiz -? Which method does `mbot.forward(3, "rotations")` call? -→ Same name, different parameters: overloading -- [ ] `forward()` -- [ ] `forward(int cm)` -- [x] `forward(int value, String unit)` -> Java picks the version whose parameters fit: two parameters, a number and a text. -::: - -## A method with a return value - -A method can also **work something out** and give the result back. Instead of `void`, the header then has the data type of the result, and `return` gives the value back: - -```java -static int centimetres(int rotations) { - return rotations * 20; -} -``` - -One wheel rotation is about 20 cm. So the call `int distance = centimetres(3);` puts 60 into `distance`. - -::: übung vb-zentimeter -titel: Rotations into centimetres -auftrag: Build a subprogram `int centimetres(int rotations)` that returns `rotations * 20`. The main program calls it with 3, drives the distance and shows **Distance: 60 cm** on the screen. -fahrt: forward 60 -befehle: showText "Distance: 60 cm" -braucht: aufruf -tipp: A new tab with the title `int centimetres(int rotations)`. One statement is enough inside: `return rotations * 20`. -tipp: In the main program: call `int distance = centimetres(3)`, then `mbot.forward(distance)` and `mbot.showText("Distance: " + distance + " cm")`. -lösung: vb-zentimeter-loesung.visustruct -unterprogramm: vb-zentimeter-unterprogramm-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Call and break"](?visustruct&lektion=18-aufruf-und-aussprung). It opens in a new window. - -::: übung vb-fehler-22-eigene-methoden -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Rectangle with rotations", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-22-eigene-methoden-start.visustruct -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be `mbot.forward(1, "rotations")`. -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -## Game: Which method? - -::: spiel frage -titel: Game: Which method? -intro: Same name, different parameters: which method does Java call, and what comes out? Six rounds. - -runde: - mbot.forward(30, "cm"); -frage: Which `forward` method runs? -- `forward()` -- `forward(int cm)` -- [x] `forward(int value, String unit)` -> Two parameters, a number and a text: that only fits the third one. - -runde: - mbot.forward(); -frage: How far does the mBot2 drive? -- [x] 10 cm -- not at all, the number is missing -- one wheel rotation -> Without a parameter, `forward` drives 10 cm. That is the version with no parameters. - -runde: - mbot.forward(2, "rotations"); -frage: Roughly how far does the mBot2 drive? -- 2 cm -- 20 cm -- [x] 41 cm -> One wheel rotation is about 20.4 cm, so two are about 40.8 cm. - -runde: - static int centimetres(int rotations) { - return rotations * 20; - } -frage: What does `centimetres(4)` give? -- 4 -- 24 -- [x] 80 -> The parameter `rotations` is 4, and `return` gives back 4 · 20. - -runde: - public static void main(String[] args) { - square(30); - square(50); - } -frage: How many squares does the mBot2 drive, and how big is the second one? -- one with 80 cm -- [x] two, the second with 50 cm sides -- two, both with 30 cm sides -> Each call drives one square. The value in the brackets becomes `side`. - -runde: -frage: Which header fits a method that gives back a number? -- `void centimetres(int rotations)` -- [x] `int centimetres(int rotations)` -- `centimetres(int rotations)` -> The data type of the result comes before the name. `void` means: no result. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - static void square(int side) { - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } - } -frage: Should drive a square with sides of length `side`. -fehler: 3 -besser: mbot.forward(side); -> With `30` every square is the same size, whatever you pass in. - -runde: - static void centimetres(int rotations) { - return rotations * 20; - } -frage: Should give back the distance in cm. -fehler: 1 -besser: static int centimetres(int rotations) { -> A method that gives something back needs the data type of the result instead of `void`. - -runde: - static int centimetres(int rotations) { - int cm = rotations * 20; - } -frage: Should give back the distance in cm. -fehler: 2 -besser: return rotations * 20; -> The method calculates but gives nothing back. `return` is missing. - -runde: - mbot.forward(2, rotations); -frage: Should drive two wheel rotations. -fehler: 1 -besser: mbot.forward(2, "rotations"); -> The unit is a text and needs quotation marks. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 7 1 PARAMETER: value you write in the brackets when you call a method -- ↓ 5 7 METHOD: your own command with a name, e.g. square(30) -- ↓ 1 4 OVERLOADING: same method name, different parameters -- ↓ 2 9 BATTERY: mbot.getBattery() tells you how full it is -- → 2 4 VOID: in the header: the method gives nothing back -- ↓ 2 2 STOPWATCH: mbot.getTimer() reads it -- → 5 7 MOTOR: each wheel has its own -- ↓ 1 11 RETURN: gives a result back from a method -lösung: 7 5, 6 9, 5 9, 10 2, 5 8, 8 4 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build and call a subprogram with a parameter. → A subprogram for the square -- I can recognise methods in Java. → Methods in Java -- I can recognise and call an overloaded method. → Same name, different parameters: overloading -- I can write a method with a return value. → A method with a return value -::: - -## Quiz - -::: quiz -? The subprogram `void quadrat(int seite)` should drive a square with sides of 30 cm. What does the call look like? -→ A subprogram for the square -- [ ] `quadrat()` -- [x] `quadrat(30)` -- [ ] `int seite = quadrat(30)` -> The value in the brackets becomes the parameter `seite`. Because `quadrat` returns nothing, there is no assignment. -? In which method does a Java program start? -→ Methods in Java -- [ ] in the first method of the class -- [x] in the method `main` -- [ ] in the method `quadrat` -> The program always starts in `main`. The other methods are called from there. -? How does Java tell the overloaded methods `forward()`, `forward(int cm)` and `forward(int wert, String einheit)` apart? -→ Same name, different parameters: overloading -- [ ] by their name -- [x] by the number and type of the parameters -- [ ] by their order in the program -> The name is the same for all of them. Java chooses the variant whose parameters fit the call. -? `static int zentimeter(int umdrehungen) { return umdrehungen * 20; }`: What is in `strecke` after `int strecke = zentimeter(2);`? -→ A method with a return value -- [ ] 2 -- [ ] 20 -- [x] 40 -> `return` gives back 2 · 20 = 40, and this value ends up in `strecke`. -? A method returns a whole number. What is written in its header instead of `void`? -→ A method with a return value -- [ ] `return` -- [x] `int` -- [ ] `static` -> Instead of `void`, the header names the data type of the result. -::: diff --git a/web/lessons/en/visubot/23-wie-geht-es-weiter.md b/web/lessons/en/visubot/23-wie-geht-es-weiter.md deleted file mode 100644 index 66681ce8..00000000 --- a/web/lessons/en/visubot/23-wie-geht-es-weiter.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -titel: What's next? -bereich: Outlook -kurz: Look back at what you learned with the mBot2 and see what is still waiting for you in VisuStruct. ---- - -## Skills I will gain now - -::: kompetenzen -- say which programming basics I learned with the mBot2 -- find and fix a mistake in a robot program on my own -- name the topics that are still waiting for me in VisuStruct -::: - -## What you can do now - -Congratulations, you have finished all the robot lessons! With the mBot2 you learned the **basics of structured programming**: - -- reading and building a **structure chart** and checking it with a **desk check**, writing a plan as a **flowchart** and as **pseudocode**, -- **sequence**, **branch** and **switch**, conditions with **and**, **or** and **not**, -- the loops **for**, **while** and **do-while**, also nested, and leaving a loop with **break**, -- **variables**, **data types** and **constants** with `final`, counting, adding up and finding the largest value, -- **arrays** and **strings**, -- your own **methods** with parameters and a return value. - -All of this is not just for robots. Every Java program is built from exactly these building blocks, even a game or an app. - -::: angeberwissen -Baah, do you know what you actually built with the mBot2? An **embedded system**: a small computer inside a device that measures its surroundings with sensors. Such systems are in washing machines, cars and pacemakers. A modern car has more than a hundred of them. And they are programmed with exactly the building blocks you know now. -::: - -## Once more: Why doesn't it run? - -One last bug hunt to finish. This time it is a mistake that even professionals often make. - -::: übung vb-fehler-23-wie-geht-es-weiter -titel: Why doesn't it run? -code: java -auftrag: The program should drive up to just before the wall, but it doesn't run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-23-wie-geht-es-weiter-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Read the error message carefully. Compare the sensor with the other commands: what comes after `mbot.forward`? -tipp: A command is always followed by round brackets, even if there is nothing inside them. It should be `mbot.getDistance() > 15`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## What is still missing - -Some programming topics have little to do with the robot. You will find them in **VisuStruct**, the world without the robot. Because you already know the basics, you will make quick progress there. The links open in a new window. - -- **Keyboard input:** asking for values while the program runs, in ["Input and output"](?visustruct&lektion=06-eingabe-und-ausgabe). -- **Tables in memory:** arrays with rows and columns, for example for a cinema, in ["Two-dimensional arrays"](?visustruct&lektion=16-zweidimensionale-arrays). -- **Searching and sorting:** finding a value quickly and putting a list in order, in ["Searching and sorting"](?visustruct&lektion=19-suchen-und-sortieren). -- **Other languages:** the same program in Python and JavaScript, in ["Python and JavaScript"](?visustruct&lektion=21-python-und-javascript). -- **Catching crashes:** what happens when someone types "abc" instead of a number, in ["When the program crashes: try and catch"](?visustruct&lektion=22-try-und-catch). -- **Files:** reading and saving text, tables and data, from ["Reading and saving text"](?visustruct&lektion=23-text-einlesen-und-speichern) via ["Tables as CSV"](?visustruct&lektion=25-tabellen-als-csv) to ["Data as JSON"](?visustruct&lektion=26-json). -- **Windows with buttons:** your own programs with a window, a text field and a button, from ["Your first window"](?visustruct&lektion=28-erstes-fenster) to ["Model View Controller"](?visustruct&lektion=40-model-view-controller). - -> You don't need the mBot2 for this. But you can come back at any time and teach it new tricks. - -## Game: Which world? - -::: spiel frage -titel: Game: Which world? -intro: Ludwig has ideas for new programs. Do you learn this with the mBot2 in VisuBot or without the robot in VisuStruct? Eight rounds. -antworten: VisuBot | VisuStruct - -runde: -frage: "Drive up to the wall and then beep." -richtig: VisuBot -> Distance sensor, motors and speaker: that is a job for the mBot2. - -runde: -frage: "A window with a button that counts to 10." -richtig: VisuStruct -> You build windows with buttons with Swing in VisuStruct. - -runde: -frage: "Play a melody that is stored in an array." -richtig: VisuBot -> You learned arrays and melodies with the mBot2's speaker. - -runde: -frage: "Read the class's marks from a CSV file." -richtig: VisuStruct -> You learn to read and save files in VisuStruct. - -runde: -frage: "If someone types 'abc' instead of a number, the program should not crash." -richtig: VisuStruct -> You catch crashes with try and catch. That is in VisuStruct. - -runde: -frage: "Follow a black line with the line sensor." -richtig: VisuBot -> The line sensor sits under the mBot2. - -runde: -frage: "Sort ten numbers by size." -richtig: VisuStruct -> Searching and sorting is in VisuStruct. But you can already find the largest value. - -runde: -frage: "Save the high score list in a file." -richtig: VisuStruct -> You learn to write files in VisuStruct in "Reading and saving text". -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can say which programming basics I learned with the mBot2. → What you can do now -- I can find and fix a mistake in a robot program on my own. → Once more: Why doesn't it run? -- I can name the topics that are still waiting for me in VisuStruct. → What is still missing -::: - -## Quiz - -::: quiz -? Do the building blocks from the robot lessons also work for programs without a robot? -→ What you can do now -- [x] Yes, every Java program is built from sequence, branch, loop, variables and methods -- [ ] No, without a robot you need completely different commands -- [ ] Only the loops -> Only the `mbot.` commands belong to the robot. Everything else is ordinary Java. - -? Why doesn't `mbot.getDistance > 15` run? -→ Once more: Why doesn't it run? -- [ ] Because 15 is too small -- [x] Because the round brackets after the command are missing -- [ ] Because you have to write `<` -> Without brackets, Java looks for a variable `getDistance` and finds none. - -? Where do you learn how a program catches crashes with try and catch? -→ What is still missing -- [ ] In VisuBot -- [x] In VisuStruct -> That is where the lesson "When the program crashes: try and catch" is. - -? Which topics do you find in VisuStruct? Choose the right list. -→ What is still missing -- [x] Sorting, files and windows with buttons -- [ ] Line sensor, LEDs and motors -- [ ] Only the for loop -> Line sensor, LEDs and motors belong to the mBot2, and you already know the for loop. -::: diff --git a/web/lessons/en/visubot/aufgaben/alarmanlage.md b/web/lessons/en/visubot/aufgaben/alarmanlage.md deleted file mode 100644 index f66bc472..00000000 --- a/web/lessons/en/visubot/aufgaben/alarmanlage.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: The alarm system -nach: 16 -stufe: 2 ---- - -The mBot2 guards your room. If someone comes closer than 20 cm **or** it gets loud (loudness above 60), it raises the alarm: the LEDs light up red and it beeps. Otherwise the LEDs are off. With button B you switch the alarm system off. - -::: übung vb-alarmanlage -titel: The alarm system -auftrag: As long as button B is not pressed, the mBot2 checks again and again: if the distance is below 20 cm or the loudness above 60, the LEDs light up red and it plays a tone. Otherwise the LEDs go off. Then it waits a moment. -messwerte: getDistance=10, isButtonB=false/true -> none, tone -messwerte: getLoudness=80, isButtonB=false/true -> none, tone -messwerte: getDistance=100, getLoudness=0, isButtonB=false/true -> none, noTone, ledOff -braucht: whileSchleife, verzweigung -tipp: On the outside is a while loop with `!mbot.isButtonB()`. Inside a branch and after it **wait a moment**. -tipp: The condition of the branch: `mbot.getDistance() < 20 || mbot.getLoudness() > 60`. In the true branch `mbot.setLed(255, 0, 0)` and `mbot.playTone(880, 200)`, in the false branch `mbot.ledOff()`. -lösung: vb-alarmanlage-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/ausgang.md b/web/lessons/en/visubot/aufgaben/ausgang.md deleted file mode 100644 index 040e0726..00000000 --- a/web/lessons/en/visubot/aufgaben/ausgang.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Maze with exits -nach: 5 -stufe: 3 ---- - -The mBot2 stands at the bottom left and faces right. Above it are rows of walls. Each has exactly one gap, and each gap lies further right than the one below. The goal is at the very top. - -The mBot2 drives to the right and looks up in every square. If there is a gap, it drives through into the next corridor. - -::: übung vb-ausgang -titel: Maze with exits -auftrag: Program the mBot2 so that in both worlds it drives through all gaps to the goal without bumping into anything. One square is 30 cm. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: In each pass the mBot2 first turns left and measures. If the way up is free, it is more than 20 cm. -tipp: Through the gap it is two squares into the next corridor. Afterwards it should face right again. If there is a wall above, it turns back and drives one square further. -lösung: vb-ausgang-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/binaer-zaehlen.md b/web/lessons/en/visubot/aufgaben/binaer-zaehlen.md deleted file mode 100644 index 17abc29c..00000000 --- a/web/lessons/en/visubot/aufgaben/binaer-zaehlen.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -titel: Counting in binary -nach: 15 -stufe: 3 ---- - -Computers calculate with only two digits: 0 and 1. That is called **binary**. With three LEDs you can show the numbers 0 to 7 in binary: LED 0 counts 1, LED 1 counts 2 and LED 2 counts 4. The number 5 is 4 + 1, so LED 2 and LED 0 light up. - -| Number | LED 2 (4) | LED 1 (2) | LED 0 (1) | -|---|---|---|---| -| 0 | off | off | off | -| 1 | off | off | on | -| 2 | off | on | off | -| 3 | off | on | on | -| 5 | on | off | on | - -::: übung vb-binaer-zaehlen -titel: Counting in binary -auftrag: A for loop counts `number` from 0 to 7. For each number, each of the LEDs 0, 1 and 2 lights up green or is off, exactly as in the table. Then the mBot2 waits 1000 milliseconds. Always switch the LEDs in the order 0, 1, 2. -befehle: ledColor 0 "off", ledColor 1 "off", ledColor 2 "off", pause 1000, ledColor 0 "green", ledColor 1 "off", ledColor 2 "off", pause 1000, ledColor 0 "off", ledColor 1 "green", ledColor 2 "off", pause 1000, ledColor 0 "green", ledColor 1 "green", ledColor 2 "off", pause 1000, ledColor 0 "off", ledColor 1 "off", ledColor 2 "green", pause 1000, ledColor 0 "green", ledColor 1 "off", ledColor 2 "green", pause 1000, ledColor 0 "off", ledColor 1 "green", ledColor 2 "green", pause 1000, ledColor 0 "green", ledColor 1 "green", ledColor 2 "green", pause 1000 -braucht: forSchleife, verzweigung -tipp: Whether LED 0 is on is given by the remainder when dividing by 2: `number % 2 == 1`. For LED 1 you first divide by 2: `number / 2 % 2 == 1`. For LED 2 by 4: `number / 4 % 2 == 1`. -tipp: The loop contains three branches and then **wait a moment**. In the true branch, for example, `mbot.led(0).setColor("green")`, in the false branch `mbot.led(0).setColor("off")`. -lösung: vb-binaer-zaehlen-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/dreieck.md b/web/lessons/en/visubot/aufgaben/dreieck.md deleted file mode 100644 index 023af1f2..00000000 --- a/web/lessons/en/visubot/aufgaben/dreieck.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -titel: The triangle -nach: 2 -stufe: 1 ---- - -For the square the mBot2 turns four times by 90°. Together that is 360°, one full turn. For a triangle it also turns all the way around once, but in only three corners. - -Inside the brackets of **turn right** you can write how far it should turn: `mbot.turnRight(45)` turns only 45°. - -::: übung vb-dreieck -titel: The triangle -auftrag: Let the mBot2 drive a triangle with three sides of equal length. Each side is 30 cm long. Use a loop. -fahrt: 3 x (forward 30, turnRight 120) -braucht: forSchleife -tipp: How many degrees must one corner be so that three corners add up to a full turn (360°)? -tipp: In the loop the mBot2 drives one side and then turns by 120°. -lösung: vb-dreieck-loesung.visustruct -::: - -::: angeberwissen -The idea of drawing shapes with a driving robot is more than 50 years old: the language **Logo** was created in the late 1960s. Children used it to steer a "turtle" that rolled across paper with a pen. -::: diff --git a/web/lessons/en/visubot/aufgaben/einparken.md b/web/lessons/en/visubot/aufgaben/einparken.md deleted file mode 100644 index b56d719a..00000000 --- a/web/lessons/en/visubot/aufgaben/einparken.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -titel: Reverse parking -nach: 16 -stufe: 2 ---- - -To the right of the road there are parked cars (the blocks). Somewhere there is a gap, and right in front of it a blue marking is stuck on the road. The mBot2 looks for the gap and reverses into it, like a car. - -It has no sensor at the back. So it looks forward at the wall opposite: the further it reverses into the gap, the bigger the distance to that wall gets. - -::: übung vb-einparken -titel: Reverse parking -auftrag: The mBot2 drives forward in steps of 10 cm until it is on blue. Then it turns left, so its rear points to the gap. It reverses as long as the distance to the wall in front of it is below 45 cm. Finally the LEDs light up green and it shows **Parked!**. There are two roads with different gaps. -welt: parken-1 -> ledOn, screen "Parked!" -welt: parken-2 -> ledOn, screen "Parked!" -braucht: whileSchleife -tipp: Two while loops one after the other: first `!mbot.getColor().equals("blue")` with `mbot.forward()` inside, then `mbot.getDistance() < 45` with `mbot.backward()` inside. In between is `mbot.turnLeft()`. -tipp: At the end: `mbot.setLed(0, 255, 0)` and `mbot.showText("Parked!")`. -lösung: vb-einparken-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/hindernis.md b/web/lessons/en/visubot/aufgaben/hindernis.md deleted file mode 100644 index b04b37a2..00000000 --- a/web/lessons/en/visubot/aufgaben/hindernis.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -titel: Avoid obstacles -nach: 16 -stufe: 2 ---- - -On the way to the red field there are blocks in the way. The mBot2 drives forward in steps of 10 cm. If a block shows up (closer than 20 cm), it warns with light and sound and drives around it: turn right, 30 cm forward, turn left. Then it carries on straight ahead. - -::: übung vb-hindernis -titel: Avoid obstacles -auftrag: The mBot2 drives as long as it is not on red. If a block is closer than 20 cm, the LEDs light up orange (`mbot.setLed(255, 128, 0)`), it beeps and drives around it. Then the LEDs go off. Otherwise it drives forward 10 cm. There are two worlds. -welt: hindernis-1 -> tone -welt: hindernis-2 -> tone -braucht: whileSchleife, verzweigung -tipp: On the outside a while loop with `!mbot.getColor().equals("red")`, inside a branch with `mbot.getDistance() < 20`. -tipp: In the true branch: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. In the false branch: `mbot.forward()`. -lösung: vb-hindernis-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/knight-rider.md b/web/lessons/en/visubot/aufgaben/knight-rider.md deleted file mode 100644 index 4de63316..00000000 --- a/web/lessons/en/visubot/aufgaben/knight-rider.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: Knight Rider -nach: 15 -stufe: 2 ---- - -In the TV series “Knight Rider”, the talking car KITT has a red light at the front that keeps running back and forth. You rebuild it with the five LEDs. - -::: übung vb-knight-rider -titel: Knight Rider -auftrag: A red light runs from LED 0 to LED 4 and back to LED 1. Each LED lights up for 100 milliseconds and then goes off. Use two for loops: one counts up, one counts down. -befehle: ledColor 0 "red", pause 100, ledColor 0 "off", ledColor 1 "red", pause 100, ledColor 1 "off", ledColor 2 "red", pause 100, ledColor 2 "off", ledColor 3 "red", pause 100, ledColor 3 "off", ledColor 4 "red", pause 100, ledColor 4 "off", ledColor 3 "red", pause 100, ledColor 3 "off", ledColor 2 "red", pause 100, ledColor 2 "off", ledColor 1 "red", pause 100, ledColor 1 "off" -braucht: forSchleife -tipp: The first loop counts `i` up from 0 to 4. The second starts at 3 and counts down with `i--` as long as `i > 0`. -tipp: In both loops: `mbot.led(i).setColor("red")`, `mbot.pause(100)`, `mbot.led(i).setColor("off")`. -lösung: vb-knight-rider-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/labyrinth.md b/web/lessons/en/visubot/aufgaben/labyrinth.md deleted file mode 100644 index f2c6f0ae..00000000 --- a/web/lessons/en/visubot/aufgaben/labyrinth.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -titel: The maze -nach: 5 -stufe: 2 ---- - -The mBot2 is standing in a maze. The goal is a black square with a green flag. The corridors are 30 cm wide. - -A simple rule gets it through: **If the way ahead is free, drive forward. Otherwise turn right. If there is a wall there too, turn all the way around.** - -How does the mBot2 notice that it has reached the goal? The line sensor underneath sees the black square: `mbot.getLine()` is then no longer `0`. - -::: übung vb-labyrinth -titel: The maze -auftrag: Program the mBot2 so that it finds the goal in both mazes without bumping into a wall. -welt: labyrinth-1, labyrinth-2 -braucht: whileSchleife, verzweigung -tipp: On the outside a while loop with the condition `mbot.getLine() == 0`. It runs until the mBot2 is on the goal. -tipp: Inside the loop a branch `mbot.getDistance() > 15`: yes → `mbot.forward()`. No → `mbot.turnRight()`, then another branch `mbot.getDistance() < 15` with `mbot.turnRight(180)`. -lösung: vb-labyrinth-loesung.visustruct -::: - -::: angeberwissen -With the rule "always keep one hand on the wall" you get out of any maze whose walls are all connected. The ancient Greeks already told of Theseus, who found his way through the Minotaur's labyrinth with a ball of thread. -::: diff --git a/web/lessons/en/visubot/aufgaben/linienfolger-stopp.md b/web/lessons/en/visubot/aufgaben/linienfolger-stopp.md deleted file mode 100644 index 7448d39f..00000000 --- a/web/lessons/en/visubot/aufgaben/linienfolger-stopp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Line follower with stop -nach: 20 -stufe: 3 ---- - -The mBot2 follows a black line and stops at the red field at its end. - -For this it steps on the gas with **wheels separately**: `mbot.drive(40, 40)` turns both wheels equally fast, it keeps driving straight ahead until another driving command comes. `mbot.drive(10, 40)` makes a left curve, `mbot.drive(40, 10)` a right curve. `mbot.stop()` stops it. - -You ask the two middle probes of the line sensor with `mbot.isLineLeft()` and `mbot.isLineRight()`. If both see the line, it drives straight ahead. If only the left one sees it, it steers left, if only the right one sees it, right. - -::: übung vb-linienfolger-stopp -titel: Line follower with stop -auftrag: As long as the mBot2 is not on red, it follows the line. Then it stops. In the second world the line winds about. -welt: linie-rot-1, linie-rot-2 -braucht: whileSchleife, verzweigung -tipp: On the outside a while loop with `!mbot.getColor().equals("red")`, after it **stop**. -tipp: Inside the loop: if `mbot.isLineLeft() && mbot.isLineRight()`, then `mbot.drive(40, 40)`. Otherwise, if `mbot.isLineLeft()`, then `mbot.drive(10, 40)`. Otherwise, if `mbot.isLineRight()`, then `mbot.drive(40, 10)`. -lösung: vb-linienfolger-stopp-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/morsen.md b/web/lessons/en/visubot/aufgaben/morsen.md deleted file mode 100644 index b2cb503b..00000000 --- a/web/lessons/en/visubot/aufgaben/morsen.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: Morse code -nach: 15 -stufe: 2 ---- - -Ships used to send messages with light, in **Morse code**: every letter is made of short and long signals. The best-known distress call is **SOS**: S is three short, O is three long. - -::: übung vb-morsen -titel: Morse SOS -auftrag: LED 2 sends SOS in white. Short means: on for 200 milliseconds, then off for 200. Long means: on for 600 milliseconds, then off for 200. Between the letters the mBot2 waits another 400 milliseconds. Use a loop for each letter. -befehle: 3 x (ledColor 2 "white", pause 200, ledColor 2 "off", pause 200), pause 400, 3 x (ledColor 2 "white", pause 600, ledColor 2 "off", pause 200), pause 400, 3 x (ledColor 2 "white", pause 200, ledColor 2 "off", pause 200) -braucht: forSchleife -tipp: Three for loops one after the other, each runs three times. Between them there is **wait a moment** with 400. -tipp: In the first and third loop: `mbot.led(2).setColor("white")`, `mbot.pause(200)`, `mbot.led(2).setColor("off")`, `mbot.pause(200)`. In the middle one it waits 600 after switching on. -lösung: vb-morsen-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/nachtwaechter.md b/web/lessons/en/visubot/aufgaben/nachtwaechter.md deleted file mode 100644 index 163444f0..00000000 --- a/web/lessons/en/visubot/aufgaben/nachtwaechter.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -titel: The night watchman -nach: 18 -stufe: 1 ---- - -The mBot2 is a night watchman. As long as it is dark (brightness below 20), it goes on patrol: 30 cm forward and then turn around. As soon as it gets light, its shift is over: it shows **Zzz** on its screen and sleeps. - -::: übung vb-nachtwaechter -titel: The night watchman -auftrag: As long as the brightness is below 20, the mBot2 drives forward 30 cm and turns by 180°. Then it shows **Zzz** on its screen. -messwerte: getBrightness=5/80 -> drives, screen "Zzz" -messwerte: getBrightness=80 -> none, screen "Zzz" -braucht: whileSchleife -tipp: A while loop with `mbot.getBrightness() < 20`. Inside `mbot.forward(30)` and `mbot.turnRight(180)`. -tipp: After the loop is `mbot.showText("Zzz")`. -lösung: vb-nachtwaechter-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/slalom.md b/web/lessons/en/visubot/aufgaben/slalom.md deleted file mode 100644 index 4a57c373..00000000 --- a/web/lessons/en/visubot/aufgaben/slalom.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Four cones stand in a row in front of the mBot2. It drives a slalom: past the first cone on the top side, past the second on the bottom side, then top and bottom again. Behind the last cone is the goal. - -In this world one square is 30 cm, as wide as the mBot2. One step from square to square is therefore `mbot.forward(30)`. - -::: übung vb-slalom -titel: Slalom -auftrag: Drive the slalom to the goal without touching a cone. Use a loop. -welt: slalom -braucht: forSchleife -tipp: First think about how the mBot2 drives around a single cone on the top side: afterwards it is two squares further along in the same row and faces right again. -tipp: Around the bottom works the same way, only with left and right swapped. "Top, then bottom" repeats twice. -lösung: vb-slalom-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/spirale.md b/web/lessons/en/visubot/aufgaben/spirale.md deleted file mode 100644 index 3e12caf4..00000000 --- a/web/lessons/en/visubot/aufgaben/spirale.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: The spiral -nach: 2 -stufe: 2 ---- - -The mBot2 should drive a square spiral: the first side is 10 cm long, the second 20 cm, the third 30 cm and so on. After each side it turns right. - -You can also use the counter variable of a for loop inside the loop, for example in the brackets of **drive forward**. A calculation is allowed there too, such as `mbot.forward(i * 5)`. - -::: übung vb-spirale -titel: The spiral -auftrag: Let the mBot2 drive a spiral with 8 sides: 10 cm, 20 cm, 30 cm … up to 80 cm. After each side it turns right. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight, forward 50, turnRight, forward 60, turnRight, forward 70, turnRight, forward 80, turnRight -braucht: forSchleife -tipp: Let the counter variable run from 1 to 8. How long is the side in each pass then? -tipp: The brackets of **drive forward** contain a calculation with the counter variable. -lösung: vb-spirale-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/treppe.md b/web/lessons/en/visubot/aufgaben/treppe.md deleted file mode 100644 index 8d267f08..00000000 --- a/web/lessons/en/visubot/aufgaben/treppe.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -titel: The staircase -nach: 2 -stufe: 1 ---- - -The mBot2 climbs a staircase, seen from above: each step is 20 cm deep and 20 cm wide. - -::: übung vb-treppe -titel: The staircase -auftrag: Let the mBot2 drive three steps. One step: 20 cm forward, turn left, 20 cm forward, turn right. Use a loop. -fahrt: 3 x (forward 20, turnLeft, forward 20, turnRight) -braucht: forSchleife -tipp: Write down one step first. Then put it into a for loop that runs three times. -tipp: Inside the loop: `mbot.forward(20)`, `mbot.turnLeft()`, `mbot.forward(20)`, `mbot.turnRight()`. -lösung: vb-treppe-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/tunnel.md b/web/lessons/en/visubot/aufgaben/tunnel.md deleted file mode 100644 index 07b10c85..00000000 --- a/web/lessons/en/visubot/aufgaben/tunnel.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: The tunnel finder -nach: 5 -stufe: 3 ---- - -The mBot2 should stop in the first **tunnel square**: a square with a wall on the left **and** a wall on the right. Squares with only one wall don't count. In the simulation the right square is light green, but the line sensor can't see it. - -The ultrasonic sensor only looks forward. To look left, the mBot2 turns left, measures and turns back again. - -You remember the measured value in a **variable**, for example with a statement `left = mbot.getDistance()`. At the start you create it: `int left = 99`. - -::: übung vb-tunnel -titel: The tunnel finder -auftrag: Program the mBot2 so that it stops in the first tunnel square in both worlds. One square is 30 cm. -welt: tunnel-1, tunnel-2 -braucht: doUntilSchleife -tipp: In each pass the mBot2 drives one square forward and then looks left and right. Remember both distances in variables. At the end it faces forward again. -tipp: A loop that drives first and checks afterwards fits here. It keeps going as long as at least 20 cm are free on the left **or** on the right: `left >= 20 || right >= 20`. -lösung: vb-tunnel-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/aufgaben/wald.md b/web/lessons/en/visubot/aufgaben/wald.md deleted file mode 100644 index 723c87c2..00000000 --- a/web/lessons/en/visubot/aufgaben/wald.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -titel: Clover in the forest -nach: 5 -stufe: 2 ---- - -The goal is straight ahead. There are trees on the way, but never two directly behind each other. If a tree stands in front of the mBot2, it drives around it and then continues straight ahead. - -One square is 30 cm. If there is a tree in the next square, the ultrasonic sensor measures less than 20 cm. - -::: übung vb-wald -titel: Clover in the forest -auftrag: In both worlds the mBot2 should drive to the goal and go around every tree without bumping into it. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: As in "Drive to the goal", a loop on the outside runs until the line sensor sees the goal. In each pass there are two possibilities: tree ahead or free. -tipp: Around a tree: turn left, one square forward, turn right, two squares forward, turn right, one square forward, turn left. -lösung: vb-wald-loesung.visustruct -::: diff --git a/web/lessons/en/visubot/nachschlagen.md b/web/lessons/en/visubot/nachschlagen.md deleted file mode 100644 index 30265fe0..00000000 --- a/web/lessons/en/visubot/nachschlagen.md +++ /dev/null @@ -1,168 +0,0 @@ -## 🤖 mBot2 commands - -A command tells the mBot2 what to **do**. Every command starts with `mbot.` and ends with brackets. Often you write a number in the brackets. - -### 🚗 Driving and turning {.bot-fahren} - -The mBot2 drives straight or turns on the spot. - -``` -mbot.forward() drives 10 cm forward -mbot.forward(30) drives 30 cm forward -mbot.forward(2, "rotations") the wheels turn twice (≈ 41 cm) -mbot.backward(1, "rotations") one wheel rotation back (≈ 20 cm) -mbot.backward(20) drives 20 cm back -mbot.turnRight() turns to the right (90°) -mbot.turnLeft() turns to the left (90°) -mbot.turnLeft(45) turns just a little to the left (45°) -mbot.turnRight(180) turns all the way round -``` - -> `forward` and `backward` are **overloaded**: same name, different parameters. Units are `"cm"` and `"rotations"`. One wheel rotation is about 20.4 cm. - -> Without a number it drives 10 cm or turns 90°. 90° is a right angle, like the corner of a sheet of paper. - -> For a polygon it turns all the way round once in total: triangle 3 × 120°, square 4 × 90°, hexagon 6 × 60°. - -### ⚙️ Wheels separately {.bot-fahren} - -Here you give each wheel gas yourself. The numbers are percent: 100 is full gas, 0 is standing still, a number with a minus drives backwards. The mBot2 keeps going until another driving command comes. - -``` -mbot.drive(40, 40) both wheels the same: straight ahead -mbot.drive(10, 40) left slower: curve to the left -mbot.drive(40, -40) one wheel forward, one back: it turns -mbot.stop() stops -``` - -### 💡 Light {.bot-licht} - -The mBot2 has five LEDs with the numbers 0 to 4. - -``` -mbot.setLed(255, 0, 0) all LEDs light up red -mbot.ledOff() all LEDs off -mbot.led(0).setColor("green") only LED 0 lights up green -mbot.led(0).setColor("off") only LED 0 off -``` - -With `setLed` you mix red, green and blue, each from 0 (off) to 255 (very bright). - -### 🔊 Sound {.bot-ton} - -``` -mbot.playTone(440, 300) plays a tone -``` - -The first number is the pitch. The bigger, the higher. The second number is the length in milliseconds (1000 milliseconds are 1 second). - -### 🖥️ Screen {.bot-anzeige} - -``` -mbot.showText("Hello") shows Hello on the screen -``` - -With `+` you join text and numbers: `mbot.showText("Distance: " + mbot.getDistance())`. - -### 😊 Emotions {.bot-anzeige} - -The mBot2 shows a feeling with light, sound and wiggling. You only see it on the real mBot2. - -``` -mbot.emotion("smile") laughs -mbot.emotion("sad") is sad -mbot.emotion("wow") is amazed -``` - -More feelings: hello, yeah, proud, yummy, naughty, uh_oh, hurt, angry, startle, shiver, dizzy, sleepy, zzz, wake_up, blink, yes, no, look_up, look_down, look_left, look_right, look_around - -### ⏱️ Waiting and stopwatch {.bot-warten} - -``` -mbot.pause(1000) waits 1 second -mbot.resetTimer() sets the stopwatch to 0 -``` - -You read the stopwatch time with the sensor `mbot.getTimer()` (below under **Stopwatch and battery**). - -## 📡 mBot2 sensors - -A sensor **measures** something and gives you a value back. You use the value in a condition, for example in a loop or a branch. Some sensors give a **number**, some **true or false**, one gives a **text**. - -### 📏 Distance {.bot-sensor} - -The ultrasonic sensor at the front measures how far away the next wall is, in centimetres. - -``` -mbot.getDistance() distance in cm, e.g. 25 -mbot.getDistance() > 15 is there more than 15 cm free ahead? -int distance = mbot.getDistance() remember the distance in a variable -``` - -### ➖ Line {.bot-sensor} - -Under the mBot2 there are four probes. They see whether the floor is black. - -``` -mbot.getLine() number: 0 means no probe sees black -mbot.getLine() == 0 no black, keep driving -mbot.getLine() != 0 a probe sees black -mbot.isLineLeft() does the left middle probe see black? -mbot.isLineRight() does the right middle probe see black? -``` - -### 🎨 Colours {.bot-sensor} - -The same sensor underneath also recognises colours. `mbot.getColor()` gives you the name of the colour as text: `"red"`, `"green"`, `"blue"`, `"yellow"`, `"white"` or `"black"`. - -``` -mbot.getColor().equals("red") is it standing on red? -!mbot.getColor().equals("red") is it not standing on red? -``` - -> You compare texts with `.equals(…)`, not with `==`. The `!` in front means **not**. - -### 🕹️ Buttons and joystick {.bot-sensor} - -On the CyberPi there are the buttons A and B and a small joystick. Each sensor says **true** while it is being pressed. - -``` -mbot.isButtonA() is button A pressed? -mbot.isButtonB() is button B pressed? -mbot.isJoystickUp() joystick pushed up? -mbot.isJoystickDown() joystick pushed down? -mbot.isJoystickLeft() joystick pushed left? -mbot.isJoystickRight() joystick pushed right? -``` - -### 🔆 Light and loudness {.bot-sensor} - -``` -mbot.getBrightness() how bright? 0 is dark, 100 is bright -mbot.getLoudness() how loud? 0 is silent, 100 is loud -``` - -### 📐 Tilt and shaking {.bot-sensor} - -``` -mbot.getPitch() tipped forward or back? (in degrees) -mbot.getRoll() tipped to the side? (in degrees) -mbot.isShaken() is it being shaken? -``` - -> When the mBot2 lies flat, both tilts are 0. In the simulation you set these values under **🎛 Try the sensors**. - -### 🔋 Stopwatch and battery {.bot-sensor} - -``` -mbot.getTimer() seconds since the start or since resetTimer() -mbot.getBattery() how full is the battery? (in percent) -``` - -### Real mBot2 - -With **🔌 mBot2** next to "Start simulation" you connect the real robot with the USB cable. This only works in Chrome or Edge. Then it drives every step of the simulation along, and the sensors measure real values. A second click disconnects it again. - -### Driving without a cable - -With **⬆ Upload** you save your program on the mBot2. Then unplug the cable, put the mBot2 at the start and press **button A**: it drives your program on its own. It stays saved until you upload a new one. Keyboard inputs do not work on the mBot2. diff --git a/web/lessons/pt/01-was-ist-ein-struktogramm.md b/web/lessons/pt/01-was-ist-ein-struktogramm.md deleted file mode 100644 index 97894452..00000000 --- a/web/lessons/pt/01-was-ist-ein-struktogramm.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -titel: O que é um estrutograma? -bereich: Primeiros passos -kurz: Mostrar e ler algoritmos como uma série de passos claros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o que é um algoritmo -- ler um estrutograma -- reconhecer os três blocos básicos: sequência, decisão e ciclo -::: - -## Um algoritmo é uma instrução exata - -Um **algoritmo** descreve passo a passo como resolver uma tarefa. Cada passo tem de ser tão claro que qualquer um o consiga executar sem perguntar, tanto uma pessoa como um computador. - -Conheces algoritmos do dia a dia: uma receita, o caminho para um sítio ou as instruções para montar um roupeiro. - -::: diagramm l1-tee.visustruct -Fazer chá como estrutograma: cada bloco é um passo. -::: - -::: angeberwissen -Méééé, quem escreveu o primeiro programa? Uma mulher, já em 1843, muito antes do primeiro computador! **Ada Lovelace** descreveu passo a passo como a *Analytical Engine* (Máquina Analítica) de Charles Babbage devia calcular os chamados números de Bernoulli. Era um verdadeiro algoritmo para uma máquina. As instruções deviam ficar guardadas em cartões perfurados (mais sobre isto na lição 3). Mas a máquina nunca chegou a ser construída. - -A Ada teve ainda outra ideia genial: uma máquina destas consegue fazer mais do que contas. Também podia trabalhar com letras, símbolos ou até música. É exatamente isso que os computadores fazem hoje. Em sua honra, há uma linguagem de programação chamada **Ada**. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), matemática (imagem: aguarela de Alfred Edward Chalon, por volta de 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), domínio público). -::: - -## Como se lê um estrutograma - -Um estrutograma lê-se **de cima para baixo**. Cada bloco é um passo. Só quando um passo termina é que começa o seguinte. - -Esta forma de desenhar foi inventada por **Isaac Nassi e Ben Shneiderman** (1973). Por isso também se chama diagrama de Nassi-Shneiderman. Na Alemanha está normalizado como DIN 66261. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -À esquerda: Isaac “Ike” Nassi (foto: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/), recortada), à direita: Ben Shneiderman (foto: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> Um estrutograma tem sempre exatamente um início (em cima) e um fim (em baixo). Não há setas nem saltos para todo o lado. Programas que saltam para todo o lado chamam-se **código esparguete**, porque o seu fluxo se enrola como massa no prato. Mais sobre isto na próxima lição. - -::: angeberwissen -Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Universidade de Stony Brook, perto de Nova Iorque. Shneiderman tinha uns 25 anos e Nassi uns 23. Ou seja, dois estudantes que escreveram história da informática nas horas vagas. -::: - -## Bloco básico 1: a sequência - -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: **sequência**, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los: as [instruções]{.gelb} são amarelas, as decisões azuis, os ciclos cor-de-rosa. A sequência não tem cor própria, é simplesmente a fila de instruções umas por baixo das outras. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. - -A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. - -É assim que se parece: - -- Cada instrução é um **retângulo simples**. -- Os retângulos ficam **uns por cima dos outros**, sem espaço entre eles. -- São executados de cima para baixo, uma instrução depois da outra. - -::: diagramm l1-sequenz.visustruct -Quatro instruções em sequência. Primeiro levantas-te, depois lavas os dentes, e assim por diante. -::: - -> O exemplo do chá lá em cima também é uma sequência. - -::: angeberwissen -15 minutos! Foi o tempo de que Shneiderman precisou para o primeiro esboço com sequência, decisão e ciclo. Eu preciso de mais tempo do que isso para escolher entre feno e trevo. -::: - -## Bloco básico 2: a decisão - -Muitas vezes o passo seguinte depende de uma **condição**. Uma condição é uma pergunta a que só se pode responder com **sim ou não**, por exemplo *Está a chover?* No VisuStruct, sim é **true** e não é **false**. - -Para decisões destas existe a **decisão**. É assim que se parece: - -- Em cima, a condição fica dentro de um **triângulo**. -- Por baixo, o bloco divide-se em **duas colunas**: à esquerda o ramo para **true**, à direita o ramo para **false**. -- Só é executado **um** dos dois ramos. Depois, os dois ramos continuam juntos por baixo da decisão. - -::: diagramm l1-verzweigung.visustruct -Se estiver a chover, é executado o ramo da esquerda, senão o da direita. Depois, os dois casos continuam com “Sair”. -::: - -> Se num dos casos não deve acontecer nada, esse ramo fica vazio. O sinal **ø** indica isso. - -::: angeberwissen -Alerta de ortografia! Escreve-se Shneiderman, sem c. Quem escrever “Schneiderman” leva um empurrãozinho dos meus chifres. Ele próprio conta que as pessoas estão sempre a meter um c no nome dele. -::: - -## Bloco básico 3: o ciclo - -Se uma coisa deve acontecer **várias vezes**, não a escreves várias vezes. Em vez disso usas um **ciclo**, também chamado repetição. - -É assim que se parece: - -- Em cima está a condição, por exemplo *Prato não vazio*. -- Os passos que se repetem ficam **recuados** por baixo dela. Em cima e à esquerda, o bloco forma um **L invertido** à volta deles. -- Antes de cada iteração, a condição é verificada. Enquanto for **true**, os passos dentro do L invertido são executados mais uma vez. Se for **false**, o programa continua por baixo do ciclo. - -::: diagramm l1-wiederholung.visustruct -Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levantado. -::: - -> Há mais tipos de ciclos. Vais conhecê-los nas próximas lições. - -## Os três juntos - -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma sequência de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são [instruções]{.gelb} simples. As instruções dentro de uma decisão ou de um ciclo também são amarelas. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. - -::: diagramm l1-grundbausteine.visustruct -Reconheces a decisão pelo triângulo e o ciclo pelo L invertido. Tudo junto forma uma sequência. -::: - -Os blocos também podem ser **encaixados** uns dentro dos outros: um ciclo ou um ramo pode voltar a conter sequências, decisões e ciclos. - -::: angeberwissen -Consolo para quem correu mal um teste: a famosa revista *Communications of the ACM* rejeitou o artigo sobre estrutogramas. Segundo Nassi, o revisor até disse que deviam juntar todas as cópias e queimá-las. Ai! O artigo saiu em 1973 numa revista mais pequena e hoje é citado milhares de vezes. Ha! -::: - -## Primeiro a estrutura, depois o código - -Quando programas, acontecem duas coisas ao mesmo tempo: tens de pensar nos passos e prestar atenção à forma como a linguagem de programação se escreve. Um estrutograma permite-te separar as duas coisas. - -1. Primeiro pensas na **lógica**: que passos, que condições, que repetições? -2. Depois traduzes a estrutura pronta para **Java, Python ou JavaScript**. O VisuStruct até consegue gerar o código por ti. - -Com a **simulação** também podes executar o teu estrutograma passo a passo e verificar se ele faz mesmo o que deve. - -## Jogo: Que bloco básico? - -::: spiel frage -titel: Jogo: Que bloco básico? -intro: O Ludwig descreve coisas do seu dia a dia. Que bloco básico se esconde em cada uma? Oito rondas. -antworten: sequência | decisão | ciclo - -runde: -frage: "Pasta na escova, lavar os dentes, bochechar." -richtig: sequência -> Três passos, cada um exatamente uma vez e sempre por esta ordem. - -runde: -frage: "Se chover, levo o guarda-chuva, senão os óculos de sol." -richtig: decisão -> Uma condição decide qual dos dois caminhos é seguido. - -runde: -frage: "Mexer até a massa ficar lisa." -richtig: ciclo -> Mexe-se repetidamente enquanto a massa ainda não estiver lisa. - -runde: -frage: "Correr dez voltas ao campo de desporto." -richtig: ciclo -> A mesma volta é corrida dez vezes. - -runde: -frage: "Calçar os sapatos, vestir o casaco, abrir a porta, e lá vamos." -richtig: sequência -> Um passo a seguir ao outro, nada é saltado nem repetido. - -runde: -frage: "Se o semáforo estiver verde, atravessas a rua." -richtig: decisão -> Mesmo sem "senão" é uma decisão. O ramo senão fica simplesmente vazio. - -runde: -frage: "Lançar o dado até sair um seis." -richtig: ciclo -> Não se sabe antes quantas vezes. Lança-se até a condição se cumprir. - -runde: -frage: "Se alguém disser 'Entra', entras. Senão, esperas à porta." -richtig: decisão -> A resposta decide entre dois caminhos: entrar ou esperar. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o que é um algoritmo. → Um algoritmo é uma instrução exata -- Consigo ler um estrutograma de cima para baixo. → Como se lê um estrutograma -- Consigo nomear os três blocos básicos: sequência, decisão e ciclo. → Bloco básico 1: a sequência -- Consigo reconhecer cada bloco básico num estrutograma pela sua forma. → Os três juntos -::: - -## Teste de conhecimentos - -::: quiz -? Em que direção se lê um estrutograma? -→ Como se lê um estrutograma -- [ ] Da esquerda para a direita -- [x] De cima para baixo -- [ ] De baixo para cima -> Cada bloco é um passo, e os passos seguem-se de cima para baixo. - -? Qual destes NÃO é um dos três blocos básicos? -→ Bloco básico 1: a sequência -- [ ] Sequência -- [ ] Decisão -- [x] Salto -- [ ] Ciclo -> Num estrutograma não há saltos. Sequência, decisão e ciclo chegam para qualquer algoritmo. - -? Como reconheces uma decisão num estrutograma? -→ Os três juntos -- [ ] Por um L invertido -- [x] Por um triângulo com a condição e duas colunas por baixo -- [ ] Por vários retângulos uns por cima dos outros -> O L invertido pertence ao ciclo, e retângulos uns por cima dos outros são uma sequência. - -? Quando é que o interior de um ciclo é executado mais uma vez? -→ Os três juntos -- [x] Enquanto a condição for verdadeira -- [ ] Só se a condição for falsa -- [ ] Sempre exatamente duas vezes -> A condição é verificada antes de cada iteração. Se for falsa, o programa continua por baixo do ciclo. - -? O que é um algoritmo? -→ Um algoritmo é uma instrução exata -- [x] Instruções claras, passo a passo, para resolver uma tarefa -- [ ] Um determinado programa em Java -- [ ] Uma imagem que explica um programa -> Um algoritmo não depende de nenhuma linguagem de programação. Um estrutograma é uma forma de o escrever. -::: diff --git a/web/lessons/pt/01-weitere-darstellungen.md b/web/lessons/pt/01-weitere-darstellungen.md deleted file mode 100644 index b9f4ffd1..00000000 --- a/web/lessons/pt/01-weitere-darstellungen.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Fluxograma e pseudocódigo -bereich: Primeiros passos -kurz: Representar algoritmos como fluxograma e como pseudocódigo e compará-los com o estrutograma. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ler um fluxograma (em inglês *flowchart*) e construir um sozinho -- explicar porque é que os saltos num fluxograma levam a erros -- ler um algoritmo simples em pseudocódigo -::: - -## Outras formas de desenhar: o fluxograma - -Há mais duas formas de representar um algoritmo: o **fluxograma** e o **pseudocódigo**. Vais conhecer as duas nas aulas. Em inglês, o fluxograma chama-se **flowchart**. Esta palavra aparece muitas vezes, por exemplo em programas e na internet. - -Aqui vês outra vez o nosso estrutograma para beber chá da última lição. A seguir vamos ver o fluxograma, com o mesmo exemplo. - -::: diagramm l1-grundbausteine.visustruct -O exemplo do chá como estrutograma: primeiro a chávena, depois a decisão para o açúcar e depois o ciclo. -::: - -### O mesmo algoritmo como fluxograma - -::: grafik l01-pap.svg -O exemplo do chá como fluxograma. A seta de “Esperar 1 minuto” para cima forma o ciclo. -::: - -### Os símbolos - -Um fluxograma é feito de poucos símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). - -- **Oval:** início ou fim. Cada fluxograma tem exatamente um início e um fim. -- **Retângulo:** uma instrução, por exemplo *Pôr uma chávena na mesa*. -- **Losango:** uma decisão. No losango está uma pergunta, e dele saem duas setas: **sim** e **não**. -- **Paralelogramo:** uma entrada ou saída. No exemplo do chá não aparece. -- **Seta:** mostra qual é o passo seguinte. - -Um ciclo não tem símbolo próprio no fluxograma. Reconheces um ciclo por uma seta que volta **para cima**. - -### As vantagens - -- **Muito fácil de ler**, mesmo para quem nunca viu um fluxograma. Basta seguir as setas com o dedo. -- Os fluxogramas não se usam só na programação, mas em todo o lado onde se explica um processo: em manuais de instruções, na procura de avarias (“A lâmpada acende? Não: a ficha está ligada?”) ou nas empresas para os processos de trabalho. - -## Exercício: Fazer um bolo como fluxograma - -Agora és tu que constróis um fluxograma. O Ludwig faz um bolo assim: - -Põe os ingredientes na tigela e mexe a massa. Se a massa ainda não estiver lisa, continua a mexer. Quando está lisa, deita a massa na forma e coze o bolo durante 30 minutos. Depois testa com um palito: se ainda tiver massa agarrada, coze mais 5 minutos e testa outra vez. Quando o palito sai limpo, tira o bolo e diz: “O bolo está pronto!” - -::: pap -titel: Exercício: Fazer um bolo como fluxograma -auftrag: Os lugares no fluxograma estão vazios. Põe cada elemento no seu lugar. A forma do lugar ajuda-te. -start: Início -anweisung: Pôr os ingredientes na tigela -anweisung: Mexer a massa -frage: Massa lisa? | nein -> Mexer a massa -anweisung: Deitar a massa na forma -anweisung: Cozer 30 minutos -frage: Palito limpo? | nein: Cozer mais 5 minutos -anweisung: Tirar o bolo do forno -ausgabe: “O bolo está pronto!” -ende: Fim -erklärung: Dois ciclos, duas setas para cima: ao mexer, a seta volta a “Mexer a massa”; ao cozer, vai de “Cozer mais 5 minutos” de volta à pergunta. A saída fica no paralelogramo. -legende: ja -::: - -**Desenhar os teus próprios fluxogramas:** Com o **VisuFlow** desenhas o teu fluxograma com toda a facilidade. Os símbolos estão prontos numa barra: tocar num acrescenta o símbolo seguinte e liga-o logo com uma seta. Para começar, podes carregar o exemplo do chá. Guardas o teu fluxograma como ficheiro e exportas como imagem ou PDF, por exemplo para o teu caderno ou uma apresentação. [Abrir o VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Desvantagens do fluxograma: saltos - -Uma seta num fluxograma pode ir de qualquer símbolo para qualquer outro. Parece prático, mas é perigoso. - -Antigamente, os programas escreviam-se exatamente assim. Cada linha tinha um **número**, e o comando **GOTO**, em português “ir para”, saltava para um número de linha. Cada IR PARA é uma seta do fluxograma. O nosso exemplo do chá ficava assim: - -``` -10 Pôr uma chávena na mesa -20 SE não quer açúcar, IR PARA 40 -30 Juntar açúcar -40 SE chá não demasiado quente, IR PARA 70 -50 Esperar 1 minuto -60 IR PARA 40 -70 Beber o chá -``` - -### Mais uma linha, e os saltos ficam errados - -Agora melhoras o algoritmo: depois do açúcar, o saquinho de chá deve sair. Acrescentas a nova linha 40, e todas as linhas abaixo avançam um número. Mas os saltos continuam a apontar para os números antigos: - -``` -10 Pôr uma chávena na mesa -20 SE não quer açúcar, IR PARA 40 -30 Juntar açúcar -40 Tirar o saquinho de chá -50 SE chá não demasiado quente, IR PARA 70 -60 Esperar 1 minuto -70 IR PARA 40 -80 Beber o chá -``` - -Experimenta: a linha 70 já não te manda para a verificação da linha 50, mas para o saquinho. E quando o chá já está frio o suficiente, a linha 50 salta para a linha 70 em vez de *Beber o chá*. Ou seja, tiras o saquinho vezes sem conta e nunca bebes. A cada alteração tens de verificar todos os IR PARA. Num programa grande, com centenas de saltos, é fácil algo correr mal. - -### Para todo o lado: código esparguete - -Com setas também se pode saltar do meio de um ciclo para fora, ou de fora para o meio de um ciclo. Estes saltos tornam o fluxograma confuso muito depressa. Com muitos saltos, as setas cruzam-se até o fluxograma parecer um prato de esparguete. Por isso chama-se **código esparguete**. Mal se consegue seguir o fluxo, e os erros escondem-se bem. - -Um estrutograma não tem setas. Se acrescentares um bloco, tudo o que está abaixo desce com ele, e nenhum salto pode apontar para o sítio errado. Para sair de um ciclo mais cedo existe lá um bloco próprio e arrumado, a interrupção. Vais conhecê-la na lição 18. - -::: angeberwissen -Em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”, ou seja, “o GOTO é considerado prejudicial”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, `goto` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. -::: - -## Pseudocódigo e comparação - -**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. Aqui também não há saltos. Este é o nosso exemplo do chá: - -``` -Pôr uma chávena na mesa -SE quer açúcar ENTÃO - Juntar açúcar -FIM SE -ENQUANTO chá ainda demasiado quente - Esperar 1 minuto -FIM ENQUANTO -Beber o chá -``` - -O pseudocódigo **não tem uma forma fixa**. Há quem escreva CASO em vez de SE, quem use uma seta para a atribuição (`numero ← 5`) ou quem não escreva as linhas FIM. Tudo isso é permitido. O importante é que qualquer pessoa o perceba sem explicação. Por isso, o pseudocódigo não é mais uma linguagem de programação que tens de aprender. - -::: angeberwissen -O pseudocódigo parece-te familiar? A linguagem de programação Python é muito parecida, e isso é de propósito: o seu criador, Guido van Rossum, queria que os programas se lessem quase como texto normal. O Python também usa a indentação para mostrar o que pertence junto. Mas atenção: o Python é uma linguagem de programação a sério, com regras fixas. Um espaço a mais e o computador reclama. O pseudocódigo é mais descontraído, tal como eu ao pequeno-almoço. -::: - -### Comparação - -- **Estrutograma:** blocos dentro de blocos, o ciclo é um L invertido. Vês a estrutura num relance, e saltos malucos são impossíveis. -- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos, e são possíveis saltos para todo o lado. -- **Pseudocódigo:** texto com indentação, o ciclo fica entre ENQUANTO e FIM ENQUANTO. Rápido de escrever e já perto do código de um programa. - -> Os três descrevem o mesmo algoritmo. Quando sabes ler uma das formas, aprendes as outras depressa. - -::: angeberwissen -Nassi e Shneiderman estavam em guerra com as setas! O artigo deles de 1973 chamava-se “Flowchart Techniques for Structured Programming”. Com setas pode-se saltar para todo o lado até o fluxograma parecer um prato de esparguete. Num estrutograma isso é simplesmente impossível. Mééé, é assim que eu gosto: arrumado, como o meu estábulo. -::: - -## Jogo: Que representação? - -::: spiel frage -titel: Jogo: Que representação? -intro: O Ludwig descreve uma forma de representar um algoritmo sem dizer o nome. É o estrutograma, o fluxograma ou o pseudocódigo? Oito rondas. -antworten: estrutograma | fluxograma | pseudocódigo - -runde: -frage: “Quando algo se repete, uma das minhas setas aponta de volta para cima.” -richtig: fluxograma -> No fluxograma, o ciclo não tem símbolo próprio. Uma seta volta para cima. - -runde: -frage: “O meu ciclo parece um L invertido.” -richtig: estrutograma -> A caixa envolve os passos repetidos em cima e à esquerda. - -runde: -frage: “Sou feito de palavras como SE e ENQUANTO, e a indentação mostra o que pertence a quê.” -richtig: pseudocódigo -> O pseudocódigo é texto em linguagem normal, organizado como um programa. - -runde: -frage: “A minha decisão é um losango com as saídas sim e não.” -richtig: fluxograma -> No estrutograma, a condição fica num triângulo. - -runde: -frage: “As minhas setas podem enrolar-se para todo o lado como esparguete.” -richtig: fluxograma -> Como as setas podem ir para qualquer lado, no fluxograma é possível haver código esparguete. - -runde: -frage: “Não tenho uma forma fixa de escrever. Também podes escrever CASO em vez de SE.” -richtig: pseudocódigo -> O importante é que qualquer pessoa o perceba sem explicação. - -runde: -frage: “A condição fica em cima num triângulo, e por baixo divido-me em duas colunas.” -richtig: estrutograma -> É assim que a decisão aparece no estrutograma: true à esquerda, false à direita. - -runde: -frage: “Se inserires uma caixa, tudo o que está por baixo desce também. Nenhum salto pode falhar.” -richtig: estrutograma -> O estrutograma não tem setas nem saltos, por isso nada pode apontar para o sítio errado. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo nomear os símbolos de um fluxograma e ler um fluxograma simples. → Outras formas de desenhar: o fluxograma -- Consigo construir sozinho um algoritmo simples como fluxograma. → Exercício: Fazer um bolo como fluxograma -- Consigo explicar porque é que os saltos com GOTO levam a erros e a código esparguete. → Desvantagens do fluxograma: saltos -- Consigo ler um algoritmo simples em pseudocódigo. → Pseudocódigo e comparação -::: - -## Teste de conhecimentos - -::: quiz -? Como reconheces um ciclo num fluxograma? -→ Outras formas de desenhar: o fluxograma -- [ ] Por um L invertido -- [x] Por uma seta que volta para cima -- [ ] Pela palavra ENQUANTO -> O L invertido pertence ao estrutograma, e ENQUANTO ao pseudocódigo. - -? Associa cada símbolo do fluxograma ao seu significado. -→ Outras formas de desenhar: o fluxograma -= Oval -> Início ou fim -= Retângulo -> Instrução -= Losango -> Decisão -= Paralelogramo -> Entrada ou saída -> O losango tem duas saídas: sim e não. - -? Como se diz fluxograma em inglês? -→ Outras formas de desenhar: o fluxograma -- [x] Flowchart -- [ ] Structure chart -- [ ] Pseudocode -> Structure chart é o estrutograma. - -? Acrescentas uma nova linha a um programa com GOTO. O que pode acontecer? -→ Desvantagens do fluxograma: saltos -- [x] Os saltos apontam para as linhas erradas, porque os números mudaram -- [ ] Nada, os saltos ajustam-se sozinhos -- [ ] O programa fica automaticamente mais rápido -> Cada IR PARA aponta para um número de linha fixo. Se as linhas descem, o programa salta para o sítio errado. - -? No pseudocódigo, o que mostra que linhas pertencem a um ciclo? -→ Pseudocódigo e comparação -- [ ] A cor -- [x] A indentação e o FIM ENQUANTO -- [ ] Uma seta -> Tudo o que está entre ENQUANTO e FIM ENQUANTO está recuado e é repetido. -::: diff --git a/web/lessons/pt/02-der-editor.md b/web/lessons/pt/02-der-editor.md deleted file mode 100644 index c3106415..00000000 --- a/web/lessons/pt/02-der-editor.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -titel: O editor -bereich: Primeiros passos -kurz: Inserir elementos, escrever texto, mover e eliminar. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- inserir um elemento da área Elementos e substituir um marcador -- alterar o texto de um bloco e mudar entre Instrução, Entrada e Saída -- mover, copiar e eliminar blocos e anular passos -::: - -## O ecrã - -O VisuStruct tem dois editores: o [editor de estrutogramas](#zeige-editor), de que trata esta lição, e à direita a área [Código](#zeige-codelive) para código Java (a partir da lição 4). Se o editor de estrutogramas estiver recolhido, esta lição abre-o sozinha. As palavras azuis mostram-te as áreas, mesmo que estejam recolhidas: passa o rato por cima de uma, e a área abre-se ao lado da área de aprendizagem e acende-se. Se clicares nela (ou tocares nela), fica aberta. - -O editor de estrutogramas tem várias áreas. Passa o rato por cima de uma palavra azul ou toca nela, e essa área acende-se no editor; as áreas recolhidas, como os Elementos, abrem-se. - -- **Mesmo em cima, a [barra de ferramentas](#zeige-leiste):** Novo, Abrir e Guardar. À direita, a roda dentada das [Definições](#zeige-einstellungen): tamanho do texto e idioma. -- **Por baixo, as [ferramentas](#zeige-werkzeuge)** por cima dos elementos e do estrutograma: Anular, Cortar, Copiar, Colar, Eliminar, Exportar, Código e Simulação. Os botões só mostram ícones. Se puseres o rato por cima de um, aparece o nome. -- **À esquerda, os [Elementos](#zeige-elemente):** Aqui estão todos os blocos que podes arrastar para o estrutograma. Há quem chame a esta área a paleta. -- **Ao meio, o [estrutograma](#zeige-struktogramm):** Um diagrama novo contém apenas um marcador vazio, assinalado com **ø**. -- **Em baixo, o [Inspetor de objetos](#zeige-objektinspektor):** Aqui editas o texto do elemento selecionado. Se for pequeno ou grande demais, arrasta a linha com a pega por cima dele para cima ou para baixo. - -> Podes recolher esta área de aprendizagem a qualquer momento com o [ícone da barra lateral](#zeige-lernen) no topo desta área. Fica só a barra estreita “🎓 Aprender” à esquerda; um clique abre-a de novo. Ela fica aberta ao lado do editor, para poderes experimentar logo o que lês. Da mesma forma, há à esquerda a coluna [📁 Ficheiros](#zeige-dateien) para os teus programas guardados (lição 3) e à direita a área [Código](#zeige-codelive) para Java (a partir da lição 4). - -## Inserir um elemento - -Arrasta um elemento da área **Elementos** para o estrutograma. Enquanto arrastas, uma linha azul mostra onde ele vai ficar: - -- **Sobre o marcador ø:** O elemento substitui o marcador. -- **Sobre a metade de cima de um bloco:** O elemento fica antes dele. -- **Sobre a metade de baixo de um bloco:** O elemento fica depois dele. - -::: grafik l02-einfuegen.svg -O sítio onde largas decide onde fica o novo elemento. -::: - -Também funciona sem arrastar: **clica** num elemento da área Elementos (ou toca nele). Ele é então inserido depois do bloco selecionado. Se o marcador **ø** estiver selecionado, substitui-o. - -Com o teclado, usa a tecla **Tab** para saltar para um elemento e prime **Enter**. O novo elemento também fica depois do bloco selecionado. - -::: angeberwissen -Agarrar blocos e arrastá-los de um lado para o outro, tal como estás a fazer agora, tem um nome pomposo: **manipulação direta**. Foi Ben Shneiderman quem inventou o termo em 1982. Sim, o senhor dos estrutogramas. Aquele homem trabalhava mais do que eu quando estou a pastar. -::: - -## Escrever texto - -Clica num bloco. Ele fica com um contorno azul, e o seu texto aparece no Inspetor de objetos por baixo do diagrama. O que escreveres lá aparece logo no diagrama. - -Mais rápido é fazer **duplo clique** no bloco, ou **toque duplo** no tablet. Assim escreves o texto diretamente no estrutograma. **Enter** aceita, **Esc** cancela. Com o teclado, seleciona o bloco e carrega em **Enter**. - -O bloco da área Elementos chama-se **Instrução**. Em cima, no Inspetor de objetos, escolhes de que tipo deve ser: - -- **Instrução:** calcular ou definir alguma coisa, p. ex. `int numero = 5`. Vais aprender como na lição 4. -- **Entrada:** pedir um valor enquanto o estrutograma é executado. Isso vem na lição 6. -- **Saída:** mostrar alguma coisa. No diagrama fica com `output:` à frente, p. ex. `output: "Olá"`. - -Para começar, só precisas de Saída. Os textos que devem aparecer exatamente como estão ficam entre **aspas**. - -::: diagramm l2-ausgabe.visustruct -Duas saídas, uma a seguir à outra. Abre o diagrama no editor e inicia a [simulação](#zeige-simulation) nas ferramentas para veres a saída. Vais conhecê-la melhor na lição 7. -::: - -## Mover, copiar, eliminar - -- **Mover:** Arrasta um bloco existente com o rato para um novo sítio. -- **Copiar e colar:** Seleciona um bloco e prime Ctrl+C e Ctrl+V (no Mac ⌘C e ⌘V). A cópia fica depois do bloco selecionado. Sem teclado, por exemplo no tablet, toca em **Copiar** e **Colar** nas [ferramentas](#zeige-werkzeuge). -- **Eliminar:** Seleciona um bloco e prime Del, ou clica no [caixote do lixo](#zeige-loeschen) „Eliminar seleção“ nas ferramentas. -- **Anular:** Ctrl+Z anula o último passo, Ctrl+Shift+Z refá-lo (no Mac ⌘Z e ⌘⇧Z). Sem teclado, toca em [Anular](#zeige-rueckgaengig) nas ferramentas. - -## Exercício: Olá Mundo - -::: übung l2-hallo -titel: Olá Mundo -auftrag: Constrói um estrutograma que mostre **Olá Mundo**. -Arrasta uma **Instrução** dos Elementos para o marcador **ø** e clica no bloco. No Inspetor de objetos, por baixo do estrutograma, há três botões em cima: Instrução, Entrada e Saída. Clica em **Saída**. Depois escreve `"Olá Mundo"` no campo de texto por baixo, com aspas. -test: - -> Olá Mundo -braucht: anweisung -tipp: Só precisas de um único bloco. O texto que deve aparecer vai para o campo de texto do Inspetor de objetos. -tipp: Atenção às aspas. Sem elas, o VisuStruct procura uma variável chamada Olá. -lösung: l2-hallo-loesung.visustruct -::: - -Clica em **Verificar** quando terminares. O VisuStruct executa o teu estrutograma e compara a saída. - -## Exercício: Duas linhas - -::: übung l2-zwei-zeilen -titel: Duas linhas -auftrag: Mostra primeiro **Olá** e depois **Estou a aprender estrutogramas**, cada um na sua linha. -test: - -> Olá | Estou a aprender estrutogramas -tipp: Duas linhas significa duas saídas. Os blocos ficam uns por cima dos outros e são executados de cima para baixo. -tipp: Cada saída é um bloco próprio. Arrasta a segunda Instrução para a metade de baixo da primeira. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Jogo: Profissional do editor - -::: spiel frage -titel: Jogo: Profissional do editor -intro: O Ludwig testa se dominas o editor. Sete rondas. - -runde: -frage: Arrastas uma instrução para o marcador **ø**. O que acontece? -- [x] A instrução substitui o marcador. -- A instrução fica depois do marcador. -- Nada, não se pode largar nada sobre ø. -> O marcador só guarda o lugar. O novo elemento ocupa-o. - -runde: -frage: Arrastas um elemento para a metade **de cima** de um bloco. Onde fica? -- [x] antes dele -- depois dele -- Substitui o bloco. -> Metade de cima quer dizer antes, metade de baixo quer dizer depois. A linha azul mostra-te enquanto arrastas. - -runde: -frage: Arrastas um elemento para a metade **de baixo** de um bloco. Onde fica? -- antes dele -- [x] depois dele -- no fim do estrutograma -> Metade de baixo quer dizer: logo a seguir a este bloco. - -runde: -frage: Apagaste um bloco sem querer. O que o traz de volta? -- Ctrl+C / ⌘C -- [x] Ctrl+Z / ⌘Z -- Ctrl+V / ⌘V -> Ctrl+Z / ⌘Z anula o último passo. Ctrl+C / ⌘C copia, Ctrl+V / ⌘V cola. - -runde: -frage: Ao executar deve aparecer exatamente **Olá**. O que está no bloco? -- [x] output: "Olá" -- output: Olá -- "Olá" -> Um texto que deve aparecer tal e qual fica entre aspas. O editor põe `output:` à frente quando escolhes o tipo Saída. - -runde: -frage: Onde alteras o texto do bloco selecionado? -- na área Elementos -- [x] no Inspetor de objetos -- na barra de ferramentas lá em cima -> O Inspetor de objetos por baixo do diagrama mostra o texto do bloco selecionado. - -runde: -frage: Clicas num elemento da área Elementos, sem arrastar. Onde fica? -- [x] depois do bloco selecionado -- no início -- no fim -> Sem arrastar (clique, ou Tab e Enter), o novo elemento fica depois do bloco que está selecionado nesse momento. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo inserir um elemento da área Elementos e substituir um marcador. → Inserir um elemento -- Consigo alterar o texto de um bloco e mudar entre Instrução, Entrada e Saída. → Escrever texto -- Consigo mover, copiar e eliminar blocos e anular passos. → Mover, copiar, eliminar -::: - -## Teste de conhecimentos - -::: quiz -? O que significa o sinal ø num bloco? -→ Inserir um elemento -- [ ] O bloco contém um erro. -- [x] Aqui ainda há um marcador vazio. -- [ ] O programa termina aqui. -> Um marcador é substituído quando arrastas um elemento para cima dele. - -? Arrastas uma Instrução para a metade de baixo de um bloco. Onde é que ela fica? -→ Inserir um elemento -- [ ] Antes dele -- [x] Depois dele -- [ ] O bloco é substituído. - -? Como mostras o texto Bom dia exatamente como está? -→ Escrever texto -- [ ] output: Bom dia -- [x] output: "Bom dia" -- [ ] input: "Bom dia" -> Sem aspas, Bom dia é entendido como o nome de uma variável. -::: diff --git a/web/lessons/pt/03-speichern-oeffnen-exportieren.md b/web/lessons/pt/03-speichern-oeffnen-exportieren.md deleted file mode 100644 index c3fcd62c..00000000 --- a/web/lessons/pt/03-speichern-oeffnen-exportieren.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -titel: Guardar, abrir, exportar -bereich: Primeiros passos -kurz: Guardar os teus ficheiros em segurança, usar o teu espaço de trabalho, abrir vários diagramas e partilhá-los como imagem ou PDF. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dar um título a um diagrama -- guardar um diagrama como ficheiro .visustruct e voltar a abri-lo -- exportar um diagrama como imagem (PNG) ou PDF -- abrir um segundo diagrama num novo separador -- criar o meu espaço de trabalho `VisuStruct-Ficheiros` -- guardar um programa no meu espaço de trabalho -::: - -## O ficheiro .visustruct - -Os estrutogramas são guardados como ficheiros **.visustruct**. Todas as versões do VisuStruct usam o mesmo formato: no navegador, no Mac, iPad e iPhone, e a app Java no computador. Assim podes começar no navegador na escola e continuar na app em casa. - -::: angeberwissen -Quando Nassi era estudante, não havia ficheiros para guardar. Havia cartões perfurados. Nassi conta que um encontro ao sábado à noite era assim: a futura mulher dele sentava-se com ele no centro de computação e perfurava-lhe os cartões. Romance à moda da informática! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -Era assim um cartão perfurado. Cada cartão tinha uma linha de programa, aqui `PRINT *, 'OLA MUNDO'` na linguagem Fortran. Cada coluna é um carácter, e os furos são o seu código. Um programa inteiro era uma pilha destes cartões. Se caísse ao chão, era preciso voltar a ordenar tudo. -::: - -::: angeberwissen -Um pioneiro da informática da minha região na Alemanha: **Konrad Zuse**. A 12 de maio de 1941 apresentou em Berlim o **Z3**, o primeiro computador digital programável a funcionar no mundo. Já calculava no **sistema binário**, só com 0 e 1, com cerca de 2000 relés (interruptores elétricos). O programa não estava em cartões perfurados, mas sim em furos numa película de cinema usada. Depois, Zuse inventou o **Plankalkül**, uma das primeiras linguagens de programação. Mais tarde viveu em **Hünfeld**, perto de Fulda, até morrer em 1995. O Museu Konrad Zuse de lá mostra réplicas do Z3. A minha dica para uma visita de estudo! O horário está no site da cidade de Hünfeld. -::: - -::: grafik l03-zuse-lochstreifen.svg -Mais ou menos assim era a fita de programa de Zuse: uma película de cinema velha com furos. Cada coluna é uma instrução com 8 posições. Um furo significa 1, sem furo significa 0. A máquina lia a fita instrução a instrução. -::: - -## Guardar e abrir - -- **[Guardar](#zeige-speichern)** (Ctrl+S, no Mac ⌘S): O diagrama é guardado como ficheiro. Se a coluna **Ficheiros** estiver configurada (ver abaixo), fica lá. Caso contrário, o navegador pergunta onde o guardar ou põe o ficheiro na pasta de transferências. -- **[Abrir](#zeige-oeffnen)** (Ctrl+O, no Mac ⌘O): Voltar a carregar um ficheiro guardado. Também podes simplesmente arrastar um ficheiro para a janela do navegador. - -> O navegador memoriza os teus exercícios automaticamente. Mas isso só funciona neste navegador, neste dispositivo. Por isso, guarda sempre também os trabalhos importantes como ficheiro. - -## A coluna Ficheiros - -À esquerda da área de aprendizagem encontras a coluna [📁 Ficheiros](#zeige-dateien). Aí reúnes todos os teus programas num só sítio, o teu **espaço de trabalho**. - -**A tua vez:** Configura já o teu espaço de trabalho, antes de continuares a ler. A partir de hoje guardas lá todos os teus programas. - -1. Cria um espaço de trabalho: abre a coluna e clica em **Escolher pasta**. Na janela, vai aos teus **Documentos**, cria aí com **Nova pasta** uma pasta chamada `VisuStruct-Ficheiros` e seleciona-a. Permite que o VisuStruct use a pasta. Isto funciona no Chrome e no Edge. No iPad e noutros navegadores, clica antes em **Guardar no navegador**. -2. Guarda como de costume. No teu espaço de trabalho, o VisuStruct cria automaticamente uma pasta com a data de hoje, por exemplo `2026-10-23`, e guarda lá o programa. O nome do ficheiro vem do título. - -O teu espaço de trabalho fica assim: - -```text -VisuStruct-Ficheiros ← espaço de trabalho -└── 2026-10-23 ← dia - └── Fatorial.visustruct -``` - -Um clique num programa da coluna volta a abri-lo. Assim encontras depressa cada aula mais tarde. - -Também o teu **progresso** fica no espaço de trabalho: o ficheiro `learnProgress.json` guarda as lições e os exercícios que já concluíste. Se abrires o espaço de trabalho noutro navegador, o teu progresso volta a estar lá. - -> Porquê uma pasta real? O teu progresso e os teus programas ficam lá guardados como ficheiros. Podes levar a pasta contigo, por exemplo numa pen USB ou na tua pasta na nuvem, como o OneDrive. Assim continuas em casa, noutro computador, exatamente onde paraste. Se guardares só no navegador, tudo fica apenas neste navegador, neste dispositivo. Se alguém apagar os dados do navegador, o teu progresso também desaparece. - -## Vários diagramas em separadores - -Por cima do estrutograma vês os [separadores](#zeige-reiter). Com **+** ou [Novo](#zeige-neu) abres mais um diagrama vazio. Um ponto • antes do nome mostra que há alterações não guardadas. - -O [título](#zeige-titel) de um diagrama escreve-se no campo por cima do estrutograma. Também aparece quando exportas e é sugerido como nome do ficheiro. - -## Partilhar: imagem, PDF ou ficheiro - -Com [Exportar](#zeige-exportieren) nas ferramentas (ícone com uma seta para cima) podes partilhar o teu estrutograma: - -- **Imagem (PNG):** para pôr numa ficha de trabalho ou numa apresentação -- **Gráfico vetorial (SVG):** fica nítido em qualquer tamanho -- **PDF (A4):** uma página para entregar ou imprimir -- **Ficheiro VisuStruct (.visustruct):** para passar a alguém que deva abrir e continuar a editar o teu estrutograma no VisuStruct, por exemplo por e-mail ou pela plataforma de aprendizagem -- **Imprimir** (Ctrl+P, no Mac ⌘P): diretamente para a impressora - -Na [roda dentada](#zeige-textgroesse) em cima à direita, em Tamanho do texto, defines o tamanho da letra. O texto maior também se nota quando exportas uma imagem. - -## Experimenta - -Abre um dos teus exercícios da lição 2 e experimenta o seguinte: - -1. Dá um nome ao diagrama no campo [título](#zeige-titel) por cima do estrutograma, por exemplo `Olá Mundo`. -2. [Guarda-o](#zeige-speichern) no teu espaço de trabalho. Vê na coluna [📁 Ficheiros](#zeige-dateien): está na pasta de hoje? -3. Abre um segundo separador com **+** e clica lá no teu programa na coluna Ficheiros. Volta a abrir-se. -4. [Exporta-o](#zeige-exportieren) como **imagem (PNG)** e como **PDF (A4)**. Abre os dois ficheiros e compara-os. - -Correu tudo bem? Então sabes onde estão os teus programas e como os partilhar. - -## Jogo: Como o partilhas? - -::: spiel frage -titel: Jogo: Como o partilhas? -intro: O Ludwig quer partilhar o seu estrutograma. Que formato serve melhor? Seis rondas. -frage: Que formato serve? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: Amanhã queres continuar a trabalhar no teu estrutograma. -richtig: .visustruct -> Só o ficheiro .visustruct pode voltar a ser aberto e editado no VisuStruct. - -runde: -frage: O estrutograma deve entrar numa apresentação como imagem. -richtig: PNG -> Uma imagem PNG pode ser posta em qualquer apresentação e em qualquer ficha de trabalho. - -runde: -frage: O teu professor quer imprimir o teu trabalho numa página A4. -richtig: PDF -> O PDF é exatamente uma página A4 para entregar ou imprimir. - -runde: -frage: O estrutograma vai para um cartaz e deve ficar nítido mesmo em tamanho enorme. -richtig: SVG -> Um gráfico vetorial fica nítido em qualquer tamanho. Um PNG fica com pixéis quando o aumentas. - -runde: -frage: A tua amiga deve alterar o estrutograma na app VisuStruct do iPad dela. -richtig: .visustruct -> Todas as versões do VisuStruct abrem o mesmo ficheiro .visustruct: no browser, no Mac, no iPad e no iPhone. - -runde: -frage: Queres enviar depressa uma imagem para um chat. -richtig: PNG -> Um PNG pode ser visto logo por qualquer pessoa, sem VisuStruct. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dar um título a um diagrama. → Experimenta -- Consigo guardar um diagrama como ficheiro .visustruct e voltar a abri-lo. → Guardar e abrir -- Consigo exportar um diagrama como imagem (PNG) ou PDF. → Partilhar: imagem, PDF ou ficheiro -- Consigo abrir um segundo diagrama num novo separador. → Vários diagramas em separadores -- Consigo criar o meu espaço de trabalho `VisuStruct-Ficheiros`. → A coluna Ficheiros -- Consigo guardar um programa no meu espaço de trabalho. → A coluna Ficheiros -::: - -## Teste de conhecimentos - -::: quiz -? Que ficheiro podes voltar a abrir na app para Mac e na app Java? -→ Guardar e abrir -- [x] O ficheiro .visustruct -- [ ] A imagem PNG exportada -- [ ] O PDF exportado -> As imagens e os PDF servem só para ver. Só o ficheiro .visustruct pode continuar a ser editado. - -? O navegador memoriza os teus exercícios. Porque deves guardar mesmo assim? -→ Guardar e abrir -- [ ] Porque senão os exercícios não são verificados -- [x] Porque o navegador só guarda os dados neste dispositivo e eles podem perder-se -- [ ] Porque não se pode exportar sem guardar - -? Hoje guardas um programa no teu espaço de trabalho. Onde fica? -→ A coluna Ficheiros -- [ ] Na pasta de transferências -- [x] No espaço de trabalho, dentro de uma pasta com a data de hoje -- [ ] Diretamente no espaço de trabalho, sem subpasta -> O VisuStruct cria automaticamente uma pasta com a data de cada dia. Assim os programas ficam ordenados por aula. -::: diff --git a/web/lessons/pt/04-variablen-und-datentypen.md b/web/lessons/pt/04-variablen-und-datentypen.md deleted file mode 100644 index 209f097d..00000000 --- a/web/lessons/pt/04-variablen-und-datentypen.md +++ /dev/null @@ -1,407 +0,0 @@ ---- -titel: Variáveis e tipos de dados -bereich: Fundamentos -kurz: Guardar valores, conhecer os tipos de dados int, double, String e boolean, e fazer contas. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar uma variável com tipo de dados, nome e valor -- explicar que o Java distingue maiúsculas de minúsculas (`numero` não é `Numero`) -- distinguir os tipos de dados int, double, String e boolean -- explicar que = é uma atribuição e não uma comparação -- fazer contas com + - * / % e usar a divisão inteira -- criar e mostrar variáveis em Java -::: - -## O que é uma variável? - -Uma **variável** é como uma caixa com etiqueta. Tem um **nome**, um **tipo de dados** e um **valor**. - -``` -int idade = 14 -``` - -Aqui a variável chama-se `idade`, o seu tipo de dados é `int` (número inteiro) e o seu valor é 14. Mais tarde podes voltar a usar o valor através do nome. - -::: grafik l04-variable.svg -A variável como caixa: o nome na etiqueta, o tipo de dados como autocolante, o valor lá dentro. -::: - -> Os nomes de variáveis começam por uma **letra minúscula** e não têm espaços. Bons nomes dizem o que está lá dentro: `preco` é melhor do que `p`. Evita acentos e cedilhas nos nomes: escreve `preco` e não `preço`. - -::: angeberwissen -Em setembro de 1999 perdeu-se a sonda Mars Climate Orbiter. Uma equipa calculava a força de impulso em unidades americanas (libras), a outra esperava unidades métricas (newtons). Nos dados só estava o número, não a unidade. A sonda voou demasiado baixo na atmosfera de Marte e ardeu, um prejuízo de cerca de 125 milhões de dólares. Um nome que diz o que guarda, como `impulsoEmNewtonSegundos`, teria evitado a confusão. Já agora, eu escrevo sempre `fenoEmQuilos` na minha caixa de feno. -::: - -Se um nome tiver várias palavras, escreves-as juntas e começas cada palavra seguinte com maiúscula: `precoComIva`, `numeroDeAlunos`. Esta forma de escrever chama-se **camelCase**. - -::: angeberwissen -O camelCase tem este nome porque as maiúsculas no meio saem da palavra como as bossas de um camelo: `precoComIva` tem duas bossas. Eu, como bode, tenho zero bossas, mas dois chifres. Infelizmente ainda ninguém inventou a escrita BodeCase. -::: - -::: grafik l04-camelcase.svg -As maiúsculas C e I sobressaem como as duas bossas do camelo. -::: - -## Maiúsculas e minúsculas - -O Java distingue **maiúsculas de minúsculas**. Em inglês diz-se **case-sensitive**. Para o Java, `numero`, `Numero` e `NUMERO` são três nomes diferentes, ou seja, três caixas diferentes: - -``` -int numero = 4 -int Numero = 6 -``` - -Aqui há duas variáveis. Se mais tarde escreveres `NUMERO`, o Java não encontra nenhuma variável com esse nome. O programa não corre e aparece uma mensagem de erro. - -> Isto também vale para as palavras do Java: `String` e `System` escrevem-se com maiúscula, `int` e `double` com minúscula. Nos teus programas, nunca cries duas variáveis que só se distinguem por maiúsculas e minúsculas. Isso confunde-te a ti e a quem lê o teu código. - -## Exercício: Três nomes - -::: übung l04-gross-klein -titel: Três nomes -auftrag: O Ludwig criou duas variáveis: `numero` com o valor 4 e `Numero` com o valor 6. O estrutograma deve multiplicá-las e mostrar **Resultado: 24**. Mas não corre. - Carrega em “Abrir no editor”, depois em Verificar, e lê a mensagem de erro. Corrige a instrução e carrega outra vez em Verificar. -start: l04-gross-klein-start.visustruct -test: - -> Resultado: 24 -braucht: anweisung -tipp: Quantos nomes diferentes há no estrutograma? `numero`, `Numero` e `NUMERO` são três nomes diferentes para o computador. -tipp: `NUMERO` não existe. Para 24 precisas de 4 vezes 6, ou seja, `numero` vezes `Numero`: `int resultado = numero * Numero`. Com `numero * numero` dá 16. -lösung: l04-gross-klein-loesung.visustruct -::: - -## Os quatro tipos de dados - -O tipo de dados diz que tipo de valor pode ser guardado na variável. - -- **int:** números inteiros, p. ex. `int quantidade = 3` ou `int temperatura = -5` -- **double:** números decimais, p. ex. `double preco = 2.5`. Escreves um **ponto**, nunca uma vírgula. -- **String:** texto, p. ex. `String nome = "Inês"`. O texto fica entre aspas. -- **boolean:** valores lógicos, só `true` ou `false` - -Há mais tipos de dados. Um deles vais precisar em breve: `char` para um **único caractere**, p. ex. `char nota = 'C'`. Um `char` fica entre aspas **simples**. Vais conhecê-lo melhor na lição 17. - -::: diagramm l05-datentypen.visustruct -Três variáveis com tipos de dados diferentes. Abre o diagrama e inicia a [simulação](#zeige-simulation). -::: - -Os valores lógicos aparecem sobretudo em **condições**: `idade >= 18` é `true` ou `false`. É disso que trata a lição 8. Uma variável do tipo `boolean` recebe simplesmente `true` ou `false`: - -``` -boolean adulto = false -``` - -::: angeberwissen -A 4 de junho de 1996, o foguetão Ariane 5 explodiu apenas 37 segundos depois da descolagem. A culpa foi de uma única linha: um número decimal para a velocidade foi metido numa variável inteira demasiado pequena para valores tão grandes. O tipo de dados não é um pormenor, pode custar meio milhar de milhões de euros. -::: - -## Atribuição com = - -O sinal `=` chama-se **atribuição**. Não quer dizer “é igual a” como na matemática. Quer dizer: calcula o lado direito e guarda o resultado na variável da esquerda. - -``` -int pontos = 10 -pontos = pontos + 5 -``` - -Na matemática, a segunda linha estaria errada, porque nenhum número é igual a si próprio mais 5. Na programação lê-se assim: pega no valor antigo 10, soma 5 e guarda 15 em `pontos`. O tipo de dados só se escreve da primeira vez, quando a variável é criada. - -::: grafik l04-zuweisung.svg -Primeiro calcula-se o lado direito, depois o resultado vai para a variável da esquerda. -::: - -## Fazer contas - -Podes fazer contas com números: - -- `+` mais, `-` menos, `*` vezes, `/` a dividir por -- `%` resto de uma divisão (diz-se “módulo”), p. ex. `17 % 5` dá 2 - -A **divisão com resto** conheces da escola primária, quando ainda não sabias números decimais: 17 : 5 = 3 e sobram 2. O 5 cabe três vezes no 17, o que dá 15. Até 17 faltam ainda 2: esse é o resto. O computador calcula com números inteiros exatamente assim: `/` dá o resultado sem o resto, `%` dá só o resto. - -| Escola primária | com `/` | com `%` | -|---|---|---| -| 17 : 5 = 3, resto 2 | `17 / 5` dá 3 | `17 % 5` dá 2 | -| 20 : 5 = 4, resto 0 | `20 / 5` dá 4 | `20 % 5` dá 0 | -| 3 : 5 = 0, resto 3 | `3 / 5` dá 0 | `3 % 5` dá 3 | - -Se o resto for 0, a divisão é exata. Mais tarde usas isto para ver se um número é par: nos números pares, `numero % 2` dá 0. - -**A multiplicação e a divisão vêm antes da adição e da subtração**, e os parênteses calculam-se primeiro: `2 * (3 + 4)` dá 14. - -### Mostrar texto e resultado juntos - -Um resultado sozinho diz pouco. Com `+` juntas um texto e o valor de uma variável: - -``` -int idade = 14 -output: "Idade: " + idade -``` - -Isto mostra **Idade: 14**. O texto entre aspas aparece tal e qual; em vez de `idade` o computador põe o valor. O espaço depois dos dois pontos faz parte do texto, senão aparece `Idade:14`. - -## Exercício: Retângulo - -::: übung l05-rechteck -titel: Calcular um retângulo -auftrag: Um retângulo tem 7 de comprimento e 4 de largura. Cria as variáveis `comprimento` e `largura`. Calcula a área e o perímetro em variáveis próprias e mostra os dois assim: -`Área: 28` e na linha seguinte `Perímetro: 22`. -test: - -> Área: 28 | Perímetro: 22 -braucht: anweisung -tipp: Pensa primeiro de que variáveis precisas: duas para as medidas e duas para os resultados. São todas números inteiros. -tipp: A área é o comprimento vezes a largura, o perímetro é 2 vezes (comprimento mais largura). Para a saída escreves p. ex. `output: "Área: " + area`. O `+` junta o texto e o valor da variável. -lösung: l05-rechteck-loesung.visustruct -::: - -## Divisão inteira - -Se dividires dois números inteiros e guardares o resultado numa variável `int`, tudo o que vem depois da vírgula desaparece. **Não é arredondado.** - -``` -int x = 7 / 2 dá 3 -int r = 7 % 2 dá 1 (o resto) -double d = 7.0 / 2 dá 3.5 -``` - -Com `/` e `%` juntos podes fazer boas conversões, por exemplo de minutos para horas e minutos: - -::: diagramm l05-division.visustruct -135 minutos são 2 horas (135 / 60) e sobram 15 minutos (135 % 60). -::: - -## Exercício: Converter segundos - -::: übung l05-sekunden -titel: Converter segundos -auftrag: 200 segundos devem ser mostrados em minutos e segundos. A primeira e a última instrução já lá estão. Insere entre elas instruções que calculem `minutos` e `resto`. -start: l05-sekunden-start.visustruct -test: - -> 3 minutos e 20 segundos -braucht: anweisung -tipp: Quantos minutos inteiros cabem em 200 segundos, e quantos segundos sobram? Calcula primeiro de cabeça. -tipp: Um minuto tem 60 segundos. Usa `/` para os minutos inteiros e `%` para o resto. As duas variáveis são do tipo `int`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Exercício: Compras - -::: übung l05-einkauf -titel: Compras -auftrag: Compras 3 cadernos a 2.5 euros cada. Cria `quantidade` como `int` e `preco` como `double`, calcula o preço total numa variável `precoTotal` e mostra `Total: 7.5 euros`. -test: - -> Total: 7.5 euros -braucht: anweisung -tipp: A quantidade vezes o preço dá o preço total. Para cada variável, pensa se é um número inteiro ou um número decimal. -tipp: O preço total é um número decimal, por isso `precoTotal` precisa do tipo `double`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Agora em Java - -Um estrutograma é um plano. Em **Java** torna-se um programa que o computador executa. As tuas compras do exercício ficam assim: - -```java editor -int quantidade = 3; -double preco = 2.5; -double precoTotal = quantidade * preco; -System.out.println("Total: " + precoTotal + " euros"); -``` - -- Primeiro o tipo de dados, depois o nome, depois o valor, tal como no bloco. -- Cada instrução termina com um **ponto e vírgula** `;`. -- Em Java, uma saída escreve-se `System.out.println(…)`. - -Como é que o computador entende o teu código Java e porque é que ele corre igual no Windows, no macOS e no Linux, vais ver na lição “Estrutograma e código”. - -::: angeberwissen -O Java chamava-se primeiro **Oak** (carvalho), por causa da árvore em frente à janela do escritório de James Gosling. A partir de 1991, a sua equipa na Sun Microsystems queria programar pequenos aparelhos, como boxes de televisão. Mas o nome Oak já pertencia a outra empresa. Assim, em 1995 passou a chamar-se **Java**, como o café da ilha de Java. -::: - -## Texto em Java - -As variáveis não guardam só números. Para texto existe o tipo de dados `String`: - -```java editor -String nome = "Inês"; -int idade = 14; -double altura = 1.62; -System.out.println(nome + " tem " + idade + " anos."); -System.out.println("Altura: " + altura + " m"); -``` - -- O texto fica entre aspas. -- `String` escreve-se com maiúscula, `int`, `double` e `boolean` com minúscula. O Java distingue-os. -- Com `+` juntas texto e números. - -Escreves Java na área [Código](#zeige-codelive). O estrutograma constrói-se sozinho enquanto escreves. “Abrir no editor” leva o exemplo para a área Código. Clica aí em “Executar”, depois muda o nome, a idade ou a altura e experimenta outra vez. - -::: übung l04-java-steckbrief -titel: Ficha em Java -bereich: beide -code: java -auftrag: Escreve a ficha do Ludwig, o bode. Cria três variáveis: o nome **Ludwig**, a idade **7** e a altura **1.2**. Depois mostra estas duas linhas: - **Ludwig tem 7 anos.** e **Altura: 1.2 m** - “Abrir no editor” abre também a área Código à direita. Escreve lá o teu código; o estrutograma constrói-se sozinho. Depois clica em Verificar. -test: - -> Ludwig tem 7 anos. | Altura: 1.2 m -braucht: anweisung -tipp: Precisas de uma `String`, um `int` e um `double`. Cada linha termina com ponto e vírgula. -tipp: `String nome = "Ludwig";`, `int idade = 7;` e `double altura = 1.2;`. Juntas a saída com `+`: `System.out.println(nome + " tem " + idade + " anos.");` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Preenche os espaços: tipos de dados - -::: lückentext -titel: Ficha em Java -auftrag: Preenche as palavras que faltam. Por fora está a moldura de que qualquer programa Java precisa num ficheiro próprio. As variáveis ficam lá dentro. -```java -[[public]] class Ficha { - public static [[void]] main(String[] args) { - [[int]] idade = 14; - [[double]] altura = 1.62; - [[String]] nome = "Mia"; - [[boolean]] temAnimal = true; - System.out.[[println]](nome + " tem " + idade + " anos."); - } -} -``` -erklärung: Números inteiros são `int`, números decimais `double`, textos `String` (com S maiúsculo) e valores lógicos `boolean`. `public class` e `public static void main` formam a moldura. Na área Código podes deixá-la de fora, há mais sobre isto na lição “Estrutograma e código”. -::: - -## Encontra o erro: segundos - -::: übung l04-java-fehler -titel: Corrigir os segundos -code: java -auftrag: O programa deve converter 200 segundos em minutos e segundos e mostrar **3 min 20 s**. Mas mostra **20 min 3 s**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: `/` divide sem resto, `%` dá o resto. Qual dos dois precisas para os minutos e qual para os segundos que sobram? -tipp: Os dois operadores estão trocados: `int minutos = segundos / 60;` e `int resto = segundos % 60;` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l04-java-laeuft-nicht -titel: Corrigir a ficha -code: java -auftrag: O programa deve mostrar **Ludwig tem 7 anos.** Mas não corre, porque há duas palavras mal escritas. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig tem 7 anos. -braucht: anweisung -tipp: O Java distingue maiúsculas de minúsculas. Compara cada palavra da saída com o que foi criado em cima. -tipp: `System` escreve-se com S maiúsculo. A variável chama-se `idade` com i minúsculo: `System.out.println(nome + " tem " + idade + " anos.");` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que tipo de dados? - -::: spiel frage -titel: Jogo: Que tipo de dados? -intro: O Ludwig juntou valores. Que tipo de dados serve para cada valor? Oito rondas. -antworten: int | double | String | boolean - -runde: -frage: Que tipo de dados serve para `17`? -richtig: int -> Um número inteiro sem ponto decimal é um `int`. - -runde: -frage: Que tipo de dados serve para `3.5`? -richtig: double -> Números com ponto decimal são `double`. - -runde: -frage: Que tipo de dados serve para `"Olá"`? -richtig: String -> Texto entre aspas é uma `String`. - -runde: -frage: Que tipo de dados serve para `true`? -richtig: boolean -> `true` e `false` são os dois valores lógicos, tipo de dados `boolean`. - -runde: -frage: Que tipo de dados serve para `"17"`? -richtig: String -> Atenção às aspas! Aqui 17 é um texto com o qual não se pode calcular. - -runde: -frage: Que tipo de dados serve para `-4`? -richtig: int -> Os números inteiros negativos também são `int`. - -runde: -frage: Que tipo de dados serve para `0.0`? -richtig: double -> O ponto torna-o um número decimal, mesmo que a seguir só esteja um 0. - -runde: -frage: Que tipo de dados serve para `"false"`? -richtig: String -> Entre aspas, false também é só um texto. O valor lógico não tem aspas. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar uma variável com tipo de dados, nome e valor. → O que é uma variável? -- Consigo explicar que o Java distingue maiúsculas de minúsculas (`numero` não é `Numero`). → Maiúsculas e minúsculas -- Consigo distinguir os tipos de dados int, double, String e boolean. → Os quatro tipos de dados -- Consigo explicar que = é uma atribuição e não uma comparação. → Atribuição com = -- Consigo fazer contas com + - * / % e usar a divisão inteira. → Fazer contas -- Consigo criar e mostrar variáveis em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que tipo de dados serve para o valor 3.75? -→ Os quatro tipos de dados -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Os números decimais são do tipo double. No VisuStruct escrevem-se com ponto. - -? Quantas variáveis criam `int numero = 1`, `int Numero = 2` e `int NUMERO = 3`? -→ Maiúsculas e minúsculas -- [ ] uma -- [ ] duas -- [x] três -> O Java distingue maiúsculas de minúsculas. Os três nomes são diferentes, por isso há três variáveis. - -? Que valor tem x depois de `int x = 17 / 5`? -→ Fazer contas -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> Com números inteiros, tudo o que vem depois da vírgula desaparece. Não é arredondado. - -? Quanto dá `17 % 5`? -→ Fazer contas -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 a dividir por 5 dá 3, resto 2. O operador % dá o resto. - -? No início, `int pontos = 10`. O que fica em pontos depois de `pontos = pontos * 2`? -→ Atribuição com = -- [ ] 10 -- [ ] 12 -- [x] 20 -> O lado direito é calculado com o valor antigo 10, e o resultado 20 é guardado em pontos. - -? Que linha cria corretamente um número decimal em Java? -→ Agora em Java -- [ ] double preco = 2,5; -- [x] double preco = 2.5; -- [ ] Double preco = 2.5 -> Os números decimais escrevem-se com ponto, e no fim há um ponto e vírgula. -::: diff --git a/web/lessons/pt/05-sequenz.md b/web/lessons/pt/05-sequenz.md deleted file mode 100644 index 486f7bcc..00000000 --- a/web/lessons/pt/05-sequenz.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -titel: Sequência -bereich: Fundamentos -kurz: Executar passos um a seguir ao outro, prestar atenção à ordem e trocar valores. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que uma sequência é executada de cima para baixo -- explicar porque é que a ordem dos passos conta -- trocar dois valores com uma variável auxiliar -- escrever uma sequência em Java -::: - -## Passo a passo - -Uma **sequência** é uma série de passos que são executados exatamente uma vez e exatamente por esta ordem. No estrutograma, os blocos ficam simplesmente uns por cima dos outros. - -Cada bloco só começa quando o bloco de cima terminou. Nada é saltado e nada é repetido. - -::: diagramm l05-sequenz.visustruct -Uma sequência de quatro blocos: primeiro `comprimento` e `largura` recebem os seus valores, depois a área é calculada e, no fim, é apresentada. Cada bloco é executado exatamente uma vez, de cima para baixo. Saída: 15. -::: - -> A sequência é o mais simples dos três blocos básicos. Quase todos os estrutogramas são feitos sobretudo de sequências. - -## A ordem conta - -Quando fazes chá, notas logo se a ordem estiver errada. Com contas é igual, só que é mais difícil de ver. - -::: diagramm l04-rechnen.visustruct -Primeiro duplicar, depois somar 1: o resultado é 7. Se trocares os dois blocos do meio, dá 8. -::: - -A instrução `numero = numero * 2` quer dizer: pega no valor de `numero`, multiplica-o por 2 e volta a guardar o resultado em `numero`. Por isso, o que está em `numero` depende do que aconteceu antes. - -::: angeberwissen -Os estrutogramas não são só coisa da escola. Segundo Shneiderman, empresas como a IBM e a Siemens também planeavam os seus programas com eles. Ou seja, aqui estás a aprender coisas de profissionais. Mééé-ravilha! -::: - -## Exercício: Pôr por ordem - -::: übung l04-reihenfolge -titel: Pôr por ordem -auftrag: O diagrama inicial tem os blocos certos, mas pela ordem errada. Move-os de modo que no fim seja mostrado **20**. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Lê cada bloco e pergunta-te: de que variável precisa, e onde é que essa variável recebe o seu valor? -tipp: Uma variável tem de ser criada antes de fazeres contas com ela. A saída vem mesmo no fim. Confirma de cabeça: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Trocar dois valores - -Imagina dois copos: um com sumo, outro com água. Se quiseres trocar o que está lá dentro, precisas de um terceiro copo, vazio. - -Com variáveis é exatamente igual. Se escreveres simplesmente `a = b` e depois `b = a`, o valor antigo de `a` já se perdeu. No fim, as duas variáveis têm o mesmo valor. - -A solução é uma **variável auxiliar** que guarda o valor antigo durante pouco tempo: - -::: grafik l05-tauschen.svg -Três passos com um copo vazio: primeiro o sumo para aux, depois a água para a esquerda, depois o sumo de aux para a direita. -::: - -::: diagramm l04-tauschen.visustruct -Primeiro guarda-se a em aux. Depois a recebe o valor de b, e b recebe o valor guardado em aux. -::: - -## Exercício: Trocar copos - -::: übung l04-glaeser-tauschen -titel: Trocar copos -auftrag: O copo da esquerda tem sumo, o da direita tem água. Troca o conteúdo das variáveis `esquerda` e `direita` antes de serem mostradas. -Não alteres os dois primeiros blocos. Insere novas instruções entre eles. -start: l04-tauschen-start.visustruct -test: - -> Esquerda: água | Direita: sumo -braucht: anweisung -tipp: Como trocas dois copos cheios na vida real? Precisas de um terceiro copo, vazio. -tipp: Cria uma variável auxiliar com `String aux = esquerda`. Depois disso precisas de mais duas atribuições. -lösung: l04-tauschen-loesung.visustruct -::: - -## Agora em Java - -Tal como na lição 4, também podes escrever uma sequência diretamente em Java. A troca de cima fica assim: - -```java editor -int a = 5; -int b = 9; -int aux = a; -a = b; -b = aux; -System.out.println("a = " + a); -System.out.println("b = " + b); -``` - -- Cada bloco passa a ser uma linha. As linhas correm de cima para baixo, tal como os blocos. -- No fim de cada instrução há um **ponto e vírgula** `;`. -- Uma saída chama-se `System.out.println(…)` em Java. Atenção ao S maiúsculo de `System`: o Java distingue maiúsculas de minúsculas. - -Escreves Java na área [Código](#zeige-codelive), à direita do estrutograma. Enquanto escreves, o VisuStruct constrói o estrutograma ao mesmo tempo. Assim vês logo que bloco pertence a que linha. - -::: übung l05-java-kino -titel: Bilhetes de cinema em Java -bereich: beide -code: java -auftrag: Um bilhete de cinema custa 9 euros. Escreve um programa em Java que calcula o preço de 3 bilhetes e mostra **Total: 27**. - “Abrir no editor” abre também a área Código à direita. Escreve lá o teu código; o estrutograma constrói-se sozinho. Depois clica em Verificar. -test: - -> Total: 27 -braucht: anweisung -tipp: Precisas de três variáveis: o preço, a quantidade e o resultado. Cada linha termina com ponto e vírgula. -tipp: `int preco = 9;` e `int quantidade = 3;` criam as variáveis. `int total = preco * quantidade;` calcula, e `System.out.println("Total: " + total);` mostra o resultado. -lösung: l05-java-kino-loesung.visustruct -::: - -## Preenche os espaços: trocar os copos - -::: lückentext -titel: Trocar dois valores -auftrag: Os valores de `a` e `b` devem ser trocados. Preenche as palavras que faltam. -```java -int a = 3; -int b = 8; -[[int]] aux = [[a]]; -a = [[b]]; -b = [[aux]]; -System.out.println("a = " + a + ", b = " + b); -``` -erklärung: Primeiro guardas `a` na variável auxiliar, depois `a` recebe o valor de `b` e, por fim, `b` recebe o valor guardado. Saída: **a = 8, b = 3** -::: - -## Encontra o erro: saldo - -::: übung l05-java-fehler -titel: Corrigir o saldo -code: java -auftrag: O cartão da cantina tem 20 euros. Uma refeição custa 7 euros. O programa deve mostrar o saldo **depois** de pagar, ou seja, **Resta: 13**. Mas mostra **Resta: 20**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l05-java-fehler-start.visustruct -test: - -> Resta: 13 -braucht: anweisung -tipp: Todas as linhas estão certas, só a ordem não. Quando é mostrado o saldo e quando se paga? -tipp: Troca as duas últimas linhas: primeiro `saldo = saldo - preco;`, depois a saída. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l05-java-laeuft-nicht -titel: Dividir uma piza -code: java -auftrag: Uma piza tem 8 fatias e 4 amigos dividem-na. O programa deve mostrar **Cada um recebe 2 fatias.** Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Cada um recebe 2 fatias. -braucht: anweisung -tipp: Compara o nome na saída, letra a letra, com o nome criado na terceira linha. -tipp: A variável chama-se `porPessoa` com P maiúsculo (camelCase). Escreve-a exatamente assim na saída. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Ordenar os blocos - -::: spiel reihenfolge -titel: Jogo: Ordenar os blocos -intro: O Ludwig baralhou os blocos. Põe-nos pela ordem certa. Quatro rondas. - -runde: -frage: No fim deve aparecer **7**. -- `int numero = 3` -- `numero = numero * 2` -- `numero = numero + 1` -- `output: numero` -> Primeiro duplicar, depois somar 1: 3 · 2 + 1 = 7. Ao contrário dava (3 + 1) · 2 = 8. - -runde: -frage: No fim deve aparecer **8**. -- `int numero = 3` -- `numero = numero + 1` -- `numero = numero * 2` -- `output: numero` -> Os mesmos blocos, outra ordem, outro resultado: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a e b devem trocar os seus valores. -- `int aux = a` -- `a = b` -- `b = aux` -- `output: a + " " + b` -> Primeiro guarda-se a em aux. Senão o valor antigo perde-se assim que a recebe o valor de b. - -runde: -frage: O Ludwig faz chá. -- Encher a chaleira com água -- Ligar a chaleira -- Esperar até a água ferver -- Deitar a água sobre o saquinho de chá -- Deixar o chá em infusão -> Cada passo precisa do anterior. Tal como num estrutograma. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que uma sequência é executada de cima para baixo. → Passo a passo -- Consigo explicar porque é que a ordem dos passos conta. → A ordem conta -- Consigo trocar dois valores com uma variável auxiliar. → Trocar dois valores -- Consigo escrever uma sequência em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas vezes é executado cada bloco de uma sequência? -→ Passo a passo -- [ ] Até uma condição ser falsa -- [x] Exatamente uma vez -- [ ] Nenhuma, se estiver vazio -> Numa sequência nada é repetido e nada é saltado. Para repetir existem os ciclos. - -? No início a = 5 e b = 9. Depois é executado `a = b` e a seguir `b = a`. O que está nas variáveis no fim? -→ Trocar dois valores -- [ ] a = 9 e b = 5 -- [x] a = 9 e b = 9 -- [ ] a = 5 e b = 5 -> Depois de `a = b`, o valor antigo 5 perdeu-se. `b = a` só copia o 9 de volta. - -? Porque precisas de uma variável auxiliar para trocar valores? -→ Trocar dois valores -- [x] Para um valor não ser escrito por cima antes de ser preciso -- [ ] Para o estrutograma ficar mais comprido -- [ ] Porque senão não se podem mostrar variáveis - -? O que mostra a sequência `int x = 4`, `x = x + 1`, `x = x * 3`, `output: x`? -→ A ordem conta -- [ ] 13 -- [x] 15 -- [ ] 4 -> Primeiro x passa a 5, depois a 15. - -? Com que termina cada instrução em Java? -→ Agora em Java -- [ ] Com um ponto . -- [x] Com um ponto e vírgula ; -- [ ] Com dois pontos : -> Se faltar o ponto e vírgula, o VisuStruct mostra uma indicação por baixo do código. -::: diff --git a/web/lessons/pt/06-eingabe-und-ausgabe.md b/web/lessons/pt/06-eingabe-und-ausgabe.md deleted file mode 100644 index ec59d96c..00000000 --- a/web/lessons/pt/06-eingabe-und-ausgabe.md +++ /dev/null @@ -1,432 +0,0 @@ ---- -titel: Entrada e saída -bereich: Fundamentos -kurz: Pedir valores, mostrar resultados e usar o modelo EPS. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o modelo EPS -- escrever uma entrada com tipo de dados, nome e pergunta -- juntar texto e variáveis numa saída com + -- calcular primeiro um resultado e guardá-lo numa variável, depois mostrar essa variável, p. ex. `int soma = a + b`, depois `output: soma` -- identificar a entrada, o processamento e a saída numa tarefa -- ler números em Java com o scanner -- escrever comentários com `//` e `/* */` e usá-los para organizar e explicar o meu código -::: - -## O modelo EPS - -Muitos programas funcionam em três partes: - -1. **Entrada:** O programa pede valores, p. ex. dois números. -2. **Processamento:** Faz contas com os valores. -3. **Saída:** Mostra o resultado. - -As primeiras letras dão **EPS**. Até agora, os valores estavam fixos no estrutograma. Com uma entrada, pode ser usado um valor diferente de cada vez que o estrutograma é executado. - -::: diagramm l06-eva.visustruct -Entrada em cima, processamento ao meio, saída em baixo. Inicia a simulação e experimenta números diferentes. -::: - -## Entrada com input: - -Uma entrada pede um valor enquanto o estrutograma é executado e guarda-o numa variável. Escreves o **tipo de dados**, o **nome** e uma **pergunta** entre aspas: - -``` -input: int idade "Quantos anos tens?" -input: double preco "Preço em euros?" -input: String nome "Como te chamas?" -``` - -No editor escolhes o tipo **Entrada** em cima, numa Instrução. A palavra `input:` já fica à frente, e só escreves `int idade "Quantos anos tens?"`. - -> O tipo de dados decide o que pode ser introduzido. Com `int`, a simulação dá erro se alguém escrever 2.5 ou Olá. - -## Saída com output: - -Uma saída mostra texto e valores. O texto fica entre aspas, as variáveis não. Com `+` **juntas** as partes: - -``` -output: "Olá " + nome + "!" -output: "Tens " + idade + " anos." -``` - -Atenção aos espaços dentro das aspas. Sem eles fica tudo colado, e vês `OláInês!` em vez de `Olá Inês!`. - -## Exercício: Cumprimento - -::: übung l06-begruessung -titel: Cumprimento -auftrag: Pede um nome e cumprimenta a pessoa. Quando se escreve Ada, deve ser mostrado **Olá Ada!**. -test: Ada -> Olá Ada! -test: Rui -> Olá Rui! -braucht: anweisung -tipp: Primeiro vem uma entrada para o nome, depois uma saída que usa o nome. -tipp: O nome é texto, por isso a entrada precisa do tipo `String`. Na saída juntas `"Olá "`, a variável e `"!"` com `+`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Cuidado com o + numa saída - -Numa saída, o `+` junta **sempre** as partes, mesmo com números. Se `a` for 3 e `b` for 4, então - -``` -output: a + b -``` - -não mostra 7, mas **34**. Por isso calcula primeiro numa variável e depois mostra a variável: - -``` -int soma = a + b -output: "Soma: " + soma -``` - -Isso também encaixa no modelo EPS: calculas na parte do processamento, não na saída. - -## Da tarefa ao estrutograma - -Antes de arrastares o primeiro bloco, lê a tarefa com atenção e desmonta-a. A isto chama-se **análise do problema**. Três perguntas ajudam-te: - -1. **O que é dado?** Esses valores tornam-se a **entrada**. Pensa também no tipo de dados. -2. **O que procuras?** Isso torna-se a **saída**. -3. **Como chegas do que é dado ao que procuras?** Isso é o **processamento**, muitas vezes uma fórmula. - -Um exemplo: *Um bilhete de cinema custa 9 euros. O programa pergunta quantos bilhetes alguém compra e mostra o preço total.* - -- Dado: o número de bilhetes → `input: int quantidade "Quantos bilhetes?"` -- Procurado: o preço total → `output: "Preço total: " + total` -- Caminho: quantidade vezes 9 → `int total = quantidade * 9` - -Agora só tens de pôr as três partes umas por cima das outras, pela ordem E, P, S. - -> Procura palavras-sinal na tarefa: *pergunta*, *lê* ou *introduz* apontam para uma entrada. *Mostra*, *escreve* ou *indica* apontam para uma saída. - -## Exercício: Calculadora - -::: übung l06-rechner -titel: Soma e produto -auftrag: Pede dois números inteiros. Depois mostra a soma e o produto deles, cada um na sua linha. -Com 3 e 4 fica assim: `Soma: 7` e `Produto: 12`. -test: 3, 4 -> Soma: 7 | Produto: 12 -test: 10, -2 -> Soma: 8 | Produto: -20 -test: 0, 5 -> Soma: 5 | Produto: 0 -braucht: anweisung -tipp: Planeia a ordem: primeiro ler os dois números, depois calcular, depois mostrar. -tipp: Precisas de duas entradas, duas instruções para calcular e duas saídas. Calcula a soma numa variável própria, senão o `+` junta os números. -lösung: l06-rechner-loesung.visustruct -::: - -## Exercício: Média - -::: übung l06-mittelwert -titel: Média -auftrag: Pede dois números, que também podem ser números decimais. Mostra a média deles, ou seja, para 2 e 3 é `Média: 2.5`. -test: 2, 3 -> Média: 2.5 -test: 4, 6 -> Média: 5.0 -test: 1.5, 2 -> Média: 1.75 -braucht: anweisung -tipp: A média de dois números obtém-se somando-os e dividindo o resultado ao meio. -tipp: Para números decimais usas o tipo `double`. A média é a soma a dividir por 2. Não te esqueças dos parênteses: `(x + y) / 2`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Agora em Java - -O exemplo EPS do início fica assim em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Primeiro número?"); -int a = scanner.nextInt(); -System.out.println("Segundo número?"); -int b = scanner.nextInt(); -int soma = a + b; -System.out.println("Soma: " + soma); -``` - -- Para entradas, o Java precisa de um **Scanner**. Escreves as duas primeiras linhas uma vez lá em cima e depois podes ler quantas vezes quiseres. -- `scanner.nextInt()` lê um número inteiro, `scanner.nextDouble()` um número decimal e `scanner.next()` uma palavra. -- A pergunta ao utilizador é uma saída normal logo antes. O VisuStruct junta as duas linhas num bloco de entrada. - -::: angeberwissen -O Java foi pensado para controlar pequenos aparelhos, e ainda o faz: em muitos cartões SIM de telemóvel e cartões bancários corre uma mini versão chamada **Java Card**. É bem possível que tenhas Java no bolso neste momento. -::: - -::: übung l06-java-tage -titel: Idade em dias -code: java -auftrag: Escreve um programa em Java que pergunta a idade em anos e mostra quantos dias são, mais ou menos. Conta 365 dias por ano. Para 2 anos aparece **São cerca de 730 dias.** -test: 2 -> São cerca de 730 dias. -test: 10 -> São cerca de 3650 dias. -test: 1 -> São cerca de 365 dias. -braucht: anweisung -tipp: Primeiro as duas linhas do scanner, depois a pergunta e a entrada, depois o cálculo, depois a saída. -tipp: `int anos = scanner.nextInt();` lê. `int dias = anos * 365;` calcula, e `System.out.println("São cerca de " + dias + " dias.");` mostra. -lösung: l06-java-tage-loesung.visustruct -::: - -## Comentários no código - -Podes escrever notas no teu código. Chamam-se **comentários** (em inglês *comments*). O Java salta-os ao executar, por isso o programa e o estrutograma ficam iguais. Há dois tipos: - -- `//` transforma o resto da linha num comentário. É um **comentário de uma linha**. -- `/*` começa um **comentário de várias linhas** e `*/` termina-o. Tudo o que está entre os dois faz parte do comentário, seja quantas linhas forem. O Java não precisa dos asteriscos no início das linhas do meio, só ficam arrumados. - -Em programas acabados às vezes também vês `/** … */` com dois asteriscos no início. É um **comentário Javadoc**, a partir do qual o Java consegue criar uma descrição do programa. Para ti, chegam `//` e `/* */`. - -O exemplo EPS com comentários fica assim: - -```java editor -/* - * Tarefa: O programa pede dois números - * e mostra a sua soma. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Entrada -System.out.println("Primeiro número?"); -int a = scanner.nextInt(); -System.out.println("Segundo número?"); -int b = scanner.nextInt(); - -// Processamento -int soma = a + b; // somar os dois números - -// Saída -System.out.println("Soma: " + soma); // com 3 e 4 espero: Soma: 7 - -// Da próxima vez: permitir também números decimais -``` - -Para que servem os comentários: - -- **A tarefa:** o comentário de várias linhas lá em cima diz o que o programa deve fazer. -- **Organização:** `// Entrada`, `// Processamento` e `// Saída` dividem o código segundo o modelo EPS. -- **Explicação:** um comentário depois de uma linha diz o que o teu algoritmo faz ali. -- **Expectativa:** escreve que saída esperas. Ao testar, comparas. -- **Associar chavetas:** mais tarde vais ter blocos entre chavetas `{ }`. Aí, p. ex. `} // fim do for` mostra que chaveta fecha o quê. -- **Guardar ideias:** de que te tens de lembrar quando continuares da próxima vez? - -Clica em **Abrir no editor**, muda um comentário ou acrescenta um novo. O estrutograma fica igual e o VisuStruct guarda os teus comentários. - -> Não escrevas um comentário depois de cada linha. Explica o que o teu algoritmo faz e porquê, não cada carácter. - -::: angeberwissen -Os dois tipos são muito mais antigos do que o Java: `/* … */` vem da linguagem PL/I, de 1964, e `//` da BCPL, de 1967. O Java herdou-os através do C e do C++. -::: - -## Preenche os espaços: comentários - -::: lückentext -titel: Completar os comentários -auftrag: Completa os caracteres para que lá em cima fique um comentário de várias linhas com a tarefa e as outras duas notas sejam comentários de uma linha. -```java -[[/*]] - * Tarefa: O programa converte euros em cêntimos. - [[*/]] -int euros = 3; -[[//]] Processamento -int centimos = euros * 100; -[[//]] Saída, esperado: 300 -System.out.println(centimos); -``` -erklärung: `/*` abre o comentário de várias linhas e `*/` fecha-o. `//` só vale até ao fim da linha, por isso cada nota precisa do seu próprio `//`. -::: - -## Preenche os espaços: entrada - -::: lückentext -titel: Ler um nome e uma idade -auftrag: Preenche as palavras que faltam para que o programa leia um nome e uma idade. -```java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("Como te chamas?"); -[[String]] nome = scanner.[[next]](); -System.out.println("Que idade tens?"); -int idade = scanner.[[nextInt]](); -System.out.println("Olá " + nome + ", para o ano vais ter " + [[(idade + 1)]] + " anos."); -``` -erklärung: `scanner.next()` lê uma palavra, `scanner.nextInt()` um número inteiro. Os parênteses à volta de `idade + 1` são importantes: sem eles, o Java junta primeiro `idade` e depois `1` ao texto, e 14 passaria a **141**. -::: - -## Encontra o erro: soma - -::: übung l06-java-fehler -titel: Corrigir a soma -code: java -auftrag: O programa lê dois números e deve mostrar a soma. Mas com 3 e 4 aparece **Soma: 34** em vez de **Soma: 7**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Soma: 7 -test: 10, 5 -> Soma: 15 -test: 0, 9 -> Soma: 9 -braucht: anweisung -tipp: Lê a saída da esquerda para a direita: o que dá `"Soma: " + a`? E o que acontece quando ainda vem `+ b` a seguir? -tipp: Põe parênteses para o Java calcular primeiro: `System.out.println("Soma: " + (a + b));` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l06-java-laeuft-nicht -titel: Idade no próximo ano -code: java -auftrag: O programa pergunta a tua idade e deve dizer quantos anos terás no próximo ano. Com 14, **No próximo ano tens 15**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> No próximo ano tens 15 -test: 9 -> No próximo ano tens 10 -braucht: anweisung -tipp: A entrada fica guardada numa variável. Como se chama exatamente, e como se chama na saída? -tipp: A variável chama-se `idade` com i minúsculo: `System.out.println("No próximo ano tens " + (idade + 1));` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: O que aparece? - -::: spiel frage -titel: Jogo: O que aparece? -intro: O Ludwig construiu entradas e saídas. Diz antes o que acontece. Sete rondas. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: O que aparece? -- 7 -- [x] 34 -- a + b -> Numa saída, o `+` junta sempre as partes, mesmo números. - -runde: - int a = 3 - int b = 4 - int soma = a + b - output: "Soma: " + soma -frage: O que aparece? -- [x] Soma: 7 -- Soma: 34 -- Soma: soma -> O cálculo acontece antes, numa variável. A saída só junta o texto e o resultado. - -runde: - input: String nome "Como te chamas?" - output: "Olá" + nome + "!" -frage: Escreves Mia. O que aparece? -- Olá Mia! -- [x] OláMia! -- Olá nome! -> O texto `"Olá"` não tem espaço no fim. Por isso fica tudo colado. - -runde: - input: int idade "Quantos anos tens?" -frage: Escreves 2.5. O que acontece? -- idade fica 2. -- idade fica 2.5. -- [x] A simulação mostra um erro. -> O tipo de dados `int` só aceita números inteiros. - -runde: - input: double preco "Preço em euros?" -frage: A que parte do modelo EPS pertence este bloco? -- [x] Entrada -- Processamento -- Saída -> `input:` pede um valor. Isso é a entrada. - -runde: - double media = (a + b) / 2.0 -frage: A que parte do modelo EPS pertence este bloco? -- Entrada -- [x] Processamento -- Saída -> Aqui calcula-se alguma coisa. Isso é o processamento. - -runde: - output: "Média: " + media -frage: A que parte do modelo EPS pertence este bloco? -- Entrada -- Processamento -- [x] Saída -> `output:` mostra o resultado. Isso é a saída. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o modelo EPS. → O modelo EPS -- Consigo escrever uma entrada com tipo de dados, nome e pergunta. → Entrada com input: -- Consigo juntar texto e variáveis numa saída com +. → Cuidado com o + numa saída -- Consigo calcular primeiro um resultado e guardá-lo numa variável, depois mostrar essa variável, p. ex. `int soma = a + b`, depois `output: soma`. → Cuidado com o + numa saída -- Consigo identificar a entrada, o processamento e a saída numa tarefa. → Da tarefa ao estrutograma -- Consigo ler números em Java com o scanner. → Agora em Java -- Consigo escrever comentários com `//` e `/* */` e usá-los para organizar e explicar o meu código. → Comentários no código -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer EPS? -→ O modelo EPS -- [x] Entrada, processamento, saída -- [ ] Entrada, programa, sequência -- [ ] Editar, partilhar, sair -> Muitos programas pedem primeiro valores, processam-nos e depois mostram o resultado. - -? As variáveis a e b têm os valores 3 e 4. O que mostra `output: a + b`? -→ Cuidado com o + numa saída -- [ ] 7 -- [x] 34 -- [ ] a + b -> Numa saída, o + junta as partes. Calcula primeiro a soma numa variável. - -? Que entrada serve se for introduzido um preço como 4.99? -→ Entrada com input: -- [ ] input: int preco "Preço?" -- [x] input: double preco "Preço?" -- [ ] input: String "Preço?" -> 4.99 é um número decimal, portanto double. Além disso, cada entrada precisa de um nome de variável. - -? O que mostra `output: "Idade: " + idade` se idade tiver o valor 12? -→ Cuidado com o + numa saída -- [x] Idade: 12 -- [ ] "Idade: " + 12 -- [ ] Idade: idade - -? Tarefa: *O programa pede o raio de um círculo e mostra o seu perímetro.* Associa cada parte do texto ao seu lugar no modelo EPS. -→ Da tarefa ao estrutograma -= pede o raio -> Entrada -= perímetro = 2 * 3.14 * raio -> Processamento -= mostra o seu perímetro -> Saída -> O raio é dado, o perímetro é o que procuras. A fórmula liga os dois. - -? O que lê `scanner.nextInt()`? -→ Agora em Java -- [x] Um número inteiro -- [ ] Um número decimal -- [ ] Uma frase inteira -> Para números decimais há `scanner.nextDouble()`, para uma palavra `scanner.next()`. - -? O que faz o Java com um comentário? -→ Comentários no código -- [ ] Mostra-o como texto. -- [x] Salta-o. -- [ ] Indica um erro. -> Os comentários são notas para pessoas. O programa corre exatamente igual com ou sem eles. - -? Onde termina um comentário que começa com `/*`? -→ Comentários no código -- [x] Em `*/` -- [ ] No fim da linha -- [ ] Na próxima linha vazia -> Por isso um comentário com `/*` pode ocupar várias linhas. Já um comentário com `//` termina no fim da linha. -::: diff --git a/web/lessons/pt/07-simulation-und-schreibtischtest.md b/web/lessons/pt/07-simulation-und-schreibtischtest.md deleted file mode 100644 index 187fd9a6..00000000 --- a/web/lessons/pt/07-simulation-und-schreibtischtest.md +++ /dev/null @@ -1,364 +0,0 @@ ---- -titel: Simulação e teste de secretária -bereich: Fundamentos -kurz: Executar um estrutograma passo a passo, segui-lo à mão e encontrar erros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- iniciar a simulação, fazer pausa, executar passos individuais e pará-la -- ler as variáveis, a saída e o último passo durante a simulação -- fazer um teste de secretária à mão, em forma de tabela -- distinguir erros de sintaxe, erros de execução e erros de lógica -- encontrar um erro comparando os valores com o que espero -- acompanhar código Java com Passo a passo e pontos de paragem -::: - -## Iniciar a simulação - -Antes de chegarem as decisões e os ciclos, vais conhecer a tua ferramenta mais importante. A partir de agora podes usar a simulação para verificar sozinho cada exercício. - -Com o botão [▶︎ Iniciar simulação](#zeige-simulation) à direita nas ferramentas, o VisuStruct executa o teu estrutograma. Enquanto a simulação está a correr, não podes editar o diagrama. O mesmo botão chama-se então **■ Terminar simulação** e leva-te de volta à edição. - -À direita aparecem os **Controlos**: - -- **Reproduzir** executa o diagrama automaticamente, passo a passo. Quanto tempo espera entre dois passos defines em **Pausa por passo**. -- **Pausa** para por um momento. Depois continuas com Reproduzir ou Passo. -- **Passo** executa exatamente um passo. Assim podes observar com calma. -- **Parar** cancela e põe tudo de volta ao início. - -Abre o diagrama seguinte no editor e percorre-o com **Passo**: - -::: diagramm sim-tausch.visustruct -Os valores de a e b são trocados. A variável aux guarda um dos valores entretanto. -::: - -## O que a simulação mostra - -- **Destaque:** Um bloco do diagrama fica colorido. Com **Último passo** é o bloco que acabou de ser executado. Com **Próximo passo** é o bloco que vem a seguir. -- **Entrada:** Se o diagrama pedir um valor, escreves aqui e confirmas com **OK**. -- **Último passo:** Aqui vês o que acabou de acontecer, p. ex. `a = 5 -> 5` depois do bloco `a = b`. À esquerda, as variáveis já foram substituídas pelos seus valores; à direita da seta está o resultado. -- **Variáveis:** Todas as variáveis com os seus valores atuais. -- **Saída:** Tudo o que foi mostrado com `output:`. - -Se a área [Código](#zeige-codelive) estiver aberta à direita, a [consola](#zeige-konsole) também acompanha lá. É limpa no início e depois mostra as saídas e entradas tal como apareceriam no programa real. - -No fim aparece **Simulação terminada.** Se algo correr mal, a simulação para no bloco com erro e mostra uma mensagem, p. ex. **Variável desconhecida: total**. - -## O teste de secretária - -Num **teste de secretária** és tu o computador. Percorres o estrutograma com papel e caneta e anotas os valores das variáveis depois de cada passo. O melhor é fazer uma tabela: uma coluna para o passo, uma para cada variável e uma para a saída. - -::: grafik l07-schreibtischtest-pt.svg -Basta uma folha de papel e uma caneta: depois de cada passo escreves os novos valores numa nova linha. -::: - -Para o diagrama de cima, a tabela fica assim: - -| Passo | a | b | aux | Saída | -|---|---|---|---|---| -| `int a = 3` | 3 | – | – | | -| `int b = 5` | 3 | 5 | – | | -| `int aux = a` | 3 | 5 | 3 | | -| `a = b` | 5 | 5 | 3 | | -| `b = aux` | 5 | 3 | 3 | | -| `output: "a = " + a` | 5 | 3 | 3 | a = 5 | -| `output: "b = " + b` | 5 | 3 | 3 | b = 3 | - -Depois compara a tua tabela com a simulação. Os valores em **Variáveis** coincidem com a tua linha depois de cada passo? - -> Um teste de secretária é especialmente útil nos testes escritos. Aí não tens computador, mas mesmo assim podes mostrar o que o teu estrutograma faz. - -::: angeberwissen -Antigamente, “computador” era uma profissão: pessoas que faziam contas com lápis, papel e máquina de calcular. Uma das melhores foi a matemática Katherine Johnson, na NASA. Ela calculava trajetórias de cápsulas espaciais e, mais tarde, também do voo da Apollo 11 até à Lua. - -Em 1962, John Glenn ia ser o primeiro americano a dar a volta à Terra em órbita. A trajetória tinha sido calculada por um novo computador da IBM. Glenn não confiava totalmente na máquina e disse: “Chamem a rapariga para verificar os números. Se ela disser que estão certos, eu vou.” Katherine Johnson refez todas as contas à mão, um verdadeiro teste de secretária. Os números estavam certos, e Glenn voou. - -Katherine Johnson era negra e, nessa altura, no estado norte-americano da Virgínia, havia leis que separavam pessoas negras e brancas. No filme “Elementos Secretos” (2016), ela tem de atravessar o recinto todo a correr sempre que precisa de ir à casa de banho. O filme exagera: as casas de banho separadas existiam mesmo, mas Katherine Johnson contou que simplesmente ignorava a placa. - -A sua colega Dorothy Vaughan percebeu cedo que os computadores da IBM iam ficar com o trabalho de cálculo. Aprendeu sozinha a linguagem de programação FORTRAN e ensinou-a a toda a sua equipa. Foi assim que os computadores humanos passaram a ser programadoras. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), matemática na NASA (foto: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), domínio público). -::: - -## Três tipos de erros - -Os erros fazem parte da programação, até para profissionais. Há três tipos, e cada um encontra-se de outra maneira: - -- **Erro de sintaxe** (syntax error): O texto não cumpre as regras da linguagem, p. ex. falta um `;` no fim. O programa nem sequer arranca. -- **Erro de execução** (runtime error): O programa arranca, mas para num certo ponto, p. ex. ao dividir por 0. -- **Erro de lógica** (logic error): O programa corre até ao fim, mas o resultado está errado, p. ex. porque faltam parênteses: `a + b / 2` em vez de `(a + b) / 2`. - -É assim que o VisuStruct te mostra os erros: - -- **Erro de sintaxe:** No estrutograma acontecem menos, porque os blocos dão a forma. Na área [Código](#zeige-codelive) o sítio fica sublinhado a vermelho, o número da linha fica vermelho e lês, por exemplo, **Linha 2: Ainda falta aqui: ;**. -- **Erro de execução:** A simulação para no bloco e indica, por exemplo, **Divisão por zero.** Na área Código o número da linha fica vermelho e a [consola](#zeige-konsole) diz a linha: **Linha 3: Divisão por zero.** -- **Erro de lógica:** Aqui ninguém avisa nada. O computador não sabe o que querias. Só tu conheces o resultado certo, por isso aqui ajuda o teste de secretária. - -> Um número de linha vermelho mostra um erro. O ponto vermelho redondo antes do número da linha é outra coisa: um ponto de paragem. Vais conhecê-lo mais abaixo em “Agora em Java”. - -## Encontrar erros - -Se um estrutograma mostrar algo errado, é um erro de lógica. Então faz assim: - -1. **Escreve o que esperas:** O que deve sair para uma determinada entrada? -2. **Executa passo a passo:** Inicia a simulação com **Passo** e observa as variáveis. -3. **Encontra o sítio:** Onde é que um valor fica pela primeira vez diferente do que esperavas? É exatamente aí que está o erro. - -Erros frequentes numa sequência são: - -- A **ordem** está errada: uma variável é usada antes de ter um valor. -- Um valor é **escrito por cima** antes de ser preciso. -- Faltam **parênteses**: `a + b / 2` não é o mesmo que `(a + b) / 2`. -- São divididos dois números inteiros: `7 / 2` dá `3`, porque com `int` tudo o que vem depois da vírgula desaparece. - -> Mais tarde chegam as decisões e os ciclos. Aí a simulação também te mostra que ramo é seguido e quantas vezes um ciclo é executado. - -::: angeberwissen -A 9 de setembro de 1947, a equipa de Grace Hopper encontrou uma traça verdadeira presa entre dois contactos do computador Harvard Mark II. Colaram-na no diário de bordo e escreveram: “Primeiro caso real de um bug encontrado.” Hoje a traça está num museu em Washington. - -Grace Hopper foi uma das primeiras programadoras do mundo. Em 1952 construiu um dos primeiros **compiladores**: um programa que traduz código para código máquina. Achava que devia ser possível dar ordens aos computadores em inglês quase normal. Daí nasceu a linguagem de programação COBOL, que muitos bancos ainda hoje usam. Na Marinha dos EUA chegou mesmo a almirante. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), informática e almirante (foto: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), domínio público). -::: - -## Exercício: Corrigir a troca - -::: übung sim-tausch -titel: Corrigir a troca -auftrag: O estrutograma deve ler dois números e mostrá-los trocados. Ou seja, com 3 e 5 deve aparecer primeiro **5** e depois **3**. Mas mostra 5 duas vezes. - Faz um teste de secretária ou usa **Passo** e corrige o erro. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Percorre o diagrama com **Passo** e anota os valores de a e b depois de cada passo. Onde é que o 3 desaparece? -tipp: Olha para a depois do passo `a = b`. Para onde foi o valor antigo de a? Guarda-o primeiro numa variável auxiliar, como no exemplo de cima. -lösung: sim-tausch-loesung.visustruct -::: - -## Exercício: Corrigir os bilhetes de cinema - -::: übung sim-kino -titel: Corrigir os bilhetes de cinema -auftrag: Um bilhete de cinema custa 8.50 euros. O estrutograma deve pedir o número de bilhetes e mostrar o preço total, ou seja, para 2 bilhetes `Total: 17.0`. - Inicia a simulação. Ela para com uma mensagem de erro. Descobre porquê e corrige o estrutograma. -start: sim-kino-start.visustruct -test: 2 -> Total: 17.0 -test: 3 -> Total: 25.5 -test: 0 -> Total: 0.0 -braucht: anweisung -tipp: Lê com atenção a mensagem de erro da simulação. Que variável é que ela ainda não conhece? -tipp: A simulação executa os blocos de cima para baixo. O total já tem um valor quando chega a saída? Podes mover os blocos com o rato. -lösung: sim-kino-loesung.visustruct -::: - -> Se uma simulação nunca mais acabar, clica em **Parar**. Quando **Verificas** um exercício, o VisuStruct para sozinho depois de um número muito grande de passos. - -## Agora em Java - -Também podes executar código Java passo a passo. Na área [Código](#zeige-codelive), a ferramenta para isso chama-se **depurador** (debugger): - -- Clica num número de linha à esquerda. Aparece um ponto vermelho: é um **ponto de paragem**. [▶︎ Executar](#zeige-ausfuehren) para antes dessa linha. -- O botão [Passo a passo](#zeige-einzelschritt) executa exatamente uma linha, como **Passo** na simulação. -- Por baixo do código vês o valor atual de cada variável. É o teu teste de secretária, só que é o computador que escreve. - -::: übung l07-java-pizza -titel: Corrigir a encomenda de pizzas -code: java -auftrag: Uma pizza custa 8 euros, o queijo extra 2 euros. Para 3 pizzas com queijo extra, o programa deve mostrar **Total: 30**. Mas mostra 14. - Percorre o código Java com Passo a passo e observa `total`. Encontra o erro e corrige-o no código. -start: l07-java-pizza-start.visustruct -test: - -> Total: 30 -braucht: anweisung -tipp: Que valor está em `total` depois da quarta linha? Faz as contas de cabeça: o que é que o Java calcula primeiro? -tipp: Como na matemática, a multiplicação vem antes da soma: `preco + queijo * quantidade` é `8 + 6`. Põe parênteses: `(preco + queijo) * quantidade`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Preenche os espaços: teste de secretária - -::: lückentext -titel: O que está nas variáveis? -auftrag: Faz um teste de secretária de cabeça. Escreve depois de cada linha o valor que a variável tem a seguir e, na última linha, o que é mostrado. -```java -int a = 5; -int b = 2; -a = a + b; // a vale agora [[7]] -b = a * 2; // b vale agora [[14]] -a = b - a; // a vale agora [[7]] -System.out.println(a + b); // saída: [[21]] -``` -erklärung: Cada linha calcula com os valores que estão nesse momento nas variáveis: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, saída 7 + 14 = 21. Podes confirmar com Passo a passo na área Código. -::: - -## Encontra o erro: pontuação - -::: übung l07-java-fehler -titel: Corrigir a pontuação -code: java -auftrag: Num jogo, o Ludwig ganha primeiro 10 pontos, depois 5 pontos e depois perde 3 pontos. No fim deve aparecer **Pontos: 12**. Mas aparece **Pontos: 3**. - Percorre o código com Passo a passo e observa `pontos`. Corrige a linha errada e carrega em Verificar. -start: l07-java-fehler-start.visustruct -test: - -> Pontos: 12 -braucht: anweisung -tipp: Depois de que linha é que `pontos` passa de repente a valer 3? O que devia acontecer nessa linha? -tipp: O Ludwig perde 3 pontos, por isso tira-se 3 ao valor antigo: `pontos = pontos - 3;` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l07-java-laeuft-nicht -titel: Corrigir o bónus -code: java -auftrag: O Ludwig tem 10 pontos e recebe 5 pontos de bónus. No fim deve aparecer **Pontos: 15**. Mas o código não corre. Percorre-o também com o passo a passo: em que linha para? - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Pontos: 15 -braucht: anweisung -tipp: O Java executa o código de cima para baixo. A variável `bonus` já existe quando é usada no cálculo? -tipp: Cria `bonus` antes do cálculo: primeiro `int bonus = 5;`, depois `pontos = pontos + bonus;` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa tem **exatamente um erro**, e a bomba está a fazer tique-taque. Faz o teste de secretária de cabeça e toca na linha errada antes de o tempo acabar. Os programas estão em Java, mas cada linha é um bloco como no estrutograma. Seis rondas, 30 segundos cada. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int aux = a; - a = b; - b = a; -frage: Deve trocar os valores de a e b. -fehler: 5 -besser: b = aux; -> a já tem o valor de b. O valor antigo de a está em aux. - -runde: - int a = 4; - int b = 6; - double media = a + b / 2; - System.out.println(media); -frage: Deve mostrar a média 5.0. -fehler: 3 -besser: double media = (a + b) / 2.0; -> Sem parênteses, a divisão vem primeiro: 4 + 6 / 2 = 7. - -runde: - int bilhetes = 3; - double preco = 8.5; - double total = bilhetes + preco; - System.out.println("Total: " + total); -frage: Deve mostrar o preço de 3 bilhetes de cinema a 8,50 € cada. -fehler: 3 -besser: double total = bilhetes * preco; -> Para o preço total multiplica-se, não se soma. - -runde: - int minutos = 135; - int horas = minutos / 60; - int resto = minutos / 60; - System.out.println(horas + " h " + resto + " min"); -frage: Deve mostrar 2 h 15 min. -fehler: 3 -besser: int resto = minutos % 60; -> `%` dá o resto de uma divisão. Com `/`, resto também ficava com 2. - -runde: - String nome = "Ada"; - System.out.println("Olá " + "nome" + "!"); -frage: Deve mostrar "Olá Ada!". -fehler: 2 -besser: System.out.println("Olá " + nome + "!"); -> Entre aspas, nome é só um texto. A variável não tem aspas. - -runde: - double preco = 100; - preco = preco * 0.1; - System.out.println(preco); -frage: Deve aumentar o preço em 10 %, ou seja, mostrar 110.0. -fehler: 2 -besser: preco = preco + preco * 0.1; -> Vezes 0.1 dá só os 10 %, ou seja, 10.0. Isso ainda tem de ser somado ao preço antigo. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo iniciar a simulação, fazer pausa, executar passos individuais e pará-la. → Iniciar a simulação -- Consigo ler as variáveis, a saída e o último passo durante a simulação. → O que a simulação mostra -- Consigo fazer um teste de secretária à mão, em forma de tabela. → O teste de secretária -- Consigo distinguir erros de sintaxe, erros de execução e erros de lógica. → Três tipos de erros -- Consigo encontrar um erro comparando os valores com o que espero. → Encontrar erros -- Consigo acompanhar código Java com Passo a passo e pontos de paragem. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que botão executa exatamente um passo? -→ Iniciar a simulação -- [ ] Reproduzir -- [x] Passo -- [ ] Parar -> Reproduzir continua automaticamente, Passo executa só um passo. - -? O que anotas depois de cada passo num teste de secretária? -→ O teste de secretária -- [ ] Só a saída no fim -- [x] Os valores atuais de todas as variáveis -- [ ] O código Java gerado -> Assim vês exatamente onde um valor é diferente do que esperavas. - -? Primeiro `int a = 3`, depois `int b = 5`, depois `a = b`. Que valores têm a e b a seguir? -→ O teste de secretária -- [ ] a = 5 e b = 3 -- [x] a = 5 e b = 5 -- [ ] a = 3 e b = 5 -> O valor antigo de a foi escrito por cima. É por isso que precisas de uma variável auxiliar para trocar valores. - -? O campo Último passo mostra `preco = 4 * 2.5 -> 10.0`. O que quer isso dizer? -→ O que a simulação mostra -- [ ] A variável preco tem agora o valor 4. -- [x] Foi calculado 4 * 2.5 e o resultado 10.0 foi guardado em preco. -- [ ] A simulação encontrou um erro. - -? A simulação indica **Variável desconhecida: soma**. Qual é uma razão provável? -→ Encontrar erros -- [x] soma é usada antes de lhe ter sido dado um valor. -- [ ] soma é demasiado grande. -- [ ] O estrutograma tem demasiados blocos. - -? O que faz um ponto vermelho antes de um número de linha na área Código? -→ Agora em Java -- [ ] Marca um erro. -- [x] O programa para antes dessa linha. -- [ ] A linha é saltada. -> É um ponto de paragem. Continuas com ▶︎ ou com Passo a passo. -? Associa cada erro ao seu tipo. -→ Três tipos de erros -= Falta o ponto e vírgula no fim da linha. -> Erro de sintaxe -= O programa divide por 0 e para. -> Erro de execução -= A média dá demasiado alta porque faltam parênteses. -> Erro de lógica - -? O programa corre até ao fim sem nenhuma mensagem, mas mostra 12 em vez de 21. Que tipo de erro é? -→ Três tipos de erros -- [ ] Erro de sintaxe -- [ ] Erro de execução -- [x] Erro de lógica -> Não há mensagem, mas o resultado está errado. Um erro destes só se encontra com o que esperas e com o teste de secretária. -::: diff --git a/web/lessons/pt/08-verzweigung.md b/web/lessons/pt/08-verzweigung.md deleted file mode 100644 index 26ffe253..00000000 --- a/web/lessons/pt/08-verzweigung.md +++ /dev/null @@ -1,368 +0,0 @@ ---- -titel: Decisão -bereich: Fundamentos -kurz: Usar uma condição para decidir qual de dois ramos é executado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que é executado exatamente um ramo de uma decisão -- usar os operadores de comparação == != < <= > >= -- distinguir == de = -- construir uma decisão com um ramo vazio -- escrever uma decisão com if e else em Java -::: - -## Se, então, senão - -Até agora, todos os blocos eram sempre executados. Mas muitas vezes um programa deve **decidir**: se uma condição se verificar, faz uma coisa, senão faz a outra. - -::: diagramm l07-alter-pruefen.visustruct -Consoante a idade introduzida, aparece uma mensagem ou a outra. Experimenta 17 e 18 na simulação. -::: - -É para isso que serve a **decisão**. A condição fica no triângulo em cima. Por baixo, o estrutograma divide-se em dois ramos: - -- **true** (esquerda): é executado se a condição for verdadeira -- **false** (direita): é executado se a condição for falsa - -É sempre executado **exatamente um** dos dois ramos. Depois, o programa continua por baixo da decisão. - -## Inserir uma decisão - -Arrasta a **Decisão** da área Elementos para o estrutograma. Clica no triângulo e escreve a condição no Inspetor de objetos, p. ex. `idade >= 18`. A palavra `if` já está à frente. - -Cada ramo começa com um marcador ø. Arrasta instruções para lá. Um ramo também pode ter vários blocos uns por cima dos outros. - -## Operadores de comparação - -Uma condição é normalmente uma **comparação**. O seu resultado é sempre `true` ou `false`. - -- `==` igual, p. ex. `numero == 0` -- `!=` diferente, p. ex. `resposta != 42` -- `<` menor, `<=` menor ou igual -- `>` maior, `>=` maior ou igual - -> Não confundas `==` com `=`. Um só `=` é uma atribuição e guarda um valor. Para comparar precisas de dois sinais de igual. - -Com `%` verificas se um número é divisível por outro: `numero % 2 == 0` é verdadeiro se `numero` for par. - -## Exercício: Par ou ímpar - -::: übung l07-gerade -titel: Par ou ímpar -auftrag: Pede um número inteiro. Mostra **par** se for par, senão **ímpar**. -test: 4 -> par -test: 7 -> ímpar -test: 0 -> par -braucht: verzweigung -tipp: Aqui há duas possibilidades, por isso precisas de uma decisão. Como reconheces um número par? -tipp: Um número é par se não sobrar resto quando o divides por 2. A condição é `numero % 2 == 0`. -lösung: l07-gerade-loesung.visustruct -::: - -## Exercício: O número maior - -::: übung l07-maximum -titel: O número maior -auftrag: Pede dois números inteiros e mostra só o maior. Se os dois forem iguais, mostra esse número. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: Uma decisão compara os dois números. Cada ramo tem exatamente uma saída. -tipp: Compara com `a > b`. No ramo true mostras `a`, no ramo false `b`. -lösung: l07-maximum-loesung.visustruct -::: - -## Um ramo vazio - -Às vezes uma coisa só deve acontecer se a condição for verdadeira e, caso contrário, não acontece nada. Então o ramo false fica **vazio**. No estrutograma mostra o marcador **ø**. - -::: diagramm l07-rabatt.visustruct -A partir de 50 euros tens 5 euros de desconto. Caso contrário não acontece nada; o ramo false está vazio. A saída em baixo é executada nos dois casos. -::: - -::: angeberwissen -Uma única decisão esquecida deixou meia Internet em alvoroço em 2014: a falha de segurança **Heartbleed** no OpenSSL, um programa que muitos sites usam para a encriptação. Um computador podia dizer ao servidor: “Devolve-me a palavra *pão*, tem 500 letras.” O servidor não verificava se 500 correspondia ao comprimento real de 3 e devolvia simplesmente 500 caracteres da sua memória. Às vezes lá dentro estavam palavras-passe de outras pessoas. Só faltava um if: se o comprimento indicado for maior do que o real, então não devolver nada. Já agora, isto não tinha nada a ver com chavetas. Mééé, verifica as tuas entradas antes de acreditares nelas. -::: - -## Exercício: Valor absoluto - -::: übung l07-betrag -titel: Valor absoluto de um número -auftrag: Pede um número inteiro. Se for negativo, torna-o positivo. Depois mostra o número. Assim, -5 passa a 5, e 7 fica 7. -Usa uma decisão com um ramo vazio e só **uma** saída por baixo da decisão. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Só os números negativos têm de ser alterados. O que acontece a um número se o multiplicares por -1? -tipp: A condição é `numero < 0`. No ramo true trocas o sinal, p. ex. com `numero = 0 - numero`. O ramo false fica vazio. -lösung: l07-betrag-loesung.visustruct -::: - -## Agora em Java - -Esta é a verificação da idade do início desta lição em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Quantos anos tens?"); -int idade = scanner.nextInt(); -if (idade >= 18) { - System.out.println("És maior de idade."); -} else { - System.out.println("Ainda não és maior de idade."); -} -``` - -- A condição fica depois de `if`, entre **parênteses curvos** `( )`. -- O ramo true fica entre **chavetas** `{ }`, o ramo false vem depois de `else`, nas suas próprias chavetas. Depois de uma chaveta não há ponto e vírgula. -- Se o ramo false estiver vazio, deixas simplesmente de fora `else { }`. -- O teu programa precisa das duas primeiras linhas uma vez, assim que lê alguma coisa. Depois, `scanner.nextInt()` lê um número inteiro. A pergunta antes disso é uma saída normal. - -::: angeberwissen -O Java também tem uma mascote: o **Duke**, um bonequinho preto e branco com um grande nariz vermelho. Foi desenhado pela equipa do Java em 1992 e desde então acena em conferências e t-shirts. O Ludwig acha que um bode teria ficado melhor. -::: - -::: übung l08-java-bestanden -titel: Aprovado em Java -code: java -auftrag: Escreve um programa em Java que pergunta pela pontuação. A partir de 50 pontos mostra **aprovado**, senão **reprovado**. - Escreve o código na área Código e depois clica em Verificar. -test: 50 -> aprovado -test: 49 -> reprovado -test: 100 -> aprovado -test: 0 -> reprovado -braucht: verzweigung -tipp: Começa pelas duas linhas do scanner. Depois perguntas pelos pontos, lês o valor e comparas com `if`. -tipp: A condição é `pontos >= 50`. Num ramo fica `System.out.println("aprovado");` e depois de `else` vem `System.out.println("reprovado");`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Preenche os espaços: par ou ímpar - -::: lückentext -titel: Par ou ímpar -auftrag: Preenche as palavras e os sinais que faltam. O programa deve mostrar se um número é par. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que número?"); -int numero = scanner.nextInt(); -[[if]] (numero [[%]] 2 [[==]] 0) [[{]] - System.out.println("par"); -[[}]] [[else]] { - System.out.println("ímpar"); -} -``` -erklärung: `numero % 2` é o resto da divisão por 2. Se for 0, o número é par. Para comparar precisas de `==`, um `=` sozinho é uma atribuição. Os dois ramos ficam entre chavetas. -::: - -::: angeberwissen -Se um ramo tiver só uma instrução, o Java até deixa tirar as chavetas. Nós nunca fazemos isso, e é por esta razão: - -```java -if (idade >= 18) - System.out.println("És maior de idade."); - System.out.println("Podes ver o filme."); -``` - -Sem chavetas, só a primeira linha pertence ao if. A segunda é sempre executada, até para quem tem doze anos. A indentação engana, porque o Java não liga aos espaços. - -Foi exatamente um erro destes que estava escondido em iPhones e Macs em 2014, conhecido como **“goto fail”**. Na linguagem C, a linha `goto fail;` aparecia por engano duas vezes debaixo de um if sem chavetas. A segunda era sempre executada e saltava a verificação dos certificados de segurança. Numa rede Wi-Fi aberta, um atacante podia, por exemplo, fazer-se passar pelo teu banco. Mééé, as chavetas custam dois caracteres, uma falha de segurança custa muito mais. -::: - -## Encontra o erro: entrada - -::: übung l08-java-fehler -titel: Corrigir a entrada -code: java -auftrag: No jardim zoológico, as crianças com **menos** de 6 anos entram de graça, todos os outros pagam 4 euros. Mas o programa também deixa entrar de graça as crianças de seis anos. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l08-java-fehler-start.visustruct -test: 5 -> Entrada gratuita -test: 6 -> 4 euros -test: 10 -> 4 euros -test: 0 -> Entrada gratuita -braucht: verzweigung -tipp: Experimenta o programa com 6. Que operador de comparação ainda deixa passar o 6? -tipp: “Menos de 6” é `idade < 6`. `<=` significa “menor ou igual”. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l08-java-laeuft-nicht -titel: Filme para maiores de 16 -code: java -auftrag: O filme é para maiores de 16. O Ludwig tem 15, por isso o programa deve mostrar **Não pode entrar**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> Não pode entrar -braucht: verzweigung -tipp: Olha com atenção para a condição entre parênteses depois de `if`. Esta variável existe? -tipp: A variável chama-se `idade` com i minúsculo: `if (idade >= 16) {` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que caminho? - -::: spiel frage -titel: Jogo: Que caminho? -intro: O Ludwig escreveu decisões em Java. Avalia a condição de cabeça e diz o que aparece. Sete rondas. - -runde: - int x = 5; - if (x > 5) { - System.out.println("grande"); - } else { - System.out.println("pequeno"); - } -frage: O que aparece? -- grande -- [x] pequeno -- nada -> 5 > 5 é falso, porque 5 não é maior do que 5. Portanto, o ramo falso. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("grande"); - } else { - System.out.println("pequeno"); - } -frage: O que aparece? -- [x] grande -- pequeno -- grande e pequeno -> `>=` quer dizer "maior ou igual". 5 >= 5 é verdadeiro. - -runde: - int numero = 7; - if (numero % 2 == 0) { - System.out.println("par"); - } else { - System.out.println("ímpar"); - } -frage: O que aparece? -- par -- [x] ímpar -- 1 -> 7 % 2 dá resto 1, portanto não 0. O número é ímpar. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: O que aparece? -- -4 -- [x] 4 -- nada -> -4 < 0 é verdadeiro, por isso o sinal é invertido. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: O que aparece? -- -4 -- [x] 4 -- nada -> 4 < 0 é falso. O ramo falso está vazio, o programa continua simplesmente por baixo. - -runde: - int nota = 3; - if (nota != 3) { - System.out.println("diferente"); - } else { - System.out.println("três"); - } -frage: O que aparece? -- diferente -- [x] três -- nada -> `!=` quer dizer "diferente de". 3 != 3 é falso. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: O que aparece? -- 8 -- [x] 12 -- 20 -> O programa mostra o maior dos dois números. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que é executado exatamente um ramo de uma decisão. → Se, então, senão -- Consigo usar os operadores de comparação == != < <= > >=. → Operadores de comparação -- Consigo distinguir == de =. → Operadores de comparação -- Consigo construir uma decisão com um ramo vazio. → Um ramo vazio -- Consigo escrever uma decisão com if e else em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que ramo é executado se a condição for falsa? -→ Se, então, senão -- [ ] O ramo true -- [x] O ramo false -- [ ] Os dois ramos -- [ ] Nenhum, o programa termina -> Com false, é executado o ramo da direita. Depois, o programa continua por baixo da decisão. - -? Que condição verifica se idade é exatamente 18? -→ Operadores de comparação -- [ ] idade = 18 -- [x] idade == 18 -- [ ] idade >= 18 -> Um só = é uma atribuição. Para comparar precisas de ==. - -? O que significa ø num ramo? -→ Um ramo vazio -- [x] Neste caso não acontece nada. -- [ ] O programa termina aqui. -- [ ] A condição é falsa. - -? A condição é `pontos >= 50`. Para que valor é verdadeira? -→ Operadores de comparação -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= quer dizer maior ou igual. Portanto o 50 está incluído. - -? Nos manuais, a decisão tem muitas vezes outro nome. Qual? -→ Se, então, senão -- [ ] Seleção múltipla -- [x] Instrução condicional -- [ ] Iteração -> As instruções de um ramo só são executadas sob uma condição. Por isso também se chama instrução condicional. - -? Onde fica em Java a condição de uma decisão? -→ Agora em Java -- [x] Entre parênteses curvos logo a seguir a if -- [ ] Entre chavetas depois de else -- [ ] Depois de um ponto e vírgula -> `if (idade >= 18) { … }`: os parênteses curvos pertencem à condição, as chavetas ao ramo. -::: diff --git a/web/lessons/pt/09-bedingungen-verknuepfen.md b/web/lessons/pt/09-bedingungen-verknuepfen.md deleted file mode 100644 index e18e0a47..00000000 --- a/web/lessons/pt/09-bedingungen-verknuepfen.md +++ /dev/null @@ -1,328 +0,0 @@ ---- -titel: Combinar condições -bereich: Fundamentos -kurz: Juntar várias condições com e, ou e não, e verificar intervalos de valores. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar quando é que uma combinação com && é verdadeira -- explicar quando é que uma combinação com || é verdadeira -- inverter uma condição com ! -- verificar se um valor está num intervalo como de 1 a 5 -- ler a tabela de verdade de &&, || e ! -- guardar o resultado de uma condição numa variável boolean -- avaliar condições compostas com segurança -- ligar condições em Java com && e || -::: - -## E: && - -Às vezes uma só comparação não chega. Por exemplo, só tens direito a um bilhete jovem se tiveres **pelo menos 12 anos e menos de 18**. - -Com `&&` (e) juntas duas condições. O resultado só é `true` se **as duas** condições forem verdadeiras. - -::: diagramm l08-jugendticket.visustruct -As duas comparações têm de estar certas. Experimenta 11, 12, 17 e 18 na simulação. -::: - -## Ou: || - -Com `||` (ou), o resultado é `true` se **pelo menos uma** das condições for verdadeira. Também podem ser as duas. - -``` -dia == 6 || dia == 7 -``` - -Esta condição é verdadeira se `dia` tiver o valor 6 ou o valor 7, ou seja, ao sábado ou ao domingo. - -> Num teclado português, a barra vertical `|` escreve-se com Shift e a tecla à esquerda do 1. - -## Exercício: Fim de semana - -::: übung l08-wochenende -titel: Fim de semana -auftrag: Pede um dia da semana como número (1 é segunda-feira, 7 é domingo). Mostra **Fim de semana** se for sábado ou domingo, senão **Dia útil**. -test: 6 -> Fim de semana -test: 7 -> Fim de semana -test: 1 -> Dia útil -test: 5 -> Dia útil -braucht: verzweigung -tipp: É fim de semana se o dia for 6 **ou** 7. Para isso precisas de duas comparações numa só condição. -tipp: Sábado é 6, domingo é 7. Junta as duas comparações com `||`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Verificar intervalos de valores - -No ensino básico em Portugal, as notas vão de 1 a 5 (5 é a melhor). Verificas se uma nota está **dentro do intervalo** com duas comparações e `&&`: - -``` -nota >= 1 && nota <= 5 -``` - -::: grafik l08-zahlenstrahl.svg -O intervalo verde de 1 a 5 é válido; as duas pontas estão incluídas. -::: - -Ao contrário, uma nota está **fora** do intervalo se for demasiado pequena **ou** demasiado grande: - -::: diagramm l08-note.visustruct -Não há notas menores do que 1 nem maiores do que 5. -::: - -> A forma como se escreve na matemática, `1 <= nota <= 5`, não funciona. Tens de a dividir em duas comparações e juntá-las com `&&`. - -## Exercício: Nota válida - -::: übung l08-note-gueltig -titel: Nota válida -auftrag: Pede uma nota como número inteiro. Mostra **válida** se estiver entre 1 e 5 (1 e 5 incluídos), senão **inválida**. -test: 1 -> válida -test: 5 -> válida -test: 3 -> válida -test: 0 -> inválida -test: 6 -> inválida -braucht: verzweigung -tipp: Uma nota válida tem de cumprir duas coisas ao mesmo tempo: não ser demasiado pequena **e** não ser demasiado grande. -tipp: A nota tem de ser maior ou igual a 1 e, ao mesmo tempo, menor ou igual a 5. -lösung: l08-gueltig-loesung.visustruct -::: - -## Não e parênteses - -Com `!` (não) inverte-se uma condição: `true` passa a `false` e vice-versa. - -``` -!(nota >= 1 && nota <= 5) -``` - -Isto é verdadeiro se a nota **não** estiver no intervalo, e quer dizer o mesmo que `nota < 1 || nota > 5`. - -Se `&&` e `||` aparecerem juntos, o `&&` é calculado primeiro, tal como a multiplicação antes da adição. É melhor usar **parênteses**; assim fica claro o que pertence ao quê: - -``` -(idade >= 12 && idade < 18) || estudante == 1 -``` - -## A tabela de verdade - -Uma **tabela de verdade** mostra de relance o que resulta de `&&`, `||` e `!`. À esquerda estão as quatro possibilidades para duas condições `a` e `b`, à direita o resultado: - -::: grafik l09-wahrheitstabelle.svg -Verde é true, vermelho é false. Com && só há uma linha verde, com || só uma vermelha. -::: - -Para fixar: - -- `a && b` só é verdadeiro se **ambas** forem verdadeiras. -- `a || b` só é falso se **ambas** forem falsas. -- `!a` inverte o valor. - -::: angeberwissen -O tipo de dados `boolean` tem o nome de **George Boole**. Este inglês mostrou já em 1847 que se pode calcular com verdadeiro e falso como com números, quase cem anos antes de existir o primeiro computador. Hoje a sua lógica está em todos os chips. -::: - -## Valores lógicos em variáveis - -O resultado de uma condição é um **valor lógico** do tipo `boolean`. Podes guardá-lo numa variável, tal como um número, e usá-lo mais tarde: - -``` -boolean fimDeSemana = dia == 6 || dia == 7 -``` - -Na decisão fica então só `fimDeSemana`. Lê-se quase como uma frase: "Se for fim de semana, então …". Não escrevas `fimDeSemana == true`, porque `fimDeSemana` já é true ou false. - -Com `!fimDeSemana` perguntas pelo contrário, ou seja, um dia útil. - -::: ludwig -Condições longas ficam mais claras se puseres partes delas em variáveis boolean com nomes claros, por exemplo `boolean jovem = idade >= 12 && idade < 18`. -::: - -## Jogo: Verdadeiro ou falso? - -Agora é a tua vez. Calcula cada condição de cabeça. Depois de cada resposta vês como o VisuStruct a avalia passo a passo. - -::: spiel -idade: 8..20 -dia: 1..7 -nota: 0..6 -estudante: boolean -fimDeSemana: boolean -? idade >= 18 -? dia == 6 -? nota != 3 -? idade >= 12 && idade < 18 -? dia == 6 || dia == 7 -? estudante && fimDeSemana -? !estudante -? nota >= 1 && nota <= 5 -? !(idade < 18) -? estudante || idade >= 18 -? (idade >= 12 && idade < 18) || estudante -? !(nota >= 1 && nota <= 5) -? !fimDeSemana && dia != 3 -? idade >= 12 && idade < 18 && !estudante -::: - -## Exercício: Ano bissexto - -::: übung l08-schaltjahr -titel: Ano bissexto -auftrag: Um ano é bissexto se for divisível por 4, mas não por 100. Os anos divisíveis por 400 são bissextos de qualquer forma. -Pede um ano e mostra **Ano bissexto** ou **Não é ano bissexto**. -test: 2024 -> Ano bissexto -test: 2023 -> Não é ano bissexto -test: 1900 -> Não é ano bissexto -test: 2000 -> Ano bissexto -braucht: verzweigung -tipp: Confirma primeiro a regra com exemplos: 2024 é bissexto, 1900 não é, 2000 é. “Divisível” quer dizer que o resto é 0. -tipp: Divisível por 4 é `ano % 4 == 0`, não divisível por 100 é `ano % 100 != 0`. Junta estas duas com `&&`, põe parênteses à volta e acrescenta o caso do 400 com `||`. -tipp: Quase a solução: uma única decisão com a condição `(ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0`. No ramo true fica `output: "Ano bissexto"`, no ramo false `output: "Não é ano bissexto"`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Agora em Java - -O bilhete jovem do início fica assim em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Quantos anos tens?"); -int idade = scanner.nextInt(); -if (idade >= 12 && idade < 18) { - System.out.println("Bilhete jovem"); -} else { - System.out.println("Sem bilhete jovem"); -} -``` - -Os sinais `&&`, `||` e `!` são exatamente os que já usas no estrutograma. Vêm do Java. Como sempre, a condição inteira fica entre os parênteses curvos depois de `if`. - -::: übung l09-java-schule -titel: Escola ou tempo livre -code: java -auftrag: Escreve um programa em Java que pergunta a hora (0 a 23). Das 8 até às 15, inclusive, mostra **Escola**, senão **Tempo livre**. -test: 8 -> Escola -test: 15 -> Escola -test: 16 -> Tempo livre -test: 7 -> Tempo livre -braucht: verzweigung -tipp: A hora tem de cumprir duas condições ao mesmo tempo. Que operador quer dizer “e”? -tipp: `if (hora >= 8 && hora <= 15) { … } else { … }` -lösung: l09-java-schule-loesung.visustruct -::: - -## Preenche os espaços: condições - -::: lückentext -titel: Nota e fim de semana -auftrag: Preenche os operadores e as palavras que faltam. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que nota?"); -int nota = scanner.nextInt(); -if (nota >= 1 [[&&]] nota [[<=]] 5) { - System.out.println("nota válida"); -} else { - System.out.println("nota inválida"); -} -System.out.println("Que dia (1 a 7)?"); -int dia = scanner.nextInt(); -[[boolean]] fimDeSemana = dia == 6 [[||]] dia == 7; -if ([[!]]fimDeSemana) { - System.out.println("dia de escola"); -} -``` -erklärung: Uma nota é válida quando **as duas** condições são verdadeiras, por isso `&&`. É fim de semana quando **uma** das duas é verdadeira, por isso `||`. O resultado cabe numa variável `boolean`, e `!` inverte-o. -::: - -## Encontra o erro: sem escola - -::: übung l09-java-fehler -titel: Corrigir o dia sem escola -code: java -auftrag: O programa deve mostrar **sem escola** para o dia 6 (sábado) e o dia 7 (domingo), e **escola** nos outros dias. Mas mostra sempre **escola**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l09-java-fehler-start.visustruct -test: 6 -> sem escola -test: 7 -> sem escola -test: 3 -> escola -test: 1 -> escola -braucht: verzweigung -tipp: `dia` pode ser 6 **e** 7 ao mesmo tempo? -tipp: Basta que uma das duas condições seja verdadeira: `dia == 6 || dia == 7`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l09-java-laeuft-nicht -titel: Corrigir o fim de semana -code: java -auftrag: O dia 6 é sábado, o dia 7 é domingo. Hoje é o dia 7, por isso deve aparecer **sem escola**. Mas o programa não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> sem escola -braucht: verzweigung -tipp: A condição tem duas partes. Compara o nome da variável nas duas partes. -tipp: Também na segunda parte a variável chama-se `dia` com d minúsculo: `if (dia == 6 || dia == 7) {` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar quando é que uma combinação com && é verdadeira. → E: && -- Consigo explicar quando é que uma combinação com || é verdadeira. → Ou: || -- Consigo inverter uma condição com !. → Não e parênteses -- Consigo verificar se um valor está num intervalo como de 1 a 5. → Verificar intervalos de valores -- Consigo ler a tabela de verdade de &&, || e !. → A tabela de verdade -- Consigo guardar o resultado de uma condição numa variável boolean. → Valores lógicos em variáveis -- Consigo avaliar condições compostas com segurança (pelo menos 8 de 10 certas no jogo). → Jogo: Verdadeiro ou falso? -- Consigo ligar condições em Java com && e ||. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quando é que `a && b` é verdadeiro? -→ E: && -- [ ] Se a ou b for verdadeiro -- [x] Só se a e b forem ambos verdadeiros -- [ ] Se exatamente um deles for verdadeiro -> Com && as duas partes têm de estar certas. Se uma for falsa, o todo é falso. - -? A variável dia tem o valor 6. Quanto dá `dia == 6 || dia == 7`? -→ Ou: || -- [x] true -- [ ] false -> Com || basta que um dos lados seja verdadeiro. - -? Que condição verifica se numero está entre 10 e 20 (ambos incluídos)? -→ Verificar intervalos de valores -- [ ] 10 <= numero <= 20 -- [ ] numero >= 10 || numero <= 20 -- [x] numero >= 10 && numero <= 20 -> Com || todos os números seriam permitidos, porque qualquer número é maior do que 10 ou menor do que 20. - -? Quanto dá `!(5 > 3)`? -→ Não e parênteses -- [ ] true -- [x] false -> 5 > 3 é verdadeiro, e o ! inverte isso. - -? Como escreves em Java “idade é pelo menos 12 e menor do que 18”? -→ Agora em Java -- [ ] if (12 <= idade < 18) -- [x] if (idade >= 12 && idade < 18) -- [ ] if (idade >= 12 || idade < 18) -> Cada comparação fica sozinha, ligada com `&&`. -::: diff --git a/web/lessons/pt/10-fallauswahl.md b/web/lessons/pt/10-fallauswahl.md deleted file mode 100644 index 7a16b1dd..00000000 --- a/web/lessons/pt/10-fallauswahl.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -titel: Seleção -bereich: Fundamentos -kurz: Executar um de vários casos, consoante o valor de uma variável. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- inserir uma seleção, acrescentar casos e alterar os nomes dos casos -- explicar quando é executado o caso default -- decidir se serve melhor uma seleção ou uma decisão -- escrever uma seleção múltipla em Java com switch -::: - -## Muitas possibilidades, uma variável - -Uma máquina de bebidas tem três botões: 1 para água, 2 para sumo, 3 para chocolate quente. Com decisões precisas de três blocos encaixados uns nos outros. Isso fica depressa largo e confuso. - -::: diagramm l09-verschachtelt.visustruct -A máquina com três decisões encaixadas. Cada decisão volta a verificar a mesma variável escolha. -::: - -Sempre que comparas **uma variável** com **vários valores fixos**, há uma forma mais simples: a **seleção**. - -## Como se constrói uma seleção - -Em cima, no bloco, está a variável que decide. Por baixo há uma coluna própria para cada caso. Por cima de cada coluna está o valor a que ela pertence. - -::: diagramm l09-automat.visustruct -A mesma máquina como seleção. Se escolha tiver o valor 2, só é executada a coluna 2. -::: - -- A simulação procura o caso cujo nome corresponde exatamente ao valor. -- Se nenhum caso corresponder, é executado o **default**. Este caso fica sempre na ponta da direita. -- Depois, o programa continua por baixo da seleção. Só é executado **um** caso. - -> Uma seleção nova tem os casos 1, 2 e default. Clica num caso para alterar o seu **Nome do caso** no Inspetor de objetos. Com **Adicionar caso** ganhas uma nova coluna antes do default. - -## Casos com texto - -Os casos não têm de ser números. Também podes escolher pelo conteúdo de uma variável `String`. Então escreves o texto entre aspas como nome do caso, por exemplo `"vermelho"`. Tal como no código, isto mostra que é um texto. - -::: diagramm l09-ampel.visustruct -Um semáforo: consoante a cor introduzida, aparece uma mensagem diferente. Na simulação, experimenta também uma cor que não existe. -::: - -Maiúsculas e minúsculas contam: `Vermelho` não corresponde ao caso `"vermelho"`. - -## Exercício: Nota por extenso - -::: übung l09-note -titel: Nota por extenso -auftrag: Pede uma nota como número inteiro e mostra-a por extenso: 1 muito insuficiente, 2 insuficiente, 3 suficiente, 4 bom, 5 muito bom. - Para qualquer outro número deve aparecer **Nota inválida**. -test: 5 -> muito bom -test: 3 -> suficiente -test: 1 -> muito insuficiente -test: 9 -> Nota inválida -braucht: fallauswahl -tipp: Para muitos valores fixos, uma seleção é mais clara do que muitas decisões. Cada nota tem um caso próprio. -tipp: Usa “Adicionar caso” até teres os casos 1 a 5 e default. Em cima, na seleção, escreves `nota`. -lösung: l09-note-loesung.visustruct -::: - -## Exercício: Calculadora - -::: übung l09-rechner -titel: Calculadora -auftrag: Pede, um a seguir ao outro, um número inteiro `a`, um operador como `String` e um segundo número inteiro `b`. - Para `+`, `-` e `*` mostras o resultado. Para qualquer outro sinal aparece **Operador desconhecido**. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Operador desconhecido -braucht: fallauswahl -tipp: Primeiro lê os três valores. Depois, uma seleção sobre o operador decide o que é calculado. -tipp: Antes da seleção, cria `int resultado = 0`. Em cada caso calculas, por exemplo, `resultado = a + b` e depois mostras `resultado`. Os nomes dos casos são `"+"`, `"-"` e `"*"` entre aspas, porque o operador é uma `String`. -tipp: O esqueleto de cima para baixo: três entradas (`int a`, `String operador`, `int b`), depois `int resultado = 0`, depois uma seleção múltipla sobre `operador`. No caso `"+"` ficam `resultado = a + b` e `output: resultado`, em `"-"` e `"*"` igual. No caso senão fica `output: "Operador desconhecido"`. -lösung: l09-rechner-loesung.visustruct -::: - -## Seleção ou decisão? - -A seleção só verifica se um valor é **exatamente igual** a um nome de caso. Portanto: - -- **Seleção:** uma variável, vários valores fixos. Exemplos: escolher num menu, dia da semana como número, notas. -- **Decisão:** intervalos e condições combinadas. Exemplos: `idade >= 18`, `temperatura < 0 || temperatura > 30`. - -Por isso, para “idade 18 ou mais” continuas a precisar da decisão. Não podes criar um caso próprio para cada idade possível. - -## Agora em Java - -A máquina de bebidas fica assim em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 água, 2 sumo, 3 chocolate quente"); -int escolha = scanner.nextInt(); -switch (escolha) { - case 1 -> { - System.out.println("Aqui está a tua água."); - } - case 2 -> { - System.out.println("Aqui está o teu sumo."); - } - case 3 -> { - System.out.println("Aqui está o teu chocolate quente."); - } - default -> { - System.out.println("Este botão não existe."); - } -} -``` - -- Depois de `switch`, a variável que é comparada fica entre parênteses curvos. -- Cada caso começa com `case`, o valor e uma seta `->`. Depois, entre chavetas, fica o que deve acontecer. -- `default` é o caso “senão”. Corre quando nenhum valor serve. - -::: angeberwissen -A seta `case 1 ->` só existe em Java desde 2020 (Java 14). Antes escrevia-se `case 1:` e era preciso terminar cada caso com `break;`. Quem se esquecia, continuava simplesmente para o caso seguinte. A seta poupou muitos problemas a muitos programadores. -::: - -::: übung l10-java-wuerfel -titel: Dado por extenso -code: java -auftrag: Escreve um programa em Java com `switch` que lê um número. Para 1 mostra **um**, para 2 **dois**, para 3 **três** e senão **não conheço**. -test: 1 -> um -test: 2 -> dois -test: 3 -> três -test: 7 -> não conheço -braucht: fallauswahl -tipp: Precisas de três casos `case` e um caso `default`. -tipp: `switch (numero) { case 1 -> { System.out.println("um"); } … default -> { System.out.println("não conheço"); } }` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Preenche os espaços: switch - -::: lückentext -titel: Meses por extenso -auftrag: Preenche as palavras e os sinais que faltam na seleção múltipla. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que mês (1 a 3)?"); -int mes = scanner.nextInt(); -[[switch]] (mes) { - [[case]] 1 -> { - System.out.println("janeiro"); - } - case 2 [[->]] { - System.out.println("fevereiro"); - } - [[case]] 3 -> { - System.out.println("março"); - } - [[default]] -> { - System.out.println("Não conheço"); - } -} -``` -erklärung: Depois de `switch` vem a variável entre parênteses. Cada caso começa com `case`, o valor e a seta `->`. `default` é executado quando nenhum caso serve. -::: - -## Encontra o erro: calculadora - -::: übung l10-java-fehler -titel: Corrigir a calculadora -code: java -auftrag: A calculadora lê dois números e uma opção: 1 mais, 2 menos, 3 vezes. Com 7, 3 e a opção 2 devia dar **4**, mas dá **-4**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Não existe -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Mais e vezes estão certos. Olha com atenção para o `case 2`. -tipp: No menos, a ordem conta: `a - b` em vez de `b - a`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l10-java-laeuft-nicht -titel: Corrigir a nota -code: java -auftrag: O Ludwig teve nota 2. O programa deve mostrar **bom**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> bom -braucht: fallauswahl -tipp: Que variável verifica a seleção múltipla? Está escrita da mesma forma em cima? -tipp: Entre parênteses depois de `switch` tem de estar `nota` com n minúsculo: `switch (nota) {` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que caso? - -::: spiel frage -titel: Jogo: Que caso? -intro: O Ludwig carrega em botões da máquina de bebidas e de outras seleções. O que acontece? Seis rondas. - -runde: - int escolha = 2; - switch (escolha) { - case 1 -> { System.out.println("água"); } - case 2 -> { System.out.println("sumo"); } - case 3 -> { System.out.println("chocolate quente"); } - default -> { System.out.println("Esse botão não existe."); } - } -frage: O que aparece? -- água -- [x] sumo -- Esse botão não existe. -> escolha é 2, por isso corre exatamente o `case 2`. - -runde: - int escolha = 4; - switch (escolha) { - case 1 -> { System.out.println("água"); } - case 2 -> { System.out.println("sumo"); } - case 3 -> { System.out.println("chocolate quente"); } - default -> { System.out.println("Esse botão não existe."); } - } -frage: O que aparece? -- chocolate quente -- nada -- [x] Esse botão não existe. -> Nenhum caso serve para 4, por isso corre o `default`. - -runde: - String dia = "segunda"; - switch (dia) { - case "Segunda" -> { System.out.println("Matemática"); } - case "Terça" -> { System.out.println("Educação Física"); } - default -> { System.out.println("livre"); } - } -frage: O que aparece? -- Matemática -- Educação Física -- [x] livre -> Nos textos conta cada letra: "segunda" com s minúsculo não é "Segunda". - -runde: - int nota = 0; - switch (nota) { - case 1 -> { System.out.println("muito bom"); } - case 2 -> { System.out.println("bom"); } - case 3 -> { System.out.println("suficiente"); } - } -frage: O que aparece? -- muito bom -- [x] nada -- suficiente -> Nenhum caso serve e não há `default`. Então simplesmente não acontece nada. - -runde: -frage: Queres verificar se `idade >= 18`. O que serve melhor? -- [x] uma decisão -- uma seleção -> Uma seleção só compara com valores fixos. Para "maior ou igual" precisas de uma decisão. - -runde: -frage: Um dado mostra de 1 a 6, e para cada número deve aparecer uma palavra diferente. O que serve melhor? -- uma decisão -- [x] uma seleção -> Uma variável, seis valores fixos: é exatamente para isso que serve a seleção. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo inserir uma seleção, acrescentar casos e alterar os nomes dos casos. → Como se constrói uma seleção -- Consigo explicar quando é executado o caso default. → Como se constrói uma seleção -- Consigo decidir se serve melhor uma seleção ou uma decisão. → Seleção ou decisão? -- Consigo escrever uma seleção múltipla em Java com switch. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? A variável dia tem o valor 5. Existem os casos 1, 2, 3 e default. O que é executado? -→ Como se constrói uma seleção -- [ ] Nada -- [ ] O caso 3 -- [x] O caso default -> Nenhum nome de caso corresponde a 5, por isso aplica-se o default. - -? Quantos casos são executados de cada vez que a seleção é executada? -→ Como se constrói uma seleção -- [x] Exatamente um -- [ ] Todos os casos a partir do que corresponde -- [ ] Todos os casos -> Depois do caso que corresponde, o programa continua logo por baixo da seleção. - -? Para que é que uma seleção NÃO serve? -→ Seleção ou decisão? -- [ ] Escolher a opção 1, 2 ou 3 de um menu -- [x] Verificar se uma temperatura está acima dos 30 graus -- [ ] Tratar uma cor como vermelho, amarelo ou verde -> “Acima dos 30” é um intervalo. Para isso precisas de uma decisão com uma comparação. - -? No semáforo escreves `Vermelho`, e o caso chama-se `"vermelho"`. O que acontece? -→ Como se constrói uma seleção -- [ ] É executado o caso `"vermelho"`. -- [x] É executado o caso default. -- [ ] A simulação indica um erro. -> Maiúsculas e minúsculas contam. Vermelho e vermelho são textos diferentes. - -? Com que nome também encontras a seleção nos manuais? -→ Como se constrói uma seleção -- [ ] Instrução condicional -- [ ] Sequência -- [x] Seleção múltipla -> É escolhido um de muitos casos. Por isso também se chama seleção múltipla. - -? Como se chama em Java o caso “senão” de um switch? -→ Agora em Java -- [ ] else -- [x] default -- [ ] case 0 -::: diff --git a/web/lessons/pt/11-while-schleife.md b/web/lessons/pt/11-while-schleife.md deleted file mode 100644 index e97e1b64..00000000 --- a/web/lessons/pt/11-while-schleife.md +++ /dev/null @@ -1,359 +0,0 @@ ---- -titel: Ciclo while -bereich: Fundamentos -kurz: Repetir passos enquanto uma condição for verdadeira. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que o ciclo while verifica a sua condição antes de cada iteração -- usar uma variável contadora com valor inicial, condição e alteração -- notar quando um ciclo nunca acaba e corrigir o erro -- seguir um ciclo iteração a iteração num teste de secretária -- escrever um ciclo while em Java -::: - -## Repetir enquanto algo se verificar - -Muitas vezes um programa deve fazer uma coisa várias vezes. Em vez de escreveres o mesmo bloco cinco vezes, usas um **ciclo**. - -O **ciclo while** repete o seu interior **enquanto** a sua condição for verdadeira. A condição fica em cima, na cabeça do bloco. O interior fica recuado por baixo, enquadrado por um parêntese à esquerda. - -::: diagramm l10-countdown.visustruct -Uma contagem decrescente: enquanto numero for maior do que 0, numero é mostrado e diminui 1. Depois aparece Partida! -::: - -## Primeiro a condição - -O ciclo while é um **ciclo pré-teste**. Antes de **cada** iteração, a condição é verificada: - -1. Verificar a condição. -2. Se for verdadeira, executar o interior uma vez e recomeçar no 1. -3. Se for falsa, o programa continua por baixo do ciclo. - -::: grafik l10-kopfgesteuert.svg -Depois de cada iteração volta-se à condição. Só quando ela é falsa é que o programa continua por baixo do ciclo. -::: - -Na contagem decrescente, a condição é verificada quatro vezes: com 3, 2 e 1 é verdadeira, com 0 é falsa. - -> Se a condição já for falsa da primeira vez que é verificada, o interior **não é executado nem uma vez**. Começa a contagem com `int numero = 0` e só aparece Partida! - -## Uma variável contadora - -Muitos ciclos vão contando. Para isso precisas de três coisas: - -- **Um valor inicial antes do ciclo**, p. ex. `int i = 1` -- **Uma condição na cabeça**, p. ex. `i <= 5` -- **Uma alteração no interior**, p. ex. `i = i + 1` (abreviado: `i++`) - -Se faltar uma destas partes, o ciclo conta mal ou nem sequer conta. - -::: angeberwissen -Os ciclos de contagem são antiquíssimos! No artigo de 1973, Nassi e Shneiderman mostraram a sua ideia, entre outras coisas, com o **fatorial**: 5! = 1 · 2 · 3 · 4 · 5 = 120. Aqui está a minha versão caprina. Experimenta-a com **Passo** na simulação e vê o `fatorial` a crescer. Mééé, isto vai depressa! -::: - -::: diagramm l10-fakultaet.visustruct -O fatorial com uma variável contadora `i`, reconstruído a partir de um exemplo do artigo de 1973. -::: - -## Exercício: Contar até n - -::: übung l10-bis-n -titel: Contar até n -auftrag: Pede um número inteiro `n` e mostra todos os números de 1 a `n`, cada um na sua linha. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: Precisas de uma variável contadora que começa em 1 e aumenta 1 em cada iteração. -tipp: Antes do ciclo, cria `int i = 1`. A condição é `i <= n`. No interior mostras `i` e depois aumentas `i` em 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Atenção: ciclo infinito - -Se nada no interior do ciclo alterar a condição, ela fica verdadeira para sempre. O ciclo nunca para. A isto chama-se **ciclo infinito**. - -::: diagramm l10-endlos.visustruct -Aqui falta numero = numero - 1. O ciclo mostra 3 uma e outra vez e nunca chega a Partida! -::: - -Pergunta-te em cada ciclo: **O que é que no interior garante que a condição acaba por ficar falsa?** Quando um exercício é verificado, o VisuStruct para depois de um número muito grande de passos e indica um possível ciclo infinito. - -## Exercício: Duplicar até 100 - -::: übung l10-verdoppeln -titel: Duplicar até 100 -auftrag: Pede um número inteiro. Duplica-o até ele ser pelo menos 100. - No fim, mostra **quantas vezes** o duplicaste. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: O ciclo é executado enquanto o número ainda for demasiado pequeno. Vai contando quantas vezes foi executado. -tipp: Precisas de uma segunda variável `int passos = 0`. A condição é `numero < 100`. No interior duplicas o número com `numero = numero * 2` e aumentas `passos` em 1. Se o número já for 100, o ciclo nem chega a ser executado. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Ciclos num teste de secretária - -Com um ciclo, o **teste de secretária** é especialmente valioso. Vês exatamente quantas vezes o ciclo é executado e com que valor para. Cada verificação da condição tem uma linha própria. - -::: diagramm l16-schreibtisch.visustruct -Um ciclo while soma os números 1, 2 e 3. -::: - -| Passo | soma | i | Saída | -|---|---|---|---| -| `int soma = 0` | 0 | – | | -| `int i = 1` | 0 | 1 | | -| `i <= 3` → true | 0 | 1 | | -| `soma = soma + i` | 1 | 1 | | -| `i = i + 1` | 1 | 2 | | -| `i <= 3` → true | 1 | 2 | | -| `soma = soma + i` | 3 | 2 | | -| `i = i + 1` | 3 | 3 | | -| `i <= 3` → true | 3 | 3 | | -| `soma = soma + i` | 6 | 3 | | -| `i = i + 1` | 6 | 4 | | -| `i <= 3` → false | 6 | 4 | | -| `output: soma` | 6 | 4 | 6 | - -Erros frequentes em ciclos são: - -- O ciclo é executado **uma vez a mais ou uma vez a menos**, p. ex. `<` em vez de `<=`. -- Uma variável **não é alterada** no ciclo, ou é alterada no sentido errado. Então o ciclo nunca acaba. -- Uma variável recebe o seu valor inicial **dentro** do ciclo em vez de antes dele e é reposta em cada iteração. - -## Exercício: Corrigir a contagem decrescente - -::: übung l16-countdown -titel: Corrigir a contagem decrescente -auftrag: A contagem decrescente deve contar para trás a partir do valor inicial e mostrar **Já!** no fim. Ou seja, com 3: 3, 2, 1, Já! - O diagrama inicial tem dois erros. Encontra e corrige os dois. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Já! -test: 1 -> 1 | Já! -test: 0 -> Já! -tipp: Há dois erros. Um tem a ver com a contagem, o outro com a saída no fim. -tipp: Inicia a simulação com o valor inicial 3 e observa i em Variáveis. O i diminui? Compara também com atenção a última saída com a tarefa. -lösung: l16-countdown-loesung.visustruct -::: - -## Agora em Java - -A contagem decrescente do início desta lição fica assim em Java: - -```java editor -int numero = 3; -while (numero > 0) { - System.out.println(numero); - numero = numero - 1; -} -System.out.println("Partida!"); -``` - -- Depois de `while`, a condição fica entre parênteses curvos, como em `if`. -- Tudo o que se repete fica entre chavetas. É o corpo do ciclo. -- O corpo está recuado. Assim vês, como no estrutograma, o que pertence ao ciclo. - -::: übung l11-java-gerade -titel: Números pares em Java -code: java -auftrag: Escreve um programa em Java que lê um número inteiro `n` e, com um ciclo while, mostra todos os números pares de 2 até no máximo `n`. Para 7, são 2, 4 e 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: Precisas de uma variável contadora que começa em 2. O ciclo corre enquanto ela não for maior do que `n`. -tipp: `int numero = 2;` antes do ciclo, depois `while (numero <= n) { … }`. No corpo mostras `numero` e aumentas com `numero = numero + 2;`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Preenche os espaços: while - -::: lückentext -titel: Soma de 1 a 10 -auftrag: O programa deve somar os números de 1 a 10. Preenche as palavras e os sinais que faltam. -```java -int soma = 0; -int numero = 1; -[[while]] (numero [[<=]] 10) [[{]] - soma = soma + [[numero]]; - [[numero]] = numero + 1; -} -System.out.println("Soma: " + soma); -``` -erklärung: O ciclo repete-se enquanto `numero` for no máximo 10. Em cada volta, `numero` é somado à soma e depois `numero` aumenta 1. Sem essa linha seria um ciclo infinito. Saída: **Soma: 55** -::: - -## Encontra o erro: poupar - -::: übung l11-java-fehler -titel: Corrigir o plano de poupança -code: java -auftrag: O Ludwig poupa 5 euros por semana. O programa pergunta o objetivo e deve mostrar ao fim de quantas semanas ele o atinge. Para 50 euros são 10 semanas, mas o programa diz **Semanas: 11**. - Percorre o código com Passo a passo e observa `dinheiro` e `semanas`. Corrige o erro e carrega em Verificar. -start: l11-java-fehler-start.visustruct -test: 50 -> Semanas: 10 -test: 12 -> Semanas: 3 -test: 5 -> Semanas: 1 -test: 1 -> Semanas: 1 -braucht: whileSchleife -tipp: Quanto dinheiro tem o Ludwig quando o ciclo se repete pela última vez? Precisa mesmo de poupar mais uma semana? -tipp: Só se poupa enquanto o objetivo **ainda não foi atingido**: `while (dinheiro < objetivo)`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l11-java-laeuft-nicht -titel: Corrigir a contagem -code: java -auftrag: A contagem decrescente deve mostrar **3**, **2**, **1** e depois **Partida!** Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Partida! -braucht: whileSchleife -tipp: O erro está dentro do ciclo. Que variável deve ser mostrada e como se chama de facto? -tipp: Mostra `numero` com n minúsculo: `System.out.println(numero);` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Quantas vezes? - -::: spiel frage -titel: Jogo: Quantas vezes? -intro: O Ludwig escreveu ciclos while. Faz o teste de secretária de cabeça. Seis rondas. - -runde: - int numero = 3; - while (numero > 0) { - System.out.println(numero); - numero = numero - 1; - } - System.out.println("Já!"); -frage: O que aparece? -- [x] 3\n2\n1\nJá! -- 3\n2\n1\n0\nJá! -- Já! -> Quando numero é 0, `numero > 0` é falso, por isso o 0 já não aparece. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: O que aparece? -- [x] nada -- 10 -- de 10 a 4 -> A condição é verificada primeiro. 10 < 5 é falso, o corpo não corre nem uma vez. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: O que acontece? -- Aparecem 1, 2 e 3. -- [x] O ciclo nunca para. -- Não aparece nada. -> i nunca aumenta no corpo. A condição fica sempre verdadeira: um ciclo infinito. - -runde: - int numero = 1; - while (numero < 100) { - numero = numero * 2; - } - System.out.println(numero); -frage: O que aparece? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Só com 128 é que `numero < 100` é falso. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: O que aparece? -- 4 -- 5 -- [x] 6 -> i passa por 0, 2, 4, 6. Com 6, `i < 5` é falso. O 5 é saltado. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: Quantas vezes corre o corpo? -- 3 vezes -- [x] 4 vezes -- 10 vezes -> O corpo corre com i = 1, 4, 7 e 10. Depois i fica 13. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que o ciclo while verifica a sua condição antes de cada iteração. → Primeiro a condição -- Consigo usar uma variável contadora com valor inicial, condição e alteração. → Uma variável contadora -- Consigo notar quando um ciclo nunca acaba e corrigir o erro. → Atenção: ciclo infinito -- Consigo seguir um ciclo iteração a iteração num teste de secretária. → Ciclos num teste de secretária -- Consigo escrever um ciclo while em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer ciclo pré-teste? -→ Primeiro a condição -- [x] A condição é verificada antes de cada iteração. -- [ ] A condição é verificada depois de cada iteração. -- [ ] O ciclo é sempre executado exatamente uma vez. -> A cabeça com a condição está em cima e é avaliada primeiro. - -? `int i = 5`, depois um ciclo while com a condição `i < 3`. Quantas vezes é executado o interior? -→ Primeiro a condição -- [x] Nenhuma -- [ ] Uma vez -- [ ] Três vezes -> Logo da primeira vez que é verificado, 5 < 3 é falso. - -? Porque é que um ciclo com a condição `numero > 0` nunca acaba se o interior só tiver `output: numero`? -→ Atenção: ciclo infinito -- [ ] Porque a saída aumenta o número -- [x] Porque numero nunca muda e a condição fica sempre verdadeira -- [ ] Porque a condição está mal escrita -> No interior tem de acontecer algo que acabe por tornar a condição falsa. - -? Que outros nomes têm os ciclos nos manuais? -→ Primeiro a condição -- [x] Iteração ou repetição -- [ ] Decisões -- [ ] Subprogramas -> Um ciclo repete instruções. Por isso também se chama iteração ou estrutura de repetição. - -? Um ciclo deve contar de 1 a 5, mas só vai até 4. Qual é o erro provável? -→ Uma variável contadora -- [x] A condição diz i < 5 em vez de i <= 5. -- [ ] O ciclo é um ciclo while. -- [ ] A variável i tem o nome errado. - -? Que linha começa corretamente um ciclo while em Java? -→ Agora em Java -- [ ] while numero > 0 { -- [x] while (numero > 0) { -- [ ] while (numero > 0); -> A condição fica entre parênteses curvos, depois `{` abre o corpo. -::: diff --git a/web/lessons/pt/12-do-while-schleife.md b/web/lessons/pt/12-do-while-schleife.md deleted file mode 100644 index acb2226f..00000000 --- a/web/lessons/pt/12-do-while-schleife.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -titel: Ciclo do-while -bereich: Fundamentos -kurz: Primeiro executar, depois verificar: ciclos com pelo menos uma iteração. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que o ciclo do-while só verifica a sua condição depois do interior -- explicar porque é que o interior é executado pelo menos uma vez -- repetir uma entrada até ela ser válida -- escrever um ciclo do-while em Java -::: - -## Primeiro fazer, depois verificar - -O **ciclo do-while** é um **ciclo pós-teste**. A condição fica em baixo, no pé do bloco. É executado assim: - -1. Executar o interior uma vez. -2. Verificar a condição. -3. Se for verdadeira, recomeçar no 1. Se for falsa, o programa continua por baixo do ciclo. - -::: grafik l11-vergleich.svg -À esquerda, o ciclo while verifica primeiro; à direita, o ciclo do-while executa primeiro. -::: - -Em cima, no bloco, está `do`, e a condição fica no pé. Quando clicas no ciclo, a palavra `while` está à frente do campo de texto no Inspetor de objetos: a condição quer dizer “repete enquanto …”. - -> Tal como no ciclo while, a condição diz **quando é que o ciclo se repete**. Enquanto for verdadeira, o ciclo continua. - -::: angeberwissen -O Python não tem ciclo do-while. Quem lá quer “primeiro fazer, depois verificar” escreve `while True:` e sai do ciclo com `break`. Java, C e JavaScript, pelo contrário, têm `do … while` há décadas. -::: - -## Pelo menos uma iteração - -Como a condição só é verificada no fim, o interior **é sempre executado pelo menos uma vez**. Essa é a diferença mais importante em relação ao ciclo while. - -::: diagramm l11-einmal.visustruct -i vale 10 e, portanto, não é menor do que 5. Mesmo assim, 10 é mostrado uma vez, porque a verificação só vem depois. -::: - -Com um ciclo while e a mesma condição `i < 5`, aqui não seria mostrado nada. - -## Uso típico: repetir uma entrada - -O ciclo do-while serve sempre que alguma coisa tem de acontecer primeiro para a poderes verificar. O melhor exemplo é uma entrada: só depois de alguém ter escrito alguma coisa é que sabes se é válida. - -::: diagramm l11-eingabe-pruefen.visustruct -A pergunta repete-se até ser introduzido um número de 1 a 10. Na simulação, experimenta primeiro 0 e depois 12. -::: - -Aqui a condição descreve a entrada **inválida**: `numero < 1 || numero > 10`. Enquanto a entrada for inválida, a pergunta é feita outra vez. - -## Exercício: Nota válida - -::: übung l11-note -titel: Nota válida -auftrag: Pede uma nota. Se não estiver entre 1 e 5, pergunta outra vez. Se for válida, mostra-a, por exemplo **A tua nota: 3**. -test: 3 -> A tua nota: 3 -test: 0, 6, 2 -> A tua nota: 2 -test: 9, 5 -> A tua nota: 5 -test: -1, 1 -> A tua nota: 1 -braucht: doUntilSchleife -tipp: A nota é pedida pelo menos uma vez. Depois, a condição decide se se pergunta outra vez. -tipp: Antes do ciclo, cria `int nota = 0`. A entrada `input: nota "Nota de 1 a 5"` fica dentro do ciclo. A condição é `nota < 1 || nota > 5`. -lösung: l11-note-loesung.visustruct -::: - -## Exercício: Somar até 0 - -::: übung l11-summe -titel: Somar até 0 -auftrag: Pede números até ser introduzido um 0. Depois mostra a soma de todos os números introduzidos. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: Precisas de uma variável para a soma que começa em 0 antes do ciclo. Em cada iteração, o novo número é somado. -tipp: Antes do ciclo, cria `int soma = 0` e `int numero = 0`. No ciclo pedes `numero` e calculas `soma = soma + numero`. Somar o 0 não faz mal. O ciclo continua enquanto `numero != 0`. -tipp: O esqueleto: `int soma = 0` e `int numero = 0`, depois um ciclo do-while com a condição `numero != 0`. Dentro: a entrada de `numero` e `soma = soma + numero`. Por baixo do ciclo: `output: soma`. -lösung: l11-summe-loesung.visustruct -::: - -## Agora em Java - -O ciclo que corre mesmo assim uma vez fica assim em Java: - -```java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -``` - -- O corpo fica entre `do {` e `}`, a condição só vem depois. -- Aqui, depois de `while (…)`, há um **ponto e vírgula**. É diferente do ciclo while. - -::: übung l12-java-verdoppeln -titel: Duplicar pelo menos uma vez -code: java -auftrag: Escreve um programa em Java que lê um número inicial. Um ciclo do-while duplica-o e mostra-o enquanto for menor do que 100. Um número a partir de 100 também é duplicado pelo menos uma vez: 200 passa a 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: No corpo duplicas o número e mostras. A condição fica no fim. -tipp: `do { numero = numero * 2; System.out.println(numero); } while (numero < 100);` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Preenche os espaços: do-while - -::: lückentext -titel: Triplicar -auftrag: O número é triplicado e mostrado enquanto for menor do que 100. Preenche as palavras e os sinais que faltam. -```java -int numero = 1; -[[do]] { - numero = numero * 3; - System.out.println(numero); -} [[while]] (numero [[<]] 100)[[;]] -``` -erklärung: O corpo fica entre `do {` e `}`, a condição só vem depois. No ciclo do-while há um ponto e vírgula depois de `while (…)`. Saída: 3, 9, 27, 81 e 243. -::: - -## Encontra o erro: dividir ao meio - -::: übung l12-java-fehler -titel: Corrigir a divisão ao meio -code: java -auftrag: O programa lê um número inicial e, com um ciclo do-while, divide-o repetidamente por 2 (divisão inteira). Cada resultado é mostrado até chegar a **0**. Para 10 são 5, 2, 1 e 0. Mas falta o 0. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: Que valor tem `numero` depois de o 1 ser mostrado? O ciclo ainda se repete mais uma vez? -tipp: O ciclo deve continuar enquanto o número for maior do que 0: `while (numero > 0);` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l12-java-laeuft-nicht -titel: Corrigir a duplicação -code: java -auftrag: A partir de 1, o programa deve duplicar enquanto o número for menor do que 20: **1**, **2**, **4**, **8**, **16**. Só mostra o 1 e depois para. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: A primeira volta ainda corre. O erro aparece quando a condição em baixo é verificada pela primeira vez. -tipp: Na condição tem de estar `limite` com l minúsculo: `} while (numero < limite);` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Pelo menos uma vez? - -::: spiel frage -titel: Jogo: Pelo menos uma vez? -intro: While ou do-while? O Ludwig mostra-te ciclos. Diz antes o que acontece. Seis rondas. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: O que aparece? -- nada -- [x] 10 -- de 10 a 4 -> Primeiro fazer, depois verificar: o corpo corre uma vez, depois 11 < 5 é falso. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: O que aparece? -- [x] nada -- 10 -- 11 -> No ciclo while a condição vem primeiro. 10 < 5 é falso, por isso não corre nada. - -runde: - int numero = 200; - do { - numero = numero * 2; - } while (numero < 100); - System.out.println(numero); -frage: O que aparece? -- 200 -- [x] 400 -- 800 -> Duplica-se uma vez de certeza. Depois 400 < 100 é falso. - -runde: - int numero = 30; - do { - numero = numero * 2; - System.out.println(numero); - } while (numero < 100); -frage: O que aparece? -- 60 -- [x] 60\n120 -- 60\n120\n240 -> Depois de 60, 60 < 100 é verdadeiro, continua. Depois de 120 acaba. - -runde: -frage: Que linha termina corretamente um ciclo do-while em Java? -- [x] `} while (i < 5);` -- `} while (i < 5)` -- `while (i < 5) {` -> Depois do `while (…)` do ciclo do-while há um ponto e vírgula. - -runde: -frage: Para que se usa tipicamente um ciclo do-while? -- [x] repetir uma entrada até ser válida -- contar de 1 a 10 -- trocar dois valores -> A pergunta é feita pelo menos uma vez. Só depois se sabe se a entrada era válida. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que o ciclo do-while só verifica a sua condição depois do interior. → Primeiro fazer, depois verificar -- Consigo explicar porque é que o interior é executado pelo menos uma vez. → Pelo menos uma iteração -- Consigo repetir uma entrada até ela ser válida. → Uso típico: repetir uma entrada -- Consigo escrever um ciclo do-while em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer ciclo pós-teste? -→ Primeiro fazer, depois verificar -- [ ] A condição é verificada antes de cada iteração. -- [x] A condição é verificada depois de cada iteração. -- [ ] O ciclo não tem condição. -> A condição fica no pé, em baixo, e é avaliada depois do interior. - -? A condição de um ciclo do-while é falsa desde o início. Quantas vezes é executado o interior? -→ Pelo menos uma iteração -- [ ] Nenhuma -- [x] Exatamente uma vez -- [ ] Para sempre -> O interior é executado primeiro. Só depois o ciclo nota que deve parar. - -? Queres pedir um número de 1 a 10. Que condição fica no pé? -→ Uso típico: repetir uma entrada -- [ ] `numero >= 1 && numero <= 10` -- [x] `numero < 1 || numero > 10` -- [ ] `numero == 10` -> O ciclo repete-se enquanto a entrada for inválida, ou seja, menor do que 1 ou maior do que 10. - -? Quando é que um ciclo do-while é melhor do que um ciclo while? -→ Pelo menos uma iteração -- [x] Quando o interior tem de ser executado pelo menos uma vez, p. ex. numa entrada -- [ ] Quando o ciclo talvez nem precise de ser executado -- [ ] Quando queres contar exatamente até 10 - -? O que fica no fim de um ciclo do-while em Java? -→ Agora em Java -- [ ] } while (condicao) { -- [x] } while (condicao); -- [ ] } until (condicao); -> Depois da condição vem um ponto e vírgula. -::: diff --git a/web/lessons/pt/13-for-schleife.md b/web/lessons/pt/13-for-schleife.md deleted file mode 100644 index a7b6c5ae..00000000 --- a/web/lessons/pt/13-for-schleife.md +++ /dev/null @@ -1,337 +0,0 @@ ---- -titel: Ciclo for -bereich: Fundamentos -kurz: Contar um número fixo de iterações com Início, Condição e Passo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- nomear as três partes Início, Condição e Passo do ciclo for -- explicar por que ordem são executadas as três partes -- contar para a frente, para trás e em passos maiores com um ciclo for -- escrever um ciclo for em Java e explicar os seus três campos -::: - -## Contar com um plano fixo - -No ciclo while já foste contando: um valor inicial antes do ciclo, uma condição na cabeça, uma alteração no interior. O **ciclo for** junta estas três partes na cabeça. Assim vês num relance como ele conta. - -::: grafik l12-while-zu-for.svg animiert -O ciclo while torna-se um ciclo for: o início, a condição e o passo juntam-se na cabeça. -::: - -Quando clicas num ciclo for, ele tem três campos à direita: - -- **Início:** `int i = 1` cria a variável contadora. -- **Condição:** `i <= 5` diz até quando se conta. -- **Passo:** `i++` aumenta `i` em 1 depois de cada iteração. - -::: diagramm l12-eins-bis-fuenf.visustruct -Um ciclo for que mostra os números de 1 a 5. -::: - -::: angeberwissen -Porque é que a variável de contagem se chama quase sempre `i`? Na matemática, `i` representa há muito tempo um índice. E em FORTRAN, uma das primeiras linguagens de programação, de 1957, todas as variáveis começadas por I a N eram automaticamente números inteiros. Os programadores ainda não perderam o hábito. -::: - -## Por que ordem? - -As três partes são executadas em momentos diferentes: - -1. O **Início** é executado exatamente uma vez, logo no começo. -2. A **Condição** é verificada antes de cada iteração. Se for falsa, o ciclo termina. -3. Depois do interior vem o **Passo**, depois outra vez a condição. - -::: grafik l12-for-ablauf.svg -O Início só é executado uma vez. Depois, a condição, o interior e o passo repetem-se. -::: - -Portanto, o ciclo for é um ciclo pré-teste, como o ciclo while. Percorre o exemplo na simulação com **Passo** e observa como `i` muda. - -> Usa o ciclo for quando sabes de antemão quantas vezes uma coisa deve acontecer. Se o fim depender de algo que só acontece durante o ciclo, por exemplo uma entrada, é melhor o ciclo while ou do-while. - -## Exemplo: soma de 1 a n - -Um ciclo for é bom para somar números. Antes do ciclo está `int soma = 0`. Em cada iteração soma-se o número atual `i`. - -::: diagramm l12-summe.visustruct -Com n = 4, o ciclo calcula 0 + 1 + 2 + 3 + 4. No fim é mostrado 10. -::: - -## Outros passos - -O passo nem sempre tem de ser `i++`: - -- `i--` conta para trás, por exemplo com Início `int i = 10` e Condição `i >= 1`. -- `i = i + 2` salta de dois em dois, por exemplo 0, 2, 4, 6. - -Garante que o Início, a Condição e o Passo combinam. Com Início `int i = 1`, Condição `i >= 1` e Passo `i++`, a condição nunca fica falsa. - -::: übung l12-countdown -titel: Contagem decrescente -auftrag: Pede um número inteiro `n`. Usa um ciclo for para contar para trás de `n` até 1 e mostra cada número. Depois mostra **Já!**. -test: 3 -> 3 | 2 | 1 | Já! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Já! -test: 1 -> 1 | Já! -braucht: forSchleife -tipp: Desta vez o ciclo for conta para trás. Pensa onde começa, quando para e como conta. -tipp: O Início é `int i = n`, a condição `i >= 1` e o passo `i--`. A saída Já! fica por baixo do ciclo, não dentro dele. -lösung: l12-countdown-loesung.visustruct -::: - -## Exercício: Tabuada - -::: übung l12-einmaleins -titel: Tabuada -auftrag: Pede um número e mostra a sua tabuada de 1 a 10. Cada linha fica assim: **3 x 1 = 3**, **3 x 2 = 6** e assim por diante. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: O ciclo conta de 1 a 10. Em cada iteração mostras uma linha da tabuada. -tipp: No interior, calcula primeiro `int produto = numero * i`. Depois mostra `numero + " x " + i + " = " + produto`. Não te esqueças dos espaços dentro das aspas. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Exercício: Corrigir a soma - -::: übung l16-summe -titel: Corrigir a soma -auftrag: O estrutograma deve somar todos os números de 1 a n. Ou seja, com n = 4 o resultado deve ser 1 + 2 + 3 + 4 = **10**. Mas mostra 6. - Faz um teste de secretária ou usa **Passo** e corrige o erro. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Percorre o ciclo com n = 4 de cabeça ou com **Passo**. Que números são realmente somados? -tipp: Olha para o último valor de i com que o ciclo é executado. Com n = 4, também tem de ser somado i = 4. -lösung: l16-summe-loesung.visustruct -::: - -## Agora em Java - -A soma de 1 até n fica assim em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Até que número?"); -int n = scanner.nextInt(); -int soma = 0; -for (int i = 1; i <= n; i++) { - soma = soma + i; -} -System.out.println(soma); -``` - -Nos parênteses curvos depois de `for` estão os três campos do ciclo for, separados por ponto e vírgula: - -| Campo | Em Java | Significado | -|---|---|---| -| Início | `int i = 1` | `i` começa em 1. | -| Condição | `i <= n` | O ciclo corre enquanto isto for verdade. | -| Passo | `i++` | Depois de cada iteração, `i` aumenta 1. | - -`i++` é a forma curta de `i = i + 1`. Para contar para trás usas `i--`. - -::: übung l13-java-quadrate -titel: Quadrados em Java -code: java -auftrag: Escreve um programa em Java que lê um número inteiro `n` e, com um ciclo for, mostra os quadrados de 1 até `n`, cada um na sua linha. Para 3, são 1, 4 e 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: O ciclo conta `i` de 1 até `n`. O quadrado de `i` é `i * i`. -tipp: `for (int i = 1; i <= n; i++) { … }` e no corpo `System.out.println(i * i);`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Preenche os espaços: for - -::: lückentext -titel: Contar para cima e para baixo -auftrag: O primeiro ciclo soma os números de 1 a 5, o segundo conta de 10 até 0 para trás. Preenche as palavras e os sinais que faltam. -```java -int soma = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - soma = soma + i; -} -System.out.println("Soma: " + soma); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -``` -erklärung: Entre os parênteses ficam o valor inicial, a condição e o passo, separados por ponto e vírgula. `i++` conta para cima, `i--` conta para baixo. Ao contar para trás até 0, a condição é `i >= 0`. -::: - -## Encontra o erro: tabuada - -::: übung l13-java-fehler -titel: Corrigir a tabuada -code: java -auftrag: O programa pergunta que tabuada queres e deve mostrá-la de 1 vez até 10 vezes, para o 7 são 7, 14, … até 70. Mas falta o 70. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: Quantas vezes se repete o ciclo? Conta os valores que `i` toma. -tipp: `i` também deve tomar o valor 10: `i <= 10` em vez de `i < 10`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l13-java-laeuft-nicht -titel: Corrigir a escada -code: java -auftrag: O Ludwig sobe 5 degraus, cada um com 20 cm. O programa deve mostrar **Altura: 100 cm**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Altura: 100 cm -braucht: forSchleife -tipp: A variável `altura` é usada num cálculo, mas onde é criada? E com que altura começa o Ludwig? -tipp: Cria `altura` antes do ciclo: `int altura = 0;` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa esconde **exatamente um erro**, e a bomba está a fazer tiquetaque. Lê o que o programa deve fazer e toca na linha errada antes de o tempo acabar. Se as partes de uma linha tiverem moldura, toca exatamente na parte errada, por exemplo só em `i++`. Oito rondas, 25 segundos cada. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Deve mostrar 1, 2 e 3. -fehler: 2 -besser: System.out.println(i); -> Falta o ponto e vírgula no fim da instrução. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Deve mostrar de 1 a 5. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> Os três campos do ciclo for separam-se com ponto e vírgula, não com vírgulas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Deve contar para trás de 10 até 1. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> Com `i++`, `i` fica sempre maior e a condição `i >= 1` continua verdadeira: um ciclo infinito. Para contar para trás usas `i--`. - -runde: - int soma = 0; - for (int i = 1; i <= 4; i++) { - soma = i; - } - System.out.println(soma); -frage: Deve mostrar a soma 1 + 2 + 3 + 4 = 10. -fehler: 3 -stelle: i -besser: soma = soma + i; -> `soma = i` substitui a soma em cada iteração. No fim fica lá só 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Mééé"); - } -frage: Deve mostrar Mééé exatamente cinco vezes. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> De 0 até 5, inclusive, são seis iterações. Quem começa em 0 usa `<`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Deve mostrar 1, 2 e 3. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> O Java distingue maiúsculas de minúsculas: `System` escreve-se com S maiúsculo. - -runde: - int numero = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(numero + " x " + i + " = " + numero * numero); - } -frage: Deve mostrar a tabuada do 7: 7 x 1 = 7, 7 x 2 = 14 e assim por diante. -fehler: 3 -stelle: numero * numero -besser: System.out.println(numero + " x " + i + " = " + numero * i); -> `numero * numero` dá sempre 49. Tem de ser `numero * i`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Deve mostrar os números pares 2, 4, 6, 8 e 10. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> `i + 2` só calcula e não guarda nada. Para `i` crescer mesmo, é preciso `i = i + 2`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo nomear as três partes Início, Condição e Passo do ciclo for. → Contar com um plano fixo -- Consigo explicar por que ordem são executadas as três partes. → Por que ordem? -- Consigo contar para a frente, para trás e em passos maiores com um ciclo for. → Outros passos -- Consigo escrever um ciclo for em Java e explicar os seus três campos. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas vezes é executado o Início de um ciclo for? -→ Por que ordem? -- [x] Exatamente uma vez -- [ ] Antes de cada iteração -- [ ] Depois de cada iteração -> O Início cria a variável contadora uma vez, no começo. - -? Início `int i = 0`, Condição `i < 3`, Passo `i++`. Que valores tem i dentro do ciclo? -→ Contar com um plano fixo -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> Com i = 3 a condição é falsa, por isso o interior já não é executado. - -? Início `int i = 2`, Condição `i <= 10`, Passo `i = i + 2`. Quantas vezes é executado o interior? -→ Outros passos -- [ ] 4 vezes -- [x] 5 vezes -- [ ] 10 vezes -> i toma os valores 2, 4, 6, 8 e 10. - -? Quando é que um ciclo for serve melhor? -→ Contar com um plano fixo -- [x] Quando sabes de antemão quantas vezes repetir -- [ ] Quando perguntas até uma entrada ser válida -- [ ] Quando só é verificado um único valor - -? O que significa `i++` num ciclo for? -→ Contar com um plano fixo -- [ ] i é duplicado. -- [x] i aumenta 1. -- [ ] i é mostrado. -> `i++` é a forma curta de `i = i + 1`. -::: diff --git a/web/lessons/pt/14-verschachteln.md b/web/lessons/pt/14-verschachteln.md deleted file mode 100644 index 709f069f..00000000 --- a/web/lessons/pt/14-verschachteln.md +++ /dev/null @@ -1,305 +0,0 @@ ---- -titel: Encaixar -bereich: Fundamentos -kurz: Combinar decisões dentro de ciclos e ciclos dentro de ciclos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pôr uma decisão dentro de um ciclo -- pôr um ciclo dentro de outro ciclo -- explicar que o ciclo interior é executado do princípio ao fim em cada iteração do exterior -- escrever ciclos e decisões encaixados em Java -::: - -## Blocos uns dentro dos outros - -Já conheces todos os blocos importantes: sequência, decisão, seleção e três tipos de ciclos. Só juntos é que eles se tornam realmente poderosos. - -Cada ramo e cada corpo do ciclo é, ele próprio, uma sequência. Podes pôr lá qualquer elemento, incluindo mais decisões e ciclos. A isto chama-se **encaixar**. - -> Para isso, basta arrastares um elemento para o marcador ø dentro de um ciclo ou de um ramo. - -## Uma decisão dentro de um ciclo - -O ciclo percorre todos os números, e a decisão decide para cada número se acontece alguma coisa. Assim podes contar, por exemplo, quantos números pares há de 1 a n. - -::: diagramm l13-gerade-zaehlen.visustruct -Em cada iteração, a decisão verifica com i % 2 == 0 se i é par. Só nesse caso quantidade aumenta 1. O ramo false fica vazio. -::: - -Com n = 7 são os números 2, 4 e 6, portanto é mostrado 3. - -## Exercício: Contar entradas pares - -::: übung l13-gerade-eingaben -titel: Contar entradas pares -auftrag: Pede exatamente **cinco** números inteiros, um a seguir ao outro. Depois mostra quantos deles eram pares. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Fazer a mesma coisa cinco vezes significa: ciclo. Em cada iteração é lido e verificado um número. -tipp: Um ciclo for de 1 a 5. No interior vem primeiro a entrada `input: int numero "Introduz um número"`, por baixo uma decisão com `numero % 2 == 0`. No ramo true aumentas `quantidade` em 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## Um ciclo dentro de um ciclo - -Se um ciclo estiver dentro de outro, o **ciclo interior é executado do princípio ao fim em cada iteração do exterior**. Com isto podes construir padrões de linhas e colunas. - -::: diagramm l13-dreieck.visustruct -O ciclo exterior conta as linhas. O interior acrescenta ao texto tantas estrelas quantas o número da linha indica. Com n = 3 obténs um triângulo de 1, 2 e 3 estrelas. -::: - -Com `String texto = ""` cada linha começa vazia. `texto = texto + "*"` acrescenta uma estrela. Só quando a linha está pronta é que é mostrada. - -Programadores experientes dão às variáveis contadoras os nomes curtos `i` e `j`: `i` por fora, `j` por dentro. Fica assim, aqui com uma pequena tabuada: - -::: grafik l13-verschachtelt-tabelle.svg animiert -O ciclo exterior conta as linhas com `i`, o interior conta os números de uma linha com `j`. Em cada nova linha, `j` começa outra vez em 1. -::: - -## Exercício: Retângulo - -::: übung l13-rechteck -titel: Retângulo -auftrag: Pede uma largura e uma altura. Mostra um retângulo feito de `#`: tantas linhas como a altura, e em cada linha tantos `#` como a largura. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: Precisas de dois ciclos, um dentro do outro: um para as linhas e, lá dentro, um para os caracteres de uma linha. -tipp: Constrói-o como o triângulo. A diferença: o ciclo interior conta sempre até `largura`, não até ao número da linha. O ciclo exterior conta até `altura`. -tipp: O esqueleto: entradas `largura` e `altura`. Ciclo for exterior `int linha = 1`, `linha <= altura`, `linha++`. Dentro, primeiro `String texto = ""`, depois o ciclo for interior `int coluna = 1`, `coluna <= largura`, `coluna++` com `texto = texto + "#"`, e por baixo do ciclo interior `output: texto`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Não perder o fio - -Nos diagramas encaixados, o desenho ajuda-te: o que está mais para dentro fica recuado e rodeado pelo seu ciclo ou ramo. - -- Lê de fora para dentro: o que se repete? O que é decidido em cada iteração? -- Dá nomes com significado às variáveis contadoras, como `linha` e `coluna`. Dois ciclos não podem alterar a mesma variável contadora. -- Percorre um exemplo na simulação com **Passo** e observa as variáveis. - -::: angeberwissen -Foi exatamente para isto que o estrutograma foi inventado. Shneiderman perguntou-se: se devemos passar sem GOTO, porque não passar também sem as setas do fluxograma? O resultado: nada de esparguete de setas, e cada bloco fica bem arrumado no seu cercado. -::: - -## Agora em Java - -Contar os números pares fica assim em Java: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Até que número?"); -int n = scanner.nextInt(); -int quantidade = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - quantidade++; - } // fim do if -} // fim do for -System.out.println(quantidade); -``` - -O que no estrutograma está encaixado, em Java está encaixado entre chavetas. Cada nível fica quatro espaços mais para dentro. Se o teu código ficar desarrumado, ajuda o botão **Indentar** em cima na área Código. - -Com muitas chavetas de fecho `}` é fácil perder a noção: que chaveta pertence a que bloco? Um comentário a seguir diz-te, p. ex. `} // fim do if` e `} // fim do for`. Isto também ajuda quando continuares mais tarde. - -`quantidade++` é a forma curta de `quantidade = quantidade + 1`. - -::: übung l14-java-treppe -titel: Escada de estrelas -code: java -auftrag: Escreve um programa em Java que lê o número de degraus e mostra uma escada de asteriscos. Para 3 degraus são `*`, `**` e `***`, cada degrau na sua linha. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: Um ciclo exterior conta os degraus. Em cada degrau, um ciclo interior junta um texto de asteriscos. -tipp: No ciclo exterior: `String linha = "";`, depois `for (int j = 1; j <= i; j++) { linha = linha + "*"; }` e a seguir `System.out.println(linha);`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Preenche os espaços: encaixar - -::: lückentext -titel: Retângulo de estrelas -auftrag: O programa mostra um retângulo de 3 linhas com 4 estrelas cada. Preenche as palavras e os sinais que faltam. -```java -for (int linha = 1; linha <= 3; linha++) { - String texto = [[""]]; - [[for]] (int coluna = 1; coluna [[<=]] 4; [[coluna++ | coluna += 1 | coluna = coluna + 1]]) { - texto = texto [[+]] "*"; - } - System.out.[[println]](texto); -[[}]] -``` -erklärung: O ciclo de dentro constrói uma linha de 4 estrelas, o de fora repete isso três vezes. Cada linha começa com um texto vazio `""`. A última chaveta fecha o ciclo de fora. -::: - -## Encontra o erro: divisíveis por 3 - -::: übung l14-java-fehler -titel: Corrigir a contagem -code: java -auftrag: O programa deve contar quantos números de 1 a `n` são divisíveis por 3 e mostrar o resultado **uma vez**. Para 10 é só **Quantidade: 3**. Mas mostra linhas a mais. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l14-java-fehler-start.visustruct -test: 10 -> Quantidade: 3 -test: 3 -> Quantidade: 1 -test: 2 -> Quantidade: 0 -braucht: forSchleife, verzweigung -tipp: Repara nas chavetas: a saída está dentro do ciclo ou depois dele? -tipp: Passa a linha `System.out.println("Quantidade: " + quantidade);` para depois da chaveta que fecha o ciclo. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l14-java-laeuft-nicht -titel: Corrigir os números pares -code: java -auftrag: O programa deve mostrar os números pares de 1 a 10: **2**, **4**, **6**, **8**, **10**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: O erro está lá dentro, na saída. Como se chama a variável contadora do ciclo? -tipp: A variável contadora é `i` com i minúsculo: `System.out.println(i);` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Dentro e fora - -::: spiel frage -titel: Jogo: Dentro e fora -intro: O Ludwig encaixou blocos uns nos outros. Lê de fora para dentro e diz antes o que acontece. Seis rondas. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: Quantas estrelas aparecem? -- 3 -- 5 -- [x] 6 -> O ciclo interior corre por completo em cada uma das 3 voltas do ciclo exterior: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Que linha aparece em quarto lugar? -- 1 4 -- [x] 2 1 -- 2 2 -> Primeiro j percorre tudo com i = 1: 1 1, 1 2, 1 3. Depois j recomeça em 1, agora com i = 2. - -runde: - int contagem = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - contagem++; - } - } - System.out.println(contagem); -frage: O que aparece? -- [x] 3 -- 10 -- 4 -> A decisão só conta o 3, o 6 e o 9. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("par"); - } else { - System.out.println(i); - } - } -frage: O que aparece? -- 1\n2\n3\n4 -- [x] 1\npar\n3\npar -- par\npar -> Em cada número a decisão volta a decidir: os ímpares aparecem como número, os pares como palavra. - -runde: - for (int i = 1; i <= 3; i++) { - String linha = ""; - for (int j = 1; j <= i; j++) { - linha = linha + "*"; - } - System.out.println(linha); - } -frage: O que aparece? -- ***\n***\n*** -- [x] *\n**\n*** -- ***\n**\n* -> O ciclo interior vai até i. Por isso cada linha fica com mais uma estrela. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: O que acontece? -- Aparece 1 a 3 três vezes. -- Aparece 1 a 3 uma vez. -- [x] O Java indica um erro. -> Dois ciclos um dentro do outro precisam de duas variáveis de contagem diferentes, por exemplo `linha` e `coluna`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pôr uma decisão dentro de um ciclo. → Uma decisão dentro de um ciclo -- Consigo pôr um ciclo dentro de outro ciclo. → Um ciclo dentro de um ciclo -- Consigo explicar que o ciclo interior é executado do princípio ao fim em cada iteração do exterior. → Um ciclo dentro de um ciclo -- Consigo escrever ciclos e decisões encaixados em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O ciclo exterior é executado 3 vezes, o interior 4 vezes. Quantas vezes é executado ao todo o interior do ciclo interior? -→ Um ciclo dentro de um ciclo -- [ ] 7 vezes -- [x] 12 vezes -- [ ] 4 vezes -> Em cada uma das 3 iterações exteriores, o ciclo interior é executado 4 vezes, portanto 3 · 4 = 12. - -? Como sabes se um número é par? -→ Uma decisão dentro de um ciclo -- [ ] `numero / 2 == 0` -- [x] `numero % 2 == 0` -- [ ] `numero == 2` -> O % dá o resto de uma divisão. Nos números pares, o resto da divisão por 2 é zero. - -? Há uma decisão dentro de um ciclo for. Quantas vezes é verificada a condição da decisão? -→ Uma decisão dentro de um ciclo -- [ ] Uma vez -- [x] Uma vez por iteração do ciclo -- [ ] Só se for verdadeira -> A decisão faz parte do interior e é executada em cada iteração. - -? Como reconheces em Java o que pertence a um ciclo? -→ Agora em Java -- [ ] Pela cor -- [x] Pelas chavetas e pela indentação -- [ ] Pelos pontos e vírgulas -::: diff --git a/web/lessons/pt/15-arrays.md b/web/lessons/pt/15-arrays.md deleted file mode 100644 index f46218dd..00000000 --- a/web/lessons/pt/15-arrays.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -titel: Arrays -bereich: Fundamentos -kurz: Guardar muitos valores com um só nome, chegar a eles com o índice e percorrê-los com um ciclo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar um array com valores ou com `new int[5]` -- explicar que o índice começa em 0 e que o último índice é `length - 1` -- percorrer e encher um array com um ciclo for -- calcular a soma e o máximo de um array -- criar um array em Java e percorrê-lo com um ciclo -::: - -## Muitos valores com um só nome - -Imagina que queres guardar os pontos de cinco testes. Com cinco variáveis `pontos1` a `pontos5` isso fica depressa confuso. Um **array** é uma fila de posições que têm todas o mesmo nome e o mesmo tipo de dados. - -Crias um array com uma instrução. Depois do tipo de dados escreves parênteses retos `[]`: - -``` -int[] numeros = {2, 4, 6, 8, 10} -String[] nomes = {"Ada", "Rui", "Inês"} -``` - -Os valores entre chavetas vão logo para as posições. Também podes criar um array vazio com um número fixo de posições: - -``` -int[] pontos = new int[5] -String[] nomes = new String[3] -``` - -Com `new int[5]`, as cinco posições têm zeros no início; com `new String[3]`, textos vazios. - -## O índice começa em 0 - -Cada posição tem um número, o **índice**. Começa-se a contar em **0**. Portanto, com `int[] numeros = {2, 4, 6, 8, 10}`: - -- `numeros[0]` é 2 -- `numeros[1]` é 4 -- `numeros[4]` é 10 - -::: grafik l14-array.svg -Cinco posições com os índices 0 a 4. O índice está por cima da posição, o valor lá dentro. -::: - -**Porquê começar em 0?** Na informática, o índice não é “que posição”, mas sim a **distância ao início**. A primeira posição está logo no início, portanto a 0 passos. A segunda está a 1 passo, a terceira a 2 passos. Conheces isto do elevador: o rés-do-chão é o **0**, e o primeiro andar fica um nível acima. - -Daqui sai uma regra que vale a pena decorar: com 5 posições, o **último índice é 4**, sempre um a menos do que o número de posições. - -::: angeberwissen -Contar a partir de 0 já é bem antigo. A linguagem de programação C, de 1972, já funciona assim: o computador sabe o endereço da primeira posição e, para `numeros[i]`, calcula simplesmente “início mais i posições”. Com i = 0 fica no início, o que poupa uma conta. Java, Python e JavaScript copiaram isto. Já agora, eu também conto os meus chifres a partir de 0: chifre 0 à esquerda, chifre 1 à direita. -::: - -Com o índice lês um valor ou escreves lá um novo: - -``` -output: numeros[0] -numeros[1] = 99 -``` - -> Um array com 5 posições tem os índices 0 a 4. `numeros[5]` não existe. A simulação indica então uma expressão inválida. - -## O comprimento de um array - -`numeros.length` diz-te quantas posições tem um array. Com cinco valores é 5. Por isso, o **último** índice é sempre `numeros.length - 1`: - -``` -output: numeros.length -output: numeros[numeros.length - 1] -``` - -A segunda linha mostra o último valor, seja qual for o comprimento do array. O VisuStruct também percebe `numeros.length()`. - -::: übung l14-erster-letzter -titel: Primeiro e último valor -auftrag: Cria o array `int[] valores = {4, 8, 15, 16, 23, 42}`. Depois mostra em três linhas: o primeiro valor, o último valor e o número de valores. - Para o último valor, usa o comprimento e não escrevas simplesmente o índice 5. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Começa-se a contar em 0, por isso a primeira posição tem o índice 0. E qual é o índice da última posição? -tipp: O primeiro valor é `valores[0]`. O último é `valores[valores.length - 1]`. O número de valores é `valores.length`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Percorrer um array com um ciclo - -Um array mostra a sua força junto com um **ciclo for**. A variável contadora `i` vai de 0 até ao último índice e é usada como índice: - -``` -int i = 0 -i < numeros.length -i++ -``` - -Na primeira iteração `i` é 0, na última é 4. Como a condição é `i < numeros.length`, o ciclo serve para qualquer comprimento. - -::: diagramm l14-array-durchlaufen.visustruct -O ciclo for mostra os cinco valores um a seguir ao outro. Em Variáveis, na simulação, vê o i a contar de 0 a 4. -::: - -É também assim que enches um array vazio com entradas. Como destino da entrada escreves a posição `nomes[i]`: - -::: diagramm l14-namen-eingeben.visustruct -São pedidos três nomes, que são escritos nas posições 0, 1 e 2. -::: - -::: übung l14-rueckwaerts -titel: Mostrar ao contrário -auftrag: Cria um array para 4 números inteiros e lê os 4 números com um ciclo. Depois mostra-os pela ordem **inversa**, cada um na sua linha. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: Precisas de dois ciclos: um para ler da frente para trás e outro para mostrar de trás para a frente. -tipp: Crias o array com `int[] numeros = new int[4]`. A entrada é `input: numeros[i] "Introduz um número"`. No segundo ciclo começas em `int i = numeros.length - 1`, verificas `i >= 0` e contas para trás com `i--`. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr**, nascida em Viena, era uma estrela de cinema famosa de Hollywood nos anos 40. Nos tempos livres gostava de inventar. Em 1942, juntamente com o compositor George Antheil, recebeu uma patente para uma ligação de rádio que o inimigo não conseguisse perturbar: o emissor e o recetor saltam juntos por uma lista de **88 frequências**, tantas como as teclas de um piano. A lista estava perfurada numa fita de papel, como o rolo de um piano automático. Os dois percorrem a mesma lista pela mesma ordem, tal como o teu ciclo percorre um array com `i`. Quem escuta ou perturba só uma frequência quase não apanha nada. - -Este método, o **salto de frequência** (em inglês *frequency hopping*), é usado hoje, por exemplo, no Bluetooth. Ela não o inventou sozinha, já havia ideias anteriores. Mas a sua patente é vista como uma precursora importante, e em 1997 recebeu um prémio por isso. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), atriz e inventora, 1944 (foto promocional: [desconhecido](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), domínio público). -::: - -## Soma e máximo - -Há duas tarefas que aparecem sempre com arrays: - -- **Soma:** Começas com `soma = 0` e somas cada valor no ciclo. -- **Máximo:** Primeiro guardas o valor da posição 0 como o maior até agora. No ciclo verificas cada valor. Se for maior, passa a ser o novo máximo. - -::: diagramm l14-summe-maximum.visustruct -Soma e máximo numa única passagem. O máximo começa com pontos[0] e não com 0, para também estar certo com números negativos. -::: - -::: übung l14-summe-max -titel: Soma e máximo -auftrag: Lê 5 números inteiros para um array. Depois mostra **Soma: …** e na linha seguinte **Máximo: …**. -test: 3, 9, 2, 9, 1 -> Soma: 24 | Máximo: 9 -test: 10, 20, 30, 40, 50 -> Soma: 150 | Máximo: 50 -test: -5, -2, -9, -1, -3 -> Soma: -20 | Máximo: -1 -braucht: forSchleife, verzweigung -tipp: Percorre o array com um ciclo. Soma cada valor à soma e guarda o maior valor visto até agora. -tipp: Calcula a soma e o máximo em variáveis próprias e só os mostra no fim, p. ex. com `output: "Soma: " + soma`. Se o teu máximo começar em 0, o terceiro teste falha. -tipp: O esqueleto: criar o array e lê-lo com um ciclo. Depois `int soma = 0` e `int max = numeros[0]`. Um segundo ciclo calcula `soma = soma + numeros[i]`, e uma decisão `numeros[i] > max` põe `max = numeros[i]` no ramo true. No fim, as duas saídas. -lösung: l14-summe-max-loesung.visustruct -::: - -## Agora em Java - -Percorrer um array fica assim em Java: - -```java editor -int[] numeros = {2, 4, 6, 8, 10}; -for (int i = 0; i < numeros.length; i++) { - System.out.println(numeros[i]); -} -``` - -- `int[]` quer dizer “array de números inteiros”. Os valores ficam entre chavetas. -- Um array vazio com 5 posições cria-se com `new int[5]`. -- `numeros[i]` é a posição com o índice `i`, `numeros.length` é o comprimento. - -Se mostrares o array inteiro, ou seja `System.out.println(numeros);`, o Java não mostra os números. Só vês um texto como `[I@1b6d3586`. É a **referência**, o sítio onde o array está guardado na memória. O conteúdo só aparece com `Arrays.toString(numeros)`, que dá `[2, 4, 6, 8, 10]`. Para isso escreves `import java.util.Arrays;` logo no início. - -::: übung l15-java-noten -titel: Soma das notas em Java -code: java -auftrag: Cria em Java o array `notas` com os valores 2, 3, 1 e 4. Soma todas as notas com um ciclo for e mostra **Soma: 10**. -test: - -> Soma: 10 -braucht: forSchleife -tipp: Cria `int soma = 0;` antes do ciclo. O ciclo vai de 0 até `notas.length - 1`. -tipp: `int[] notas = {2, 3, 1, 4};`, depois `for (int i = 0; i < notas.length; i++) { soma = soma + notas[i]; }` e no fim `System.out.println("Soma: " + soma);`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Preenche os espaços: arrays - -::: lückentext -titel: Procurar o máximo -auftrag: O programa procura o maior valor do array. Preenche as palavras e os sinais que faltam. -```java -[[int]][] valores = {3, 7, 1, 9, 4}; -int max = valores[0]; -[[for]] (int i = 1; i < valores.[[length]]; i++) { - if (valores[i] [[>]] max) { - max = valores[i]; - } -} -System.out.println("Máximo: " + max); -``` -erklärung: `int[]` é um array de números inteiros, `valores.length` é o seu comprimento. `max` começa com o primeiro valor e o ciclo compara todos os outros com ele. Saída: **Máximo: 9** -::: - -## Encontra o erro: temperaturas - -::: übung l15-java-fehler -titel: Corrigir a temperatura mais alta -code: java -auftrag: Em janeiro mediram-se as temperaturas -5, -2, -8 e -3 graus. O programa deve mostrar a mais alta, ou seja, **Temperatura mais alta: -2**. Mas diz 0 graus, embora nunca tenha estado tão quente. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l15-java-fehler-start.visustruct -test: - -> Temperatura mais alta: -2 -braucht: forSchleife, verzweigung -tipp: Com que valor começa `max`? Alguma das temperaturas é maior do que esse valor inicial? -tipp: `max` tem de começar com um valor do array: `int max = temperaturas[0];` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l15-java-laeuft-nicht -titel: Somar os pontos -code: java -auftrag: O array `pontos` contém 4, 7, 2 e 5. O programa deve somá-los todos e mostrar **Soma: 18**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Soma: 18 -braucht: forSchleife -tipp: A área Código sublinha a palavra errada a vermelho. Como se escreve o comprimento de um array? -tipp: `length` escreve-se todo em minúsculas: `i < pontos.length` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa tem **exatamente um erro** com arrays, e a bomba está a fazer tique-taque. Toca na linha errada antes de o tempo acabar. Se as partes de uma linha tiverem moldura, toca exatamente na parte errada. Seis rondas, 30 segundos cada. -zeit: 30 - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - for (int i = 0; i <= numeros.length; i++) { - System.out.println(numeros[i]); - } -frage: Deve mostrar os cinco valores. -fehler: 2 -stelle: i <= numeros.length -besser: for (int i = 0; i < numeros.length; i++) { -> Com `<=`, i vai até 5. A posição `numeros[5]` não existe. - -runde: - String[] nomes = {"Ada", "Ben", "Cem"}; - System.out.println(nomes[1]); -frage: Deve mostrar o primeiro nome, ou seja, Ada. -fehler: 2 -stelle: nomes[1] -besser: System.out.println(nomes[0]); -> Conta-se a partir de 0. `nomes[1]` já é o Ben. - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - System.out.println(numeros[numeros.length]); -frage: Deve mostrar o último valor, ou seja, 10. -fehler: 2 -stelle: numeros[numeros.length] -besser: System.out.println(numeros[numeros.length - 1]); -> O último índice é sempre um a menos do que o comprimento. - -runde: - int[] pontos = {3, 9, 2}; - int soma = 0; - for (int i = 0; i < pontos.length; i++) { - soma = pontos[i]; - } - System.out.println(soma); -frage: Deve mostrar a soma 14. -fehler: 4 -stelle: pontos[i] -besser: soma = soma + pontos[i]; -> Assim cada valor apaga o anterior, e no fim soma só tem 2. - -runde: - int[] pontos = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < pontos.length; i++) { - if (pontos[i] > max) { - max = pontos[i]; - } - } - System.out.println(max); -frage: Deve mostrar o máximo -2. -fehler: 2 -stelle: 0 -besser: int max = pontos[0]; -> Nenhum dos números é maior do que 0, por isso max ficaria em 0. É por isso que o máximo começa com a primeira posição. - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - for (int i = numeros.length; i >= 0; i--) { - System.out.println(numeros[i]); - } -frage: Deve mostrar os valores de trás para a frente, de 10 a 2. -fehler: 2 -stelle: int i = numeros.length -besser: for (int i = numeros.length - 1; i >= 0; i--) { -> De trás para a frente começa-se no último índice, que é `numeros.length - 1`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar um array com valores ou com `new int[5]`. → Muitos valores com um só nome -- Consigo explicar que o índice começa em 0 e que o último índice é `length - 1`. → O índice começa em 0 -- Consigo percorrer e encher um array com um ciclo for. → Percorrer um array com um ciclo -- Consigo calcular a soma e o máximo de um array. → Soma e máximo -- Consigo criar um array em Java e percorrê-lo com um ciclo. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que mostra `output: numeros[2]` com `int[] numeros = {5, 10, 15, 20}`? -→ O índice começa em 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Começa-se a contar em 0: numeros[0] é 5, numeros[1] é 10, numeros[2] é 15. - -? Um array tem 8 posições. Qual é o último índice? -→ O índice começa em 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> O último índice é sempre length - 1. - -? Que condição serve para um ciclo for que percorre todos os valores de `numeros` e começa em `int i = 0`? -→ Percorrer um array com um ciclo -- [x] i < numeros.length -- [ ] i <= numeros.length -- [ ] i > numeros.length -> Com <= o ciclo também leria numeros[length], e essa posição não existe. - -? Com que valor deve começar o máximo antes de o ciclo começar? -→ Soma e máximo -- [ ] Sempre com 0 -- [x] Com o primeiro valor do array -- [ ] Com o comprimento do array -> Se começar com 0, então só com números negativos o resultado seria 0, embora o 0 nem esteja no array. - -? O que mostra `output: numeros.length` com `int[] numeros = {5, 10, 15, 20}`? -→ Muitos valores com um só nome -- [ ] 3 -- [x] 4 -- [ ] 20 -> length é o número de posições, não o último índice nem o último valor. - -? Que linha cria em Java um array com três números? -→ Agora em Java -- [x] int[] numeros = {1, 2, 3}; -- [ ] int numeros = [1, 2, 3]; -- [ ] array numeros = (1, 2, 3); -::: diff --git a/web/lessons/pt/16-zweidimensionale-arrays.md b/web/lessons/pt/16-zweidimensionale-arrays.md deleted file mode 100644 index ba7a73a2..00000000 --- a/web/lessons/pt/16-zweidimensionale-arrays.md +++ /dev/null @@ -1,317 +0,0 @@ ---- -titel: Arrays bidimensionais -bereich: Fundamentos -kurz: Guardar valores em linhas e colunas, como os lugares de um cinema, e percorrê-los com dois ciclos encaixados. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar um array 2D e explicar o que significam os dois números -- ler e escrever uma posição com fila e lugar -- distinguir `lugares.length` de `lugares[0].length` -- explicar por que ordem dois ciclos encaixados visitam as posições -- criar e percorrer um array bidimensional em Java -::: - -## Um cinema como tabela - -Um cinema tem várias **filas**, e cada fila tem vários **lugares**. Para cada lugar queremos saber se o bilhete já foi vendido. É uma pergunta de sim ou não, por isso serve o tipo de dados `boolean`: `true` quer dizer vendido, `false` quer dizer livre. - -Um array normal é uma só fila de posições. Para o cinema precisamos de uma **tabela** com linhas e colunas. Isso é um **array bidimensional**, abreviado array 2D. Para isso escreves dois pares de parênteses retos: - -``` -boolean[][] lugares = new boolean[3][5] -``` - -Isto dá 3 filas com 5 lugares cada, ou seja, 15 posições. No início, todas as posições têm `false`: todos os lugares estão livres. - -::: grafik kino-saal.svg -O primeiro índice é a fila, o segundo é o lugar. Os dois contam-se a partir de 0. -::: - -## Chegar a uma posição - -Para uma posição precisas agora de **dois** índices: primeiro a fila, depois o lugar. - -``` -lugares[1][2] = true -``` - -Agora o lugar 2 da fila 1 está vendido. Ler funciona da mesma maneira: `lugares[1][2]` é agora `true`. - -Também podes perguntar o tamanho: - -- `lugares.length` é o número de **filas**, aqui 3. -- `lugares[0].length` é o número de **lugares** da fila 0, aqui 5. - -::: diagramm kino-verkaufen.visustruct -São vendidos três bilhetes. Depois, o diagrama mostra o tamanho do cinema e se a fila 1, lugar 2, está vendido. Repara em Variáveis, na simulação: lugares é mostrado fila a fila. -::: - -> Tal como num array normal, não existe a posição `lugares[3][0]`, porque as filas se chamam 0, 1 e 2. A simulação indica então uma expressão inválida. - -## Dois ciclos um dentro do outro - -Para olhar para **todos** os lugares, precisas de dois ciclos for, um dentro do outro: - -- O **ciclo exterior** conta a fila: `fila` vai de 0 a 2. -- O **ciclo interior** conta o lugar: `lugar` vai de 0 a 4. - -::: grafik kino-schleifen.svg -Azul é o ciclo exterior, laranja o interior. Os números mostram a ordem pela qual os lugares aparecem. -::: - -Para cada fila, o ciclo interior é executado **do princípio ao fim** uma vez. Só quando `lugar` passou pelos cinco lugares é que o ciclo exterior avança `fila` em um. Depois, `lugar` recomeça em 0. Assim, todos os 3 · 5 = 15 lugares aparecem exatamente uma vez. - -As condições são `fila < lugares.length` e `lugar < lugares[fila].length`. Assim os ciclos servem para um cinema de qualquer tamanho. - -::: diagramm kino-saalplan.visustruct -A planta da sala: para cada fila é montada e mostrada uma linha de X (vendido) e O (livre). Percorre-a com Passo e vê como lugar recomeça sempre do início, enquanto fila só vai contando devagar. -::: - -::: angeberwissen -Cada foto do telemóvel é um array 2D! Uma foto com 4000 · 3000 píxeis tem 3000 linhas com 4000 posições cada, ou seja, 12 milhões de píxeis. Cada posição guarda a cor de um ponto. Quando pões uma foto mais clara, o telemóvel percorre todos os píxeis com dois ciclos encaixados. A minha foto de perfil, já agora, só tem uma posição: castanho. -::: - -## Exercício: Contar lugares livres - -::: übung kino-frei -titel: Contar lugares livres -auftrag: No diagrama inicial já foram vendidos três bilhetes. Usa dois ciclos encaixados para contar quantos lugares ainda estão **livres** e mostra p. ex. `Livres: 12`. -start: kino-frei-start.visustruct -test: - -> Livres: 12 -braucht: forSchleife, verzweigung -tipp: Tal como na planta da sala, percorres todos os lugares com dois ciclos. Em vez de mostrares alguma coisa, contas. -tipp: Antes dos ciclos, cria `int livres = 0`. Um lugar está livre se `lugares[fila][lugar]` for false. A condição para isso é `!lugares[fila][lugar]`. -lösung: kino-frei-loesung.visustruct -::: - -## Exercício: Vender um bilhete - -::: übung kino-karte -titel: Vender um bilhete -auftrag: O diagrama inicial pede uma fila e um lugar. Se o lugar já estiver vendido, mostra `Já vendido`. Caso contrário, marca-o como vendido e mostra p. ex. `Vendido: fila 0, lugar 4`. -start: kino-karte-start.visustruct -test: 1, 2 -> Já vendido -test: 0, 4 -> Vendido: fila 0, lugar 4 -test: 2, 0 -> Vendido: fila 2, lugar 0 -braucht: verzweigung -tipp: Verifica primeiro se o lugar está vendido. Consoante a resposta, acontece uma coisa diferente. -tipp: Aqui não precisas de ciclo. Basta uma decisão com a condição `lugares[fila][lugar]`. No ramo false pões a posição a `true`. -lösung: kino-karte-loesung.visustruct -::: - -## Exercício: Tabela da tabuada - -::: übung kino-einmaleins -titel: Tabela da tabuada -auftrag: Cria `int[][] tabela = new int[10][10]` e enche-a com a tabuada até 10 usando dois ciclos. Depois pede dois números de 1 a 10 e lê o resultado da tabela, p. ex. `3 · 4 = 12`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: Primeiro, dois ciclos encaixados enchem a tabela; depois lês só uma única posição. -tipp: Os índices vão de 0 a 9, mas os números de 1 a 10. Por isso, a posição `tabela[i][j]` tem o valor `(i + 1) * (j + 1)`, e para 3 · 4 lês `tabela[a - 1][b - 1]`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Agora em Java - -A sala de cinema fica assim em Java: - -```java editor -boolean[][] lugares = new boolean[3][5]; -lugares[0][2] = true; -lugares[1][1] = true; -lugares[1][2] = true; -System.out.println("Filas: " + lugares.length); -System.out.println("Lugares por fila: " + lugares[0].length); -System.out.println("Fila 1, lugar 2 vendido? " + lugares[1][2]); -``` - -- Dois pares de parênteses retos `[][]` representam uma tabela: primeiro a fila, depois o lugar. -- `lugares.length` é o número de filas, `lugares[0].length` o número de lugares numa fila. -- Com valores fixos, escreves cada fila nas suas próprias chavetas: `int[][] t = {{1, 2}, {3, 4}};` - -::: übung l16-java-punkte -titel: Somar os pontos -code: java -auftrag: Três jogadores jogaram duas rondas cada um. Cria em Java a tabela `pontos` com as filas {3, 5}, {4, 1} e {2, 2}. Soma todos os pontos com dois ciclos for encaixados e mostra **Soma: 17**. -test: - -> Soma: 17 -braucht: forSchleife -tipp: O ciclo exterior percorre as filas, o interior os lugares de uma fila. -tipp: `int[][] pontos = {{3, 5}, {4, 1}, {2, 2}};` e no ciclo interior `soma = soma + pontos[i][j];`. O ciclo interior vai até `pontos[i].length`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Preenche os espaços: tabelas - -::: lückentext -titel: Somar todos os campos -auftrag: O programa soma todos os números da tabela. Preenche as palavras e os sinais que faltam. -```java -[[int]][][] campo = {{1, 2, 3}, {4, 5, 6}}; -int soma = 0; -for (int l = 0; l < campo.[[length]]; l++) { - for (int c = 0; c < campo[l].[[length]]; c++) { - soma = soma [[+]] campo[l][c]; - } -} -System.out.println("Soma: " + soma); -``` -erklärung: `int[][]` é uma tabela. `campo.length` é o número de linhas (2), `campo[l].length` o número de campos na linha `l` (3). Saída: **Soma: 21** -::: - -## Encontra o erro: pontos - -::: übung l16-java-fehler -titel: Corrigir o jogador 2 -code: java -auftrag: Na tabela `pontos`, cada linha corresponde a um jogador. O programa deve somar os pontos do jogador 2 (linha 1), ou seja, **Jogador 2: 11**. Em vez disso, dá um erro. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l16-java-fehler-start.visustruct -test: - -> Jogador 2: 11 -braucht: forSchleife -tipp: Em `pontos[a][b]`, `a` é a linha e `b` o lugar na linha. Que número corresponde à linha do jogador 2? -tipp: Os índices estão trocados: `pontos[1][j]` em vez de `pontos[j][1]`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l16-java-laeuft-nicht -titel: Ler a pontuação -code: java -auftrag: Na tabela `pontos` cada linha é um jogador e cada coluna uma ronda. O programa deve mostrar os pontos do jogador 2 na ronda 1, ou seja, **Jogador 2, ronda 1: 4**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Jogador 2, ronda 1: 4 -braucht: anweisung -tipp: As posições `[1][0]` estão certas. Olha para o nome da tabela. -tipp: A tabela chama-se `pontos` com p minúsculo: `pontos[1][0]` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que lugar? - -::: spiel frage -titel: Jogo: Que lugar? -intro: O Ludwig vende bilhetes de cinema. Primeiro a fila, depois o lugar, ambos a partir de 0. Sete rondas. - -runde: - boolean[][] lugares = new boolean[3][5]; - System.out.println(lugares.length); -frage: O que aparece? -- [x] 3 -- 5 -- 15 -> `lugares.length` é o número de filas. - -runde: - boolean[][] lugares = new boolean[3][5]; - System.out.println(lugares[0].length); -frage: O que aparece? -- 3 -- [x] 5 -- 15 -> `lugares[0]` é a fila 0. O seu comprimento é o número de lugares nessa fila. - -runde: - int[][] tabela = new int[4][6]; -frage: Quantas posições tem a tabela? -- 10 -- [x] 24 -- 35 -> 4 filas com 6 lugares cada: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: O que aparece? -- 2 -- [x] 3 -- 4 -> A fila 1 é `{3, 4}`, e o lugar 0 dela é o 3. - -runde: - boolean[][] lugares = new boolean[3][5]; - lugares[3][0] = true; -frage: O que acontece? -- O primeiro lugar da fila 3 fica vendido. -- O primeiro lugar da última fila fica vendido. -- [x] Há um erro, porque as filas são 0, 1 e 2. -> Tal como num array normal, o último índice é um a menos do que o comprimento. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int soma = 0; - for (int fila = 0; fila < t.length; fila++) { - for (int lugar = 0; lugar < t[fila].length; lugar++) { - soma = soma + t[fila][lugar]; - } - } - System.out.println(soma); -frage: O que aparece? -- 6 -- 15 -- [x] 21 -> Os dois ciclos passam pelas seis posições: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Dois ciclos percorrem a sala `new boolean[3][5]`. Que posição vem logo a seguir a `lugares[0][4]`? -- `lugares[0][5]` -- [x] `lugares[1][0]` -- `lugares[1][4]` -> A fila 0 terminou. O ciclo exterior avança, e o lugar recomeça em 0. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar um array 2D e explicar o que significam os dois números. → Um cinema como tabela -- Consigo ler e escrever uma posição com fila e lugar. → Chegar a uma posição -- Consigo distinguir `lugares.length` de `lugares[0].length`. → Chegar a uma posição -- Consigo explicar por que ordem dois ciclos encaixados visitam as posições. → Dois ciclos um dentro do outro -- Consigo criar e percorrer um array bidimensional em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas posições tem `boolean[][] lugares = new boolean[4][6]`? -→ Um cinema como tabela -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 filas com 6 lugares cada: 4 · 6 = 24. - -? O que está em todas as posições depois de `new boolean[3][5]`? -→ Um cinema como tabela -- [ ] true -- [x] false -- [ ] Nada, as posições estão vazias -> Um array boolean novo é enchido com false. No cinema isso quer dizer: todos os lugares estão livres. - -? Dois ciclos encaixados percorrem 3 filas com 5 lugares. Quantas vezes é executado o interior do ciclo **interior**? -→ Dois ciclos um dentro do outro -- [ ] 3 vezes -- [ ] 8 vezes -- [x] 15 vezes -> Para cada uma das 3 filas, o ciclo interior é executado 5 vezes: 3 · 5 = 15. - -? Associa o que cada expressão significa no cinema. -→ Chegar a uma posição -= lugares.length -> Número de filas -= lugares[0].length -> Número de lugares da fila 0 -= lugares[2][4] -> Fila 2, lugar 4 -= lugares[1][0] = true -> O lugar 0 da fila 1 está vendido - -? O que dá `lugares.length` para `new boolean[3][5]`? -→ Chegar a uma posição -- [x] 3, o número de filas -- [ ] 5, o número de lugares -- [ ] 15, todos os lugares juntos -::: diff --git a/web/lessons/pt/17-zeichenketten.md b/web/lessons/pt/17-zeichenketten.md deleted file mode 100644 index b0f13c5d..00000000 --- a/web/lessons/pt/17-zeichenketten.md +++ /dev/null @@ -1,528 +0,0 @@ ---- -titel: Strings -bereich: Fundamentos -kurz: Trabalhar com texto: ler caracteres, recortar partes, pesquisar, comparar e dividir. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que os caracteres de uma String também se contam a partir de 0 -- trabalhar com `length()` e `charAt(i)` -- distinguir um `char` de uma String e usar o código de caractere com `(int)` e `(char)` -- recortar uma parte de um texto com `substring` -- usar `indexOf`, `contains`, `toUpperCase` e `equals` -- percorrer um texto caractere a caractere com um ciclo -- dividir um texto num array de Strings com `split` -- ler um texto em Java e compará-lo com `equals` -- usar mais métodos, como `lastIndexOf`, `replace`, `compareTo` e `Integer.parseInt` -- dividir o texto de um ficheiro em linhas com `split("\n")` -- consultar um método na API do Java e ler a sua descrição -::: - -## Um texto é uma fila de caracteres - -Já conheces `String`: `String nome = "Ludwig"`. Na informática, um texto destes chama-se **string** (em inglês, “fio”), porque os caracteres ficam pendurados uns a seguir aos outros como contas num fio. Também se diz **cadeia de caracteres**. Cada caractere tem um lugar com um índice, tal como num array. Também aqui **se começa a contar em 0**: o primeiro caractere está a 0 passos do início. - -::: grafik zk-zeichen.svg -Os dez caracteres de “Passatempo” com os seus índices de 0 a 9. -::: - -Uma String traz consigo **métodos**. Escreves o nome da variável, um ponto e o método: - -- `palavra.length()` dá o número de caracteres, aqui 10. -- `palavra.charAt(0)` dá o caractere com o índice 0, aqui `'P'`. - -> Nas Strings escreves `length()` **com** parênteses, nos arrays `length` **sem**. Infelizmente, o Java é mesmo assim. - -Tal como num array, o último caractere tem o índice `length() - 1`. - -## Um único caractere: char - -Para um único caractere, o Java tem um tipo de dados próprio: **char**, abreviatura do inglês *character* (caractere). Um `char` fica entre aspas **simples**, uma String entre aspas duplas: - -- `'C'` é um `char`: exatamente um caractere. -- `"C"` é uma String: um texto que só tem um caractere. -- Um `char` tem sempre exatamente um caractere. Não existe um `char` vazio como `''`, mas uma String vazia `""` existe. - -`charAt` dá-te um caractere destes a partir de um texto: - -``` -char primeiro = palavra.charAt(0) -char ultimo = palavra.charAt(palavra.length() - 1) -``` - -Dois `char` comparas com `==`: `palavra.charAt(0) == 'P'` é `true`. - -Por trás de cada caractere há um número, o seu **código de caractere**. Que número pertence a que caractere está na tabela ASCII: `'A'` tem o código 65, `'B'` 66, `'C'` 67 e assim por diante até `'Z'` com 90. Com `(int)` obténs o código de um caractere, com `(char)` um código volta a ser um caractere: - -``` -int codigo = (int) 'C' -codigo = codigo + 1 -char seguinte = (char) codigo -``` - -Depois disto, `codigo` vale 68 e `seguinte` é `'D'`. Assim deslocas uma letra no alfabeto, e é exatamente isso que vais precisar mais tarde na cifra de César. - -## Recortar partes - -Com `substring` recortas uma parte do texto: - -- `palavra.substring(0, 5)` dá os caracteres desde o índice 0 **até mesmo antes** do índice 5, ou seja, `"Passa"`. -- `palavra.substring(5)` dá tudo desde o índice 5 até ao fim, ou seja, `"tempo"`. - -O fim **não** está incluído. Dá jeito: `substring(0, 5)` dá exatamente 5 caracteres. - -::: diagramm zk-zeichen.visustruct -Todos os métodos desta lição num exemplo. Percorre-o na simulação e compara cada saída com a imagem. -::: - -## Pesquisar e comparar - -Mais métodos de que precisas muitas vezes: - -| Método | Significado | Exemplo com `"Passatempo"` | -|---|---|---| -| `indexOf("tempo")` | Onde começa o texto? | 5 | -| `indexOf("x")` | não encontrado | -1 | -| `contains("sat")` | O texto aparece? | true | -| `toUpperCase()` | tudo em maiúsculas | PASSATEMPO | -| `toLowerCase()` | tudo em minúsculas | passatempo | -| `equals("Passatempo")` | o mesmo texto? | true | - -> Em Java comparas duas Strings com `equals`, não com `==`. Já dois caracteres (`char`) comparas com `==`, p. ex. `palavra.charAt(i) == 'a'`. - -::: angeberwissen -Experimenta `"Ludwig".equals("ludwig")`. A resposta é false! Para um computador, L e l são caracteres completamente diferentes. Lá dentro, cada caractere é guardado como um número: L é 76 e l é 108. Esta numeração chama-se ASCII e é de 1963. Mééé, portanto, para um computador, Ludwig e ludwig são dois bodes diferentes. Eu sou o do L maiúsculo. -::: - -## Caractere a caractere - -Com um ciclo for percorres um texto caractere a caractere. O índice `i` vai de 0 a `palavra.length() - 1`, tal como num array: - -::: diagramm zk-zaehlen.visustruct -Conta quantas vezes aparece a letra a. Na simulação, experimenta “banana” e observa i e quantidade. -::: - -## Dividir com split - -Muitas vezes há várias informações numa só linha, separadas por um caractere, p. ex. `"Ludwig;bode;7"`. Com `split` cortas a linha nesse caractere. O resultado é um **array de Strings**: - -``` -String[] partes = linha.split(";") -``` - -Depois disso, `partes[0]` é `"Ludwig"`, `partes[1]` é `"bode"` e `partes[2]` é `"7"`. Com `partes.length` descobres quantas partes há. - -::: diagramm zk-split.visustruct -A linha é dividida no ponto e vírgula, e cada parte é mostrada com o seu índice. -::: - -> Os ficheiros CSV, que conheces das folhas de cálculo, são feitos da mesma maneira: uma linha por registo, com os valores separados por vírgula ou ponto e vírgula. - -## Exercício: Iniciais - -::: übung zk-initialen -titel: Iniciais -auftrag: Pede um nome próprio e um apelido e mostra as iniciais. Ou seja, para Ludwig Bode fica `L. B.` -test: Ludwig, Bode -> L. B. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: A inicial é a primeira letra de um nome. Que método dá o caractere numa determinada posição? -tipp: `nome.charAt(0)` dá a primeira letra. A saída fica então `nome.charAt(0) + ". " + apelido.charAt(0) + "."` -lösung: zk-initialen-loesung.visustruct -::: - -## Exercício: Ao contrário - -::: übung zk-rueckwaerts -titel: Ao contrário -auftrag: Pede uma palavra e mostra-a ao contrário. Ludwig passa a `giwduL`. -test: Ludwig -> giwduL -test: Ana -> anA -test: a -> a -braucht: forSchleife -tipp: Percorre a palavra caractere a caractere, mas de trás para a frente, e vai construindo um novo texto. -tipp: Cria `String invertida = ""`. O ciclo começa no último índice `palavra.length() - 1` e conta para trás até 0 com `i--`. Em cada iteração acrescentas `palavra.charAt(i)` no fim. -tipp: O esqueleto: entrada `palavra`, depois `String invertida = ""`. Ciclo for com início `int i = palavra.length() - 1`, condição `i >= 0` e passo `i--`. Dentro, `invertida = invertida + palavra.charAt(i)`. Por baixo do ciclo, `output: invertida`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Exercício: Contar palavras - -::: übung zk-woerter -titel: Contar palavras -auftrag: Pede uma frase e mostra quantas palavras tem, p. ex. `Palavras: 5` para “O Ludwig é um bode”. As palavras estão separadas por exatamente um espaço. -test: O Ludwig é um bode -> Palavras: 5 -test: Olá -> Palavras: 1 -test: Eu gosto de cabras -> Palavras: 4 -braucht: anweisung -tipp: Entre as palavras há sempre um espaço. Que método divide um texto num caractere? -tipp: Divide a frase num array de Strings com `frase.split(" ")`. O seu comprimento é o número de palavras. -tipp: O programa todo tem três blocos: a entrada `frase`, depois `String[] palavras = frase.split(" ")` e no fim `output: "Palavras: " + palavras.length`. -lösung: zk-woerter-loesung.visustruct -::: - -## Agora em Java - -Os métodos desta lição já são Java. Um programa completo com um texto fica assim: - -```java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Como te chamas?"); -String nome = scanner.next(); -System.out.println("Olá " + nome.toUpperCase() + "!"); -System.out.println("O teu nome tem " + nome.length() + " letras."); -``` - -- `scanner.next()` lê uma palavra, ou seja, texto até ao próximo espaço. Para números continuas a usar `scanner.nextInt()`. -- O texto fica entre aspas **duplas** `"Ludwig"`, um único carácter entre aspas **simples** `'L'`. -- Depois de `length()`, `toUpperCase()` e dos outros métodos há sempre parênteses curvos, mesmo quando não há nada lá dentro. -- Comparas dois textos com `equals`. Cada letra conta: `"Ludwig".equals("ludwig")` é false. - -::: übung l17-java-passwort -titel: Verificar a palavra-passe -code: java -auftrag: Escreve em Java um programa que pergunta pela palavra-passe. Se for **Ludwig**, mostra **Bem-vindo!**, senão **Palavra-passe errada**. - Atenção às maiúsculas e minúsculas: `ludwig` está errado. -test: Ludwig -> Bem-vindo! -test: ludwig -> Palavra-passe errada -test: Geißbock -> Palavra-passe errada -braucht: verzweigung -tipp: Lê a palavra-passe com `scanner.next()` para uma variável String. Depois comparas numa decisão. -tipp: A condição é `entrada.equals("Ludwig")`. Em Java, `==` não compara textos de forma fiável. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Preenche os espaços: textos - -::: lückentext -titel: Analisar uma palavra -auftrag: Preenche os métodos e as palavras que faltam. -```java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Uma palavra?"); -[[String]] palavra = scanner.next(); -System.out.println("Comprimento: " + palavra.[[length]]()); -System.out.println("Maiúsculas: " + palavra.[[toUpperCase]]()); -System.out.println("Primeira letra: " + palavra.[[charAt]](0)); -if (palavra.[[equals]]("Ludwig")) { - System.out.println("Olá Ludwig!"); -} -``` -erklärung: `length()` conta os carateres, `toUpperCase()` põe tudo em maiúsculas, `charAt(0)` dá o primeiro caráter. Textos comparas com `equals`, não com `==`. -::: - -## Encontra o erro: iniciais - -::: übung l17-java-fehler -titel: Corrigir as iniciais -code: java -auftrag: O programa lê o nome próprio e o apelido e deve mostrar as iniciais. Para Ludwig Geißbock é **L. G.** Mas mostra **u. e.** - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: Em que índice começa o Java a contar? -tipp: O primeiro caráter tem o índice 0: `nome.charAt(0)` e `apelido.charAt(0)`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l17-java-laeuft-nicht -titel: Contar as letras -code: java -auftrag: O programa deve mostrar a primeira letra e o comprimento de **Ludwig**, ou seja, **L tem 6 letras**. Mas não corre, porque há dois métodos mal escritos. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L tem 6 letras -braucht: anweisung -tipp: Os nomes dos métodos também são camelCase: começam com minúscula e cada palavra seguinte começa com maiúscula. -tipp: O correto é `nome.charAt(0)` com A maiúsculo e `nome.length()` todo em minúsculas. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Ainda mais métodos - -Uma String sabe fazer muito mais. Também vais precisar muitas vezes destes métodos: - -| Método | Significado | Exemplo | Resultado | -|---|---|---|---| -| `lastIndexOf("a")` | Onde está o último a? | `"Passatempo".lastIndexOf("a")` | 4 | -| `isEmpty()` | O texto está vazio? | `"".isEmpty()` | true | -| `equalsIgnoreCase(…)` | o mesmo texto, sem contar maiúsculas e minúsculas? | `"Passatempo".equalsIgnoreCase("PASSATEMPO")` | true | -| `replace(antigo, novo)` | substitui todas as ocorrências | `"Passatempo".replace("tempo", "porte")` | Passaporte | -| `repeat(n)` | o texto n vezes seguidas | `"Mé".repeat(3)` | MéMéMé | -| `concat(…)` | junta texto no fim, como `+` | `"Passa".concat("tempo")` | Passatempo | -| `compareTo(…)` | Qual vem primeiro no alfabeto? | `"Anna".compareTo("Ben")` | -1 | - -`compareTo` devolve um número: **negativo** se o texto vem antes no alfabeto, **0** se os dois são iguais e **positivo** se vem depois. Assim podes ordenar nomes. - -Dois métodos não pertencem a um texto, mas a uma classe. Por isso, à frente fica o nome da classe: - -- `Integer.parseInt("7")` transforma o texto "7" no número 7. Com ele já podes fazer contas. -- `String.valueOf(7)` transforma o número 7 no texto "7". - -::: diagramm zk-mehr.visustruct -Todos os métodos novos num só exemplo. Percorre-o na simulação e compara cada saída com a tabela. -::: - -## Texto de um ficheiro - -Os programas recebem muitas vezes o texto de um **ficheiro**. A Princesa Zora escreveu uma carta ao Ludwig. Ela está pronta no ficheiro `carta.txt`: - -::: datei carta.txt -Querido Ludwig, -a raposa fechou-me na sua torre. -A porta tem um cadeado com uma palavra secreta. -Só encontras a palavra com Java. -Ajuda-me, por favor! -A tua Princesa Zora -::: - -Estas linhas leem o ficheiro inteiro para uma String: - -``` -import java.nio.file.*; - -String carta = Files.readString(Path.of("carta.txt")); -``` - -Como a leitura funciona ao certo, vais aprender mais tarde, numa lição só sobre ficheiros. Por agora basta: depois disto, a carta inteira está em `carta`, com todas as linhas. - -No fim de cada linha há um carácter invisível para a **mudança de linha**. Em Java escreve-se `"\n"`. Por isso, `carta.split("\n")` divide a carta nas suas linhas. - -::: übung l17-java-brief -titel: Onde está a raposa? -code: java -auftrag: O código inicial já lê a carta. Divide-a em linhas e mostra **Linhas:** e o número de linhas. Depois procura a linha onde está **raposa** e mostra **Raposa na linha** e o seu número. A primeira linha tem o número 1. -start: l17-java-brief-start.visustruct -test: - -> Linhas: 6 | Raposa na linha 2 -braucht: forSchleife, verzweigung -tipp: `String[] linhas = carta.split("\n");` divide a carta. Depois, um ciclo for percorre todas as linhas. -tipp: No ciclo verificas `linhas[i].contains("raposa")`. O índice começa em 0, por isso mostras `(i + 1)`. Os parênteses são precisos para o Java fazer a conta em vez de juntar 1 ao texto. -lösung: l17-java-brief-loesung.visustruct -::: - -## A API do Java - -Ninguém sabe todos os métodos de cor, nem os profissionais. Eles consultam a **API do Java**. API significa Application Programming Interface. É a descrição de tudo o que o Java já traz consigo. - -Todos os métodos de String estão aqui: [String na API do Java](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Desce até à tabela **Method Summary**. Cada linha descreve um método: - -| Coluna | Exemplo | Significado | -|---|---|---| -| Modifier and Type | `int` | O que o método devolve | -| Method | `lastIndexOf(String str)` | Nome e parâmetros com o seu tipo de dados | -| Description | Returns the index within this string of the last occurrence … | O que o método faz | - -A API está em inglês. O teu browser pode traduzir a página. Os nomes dos métodos ficam em inglês, porque é assim que os escreves em Java. - -::: ludwig -A página é muito comprida. Com Ctrl+F (no Mac ⌘+F) procuras o nome do método e chegas lá logo. -::: - -Consulta estes métodos. Não estão nesta lição: - -::: quiz -? Consulta `strip()`. O que faz o método? -- [ ] Remove todos os espaços do texto. -- [x] Remove os espaços no início e no fim. -- [ ] Corta o último carácter. -> Como `trim()`. Mas `strip()` também conhece espaços especiais de outras escritas. - -? Consulta `isBlank()`. O que devolve `" ".isBlank()`? -- [x] true -- [ ] false -- [ ] 3 -> isBlank verifica se o texto está vazio ou só tem espaços. Já `" ".isEmpty()` seria false. - -? Consulta `toCharArray()`. Que tipo de dados devolve o método? -- [ ] String -- [ ] String[] -- [x] char[] -> Um array com todos os caracteres do texto, uma posição para cada carácter. - -? Consulta `indexOf` com dois parâmetros. O que devolve `"Passatempo".indexOf("a", 2)`? -- [ ] 1 -- [x] 4 -- [ ] -1 -> A pesquisa só começa no índice 2. O primeiro a a partir daí está no índice 4. - -? Consulta `startsWith`. Que tipo de dados devolve o método? -- [x] boolean -- [ ] int -- [ ] String -> Na coluna “Modifier and Type” está boolean: a resposta é true ou false. -::: - -## Jogo: Salvar a princesa - -Agora ajudas o Ludwig. A raposa fechou a princesa Zora na sua torre, e o portão só abre com uma palavra secreta. - -::: spiel prinzessin -titel: Jogo: Salvar a princesa -intro: No caminho para a torre, o Ludwig passa por **seis estações**. Em cada uma há um pedaço de código Java, e sai um número. Com `alphabet.charAt(numero)` o número transforma-se numa letra, que vai para as **palavras cruzadas**. Resolve-as, e os quadrados amarelos formam a palavra secreta para o portão. - -station: No fosso - String nome = " Zora "; - int numero = nome.trim().length(); -frage: Que número fica em `numero`? -zahl: 4 -feld: 5 1 -tipp: `trim()` corta os espaços no início e no fim. Depois conta os caracteres. -> Depois do `trim()` fica só `"Zora"`, que tem 4 caracteres. - -station: Na floresta da raposa - String lugar = "A raposa"; - int numero = lugar.length(); -frage: Que número fica em `numero`? -zahl: 8 -feld: 4 4 -tipp: `length()` conta todos os caracteres, também o espaço. -> O A, o espaço e r-a-p-o-s-a dão 8 caracteres. - -station: Na rocha das cabras - String texto = "Ludwig o bode"; - int numero = texto.indexOf(" "); -frage: Que número fica em `numero`? -zahl: 6 -feld: 4 6 -tipp: `indexOf` devolve a posição do primeiro espaço. O L tem o índice 0. -> L u d w i g tem os índices 0 a 5, por isso o primeiro espaço está no índice 6. - -station: Na escada da torre - String palavra = "Princesa"; - int numero = palavra.indexOf("a", 5); -frage: Que número fica em `numero`? Procura `indexOf(String str, int fromIndex)` na API do Java. -zahl: 7 -feld: 6 6 -tipp: A pesquisa começa no índice 5. Escreve os índices por baixo das letras. -> P r i n c e s a tem os índices 0 a 7. A partir do índice 5, o primeiro “a” está no 7. - -station: Diante da toca da raposa - int numero = "Zora".compareTo("Zoe"); -frage: Que número fica em `numero`? -zahl: 13 -feld: 1 9 -tipp: `compareTo` procura a primeira posição em que os textos são diferentes e subtrai os códigos dos caracteres. `'r'` é 114, `'e'` é 101. -> “Zo” é igual, depois vem `'r'` contra `'e'`: 114 − 101 = 13. - -station: No portão da torre - int numero = Integer.parseInt("1" + "1") / 5; -frage: Que número fica em `numero`? -zahl: 2 -feld: 6 5 -tipp: Primeiro os textos são juntados, depois passam a número. Com `int`, a divisão deita fora o resto. -> `"1" + "1"` é `"11"`, o `parseInt` faz disso 11, e 11 / 5 dá 2 com números inteiros. - -kreuzwort: As letras azuis já as tens. Preenche os outros quadrados com termos do Java. Clica numa pista para saltar para a palavra. -- → 1 3 BOOLEAN: Tipo de dados para verdadeiro ou falso -- → 4 1 STRING: Tipo de dados para texto -- → 6 5 CHAR: Tipo de dados para um único carácter -- ↓ 1 6 LENGTH: Método que conta os caracteres de uma string -- ↓ 2 1 ELSE: A parte “senão” de uma decisão -- ↓ 3 3 BREAK: Sai imediatamente de um ciclo -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: O Ludwig está diante do portão. A fechadura compara a tua palavra com `equals`. Escreve a palavra secreta. - String palavra = "___"; - if (palavra.equals(palavraSecreta)) { - portao.abrir(); - } -ende: A Zora está livre, e a raposa fugiu a correr. A palavra secreta era `BREAK`: com `break` sai-se de qualquer ciclo, e a Zora sai da torre. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que os caracteres de uma String também se contam a partir de 0. → Um texto é uma fila de caracteres -- Consigo trabalhar com `length()` e `charAt(i)`. → Um texto é uma fila de caracteres -- Consigo distinguir um `char` de uma String e usar o código de caractere com `(int)` e `(char)`. → Um único caractere: char -- Consigo recortar uma parte de um texto com `substring`. → Recortar partes -- Consigo usar `indexOf`, `contains`, `toUpperCase` e `equals`. → Pesquisar e comparar -- Consigo percorrer um texto caractere a caractere com um ciclo. → Caractere a caractere -- Consigo dividir um texto num array de Strings com `split`. → Dividir com split -- Consigo ler um texto em Java e compará-lo com `equals`. → Agora em Java -- Consigo usar mais métodos, como `lastIndexOf`, `replace`, `compareTo` e `Integer.parseInt`. → Ainda mais métodos -- Consigo dividir o texto de um ficheiro em linhas com `split("\n")`. → Texto de um ficheiro -- Consigo consultar um método na API do Java e ler a sua descrição. → A API do Java -::: - -## Teste de conhecimentos - -::: quiz -? Quanto dá `"Ludwig".charAt(1)`? -→ Um texto é uma fila de caracteres -- [ ] L -- [x] u -- [ ] d -> Começa-se a contar em 0: L tem o índice 0, u o índice 1. - -? O que é `'C'`? -→ Um único caractere: char -- [x] um `char`, ou seja, exatamente um caractere -- [ ] uma String -- [ ] uma variável chamada C -> Aspas simples indicam um único caractere, um `char`. `"C"` entre aspas duplas seria uma String. - -? `'A'` tem o código de caractere 65. Quanto dá `(char) 67`? -→ Um único caractere: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 é A, 66 é B, 67 é C. Com `(char)` o código volta a ser um caractere. - -? Quanto dá `"Estrutura".substring(0, 6)`? -→ Recortar partes -- [x] Estrut -- [ ] Estrutu -- [ ] strutu -> Os caracteres com os índices 0 a 5. O fim 6 não está incluído. - -? Uma palavra tem 7 caracteres. Que índice tem o último caractere? -→ Um texto é uma fila de caracteres -- [ ] 7 -- [x] 6 -- [ ] 8 -> Tal como num array: sempre um a menos do que o comprimento. - -? Como comparas duas Strings quanto ao conteúdo em Java? -→ Pesquisar e comparar -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Associa cada método ao que dá para `"Passatempo"`. -→ Pesquisar e comparar -= length() -> 10 -= charAt(0) -> P -= indexOf("tempo") -> 5 -= substring(5) -> tempo - -? Que condição verifica em Java se `entrada` contém o texto Ludwig? -→ Agora em Java -- [ ] entrada = "Ludwig" -- [ ] entrada == 'Ludwig' -- [x] entrada.equals("Ludwig") -> Comparas textos com equals. As aspas simples são só para um único carácter. - -? O que devolve `Integer.parseInt("12") + 1`? -→ Ainda mais métodos -- [ ] "121" -- [x] 13 -- [ ] uma mensagem de erro -> parseInt transforma o texto num número. Depois o Java faz a conta normalmente. -::: diff --git a/web/lessons/pt/18-aufruf-und-aussprung.md b/web/lessons/pt/18-aufruf-und-aussprung.md deleted file mode 100644 index aa65552e..00000000 --- a/web/lessons/pt/18-aufruf-und-aussprung.md +++ /dev/null @@ -1,482 +0,0 @@ ---- -titel: Chamada e interrupção -bereich: Fundamentos -kurz: Dividir tarefas grandes em subprogramas e sair mais cedo dos ciclos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dividir uma tarefa grande em problemas mais pequenos -- inserir uma chamada e construir um subprograma num separador próprio -- passar valores a um subprograma com parâmetros -- devolver um valor de retorno com return e guardá-lo ao chamar -- explicar porque é que um subprograma não consegue alterar um número, mas consegue alterar um array -- explicar o que faz uma Interrupção e porque está numa decisão -- terminar um ciclo com uma Interrupção ou através da sua condição -- reconhecer um método em Java e sair de um ciclo com `break` -::: - -## Dividir tarefas grandes - -Os estrutogramas compridos ficam depressa confusos. Por isso divides uma tarefa grande em **problemas mais pequenos**. Cada problema mais pequeno tem um nome próprio e um estrutograma próprio, um **subprograma**. - -Um quiz, por exemplo, tem três partes: dar as boas-vindas, fazer as perguntas, mostrar o resultado. O programa principal só nomeia estas três partes: - -::: diagramm l15-hauptprogramm.visustruct -O programa principal é feito só de três chamadas. O que acontece em cada parte está num estrutograma próprio. -::: - -Assim vês num relance como o programa está construído. Os pormenores estão noutro sítio. - -## A chamada - -Uma **chamada** é um bloco com linhas verticais duplas à esquerda e à direita. Quer dizer: executa aqui o subprograma com este nome e depois continua. - -- Arrastas a **Chamada** da área Elementos e escreves lá o nome, p. ex. `mostrarBoasVindas()`. -- Os parênteses curvos no fim mostram que é um subprograma. É assim que também se escreve em Java, Python e JavaScript. -- O subprograma em si constróis como estrutograma próprio num novo separador. Como título escreves o mesmo nome. - -::: diagramm l15-unterprogramm.visustruct -O subprograma mostrarBoasVindas() como estrutograma próprio. -::: - -> **Na simulação:** Quando a simulação chega a uma chamada, procura entre os separadores abertos o estrutograma com este título e executa-o. Depois continua no programa principal. Enquanto o subprograma é executado, o bloco da chamada fica destacado. Um subprograma como este, só com um nome como título, partilha as suas variáveis com o programa principal. Daqui a pouco vais aprender como um subprograma tem variáveis próprias. Se não houver nenhum separador que corresponda, a simulação salta a chamada e mostra um aviso. - -::: angeberwissen -Porque é que o teu professor diz sempre “método” em Java e nunca “função” ou “procedimento”? Porque em Java cada subprograma tem de pertencer a uma classe, e os subprogramas de uma classe chamam-se métodos. Mas a diferença continua a existir: se um método devolve um resultado, na verdade é uma função. Se tiver `void` à frente, não devolve nada e na verdade é um procedimento. O Java simplifica e chama métodos aos dois. Eu também: o meu método chama-se Ruminar. -::: - -## Exercício: Acrescentar uma chamada - -::: übung l15-titel -titel: Cumprimento com chamada -auftrag: Imagina que o subprograma `mostrarTitulo()` já existe. Constrói o programa principal: primeiro chama `mostrarTitulo()`. Depois pede um nome e mostra **Olá** e o nome. - Ou seja, quando se escreve Ada, aparece **Olá Ada**. -test: Ada -> Olá Ada -test: Rui -> Olá Rui -braucht: aufruf -tipp: O programa principal tem três partes: a chamada, a entrada e a saída. -tipp: Arrasta uma Chamada da área Elementos lá para cima e escreve `mostrarTitulo()`. Por baixo vêm a entrada `input: String nome "Como te chamas?"` e a saída. -lösung: l15-titel-loesung.visustruct -::: - -## Passar valores: parâmetros - -Muitas vezes um subprograma deve trabalhar com valores que só se conhecem quando é chamado. Nesse caso tem uma **linha de cabeçalho** como título: - -``` -void mostrarSoma(int a, int b) -``` - -- `void` quer dizer: o subprograma não devolve nenhum resultado. -- `mostrarSoma` é o nome. -- Entre os parênteses estão os **parâmetros**: variáveis com tipo de dados que recebem os seus valores quando o subprograma é chamado. Vários separam-se com vírgulas. - -::: diagramm l15-zeige-summe.visustruct -O subprograma com a linha de cabeçalho como título. Faz contas com a e b como se fossem variáveis normais. -::: - -No bloco da chamada escreves os valores entre os parênteses, p. ex. `mostrarSoma(3, 4)`. O primeiro valor vai para `a`, o segundo para `b`. Em vez de números também podes usar variáveis e contas, como `mostrarSoma(x, x + 1)`. - -::: diagramm l15-zeige-summe-haupt.visustruct -O programa principal chama mostrarSoma duas vezes com valores diferentes. Abre os dois diagramas e inicia aqui a simulação. -::: - -> **Variáveis locais:** Os parâmetros e todas as variáveis criadas no subprograma pertencem só ao subprograma. Ele recebe **cópias** dos valores; mais sobre isso em baixo, em passagem por valor. Durante a chamada, a simulação só mostra as variáveis do subprograma. - -## Devolver um resultado: return - -Um subprograma também pode devolver um resultado, o **valor de retorno**. Nesse caso, a linha de cabeçalho tem o tipo de dados do resultado em vez de `void`: - -``` -int quadrado(int x) -``` - -A instrução `return resultado` devolve o valor e termina logo o subprograma. Quando o chamas, guardas o resultado numa variável: depois de `int q = quadrado(5)`, `q` tem o valor 25. - -::: diagramm l15-quadrat.visustruct -O subprograma quadrado calcula e devolve o resultado com return. -::: - -::: diagramm l15-quadrat-haupt.visustruct -O programa principal guarda o valor de retorno em q. Abre os dois diagramas e experimenta a simulação. -::: - -> Um subprograma com valor de retorno tem de terminar com `return`. Se faltar o return, a simulação indica um erro. - -Na **vista de código**, a linha de cabeçalho passa a ser um método Java (`public static int quadrado(int x)`), um `def` em Python e uma `function` em JavaScript. Se os subprogramas estiverem abertos noutros separadores, aparecem no código juntamente com o programa principal. - -## Exercício: Calcular a área - -::: übung l15-flaeche -titel: Calcular a área -auftrag: Constrói dois diagramas. O subprograma `int area(int a, int b)` devolve a área de um retângulo, ou seja, a vezes b. O programa principal pede o comprimento e a largura, chama `area` e mostra **Área:** e o resultado. - Com 3 e 4 aparece **Área: 12**. -test: 3, 4 -> Área: 12 -test: 5, 5 -> Área: 25 -test: 7, 0 -> Área: 0 -braucht: aufruf -tipp: Constróis dois diagramas: um subprograma que só calcula e devolve o resultado, e um programa principal para a entrada e a saída. -tipp: Abre um novo separador com **+** e dá-lhe o título `int area(int a, int b)`. Lá dentro basta uma instrução: `return a * b`. No programa principal escreves `int f = area(comprimento, largura)` no bloco da chamada. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Cópia ou original: passagem por valor e passagem por referência - -O que acontece se um subprograma alterar o seu parâmetro? Depende do **que** é passado. - -**Passagem por valor:** Com `int`, `double`, `boolean`, `char` e `String`, o subprograma recebe uma **cópia** do valor. Se alterar o seu parâmetro, a variável de quem chamou fica como estava. - -**Passagem por referência:** Com um **array**, o subprograma não recebe uma cópia, mas uma referência para o mesmo array. Se alterar uma posição, a posição também fica alterada para quem chamou. A linha de cabeçalho para isso fica assim: - -``` -void limpar(boolean[] lugares) -``` - -::: grafik uebergabe.svg -Em cima, duplicar recebe uma cópia de numero. Em baixo, fila e lugares apontam para o mesmo array. -::: - -Experimenta as duas. Abre os três diagramas e inicia a simulação no programa principal: - -::: diagramm uebergabe-verdopple.visustruct -duplicar só altera a sua cópia x. -::: - -::: diagramm uebergabe-leeren.visustruct -limpar põe todos os lugares a false, por exemplo quando uma sessão é cancelada. -::: - -::: diagramm uebergabe-haupt.visustruct -numero continua a ser 5 depois da chamada. Já os lugares em fila ficam livres depois da chamada. -::: - -> Se quiseres receber um número de volta de um subprograma, usa `return`, p. ex. `numero = duplicar(numero)` com a linha de cabeçalho `int duplicar(int x)`. Um array, pelo contrário, pode ser alterado diretamente pelo subprograma. - -::: angeberwissen -Em rigor, o Java só conhece a passagem por valor. Mas, com um array, não é copiado o array inteiro, só o seu **endereço** na memória. Com o endereço copiado, o subprograma encontra o mesmo array. É como se eu te desse uma cópia da chave do meu cacifo: a chave é copiada, mas o feno no cacifo só existe uma vez. -::: - -## Exercício: Pontos de bónus - -::: übung uebergabe-bonus -titel: Pontos de bónus -auftrag: O programa principal chama `bonus(pontos)` e depois mostra todos os pontos. Constrói o subprograma `void bonus(int[] pontos)`, que aumenta em 1 cada pontuação do array. Em vez de 3, 5 e 8 vês então **4**, **6** e **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: O programa principal já está pronto. Só constróis o subprograma num novo separador. -tipp: Abre um novo separador com **+** e o título `void bonus(int[] pontos)`. Lá dentro, um ciclo for percorre todas as posições e calcula `pontos[i] = pontos[i] + 1`. Não precisas de return, porque o array é alterado diretamente. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## A interrupção - -Às vezes um ciclo deve terminar **mais cedo**, a meio do seu corpo. É para isso que serve a **Interrupção**. Ela sai imediatamente do ciclo em que está. O programa continua no primeiro bloco depois do ciclo. Em Java, Python e JavaScript chama-se `break`. - -Reconheces a Interrupção pela ponta no seu lado esquerdo. Podes escrever um pequeno comentário no bloco, p. ex. `Sair do ciclo`. Ele aparece no código como comentário depois de `break`. - -Uma Interrupção está quase sempre numa **decisão**: só se sai do ciclo se uma condição se verificar. - -Um caso típico é o **ciclo infinito com Interrupção**. O ciclo em si não tem condição. É executado até se chegar à Interrupção: - -::: diagramm l15-endlos-aussprung.visustruct -O ciclo pede sempre um número. Com 0 salta para fora, senão soma o número à soma. -::: - -Sem Interrupção, um ciclo infinito nunca acabaria mesmo. - -## Interrupção na simulação - -A simulação executa a Interrupção como `break`: sai do ciclo mais interior e continua depois dele. Se uma Interrupção estiver fora de qualquer ciclo, o subprograma termina; no programa principal termina o programa todo. O `return` faz o mesmo. - -Muitas vezes podes passar completamente sem Interrupção: escreves a condição de paragem diretamente no ciclo. Normalmente até fica mais claro. - -## Exercício: Somar até 0 - -::: übung l15-bis-null -titel: Somar até 0 -auftrag: Reconstrói o programa “Somar até 0” **sem** Interrupção. Ele pede números inteiros até alguém escrever 0. Depois mostra **Soma:** e a soma de todos os números introduzidos. -test: 3, 4, 0 -> Soma: 7 -test: 0 -> Soma: 0 -test: 10, -2, 5, 0 -> Soma: 13 -tipp: Sem Interrupção, é a própria condição do ciclo que tem de verificar se foi escrito 0. -tipp: Pede o primeiro número antes do ciclo. O ciclo while é executado com a condição `numero != 0`. No corpo somas o número à soma e depois pedes o número seguinte. Na segunda entrada só escreves `input: numero "…"`, porque `numero` já existe. -lösung: l15-bis-null-loesung.visustruct -::: - -## Agora em Java - -Em Java, um subprograma chama-se **método**. O quadrado de cima fica assim: - -```java -public static int quadrado(int x) { - int resultado = x * x; - return resultado; -} -``` - -O programa principal chama o método pelo nome e passa-lhe o valor entre parênteses curvos: - -```java -int q = quadrado(numero); -System.out.println("O quadrado é " + q); -``` - -- No cabeçalho, antes do nome, fica o que o método devolve (`int`). Se não devolver nada, fica `void`. -- Os parâmetros ficam entre parênteses curvos, com o tipo de dados: `(int x)`. Separas vários com vírgulas. -- Na área Código escreves cada método no seu próprio separador, tal como cada subprograma tem o seu próprio estrutograma. -- Em Java, a saída chama-se `break`. Com `while (true)` constróis um ciclo que só termina com `break`. - -::: übung l18-java-kasse -titel: Caixa com break -code: java -auftrag: Escreve uma caixa registadora em Java. Pergunta repetidamente por um preço em euros inteiros. Com 0 sai do ciclo com `break`. Depois mostra quantos artigos foram e quanto custam ao todo. - Com 3, 4 e depois 0 aparece **Artigos: 2** e **Total: 7**. -test: 3, 4, 0 -> Artigos: 2 | Total: 7 -test: 0 -> Artigos: 0 | Total: 0 -test: 10, 2, 5, 0 -> Artigos: 3 | Total: 17 -braucht: endlosschleife, aussprung -tipp: Precisas de duas variáveis que começam em 0 antes do ciclo: uma para a soma e outra para a quantidade de artigos. -tipp: Dentro de `while (true) { … }` lês o preço. Logo a seguir verificas `if (preco == 0) { break; }`. Só depois somas o preço e aumentas os artigos em 1. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Preenche os espaços: métodos e break - -::: lückentext -titel: Método e saída -auftrag: Preenche as palavras que faltam. Em cima está o método que calcula um quadrado. Por baixo está o programa principal, que o chama. Na área Código, cada um fica no seu separador. -```java -public static [[int]] quadrado(int x) { - [[return]] x * x; -} -``` -```java -int numero = 1; -while ([[true]]) { - int q = [[quadrado]](numero); - if (q > 50) { - [[break]]; - } - System.out.println(q); - numero = numero + 1; -} -``` -erklärung: `int` antes do nome do método quer dizer que o método devolve um número inteiro, com `return`. Se um método não devolver nada, aparece `void`. `while (true)` repete-se sem fim até `break` sair do ciclo. Saída: 1, 4, 9, 16, 25, 36 e 49. -::: - -## Encontra o erro: adivinhar - -::: übung l18-java-fehler -titel: Corrigir a contagem de tentativas -code: java -auftrag: Neste jogo de adivinhar, o número secreto é 7. O programa pede um palpite até aparecer o 7 e depois mostra o número de tentativas. Com 3, 5 e 7 foram 3 tentativas, mas o programa diz **Tentativas: 2**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Tentativas: 3 -test: 7 -> Tentativas: 1 -test: 1, 2, 3, 7 -> Tentativas: 4 -braucht: endlosschleife, aussprung -tipp: O que acontece com o palpite certo? Ainda é contado antes de `break` sair do ciclo? -tipp: Primeiro conta, depois verifica: `tentativas = tentativas + 1;` fica antes do `if` com o `break`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Jogo: O que é devolvido? - -::: spiel frage -titel: Jogo: O que é devolvido? -intro: O Ludwig chama métodos e sai de ciclos a meio. Diz antes o que aparece. Sete rondas. - -runde: - public static int quadrado(int x) { - return x * x; - } - - int q = quadrado(5); - System.out.println(q); -frage: O que aparece? -- 5 -- 10 -- [x] 25 -> A chamada põe 5 em x, e o return devolve 5 · 5. - -runde: - public static void mostrarSoma(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - mostrarSoma(x, x + 1); -frage: O que aparece? -- [x] 5 -- 23 -- 3 -> O primeiro valor 2 vai para a, o segundo valor 3 para b. Em Java, `a + b` calcula com números normalmente. - -runde: -frage: O que devolve um método que tem `void` antes do nome? -- um número inteiro -- [x] nada -- sempre 0 -> `void` quer dizer: sem valor de retorno. Com `int` nesse lugar, é devolvido um número inteiro. - -runde: - public static void duplicar(int x) { - x = x * 2; - } - - int numero = 5; - duplicar(numero); - System.out.println(numero); -frage: O que aparece? -- [x] 5 -- 10 -- 0 -> Passagem por valor (call by value): duplicar recebe uma cópia. numero continua a ser 5. - -runde: - public static void limpar(boolean[] lugares) { - for (int i = 0; i < lugares.length; i++) { - lugares[i] = false; - } - } - - boolean[] fila = {true, true}; - limpar(fila); - System.out.println(fila[0]); -frage: O que aparece? -- true -- [x] false -> Num array, fila e lugares apontam para o mesmo array. Quem chama também vê a alteração. - -runde: - int soma = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - soma = soma + i; - } - System.out.println(soma); -frage: O que aparece? -- [x] 6 -- 10 -- 55 -> Com i = 4, o `break` sai logo do ciclo. Só foram somados 1 + 2 + 3. - -runde: - int numero = 1; - while (true) { - numero = numero * 3; - if (numero > 20) { - break; - } - } - System.out.println(numero); -frage: O que aparece? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Só 27 é maior do que 20, e então o ciclo infinito termina com break. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dividir uma tarefa grande em problemas mais pequenos. → Dividir tarefas grandes -- Consigo inserir uma chamada e construir um subprograma num separador próprio. → A chamada -- Consigo passar valores a um subprograma com parâmetros. → Passar valores: parâmetros -- Consigo devolver um valor de retorno com return e guardá-lo ao chamar. → Devolver um resultado: return -- Consigo explicar porque é que um subprograma não consegue alterar um número, mas consegue alterar um array. → Cópia ou original: passagem por valor e passagem por referência -- Consigo explicar o que faz uma Interrupção e porque está numa decisão. → A interrupção -- Consigo terminar um ciclo com uma Interrupção ou através da sua condição. → Interrupção na simulação -- Consigo reconhecer um método em Java e sair de um ciclo com `break`. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que significa um bloco de chamada com o texto `mostrarResultado()`? -→ A chamada -- [ ] O programa termina aqui. -- [x] O subprograma mostrarResultado() é executado aqui, e depois o programa continua. -- [ ] A palavra mostrarResultado() é mostrada aqui. - -? Onde continua o programa depois de uma Interrupção? -→ A interrupção -- [ ] No início do ciclo -- [x] No primeiro bloco depois do ciclo -- [ ] Logo no início do programa -> A Interrupção sai do ciclo em que está. Em Java, Python e JavaScript chama-se break. - -? Porque é que uma Interrupção costuma estar numa decisão? -→ A interrupção -- [x] Para só se sair do ciclo se uma condição se verificar -- [ ] Porque senão uma Interrupção não pode ser guardada -- [ ] Porque uma decisão é ela própria um ciclo -> Sem decisão, sair-se-ia do ciclo logo na primeira iteração. - -? Onde encontra a simulação o subprograma de uma chamada `mostrarResultado()`? -→ A chamada -- [ ] Tem de estar no mesmo estrutograma. -- [x] Num separador aberto com o título mostrarResultado() -- [ ] A simulação não consegue executar subprogramas. -> Constrói cada subprograma num separador próprio e dá-lhe como título o nome da chamada. - -? O subprograma tem a linha de cabeçalho `void mostrarSoma(int a, int b)`. Que chamada serve? -→ Passar valores: parâmetros -- [ ] mostrarSoma() -- [x] mostrarSoma(3, 4) -- [ ] int s = mostrarSoma(3, 4) -> Dois parâmetros precisam de dois valores. E `void` quer dizer que não volta nada que pudesses guardar. - -? Depois de `int q = quadrado(5)`, q tem 25. O que está no fim do subprograma quadrado? -→ Devolver um resultado: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> Com return, o subprograma devolve o valor à chamada. Uma saída só o mostraria. - -? `void duplicar(int x)` calcula `x = x * 2`. O programa principal tem `int numero = 5` e depois a chamada `duplicar(numero)`. Que valor tem numero a seguir? -→ Cópia ou original: passagem por valor e passagem por referência -- [x] 5 -- [ ] 10 -- [ ] 0 -> Passagem por valor: duplicar só alterou uma cópia de numero. - -? `void limpar(boolean[] lugares)` põe todas as posições a false. O que é verdade para o array fila no programa principal depois de `limpar(fila)`? -→ Cópia ou original: passagem por valor e passagem por referência -- [ ] Não mudou, porque o subprograma recebe uma cópia. -- [x] Todas as posições são false, porque lugares e fila são o mesmo array. -- [ ] O array é apagado. -> Passagem por referência: um array é passado como referência. Quem chamou também vê as alterações nas posições. - -? Como se chama um subprograma em Java? -→ Agora em Java -- [ ] Classe -- [x] Método -- [ ] Ciclo -> Em Java, um subprograma é um método, por exemplo o método `main`. Consoante o tipo, também se chama procedimento ou função. - -? Muitos blocos têm um segundo nome nos manuais. Associa cada termo do VisuStruct ao seu outro nome. -→ Agora em Java -= Decisão -> Instrução condicional -= Seleção -> Seleção múltipla -= Ciclo -> Iteração -= Subprograma -> Método -> Os dois nomes querem dizer o mesmo. Se conheces um deles, também percebes o outro. - -? O que fica no cabeçalho de um método Java que não devolve nada? -→ Devolver um resultado: return -- [ ] int -- [x] void -- [ ] return -> void significa “vazio”: o método faz alguma coisa, mas não devolve nenhum valor. -::: diff --git a/web/lessons/pt/19-suchen-und-sortieren.md b/web/lessons/pt/19-suchen-und-sortieren.md deleted file mode 100644 index d99d1d8c..00000000 --- a/web/lessons/pt/19-suchen-und-sortieren.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -titel: Pesquisar e ordenar -bereich: Fundamentos -kurz: Perceber com cartas de jogar como funcionam a pesquisa linear, a pesquisa binária e o bubble sort, e porque é que alguns métodos são muito mais rápidos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar como a pesquisa linear percorre um array -- construir uma pesquisa linear como estrutograma -- explicar porque é que a pesquisa binária só funciona com valores ordenados -- explicar porque é que a pesquisa binária é muito mais rápida com muitos valores -- mostrar uma ronda de bubble sort com cartas de jogar -- percorrer um array em Java e contar resultados -::: - -## Procurar uma carta - -À tua frente está uma fila de cartas de jogar viradas para baixo. Procuras o 9. O que fazes? Viras uma carta a seguir à outra até encontrares o 9 ou teres virado todas as cartas. - -::: grafik ss-lineare-suche.svg -As cartas estão baralhadas. Cada carta que viras é uma comparação: é esta o 9? -::: - -É exatamente assim que funciona a **pesquisa linear**: percorre o array do índice 0 até ao fim e compara cada posição com o valor procurado. Funciona sempre, mesmo que os valores estejam baralhados. - -No array, as nossas cartas são números. Deixamos de fora o valete, a dama e o rei. - -::: diagramm ss-lineare-suche.visustruct -O ciclo é executado até a carta ser encontrada ou já não haver posições. A variável comparacoes conta quantas vezes se comparou. Na simulação, procura o 2, o 27 e o 4. -::: - -> Se a carta não estiver lá, `posicao` fica em **-1**. Não existe o índice -1, por isso aqui -1 quer dizer “não encontrado”. - -## Exercício: Encontrar uma carta - -::: übung ss-karte-suchen -titel: Encontrar uma carta -auftrag: Cria o array `int[] cartas = {8, 4, 11, 4, 6}` e pede uma carta. Mostra a posição da **primeira** carta que corresponde, p. ex. `Posição: 1` para o 4. Se a carta não estiver lá, mostra `Não encontrado`. -test: 4 -> Posição: 1 -test: 6 -> Posição: 4 -test: 8 -> Posição: 0 -test: 9 -> Não encontrado -braucht: whileSchleife, verzweigung -tipp: Percorre o array da frente para trás e compara cada carta com a que procuras. -tipp: Reconstrói o exemplo de cima. Aqui não precisas da variável comparacoes. O ciclo tem de parar assim que `posicao` deixar de ser -1, senão, para o 4, encontras o segundo em vez do primeiro. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Pesquisa binária: ordenado é mais rápido - -Agora as cartas estão à tua frente **ordenadas**, da mais pequena para a maior. Procuras o 27. Já não viras a primeira carta da frente, mas a do **meio**: - -- Se for a que procuras, terminaste. -- Se for mais pequena, a carta procurada só pode estar à direita. A metade esquerda inteira fica de fora. -- Se for maior, fica de fora a metade direita. - -Fazes o mesmo outra vez com o resto. Com cada comparação, o monte fica reduzido a metade. - -::: grafik ss-binaere-suche.svg -Três comparações em vez de catorze: com cada meio, metade das cartas que restam fica de fora. -::: - -No estrutograma, duas variáveis guardam a parte em que ainda se procura: `esquerda` e `direita`. O meio é `(esquerda + direita) / 2`. Como é uma divisão inteira, o resultado é sempre um índice inteiro. - -::: diagramm ss-binaere-suche.visustruct -O mesmo array da pesquisa linear. Na simulação, procura outra vez o 27 e compara a saída Comparações com a pesquisa linear. -::: - -> A pesquisa binária **só funciona com valores ordenados**. Com cartas baralhadas, depois de olhares para o meio não sabes em que metade continuar a procurar. - -::: angeberwissen -Penso num número de 1 a 100. Podes adivinhar, e eu só digo “maior” ou “menor”. Com a pesquisa binária precisas no máximo de **7** tentativas. Para um número até um milhão são no máximo 20, para mil milhões 30. Cada duplicação custa só mais uma tentativa. É assim que as bases de dados pesquisam milhões de registos numa fração de segundo. Eu, já agora, pesquiso de forma linear: como o prado da esquerda para a direita. -::: - -## Quão rápido é? - -A qualidade de um método mede-se pelo número de comparações de que precisa **no pior caso**. Na pesquisa linear, é o caso em que a carta está mesmo lá atrás ou não existe. - -::: grafik ss-vergleiche.svg -Com 100 cartas, a pesquisa linear precisa de até 100 comparações, a pesquisa binária no máximo de 7. -::: - -| Número de cartas | Pesquisa linear | Pesquisa binária | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1000 | 1000 | 10 | -| 1 000 000 | 1 000 000 | 20 | - -A pesquisa linear cresce ao mesmo ritmo que o número de cartas. Na pesquisa binária, o dobro das cartas acrescenta só **uma** comparação. - -## Ordenar com bubble sort - -Para a pesquisa binária, os valores têm de estar ordenados. Uma das formas mais simples de ordenar é o **bubble sort**. Percorres a fila da esquerda para a direita e comparas sempre **dois vizinhos**. Se a carta maior estiver à esquerda, trocas as duas. - -::: grafik ss-bubblesort.svg -Depois de uma ronda, a carta maior está na ponta da direita. -::: - -Depois da primeira ronda, a carta maior está na ponta da direita, como uma bolha de ar que sobe. Daí vem o nome (*bubble* quer dizer bolha). Depois repetes a ronda para as cartas que restam. Com 5 cartas precisas de 4 rondas. - -O estrutograma tem dois ciclos for, um dentro do outro. O exterior conta as rondas, o interior compara os vizinhos `cartas[i]` e `cartas[i + 1]`. Já sabes como trocar: precisas de uma **variável auxiliar**. - -::: diagramm ss-bubblesort.visustruct -O ciclo interior fica mais curto em cada ronda, porque as cartas maiores à direita já estão no sítio certo. Percorre-o na simulação com Passo e observa o array em Variáveis. -::: - -O bubble sort é fácil de perceber, mas lento. Com n cartas precisa de até n · (n − 1) / 2 comparações: com 10 cartas 45, com 100 cartas já 4950 e com 1000 cartas quase meio milhão. Mais tarde talvez conheças métodos mais rápidos, como o quicksort. - -## Exercício: Ordenar por ordem decrescente - -::: übung ss-absteigend -titel: Ordenar por ordem decrescente -auftrag: O diagrama inicial lê 5 cartas e ordena-as com bubble sort por ordem **crescente**, ou seja, da mais pequena para a maior. Altera-o de modo que as cartas sejam mostradas por ordem **decrescente**, a maior primeiro. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Olha para a condição na decisão. É ela que decide quando dois vizinhos são trocados. -tipp: Só precisas de alterar um único caractere. Quando devem ser trocados dois vizinhos, se a carta maior deve ir para a esquerda? -tipp: Na decisão, troca `cartas[i] > cartas[i + 1]` por `cartas[i] < cartas[i + 1]`. Assim os vizinhos trocam quando a carta maior está à direita, e a carta grande vai para a esquerda. -lösung: ss-absteigend-loesung.visustruct -::: - -## Agora em Java - -A pesquisa linear do exercício fica assim em Java: - -```java editor -int[] cartas = {8, 4, 11, 4, 6}; -int procurada = 4; -int posicao = -1; -int i = 0; -while (posicao == -1 && i < cartas.length) { - if (cartas[i] == procurada) { - posicao = i; - } - i = i + 1; -} -System.out.println("Posição: " + posicao); -``` - -- `&&` significa “e”: o ciclo só corre enquanto não se encontrou nada **e** ainda há cartas. -- Se o ramo false estiver vazio, deixas simplesmente de fora `else`. -- A troca no bubble sort também precisa de uma variável auxiliar em Java: `int aux = cartas[i];` - -::: übung l19-java-zaehlen -titel: Contar cartas -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. Escreve em Java um programa que pergunta por uma carta e conta quantas vezes aparece. Mostra **Quantidade:** e o número. - Com 4 aparece **Quantidade: 2**. -test: 4 -> Quantidade: 2 -test: 8 -> Quantidade: 1 -test: 9 -> Quantidade: 0 -braucht: forSchleife, verzweigung -tipp: Ao contrário da pesquisa, não paras no primeiro resultado. Um ciclo for percorre todas as cartas. -tipp: `for (int i = 0; i < cartas.length; i++)` e lá dentro `if (cartas[i] == procurada) { quantidade = quantidade + 1; }`. `quantidade` começa em 0 antes do ciclo. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Preenche os espaços: bubble sort - -::: lückentext -titel: Ordenar cartas -auftrag: O programa ordena as cartas por ordem crescente com o bubble sort. Preenche as palavras e os sinais que faltam. -```java -int[] cartas = {5, 2, 8, 1}; -for (int ronda = 0; ronda < cartas.[[length]] - 1; ronda++) { - for (int i = 0; i < cartas.length - 1; i++) { - if (cartas[i] [[>]] cartas[i + 1]) { - [[int]] aux = cartas[i]; - cartas[i] = cartas[i + 1]; - cartas[i + 1] = [[aux]]; - } - } -} -for (int i = 0; i < cartas.length; i++) { - System.out.println(cartas[i]); -} -``` -erklärung: Se uma carta for maior do que a vizinha da direita, as duas trocam de lugar, com uma variável auxiliar como ao trocar os copos. Depois de `length - 1` rondas está tudo ordenado: 1, 2, 5, 8. -::: - -## Encontra o erro: pesquisa - -::: übung l19-java-fehler -titel: Corrigir a pesquisa linear -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. O programa deve mostrar a **primeira** posição da carta procurada, para o 4 é **Posição: 1**. Mas mostra **Posição: 3**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l19-java-fehler-start.visustruct -test: 4 -> Posição: 1 -test: 6 -> Posição: 4 -test: 9 -> Posição: -1 -test: 8 -> Posição: 0 -braucht: whileSchleife, verzweigung -tipp: O ciclo vai sempre até à última carta. O que acontece quando o 4 aparece uma segunda vez? -tipp: O ciclo deve parar assim que encontrar algo: `while (posicao == -1 && i < cartas.length)`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l19-java-laeuft-nicht -titel: Procurar uma carta -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. O programa procura o 11 e deve mostrar **Posição: 2**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Posição: 2 -braucht: forSchleife, verzweigung -tipp: Compara os nomes na condição com os nomes criados em cima. -tipp: A carta procurada está em `procurada` com p minúsculo: `if (cartas[i] == procurada) {` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Profissional da pesquisa - -::: spiel frage -titel: Jogo: Profissional da pesquisa -intro: O Ludwig procura e ordena cartas. Quão rápido é, e o que sai? Sete rondas. - -runde: - int[] cartas = {8, 4, 11, 4, 6}; - int procurada = 4; - int posicao = -1; - int i = 0; - while (posicao == -1 && i < cartas.length) { - if (cartas[i] == procurada) { - posicao = i; - } - i = i + 1; - } - System.out.println("Posição: " + posicao); -frage: O que aparece? -- [x] Posição: 1 -- Posição: 3 -- Posição: 2 -> A pesquisa para no primeiro 4. Está na posição 1, contando a partir de 0. - -runde: - int[] cartas = {8, 4, 11, 4, 6}; - int procurada = 7; -frage: Com a mesma pesquisa linear: o que fica em posicao? -- 0 -- 5 -- [x] -1 -> O 7 não está lá. posicao fica em -1, que quer dizer "não encontrado". - -runde: -frage: Com que cartas funciona a pesquisa binária? -- com todas -- [x] só com cartas ordenadas -- só com menos de 100 -> Só com as cartas ordenadas é que, depois de olhares para o meio, sabes em que metade continuar a procurar. - -runde: -frage: De quantas comparações precisa no máximo a pesquisa binária com 100 cartas? -- 50 -- [x] 7 -- 100 -> Cada comparação corta o monte a meio. Cortar 7 vezes chega para até 128 cartas, portanto também para 100. - -runde: -frage: Em vez de 1000 cartas agora são 2000. Quantas comparações a mais precisa no máximo a pesquisa binária? -- [x] uma -- o dobro -- 1000 -> A primeira comparação reduz 2000 a 1000. Depois continua como antes. - -runde: - int[] cartas = {5, 3, 8, 1}; -frage: Uma passagem do bubble sort compara sempre dois vizinhos, da esquerda para a direita. Como ficam as cartas depois? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 e 3 trocam, 5 e 8 ficam, 8 e 1 trocam. A carta maior fica na ponta da direita. - -runde: -frage: O bubble sort troca `cartas[i]` e `cartas[i + 1]`. De que precisa para isso? -- [x] de uma variável auxiliar -- de um segundo array -- de uma pesquisa binária -> Tal como ao trocar duas variáveis: `int aux = cartas[i];`, senão perde-se um valor. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar como a pesquisa linear percorre um array. → Procurar uma carta -- Consigo construir uma pesquisa linear como estrutograma. → Exercício: Encontrar uma carta -- Consigo explicar porque é que a pesquisa binária só funciona com valores ordenados. → Pesquisa binária: ordenado é mais rápido -- Consigo explicar porque é que a pesquisa binária é muito mais rápida com muitos valores. → Quão rápido é? -- Consigo mostrar uma ronda de bubble sort com cartas de jogar. → Ordenar com bubble sort -- Consigo percorrer um array em Java e contar resultados. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? De que precisa a pesquisa binária? -→ Pesquisa binária: ordenado é mais rápido -- [ ] O array tem de ter exatamente 100 posições. -- [x] Os valores têm de estar ordenados. -- [ ] O valor procurado tem de existir. -> Só com valores ordenados é que sabes, depois de olhares para o meio, em que metade continuar a procurar. - -? Um array ordenado tem 1000 valores. De quantas comparações precisa a pesquisa binária no máximo? -→ Quão rápido é? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: depois de cerca de 10 divisões a meio, resta um valor. - -? O que compara o bubble sort em cada passo? -→ Ordenar com bubble sort -- [ ] A primeira e a última carta -- [x] Duas cartas vizinhas -- [ ] Cada carta com a do meio -> Se a carta maior estiver à esquerda, os vizinhos são trocados. - -? Onde está a carta maior depois da primeira ronda do bubble sort? -→ Ordenar com bubble sort -- [ ] Na ponta da esquerda -- [ ] No meio -- [x] Na ponta da direita -> Vai sendo trocada em cada comparação e sobe para a direita como uma bolha. - -? O que quer dizer `posicao = -1` na pesquisa linear? -→ Procurar uma carta -- [x] A carta (ainda) não foi encontrada. -- [ ] A carta está mesmo lá atrás. -- [ ] O array está vazio. - -? Associa cada método à descrição certa. -→ Procurar uma carta -= Pesquisa linear -> olhar para uma carta a seguir à outra -= Pesquisa binária -> olhar para o meio e pôr de lado uma metade -= Bubble sort -> comparar vizinhos e trocá-los - -? Porque usas um ciclo for para contar e não uma pesquisa que para no primeiro resultado? -→ Agora em Java -- [ ] Um ciclo for é sempre mais rápido. -- [x] Tens de ver todas as cartas, senão faltam resultados mais à frente. -- [ ] Um ciclo while não consegue percorrer arrays. -> A carta pode aparecer várias vezes. Por isso percorres todas as cartas até ao fim. -::: diff --git a/web/lessons/pt/20-java.md b/web/lessons/pt/20-java.md deleted file mode 100644 index 53d3fa83..00000000 --- a/web/lessons/pt/20-java.md +++ /dev/null @@ -1,472 +0,0 @@ ---- -titel: Estrutograma e código -bereich: Do estrutograma ao código -kurz: Todos os elementos em Java num relance, gerar código, escrever Java na área Código, executá-lo e procurar erros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- abrir a vista de código e escolher Java como linguagem -- reconhecer em Java a saída, a entrada, as decisões e os ciclos -- explicar a diferença entre Excerto e Classe -- explicar como o código Java corre em qualquer sistema operativo com o compilador, o bytecode e a JVM -- distinguir o JDK do JRE -- explicar porque é que um programa em C++ tem de ser compilado de novo para cada sistema operativo e um programa Java não -- reconstruir um programa Java curto como estrutograma -- escrever Java na área Código e ler o estrutograma que é construído -- executar um programa com ▶︎ e usar entradas e saídas na consola -- encontrar um erro de sintaxe ou de execução pelo número de linha vermelho -- pôr pontos de paragem e seguir um programa passo a passo -::: - -## A vista de código - -Nas lições 4 a 19 já escreveste cada elemento em Java. Aqui vês tudo num relance e aprendes como o VisuStruct transforma um estrutograma inteiro num programa Java. - -Um estrutograma descreve um processo. Para um computador o executar, precisas de um programa numa linguagem de programação. O VisuStruct escreve esse código por ti. - -Clica em [Código](#zeige-code) nas ferramentas (ícone com parênteses angulares). À direita aparece o **Gerador de código**: - -- Em cima escolhes a linguagem: **Java**, **Python** ou **JavaScript**. -- Para Java escolhes ainda em **Saída Java** entre **Excerto** (só as instruções) e **Classe** (um ficheiro Java completo). -- **Texto do diagrama como comentários** escreve o texto de cada bloco como comentário por cima do código. -- **Copiar** põe o código na área de transferência, **Guardar Java…** guarda um ficheiro `.java`. - -O código muda logo sempre que alteras alguma coisa no estrutograma. - -::: angeberwissen -Mais tarde, Nassi trabalhou na linguagem de programação Ada e foi responsável pelo software na Apple. Portanto, quem inventa estrutogramas não acaba num curral de cabras, acaba na Apple. -::: - -::: diagramm l17-beispiel.visustruct -Um pequeno programa com uma entrada, um ciclo for e uma decisão. Abre-o e olha para o código Java correspondente. -::: - -## O exemplo em Java - -Para o diagrama de cima, o VisuStruct gera este código como **Excerto**: - -``` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que tabuada?"); -int numero = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int resultado = numero * i; - System.out.println(i + " vezes " + numero + " = " + resultado); -} -if (numero > 10) { - System.out.println("Esta foi difícil!"); -} else { - System.out.println("Esta foi fácil."); -} -``` - -Em Java, cada instrução termina com um **ponto e vírgula** `;`. O que está dentro de um bloco fica entre **chavetas** `{ }` em Java. A indentação mostra-te o que pertence ao quê. - -## Os elementos em Java - -| Elemento | Java | Lição | -|---|---|---| -| Instrução | `int soma = 0;` | 4, 5 | -| Saída | `System.out.println(soma);` | 6 | -| Entrada | `int numero = scanner.nextInt();` | 6 | -| Decisão | `if (condição) { … } else { … }` | 8, 9 | -| Seleção | `switch (valor) { case 1 -> { … } default -> { … } }` | 10 | -| Ciclo while | `while (condição) { … }` | 11 | -| Ciclo do-while | `do { … } while (condição);` | 12 | -| Ciclo for | `for (int i = 0; i < 5; i++) { … }` | 13 | -| Ciclo infinito | `while (true) { … }` | 11, 18 | -| Interrupção | `break;` | 18 | -| Chamada | `calcular();` | 18 | -| Array | `int[] numeros = new int[5];` | 15, 16 | -| Texto (String) | `String nome = scanner.next();` | 17 | - -Para entradas, `import java.util.Scanner;` e `Scanner scanner = new Scanner(System.in);` são escritos uma vez lá em cima. Antes de cada entrada, o VisuStruct mostra a pergunta com `System.out.println(…)`. - -Se o ramo false de uma decisão estiver vazio, o VisuStruct gera mesmo assim uma parte `else` que só contém o comentário `// empty element`. Se desligares **Gerar ramo else vazio no código**, a parte `else` vazia desaparece. - -## Excerto ou Classe - -Podes colar um **Excerto** no método `main` de um programa Java que já exista. Com **Classe** obténs um ficheiro completo que podes compilar e executar logo: - -``` -import java.util.Scanner; - -public class Tabuada { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Que tabuada?"); - int numero = scanner.nextInt(); - ... - } // fim do main -} // fim da classe -``` - -Os comentários `// fim do main` e `// fim da classe` depois das duas últimas chavetas não são necessários, mas ajudam muito: vês logo que chaveta fecha o quê e não te esqueces de nenhuma. - -O nome da classe vem do **título** do diagrama. O ficheiro tem de ter exatamente o mesmo nome, aqui `Tabuada.java`. O **Guardar Java…** trata disso por ti. - -> O código gerado é um bom começo, mas confirma-o. Se primeiro criares uma variável e mais tarde a voltares a ler com uma entrada, o VisuStruct escreve mesmo assim `int pin = scanner.nextInt();`. O Java indica então que `pin` já existe. Basta apagares o `int` nessa linha. - -## Como o Java corre em qualquer computador - -O teu ficheiro `Tabuada.java` é **código-fonte**: texto para pessoas. O processador do teu computador não o entende diretamente. Por isso, o Java corre em dois passos: - -1. O **compilador** `javac` traduz o código-fonte em **bytecode**. O resultado é o ficheiro `Tabuada.class`. -2. A **JVM** (Java Virtual Machine, máquina virtual Java) lê o bytecode e, ao executá-lo, traduz-o em **código máquina**: instruções para o processador do teu computador. - -::: grafik l20-jvm.svg -Compilar uma vez: o mesmo bytecode corre em qualquer JVM. -::: - -O bytecode existe só uma vez. Já a JVM existe para Windows, macOS, Linux e muitos outros sistemas. Por isso, o mesmo ficheiro `.class` corre em qualquer computador que tenha uma JVM instalada. A isto chama-se **independente da plataforma**. O lema é **“Write once, run anywhere”**: escrever uma vez, executar em qualquer lado. - -::: angeberwissen -Um dos primeiros compiladores foi construído em 1952 por **Grace Hopper**, que já conheces da lição 7. Na altura, muitos diziam-lhe que os computadores só sabiam fazer contas e não traduzir programas. Ela fê-lo na mesma. -::: - -Compara com o **C++**: aí o compilador traduz o código-fonte diretamente em código máquina para um só processador e um só sistema operativo. O programa pronto só corre aí. Para Windows, macOS e Linux tens de o compilar de novo de cada vez. - -::: grafik l20-cpp.svg -O C++ é compilado para código máquina em separado para cada sistema. -::: - -| | C++ | Java | -|---|---|---| -| O compilador gera | código máquina | bytecode | -| Quantas vezes compilar? | de novo para cada sistema | uma vez | -| De que precisa o computador para o executar? | de mais nada | de uma JVM | - -Isto torna o Java mais lento? Quase nada. As partes do programa que correm muitas vezes, por exemplo ciclos, são traduzidas de uma vez para código máquina pelo **compilador JIT** da JVM (“just in time”, mesmo a tempo). Depois correm quase tão depressa como em C++. - -> Imagina a JVM como um pequeno computador feito de software, quase como um sistema operativo só para programas Java. Mas, rigorosamente, não é um sistema operativo, é uma **máquina virtual**: um programa que corre ele próprio no Windows, no macOS ou no Linux e que, lá dentro, faz de conta que é um computador. - -Ao instalar o Java, encontras duas siglas: - -| Sigla | O que tem lá dentro? | Para quê? | -|---|---|---| -| **JRE** (Java Runtime Environment) | a JVM e blocos prontos como o `Scanner` | executar programas Java | -| **JDK** (Java Development Kit) | o JRE e ainda o compilador `javac` e outras ferramentas | escrever e compilar programas Java | - -Para programar precisas, portanto, do JDK. Hoje em dia normalmente só se descarrega o JDK, o JRE vem lá dentro. Para usar o VisuStruct no browser não precisas de instalar nada disto. - -::: angeberwissen -Com um JDK podes fazer tudo isto tu próprio na consola, ou seja, no terminal ou na linha de comandos: - -``` -java -version -javac Tabuada.java -java Tabuada -``` - -- `java -version` mostra que versão do Java está instalada. Se aparecer uma mensagem de erro, ainda falta o Java. -- `javac Tabuada.java` inicia o compilador. Depois tens dois ficheiros na pasta: o `Tabuada.java` com o teu código-fonte e o novo `Tabuada.class` com o bytecode. -- `java Tabuada` inicia a JVM com o teu bytecode. Aqui escreves o nome da classe sem `.class`. - -Se `java -version` funcionar mas `javac -version` não, só tens um JRE instalado. Nesse caso falta-te o JDK. -::: - -::: angeberwissen -Todos os ficheiros Java compilados (`.class`) começam com os mesmos quatro bytes, escritos em hexadecimal: `CA FE BA BE`. É assim que o computador reconhece que é Java. Foi James Gosling que inventou este “cafe babe”, a condizer com o café do nome. -::: - -## O modo de linguagem Java - -Na [roda dentada](#zeige-einstellungen) em cima à direita podes ativar as **Palavras-chave do código**. Então os blocos da área Elementos têm os mesmos nomes que os comandos em Java: `if`, `switch`, `for`, `while`, `do`, `while(true)`, `break` e `call`. O resto da interface fica no teu idioma. - -Isto ajuda-te a associar os blocos aos comandos Java. O teu diagrama em si fica igual. - -## Escrever Java diretamente - -Até agora desenhaste primeiro o estrutograma e depois viste o código. Na área [Código](#zeige-codelive) também funciona ao contrário. Clica na barra estreita **Código** à direita. Ao lado do estrutograma aparece uma coluna onde escreves tu mesmo o Java. - -- **Do estrutograma para o código:** Quando alteras alguma coisa no estrutograma, o código Java muda logo. -- **Do código para o estrutograma:** Quando escreves Java, o VisuStruct constrói o estrutograma enquanto escreves. Se ainda faltar alguma coisa, por exemplo uma chaveta de fecho `}`, aparece uma indicação por baixo do código. -- **Sugestões:** Enquanto escreves, o VisuStruct sugere modelos, por exemplo para `if`, `for` ou `while`. Com Enter aceitas um modelo. Substitui simplesmente os marcadores cinzentos pelo teu texto. -- **Indentar:** Se o teu código ficou desarrumado, clica no botão **Indentar** em cima na área Código. Cada nível fica então quatro espaços mais para dentro, como no Eclipse ou no IntelliJ. Se tiveres linhas selecionadas, o VisuStruct só indenta essas. - -Assim podes experimentar os dois caminhos. Desenhar primeiro o estrutograma é bom para planear um processo. Escrever o código diretamente é mais rápido quando já sabes o que queres. O estrutograma ajuda-te depois a verificar o teu código. - -## Executar o programa - -Em cima, na área Código, [▶︎ Executar](#zeige-ausfuehren) inicia o teu programa e **■ Parar** termina-o, por exemplo num ciclo infinito. O que o teu programa mostra aparece em baixo na [consola](#zeige-konsole). Se pedir uma entrada, escreve-a lá e carrega em Enter. - -Podes arrastar com o rato a fronteira entre o código e a consola para cima ou para baixo. - -Se algo correr mal, o número da linha fica vermelho. Num erro de sintaxe, o sítio também fica sublinhado a vermelho e por baixo lês, por exemplo, **Linha 2: Ainda falta aqui: ;**. Aí o ▶︎ nem sequer arranca o programa. Se o programa parar enquanto corre, é um erro de execução e a consola diz a linha, por exemplo **Linha 3: Divisão por zero.** Os três tipos de erros já os conheces da lição “Simulação e teste de secretária”. - -Se o VisuStruct souber exatamente o que falta, aparece um 💡 no fim da linha. Passa o rato por cima para veres a sugestão, por exemplo **Sugestão: inserir import java.util.Scanner;**. Um clique aplica-a. Mesmo assim, lê o que foi inserido, para saberes fazê-lo sozinho da próxima vez. - -> A área Código entende os comandos Java que também existem como blocos no estrutograma. Ainda não conhece classes próprias nem objetos. Janelas com Swing funcionam na mesma: liga o **Java verdadeiro (com Swing)** na roda dentada (lição “A tua primeira janela”). - -::: angeberwissen -Os profissionais chamam **IDE** (Integrated Development Environment) a um programa onde se escreve código, se executa e se procuram erros. Com a área Código, o VisuStruct é um pequeno IDE com estrutograma incluído. -::: - -## Encontrar erros com o depurador - -Às vezes um programa corre, mas calcula mal. É um erro de lógica. Aí ajuda o **depurador** (debugger): executa o teu programa devagar e tu vês o que acontece. - -- **Ponto de paragem:** Clica num número de linha à esquerda. Aparece um ponto vermelho. [▶︎ Executar](#zeige-ausfuehren) para antes dessa linha. Outro clique tira o ponto. -- **Linha amarela:** É a próxima a ser executada. No estrutograma, o bloco correspondente fica selecionado. -- **Variáveis:** Por baixo do código vês o valor atual de cada variável. O que mudou desde a última paragem acende-se a amarelo por um momento. -- **Passo a passo:** O botão [Passo a passo](#zeige-einzelschritt) ao lado de ▶︎ executa exatamente uma linha e para outra vez. Sem ponto de paragem, inicia o programa e para antes da primeira linha. -- **Continuar:** ▶︎ corre até ao próximo ponto de paragem ou até ao fim. **■ Parar** termina. - -Experimenta com este programa. Põe um ponto de paragem na linha 3 e carrega várias vezes em ▶︎. Como crescem `i` e `soma`? - -``` -int soma = 0; -for (int i = 1; i <= 4; i++) { - soma = soma + i; -} -System.out.println("Soma: " + soma); -``` - -::: ludwig -É um teste de secretária, só que o computador toma notas por ti. Antes de cada passo, pensa no valor que a variável devia ter a seguir. Quando a tabela não bate com o que esperavas, encontraste o sítio do erro. -::: - -## Exercício: Primeiro o código, depois o estrutograma - -Desta vez não desenhas. Abre a área Código e escreve este código Java: - -``` -System.out.println("Número inicial?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -``` - -::: übung l20-countdown -titel: Contagem decrescente -bereich: beide -auftrag: Escreve o código Java acima na área Código. Executa-o com ▶︎ e introduz um número inicial na consola. - Depois observa o estrutograma que foi construído e clica em Verificar. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Abre a área Código com a barra estreita mais à direita e começa simplesmente a escrever. -tipp: Atenção ao ponto e vírgula no fim de cada instrução e às chavetas do ciclo while. Por baixo do código aparece uma indicação quando ainda falta alguma coisa. -lösung: l20-countdown-loesung.visustruct -::: - -## Exercício: Java como estrutograma - -Agora ao contrário: aqui está um pedaço de código Java. Reconstrói-o como estrutograma. - -``` -System.out.println("Introduz um número"); -int n = scanner.nextInt(); -int fatorial = 1; -for (int i = 1; i <= n; i++) { - fatorial = fatorial * i; -} -System.out.println(fatorial); -``` - -::: übung l17-fakultaet -titel: Fatorial a partir de Java -bereich: beide -auftrag: Reconstrói o código Java de cima como estrutograma. O programa lê um número n e mostra o produto 1 · 2 · … · n. - No fim, confirma na vista de código se o teu código Java fica igual. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Lê o código Java linha a linha e pensa que bloco serve para cada linha. -tipp: As duas primeiras linhas Java juntas são uma única entrada: `input: int n "Introduz um número"`. O ciclo for tem os três campos `int i = 1`, `i <= n` e `i++`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Exercício: else if - -Em Java, vários casos escrevem-se muitas vezes com `else if`: - -``` -if (idade < 6) { - System.out.println("Entrada gratuita"); -} else if (idade < 18) { - System.out.println("Bilhete de criança: 4 euros"); -} else { - System.out.println("Bilhete de adulto: 8 euros"); -} -``` - -Num estrutograma não existe `else if`. Aí, uma segunda decisão fica no ramo false da primeira. Se o ramo false tiver só essa decisão, o VisuStruct volta a transformá-la em `else if` quando gera o código, e em `elif` em Python. - -::: übung l17-ticket -titel: Preço do bilhete -bereich: beide -auftrag: Pede a idade como número inteiro e reconstrói o código Java de cima como estrutograma. -test: 5 -> Entrada gratuita -test: 6 -> Bilhete de criança: 4 euros -test: 17 -> Bilhete de criança: 4 euros -test: 18 -> Bilhete de adulto: 8 euros -braucht: verzweigung -tipp: No código Java há outro `if` dentro de um `else`. No estrutograma isso é uma decisão dentro de um ramo. -tipp: Arrasta uma segunda decisão com a condição `idade < 18` para o ramo false da primeira decisão. -lösung: l17-ticket-loesung.visustruct -::: - -## Jogo: Que bloco é? - -::: spiel frage -titel: Jogo: Que bloco é? -intro: O Ludwig mostra-te Java. Que bloco do estrutograma está por trás? Oito rondas. -frage: Que bloco é este? - -runde: - do { - numero = numero * 2; - } while (numero < 100); -- Ciclo while -- [x] Ciclo do-while -- Ciclo for -> A condição está em baixo. Por isso o corpo corre pelo menos uma vez. - -runde: - switch (escolha) { - case 1 -> { System.out.println("água"); } - default -> { System.out.println("Esse botão não existe."); } - } -- Decisão -- [x] Seleção -- Chamada -> Uma variável é comparada com valores fixos: isso é a seleção. - -runde: - break; -- Chamada -- Ciclo infinito -- [x] Interrupção -> O `break` sai logo do ciclo onde está. - -runde: - calcular(); -- [x] Chamada -- Saída -- Instrução -> Um nome com parênteses: aqui é chamado um subprograma. - -runde: - int numero = scanner.nextInt(); -- Saída -- [x] Entrada -- Chamada -> O scanner lê um valor. Isso é uma entrada. - -runde: - while (true) { - System.out.println("Olá"); - } -- Ciclo while com condição -- [x] Ciclo infinito -- Ciclo do-while -> `while (true)` não tem uma condição verdadeira. Só um break o poderia terminar. - -runde: -frage: Queres um ficheiro Java completo que possas compilar e executar logo. O que escolhes na vista de código? -- Excerto -- [x] Classe -> Um excerto são só as instruções para o método `main`. Classe cria o ficheiro inteiro. - -runde: -frage: No depurador, uma linha está amarela. O que quer dizer? -- Tem um erro. -- [x] É a próxima a ser executada. -- Tem um ponto de paragem. -> Amarela é a próxima linha. Um ponto de paragem é um ponto vermelho no número da linha. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo abrir a vista de código e escolher Java como linguagem. → A vista de código -- Consigo reconhecer em Java a saída, a entrada, as decisões e os ciclos. → Os elementos em Java -- Consigo explicar a diferença entre Excerto e Classe. → Excerto ou Classe -- Consigo explicar como o código Java corre em qualquer sistema operativo com o compilador, o bytecode e a JVM. → Como o Java corre em qualquer computador -- Consigo distinguir o JDK do JRE. → Como o Java corre em qualquer computador -- Consigo explicar porque é que um programa em C++ tem de ser compilado de novo para cada sistema operativo e um programa Java não. → Como o Java corre em qualquer computador -- Consigo reconstruir um programa Java curto como estrutograma. → Exercício: Java como estrutograma -- Consigo escrever Java na área Código e ler o estrutograma que é construído. → Escrever Java diretamente -- Consigo executar um programa com ▶︎ e usar entradas e saídas na consola. → Executar o programa -- Consigo encontrar um erro de sintaxe ou de execução pelo número de linha vermelho. → Executar o programa -- Consigo pôr pontos de paragem e seguir um programa passo a passo. → Encontrar erros com o depurador -::: - -## Teste de conhecimentos - -::: quiz -? Como fica `output: "Olá"` em Java? -→ Os elementos em Java -- [ ] print("Olá") -- [x] System.out.println("Olá"); -- [ ] console.log("Olá"); -> print é Python, console.log é JavaScript. - -? De onde vem o nome da classe em Classe? -→ Excerto ou Classe -- [ ] Chama-se sempre Main. -- [x] Do título do diagrama -- [ ] Do primeiro bloco -> Sem título, a classe chama-se Main. - -? Que código Java pertence a um ciclo do-while? -→ Os elementos em Java -- [ ] while (condição) { … } -- [x] do { … } while (condição); -- [ ] for (;;) { … } -> No do-while a condição está no fim, por isso o corpo é executado pelo menos uma vez. - -? Em que se transforma uma Interrupção no código Java? -→ Os elementos em Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? O que acontece num ponto vermelho antes do número da linha? -→ Encontrar erros com o depurador -- [ ] A linha é ignorada. -- [x] O programa para antes dessa linha. -- [ ] A linha tem um erro. -> É um ponto de paragem. Continua-se com ▶︎ ou com Passo a passo. - -? Porque é que o mesmo ficheiro `.class` corre no Windows, no macOS e no Linux? -→ Como o Java corre em qualquer computador -- [ ] O compilador cria um ficheiro diferente para cada sistema operativo. -- [x] Em cada sistema operativo, uma JVM executa o mesmo bytecode. -- [ ] Os programas Java não precisam de sistema operativo. -> O bytecode fica igual. Só a JVM existe em separado para cada sistema. - -? De que precisas para escrever e compilar programas Java? -→ Como o Java corre em qualquer computador -- [ ] só do JRE -- [x] do JDK -- [ ] só da JVM -> O JRE chega para executar. O compilador `javac` só vem com o JDK. - -? Queres usar o teu programa no Windows e no Mac. O que é verdade? -→ Como o Java corre em qualquer computador -- [ ] O Java tem de ser compilado de novo para cada sistema, o C++ não. -- [x] O C++ tem de ser compilado de novo para cada sistema, o Java não. -- [ ] Os dois só se compilam uma vez. -> O C++ passa diretamente a código máquina para um sistema. O Java passa a bytecode, e é a JVM que o executa em cada sistema. - -? O número de linha 3 na área Código está vermelho. O que quer isso dizer? -→ Executar o programa -- [ ] Há um ponto de paragem na linha 3. -- [x] Há um erro na linha 3. -- [ ] A linha 3 é a próxima a ser executada. -> Um ponto de paragem é um ponto vermelho redondo, e a próxima linha está a amarelo. Um número de linha vermelho mostra um erro de sintaxe ou de execução. -::: diff --git a/web/lessons/pt/21-python-und-javascript.md b/web/lessons/pt/21-python-und-javascript.md deleted file mode 100644 index f07e8c4f..00000000 --- a/web/lessons/pt/21-python-und-javascript.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -titel: Python e JavaScript -bereich: Do estrutograma ao código -kurz: Gerar código Python e JavaScript a partir do estrutograma e executar JavaScript diretamente no navegador. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- escolher e comparar Python e JavaScript na vista de código -- explicar que o Python forma blocos pela indentação e não precisa de tipos de dados -- explicar o que o VisuStruct ajusta ao traduzir para Python -- executar JavaScript com Testar no navegador -::: - -## O mesmo diagrama, três linguagens - -Na vista de código ([Código](#zeige-code) nas ferramentas) escolhes a linguagem em cima. O estrutograma fica igual; só muda a forma de escrever. Assim podes comparar as linguagens facilmente. - -::: diagramm l18-beispiel.visustruct -Um número é diminuído em 3 uma e outra vez até deixar de ser maior do que 0. -::: - -## Python - -Para o diagrama de cima, o VisuStruct gera este código Python: - -``` -numero = int(input("Valor inicial?")) -while numero > 0: - print(numero) - numero = numero - 3 -print("Fim") -``` - -O que é diferente em Python em relação ao Java: - -- **Não há ponto e vírgula** nem **chavetas**. O Python reconhece o que pertence a um ciclo ou a uma decisão só pela **indentação**. Depois de `while`, `if` e `else` vêm dois pontos. -- As variáveis **não têm tipo de dados**: `int numero = 5` passa a `numero = 5`. -- A saída chama-se `print(…)`, a entrada `input(…)`. Para um número, fica `int(…)` à volta. -- Em Python, os arrays chamam-se **listas**: `int[] numeros = {2, 4, 6}` passa a `numeros = [2, 4, 6]`, e `numeros.length` passa a `len(numeros)`. -- Um ciclo for simples como `int i = 0`, `i < 5`, `i++` passa a `for i in range(5):`. - -## Cuidados com o Python - -Em alguns sítios, o Python é mais rigoroso do que o Java. Por isso, o VisuStruct traduz a forma de escrever do Java quando exporta: - -- **Texto e número com +:** `"Soma: " + soma` passa a `"Soma: " + str(soma)`. Sem `str(…)`, o Python para com um erro. -- **Não existe i++:** passa a `i += 1`. -- **&&, || e !** chamam-se `and`, `or` e `not` em Python, e `true` e `false` passam a `True` e `False`. -- **Divisão inteira:** Em Python, `7 / 2` dá sempre 3.5. Se o estrutograma dividir dois valores `int`, o VisuStruct escreve `7 // 2`, que dá 3, tal como em Java. -- **Ciclos for:** Os ciclos de contagem passam a `for … in range(…)`, também com `i <= n`, a contar para trás ou com passos como `i = i + 2`. Se um ciclo não encaixar nesse padrão, passa a ciclo `while`. -- **Não existe do-while:** passa a `while True:` com `if not (…): break` no fim. - -Se um diagrama estiver marcado como **pseudocódigo**, só aparece um aviso por cima do código. Nesse caso o texto é um esboço e não um programa executável. - -## JavaScript - -O mesmo diagrama em JavaScript: - -``` -"use strict"; - -let numero = parseInt((prompt("Valor inicial?") ?? "0"), 10); -while (numero > 0) { - console.log(numero); - numero = numero - 3; -} -console.log("Fim"); -``` - -O JavaScript parece-se com o Java: chavetas, ponto e vírgula, `while (…)` e `if (…)`. As diferenças: - -- As variáveis criam-se com `let`, sem tipo de dados. As constantes com `const`. -- A saída chama-se `console.log(…)`, a entrada `prompt(…)`. O `parseInt(…)` transforma a entrada num número inteiro. -- Os arrays ficam entre parênteses retos: `let numeros = [2, 4, 6];`. -- `"use strict";` mesmo lá em cima faz o JavaScript queixar-se de erros de escrita nos nomes das variáveis. -- O JavaScript só tem um tipo de número. Se o estrutograma dividir dois valores `int`, o VisuStruct escreve `Math.trunc(a / b)`. Assim desaparecem os algarismos depois da vírgula, tal como em Java. - -::: angeberwissen -O JavaScript não tem quase nada a ver com o Java. Brendan Eich criou-o em 1995 em apenas dez dias para o navegador Netscape. Primeiro chamava-se Mocha, depois LiveScript. Como toda a gente andava entusiasmada com o Java, pouco antes do lançamento mudaram-lhe o nome para JavaScript, por razões de publicidade. Desde então, as duas linguagens são constantemente confundidas. Os programadores dizem que o Java e o JavaScript têm tanto em comum como um carro e uma carpete. -::: - -## Executar JavaScript no navegador - -O JavaScript é a linguagem dos navegadores. Por isso o VisuStruct consegue **executar o código logo**: - -::: angeberwissen -Já agora, porque é que as ligações no navegador são azuis? Em 1985, a equipa de Ben Shneiderman testou que cor se vê bem mas não atrapalha a leitura. Ganhou o azul-claro. O vermelho destacava-se mais, mas as pessoas lembravam-se pior do texto a seguir. -::: - -1. Escolhe **JavaScript** na vista de código. -2. Clica em **Testar no navegador**. -3. O que o `console.log` mostra aparece em **Saída**. Se o programa pedir um valor com `prompt`, escreve-o e clica em **OK**. -4. **Parar** cancela o programa. - -O VisuStruct para sozinho um ciclo infinito `while (true)` depois de 100 000 iterações e indica **Execução interrompida: possível ciclo infinito.** - -> No código JavaScript, uma **Chamada** precisa de um subprograma com esse nome, senão o JavaScript indica um erro. Ao contrário da simulação, o navegador não procura nos outros separadores. - -## Exercício: Python como estrutograma - -Este programa Python mostra todos os números pares de 0 até um limite: - -``` -limite = int(input("Até que número?")) -for i in range(0, limite + 1, 2): - print(i) -``` - -`range(0, limite + 1, 2)` quer dizer: começar em 0, parar antes de `limite + 1`, contar de dois em dois. - -::: übung l18-python -titel: Números pares -bereich: beide -auftrag: Reconstrói o programa Python de cima como estrutograma com um ciclo for. Com o limite 7, mostra 0, 2, 4 e 6. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: `range(0, limite + 1, 2)` conta de 0 até ao limite de dois em dois. Isso é um ciclo for. -tipp: Os três campos do ciclo for são `int i = 0`, `i <= limite` e `i = i + 2`. -lösung: l18-python-loesung.visustruct -::: - -## Exercício: JavaScript como estrutograma - -``` -let idade = parseInt((prompt("Quantos anos tens?") ?? "0"), 10); -if (idade >= 18) { - console.log("Podes votar."); -} else { - let anos = 18 - idade; - console.log("Espera mais " + anos + " anos."); -} -``` - -::: übung l18-js -titel: Votar a partir dos 18 -bereich: beide -auftrag: Reconstrói o código JavaScript de cima como estrutograma. Depois testa na vista de código, com **JavaScript** e **Testar no navegador**, se o teu código mostra o mesmo que a simulação. -test: 12 -> Espera mais 6 anos. -test: 18 -> Podes votar. -test: 15 -> Espera mais 3 anos. -test: 40 -> Podes votar. -braucht: verzweigung -tipp: Lê o código linha a linha. `if` e `else` passam a uma decisão. -tipp: `prompt` e `parseInt` juntos são uma entrada: `input: int idade "Quantos anos tens?"`. O ramo false tem dois blocos: primeiro `int anos = 18 - idade`, depois a saída. -lösung: l18-js-loesung.visustruct -::: - -## Jogo: Que linguagem? - -::: spiel frage -titel: Jogo: Que linguagem? -intro: O Ludwig misturou linhas de três linguagens. Reconheces de onde vem cada uma? Oito rondas. -frage: Em que linguagem está isto escrito? -antworten: Java | Python | JavaScript - -runde: - print(numero) -richtig: Python -> Em Python, a saída chama-se `print(…)`, sem ponto e vírgula. - -runde: - console.log(numero); -richtig: JavaScript -> `console.log` é a saída em JavaScript. - -runde: - System.out.println(numero); -richtig: Java -> A saída comprida com `System.out` só existe em Java. - -runde: - let numeros = [2, 4, 6]; -richtig: JavaScript -> `let` e parênteses retos: um array em JavaScript. - -runde: - for i in range(5): -richtig: Python -> Dois pontos em vez de chavetas, e `range`: típico de Python. - -runde: - int[] numeros = {2, 4, 6}; -richtig: Java -> Só o Java escreve o tipo de dados `int[]` à frente. - -runde: - numero = int(input("Valor inicial?")) -richtig: Python -> Sem tipo de dados antes da variável, sem ponto e vírgula, e `int(…)` à volta da entrada. - -runde: - let numero = parseInt(prompt("Valor inicial?"), 10); -richtig: JavaScript -> `prompt` pede um valor no browser, `parseInt` transforma-o num número. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo escolher e comparar Python e JavaScript na vista de código. → O mesmo diagrama, três linguagens -- Consigo explicar que o Python forma blocos pela indentação e não precisa de tipos de dados. → Python -- Consigo explicar o que o VisuStruct ajusta ao traduzir para Python. → Cuidados com o Python -- Consigo executar JavaScript com Testar no navegador. → Executar JavaScript no navegador -::: - -## Teste de conhecimentos - -::: quiz -? Como reconhece o Python que linhas pertencem a um ciclo? -→ Python -- [ ] Pelas chavetas -- [x] Pela indentação -- [ ] Pelo ponto e vírgula no fim da linha - -? Como fica `output: soma` em JavaScript? -→ O mesmo diagrama, três linguagens -- [ ] print(soma) -- [ ] System.out.println(soma); -- [x] console.log(soma); - -? Que linguagem consegue o VisuStruct executar diretamente no navegador? -→ Executar JavaScript no navegador -- [ ] Java -- [ ] Python -- [x] JavaScript -> Qualquer navegador consegue executar JavaScript. Para Java e Python precisas de um programa próprio. - -? O que acontece em Python com `print("Soma: " + soma)` se soma for o número 7? -→ Cuidados com o Python -- [ ] É mostrado Soma: 7. -- [x] O Python indica um erro, porque texto e número não se podem juntar com +. -- [ ] É mostrado Soma:. -> str(soma) transforma o número em texto. -::: diff --git a/web/lessons/pt/22-try-und-catch.md b/web/lessons/pt/22-try-und-catch.md deleted file mode 100644 index 89d8352e..00000000 --- a/web/lessons/pt/22-try-und-catch.md +++ /dev/null @@ -1,293 +0,0 @@ ---- -titel: Quando o programa falha: try e catch -bereich: Apanhar erros -kurz: Ler mensagens de erro com Java verdadeiro e apanhar falhas com try e catch. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ligar o Java verdadeiro na área Código -- ler numa mensagem de erro a exceção e a linha -- apanhar uma exceção com try e catch -- transformar texto num número com Integer.parseInt e apanhar a NumberFormatException -- escrever um programa que divide em segurança, mesmo por 0 -::: - -## Falhou! - -Este programa deve escrever três notas. Escreve-o na área [Código](#zeige-codelive) e clica em [▶︎ Executar](#zeige-ausfuehren): - -```java -int[] notas = {2, 3, 1}; -System.out.println("Primeira nota: " + notas[0]); -System.out.println("Quarta nota: " + notas[3]); -System.out.println("Pronto!"); -``` - -A primeira nota aparece e depois acabou. O VisuStruct indica “Expressão inválida: notas[3]”, e “Pronto!” nunca chega a aparecer. O array só tem as posições 0, 1 e 2; a posição 3 não existe. - -::: ludwig -Já te aconteceu? Um pequeno erro e o programa inteiro vai-se. A mim aconteceu-me tantas vezes que cheguei a chorar em frente ao ecrã. Mas há uma solução, e chama-se **try** e **catch**. -::: - -::: angeberwissen -Em 1947, a equipa de Grace Hopper encontrou no computador Mark II da Universidade de Harvard uma traça que tinha causado uma avaria. Colaram-na no diário de bordo e escreveram: “First actual case of bug being found”. Desde então, os erros de programa chamam-se **bugs** (inglês para insetos). -::: - -## Ligar o Java verdadeiro - -Normalmente a área Código calcula com a mesma simulação que o estrutograma. Quando há um erro, ela simplesmente para. Para veres o que faz o Java verdadeiro, liga o Java verdadeiro: - -1. Clica na [roda dentada](#zeige-einstellungen) em cima à direita e escolhe Java como **Linguagem de programação**. -2. Na secção Java, marca **Java verdadeiro (com Swing)**. - -Na primeira execução, o VisuStruct descarrega uma única vez cerca de 40 MB. Depois disso, o teu código é compilado e executado como num ambiente de desenvolvimento Java a sério. - -> Com o Java verdadeiro, as entradas pela consola (`Scanner`) ainda não funcionam. Por isso os nossos exemplos não precisam de entradas. - -Escreve agora o programa como uma classe completa, para que os números das linhas batam certo, e executa-o: - -```java -public class Notas { - public static void main(String[] args) { - int[] notas = {2, 3, 1}; - System.out.println("Primeira nota: " + notas[0]); - System.out.println("Quarta nota: " + notas[3]); - System.out.println("Pronto!"); - } -} -``` - -Na [consola](#zeige-konsole) aparece agora: - -``` -Primeira nota: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Notas.main(Notas.java:5) -``` - -## Ler a mensagem de erro - -Uma mensagem destas assusta à primeira vista. Mas diz-te exatamente o que se passa: - -| Parte | Significado | -|---|---| -| `ArrayIndexOutOfBoundsException` | O tipo de erro: o índice está fora do array. | -| `3` | O índice errado. | -| `Notas.java:5` | A linha onde aconteceu: a linha 5. | - -O Java chama a um erro de execução destes uma **exceção** (em inglês *exception*). Diz-se: o Java *lança* uma exceção. Se ninguém a apanhar, o programa para. É por isso que “Pronto!” não aparece. - -::: ludwig -Lê as mensagens de erro sempre de cima: primeiro o nome da exceção, depois o número da linha. Na área Código, os números das linhas estão à esquerda do código. -::: - -## try e catch - -Com **try** e **catch** apanhas a exceção. Altera a linha com `notas[3]` assim: - -```java -try { - System.out.println("Quarta nota: " + notas[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Esta nota não existe."); -} -System.out.println("Pronto!"); -``` - -- `try` quer dizer “tenta”. O Java executa o bloco entre chavetas normalmente. -- Se uma linha lá dentro lançar uma exceção, o Java salta logo para o bloco `catch`. O resto do bloco `try` é saltado. -- Entre parênteses, depois de `catch`, está a exceção que é apanhada e um nome para ela, normalmente `e`. -- Depois, o programa continua normalmente. Agora também aparece “Pronto!”. - -Se tudo correr bem no bloco `try`, o bloco `catch` é simplesmente saltado. - -::: ludwig -try e catch são como a rede por baixo do trapézio no circo: enquanto tudo corre bem, nem dás por ela. Se alguém cair, a rede apanha-o e o espetáculo continua. -::: - -> No estrutograma não há nenhuma caixa para try e catch. Por isso o VisuStruct mostra o bloco inteiro como uma instrução. Só o podes executar com o Java verdadeiro. - -::: angeberwissen -Em julho de 1969, a Apollo 11 aterrou na Lua. Pouco antes da aterragem, o computador de bordo mostrou de repente os erros **1202** e **1201**: tinha mais trabalho do que conseguia fazer. Mesmo assim, não falhou. A equipa de **Margaret Hamilton** tinha construído o software de forma a reconhecer esses erros, deixar de lado as tarefas pouco importantes e continuar só com as mais importantes. A aterragem correu bem. - -Margaret Hamilton dirigia no MIT o grupo que escreveu o software das naves Apollo. Ela contava sempre com a possibilidade de algo correr mal, tal como tu fazes com `try` e `catch`. Para que o software fosse levado tão a sério como o hardware, chamou ao seu trabalho **software engineering** (engenharia de software). Hoje, uma área inteira da informática tem esse nome. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (nascida em 1936) em 1969, ao lado dos programas impressos que a sua equipa escreveu para a Apollo (foto: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), domínio público). -::: - -## Transformar texto num número - -Muitas vezes um número começa por ser texto, por exemplo mais tarde num campo de texto numa janela. `Integer.parseInt` transforma texto num número inteiro: - -```java -String entrada = "doze"; -try { - int numero = Integer.parseInt(entrada); - System.out.println("Dobro: " + numero * 2); -} catch (NumberFormatException e) { - System.out.println("Isto não é um número: " + entrada); -} -``` - -O Java não consegue converter “doze” e lança uma `NumberFormatException`. O programa escreve “Isto não é um número: doze”. Muda a primeira linha para `String entrada = "12";` e executa outra vez: agora aparece “Dobro: 24”. - -## As exceções são objetos - -Isto não está no programa da disciplina, mas é útil saber. - -::: angeberwissen -Cada exceção é um objeto de uma classe própria, por exemplo `ArithmeticException` para a divisão por 0. `e.getMessage()` dá-te a sua mensagem, por exemplo `/ by zero`. - -Depois de um `try` podem vir vários blocos `catch`, um para cada tipo de erro. `catch (Exception e)` apanha todas as exceções, mas diz-te menos sobre o que aconteceu. E um bloco `finally { … }` no fim corre sempre, quer tenha havido erro quer não. -::: - -## Jogo: A rede apanha? - -::: spiel frage -titel: Jogo: A rede apanha? -intro: O Ludwig anda no trapézio. O try e o catch apanham-no, ou o programa vai abaixo? Sete rondas. - -runde: - int[] notas = {2, 3, 1}; - System.out.println(notas[3]); - System.out.println("Pronto!"); -frage: O que acontece com Java a sério? -- Aparece 1 e Pronto! -- Só aparece Pronto! -- [x] O programa vai abaixo com uma ArrayIndexOutOfBoundsException. -> A posição 3 não existe. Ninguém apanha a exceção, por isso Pronto! nunca chega a aparecer. - -runde: - int[] notas = {2, 3, 1}; - try { - System.out.println(notas[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Esta nota não existe."); - } - System.out.println("Pronto!"); -frage: O que aparece? -- Pronto! -- [x] Esta nota não existe.\nPronto! -- Esta nota não existe. -> O bloco catch apanha a exceção, e depois o programa continua normalmente. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: O que aparece? -- A\nB\nC -- [x] A\nC -- C -> Em 10 / 0, o Java salta logo para o bloco catch. O resto do bloco try, o B, é saltado. - -runde: - String entrada = "12"; - try { - int numero = Integer.parseInt(entrada); - System.out.println("Dobro: " + numero * 2); - } catch (NumberFormatException e) { - System.out.println("Isto não é um número: " + entrada); - } -frage: O que aparece? -- [x] Dobro: 24 -- Isto não é um número: 12 -- Dobro: 1212 -> "12" pode ser convertido. Se tudo correr bem no bloco try, o catch é saltado. - -runde: -frage: Que exceção lança `Integer.parseInt("2.5")`? -- ArithmeticException -- [x] NumberFormatException -- nenhuma, o resultado é 2 -> parseInt só converte números inteiros. Com um ponto, o formato não é válido. - -runde: -frage: Que exceção lança `12 / 0` com `int`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Dividir por 0 não funciona com números inteiros. A mensagem é `/ by zero`. - -runde: - try { - int fatias = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Erro!"); - } - System.out.println("Pronto!"); -frage: O que acontece? -- Aparece Erro! e Pronto! -- Só aparece Pronto! -- [x] O programa vai abaixo. -> O catch só apanha a exceção que está entre parênteses. Uma ArithmeticException cai pela rede. -::: - -## Tarefa: dividir em segurança - -Este programa falha: - -```java -int bolo = 12; -int pessoas = 0; -System.out.println("Cada um recebe " + bolo / pessoas + " fatias."); -System.out.println("Bom apetite!"); -``` - -1. Executa-o com o Java verdadeiro e lê a mensagem de erro. Que exceção é? -2. Apanha-a com try e catch. Em vez da falha deve aparecer “Sem pessoas não se pode dividir.”, e “Bom apetite!” deve aparecer na mesma. -3. Põe `pessoas` a 4 e verifica que aparece “Cada um recebe 3 fatias.”. - -::: ludwig -A exceção chama-se `ArithmeticException`. Põe no bloco `try` só a linha que pode falhar. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ligar o Java verdadeiro na área Código. → Ligar o Java verdadeiro -- Consigo ler numa mensagem de erro a exceção e a linha. → Ler a mensagem de erro -- Consigo apanhar uma exceção com try e catch. → try e catch -- Consigo transformar texto num número com Integer.parseInt e apanhar a NumberFormatException. → Transformar texto num número -- Consigo escrever um programa que divide em segurança, mesmo por 0. → Tarefa: dividir em segurança -::: - -## Teste de conhecimentos - -::: quiz -? O que acontece quando uma exceção não é apanhada? -→ Ler a mensagem de erro -- [ ] O Java salta a linha e continua. -- [x] O programa para. -- [ ] O computador reinicia. -> É por isso que no primeiro exemplo “Pronto!” não aparece. - -? O que acontece no bloco try depois da linha que lança uma exceção? -→ try e catch -- [ ] As restantes linhas correm na mesma. -- [x] O resto é saltado e o Java salta para o bloco catch. -- [ ] O Java recomeça o bloco try. - -? Que exceção lança Integer.parseInt("doze")? -→ Transformar texto num número -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> “doze” não tem um formato de número que o Java entenda. - -? Associa cada exceção à sua causa. -→ Ler a mensagem de erro -= ArrayIndexOutOfBoundsException -> índice fora do array -= ArithmeticException -> divisão por 0 -= NumberFormatException -> o texto não é um número -::: diff --git a/web/lessons/pt/23-text-einlesen-und-speichern.md b/web/lessons/pt/23-text-einlesen-und-speichern.md deleted file mode 100644 index 8733244d..00000000 --- a/web/lessons/pt/23-text-einlesen-und-speichern.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -titel: Ler e guardar texto -bereich: Ficheiros -kurz: Ler um ficheiro de texto linha a linha com Scanner e guardar um ficheiro com PrintWriter. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar porque é que os programas guardam dados em ficheiros -- ler um ficheiro de texto linha a linha com Scanner, hasNextLine e nextLine -- explicar porque é que o Java exige try e catch ou throws com ficheiros -- escrever um ficheiro com PrintWriter e terminá-lo com close -- ler um ficheiro, completá-lo e voltar a guardá-lo numerado -::: - -## Porquê ficheiros? - -Tudo o que está em variáveis desaparece assim que o programa termina. Se um programa deve lembrar-se de alguma coisa, por exemplo uma pontuação, uma lista ou notas, guarda os dados num **ficheiro**. Na próxima vez que arranca, volta a ler o ficheiro. - -A Zora está livre, e o Ludwig está a preparar uma festa. A lista de compras dele está pronta no ficheiro `compras.txt`: - -::: datei compras.txt -Feno -Maçãs -Cenouras -Dentes-de-leão -::: - -Um ficheiro com a extensão `.txt` contém só texto, linha a linha. Podes abri-lo com qualquer editor, por exemplo o Bloco de Notas no Windows ou o TextEdit no Mac. - -## Ler um ficheiro com Scanner - -Já conheces o `Scanner`: `new Scanner(System.in)` lê do teclado. Se lhe deres um ficheiro em vez de `System.in`, ele lê do ficheiro: - -```java -import java.io.*; -import java.util.Scanner; - -Scanner ficheiro = new Scanner(new File("compras.txt")); -while (ficheiro.hasNextLine()) { - String linha = ficheiro.nextLine(); - System.out.println(linha); -} -ficheiro.close(); -``` - -| Método | Significado | -|---|---| -| `new File("compras.txt")` | o ficheiro com este nome | -| `hasNextLine()` | Ainda há mais uma linha? `true` ou `false` | -| `nextLine()` | devolve a linha seguinte e avança uma linha | -| `close()` | fecha o ficheiro quando terminas | - -O ciclo repete-se enquanto houver mais uma linha. Em cada volta, `nextLine()` vai buscar a linha seguinte. `File` pertence ao pacote `java.io`, por isso precisas de `import java.io.*;`. - -::: diagramm dt-lesen.visustruct -É assim que a leitura fica num estrutograma. Experimenta na simulação. -::: - -::: ludwig -Imagina o Scanner como um dedo a apontar para uma linha. `nextLine()` lê a linha debaixo do dedo e desce o dedo uma linha. Quando o dedo já está abaixo da última linha, `hasNextLine()` devolve `false`. -::: - -## E se o ficheiro não existir? - -Se o ficheiro não existir, o Java não o consegue ler e lança uma `FileNotFoundException`. O Java exige que o teu programa conte com isso. Ou apanhas a exceção com try e catch, como na lição 22: - -```java -try { - Scanner ficheiro = new Scanner(new File("compras.txt")); - // ... ler ... - ficheiro.close(); -} catch (FileNotFoundException e) { - System.out.println("Falta o ficheiro compras.txt!"); -} -``` - -Ou escreves `throws Exception` a seguir a `main`. Isso quer dizer: "Este método pode lançar uma exceção, eu não trato dela." Nesse caso, o programa para se o ficheiro não existir. - -```java -public static void main(String[] args) throws Exception { -``` - -> O VisuStruct escreve `throws Exception` a seguir a `main` automaticamente assim que o teu programa trabalha com ficheiros. Na simulação, o VisuStruct indica um ficheiro em falta com "Não existe nenhum ficheiro chamado …". - -## Exercício: Numerar a lista de compras - -::: übung l23-java-nummern -titel: Numerar a lista de compras -code: java -auftrag: Lê `compras.txt` linha a linha e mostra cada linha com o seu número: **1. Feno**, **2. Maçãs** e assim por diante. -start: l23-java-nummern-start.visustruct -test: - -> 1. Feno | 2. Maçãs | 3. Cenouras | 4. Dentes-de-leão -braucht: whileSchleife -tipp: Antes do ciclo, cria `int numero = 1;` e aumenta o número no fim de cada volta. -tipp: A saída é `System.out.println(numero + ". " + linha);` -lösung: l23-java-nummern-loesung.visustruct -::: - -## Escrever num ficheiro com PrintWriter - -Para escrever existe o `PrintWriter`. Os seus métodos têm os mesmos nomes que os de `System.out`: - -```java -PrintWriter saida = new PrintWriter("saudacao.txt"); -saida.println("Olá Zora!"); -saida.println("Até amanhã, Ludwig"); -saida.close(); -``` - -Depois disto, `saudacao.txt` contém: - -``` -Olá Zora! -Até amanhã, Ludwig -``` - -- `println` escreve o texto e começa depois uma nova linha, `print` escreve sem nova linha. -- Se o ficheiro já existir, é **substituído**. O conteúdo antigo desaparece. -- Depois da execução, o VisuStruct mostra por baixo da saída o que foi guardado no ficheiro. - -::: ludwig -Não te esqueças do `close()`! O PrintWriter junta primeiro o texto numa memória intermédia e só o escreve no ficheiro quando é fechado. Sem `close()` o ficheiro fica vazio. Já perdi assim uma história inteira. -::: - -## Exercício: Completar a lista de compras - -::: übung l23-java-ergaenzen -titel: Completar a lista de compras -code: java -auftrag: O Ludwig ainda precisa de bolo. Lê `compras.txt` e escreve cada linha no novo ficheiro `compras-nova.txt`. Depois acrescenta **Bolo** como última linha. No fim, mostra quantas linhas foram guardadas: **5 linhas guardadas**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 linhas guardadas -datei: compras-nova.txt -> Feno | Maçãs | Cenouras | Dentes-de-leão | Bolo -braucht: whileSchleife -tipp: No ciclo, lês uma linha com `ficheiro.nextLine()` e escreve-la logo a seguir com `saida.println(linha)`. -tipp: Depois do ciclo vem `saida.println("Bolo");`. Fecha os dois ficheiros com `close()`, senão `compras-nova.txt` fica vazio. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Jogo: O que fica no ficheiro? - -::: spiel frage -titel: Jogo: O que fica no ficheiro? -intro: O Ludwig escreve ficheiros com o PrintWriter. Lê o código e prevê o que fica no ficheiro. Seis rondas. -frage: O que fica depois no ficheiro? - -runde: - PrintWriter saida = new PrintWriter("saudacao.txt"); - saida.println("Olá"); - saida.println("Zora"); - saida.close(); -- [x] Olá\nZora -- OláZora -- Zora -> `println` começa uma nova linha depois de cada texto. - -runde: - PrintWriter saida = new PrintWriter("palavra.txt"); - saida.print("Bo"); - saida.print("la"); - saida.println("!"); - saida.close(); -- Bo\nla\n! -- [x] Bola! -- Bo la ! -> `print` continua a escrever sem nova linha, por isso as partes ficam coladas. - -runde: - PrintWriter saida = new PrintWriter("segredo.txt"); - saida.println("O tesouro está na torre"); -- O tesouro está na torre -- [x] Nada, o ficheiro fica vazio. -- O Java indica um erro. -> Sem `close()` o texto nunca chega ao ficheiro. Fica na memória intermédia. - -runde: - // Antes, nota.txt contém: Antigo - PrintWriter saida = new PrintWriter("nota.txt"); - saida.println("Novo"); - saida.close(); -- Antigo\nNovo -- [x] Novo -- Novo\nAntigo -> Um novo PrintWriter substitui o ficheiro. O conteúdo antigo desaparece. - -runde: - PrintWriter saida = new PrintWriter("numeros.txt"); - for (int i = 1; i <= 3; i++) { - saida.println(i * 2); - } - saida.close(); -- 1\n2\n3 -- 246 -- [x] 2\n4\n6 -> O ciclo escreve 2, 4 e 6, cada número na sua linha. - -runde: - // compras.txt contém: Feno, Maçãs (uma por linha) - Scanner ficheiro = new Scanner(new File("compras.txt")); - PrintWriter saida = new PrintWriter("grande.txt"); - while (ficheiro.hasNextLine()) { - saida.println(ficheiro.nextLine().toUpperCase()); - } - ficheiro.close(); - saida.close(); -- Feno\nMaçãs -- [x] FENO\nMAÇÃS -- FENOMAÇÃS -> Cada linha é lida, passada para maiúsculas e escrita na sua própria linha. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar porque é que os programas guardam dados em ficheiros. → Porquê ficheiros? -- Consigo ler um ficheiro de texto linha a linha com Scanner, hasNextLine e nextLine. → Ler um ficheiro com Scanner -- Consigo explicar porque é que o Java exige try e catch ou throws com ficheiros. → E se o ficheiro não existir? -- Consigo escrever um ficheiro com PrintWriter e terminá-lo com close(). → Escrever num ficheiro com PrintWriter -- Consigo ler um ficheiro, completá-lo e voltar a guardá-lo numerado. → Exercício: Completar a lista de compras -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve hasNextLine()? -→ Ler um ficheiro com Scanner -- [ ] a linha seguinte -- [x] true se ainda houver uma linha, senão false -- [ ] o número de linhas -> Com hasNextLine() o ciclo verifica se continua. - -? O que acontece se chamares new PrintWriter("lista.txt") para um ficheiro que já existe? -→ Escrever num ficheiro com PrintWriter -- [ ] O texto novo é acrescentado no fim. -- [x] O ficheiro é substituído. -- [ ] O Java indica um erro. - -? Porque é que um ficheiro fica vazio, apesar de println ter sido chamado? -→ Escrever num ficheiro com PrintWriter -- [ ] Porque println só escreve na consola. -- [x] Porque falta o close(). -- [ ] Porque o nome do ficheiro termina em .txt. -> Só o close() escreve a memória intermédia no ficheiro. - -? Liga cada método à sua tarefa. -→ Ler um ficheiro com Scanner -= nextLine() -> lê a linha seguinte -= println(texto) -> escreve uma linha -= close() -> fecha o ficheiro -::: diff --git a/web/lessons/pt/24-zeile-fuer-zeile.md b/web/lessons/pt/24-zeile-fuer-zeile.md deleted file mode 100644 index 976eae23..00000000 --- a/web/lessons/pt/24-zeile-fuer-zeile.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -titel: Linha a linha com BufferedReader -bereich: Ficheiros -kurz: Ler com BufferedReader e readLine até chegar null, e ler um ficheiro inteiro de uma vez com Files. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ler um ficheiro com BufferedReader e readLine -- reconhecer o fim de um ficheiro, porque readLine aí devolve null -- contar quantas vezes uma palavra aparece num ficheiro -- ler um ficheiro inteiro com Files.readString e dividi-lo em linhas com split -- encontrar a entrada mais longa de um ficheiro -::: - -## O bolo desapareceu! - -Na manhã a seguir à festa, o bolo do Ludwig desapareceu. Felizmente, o castelo tem um diário. Cada linha começa com o dia e a hora: - -::: datei diario.txt -Seg 08:15 Ludwig alimenta as cabras -Seg 12:30 Zora lê na torre -Seg 18:00 Raposa passa às escondidas pelo portão -Ter 09:00 Ludwig faz um bolo -Ter 14:45 Lebre traz cenouras -Ter 16:20 Raposa pergunta pela receita -Ter 23:55 O bolo desapareceu -Qua 07:00 Zora encontra migalhas junto à toca da Raposa -::: - -Já o conseguias ler com o Scanner da lição 23. Mas, para ficheiros, os profissionais usam muitas vezes o **BufferedReader**. - -## Ler com BufferedReader - -```java -import java.io.*; - -BufferedReader leitor = new BufferedReader(new FileReader("diario.txt")); -String linha = leitor.readLine(); -while (linha != null) { - System.out.println(linha); - linha = leitor.readLine(); -} -leitor.close(); -``` - -- `new FileReader("diario.txt")` abre o ficheiro, e `new BufferedReader(…)` põe-lhe uma memória intermédia à volta. Vai buscar o ficheiro em pedaços grandes e por isso é mais rápido com ficheiros longos. -- `readLine()` devolve a linha seguinte. Quando já não há linhas, devolve **null**. -- Por isso, o ciclo repete-se enquanto `linha != null`. No fim de cada volta lê a linha seguinte. - -::: diagramm dt-buffered.visustruct -Primeiro ler uma linha, depois verificar, e no fim da volta ler a seguinte. -::: - -**null** quer dizer "nada". Não é o texto vazio `""`, mas nenhum texto. Uma variável com `null` não tem métodos: `linha.length()` para então com uma `NullPointerException`. Por isso, verifica sempre primeiro `linha != null`. - -| | Scanner | BufferedReader | -|---|---|---| -| Criar | `new Scanner(new File(…))` | `new BufferedReader(new FileReader(…))` | -| Ainda há mais uma linha? | `hasNextLine()` | `readLine()` devolve `null` | -| Linha seguinte | `nextLine()` | `readLine()` | -| Ponto forte | também lê números (`nextInt()`) | rápido, mesmo com ficheiros grandes | - -::: ludwig -O ciclo é diferente do ciclo com o Scanner: a primeira linha é lida **antes** do ciclo, e cada uma das seguintes **no fim** da volta. Se te esqueceres da leitura no fim, o programa lê sempre a mesma linha e nunca para. -::: - -::: angeberwissen -O fim de uma linha não é igual em todo o lado: o Windows escreve dois carateres invisíveis, “retorno do carro” e “avanço de linha”, o Linux e o macOS só o avanço de linha. Os nomes vêm da máquina de escrever, em que o carro voltava atrás e o papel subia uma linha. O `readLine()` funciona com os dois. -::: - -## Exercício: Quantas vezes aparece a Raposa? - -::: übung l24-java-fuchs -titel: Quantas vezes aparece a Raposa? -code: java -auftrag: Lê o diário com o BufferedReader e conta as linhas onde aparece **Raposa**. No fim, mostra **Raposa:** e o número. -start: l24-java-fuchs-start.visustruct -test: - -> Raposa: 3 -braucht: whileSchleife, verzweigung -tipp: Antes do ciclo, cria `int quantidade = 0;`. No ciclo verificas `linha.contains("Raposa")`. -tipp: O `linha = leitor.readLine();` fica no fim do ciclo, depois do if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Fechar automaticamente - -Para que o `close()` não seja esquecido, mesmo depois de uma exceção, existe uma forma curta do try: o que é criado entre os parênteses a seguir a `try` é fechado pelo Java sozinho no fim. - -```java -try (BufferedReader leitor = new BufferedReader(new FileReader("diario.txt"))) { - String linha = leitor.readLine(); - while (linha != null) { - System.out.println(linha); - linha = leitor.readLine(); - } -} catch (IOException e) { - System.out.println("Falta o diário."); -} -``` - -Isto chama-se **try-with-resources**. `IOException` apanha todos os erros ao ler e escrever, incluindo um ficheiro em falta. - -> Tal como try e catch, o try-with-resources só funciona com Java verdadeiro (lição 22). Na simulação, escreves tu o `close()`. - -## O atalho: Files - -Desde o Java 11 é ainda mais curto. `Files.readString` lê o ficheiro inteiro de uma vez, como já conheces da lição 17. Com `split("\n")` divides o texto num array de linhas: - -```java -import java.nio.file.*; - -String texto = Files.readString(Path.of("diario.txt")); -String[] linhas = texto.split("\n"); -for (int i = 0; i < linhas.length; i++) { - System.out.println(linhas[i]); -} -``` - -Agora todas as linhas estão no array. Podes vê-las pela ordem que quiseres, por exemplo de trás para a frente ou só uma sim, uma não. - -| Forma | Boa para | -|---|---| -| `Scanner` | ficheiros pequenos, ler números e palavras | -| `BufferedReader` | ficheiros grandes, linha a linha | -| `Files.readString` | ficheiros pequenos que cabem inteiros no programa | - -::: ludwig -Um ficheiro com um milhão de linhas é melhor lido linha a linha com o BufferedReader. Com `Files.readString`, o ficheiro inteiro teria de ir de uma vez para a memória. -::: - -## Exercício: A entrada mais longa - -::: übung l24-java-laengster -titel: A entrada mais longa -code: java -auftrag: No código inicial, as linhas do diário já estão no array `linhas`. Encontra a linha mais longa e mostra-a assim: **Entrada mais longa:** seguido da linha. -start: l24-java-laengster-start.visustruct -test: - -> Entrada mais longa: Qua 07:00 Zora encontra migalhas junto à toca da Raposa -braucht: forSchleife, verzweigung -tipp: Guarda a linha mais longa até agora em `String maisLonga = linhas[0];` e percorre as outras linhas com um ciclo for. -tipp: Se `linhas[i].length() > maisLonga.length()`, então `linhas[i]` passa a ser a mais longa. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Jogo: Detetive de ficheiros - -::: spiel frage -titel: Jogo: Detetive de ficheiros -intro: Quem levou o bolo? Cada programa procura no **diário** a partir do início. Prevê o que mostra e junta as pistas. Cinco rondas. -frage: O que mostra o programa? - -runde: - String linha = leitor.readLine(); - linha = leitor.readLine(); - System.out.println(linha.substring(10)); -- Ludwig alimenta as cabras -- [x] Zora lê na torre -- Seg 12:30 Zora lê na torre -> O segundo `readLine()` devolve a segunda linha. O texto depois da hora começa no índice 10. - -runde: - int n = 0; - String linha = leitor.readLine(); - while (linha != null) { - if (linha.startsWith("Ter")) n++; - linha = leitor.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Quatro entradas são de terça-feira. - -runde: - String linha = leitor.readLine(); - while (linha != null) { - if (linha.contains("bolo")) { - System.out.println(linha.substring(4, 9)); - } - linha = leitor.readLine(); - } -- [x] 09:00\n23:55 -- 09:00 -- Ter\nTer -> Há duas linhas com "bolo". `substring(4, 9)` recorta a hora. - -runde: - String linha = leitor.readLine(); - String ultima = ""; - while (linha != null) { - if (linha.contains("Raposa")) ultima = linha; - linha = leitor.readLine(); - } - System.out.println(ultima); -- Ter 16:20 Raposa pergunta pela receita -- [x] Qua 07:00 Zora encontra migalhas junto à toca da Raposa -- Seg 18:00 Raposa passa às escondidas pelo portão -> `ultima` é substituída a cada resultado. No fim fica lá o último. "toca da Raposa" também contém "Raposa". - -runde: - String linha = leitor.readLine(); - while (linha != null) { - if (linha.contains("migalhas")) { - int junto = linha.indexOf("junto à "); - System.out.println(linha.substring(junto + 8)); - } - linha = leitor.readLine(); - } -- [x] toca da Raposa -- junto à toca da Raposa -- migalhas -> As migalhas estão junto à toca da Raposa. A Raposa perguntou pela receita, e às 23:55 o bolo tinha desaparecido. Caso resolvido! -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ler um ficheiro com BufferedReader e readLine. → Ler com BufferedReader -- Consigo reconhecer o fim de um ficheiro, porque readLine aí devolve null (linha != null). → Ler com BufferedReader -- Consigo contar quantas vezes uma palavra aparece num ficheiro. → Exercício: Quantas vezes aparece a Raposa? -- Consigo ler um ficheiro inteiro com Files.readString e dividi-lo em linhas com split. → O atalho: Files -- Consigo encontrar a entrada mais longa de um ficheiro. → Exercício: A entrada mais longa -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve readLine() quando o ficheiro chegou ao fim? -→ Ler com BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null quer dizer: já não há mais texto. - -? Porque é que no fim do ciclo há outra vez linha = leitor.readLine()? -→ Ler com BufferedReader -- [ ] Para fechar o ficheiro. -- [x] Senão linha fica sempre igual e o ciclo nunca para. -- [ ] Para mostrar a primeira linha duas vezes. - -? O que faz o try-with-resources? -→ Ler com BufferedReader -- [ ] Lê o ficheiro mais depressa. -- [x] Fecha o ficheiro sozinho no fim. -- [ ] Impede qualquer exceção. - -? Liga cada forma àquilo para que é boa. -→ O atalho: Files -= BufferedReader -> ficheiros grandes, linha a linha -= Files.readString -> ficheiros pequenos de uma vez -= Scanner -> ler números e palavras -::: diff --git a/web/lessons/pt/25-tabellen-als-csv.md b/web/lessons/pt/25-tabellen-als-csv.md deleted file mode 100644 index 40a6bb69..00000000 --- a/web/lessons/pt/25-tabellen-als-csv.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -titel: Tabelas em CSV -bereich: Ficheiros -kurz: Ler uma tabela num ficheiro CSV, dividir cada linha com split e fazer contas com os números. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar como é feito um ficheiro CSV: cabeçalho, registos, separador -- dividir uma linha com split e fazer dela um número com Integer.parseInt -- saltar o cabeçalho antes de fazer contas -- calcular uma média a partir de uma coluna de um ficheiro CSV -- encontrar o melhor valor numa coluna de um ficheiro CSV -- nomear um ponto forte e um ponto fraco do CSV -::: - -## Uma tabela num ficheiro de texto - -A professora Cabra, da escola do castelo, guardou as notas da turma numa tabela. Como na Alemanha, 1 é a melhor nota e 6 a pior: - -| Nome | Matemática | Alemão | Inglês | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Raposa | 4 | 3 | 5 | -| Lebre | 2 | 1 | 3 | - -No ficheiro, a tabela fica assim: - -::: datei turma.csv -Nome;Matemática;Alemão;Inglês -Ludwig;2;3;1 -Zora;1;2;2 -Raposa;4;3;5 -Lebre;2;1;3 -::: - -Isto é um **ficheiro CSV**. CSV quer dizer "Comma-Separated Values", ou seja, "valores separados por vírgulas". Cada linha é uma linha da tabela, e as colunas estão separadas por um carácter separador. Em Portugal e na Alemanha usa-se normalmente o **ponto e vírgula** `;`, porque a vírgula já aparece em números como `2,5`. - -- A primeira linha é o **cabeçalho**. Diz o que está em cada coluna. -- Cada uma das linhas seguintes é um **registo**, aqui um aluno ou uma aluna. -- O Excel, o LibreOffice e o Numbers abrem ficheiros CSV diretamente como tabela. - -## Dividir uma linha com split - -Já conheces o `split(";")` da lição 17. Divide um texto em cada ponto e vírgula e devolve um array: - -```java -String linha = "Zora;1;2;2"; -String[] partes = linha.split(";"); -// partes[0] é "Zora", partes[1] é "1", partes[2] é "2", partes[3] é "2" -``` - -Depois disto, as notas ainda são **texto**. Só podes fazer contas com elas depois de as transformares num número com `Integer.parseInt`: - -```java -int matematica = Integer.parseInt(partes[1]); -``` - -::: diagramm dt-csv.visustruct -Dividir uma linha CSV e ler a nota de Matemática como número. -::: - -## Ler o ficheiro inteiro - -Para o ficheiro inteiro, combinas o BufferedReader da lição 24 com `split`. O cabeçalho não tem notas, por isso lês essa linha antes do ciclo e saltas por cima dela: - -```java -BufferedReader leitor = new BufferedReader(new FileReader("turma.csv")); -String linha = leitor.readLine(); // cabeçalho -linha = leitor.readLine(); // primeiro registo -while (linha != null) { - String[] partes = linha.split(";"); - System.out.println(partes[0] + ": Matemática " + partes[1]); - linha = leitor.readLine(); -} -leitor.close(); -``` - -::: ludwig -Sem o segundo `readLine()` antes do ciclo, o cabeçalho vai parar ao ciclo. Aí, `Integer.parseInt("Matemática")` tenta fazer um número a partir da palavra, e o Java para com uma `NumberFormatException`. -::: - -## Exercício: Média de Matemática - -::: übung l25-java-schnitt -titel: Média de Matemática -code: java -auftrag: Calcula a média das notas de Matemática. Salta o cabeçalho, soma as notas de Matemática (coluna 1) e divide pelo número de registos. Mostra **Média de Matemática:** e a média. -start: l25-java-schnitt-start.visustruct -test: - -> Média de Matemática: 2.25 -braucht: whileSchleife -tipp: Antes do ciclo, cria `double soma = 0;` e `int quantidade = 0;`. Com `double`, nada é cortado na divisão. -tipp: No ciclo: `String[] partes = linha.split(";");`, depois `soma = soma + Integer.parseInt(partes[1]);` e `quantidade++;`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Exercício: Melhor nota a Inglês - -::: übung l25-java-beste -titel: Melhor nota a Inglês -code: java -auftrag: Quem tem a melhor nota a Inglês (coluna 3)? Mostra **Melhor nota a Inglês:**, o nome e, entre parênteses, a nota. -start: l25-java-beste-start.visustruct -test: - -> Melhor nota a Inglês: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Guarda a melhor nota até agora em `int melhorNota = 7;` e o nome em `String melhorNome = "";`. Qualquer nota verdadeira é melhor do que 7. -tipp: Se `nota < melhorNota`, guardas a nova nota e `partes[0]` como nome. -lösung: l25-java-beste-loesung.visustruct -::: - -## Pontos fortes e fracos do CSV - -| Bom | Difícil | -|---|---| -| As tabelas ocupam pouco espaço. | Se o separador aparecer no texto, por exemplo `Lebre;muito bem; esforçada`, a linha parte-se em partes a mais. | -| O Excel e outros programas abrem o ficheiro diretamente. | Tudo é uma tabela plana. Se um animal tiver várias comidas preferidas, isso não cabe bem numa célula. | -| Qualquer programa o consegue ler com `split`. | O ficheiro não diz se `1` é um número ou um texto. | - -::: ludwig -O Excel guarda ficheiros CSV com ponto e vírgula em Portugal e na Alemanha, mas com vírgula em Inglaterra e nos EUA. Por isso, quem abre um ficheiro de outro país às vezes vê tudo numa única coluna. -::: - -## Jogo: Linha estragada - -::: spiel bombe -titel: Jogo: Linha estragada -intro: Em cada ficheiro CSV há **exatamente uma linha estragada**, e a bomba está a contar. Compara cada linha com o cabeçalho e toca na linha estragada antes que o tempo acabe. Cinco rondas, 20 segundos cada. -zeit: 20 -daten: csv - -runde: - Nome;Matemática;Alemão;Inglês - Ludwig;2;3;1 - Zora;1 - Raposa;4;3;5 -frage: Cada linha precisa de quatro colunas. -fehler: 3 -besser: Zora;1;2;2 -> Faltam duas notas à Zora. Então `partes[3]` não existe, e o Java para com uma `ArrayIndexOutOfBoundsException`. - -runde: - Nome;Nota;Comentário - Ludwig;2;trabalha bem em equipa - Lebre;1;muito bem; esforçada - Zora;1;lê muito -frage: Cada linha precisa de três colunas. -fehler: 3 -besser: Lebre;1;muito bem, esforçada -> O ponto e vírgula no comentário separa uma quarta coluna. O separador não pode aparecer no texto. - -runde: - Nome;Matemática;Alemão;Inglês - Ludwig;2;3;1 - Zora;1;2;2 - Raposa,4,3,5 -frage: O separador é o ponto e vírgula. -fehler: 4 -besser: Raposa;4;3;5 -> Aqui há vírgulas em vez de pontos e vírgulas. `split(";")` não encontra nenhum ponto e vírgula e devolve a linha inteira como uma única parte. - -runde: - Nome;Matemática;Alemão;Inglês - Lebre;2;1;3 - Raposa;quatro;3;5 - Ludwig;2;3;1 -frage: As notas são números. -fehler: 3 -besser: Raposa;4;3;5 -> `Integer.parseInt("quatro")` não consegue fazer um número a partir da palavra e lança uma `NumberFormatException`. - -runde: - Nome;Matemática;Alemão;Inglês - Zora;1;2;2 - Lebre;2;1;3 - Ludwig;2;;1 -frage: Nenhum campo pode estar vazio. -fehler: 4 -besser: Ludwig;2;3;1 -> Entre os dois pontos e vírgulas não há nada. `Integer.parseInt("")` lança uma `NumberFormatException`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar como é feito um ficheiro CSV: cabeçalho, registos, separador. → Uma tabela num ficheiro de texto -- Consigo dividir uma linha com split e fazer dela um número com Integer.parseInt. → Dividir uma linha com split -- Consigo saltar o cabeçalho antes de fazer contas. → Ler o ficheiro inteiro -- Consigo calcular uma média a partir de uma coluna de um ficheiro CSV. → Exercício: Média de Matemática -- Consigo encontrar o melhor valor numa coluna de um ficheiro CSV. → Exercício: Melhor nota a Inglês -- Consigo nomear um ponto forte e um ponto fraco do CSV. → Pontos fortes e fracos do CSV -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve "Lebre;2;1;3".split(";")[2]? -→ Dividir uma linha com split -- [ ] "2" -- [x] "1" -- [ ] 1 -> A contagem começa em 0. E o resultado é um texto, não um número. - -? Porque é que o programa chama readLine() duas vezes antes do ciclo? -→ Ler o ficheiro inteiro -- [ ] Para ler o ficheiro mais depressa. -- [x] A primeira linha é o cabeçalho, sem notas. É saltada. -- [ ] Porque readLine precisa sempre de duas linhas. - -? O que acontece com Integer.parseInt("Matemática")? -→ Dividir uma linha com split -- [ ] Devolve 0. -- [x] O Java lança uma NumberFormatException. -- [ ] Devolve o comprimento da palavra. - -? Liga. -→ Pontos fortes e fracos do CSV -= cabeçalho -> diz o que está nas colunas -= registo -> uma linha com valores -= separador -> separa as colunas, muitas vezes ; -::: diff --git a/web/lessons/pt/26-json.md b/web/lessons/pt/26-json.md deleted file mode 100644 index 8517db4f..00000000 --- a/web/lessons/pt/26-json.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -titel: Dados em JSON -bereich: Ficheiros -kurz: Perceber ficheiros JSON, tirar valores com indexOf e substring e escrever JSON tu mesmo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- reconhecer objetos, chaves, valores e listas em JSON -- tirar um valor de uma linha JSON com indexOf e substring -- mostrar todos os valores de uma chave de um ficheiro JSON -- construir e guardar uma entrada JSON com + e \" -- guardar dados num ficheiro JSON -- nomear um ponto forte e um ponto fraco do JSON -::: - -## Dados com nomes - -O zoo do castelo guarda os seus animais num ficheiro `zoo.json`: - -::: datei zoo.json -{ - "zoo": "Zoo do Castelo", - "animais": [ - {"nome": "Ludwig", "especie": "bode", "idade": 7}, - {"nome": "Zora", "especie": "cabra", "idade": 6}, - {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4}, - {"nome": "Lebre", "especie": "lebre", "idade": 2} - ] -} -::: - -Isto é **JSON**, a "JavaScript Object Notation". Quase todas as aplicações web e todos os jogos enviam e guardam dados assim. Ao contrário de um ficheiro CSV, antes de cada valor está o seu **nome**, a **chave**. - -| Carácter | Significado | Exemplo | -|---|---|---| -| `{ … }` | um **objeto**: pares de chave e valor | `{"nome": "Zora", "idade": 6}` | -| `"chave": valor` | um par, separado por dois pontos | `"idade": 6` | -| `[ … ]` | uma **lista** de valores, como um array | `"animais": [ … ]` | -| `,` | separa os pares e as entradas de uma lista | | -| `"…"` | um texto. Números e `true`/`false` ficam sem aspas. | `"cabra"`, `6` | - -Objetos e listas podem ser **encaixados** uns nos outros: o objeto do zoo contém a lista `animais`, e cada animal é outra vez um objeto. Tal como nos arrays, a lista conta a partir de 0: `animais[1].nome` é `"Zora"`. - -::: angeberwissen -Foi Douglas Crockford quem tornou o JSON conhecido no início dos anos 2000. Na licença do seu programa de JSON escreveu: “O software deve ser usado para o Bem, não para o Mal.” Por isso, a empresa IBM perguntou se o podia usar na mesma. Ele respondeu que a IBM e os seus clientes também o podiam usar para o Mal. -::: - -## Tirar um valor - -Os profissionais leem JSON com uma biblioteca, por exemplo o **Gson**. Ela não faz parte do Java e tem de ser adicionada primeiro. Para o nosso ficheiro do zoo chegam os métodos de String da lição 17, porque cada animal está na sua própria linha. - -Em Java, escreves umas aspas dentro de um texto como `\"`. Assim, o texto `"\"nome\": \""` é `"nome": "`, exatamente o que está antes de cada nome. - -```java -String linha = "{\"nome\": \"Zora\", \"especie\": \"cabra\", \"idade\": 6},"; -int inicio = linha.indexOf("\"nome\": \"") + 9; -int fim = linha.indexOf("\"", inicio); -String nome = linha.substring(inicio, fim); -``` - -- `indexOf("\"nome\": \"")` encontra o início de `"nome": "`. São 9 caracteres, por isso o nome começa 9 caracteres mais à frente. -- `indexOf("\"", inicio)` procura as aspas seguintes **a partir de** `inicio`. É aí que o nome acaba. -- `substring(inicio, fim)` recorta o nome: `Zora`. - -::: diagramm dt-json.visustruct -Tirar o nome de uma linha JSON. -::: - -## Exercício: Todos os nomes do zoo - -::: übung l26-java-namen -titel: Todos os nomes do zoo -code: java -auftrag: Lê `zoo.json` linha a linha. Em cada linha que contém `"nome"`, mostra só o nome. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Raposa | Lebre -braucht: whileSchleife, verzweigung -tipp: Verifica com `linha.contains("\"nome\"")` se há um nome na linha. As outras linhas são saltadas. -tipp: Dentro do if: `int inicio = linha.indexOf("\"nome\": \"") + 9;`, depois `int fim = linha.indexOf("\"", inicio);` e `System.out.println(linha.substring(inicio, fim));`. -lösung: l26-java-namen-loesung.visustruct -::: - -## Escrever JSON - -Para escrever, juntas o texto com `+` e escreves-o no ficheiro com o PrintWriter da lição 23. Os textos em JSON precisam de aspas, portanto `\"` no texto Java, os números não: - -```java -String nome = "Zora"; -int pontos = 15; -String entrada = "{\"nome\": \"" + nome + "\", \"pontos\": " + pontos + "}"; -// entrada é {"nome": "Zora", "pontos": 15} -``` - -Numa lista há uma vírgula entre as entradas, mas **nenhuma** depois da última. Isso verificas com um if. - -::: ludwig -Umas aspas esquecidas ou uma vírgula a mais, e nenhum programa consegue ler o ficheiro. O JSON é rigoroso. Por isso, os profissionais também usam uma biblioteca para escrever. -::: - -## Exercício: Guardar pontos em JSON - -::: übung l26-java-schreiben -titel: Guardar pontos em JSON -code: java -auftrag: Guarda os pontos do torneio de perguntas como lista em `pontos.json`. Cada linha contém um objeto com **nome** e **pontos**, e entre os objetos há uma vírgula. No fim, mostra **3 entradas guardadas**. -start: l26-java-schreiben-start.visustruct -test: - -> 3 entradas guardadas -datei: pontos.json -> [ | {"nome": "Ludwig", "pontos": 12}, | {"nome": "Zora", "pontos": 15}, | {"nome": "Raposa", "pontos": 9} | ] -braucht: forSchleife, verzweigung -tipp: Percorre os arrays com `for (int i = 0; i < nomes.length; i++)`. Constrói a entrada com `" {\"nome\": \"" + nomes[i] + "\", \"pontos\": " + pontos[i] + "}"`. -tipp: Se `i < nomes.length - 1`, acrescentas ainda `","`. Depois do ciclo, escreve `"]"` e fecha o ficheiro. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Pontos fortes e fracos do JSON - -| Bom | Difícil | -|---|---| -| Cada valor tem um nome. Vê-se logo o que `6` quer dizer. | O ficheiro é mais longo do que um CSV, porque as chaves aparecem em todas as linhas. | -| Os dados podem ser encaixados, por exemplo uma lista dentro de um objeto. | O Java não lê JSON sozinho. É precisa uma biblioteca como o Gson. | -| O JSON é o padrão na web. Quase todas as linguagens de programação o conhecem. | Um carácter a mais ou a menos torna o ficheiro inteiro ilegível. | - -## Jogo: Qual é a chave? - -::: spiel frage -titel: Jogo: Qual é a chave? -intro: O Ludwig procura valores em ficheiros JSON. Lê o ficheiro e diz qual é o valor pedido. Cinco rondas. - -runde: - {"nome": "Zora", "especie": "cabra", "idade": 6} -frage: Qual é o valor de **idade**? -- "idade" -- [x] 6 -- "cabra" -> Antes dos dois pontos está a chave, depois está o valor. Os números ficam sem aspas. - -runde: - { - "animais": [ - {"nome": "Ludwig", "idade": 7}, - {"nome": "Zora", "idade": 6}, - {"nome": "Raposa", "idade": 4} - ] - } -frage: O que é **animais[1].nome**? -- Ludwig -- [x] Zora -- Raposa -> A lista conta a partir de 0, como um array. `animais[1]` é o segundo animal. - -runde: - { - "zoo": "Zoo do Castelo", - "chefe": {"nome": "Ludwig", "especie": "bode"} - } -frage: Como chegas a **bode**? -- [x] chefe.especie -- especie -- zoo.chefe.especie -> `especie` está dentro do objeto `chefe`. Por isso o caminho passa por `chefe`. - -runde: - { - "nome": "Lebre", - "comidaPreferida": ["cenouras", "trevo", "dentes-de-leão"] - } -frage: O que é **comidaPreferida[2]**? -- trevo -- cenouras -- [x] dentes-de-leão -> O índice 0 é cenouras, o 1 é trevo e o 2 é dentes-de-leão. Algo assim dificilmente cabe numa célula em CSV. - -runde: - {"nome": "Raposa", "idade": 4, "comFome": true} -frage: Que chave tem um valor lógico? -- nome -- idade -- [x] comFome -> `true` e `false` ficam sem aspas, como os números. Em Java isto seria um `boolean`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo reconhecer objetos, chaves, valores e listas em JSON. → Dados com nomes -- Consigo tirar um valor de uma linha JSON com indexOf e substring. → Tirar um valor -- Consigo mostrar todos os valores de uma chave de um ficheiro JSON. → Exercício: Todos os nomes do zoo -- Consigo construir e guardar uma entrada JSON com + e \". → Escrever JSON -- Consigo guardar dados num ficheiro JSON. → Exercício: Guardar pontos em JSON -- Consigo nomear um ponto forte e um ponto fraco do JSON. → Pontos fortes e fracos do JSON -::: - -## Teste de conhecimentos - -::: quiz -? O que está em JSON antes de cada valor? -→ Dados com nomes -- [ ] o número da linha -- [x] a sua chave, por exemplo "nome" -- [ ] um ponto e vírgula -> A chave e o valor estão separados por dois pontos. - -? Como escreves umas aspas dentro de um texto Java? -→ Escrever JSON -- [ ] "" -- [x] \" -- [ ] '"' - -? Em {"animais": [{"nome": "Ludwig"}, {"nome": "Zora"}]}, qual é o valor de animais[0].nome? -→ Dados com nomes -- [x] Ludwig -- [ ] Zora -- [ ] animais -> A lista conta a partir de 0. - -? Liga. -→ Pontos fortes e fracos do JSON -= { } -> um objeto com chaves e valores -= [ ] -> uma lista -= : -> separa a chave do valor -::: diff --git a/web/lessons/pt/27-formate-im-vergleich.md b/web/lessons/pt/27-formate-im-vergleich.md deleted file mode 100644 index b8ae2026..00000000 --- a/web/lessons/pt/27-formate-im-vergleich.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -titel: Comparar formatos -bereich: Ficheiros -kurz: Comparar os mesmos dados em txt, CSV e JSON, escolher o formato certo e converter um ficheiro noutro formato. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- reconhecer os mesmos dados em txt, CSV e JSON -- comparar pontos fortes e fracos de txt, CSV e JSON -- converter um ficheiro CSV em frases -- converter um ficheiro CSV em JSON -::: - -## Os mesmos animais três vezes - -O Ludwig guardou os animais do castelo em três ficheiros. Todos dizem o mesmo, só que escrito de outra maneira. - -Como texto, tal como se escreveria a uma pessoa: - -::: datei animais.txt -Ludwig (bode) tem 7 anos. -Zora (cabra) tem 6 anos. -Raposa (raposa-vermelha) tem 4 anos. -::: - -Como tabela em CSV: - -::: datei animais.csv -Nome;Espécie;Idade -Ludwig;bode;7 -Zora;cabra;6 -Raposa;raposa-vermelha;4 -::: - -Como JSON: - -::: datei animais.json -[ - {"nome": "Ludwig", "especie": "bode", "idade": 7}, - {"nome": "Zora", "especie": "cabra", "idade": 6}, - {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4} -] -::: - -## O que sabe fazer cada formato? - -| | txt | CSV | JSON | -|---|---|---|---| -| Fácil de ler para pessoas | sim | mais ou menos | mais ou menos | -| Ordem fixa para programas | não | sim, colunas | sim, chaves | -| O que quer dizer um valor? | está na frase | está no cabeçalho | está mesmo antes dele | -| Encaixar (uma lista dentro de uma entrada) | não | difícil | sim | -| Abrir no Excel | não | sim | não | -| Ler em Java | Scanner, BufferedReader | mais `split` | métodos de String ou uma biblioteca | -| Tamanho | pequeno | o mais pequeno | o maior | - -Em resumo: - -- **txt** para textos que pessoas leem: cartas, notas, um diário. -- **CSV** para tabelas: notas, medições, uma lista de recordes. Todas as linhas têm as mesmas colunas. -- **JSON** para dados com estrutura: jogos guardados, definições, tudo o que circula entre programas e na web. - -::: ludwig -Quando a tua aplicação de meteorologia vai buscar a temperatura, a resposta chega quase sempre em JSON. E quando um professor exporta as notas do programa da escola, recebe muitas vezes um ficheiro CSV. -::: - -## Exercício: De CSV para frases - -::: übung l27-java-saetze -titel: De CSV para frases -code: java -auftrag: Converte `animais.csv` em texto. Para cada animal, escreve uma frase como **Ludwig (bode) tem 7 anos.** no ficheiro `frases.txt`. No fim, mostra **3 frases guardadas**. -start: l27-java-saetze-start.visustruct -test: - -> 3 frases guardadas -datei: frases.txt -> Ludwig (bode) tem 7 anos. | Zora (cabra) tem 6 anos. | Raposa (raposa-vermelha) tem 4 anos. -braucht: whileSchleife -tipp: O código inicial já salta o cabeçalho. Divide cada linha com `String[] partes = linha.split(";");`. -tipp: A frase é `partes[0] + " (" + partes[1] + ") tem " + partes[2] + " anos."`. Conta com `quantidade++` e lê a linha seguinte no fim do ciclo. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Exercício: De CSV para JSON - -::: übung l27-java-json -titel: De CSV para JSON -code: java -auftrag: Converte `animais.csv` em JSON e guarda-o em `animais-novos.json`, exatamente como `animais.json` acima. No fim, mostra **3 animais guardados**. -start: l27-java-json-start.visustruct -test: - -> 3 animais guardados -datei: animais-novos.json -> [ | {"nome": "Ludwig", "especie": "bode", "idade": 7}, | {"nome": "Zora", "especie": "cabra", "idade": 6}, | {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4} | ] -braucht: forSchleife, verzweigung -tipp: `linhas[0]` é o cabeçalho. Por isso, começa o ciclo for em `i = 1` e divide `linhas[i]` com `split(";")`. -tipp: Constrói a entrada com `\"`, como na lição 26. A idade é um número e fica sem aspas. Só acrescentas uma vírgula se `i < linhas.length - 1`. -lösung: l27-java-json-loesung.visustruct -::: - -## Jogo: Que formato serve? - -::: spiel frage -titel: Jogo: Que formato serve? -intro: O Ludwig quer guardar dados e não sabe que formato usar. Ajuda-o. Seis rondas. -antworten: txt | CSV | JSON - -runde: -frage: As notas da turma inteira devem ser abertas no Excel. -richtig: CSV -> As notas são uma tabela, e o Excel abre ficheiros CSV diretamente. - -runde: -frage: O Ludwig escreve uma carta à Zora. -richtig: txt -> Uma carta é texto para pessoas. Não precisa de colunas nem de chaves. - -runde: -frage: Um jogo guardado com nome, nível e uma lista de todas as chaves apanhadas. -richtig: JSON -> Em JSON, uma lista pode ficar encaixada numa entrada. Em CSV dificilmente cabe numa célula. - -runde: -frage: Um aparelho de medição guarda a hora e a temperatura a cada minuto, durante um ano inteiro. -richtig: CSV -> Muitas linhas iguais com as mesmas colunas: para isto, o CSV é o mais pequeno. O JSON repetiria as chaves em todas as linhas. - -runde: -frage: Uma aplicação de meteorologia vai buscar a previsão a um servidor na internet. -richtig: JSON -> O JSON é o padrão na web. Quase todas as aplicações recebem os dados assim. - -runde: -frage: O diário do castelo, em que cada entrada é uma frase curta. -richtig: txt -> Cada linha é uma frase para pessoas. É lida linha a linha, como na lição 24. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo reconhecer os mesmos dados em txt, CSV e JSON. → Os mesmos animais três vezes -- Consigo comparar pontos fortes e fracos de txt, CSV e JSON. → O que sabe fazer cada formato? -- Consigo converter um ficheiro CSV em frases. → Exercício: De CSV para frases -- Consigo converter um ficheiro CSV em JSON. → Exercício: De CSV para JSON -::: - -## Teste de conhecimentos - -::: quiz -? Que formato o Excel abre diretamente como tabela? -→ O que sabe fazer cada formato? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Porque é que um ficheiro JSON é normalmente maior do que um CSV com os mesmos dados? -→ O que sabe fazer cada formato? -- [ ] Porque o JSON guarda mais números. -- [x] Porque as chaves se repetem em cada entrada. -- [ ] Porque o JSON não usa vírgulas. - -? Em que formato cada valor diz o que significa? -→ O que sabe fazer cada formato? -- [ ] txt -- [ ] CSV -- [x] JSON -> Em JSON a chave está mesmo antes do valor, por exemplo "idade": 7. - -? Liga cada objetivo a um formato. -→ O que sabe fazer cada formato? -= uma carta à Zora -> txt -= a pauta de notas da turma -> CSV -= um jogo guardado com listas -> JSON -::: diff --git a/web/lessons/pt/28-erstes-fenster.md b/web/lessons/pt/28-erstes-fenster.md deleted file mode 100644 index 61575dbd..00000000 --- a/web/lessons/pt/28-erstes-fenster.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -titel: A tua primeira janela -bereich: Janelas com Swing -kurz: Abrir uma janela tua com Java e Swing, explicado linha a linha. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ligar o “Java verdadeiro” na área Código -- abrir uma janela com título e tamanho -- explicar o que faz cada linha do programa com janela -- explicar porque é que setVisible(true) fica no fim -::: - -## Programas com janelas - -Até agora os teus programas escreviam texto na consola. Mas a maioria dos programas que conheces tem **janelas** com botões e campos de texto. A isto chama-se uma interface gráfica. - -O Java traz uma caixa de ferramentas para isso: o **Swing**. No VisuStruct ligas o Swing assim: - -1. Abre à direita a área [Código](#zeige-codelive). -2. Clica na [roda dentada](#zeige-einstellungen) em cima à direita e escolhe Java como **Linguagem de programação**. -3. Por baixo, na secção Java, marca **Java verdadeiro (com Swing)**. - -Na primeira vez que clicas em [▶︎ Executar](#zeige-ausfuehren), o VisuStruct descarrega uma única vez cerca de 40 MB, o que demora um pouco. Depois disso o teu código corre como Java verdadeiro, e as tuas janelas aparecem na área Código na área **Janelas Java**, por cima da consola. - -> Com o “Java verdadeiro”, as entradas pela consola (`Scanner`) ainda não funcionam. Para programas com entradas, desliga outra vez a opção. - -::: angeberwissen -O Swing existe desde 1998. Antes disso, o Java só tinha o AWT, mais antigo, com uma classe `Frame`. Para ninguém confundir os blocos novos, quase todos os nomes no Swing começam por **J**: `JFrame`, `JButton`, `JLabel`. Pelo J reconheces logo o Swing. -::: - -## O programa completo - -Este é o programa mais pequeno que abre uma janela. Escreve-o na área Código e clica em [▶︎ Executar](#zeige-ausfuehren): - -```java -import javax.swing.*; - -public class MinhaJanela { - public static void main(String[] args) { - JFrame janela = new JFrame("A minha primeira janela"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); - } -} -``` - -Aparece uma janela cinzenta vazia com o título “A minha primeira janela”. Mais nada, mas é a tua própria janela! - -A moldura com `public class` e `main` já conheces da lição Java. Novas são a primeira linha e as quatro linhas dentro de `main`. Vamos vê-las uma a uma. - -::: ludwig -Olha para o estrutograma ao lado do código: cada linha em `main` é um bloco, todos uns por baixo dos outros. No início, um programa com janelas é então só uma sequência. -::: - -## Linha a linha - -| Linha | O que faz | -|---|---| -| `import javax.swing.*;` | Traz a caixa de ferramentas Swing para o programa. Sem esta linha o Java não conhece `JFrame`. | -| `JFrame janela = new JFrame("A minha primeira janela");` | Constrói uma janela nova. O texto entre parênteses é o título em cima, na moldura da janela. Depois falas com ela através da variável `janela`. | -| `janela.setSize(300, 200);` | A janela fica com 300 píxeis de largura e 200 píxeis de altura. | -| `janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);` | Quando alguém fecha a janela, o programa também termina. | -| `janela.setVisible(true);` | Só agora a janela fica visível. | - -O ponto em `janela.setSize(…)` quer dizer: “Janela, faz isto!” Antes do ponto está quem deve fazer alguma coisa, depois do ponto o que deve fazer. - -> Sem `setDefaultCloseOperation`, o Java só esconde a janela quando ela é fechada. O programa continua a correr sem se ver. - -::: quiz -? O que quer dizer o ponto em `janela.setSize(300, 200)`? -- [x] “Janela, faz isto!”: antes do ponto está quem faz, depois o que faz. -- [ ] Separa os dois números. -- [ ] Termina a linha. -> Antes do ponto está o objeto `janela`, depois o seu método `setSize`. -::: - -## Porque é que setVisible fica no fim - -`setVisible(true)` mostra a janela tal como ela está nesse momento. Por isso preparas tudo primeiro: título, tamanho e, mais tarde, também botões. Só mesmo no fim tornas a janela visível. - -O que só pões na janela depois de `setVisible(true)` muitas vezes não aparece. É que o Java não volta a desenhar a janela sozinho. Às vezes só aparece quando se muda o tamanho da janela. Erros destes são difíceis de encontrar. - -::: ludwig -Primeiro preparar, depois mostrar. Como no teatro: a cortina só sobe quando o palco está pronto. -::: - -Experimenta: apaga a linha com `setVisible(true)` e executa o programa outra vez. O programa corre, mas não vês nenhuma janela. - -## Classes e objetos - -Isto não está no programa da disciplina, mas ajuda-te a perceber o Swing. - -::: angeberwissen -O Java é, na verdade, uma linguagem **orientada a objetos**. `JFrame` é uma classe, ou seja, uma planta para janelas. Com `new JFrame(…)` o Java constrói, segundo essa planta, uma janela a sério: um **objeto**. Com dois `new` podias construir duas janelas, ambas com a mesma planta. - -`setSize` e `setVisible` são métodos que qualquer objeto janela sabe fazer. Por isso escreves `janela.setSize(…)`: o objeto `janela` executa o seu método. O teu próprio programa também é uma classe, neste caso `MinhaJanela`. -::: - -## Jogo: O que acontece? - -::: spiel frage -titel: Jogo: O que acontece? -intro: O Ludwig andou a mexer no programa da janela. Lê as linhas e prevê o que acontece. Seis rondas. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: O que vês depois de executar? -- uma janela com o título "Olá" -- [x] nenhuma janela -- uma mensagem de erro -> Falta `setVisible(true)`. A janela está construída, mas fica invisível. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(200, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); -frage: Como é a janela? -- mais larga do que alta -- [x] mais alta do que larga -- quadrada -> O primeiro número é a largura, o segundo a altura: 200 de largura, 300 de altura. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(300, 200); - janela.setVisible(true); -frage: Fechas a janela. O que acontece ao programa? -- Termina. -- [x] Continua a correr, invisível. -- A janela volta logo a abrir. -> Sem `setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)`, o Java só esconde a janela. - -runde: - JFrame janela = new JFrame(); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); -frage: O que aparece no topo da moldura da janela? -- janela -- JFrame -- [x] nada, o título está vazio -> Sem texto entre os parênteses, a janela não tem título. O nome da variável `janela` nunca aparece na janela. - -runde: - public class Teste { - public static void main(String[] args) { - JFrame janela = new JFrame("Teste"); - janela.setVisible(true); - } - } -frage: O que diz o javac? -- [x] cannot find symbol: class JFrame -- nada, a janela aparece -- missing return statement -> Falta a linha `import javax.swing.*;`. Sem ela, o Java não conhece `JFrame`. - -runde: - JFrame a = new JFrame("Uma"); - JFrame b = new JFrame("Duas"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: O que vês? -- [x] uma janela com o título "Uma" -- duas janelas -- uma janela com o título "Duas" -> Duas janelas feitas com a mesma planta, mas só a `a` fica visível. -::: - -## Tarefa: a tua própria janela - -Altera o programa de forma que - -- o título diga “Olá” e o teu nome, -- a janela tenha 400 píxeis de largura e 300 píxeis de altura, -- o programa termine quando fechas a janela. - -Executa-o e verifica os três pontos. - -::: ludwig -Não te apetece escrever tanto? Com o “Java verdadeiro” podes escrever na área Código só as quatro linhas de `main`. O VisuStruct põe-nas sozinho dentro de uma classe e acrescenta as linhas `import`. Num ambiente de desenvolvimento Java a sério precisas, no entanto, do programa completo. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ligar o “Java verdadeiro” na área Código. → Programas com janelas -- Consigo abrir uma janela com título e tamanho. → O programa completo -- Consigo explicar o que faz cada linha do programa com janela. → Linha a linha -- Consigo explicar porque é que setVisible(true) fica no fim. → Porque é que setVisible fica no fim -::: - -## Teste de conhecimentos - -::: quiz -? Que linha torna a janela visível? -→ Porque é que setVisible fica no fim -- [ ] janela.setSize(300, 200); -- [x] janela.setVisible(true); -- [ ] new JFrame("Olá"); -> Sem setVisible(true) a janela fica invisível. - -? Onde fica melhor janela.setVisible(true)? -→ Porque é que setVisible fica no fim -- [ ] Mesmo no início de main -- [x] No fim, quando a janela já está preparada -- [ ] Tanto faz. -> O que vem depois de setVisible(true) muitas vezes não aparece. - -? O que faz setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)? -→ Linha a linha -- [ ] A janela fecha-se logo. -- [x] Quando se fecha a janela, o programa termina. -- [ ] A janela já não se pode fechar. - -? Como reconheces os blocos do Swing? -→ Linha a linha -- [x] O nome começa por J, p. ex. JFrame. -- [ ] Estão entre chavetas. -- [ ] Terminam em Window. -::: diff --git a/web/lessons/pt/29-knopf-im-fenster.md b/web/lessons/pt/29-knopf-im-fenster.md deleted file mode 100644 index 3c884c23..00000000 --- a/web/lessons/pt/29-knopf-im-fenster.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -titel: Um botão na janela -bereich: Janelas com Swing -kurz: Pôr um botão na janela e arrumá-lo bem com um layout. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir um botão e pô-lo na janela com add -- explicar porque é que o botão entra antes de setVisible -- usar o FlowLayout para o botão ter o tamanho normal -- construir uma janela com um botão em que se pode carregar -::: - -## Construir um botão - -Uma janela vazia é aborrecida. Agora vai lá para dentro um botão. No Swing, um botão chama-se **JButton** (button é inglês para botão). - -Precisas de duas linhas novas: - -```java -JButton botao = new JButton("Clica-me"); -janela.add(botao); -``` - -- `new JButton("Clica-me")` constrói um botão. O texto entre parênteses fica escrito no botão. -- `janela.add(botao)` põe o botão na janela. Sem `add` o botão existe, mas não está em lado nenhum e não o vês. - -::: quiz -? O que está escrito no botão depois de `new JButton("Iniciar")`? -- [ ] botao -- [x] Iniciar -- [ ] JButton -> O texto entre parênteses é a legenda. `botao` é só o nome da variável. -::: - -## O programa completo - -As duas linhas ficam **antes** de `setVisible(true)`, porque a janela deve primeiro ficar pronta e só depois ser mostrada: - -```java -import javax.swing.*; - -public class JanelaBotao { - public static void main(String[] args) { - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton botao = new JButton("Clica-me"); - janela.add(botao); - - janela.setVisible(true); - } -} -``` - -Executa o programa. Surpresa: o botão é enorme e enche a janela toda! - -::: ludwig -A ordem é a mesma da primeira janela: preparar, construir o botão, pô-lo na janela e só no fim mostrar. As linhas em branco no código ajudam-te a ver estas partes. -::: - -## O botão gigante - -A forma como uma janela arruma as suas partes é decidida pelo seu **layout**. Sem mais indicações, um `JFrame` põe tudo no meio e torna-o tão grande como a janela inteira. - -Com outro layout o botão fica com o tamanho normal. O **FlowLayout** põe tudo lado a lado, como palavras numa linha, só do tamanho necessário: - -```java -import javax.swing.*; -import java.awt.*; - -public class JanelaBotao { - public static void main(String[] args) { - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new FlowLayout()); - - JButton botao = new JButton("Clica-me"); - janela.add(botao); - - janela.setVisible(true); - } -} -``` - -O `FlowLayout` pertence à caixa de ferramentas AWT, mais antiga. Por isso há uma segunda linha em cima: `import java.awt.*;`. - -::: angeberwissen -No FlowLayout os blocos correm como texto: se um botão já não cabe na linha, passa para a seguinte. Torna a janela estreita e vê como os botões mudam de linha. Flow é inglês para fluxo. -::: - -## Clicar funciona, mas nada acontece - -Clica no botão. Ele fica um pouco mais escuro enquanto o carregas. O Swing mostra assim que foi carregado. Fora isso, não acontece nada. - -Isto não é um erro: ainda não disseste ao programa **o que** deve acontecer com um clique. Isso aprendes na próxima lição. - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Em cada programa de janela há **exatamente um erro**, e a bomba está a contar. Lê o que o programa deve fazer e toca na linha errada antes de o tempo acabar. Seis rondas, 25 segundos cada. -zeit: 25 - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - JButton botao = new JButton(Clica-me); - janela.add(botao); - janela.setVisible(true); -frage: Deve mostrar um botão "Clica-me". -fehler: 3 -besser: JButton botao = new JButton("Clica-me"); -> A legenda é um texto e precisa de aspas. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - JButton botao = new JButton("OK"); - janela.add(janela); - janela.setVisible(true); -frage: Deve pôr o botão "OK" na janela. -fehler: 4 -besser: janela.add(botao); -> Na janela entra o botão, não a própria janela. - -runde: - import java.swing.*; - import java.awt.*; -frage: Deve trazer o Swing e o FlowLayout para o programa. -fehler: 1 -besser: import javax.swing.*; -> O Swing está em `javax.swing`, com x. O FlowLayout vem de `java.awt`, sem x. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout); - janela.add(new JButton("OK")); - janela.setVisible(true); -frage: Deve mostrar o botão no tamanho normal. -fehler: 3 -besser: janela.setLayout(new FlowLayout()); -> Depois de `new` e do nome vêm sempre parênteses, mesmo que não haja nada lá dentro. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout()); - JButton botao = new Jbutton("OK"); - janela.add(botao); - janela.setVisible(true); -frage: Deve mostrar um botão "OK". -fehler: 4 -besser: JButton botao = new JButton("OK"); -> O Java distingue maiúsculas de minúsculas: `JButton` com B maiúsculo. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout()); - janela.add(new JButton("OK")); - janela.setVisible(false); -frage: Deve mostrar a janela com o botão. -fehler: 5 -besser: janela.setVisible(true); -> Com `false`, a janela fica invisível. -::: - -## Tarefa: clica-me - -Constrói uma janela com o título “Teste do botão”, com 300 por 200 píxeis e um botão “Clica-me” de tamanho normal. Deve ser possível carregar no botão, mesmo que ainda não aconteça nada. - -Extra: põe um segundo botão “Eu também” ao lado. Por que ordem aparecem os botões? Troca as duas linhas `add` e experimenta outra vez. - -**Terminaste quando …** - -- o título da janela diz “Teste do botão”, -- a janela tem 300 píxeis de largura e 200 de altura, -- o botão “Clica-me” só é do tamanho do texto e não enche a janela toda, -- o botão afunda visivelmente quando clicas nele. - -::: ludwig -Cada botão precisa da sua própria variável, por exemplo `botao` e `botao2`, e do seu próprio `add`. O FlowLayout põe os botões pela ordem das linhas `add`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir um botão e pô-lo na janela com add. → Construir um botão -- Consigo explicar porque é que o botão entra antes de setVisible(true). → O programa completo -- Consigo usar o FlowLayout para o botão ter o tamanho normal. → O botão gigante -- Consigo construir uma janela com um botão em que se pode carregar. → Tarefa: clica-me -::: - -## Teste de conhecimentos - -::: quiz -? O que faz janela.add(botao)? -→ Construir um botão -- [ ] Constrói um botão novo. -- [x] Põe o botão na janela. -- [ ] Torna o botão clicável. -> O botão é construído com new JButton(…). - -? Porque é que, sem FlowLayout, o botão enche a janela toda? -→ O botão gigante -- [ ] Porque o texto é demasiado comprido -- [x] Porque sem layout próprio a janela torna tudo tão grande como ela -- [ ] Porque falta o setSize - -? Que linha import precisas para o FlowLayout? -→ O botão gigante -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> O FlowLayout vem do AWT, mais antigo. - -? O que acontece nesta lição quando clicas no botão? -→ Tarefa: clica-me -- [ ] O programa termina. -- [x] O botão fica mais escuro por um momento, e mais nada. -- [ ] No botão aparece “Fui clicado”. -> O que deve acontecer com um clique aprendes na próxima lição. -::: diff --git a/web/lessons/pt/30-der-knopf-reagiert.md b/web/lessons/pt/30-der-knopf-reagiert.md deleted file mode 100644 index 954cacaf..00000000 --- a/web/lessons/pt/30-der-knopf-reagiert.md +++ /dev/null @@ -1,356 +0,0 @@ ---- -titel: O botão reage -bereich: Janelas com Swing -kurz: Com um ActionListener decides o que acontece com um clique. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o que é um evento -- usar addActionListener para decidir o que acontece com um clique -- executar várias instruções com um clique -- construir um botão que muda o seu texto depois do clique -::: - -## Um clique é um evento - -Na lição anterior podias carregar no botão, mas nada acontecia. Num programa com janelas é a pessoa que decide quando acontece alguma coisa: clica, escreve ou fecha uma janela. Cada ação destas chama-se **evento**. - -Por isso o teu programa tem de esperar pelo clique e dar por ele. Para isso registas no botão um ouvinte, um **ActionListener** (inglês para “ouvinte de ações”). A cada clique o botão chama o seu ouvinte, e o ouvinte executa o teu código. - -::: ludwig -Até agora o teu programa corria de cima para baixo, como no estrutograma. O código do ouvinte, pelo contrário, só corre mais tarde, sempre que alguém clica. Quantas vezes isso acontece, ninguém sabe de antemão. -::: - -## A linha com a seta - -É assim que registas o ouvinte: - -```java -botao.addActionListener(e -> botao.setText("Fui clicado")); -``` - -Lido de fora para dentro: - -- `botao.addActionListener( … )` regista um ouvinte no botão. -- `e` é o evento. Contém, por exemplo, quando foi o clique. Aqui não precisas dele, mas o nome tem de estar lá. -- `->` lê-se “então faz”. -- `botao.setText("Fui clicado")` é o que acontece com o clique: o botão recebe um texto novo. - -A linha vem depois de `new JButton(…)`, porque o botão já tem de existir. E, como tudo o resto, vem antes de `setVisible(true)`. - -::: quiz -? O que representa o `e` em `e -> botao.setText(…)`? -- [x] O evento, ou seja, o clique -- [ ] “Fim” -- [ ] Um erro -> Aqui não precisas de `e`, mas o nome tem de estar lá. -::: - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; - -public class ClicaMe { - public static void main(String[] args) { - JFrame janela = new JFrame("Clica-me"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new FlowLayout()); - - JButton botao = new JButton("Clica-me"); - botao.addActionListener(e -> botao.setText("Fui clicado")); - janela.add(botao); - - janela.setVisible(true); - } -} -``` - -Executa-o e clica no botão. Agora diz “Fui clicado”. - -> Se o texto novo for mais comprido do que o antigo, o FlowLayout alarga o botão sozinho. - -## Várias instruções com um clique - -Se com um clique deve acontecer mais do que uma coisa, pões chavetas depois da seta. Lá dentro, cada instrução tem o seu ponto e vírgula, como no corpo de um ciclo: - -```java -botao.addActionListener(e -> { - botao.setText("Fui clicado"); - janela.setTitle("Obrigado!"); - System.out.println("Clique!"); -}); -``` - -`System.out.println` escreve na [consola](#zeige-konsole), como de costume. Clica várias vezes: a cada clique aparece uma nova linha “Clique!”. Assim vês que o código do ouvinte corre mesmo a cada clique. - -::: ludwig -Atenção ao fim: primeiro `}` fecha o bloco, depois `)` fecha o parêntese de `addActionListener`, e só então vem o ponto e vírgula. Ou seja, `});`. Se faltar alguma coisa, aparece uma indicação por baixo do código. -::: - -## Jogo: Quem está a ouvir? - -::: spiel zuhoerer -titel: Jogo: Quem está a ouvir? -intro: O Ludwig mostra-te código e a janela correspondente. Por baixo vês que botões são clicados, um a seguir ao outro. O que acontece? Depois da tua resposta, o Ludwig reproduz os cliques: vês que ouvinte ouve o evento e que linhas correm a seguir. -frage: O que diz a etiqueta depois dos cliques? - -runde: - JFrame janela = new JFrame("Saudação"); - JLabel texto = new JLabel("Início"); - JButton botao = new JButton("Olá"); - botao.addActionListener(e -> texto.setText("Olá mundo")); -klicks: Olá -- Início -- [x] Olá mundo -- Olá -> O botão tem um ouvinte. Com o clique executa `texto.setText("Olá mundo")`, e a etiqueta mostra “Olá mundo”. - -runde: - JFrame janela = new JFrame("Fruta"); - JLabel texto = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> texto.setText("Maçã")); - b.addActionListener(e -> texto.setText("Pera")); -klicks: A, B -- Maçã -- [x] Pera -- Maçã Pera -> Cada botão tem o seu próprio ouvinte. Primeiro o A escreve “Maçã”, depois o B substitui-o por “Pera”. O `setText` troca o texto antigo, não acrescenta nada. - -runde: - JFrame janela = new JFrame("Fruta"); - JLabel texto = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> texto.setText("Maçã")); -klicks: B -- Maçã -- Pera -- [x] ? -> Ninguém se inscreveu no botão B: não há `b.addActionListener`. O clique é um evento, mas ninguém está a ouvir. Por isso o ponto de interrogação fica. - -runde: - JFrame janela = new JFrame("Cores"); - JLabel texto = new JLabel("nenhuma"); - JButton vermelho = new JButton("Vermelho"); - JButton azul = new JButton("Azul"); - vermelho.addActionListener(e -> texto.setText("Azul")); - azul.addActionListener(e -> texto.setText("Vermelho")); -klicks: Vermelho -- Vermelho -- [x] Azul -- nenhuma -> Atenção: o que acontece é decidido pelo código no ouvinte, não pela legenda do botão. O ouvinte do botão “Vermelho” escreve “Azul”. - -runde: - JFrame janela = new JFrame("Botão"); - JLabel texto = new JLabel("Clica, por favor"); - JButton botao = new JButton("Clica-me"); - botao.addActionListener(e -> { - botao.setText("Obrigado!"); - texto.setText("Clicado"); - }); -klicks: Clica-me -frage: O que diz o botão depois do clique? -- Clica-me -- [x] Obrigado! -- Clicado -> O bloco depois da seta tem duas instruções. As duas correm com o clique, uma a seguir à outra: o botão fica com “Obrigado!”, a etiqueta com “Clicado”. - -runde: - JFrame janela = new JFrame("Consola"); - JButton botao = new JButton("Vai"); - botao.addActionListener(e -> System.out.println("Clique!")); -klicks: Vai, Vai, Vai -frage: Quantas linhas “Clique!” há depois na consola? -- 1 -- [x] 3 -- 0 -> O ouvinte corre a **cada** clique, não só no primeiro. Três cliques, três linhas. -::: - -## ActionListener é uma interface - -Isto não está no programa da disciplina. Se quiseres saber o que está por trás da seta, continua a ler. - -::: angeberwissen -`ActionListener` é uma **interface**, uma espécie de contrato. Diz: quem quiser ser um ActionListener tem de ter um método `actionPerformed(ActionEvent e)`. A cada clique o botão chama exatamente esse método. -::: - -A linha com a seta já conheces do passo 3: - -```java -botao.addActionListener(e -> botao.setText("Fui clicado")); -``` - -Sem a seta escreve-se o ouvinte como uma classe sem nome que cumpre o contrato (uma classe anónima): - -```java -botao.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - botao.setText("Fui clicado"); - } -}); -``` - -Para isso precisas ainda de `import java.awt.event.*;` em cima. As duas formas fazem exatamente o mesmo. A seta `e -> …` é a forma curta (uma expressão lambda, desde o Java 8): `e` é o parâmetro de `actionPerformed`, e depois da seta vem o seu corpo. A forma curta funciona porque a interface tem um único método. Assim o Java sabe de que método se trata. - -## Jogo: Contrato cumprido? - -::: spiel vertrag -titel: Jogo: Contrato cumprido? -intro: O contrato `ActionListener` exige exatamente um método: `public void actionPerformed(ActionEvent e)`. O Ludwig mostra-te código. Cumpre o contrato, de forma a poder ser inscrito num botão? O Ludwig verificou cada resposta com o compilador de Java verdadeiro. -frage: Isto cumpre o contrato ActionListener? -antworten: cumprido | não cumprido - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: cumprido -> Está tudo: `implements ActionListener` assina o contrato, e o método chama-se exatamente `actionPerformed`, é `public`, não devolve nada (`void`) e recebe um `ActionEvent`. - -runde: - class Saudacao implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Olha bem: `actionPerfomed` em vez de `actionPerformed`, falta um r. Para o Java é um método completamente diferente. O compilador avisa que falta `actionPerformed`. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed() { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Falta o parâmetro. O contrato exige `actionPerformed(ActionEvent e)`, porque com o clique o botão entrega o evento. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent evento) { - System.out.println("Olá"); - } - } -richtig: cumprido -> O nome do parâmetro escolhe-se livremente. Só conta o tipo `ActionEvent`. Em vez de `e` também se pode chamar `evento`. - -runde: - class Saudacao implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Falta o `public`. Todos os métodos de uma interface são públicos, porque o botão tem de os poder chamar de fora. Sem `public` o compilador indica um erro. - -runde: - class Saudacao implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: não cumprido -> O contrato diz `void`: o método não devolve nada. Com `int` como tipo de retorno já não serve. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - dizOla(); - } - void dizOla() { - System.out.println("Olá"); - } - } -richtig: cumprido -> Métodos a mais são permitidos. O contrato só exige que o `actionPerformed` exista, não que não haja mais nada. - -runde: - class Saudacao { - public void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } - botao.addActionListener(new Saudacao()); -richtig: não cumprido -> O método está certo, mas o contrato não foi assinado: falta `implements ActionListener`. Num botão, o Java só aceita objetos que cumprem oficialmente o contrato. - -runde: - botao.addActionListener(e -> System.out.println("Olá")); -richtig: cumprido -> A seta é a forma curta. Como o contrato só tem um método, o Java sabe: `e` é o parâmetro de `actionPerformed`, e depois da seta vem o seu corpo. - -runde: - botao.addActionListener((a, b) -> System.out.println("Olá")); -richtig: não cumprido -> Aqui a seta tem dois parâmetros. Mas o `actionPerformed` recebe exatamente um, o evento. Por isso esta forma curta não serve para o contrato. -::: - -## Tarefa: fui clicado - -Agora terminas a tarefa: constrói uma janela com um botão “Clica-me” de tamanho normal. Depois do clique, o botão diz “Fui clicado”. - -Extra: constrói dois botões “Vermelho” e “Azul”. Um clique num botão escreve o seu nome no título da janela, por exemplo “Escolheste Vermelho”. - -**Terminaste quando …** - -- o botão diz “Clica-me” antes do clique, -- depois do clique diz “Fui clicado”, -- o botão não enche a janela toda. - -::: ludwig -Cada botão recebe o seu próprio ouvinte, com o seu próprio `addActionListener`. O título mudas com `janela.setTitle(…)`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o que é um evento. → Um clique é um evento -- Consigo usar addActionListener para decidir o que acontece com um clique. → A linha com a seta -- Consigo executar várias instruções com um clique. → Várias instruções com um clique -- Consigo construir um botão que muda o seu texto depois do clique. → Tarefa: fui clicado -::: - -## Teste de conhecimentos - -::: quiz -? O que é um ActionListener? -→ Um clique é um evento -- [ ] Um botão com texto -- [x] Um ouvinte que executa o teu código a cada clique -- [ ] Um layout para janelas -> Registas o ouvinte no botão com addActionListener. - -? Quando corre botao.setText("Fui clicado") dentro do ouvinte? -→ A linha com a seta -- [ ] Logo no início do programa -- [x] Sempre que alguém clica no botão -- [ ] Só no primeiro clique -> O código do ouvinte só corre quando o evento acontece. - -? Como termina um ouvinte com chavetas? -→ A linha com a seta -- [ ] };) -- [x] }); -- [ ] );} -> Primeiro fecha o bloco, depois o parêntese de addActionListener, depois o ponto e vírgula. - -? Associa cada parte à sua função. -→ A linha com a seta -= JButton -> um botão -= addActionListener -> registar um ouvinte -= setText -> mudar o texto -= setVisible(true) -> mostrar a janela -::: diff --git a/web/lessons/pt/31-zahl-verdoppeln.md b/web/lessons/pt/31-zahl-verdoppeln.md deleted file mode 100644 index 9df772da..00000000 --- a/web/lessons/pt/31-zahl-verdoppeln.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Duplicar um número na janela -bereich: Janelas com Swing -kurz: Arrumar uma etiqueta, um campo de texto e um botão com um GridLayout e calcular com o texto do campo de texto. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pôr um JLabel e um JTextField na janela -- explicar porque é que sem layout só se vê a última peça -- arrumar tudo umas por baixo das outras com GridLayout -- calcular com getText, Integer.parseInt e setText -- escrever um programa que não falha com “abc” -::: - -## O objetivo - -Vamos construir uma pequena calculadora com janela: em cima está uma etiqueta, por baixo um campo de texto e um botão **Calcular**. Se escreveres 2 e clicares, o campo de texto mostra 4. Clicas outra vez e passa a 8, depois 16 e assim por diante. - -Para isso precisas de duas peças novas: - -- **JLabel**: uma etiqueta, ou seja, texto simples na janela. -- **JTextField**: um campo de texto onde se pode escrever. - -Como nas últimas lições, marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Três peças na janela - -Pomos as três peças na janela, tal como o botão na lição 29: - -```java -import javax.swing.*; - -public class Duplicar { - public static void main(String[] args) { - JFrame janela = new JFrame("Duplicar número"); - janela.setSize(250, 150); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel etiqueta = new JLabel("Escreve um número:"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular"); - janela.add(etiqueta); - janela.add(campo); - janela.add(botao); - - janela.setVisible(true); - } -} -``` - -Executa o programa. Ups: só se vê o botão gigante. Onde estão a etiqueta e o campo de texto? - -## Porque só se vê o botão - -::: ludwig -Lembras-te do botão gigante? Sem um layout próprio, um `JFrame` só tem **um** lugar: o meio. Cada `add` põe a peça nova exatamente aí, do tamanho da janela inteira. As três peças ficam por isso umas por cima das outras no mesmo lugar, e a janela só mostra a última que lá puseste: o botão. Assim não consegues usar o programa. -::: - -A solução é outra vez um layout. Desta vez usamos o **GridLayout**. Divide a janela em células do mesmo tamanho, como uma grelha: - -```java -janela.setLayout(new GridLayout(0, 1)); -``` - -Os dois números são linhas e colunas. `0` linhas quer dizer “tantas quantas forem precisas”, `1` coluna quer dizer: tudo umas por baixo das outras. Para o `GridLayout` precisas ainda de `import java.awt.*;` lá em cima. - -| Layout | Como arruma | -|---|---| -| sem layout | tudo no meio, umas por cima das outras | -| `FlowLayout` | lado a lado como palavras, com mudança de linha quando é preciso | -| `GridLayout(0, 1)` | umas por baixo das outras, todas as linhas da mesma altura | - -## A janela com GridLayout - -```java -import javax.swing.*; -import java.awt.*; - -public class Duplicar { - public static void main(String[] args) { - JFrame janela = new JFrame("Duplicar número"); - janela.setSize(250, 150); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel etiqueta = new JLabel("Escreve um número:"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular"); - janela.add(etiqueta); - janela.add(campo); - janela.add(botao); - - janela.setVisible(true); - } -} -``` - -Agora as três estão umas por baixo das outras. Podes escrever no campo de texto e carregar no botão. Mas o programa ainda não calcula nada. - -::: angeberwissen -Com `new GridLayout(2, 3)` obténs 2 linhas com 3 colunas cada, ou seja, 6 células do mesmo tamanho. É assim que se constroem, por exemplo, as teclas de uma calculadora. As peças preenchem as células pela ordem das linhas `add`, linha a linha da esquerda para a direita. -::: - -## Calcular com o texto do campo de texto - -Com um clique, o programa deve ir buscar o número ao campo de texto, duplicá-lo e voltar a escrevê-lo lá. Isso faz-se com três métodos: - -- `campo.getText()` dá-te o texto do campo de texto, por exemplo `"2"`. -- `Integer.parseInt(…)` transforma-o no número 2. Já conheces isto da lição 22. -- `campo.setText(…)` escreve um texto novo no campo de texto. - -Juntamente com o ActionListener da lição 30 fica assim: - -```java -botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); -}); -``` - -`setText` precisa de um texto. `"" + numero * 2` junta o resultado a um texto vazio e assim transforma o número num texto. - -## Não é um número? Sem falhas! - -Escreve “abc” no campo de texto e clica em Calcular. A janela fica, mas não acontece nada, e na [consola](#zeige-konsole) aparece uma `NumberFormatException`. Da lição 22 já sabes o que fazer: - -```java -botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } -}); -``` - -Em vez de um erro na consola, vês agora um aviso na janela. - -::: ludwig -A seta já tem um `e` para o evento. Por isso a exceção no `catch` precisa de outro nome, aqui `erro`. O Java não permite duas variáveis com o mesmo nome. -::: - -::: quiz -? Porque é que a exceção no `catch` se chama aqui `erro` e não `e`? -- [ ] O `catch` exige sempre o nome `erro`. -- [x] `e` já é o evento da seta, e o Java não permite duas variáveis com o mesmo nome. -- [ ] `e` só é permitido para números. -> Podes escolher o nome à vontade, só não pode repetir-se. -::: - -## Jogo: O que fica na janela? - -::: spiel frage -titel: Jogo: O que fica na janela? -intro: O Ludwig escreve algo no campo de texto e clica em Calcular. Lê o ouvinte e prevê o que a janela mostra depois. Seis rondas. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - }); -frage: No campo de texto está 21. O que fica lá depois do clique? -- 2121 -- [x] 42 -- 21 -> `parseInt` transforma o texto no número 21. O dobro é 42. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - }); -frage: No campo de texto está 21. Clicas duas vezes. O que fica lá depois? -- 42 -- [x] 84 -- 4242 -> Cada clique duplica o que está no campo nesse momento: 21, 42, 84. - -runde: - botao.addActionListener(e -> { - campo.setText(campo.getText() + campo.getText()); - }); -frage: No campo de texto está 21. O que fica lá depois do clique? -- 42 -- [x] 2121 -- 21 -> Sem `parseInt` continua a ser texto, e `+` junta textos. - -runde: - botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } - }); -frage: No campo de texto está abc. O que acontece com o clique? -- [x] A etiqueta mostra "Escreve um número inteiro!" -- No campo de texto fica abcabc. -- A janela vai abaixo. -> `parseInt` lança uma NumberFormatException, e o `catch` apanha-a. - -runde: - botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } - }); -frage: No campo de texto está 2.5. O que acontece com o clique? -- No campo de texto fica 5.0. -- No campo de texto fica 5. -- [x] A etiqueta mostra "Escreve um número inteiro!" -> `Integer.parseInt` só conhece números inteiros. Para ele, 2.5 não é um número. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero + numero); - }); -frage: No campo de texto está 5. O que fica lá depois do clique? -- 10 -- [x] 55 -- 5 -> `"" + numero` já é um texto, e o segundo `+` junta outra vez o 5. Com `"" + (numero + numero)` o Java calcula primeiro. -::: - -## Tarefa: duplicar um número - -Junta o programa todo: - -- uma janela com o título “Duplicar número”, com 250 píxeis de largura e 150 píxeis de altura, -- umas por baixo das outras, uma etiqueta, um campo de texto e um botão “Calcular”, -- cada clique duplica o número no campo de texto: 2, 4, 8, 16, … -- com “abc” aparece um aviso na etiqueta em vez de uma falha. - -Extra: um segundo botão “Dividir por 2” divide o número por 2. O que acontece com 5? - -**Terminaste quando …** - -- o título é “Duplicar número” e etiqueta, campo de texto e botão estão uns por baixo dos outros, -- o 2 passa a 4, 8 e 16 com três cliques, -- com “abc” aparece um aviso na etiqueta e o programa continua a funcionar. - -::: ludwig -O botão “Dividir por 2” entra no GridLayout como quarta linha e recebe o seu próprio ActionListener. Com `int`, o Java corta as casas decimais ao dividir. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pôr um JLabel e um JTextField na janela. → Três peças na janela -- Consigo explicar porque é que sem layout só se vê a última peça. → Porque só se vê o botão -- Consigo arrumar tudo umas por baixo das outras com GridLayout(0, 1). → A janela com GridLayout -- Consigo calcular com getText, Integer.parseInt e setText. → Calcular com o texto do campo de texto -- Consigo escrever um programa que não falha com “abc”. → Não é um número? Sem falhas! -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que sem layout só se vê o botão? -→ Porque só se vê o botão -- [ ] Porque faltam a etiqueta e o campo de texto -- [x] Porque todas as peças estão no meio umas por cima das outras e a última tapa as outras -- [ ] Porque a janela é demasiado pequena - -? O que significa new GridLayout(0, 1)? -→ A janela com GridLayout -- [ ] Nenhuma linha e uma coluna, por isso a janela fica vazia -- [x] Tantas linhas quantas forem precisas numa coluna, ou seja, tudo umas por baixo das outras -- [ ] Uma linha, tudo lado a lado - -? O que te dá campo.getText()? -→ Calcular com o texto do campo de texto -- [ ] Sempre um número -- [x] O texto do campo de texto -- [ ] O título da janela -> Para um número precisas ainda de Integer.parseInt. - -? Associa cada peça à sua função. -→ Três peças na janela -= JLabel -> etiqueta -= JTextField -> campo de texto para escrever -= JButton -> botão -= GridLayout -> arrumação em grelha -::: diff --git a/web/lessons/pt/32-klickzaehler.md b/web/lessons/pt/32-klickzaehler.md deleted file mode 100644 index 6d7be2ba..00000000 --- a/web/lessons/pt/32-klickzaehler.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Contador de cliques com reset -bereich: Janelas com Swing -kurz: Dois botões alteram o mesmo número: criar uma variável para a classe toda. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar porque é que um ouvinte não pode alterar uma variável do main -- criar uma variável static na classe -- fazer com que dois botões alterem o mesmo número -- construir um contador com −1 que nunca fica abaixo de 0 -::: - -## O objetivo - -Uma janela conta cliques: em cima está o número, por baixo dois botões. **+1** soma um, **Reset** volta a pôr o número a 0. - -A novidade desta vez: dois botões trabalham com o **mesmo** número. Para isso precisas de uma variável que os dois ouvintes conheçam. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## A primeira tentativa - -A ideia mais óbvia é criar o número no `main`, como de costume, e somá-lo no ouvinte: - -```java -int contagem = 0; -botao.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); -}); -``` - -Se executares isto com o Java verdadeiro, o compilador indica um erro: - -``` -local variables referenced from a lambda expression must be final or effectively final -``` - -::: ludwig -O ouvinte só corre mais tarde, a cada clique, muito depois de o `main` ter terminado. Por isso pode ler as variáveis do `main`, mas não alterá-las. O Java insiste: uma variável do `main` que aparece na seta tem de ficar igual. Para um número que muda a cada clique, precisamos de outro lugar. -::: - -## Uma variável para a classe toda - -A solução: a variável **não** vai para o `main`, mas diretamente para a classe, por cima do `main`. Assim pertence à classe toda, e qualquer ouvinte a pode alterar: - -```java -public class Contador { - static int contagem = 0; - - public static void main(String[] args) { - // aqui a janela, como de costume - } -} -``` - -- `static` quer dizer: a variável pertence à própria classe. Como o `main` também é `static`, aqui é preciso. -- Uma variável destas chama-se **atributo** da classe. Vive tanto tempo como o programa, e não só enquanto o `main` corre. - -::: quiz -? Como se chama uma variável que está diretamente na classe e não no `main`? -- [ ] Parâmetro -- [x] Atributo -- [ ] Ouvinte -> Um atributo vive tanto tempo como o programa, e não só enquanto o `main` corre. -::: - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; - -public class Contador { - static int contagem = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel numero = new JLabel("0", SwingConstants.CENTER); - JButton mais = new JButton("+1"); - JButton reset = new JButton("Reset"); - - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - reset.addActionListener(e -> { - contagem = 0; - numero.setText("0"); - }); - - janela.add(numero); - janela.add(mais); - janela.add(reset); - janela.setVisible(true); - } -} -``` - -`SwingConstants.CENTER` põe o texto da etiqueta no meio. Clica algumas vezes em +1 e depois em Reset. - -::: angeberwissen -Com `numero.setFont(new Font("SansSerif", Font.BOLD, 48));` o número fica grande e a negrito. `Font` vem de `java.awt`, que já importaste. -::: - -## Jogo: Quem está a contar? - -::: spiel zuhoerer -titel: Jogo: Quem está a contar? -intro: Agora os ouvintes fazem contas com a variável da classe. O Ludwig mostra-te o código, a janela e os cliques. Que número aparece no fim? A seguir o Ludwig reproduz os cliques. -frage: O que diz a etiqueta depois dos cliques? - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> A variável está na classe e guarda o valor entre os cliques. Cada clique soma um: 1, 2, 3. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - JButton reset = new JButton("Reset"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - reset.addActionListener(e -> { - contagem = 0; - numero.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> Depois de dois cliques aparece 2. O Reset põe a variável a 0, e o último clique volta a contar até 1. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> contagem++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> A variável fica a 2, mas ninguém a escreve na etiqueta. Sem `numero.setText(…)` a janela continua a mostrar 0. Calcular e mostrar são duas coisas diferentes. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("Cliques: 0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("Cliques: " + contagem + 1); - }); -klicks: +1 -- Cliques: 2 -- Cliques: 1 -- [x] Cliques: 11 -> A armadilha dos parênteses: o Java calcula da esquerda para a direita. `"Cliques: " + contagem` dá o texto “Cliques: 1”, e `+ 1` junta mais um 1 no fim. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton um = new JButton("+1"); - JButton dez = new JButton("+10"); - um.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - dez.addActionListener(e -> { - contagem += 10; - numero.setText("" + contagem); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Os dois ouvintes alteram a mesma variável: 10, depois 11, depois 21. `contagem += 10` é a forma curta de `contagem = contagem + 10`. -::: - -## Tarefa: contador de cliques - -Reconstrói o contador de cliques e acrescenta: - -- um botão **−1** que subtrai um, -- o número nunca deve ficar abaixo de 0. Se estiver em 0, o −1 não faz nada. - -**Terminaste quando …** - -- **+1** conta mais um e **−1** conta menos um, -- no 0 um clique em **−1** não muda nada, -- **Reset** volta a pôr o número em 0. - -::: ludwig -Para “nunca abaixo de 0”, o ouvinte do −1 precisa de um `if`: só se `contagem > 0` é que subtrai. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar porque é que um ouvinte não pode alterar uma variável do main. → A primeira tentativa -- Consigo criar uma variável static na classe. → Uma variável para a classe toda -- Consigo fazer com que dois botões alterem o mesmo número. → O programa completo -- Consigo construir um contador com −1 que nunca fica abaixo de 0. → Tarefa: contador de cliques -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que o ouvinte não pode alterar a variável contagem do main? -→ A primeira tentativa -- [ ] Porque no Swing não são permitidos números -- [x] Porque o ouvinte só corre mais tarde e o Java não deixa a seta alterar variáveis do main -- [ ] Porque a contagem fica demasiado grande - -? Onde fica static int contagem = 0;? -→ Uma variável para a classe toda -- [ ] No main, bem em cima -- [x] Na classe, fora do main -- [ ] No ouvinte - -? O que faz SwingConstants.CENTER em new JLabel("0", SwingConstants.CENTER)? -→ O programa completo -- [x] Põe o texto no meio da etiqueta. -- [ ] Põe a janela no meio do ecrã. -- [ ] Aumenta a letra. -::: diff --git a/web/lessons/pt/33-ampel.md b/web/lessons/pt/33-ampel.md deleted file mode 100644 index 0549eab8..00000000 --- a/web/lessons/pt/33-ampel.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -titel: Um semáforo com cores -bereich: Janelas com Swing -kurz: Definir cores de fundo e mudar um semáforo com uma variável de estado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pintar uma etiqueta com setOpaque e setBackground -- guardar um estado numa variável static -- usar o BorderLayout para pôr algo grande no meio e algo estreito em baixo -- explicar para que servem o FlowLayout, o GridLayout e o BorderLayout -- programar um semáforo com quatro fases -::: - -## O objetivo - -Vamos construir um semáforo: uma área grande acende a vermelho. A cada clique em **Seguinte** muda: vermelho, verde, amarelo e outra vez vermelho. - -As novidades desta vez são as **cores** e um **estado**: o programa tem de se lembrar de que cor está acesa. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Cores no Swing - -As cores estão na classe `Color` de `java.awt`. Cores já prontas são, por exemplo, `Color.RED`, `Color.GREEN`, `Color.YELLOW`, `Color.ORANGE` e `Color.WHITE`. - -É assim que pintas uma etiqueta: - -```java -JLabel luz = new JLabel("", SwingConstants.CENTER); -luz.setOpaque(true); -luz.setBackground(Color.RED); -``` - -- `setBackground(…)` define a cor de fundo. -- Um `JLabel` precisa ainda de `setOpaque(true)`. Sem esta linha o fundo é transparente e a cor fica invisível. - -::: ludwig -`opaque` é inglês para “opaco”, ou seja, não transparente. Normalmente uma etiqueta é transparente, como letras escritas num vidro. Só com `setOpaque(true)` ganha uma área própria que se pode pintar. -::: - -::: quiz -? Que linha pinta de verde o fundo da etiqueta `luz`? -- [ ] `luz.setText(Color.GREEN);` -- [x] `luz.setBackground(Color.GREEN);` -- [ ] `luz.setColor("verde");` -> A cor de fundo define-se com `setBackground`. Para se ver, um `JLabel` precisa antes de `setOpaque(true)`. -::: - -## Lembrar a cor - -Para o semáforo saber o que vem a seguir, guarda o seu estado num número: 0 é vermelho, 1 é verde, 2 é amarelo. Tal como no contador de cliques da lição 32, a variável fica na classe, para o ouvinte a poder alterar: - -```java -static int fase = 0; -``` - -A cada clique a fase avança um. Depois do amarelo (2) vem outra vez o vermelho (0): - -```java -seguinte.addActionListener(e -> { - fase++; - if (fase > 2) { - fase = 0; - } - if (fase == 0) { - luz.setBackground(Color.RED); - } else if (fase == 1) { - luz.setBackground(Color.GREEN); - } else { - luz.setBackground(Color.YELLOW); - } -}); -``` - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; - -public class Semaforo { - static int fase = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Semáforo"); - janela.setSize(200, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new BorderLayout()); - - JLabel luz = new JLabel("", SwingConstants.CENTER); - luz.setOpaque(true); - luz.setBackground(Color.RED); - JButton seguinte = new JButton("Seguinte"); - - seguinte.addActionListener(e -> { - fase++; - if (fase > 2) { - fase = 0; - } - if (fase == 0) { - luz.setBackground(Color.RED); - } else if (fase == 1) { - luz.setBackground(Color.GREEN); - } else { - luz.setBackground(Color.YELLOW); - } - }); - - janela.add(luz, BorderLayout.CENTER); - janela.add(seguinte, BorderLayout.SOUTH); - janela.setVisible(true); - } -} -``` - -Aqui entra um layout novo, o **BorderLayout**. Tem cinco lugares: `NORTH` (em cima), `SOUTH` (em baixo), `WEST` (à esquerda), `EAST` (à direita) e `CENTER` (no meio). O meio fica com todo o espaço que sobra. Assim a luz fica grande e o botão fica estreito em baixo. - -::: angeberwissen -O BorderLayout é o layout que um `JFrame` usa quando não lhe dás nenhum. Um `add` sem indicação de lugar vai para o `CENTER`. É por isso que na lição 31 as peças ficaram todas umas por cima das outras. -::: - -::: angeberwissen -Os profissionais avançam a fase numa linha: `fase = (fase + 1) % 3;`. O operador de resto `%` dá o resto da divisão. 3 % 3 é 0, por isso depois do 2 recomeça no 0. -::: - -## Que layout para quê? - -Já conheces três layouts. Cada um arruma os blocos de outra maneira: - -| Layout | Como arruma | Bom para | -|---|---|---| -| `FlowLayout` (lição 29) | lado a lado, como palavras numa linha, cada bloco do tamanho necessário | alguns botões numa fila | -| `GridLayout` (lição 31) | uma grelha de células do mesmo tamanho, preenchida linha a linha | formulários, teclados como o da calculadora | -| `BorderLayout` (esta lição) | cinco lugares: em cima, em baixo, à esquerda, à direita e o meio, que fica com o resto | algo grande no meio, por exemplo uma imagem ou um mostrador, com botões na margem | - -Sem `setLayout`, uma janela usa o BorderLayout. É por isso que, nesse caso, tudo vai para o meio. - -::: ludwig -Ao planear, pergunta-te: todas as partes devem ter o mesmo tamanho? Então GridLayout. Uma parte deve ser grande e o resto estreito na margem? Então BorderLayout. As partes devem simplesmente manter o tamanho normal? Então FlowLayout. -::: - -## Jogo: Onde fica o botão? - -::: spiel layout -titel: Jogo: Onde fica o botão? -intro: Já conheces três layouts e a janela sem layout nenhum. O Ludwig mostra-te código com os botões A, B, C … Como fica a janela? Toca na imagem certa. -frage: Como fica a janela? - -runde: - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Sem layout próprio, cada `add` vai para o meio, do tamanho da janela. Os três ficam uns por cima dos outros e só se vê o último: C. - -runde: - janela.setLayout(new FlowLayout()); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> O FlowLayout põe os botões no tamanho normal lado a lado, como palavras numa linha, e centra-os. - -runde: - janela.setLayout(new GridLayout(0, 1)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> Uma coluna e tantas linhas quantas forem precisas: tudo uns por baixo dos outros, cada linha com a mesma altura e tão larga como a janela. - -runde: - janela.setLayout(new GridLayout(0, 2)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); - janela.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Duas colunas. As células são preenchidas linha a linha, sempre primeiro à esquerda e depois à direita: A B, depois C D. - -runde: - janela.setLayout(new GridLayout(2, 3)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); - janela.add(new JButton("D")); - janela.add(new JButton("E")); - janela.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Primeiro vêm as linhas, depois as colunas: 2 linhas com 3 colunas cada. - -runde: - janela.setLayout(new GridLayout(0, 2)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Duas colunas, três botões: a primeira linha fica cheia, na segunda o C fica à esquerda e a célula da direita fica vazia. - -runde: - janela.setLayout(new BorderLayout()); - janela.add(new JButton("A"), BorderLayout.NORTH); - janela.add(new JButton("B"), BorderLayout.CENTER); - janela.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH é em cima, SOUTH em baixo. O meio fica com todo o espaço que sobra, por isso o B é grande. - -runde: - janela.setLayout(new BorderLayout()); - janela.add(new JButton("A"), BorderLayout.WEST); - janela.add(new JButton("B")); - janela.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST é à esquerda, EAST à direita. O B não tem lugar indicado e por isso vai para o CENTER. -::: - -## Tarefa: semáforo - -Reconstrói o semáforo e torna-o mais realista. Em alguns países, como a Alemanha, depois do vermelho acendem durante pouco tempo o vermelho e o amarelo juntos. Acrescenta por isso uma quarta fase: - -- 0: vermelho -- 1: vermelho e amarelo (usa `Color.ORANGE`) -- 2: verde -- 3: amarelo - -Extra: em cada fase, escreve também com `luz.setText(…)` o que o semáforo quer dizer, por exemplo “Parar” ou “Avançar”. - -**Terminaste quando …** - -- cada clique mostra a fase seguinte: vermelho, vermelho-amarelo (laranja), verde, amarelo, -- depois do amarelo volta o vermelho, -- no extra, cada fase mostra o texto certo. - -::: ludwig -Com quatro fases, depois do 3 vem o 0. Ajusta por isso o número em `if (fase > 2)`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pintar uma etiqueta com setOpaque e setBackground. → Cores no Swing -- Consigo guardar um estado numa variável static. → Lembrar a cor -- Consigo usar o BorderLayout para pôr algo grande no meio e algo estreito em baixo. → O programa completo -- Consigo explicar para que servem o FlowLayout, o GridLayout e o BorderLayout. → Que layout para quê? -- Consigo programar um semáforo com quatro fases. → Tarefa: semáforo -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que a cor fica invisível sem setOpaque(true)? -→ Cores no Swing -- [ ] Porque Color.RED não existe -- [x] Porque, sem isso, uma etiqueta é transparente -- [ ] Porque a janela é demasiado pequena - -? Que lugar do BorderLayout fica com o espaço que sobra? -→ O programa completo -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? fase é 2 e o ouvinte executa fase++ e depois if (fase > 2) { fase = 0; }. Que valor tem fase a seguir? -→ Lembrar a cor -- [x] 0 -- [ ] 2 -- [ ] 3 -> Depois de fase++ é 3, que é maior do que 2, por isso passa a 0. -::: diff --git a/web/lessons/pt/34-notenrechner.md b/web/lessons/pt/34-notenrechner.md deleted file mode 100644 index 0d29db31..00000000 --- a/web/lessons/pt/34-notenrechner.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -titel: Calculadora de notas na janela -bereich: Janelas com Swing -kurz: Escrever a percentagem, determinar o nível com else if e apanhar entradas erradas. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- transformar uma percentagem num nível com else if -- mostrar o nível na janela -- apanhar e avisar “abc” e valores fora de 0 a 100 -- testar um programa nos limites, por exemplo com 90 e 89 -::: - -## O objetivo - -Uma janela transforma a percentagem de um teste num nível: escreves a percentagem (0 a 100), clicas em **Calcular nível** e em baixo aparece o nível. - -Desta vez não há nenhuma peça nova do Swing. A novidade é que combinas tudo o que já sabes: campo de texto, botão, `else if` da lição 20 e try/catch da lição 22. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## A escala de níveis - -Usamos a escala de níveis do ensino básico: - -| Percentagem | Nível | -|---|---| -| 90 a 100 | 5 | -| 70 a 89 | 4 | -| 50 a 69 | 3 | -| 20 a 49 | 2 | -| 0 a 19 | 1 | - -Com `else if` verificas de cima para baixo. Ganha a primeira condição verdadeira: - -```java -int nivel; -if (percentagem >= 90) { - nivel = 5; -} else if (percentagem >= 70) { - nivel = 4; -} else if (percentagem >= 50) { - nivel = 3; -} else if (percentagem >= 20) { - nivel = 2; -} else { - nivel = 1; -} -``` - -::: ludwig -Com 75 %, `percentagem >= 90` é falso, mas `percentagem >= 70` é verdadeiro. Portanto nível 4, e as restantes condições já nem são verificadas. É por isso que basta sempre o limite de baixo. -::: - -Podes experimentar esta parte sem janela na área [Código](#zeige-codelive). Escreve `int percentagem = 75;` antes e `System.out.println("Nível: " + nivel);` depois. O estrutograma mostra-te as decisões encaixadas. - -::: quiz -? Que nota dá a tabela com 29 pontos? -- [ ] 4 -- [ ] 5 -- [x] 6 -> Todas as condições são falsas, também `pontos >= 30`. Então vale o ramo `else`. -::: - -## A janela - -```java -import javax.swing.*; -import java.awt.*; - -public class CalculadoraNiveis { - public static void main(String[] args) { - JFrame janela = new JFrame("Calculadora de níveis"); - janela.setSize(260, 180); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel pergunta = new JLabel("Percentagem (0 a 100):"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular nível"); - JLabel resultado = new JLabel("Nível: ?"); - - botao.addActionListener(e -> { - int percentagem = Integer.parseInt(campo.getText()); - int nivel; - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 20) { - nivel = 2; - } else { - nivel = 1; - } - resultado.setText("Nível: " + nivel); - }); - - janela.add(pergunta); - janela.add(campo); - janela.add(botao); - janela.add(resultado); - janela.setVisible(true); - } -} -``` - -Experimenta 100, 75, 50 e 12. - -## Apanhar entradas erradas - -Ainda há duas coisas que podem correr mal: - -1. Alguém escreve “abc”. Então `Integer.parseInt` lança uma `NumberFormatException`. -2. Alguém escreve 150 ou −5. É um número, mas não é uma percentagem válida. - -O primeiro caso apanhas com try/catch, o segundo com um `if` antes de calcular o nível: - -```java -botao.addActionListener(e -> { - try { - int percentagem = Integer.parseInt(campo.getText()); - if (percentagem < 0 || percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - // aqui o cálculo do nível de cima - } - } catch (NumberFormatException erro) { - resultado.setText("Isso não é um número."); - } -}); -``` - -::: ludwig -`||` quer dizer “ou” (lição 9). A condição é verdadeira se a percentagem for demasiado pequena **ou** demasiado grande. -::: - -## Jogo: Que nível? - -::: spiel frage -titel: Jogo: Que nível? -intro: O Ludwig construiu calculadoras de níveis, mas nem todas estão certas. Calcula que nível sai. Seis rondas. - -runde: - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else { - nivel = 2; - } -frage: percentagem é 70. Que nível sai? -- 5 -- [x] 4 -- 3 -> 70 >= 90 é falso, 70 >= 70 é verdadeiro. O limite ainda pertence ao 4. - -runde: - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 20) { - nivel = 2; - } else { - nivel = 1; - } -frage: percentagem é 49. Que nível sai? -- 3 -- [x] 2 -- 1 -> 49 >= 50 é falso por pouco, 49 >= 20 é verdadeiro. Portanto nível 2. - -runde: - if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 90) { - nivel = 5; - } else { - nivel = 1; - } -frage: percentagem é 95. Que nível sai? -- 5 -- [x] 3 -- 1 -> Ganha a primeira condição verdadeira. 95 >= 50 já é verdadeiro, o 5 nunca é alcançado. Por isso verifica-se das percentagens altas para baixo. - -runde: - nivel = 1; - if (percentagem >= 20) { - nivel = 2; - } - if (percentagem >= 50) { - nivel = 3; - } -frage: percentagem é 80. Que valor tem nivel depois? -- 1 -- 2 -- [x] 3 -> Sem `else`, todos os `if` são verificados. Os dois são verdadeiros, e o último dá o nível 3. - -runde: - // nivel já está calculado - if (percentagem < 0 || percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - resultado.setText("Nível: " + nivel); - } -frage: No campo de texto está 100. O que mostra a janela? -- [x] Nível: 5 -- Escreve um valor de 0 a 100. -- Isso não é um número. -> 100 > 100 é falso. Portanto 100 é válido e dá o nível 5. - -runde: - // nivel já está calculado - if (percentagem < 0 && percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - resultado.setText("Nível: " + nivel); - } -frage: No campo de texto está 150. O que mostra a janela? -- Escreve um valor de 0 a 100. -- [x] um nível, embora 150 não seja válido -- Isso não é um número. -> Com `&&`, a percentagem teria de ser ao mesmo tempo menor que 0 e maior que 100. Isso nunca acontece, por isso o programa nunca avisa. O certo é `||`. -::: - -## Tarefa: calculadora de níveis - -Junta a calculadora de níveis, com as duas verificações do último passo. Testa com 90, 89, 0, 100, 101 e “dez”. - -Extra: escreve também a menção do nível, por exemplo “Nível: 4 (Bom)”. As menções são Muito bom, Bom, Suficiente, Insuficiente e Fraco. - -**Terminaste quando …** - -- 92 e 100 dão 1, 91 dá 2 e 0 dá 6, -- 101 mostra o aviso para escrever 0 a 100, -- um texto como “dez” mostra um aviso e o programa continua a funcionar. - -::: ludwig -Testa sempre os limites: 90 tem de dar 5, 89 tem de dar 4. É nos limites que se escondem a maioria dos erros, por exemplo `>` em vez de `>=`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo transformar uma percentagem num nível com else if. → A escala de níveis -- Consigo mostrar o nível na janela. → A janela -- Consigo apanhar e avisar “abc” e valores fora de 0 a 100. → Apanhar entradas erradas -- Consigo testar um programa nos limites, por exemplo com 90 e 89. → Tarefa: calculadora de níveis -::: - -## Teste de conhecimentos - -::: quiz -? Que nível dá a escala com 70 %? -→ A escala de níveis -- [ ] 3 -- [x] 4 -- [ ] 5 -> 70 é o limite de baixo do nível 4. - -? Porque é que em cada condição basta o limite de baixo? -→ A escala de níveis -- [x] Porque o else if já separou antes os casos mais altos -- [ ] Porque o Java não conhece limites de cima -- [ ] Porque a percentagem é sempre 100 - -? Que condição deteta percentagens inválidas? -→ Apanhar entradas erradas -- [ ] percentagem < 0 && percentagem > 100 -- [x] percentagem < 0 || percentagem > 100 -- [ ] percentagem >= 0 || percentagem <= 100 -> Um número não pode ser ao mesmo tempo menor do que 0 e maior do que 100, por isso é preciso o ou. -::: diff --git a/web/lessons/pt/35-taschenrechner.md b/web/lessons/pt/35-taschenrechner.md deleted file mode 100644 index d98fc585..00000000 --- a/web/lessons/pt/35-taschenrechner.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -titel: Uma calculadora -bereich: Janelas com Swing -kurz: Duas colunas com GridLayout, quatro botões de cálculo e apanhar a divisão por 0. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir duas colunas com GridLayout -- explicar porque é que "" + (a + b) precisa de parênteses -- programar os quatro botões de cálculo -- construir uma calculadora que não falha com 0 nem com “abc” -::: - -## O objetivo - -Vamos construir uma pequena calculadora: dois campos de texto para os números, quatro botões **+**, **-**, **\*** e **/** e uma linha para o resultado. - -As novidades desta vez são **duas colunas** no GridLayout e **vários botões** que calculam todos com os mesmos campos de texto. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Duas colunas - -Até agora, com `GridLayout(0, 1)`, ficava tudo umas por baixo das outras. Com `GridLayout(0, 2)` há duas colunas. As peças preenchem as células pela ordem das linhas `add`, sempre primeiro à esquerda e depois à direita: - -| esquerda | direita | -|---|---| -| Primeiro número: | campo de texto | -| Segundo número: | campo de texto | -| + | - | -| \* | / | -| Resultado: | ? | - -As etiquetas da esquerda não vais precisar delas mais tarde. Por isso podes construí-las logo dentro do `add`, sem variável: - -```java -janela.add(new JLabel("Primeiro número:")); -janela.add(campo1); -``` - -## A janela com o primeiro botão - -```java -import javax.swing.*; -import java.awt.*; - -public class Calculadora { - public static void main(String[] args) { - JFrame janela = new JFrame("Calculadora"); - janela.setSize(280, 220); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 2)); - - JTextField campo1 = new JTextField(); - JTextField campo2 = new JTextField(); - JButton mais = new JButton("+"); - JButton menos = new JButton("-"); - JButton vezes = new JButton("*"); - JButton dividir = new JButton("/"); - JLabel resultado = new JLabel("?"); - - mais.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a + b)); - }); - - janela.add(new JLabel("Primeiro número:")); - janela.add(campo1); - janela.add(new JLabel("Segundo número:")); - janela.add(campo2); - janela.add(mais); - janela.add(menos); - janela.add(vezes); - janela.add(dividir); - janela.add(new JLabel("Resultado:")); - janela.add(resultado); - janela.setVisible(true); - } -} -``` - -Escreve 3 e 4 e clica em +. Em baixo aparece 7. - -::: ludwig -Atenção aos parênteses em `"" + (a + b)`. Sem eles, o Java calcula da esquerda para a direita: `"" + a` dá o texto “3”, e `"3" + b` junta o 4 no fim. Sai “34” em vez de 7. O parêntese garante que primeiro se faz a conta. -::: - -## Os outros três botões - -Os botões -, \* e / funcionam da mesma maneira. Só muda o sinal na última linha: - -```java -menos.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a - b)); -}); -``` - -O / tem duas particularidades: - -- Com `int`, o Java corta as casas decimais ao dividir. 7 / 2 dá 3. -- Se o segundo número for 0, o Java lança uma `ArithmeticException`, como na tarefa “Dividir em segurança” da lição 22. - -## Apanhar a divisão por 0 - -```java -dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } -}); -``` - -::: angeberwissen -Com `double` e `Double.parseDouble(…)` há casas decimais: 7 / 2 dá 3.5. Em contrapartida, com números decimais o Java não lança nenhuma exceção ao dividir por 0. O resultado é então `Infinity`, ou seja, “infinito”. -::: - -::: quiz -? O que mostra a calculadora com 8 a dividir por 0? -- [ ] 0 -- [ ] Infinity -- [x] Não se divide por 0! -> Com `int`, `a / b` lança uma `ArithmeticException`. O `catch` apanha-a e mostra o aviso. -::: - -## Um método próprio - -Isto não está no programa da disciplina, mas torna o código mais curto. - -::: angeberwissen -Cada ouvinte lê os mesmos dois campos. Podes passar esta repetição para um método próprio, um subprograma como na lição 18. Fica na classe, ao lado do `main`: - -`static int numero(JTextField campo) { return Integer.parseInt(campo.getText()); }` - -No ouvinte basta então escrever `resultado.setText("" + (numero(campo1) + numero(campo2)));`. -::: - -## Jogo: O que mostra a calculadora? - -::: spiel frage -titel: Jogo: O que mostra a calculadora? -intro: O Ludwig andou a mexer na calculadora. Lê o ouvinte e prevê o que aparece no resultado. Seis rondas. - -runde: - mais.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + a + b); - }); -frage: Escreves 3 e 4 e clicas em +. O que aparece no resultado? -- 7 -- [x] 34 -- 12 -> Sem parênteses, o Java trabalha da esquerda para a direita: `"" + 3` é o texto "3", e `+ 4` junta o 4 no fim. - -runde: - vezes.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + a * b); - }); -frage: Escreves 3 e 4 e clicas em *. O que aparece no resultado? -- 34 -- [x] 12 -- 7 -> A multiplicação vem antes da soma também aqui: o Java calcula primeiro 3 * 4 e depois junta o 12 ao texto. O mais não tem esta prioridade, por isso precisa dos parênteses. - -runde: - dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a / b)); - }); -frage: Escreves 7 e 2 e clicas em /. O que aparece no resultado? -- 3.5 -- [x] 3 -- 4 -> Com `int`, o Java corta as casas decimais. Não arredonda. - -runde: - dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } - }); -frage: Escreves 8 e 0 e clicas em /. O que aparece no resultado? -- 0 -- [x] Não se divide por 0! -- Infinity -> Com `int`, dividir por 0 lança uma ArithmeticException, e o `catch` escreve o aviso. - -runde: - dividir.addActionListener(e -> { - double a = Double.parseDouble(campo1.getText()); - double b = Double.parseDouble(campo2.getText()); - resultado.setText("" + (a / b)); - }); -frage: Escreves 7 e 2 e clicas em /. O que aparece no resultado? -- 3 -- [x] 3.5 -- 3.0 -> Com `double`, as casas decimais ficam. - -runde: - dividir.addActionListener(e -> { - double a = Double.parseDouble(campo1.getText()); - double b = Double.parseDouble(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } - }); -frage: Escreves 8 e 0 e clicas em /. O que aparece no resultado? -- Não se divide por 0! -- [x] Infinity -- 0.0 -> Com `double` não há exceção. O resultado é `Infinity`, ou seja "infinito", e o `catch` nunca chega a entrar. -::: - -## Tarefa: calculadora - -Acaba a calculadora: - -- os quatro botões calculam, -- o / avisa “Não se divide por 0!” em vez de falhar, -- se um campo tiver “abc” ou estiver vazio, aparece “Escreve dois números”. - -Extra: um quinto botão **C** esvazia os dois campos e volta a pôr o resultado em “?”. - -**Terminaste quando …** - -- 7 e 2 dão 9, 5, 14 e 3 em +, −, * e /, -- 7 / 0 mostra a mensagem de não dividir por 0, -- “abc” ou um campo vazio mostra a mensagem para escrever dois números e nada falha. - -::: ludwig -Para o “abc” cada ouvinte precisa de um try/catch com `NumberFormatException`. Depois de um `try` também podem vir dois `catch`, um para `NumberFormatException` e outro para `ArithmeticException`. Já agora: um campo vazio dá o texto `""`, e isso também não é um número. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir duas colunas com GridLayout(0, 2). → Duas colunas -- Consigo explicar porque é que "" + (a + b) precisa de parênteses. → A janela com o primeiro botão -- Consigo programar os quatro botões de cálculo. → Os outros três botões -- Consigo construir uma calculadora que não falha com 0 nem com “abc”. → Tarefa: calculadora -::: - -## Teste de conhecimentos - -::: quiz -? a é 3 e b é 4. Quanto dá "" + a + b? -→ A janela com o primeiro botão -- [ ] 7 -- [x] 34 -- [ ] Um erro -> O Java calcula da esquerda para a direita: primeiro surge o texto "3", depois junta-se o 4. - -? Quanto dá 7 / 2 com int? -→ Os outros três botões -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? Por que ordem preenche o GridLayout(0, 2) as células? -→ Duas colunas -- [x] Linha a linha, primeiro à esquerda e depois à direita -- [ ] Coluna a coluna, começando de cima para baixo na coluna da esquerda -- [ ] Ao acaso -::: diff --git a/web/lessons/pt/36-zahlenraten.md b/web/lessons/pt/36-zahlenraten.md deleted file mode 100644 index 51330f45..00000000 --- a/web/lessons/pt/36-zahlenraten.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -titel: Adivinha o número -bereich: Janelas com Swing -kurz: Um jogo com número aleatório, contagem de tentativas e um botão que se desliga no fim. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar com Math.random um número inteiro aleatório de 1 a 100 -- decidir que variáveis pertencem à classe -- desligar um botão com setEnabled -- construir um jogo de adivinhar com um botão “Novo jogo” -::: - -## O objetivo - -Agora um jogo: o computador pensa num número de 1 a 100. Tu adivinhas, e a janela diz-te “demasiado pequeno” ou “demasiado grande”. Quando o encontrares, diz-te quantas tentativas precisaste. - -As novidades desta vez são os **números aleatórios** e um botão que se **desliga** no fim. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Um número aleatório - -`Math.random()` dá um número decimal aleatório de 0 até quase 1, por exemplo 0.4173. Em três passos transforma-se num número inteiro de 1 a 100: - -```java -int secreto = (int) (Math.random() * 100) + 1; -``` - -| Passo | Exemplo | -|---|---| -| `Math.random()` | 0.4173 | -| `* 100` | 41.73 | -| `(int)` corta as casas decimais | 41 | -| `+ 1` | 42 | - -Sem o `+ 1` sairia de 0 a 99. - -Experimenta na área [Código](#zeige-codelive): `int secreto = (int) (Math.random() * 100) + 1;` e `System.out.println(secreto);`. Cada execução dá um número diferente. - -::: angeberwissen -Na verdade, os computadores não sabem lançar dados. O `Math.random()` calcula com uma fórmula uma longa sequência de números que só **parecem** aleatórios. Chamam-se números pseudoaleatórios. Para jogos chega perfeitamente. -::: - -## O que o jogo guarda - -O jogo tem de se lembrar de duas coisas ao longo de todos os cliques: o número secreto e o número de tentativas. Tal como no contador de cliques da lição 32, as duas ficam na classe: - -```java -static int secreto = (int) (Math.random() * 100) + 1; -static int tentativas = 0; -``` - -::: quiz -? Porque é que `secreto` e `tentativas` estão na classe e não no `main`? -- [ ] Porque `Math.random()` só funciona na classe -- [x] Porque têm de durar ao longo de todos os cliques e o ouvinte tem de alterar `tentativas` -- [ ] Porque o `main` não consegue guardar números -> Como no contador de cliques: o ouvinte não pode alterar variáveis do `main`. -::: - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; - -public class AdivinhaNumero { - static int secreto = (int) (Math.random() * 100) + 1; - static int tentativas = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Adivinha o número"); - janela.setSize(320, 180); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel dica = new JLabel("Estou a pensar num número de 1 a 100."); - JTextField campo = new JTextField(); - JButton botao = new JButton("Adivinhar"); - - botao.addActionListener(e -> { - int palpite = Integer.parseInt(campo.getText()); - tentativas++; - if (palpite < secreto) { - dica.setText(palpite + " é demasiado pequeno."); - } else if (palpite > secreto) { - dica.setText(palpite + " é demasiado grande."); - } else { - dica.setText("Certo! Precisaste de " + tentativas + " tentativas."); - botao.setEnabled(false); - } - campo.setText(""); - }); - - janela.add(dica); - janela.add(campo); - janela.add(botao); - janela.setVisible(true); - } -} -``` - -- `campo.setText("")` esvazia o campo de texto depois de cada palpite, para escreveres logo o seguinte. -- `botao.setEnabled(false)` desliga o botão. Fica cinzento e já não se pode clicar. O jogo acabou. - -::: ludwig -Com `setEnabled(true)` voltas a ligar um botão. Assim podes, por exemplo, só ativar um botão depois de alguém ter escrito alguma coisa. -::: - -## Ganhar com 7 tentativas - -::: angeberwissen -Quem adivinha com jeito nunca precisa de mais de 7 tentativas. Escolhe sempre o meio do intervalo que ainda resta: primeiro 50, depois 25 ou 75 e assim por diante. Cada palpite corta o intervalo a meio: 100, 50, 25, 13, 7, 4, 2, 1. É a **pesquisa binária** da lição 19. Como 2 elevado a 7 = 128 é maior do que 100, chegam 7 palpites. -::: - -## Tarefa: adivinha o número - -Reconstrói o jogo e melhora-o: - -- Uma entrada como “abc” não conta como tentativa e mostra a dica “Escreve um número”. -- Um segundo botão **Novo jogo** pensa num número novo, põe as tentativas a 0, volta a ligar o botão Adivinhar e repõe a dica. - -Extra: depois de 7 tentativas falhadas o jogo está perdido. A janela revela então o número secreto. - -**Terminaste quando …** - -- cada palpite errado mostra “demasiado pequeno” ou “demasiado grande”, -- “abc” mostra o aviso para escrever um número e as tentativas não mudam, -- **Novo jogo** põe as tentativas a 0, volta a ligar o botão de adivinhar e repõe o aviso. - -::: ludwig -Para “não conta como tentativa”, o `tentativas++` tem de vir **depois** de `Integer.parseInt`, os dois dentro do bloco `try`. Se o `parseInt` lançar uma exceção, a linha com `tentativas++` é saltada. -::: - -## Jogo: Demasiado pequeno ou demasiado grande? - -::: spiel frage -titel: Jogo: Demasiado pequeno ou demasiado grande? -intro: O Ludwig está a jogar ao adivinha o número. Lê o código e prevê o que acontece. Sete rondas. - -runde: - // secreto é 42 - if (palpite < secreto) { - dica.setText(palpite + " é demasiado pequeno."); - } else if (palpite > secreto) { - dica.setText(palpite + " é demasiado grande."); - } else { - dica.setText("Certo!"); - } -frage: O Ludwig escreve 50. O que diz a dica? -- 50 é demasiado pequeno. -- [x] 50 é demasiado grande. -- Certo! -> 50 é maior do que 42. - -runde: -frage: O número está entre 1 e 100. 50 era demasiado grande, 25 era demasiado pequeno. Que número é que o Ludwig, esperto, tenta a seguir? -- 26 -- [x] 37 -- 49 -> Sobram 26 a 49. O meio é 37 (ou 38). Assim, cada palpite corta o intervalo a meio. - -runde: - int dado = (int) (Math.random() * 6) + 1; -frage: Que números pode ter `dado`? -- 0 a 6 -- [x] 1 a 6 -- 1 a 7 -> `Math.random() * 6` vai de 0 até um pouco menos de 6. `(int)` faz disso 0 a 5, e `+ 1` faz 1 a 6. Um dado! - -runde: - int numero = (int) (Math.random() * 10); -frage: Que números pode ter `numero`? -- [x] 0 a 9 -- 1 a 10 -- 0 a 10 -> Sem `+ 1` começa em 0, e o 10 nunca é alcançado. - -runde: - // secreto é 42 - tentativas++; - if (palpite == secreto) { - dica.setText("Certo! Precisaste de " + tentativas + " tentativas."); - } -frage: O Ludwig escreve 50, depois 25, depois 42. O que diz a dica no fim? -- Certo! Precisaste de 2 tentativas. -- [x] Certo! Precisaste de 3 tentativas. -- Certo! Precisaste de 42 tentativas. -> `tentativas++` conta a cada clique, também no acerto. - -runde: - botao.setEnabled(false); -frage: O Ludwig encontrou o número e clica mais uma vez em **Adivinhar**. O que acontece? -- O jogo recomeça. -- Conta mais uma tentativa. -- [x] Nada, o botão fica cinzento e não se pode clicar. -> `setEnabled(false)` desliga o botão. - -runde: -frage: Agora o número está entre 1 e 1000. Quantos palpites são precisos, no máximo, com a pesquisa binária? -- 7 -- [x] 10 -- 500 -> 2 elevado a 10 = 1024 é maior do que 1000. Dez divisões a meio chegam. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar com Math.random um número inteiro aleatório de 1 a 100. → Um número aleatório -- Consigo decidir que variáveis pertencem à classe. → O que o jogo guarda -- Consigo desligar um botão com setEnabled. → O programa completo -- Consigo construir um jogo de adivinhar com um botão “Novo jogo”. → Tarefa: adivinha o número -::: - -## Teste de conhecimentos - -::: quiz -? Que números dá (int) (Math.random() * 100) + 1? -→ Um número aleatório -- [ ] 0 a 100 -- [x] 1 a 100 -- [ ] 1 a 101 - -? O que faz botao.setEnabled(false)? -→ O programa completo -- [ ] Tira o botão da janela. -- [x] O botão fica cinzento e já não se pode clicar. -- [ ] Muda o texto do botão. - -? Com a pesquisa binária, quantas tentativas precisas no máximo para 1 a 100? -→ Tarefa: adivinha o número -- [ ] 50 -- [ ] 10 -- [x] 7 -> Cada palpite corta o intervalo a meio, e 2 elevado a 7 = 128 é maior do que 100. -::: diff --git a/web/lessons/pt/37-viele-knoepfe-ein-zuhoerer.md b/web/lessons/pt/37-viele-knoepfe-ein-zuhoerer.md deleted file mode 100644 index b6c3a01b..00000000 --- a/web/lessons/pt/37-viele-knoepfe-ein-zuhoerer.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -titel: Muitos botões, um ouvinte -bereich: Janelas com Swing -kurz: Um ouvinte para muitos botões e descobrir com getActionCommand e getSource qual foi o botão clicado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- guardar um ouvinte numa variável do tipo ActionListener e registá-lo em vários botões -- explicar o que devolvem getActionCommand e getSource -- pôr botões num JPanel com um ciclo -- construir um cadeado que só abre com o código certo -::: - -## O objetivo - -Desde a história do bolo, o Ludwig quer trancar o seu estábulo. Ele constrói um **cadeado de código**: nove teclas com algarismos, um zero, **C** para apagar e **OK** para verificar. Só quem escrever 1234 recebe "Portão aberto!". - -São doze botões. Até agora, cada botão tinha o seu próprio ouvinte, como na calculadora da lição 35. Hoje aprendes como **um** ouvinte chega para todos os botões. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Nove ouvintes quase iguais - -Com um ouvinte por tecla ficaria assim: - -```java -um.addActionListener(e -> visor.setText(visor.getText() + "1")); -dois.addActionListener(e -> visor.setText(visor.getText() + "2")); -tres.addActionListener(e -> visor.setText(visor.getText() + "3")); -// ... e assim por diante até 9 -``` - -As linhas só se distinguem pelo algarismo. Quem quiser mudar um pormenor tem de o fazer nove vezes e de certeza que se esquece de uma linha. - -## Um ouvinte numa variável - -Um ouvinte também pode ficar numa **variável**. O seu tipo de dados é `ActionListener`, o contrato da lição 30. Depois registas o mesmo ouvinte em vários botões: - -```java -ActionListener algarismo = e -> visor.setText(visor.getText() + e.getActionCommand()); - -um.addActionListener(algarismo); -dois.addActionListener(algarismo); -tres.addActionListener(algarismo); -``` - -`ActionListener` está no pacote `java.awt.event`. Por isso precisas de `import java.awt.event.*;` lá em cima. - -Agora o código só existe uma vez. Mas como sabe o ouvinte que algarismo deve acrescentar? - -## Quem clicou? - -O `e` antes da seta é o **evento**, um objeto do tipo `ActionEvent`. O botão entrega-o a cada clique, e lá dentro está o que aconteceu: - -| Chamada | Devolve | Exemplo | -|---|---|---| -| `e.getActionCommand()` | a legenda do botão clicado, como texto | `"7"` | -| `e.getSource()` | o próprio botão clicado | o botão `ok` | - -- `getActionCommand()` dá jeito quando a legenda já diz o que fazer, como nos algarismos. -- `getSource()` compara-se com um botão usando `==`: `if (e.getSource() == ok)`. Aqui `==` está certo, porque se trata exatamente deste objeto, não de um texto. - -::: ludwig -Textos comparas com `equals`, botões com `==`. Se quiseres decidir pela legenda, escreves `e.getActionCommand().equals("OK")`. Também funciona, mas deixa de funcionar assim que alguém mudar a legenda para "Abrir". `e.getSource() == ok` continua certo. -::: - -## Botões num ciclo - -Com um ouvinte partilhado, podes até criar as teclas dos algarismos num ciclo. Para ficarem bem arrumadas numa grelha, vão para um **JPanel**. Um JPanel é uma área na janela com o seu próprio layout: - -```java -JPanel teclas = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton algarismo = new JButton("" + i); - algarismo.addActionListener(tecla); - teclas.add(algarismo); -} -``` - -- `"" + i` transforma o número `i` no texto da legenda. -- Em cada volta nasce um botão novo. Todos recebem o mesmo ouvinte `tecla`. -- `janela.add(teclas, BorderLayout.CENTER)` põe a área inteira, com todas as teclas, na janela. - -::: quiz -? Quantos botões e quantos ouvintes cria este ciclo? -- [ ] 9 botões e 9 ouvintes -- [x] 9 botões e 1 ouvinte -- [ ] 1 botão e 9 ouvintes -> Em cada passagem nasce um botão novo. Todos recebem o mesmo ouvinte `tecla`. -::: - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Cadeado { - public static void main(String[] args) { - JFrame janela = new JFrame("Cadeado de código"); - janela.setSize(240, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new BorderLayout()); - - JLabel visor = new JLabel("", SwingConstants.CENTER); - JPanel teclas = new JPanel(new GridLayout(0, 3)); - JButton apagar = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener tecla = e -> { - if (e.getSource() == apagar) { - visor.setText(""); - } else if (e.getSource() == ok) { - if (visor.getText().equals("1234")) { - visor.setText("Portão aberto!"); - } else { - visor.setText("Errado"); - } - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton algarismo = new JButton("" + i); - algarismo.addActionListener(tecla); - teclas.add(algarismo); - } - JButton zero = new JButton("0"); - zero.addActionListener(tecla); - apagar.addActionListener(tecla); - ok.addActionListener(tecla); - teclas.add(apagar); - teclas.add(zero); - teclas.add(ok); - - janela.add(visor, BorderLayout.NORTH); - janela.add(teclas, BorderLayout.CENTER); - janela.setVisible(true); - } -} -``` - -- `apagar` e `ok` são criados **antes** do ouvinte, porque o ouvinte compara com eles. -- O ouvinte verifica primeiro os dois botões especiais. Todos os outros são algarismos e acrescentam a sua legenda. - -::: angeberwissen -O teclado do telefone tem o 1 em cima à esquerda, o da calculadora e do teclado do computador tem o 7 em cima à esquerda. Porquê? Quando chegaram os telefones de teclas, fizeram-se testes com pessoas que tinham de marcar números com eles. Com o 1 em cima eram mais rápidas, e as máquinas de calcular já tinham a sua disposição há muito tempo. O cadeado do Ludwig faz como o telefone. -::: - -## Jogo: Quem clicou? - -::: spiel zuhoerer -titel: Jogo: Quem clicou? -intro: Em cada ronda, **um** ouvinte está registado em vários botões. O Ludwig mostra-te o código, a janela e os cliques. O que fica no visor no fim? Depois o Ludwig reproduz os cliques. -frage: O que fica no visor depois dos cliques? - -runde: - JFrame janela = new JFrame("Letras"); - JLabel visor = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> visor.setText(visor.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> Um ouvinte, dois botões. `e.getActionCommand()` devolve de cada vez a legenda do botão clicado, e ela é acrescentada no fim. - -runde: - JFrame janela = new JFrame("Contador"); - static int numero = 0; - JLabel visor = new JLabel("0"); - JButton mais = new JButton("+"); - JButton menos = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == mais) { - numero++; - } else { - numero--; - } - visor.setText("" + numero); - }; - mais.addActionListener(z); - menos.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> `e.getSource()` diz qual foi o botão. Duas vezes mais, uma vez menos: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame janela = new JFrame("Letras"); - JLabel visor = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> visor.setText(visor.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> O ouvinte só está registado em A e B. Quando se clica em C, ninguém está a ouvir. - -runde: - JFrame janela = new JFrame("Teclas"); - JLabel visor = new JLabel(""); - JButton um = new JButton("1"); - JButton dois = new JButton("2"); - JButton apagar = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - visor.setText(""); - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - um.addActionListener(z); - dois.addActionListener(z); - apagar.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> Depois de 1 e 2 o visor mostra "12". C apaga tudo, e o último 1 fica sozinho. - -runde: - JFrame janela = new JFrame("Cadeado"); - JLabel visor = new JLabel(""); - JButton quatro = new JButton("4"); - JButton dois = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (visor.getText().equals("42")) { - visor.setText("Portão aberto!"); - } else { - visor.setText("Errado"); - } - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - quatro.addActionListener(z); - dois.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Portão aberto! -- [x] Errado -- 24OK -> Foi escrito "24", mas o segredo é "42". A ordem dos cliques conta. -::: - -## Tarefa: Cadeado de código - -Constrói o cadeado de código e experimenta-o. - -Depois melhora-o: - -- Depois de três tentativas erradas, o **OK** desliga-se, como o botão do Adivinha o número na lição 36. Conta as tentativas numa variável `static int` na classe. -- Extra: o visor mostra `*` em vez dos algarismos. Guarda a entrada verdadeira numa `static String entrada = "";` e acrescenta ao visor só uma estrela. - -**Terminaste quando …** - -- o código certo abre o cadeado e um errado não, -- depois de três tentativas erradas o **OK** fica desligado, -- no extra, o visor só mostra estrelas mas o código continua a ser verificado. - -::: ludwig -No ramo do **OK**, conta `tentativas++` a cada código errado e depois verifica `if (tentativas >= 3)`. Aí `ok.setEnabled(false)` desliga o botão, como no Adivinha o número. Para as estrelas: `entrada = entrada + e.getActionCommand();` e `visor.setText(visor.getText() + "*");`. Depois comparas `entrada`, não o texto do visor. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo guardar um ouvinte numa variável do tipo ActionListener e registá-lo em vários botões. → Um ouvinte numa variável -- Consigo explicar o que devolvem getActionCommand e getSource. → Quem clicou? -- Consigo pôr botões num JPanel com um ciclo. → Botões num ciclo -- Consigo construir um cadeado que só abre com o código certo. → Tarefa: Cadeado de código -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve e.getActionCommand() num clique no botão new JButton("7")? -→ Quem clicou? -- [ ] o número 7 -- [x] o texto "7" -- [ ] o próprio botão - -? Como verificas se foi clicado o botão ok? -→ Quem clicou? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource devolve o próprio botão, e esse comparas com ==. - -? Porque é que um ouvinte fica numa variável? -→ Um ouvinte numa variável -- [ ] Para correr mais depressa. -- [x] Para o poder registar em vários botões e escrever o código só uma vez. -- [ ] Porque senão os lambdas não são permitidos. - -? Liga. -→ Quem clicou? -= ActionListener -> tipo de dados de um ouvinte -= ActionEvent -> o evento e com a informação sobre o clique -= JPanel -> uma área com o seu próprio layout -::: diff --git a/web/lessons/pt/38-innere-klassen.md b/web/lessons/pt/38-innere-klassen.md deleted file mode 100644 index 2679783d..00000000 --- a/web/lessons/pt/38-innere-klassen.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -titel: Classes internas -bereich: Janelas com Swing -kurz: Escrever um ouvinte como classe interna com nome, como classe anónima e como lambda, e saber quem vê o quê. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- escrever um ouvinte como classe interna com nome -- escrever um ouvinte como classe anónima -- explicar o que fica de fora no lambda -- explicar que maneira de escrever vê que variáveis -- construir um contador com três botões escritos de três maneiras -::: - -## O objetivo - -O contador de cliques da lição 32 já conheces. Hoje escreves o seu ouvinte de **três maneiras**, que fazem todas exatamente o mesmo: - -1. como **classe interna com nome**, como se fazia quase sempre antes do Java 8, -2. como **classe anónima**, que conheces da lição 30 (“ActionListener é uma interface”), -3. como **lambda** com a seta, como até agora. - -Em código de outras pessoas, em livros e na internet vais encontrar as três. Depois desta lição vais reconhecê-las. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Lembrete: o contrato - -Um ouvinte é tudo o que cumpre o contrato `ActionListener`. Nele está exatamente um método: - -``` -public void actionPerformed(ActionEvent e) -``` - -O botão chama-o a cada clique. As três maneiras de escrever são três caminhos para fornecer este único método. - -## 1. A classe interna com nome - -Uma **classe interna** fica dentro de outra classe. Tem um nome, aqui `Mais`, e cumpre o contrato com `implements ActionListener`: - -```java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Contador { - static int contagem = 0; - static JLabel numero = new JLabel("0", SwingConstants.CENTER); - - static class Mais implements ActionListener { - public void actionPerformed(ActionEvent e) { - contagem++; - numero.setText("" + contagem); - } - } - - public static void main(String[] args) { - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JButton mais = new JButton("+1"); - JButton outro = new JButton("Também +1"); - mais.addActionListener(new Mais()); - outro.addActionListener(new Mais()); - - janela.add(numero); - janela.add(mais); - janela.add(outro); - janela.setVisible(true); - } -} -``` - -- `new Mais()` cria um objeto da classe `Mais`. É esse o ouvinte que o botão recebe. -- Como a classe tem nome, podes usá-la em vários botões, aqui em `mais` e `outro`. -- A classe está **fora** de `main`. Por isso só vê o que está na classe `Contador`: `contagem` e `numero`. É por isso que `numero` desta vez é uma variável da classe e não de `main`. -- Precisas de `static class` porque `main` é static. Sem `static`, o javac indica "non-static variable this cannot be referenced from a static context". - -## 2. A classe anónima - -Se só precisas do ouvinte num sítio, podes escrever a classe mesmo onde o objeto é preciso. Assim ela não recebe nome: - -```java -mais.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - contagem++; - numero.setText("" + contagem); - } -}); -``` - -- `new ActionListener() { … }` quer dizer: "um objeto novo que cumpre o contrato ActionListener, e é assim: …". -- No fim está `});`: a chaveta fecha a classe, o parêntese fecha a chamada de `addActionListener`. -- A classe anónima está **dentro** de `main`. Por isso também vê as variáveis de `main`, desde que já não mudem. - -::: quiz -? O que fecha `});` no fim da classe anónima? -- [x] `}` fecha a classe, `)` fecha a chamada de `addActionListener`. -- [ ] `}` fecha o `main`, `)` fecha a classe. -- [ ] Os dois fecham o método `actionPerformed`. -> O método `actionPerformed` já termina uma linha antes com a sua própria `}`. -::: - -## 3. O lambda - -O lambda é a forma curta da classe anónima, desde o Java 8: - -```java -mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); -}); -``` - -Fica de fora tudo o que o Java já sabe: `new ActionListener()`, o nome `actionPerformed`, `public void` e o tipo `ActionEvent`. Sobram o parâmetro `e`, a seta e o corpo. Isto só funciona porque o contrato tem exatamente **um** método. - -## As três comparadas - -| | classe interna com nome | classe anónima | lambda | -|---|---|---|---| -| tem nome | sim, p. ex. `Mais` | não | não | -| fica | na classe, fora de `main` | mesmo junto ao botão | mesmo junto ao botão | -| para vários botões | sim, `new Mais()` | não | sim, numa variável (lição 37) | -| vê variáveis de `main` | não | sim, se não mudarem | sim, se não mudarem | -| comprimento | a mais longa | média | a mais curta | - -::: ludwig -Se uma variável de `main` tiver de mudar no ouvinte, como `contagem++`, tem de ir para a classe, seja qual for a maneira de escrever. Esse era o problema da lição 32. -::: - -::: angeberwissen -Depois de compilar, espreita a pasta com os ficheiros `.class`. O javac cria um ficheiro para cada classe: `Contador.class`, `Contador$Mais.class` para a classe interna e `Contador$1.class` para a classe anónima. Como não tem nome, recebe um número. Um lambda não tem ficheiro próprio, o Java só o constrói quando o programa arranca. -::: - -## Jogo: Que maneira de escrever? - -::: spiel frage -titel: Jogo: Que maneira de escrever? -intro: O Ludwig mostra-te ouvintes de programas de outras pessoas. Que maneira de escrever é esta? Seis rondas. -frage: Que maneira de escrever é esta? -antworten: classe interna com nome | classe anónima | lambda - -runde: - botao.addActionListener(e -> texto.setText("Olá")); -richtig: lambda -> A seta `->` denuncia o lambda. - -runde: - botao.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - texto.setText("Olá"); - } - }); -richtig: classe anónima -> `new ActionListener() {` e a seguir um método inteiro: aqui está a ser escrita uma classe sem nome. - -runde: - static class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - texto.setText("Olá"); - } - } -richtig: classe interna com nome -> A classe chama-se `Saudacao` e cumpre o contrato com `implements ActionListener`. - -runde: - botao.addActionListener(new Saudacao()); -richtig: classe interna com nome -> `new Saudacao()` cria um objeto da classe `Saudacao`. A própria classe está noutro sítio e tem nome. - -runde: - ActionListener tecla = e -> { - visor.setText(visor.getText() + e.getActionCommand()); - }; -richtig: lambda -> Um lambda numa variável, como no cadeado da lição 37. A seta denuncia-o. - -runde: - ActionListener tecla = new ActionListener() { - public void actionPerformed(ActionEvent e) { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; -richtig: classe anónima -> Uma classe anónima também pode ficar numa variável. Assim pode ser registada em vários botões, tal como o lambda. -::: - -## Tarefa: Um contador, três maneiras - -Constrói o contador de cliques com três botões: - -- **+1** recebe a classe interna com nome `Mais`. -- **-1** recebe uma classe anónima. -- **Reset** recebe um lambda. - -Experimenta se os três botões contam como esperado. Depois tira o `static` da classe `Mais` e lê a mensagem de erro do javac. - -**Terminaste quando …** - -- **+1** conta para cima, **-1** para baixo e **Reset** põe 0, -- o código tem exatamente uma classe interna com nome, uma classe anónima e uma lambda, -- leste a mensagem de erro do javac sem `static` em `Plus` e consegues explicar o que significa. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo escrever um ouvinte como classe interna com nome. → 1. A classe interna com nome -- Consigo escrever um ouvinte como classe anónima. → 2. A classe anónima -- Consigo explicar o que fica de fora no lambda. → 3. O lambda -- Consigo explicar que maneira de escrever vê que variáveis. → As três comparadas -- Consigo construir um contador com três botões escritos de três maneiras. → Tarefa: Um contador, três maneiras -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que a forma curta com a seta funciona com ActionListener? -→ 3. O lambda -- [ ] Porque ActionListener é uma classe. -- [x] Porque o contrato tem exatamente um método. -- [ ] Porque o botão o exige. - -? Que maneira de escrever podes usar com new Mais() em vários botões sem a guardar numa variável? -→ 1. A classe interna com nome -- [x] a classe interna com nome -- [ ] a classe anónima -- [ ] o lambda - -? Porque é que está static antes de class Mais? -→ 1. A classe interna com nome -- [ ] Para a classe ser mais rápida. -- [x] Porque main é static e senão não consegue criar um objeto de Mais. -- [ ] Porque todas as classes têm de ser static. - -? Liga. -→ As três comparadas -= class Mais implements ActionListener -> classe interna com nome -= new ActionListener() { … } -> classe anónima -= a seta depois de e -> lambda -::: diff --git a/web/lessons/pt/39-zwei-reiter.md b/web/lessons/pt/39-zwei-reiter.md deleted file mode 100644 index c8df5456..00000000 --- a/web/lessons/pt/39-zwei-reiter.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -titel: Dois separadores -bereich: Janelas com Swing -kurz: Construir uma janela com dois separadores, levar dados de um separador para o outro e guardar a lista num ficheiro de texto. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir uma janela com dois separadores -- acrescentar linhas a uma JTextArea com append -- explicar porque é que um ouvinte pode usar peças dos dois separadores -- guardar um ficheiro dentro de um ouvinte com try e catch -- construir uma lista de compras que conta quantas coisas tem -::: - -## O objetivo - -A lista de compras do Ludwig da lição 23 ganha uma janela. Tem dois **separadores**, como os do browser: - -- No separador **Entrada** escreves o que precisas e clicas em **Adicionar**. -- No separador **Lista** está tudo o que escreveste. Um botão **Guardar** escreve a lista num ficheiro de texto. - -Novos são os separadores (`JTabbedPane`), uma área de texto com várias linhas (`JTextArea`) e guardar a partir de um ouvinte. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Separadores com JTabbedPane - -Cada separador mostra a sua própria área. As áreas são JPanels, como o teclado do cadeado na lição 37: - -```java -JTabbedPane separadores = new JTabbedPane(); -JPanel entrada = new JPanel(new GridLayout(0, 1)); -JPanel lista = new JPanel(new BorderLayout()); - -separadores.addTab("Entrada", entrada); -separadores.addTab("Lista", lista); -janela.add(separadores); -``` - -| Chamada | Significado | -|---|---| -| `addTab("Entrada", entrada)` | um separador novo com a legenda "Entrada", mostra o JPanel `entrada` | -| `setSelectedIndex(1)` | muda para o segundo separador, conta-se a partir de 0 | -| `setTitleAt(1, "Lista (3)")` | muda a legenda do segundo separador | - -No início está aberto o separador que foi adicionado primeiro. - -## Uma área de texto com várias linhas - -Um `JTextField` só tem uma linha. Para a lista precisas de uma `JTextArea`: - -```java -JTextArea area = new JTextArea(); -area.setEditable(false); -area.append("Feno\n"); -``` - -- `append` acrescenta texto no fim. O `"\n"` começa depois uma nova linha, como ao dividir com `split("\n")` na lição 24. -- `setEditable(false)` impede que se escreva diretamente na lista. -- `getText()` devolve o texto inteiro com todas as linhas. - -::: quiz -? O que faz `area.append("Feno\n")`? -- [ ] Substitui o texto todo por “Feno”. -- [x] Acrescenta “Feno” no fim e começa depois uma linha nova. -- [ ] Escreve “Feno\n” tal e qual na lista. -> `append` acrescenta no fim, `"\n"` é a mudança de linha. -::: - -## De um separador para o outro - -O botão **Adicionar** está no separador Entrada, a área de texto no separador Lista. Mesmo assim, o ouvinte pode usar os dois. Todas as peças são variáveis em `main`, e o lambda vê-as todas, seja qual for o separador em que aparecem depois: - -```java -adicionar.addActionListener(e -> { - area.append(campo.getText() + "\n"); - info.setText(campo.getText() + " está na lista."); - campo.setText(""); -}); -``` - -::: ludwig -Uma peça só pode estar numa **única** área. Se juntares o mesmo botão primeiro a `entrada` e depois a `lista`, o Swing tira-o de `entrada`. Só aparece no separador Lista. -::: - -## Guardar dentro do ouvinte - -Para guardar usas o `PrintWriter` da lição 23. Dentro do ouvinte há um senão: a saída com `throws Exception` da lição 23 aqui não existe. O lambda é um método próprio, `actionPerformed`, e segundo o contrato não pode passar adiante uma `FileNotFoundException`. Por isso, guardar fica dentro de try e catch: - -```java -guardar.addActionListener(e -> { - try { - PrintWriter saida = new PrintWriter("listacompras.txt"); - saida.print(area.getText()); - saida.close(); - info.setText("Guardado em listacompras.txt"); - separadores.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Não foi possível guardar."); - } -}); -``` - -- A exceção chama-se aqui `ex`, porque o nome `e` já está ocupado pelo evento. -- Depois de guardar, a janela volta com `setSelectedIndex(0)` ao separador Entrada, onde está a mensagem. -- O VisuStruct mostra o ficheiro guardado por baixo da consola, assim que clicares em Guardar. - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class ListaCompras { - public static void main(String[] args) { - JFrame janela = new JFrame("Lista de compras"); - janela.setSize(300, 250); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane separadores = new JTabbedPane(); - - JPanel entrada = new JPanel(new GridLayout(0, 1)); - JTextField campo = new JTextField(); - JButton adicionar = new JButton("Adicionar"); - JLabel info = new JLabel("Ainda não há nada na lista."); - entrada.add(new JLabel("Do que precisas?")); - entrada.add(campo); - entrada.add(adicionar); - entrada.add(info); - - JPanel lista = new JPanel(new BorderLayout()); - JTextArea area = new JTextArea(); - area.setEditable(false); - JButton guardar = new JButton("Guardar"); - lista.add(area, BorderLayout.CENTER); - lista.add(guardar, BorderLayout.SOUTH); - - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); - - adicionar.addActionListener(e -> { - area.append(campo.getText() + "\n"); - info.setText(campo.getText() + " está na lista."); - campo.setText(""); - }); - - guardar.addActionListener(e -> { - try { - PrintWriter saida = new PrintWriter("listacompras.txt"); - saida.print(area.getText()); - saida.close(); - info.setText("Guardado em listacompras.txt"); - separadores.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Não foi possível guardar."); - } - }); - - janela.add(separadores); - janela.setVisible(true); - } -} -``` - -Escreve Feno, clica em Adicionar, depois Maçãs e outra vez Adicionar. Muda para o separador Lista e clica em Guardar. - -## Jogo: Onde vai parar? - -::: spiel frage -titel: Jogo: Onde vai parar? -intro: O Ludwig constrói janelas com separadores. Lê o código e prevê o que vês. Seis rondas. - -runde: - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); -frage: Que separador está aberto no início? -- [x] Entrada -- Lista -- nenhum -> No início está aberto o separador que foi adicionado primeiro. - -runde: - separadores.addTab("Lista", lista); - separadores.addTab("Entrada", entrada); -frage: Que separador está aberto no início? -- Entrada -- [x] Lista -- os dois -> Desta vez a Lista vem primeiro. A ordem dos `addTab` decide a ordem dos separadores. - -runde: - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); - separadores.addTab("Ajuda", ajuda); - separadores.setSelectedIndex(1); -frage: Que separador está aberto? -- Entrada -- [x] Lista -- Ajuda -> Conta-se a partir de 0: 0 é Entrada, 1 é Lista, 2 é Ajuda. - -runde: - adicionar.addActionListener(e -> { - area.append(campo.getText() + "\n"); - campo.setText(""); - }); - // Escreves Feno, clicas em Adicionar, escreves Maçãs, clicas em Adicionar. -frage: O que está depois no separador Lista? -- Maçãs -- FenoMaçãs -- [x] Feno\nMaçãs -> `append` acrescenta no fim, e cada `"\n"` começa uma nova linha. - -runde: - JButton botao = new JButton("OK"); - entrada.add(botao); - lista.add(botao); -frage: Onde aparece o botão OK? -- nos dois separadores -- só no separador Entrada -- [x] só no separador Lista -> Uma peça só pode estar numa área. No segundo `add`, o Swing tira-a de `entrada`. - -runde: - guardar.addActionListener(e -> { - area.setText(""); - separadores.setTitleAt(1, "Lista (vazia)"); - separadores.setSelectedIndex(0); - }); - // O botão guardar está no separador Lista. -frage: O que vês depois do clique? -- o separador Lista vazio -- [x] o separador Entrada, e o segundo separador chama-se "Lista (vazia)" -- o separador Entrada, e o segundo separador continua a chamar-se "Lista" -> O ouvinte esvazia a área, muda o nome do separador e muda para o separador 0. Tudo acontece com um clique. -::: - -## Tarefa: Lista de compras com separadores - -Constrói o programa e experimenta-o. - -Depois melhora-o: - -- Entradas vazias não vão para a lista. Verifica antes `campo.getText().isEmpty()` (lição 17). -- O separador Lista mostra no título quantas coisas estão na lista: "Lista (3)". Conta numa variável `static int` e usa `setTitleAt`. -- Extra: um terceiro separador **Ajuda** com um JLabel que explica como funciona o programa. - -**Terminaste quando …** - -- um item escrito aparece no separador da lista depois do clique, -- um campo vazio não acrescenta nada à lista, -- depois de três itens o título do separador mostra o número, p. ex. “Lista (3)”. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir uma janela com dois separadores. → Separadores com JTabbedPane -- Consigo acrescentar linhas a uma JTextArea com append. → Uma área de texto com várias linhas -- Consigo explicar porque é que um ouvinte pode usar peças dos dois separadores. → De um separador para o outro -- Consigo guardar um ficheiro dentro de um ouvinte com try e catch. → Guardar dentro do ouvinte -- Consigo construir uma lista de compras que conta quantas coisas tem. → Tarefa: Lista de compras com separadores -::: - -## Teste de conhecimentos - -::: quiz -? Que separador está aberto depois de separadores.setSelectedIndex(0)? -→ Separadores com JTabbedPane -- [x] o primeiro -- [ ] o segundo -- [ ] nenhum - -? Porque é que guardar dentro do ouvinte fica em try e catch? -→ Guardar dentro do ouvinte -- [ ] Porque o PrintWriter só funciona dentro de try. -- [x] Porque actionPerformed não pode passar adiante uma FileNotFoundException. -- [ ] Porque o main não tem throws. - -? Qual é a diferença entre JTextField e JTextArea? -→ Uma área de texto com várias linhas -- [ ] Não há nenhuma. -- [x] A JTextArea pode mostrar várias linhas. -- [ ] Num JTextField não se pode escrever. - -? Liga. -→ Separadores com JTabbedPane -= JTabbedPane -> uma área com separadores -= JPanel -> a área de um separador -= JTextArea -> uma área de texto com várias linhas -::: diff --git a/web/lessons/pt/40-model-view-controller.md b/web/lessons/pt/40-model-view-controller.md deleted file mode 100644 index a724bb5c..00000000 --- a/web/lessons/pt/40-model-view-controller.md +++ /dev/null @@ -1,430 +0,0 @@ ---- -titel: Model View Controller -bereich: Janelas com Swing -kurz: Dividir o contador de cliques em model, view e controller e perceber quem fala com quem. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dizer o que fazem o model, a view e o controller -- escrever um model sem Swing e testá-lo sem janela -- explicar o que constrói new Contador() e porque é que ali não há static -- nomear as quatro mensagens depois de um clique -- acrescentar uma segunda view sem mudar o model -- construir um contador com −1, Reset e limites no model -::: - -## O objetivo - -Os programas grandes com janelas têm quase sempre a mesma estrutura. Chama-se **Model View Controller**, ou **MVC**, em português modelo, vista e controlador: - -- O **model** guarda os dados e conhece as suas regras. -- A **view** só mostra os dados. -- O **controller** reage aos cliques e dá o recado. - -Aprendes MVC com o contador de cliques da lição 32. Ele é dividido em três partes, passo a passo. No fim mostra a mesma contagem duas vezes: como número e como barra. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Tudo numa classe - -Até agora o contador de cliques era assim, tudo está em `main` e numa variável da classe: - -```java -static int contagem = 0; - -public static void main(String[] args) { - // ... construir a janela ... - JLabel numero = new JLabel("0", SwingConstants.CENTER); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); -} -``` - -Funciona. Mas imagina que a contagem também deve aparecer como barra, mais tarde numa segunda janela e num ficheiro. Então cada ouvinte tem de se lembrar de todos os visores. Contar e mostrar ficam atados num nó, e com cada visor o nó fica maior. - -O MVC desata o nó: cada tarefa recebe a sua própria classe. - -## O model - -O model é o próprio contador, sem nada de Swing: - -```java -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} -``` - -- Desta vez não há `static` antes de `valor` e dos métodos. Assim pertencem a um **objeto**: `new Contador()` constrói um contador com o seu próprio `valor`, tal como `new JButton("+1")` constrói um botão com a sua própria legenda. -- `model.aumentar()` chama o método deste contador, tal como `botao.setText(…)`. -- Quem quer saber o valor pergunta com `getValor()`. Mudá-lo só é possível através de `aumentar()`. - -Como o model não precisa de janela, podes experimentá-lo sem janela nenhuma: - -```java -public class ContadorTeste { - public static void main(String[] args) { - Contador model = new Contador(); - model.aumentar(); - model.aumentar(); - System.out.println(model.getValor()); - } -} - -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} -``` - -A saída é 2. Num ficheiro podem estar várias classes. Só uma delas é `public`, e essa tem o `main`. - -## A view - -A view mostra o valor e mais nada. Não faz contas e não sabe de onde vem o número: - -```java -class VistaNumero { - JLabel numero = new JLabel("0", SwingConstants.CENTER); - - void atualizar(int valor) { - numero.setText("" + valor); - } -} -``` - -- A view recebe o valor com `atualizar(int valor)` e escreve-o no seu JLabel. -- A janela e o botão constróis em `main`, como sempre. Com `janela.add(view.numero)` o JLabel da view entra na janela. - -## O controller - -O controller é o ouvinte do botão. Liga o model à view: - -```java -Contador model = new Contador(); -VistaNumero view = new VistaNumero(); - -mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); -}); -``` - -- Primeiro muda o model, depois vai buscar o novo valor e entrega-o à view. -- O problema da lição 32 desapareceu: a variável `model` nunca muda, aponta sempre para o mesmo contador. Só o `valor` lá dentro muda. Por isso o lambda pode usar `model`, sem nenhum `static`. - -## Quem fala com quem? - -A cada clique correm quatro mensagens, sempre pela mesma ordem: - -::: grafik mvc-klick.svg -As setas acendem-se uma após a outra. O model conta na segunda seta, o visor só na quarta. -::: - -1. O botão comunica o clique ao controller (`actionPerformed`). -2. O controller diz ao model: `aumentar()`. -3. O controller pergunta ao model o novo valor: `getValor()`. -4. O controller entrega o valor à view: `atualizar(valor)`. - -O model não fala com ninguém. Espera até lhe perguntarem. - -::: ludwig -Lembra-te: o model não sabe nada de janelas. Em `Contador` não há nenhum `JLabel` nem nenhum `import javax.swing`. Se precisares de Swing ali, o código pertence à view. -::: - -::: quiz -? Com quem fala o model por iniciativa própria? -- [ ] Com a view -- [ ] Com o botão -- [x] Com ninguém -> O model espera até o controller lhe perguntar. -::: - -## A vantagem: uma segunda view - -Agora a contagem também deve aparecer como barra. Para isso junta-se uma segunda view. Uma `JProgressBar` é uma barra que se enche, aqui de 0 a 10: - -```java -class VistaBarra { - JProgressBar barra = new JProgressBar(0, 10); - - void atualizar(int valor) { - barra.setValue(valor); - } -} -``` - -O controller ganha mais uma linha. O model fica exatamente como estava: - -```java -mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); -}); -``` - -É exatamente esta a vantagem do MVC: podes acrescentar ou trocar visores sem mexer no model. - -## O programa completo - -```java -import javax.swing.*; -import java.awt.*; - -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} - -class VistaNumero { - JLabel numero = new JLabel("0", SwingConstants.CENTER); - - void atualizar(int valor) { - numero.setText("" + valor); - } -} - -class VistaBarra { - JProgressBar barra = new JProgressBar(0, 10); - - void atualizar(int valor) { - barra.setValue(valor); - } -} - -public class ContadorCliques { - public static void main(String[] args) { - Contador model = new Contador(); - VistaNumero view = new VistaNumero(); - VistaBarra barra = new VistaBarra(); - - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); - }); - - janela.add(view.numero); - janela.add(barra.barra); - janela.add(mais); - janela.setVisible(true); - } -} -``` - -Clica algumas vezes em +1 e vê o número e a barra a crescer juntos. - -::: angeberwissen -O MVC foi inventado em 1979 pelo norueguês Trygve Reenskaug, no centro de investigação Xerox PARC, na Califórnia. Já nessa altura havia lá computadores com janelas e rato. No mesmo ano, Steve Jobs visitou o laboratório e ficou tão entusiasmado que a Apple passou a construir computadores com janelas e rato. -::: - -## Jogo: Onde pertence o código? - -::: spiel frage -titel: Jogo: Onde pertence o código? -intro: O Ludwig atirou código de um programa MVC para um monte. Arruma cada peça. Oito rondas. -frage: Onde pertence este código? -antworten: Model | View | Controller - -runde: - int valor = 0; -richtig: Model -> A contagem são os dados. Os dados moram no model. - -runde: - numero.setText("" + valor); -richtig: View -> Mostrar algo no ecrã é a tarefa da view. - -runde: - mais.addActionListener(e -> model.aumentar()); -richtig: Controller -> Reagir a um clique e avisar o model: é isso que o controller faz. - -runde: - void aumentar() { - valor++; - } -richtig: Model -> O próprio model sabe como mudar os seus dados. - -runde: - barra.setValue(valor); -richtig: View -> Uma barra que se enche só mostra. Portanto: view. - -runde: - void aumentar() { - if (valor < 10) { - valor++; - } - } -richtig: Model -> "No máximo 10" é uma regra para os dados. As regras pertencem ao model, assim valem para todos os botões e todas as views. - -runde: - view.atualizar(model.getValor()); -richtig: Controller -> Ir buscar o valor ao model e entregá-lo à view: é o controller no meio. - -runde: - JLabel numero = new JLabel("0", SwingConstants.CENTER); -richtig: View -> Um JLabel é uma peça do ecrã. No model não há Swing. -::: - -## Jogo: Quem é o próximo? - -::: spiel reihenfolge -titel: Jogo: Quem é o próximo? -intro: Depois de um clique, o model, a view e o controller falam uns com os outros, mas só funciona por uma ordem. Põe os passos pela ordem certa. Cinco rondas. - -runde: -frage: Clicas em +1 no contador de cliques. O que acontece, um passo após o outro? -- Clicas em +1. -- O controller recebe `actionPerformed`. -- O controller chama `model.aumentar()`. -- O model aumenta o `valor`. -- O controller vai buscar `model.getValor()`. -- A view mostra o novo número. -> Clique, controller, mudar o model, ir buscar o valor, mostrar. São as quatro setas da imagem, com a contagem no meio. - -runde: - mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); - }); -frage: O que acontece depois de um clique em +1, um passo após o outro? -- O clique em +1 -- `model.aumentar()` -- O número mostra o novo valor. -- A barra cresce. -> O ouvinte trata as suas linhas de cima para baixo: primeiro o model, depois o número, depois a barra. - -runde: -frage: Põe o controller pela ordem certa, para que a view mostre o novo número. -- `mais.addActionListener(e -> {` -- `model.aumentar();` -- `view.atualizar(model.getValor());` -- `});` -> Primeiro mudar, depois mostrar. Ao contrário, a view ainda mostra o valor antigo. - -runde: - reset.addActionListener(e -> { - model.reiniciar(); - view.atualizar(model.getValor()); - }); -frage: O contador está em 5. Clicas em Reset. O que acontece, um passo após o outro? -- Clicas em Reset. -- O model põe o `valor` a 0. -- `model.getValor()` devolve 0. -- A view mostra 0. -> Também o Reset passa pelo controller até ao model. A view só sabe do novo valor no fim. - -runde: -frage: Um teste sem janela deve escrever 1. Por que ordem estão as linhas no main? -- `Contador model = new Contador();` -- `model.aumentar();` -- `System.out.println(model.getValor());` -> Primeiro construir o objeto, depois trabalhar com ele e no fim ver o resultado. O model pode ser testado sem janela nenhuma. -::: - -## Tarefa: Um contador com limites - -Constrói o programa completo e experimenta-o. - -Depois melhora-o: - -- Um botão **−1** conta para baixo. O model recebe para isso um método `diminuir()`, o controller um segundo ouvinte. -- Um botão **Reset** põe o contador a 0 com `reiniciar()`. -- O próprio model trata dos limites: nunca abaixo de 0 e nunca acima de 10, porque aí a barra está cheia. -- Extra: uma terceira view `VistaConsola`, cujo `atualizar` escreve "Novo valor: 3" com `System.out.println`. Uma view não tem de ser uma janela. - -**Terminaste quando …** - -- **+1**, **−1** e **Reset** contam bem, -- o contador nunca fica abaixo de 0 nem acima de 10, por mais que cliques, -- o número e a barra mostram sempre o mesmo valor, -- a classe do modelo não tem `JButton`, `JLabel` nem outro Swing. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dizer o que fazem o model, a view e o controller. → O objetivo -- Consigo escrever um model sem Swing e testá-lo sem janela. → O model -- Consigo explicar o que constrói new Contador() e porque é que ali não há static. → O model -- Consigo nomear as quatro mensagens depois de um clique. → Quem fala com quem? -- Consigo acrescentar uma segunda view sem mudar o model. → A vantagem: uma segunda view -- Consigo construir um contador com −1, Reset e limites no model. → Tarefa: Um contador com limites -::: - -## Teste de conhecimentos - -::: quiz -? Onde fica a regra "O contador nunca passa de 10"? -→ O model -- [x] no model -- [ ] na view -- [ ] no controller -> As regras sobre os dados pertencem ao model. Assim valem seja qual for o botão. - -? O que faz a view? -→ O objetivo -- [ ] Calcula o novo valor. -- [x] Mostra o valor que recebe. -- [ ] Ouve os cliques. - -? Porque é que o lambda pode usar model, se model é uma variável do main? -→ Quem fala com quem? -- [ ] Porque Contador é public. -- [x] Porque model aponta sempre para o mesmo contador; só o valor lá dentro muda. -- [ ] Porque os lambdas podem mudar qualquer variável. - -? O que tens de mudar no model quando se junta uma segunda view? -→ A vantagem: uma segunda view -- [x] nada -- [ ] um segundo método aumentar -- [ ] um segundo JLabel - -? Liga. -→ O objetivo -= Contador com valor e aumentar() -> model -= VistaNumero com atualizar(int valor) -> view -= o ouvinte do botão -> controller -::: diff --git a/web/lessons/pt/aufgaben/alter-unterprogramm.md b/web/lessons/pt/aufgaben/alter-unterprogramm.md deleted file mode 100644 index b2c6ba46..00000000 --- a/web/lessons/pt/aufgaben/alter-unterprogramm.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -titel: Idade num subprograma -nach: 18 -stufe: 2 ---- - -A verificação da idade de “Maior de idade?” passa agora a ser um subprograma próprio. O programa principal só o chama. - -::: übung aufgabe-alter-unterprogramm -titel: Idade num subprograma -auftrag: Constrói dois diagramas. O programa principal mostra **Bem-vindo**, depois chama `verificarIdade()` e no fim mostra **Adeus**. - O subprograma `verificarIdade` fica num separador próprio: pede a idade e mostra **maior de idade** ou **menor de idade**. -test: 20 -> Bem-vindo | maior de idade | Adeus -test: 18 -> Bem-vindo | maior de idade | Adeus -test: 12 -> Bem-vindo | menor de idade | Adeus -braucht: aufruf -tipp: O programa principal tem três blocos. O subprograma faz o trabalho a sério. -tipp: Abre o exercício no editor e constrói lá o programa principal com a chamada `verificarIdade()`. Depois abre um novo separador com **+** e dá-lhe o título `verificarIdade`. Constrói nele a entrada e a decisão. O Verificar encontra o subprograma pelo título do separador. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/ballwurf.md b/web/lessons/pt/aufgaben/ballwurf.md deleted file mode 100644 index fcc9f56b..00000000 --- a/web/lessons/pt/aufgaben/ballwurf.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -titel: Avaliar o lançamento da bola -nach: 25 -stufe: 2 ---- - -No dia do desporto, todos escreveram numa tabela a distância a que lançaram a bola: - -::: datei lancamento.csv -Nome;Distancia -Ludwig;28 -Zora;42 -Raposa;35 -Lebre;21 -::: - -::: übung aufgabe-ballwurf -titel: Avaliar o lançamento da bola -code: java -auftrag: Lê o ficheiro e salta a linha de cabeçalho. Mostra quantos participaram (**Participantes: 4**) e a que distância lançaram em média (**Média: 31.5 m**). - Guarda o lançamento mais longo no ficheiro **vencedor.txt**, por exemplo **Vencedor: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Participantes: 4 | Média: 31.5 m -datei: vencedor.txt -> Vencedor: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: Precisas de quatro variáveis antes do ciclo: a contagem, a soma como `double`, a melhor distância e o melhor nome. -tipp: No ciclo: `String[] partes = linha.split(";");` e `int distancia = Integer.parseInt(partes[1]);`. Se `distancia > melhorDistancia`, guarda a distância e o nome. Para guardar: `PrintWriter saida = new PrintWriter("vencedor.txt");`, `saida.println(…)` e `saida.close();`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/bestenliste.md b/web/lessons/pt/aufgaben/bestenliste.md deleted file mode 100644 index 775c7679..00000000 --- a/web/lessons/pt/aufgaben/bestenliste.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -titel: Classificação -nach: 19 -stufe: 2 ---- - -Cinco cabras fizeram a corrida de obstáculos. Agora a classificação vai para a porta do estábulo: mais pontos em cima, menos pontos em baixo. - -::: übung aufgabe-bestenliste -titel: Classificação -auftrag: Lê 5 pontuações para um array. Ordena o array com o bubble sort por ordem **decrescente**, ou seja, o maior número primeiro. Depois mostra a lista com o lugar, por exemplo **1. 9**, na linha seguinte **2. 9** e assim por diante. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: O bubble sort da lição 19 ordena por ordem crescente. Para decrescente basta inverter a comparação dos vizinhos. -tipp: Troca-se quando `pontos[i] < pontos[i + 1]`, com uma variável auxiliar. Para a saída, calcula primeiro `int lugar = i + 1` e depois mostra `lugar + ". " + pontos[i]`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-bestenliste-java -titel: Classificação em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Lê cada número primeiro para uma variável e depois põe-no no array: `int numero = scanner.nextInt();` e `pontos[i] = numero;`. -tipp: A troca também precisa de uma variável auxiliar em Java: `int aux = pontos[i]; pontos[i] = pontos[i + 1]; pontos[i + 1] = aux;`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/binaerzahl.md b/web/lessons/pt/aufgaben/binaerzahl.md deleted file mode 100644 index ef81854c..00000000 --- a/web/lessons/pt/aufgaben/binaerzahl.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -titel: Número binário -nach: 11 -stufe: 3 ---- - -Os computadores fazem contas só com dois algarismos: 0 e 1. É assim que se converte um número para o **sistema binário**: - -1. Divide o número por 2 e guarda o resto (0 ou 1). -2. Continua com o resultado sem o resto. -3. Repete isto até o número ser 0. - -Os restos lidos **de baixo para cima** dão o número binário. Para 6, os restos são 0, 1, 1, portanto o número binário é 110. - -::: übung aufgabe-binaer -titel: Número binário -auftrag: Pede um número inteiro maior do que 0 e mostra-o como número binário. Para 6 a saída é **110**, para 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Vai dividindo o número por 2 e guarda cada resto. Os restos lidos ao contrário dão o número binário. -tipp: Junta os algarismos num texto: `String binario = ""`. No ciclo calculas `int resto = numero % 2` e acrescentas o resto à **frente**: `binario = resto + binario`. Depois, `numero = numero / 2`. Como numero é um número inteiro, o resto desaparece. -lösung: aufgabe-binaer-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-binaer-java -titel: Número binário em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Começa com `String binario = "";`. O ciclo corre com `while (numero > 0)`. -tipp: No corpo: `int resto = numero % 2;`, depois `binario = resto + binario;` e `numero = numero / 2;`. Como `binario` é uma String, o `+` põe o resto à frente. -lösung: aufgabe-binaer-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/caesar.md b/web/lessons/pt/aufgaben/caesar.md deleted file mode 100644 index 406e78e6..00000000 --- a/web/lessons/pt/aufgaben/caesar.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -titel: Cifra de César -nach: 17 -stufe: 3 ---- - -Há mais de 2000 anos, o general romano Júlio César enviava mensagens secretas às suas tropas. O truque era simples: substituía cada letra pela letra que está **três posições à frente** no alfabeto. O A passa a D, o B passa a E e assim por diante. A mensagem legível chama-se **texto simples**, a cifrada **texto cifrado**. O número de posições que se avança é a **chave**, muitas vezes chamada apenas `k`. - -::: grafik caesar-verschiebung.svg -Cifrar com a chave 3: cada letra de cima passa a ser a letra de baixo. No fim recomeça-se do início, por isso X, Y e Z passam a A, B e C. -::: - -Assim, `HALLO` passa a `KDOOR`. Quem conhece a chave recua simplesmente três posições e consegue voltar a ler a mensagem. - -### O disco de cifra - -Para não ter de contar sempre, construiu-se um **disco de cifra**: dois discos com o alfabeto, um pequeno sobre um grande, presos no meio para poderem rodar. Por fora está o texto simples, por dentro o texto cifrado. Rodando o disco interior três letras, por baixo de cada letra exterior aparece a sua letra cifrada. Discos assim existem desde o século XV. Na Guerra Civil Americana (1861–1865), os soldados levavam pequenos discos de latão. - -::: grafik caesar-scheibe.svg -Um disco de cifra inspirado nos discos históricos de latão. A janela azul mostra: com a chave 3, por baixo do A está o D. -::: - -::: angeberwissen -O próprio César nem sequer tinha um disco! Sabemo-lo pelo historiador romano Suetónio: nas suas cartas, César avançava cada letra três posições e contava isso simplesmente de cabeça. O disco só foi inventado por Leon Battista Alberti por volta de 1467, cerca de 1500 anos mais tarde. Aliás, eu também conto de cabeça. Não tenho dedos, só cascos. -::: - -Experimenta tu. Roda o disco interior, escreve um texto e vê como surge o texto cifrado. Com **Decifrar** faz-se o caminho inverso. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -Um disco verdadeiro é muito fácil de fazer: dois círculos de cartão, um um pouco mais pequeno, cada um com 26 campos iguais para o alfabeto, e um colchete de latão no meio. Está pronta a tua ferramenta de agente secreto! -::: - -::: quiz -? Em que letra se transforma o Y com a chave 3? -- [ ] A -- [x] B -- [ ] C -> A seguir ao Y vem o Z, depois recomeça-se com A e B. Três posições à frente é, portanto, o B. - -? Um texto cifrado foi cifrado com a chave 5. Como o decifras? -- [ ] Avançar mais 5 posições -- [x] Recuar 5 posições -- [ ] Ler as letras de trás para a frente -> Decifrar é o contrário de cifrar. Recuar 5 posições é, aliás, o mesmo que avançar 21, porque 5 + 21 = 26. -::: - -### O programa: há mais do que um caminho - -Como ensinas o computador a avançar uma letra `k` posições? Não existe *a* única solução certa. Vamos ver dois caminhos. Ambos percorrem o texto carácter a carácter com um ciclo for, tal como na lição sobre cadeias de caracteres. A diferença está na forma como avançam uma única letra. - -Nos dois caminhos ajuda o operador de resto `%`. Ele garante que depois do Z se continua no A: as posições 0 a 25 ficam como estão, 26 passa a 0, 27 passa a 1 e assim por diante. - -### Caminho 1: o alfabeto num array - -Colocas o alfabeto num array `char[] alfabeto = {'A', 'B', …, 'Z'}`. Para cada letra da palavra procuras no array a sua posição `pos`, ou seja, o seu índice. A letra cifrada está então no mesmo array na posição `(pos + k) % 26`. - -Um exemplo com a chave 3: o X está na posição 23. Então `(23 + 3) % 26 = 0`, e na posição 0 está o A. - -::: übung aufgabe-caesar-array -titel: César com array -auftrag: O diagrama inicial já contém o array `alfabeto`. Pede uma palavra em maiúsculas e a chave `k`. Depois mostra a palavra cifrada. Para HALLO e 3, isso dá `KDOOR`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Cria um texto vazio `String segredo = ""`. Percorre a palavra carácter a carácter com um ciclo for. Em cada passagem acrescentas uma letra cifrada ao fim de `segredo`. -tipp: Para encontrar a posição de uma letra precisas de um segundo ciclo, interior, sobre o array: se `alfabeto[j] == letra`, guardas `pos = j`. -tipp: Depois do ciclo interior acrescentas `alfabeto[(pos + k) % 26]`: `segredo = segredo + alfabeto[(pos + k) % 26]`. Depois do ciclo exterior mostras `segredo`. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Caminho 2: calcular com a tabela ASCII - -Para o computador, cada carácter é na verdade um número. Que número pertence a que carácter está na **tabela ASCII**. Aí o A tem o código 65, o B o código 66 e assim por diante até ao Z com 90. Em Java transformas um carácter no seu código com `(int)` e um código de volta num carácter com `(char)`: - -``` -int codigo = (int) 'A' -char letra = (char) 68 -``` - -Depois disso, `codigo` vale 65 e `letra` vale `'D'`. Uma conversão destas de um tipo de dados para outro chama-se **conversão de tipo** (em inglês *cast*). - -Agora já podes fazer contas com a letra. Para que o salto do Z de volta ao A funcione, subtrais primeiro 65. Assim o A fica na posição 0 e o Z na posição 25, tal como no caminho 1. Avanças com `% 26` e no fim voltas a somar os 65: - -::: grafik caesar-ascii.svg -Em cima, as letras maiúsculas com os seus códigos ASCII. Em baixo, o cálculo para o X com a chave 3: o resultado é A. -::: - -::: übung aufgabe-caesar-ascii -titel: César com ASCII -code: java -auftrag: Escreve um programa em Java que lê uma palavra em maiúsculas e a chave `k` e mostra a palavra cifrada. Desta vez sem array: calcula com `(int)` e `(char)`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Percorre a palavra com um ciclo for. O código do carácter na posição `i` obténs com `int codigo = (int) palavra.charAt(i);`. -tipp: Calcula `codigo = (codigo - 65 + k) % 26 + 65;` e acrescenta o carácter: `segredo = segredo + (char) codigo;`. Antes do ciclo escreves `String segredo = "";`, depois do ciclo `System.out.println(segredo);`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Qual é o melhor caminho? - -**Caminho 1: array.** A ideia é procurar a posição no array. -- Vantagem: fácil de perceber, e também funciona com alfabetos próprios, p. ex. com Ç. -- Desvantagem: é preciso procurar cada letra. - -**Caminho 2: ASCII.** A ideia é calcular com o código do carácter. -- Vantagem: curto e sem procura, por isso mais rápido. -- Desvantagem: é preciso conhecer os códigos ASCII. - -Os dois programas dão o mesmo resultado. Na programação é muitas vezes assim: há várias soluções certas, e escolhes a que melhor se adapta à tua tarefa. - -::: übung aufgabe-caesar-entschluesseln -titel: Decifrar César -code: java -auftrag: Agora inverte o jogo. Lê um texto cifrado em maiúsculas e a chave `k` e mostra o texto simples. Para KDOOR e 3, isso dá `HALLO`. Escolhes tu o caminho. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Decifrar significa recuar `k` posições em vez de avançar. Assim, o `+ k` passa a `- k`. -tipp: Cuidado com o A: `0 - 3` dá -3, e em Java o `%` não transforma isso num número positivo. Por isso soma ainda 26: `codigo = (codigo - 65 - k + 26) % 26 + 65;` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Infelizmente, a cifra de César não é segura. Há apenas 25 chaves, e é possível experimentá-las todas em poucos minutos. Com um truque é ainda mais rápido: em português, as letras mais frequentes são o A e o E. Se no texto cifrado o H aparecer muitas vezes, a chave foi provavelmente 3. Na internet existe ainda o ROT13, que é a cifra de César com a chave 13. Aplicar ROT13 duas vezes devolve o texto simples, porque 13 + 13 = 26. -::: diff --git a/web/lessons/pt/aufgaben/collatz.md b/web/lessons/pt/aufgaben/collatz.md deleted file mode 100644 index 36359bb0..00000000 --- a/web/lessons/pt/aufgaben/collatz.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -titel: Sequência de Collatz -nach: 11 -stufe: 2 ---- - -A sequência de Collatz é um enigma famoso da matemática. Começas com um número e aplicas sempre a mesma regra: - -- Se o número for **par**, divides por 2. -- Se for **ímpar**, multiplicas por 3 e somas 1. - -Até agora, para todos os números iniciais que alguém experimentou, a sequência acaba por chegar a 1. Se isto é verdade para todos os números, ninguém sabe até hoje. - -::: übung aufgabe-collatz -titel: Sequência de Collatz -auftrag: Pede um número inicial. Aplica a regra até o número ser 1 e mostra o novo número depois de cada passo. Vai contando os passos e mostra no fim **Passos:** e o número de passos. - Com o número inicial 6, a sequência é 3, 10, 5, 16, 8, 4, 2, 1. São 8 passos. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 7 -test: 1 -> Passos: 0 -braucht: whileSchleife, verzweigung -tipp: Não sabes quantos passos vão ser. Por isso um ciclo while serve melhor do que um ciclo for. -tipp: O ciclo while é executado enquanto `numero != 1`. Verificas se um número é par com `numero % 2 == 0`. A saída e `passos++` vêm depois da decisão, mas ainda dentro do ciclo. -lösung: aufgabe-collatz-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-collatz-java -titel: Sequência de Collatz em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 7 -test: 1 -> Passos: 0 -braucht: whileSchleife, verzweigung -tipp: Um ciclo `while` corre enquanto `numero != 1`. Lá dentro, um `if` com `numero % 2 == 0` decide. -tipp: No corpo: dividir por 2 ou `numero = numero * 3 + 1;`, depois `System.out.println(numero);` e `passos++;`. Depois do ciclo vem `"Passos: " + passos`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -Esta tarefa pode tornar-te rico! O matemático Paul Erdős ofereceu 500 dólares por uma demonstração. Em 2021, a empresa japonesa Bakuage juntou bastante mais: 120 milhões de ienes, na altura cerca de um milhão de dólares, por uma demonstração ou um contraexemplo. Ainda ninguém foi buscar o dinheiro. Já agora, o enigma foi inventado pelo matemático alemão Lothar Collatz em 1937. Vou já começar a fazer contas; com tanto dinheiro compra-se muito feno. -::: diff --git a/web/lessons/pt/aufgaben/einheitenrechner.md b/web/lessons/pt/aufgaben/einheitenrechner.md deleted file mode 100644 index a1d0c800..00000000 --- a/web/lessons/pt/aufgaben/einheitenrechner.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -titel: Conversor de unidades -nach: 35 -stufe: 2 ---- - -Constrói uma janela que converte comprimentos. Em cima escreves um comprimento em metros, por baixo há três botões: - -- **em cm** mostra o comprimento em centímetros, 1.5 passa a "150.0 cm", -- **em mm** mostra-o em milímetros, 1.5 passa a "1500.0 mm", -- **em km** mostra-o em quilómetros, 1500 passa a "1.5 km". - -O resultado aparece num JLabel por baixo dos botões. Se no campo não estiver um número, aparece "Escreve um número", e o programa não vai abaixo. - -Podes começar assim: - -```java -import javax.swing.*; -import java.awt.*; - -public class Unidades { - public static void main(String[] args) { - JFrame janela = new JFrame("Conversor de unidades"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JTextField metros = new JTextField(); - JButton emCm = new JButton("em cm"); - JLabel resultado = new JLabel("?", SwingConstants.CENTER); - - emCm.addActionListener(e -> { - double m = Double.parseDouble(metros.getText()); - resultado.setText((m * 100) + " cm"); - }); - - janela.add(metros); - janela.add(emCm); - janela.add(resultado); - janela.setVisible(true); - } -} -``` - -**Terminaste quando …** - -- 1.5 mostra "150.0 cm" depois de **em cm** e "1500.0 mm" depois de **em mm**, -- 1500 mostra "1.5 km" depois de **em km**, -- "abc" no campo mostra "Escreve um número" e a janela continua aberta. - -Extra: um quarto botão **em pés** converte para a unidade inglesa. Um pé são 0.3048 m. - -::: ludwig -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). Para "abc" no campo, cada ouvinte precisa de um try/catch com `NumberFormatException`, tal como na calculadora. -::: diff --git a/web/lessons/pt/aufgaben/fibonacci.md b/web/lessons/pt/aufgaben/fibonacci.md deleted file mode 100644 index 2e7df238..00000000 --- a/web/lessons/pt/aufgaben/fibonacci.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -titel: Números de Fibonacci -nach: 13 -stufe: 2 ---- - -Nos números de Fibonacci, cada número é a soma dos dois anteriores. A sequência começa com 1 e 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -Encontras estes números surpreendentemente vezes na natureza, por exemplo na forma como as sementes do girassol estão dispostas. - -::: ludwig -Lembras-te da **troca** da lição 5? Aí precisavas de uma variável auxiliar, porque `a = b` substitui o valor antigo de `a`. Aqui é igual: antes de `numero2` receber o número novo, o seu valor antigo tem de estar guardado em `numero1`. Atenção à **ordem**: primeiro `numero1 = numero2`, depois `numero2 = numero3`. Vais precisar outra vez de avançar e trocar valores mais tarde, por exemplo ao ordenar na lição 19. -::: - -::: angeberwissen -Em 1202, Leonardo de Pisa, conhecido como Fibonacci, pôs no seu livro de cálculo um problema sobre coelhos: a partir do segundo mês, cada casal de coelhos tem um novo casal todos os meses. Quantos casais há ao fim de um ano? A resposta é esta sequência. Infelizmente, o livro não tinha cabras. -::: - -::: übung aufgabe-fibonacci -titel: Números de Fibonacci -auftrag: Pergunta quantos números de Fibonacci devem ser mostrados. Depois mostra exatamente esses, cada um na sua linha. Podes partir do princípio de que é introduzido pelo menos 2. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Cada número novo é a soma dos dois anteriores. Por isso tens sempre de guardar os dois últimos números. -tipp: Guarda os dois últimos números em `numero1` e `numero2` e mostra os dois antes do ciclo. O ciclo começa em `int i = 2`. Lá dentro calculas `int numero3 = numero1 + numero2`, mostras e depois avanças: `numero1 = numero2` e `numero2 = numero3`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-fibonacci-java -titel: Números de Fibonacci em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Os dois primeiros números mostras antes do ciclo. O ciclo `for` começa então em `int i = 2`. -tipp: No corpo: `int numero3 = numero1 + numero2;`, mostrar, depois `numero1 = numero2;` e `numero2 = numero3;`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Porque é que no ciclo `numero1 = numero2` tem de vir antes de `numero2 = numero3`? -- [ ] Porque senão o Java não permite as atribuições -- [x] Porque senão o valor antigo de numero2 é substituído antes de numero1 o receber -- [ ] A ordem não importa -> Ao contrário, numero1 e numero2 ficariam depois com o mesmo valor. Tal como na troca: primeiro guardar, depois substituir. -::: diff --git a/web/lessons/pt/aufgaben/gerade-ungerade.md b/web/lessons/pt/aufgaben/gerade-ungerade.md deleted file mode 100644 index 7496f1d4..00000000 --- a/web/lessons/pt/aufgaben/gerade-ungerade.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Par ou ímpar -nach: 8 -stufe: 1 ---- - -Um número é par se não sobrar resto quando o divides por 2. O resto calcula-se com `%`: `8 % 2` dá 0, `7 % 2` dá 1. - -::: übung aufgabe-gerade -titel: Par ou ímpar -auftrag: Pede um número inteiro. Mostra se é par ou ímpar. Para 4 a saída é **4 é par**, para 7 **7 é ímpar**. -test: 4 -> 4 é par -test: 7 -> 7 é ímpar -test: 0 -> 0 é par -test: 15 -> 15 é ímpar -braucht: verzweigung -tipp: Uma decisão escolhe entre par e ímpar. Par quer dizer: divisível por 2 sem resto. -tipp: A condição é `numero % 2 == 0`. Na saída juntas o número e o texto com `+`, p. ex. `numero + " é par"`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-gerade-java -titel: Par ou ímpar em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 4 -> 4 é par -test: 7 -> 7 é ímpar -test: 0 -> 0 é par -test: 15 -> 15 é ímpar -braucht: verzweigung -tipp: Lês um número com `int numero = scanner.nextInt();`. Antes disso perguntas com `System.out.println(…)`. -tipp: `if (numero % 2 == 0) { … } else { … }`. A saída é `System.out.println(numero + " é par");`. -lösung: aufgabe-gerade-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/mehrwertsteuer.md b/web/lessons/pt/aufgaben/mehrwertsteuer.md deleted file mode 100644 index 01a0266e..00000000 --- a/web/lessons/pt/aufgaben/mehrwertsteuer.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -titel: IVA -nach: 6 -stufe: 1 ---- - -Em Portugal continental, a quase tudo o que compras é somado 23 % de **IVA** (imposto sobre o valor acrescentado). A loja calcula com o preço sem IVA e soma o imposto por cima. Isso dá o preço com IVA que pagas na caixa. - -Um exemplo: compras um telemóvel dobrável que se abre e fica um tablet. Na etiqueta da loja estão 1000 euros sem IVA. Por cima vêm 23 %, ou seja, 230 euros. Na caixa pagas 1230 euros. A loja não pode ficar com os 230 euros: entrega-os às Finanças. - -::: grafik aufgabe-mehrwertsteuer.svg -Preço sem IVA mais IVA dá o preço com IVA. O IVA vai para as Finanças. -::: - -::: angeberwissen -Mééé, claro que a própria loja comprou o telemóvel: ao fabricante, por 800 euros mais 184 euros de IVA. Estes 184 euros chamam-se **IVA dedutível**, e a loja pode descontá-los dos 230 euros. Por isso só entrega 46 euros às Finanças. No fim, só uma pessoa paga o imposto todo: o cliente na caixa. Ou seja, tu. Eu, já agora, não pago imposto nenhum. Só como erva. -::: - -A taxa do imposto nunca muda enquanto fazes as contas. Por isso crias-a como **constante**: uma variável cujo valor não muda depois de definido. Escreves `const` à frente, por exemplo `const double IVA = 0.23`. Os nomes das constantes escrevem-se em maiúsculas para as reconheceres logo. No código Java isto passa a `final double IVA = 0.23;`. - -Se a taxa alguma vez mudar, só tens de alterar esta linha. - -::: übung aufgabe-mehrwertsteuer -titel: IVA -auftrag: Cria a constante `IVA` com o valor 0.23. Depois pede o preço sem IVA. Mostra primeiro o imposto e depois o preço com IVA, de cada vez só o número. - Para um preço sem IVA de 100, as saídas são **23** e **123**. -test: 100 -> 23 | 123 -test: 50 -> 11.5 | 61.5 -test: 0 -> 0 | 0 -tipp: O imposto é 23 por cento do preço sem IVA. O preço com IVA é o que pagas no fim. -tipp: O imposto é `precoSemIva * IVA`. O preço com IVA obténs somando o imposto ao preço sem IVA. Os dois valores são números decimais, portanto `double`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Porque crias a taxa do imposto como constante? -- [ ] Porque as constantes são calculadas mais depressa -- [x] Porque o seu valor não deve mudar no programa -- [ ] Porque os números decimais só podem ser guardados como constantes -> Uma constante mantém o seu valor. Se a taxa alguma vez mudar, só alteras a linha com `const`. -::: diff --git a/web/lessons/pt/aufgaben/notendurchschnitt.md b/web/lessons/pt/aufgaben/notendurchschnitt.md deleted file mode 100644 index ebb59cf5..00000000 --- a/web/lessons/pt/aufgaben/notendurchschnitt.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Média das notas -nach: 13 -stufe: 2 ---- - -Como te correu ultimamente? A média é a soma de todas as notas a dividir pelo número de notas. - -::: übung aufgabe-durchschnitt -titel: Média das notas -auftrag: Pergunta primeiro quantas notas vão ser introduzidas. Depois lê exatamente essas notas e mostra a média, só o número. - Para as notas 4 e 5, a média é **4.5**. -test: 2, 4, 5 -> 4.5 -test: 3, 3, 4, 5 -> 4 -test: 4, 3, 3, 4, 5 -> 3.75 -braucht: forSchleife -tipp: Precisas da soma de todas as notas e de quantas são. A média é a soma a dividir pela quantidade. -tipp: O ciclo for vai de `int i = 0` enquanto `i < quantidade`. Lá dentro lês uma nota e somas à soma. Guardas a média como número decimal: `double media = soma * 1.0 / quantidade`. O `* 1.0` garante que também o Java não faz uma divisão inteira. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-durchschnitt-java -titel: Média das notas em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 2, 4, 5 -> 4.5 -test: 3, 3, 4, 5 -> 4 -test: 4, 3, 3, 4, 5 -> 3.75 -braucht: forSchleife -tipp: `for (int i = 0; i < quantidade; i++)` lê exatamente as notas que foram indicadas antes. -tipp: Divide com `double media = soma * 1.0 / quantidade;`. Sem `* 1.0`, o Java divide dois `int` como inteiros, e 1.5 passa a 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/pin-pruefen.md b/web/lessons/pt/aufgaben/pin-pruefen.md deleted file mode 100644 index 3828e50b..00000000 --- a/web/lessons/pt/aufgaben/pin-pruefen.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -titel: Verificar o PIN -nach: 12 -stufe: 2 ---- - -Numa caixa multibanco tens três tentativas para o teu PIN. Se escreveres um PIN errado três vezes, o cartão fica bloqueado. - -::: angeberwissen -John Shepherd-Barron, que instalou o primeiro multibanco em Londres em 1967, queria PINs de seis algarismos. Mas a mulher dele disse que só conseguia decorar quatro. É por isso que o teu PIN tem hoje quatro algarismos. -::: - -::: übung aufgabe-pin -titel: Verificar o PIN -auftrag: O PIN certo é 1234. Pede o PIN até estar certo ou até se terem gastado três tentativas. Depois mostra **PIN correto** ou **Cartão bloqueado**. -test: 1234 -> PIN correto -test: 1111, 1234 -> PIN correto -test: 1, 2, 1234 -> PIN correto -test: 1, 2, 3 -> Cartão bloqueado -braucht: doUntilSchleife, verzweigung -tipp: O ciclo termina em dois casos: quando o PIN está certo ou quando se gastaram três tentativas. Conta as tentativas. -tipp: O PIN é pedido pelo menos uma vez, por isso serve um ciclo do-while. Antes dele, cria `int pin = 0` e `int tentativas = 0`. O ciclo repete-se enquanto `pin != 1234 && tentativas < 3`. Depois do ciclo, uma decisão decide o que é mostrado. -lösung: aufgabe-pin-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-pin-java -titel: Verificar o PIN em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 1234 -> PIN correto -test: 1111, 1234 -> PIN correto -test: 1, 2, 1234 -> PIN correto -test: 1, 2, 3 -> Cartão bloqueado -braucht: doUntilSchleife, verzweigung -tipp: `do { … } while (…);` pergunta pelo menos uma vez. Depois do `while (…)` há um ponto e vírgula. -tipp: Cria antes `int pin = 0;` e `int tentativas = 0;`. No ciclo: `int entrada = scanner.nextInt();`, `pin = entrada;` e `tentativas++;`. A condição é `pin != 1234 && tentativas < 3`. -lösung: aufgabe-pin-java-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/schiffe-versenken.md b/web/lessons/pt/aufgaben/schiffe-versenken.md deleted file mode 100644 index 149f903c..00000000 --- a/web/lessons/pt/aufgaben/schiffe-versenken.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Batalha naval -nach: 16 -stufe: 2 ---- - -No jogo da batalha naval, o mar é uma grelha. As colunas chamam-se A a E, as filas 1 a 5. No diagrama inicial, o mar é o array 2D `mar`: `true` quer dizer que há parte de um navio nesse quadrado. - -::: grafik schiffe-versenken.svg -Cinzento quer dizer `true`: aqui há um navio. Os pequenos números cinzentos são os índices no array; começam em 0. No jogo, pelo contrário, os quadrados chamam-se A a E e 1 a 5. -::: - -::: übung aufgabe-schiffe -titel: Batalha naval -auftrag: Mostra todos os quadrados que têm um navio, cada quadrado na sua linha, p. ex. **B1**. Percorre o mar fila a fila com dois ciclos encaixados. - Para o diagrama inicial aparecem **B1**, **C1**, **D1**, **E3**, **E4** e **A5**. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Percorre o mar com dois ciclos encaixados, tal como no cinema. Só mostras os quadrados que têm `true`. -tipp: O ciclo exterior conta `fila`, o interior `coluna`, os dois a partir de 0. Se houver um navio em `mar[fila][coluna]`, mostras a letra de `colunas[coluna]` e o número da fila: `output: colunas[coluna] + (fila + 1)`. Precisas do `+ 1` porque o jogo começa a contar em 1. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-schiffe-java -titel: Batalha naval em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Dois ciclos `for` um dentro do outro: fora a fila, dentro a coluna, ambos até `.length`. -tipp: `if (mar[fila][coluna]) { System.out.println(colunas[coluna] + (fila + 1)); }`. Os parênteses à volta de `fila + 1` fazem o Java calcular primeiro. -lösung: aufgabe-schiffe-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/speisekarte.md b/web/lessons/pt/aufgaben/speisekarte.md deleted file mode 100644 index 9618a126..00000000 --- a/web/lessons/pt/aufgaben/speisekarte.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Ementa -nach: 10 -stufe: 1 ---- - -Na cantina da escola pedes por número. O programa diz-te que prato corresponde ao número. - -::: übung aufgabe-speisekarte -titel: Ementa -auftrag: Pede um número. Para 1 mostra **Salada grega**, para 2 **Bacalhau à Brás** e para 3 **Wrap de falafel**. Para qualquer outro número mostra **Escolhe um número válido**. -test: 1 -> Salada grega -test: 2 -> Bacalhau à Brás -test: 3 -> Wrap de falafel -test: 7 -> Escolhe um número válido -braucht: fallauswahl -tipp: Para vários números fixos serve uma seleção. O que acontece com todos os outros números? -tipp: Lê o número com `input: int prato "Que prato?"`. A seleção verifica `prato`, e os casos chamam-se `1`, `2` e `3`. Todos os outros números vão parar ao caso `default`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-speisekarte-java -titel: Ementa em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 1 -> Salada grega -test: 2 -> Bacalhau à Brás -test: 3 -> Wrap de falafel -test: 7 -> Escolhe um número válido -braucht: fallauswahl -tipp: Em Java isto é uma seleção com `switch (prato) { … }`. -tipp: Cada caso é assim: `case 1 -> { System.out.println("…"); }`. Para todos os outros números há `default -> { … }`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/summe-bilden.md b/web/lessons/pt/aufgaben/summe-bilden.md deleted file mode 100644 index 69f65def..00000000 --- a/web/lessons/pt/aufgaben/summe-bilden.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Somar -nach: 2 -stufe: 1 ---- - -Define dois números, soma-os e mostra o resultado. - -::: übung aufgabe-summe -titel: Somar -auftrag: Dá a `numero1` o valor 4 e a `numero2` o valor 3. Calcula a soma numa terceira variável e mostra só a soma. -test: - -> 7 -tipp: Precisas de três variáveis: duas para os números e uma para o resultado. -tipp: Defines uma variável com uma instrução como `int numero1 = 4`. Na saída escreves o nome da variável sem aspas. -lösung: aufgabe-summe-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/tafeldienst.md b/web/lessons/pt/aufgaben/tafeldienst.md deleted file mode 100644 index 28505391..00000000 --- a/web/lessons/pt/aufgaben/tafeldienst.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -titel: Sortear quem limpa o quadro -nach: 15 -stufe: 2 ---- - -Quem é que limpa o quadro esta semana? Cinco nomes vão para um array, depois é sorteado um número. - -::: übung aufgabe-tafeldienst -titel: Sortear quem limpa o quadro -auftrag: Lê cinco nomes para um array de Strings. Depois pede um número sorteado de 1 a 5 e mostra **Limpa o quadro:** e o nome correspondente. - O número 1 corresponde ao primeiro nome, o 5 ao último. -test: Ada, Rui, Inês, Duarte, Eva, 3 -> Limpa o quadro: Inês -test: Ada, Rui, Inês, Duarte, Eva, 1 -> Limpa o quadro: Ada -test: Lara, Mário, Nuno, Olga, Pedro, 5 -> Limpa o quadro: Pedro -braucht: forSchleife -tipp: Primeiro, um ciclo lê os cinco nomes. Depois já não precisas de ciclo, só de olhar para uma posição. -tipp: Crias o array com `String[] nomes = new String[5]`. Atenção: o número sorteado começa em 1, o índice em 0. Por isso o nome está em `nomes[sorteado - 1]`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-tafeldienst-java -titel: Sortear quem limpa o quadro em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: Ada, Rui, Inês, Duarte, Eva, 3 -> Limpa o quadro: Inês -test: Ada, Rui, Inês, Duarte, Eva, 1 -> Limpa o quadro: Ada -test: Lara, Mário, Nuno, Olga, Pedro, 5 -> Limpa o quadro: Pedro -braucht: forSchleife -tipp: Um array para cinco nomes crias com `String[] nomes = new String[5];`. -tipp: No ciclo: `nomes[i] = scanner.next();`. O número 1 corresponde à posição 0, por isso mostras `nomes[sorteado - 1]`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> Com `int sorteado = (int) (Math.random() * 5) + 1` também podes deixar o acaso sortear o número. Mas para a verificação automática precisamos de uma entrada fixa. diff --git a/web/lessons/pt/aufgaben/taschenrechner.md b/web/lessons/pt/aufgaben/taschenrechner.md deleted file mode 100644 index efd1854d..00000000 --- a/web/lessons/pt/aufgaben/taschenrechner.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Calculadora -nach: 10 -stufe: 2 ---- - -Uma pequena calculadora: escreves dois números e um operador, e aparece o resultado. - -::: übung aufgabe-rechner -titel: Calculadora -auftrag: Pede dois números inteiros e depois um operador como texto: `+`, `-` ou `*`. Mostra o resultado. Para qualquer outro sinal mostra **Operador desconhecido**. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Operador desconhecido -braucht: fallauswahl -tipp: Lê os três valores. Depois, uma seleção sobre o operador decide o que é calculado. -tipp: Lês o operador com `input: String operador "Operador"`. A seleção verifica `operador`, os casos chamam-se `"+"`, `"-"` e `"*"`, e o último caso é `default`. Em cada caso, calcula primeiro numa variável e depois mostra-a, senão o `+` só junta os números. -lösung: aufgabe-rechner-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-rechner-java -titel: Calculadora em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Operador desconhecido -braucht: fallauswahl -tipp: O operador é um texto. Lês com `String operador = scanner.next();`. -tipp: `switch (operador) { case "+" -> { … } … default -> { … } }`. Com textos, os casos ficam entre aspas. -lösung: aufgabe-rechner-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/verleih-menue.md b/web/lessons/pt/aufgaben/verleih-menue.md deleted file mode 100644 index b712ef28..00000000 --- a/web/lessons/pt/aufgaben/verleih-menue.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Menu de aluguer -nach: 18 -stufe: 2 ---- - -Na máquina de aluguer podes reservar vários veículos, um a seguir ao outro. O menu volta sempre até escolheres **0** para sair. - -::: übung aufgabe-verleih -titel: Menu de aluguer -auftrag: Pede sempre uma escolha: 1 = bicicleta elétrica, 2 = trotinete elétrica, 0 = sair. Para 1 mostra **Bicicleta reservada**, para 2 **Trotinete reservada** e para qualquer outro número **Escolha inválida**. - Para 0, o programa mostra **Adeus** e sai do ciclo com uma Interrupção. -test: 0 -> Adeus -test: 1, 2, 0 -> Bicicleta reservada | Trotinete reservada | Adeus -test: 2, 5, 1, 0 -> Trotinete reservada | Escolha inválida | Bicicleta reservada | Adeus -braucht: endlosschleife, aussprung -tipp: O menu é executado uma e outra vez até alguém escolher 0. Para isso serve bem um ciclo infinito com uma Interrupção. -tipp: Usa um ciclo infinito. Lá dentro vem primeiro a entrada `input: int escolha "1 = bicicleta elétrica, 2 = trotinete elétrica, 0 = sair"`, depois uma seleção sobre `escolha` com os casos `0`, `1`, `2` e `default`. O caso `0` tem a saída e, por baixo, a Interrupção. -lösung: aufgabe-verleih-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-verleih-java -titel: Menu de aluguer em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 0 -> Adeus -test: 1, 2, 0 -> Bicicleta reservada | Trotinete reservada | Adeus -test: 2, 5, 1, 0 -> Trotinete reservada | Escolha inválida | Bicicleta reservada | Adeus -braucht: endlosschleife, aussprung -tipp: `while (true) { … }` corre sem fim até aparecer um `break;`. -tipp: Em Java usa aqui `if`/`else if` em vez de `switch`: um `break;` dentro de um `switch` só sai do `switch`, não do ciclo. `if (escolha == 0) { System.out.println("Adeus"); break; } else if (escolha == 1) { … }`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/vokabeltrainer.md b/web/lessons/pt/aufgaben/vokabeltrainer.md deleted file mode 100644 index 122eac67..00000000 --- a/web/lessons/pt/aufgaben/vokabeltrainer.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -titel: Treino de vocabulário -nach: 27 -stufe: 3 ---- - -O Ludwig está a aprender inglês. As palavras dele estão num ficheiro CSV, à esquerda em português, à direita em inglês: - -::: datei vocabulario.csv -Português;Inglês -cabra;goat -feno;hay -prado;meadow -::: - -Como só o ficheiro conhece as palavras, mais tarde podes simplesmente acrescentar linhas novas sem alterar o programa. - -::: angeberwissen -Foi Sebastian Leitner quem, em 1972, tornou conhecida a caixa de fichas com várias divisões: as fichas que sabes passam para a divisão seguinte e aparecem menos vezes, as erradas voltam para a primeira. Muitas apps de vocabulário ainda funcionam assim. -::: - -::: übung aufgabe-vokabeln -titel: Treino de vocabulário -code: java -auftrag: Pergunta cada palavra do ficheiro: mostra **Como se diz cabra em inglês?** e lê a resposta com `scanner.next()`. Se estiver certa, mostra **Certo!**, senão por exemplo **Errado, é goat.** - No fim aparece quantas estavam certas, por exemplo **2 de 3 certas**. -start: aufgabe-vokabeln-start.visustruct -test: goat, hay, meadow -> Como se diz cabra em inglês? | Certo! | Como se diz feno em inglês? | Certo! | Como se diz prado em inglês? | Certo! | 3 de 3 certas -test: cow, hay, meadow -> Como se diz cabra em inglês? | Errado, é goat. | Como se diz feno em inglês? | Certo! | Como se diz prado em inglês? | Certo! | 2 de 3 certas -test: goat, feno, prado -> Como se diz cabra em inglês? | Certo! | Como se diz feno em inglês? | Errado, é hay. | Como se diz prado em inglês? | Errado, é meadow. | 1 de 3 certas -braucht: whileSchleife, verzweigung -tipp: Salta a linha de cabeçalho. No ciclo, divide cada linha com `split(";")`: `partes[0]` é a palavra em português, `partes[1]` a palavra em inglês. -tipp: Os textos comparam-se com `resposta.equals(partes[1])`, não com `==`. Conta com `int certas = 0;` e `int contagem = 0;` antes do ciclo. -lösung: aufgabe-vokabeln-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/volljaehrig.md b/web/lessons/pt/aufgaben/volljaehrig.md deleted file mode 100644 index 00457c9d..00000000 --- a/web/lessons/pt/aufgaben/volljaehrig.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -titel: Maior de idade? -nach: 8 -stufe: 1 ---- - -No cinema, na carta de condução ou para votar: muitas vezes interessa saber se alguém já tem 18 anos. - -::: übung aufgabe-volljaehrig -titel: Maior de idade? -auftrag: Pede a idade. Se a pessoa tiver 18 anos ou mais, mostra **maior de idade**, senão **menor de idade**. -test: 18 -> maior de idade -test: 35 -> maior de idade -test: 17 -> menor de idade -test: 6 -> menor de idade -braucht: verzweigung -tipp: Há duas saídas possíveis, por isso precisas de uma decisão. -tipp: Lê a idade com `input: int idade "Quantos anos tens?"`. A condição da decisão é `idade >= 18`. Garante que 18 já conta como maior de idade. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-volljaehrig-java -titel: Maior de idade? em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 18 -> maior de idade -test: 35 -> maior de idade -test: 17 -> menor de idade -test: 6 -> menor de idade -braucht: verzweigung -tipp: Lê a idade com `int idade = scanner.nextInt();`. -tipp: `if (idade >= 18) { … } else { … }`, com um `System.out.println(…)` em cada ramo. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: diff --git a/web/lessons/pt/aufgaben/wuerfel-mvc.md b/web/lessons/pt/aufgaben/wuerfel-mvc.md deleted file mode 100644 index 61e8a89d..00000000 --- a/web/lessons/pt/aufgaben/wuerfel-mvc.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -titel: Lançar o dado com MVC -nach: 40 -stufe: 3 ---- - -Constrói um jogo de dados com Model View Controller. Um botão **Lançar** lança o dado, e duas views mostram o resultado. - -O model já está pronto. Lança o dado e conta quantas vezes foi lançado e quantos seis saíram: - -```java -class Dado { - int pontos = 1; - int lancamentos = 0; - int seis = 0; - - void lancar() { - pontos = (int) (Math.random() * 6) + 1; - lancamentos++; - if (pontos == 6) { - seis++; - } - } -} -``` - -A tua tarefa: - -1. Testa primeiro o model sem janela: lança dez vezes no `main` e depois mostra `lancamentos` e `seis`. -2. Escreve a view `VistaPontos`. Mostra o número que saiu num JLabel grande, por exemplo "4". -3. Escreve a view `VistaEstatistica`. Mostra por exemplo "Seis: 2 em 10 lançamentos". -4. O controller é o ouvinte do botão: manda o model lançar e passa os valores novos às duas views. - -**Terminaste quando …** - -- na consola, depois de dez lançamentos, `lancamentos` é 10 e `seis` está entre 0 e 10, -- cada clique em **Lançar** mostra um número novo de 1 a 6 na `VistaPontos`, -- a `VistaEstatistica` conta mais um lançamento depois de cada clique e conta bem os seis, -- no model não há nenhum `JLabel` e nas views não há nenhum `Math.random`. - -Extra: um botão **Novo jogo** põe tudo no início. O método para isso pertence ao model. - -::: ludwig -Lembra-te da regra da lição 40: no model não há um único `JLabel`. Se mudares o tamanho da letra ao lançar, isso pertence à view. -::: diff --git a/web/lessons/pt/aufgaben/zahl-verdoppeln.md b/web/lessons/pt/aufgaben/zahl-verdoppeln.md deleted file mode 100644 index 401ee7ad..00000000 --- a/web/lessons/pt/aufgaben/zahl-verdoppeln.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -titel: Duplicar um número -nach: 2 -stufe: 1 ---- - -Uma variável pode mudar de valor. Aqui um número é duplicado. - -::: übung aufgabe-verdoppeln -titel: Duplicar um número -auftrag: Dá à variável `numero` o valor 4. Duplica-a numa segunda instrução, sem criar uma variável nova. Depois mostra **Número duplicado: 8**, em que o 8 vem da variável. -test: - -> Número duplicado: 8 -tipp: Duplicar quer dizer: vezes 2. Guardas o resultado outra vez na mesma variável. -tipp: `numero = numero * 2` calcula com o valor antigo e volta a guardar o resultado em `numero`. Juntas texto e uma variável com `+`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: diff --git a/web/lessons/pt/begriffe.md b/web/lessons/pt/begriffe.md deleted file mode 100644 index 58d6b4ac..00000000 --- a/web/lessons/pt/begriffe.md +++ /dev/null @@ -1,258 +0,0 @@ -Termos técnicos da área de aprendizagem. Quando um termo aparece num passo, fica marcado uma vez e mostra a sua -explicação ao passar o rato ou ao tocar. Se estiver a negrito nesse passo, é explicado ali mesmo e não é marcado. -`auch:` indica outras formas que também são reconhecidas. Maiúsculas e minúsculas contam. - -### Algoritmo -auch: algoritmo, algoritmos, Algoritmos -Instruções exatas, passo a passo, para resolver uma tarefa. Cada passo é claro. - -### Estrutograma -auch: estrutograma, estrutogramas, Estrutogramas, diagrama de Nassi-Shneiderman, diagramas de Nassi-Shneiderman, diagrama estruturado -Um algoritmo desenhado como imagem feita de blocos. Lê-se de cima para baixo. Também se chama diagrama de Nassi-Shneiderman. - -### Fluxograma -auch: fluxograma, fluxogramas, Fluxogramas -Um algoritmo desenhado com símbolos ligados por setas (DIN 66001 / ISO 5807). Um losango é uma decisão. - -### Pseudocódigo -auch: pseudocódigo -Um algoritmo escrito como texto em linguagem corrente com palavras fixas como SE e ENQUANTO. A indentação mostra o que pertence ao quê. - -### Instrução -auch: instrução, instruções, Instruções -Um único passo no estrutograma, por exemplo um cálculo, uma entrada ou uma saída. - -### Sequência -auch: sequência, sequências, Sequências -Passos que são executados uns a seguir aos outros, de cima para baixo, cada um exatamente uma vez. - -### Decisão -auch: decisão, decisões, Decisões, instrução condicional, instruções condicionais, estrutura de decisão -Um bloco que usa uma condição para decidir qual de dois ramos é executado. Também se chama instrução condicional. - -### Ramo -auch: ramo, ramos -Um dos dois caminhos de uma decisão: à esquerda para verdadeiro (true), à direita para falso (false). - -### Ciclo -auch: ciclo, ciclos, Ciclos, repetição, estrutura de repetição -Um bloco que repete passos enquanto uma condição se verificar. - -### Corpo do ciclo -auch: corpo do ciclo -O interior de um ciclo, ou seja, os passos que são repetidos. - -### Iteração -auch: iteração, iterações -Executar uma vez o interior de um ciclo. - -### Condição -auch: condição, condições, Condições -Uma pergunta que só pode ter como resposta sim (true) ou não (false), por exemplo idade >= 18. - -### Marcador -auch: marcador, marcadores -Um bloco vazio com o sinal ø. Se arrastares um elemento para cima dele, o elemento substitui-o. - -### Inspetor de objetos -A área por baixo do diagrama. Aqui editas o texto e as definições do bloco em que acabaste de clicar. - -### Simulação -auch: simulação -Executa o teu estrutograma no editor, se quiseres passo a passo. Assim vês o que acontece. - -### Variável -auch: variável, variáveis, Variáveis -Uma caixa com etiqueta para um valor. Tem um nome, um tipo de dados e um valor. - -### camelCase -auch: CamelCase -Forma de escrever nomes com várias palavras: escritas juntas, cada palavra seguinte começa com maiúscula, p. ex. `precoComIva`. - -### case-sensitive -O Java distingue maiúsculas de minúsculas: `numero`, `Numero` e `NUMERO` são três nomes diferentes. `system` em vez de `System` é um erro. - -### Constante -auch: constante, constantes, Constantes -Uma variável cujo valor não muda depois de definido. Escreve-se `const` à frente, p. ex. `const double IVA = 0.23`. - -### Tipo de dados -auch: tipo de dados, tipos de dados, Tipos de dados -Diz que tipo de valor cabe numa variável: int (número inteiro), double (número decimal), String (texto), boolean (verdadeiro ou falso) ou char (um único caractere). - -### Atribuição -auch: atribuição, atribuições, Atribuições -O sinal =. Calcula o lado direito e guarda o resultado na variável à esquerda. - -### Variável auxiliar -auch: variável auxiliar, variáveis auxiliares -Uma variável extra que guarda um valor durante pouco tempo, por exemplo ao trocar valores. - -### Modelo EPS -auch: entrada-processamento-saída -Entrada, processamento, saída: primeiro pedir os valores, depois calcular, depois mostrar o resultado. - -### Análise do problema -auch: análise do problema -Lês uma tarefa com atenção e descobres o que é dado, o que procuras e como chegar de um ao outro. - -### Operador de comparação -auch: operador de comparação, operadores de comparação, Operadores de comparação -Um sinal que compara dois valores, por exemplo == ou <. O resultado é true ou false. - -### Seleção -auch: seleção, seleção múltipla, escolha múltipla -Um bloco que executa exatamente um de vários casos, consoante o valor de uma variável. Também se chama seleção múltipla. - -### Ciclo pré-teste -auch: ciclo pré-teste, ciclos pré-teste, controlado no início -O ciclo verifica a sua condição antes de cada iteração. Se a condição for falsa logo no início, o ciclo não é executado nem uma vez. - -### Ciclo pós-teste -auch: ciclo pós-teste, ciclos pós-teste, controlado no fim -O ciclo só verifica a sua condição depois de cada iteração. Por isso é sempre executado pelo menos uma vez. - -### Variável contadora -auch: variável contadora, variáveis contadoras, contador -Uma variável que vai contando num ciclo, normalmente i. - -### Ciclo infinito -auch: ciclo infinito, ciclos infinitos, ciclo sem fim -Um ciclo cuja condição nunca se torna falsa. Nunca para sozinho. - -### Array -auch: array, arrays, Arrays, vetor, vetores -Uma fila de posições com um nome comum e o mesmo tipo de dados. - -### Índice -auch: índice, índices -O número de uma posição num array. Começa-se a contar em 0. - -### char -O tipo de dados para um único caractere. Fica entre aspas simples, p. ex. 'C'. Já "C" com aspas duplas é uma String. - -### Código de caractere -auch: código de caractere, códigos de caractere, código ASCII, tabela ASCII -O número que está por trás de um caractere. Na tabela ASCII, o A tem o código 65, o B 66 e assim por diante. Em Java, (int) transforma um caractere no seu código e (char) transforma um código no caractere. - -### String -auch: strings, Strings, cadeia de caracteres, cadeias de caracteres -Um texto, ou seja, uma fila de caracteres. Em Java o tipo de dados chama-se String. Os caracteres contam-se a partir de 0. - -### Array 2D -auch: arrays 2D, array bidimensional, arrays bidimensionais, matriz, matrizes -Um array com linhas e colunas, como uma tabela. Uma posição precisa de dois índices, p. ex. `lugares[1][2]`. - -### Subprograma -auch: subprograma, subprogramas, Subprogramas, método, métodos, Métodos, procedimento, procedimentos, função, funções, Funções -Um estrutograma próprio para uma parte da tarefa. É executado quando é chamado. Em Java chama-se método; consoante o tipo, também procedimento ou função. - -### Parâmetro -auch: parâmetro, parâmetros, Parâmetros -Uma variável na linha de cabeçalho de um subprograma. Quando é chamado, recebe o valor que está entre parênteses. - -### Código esparguete -auch: código esparguete -Um programa que salta de um lado para o outro de forma tão confusa que mal se consegue seguir o que acontece. Os estrutogramas evitam isso. - -### Passagem por valor -auch: passagem por valor -Um subprograma recebe uma cópia do valor. Se alterar o seu parâmetro, a variável de quem chamou fica igual. - -### Passagem por referência -auch: passagem por referência -Um subprograma recebe uma referência para os mesmos dados, p. ex. para um array. Se alterar uma posição, quem chamou também vê a alteração. - -### Valor de retorno -auch: valor de retorno, valores de retorno, Valores de retorno -O resultado que um subprograma devolve à chamada com return. - -### Interrupção -Um bloco que sai imediatamente do ciclo em que está. Depois o programa continua por baixo do ciclo. - -### Erro de sintaxe -auch: erro de sintaxe, erros de sintaxe, Erros de sintaxe -Um erro na forma como o código está escrito, por exemplo um `;` em falta. O programa nem sequer arranca. Em inglês: syntax error. - -### Erro de execução -auch: erro de execução, erros de execução, Erros de execução -Um erro que só acontece enquanto o programa corre, por exemplo dividir por 0. O programa para nesse ponto. Em inglês: runtime error. - -### Erro de lógica -auch: erro de lógica, erros de lógica, Erros de lógica -O programa corre sem nenhuma mensagem, mas dá um resultado errado. Encontra-se com o teste de secretária. Em inglês: logic error. - -### Teste de secretária -auch: teste de secretária, testes de secretária, Testes de secretária, teste de mesa -Executas um estrutograma no papel e anotas os valores das variáveis depois de cada passo. - -### Pesquisa linear -auch: pesquisa linear -Uma forma de pesquisar que compara todos os valores, um a seguir ao outro, com o valor procurado. Também funciona com valores desordenados. - -### Pesquisa binária -auch: pesquisa binária -Uma forma de pesquisar em valores ordenados. Olha para o meio e continua a pesquisar só na metade certa. - -### Bubble sort -auch: bubble sort, Bubblesort, ordenação por bolha -Uma forma simples de ordenar. Compara sempre dois vizinhos e troca-os se estiverem na ordem errada. - -### Evento -auch: evento, eventos, Eventos -Algo que uma pessoa faz num programa com janelas, por exemplo clicar num botão. O programa reage com um ouvinte (ActionListener). - -### Interface -auch: Interfaces -Uma espécie de contrato em Java: diz que métodos uma classe tem de ter. `ActionListener` é uma interface com o método `actionPerformed`. - -### Exceção -auch: exceção, exceções, Exceções, Exception, Exceptions -Um erro que só acontece durante a execução, por exemplo um índice fora do array. Se nenhum `catch` a apanhar, o programa termina. - -### Atributo -auch: atributo, atributos, Atributos -Uma variável que está diretamente na classe e não dentro de um método. Com `static` pertence à própria classe e vive tanto tempo como o programa, por exemplo um contador de cliques que vários ouvintes alteram. - -### Scanner -Um bloco pronto do Java que lê entradas do teclado, por exemplo um número com `scanner.nextInt()`. Precisa de `import java.util.Scanner;` mesmo no início. - -### Comentário -auch: Comentários, comentário, comentários -Uma nota no código para pessoas. O Java salta-a ao executar. `//` vale até ao fim da linha, `/* … */` pode ocupar várias linhas. - -### import -Uma linha mesmo no início do código Java que vai buscar um bloco pronto a um pacote, por exemplo `import java.util.Scanner;`. Sem ela, o Java não conhece o nome. - -### código-fonte -auch: Código-fonte -O texto do programa que as pessoas escrevem e leem, por exemplo num ficheiro `Tabuada.java`. - -### compilador -auch: Compilador, compiladores -Um programa que traduz código-fonte. Em Java chama-se `javac` e transforma um ficheiro `.java` em bytecode num ficheiro `.class`. - -### bytecode -auch: Bytecode -A forma traduzida de um programa Java num ficheiro `.class`. Quem o lê é a JVM, não as pessoas. - -### JVM -auch: Java Virtual Machine, máquina virtual -A Java Virtual Machine executa bytecode. É um programa que funciona como um pequeno computador feito de software no Windows, no macOS ou no Linux. Por isso o Java é independente da plataforma. - -### JRE -Java Runtime Environment: a JVM e blocos prontos. Com ele podes executar programas Java, mas não compilá-los. - -### JDK -Java Development Kit: o JRE e ainda o compilador `javac` e outras ferramentas. É preciso para programar. - -### independente da plataforma -Um programa corre sem alterações em sistemas operativos diferentes. Em Java é a JVM que o permite: “Write once, run anywhere”. - -### código máquina -auch: Código máquina -Instruções em forma de números que o processador executa diretamente. Cada tipo de processador tem o seu próprio código máquina. - -### compilador JIT -auch: JIT -Uma parte da JVM que, durante a execução (“just in time”), traduz o bytecode muito usado em código máquina. Assim o Java fica mais rápido. diff --git a/web/lessons/pt/nachschlagen.md b/web/lessons/pt/nachschlagen.md deleted file mode 100644 index ea6ef9c4..00000000 --- a/web/lessons/pt/nachschlagen.md +++ /dev/null @@ -1,169 +0,0 @@ -## Elementos básicos - -### Instrução - -Um único passo. Serve para criar variáveis ou para calcular. - -``` -int numero = 5 -double preco = 2.5 -String nome = "Ada" -numero = numero + 1 -``` - -### Tipos de dados - -O tipo de dados vem antes do nome da variável. - -| Tipo de dados | Significado | Exemplo | -|---|---|---| -| `int` | número inteiro | `int quantidade = 3` | -| `double` | número decimal (com ponto) | `double preco = 2.5` | -| `String` | texto entre aspas duplas | `String nome = "Ada"` | -| `boolean` | valor lógico | `boolean pronto = false` | -| `char` | um único caractere entre aspas simples | `char nota = 'C'` | - -`'C'` é um `char`, `"C"` é uma String. Um caractere de um texto obténs com `charAt`: `char primeiro = nome.charAt(0)`. Cada caractere tem um código de caractere: `(int) 'A'` é 65, `(char) 66` é `'B'`. - -### Entrada - -Pede um valor enquanto o estrutograma é executado e guarda-o numa variável. O texto entre aspas é a pergunta. - -``` -input: int idade "Quantos anos tens?" -input: double preco "Introduz um preço" -input: String nome "Como te chamas?" -``` - -### Saída - -Mostra um texto ou um valor. Os textos ficam entre aspas; juntas texto e variáveis com `+`. - -``` -output: "Olá" -output: soma -output: "Tens " + idade + " anos." -``` - -> Numa saída, `+` junta sempre as partes: com 3 e 4, `output: a + b` mostra 34. Por isso calcula primeiro numa variável, p. ex. `int soma = a + b`, e depois mostra `soma`. - -## Decisões - -### Decisão - -Verifica uma condição. Se for verdadeira, é executado o ramo da esquerda (true), senão o da direita (false). - -``` -idade >= 18 -numero % 2 == 0 -nota < 1 || nota > 5 -``` - -### Seleção - -Escolhe um de vários casos, consoante o valor de uma variável. Se nenhum caso servir, aplica-se `default`. Acrescentas casos à direita com **Adicionar caso**. - -## Ciclos - -### Ciclo while - -Repete o seu interior **enquanto** a condição for verdadeira. A condição é verificada antes de cada iteração. - -``` -numero != 1 -i < 10 -``` - -### Ciclo do-while - -Executa o seu interior **pelo menos uma vez** e só depois verifica a condição. - -### Ciclo for - -Conta uma variável desde um valor inicial até um limite. Os três campos são Início, Condição e Passo. - -``` -int i = 0 -i < 5 -i++ -``` - -### Ciclo infinito - -Repete o seu interior sem condição. Uma **Interrupção** lá dentro permite sair dele. - -### Interrupção - -Sai do ciclo que a rodeia (`break`). - -## Subprogramas - -### Chamada - -Representa um subprograma, p. ex. `calcularSoma()`. Com parâmetros e valor de retorno, o subprograma tem uma linha de cabeçalho como título: - -``` -int quadrado(int x) linha de cabeçalho do subprograma -return x * x devolve o resultado -int q = quadrado(5) chamada, q fica com 25 -mostrarSoma(3, 4) chamada de um subprograma void -``` - -## Cálculos e comparações - -### Operadores e comparações - -- `+ - * /` as quatro operações básicas -- `%` resto de uma divisão (`7 % 2` dá 1) -- `==` igual, `!=` diferente -- `<` `<=` `>` `>=` menor, menor ou igual, maior, maior ou igual -- `&&` e, `||` ou - -## Arrays - -### Arrays - -Vários valores com um só nome. Começa-se a contar em 0. - -``` -int[] numeros = {3, 7, 1} -output: numeros[0] -int[] vazio = new int[5] -``` - -Um **array 2D** é uma tabela com linhas e colunas: - -``` -boolean[][] lugares = new boolean[3][5] -lugares[1][4] = true -output: lugares.length + " filas, " + lugares[0].length + " lugares" -``` - -## Java - -### Do código ao programa - -O compilador `javac` traduz `Ficheiro.java` em bytecode (`Ficheiro.class`). A JVM traduz o bytecode em código máquina ao executá-lo, da mesma forma no Windows, no macOS e no Linux. Já o C++ passa diretamente a código máquina e tem de ser compilado de novo para cada sistema. - -| | contém | para | -|---|---|---| -| JRE | JVM e bibliotecas | executar | -| JDK | JRE, compilador `javac`, ferramentas | programar | - -### Comentários - -Notas no código. O Java salta-as, o estrutograma fica igual. - -```java -/* - * Tarefa: somar os números de 1 a 10 - * (comentário de várias linhas) - */ -// Processamento (comentário de uma linha) -int soma = 0; -for (int i = 1; i <= 10; i++) { - soma = soma + i; // comentário depois do código -} // fim do for -``` - -Serve para: a tarefa, dividir o código em entrada, processamento e saída, uma explicação, o fim de um bloco depois de `}`, a saída esperada e notas para a próxima vez. diff --git a/web/lessons/welten/ausgang-1.txt b/web/lessons/welten/ausgang-1.txt deleted file mode 100644 index d7e86cea..00000000 --- a/web/lessons/welten/ausgang-1.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Labyrinth mit Ausgängen (nach Kara): jede Wandreihe hat genau eine Lücke, immer weiter rechts. Ein Zeichen = 30 cm. -raster: 3 -.......Z -#####.## -........ -##.##### ->....... diff --git a/web/lessons/welten/ausgang-2.txt b/web/lessons/welten/ausgang-2.txt deleted file mode 100644 index 81674d6a..00000000 --- a/web/lessons/welten/ausgang-2.txt +++ /dev/null @@ -1,9 +0,0 @@ -// Labyrinth mit Ausgängen, drei Reihen. Ein Zeichen = 30 cm. -raster: 3 -........Z -######.## -......... -####.#### -......... -.######## ->........ diff --git a/web/lessons/welten/ecke.txt b/web/lessons/welten/ecke.txt deleted file mode 100644 index 3ee64e8b..00000000 --- a/web/lessons/welten/ecke.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Um die Ecke (Sequenz im Kurs, Lektion 5): ein Zeichen = 30 cm. -raster: 3 -Z.... -###.. -..... -..### -^.... diff --git a/web/lessons/welten/farbe-1.txt b/web/lessons/welten/farbe-1.txt deleted file mode 100644 index 55a28f9c..00000000 --- a/web/lessons/welten/farbe-1.txt +++ /dev/null @@ -1,6 +0,0 @@ -// Fahre bis Rot: kurzer Weg -..... -..r.. -..... -..... -..^.. diff --git a/web/lessons/welten/farbe-2.txt b/web/lessons/welten/farbe-2.txt deleted file mode 100644 index 0139ed72..00000000 --- a/web/lessons/welten/farbe-2.txt +++ /dev/null @@ -1,9 +0,0 @@ -// Fahre bis Rot: erst kommt ein grünes Feld -..... -..r.. -..... -..... -..g.. -..... -..... -..^.. diff --git a/web/lessons/welten/farbe-3.txt b/web/lessons/welten/farbe-3.txt deleted file mode 100644 index c5bdee8f..00000000 --- a/web/lessons/welten/farbe-3.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Bis Blau, bei Grün piepen -..... -..b.. -..... -..g.. -..... -..^.. diff --git a/web/lessons/welten/farbe-4.txt b/web/lessons/welten/farbe-4.txt deleted file mode 100644 index fc805b95..00000000 --- a/web/lessons/welten/farbe-4.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Bis Blau, ohne grünes Feld -..... -..b.. -..... -..... -..... -..^.. diff --git a/web/lessons/welten/hindernis-1.txt b/web/lessons/welten/hindernis-1.txt deleted file mode 100644 index f9f4b093..00000000 --- a/web/lessons/welten/hindernis-1.txt +++ /dev/null @@ -1,11 +0,0 @@ -// Hindernis ausweichen: ein Klotz im Weg, das rote Feld liegt dahinter. -......... -.....r... -.....o... -.....o... -......... -..#...... -......... -......... -......... -..^...... diff --git a/web/lessons/welten/hindernis-2.txt b/web/lessons/welten/hindernis-2.txt deleted file mode 100644 index 5c7bbbb5..00000000 --- a/web/lessons/welten/hindernis-2.txt +++ /dev/null @@ -1,15 +0,0 @@ -// Hindernis ausweichen: zwei Klötze im Weg. -......... -.......r. -.......o. -.......o. -......... -....#.... -......... -......... -......... -.#....... -......... -......... -......... -.^....... diff --git a/web/lessons/welten/labyrinth-1.txt b/web/lessons/welten/labyrinth-1.txt deleted file mode 100644 index 63bd01c3..00000000 --- a/web/lessons/welten/labyrinth-1.txt +++ /dev/null @@ -1,12 +0,0 @@ -// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben links. -........... -.Z......... -........... -########... -........... -........... -........... -...######## -........... -.........<. -........... diff --git a/web/lessons/welten/labyrinth-2.txt b/web/lessons/welten/labyrinth-2.txt deleted file mode 100644 index 287cf47e..00000000 --- a/web/lessons/welten/labyrinth-2.txt +++ /dev/null @@ -1,12 +0,0 @@ -// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben rechts. -........... -.........Z. -........... -...######## -........... -........... -........... -########... -........... -.>......... -........... diff --git a/web/lessons/welten/linie-1.txt b/web/lessons/welten/linie-1.txt deleted file mode 100644 index 6dcfb72e..00000000 --- a/web/lessons/welten/linie-1.txt +++ /dev/null @@ -1,15 +0,0 @@ -// Linienfolger: Die Linie biegt nach rechts ab und endet vor der Wand. -######### -......... -......... -....o.... -....o.... -......... -......... -......... -......... -......... -......... -......... -..^...... -linie: 2,12 2,8 4,5 4,0.6 diff --git a/web/lessons/welten/linie-2.txt b/web/lessons/welten/linie-2.txt deleted file mode 100644 index ec530bc3..00000000 --- a/web/lessons/welten/linie-2.txt +++ /dev/null @@ -1,15 +0,0 @@ -// Linienfolger: Die Linie biegt nach links ab und endet vor der Wand. -######### -......... -......... -....o.... -....o.... -......... -......... -......... -......... -......... -......... -......... -......^.. -linie: 6,12 6,8 4,5 4,0.6 diff --git a/web/lessons/welten/linie-rot-1.txt b/web/lessons/welten/linie-rot-1.txt deleted file mode 100644 index f639632a..00000000 --- a/web/lessons/welten/linie-rot-1.txt +++ /dev/null @@ -1,14 +0,0 @@ -// Linienfolger mit Stopp: Am Ende der Linie liegt ein rotes Feld. -......... -.....r... -.....o... -.....o... -......... -......... -......... -......... -......... -......... -......... -..^...... -linie: 2,11 2,8 5,4 5,1.5 diff --git a/web/lessons/welten/linie-rot-2.txt b/web/lessons/welten/linie-rot-2.txt deleted file mode 100644 index 69a9c33e..00000000 --- a/web/lessons/welten/linie-rot-2.txt +++ /dev/null @@ -1,16 +0,0 @@ -// Linienfolger mit Stopp: Die Linie schlängelt sich zum roten Feld. -........... -...r....... -...o....... -...o....... -........... -........... -........... -........... -........... -........... -........... -........... -........... -.......^... -linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 diff --git a/web/lessons/welten/parken-1.txt b/web/lessons/welten/parken-1.txt deleted file mode 100644 index ddd3a23a..00000000 --- a/web/lessons/welten/parken-1.txt +++ /dev/null @@ -1,13 +0,0 @@ -// Einparken: rechts parken Autos (Klötze), die blaue Markierung zeigt die Lücke. -#....#### -#....#### -#....#### -#..b....# -#.....o.# -#.......# -#....#### -#....#### -#....#### -#....#### -#....#### -#..^.#### diff --git a/web/lessons/welten/parken-2.txt b/web/lessons/welten/parken-2.txt deleted file mode 100644 index e7d8f74b..00000000 --- a/web/lessons/welten/parken-2.txt +++ /dev/null @@ -1,13 +0,0 @@ -// Einparken: Die Lücke liegt weiter vorn. -#....#### -#..b....# -#.....o.# -#.......# -#....#### -#....#### -#....#### -#....#### -#....#### -#....#### -#....#### -#..^.#### diff --git a/web/lessons/welten/platz-1.txt b/web/lessons/welten/platz-1.txt deleted file mode 100644 index bc337091..00000000 --- a/web/lessons/welten/platz-1.txt +++ /dev/null @@ -1,8 +0,0 @@ -// Wo ist am meisten Platz? Rechts ist es am weitesten. -........... -.....#..... -........... -........... -.#...^....# -........... -.....#..... diff --git a/web/lessons/welten/platz-2.txt b/web/lessons/welten/platz-2.txt deleted file mode 100644 index 588885aa..00000000 --- a/web/lessons/welten/platz-2.txt +++ /dev/null @@ -1,11 +0,0 @@ -// Wo ist am meisten Platz? Vorn ist es am weitesten. -.....#..... -........... -........... -........... -........... -........... -....#^.#... -........... -........... -.....#..... diff --git a/web/lessons/welten/rand-1.txt b/web/lessons/welten/rand-1.txt deleted file mode 100644 index 25efff9e..00000000 --- a/web/lessons/welten/rand-1.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Bis zur Linie: der schwarze Rand ist nah -..... -===== -..... -..... -..^.. -..... diff --git a/web/lessons/welten/rand-2.txt b/web/lessons/welten/rand-2.txt deleted file mode 100644 index 6454c26c..00000000 --- a/web/lessons/welten/rand-2.txt +++ /dev/null @@ -1,10 +0,0 @@ -// Bis zur Linie: der schwarze Rand ist weiter weg -..... -===== -..... -..... -..... -..... -..... -..^.. -..... diff --git a/web/lessons/welten/slalom.txt b/web/lessons/welten/slalom.txt deleted file mode 100644 index 50bc6686..00000000 --- a/web/lessons/welten/slalom.txt +++ /dev/null @@ -1,5 +0,0 @@ -// Slalom: ein Zeichen = 30 cm. Vier Pylonen, abwechselnd oben und unten herum, Ziel am Ende. -raster: 3 -......... ->#.#.#.#Z -......... diff --git a/web/lessons/welten/tunnel-1.txt b/web/lessons/welten/tunnel-1.txt deleted file mode 100644 index 1cbd0efc..00000000 --- a/web/lessons/welten/tunnel-1.txt +++ /dev/null @@ -1,5 +0,0 @@ -// Tunnelsucher (nach Kara): Halt im ersten Feld mit Wand links UND rechts (hellgrün). Ein Zeichen = 30 cm. -raster: 3 -..#..###. ->....o... -....##### diff --git a/web/lessons/welten/tunnel-2.txt b/web/lessons/welten/tunnel-2.txt deleted file mode 100644 index 230bfeef..00000000 --- a/web/lessons/welten/tunnel-2.txt +++ /dev/null @@ -1,8 +0,0 @@ -// Tunnelsucher, nach oben. Ein Zeichen = 30 cm. -raster: 3 -.#.#. -.#o#. -...#. -.#... -..... -..^.. diff --git a/web/lessons/welten/wald-1.txt b/web/lessons/welten/wald-1.txt deleted file mode 100644 index ece463e9..00000000 --- a/web/lessons/welten/wald-1.txt +++ /dev/null @@ -1,5 +0,0 @@ -// Kleeblatt im Wald (nach Kara): Bäume liegen auf dem Weg zum Ziel, nie zwei nebeneinander. Ein Zeichen = 30 cm. -raster: 3 -.......... ->..#.#..#Z -.......... diff --git a/web/lessons/welten/wald-2.txt b/web/lessons/welten/wald-2.txt deleted file mode 100644 index f7e759f7..00000000 --- a/web/lessons/welten/wald-2.txt +++ /dev/null @@ -1,9 +0,0 @@ -// Kleeblatt im Wald, nach oben. Ein Zeichen = 30 cm. -raster: 3 -.Z. -.#. -... -.#. -... -... -.^. diff --git a/web/lessons/welten/wand-frei.txt b/web/lessons/welten/wand-frei.txt deleted file mode 100644 index 5376c80e..00000000 --- a/web/lessons/welten/wand-frei.txt +++ /dev/null @@ -1,10 +0,0 @@ -// Wand vorn? Vor dem mBot2 ist viel Platz. -##### -..... -..... -..... -..... -..... -..... -..^.. -..... diff --git a/web/lessons/welten/wand-kurz.txt b/web/lessons/welten/wand-kurz.txt deleted file mode 100644 index e7490ee1..00000000 --- a/web/lessons/welten/wand-kurz.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Bis zur Wand: kurzer Weg -##### -..... -..Z.. -..... -..... -..^.. diff --git a/web/lessons/welten/wand-lang.txt b/web/lessons/welten/wand-lang.txt deleted file mode 100644 index 12d7c716..00000000 --- a/web/lessons/welten/wand-lang.txt +++ /dev/null @@ -1,16 +0,0 @@ -// Bis zur Wand: langer Weg -##### -..... -..Z.. -..... -..... -..... -..... -..... -..... -..... -..... -..... -..... -..... -..^.. diff --git a/web/lessons/welten/wand-mittel.txt b/web/lessons/welten/wand-mittel.txt deleted file mode 100644 index d1db0b8b..00000000 --- a/web/lessons/welten/wand-mittel.txt +++ /dev/null @@ -1,11 +0,0 @@ -// Bis zur Wand: mittlerer Weg -##### -..... -..Z.. -..... -..... -..... -..... -..... -..... -..^.. diff --git a/web/lessons/welten/wand-nah.txt b/web/lessons/welten/wand-nah.txt deleted file mode 100644 index 098a3e33..00000000 --- a/web/lessons/welten/wand-nah.txt +++ /dev/null @@ -1,5 +0,0 @@ -// Wand vorn? Die Wand steht direkt vor dem mBot2. -##### -..... -..^.. -..... diff --git a/web/lessons/welten/zeit-1.txt b/web/lessons/welten/zeit-1.txt deleted file mode 100644 index 12660f8a..00000000 --- a/web/lessons/welten/zeit-1.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Zwei Sekunden mit halber Kraft: Wo bleibt er stehen? -..... -..... -..... -..o.. -..... -..^.. diff --git a/web/lessons/welten/ziel-kurz.txt b/web/lessons/welten/ziel-kurz.txt deleted file mode 100644 index 4d828bc3..00000000 --- a/web/lessons/welten/ziel-kurz.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Fahre bis zum Ziel: kurzer Weg, keine Wand -..... -..Z.. -..... -..... -..^.. -..... diff --git a/web/lessons/welten/ziel-lang.txt b/web/lessons/welten/ziel-lang.txt deleted file mode 100644 index d7efa89f..00000000 --- a/web/lessons/welten/ziel-lang.txt +++ /dev/null @@ -1,13 +0,0 @@ -// Fahre bis zum Ziel: langer Weg, keine Wand -..... -..Z.. -..... -..... -..... -..... -..... -..... -..... -..... -..^.. -..... diff --git a/web/mbot2-labor/index.html b/web/mbot2-labor/index.html deleted file mode 100644 index 800372a9..00000000 --- a/web/mbot2-labor/index.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - -mBot2-Labor - - - - -

-

mBot2-Labor

-

Verbindungstest: mBot2 per USB-Kabel (USB-C rechts am CyberPi) anschließen und einschalten: Der Schiebeschalter ON/OFF sitzt links am durchsichtigen Shield, von hinten gesehen. Wenn der Bildschirm des CyberPi leuchtet, ist er an. mBlock schließen, dann „Verbinden“. Nach dem Verbinden startet der CyberPi einmal neu (ca. 3 Sekunden).

- -
- - - nicht verbunden -
- -
-

👉 Jetzt testen (Runde 22: einzelne LEDs und Farbsensor)

-
    -
  1. Oben „Verbinden“
  2. -
  3. -
  4. Welche LED leuchtet rot, ganz links oder ganz rechts (von hinten gesehen)?
  5. -
  6. Leuchtet jetzt zusätzlich die mittlere grün?
  7. -
  8. Leuchtet die am anderen Ende blau?
  9. -
  10. Läuft ein rotes Licht hin und her?
  11. -
  12. mBot2 mit dem Farbsensor (unten vorn) auf ein rotes Blatt oder Klebeband stellen
  13. -
  14. Was steht im Protokoll?
  15. -
  16. -
  17. -
  18. Dann auf weißen Boden und auf schwarz stellen und F1 jeweils noch einmal drücken
  19. -
  20. Berichten (mit Protokoll)
  21. -
-
- -
-

1. Antwortet der CyberPi?

- - - - - - -
- -
-

2. Fahren (mBot2 hochheben oder Platz lassen!)

- - - - - - - -
- -
-

3. Sensoren lesen

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

Bildschirm erkunden (Logo?)

- - - - - - -

Runde 2: Zeichenwerkzeuge

- - - - - - - -

Runde 3: Zeichnen ausprobieren

-

Erst verbinden, dann „Helfer anlegen“, dann ohne zu trennen die anderen Knöpfe.

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

4. Eigene Python-Zeile

-
- - - -
-
- -
-

Protokoll

-

-  
-
- - - diff --git a/web/package-lock.json b/web/package-lock.json deleted file mode 100644 index c3788ebc..00000000 --- a/web/package-lock.json +++ /dev/null @@ -1,2390 +0,0 @@ -{ - "name": "visustruct-web", - "version": "0.15.29", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "visustruct-web", - "version": "0.15.29", - "dependencies": { - "@codemirror/autocomplete": "^6.20.4", - "@codemirror/commands": "^6.11.1", - "@codemirror/lang-java": "^6.0.2", - "@codemirror/language": "^6.13.1", - "@codemirror/state": "^6.7.6", - "@codemirror/view": "^6.43.15", - "@lezer/highlight": "^1.2.5", - "fflate": "^0.8.2", - "three": "^0.181.2", - "visublocks": "github:code4teaching/visublocks#ceb3723d5f7e39ef89fc2294968c52a60cbdec02" - }, - "devDependencies": { - "@types/node": "^22.20.5", - "@types/three": "^0.181.0", - "jsdom": "^26.1.0", - "typescript": "^5.9.3", - "vite": "^6.4.4", - "vite-plugin-singlefile": "^2.3.4", - "vitest": "^3.2.7" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.20.4", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.4.tgz", - "integrity": "sha512-yF8RhOf2SXlg00+qtupzLhrglcas61boqaONiNcbPIebHCpJocpqTBA6dyrtUrQO47hqyTdeob/3XnYilT7TaQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.1.tgz", - "integrity": "sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.7.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-java": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz", - "integrity": "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/java": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.13.1.tgz", - "integrity": "sha512-zfvU2r3TyylQLMj/te+5CnQ0rSqZi8B1oTCBbQkagcLW4Xc6imab6qN+pEJhsuNOLaJqiRyBXp9UhWA1DhVvDw==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/streamparser": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.5.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/state": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.6.tgz", - "integrity": "sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==", - "license": "MIT", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/streamparser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/streamparser/-/streamparser-6.0.0.tgz", - "integrity": "sha512-JTFPF6xrfjt0mnfGPgzcLiMwYmvIyNaoizp8BYzv8FE8KrT6GBGDZ190rtt+O7Wke3gG/MFHyiY9YGNeimof4w==", - "license": "MIT" - }, - "node_modules/@codemirror/view": { - "version": "6.43.15", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.15.tgz", - "integrity": "sha512-HHsfpqFeHyXLs983pSRe38Xajs0vFWZQ2BuX0m7Ki8w3jZ5iD8cuR3lBz2/5/X53Dhf32SBHKh6rtSTB6tKeGw==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.7.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@dimforge/rapier3d-compat": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@lezer/common": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.4.tgz", - "integrity": "sha512-xt3Q4z64xM+xhg4M7NXqw1N//1O74bUFo5kz6fwMeC4qwxSuRdwkYSmjcqCEEKYkNw5e67f2hcNqBoNERAEU0w==", - "license": "MIT" - }, - "node_modules/@lezer/highlight": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.5.tgz", - "integrity": "sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.3.0" - } - }, - "node_modules/@lezer/java": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@lezer/java/-/java-1.1.5.tgz", - "integrity": "sha512-JppTd1iKHpeNlLYw/Zl8JX7zSY5HqAzK4zZ05lpn8l8Sk7Fo5KAKiDiMiezKoT5lfeC2xZf8HeKp1tSctj4G6Q==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.11.tgz", - "integrity": "sha512-UwgZcl1R66H2hDzBrA7kWyYmX6s8p5TQ+e/t7CuvgCtBEPxbEPaHYHu+pJBvTvDotEJpuQkJjbXuHiw5Cixxgw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", - "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", - "license": "MIT" - }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.10.tgz", - "integrity": "sha512-oJ9ZfVIZjSjts0ZIYA48+5T0vurE5fQfX/Liad2U52Y6EN99x/OCdjGGuKMDP6jSk2i2lY6jwwA3X0drEc4PBg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.10.tgz", - "integrity": "sha512-LylBINgYYwgHNz8OMCy5+Y0w/LEgRYE0PcAIZfEuTuLNMf0S40GSLX6SFwqZsBLplS7RIHHy4zOAbl8Y5cQEvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.10.tgz", - "integrity": "sha512-vbuT3VT1GBI2fAOoUJUrsHVoOg9nbrFXTM7e3DSnb9PYf4n6jZCN8v4Vo8O6x4u5B67+/c803b8BtCZe2nIeqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.10.tgz", - "integrity": "sha512-qYUp/qYvM3T4cF+VWalPl+przBUESILxi+qZ1m1MVRHpg06vS+jHaxXubjCaRpXjLJPDFdXzOZ0FABDghHOhNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.10.tgz", - "integrity": "sha512-v9NRQG+JztbP4DP/0yuhSyDcEJk047lYbqeNnqIgbXITcVDjGDS7OpkW5nadSY3tJ7MY8W1qIMMqP4Q3Q8BDjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.10.tgz", - "integrity": "sha512-CHc9LBHdxhn6/NXfb9IegXCWoz5VlvcDOx9QrzZ9q+XYhFlfzwymSWJjOlZcEMMtC1zgMV7qxDe6U18AI1SG0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.10.tgz", - "integrity": "sha512-ble2WR7kWfzZFJUd3ODMGCJn1XDszptfRC0QvWc0h9/EA6MxnrQ1mvbjPZifEdgHyfHhDrwWeKeJONDITcrHSg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.10.tgz", - "integrity": "sha512-DMCYegihxBMKvLpODdk4OsvIgxtHTi+Oddf1Pm3d6wMVNjcBiG2pqyXjMPy55HgG1gCdEFr9VfhB1CmvuKn1lw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.10.tgz", - "integrity": "sha512-HQ6HuVH9TmhvPWIas7MA/KeAROgdwqH3REpUU6hZq47NW7m1b1QCrHgM+M3+N/B8DfMt88x1/z79ppRc9RflCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.10.tgz", - "integrity": "sha512-avBhxba1DdctX0kxKkN3JWdTSg72QsxSn6FdfhZ9MkL3TTYDOXqxY1GqbC7VNttlgviK7tCe2No5btfRkFgeIg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.10.tgz", - "integrity": "sha512-UtQMex7fiXq0W/GqcWRpy6XKqUbXgQeGKB+Bd5rJngmHzpI+3kjwpWFLAhKg02onFsIMSh+Zx0zp9JIMQ7/05A==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.10.tgz", - "integrity": "sha512-0Aum2pUsCSuOopi6oka+nR1DTj/nfvc1xjL979lvh6kXUjNa30TCX7sKFjyMsrX7bK3bNVs0FsJwQcE2HCWX1Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.10.tgz", - "integrity": "sha512-4dgsouKal3qfMFORgtNigLPt7K3HXiO6jTr7+nFJv1GWu1OkZx0kvQIXbK4sjrIGnaLBk0s80eQCQ9hPIelLrw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.10.tgz", - "integrity": "sha512-d7NE89try3jisYzBD7J9M5iwfgcrXYC4dwHEjQ3HIWBftvwch1U/cy3iZ26SthtUOyClKiu7iqYiFjQEwiOlqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.10.tgz", - "integrity": "sha512-dqB5ChSBp91JWXxpCKAS5ZVAE38esKQvdfyqANm0lF5JPiQrXnYwgG3oVBQmuNRcQ1WHkA3j5qYLsrl2CtfhCA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.10.tgz", - "integrity": "sha512-7GMf3vbQQslorWLmfsbi5fdt9RVnglk205XpOMFvW6UY5jE5oJc6JLieQJPHtsYlZ2EO0PtC06nY9Hz/IG8guw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.10.tgz", - "integrity": "sha512-tuKbkB23DKc5LG+irPSUnZZztRHqC3CNmyxeWloueBteHB+i+1HkRCMzAE41lseLDlarybeLhqfibFitKOxKMg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.10.tgz", - "integrity": "sha512-ntHtQOMw7oIshHRF1swV3vyBw+beQt9PeZ04O3D32EeDZUMoHMJuZKp4/fDllH/+xogeK0GUCONVfjjKusqKLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.10.tgz", - "integrity": "sha512-Dlh8q8r145aYgh+N3gNIG1dz35Fz/FCxe5hs/43orDsffjP8S1P4Xz5I4FpSJsDS4LpQw1QmswZkQlUbkCldjQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.10.tgz", - "integrity": "sha512-VBJhHWz/55u45CWFv9OmfSRDgJDVENESgFxSAn13gIKJpTuFJbP4/7ymMZhDfeKFx1zGn1XBsLnNB7Ryy71qww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.10.tgz", - "integrity": "sha512-Vjcazg+EEzUfIz+LcaxS6YtbQHo+sv0sCD+5VbwhY504bCKNW4OOreVgKq61pHT2esRQ/+AXYVPStDwxSvAOdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.10.tgz", - "integrity": "sha512-jJAaP4El+HWxYkM0jeJghASaFgfnluY0FRHhyHXxU6STs/nBhKMIxIMDrJEFg2ftKz6orX9WAo4diVan5NugNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.10.tgz", - "integrity": "sha512-bXXdRUfRx9PaHCToKt8R/7wjDV6Tbk/hmSHK0uQBKmD3rj4jkuYndct8uGX77ZuZsePrVkQbWUgPR2jJhCTMpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.10.tgz", - "integrity": "sha512-57Idx+VkEOQeG6Ys6sZOBFT7FfbeyxGv9A3k1m+Lf/z2SwqT40rNWbAINzjPHSMoCCBvY7Fnb9RGZWQin/HHAw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.10.tgz", - "integrity": "sha512-vrvuasIpm/xf+BpZbzgirku0WnrQZMAc+H2Ai26jzqBxYEmQQE4DdJb7h8erkJMfRRipx0ma2Cty8jJwUm9ocQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "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/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/node": { - "version": "22.20.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", - "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/three": { - "version": "0.181.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", - "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@dimforge/rapier3d-compat": "~0.12.0", - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.22.0" - } - }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", - "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", - "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.7", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", - "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", - "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.7", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", - "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.7", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", - "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", - "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.7", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.74", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.74.tgz", - "integrity": "sha512-lgiI4hbuLcI9unnm2cL/tvCaQU45dp0xcLWJh5uB/9MBGvIA4F8XIk7nSiBeg+K4xWGYwgZKn80LmERI5CxoTA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/crelt": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", - "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "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/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.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "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/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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/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": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "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/meshoptimizer": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", - "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", - "dev": true, - "license": "MIT" - }, - "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.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", - "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", - "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/nwsapi": { - "version": "2.2.28", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.28.tgz", - "integrity": "sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.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/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "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.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", - "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", - "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.20", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "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/rollup": { - "version": "4.64.10", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.10.tgz", - "integrity": "sha512-8N52YH1B5JzBP+B1rkcBERG7rfRTGAM0RmUpyd76yyRfTljuG452GCNbVm6MPzs1+gXBha6Rw5/oHRFohOpfDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.10", - "@rollup/rollup-android-arm64": "4.64.10", - "@rollup/rollup-darwin-arm64": "4.64.10", - "@rollup/rollup-darwin-x64": "4.64.10", - "@rollup/rollup-freebsd-arm64": "4.64.10", - "@rollup/rollup-freebsd-x64": "4.64.10", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.10", - "@rollup/rollup-linux-arm-musleabihf": "4.64.10", - "@rollup/rollup-linux-arm64-gnu": "4.64.10", - "@rollup/rollup-linux-arm64-musl": "4.64.10", - "@rollup/rollup-linux-loong64-gnu": "4.64.10", - "@rollup/rollup-linux-loong64-musl": "4.64.10", - "@rollup/rollup-linux-ppc64-gnu": "4.64.10", - "@rollup/rollup-linux-ppc64-musl": "4.64.10", - "@rollup/rollup-linux-riscv64-gnu": "4.64.10", - "@rollup/rollup-linux-riscv64-musl": "4.64.10", - "@rollup/rollup-linux-s390x-gnu": "4.64.10", - "@rollup/rollup-linux-x64-gnu": "4.64.10", - "@rollup/rollup-linux-x64-musl": "4.64.10", - "@rollup/rollup-openbsd-x64": "4.64.10", - "@rollup/rollup-openharmony-arm64": "4.64.10", - "@rollup/rollup-win32-arm64-msvc": "4.64.10", - "@rollup/rollup-win32-ia32-msvc": "4.64.10", - "@rollup/rollup-win32-x64-gnu": "4.64.10", - "@rollup/rollup-win32-x64-msvc": "4.64.10", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "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/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/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/source-map-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", - "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "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": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/style-mod": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.4.tgz", - "integrity": "sha512-XXWIQt633/EpAFx8aZDOTjBzrCaGmhvEQlQo6MVPfa2OzO2cWo+4hV9h+6UkHYlXGfy+ODXKUdP7Pthmcu5ATw==", - "license": "MIT" - }, - "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/three": { - "version": "0.181.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.181.2.tgz", - "integrity": "sha512-k/CjiZ80bYss6Qs7/ex1TBlPD11whT9oKfT8oTGiHa34W4JRd1NiH/Tr1DbHWQ2/vMUypxksLnF2CfmlmM5XFQ==", - "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": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "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/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", - "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/visublocks": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/code4teaching/visublocks.git#ceb3723d5f7e39ef89fc2294968c52a60cbdec02", - "integrity": "sha512-DnDBUaFDt5Fzf0RtGCdJiPp9pTFw2h86GDo6N/63toqsmiY6UgruCLZuwwubzPgmVS8HnnQ3FHkWlzpiIBu8Ng==", - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz", - "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "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/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-singlefile": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.4.tgz", - "integrity": "sha512-1FAhlTCL6KJDpSUudrVU+gspapvS+tmKCg70vwNaAU6tyXn3E/C6+NnwQIze06byhBRv7VggZ78K0h+J/Rsdrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^4.0.7" - }, - "engines": { - "node": ">18.0.0" - }, - "peerDependencies": { - "rollup": "^4.59.0", - "vite": "^5.4.21 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", - "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.7", - "@vitest/mocker": "3.2.7", - "@vitest/pretty-format": "^3.2.7", - "@vitest/runner": "3.2.7", - "@vitest/snapshot": "3.2.7", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.7", - "@vitest/ui": "3.2.7", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "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": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "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": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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/ws": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", - "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "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/web/package.json b/web/package.json deleted file mode 100644 index 9cdad157..00000000 --- a/web/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "visustruct-web", - "private": true, - "version": "0.15.29", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc --noEmit && vite build", - "build:single": "tsc --noEmit && vite build --mode single", - "test": "vitest run", - "build:site": "tsc --noEmit && vite build --outDir ../website/app --emptyOutDir" - }, - "devDependencies": { - "@types/node": "^22.20.5", - "@types/three": "^0.181.0", - "jsdom": "^26.1.0", - "typescript": "^5.9.3", - "vite": "^6.4.4", - "vite-plugin-singlefile": "^2.3.4", - "vitest": "^3.2.7" - }, - "dependencies": { - "@codemirror/autocomplete": "^6.20.4", - "@codemirror/commands": "^6.11.1", - "@codemirror/lang-java": "^6.0.2", - "@codemirror/language": "^6.13.1", - "@codemirror/state": "^6.7.6", - "@codemirror/view": "^6.43.15", - "@lezer/highlight": "^1.2.5", - "fflate": "^0.8.2", - "three": "^0.181.2", - "visublocks": "github:code4teaching/visublocks#ceb3723d5f7e39ef89fc2294968c52a60cbdec02" - } -} diff --git a/web/prog.png b/web/prog.png deleted file mode 100644 index d1cce0639f3bd2ef7e74010b740961ca72c4f6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225010 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�wqp-qNV&klJc&n|}K0r7EU}3b{U9Nk2 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
G6dIJw085z03Rhm5i#}B0v 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ξ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 ojcsn~ip+_39+6dw1v`> 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

A`OK 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 iNz?0Nh+_!WIa| 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 Hn+5+DZs9P9 diff --git a/web/shots/e2e-1.png b/web/shots/e2e-1.png deleted file mode 100644 index ec3c2db9b8bd007db1fc7e0e021ca3a398756c28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57904 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

}(L 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Πtpdo2&88tvWyCoeMKw9f|n` z5Vs3dajOOXI~_=WyYyq$2zw0IG%z$qXrleqJ2)+Q85r7tcYa{?nV=V1HIfWfh$=XZ zp0=(;BxOoZkGi;D?)ypCPBmUnMI?E7&ysx?dvNqWWVY5KUQ1fAa9n1#YH;|!ejT{2P6eI zl!VyR{tA(2&2h8F~23 zc&M#ysJ6EE{kMLA*)X{QuntLt(NRW6-Dr00*>Cq1sO#%qAsXf-+!cff`f^rmA`_s0 z(t2Q;z`6+yG(JZN%>IK1^O5P&)y+l7qf-A+?4;#!t>%W77I@scIy)=-?ldn*`eo-n zd-m|jlgMA*hCZ*V7|7~Jte@fYMAUvOC1vH<3}hBZ?qTKO2R9Jt1x+dO-aUl2qc{%D zO?G4;rgtYZIVtJZWcvfmi(wHqG%(=pgL$UPs*>;e8bB*i+#3D>w=(ZLgC&L`#>fX_ zsA5YUUAwqQmF#%uiJXfs<}uV5#@e88EC)+;^42bTYR1o6y z$h+98UgVw@F+W)9_G?*&EHEH|`|z#K-jWA|}u_`&g_;^qYD@Xv{xlwQ1YavU7Q#6Bn+ zZMvHP5V9RA_p>=yeb;9q;Ij2b-Iv22+ADWll`2~|Ba2O!jhk9vpHe-?55=DMw%Avy zX#yR<^o?tX^q_{)sY0H^hnc>&^pc}`uglWN^5ii0*^ka1VkD+LRn;IKqkMbTm^b<$8eJ(h~p4;GRi9k7OA)0jKpCEW} ze=y_{xQml3txCdX0b>dC4DuVGk;6@K1AB&j4HkHSdd{tGLJMNEHeKRk*` z_-WSK{CD~pi%XZ@Erq{(h=SQ{WXR(XqZDy}D8|swYPf|+p2*wicu`(DYL(1o7kip^ZpOAE9qivuFr;rv){kd$g zQt7j<7FGB7wZ+|c$1>CfJ3FtN?@IgZ{yEe-@jDrV=gP?Ms3MCpHFZ)NY$bACHgP7? zWm#ZH+V1R`Gl3r~8PxVHfB#;=0fB)Wc7t3?8-QDmVUE_JMC0LO@ z9rdsBB|egSd_YD8y|5EY3 zqeIz0h)xwIpY6=wuMU=U*z=Pp5)&`2t~m92SwF4O-#MP@uzO#RsMD^7FNDY2b-yO3 zR+kNZYRuAf$m7Qo8drBnQ$++me0cisVTVYbCXIhQ&qvPwbQWb%iy`z9bb#PI~> z9~ZLjZ=Z93srG=G*D+!|x(`6b^JTA$3=K~wP+G`JOQ>SjXZ91^_ZRCw93o**e4q2C zxQa?WVWP3AX_ugTC}Y7YO5V};ZB0#tagfAA%ld8hZ?~ZAkxwPgvb!;eyx4z~5oNly z@EwKc{DE=Bf|R?-$rjeuVZskSN9A}fj~5>LWln~k%88lSWc@rP(>7o%lF7RK-*3`4 zJrmN^9n?4iO~kQpGR6A;<<(}+cl+rHM?NSonqF3yFHej(MbL_1ecjZTFQ(^r0SJU% z4q>5je>6PeHsBfLb;{q*X>#S=xQnqd;k4=vj*JWm4n~SW z^57*l?o@hC&T6XS5o8Ntzb_4qj(r}a8oUvkFwr(RxQq%&7aASnzXOqgw8(R zhIH0qU04<*zhe8T7OI{`7VVppHB|K;!)lsF;)vi0oN4!darW$4P}TPcB^&8>o!S!t z6tk2>nqaagvv+p2c3$-@5|=SpEscwJbp%t~&3z-kgVtYqm?w@c{oB-P^zY~_-n`U9 zukM->NmK_D?t~^jv89`?D@@ueaX9R=H-FDluU`51@%4QK=6iJ#s~zZJRtc?0QW!m5h< zve%{d?15FG+|ZDuER|=;)PppLa%cbS!o;5!%k&I2nyqS+4?#+M5bMordt&stwvGl1Z6Wd>{ z)e?sz(Li=)-sWdf5r)GSf`vO)*kIW}*hb1{#Umhw>MdB|q3^023NL?r45b|-uxfoK z$=T(70SULRj#OLyLG~Jd*FCIt8UTphJi`<;59sErt5;zwDzfdqwK#g@uQQdtwr30H z&10~Y*vu6Quw_$lzcUkH^UuG8^@F|3X3R@4Ai#^n=z~!LCIX3x z%(;?Fx0Q16!8S1bF`VJAwLO~G*=fU}h{Lkp*DtmDV?Y<~q{i0P{i1^9Dr9Ql1MGZl zrlD;C9RO3$r1*GIc5rrz;r~CTb++v{kACIAfc5$>+W&kp$V5FqUC}`VAT`WpFD>ep zAlhNVD!F@i)-_JD(QKG3*H*uT5)gE(Ibv`hXXNGK_Ry19z?Sm4xsRH{RZDxoi9r&7 z=YM`zHOWOVsgNMV-RHKlTb*?5-W7G%Tj#NweFGNEjg_%BtnXxrjKHq0$ssSE@>jRI zoq-)S{(L(oX11@e9!B;Rf~1IG33kB*dAzw=HZMZ$Oi#=8Fht&YqR9CD^VMn7A){!4QeteVjR(px`JJ z#)*h~j06KCvhmA~HdWw{T^A7@Gx@`102ADpI`!zaI1G0`=N0`UQ0>5%eE;_-JOQ?C z_t(>T(TZY+EsC(`jzhu04Io=Mb|VY!23~0C^cXU_(hM7PQ_kHfU!qzyB-p(}LK?9G zR8TvasPSW&ThvkB-rfSMuXp#vEb7+;svGM=!_1A3cTs;^Aufh>(#XwrbQhDpKrR5@ zXHm@05N>QskyE_6w4Ft0_ioBvP=5QspXNs3ny_`x3-+4>Bxsb`4@m_)Mcu6A5BxAV zF~%r2XFaDnt&SY2Qj5itfe~3Mwrk^Q$N7Q=;Wrv>e<49Z1<$pFBY_6PBfxcApM*+< zumSwKxM}w?1Tn2pcVLTqZ{<3W!$eW4>W_DV@AZ2Y>xA>AAvi!{Dn-WwWqqV$_&8R~ z{f&I^lwb4pox@aq4S0z!dm9U_MGFdthDG;ITftpg(pHP%H^ldnDDMXklricuHkRjJ z!YsXa-`1_nxn`8BEF2v5`b@Cjs2>tP>+vvCb-digWxi=c_L@yS)i>c=1>AJKhtNei za=+C`eW!#jugCOD$*Wf?DqxDx@Mh#Ot}=?39F_k(W~fvo7k_SvJBU&Wq zF?R!&Pg*%D*Xi835&*)->L0A6X7eMyJShR5mP2nly-DfP62zo3)r)C%faYWAx4#5> zHgNUsBqe=#5|jP>`H4h8%2p>ne^xE-9~gKL-&6lZ){F8VHGteu7;Y{^K(57P+qv!E zf5IOd&G zdU|8TgiwpEd)pXHjZ4@N@Wn*!R?|(N;ke(YZC%h0aF5V$EC?Jt*9RY%>|5lZ2!zJ!_G3zhkgxAf@=%dl!wQ+ zO$Fdv*KZejq@bIWzIG9pk^%>98+L!Syl^1z-p$WH4iQ|~W35VR?7cM)HW70vE|R5Q z4Jf+&G1Q@#ur7dk=GySnJV*F6w*+1M&*@zp^IxaTwKEtlr^xW>NZ70mm42Haym4h{ zLMf%G;pn|Y$-rdw9uGf?Ulxoljg2NqJfF4#R38s0Db-e==h@k$A1TZFA4h0~tiX}w z`b)xhv$>^ZFN1k=+$<=#@7}d8Zon24 zKK8*`S@BR47@bWJkh%l%06PG0S`R?aS9H}&FeMm^>L2>SCY$S+LZa+B9a<3mf*Oeu+o4c1j z>$=tb+y04b*Qh11f;J<^G6Q^dW66Us?PI2*p`ii)F0BXyN43tclw<}z^-5v0fkzs& z>nmd?b>`O&Y$3|N*!ghJ!lz+TMDZB8ab9=f+C_Hi>eYe+Ze~s)j|qD?f!*wo&}}}V zXu(RQv2Ri9B9FrBP{$pbZ%%#Ru|?r;eX-~R4H_gH6C)$7EMc<4pRCmV>bw;kE=sVm zNzlg(Lnh{(+Olnin~RH70LHD9xVU!|8h5E=XKy;tpd`ymw`le9r@eju{y~R+e)~gq z7r|~9c+qeEJE0y?}WfM@LBdhJJHLk*pIa5DdLJSGBCgZ zqJ~WQ=f-GVg>tXzC4dgeZIdJJPY#yyotp5E;Zf2CeVl6mydra@;8Kx-g72EO{uVEb zB)FmS3c32#5c0~kcRB1MF&sgihYj0rBOMPpmVZu>ZUYqVedcD%3;f(zQ&#Q8Oz-%< zy877_(<w*}8kIyA~2roU*lL=Z>K@q9?sG zN~XVhu|CrG7E#O|=@s)waU}o7tSHkbh?I$s4A0JTu(NM7OaelVmwgDR!-v_WcTUvxm80|TdQXMMa(SKLd^cI$pkqoLMqIHFh z^jUj?=O+M0aM+SgOEg4$^GD?qNWzkb`S`zLU;Y) zQsfP=c1^~izsp)h+UHouIiwFIE4zyc>)zIW4BSpOQ_>FGA?|q#l|WOhR{<9s%Z1oP zT6+zkAT5hZZ)FtK*Iit`=phyzQ|{>pTW{13aaqI_5&d~{8;(OTeJ)~^BP?kl;qDYa zZ+lrkKJF-s(caqUcp2m_K6G^rzHpG^VEe~Ujb1>_fnQj7ty3Thc03v`+11A^WULM`hM-r`M-vgYOu>Us_RfmT;H91&{=8Gk0NKYpW{XA+s~I>=GsB zsxc^rwG$4M7c~>1{9nbZ30xffHh0%oSJ&kZAH(nuREbYHDQ4;vBf@+)7I>~*-;}Hb zgP)Gh0$UO)9?YVqhEMo3fr(J%;8)D(?E1w(d!Qyg z{eC>9e-$#_pMVQub3+;Q#=&{hGuoyICGc==%LTjxH5FmR8-&;sC7?DO8+9=F0~|53 zoL8xvQEsJW=2$JW=g0h}%Tu~RL&y0Q4p&G8EBkKq?A+SXk-HMbC0hjf$PKk?=~LWE>rewQrh_MF&y%OGUCYbM zF%Ch2J#M=bEdYWbzD#F-AtJ5_4{Ea9za=qnh<@v!7@+W`=ISU}tZ)#TOu~TXxk2H1 zBcs=NRTlT~3uVsq=DXE}4jr;zaT}>F?dUj2zo4^$hR6+}At;~paTYhMMeoILsqOkN zwxYef_z%P=g_nJcNuJJgmpQTrip;ju>*c7DAN?F96E*1FmF-B3!2uneS2dN8^sqna zcdt#45%d_z3LaRyYlYSfv*3@fU&qF0W9@MC@&P?fukJUcq~R1&u|&j`o zHu4cZm@v~xWqGUf@nSw@z7??ZJk8GL6Lix$a_8#UlZDzNUu<*$1TCJZ0Dl3e6M~=G zAg((;9{l)`Ke6uQQo8y(IxgAJFiFd|cg1p_@OM3FUmGS16aI(8;DgL&3zhqA%j9$X z;Zm*(^y5#fZ6p&hwM3Th#{3-c^yi>XqEJ9DG(OSl{WPQvB!G$WH`s?MHP`vIXC1;= zSM0ucGe<|s@U35|xLcc=?#8hFxay?1f|D+D0NZsacfKG6D{DN?^Y(U~oQZskx=@G(aRyy^MPBRQdywXG;wEy_JTrTWQF7~z zJ#~YncLw_j3X1M)N;)sWV{Qpd?^bqVoK^0!7^!qq-kr@?VOGK8mP*a$j{(kypq2#Z zoLC;`V3SyhKE$AQ?D%mNI>mn1&qtJ84n@3TN<8Q6I;4Cg{sqFy~x)?sYx=B1u3gfjr^m#Tx&C zmLmxX^BdR-uRk}6jmLz!VbspUw6q-BiDK9L3LZ(eTV<718V{3+^zz6jWzUGod;BUw z6c28H=A5Ew?wvaoEZ@=``|%5@Ma`g^hky;T{QFqDKTt|VnQ*4nYM4yCNyxy^u<}e^ zk;Ipcd(Y`*^UPHhL5p)5x&kOv%|xr`vVUKSw%drt`qTOXv2)`{1Vn zb#|Zg+Y^mi!>ZbxDYDq|9ozly&r@6`%fP~-;JOeUI_mFKO-wzS5fB)7Y=z~-iMNeU zO5=MZb7b4QyCHPSX}FW2t-6jpoA!cX>pJKVGeZ^JkGQsPFT!jVQqc}JHkut`50PM< zDTeC{W$YYs@;E)gp@rgg!Q8wmv(UEtDdtsRI$-$^j&7;RZ<~wt+>448Ikr@9%E|z& z!n+v&Lj>yB!rGT!Yl{T0)2`q~nZfr^#Hx{)zPfj@8*0{Bgs4(dp6BG0JC3N>*;QE_ z`TvANlV>pRTr@*o@)N!!HJAFcEdn87VT3eJ6S0uw_36!fbKA9>AUNLMqQLbpN^<3N zN$K^A9Bb}d$aFKZcHT7GUpeh@gfhcGi@r7V7@zM-uTo4QxdyH*PZS_Xal(9vGzW^+ zMIbo5HrHKnfTB*Vp<>;2giM+NQ`u^Y3vX;>qrXD%@a3`Q&ZlMAR+C;kg3~OLQwG7F z(TRz`21H=r>S}(OhIfsQJ5Fw$hS7%(^yirQ^52oE20>pSFoNWyHoBmJwR7-PR!)Qv zHhe8EPQe*ZV+a%os+_8Qd-6psM!R~$E;#N;l5z;O=fN~O1rZQrf0hV~pfa93F*q;# zSCMpYJ>3=@*r~_CsP>#kSeV9R10l&oIH%z^qVGg>*_8}nhB5R;Que*xxrERyq{xC5 z#Mc(KBbam~zJ(a9f6UuQ6${8U5z8|fbzERg`vF4*>FWm|dm9Vv5f&zFImUd?O{ zP3GL|7{a~1)hi4?|5R1YoC!|6y1wQ{J{w^8>&?Ya2#W znQ3X>rqzW%d_~qVI>3AtMZc0+jbHnR58BwFT~WCU6-HfEm9nO0Xc=X_AN{cj(V{}8 zaEI5>=D35f9Jr1A{*j_+vG+F@N6G(6I%JF7!294rvFAPEyPK{n zx=FkE6e&htqyAbk1&!Kf+!8kJL~s%95GFA?^HL)EGe8Mz^$?L+&h6??lC;C7#ZU=6 z|C8h6*C2epn7k}mfPpabFRT+y!Mb07#D=55$&xi zg{^mfLApsRv!o>9FCE->g)StVf}DJH&E3!^oPLWfw(dzt*mfONRt9InM+Pv^L_7*e zY@Ip7+@jr|egvD#>1wUHqqyWK$lsk8+3oY>$)08RbLSGu%GLo;8F=k-MOzFHCOZSe zBJ$+BoO+27wRFSxJ7q&K?1wp_7eXPj%j4K7^>L_iCsGwmB*gKfdFwN9a=t-~9P#w$ z?3to}`P!q+>VI753JM{7!Ar`ts3^v5Wuo6hSXXCVN8qkKg02o?CCAZQpe8KJsXY4f z`SXeU@_m3`BhX8@bl@UyHoEG|)K5#WoP~8@0hYFf*-aieZwcnA>K^a?qx18oyI>W0 zhgu#Gz+tPrK9*Y2vyX6;W7>f8=qGda`LB4C-ZeCoT$^It_3T_eA*lK9NBPtb>{D8f zjR{*KSPMaMGk5lh7u>aLX}nR~Sf6U^tBT7h4+{fPHF_+hb&9g4%DE5=7{I`@i@yH( z51$(D5V3uJD_>7JPe-wVA=Q4!&MfWcl9hx8y%huV_x^?~WrCX8--aUyFZtM)FE7oi zeC>L2Xt@rq*;otCnyXmWaQ18uBnntf-LZs#d5&DjcR#N8*j_?K#itL!6%K%|9%K84yAVyA`flSe#N<7d(5c zJsfUQNlsb?ej%Zs6Rk$OKm9+Hy$Lv$Yx_Q`kp@E~l_bfO49OHBLnIjsnNvjOC^DB> zD#{$0MJP&pHJN0@=1T~3Q1yZzwU3l0L)C}6NBH|}&O$&b3&rEhpgBl~)SnhkL zQF2=8VAfJ|u9aqh#N|e;D%!GBPrY z&h~DESyfb!i{3QVxf0Do(G+)Ad^*sTlzcxF+6Sqp$&TY$Rw*e4MP?N=8zkaEA}{p| z-#*aO;PJw=;=PtZe&3_$=uyyXjvYH-X|360AAR}A$L#m-bAP@p2v9a`%Xw;Q8+Xcm`TG9YWaM-r$`eOF6EkygSeP4(G-qdT-n#V`57=a$SorqjYzo`$l#3ixbp5*{eW#Rg-FJl-P3{nqJ*xVxB2k z%eme9Mjj+e$-}>?TztEWxbYkvJQ!17|B9SG!9@hKy;pkIYS+Jf`jnZKm3kqC0;AqE zT^4a_p(;COY~F{5gNbFFyG|9u^w<;0Z|+$sW%>ZfQ$NbOtCkLs3H| zBpjZHny!9;pPl$s*O@o{rkx}@I7ohgFb3ZhXuTi?<*r;{Ri6?`pWD=aAXdFrK4 z-7j^gygW(bah~2C95gM5`zOX3g*IKA&pKe9dx;Wc7AOI#st6_A%kXnzaz!M(4gX>0 z*jMi{r9vb1q2$ht?c`5Y(_2betgegeYrb{Gcv7hqH#`9UQsFkKzdxaP$bDtL<63n@ z*dG4RNY6};I~3US{o6O-SER9=dzPTK#E++1oeSrsM96OJhy{Jc2keX8d?A|a|5&@r zCEmOquK76&PL1#t*;c&>pw+H4X774Ff*TlCU`P4eV%?BgAZrJO(Y0%7@$oruzMP%C zpQi2~DA)gk8Lqsl8XDMxu!L)?tG!)epuxhsyF2+0$=Yq7_4z-8U8-_6S$X*zzrGGp z)z&?LgLlLr_}&-(sO5KQx@3_A9fPEbNPl$nfqB}C$9H<13D|t$PFsrrMxf$RizFU-Cbi?y zKP{K@RdSM*;}xTRgoW*4Wv%G!bi43umE-}*twSQ&oA^)O-#Th#I7QGnj^B0$a1KOy z@WDapw1-E(qO^XY6O6{}Y#O%R44`94rQ3OEhSF2g3%r{mYo9NZO)N;w;tjf(O?6VCO72BWeNuw^BqUszZ z5jt@K{C0T+C8ACkZ0Us3P=QoLOMAIXp!BkS7I|u>8CB3zHn7rD+sR3+~h*OTG zb@85u563(eVcAOtnil`{hTCT=AvK$5eQQ11tV-1_?Xy#cQZT<9GnbG@kA`}B?nl79 zSLM0DXN8peR`&Do#6GZ@Yhl|XP|d{-mpq7`9sb_Y&>%IP1Vfx|&r`1ZcTrE@UY`Bp z0^#6z#RDDK#kZ#fUe@-7PV9!%@!DD%4w3iqGTU;k34~`-)-A6;j*XhX{ry$gbsJ^ERAO}d)5||4Qrm%6{@dRP|NDK* zaykU55i&a|)*Wuh%_(@1qcH?SKc7OA6b6bCWU}H@c$Za>&EH095@`$FnuR-MnBrwSM{rfmcH8ooe4M8@3 zr%PWOSac7&vax-l<4J(Y#kbeV?|U94tty1u({67mPcn3Ik+QKNW1GEl`O>7h-EGGu zn~mX2uwy&DTRS;z^S!mJnL3ip`$0+h^RM_O3W|Bnm%4gy&A3EfBDceks4EHz08Run zK{^4?+^4NxQ`RM1K!6b+jv*O;!h`*D)tIg$d`sifB@(WVq5>UnU(Tnts`Vuk!f`9E zeV+}XLq{>meeBq9Tds+tIj6=3XoZgyT>kKwc(|q?{OJd%89Y_`j15K=o$Fn>v`E1I z5AW)Xl5F5XjxS8nPoJWbhNksU{prun&D#~i*S86Ms;u<5H3yrh*};0t>L+ub)f%7W z9D4?CIo81zH_2dDLGTZL{UUJ3Y8ozub6Yw(<~4YKZ4a70&EZN|+q?VoA46A5OUsKF zLk!hEBlxkEOK+Lfg%sRfi*q}^q?fC08&_4sDc0{h84*keaWM?s{dr421vUmn5n zfh!6dw{uEL0L7jeO8!~v<>6jQveHgYth!sTUX^}$Xk8+ec9N)mPfcrhx7C9^901SA z@Gvk3At1TDyej(o>kyBkr~fyfYOypZ^=<$~F6gzk`~0R)cYyxL$^9&E?>4Cepz?0t zwr!ut&D4a19(WakLB)%Zv420zF|{xCOW0%a$a~}W1l+!wnwo!aUpy4@usD@hXgn9@ zC2VArq^kVa?i0pDBhQ>hJ)wisD|Uec-33X>yDOJ*hU@BTV^;0Q?5F&3Wr07~_`#j6 z5&vwhGL|Xu>_y)T#oEVDpDlYahpC1ti057a&DAAm&80!B0-k3%U5#`2K&f<&|UguK5)PcQ+s%jNb7qq$t3sXYOz4mw$s4u!BxxBQ+~4a5-$VPzXc zJr9~PS8Ah|g2CZ3BJIXBNaXgUO1%UlW9;S{4g&K+&oklRZLB$}HhCnuwY zto4U%>f8T@Lt#qC)x%s2tDQLB8$Dhy-Gp@$Hyc|nI6xR}tj{$)fzc54ad3b%GuPAg z3UUBu^dBt)tt&CnV9Fg^G#rcny+VsFF0;?6unbF!57x*)RFcj-eN&*&E6^%=uXrE|+d3J8)$ zH^Rv{Fxg!OBW%ud9b)|^2o9E2~rMZI5InU-&; z1N`wmekB&UF)-}fb@##S?5w1x58xdu#NffC2{EVO2cPS$cm@;NyLuil6WL6K z;Yr&*_I0WR0LPf{)+b$-J^T0@wBoo8wK<@Zf}*DaRr5BQing}4^tA030pO3pnPg$8 zvEXY*6#sQVqrZS>UnX{sm`y_B0LvV%2^$<~wO_wRi#hLk2uRl>0;&ac`REGV+?srM z?mMt|FY@H>fR0%@5d=XIj`1{g&X0^_6dxbZucP2?Mm4he*fv->{nv8-rj%A~${tv! z@?m(Jpdg`E*tDTsc2);DC`dfO(n{Ch1|UEJ8YJ3q?+vQ@MhFu@KfAb*h7SE#^+?nlDcCT1z6~ictmeLJ%-#GJ^mxGWOgUq z1xW*bqle}oO?ez#1;)hZM~RU9oIcOVseqXxykVz&FZ?!mlMd-DRYR zbkx-oJ^zFsHeZbEQkW1<9Y6F_7K!T!N`Si)=lW?rK0?7}8~H`eqyJfD34+u0a{Mk= ztU7nX9;wh>;;go|jTyEenydT=gl#TYhJ5M$0v+0Pk3m-TI}lT!u^4s8z)n1>yv*ZTsX^419^)Pe-NiSp#D?g z#QwU(m9bprDE?O`_$`E8m+vDYJ-{EPQJIqzRPfZ-25POK5a11N&Vzj?oVrWT?AfD% zi4M%JsdiX5y?lWV5Gm)c6ec=dS8U`k#6JLozhSWRcKF>=&}ifF@@B^yaB< zV&#J(Di8a_V-^MQ#&MHTqy2M0CTz_%u6hU)+-~cE8ZnsdGO`;Z>gL3;W6|llUiz5>&yLLB$>0IP(Iaob1&cQB|$?(2E*mbOEM7;PjYBNKDV zQTDtSWuBVLQ$u&*J(`}+nZH=TDY@I;UgOGPzevCMN<03L+<+sn#RZQ8Vm!^gG`Tk~ zUAlx~S=ZRsGnOR>HdFrJz{TJsv7OgyW14Ob5pl`TygMZ z8W{Mmko>AOICZ^YGdMis%#+F0_3u?^56ho#|2jzi>!@d9BD1Drnhlmf5L(97osiTM zt@SWTpPHLPAEXXZ@BJ6kZmEA3rQeg&U^v5+TIZ4tH+Rio93qrJz0_1Ph9T-G2PSf_Z{I~xdrYDoL zh?{*f+Su#U%|4GL>UvGHASMzS7?w0mkd1me6upbNfe~ zYlhd1jX$LL-Mg1&U;w|I4Z;h2Blk_u%9Il!TU2zZXEZdzGU{yX+2wU5i`l8V5s3uH z*Q^aAGCDdt*doHi-PfE*DyhU~g$0zAd2TktRSriTwc5sy$U2Wgb`$NK*>vAFT^1$| zDXO=7_vWINMdb%9aT_(= z9?#dW`HbQpKTe3$x+-(}(9I0Mp!}<_-=KW{b=wiALm|9ud-Y1hI5=8b@=mUIy}7lVsDk#WY;Hubp2(j8rU6U@jvH+~>baHq&1%>PUsJF%o zU3j~JRSHo3C~I)?)#(uN8$_WgkkRNfcj`%)N$3HkH0RGTZt~pfw{2>)*Y4?=J2|kG z@W_F)6MW|kdNx;a?o$$8AfT~5G>trYTnTEQjT;ru?@#Cx;QwY=@U!S z#mxc~Stf|rFyxj~Jw#tOAk1tZ=jBxnAA+M#gjBp9Ek?B`{%u@!IOQ+vpwf-&)b|F8P%V*y_=DL)2;jSKAL-!c(RN8 zCvSjtMpVyg95bnjcAx5D>9Gk-X_e*w>4F3+HH~+1_kN$irOQ(N=w^cM5KSkS24Yca zc=;CLn%+oTB6TVbIZ{+UD< zO1ySNlSwZi2Xuc?O8_0gXACx8AYpCk$-aJ}ZMwm5I+UjH>N-rvPHwEKGV+f=j;zbp z%2QK(RofXR#GLbU&6|8^=JTgA4M9rG1u2oKMaREcDv%22!3P?>$JG`lM!$zU_?=1neK|NpDsISRCmr*lTyJlGN zkwqA&jJM$N<26-PJVkWWM!l?;x35l?E&LNbX|lbEBq!j-i_27E)4B=lHj;C5a~T=O zyxhZtcSRo>-Pw0Qv%8X38Da6j6>muS8p9KAw2*3p-1Aoc8OWO8Epb#bGE+TZDXq}D zn=i`-;Tn)Ox&QhaiIKQvb5?g|$-2~M_~Bx(`BxwG))yRo0f7(cT`#(s_@IK50fX<&wuC`ug?jSEz74 zex1Jl!JFd2As9GPB^MU*^YNV)iMHAJjIZ&7VA~x&xwwe)VSXG>NT=Ai&%r8)Fz*W( zm9a+IB`zalryf_nf+NcXCxhSo&B6xKkNZ&lcYg^c8}%FQA1G0fmlxn&To`2E!^S4J zE%-`^R)m$+Q`Eqe23zg#2L#v+6~Wr%B)q8>{wHTZ_gz{I0(o>L5fc| zo!?fNMEj(Z-Hb;ejQY)eel#{t^$~^9NdgytR+<@$c0|t!t%Jrf!tJDPVh?f5=G+|( zWe?l_-1ZAET1#|`d{-;_#9cSLuAjK}^~&{Mzcje%X&dt2?pW{XrGd&5l26mo=Esfh zVG)TN90$Lr7bGX2@#ct%*h`qM`kIk3`YBKv#7kc5PM+2K)W;aW+&_EnW_T+5xOC9q z8LLYwHUh%HVxX_OKEz{ZRllEt-WHar$n8GQ{U=LJhHIm1?;w+e+v+!HN3lEicvTGy z4Gx~Rkk*_TIVANe`=GU-^vz$${*}BwxmyS`ylIBD(^jm9KZ+ z*>v;i`fsPn#6^i1Zb;i%V+v9zMu>2J02bpum2f4V z(yp?sSKF=lCrbc=>44n!f1I5y+(SKmNh_~7_`(cqjfRFi_KCqu{}34`X8_IvR#w(4 zD{#hupa1Hlz|SLUKGV}S=F{RfQ#*UAwhC;X^ZMJJNNq$8tS6yfvLngAdUdJfHOp2! zh6s;)h)-2nSveIviCF~5JO3Cq+5L}9tFs36TNvtRX3-2`KtM7EuJ|7dDq?KacDquU ze!pF1hXYaP-(aZbWs3Ahj$#iv-YexQFy#1> zkevM1w%-71rsvPEW1(@jf9xpYR2u%DD%<0rvcZ(z9#VE-b{5RHMabU#w@fwY+dmFk zB9hy}bNf>IzC9{Whni0Ix|vxTq<*kHdJY+Me!ezs#ZCxV|EN}nyGQ5)l+Uxbbaekw2E%et9Kbe!g{+9VX|LLKU`ZNE!8=K+TCMM7_;B zTHY-vWyN(PPpFK-c;c+ew0a+K+H+~e#W9PfrkCa9K4AnJ?y&5K7I()$y7r!|;LoO~ zU%|<;889b4O%|n!^pU&|L=5+IcyGX6V$wYl?~}CgAB!7s(!Ty@6lNe6dWjWgsp{v_Y7*tT^YdFF-9Rz= zrt-a}0xbNktn}U13*d{$oVc}*??3aB`;{lR48GI&uL&o#(mj5e)VI&uJVBvxB>Haz z4)CMJbE&gIo6!%5h|p#p`>(*oa?P^>$8`VBVDQdafY7z(j4?i3T#l39^KV=1H=L4{ z^%Fe*15H={5PxHwNngMRy=G(NHLuN-(zWUQNZlmAdcmvM#NUa z1oh$K;W$k;KOSEZ^&aVYmNW+9WBUhN=_fXti;FTC10j(ei7fZ;QQusV{(@gp)mi); zFghX^;Zu0V0jhkj!cVdoqydzIR&a+pY}xDk!t|1sf*_rT7~4fN1%qpQueCN*4Hnn_(*@WjMC9PwUqJIU$4WoCLE8*8zP zQ)RwtY54*MlL67w^GQiYCIi0~-5Z~A*>GRx*Dbm?JMq5c{m^JzV2OxI6Qtr`4%`}Qcm+n=B76o&93||2 z@xNQbsm3p8C4Bj`ffqOqV%D7rAtB#T`GbD?`n?bNgYp#rF{HHPpDVqvA9(brR)C*> zaTF5flQyR>>*Mx_3O57&c;hfZxH=*JGdqo9{ce}n=CeVxvdxF3&qh!LJ@2u4k-pvP z1~hrMnzntb*L<<#?Je`Cv}_OW-MYK!247jw_Kn-U9z3R^E+xEgbnh&@Jn3KbFk)gM zSXq1^W}w|}!u1{dfWxO2cWmf}IyytVqb7qVc1!u$yx*`wd7zo6RXF(cZ~#y70n4u( z;s&p-^tYJA?y3|Wt%ESx91U$uu3r~`OXcM!kDhk0-$?mUE4fH%uzB^=yXPB7j=l!^i+Cosby|k? zz?Nr<=_;3soNnzk6Pv9|^cO@yLqX_M3MmUEIFIK+cTA~RzJW=@v?JfRClORVLGv(% zD}Hq*;Du6$#%p!tw^|eh(jz9YLCez?D_;iIKPJHK%;~!)ec{#C!l?~_I)v%M{76<+VTnWA0|wN_|)p*+$S$QJFf#=fb0;aa3$GgS@oD7ymsYm8yFpZ zHW1^iu@u(jGNV||bCKoc8Q_+DTobz}|6&0$8bH*n8jP+=u^Ok=l*YOhIkoXyMbp;! z+Gu#$F>fRxc?{#g0$!h3-tIEqLxjOZ<>JLF`fr9hy^xF}L0Ap&7fh5DJ7M=LL*;hw zgWND~J*Q?v-;fubc{B4+1q}^KWmF?{{nZ?Ua80V24dOVaR?Q3scG-p4=ihBN9f^ETAj@~<)`f~r^M8%=9 zwFQD}wvb8)U2!li=Y5{E9HTN1+y(Cod6qiX8;tF`Ga^JC+|10*d2Ssy$5o%8@)`Mb z(77*wXMG0G?!N#oOgEVG7n zqN8gJUl^9Xq_EV;)W229!RAAe+mTZpCs`miRephmg{5SvI+Hq3$;CYO%cx;aNsQjRNQqQrGD8)@VVFtGNiL#JztaT$o(-!lzjPul&GrMK>BW*r?Etmi47ZQz6n z@-2|0kaS42XXX-Ops@cM;qI+u-+JBG?x-;XA2VzIo<7om(s~e)T@wohB$lqXZ>(nz7V#h z-M;N*=u ztMv$jk9(N=-1kx+a{42kB`Td*8Qs%HpAQ{&tACuI$Ry#e1ui>t>LqYYXJ*0$&3_!h zvvhP%MK_afv)c*3;2=D62)Mzvye3)55wuVPq_DY9yl(14xkdzGa&%G%8D+^oUhbbHGgTW%Xw& z{w#rg``%W|ZXzN1LiVM!(|Kaw$Fws6zq;8xV(%t-_&k0*cm4XWh|A^;jg6&_)Eh`h zREj>*FzVj=o(29ByEvLgBm@QAN&ERCmpYr9Vb9vP(wGo~ufU1F$Pas;Cm}hl+p}%| zwBVDNDEeB7L21ohDz{dr0^N0iyZ`X?@jd9o-YU%4P&Y_QQ~FTSb8BekwkYSx52VZ_ zBtPYLw{6UBpc)n~1W?zwXPh zeqzKHX7!s%NLJq!I&N6BUR$bl$FRA0=~qoJ&!ah-1g zg_&}x6sWv(RnbD{$`kXKLqK3#^08ta_4PX?)~5og)Q@Ss?rXjpC^q?iQ>}3C{pmH> zvku@HVK=w{I19O97CH3(afUD;pLs|8{a$G{b-aie#Y)b1QN*_pRvfi36cV~x@pUWt zFygv?iPG0bpTz$D1jCVz3^({#2ha^H4A#4Hj)*VyrRq5_G-IDu(TAp`j8bA6TX*!W zACWo~u|G|?`*r}Ji_gNcYSMS+^4fyOYXVj~Z=3Xy7t#mBhL}tO0(tz0mj&b6Zs!IL z@ps<%#DLx9#}4jymmzM9b(xm$>GYjG2pbY8i9<5czV+hw37Y5FbeEd;c2!1d8o1s< z0*Q33^XMzN-xrnmp{|sF_m5YIq_=vv?#E0KxW1!FZ()GWz=cC*C&n)r85XWD6IzVJ zJ9VzRw^`;Io0u3l_R~gv58O91d_h@ku5?Etr}hoJE^3mUSK~b?#o1eLA9H^q$TiVa zvi?0Ra?8b&7-@)26wXM+LnC7N)!@>l+ds5S#0aZ1@xShI3KFUs0E4USv-N^(q}_4g z=|a1mGLof)%ul!kPqbV0JoHI_nQt~xwBQC7GQL>*2|KeN^Fu#ui;VS@d-f}&oJRR;ln{@u1G#5pj%6;F&J>=b{U?5X$3XsoL;EY3=QqC|(A3AxNzX*)IL1_j ztTGDnt4ZbS(Rf7gm^pMVHEr2Z?DF$2sln~;-`$3G59dR}nO;<|LB!=UxOHLw2 zs7+wH;QlMp1V_)?YTLU7$qEnE4^Ne$;##tVe%2jYF#b3nr^7;O->cmwt8 z$&*i|w-PVjLD$*(PY3M2qR^I(C1todX`We>UoF@sGr8kd?*k#X)u~UK`i}j#n)Dn# zGx>&8?^9*{BF9!bjI0+Ie2r$qCtL@}62L1dBg5z4r9P&`CceHHtYeiYph_W)OaO^7 zY((@D>uVSrV}v4c5!d12%4qh)7q-}tcbwfnv1qUujt+C(AA>akN>49C#6?-k|fyt=X z;;>Dyo2kw{wZ53>|Ef{nc`R?HrUz_N5(C}>Q4Fj3pJ zkX5$T_jXUn1*L~^N6lMa_lx4IKXk0UOLq8|#B5{Q4yHkKq)E&^x00y}dg3DVWwa_} z;7BX9%$l7$$e>D7BQAP(Tti3 z=96q5K8Uh8GTi0vUW!*%&-sD9F$9f8OpIH9sAlwyiiwJc47o!&9#<(&_WcA?2shnj zc__vIk$b6exSqDgIAFh?>Fek^;g^wxk=pbM&9q;TfEPuXasmc$`LGi*mMjZ{WoG+p z0Vy!`N`ofKzidAb=Xx#-xNt1XS>+puQ>(CRlwGpHlD zJYK=q}9IY%p;`2BRie%-XHF26S8ojLTi4 zH)cINN~>Fa&0pw5Y9GE|04-SM{E1e624Wr%^Wwgh0SQ7R`%a`DK#!0oK#G%V|0jfM1d9vP@Suda#jka%nzH725M9~@7XLV66(IBj7zBL>0HnZ$1 zhpy-v^5A&#`U0`?TPp3g_X}XHW(b>oyMXf(nWy{3U1Y##%hVV34OBWcUWl{G$|VCa1rH_Gy?hTYJ72;&{)Ckn)R!NwYfC)Q z5H90UUepC-o45<0v81WQH^QaUa3+#!a|xZ2iML`Gi0r47%}N{t|)IwSRTAvIyG zy|Sy_Xx(hn>F<25%cDl?VmnK2m%I_(PmLn6iZvoNgBbBMEAE}4m@tw2o%KtuHCTy& z@=?=~q^h|^N}}2%nGE*hGW}c?C2sV&yMND2f+D4)OsJ5hw!YO%(TDhY+^|2JDc;(H z^$D73ogWvU{9)=82&uNHhgBupa_e)1moXzA!uk{$aY2S0r) z{9;|uBh>=*znf`yn4A?>K8$Zq%SB21_3QnF!xx@r3v}*D3^(p9St5jlzHus^^rxf6R4<#N)qXE|oyUB=s&cDY2Mi+Ov!u|b#-Up4CLY|1iR z!#+S1e-(^r%c&>{bMEI)?TV8u8cfNydMf9P-{Q9C=yAo<8XBJ8zJ+jHcqU~2;|+jc z)ZUGa)qE<7czY`l+$+D%p^cIR`5Y8ZVnC7iH#-YWi z%7vkxcM`{mZ2MfRr((y64@cy=uE#-7o;-fqL2NuonmtVL_DJqDlkNZC|F|e(%Fe}A zU2CANk|oGnWc)TXOoN#@5u}lQEiDh!E?h`t)F&2d#1Alkl#U-FG_wyL-uNp-)N$VD zYi#VGQpKAOM>nB|jqlC%Y#7fYm2QoAcaGBXA2TSnog2=?1oVLFnD>1SG1n*+({^EV zTt{@9pDWF%)_A3&cj5i3oH^p$xN?s+U8=G!$8v;hJ(JjvU+u3{--Va@uCFF3jcw9n z%Z}uo7mq~K&kVS$Yv(iJlg2qI95wx1Yw)Acv61X3=E04?U4H+J4t~ba&=5`C;nYjQ z(trAwTF^?;Nn@t3P?`8a=C=IlP%2TpwV%7U1Dt(z|=$lwd9PH0T9tIo*Eu@_Pr8rE-*$4dwL4(0O(=fQj20}5eJ=HAlGh= zL<#o7fY6aCm0>Dv-n7ScK!Ll{ZRIIO>!Fsj^>U1&LrKAmw}0Lx-U~OuG_$(NA39e9 zMaLIke+*(h;4*1lE4~u_`UwIG4>%1P&Imq1%=s?!9~mtfzA7hd`#xinq^i7HQRoDT zs$3|sjHcY1HG(tr#@zR&@j|-^-o-Abm8|$G?gERdWgfsJU9RqLfwsQLSeYyfJcWYA ze;VCWAG#9AVZyO5oxxj~%%0jLE^-`H`a$PyP4kG^%OA!^{M2mSCWOdt3t-9? z{uOZ*hHSek2=$ad#|sD=8er>8$2gBWb~?KI;kW-B==0saU#gN9TTM83UOiB6G3l1YG$!h~7bjL2)EcI)mMYjNffFtbsVD5TAHA$IVUf_^uu)#7EQ3l4LQ3HWtaU@W2{f6 z)`g%;x_P$!sP%;K_AwK}cXt*!jp^p}AWy*=eHAb~)L0a4t_vMGqf4Qh6@|;g>5#5% z+Bz#SnuWXmlHsUz@lseuMn>1_H9~fc$O=HU1z;2pPfZVAP&&zRK(+Y?vbRs*r~?Ua zeLmM0`Y8ddn>(?kl(*%i&+aSkI<;HAM&vlygj2m;5!JruZ8B}gj67K7agxm6|tAmMw6k@ZvQMa5MX_^+N>JR`Y!Ud5xf!V zyj_Gwu>RQ!YmIR4*Lxm5U=c@IEm!&NVz$B!!Y$z1%n1LUbM5OW;V5Bw zG-w3-`FJYJ{Kj~NaBhFzD}W%#_bGnnKnFVhd+Fa)7e)=Yf`q&3=#%EKXk^-jYkh`n zf6b|x44&eM1zdfr0?R0D`=J8kpp_-mp<2Kbn35oF@-+f^1Y>B4BwoG4H{h04KNW?p zEk|^0wnX`o*RJ(fpAOPkx=8h9q3EJtnD=FLyZK$c%(`UlA?d+)sQs4XWA%&Hb6tCK z0=%-){X>`rJBwBz*4B3;EzObo!D~PIZZbIaxn`!7zP`Rz-Q5aAWaQ>pK)m+S*ES;e|HTkoIu-1*mlTljg z@tVtuRcy_DB)2{CcU{ehmXGO|-_boe>Tbu&Ingu!-bzwbyghwPdmCxiB$fwz@tB2* zZQn)hODVC+dl7how`%`e>n_ly1>oJN-Ln?Z&k|$IJ^?@m&K_U-!wDw&l|gbhVL}QS zlD``^I*lK;AZ|xS?gM%gQ0z=9*y;TWmmZBX^EstvoNzPLfvUI^@0B?P(kfwT#CXLU z`)(ZA&YuKlnj!$ZRWp(of0#}Q zKoU&DVT>vqja_jmKHBgC3(k>lc6oME`06Nt^XeHrY}78V?D24sWeL~1jXNsQ|H zkTGI;2!Jmt={axF;naq{ea>S?O}eR5RnWQBxlD(4cfzJkTX*h!0I>WCaaCEnWxFq? zTDE14D*}I?|YpcTY6+Tqqj=ZVn@Xxx>>my&)jmF*l~&L4rfKkPH@avBcZznAzRd^WcIoZ>WfqmEn2 zt*fwo#E7HQUq5`2NmXYZO!@ysa>^RVDvE^4$F4d-LUMI+rQ%Xsv^yUCSN9)Vvf&Lw$4 zif$>Tnp{HD5hQ6WX>wUSBi7TkpFhKi#2I}ui3G>*YMLsl*#lImA)uuCR>yf-XQ^Z^ zIyOG*@BfwGOZ;GIF}Hv3NRtJtBL{Obo}afq>Hi&z>P{L;7eiP){H|HXSOkiUwY4AM z7$Z9hqqOL-U!lYz^1B`?DOuSuR7$%p9*bt`KIMne=Xarb z_Nb|8LsEUI_tNk0L={QgUVj(fpn?GFB%028Sc6Meh;a%=5X743qP6@Ma!Hup0E-tj zd6;px+B-Wz(sLPsWC6rqH2?prc23@jpE+`on}dw*C0;Ps=t~2(KHnSHNx5v@|Nh6b24XpS-EFOI3u#6f3f0KqcTXzKSLTh(2-a zNu7UOH01j6o;s7UX%%>+$h&eFVBw*6_i+jq=(p2q=%yNOa=ZR=6$ng>fWB}chB zsPLXp^3wA64e*$E7GB>>i(-%X8HhhK%!QxH%F4p7_&@Kl(>^1^?$-M|5u_3PNL4hN zjd+p16KiW+&o}%hv|bAg4PF2HNc8wq0(rfJoqTsJPC&pf#FFoHD4MpQ-1^z}_ULJW z`e%iQ(hBR;i68i)`YKOps~sPhq%ALtCeB0k;UjTe(oT-)ieIj|1hFcb*5cTZ{wppbU4i{osO%S^Qp zPVJ$}(DcXGb?beu)etXb`-_ZAZq}Y!+2Zu#F6B5ovTge-i3_ENxTWu6etD3u&u`MM z+0c`8=icV@CT^aRRomIJy}(WXRJ*)6C38P?N>-<gZv&qw2zgCwFT-KLH-PcCGZ=yW)^G&1M0=8~hi3I&3`*nr*~s2 z|M=DQrN!RB;^kq^Tf;^a^n%Bh4MV!xR##boN|%hjRw#4Wi;H>se42e-P*6-vXP#XO z?hS)u->%$tTXU^7V3=;}OLWn;mCqsIL2~68+7}S*WyazV@wY`2f>T}yaEt#(K*e_0 z-`UOgson2=D7v1J?M6UfK_h^0TTy&o;E35;v46$@^uS`0b}_FL?^@~=9NNtQe(=ym z3I{3htX*AtE>c?TExp(=QG+&x6oW=RjS>_YKz$g2m$)xgDRwQtKO-E3$+yrE9y(o{ z?)1!c&MDjK*F{AmFAHi#Mlw|F>d(;mmT`zS&(w$#W*cj7;}MW15FgTuojgpY>~?5{ zl!1_62|D1@f{Ice*bb%0U>v3R;$_YgT5y}{#&lHYjj1X-Oi0R!Ctz~;`V3h`6%Qd> z>FHM)$3K;~GI-7>;d`q>?I#Z#aHNF>9CNW8;n!ZhC0 zf&gPU0;P$m_zaQ z?Rv0ZV0%D(|94FS$8M?nd^oYuk3z(rlu^6T>CD4p-HHlCAJ{?`1el)yn9X1W!eO3; zFWwq!W%1g<7H#8lma{a6SY=~9-9(K+7CZj7DMoan9gJ5FjPi(wNF1M=s-$$!1~1+$ znBiFMJvH%KLC{ex|1TCWA>-<|a~ZU6{AwzG43!Kf3MSTNT(4dG)n;w&LUsjJ)a{9) zsVEPh1?7|dNw~p^(Za8QgT@DA$icebx7!K1+As%0M<1*Ch8}FrV?ZXI{jMTI8%MEs zX|9!sXu%M%)Io=e=S+yKTk0&8RP(DArf-PmKv5EAnPA-|?k|O|Btens>{1-l=xI}f z9HN8KO8_gJG-^k3XcNNzEtg~Bu&D1;E}z*#j)kiAW@yNhH!Bkmy4f&6e6L!H(l4Pd z7n<$92W)Lx*u_}-CCG_)?f!`x?SdTkz8$}NX2WL2D*+w$ZEx+zwEYE#h6pQqK+K8t z^Ba0-LHp^-)=?P7Cn&PrZ0=j^^(8hwbo#ed$z)*vASCKF4b@!LJWH#vcR9iFXcB_5 zRb#3CR@_Aibn0G~mKwxGh{8*d_<){U-r(uO+scT|{-R^Iw$l>bVb%%ERfduN4JHkq z&L5cujP`LT^Zf$>!ec&3>MJ#)D5&!a(}MUl%n)g}8_osstfGYT<|mF^9~_0p@jP(@ z0!ks6-euc}MJGCvkxc|yVMi#VsH8LiEc6&^&?@POlXe<#WIcNCpkUkGx-Ua1v3m~t zOwZwlWyGyjII`PgMU}4+caX`VH5DGuo$`|5++A$PQbRI}wT0IS1wTD@7&sb#6= zv6Ix$_<@S~Mzuf_YB-Pxl5xqaFgg}6`uy|W@^jV13be3Y#O8CNSm)9x9>=}G?wBAE zXQ~$+LBHS--mL$K{{9+tmtehNLD5S2g1;Rm z;e}cNqZ*o(2|^SW3~Tl#K-?x!E7t(i!5-oJ5!8>-AZdyhgL)D5?!_^6NETsSu>3i*CyaA==;UA2BmwHK|{ z2h7gqVw3G4Xj=dd=&8;A+M&Bj99^Us~*lV1K3oZ>JMlO4L%f5UL9sPfz~(Qo(k?o7ImUztRDF@R563Q(76EjJk8se( zpwQr3)gd98ism+}Hr8c-Xu(2?^t(j`T8yfe3BRbYYA}Af^juxrl33=vUzk&%_>I&u zYFS81>vzsFNmB&&5K*fC2E@;Pm5uD9KM*{~HL#*+O{`v5-+*7S9(9rx|9!{c{x_rj z$;sbg-0dHC1p@Eu*Y%h1>M9+m`izXeaUavAm;6||kGdxKZ_USa;zVMqsU8s}_xrt@ z03wI!FPClvBk?-{CktcI{svjkDk?$~z0{sJ!@MYnt6|>w%orM2lyRr$!Yc-6|UGWN$e8x^dH84;QMKvkbactA~ix6<5#7s!IwS(># zh!JX)_$;TT`X77Pbmv15hr6PeW8t{hBrGH&Ff|NUPO2d!Qma5Gw2{YUg!+?neiB%9~x@&lEP>KPC8w{Z7~D*eMxv)qB>zZNvq}qCZyb?yLa~C zXnK@Q_wXtx@3-$qGAAHMcH_9i-R%()g!G06@_$QjxAoVc49cp!LSKQ;@PPO;#C8l1 zG?A+C&pr0TFN)Jv7&Z>__BKDkx0&2R5nY^346)Gs-E*<9j5IcUHTv=+DJ8{whB!Bf za|&P+e>a?Fh#{z|3)m6hx$hxfRP}SGB&9oL8v)lQ2z$LejK7N8esAoqUl8B@{c}dU zeet|@Wqpt#c7`f*w`cHLBver-X3swrnS&WAw?QK+5xi+Rd1s6;?QCs<>4Ghqfpg90 zdm^Knq~r%oc!3_jh1Y<@>SQADP%yXE-+(EbE*I!#IQg@Tdggxd+>d6HSXb`RnYku{ zGO>k_pqIE@$NL*j{sKpt>gu(cYs|8`Vs5L8(*oGmM8SbbNJ6Pwk0bmn;y2_T9*BJU z)b%56xST{1b_B|Ow&jqSOTT&5B9{`oUVvKo8jgVHrX5t??M@>vfUj9XVFAd>t^I~{ zpoH5Xh3F`;nR;LQg_0K31;f@ih1`0@qCAV%M1~G3dew{Mv%_y^fQ1FI!;FNb{4lfZ zPEa99ewzFuElk7|9xQ|)LVwjE;z6=9Q6hn%GLRnP`auEHjBPJ$5kkm8jQ*m8Z}dRt z>fV0ilk3PZHX_uQlU~~xG3u}bZ0j$nQ zFLH~Q%?tr+OZAp_Y>y9?JLm{S0vnbiEHb;+R|q0_&3ZQs195771lwdDU@LRrsRVFu zqQ>6CR2ijT3|JU%fSdqINkTDFUs1sHOV4GB5rywKI-*lYgyXAm40e>bmr%X+vII@a z6QJ1*&{0Q;vrOP@Ejh%GFBi6dtp~^O;sc@1!r6wZ)|`&{DxMON`R3kEv})yYL^zk& zjDXSrXUM^JJ3K9QvIB zA|O_Dt+@ATiBgI$@?w$@uhU z0|$U4qh^?l)nKG-2d0ZGKJz5a^VV#o!pYJdV1OLeDFmNL$^&?<`A?LBN`-r;i3Rn@ zi&uv48Kv$5ljb$8yWFctTK&Y>H-6G*!RH!nAt>FX&gU4x(yFLEHKW_YswA=Y1`Xw* z-BQbVOFSUAg@<&ZioYEP_!toM@ng+6wS_F2sY)NB?<&anu#N2ihHaYzZ@NS+dEw9aGx)%UX%t4uo z^I&c$yDIGIYB_XDh35T<=MY$GnzBCss!a9oI(M8le2Xo7)h*lx1(Km?)%(kT{y*qo%6@Fr|8gGGul9ZHL~Z+5QT?@wW9J-Gsb0! zwb{l>6ZYS4WeG+4^~Px^LaEh(=IC2lsm)w*1OIiZ_ft5R&j%Nf0yxbI!By3BTM7kA z(S>Qk{e*;sk(Vp6TqZ8f=9yxdCB@x-yWF>1;#eZA4iMn{sJt-VfmFTb62f~4!csny z^wy^5!Fkn!x1=q0wSp(8PQ+@k`832yu7M5##|S}8*<9GPw6utO`i-7)aH~$9gX!6) zvA0d)#9Djm6D9esijxDYOz5uAy1z=8H`KvArWb8J5gf1|tn0=yp%)k)GKq1lET_Te zTRq~Is>LRyR+p@xX86Iqm&j29;`2I|Sj%!gD2pIe&|B|4IX(a5MQ(@VKqrdn^Pjf} znj_xLtyatdEJ_`Ce6(2RN-`O|8_Ri+sbC6ytshAZ2q0O+$Kl&E#gRrOQGwRQXJ44% z=hgB;XFwFA06(VMml9q!IE)eoND9L!pS(*fGem?LuQn5-17%|CKqY14yb zd8aFElNS1dm0QoPD7NKec(c!Q>)5_l@Y`Pi4vG205;#{G7D#DveYy|4)d7oS$(|Z- z;A!`Jc)_hO%?8h$&0A!)kRt>Z#r0t#8b61+{= zn+)r571YpjqjQ?hJ?o_;wUUt`i~UG0^dby(?D@*~pzi%~U1$C)}7YxbRW+n_5Kc>r0n4Tq@lEj_Q>0}iX1A&`c=Z8bPX%&U}+*sR! zj;Q?fh9E9uBO~~Si7m|oSM7RjLVO4l)9wFoMaumD<%*~tc&3O${?@182#?s*W^#X% z&5s>Bq-~4(T_$`f@N;)!RZdBk!M^5qk{q(&miQbHS* znk3^;Nt@BWh)QW+XP)=hx#vFjJolXY-+f-sAO6AXg?aV+&3E~H-rENsNPm9rI@(>4 z_Fo`bSWvSQ6XdsD(pcx_(^K0ZP8NIY&0)2<_~?cPGxA1GsQHePitbc2srUcnH?!*@ zOcdJx+rn}f>xg(*5cY%u?}XWZMicVol`Q{1k%RmPBp?w-9;m3Kxr;cth5bvJtW1Q* z)8?_~ZG-RpVZnSYHD~%~X;^VlZ6*ay%;+iXY+j=wflGJuNs3qawK z9#}a51Ov@}W%JCZUlh6F+uCy5nSf9-kfU$qG~F(50p9o+5|ch)zzr#w0~1vF-K9en zs5QFb>G40ziB)OL5AykDjo%cq^hZvU)vXL?cC3_H&tPkMqB`wO6oSSdAumStA`+=~{lX}1f>xE*6 zl?H80;QK@$%DkV5fT9M)a3}>ynHYkGyo`I`{vq*{KTIC)?5b4``3C`A2u5OB1TyUo z+wp-Dv2gsMLNT1`jlRUBoL})}W3+Is`%ILQ7{S9&PR>S>?ilJ|)P}zAa=k&^;{+Br z*C_-og`6aUGjUW&0S0E7zS6A*!u|*F*jfo_a5B(!&2mo_Y_7tz@=I$EI1}RtO?VOx8;f;zz#XFN^@G9%0nU zh%w;hmbQW1CGYdBJ_aP{tXsG24Rl#o3DKSjW?OOUm-2FC0QoiSA0&YAEUTKJqx*qN zflt&0>^#L|prPTy{=h=amf6>cxKE1p-*d| zI>NW7PCoA3ZkrG$E{GMlZHXqrR_;jo7RY`*+q6Pa$sffbjuK73?NkbL-jZ_%bAW*> zCHa=v*v{{Hqw*dFtfa<4FR~03)sU(-zq!Hnw|lF&rC8cz5ay~pyA6Jwby6A~1DUpQ zeJ5G({-H+1rSRf^M29v3{@d|EEiT5tQgth`uPCU~CyClhwZk|;j*-^!k^iU`#b93E zCjw)fNLPYVOIus}?fT*l=gxkvq4|FDj??x6M8O!ZFP$#5X4UqoUqO_wAj&@jW${}U z|C3{i{dX@EV71uT+ZNl`onLN`+Hmo2xLVS9OZqJ)h7rc8Enaj7R!HYzD#WZ9gR_S$ zeQTBH=JdQ{e$r+ZvBVREvKFXmO8?5EHu|JZo|S&OUhWkB!xDI(EOnqrhFqiR;#xko z_Nl`7-`yOgKbRPj;j^SqKuO3OGbiQ2iS(6SS6ZRdqI0wRtW0E=%$y=B8Bi0XTzO)l z_9{=&5pqZWHUBJH>uvihA?{&qgC0Xg34(3K69N zhF4q+pu!i!jaG2Tz+IHOI8VxOyEWrfGU`NUndI9hj~lQUmFW~XJw-?3pSur!ZkvY9 zYXWYAf{8ABun%H=h8rFrTU447!r)IeXFS&EI=7v-Cwl}S!lpp$T0_@?N6m@eZ4pX( z(*w(ZSF5{?0*;vBjk!>RCl*0SJ@JC-DFqP>IkMApp^<>`?^~h5P0-fq9($`lxd1cI zw5GwFA@lc9w47ePyCl`}R|r6I>AhU=?Q_NTx5a{p?1f>2Kr{sQx%W&M1HkvC$)JHC z9U(nC8YMlu5#H#E`wnui9aql-vnTGMjDk^rusg4FQvr_bK0?XuNGZp3I4? zF`Ipx`iVL2TgXjv$J-)P`LGOD*yb9E3R!d$MzjYk z-?kPLsP4&?X%^LLcrX($1gm237*jBJ1Jb?JA zzmC2cJ#yNn*3fpe*^`jjQ@x6fb$c_bahvX{Ed)(SCc#VHb}ZOvWv<~QfIY?84J}Hv zma$?&n8x!lf=U>;pq+u30?k+;RFlvdEt=Wm=-V1bMsjUnN$6)B5EULd(W~4H zV5WBJtk6%8T^gr0rnqd`0a$mOB0IIm?hsW$a1qGWh^G+EfZwi`K>sO7wq+JDM2m(TkS0Y?Nqr01>s zwH(=kX=T3^BlI3!R$QE>?*I*W>vOE%;kHP1S;lk(X;kqtEk~X%CbE4;@25`f&x%Mx zZ)EWJ4+|IOkN;Y@xK`r4!dDB^kI>$nrsF_m4_Bv-9J-Mx<#G9R+ihTB!H@dh`k;C5 zcz!-3uj^x$J`927O$9!4`(XNH7EO1SiKe>et^30QXxL$El%zgDUwe9i+BF3Uhocxn zEK9UfX_Gt8`GvH1JgwZybYUrZMxMa zX>fSBpaDd9?Jm@*991Yz!0$5o8VRzkk4ywIbJqk+s%>JF$ z)(=oOVwy{78*YJY4DAVjur!_XcWqiV^z|pG7yi-7NA{gzhNANKhm{PKsL}AcT41dp zyi`~k-=Mn$b!&eC5fnfD1cAbst)cqaMBrXymq_&1AvBrg4i1e=p72xhyyW=ngX0L}#L4ki86HG!ZIJXDLb( z(N-av8Q|}HL{4q=8+_9pFac-a)ZmMZtLgpVN8oParm*foqw4qinu^u(M(=0M&_(Qo zrq14T$`agnO8%Dkl+@=QjWWv2?sKsrp~_^wd@{ zAExg3IUBYwTgQnyX?oOrz3@SCi>S%o`;74UVX{I!ydG*scr!?&4ro4rs_|~#NRrk5 z)CVBY9j?RD?PG)`p8Z^}s5>s-z^%R9gOX1R+ z6{>g->zZ6a%i!No%EdUe6q*IZl%m2Q%2x!g}xEQaE&}{0Z zbuON0${`CP?#%_N?7G1UM&aOO4_(bJi#SGFE0%uNlUTTrsa^zQaetw1p?kP}w)@2E z?HRqf?ZWT^k}XuU(6q5iwCn=lrr?h^U0~8#wD|u01m^Z;nq)(EUp89OjmO+@!77_4=LYoJy2;m(3NmNyc4lL^jDYF=LpM) zE2K25eO0MjCY)LDfa=E82->r2;z%kQNd6SwANjz30s-t2Y_Nu z!-&ta+nmIlHA~Tsr9aPrNy4QGnMqRjOi zpEEcV-<$Q~RqI$^4qvllS1VUwiHU#_W%o{O$3a~g^Yp%Kx2b*xLk{@ofY7<#+u}Da zAED%SF=}jV!%LGbSWQ7wpUx#E$(2Rlys5bnJH{aBdJSAM=5tNA7$=6_>QXQhP+<$} z4#Q4UU}!dh^g8WTa{k@L$?qPzeR7JQZ=Zj(0Z>cU%&4qboI;7@+P3_xrV^XsHL7Q{ z9JU#Zy}K_358_6V*}ZU&F1;=H5z45At1pI^V3Q!S>m+R@@M~XeBq2e;t7h5)GQKT5 zFq5=3GG#RpZiBSVJZOz5udTA<;CV)LQJQFMXi&nM))1^5MbGMO;~#H@(dt>}s}EIM zydTV=#O55X`3S^`dF+0cloq||cI^s`U5j4Ca8UVsFv)dB>NXc1c%ZV}Z)PM1oH2<5VD3=p-8z2yYII&%08)H5jkh3n5Lt-@pYo;I z+A^bj`=YXenXyj=KOpg@(x>)zMM?Y+;6FL9C%oC;jYevPS>myeD2JBAo*4&8)K=yG zOv8#+b_QmCY{B`e;HfiOpF+vZy6GK_FH9KOr^~TQ+ z_g>QS_;!%wJtaZS!`IAN`s?;Nv(_GPmfRaIqi99NdCiyU*edO_>ezYF9icW9<+Hx; zzHfKoGja^`;BlUI40CQ3n*saHw3>m`^zx}qoZfslKElB!nbMx0UN65vEfQ>wK!i}r z8hzN|xi}=D(60lJL2pRy^(w5v)D-w+9kW@p=eWysWH{m_Ye8)yOl?V>a|;wWg>yDd zBwV!cy5$~B7%Tsl)8w*5c*DVOa6fP->m*;D6uoUEE&phb-Kf&T#^WC1VU;ex@$6Vg z4MUb)_!Wh~lM%7B?Fw1&;?tMnAPe3?RLX*aC0D$Go-)_ENHVeyRd0+^%9$s{5n48Z z4_4yz)Wu(@0iGNTOGZAQR|HMi^8^Qe2DEb%w#LjO7$c;`eS<;p+unp$Va}zoy{Fr7 zcRbFmfVPNdVWO=7?oHoiil#tnh`hfXa*)zC6VKbAyhn}$H&R{SVBR=h@8Tn&5U=VS z{EM`fsfmU|~z4>^VGmxY(_yx?#IsoRv@ z@4wWdeMiYWmsI#!B>#4JrM=GO*}~(;CLWUOQL(5@R5UhdZ()U~^5uX}cAfT~dL{xr zwKvZbVh!6KL5^_FM$1gpc_jzz%In54R{(KARjR`0{A0#6%Ysf-TyHxbP(g`IPY8*{ z(YhNEM+HdQG26YtfWN`{zT8HiCSH4tf!V(6EI1%j;}>QNO7P)DuZFQv$gmcA-s|q) zI5t7Ti&O;mfX=)ZLxZU%-U4;+*{>8is4IkLiUvxyBXZ)goz5Tv;4sJhAtcDHDFbSE zFmQZc30ud&yO+h#S6bUb%{mBWo_kSFpz5!tL zIl=PZVPV;jP|Nl1^)08C%`q5nVbc~CIGb&ev=x!{-*L4NRe-JIhBmNSZ{6c&i%h?S zKh*!FCchd{ugCkcw_7v+;w*WvHr=KNKJh}{WI{Igt_PxN<3}>v&*-teg6cDGfh&9L zKa!464Whb-s{_Lp8$ndwgk8FMy34jxK2dqy_nV8z?F6d;OaZ!|RXO}77uL(*p_liN z_hq=>8%FpUC~^{g+bW?yal0^sSdhX&4$1UDdJJwiRRpwjGo}x`d7&Nyv!BWMX^I&N zh!RVr{fC3ALM}!pHaO+M=ROe!(0KCIH!A9TSD%1byAL}?yYZ;oxU>Io_l2}~&Iul8 z^hV2zX8MvW?RIAIT0$7-F~bNCJcy|eA~cJ#Gcy&XKZDsQ2TL_|!@xn}^~pq^CY1#? zNbBI$WQtvF_4lYVhnq#ODDpMo*3l;(N!&6*j94g1kXhroUxY2+@K1rRI{6?H z!**PoKHX_?5!@H^N-`21e?3A~n*9w*as=ZuBvy@UMA6x<8zzfGlMn6hD$g2Q5Qr~3 zA}~2Ow*zF(qv^rO`&n69_HIzPkwjlOFn14cER#1M|1YH8olR_9AC;feq#?66x14p+ zVQ|V0q$&A`qLJd6?q0!`cdciYM#Wh< z6_#awvZbocE8a43NK<^V`YYsB@qB`%+sg_t*X|d{I0*^XB5_S@3)^Bp+@KJbzPS5n zl#bbhuz*T1OW|kgUs{N;*>zp7X4-6v-i}2mZN=_Qcd3wr+EG?_G?6Tu1J6dQDxM$_ z$C{;I(4IdVzUC9G2v$I)sK+JBk+xFP>(`|});6YMBs3o~(P4)T5HJA1Fa)?9PWWtftJG&%|~%9AHg&|k|)s62TB@A~8kY#}MkC;PxzcYr++cH~8i_!eL8vqHuRESwvPy;CQ^}lroBXp=`uc zTUc?m^rQeeTvy^LJYM2by2@v$kW2jjqh7xqCF9P~t*EevL)D)@9%lj^{M7e{i~P}) zNdEu5@@QkX{^vV?N^>N3;{WA+;j3P=|9%x*lh;j|@Ap67hY|-wBK(hAfs4`p-(9@+ zsH~zAmywY~N7+(Xm~tB`BRid(oE)E=JpJoeY+PKNZJA=qDke%I0u}F62}`|A{c@T8 z52N~6IMx%cs~0&Xoi(G|8N_xDy1cV#6aMY<=(y_$8%vlvLOSvvKYr91WjuhUZsu|; z9oRp)SZeaU2*o5o|UYeLV>vhy;vl#aQnsAgM56y@a$ z#&w0Pf`#eThyyp&@@w}oS7|f0G#uBNIe9$<6@E}%y@*ZeSX5kju3A5vwQ%US5W2PC zae8UBn$A;?l_!_*=I~Svj)o6sx4zyjJRGI65}k2zvuaS>Du;NpRa^@8?~`=4eEw=` zV!BO8LSkRzOThL%A(5oGq$E5{wS@gnGC_;ARLXNzX2s8|c%0h_wL4S8??OxQ>wKT4% z7x^?kHC0_Xa4zZJWlj8*bWgQ#-J}0=;E94yS0>szMu`0s>^QNflG9>&?lX+1*!s$W zF*(OfLmkreA#)-Hn@TAE?JgXwgpm=BdAgjW_xty2vTyo{e6;vE{(Wvat3EF#SEIE~ zndp^3y^iUg`X7=yT(0*wQE}sln$wWZz3FU0KUg@YaFfu-vosq4HNJ?&^{iJ7=BHslcv5{L|o*{rVuuA5wkie=>nW&b%)dCmc>#Ju%$GfXeo*pibq6|R*3myeN^@i&M<_U{qRZXg&@#|!oR z_&bKC+%9KfVa@(bspWxgSp4y{Md^av1TY7B*g9PUeDUX{VIFxJ5#zFJ5?enEF|q$ z38J%C@1boRf&6>0^APGit_~9zCWf;Fy>2fL5}7ph>(^LVLw;z4K7C*q!5Vp z0(7y##R05Sd`b%LvuDp&Xz1vWYO);f4EOb|n&TW7DD@))4Ra ztfZu*jEs!NJCC8mv&#c*DC&BTPlM@*9tA~qM@Y=w-5DELOL1{O$rN^D#&1y$+rthN zzMY*CCYb^rmvVB|Ju%tew0|JKGp4w|`@Tk9Om<61=xR0nU2yY|5FfwU>z4I zMaUvNB4T2E+_u3m;C5$YbF+-KAAbNRu@$$Y?9EtGr)10rh z8fZcUe}}XvmFYFjR+*9sx1YRvH>Y>$?_-jWn_YfR#n3#U4r-dvEp z8gq1X%*)pYOP=A?=yA0aLBN)umvw)2;w?FmYGQ0mO{*#S-e}#{BR!2Pc)`7#APZboxq!A+Xn zxv&ipsa?AA6)G|TE@Bt=F2T3Q~#Ivp+4M=TlZ z>+7HJ-1dBajT4_G=pj;+u}`@g}?6* zD3aN()-4r7PR@*x1T=-eiun;VNE3^ zM_aR3wkuCwym)aJ_;|fdjBogG2XA8X#pj{^=fb$}%JlenWVpMzu`#j@jFfLd0q^ki z($e?x@|~%YlwYOV$Px4t^S3AuKgwV3jpmXa2}wu^HMx$dYHOExTv_k#nrFZflJFc( z$tn$J^3}8IH=p*!(+7gsPfz8#xV-#5SA#Q{V=?XD(f<5{vGM#5n*fg|+$8o{o}PDPWMsS3$?ni&Ft{_OUj;$MXLhu=-(74VxbmxaIa)ege9RE?8Xp_OrchT`HyOG? zj@sAv(Op@0aO;U~VbjMyzZuNB=co+v{$x6mm1~2}l5NvM7NT(!h`gNZ<#f1Ezq7N0 z&!T0ZEh!mP5E;CXD;_eYZe(i8V>$DZjLgdU5bK$>wY3>RZqZA#QA*9}XdNr#<>n@4 zk8&*pG{S0^qvkLiIyGD(LG_&{>&5W>QCzBFY42|@$?k71rhfg}5~q9$>W-%BCMf|y zh)1r^qxXLP_wU1%#u_lJpiH|F&;_xARP z=`E?Fzh0v&vhH4~7B4y}MCskT)F5$qX02*)a=+G1cSn(gG^op^xqjaH{hNy8>L`R+ z_a|ICTzz}@?vziSU9^X7XXt8;>84}`ZnbZNhl{fc0FAcGu}xA@#C8;fb>X)7oSdA; zkap}7>=(iL4Gk_O=v7lI?*+Z@2yYbh^oBb-1Ixx;->esO z{CCxKnf`htp~>Uw_K5D{NI15M75*Z^j7_i6z$2IQkwk*hRW&G4NQj)zF%&(~5A})BDaf0R zUbpzG*Vph!o%wL{NNq;&B-3Sxm?YfoBO{mu&1woFZ{DB?v1v zqL0}8-tXTxxB81ejwt7`-Gn@$h0V=N@pPZ|epziSx5Q$RMp(6q)_KluZ}f4{(ssM5 z>DH~do$nw!&gJM?&m2#mZI2Z=d)`6&x}&r!D=V?KSK6qP*>01;?-s9_HV;$h*#+JQ8kg$;OVxiTN2c~?iQQ9_-QttYUZm=n9=il=Mu9iwL%QVPXz><-XS##-eDSH>L*4$ zjtKj|M){(c?R>stXk$~h+7Xg}CM+b>JP!M6k4)3P5%C&M1BSVzMOozmR4Fvau5eh!_#`Pf_ir@Bsy@vDzHfxQ<~js z1N;AR0n~@fKCRYh8FSSi<3rGhAP!q-8Ph}Qk2a%=L+L-ZNAy)LjcL>%q&t@f4fC}J zfmOzahTZLg0t+4&ry}bs{doG8p7$5MA17#2QwTlW^|(1XMN$U_m?%lTaFIl(dVYki zA1=XTzJXdD%%e(qIv(zuzaJ-blL`b)fSDbEB5_1+E@r(VB3z1}pJ9;* zr?)K%)ah`pW}wavMi6$-us@-X!$j^!MTHa&5=m|C< z3}lGH=gw}m9e%N)p-ii0yfp{gUFV&rS?+pI4C}i}=wuPj!Tb;LiPVydoFOtSTfD{I zeIrS0Y)gVm@0}Wp=^WTxyq-uRba*c3eTWbYU&d%(q%})*v-|l@S3-H=Fe%UBe7S#|5up0s=4URv$ATh3Nao&Odl z6?Ffm=HNb>K2pd*Vc)B*m3nPNc>3GBGrB{FS%}ZWY>+eL=hf_w zQtcmGM_iLH3g4W3BlA}EM~{YIy+P9 z6~uNg_Ge+e-^7p$?oO@Gqu{Ji267LYLs&rx#pYrD~)E$r{ozSt2SfhYR8g26~lr4CJ4fjU5~&%FB`d_WrxLJ2(L{ zB0mt-3SvecX*1kU*5K!cV!uI+sGv?5n3zARZa?5K{VHQqAA7I;jJs?MvyXf9=Vo9U zk$l4F=%`fG`E;rFNOQZ5phCP=dTMGe_F(Op2@YA0^8DL+dpv=lA2z6?NhAWUSRNHY z^^&6=gDyMc1stDgwdC^%P9E;D%*15m6S4^x)8;zFk8UQ^LT~oB>`xjT9Ng=KQ7GdKu^~5*i;+o zFfcH(vIxfZFnkVK+5xiL{ElSs2)xD0YKL^J zrt6Zqg+;{=f$?#bRrs?LWyxzRfU`A-%F8M%QAoyo&rdS8hYopc^db}rdTv!A5;fbo z-$EHl(AP=>i`~%ydeW*kd*yux0~?SNxN4K@cys<+*LnkRA<=|XZyO93>P|9_ul=L_ z^}SQ6Uk~}_mK%25Br-kvCVO6(uK<)SAt^bOa^pEm>K)~#KR0kl5}rjsqWrV*ZMWRi4yXEYPUc0 zdZ7<0c(~X=M=^|f+D7%pIOPxg*+p^Kei*N@_<>Hs&23rODfV_=A>k9XG%*Q@LpBCz zvVD9WRs58U&4iET2~K2W2kw3_n04h%wFQeuFlJzo@f{cS_1={Qg+W4xr!<(E2gkHS zCzRFH#Ppel^K6!d;_4)0S+#2|b(=lmon7qh%@^lVANyyoedb4_cx)b8`lu;{yR2E2s-_)rpatRYsgB4<~XqfeAp z;C1W#P4#jDhU{=_%Y8E(lQlIxorF{1>bEaeQryk5q{I>=w;UXZ)MPe&-Z$G$w@T==C^PzSPe1|cqCTXH!XG0W${pqOfhpy*cP1qu=tD&W;Ql9K8}#Um1$N8 z^hGV|+)q{`~5IEPnC5HQ?HVasCTXt86 zO;BjyQ`j53BXk7`ef^`!B93LxGj(%wcM%b#5)GIuxSG2tEC~_o`+Hab=KwEcf4V^= zE)J{H*(lIvMh{8e$33QTa&!c!oFLdgAV4tNTS>__o|aZwc|=T1Ojjp^_Ycuu7_dTM zJC+B}VLE)Xl|IG{CmfMsi(>wZiUDN~Ay4=9j^>IG3OV_rVbDUI9jxH7CuN}Z#25M5 z(JpgJ(s(m#b8|+M-A+Ey7Z!dneQfDE2(s#Z{QWcqgTwTpcM@J%-5@U$V)sok+uLlU!+51< zY!Yb)aj|0EX6)%OVC-U9JOg`s>Aela)FxG-@^K3Ut`a%FqZJ_M-4(HPiqD4z88bqT zIO?XAd;x?ADK_2B;T{Dv&2T2a=*ZcGtv6%r)3N2C>S{*;^prdaz~e=pB*(|EA5r+a z!*rm=B%Gh4>FVm@Q|OEOg#9LyzA4jhd7u&BEq*B-uyHAxxMi_3CHwLyKRa94+Cb_W(h0Y}Crlsi z9ESQ6OFkjVhLfR2BRCMHC{lU9R(A%;^!xgl?_9ah=NUprcYGSaoLQDt1cf#d-=FT8uCkf8g!nfdwppUx25m19NWq1k$en5-;} z5_Pl9Mt8h`R`HN%=ilRfgWni5aa!N^4i0KHx?XP$X-7q(0mw9r?5&Z$ZtJkk>Unei zu1t^oB{jDt)S@pAkG`p_1wYcuU)JB#dbSdDBtFTBNGDO`D z)8Dg4_*ema>`eYs?fD(ee4xkJm&&@jUeM#!Dw83T_zci%&y0fXVK5I*Cfax{^#L+`p5!2xzZxyn!Xt*5f)mqgDM3J||+Y(;dH^ zrKX+&+2qbn>5!rQS>ZDyxIg_Ai}^6J=GITgzWCe8R(=^pMd|zumk5)=l;Ov)=yxlD zUty=tJ1{w5U}3#)K5n%IAg-^i&1mM8Dd!Y~XAzE(tsdpnHQ!q2nXOS6uHBE|rJx=Y zA8S^z!ioe4(9mpzPN5R(acpdC@u$-!O&wcc zOsL^N5=%sAs7Pf91{pxjns43|r(~#I=#>PmD64wtAOwH=w%_AI1jMrVhX8r!farNZ zD5q#ZC1n&8+>TfLqN2DKUg((V*g3K|v@0`;U5Tz3pNqOzhZ!QdGh@_+*N#F`Te?GszS}xVQ zr~8Iwb2L!5vENh_O$LwPmM?X4TzsO_iYY)Ya#zf~`TqSl(2gEUeTs4@*>14UkCuBD zn=AlXA)Nm@oxAj;2YE~1F@X1L-t#f^vk66xegtzs$B-*XOPh}6xq%M67oqvRA0)Zn z!Su}Ti`+FU7ZCqdX- zEoZuG8MHP;%_AjqVrb3G@52RipCgA!{=gICP5S z1Y{WKrYI((-`)vReFB03I3y3ybxc}XT0n*E^rZ1Q71!4jN#FG#5=UWfuN|)j)Twyg zqG+V~s$~hdJ^S`Ts67Xnbm*(XfRdPG8pa77YH4GS02^X)n61c*-Zv{_SZW?FzFQTvYM6wsU4P+V*%)9 z1m{mX&#~+B29h7WFLu>urh4fzx@?+>B1%Z`UZim67ZxH(b!-j!RP?&Oy*uu}Z2V+* zy3tqf;M2uM?;ZI3dAqrD(74tx$nF%v(SeGb4qJ}+{>!~DWHkm;&*HPPSpRB&H36fe zNc;_HY8@Y$h5zFM9?YCX{BruB4-=7z=|9XrK)AT@yjU*wWchh(zU{Cq7yBcOgQk@- z35vWV#L1;jY}S~Xa%Y1@pLPV=&WF{I-`|W#hZO20Enj1A;a6M}laXqDe_OGz*hKO( zzvbQ;MmvwB;qKw~6i5&iNb$5@KBpTDwJKXK%kmjKHmuy2`?DVVGZkmsBX;d>onw(7 z_A13KTf@xeHOkGB^YbT8HwR)NeBS{D+v0Vr;n)igrxV0m1CTR_(?yV)k5_U*A3@4( zNiQuUQjeFvByhOMj*Nqart2pKNPkWaj?HZipF8MlkSWOpQ6%XoCK1(M7v1Rp_VW9n z-xS_Artz&zjp1fX*Vl;R$pIVm(9gFiH?R=d`=R^AulH< zCnMwgDZop%$cx*HNx;d&4>6*UdLW@fUX*iT&E%-lA`3s0Ff82rf3Uo;^!T zNtvuIjo4v+*WCQ@{riFP^gnQkY_e`lDPS_8`auAiQb4uDBDQzdC8V>@-Gka-#+sIvX5WdpejgQVzZ!*rhlh7qtNx!Yzwuh{;fz-4P-)y|-4fN^f7Eh7Cjb&*&zv-!RHbu}4z_0e@9Q z|H4H=q@o?|>O)5Nd${I+($c!w>CXiPLxVdPAwN;Hst)FA;%%ke{Gsec?FUrXchUbS zv~VZz&vh2}2X>e4U|zAa^Et}o&F&zrMFe?5{vbk1r1O{4Y|PAYpNgF1^V{3o?fDh{ zYW6iPoV7N~{n#}D;pP$1&yrI*ervc9-Har`B}h%_nC*?k&lAyh+l_$W&ZgICTNAdk zqbVg7)vr6!;A{d75GxRsiB6e&&NOsD-g~h;f}L}vcQ~r_-5vH3M2=pIcZZjOz5NnB z1B1qSY25hNk&Ye)5J*sadUzuAfA$v!^e4c5A|*YIUlE>BSX^9K%&3W*TWkE!-4zOI zj3petx1dkEP+SE~m}ckD2hZ3~iEGsQMMk1^(p|NQtW{RBqZ9Y4;pY1JDrSVlC}Gt2 zy&1^Gy&z!G>ipMw)9zQd^E4_vTnf|8uEIdTkq{9sw9BjywpwWb1;u`DE-mhds<7dIW}vd#MwT@VI9nbgcqTTQrmbc; z$3!>_xoU3QL3L$SDN;CNZy{?QrMm|XiC+XTzgbsxo@85)o5M~qAtL;@+JD!4lJFUe z{2!$8--`)rmJFQy_RCT{z88~*utxPMGh zozieiNtu~=|5!~#v9bv!M_(WzH1Yk9=K>7x|K4Z+Z$0?`=Zigspirm);1d9IEuY4@ zS}f`8%>AILp|NF-2rMZ@MMW38QxlVu35kiDe=^tKm$@KVKBp%$h(PAY#WCC(Oy%R_ z(=5{)8W?D>TSwp^&Jy;~)6t2vMUDyx4Gjf$6CtMl{oiwmxoFH^X!h&3lV zySjizgz>dCBK!bs*Y1@6TWp5%o=R0de7n)qJ-O0w7{D5)u+{J!3($y1l(! z1p&1V!Y?c=dizgN)1xNLIctn*0L;@(sVowo}S5s}Lk zE3*JU|Mu<_Q#{y#rhY6Sw!n zwJAC}`j}Z}kgZcTa4NJbDJd%x341q2M`MVst*_htN=;1#P|!cS{ofFE!hdzTyV_CS z*-7K!!Ov3a(^Fyc;R8_XhXx17fBmYgs4ySRd5XFngclPTS>52Fc__?cVq|3Xemup? z2@oNHfi%ifNwKj|AjSgP6dRFGmNV1e-#;{z4j5C=Nft(+5s^^WMdmXis{~{j1!vRql8Ki-n=AUDBv*O}ZxU)qxYM(|T zB&m;Dsf&K=Qzs0J*hCTKTk>$$mJ54mYp}XfkqgYU=7;%FahiQ5=#` zpujxd?6GB3R#kEE-#Z`7b#->a!ND0M6LFa6w0H~B&`2mMmiatBFf+K~1LIhCcb(mO z|M2aTY0R&&iHQXT1;#cuKG&z4_7NulwhIXf(W5Ms(szUKPfJff3j@)f!SBM#%#0Qk z2?c$#xRBkNv$JzAIYx!mJh#N&{Es6bmFMT>DJjiJ_1@otQVN7vdO>PxYHo?3f<6Vf zB%Egg&ijNa++18_5L-$VtT0NiyCq6YLHBc!Sq*CML{_Z7r?B&uQc4dT?#HDjEL~kI z6HbF$pgIQy1uQz8PG<67Z4KQL^=IHzSCY53uc*)a!G=ik zo5{o+LbtzKR7;atN z#m}ENAa?iwdZO|10vmC8`5|C7>Ft%-Un*3l z#z&eR;kG?GHocNUN{{!?^j22Je%OxpFKCxG*#OB7Yv!pA5zx2+M~A6=0T#Itr0WHA%VQo&%*0yNia#w%#6O@tvwKVDpbD!RpM_=K6y}M zEE~;QXn7n3-orWI|6#@A%n%S{vsrF-I9!;$+j!^fTzfEAUw)thLt@g_6_Ewji!pH@ z_#SMD4EW?SZv^Lffej`w)9!5R063EH@bLlUM&zHHd7Cc{Tzk-&ig>8FHjv2T;(YI!UJCck_1qUE-x?fqXL9HW$ey7I^K!!KsK(HeIC&ZP)-)| zBqQh)vqU=cghtZ1P^Czo>HM%J^QJ0C)d^Dx*_*3j`oK*Zc(FI#fhC%@lL|CpKcwxz z3r|pNfh7pju`WMj%*Mvlv`3vR14akot@pC`EsJ%weFQd<6sIMp#jkH* zOOCk|vIL0m@ZhJPL_Z-Vg;Eb1m)F)x@vh4Og*WiS067L7#AJ|=gM*{9jr+5Zw=&3b zfnwd5yU}F)z+vgW-i>a;`O*N-4G>;+b**r-O&%^15^(*tfY;vI+UkiWYjD`ca2Dme zdkNRKuK640pX${poY>D~V?$AGFy^+q%9#~G5|5= z6qYA+P8{#MG;lOrpC!*Y7hTyhwognnc;EYAj@4JCH#U;a2fJL{xjCBcbQpFZ2zwH0 zC@C3y{D_U~*fhRKC0uUx{(U6tn;FgF;ZmrJJq;WWrW{JG71#%Z(NOAUG`(g|W>3L901)&bG)MhHaQq zAcrX&Eqs4*LKG5EE`gCR2%Y=GlN)_b&6kw1YC1X@JFMlp3kwU7Rbo;A1Iw?KYi$j& z#!Iz%2oW0u|A#fsyi`@WTGnjCF31CYeGGuh{9&_vu+&sy7FbwlI*2QRTK-Wr?AK>D zk7zl(yw}U$bxBef0C&4P|AR+*lD61@b7P}%YdMzTf?PoodV_F0Z#7@L6&0M9*KRUo zX}$Op2k(NDMnZ`IScen1h#BX|;+}NR-&~{v?O(`xfk#Ij2^o3wM@=1VOPHwv=6rom2W`IC99cidC9XW;l2|CW9`|V+|$Ew%pNvygkMub17 z+uB4O^#W8x3dOTAi8+y;34&^_fs_#q$kCNBOCzHW^+;$gk+I>df{cto8Ar9%d{R@W zGWNbB;I6MHI**=*!|0){%Sw4nF-4CWg8?s=3Ym6bo4 zk&gW+NFf-efG_ChmT>tb;H}Q~Z*lifDQfH=z+vX;=Bvng55UVnJ5^@$gFDT<6b0jQ z)b7RxG<%Hl2?mTu(CS=`0YlMalU+`3?nwuxYMCCozi$ihnLPlH1%NP--OsdF(4zFd zzaM47A-m68C|ePwp`igv>*vx^D`VrZ4@b+G491**CX2Aj$*lFfey;$-$kzjGKbSGr z$Lzr13V73Jg3@d8s_^-_%GCF>RX!WV?fr=Z{a#KmbKSGE$Wk3Z_fx(|UD@`~U|J;8 zs(6iq^Vt@Z4g2I&td2UnGS5&@P;y%B@PVKhI8E7I zYGB$w;Do>r&m90u!lF{#**}zMMmZS7qFq})`+|ha94;G1Ll%_BtBS%U_~(B+s6uX# z^W^2xIUm>7aR4}UbgTvrIpCE)T@fubTmK9Y^Nv4@%hlRiT&_4G@Q9zTNwPsO^7M&_ zi6cpQBXP7~!LoXt(=QC{*=Gwi%?Mz>M1`i9y=adSk?rg4Ew`+#s;mSOD!>8bXgzos zZdla_I5_dKX<18;dJ;j|?Fgj<{oE@w`FRe^3=C4rKqD{(=Z%0>C+`QHIbQbudw@}Z zTo3<1bo24LUa+{+_o)}~@g6Rst^#xYOh(RV1@J_y6(bEIDL|s0XIN#>~w8UB4wO zGjm8Cp8L@E-4itK;XGVhao{p*26#1N1<;_N1P-z#DWhoMT807x=D?G^wA-?b_4RdS z;=wn*Jf9L0I>R=B8O@d`78;2BXF;)_5fVaQMIk7x{f9;D$}1~fPig+R&ISi@wVE{9 zVgMd;Xs<`6k$b8Ee{(mI-GYmE5s4|_34LpOJOs$;sXR%Cb0{CA+IOs#w!W&ime1vI z4Ma)q!PF$2JiBmzfi?!H@lp)xWu^!&ImcqDQBOiX}GwCD`Q9;}c$;!{}(JYqhU-e4qr zO@(p>pL3SG@d+nGNcJnPEn;kma=w(+LLD|jKj<<%0M~E*s{P3KvfB+jOlm4JEi{O% zRWI4VfdT@7taN_zNl*udeY;NCWY!8U_O94?>bH9`>PV=o)1^>|jJMyvgah2G)9^oS z=J`Og=e7A%aScAc32^TQ#)>}1=jX#xNIO2jeEfYAdr}ZRUSCD>(`0r76^)*f5Z&W) zzs2pWHZtQ1=|o$=n9w$sbH82)e_^{Hd}!!xAda~dy!LQ* ze*~+yPaqoB)~s}st5~gfvvy*i!1|cbj2Eky*gIGo8Ns$;MtlHXgSojmTR3Rgvw^&_ zvY2zbG(hhJg|$WosC0!60uQ&4*Ufph&x0W>>r5|33d272TK+c!RyfqvK!;b9#<-}O zuK=6m=i~PwhC&zv6Mj=?s)FR`_5bV~sipK@jn;D+btlBrjfj-!HxYLt>uVDVc_MWR z{M}6=qSVUgq+yZ7T<)6(uADx}`Z?Z!Y$R2J%3wC^o9wyibDb zNGAVIx(6Scq`x7CwllgJ7!3dD{;lXE4rt*ycfo{9N(!OFRKd7|ghiD!<`pOxb`qtz zdIfCRI1)q8h=~nNO}o^Sw@0$8W=VYj3G={$&<&cf_eMrk`?GIdLc0M@0yZM}uRk1kWQ;{#4*arS@Y)e$`FRin)^`LPAR8jZkT35u$jxZSh zGBC)gsCe}#g`5!q;O?3T@Cc}=sWEFu(mze%$~)p}-D*t@S6J}P6M@TM_D*uYIs{Gv z!xSWdcO4@bq$L&z1;cn7_z0pGCN-Wu#g6|b9*OG| zbY1_#AwVvBTJBumy1^c;?~LWg?sWvC2fXs5lM@kX1$pjd3fPvQytMyhD+Tv;qM zEto*c(6qpzt(3U9O3>-{);8wR86{!Wd+u3=juDHtOsBJh?mxOD4dlv#88;Ak>Qzg>% z%Ya;CVr1mw=ePThsQ3H=Y`^(AIlhlGH5POvBzs=B7|y$D^Dh)Xe3(ZG}$~I-B&O?`0@I*>lrQB>4;(mVwEXeb7WA8 z!GHvwS9)ArTDJa>{lA-rl&A1Se!fiK1|8k$Qdv_onMv`~6KP3R3e3Clv9dO+QI@@5 zSZv_7wp2Te?&|6q$(DAgNd#sSK)Qa{0&`FrO0hlN1+seX?(UbD&NJ3CO0U}&1N^^t zG!yYVb6ycCZ)(yROo1Ha;i2z#b(oo-9{@aKFks9)z~4VVKc9qK4UC`U6vnbLFo0px zrSXD@x1t@BZl^Rr=pR{r1TBgUz$hDQySx4k7+bNx z1sL|)NT{u`(NkF1$K!UZj@%Ok&`5q4yCO7u zOT)w2$EPPInt+!rNqZm(LuMP0dKn50&a4pXefS6kDXE*`Opl_Xk6_Y^+l-kzPn1MG4^lZvh2t-{JoQ%6f zYMAcH;EP}GtP;Z|!v4nvL@%zd9GxOLDzBZ20eyp z#?Qrs6wb28sT|w$)pnwpOAS{dT3W;~VD=ZLELS#JVSM}|hLrc@5rgtY(CyQHUM40~ z3Ma>E-~|gojTs2&H8GLj+{6Q+ZkH|K^Wa~v50P+pN0`5F3m63*?rBk*@!J+}oZZx< zq%USDN=Kkvh(pZXT%qgWNK)A=4DZ!g@bvff0arJ_-5RGQ(ucSLpOsca@eZkDA=?vH z{Yzj>v-)A3$)m@jqoAd&UHft3223RtegIA#Fb2E?SlnhwD-k5;{iP-* z>(5}|f{LS%2jGVWuUqT-APqIO!2bJ7D=OJLVCTrN9UXhPM^v7+qoaV>Zmf3rlwdyt znz`8G#RYonfwHpP=YTvZs=9io6{BbWCKcuB*-B#%d;9Pz2id!pj}!RkiyFnEppR}c z8ImeAcFY7i%I#!Pm5y6nZUWYN4ASrOtL27tuByx99efH3Os8Ox-fC0=f!ti%(VZQF z?O|QqA)4q2Gr$?-`86g4^tS6q;9r6X4gll9uvJnF>{zqY9!97{?!d9$o3A>X^m;>K z_LuuXV74(cgVf%^VRfav)m~P`Q(4BF?Be1g_6JZ?BO~R^RJ^=&Kgelo%f5b%t@(LD zLZap~VS&zk;qZsp*v&f28Ng}?d9uwIoScLyD6p(9fb5V=cKvwp!w3i$HMXlNYF_~B z*;W+y>62*Fr?}#gbiu+szzvqB2wl5hKU>ln8) z{I=$w9#`bMf~bK(6(9Oggt%OvLr@jW*oRVH!9U1I)QXPj0aHX(ZajbwdeCPVXSU7I4j?q#+Wjh^{d#=aJYMw` zF@lYSC5qA7f+^I%$Y`-xUDmSNV%wht6PqzStcnRQzJxk3SjzU_tvi9Qvfm{3_UMa) z2bkOP7TAoGaxGb5kuJcTx@ds~;N+$$MMbB_u9rb7hRaL#=n9{bLrhFWD+nZn6?54d z{H@doFcuTNYlOEqJ}c9_ue`ReE@fnp;YDi{$q&kvuL}1VZ;JPesIb|}m}Ha`6_4M@ zfC12*`%*f%ZJ1@ljb1}69i6VU9l^wCLaq>)4URCI?ZMQd(o%FqDh`f@@?#b{&ri7v zam;1(oyvz!fy@VE9kAR$ghFBe0&=#E@;;E?3ciQBvb?)3iXQXT>g5JrfUV6<2Y*ew zpI|l&BMTo5DM73V`toCUG#UE(!D`3LlvhAW1&hjvC#|Zgde{5tas<&)=(KY>P`cEf zK?x3ynsE+5KnJ5H&z?O4dHUkwk&FbEN8CQk@)X5d|rN^<;<9tOB;SGg01NDlEonEd)i@g^vLF4qJRad{&!pXT)J zOqPsz6X8eMn^$`%8X8~zI`{s75IumX69rCz-81QS7w+dbpzDJ@FfN##2;4g4v$4qP*Tv`5Zms6gh(#9FyKT4 zX@iE6nlb4)%z{p${S(a2_;Q^c7;Sp$KvakM#j&%HS4aWS{|Rb>b!hwf6&1>A2`i`S zT5-=MsiN)6s3U{H^uj{37ac3>!(N%RTAGZcR^_EC$AEUN)tf{02ucBZ*WcU~|Wr7E!&RO6WQ@NSHBou45Lb8({z@Mn`(O zpKg47^=T{s^=XY!k2MF!1Q@XCA3{6lRcnfr``C1Se}!{-xaf0T3H*AQbypgEcns37 zfrCdH<67?2zH%Wh^7{>Q(x#p?pjs$Vq=Cq}QPtd>m4e%E-gm{j93z*wZAOpkSp@9v z?d5*PQ^o27Dym`lxQ#&;7tj-&Rp++N0iohz|BoC>Z*7+GMIMvoN5Mo`#3PtJdoU&^ zM16S&M%Y1NaQ+>qS%k~XG6arTc4lS=vc3jbpb*7hjrEH_zyl+Cw%U4)J7Jzlf*N3s z90<}n2s$qpbakTQ($jw!^?V0Bc$h+EyOFi^)}~WX>E<6UeBYmbD)jYVMd;7?TlfD# z*?Y(J+_&-HmG;sgl(Zx?X=rPQv?y(D4Mj_|wf7{2Xo-?0+Pf(2C=H=fR4QdOwC-0Y z=XG7b-+ljcpO5QtUDrP+_5FT6@Aq-Mj@RpXG(9-7-xk^ek528R4JOo&-H>{Zga*OG zP4QO!+RFF757lI?iH61`3e@(rM`?yw-f?hjZ`$|x{^Q4opZFu?vA(`^{B%HK29n*A zW{V38pMqp+V9}2byB3vi(ISxYetE&Ns=A=AbL4S`TUy?L&ee>YxqG>ZZwFoY`D>>Y zLjZkNa|5^F$%UIp zO-ILB*xE7G&-nN_C#PYjqFu(@8jl;fPlla-P8R5kkHKF0z;ClAi(%%?qy8EnvRnMC znFtY9DTYKwQt|Qf;$mG+E2-&ChqW*Ge&0M@D=T z;(gnzS4=y1#_kcuFTX$bzaPAuTTF=W`tP#x_0^EFgan3h>Y>eD0@o0%9vB*e6wxJ7F@tQU|KuJ+oV% z)}?Nm-+ufwKg$%Nj+mX#Vo|8xj+8!K7QcWW1Fs<6EJrOIgC(*=YMP2_T_+>n1;N(Jo=YavynwL zb@jlG##sJWuRJ=|f*Tq#QvL2PeJwct^tqhU$&)9QvyO>fGOnilc|UD9&St^#!ei#A zw-}k3@Wmu1VO!<;bazv1qA8`2FOiH zjMeKz*gXSw?ihd3d{b#E<+$HT6_q>uR9b;@JO}pgPis0=J-s2zZ4hB^+}w4YS(w?L zV`^#-3Nhdn@^0Nar`3H$CqCzF?Uyi3nt$C-O*SVxm}!CzLLUZDL0GaxB12$af`ul< zDf(?(92qzFH)b&%d(1OoEmQTj{||dgR&DG5s&qV&)V|o$-@i)zLG-WJ1&3EyMT5x#h34|Z|rcnR$_x|(KEe|v`^DM8B?AW>UDuT5bmXVN> zm>@=}clNBS>(}h8tnfIf$LA}?Susn%8Bp!%v3t)RP9b)7T=z@gtxaugc+}KfU!C>( z@mU=Yf==(#<>e-{M3~r$IU1r3M~8`di0CDU$VG{`3F zUB@>cASyIBtei|fH)n!RhRzkPdejdfUEuH)mn^Xz(8@WLW8RDmBkK1euD!%a70uLG zx4Cn3E8Bdzm7X3e<~Vc|9_KYV)0!E}%c(U1l7!3gk8Oi znmos}wk9FL;{178RXT=$fnfOMn^Y$-7KP#C`*)XtkgM#xyu5;fv9oxELJN0Ampi`e zgb?tQo(vz2Z&z{Y-m|9{ zFPNL($8e2Q5GLW~moKYr?7h7Y<@|Pt3kW~?DJZBZE>6qKtFo%93V9*(q==B?h)fjV zW5z?YS3WGuUPVzw<(z{}_ngJ=Tz}85^@GncuI8PO;kajIG%Z4zv~tH*WOx^yI|%9{zj8o;!DoD{M*S zH3!9>JqF`P=_UdU2@B*;J>IwP^nZW%^!)sDVp_^sZkcydCyP|hQ5NA)=~y{(Mc9^d6cZae$o$h$Oa-(|`Wc zloX|;qNuH1^h_kr>SP$cTIOFtt4f7aUnv5z9lJCBwzH<}qLyrY#$^YkrBiYxp5*1B zS^w7py!8iZKg!;d$zd!P^!&=sw^2Lq8WOA0>Ds{I0p}MEH{7`991sO#Vq#zxz!kCO zP_rA^Cf~aQuM)cMYR++-5Z^wmS58JfdBQg*I_w6}*56++OfbRI`>Pf;zBzaIvC~2I zfuSRtmd!CPqV;hcit)L3PDL-<>KJM++y3*#3SE_3BXD2})%^^G7;-RJKMihmq_V~0 zn2F*6wRsqL@199DT2s7S3Yfmb-kDtPwEp|bMt;+KtBV)k>7GDt3m=pLJI`Wg;`rMw z^)0MIS*hvl$)QH#g+WDOLAq3yqeqX<2IDgk!Z9TzM3>Rh)%6Xb-SY}`swO7Y`0?Rs zaJ_o9zq@+`0n22}2ZdbgKYlzeEPP}8<=$-V{!IW##{PbX3N2sEM2N}AzD`bx*u4%~ zjUy%{6?GWs{!k;K+RKU|%W$w63(+gRu-MoxnDb&O6S_DJ3D{OuP`h09wlR>(|?o1RG7S zLEC48q_KW3&#)+-3Q3fQ%3*(hp@rU+#j)GMHmWguk!W7P0gGXc3tJSv0GFmOI6UUa zIdD}4w$MV1uWHW++iS1_<9aK0n@Z@*-Q+uX(8<-6<%os2GiK4SbNue6erCC;K7>@~VV{L`{t^ z`i~QY{(Pw|?@(|eZ+lu@y%yvhQ@{0Jp==ibZ*yvD&cNJxQ2|+x;5PalJBZ6kK8|9X z+#JkKn=g37Xr2|5Vu^t4)u7POA8!OkrkX-8+S|L&4expW9{<1~`d4EQd(8Es&l>9U zydT(q!^4s|E167O`J_R2h;SZyHg)tU%{=S?1%7Kql%pt*?@L~hJaQzSvC5U6VTao+ zXeSQ4c9TIu7%02))g9lewUrg=_I-O1IxW3ii;sv4TG%5TgiVmKUxG|$&K<>atOT_U zGy@c{%3Ca*`JHNc55`%K!XC|1@(GU(JSVtt=DvLCFTK3^;DHsB#J&wN%X! zTwxU|zy%grHlrqjL4!uo6@ffVX)Oh|*>8NS-Hf@DnvmcEPa$Az@oj%y_d0hgWHLtE zZ$HIT2*2BOZ_XPeX{LS{7$`L7@(x0D5(P`ivuD@uvmqPf5s0yqte~N|H#adE%^(vc)?L4Sjh+9dgqPOaTf`6gwzHY6r z4{|C{R46>lzj}C>D9GA${LZ=ZRSZLkncwJy*h?!_gQ8yiAfwdn11l3L{FH1a?`poF+Tn` zy%UhlF%9@gcYwNZ)=0pq5S#>nU$#L%aX`V1gOQALNa0Cgg; ze_Z~=i7=?lXB028&?_h^Vt!&;dPycS)_uz|H|fmJ*AAz%vKV zi6aBIL31jmr=h3EG40-NJwp73&V4-0@Z?#Jk3Kx}_Xpn1#5ocY5`Iu9+hl4BG7I!m zTCY=byxt*AWR{M>;g3;6L&NM`42qjKpB3`{xuF*Pvl~?!K?QPkbp`9CE%e~QgLQ(} zlWo{ma(a5MHZOgGFB(x!?&Gxt8w$XSEgU&GX$X}{(tQRzfK_}xfQbMn+YEUG2?2Y6DB$I`f7kISw6@rD0lysxg5;&CHn-=VIq&ZCjSet>>}30G&mshL?f#=F&3Rb;e#QB~G; z^~5D7*XgRjFoWYX2_Ei@jDXmU4Z`;8?9;^A()$z&?(-G3QX;0h%UgDJu;kizA!LwbD*`ere%g>t@{5;$PWIsDZ!A}H-z(q4 z;k=i2sRz~qTpyy>=FNbxh>45B8?d^vQdCb>HPuM5>j5Tn+`_wHC2XYT`rFJci}&hg zav(IpJ~9oVg=2KN4rd+QorYCC*B49g-i7-7ZSD70?d1U&2KEU1dV}-{epw;;rNCKphJWkun;TK!6SUtEg&u$7)-9$xcbJQdU80#O+_W)}29DI$#wK!Z z5G{(%kmEp>nvKu8N~S6mHC0O<5Q;t1KdC2Xk`j~z5q#B(w;-{+ec_0-|o zpxtvcivKVNsh*zR%!l+qGZoUG!a&}jvw4!6+g1asd>#J$N9uPwDZFgKwF?ZXoSYlb z77sT(<^WAb1JP^bR0eQ2vV&V$~Km66zmmZ+)#Ba2}z$ z`u#@pczI=IQUr$eb$k>9?qu8dMMXtfjl!9q-G^sD@5~wIBNoJdZ1w#{)t*;QoFK0l zUj6m8`H?FOc!1EN4{o5r@J4Ew^58VivB7}>FyQtu+)?&g7<+*Mou!2Z9ofSV3EXNU zm(Y24+?QcdHLi5$j|_Q_0}Qq^AQm=&hnmChnPlpV$y^Yt1gygwv(yj10U~W?HV<~^ z`pTD7_>}MfeX{3v^47lsftt}Ijv@b`1If8e+X%Wp&t!&}mR@uS0Est!DhUHN0ZdBK zYJ1UCHQs1qB87i{o((^H1L-x|QF*U%q^qp}8;k zDW*=io!NQH`Vsaq*TlFJBf#DH#FzH$4XA#*fOFD&{A?o!lm-1_taf;~5>DTB6y3yQ?I3`>>V8-c%_%5xg# zTvJ)P{ZDR`aKax}zO-#R+v}?B-dG%XQ(wPcepkY}nJJvYB`ejP^-+(UC#7h+$)v-} z8Yd1GF^9PLcxQL_3l;P%30=4OL_?3XbjT$t|5op^a$#E!u@At)#a6(B53Me>yJ z*My4IV5aU>j@kUg@eTOQgGWY2($dmENclPShHO;r79Rx##i3&cz}4Xta1NNT9BMc~ zPEPK0^=haQ;aLJ&&K7k;|kHj{dA`|yuf zfTE*8leiK=*AyNZ$$RLKzr%&mc54Epfa(q<-Q_!eJ2*O;hG%bb9fe-1f91=dB@PRrWg_8R)MPjHZUG04X8gKuo>Bd2 zF`w^!_BA8pKE!Cdix-_ug+woiKzpO!bM$5|1v<36yxOoBAK-LlW%b0zB8er-%i~gg ze^WGkN1NynBu)IqfFsNjEEUf}|6AwyeRQG`m!jD;sPUFCCcS2Ziq?Dmx2WfcGMW5{ z(n#L;_&B1{3z6j!281_{y&oVoN@uEGzh?i#dE~8g0>>RgXXhh4-Ui`}8i@_fInzTa z-@4G{nB5$ySpEI`;iE@CM$6t7?$olFo0}7vCE6-Nyl>$SQhatX{bIj{nAlrHJ!X1e zC3c8xmM0`8!jIGw&e*JHS1>+)6OMeRh6B$kDhz*oo>V^U7ji{p7ce0*jzjzB82x$g z!n9wUr3fo*Q!@;laNJlFoM)iv;U}RS2iV8^h^z;L$4YTmOMIi!-PSSivh;Lx+}zzC z*C%K6M)kz;u3r6D3ovtZ?4a0{JZ?`^M$IQ5u&jX4)$D$&7ZE#AgS9)?Z6b2MNnXzd zFzYQE*Gc4@AP(rQ${oPbmwsDf^g%MtS%e+V>grAext<)`yAWh?QC~?(snBb0{wdv< zIs<+EYaSk>OM!`UPEJCbI~i;;_lc+T#wRDYged3`v+%nhNwMfcw&=65R(|7b-@ddy zg8n3$pLM@p(62a&%@VOx5v*cjU{dD+XZtEjiZT&QKOP?(!kJ=5-51WSy;akU{a}~; zt&E|#sK|!N>&OoJeTzJ)D&b`1PGa7XVG)5^7uh&2T1W550COwTy`ppkySdQ|xI*QLkYKTo{5B~E(7sB8Kh2|LAp3rjWRJKT+oQV1x@$q{VoMl$hh zq=*wfB7I3nnfKbl?)8I{s55bOU2k^7p9*sC{OHRl5MXby6}iAzBqkZiNLx_1)9SMV zs;uKpUmqR1&J8(yZ#2Of_2@qI$g%gYPcVffAd>7v78l|Q{y*-3N$ARix&>X`8G zi^Bum9UVI#@9dy(<73&gC&N5DBSYG4G7bGqx*(a)Gghe*8~#-2_(;Qu6m@65DRI0= zEbF~H#OK?4D*toO3WXql>ub%w{kVDfjFjI-LZlim4NY`Q%cJ`GV`*IgPUSs0Ra?rk zGx&41;E>wGhw5HGomB78treVq@$Az32*&AYI2J0ed~KlkpymVg`<+|2K9oN-GN59Y zmL5Zh0Wu`4OWtOK)LaV#17*Fvy)ak-XuCr_-Ph+36_u+-w~19xn*R*yH79VKqChm_ zWW93bIjSR=`S;iC_VHdzzYY6841QEpk#d)`X(7(D7b6P6>u(X%(UX5K5;OF9??yAm zEqZf+`Qsx<(m}pJp4ERF?mHVhyBG#W^>l~dP=#N-2)JM_Czlo;UQ}9YX6UwmZp6&A zN5ER%dHq-aB5cv$6{TA*?3DJ~$GZEPN!j)4d%0h08E;g3>A8S}`{2QjbH@gxofG!z zFzin_h@rZ2l08pYaoVb(VZ}Mkl?9}%6m@Gne?{a<$q^`KV7k6n)5z_VpixN_f8@xw zZ^tixkhZb0LFCSV8yT`6ztE!(^H?CxgbExrx?;ZX@@ObHFfIX!rV}`q$*wqFyhuew zus%Jhf%66R-EfKH-PF|7@Nf#Z4M-=(S(Xx#l3O^Kt_4uzN9fAZ*7Ob@lukr<4W8z9 z0H=_uKXvvUNa50veKv7okNV z8{QT{v_>be&DTuJvCw}rmR0KIKk+JU)q(%hEAx!aj7IK8Xo&1ITomK$TaxfI5sv%N z3Efvq%p|H%9~KxqrGLF^Xv+ieNQ2@-V{p}Rm+_z?XUk)yv^6z^Ksw%tkAJB;DJA^$ z;rH*9lfEBoH`&){v&XiP#nkc9b*R8g1TgRWC%2!6svdJYQ8y%KW?{iOE)qHaSv@~B zHSH7Gy=kacrOzEhwgF*IJ;n438BdU+ZbuPkDP0lxgYOM>VKPyZ3 zgPS{`=O=7|XSCu}7ez!xOD?_FwmWhsd1N>%z6`E{qaYZBxr`7`8yZWb4IribU$>Iy z&x0w6vu_@4<_nW&LI5JO4G^=l2&m#v-_4eB=;mG7R0S=qzrHJfN8q^qL9;pabUz<) z4$$^+fRFuz&F6*HFSu1egmEN@viNX80@w5c4_@hBfSjl4A z%En2qt);ks5BtxY-7=nTR#yAPE_9|K0jf#f3xoWqyco=~lc%MmDj{xJZrc=|MX}h! zD&@}pIckrvxc}MRRQJ}<+uHVkLg>3TK{4`8lEOc(v#m{0Q}*k=(3>)ch@BDk85AN* z0|~sE?8%eekcjdp^Rjys4xegz{TeKG9`wN1h9Wxc!xPwq%m^r-Vm`HOH_EuFO#ber z<{>sybTT5_4hDgS^we=T@xeV};at+YN+$U%x73jvBzJ=f9Z5(?9$aUYNIx5rs=0%G z$v5pxk=-uuzg;w_z1L_?Y-XxgUY}lQX7ejdP@-`A`j*C;=;EiAcrHxHu3sHSw_@HH zlE~WZe|7+6Hc|y>6`fT_EQ*|Tq<6qpaCIbn#2Db@#(y5zg?&$q%R@e%FSY_Ar1tBu zA`?8<#RjB?&kAwC8=OAJ*ZDbZ8Dc}Vy4&@(7cM_?d|TI33VAIi0Gc71(cX@j><-2Ca{nn!*6@J{R9 z2U>8B7`g8hbK5xX!D*ZM`O7Zj@-ZogWV2_Vkw;co>>h&57);;zaE#$>ln_yzY!s=C z%zK=#?d_*ewi2?gg61pVuMMinj%8@S<~29@iH+qih!lz_)2GVvBqvwpJ%657@4Ym) zjtm>joQZP*H-c$`HkFMwCNAvcev_M|8cI7WKDxusTaBeZSLc29&#h;%haic3XYQE6 zJMsWUnw$=mZJr4T1&N#YUxE-(=zrhJ*6e5W)6zGvV6e9*e;yC&B$9eV|D;>4zjA~QaC&*-vojftBxd&&CYh54u!%pLl^MK2)AkS6hXTFtX}O0 zHtGAVCPliKdw5bcDKsLhz-L-B3^VhkHZYDLi3}80bUj4--e9Uh* z9#gJe1DB!X0x|Ut*}Zy{6I}vIG#Zuc9EB1C32X%UWZv1(n+9kKEg|)ema$1+n@78_ ze9BF*Hv=+9`uX${)R_%oD?hr9V~vFB%sYTp%eEKtbhB*rqa!0`!&HBUM}5|dGi+@> zS2$&4wry-wT-kJw9?=s&bO?UyAqIy74kAU@SYsT;7WaC|8~*U(pgVe(v7}O;+;<(0 z(NnBc&TH!h@UV^t$;ddAIPBYdgrEO?fB$hlK28`?)zog}5=d2E;NVDaODcF)R21Mo z@#X$VtcC6Jx9{g+Qd+aSb=O>^rOo6kYe&fzGQuj3ONH9{3|mJ60)e=L!Z|H2g)Lh= zu}uqFcF8t1J4`6#i0|4ba*Cyx($%7G5;JnRZOKYLauLk=i7U)x+W`H z7ACDr=X&0X9zAO1wTF45pgGs!--jVBD~q0qDJN&;yw8KCFX{>k#d(giCXry=?)^^T zu4ravh9U8?laY~;Tdd;2VtK-eV%we!=mrotHBmQR&54fg&;+gx#0|}ZBOcwXGH1w3 zxHvhJKM@=ozfb383yovc`}W)5)%p16m!h|MS))*Dj%91k5w-8N#ia>#o>$KVVj*$T zD1d($w}d9SZLF=J!aG$a*!~Igq{2NSW`+xbN%apxLmS>wuAoIdL2gfCf5_rJ zNHiR@Y8MesPe|JRkM_wBU<&lD<4?6n(u``usq?h7{GLnsLky$?RF!D#Zmv3ByM~d( zdDK1tZ#h|wzrp`=B|2o3n(7q6CZG1;0VYYrVJnb2@uOTFF6+q%V5%0JKQthA{GE0A zo|u@=hdUoTXvlDY$hBLKq4J4ZG z0&zdB+tNL!^e*oTi$_J3=7GdERe`^{o%W@3@jFa6zIkZ9inom+9e-UX2ZqD$81_~! z$=`|b+L;vxEucGvI7EJ9@S7hY-0*{7f4O#j5xGS>TU)vCaChT=1_0QdB(cCEn4jpl z^=L!zWIzZ($nFiOFzLR}pFaSG11B;33%TsW8IWnf@{y%2ZTi)+1CC|jRql$wt2sPZwY zs}VhR?8og_5a%uKWcYragn75fDGiNRot>jW8pKrI%k%L` z{njEv4h~Q7S)9sSHM1XT`gpuh36H6%uCOtEySKSw0*EkL_Dc~F^pCnEr;F-e(&`w} z+Imb+P8RCEUO5X&JQ$D?3QoiD8@{m7_5R)Wjzoj(jVb!F6YA>L!h$#N>Y`?PvQ~uF zj(ayI+eb_m}o;zRo zZh-d$0Z-@LABFsJ=;U4+RK3owt5=zXxVf{i0|j552f4zU)4P8RWO_r(&x(tG&QF#A zb7L?_>O?3lJ3tetU$b?=PKA8Q%w zd(6%X<$hLxr|#2n=huk`9gF@6WmM73z-P`jv$g3E>w>ik0q; zB@ToBA5;wtBsL}@af39l8C3kdDlc$W=wB`1=Nk;FKKC04?pm0t{UTtS5WVNeuMnEM zd3pS;9fw=pR~JoweCAjBu~QE?*7R?F-KTQ&xIdB~&^mp(DnDQBF%UK>QK$3HTVG#x z0>!pr6TaoUad8e-z1gP(6m4yT5)*UA7Ys@ZCugqjd_iw|doY)=Tf^b7Dn>FtC$R;j z&_KAJmrD+}6`7;5QK%822;n&T@XU^};^8{}Sz8;3*pATnN-xpF;!gPL z^P$rk8W;SpaY{)_y6=3At1uykdf)>L0TVXE@Ht6ZBt#q`xss$Sp>@t zD#UtU!!johp1njrwq`3tVMvh~eP9p}xA#I{3?`E{5q^XqF53RhV;oTGZXfqUjbga6 z)4>JyP#4p5tHK6)D4;GE8KF@rz31c{%KU+|F+RUpEbu+g1JNWVit5e~l;m_cnF`rh6|I{A}Qcl$bpwtG%tF%@)(!@PRg zs`~|1j!aK1&b2+^9i%sX-L|am3 zNEa4`j49Vgbz_cICR(%dnI-uWWY)Uv+lTfPj=~;}eM8v#_P1I#@9ydO{FvPEbH)v> z6Xd?byk`<^+3ws`8&V~&@6t^vapBaIVK)6zY`)|=QHD!ZD z>CHZITZ6}98UE}aQZ+?0ID~|@K&V=(lMjNOwd|F)@pudRU@o9_x3jYocIH*w-2-8y zi+!aZeU0?>!yJztE5!pL_t-g==#~FE{q!GxoGJU(|HA$@W_eaMIz*7B z;V88i{>dK!D zqG5t`Tk9gha9b$i$V|UPC{Jt9dBE+u))zq~eDZ*1-6Mew~K$+VVVy=}0uvv>Er*vtIewBPTTYj0zqi2j>ea zc(W_lR9Wx2r_=r+$Ssg;ErJyK=To&3@!q#Z2fWHVBGvTr<@Zs{_}bkdd|KvAM9Ln- zi?jIShou37iKe`wVkXQvEeVyCt6wB%6=s9}!7+|ejr&A}fE7nVVv>5q^3?z41lf|Y zEiH6=BPs1nvyU5SSQw!Rf{ZX1snk9NNI-MUd;D+=G^bCVd|x|_4R zuPBr^;;CRvv{4ZC^eVK{`qImq|b(Qg-+Vz$M#SS zU%1V5q}GBV6>jl%?|Pa}hb?lQ5z*@1eZfsys%OuuJZzOES@6)(*GJwhHov8?@Wi%l zGNPh8W0nJob{xGjts_m0rFHco5^^hK4$n`3!ZWviy`cX5$Lj_0fF}@{ zTZv0bZfWWLF%M1taV2HE{SJ%5@!H%qRZ-Et5=WEn3Tz#;A5UKEfcUb7hHFjF8Vemo|%~@hk4=({Qdhs*6`a7zAi#G z)O#6Q9ic_#Wn>^26dDj9&Ev4?^*>hI2t_$67<*AWH@$gdq^9;%{q9>872Wgq_$4Iv ztTf*SzVH6_)0$o4SLZl2)J;tC;H3wBZe`W?hJ@-5WFg1y^$#Il8a_3rfa4pDLFZrMkR4uqhG}`lAH{h;GZ- zI5~-)kd1+XnJqOeGN9MVK6UY@fw;iiV5<9TMOth}g`ak3p1Y)hb#$Yr;ZwE(xyRi6 ze93*-lkpy8J$$I5TAL#6!KwE~Cq4FvjEpcZ@4L5e�+wvr!XhOrp-ODK1WU_)v0s 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

|<0M;za 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�ro`qUbV(6O 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 an4K+!nOVOiQ^l0Lj76 diff --git a/web/src/core/classModel.ts b/web/src/core/classModel.ts deleted file mode 100644 index 5043dcc3..00000000 --- a/web/src/core/classModel.ts +++ /dev/null @@ -1,690 +0,0 @@ -/** - * VisuObject: Klassen aus Java-Code für das Klassendiagramm lesen und das Diagramm wieder in Java schreiben. - * Kein vollständiger Java-Parser: nur der Aufbau (Klassen, Attribute, Methoden-Köpfe), Methodenrümpfe werden übersprungen. - * Jeder Teil kennt seine Stelle im Code, damit eine Änderung im Diagramm nur diese Stelle neu schreibt. - */ - -export type Visibility = '+' | '-' | '#' | '~' - -export interface UmlParam { - name: string - type: string -} - -export interface UmlMember { - kind: 'field' | 'method' | 'constructor' - name: string - /** Typ des Attributs bzw. Ergebnistyp der Methode (leer beim Konstruktor). */ - type: string - params: UmlParam[] - visibility: Visibility - isStatic: boolean - isAbstract: boolean - /** Ganze Deklaration im Code, mit Rumpf bzw. `;`. */ - from: number - to: number - /** Kopf: bei Attributen bis zum Namen (ohne `= …;`), bei Methoden bis zur `)`. */ - headerFrom: number - headerTo: number - /** Teil einer Zeile wie `int a, b;`: dann wird beim Ändern nur der Name ersetzt. */ - shared: boolean - nameFrom: number - nameTo: number -} - -export interface UmlClass { - name: string - kind: 'class' | 'interface' - isAbstract: boolean - superclass?: string - interfaces: string[] - members: UmlMember[] - from: number - to: number - /** Kopf bis vor `{`. */ - headerFrom: number - headerTo: number - nameFrom: number - nameTo: number - /** Stelle der schließenden `}`. */ - bodyEnd: number -} - -export interface UmlRelation { - kind: 'extends' | 'implements' | 'association' - from: string - to: string - /** Bei Assoziationen: Name des Attributs und Multiplizität am Ziel. */ - role?: string - multiplicity?: string -} - -interface Token { - text: string - from: number - to: number - /** Bezeichner oder Schlüsselwort. */ - word: boolean -} - -/** Zerlegt den Code in Wörter und Zeichen; Kommentare, Zeichenketten und Zeichen fallen weg (als ein Token "…"). */ -export function tokenize(source: string): Token[] { - const tokens: Token[] = [] - let i = 0 - while (i < source.length) { - const c = source[i] - if (/\s/.test(c)) { - i++ - } else if (source.startsWith('//', i)) { - const end = source.indexOf('\n', i) - i = end < 0 ? source.length : end - } else if (source.startsWith('/*', i)) { - const end = source.indexOf('*/', i + 2) - i = end < 0 ? source.length : end + 2 - } else if (c === '"' || c === "'") { - const start = i++ - while (i < source.length && source[i] !== c && source[i] !== '\n') i += source[i] === '\\' ? 2 : 1 - i++ - tokens.push({ text: '"…"', from: start, to: Math.min(i, source.length), word: false }) - } else if (/[\p{L}_$]/u.test(c)) { - const start = i - while (i < source.length && /[\p{L}\p{N}_$]/u.test(source[i])) i++ - tokens.push({ text: source.slice(start, i), from: start, to: i, word: true }) - } else if (/\d/.test(c)) { - const start = i - while (i < source.length && /[\w.]/.test(source[i])) i++ - tokens.push({ text: source.slice(start, i), from: start, to: i, word: false }) - } else { - tokens.push({ text: c, from: i, to: i + 1, word: false }) - i++ - } - } - return tokens -} - -const modifierWords = new Set(['public', 'private', 'protected', 'static', 'final', 'abstract', 'synchronized', 'native', 'transient', 'volatile', 'default', 'strictfp', 'sealed']) - -/** Index hinter der passenden schließenden Klammer (`{`/`}`, `(`/`)`, `<`/`>`). */ -function skipBalanced(tokens: Token[], i: number, open: string, close: string): number { - let depth = 0 - for (; i < tokens.length; i++) { - if (tokens[i].text === open) depth++ - else if (tokens[i].text === close && --depth === 0) return i + 1 - } - return tokens.length -} - -/** Typ-Text aus Tokens, ohne Leerzeichen außer nach Kommas: `ArrayList`, `Map`, `int[]`. */ -function typeText(tokens: Token[]): string { - return tokens.map((t) => (t.text === ',' ? ', ' : t.text)).join('') -} - -/** Teilt an Kommas, die nicht in `<>`, `()` oder `[]` stehen. */ -function splitTopLevel(tokens: Token[]): Token[][] { - const parts: Token[][] = [[]] - let depth = 0 - for (const t of tokens) { - if (t.text === '<' || t.text === '(' || t.text === '[' || t.text === '{') depth++ - else if (t.text === '>' || t.text === ')' || t.text === ']' || t.text === '}') depth-- - if (t.text === ',' && depth === 0) parts.push([]) - else parts[parts.length - 1].push(t) - } - return parts.filter((p) => p.length > 0) -} - -/** Lässt Annotationen wie `@Override` oder `@SuppressWarnings("x")` weg. */ -function withoutAnnotations(tokens: Token[]): Token[] { - const out: Token[] = [] - for (let i = 0; i < tokens.length; i++) { - if (tokens[i].text === '@' && tokens[i + 1]?.word && tokens[i + 1].text !== 'interface') { - i++ - if (tokens[i + 1]?.text === '(') i = skipBalanced(tokens, i + 1, '(', ')') - 1 - continue - } - out.push(tokens[i]) - } - return out -} - -function visibilityOf(mods: Set, fallback: Visibility): Visibility { - if (mods.has('public')) return '+' - if (mods.has('private')) return '-' - if (mods.has('protected')) return '#' - return fallback -} - -function parseParams(tokens: Token[]): UmlParam[] { - return splitTopLevel(tokens).map((part) => { - const p = withoutAnnotations(part).filter((t) => t.text !== 'final') - const name = p[p.length - 1] - // `String... namen` bleibt als Typ `String...` - return { name: name?.word ? name.text : '', type: typeText(p.slice(0, -1)) } - }) -} - -/** Liest eine Deklaration im Klassenrumpf (ohne `;` bzw. Rumpf). */ -function parseMember(decl: Token[], className: string, inInterface: boolean, end: number): UmlMember[] { - const tokens = withoutAnnotations(decl) - const mods = new Set() - let i = 0 - while (i < tokens.length && modifierWords.has(tokens[i].text)) mods.add(tokens[i++].text) - // Generische Methode `public void f()`: Typparameter überspringen. - if (tokens[i]?.text === '<') i = skipBalanced(tokens, i, '<', '>') - const rest = tokens.slice(i) - if (rest.length === 0 || decl.length === 0) return [] - const headerFrom = decl[0].from - const paren = rest.findIndex((t) => t.text === '(') - const equals = rest.findIndex((t) => t.text === '=') - const isMethod = paren > 0 && (equals < 0 || paren < equals) - const fallback: Visibility = inInterface ? '+' : '~' - if (isMethod) { - const nameToken = rest[paren - 1] - if (!nameToken.word) return [] - const close = skipBalanced(rest, paren, '(', ')') - const isConstructor = paren === 1 && nameToken.text === className - return [ - { - kind: isConstructor ? 'constructor' : 'method', - name: nameToken.text, - type: isConstructor ? '' : typeText(rest.slice(0, paren - 1)), - params: parseParams(rest.slice(paren + 1, close - 1)), - visibility: visibilityOf(mods, fallback), - isStatic: mods.has('static'), - isAbstract: mods.has('abstract') || (inInterface && !mods.has('default') && !mods.has('static')), - from: headerFrom, - to: end, - headerFrom, - headerTo: rest[close - 1]?.to ?? end, - shared: false, - nameFrom: nameToken.from, - nameTo: nameToken.to, - }, - ] - } - // Attribut(e): Typ, dann ein oder mehrere Namen, jeweils evtl. mit `= …`. - const declarators = splitTopLevel(rest) - const first = declarators[0] - const firstEq = first.findIndex((t) => t.text === '=') - const firstHead = firstEq < 0 ? first : first.slice(0, firstEq) - // Name ist das letzte Wort vor `=` (`int[] zahlen`, `int zahlen[]`). - let nameIndex = firstHead.length - 1 - while (nameIndex > 0 && !firstHead[nameIndex].word) nameIndex-- - if (nameIndex < 1) return [] - const baseType = typeText(firstHead.slice(0, nameIndex)) - const shared = declarators.length > 1 - const members: UmlMember[] = [] - declarators.forEach((d, k) => { - const eq = d.findIndex((t) => t.text === '=') - const head = eq < 0 ? d : d.slice(0, eq) - const nameTok = k === 0 ? firstHead[nameIndex] : head.find((t) => t.word) - if (!nameTok) return - const brackets = head.filter((t) => t.from > nameTok.from && t.text === '[').length - members.push({ - kind: 'field', - name: nameTok.text, - type: baseType + '[]'.repeat(brackets), - params: [], - visibility: visibilityOf(mods, fallback), - isStatic: mods.has('static'), - isAbstract: false, - from: headerFrom, - to: end, - headerFrom, - headerTo: k === 0 ? (head[head.length - 1]?.to ?? nameTok.to) : nameTok.to, - shared, - nameFrom: nameTok.from, - nameTo: nameTok.to, - }) - }) - return members -} - -function parseClassBody(tokens: Token[], start: number, cls: UmlClass): number { - let decl: Token[] = [] - let i = start - while (i < tokens.length) { - const t = tokens[i] - if (t.text === '}') { - cls.bodyEnd = t.from - return i + 1 - } - if (t.text === ';') { - cls.members.push(...parseMember(decl, cls.name, cls.kind === 'interface', t.to)) - decl = [] - i++ - continue - } - if (t.text === '{') { - const hasEquals = decl.some((d) => d.text === '=') - const close = skipBalanced(tokens, i, '{', '}') - if (hasEquals) { - // `int[] a = {1, 2};` oder ein Lambda: weiter bis zum `;`. - decl.push(...tokens.slice(i, close)) - i = close - continue - } - const words = decl.map((d) => d.text) - if (words.includes('class') || words.includes('interface') || words.includes('enum')) { - // Innere Klasse: überspringen (vorerst nicht im Diagramm). - } else if (decl.length > 0) { - cls.members.push(...parseMember(decl, cls.name, cls.kind === 'interface', tokens[close - 1]?.to ?? t.to)) - } - decl = [] - i = close - continue - } - decl.push(t) - i++ - } - cls.bodyEnd = tokens.length > 0 ? tokens[tokens.length - 1].to : 0 - return i -} - -/** Alle Klassen und Interfaces auf oberster Ebene, in der Reihenfolge im Code. */ -export function parseClasses(source: string): UmlClass[] { - const tokens = tokenize(source) - const classes: UmlClass[] = [] - let decl: Token[] = [] - let i = 0 - while (i < tokens.length) { - const t = tokens[i] - if (t.text === ';') { - decl = [] - i++ - continue - } - if (t.text !== '{') { - decl.push(t) - i++ - continue - } - const head = withoutAnnotations(decl) - const k = head.findIndex((d) => d.text === 'class' || d.text === 'interface') - const nameToken = k >= 0 ? head[k + 1] : undefined - if (!nameToken?.word) { - i = skipBalanced(tokens, i, '{', '}') - decl = [] - continue - } - // Kopf beginnt beim ersten Modifizierer (nicht bei `import …`, das schon mit `;` endete). - let s = k - while (s > 0 && (modifierWords.has(head[s - 1].text) || head[s - 1].text === '@')) s-- - const cls: UmlClass = { - name: nameToken.text, - kind: head[k].text === 'interface' ? 'interface' : 'class', - isAbstract: head.slice(s, k).some((d) => d.text === 'abstract'), - interfaces: [], - members: [], - from: decl[decl.indexOf(head[s])]?.from ?? head[s].from, - to: 0, - headerFrom: decl[decl.indexOf(head[s])]?.from ?? head[s].from, - headerTo: head[head.length - 1].to, - nameFrom: nameToken.from, - nameTo: nameToken.to, - bodyEnd: 0, - } - // `extends A` (Interfaces: `extends A, B`) und `implements A, B`, Typparameter weglassen. - let j = k + 2 - if (head[j]?.text === '<') j = skipBalanced(head, j, '<', '>') - let clause = '' - for (; j < head.length; j++) { - const w = head[j] - if (w.text === 'extends' || w.text === 'implements') clause = w.text - else if (w.text === '<') j = skipBalanced(head, j, '<', '>') - 1 - else if (w.word && clause === 'extends' && cls.kind === 'class') cls.superclass ??= w.text - else if (w.word && clause) cls.interfaces.push(w.text) - } - i = parseClassBody(tokens, i + 1, cls) - cls.to = tokens[i - 1]?.to ?? source.length - classes.push(cls) - decl = [] - } - return classes -} - -/** Elementtyp von Behältern: `Hund[]`, `ArrayList`, `List` → `Hund` mit `0..*`. */ -export function associationTarget(type: string): { name: string; many: boolean } { - const array = /^([\p{L}_$][\p{L}\p{N}_$]*)(\[\])+$/u.exec(type) - if (array) return { name: array[1], many: true } - const generic = /^(?:ArrayList|LinkedList|List|Set|HashSet|TreeSet|Collection|Queue|Deque|ArrayDeque|Stack|Vector)<([\p{L}_$][\p{L}\p{N}_$]*)>$/u.exec(type) - if (generic) return { name: generic[1], many: true } - return { name: type, many: false } -} - -/** Pfeile im Klassendiagramm: Vererbung, Realisierung und Assoziationen aus Attributen. */ -export function relations(classes: UmlClass[]): UmlRelation[] { - const names = new Set(classes.map((c) => c.name)) - const out: UmlRelation[] = [] - for (const c of classes) { - if (c.superclass && names.has(c.superclass)) out.push({ kind: 'extends', from: c.name, to: c.superclass }) - for (const i of c.interfaces) if (names.has(i)) out.push({ kind: c.kind === 'interface' ? 'extends' : 'implements', from: c.name, to: i }) - for (const m of c.members) { - if (m.kind !== 'field') continue - const target = associationTarget(m.type) - if (names.has(target.name)) out.push({ kind: 'association', from: c.name, to: target.name, role: m.name, multiplicity: target.many ? '0..*' : '1' }) - } - } - return out -} - -// MARK: - UML-Schreibweise - -/** Zeile im Klassendiagramm: `- name: String`, `+ bellen(laut: int): void`, `+ Hund(name: String)`. */ -export function umlText(m: UmlMember): string { - const params = m.params.map((p) => `${p.name}: ${p.type}`).join(', ') - if (m.kind === 'field') return `${m.visibility} ${m.name}: ${m.type}` - if (m.kind === 'constructor') return `${m.visibility} ${m.name}(${params})` - return `${m.visibility} ${m.name}(${params}): ${m.type}` -} - -export interface UmlLine { - kind: 'field' | 'method' - visibility?: Visibility - name: string - type?: string - params: UmlParam[] - isStatic: boolean -} - -const identifier = /^[\p{L}_$][\p{L}\p{N}_$]*$/u - -/** - * Getippte Zeile in UML-Schreibweise lesen. Erlaubt auch Java-Stil (`String name`, `void bellen()`), - * damit Anfänger nicht scheitern. `static` davor oder unterstrichen geht nicht zu tippen, also: Wort `static`. - */ -export function parseUmlLine(text: string): UmlLine | undefined { - let s = text.trim().replace(/;$/, '').trim() - if (!s) return undefined - let visibility: Visibility | undefined - if (/^[+\-#~]/.test(s)) { - visibility = s[0] as Visibility - s = s.slice(1).trim() - } - let isStatic = false - const words = s.split(/\s+/) - while (['static', 'public', 'private', 'protected'].includes(words[0])) { - const w = words.shift()! - if (w === 'static') isStatic = true - else visibility ??= w === 'public' ? '+' : w === 'private' ? '-' : '#' - } - s = words.join(' ') - const paren = s.indexOf('(') - if (paren >= 0) { - const close = s.lastIndexOf(')') - if (close < paren) return undefined - let name = s.slice(0, paren).trim() - let type = s.slice(close + 1).trim().replace(/^:\s*/, '') || undefined - // Java-Stil `void bellen()` - const javaStyle = /^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(name) - if (javaStyle) { - type ??= javaStyle[1].replace(/\s+/g, '') - name = javaStyle[2] - } - if (!identifier.test(name)) return undefined - const params = s - .slice(paren + 1, close) - .split(',') - .map((p) => p.trim()) - .filter(Boolean) - .map((p) => { - const uml = /^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(p) - if (uml) return { name: uml[1], type: uml[2].replace(/\s+/g, '') } - const java = /^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(p) - return java ? { name: java[2], type: java[1].replace(/\s+/g, '') } : { name: p, type: 'int' } - }) - return { kind: 'method', visibility, name, type: type?.replace(/\s+/g, ''), params, isStatic } - } - const uml = /^([\p{L}_$][\p{L}\p{N}_$]*)\s*(?::\s*(.+))?$/u.exec(s) - if (uml) return { kind: 'field', visibility, name: uml[1], type: uml[2]?.replace(/\s+/g, ''), params: [], isStatic } - const java = /^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(s) - if (java) return { kind: 'field', visibility, name: java[2], type: java[1].replace(/\s+/g, ''), params: [], isStatic } - return undefined -} - -const javaVisibility: Record = { '+': 'public ', '-': 'private ', '#': 'protected ', '~': '' } - -/** Standardwert für `return` im neuen Methodenrumpf, damit der Code gleich übersetzt. */ -function defaultValue(type: string): string { - if (/^(int|long|short|byte)$/.test(type)) return '0' - if (/^(double|float)$/.test(type)) return '0.0' - if (type === 'boolean') return 'false' - if (type === 'char') return "' '" - return 'null' -} - -function javaHeader(line: UmlLine, cls: UmlClass, abstract: boolean): string { - const inInterface = cls.kind === 'interface' - const vis = inInterface ? '' : javaVisibility[line.visibility ?? (line.kind === 'field' ? '-' : '+')] - const stat = line.isStatic ? 'static ' : '' - if (line.kind === 'field') return `${vis}${stat}${line.type ?? 'int'} ${line.name}` - const params = line.params.map((p) => `${p.type} ${p.name}`).join(', ') - if (line.name === cls.name) return `${vis}${line.name}(${params})` - return `${vis}${stat}${abstract && !inInterface ? 'abstract ' : ''}${line.type ?? 'void'} ${line.name}(${params})` -} - -// MARK: - Diagramm → Code - -const lineStart = (source: string, pos: number) => source.lastIndexOf('\n', pos - 1) + 1 - -/** Bereich auf ganze Zeilen erweitern, wenn davor und danach nur Leerraum steht. */ -function wholeLines(source: string, from: number, to: number): [number, number] { - const start = lineStart(source, from) - const before = source.slice(start, from) - let end = to - while (end < source.length && (source[end] === ' ' || source[end] === '\t')) end++ - if (/^\s*$/.test(before) && (end === source.length || source[end] === '\n')) return [start, Math.min(end + 1, source.length)] - return [from, to] -} - -/** Einrückung der Mitglieder einer Klasse (wie das erste Mitglied, sonst vier Leerzeichen). */ -function memberIndent(source: string, cls: UmlClass): string { - const first = cls.members[0] - if (first) { - const start = lineStart(source, first.from) - const ws = /^[ \t]*/.exec(source.slice(start))![0] - if (start + ws.length === first.from) return ws - } - const classIndent = /^[ \t]*/.exec(source.slice(lineStart(source, cls.from)))![0] - return classIndent + ' ' -} - -const splice = (source: string, from: number, to: number, text: string) => source.slice(0, from) + text + source.slice(to) - -export function addClass(source: string, name: string, kind: 'class' | 'interface' = 'class'): string { - const text = `public ${kind} ${name} {\n}\n` - if (!source.trim()) return text - return source.replace(/\s*$/, '') + '\n\n' + text -} - -export function deleteClass(source: string, cls: UmlClass): string { - const [from, to] = wholeLines(source, cls.from, cls.to) - // Leere Zeile davor mitnehmen, sonst bleiben zwei stehen. - const prev = source.slice(0, from).match(/\n\s*\n$/) - return splice(source, prev ? from - prev[0].length + 1 : from, to, '') -} - -/** Klasse umbenennen: Name im Kopf und alle Konstruktoren. */ -export function renameClass(source: string, cls: UmlClass, name: string): string { - const spots = [cls, ...cls.members.filter((m) => m.kind === 'constructor')].map((x) => [x.nameFrom, x.nameTo] as const) - for (const [from, to] of spots.sort((a, b) => b[0] - a[0])) source = splice(source, from, to, name) - return source -} - -/** Oberklasse setzen oder entfernen (nur bei Klassen); `implements` bleibt. */ -export function setSuperclass(source: string, cls: UmlClass, superclass: string | undefined): string { - const head = source.slice(cls.headerFrom, cls.headerTo) - const nameEnd = cls.nameTo - cls.headerFrom - const before = head.slice(0, nameEnd) - let after = head.slice(nameEnd).replace(/\s*\bextends\s+[\p{L}_$][\p{L}\p{N}_$<>,\s]*?(?=\s*\bimplements\b|\s*$)/u, '') - if (superclass) after = ` extends ${superclass}` + after - return splice(source, cls.headerFrom, cls.headerTo, before + after) -} - -/** Interface hinzufügen: `implements` bei Klassen, `extends` bei Interfaces. */ -export function addInterface(source: string, cls: UmlClass, name: string): string { - if (cls.interfaces.includes(name)) return source - const head = source.slice(cls.headerFrom, cls.headerTo) - const word = cls.kind === 'interface' ? 'extends' : 'implements' - const list = new RegExp(`\\b${word}\\s+[\\p{L}_$][\\p{L}\\p{N}_$<>,\\s]*?(?=\\s*$)`, 'u') - const changed = list.test(head) ? head.replace(list, (m) => `${m.replace(/\s+$/, '')}, ${name}`) : `${head.replace(/\s+$/, '')} ${word} ${name}${/\s$/.test(head) ? ' ' : ''}` - return splice(source, cls.headerFrom, cls.headerTo, changed) -} - -/** Interface aus `implements` (bzw. `extends` beim Interface) streichen; leere Liste fällt weg. */ -export function removeInterface(source: string, cls: UmlClass, name: string): string { - if (!cls.interfaces.includes(name)) return source - const head = source.slice(cls.headerFrom, cls.headerTo) - const word = cls.kind === 'interface' ? 'extends' : 'implements' - const list = new RegExp(`\\s*\\b${word}\\s+([\\p{L}_$][\\p{L}\\p{N}_$<>,\\s]*?)(?=\\s*$)`, 'u') - const changed = head.replace(list, (_m, names: string) => { - const rest = names.split(',').map((n) => n.trim()).filter((n) => n && n !== name) - return rest.length ? ` ${word} ${rest.join(', ')}` : '' - }) - return splice(source, cls.headerFrom, cls.headerTo, changed) -} - -/** Typ eines Attributs ändern, mit neuem Startwert (oder keinem). Modifizierer und Name bleiben. */ -export function setFieldType(source: string, member: UmlMember, type: string, init?: string): string { - if (member.kind !== 'field' || member.shared) return source - const head = source.slice(member.headerFrom, member.headerTo) - const typeAt = head.lastIndexOf(member.type, member.nameFrom - member.headerFrom) - if (typeAt < 0) return source - const newHead = head.slice(0, typeAt) + type + head.slice(typeAt + member.type.length) - return splice(source, member.headerFrom, member.to, `${newHead}${init ? ` = ${init}` : ''};`) -} - -/** Abstrakt an- oder ausschalten (nur bei Klassen). */ -export function setAbstract(source: string, cls: UmlClass, abstract: boolean): string { - const head = source.slice(cls.headerFrom, cls.headerTo) - const changed = abstract ? head.replace(/\bclass\b/, 'abstract class') : head.replace(/\babstract\s+/, '') - return splice(source, cls.headerFrom, cls.headerTo, changed) -} - -/** Modifier im Kopf der Klasse lesen (das Modell kennt nur `abstract`). */ -export function classModifiers(source: string, cls: UmlClass): { isPublic: boolean; isFinal: boolean } { - const head = source.slice(cls.headerFrom, cls.nameFrom) - return { isPublic: /\bpublic\b/.test(head), isFinal: /\bfinal\b/.test(head) } -} - -/** `public` setzen oder weglassen (dann nur im Package sichtbar). */ -export function setPublic(source: string, cls: UmlClass, on: boolean): string { - const head = source.slice(cls.headerFrom, cls.headerTo) - const has = /\bpublic\s+/.test(head.slice(0, cls.nameFrom - cls.headerFrom)) - const changed = on ? (has ? head : `public ${head}`) : head.replace(/\bpublic\s+/, '') - return splice(source, cls.headerFrom, cls.headerTo, changed) -} - -/** `final` setzen (nimmt `abstract` weg, beides zusammen geht in Java nicht) oder entfernen. */ -export function setFinal(source: string, cls: UmlClass, on: boolean): string { - const head = source.slice(cls.headerFrom, cls.headerTo) - const changed = on ? (/\bfinal\b/.test(head) ? head : head.replace(/\babstract\s+/, '').replace(/\bclass\b/, 'final class')) : head.replace(/\bfinal\s+/, '') - return splice(source, cls.headerFrom, cls.headerTo, changed) -} - -/** Neues Attribut (hinter dem letzten Attribut) oder neue Methode (vor der schließenden Klammer). */ -export function addMember(source: string, cls: UmlClass, text: string): string { - const line = parseUmlLine(text) - if (!line) return source - const indent = memberIndent(source, cls) - const header = javaHeader(line, cls, cls.kind === 'interface') - if (line.kind === 'field') { - const lastField = [...cls.members].reverse().find((m) => m.kind === 'field') - const at = lastField ? wholeLines(source, lastField.from, lastField.to)[1] : afterBrace(source, cls) - const prefix = source[at - 1] === '\n' ? '' : '\n' - return splice(source, at, at, `${prefix}${indent}${header};\n`) - } - let decl: string - if (cls.kind === 'interface') decl = `${indent}${header};\n` - else { - const type = line.type ?? 'void' - const isConstructor = line.name === cls.name - const body = !isConstructor && type !== 'void' ? `${indent} return ${defaultValue(type)};\n` : `${indent} // Dein Code\n` - decl = `${indent}${header} {\n${body}${indent}}\n` - } - const closeLine = lineStart(source, cls.bodyEnd) - if (!/^\s*$/.test(source.slice(closeLine, cls.bodyEnd))) return splice(source, cls.bodyEnd, cls.bodyEnd, '\n' + decl) - // Leerzeile vor der neuen Methode, außer direkt hinter `{` oder wenn schon eine da ist. - const before = source.slice(0, closeLine) - const blank = /\n[ \t]*\n$/.test(before) || /\{[ \t]*\n$/.test(before) ? '' : '\n' - return splice(source, closeLine, closeLine, blank + decl) -} - -/** Stelle hinter der `{` der Klasse (nächste Zeile, wenn die Klammer am Zeilenende steht). */ -function afterBrace(source: string, cls: UmlClass): number { - const brace = source.indexOf('{', cls.headerTo) + 1 - const rest = /^[ \t]*\n/.exec(source.slice(brace)) - return rest ? brace + rest[0].length : brace -} - -/** Mitglied neu schreiben; Rumpf und `= …` bleiben. Wechsel Attribut ↔ Methode: löschen und neu anlegen. */ -export function replaceMember(source: string, cls: UmlClass, member: UmlMember, text: string): string { - const line = parseUmlLine(text) - if (!line) return source - const wasField = member.kind === 'field' - if (wasField !== (line.kind === 'field')) { - const without = deleteMember(source, member) - const again = parseClasses(without).find((c) => c.name === cls.name) - return again ? addMember(without, again, text) : without - } - if (member.shared) return splice(source, member.nameFrom, member.nameTo, line.name) - line.visibility ??= member.visibility - if (line.kind === 'field') line.type ??= member.type - else if (member.kind !== 'constructor') line.type ??= member.type - const header = javaHeader(line, cls, member.isAbstract) - // Bei Attributen nur Kopf ohne `= …`; Modifizierer wie `final` behalten. - const old = source.slice(member.headerFrom, member.headerTo) - const keep = /\bfinal\s+/.test(old) && !/\bfinal\b/.test(header) ? header.replace(/^((?:public|private|protected)\s+)?/, '$1final ') : header - return splice(source, member.headerFrom, member.headerTo, keep) -} - -export function deleteMember(source: string, member: UmlMember): string { - if (member.shared) return source - const [from, to] = wholeLines(source, member.from, member.to) - return splice(source, from, to, '') -} - -// MARK: - Beispiel - -/** Start-Code wie im Spickzettel Java OOP & UML: Tier, Hund, Besitzer. */ -export const exampleJava = `public class Tier { - private String name; - private int alter; - - public Tier(String name, int alter) { - this.name = name; - this.alter = alter; - } - - public String getName() { - return name; - } - - public void lautGeben() { - System.out.println("..."); - } -} - -public class Hund extends Tier { - private String rasse; - - public Hund(String name, int alter, String rasse) { - super(name, alter); - this.rasse = rasse; - } - - public void lautGeben() { - System.out.println("Wuff"); - } -} - -public class Besitzer { - private String name; - private ArrayList hunde; - - public void gassiGehen() { - for (Hund h : hunde) { - h.lautGeben(); - } - } -} -` diff --git a/web/src/core/codeGenerator.ts b/web/src/core/codeGenerator.ts deleted file mode 100644 index a529c828..00000000 --- a/web/src/core/codeGenerator.ts +++ /dev/null @@ -1,1842 +0,0 @@ -/** - * Port von `VisuStructCodeGenerator.swift` und `CodeGeneration/*.swift`: - * Quellcode (Java, Python, JavaScript) aus dem Struktogramm. - */ -import { ElementType, type VSDocument, type VSElement } from './model' -import { parseSubprogramHeader, type SubprogramHeader } from './simulation' - -export type CodeTarget = 'java' | 'python' | 'javascript' - -export interface CodeOptions { - baseIndent: number - indentPerLevel: number - /** Diagramm-Texte zusätzlich als Kommentar (`/* … *\/` bzw. `""" … """`). */ - includeDiagramTextAsComments: boolean - /** `else` auch ausgeben, wenn der Nein-Zweig nur leer (ø) ist. */ - includeEmptyElseBranch: boolean - /** Kommentar über dem Code, wenn das Diagramm als Pseudocode markiert ist. */ - pseudocodeNote: string - /** Interner Heuristik-Kontext für JavaScript und Python (Ganzzahldivision). */ - jsIntVariables?: Set - /** Elementtyp deklarierter Arrays (`int[] zahlen` → `int`), für Eingaben in `zahlen[i]`. */ - arrayElementTypes?: Map - /** Text-Variablen: In Python ohne `str(…)` verketten. */ - stringVariables?: Set - /** Python ohne `match` (MicroPython auf dem mBot2 kennt es nicht): Fallauswahl als `if`/`elif`/`else`. */ - pythonWithoutMatch?: boolean - /** Nur für die Ansicht „Code live“: graue Platzhalter statt `true`/„empty element“, Zeilen je Element. */ - live?: LiveContext -} - -export const defaultCodeOptions: CodeOptions = { - baseIndent: 0, - indentPerLevel: 4, - includeDiagramTextAsComments: false, - includeEmptyElseBranch: true, - pseudocodeNote: 'Pseudocode – not a runnable program', -} - -/** - * `subprograms`: Unterprogramme mit Kopfzeile aus anderen Reitern. Python und JavaScript stellen ihre - * Definitionen vor das Hauptprogramm; in Java gehören sie als Methoden in die Klasse (`generateJavaClassFile`). - */ -export function generateCode( - document: VSDocument, - target: CodeTarget, - options: Partial = {}, - subprograms: VSDocument[] = [], -): string { - const opts = documentOptions(document, target, options) - let out = '' - // Schul-tauglich: Strict-Modus immer am Anfang des Snippets. - if (target === 'javascript') out += '"use strict";\n\n' - const all = [document, ...(target === 'java' ? [] : subprograms)] - if (target === 'python' && all.some(documentContainsJavaMathRandom)) out += 'import random\n\n' - if (target !== 'java') out += fileHelperClasses(all, target) - if (target === 'java' && documentContainsJavaInput(document)) { - // Snippet-Modus: Import als Kommentar (damit es auch beim Einfügen in `main` nicht „falsch“ steht). - out += '// import java.util.Scanner;\n' - out += 'Scanner scanner = new Scanner(System.in);\n\n' - } - // Nach Import/Scanner, damit die Java-Klasse den Vorspann weiterhin erkennt. - if (document.pseudocode) out += (target === 'python' ? '# ' : '// ') + opts.pseudocodeNote + '\n\n' - if (target !== 'java') { - for (const sub of subprograms) { - if (sub === document) continue - const header = parseSubprogramHeader(sub.caption) - if (header) out += subprogramDefinition(sub, header, target, options, 0) + '\n' - } - } - const header = parseSubprogramHeader(document.caption) - const sink = { out: '' } - if (header) sink.out = subprogramDefinition(document, header, target, options, opts.baseIndent) - else for (const el of document.elements) emit(el, target, opts, opts.baseIndent, sink) - out += sink.out - if (out.trim() === '') { - const empty = commentPrefix(target, true) - return target === 'javascript' ? '"use strict";\n\n' + empty : empty - } - return postProcessLengthSyntax(out.replace(/^[\n\r]+|[\n\r]+$/g, ''), target) -} - -function documentOptions(document: VSDocument, target: CodeTarget, options: Partial): CodeOptions { - const opts: CodeOptions = { - ...defaultCodeOptions, - ...options, - jsIntVariables: new Set(), - arrayElementTypes: inferArrayElementTypes(document), - stringVariables: inferStringVariables(document), - } - if (target !== 'java') opts.jsIntVariables = inferIntegerVariables(document) - return opts -} - -const javaTypeName = (type: SubprogramHeader['returnType']) => - type === 'string' ? 'String' : type === undefined ? 'void' : type - -function javaMethodHeader(header: SubprogramHeader): string { - const params = header.params.map((p) => `${javaTypeName(p.type)}${'[]'.repeat(p.dims ?? 0)} ${p.name}`).join(', ') - return `public static ${javaTypeName(header.returnType)} ${header.name}(${params}) {` -} - -/** Kopfzeile wie `int quadrat(int x)` als Java-Methode, Python-`def` oder JavaScript-`function`. */ -function subprogramDefinition( - document: VSDocument, - header: SubprogramHeader, - target: CodeTarget, - options: Partial, - indent: number, -): string { - const opts = documentOptions(document, target, options) - for (const p of header.params) { - if (p.dims) continue - if (p.type === 'int') opts.jsIntVariables!.add(p.name) - if (p.type === 'string') opts.stringVariables!.add(p.name) - } - const names = header.params.map((p) => p.name).join(', ') - const sink = { out: '' } - for (const el of document.elements) emit(el, target, opts, indent + opts.indentPerLevel, sink) - if (sink.out.trim() === '') sink.out = sp(indent + opts.indentPerLevel) + (target === 'python' ? 'pass\n' : '\n') - switch (target) { - case 'java': - return `${sp(indent)}${javaMethodHeader(header)}\n${sink.out}${sp(indent)}}\n` - case 'python': - return `${sp(indent)}def ${header.name}(${names}):\n${sink.out}` - case 'javascript': - return `${sp(indent)}function ${header.name}(${names}) {\n${sink.out}${sp(indent)}}\n` - } -} - -// MARK: - Hilfen - -type Sink = { out: string } - -const sp = (n: number) => (n > 0 ? ' '.repeat(n) : '') - -/** Wie Swift `regexGroups`: alle Gruppen, fehlende als "". */ -function groups(re: RegExp, s: string): string[] | undefined { - const m = re.exec(s) - return m ? Array.from(m, (g) => g ?? '') : undefined -} - -function commentPrefix(target: CodeTarget, forEmpty: boolean): string { - if (!forEmpty) return '' - return target === 'python' ? '# empty element' : '// empty element' -} - -const isDiagramEmptyPlaceholderText = (s: string) => s.trim() === 'ø' - -function emptyElementCommentLine(indent: number, target: CodeTarget): string { - return sp(indent) + (target === 'python' ? '# empty element\n' : '// empty element\n') -} - -function isElementVisuallyEmptyPlaceholderOnly(el: VSElement): boolean { - switch (el.type) { - case ElementType.leerElement: - return true - case ElementType.anweisung: - case ElementType.aufruf: - return el.textLines.map((l) => l.trim()).every((l) => l === '' || isDiagramEmptyPlaceholderText(l)) - default: - return false - } -} - -function isIfElseFalseBranchVisuallyEmpty(elements: VSElement[]): boolean { - return elements.every(isElementVisuallyEmptyPlaceholderOnly) -} - -function blockComment(lines: string[], target: CodeTarget, indent: number): string { - const trimmed = lines.map((l) => l.replace(/^[ \t]+|[ \t]+$/g, '')).filter((l) => l !== '') - if (trimmed.length === 0) return '' - if (target === 'python') { - return sp(indent) + '"""\n' + trimmed.map((t) => sp(indent) + t + '\n').join('') + sp(indent) + '"""\n' - } - if (trimmed.length === 1) return sp(indent) + '/* ' + trimmed[0] + ' */\n' - return sp(indent) + '/*\n' + trimmed.map((t) => sp(indent) + ' * ' + t + '\n').join('') + sp(indent) + ' */\n' -} - -const isCStyleSemicolonTarget = (t: CodeTarget) => t === 'java' || t === 'javascript' - -/** Semikolon-Heuristik für Java/JavaScript: ergänzt `;`, wenn sinnvoll und noch nicht vorhanden. */ -export function formatCStyleStatementLine(rawLine: string): string { - const line = rawLine.trim() - if (line === '') return '' - if (line.startsWith('//') || line.startsWith('/*') || line.startsWith('*') || line.startsWith('#')) return line - if (line.startsWith('{') || line.startsWith('}')) return line - if (line.endsWith('{')) return line - if (line.endsWith(';')) return line - const lower = line.toLowerCase() - for (const kw of ['if ', 'else', 'for ', 'while ', 'do ', 'switch ', 'case ', 'default']) { - if (lower.startsWith(kw)) return line - } - return line + ';' -} - -/** Bedingung/Ausdruck für Klammern: mehrzeilig mit Leerzeichen zusammenfassen. */ -function conditionText(lines: string[]): string { - const parts = lines.map((l) => l.trim()).filter((l) => l !== '') - return stripStructureKeywordPrefix(parts.length === 0 ? 'true' : parts.join(' ')) -} - -function stripStructureKeywordPrefix(text: string): string { - const trimmed = text.trim() - for (const keyword of ['if', 'while', 'until', 'switch']) { - const stripped = stripKeywordPrefix(keyword, trimmed) - if (stripped !== undefined) return stripped === '' ? 'true' : stripped - } - return trimmed -} - -function stripKeywordPrefix(keyword: string, text: string): string | undefined { - if (!text.toLowerCase().startsWith(keyword)) return undefined - const after = text.slice(keyword.length) - if (!(after === '' || /^\s/.test(after) || after[0] === '(')) return undefined - let content = after.trim() - if (content.startsWith('(') && content.endsWith(')') && content.length >= 2) content = content.slice(1, -1).trim() - return content -} - -function stripTrailingSemicolon(s: string): string { - let x = s.trim() - while (x.endsWith(';')) x = x.slice(0, -1).trim() - return x -} - -// MARK: - Ein-/Ausgabe - -/** Diagramm-Präfixe für Ausgabe: `output:` bzw. älteres `print:`. */ -function expressionAfterOutputDiagramPrefix(raw: string): string | undefined { - const t = raw.trim() - const lower = t.toLowerCase() - let expr: string - if (lower.startsWith('output:')) expr = t.slice(7).trim() - else if (lower.startsWith('print:')) expr = t.slice(6).trim() - else return undefined - return expr === '' ? undefined : expr -} - -interface InputLineParse { - type: string - name: string - /** Optionaler Eingabe-Hinweis in `"…"`. */ - customPrompt?: string -} - -const isIndexedTarget = (p: InputLineParse) => p.name.includes('[') && p.name.includes(']') - -/** `input:`-Rest: `int pin`, `int pin "Hinweis"`, Kurzform `pin "Hinweis"` (implizit `int`), bisher `zahl` / `int zahl`. */ -function parseInputLineAfterColon(rest: string): InputLineParse | undefined { - const trimmed = rest.trim() - if (trimmed === '') return undefined - const typed = groups( - /^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)(?:\s+"([^"]*)")?\s*$/i, - trimmed, - ) - if (typed) { - const name = typed[2].replaceAll(' ', '') - if (name === '') return undefined - const c = (typed[3] ?? '').trim() - return { type: normalizeInputTypeKeyword(typed[1]), name, customPrompt: c === '' ? undefined : c } - } - const quoted = groups(/^\s*([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)\s+"([^"]*)"\s*$/i, trimmed) - if (quoted) { - const target = quoted[1].replaceAll(' ', '') - const notName = ['int', 'integer', 'long', 'float', 'double', 'string', 'boolean', 'char', 'bool', 'void'] - if (notName.includes(target.toLowerCase())) return undefined - return { type: target.includes('[') ? 'String' : 'int', name: target, customPrompt: quoted[2].trim() } - } - const pair = parseInputTypeAndName(trimmed) - if (pair) return { type: normalizeInputTypeKeyword(pair[0]), name: pair[1] } - return undefined -} - -function normalizeInputTypeKeyword(raw: string): string { - switch (raw.trim().toLowerCase()) { - case 'integer': - case 'int': - return 'int' - case 'long': return 'long' - case 'float': return 'float' - case 'double': return 'double' - case 'string': return 'String' - case 'boolean': - case 'bool': - return 'boolean' - case 'char': return 'char' - default: return raw - } -} - -/** Nach `input:`: `int zahl` wie bisher, oder Kurzform `zahl` → Typ `int`. */ -function parseInputTypeAndName(rest: string): [string, string] | undefined { - const parts = rest.split(/[ \t]+/).filter(Boolean) - if (parts.length === 0) return undefined - if (parts.length >= 2) return [parts[0], parts[1]] - const incomplete = ['int', 'double', 'string', 'boolean', 'char', 'long', 'float', 'short', 'byte', 'void', 'bool', 'integer'] - if (incomplete.includes(parts[0].toLowerCase())) return undefined - return ['int', parts[0]] -} - -/** Ohne `output:`/`print:`-Präfix: Zeile beginnt mit `"…"` → Ausgabe. */ -function emitBareLeadingStringAsPrintIfNeeded( - raw: string, - target: CodeTarget, - indent: number, - intVariables: Set, - stringVariables: Set, -): string | undefined { - const t = stripTrailingSemicolon(raw).trim() - if (!t.startsWith('"')) return undefined - switch (target) { - case 'java': return sp(indent) + 'System.out.println(' + t + ');\n' - case 'javascript': return sp(indent) + 'console.log(' + t + ');\n' - case 'python': return sp(indent) + 'print(' + pythonConcatenation(t, intVariables, stringVariables) + ')\n' - } -} - -/** Zeichenkette für `"…"`-Literale (Java, JavaScript und Python escapen gleich). */ -function escapeForDoubleQuotedLiteral(s: string): string { - return s.replaceAll('\\', '\\\\').replaceAll('"', '\\"').replaceAll('\n', '\\n').replaceAll('\r', '\\r') -} - -function inputParseFrom(raw: string, arrayTypes: Map): InputLineParse | undefined { - const t = raw.trim() - if (!t.toLowerCase().startsWith('input:')) return undefined - const rest = t.slice(6).trim() - if (rest === '') return undefined - const p = parseInputLineAfterColon(rest) - // Kurzform `input: zahlen[i]`: Typ aus der Array-Deklaration statt immer `String`. - if (p && isIndexedTarget(p) && !/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s/i.test(rest)) { - const declared = arrayTypes.get(p.name.slice(0, p.name.indexOf('[')).trim()) - if (declared) return { ...p, type: declared } - } - return p -} - -function inferStringVariables(doc: VSDocument): Set { - const out = new Set() - walkElements(doc.elements, (e) => { - for (const raw of e.textLines) { - const t = raw.trim() - if (t.toLowerCase().startsWith('input:')) { - const p = parseInputLineAfterColon(t.slice(6).trim()) - if (p?.type === 'String' && !isIndexedTarget(p)) out.add(p.name) - continue - } - const g = groups(/^\s*(?:const\s+)?string\s+([a-zA-Z_]\w*)\s*=/i, t) - if (g) out.add(g[1]) - // String-Arrays als `name[]`, damit `spalten[i] + 1` in Python Text bleibt. - const a = groups(/^\s*string\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=/i, t) - if (a) out.add(a[1] + '[]') - } - }) - return out -} - -function inferArrayElementTypes(doc: VSDocument): Map { - const out = new Map() - walkElements(doc.elements, (e) => { - for (const raw of e.textLines) { - const g = - groups(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s*\[\s*\]\s*([a-zA-Z_]\w*)/i, raw) ?? - groups(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*)\s*\[\s*\]/i, raw) - if (g) out.set(g[2], normalizeInputTypeKeyword(g[1])) - } - }) - return out -} - -function emitJavaInputLineIfNeeded(raw: string, indent: number, arrayTypes: Map): string | undefined { - const p = inputParseFrom(raw, arrayTypes) - if (!p) return undefined - const promptText = p.customPrompt ? p.customPrompt : p.name + ': ' - const promptOut = sp(indent) + 'System.out.println("' + escapeForDoubleQuotedLiteral(promptText) + '");\n' - const decl = (type: string) => (isIndexedTarget(p) ? p.name : `${type} ${p.name}`) - switch (p.type) { - case 'int': return promptOut + sp(indent) + `${decl('int')} = scanner.nextInt();\n` - case 'double': return promptOut + sp(indent) + `${decl('double')} = scanner.nextDouble();\n` - // `next()` statt `nextLine()` (vermeidet die Newline-Falle nach `nextInt()`). - case 'String': return promptOut + sp(indent) + `${decl('String')} = scanner.next();\n` - case 'boolean': return promptOut + sp(indent) + `${decl('boolean')} = scanner.nextBoolean();\n` - default: return undefined - } -} - -function emitJavaScriptInputLineIfNeeded(raw: string, indent: number, arrayTypes: Map): string | undefined { - const p = inputParseFrom(raw, arrayTypes) - if (!p) return undefined - const useCustom = !!p.customPrompt - // `prompt` trägt den eigenen Hinweis; sonst zusätzlich `console.log`. - const hint = useCustom ? '' : sp(indent) + 'console.log("' + escapeForDoubleQuotedLiteral(p.name + ': ') + '");\n' - const promptExpr = (fallback: string) => { - const label = useCustom ? p.customPrompt! : p.name + ': ' - return `(prompt("${escapeForDoubleQuotedLiteral(label)}") ?? "${fallback}")` - } - const target = isIndexedTarget(p) ? p.name : `let ${p.name}` - switch (p.type) { - case 'int': return hint + sp(indent) + `${target} = parseInt(${promptExpr('0')}, 10);\n` - case 'double': return hint + sp(indent) + `${target} = Number(${promptExpr('0')});\n` - case 'String': return hint + sp(indent) + `${target} = ${promptExpr('')};\n` - case 'boolean': return hint + sp(indent) + `${target} = ${promptExpr('')}.trim().toLowerCase() === "true";\n` - default: return undefined - } -} - -function emitPythonInputLineIfNeeded(raw: string, indent: number, arrayTypes: Map): string | undefined { - const p = inputParseFrom(raw, arrayTypes) - if (!p) return undefined - const useCustom = !!p.customPrompt - const hint = useCustom ? '' : sp(indent) + 'print("' + escapeForDoubleQuotedLiteral(p.name + ': ') + '")\n' - const input = `input("${escapeForDoubleQuotedLiteral(useCustom ? p.customPrompt! : p.name + ': ')}")` - switch (p.type) { - case 'int': return hint + sp(indent) + `${p.name} = int(${input})\n` - case 'double': return hint + sp(indent) + `${p.name} = float(${input})\n` - case 'String': return hint + sp(indent) + `${p.name} = ${input}\n` - case 'boolean': return hint + sp(indent) + `${p.name} = ${input}.strip().lower() in ("true", "wahr")\n` - default: return undefined - } -} - -// MARK: - Dateien - -const fileName = String.raw`("(?:[^"\\]|\\.)*"|[A-Za-z_]\w*)` -const fileReaders: [RegExp, string][] = [ - [new RegExp(String.raw`^new\s+Scanner\s*\(\s*new\s+File\s*\(\s*${fileName}\s*\)\s*\)$`), 'Scanner'], - [new RegExp(String.raw`^new\s+BufferedReader\s*\(\s*new\s+FileReader\s*\(\s*${fileName}\s*\)\s*\)$`), 'BufferedReader'], - [new RegExp(String.raw`^new\s+PrintWriter\s*\(\s*(?:new\s+(?:File|FileWriter)\s*\(\s*)?${fileName}\s*\)?\s*\)$`), 'PrintWriter'], -] - -/** `new Scanner(new File("a.txt"))` → `Scanner`, `"a.txt"`; ebenso `BufferedReader` und `PrintWriter`. */ -export function fileConstructor(rhs: string): { kind: 'Scanner' | 'BufferedReader' | 'PrintWriter'; name: string } | undefined { - const t = rhs.trim() - for (const [re, kind] of fileReaders) { - const m = re.exec(t) - if (m) return { kind: kind as 'Scanner', name: m[1] } - } - return undefined -} - -/** - * Python und JavaScript kennen `Scanner`, `BufferedReader` und `PrintWriter` nicht; der erzeugte Code bekommt kleine - * Klassen mit denselben Methodennamen (siehe `fileHelperClasses`). Hier: Anlegen, `println`/`print` und `Files.writeString`. - */ -function emitFileLineIfNeeded( - raw: string, - target: CodeTarget, - indent: number, - intVariables: Set, - stringVariables: Set, -): string | undefined { - if (target === 'java') return undefined - const t = stripTrailingSemicolon(raw).trim() - const decl = /^(?:(?:Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*(new\s[\s\S]+)$/.exec(t) - const made = decl && fileConstructor(decl[2]) - if (decl && made) { - const declared = /^(?:Scanner|BufferedReader|PrintWriter)\s/.test(t) - return target === 'python' - ? sp(indent) + `${decl[1]} = ${made.kind}(${made.name})\n` - : sp(indent) + `${declared ? 'let ' : ''}${decl[1]} = new ${made.kind}(${made.name});\n` - } - const write = /^([A-Za-z_]\w*)\.(println|print)\s*\(([\s\S]*)\)$/.exec(t) - if (write && write[1] !== 'System') { - const expr = write[3].trim() - const value = target === 'python' && expr !== '' ? pythonConcatenation(expr, intVariables, stringVariables) : expr - return sp(indent) + `${write[1]}.${write[2]}(${value})${target === 'javascript' ? ';' : ''}\n` - } - const files = /^Files\.writeString\s*\(\s*(?:Path\.of|Paths\.get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,\s*([\s\S]+)\)$/.exec(t) - if (files) { - const text = files[2].trim() - return target === 'python' - ? sp(indent) + `open(${files[1]}, "w", encoding="utf-8").write(${pythonConcatenation(text, intVariables, stringVariables)})\n` - : sp(indent) + `require("fs").writeFileSync(${files[1]}, ${text});\n` - } - return undefined -} - -/** Welche Datei-Klassen ein Diagramm anlegt. */ -function usedFileClasses(docs: VSDocument[]): Set<'Scanner' | 'BufferedReader' | 'PrintWriter'> { - const used = new Set<'Scanner' | 'BufferedReader' | 'PrintWriter'>() - for (const doc of docs) { - walkElements(doc.elements, (e) => { - for (const l of e.textLines) { - const m = /=\s*(new\s.+?);?\s*$/.exec(l) - const made = m && fileConstructor(m[1]) - if (made) used.add(made.kind) - } - }) - } - return used -} - -const pythonFileHelpers: Record = { - Scanner: `class Scanner: - def __init__(self, name): - self.lines = open(name, encoding="utf-8").read().splitlines() - def hasNextLine(self): - return len(self.lines) > 0 - def nextLine(self): - return self.lines.pop(0) - def close(self): - pass -`, - BufferedReader: `class BufferedReader: - def __init__(self, name): - self.lines = open(name, encoding="utf-8").read().splitlines() - def readLine(self): - return self.lines.pop(0) if self.lines else None - def close(self): - pass -`, - PrintWriter: `class PrintWriter: - def __init__(self, name): - self.file = open(name, "w", encoding="utf-8") - def println(self, text=""): - self.file.write(str(text) + "\\n") - def print(self, text): - self.file.write(str(text)) - def close(self): - self.file.close() -`, -} - -const javaScriptFileHelpers: Record = { - Scanner: `class Scanner { - constructor(name) { this.lines = require("fs").readFileSync(name, "utf8").split(/\\r?\\n/); if (this.lines.at(-1) === "") this.lines.pop(); } - hasNextLine() { return this.lines.length > 0; } - nextLine() { return this.lines.shift(); } - close() {} -} -`, - BufferedReader: `class BufferedReader { - constructor(name) { this.lines = require("fs").readFileSync(name, "utf8").split(/\\r?\\n/); if (this.lines.at(-1) === "") this.lines.pop(); } - readLine() { return this.lines.length > 0 ? this.lines.shift() : null; } - close() {} -} -`, - PrintWriter: `class PrintWriter { - constructor(name) { this.name = name; this.text = ""; } - println(text = "") { this.text += text + "\\n"; } - print(text) { this.text += text; } - close() { require("fs").writeFileSync(this.name, this.text); } -} -`, -} - -/** Kleine Klassen für Python und JavaScript, die wie Javas `Scanner`, `BufferedReader` und `PrintWriter` heißen. */ -function fileHelperClasses(docs: VSDocument[], target: 'python' | 'javascript'): string { - const used = usedFileClasses(docs) - if (used.size === 0) return '' - const helpers = target === 'python' ? pythonFileHelpers : javaScriptFileHelpers - return [...used].map((k) => helpers[k]).join('\n') + '\n' -} - -function emitPrintLineIfNeeded( - raw: string, - target: CodeTarget, - indent: number, - intVariables: Set, - stringVariables: Set, -): string | undefined { - // `System.out.print(…)`: Ausgabe ohne neue Zeile. - const print = /^System\s*\.\s*out\s*\.\s*print\s*\(([\s\S]*)\)$/.exec(stripTrailingSemicolon(raw).trim()) - if (print) { - const value = print[1].trim() - switch (target) { - case 'java': return sp(indent) + 'System.out.print(' + value + ');\n' - case 'javascript': return sp(indent) + 'process.stdout.write(String(' + value + '));\n' - case 'python': return sp(indent) + 'print(' + (value === '' ? '' : pythonConcatenation(value, intVariables, stringVariables) + ', ') + 'end="")\n' - } - } - const expr = expressionAfterOutputDiagramPrefix(raw) - if (expr === undefined) { - // Leere Ausgabe (`output:` ohne Text): eine Leerzeile. - if (!/^\s*(?:output|print):\s*$/i.test(raw)) return undefined - return sp(indent) + { java: 'System.out.println();', javascript: 'console.log();', python: 'print()' }[target] + '\n' - } - switch (target) { - case 'java': return sp(indent) + 'System.out.println(' + expr + ');\n' - case 'javascript': return sp(indent) + 'console.log(' + expr + ');\n' - case 'python': return sp(indent) + 'print(' + pythonConcatenation(expr, intVariables, stringVariables) + ')\n' - } -} - -// MARK: - Java-ähnliche Zeilen - -/** Kopf einer C-`for`-Schleife: mehrere Felder mit `; `. Eine Zeile bleibt unverändert. */ -function cStyleForLoopHeaderText(lines: string[]): string { - const parts = lines.map(stripTrailingSemicolon).filter((p) => p !== '') - if (parts.length === 0) return ';;' - return parts.join('; ') -} - -function javaScriptForLoopHeaderText(lines: string[]): string { - const header = cStyleForLoopHeaderText(lines) - const parts = header.split(';') - const translated = javaScriptForInitializerFromJavaTypedDeclaration(parts[0]) - if (translated !== undefined) parts[0] = translated - return parts.join(';') -} - -function javaScriptForInitializerFromJavaTypedDeclaration(raw: string): string | undefined { - const g = groups(/^(\s*)(?:integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?\s*$/i, raw) - if (!g) return undefined - const name = g[2].trim() - if (name === '') return undefined - const rhs = (g[3] ?? '').trim() - if (raw.includes('=') && rhs !== '') return g[1] + `let ${name} = ${rhs}` - return g[1] + `let ${name}` -} - -/** Felder einer `for`-Schleife: drei Zeilen oder eine Zeile `int i = 0; i < n; i++` (auch mit `for (…)`). */ -function forLoopFields(lines: string[]): [string, string, string] | undefined { - const raw = lines.map((l) => stripTrailingSemicolon(l).trim()).filter((l) => l !== '') - let parts = raw - if (raw.length === 1) { - let one = raw[0] - const kw = stripKeywordPrefix('for', one) - if (kw !== undefined) one = kw - parts = one.split(';').map((p) => p.trim()) - } - if (parts.length !== 3 || parts.some((p) => p === '')) return undefined - return [parts[0], parts[1], parts[2]] -} - -interface PythonForLoop { - /** `for i in range(…):` – oder `undefined`, wenn nur eine `while`-Schleife passt. */ - rangeLine?: string - variable: string - init: string - condition: string - increment: string -} - -/** Schrittweite aus `i++`, `i--`, `i += 2`, `i -= 2`, `i = i + 2`, `i = i - 2`. */ -function forLoopStepSize(s: string, name: string): number | undefined { - let g = groups(/^\s*(\w+)\s*(\+\+|--)\s*$/, s) ?? groups(/^\s*(\+\+|--)\s*(\w+)\s*$/, s) - if (g) { - const [v, op] = g[1] === '++' || g[1] === '--' ? [g[2], g[1]] : [g[1], g[2]] - return v === name ? (op === '++' ? 1 : -1) : undefined - } - g = groups(/^\s*(\w+)\s*(\+|-)=\s*(\d+)\s*$/, s) - if (g) return g[1] === name ? (g[2] === '+' ? 1 : -1) * Number(g[3]) : undefined - g = groups(/^\s*(\w+)\s*=\s*(\w+)\s*(\+|-)\s*(\d+)\s*$/, s) - if (g) return g[1] === name && g[2] === name ? (g[3] === '+' ? 1 : -1) * Number(g[4]) : undefined - return undefined -} - -/** `n` → `n + 1`, `10` → `11`. */ -function shiftedBound(bound: string, by: number): string { - if (/^-?\d+$/.test(bound)) return String(Number(bound) + by) - const simple = /^[\w.()[\]]+$/.test(bound) ? bound : `(${bound})` - return by > 0 ? `${simple} + ${by}` : `${simple} - ${-by}` -} - -/** Zählschleife für Python: `range(…)`, wenn Kopf und Schritt passen; sonst Bausteine für `while`. */ -function pythonForLoop(lines: string[], intVariables: Set): PythonForLoop | undefined { - const fields = forLoopFields(lines) - if (!fields) return undefined - const [initS, condS, stepS] = fields - const init = groups(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i, initS) - if (!init) return undefined - const name = init[1] - const loop: PythonForLoop = { variable: name, init: `${name} = ${pythonExpression(init[2], intVariables)}`, condition: condS, increment: stepS } - const cond = groups(/^\s*(\w+)\s*(<=|<|>=|>)\s*(.+)$/, condS) - const step = forLoopStepSize(stepS, name) - if (!cond || cond[1] !== name || step === undefined || step === 0) return loop - const start = pythonExpression(init[2], intVariables) - let stop = pythonExpression(cond[3], intVariables) - const op = cond[2] - if (step > 0 && op === '<=') stop = shiftedBound(stop, 1) - else if (step < 0 && op === '>=') stop = shiftedBound(stop, -1) - else if (!(step > 0 && op === '<') && !(step < 0 && op === '>')) return loop - const args = step === 1 ? (start === '0' ? [stop] : [start, stop]) : [start, stop, String(step)] - loop.rangeLine = `for ${name} in range(${args.join(', ')}):` - return loop -} - -interface ConstTypedLineParse { - rawType: string - name: string - rhs?: string -} - -/** `const int PIN` bzw. `const double PI = 3.14`. */ -function parseConstTypedLine(rawLine: string): ConstTypedLineParse | undefined { - const line = stripTrailingSemicolon(rawLine).trim() - if (line === '') return undefined - const g = groups(/^\s*const\s+(integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?$/i, line) - if (!g) return undefined - const name = g[2].trim() - if (name === '') return undefined - if (!line.includes('=')) return { rawType: g[1].trim(), name } - const rhs = (g[3] ?? '').trim() - if (rhs === '') return undefined - return { rawType: g[1].trim(), name, rhs } -} - -function emitConstTypedLineIfNeeded( - raw: string, - target: CodeTarget, - indent: number, - intVariables: Set, -): string | undefined { - const p = parseConstTypedLine(raw) - if (!p) return undefined - const jt = normalizeInputTypeKeyword(p.rawType) - const r = p.rhs?.trim() - switch (target) { - case 'java': - return sp(indent) + formatCStyleStatementLine(r ? `final ${jt} ${p.name} = ${r}` : `final ${jt} ${p.name}`) + '\n' - case 'javascript': - if (r) return sp(indent) + formatCStyleStatementLine(`const ${p.name} = ${r}`) + '\n' - // `const` verlangt in JS einen Initialwert. - return sp(indent) + `let ${p.name}; // from diagram: const ${jt} ${p.name}\n` - case 'python': - if (r) return sp(indent) + `${p.name} = ${pythonRhsFromJavaRhs(r, intVariables)} # const ${jt}\n` - return sp(indent) + `${p.name} = None # const ${jt}, uninitialized\n` - } -} - -/** Eine Zeile `Typ name = ausdruck` (Schulsyntax). */ -function parseJavaStyleSimpleAssignment(rawLine: string): { name: string; rhs: string; isArray: boolean } | undefined { - const line = stripTrailingSemicolon(rawLine).trim() - if (line === '') return undefined - if (parseGridDeclaration(line)) return undefined - // `integer` vor `int`, damit nicht nur der Präfix `int` von `integer` passt. - const g = groups( - /^\s*(?:integer|int|long|float|double|string|boolean|char|bool)(?:\s*\[\s*\]\s+(\w+)|\s+(\w+)(\s*\[\s*\])?)\s*=\s*(.*)$/i, - line, - ) - if (!g) return undefined - const name = g[1] === '' ? g[2] : g[1] - const rhs = g[4].trim() - if (rhs === '') return undefined - return { name, rhs, isArray: g[1] !== '' || g[3] !== '' } -} - -function javaIntCastExpression(rhs: string): string | undefined { - const g = groups(/^\s*\(\s*int(?:eger)?\s*\)\s*(.+?)\s*$/i, rhs) - const e = g?.[1].trim() - // `(int) wort.charAt(i)` liefert den Zeichencode, das übernimmt `convertCharCasts`. - if (!e || isCharOperand(e)) return undefined - return e.startsWith('(') && matchingClose(e, 0) === e.length - 1 ? e.slice(1, -1).trim() : e -} - -/** Index der schließenden Klammer zu `s[open]` (rund oder eckig), sonst -1. */ -function matchingClose(s: string, open: number): number { - let depth = 0 - for (let i = open; i < s.length; i++) { - if (s[i] === '(' || s[i] === '[') depth++ - else if ((s[i] === ')' || s[i] === ']') && --depth === 0) return i - } - return -1 -} - -/** Ein einzelnes Zeichen: `'A'` oder `wort.charAt(i)`. */ -const isCharOperand = (e: string) => /^'.'$/u.test(e) || /\.charAt\(.*\)$/.test(e) - -/** Ende des Operanden ab `start`: `(…)`, `'A'`, eine Zahl oder ein Name mit `.methode(…)` und `[…]`; sonst -1. */ -function operandEnd(s: string, start: number): number { - if (s[start] === '(') { - const close = matchingClose(s, start) - return close < 0 ? -1 : close + 1 - } - if (s[start] === "'") return s[start + 2] === "'" ? start + 3 : -1 - const head = /^(?:[A-Za-z_]\w*|\d+)/.exec(s.slice(start)) - if (!head) return -1 - let i = start + head[0].length - for (;;) { - const member = /^\.[A-Za-z_]\w*/.exec(s.slice(i)) - if (member) i += member[0].length - else if (s[i] === '(' || s[i] === '[') { - const close = matchingClose(s, i) - if (close < 0) return -1 - i = close + 1 - } else return i - } -} - -/** - * Umwandlungen zwischen Zeichen und Zeichencode wie in Java: `(int) wort.charAt(i)` → Python `ord(…)`, - * JavaScript `….charCodeAt(0)`; `(char) code` → Python `chr(code)`, JavaScript `String.fromCharCode(code)`. - */ -function convertCharCasts(s: string, target: 'python' | 'javascript'): string { - return mapOutsideStringLiterals(s, (code) => { - const re = /\(\s*(int|char)\s*\)\s*/g - let out = '' - let last = 0 - for (let m = re.exec(code); m; m = re.exec(code)) { - const start = m.index + m[0].length - const end = operandEnd(code, start) - if (end < 0) continue - const operand = code.slice(start, end) - if (m[1] === 'int' && !isCharOperand(operand)) continue - const inner = convertCharCasts(operand.startsWith('(') ? operand.slice(1, -1).trim() : operand, target) - const replacement = m[1] === 'int' - ? (target === 'python' ? `ord(${inner})` : `${inner}.charCodeAt(0)`) - : (target === 'python' ? `chr(${inner})` : `String.fromCharCode(${inner})`) - out += code.slice(last, m.index) + replacement - last = end - re.lastIndex = end - } - return out + code.slice(last) - }) -} - -function pythonRhsFromJavaRhs(rhs: string, intVariables: Set = new Set()): string { - const t = rhs.trim() - if (t === 'null') return 'None' - const cast = javaIntCastExpression(t) - if (cast !== undefined) return `int(${pythonRhsFromJavaRhs(cast, intVariables)})` - return pythonExpression(t, intVariables) -} - -/** Teile außerhalb von `"…"`-Literalen umwandeln, Literale unverändert lassen. */ -function mapOutsideStringLiterals(s: string, f: (code: string) => string): string { - let out = '' - let code = '' - let i = 0 - while (i < s.length) { - if (s[i] !== '"') { - code += s[i++] - continue - } - out += f(code) - code = '' - let j = i + 1 - while (j < s.length && s[j] !== '"') j += s[j] === '\\' ? 2 : 1 - out += s.slice(i, j + 1) - i = j + 1 - } - return out + f(code) -} - -/** - * Java-Schreibweise in einem Ausdruck nach Python: `&&` → `and`, `||` → `or`, `!` → `not`, `true` → `True`, - * `a.equals(b)` → `a == b`, `Math.random()` → `random.random()`, `/` zwischen ganzen Zahlen → `//`. - */ -function pythonExpression(expression: string, intVariables: Set): string { - const withEquals = expression.replace(/\.equals\(\s*("(?:[^"\\]|\\.)*"|[^()"]*?)\s*\)/g, ' == $1') - const isInt = (operand: string) => /^\d+$/.test(operand) || intVariables.has(operand) - return mapOutsideStringLiterals(withEquals, (code) => - code - .replace(/\bMath\.random\s*\(\s*\)/gi, 'random.random()') - .replace(/===/g, '==') - .replace(/!==/g, '!=') - .replace(/\s*&&\s*/g, ' and ') - .replace(/\s*\|\|\s*/g, ' or ') - .replace(/!(?!=)\s*/g, 'not ') - .replace(/\btrue\b/g, 'True') - .replace(/\bfalse\b/g, 'False') - .replace(/\bnull\b/g, 'None') - .replace(/(? - isInt(a) && isInt(b) ? `${a} // ${b}` : m, - ), - ) -} - -/** Teile einer Verkettung mit `+` außerhalb von Klammern und Strings. */ -function splitTopLevelPlus(expression: string): string[] { - const parts: string[] = [] - let depth = 0 - let current = '' - let inString = false - for (let i = 0; i < expression.length; i++) { - const c = expression[i] - if (inString) { - current += c - if (c === '\\' && i + 1 < expression.length) current += expression[++i] - else if (c === '"') inString = false - continue - } - if (c === '"') inString = true - else if (c === '(' || c === '[') depth++ - else if (c === ')' || c === ']') depth-- - else if (c === '+' && depth === 0) { - parts.push(current.trim()) - current = '' - continue - } - current += c - } - parts.push(current.trim()) - return parts -} - -const isDoubleQuotedLiteral = (s: string) => /^"(?:[^"\\]|\\.)*"$/.test(s) - -/** `"Summe: " + summe` → `"Summe: " + str(summe)`: Python verkettet Text nicht mit Zahlen. Sonst nur übersetzt. */ -function pythonConcatenation(expression: string, intVariables: Set, stringVariables: Set): string { - const parts = splitTopLevelPlus(expression) - const isText = (p: string) => - isDoubleQuotedLiteral(p) || stringVariables.has(p) || stringVariables.has(p.replace(/^([A-Za-z_]\w*)\[[^[\]]*\]$/u, '$1[]')) - if (parts.length < 2 || !parts.some(isText) || parts.some((p) => p === '')) { - return pythonExpression(expression, intVariables) - } - return parts.map((p) => (isText(p) ? p : `str(${pythonExpression(p, intVariables)})`)).join(' + ') -} - -/** Python: `i++` → `i += 1`, `x /= 2` → `x //= 2` (ganze Zahl), sonst der Ausdruck übersetzt. */ -function pythonStatementLine(raw: string, intVariables: Set, stringVariables: Set = new Set()): string { - const t = stripTrailingSemicolon(raw).trim() - const inc = groups(/^(\w+(?:\[[^\]]*\])?)\s*(\+\+|--)$/, t) ?? groups(/^(\+\+|--)\s*(\w+(?:\[[^\]]*\])?)$/, t) - if (inc) { - const [target, op] = inc[1] === '++' || inc[1] === '--' ? [inc[2], inc[1]] : [inc[1], inc[2]] - return `${pythonExpression(target, intVariables)} ${op === '++' ? '+=' : '-='} 1` - } - const div = groups(/^(\w+)\s*\/=\s*(.+)$/, t) - if (div && intVariables.has(div[1])) return `${div[1]} //= ${pythonExpression(div[2], intVariables)}` - const assign = groups(/^([\w[\]. ]+?)\s*(=|\+=|-=|\*=|\/=|%=)\s*(.+)$/, t) - if (assign && !assign[3].startsWith('=')) { - const [, target, op, rhs] = assign - let value: string - if (op === '+=' && stringVariables.has(target.trim())) { - const parts = splitTopLevelPlus(rhs) - value = pythonConcatenation(`"" + ${rhs}`, intVariables, stringVariables).replace(/^"" \+ /, '') - if (parts.length === 1 && !isDoubleQuotedLiteral(rhs.trim()) && !stringVariables.has(rhs.trim())) { - value = `str(${pythonExpression(rhs, intVariables)})` - } - } else if (op === '=' && javaIntCastExpression(rhs) === undefined && rhs.trim() !== 'null') { - value = pythonConcatenation(rhs, intVariables, stringVariables) - } else { - value = op === '=' ? pythonRhsFromJavaRhs(rhs, intVariables) : pythonExpression(rhs, intVariables) - } - return `${target} ${op} ${value}` - } - return pythonExpression(t, intVariables) -} - -const normalizeJavaScriptMathRandomCall = (s: string) => s.replace(/\bMath\.random\b(?!\s*\()/gi, 'Math.random()') - -function arrayLiteralFromJavaInitializer(rhs: string): string { - const t = rhs.trim() - return t.startsWith('{') && t.endsWith('}') ? '[' + t.slice(1, -1) + ']' : rhs -} - -function javaNewArraySizeExpression(rhs: string): string | undefined { - const g = groups(/^\s*new\s+(?:byte|short|int|long|float|double|boolean|char|string)\s*\[\s*(.+)\s*\]\s*$/i, rhs) - const size = g?.[1].trim() - return size ? size : undefined -} - -interface GridDeclaration { - elementType: string - name: string - rhs: string -} - -/** `boolean[][] sitze = …` (2D-Array). */ -function parseGridDeclaration(line: string): GridDeclaration | undefined { - const g = groups(/^\s*(int|double|string|boolean)\s*\[\s*\]\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i, stripTrailingSemicolon(line).trim()) - return g ? { elementType: g[1].toLowerCase(), name: g[2], rhs: g[3].trim() } : undefined -} - -/** `new boolean[3][4]` → `['3', '4']`. */ -function gridSizeExpressions(rhs: string): [string, string] | undefined { - const g = groups(/^\s*new\s+(?:int|double|string|boolean)\s*\[\s*(.+?)\s*\]\s*\[\s*(.+?)\s*\]\s*$/i, rhs) - return g ? [g[1], g[2]] : undefined -} - -const nestedArrayLiteral = (rhs: string) => rhs.replaceAll('{', '[').replaceAll('}', ']') - -function gridDefault(elementType: string, target: 'python' | 'javascript'): string { - if (elementType === 'boolean') return target === 'python' ? 'False' : 'false' - if (elementType === 'string') return '""' - if (elementType === 'double') return '0.0' - return '0' -} - -function gridRhs(d: GridDeclaration, target: 'python' | 'javascript', intVariables: Set): string { - const size = gridSizeExpressions(d.rhs) - if (target === 'javascript') { - return size - ? `Array.from({ length: ${size[0]} }, () => new Array(${size[1]}).fill(${gridDefault(d.elementType, target)}))` - : nestedArrayLiteral(d.rhs) - } - return size - ? `[[${gridDefault(d.elementType, target)}] * ${pythonExpression(size[1], intVariables)} for _ in range(${pythonExpression(size[0], intVariables)})]` - : pythonExpression(nestedArrayLiteral(d.rhs), intVariables) -} - -function javaScriptRhsFromJavaRhs(rhs: string, isArray: boolean): string { - const t = rhs.trim() - if (isArray) { - const size = javaNewArraySizeExpression(t) - return size !== undefined ? `new Array(${size})` : arrayLiteralFromJavaInitializer(t) - } - const cast = javaIntCastExpression(t) - if (cast !== undefined) return `Math.floor(${javaScriptRhsFromJavaRhs(cast, false)})` - return normalizeJavaScriptMathRandomCall(t) -} - -function pythonRhsFromJavaRhsArray(rhs: string, isArray: boolean, intVariables: Set): string { - const t = rhs.trim() - if (isArray) { - const size = javaNewArraySizeExpression(t) - return size !== undefined ? `[None] * ${size}` : pythonExpression(arrayLiteralFromJavaInitializer(t), intVariables) - } - return pythonRhsFromJavaRhs(t, intVariables) -} - -/** JavaScript: `int x = 5` → `let x = 5;`. Python: `x = 5`. Java: allgemeiner Pfad. */ -function emitTranslatedJavaLikeAssignmentIfNeeded( - raw: string, - target: CodeTarget, - indent: number, - intVariables: Set, - stringVariables: Set, -): string | undefined { - if (target === 'java') return undefined - const grid = parseGridDeclaration(raw) - if (grid) { - const value = gridRhs(grid, target, intVariables) - return target === 'javascript' ? sp(indent) + `let ${grid.name} = ${value};\n` : sp(indent) + `${grid.name} = ${value}\n` - } - const p = parseJavaStyleSimpleAssignment(raw) - if (!p) return undefined - if (target === 'javascript') { - return sp(indent) + formatCStyleStatementLine(`let ${p.name} = ${javaScriptRhsFromJavaRhs(p.rhs, p.isArray)}`) + '\n' - } - const plain = !p.isArray && javaIntCastExpression(p.rhs) === undefined && p.rhs.trim() !== 'null' - const value = plain - ? pythonConcatenation(p.rhs, intVariables, stringVariables) - : pythonRhsFromJavaRhsArray(p.rhs, p.isArray, intVariables) - return sp(indent) + `${p.name} = ${value}\n` -} - -function walkElements(elements: VSElement[], visit: (e: VSElement) => void) { - for (const e of elements) { - visit(e) - if (e.loopBody) walkElements(e.loopBody, visit) - for (const c of e.cases ?? []) walkElements(c.elements, visit) - } -} - -function inferIntegerVariables(doc: VSDocument): Set { - const isIntegerType = (t: string) => ['int', 'integer', 'long', 'short', 'byte'].includes(t.trim().toLowerCase()) - const out = new Set() - walkElements(doc.elements, (e) => { - for (const raw of e.textLines) { - const t = raw.trim() - if (t === '') continue - if (t.toLowerCase().startsWith('input:')) { - const p = parseInputLineAfterColon(t.slice(6).trim()) - // Array-Ziele ignorieren (z. B. a[i]). - if (p && isIntegerType(p.type) && !p.name.includes('[')) out.add(p.name) - continue - } - const c = parseConstTypedLine(t) - if (c && isIntegerType(c.rawType)) { - out.add(c.name) - continue - } - const g = groups(/^\s*(integer|int|long|short|byte)\s+([a-zA-Z_]\w*)\s*=/i, t) - if (g) out.add(g[2].trim()) - } - }) - return out -} - -/** Wie in Java: `/` zwischen ganzen Zahlen schneidet in JavaScript mit `Math.trunc` ab, auch bei `x /= y`. */ -function javaScriptIntegerDivision(code: string, intVariables: Set): string { - const isInt = (operand: string) => /^\d+$/.test(operand) || intVariables.has(operand) - // Ganze Ketten wie `x * x / 2` von links nach rechts auswerten: In Java ist das `(x * x) / 2`, nicht `x * (x / 2)`. - const operand = String.raw`(?:[a-zA-Z_]\w*|\d+(?:\.\d+)?)` - const chain = new RegExp(String.raw`(? { - const tokens = m.split(/\s*([*/%])\s*/) - if (!tokens.some((t) => t === '/')) return m - let result = tokens[0] - let resultIsInt = isInt(tokens[0]) - for (let i = 1; i < tokens.length; i += 2) { - const op = tokens[i] - const next = tokens[i + 1] - if (op === '/' && resultIsInt && isInt(next)) result = `Math.trunc(${result} / ${next})` - else result = `${result} ${op} ${next}` - resultIsInt = resultIsInt && isInt(next) - } - return result - } - return mapOutsideStringLiterals(code, (part) => - part - .replace(chain, foldChain) - .replace(/(? - isInt(a) && isInt(b) ? `${a} = Math.trunc(${a} / ${b})` : m, - ), - ) -} - -function documentContainsJavaInput(doc: VSDocument): boolean { - let found = false - walkElements(doc.elements, (e) => { - if (e.type === ElementType.anweisung && e.textLines.some((l) => l.trim().toLowerCase().startsWith('input:'))) found = true - }) - return found -} - -const arraysImport = 'import java.util.Arrays;' - -/** - * Imports für Dateien: `Files`/`Path` aus `java.nio.file`, `File`, `PrintWriter`, `FileReader` und `BufferedReader` aus - * `java.io`, dazu `java.util.Scanner` für einen Scanner auf einer Datei und `java.util.Arrays` für `Arrays.toString(…)`. - */ -export function fileImports(doc: VSDocument): string[] { - let nio = false - let io = false - let scanner = false - let arrays = false - walkElements(doc.elements, (e) => { - for (const l of e.textLines) { - if (/\bArrays\s*\./.test(l)) arrays = true - if (/\bFiles\s*\./.test(l)) nio = true - if (/\bnew\s+(?:File|PrintWriter|FileReader|FileWriter|BufferedReader)\s*\(/.test(l)) io = true - if (/\bnew\s+Scanner\s*\(\s*new\s+File\b/.test(l)) scanner = true - } - }) - return [...(io ? ['import java.io.*;'] : []), ...(nio ? ['import java.nio.file.*;'] : []), ...(scanner ? ['import java.util.Scanner;'] : []), ...(arrays ? [arraysImport] : [])] -} - -/** Arbeitet das Programm mit Dateien? Dann kann eine IOException kommen, und Java verlangt `throws` an der Methode. */ -export function documentReadsFiles(doc: VSDocument): boolean { - return fileImports(doc).some((i) => i !== arraysImport) -} - -function documentContainsJavaMathRandom(doc: VSDocument): boolean { - let found = false - walkElements(doc.elements, (e) => { - if (e.textLines.some((l) => /\bMath\.random\s*\(/i.test(l))) found = true - }) - return found -} - -function caseLabelToken(name: string, target: CodeTarget): string { - const t = name.trim() - if (t === '') return target === 'python' ? '""' : '0' - if (target === 'java' || /^\p{N}+$/u.test(t) || isDoubleQuotedLiteral(t)) return t - return '"' + t.replaceAll('"', '\\"') + '"' -} - -function forcedCaseComment(name: string, target: CodeTarget): string { - const t = name.trim() - if (t === '') return '' - switch (target) { - case 'java': return '/* ' + t + ' */' - case 'python': return ' # ' + t - case 'javascript': return ' /* ' + t + ' */' - } -} - -// MARK: - Ausgabe der Elemente - -function emitInstructionLike(textLines: string[], target: CodeTarget, options: CodeOptions, indent: number, sink: Sink) { - const body = textLines.map((l) => l.trim()) - if (body.every((l) => l === '')) { - // Neue, noch leere Anweisung: eine leere Anweisung (Python: `pass`). - if (options.live) sink.out += sp(indent) + (target === 'python' ? 'pass' : ';') + '\n' - return - } - if (options.includeDiagramTextAsComments) { - const forDiagram = body.filter((l) => l !== '' && !isDiagramEmptyPlaceholderText(l)) - if (forDiagram.length > 0) sink.out += blockComment(forDiagram, target, indent) - } - for (const raw of body) { - if (raw === '') continue - if (isDiagramEmptyPlaceholderText(raw)) { - sink.out += options.live ? livePlaceholderLine(indent, options.live) : emptyElementCommentLine(indent, target) - continue - } - const ints = options.jsIntVariables ?? new Set() - const arrays = options.arrayElementTypes ?? new Map() - const texts = options.stringVariables ?? new Set() - const special = - (target === 'java' ? emitJavaInputLineIfNeeded(raw, indent, arrays) : undefined) ?? - (target === 'javascript' ? emitJavaScriptInputLineIfNeeded(raw, indent, arrays) : undefined) ?? - (target === 'python' ? emitPythonInputLineIfNeeded(raw, indent, arrays) : undefined) ?? - emitFileLineIfNeeded(raw, target, indent, ints, texts) ?? - emitPrintLineIfNeeded(raw, target, indent, ints, texts) ?? - emitConstTypedLineIfNeeded(raw, target, indent, ints) ?? - emitTranslatedJavaLikeAssignmentIfNeeded(raw, target, indent, ints, texts) ?? - emitBareLeadingStringAsPrintIfNeeded(raw, target, indent, ints, texts) - if (special !== undefined) { - sink.out += target === 'javascript' ? javaScriptIntegerDivision(special, ints) : special - continue - } - let line = raw - if (isCStyleSemicolonTarget(target)) { - line = formatCStyleStatementLine(target === 'javascript' ? javaScriptIntegerDivision(raw, ints) : raw) - } else if (target === 'python') { - line = pythonStatementLine(raw, ints, texts) - } - if (line === '') continue - sink.out += sp(indent) + line + '\n' - } -} - -function emitConditionHeader( - prefix: string, - suffix: string, - textLines: string[], - target: CodeTarget, - options: CodeOptions, - indent: number, - sink: Sink, - livePlaceholder = options.live?.labels.condition, -) { - if (options.includeDiagramTextAsComments) sink.out += blockComment(textLines, target, indent) - if (livePlaceholder !== undefined && isBlank(textLines)) { - sink.out += sp(indent) + prefix + livePlaceholderText(livePlaceholder) + suffix - return - } - const condition = conditionText(textLines) - const ints = options.jsIntVariables ?? new Set() - const text = - target === 'python' - ? pythonExpression(condition, ints) - : target === 'javascript' - ? javaScriptIntegerDivision(condition, ints) - : condition - sink.out += sp(indent) + prefix + text + suffix -} - -/** Leere Blöcke: Python braucht `pass`. */ -function emitBlockBody(elements: VSElement[], target: CodeTarget, options: CodeOptions, indent: number, sink: Sink) { - const before = sink.out.length - for (const el of elements) emit(el, target, options, indent, sink) - if (options.live && sink.out.length === before) sink.out += livePlaceholderLine(indent, options.live) - if (target !== 'python') return - // Nur Kommentare (z. B. „# empty element“) zählen in Python nicht als Anweisung. - const emitted = sink.out.slice(before).split('\n').map((l) => l.trim()) - if (emitted.every((l) => l === '' || l.startsWith('#'))) sink.out += sp(indent) + 'pass\n' -} - -/** Steht im false-Zweig nur eine weitere Verzweigung, wird daraus `else if` (Python: `elif`) statt eines verschachtelten Blocks. */ -function elseIfBranch(elements: VSElement[], options: CodeOptions): VSElement | undefined { - // Mit Diagrammtext als Kommentar stünde der Kommentar zwischen `}` und `else if`: dann verschachtelt lassen. - if (options.includeDiagramTextAsComments || elements.length !== 1) return undefined - const only = elements[0] - return only.type === ElementType.verzweigung && (only.cases?.length ?? 0) >= 2 ? only : undefined -} - -function emitIfChain(element: VSElement, target: CodeTarget, options: CodeOptions, indent: number, sink: Sink, isElseIf: boolean) { - const cases = element.cases - if (!cases || cases.length < 2) return - const py = target === 'python' - const inner = indent + options.indentPerLevel - const omitElse = !options.includeEmptyElseBranch && isIfElseFalseBranchVisuallyEmpty(cases[1].elements) - const next = omitElse ? undefined : elseIfBranch(cases[1].elements, options) - if (py) { - emitConditionHeader(isElseIf ? 'elif ' : 'if ', ':\n', element.textLines, target, options, indent, sink) - emitBlockBody(cases[0].elements, target, options, inner, sink) - if (next) emitIfChain(next, target, options, indent, sink, true) - else if (!omitElse) { - sink.out += sp(indent) + 'else:\n' - emitBlockBody(cases[1].elements, target, options, inner, sink) - } - return - } - emitConditionHeader(isElseIf ? '} else if (' : 'if (', ') {\n', element.textLines, target, options, indent, sink) - emitBlockBody(cases[0].elements, target, options, inner, sink) - if (next) { - const start = sink.out.length - emitIfChain(next, target, options, indent, sink, true) - recordLiveSpan(options, next, sink, start) - } else if (omitElse) sink.out += sp(indent) + '}\n' - else { - sink.out += sp(indent) + '} else {\n' - emitBlockBody(cases[1].elements, target, options, inner, sink) - sink.out += sp(indent) + '}\n' - } -} - -function emit(element: VSElement, target: CodeTarget, options: CodeOptions, indent: number, sink: Sink) { - const start = sink.out.length - emitElement(element, target, options, indent, sink) - recordLiveSpan(options, element, sink, start) -} - -function emitElement(element: VSElement, target: CodeTarget, options: CodeOptions, indent: number, sink: Sink) { - const step = options.indentPerLevel - const py = target === 'python' - const body = (els: VSElement[], i: number) => emitBlockBody(els, target, options, i, sink) - const header = (prefix: string, suffix: string) => - emitConditionHeader(prefix, suffix, element.textLines, target, options, indent, sink) - const commentIfWanted = (i = indent) => { - if (options.includeDiagramTextAsComments) sink.out += blockComment(element.textLines, target, i) - } - - switch (element.type) { - case ElementType.leerElement: - sink.out += options.live ? livePlaceholderLine(indent, options.live) : emptyElementCommentLine(indent, target) - return - - case ElementType.anweisung: - case ElementType.aufruf: - emitInstructionLike(element.textLines, target, options, indent, sink) - return - - case ElementType.aussprung: { - const hint = conditionText(element.textLines) - if (element.textLines.some((l) => l.trim() !== '')) commentIfWanted() - if (py) sink.out += sp(indent) + (hint === '' ? 'break\n' : `break # ${hint}\n`) - else sink.out += sp(indent) + (hint === '' ? 'break;\n' : `break; // ${hint}\n`) - return - } - - case ElementType.verzweigung: - emitIfChain(element, target, options, indent, sink, false) - return - - case ElementType.fallauswahl: { - const cases = element.cases - if (!cases || cases.length === 0) return - if (py && options.pythonWithoutMatch) { - const choice = `wahl${indent / step + 1}` - emitConditionHeader(choice + ' = ', '\n', element.textLines, target, options, indent, sink) - cases.forEach((c, i) => { - const isLast = i === cases.length - 1 - if (isLast && i === 0) sink.out += sp(indent) + 'if True:' + forcedCaseComment(c.name, target) + '\n' - else if (isLast) sink.out += sp(indent) + 'else:' + forcedCaseComment(c.name, target) + '\n' - else sink.out += sp(indent) + (i === 0 ? 'if ' : 'elif ') + choice + ' == ' + caseLabelToken(c.name, target) + ':\n' - body(c.elements, indent + step) - }) - return - } - emitConditionHeader( - py ? 'match ' : 'switch (', - py ? ':\n' : ') {\n', - element.textLines, - target, - options, - indent, - sink, - options.live?.labels.selector, - ) - cases.forEach((c, i) => { - const isLast = i === cases.length - 1 - if (target === 'java') { - const label = isLast - ? 'default -> { ' + forcedCaseComment(c.name, target) + '\n' - : 'case ' + caseLabelToken(c.name, target) + ' -> {\n' - sink.out += sp(indent + step) + label - body(c.elements, indent + step * 2) - sink.out += sp(indent + step) + '}\n' - } else if (py) { - const line = isLast ? 'case _:' + forcedCaseComment(c.name, target) : 'case ' + caseLabelToken(c.name, target) + ':' - sink.out += sp(indent + step) + line + '\n' - body(c.elements, indent + step * 2) - } else { - const line = isLast ? 'default:' + forcedCaseComment(c.name, target) : 'case ' + caseLabelToken(c.name, target) + ':' - sink.out += sp(indent + step) + line + '\n' - body(c.elements, indent + step * 2) - // Immer `break;`: kein Fallthrough. - sink.out += sp(indent + step * 2) + 'break;\n' - } - }) - if (!py) sink.out += sp(indent) + '}\n' - return - } - - case ElementType.forSchleife: - if (target === 'java') { - commentIfWanted() - const head = options.live ? liveForLoopHeaderText(element.textLines, options.live.labels) : cStyleForLoopHeaderText(element.textLines) - sink.out += sp(indent) + 'for (' + head + ') {\n' - } else if (py) { - const ints = options.jsIntVariables ?? new Set() - const loop = pythonForLoop(element.textLines, ints) - if (loop?.rangeLine !== undefined) { - commentIfWanted() - sink.out += sp(indent) + loop.rangeLine + '\n' - } else if (loop) { - // Kein passendes `range`: Startwert, `while` mit Bedingung, Schritt am Ende des Rumpfs. - commentIfWanted() - sink.out += sp(indent) + loop.init + '\n' - sink.out += sp(indent) + 'while ' + pythonExpression(loop.condition, ints) + ':\n' - for (const el of element.loopBody ?? []) emit(el, target, options, indent + step, sink) - sink.out += sp(indent + step) + pythonStatementLine(loop.increment, ints) + '\n' - return - } else if (options.live) { - sink.out += sp(indent) + livePythonForLoopHeaderText(element.textLines, options.live.labels, ints) + '\n' - } else { - header('for ', ':\n') - } - } else { - commentIfWanted() - const head = options.live - ? liveJavaScriptForLoopHeaderText(element.textLines, options.live.labels) - : javaScriptForLoopHeaderText(element.textLines) - sink.out += sp(indent) + 'for (' + head + ') {\n' - } - body(element.loopBody ?? [], indent + step) - if (!py) sink.out += sp(indent) + '}\n' - return - - case ElementType.whileSchleife: - header(py ? 'while ' : 'while (', py ? ':\n' : ') {\n') - body(element.loopBody ?? [], indent + step) - if (!py) sink.out += sp(indent) + '}\n' - return - - case ElementType.doUntilSchleife: { - const cond = - options.live && isBlank(element.textLines) - ? livePlaceholderText(options.live.labels.condition) - : conditionText(element.textLines) - if (py) { - sink.out += sp(indent) + 'while True:\n' - const bodyStart = indent + step - body(element.loopBody ?? [], bodyStart) - commentIfWanted(bodyStart) - const expression = cond.includes(livePlaceholderStart) ? cond : pythonExpression(cond, options.jsIntVariables ?? new Set()) - sink.out += sp(bodyStart) + 'if not (' + expression + '):\n' - sink.out += sp(bodyStart + step) + 'break\n' - } else { - sink.out += sp(indent) + 'do {\n' - body(element.loopBody ?? [], indent + step) - commentIfWanted() - sink.out += sp(indent) + '} while (' + cond + ');\n' - } - return - } - - case ElementType.endlosschleife: { - const extra = conditionText(element.textLines) - const plain = extra === '' || extra === 'true' - if (!plain) commentIfWanted() - if (py) sink.out += sp(indent) + (plain ? 'while True:\n' : `while True: # ${extra}\n`) - else sink.out += sp(indent) + (plain ? 'while (true) {\n' : `while (true) /* ${extra} */ {\n`) - body(element.loopBody ?? [], indent + step) - if (!py) sink.out += sp(indent) + '}\n' - return - } - } -} - -// MARK: - Ansicht „Code live“ - -/** Platzhalter stehen zwischen diesen Zeichen; die Ansicht zeigt sie grau und ohne die Zeichen. */ -export const livePlaceholderStart = '\uE000' -export const livePlaceholderEnd = '\uE001' - -/** Platzhalter-Wörter in der Sprache der Oberfläche, z. B. „Bedingung“. */ -export interface LiveLabels { - condition: string - selector: string - code: string - start: string - step: string - /** Obergrenze von `range(…)` in Python. */ - end: string -} - -/** Zeilen eines Elements im erzeugten Code (ab 0, `to` einschließlich). */ -export interface LiveSpan { - path: number[] - from: number - to: number -} - -export interface LiveCode { - /** Code mit Platzhalter-Markierungen (`livePlaceholderStart` … `livePlaceholderEnd`). */ - text: string - spans: LiveSpan[] -} - -interface LiveContext { - target: LiveTarget - labels: LiveLabels - paths: Map - spans: LiveSpan[] -} - -const livePlaceholderText = (label: string) => livePlaceholderStart + label + livePlaceholderEnd -/** Leerer Block: `// Dein Code`; Python braucht dort eine Anweisung, also `pass # Dein Code`. */ -const livePlaceholderLine = (indent: number, live: LiveContext) => - sp(indent) + livePlaceholderText(live.target === 'python' ? `pass # ${live.labels.code}` : `// ${live.labels.code}`) + '\n' -const isBlank = (lines: string[]) => lines.every((l) => l.trim() === '') - -/** `for (Startwert; Bedingung; Schritt)`: leere Felder werden zu Platzhaltern. */ -function liveForLoopHeaderText(lines: string[], labels: LiveLabels): string { - if (isBlank(lines) || lines.length === 3) { - const placeholders = [labels.start, labels.condition, labels.step] - return placeholders - .map((label, i) => { - const field = stripTrailingSemicolon(lines[i] ?? '') - return field === '' ? livePlaceholderText(label) : field - }) - .join('; ') - } - return cStyleForLoopHeaderText(lines) -} - -/** Wie `javaScriptForLoopHeaderText`: `int i = 0` wird zu `let i = 0`, Platzhalter bleiben. */ -function liveJavaScriptForLoopHeaderText(lines: string[], labels: LiveLabels): string { - const parts = liveForLoopHeaderText(lines, labels).split(';') - const translated = parts[0].includes(livePlaceholderStart) ? undefined : javaScriptForInitializerFromJavaTypedDeclaration(parts[0]) - if (translated !== undefined) parts[0] = translated - return parts.join(';') -} - -/** - * Unvollständige Zählschleife in Python: `for i in range(Start, Ende):`, fehlende Teile als Platzhalter. - * (Vollständige Köpfe übersetzt `pythonForLoop`.) - */ -function livePythonForLoopHeaderText(lines: string[], labels: LiveLabels, intVariables: Set): string { - const [initS = '', condS = '', stepS = ''] = lines.length === 3 ? lines.map((l) => stripTrailingSemicolon(l)) : [] - const init = groups(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i, initS) - const name = init?.[1] ?? groups(/^\s*([a-zA-Z_]\w*)\s*(?:<=|<|>=|>)/, condS)?.[1] - const start = init ? pythonExpression(init[2], intVariables) : livePlaceholderText(labels.start) - const cond = groups(/^\s*(\w+)\s*(<=|<)\s*(.+)$/, condS) - let stop = livePlaceholderText(labels.end) - if (cond && (name === undefined || cond[1] === name)) { - stop = pythonExpression(cond[3], intVariables) - if (cond[2] === '<=') stop = shiftedBound(stop, 1) - } - const step = name === undefined ? undefined : forLoopStepSize(stepS, name) - const args = [start, stop, ...(step !== undefined && step !== 1 ? [String(step)] : [])] - return `for ${name ?? livePlaceholderText(labels.selector)} in range(${args.join(', ')}):` -} - -/** Pfade wie in `editing.ts`: `[i, Zweig, j, …]`, Schleifenrumpf = Zweig 0. */ -function elementPaths(elements: VSElement[], prefix: number[] = [], out = new Map()) { - elements.forEach((e, i) => { - const path = [...prefix, i] - if (!out.has(e)) out.set(e, path) - if (e.loopBody) elementPaths(e.loopBody, [...path, 0], out) - e.cases?.forEach((c, k) => elementPaths(c.elements, [...path, k], out)) - }) - return out -} - -function recordLiveSpan(options: CodeOptions, element: VSElement, sink: Sink, start: number) { - const live = options.live - const path = live?.paths.get(element) - if (!live || !path || sink.out.length === start) return - const lineAt = (offset: number) => sink.out.slice(0, offset).split('\n').length - 1 - live.spans.push({ path, from: lineAt(start), to: lineAt(sink.out.length - 1) }) -} - -/** Zielsprachen der Ansicht „Code live“. */ -export type LiveTarget = 'java' | 'javascript' | 'python' - -/** - * Code für die Ansicht „Code live“: wie das Code-Snippet, aber für Anfänger lesbar, solange noch etwas fehlt - * (leere Anweisung `;`, `if (Bedingung)`, `// Dein Code` in leeren Blöcken), und mit den Zeilen jedes Elements. - */ -export function generateLiveCode(document: VSDocument, target: LiveTarget, labels: LiveLabels): LiveCode { - const live: LiveContext = { target, labels, paths: elementPaths(document.elements), spans: [] } - const opts = documentOptions(document, target, { includeEmptyElseBranch: true, live }) - const header = parseSubprogramHeader(document.caption) - let prelude = '' - if (target === 'java') { - const files = fileImports(document) - for (const line of files) prelude += line + '\n' - if (documentContainsJavaInput(document)) { - if (!files.includes('import java.util.Scanner;')) prelude += 'import java.util.Scanner;\n' - prelude += 'Scanner scanner = new Scanner(System.in);\n\n' - } else if (files.length) prelude += '\n' - if (header) prelude += javaMethodHeader(header) + '\n' - } else { - if (header) { - for (const p of header.params) { - if (p.dims) continue - if (p.type === 'int') opts.jsIntVariables!.add(p.name) - if (p.type === 'string') opts.stringVariables!.add(p.name) - } - } - const names = header?.params.map((p) => p.name).join(', ') - if (target === 'javascript') { - prelude += '"use strict";\n\n' - prelude += fileHelperClasses([document], 'javascript') - if (header) prelude += `function ${header.name}(${names}) {\n` - } else { - if (documentContainsJavaMathRandom(document)) prelude += 'import random\n\n' - prelude += fileHelperClasses([document], 'python') - if (header) prelude += `def ${header.name}(${names}):\n` - } - } - const sink = { out: '' } - emitBlockBody(document.elements, target, opts, header ? opts.indentPerLevel : 0, sink) - if (header && target !== 'python') sink.out += '}\n' - const offset = prelude.split('\n').length - 1 - return { - text: postProcessLengthSyntax((prelude + sink.out).replace(/\n+$/, ''), target), - spans: live.spans.map((s) => ({ ...s, from: s.from + offset, to: s.to + offset })), - } -} - -export const generateLiveJava = (document: VSDocument, labels: LiveLabels) => generateLiveCode(document, 'java', labels) - -// MARK: - Nachbearbeitung: `.length` / `.length()` zielsprachentauglich (Heuristik) - -function postProcessLengthSyntax(s: string, target: CodeTarget): string { - switch (target) { - case 'javascript': - return javaScriptStringMethods(convertCharCasts(s, 'javascript')).replace(/\.length\(\)/g, '.length').replace(/\.contains\(/g, '.includes(') - case 'python': - return pythonStringMethodsDeep(convertCharCasts(s, 'python')).replace(/\b([a-zA-Z_]\w*(?:\[[^[\]]*\])?)\.length(?:\(\)|\b)/g, 'len($1)') - case 'java': - return replaceIdentifierDotLengthWithParensInJava(s) - } -} - -/** Java-String-Methoden nach Python: `w.charAt(i)` → `w[i]`, `w.substring(a, b)` → `w[a:b]`, `w.contains(x)` → `(x in w)` usw. */ -function pythonStringMethodsDeep(s: string): string { - // Ketten wie `w.trim().toLowerCase()` brauchen mehrere Durchgänge. - for (let i = 0; i < 5; i++) { - const next = javaStaticCalls(pythonStringMethods(s), 'python') - if (next === s) break - s = next - } - return s -} - -const pythonRenamed: Record = { - indexOf: 'find', - lastIndexOf: 'rfind', - toUpperCase: 'upper', - toLowerCase: 'lower', - trim: 'strip', - startsWith: 'startswith', - endsWith: 'endswith', -} - -function pythonStringMethods(s: string): string { - return rewriteMethodCalls(s, ['charAt', 'substring', 'contains', 'isEmpty', 'equalsIgnoreCase', 'compareTo', 'repeat', 'concat', ...Object.keys(pythonRenamed)], (target, method, args) => { - switch (method) { - case 'charAt': - return `${target}[${args}]` - case 'substring': { - const parts = splitTopLevelComma(args) - return parts.length === 2 ? `${target}[${parts[0].trim()}:${parts[1].trim()}]` : `${target}[${args.trim()}:]` - } - case 'contains': - return `(${args.trim()} in ${target})` - case 'isEmpty': - return `(len(${target}) == 0)` - case 'equalsIgnoreCase': - return `(${target}.lower() == ${args.trim()}.lower())` - case 'compareTo': - return `((${target} > ${args.trim()}) - (${target} < ${args.trim()}))` - case 'repeat': - return `(${target} * ${args.trim()})` - case 'concat': - return `(${target} + ${args.trim()})` - default: - return `${target}.${pythonRenamed[method]}(${args})` - } - }) -} - -/** Java-String-Methoden, die es in JavaScript nicht gibt: `w.isEmpty()`, `w.equalsIgnoreCase(x)`, `w.compareTo(x)`; `replace` ersetzt wie in Java alle Stellen. */ -function javaScriptStringMethods(s: string): string { - for (let i = 0; i < 5; i++) { - const next = javaStaticCalls( - rewriteMethodCalls(s, ['isEmpty', 'equalsIgnoreCase', 'compareTo', 'replace'], (target, method, args) => { - switch (method) { - case 'isEmpty': - return `(${target}.length === 0)` - case 'equalsIgnoreCase': - return `(${target}.toLowerCase() === ${args.trim()}.toLowerCase())` - case 'compareTo': - return `${target}.localeCompare(${args.trim()})` - default: - return `${target}.replaceAll(${args})` - } - }), - 'javascript', - ) - if (next === s) break - s = next - } - return s -} - -/** `Integer.parseInt(x)`, `Double.parseDouble(x)`, `String.valueOf(x)` und `Files.readString(Path.of(x))` in Python und JavaScript. */ -function javaStaticCalls(s: string, target: 'python' | 'javascript'): string { - const file = /\bFiles\.readString\(\s*(?:Path\.of|Paths\.get)\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g - if (target === 'python') { - return s - .replace(file, 'open($1, encoding="utf-8").read()') - .replace(/\bInteger\.parseInt\(/g, 'int(') - .replace(/\bDouble\.parseDouble\(/g, 'float(') - .replace(/\bString\.valueOf\(/g, 'str(') - } - return s - .replace(file, 'require("fs").readFileSync($1, "utf8")') - .replace(/\bInteger\.parseInt\(/g, 'parseInt(') - .replace(/\bDouble\.parseDouble\(/g, 'parseFloat(') - .replace(/\bString\.valueOf\(/g, 'String(') -} - -/** Teilt Argumente am Komma außerhalb von Klammern. */ -function splitTopLevelComma(args: string): string[] { - let depth = 0 - const comma = [...args].findIndex((c) => (c === '(' ? (depth += 1, false) : c === ')' ? (depth -= 1, false) : c === ',' && depth === 0)) - return comma < 0 ? [args] : [args.slice(0, comma), args.slice(comma + 1)] -} - -/** Ersetzt Aufrufe `ziel.methode(…)` der genannten Methoden; das Ziel ist ein Name, ein Fach, eine Kette oder ein String. */ -function rewriteMethodCalls(s: string, methods: string[], replace: (target: string, method: string, args: string) => string): string { - const re = new RegExp(`([A-Za-z_]\\w*(?:\\[[^[\\]]*\\]|\\.\\w+\\(\\))*|"(?:[^"\\\\]|\\\\.)*")\\.(${methods.join('|')})\\(`, 'g') - let out = '' - let last = 0 - for (let m = re.exec(s); m; m = re.exec(s)) { - const open = m.index + m[0].length - 1 - let depth = 0 - let close = -1 - for (let i = open; i < s.length; i++) { - if (s[i] === '(') depth += 1 - else if (s[i] === ')' && --depth === 0) { - close = i - break - } - } - if (close < 0) break - const args = rewriteMethodCalls(s.slice(open + 1, close), methods, replace) - out += s.slice(last, m.index) + replace(m[1], m[2], args) - last = close + 1 - re.lastIndex = close + 1 - } - return out + s.slice(last) -} - -function javaArrayDeclarationNames(s: string): Set { - const type = '(?:byte|short|int|long|float|double|boolean|char|String)' - const patterns = [ - new RegExp(`\\b(?:final\\s+)?${type}\\s*\\[\\s*\\](?:\\s*\\[\\s*\\])?\\s+([a-zA-Z_]\\w*)\\b`, 'g'), - new RegExp(`\\b(?:final\\s+)?${type}\\s+([a-zA-Z_]\\w*)\\s*\\[\\s*\\]`, 'g'), - ] - const names = new Set() - for (const re of patterns) for (const m of s.matchAll(re)) names.add(m[1].toLowerCase()) - return names -} - -/** `String`: `s.length()`; Array: `a.length` — nur wenn `a` im erzeugten Code als Array deklariert ist. */ -function replaceIdentifierDotLengthWithParensInJava(s: string): string { - const arrays = javaArrayDeclarationNames(s) - return s.replace(/\b([a-zA-Z_]\w*)\.length(?!\()/g, (m, id: string) => (arrays.has(id.toLowerCase()) ? m : `${id}.length()`)) -} - -// MARK: - Java: vollständige Klasse (.java) - -const javaReserved = new Set( - ( - 'abstract assert boolean break byte case catch char class const continue default do double else enum extends final ' + - 'finally float for goto if implements import instanceof int interface long native new package private protected ' + - 'public return short static strictfp super switch synchronized this throw throws transient try void volatile while ' + - 'true false null var record sealed permits yield module open opens requires exports to uses provides with transitive' - ).split(' '), -) - -/** Gültiger Java-Klassenname aus freiem Text (z. B. Diagrammtitel). */ -export function sanitizedJavaClassName(raw: string): string { - const trimmed = raw.trim() - if (trimmed === '') return 'Main' - let result = '' - Array.from(trimmed).forEach((ch, idx) => { - if (idx === 0) { - if (/\p{L}/u.test(ch) || ch === '_' || ch === '$') result += ch - else if (/\p{Nd}/u.test(ch)) result += '_' + ch - else result += '_' - } else if (/[\p{L}\p{M}\p{N}]/u.test(ch) || ch === '_' || ch === '$') { - result += ch - } else { - result += '_' - } - }) - result = result.replace(/_{2,}/g, '_').replace(/^_+|_+$/g, '') - if (result === '') return 'Main' - // Das Trimmen oben entfernt auch den `_` vor einer führenden Ziffer. - if (/^\p{Nd}/u.test(result)) result = '_' + result - if (javaReserved.has(result.toLowerCase())) result = '_' + result - return result -} - -/** Vollständige `.java`-Datei: `public class` mit `main`, erzeugtes Snippet eingerückt im Rumpf. */ -export function generateJavaClassFile( - document: VSDocument, - className: string, - options: Partial = {}, - subprograms: VSDocument[] = [], -): string { - const opts = { ...defaultCodeOptions, ...options } - const name = sanitizedJavaClassName(className) - const methodDocs = [document, ...subprograms] - .filter((d, i, all) => all.indexOf(d) === i) - .map((d) => ({ d, header: parseSubprogramHeader(d.caption) })) - .filter((m): m is { d: VSDocument; header: SubprogramHeader } => m.header !== undefined) - const methods = methodDocs.map((m) => subprogramDefinition(m.d, m.header, 'java', options, opts.indentPerLevel)) - const ownHeader = parseSubprogramHeader(document.caption) - // Mit Methoden braucht jede denselben Scanner, deshalb steht er dann als Feld in der Klasse. - const methodInput = methodDocs.some((m) => documentContainsJavaInput(m.d)) - const snippet = generateCode(document, 'java', opts) - const innerBase = opts.indentPerLevel * 2 - const hasInput = documentContainsJavaInput(document) - const bodyNoPrelude = hasInput ? stripJavaSnippetScannerPrelude(snippet) : snippet - const prefix = sp(innerBase) - const indentedBody = - bodyNoPrelude.trim() === '' - ? '' - : bodyNoPrelude - .split('\n') - .map((line) => (line.trim() === '' ? prefix : prefix + line)) - .join('\n') - - let out = '' - const scannerField = methods.length > 0 && (hasInput || methodInput) - // `Files.readString` kann eine IOException werfen; Java verlangt dann `throws` an der Methode. - const imports = [...new Set([document, ...methodDocs.map((m) => m.d)].flatMap(fileImports))] - const files = imports.some((i) => i !== arraysImport) - if ((hasInput || methodInput) && !imports.includes('import java.util.Scanner;')) imports.push('import java.util.Scanner;') - for (const line of imports) out += line + '\n' - if (imports.length) out += '\n' - out += `public class ${name} {\n` - if (scannerField) out += sp(opts.indentPerLevel) + 'static Scanner scanner = new Scanner(System.in);\n\n' - // Ein Unterprogramm allein ist nur eine Methode, ohne `main`. - if (!ownHeader) { - out += sp(opts.indentPerLevel) + `public static void main(String[] args)${files ? ' throws Exception' : ''} {\n` - if (hasInput && !scannerField) { - out += sp(innerBase) + 'Scanner scanner = new Scanner(System.in);\n' - if (indentedBody !== '') out += '\n' - } - out += indentedBody - if (indentedBody !== '' && !indentedBody.endsWith('\n')) out += '\n' - out += sp(opts.indentPerLevel) + '}\n' - } - for (const [i, m] of methods.entries()) out += (i > 0 || !ownHeader ? '\n' : '') + m - out += '}\n' - return out -} - -/** Entfernt die im Snippet-Modus vorangestellte Scanner-Zeile (und den Kommentar-„Import“). */ -function stripJavaSnippetScannerPrelude(snippet: string): string { - const lines = snippet.split('\n') - let i = 0 - if (lines[i] === '// import java.util.Scanner;') i++ - while (i < lines.length && lines[i].trim() === '') i++ - if (lines[i] === 'Scanner scanner = new Scanner(System.in);') i++ - while (i < lines.length && lines[i].trim() === '') i++ - return i >= lines.length ? '' : lines.slice(i).join('\n') -} diff --git a/web/src/core/diagramText.ts b/web/src/core/diagramText.ts deleted file mode 100644 index 4c66f76b..00000000 --- a/web/src/core/diagramText.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { ElementType, type VSElement } from './model' - -/** Texte, wie sie im Diagramm angezeigt werden (`VisuStructDiagramText.swift`). `undefined` = kein Text → Platzhalter. */ -export function displayLines(element: VSElement): string[] | undefined { - const raw = element.textLines - if (raw.every((l) => l.trim() === '')) return undefined - switch (element.type) { - case ElementType.forSchleife: - return raw.length <= 1 ? raw : [forLoopSingleLine(raw)] - case ElementType.verzweigung: - return withLeadingKeyword('if', raw) - case ElementType.whileSchleife: - return withLeadingKeyword('while', raw) - case ElementType.doUntilSchleife: - return withLeadingKeyword('while', normalizedDoUntilConditionLines(raw)) - case ElementType.fallauswahl: - return withLeadingKeyword('switch', raw) - default: - return raw - } -} - -/** Entfernt ein führendes `until`, damit die Anzeige einheitlich `while …` nutzt. */ -export function normalizedDoUntilConditionLines(raw: string[]): string[] { - if (raw.length === 0) return raw - const t = raw[0].trim() - const lower = t.toLowerCase() - const o = [...raw] - if (lower === 'until') o[0] = '' - else if (lower.startsWith('until ')) o[0] = t.slice(6).trim() - else if (lower.startsWith('until(')) o[0] = t.slice(5) - else return raw - return o -} - -/** `while i < 3` → `{ keyword: 'while', rest: 'i < 3' }` (Schlüsselwort fett). */ -export function keywordSplit(line: string): { keyword: string; rest: string } | undefined { - const keywords = new Set(['if', 'for', 'while', 'until', 'switch']) - const colonKeywords = ['input:', 'output:', 'print:'] - const trimmed = line.trim() - const lower = trimmed.toLowerCase() - for (const prefix of colonKeywords) { - if (lower === prefix) return { keyword: trimmed, rest: '' } - if (lower.startsWith(prefix + ' ')) { - return { keyword: trimmed.slice(0, prefix.length), rest: trimmed.slice(prefix.length).trim() } - } - } - const firstSpace = trimmed.indexOf(' ') - if (firstSpace < 0) return undefined - const head = trimmed.slice(0, firstSpace) - if (!keywords.has(head.toLowerCase())) return undefined - return { keyword: head, rest: trimmed.slice(firstSpace + 1).trim() } -} - -function withLeadingKeyword(keyword: string, lines: string[]): string[] { - if (lines.length === 0) return lines - const trimmed = lines[0].trim() - const lower = trimmed.toLowerCase() - if (lower === keyword || lower.startsWith(keyword + ' ')) return lines - const out = [...lines] - out[0] = keyword + ' ' + trimmed - return out -} - -/** Zählschleife einzeilig: `for (init; cond; step)` → `for init; cond; step`. */ -export function forLoopSingleLine(textLines: string[]): string { - let parts = [...textLines] - while (parts.length < 3) parts.push('') - parts = parts.slice(0, 3) - const strip = (s: string) => { - let x = s.trim() - while (x.endsWith(';')) x = x.slice(0, -1).trim() - return x - } - const joined = parts.map(strip).join('; ').trim() - return joined === '' ? 'for' : 'for ' + joined -} - -/** Platzhaltertexte für leere Elemente (deutsche Werte aus `de.lproj/Localizable.strings`). */ -export const stubTexts: Record = { - [ElementType.anweisung]: 'Anweisung', - [ElementType.verzweigung]: 'Bedingung', - [ElementType.fallauswahl]: 'Fallauswahl', - [ElementType.forSchleife]: 'for 0 < i < anzahl', - [ElementType.whileSchleife]: 'while …', - [ElementType.doUntilSchleife]: 'while …', - [ElementType.endlosschleife]: 'endless', - [ElementType.aussprung]: 'break', - [ElementType.aufruf]: 'Aufruf()', - [ElementType.leerElement]: 'ø', -} - -/** Wie `DiagramCanvasView.displayTextLines`. */ -export function setCanvasStubTexts(texts: Partial>) { - Object.assign(stubTexts, texts) -} - -export function canvasTextLines(element: VSElement): string[] { - return displayLines(element) ?? [stubTexts[element.type]] -} diff --git a/web/src/core/editing.ts b/web/src/core/editing.ts deleted file mode 100644 index 16de25ca..00000000 --- a/web/src/core/editing.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { ElementType, isLoop, isMultiway, makeElement, type VSDocument, type VSElement } from './model' - -/** - * Port der benötigten Teile von `VisuStructDocumentEditing.swift`. - * Pfade wie dort: Wurzelindex, dann je Schleife `0, i` bzw. je Verzweigung/Fallauswahl `fall, i`. - * Alle Funktionen sind rein (das Dokument wird nicht verändert). - */ -export class EditError extends Error {} - -const clone = (v: T): T => structuredClone(v) - -export function placeholderElement(): VSElement { - return makeElement(ElementType.anweisung, { textLines: ['ø'] }) -} - -export function newEmptyDocument(): VSDocument { - return { caption: '', elements: [placeholderElement()] } -} - -export function isPlaceholderElement(el: VSElement): boolean { - if (el.type === ElementType.leerElement) return true - if (el.type === ElementType.anweisung) { - const t = el.textLines - return t.length === 0 || (t.length === 1 && t[0] === 'ø') - } - return false -} - -export function isPlaceholderSlot(doc: VSDocument, path: number[]): boolean { - const el = tryElementAt(doc, path) - return el !== undefined && isPlaceholderElement(el) -} - -/** Die Liste, in der das Element am Pfad steht, plus sein Index darin. */ -function locate(elements: VSElement[], path: number[]): { list: VSElement[]; index: number } { - if (path.length === 0) throw new EditError('Invalid element path.') - const [i, ...rest] = path - if (i < 0 || i >= elements.length) throw new EditError('Invalid element path.') - if (rest.length === 0) return { list: elements, index: i } - const [head, ...tail] = rest - if (tail.length === 0) throw new EditError('Invalid element path.') - return locate(childList(elements[i], head), tail) -} - -/** Kindliste eines Containers: Schleifenrumpf (`head` = 0) bzw. Fall `head`. */ -function childList(el: VSElement, head: number): VSElement[] { - if (isLoop(el.type)) { - if (head !== 0 || !el.loopBody) throw new EditError('Invalid element path.') - return el.loopBody - } - if (isMultiway(el.type)) { - if (!el.cases || head < 0 || head >= el.cases.length) throw new EditError('Invalid element path.') - return el.cases[head].elements - } - throw new EditError('Invalid element path.') -} - -export function elementAt(doc: VSDocument, path: number[]): VSElement { - const { list, index } = locate(doc.elements, path) - return list[index] -} - -export function tryElementAt(doc: VSDocument, path: number[]): VSElement | undefined { - try { - return elementAt(doc, path) - } catch { - return undefined - } -} - -export function replaceAtPath(doc: VSDocument, path: number[], element: VSElement): VSDocument { - const d = clone(doc) - const { list, index } = locate(d.elements, path) - list[index] = clone(element) - return d -} - -export function setTextLines(doc: VSDocument, path: number[], lines: string[]): VSDocument { - const el = clone(elementAt(doc, path)) - el.textLines = lines.length === 0 ? [''] : lines - return replaceAtPath(doc, path, el) -} - -export function canDeleteElement(doc: VSDocument, path: number[]): boolean { - if (path.length === 0) return false - if (path.length === 1 && doc.elements.length === 1) return !isPlaceholderSlot(doc, path) - return tryElementAt(doc, path) !== undefined -} - -export function deleteAtPath(doc: VSDocument, path: number[]): VSDocument { - const d = clone(doc) - const { list, index } = locate(d.elements, path) - if (path.length === 1 && list.length === 1) { - // Letztes Wurzelelement: durch Platzhalter ersetzen; der Platzhalter selbst bleibt. - if (isPlaceholderElement(list[0])) throw new EditError('The last root element cannot be deleted.') - list[0] = placeholderElement() - return d - } - list.splice(index, 1) - // Leere Schleifenrümpfe/Fälle bekommen wieder einen Platzhalter (wie Swift). - if (path.length > 1 && list.length === 0) list.push(placeholderElement()) - return d -} - -/** Einfügen in die Kindliste unter `parentPath` (`[]` = Wurzel, sonst Container-Pfad + Rumpf/Fall-Index). */ -export function insertAt(doc: VSDocument, parentPath: number[], index: number, element: VSElement): VSDocument { - const d = clone(doc) - let list: VSElement[] - if (parentPath.length === 0) { - list = d.elements - } else { - const container = parentPath.slice(0, -1) - const head = parentPath[parentPath.length - 1] - const { list: l, index: i } = locate(d.elements, container) - list = childList(l[i], head) - } - list.splice(Math.min(Math.max(0, index), list.length), 0, clone(element)) - return d -} - -export function insertBeforeSibling(doc: VSDocument, element: VSElement, before: number[]): VSDocument { - if (before.length === 0) throw new EditError('Invalid element path.') - return insertAt(doc, before.slice(0, -1), before[before.length - 1], element) -} - -export function insertAfterSibling(doc: VSDocument, element: VSElement, after: number[]): VSDocument { - if (after.length === 0) throw new EditError('Invalid element path.') - return insertAt(doc, after.slice(0, -1), after[after.length - 1] + 1, element) -} - -function isStrictAncestor(ancestor: number[], path: number[]): boolean { - return ancestor.length < path.length && ancestor.every((v, i) => path[i] === v) -} - -/** Passt einen Pfad an, nachdem `removedPath` aus seiner Geschwisterliste entfernt wurde. */ -export function adjustPathAfterRemoving(path: number[], removedPath: number[]): number[] { - if (removedPath.length === 0) return path - const removedIndex = removedPath[removedPath.length - 1] - const parent = removedPath.slice(0, -1) - if (path.length <= parent.length || !parent.every((v, i) => path[i] === v)) return path - const pos = parent.length - if (path[pos] <= removedIndex) return path - const adjusted = [...path] - adjusted[pos] -= 1 - return adjusted -} - -const samePath = (a: number[], b: number[]) => a.length === b.length && a.every((v, i) => v === b[i]) - -export function moveBeforeSibling(doc: VSDocument, from: number[], before: number[]): VSDocument { - if (samePath(from, before)) return doc - if (isStrictAncestor(from, before)) throw new EditError('Invalid element path.') - const moving = elementAt(doc, from) - const d = deleteAtPath(doc, from) - return insertBeforeSibling(d, moving, adjustPathAfterRemoving(before, from)) -} - -export function moveAfterSibling(doc: VSDocument, from: number[], after: number[]): VSDocument { - if (samePath(from, after)) return doc - if (isStrictAncestor(from, after)) throw new EditError('Invalid element path.') - const moving = elementAt(doc, from) - const d = deleteAtPath(doc, from) - return insertAfterSibling(d, moving, adjustPathAfterRemoving(after, from)) -} - -export function moveReplacingPlaceholder(doc: VSDocument, from: number[], placeholder: number[]): VSDocument { - if (!isPlaceholderSlot(doc, placeholder)) throw new EditError('Invalid element path.') - if (samePath(from, placeholder)) return doc - if (isStrictAncestor(from, placeholder)) throw new EditError('Invalid element path.') - const moving = elementAt(doc, from) - const d = deleteAtPath(doc, from) - return replaceAtPath(d, adjustPathAfterRemoving(placeholder, from), moving) -} - -// MARK: - Fallauswahl (VisuStructDocumentEditing.swift, Editing/VisuStructDocumentEditing+Multiway.swift) - -/** - * Neuer Fall für eine Fallauswahl (nicht Verzweigung): ein Platzhalter „ø“, Name automatisch (`3` vor `default` usw.). - * Liefert das Dokument und den Pfad zum neuen Platzhalter. - */ -export function appendCaseToFallauswahl(doc: VSDocument, fallauswahlPath: number[]): { doc: VSDocument; path: number[] } { - const parent = clone(elementAt(doc, fallauswahlPath)) - const cases = parent.cases - if (parent.type !== ElementType.fallauswahl || !cases || cases.length === 0) throw new EditError('Invalid element path.') - const lastIsDefault = cases[cases.length - 1].name.toLowerCase() === 'default' - const insertIndex = lastIsDefault ? cases.length - 1 : cases.length - const name = String(lastIsDefault ? cases.length : cases.length + 1) - cases.splice(insertIndex, 0, { name, elements: [placeholderElement()] }) - return { doc: replaceAtPath(doc, fallauswahlPath, parent), path: [...fallauswahlPath, insertIndex, 0] } -} - -/** Entfernt einen Fall der Fallauswahl. Es bleiben mindestens zwei Fälle übrig. */ -export function removeCaseFromFallauswahl( - doc: VSDocument, - fallauswahlPath: number[], - caseIndex: number, -): { doc: VSDocument; path: number[] } { - const parent = clone(elementAt(doc, fallauswahlPath)) - const cases = parent.cases - if (parent.type !== ElementType.fallauswahl || !cases) throw new EditError('Invalid element path.') - if (cases.length <= 2) throw new EditError('A switch needs at least two cases.') - if (caseIndex < 0 || caseIndex >= cases.length) throw new EditError('Invalid element path.') - cases.splice(caseIndex, 1) - const newCaseIndex = Math.min(caseIndex, cases.length - 1) - return { doc: replaceAtPath(doc, fallauswahlPath, parent), path: [...fallauswahlPath, newCaseIndex, 0] } -} - -/** Beschriftung eines Falls der Fallauswahl (z. B. `1`, `ok`, `default`). */ -export function setFallauswahlCaseName(doc: VSDocument, fallauswahlPath: number[], caseIndex: number, name: string): VSDocument { - const parent = clone(elementAt(doc, fallauswahlPath)) - const cases = parent.cases - if (parent.type !== ElementType.fallauswahl || !cases) throw new EditError('Invalid element path.') - if (caseIndex < 0 || caseIndex >= cases.length) throw new EditError('Invalid element path.') - const trimmed = name.trim() - if (trimmed === '') throw new EditError('Invalid element path.') - cases[caseIndex].name = trimmed - return replaceAtPath(doc, fallauswahlPath, parent) -} - -/** Innerste Fallauswahl, die `path` enthält (oder selbst ist). */ -export function multiwayAncestorPath(path: number[] | undefined, doc: VSDocument): number[] | undefined { - if (!path || path.length === 0) return undefined - for (let len = path.length; len >= 1; len--) { - const prefix = path.slice(0, len) - if (tryElementAt(doc, prefix)?.type === ElementType.fallauswahl) return prefix - } - return undefined -} - -/** Spaltenindex der Fallauswahl, wenn die Auswahl in einer Spalte liegt (`[…, fall, spalte, …]`). */ -export function caseIndexInMultiway(selectedPath: number[] | undefined, multiwayPath: number[]): number | undefined { - if (!selectedPath || selectedPath.length <= multiwayPath.length) return undefined - return selectedPath[multiwayPath.length] -} - -/** Auswahl nach Undo/Redo oder Löschen: leeres Dokument → keine; ungültige Auswahl → erstes Element. */ -export function sanitizedSelection(path: number[] | undefined, doc: VSDocument): number[] | undefined { - if (doc.elements.length === 0) return undefined - if (!path || !tryElementAt(doc, path)) return [0] - return path -} diff --git a/web/src/core/exerciseCheck.ts b/web/src/core/exerciseCheck.ts deleted file mode 100644 index 50af1f05..00000000 --- a/web/src/core/exerciseCheck.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { ElementType, type VSDocument, type VSElement } from './model' -import { actionSignature, driveSignature, type MBotSensorValue } from './mbot' -import { ROBOT_STEP_MS, RobotWorld, type RobotWorldSetup } from './robotWorld' -import { SimulationEngine, type SimNotice, type SubprogramResolver } from './simulation' - -/** Automatische Prüfung einer Übung: Diagramm mit festen Eingaben simulieren und die Ausgabe vergleichen. */ - -export interface ExerciseTest { - inputs: string[] - expected: string[] - /** Dateien, die das Programm speichern soll, mit ihren Zeilen. */ - files?: { name: string; lines: string[] }[] - /** VisuBot: erwartete Fahrt (`driveSignature`), z. B. `['forward 50', 'turnRight 90']`. */ - drive?: string[] - /** VisuBot: Welt (Name einer Weltkarte in `lessons/welten`); der Roboter darf nicht anstoßen und muss ins Ziel, falls sie eins hat. */ - world?: string - /** - * VisuBot: Messwerte der Sensoren, z. B. `{ getLoudness: [0, 80] }`. Mehrere Werte kommen nacheinander, - * jeder für `SENSOR_PHASE_STEPS` Schritte, der letzte bleibt (so lässt sich „warte, bis es laut ist“ prüfen). - */ - sensors?: Record - /** VisuBot: Sollen die LEDs am Ende leuchten (`true`) oder aus sein (`false`)? */ - led?: boolean - /** VisuBot: Soll ein Ton erklingen? */ - tone?: boolean - /** VisuBot: Fährt er überhaupt (egal wie weit)? */ - drives?: boolean - /** VisuBot: Text, der am Ende auf dem Bildschirm steht (`mbot.showText`). */ - screen?: string - /** VisuBot: genau diese Befehle für LEDs, Ton, Pausen und Bildschirm (`actionSignature`, ohne Fahren). */ - actions?: string[] -} - -/** So viele Schritte gilt ein Messwert aus `ExerciseTest.sensors`, bevor der nächste kommt. */ -export const SENSOR_PHASE_STEPS = 40 - -export interface RunResult { - outputs: string[] - /** Gespeicherte Dateien (Name → Inhalt). */ - files?: Map - /** VisuBot: tatsächliche Fahrt (`driveSignature`). */ - drive?: string[] - /** VisuBot: Steht der Roboter am Ende im Ziel, wie oft ist er angestoßen? */ - atGoal?: boolean - bumps?: number - /** VisuBot: Leuchten die LEDs am Ende, kam ein Ton? */ - led?: boolean - tone?: boolean - screen?: string - /** VisuBot: Befehle ohne Fahren (`actionSignature`). */ - actions?: string[] - /** Fehler der Simulation (z. B. unbekannte Variable). */ - error?: SimNotice - /** Das Diagramm wollte mehr Eingaben, als der Test hat. */ - missingInput?: boolean - /** Eingaben blieben übrig. */ - unusedInputs?: number - /** Abbruch nach zu vielen Schritten (vermutlich Endlosschleife). */ - tooManySteps?: boolean -} - -export const maxCheckSteps = 100_000 - -/** Fahrbefehle; alle anderen (LEDs, Ton, Pause, Bildschirm) prüft `ExerciseTest.actions`. */ -const DRIVING = new Set(['forward', 'backward', 'turnLeft', 'turnRight', 'stop', 'drive']) - -export function runWithInputs( - doc: VSDocument, - inputs: string[], - subprograms?: SubprogramResolver, - world?: RobotWorldSetup, - sensors?: ExerciseTest['sensors'], -): RunResult { - const engine = new SimulationEngine(doc, subprograms) - const queue = [...inputs] - // Sensoren wie im Simulator: die Welt fährt mit, damit `mbot.getDistance()` passende Werte liefert. - const robot = new RobotWorld(world) - let applied = 0 - for (let i = 0; i < maxCheckSteps; i++) { - const { state } = engine - for (; applied < state.robotActions.length; applied++) robot.apply(state.robotActions[applied]) - // jeder Schritt dauert etwas; mit `mbot.drive` fährt der Roboter dabei weiter - if (i > 0) robot.tick(ROBOT_STEP_MS) - engine.robotSensors = { ...robot.sensors(), ...sensorsAt(sensors, i) } - const done = () => ({ - outputs: [...state.outputLines], - files: new Map(state.files), - drive: state.robotActions.length ? driveSignature(state.robotActions) : undefined, - ...(world ? { atGoal: robot.atGoal(), bumps: robot.bumps } : {}), - led: robot.leds.some((c) => c !== undefined), - tone: state.robotActions.some((a) => a.method === 'playTone'), - screen: robot.screen, - actions: actionSignature(state.robotActions.filter((a) => !DRIVING.has(a.method))), - }) - if (state.inputRequest) { - const next = queue.shift() - if (next === undefined) return { ...done(), missingInput: true } - engine.provideInput(next) - if (state.inputErrorNotice) return { ...done(), error: state.inputErrorNotice } - continue - } - if (state.isHalted) return { ...done(), error: state.notice } - if (!engine.canStep) { - return { ...done(), unusedInputs: queue.length || undefined } - } - engine.step() - } - return { outputs: [...engine.state.outputLines], files: new Map(engine.state.files), drive: driveSignature(engine.state.robotActions), tooManySteps: true } -} - -/** Messwerte im Schritt `step`: je Sensor der Wert seiner Phase, ab der letzten Phase bleibt er. */ -function sensorsAt(sensors: ExerciseTest['sensors'], step: number): Record { - const phase = Math.floor(step / SENSOR_PHASE_STEPS) - return Object.fromEntries(Object.entries(sensors ?? {}).map(([name, values]) => [name, values[Math.min(phase, values.length - 1)]])) -} - -/** Zeilen einer gespeicherten Datei; der Zeilenumbruch am Ende beginnt keine neue Zeile. Fehlt die Datei: keine Zeilen. */ -export function fileLines(content: string | undefined): string[] { - return content === undefined || content === '' ? [] : content.replace(/\n$/, '').split('\n') -} - -/** Gleiche Ausgabe: Zeile für Zeile, Leerraum am Rand egal, `1.0` gleich `1`. */ -export function sameOutput(actual: string[], expected: string[]): boolean { - if (actual.length !== expected.length) return false - return actual.every((line, i) => normalize(line) === normalize(expected[i])) -} - -/** Stimmt die Ausgabe bis auf fehlende Zeilenumbrüche, z. B. zweimal `print` statt `println`? */ -export function onlyLineBreaksMissing(actual: string[], expected: string[]): boolean { - const joined = (lines: string[]) => lines.join('').replace(/\s+/g, '') - return actual.length > 0 && actual.length < expected.length && joined(actual) === joined(expected) -} - -function normalize(line: string): string { - const t = line.trim().replace(/\s+/g, ' ') - return /^-?\d+\.0+$/.test(t) ? t.replace(/\.0+$/, '') : t -} - -export interface TestOutcome { - test: ExerciseTest - result: RunResult - passed: boolean -} - -/** `subprograms` findet Unterprogramme für Aufrufe, z. B. in anderen Reitern; `worlds` die Weltkarten der VisuBot-Übungen. */ -export function checkExercise( - doc: VSDocument, - tests: ExerciseTest[], - subprograms?: SubprogramResolver, - worlds?: (name: string) => RobotWorldSetup | undefined, -): TestOutcome[] { - return tests.map((test) => { - const world = test.world ? worlds?.(test.world) : undefined - if (test.world && !world) throw new Error(`Weltkarte „${test.world}“ fehlt.`) - const result = runWithInputs(doc, test.inputs, subprograms, world, test.sensors) - const filesRight = (test.files ?? []).every((f) => sameOutput(fileLines(result.files?.get(f.name)), f.lines)) - const driveRight = !test.drive || sameOutput(result.drive ?? [], test.drive) - // Hat die Welt ein Ziel, muss der Roboter hin; anstoßen darf er nie. - const worldRight = !test.world || (result.bumps === 0 && (!(world?.goals?.length || world?.targets?.length) || result.atGoal === true)) - const robotRight = - (test.led === undefined || result.led === test.led) && - (test.tone === undefined || result.tone === test.tone) && - (test.screen === undefined || result.screen === test.screen) && - (test.drives === undefined || (result.drive?.length ?? 0) > 0 === test.drives) && - (!test.actions || sameOutput(result.actions ?? [], test.actions)) - const passed = - !result.error && - !result.missingInput && - !result.tooManySteps && - sameOutput(result.outputs, test.expected) && - filesRight && - driveRight && - worldRight && - robotRight - return { test, result, passed } - }) -} - -/** Welche Elementarten im Diagramm vorkommen (für „braucht: verzweigung“). */ -export function usedElementTypes(doc: VSDocument): Set { - const found = new Set() - const visit = (els: VSElement[]) => { - for (const e of els) { - found.add(e.type) - if (e.loopBody) visit(e.loopBody) - for (const c of e.cases ?? []) visit(c.elements) - } - } - visit(doc.elements) - return found -} - -/** Wie tief Schleifen höchstens ineinander stecken (für „schleifentiefe: 2“). */ -export function loopDepth(elements: VSElement[]): number { - const loops = [ElementType.forSchleife, ElementType.whileSchleife, ElementType.doUntilSchleife, ElementType.endlosschleife] - let best = 0 - for (const e of elements) { - const inner = Math.max(loopDepth(e.loopBody ?? []), ...(e.cases ?? []).map((c) => loopDepth(c.elements))) - best = Math.max(best, inner + (loops.includes(e.type) ? 1 : 0)) - } - return best -} diff --git a/web/src/core/flowModel.ts b/web/src/core/flowModel.ts deleted file mode 100644 index 07a0d8af..00000000 --- a/web/src/core/flowModel.ts +++ /dev/null @@ -1,242 +0,0 @@ -/** - * VisuFlow: Programmablaufplan (PAP, englisch flowchart) nach DIN 66001 frei zeichnen. - * Nur Zeichnen: keine Simulation, kein Code. Ein Plan besteht aus Symbolen (Mittelpunkt x/y) - * und Pfeilen vom Ausgang eines Symbols zum Eingang (oben) eines anderen. - */ - -export type FlowShape = 'start' | 'ende' | 'anweisung' | 'ein' | 'verzweigung' | 'unterprogramm' - -/** Ausgang eines Symbols: `out` unten, bei der Raute `ja` und `nein`. */ -export type FlowPort = 'out' | 'ja' | 'nein' - -export interface FlowNode { - id: string - shape: FlowShape - x: number - y: number - text: string -} - -export interface FlowEdge { - id: string - from: string - port: FlowPort - to: string -} - -export interface FlowDoc { - title: string - nodes: FlowNode[] - edges: FlowEdge[] - /** Raute: `true` = „ja“ geht nach rechts, „nein“ nach unten (Standard umgekehrt). */ - yesRight?: string[] -} - -export const FLOW_SHAPES: FlowShape[] = ['start', 'anweisung', 'ein', 'verzweigung', 'unterprogramm', 'ende'] - -export const FLOW_GRID = 20 - -/** Füllfarben wie im Lernbaustein „PAP bauen“ (papView.ts). */ -export const FLOW_FILL: Record = { - start: '#d1f2d9', - ende: '#d1f2d9', - anweisung: '#e5f0ff', - ein: '#f2e6ff', - verzweigung: '#fff4d6', - unterprogramm: '#e5f0ff', -} - -export type Measure = (text: string) => number - -export interface FlowBox { - x: number - y: number - w: number - h: number - lines: string[] -} - -export const FLOW_LINE_HEIGHT = 16 -const MAX_TEXT = 170 - -/** Text auf Zeilen umbrechen (an Leerzeichen, harte Umbrüche bleiben). */ -export function flowLines(text: string, max: number, measure: Measure): string[] { - const out: string[] = [] - for (const para of text.split('\n')) { - let line = '' - for (const word of para.split(/\s+/).filter(Boolean)) { - const next = line ? `${line} ${word}` : word - if (line && measure(next) > max) { - out.push(line) - line = word - } else line = next - } - out.push(line) - } - return out.length ? out : [''] -} - -const snap = (v: number) => Math.round(v / FLOW_GRID) * FLOW_GRID - -/** Größe eines Symbols aus seinem Text; Breite und Höhe auf das Raster gerundet. */ -export function flowBox(node: FlowNode, measure: Measure): FlowBox { - const lines = flowLines(node.text, MAX_TEXT, measure) - const textW = Math.max(0, ...lines.map(measure)) - const textH = lines.length * FLOW_LINE_HEIGHT - let w: number - let h: number - if (node.shape === 'verzweigung') { - // Raute: Text passt in das innere Rechteck, wenn Breite und Höhe doppelt so groß sind. - w = Math.max(140, textW * 1.7 + 30) - h = Math.max(80, textH * 1.8 + 24) - } else { - const pad = node.shape === 'ein' ? 44 : node.shape === 'unterprogramm' ? 40 : node.shape === 'anweisung' ? 24 : 36 - w = Math.max(node.shape === 'start' || node.shape === 'ende' ? 100 : 120, textW + pad) - h = Math.max(40, textH + 18) - } - return { x: node.x, y: node.y, w: Math.ceil(w / FLOW_GRID) * FLOW_GRID, h: Math.ceil(h / FLOW_GRID) * FLOW_GRID, lines } -} - -/** Welche Ausgänge ein Symbol hat. */ -export function flowPorts(shape: FlowShape): FlowPort[] { - if (shape === 'ende') return [] - if (shape === 'verzweigung') return ['ja', 'nein'] - return ['out'] -} - -export const hasInput = (shape: FlowShape) => shape !== 'start' - -type Side = 'bottom' | 'right' - -/** Seite eines Ausgangs. Raute: Standard „ja“ unten, „nein“ rechts; umschaltbar. */ -export function portSide(doc: FlowDoc, node: FlowNode, port: FlowPort): Side { - if (port === 'out') return 'bottom' - const yesRight = doc.yesRight?.includes(node.id) ?? false - return (port === 'ja') === yesRight ? 'right' : 'bottom' -} - -export function portPoint(box: FlowBox, side: Side): [number, number] { - return side === 'bottom' ? [box.x, box.y + box.h / 2] : [box.x + box.w / 2, box.y] -} - -export const inputPoint = (box: FlowBox): [number, number] => [box.x, box.y - box.h / 2] - -/** - * Rechtwinkliger Weg eines Pfeils vom Ausgang zum Eingang oben. Geht es nach oben zurück (Schleife), - * läuft der Pfeil rechts an beiden Symbolen vorbei. - */ -export function routeEdge(from: FlowBox, side: Side, to: FlowBox, lane = 0): [number, number][] { - const [sx, sy] = portPoint(from, side) - const [tx, ty] = inputPoint(to) - const gap = FLOW_GRID - const outside = Math.max(from.x + from.w / 2, to.x + to.w / 2) + gap * (1.5 + lane) - if (side === 'bottom') { - if (ty >= sy + gap) { - if (sx === tx) return [[sx, sy], [tx, ty]] - const my = sy + gap - return [[sx, sy], [sx, my], [tx, my], [tx, ty]] - } - return [[sx, sy], [sx, sy + gap], [outside, sy + gap], [outside, ty - gap], [tx, ty - gap], [tx, ty]] - } - // Ausgang rechts; liegt das Ziel rechts daneben auf gleicher Höhe, endet der Pfeil links an seiner Seite. - const left = to.x - to.w / 2 - if (left >= sx + gap && Math.abs(to.y - sy) < to.h / 2) return [[sx, sy], [left, sy]] - if (ty >= sy + gap) { - if (tx >= sx + gap) return [[sx, sy], [tx, sy], [tx, ty]] - const rx = sx + gap - return [[sx, sy], [rx, sy], [rx, ty - gap], [tx, ty - gap], [tx, ty]] - } - const rx = Math.max(sx + gap, outside) - return [[sx, sy], [rx, sy], [rx, ty - gap], [tx, ty - gap], [tx, ty]] -} - -// MARK: - Bearbeiten (immer neue Objekte, damit Rückgängig einfach den alten Stand behält) - -export function emptyFlow(title = ''): FlowDoc { - return { title, nodes: [], edges: [] } -} - -export function nextId(doc: FlowDoc, prefix: 'n' | 'e'): string { - const used = new Set([...doc.nodes.map((n) => n.id), ...doc.edges.map((e) => e.id)]) - let i = 1 - while (used.has(`${prefix}${i}`)) i++ - return `${prefix}${i}` -} - -export function addNode(doc: FlowDoc, shape: FlowShape, x: number, y: number, text: string): { doc: FlowDoc; id: string } { - const id = nextId(doc, 'n') - return { doc: { ...doc, nodes: [...doc.nodes, { id, shape, x: snap(x), y: snap(y), text }] }, id } -} - -export function moveNode(doc: FlowDoc, id: string, x: number, y: number): FlowDoc { - return { ...doc, nodes: doc.nodes.map((n) => (n.id === id ? { ...n, x: Math.max(FLOW_GRID * 4, snap(x)), y: Math.max(FLOW_GRID * 2, snap(y)) } : n)) } -} - -export function setText(doc: FlowDoc, id: string, text: string): FlowDoc { - return { ...doc, nodes: doc.nodes.map((n) => (n.id === id ? { ...n, text } : n)) } -} - -/** Pfeil ziehen: Ein Ausgang hat höchstens einen Pfeil, ein neuer ersetzt den alten. */ -export function connect(doc: FlowDoc, from: string, port: FlowPort, to: string): FlowDoc { - const a = doc.nodes.find((n) => n.id === from) - const b = doc.nodes.find((n) => n.id === to) - if (!a || !b || from === to || !flowPorts(a.shape).includes(port) || !hasInput(b.shape)) return doc - const edges = doc.edges.filter((e) => !(e.from === from && e.port === port)) - return { ...doc, edges: [...edges, { id: nextId(doc, 'e'), from, port, to }] } -} - -export function freePort(doc: FlowDoc, node: FlowNode): FlowPort | undefined { - return flowPorts(node.shape).find((p) => !doc.edges.some((e) => e.from === node.id && e.port === p)) -} - -export function removeNode(doc: FlowDoc, id: string): FlowDoc { - return { - ...doc, - nodes: doc.nodes.filter((n) => n.id !== id), - edges: doc.edges.filter((e) => e.from !== id && e.to !== id), - yesRight: doc.yesRight?.filter((n) => n !== id), - } -} - -export function removeEdge(doc: FlowDoc, id: string): FlowDoc { - return { ...doc, edges: doc.edges.filter((e) => e.id !== id) } -} - -/** Raute: „ja“ und „nein“ tauschen die Seiten (die Pfeile bleiben an ihrem Ausgang). */ -export function swapYesNo(doc: FlowDoc, id: string): FlowDoc { - const set = new Set(doc.yesRight ?? []) - if (set.has(id)) set.delete(id) - else set.add(id) - return { ...doc, yesRight: [...set] } -} - -// MARK: - Datei (.visuflow, JSON) - -export function flowToJSON(doc: FlowDoc): string { - return JSON.stringify({ format: 'visuflow', version: 1, ...doc }, null, 2) -} - -export function flowFromJSON(text: string): FlowDoc | undefined { - let raw: unknown - try { - raw = JSON.parse(text) - } catch { - return undefined - } - if (!raw || typeof raw !== 'object') return undefined - const r = raw as Record - if (!Array.isArray(r.nodes) || !Array.isArray(r.edges)) return undefined - const nodes: FlowNode[] = [] - for (const n of r.nodes as Record[]) { - if (!n || typeof n.id !== 'string' || !FLOW_SHAPES.includes(n.shape as FlowShape)) continue - if (!Number.isFinite(n.x) || !Number.isFinite(n.y) || nodes.some((m) => m.id === n.id)) continue - nodes.push({ id: n.id, shape: n.shape as FlowShape, x: n.x as number, y: n.y as number, text: typeof n.text === 'string' ? n.text : '' }) - } - let doc: FlowDoc = { title: typeof r.title === 'string' ? r.title : '', nodes, edges: [] } - for (const e of r.edges as Record[]) { - if (!e || typeof e.from !== 'string' || typeof e.to !== 'string' || typeof e.port !== 'string') continue - doc = connect(doc, e.from, e.port as FlowPort, e.to) - } - if (Array.isArray(r.yesRight)) doc.yesRight = (r.yesRight as unknown[]).filter((id): id is string => typeof id === 'string' && nodes.some((n) => n.id === id)) - return doc -} diff --git a/web/src/core/javaFormat.ts b/web/src/core/javaFormat.ts deleted file mode 100644 index d7ee4d28..00000000 --- a/web/src/core/javaFormat.ts +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Java-Code formatieren wie „Formatieren“ in Eclipse, aber vorsichtig: Es ändert nur Leerraum zwischen den - * Wörtern und Zeichen, nie den Code selbst. Jede Block-Klammer `{`/`}` bekommt ihre eigene Zeile (`} else {` - * bleibt zusammen), jede Anweisung eine eigene Zeile, um Operatoren wie `>=` und `=` steht ein Leerzeichen. - * Danach rückt `indentJava` ein. Zeilen werden nur getrennt, nie zusammengezogen. - */ -import { indentJava } from './javaIndent' - -export interface FormatEdit { - from: number - to: number - insert: string -} - -type Kind = 'word' | 'num' | 'str' | 'comment' | 'op' | 'other' - -interface Token { - kind: Kind - text: string - from: number - to: number - /** Zeile (ab 1), in der das Zeichen beginnt. */ - line: number -} - -// Längste zuerst. `>>` und `>>>` fehlen absichtlich: Sie schließen oft zwei Generics wie `List>`. -const operators = ['>>>=', '<<=', '>>=', '...', '->', '::', '++', '--', '&&', '||', '==', '!=', '<=', '>=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<'] -const alwaysBinary = new Set(['=', '==', '!=', '<=', '>=', '&&', '||', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=', '>>=', '>>>=', '->', '&', '|', '^', '<<']) -const arithmetic = new Set(['+', '-', '*', '/', '%']) -/** Wörter, nach denen ein `-` oder `+` zur Zahl gehört (`return -1`). */ -const notValue = new Set(['return', 'case', 'throw', 'new', 'else', 'do', 'yield', 'assert', 'instanceof']) -const primitive = new Set(['byte', 'short', 'int', 'long', 'float', 'double', 'char', 'boolean']) -const control = new Set(['if', 'for', 'while', 'switch', 'catch', 'synchronized', 'try']) -const joinAfterBrace = new Set(['else', 'catch', 'finally']) - -function tokenize(text: string): Token[] { - const tokens: Token[] = [] - let line = 1 - let i = 0 - const push = (kind: Kind, end: number) => { - tokens.push({ kind, text: text.slice(i, end), from: i, to: end, line }) - for (let k = i; k < end; k++) if (text[k] === '\n') line++ - i = end - } - while (i < text.length) { - const c = text[i] - const rest = text.slice(i, i + 4) - if (c === '\n') { - line++ - i++ - } else if (/\s/.test(c)) i++ - else if (rest.startsWith('//')) { - const end = text.indexOf('\n', i) - push('comment', end < 0 ? text.length : end) - } else if (rest.startsWith('/*')) { - const end = text.indexOf('*/', i + 2) - push('comment', end < 0 ? text.length : end + 2) - } else if (rest.startsWith('"""')) { - const end = text.indexOf('"""', i + 3) - push('str', end < 0 ? text.length : end + 3) - } else if (c === '"' || c === "'") { - let k = i + 1 - while (k < text.length && text[k] !== c && text[k] !== '\n') k += text[k] === '\\' ? 2 : 1 - push('str', Math.min(text.length, k + 1)) - } else if (/[\d]/.test(c) || (c === '.' && /\d/.test(text[i + 1] ?? ''))) { - const m = /^(?:0[xXbB][\da-fA-F_]+|[\d_]*\.?[\d_]*(?:[eE][+-]?\d+)?)[a-zA-Z]*/.exec(text.slice(i))! - push('num', i + Math.max(1, m[0].length)) - } else if (/[\p{L}_$]/u.test(c)) { - const m = /^[\p{L}\p{N}_$]+/u.exec(text.slice(i))! - push('word', i + m[0].length) - } else { - const op = operators.find((o) => text.startsWith(o, i)) - push(op ? 'op' : 'other', i + (op?.length ?? 1)) - } - } - return tokens -} - -/** Endet hier ein Wert, sodass ein folgendes `-` rechnet statt ein Vorzeichen zu sein? */ -function endsValue(tokens: Token[], i: number): boolean { - const t = tokens[i] - if (!t) return false - if (t.kind === 'num' || t.kind === 'str') return true - if (t.kind === 'word') return !notValue.has(t.text) - if (t.text === ']') return true - // `(int) -x` ist eine Typumwandlung mit Vorzeichen. - if (t.text === ')') return !(primitive.has(tokens[i - 1]?.text ?? '') && tokens[i - 2]?.text === '(') - return false -} - -const upper = (t: Token | undefined) => t?.kind === 'word' && /^\p{Lu}/u.test(t.text) - -/** Änderungen am Leerraum, nur in den Zeilen `fromLine`…`toLine` (ab 1). */ -export function formatJavaEdits(text: string, fromLine = 1, toLine = Number.MAX_SAFE_INTEGER): FormatEdit[] { - const tokens = tokenize(text) - const n = tokens.length - const binary: boolean[] = new Array(n).fill(false) - const blockBrace: boolean[] = new Array(n).fill(false) - const match: number[] = new Array(n).fill(-1) - const afterDo: boolean[] = new Array(n).fill(false) - const statementEnd: boolean[] = new Array(n).fill(false) - - // Klammern zuordnen: Block-Klammern gegen Array-Initialisierer, Klammertiefe je Block für `for (…;…;…)`. - const frames: { at: number; block: boolean; paren: number }[] = [{ at: -1, block: true, paren: 0 }] - let generic = 0 - let ternary = 0 - tokens.forEach((t, i) => { - const prev = tokens[i - 1] - const top = frames.at(-1)! - if (t.kind === 'comment') return - if (t.text === '(') top.paren++ - else if (t.text === ')') top.paren = Math.max(0, top.paren - 1) - else if (t.text === '{') { - const p = prev?.text ?? '' - const init = ['=', ',', ']', '('].includes(p) || (p === '{' && !blockBrace[i - 1]) - blockBrace[i] = !init - afterDo[i] = p === 'do' - frames.push({ at: i, block: !init, paren: 0 }) - } else if (t.text === '}') { - if (frames.length > 1) { - const open = frames.pop()! - blockBrace[i] = open.block - match[i] = open.at - match[open.at] = i - afterDo[i] = afterDo[open.at] - } else blockBrace[i] = true - } else if (t.text === ';') { - statementEnd[i] = top.block && top.paren === 0 - ternary = 0 - } else if (t.text === '?' && prev?.text !== '<' && ![')', ';', ',', undefined].includes(tokens[i + 1]?.text)) { - // Ein Fragezeichen am Ende wie in `if (Alter über 18?)` ist Pseudocode, kein `a ? b : c`. - binary[i] = true - ternary++ - } else if (t.text === ':') { - // `a ? b : c` und `for (int x : zahlen)`, aber nicht `case 1:`. - binary[i] = ternary > 0 || top.paren > 0 - if (ternary > 0) ternary-- - } else if (t.text === '<') { - const next = tokens[i + 1] - if ((upper(prev) || prev?.text === '.') && (upper(next) || next?.text === '>' || next?.text === '?')) generic++ - else binary[i] = !(prev?.text === '<' || next?.text === '<') - } else if (t.text === '>') { - if (generic > 0) generic-- - else binary[i] = !(prev?.text === '>' || tokens[i + 1]?.text === '>') - } else if (alwaysBinary.has(t.text)) binary[i] = true - else if (arithmetic.has(t.text)) binary[i] = endsValue(tokens, i - 1) - }) - - const edits: FormatEdit[] = [] - for (let i = 1; i < n; i++) { - const a = tokens[i - 1] - const b = tokens[i] - const gap = text.slice(a.to, b.from) - if (gap.includes('\n') || a.line < fromLine || a.line > toLine) continue - if (a.kind === 'comment') continue - let want: string | undefined - if (b.kind === 'comment') want = undefined - else if (blockBrace[i - 1] && a.text === '{' && match[i - 1] !== i) want = '\n' - else if (blockBrace[i] && b.text === '}' && match[i] !== i - 1) want = '\n' - else if (blockBrace[i - 1] && a.text === '}') { - if (joinAfterBrace.has(b.text) || (b.text === 'while' && afterDo[i - 1])) want = ' ' - else if (![')', ';', ',', '.'].includes(b.text)) want = '\n' - } else if (statementEnd[i - 1]) want = '\n' - else if (b.text === ',' || b.text === ';') want = '' - else if (a.text === ',') want = ' ' - else if (a.text === ';') want = b.text === ')' ? '' : ' ' - else if (a.text === '(' || b.text === ')') want = '' - else if (b.text === '(' && control.has(a.text)) want = ' ' - else if (b.text === '{' && blockBrace[i]) want = ' ' - else if (binary[i - 1] || binary[i]) want = ' ' - if (want !== undefined && want !== gap) edits.push({ from: a.to, to: b.from, insert: want }) - } - return edits -} - -/** Code formatieren und einrücken; nur die Zeilen `fromLine`…`toLine` (ab 1) werden angefasst. */ -export function formatJava(text: string, fromLine = 1, toLine = Number.MAX_SAFE_INTEGER): string { - const edits = formatJavaEdits(text, fromLine, toLine) - let out = '' - let pos = 0 - for (const e of edits) { - out += text.slice(pos, e.from) + e.insert - pos = e.to - } - out += text.slice(pos) - // Die angefassten Zeilen nach dem Trennen: Neue Zeilenumbrüche verschieben das Ende nach unten. - const lines = text.split('\n').length - const added = edits.reduce((sum, e) => sum + (e.insert === '\n' ? 1 : 0), 0) - const to = toLine >= lines ? Number.MAX_SAFE_INTEGER : toLine + added - return indentJava(out, fromLine, to) -} diff --git a/web/src/core/javaIndent.ts b/web/src/core/javaIndent.ts deleted file mode 100644 index 04434c7d..00000000 --- a/web/src/core/javaIndent.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Java-Code einrücken wie Eclipse oder IntelliJ: vier Leerzeichen je Ebene, `case` eine Ebene tiefer als - * `switch`, die Anweisungen eines klassischen `case …:` noch eine tiefer. Zählt nur Klammern, damit auch - * halbfertiger Code und Pseudocode wie `if (Alter über 18?)` sauber eingerückt werden. - */ - -const unit = ' ' - -interface Open { - /** Zeile, in der die Klammer aufgeht: Mehrere Klammern in einer Zeile ergeben nur eine Ebene. */ - line: number - char: string - /** `{` eines klassischen `switch`, in dem gerade ein `case …:` offen ist. */ - inCase?: boolean -} - -/** Klammern einer Zeile ohne Zeichenketten und Kommentare; `comment` sagt, ob ein Blockkommentar offen bleibt. */ -function brackets(text: string, inComment: boolean): { chars: string; comment: boolean } { - let chars = '' - let comment = inComment - for (let i = 0; i < text.length; i++) { - const c = text[i] - if (comment) { - if (c === '*' && text[i + 1] === '/') { - comment = false - i++ - } - } else if (c === '/' && text[i + 1] === '/') break - else if (c === '/' && text[i + 1] === '*') { - comment = true - i++ - } else if (c === '"' || c === "'") { - for (i++; i < text.length && text[i] !== c; i++) if (text[i] === '\\') i++ - } else if ('{}()[]'.includes(c)) chars += c - } - return { chars, comment } -} - -/** Ebene: wie viele verschiedene Zeilen noch offene Klammern haben, plus ein offenes `case`. */ -function level(stack: Open[]): number { - let n = 0 - let last = -1 - for (const open of stack) { - if (open.line !== last) n++ - last = open.line - if (open.inCase) n++ - } - return n -} - -const caseLabel = /^(case\b|default\b)/ -const classicCase = /^(case\b.*|default\s*):\s*(\/\/.*)?$/ - -/** Zeilen `fromLine`…`toLine` (ab 1) neu einrücken; die übrigen bleiben, wie sie sind. */ -export function indentJava(text: string, fromLine = 1, toLine = Number.MAX_SAFE_INTEGER): string { - const stack: Open[] = [] - let comment = false - return text - .split('\n') - .map((line, i) => { - const trimmed = line.trim() - const inComment = comment - const { chars, comment: stillComment } = brackets(line, comment) - comment = stillComment - // Schließende Klammern am Zeilenanfang gehören schon zur äußeren Ebene. - const lead = inComment ? 0 : (/^[}\])\s]*/.exec(trimmed)![0].match(/[}\])]/g)?.length ?? 0) - const outer = stack.slice(0, Math.max(0, stack.length - lead)) - if (caseLabel.test(trimmed) && outer.at(-1)?.inCase) outer.at(-1)!.inCase = false - const depth = level(outer) - for (const c of chars) { - if ('{[('.includes(c)) stack.push({ line: i, char: c }) - else stack.pop() - } - const top = stack.at(-1) - if (top?.line === i && top.char === '{' && /^switch\b/.test(trimmed)) top.char = 'switch' - if (top?.char === 'switch' && classicCase.test(trimmed)) top.inCase = true - const n = i + 1 - // Zeilen in einem Blockkommentar bleiben, wie sie sind. - if (n < fromLine || n > toLine || (inComment && !trimmed.startsWith('*'))) return line - if (trimmed === '') return '' - return unit.repeat(depth) + (inComment ? ' ' : '') + trimmed - }) - .join('\n') -} diff --git a/web/src/core/javaMembers.ts b/web/src/core/javaMembers.ts deleted file mode 100644 index 76ef5d7e..00000000 --- a/web/src/core/javaMembers.ts +++ /dev/null @@ -1,507 +0,0 @@ -/** - * Vorschläge nach dem Punkt: `eingabe.` → nextInt(), nextLine() … - * Der Typ kommt aus der Deklaration im eigenen Code (`Scanner eingabe = …`), der Variablenname ist beliebig. - * Nur die Klassen und Methoden, die in den Lektionen vorkommen, mit kurzer Beschreibung für Anfänger. - */ - -export type MemberLanguage = 'de' | 'en' | 'pt' - -export interface JavaMember { - name: string - /** Methode (mit Klammern) oder Feld wie `length` bei Arrays. */ - kind: 'method' | 'field' - /** Methode erwartet Werte in den Klammern. */ - params: boolean - /** Typ des Ergebnisses, für Ketten wie `eingabe.nextLine().` */ - returns: string - description: string -} - -/** [Name, Klammerinhalt (leer = keine Werte, null = Feld), Ergebnistyp, de, en, pt] */ -type Row = [string, string | null, string, string, string, string] - -const scanner: Row[] = [ - ['nextInt', '', 'int', 'Ganze Zahl einlesen', 'Read a whole number', 'Ler um número inteiro'], - ['nextDouble', '', 'double', 'Kommazahl einlesen', 'Read a decimal number', 'Ler um número decimal'], - ['nextLine', '', 'String', 'Ganze Zeile als Text einlesen', 'Read a whole line as text', 'Ler uma linha inteira como texto'], - ['next', '', 'String', 'Ein Wort einlesen (bis zum Leerzeichen)', 'Read one word (up to a space)', 'Ler uma palavra (até ao espaço)'], - ['nextBoolean', '', 'boolean', 'true oder false einlesen', 'Read true or false', 'Ler true ou false'], - ['nextLong', '', 'long', 'Große ganze Zahl einlesen', 'Read a large whole number', 'Ler um número inteiro grande'], - ['hasNextInt', '', 'boolean', 'Kommt als Nächstes eine ganze Zahl?', 'Is the next input a whole number?', 'A próxima entrada é um número inteiro?'], - ['hasNextDouble', '', 'boolean', 'Kommt als Nächstes eine Kommazahl?', 'Is the next input a decimal number?', 'A próxima entrada é um número decimal?'], - ['hasNextLine', '', 'boolean', 'Gibt es noch eine Zeile?', 'Is there another line?', 'Existe mais uma linha?'], - ['hasNext', '', 'boolean', 'Gibt es noch ein Wort?', 'Is there another word?', 'Existe mais uma palavra?'], - ['close', '', 'void', 'Eingabe schließen', 'Close the input', 'Fechar a entrada'], -] - -const string: Row[] = [ - ['length', '', 'int', 'Anzahl der Zeichen', 'Number of characters', 'Número de caracteres'], - ['charAt', 'index', 'char', 'Zeichen an Stelle index (ab 0)', 'Character at position index (from 0)', 'Carácter na posição index (a partir de 0)'], - ['equals', 'text', 'boolean', 'Gleicher Text? (statt ==)', 'Same text? (instead of ==)', 'Mesmo texto? (em vez de ==)'], - ['equalsIgnoreCase', 'text', 'boolean', 'Gleicher Text, groß/klein egal?', 'Same text, ignoring case?', 'Mesmo texto, ignorando maiúsculas?'], - ['compareTo', 'text', 'int', 'Alphabetisch vergleichen (<0, 0, >0)', 'Compare alphabetically (<0, 0, >0)', 'Comparar alfabeticamente (<0, 0, >0)'], - ['substring', 'von, bis', 'String', 'Teiltext von Stelle von bis vor bis', 'Part of the text from start up to before end', 'Parte do texto do início até antes do fim'], - ['indexOf', 'text', 'int', 'Erste Stelle des Textes (−1 = fehlt)', 'First position of the text (−1 = missing)', 'Primeira posição do texto (−1 = não existe)'], - ['lastIndexOf', 'text', 'int', 'Letzte Stelle des Textes (−1 = fehlt)', 'Last position of the text (−1 = missing)', 'Última posição do texto (−1 = não existe)'], - ['contains', 'text', 'boolean', 'Kommt der Text darin vor?', 'Does it contain the text?', 'Contém o texto?'], - ['startsWith', 'text', 'boolean', 'Fängt damit an?', 'Starts with it?', 'Começa com isto?'], - ['endsWith', 'text', 'boolean', 'Hört damit auf?', 'Ends with it?', 'Termina com isto?'], - ['toUpperCase', '', 'String', 'In GROSSBUCHSTABEN', 'In UPPER CASE', 'Em MAIÚSCULAS'], - ['toLowerCase', '', 'String', 'In kleinbuchstaben', 'In lower case', 'Em minúsculas'], - ['trim', '', 'String', 'Leerzeichen vorn und hinten weg', 'Remove spaces at both ends', 'Remover espaços no início e no fim'], - ['replace', 'alt, neu', 'String', 'Text ersetzen', 'Replace text', 'Substituir texto'], - ['split', 'trenner', 'String[]', 'In Teile zerlegen, z. B. split(";")', 'Split into parts, e.g. split(";")', 'Dividir em partes, p. ex. split(";")'], - ['isEmpty', '', 'boolean', 'Leerer Text?', 'Empty text?', 'Texto vazio?'], - ['toCharArray', '', 'char[]', 'Als Array von Zeichen', 'As an array of characters', 'Como array de caracteres'], -] - -const printStream: Row[] = [ - ['println', 'wert', 'void', 'Ausgeben, danach neue Zeile', 'Print, then a new line', 'Escrever e mudar de linha'], - ['print', 'wert', 'void', 'Ausgeben ohne neue Zeile', 'Print without a new line', 'Escrever sem mudar de linha'], - ['printf', 'format, werte', 'PrintStream', 'Formatiert ausgeben, z. B. "%.2f"', 'Print formatted, e.g. "%.2f"', 'Escrever formatado, p. ex. "%.2f"'], -] - -const printWriter: Row[] = [...printStream, ['close', '', 'void', 'Datei speichern und schließen', 'Save and close the file', 'Guardar e fechar o ficheiro']] - -const bufferedReader: Row[] = [ - ['readLine', '', 'String', 'Nächste Zeile lesen (null = Ende)', 'Read the next line (null = end)', 'Ler a próxima linha (null = fim)'], - ['close', '', 'void', 'Datei schließen', 'Close the file', 'Fechar o ficheiro'], -] - -const file: Row[] = [ - ['exists', '', 'boolean', 'Gibt es die Datei?', 'Does the file exist?', 'O ficheiro existe?'], - ['getName', '', 'String', 'Name der Datei', 'Name of the file', 'Nome do ficheiro'], - ['length', '', 'long', 'Größe in Bytes', 'Size in bytes', 'Tamanho em bytes'], -] - -const exception: Row[] = [ - ['getMessage', '', 'String', 'Fehlermeldung als Text', 'Error message as text', 'Mensagem de erro como texto'], - ['printStackTrace', '', 'void', 'Fehler mit Zeilen ausgeben', 'Print the error with its lines', 'Mostrar o erro com as linhas'], -] - -const actionEvent: Row[] = [ - ['getSource', '', 'Object', 'Welcher Knopf wurde geklickt?', 'Which button was clicked?', 'Que botão foi clicado?'], - ['getActionCommand', '', 'String', 'Beschriftung des Knopfs', 'Label of the button', 'Texto do botão'], -] - -// Gemeinsam für alle Swing-Bausteine (JFrame, JButton, JLabel, JTextField, JPanel). -const component: Row[] = [ - ['setBackground', 'farbe', 'void', 'Hintergrundfarbe, z. B. Color.RED', 'Background colour, e.g. Color.RED', 'Cor de fundo, p. ex. Color.RED'], - ['setForeground', 'farbe', 'void', 'Schriftfarbe', 'Text colour', 'Cor do texto'], - ['setFont', 'schrift', 'void', 'Schrift, z. B. new Font("Arial", Font.BOLD, 24)', 'Font, e.g. new Font("Arial", Font.BOLD, 24)', 'Letra, p. ex. new Font("Arial", Font.BOLD, 24)'], - ['setVisible', 'true', 'void', 'Anzeigen (true) oder verstecken (false)', 'Show (true) or hide (false)', 'Mostrar (true) ou esconder (false)'], - ['setEnabled', 'true', 'void', 'Anklickbar (true) oder grau (false)', 'Clickable (true) or greyed out (false)', 'Clicável (true) ou cinzento (false)'], - ['setSize', 'breite, höhe', 'void', 'Größe in Pixeln', 'Size in pixels', 'Tamanho em píxeis'], -] - -const container: Row[] = [ - ['add', 'baustein', 'Component', 'Baustein hinzufügen', 'Add a component', 'Adicionar um componente'], - ['setLayout', 'layout', 'void', 'Anordnung, z. B. new FlowLayout()', 'Layout, e.g. new FlowLayout()', 'Disposição, p. ex. new FlowLayout()'], - ['remove', 'baustein', 'void', 'Baustein entfernen', 'Remove a component', 'Remover um componente'], -] - -const jframe: Row[] = [ - ['setTitle', 'text', 'void', 'Titel oben im Fenster', 'Title at the top of the window', 'Título no topo da janela'], - ['setDefaultCloseOperation', 'JFrame.EXIT_ON_CLOSE', 'void', 'Was beim Schließen passiert', 'What happens when closing', 'O que acontece ao fechar'], - ['setLocationRelativeTo', 'null', 'void', 'Mit null: Fenster in die Mitte', 'With null: centre the window', 'Com null: janela no centro'], - ['setResizable', 'false', 'void', 'Größe änderbar?', 'Can the size change?', 'Pode mudar de tamanho?'], - ['pack', '', 'void', 'Größe passend zum Inhalt', 'Size to fit the content', 'Tamanho ajustado ao conteúdo'], - ['getContentPane', '', 'JPanel', 'Inhaltsfläche des Fensters', 'Content area of the window', 'Área de conteúdo da janela'], - ['dispose', '', 'void', 'Fenster schließen', 'Close the window', 'Fechar a janela'], -] - -const textHolder: Row[] = [ - ['setText', 'text', 'void', 'Text setzen', 'Set the text', 'Definir o texto'], - ['getText', '', 'String', 'Text holen', 'Get the text', 'Obter o texto'], -] - -const jbutton: Row[] = [ - ['addActionListener', 'e -> { }', 'void', 'Was beim Klick passiert', 'What happens on click', 'O que acontece ao clicar'], - ['setOpaque', 'true', 'void', 'Hintergrund sichtbar (für Farben)', 'Show the background (for colours)', 'Mostrar o fundo (para cores)'], - ['setBorderPainted', 'false', 'void', 'Rahmen zeichnen?', 'Draw the border?', 'Desenhar a borda?'], -] - -const jlabel: Row[] = [ - ['setOpaque', 'true', 'void', 'Hintergrund sichtbar (für Farben)', 'Show the background (for colours)', 'Mostrar o fundo (para cores)'], - ['setHorizontalAlignment', 'JLabel.CENTER', 'void', 'Text links, mittig oder rechts', 'Text left, centre or right', 'Texto à esquerda, centro ou direita'], -] - -const jtextfield: Row[] = [ - ['addActionListener', 'e -> { }', 'void', 'Was bei Enter passiert', 'What happens on Enter', 'O que acontece ao carregar em Enter'], - ['setEditable', 'false', 'void', 'Darf man hineinschreiben?', 'Can you type into it?', 'Pode-se escrever?'], - ['setColumns', 'anzahl', 'void', 'Breite in Zeichen', 'Width in characters', 'Largura em caracteres'], - ['requestFocus', '', 'void', 'Cursor hineinsetzen', 'Put the cursor into it', 'Pôr o cursor no campo'], -] - -const array: Row[] = [['length', null, 'int', 'Anzahl der Elemente (ohne Klammern)', 'Number of elements (no brackets)', 'Número de elementos (sem parênteses)']] - -/** `E` = Typ der Elemente, z. B. `Spieler` bei `ArrayList`. */ -const arrayList: Row[] = [ - ['add', 'wert', 'boolean', 'Element hinten anhängen', 'Append an element at the end', 'Acrescentar um elemento no fim'], - ['get', 'index', 'E', 'Element an Stelle index holen (ab 0)', 'Get the element at index (from 0)', 'Obter o elemento na posição index (a partir de 0)'], - ['size', '', 'int', 'Anzahl der Elemente', 'Number of elements', 'Número de elementos'], - ['set', 'index, wert', 'E', 'Element an Stelle index ersetzen', 'Replace the element at index', 'Substituir o elemento na posição index'], - ['remove', 'index', 'E', 'Element an Stelle index entfernen', 'Remove the element at index', 'Remover o elemento na posição index'], - ['contains', 'wert', 'boolean', 'Ist das Element in der Liste?', 'Is the element in the list?', 'O elemento está na lista?'], - ['indexOf', 'wert', 'int', 'Stelle des Elements (-1 = nicht da)', 'Position of the element (-1 = not found)', 'Posição do elemento (-1 = não existe)'], - ['isEmpty', '', 'boolean', 'Ist die Liste leer?', 'Is the list empty?', 'A lista está vazia?'], - ['clear', '', 'void', 'Alle Elemente entfernen', 'Remove all elements', 'Remover todos os elementos'], -] - -/** Methoden an Objekten; Basisklassen über `extendsOf`. */ -const instance: Record = { - Scanner: scanner, - String: string, - PrintStream: printStream, - PrintWriter: printWriter, - BufferedReader: bufferedReader, - FileReader: [['close', '', 'void', 'Datei schließen', 'Close the file', 'Fechar o ficheiro']], - File: file, - Exception: exception, - ActionEvent: actionEvent, - Component: component, - Container: container, - JFrame: jframe, - JPanel: [], - JButton: jbutton, - JLabel: jlabel, - JTextField: jtextfield, - TextHolder: textHolder, - ArrayList: arrayList, - List: arrayList, - LinkedList: arrayList, - // `mbot.led(0).` → setColor - LED: [['setColor', 'farbe', 'void', 'Farbe der LED, z. B. "grün" oder "aus"', 'Colour of the LED, e.g. "green" or "off"', 'Cor do LED, p. ex. "green" ou "off"']], -} - -const extendsOf: Record = { - JFrame: ['Container', 'Component'], - JPanel: ['Container', 'Component'], - JButton: ['TextHolder', 'Component'], - JLabel: ['TextHolder', 'Component'], - JTextField: ['TextHolder', 'Component'], - PrintWriter: [], -} - -/** Klassenname mit Punkt: `Math.`, `System.`, `Integer.` … */ -const statics: Record = { - // mBot2 (siehe mbot.ts): fester Name wie `System.out`, ohne eigenes Objekt anzulegen. - mbot: [ - ['forward', 'cm', 'void', 'Geradeaus vorwärts fahren', 'Drive forward', 'Andar para a frente'], - ['forward', 'wert, "Umdrehungen"', 'void', 'Überladen: mit Einheit "cm" oder "Umdrehungen" (1 Umdrehung ≈ 20,4 cm)', 'Overloaded: with unit "cm" or "rotations" (1 rotation ≈ 20.4 cm)', 'Sobrecarregado: com unidade "cm" ou "rotações" (1 rotação ≈ 20,4 cm)'], - ['backward', 'cm', 'void', 'Rückwärts fahren', 'Drive backward', 'Andar para trás'], - ['backward', 'wert, "Umdrehungen"', 'void', 'Überladen: rückwärts mit Einheit "cm" oder "Umdrehungen"', 'Overloaded: backward with unit "cm" or "rotations"', 'Sobrecarregado: para trás com unidade "cm" ou "rotações"'], - ['turnLeft', 'grad', 'void', 'Auf der Stelle nach links drehen', 'Turn left on the spot', 'Rodar para a esquerda'], - ['turnRight', 'grad', 'void', 'Auf der Stelle nach rechts drehen', 'Turn right on the spot', 'Rodar para a direita'], - ['stop', '', 'void', 'Motoren anhalten', 'Stop the motors', 'Parar os motores'], - ['drive', 'links, rechts', 'void', 'Räder einzeln in Prozent (−100–100), fährt weiter bis stop()', 'Wheels separately in percent (−100–100), keeps going until stop()', 'Rodas separadas em percentagem (−100–100), continua até stop()'], - ['resetTimer', '', 'void', 'Stoppuhr auf 0 setzen', 'Reset the stopwatch to 0', 'Pôr o cronómetro a 0'], - ['pause', 'ms', 'void', 'Millisekunden warten', 'Wait milliseconds', 'Esperar milissegundos'], - ['setLed', 'rot, gruen, blau', 'void', 'LEDs in einer Farbe (je 0–255)', 'LEDs in a colour (0–255 each)', 'LEDs numa cor (0–255 cada)'], - ['ledOff', '', 'void', 'LEDs aus', 'LEDs off', 'Desligar LEDs'], - ['led', 'nr', 'LED', 'Eine LED (0–4), dann .setColor("grün") oder .setColor("aus")', 'One LED (0–4), then .setColor("green") or .setColor("off")', 'Um LED (0–4), depois .setColor("green") ou .setColor("off")'], - ['showText', '"Hallo"', 'void', 'Text auf dem Bildschirm zeigen', 'Show text on the screen', 'Mostrar texto no ecrã'], - ['emotion', '"smile"', 'void', 'Gefühl zeigen: LEDs, Ton, Bewegung (smile, hello, sad …)', 'Show a feeling: LEDs, sound, motion (smile, hello, sad …)', 'Mostrar um sentimento: LEDs, som, movimento (smile, hello, sad …)'], - ['playTone', 'hz, ms', 'void', 'Ton spielen, z. B. playTone(440, 500)', 'Play a tone, e.g. playTone(440, 500)', 'Tocar um som, p. ex. playTone(440, 500)'], - ['getDistance', '', 'int', 'Abstand vorn in cm (Ultraschall)', 'Distance ahead in cm (ultrasonic)', 'Distância à frente em cm (ultrassom)'], - ['getLine', '', 'int', 'Liniensensor: 0 = keine Linie, 15 = alle vier auf der Linie', 'Line sensor: 0 = no line, 15 = all four on the line', 'Sensor de linha: 0 = sem linha, 15 = os quatro na linha'], - ['isLineLeft', '', 'boolean', 'Linie unter dem linken mittleren Fühler', 'Line under the left middle probe', 'Linha sob a sonda central esquerda'], - ['isLineRight', '', 'boolean', 'Linie unter dem rechten mittleren Fühler', 'Line under the right middle probe', 'Linha sob a sonda central direita'], - ['getBrightness', '', 'int', 'Helligkeit 0–100', 'Brightness 0–100', 'Luminosidade 0–100'], - ['getLoudness', '', 'int', 'Lautstärke 0–100', 'Loudness 0–100', 'Volume 0–100'], - ['getColor', '', 'String', 'Farbe unter dem mBot2, z. B. "rot"', 'Colour under the mBot2, e.g. "red"', 'Cor por baixo do mBot2, p. ex. "red"'], - ['isButtonA', '', 'boolean', 'Taste A ist gedrückt', 'Button A is pressed', 'O botão A está premido'], - ['isButtonB', '', 'boolean', 'Taste B ist gedrückt', 'Button B is pressed', 'O botão B está premido'], - ['isJoystickUp', '', 'boolean', 'Joystick nach oben gedrückt', 'Joystick pushed up', 'Joystick para cima'], - ['isJoystickDown', '', 'boolean', 'Joystick nach unten gedrückt', 'Joystick pushed down', 'Joystick para baixo'], - ['isJoystickLeft', '', 'boolean', 'Joystick nach links gedrückt', 'Joystick pushed left', 'Joystick para a esquerda'], - ['isJoystickRight', '', 'boolean', 'Joystick nach rechts gedrückt', 'Joystick pushed right', 'Joystick para a direita'], - ['getPitch', '', 'int', 'Neigung nach vorn (+) oder hinten (−) in Grad', 'Tilt forward (+) or back (−) in degrees', 'Inclinação para a frente (+) ou trás (−) em graus'], - ['getRoll', '', 'int', 'Neigung zur Seite in Grad', 'Tilt sideways in degrees', 'Inclinação lateral em graus'], - ['isShaken', '', 'boolean', 'Der mBot2 wird geschüttelt', 'The mBot2 is being shaken', 'O mBot2 está a ser abanado'], - ['getTimer', '', 'double', 'Stoppuhr in Sekunden', 'Stopwatch in seconds', 'Cronómetro em segundos'], - ['getBattery', '', 'int', 'Akku in Prozent', 'Battery in percent', 'Bateria em percentagem'], - ], - System: [ - ['out', null, 'PrintStream', 'Ausgabe in die Konsole', 'Output to the console', 'Saída para a consola'], - ['in', null, 'InputStream', 'Eingabe von der Tastatur (für Scanner)', 'Keyboard input (for Scanner)', 'Entrada do teclado (para Scanner)'], - ['err', null, 'PrintStream', 'Fehlerausgabe', 'Error output', 'Saída de erros'], - ['currentTimeMillis', '', 'long', 'Uhrzeit in Millisekunden', 'Time in milliseconds', 'Hora em milissegundos'], - ['exit', '0', 'void', 'Programm beenden', 'End the program', 'Terminar o programa'], - ], - Math: [ - ['random', '', 'double', 'Zufallszahl von 0 bis unter 1', 'Random number from 0 to below 1', 'Número aleatório de 0 até menos de 1'], - ['abs', 'zahl', 'double', 'Betrag (ohne Minus)', 'Absolute value (no minus)', 'Valor absoluto (sem menos)'], - ['sqrt', 'zahl', 'double', 'Wurzel', 'Square root', 'Raiz quadrada'], - ['pow', 'basis, exponent', 'double', 'Hoch: pow(2, 3) = 8', 'Power: pow(2, 3) = 8', 'Potência: pow(2, 3) = 8'], - ['max', 'a, b', 'double', 'Größere von zwei Zahlen', 'Larger of two numbers', 'Maior de dois números'], - ['min', 'a, b', 'double', 'Kleinere von zwei Zahlen', 'Smaller of two numbers', 'Menor de dois números'], - ['round', 'zahl', 'long', 'Runden', 'Round', 'Arredondar'], - ['floor', 'zahl', 'double', 'Abrunden', 'Round down', 'Arredondar para baixo'], - ['ceil', 'zahl', 'double', 'Aufrunden', 'Round up', 'Arredondar para cima'], - ['PI', null, 'double', 'Kreiszahl π = 3.14159…', 'Pi π = 3.14159…', 'Pi π = 3,14159…'], - ], - Integer: [ - ['parseInt', 'text', 'int', 'Text in ganze Zahl umwandeln', 'Turn text into a whole number', 'Converter texto em número inteiro'], - ['toString', 'zahl', 'String', 'Zahl in Text umwandeln', 'Turn a number into text', 'Converter número em texto'], - ['MAX_VALUE', null, 'int', 'Größte int-Zahl', 'Largest int value', 'Maior valor int'], - ['MIN_VALUE', null, 'int', 'Kleinste int-Zahl', 'Smallest int value', 'Menor valor int'], - ], - Double: [ - ['parseDouble', 'text', 'double', 'Text in Kommazahl umwandeln', 'Turn text into a decimal number', 'Converter texto em número decimal'], - ['toString', 'zahl', 'String', 'Zahl in Text umwandeln', 'Turn a number into text', 'Converter número em texto'], - ], - String: [ - ['valueOf', 'wert', 'String', 'Wert in Text umwandeln', 'Turn a value into text', 'Converter valor em texto'], - ['format', 'format, werte', 'String', 'Formatierter Text, z. B. "%.2f"', 'Formatted text, e.g. "%.2f"', 'Texto formatado, p. ex. "%.2f"'], - ['join', 'trenner, teile', 'String', 'Teile mit Trenner verbinden', 'Join parts with a separator', 'Juntar partes com um separador'], - ], - Character: [ - ['isDigit', 'zeichen', 'boolean', 'Ist es eine Ziffer?', 'Is it a digit?', 'É um algarismo?'], - ['isLetter', 'zeichen', 'boolean', 'Ist es ein Buchstabe?', 'Is it a letter?', 'É uma letra?'], - ['isUpperCase', 'zeichen', 'boolean', 'Ist es ein Großbuchstabe?', 'Is it upper case?', 'É maiúscula?'], - ['toUpperCase', 'zeichen', 'char', 'In Großbuchstaben', 'To upper case', 'Para maiúscula'], - ['toLowerCase', 'zeichen', 'char', 'In Kleinbuchstaben', 'To lower case', 'Para minúscula'], - ], - Files: [ - ['readString', 'Path.of("datei.txt")', 'String', 'Ganze Datei als Text lesen', 'Read the whole file as text', 'Ler o ficheiro inteiro como texto'], - ['writeString', 'pfad, text', 'Path', 'Text in Datei schreiben', 'Write text to a file', 'Escrever texto num ficheiro'], - ['readAllLines', 'pfad', 'List', 'Alle Zeilen lesen', 'Read all lines', 'Ler todas as linhas'], - ['exists', 'pfad', 'boolean', 'Gibt es die Datei?', 'Does the file exist?', 'O ficheiro existe?'], - ], - Path: [['of', '"datei.txt"', 'Path', 'Pfad zu einer Datei', 'Path to a file', 'Caminho para um ficheiro']], - JFrame: [['EXIT_ON_CLOSE', null, 'int', 'Programm endet beim Schließen', 'Program ends when closed', 'O programa termina ao fechar']], - JLabel: [ - ['CENTER', null, 'int', 'Mittig', 'Centred', 'Ao centro'], - ['LEFT', null, 'int', 'Links', 'Left', 'À esquerda'], - ['RIGHT', null, 'int', 'Rechts', 'Right', 'À direita'], - ], - Font: [ - ['BOLD', null, 'int', 'Fett', 'Bold', 'Negrito'], - ['PLAIN', null, 'int', 'Normal', 'Plain', 'Normal'], - ['ITALIC', null, 'int', 'Kursiv', 'Italic', 'Itálico'], - ], - Color: ( - [ - ['RED', 'Rot', 'Red', 'Vermelho'], - ['GREEN', 'Grün', 'Green', 'Verde'], - ['BLUE', 'Blau', 'Blue', 'Azul'], - ['YELLOW', 'Gelb', 'Yellow', 'Amarelo'], - ['ORANGE', 'Orange', 'Orange', 'Laranja'], - ['WHITE', 'Weiß', 'White', 'Branco'], - ['BLACK', 'Schwarz', 'Black', 'Preto'], - ['GRAY', 'Grau', 'Grey', 'Cinzento'], - ['LIGHT_GRAY', 'Hellgrau', 'Light grey', 'Cinzento-claro'], - ['PINK', 'Rosa', 'Pink', 'Rosa'], - ['CYAN', 'Türkis', 'Cyan', 'Ciano'], - ['MAGENTA', 'Magenta', 'Magenta', 'Magenta'], - ] as const - ).map(([name, de, en, pt]): Row => [name, null, 'Color', de, en, pt]), -} - -function toMember(row: Row, lang: MemberLanguage): JavaMember { - const [name, params, returns, de, en, pt] = row - return { name, kind: params === null ? 'field' : 'method', params: !!params, returns, description: lang === 'de' ? de : lang === 'pt' ? pt : en } -} - -/** `ArrayList` → `ArrayList`. */ -const baseType = (type: string) => type.replace(/<.*>$/, '') -/** `ArrayList` → `Spieler`. */ -const elementType = (type: string) => /<\s*([^<>,]+?)\s*>$/.exec(type)?.[1] - -function rowsOf(type: string): Row[] | undefined { - if (/\[\]$/.test(type)) return array - type = baseType(type) - if (/Exception$|^Throwable$/.test(type)) return instance.Exception - const own = instance[type] - if (!own) return undefined - const seen = new Set() - const rows: Row[] = [] - for (const t of [type, ...(extendsOf[type] ?? [])]) { - for (const row of instance[t] ?? []) { - if (seen.has(row[0])) continue - seen.add(row[0]) - rows.push(row) - } - } - return rows -} - -/** Methoden eines Typs, z. B. `membersOf('Scanner', 'de')`. */ -export function membersOf(type: string, lang: MemberLanguage = 'de'): JavaMember[] { - return (rowsOf(type) ?? []).map((r) => toMember(r, lang)) -} - -const declarationTypes = '[A-Z]\\w*|int|long|double|float|boolean|char|byte|short|var' - -/** Typ einer Variablen aus ihrer Deklaration: `Scanner eingabe`, `String[] namen`, `for (String s : namen)`, `catch (Exception e)`. */ -export function declaredType(code: string, name: string): string | undefined { - const re = new RegExp(`(?:^|[^\\w.])(${declarationTypes})\\s*(?:<([^<>;]*)>)?((?:\\s*\\[\\s*\\])*)\\s+${name}\\s*(?:\\[\\s*\\])*\\s*(=\\s*([^;]*))?(?=[=;,):]|$)`, 'gm') - let type: string | undefined - for (const m of code.matchAll(re)) { - let t = m[1] - if (t === 'var') { - const init = m[5] ?? '' - t = /^new\s+([A-Z]\w*)/.exec(init)?.[1] ?? (/^"/.test(init) ? 'String' : '') - if (!t) continue - } - // Schlüsselwörter, die wie ein Typ aussehen könnten, nicht mitnehmen. - if (/^(return|new|else|case|throw)$/.test(t)) continue - const generic = m[2]?.replace(/\s+/g, '') - type = t + (generic ? `<${generic}>` : '') + (m[3] ?? '').replace(/\s+/g, '') - } - return type -} - -/** Ein Glied der Kette vor dem Punkt: `eingabe`, `namen[i]`, `nextLine()`. */ -interface Link { - name: string - call: boolean - indices: number -} - -/** Zerlegt `a.b(x).c[0]` in Glieder; `undefined`, wenn es kein einfacher Ausdruck ist. */ -function parseChain(text: string): { head: string; links: Link[] } | undefined { - let i = 0 - let head: string - const literal = /^"(?:[^"\\]|\\.)*"/.exec(text) - if (literal) { - head = '"' - i = literal[0].length - } else { - const id = /^[A-Za-z_]\w*/.exec(text) - if (!id) return undefined - head = id[0] - i = id[0].length - } - const links: Link[] = [{ name: head, call: false, indices: 0 }] - const skipGroup = (open: string, close: string) => { - let depth = 0 - for (; i < text.length; i++) { - if (text[i] === '"') { - const s = /^"(?:[^"\\]|\\.)*"/.exec(text.slice(i)) - if (!s) return false - i += s[0].length - 1 - } else if (text[i] === open) depth++ - else if (text[i] === close && --depth === 0) { - i++ - return true - } - } - return false - } - while (i < text.length) { - const last = links[links.length - 1] - if (text[i] === '(' && !last.call && last.indices === 0) { - if (!skipGroup('(', ')')) return undefined - last.call = true - } else if (text[i] === '[') { - if (!skipGroup('[', ']')) return undefined - last.indices++ - } else if (text[i] === '.') { - const id = /^[A-Za-z_]\w*/.exec(text.slice(i + 1)) - if (!id) return undefined - links.push({ name: id[0], call: false, indices: 0 }) - i += 1 + id[0].length - } else return undefined - } - return { head, links } -} - -/** Anfang des Ausdrucks vor dem Punkt an `end` (rückwärts über Namen, Punkte, Klammern und Texte). */ -function chainStart(line: string, end: number): number { - let i = end - while (i > 0) { - const c = line[i - 1] - if (/[\w.]/.test(c)) i-- - else if (c === ')' || c === ']') { - const open = c === ')' ? '(' : '[' - let depth = 0 - let j = i - 1 - for (; j >= 0; j--) { - if (line[j] === c) depth++ - else if (line[j] === open && --depth === 0) break - } - if (j < 0) return i - i = j - } else if (c === '"') { - const j = line.lastIndexOf('"', i - 2) - if (j < 0) return i - i = j - } else break - } - return i -} - -const withoutIndex = (type: string, n: number) => type.slice(0, Math.max(0, type.length - 2 * n)) - -/** - * Eigene Klassen aus dem Projekt (VisuObject): `s1.` → Methoden und Attribute von `Spieler`, - * `Spieler.` → seine static-Mitglieder, `this.` → die Klasse, in der man schreibt. - * Was von der Stelle aus nicht sichtbar ist (private, Package), lässt der Aufrufer schon weg. - */ -export interface OwnTypes { - members(type: string): JavaMember[] | undefined - statics(type: string): JavaMember[] | undefined - /** Klasse, in der der Cursor steht (für `this.`). */ - thisType?: string -} - -function lookup(type: string, isStatic: boolean, own: OwnTypes | undefined, lang: MemberLanguage): JavaMember[] | undefined { - const mine = isStatic ? own?.statics(baseType(type)) : own?.members(baseType(type)) - if (mine) return mine - const rows = isStatic ? statics[type] : rowsOf(type) - return rows?.map((r) => toMember(r, lang)) -} - -function memberType(type: string, name: string, isStatic: boolean, own: OwnTypes | undefined): string | undefined { - const returns = lookup(type, isStatic, own, 'en')?.find((m) => m.name === name)?.returns - return returns === 'E' ? (elementType(type) ?? 'Object') : returns -} - -/** Typ des Ausdrucks vor dem Punkt, z. B. `eingabe` → Scanner, `eingabe.nextLine()` → String. */ -export function receiverType(code: string, receiver: string, own?: OwnTypes): { type: string; isStatic: boolean } | undefined { - const chain = parseChain(receiver) - if (!chain) return undefined - const [first, ...rest] = chain.links - let type: string | undefined - let isStatic = false - if (chain.head === '"') type = 'String' - else if (first.name === 'this' && own?.thisType && !first.call && !first.indices) type = own.thisType - else { - type = declaredType(code, first.name) - if (!type && (statics[first.name] || own?.statics(first.name)) && !first.call) { - type = first.name - isStatic = true - } - if (!type) return undefined - if (first.indices) type = withoutIndex(type, first.indices) - } - for (const link of rest) { - const next = memberType(type, link.name, isStatic, own) - if (!next) return undefined - type = withoutIndex(next, link.indices) - isStatic = false - } - return { type, isStatic } -} - -/** - * Vorschläge an der Stelle `pos`, wenn direkt davor `ausdruck.` (plus angefangener Name) steht. - * `from` ist der Anfang des angefangenen Namens hinter dem Punkt. - */ -export function memberCompletionsAt(code: string, pos: number, lang: MemberLanguage = 'de', own?: OwnTypes): { from: number; members: JavaMember[] } | undefined { - const lineStart = code.lastIndexOf('\n', pos - 1) + 1 - const before = code.slice(lineStart, pos) - const m = /\.\s*(\w*)$/.exec(before) - if (!m) return undefined - const dot = m.index - const receiver = before.slice(chainStart(before, dot), dot) - if (!receiver || /^\d/.test(receiver)) return undefined - const found = receiverType(code, receiver, own) - if (!found) return undefined - const members = lookup(found.type, found.isStatic, own, lang) - if (!members) return undefined - const element = elementType(found.type) ?? 'Object' - return { from: pos - m[1].length, members: members.map((x) => (x.returns === 'E' ? { ...x, returns: element } : x)) } -} diff --git a/web/src/core/javaParser.ts b/web/src/core/javaParser.ts deleted file mode 100644 index c366fbce..00000000 --- a/web/src/core/javaParser.ts +++ /dev/null @@ -1,895 +0,0 @@ -import type { LiveLabels, LiveSpan } from './codeGenerator' -import { placeholderElement } from './editing' -import { ElementType, makeElement, type VSCase, type VSElement } from './model' -import { parseSubprogramHeader } from './simulation' -import { similarType } from './typeTypos' - -/** - * Gegenrichtung zu „Code live“: Java-Code, den man tippt, wird zum Struktogramm. - * Der Leser ist absichtlich nachsichtig, denn beim Tippen ist Code fast immer unfertig: - * Offene Blöcke gelten als geschlossen, fehlende Teile werden zu Platzhaltern, und eine Zeile, - * die nicht passt, wird eine Anweisung mit dem getippten Text. Was fehlt, steht in `problems`. - */ - -/** Hinweis zu einer Stelle im Code (Zeichenpositionen, `to` ausschließlich). `key` ist ein Text aus `i18n`. */ -export interface JavaProblem { - from: number - to: number - key: JavaProblemKey - /** Setzt `%@` im Text, z. B. das fehlende Zeichen. */ - arg?: string -} - -export type JavaProblemKey = - | 'web_parse_missing' - | 'web_parse_extra' - | 'web_parse_missing_semicolon' - | 'web_parse_unclosed_string' - | 'web_parse_else_without_if' - | 'web_parse_case_outside_switch' - | 'web_parse_missing_do_while' - | 'web_parse_more_methods' - | 'web_parse_missing_import' - | 'web_parse_missing_scanner' - | 'web_parse_unknown_type' - | 'web_parse_wrong_case' - -export interface ParsedJava { - /** Kopfzeile eines Unterprogramms, z. B. `int quadrat(int x)`; `undefined` = Hauptprogramm. */ - caption?: string - /** Name aus `public class Name`, falls der Code eine Klasse ist. */ - className?: string - elements: VSElement[] - /** Zeilen jedes Elements im getippten Code (ab 0), Pfade wie in `editing.ts`. */ - spans: LiveSpan[] - /** Platzhalter-Wörter wie „Bedingung“ (Zeichenpositionen): grau, beim Tippen ersetzt. */ - placeholders: { from: number; to: number }[] - problems: JavaProblem[] -} - -export interface JavaParseOptions { - /** Namen der Unterprogramme aus den anderen Reitern: ihr Aufruf wird ein Aufruf-Kasten. */ - subprograms?: Set -} - -// MARK: - Zerlegen in Wörter - -type TokKind = 'id' | 'num' | 'str' | 'op' | 'comment' - -interface Tok { - kind: TokKind - text: string - start: number - end: number - line: number -} - -const multiOps = ['>>>=', '<<=', '>>=', '>>>', '->', '::', '++', '--', '==', '!=', '<=', '>=', '&&', '||', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<'] - -function tokenize(src: string, problems: JavaProblem[]): Tok[] { - const out: Tok[] = [] - let i = 0 - let line = 0 - const push = (kind: TokKind, start: number, end: number, startLine: number) => - out.push({ kind, text: src.slice(start, end), start, end, line: startLine }) - while (i < src.length) { - const c = src[i] - if (c === '\n') { - line++ - i++ - continue - } - if (/\s/.test(c)) { - i++ - continue - } - const start = i - const startLine = line - if (c === '/' && src[i + 1] === '/') { - while (i < src.length && src[i] !== '\n') i++ - push('comment', start, i, startLine) - continue - } - if (c === '/' && src[i + 1] === '*') { - const close = src.indexOf('*/', i + 2) - i = close < 0 ? src.length : close + 2 - for (let k = start; k < i; k++) if (src[k] === '\n') line++ - push('comment', start, i, startLine) - continue - } - if (c === '"' || c === "'") { - i++ - while (i < src.length && src[i] !== c && src[i] !== '\n') i += src[i] === '\\' ? 2 : 1 - if (src[i] === c) i++ - else problems.push({ from: start, to: Math.min(i, src.length), key: 'web_parse_unclosed_string', arg: c }) - push('str', start, Math.min(i, src.length), startLine) - continue - } - const num = /^\d[\d_]*(?:\.\d+)?(?:[eE][+-]?\d+)?[lLfFdD]?/.exec(src.slice(i, i + 64)) - if (num) { - i += num[0].length - push('num', start, i, startLine) - continue - } - const id = /^[\p{L}_$][\p{L}\p{N}_$]*/u.exec(src.slice(i, i + 256)) - if (id) { - i += id[0].length - push('id', start, i, startLine) - continue - } - const op = multiOps.find((o) => src.startsWith(o, i)) ?? c - i += op.length - push('op', start, i, startLine) - } - return out -} - -// MARK: - Lesen - -const statementKeywords = new Set(['if', 'else', 'for', 'while', 'do', 'switch', 'case', 'default', 'break', 'return', 'try']) -const modifiers = new Set(['public', 'private', 'protected', 'static', 'final', 'abstract']) -const declTypes = '(?:int|long|short|byte|float|double|boolean|char|String)' - -type SwitchCase = VSCase & { isDefault?: boolean } - -/** Ein Element mit seinen Zeilen im Code, solange die Pfade noch nicht feststehen. */ -interface Built { - element: VSElement - from: number - to: number - /** Ausgabe eines reinen Textes: kann mit der folgenden Eingabe zu einem Kasten werden. */ - prompt?: string -} - -class Parser { - private toks: Tok[] - private comments: Tok[] - private i = 0 - readonly problems: JavaProblem[] = [] - readonly placeholders: { from: number; to: number }[] = [] - private lines = new Map() - - constructor( - private src: string, - private labels: LiveLabels, - private opts: JavaParseOptions, - ) { - const all = tokenize(src, this.problems) - this.toks = all.filter((t) => t.kind !== 'comment') - this.comments = all.filter((t) => t.kind === 'comment') - } - - // Hilfen - - private get tok(): Tok | undefined { - return this.toks[this.i] - } - private is(text: string, t = this.tok) { - return t !== undefined && t.text === text && t.kind !== 'str' - } - private next(): Tok { - return this.toks[this.i++] - } - private eat(text: string): Tok | undefined { - return this.is(text) ? this.next() : undefined - } - private prev(): Tok | undefined { - return this.toks[this.i - 1] - } - private problem(key: JavaProblemKey, t: { start: number; end: number } | undefined, arg?: string) { - const at = t ?? { start: this.src.length, end: this.src.length } - this.problems.push({ from: at.start, to: Math.max(at.end, at.start + 1), key, arg }) - } - /** Fehlendes Zeichen direkt hinter einem Wort melden. */ - private missingAfter(t: Tok | undefined, what: string) { - const at = t ? t.end : this.src.length - this.problems.push({ from: Math.max(0, at - 1), to: at, key: 'web_parse_missing', arg: what }) - } - - /** Text zwischen zwei Positionen ohne Kommentare, Zeilenumbrüche zu Leerzeichen. */ - private text(from: number, to: number): string { - let s = '' - let k = from - for (const c of this.comments) { - if (c.end <= from || c.start >= to) continue - s += this.src.slice(k, Math.max(k, c.start)) - k = Math.max(k, c.end) - } - s += this.src.slice(k, Math.max(k, to)) - return s.replace(/\s*\n\s*/g, ' ').trim() - } - - /** Ein Platzhalter-Wort (z. B. „Bedingung“) gilt als leer und wird grau gezeigt. */ - private slot(from: number, to: number, label: string): string { - const t = this.text(from, to) - if (t === label) { - const at = this.src.indexOf(label, from) - if (at >= 0) this.placeholders.push({ from: at, to: at + label.length }) - return '' - } - return t - } - - private record(element: VSElement, from: number, to: number): Built { - this.lines.set(element, [from, to]) - return { element, from, to } - } - - private lineOf(t: Tok | undefined) { - return t?.line ?? this.toks[this.toks.length - 1]?.line ?? 0 - } - - // Programm - - className?: string - /** Getippte Imports ohne Leerzeichen, z. B. `importjava.util.Scanner;`. */ - private imports: string[] = [] - - /** - * Wie javac: `Scanner` ohne `import java.util.Scanner;` (oder `java.util.*`) ist ein Fehler, ebenso `Files` und `Path` ohne - * `java.nio.file`, `File`, `PrintWriter`, `FileReader`, `FileWriter`, `BufferedReader` ohne `java.io` und `Arrays` ohne - * `java.util.Arrays`. - */ - checkImports() { - const io = ['File', 'PrintWriter', 'FileReader', 'FileWriter', 'BufferedReader', 'IOException', 'FileNotFoundException'].map((n) => [n, 'java.io']) - for (const [name, pkg] of [['Scanner', 'java.util'], ['Arrays', 'java.util'], ['Files', 'java.nio.file'], ['Path', 'java.nio.file'], ['Paths', 'java.nio.file'], ...io]) { - const known = this.imports.some((i) => i === `import${pkg}.${name};` || i === `import${pkg}.*;`) - // `Files.readString(…)`: nur als Klasse vor einem Punkt, damit eine Variable `path` o. Ä. nicht zählt. - const use = this.toks.find((t, k) => t.kind === 'id' && t.text === name && (name !== 'Arrays' && pkg !== 'java.nio.file' || this.toks[k + 1]?.text === '.')) - if (!known && use) { - this.problem('web_parse_missing_import', use, pkg === 'java.util' ? `import ${pkg}.${name};` : `import ${pkg}.*;`) - return - } - } - } - - /** - * Wie javac: `eingabe.next()` ohne angelegte Variable `eingabe` ist ein Fehler. Angelegt heißt: vor dem Namen steht ein Typ - * (`Scanner eingabe`, `Iterator it`, `Scanner[] s`), auch als Parameter oder Attribut. - */ - checkScanners() { - const reads = new Set(['next', 'nextInt', 'nextDouble', 'nextLine', 'nextBoolean', 'nextLong', 'nextFloat', 'hasNext', 'hasNextInt', 'hasNextLine', 'hasNextDouble']) - const declared = (name: string) => - this.toks.some((t, k) => { - const before = this.toks[k - 1] - return t.kind === 'id' && t.text === name && !!before && ((before.kind === 'id' && !statementKeywords.has(before.text) && before.text !== 'new') || before.text === '>' || before.text === ']') - }) - for (let k = 0; k < this.toks.length - 3; k++) { - const [v, dot, m, open] = this.toks.slice(k, k + 4) - if (v.kind !== 'id' || dot.text !== '.' || !reads.has(m.text) || open.text !== '(' || this.toks[k - 1]?.text === '.') continue - if (declared(v.text)) continue - this.problem('web_parse_missing_scanner', v, `Scanner ${v.text} = new Scanner(System.in);`) - return - } - } - - /** - * Wie javac: `booelan fertig;` oder `Int x = 3;` ist kein Datentyp. Gemeldet wird nur ein Wort am Anfang einer Anweisung, - * auf das ein Name und `=`, `;` oder `,` folgen, und nur wenn es einem Grundtyp sehr ähnlich ist; eigene Klassen - * (`Auto meinAuto;`) bleiben so unberührt. - */ - checkTypes() { - const starts = new Set([';', '{', '}', '(', ',']) - const classes = new Set(this.toks.filter((_, k) => this.toks[k - 1]?.text === 'class').map((t) => t.text)) - for (let k = 0; k < this.toks.length - 2; k++) { - const [type, name, after] = this.toks.slice(k, k + 3) - const before = this.toks[k - 1] - if (type.kind !== 'id' || name.kind !== 'id' || !['=', ';', ','].includes(after.text)) continue - if (before && !starts.has(before.text) && !modifiers.has(before.text)) continue - if (classes.has(type.text)) continue - const suggestion = similarType(type.text) - if (!suggestion) continue - this.problem('web_parse_unknown_type', type, suggestion) - return - } - } - - /** - * Wie javac: Java unterscheidet Groß- und Kleinschreibung. `system.out.println`, `System.Out.println`, `math.sqrt` oder - * `System.out.Println` sind Fehler, ebenso `text.Length()` oder `name.charat(0)`; gemeldet wird das erste falsch - * geschriebene Wort mit der richtigen Schreibweise. - */ - checkCase() { - const classes = ['System', 'Math', 'Integer', 'Double', 'String'] - // Eine eigene Variable `string` oder `math` ist erlaubt: angelegt heißt, vor dem Namen steht ein Typ. - const declared = (name: string) => this.toks.some((t, k) => t.text === name && this.toks[k - 1]?.kind === 'id' && !statementKeywords.has(this.toks[k - 1].text)) - const prints = ['println', 'print', 'printf'] - const members = ['length', 'charAt', 'substring', 'indexOf', 'equals', 'equalsIgnoreCase', 'compareTo', 'contains', 'startsWith', 'endsWith', - 'toUpperCase', 'toLowerCase', 'trim', 'isEmpty', 'split', 'replace', 'sqrt', 'pow', 'abs', 'max', 'min', 'random', 'round', - 'parseInt', 'parseDouble', 'nextInt', 'nextDouble', 'nextLine', 'next', 'hasNext', 'hasNextInt', 'hasNextLine'] - const fix = (word: string, list: string[]) => list.find((w) => w !== word && w.toLowerCase() === word.toLowerCase()) - for (let k = 0; k < this.toks.length; k++) { - const t = this.toks[k] - if (t.kind !== 'id') continue - const before = this.toks[k - 1]?.text - const after = this.toks[k + 1]?.text - let right: string | undefined - if (after === '.' && before !== '.' && !declared(t.text)) right = fix(t.text, classes) - else if (before === '.' && after === '.' && this.toks[k - 2]?.text.toLowerCase() === 'system') right = fix(t.text, ['out', 'err']) - else if (before === '.' && after === '(' && ['out', 'err'].includes(this.toks[k - 2]?.text.toLowerCase() ?? '')) right = fix(t.text, prints) - else if (before === '.') right = fix(t.text, members) - if (!right) continue - this.problem('web_parse_wrong_case', t, right) - return - } - } - - parseProgram(): { caption?: string; elements: VSElement[] } { - const elements: Built[] = [] - let caption: string | undefined - let sawMethod = false - while (this.tok) { - if (this.is('import') || this.is('package')) { - const start = this.i - this.skipPast(';') - this.imports.push(this.toks.slice(start, this.i).map((t) => t.text).join('')) - continue - } - const cls = this.classStart() - if (cls !== undefined) { - this.className ??= cls.name - this.i = cls.index - const inner = this.parseClassBody() - elements.push(...inner.elements) - caption ??= inner.caption - continue - } - const method = this.methodStart() - if (method) { - if (sawMethod) this.problem('web_parse_more_methods', this.tok) - const body = this.parseMethod(method) - if (!sawMethod) { - caption = method.caption - elements.push(...body) - } - sawMethod = true - continue - } - if (this.is('}')) { - this.problem('web_parse_extra', this.next(), '}') - continue - } - elements.push(...this.parseStatement()) - } - return { caption, elements: this.finishList(elements) } - } - - private skipPast(text: string) { - while (this.tok && !this.is(text)) this.next() - this.eat(text) - } - - /** `public class Name {`: Name und Index hinter `{`. */ - private classStart(): { name: string; index: number } | undefined { - let k = this.i - while (this.toks[k] && modifiers.has(this.toks[k].text)) k++ - if (this.toks[k]?.text !== 'class' || this.toks[k + 1]?.kind !== 'id') return undefined - const name = this.toks[k + 1].text - k += 2 - while (this.toks[k] && this.toks[k].text !== '{') k++ - return { name, index: k + 1 } - } - - private parseClassBody(): { caption?: string; elements: Built[] } { - let main: Built[] | undefined - let other: { caption?: string; body: Built[] } | undefined - let extra = false - // Klasse ohne `main`: Anweisungen stehen direkt in der Klasse. - const loose: Built[] = [] - while (this.tok && !this.is('}')) { - const method = this.methodStart() - if (!method) { - if (this.is('{')) loose.push(...this.parseBlock().elements) - else loose.push(...this.parseStatement()) - continue - } - const start = this.tok - const body = this.parseMethod(method) - if (method.name === 'main') main ??= body - else if (!other) other = { caption: method.caption, body } - else extra = true - if ((main && other) || extra) this.problem('web_parse_more_methods', start) - } - this.eat('}') - if (main) return { elements: main } - if (loose.length > 0 || !other) return { elements: loose } - return { caption: other.caption, elements: other.body } - } - - /** `[public static] int quadrat(int x) {`: Name und Kopfzeile, Index steht danach auf `{`. */ - private methodStart(): { name: string; caption?: string } | undefined { - let k = this.i - let mods = 0 - while (this.toks[k] && modifiers.has(this.toks[k].text)) { - k++ - mods++ - } - const type = this.toks[k] - if (type?.kind !== 'id' || statementKeywords.has(type.text) || type.text === 'new') return undefined - k++ - while (this.toks[k]?.text === '[' && this.toks[k + 1]?.text === ']') k += 2 - const name = this.toks[k] - if (name?.kind !== 'id' || this.toks[k + 1]?.text !== '(') return undefined - // Ohne `public`/`static` nur, wenn danach wirklich ein Rumpf `{` folgt (sonst ist es eine Anweisung). - let depth = 0 - let close = k + 1 - for (; this.toks[close]; close++) { - const t = this.toks[close].text - if (t === '(') depth++ - else if (t === ')' && --depth === 0) break - else if (t === ';' || t === '{' || t === '}') break - } - // `throws IOException, Exception` nach der Parameterliste gehört zur Kopfzeile. - let bodyAt = close + 1 - if (this.toks[close]?.text === ')' && this.toks[bodyAt]?.text === 'throws') { - bodyAt++ - while (this.toks[bodyAt]?.kind === 'id' && (this.toks[bodyAt + 1]?.text === ',' || this.toks[bodyAt + 1]?.text === '{' || this.toks[bodyAt + 1]?.text === '.')) { - bodyAt += this.toks[bodyAt + 1].text === '{' ? 1 : 2 - } - } - const after = this.toks[bodyAt] - const hasBody = this.toks[close]?.text === ')' && after?.text === '{' - if (!hasBody && !(mods > 0 && (after === undefined || this.toks[close] === undefined))) return undefined - const paramsEnd = this.toks[close]?.text === ')' ? this.toks[close].start : this.src.length - const params = this.text(this.toks[k + 1].end, paramsEnd) - const typeText = this.text(type.start, this.toks[k - 1].end).replace(/\s+/g, '') - const header = `${typeText} ${name.text}(${params.replace(/\s*,\s*/g, ', ')})` - this.i = Math.min(hasBody ? bodyAt : close + 1, this.toks.length) - return { name: name.text, caption: name.text === 'main' || !parseSubprogramHeader(header) ? undefined : header } - } - - private parseMethod(_method: { name: string }): Built[] { - if (!this.is('{')) { - this.missingAfter(this.prev(), '{') - return [] - } - return this.parseBlock().elements - } - - // Blöcke - - /** `{ … }`; fehlt die schließende Klammer, endet der Block am Ende des Codes. */ - private parseBlock(): { elements: Built[]; end: number } { - const open = this.next() - const elements: Built[] = [] - while (this.tok && !this.is('}')) { - if (this.is('case') || this.is('default')) break - elements.push(...this.parseStatement()) - } - const close = this.eat('}') - if (!close) this.problem('web_parse_missing', open, '}') - if (elements.length === 0) { - // Leerer Block mit `// Dein Code`: Der Platzhalter steht in dieser Zeile. - const until = close?.start ?? this.src.length - const c = this.comments.find((c) => c.start > open.end && c.start < until && this.isCodePlaceholder(c)) - if (c) elements.push(this.record(placeholderElement(), c.line, c.line)) - } - return { elements, end: this.lineOf(close ?? this.prev()) } - } - - /** Rumpf nach `if (…)`, `for (…)` usw.: Block oder eine einzelne Anweisung. */ - private parseBody(): { elements: VSElement[]; end: number } { - if (this.is('{')) { - const b = this.parseBlock() - return { elements: this.finishList(b.elements), end: b.end } - } - if (!this.tok || this.is('}')) { - this.missingAfter(this.prev(), '{') - return { elements: [placeholderElement()], end: this.lineOf(this.prev()) } - } - const one = this.parseStatement() - return { elements: this.finishList(one), end: one.length ? one[one.length - 1].to : this.lineOf(this.prev()) } - } - - /** Ausgabe + Eingabe zusammenfassen; leere Liste wird zum Platzhalter `ø`. */ - private finishList(list: Built[]): VSElement[] { - const out: Built[] = [] - for (const b of list) { - const last = out[out.length - 1] - const input = b.element.type === ElementType.anweisung ? /^input: (\S+(?: \S+)?)$/.exec(b.element.textLines[0]) : null - if (input && last?.prompt !== undefined) { - const name = input[1].split(' ').pop()! - if (last.prompt !== `${name}: `) b.element.textLines = [`${b.element.textLines[0]} "${last.prompt}"`] - out.pop() - this.lines.delete(last.element) - out.push(this.record(b.element, last.from, b.to)) - continue - } - out.push(b) - } - if (out.length === 0) return [placeholderElement()] - return out.map((b) => b.element) - } - - // Anweisungen - - private parseStatement(): Built[] { - const t = this.tok! - switch (t.kind === 'id' ? t.text : '') { - case 'if': - return [this.parseIf()] - case 'while': - return [this.parseWhile()] - case 'do': - return [this.parseDo()] - case 'for': - return [this.parseFor()] - case 'switch': - return [this.parseSwitch()] - case 'try': - return this.parseTry() - case 'break': { - this.next() - const semi = this.eat(';') - if (!semi) this.missingAfter(t, ';') - const hint = this.trailingComment(semi ?? t) - return [this.record(makeElement(ElementType.aussprung, { textLines: [hint] }), t.line, t.line)] - } - case 'else': - this.problem('web_parse_else_without_if', this.next()) - return [] - case 'case': - case 'default': - this.problem('web_parse_case_outside_switch', this.next()) - while (this.tok && !this.is(':') && !this.is('->') && !this.is(';')) this.next() - this.next() - return [] - } - if (this.is('{')) { - const b = this.parseBlock() - return b.elements - } - if (this.is(';')) { - this.next() - return [this.record(makeElement(ElementType.anweisung), t.line, t.line)] - } - return this.parseSimple() - } - - /** - * `try { … } catch (…) { … } finally { … }`: Im Struktogramm gibt es dafür keinen Kasten, deshalb wird alles - * zusammen ein Anweisungskasten (wie ein Lambda mit Rumpf). Fehlt eine `}`, wird sie gemeldet. - */ - private parseTry(): Built[] { - const first = this.next() - let last = first - /** Klammerpaar ab dem aktuellen Wort überspringen; `false`, wenn die schließende Klammer fehlt. */ - const skipPair = (open: string, close: string): boolean => { - const start = this.next() - last = start - let depth = 1 - while (this.tok) { - const t = this.next() - last = t - if (t.kind === 'str') continue - if (t.text === open) depth++ - else if (t.text === close && --depth === 0) return true - } - this.missingAfter(last, close) - return false - } - let complete = true - if (this.is('(')) complete = skipPair('(', ')') - if (complete && this.is('{')) complete = skipPair('{', '}') - else if (complete) this.missingAfter(last, '{') - while (complete && (this.is('catch') || this.is('finally'))) { - const isCatch = this.next().text === 'catch' - last = this.prev()! - if (isCatch) { - if (this.is('(')) complete = skipPair('(', ')') - else this.missingAfter(last, '(') - } - if (complete && this.is('{')) complete = skipPair('{', '}') - else if (complete) this.missingAfter(last, '{') - } - const raw = this.text(first.start, last.end).replace(/\s+/g, ' ') - return [this.record(makeElement(ElementType.anweisung, { textLines: [raw] }), first.line, last.line)] - } - - /** Kommentar direkt hinter einem Wort in derselben Zeile, z. B. `break; // fertig`. */ - private trailingComment(after: Tok): string { - const c = this.comments.find((c) => c.start >= after.end && c.line === after.line) - const nextTok = this.toks.find((x) => x.start >= after.end) - if (!c || (nextTok && nextTok.start < c.start)) return '' - return c.text.replace(/^\/\/|^\/\*|\*\/$/g, '').trim() - } - - /** Bedingung in `( … )`. Fehlt `(` oder `)`, endet sie vor `{` bzw. am Zeilenende. */ - private parenthesized(keyword: Tok, label: string): { text: string; close?: Tok } { - const open = this.eat('(') - if (!open) this.missingAfter(keyword, '(') - const startTok = this.tok - let depth = 0 - let lastTok: Tok | undefined - while (this.tok) { - const t = this.tok - if (!open && t.line !== keyword.line) break - if (t.text === '{' || t.text === '}' || t.text === ';') break - if (t.text === '(') depth++ - if (t.text === ')') { - if (depth === 0) break - depth-- - } - lastTok = this.next() - } - const close = open ? this.eat(')') : undefined - if (open && !close) this.missingAfter(lastTok ?? open, ')') - const from = open ? open.end : (startTok?.start ?? keyword.end) - const to = close ? close.start : (lastTok?.end ?? from) - return { text: this.slot(from, to, label), close } - } - - private parseIf(): Built { - const kw = this.next() - const cond = this.parenthesized(kw, this.labels.condition) - const yes = this.parseBody() - let no: VSElement[] = [placeholderElement()] - let end = yes.end - if (this.is('else')) { - this.next() - if (this.is('if')) { - const nested = this.parseIf() - no = [nested.element] - end = nested.to - } else { - const b = this.parseBody() - no = b.elements - end = b.end - } - } - const element = makeElement(ElementType.verzweigung, { - textLines: [cond.text], - cases: [ - { name: 'true', elements: yes.elements }, - { name: 'false', elements: no }, - ], - }) - return this.record(element, kw.line, end) - } - - private parseWhile(): Built { - const kw = this.next() - const cond = this.parenthesized(kw, this.labels.condition) - const body = this.parseBody() - const endless = cond.text === 'true' - const element = makeElement(endless ? ElementType.endlosschleife : ElementType.whileSchleife, { - textLines: [endless ? '' : cond.text], - loopBody: body.elements, - }) - return this.record(element, kw.line, body.end) - } - - private parseDo(): Built { - const kw = this.next() - const body = this.parseBody() - let cond = '' - let end = body.end - const w = this.eat('while') - if (w) { - cond = this.parenthesized(w, this.labels.condition).text - const semi = this.eat(';') - if (!semi) this.missingAfter(this.prev(), ';') - end = this.lineOf(this.prev()) - } else { - this.problem('web_parse_missing_do_while', kw) - } - return this.record(makeElement(ElementType.doUntilSchleife, { textLines: [cond], loopBody: body.elements }), kw.line, end) - } - - private parseFor(): Built { - const kw = this.next() - const open = this.eat('(') - if (!open) this.missingAfter(kw, '(') - const fields: string[] = [] - const labels = [this.labels.start, this.labels.condition, this.labels.step] - let from = open?.end ?? this.tok?.start ?? kw.end - let depth = 0 - let close: Tok | undefined - let last: Tok | undefined - while (this.tok) { - const t = this.tok - if (t.text === '{' || t.text === '}') break - if (!open && t.line !== kw.line) break - if (t.text === '(') depth++ - if (t.text === ')') { - if (depth === 0) { - close = this.next() - break - } - depth-- - } - if (t.text === ';' && depth === 0) { - fields.push(this.slot(from, t.start, labels[fields.length] ?? '')) - this.next() - from = t.end - continue - } - last = this.next() - } - if (open && !close) this.missingAfter(last ?? this.prev() ?? open, ')') - const tail = close ? close.start : (last?.end ?? this.prev()?.end ?? from) - fields.push(this.slot(from, Math.max(from, tail), labels[fields.length] ?? '')) - // Kopf `int x : liste` oder unvollständig: wie im Objektinspektor drei Felder. - let textLines = fields - if (fields.length === 1 && fields[0] !== '' && !fields[0].includes(':')) textLines = [fields[0], '', ''] - while (textLines.length < 3 && textLines.length > 1) textLines.push('') - const body = this.parseBody() - return this.record(makeElement(ElementType.forSchleife, { textLines, loopBody: body.elements }), kw.line, body.end) - } - - private parseSwitch(): Built { - const kw = this.next() - const sel = this.parenthesized(kw, this.labels.selector) - const cases: SwitchCase[] = [] - let end = this.lineOf(this.prev()) - const open = this.eat('{') - if (!open) this.missingAfter(this.prev(), '{') - else { - while (this.tok && !this.is('}')) { - if (!this.is('case') && !this.is('default')) { - // Anweisung vor dem ersten `case`: einem Fall ohne Namen zuordnen wäre verwirrend, also melden. - this.problem('web_parse_case_outside_switch', this.tok) - this.parseStatement() - continue - } - cases.push(this.parseCase()) - } - const close = this.eat('}') - if (!close) this.problem('web_parse_missing', open, '}') - end = this.lineOf(close ?? this.prev()) - } - if (!cases.some((c) => c.isDefault)) cases.push({ name: 'default', elements: [placeholderElement()], isDefault: true }) - // `default` steht immer als letzter Fall. - const ordered = [...cases.filter((c) => !c.isDefault), ...cases.filter((c) => c.isDefault)].map(({ name, elements }) => ({ name, elements })) - return this.record(makeElement(ElementType.fallauswahl, { textLines: [sel.text], cases: ordered }), kw.line, end) - } - - private parseCase(): SwitchCase { - const kw = this.next() - const isDefault = kw.text === 'default' - const labelStart = this.tok?.start ?? kw.end - let labelEnd = labelStart - while (this.tok && !this.is('->') && !this.is(':') && !this.is('{') && !this.is('}')) labelEnd = this.next().end - const arrow = this.eat('->') ?? this.eat(':') - if (!arrow) this.missingAfter(this.prev(), '->') - let name = isDefault ? 'default' : this.text(labelStart, labelEnd) - let elements: Built[] = [] - if (arrow?.text === '->') { - if (this.is('{')) { - // `default -> { /* Name */`: der Name des letzten Falls steht als Kommentar dahinter. - if (isDefault) name = this.trailingComment(this.tok!) || name - elements = this.parseBlock().elements - } else if (this.tok && !this.is('}')) elements = this.parseStatement() - } else { - if (isDefault && arrow) name = this.trailingComment(arrow) || name - while (this.tok && !this.is('case') && !this.is('default') && !this.is('}')) elements.push(...this.parseStatement()) - // Klassisches `break;` am Ende eines Falls gehört zur Fallauswahl selbst. - const last = elements[elements.length - 1] - if (last?.element.type === ElementType.aussprung && last.element.textLines.every((l) => l === '')) elements.pop() - } - return { name, elements: this.finishList(elements), isDefault } - } - - /** Eine einfache Anweisung bis `;`. Fehlt das Semikolon, endet sie am Zeilenende. */ - private parseSimple(): Built[] { - const first = this.next() - let last = first - // Offene Klammern dieser Anweisung. Steht die innerste `{` in der Anweisung (Lambda `e -> { … }` oder - // anonyme Klasse `new ActionListener() { … }`), gehören `;` und neue Zeilen darin noch dazu. - const open: string[] = first.text === '(' || first.text === '[' || first.text === '{' ? [first.text] : [] - const inBraces = () => open.length > 0 && open[open.length - 1] === '{' && first.text !== '{' - let semi: Tok | undefined - while (this.tok) { - const t = this.tok - if (t.text === ';' && t.kind === 'op' && !inBraces()) { - semi = this.next() - break - } - if (t.line !== last.line && !inBraces()) { - if (open.length === 0 || (t.kind === 'id' && statementKeywords.has(t.text)) || t.text === '}') break - } - if (t.text === '}' && open.length === 0) break - if (t.text === '(' || t.text === '[' || t.text === '{') open.push(t.text) - if (t.text === ')' || t.text === ']' || t.text === '}') open.pop() - last = this.next() - } - if (!semi) this.missingAfter(last, ';') - this.checkBrackets(first, last) - const raw = this.text(first.start, last.end) - const built = this.simpleElement(raw) - if (!built) return [] - const b = this.record(built.element, first.line, last.line) - b.prompt = built.prompt - return [b] - } - - /** Runde und eckige Klammern innerhalb einer Anweisung. */ - private checkBrackets(first: Tok, last: Tok) { - const stack: Tok[] = [] - const pairs: Record = { ')': '(', ']': '[', '}': '{' } - const closing: Record = { '(': ')', '[': ']', '{': '}' } - for (let k = this.toks.indexOf(first); k >= 0 && k < this.toks.length && this.toks[k].start <= last.start; k++) { - const t = this.toks[k] - if (t.kind !== 'op') continue - if (closing[t.text]) stack.push(t) - else if (pairs[t.text]) { - if (stack.length && stack[stack.length - 1].text === pairs[t.text]) stack.pop() - else this.problem('web_parse_extra', t, t.text) - } - } - if (stack.length) this.missingAfter(last, closing[stack[stack.length - 1].text]) - } - - /** Variablen mit einem Scanner auf einer Datei (`new Scanner(new File(…))`). */ - private fileScanners = new Set() - - /** Anweisungstext → Kasten. `undefined` = gehört nicht ins Struktogramm (z. B. `Scanner scanner = …`). */ - private simpleElement(raw: string): { element: VSElement; prompt?: string } | undefined { - const fileScanner = /^(?:Scanner\s+)?(\w+)\s*=\s*new\s+Scanner\s*\(\s*new\s+File\b/.exec(raw) - if (fileScanner) this.fileScanners.add(fileScanner[1]) - if (/^(?:(?:private|public|static|final)\s+)*Scanner\s+\w+\s*=\s*new\s+Scanner\s*\(\s*System\.in\s*\)$/.test(raw)) return undefined - const anweisung = (text: string) => makeElement(ElementType.anweisung, { textLines: [text] }) - // Auch unfertig (`System.out.println(` beim Tippen) und leer schon eine Ausgabe. - const out = /^System\.out\.println\s*\(([\s\S]*?)\)?$/.exec(raw) - if (out) { - const expr = out[1].trim() - if (expr === '') return { element: anweisung('output: ') } - const literal = /^"((?:[^"\\]|\\.)*)"$/.exec(expr) - const prompt = literal ? unescapeJava(literal[1]) : undefined - return { element: anweisung(`output: ${expr}`), prompt: prompt !== undefined && !prompt.includes('"') ? prompt : undefined } - } - const input = new RegExp(`^(?:(${declTypes})\\s+)?([A-Za-z_]\\w*(?:\\s*\\[[^\\]]+\\])*)\\s*=\\s*\\w+\\.(nextInt|nextDouble|nextLine|next|nextBoolean)\\s*\\(\\s*\\)$`).exec(raw) - // `zeile = datei.nextLine()` mit einem Scanner auf einer Datei liest nicht von der Tastatur. - if (input && !this.fileScanners.has(raw.replace(/^[\s\S]*=\s*(\w+)\.\w+\s*\(\s*\)$/, '$1'))) { - const kind = { nextInt: 'int', nextDouble: 'double', nextLine: 'String', next: 'String', nextBoolean: 'boolean' }[input[3]]! - const name = input[2].replace(/\s+/g, '') - // Ohne Typ nur bei Array-Zellen, sonst würde der erzeugte Code die Variable ein zweites Mal anlegen. - if ((input[1] === kind || (!input[1] && name.includes('['))) && kind) return { element: anweisung(`input: ${kind} ${name}`) } - } - const final = new RegExp(`^final\\s+(${declTypes}\\s+[\\s\\S]*)$`).exec(raw) - if (final) return { element: anweisung(`const ${final[1]}`) } - const call = /^(?:(?:\w+\s+)?\w+\s*=\s*)?([A-Za-z_]\w*)\s*\(/.exec(raw) - if (call && this.opts.subprograms?.has(call[1])) return { element: makeElement(ElementType.aufruf, { textLines: [raw] }) } - return { element: anweisung(raw) } - } - - // Ergebnis - - /** Pfade wie in `editing.ts` und die Zeilen dazu. */ - spansFor(elements: VSElement[], prefix: number[] = [], out: LiveSpan[] = []): LiveSpan[] { - elements.forEach((e, i) => { - const path = [...prefix, i] - const lines = this.lines.get(e) - if (lines) out.push({ path, from: lines[0], to: lines[1] }) - if (e.loopBody) this.spansFor(e.loopBody, [...path, 0], out) - e.cases?.forEach((c, k) => this.spansFor(c.elements, [...path, k], out)) - }) - return out - } - - private isCodePlaceholder(c: Tok) { - return c.text.startsWith('//') && c.text.slice(2).trim() === this.labels.code - } - - /** `// Dein Code` in leeren Blöcken ist ein Platzhalter. */ - markPlaceholderComments() { - for (const c of this.comments) if (this.isCodePlaceholder(c)) this.placeholders.push({ from: c.start, to: c.end }) - } -} - -function unescapeJava(s: string): string { - return s.replace(/\\(.)/g, (_, c: string) => ({ n: '\n', r: '\r', t: '\t' })[c] ?? c) -} - -export function parseLiveJava(source: string, labels: LiveLabels, opts: JavaParseOptions = {}): ParsedJava { - const p = new Parser(source, labels, opts) - const { caption, elements } = p.parseProgram() - p.markPlaceholderComments() - p.checkImports() - p.checkScanners() - p.checkTypes() - p.checkCase() - const spans = p.spansFor(elements) - const problems = p.problems.sort((a, b) => a.from - b.from) - return { caption, className: p.className, elements, spans, placeholders: p.placeholders.sort((a, b) => a.from - b.from), problems } -} diff --git a/web/src/core/javaProject.ts b/web/src/core/javaProject.ts deleted file mode 100644 index 4173f28a..00000000 --- a/web/src/core/javaProject.ts +++ /dev/null @@ -1,375 +0,0 @@ -/** - * VisuObject: ein Java-Projekt aus mehreren Dateien, wie im Package Explorer von Eclipse. - * Jede Datei liegt in einem Package (Ordner); die Zeile `package …;` im Code folgt dem Ordner. - * Das Klassendiagramm zeigt die Klassen aller Dateien. - */ - -import { parseClasses, type UmlClass } from './classModel' -import type { UmlInfo } from './umlRelations' - -export interface ProjectFile { - /** - * Pfad unter `src/`, z. B. `tiere/Hund.java`; ohne Ordner im Standard-Package. - * In einem anderen Source Folder steht er davor mit Doppelpunkt: `test:tiere/HundTest.java`. - */ - path: string - text: string -} - -export interface JavaProject { - name: string - files: ProjectFile[] - /** Auch leere Packages, z. B. gleich nach „+ Package“ (in anderen Source Folders als `test:tiere`). */ - packages: string[] - /** Source Folders außer `src`, z. B. `test`, wie in Eclipse; auch leere. */ - sourceFolders?: string[] - /** Was nur UML kennt (Aggregation, Name der Beziehung …), siehe `umlRelations.ts`. */ - uml?: UmlInfo - /** Notizen im Klassendiagramm (Kasten mit Eselsohr), evtl. gestrichelt an Klassen geheftet. */ - notes?: UmlNote[] - /** Selbst gezeichnetes Objektdiagramm: Objekte mit Werten; Referenzen sind Werte mit dem Namen eines Objekts. */ - objects?: UmlObject[] -} - -/** Objekt im Objektdiagramm, z. B. `s1 : Spieler` mit `punkte = 3` und `team = t1`. */ -export interface UmlObject { - id: string - name: string - cls: string - x: number - y: number - /** Attributname → Wert wie getippt; bei Listen `[s1, s2]`. */ - values: Record -} - -export interface UmlNote { - id: string - text: string - x: number - y: number - /** Klassen, an die die Notiz mit gestrichelter Linie geheftet ist. */ - attach?: string[] -} - -/** Klasse mit Datei und Package, für Diagramm und Explorer. */ -export interface ProjectClass extends UmlClass { - path: string - /** Java-Package ohne Source Folder (wie in `package …;`). */ - pkg: string - /** Source Folder, meist `src`. */ - root: string -} - -export const defaultRoot = 'src' - -/** `test:tiere/X.java` → `test` und `tiere/X.java`; ohne Doppelpunkt `src`. Genauso für Package-Schlüssel. */ -export function splitRoot(key: string): { root: string; rest: string } { - const i = key.indexOf(':') - return i < 0 ? { root: defaultRoot, rest: key } : { root: key.slice(0, i), rest: key.slice(i + 1) } -} -const withRoot = (root: string, rest: string) => (root === defaultRoot ? rest : `${root}:${rest}`) - -/** Schlüssel des Packages im Explorer: `tiere`, in anderen Source Folders `test:tiere`. */ -export const packageKey = (root: string, pkg: string) => withRoot(root, pkg) -/** Java-Package ohne Source Folder. */ -export const barePackage = (key: string) => splitRoot(key).rest -export const rootOf = (key: string) => splitRoot(key).root - -export const packageOf = (path: string) => { - const { root, rest } = splitRoot(path) - return withRoot(root, rest.includes('/') ? rest.slice(0, rest.lastIndexOf('/')).replace(/\//g, '.') : '') -} -export const fileNameOf = (path: string) => { - const rest = splitRoot(path).rest - return rest.slice(rest.lastIndexOf('/') + 1) -} -export const pathFor = (pkg: string, file: string) => { - const { root, rest } = splitRoot(pkg) - return withRoot(root, rest ? `${rest.replace(/\./g, '/')}/${file}` : file) -} -/** Pfad wie auf der Festplatte, z. B. `test/tiere/HundTest.java`. */ -export const diskPath = (path: string) => { - const { root, rest } = splitRoot(path) - return `${root}/${rest}` -} - -const folderName = /^[\p{L}\p{N}_$-][\p{L}\p{N}_$.-]*$/u -export const isFolderName = (name: string) => folderName.test(name) && !name.includes('..') - -/** Alle Source Folders: `src` zuerst, dann die übrigen (auch leere und solche, die nur aus Dateien bekannt sind). */ -export function sourceFoldersOf(project: JavaProject): string[] { - const all = new Set([defaultRoot, ...(project.sourceFolders ?? [])]) - for (const f of project.files) all.add(rootOf(f.path)) - for (const p of project.packages) all.add(rootOf(p)) - return [...all].sort((a, b) => (a === defaultRoot ? -1 : b === defaultRoot ? 1 : a.localeCompare(b))) -} - -const packageName = /^[a-z_$][\p{L}\p{N}_$]*(\.[a-z_$][\p{L}\p{N}_$]*)*$/u -export const isPackageName = (name: string) => packageName.test(name) - -/** - * Alle Packages als Schlüssel: aus den Dateien und die leeren, sortiert nach Source Folder; - * das Standard-Package nur, wenn Dateien darin liegen. Mit `root` nur die aus diesem Source Folder. - */ -export function packagesOf(project: JavaProject, root?: string): string[] { - const all = new Set(project.packages) - for (const f of project.files) all.add(packageOf(f.path)) - const roots = sourceFoldersOf(project) - return [...all] - .filter((p) => barePackage(p) !== '' || project.files.some((f) => packageOf(f.path) === p)) - .filter((p) => root === undefined || rootOf(p) === root) - .sort((a, b) => { - const ra = roots.indexOf(rootOf(a)) - roots.indexOf(rootOf(b)) - if (ra) return ra - const [x, y] = [barePackage(a), barePackage(b)] - return x === '' ? 1 : y === '' ? -1 : x.localeCompare(y) - }) -} - -export function filesIn(project: JavaProject, pkg: string): ProjectFile[] { - return project.files.filter((f) => packageOf(f.path) === pkg).sort((a, b) => a.path.localeCompare(b.path)) -} - -/** `package …;` am Anfang setzen, ändern oder (Standard-Package) entfernen. */ -export function withPackageLine(text: string, key: string): string { - const pkg = barePackage(key) - const line = /^(\s*(?:\/\/[^\n]*\n|\/\*[\s\S]*?\*\/\s*)*)package\s+[\w.]+\s*;[ \t]*\n?/ - const match = line.exec(text) - if (match) { - if (!pkg) return match[1] + text.slice(match[0].length).replace(/^\n/, '') - return `${match[1]}package ${pkg};\n` + text.slice(match[0].length) - } - if (!pkg) return text - return `package ${pkg};\n\n${text.replace(/^\n+/, '')}` -} - -/** Package aus der Zeile `package …;` lesen (für geöffnete Dateien). */ -export function declaredPackage(text: string): string { - return /^\s*(?:(?:\/\/[^\n]*|\/\*[\s\S]*?\*\/)\s*)*package\s+([\w.]+)\s*;/.exec(text)?.[1] ?? '' -} - -export function projectClasses(project: JavaProject): ProjectClass[] { - return project.files.flatMap((f) => parseClasses(f.text).map((c) => ({ ...c, path: f.path, pkg: barePackage(packageOf(f.path)), root: rootOf(f.path) }))) -} - -export function updateFile(project: JavaProject, path: string, text: string): JavaProject { - return { ...project, files: project.files.map((f) => (f.path === path ? { ...f, text } : f)) } -} - -export function addFile(project: JavaProject, path: string, text: string): JavaProject { - return { ...project, files: [...project.files.filter((f) => f.path !== path), { path, text }] } -} - -export function removeFile(project: JavaProject, path: string): JavaProject { - // Das Package bleibt sichtbar, auch wenn es jetzt leer ist. - const pkg = packageOf(path) - return { ...project, files: project.files.filter((f) => f.path !== path), packages: pkg && !project.packages.includes(pkg) ? [...project.packages, pkg] : project.packages } -} - -/** Datei umbenennen oder in ein anderes Package schieben; die `package`-Zeile passt sich an. */ -export function moveFile(project: JavaProject, path: string, to: string): JavaProject { - const pkg = packageOf(to) - return { - ...project, - files: project.files.map((f) => (f.path === path ? { path: to, text: packageOf(path) === pkg ? f.text : withPackageLine(f.text, pkg) } : f)), - } -} - -export function addPackage(project: JavaProject, pkg: string): JavaProject { - return project.packages.includes(pkg) ? project : { ...project, packages: [...project.packages, pkg] } -} - -/** Package umbenennen (auch Unter-Packages wie `tiere.haus`). */ -export function renamePackage(project: JavaProject, from: string, to: string): JavaProject { - const rename = (p: string) => (p === from ? to : p.startsWith(from + '.') ? to + p.slice(from.length) : p) - return { - ...project, - packages: [...new Set(project.packages.map(rename))], - files: project.files.map((f) => { - const pkg = packageOf(f.path) - const next = rename(pkg) - return next === pkg ? f : { path: pathFor(next, fileNameOf(f.path)), text: withPackageLine(f.text, next) } - }), - } -} - -/** Neuer, leerer Source Folder wie `test`. */ -export function addSourceFolder(project: JavaProject, name: string): JavaProject { - return sourceFoldersOf(project).includes(name) ? project : { ...project, sourceFolders: [...(project.sourceFolders ?? []), name] } -} - -/** Source Folder umbenennen; Dateien und Packages ziehen mit (`src` bleibt). */ -export function renameSourceFolder(project: JavaProject, from: string, to: string): JavaProject { - const move = (key: string) => (rootOf(key) === from ? withRoot(to, barePackage(key)) : key) - return { - ...project, - sourceFolders: (project.sourceFolders ?? []).map((r) => (r === from ? to : r)).filter((r) => r !== defaultRoot), - packages: project.packages.map(move), - files: project.files.map((f) => (rootOf(f.path) === from ? { ...f, path: withRoot(to, splitRoot(f.path).rest) } : f)), - } -} - -/** Source Folder samt Packages und Dateien löschen (`src` nicht). */ -export function removeSourceFolder(project: JavaProject, root: string): JavaProject { - if (root === defaultRoot) return project - return { - ...project, - sourceFolders: (project.sourceFolders ?? []).filter((r) => r !== root), - packages: project.packages.filter((p) => rootOf(p) !== root), - files: project.files.filter((f) => rootOf(f.path) !== root), - } -} - -/** Package samt Dateien löschen. */ -export function removePackage(project: JavaProject, pkg: string): JavaProject { - return { ...project, packages: project.packages.filter((p) => p !== pkg), files: project.files.filter((f) => packageOf(f.path) !== pkg) } -} - -/** Neue Datei für eine Klasse: `package …;` und ein leerer Rumpf. */ -export function classFileText(pkg: string, name: string, kind: 'class' | 'interface'): string { - return withPackageLine(`public ${kind} ${name} {\n}\n`, pkg) -} - -/** Eine einzelne Datei (z. B. aus Stufe 1 oder ein geöffnetes `.java`) als Projekt. */ -export function projectFromFiles(name: string, files: { name: string; text: string }[]): JavaProject { - const out: ProjectFile[] = [] - for (const f of files) { - const text = f.text.replace(/\r\n/g, '\n') - const pkg = declaredPackage(text) - const publicClass = /\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(text)?.[1] - const fileName = /\.java$/i.test(f.name) ? fileNameOf(f.name) : `${publicClass ?? parseClasses(text)[0]?.name ?? 'Main'}.java` - out.push({ path: pathFor(pkg, fileName), text }) - } - return { name, files: out, packages: [] } -} - -/** Speichern im Browser und als `.visuobject`-Datei. */ -export function projectToJSON(project: JavaProject): string { - return JSON.stringify({ format: 'visuobject', version: 1, ...project }) -} - -export function projectFromJSON(json: string): JavaProject | undefined { - try { - const data = JSON.parse(json) as Partial - if (!Array.isArray(data.files)) return undefined - const files = data.files.filter((f): f is ProjectFile => typeof f?.path === 'string' && typeof f?.text === 'string') - const project: JavaProject = { name: typeof data.name === 'string' && data.name ? data.name : 'Projekt', files, packages: Array.isArray(data.packages) ? data.packages.filter((p) => typeof p === 'string') : [] } - const roots = Array.isArray(data.sourceFolders) ? data.sourceFolders.filter((r): r is string => typeof r === 'string' && isFolderName(r) && r !== defaultRoot) : [] - if (roots.length) project.sourceFolders = roots - const uml = umlFromJSON(data.uml) - if (uml) project.uml = uml - const notes = notesFromJSON(data.notes) - if (notes) project.notes = notes - const objects = objectsFromJSON(data.objects) - if (objects) project.objects = objects - return project - } catch { - return undefined - } -} - -/** Notizen aus einer Datei prüfen: nur Einträge mit Text und Lage. */ -export function notesFromJSON(data: unknown): UmlNote[] | undefined { - if (!Array.isArray(data)) return undefined - const out: UmlNote[] = [] - for (const n of data as Partial[]) { - if (!n || typeof n.id !== 'string' || typeof n.text !== 'string' || typeof n.x !== 'number' || typeof n.y !== 'number') continue - const attach = Array.isArray(n.attach) ? n.attach.filter((a): a is string => typeof a === 'string') : [] - out.push({ id: n.id, text: n.text, x: n.x, y: n.y, ...(attach.length ? { attach } : {}) }) - } - return out.length ? out : undefined -} - -/** Objekte aus einer Datei prüfen. */ -export function objectsFromJSON(data: unknown): UmlObject[] | undefined { - if (!Array.isArray(data)) return undefined - const out: UmlObject[] = [] - for (const o of data as Partial[]) { - if (!o || typeof o.id !== 'string' || typeof o.name !== 'string' || typeof o.cls !== 'string' || typeof o.x !== 'number' || typeof o.y !== 'number') continue - const values: Record = {} - if (o.values && typeof o.values === 'object') for (const [k, v] of Object.entries(o.values)) if (typeof v === 'string') values[k] = v - out.push({ id: o.id, name: o.name, cls: o.cls, x: o.x, y: o.y, values }) - } - return out.length ? out : undefined -} - -/** Nur Einträge mit Objekt als Wert übernehmen (Datei kann von außen kommen). */ -export function umlFromJSON(data: unknown): UmlInfo | undefined { - if (!data || typeof data !== 'object' || Array.isArray(data)) return undefined - const out: UmlInfo = {} - for (const [key, value] of Object.entries(data as Record)) if (value && typeof value === 'object' && !Array.isArray(value)) out[key] = value as UmlInfo[string] - return Object.keys(out).length ? out : undefined -} - -// MARK: - Beispiel - -/** Beispiel wie im Spickzettel Java OOP & UML: Tier und Hund im Package `tiere`, Besitzer in `personen`. */ -export function exampleProject(): JavaProject { - return { - name: 'Zoo', - packages: [], - uml: { 'Besitzer.hunde': { kind: 'aggregation', name: 'führt aus', reading: 'forward', sourceMultiplicity: '1' } }, - files: [ - { - path: 'tiere/Tier.java', - text: `package tiere; - -public class Tier { - private String name; - private int alter; - - public Tier(String name, int alter) { - this.name = name; - this.alter = alter; - } - - public String getName() { - return name; - } - - public void lautGeben() { - System.out.println("..."); - } -} -`, - }, - { - path: 'tiere/Hund.java', - text: `package tiere; - -public class Hund extends Tier { - private String rasse; - - public Hund(String name, int alter, String rasse) { - super(name, alter); - this.rasse = rasse; - } - - public void lautGeben() { - System.out.println("Wuff"); - } -} -`, - }, - { - path: 'personen/Besitzer.java', - text: `package personen; - -import java.util.ArrayList; -import tiere.Hund; - -public class Besitzer { - private String name; - private ArrayList hunde = new ArrayList<>(); - - public void gassiGehen() { - for (Hund h : hunde) { - h.lautGeben(); - } - } -} -`, - }, - ], - } -} diff --git a/web/src/core/javaStringCoding.ts b/web/src/core/javaStringCoding.ts deleted file mode 100644 index 2a41a4ff..00000000 --- a/web/src/core/javaStringCoding.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** Java `XMLLeser.encodeS/decodeS`: Unicode-Codepoints als `;`-getrennte Zahlen. */ -export function encodeJavaString(s: string): string { - if (s === '') return '-1;' - let out = '' - for (const ch of s) out += ch.codePointAt(0)! + ';' - return out -} - -export function decodeJavaString(coded: string): string { - const parts = coded.split(';').filter((p) => p !== '') - if (parts.length === 1 && parts[0] === '-1') return '' - let out = '' - for (const p of parts) { - if (!/^[+-]?\d+$/.test(p)) continue - const i = Number(p) - // Java: -1 => leere Zeile - if (i === -1) continue - // Wie Swift `UnicodeScalar(i)`: keine Surrogate, nichts außerhalb des Unicode-Bereichs. - if (i < 0 || i > 0x10ffff || (i >= 0xd800 && i <= 0xdfff)) continue - out += String.fromCodePoint(i) - } - return out -} diff --git a/web/src/core/layout.ts b/web/src/core/layout.ts deleted file mode 100644 index 8764cbdc..00000000 --- a/web/src/core/layout.ts +++ /dev/null @@ -1,591 +0,0 @@ -import { ElementType, type VSDocument, type VSElement } from './model' -import { approximateMeasure, type MeasureText } from './textMeasurement' - -/** - * Port von `VisuStructLayout.swift` / `VisuStructLayoutEngineMetrics.swift` (Näherung an das Java-Layout). - * Die Struktur folgt bewusst dem Swift-Code, damit Änderungen dort leicht nachgezogen werden können. - */ - -export interface Rect { - x: number - y: number - width: number - height: number -} - -export interface LayoutNode { - /** Stabiler Pfad im Baum (für Auswahl und Bearbeitung). */ - idPath: number[] - element: VSElement - frame: Rect - /** Höhe des Kopfbands (Verzweigung/Fallauswahl), bzw. Fuß bei Do-Until. */ - headerBandHeight: number - topBandHeight: number - loopBodyLeadingInset: number - caseColumnFrames: Rect[] - dividerX?: number - dividerYInset?: number - /** Verzweigung/Fallauswahl: Kinder pro Spalte. */ - columns?: LayoutNode[][] - children: LayoutNode[] -} - -export interface Layout { - canvasSize: { width: number; height: number } - elements: LayoutNode[] -} - -export interface Metrics { - fontSize: number - lineHeight: number - charWidth: number - baseHeaderExtra: number - minSidePadding: number - cellTextInsetY: number - doUntilDoLabelTopInset: number - doUntilFooterTopInset: number - doUntilFooterBottomInset: number -} - -const defaultMetrics: Metrics = { - fontSize: 15, - lineHeight: 20, - charWidth: 7, - baseHeaderExtra: 20, - minSidePadding: 42, - cellTextInsetY: 15, - doUntilDoLabelTopInset: 2, - doUntilFooterTopInset: 6, - doUntilFooterBottomInset: 8, -} - -/** Gleiche Typometrie wie in der iOS-`DiagramCanvasView`. */ -export function diagramDisplayMetrics(isRegularWidth: boolean): Metrics { - const dF = 2 - const dLH = 5 - if (isRegularWidth) { - const fontSize = 12 + dF - return { - ...defaultMetrics, - fontSize, - lineHeight: 16 + dLH, - charWidth: 5.5 * (fontSize / 12), - baseHeaderExtra: 16 + dLH, - minSidePadding: 40, - } - } - const b = defaultMetrics - const fontSize = b.fontSize + dF - return { - ...defaultMetrics, - fontSize, - lineHeight: b.lineHeight + dLH, - charWidth: b.charWidth * (fontSize / b.fontSize), - baseHeaderExtra: b.baseHeaderExtra + 2, - minSidePadding: b.minSidePadding + 8, - } -} - -export function scaleMetrics(m: Metrics, factor: number): Metrics { - if (factor <= 0 || Math.abs(factor - 1) <= 1e-6) return m - const out = { ...m } - for (const k of Object.keys(out) as (keyof Metrics)[]) out[k] = m[k] * factor - return out -} - -const isLoopType = (t: ElementType) => - t === ElementType.forSchleife || - t === ElementType.whileSchleife || - t === ElementType.doUntilSchleife || - t === ElementType.endlosschleife - -const isMultiType = (t: ElementType) => t === ElementType.fallauswahl || t === ElementType.verzweigung - -function newNode(idPath: number[], element: VSElement, frame: Rect, headerBandHeight = 0): LayoutNode { - return { - idPath, - element, - frame, - headerBandHeight, - topBandHeight: 0, - loopBodyLeadingInset: 0, - caseColumnFrames: [], - children: [], - } -} - -/** Flache Kopie mit eigenem `frame` (Swift-Structs sind Werttypen). */ -function copy(n: LayoutNode): LayoutNode { - return { ...n, frame: { ...n.frame } } -} - -export class LayoutEngine { - constructor( - public metrics: Metrics = defaultMetrics, - private measure: MeasureText = approximateMeasure, - ) {} - - layout(document: VSDocument, inset: { left: number; top: number } = { left: 28, top: 28 }): Layout { - const rawNodes = this.layoutList(document.elements, inset.left, inset.top, []) - const nodes = rawNodes.map((n) => this.stretchLoopBodiesVertically(n)) - let maxX = 0 - let maxY = 0 - const walk = (n: LayoutNode) => { - maxX = Math.max(maxX, n.frame.x + n.frame.width) - maxY = Math.max(maxY, n.frame.y + n.frame.height) - n.children.forEach(walk) - } - nodes.forEach(walk) - return { canvasSize: { width: maxX + inset.left, height: maxY + inset.top }, elements: nodes } - } - - private lineWidth(text: string): number { - return Math.ceil(this.measure(text, this.metrics.fontSize, 'medium')) - } - - private lineWidthBold(text: string): number { - return Math.ceil(this.measure(text, this.metrics.fontSize, 'bold')) - } - - private layoutList(elements: VSElement[], x: number, y: number, idBase: number[]): LayoutNode[] { - let out: LayoutNode[] = [] - let curY = y - elements.forEach((e, i) => { - const node = this.layoutElement(e, x, curY, [...idBase, i]) - out.push(node) - curY += node.frame.height - }) - // Alle Nodes auf gleiche Breite wie die breiteste (Java: `breiteDerUnterelementeSetzen`). - const maxW = Math.max(0, ...out.map((n) => n.frame.width)) - if (maxW > 0) out = out.map((n) => this.stretchNodeTreeToWidth(n, maxW)) - return out - } - - private stretchMultiwayNodeToWidth(node: LayoutNode, newWidth: number): LayoutNode { - const n = copy(node) - if (n.caseColumnFrames.length === 0) return n - // Alte Breite aus den Spalten, nicht aus `frame.width`: Aufrufer setzen `frame.width` oft schon - // vorher auf die neue Breite. Sonst wäre scale = 1 und die Spalten blieben schmaler als der Kopf. - const oldW = n.caseColumnFrames.reduce((s, c) => s + c.width, 0) - if (!(oldW > 0)) return n - const scale = newWidth / oldW - n.frame.width = newWidth - let xCursor = n.frame.x - const newFrames: Rect[] = n.caseColumnFrames.map((col) => { - const nw = col.width * scale - const r = { x: xCursor, y: col.y, width: nw, height: col.height } - xCursor += nw - return r - }) - n.caseColumnFrames = newFrames - n.dividerX = newFrames.length > 0 ? newFrames[newFrames.length - 1].x : n.frame.x + newWidth - if (n.columns && n.columns.length === newFrames.length) { - n.columns = n.columns.map((colNodes, idx) => { - const col = newFrames[idx] - return colNodes.map((cn) => { - const c = copy(cn) - c.frame.x = col.x - c.frame.width = col.width - return this.stretchDescendantsWidths(c, col.width) - }) - }) - n.children = n.columns.flat() - } - return n - } - - private stretchLoopChildren(n: LayoutNode, newWidth: number): void { - const lead = this.effectiveLoopBodyLeading(n) - const innerW = Math.max(0, newWidth - lead) - n.children = n.children.map((child) => { - const c = copy(child) - c.frame.x = n.frame.x + lead - c.frame.width = innerW - return this.stretchDescendantsWidths(c, innerW) - }) - } - - private stretchNodeTreeToWidth(node: LayoutNode, newWidth: number): LayoutNode { - const n = copy(node) - const oldW = n.frame.width - if (!(oldW > 0)) return n - if (isMultiType(n.element.type) && n.caseColumnFrames.length > 0) { - return this.stretchMultiwayNodeToWidth(n, newWidth) - } - n.frame.width = newWidth - if (isLoopType(n.element.type)) { - this.stretchLoopChildren(n, newWidth) - } else { - n.children = n.children.map((c) => this.stretchDescendantsWidths(c, newWidth)) - } - return n - } - - private stretchDescendantsWidths(node: LayoutNode, parentWidth: number): LayoutNode { - let n = copy(node) - if (isMultiType(n.element.type)) { - n = this.stretchNodeTreeToWidth(n, parentWidth) - } else if (isLoopType(n.element.type)) { - n.frame.width = parentWidth - this.stretchLoopChildren(n, parentWidth) - } else { - n.frame.width = parentWidth - n.children = n.children.map((c) => this.stretchDescendantsWidths(c, parentWidth)) - } - return n - } - - /** Letztes Rumpf-Element von Schleifen bis zur unteren Kante strecken (verhindert weiße Streifen). */ - private stretchLoopBodiesVertically(node: LayoutNode): LayoutNode { - const n = copy(node) - if (n.columns && n.columns.length > 0) { - n.columns = n.columns.map((col) => col.map((c) => this.stretchLoopBodiesVertically(c))) - n.children = n.columns.flat() - return n - } - n.children = n.children.map((c) => this.stretchLoopBodiesVertically(c)) - - const canAbsorb = (t: ElementType) => - t === ElementType.anweisung || - t === ElementType.leerElement || - t === ElementType.aufruf || - t === ElementType.aussprung || - isLoopType(t) - - let limitY: number | undefined - switch (n.element.type) { - case ElementType.forSchleife: - case ElementType.whileSchleife: - case ElementType.endlosschleife: { - const bottomStrip = n.element.type === ElementType.endlosschleife ? 40 : 0 - limitY = n.frame.y + n.frame.height - bottomStrip - break - } - case ElementType.doUntilSchleife: - limitY = n.frame.y + n.frame.height - n.headerBandHeight - break - } - if (limitY !== undefined && n.children.length > 0) { - const li = n.children.length - 1 - let last = copy(n.children[li]) - const gap = limitY - (last.frame.y + last.frame.height) - if (gap > 0.5 && canAbsorb(last.element.type)) { - last.frame.height += gap - last = this.stretchLoopBodiesVertically(last) - n.children = [...n.children.slice(0, li), last] - } - } - return n - } - - private headerHeight(e: VSElement): number { - const m = this.metrics - const lines = Math.max(1, e.textLines.length) - if (e.type === ElementType.doUntilSchleife) { - return m.doUntilFooterTopInset + lines * m.lineHeight + m.doUntilFooterBottomInset + e.zoomY - } - let baseExtra: number - switch (e.type) { - case ElementType.fallauswahl: - baseExtra = 40 - break - case ElementType.verzweigung: - baseExtra = 20 - break - case ElementType.forSchleife: - case ElementType.whileSchleife: - case ElementType.endlosschleife: - baseExtra = m.baseHeaderExtra + 4 - break - default: - baseExtra = 14 - } - return baseExtra + lines * m.lineHeight + e.zoomY - } - - private doUntilBodyLeadingInset(): number { - return Math.max(20, this.lineWidthBold('do') + 12) - } - - private effectiveLoopBodyLeading(node: LayoutNode): number { - if (node.element.type === ElementType.doUntilSchleife) { - return node.loopBodyLeadingInset > 0 ? node.loopBodyLeadingInset : this.doUntilBodyLeadingInset() - } - return 20 - } - - private horizontalPaddingInsideCell(t: ElementType): number { - if (isMultiType(t)) return Math.max(100, this.metrics.minSidePadding * 2.45) - return this.metrics.minSidePadding - } - - private minWidth(e: VSElement): number { - const measured = e.textLines.length === 0 ? 0 : Math.max(...e.textLines.map((l) => this.lineWidth(l))) - let w = measured + e.zoomX + this.horizontalPaddingInsideCell(e.type) - if (e.type === ElementType.aufruf) { - const callMargins = Math.max(68, this.metrics.minSidePadding * 1.7) - const breathingRoom = Math.max(8, this.metrics.minSidePadding * 0.2) - w = Math.max(w, measured + e.zoomX + callMargins + breathingRoom) - } - const floor = e.type === ElementType.leerElement ? 76 : e.type === ElementType.aufruf ? 104 : 72 - return Math.max(floor, w) - } - - private layoutElement(e: VSElement, x: number, y: number, idPath: number[]): LayoutNode { - if (isMultiType(e.type)) return this.layoutMultiway(e, x, y, idPath) - if (isLoopType(e.type)) return this.layoutLoop(e, x, y, idPath) - const h = this.headerHeight(e) - return newNode(idPath, e, { x, y, width: this.minWidth(e), height: h }, h) - } - - private layoutLoop(e: VSElement, x: number, y: number, idPath: number[]): LayoutNode { - const sumH = (ns: LayoutNode[]) => ns.reduce((s, n) => s + n.frame.height, 0) - const maxW = (ns: LayoutNode[]) => Math.max(0, ...ns.map((n) => n.frame.width)) - const body = e.loopBody ?? [] - - if (e.type === ElementType.doUntilSchleife) { - const bodyLeading = this.doUntilBodyLeadingInset() - const doBand = e.zoomY - const footerH = this.headerHeight(e) - const children = this.layoutList(body, x + bodyLeading, y + doBand, [...idPath, 0]) - const w = Math.max(this.minWidth(e), maxW(children) + bodyLeading) - const h = sumH(children) + footerH + doBand - const innerW = Math.max(0, w - bodyLeading) - const node = newNode(idPath, e, { x, y, width: w, height: h }, footerH) - node.topBandHeight = doBand - node.loopBodyLeadingInset = bodyLeading - node.children = children.map((c) => { - const nn = copy(c) - nn.frame.x = x + bodyLeading - nn.frame.width = innerW - return this.stretchDescendantsWidths(nn, innerW) - }) - return node - } - - const leftInset = 20 - const header = this.headerHeight(e) - const bottom = e.type === ElementType.endlosschleife ? 40 : 0 - const children = this.layoutList(body, x + leftInset, y + header, [...idPath, 0]) - const w = Math.max(this.minWidth(e), maxW(children) + leftInset) - const h = header + bottom + sumH(children) - const innerW = Math.max(0, w - leftInset) - const node = newNode(idPath, e, { x, y, width: w, height: h }, header) - node.children = children.map((c) => { - const nn = copy(c) - nn.frame.x = x + leftInset - nn.frame.width = innerW - return this.stretchDescendantsWidths(nn, innerW) - }) - return node - } - - private layoutMultiway(e: VSElement, x: number, y: number, idPath: number[]): LayoutNode { - const header = this.headerHeight(e) - const cases = e.cases ?? [] - const colCount = Math.max(1, cases.length) - const colWidthGuess = Math.max(this.minWidth(e) / colCount, 132) - - let columnFrames: Rect[] = [] - let columnChildren: LayoutNode[][] = [] - let totalW = 0 - let maxColH = 0 - - cases.forEach((c, i) => { - const colX = x + totalW - const listNodes = this.layoutList(c.elements, colX, y + header, [...idPath, i]) - const contentW = Math.max(0, ...listNodes.map((n) => n.frame.width)) - let colW: number - if (e.type === ElementType.verzweigung && colCount === 2) { - const branchLabel = i === 0 ? 'true' : 'false' - colW = Math.max(contentW, branchLabel.length * this.metrics.charWidth + 24) - } else { - colW = Math.max(colWidthGuess, contentW) - } - const colH = listNodes.reduce((s, n) => s + n.frame.height, 0) - maxColH = Math.max(maxColH, colH) - columnFrames.push({ x: colX, y: y + header, width: colW, height: colH }) - columnChildren.push( - listNodes.map((n) => { - const nn = copy(n) - nn.frame.x = colX - nn.frame.width = colW - return this.stretchDescendantsWidths(nn, colW) - }), - ) - totalW += colW - }) - - // Zweiarmige Verzweigung: beide Spalten gleich breit. Nicht, wenn eine Spalte selbst eine - // Verzweigung oder Fallauswahl enthält: Sonst verdoppelt sich die Breite mit jeder Ebene - // (verschachtelte else-Ketten werden unlesbar breit). - if ( - e.type === ElementType.verzweigung && - colCount === 2 && - columnFrames.length === 2 && - !cases.some((c) => containsMultiway(c.elements)) - ) { - const target = Math.max(columnFrames[0].width, columnFrames[1].width) - const xLeft = x - const xRight = x + target - const deltaRight = xRight - columnFrames[1].x - columnFrames[0] = { ...columnFrames[0], x: xLeft, width: target } - columnFrames[1] = { ...columnFrames[1], x: xRight, width: target } - totalW = target * 2 - columnChildren[0] = columnChildren[0].map((cn) => { - const c = copy(cn) - c.frame.x = xLeft - c.frame.width = target - return this.stretchDescendantsWidths(c, target) - }) - columnChildren[1] = columnChildren[1].map((cn) => { - const c = shiftTreeX(cn, deltaRight) - c.frame.width = target - return this.stretchDescendantsWidths(c, target) - }) - } - - if (columnChildren.length > 0) { - const harmonized = harmonizeRowHeightsAcrossColumns(columnChildren, y + header) - columnChildren = harmonized.columns.map((col) => col.map((c) => this.stretchLoopBodiesVertically(c))) - for (let i = 0; i < Math.min(columnFrames.length, harmonized.columnHeights.length); i++) { - columnFrames[i] = { ...columnFrames[i], height: harmonized.columnHeights[i] } - } - maxColH = harmonized.columnHeights.length > 0 ? Math.max(...harmonized.columnHeights) : maxColH - } - - let w = Math.max(totalW, this.minWidth(e)) - if (totalW > 0.5 && w > totalW + 0.5) { - const scale = w / totalW - let xCursor = x - const newFrames: Rect[] = [] - const newCols: LayoutNode[][] = [] - columnFrames.forEach((col, i) => { - const nw = col.width * scale - newCols.push( - columnChildren[i].map((cn) => { - const c = copy(cn) - c.frame.x = xCursor - c.frame.width = nw - return this.stretchDescendantsWidths(c, nw) - }), - ) - newFrames.push({ x: xCursor, y: col.y, width: nw, height: col.height }) - xCursor += nw - }) - columnFrames = newFrames - columnChildren = newCols - totalW = xCursor - x - w = totalW - } - - const lastW = columnFrames.length > 0 ? columnFrames[columnFrames.length - 1].width : totalW / colCount - const node = newNode(idPath, e, { x, y, width: w, height: header + maxColH }, header) - node.caseColumnFrames = columnFrames - node.dividerX = columnFrames.length > 0 ? columnFrames[columnFrames.length - 1].x : x + totalW - lastW - node.dividerYInset = e.type === ElementType.fallauswahl ? -20 : 0 - node.columns = columnChildren - node.children = columnChildren.flat() - return node - } -} - -/** Steckt irgendwo (auch in Schleifen) eine Verzweigung oder Fallauswahl? */ -function containsMultiway(elements: VSElement[]): boolean { - return elements.some( - (el) => - isMultiType(el.type) || - containsMultiway(el.loopBody ?? []) || - (el.cases ?? []).some((c) => containsMultiway(c.elements)), - ) -} - -function shiftDescendantsY(node: LayoutNode, delta: number): LayoutNode { - if (Math.abs(delta) <= 0.0001) return node - const n = copy(node) - const shift = (c: LayoutNode) => { - const cc = copy(c) - cc.frame.y += delta - return shiftDescendantsY(cc, delta) - } - if (n.columns) { - n.columns = n.columns.map((col) => col.map(shift)) - n.children = n.columns.flat() - } else { - n.children = n.children.map(shift) - } - return n -} - -function shiftTreeX(node: LayoutNode, delta: number): LayoutNode { - if (Math.abs(delta) <= 0.0001) return node - const n = copy(node) - n.frame.x += delta - if (n.columns) { - n.columns = n.columns.map((col) => col.map((c) => shiftTreeX(c, delta))) - n.children = n.columns.flat() - } else { - n.children = n.children.map((c) => shiftTreeX(c, delta)) - } - return n -} - -/** Zeilenhöhen spaltenübergreifend synchronisieren, damit horizontale Trennlinien nicht „stufig“ werden. */ -function harmonizeRowHeightsAcrossColumns( - columns: LayoutNode[][], - startY: number, -): { columns: LayoutNode[][]; columnHeights: number[] } { - if (columns.length < 2) { - return { columns, columnHeights: columns.map((c) => c.reduce((s, n) => s + n.frame.height, 0)) } - } - const eps = 0.5 - const lines: number[] = [startY] - for (const col of columns) for (const n of col) lines.push(n.frame.y + n.frame.height) - const maxBottom = Math.max(...lines) - lines.push(maxBottom) - lines.sort((a, b) => a - b) - - let merged: number[] = [] - for (const v of lines) { - if (merged.length > 0 && Math.abs(v - merged[merged.length - 1]) <= eps) continue - merged.push(v) - } - if (merged.length === 0 || Math.abs(merged[0] - startY) > eps) merged.unshift(startY) - if (merged.length === 0) merged = [startY, maxBottom] - else if (merged[merged.length - 1] < maxBottom - 1e-6) merged.push(maxBottom) - else merged[merged.length - 1] = maxBottom - - const nextLineIndex = (y: number, minIndex: number) => { - let i = Math.max(0, minIndex) - while (i < merged.length && merged[i] < y - eps) i++ - return Math.min(i, merged.length - 1) - } - - const outCols: LayoutNode[][] = [] - const colHeights: number[] = [] - for (const col of columns) { - if (col.length === 0) { - outCols.push([]) - colHeights.push(0) - continue - } - const newCol: LayoutNode[] = [] - let topLineIdx = 0 - col.forEach((orig, idx) => { - let n = copy(orig) - const desiredTop = merged[topLineIdx] - const origBottom = orig.frame.y + orig.frame.height - const bottomLineIdx = idx === col.length - 1 ? merged.length - 1 : nextLineIndex(origBottom, topLineIdx + 1) - const desiredBottom = merged[bottomLineIdx] - const deltaY = desiredTop - n.frame.y - n.frame.y = desiredTop - n.frame.height = Math.max(0, desiredBottom - desiredTop) - n = shiftDescendantsY(n, deltaY) - newCol.push(n) - topLineIdx = bottomLineIdx - }) - outCols.push(newCol) - colHeights.push(merged[merged.length - 1] - startY) - } - return { columns: outCols, columnHeights: colHeights } -} diff --git a/web/src/core/lineEditorText.ts b/web/src/core/lineEditorText.ts deleted file mode 100644 index 615d4d0c..00000000 --- a/web/src/core/lineEditorText.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** Port von `Editing/VisuStructLineEditorText.swift`: Textumformungen für den Zeileneditor (ohne UI). */ - -export type StatementIOMode = 'statement' | 'input' | 'output' - -const isWs = (c: string | undefined) => c !== undefined && /\s/.test(c) - -export function ioMode(text: string): StatementIOMode { - const t = text.trim().toLowerCase() - if (t.startsWith('input:')) return 'input' - if (t.startsWith('output:') || t.startsWith('print:')) return 'output' - return 'statement' -} - -/** Entfernt `input:` / `output:` / `print:` und umgebende Leerzeichen; ohne Präfix bleibt der Text unverändert. */ -export function strippingIOPrefix(s: string): string { - const trimmed = s.trim() - const lower = trimmed.toLowerCase() - if (lower.startsWith('input:')) return trimmed.slice(6).trim() - if (lower.startsWith('output:')) return trimmed.slice(7).trim() - if (lower.startsWith('print:')) return trimmed.slice(6).trim() - return s -} - -function prefixing(p: string, content: string): string { - const c = content.trim() - return c === '' ? `${p} ` : `${p} ${c}` -} - -/** Text nach Wechsel der Art: Präfix tauschen, Inhalt behalten. */ -export function applyingIOMode(mode: StatementIOMode, text: string): string { - const stripped = strippingIOPrefix(text) - switch (mode) { - case 'statement': return stripped - case 'input': return prefixing('input:', stripped) - case 'output': return prefixing('output:', stripped) - } -} - -const dropOneLeadingWhitespace = (s: string) => (isWs(s[0]) ? s.slice(1) : s) - -function strippingIOPrefixPreservingEditingWhitespace(s: string): string { - const lead = s.replace(/^\s+/, '') - const lower = lead.toLowerCase() - if (lower.startsWith('input:')) return dropOneLeadingWhitespace(lead.slice(6)) - if (lower.startsWith('output:')) return dropOneLeadingWhitespace(lead.slice(7)) - if (lower.startsWith('print:')) return dropOneLeadingWhitespace(lead.slice(6)) - return s -} - -function strippingKeywordPrefixPreservingEditingWhitespace(keyword: string, s: string): string { - const lead = s.replace(/^\s+/, '') - if (!lead.toLowerCase().startsWith(keyword.toLowerCase())) return s - const after = lead.slice(keyword.length) - if (!(after === '' || isWs(after[0]) || after[0] === '(')) return s - const content = dropOneLeadingWhitespace(after) - if (content.startsWith('(') && content.endsWith(')') && content.length >= 2) return content.slice(1, -1) - return content -} - -/** Wie `strippingIOPrefix` bzw. Schlüsselwort-Entfernung, aber Leerzeichen beim Tippen bleiben erhalten. */ -export function strippingPrefixForEditing(p: string, s: string): string { - if (p === 'input:' || p === 'output:') return strippingIOPrefixPreservingEditingWhitespace(s) - const stripped = strippingKeywordPrefixPreservingEditingWhitespace(p, s) - if (p === 'while' && stripped === s) { - const legacy = strippingKeywordPrefixPreservingEditingWhitespace('until', s) - if (legacy !== s) return legacy - } - return stripped -} - -export function prefixingForEditing(p: string, content: string): string { - return content === '' ? `${p} ` : `${p} ${content}` -} - -/** Typografische Anführungszeichen (z. B. von der Tastatur) werden zu geraden Quotes. */ -export function normalizingQuotes(s: string): string { - return s.replace(/[“”„«»]/g, '"').replace(/[’‘‚´]/g, "'") -} - -/** Genau drei Felder (Start, Bedingung, Schritt) der Zählschleife. */ -export function paddedForLoopParts(lines: string[]): string[] { - const a = lines.length === 0 ? [''] : lines.slice(0, 3) - while (a.length < 3) a.push('') - return a -} - -/** Ein Feld der Zählschleife: gerade Quotes, ohne abschließende `;`. */ -export function normalizedForLoopPart(s: string): string { - let x = normalizingQuotes(s) - for (;;) { - const t = x.trim() - if (!t.endsWith(';')) return x - x = t.slice(0, -1).trim() - } -} diff --git a/web/src/core/liveSource.ts b/web/src/core/liveSource.ts deleted file mode 100644 index b13e1513..00000000 --- a/web/src/core/liveSource.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { documentReadsFiles, generateLiveCode, livePlaceholderEnd, livePlaceholderStart, sanitizedJavaClassName, type LiveCode, type LiveLabels } from './codeGenerator' -import { parseLiveJava, type JavaParseOptions, type ParsedJava } from './javaParser' -import type { VSDocument, VSElement } from './model' -import { parseSubprogramHeader } from './simulation' - -/** - * Getippter Java-Code und Struktogramm gehören zusammen: Ändert man danach das Struktogramm, - * werden nur die Zeilen der geänderten Elemente neu geschrieben. Eigene Kommentare, Leerzeilen - * und Einrückungen im übrigen Code bleiben so, wie man sie getippt hat. - */ - -/** Form des Java-Codes in „Code live“ (Zahnrad-Menü): Snippet, mit `main`, in einer Klasse oder beides. */ -export interface JavaForm { - /** `public class { … }` */ - asClass: boolean - /** `public static void main(String[] args) { … }` */ - withMain: boolean -} - -export const snippetForm: JavaForm = { asClass: false, withMain: false } - -const isImport = (line: string) => /^import\s+[\w.]+(?:\.\*)?\s*;$/.test(line.trim()) -const indented = (lines: string[]) => lines.map((l) => (l.trim() === '' ? '' : ' ' + l)) - -/** Erzeugter Java-Code der Ansicht „Code live“ als reiner Text (Platzhalter ohne Markierung) mit den Zeilen jedes Elements. */ -export function liveJava(doc: VSDocument, labels: LiveLabels, form: JavaForm = snippetForm): LiveCode { - const live = generateLiveCode(doc, 'java', labels) - let lines = live.text.replaceAll(livePlaceholderStart, '').replaceAll(livePlaceholderEnd, '').split('\n') - let spans = live.spans - const shift = (by: number) => (spans = spans.map((s) => ({ ...s, from: s.from + by, to: s.to + by }))) - const isMethod = parseSubprogramHeader(doc.caption) !== undefined - // Um `main` oder eine Klasse herum gehören die Imports ganz nach oben. - const imports: string[] = [] - if ((form.withMain && !isMethod) || form.asClass) { - for (let at = lines.findIndex(isImport); at >= 0; at = lines.findIndex(isImport)) { - imports.push(lines[at].trim()) - lines.splice(at, 1) - spans = spans.map((s) => ({ ...s, from: s.from > at ? s.from - 1 : s.from, to: s.to > at ? s.to - 1 : s.to })) - } - // Die Leerzeile hinter den Imports wandert mit nach oben. - if (imports.length && lines[0]?.trim() === '') { - lines.splice(0, 1) - spans = spans.map((s) => ({ ...s, from: s.from > 0 ? s.from - 1 : s.from, to: s.to > 0 ? s.to - 1 : s.to })) - } - if (imports.length) imports.push('') - } - // Ein Unterprogramm ist schon eine Methode: kein `main` drumherum. - if (form.withMain && !isMethod) { - // `Files.readString` kann eine IOException werfen; Java verlangt dann `throws`. - lines = [`public static void main(String[] args)${documentReadsFiles(doc) ? ' throws Exception' : ''} {`, ...indented(lines), '}'] - shift(1) - } - if (form.asClass) { - lines = [`public class ${sanitizedJavaClassName(isMethod ? 'Main' : doc.caption)} {`, ...indented(lines), '}'] - shift(1) - } - if (imports.length) { - lines = [...imports, ...lines] - shift(imports.length) - } - return { text: lines.join('\n'), spans } -} - -export function plainLiveJava(doc: VSDocument, labels: LiveLabels, form: JavaForm = snippetForm): string { - return liveJava(doc, labels, form).text -} - -/** Zum Vergleichen: ohne Leerraum, Kommentar am Zeilenende weg (ganze Kommentarzeilen bleiben). */ -function normalized(line: string): string { - const code = splitTrailingComment(line).code - return (code.trim() === '' ? line : code).replace(/\s+/g, '') -} - -/** `x++; // zählen` → Code und Kommentar (Zeichenketten werden übersprungen). */ -function splitTrailingComment(line: string): { code: string; comment: string } { - let quote = '' - for (let i = 0; i < line.length; i++) { - const c = line[i] - if (quote) { - if (c === '\\') i++ - else if (c === quote) quote = '' - } else if (c === '"' || c === "'") quote = c - else if (c === '/' && line[i + 1] === '/') return { code: line.slice(0, i).replace(/\s+$/, ''), comment: line.slice(i) } - } - return { code: line, comment: '' } -} - -type Op = { kind: 'keep'; a: number; b: number } | { kind: 'del'; a: number } | { kind: 'ins'; b: number } - -/** Zeilenweiser Vergleich (längste gemeinsame Teilfolge). */ -function diff(a: string[], b: string[], eq: (x: string, y: string) => boolean): Op[] { - const n = a.length - const m = b.length - const lcs: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0)) - for (let i = n - 1; i >= 0; i--) { - for (let j = m - 1; j >= 0; j--) lcs[i][j] = eq(a[i], b[j]) ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1]) - } - const ops: Op[] = [] - let i = 0 - let j = 0 - while (i < n || j < m) { - if (i < n && j < m && eq(a[i], b[j])) ops.push({ kind: 'keep', a: i++, b: j++ }) - // Bei Gleichstand erst löschen, dann einfügen: So landet die neue Zeile an der Stelle der alten. - else if (i < n && (j === m || lcs[i + 1][j] >= lcs[i][j + 1])) ops.push({ kind: 'del', a: i++ }) - else ops.push({ kind: 'ins', b: j++ }) - } - return ops -} - -/** - * `userText` gehört zu `oldDoc`; das Struktogramm wurde zu `newDoc` geändert. - * Ergebnis: `userText` mit den Änderungen. Lässt sich das nicht sicher übertragen, der neu erzeugte Code. - */ -export function mergeLiveJava( - userText: string, - oldDoc: VSDocument, - newDoc: VSDocument, - labels: LiveLabels, - opts: JavaParseOptions = {}, - form: JavaForm = snippetForm, -): string { - const generatedNew = plainLiveJava(newDoc, labels, form) - const generatedOld = plainLiveJava(oldDoc, labels, form) - if (userText === generatedOld) return generatedNew - const oldLines = generatedOld.split('\n') - const newLines = generatedNew.split('\n') - const user = userText.split('\n') - // Welche Zeile des getippten Codes entspricht welcher erzeugten Zeile? - const where = new Array(oldLines.length).fill(-1) - for (const op of diff(oldLines, user, (x, y) => normalized(x) !== '' && normalized(x) === normalized(y))) { - if (op.kind === 'keep') where[op.a] = op.b - } - const out: string[] = [] - let u = 0 - let comment = '' - const copyUntil = (end: number) => { - while (u < end) out.push(user[u++]) - } - for (const op of diff(oldLines, newLines, (x, y) => x === y)) { - if (op.kind === 'keep') { - if (where[op.a] >= 0) { - copyUntil(where[op.a] + 1) - comment = '' - } - } else if (op.kind === 'del') { - const at = where[op.a] - if (at < 0) continue - copyUntil(at) - comment ||= splitTrailingComment(user[at]).comment - u = at + 1 - } else { - const line = newLines[op.b] - out.push(comment && line.trim() !== '' ? `${line} ${comment}` : line) - if (line.trim() !== '') comment = '' - } - } - copyUntil(user.length) - const merged = out.join('\n') - // Nur übernehmen, wenn der Code wirklich das neue Struktogramm ergibt. - const parsed = parseLiveJava(merged, labels, opts) - return plainLiveJava(documentFromJava(newDoc, parsed), labels, form) === generatedNew ? merged : generatedNew -} - -/** - * Neues Dokument aus getipptem Code. Titel, Schrift und die Farben/Größen der Kästen bleiben, - * soweit an derselben Stelle noch dieselbe Art Element steht. - */ -export function documentFromJava(prev: VSDocument, parsed: ParsedJava): VSDocument { - let caption = parsed.caption ?? (parseSubprogramHeader(prev.caption) ? '' : prev.caption) - // `public class Rechner` wird zum Titel; aus „Mein Programm“ wird zwar `Mein_Programm`, der Titel bleibt dann aber. - if (!parsed.caption && parsed.className && sanitizedJavaClassName(caption) !== parsed.className) caption = parsed.className - return { ...prev, caption, elements: carryLooks(prev.elements, parsed.elements) } -} - -function carryLooks(old: VSElement[], next: VSElement[]): VSElement[] { - return next.map((e, i) => { - const o = old[i] - if (!o || o.type !== e.type) return e - const out: VSElement = { ...e, zoomX: o.zoomX, zoomY: o.zoomY } - if (o.textColor) out.textColor = o.textColor - if (o.backgroundColor) out.backgroundColor = o.backgroundColor - if (e.loopBody) out.loopBody = carryLooks(o.loopBody ?? [], e.loopBody) - if (e.cases) out.cases = e.cases.map((c, k) => ({ ...c, elements: carryLooks(o.cases?.[k]?.elements ?? [], c.elements) })) - return out - }) -} diff --git a/web/src/core/mbot.ts b/web/src/core/mbot.ts deleted file mode 100644 index 8ab579c5..00000000 --- a/web/src/core/mbot.ts +++ /dev/null @@ -1,415 +0,0 @@ -import { showLabel } from './mbotLink' - -/** - * mBot2 (Makeblock, mit CyberPi) im Struktogramm. Befehle stehen als Anweisung `mbot.forward(10)`, - * Sensoren als Ausdruck `mbot.getDistance()`. Die Simulation merkt sich jeden Befehl als `MBotAction`; - * mit angeschlossenem Roboter schickt die Oberfläche den Python-Text an den CyberPi. - */ - -export interface MBotAction { - method: string - args: number[] - /** Zeile für die Makeblock-Firmware; `undefined`, wenn der Browser selbst wartet (`pause`). */ - python?: string - /** Wartezeit im Browser in Millisekunden (nur `pause`). */ - waitMs?: number - /** Kurz für die Konsole, z. B. „10 cm vorwärts“. */ - label: string - /** Text für den Bildschirm (`showText`). */ - text?: string -} - -interface CommandSpec { - args: number - /** Werte, wenn die Klammern leer bleiben: `mbot.forward()` fährt einen Schritt (10 cm), `turnRight()` dreht 90°. */ - defaults?: number[] - python?: (a: number[], text: string) => string - label: (a: number[], text: string) => string - /** Das letzte Argument ist ein Text, z. B. `mbot.showText("Hallo")`; `args` zählt nur die Zahlen davor. */ - text?: boolean - /** Erlaubte Texte (sonst ist der Befehl ungültig). */ - choices?: readonly string[] - /** Sind die Zahlen erlaubt? (z. B. LED-Nummer 1–5) */ - valid?: (a: number[]) => boolean -} - -/** Der CyberPi hat fünf LEDs; in Java zählen sie wie Arrays ab 0 (`mbot.led(0)` bis `mbot.led(4)`), die Firmware ab 1. */ -export const MBOT_LED_COUNT = 5 -const ledNumber = (nr: number) => Number.isInteger(nr) && nr >= 0 && nr < MBOT_LED_COUNT - -/** Farben für `mbot.led(i).setColor("grün")`, deutsch und englisch; „aus“ schaltet die LED aus. */ -export const MBOT_LED_COLORS: Record = { - rot: [255, 0, 0], red: [255, 0, 0], - orange: [255, 100, 0], - gelb: [255, 200, 0], yellow: [255, 200, 0], - grün: [0, 255, 0], green: [0, 255, 0], - türkis: [0, 200, 200], cyan: [0, 200, 200], - blau: [0, 0, 255], blue: [0, 0, 255], - lila: [160, 0, 255], purple: [160, 0, 255], - pink: [255, 0, 120], - weiß: [255, 255, 255], white: [255, 255, 255], - aus: [0, 0, 0], off: [0, 0, 0], -} - -/** - * Vorführungen der Firmware (`cyberpi.emotion.*`): LEDs, Ton und kleine Bewegungen, am echten mBot2 getestet mit `smile`. - * `sprint` fehlt absichtlich, weil der Roboter dabei losfährt. - */ -export const MBOT_EMOTIONS = ['smile', 'hello', 'yeah', 'proud', 'wow', 'yummy', 'naughty', 'uh_oh', 'hurt', 'sad', 'angry', 'startle', 'shiver', 'dizzy', 'sleepy', 'zzz', 'wake_up', 'blink', 'yes', 'no', 'look_up', 'look_down', 'look_left', 'look_right', 'look_around'] as const - -/** Ein Schritt von `mbot.forward()` ohne Zahl. */ -export const MBOT_STEP_CM = 10 - -const n = (v: number) => String(Math.round(v * 100) / 100) - -/** - * Raddurchmesser des mBot2 in cm (Reifen außen, wie im 3D-Modell). Eine Umdrehung ist π · 6,5 ≈ 20,4 cm. - * Am echten Roboter rechnet die Firmware selbst in cm; bei `mbot2.straight` geben wir die umgerechnete Strecke. - */ -export const MBOT_WHEEL_DIAMETER_CM = 6.5 -export const MBOT_WHEEL_CIRCUMFERENCE_CM = Math.PI * MBOT_WHEEL_DIAMETER_CM - -/** - * Einheiten für die Überladung `mbot.forward(2, "Umdrehungen")` bzw. `mbot.backward(30, "cm")`: - * Faktor in cm und die Wörter für die Konsole. - */ -const DRIVE_UNITS: Record = { - cm: { cm: 1, one: 'cm', many: 'cm' }, - umdrehungen: { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'Umdrehung', many: 'Umdrehungen' }, - umdrehung: { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'Umdrehung', many: 'Umdrehungen' }, - rotations: { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'rotation', many: 'rotations' }, - rotation: { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'rotation', many: 'rotations' }, - 'rotações': { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'rotação', many: 'rotações' }, - 'rotação': { cm: MBOT_WHEEL_CIRCUMFERENCE_CM, one: 'rotação', many: 'rotações' }, -} - -/** Erlaubte Einheiten (für Fehlermeldungen). */ -export const MBOT_DRIVE_UNITS = ['cm', 'Umdrehungen', 'rotations'] as const - -/** - * `mbot.forward(2, "Umdrehungen")`: Fahrt mit Einheit. Die Aktion speichert wie `forward(41)` die Strecke in cm, - * damit Simulation, Übungsprüfung und echter Roboter nichts Neues lernen müssen; nur die Konsole nennt die Umdrehungen. - * `undefined`, wenn die Einheit unbekannt ist. - */ -export function makeMBotDriveAction(method: 'forward' | 'backward', value: number, unit: string): MBotAction | undefined { - const u = DRIVE_UNITS[unit.trim().toLowerCase()] - if (!u) return undefined - const cm = value * u.cm - const action = makeMBotAction(method, [cm]) - if (u.cm === 1) return action - const word = value === 1 ? u.one : u.many - return { ...action, label: `${n(value)} ${word} ${method === 'forward' ? 'vorwärts' : 'rückwärts'} (${n(cm)} cm)` } -} - -/** Befehle (Anweisungen). Drehen: positiver Winkel bei `mbot2.turn` dreht nach rechts. */ -export const MBOT_COMMANDS: Record = { - forward: { args: 1, defaults: [MBOT_STEP_CM], python: ([cm]) => `mbot2.straight(${n(cm)})`, label: ([cm]) => `${n(cm)} cm vorwärts` }, - backward: { args: 1, defaults: [MBOT_STEP_CM], python: ([cm]) => `mbot2.straight(${n(-cm)})`, label: ([cm]) => `${n(cm)} cm rückwärts` }, - turnLeft: { args: 1, defaults: [90], python: ([deg]) => `mbot2.turn(${n(-deg)})`, label: ([deg]) => `${n(deg)}° nach links drehen` }, - turnRight: { args: 1, defaults: [90], python: ([deg]) => `mbot2.turn(${n(deg)})`, label: ([deg]) => `${n(deg)}° nach rechts drehen` }, - stop: { args: 0, python: () => `mbot2.EM_stop("ALL")`, label: () => 'anhalten' }, - /** - * Räder einzeln, Leistung in Prozent (−100 … 100); er fährt weiter, bis ein anderer Fahrbefehl oder `stop()` kommt. - * Der rechte Motor ist am mBot2 gespiegelt eingebaut, deshalb das Minus. - */ - drive: { args: 2, python: ([l, r]) => `mbot2.drive_power(${n(l)}, ${n(-r)})`, label: ([l, r]) => `Räder links ${n(l)} %, rechts ${n(r)} %` }, - setLed: { args: 3, python: ([r, g, b]) => `cyberpi.led.on(${n(r)}, ${n(g)}, ${n(b)})`, label: ([r, g, b]) => `LEDs (${n(r)}, ${n(g)}, ${n(b)})` }, - ledOff: { args: 0, python: () => 'cyberpi.led.off()', label: () => 'LEDs aus' }, - /** `mbot.led(i).setColor("grün")`: eine LED (0–4); aus ist `on(0, 0, 0)`. */ - ledColor: { - args: 1, - text: true, - choices: Object.keys(MBOT_LED_COLORS), - valid: ([nr]) => ledNumber(nr), - python: ([nr], color) => `cyberpi.led.on(${MBOT_LED_COLORS[color].join(', ')}, id=${nr + 1})`, - label: ([nr], color) => `LED ${nr}: ${color}`, - }, - playTone: { args: 2, python: ([hz, ms]) => `cyberpi.audio.play_tone(${n(hz)}, ${n(ms / 1000)})`, label: ([hz, ms]) => `Ton ${n(hz)} Hz, ${n(ms)} ms` }, - pause: { args: 1, label: ([ms]) => `${n(ms)} ms warten` }, - resetTimer: { args: 0, python: () => 'cyberpi.timer.reset()', label: () => 'Stoppuhr auf 0' }, - emotion: { args: 0, text: true, choices: MBOT_EMOTIONS, python: (_, name) => `cyberpi.emotion.${name}()`, label: (_, name) => `Gefühl: ${name}` }, - showText: { args: 0, text: true, python: (_, text) => showLabel(text), label: (_, text) => `Bildschirm: ${text}` }, -} - -/** Messwert eines Sensors: Zahl, wahr/falsch oder Text (Farbname bei `getColor()`). */ -export type MBotSensorValue = number | boolean | string - -interface SensorSpec { - python: string - /** Wert in der Simulation, wenn weder Welt noch Regler ihn liefern */ - simulated: MBotSensorValue -} - -/** Farben, die der Quad-RGB-Sensor im Simulator erkennt (Felder `r g b y` in einer Weltkarte). */ -export const MBOT_COLORS = ['red', 'green', 'blue', 'yellow'] as const -export type MBotColor = (typeof MBOT_COLORS)[number] - -/** Farbnamen von `mbot.getColor()`: wie bei `setColor`, Deutsch oder Englisch je nach Sprache der Lektionen. */ -const COLOR_NAMES: Record = { - red: { de: 'rot', en: 'red' }, - green: { de: 'grün', en: 'green' }, - blue: { de: 'blau', en: 'blue' }, - yellow: { de: 'gelb', en: 'yellow' }, - cyan: { de: 'türkis', en: 'cyan' }, - purple: { de: 'lila', en: 'purple' }, - white: { de: 'weiß', en: 'white' }, - black: { de: 'schwarz', en: 'black' }, -} -let colorLanguage: 'de' | 'en' = 'en' - -/** Sprache der Farbnamen, die `mbot.getColor()` liefert (Deutsch nur bei deutschen Lektionen). */ -export function setMBotColorLanguage(language: string) { - colorLanguage = language === 'de' ? 'de' : 'en' -} - -export const mbotColorLanguage = () => colorLanguage - -/** `red`, `rot` oder eine Antwort des echten Sensors → Farbname in der aktuellen Sprache. */ -export function mbotColorName(color: string): string { - const key = color.trim().toLowerCase() - const entry = COLOR_NAMES[key] ?? Object.values(COLOR_NAMES).find((e) => e.de === key) - return entry ? entry[colorLanguage] : key -} -const press = (key: string): SensorSpec => ({ python: `cyberpi.controller.is_press('${key}')`, simulated: false }) - -/** - * Sensoren (Ausdrücke ohne Argumente): Zahlen oder Wahrheitswerte. - * Der Python-Text liest den Wert am echten mBot2 (Modus 1, Antwort `{"ret":…}`). - */ -export const MBOT_SENSORS: Record = { - getDistance: { python: 'mbuild.ultrasonic2.get(1)', simulated: 100 }, - getLine: { python: "mbuild.quad_rgb_sensor.get_line_sta('all', 1)", simulated: 0 }, - // die beiden mittleren Fühler (L1, R1) des Liniensensors - isLineLeft: { python: "mbuild.quad_rgb_sensor.is_line('L1', 1)", simulated: false }, - isLineRight: { python: "mbuild.quad_rgb_sensor.is_line('R1', 1)", simulated: false }, - /** Farbe unter dem mBot2 als Text: `mbot.getColor().equals("rot")` */ - getColor: { python: "mbuild.quad_rgb_sensor.get_color_sta('L1', 1)", simulated: 'white' }, - isButtonA: press('a'), - isButtonB: press('b'), - isJoystickUp: press('up'), - isJoystickDown: press('down'), - isJoystickLeft: press('left'), - isJoystickRight: press('right'), - getBrightness: { python: 'cyberpi.get_bri()', simulated: 50 }, - getLoudness: { python: "cyberpi.get_loudness('maximum')", simulated: 0 }, - getPitch: { python: 'cyberpi.get_pitch()', simulated: 0 }, - getRoll: { python: 'cyberpi.get_roll()', simulated: 0 }, - isShaken: { python: 'cyberpi.is_shake()', simulated: false }, - getBattery: { python: 'cyberpi.get_battery()', simulated: 100 }, - /** Sekunden seit dem Start bzw. seit `resetTimer()` */ - getTimer: { python: 'cyberpi.timer.get()', simulated: 0 }, -} - -/** Messwerte des Roboters nach Namen (`getDistance` → 38, `isButtonA` → true). */ -export type MBotSensorValues = Partial> - -/** Welche Sensoren kommen in diesem Text vor (z. B. im ganzen Diagramm)? */ -export function usedMBotSensors(text: string): string[] { - const found = new Set() - for (const m of text.matchAll(/\bmbot\s*\.\s*([A-Za-z_]\w*)\s*\(\s*\)/gu)) if (m[1] in MBOT_SENSORS) found.add(m[1]) - return [...found] -} - -/** `mbot.forward(10)` → Name und Argumenttexte; `undefined`, wenn es kein mBot-Befehl ist. */ -export function parseMBotCommand(text: string): { method: string; args: string[] } | undefined { - // `mbot.led(i).setColor("grün")` wird zu `ledColor(i, "grün")` - const led = /^mbot\s*\.\s*led\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)\s*\.\s*setColor\s*\(([\s\S]*)\)\s*;?$/u.exec(text.trim()) - if (led) return { method: 'ledColor', args: [led[1].trim(), led[2].trim()] } - const m = /^mbot\s*\.\s*([A-Za-z_]\w*)\s*\(([\s\S]*)\)\s*;?$/u.exec(text.trim()) - if (!m) return undefined - const inner = m[2].trim() - return { method: m[1], args: inner === '' ? [] : splitArgs(inner) } -} - -/** Argumente prüfen und leere Klammern mit den Standardwerten füllen; `undefined` bei falscher Anzahl. */ -export function mbotArguments(method: string, args: number[]): number[] | undefined { - const spec = MBOT_COMMANDS[method] - if (!spec) return undefined - const values = args.length === 0 && spec.defaults ? spec.defaults : args - if (values.length !== spec.args) return undefined - return !spec.valid || spec.valid(values) ? values : undefined -} - -export function makeMBotAction(method: string, args: number[], text = ''): MBotAction { - const spec = MBOT_COMMANDS[method] - return { - method, - args, - python: spec.python?.(args, text), - waitMs: method === 'pause' ? Math.max(0, args[0]) : undefined, - label: spec.label(args, text), - ...(spec.text ? { text } : {}), - } -} - -/** - * Alle Befehle als Liste wie `setLed 255 0 0`, `pause 500`, `showText "Hallo"` (zum Prüfen von LEDs, Tönen und Bildschirm). - * Anders als `driveSignature` wird nichts zusammengefasst. - */ -export function actionSignature(actions: { method: string; args: number[]; text?: string }[]): string[] { - return actions.map((a) => [a.method, ...a.args.map(n), ...(a.text !== undefined ? [JSON.stringify(a.text)] : [])].join(' ')) -} - -/** Erwartete Befehle einer Übung, z. B. `befehle: 3 x (setLed 255 0 0, pause 500, ledOff, pause 500)`; Texte in Anführungszeichen. */ -export function parseActionSpec(spec: string): string[] { - let i = 0 - const src = spec.trim() - const list = (): string[] => { - const items: string[] = [] - for (;;) { - while (src[i] === ' ' || src[i] === ',') i++ - if (i >= src.length || src[i] === ')') return items - const rep = /^(\d+)\s*[x×]\s*\(/u.exec(src.slice(i)) - if (rep) { - i += rep[0].length - const inner = list() - if (src[i] !== ')') throw new Error(`„)“ fehlt in „${spec}“`) - i++ - for (let k = 0; k < Number(rep[1]); k++) items.push(...inner) - continue - } - const step = /^([A-Za-z]+)((?:\s+-?\d+(?:\.\d+)?)*)(?:\s+("(?:[^"\\]|\\.)*"))?/u.exec(src.slice(i)) - if (!step) throw new Error(`Unbekannt in „${spec}“: ${src.slice(i)}`) - i += step[0].length - const spec_ = MBOT_COMMANDS[step[1]] - if (!spec_) throw new Error(`Unbekannter Befehl in „${spec}“: ${step[1]}`) - const nums = step[2].trim() === '' ? [] : step[2].trim().split(/\s+/).map(Number) - const args = mbotArguments(step[1], nums) - if (!args) throw new Error(`Falsche Anzahl Zahlen in „${spec}“: ${step[1]}`) - items.push(actionSignature([{ method: step[1], args, text: spec_.text ? JSON.parse(step[3] ?? '""') : undefined }])[0]) - } - } - const items = list() - if (i < src.length) throw new Error(`Zu viele „)“ in „${spec}“`) - return items -} - -/** Ersetzt `mbot.getDistance()` usw. durch Zahlen, damit der Rechner sie wie Literale liest. */ -export function substituteMBotSensors(expression: string, read: (name: string) => MBotSensorValue): string { - if (!expression.includes('mbot')) return expression - return expression.replace(/\bmbot\s*\.\s*([A-Za-z_]\w*)\s*\(\s*\)/gu, (all, name: string) => { - if (!(name in MBOT_SENSORS)) return all - const value = read(name) - return typeof value === 'string' ? JSON.stringify(name === 'getColor' ? mbotColorName(value) : value) : String(value) - }) -} - -/** Argumente an Kommas auf oberster Ebene trennen (nicht in Klammern oder Texten). */ -function splitArgs(text: string): string[] { - const parts: string[] = [] - let depth = 0 - let quote = false - let start = 0 - for (let i = 0; i < text.length; i++) { - const c = text[i] - if (quote) { - if (c === '\\') i++ - else if (c === '"') quote = false - } else if (c === '"') quote = true - else if (c === '(' || c === '[') depth++ - else if (c === ')' || c === ']') depth-- - else if (c === ',' && depth === 0) { - parts.push(text.slice(start, i).trim()) - start = i + 1 - } - } - parts.push(text.slice(start).trim()) - return parts -} - -/** - * Gefahrene Strecke als Liste wie `forward 50`, `turnRight 90`: aufeinanderfolgende Fahrten bzw. Drehungen - * zusammengefasst, LEDs und Töne zählen nicht. So ist `5 × forward()` dasselbe wie `forward(50)`. - */ -export function driveSignature(actions: { method: string; args: number[] }[]): string[] { - const out: { kind: 'drive' | 'turn'; value: number }[] = [] - for (const a of actions) { - const value = { forward: a.args[0], backward: -a.args[0], turnRight: a.args[0], turnLeft: -a.args[0] }[a.method] - if (value === undefined) continue - const kind = a.method === 'forward' || a.method === 'backward' ? 'drive' : 'turn' - const last = out[out.length - 1] - if (last && last.kind === kind) last.value += value - else out.push({ kind, value }) - } - return out.flatMap(({ kind, value }) => { - const v = kind === 'turn' ? ((((value + 180) % 360) + 360) % 360) - 180 : value - if (Math.abs(v) < 1e-6) return [] - const r = Math.round(Math.abs(v) * 100) / 100 - if (kind === 'drive') return [`${v > 0 ? 'forward' : 'backward'} ${r}`] - return [v === -180 ? 'turnRight 180' : `${v > 0 ? 'turnRight' : 'turnLeft'} ${r}`] - }) -} - -/** - * Erwartete Fahrt einer Übung, z. B. `fahrt: 4 x (forward 50, turnRight 90)`. Teile durch Kommas getrennt, - * `n x (…)` wiederholt; ohne Zahl gelten die Werte von `mbot.forward()` bzw. `turnRight()`. - */ -export function parseDriveSpec(spec: string): { method: string; args: number[] }[] { - let i = 0 - const src = spec.trim() - const list = (): { method: string; args: number[] }[] => { - const items: { method: string; args: number[] }[] = [] - for (;;) { - while (src[i] === ' ' || src[i] === ',') i++ - if (i >= src.length || src[i] === ')') return items - const rep = /^(\d+)\s*[x×]\s*\(/u.exec(src.slice(i)) - if (rep) { - i += rep[0].length - const inner = list() - if (src[i] !== ')') throw new Error(`„)“ fehlt in „${spec}“`) - i++ - for (let k = 0; k < Number(rep[1]); k++) items.push(...inner) - continue - } - const step = /^([A-Za-z]+)(?:\s+(-?\d+(?:\.\d+)?))?/u.exec(src.slice(i)) - if (!step) throw new Error(`Unbekannt in „${spec}“: ${src.slice(i)}`) - i += step[0].length - const args = mbotArguments(step[1], step[2] === undefined ? [] : [Number(step[2])]) - if (!args) throw new Error(`Unbekannter Befehl in „${spec}“: ${step[1]}`) - items.push({ method: step[1], args }) - } - } - const items = list() - if (i < src.length) throw new Error(`Zu viele „)“ in „${spec}“`) - return items -} - -/** Fahrt kurz zum Anzeigen: Wiederholungen als `4 x (forward 50, turnRight 90)`, auch verschachtelt. */ -export function compressDrive(drive: string[]): string { - const n = drive.length - for (let unit = 1; unit <= n / 2; unit++) { - if (n % unit !== 0) continue - const times = n / unit - if (drive.every((s, i) => s === drive[i % unit])) { - const inner = compressDrive(drive.slice(0, unit)) - return `${times} x ${unit === 1 ? inner : `(${inner})`}` - } - } - return drive.join(', ') -} - -/** - * Teile des mBot2 im 3D-Modell, z. B. für `fokus:` im Lektionsblock `::: mbot2` und `[Wort]{teil=cyberpi}` im Text. - * Die ersten acht gehören zum CyberPi; `cyberpi` allein ist sein Gehäuse. - */ -export const MBOT_PARTS = [ - 'cyberpi', - 'screen', - 'joystick', - 'buttons', - 'leds', - 'lightSensor', - 'microphone', - 'shield', - 'powerSwitch', - 'motors', - 'wheels', - 'ultrasonic', - 'lineSensor', - 'caster', - 'chassis', -] as const - -export type MBotPart = (typeof MBOT_PARTS)[number] - -export const isMBotPart = (name: string): name is MBotPart => (MBOT_PARTS as readonly string[]).includes(name) diff --git a/web/src/core/mbotLink.ts b/web/src/core/mbotLink.ts deleted file mode 100644 index 8350d941..00000000 --- a/web/src/core/mbotLink.ts +++ /dev/null @@ -1,379 +0,0 @@ -/** - * Verbindung zum echten mBot2 über USB (Web Serial, nur Chrome/Edge). Die Makeblock-Firmware des CyberPi - * führt Python-Zeilen aus, die in einen Rahmen verpackt sind: - * `F3, Kopfsumme, Länge (2 Byte), 28, Modus, Nummer (2 Byte), Textlänge (2 Byte), Text, Summe, F4`. - * Modus 4 führt nur aus (Fahrbefehle antworten erst, wenn sie fertig sind), Modus 1 liefert den Wert zurück. - * Die Antwort trägt dieselbe Nummer und enthält `{"ret":…}`. Getestet mit Holgers mBot2 (Oktober 2026). - */ - -import type { MBotSensorValue } from './mbot' - -const HEAD = 0xf3 -const FOOT = 0xf4 -const SCRIPT = 0x28 -export const RUN = 4 -export const ASK = 1 - -/** Rahmen um einen Inhalt legen. */ -export function frame(body: number[]): Uint8Array { - const len = body.length - const head = (HEAD + (len & 0xff) + (len >> 8)) & 0xff - const sum = body.reduce((a, b) => a + b, 0) & 0xff - return Uint8Array.from([HEAD, head, len & 0xff, len >> 8, ...body, sum, FOOT]) -} - -/** Python-Zeile als Rahmen mit Modus und Nummer. */ -export function pythonFrame(code: string, mode: number, idx: number): Uint8Array { - const text = Array.from(new TextEncoder().encode(code)) - return frame([SCRIPT, mode, idx & 0xff, (idx >> 8) & 0xff, text.length & 0xff, text.length >> 8, ...text]) -} - -export interface ScriptAnswer { - idx: number - /** Wert aus `{"ret":…}`: Zahl, Wahrheitswert, Text oder `null` (Python `None`). */ - value: MBotSensorValue | null -} - -/** - * Sucht vollständige Rahmen in `rx` und gibt die Antworten auf Python-Zeilen zurück; verbrauchte Bytes werden entfernt. - * Textausgaben des CyberPi außerhalb von Rahmen (z. B. nach dem Neustart) werden übersprungen. - */ -export function readAnswers(rx: number[]): ScriptAnswer[] { - return readFrames(rx).flatMap((body) => scriptAnswer(body) ?? []) -} - -/** Inhalt einer Antwort auf eine Python-Zeile, sonst `undefined`. */ -function scriptAnswer(body: number[]): ScriptAnswer | undefined { - if (body[0] !== SCRIPT || body.length < 6) return undefined - const text = new TextDecoder().decode(Uint8Array.from(body.slice(6))) - const m = /"ret"\s*:\s*([^}]*)\}/.exec(text) - return m ? { idx: body[2] | (body[3] << 8), value: pythonValue(m[1].trim()) } : undefined -} - -/** Alle vollständigen Rahmen aus `rx` (nur der Inhalt); verbrauchte Bytes werden entfernt. */ -export function readFrames(rx: number[]): number[][] { - const bodies: number[][] = [] - for (;;) { - const start = rx.indexOf(HEAD) - if (start < 0) { - rx.length = 0 - break - } - rx.splice(0, start) - if (rx.length < 4) break - const len = rx[2] | (rx[3] << 8) - // Kein Rahmen, nur ein zufälliges F3 im Text: weitersuchen - if (rx[1] !== ((HEAD + rx[2] + rx[3]) & 0xff) || len > 4096) { - rx.splice(0, 1) - continue - } - if (rx.length < len + 6) break - bodies.push(rx.slice(4, 4 + len)) - rx.splice(0, len + 6) - } - return bodies -} - -function pythonValue(text: string): MBotSensorValue | null { - if (text === 'True') return true - if (text === 'False') return false - // Text, z. B. ein Farbname: "red" oder 'red' - const quoted = /^["'](.*)["']$/.exec(text) - if (quoted) return quoted[1] - const n = Number(text) - return text !== '' && Number.isFinite(n) ? n : null -} - -/** - * Programm fest auf dem CyberPi speichern, wie „Hochladen“ in mBlock (Ablauf aus github.com/weare2plus3/cyberpi-uploader, MIT): - * Upload-Modus (`0D 00 00`), REPL aus, Dateikopf mit Größe, XOR-Prüfsumme und Pfad, dann Blöcke zu 80 Byte. - * Die Datei landet in einem Zwischenplatz, den die Firmware beim nächsten Neustart übernimmt. - */ -export const UPLOAD_PATH = '/flash/_xx_main.py' -const UPLOAD_MODE = [0x0d, 0x00, 0x00] -const FILE_SERVICE = 0x5e -const BLOCK = 80 -export const UPLOAD_PREPARE = ['try:\n import config\nexcept:\n pass', 'try:\n config.write_config("repl_enable", False)\nexcept:\n pass'] - -const le = (value: number, bytes: number) => Array.from({ length: bytes }, (_, i) => (value >>> (8 * i)) & 0xff) - -/** XOR der 32-Bit-Wörter (little endian, mit Nullen aufgefüllt), wie mBlock. */ -export function fileChecksum(data: Uint8Array): number[] { - let x = 0 - for (let i = 0; i < data.length; i += 4) x = (x ^ ((data[i] ?? 0) | ((data[i + 1] ?? 0) << 8) | ((data[i + 2] ?? 0) << 16) | ((data[i + 3] ?? 0) << 24))) >>> 0 - return le(x, 4) -} - -const fileFrame = (cmd: number, payload: number[]) => frame([0x01, 0x00, FILE_SERVICE, cmd, ...le(payload.length, 2), ...payload]) - -/** Python-Datei in Rahmen: Kopf, dann Blöcke zu 80 Byte und ein letzter Block mit 4 Byte (wie mBlock; mit Zeilenumbrüchen aufgefüllt). */ -export function uploadFrames(source: string, path = UPLOAD_PATH): Uint8Array[] { - const raw = new TextEncoder().encode(source) - const pad = (4 - (raw.length % BLOCK) + BLOCK) % BLOCK - const data = new Uint8Array(raw.length + pad).fill(0x0a) - data.set(raw) - const frames = [fileFrame(0x01, [0x00, ...le(data.length, 4), ...fileChecksum(data), ...Array.from(new TextEncoder().encode(path))])] - const end = data.length - 4 - for (let off = 0; off < end; off += BLOCK) frames.push(fileFrame(0x02, [...le(off, 4), ...data.subarray(off, Math.min(off + BLOCK, end))])) - frames.push(fileFrame(0x02, [...le(end, 4), ...data.subarray(end)])) - return frames -} - -const isModeEcho = (body: number[]) => body.length === 3 && body[0] === 0x0d -const isFileAck = (body: number[]) => body.length === 7 || body.some((b, i) => b === FILE_SERVICE && body[i + 1] === 0xf0) - -// Web Serial ist nicht in den TypeScript-Typen; nur das Nötigste. -interface SerialPortLike { - open(options: { baudRate: number }): Promise - close(): Promise - readable: ReadableStream | null - writable: WritableStream | null -} -interface SerialLike { - requestPort(): Promise -} - -const serial = (): SerialLike | undefined => (typeof navigator === 'undefined' ? undefined : (navigator as unknown as { serial?: SerialLike }).serial) - -/** Kann dieser Browser einen mBot2 über USB ansprechen? */ -export const canConnectMBot = () => serial() !== undefined - -/** Mehrere Python-Anweisungen als eine Zeile (der CyberPi nimmt nur eine). JSON-Strings sind auch gültige Python-Strings. */ -export const pyLines = (...lines: string[]) => `exec(${JSON.stringify(lines.join('; '))})` - -/** - * Bildschirm leeren und Text in der Mitte zeigen. Ohne Pinselfarbe: `display.set_brush` wirkt am CyberPi - * unzuverlässig (Texte kamen rot, lila, grün oder blau statt in der gewählten Farbe, auch mit Pausen). - * Die Schrift hat dann die Farbe, die der CyberPi gerade hat (einfarbig, nicht immer weiß; Holger: in Ordnung). - */ -export const showLabel = (text: string, size = 24) => pyLines('cyberpi.display.clear()', `cyberpi.display.show_label(${JSON.stringify(text)}, ${size}, 'center')`) - -/** - * Logo nach dem Verbinden (und nach „mBot2 testen“ → Text): „VisuBot“ groß, einfarbig. - * Grafik (screen.set_pixel, Sprite) zeigt über USB nichts, Farben gehen nicht zuverlässig. Am echten mBot2 getestet (Oktober 2026). - */ -export const HELLO = showLabel('VisuBot', 32) - -export class MBotLink { - private port?: SerialPortLike - private writer?: WritableStreamDefaultWriter - private reader?: ReadableStreamDefaultReader - private loop?: Promise - private rx: number[] = [] - private idx = 1 - private frameWaiters: { match: (body: number[]) => boolean; resolve: () => void }[] = [] - private waiting = new Map void; reject: (e: Error) => void }>() - private queue: Promise = Promise.resolve() - private listeners = new Set<() => void>() - error?: string - /** Port ist offen, der CyberPi startet noch neu. */ - connecting = false - - /** `fn` bei Verbinden, Trennen und Fehlern rufen; gibt eine Abmeldung zurück. */ - listen(fn: () => void): () => void { - this.listeners.add(fn) - return () => this.listeners.delete(fn) - } - - private changed() { - for (const fn of this.listeners) fn() - } - - get connected() { - return this.writer !== undefined && !this.connecting - } - - /** Fragt nach dem USB-Anschluss, öffnet ihn und wartet den Neustart des CyberPi ab. */ - async connect() { - const s = serial() - if (!s) throw new Error('Web Serial') - const port = await s.requestPort() - await port.open({ baudRate: 115200 }) - this.port = port - this.writer = port.writable!.getWriter() - this.error = undefined - this.connecting = true - this.changed() - this.loop = this.readLoop() - // Seite schließen oder neu laden: Anschluss freigeben - window.addEventListener('pagehide', () => void this.disconnect(), { once: true }) - // Das Öffnen setzt den CyberPi zurück - await new Promise((r) => setTimeout(r, 3000)) - if (!this.writer) return - // Textausgaben vom Neustart verwerfen - this.rx.length = 0 - this.connecting = false - this.changed() - await this.run(HELLO) - } - - /** - * Sauber trennen wie beim Auswerfen: Motoren anhalten, LEDs aus, Abschied auf dem Bildschirm, - * dann Leser und Schreiber freigeben und den Anschluss schließen. So lässt er sich ohne Neustart wieder verbinden. - */ - async disconnect(error?: string) { - if (!this.port) { - this.error = error - return this.changed() - } - if (!error && this.writer && !this.connecting) { - for (const code of ["mbot2.EM_stop('ALL')", 'cyberpi.led.off()', showLabel('Bis bald!')]) - await this.send(code, RUN, 2000).catch(() => undefined) - } - const port = this.port - const writer = this.writer - const reader = this.reader - const loop = this.loop - this.port = this.writer = this.reader = this.loop = undefined - this.error = error - this.connecting = false - for (const w of this.waiting.values()) w.reject(new Error(error ?? 'getrennt')) - this.waiting.clear() - try { - await reader?.cancel() - await loop - await writer?.close() - } catch { - /* Leitung schon weg */ - } - try { - writer?.releaseLock() - await port.close() - } catch (e) { - console.warn('[mBot2] Schließen', (e as Error).message) - } - this.changed() - } - - /** Python-Zeile ausführen; kehrt zurück, wenn der Roboter fertig ist (Fahren dauert). */ - run(code: string): Promise { - return this.send(code, RUN, 30000).then(() => undefined) - } - - /** Wert eines Python-Ausdrucks, z. B. eines Sensors. */ - ask(code: string): Promise { - return this.send(code, ASK, 3000) - } - - /** - * Programm auf den CyberPi übertragen (verbindet vorher, wenn nötig). Danach startet der CyberPi neu und - * das Programm bleibt gespeichert, auch ohne Kabel. `progress` bekommt erledigte und alle Schritte. - */ - async upload(source: string, progress: (done: number, total: number) => void = () => {}) { - if (!this.port) await this.connect() - if (!this.writer) throw new Error(this.error ?? 'nicht verbunden') - const files = uploadFrames(source) - const total = 6 + files.length + 3 - let done = 0 - const step = () => progress(++done, total) - const prepare = async () => { - await this.sendFrame(frame(UPLOAD_MODE), isModeEcho) - step() - for (const code of UPLOAD_PREPARE) { - await this.send(code, RUN, 3000) - step() - } - } - await prepare() - await prepare() - for (const f of files) { - await this.sendFrame(f, isFileAck) - step() - } - done = total - 3 - await prepare() - await this.restart() - } - - /** Rahmen schicken und auf die passende Antwort warten (bis zu drei Versuche). */ - private sendFrame(data: Uint8Array, match: (body: number[]) => boolean): Promise { - const next = this.queue.then(async () => { - for (let attempt = 0; attempt < 3; attempt++) { - if (!this.writer) throw new Error('nicht verbunden') - let resolve = () => {} - const answered = new Promise((r) => (resolve = r)) - const waiter = { match, resolve } - this.frameWaiters.push(waiter) - await this.writer.write(data) - const ok = await Promise.race([answered.then(() => true), new Promise((r) => setTimeout(() => r(false), 3000))]) - this.frameWaiters = this.frameWaiters.filter((w) => w !== waiter) - if (ok) return - } - throw new Error('keine Antwort') - }) - this.queue = next.catch(() => undefined) - return next - } - - /** Anschluss schließen und wieder öffnen: das setzt den CyberPi zurück, er übernimmt das neue Programm. */ - private async restart() { - const port = this.port! - await this.disconnect('restart') - this.error = undefined - await new Promise((r) => setTimeout(r, 300)) - await port.open({ baudRate: 115200 }) - await new Promise((r) => setTimeout(r, 500)) - await port.close() - this.changed() - } - - private send(code: string, mode: number, timeoutMs: number): Promise { - // Immer nur eine Zeile unterwegs: der CyberPi arbeitet sie nacheinander ab. - const next = this.queue.then( - () => - new Promise((resolve, reject) => { - if (!this.writer) return reject(new Error('nicht verbunden')) - const idx = this.idx - this.idx = (this.idx % 0xffff) + 1 - const timer = setTimeout(() => { - this.waiting.delete(idx) - reject(new Error('keine Antwort')) - }, timeoutMs) - this.waiting.set(idx, { - resolve: (v) => (clearTimeout(timer), resolve(v)), - reject: (e) => (clearTimeout(timer), reject(e)), - }) - this.writer.write(pythonFrame(code, mode, idx)).catch((e: Error) => { - this.waiting.delete(idx) - reject(e) - }) - }), - ) - this.queue = next.catch(() => undefined) - return next - } - - private async readLoop() { - while (this.port?.readable) { - const reader = this.port.readable.getReader() - this.reader = reader - try { - for (;;) { - const { value, done } = await reader.read() - if (done) break - this.rx.push(...value) - for (const body of readFrames(this.rx)) { - const f = this.frameWaiters.findIndex((w) => w.match(body)) - if (f >= 0) this.frameWaiters.splice(f, 1)[0].resolve() - const a = scriptAnswer(body) - if (!a) continue - const w = this.waiting.get(a.idx) - this.waiting.delete(a.idx) - w?.resolve(a.value) - } - } - } catch (e) { - // Störungen auf der Leitung (z. B. beim Neustart des CyberPi) sind harmlos: mit neuem Leser weiter - const harmless = ['BufferOverrunError', 'FramingError', 'BreakError', 'ParityError'].includes((e as Error).name) - console.warn('[mBot2] Lesefehler', (e as Error).name, (e as Error).message) - if (!harmless && this.port) void this.disconnect((e as Error).message) - } finally { - reader.releaseLock() - } - if (!this.writer) break - } - } -} - -/** Eine Verbindung für die ganze Seite (bleibt beim Neuaufbau der Oberfläche erhalten). */ -export const mbotLink = new MBotLink() diff --git a/web/src/core/mbotProgram.ts b/web/src/core/mbotProgram.ts deleted file mode 100644 index 6fc4ab23..00000000 --- a/web/src/core/mbotProgram.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { generateCode } from './codeGenerator' -import { MBOT_LED_COLORS, MBOT_SENSORS, MBOT_WHEEL_DIAMETER_CM } from './mbot' -import type { VSDocument } from './model' -import { parseSubprogramHeader } from './simulation' - -/** - * VisuBot: das fertige Programm als MicroPython-Datei für den CyberPi, damit der mBot2 es ohne Kabel fährt. - * Der Code kommt aus dem Python-Generator; `mbot.forward()` usw. bleiben stehen, weil die Datei vorn eine - * kleine Klasse `MBot` mit denselben Namen wie in Java mitbringt. Nach dem Einschalten zeigt der Bildschirm - * „A = Start“, das Programm läuft nach einem Druck auf Taste A. - */ - -/** Firmware-Farbnamen (`get_color_sta`) → Name in der Sprache der Lektionen. */ -const COLOR_WORDS: Record = { red: 'rot', green: 'grün', blue: 'blau', yellow: 'gelb', cyan: 'türkis', purple: 'lila', white: 'weiß', black: 'schwarz' } - -const sensorMethods = () => - Object.entries(MBOT_SENSORS) - .map(([name, spec]) => { - if (name === 'getColor') return ` def ${name}(self):\n farbe = ${spec.python}\n return FARBNAMEN.get(farbe, farbe)\n` - const value = typeof spec.simulated === 'boolean' ? `bool(${spec.python})` : spec.python - return ` def ${name}(self):\n return ${value}\n` - }) - .join('\n') - -function prelude(language: string): string { - const colors = Object.entries(MBOT_LED_COLORS) - .map(([name, rgb]) => ` ${JSON.stringify(name)}: (${rgb.join(', ')}),\n`) - .join('') - const words = Object.entries(COLOR_WORDS) - .map(([en, de]) => ` ${JSON.stringify(en)}: ${JSON.stringify(language === 'de' ? de : en)},\n`) - .join('') - return `import event, time, math, cyberpi, mbot2, mbuild - -FARBEN = { -${colors}} - -FARBNAMEN = { -${words}} - - -class Led: - def __init__(self, nr): - self.nr = nr - - def setColor(self, farbe): - r, g, b = FARBEN.get(farbe, (0, 0, 0)) - cyberpi.led.on(r, g, b, id=self.nr + 1) - - -def strecke(wert, einheit): - # Überladung forward(2, "Umdrehungen"): eine Radumdrehung ist pi * ${MBOT_WHEEL_DIAMETER_CM} cm - if einheit.lower() in ("umdrehung", "umdrehungen", "rotation", "rotations", "rotação", "rotações"): - return wert * math.pi * ${MBOT_WHEEL_DIAMETER_CM} - return wert - - -class MBot: - def forward(self, wert=10, einheit="cm"): - mbot2.straight(strecke(wert, einheit)) - - def backward(self, wert=10, einheit="cm"): - mbot2.straight(-strecke(wert, einheit)) - - def turnLeft(self, grad=90): - mbot2.turn(-grad) - - def turnRight(self, grad=90): - mbot2.turn(grad) - - def stop(self): - mbot2.EM_stop("ALL") - - def drive(self, links, rechts): - mbot2.drive_power(links, -rechts) - - def setLed(self, r, g, b): - cyberpi.led.on(r, g, b) - - def ledOff(self): - cyberpi.led.off() - - def led(self, nr): - return Led(nr) - - def playTone(self, hz, ms): - cyberpi.audio.play_tone(hz, ms / 1000) - - def pause(self, ms): - time.sleep(ms / 1000) - - def resetTimer(self): - cyberpi.timer.reset() - - def emotion(self, name): - getattr(cyberpi.emotion, name)() - - def showText(self, text): - cyberpi.display.clear() - cyberpi.display.show_label(str(text), 24, "center") - -${sensorMethods()} - -mbot = MBot() -` -} - -const startPart = (label: string) => ` - -laeuft = False - - -@event.start -def beim_einschalten(): - mbot.showText(${JSON.stringify(label)}) - - -@event.is_press("a") -def taste_a(): - global laeuft - if laeuft: - return - laeuft = True - cyberpi.display.clear() - try: - programm() - finally: - mbot.stop() - laeuft = False -` - -export type MBotProgram = { source: string } | { error: 'input' | 'files' | 'empty' } - -/** - * `doc`: Hauptprogramm, `subprograms`: Unterprogramme aus anderen Reitern; `language`: Sprache der Farbnamen - * (wie `mbot.getColor()` in der Simulation). Eingaben und Dateien gehen am Roboter nicht. - */ -export function mbotProgram(doc: VSDocument, subprograms: VSDocument[], language: string, startLabel = 'A = Start'): MBotProgram { - const options = { pythonWithoutMatch: true } - const main = javaConcatenation(generateCode(doc, 'python', options)) - const defs = subprograms.filter((s) => s !== doc && parseSubprogramHeader(s.caption)).map((s) => javaConcatenation(generateCode(s, 'python', options))) - const all = [main, ...defs].join('\n') - if (/\binput\(/u.test(all)) return { error: 'input' } - if (/\bopen\(|\bos\.path\b/u.test(all)) return { error: 'files' } - const imports = new Set() - const strip = (code: string) => - code - .split('\n') - .filter((line) => { - if (/^import \w+$/u.test(line)) imports.add(line) - return !/^import \w+$/u.test(line) - }) - .join('\n') - .trim() - const body = strip(main) - if (body === '' || /^#[^\n]*$/u.test(body)) return { error: 'empty' } - const indented = body - .split('\n') - .map((line) => (line.trim() === '' ? '' : ' ' + line)) - .join('\n') - const source = - `# VisuStruct VisuBot\n${prelude(language)}${[...imports].join('\n')}\n\n` + - defs.map((d) => strip(d) + '\n\n\n').join('') + - `def programm():\n${indented}\n` + - startPart(startLabel) - return { source } -} - -/** - * Java verkettet Text mit `+` auch mit Zahlen (`"Akku: " + mbot.getBattery()`), Python nicht. In jeder Kette - * mit einem Text in Anführungszeichen wird alles andere zu `str(…)`; Zahlen vor dem ersten Text werden wie in - * Java erst addiert (`a + b + "x"` → `str(a + b) + "x"`). - */ -export function javaConcatenation(code: string): string { - return code - .split('\n') - .map((line) => { - const m = /^(\s*)(.*)$/u.exec(line)! - return m[2].startsWith('#') ? line : m[1] + rewrite(m[2]) - }) - .join('\n') -} - -const separator = /^(==|!=|<=|>=|\+=|-=|\*=|\/=|=|<|>|,|:)/u -const keyword = /^(and|or|not|in|if|elif|while|return|for|else)\b/u - -/** Text an Trennern (Vergleich, Zuweisung, Komma, Schlüsselwort) auf oberster Ebene zerlegen, jedes Stück umschreiben. */ -function rewrite(text: string): string { - let out = '' - let piece = '' - let depth = 0 - for (let i = 0; i < text.length; i++) { - const c = text[i] - if (c === '"' || c === "'") { - const end = stringEnd(text, i) - piece += text.slice(i, end) - i = end - 1 - continue - } - if (c === '(' || c === '[' || c === '{') depth++ - if (c === ')' || c === ']' || c === '}') depth-- - if (depth === 0) { - const sep = separator.exec(text.slice(i)) ?? (/\w/u.test(text[i - 1] ?? '') ? null : keyword.exec(text.slice(i))) - if (sep) { - out += rewritePiece(piece) + sep[0] - piece = '' - i += sep[0].length - 1 - continue - } - } - piece += c - } - return out + rewritePiece(piece) -} - -function stringEnd(text: string, start: number): number { - const quote = text[start] - for (let i = start + 1; i < text.length; i++) { - if (text[i] === '\\') i++ - else if (text[i] === quote) return i + 1 - } - return text.length -} - -/** Ein Stück ohne Trenner: erst die Klammern innen, dann die `+`-Kette. */ -function rewritePiece(piece: string): string { - let inner = '' - const operands: string[] = [] - let depth = 0 - let open = 0 - for (let i = 0; i < piece.length; i++) { - const c = piece[i] - if (c === '"' || c === "'") { - const end = stringEnd(piece, i) - if (depth === 0) inner += piece.slice(i, end) - i = end - 1 - continue - } - if (c === '(' || c === '[' || c === '{') { - if (depth === 0) open = i - depth++ - if (depth === 1) { - inner += c - continue - } - } - if (c === ')' || c === ']' || c === '}') { - depth-- - if (depth === 0) { - inner += rewrite(piece.slice(open + 1, i)) + c - continue - } - } - if (depth > 0) continue - // binäres Plus: davor steht ein Wert, kein Operator - if (c === '+' && inner.trim() !== '' && !/[-+*/%(,=<>]\s*$/u.test(inner)) { - operands.push(inner) - inner = '' - continue - } - inner += c - } - if (depth > 0) inner += piece.slice(open) - operands.push(inner) - if (operands.length < 2) return operands[0] - const lead = /^\s*/u.exec(operands[0])![0] - const trail = /\s*$/u.exec(operands[operands.length - 1])![0] - const parts = operands.map((o) => o.trim()) - const isText = (p: string) => p.startsWith('"') || p.startsWith("'") || p.startsWith('str(') - const first = parts.findIndex(isText) - if (first < 0) return piece - const before = first > 0 ? [`str(${parts.slice(0, first).join(' + ')})`] : [] - const after = parts.slice(first).map((p) => (isText(p) ? p : `str(${p})`)) - return lead + [...before, ...after].join(' + ') + trail -} diff --git a/web/src/core/memberEdit.ts b/web/src/core/memberEdit.ts deleted file mode 100644 index 0b899213..00000000 --- a/web/src/core/memberEdit.ts +++ /dev/null @@ -1,189 +0,0 @@ -/** - * VisuObject: Klassen, Attribute und Methoden aus dem Objektinspektor ändern. - * Geschrieben wird nur die betroffene Deklaration; Methodenrümpfe, Kommentare und Startwerte bleiben. - * Dazu die Erzeuger aus dem Eclipse-Menü „Source“: Konstruktor aus Attributen, Getter/Setter, toString(). - */ - -import type { UmlClass, UmlMember, UmlParam, Visibility } from './classModel' - -const splice = (source: string, from: number, to: number, text: string) => source.slice(0, from) + text + source.slice(to) -const javaVisibility: Record = { '+': 'public ', '-': 'private ', '#': 'protected ', '~': '' } -const lineStart = (source: string, pos: number) => source.lastIndexOf('\n', pos - 1) + 1 - -/** Einrückung der Mitglieder (wie die erste Deklaration), sonst vier Leerzeichen. */ -function indentOf(source: string, cls: UmlClass): string { - const first = cls.members[0] - if (first) { - const start = lineStart(source, first.from) - const ws = /^[ \t]*/.exec(source.slice(start))![0] - if (start + ws.length === first.from) return ws - } - return ' ' -} - -/** Annotationen vor einer Deklaration (`@Override` …) bleiben beim Umschreiben stehen. */ -function annotations(source: string, from: number, to: number): string { - return /^(\s*@[\w.]+(\([^)]*\))?\s*)*/.exec(source.slice(from, to))![0] -} - -// MARK: - Attribute - -export interface FieldInfo { - visibility: Visibility - name: string - type: string - isStatic: boolean - isFinal: boolean - /** Startwert ohne `=`, leer = keiner. */ - init: string -} - -export function fieldInfo(source: string, m: UmlMember): FieldInfo { - const head = source.slice(m.headerFrom, m.nameFrom) - const tail = source.slice(m.nameTo, m.to) - const init = m.shared ? '' : (/^\s*=\s*([\s\S]*?)\s*;?\s*$/.exec(tail)?.[1] ?? '') - return { visibility: m.visibility, name: m.name, type: m.type, isStatic: m.isStatic, isFinal: /\bfinal\b/.test(head), init } -} - -export function fieldDeclaration(f: FieldInfo): string { - return `${javaVisibility[f.visibility]}${f.isStatic ? 'static ' : ''}${f.isFinal ? 'final ' : ''}${f.type} ${f.name}${f.init.trim() ? ` = ${f.init.trim()}` : ''};` -} - -/** Attribut neu schreiben. Bei `int a, b;` geht nur der Name. */ -export function setField(source: string, m: UmlMember, change: Partial): string { - if (m.shared) return change.name && change.name !== m.name ? splice(source, m.nameFrom, m.nameTo, change.name) : source - const next = { ...fieldInfo(source, m), ...change } - return splice(source, m.from, m.to, annotations(source, m.from, m.to) + fieldDeclaration(next)) -} - -// MARK: - Methoden - -export interface MethodInfo { - visibility: Visibility - name: string - /** Ergebnistyp, leer beim Konstruktor. */ - type: string - params: UmlParam[] - isStatic: boolean - isAbstract: boolean -} - -export function methodInfo(m: UmlMember): MethodInfo { - return { visibility: m.visibility, name: m.name, type: m.type, params: m.params, isStatic: m.isStatic, isAbstract: m.isAbstract } -} - -/** `name: Typ, n: int` oder Java-Stil `Typ name, int n` → Parameter. */ -export function parseParams(text: string): UmlParam[] | undefined { - const out: UmlParam[] = [] - for (const part of text.split(',').map((p) => p.trim()).filter(Boolean)) { - const uml = /^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(part) - const java = /^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(part) - if (uml) out.push({ name: uml[1], type: uml[2].replace(/\s+/g, '') }) - else if (java) out.push({ name: java[2], type: java[1].replace(/\s+/g, '') }) - else return undefined - } - return out -} - -export const paramsText = (params: UmlParam[]) => params.map((p) => `${p.name}: ${p.type}`).join(', ') - -/** - * Kopf einer Methode neu schreiben; der Rumpf bleibt. `abstract` an: Rumpf wird `;`, - * `abstract` aus: aus `;` wird ein leerer Rumpf. In Interfaces ohne Sichtbarkeit und ohne `abstract`. - */ -export function setMethod(source: string, cls: UmlClass, m: UmlMember, change: Partial): string { - const next = { ...methodInfo(m), ...change } - const inInterface = cls.kind === 'interface' - const isConstructor = m.kind === 'constructor' - const vis = inInterface ? '' : javaVisibility[next.visibility] - const mods = `${vis}${next.isStatic && !isConstructor ? 'static ' : ''}${next.isAbstract && !inInterface && !isConstructor ? 'abstract ' : ''}` - const params = next.params.map((p) => `${p.type} ${p.name}`).join(', ') - const head = isConstructor ? `${mods}${m.name}(${params})` : `${mods}${next.type || 'void'} ${next.name}(${params})` - const keep = annotations(source, m.headerFrom, m.headerTo) - let out = splice(source, m.headerFrom, m.headerTo, keep + head) - const shift = keep.length + head.length - (m.headerTo - m.headerFrom) - const restFrom = m.headerTo + shift - const restTo = m.to + shift - const rest = out.slice(restFrom, restTo) - const wantsBody = !(next.isAbstract || (inInterface && !next.isStatic)) - if (!wantsBody && /^\s*(throws[^{;]*)?\{/.test(rest)) out = splice(out, restFrom, restTo, ';') - else if (wantsBody && /^\s*;/.test(rest)) { - const indent = indentOf(source, cls) - const ret = next.type && next.type !== 'void' && !isConstructor ? `${indent} return ${next.type === 'boolean' ? 'false' : /^(int|long|short|byte|double|float|char)$/.test(next.type) ? '0' : 'null'};\n` : '' - out = splice(out, restFrom, restTo, ` {\n${ret}${indent}}`) - } - return out -} - -// MARK: - Klasse - -/** Javadoc direkt über der Klasse (ohne `/** … *\/`), leer = keiner. */ -export function classDoc(source: string, cls: UmlClass): string { - const before = source.slice(0, cls.headerFrom) - const m = /\/\*\*([\s\S]*?)\*\/\s*$/.exec(before) - if (!m) return '' - return m[1] - .split('\n') - .map((l) => l.replace(/^\s*\*\s?/, '')) - .join('\n') - .trim() -} - -export function setClassDoc(source: string, cls: UmlClass, text: string): string { - const before = source.slice(0, cls.headerFrom) - const m = /\/\*\*[\s\S]*?\*\/\s*$/.exec(before) - const indent = /[ \t]*$/.exec(before)![0] - const doc = text.trim() ? `/**\n${text.trim().split('\n').map((l) => ` * ${l}`.trimEnd()).join('\n')}\n */\n${indent}` : '' - if (m) return splice(source, m.index, cls.headerFrom, doc) - return splice(source, cls.headerFrom, cls.headerFrom, doc) -} - -// MARK: - Source-Menü wie in Eclipse - -/** Vor der schließenden Klammer der Klasse einfügen, mit Leerzeile davor. */ -function insertAtEnd(source: string, cls: UmlClass, block: string): string { - const indent = indentOf(source, cls) - const lines = block - .split('\n') - .map((l) => (l ? indent + l : l)) - .join('\n') - const at = lineStart(source, cls.bodyEnd) - const onOwnLine = /^\s*$/.test(source.slice(at, cls.bodyEnd)) - const pos = onOwnLine ? at : cls.bodyEnd - const prefix = onOwnLine ? '' : '\n' - const blank = cls.members.length ? '\n' : '' - return splice(source, pos, pos, `${prefix}${blank}${lines}\n`) -} - -const instanceFields = (cls: UmlClass) => cls.members.filter((m) => m.kind === 'field' && !m.isStatic) -const capital = (s: string) => s.charAt(0).toUpperCase() + s.slice(1) - -/** Konstruktor mit allen Attributen (ohne static), wie „Generate Constructor using Fields“. */ -export function addFieldConstructor(source: string, cls: UmlClass): string { - const fields = instanceFields(cls) - const params = fields.map((f) => `${f.type} ${f.name}`).join(', ') - const body = fields.map((f) => ` this.${f.name} = ${f.name};`).join('\n') - return insertAtEnd(source, cls, `public ${cls.name}(${params}) {\n${body}${body ? '\n' : ''}}`) -} - -/** Getter und Setter für alle Attribute ohne; `final`-Attribute bekommen keinen Setter. */ -export function addGettersSetters(source: string, cls: UmlClass): string { - const methods = new Set(cls.members.filter((m) => m.kind === 'method').map((m) => m.name)) - const blocks: string[] = [] - for (const f of instanceFields(cls)) { - const isFinal = /\bfinal\b/.test(source.slice(f.headerFrom, f.nameFrom)) - const getter = `${f.type === 'boolean' ? 'is' : 'get'}${capital(f.name)}` - const setter = `set${capital(f.name)}` - if (!methods.has(getter)) blocks.push(`public ${f.type} ${getter}() {\n return ${f.name};\n}`) - if (!isFinal && !methods.has(setter)) blocks.push(`public void ${setter}(${f.type} ${f.name}) {\n this.${f.name} = ${f.name};\n}`) - } - return blocks.length ? insertAtEnd(source, cls, blocks.join('\n\n')) : source -} - -/** `toString()` wie „Generate toString()“ in Eclipse: `Hund [name=…, rasse=…]`. */ -export function addToString(source: string, cls: UmlClass): string { - if (cls.members.some((m) => m.kind === 'method' && m.name === 'toString' && m.params.length === 0)) return source - const parts = instanceFields(cls).map((f, i) => `"${i ? ', ' : ''}${f.name}=" + ${f.name}`) - const expr = parts.length ? `"${cls.name} [" + ${parts.join(' + ')} + "]"` : `"${cls.name} []"` - return insertAtEnd(source, cls, `@Override\npublic String toString() {\n return ${expr};\n}`) -} diff --git a/web/src/core/miniJava.ts b/web/src/core/miniJava.ts deleted file mode 100644 index 83e23e49..00000000 --- a/web/src/core/miniJava.ts +++ /dev/null @@ -1,1902 +0,0 @@ -/** - * VisuObject-Debugger: führt das Java aus `miniJavaParser` selbst aus, Anweisung für Anweisung. - * Jede Anweisung meldet sich vorher mit einem `step`-Ereignis (Generator), so kann der Debugger - * anhalten, schrittweise weitergehen und dabei Variablen und Objekte zeigen. Echtes Java läuft - * weiter über ▶ Start (CheerpJ); hier zählt, dass Schülerprogramme der FOS 12 gleich ablaufen. - */ - -import { JavaSyntaxError, misspelledType, missingImport, parseJava, type ClassDecl, type Expr, type MethodDecl, type Pos, type Stmt, type TypeRef } from './miniJavaParser' - -// MARK: - Werte - -export class JDouble { - constructor(readonly v: number) {} -} -export class JChar { - constructor(readonly code: number) {} -} -export class JObject { - fields = new Map() - /** Nachricht und Aufrufstapel bei Exceptions, Name und Nummer bei enum-Konstanten. */ - native: { message?: Val; trace?: string[]; enumName?: string; ordinal?: number } = {} - constructor( - readonly cls: RtClass, - readonly id: number, - ) {} -} -export class JArray { - constructor( - readonly elem: TypeRef, - public items: Val[], - readonly id: number, - ) {} -} -export class JList { - items: Val[] = [] - constructor(readonly id: number) {} -} -export class JMap { - entries = new Map() - constructor(readonly id: number) {} -} -export class JNative { - buf = '' - constructor( - readonly kind: 'out' | 'err' | 'in' | 'Scanner' | 'Random' | 'StringBuilder', - readonly id: number, - ) {} -} -export class ClassRef { - constructor(readonly name: string) {} -} - -export type Val = number | boolean | string | null | undefined | JDouble | JChar | JObject | JArray | JList | JMap | JNative | ClassRef - -export interface RtClass { - name: string - decl?: ClassDecl - sup?: RtClass - interfaces: string[] - statics: Map - staticTypes: Map - builtin?: boolean - /** Voller Name für die Ausgabe, z. B. `java.lang.ArithmeticException`. */ - javaName?: string -} - -interface Variable { - v: Val - type: TypeRef -} - -interface Frame { - cls: RtClass - method?: MethodDecl - self?: JObject - scopes: Map[] - pos: Pos - /** Titel im Aufrufstapel, z. B. `Spieler.punkte()` oder `new Spieler()`. */ - title: string -} - -type Done = undefined | { k: 'break' } | { k: 'continue' } | { k: 'return'; v: Val } -const BREAK = { k: 'break' } as const -const CONTINUE = { k: 'continue' } as const - -export type Ev = { k: 'step'; pos: Pos; depth: number } | { k: 'input' } | { k: 'sleep'; ms: number } -type G = Generator - -/** Fehler, die echtes Java schon beim Übersetzen meldet oder die der Debugger nicht kann. */ -export class MiniJavaError extends Error { - constructor( - readonly code: 'syntax' | 'symbol' | 'unsupported' | 'nomain' | 'type' | 'import' | 'typename', - readonly detail: string, - readonly pos?: Pos, - ) { - super(`${code}: ${detail}`) - } -} - -/** Eine geworfene Java-Exception. */ -export class JavaThrow extends Error { - constructor(readonly obj: JObject) { - super(obj.cls.name) - } -} - -const T = (name: string, dims = 0): TypeRef => ({ name, dims, args: [] }) -const intTypes = new Set(['int', 'long', 'short', 'byte', 'Integer', 'Long', 'Short', 'Byte']) -const doubleTypes = new Set(['double', 'float', 'Double', 'Float']) -const listTypes = new Set(['ArrayList', 'List', 'LinkedList', 'Collection', 'Iterable']) -const mapTypes = new Set(['HashMap', 'Map', 'TreeMap', 'LinkedHashMap']) - -const builtinExceptions: [string, string, string][] = [ - ['Throwable', 'Object', 'java.lang'], - ['Exception', 'Throwable', 'java.lang'], - ['Error', 'Throwable', 'java.lang'], - ['StackOverflowError', 'Error', 'java.lang'], - ['RuntimeException', 'Exception', 'java.lang'], - ['IOException', 'Exception', 'java.io'], - ['InterruptedException', 'Exception', 'java.lang'], - ['ArithmeticException', 'RuntimeException', 'java.lang'], - ['NullPointerException', 'RuntimeException', 'java.lang'], - ['ClassCastException', 'RuntimeException', 'java.lang'], - ['IllegalArgumentException', 'RuntimeException', 'java.lang'], - ['NumberFormatException', 'IllegalArgumentException', 'java.lang'], - ['IllegalStateException', 'RuntimeException', 'java.lang'], - ['UnsupportedOperationException', 'RuntimeException', 'java.lang'], - ['IndexOutOfBoundsException', 'RuntimeException', 'java.lang'], - ['ArrayIndexOutOfBoundsException', 'IndexOutOfBoundsException', 'java.lang'], - ['StringIndexOutOfBoundsException', 'IndexOutOfBoundsException', 'java.lang'], - ['NegativeArraySizeException', 'RuntimeException', 'java.lang'], - ['NoSuchElementException', 'RuntimeException', 'java.util'], - ['InputMismatchException', 'NoSuchElementException', 'java.util'], - ['ConcurrentModificationException', 'RuntimeException', 'java.util'], -] -const staticBuiltins = new Set(['Math', 'System', 'Integer', 'Double', 'String', 'Character', 'Boolean', 'Long', 'Float', 'Arrays', 'Collections', 'Thread', 'Objects', 'List']) - -/** Kommazahl wie Java `Double.toString`: `5.0`, `0.1`, `1.0E7`. */ -export function formatDouble(v: number): string { - if (Number.isNaN(v)) return 'NaN' - if (!Number.isFinite(v)) return v > 0 ? 'Infinity' : '-Infinity' - if (v === 0) return Object.is(v, -0) ? '-0.0' : '0.0' - const a = Math.abs(v) - if (a >= 1e-3 && a < 1e7) { - const s = String(v) - return s.includes('.') || s.includes('e') ? s : `${s}.0` - } - const [m, ex] = v.toExponential().split('e') - return `${m.includes('.') ? m : `${m}.0`}E${Number(ex)}` -} - -const javaHash = (id: number) => ((0x1b6d3586 + id * 0x9e3779b) >>> 0).toString(16) - -function stringHash(s: string) { - let h = 0 - for (let i = 0; i < s.length; i++) h = (Math.imul(31, h) + s.charCodeAt(i)) | 0 - return h -} - -const num = (v: Val): number => (typeof v === 'number' ? v : v instanceof JDouble ? v.v : v instanceof JChar ? v.code : NaN) -const isNum = (v: Val) => typeof v === 'number' || v instanceof JDouble || v instanceof JChar -const inInt = (x: number) => x >= -2147483648 && x <= 2147483647 - -/** Wert passend zum Typ der Variablen (int → double, char ↔ int, Cast). */ -export function castTo(v: Val, type: TypeRef | undefined): Val { - if (!type || type.dims || v === null || v === undefined) return v - const n = type.name - if (doubleTypes.has(n)) return isNum(v) ? new JDouble(num(v)) : v - if (intTypes.has(n)) { - if (v instanceof JChar) return v.code - if (v instanceof JDouble) { - if (Number.isNaN(v.v)) return 0 - const t = Math.trunc(v.v) - return n === 'int' || n === 'Integer' ? Math.max(-2147483648, Math.min(2147483647, t)) : t - } - if (typeof v === 'number' && (n === 'byte' || n === 'Byte')) return (v << 24) >> 24 - if (typeof v === 'number' && (n === 'short' || n === 'Short')) return (v << 16) >> 16 - return v - } - if (n === 'char' || n === 'Character') return typeof v === 'number' || v instanceof JDouble ? new JChar(Math.trunc(num(v)) & 0xffff) : v - return v -} - -export function defaultValue(type: TypeRef): Val { - if (type.dims) return null - if (type.name === 'int' || type.name === 'long' || type.name === 'short' || type.name === 'byte') return 0 - if (type.name === 'double' || type.name === 'float') return new JDouble(0) - if (type.name === 'boolean') return false - if (type.name === 'char') return new JChar(0) - return null -} - -const typeText = (t: TypeRef): string => `${t.name}${t.args.length ? `<${t.args.map(typeText).join(', ')}>` : ''}${'[]'.repeat(t.dims)}` - -// MARK: - Ansichten für den Debugger - -export interface VarView { - name: string - type: string - value: string - /** Objekt, auf das die Variable zeigt (für das Objektdiagramm). */ - ref?: number -} -export interface FrameView { - title: string - pos: Pos - vars: VarView[] -} -export interface HeapObject { - id: number - name: string - cls: string - fields: { name: string; type: string; value: string }[] -} - -export type RunState = - | { k: 'paused'; pos: Pos } - | { k: 'running' } - | { k: 'input' } - | { k: 'sleep'; ms: number } - | { k: 'done' } - | { k: 'exception'; text: string; pos?: Pos } - | { k: 'error'; error: MiniJavaError } - -export interface SeqEvent { - k: 'call' | 'create' | 'return' - /** Teilnehmer: `o12` (Objekt) oder `cMain` (Klasse, statisch); bei `return` leer. */ - from: string - to: string - label: string - /** Zeile des Aufrufs. */ - pos: Pos - /** Rückkehr aus einem Konstruktor: nicht als Pfeil zeichnen. */ - hidden?: boolean -} -export interface SeqParticipant { - key: string - cls: string - label: string - isStatic: boolean -} - -export type StepMode = 'run' | 'into' | 'over' | 'out' - -export interface MiniJavaIO { - out(text: string, err?: boolean): void -} - -// MARK: - Interpreter - -export class MiniJava { - readonly classes = new Map() - private frames: Frame[] = [] - private nextId = 1 - private quiet = 0 - private gen?: G - private send: string | null | undefined - private mode: StepMode = 'run' - private startDepth = 0 - private prevKey = '' - private pauseRequested = false - /** Objekt-Nummer → Name im Objektdiagramm (bleibt beim Weiterschalten gleich). */ - private names = new Map() - private tempNames = new Map() - /** Mitschnitt für das Sequenzdiagramm: Aufrufe eigener Methoden, `new`, Rückgaben. */ - private seq: SeqEvent[] = [] - private seqParticipants = new Map() - private seqLimit = 3000 - private stdin = new JNative('in', 0) - finished = false - - constructor( - files: { path: string; source: string }[], - private io: MiniJavaIO, - ) { - const object: RtClass = { name: 'Object', interfaces: [], statics: new Map(), staticTypes: new Map(), builtin: true, javaName: 'java.lang.Object' } - this.classes.set('Object', object) - for (const [name, sup, pkg] of builtinExceptions) - this.classes.set(name, { name, sup: this.classes.get(sup), interfaces: [], statics: new Map(), staticTypes: new Map(), builtin: true, javaName: `${pkg}.${name}` }) - const decls: ClassDecl[] = [] - for (const f of files) { - try { - decls.push(...parseJava(f.source, f.path)) - } catch (err) { - if (err instanceof JavaSyntaxError) throw new MiniJavaError('syntax', err.message, err.pos) - throw err - } - } - for (const d of decls) this.classes.set(d.name, { name: d.name, decl: d, interfaces: d.interfaces, statics: new Map(), staticTypes: new Map() }) - const own = new Set(decls.map((d) => d.name)) - for (const f of files) { - const missing = missingImport(f.source, f.path, own) - if (missing) throw new MiniJavaError('import', missing.line, missing.pos) - const typo = misspelledType(f.source, f.path, own) - if (typo) throw new MiniJavaError('typename', typo.type, typo.pos) - } - for (const d of decls) { - const c = this.classes.get(d.name)! - const sup = d.superclass ?? (d.kind === 'class' ? 'Object' : undefined) - if (sup) { - c.sup = this.classes.get(sup) - if (!c.sup) throw new MiniJavaError('symbol', sup, d) - } - } - } - - // MARK: Steuerung - - /** Programm vorbereiten: `main` der Klasse `mainClass` (oder der ersten mit main). */ - start(mainClass?: string) { - const candidates = [...this.classes.values()].filter((c) => c.decl?.methods.some(isMain)) - const cls = candidates.find((c) => c.name === mainClass) ?? candidates[0] - if (!cls) throw new MiniJavaError('nomain', '') - this.gen = this.program(cls) - this.finished = false - } - - /** Wie es weitergehen soll: bis zum Haltepunkt, in die nächste Anweisung, darüber, heraus. */ - go(mode: StepMode) { - this.mode = mode - this.startDepth = this.frames.length - this.pauseRequested = false - } - - pause() { - this.pauseRequested = true - } - - /** Antwort auf `input` (eine Zeile aus der Konsole; `null` = Eingabe beendet). */ - input(line: string | null) { - this.send = line - } - - /** Höchstens `budget` Anweisungen ausführen. Haltepunkte als `Datei:Zeile` (Zeile ab 0). */ - run(breakpoints: Set, budget = 5000): RunState { - if (!this.gen || this.finished) return { k: 'done' } - for (let n = 0; n < budget; n++) { - let r: IteratorResult - try { - r = this.gen.next(this.send) - } catch (err) { - this.finished = true - if (err instanceof ProgramExit) return { k: 'done' } - if (err instanceof JavaThrow) return { k: 'exception', text: this.uncaught(err.obj), pos: this.frames.at(-1)?.pos } - if (err instanceof MiniJavaError) return { k: 'error', error: err } - if (err instanceof RangeError) return { k: 'exception', text: 'Exception in thread "main" java.lang.StackOverflowError' } - throw err - } - this.send = undefined - if (r.done) { - this.finished = true - return { k: 'done' } - } - const ev = r.value - if (ev.k === 'input') return { k: 'input' } - if (ev.k === 'sleep') return { k: 'sleep', ms: ev.ms } - const key = `${ev.pos.file}:${ev.pos.line}` - const fresh = key !== this.prevKey - this.prevKey = key - const hit = - this.pauseRequested || this.mode === 'into' || (this.mode === 'over' && ev.depth <= this.startDepth) || (this.mode === 'out' && ev.depth < this.startDepth) || (fresh && breakpoints.has(key)) - if (hit) { - this.pauseRequested = false - return { k: 'paused', pos: ev.pos } - } - } - return { k: 'running' } - } - - private uncaught(obj: JObject): string { - const head = `Exception in thread "main" ${this.throwableText(obj)}` - return [head, ...(obj.native.trace ?? []).map((t) => `\tat ${t}`)].join('\n') - } - - // MARK: Ansichten - - /** Aufrufstapel, oberste Methode zuerst, mit ihren Variablen. */ - stack(): FrameView[] { - this.nameObjects() - return [...this.frames].reverse().map((f) => { - const vars: VarView[] = [] - if (f.self) vars.push({ name: 'this', type: f.self.cls.name, value: this.show(f.self), ref: f.self.id }) - for (const scope of f.scopes) for (const [name, v] of scope) vars.push({ name, type: typeText(v.type), value: this.show(v.v), ...(v.v instanceof JObject ? { ref: v.v.id } : {}) }) - return { title: f.title, pos: f.pos, vars } - }) - } - - /** Alle erreichbaren Objekte eigener Klassen (für das Objektdiagramm). */ - heap(): HeapObject[] { - return this.nameObjects().map((o) => ({ - id: o.id, - name: (this.names.get(o.id) ?? this.tempNames.get(o.id))!, - cls: o.cls.name, - fields: [...o.fields].map(([name, v]) => ({ name, type: typeText(this.fieldType(o.cls, name) ?? T('Object')), value: this.show(v) })), - })) - } - - private fieldType(cls: RtClass | undefined, name: string): TypeRef | undefined { - for (let c = cls; c; c = c.sup) { - const f = c.decl?.fields.find((x) => x.name === name && !x.isStatic) - if (f) return f.type - } - return undefined - } - - /** Objekte erreichbar von statischen Attributen und Variablen; Namen nach der Variablen (`s1`), dem Attribut (`team`) oder der Klasse. */ - private nameObjects(): JObject[] { - const found: JObject[] = [] - const seen = new Set() - const taken = new Set(this.names.values()) - this.tempNames.clear() - // Name nach einer Variablen bleibt; nach einem Attribut oder der Klasse (in einer Liste, `this` im Konstruktor) nur vorläufig. - const give = (o: JObject, base: string, keep: boolean) => { - if (this.names.has(o.id)) return - const real = /^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(base) - let name = real ? base : o.cls.name.charAt(0).toLowerCase() + o.cls.name.slice(1) - if (taken.has(name)) { - let n = 2 - while (taken.has(`${name}${n}`)) n++ - name = `${name}${n}` - } - taken.add(name) - ;(real && keep ? this.names : this.tempNames).set(o.id, name) - } - const queue: [Val, string, boolean?][] = [] - const visit = (v: Val, base: string, keep: boolean) => { - if (v instanceof JObject) { - if (v.cls.builtin || v.native.enumName !== undefined || seen.has(v.id)) return - seen.add(v.id) - give(v, base, keep) - found.push(v) - for (const [f, x] of v.fields) queue.push([x, f]) - } else if (v instanceof JArray || v instanceof JList) { - for (const x of v.items) if (x instanceof JObject) queue.push([x, '']) - } else if (v instanceof JMap) for (const [k, x] of v.entries.values()) queue.push([k, ''], [x, '']) - } - for (const f of this.frames) { - if (f.self) queue.push([f.self, '']) - for (const scope of f.scopes) for (const [name, v] of scope) queue.push([v.v, name, true]) - } - for (const c of this.classes.values()) for (const [name, v] of c.statics) queue.push([v, name, true]) - // Erst die direkt benannten Objekte (Variablen), dann was an Attributen hängt. - for (let i = 0; i < queue.length; i++) { - const [v, base, keep] = queue[i] - // Ohne Namen erst später besuchen: Vielleicht zeigt noch eine Variable darauf. - if (base === '' && v instanceof JObject && !this.names.has(v.id) && queue.slice(i + 1).some(([x, b]) => x === v && b !== '')) continue - visit(v, base, !!keep) - } - return found.sort((a, b) => a.id - b.id) - } - - /** Wert für Anzeige und Objektdiagramm: Objekte mit ihrem Namen, Texte in Anführungszeichen. */ - show(v: Val): string { - if (v === undefined) return '?' - if (v === null) return 'null' - if (typeof v === 'string') return JSON.stringify(v) - if (typeof v === 'number' || typeof v === 'boolean') return String(v) - if (v instanceof JDouble) return formatDouble(v.v) - if (v instanceof JChar) return v.code ? `'${String.fromCharCode(v.code)}'` : "''" - if (v instanceof JObject) { - if (v.native.enumName !== undefined) return v.native.enumName - if (v.cls.builtin) return v.cls.name - return this.names.get(v.id) ?? this.tempNames.get(v.id) ?? `${v.cls.name}@${javaHash(v.id)}` - } - if (v instanceof JArray || v instanceof JList) { - const items = v.items.slice(0, 30).map((x) => this.show(x)) - return `[${items.join(', ')}${v.items.length > 30 ? ', …' : ''}]` - } - if (v instanceof JMap) return `{${[...v.entries.values()].map(([k, x]) => `${this.show(k)}=${this.show(x)}`).join(', ')}}` - if (v instanceof JNative) return v.kind === 'StringBuilder' ? JSON.stringify(v.buf) : v.kind - return v.name - } - - // MARK: Sequenzdiagramm - - private seqKey(of: JObject | RtClass) { - return of instanceof JObject ? `o${of.id}` : `c${of.name}` - } - - private record(k: 'call' | 'create', to: JObject | RtClass, label: () => string): boolean { - if (this.quiet || this.seq.length >= this.seqLimit) return false - const caller = this.frames.at(-1) - const from = caller ? this.seqKey(caller.self ?? caller.cls) : '' - const key = this.seqKey(to) - if (!this.seqParticipants.has(key)) this.seqParticipants.set(key, to instanceof JObject ? { key, cls: to.cls.name, id: to.id } : { key, cls: to.name }) - this.nameObjects() - this.seq.push({ k, from, to: key, label: label(), pos: caller?.pos ?? { file: '', line: 0 } }) - return true - } - - private recordReturn(label: string, exception: boolean, hidden = false) { - if (this.seq.length >= this.seqLimit + 1000) return - this.seq.push({ k: 'return', from: '', to: '', label: exception ? '⚡' : label, pos: this.frames.at(-1)?.pos ?? { file: '', line: 0 }, ...(hidden && !exception ? { hidden } : {}) }) - } - - /** Mitschnitt mit Namen wie im Objektdiagramm: `s1 : Spieler`, ohne Namen `:Spieler`, statisch der Klassenname. */ - sequence(): { participants: SeqParticipant[]; events: SeqEvent[]; truncated: boolean } { - this.nameObjects() - const participants = [...this.seqParticipants.values()].map((p) => ({ - key: p.key, - cls: p.cls, - label: p.id === undefined ? p.cls : `${this.names.get(p.id) ?? this.tempNames.get(p.id) ?? ''} : ${p.cls}`, - isStatic: p.id === undefined, - })) - return { participants, events: [...this.seq], truncated: this.seq.length >= this.seqLimit } - } - - // MARK: Ablauf - - private get frame(): Frame { - return this.frames[this.frames.length - 1] - } - - private *step(at: Pos): G { - const pos = { file: at.file, line: at.line } - if (this.frames.length) this.frame.pos = pos - if (!this.quiet) yield { k: 'step', pos, depth: this.frames.length } - } - - private *program(cls: RtClass): G { - this.quiet++ - try { - for (const c of this.classes.values()) yield* this.initStatics(c) - } finally { - this.quiet-- - } - const main = cls.decl!.methods.find(isMain)! - this.seqParticipants.set(`c${cls.name}`, { key: `c${cls.name}`, cls: cls.name }) - yield* this.invoke(main, cls, undefined, [new JArray(T('String'), [], this.id())]) - } - - private id() { - return this.nextId++ - } - - private *initStatics(c: RtClass): G { - const d = c.decl - if (!d) return - if (d.kind === 'enum') - d.enumConstants.forEach((name, ordinal) => { - const o = new JObject(c, this.id()) - o.native = { enumName: name, ordinal } - c.statics.set(name, o) - c.staticTypes.set(name, T(c.name)) - }) - for (const f of d.fields) - if (f.isStatic) { - c.statics.set(f.name, defaultValue(f.type)) - c.staticTypes.set(f.name, f.type) - } - const frame: Frame = { cls: c, scopes: [new Map()], pos: d, title: `${c.name} (static)` } - this.frames.push(frame) - try { - for (const f of d.fields) if (f.isStatic && f.init) c.statics.set(f.name, castTo(yield* this.initValue(f.init, f.type), f.type)) - } finally { - this.frames.pop() - } - } - - private *initValue(e: Expr, type: TypeRef): G { - return e.k === 'arrayInit' ? yield* this.arrayFrom(e, type) : yield* this.eval(e) - } - - private *arrayFrom(e: Expr & { k: 'arrayInit' }, type: TypeRef): G { - const elem = { ...type, dims: type.dims - 1 } - const items: Val[] = [] - for (const x of e.items) items.push(castTo(x.k === 'arrayInit' ? yield* this.arrayFrom(x, elem) : yield* this.eval(x), elem)) - return new JArray(elem, items, this.id()) - } - - // MARK: Methoden und Konstruktoren - - private *invoke(m: MethodDecl, owner: RtClass, self: JObject | undefined, args: Val[]): G { - if (!m.body) throw new MiniJavaError('unsupported', `abstract ${m.name}`, m) - if (this.frames.length > 900) throw new JavaThrow(this.exception('StackOverflowError')) - const scope = new Map() - m.params.forEach((p, i) => scope.set(p.name, { v: castTo(args[i], p.type), type: p.type })) - const title = m.isConstructor ? `new ${owner.name}()` : `${owner.name}.${m.name}()` - const recorded = this.frames.length > 0 && this.record('call', self ? self : owner, () => `${m.name}(${args.map((a) => this.show(a)).join(', ')})`) - this.frames.push({ cls: owner, method: m, self, scopes: [scope], pos: m, title }) - let done = false - try { - const r = yield* this.execBody(m.body.body) - let v: Val = undefined - if (r?.k === 'return') v = castTo(r.v, m.returns) - else yield* this.step({ file: m.file, line: m.endLine }) - done = true - this.frames.pop() - if (recorded) this.recordReturn(m.returns && m.returns.name !== 'void' ? this.show(v) : '', false) - return v - } finally { - if (!done) { - this.frames.pop() - if (recorded) this.recordReturn('', true) - } - } - } - - private *execBody(body: Stmt[]): G { - for (const s of body) { - const r = yield* this.exec(s) - if (r) return r - } - return undefined - } - - private *construct(cls: RtClass, args: Val[], pos: Pos): G { - if (cls.decl?.isAbstract) throw new MiniJavaError('type', `abstract ${cls.name}`, pos) - const obj = new JObject(cls, this.id()) - const chain: RtClass[] = [] - for (let c: RtClass | undefined = cls; c; c = c.sup) chain.unshift(c) - for (const c of chain) for (const f of c.decl?.fields ?? []) if (!f.isStatic) obj.fields.set(f.name, defaultValue(f.type)) - const recorded = this.record('create', obj, () => `new ${cls.name}(${args.map((a) => this.show(a)).join(', ')})`) - let done = false - try { - yield* this.runCtor(cls, obj, args, pos) - done = true - } finally { - if (recorded) this.recordReturn('', !done, true) - } - return obj - } - - private *runCtor(cls: RtClass, obj: JObject, args: Val[], pos: Pos): G { - if (cls.builtin) { - if (args.length) obj.native.message = typeof args[0] === 'string' || args[0] === null ? args[0] : yield* this.str(args[0]) - obj.native.trace = this.trace() - return - } - const decl = cls.decl! - const ctors = decl.methods.filter((m) => m.isConstructor) - if (!ctors.length) { - if (args.length) throw new MiniJavaError('symbol', `${cls.name}(${args.length})`, pos) - if (cls.sup) yield* this.runCtor(cls.sup, obj, [], pos) - this.frames.push({ cls, self: obj, scopes: [new Map()], pos: decl, title: `new ${cls.name}()` }) - try { - yield* this.fieldInits(cls, obj) - } finally { - this.frames.pop() - } - return - } - const m = this.pick(ctors, args) - if (!m) throw new MiniJavaError('symbol', `${cls.name}(${args.length})`, pos) - const scope = new Map() - m.params.forEach((p, i) => scope.set(p.name, { v: castTo(args[i], p.type), type: p.type })) - this.frames.push({ cls, method: m, self: obj, scopes: [scope], pos: m, title: `new ${cls.name}()` }) - try { - let body = m.body!.body - const first = body[0] - if (first?.k === 'ctorCall') { - yield* this.step(first) - const a: Val[] = [] - for (const x of first.args) a.push(yield* this.eval(x)) - body = body.slice(1) - if (first.isSuper) { - if (cls.sup) yield* this.runCtor(cls.sup, obj, a, first) - yield* this.fieldInits(cls, obj) - } else yield* this.runCtor(cls, obj, a, first) - } else { - if (cls.sup) yield* this.runCtor(cls.sup, obj, [], m) - yield* this.fieldInits(cls, obj) - } - const r = yield* this.execBody(body) - if (r?.k !== 'return') yield* this.step({ file: m.file, line: m.endLine }) - } finally { - this.frames.pop() - } - } - - private *fieldInits(cls: RtClass, obj: JObject): G { - for (const f of cls.decl?.fields ?? []) - if (!f.isStatic && f.init) { - yield* this.step(f) - obj.fields.set(f.name, castTo(yield* this.initValue(f.init, f.type), f.type)) - } - } - - /** Passende Methode zu den Argumenten (Überladen: genauester Treffer). */ - private pick(methods: MethodDecl[], args: Val[]): MethodDecl | undefined { - let best: MethodDecl | undefined - let bestScore = -1 - for (const m of methods) { - if (m.params.length !== args.length) continue - let score = 0 - for (let i = 0; i < args.length && score >= 0; i++) { - const s = this.fits(args[i], m.params[i].type) - score = s < 0 ? -1 : score + s - } - if (score > bestScore) { - best = m - bestScore = score - } - } - return best - } - - /** Passt der Wert zum Parametertyp? 2 = genau, 1 = umwandelbar, -1 = nein. */ - private fits(v: Val, t: TypeRef): number { - const n = t.name - if (t.dims) return v === null ? 1 : v instanceof JArray ? 2 : -1 - if (intTypes.has(n)) return typeof v === 'number' ? 2 : v instanceof JChar ? 1 : -1 - if (doubleTypes.has(n)) return v instanceof JDouble ? 2 : isNum(v) ? 1 : -1 - if (n === 'char' || n === 'Character') return v instanceof JChar ? 2 : -1 - if (n === 'boolean' || n === 'Boolean') return typeof v === 'boolean' ? 2 : -1 - if (n === 'String') return typeof v === 'string' ? 2 : v === null ? 1 : -1 - if (n === 'Object') return 0 - if (listTypes.has(n)) return v instanceof JList ? 2 : v === null ? 1 : -1 - if (mapTypes.has(n)) return v instanceof JMap ? 2 : v === null ? 1 : -1 - const cls = this.classes.get(n) - if (cls) return v === null ? 1 : v instanceof JObject && this.isA(v.cls, n) ? (v.cls.name === n ? 2 : 1) : -1 - return 0 - } - - private isA(cls: RtClass | undefined, name: string): boolean { - const seen = new Set() - const walk = (c: RtClass | undefined): boolean => { - if (!c || seen.has(c.name)) return false - if (c.name === name) return true - seen.add(c.name) - return walk(c.sup) || c.interfaces.some((i) => walk(this.classes.get(i))) - } - return name === 'Object' || walk(cls) - } - - /** Methode suchen: Klasse, dann Oberklassen, dann Interfaces (default-Methoden). */ - private findMethod(cls: RtClass | undefined, name: string, args: Val[], wantBody = true): { m: MethodDecl; owner: RtClass } | undefined { - const seen = new Set() - const ifaces: RtClass[] = [] - for (let c = cls; c; c = c.sup) { - const m = this.pick(c.decl?.methods.filter((x) => x.name === name && !x.isConstructor && (!wantBody || x.body)) ?? [], args) - if (m) return { m, owner: c } - for (const i of c.interfaces) ifaces.push(this.classes.get(i)!) - } - while (ifaces.length) { - const c = ifaces.shift() - if (!c || seen.has(c.name)) continue - seen.add(c.name) - const m = this.pick(c.decl?.methods.filter((x) => x.name === name && (!wantBody || x.body)) ?? [], args) - if (m) return { m, owner: c } - for (const i of c.interfaces) ifaces.push(this.classes.get(i)!) - } - return undefined - } - - private trace(): string[] { - return [...this.frames].reverse().map((f) => { - const name = f.method ? (f.method.isConstructor ? '' : f.method.name) : '' - return `${f.cls.name}.${name}(${f.pos.file.split('/').pop()}:${f.pos.line + 1})` - }) - } - - private exception(name: string, message?: string): JObject { - const o = new JObject(this.classes.get(name)!, this.id()) - o.native = { message: message ?? null, trace: this.trace() } - return o - } - - private fail(name: string, message?: string): never { - throw new JavaThrow(this.exception(name, message)) - } - - private throwableText(o: JObject): string { - const msg = o.native.message - const name = o.cls.javaName ?? o.cls.name - return msg === null || msg === undefined ? name : `${name}: ${msg}` - } - - // MARK: Anweisungen - - private *exec(s: Stmt): G { - switch (s.k) { - case 'block': { - this.frame.scopes.push(new Map()) - try { - return yield* this.execBody(s.body) - } finally { - this.frame.scopes.pop() - } - } - case 'empty': - return undefined - case 'local': - yield* this.step(s) - yield* this.declare(s) - return undefined - case 'expr': - yield* this.step(s) - yield* this.eval(s.expr) - return undefined - case 'if': - yield* this.step(s) - if (yield* this.test(s.test)) return yield* this.exec(s.then) - return s.else ? yield* this.exec(s.else) : undefined - case 'while': - for (;;) { - yield* this.step(s) - if (!(yield* this.test(s.test))) return undefined - const r = yield* this.exec(s.body) - if (r?.k === 'break') return undefined - if (r?.k === 'return') return r - } - case 'do': - for (;;) { - const r = yield* this.exec(s.body) - if (r?.k === 'break') return undefined - if (r?.k === 'return') return r - yield* this.step(s.test) - if (!(yield* this.test(s.test))) return undefined - } - case 'for': { - this.frame.scopes.push(new Map()) - try { - yield* this.step(s) - for (const init of s.init) { - if (init.k === 'local') yield* this.declare(init) - else if (init.k === 'expr') yield* this.eval(init.expr) - } - for (;;) { - if (s.test && !(yield* this.test(s.test))) return undefined - const r = yield* this.exec(s.body) - if (r?.k === 'break') return undefined - if (r?.k === 'return') return r - yield* this.step(s) - for (const u of s.update) yield* this.eval(u) - } - } finally { - this.frame.scopes.pop() - } - } - case 'foreach': { - yield* this.step(s) - const iter = yield* this.eval(s.iter) - if (iter === null) this.fail('NullPointerException') - const items = iter instanceof JArray || iter instanceof JList ? [...iter.items] : iter instanceof JMap ? [...iter.entries.values()].map((e) => e[0]) : undefined - if (!items) throw new MiniJavaError('type', 'for-each', s) - for (let i = 0; i < items.length; i++) { - if (i > 0) yield* this.step(s) - if (iter instanceof JList && iter.items.length !== items.length) this.fail('ConcurrentModificationException') - this.frame.scopes.push(new Map([[s.name, { v: castTo(items[i], s.type), type: s.type }]])) - try { - const r = yield* this.exec(s.body) - if (r?.k === 'break') return undefined - if (r?.k === 'return') return r - } finally { - this.frame.scopes.pop() - } - } - return undefined - } - case 'switch': { - yield* this.step(s) - const v = yield* this.eval(s.expr) - let start = -1 - for (let i = 0; i < s.cases.length && start < 0; i++) { - const labels = s.cases[i].labels - if (labels === 'default') continue - for (const l of labels) { - const lv = v instanceof JObject && v.native.enumName !== undefined && l.k === 'name' ? v.cls.statics.get(l.name) : yield* this.eval(l) - if (this.same(v, lv)) start = i - } - } - if (start < 0) start = s.cases.findIndex((c) => c.labels === 'default') - if (start < 0) return undefined - this.frame.scopes.push(new Map()) - try { - for (let i = start; i < s.cases.length; i++) { - const r = yield* this.execBody(s.cases[i].body) - if (r?.k === 'break') return undefined - if (r) return r - if (s.cases[i].arrow) return undefined - } - } finally { - this.frame.scopes.pop() - } - return undefined - } - case 'break': - yield* this.step(s) - return BREAK - case 'continue': - yield* this.step(s) - return CONTINUE - case 'return': - yield* this.step(s) - return { k: 'return', v: s.value ? yield* this.eval(s.value) : undefined } - case 'throw': { - yield* this.step(s) - const v = yield* this.eval(s.value) - if (!(v instanceof JObject)) this.fail('NullPointerException') - throw new JavaThrow(v) - } - case 'try': { - let result: Done - try { - try { - result = yield* this.exec(s.body) - } catch (err) { - if (!(err instanceof JavaThrow)) throw err - const c = s.catches.find((x) => x.types.some((t) => this.isA(err.obj.cls, t.name))) - if (!c) throw err - this.frame.scopes.push(new Map([[c.name, { v: err.obj, type: c.types[0] }]])) - try { - result = yield* this.exec(c.body) - } finally { - this.frame.scopes.pop() - } - } - } finally { - if (s.finally) { - const r = yield* this.exec(s.finally) - if (r) return r - } - } - return result - } - case 'ctorCall': - throw new MiniJavaError('syntax', 'ctorCall', s) - } - } - - private *declare(s: Stmt & { k: 'local' }): G { - for (const v of s.vars) { - const type = v.dims ? { ...s.type, dims: s.type.dims + v.dims } : s.type - const value = v.init ? castTo(yield* this.initValue(v.init, type), type) : undefined - this.frame.scopes[this.frame.scopes.length - 1].set(v.name, { v: value, type }) - } - } - - private *test(e: Expr): G { - const v = yield* this.eval(e) - if (typeof v !== 'boolean') throw new MiniJavaError('type', 'boolean', e) - return v - } - - // MARK: Ausdrücke - - private lookupVar(name: string): Variable | undefined { - const scopes = this.frame.scopes - for (let i = scopes.length - 1; i >= 0; i--) { - const v = scopes[i].get(name) - if (v) return v - } - return undefined - } - - private staticOwner(cls: RtClass | undefined, name: string): RtClass | undefined { - const seen = new Set() - const walk = (c: RtClass | undefined): RtClass | undefined => { - if (!c || seen.has(c.name)) return undefined - seen.add(c.name) - if (c.statics.has(name)) return c - return walk(c.sup) ?? c.interfaces.map((i) => walk(this.classes.get(i))).find(Boolean) - } - return walk(cls) - } - - /** Ort zum Lesen und Schreiben: Variable, Attribut, statisches Attribut oder Array-Element. */ - private *place(e: Expr): G<{ get(): Val; set(v: Val): void; type?: TypeRef }> { - if (e.k === 'name') { - const local = this.lookupVar(e.name) - if (local) return { get: () => local.v, set: (v) => (local.v = v), type: local.type } - const self = this.frame.self - if (self?.fields.has(e.name)) return { get: () => self.fields.get(e.name), set: (v) => self.fields.set(e.name, v), type: this.fieldType(self.cls, e.name) } - const owner = this.staticOwner(this.frame.cls, e.name) - if (owner) return { get: () => owner.statics.get(e.name), set: (v) => owner.statics.set(e.name, v), type: owner.staticTypes.get(e.name) } - if (this.classes.has(e.name) || staticBuiltins.has(e.name)) return { get: () => new ClassRef(e.name), set: () => {} } - throw new MiniJavaError('symbol', e.name, e) - } - if (e.k === 'field') { - const target = yield* this.eval(e.target) - if (target instanceof JObject && target.fields.has(e.name)) return { get: () => target.fields.get(e.name), set: (v) => target.fields.set(e.name, v), type: this.fieldType(target.cls, e.name) } - const owner = target instanceof ClassRef ? this.staticOwner(this.classes.get(target.name), e.name) : target instanceof JObject ? this.staticOwner(target.cls, e.name) : undefined - if (owner) return { get: () => owner.statics.get(e.name), set: (v) => owner.statics.set(e.name, v), type: owner.staticTypes.get(e.name) } - const v = this.builtinField(target, e.name, e) - return { - get: () => v, - set: () => { - throw new MiniJavaError('type', e.name, e) - }, - } - } - if (e.k === 'index') { - const arr = yield* this.eval(e.target) - const i = num(yield* this.eval(e.index)) - if (arr === null) this.fail('NullPointerException') - if (!(arr instanceof JArray)) throw new MiniJavaError('type', '[]', e) - if (i < 0 || i >= arr.items.length) this.fail('ArrayIndexOutOfBoundsException', `Index ${i} out of bounds for length ${arr.items.length}`) - return { get: () => arr.items[i], set: (v) => (arr.items[i] = v), type: arr.elem } - } - const v = yield* this.eval(e) - return { - get: () => v, - set: () => { - throw new MiniJavaError('syntax', 'assignTarget', e) - }, - } - } - - private builtinField(target: Val, name: string, pos: Pos): Val { - if (target === null) this.fail('NullPointerException', `Cannot read field "${name}" because value is null`) - if (target instanceof JArray && name === 'length') return target.items.length - if (target instanceof ClassRef) { - const key = `${target.name}.${name}` - switch (key) { - case 'System.out': - return new JNative('out', 0) - case 'System.err': - return new JNative('err', 0) - case 'System.in': - return this.stdin - case 'Math.PI': - return new JDouble(Math.PI) - case 'Math.E': - return new JDouble(Math.E) - case 'Integer.MAX_VALUE': - return 2147483647 - case 'Integer.MIN_VALUE': - return -2147483648 - case 'Long.MAX_VALUE': - return Number.MAX_SAFE_INTEGER - case 'Double.MAX_VALUE': - return new JDouble(Number.MAX_VALUE) - case 'Double.MIN_VALUE': - return new JDouble(Number.MIN_VALUE) - } - } - throw new MiniJavaError('symbol', name, pos) - } - - private *eval(e: Expr): G { - switch (e.k) { - case 'lit': { - const { t, v } = e.value - return t === 'double' ? new JDouble(v as number) : t === 'char' ? new JChar(v as number) : (v as Val) - } - case 'name': { - const local = this.lookupVar(e.name) - if (local) { - if (local.v === undefined) throw new MiniJavaError('type', `uninit:${e.name}`, e) - return local.v - } - return (yield* this.place(e)).get() - } - case 'this': - if (!this.frame.self) throw new MiniJavaError('type', 'static:this', e) - return this.frame.self - case 'super': - if (!this.frame.self) throw new MiniJavaError('type', 'static:super', e) - return this.frame.self - case 'field': - case 'index': - return (yield* this.place(e)).get() - case 'assign': { - const p = yield* this.place(e.target) - let v: Val - if (e.op === '=') v = e.value.k === 'arrayInit' && p.type ? yield* this.arrayFrom(e.value, p.type) : yield* this.eval(e.value) - else { - const old = p.get() - v = yield* this.binary(e.op.slice(0, -1), old, yield* this.eval(e.value), e) - } - v = castTo(v, p.type) - p.set(v) - return v - } - case 'incdec': { - const p = yield* this.place(e.target) - const old = p.get() - if (!isNum(old)) this.fail('NullPointerException') - const d = e.op === '++' ? 1 : -1 - const nv = old instanceof JDouble ? new JDouble(old.v + d) : old instanceof JChar ? new JChar((old.code + d) & 0xffff) : inInt(num(old)) ? (num(old) + d) | 0 : num(old) + d - p.set(castTo(nv, p.type)) - return e.prefix ? nv : old - } - case 'unary': { - const v = yield* this.eval(e.expr) - if (e.op === '!') return !v - if (e.op === '-') return v instanceof JDouble ? new JDouble(-v.v) : inInt(num(v)) ? -num(v) | 0 : -num(v) - if (e.op === '~') return ~num(v) - return v instanceof JChar ? v.code : v - } - case 'binary': { - if (e.op === '&&') return (yield* this.test(e.left)) && (yield* this.test(e.right)) - if (e.op === '||') return (yield* this.test(e.left)) || (yield* this.test(e.right)) - const a = yield* this.eval(e.left) - const b = yield* this.eval(e.right) - return yield* this.binary(e.op, a, b, e) - } - case 'cond': - return (yield* this.test(e.test)) ? yield* this.eval(e.then) : yield* this.eval(e.else) - case 'cast': { - const v = yield* this.eval(e.expr) - const n = e.type.name - if (v instanceof JObject && this.classes.has(n) && !this.isA(v.cls, n)) this.fail('ClassCastException', `class ${v.cls.name} cannot be cast to class ${n}`) - return castTo(v, e.type) - } - case 'instanceof': { - const v = yield* this.eval(e.expr) - if (v === null) return false - const n = e.type.name - if (v instanceof JObject) return this.isA(v.cls, n) - if (typeof v === 'string') return n === 'String' || n === 'Object' || n === 'CharSequence' - if (v instanceof JList) return listTypes.has(n) || n === 'Object' - return n === 'Object' - } - case 'new': - return yield* this.create(e) - case 'newArray': { - if (e.init && e.init.k === 'arrayInit') return yield* this.arrayFrom(e.init, e.type) - const sizes: number[] = [] - for (const s of e.sizes) sizes.push(num(yield* this.eval(s))) - const make = (level: number, type: TypeRef): JArray => { - const n = sizes[level] - if (n < 0) this.fail('NegativeArraySizeException', String(n)) - const elem = { ...type, dims: type.dims - 1 } - const items = Array.from({ length: n }, () => (level + 1 < sizes.length ? make(level + 1, elem) : defaultValue(elem))) - return new JArray(elem, items, this.id()) - } - return make(0, e.type) - } - case 'arrayInit': - return yield* this.arrayFrom(e, T('Object', 1)) - case 'call': - return yield* this.call(e) - } - } - - private *binary(op: string, a: Val, b: Val, pos: Pos): G { - if (op === '+' && (typeof a === 'string' || typeof b === 'string')) return (yield* this.str(a)) + (yield* this.str(b)) - if (op === '==') return this.same(a, b) - if (op === '!=') return !this.same(a, b) - if (typeof a === 'boolean' && typeof b === 'boolean') { - if (op === '&') return a && b - if (op === '|') return a || b - if (op === '^') return a !== b - } - if (!isNum(a) || !isNum(b)) { - if (a === null || b === null) this.fail('NullPointerException') - throw new MiniJavaError('type', op, pos) - } - const x = num(a) - const y = num(b) - const dbl = a instanceof JDouble || b instanceof JDouble - const ints = inInt(x) && inInt(y) - switch (op) { - case '+': - return dbl ? new JDouble(x + y) : ints ? (x + y) | 0 : x + y - case '-': - return dbl ? new JDouble(x - y) : ints ? (x - y) | 0 : x - y - case '*': - return dbl ? new JDouble(x * y) : ints ? Math.imul(x, y) : x * y - case '/': - if (dbl) return new JDouble(x / y) - if (y === 0) this.fail('ArithmeticException', '/ by zero') - return ints ? Math.trunc(x / y) | 0 : Math.trunc(x / y) - case '%': - if (dbl) return new JDouble(x % y) - if (y === 0) this.fail('ArithmeticException', '/ by zero') - return x % y - case '<': - return x < y - case '>': - return x > y - case '<=': - return x <= y - case '>=': - return x >= y - case '&': - return x & y - case '|': - return x | y - case '^': - return x ^ y - case '<<': - return x << y - case '>>': - return x >> y - case '>>>': - return x >>> y - } - throw new MiniJavaError('unsupported', op, pos) - } - - private same(a: Val, b: Val): boolean { - if (isNum(a) && isNum(b)) return num(a) === num(b) - return a === b - } - - /** Text eines Werts wie `String.valueOf` (ruft eigenes `toString()` auf). */ - private *str(v: Val): G { - if (v === null || v === undefined) return 'null' - if (typeof v === 'string') return v - if (typeof v === 'number' || typeof v === 'boolean') return String(v) - if (v instanceof JDouble) return formatDouble(v.v) - if (v instanceof JChar) return String.fromCharCode(v.code) - if (v instanceof JObject) { - const own = this.findMethod(v.cls, 'toString', []) - if (own) return yield* this.str(yield* this.invoke(own.m, own.owner, v, [])) - if (v.native.enumName !== undefined) return v.native.enumName - if (v.cls.builtin) return this.throwableText(v) - return `${v.cls.name}@${javaHash(v.id)}` - } - if (v instanceof JList) { - const parts: string[] = [] - for (const x of v.items) parts.push(x === v ? '(this Collection)' : yield* this.str(x)) - return `[${parts.join(', ')}]` - } - if (v instanceof JMap) { - const parts: string[] = [] - for (const [k, x] of v.entries.values()) parts.push(`${yield* this.str(k)}=${yield* this.str(x)}`) - return `{${parts.join(', ')}}` - } - if (v instanceof JArray) { - const code = v.elem.dims ? '[L' : (({ int: 'I', double: 'D', char: 'C', boolean: 'Z', long: 'J' } as Record)[v.elem.name] ?? `L${v.elem.name};`) - return `[${code}@${javaHash(v.id)}` - } - if (v instanceof JNative) return v.kind === 'StringBuilder' ? v.buf : `java.util.${v.kind}@${javaHash(v.id)}` - return `class ${v.name}` - } - - private *equalsVal(a: Val, b: Val): G { - if (a instanceof JObject && !a.cls.builtin) { - const own = this.findMethod(a.cls, 'equals', [b]) - if (own) return (yield* this.invoke(own.m, own.owner, a, [b])) === true - } - if (typeof a === 'string' || a === null) return a === b - return this.same(a, b) && a instanceof JDouble === b instanceof JDouble - } - - private *create(e: Expr & { k: 'new' }): G { - const args: Val[] = [] - for (const a of e.args) args.push(yield* this.eval(a)) - const n = e.type.name - const cls = this.classes.get(n) - if (cls) return yield* this.construct(cls, args, e) - if (n === 'ArrayList' || n === 'LinkedList') { - const l = new JList(this.id()) - if (args[0] instanceof JList) l.items = [...args[0].items] - return l - } - if (n === 'HashMap' || n === 'TreeMap' || n === 'LinkedHashMap') return new JMap(this.id()) - if (n === 'Scanner') return new JNative('Scanner', this.id()) - if (n === 'Random') return new JNative('Random', this.id()) - if (n === 'StringBuilder') { - const sb = new JNative('StringBuilder', this.id()) - if (typeof args[0] === 'string') sb.buf = args[0] - return sb - } - if (n === 'String') return args.length ? yield* this.str(args[0] instanceof JArray ? args[0].items.map((c) => (c instanceof JChar ? String.fromCharCode(c.code) : '')).join('') : args[0]) : '' - if (n === 'Object') return new JObject(this.classes.get('Object')!, this.id()) - throw new MiniJavaError('unsupported', `new ${n}`, e) - } - - // MARK: Aufrufe - - private *call(e: Expr & { k: 'call' }): G { - const args = () => this.evalArgs(e.args) - if (!e.target) { - const a = yield* args() - const self = this.frame.self - const found = this.findMethod(self?.cls ?? this.frame.cls, e.name, a) ?? (self ? this.findMethod(this.frame.cls, e.name, a) : undefined) - if (!found) throw new MiniJavaError('symbol', `${e.name}()`, e) - if (!found.m.isStatic && !self) throw new MiniJavaError('type', `static:${e.name}`, e) - return yield* this.invoke(found.m, found.owner, found.m.isStatic ? undefined : self, a) - } - if (e.target.k === 'super') { - const a = yield* args() - const found = this.findMethod(this.frame.cls.sup, e.name, a) - if (found) return yield* this.invoke(found.m, found.owner, this.frame.self, a) - return yield* this.objectMethod(this.frame.self!, e.name, a, e, true) - } - const target = yield* this.eval(e.target) - const a = yield* args() - if (target === null || target === undefined) this.fail('NullPointerException', `Cannot invoke "${e.name}()" because value is null`) - if (typeof target === 'string') return yield* this.stringMethod(target, e.name, a, e) - if (target instanceof JObject) { - const found = this.findMethod(target.cls, e.name, a) - if (found) return yield* this.invoke(found.m, found.owner, found.m.isStatic ? undefined : target, a) - return yield* this.objectMethod(target, e.name, a, e) - } - if (target instanceof JList) return yield* this.listMethod(target, e.name, a, e) - if (target instanceof JMap) return yield* this.mapMethod(target, e.name, a, e) - if (target instanceof JNative) return yield* this.nativeMethod(target, e.name, a, e) - if (target instanceof ClassRef) { - const cls = this.classes.get(target.name) - if (cls && !cls.builtin) { - if (cls.decl?.kind === 'enum' && e.name === 'values') - return new JArray( - T(cls.name), - cls.decl.enumConstants.map((c) => cls.statics.get(c)), - this.id(), - ) - if (cls.decl?.kind === 'enum' && e.name === 'valueOf') { - const v = cls.statics.get(String(a[0])) - if (!(v instanceof JObject)) this.fail('IllegalArgumentException', `No enum constant ${cls.name}.${a[0]}`) - return v - } - const found = this.findMethod(cls, e.name, a) - if (!found) throw new MiniJavaError('symbol', `${target.name}.${e.name}()`, e) - return yield* this.invoke(found.m, found.owner, undefined, a) - } - return yield* this.staticBuiltin(target.name, e.name, a, e) - } - if (target instanceof JArray) { - if (e.name === 'clone') return new JArray(target.elem, [...target.items], this.id()) - if (e.name === 'length') throw new MiniJavaError('symbol', 'length()', e) - } - if (isNum(target) || typeof target === 'boolean') { - if (e.name === 'equals') return yield* this.equalsVal(target, a[0]) - if (e.name === 'toString') return yield* this.str(target) - if (e.name === 'compareTo') return Math.sign(num(target) - num(a[0])) - if (e.name === 'intValue') return Math.trunc(num(target)) - if (e.name === 'doubleValue') return new JDouble(num(target)) - } - throw new MiniJavaError('symbol', `${e.name}()`, e) - } - - private *evalArgs(list: Expr[]): G { - const out: Val[] = [] - for (const a of list) out.push(yield* this.eval(a)) - return out - } - - private *objectMethod(o: JObject, name: string, a: Val[], pos: Pos, viaSuper = false): G { - switch (name) { - case 'toString': - if (viaSuper) return o.cls.builtin || this.isA(o.cls, 'Throwable') ? this.throwableText(o) : `${o.cls.name}@${javaHash(o.id)}` - return yield* this.str(o) - case 'equals': - return o === a[0] - case 'hashCode': - return parseInt(javaHash(o.id), 16) | 0 - case 'getClass': - return new ClassRef(o.cls.name) - case 'getMessage': - case 'getLocalizedMessage': - return o.native.message ?? null - case 'printStackTrace': - this.io.out(`${this.throwableText(o)}\n${(o.native.trace ?? []).map((t) => `\tat ${t}\n`).join('')}`, true) - return undefined - case 'name': - if (o.native.enumName !== undefined) return o.native.enumName - break - case 'ordinal': - if (o.native.ordinal !== undefined) return o.native.ordinal - break - case 'compareTo': - if (o.native.ordinal !== undefined && a[0] instanceof JObject) return o.native.ordinal - (a[0].native.ordinal ?? 0) - break - } - throw new MiniJavaError('symbol', `${o.cls.name}.${name}()`, pos) - } - - private index(i: Val, size: number, pos: Pos, inclusive = false): number { - const n = num(i) - if (!(n >= 0 && (inclusive ? n <= size : n < size))) this.fail('IndexOutOfBoundsException', `Index ${n} out of bounds for length ${size}`) - void pos - return n - } - - private *stringMethod(s: string, name: string, a: Val[], pos: Pos): G { - const sIdx = (i: Val, inclusive = false) => { - const n = num(i) - if (!(n >= 0 && (inclusive ? n <= s.length : n < s.length))) this.fail('StringIndexOutOfBoundsException', `index ${n}, length ${s.length}`) - return n - } - const arg = typeof a[0] === 'string' ? a[0] : a[0] instanceof JChar ? String.fromCharCode(a[0].code) : yield* this.str(a[0]) - switch (name) { - case 'length': - return s.length - case 'charAt': - return new JChar(s.charCodeAt(sIdx(a[0]))) - case 'equals': - return s === a[0] - case 'equalsIgnoreCase': - return typeof a[0] === 'string' && s.toLowerCase() === a[0].toLowerCase() - case 'compareTo': - case 'compareToIgnoreCase': { - const x = name === 'compareTo' ? s : s.toLowerCase() - const y = name === 'compareTo' ? arg : arg.toLowerCase() - for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x.charCodeAt(i) - y.charCodeAt(i) - return x.length - y.length - } - case 'substring': { - const from = sIdx(a[0], true) - const to = a.length > 1 ? sIdx(a[1], true) : s.length - if (to < from) this.fail('StringIndexOutOfBoundsException', `begin ${from}, end ${to}, length ${s.length}`) - return s.substring(from, to) - } - case 'indexOf': - return s.indexOf(arg, a.length > 1 ? num(a[1]) : 0) - case 'lastIndexOf': - return s.lastIndexOf(arg) - case 'contains': - return s.includes(arg) - case 'startsWith': - return s.startsWith(arg) - case 'endsWith': - return s.endsWith(arg) - case 'isEmpty': - return s.length === 0 - case 'isBlank': - return s.trim().length === 0 - case 'toUpperCase': - return s.toUpperCase() - case 'toLowerCase': - return s.toLowerCase() - case 'trim': - case 'strip': - return s.trim() - case 'concat': - return s + arg - case 'replace': { - const to = typeof a[1] === 'string' ? a[1] : a[1] instanceof JChar ? String.fromCharCode(a[1].code) : yield* this.str(a[1]) - return s.split(arg).join(to) - } - case 'replaceAll': - return s.replace(new RegExp(arg, 'g'), String(a[1])) - case 'matches': - return new RegExp(`^(?:${arg})$`).test(s) - case 'split': - return new JArray( - T('String'), - (s === '' ? [''] : s.split(new RegExp(arg))).filter((x, i, all) => x !== '' || i < all.length - 1 || all.length === 1), - this.id(), - ) - case 'toCharArray': - return new JArray( - T('char'), - [...s].map((c) => new JChar(c.charCodeAt(0))), - this.id(), - ) - case 'repeat': - return s.repeat(num(a[0])) - case 'hashCode': - return stringHash(s) - case 'toString': - case 'intern': - return s - case 'chars': - break - } - throw new MiniJavaError('unsupported', `String.${name}()`, pos) - } - - private *listMethod(l: JList, name: string, a: Val[], pos: Pos): G { - switch (name) { - case 'add': - if (a.length === 2) l.items.splice(this.index(a[0], l.items.length, pos, true), 0, a[1]) - else l.items.push(a[0]) - return a.length === 2 ? undefined : true - case 'addAll': - if (a[0] instanceof JList) l.items.push(...a[0].items) - return true - case 'get': - return l.items[this.index(a[0], l.items.length, pos)] - case 'set': { - const i = this.index(a[0], l.items.length, pos) - const old = l.items[i] - l.items[i] = a[1] - return old - } - case 'size': - return l.items.length - case 'isEmpty': - return l.items.length === 0 - case 'clear': - l.items = [] - return undefined - case 'remove': { - if (typeof a[0] === 'number') return l.items.splice(this.index(a[0], l.items.length, pos), 1)[0] - for (let i = 0; i < l.items.length; i++) - if (yield* this.equalsVal(a[0], l.items[i])) { - l.items.splice(i, 1) - return true - } - return false - } - case 'contains': - case 'indexOf': - for (let i = 0; i < l.items.length; i++) if (yield* this.equalsVal(a[0], l.items[i])) return name === 'contains' ? true : i - return name === 'contains' ? false : -1 - case 'getFirst': - case 'getLast': - case 'removeFirst': - case 'removeLast': { - if (!l.items.length) this.fail('NoSuchElementException') - const first = name.endsWith('First') - const v = first ? l.items[0] : l.items[l.items.length - 1] - if (name.startsWith('remove')) l.items.splice(first ? 0 : l.items.length - 1, 1) - return v - } - case 'addFirst': - l.items.unshift(a[0]) - return undefined - case 'addLast': - l.items.push(a[0]) - return undefined - case 'toString': - return yield* this.str(l) - case 'sort': - l.items = yield* this.sorted(l.items) - return undefined - } - throw new MiniJavaError('unsupported', `ArrayList.${name}()`, pos) - } - - private key(v: Val): string { - if (typeof v === 'string') return `s${v}` - if (isNum(v)) return `n${num(v)}` - if (v instanceof JObject && v.native.enumName !== undefined) return `e${v.cls.name}.${v.native.enumName}` - if (v instanceof JObject || v instanceof JList || v instanceof JArray) return `o${v.id}` - return String(v) - } - - private *mapMethod(m: JMap, name: string, a: Val[], pos: Pos): G { - const k = this.key(a[0]) - switch (name) { - case 'put': { - const old = m.entries.get(k)?.[1] ?? null - m.entries.set(k, [a[0], a[1]]) - return old - } - case 'get': - return m.entries.get(k)?.[1] ?? null - case 'getOrDefault': - return m.entries.has(k) ? m.entries.get(k)![1] : a[1] - case 'containsKey': - return m.entries.has(k) - case 'containsValue': - for (const [, v] of m.entries.values()) if (yield* this.equalsVal(a[0], v)) return true - return false - case 'remove': { - const old = m.entries.get(k)?.[1] ?? null - m.entries.delete(k) - return old - } - case 'size': - return m.entries.size - case 'isEmpty': - return m.entries.size === 0 - case 'clear': - m.entries.clear() - return undefined - case 'keySet': - case 'values': { - const l = new JList(this.id()) - l.items = [...m.entries.values()].map((e) => (name === 'keySet' ? e[0] : e[1])) - return l - } - case 'toString': - return yield* this.str(m) - } - throw new MiniJavaError('unsupported', `HashMap.${name}()`, pos) - } - - private *nativeMethod(n: JNative, name: string, a: Val[], pos: Pos): G { - if (n.kind === 'out' || n.kind === 'err') { - const err = n.kind === 'err' - if (name === 'println') this.io.out(`${a.length ? yield* this.str(a[0]) : ''}\n`, err) - else if (name === 'print') this.io.out(yield* this.str(a[0]), err) - else if (name === 'printf' || name === 'format') this.io.out(yield* this.format(String(a[0]), a.slice(1)), err) - else if (name === 'flush') return undefined - else throw new MiniJavaError('unsupported', `System.out.${name}()`, pos) - return undefined - } - if (n.kind === 'Scanner') return yield* this.scan(name, pos) - if (n.kind === 'Random') { - if (name === 'nextInt') { - if (!a.length) return (Math.random() * 4294967296 - 2147483648) | 0 - const lo = a.length > 1 ? num(a[0]) : 0 - const hi = a.length > 1 ? num(a[1]) : num(a[0]) - if (hi <= lo) this.fail('IllegalArgumentException', 'bound must be positive') - return lo + Math.floor(Math.random() * (hi - lo)) - } - if (name === 'nextDouble') return new JDouble(Math.random()) - if (name === 'nextBoolean') return Math.random() < 0.5 - } - if (n.kind === 'StringBuilder') { - switch (name) { - case 'append': - n.buf += yield* this.str(a[0]) - return n - case 'toString': - return n.buf - case 'length': - return n.buf.length - case 'reverse': - n.buf = [...n.buf].reverse().join('') - return n - case 'charAt': - return new JChar(n.buf.charCodeAt(num(a[0]))) - case 'insert': - n.buf = n.buf.slice(0, num(a[0])) + (yield* this.str(a[1])) + n.buf.slice(num(a[0])) - return n - case 'setLength': - n.buf = n.buf.slice(0, num(a[0])) - return undefined - case 'deleteCharAt': - n.buf = n.buf.slice(0, num(a[0])) + n.buf.slice(num(a[0]) + 1) - return n - } - } - if (name === 'close') return undefined - throw new MiniJavaError('unsupported', `${n.kind}.${name}()`, pos) - } - - /** Scanner wie in Java: Wörter aus dem Puffer, `nextLine` liest bis zum Zeilenende (auch das leere Rest-Ende nach `nextInt`). */ - private *scan(name: string, pos: Pos): G { - const sc = this.stdin - const more = function* (): G { - const line = yield { k: 'input' } - if (line === null || line === undefined) return false - sc.buf += `${line}\n` - return true - } - const token = function* (self: MiniJava, consume: boolean): G { - for (;;) { - const m = /^\s*(\S+)/.exec(sc.buf) - if (m && (m[0].length < sc.buf.length || sc.buf.endsWith('\n'))) { - if (consume) sc.buf = sc.buf.slice(m[0].length) - return m[1] - } - if (!(yield* more())) return undefined - void self - } - } - switch (name) { - case 'nextLine': { - if (!sc.buf.includes('\n') && !(yield* more())) this.fail('NoSuchElementException', 'No line found') - const i = sc.buf.indexOf('\n') - const line = sc.buf.slice(0, i) - sc.buf = sc.buf.slice(i + 1) - return line - } - case 'next': - case 'nextInt': - case 'nextLong': - case 'nextDouble': - case 'nextBoolean': { - const t = yield* token(this, false) - if (t === undefined) this.fail('NoSuchElementException') - let v: Val - if (name === 'next') v = t - else if (name === 'nextInt' || name === 'nextLong') v = /^[+-]?\d+$/.test(t) ? parseInt(t, 10) : undefined - else if (name === 'nextDouble') v = /^[+-]?(\d+([.,]\d*)?|[.,]\d+)$/.test(t) ? new JDouble(parseFloat(t.replace(',', '.'))) : undefined - else v = /^(true|false)$/i.test(t) ? t.toLowerCase() === 'true' : undefined - if (v === undefined) this.fail('InputMismatchException', `For input string: "${t}"`) - yield* token(this, true) - return v - } - case 'hasNext': - case 'hasNextInt': - case 'hasNextDouble': - case 'hasNextLine': { - if (name === 'hasNextLine') return sc.buf.includes('\n') || (yield* more()) - const t = yield* token(this, false) - if (t === undefined) return false - if (name === 'hasNextInt') return /^[+-]?\d+$/.test(t) - if (name === 'hasNextDouble') return /^[+-]?(\d+([.,]\d*)?|[.,]\d+)$/.test(t) - return true - } - case 'close': - return undefined - } - throw new MiniJavaError('unsupported', `Scanner.${name}()`, pos) - } - - /** `printf` / `String.format`: %d %s %f %.2f %c %b %n %x %e %% mit Breite und `-`/`0`. */ - private *format(fmt: string, args: Val[]): G { - let i = 0 - let out = '' - const re = /%([-#+ 0,(]*)(\d+)?(?:\.(\d+))?([a-zA-Z%])/g - let last = 0 - for (let m = re.exec(fmt); m; m = re.exec(fmt)) { - out += fmt.slice(last, m.index) - last = re.lastIndex - const [, flags, width, prec, conv] = m - let s: string - if (conv === 'n') s = '\n' - else if (conv === '%') s = '%' - else { - if (i >= args.length) this.fail('IllegalArgumentException', `Format specifier '${m[0]}'`) - const v = args[i++] - switch (conv.toLowerCase()) { - case 'd': - if (v instanceof JDouble) this.fail('IllegalArgumentException', `d != java.lang.Double`) - s = String(Math.trunc(num(v))) - if (flags.includes(',')) s = s.replace(/\B(?=(\d{3})+(?!\d))/g, '.') - break - case 'f': - s = num(v).toFixed(prec ? Number(prec) : 6) - if (flags.includes(',')) { - const [int, frac] = s.split('.') - s = int.replace(/\B(?=(\d{3})+(?!\d))/g, '.') + (frac ? `,${frac}` : '') - } else s = s.replace('.', ',') - break - case 'e': - s = num(v) - .toExponential(prec ? Number(prec) : 6) - .replace('.', ',') - break - case 'x': - s = (num(v) >>> 0).toString(16) - break - case 'c': - s = v instanceof JChar ? String.fromCharCode(v.code) : String.fromCharCode(num(v)) - break - case 'b': - s = String(v !== null && v !== false) - break - default: - s = yield* this.str(v) - if (prec) s = s.slice(0, Number(prec)) - } - if (flags.includes('+') && /^\d/.test(s) && /[df]/i.test(conv)) s = `+${s}` - if (conv === conv.toUpperCase() && conv !== '%') s = s.toUpperCase() - } - if (width && s.length < Number(width)) { - const pad = Number(width) - s.length - s = flags.includes('-') ? s + ' '.repeat(pad) : flags.includes('0') ? s.replace(/^([+-]?)/, `$1${'0'.repeat(pad)}`) : ' '.repeat(pad) + s - } - out += s - } - return out + fmt.slice(last) - } - - private *sorted(items: Val[]): G { - const out = [...items] - for (let i = 1; i < out.length; i++) for (let j = i; j > 0 && (yield* this.compare(out[j - 1], out[j])) > 0; j--) [out[j - 1], out[j]] = [out[j], out[j - 1]] - return out - } - - private *compare(a: Val, b: Val): G { - if (isNum(a) && isNum(b)) return num(a) - num(b) - if (typeof a === 'string' && typeof b === 'string') return a < b ? -1 : a > b ? 1 : 0 - if (a instanceof JObject) { - const own = this.findMethod(a.cls, 'compareTo', [b]) - if (own) return num(yield* this.invoke(own.m, own.owner, a, [b])) - if (a.native.ordinal !== undefined && b instanceof JObject) return a.native.ordinal - (b.native.ordinal ?? 0) - } - this.fail('ClassCastException', 'not Comparable') - } - - private *staticBuiltin(cls: string, name: string, a: Val[], pos: Pos): G { - const x = num(a[0]) - const dbl = (v: number) => new JDouble(v) - switch (`${cls}.${name}`) { - case 'Math.abs': - return a[0] instanceof JDouble ? dbl(Math.abs(x)) : Math.abs(x) - case 'Math.max': - case 'Math.min': { - const r = name === 'max' ? Math.max(x, num(a[1])) : Math.min(x, num(a[1])) - return a[0] instanceof JDouble || a[1] instanceof JDouble ? dbl(r) : r - } - case 'Math.pow': - return dbl(Math.pow(x, num(a[1]))) - case 'Math.sqrt': - return dbl(Math.sqrt(x)) - case 'Math.cbrt': - return dbl(Math.cbrt(x)) - case 'Math.random': - return dbl(Math.random()) - case 'Math.round': - return Math.floor(x + 0.5) - case 'Math.floor': - return dbl(Math.floor(x)) - case 'Math.ceil': - return dbl(Math.ceil(x)) - case 'Math.sin': - case 'Math.cos': - case 'Math.tan': - case 'Math.log': - case 'Math.log10': - case 'Math.exp': - return dbl((Math as unknown as Record number>)[name](x)) - case 'Math.toRadians': - return dbl((x * Math.PI) / 180) - case 'Math.toDegrees': - return dbl((x * 180) / Math.PI) - case 'Math.floorMod': - return ((x % num(a[1])) + num(a[1])) % num(a[1]) - case 'Integer.parseInt': - case 'Integer.valueOf': - case 'Long.parseLong': { - if (typeof a[0] === 'number') return a[0] - const s = String(a[0]) - if (!/^[+-]?\d+$/.test(s)) this.fail('NumberFormatException', `For input string: "${s}"`) - return parseInt(s, 10) - } - case 'Double.parseDouble': - case 'Double.valueOf': { - if (isNum(a[0])) return dbl(x) - const s = String(a[0]).trim() - if (!/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?[dDfF]?$/.test(s)) this.fail('NumberFormatException', `For input string: "${s}"`) - return dbl(parseFloat(s)) - } - case 'Boolean.parseBoolean': - return String(a[0]).toLowerCase() === 'true' - case 'Integer.toString': - case 'Double.toString': - case 'String.valueOf': - case 'Objects.toString': - if (a[0] instanceof JArray && a[0].elem.name === 'char') return a[0].items.map((c) => String.fromCharCode(num(c))).join('') - return yield* this.str(a[0]) - case 'Integer.compare': - case 'Double.compare': - return Math.sign(x - num(a[1])) - case 'Integer.toBinaryString': - return (x >>> 0).toString(2) - case 'Integer.toHexString': - return (x >>> 0).toString(16) - case 'Integer.sum': - return (x + num(a[1])) | 0 - case 'Objects.equals': - return a[0] === null ? a[1] === null : yield* this.equalsVal(a[0], a[1]) - case 'String.format': - return yield* this.format(String(a[0]), a.slice(1)) - case 'String.join': { - const parts: string[] = [] - const items = a[1] instanceof JList || a[1] instanceof JArray ? a[1].items : a.slice(1) - for (const p of items) parts.push(yield* this.str(p)) - return parts.join(String(a[0])) - } - case 'Character.isDigit': - return /\p{Nd}/u.test(String.fromCharCode(x)) - case 'Character.isLetter': - return /\p{L}/u.test(String.fromCharCode(x)) - case 'Character.isLetterOrDigit': - return /[\p{L}\p{Nd}]/u.test(String.fromCharCode(x)) - case 'Character.isUpperCase': - return /\p{Lu}/u.test(String.fromCharCode(x)) - case 'Character.isLowerCase': - return /\p{Ll}/u.test(String.fromCharCode(x)) - case 'Character.isWhitespace': - return /\s/.test(String.fromCharCode(x)) - case 'Character.toUpperCase': - return new JChar(String.fromCharCode(x).toUpperCase().charCodeAt(0)) - case 'Character.toLowerCase': - return new JChar(String.fromCharCode(x).toLowerCase().charCodeAt(0)) - case 'Character.getNumericValue': - return parseInt(String.fromCharCode(x), 36) - case 'Arrays.toString': { - if (a[0] === null) return 'null' - const arr = a[0] as JArray - const parts: string[] = [] - for (const v of arr.items) parts.push(yield* this.str(v)) - return `[${parts.join(', ')}]` - } - case 'Arrays.sort': - case 'Collections.sort': { - const arr = a[0] as JArray | JList - arr.items = yield* this.sorted(arr.items) - return undefined - } - case 'Arrays.fill': - ;(a[0] as JArray).items.fill(castTo(a[1], (a[0] as JArray).elem)) - return undefined - case 'Arrays.asList': - case 'List.of': { - const l = new JList(this.id()) - l.items = a.length === 1 && a[0] instanceof JArray ? [...a[0].items] : a - return l - } - case 'Collections.reverse': - ;(a[0] as JList).items.reverse() - return undefined - case 'Collections.shuffle': - ;(a[0] as JList).items.sort(() => Math.random() - 0.5) - return undefined - case 'Collections.max': - case 'Collections.min': { - const items = (a[0] as JList).items - if (!items.length) this.fail('NoSuchElementException') - const s = yield* this.sorted(items) - return name === 'max' ? s[s.length - 1] : s[0] - } - case 'Thread.sleep': - yield { k: 'sleep', ms: x } - return undefined - case 'System.currentTimeMillis': - return Date.now() - case 'System.nanoTime': - return Math.round(performance.now() * 1e6) - case 'System.exit': - throw new ProgramExit() - } - throw new MiniJavaError('unsupported', `${cls}.${name}()`, pos) - } -} - -/** `System.exit` beendet das Programm still. */ -class ProgramExit extends Error {} - -function isMain(m: MethodDecl) { - return m.name === 'main' && m.isStatic && m.params.length === 1 && m.params[0].type.name === 'String' && m.params[0].type.dims === 1 -} - -/** `System.exit`: der Lauf endet wie ein normales Ende. */ -export function isProgramExit(err: unknown) { - return err instanceof ProgramExit -} diff --git a/web/src/core/miniJavaParser.ts b/web/src/core/miniJavaParser.ts deleted file mode 100644 index f7d61bd3..00000000 --- a/web/src/core/miniJavaParser.ts +++ /dev/null @@ -1,798 +0,0 @@ -/** - * VisuObject-Debugger: Parser für das Java, das in der FOS 12 vorkommt (Klassen, Objekte, Vererbung, - * Arrays, ArrayList, Schleifen, Exceptions). Kein vollständiges Java: Generics werden gelesen und - * übergangen, Lambdas, innere Klassen und Annotationen außer `@Override` gibt es nicht. - * Jeder Knoten kennt seine Datei und Zeile (ab 0), damit der Debugger die Zeile gelb markieren kann. - */ - -import { similarType } from './typeTypos' - -export interface Pos { - file: string - line: number -} - -export type TypeRef = { name: string; dims: number; args: TypeRef[] } - -export type Expr = ( - | { k: 'lit'; value: { t: 'int' | 'double' | 'char' | 'string' | 'bool' | 'null'; v: number | string | boolean | null } } - | { k: 'name'; name: string } - | { k: 'this' } - | { k: 'super' } - | { k: 'field'; target: Expr; name: string } - | { k: 'call'; target?: Expr; name: string; args: Expr[]; isSuper?: boolean } - | { k: 'new'; type: TypeRef; args: Expr[] } - | { k: 'newArray'; type: TypeRef; sizes: Expr[]; init?: Expr } - | { k: 'arrayInit'; items: Expr[] } - | { k: 'index'; target: Expr; index: Expr } - | { k: 'unary'; op: string; expr: Expr } - | { k: 'incdec'; op: '++' | '--'; prefix: boolean; target: Expr } - | { k: 'binary'; op: string; left: Expr; right: Expr } - | { k: 'assign'; op: string; target: Expr; value: Expr } - | { k: 'cond'; test: Expr; then: Expr; else: Expr } - | { k: 'cast'; type: TypeRef; expr: Expr } - | { k: 'instanceof'; expr: Expr; type: TypeRef } -) & - Pos - -export type Stmt = ( - | { k: 'block'; body: Stmt[] } - | { k: 'local'; type: TypeRef; vars: { name: string; dims: number; init?: Expr }[] } - | { k: 'expr'; expr: Expr } - | { k: 'if'; test: Expr; then: Stmt; else?: Stmt } - | { k: 'while'; test: Expr; body: Stmt } - | { k: 'do'; body: Stmt; test: Expr } - | { k: 'for'; init: Stmt[]; test?: Expr; update: Expr[]; body: Stmt } - | { k: 'foreach'; type: TypeRef; name: string; iter: Expr; body: Stmt } - | { k: 'switch'; expr: Expr; cases: { labels: Expr[] | 'default'; body: Stmt[]; arrow: boolean }[] } - | { k: 'break' } - | { k: 'continue' } - | { k: 'return'; value?: Expr } - | { k: 'throw'; value: Expr } - | { k: 'try'; body: Stmt; catches: { types: TypeRef[]; name: string; body: Stmt }[]; finally?: Stmt } - | { k: 'ctorCall'; isSuper: boolean; args: Expr[] } - | { k: 'empty' } -) & - Pos - -export interface FieldDecl extends Pos { - name: string - type: TypeRef - isStatic: boolean - init?: Expr -} - -export interface MethodDecl extends Pos { - name: string - /** Leer beim Konstruktor. */ - returns?: TypeRef - params: { name: string; type: TypeRef }[] - isStatic: boolean - isAbstract: boolean - isConstructor: boolean - body?: Stmt & { k: 'block' } - /** Zeile der schließenden Klammer (für den letzten Schritt einer Methode). */ - endLine: number -} - -export interface ClassDecl extends Pos { - name: string - kind: 'class' | 'interface' | 'enum' - superclass?: string - interfaces: string[] - isAbstract: boolean - fields: FieldDecl[] - methods: MethodDecl[] - enumConstants: string[] -} - -export class JavaSyntaxError extends Error { - constructor( - message: string, - readonly pos: Pos, - ) { - super(message) - } -} - -// MARK: - Zerlegen in Wörter - -interface Tok { - t: 'id' | 'num' | 'str' | 'char' | 'op' | 'eof' - v: string - line: number -} - -const ops = ['>>>=', '<<=', '>>=', '>>>', '...', '->', '::', '++', '--', '&&', '||', '==', '!=', '<=', '>=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<'] - -function tokenize(src: string, file: string): Tok[] { - const out: Tok[] = [] - let i = 0 - let line = 0 - while (i < src.length) { - const c = src[i] - if (c === '\n') { - line++ - i++ - } else if (/\s/.test(c)) i++ - else if (src.startsWith('//', i)) { - while (i < src.length && src[i] !== '\n') i++ - } else if (src.startsWith('/*', i)) { - const end = src.indexOf('*/', i + 2) - const stop = end < 0 ? src.length : end + 2 - for (let j = i; j < stop; j++) if (src[j] === '\n') line++ - i = stop - } else if (/[\p{L}_$]/u.test(c)) { - let j = i + 1 - while (j < src.length && /[\p{L}\p{N}_$]/u.test(src[j])) j++ - out.push({ t: 'id', v: src.slice(i, j), line }) - i = j - } else if (/[0-9]/.test(c) || (c === '.' && /[0-9]/.test(src[i + 1] ?? ''))) { - const m = /^(0[xX][0-9a-fA-F_]+[lL]?|[0-9][0-9_]*(\.[0-9_]*)?([eE][+-]?[0-9]+)?[fFdDlL]?|\.[0-9]+([eE][+-]?[0-9]+)?[fFdD]?)/.exec(src.slice(i))! - out.push({ t: 'num', v: m[0], line }) - i += m[0].length - } else if (c === '"' || c === "'") { - let j = i + 1 - let text = '' - while (j < src.length && src[j] !== c) { - if (src[j] === '\n') throw new JavaSyntaxError(c === '"' ? 'string' : 'char', { file, line }) - if (src[j] === '\\') { - const n = src[j + 1] - text += n === 'n' ? '\n' : n === 't' ? '\t' : n === 'r' ? '\r' : n === '0' ? '\0' : n === 'u' ? String.fromCharCode(parseInt(src.slice(j + 2, j + 6), 16)) : n - j += n === 'u' ? 6 : 2 - } else text += src[j++] - } - if (j >= src.length) throw new JavaSyntaxError(c === '"' ? 'string' : 'char', { file, line }) - out.push({ t: c === '"' ? 'str' : 'char', v: text, line }) - i = j + 1 - } else { - const op = ops.find((o) => src.startsWith(o, i)) ?? c - out.push({ t: 'op', v: op, line }) - i += op.length - } - } - out.push({ t: 'eof', v: '', line }) - return out -} - -// MARK: - Parser - -const modifiers = new Set(['public', 'private', 'protected', 'static', 'final', 'abstract', 'synchronized', 'transient', 'volatile', 'native', 'strictfp', 'default']) -const primitives = new Set(['int', 'long', 'short', 'byte', 'double', 'float', 'boolean', 'char', 'void', 'var']) - -class Parser { - private i = 0 - constructor( - private toks: Tok[], - private file: string, - ) {} - - private get tok() { - return this.toks[this.i] - } - private peek(n = 1) { - return this.toks[Math.min(this.i + n, this.toks.length - 1)] - } - private pos(tok = this.tok): Pos { - return { file: this.file, line: tok.line } - } - private is(v: string, tok = this.tok) { - return (tok.t === 'op' || tok.t === 'id') && tok.v === v - } - private eat(v: string) { - if (this.is(v)) { - this.i++ - return true - } - return false - } - private expect(v: string) { - if (!this.eat(v)) this.fail(`expected:${v}`) - } - private fail(what: string): never { - throw new JavaSyntaxError(what, this.pos()) - } - private ident(): string { - if (this.tok.t !== 'id') this.fail('identifier') - return this.toks[this.i++].v - } - - unit(): ClassDecl[] { - const out: ClassDecl[] = [] - if (this.eat('package')) this.skipTo(';') - while (this.is('import')) this.skipTo(';') - while (this.tok.t !== 'eof') { - if (this.eat(';')) continue - out.push(this.classDecl()) - } - return out - } - - private skipTo(v: string) { - while (this.tok.t !== 'eof' && !this.is(v)) this.i++ - this.expect(v) - } - - private mods(): Set { - const out = new Set() - for (;;) { - if (this.tok.t === 'op' && this.tok.v === '@') { - this.i++ - this.ident() - if (this.is('(')) this.skipParens() - } else if (this.tok.t === 'id' && modifiers.has(this.tok.v) && !(this.tok.v === 'default' && this.is(':', this.peek()))) out.add(this.toks[this.i++].v) - else return out - } - } - - private skipParens() { - let depth = 0 - do { - if (this.is('(')) depth++ - else if (this.is(')')) depth-- - this.i++ - } while (depth > 0 && this.tok.t !== 'eof') - } - - private classDecl(): ClassDecl { - const mods = this.mods() - const pos = this.pos() - const kind = this.eat('class') ? 'class' : this.eat('interface') ? 'interface' : this.eat('enum') ? 'enum' : this.fail('class') - const name = this.ident() - if (this.is('<')) this.typeArgs() - const decl: ClassDecl = { ...pos, name, kind, interfaces: [], isAbstract: mods.has('abstract') || kind === 'interface', fields: [], methods: [], enumConstants: [] } - if (this.eat('extends')) { - const list = [this.type().name] - while (this.eat(',')) list.push(this.type().name) - if (kind === 'interface') decl.interfaces = list - else decl.superclass = list[0] - } - if (this.eat('implements')) { - decl.interfaces.push(this.type().name) - while (this.eat(',')) decl.interfaces.push(this.type().name) - } - this.expect('{') - if (kind === 'enum') { - while (this.tok.t === 'id') { - decl.enumConstants.push(this.ident()) - if (this.is('(')) this.skipParens() - if (!this.eat(',')) break - } - this.eat(';') - } - while (!this.eat('}')) { - if (this.tok.t === 'eof') this.fail('expected:}') - if (this.eat(';')) continue - this.member(decl) - } - return decl - } - - private member(cls: ClassDecl) { - const start = this.tok - const mods = this.mods() - if (this.is('class') || this.is('interface') || this.is('enum')) this.fail('innerClass') - if (this.is('{')) { - // Initialisierungsblock: wie ein Konstruktor-Vorspann nicht unterstützt. - this.fail('initializer') - } - if (this.is('<')) this.typeArgs() - const pos = this.pos(start) - // Konstruktor: Name der Klasse direkt vor `(`. - if (this.tok.t === 'id' && this.tok.v === cls.name && this.is('(', this.peek())) { - this.i++ - const params = this.params() - if (this.eat('throws')) this.skipThrows() - const body = this.block() - cls.methods.push({ ...pos, name: cls.name, params, isStatic: false, isAbstract: false, isConstructor: true, body, endLine: this.toks[this.i - 1].line }) - return - } - const type = this.type() - const name = this.ident() - if (this.is('(')) { - const params = this.params() - while (this.eat('[')) this.expect(']') - if (this.eat('throws')) this.skipThrows() - const isAbstract = mods.has('abstract') || (cls.kind === 'interface' && !this.is('{')) - const body = this.is('{') ? this.block() : (this.expect(';'), undefined) - cls.methods.push({ ...pos, name, returns: type, params, isStatic: mods.has('static'), isAbstract, isConstructor: false, body, endLine: this.toks[this.i - 1].line }) - return - } - // Attribute, auch `int a, b = 2;` - let first = true - let varName = name - for (;;) { - if (!first) varName = this.ident() - first = false - let dims = 0 - while (this.eat('[')) { - this.expect(']') - dims++ - } - const t = dims ? { ...type, dims: type.dims + dims } : type - const init = this.eat('=') ? (this.is('{') ? this.arrayInit() : this.expr()) : undefined - cls.fields.push({ ...pos, name: varName, type: t, isStatic: mods.has('static') || cls.kind === 'interface', init }) - if (!this.eat(',')) break - } - this.expect(';') - } - - private skipThrows() { - this.type() - while (this.eat(',')) this.type() - } - - private params() { - this.expect('(') - const out: { name: string; type: TypeRef }[] = [] - if (!this.eat(')')) { - do { - this.mods() - let type = this.type() - if (this.eat('...')) type = { ...type, dims: type.dims + 1 } - const name = this.ident() - while (this.eat('[')) { - this.expect(']') - type = { ...type, dims: type.dims + 1 } - } - out.push({ name, type }) - } while (this.eat(',')) - this.expect(')') - } - return out - } - - private typeArgs(): TypeRef[] { - this.expect('<') - const out: TypeRef[] = [] - if (this.eat('>')) return out - do { - if (this.eat('?')) { - if (this.eat('extends') || this.eat('super')) out.push(this.type()) - else out.push({ name: 'Object', dims: 0, args: [] }) - } else out.push(this.type()) - } while (this.eat(',')) - // `>>` am Ende verschachtelter Generics: das zweite `>` bleibt stehen. - if (this.is('>>')) this.toks[this.i] = { ...this.tok, v: '>' } - else if (this.is('>>>')) this.toks[this.i] = { ...this.tok, v: '>>' } - else this.expect('>') - return out - } - - type(): TypeRef { - let name = this.ident() - let args: TypeRef[] = [] - if (this.is('<')) args = this.typeArgs() - while (this.is('.') && this.peek().t === 'id') { - this.i++ - name = this.ident() - if (this.is('<')) args = this.typeArgs() - } - let dims = 0 - while (this.is('[') && this.is(']', this.peek())) { - this.i += 2 - dims++ - } - return { name, dims, args } - } - - /** Steht hier eine Deklaration `Typ name`? (ohne etwas zu verbrauchen) */ - private looksLikeDecl(): boolean { - const save = this.i - try { - this.mods() - if (this.tok.t !== 'id') return false - const first = this.tok.v - if (['return', 'new', 'throw', 'this', 'super', 'true', 'false', 'null'].includes(first)) return false - this.type() - return this.tok.t === 'id' && (this.is('=', this.peek()) || this.is(';', this.peek()) || this.is(',', this.peek()) || this.is(':', this.peek()) || this.is('[', this.peek())) - } catch { - return false - } finally { - this.i = save - } - } - - block(): Stmt & { k: 'block' } { - const pos = this.pos() - this.expect('{') - const body: Stmt[] = [] - while (!this.eat('}')) { - if (this.tok.t === 'eof') this.fail('expected:}') - body.push(this.stmt()) - } - return { ...pos, k: 'block', body } - } - - private localDecl(): Stmt { - const pos = this.pos() - this.mods() - const type = this.type() - const vars: { name: string; dims: number; init?: Expr }[] = [] - do { - const name = this.ident() - let dims = 0 - while (this.eat('[')) { - this.expect(']') - dims++ - } - const init = this.eat('=') ? (this.is('{') ? this.arrayInit() : this.expr()) : undefined - vars.push({ name, dims, init }) - } while (this.eat(',')) - return { ...pos, k: 'local', type, vars } - } - - stmt(): Stmt { - const pos = this.pos() - const v = this.tok.t === 'id' || this.tok.t === 'op' ? this.tok.v : '' - if (v === '{') return this.block() - if (this.eat(';')) return { ...pos, k: 'empty' } - if (this.eat('if')) { - this.expect('(') - const test = this.expr() - this.expect(')') - const then = this.stmt() - return { ...pos, k: 'if', test, then, else: this.eat('else') ? this.stmt() : undefined } - } - if (this.eat('while')) { - this.expect('(') - const test = this.expr() - this.expect(')') - return { ...pos, k: 'while', test, body: this.stmt() } - } - if (this.eat('do')) { - const body = this.stmt() - this.expect('while') - this.expect('(') - const test = this.expr() - this.expect(')') - this.expect(';') - return { ...pos, k: 'do', body, test } - } - if (this.eat('for')) { - this.expect('(') - // for (Typ x : liste) - const save = this.i - try { - this.mods() - const type = this.type() - const name = this.ident() - if (this.eat(':')) { - const iter = this.expr() - this.expect(')') - return { ...pos, k: 'foreach', type, name, iter, body: this.stmt() } - } - } catch { - /* keine for-each-Schleife */ - } - this.i = save - const init: Stmt[] = [] - if (!this.is(';')) { - if (this.looksLikeDecl()) init.push(this.localDecl()) - else - do { - const p = this.pos() - init.push({ ...p, k: 'expr', expr: this.expr() }) - } while (this.eat(',')) - } - this.expect(';') - const test = this.is(';') ? undefined : this.expr() - this.expect(';') - const update: Expr[] = [] - if (!this.is(')')) - do update.push(this.expr()) - while (this.eat(',')) - this.expect(')') - return { ...pos, k: 'for', init, test, update, body: this.stmt() } - } - if (this.eat('switch')) { - this.expect('(') - const expr = this.expr() - this.expect(')') - this.expect('{') - const cases: { labels: Expr[] | 'default'; body: Stmt[]; arrow: boolean }[] = [] - while (!this.eat('}')) { - let labels: Expr[] | 'default' - if (this.eat('default')) labels = 'default' - else { - this.expect('case') - labels = [this.expr()] - while (this.eat(',')) labels.push(this.expr()) - } - if (this.eat('->')) { - const body = this.is('{') ? [this.block()] : [this.stmt()] - cases.push({ labels, body, arrow: true }) - continue - } - this.expect(':') - const body: Stmt[] = [] - while (!this.is('case') && !this.is('default') && !this.is('}')) body.push(this.stmt()) - cases.push({ labels, body, arrow: false }) - } - return { ...pos, k: 'switch', expr, cases } - } - if (this.eat('break')) { - if (this.tok.t === 'id') this.i++ - this.expect(';') - return { ...pos, k: 'break' } - } - if (this.eat('continue')) { - if (this.tok.t === 'id') this.i++ - this.expect(';') - return { ...pos, k: 'continue' } - } - if (this.eat('return')) { - const value = this.is(';') ? undefined : this.expr() - this.expect(';') - return { ...pos, k: 'return', value } - } - if (this.eat('throw')) { - const value = this.expr() - this.expect(';') - return { ...pos, k: 'throw', value } - } - if (this.eat('try')) { - if (this.is('(')) this.fail('tryResources') - const body = this.block() - const catches: { types: TypeRef[]; name: string; body: Stmt }[] = [] - while (this.eat('catch')) { - this.expect('(') - this.mods() - const types = [this.type()] - while (this.eat('|')) types.push(this.type()) - const name = this.ident() - this.expect(')') - catches.push({ types, name, body: this.block() }) - } - const fin = this.eat('finally') ? this.block() : undefined - return { ...pos, k: 'try', body, catches, finally: fin } - } - if ((v === 'this' || v === 'super') && this.is('(', this.peek())) { - this.i++ - const args = this.args() - this.expect(';') - return { ...pos, k: 'ctorCall', isSuper: v === 'super', args } - } - if (v === 'class' || v === 'interface') this.fail('innerClass') - if (this.looksLikeDecl()) { - const decl = this.localDecl() - this.expect(';') - return decl - } - const expr = this.expr() - this.expect(';') - return { ...pos, k: 'expr', expr } - } - - private args(): Expr[] { - this.expect('(') - const out: Expr[] = [] - if (!this.eat(')')) { - do out.push(this.expr()) - while (this.eat(',')) - this.expect(')') - } - return out - } - - private arrayInit(): Expr { - const pos = this.pos() - this.expect('{') - const items: Expr[] = [] - while (!this.eat('}')) { - items.push(this.is('{') ? this.arrayInit() : this.expr()) - if (!this.eat(',')) { - this.expect('}') - break - } - } - return { ...pos, k: 'arrayInit', items } - } - - expr(): Expr { - return this.assign() - } - - private assign(): Expr { - const left = this.cond() - const op = this.tok.v - if (this.tok.t === 'op' && ['=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=', '>>=', '>>>='].includes(op)) { - const pos = this.pos() - this.i++ - if (left.k !== 'name' && left.k !== 'field' && left.k !== 'index') this.fail('assignTarget') - return { ...pos, k: 'assign', op, target: left, value: this.assign() } - } - return left - } - - private cond(): Expr { - const test = this.binary(0) - if (this.is('?')) { - const pos = this.pos() - this.i++ - const then = this.assign() - this.expect(':') - return { ...pos, k: 'cond', test, then, else: this.assign() } - } - return test - } - - private static levels: string[][] = [['||'], ['&&'], ['|'], ['^'], ['&'], ['==', '!='], ['<', '>', '<=', '>=', 'instanceof'], ['<<', '>>', '>>>'], ['+', '-'], ['*', '/', '%']] - - private binary(level: number): Expr { - if (level >= Parser.levels.length) return this.unary() - let left = this.binary(level + 1) - for (;;) { - const op = this.tok.v - if (!(this.tok.t === 'op' || op === 'instanceof') || !Parser.levels[level].includes(op)) return left - const pos = this.pos() - this.i++ - if (op === 'instanceof') { - left = { ...pos, k: 'instanceof', expr: left, type: this.type() } - if (this.tok.t === 'id') this.i++ // Pattern `instanceof Hund h` wird nicht gebunden - continue - } - left = { ...pos, k: 'binary', op, left, right: this.binary(level + 1) } - } - } - - private unary(): Expr { - const pos = this.pos() - if (this.is('++') || this.is('--')) { - const op = this.toks[this.i++].v as '++' | '--' - return { ...pos, k: 'incdec', op, prefix: true, target: this.unary() } - } - if (this.is('!') || this.is('-') || this.is('+') || this.is('~')) { - const op = this.toks[this.i++].v - return { ...pos, k: 'unary', op, expr: this.unary() } - } - // Cast: `(int) x`, `(Hund) tier` - if (this.is('(') && this.peek().t === 'id') { - const save = this.i - this.i++ - try { - const type = this.type() - if (this.eat(')')) { - const primitive = primitives.has(type.name) - const next = this.tok - const castable = primitive - ? !(next.t === 'op' && ['+', '-', '*', '/', ')', ';', ',', '.', '==', '<', '>'].includes(next.v) && !['(', '-', '+', '!', '~'].includes(next.v)) || - next.t !== 'op' || - ['(', '-', '!', '~'].includes(next.v) - : next.t !== 'op' || next.v === '(' - if (castable && (primitive || /^[A-Z]/.test(type.name))) return { ...pos, k: 'cast', type, expr: this.unary() } - } - } catch { - /* kein Cast */ - } - this.i = save - } - return this.postfix(this.primary()) - } - - private postfix(e: Expr): Expr { - for (;;) { - const pos = this.pos() - if (this.eat('.')) { - if (this.eat('new')) this.fail('innerClass') - const name = this.ident() - if (this.is('(')) e = { ...pos, k: 'call', target: e, name, args: this.args(), isSuper: e.k === 'super' } - else e = { ...pos, k: 'field', target: e, name } - } else if (this.is('[')) { - this.i++ - const index = this.expr() - this.expect(']') - e = { ...pos, k: 'index', target: e, index } - } else if (this.is('++') || this.is('--')) { - const op = this.toks[this.i++].v as '++' | '--' - e = { ...pos, k: 'incdec', op, prefix: false, target: e } - } else if (this.is('::') || this.is('->')) this.fail('lambda') - else return e - } - } - - private primary(): Expr { - const tok = this.tok - const pos = this.pos() - if (tok.t === 'num') { - this.i++ - const text = tok.v.replace(/_/g, '') - if (/^0[xX]/.test(text)) return { ...pos, k: 'lit', value: { t: 'int', v: parseInt(text.replace(/[lL]$/, ''), 16) } } - if (/[.eEfFdD]/.test(text) && !/^0[xX]/.test(text)) return { ...pos, k: 'lit', value: { t: 'double', v: parseFloat(text.replace(/[fFdD]$/, '')) } } - return { ...pos, k: 'lit', value: { t: 'int', v: parseInt(text.replace(/[lL]$/, ''), 10) } } - } - if (tok.t === 'str') { - this.i++ - return { ...pos, k: 'lit', value: { t: 'string', v: tok.v } } - } - if (tok.t === 'char') { - this.i++ - return { ...pos, k: 'lit', value: { t: 'char', v: tok.v.charCodeAt(0) || 0 } } - } - if (this.eat('(')) { - const e = this.expr() - this.expect(')') - return e - } - if (tok.t !== 'id') this.fail('expression') - if (this.eat('true')) return { ...pos, k: 'lit', value: { t: 'bool', v: true } } - if (this.eat('false')) return { ...pos, k: 'lit', value: { t: 'bool', v: false } } - if (this.eat('null')) return { ...pos, k: 'lit', value: { t: 'null', v: null } } - if (this.eat('this')) return { ...pos, k: 'this' } - if (this.eat('super')) return { ...pos, k: 'super' } - if (this.eat('new')) { - const name = this.ident() - let args: TypeRef[] = [] - if (this.is('<')) args = this.typeArgs() - const type: TypeRef = { name, dims: 0, args } - if (this.is('[')) { - const sizes: Expr[] = [] - let dims = 0 - while (this.eat('[')) { - if (this.eat(']')) { - dims++ - continue - } - sizes.push(this.expr()) - this.expect(']') - dims++ - } - const init = this.is('{') ? this.arrayInit() : undefined - return { ...pos, k: 'newArray', type: { ...type, dims }, sizes, init } - } - const a = this.args() - if (this.is('{')) this.fail('anonymousClass') - return { ...pos, k: 'new', type, args: a } - } - const name = this.ident() - if (this.is('(')) return { ...pos, k: 'call', name, args: this.args() } - return { ...pos, k: 'name', name } - } -} - -const javaUtil = ['Scanner', 'Random', 'ArrayList', 'List', 'LinkedList', 'HashMap', 'Map', 'TreeMap', 'LinkedHashMap', 'Collection', 'Collections', 'Arrays', 'Iterator', 'Objects'] - -/** - * Wie javac: `Scanner`, `ArrayList` usw. ohne `import java.util.Scanner;` (oder `java.util.*`) sind unbekannt. - * `own`: Klassen aus dem Projekt, die so heißen dürfen. Ergebnis: die fehlende Zeile und wo die Klasse zuerst vorkommt. - */ -export function missingImport(source: string, file: string, own: Set): { line: string; pos: Pos } | undefined { - const toks = tokenize(source, file) - const imports: string[] = [] - for (let k = 0; k < toks.length; k++) { - if (toks[k].v !== 'import' || toks[k].t !== 'id') continue - let end = k + 1 - while (end < toks.length && toks[end].v !== ';' && toks[end].t !== 'eof') end++ - imports.push(toks.slice(k + 1, end).map((t) => t.v).join('')) - k = end - } - for (let k = 0; k < toks.length; k++) { - const t = toks[k] - if (t.t !== 'id' || !javaUtil.includes(t.v) || own.has(t.v) || toks[k - 1]?.v === '.' || toks[k - 1]?.v === 'import') continue - if (imports.includes(`java.util.${t.v}`) || imports.includes('java.util.*')) continue - return { line: `import java.util.${t.v};`, pos: { file, line: t.line } } - } - return undefined -} - -/** - * Wie javac: `booelan fertig;` oder `Int x = 3;` ist kein Datentyp. Nur ein Wort am Anfang einer Anweisung, auf das ein Name - * und `=`, `;` oder `,` folgen, und nur wenn es einem Grundtyp sehr ähnlich ist. Ergebnis: die richtige Schreibweise und die Stelle. - */ -export function misspelledType(source: string, file: string, own: Set): { type: string; pos: Pos } | undefined { - const toks = tokenize(source, file) - const starts = new Set([';', '{', '}', '(', ',', 'public', 'private', 'protected', 'static', 'final']) - for (let k = 0; k < toks.length - 2; k++) { - const [type, name, after] = toks.slice(k, k + 3) - if (type.t !== 'id' || name.t !== 'id' || !['=', ';', ','].includes(after.v) || own.has(type.v)) continue - if (k > 0 && !starts.has(toks[k - 1].v)) continue - const suggestion = similarType(type.v) - if (suggestion) return { type: suggestion, pos: { file, line: type.line } } - } - return undefined -} - -/** Eine Datei lesen; Fehler als `JavaSyntaxError` mit Zeile. */ -export function parseJava(source: string, file: string): ClassDecl[] { - return new Parser(tokenize(source, file), file).unit() -} diff --git a/web/src/core/model.ts b/web/src/core/model.ts deleted file mode 100644 index f10a0a87..00000000 --- a/web/src/core/model.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** Abbild von `VisuStructElement.swift` / Java-Typnummern in `Struktogramm`. */ -export enum ElementType { - anweisung = 0, - verzweigung = 1, - fallauswahl = 2, - forSchleife = 3, - whileSchleife = 4, - doUntilSchleife = 5, - endlosschleife = 6, - aussprung = 7, - aufruf = 8, - leerElement = 9, -} - -export interface RGBA { - r: number - g: number - b: number - a: number -} - -/** Ein `` inkl. Unterstrukturen (Schleifenrumpf bzw. Fälle). */ -export interface VSElement { - type: ElementType - /** Java `xVergroesserung`/`yVergroesserung` (`zx`/`zy`). */ - zoomX: number - zoomY: number - textColor?: RGBA - backgroundColor?: RGBA - /** ``-Kinder, jede Zeile einzeln. */ - textLines: string[] - /** Nur bei Schleifen gesetzt. */ - loopBody?: VSElement[] - /** Nur bei Verzweigung/Fallauswahl gesetzt. Letzter Fall ist i. d. R. „default“. */ - cases?: VSCase[] -} - -export interface VSCase { - name: string - elements: VSElement[] -} - -/** Root-Tag ``. */ -export interface VSDocument { - fontFamily?: string - fontSize?: number - fontStyle?: number - caption: string - /** Als Pseudocode markiert: Der erzeugte Code ist nur eine Skizze, kein lauffähiges Programm. */ - pseudocode?: boolean - elements: VSElement[] -} - -export function isLoop(t: ElementType): boolean { - return ( - t === ElementType.forSchleife || - t === ElementType.whileSchleife || - t === ElementType.doUntilSchleife || - t === ElementType.endlosschleife - ) -} - -export function isMultiway(t: ElementType): boolean { - return t === ElementType.verzweigung || t === ElementType.fallauswahl -} - -export function makeElement(type: ElementType, init: Partial = {}): VSElement { - return { type, zoomX: 0, zoomY: 0, textLines: [''], ...init } -} diff --git a/web/src/core/objectModel.ts b/web/src/core/objectModel.ts deleted file mode 100644 index c712ec46..00000000 --- a/web/src/core/objectModel.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * VisuObject: Objektdiagramm. Ein Objekt hat die Attribute seiner Klasse (samt Oberklassen, ohne static); - * ein Referenzattribut zeigt mit dem Namen eines anderen Objekts auf dieses (`team = t1`, `spieler = [s1, s2]`). - */ - -import { associationTarget, type UmlClass } from './classModel' - -export interface ObjectField { - name: string - type: string - /** Klasse, auf die ein Referenzattribut zeigt. */ - target?: string - /** Liste oder Array von Referenzen. */ - many: boolean -} - -/** Attribute eines Objekts der Klasse `cls`, Oberklassen zuerst (wie in Java im Speicher). */ -export function objectFields(classes: UmlClass[], cls: string): ObjectField[] { - const byName = new Map(classes.map((c) => [c.name, c])) - const chain: UmlClass[] = [] - const seen = new Set() - for (let c = byName.get(cls); c && !seen.has(c.name); c = c.superclass ? byName.get(c.superclass) : undefined) { - seen.add(c.name) - chain.unshift(c) - } - const out: ObjectField[] = [] - for (const c of chain) - for (const m of c.members) { - if (m.kind !== 'field' || m.isStatic || out.some((f) => f.name === m.name)) continue - const t = associationTarget(m.type) - out.push({ name: m.name, type: m.type, many: t.many, ...(byName.has(t.name) ? { target: t.name } : {}) }) - } - return out -} - -/** Startwert wie in Java, wenn ein Objekt neu entsteht. */ -export function javaDefault(type: string): string { - if (/^(int|long|short|byte)$/.test(type)) return '0' - if (/^(double|float)$/.test(type)) return '0.0' - if (type === 'boolean') return 'false' - if (type === 'char') return "''" - return 'null' -} - -/** Namen der Objekte, auf die ein Wert zeigt: `t1` oder `[s1, s2]`; `null` und leer = keine. */ -export function refNames(value: string | undefined): string[] { - const v = (value ?? '').trim() - if (!v || v === 'null') return [] - const inner = /^\[(.*)\]$/s.exec(v)?.[1] ?? v - return inner - .split(',') - .map((s) => s.trim()) - .filter((s) => /^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(s) && s !== 'null') -} - -/** Neuer Wert nach dem Verbinden: Einzelreferenz ersetzt, Liste hängt an (ohne doppelt). */ -export function linkedValue(field: ObjectField, value: string | undefined, target: string): string { - if (!field.many) return target - const names = refNames(value) - return `[${(names.includes(target) ? names : [...names, target]).join(', ')}]` -} - -/** Ist `cls` die Klasse `target` oder erbt davon (bzw. implementiert es)? */ -export function isA(classes: UmlClass[], cls: string, target: string): boolean { - const byName = new Map(classes.map((c) => [c.name, c])) - const seen = new Set() - const walk = (name: string | undefined): boolean => { - if (!name || seen.has(name)) return false - if (name === target) return true - seen.add(name) - const c = byName.get(name) - return !!c && (walk(c.superclass) || c.interfaces.some(walk)) - } - return walk(cls) -} - -/** Freier Name wie in Java üblich: `spieler1`, `spieler2` … */ -export function freeObjectName(cls: string, taken: string[]): string { - const base = cls.charAt(0).toLowerCase() + cls.slice(1) - for (let n = 1; ; n++) if (!taken.includes(`${base}${n}`)) return `${base}${n}` -} diff --git a/web/src/core/ownTypes.ts b/web/src/core/ownTypes.ts deleted file mode 100644 index 4677a424..00000000 --- a/web/src/core/ownTypes.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * VisuObject: Vorschläge nach dem Punkt für die eigenen Klassen des Projekts. - * `Spieler s1 = new Spieler(); s1.` → Methoden und Attribute von Spieler (samt Oberklassen), - * aber nur, was von der Stelle aus sichtbar ist: public überall, Package nur im selben Package, - * protected im selben Package oder in Unterklassen, private nur in der Klasse selbst. - */ - -import type { UmlMember } from './classModel' -import { membersOf, type JavaMember, type MemberLanguage, type OwnTypes } from './javaMembers' - -export interface TypeInfo { - name: string - pkg: string - superclass?: string - interfaces: string[] - members: UmlMember[] -} - -export interface Place { - /** Klasse, in der der Cursor steht. */ - cls?: string - pkg: string -} - -function toJavaMember(m: UmlMember): JavaMember { - return { - name: m.name, - kind: m.kind === 'field' ? 'field' : 'method', - params: m.params.length > 0, - returns: m.type, - description: m.kind === 'field' ? '' : m.params.map((p) => `${p.name}: ${p.type}`).join(', '), - } -} - -export function ownTypes(classes: TypeInfo[], here: Place, lang: MemberLanguage = 'de'): OwnTypes { - const byName = new Map(classes.map((c) => [c.name, c])) - const isSubclass = (sub: string | undefined, sup: string) => { - const seen = new Set() - for (let c = sub ? byName.get(sub) : undefined; c && !seen.has(c.name); c = c.superclass ? byName.get(c.superclass) : undefined) { - if (c.name === sup) return true - seen.add(c.name) - } - return false - } - /** `inherited`: Mitglied einer Oberklasse; private wird nicht vererbt (`h.name` geht auch in Tier nicht, wenn h ein Hund ist). */ - const visible = (m: UmlMember, owner: TypeInfo, inherited: boolean) => { - if (m.visibility === '+') return true - if (m.visibility === '-') return !inherited && here.cls === owner.name - if (owner.pkg === here.pkg) return true - return m.visibility === '#' && isSubclass(here.cls, owner.name) - } - /** Eigene Klasse, dann Oberklassen und Interfaces; eine Oberklasse wie JFrame aus der Liste der Standardklassen. */ - const collect = (type: string, isStatic: boolean): JavaMember[] | undefined => { - const start = byName.get(type) - if (!start) return undefined - const out: JavaMember[] = [] - const seen = new Set() - const keys = new Set() - const visit = (name: string, inherited: boolean) => { - if (seen.has(name)) return - seen.add(name) - const c = byName.get(name) - if (!c) { - if (!isStatic) for (const m of membersOf(name, lang)) if (!keys.has(m.name)) (keys.add(m.name), out.push(m)) - return - } - for (const m of c.members) { - if (m.kind === 'constructor' || m.isStatic !== isStatic || !visible(m, c, inherited)) continue - // Überschriebene Methoden nur einmal (die der Unterklasse). - const key = `${m.kind}:${m.name}:${m.params.map((p) => p.type).join(',')}` - if (keys.has(key)) continue - keys.add(key) - out.push(toJavaMember(m)) - } - if (c.superclass) visit(c.superclass, true) - for (const i of c.interfaces) visit(i, true) - } - visit(type, false) - return out - } - return { members: (type) => collect(type, false), statics: (type) => collect(type, true), thisType: here.cls } -} diff --git a/web/src/core/palette.ts b/web/src/core/palette.ts deleted file mode 100644 index 89fe8d68..00000000 --- a/web/src/core/palette.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { placeholderElement } from './editing' -import { ElementType, makeElement, type VSElement } from './model' - -/** Wie `ElementPalette.swift`: neue Elemente aus der Palette. */ -export type PaletteItem = - | 'anweisung' - | 'verzweigung' - | 'whileSchleife' - | 'doUntilSchleife' - | 'forZaehlSchleife' - | 'fallauswahl' - | 'endlosschleife' - | 'aussprung' - | 'aufruf' - -/** Beschriftungen aus `de.lproj/Localizable.strings` (`element_*`). */ -export const paletteItems: { item: PaletteItem; label: string }[] = [ - { item: 'anweisung', label: 'Anweisung' }, - { item: 'verzweigung', label: 'Verzweigung' }, - { item: 'fallauswahl', label: 'Fallauswahl' }, - { item: 'forZaehlSchleife', label: 'For-Schleife' }, - { item: 'whileSchleife', label: 'While-Schleife' }, - { item: 'doUntilSchleife', label: 'Do-while-Schleife' }, - { item: 'endlosschleife', label: 'Endlosschleife' }, - { item: 'aufruf', label: 'Aufruf' }, - { item: 'aussprung', label: 'Aussprung' }, -] - -export function paletteElement(item: PaletteItem): VSElement { - const stub = placeholderElement - switch (item) { - case 'anweisung': - return makeElement(ElementType.anweisung) - case 'verzweigung': - return makeElement(ElementType.verzweigung, { - cases: [ - { name: 'true', elements: [stub()] }, - { name: 'false', elements: [stub()] }, - ], - }) - case 'fallauswahl': - return makeElement(ElementType.fallauswahl, { - cases: [ - { name: '1', elements: [stub()] }, - { name: '2', elements: [stub()] }, - { name: 'default', elements: [stub()] }, - ], - }) - case 'forZaehlSchleife': - return makeElement(ElementType.forSchleife, { textLines: ['', '', ''], loopBody: [stub()] }) - case 'whileSchleife': - return makeElement(ElementType.whileSchleife, { loopBody: [stub()] }) - case 'doUntilSchleife': - return makeElement(ElementType.doUntilSchleife, { loopBody: [stub()] }) - case 'endlosschleife': - return makeElement(ElementType.endlosschleife, { loopBody: [stub()] }) - case 'aussprung': - return makeElement(ElementType.aussprung) - case 'aufruf': - return makeElement(ElementType.aufruf) - } -} diff --git a/web/src/core/rename.ts b/web/src/core/rename.ts deleted file mode 100644 index c9b0adc7..00000000 --- a/web/src/core/rename.ts +++ /dev/null @@ -1,172 +0,0 @@ -import type { VSDocument, VSElement } from './model' - -/** - * Umbenennen (Refactoring): eine Variable an allen Stellen umbenennen, im Java-Code und im Struktogramm. - * Genau dieselbe Schreibweise (`zahl` ≠ `Zahl`), nur ganze Wörter; Text in "…"/'…' und Kommentare bleiben. - */ - -export const javaKeywords = new Set( - ( - 'abstract assert boolean break byte case catch char class const continue default do double else enum extends final ' + - 'finally float for goto if implements import instanceof int interface long native new package private protected public ' + - 'return short static strictfp super switch synchronized this throw throws transient try void volatile while ' + - 'true false null var record yield' - ).split(' '), -) - -const wordChar = /[\p{L}\p{N}_$]/u -const wordStart = /[\p{L}_$]/u - -export interface Word { - from: number - to: number - name: string -} - -/** Alle Wörter im Code außerhalb von Zeichenketten, Zeichen und Kommentaren. */ -export function codeWords(text: string): Word[] { - const words: Word[] = [] - let i = 0 - while (i < text.length) { - const c = text[i] - if (c === '/' && text[i + 1] === '/') { - while (i < text.length && text[i] !== '\n') i++ - } else if (c === '/' && text[i + 1] === '*') { - const end = text.indexOf('*/', i + 2) - i = end < 0 ? text.length : end + 2 - } else if (c === '"' || c === "'") { - i++ - while (i < text.length && text[i] !== c && text[i] !== '\n') i += text[i] === '\\' ? 2 : 1 - i++ - } else if (wordStart.test(c)) { - const from = i - while (i < text.length && wordChar.test(text[i])) i++ - words.push({ from, to: i, name: text.slice(from, i) }) - } else if (/\d/.test(c)) { - // Zahlen wie 1e5 oder 10L gehören nicht zu einem Namen. - while (i < text.length && wordChar.test(text[i])) i++ - } else i++ - } - return words -} - -/** Stellen, an denen die Variable `name` vorkommt (nicht hinter einem Punkt: `feld.length` ist keine Variable `length`). */ -export function nameRanges(text: string, name: string): Word[] { - return codeWords(text).filter((w) => w.name === name && !afterDot(text, w.from)) -} - -function afterDot(text: string, from: number): boolean { - let i = from - 1 - while (i >= 0 && (text[i] === ' ' || text[i] === '\t')) i-- - return text[i] === '.' -} - -/** Wort unter dem Cursor (auch direkt dahinter), wenn es ein umbenennbarer Name ist. */ -export function nameAt(text: string, pos: number): Word | undefined { - const w = codeWords(text).find((w) => pos >= w.from && pos <= w.to) - if (!w || javaKeywords.has(w.name) || afterDot(text, w.from)) return undefined - return w -} - -/** Text mit umbenannter Variable und Anzahl der geänderten Stellen. */ -export function renameInText(text: string, from: string, to: string): { text: string; count: number } { - const ranges = nameRanges(text, from) - let out = '' - let last = 0 - for (const r of ranges) { - out += text.slice(last, r.from) + to - last = r.to - } - return { text: out + text.slice(last), count: ranges.length } -} - -/** Alle Texte des Struktogramms (Kopfzeile, Elemente, Fallnamen). */ -function documentTexts(doc: VSDocument): string[] { - const texts = [doc.caption] - const walk = (elements: VSElement[]) => { - for (const el of elements) { - texts.push(el.textLines.join('\n')) - if (el.loopBody) walk(el.loopBody) - for (const c of el.cases ?? []) { - texts.push(c.name) - walk(c.elements) - } - } - } - walk(doc.elements) - return texts -} - -export function renameInDocument(doc: VSDocument, from: string, to: string): { doc: VSDocument; count: number } { - let count = 0 - const rename = (s: string) => { - const r = renameInText(s, from, to) - count += r.count - return r.text - } - const walk = (elements: VSElement[]): VSElement[] => - elements.map((el) => ({ - ...el, - textLines: rename(el.textLines.join('\n')).split('\n'), - ...(el.loopBody ? { loopBody: walk(el.loopBody) } : {}), - ...(el.cases ? { cases: el.cases.map((c) => ({ name: rename(c.name), elements: walk(c.elements) })) } : {}), - })) - const next = { ...doc, caption: rename(doc.caption), elements: walk(doc.elements) } - return { doc: next, count } -} - -/** - * Namen, die wie Variablen aussehen: keine Schlüsselwörter, keine Methoden `name(`, keine Klassen - * (`Scanner sc`, `Math.max`) und nichts hinter einem Punkt. Reihenfolge wie im Text. - */ -export function variableNames(texts: string[]): string[] { - const names = new Set() - const skip = new Set() - const declared = new Set() - for (const text of texts) { - const words = codeWords(text).filter((w) => !afterDot(text, w.from)) - words.forEach((w, i) => { - // „ø“ = leere Anweisung im Struktogramm, kein Name. - if (javaKeywords.has(w.name) || w.name === 'ø') return - const rest = text.slice(w.to) - const next = words[i + 1] - const between = next ? text.slice(w.to, next.from) : '' - // `Scanner sc`, `String[] namen`: das erste Wort ist ein Typ, das zweite die Variable. - const isType = next !== undefined && !javaKeywords.has(next.name) && /^(?:\s*\[\s*\])*[ \t]+$/.test(between) - if (isType && /^\s*(?:[=;,):]|$)/.test(text.slice(next.to))) declared.add(next.name) - const isClass = /^\p{Lu}/u.test(w.name) && /^\s*\./.test(rest) - if (/^\s*\(/.test(rest) || isClass || isType) skip.add(w.name) - else names.add(w.name) - }) - } - return [...names].filter((n) => !skip.has(n) || declared.has(n)) -} - -/** Alle Wörter im Struktogramm, auch Methoden und Klassen: Der neue Name soll keinen davon treffen. */ -export function documentWords(doc: VSDocument): string[] { - return documentTexts(doc).flatMap((t) => codeWords(t).map((w) => w.name)) -} - -export function countInDocument(doc: VSDocument, name: string): number { - return documentTexts(doc).reduce((n, t) => n + nameRanges(t, name).length, 0) -} - -export function documentVariableNames(doc: VSDocument): string[] { - return variableNames(documentTexts(doc)) -} - -export function elementVariableNames(el: VSElement): string[] { - return variableNames([el.textLines.join('\n')]) -} - -export type RenameCheck = { ok: true; warning?: 'exists' } | { ok: false; reason: 'empty' | 'same' | 'invalid' | 'keyword' } - -/** Neuen Namen prüfen; `existing` = Namen, die schon vorkommen. */ -export function checkNewName(from: string, to: string, existing: Iterable): RenameCheck { - if (to === '') return { ok: false, reason: 'empty' } - if (to === from) return { ok: false, reason: 'same' } - if (!/^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(to)) return { ok: false, reason: 'invalid' } - if (javaKeywords.has(to)) return { ok: false, reason: 'keyword' } - for (const n of existing) if (n === to) return { ok: true, warning: 'exists' } - return { ok: true } -} diff --git a/web/src/core/robotPreview.ts b/web/src/core/robotPreview.ts deleted file mode 100644 index a3d87292..00000000 --- a/web/src/core/robotPreview.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { VSDocument } from './model' -import type { MBotSensorValues } from './mbot' -import { ROBOT_STEP_MS, RobotWorld, type Point, type Pose, type RobotWorldSetup } from './robotWorld' -import { SimulationEngine, type SimNotice, type SubprogramResolver } from './simulation' - -/** Ein Bild der Fahrt: wo der mBot2 steht, seine Spur, LEDs und Bildschirm, dazu ein Ton in diesem Schritt. */ -export interface PreviewFrame { - pose: Pose - trail: Point[] - leds: RobotWorld['leds'] - screen: string | undefined - tone?: [number, number] -} - -export interface PreviewResult { - frames: PreviewFrame[] - /** Warum die Vorschau aufhört: Ende, Eingabe nötig, Fehler oder zu viele Schritte (Endlosschleife?). */ - stop: 'end' | 'input' | 'error' | 'limit' - notice?: SimNotice - bumps: number - /** Strecke der Spur in cm. */ - distance: number -} - -export const maxPreviewSteps = 5000 - -/** - * mBot2-Vorschau beim Bearbeiten: das Programm im Hintergrund ganz durchrechnen, wie in der Simulation - * (die Welt liefert die Sensorwerte), und jedes Bild der Fahrt merken. - */ -export function previewRun(doc: VSDocument, subprograms: SubprogramResolver | undefined, setup: RobotWorldSetup, controls: MBotSensorValues = {}): PreviewResult { - const engine = new SimulationEngine(doc, subprograms) - const robot = new RobotWorld(setup) - const frame = (tone?: [number, number]): PreviewFrame => ({ - pose: { ...robot.pose }, - trail: robot.trail.map((p) => ({ ...p })), - leds: [...robot.leds], - screen: robot.screen, - tone, - }) - const frames: PreviewFrame[] = [frame()] - let applied = 0 - const result = (stop: PreviewResult['stop'], notice?: SimNotice): PreviewResult => ({ - frames, - stop, - notice, - bumps: robot.bumps, - distance: Math.round(robot.trail.slice(1).reduce((sum, p, i) => sum + Math.hypot(p.x - robot.trail[i].x, p.y - robot.trail[i].y), 0)), - }) - for (let i = 0; i < maxPreviewSteps; i++) { - const { state } = engine - if (state.inputRequest) return result('input') - if (state.isHalted) return result('error', state.notice) - if (!engine.canStep) return result('end') - engine.robotSensors = { ...controls, ...robot.sensors() } - engine.step() - // jeder neue Befehl ist ein Bild; mit `mbot.drive` fährt er auch ohne Befehl weiter - for (; applied < state.robotActions.length; applied++) { - const action = state.robotActions[applied] - robot.apply(action) - frames.push(frame(action.method === 'playTone' ? [action.args[0], action.args[1]] : undefined)) - } - const moving = robot.wheels.some((p) => p !== 0) - robot.tick(ROBOT_STEP_MS) - if (moving) frames.push(frame()) - } - return result('limit') -} diff --git a/web/src/core/robotWorld.ts b/web/src/core/robotWorld.ts deleted file mode 100644 index d90471a4..00000000 --- a/web/src/core/robotWorld.ts +++ /dev/null @@ -1,352 +0,0 @@ -import { MBOT_LED_COLORS, MBOT_LED_COUNT, type MBotAction, type MBotColor, type MBotSensorValue } from './mbot' - -/** - * Die Welt des VisuBot-Simulators von oben: Boden in Zentimetern, x nach rechts, y nach vorn (weg vom Betrachter). - * Blickrichtung in Grad, 0 = nach vorn, positiv im Uhrzeigersinn (wie `mbot2.turn`). - * Abstand und Liniensensor rechnen hier, damit Programme ohne echten Roboter dieselben Werte sehen. - */ - -export interface Point { - x: number - y: number -} - -export interface Pose extends Point { - heading: number -} - -export interface Wall { - from: Point - to: Point -} - -export interface RobotWorldSetup { - /** Breite und Tiefe des Bodens in cm; die Mitte ist (0, 0). */ - width: number - depth: number - start: Pose - walls: Wall[] - /** Schwarze Klebeband-Linien (je ein Linienzug). */ - lines: Point[][] - /** Wandklötze von 10 × 10 cm (Mitte) aus einer Weltkarte, wie die Bäume bei Kara. */ - blocks?: Point[] - /** Schwarze Felder von 10 × 10 cm (Mitte); der Liniensensor sieht sie. */ - marks?: Point[] - /** Zielfelder von 10 × 10 cm (Mitte); sie sind ebenfalls schwarz. */ - goals?: Point[] - /** Haltefelder von 10 × 10 cm (Mitte): Ziel, das der Liniensensor nicht sieht; die Radachse muss darauf stehen. */ - targets?: Point[] - /** Farbige Felder von 10 × 10 cm (Mitte); der Farbsensor erkennt sie, der Liniensensor nicht. */ - colors?: { at: Point; color: MBotColor }[] -} - -/** Größe eines Feldes in einer Weltkarte (cm). */ -export const CELL = 10 - -/** - * Weltkarte als Text, ein Zeichen = 10 cm, oben ist hinten (weg vom Betrachter): - * `#` Wand, `=` schwarzes Feld, `Z` Ziel (auch schwarz), `o` Haltefeld (unsichtbares Ziel), - * `r g b y` rotes, grünes, blaues, gelbes Feld, - * `^ > v <` Start mit Blickrichtung, sonst freier Boden. - * Zeilen mit `//` am Anfang sind Kommentare. Um die Karte kommt automatisch der Rahmen. - * Eine Zeile `linie: 2,8 2,2 7,2` legt eine schwarze Klebeband-Linie durch die Mitten dieser Felder (Spalte,Zeile ab 0, Kommazahlen erlaubt). - * Eine Zeile `raster: 3` vorweg macht aus jedem Zeichen 3 × 3 Felder (30 cm wie ein Kara-Feld, so breit wie der mBot2); - * der Start liegt dann in der Mitte seines großen Feldes. - */ -export function parseWorldMap(text: string): RobotWorldSetup { - let rows = text.replace(/\r/g, '').split('\n').filter((l) => !l.startsWith('//')) - const lineSpecs = rows.filter((l) => /^linie:/.test(l)).map((l) => l.slice(6).trim()) - rows = rows.filter((l) => !/^linie:/.test(l)) - const rasterLine = rows.findIndex((l) => /^raster:\s*\d+\s*$/.test(l)) - if (rasterLine >= 0) { - const n = Number(rows[rasterLine].split(':')[1]) - rows.splice(rasterLine, 1) - rows = rows.flatMap((row) => - Array.from({ length: n }, (_, i) => - Array.from(row) - .map((ch) => Array.from({ length: n }, (_, j) => ('^>v<'.includes(ch) ? (i === (n >> 1) && j === (n >> 1) ? ch : '.') : ch)).join('')) - .join(''), - ), - ) - } - while (rows.length && rows[rows.length - 1].trim() === '') rows.pop() - while (rows.length && rows[0].trim() === '') rows.shift() - const cols = Math.max(...rows.map((r) => r.length)) - const width = cols * CELL - const depth = rows.length * CELL - const center = (c: number, r: number): Point => ({ x: -width / 2 + (c + 0.5) * CELL, y: depth / 2 - (r + 0.5) * CELL }) - const setup: RobotWorldSetup = { width, depth, start: { x: 0, y: 0, heading: 0 }, walls: [], lines: [], blocks: [], marks: [], goals: [], targets: [], colors: [] } - let starts = 0 - rows.forEach((row, r) => { - Array.from(row).forEach((ch, c) => { - const p = center(c, r) - if (ch === '#') setup.blocks!.push(p) - else if (ch === '=') setup.marks!.push(p) - else if (ch === 'Z') setup.goals!.push(p) - else if (ch === 'o') setup.targets!.push(p) - else if (ch in FIELD_COLORS) setup.colors!.push({ at: p, color: FIELD_COLORS[ch] }) - else if ('^>v<'.includes(ch)) { - starts++ - setup.start = { ...p, heading: { '^': 0, '>': 90, v: 180, '<': 270 }[ch]! } - } - }) - }) - for (const spec of lineSpecs) { - setup.lines.push( - spec.split(/\s+/).map((pair) => { - const [c, r] = pair.split(',').map(Number) - if (!Number.isFinite(c) || !Number.isFinite(r)) throw new Error(`Linie: „${pair}“ ist kein Feld (Spalte,Zeile).`) - return center(c, r) - }), - ) - } - if (starts !== 1) throw new Error(`Die Weltkarte braucht genau einen Start (^ > v <), gefunden: ${starts}`) - return setup -} - -const FIELD_COLORS: Record = { r: 'red', g: 'green', b: 'blue', y: 'yellow' } - -const inCell = (p: Point, cell: Point) => Math.abs(p.x - cell.x) <= CELL / 2 && Math.abs(p.y - cell.y) <= CELL / 2 - -/** Abstand von der Radachse bis vorn (Sensoren, Ohren): so weit vorher hält der mBot2 vor einer Wand. Die Lage (x, y) ist die Mitte der Radachse. */ -export const ROBOT_RADIUS = 10 -/** Ultraschall sitzt vorn, so weit vor der Mitte. */ -const SONAR_OFFSET = 9 -/** Ultraschall misst höchstens so weit (mbuild ultrasonic2: 300 cm). */ -export const SONAR_MAX = 300 -/** Liniensensor: Abstand vor der Mitte und seitliche Lage der vier Fühler (L2, L1, R1, R2). */ -const LINE_OFFSET = 8 -const LINE_PROBES = [-3.6, -1.2, 1.2, 3.6] -export const LINE_WIDTH = 2.5 -/** `mbot.drive(100, 100)` fährt so viele cm pro Sekunde (im Simulator). */ -export const MAX_SPEED = 20 -/** Abstand der beiden Räder in cm (zum Drehen mit `mbot.drive`). */ -const WHEEL_BASE = 12 -/** So viel Zeit vergeht im Simulator bei jedem Schritt des Programms (ms). */ -export const ROBOT_STEP_MS = 100 - -export const emptyWorld: RobotWorldSetup = { width: 200, depth: 200, start: { x: 0, y: 0, heading: 0 }, walls: [], lines: [] } - -const rad = (deg: number) => (deg * Math.PI) / 180 -const forwardOf = (heading: number): Point => ({ x: Math.sin(rad(heading)), y: Math.cos(rad(heading)) }) - -export type RGB = [number, number, number] -const ledsOff = (): (RGB | undefined)[] => Array.from({ length: MBOT_LED_COUNT }, () => undefined) -/** Farbe einer LED; (0, 0, 0) ist aus. */ -const lit = ([r, g, b]: number[]): RGB | undefined => (r > 0 || g > 0 || b > 0 ? [r, g, b] : undefined) - -export class RobotWorld { - pose: Pose - /** Gefahrene Strecke (Stift unten), beginnt an der Startposition. */ - trail: Point[] - /** Wie oft der Roboter an eine Wand oder den Rand gestoßen ist. */ - bumps = 0 - /** Farben der fünf LEDs (Nummer 1 bis 5); `undefined` = aus. */ - leds: (RGB | undefined)[] = ledsOff() - /** Text auf dem Bildschirm des CyberPi (`mbot.showText`). */ - screen: string | undefined - /** Leistung der Räder in Prozent (`mbot.drive`); der Roboter fährt damit in `tick` weiter. */ - wheels: [number, number] = [0, 0] - /** Zeit seit dem Start in ms und Stand beim letzten `resetTimer()` */ - time = 0 - private timerStart = 0 - /** Steht er gerade an einer Wand an (zählt `bumps` nur einmal pro Anstoßen)? */ - private blocked = false - - constructor(readonly setup: RobotWorldSetup = emptyWorld) { - this.pose = { ...setup.start } - this.trail = [{ x: setup.start.x, y: setup.start.y }] - } - - reset() { - this.pose = { ...this.setup.start } - this.trail = [{ x: this.pose.x, y: this.pose.y }] - this.bumps = 0 - this.leds = ledsOff() - this.screen = undefined - this.wheels = [0, 0] - this.time = 0 - this.timerStart = 0 - this.blocked = false - } - - /** Alle Wände einschließlich Rand des Bodens. */ - get allWalls(): Wall[] { - const w = this.setup.width / 2 - const d = this.setup.depth / 2 - const c = [{ x: -w, y: -d }, { x: w, y: -d }, { x: w, y: d }, { x: -w, y: d }] - return [...this.setup.walls, ...c.map((from, i) => ({ from, to: c[(i + 1) % 4] })), ...this.blockWalls] - } - - /** Kanten der Wandklötze (einmal berechnet). */ - private get blockWalls(): Wall[] { - this.blockWallCache ??= (this.setup.blocks ?? []).flatMap((b) => { - const h = CELL / 2 - const c = [{ x: b.x - h, y: b.y - h }, { x: b.x + h, y: b.y - h }, { x: b.x + h, y: b.y + h }, { x: b.x - h, y: b.y + h }] - return c.map((from, i) => ({ from, to: c[(i + 1) % 4] })) - }) - return this.blockWallCache - } - - private blockWallCache?: Wall[] - - /** Ist der Roboter im Ziel? Ja, wenn seine Mitte oder sein Liniensensor über einem Zielfeld ist oder seine Mitte auf einem Haltefeld. */ - atGoal(): boolean { - const dir = forwardOf(this.pose.heading) - const probe = { x: this.pose.x + dir.x * LINE_OFFSET, y: this.pose.y + dir.y * LINE_OFFSET } - return (this.setup.goals ?? []).some((g) => inCell(this.pose, g) || inCell(probe, g)) || (this.setup.targets ?? []).some((t) => inCell(this.pose, t)) - } - - apply(action: MBotAction) { - switch (action.method) { - case 'forward': this.wheels = [0, 0]; return this.drive(action.args[0]) - case 'backward': this.wheels = [0, 0]; return this.drive(-action.args[0]) - case 'turnRight': this.wheels = [0, 0]; return this.turn(action.args[0]) - case 'turnLeft': this.wheels = [0, 0]; return this.turn(-action.args[0]) - case 'stop': this.wheels = [0, 0]; return - case 'drive': this.wheels = [clampPower(action.args[0]), clampPower(action.args[1])]; return - case 'pause': return this.tick(action.args[0]) - case 'resetTimer': this.timerStart = this.time; return - case 'setLed': this.leds = ledsOff().map(() => lit(action.args)); return - case 'ledOff': this.leds = ledsOff(); return - case 'ledColor': this.leds[action.args[0]] = lit(MBOT_LED_COLORS[action.text ?? ''] ?? [0, 0, 0]); return - case 'showText': this.screen = action.text; return - } - } - - /** - * Zeit vergeht: Mit `mbot.drive` gestartete Räder bewegen den Roboter weiter (Kurve, wenn sie verschieden schnell sind). - * Vor einer Wand bleibt er stehen und zählt einmal als angestoßen. - */ - tick(ms: number) { - if (ms <= 0) return - this.time += ms - const [l, r] = this.wheels.map((p) => (p / 100) * MAX_SPEED) - if (l === 0 && r === 0) return - const parts = Math.ceil(ms / 10) - const dt = ms / 1000 / parts - let moved = false - for (let i = 0; i < parts; i++) { - const v = ((l + r) / 2) * dt - // rechts schneller → Linkskurve, also kleinerer Kurs - this.pose = { ...this.pose, heading: normalizeHeading(this.pose.heading - (((r - l) / WHEEL_BASE) * dt * 180) / Math.PI) } - if (Math.abs(v) < 1e-9) continue - const dir = forwardOf(this.pose.heading) - const sign = Math.sign(v) - const free = this.freeDistance(this.pose, { x: dir.x * sign, y: dir.y * sign }) - ROBOT_RADIUS - const step = Math.min(Math.abs(v), Math.max(0, free)) - if (step < Math.abs(v) - 1e-9) { - if (!this.blocked) this.bumps += 1 - this.blocked = true - } else this.blocked = false - this.pose = { ...this.pose, x: this.pose.x + dir.x * sign * step, y: this.pose.y + dir.y * sign * step } - moved = true - } - if (moved) this.trail.push({ x: this.pose.x, y: this.pose.y }) - } - - /** Stoppuhr in Sekunden (eine Nachkommastelle), wie `cyberpi.timer.get()` */ - get timer(): number { - return Math.round((this.time - this.timerStart) / 100) / 10 - } - - turn(degrees: number) { - this.pose = { ...this.pose, heading: normalizeHeading(this.pose.heading + degrees) } - } - - /** Fährt `cm` weit (negativ = rückwärts) und hält vor einer Wand an. */ - drive(cm: number) { - const dir = forwardOf(this.pose.heading) - const sign = Math.sign(cm) - const dirMoving = { x: dir.x * sign, y: dir.y * sign } - const free = this.freeDistance(this.pose, dirMoving) - const distance = Math.min(Math.abs(cm), Math.max(0, free - ROBOT_RADIUS)) - if (distance < Math.abs(cm) - 1e-9) this.bumps += 1 - this.pose = { ...this.pose, x: this.pose.x + dirMoving.x * distance, y: this.pose.y + dirMoving.y * distance } - this.trail.push({ x: this.pose.x, y: this.pose.y }) - } - - /** Abstand des Ultraschallsensors bis zur nächsten Wand in cm (wie der echte Sensor ganzzahlig). */ - distance(): number { - const dir = forwardOf(this.pose.heading) - const origin = { x: this.pose.x + dir.x * SONAR_OFFSET, y: this.pose.y + dir.y * SONAR_OFFSET } - return Math.min(SONAR_MAX, Math.round(this.freeDistance(origin, dir))) - } - - /** Liniensensor wie `get_line_sta`: Bit 3 = ganz links … Bit 0 = ganz rechts; 0 = keine Linie, 15 = alle vier. */ - lineState(): number { - const dir = forwardOf(this.pose.heading) - const right = { x: dir.y, y: -dir.x } - let bits = 0 - LINE_PROBES.forEach((side, i) => { - const p = { - x: this.pose.x + dir.x * LINE_OFFSET + right.x * side, - y: this.pose.y + dir.y * LINE_OFFSET + right.y * side, - } - const dark = [...(this.setup.marks ?? []), ...(this.setup.goals ?? [])].some((cell) => inCell(p, cell)) - if (dark || this.setup.lines.some((line) => distanceToPolyline(p, line) <= LINE_WIDTH / 2)) bits |= 1 << (3 - i) - }) - return bits - } - - /** Farbe unter dem Liniensensor (Mitte vorn); `undefined` auf hellem oder schwarzem Boden. */ - colorUnder(): MBotColor | undefined { - const dir = forwardOf(this.pose.heading) - const probe = { x: this.pose.x + dir.x * LINE_OFFSET, y: this.pose.y + dir.y * LINE_OFFSET } - return (this.setup.colors ?? []).find((c) => inCell(probe, c.at))?.color - } - - sensors(): Record { - const line = this.lineState() - return { - getDistance: this.distance(), - getLine: line, - // auf schwarzem Feld oder Klebeband schwarz, sonst heller Boden - getColor: this.colorUnder() ?? (line & 0b0110 ? 'black' : 'white'), - isLineLeft: (line & 0b0100) !== 0, - isLineRight: (line & 0b0010) !== 0, - getTimer: this.timer, - } - } - - /** Strecke von `origin` in Richtung `dir`, bis ein Strahl eine Wand trifft. */ - private freeDistance(origin: Point, dir: Point): number { - let best = Infinity - for (const wall of this.allWalls) { - const t = rayHitsSegment(origin, dir, wall.from, wall.to) - if (t !== undefined && t < best) best = t - } - return best - } -} - -const clampPower = (p: number) => Math.max(-100, Math.min(100, p)) - -export function normalizeHeading(deg: number): number { - const h = ((deg % 360) + 360) % 360 - return Math.abs(h - 360) < 1e-9 ? 0 : h -} - -function rayHitsSegment(o: Point, d: Point, a: Point, b: Point): number | undefined { - const e = { x: b.x - a.x, y: b.y - a.y } - const denom = d.x * e.y - d.y * e.x - if (Math.abs(denom) < 1e-12) return undefined - const ao = { x: a.x - o.x, y: a.y - o.y } - const t = (ao.x * e.y - ao.y * e.x) / denom - const u = (ao.x * d.y - ao.y * d.x) / denom - return t >= 0 && u >= 0 && u <= 1 ? t : undefined -} - -function distanceToPolyline(p: Point, line: Point[]): number { - let best = Infinity - for (let i = 0; i + 1 < line.length; i++) best = Math.min(best, distanceToSegment(p, line[i], line[i + 1])) - return best -} - -function distanceToSegment(p: Point, a: Point, b: Point): number { - const dx = b.x - a.x - const dy = b.y - a.y - const len2 = dx * dx + dy * dy - const t = len2 === 0 ? 0 : Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2)) - return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy)) -} diff --git a/web/src/core/sections.ts b/web/src/core/sections.ts deleted file mode 100644 index 485cded5..00000000 --- a/web/src/core/sections.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * VisuObject: Abschnitts-Kommentare in Klassen wie im Unterricht: - * `// Attribute`, `// Referenzattribute`, `// Konstruktor`, `// Methoden`. - * Referenzattribute haben eine eigene Klasse des Projekts als Typ (auch `ArrayList` oder `Spieler[]`). - * Neue Mitglieder aus dem Klassendiagramm landen im passenden Abschnitt; die Reihenfolge innerhalb bleibt. - */ - -import { associationTarget, parseClasses, type UmlClass, type UmlMember } from './classModel' - -export type Section = 'fields' | 'refs' | 'ctors' | 'methods' -export type SectionLabels = Record - -const order: Section[] = ['fields', 'refs', 'ctors', 'methods'] - -/** Alle Sprachen: So erkennt VisuObject die Kommentare auch nach einem Sprachwechsel wieder. */ -const known: SectionLabels[] = [ - { fields: 'Attribute', refs: 'Referenzattribute', ctors: 'Konstruktor', methods: 'Methoden' }, - { fields: 'Attributes', refs: 'Reference attributes', ctors: 'Constructor', methods: 'Methods' }, - { fields: 'Atributos', refs: 'Atributos de referência', ctors: 'Construtor', methods: 'Métodos' }, -] - -const norm = (s: string) => s.trim().toLowerCase().replace(/[:.]$/, '') -const knownWords = new Set(known.flatMap((k) => Object.values(k)).flatMap((w) => [norm(w), norm(w) + 'en', norm(w) + 's', norm(w) + 'es'])) -/** `// Attribute`, `// Konstruktoren:` … */ -const isSectionLine = (line: string) => { - const m = /^\s*\/\/\s*(.+?)\s*$/.exec(line) - return !!m && knownWords.has(norm(m[1])) -} - -export function sectionOf(m: UmlMember, classNames: Set): Section { - if (m.kind === 'constructor') return 'ctors' - if (m.kind === 'method') return 'methods' - return classNames.has(associationTarget(m.type).name) ? 'refs' : 'fields' -} - -const lineStart = (s: string, pos: number) => s.lastIndexOf('\n', pos - 1) + 1 -const lineEnd = (s: string, pos: number) => { - const i = s.indexOf('\n', pos) - return i < 0 ? s.length : i + 1 -} - -/** Hat die Klasse schon Abschnitts-Kommentare? */ -export function hasSections(source: string, cls: UmlClass): boolean { - const open = source.indexOf('{', cls.headerTo) - return source - .slice(open + 1, cls.bodyEnd) - .split('\n') - .some(isSectionLine) -} - -/** - * Klassenrumpf neu ordnen: die vier Kommentare und darunter die Mitglieder ihres Abschnitts. - * Kommentare und Annotationen direkt über einem Mitglied wandern mit. Anderes im Rumpf - * (z. B. eine innere Klasse) kommt unverändert ans Ende. Interfaces bleiben, wie sie sind. - */ -export function withSections(source: string, cls: UmlClass, classNames: Set, labels: SectionLabels): string { - if (cls.kind !== 'class') return source - const open = source.indexOf('{', cls.headerTo) - if (open < 0 || open > cls.bodyEnd) return source - // Innere Klassen: lieber nichts verschieben. - if (parseClasses(source).some((c) => c.from > open && c.from < cls.bodyEnd)) return source - const bodyFrom = lineEnd(source, open) - const bodyTo = lineStart(source, cls.bodyEnd) - if (bodyFrom > bodyTo || !/^\s*$/.test(source.slice(open + 1, bodyFrom)) || !/^\s*$/.test(source.slice(bodyTo, cls.bodyEnd))) return source - const indent = /^[ \t]*/.exec(source.slice(lineStart(source, cls.from)))![0] + ' ' - const groups = new Map(order.map((s) => [s, []])) - const taken: [number, number][] = [] - const seen = new Set() - for (const m of cls.members) { - if (seen.has(m.from)) continue - seen.add(m.from) - let from = lineStart(source, m.from) - if (!/^\s*$/.test(source.slice(from, m.from))) return source - const to = lineEnd(source, m.to) - if (!/^\s*$/.test(source.slice(m.to, to))) return source - // Javadoc, Kommentare und Annotationen darüber gehören dazu (aber keine Abschnitts-Kommentare). - for (;;) { - if (from <= bodyFrom) break - const prev = lineStart(source, from - 1) - const line = source.slice(prev, from) - if (isSectionLine(line) || !/^\s*(\/\/|\/\*|\*|@)/.test(line)) break - from = prev - } - taken.push([from, to]) - groups.get(sectionOf(m, classNames))!.push(source.slice(from, to).replace(/\s+$/, '')) - } - // Was übrig bleibt (ohne Leerzeilen und alte Abschnitts-Kommentare). - taken.sort((a, b) => a[0] - b[0]) - let rest = '' - let at = bodyFrom - for (const [f, t] of [...taken, [bodyTo, bodyTo] as [number, number]]) { - if (f > at) rest += source.slice(at, f) - at = Math.max(at, t) - } - const extra = rest - .split('\n') - .filter((l) => !isSectionLine(l)) - .join('\n') - .trim() - const blocks = order.map((s) => { - const items = groups.get(s)! - const sep = s === 'fields' || s === 'refs' ? '\n' : '\n\n' - return `${indent}// ${labels[s]}` + (items.length ? '\n' + items.join(sep) : '') - }) - if (extra) blocks.push(indent + extra) - return source.slice(0, bodyFrom) + blocks.join('\n\n') + '\n' + source.slice(bodyTo) -} - -/** Nur einsortieren, wenn die Klasse schon Abschnitte hat. */ -export function keepSections(source: string, className: string, classNames: Set, labels: SectionLabels): string { - const cls = parseClasses(source).find((c) => c.name === className) - return cls && hasSections(source, cls) ? withSections(source, cls, classNames, labels) : source -} diff --git a/web/src/core/simulation.ts b/web/src/core/simulation.ts deleted file mode 100644 index 6652b609..00000000 --- a/web/src/core/simulation.ts +++ /dev/null @@ -1,2368 +0,0 @@ -/** - * Port von `VisuStructSimulationEngine.swift`: führt ein Struktogramm Schritt für Schritt aus. - * Verzweigungen und Schleifen ersetzen sich beim Ausführen durch die Schritte ihres Rumpfs. - */ -import { ElementType, type VSCase, type VSDocument, type VSElement } from './model' -import { MBOT_COMMANDS, MBOT_DRIVE_UNITS, MBOT_SENSORS, makeMBotAction, makeMBotDriveAction, mbotArguments, parseMBotCommand, substituteMBotSensors, type MBotAction, type MBotSensorValues } from './mbot' - -export type SimValue = - | { kind: 'int'; value: number } - | { kind: 'double'; value: number } - | { kind: 'string'; value: string } - | { kind: 'boolean'; value: boolean } - | { kind: 'intArray'; value: number[] } - | { kind: 'doubleArray'; value: number[] } - | { kind: 'stringArray'; value: string[] } - | { kind: 'booleanArray'; value: boolean[] } - /** Zweidimensionales Array (`boolean[][] sitze`): Zeilen, darin die Werte. */ - | { kind: 'grid'; elementType: SimValueType; value: (number | string | boolean)[][] } - /** `new Scanner(new File(…))` oder `new BufferedReader(new FileReader(…))`: liest Zeile für Zeile, `next` ist die nächste. */ - | { kind: 'reader'; className: 'Scanner' | 'BufferedReader'; file: string; lines: string[]; next: number } - /** `new PrintWriter(…)`: sammelt Text, der erst mit `close()` in der Datei landet (wie in Java). */ - | { kind: 'writer'; file: string; text: string } - /** `null`, z. B. von `readLine()` am Ende der Datei. */ - | { kind: 'null' } - -export type SimValueType = 'int' | 'double' | 'string' | 'boolean' - -export type StepKind = - | 'statement' - | 'branch' - | 'switchSelection' - | 'forLoopStart' - | 'forLoopCondition' - | 'forLoopIncrement' - | 'whileLoop' - | 'doUntilLoop' - | 'doUntilCondition' - | 'infiniteLoop' - | 'jump' - | 'call' - | 'callEnd' - -export interface SimStep { - path: number[] - text: string - kind: StepKind - cases?: VSCase[] - loopBody?: VSElement[] - forParts?: string[] - /** Aufrufebene: 0 ist das Hauptprogramm, jeder Aufruf bekommt eine neue Nummer. */ - frame?: number - /** Im Unterprogramm: Pfad des Aufruf-Kastens im Hauptprogramm, der markiert bleibt. */ - callPath?: number[] -} - -/** Sucht zum Text eines Aufruf-Kastens das passende Diagramm (z. B. einen offenen Reiter). */ -export type SubprogramResolver = (name: string) => VSDocument | undefined - -/** Ab dieser Tiefe bricht die Simulation ab (vermutlich ein Aufruf, der sich selbst aufruft). */ -export const maxCallDepth = 100 - -export interface InputRequest { - variableName: string - valueType: SimValueType - prompt: string - /** Wie in Java hinter `System.out.print("Note: ")`: Die Eingabe steht in derselben Zeile wie diese Ausgabe. */ - continuesLine?: boolean - /** Pseudocode: Die Frage gehört zu einer Bedingung, die Antwort (true/false) entscheidet den Weg. */ - decision?: boolean -} - -/** Meldungen der Simulation, unabhängig von der Sprache. */ -export type SimNotice = - | { kind: 'finished' } - | { kind: 'infiniteLoopWithoutBody' } - | { kind: 'unsupportedStatement'; text: string } - | { kind: 'invalidExpression'; text: string } - /** `similar`: gleicher Name in anderer Groß- und Kleinschreibung (`Zahl` statt `zahl`). */ - | { kind: 'unknownVariable'; text: string; similar?: string } - | { kind: 'divisionByZero' } - | { kind: 'wholeNumberExpected' } - | { kind: 'numberExpected' } - | { kind: 'booleanExpected' } - | { kind: 'subprogramNotFound'; text: string } - | { kind: 'callTooDeep' } - /** Die Werte in den Klammern passen nicht zur Kopfzeile des Unterprogramms. */ - | { kind: 'callArguments'; text: string } - /** Ein Unterprogramm mit Rückgabetyp endet ohne `return`. */ - | { kind: 'missingReturn'; text: string } - /** `Files.readString(Path.of("…"))` mit einem Namen, den es nicht gibt. */ - | { kind: 'fileNotFound'; text: string } - /** `nextLine()`, obwohl die Datei zu Ende ist (in Java eine NoSuchElementException). */ - | { kind: 'endOfFile'; text: string } - /** Eine Methode auf `null` (in Java eine NullPointerException). */ - | { kind: 'nullValue'; text: string } - | { kind: 'other'; text: string } - -export interface SimState { - stepIndex: number - variables: Map - outputLines: string[] - /** Die letzte Ausgabe war `System.out.print(…)`: Die nächste Ausgabe schreibt in derselben Zeile weiter. */ - outputLineOpen?: boolean - inputRequest?: InputRequest - /** Fehler zur letzten Eingabe (z. B. keine Zahl). */ - inputErrorNotice?: SimNotice - lastTrace?: string - /** Hinweis nach dem letzten Schritt (Ende, Fehler). */ - notice?: SimNotice - /** Nach einem Fehler bleibt die Simulation auf dem fehlerhaften Schritt stehen. */ - isHalted: boolean - /** Dateien, die das Programm geschrieben hat (Name → Inhalt). */ - files: Map - /** Befehle an den mBot2 in der Reihenfolge der Schritte (`mbot.forward(10)` usw.). */ - robotActions: MBotAction[] -} - -export function noticeEnglish(n: SimNotice): string { - switch (n.kind) { - case 'finished': return 'Simulation finished.' - case 'infiniteLoopWithoutBody': return 'Infinite loop has no body.' - case 'unsupportedStatement': return `Unsupported statement: ${n.text}` - case 'invalidExpression': return `Invalid expression: ${n.text}` - case 'unknownVariable': return n.similar ? `Unknown variable: ${n.text}. Java is case-sensitive: did you mean ${n.similar}?` : `Unknown variable: ${n.text}` - case 'divisionByZero': return 'Division by zero.' - case 'wholeNumberExpected': return 'Please enter a whole number.' - case 'numberExpected': return 'Please enter a number.' - case 'booleanExpected': return 'Please enter true or false.' - case 'subprogramNotFound': return `No open diagram is called ${n.text}. The call was skipped.` - case 'callTooDeep': return 'Too many nested calls. Does a subprogram call itself?' - case 'callArguments': return `The call does not match the header of ${n.text}. Check the values in the parentheses.` - case 'missingReturn': return `${n.text} ended without returning a value with return.` - case 'fileNotFound': return `There is no file called ${n.text}.` - case 'endOfFile': return `The file ${n.text} has no more lines.` - case 'nullValue': return `${n.text} is null.` - case 'other': return n.text - } -} - -export function noticeGerman(n: SimNotice): string { - switch (n.kind) { - case 'finished': return 'Simulation beendet.' - case 'infiniteLoopWithoutBody': return 'Die Endlosschleife hat keinen Rumpf.' - case 'unsupportedStatement': return `Nicht unterstützte Anweisung: ${n.text}` - case 'invalidExpression': return `Ungültiger Ausdruck: ${n.text}` - case 'unknownVariable': return n.similar ? `Unbekannte Variable: ${n.text}. Java unterscheidet Groß- und Kleinschreibung: Meintest du ${n.similar}?` : `Unbekannte Variable: ${n.text}` - case 'divisionByZero': return 'Division durch null.' - case 'wholeNumberExpected': return 'Bitte eine ganze Zahl eingeben.' - case 'numberExpected': return 'Bitte eine Zahl eingeben.' - case 'booleanExpected': return 'Bitte true oder false eingeben.' - case 'subprogramNotFound': return `Kein offenes Diagramm heißt ${n.text}. Der Aufruf wurde übersprungen.` - case 'callTooDeep': return 'Zu viele verschachtelte Aufrufe. Ruft sich ein Unterprogramm selbst auf?' - case 'callArguments': return `Der Aufruf passt nicht zur Kopfzeile von ${n.text}. Prüfe die Werte in den Klammern.` - case 'missingReturn': return `${n.text} hat keinen Wert mit return zurückgegeben.` - case 'fileNotFound': return `Es gibt keine Datei ${n.text}.` - case 'endOfFile': return `Die Datei ${n.text} hat keine Zeile mehr.` - case 'nullValue': return `${n.text} ist null.` - case 'other': return n.text - } -} - -class SimulationError extends Error { - constructor(readonly notice: SimNotice) { - super(noticeEnglish(notice)) - } -} - -const unsupported = (text: string) => new SimulationError({ kind: 'unsupportedStatement', text }) -const invalid = (text: string) => new SimulationError({ kind: 'invalidExpression', text }) -/** Unbekannte Variable; gibt es sie in anderer Groß- und Kleinschreibung, nennt der Hinweis sie. */ -const unknownVar = (text: string, variables?: Map) => { - const similar = variables && [...variables.keys()].find((k) => k !== text && k.toLowerCase() === text.toLowerCase()) - return new SimulationError(similar ? { kind: 'unknownVariable', text, similar } : { kind: 'unknownVariable', text }) -} -const divByZero = () => new SimulationError({ kind: 'divisionByZero' }) - -/** Textdateien, die Java mit `Files.readString(Path.of("name"))` liest, z. B. aus einer Lektion. */ -const textFiles = new Map() - -export function registerTextFile(name: string, content: string) { - textFiles.set(name, content) -} - -export const textFileEntries = (): [string, string][] => [...textFiles] - -function toNotice(error: unknown): SimNotice { - if (error instanceof SimulationError) return error.notice - return { kind: 'other', text: error instanceof Error ? error.message : String(error) } -} - -// MARK: - Werte - -/** `%.12g` wie in C. */ -function formatG12(value: number): string { - if (value === 0) return '0' - if (!Number.isFinite(value)) return Number.isNaN(value) ? 'nan' : value > 0 ? 'inf' : '-inf' - const exp = Math.floor(Math.log10(Math.abs(Number(value.toPrecision(12))))) - if (exp < -4 || exp >= 12) { - const [mantissa, e] = value.toExponential(11).split('e') - const m = mantissa.includes('.') ? mantissa.replace(/0+$/, '').replace(/\.$/, '') : mantissa - const n = Number(e) - return `${m}e${n < 0 ? '-' : '+'}${String(Math.abs(n)).padStart(2, '0')}` - } - const fixed = value.toFixed(Math.max(0, 11 - exp)) - return fixed.includes('.') ? fixed.replace(/0+$/, '').replace(/\.$/, '') : fixed -} - -function formatDouble(value: number): string { - if (Number.isFinite(value) && Math.round(value) === value) return value.toFixed(1) - return formatG12(value) -} - -export function describeValue(v: SimValue): string { - switch (v.kind) { - case 'int': return String(v.value) - case 'double': return formatDouble(v.value) - case 'string': return v.value - case 'boolean': return String(v.value) - case 'intArray': return '[' + v.value.map(String).join(', ') + ']' - case 'doubleArray': return '[' + v.value.map(formatDouble).join(', ') + ']' - case 'stringArray': return '[' + v.value.join(', ') + ']' - case 'booleanArray': return '[' + v.value.map(String).join(', ') + ']' - case 'grid': return '[' + describeRows(v).join(', ') + ']' - case 'reader': return `${v.className}(${v.file})` - case 'writer': return `PrintWriter(${v.file})` - case 'null': return 'null' - } -} - -/** Ein 2D-Array Zeile für Zeile, z. B. für die Anzeige unter Variablen. */ -export function describeRows(v: SimValue & { kind: 'grid' }): string[] { - return v.value.map((row) => '[' + row.map((x) => describeValue(elementValue(v.elementType, x))).join(', ') + ']') -} - -function elementValue(type: SimValueType, raw: number | string | boolean): SimValue { - switch (type) { - case 'int': return { kind: 'int', value: raw as number } - case 'double': return { kind: 'double', value: raw as number } - case 'string': return { kind: 'string', value: raw as string } - case 'boolean': return { kind: 'boolean', value: raw as boolean } - } -} - -function elementDefault(type: SimValueType): number | string | boolean { - return type === 'string' ? '' : type === 'boolean' ? false : 0 -} - -/** - * Was `System.out.println(zahlen)` in Java ausgibt: nicht den Inhalt, sondern Typ und Kennung der Referenz, - * z. B. `[I@1b6d3586`. Den Inhalt zeigt erst `Arrays.toString(zahlen)`. Die Kennung bleibt für dasselbe Array gleich. - */ -const arrayIds = new WeakMap() -let nextArrayId = 0 - -export function javaReference(v: SimValue): string { - const code = (t: SimValueType) => ({ int: 'I', double: 'D', boolean: 'Z', string: 'Ljava.lang.String;' })[t] - const prefix = - v.kind === 'grid' ? '[[' + code(v.elementType) - : v.kind === 'intArray' ? '[I' - : v.kind === 'doubleArray' ? '[D' - : v.kind === 'booleanArray' ? '[Z' - : v.kind === 'stringArray' ? '[Ljava.lang.String;' - : undefined - if (!prefix || !('value' in v)) return describeValue(v) - const key = v.value as object - let id = arrayIds.get(key) - if (!id) { - id = ((Math.imul(++nextArrayId, 0x9e3779b1) >>> 0) & 0x7fffffff).toString(16) - arrayIds.set(key, id) - } - return prefix + '@' + id -} - -/** Ein Fach wurde geändert und das Array dabei kopiert: Es ist in Java aber dasselbe Array, also dieselbe Kennung. */ -function keepArrayId(from: object, to: object): void { - const id = arrayIds.get(from) - if (id) arrayIds.set(to, id) -} - -function isArrayValue(v: SimValue): boolean { - return v.kind === 'intArray' || v.kind === 'doubleArray' || v.kind === 'stringArray' || v.kind === 'booleanArray' || v.kind === 'grid' -} - -function asDouble(v: SimValue): number { - return v.kind === 'int' || v.kind === 'double' ? v.value : NaN -} - -const int = (value: number): SimValue => ({ kind: 'int', value }) -const dbl = (value: number): SimValue => ({ kind: 'double', value }) - -// MARK: - Zeichenklassen - -const isWhitespace = (c: string | undefined) => c !== undefined && /\s/u.test(c) -const isLetter = (c: string) => /\p{L}/u.test(c) -const isNumberChar = (c: string) => /\p{N}/u.test(c) - -function isIdentifier(text: string): boolean { - const chars = Array.from(text) - if (chars.length === 0 || !(isLetter(chars[0]) || chars[0] === '_')) return false - return chars.every((c) => isLetter(c) || isNumberChar(c) || c === '_') -} - -function valueTypeKeyword(text: string): SimValueType | undefined { - switch (text.toLowerCase()) { - case 'int': return 'int' - case 'double': return 'double' - case 'string': return 'string' - // Ein `char` ist in VisuStruct ein String mit genau einem Zeichen. - case 'char': return 'string' - case 'boolean': case 'bool': return 'boolean' - default: return undefined - } -} - -function valueTypeOf(v: SimValue): SimValueType { - return v.kind === 'int' ? 'int' : v.kind === 'double' ? 'double' : v.kind === 'boolean' ? 'boolean' : 'string' -} - -function unquotedString(text: string): string | undefined { - const chars = Array.from(text) - // Zeichenliteral wie in Java: 'a' - if (chars.length === 3 && chars[0] === "'" && chars[2] === "'") return chars[1] - if (chars.length < 2 || chars[0] !== '"' || chars[chars.length - 1] !== '"') return undefined - const inner = chars.slice(1, -1).join('') - // `"a\"" + b + "\"c"` beginnt und endet auch mit `"`, ist aber kein einzelnes Literal. - if (!/^(?:[^"\\]|\\.)*$/u.test(inner)) return undefined - return inner.replaceAll('\\"', '"').replaceAll('\\n', '\n') -} - -function normalizeNumericExpression(expression: string): string { - return expression.replaceAll('(int)', '').replaceAll('(double)', '').trim() -} - -/** Für jedes Zeichen: liegt es außerhalb von Klammern und String-Literalen? */ -function topLevelMask(chars: string[]): boolean[] { - const mask = new Array(chars.length).fill(false) - let depth = 0 - let inString = false - let escaped = false - chars.forEach((c, i) => { - if (inString) { - if (escaped) escaped = false - else if (c === '\\') escaped = true - else if (c === '"') inString = false - return - } - switch (c) { - case '"': inString = true; break - case '(': case '[': depth += 1; break - case ')': case ']': depth -= 1; break - default: mask[i] = depth === 0 - } - }) - return mask -} - -function splitTopLevel(expression: string, separator: string): string[] { - const chars = Array.from(expression) - const sep = Array.from(separator) - const mask = topLevelMask(chars) - const parts: string[] = [] - let current: string[] = [] - let i = 0 - while (i < chars.length) { - const end = i + sep.length - if (end <= chars.length && sep.every((s, k) => chars[i + k] === s) && mask.slice(i, end).every(Boolean)) { - parts.push(current.join('').trim()) - current = [] - i = end - continue - } - current.push(chars[i]) - i += 1 - } - parts.push(current.join('').trim()) - return parts -} - -/** Erster Vergleichsoperator außerhalb von Klammern und Strings. */ -function splitComparison(expression: string): { lhs: string; op: string; rhs: string } | undefined { - const chars = Array.from(expression) - const mask = topLevelMask(chars) - for (let i = 0; i < chars.length; i++) { - if (!mask[i]) continue - let op: string | undefined - if (i + 1 < chars.length && mask[i + 1]) { - const pair = chars[i] + chars[i + 1] - if (['>=', '<=', '==', '!='].includes(pair)) op = pair - } - if (op === undefined && (chars[i] === '<' || chars[i] === '>')) op = chars[i] - if (op === undefined) continue - const lhs = chars.slice(0, i).join('').trim() - const rhs = chars.slice(i + op.length).join('').trim() - return { lhs, op, rhs } - } - return undefined -} - -/** Index der `)`, die die `(` bei `openIndex` schließt. */ -function matchingCloseParenthesis(chars: string[], openIndex: number): number | undefined { - let depth = 0 - let inString = false - let escaped = false - for (let i = openIndex; i < chars.length; i++) { - const c = chars[i] - if (inString) { - if (escaped) escaped = false - else if (c === '\\') escaped = true - else if (c === '"') inString = false - continue - } - if (c === '"') inString = true - else if (c === '(') depth += 1 - else if (c === ')') { - depth -= 1 - if (depth === 0) return i - } - } - return undefined -} - -/** `(a || b)` → `a || b`; `(a) && (b)` bleibt unverändert. */ -function innerOfOuterParentheses(text: string): string | undefined { - const chars = Array.from(text) - if (chars[0] !== '(' || chars[chars.length - 1] !== ')' || matchingCloseParenthesis(chars, 0) !== chars.length - 1) { - return undefined - } - return chars.slice(1, -1).join('').trim() -} - -/** Java-Stil `name.equals("Anna")`. */ -function parseEqualsCall(text: string): { lhs: string; rhs: string } | undefined { - const chars = Array.from(text) - const marker = Array.from('.equals(') - if (chars[chars.length - 1] !== ')') return undefined - const mask = topLevelMask(chars) - for (let i = 0; i < chars.length; i++) { - if (!mask[i] || i + marker.length > chars.length) continue - if (!marker.every((m, k) => chars[i + k] === m)) continue - const openIndex = i + marker.length - 1 - if (matchingCloseParenthesis(chars, openIndex) !== chars.length - 1) continue - return { - lhs: chars.slice(0, i).join('').trim(), - rhs: chars.slice(openIndex + 1, -1).join('').trim(), - } - } - return undefined -} - -function stripConditionKeyword(text: string): string { - const trimmed = text.trim() - for (const keyword of ['if', 'while', 'until', 'switch']) { - if (!trimmed.startsWith(keyword)) continue - const after = trimmed.slice(keyword.length) - if (!(after === '' || isWhitespace(after[0]) || after[0] === '(')) continue - let stripped = after.trim() - const inner = innerOfOuterParentheses(stripped) - if (inner !== undefined) stripped = inner - return stripped === '' ? 'true' : stripped - } - return trimmed === '' ? 'true' : trimmed -} - -interface ArrayElementAccess { - arrayName: string - /** Ein Index bei `a[i]`, zwei bei `a[i][j]`. */ - indexExpressions: string[] -} - -/** `name[…]` oder `name[…][…]`, und zwar der ganze Text (nicht etwa `a[i] > a[i + 1]`). */ -function parseArrayElementAccess(text: string): ArrayElementAccess | undefined { - const trimmed = text.trim() - const open = trimmed.indexOf('[') - if (!trimmed.endsWith(']') || open < 0) return undefined - const name = trimmed.slice(0, open).trim() - if (!isIdentifier(name)) return undefined - const indexExpressions: string[] = [] - let i = open - while (i < trimmed.length) { - if (trimmed[i] !== '[') return undefined - let depth = 0 - let close = -1 - for (let k = i; k < trimmed.length; k++) { - if (trimmed[k] === '[') depth += 1 - else if (trimmed[k] === ']' && --depth === 0) { - close = k - break - } - } - if (close < 0) return undefined - indexExpressions.push(trimmed.slice(i + 1, close)) - i = close + 1 - while (i < trimmed.length && isWhitespace(trimmed[i])) i += 1 - } - if (indexExpressions.length > 2) return undefined - return { arrayName: name, indexExpressions } -} - -/** `ziel.methode(arg, arg)` als Ganzes; das Ziel ist ein Name, ein Arrayfach oder ein String-Literal. */ -function parseMethodCall(text: string): { target: string; method: string; args: string[] } | undefined { - const trimmed = text.trim() - if (!trimmed.endsWith(')')) return undefined - const m = /^([A-Za-z_]\w*(?:\s*\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*([A-Za-z_]\w*)\s*\(/u.exec(trimmed) - if (!m) return undefined - const chars = Array.from(trimmed) - const open = Array.from(m[0]).length - 1 - if (matchingCloseParenthesis(chars, open) !== chars.length - 1) return undefined - const inner = chars.slice(open + 1, -1).join('').trim() - return { target: m[1], method: m[2], args: inner === '' ? [] : splitTopLevel(inner, ',') } -} - -function isAssignableTarget(text: string): boolean { - return isIdentifier(text) || parseArrayElementAccess(text) !== undefined -} - -function splitByPlusOutsideQuotes(expression: string): string[] { - const parts: string[] = [] - let current = '' - let inString = false - let escaped = false - let depth = 0 - for (const c of expression) { - if (escaped) { - current += c - escaped = false - continue - } - if (c === '\\') { - current += c - escaped = true - continue - } - if (c === '"') { - inString = !inString - current += c - continue - } - if (!inString && c === '(') depth += 1 - if (!inString && c === ')') depth -= 1 - if (c === '+' && !inString && depth === 0) { - parts.push(current) - current = '' - continue - } - current += c - } - if (inString) throw invalid(expression) - parts.push(current) - return parts -} - -/** Teilt an Kommas, die nicht in geschweiften Klammern stehen: `{1, 2}, {3, 4}` → zwei Teile. */ -function splitTopLevelBraces(text: string): string[] { - const parts: string[] = [] - let depth = 0 - let current = '' - for (const c of text) { - if (c === '{') depth += 1 - if (c === '}') depth -= 1 - if (c === ',' && depth === 0) { - parts.push(current) - current = '' - continue - } - current += c - } - if (current.trim() !== '') parts.push(current) - return parts -} - -// MARK: - Zahlenausdrücke - -type Token = - | { t: 'number'; literal: string; value: number } - | { t: 'identifier'; name: string } - | { t: '+' | '-' | '*' | '/' | '%' | '.' | '(' | ')' | '[' | ']' } - -function tokenize(expression: string): Token[] { - const chars = Array.from(expression) - const tokens: Token[] = [] - let i = 0 - while (i < chars.length) { - const c = chars[i] - if (isWhitespace(c)) { - i += 1 - continue - } - if (isNumberChar(c) || (c === '.' && i + 1 < chars.length && isNumberChar(chars[i + 1]))) { - const start = i - let dots = 0 - while (i < chars.length) { - if (chars[i] === '.') { - dots += 1 - if (dots > 1) throw invalid(expression) - } else if (!isNumberChar(chars[i])) { - break - } - i += 1 - } - const literal = chars.slice(start, i).join('') - if (literal === '.' || !/^[0-9]*\.?[0-9]*$/.test(literal)) throw invalid(expression) - tokens.push({ t: 'number', literal, value: Number(literal) }) - continue - } - if (isLetter(c) || c === '_') { - const start = i - while (i < chars.length && (isLetter(chars[i]) || isNumberChar(chars[i]) || chars[i] === '_')) i += 1 - tokens.push({ t: 'identifier', name: chars.slice(start, i).join('') }) - continue - } - // Zeichenliteral wie in Java: in einer Rechnung zählt sein Zeichencode, also 'A' = 65 - if (c === "'" && chars[i + 2] === "'" && chars[i + 1] !== undefined) { - const code = chars[i + 1].codePointAt(0)! - tokens.push({ t: 'number', literal: String(code), value: code }) - i += 3 - continue - } - if ('+-*/%.()[]'.includes(c)) { - tokens.push({ t: c as '+' }) - i += 1 - continue - } - throw invalid(expression) - } - return tokens -} - -type Num = { v: number; int: boolean } - -/** Zeichencode eines `char` (String mit genau einem Zeichen) wie in Java, wenn damit gerechnet wird; sonst `undefined`. */ -function charCode(text: string | undefined): number | undefined { - const chars = text === undefined ? [] : Array.from(text) - return chars.length === 1 ? chars[0].codePointAt(0) : undefined -} - -class NumericParser { - private index = 0 - constructor(private tokens: Token[], private variables: Map) {} - - parseInt(): number { - const value = this.expression().v - if (this.index !== this.tokens.length) throw invalid('') - if (!Number.isFinite(value)) throw invalid('') - return Math.trunc(value) - } - - parseDouble(): number { - return this.parseNumber().v - } - - /** Wert samt Angabe, ob er wie in Java ganzzahlig ist (nur `int`-Werte und Literale ohne Punkt). */ - parseNumber(): Num { - const value = this.expression() - if (this.index !== this.tokens.length) throw invalid('') - return value - } - - private get current(): Token | undefined { - return this.tokens[this.index] - } - - /** Wie `current`, aber ohne Typverengung durch TypeScript nach vorherigen Prüfungen. */ - private kind(): Token['t'] | undefined { - return this.tokens[this.index]?.t - } - - private isIdent(name: string): boolean { - const c = this.current - return c?.t === 'identifier' && c.name === name - } - - private expression(): Num { - let value = this.term() - for (let tok = this.current; tok && (tok.t === '+' || tok.t === '-'); tok = this.current) { - this.index += 1 - const rhs = this.term() - value = { v: tok.t === '+' ? value.v + rhs.v : value.v - rhs.v, int: value.int && rhs.int } - } - return value - } - - private term(): Num { - let value = this.factor() - for (let tok = this.current; tok && (tok.t === '*' || tok.t === '/' || tok.t === '%'); tok = this.current) { - this.index += 1 - const rhs = this.factor() - const bothInt = value.int && rhs.int - if (tok.t === '*') { - value = { v: value.v * rhs.v, int: bothInt } - } else { - if (rhs.v === 0) throw divByZero() - // Wie in Java: int / int schneidet Richtung null ab (7 / 2 = 3, -7 / 2 = -3) - const v = tok.t === '/' ? (bothInt ? Math.trunc(value.v / rhs.v) : value.v / rhs.v) : value.v % rhs.v - value = { v, int: bothInt } - } - } - return value - } - - private factor(): Num { - const token = this.current - if (!token) throw invalid('') - this.index += 1 - switch (token.t) { - case 'number': - return { v: token.value, int: !token.literal.includes('.') } - case 'identifier': { - const name = token.name - if (name === 'Math' && this.kind() === '.') { - this.index += 1 - if (!this.isIdent('random')) throw invalid(name) - this.index += 1 - if (this.kind() !== '(') throw invalid('Math.random') - this.index += 1 - if (this.kind() !== ')') throw invalid('Math.random') - this.index += 1 - return { v: Math.random(), int: false } - } - const value = this.variables.get(name) - if (!value) throw unknownVar(name, this.variables) - if (this.kind() === '.') { - this.index += 1 - if (!this.isIdent('length')) throw invalid(name) - this.index += 1 - if (this.kind() === '(') { - this.index += 1 - if (this.kind() !== ')') throw invalid(`${name}.length`) - this.index += 1 - } - if (isArrayValue(value)) return { v: ((value as { value: unknown[] }).value).length, int: true } - throw invalid(name) - } - if (this.kind() === '[') { - this.index += 1 - const elementIndex = Math.trunc(this.expression().v) - if (this.kind() !== ']') throw invalid(name) - this.index += 1 - if (value.kind === 'grid') { - if (!(elementIndex >= 0 && elementIndex < value.value.length)) throw invalid(`${name}[${elementIndex}]`) - const row = value.value[elementIndex] - if (this.kind() === '.') { - // `sitze[0].length`: Anzahl der Spalten in dieser Zeile - this.index += 1 - if (!this.isIdent('length')) throw invalid(name) - this.index += 1 - if (this.kind() === '(') { - this.index += 1 - if (this.kind() !== ')') throw invalid(`${name}.length`) - this.index += 1 - } - return { v: row.length, int: true } - } - if (this.kind() !== '[') throw invalid(name) - this.index += 1 - const column = Math.trunc(this.expression().v) - if (this.kind() !== ']') throw invalid(name) - this.index += 1 - if (!(column >= 0 && column < row.length)) throw invalid(`${name}[${elementIndex}][${column}]`) - if (value.elementType !== 'int' && value.elementType !== 'double') throw invalid(name) - return { v: row[column] as number, int: value.elementType === 'int' } - } - if (value.kind === 'intArray' || value.kind === 'doubleArray') { - if (!(elementIndex >= 0 && elementIndex < value.value.length)) throw invalid(`${name}[${elementIndex}]`) - return { v: value.value[elementIndex], int: value.kind === 'intArray' } - } - if (value.kind === 'stringArray') { - const code = charCode(value.value[elementIndex]) - if (code !== undefined) return { v: code, int: true } - } - throw invalid(name) - } - if (value.kind === 'string') { - const code = charCode(value.value) - if (code !== undefined) return { v: code, int: true } - } - const numeric = asDouble(value) - if (!Number.isFinite(numeric)) throw invalid(name) - return { v: numeric, int: value.kind === 'int' } - } - case '-': { - const inner = this.factor() - return { v: -inner.v, int: inner.int } - } - case '(': { - const value = this.expression() - if (this.kind() !== ')') throw invalid('') - this.index += 1 - return value - } - default: - throw invalid('') - } - } -} - -// MARK: - Schritte - -/** Vergleich oder Verknüpfung außerhalb von Texten (`a < b`, `!fertig`, `x == 3 && y`): ergibt true oder false. */ -function looksBoolean(expression: string): boolean { - const code = expression.replace(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/gu, '""') - return /==|!=|<|>|&&|\|\||^\s*!/u.test(code) -} - -function stripTrailingSemicolon(text: string): string { - let result = text.trim() - while (result.endsWith(';')) result = result.slice(0, -1).trim() - return result -} - -function paddedForParts(parts: string[]): string[] { - const result = parts.slice(0, 3) - while (result.length < 3) result.push('') - return result -} - -function normalizedForParts(rawParts: string[]): string[] { - const stripped = rawParts.map((p) => stripTrailingSemicolon(p).trim()) - if (stripped.length === 1 && stripped[0].includes(';')) { - return paddedForParts(stripped[0].split(';').map((p) => p.trim())) - } - return paddedForParts(stripped) -} - -type StepContext = Pick - -/** Aufrufebene eines Schritts, damit Rümpfe und Zweige im selben Unterprogramm bleiben. */ -const contextOf = (step: SimStep): StepContext => (step.frame ? { frame: step.frame, callPath: step.callPath } : {}) - -function buildSteps(elements: VSElement[], pathPrefix: number[] = [], context: StepContext = {}): SimStep[] { - const steps: SimStep[] = [] - const push = (step: SimStep) => steps.push(context.frame ? { ...step, ...context } : step) - elements.forEach((element, index) => { - const path = [...pathPrefix, index] - const text = element.textLines.join(' ').trim() - switch (element.type) { - case ElementType.anweisung: - // Leere Anweisung und Platzhalter „ø“ werden übersprungen - if (text !== '' && text !== 'ø') push({ path, text, kind: 'statement' }) - break - case ElementType.verzweigung: - push({ path, text: text || 'true', kind: 'branch', cases: element.cases }) - break - case ElementType.fallauswahl: - push({ path, text: text || '0', kind: 'switchSelection', cases: element.cases }) - break - case ElementType.forSchleife: - push({ - path, - text, - kind: 'forLoopStart', - loopBody: element.loopBody, - forParts: normalizedForParts(element.textLines), - }) - break - case ElementType.whileSchleife: - push({ path, text: text || 'true', kind: 'whileLoop', loopBody: element.loopBody }) - break - case ElementType.doUntilSchleife: - push({ path, text: text || 'true', kind: 'doUntilLoop', loopBody: element.loopBody }) - break - case ElementType.endlosschleife: - push({ path, text: text || 'true', kind: 'infiniteLoop', loopBody: element.loopBody }) - break - case ElementType.aussprung: - push({ path, text, kind: 'jump' }) - break - case ElementType.aufruf: - if (text !== '' && text !== 'ø') push({ path, text, kind: 'call' }) - break - } - }) - return steps -} - -function parseInputValue(rawValue: string, valueType: SimValueType): SimValue { - const trimmed = rawValue.trim().replaceAll(',', '.') - switch (valueType) { - case 'int': - if (!/^[+-]?[0-9]+$/.test(trimmed)) throw new SimulationError({ kind: 'wholeNumberExpected' }) - return int(Number(trimmed)) - case 'double': - if (!/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?$/.test(trimmed)) { - throw new SimulationError({ kind: 'numberExpected' }) - } - return dbl(Number(trimmed)) - case 'string': - return { kind: 'string', value: rawValue } - case 'boolean': - switch (trimmed.toLowerCase()) { - case 'true': case 'wahr': return { kind: 'boolean', value: true } - case 'false': case 'falsch': return { kind: 'boolean', value: false } - default: throw new SimulationError({ kind: 'booleanExpected' }) - } - } -} - -function freshState(): SimState { - return { stepIndex: 0, variables: new Map(), outputLines: [], isHalted: false, files: new Map(), robotActions: [] } -} - -type SwitchSelector = { kind: 'int'; value: number } | { kind: 'text'; value: string } - -function matchingCaseIndex(selector: SwitchSelector, cases: VSCase[]): number | undefined { - for (let i = 0; i < cases.length; i++) { - const label = cases[i].name.trim() - if (label.toLowerCase() === 'default') continue - if (selector.kind === 'int') { - if (/^[+-]?[0-9]+$/.test(label) && Number(label) === selector.value) return i - } else if (unquotedString(label) === selector.value || label === selector.value) { - return i - } - } - return undefined -} - -function isLoopContinuation(kind: StepKind): boolean { - return ( - kind === 'forLoopIncrement' || - kind === 'forLoopCondition' || - kind === 'whileLoop' || - kind === 'doUntilCondition' || - kind === 'infiniteLoop' - ) -} - -function sameStep(a: SimStep, b: SimStep): boolean { - return (a.frame ?? 0) === (b.frame ?? 0) && a.path.length === b.path.length && a.path.every((v, i) => v === b.path[i]) -} - -/** Kopfzeile eines Unterprogramms im Titel, z. B. `int quadrat(int x)` oder `void zeigeSumme(int a, int b)`. */ -export interface SubprogramHeader { - /** Fehlt bei `void`. */ - returnType?: SimValueType - name: string - /** `dims` steht bei Array-Parametern wie `int[] zahlen` (1) oder `boolean[][] sitze` (2). */ - params: { type: SimValueType; name: string; dims?: 1 | 2 }[] -} - -export function parseSubprogramHeader(text: string): SubprogramHeader | undefined { - const m = /^(void|int|double|String|boolean)\s+([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(stripTrailingSemicolon(text)) - if (!m) return undefined - const params: SubprogramHeader['params'] = [] - if (m[3].trim() !== '') { - for (const part of m[3].split(',')) { - const p = /^(int|double|String|boolean|char)\s*((?:\[\s*\]){0,2})\s+([A-Za-z_]\w*)$/u.exec(part.trim()) - if (!p) return undefined - const dims = (p[2].match(/\[/gu) ?? []).length - params.push({ type: valueTypeKeyword(p[1])!, name: p[3], ...(dims > 0 ? { dims: dims as 1 | 2 } : {}) }) - } - } - return { returnType: valueTypeKeyword(m[1]), name: m[2], params } -} - -/** Text eines Aufruf-Kastens, z. B. `zeigeTitel()`, `zeigeSumme(3, 4)` oder `int y = quadrat(5)`. */ -interface CallText { - target?: string - targetType?: SimValueType - name: string - args: string[] -} - -function parseCallText(text: string): CallText | undefined { - const m = /^(?:(?:(int|double|String|boolean)\s+)?([A-Za-z_]\w*)\s*=\s*)?([A-Za-z_]\w*)\s*\((.*)\)$/u.exec( - stripTrailingSemicolon(text), - ) - if (!m) return undefined - return { - targetType: m[1] ? valueTypeKeyword(m[1]) : undefined, - target: m[2], - name: m[3], - args: m[4].trim() === '' ? [] : splitTopLevel(m[4], ','), - } -} - -/** `zeigeTitel()`, `zeigeTitel;`, `int y = quadrat(5)` und die Kopfzeile `int quadrat(int x)` liefern den Namen. */ -export function subprogramName(text: string): string { - const t = stripTrailingSemicolon(text) - return parseSubprogramHeader(t)?.name ?? parseCallText(t)?.name ?? t.replace(/\(\s*\)$/u, '').trim() -} - -/** Ein laufendes Unterprogramm mit Kopfzeile: eigene Variablen, die des Aufrufers warten in `saved`. */ -interface CallFrame { - saved: Map - header: SubprogramHeader - call?: CallText - returnValue?: SimValue - /** Array-Parameter: Änderungen gehen am Ende an diese Variablen des Aufrufers zurück (Referenzübergabe). */ - references: { param: string; callerName: string }[] -} - -// MARK: - Engine - -export class SimulationEngine { - steps: SimStep[] - state: SimState = freshState() - private nextFrame = 1 - private callDepth = 0 - private frames = new Map() - /** Beim Aufbereiten der Anzeige (`lastTrace`) lesen `nextLine()`/`readLine()` nur nach, ohne weiterzugehen. */ - private peeking = false - /** Messwerte des echten mBot2; fehlt ein Wert, gilt der simulierte aus `MBOT_SENSORS`. */ - robotSensors: MBotSensorValues = {} - /** Pseudocode: Kästen werden nur der Reihe nach gezeigt, Bedingungen beantwortet man selbst. */ - private pseudocode: boolean - /** Pseudocode: Antwort auf die gerade gestellte Frage (Bedingung: true/false, Fallauswahl: Name des Falls). */ - private decided?: boolean | string - - constructor( - document: VSDocument, - private resolveSubprogram: SubprogramResolver = () => undefined, - ) { - this.steps = buildSteps(document.elements) - this.pseudocode = !!document.pseudocode - } - - /** Im Unterprogramm bleibt der Aufruf-Kasten im Hauptprogramm markiert. */ - get currentStepPath(): number[] | undefined { - const step = this.steps[this.state.stepIndex] - return step?.callPath ?? step?.path - } - - get canStep(): boolean { - return !this.state.isHalted && !this.state.inputRequest && this.state.stepIndex < this.steps.length - } - - /** Englischer Text von `notice` (Tests). */ - get message(): string | undefined { - return this.state.notice && noticeEnglish(this.state.notice) - } - - reset(document?: VSDocument): void { - if (document) { - this.steps = buildSteps(document.elements) - this.pseudocode = !!document.pseudocode - } - this.decided = undefined - this.state = freshState() - this.afterOutput = false - this.nextFrame = 1 - this.callDepth = 0 - this.frames.clear() - } - - step(): void { - const state = this.state - if (!this.canStep) { - if (!state.inputRequest && !state.isHalted) state.notice = { kind: 'finished' } - return - } - const step = this.steps[state.stepIndex] - try { - switch (step.kind) { - case 'statement': - // Pseudocode ist kein Programm: Der Kasten wird nur gezeigt, nicht ausgeführt. - if (this.pseudocode) { - state.lastTrace = step.text - break - } - if (/^return\b/u.test(step.text)) return this.executeReturn(step) - this.executeStatement(step.text) - break - case 'branch': return this.executeBranch(step) - case 'switchSelection': return this.executeSwitchSelection(step) - case 'forLoopStart': return this.executeForLoopStart(step) - case 'forLoopCondition': return this.executeForLoopCondition(step) - case 'forLoopIncrement': return this.executeForLoopIncrement(step) - case 'whileLoop': return this.executeWhileLoop(step) - case 'doUntilLoop': return this.enterDoUntilLoop(step) - case 'doUntilCondition': return this.executeDoUntilCondition(step) - case 'infiniteLoop': return this.enterInfiniteLoop(step) - case 'jump': return this.executeJump(step) - case 'call': return this.executeCall(step) - case 'callEnd': return this.executeCallEnd(step) - } - if (state.inputRequest) { - state.notice = undefined - return - } - state.stepIndex += 1 - state.notice = this.finishedIfAtEnd() - } catch (error) { - state.notice = toNotice(error) - state.isHalted = true - } - } - - provideInput(rawValue: string): void { - const request = this.state.inputRequest - if (!request) return - if (request.decision) return this.provideDecision(rawValue) - try { - const value = parseInputValue(rawValue, request.valueType) - this.assignValue(value, request.variableName) - this.state.lastTrace = `${request.variableName} = input -> ${describeValue(value)}` - } catch (error) { - this.state.inputErrorNotice = toNotice(error) - return - } - this.state.inputRequest = undefined - this.state.inputErrorNotice = undefined - this.state.stepIndex += 1 - this.state.notice = this.finishedIfAtEnd() - } - - /** Pseudocode: Antwort auf die Frage zur Bedingung, dann gleich den Weg nehmen (die Bedingung ist der Schritt). */ - private provideDecision(rawValue: string): void { - if (this.state.inputRequest?.valueType === 'string') { - this.state.inputRequest = undefined - this.decided = rawValue.trim() - return this.step() - } - const answer = rawValue.trim().toLowerCase() - const yes = ['true', 'wahr', 'ja', 'yes', 'sim', 'verdadeiro'].includes(answer) - const no = ['false', 'falsch', 'nein', 'no', 'não', 'nao', 'falso'].includes(answer) - if (!yes && !no) { - this.state.inputErrorNotice = { kind: 'booleanExpected' } - return - } - this.state.inputRequest = undefined - this.state.inputErrorNotice = undefined - this.decided = yes - this.step() - } - - /** - * Wert einer Bedingung. Bei Pseudocode (z. B. „Regnet es?“) fragt die Simulation: `undefined`, bis die Antwort da ist. - */ - private condition(condition: string): boolean | undefined { - if (!this.pseudocode) return this.evaluateBool(condition) - const answer = this.decided - if (typeof answer === 'boolean') { - this.decided = undefined - return answer - } - this.state.inputRequest = { variableName: '', valueType: 'boolean', prompt: `${condition} (true/false)`, decision: true } - this.state.inputErrorNotice = undefined - this.state.notice = undefined - return undefined - } - - private finishedIfAtEnd(): SimNotice | undefined { - return this.state.stepIndex >= this.steps.length ? { kind: 'finished' } : undefined - } - - /** Ersetzt den aktuellen Schritt durch `replacement`. */ - private splice(replacement: SimStep[]): void { - this.steps.splice(this.state.stepIndex, 1, ...replacement) - } - - private noticeAfterEntering(bodySteps: SimStep[]): SimNotice | undefined { - return bodySteps.length > 0 ? undefined : this.finishedIfAtEnd() - } - - private executeBranch(step: SimStep): void { - const cases = step.cases - if (!cases || cases.length < 2) throw unsupported(step.text) - const condition = stripConditionKeyword(step.text) - const result = this.condition(condition) - if (result === undefined) return - const selected = result ? 0 : 1 - const branchSteps = buildSteps(cases[selected].elements, [...step.path, selected], contextOf(step)) - this.splice(branchSteps) - this.state.lastTrace = `${condition} -> ${result}` - this.state.notice = this.noticeAfterEntering(branchSteps) - } - - private executeSwitchSelection(step: SimStep): void { - const cases = step.cases - if (!cases || cases.length === 0) throw unsupported(step.text) - const selector = stripConditionKeyword(step.text) - let selected: number - if (this.pseudocode) { - // Pseudocode: Man wählt den Fall selbst; unbekannte Antwort = letzter Fall (sonst). - const answer = this.decided - if (typeof answer !== 'string') { - const names = cases.map((c) => c.name).join(' / ') - this.state.inputRequest = { variableName: '', valueType: 'string', prompt: `${selector} (${names})`, decision: true } - this.state.notice = undefined - return - } - this.decided = undefined - const index = cases.findIndex((c) => c.name.trim().toLowerCase() === answer.toLowerCase()) - selected = index >= 0 ? index : cases.length - 1 - } else selected = matchingCaseIndex(this.evaluateSwitchSelector(selector), cases) ?? cases.length - 1 - const caseSteps = buildSteps(cases[selected].elements, [...step.path, selected], contextOf(step)) - this.splice(caseSteps) - this.state.lastTrace = `${selector} -> ${cases[selected].name}` - this.state.notice = this.noticeAfterEntering(caseSteps) - } - - private executeForLoopStart(step: SimStep): void { - // Pseudocode wie „für jeden Gast“: eine Frage wie bei der kopfgesteuerten Schleife. - if (this.pseudocode) return this.splice([{ ...step, kind: 'whileLoop' }]) - const parts = normalizedForParts(step.forParts ?? [step.text]) - if (parts[0] !== '') this.executeStatement(parts[0]) - this.splice([{ ...contextOf(step), path: step.path, text: parts[1], kind: 'forLoopCondition', loopBody: step.loopBody, forParts: parts }]) - } - - private executeForLoopCondition(step: SimStep): void { - const parts = normalizedForParts(step.forParts ?? [step.text]) - const condition = parts[1] === '' ? 'true' : parts[1] - const shouldEnter = this.condition(condition) - if (shouldEnter === undefined) return - this.state.lastTrace = `${condition} -> ${shouldEnter}` - if (shouldEnter) { - const bodySteps = buildSteps(step.loopBody ?? [], [...step.path, 0], contextOf(step)) - this.splice([ - ...bodySteps, - { ...contextOf(step), path: step.path, text: parts[2], kind: 'forLoopIncrement', loopBody: step.loopBody, forParts: parts }, - { ...contextOf(step), path: step.path, text: parts[1], kind: 'forLoopCondition', loopBody: step.loopBody, forParts: parts }, - ]) - } else { - this.splice([]) - this.state.notice = this.finishedIfAtEnd() - } - } - - private executeForLoopIncrement(step: SimStep): void { - const increment = step.text.trim() - if (increment !== '') this.executeIncrement(increment) - this.splice([]) - } - - private executeWhileLoop(step: SimStep): void { - const condition = stripConditionKeyword(step.text) - const shouldEnter = this.condition(condition) - if (shouldEnter === undefined) return - this.state.lastTrace = `${condition} -> ${shouldEnter}` - if (shouldEnter) { - const bodySteps = buildSteps(step.loopBody ?? [], [...step.path, 0], contextOf(step)) - this.splice([...bodySteps, { ...contextOf(step), path: step.path, text: step.text, kind: 'whileLoop', loopBody: step.loopBody }]) - this.state.notice = this.noticeAfterEntering(bodySteps) - } else { - this.splice([]) - this.state.notice = this.finishedIfAtEnd() - } - } - - private enterDoUntilLoop(step: SimStep): void { - const bodySteps = buildSteps(step.loopBody ?? [], [...step.path, 0], contextOf(step)) - this.splice([...bodySteps, { ...contextOf(step), path: step.path, text: step.text, kind: 'doUntilCondition', loopBody: step.loopBody }]) - this.state.notice = this.noticeAfterEntering(bodySteps) - } - - private executeDoUntilCondition(step: SimStep): void { - const condition = stripConditionKeyword(step.text) - const shouldRepeat = this.condition(condition) - if (shouldRepeat === undefined) return - this.state.lastTrace = `${condition} -> ${shouldRepeat}` - if (shouldRepeat) { - const bodySteps = buildSteps(step.loopBody ?? [], [...step.path, 0], contextOf(step)) - this.splice([...bodySteps, { ...contextOf(step), path: step.path, text: step.text, kind: 'doUntilCondition', loopBody: step.loopBody }]) - } else { - this.splice([]) - this.state.notice = this.finishedIfAtEnd() - } - } - - private enterInfiniteLoop(step: SimStep): void { - const bodySteps = buildSteps(step.loopBody ?? [], [...step.path, 0], contextOf(step)) - this.splice([...bodySteps, { ...contextOf(step), path: step.path, text: step.text, kind: 'infiniteLoop', loopBody: step.loopBody }]) - this.state.lastTrace = 'true -> true' - this.state.notice = bodySteps.length > 0 ? undefined : { kind: 'infiniteLoopWithoutBody' } - } - - // MARK: Aussprung und Aufruf - - /** - * Wie `break`: verlässt die innerste Schleife, in der der Aussprung steht. Außerhalb jeder Schleife endet - * das Unterprogramm bzw. im Hauptprogramm das ganze Programm. - */ - private executeJump(step: SimStep): void { - const frame = step.frame ?? 0 - const isPrefix = (p: number[]) => p.length < step.path.length && p.every((v, i) => v === step.path[i]) - let end = this.steps.length - let outcome: 'break' | 'return' | 'end' = 'end' - for (let i = this.state.stepIndex + 1; i < this.steps.length; i++) { - const s = this.steps[i] - if ((s.frame ?? 0) !== frame) continue - if (s.kind === 'callEnd') { - end = i + 1 - outcome = 'return' - break - } - if (isLoopContinuation(s.kind) && isPrefix(s.path)) { - end = i + 1 - // Bei der For-Schleife folgt auf das Hochzählen noch die Bedingung - while (end < this.steps.length && sameStep(this.steps[end], s)) end += 1 - outcome = 'break' - break - } - } - const callEnd = this.steps[end - 1] - if (outcome === 'return') this.callDepth -= 1 - this.steps.splice(this.state.stepIndex, end - this.state.stepIndex) - this.state.lastTrace = `${step.text || 'break'} -> ${outcome}` - if (outcome === 'return') this.finishFrame(callEnd) - this.state.notice = this.finishedIfAtEnd() - } - - /** Führt das Diagramm mit dem Namen aus dem Aufruf-Kasten aus und macht danach hier weiter. */ - private executeCall(step: SimStep): void { - const name = step.text - const document = this.resolveSubprogram(subprogramName(name)) - if (!document) { - this.splice([]) - this.state.lastTrace = `${name} -> ?` - this.state.notice = { kind: 'subprogramNotFound', text: name } - if (this.state.stepIndex >= this.steps.length) this.state.notice = { kind: 'finished' } - return - } - const call = parseCallText(name) - const header = parseSubprogramHeader(document.caption) - const argumentsMismatch = header - ? (call?.args.length ?? 0) !== header.params.length || (call?.target !== undefined && !header.returnType) - : call !== undefined && (call.args.length > 0 || call.target !== undefined) - if (argumentsMismatch) throw new SimulationError({ kind: 'callArguments', text: header?.name ?? subprogramName(name) }) - if (this.callDepth >= maxCallDepth) throw new SimulationError({ kind: 'callTooDeep' }) - // Die Werte werden noch mit den Variablen des Aufrufers ausgerechnet (Wertübergabe). - // Arrays werden dagegen als Referenz übergeben: Das Unterprogramm arbeitet mit demselben Array. - const locals = new Map() - const references: CallFrame['references'] = [] - header?.params.forEach((p, i) => { - const arg = call!.args[i].trim() - if (!p.dims) { - locals.set(p.name, this.evaluateExpression(arg, p.type)) - return - } - const value = this.state.variables.get(arg) - if (!value) { - if (/^[A-Za-z_]\w*$/u.test(arg)) throw unknownVar(arg, this.state.variables) - throw invalid(arg) - } - const matches = - p.dims === 1 ? value.kind === `${p.type}Array` : value.kind === 'grid' && value.elementType === p.type - if (!matches) throw invalid(arg) - locals.set(p.name, value) - references.push({ param: p.name, callerName: arg }) - }) - this.callDepth += 1 - const context: StepContext = { frame: this.nextFrame++, callPath: step.callPath ?? step.path } - if (header) { - this.frames.set(context.frame!, { saved: this.state.variables, header, call, references }) - this.state.variables = locals - } - const bodySteps = buildSteps(document.elements, [], context) - this.splice([...bodySteps, { ...context, path: step.path, text: name, kind: 'callEnd' }]) - const passed = header?.params - .map((p, i) => `${p.name} = ${p.dims ? call!.args[i].trim() : describeValue(locals.get(p.name)!)}`) - .join(', ') - this.state.lastTrace = passed ? `${name} -> ${passed}` : `${name} -> call` - } - - private executeCallEnd(step: SimStep): void { - this.callDepth -= 1 - this.splice([]) - this.state.lastTrace = `${step.text} -> return` - this.finishFrame(step) - this.state.notice = this.finishedIfAtEnd() - } - - /** `return` beendet das Unterprogramm sofort, im Hauptprogramm das ganze Programm. */ - private executeReturn(step: SimStep): void { - const frameNumber = step.frame ?? 0 - const expression = stripTrailingSemicolon(step.text).slice('return'.length).trim() - const frame = this.frames.get(frameNumber) - if (frame && expression !== '') { - if (!frame.header.returnType) throw invalid(step.text) - frame.returnValue = this.evaluateExpression(expression, frame.header.returnType) - } - const trace = frame?.returnValue ? `${step.text} -> ${describeValue(frame.returnValue)}` : `${step.text} -> return` - if (frameNumber === 0) { - this.steps.splice(this.state.stepIndex) - this.state.lastTrace = trace - this.state.notice = { kind: 'finished' } - return - } - let end = this.state.stepIndex + 1 - while (end < this.steps.length && !(this.steps[end].kind === 'callEnd' && this.steps[end].frame === frameNumber)) end++ - const callEnd = this.steps[end] - this.steps.splice(this.state.stepIndex, end - this.state.stepIndex + 1) - this.callDepth -= 1 - this.state.lastTrace = trace - if (callEnd) this.finishFrame(callEnd) - this.state.notice = this.finishedIfAtEnd() - } - - /** Zurück beim Aufrufer: seine Variablen wiederherstellen und den Rückgabewert zuweisen. */ - private finishFrame(callEnd: SimStep): void { - const frame = this.frames.get(callEnd.frame ?? 0) - if (!frame) return - this.frames.delete(callEnd.frame ?? 0) - const restored = frame.references.length > 0 ? new Map(frame.saved) : frame.saved - for (const ref of frame.references) { - const value = this.state.variables.get(ref.param) - if (value) restored.set(ref.callerName, value) - } - this.state.variables = restored - const result = frame.returnValue - if (frame.header.returnType && !result) throw new SimulationError({ kind: 'missingReturn', text: frame.header.name }) - const target = frame.call?.target - if (!target || !result) return - let type = frame.call?.targetType - if (!type) { - try { - type = this.inferTargetValueType(target) - } catch { - type = frame.header.returnType! - } - } - const value = - type === 'double' && result.kind === 'int' ? dbl(result.value) - : type === 'string' ? { kind: 'string' as const, value: describeValue(result) } - : result - if (valueTypeOf(value) !== type) throw invalid(callEnd.text) - this.assignValue(value, target) - this.state.lastTrace = `${target} = ${callEnd.text.slice(callEnd.text.indexOf('=') + 1).trim()} -> ${describeValue(value)}` - } - - // MARK: Anweisungen - - /** Die letzte Anweisung war eine Ausgabe (für die Frage einer folgenden Eingabe). */ - private afterOutput = false - - private executeStatement(rawText: string): void { - const state = this.state - const text = rawText.trim() - const lower = text.toLowerCase() - const afterOutput = this.afterOutput - this.afterOutput = false - if (lower.startsWith('input:')) { - state.inputRequest = this.parseInputRequest(text, afterOutput) - // Mit Enter endet die Zeile. - state.outputLineOpen = false - state.inputErrorNotice = undefined - return - } - - // `System.out.print(…)` schreibt ohne neue Zeile, `System.out.println(…)` wie `output:`. - const javaOut = /^System\s*\.\s*out\s*\.\s*(println|print)\s*\(([\s\S]*)\)\s*;?$/u.exec(text) - if (lower.startsWith('output:') || lower.startsWith('print:') || javaOut) { - const expression = javaOut ? javaOut[2] : text.slice(lower.startsWith('output:') ? 'output:'.length : 'print:'.length) - const rendered = this.peek(() => this.renderOutputExpression(expression)) - // `println()` ohne Text: nur eine neue Zeile. - const output = expression.trim() === '' ? '' : this.evaluateOutputExpression(expression) - // `\n` im Text beginnt eine neue Zeile; `print("…\n")` endet wie `println("…")`. - const print = javaOut?.[1] === 'print' - const endsLine = print && output.endsWith('\n') - const [first, ...rest] = (endsLine ? output.slice(0, -1) : output).split('\n') - if (state.outputLineOpen && state.outputLines.length) state.outputLines[state.outputLines.length - 1] += first - else state.outputLines.push(first) - state.outputLines.push(...rest) - state.outputLineOpen = print && !endsLine - this.afterOutput = true - state.lastTrace = `${rendered} -> ${output}` - return - } - - const robot = parseMBotCommand(text) - if (robot) { - this.executeMBotCommand(robot.method, robot.args, text) - return - } - - if (this.executeFileStatement(text)) return - - if (text.endsWith('++') || text.endsWith('--') || text.includes('+=') || text.includes('-=')) { - this.executeIncrement(text) - return - } - - // `boolean fertig;` oder `int a, b;`: Variable ohne Startwert, sie bekommt den Standardwert wie ein Java-Attribut. - const declared = /^(?:final\s+)?([A-Za-z]+)\s+([A-Za-z_]\w*(?:\s*,\s*[A-Za-z_]\w*)*)$/u.exec(stripTrailingSemicolon(text).trim()) - const declaredType = declared ? valueTypeKeyword(declared[1]) : undefined - if (declared && declaredType) { - const names = declared[2].split(',').map((n) => n.trim()) - for (const name of names) state.variables.set(name, elementValue(declaredType, elementDefault(declaredType))) - state.lastTrace = names.map((n) => `${n} = ${describeValue(state.variables.get(n)!)}`).join(', ') - return - } - - const equalsIndex = text.indexOf('=') - if (equalsIndex < 0) throw unsupported(text) - const left = text.slice(0, equalsIndex).trim() - const expression = text.slice(equalsIndex + 1) - const array = this.parseArrayDeclaration(left, expression) - if (array) { - state.variables.set(array.name, array.value) - state.lastTrace = `${array.name} = new ${array.typeName}[${array.count}]` - return - } - - const target = this.parseAssignmentTarget(left) - let rendered: string - try { - rendered = this.peek(() => this.renderNumericExpression(expression)) - } catch { - rendered = expression.trim() - } - let targetType = target.valueType - if (!targetType) { - try { - targetType = this.inferTargetValueType(target.variableName) - } catch { - targetType = 'int' - } - } - const value = this.evaluateExpression(expression, targetType) - this.assignValue(value, target.variableName) - state.lastTrace = `${target.variableName} = ${rendered} -> ${describeValue(value)}` - } - - /** `mbot.forward(10)`: Befehl merken; die VisuBot-Welt (und später der echte Roboter) fährt damit. */ - private executeMBotCommand(method: string, args: string[], text: string): void { - // `mbot.showText("Abstand: " + mbot.getDistance())`: Text wie bei System.out.println - if (MBOT_COMMANDS[method]?.text) { - const spec = MBOT_COMMANDS[method] - if (args.length !== spec.args + 1) throw invalid(text) - const numbers = mbotArguments(method, args.slice(0, -1).map((a) => this.evaluateDouble(a))) - if (!numbers) throw invalid(text) - const action = makeMBotAction(method, numbers, this.evaluateOutputExpression(args[args.length - 1])) - const choices = spec.choices - if (choices && !choices.includes(action.text ?? '')) throw invalid(`${text} (${choices.join(', ')})`) - this.state.robotActions.push(action) - this.state.lastTrace = `${text} -> ${action.label}` - return - } - // Überladung `mbot.forward(2, "Umdrehungen")`: gleicher Name, zweiter Parameter ist die Einheit - if ((method === 'forward' || method === 'backward') && args.length === 2) { - const unit = this.evaluateOutputExpression(args[1]) - const action = makeMBotDriveAction(method, this.evaluateDouble(args[0]), unit) - if (!action) throw invalid(`${text} (${MBOT_DRIVE_UNITS.map((u) => `"${u}"`).join(', ')})`) - this.state.robotActions.push(action) - this.state.lastTrace = `${text} -> ${action.label}` - return - } - const values = mbotArguments(method, args.map((a) => this.evaluateDouble(a))) - if (!values) throw invalid(text) - const action = makeMBotAction(method, values) - this.state.robotActions.push(action) - this.state.lastTrace = `${text} -> ${action.label}` - } - - /** - * Dateien: `Scanner datei = new Scanner(new File("a.txt"))`, `new BufferedReader(new FileReader(…))`, - * `new PrintWriter("a.txt")`, `aus.println(…)`, `aus.print(…)`, `x.close()` und `Files.writeString(Path.of(…), text)`. - */ - private executeFileStatement(text: string): boolean { - const state = this.state - const statement = stripTrailingSemicolon(text).trim() - const made = /^(?:(Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*new\s+(Scanner|BufferedReader|PrintWriter)\s*\(([\s\S]*)\)$/u.exec(statement) - if (made) { - const [, declared, name, className, inner] = made - if (declared && declared !== className) throw invalid(statement) - const source = - className === 'Scanner' ? /^new\s+File\s*\(([\s\S]+)\)$/u.exec(inner.trim()) - : className === 'BufferedReader' ? /^new\s+FileReader\s*\(([\s\S]+)\)$/u.exec(inner.trim()) - : /^(?:new\s+(?:File|FileWriter)\s*\(([\s\S]+)\)|([\s\S]+))$/u.exec(inner.trim()) - if (!source) throw unsupported(statement) - const file = this.fileNameValue(source[1] ?? source[2]) - if (className === 'PrintWriter') { - state.variables.set(name, { kind: 'writer', file, text: '' }) - } else { - const content = this.fileContent(file) - const lines = content.split(/\r?\n/u) - if (lines[lines.length - 1] === '') lines.pop() - state.variables.set(name, { kind: 'reader', className: className as 'Scanner', file, lines, next: 0 }) - } - state.lastTrace = `${name} = new ${className}(${file})` - return true - } - const files = /^Files\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(([^()]+)\)\s*,([\s\S]+)\)$/u.exec(statement) - if (files) { - const file = this.fileNameValue(files[1]) - const content = this.evaluateOutputExpression(files[2]) - state.files.set(file, content) - state.lastTrace = `${file} ← ${JSON.stringify(content)}` - return true - } - const call = /^([A-Za-z_]\w*)\s*\.\s*(println|print|close)\s*\(([\s\S]*)\)$/u.exec(statement) - const object = call && state.variables.get(call[1]) - if (!call || !object) return false - if (object.kind === 'null') throw new SimulationError({ kind: 'nullValue', text: call[1] }) - if (object.kind === 'reader' && call[2] === 'close') { - state.lastTrace = `${call[1]}.close()` - return true - } - if (object.kind !== 'writer') return false - if (call[2] === 'close') { - state.files.set(object.file, object.text) - state.lastTrace = `${object.file} ← ${JSON.stringify(object.text)}` - return true - } - const value = call[3].trim() === '' ? '' : this.evaluateOutputExpression(call[3]) - const added = call[2] === 'println' ? value + '\n' : value - state.variables.set(call[1], { ...object, text: object.text + added }) - state.lastTrace = `${call[1]}.${call[2]}(${JSON.stringify(value)})` - return true - } - - /** Name einer Datei: `"a.txt"` oder eine String-Variable. */ - private fileNameValue(text: string): string { - const trimmed = text.trim() - const literal = unquotedString(trimmed) - if (literal !== undefined) return literal - const ref = this.evaluateReference(trimmed) - if (ref?.kind === 'string') return ref.value - throw invalid(trimmed) - } - - /** Inhalt einer Datei: zuerst, was das Programm geschrieben hat, sonst die Datei der Lektion. */ - private fileContent(name: string): string { - const content = this.state.files.get(name) ?? textFiles.get(name) - if (content === undefined) throw new SimulationError({ kind: 'fileNotFound', text: name }) - return content - } - - /** `datei.hasNextLine()`, `datei.nextLine()` und `leser.readLine()`. */ - private readerMethod(name: string, reader: SimValue & { kind: 'reader' }, call: { method: string; args: string[] }, text: string): SimValue | undefined { - if (call.args.length) throw invalid(text) - const left = reader.next < reader.lines.length - if (call.method === 'hasNextLine' && reader.className === 'Scanner') return { kind: 'boolean', value: left } - const reads = (call.method === 'nextLine' && reader.className === 'Scanner') || (call.method === 'readLine' && reader.className === 'BufferedReader') - if (!reads) return undefined - let value: SimValue - if (left) value = { kind: 'string', value: reader.lines[reader.next] } - else if (reader.className === 'BufferedReader') value = { kind: 'null' } - else throw new SimulationError({ kind: 'endOfFile', text: reader.file }) - if (!this.peeking) this.state.variables.set(name, { ...reader, next: Math.min(reader.next + 1, reader.lines.length) }) - return value - } - - private peek(render: () => T): T { - this.peeking = true - try { - return render() - } finally { - this.peeking = false - } - } - - private executeIncrement(text: string): void { - const vars = this.state.variables - for (const [suffix, sign] of [['++', 1], ['--', -1]] as const) { - if (!text.endsWith(suffix)) continue - const name = text.slice(0, -2).trim() - const old = vars.get(name) - if (!isIdentifier(name) || !old) throw unsupported(text) - const op = sign > 0 ? '+' : '-' - if (old.kind === 'int') { - vars.set(name, int(old.value + sign)) - this.state.lastTrace = `${name} = ${old.value} ${op} 1 -> ${old.value + sign}` - return - } - if (old.kind === 'double') { - const result = old.value + sign - vars.set(name, dbl(result)) - this.state.lastTrace = `${name} = ${describeValue(old)} ${op} 1 -> ${describeValue(dbl(result))}` - return - } - throw unsupported(text) - } - - for (const [operator, sign] of [['+=', 1], ['-=', -1]] as const) { - const at = text.indexOf(operator) - if (at < 0) continue - const name = text.slice(0, at).trim() - const rhs = text.slice(at + 2) - const old = vars.get(name) - if (!isIdentifier(name) || !old) throw unsupported(text) - const op = sign > 0 ? '+' : '-' - if (old.kind === 'int') { - const amount = this.evaluateInt(rhs) - const result = old.value + sign * amount - vars.set(name, int(result)) - this.state.lastTrace = `${name} = ${old.value} ${op} ${amount} -> ${result}` - return - } - if (old.kind === 'double') { - const amount = this.evaluateDouble(rhs) - const result = old.value + sign * amount - vars.set(name, dbl(result)) - this.state.lastTrace = `${name} = ${describeValue(old)} ${op} ${describeValue(dbl(amount))} -> ${describeValue(dbl(result))}` - return - } - throw unsupported(text) - } - - this.executeStatement(text) - } - - private parseAssignmentTarget(text: string): { variableName: string; valueType?: SimValueType } { - // Ein Arrayfach darf Leerzeichen im Index haben: `karten[i + 1] = hilf`. - if (parseArrayElementAccess(text)) return { variableName: text.trim() } - const parts = text.split(/\s+/u).filter(Boolean) - let name: string - let valueType: SimValueType | undefined - if (parts.length === 1) { - name = parts[0] - } else if (parts.length === 2 && valueTypeKeyword(parts[0])) { - name = parts[1] - valueType = valueTypeKeyword(parts[0]) - } else if (parts.length === 3 && parts[0] === 'const' && valueTypeKeyword(parts[1])) { - name = parts[2] - valueType = valueTypeKeyword(parts[1]) - } else { - throw unsupported(text) - } - if (!isAssignableTarget(name)) throw unsupported(text) - return { variableName: name, valueType } - } - - /** - * Ohne eigene Frage steht `name:` vor der Eingabe. Kommt direkt davor eine Ausgabe, fragt diese schon (wie in Java, - * z. B. `System.out.println("Note für Fach " + fach[i])`): Dann steht nichts davor, nach `System.out.print(…)` steht - * die Eingabe in derselben Zeile. - */ - private parseInputRequest(text: string, afterOutput = false): InputRequest { - const afterColon = text.slice('input:'.length).trim() - // Wie Swift `split(maxSplits: 2)`: zwei Wörter, dann der Rest. - const match = /^(\S+)(?:\s+(\S+))?(?:\s+([\s\S]*))?$/u.exec(afterColon) - if (!match) throw unsupported(text) - const parts = [match[1], match[2], match[3]].filter((p): p is string => p !== undefined) - let target: string - let valueType: SimValueType - let promptRaw: string - const explicitType = valueTypeKeyword(parts[0]) - if (parts.length >= 2 && explicitType) { - target = parts[1] - valueType = explicitType - promptRaw = (parts[2] ?? '').trim() - } else { - target = parts[0] - valueType = this.inferTargetValueType(target) - promptRaw = (parts[1] ?? '').trim() - } - if (!isAssignableTarget(target)) throw unsupported(text) - const prompt = unquotedString(promptRaw) ?? promptRaw - if (prompt === '' && afterOutput) { - return this.state.outputLineOpen ? { variableName: target, valueType, prompt: '', continuesLine: true } : { variableName: target, valueType, prompt: '' } - } - return { variableName: target, valueType, prompt: prompt === '' ? `${target}:` : prompt } - } - - private parseArrayDeclaration( - left: string, - expression: string, - ): { name: string; typeName: string; count: number | string; value: SimValue } | undefined { - const leftParts = left.split(/\s+/u).filter(Boolean) - if (leftParts.length !== 2 || !leftParts[0].endsWith('[]')) return undefined - const twoDimensional = leftParts[0].endsWith('[][]') - const typeName = leftParts[0].slice(0, twoDimensional ? -4 : -2) - const valueType = valueTypeKeyword(typeName) - const name = leftParts[1] - if (!valueType || !isIdentifier(name)) throw unsupported(left) - if (twoDimensional) return this.parseGridDeclaration(name, typeName, valueType, expression) - - const trimmed = expression.trim() - if (trimmed.startsWith('{') && trimmed.endsWith('}')) { - const items = trimmed.slice(1, -1).split(',').map((s) => s.trim()) - let value: SimValue - switch (valueType) { - case 'int': - value = { kind: 'intArray', value: items.map((i) => this.evaluateInt(i)) } - break - case 'double': - value = { kind: 'doubleArray', value: items.map((i) => this.evaluateDouble(i)) } - break - case 'string': - value = { kind: 'stringArray', value: items.map((i) => unquotedString(i) ?? this.evaluateOutputExpression(i)) } - break - case 'boolean': - value = { kind: 'booleanArray', value: items.map((i) => this.evaluateBool(i)) } - break - } - return { name, typeName, count: items.length, value } - } - - const prefix = `new ${typeName}[` - if (!trimmed.startsWith(prefix)) { - // z. B. `String[] woerter = satz.split(" ")` - const value = this.evaluateStringMethod(trimmed) - if (value?.kind === 'stringArray' && valueType === 'string') return { name, typeName, count: value.value.length, value } - } - if (!trimmed.startsWith(prefix) || !trimmed.endsWith(']')) throw unsupported(expression) - const sizeExpression = trimmed.slice(prefix.length, -1) - const count = this.evaluateInt(sizeExpression) - if (count < 0) throw invalid(sizeExpression) - const value: SimValue = - valueType === 'int' - ? { kind: 'intArray', value: new Array(count).fill(0) } - : valueType === 'double' - ? { kind: 'doubleArray', value: new Array(count).fill(0) } - : valueType === 'boolean' - ? { kind: 'booleanArray', value: new Array(count).fill(false) } - : { kind: 'stringArray', value: new Array(count).fill('') } - return { name, typeName, count, value } - } - - /** `int[][] a = new int[3][4]` oder `int[][] a = {{1, 2}, {3, 4}}`. */ - private parseGridDeclaration( - name: string, - typeName: string, - elementType: SimValueType, - expression: string, - ): { name: string; typeName: string; count: number | string; value: SimValue } { - const trimmed = expression.trim() - const element = (text: string): number | string | boolean => { - switch (elementType) { - case 'int': return this.evaluateInt(text) - case 'double': return this.evaluateDouble(text) - case 'boolean': return this.evaluateBool(text) - case 'string': return unquotedString(text.trim()) ?? this.evaluateOutputExpression(text) - } - } - if (trimmed.startsWith('{') && trimmed.endsWith('}')) { - const rows = splitTopLevelBraces(trimmed.slice(1, -1)).map((row) => { - const r = row.trim() - if (!r.startsWith('{') || !r.endsWith('}')) throw invalid(r) - return r.slice(1, -1).trim() === '' ? [] : r.slice(1, -1).split(',').map((x) => element(x.trim())) - }) - return { name, typeName, count: `${rows.length}][${rows[0]?.length ?? 0}`, value: { kind: 'grid', elementType, value: rows } } - } - const g = new RegExp(String.raw`^new\s+${typeName}\s*\[(.+)\]\s*\[(.+)\]$`, 'u').exec(trimmed) - if (!g) throw unsupported(expression) - const rows = this.evaluateInt(g[1]) - const columns = this.evaluateInt(g[2]) - if (rows < 0) throw invalid(g[1]) - if (columns < 0) throw invalid(g[2]) - const value: SimValue = { - kind: 'grid', - elementType, - value: Array.from({ length: rows }, () => new Array(columns).fill(elementDefault(elementType))), - } - return { name, typeName, count: `${rows}][${columns}`, value } - } - - private arrayIndex(expression: string): number { - const index = this.evaluateInt(expression) - if (index < 0) throw invalid(expression) - return index - } - - private evaluateReference(text: string): SimValue | undefined { - const trimmed = text.trim() - const direct = this.state.variables.get(trimmed) - if (direct) return direct - const call = this.evaluateStringMethod(trimmed) - if (call) return call - // `(char) code` wie in Java: aus dem Zeichencode wird wieder ein Zeichen - const charCast = /^\(\s*char\s*\)\s*(.+)$/su.exec(trimmed) - if (charCast) { - const code = this.evaluateInt(charCast[1]) - if (!(code >= 0 && code <= 0x10ffff)) throw invalid(trimmed) - return { kind: 'string', value: String.fromCodePoint(code) } - } - const access = parseArrayElementAccess(trimmed) - if (!access) return undefined - return this.valueInArray(access.arrayName, access.indexExpressions.map((e) => this.arrayIndex(e))) - } - - /** - * String-Methoden wie in Java: `wort.length()`, `wort.charAt(i)`, `wort.substring(a, b)`, `wort.indexOf("x")`, - * `wort.toUpperCase()`, `wort.toLowerCase()`, `wort.trim()`, `wort.contains("x")`, `wort.startsWith("x")`, - * `wort.endsWith("x")`, `wort.replace("a", "b")`, `satz.split(" ")`, `wort.lastIndexOf("x")`, `wort.isEmpty()`, - * `wort.equalsIgnoreCase("x")`, `wort.compareTo("x")`, `wort.repeat(3)`, `wort.concat("x")`, dazu - * `Integer.parseInt("12")`, `Double.parseDouble("1.5")`, `String.valueOf(12)` und - * `Files.readString(Path.of("brief.txt"))`. Sonst `undefined`. - */ - private evaluateStringMethod(text: string): SimValue | undefined { - const call = parseMethodCall(text) - if (!call) return undefined - const staticValue = this.evaluateStaticCall(text, call) - if (staticValue) return staticValue - const object = this.state.variables.get(call.target.trim()) - if (object?.kind === 'reader') return this.readerMethod(call.target.trim(), object, call, text) - if (object?.kind === 'null') throw new SimulationError({ kind: 'nullValue', text: call.target.trim() }) - const target = unquotedString(call.target) ?? this.stringValueOf(call.target) - if (target === undefined) return undefined - const args = call.args - const str = (i: number) => { - const a = args[i] - if (a === undefined) throw invalid(text) - const literal = unquotedString(a.trim()) - if (literal !== undefined) return literal - const ref = this.evaluateReference(a) - if (ref?.kind === 'string') return ref.value - throw invalid(a) - } - const num = (i: number) => { - if (args[i] === undefined) throw invalid(text) - return this.evaluateInt(args[i]) - } - const count = (n: number) => { - if (args.length !== n) throw invalid(text) - } - const chars = Array.from(target) - const index = (i: number, max: number) => { - if (i < 0 || i > max) throw invalid(text) - return i - } - switch (call.method) { - case 'length': - count(0) - return int(chars.length) - case 'charAt': - count(1) - return { kind: 'string', value: chars[index(num(0), chars.length - 1)] } - case 'substring': { - if (args.length !== 1 && args.length !== 2) throw invalid(text) - const begin = index(num(0), chars.length) - const end = args.length === 2 ? index(num(1), chars.length) : chars.length - if (end < begin) throw invalid(text) - return { kind: 'string', value: chars.slice(begin, end).join('') } - } - case 'indexOf': - case 'lastIndexOf': { - if (args.length !== 1 && args.length !== 2) throw invalid(text) - // Die Stelle zählt wie in Java in Zeichen, nicht in UTF-16-Einheiten. - const from = args.length === 2 ? Array.from(target).slice(0, Math.max(0, num(1))).join('').length : undefined - const found = call.method === 'indexOf' ? target.indexOf(str(0), from) : target.lastIndexOf(str(0), from) - return int(found < 0 ? -1 : Array.from(target.slice(0, found)).length) - } - case 'isEmpty': - count(0) - return { kind: 'boolean', value: chars.length === 0 } - case 'equalsIgnoreCase': - count(1) - return { kind: 'boolean', value: target.toLowerCase() === str(0).toLowerCase() } - case 'compareTo': { - // Wie Java: Unterschied der ersten verschiedenen Zeichen, sonst der Längen. - count(1) - const other = Array.from(str(0)) - for (let i = 0; i < Math.min(chars.length, other.length); i++) { - if (chars[i] !== other[i]) return int(chars[i].codePointAt(0)! - other[i].codePointAt(0)!) - } - return int(chars.length - other.length) - } - case 'repeat': { - count(1) - const times = num(0) - if (times < 0) throw invalid(text) - return { kind: 'string', value: target.repeat(times) } - } - case 'concat': - count(1) - return { kind: 'string', value: target + str(0) } - case 'toUpperCase': - count(0) - return { kind: 'string', value: target.toUpperCase() } - case 'toLowerCase': - count(0) - return { kind: 'string', value: target.toLowerCase() } - case 'trim': - count(0) - return { kind: 'string', value: target.trim() } - case 'contains': - count(1) - return { kind: 'boolean', value: target.includes(str(0)) } - case 'startsWith': - count(1) - return { kind: 'boolean', value: target.startsWith(str(0)) } - case 'endsWith': - count(1) - return { kind: 'boolean', value: target.endsWith(str(0)) } - case 'replace': - count(2) - return { kind: 'string', value: target.replaceAll(str(0), str(1)) } - case 'split': { - count(1) - const separator = str(0) - // Wie Java: leere Teile am Ende fallen weg. - const parts = separator === '' ? chars : target.split(separator) - while (parts.length > 0 && parts[parts.length - 1] === '') parts.pop() - return { kind: 'stringArray', value: parts } - } - default: - return undefined - } - } - - /** - * `Integer.parseInt(…)`, `Double.parseDouble(…)`, `String.valueOf(…)`, `Files.readString(Path.of(…))`, - * `Arrays.toString(…)` und `Arrays.deepToString(…)`. - */ - private evaluateStaticCall(text: string, call: { target: string; method: string; args: string[] }): SimValue | undefined { - const one = () => { - if (call.args.length !== 1) throw invalid(text) - return call.args[0] - } - const stringArg = (a: string) => { - const literal = unquotedString(a.trim()) - if (literal !== undefined) return literal - const ref = this.evaluateReference(a) - if (ref?.kind === 'string') return ref.value - throw invalid(a) - } - switch (`${call.target}.${call.method}`) { - case 'Integer.parseInt': { - const digits = stringArg(one()).trim() - if (!/^[+-]?\d+$/u.test(digits)) throw new SimulationError({ kind: 'wholeNumberExpected' }) - return int(Number(digits)) - } - case 'Double.parseDouble': { - const value = Number(stringArg(one()).trim()) - if (!Number.isFinite(value)) throw new SimulationError({ kind: 'numberExpected' }) - return dbl(value) - } - case 'String.valueOf': - return { kind: 'string', value: this.evaluateOutputExpression(one()) } - case 'Arrays.toString': - case 'Arrays.deepToString': { - const array = this.state.variables.get(one().trim()) - if (!array || !isArrayValue(array)) throw invalid(text) - // `Arrays.toString` zeigt bei einem 2D-Array nur die Referenzen der Zeilen, `deepToString` alles. - if (array.kind === 'grid' && call.method === 'toString') { - const rows = array.value.map((row) => javaReference({ kind: `${array.elementType}Array`, value: row } as SimValue)) - return { kind: 'string', value: '[' + rows.join(', ') + ']' } - } - return { kind: 'string', value: describeValue(array) } - } - case 'Files.readString': { - const path = /^(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)$/u.exec(one().trim()) - if (!path) throw invalid(text) - const name = unquotedString(path[1])! - const content = textFiles.get(name) - if (content === undefined) throw new SimulationError({ kind: 'fileNotFound', text: name }) - return { kind: 'string', value: content } - } - default: - return undefined - } - } - - /** Wert einer String-Variablen oder eines String-Fachs; sonst `undefined`. */ - private stringValueOf(text: string): string | undefined { - const trimmed = text.trim() - const direct = this.state.variables.get(trimmed) - if (direct) return direct.kind === 'string' ? direct.value : undefined - const access = parseArrayElementAccess(trimmed) - if (!access) return undefined - const value = this.valueInArray(access.arrayName, access.indexExpressions.map((e) => this.arrayIndex(e))) - return value.kind === 'string' ? value.value : undefined - } - - /** Setzt in einem Zahlenausdruck Aufrufe wie `wort.length()` oder `wort.indexOf("a")` als Zahl ein. */ - private substituteStringCalls(expression: string): string { - if (!expression.includes('(')) return expression - let result = '' - let rest = expression - const re = /([A-Za-z_]\w*(?:\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*(length|indexOf|lastIndexOf|compareTo|charAt|parseInt|parseDouble)\s*\(/u - for (let m = re.exec(rest); m; m = re.exec(rest)) { - const open = m.index + m[0].length - 1 - const close = matchingCloseParenthesis(Array.from(rest), Array.from(rest.slice(0, open)).length) - if (close === undefined) break - const chars = Array.from(rest) - const callText = chars.slice(Array.from(rest.slice(0, m.index)).length, close + 1).join('') - const value = this.evaluateStringMethod(callText) - const before = chars.slice(0, Array.from(rest.slice(0, m.index)).length).join('') - // Mit `wort.charAt(i)` wird wie in Java über den Zeichencode gerechnet. - const code = value?.kind === 'string' ? charCode(value.value) : undefined - if (value?.kind === 'int') { - result += before + String(value.value) - } else if (value?.kind === 'double') { - // `Double.parseDouble("7")` bleibt eine Kommazahl, damit `/ 2` nicht ganzzahlig teilt. - result += before + (Number.isInteger(value.value) ? value.value.toFixed(1) : String(value.value)) - } else if (code !== undefined) { - result += before + String(code) - } else { - result += before + callText - } - rest = chars.slice(close + 1).join('') - } - return result + rest - } - - private valueInArray(name: string, indices: number[]): SimValue { - const value = this.state.variables.get(name) - if (!value) throw unknownVar(name, this.state.variables) - const at = `${name}[${indices.join('][')}]` - if (value.kind === 'grid') { - if (indices.length !== 2) throw invalid(at) - const row = value.value[indices[0]] - if (!row || indices[1] >= row.length) throw invalid(at) - return elementValue(value.elementType, row[indices[1]]) - } - if (indices.length !== 1) throw invalid(at) - const index = indices[0] - if (!isArrayValue(value)) throw invalid(name) - if (index >= ((value as { value: unknown[] }).value).length) throw invalid(at) - switch (value.kind) { - case 'intArray': return int(value.value[index]) - case 'doubleArray': return dbl(value.value[index]) - case 'stringArray': return { kind: 'string', value: value.value[index] } - case 'booleanArray': return { kind: 'boolean', value: value.value[index] } - default: throw invalid(name) - } - } - - private inferTargetValueType(target: string): SimValueType { - const trimmed = target.trim() - const direct = this.state.variables.get(trimmed) - if (direct) return valueTypeOf(direct) - const access = parseArrayElementAccess(trimmed) - if (access) { - const value = this.state.variables.get(access.arrayName) - if (!value) throw unknownVar(access.arrayName, this.state.variables) - if (value.kind === 'intArray') return 'int' - if (value.kind === 'doubleArray') return 'double' - if (value.kind === 'stringArray') return 'string' - if (value.kind === 'booleanArray') return 'boolean' - if (value.kind === 'grid') return value.elementType - throw invalid(access.arrayName) - } - throw unsupported(target) - } - - private assignValue(value: SimValue, target: string): void { - const trimmed = target.trim() - const access = parseArrayElementAccess(trimmed) - if (!access) { - this.state.variables.set(trimmed, value) - return - } - const indices = access.indexExpressions.map((e) => this.arrayIndex(e)) - const old = this.state.variables.get(access.arrayName) - if (!old) throw unknownVar(access.arrayName, this.state.variables) - if (old.kind === 'grid') { - if (indices.length !== 2 || indices[0] >= old.value.length || indices[1] >= old.value[indices[0]].length) throw invalid(trimmed) - const raw = old.elementType === 'double' && value.kind === 'int' ? value.value : value.kind === old.elementType ? value.value : undefined - if (raw === undefined || isArrayValue(value)) throw invalid(trimmed) - const rows = old.value.map((row) => [...row]) - rows[indices[0]][indices[1]] = raw as number | string | boolean - keepArrayId(old.value, rows) - this.state.variables.set(access.arrayName, { ...old, value: rows }) - return - } - if (indices.length !== 1) throw invalid(trimmed) - const index = indices[0] - let updated: SimValue - if (old.kind === 'intArray' && value.kind === 'int') { - updated = { kind: 'intArray', value: [...old.value] } - } else if (old.kind === 'doubleArray' && (value.kind === 'double' || value.kind === 'int')) { - updated = { kind: 'doubleArray', value: [...old.value] } - } else if (old.kind === 'stringArray' && value.kind === 'string') { - updated = { kind: 'stringArray', value: [...old.value] } - } else if (old.kind === 'booleanArray' && value.kind === 'boolean') { - updated = { kind: 'booleanArray', value: [...old.value] } - } else { - throw invalid(trimmed) - } - if (index >= (updated.value as unknown[]).length) throw invalid(trimmed) - ;(updated.value as unknown[])[index] = value.value - keepArrayId(old.value, updated.value) - this.state.variables.set(access.arrayName, updated) - } - - // MARK: Ausdrücke - - /** Wie Java von links nach rechts: Zahlen werden addiert, bis ein Text kommt; ab dann wird alles angehängt. */ - private evaluateOutputExpression(expression: string): string { - // `System.out.println(x + 1 > 3)`: ohne Text ist die ganze Klammer eine Bedingung und ergibt true oder false. - const whole = this.withSensors(expression).trim() - if (looksBoolean(whole) && splitByPlusOutsideQuotes(whole).every((p) => unquotedString(p.trim()) === undefined) && !this.evaluateReference(whole)) { - return String(this.evaluateBool(whole)) - } - let sum: SimValue | undefined - let text: string | undefined - // `mbot.getColor()` wird zu einem Text wie "rot" - for (const part of splitByPlusOutsideQuotes(this.withSensors(expression))) { - const trimmed = part.trim() - const literal = unquotedString(trimmed) - const value: SimValue = - literal !== undefined ? { kind: 'string', value: literal } - : (this.evaluateReference(trimmed) ?? (looksBoolean(trimmed) ? { kind: 'boolean', value: this.evaluateBool(trimmed) } : this.evaluateNumeric(trimmed))) - const isNumber = value.kind === 'int' || value.kind === 'double' - if (text === undefined && isNumber) { - if (!sum) sum = value - else sum = sum.kind === 'int' && value.kind === 'int' ? int(sum.value + value.value) : dbl((sum as { value: number }).value + (value as { value: number }).value) - continue - } - // Ein ganzes Array gibt Java nur als Referenz aus, z. B. `[I@1b6d3586`. - text = (text ?? (sum ? describeValue(sum) : '')) + javaReference(value) - sum = undefined - } - return text ?? (sum ? describeValue(sum) : '') - } - - private renderOutputExpression(expression: string): string { - return splitByPlusOutsideQuotes(expression) - .map((part) => { - const trimmed = part.trim() - if (unquotedString(trimmed) !== undefined) return trimmed - const ref = this.evaluateReference(trimmed) - if (ref) return describeValue(ref) - try { - return this.renderNumericExpression(trimmed) - } catch { - return trimmed - } - }) - .join(' + ') - } - - private evaluateExpression(expression: string, valueType: SimValueType): SimValue { - switch (valueType) { - case 'int': - return int(this.evaluateInt(expression)) - case 'double': - return dbl(this.evaluateDouble(expression)) - case 'string': { - const trimmed = expression.trim() - const literal = unquotedString(trimmed) - if (literal !== undefined) return { kind: 'string', value: literal } - if (trimmed === 'null') return { kind: 'null' } - const ref = this.evaluateReference(trimmed) - if (ref?.kind === 'null') return ref - if (ref) return { kind: 'string', value: describeValue(ref) } - return { kind: 'string', value: this.evaluateOutputExpression(expression) } - } - case 'boolean': - return { kind: 'boolean', value: this.evaluateBool(expression) } - } - } - - private evaluateNumeric(expression: string): SimValue { - const { v: value, int: isInt } = this.parser(expression).parseNumber() - return isInt || (Number.isFinite(value) && Math.round(value) === value) ? int(value) : dbl(value) - } - - private parser(expression: string): NumericParser { - const sensors = this.withSensors(expression) - return new NumericParser(tokenize(normalizeNumericExpression(this.substituteStringCalls(sensors))), this.state.variables) - } - - /** mBot2-Sensoren durch ihre Werte ersetzen (echter Roboter, Welt oder Regler, sonst der Standardwert). */ - private withSensors(expression: string): string { - return substituteMBotSensors(expression, (name) => this.robotSensors[name] ?? MBOT_SENSORS[name].simulated) - } - - private evaluateInt(expression: string): number { - return this.parser(expression).parseInt() - } - - private evaluateDouble(expression: string): number { - return this.parser(expression).parseDouble() - } - - /** Bedingungen wie in Java: `||` vor `&&` vor `!`, Klammern, Vergleiche von Zahlen und Strings, `a.equals(b)`. */ - private evaluateBool(expression: string): boolean { - // `mbot.isButtonA()` wird zu `true`/`false`, `mbot.getDistance()` zu einer Zahl - const trimmed = this.withSensors(expression).trim() - if (trimmed === 'true') return true - if (trimmed === 'false') return false - const ref = this.evaluateReference(trimmed) - if (ref?.kind === 'boolean') return ref.value - - const orParts = splitTopLevel(trimmed, '||') - if (orParts.length > 1) return orParts.some((p) => this.evaluateBool(p)) - - const andParts = splitTopLevel(trimmed, '&&') - if (andParts.length > 1) return andParts.every((p) => this.evaluateBool(p)) - - if (trimmed.startsWith('!') && !trimmed.startsWith('!=')) return !this.evaluateBool(trimmed.slice(1)) - - const inner = innerOfOuterParentheses(trimmed) - if (inner !== undefined) return this.evaluateBool(inner) - - const call = parseEqualsCall(trimmed) - if (call) return this.evaluateComparison(call.lhs, '==', call.rhs) - - const comparison = splitComparison(trimmed) - if (comparison) return this.evaluateComparison(comparison.lhs, comparison.op, comparison.rhs) - - if (this.stringOperand(trimmed) !== undefined) throw invalid(trimmed) - return this.evaluateDouble(trimmed) !== 0 - } - - private evaluateComparison(lhs: string, op: string, rhs: string): boolean { - if ((lhs.trim() === 'null' || rhs.trim() === 'null') && (op === '==' || op === '!=')) { - const isNull = (side: string) => side.trim() === 'null' || this.evaluateReference(side)?.kind === 'null' - const same = isNull(lhs) === isNull(rhs) - return op === '==' ? same : !same - } - const lb = this.booleanOperand(lhs) - const rb = this.booleanOperand(rhs) - if ((lb !== undefined || rb !== undefined) && (op === '==' || op === '!=')) { - const left = lb ?? this.evaluateBool(lhs) - const right = rb ?? this.evaluateBool(rhs) - return op === '==' ? left === right : left !== right - } - const ls = this.stringOperand(lhs) - const rs = this.stringOperand(rhs) - let left: string | number - let right: string | number - if (ls !== undefined || rs !== undefined) { - if (ls === undefined || rs === undefined) throw invalid(`${lhs} ${op} ${rhs}`) - left = ls - right = rs - } else { - left = this.evaluateDouble(lhs) - right = this.evaluateDouble(rhs) - } - switch (op) { - case '==': return left === right - case '!=': return left !== right - case '<': return left < right - case '<=': return left <= right - case '>': return left > right - case '>=': return left >= right - default: throw invalid(`${lhs} ${op} ${rhs}`) - } - } - - /** `true`, `false` oder eine boolean-Variable; sonst `undefined`. */ - private booleanOperand(text: string): boolean | undefined { - const trimmed = text.trim() - if (trimmed === 'true') return true - if (trimmed === 'false') return false - const ref = this.evaluateReference(trimmed) - return ref?.kind === 'boolean' ? ref.value : undefined - } - - /** String-Literal oder String-Variable (auch Element eines String-Arrays); sonst `undefined`. */ - private stringOperand(text: string): string | undefined { - const trimmed = text.trim() - const literal = unquotedString(trimmed) - if (literal !== undefined) return literal - const ref = this.evaluateReference(trimmed) - return ref?.kind === 'string' ? ref.value : undefined - } - - private evaluateSwitchSelector(selector: string): SwitchSelector { - const trimmed = this.withSensors(selector).trim() - const literal = unquotedString(trimmed) - if (literal !== undefined) return { kind: 'text', value: literal } - const variable = this.state.variables.get(trimmed) - if (variable) { - switch (variable.kind) { - case 'int': return { kind: 'int', value: variable.value } - case 'double': return { kind: 'int', value: Math.trunc(variable.value) } - case 'string': return { kind: 'text', value: variable.value } - default: throw invalid(trimmed) - } - } - if (/^[+-]?[0-9]+$/.test(trimmed)) return { kind: 'int', value: Number(trimmed) } - return { kind: 'int', value: this.evaluateInt(trimmed) } - } - - private renderNumericExpression(expression: string): string { - return tokenize(normalizeNumericExpression(expression)) - .map((token) => { - if (token.t === 'number') return token.literal - if (token.t === 'identifier') { - const value = this.state.variables.get(token.name) - if (!value) throw unknownVar(token.name, this.state.variables) - return describeValue(value) - } - return token.t - }) - .join(' ') - .replaceAll('( ', '(') - .replaceAll(' )', ')') - .replaceAll(' . ', '.') - .replaceAll('[ ', '[') - .replaceAll(' ]', ']') - } -} diff --git a/web/src/core/textMeasurement.ts b/web/src/core/textMeasurement.ts deleted file mode 100644 index 212da9e4..00000000 --- a/web/src/core/textMeasurement.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** Breitenmessung für Layout und Zeichnen — gleiche Systemschrift wie `DiagramCanvasView` (`.medium` / `.bold`). */ -export type FontWeight = 'medium' | 'bold' -export type MeasureText = (text: string, fontSize: number, weight: FontWeight) => number - -export const diagramFontFamily = 'system-ui, -apple-system, "Segoe UI", Roboto, sans-serif' - -export function fontCSS(fontSize: number, weight: FontWeight): string { - return `${weight === 'bold' ? 700 : 500} ${fontSize}px ${diagramFontFamily}` -} - -/** Fallback ohne Browser (Tests): wie der `#else`-Zweig in `VisuStructLayoutTextMeasurement.swift`. */ -export const approximateMeasure: MeasureText = (text, fontSize, weight) => - [...text].length * fontSize * (weight === 'bold' ? 0.68 : 0.62) - -/** - * Unsichtbares SVG-Textelement: misst mit genau der Schrift, mit der das Diagramm gezeichnet wird. - * Safari löst `system-ui` im Canvas anders auf als im SVG; Canvas-Breiten passten dort nicht zum Bild. - */ -function probeText(): SVGTextElement | undefined { - if (typeof document === 'undefined' || !document.body) return undefined - const ns = 'http://www.w3.org/2000/svg' - const svg = document.createElementNS(ns, 'svg') - svg.setAttribute('aria-hidden', 'true') - svg.setAttribute('width', '0') - svg.setAttribute('height', '0') - svg.style.cssText = 'position:absolute;left:-9999px;top:0;visibility:hidden;overflow:hidden' - const text = document.createElementNS(ns, 'text') - text.setAttribute('font-family', diagramFontFamily) - text.style.whiteSpace = 'pre' - svg.append(text) - document.body.append(svg) - if (typeof text.getComputedTextLength !== 'function' || typeof text.getBBox !== 'function') { - svg.remove() - return undefined - } - text.textContent = 'Mg' - text.setAttribute('font-size', '20') - if (!(text.getComputedTextLength() > 0)) { - svg.remove() - return undefined - } - return text -} - -let probe: SVGTextElement | null | undefined - -function sharedProbe(): SVGTextElement | undefined { - if (probe === undefined) probe = probeText() ?? null - return probe ?? undefined -} - -function setProbeFont(text: SVGTextElement, fontSize: number, weight: FontWeight) { - text.setAttribute('font-size', String(fontSize)) - text.setAttribute('font-weight', weight === 'bold' ? '700' : '500') -} - -/** Ober- und Unterlänge der Diagrammschrift (für Text, der oben oder unten an einer Linie sitzt). */ -export function fontExtents(fontSize: number, weight: FontWeight): { ascent: number; descent: number } { - const key = `${fontSize}|${weight}` - let e = extentsCache.get(key) - if (!e) { - const text = sharedProbe() - e = { ascent: fontSize * 0.95, descent: fontSize * 0.24 } - if (text) { - setProbeFont(text, fontSize, weight) - text.setAttribute('y', '0') - text.textContent = 'Mg' - const box = text.getBBox() - if (box.height > 0) e = { ascent: -box.y, descent: box.height + box.y } - } - extentsCache.set(key, e) - } - return e -} -const extentsCache = new Map() - -export function createCanvasMeasure(): MeasureText { - const svgText = sharedProbe() - if (svgText) { - const cache = new Map() - return (text, fontSize, weight) => { - const key = `${fontSize}|${weight}|${text}` - let w = cache.get(key) - if (w === undefined) { - setProbeFont(svgText, fontSize, weight) - svgText.textContent = text - w = text === '' ? 0 : svgText.getComputedTextLength() - if (cache.size > 2000) cache.clear() - cache.set(key, w) - } - return w - } - } - const ctx = typeof document !== 'undefined' ? document.createElement('canvas').getContext('2d') : null - if (!ctx) return approximateMeasure - const cache = new Map() - return (text, fontSize, weight) => { - const key = `${fontSize}|${weight}|${text}` - let w = cache.get(key) - if (w === undefined) { - ctx.font = fontCSS(fontSize, weight) - w = ctx.measureText(text).width - if (cache.size > 2000) cache.clear() - cache.set(key, w) - } - return w - } -} diff --git a/web/src/core/typeTypos.ts b/web/src/core/typeTypos.ts deleted file mode 100644 index 21f5fd1e..00000000 --- a/web/src/core/typeTypos.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** Vertippte Datentypen erkennen, für den Code-Editor (`javaParser`) und den VisuObject-Debugger (`miniJava`). */ - -const primitiveTypes = ['boolean', 'int', 'double', 'String', 'char', 'long', 'float', 'short', 'byte'] -/** Gültige Java-Typen, die einem Grundtyp ähneln (`Boolean`, `Integer`) und deshalb nie gemeldet werden. */ -const validTypes = new Set([...primitiveTypes, 'Boolean', 'Integer', 'Double', 'Character', 'Long', 'Float', 'Short', 'Byte', 'var', 'void']) - -/** Vertippter Grundtyp (`booelan`, `Int`, `string`) → richtige Schreibweise; sonst `undefined`. */ -export function similarType(word: string): string | undefined { - if (validTypes.has(word)) return undefined - const lower = word.toLowerCase() - for (const type of primitiveTypes) { - // Kurze Typen nur mit einem Fehler, sonst wäre eine Klasse `Kind` schon ein vertipptes `int`. - if (typoDistance(lower, type.toLowerCase()) <= (type.length >= 6 ? 2 : 1)) return type - } - return undefined -} - -/** Tippfehler-Abstand: Buchstabe fehlt, zu viel, falsch oder zwei vertauscht (Damerau-Levenshtein). */ -function typoDistance(a: string, b: string): number { - const d = Array.from({ length: a.length + 1 }, (_, i) => Array.from({ length: b.length + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))) - for (let i = 1; i <= a.length; i++) { - for (let j = 1; j <= b.length; j++) { - const cost = a[i - 1] === b[j - 1] ? 0 : 1 - d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost) - if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1) - } - } - return d[a.length][b.length] -} diff --git a/web/src/core/umlRelations.ts b/web/src/core/umlRelations.ts deleted file mode 100644 index baaef5c3..00000000 --- a/web/src/core/umlRelations.ts +++ /dev/null @@ -1,221 +0,0 @@ -/** - * VisuObject: Beziehungen im Klassendiagramm. - * Was Java kennt, steht im Code: ein Attribut vom Typ der anderen Klasse ist die Assoziation, - * sein Name die Rolle, eine Liste oder ein Array heißt „viele“. Was nur UML kennt - * (Aggregation, Komposition, Name mit Leserichtung, genaue Multiplizitäten, Rolle ohne Attribut) - * steht in `uml` am Projekt, Schlüssel `Klasse.attribut`. - */ - -import { associationTarget, relations, type UmlClass, type UmlMember } from './classModel' - -export type AssocKind = 'association' | 'aggregation' | 'composition' -/** Navigierbarkeit eines Endes: Pfeilspitze, Kreuz × oder ohne Kennzeichnung (offen). */ -export type EndNav = 'navigable' | 'non-navigable' | 'unspecified' - -/** Zusatz aus UML zu einem Attribut. */ -export interface AssocInfo { - kind?: AssocKind - name?: string - /** Leserichtung des Namens: von der Klasse mit dem Attribut zum Typ (Zugrichtung) oder zurück. */ - reading?: 'forward' | 'backward' - /** Ende beim Typ des Attributs; ohne Angabe navigierbar. */ - targetEnd?: EndNav - /** Ende bei der Klasse mit dem Attribut, wenn es dort kein Gegen-Attribut gibt; ohne Angabe offen. */ - sourceEnd?: EndNav - /** Alte Fassung: `false` hieß „ohne Pfeil“. */ - navigable?: boolean - multiplicity?: string - sourceMultiplicity?: string - /** Rolle am anderen Ende, wenn es dort kein Attribut gibt. */ - sourceRole?: string -} - -export type UmlInfo = Record - -/** Eine Assoziation im Diagramm: Attribut in `from`, evtl. das Gegenstück in `to` (beide Richtungen). */ -export interface Assoc { - key: string - from: string - to: string - kind: AssocKind - name?: string - reading?: 'forward' | 'backward' - /** Ende an `to`. */ - navTo: EndNav - /** Ende an `from`: navigierbar, wenn `to` ein Attribut vom Typ `from` hat. */ - navFrom: EndNav - role: string - multiplicity: string - sourceRole?: string - sourceMultiplicity?: string - field: UmlMember - back?: { key: string; field: UmlMember } -} - -export interface Generalization { - kind: 'extends' | 'implements' - from: string - to: string -} - -/** Abhängigkeit: Eine Methode erzeugt (`new X()`) oder benutzt eine Klasse, ohne sie in einem Attribut zu merken. */ -export interface Dependency { - from: string - to: string - kind: 'create' | 'use' - /** Methoden bzw. Konstruktoren, in denen das vorkommt. */ - methods: string[] -} - -/** Kommentare und Texte in Anführungszeichen ausblenden, damit `new Hund` im Kommentar nicht zählt. */ -const codeOnly = (text: string) => text.replace(/\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'/g, (m) => ' '.repeat(m.length)) - -/** - * Abhängigkeiten aus den Methoden: gestrichelter Pfeil «create» bei `new X(…)`, sonst «use», wenn der Typ vorkommt. - * Keine, wo schon eine Assoziation (Attribut) oder Vererbung von `from` zu `to` besteht. - */ -export function dependencies(classes: UmlClass[], textOf: (cls: UmlClass) => string | undefined): Dependency[] { - const names = classes.map((c) => c.name) - const out = new Map() - for (const cls of classes) { - const text = textOf(cls) - if (!text) continue - const code = codeOnly(text) - const known = new Set([cls.superclass, ...cls.interfaces, ...cls.members.filter((m) => m.kind === 'field' && !m.isStatic).map((m) => associationTarget(m.type).name)]) - for (const m of cls.members) { - if (m.kind === 'field') continue - const body = code.slice(m.from, m.to) - for (const other of names) { - if (other === cls.name || known.has(other)) continue - const word = new RegExp(`\\b${other}\\b`) - if (!word.test(body)) continue - const kind = new RegExp(`\\bnew\\s+${other}\\s*[(<\\[{]`).test(body) ? 'create' : 'use' - const key = `${cls.name}>${other}` - const dep = out.get(key) ?? { from: cls.name, to: other, kind, methods: [] } - if (kind === 'create') dep.kind = 'create' - const label = m.kind === 'constructor' ? `${m.name}()` : `${m.name}()` - if (!dep.methods.includes(label)) dep.methods.push(label) - out.set(key, dep) - } - } - } - return [...out.values()] -} - -export const multiplicities = ['1', '0..1', '0..*', '1..*', '*'] - -/** Obergrenze größer als 1: Dann gehört eine Liste in den Code. */ -export function isMany(multiplicity: string): boolean { - const upper = multiplicity.trim().split('..').pop()!.trim() - return upper === '*' || upper === 'n' || (/^\d+$/.test(upper) && Number(upper) > 1) -} - -export const relationKey = (cls: string, field: string) => `${cls}.${field}` - -export function generalizations(classes: UmlClass[]): Generalization[] { - return relations(classes).filter((r): r is Generalization => r.kind !== 'association') -} - -/** Assoziationen aus den Attributen; zwei Attribute, die aufeinander zeigen, werden eine Linie mit zwei Pfeilen. */ -export function associations(classes: UmlClass[], uml: UmlInfo = {}): Assoc[] { - const names = new Set(classes.map((c) => c.name)) - const raw: { cls: UmlClass; field: UmlMember; target: string; many: boolean }[] = [] - for (const cls of classes) - for (const field of cls.members) { - if (field.kind !== 'field' || field.isStatic) continue - const target = associationTarget(field.type) - if (names.has(target.name) && target.name !== cls.name) raw.push({ cls, field, target: target.name, many: target.many }) - } - const used = new Set<(typeof raw)[number]>() - const out: Assoc[] = [] - const multiplicity = (stored: string | undefined, many: boolean) => (stored && isMany(stored) === many ? stored : many ? '0..*' : '1') - // Was die ganze Beziehung betrifft (nicht nur ein Ende), entscheidet, welches Attribut vorne steht. - const hasInfo = (x: (typeof raw)[number]) => { - const i = uml[relationKey(x.cls.name, x.field.name)] - return !!i && (i.kind !== undefined || i.name !== undefined || i.reading !== undefined || i.navigable !== undefined || i.targetEnd !== undefined || i.sourceEnd !== undefined) - } - for (const first of raw) { - if (used.has(first)) continue - used.add(first) - // Gegenstück nur, wenn es in beiden Richtungen genau ein Attribut gibt. - const backs = raw.filter((b) => !used.has(b) && b.cls.name === first.target && b.target === first.cls.name) - let back = backs.length === 1 && raw.filter((x) => x.cls.name === first.cls.name && x.target === first.target).length === 1 ? backs[0] : undefined - if (back) used.add(back) - // Vorne steht das Attribut mit UML-Zusatz (z. B. die Raute am Ganzen), sonst das zuerst gefundene. - let r = first - if (back && !hasInfo(first) && hasInfo(back)) [r, back] = [back, first] - const key = relationKey(r.cls.name, r.field.name) - const info = uml[key] ?? {} - const backInfo = back ? (uml[relationKey(back.cls.name, back.field.name)] ?? {}) : {} - out.push({ - key, - from: r.cls.name, - to: r.target, - kind: info.kind ?? 'association', - name: info.name, - // Ein Name liest sich in Zugrichtung, solange niemand umdreht. - reading: info.reading ?? (info.name ? 'forward' : undefined), - navTo: info.targetEnd ?? (info.navigable === false ? 'unspecified' : 'navigable'), - navFrom: back ? 'navigable' : (info.sourceEnd ?? 'unspecified'), - role: r.field.name, - multiplicity: multiplicity(info.multiplicity, r.many), - sourceRole: back ? back.field.name : info.sourceRole, - sourceMultiplicity: back ? multiplicity(backInfo.multiplicity, back.many) : info.sourceMultiplicity, - field: r.field, - back: back && { key: relationKey(back.cls.name, back.field.name), field: back.field }, - }) - } - return out -} - -/** Neues Attribut zu einer Klasse: Name klein wie die Klasse, bei vielen in der Mehrzahl mit -s, nicht doppelt. */ -export function fieldNameFor(cls: UmlClass, target: string, many: boolean): string { - const base = target.charAt(0).toLowerCase() + target.slice(1) + (many ? 'Liste' : '') - let name = base - for (let n = 2; cls.members.some((m) => m.name === name); n++) name = base + n - return name -} - -/** Java-Typ zur Multiplizität: eine Liste bei vielen, sonst die Klasse selbst. */ -export function fieldTypeFor(target: string, many: boolean): { type: string; init?: string } { - return many ? { type: `ArrayList<${target}>`, init: 'new ArrayList<>()' } : { type: target } -} - -/** `import a.b.C;` einfügen, wenn er fehlt (hinter `package` bzw. den anderen Imports). */ -export function ensureImport(text: string, qualified: string): string { - if (!qualified.includes('.')) return text - const escaped = qualified.replace(/\./g, '\\.') - const pkg = qualified.slice(0, qualified.lastIndexOf('.')) - if (new RegExp(`^\\s*import\\s+(${escaped}|${pkg.replace(/\./g, '\\.')}\\.\\*)\\s*;`, 'm').test(text)) return text - const imports = [...text.matchAll(/^[ \t]*import\s+[\w.*]+\s*;[ \t]*\n/gm)] - if (imports.length) { - const last = imports[imports.length - 1] - const at = last.index! + last[0].length - return text.slice(0, at) + `import ${qualified};\n` + text.slice(at) - } - const pkgLine = /^\s*package\s+[\w.]+\s*;[ \t]*\n/.exec(text) - if (pkgLine) return text.slice(0, pkgLine[0].length) + `\nimport ${qualified};\n` + text.slice(pkgLine[0].length).replace(/^(?!\n)/, '\n') - return `import ${qualified};\n\n${text}` -} - -/** Zusatz neu schreiben; leere Felder fallen weg, ein leerer Eintrag verschwindet. */ -export function withInfo(uml: UmlInfo, key: string, change: Partial): UmlInfo { - const next: AssocInfo = { ...uml[key], ...change } - for (const k of Object.keys(next) as (keyof AssocInfo)[]) if (next[k] === undefined || next[k] === '') delete next[k] - if (next.kind === 'association') delete next.kind - delete next.navigable - if (next.targetEnd === 'navigable') delete next.targetEnd - if (next.sourceEnd === 'unspecified') delete next.sourceEnd - const out = { ...uml } - if (Object.keys(next).length) out[key] = next - else delete out[key] - return out -} - -/** Schlüssel umbenennen, z. B. wenn die Rolle (das Attribut) einen neuen Namen bekommt. */ -export function renameInfo(uml: UmlInfo, from: string, to: string): UmlInfo { - if (!uml[from] || from === to) return uml - const out = { ...uml, [to]: uml[from] } - delete out[from] - return out -} diff --git a/web/src/core/workspace.ts b/web/src/core/workspace.ts deleted file mode 100644 index 45da6aae..00000000 --- a/web/src/core/workspace.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** Workspace in der Spalte „Dateien“: Klasse → Tagesordner → Programme. Reine Hilfsfunktionen, ohne Dateizugriff. */ - -/** Ordnername für den Tag, z. B. `2026-10-23` (Ortszeit, nicht UTC). */ -export function todayFolder(date = new Date()): string { - const pad = (n: number) => String(n).padStart(2, '0') - return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}` -} - -/** Tagesordner werden neueste zuerst gezeigt, alles andere alphabetisch. */ -export const isDayFolder = (name: string) => /^\d{4}-\d{2}-\d{2}$/.test(name) - -export function compareEntries(a: { kind: string; name: string }, b: { kind: string; name: string }): number { - if (a.kind !== b.kind) return a.kind === 'directory' ? -1 : 1 - if (isDayFolder(a.name) && isDayFolder(b.name)) return b.name.localeCompare(a.name) - return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }) -} - -/** Dateiname aus dem Titel: ohne Zeichen, die Windows oder macOS nicht erlauben. */ -export function programBaseName(title: string, fallback: string): string { - const cleaned = title - .replace(/\.(visustruct|strk|java)$/i, '') - .replace(/[\\/:*?"<>|\u0000-\u001f]/g, '-') - .replace(/\s+/g, ' ') - .trim() - .replace(/^\.+/, '') - return cleaned || fallback -} - -/** Freier Name im Ordner: `Rechner`, sonst `Rechner 2`, `Rechner 3` … (für .visustruct und .java gemeinsam). */ -export function uniqueBaseName(base: string, taken: Iterable): string { - const names = new Set([...taken].map((n) => n.toLowerCase())) - const free = (b: string) => !names.has(`${b}.visustruct`.toLowerCase()) && !names.has(`${b}.java`.toLowerCase()) - if (free(base)) return base - for (let i = 2; ; i++) if (free(`${base} ${i}`)) return `${base} ${i}` -} - -/** Ordnername, den man anlegen darf. */ -export function validFolderName(name: string): string | undefined { - const cleaned = name.replace(/[\\/:*?"<>|\u0000-\u001f]/g, '').trim() - return cleaned && cleaned !== '.' && cleaned !== '..' ? cleaned : undefined -} diff --git a/web/src/core/xmlCodec.ts b/web/src/core/xmlCodec.ts deleted file mode 100644 index b126154e..00000000 --- a/web/src/core/xmlCodec.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { decodeJavaString, encodeJavaString } from './javaStringCoding' -import { ElementType, type RGBA, type VSCase, type VSDocument, type VSElement } from './model' - -/** XML <-> Modell, kompatibel zu `VisuStructXMLCodec.swift` und Java `XMLLeser`/`Struktogramm.xmlErstellen`. */ -export class VisuStructXMLError extends Error {} - -export function decodeDocument(xml: string): VSDocument { - const dom = new DOMParser().parseFromString(xml, 'application/xml') - if (dom.getElementsByTagName('parsererror').length > 0) { - throw new VisuStructXMLError('Could not read XML.') - } - const root = dom.documentElement - if (!root || root.tagName !== 'struktogramm') { - throw new VisuStructXMLError('Invalid XML: root element is not .') - } - const doc: VSDocument = { - caption: decodeAttr(root, 'caption') ?? '', - elements: decodeList(root), - } - const fontFamily = decodeAttr(root, 'fontfamily') - if (fontFamily !== undefined) doc.fontFamily = fontFamily - const fontSize = intAttr(root, 'fontsize') - if (fontSize !== undefined) doc.fontSize = fontSize - const fontStyle = intAttr(root, 'fontstyle') - if (fontStyle !== undefined) doc.fontStyle = fontStyle - if (root.getAttribute('pseudocode') === 'true') doc.pseudocode = true - return doc -} - -export function encodeDocument(doc: VSDocument): string { - const attr = (k: string, v: string | undefined) => (v === undefined ? '' : ` ${k}="${escapeAttr(v)}"`) - let out = '\n' - out += '${escapeText(encodeJavaString(line))}\n` - } - if (e.loopBody) { - out += `${indent} \n` - for (const child of e.loopBody) out += encodeElement(child, indent + ' ') - out += `${indent} \n` - } - if (e.cases) { - for (const c of e.cases) { - out += `${indent} \n` - for (const child of c.elements) out += encodeElement(child, indent + ' ') - out += `${indent} \n` - } - } - out += `${indent}\n` - return out -} - -function escapeAttr(s: string): string { - return s.replace(/&/g, '&').replace(/"/g, '"').replace(//g, '>') -} - -function escapeText(s: string): string { - return s.replace(/&/g, '&').replace(//g, '>') -} - -/** Java speichert `Color.getRGB()` als dezimalen, vorzeichenbehafteten 32-bit-ARGB-Int. */ -function javaColorIntString(c: RGBA): string { - return String(((c.a << 24) | (c.r << 16) | (c.g << 8) | c.b) | 0) -} - -// MARK: - Decoding - -function childElements(parent: Element, tag: string): Element[] { - return Array.from(parent.children).filter((c) => c.tagName === tag) -} - -function decodeList(parent: Element): VSElement[] { - const out: VSElement[] = [] - for (const node of childElements(parent, 'strelem')) { - const e = decodeElement(node) - if (e) out.push(e) - } - return out -} - -function decodeElement(node: Element): VSElement | undefined { - const typ = intAttr(node, 'typ') - if (typ === undefined || ElementType[typ] === undefined) return undefined - - const e: VSElement = { - type: typ as ElementType, - zoomX: intAttr(node, 'zx') ?? 0, - zoomY: intAttr(node, 'zy') ?? 0, - textLines: childElements(node, 'text').map((t) => decodeJavaString((t.textContent ?? '').trim())), - } - const textColor = parseJavaARGB(node.getAttribute('textcolor')) - if (textColor) e.textColor = textColor - const bgColor = parseJavaARGB(node.getAttribute('bgcolor')) - if (bgColor) e.backgroundColor = bgColor - if (e.textLines.length === 0) e.textLines = [''] - - const loop = childElements(node, 'schleifeninhalt')[0] - if (loop) { - const body = decodeList(loop) - if (body.length > 0) e.loopBody = body - } - const cases: VSCase[] = childElements(node, 'fall').map((f) => ({ - name: decodeJavaString(f.getAttribute('fallname') ?? ''), - elements: decodeList(f), - })) - if (cases.length > 0) e.cases = cases - return e -} - -function decodeAttr(node: Element, name: string): string | undefined { - const v = node.getAttribute(name) - return v === null ? undefined : decodeJavaString(v) -} - -function intAttr(node: Element, name: string): number | undefined { - const v = node.getAttribute(name) - if (v === null || !/^[+-]?\d+$/.test(v)) return undefined - return Number(v) -} - -function parseJavaARGB(s: string | null): RGBA | undefined { - if (s === null || !/^[+-]?\d+$/.test(s)) return undefined - const i = Number(s) - if (i < -0x80000000 || i > 0x7fffffff) return undefined - const u = i >>> 0 - return { a: (u >>> 24) & 0xff, r: (u >>> 16) & 0xff, g: (u >>> 8) & 0xff, b: u & 0xff } -} diff --git a/web/src/i18n/ar.strings b/web/src/i18n/ar.strings deleted file mode 100644 index 438489ba..00000000 --- a/web/src/i18n/ar.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* نصوص موجودة في نسخة الويب فقط. أما بقية النصوص فتأتي من ملف Localizable.strings الخاص بالتطبيق. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "مخطط VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "تصدير…"; -"web_export_title" = "حفظ كصورة أو PDF، أو طباعة"; -"web_export_png" = "صورة (PNG)"; -"web_export_svg" = "رسم متجهي (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "ملف VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "فشل التصدير: %@"; -"web_print_hint" = "استخدم «تصدير… → PDF» لحفظ المخطط ثم طباعته من هناك."; -"web_delete" = "حذف"; -"web_language_title" = "لغة الواجهة"; -"web_simulation_start" = "بدء المحاكاة"; -"web_simulation_end" = "إنهاء المحاكاة"; -"web_simulation_start_title" = "تشغيل المخطط خطوة بخطوة"; -"web_simulation_end_title" = "إنهاء المحاكاة ومتابعة التحرير"; -"web_palette_hint" = "اسحب إلى المخطط"; -"web_tabs_label" = "المخططات"; -"web_status_modified" = "معدَّل"; -"web_inspector_title" = "الخصائص"; -"web_inspector_resize" = "تغيير ارتفاع مفتش الكائنات: اسحب الخط لأعلى أو لأسفل (نقر مزدوج: الافتراضي)"; -"web_inspector_help_drop" = "اسحب العناصر من اللوحة إلى كتلة: أعلى = قبل، أسفل = بعد، على «ø» = استبدال. يمكن نقل العناصر الموجودة بالفأرة."; -"web_inspector_help_inline" = "انقر نقرًا مزدوجًا أو المس مرتين على عنصر لتعديل نصه مباشرة في المخطط (Enter للتطبيق، Esc للإلغاء). وكذلك أسماء الحالات."; -"web_inspector_help_files" = "يمكنك أيضًا إفلات الملفات في النافذة."; -"web_case_name" = "اسم الحالة"; -"web_case_name_placeholder" = "مثلًا 1، ok، default"; -"web_copied" = "تم نسخ العنصر."; -"web_discard_message_fmt" = "ستُفقد التغييرات على «%@»."; -"web_err_unreadable_fmt" = "«%@» ليس ملف VisuStruct قابلًا للقراءة (%@)."; -"web_saved_fmt" = "تم حفظ «%@»."; -"web_saved_txt_fmt" = "تم الحفظ باسم «%@». احذف الامتداد .txt لاستخدامه."; -"web_drop_impossible" = "لا يمكن الإفلات هنا"; -"web_sim_delay" = "التوقف لكل خطوة"; -"web_sim_delay_value_fmt" = "%@ ث"; -"web_codegen_language" = "اللغة"; -"web_codegen_comments" = "نص المخطط كتعليقات"; -"web_codegen_empty_else" = "إخراج فرع else فارغ في الشفرة"; -"web_copied_check" = "تم النسخ ✓"; -"web_copy_manual" = "تم التحديد، اضغط Ctrl+C للنسخ"; -"web_run_stopped_loop" = "توقف التنفيذ: حلقة لا نهائية محتملة."; -"web_run_cancelled" = "تم إلغاء التنفيذ."; -"web_run_error" = "خطأ أثناء التشغيل."; -"web_run_dropped_fmt" = "… تم إخفاء %d من الأسطر السابقة"; -"web_sim_call_arguments_fmt" = "الاستدعاء لا يطابق ترويسة %@. تحقق من القيم بين القوسين."; -"web_sim_missing_return_fmt" = "انتهى %@ دون إرجاع قيمة باستخدام return."; -"web_sim_file_not_found_fmt" = "لا يوجد ملف باسم %@."; -"web_sim_end_of_file_fmt" = "لا يوجد سطر آخر في الملف %@."; -"web_sim_null_value_fmt" = "القيمة في %@ هي null."; -"web_sim_unknown_variable_case_fmt" = "متغير غير معروف: %1$@. تميّز Java بين الأحرف الكبيرة والصغيرة: هل تقصد %2$@؟"; -"web_sim_written_file_fmt" = "%@ (محفوظ)"; -"web_site_home" = "الصفحة الرئيسية"; -"web_site_imprint" = "بيانات الناشر"; -"web_site_privacy" = "الخصوصية"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "البرمجة"; -"web_live_hide" = "إخفاء البرمجة"; -"web_scale_canvas" = "حجم النص: المخطط"; -"web_scale_code" = "حجم النص: البرمجة"; -"web_live_indent" = "إزاحة"; -"web_live_indent_title" = "إزاحة الشيفرة: أربع مسافات لكل مستوى (الأسطر المحددة، وإلا فالكل)"; -"web_live_show" = "إظهار البرمجة"; -"web_live_resize" = "تغيير عرض منطقة الشيفرة (نقر مزدوج: إعادة تعيين)"; -"web_live_hint" = "تنمو الشيفرة مع مخططك. الرمادي = عنصر نائب: اكتب في المفتش ليظهر نصك هنا. انقر على سطر لتحديد عنصره."; -"web_live_ph_selector" = "المتغير"; -"web_live_ph_code" = "شيفرتك"; -"web_live_ph_end" = "النهاية"; -"web_live_language" = "لغة البرمجة"; -"web_live_java_class" = "كصنف"; -"web_live_java_class_hint" = "اسم الصنف = عنوان المخطط"; -"web_live_java_main" = "مع الطريقة main"; -"web_settings_display" = "العرض"; -"web_live_swing" = "جافا حقيقية (مع Swing)"; -"web_live_swing_hint" = "جافا حقيقية مع نوافذ (CheerpJ). تُنزّل نحو 40 ميغابايت مرة واحدة عند أول تشغيل."; -"web_live_swing_windows" = "نوافذ جافا"; -"web_live_swing_hide" = "إغلاق نوافذ جافا"; -"web_live_swing_loading" = "جارٍ تحميل جافا (نحو 40 ميغابايت في المرة الأولى) …"; -"web_live_swing_compiling" = "جارٍ الترجمة …"; -"web_live_swing_running" = "البرنامج قيد التشغيل."; -"web_live_swing_compile_failed" = "خطأ في الترجمة، انظر أعلاه."; -"web_live_swing_failed" = "تعذّر تحميل جافا. تحقّق من الاتصال بالإنترنت."; -"web_live_hint_edit" = "اكتب هنا شيفرة Java وسيُبنى المخطط تلقائيًا. أو اعمل في المخطط وستنمو الشيفرة معه. الرمادي = عنصر نائب، اكتب فوقه مباشرة."; -"web_live_edit_label" = "شيفرة Java"; -"web_parse_line_fmt" = "السطر %d: %@"; -"web_parse_missing" = "ما زال ينقص هنا: %@"; -"web_parse_extra" = "زائد: %@"; -"web_parse_unclosed_string" = "ينقص %@ الإغلاق هنا."; -"web_parse_else_without_if" = "لا يوجد «if» لهذا «else»."; -"web_parse_case_outside_switch" = "«case» و«default» مكانهما داخل «switch»."; -"web_parse_missing_do_while" = "بعد «do { … }» ينقص «while (الشرط);»."; -"web_parse_more_methods" = "حاليًا تُحتسب طريقة واحدة فقط هنا. أنشئ البرامج الفرعية الأخرى في علامات تبويب منفصلة."; -"web_parse_missing_import" = "ينقص في الأعلى %@ بدون هذا السطر لا تعرف Java الصنف Scanner."; -"web_parse_missing_scanner" = "ينقص قبل ذلك %@ بدون هذا السطر لا يوجد Scanner."; -"web_parse_unknown_type" = "لا تعرف Java نوع البيانات هذا. هل تقصد %@؟"; -"web_quickfix_insert_fmt" = "اقتراح: إدراج %@"; -"web_quickfix_replace_fmt" = "اقتراح: %1$@ بدلاً من %2$@"; -"web_parse_wrong_case" = "تميّز Java بين الأحرف الكبيرة والصغيرة. الصحيح هو %@."; -"web_editor_title" = "المخطط"; -"web_editor_show" = "إظهار المخطط"; -"web_editor_hide" = "إخفاء المخطط"; -"web_keywords_title" = "كلمات الشيفرة المفتاحية"; -"web_keywords_hint" = "if و while و for بدلًا من أسماء العناصر"; -"web_palette_compact" = "العناصر مضغوطة دائمًا"; -"web_palette_compact_hint" = "رمز مع اسم صغير تحته، وإلا فقط عندما يكون العمود ضيقًا"; -"web_about_version_fmt" = "الإصدار %@"; -"web_about_software" = "البرمجيات المستخدمة"; -"web_about_software_text" = "يستخدم محرر الشيفرة CodeMirror و Lezer (ترخيص MIT). مع دعم Swing يحمّل VisuStruct برنامج CheerpJ من Leaning Technologies (ترخيص Community) و javac من OpenJDK."; -"web_about_licenses" = "نصوص التراخيص"; -"web_live_run" = "تشغيل"; -"web_live_run_title" = "تشغيل البرنامج: تظهر المخرجات والمدخلات بالأسفل"; -"web_live_run_finished" = "انتهى البرنامج."; -"web_live_run_stopped" = "تم الإيقاف."; -"web_console" = "وحدة التحكم"; -"web_console_hide" = "إخفاء وحدة التحكم"; -"web_console_resize" = "تغيير ارتفاع وحدة التحكم"; -"web_diagram_tools" = "أدوات المخطط"; -"web_files_title" = "الملفات"; -"web_files_show" = "إظهار الملفات"; -"web_files_hide" = "إخفاء الملفات"; -"web_files_resize" = "تغيير عرض الملفات"; -"web_files_new_folder" = "مجلد جديد"; -"web_files_switch" = "اختيار مجلد آخر"; -"web_files_delete" = "حذف"; -"web_files_in_browser" = "في تخزين هذا المتصفح"; -"web_files_save_hint_fmt" = "الحفظ يضع البرنامج في %@."; -"web_files_empty" = "لم يُحفظ شيء بعد. عند الحفظ ينشئ VisuStruct هنا مجلداً بتاريخ اليوم."; -"web_files_reconnect_hint" = "بعد إعادة التحميل يسأل المتصفح مرة أخرى إن كان يمكن لـ VisuStruct استخدام مجلدك."; -"web_files_reconnect_fmt" = "فتح المجلد «%@»"; -"web_files_connect_hint" = "اختر مجلداً كمساحة عمل. ينشئ VisuStruct فيه مجلداً لكل يوم ويحفظ المخطط والشيفرة."; -"web_files_connect" = "اختيار مجلد"; -"web_files_browser_hint" = "لا يستطيع هذا المتصفح فتح مجلدات الجهاز (مثلاً على iPad). تبقى ملفاتك في تخزين هذا المتصفح."; -"web_files_browser" = "الحفظ في المتصفح"; -"web_files_delete_confirm_fmt" = "هل تريد حذف «%@» فعلاً؟"; -"web_files_folder_prompt" = "اسم المجلد الجديد:"; -"web_files_default_name" = "برنامج"; -"web_files_saved_fmt" = "تم الحفظ: %@"; -"web_files_create" = "إنشاء"; -"web_learn_ludwig_tip" = "نصيحة لودفيغ"; -"web_game_title" = "لعبة: صحيح أم خطأ؟"; -"web_game_intro" = "يعرض لك لودفيغ قيماً وشرطاً. هل الشرط صحيح (true) أم خطأ (false)؟ عشر جولات تزداد صعوبة."; -"web_game_start" = "ابدأ اللعبة"; -"web_game_round_fmt" = "الجولة %@ من %@"; -"web_game_score_fmt" = "النقاط: %@"; -"web_game_true" = "صحيح (true)"; -"web_game_false" = "خطأ (false)"; -"web_game_right" = "صحيح!"; -"web_game_wrong" = "ليس تماماً. هكذا يُحسب:"; -"web_game_next" = "التالي"; -"web_game_finish" = "النتيجة"; -"web_game_done_fmt" = "%@ من %@ صحيحة."; -"web_game_perfect" = "كلها صحيحة – لودفيغ معجب جداً!"; -"web_game_good" = "رائع! راجع أخطاءك وحاول مرة أخرى."; -"web_game_practice" = "التمرين يصنع الإتقان. اقرأ جدول الحقيقة مرة أخرى والعب جولة أخرى."; -"web_game_again" = "العب مرة أخرى"; -"web_game_wrong_short" = "للأسف خطأ."; -"web_game_practice_short" = "التمرين يصنع الإتقان. اقرأ الشروح مرة أخرى والعب جولة أخرى."; -"web_game_clicks" = "النقرات:"; -"web_game_nobody" = "لا أحد يستمع – لا يحدث شيء."; -"web_game_event_fmt" = "نقرة على «%@»: المستمع يسمعها وينفّذ شيفرته."; -"web_game_try" = "جرّب الآن أزرار النافذة بنفسك."; -"web_game_time_fmt" = "متبقٍ %@ ث"; -"web_game_defused" = "✂️ تم تعطيلها! وجدت الخطأ."; -"web_game_boom_time" = "💥 بوم! انتهى الوقت."; -"web_game_boom_wrong" = "💥 بوم! كان ذلك السطر الخطأ."; -"web_game_boom_part" = "💥 بوم! السطر صحيح، لكن الخطأ في جزء آخر منه."; -"web_game_boom_wrong_part" = "💥 بوم! الخطأ في سطر آخر."; -"web_game_bomb_parts_hint" = "اضغط على الجزء الخاطئ بالضبط."; -"web_game_fix" = "السطر الصحيح:"; -"web_game_order_hint" = "اضغط على الخطوات بالترتيب الصحيح."; -"web_debug_step" = "خطوة"; -"web_debug_step_title" = "خطوة: تنفيذ تعليمة واحدة ثم التوقف مجدداً"; -"web_debug_continue" = "متابعة حتى نقطة التوقف التالية"; -"web_debug_paused_fmt" = "متوقف قبل السطر %d."; -"web_debug_gutter_title" = "انقر على رقم السطر لوضع نقطة توقف أو إزالتها"; -"web_swap_to_code" = "البرمجة كبيرة"; -"web_swap_to_editor" = "المخطط كبير"; -"web_editor_resize" = "تغيير عرض المخطط"; -"web_palette_resize" = "تغيير عرض العناصر"; -"web_palette_hide" = "إخفاء العناصر"; -"web_palette_show" = "إظهار العناصر"; -"web_code_scopes" = "كتل الشيفرة ملوّنة"; -"web_code_scopes_hint" = "الصنف والدالة والحلقة والتفرّع في مربعات خاصة"; -"web_pseudocode" = "شبه كود"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "إعادة تسمية المتغير …"; -"web_rename_title" = "إعادة تسمية المتغير"; -"web_rename_old" = "الاسم"; -"web_rename_new" = "الاسم الجديد"; -"web_rename_hint" = "يغيّر كل موضع بهذه الكتابة تمامًا (number ليس Number)، في الشيفرة وفي المخطط الهيكلي. يبقى النص بين \"…\" والتعليقات كما هي."; -"web_rename_count_fmt" = "يظهر %d مرة."; -"web_rename_exists_fmt" = "«%@» موجود بالفعل: بعدها يصبح المتغيران متغيرًا واحدًا."; -"web_rename_invalid" = "يبدأ الاسم بحرف ويحتوي على حروف وأرقام و _ فقط."; -"web_rename_keyword_fmt" = "«%@» كلمة مفتاحية في Java."; -"web_rename_apply" = "إعادة تسمية"; -"web_rename_cancel" = "إلغاء"; diff --git a/web/src/i18n/da.strings b/web/src/i18n/da.strings deleted file mode 100644 index 4c798db5..00000000 --- a/web/src/i18n/da.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Tekster, der kun findes i webversionen. Alt andet kommer fra appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksportér…"; -"web_export_title" = "Gem som billede eller PDF, eller udskriv"; -"web_export_png" = "Billede (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Eksport mislykkedes: %@"; -"web_print_hint" = "Brug »Eksportér… → PDF« til at gemme diagrammet og udskrive det derfra."; -"web_delete" = "Slet"; -"web_language_title" = "Sprog i brugerfladen"; -"web_simulation_start" = "Start simulering"; -"web_simulation_end" = "Afslut simulering"; -"web_simulation_start_title" = "Kør struktogrammet trin for trin"; -"web_simulation_end_title" = "Afslut simuleringen og fortsæt redigeringen"; -"web_palette_hint" = "Træk ind i struktogrammet"; -"web_tabs_label" = "Diagrammer"; -"web_status_modified" = "ændret"; -"web_inspector_title" = "Egenskaber"; -"web_inspector_resize" = "Skift højden på objektinspektøren: træk eller stryg linjen op eller ned (dobbeltklik: standard)"; -"web_inspector_help_drop" = "Træk elementer fra paletten over på en flise: øverst = før, nederst = efter, på »ø« = erstat. Eksisterende elementer kan flyttes med musen."; -"web_inspector_help_inline" = "Dobbeltklik eller dobbelttryk på et element for at redigere teksten direkte i diagrammet (Enter anvender, Esc annullerer). Det gælder også case-navne."; -"web_inspector_help_files" = "Du kan også slippe filer i vinduet."; -"web_case_name" = "Navn på case"; -"web_case_name_placeholder" = "f.eks. 1, ok, default"; -"web_copied" = "Element kopieret."; -"web_discard_message_fmt" = "Ændringerne i »%@« går tabt."; -"web_err_unreadable_fmt" = "»%@« er ikke en læsbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "»%@« gemt."; -"web_saved_txt_fmt" = "Gemt som »%@«. Fjern filtypenavnet .txt for at bruge den."; -"web_drop_impossible" = "Kan ikke slippes her"; -"web_sim_delay" = "Pause pr. trin"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Sprog"; -"web_codegen_comments" = "Diagramtekst som kommentarer"; -"web_codegen_empty_else" = "Skriv tom else-gren i koden"; -"web_copied_check" = "Kopieret ✓"; -"web_copy_manual" = "Markeret, tryk Ctrl+C for at kopiere"; -"web_run_stopped_loop" = "Kørslen stoppet: mulig uendelig løkke."; -"web_run_cancelled" = "Kørslen annulleret."; -"web_run_error" = "Fejl under kørsel."; -"web_run_dropped_fmt" = "… %d tidligere linjer skjult"; -"web_sim_call_arguments_fmt" = "Kaldet passer ikke til hovedet i %@. Tjek værdierne i parenteserne."; -"web_sim_missing_return_fmt" = "%@ sluttede uden at returnere en værdi med return."; -"web_sim_file_not_found_fmt" = "Der findes ingen fil med navnet %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har ikke flere linjer."; -"web_sim_null_value_fmt" = "%@ er null."; -"web_sim_unknown_variable_case_fmt" = "Ukendt variabel: %1$@. Java skelner mellem store og små bogstaver: mente du %2$@?"; -"web_sim_written_file_fmt" = "%@ (gemt)"; -"web_site_home" = "Forside"; -"web_site_imprint" = "Kolofon"; -"web_site_privacy" = "Privatliv"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Skjul programmering"; -"web_scale_canvas" = "Tekststørrelse: struktogram"; -"web_scale_code" = "Tekststørrelse: programmering"; -"web_live_indent" = "Indryk"; -"web_live_indent_title" = "Indryk koden: fire mellemrum pr. niveau (markerede linjer, ellers alt)"; -"web_live_show" = "Vis programmering"; -"web_live_resize" = "Skift kodeområdets bredde (dobbeltklik: nulstil)"; -"web_live_hint" = "Koden vokser med dit diagram. Gråt = pladsholder: skriv i inspektøren, så vises teksten her. Klik på en linje for at vælge elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kode"; -"web_live_ph_end" = "slut"; -"web_live_language" = "Programmeringssprog"; -"web_live_java_class" = "Som klasse"; -"web_live_java_class_hint" = "Klassenavn = diagrammets titel"; -"web_live_java_main" = "Med main-metode"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Ægte Java (med Swing)"; -"web_live_swing_hint" = "Rigtig Java med vinduer (CheerpJ). Henter ca. 40 MB én gang ved første kørsel."; -"web_live_swing_windows" = "Java-vinduer"; -"web_live_swing_hide" = "Luk Java-vinduer"; -"web_live_swing_loading" = "Java indlæses (første gang ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompilerer …"; -"web_live_swing_running" = "Programmet kører."; -"web_live_swing_compile_failed" = "Kompileringsfejl, se ovenfor."; -"web_live_swing_failed" = "Java kunne ikke indlæses. Tjek internetforbindelsen."; -"web_live_hint_edit" = "Skriv Java-kode her, så bygger diagrammet sig selv. Eller arbejd i diagrammet, så vokser koden med. Gråt = pladsholder, skriv bare ovenpå."; -"web_live_edit_label" = "Java-kode"; -"web_parse_line_fmt" = "Linje %d: %@"; -"web_parse_missing" = "Her mangler stadig: %@"; -"web_parse_extra" = "For meget: %@"; -"web_parse_unclosed_string" = "Det afsluttende %@ mangler."; -"web_parse_else_without_if" = "Denne “else” har ingen “if”."; -"web_parse_case_outside_switch" = "“case” og “default” hører til i en “switch”."; -"web_parse_missing_do_while" = "Efter “do { … }” mangler “while (betingelse);”."; -"web_parse_more_methods" = "Indtil videre tæller kun én metode her. Opret andre underprogrammer i egne faner."; -"web_parse_missing_import" = "Øverst mangler %@ Uden denne linje kender Java ikke Scanner."; -"web_parse_missing_scanner" = "Før mangler %@ Uden den linje findes Scanneren ikke."; -"web_parse_unknown_type" = "Java kender ikke denne datatype. Mente du %@?"; -"web_quickfix_insert_fmt" = "Forslag: indsæt %@"; -"web_quickfix_replace_fmt" = "Forslag: %1$@ i stedet for %2$@"; -"web_parse_wrong_case" = "Java skelner mellem store og små bogstaver. Det rigtige er %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Vis strukturdiagram"; -"web_editor_hide" = "Skjul strukturdiagram"; -"web_keywords_title" = "Kode-nøgleord"; -"web_keywords_hint" = "if, while, for i stedet for elementnavne"; -"web_palette_compact" = "Elementer altid kompakte"; -"web_palette_compact_hint" = "Symbol med lille navn nedenunder, ellers kun når kolonnen er smal"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Anvendt software"; -"web_about_software_text" = "Kodeeditoren bruger CodeMirror og Lezer (MIT-licens). Med Swing-understøttelse indlæser VisuStruct CheerpJ fra Leaning Technologies (Community-licens) og javac fra OpenJDK."; -"web_about_licenses" = "Licenstekster"; -"web_live_run" = "Kør"; -"web_live_run_title" = "Kør programmet: output og input vises nedenfor"; -"web_live_run_finished" = "Programmet er færdigt."; -"web_live_run_stopped" = "Stoppet."; -"web_console" = "Konsol"; -"web_console_hide" = "Skjul konsollen"; -"web_console_resize" = "Ændr konsollens højde"; -"web_diagram_tools" = "Diagramværktøjer"; -"web_files_title" = "Filer"; -"web_files_show" = "Vis filer"; -"web_files_hide" = "Skjul filer"; -"web_files_resize" = "Ændr bredden på filer"; -"web_files_new_folder" = "Ny mappe"; -"web_files_switch" = "Vælg en anden mappe"; -"web_files_delete" = "Slet"; -"web_files_in_browser" = "I denne browsers lager"; -"web_files_save_hint_fmt" = "Når du gemmer, lægges programmet i %@."; -"web_files_empty" = "Intet gemt endnu. Når du gemmer, opretter VisuStruct her en mappe med dagens dato."; -"web_files_reconnect_hint" = "Efter genindlæsning spørger browseren igen, om VisuStruct må bruge din mappe."; -"web_files_reconnect_fmt" = "Åbn mappen “%@”"; -"web_files_connect_hint" = "Vælg en mappe som arbejdsområde. VisuStruct opretter en mappe for hver dag og gemmer diagram og kode."; -"web_files_connect" = "Vælg mappe"; -"web_files_browser_hint" = "Denne browser kan ikke åbne mapper på enheden (fx på iPad). Dine filer bliver i browserens lager."; -"web_files_browser" = "Gem i browseren"; -"web_files_delete_confirm_fmt" = "Vil du virkelig slette “%@”?"; -"web_files_folder_prompt" = "Navn på den nye mappe:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Gemt: %@"; -"web_files_create" = "Opret"; -"web_learn_ludwig_tip" = "Ludwigs tip"; -"web_game_title" = "Spil: Sandt eller falsk?"; -"web_game_intro" = "Ludwig viser dig værdier og en betingelse. Er betingelsen sand (true) eller falsk (false)? Ti runder, sværere og sværere."; -"web_game_start" = "Start spillet"; -"web_game_round_fmt" = "Runde %@ af %@"; -"web_game_score_fmt" = "Point: %@"; -"web_game_true" = "sand (true)"; -"web_game_false" = "falsk (false)"; -"web_game_right" = "Rigtigt!"; -"web_game_wrong" = "Ikke helt. Sådan regnes det ud:"; -"web_game_next" = "Videre"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ af %@ rigtige."; -"web_game_perfect" = "Alt rigtigt – Ludwig er dybt imponeret!"; -"web_game_good" = "Flot! Se på dine fejl og prøv igen."; -"web_game_practice" = "Øvelse gør mester. Læs sandhedstabellen igen, og spil en runde mere."; -"web_game_again" = "Spil igen"; -"web_game_wrong_short" = "Desværre forkert."; -"web_game_practice_short" = "Øvelse gør mester. Læs forklaringerne igen og spil en runde til."; -"web_game_clicks" = "Klik:"; -"web_game_nobody" = "Ingen lytter – der sker ingenting."; -"web_game_event_fmt" = "Klik på »%@«: lytteren hører det og kører sin kode."; -"web_game_try" = "Prøv nu selv knapperne i vinduet."; -"web_game_time_fmt" = "%@ s tilbage"; -"web_game_defused" = "✂️ Desarmeret! Du fandt fejlen."; -"web_game_boom_time" = "💥 Bum! Tiden er gået."; -"web_game_boom_wrong" = "💥 Bum! Det var den forkerte linje."; -"web_game_boom_part" = "💥 Bang! Rigtig linje, men fejlen er i en anden del."; -"web_game_boom_wrong_part" = "💥 Bang! Fejlen er i en anden linje."; -"web_game_bomb_parts_hint" = "Tryk præcis på den forkerte del."; -"web_game_fix" = "Den rigtige linje:"; -"web_game_order_hint" = "Tryk på trinnene i den rigtige rækkefølge."; -"web_debug_step" = "Trin"; -"web_debug_step_title" = "Trin: kør én sætning og hold pause igen"; -"web_debug_continue" = "Fortsæt til næste breakpoint"; -"web_debug_paused_fmt" = "Sat på pause før linje %d."; -"web_debug_gutter_title" = "Klik på et linjenummer for at sætte eller fjerne et breakpoint"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Skift bredde på struktogrammet"; -"web_palette_resize" = "Skift bredde på elementerne"; -"web_palette_hide" = "Skjul elementerne"; -"web_palette_show" = "Vis elementerne"; -"web_code_scopes" = "Farvede kodeblokke"; -"web_code_scopes_hint" = "Klasse, metode, løkke, forgrening i egne felter"; -"web_pseudocode" = "Pseudokode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Omdøb variabel …"; -"web_rename_title" = "Omdøb variabel"; -"web_rename_old" = "Navn"; -"web_rename_new" = "Nyt navn"; -"web_rename_hint" = "Ændrer hvert sted med præcis denne stavemåde (tal er ikke Tal), i koden og i strukturdiagrammet. Tekst i \"…\" og kommentarer bliver."; -"web_rename_count_fmt" = "Forekommer %d gange."; -"web_rename_exists_fmt" = "“%@” findes allerede: bagefter ville begge være én variabel."; -"web_rename_invalid" = "Et navn begynder med et bogstav og indeholder kun bogstaver, cifre og _."; -"web_rename_keyword_fmt" = "“%@” er et Java-nøgleord."; -"web_rename_apply" = "Omdøb"; -"web_rename_cancel" = "Annuller"; diff --git a/web/src/i18n/de.strings b/web/src/i18n/de.strings deleted file mode 100644 index 04a6ed97..00000000 --- a/web/src/i18n/de.strings +++ /dev/null @@ -1,800 +0,0 @@ -/* Texte, die es nur in der Web-Version gibt. Alle anderen kommen aus den Localizable.strings der App. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-Struktogramm"; -"web_key_ctrl" = "Strg"; -"web_key_delete" = "Entf"; -"web_key_shift" = "Umschalt"; -"web_export" = "Exportieren …"; -"web_export_title" = "Als Bild oder PDF speichern oder drucken"; -"web_export_png" = "Bild (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-Datei (.visustruct)"; -"web_export_failed_fmt" = "Export fehlgeschlagen: %@"; -"web_print_hint" = "Über „Exportieren … → PDF“ lässt sich das Diagramm speichern und dann drucken."; -"web_delete" = "Löschen"; -"web_language_title" = "Sprache der Oberfläche"; -"web_simulation_start" = "Simulation starten"; -"web_simulation_end" = "Simulation beenden"; -"web_simulation_start_title" = "Struktogramm Schritt für Schritt ausführen"; -"web_simulation_end_title" = "Simulation beenden und weiter bearbeiten"; -"web_palette_hint" = "Ins Struktogramm ziehen"; -"web_tabs_label" = "Diagramme"; -"web_status_modified" = "geändert"; -"web_inspector_title" = "Objektinspektor"; -"web_inspector_help_drop" = "Elemente aus dem Bereich „Elemente“ auf eine Kachel ziehen: oben = davor, unten = dahinter, auf „ø“ = ersetzen. Vorhandene Elemente lassen sich mit der Maus verschieben."; -"web_inspector_help_inline" = "Doppelklick oder Doppeltipp auf ein Element: Text direkt im Struktogramm ändern (Enter übernimmt, Esc bricht ab). Auch Fallnamen lassen sich so ändern."; -"web_inspector_help_files" = "Dateien können auch einfach ins Fenster gezogen werden."; -"web_case_name" = "Fallname"; -"web_case_name_placeholder" = "z. B. 1, ok, default"; -"web_copied" = "Element kopiert."; -"web_discard_message_fmt" = "Die Änderungen an „%@“ gehen verloren."; -"web_err_unreadable_fmt" = "„%@“ ist keine lesbare VisuStruct-Datei (%@)."; -"web_saved_fmt" = "„%@“ gespeichert."; -"web_saved_txt_fmt" = "Gespeichert als „%@“. Zum Verwenden die Endung .txt entfernen."; -"web_drop_impossible" = "Ablegen nicht möglich"; -"web_sim_delay" = "Pause pro Schritt"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Sprache"; -"web_codegen_comments" = "Diagramm-Text als Kommentare"; -"web_codegen_empty_else" = "Leeren else-Zweig im Code ausgeben"; -"web_copied_check" = "Kopiert ✓"; -"web_copy_manual" = "Markiert, mit Strg+C kopieren"; -"web_run_stopped_loop" = "Ausführung gestoppt: mögliche Endlosschleife."; -"web_run_cancelled" = "Ausführung abgebrochen."; -"web_run_error" = "Fehler beim Ausführen."; -"web_run_dropped_fmt" = "… %d frühere Zeilen ausgeblendet"; - -/* Lernbereich (Lektionen gibt es vorerst nur auf Deutsch) */ -"web_learn_title" = "Lernen"; -"web_learn_hide" = "Lernbereich einklappen"; -"web_learn_show" = "Lernbereich aufklappen: Lektionen, Aufgaben und Nachschlagen"; -"web_learn_lessons" = "Lektionen"; -"web_learn_tasks" = "Aufgaben"; -"web_learn_reference" = "Nachschlagen"; -"web_learn_intro" = "Schritt für Schritt lernen, mit Übungen. Dein Fortschritt wird in diesem Browser gemerkt."; -"web_learn_tasks_intro" = "Kleine Projekte ohne Anleitung. Jede Aufgabe nennt die Lektion, die du vorher abgeschlossen haben solltest."; -"web_learn_step_of_fmt" = "Schritt %d von %d"; -"web_learn_lesson_fmt" = "Lektion %d"; -"web_learn_all_lessons" = "Alle Lektionen"; -"web_learn_all_tasks" = "Alle Aufgaben"; -"web_learn_back" = "Zurück"; -"web_learn_next" = "Weiter"; -"web_learn_finish" = "Lektion abschließen"; -"web_learn_done" = "Abgeschlossen"; -"web_learn_after_fmt" = "Nach Lektion %d: %@"; -"web_learn_level_fmt" = "Schwierigkeit %d von 3"; -"web_learn_exercise" = "Übung"; -"web_learn_brag" = "Angeberwissen mit Ludwig"; -"web_learn_solved" = "geschafft"; -"web_learn_open_exercise" = "Im Editor öffnen"; -"web_learn_solve_in_editor" = "Löse diese Übung im %@."; -"web_learn_solve_in_code" = "Löse diese Übung im %@."; -"web_learn_solve_in_both" = "Löse diese Übung im %1$@ und im %2$@."; -"web_learn_open_in_editor" = "Im Editor öffnen"; -"web_learn_replay" = "Noch einmal abspielen"; -"web_learn_graphic_labels" = "👆 Klick aufs Bild: Beschriftung ein oder aus"; -"web_learn_check" = "Prüfen"; -"web_learn_hint" = "Tipp"; -"web_learn_reset" = "Von vorn"; -"web_learn_reset_confirm" = "Wirklich von vorn?"; -"web_learn_solution" = "Musterlösung ansehen"; -"web_learn_hint_more" = "Noch ein Tipp"; -"web_learn_hint_fmt" = "Tipp %d von %d"; -"web_learn_teacher" = "Für Lehrkräfte"; -"web_learn_teacher_intro" = "Mit dem Lehrercode werden bei allen Übungen die Musterlösungen sichtbar. Der Browser merkt sich das."; -"web_learn_teacher_code" = "Lehrercode"; -"web_learn_teacher_unlock" = "Freischalten"; -"web_learn_teacher_wrong" = "Der Code stimmt nicht."; -"web_learn_teacher_on" = "Lehrermodus ist an: Bei allen Übungen sind die Musterlösungen sichtbar."; -"web_learn_teacher_off" = "Lehrermodus beenden"; -"web_learn_open_first" = "Öffne die Übung zuerst im Editor und baue dort dein Struktogramm."; -"web_learn_empty" = "Dein Struktogramm ist noch leer. Ziehe zuerst Elemente aus dem Bereich „Elemente“ hinein."; -"web_learn_passed" = "Geschafft! Dein Struktogramm macht genau, was es soll."; -"web_learn_failed" = "Noch nicht ganz. Vergleiche die erwartete mit deiner Ausgabe:"; -"web_learn_missing_fmt" = "Dein Struktogramm braucht noch: %@"; -"web_learn_input_fmt" = "Eingabe: %@"; -"web_learn_no_input" = "Ohne Eingabe"; -"web_learn_expected" = "Erwartet"; -"web_learn_actual" = "Deine Ausgabe"; -"web_learn_missing_input" = "Dein Struktogramm fragt nach mehr Eingaben als vorgesehen."; -"web_learn_unused_input" = "Dein Struktogramm fragt nicht alle Eingaben ab."; -"web_learn_missing_line_break" = "Fast! Es fehlt nur ein Zeilenumbruch. System.out.print schreibt weiter in derselben Zeile, System.out.println beginnt danach eine neue."; -"web_learn_too_many_steps" = "Abbruch nach 100 000 Schritten. Läuft eine Schleife endlos?"; -"web_learn_score_fmt" = "%d von %d richtig"; -"web_learn_cloze_hint" = "Tippe die fehlenden Wörter in die Lücken und drücke „Prüfen“."; -"web_learn_cloze_score_fmt" = "%d von %d Lücken richtig"; -"web_learn_cloze_all_right" = "Alle Lücken richtig!"; -"web_learn_cloze_solution" = "Lösung zeigen"; -"web_learn_cloze_again" = "Nochmal"; -"web_learn_pap_hint" = "Tippe ein Element rechts an und dann seinen Platz im Plan. Du kannst es auch hinziehen. Ein belegter Platz gibt sein Element beim Antippen zurück."; -"web_learn_pap_score_fmt" = "%d von %d Elementen richtig"; -"web_learn_pap_all_right" = "Alles richtig! Dein PAP ist fertig."; -"web_learn_pap_missing_fmt" = "Es fehlen noch %d Elemente."; -"web_learn_pap_empty" = "Leerer Platz"; -"web_learn_pap_yes" = "ja"; -"web_learn_pap_no" = "nein"; -"web_learn_pap_legend_oval" = "Start oder Ende"; -"web_learn_pap_legend_rect" = "Anweisung"; -"web_learn_pap_legend_diamond" = "Verzweigung: Frage mit ja und nein"; -"web_learn_pap_legend_para" = "Ein- oder Ausgabe"; -"web_learn_review" = "Nachlesen"; -"web_learn_terms" = "Fachbegriffe"; -"web_inspector_resize" = "Höhe des Objektinspektors ändern: Linie nach oben oder unten ziehen oder wischen (Doppelklick: Standard)"; -"web_learn_resize" = "Breite des Lernbereichs ändern (Doppelklick: zurücksetzen)"; -"web_learn_competences_intro" = "Am Ende dieser Lektion kann ich …"; -"web_learn_rating_sun" = "kann ich sicher"; -"web_learn_rating_cloud" = "teilweise"; -"web_learn_rating_umbrella" = "noch nicht"; -"web_learn_review_title" = "Deine Checkliste im Vergleich"; -"web_learn_review_hint" = "Hier weichen deine Einschätzung und der Test voneinander ab. Lies den Schritt noch einmal nach und schätze dich in der Checkliste neu ein."; -"web_learn_review_match" = "Deine Einschätzung passt zu deinem Test. Gut gemacht!"; -"web_learn_review_overrated_fmt" = "Du hast ☀️ gewählt, aber Frage %@ war falsch."; -"web_learn_review_underrated" = "Alle Fragen dazu waren richtig. Du kannst mehr, als du denkst!"; -"web_learn_review_unrated" = "noch nicht eingeschätzt"; -"web_learn_back_to_checklist" = "Zurück zur Checkliste"; -"web_learn_step_fmt" = "Schritt %d: %@"; -"web_sim_call_arguments_fmt" = "Der Aufruf passt nicht zur Kopfzeile von %@. Prüfe die Werte in den Klammern."; -"web_sim_missing_return_fmt" = "%@ hat keinen Wert mit return zurückgegeben."; -"web_sim_file_not_found_fmt" = "Es gibt keine Datei %@."; -"web_sim_end_of_file_fmt" = "Die Datei %@ hat keine Zeile mehr."; -"web_sim_null_value_fmt" = "%@ ist null."; -"web_sim_unknown_variable_case_fmt" = "Unbekannte Variable: %1$@. Java unterscheidet Groß- und Kleinschreibung: Meintest du %2$@?"; -"web_sim_written_file_fmt" = "%@ (gespeichert)"; -"web_site_home" = "Startseite"; -"web_site_imprint" = "Impressum"; -"web_site_privacy" = "Datenschutz"; - -/* Code (früher „Code live“, dann „Programmieren“) */ -"web_live_title" = "Code"; -"web_live_hide" = "Code ausblenden"; -"web_scale_canvas" = "Textgröße Struktogramm"; -"web_scale_code" = "Textgröße Code"; -"web_live_indent" = "Einrücken"; -"web_live_indent_title" = "Code einrücken und formatieren: jede } auf eigener Zeile, Leerzeichen um Operatoren, jede Ebene vier Leerzeichen tiefer (markierte Zeilen, sonst alles)"; -"web_live_show" = "Code aufklappen"; -"web_live_resize" = "Breite des Codebereichs ändern (Doppelklick: zurücksetzen)"; -"web_live_hint" = "Der Code wächst mit deinem Struktogramm. Grau = Platzhalter: Schreib im Objektinspektor, dann steht dort dein Text. Klick auf eine Zeile markiert das Element."; -"web_live_ph_selector" = "Variable"; -"web_live_ph_code" = "Dein Code"; -"web_live_ph_end" = "Ende"; -"web_live_language" = "Programmiersprache"; -"web_live_java_class" = "Als Klasse"; -"web_live_java_class_hint" = "Klassenname = Titel des Struktogramms"; -"web_live_java_main" = "Mit main-Methode"; -"web_settings_display" = "Darstellung"; -"web_live_swing" = "Echtes Java (mit Swing)"; -"web_live_swing_hint" = "Echtes Java mit Fenstern (CheerpJ). Lädt beim ersten Ausführen einmalig ca. 40 MB."; -"web_live_swing_windows" = "Java-Fenster"; -"web_live_swing_hide" = "Java-Fenster schließen"; -"web_live_swing_loading" = "Java wird geladen (beim ersten Mal ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompiliere …"; -"web_live_swing_running" = "Programm läuft."; -"web_live_swing_compile_failed" = "Fehler beim Kompilieren, siehe oben."; -"web_live_swing_failed" = "Java konnte nicht geladen werden. Prüfe die Internetverbindung."; -"web_live_hint_edit" = "Tippe hier Java-Code, dann baut sich das Struktogramm mit. Oder arbeite im Struktogramm, dann wächst der Code mit. Grau = Platzhalter, einfach drüberschreiben."; -"web_live_edit_label" = "Java-Code"; -"web_parse_line_fmt" = "Zeile %d: %@"; -"web_parse_missing" = "Hier fehlt noch: %@"; -"web_parse_extra" = "Das ist zu viel: %@"; -"web_parse_unclosed_string" = "Hier fehlt das schließende %@."; -"web_parse_else_without_if" = "Zu diesem „else“ gehört kein „if“."; -"web_parse_case_outside_switch" = "„case“ und „default“ gehören in ein „switch“."; -"web_parse_missing_do_while" = "Nach „do { … }“ fehlt noch „while (Bedingung);“."; -"web_parse_more_methods" = "Hier zählt im Moment nur eine Methode. Lege weitere Unterprogramme als eigene Reiter an."; -"web_parse_missing_import" = "Ganz oben fehlt %@ Ohne diese Zeile kennt Java den Scanner nicht."; -"web_parse_missing_scanner" = "Vorher fehlt %@ Ohne diese Zeile gibt es den Scanner nicht."; -"web_parse_unknown_type" = "Diesen Datentyp kennt Java nicht. Meintest du %@?"; -"web_quickfix_insert_fmt" = "Vorschlag: %@ einfügen"; -"web_quickfix_replace_fmt" = "Vorschlag: %1$@ statt %2$@"; -"web_parse_wrong_case" = "Java unterscheidet Groß- und Kleinschreibung. Richtig ist %@."; -"web_editor_title" = "Struktogramm"; -"web_editor_show" = "Struktogramm aufklappen"; -"web_editor_hide" = "Struktogramm einklappen"; -"web_keywords_title" = "Code-Keywords"; -"web_keywords_hint" = "if, while, for statt Verzweigung, For-Schleife …"; -"web_palette_compact" = "Elemente immer kompakt"; -"web_palette_compact_hint" = "Symbol mit kleinem Namen darunter, sonst nur bei schmaler Spalte"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Verwendete Software"; -"web_about_software_text" = "Der Code-Editor nutzt CodeMirror und Lezer (MIT-Lizenz). Mit Swing-Unterstützung lädt VisuStruct CheerpJ von Leaning Technologies (Community-Lizenz) und javac aus OpenJDK."; -"web_about_licenses" = "Lizenztexte"; -"web_live_run" = "Ausführen"; -"web_live_run_title" = "Programm ausführen: Ausgaben und Eingaben erscheinen darunter"; -"web_live_run_finished" = "Programm beendet."; -"web_live_run_stopped" = "Gestoppt."; -"web_console" = "Konsole"; -"web_console_hide" = "Konsole ausblenden"; -"web_console_resize" = "Höhe der Konsole ändern"; -"web_diagram_tools" = "Werkzeuge für das Struktogramm"; -"web_files_title" = "Dateien"; -"web_files_show" = "Dateien einblenden"; -"web_files_hide" = "Dateien ausblenden"; -"web_files_resize" = "Breite der Dateien ändern"; -"web_files_new_folder" = "Neuer Ordner"; -"web_files_switch" = "Anderen Ordner wählen"; -"web_files_delete" = "Löschen"; -"web_files_in_browser" = "Im Speicher dieses Browsers"; -"web_files_save_hint_fmt" = "Speichern legt das Programm in %@ ab."; -"web_files_empty" = "Noch nichts gespeichert. Beim Speichern legt VisuStruct hier einen Ordner mit dem heutigen Datum an."; -"web_files_reconnect_hint" = "Der Browser fragt nach dem Neuladen noch einmal, ob VisuStruct deinen Ordner benutzen darf."; -"web_files_reconnect_fmt" = "Ordner „%@“ öffnen"; -"web_files_connect_hint" = "Wähle einen Ordner als Arbeitsbereich, am besten einen neuen Ordner „VisuStruct-Dateien“ in deinen Dokumenten. VisuStruct legt darin für jeden Tag einen Ordner an und speichert Struktogramm und Code."; -"web_files_connect" = "Ordner wählen"; -"web_files_browser_hint" = "Dieser Browser kann keine Ordner auf dem Gerät öffnen (z. B. auf dem iPad). Deine Dateien bleiben dann im Speicher dieses Browsers."; -"web_files_browser" = "Im Browser speichern"; -"web_files_delete_confirm_fmt" = "„%@“ wirklich löschen?"; -"web_files_folder_prompt" = "Name des neuen Ordners:"; -"web_files_default_name" = "Programm"; -"web_files_saved_fmt" = "Gespeichert: %@"; -"web_files_create" = "Anlegen"; -"web_learn_ludwig_tip" = "Ludwigs Tipp"; -"web_game_title" = "Spiel: Wahr oder falsch?"; -"web_game_intro" = "Ludwig zeigt dir Werte und eine Bedingung. Ist die Bedingung wahr (true) oder falsch (false)? Zehn Runden, es wird von Runde zu Runde kniffliger."; -"web_game_start" = "Spiel starten"; -"web_game_round_fmt" = "Runde %@ von %@"; -"web_game_score_fmt" = "Punkte: %@"; -"web_game_true" = "wahr (true)"; -"web_game_false" = "falsch (false)"; -"web_game_right" = "Richtig!"; -"web_game_wrong" = "Leider falsch. So wird gerechnet:"; -"web_game_next" = "Weiter"; -"web_game_finish" = "Ergebnis"; -"web_game_done_fmt" = "%@ von %@ richtig."; -"web_game_perfect" = "Alles richtig – Ludwig ist schwer beeindruckt!"; -"web_game_good" = "Stark! Schau dir die Fehler noch einmal an und versuch es nochmal."; -"web_game_practice" = "Übung macht den Meister. Lies dir die Wahrheitstabelle oben noch einmal durch und spiel noch eine Runde."; -"web_game_again" = "Noch einmal"; -"web_game_wrong_short" = "Leider falsch."; -"web_game_practice_short" = "Übung macht den Meister. Lies dir die Erklärungen noch einmal durch und spiel noch eine Runde."; -"web_game_clicks" = "Klicks:"; -"web_game_nobody" = "Niemand hört zu – nichts passiert."; -"web_game_event_fmt" = "Klick auf „%@“: Der Zuhörer hört es und führt seinen Code aus."; -"web_game_try" = "Probier die Knöpfe im Fenster jetzt selbst aus."; -"web_game_time_fmt" = "Noch %@ s"; -"web_game_defused" = "✂️ Entschärft! Du hast den Fehler gefunden."; -"web_game_boom_time" = "💥 Bumm! Die Zeit ist abgelaufen."; -"web_game_boom_wrong" = "💥 Bumm! Das war die falsche Zeile."; -"web_game_boom_part" = "💥 Bumm! Die Zeile stimmt, aber der Fehler steckt in einem anderen Teil."; -"web_game_boom_wrong_part" = "💥 Bumm! Der Fehler steckt in einer anderen Zeile."; -"web_game_bomb_parts_hint" = "Tippe genau auf den falschen Teil."; -"web_game_fix" = "So stimmt die Zeile:"; -"web_game_order_hint" = "Tippe die Schritte in der richtigen Reihenfolge an."; -"web_debug_step" = "Einzelschritt"; -"web_debug_step_title" = "Einzelschritt: eine Anweisung ausführen und wieder anhalten"; -"web_debug_continue" = "Weiter bis zum nächsten Haltepunkt"; -"web_debug_paused_fmt" = "Angehalten vor Zeile %d."; -"web_debug_gutter_title" = "Auf die Zeilennummer klicken: Haltepunkt setzen oder entfernen"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Caesar-Scheibe"; -"web_learn_caesar_hint" = "Drehe die innere Scheibe oder tippe auf −1 und +1. Außen steht der Klartext, innen der Geheimtext."; -"web_learn_caesar_key_fmt" = "Schlüssel %d"; -"web_learn_caesar_plain" = "Klartext"; -"web_learn_caesar_secret" = "Geheimtext"; -"web_learn_caesar_encrypt" = "Verschlüsseln"; -"web_learn_caesar_decrypt" = "Entschlüsseln"; -"web_learn_caesar_back" = "Scheibe eins zurück"; -"web_learn_caesar_forward" = "Scheibe eins weiter"; -"web_learn_rescue_station_fmt" = "Station %@ von %@: %@"; -"web_learn_rescue_number" = "Deine Zahl"; -"web_learn_rescue_not_number" = "Gib eine ganze Zahl ein."; -"web_learn_rescue_wrong" = "Noch nicht. Lies den Code noch einmal Zeichen für Zeichen."; -"web_learn_rescue_letter_moved" = "Der Buchstabe wandert ins Kreuzworträtsel."; -"web_learn_rescue_alphabet" = "Aus deiner Zahl wird ein Buchstabe:"; -"web_learn_rescue_to_crossword" = "Zum Kreuzworträtsel"; -"web_learn_rescue_crossword" = "Das Kreuzworträtsel"; -"web_learn_rescue_across" = "→ Waagrecht"; -"web_learn_rescue_down" = "↓ Senkrecht"; -"web_learn_rescue_cell_fmt" = "Feld Zeile %@, Spalte %@"; -"web_learn_rescue_keyword" = "Geheimes Wort:"; -"web_learn_rescue_cw_wrong" = "Die rot markierten Felder stimmen noch nicht."; -"web_learn_rescue_cw_done" = "Gelöst! Die gelben Felder ergeben das geheime Wort."; -"web_learn_rescue_to_gate" = "Zum Tor"; -"web_learn_rescue_gate" = "Das Tor"; -"web_learn_rescue_word" = "Geheimes Wort"; -"web_learn_rescue_open" = "Tor öffnen"; -"web_learn_rescue_gate_case" = "Fast! equals unterscheidet Groß- und Kleinbuchstaben. Schreib das Wort genau so wie im Rätsel."; -"web_learn_rescue_gate_wrong" = "Das Tor bleibt zu. Schau noch einmal auf die gelben Felder."; -"web_learn_rescue_freed" = "🎉 Das Tor ist offen!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "Womit möchtest du arbeiten?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: Struktogramme und Java mit dem ganzen Kurs. Wechseln geht jederzeit im Zahnrad."; -"web_visubot_world_visubot_hint" = "VisuBot: den Roboter mBot2 programmieren, mit eigenen Lektionen und Aufgaben. Wechseln geht jederzeit im Zahnrad."; -"web_visubot_connect" = "Mit echtem mBot2 verbinden"; -"web_visubot_upload_button" = "Übertragen"; -"web_visubot_blocks" = "Blöcke"; -"web_visubot_blocks_title" = "Das Struktogramm als Blöcke zeigen"; -"web_visubot_blocks_back" = "Struktogramm"; -"web_visubot_blocks_back_title" = "Zurück zum Struktogramm"; -"web_visubot_blocks_start" = "Wenn das Programm startet"; -"web_visubot_blocks_empty" = "Hier kommt ein Block hin"; -"web_visubot_blocks_hint" = "Dasselbe Programm als Blöcke. Ziehe Blöcke aus „Elemente“ hinein, verschiebe sie oder wirf sie in den Papierkorb. Zahlen und Texte in den weißen Feldern änderst du per Klick direkt im Block, alles andere unten im Objektinspektor. Sensoren ziehst du auf eine Bedingung oder genau auf ein Feld, das sie ersetzen sollen. Operatoren und Variablen ziehst du genauso auf ein Feld oder eine Bedingung."; -"web_visubot_blocks_trash" = "Papierkorb"; -"web_visubot_blocks_count" = "zähle mit"; -"web_visubot_blocks_count_from" = "von"; -"web_visubot_blocks_count_below" = "bis unter"; -"web_visubot_blocks_count_to" = "bis"; -"web_visubot_blocks_count_above" = "bis über"; -"web_visubot_blocks_count_step" = "in Schritten von"; -"web_visubot_blocks_repeat" = "wiederhole"; -"web_visubot_blocks_if" = "wenn"; -"web_visubot_blocks_else" = "sonst"; -"web_visubot_blocks_while" = "solange"; -"web_visubot_blocks_endless" = "wiederhole immer"; -"web_visubot_blocks_do" = "mache"; -"web_visubot_blocks_not" = "nicht"; -"web_visubot_blocks_and" = "und"; -"web_visubot_blocks_or" = "oder"; -"web_visubot_blocks_break" = "verlasse die Schleife"; -"web_visubot_blocks_repeat_times" = "mal"; -"web_visubot_blocks_random_from" = "Zufallszahl von"; -"web_visubot_blocks_random_to" = "bis"; -"web_visubot_operators" = "Operatoren"; -"web_visubot_variables" = "Variablen"; -"web_visubot_control" = "Steuerung"; -"web_visubot_el_repeat" = "wiederhole 10 mal"; -"web_visubot_upload_title" = "Programm auf den mBot2 übertragen"; -"web_visubot_upload_step1" = "Schließe den mBot2 mit dem USB-Kabel an und schalte ihn ein. Das geht nur in Chrome oder Edge."; -"web_visubot_upload_step2" = "Klicke auf „Jetzt übertragen“ und wähle „USB Serial“. Der mBot2 speichert dein Programm und startet neu."; -"web_visubot_upload_step3" = "Zieh das Kabel ab und setze den mBot2 an den Start. Drückst du Taste A, fährt dein Programm los. Es bleibt gespeichert, auch nach dem Ausschalten."; -"web_visubot_upload_start" = "Jetzt übertragen"; -"web_visubot_upload_busy" = "Wird übertragen … Kabel nicht abziehen."; -"web_visubot_upload_done" = "Fertig! Kabel ab, mBot2 an den Start, Taste A drücken."; -"web_visubot_upload_failed" = "Das Übertragen hat nicht geklappt. Starte den mBot2 neu und versuche es noch einmal."; -"web_visubot_upload_label" = "A = Start"; -"web_visubot_upload_error_input" = "Dein Programm fragt nach einer Eingabe. Am mBot2 gibt es keine Tastatur, deshalb geht das nicht."; -"web_visubot_upload_error_files" = "Dein Programm arbeitet mit Dateien. Das geht am mBot2 nicht."; -"web_visubot_upload_error_empty" = "Dein Programm ist noch leer."; -"web_visubot_disconnect" = "Trennen"; -"web_visubot_connecting" = "Verbinde … (der CyberPi startet kurz neu)"; -"web_visubot_connected" = "Echter mBot2 fährt mit"; -"web_visubot_no_serial" = "Echter mBot2: nur in Chrome oder Edge am Computer."; -"web_visubot_link_error" = "Verbindung getrennt"; -"web_visubot_world" = "VisuBot-Welt"; -"web_visubot_no_3d" = "Die 3D-Ansicht kann in diesem Browser nicht starten."; -"web_visubot_distance" = "Abstand"; -"web_visubot_line" = "Linie"; -"web_visubot_bumps" = "an die Wand gestoßen"; -"web_visubot_el_forward" = "fahre vor"; -"web_visubot_el_backward" = "fahre zurück"; -"web_visubot_el_right" = "drehe rechts"; -"web_visubot_el_left" = "drehe links"; -"web_visubot_el_led" = "LEDs an"; -"web_visubot_el_tone" = "Ton spielen"; -"web_visubot_drive" = "Fahrt"; -"web_visubot_depth_fmt" = "Die Schleifen müssen %d-fach ineinander stecken."; -"web_visubot_tap_part" = "Dreh den mBot2 mit der Maus oder dem Finger. Tippst du ein Teil an, siehst du seinen Namen."; -"web_visubot_quiz_right" = "Richtig!"; -"web_visubot_quiz_wrong_fmt" = "Das ist: %@. Versuch es noch einmal."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Bildschirm"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Tasten A, B und Home"; -"web_visubot_part_leds" = "RGB-LEDs"; -"web_visubot_part_lightSensor" = "Lichtsensor"; -"web_visubot_part_microphone" = "Mikrofon"; -"web_visubot_part_shield" = "mBot2-Shield mit Akku"; -"web_visubot_part_powerSwitch" = "Ein-Aus-Schalter"; -"web_visubot_part_motors" = "Encoder-Motoren"; -"web_visubot_part_wheels" = "Räder"; -"web_visubot_part_ultrasonic" = "Ultraschallsensor"; -"web_visubot_part_lineSensor" = "Liniensensor (Quad-RGB)"; -"web_visubot_part_caster" = "Kugelrolle"; -"web_visubot_part_chassis" = "Chassis"; -"web_visubot_world_fmt" = "Welt %d"; -"web_visubot_goal_reached" = "Ziel erreicht"; -"web_visubot_goal_missed" = "Ziel nicht erreicht"; -"web_visubot_commands" = "mBot2-Befehle"; -"web_visubot_sensors" = "mBot2-Sensoren"; -"web_visubot_sensor_distance" = "Abstand"; -"web_visubot_sensor_line" = "Linie"; -"web_visubot_el_led_off" = "LEDs aus"; -"web_visubot_el_led_color" = "LED-Farbe setzen"; -"web_visubot_el_wait" = "kurz warten"; -"web_visubot_el_emotion" = "Gefühl zeigen"; -"web_visubot_el_text" = "Text anzeigen"; -"web_visubot_sensor_color" = "Farbe ist rot?"; -"web_visubot_sensor_button_a" = "Taste A gedrückt?"; -"web_visubot_sensor_button_b" = "Taste B gedrückt?"; -"web_visubot_sensor_joy_up" = "Joystick oben?"; -"web_visubot_sensor_joy_down" = "Joystick unten?"; -"web_visubot_sensor_joy_left" = "Joystick links?"; -"web_visubot_sensor_joy_right" = "Joystick rechts?"; -"web_visubot_sensor_brightness" = "Helligkeit"; -"web_visubot_sensor_loudness" = "Lautstärke"; -"web_visubot_sensor_pitch" = "Neigung vorn/hinten"; -"web_visubot_sensor_roll" = "Neigung seitlich"; -"web_visubot_sensor_shake" = "geschüttelt?"; -"web_visubot_el_drive" = "Räder einzeln"; -"web_visubot_el_stop" = "anhalten"; -"web_visubot_el_timer" = "Stoppuhr auf 0"; -"web_visubot_sensor_line_left" = "Linie links?"; -"web_visubot_sensor_line_right" = "Linie rechts?"; -"web_visubot_sensor_timer" = "Stoppuhr (s)"; -"web_visubot_sensor_battery" = "Akku (%)"; -"web_visubot_actions" = "Befehle"; -"web_visubot_led_on" = "LEDs an"; -"web_visubot_led_off" = "LEDs aus"; -"web_visubot_tone_yes" = "Ton"; -"web_visubot_tone_no" = "kein Ton"; -"web_visubot_controls" = "Sensoren ausprobieren"; -"web_visubot_controls_hint" = "Ohne echten mBot2: Hier stellst du ein, was die Sensoren messen. Tasten, Joystick und Schütteln gelten eine Sekunde lang."; -"web_visubot_shake" = "schütteln"; -"web_visubot_check" = "mBot2 testen"; -"web_visubot_check_hint" = "Probiere jeden Aktor einmal aus. Die Sensorwerte laufen live mit: Halte die Hand vor den Ultraschall, drück die Tasten, neige oder schüttle den mBot2. Heb ihn für die Räder hoch."; -"web_visubot_check_forward" = "Räder 1 s vorwärts"; -"web_visubot_check_spin" = "1 s auf der Stelle drehen"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Wo speicherst du deine Arbeit?"; -"web_learn_start_hint" = "Lernstand und Programme liegen in einem Ordner auf deinem Gerät. Der Lernstand steht dort in der Datei learnProgress.json."; -"web_learn_start_continue_fmt" = "Weiter mit „%@“"; -"web_learn_start_open" = "Vorhandenen Ordner öffnen"; -"web_learn_start_create_fmt" = "Neuen Ordner „%@“ anlegen"; -"web_learn_start_create_hint" = "Danach wählst du, wo er liegen soll, z. B. in „Dokumente“."; -"web_learn_start_folder" = "VisuStruct-Dateien"; -"web_learn_start_without" = "Ohne Ordner weiter"; -"web_learn_start_without_hint" = "Dann ist dein Lernstand nach dem Schließen weg."; -"web_visubot_preview_title" = "mBot2 live"; -"web_visubot_preview_hint" = "Zeigt sofort, wohin dein Programm den mBot2 fährt."; -"web_visubot_preview_sim_title" = "Simulation"; -"web_visubot_preview_sim_hint" = "Hier fährt der mBot2 mit, während die Simulation läuft."; -"web_visubot_world_in_preview" = "Der mBot2 fährt im Fenster „Simulation“."; -"web_visubot_preview_play" = "Fahrt abspielen"; -"web_visubot_preview_stop" = "Anhalten"; -"web_visubot_preview_hide" = "mBot2 live einklappen"; -"web_visubot_preview_show" = "mBot2 live zeigen"; -"web_visubot_preview_resize" = "Größe von mBot2 live ändern"; -"web_visubot_preview_stack" = "Unter den Code im Bereich Code"; -"web_visubot_preview_side" = "Als eigene Spalte"; -"web_visubot_preview_distance_fmt" = "Strecke: %d cm"; -"web_visubot_preview_input" = "braucht eine Eingabe, dafür die Simulation starten"; -"web_visubot_preview_limit" = "läuft sehr lange (Endlosschleife?), gezeigt ist der Anfang"; -"web_visubot_group_drive" = "Fahren und Drehen"; -"web_visubot_group_wheels" = "Räder einzeln"; -"web_visubot_group_leds" = "Licht"; -"web_visubot_group_sound" = "Ton"; -"web_visubot_group_screen" = "Bildschirm"; -"web_visubot_group_emotion" = "Gefühle"; -"web_visubot_group_wait" = "Warten und Stoppuhr"; -"web_visubot_group_distance" = "Abstand"; -"web_visubot_group_line" = "Linie"; -"web_visubot_group_color" = "Farben"; -"web_visubot_group_buttons" = "Tasten und Joystick"; -"web_visubot_group_light" = "Licht und Lautstärke"; -"web_visubot_group_tilt" = "Neigung und Schütteln"; -"web_visubot_group_timer" = "Stoppuhr und Akku"; -"web_swap_to_code" = "Code groß, Struktogramm schmal"; -"web_swap_to_editor" = "Struktogramm groß, Code schmal"; -"web_editor_resize" = "Breite des Struktogramms ändern"; -"web_palette_resize" = "Breite der Elemente ändern (Doppelklick: zurücksetzen)"; -"web_palette_hide" = "Elemente einklappen"; -"web_palette_show" = "Elemente aufklappen"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: Klassen in Java programmieren und als Klassendiagramm sehen oder zeichnen (ab Klasse 12). Wechseln geht jederzeit im Zahnrad."; -"web_visuobject_subtitle" = "Klassendiagramm"; -"web_visuobject_code" = "Java-Code"; -"web_visuobject_diagram" = "Klassendiagramm"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Neues Interface ins Diagramm und in den Code"; -"web_visuobject_layout" = "Neu anordnen"; -"web_visuobject_layout_tip" = "Alle Klassen automatisch anordnen: Oberklassen oben"; -"web_visuobject_add_field" = "neues Attribut …"; -"web_visuobject_add_method" = "neue Methode …"; -"web_visuobject_delete_class" = "Klasse löschen"; -"web_visuobject_new_class_name" = "NeueKlasse"; -"web_visuobject_new_interface_name" = "NeuesInterface"; -"web_visuobject_example" = "Beispiel"; -"web_visuobject_example_tip" = "Beispielprojekt Zoo laden: Tier und Hund im Package tiere, Besitzer in personen"; -"web_visuobject_new_tip" = "Neu: leeres Projekt (Rückgängig holt das alte zurück)"; -"web_visuobject_empty" = "Noch keine Klasse. Klicke links auf „+ Klasse“ oder tippe zum Beispiel „public class Hund { }“ in eine Datei."; -"web_visuobject_edit_hint" = "Doppelklick ändert. Schreibweise wie in UML: „- name: String“ oder „+ bellen(): void“. Leer lassen löscht."; -"web_visuobject_member_label" = "Attribut oder Methode in UML-Schreibweise"; -"web_visuobject_name_label" = "Name der Klasse"; -"web_visuobject_bad_name" = "„%@“ ist kein gültiger Name oder gibt es schon."; -"web_visuobject_bad_line" = "„%@“ verstehe ich nicht. Beispiel: - name: String oder + bellen(): void"; -"web_visuobject_open_failed" = "Die Datei konnte nicht gelesen werden."; -"web_visuobject_field_ph" = "- name: String"; -"web_visuobject_seq_diagram" = "Sequenzdiagramm"; -"web_visuobject_seq_empty" = "Das Sequenzdiagramm entsteht beim Debuggen: Klicke oben auf „Debuggen“ und gehe Schritt für Schritt durch das Programm."; -"web_visuobject_seq_no_calls" = "Noch keine Aufrufe eigener Methoden."; -"web_visuobject_seq_truncated" = "… gekürzt: Ab hier sind es zu viele Aufrufe."; -"web_visuobject_seq_hint" = "Jeder Pfeil ist ein Aufruf einer eigenen Methode, gestrichelt kommt die Rückgabe zurück. Klick auf einen Pfeil zeigt die Zeile im Code."; -"web_visuobject_dbg" = "Debuggen"; -"web_visuobject_dbg_tip" = "Programm Schritt für Schritt ausführen. Haltepunkt: auf die Zeilennummer klicken. Das Objektdiagramm zeigt dabei die Objekte im Speicher."; -"web_visuobject_dbg_continue" = "Weiter"; -"web_visuobject_dbg_continue_tip" = "Weiter bis zum nächsten Haltepunkt (F8)"; -"web_visuobject_dbg_pause" = "Pause"; -"web_visuobject_dbg_pause_tip" = "Programm anhalten"; -"web_visuobject_dbg_over" = "Schritt"; -"web_visuobject_dbg_over_tip" = "Nächste Zeile; Methoden laufen ganz durch (F6)"; -"web_visuobject_dbg_into" = "Hinein"; -"web_visuobject_dbg_into_tip" = "In die aufgerufene Methode hineingehen (F5)"; -"web_visuobject_dbg_out" = "Heraus"; -"web_visuobject_dbg_out_tip" = "Methode zu Ende ausführen und zurück zum Aufrufer (F7)"; -"web_visuobject_dbg_input" = "Eingabe für den Scanner, dann Enter"; -"web_visuobject_dbg_running" = "Debugger: Programm läuft …"; -"web_visuobject_dbg_waiting" = "Debugger: Das Programm wartet auf deine Eingabe."; -"web_visuobject_dbg_paused_fmt" = "Debugger: angehalten in %1$@, Zeile %2$@"; -"web_visuobject_dbg_exception" = "Programm mit einer Exception abgebrochen."; -"web_visuobject_dbg_code_changed" = "Code geändert: Debugger beendet."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Aufrufstapel"; -"web_visuobject_dbg_vars" = "Variablen"; -"web_visuobject_dbg_var_name" = "Name"; -"web_visuobject_dbg_var_type" = "Typ"; -"web_visuobject_dbg_no_vars" = "Keine Variablen"; -"web_visuobject_dbg_err_syntax" = "%1$@, Zeile %2$@: Das versteht der Debugger nicht (%3$@). Mit ▶ Start siehst du die Meldung von Java."; -"web_visuobject_dbg_err_symbol" = "%1$@, Zeile %2$@: %3$@ ist unbekannt."; -"web_visuobject_dbg_err_import" = "%1$@, Zeile %2$@: Ganz oben fehlt %3$@ Ohne diese Zeile kennt Java die Klasse nicht."; -"web_visuobject_dbg_err_typename" = "%1$@, Zeile %2$@: Diesen Datentyp kennt Java nicht. Meintest du %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, Zeile %2$@: %3$@ kann der Debugger noch nicht. Mit ▶ Start läuft das Programm in echtem Java."; -"web_visuobject_dbg_err_type" = "%1$@, Zeile %2$@: Hier passt etwas nicht zusammen (%3$@)."; -"web_visuobject_obj_diagram" = "Objektdiagramm"; -"web_visuobject_obj_new" = "Neues Objekt der Klasse"; -"web_visuobject_obj_add" = "Objekt"; -"web_visuobject_obj_empty" = "Noch keine Objekte. Wähle oben eine Klasse und klicke auf „+ Objekt“."; -"web_visuobject_obj_no_classes" = "Lege zuerst im Klassendiagramm eine Klasse an (nicht abstract)."; -"web_visuobject_obj_hint" = "Klicke auf ein Objekt, dann kannst du hier Name, Klasse und Werte ändern. Vom Griff am Objekt zu einem anderen ziehen verbindet sie über ein Referenzattribut."; -"web_visuobject_obj_live_hint" = "Live aus dem Debugger: So sehen die Objekte gerade im Speicher aus."; -"web_visuobject_obj_link" = "Zu einem anderen Objekt ziehen: Referenz setzen"; -"web_visuobject_obj_name" = "Name"; -"web_visuobject_obj_class" = "Klasse"; -"web_visuobject_obj_attribute" = "Attribut"; -"web_visuobject_obj_value" = "Wert"; -"web_visuobject_obj_delete" = "Objekt löschen"; -"web_visuobject_obj_bad_name" = "„%@“ ist kein gültiger Name für ein Objekt."; -"web_visuobject_obj_name_taken" = "Ein Objekt „%@“ gibt es schon."; -"web_visuobject_obj_no_ref" = "%1$@ hat kein Attribut, das auf %2$@ zeigen kann."; -"web_visuobject_tool_note" = "Notiz"; -"web_visuobject_tool_note_tip" = "Notiz: Klicke ins Klassendiagramm, dann tippe den Text. Mit dem Griff ziehst du eine gestrichelte Linie zu einer Klasse."; -"web_visuobject_note_ph" = "Notiz …"; -"web_visuobject_note_text" = "Text"; -"web_visuobject_note_attached" = "Verbunden mit"; -"web_visuobject_note_attach" = "Zu einer Klasse ziehen: gestrichelte Linie"; -"web_visuobject_note_delete" = "Notiz löschen"; -"web_visuobject_run" = "Start"; -"web_visuobject_run_tip" = "Programm mit echtem Java starten: alle Klassen werden übersetzt, gestartet wird die Klasse mit main (bevorzugt die offene)."; -"web_visuobject_stop" = "Stop"; -"web_visuobject_stop_tip" = "Programm beenden und seine Fenster schließen"; -"web_visuobject_stopped" = "Programm beendet."; -"web_visuobject_no_main" = "Keine Klasse mit public static void main(String[] args) gefunden."; -"web_visuobject_running_fmt" = "%@ läuft …"; -"web_visuobject_console_clear" = "Leeren"; -"web_visuobject_section_fields" = "Attribute"; -"web_visuobject_section_refs" = "Referenzattribute"; -"web_visuobject_section_ctors" = "Konstruktor"; -"web_visuobject_section_methods" = "Methoden"; -"web_visuobject_insp_sections" = "Abschnitts-Kommentare einfügen"; -"web_visuobject_insp_sort" = "Einsortieren"; -"web_visuobject_insp_sections_tip" = "Schreibt // Attribute, // Referenzattribute, // Konstruktor und // Methoden in die Klasse und sortiert alles darunter. Neues aus dem Klassendiagramm kommt dann gleich an die richtige Stelle."; -"web_visuobject_insp_doc" = "Beschreibung (Javadoc)"; -"web_visuobject_insp_doc_ph" = "Wofür ist die Klasse da? Steht im Code als Javadoc-Kommentar über der Klasse."; -"web_visuobject_insp_visibility" = "Sichtbarkeit"; -"web_visuobject_insp_type" = "Typ"; -"web_visuobject_insp_init" = "Startwert"; -"web_visuobject_insp_no_fields" = "Noch keine Attribute."; -"web_visuobject_insp_add_field" = "Attribut"; -"web_visuobject_insp_params" = "Parameter"; -"web_visuobject_insp_return" = "Rückgabetyp"; -"web_visuobject_insp_constructor" = "Konstruktor"; -"web_visuobject_insp_no_methods" = "Noch keine Methoden."; -"web_visuobject_insp_add_method" = "Methode"; -"web_visuobject_insp_generate" = "Erzeugen:"; -"web_visuobject_insp_gen_constructor" = "Konstruktor aus Attributen"; -"web_visuobject_insp_gen_constructor_tip" = "Wie in Eclipse „Generate Constructor using Fields“: ein Konstruktor, der alle Attribute (ohne static) setzt."; -"web_visuobject_insp_gen_accessors" = "Getter und Setter"; -"web_visuobject_insp_gen_accessors_tip" = "Wie in Eclipse „Generate Getters and Setters“: für jedes Attribut get…/set… (final-Attribute nur Getter)."; -"web_visuobject_insp_bad_params" = "Parameter so schreiben: name: Typ, zweiter: int (gelesen wurde „%@“)."; -"web_visuobject_insp_fields" = "Attribute"; -"web_visuobject_insp_methods" = "Methoden"; -"web_visuobject_inspector_resize" = "Größe ändern: Grenze zwischen Klassendiagramm und Objektinspektor nach oben oder unten ziehen (Doppelklick = Standard)"; -"web_visuobject_dep_title" = "Abhängigkeit «%@»"; -"web_visuobject_dep_create_text" = "%1$@ erzeugt in %3$@ ein Objekt der Klasse %2$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ benutzt die Klasse %2$@ in %3$@."; -"web_visuobject_dep_hint" = "Das ist keine Assoziation: %@ merkt sich das %@-Objekt nicht in einem Attribut, es lebt nur in der Methode. Darum gestrichelt."; -"web_visuobject_dep_to_assoc" = "Als Attribut merken (Assoziation zu %@)"; -"web_visuobject_end_mult_ph" = "Mult."; -"web_visuobject_end_tip" = "Klick (Linie markiert) oder Rechtsklick: Rolle, Multiplizität und Navigierbarkeit an diesem Ende"; -"web_visuobject_end_role_ph" = "z. B. meineKatzen"; -"web_visuobject_new_menu" = "Neu"; -"web_visuobject_new_menu_tip" = "Neues Projekt, Source Folder, Package, Klasse oder Interface anlegen"; -"web_visuobject_new_project" = "Java-Projekt"; -"web_visuobject_new_folder" = "Source Folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Klasse"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "Neues Java-Projekt"; -"web_visuobject_new_project_hint" = "Im Workspace bekommt jedes Projekt einen eigenen Ordner mit src."; -"web_visuobject_new_folder_title" = "Neuer Source Folder"; -"web_visuobject_new_folder_hint" = "Ein weiterer Ordner für Quellcode neben src, z. B. test für Testklassen."; -"web_visuobject_new_package_title" = "Neues Package"; -"web_visuobject_new_package_hint" = "Package-Namen schreibt man klein, Teile mit Punkt: tiere oder schule.verwaltung."; -"web_visuobject_new_class_title" = "Neue Java-Klasse"; -"web_visuobject_new_class_hint" = "Klassennamen beginnen mit einem Großbuchstaben, z. B. Hund oder Bankkonto."; -"web_visuobject_new_interface_title" = "Neues Java-Interface"; -"web_visuobject_new_interface_hint" = "Ein Interface legt Methoden fest, die Klassen später implementieren."; -"web_visuobject_new_root" = "Source Folder"; -"web_visuobject_new_name" = "Name"; -"web_visuobject_new_modifiers" = "Modifier"; -"web_visuobject_new_package_private" = "package (ohne Modifier)"; -"web_visuobject_new_superclass" = "Oberklasse"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Erweitert Interfaces (extends)"; -"web_visuobject_new_stubs" = "Welche Methoden-Rümpfe sollen entstehen?"; -"web_visuobject_new_stub_constructors" = "Konstruktoren der Oberklasse"; -"web_visuobject_new_stub_inherited" = "Geerbte abstrakte Methoden"; -"web_visuobject_new_comment_legend" = "Kommentar"; -"web_visuobject_new_comment" = "Javadoc-Kommentar mit @author"; -"web_visuobject_new_author" = "Dein Name"; -"web_visuobject_new_finish" = "Fertigstellen"; -"web_visuobject_new_name_missing" = "Bitte gib einen Namen ein."; -"web_visuobject_new_exists" = "„%@“ gibt es im Projekt schon."; -"web_visuobject_new_upper" = "Klassennamen beginnen in Java mit einem Großbuchstaben."; -"web_visuobject_bad_folder" = "„%@“ ist kein gültiger Ordnername oder gibt es schon."; -"web_visuobject_inspector_hide" = "Objektinspektor einklappen"; -"web_visuobject_inspector_show" = "Objektinspektor aufklappen"; -"web_visuobject_inspector_empty" = "Klicke im Diagramm auf eine Beziehung (Linie), dann kannst du sie hier bearbeiten."; -"web_visuobject_rel_end_a" = "Ende A: %@ (Linie beginnt hier)"; -"web_visuobject_rel_end_b" = "Ende B: %@ (Linie endet hier)"; -"web_visuobject_ws_title" = "Workspace-Ordner auf deinem Rechner"; -"web_visuobject_ws_question" = "Wo speicherst du deine Projekte?"; -"web_visuobject_ws_hint" = "Wie in Eclipse: ein Workspace-Ordner auf deinem Rechner, darin ein Ordner je Projekt mit src und den .java-Dateien."; -"web_visuobject_ws_create" = "Ordner „%@“ anlegen"; -"web_visuobject_ws_open" = "Vorhandenen Workspace öffnen"; -"web_visuobject_ws_skip" = "Ohne Ordner (nur im Browser)"; -"web_visuobject_ws_choose" = "Workspace wählen"; -"web_visuobject_ws_reopen" = "Workspace „%@“ öffnen"; -"web_visuobject_ws_switch" = "Wechseln"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Projekt als .zip herunterladen, z. B. zum Abgeben"; -"web_visuobject_ws_saved" = "Gespeichert in %@/%@"; -"web_visuobject_ws_created" = "Neues Projekt „%@“ im Workspace"; -"web_visuobject_ws_failed" = "Speichern im Workspace hat nicht geklappt: %@"; -"web_visuobject_ws_taken" = "Im Workspace gibt es schon ein Projekt „%@“."; -"web_visuobject_ws_open_project" = "Projekt %@ öffnen"; -"web_visuobject_save_ws_tip" = "Im Workspace speichern (Strg+S)"; -"web_visuobject_unsaved" = "nicht gespeichert"; -"web_visuobject_rel_nav_navigable" = "navigierbar (Pfeil)"; -"web_visuobject_rel_nav_non-navigable" = "nicht navigierbar (Kreuz ×)"; -"web_visuobject_rel_nav_unspecified" = "nicht spezifiziert (offen)"; -"web_visuobject_rel_reading_flip" = "umdrehen"; -"web_visuobject_rel_reading_auto" = "Mit einem Namen liest sich die Beziehung in Zugrichtung."; -"web_visuobject_tools" = "Werkzeuge"; -"web_visuobject_tool_select" = "Auswahl"; -"web_visuobject_tool_select_tip" = "Auswählen und verschieben"; -"web_visuobject_tool_class" = "Klasse"; -"web_visuobject_tool_class_tip" = "Klasse: auf die Fläche ziehen oder wählen und auf die Fläche klicken"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: auf die Fläche ziehen oder wählen und auf die Fläche klicken"; -"web_visuobject_tool_link" = "Assoziation"; -"web_visuobject_tool_link_tip" = "Assoziation ohne Navigation: einfache Linie zwischen zwei Klassen ziehen"; -"web_visuobject_rel_link" = "Assoziation (ohne Navigation)"; -"web_visuobject_tool_not_link" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_association" = "Gerichtet"; -"web_visuobject_tool_association_tip" = "Gerichtete Assoziation: von der Klasse, die die andere kennt, zur anderen ziehen (Pfeil)"; -"web_visuobject_tool_aggregation" = "Aggregation"; -"web_visuobject_tool_aggregation_tip" = "Aggregation: vom Ganzen zum Teil ziehen (hat, Teile leben weiter)"; -"web_visuobject_tool_composition" = "Komposition"; -"web_visuobject_tool_composition_tip" = "Komposition: vom Ganzen zum Teil ziehen (besteht aus, Teile gehören fest dazu)"; -"web_visuobject_tool_extends" = "Vererbung"; -"web_visuobject_tool_extends_tip" = "Vererbung: von der Unterklasse zur Oberklasse ziehen (erbt von)"; -"web_visuobject_tool_implements" = "Realisierung"; -"web_visuobject_tool_implements_tip" = "Realisierung: von der Klasse zum Interface ziehen (implementiert)"; -"web_visuobject_tool_pick_second" = "Jetzt die zweite Klasse anklicken (von %@ aus). Esc bricht ab."; -"web_visuobject_tool_not_association" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_aggregation" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_composition" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_extends" = "%@ kann nicht von %@ erben: Klassen erben von Klassen, Interfaces von Interfaces. Für ein Interface nimm Realisierung."; -"web_visuobject_tool_not_implements" = "%@ kann %@ nicht implementieren: Nur eine Klasse implementiert ein Interface."; -"web_visuobject_inspector" = "Objektinspektor"; -"web_visuobject_connect" = "Ziehen: Beziehung zu einer anderen Klasse"; -"web_visuobject_rel_association" = "Assoziation"; -"web_visuobject_rel_directed" = "Gerichtete Assoziation"; -"web_visuobject_rel_aggregation" = "Aggregation (hat, Teile leben weiter)"; -"web_visuobject_rel_composition" = "Komposition (besteht aus, Teile gehören fest dazu)"; -"web_visuobject_rel_extends" = "Vererbung (erbt von)"; -"web_visuobject_rel_implements" = "Realisierung (implementiert)"; -"web_visuobject_rel_extends_text" = "%@ erbt von %@ (extends im Code)."; -"web_visuobject_rel_implements_text" = "%@ implementiert das Interface %@ (implements im Code)."; -"web_visuobject_rel_kind" = "Art"; -"web_visuobject_rel_name" = "Name der Beziehung"; -"web_visuobject_rel_name_ph" = "z. B. besitzt"; -"web_visuobject_rel_reading" = "Leserichtung"; -"web_visuobject_rel_navigable" = "Navigierbarkeit"; -"web_visuobject_rel_role" = "Rolle"; -"web_visuobject_rel_multiplicity" = "Multiplizität"; -"web_visuobject_rel_role_field" = "= Attribut %@.%@ im Code"; -"web_visuobject_rel_role_only_uml" = "nur im Diagramm (kein Attribut, solange der Pfeil nur in eine Richtung zeigt)"; -"web_visuobject_rel_delete" = "Beziehung löschen"; -"web_visuobject_rel_impossible" = "Von %@ zu %@ gibt es keine passende Beziehung."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Breite ziehen (Doppelklick: Standard)"; -"web_visuobject_pane_show" = "Bereich aufklappen"; -"web_visuobject_pane_hide" = "Bereich einklappen"; -"web_visuobject_close_tab" = "%@ schließen"; -"web_visuobject_collapse" = "Einklappen"; -"web_visuobject_expand" = "Aufklappen"; -"web_visuobject_tree_empty" = "Noch leer. Lege mit „+ Neu“ ein Package oder eine Klasse an."; -"web_visuobject_delete" = "Löschen"; -"web_visuobject_default_package" = "(Standard-Package)"; -"web_visuobject_bad_package" = "„%@“ ist kein gültiger Package-Name oder gibt es schon. Package-Namen schreibt man klein, z. B. tiere."; -"web_visuobject_new_package_name" = "neuespackage"; -"web_visuobject_no_file" = "Keine Datei offen"; -"web_visuobject_project_name" = "MeinProjekt"; -"web_visuobject_explorer_show" = "Package Explorer zeigen"; -"web_visuobject_explorer_hide" = "Package Explorer einklappen"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Projekt als .zip speichern: Projektname/src/package/Klasse.java"; -"web_visuobject_open_tip" = "Projekt öffnen (.zip wie aus Eclipse oder BlueJ) oder .java-Dateien ins Projekt holen"; -"web_visuobject_method_ph" = "+ bellen(): void"; -"web_code_scopes" = "Blöcke farbig"; -"web_code_scopes_hint" = "Code und Struktogramm: Schleife rosa, Verzweigung blau, Methode gelb, Klasse grün"; -"web_pseudocode" = "Pseudocode"; - -/* VisuFlow (PAP zeichnen) */ -"web_visuflow_subtitle" = "PAP zeichnen"; -"web_visuflow_world_hint" = "VisuFlow: einen Programmablaufplan (PAP, englisch flowchart) frei zeichnen und als Bild oder PDF exportieren. Wechseln geht jederzeit im Zahnrad."; -"web_visuflow_palette" = "Symbole"; -"web_visuflow_palette_hint" = "Antippen hängt das Symbol unter das gewählte an und verbindet es mit einem Pfeil. Du kannst es auch auf die Fläche ziehen."; -"web_visuflow_shape_start" = "Start"; -"web_visuflow_shape_ende" = "Ende"; -"web_visuflow_shape_anweisung" = "Anweisung"; -"web_visuflow_shape_ein" = "Ein-/Ausgabe"; -"web_visuflow_shape_verzweigung" = "Verzweigung"; -"web_visuflow_shape_unterprogramm" = "Unterprogramm"; -"web_visuflow_shape_start_tip" = "Oval: Hier beginnt der Ablauf"; -"web_visuflow_shape_ende_tip" = "Oval: Hier endet der Ablauf"; -"web_visuflow_shape_anweisung_tip" = "Rechteck: eine Anweisung, zum Beispiel „Wasser kochen“"; -"web_visuflow_shape_ein_tip" = "Parallelogramm: Eingabe oder Ausgabe, zum Beispiel „Eingabe: Zahl“"; -"web_visuflow_shape_verzweigung_tip" = "Raute: eine Frage mit den Ausgängen ja und nein"; -"web_visuflow_shape_unterprogramm_tip" = "Rechteck mit zwei Strichen: ruft ein Unterprogramm auf"; -"web_visuflow_text_start" = "Start"; -"web_visuflow_text_ende" = "Ende"; -"web_visuflow_text_anweisung" = "Anweisung"; -"web_visuflow_text_ein" = "Eingabe: Zahl"; -"web_visuflow_text_verzweigung" = "Bedingung?"; -"web_visuflow_text_unterprogramm" = "Unterprogramm"; -"web_visuflow_new_tip" = "Neu: leerer PAP mit Start (Rückgängig holt den alten zurück)"; -"web_visuflow_open_tip" = "PAP-Datei (.visuflow) öffnen"; -"web_visuflow_save_tip" = "PAP als Datei (.visuflow) speichern"; -"web_visuflow_delete" = "Löschen"; -"web_visuflow_delete_tip" = "Gewähltes Symbol oder gewählten Pfeil löschen (Entf)"; -"web_visuflow_swap" = "ja/nein tauschen"; -"web_visuflow_swap_tip" = "Raute: „ja“ und „nein“ tauschen die Seiten"; -"web_visuflow_example" = "Beispiel"; -"web_visuflow_example_tip" = "Beispiel „Tee kochen“ aus Lektion 1 laden (Rückgängig holt den alten PAP zurück)"; -"web_visuflow_example_title" = "Tee kochen"; -"web_visuflow_example_water" = "Wasser kochen"; -"web_visuflow_example_bag" = "Teebeutel in die Tasse"; -"web_visuflow_example_hot" = "Tee noch zu heiß?"; -"web_visuflow_example_wait" = "Warten"; -"web_visuflow_example_drink" = "Tee trinken"; -"web_visuflow_title_label" = "Titel des PAP"; -"web_visuflow_title_ph" = "Titel des PAP"; -"web_visuflow_canvas_label" = "Zeichenfläche des PAP"; -"web_visuflow_open_error" = "Die Datei ist kein VisuFlow-PAP."; -"web_visuflow_saved" = "Gespeichert als %@"; -"web_visuflow_status_empty" = "Zieh ein Symbol aus der Leiste auf die Fläche oder tippe es an."; -"web_visuflow_status_idle" = "Symbol antippen wählt es aus. Vom Punkt am Ausgang ziehst du einen Pfeil zum nächsten Symbol."; -"web_visuflow_status_node" = "Ziehen verschiebt das Symbol, nochmal antippen ändert den Text. Vom Punkt am Ausgang einen Pfeil ziehen."; -"web_visuflow_status_edge" = "Pfeil gewählt. Löschen entfernt ihn."; -"web_visuflow_status_connect" = "Loslassen über dem Symbol, zu dem der Pfeil führt."; -"web_visuflow_edit_label" = "Text im Symbol"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Variable umbenennen …"; -"web_rename_title" = "Variable umbenennen"; -"web_rename_old" = "Name"; -"web_rename_new" = "Neuer Name"; -"web_rename_hint" = "Ändert jede Stelle mit genau dieser Schreibweise (zahl ist nicht Zahl), im Code und im Struktogramm. Text in \"…\" und Kommentare bleiben."; -"web_rename_count_fmt" = "Kommt %d-mal vor."; -"web_rename_exists_fmt" = "„%@“ gibt es schon: Danach wären beide eine Variable."; -"web_rename_invalid" = "Ein Name beginnt mit einem Buchstaben und enthält nur Buchstaben, Ziffern und _."; -"web_rename_keyword_fmt" = "„%@“ ist ein Java-Schlüsselwort."; -"web_rename_apply" = "Umbenennen"; -"web_rename_cancel" = "Abbrechen"; -"web_visubot_world_visucode_hint" = "Andere Programme wie %1$@ oder %2$@ findest du auf visucode.de."; diff --git a/web/src/i18n/el.strings b/web/src/i18n/el.strings deleted file mode 100644 index 2ef745bf..00000000 --- a/web/src/i18n/el.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Κείμενα που υπάρχουν μόνο στην έκδοση web. Όλα τα άλλα προέρχονται από το Localizable.strings της εφαρμογής. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Διάγραμμα VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Εξαγωγή…"; -"web_export_title" = "Αποθήκευση ως εικόνα ή PDF ή εκτύπωση"; -"web_export_png" = "Εικόνα (PNG)"; -"web_export_svg" = "Διανυσματικό γραφικό (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Αρχείο VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Η εξαγωγή απέτυχε: %@"; -"web_print_hint" = "Με «Εξαγωγή… → PDF» μπορείτε να αποθηκεύσετε το διάγραμμα και να το εκτυπώσετε από εκεί."; -"web_delete" = "Διαγραφή"; -"web_language_title" = "Γλώσσα περιβάλλοντος"; -"web_simulation_start" = "Έναρξη προσομοίωσης"; -"web_simulation_end" = "Τέλος προσομοίωσης"; -"web_simulation_start_title" = "Εκτέλεση του διαγράμματος βήμα προς βήμα"; -"web_simulation_end_title" = "Τέλος προσομοίωσης και συνέχεια επεξεργασίας"; -"web_palette_hint" = "Σύρετε στο διάγραμμα"; -"web_tabs_label" = "Διαγράμματα"; -"web_status_modified" = "τροποποιήθηκε"; -"web_inspector_title" = "Ιδιότητες"; -"web_inspector_resize" = "Αλλαγή ύψους του επιθεωρητή αντικειμένων: σύρετε τη γραμμή πάνω ή κάτω (διπλό κλικ: προεπιλογή)"; -"web_inspector_help_drop" = "Σύρετε στοιχεία από την παλέτα σε ένα πλακίδιο: πάνω = πριν, κάτω = μετά, πάνω στο «ø» = αντικατάσταση. Τα υπάρχοντα στοιχεία μετακινούνται με το ποντίκι."; -"web_inspector_help_inline" = "Διπλό κλικ ή διπλό πάτημα σε ένα στοιχείο για επεξεργασία του κειμένου απευθείας στο διάγραμμα (Enter εφαρμογή, Esc ακύρωση). Το ίδιο και για τα ονόματα περιπτώσεων."; -"web_inspector_help_files" = "Μπορείτε επίσης να σύρετε αρχεία στο παράθυρο."; -"web_case_name" = "Όνομα περίπτωσης"; -"web_case_name_placeholder" = "π.χ. 1, ok, default"; -"web_copied" = "Το στοιχείο αντιγράφηκε."; -"web_discard_message_fmt" = "Οι αλλαγές στο «%@» θα χαθούν."; -"web_err_unreadable_fmt" = "Το «%@» δεν είναι αναγνώσιμο αρχείο VisuStruct (%@)."; -"web_saved_fmt" = "Το «%@» αποθηκεύτηκε."; -"web_saved_txt_fmt" = "Αποθηκεύτηκε ως «%@». Αφαιρέστε την κατάληξη .txt για να το χρησιμοποιήσετε."; -"web_drop_impossible" = "Δεν είναι δυνατή η απόθεση εδώ"; -"web_sim_delay" = "Παύση ανά βήμα"; -"web_sim_delay_value_fmt" = "%@ δευτ."; -"web_codegen_language" = "Γλώσσα"; -"web_codegen_comments" = "Κείμενο διαγράμματος ως σχόλια"; -"web_codegen_empty_else" = "Εμφάνιση κενού κλάδου else στον κώδικα"; -"web_copied_check" = "Αντιγράφηκε ✓"; -"web_copy_manual" = "Επιλέχθηκε, πατήστε Ctrl+C για αντιγραφή"; -"web_run_stopped_loop" = "Η εκτέλεση διακόπηκε: πιθανός ατέρμονος βρόχος."; -"web_run_cancelled" = "Η εκτέλεση ακυρώθηκε."; -"web_run_error" = "Σφάλμα κατά την εκτέλεση."; -"web_run_dropped_fmt" = "… %d προηγούμενες γραμμές κρυμμένες"; -"web_sim_call_arguments_fmt" = "Η κλήση δεν ταιριάζει με την κεφαλίδα του %@. Έλεγξε τις τιμές μέσα στις παρενθέσεις."; -"web_sim_missing_return_fmt" = "Το %@ τελείωσε χωρίς να επιστρέψει τιμή με return."; -"web_sim_file_not_found_fmt" = "Δεν υπάρχει αρχείο με όνομα %@."; -"web_sim_end_of_file_fmt" = "Το αρχείο %@ δεν έχει άλλες γραμμές."; -"web_sim_null_value_fmt" = "Το %@ είναι null."; -"web_sim_unknown_variable_case_fmt" = "Άγνωστη μεταβλητή: %1$@. Η Java ξεχωρίζει κεφαλαία και πεζά: μήπως εννοούσες %2$@;"; -"web_sim_written_file_fmt" = "%@ (αποθηκεύτηκε)"; -"web_site_home" = "Αρχική σελίδα"; -"web_site_imprint" = "Στοιχεία εκδότη"; -"web_site_privacy" = "Απόρρητο"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Προγραμματισμός"; -"web_live_hide" = "Απόκρυψη προγραμματισμού"; -"web_scale_canvas" = "Μέγεθος κειμένου: διάγραμμα"; -"web_scale_code" = "Μέγεθος κειμένου: προγραμματισμός"; -"web_live_indent" = "Εσοχή"; -"web_live_indent_title" = "Εσοχή κώδικα: τέσσερα κενά ανά επίπεδο (επιλεγμένες γραμμές, αλλιώς όλα)"; -"web_live_show" = "Εμφάνιση προγραμματισμού"; -"web_live_resize" = "Αλλαγή πλάτους περιοχής κώδικα (διπλό κλικ: επαναφορά)"; -"web_live_hint" = "Ο κώδικας μεγαλώνει μαζί με το διάγραμμα. Γκρι = σύμβολο κράτησης: γράψε στον επιθεωρητή και το κείμενό σου εμφανίζεται εδώ. Κάνε κλικ σε μια γραμμή για να επιλέξεις το στοιχείο."; -"web_live_ph_selector" = "μεταβλητή"; -"web_live_ph_code" = "Ο κώδικάς σου"; -"web_live_ph_end" = "τέλος"; -"web_live_language" = "Γλώσσα προγραμματισμού"; -"web_live_java_class" = "Ως κλάση"; -"web_live_java_class_hint" = "Όνομα κλάσης = τίτλος διαγράμματος"; -"web_live_java_main" = "Με μέθοδο main"; -"web_settings_display" = "Εμφάνιση"; -"web_live_swing" = "Πραγματική Java (με Swing)"; -"web_live_swing_hint" = "Πραγματική Java με παράθυρα (CheerpJ). Κατεβάζει μία φορά περίπου 40 MB στην πρώτη εκτέλεση."; -"web_live_swing_windows" = "Παράθυρα Java"; -"web_live_swing_hide" = "Κλείσιμο παραθύρων Java"; -"web_live_swing_loading" = "Φόρτωση Java (την πρώτη φορά περίπου 40 MB) …"; -"web_live_swing_compiling" = "Μεταγλώττιση …"; -"web_live_swing_running" = "Το πρόγραμμα εκτελείται."; -"web_live_swing_compile_failed" = "Σφάλμα μεταγλώττισης, δες παραπάνω."; -"web_live_swing_failed" = "Δεν ήταν δυνατή η φόρτωση της Java. Έλεγξε τη σύνδεση στο διαδίκτυο."; -"web_live_hint_edit" = "Γράψε εδώ κώδικα Java και το διάγραμμα φτιάχνεται μόνο του. Ή δούλεψε στο διάγραμμα και ο κώδικας μεγαλώνει μαζί. Γκρι = σύμβολο κράτησης θέσης, απλώς γράψε από πάνω."; -"web_live_edit_label" = "Κώδικας Java"; -"web_parse_line_fmt" = "Γραμμή %d: %@"; -"web_parse_missing" = "Λείπει ακόμα εδώ: %@"; -"web_parse_extra" = "Περισσεύει: %@"; -"web_parse_unclosed_string" = "Λείπει το %@ που κλείνει."; -"web_parse_else_without_if" = "Αυτό το «else» δεν έχει «if»."; -"web_parse_case_outside_switch" = "Τα «case» και «default» ανήκουν μέσα σε «switch»."; -"web_parse_missing_do_while" = "Μετά το «do { … }» λείπει το «while (συνθήκη);»."; -"web_parse_more_methods" = "Προς το παρόν μετράει μόνο μία μέθοδος. Δημιούργησε τα άλλα υποπρογράμματα σε ξεχωριστές καρτέλες."; -"web_parse_missing_import" = "Λείπει στην αρχή το %@ Χωρίς αυτή τη γραμμή η Java δεν γνωρίζει το Scanner."; -"web_parse_missing_scanner" = "Λείπει πρώτα %@ Χωρίς αυτή τη γραμμή ο Scanner δεν υπάρχει."; -"web_parse_unknown_type" = "Η Java δεν γνωρίζει αυτόν τον τύπο δεδομένων. Μήπως εννοείς %@;"; -"web_quickfix_insert_fmt" = "Πρόταση: εισαγωγή %@"; -"web_quickfix_replace_fmt" = "Πρόταση: %1$@ αντί για %2$@"; -"web_parse_wrong_case" = "Η Java ξεχωρίζει κεφαλαία και πεζά. Το σωστό είναι %@."; -"web_editor_title" = "Διάγραμμα"; -"web_editor_show" = "Εμφάνιση διαγράμματος"; -"web_editor_hide" = "Απόκρυψη διαγράμματος"; -"web_keywords_title" = "Λέξεις-κλειδιά κώδικα"; -"web_keywords_hint" = "if, while, for αντί για ονόματα στοιχείων"; -"web_palette_compact" = "Στοιχεία πάντα συμπαγή"; -"web_palette_compact_hint" = "Σύμβολο με μικρό όνομα από κάτω, αλλιώς μόνο όταν η στήλη είναι στενή"; -"web_about_version_fmt" = "Έκδοση %@"; -"web_about_software" = "Λογισμικό που χρησιμοποιείται"; -"web_about_software_text" = "Ο επεξεργαστής κώδικα χρησιμοποιεί τα CodeMirror και Lezer (άδεια MIT). Με την υποστήριξη Swing, το VisuStruct φορτώνει το CheerpJ της Leaning Technologies (άδεια Community) και το javac από το OpenJDK."; -"web_about_licenses" = "Κείμενα αδειών"; -"web_live_run" = "Εκτέλεση"; -"web_live_run_title" = "Εκτέλεση προγράμματος: η έξοδος και η είσοδος εμφανίζονται παρακάτω"; -"web_live_run_finished" = "Το πρόγραμμα τελείωσε."; -"web_live_run_stopped" = "Διακόπηκε."; -"web_console" = "Κονσόλα"; -"web_console_hide" = "Απόκρυψη κονσόλας"; -"web_console_resize" = "Αλλαγή ύψους κονσόλας"; -"web_diagram_tools" = "Εργαλεία διαγράμματος"; -"web_files_title" = "Αρχεία"; -"web_files_show" = "Εμφάνιση αρχείων"; -"web_files_hide" = "Απόκρυψη αρχείων"; -"web_files_resize" = "Αλλαγή πλάτους αρχείων"; -"web_files_new_folder" = "Νέος φάκελος"; -"web_files_switch" = "Επιλογή άλλου φακέλου"; -"web_files_delete" = "Διαγραφή"; -"web_files_in_browser" = "Στον χώρο αυτού του προγράμματος περιήγησης"; -"web_files_save_hint_fmt" = "Η αποθήκευση βάζει το πρόγραμμα στο %@."; -"web_files_empty" = "Δεν έχει αποθηκευτεί τίποτα ακόμη. Κατά την αποθήκευση το VisuStruct δημιουργεί εδώ έναν φάκελο με τη σημερινή ημερομηνία."; -"web_files_reconnect_hint" = "Μετά την επαναφόρτωση, το πρόγραμμα περιήγησης ρωτά ξανά αν το VisuStruct μπορεί να χρησιμοποιήσει τον φάκελό σου."; -"web_files_reconnect_fmt" = "Άνοιγμα φακέλου «%@»"; -"web_files_connect_hint" = "Επίλεξε έναν φάκελο ως χώρο εργασίας. Το VisuStruct δημιουργεί εκεί έναν φάκελο για κάθε ημέρα και αποθηκεύει διάγραμμα και κώδικα."; -"web_files_connect" = "Επιλογή φακέλου"; -"web_files_browser_hint" = "Αυτό το πρόγραμμα περιήγησης δεν μπορεί να ανοίξει φακέλους της συσκευής (π.χ. στο iPad). Τα αρχεία σου μένουν στον χώρο του."; -"web_files_browser" = "Αποθήκευση στο πρόγραμμα περιήγησης"; -"web_files_delete_confirm_fmt" = "Να διαγραφεί οριστικά το «%@»;"; -"web_files_folder_prompt" = "Όνομα νέου φακέλου:"; -"web_files_default_name" = "Πρόγραμμα"; -"web_files_saved_fmt" = "Αποθηκεύτηκε: %@"; -"web_files_create" = "Δημιουργία"; -"web_learn_ludwig_tip" = "Η συμβουλή του Ludwig"; -"web_game_title" = "Παιχνίδι: Αληθές ή ψευδές;"; -"web_game_intro" = "Ο Ludwig σου δείχνει τιμές και μια συνθήκη. Είναι αληθής (true) ή ψευδής (false); Δέκα γύροι, όλο και δυσκολότεροι."; -"web_game_start" = "Έναρξη παιχνιδιού"; -"web_game_round_fmt" = "Γύρος %@ από %@"; -"web_game_score_fmt" = "Πόντοι: %@"; -"web_game_true" = "αληθές (true)"; -"web_game_false" = "ψευδές (false)"; -"web_game_right" = "Σωστά!"; -"web_game_wrong" = "Όχι ακριβώς. Έτσι υπολογίζεται:"; -"web_game_next" = "Επόμενο"; -"web_game_finish" = "Αποτέλεσμα"; -"web_game_done_fmt" = "%@ από %@ σωστά."; -"web_game_perfect" = "Όλα σωστά – ο Ludwig εντυπωσιάστηκε!"; -"web_game_good" = "Μπράβο! Δες ξανά τα λάθη σου και δοκίμασε πάλι."; -"web_game_practice" = "Η εξάσκηση φέρνει την τελειότητα. Διάβασε ξανά τον πίνακα αλήθειας και παίξε άλλον έναν γύρο."; -"web_game_again" = "Παίξε ξανά"; -"web_game_wrong_short" = "Δυστυχώς λάθος."; -"web_game_practice_short" = "Η εξάσκηση φέρνει την τελειότητα. Διάβασε ξανά τις εξηγήσεις και παίξε άλλον έναν γύρο."; -"web_game_clicks" = "Κλικ:"; -"web_game_nobody" = "Κανείς δεν ακούει – δεν συμβαίνει τίποτα."; -"web_game_event_fmt" = "Κλικ στο «%@»: ο ακροατής το ακούει και εκτελεί τον κώδικά του."; -"web_game_try" = "Δοκίμασε τώρα μόνος σου τα κουμπιά στο παράθυρο."; -"web_game_time_fmt" = "Απομένουν %@ δ"; -"web_game_defused" = "✂️ Εξουδετερώθηκε! Βρήκες το λάθος."; -"web_game_boom_time" = "💥 Μπαμ! Ο χρόνος τελείωσε."; -"web_game_boom_wrong" = "💥 Μπαμ! Ήταν λάθος γραμμή."; -"web_game_boom_part" = "💥 Μπαμ! Σωστή γραμμή, αλλά το λάθος είναι σε άλλο κομμάτι της."; -"web_game_boom_wrong_part" = "💥 Μπαμ! Το λάθος είναι σε άλλη γραμμή."; -"web_game_bomb_parts_hint" = "Πάτησε ακριβώς το λάθος κομμάτι."; -"web_game_fix" = "Η σωστή γραμμή:"; -"web_game_order_hint" = "Πάτησε τα βήματα με τη σωστή σειρά."; -"web_debug_step" = "Βήμα"; -"web_debug_step_title" = "Βήμα: εκτέλεση μίας εντολής και νέα παύση"; -"web_debug_continue" = "Συνέχεια έως το επόμενο σημείο διακοπής"; -"web_debug_paused_fmt" = "Παύση πριν από τη γραμμή %d."; -"web_debug_gutter_title" = "Κάνε κλικ σε αριθμό γραμμής για να βάλεις ή να βγάλεις σημείο διακοπής"; -"web_swap_to_code" = "Μεγάλος προγραμματισμός"; -"web_swap_to_editor" = "Μεγάλο διάγραμμα"; -"web_editor_resize" = "Αλλαγή πλάτους διαγράμματος"; -"web_palette_resize" = "Αλλαγή πλάτους στοιχείων"; -"web_palette_hide" = "Απόκρυψη στοιχείων"; -"web_palette_show" = "Εμφάνιση στοιχείων"; -"web_code_scopes" = "Χρωματιστά μπλοκ κώδικα"; -"web_code_scopes_hint" = "Κλάση, μέθοδος, βρόχος, διακλάδωση σε δικά τους πλαίσια"; -"web_pseudocode" = "Ψευδοκώδικας"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Μετονομασία μεταβλητής …"; -"web_rename_title" = "Μετονομασία μεταβλητής"; -"web_rename_old" = "Όνομα"; -"web_rename_new" = "Νέο όνομα"; -"web_rename_hint" = "Αλλάζει κάθε σημείο με ακριβώς αυτή τη γραφή (number δεν είναι Number), στον κώδικα και στο δομόγραμμα. Το κείμενο σε \"…\" και τα σχόλια μένουν."; -"web_rename_count_fmt" = "Εμφανίζεται %d φορές."; -"web_rename_exists_fmt" = "Το «%@» υπάρχει ήδη: μετά θα ήταν και τα δύο μία μεταβλητή."; -"web_rename_invalid" = "Ένα όνομα αρχίζει με γράμμα και περιέχει μόνο γράμματα, ψηφία και _."; -"web_rename_keyword_fmt" = "Το «%@» είναι λέξη-κλειδί της Java."; -"web_rename_apply" = "Μετονομασία"; -"web_rename_cancel" = "Άκυρο"; diff --git a/web/src/i18n/en.strings b/web/src/i18n/en.strings deleted file mode 100644 index 7670ebc2..00000000 --- a/web/src/i18n/en.strings +++ /dev/null @@ -1,800 +0,0 @@ -/* Texts that exist only in the web version. Everything else comes from the app's Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct structure chart"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Export…"; -"web_export_title" = "Save as image or PDF, or print"; -"web_export_png" = "Image (PNG)"; -"web_export_svg" = "Vector graphic (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct file (.visustruct)"; -"web_export_failed_fmt" = "Export failed: %@"; -"web_print_hint" = "Use “Export… → PDF” to save the diagram and print it from there."; -"web_delete" = "Delete"; -"web_language_title" = "Interface language"; -"web_simulation_start" = "Start simulation"; -"web_simulation_end" = "End simulation"; -"web_simulation_start_title" = "Run the structure chart step by step"; -"web_simulation_end_title" = "End the simulation and continue editing"; -"web_palette_hint" = "Drag into the structure chart"; -"web_tabs_label" = "Diagrams"; -"web_status_modified" = "modified"; -"web_inspector_title" = "Object Inspector"; -"web_inspector_help_drop" = "Drag elements from the “Elements” area onto a tile: top = before, bottom = after, onto “ø” = replace. Existing elements can be moved with the mouse."; -"web_inspector_help_inline" = "Double-click or double-tap an element to edit its text right in the structure chart (Enter applies, Esc cancels). Case labels work the same way."; -"web_inspector_help_files" = "You can also drop files into the window."; -"web_case_name" = "Case name"; -"web_case_name_placeholder" = "e.g. 1, ok, default"; -"web_copied" = "Element copied."; -"web_discard_message_fmt" = "The changes to “%@” will be lost."; -"web_err_unreadable_fmt" = "“%@” is not a readable VisuStruct file (%@)."; -"web_saved_fmt" = "“%@” saved."; -"web_saved_txt_fmt" = "Saved as “%@”. Remove the .txt extension to use it."; -"web_drop_impossible" = "Cannot drop here"; -"web_sim_delay" = "Pause per step"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Language"; -"web_codegen_comments" = "Diagram text as comments"; -"web_codegen_empty_else" = "Emit empty else branch in code"; -"web_copied_check" = "Copied ✓"; -"web_copy_manual" = "Selected, press Ctrl+C to copy"; -"web_run_stopped_loop" = "Execution stopped: possible infinite loop."; -"web_run_cancelled" = "Execution cancelled."; -"web_run_error" = "Error while running."; -"web_run_dropped_fmt" = "… %d earlier lines hidden"; - -/* Learning area (lessons are German only for now) */ -"web_learn_title" = "Learn"; -"web_learn_hide" = "Collapse the learning area"; -"web_learn_show" = "Expand the learning area: lessons, exercises and reference"; -"web_learn_lessons" = "Lessons"; -"web_learn_tasks" = "Exercises"; -"web_learn_reference" = "Reference"; -"web_learn_intro" = "Learn step by step, with exercises. Your progress is remembered in this browser."; -"web_learn_tasks_intro" = "Small projects without instructions. Each one names the lesson you should finish first."; -"web_learn_step_of_fmt" = "Step %d of %d"; -"web_learn_lesson_fmt" = "Lesson %d"; -"web_learn_all_lessons" = "All lessons"; -"web_learn_all_tasks" = "All exercises"; -"web_learn_back" = "Back"; -"web_learn_next" = "Next"; -"web_learn_finish" = "Finish lesson"; -"web_learn_done" = "Finished"; -"web_learn_after_fmt" = "After lesson %d: %@"; -"web_learn_level_fmt" = "Difficulty %d of 3"; -"web_learn_exercise" = "Exercise"; -"web_learn_brag" = "Fun facts with Ludwig"; -"web_learn_solved" = "solved"; -"web_learn_open_exercise" = "Open in editor"; -"web_learn_solve_in_editor" = "Solve this exercise in the %@ area."; -"web_learn_solve_in_code" = "Solve this exercise in the %@ area."; -"web_learn_solve_in_both" = "Solve this exercise in the %1$@ and %2$@ areas."; -"web_learn_open_in_editor" = "Open in editor"; -"web_learn_replay" = "Play again"; -"web_learn_graphic_labels" = "👆 Click the picture to show or hide the labels"; -"web_learn_check" = "Check"; -"web_learn_hint" = "Hint"; -"web_learn_reset" = "Start over"; -"web_learn_reset_confirm" = "Really start over?"; -"web_learn_solution" = "Show sample solution"; -"web_learn_hint_more" = "Another hint"; -"web_learn_hint_fmt" = "Hint %d of %d"; -"web_learn_teacher" = "For teachers"; -"web_learn_teacher_intro" = "The teacher code shows the sample solutions for all exercises. The browser remembers it."; -"web_learn_teacher_code" = "Teacher code"; -"web_learn_teacher_unlock" = "Unlock"; -"web_learn_teacher_wrong" = "The code is not correct."; -"web_learn_teacher_on" = "Teacher mode is on: sample solutions are visible for all exercises."; -"web_learn_teacher_off" = "Leave teacher mode"; -"web_learn_open_first" = "Open the exercise in the editor first and build your structure chart there."; -"web_learn_empty" = "Your structure chart is still empty. Drag elements from the “Elements” area into it first."; -"web_learn_passed" = "Well done! Your structure chart does exactly what it should."; -"web_learn_failed" = "Not quite yet. Compare the expected output with yours:"; -"web_learn_missing_fmt" = "Your structure chart still needs: %@"; -"web_learn_input_fmt" = "Input: %@"; -"web_learn_no_input" = "No input"; -"web_learn_expected" = "Expected"; -"web_learn_actual" = "Your output"; -"web_learn_missing_input" = "Your structure chart asks for more input than planned."; -"web_learn_unused_input" = "Your structure chart does not ask for all inputs."; -"web_learn_missing_line_break" = "Almost! Only a line break is missing. System.out.print keeps writing on the same line, System.out.println starts a new line afterwards."; -"web_learn_too_many_steps" = "Stopped after 100,000 steps. Is a loop running forever?"; -"web_learn_score_fmt" = "%d of %d correct"; -"web_learn_cloze_hint" = "Type the missing words into the gaps and press “Check”."; -"web_learn_cloze_score_fmt" = "%d of %d gaps correct"; -"web_learn_cloze_all_right" = "All gaps correct!"; -"web_learn_cloze_solution" = "Show solution"; -"web_learn_cloze_again" = "Try again"; -"web_learn_pap_hint" = "Tap an element on the right and then its place in the chart. You can also drag it there. Tapping a filled place gives its element back."; -"web_learn_pap_score_fmt" = "%d of %d elements correct"; -"web_learn_pap_all_right" = "All correct! Your flowchart is finished."; -"web_learn_pap_missing_fmt" = "%d elements are still missing."; -"web_learn_pap_empty" = "Empty place"; -"web_learn_pap_yes" = "yes"; -"web_learn_pap_no" = "no"; -"web_learn_pap_legend_oval" = "Start or end"; -"web_learn_pap_legend_rect" = "Statement"; -"web_learn_pap_legend_diamond" = "Decision: question with yes and no"; -"web_learn_pap_legend_para" = "Input or output"; -"web_learn_review" = "Review"; -"web_learn_terms" = "Technical terms"; -"web_inspector_resize" = "Change the height of the object inspector: drag or swipe the line up or down (double-click: default)"; -"web_learn_resize" = "Change the width of the learning area (double-click: reset)"; -"web_learn_competences_intro" = "At the end of this lesson I can …"; -"web_learn_rating_sun" = "I can do this confidently"; -"web_learn_rating_cloud" = "partly"; -"web_learn_rating_umbrella" = "not yet"; -"web_learn_review_title" = "Your checklist compared"; -"web_learn_review_hint" = "Here your self-assessment and the quiz do not match. Read the step again and rate yourself again in the checklist."; -"web_learn_review_match" = "Your self-assessment matches your quiz. Well done!"; -"web_learn_review_overrated_fmt" = "You chose ☀️, but question %@ was wrong."; -"web_learn_review_underrated" = "All questions on this were right. You can do more than you think!"; -"web_learn_review_unrated" = "not rated yet"; -"web_learn_back_to_checklist" = "Back to checklist"; -"web_learn_step_fmt" = "Step %d: %@"; -"web_sim_call_arguments_fmt" = "The call does not match the header of %@. Check the values in the parentheses."; -"web_sim_missing_return_fmt" = "%@ ended without returning a value with return."; -"web_sim_file_not_found_fmt" = "There is no file called %@."; -"web_sim_end_of_file_fmt" = "The file %@ has no more lines."; -"web_sim_null_value_fmt" = "%@ is null."; -"web_sim_unknown_variable_case_fmt" = "Unknown variable: %1$@. Java is case-sensitive: did you mean %2$@?"; -"web_sim_written_file_fmt" = "%@ (saved)"; -"web_site_home" = "Home page"; -"web_site_imprint" = "Imprint"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Code"; -"web_live_hide" = "Hide code"; -"web_scale_canvas" = "Text size: structure chart"; -"web_scale_code" = "Text size: Code"; -"web_live_indent" = "Indent"; -"web_live_indent_title" = "Indent and format the code: every } on its own line, spaces around operators, four spaces per level (selected lines, otherwise everything)"; -"web_live_show" = "Show code"; -"web_live_resize" = "Change width of the code area (double-click: reset)"; -"web_live_hint" = "The code grows with your diagram. Grey = placeholder: type in the object inspector and your text appears there. Click a line to select its element."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Your code"; -"web_live_ph_end" = "end"; -"web_live_language" = "Programming language"; -"web_live_java_class" = "As a class"; -"web_live_java_class_hint" = "Class name = title of the diagram"; -"web_live_java_main" = "With main method"; -"web_settings_display" = "Display"; -"web_live_swing" = "Real Java (with Swing)"; -"web_live_swing_hint" = "Real Java with windows (CheerpJ). Downloads about 40 MB once, on the first run."; -"web_live_swing_windows" = "Java windows"; -"web_live_swing_hide" = "Close Java windows"; -"web_live_swing_loading" = "Loading Java (about 40 MB the first time) …"; -"web_live_swing_compiling" = "Compiling …"; -"web_live_swing_running" = "Program is running."; -"web_live_swing_compile_failed" = "Compile error, see above."; -"web_live_swing_failed" = "Java could not be loaded. Check your internet connection."; -"web_live_hint_edit" = "Type Java code here and the diagram builds itself. Or work in the diagram and the code grows along. Grey = placeholder, just type over it."; -"web_live_edit_label" = "Java code"; -"web_parse_line_fmt" = "Line %d: %@"; -"web_parse_missing" = "Still missing here: %@"; -"web_parse_extra" = "One too many: %@"; -"web_parse_unclosed_string" = "The closing %@ is missing here."; -"web_parse_else_without_if" = "This “else” has no matching “if”."; -"web_parse_case_outside_switch" = "“case” and “default” belong inside a “switch”."; -"web_parse_missing_do_while" = "After “do { … }” you still need “while (condition);”."; -"web_parse_more_methods" = "Only one method counts here for now. Create further subprograms as separate tabs."; -"web_parse_missing_import" = "%@ is missing at the very top. Without this line Java doesn’t know Scanner."; -"web_parse_missing_scanner" = "%@ is missing before this line. Without it the Scanner doesn’t exist."; -"web_parse_unknown_type" = "Java doesn’t know this data type. Did you mean %@?"; -"web_quickfix_insert_fmt" = "Suggestion: insert %@"; -"web_quickfix_replace_fmt" = "Suggestion: %1$@ instead of %2$@"; -"web_parse_wrong_case" = "Java is case-sensitive. The right spelling is %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Show diagram"; -"web_editor_hide" = "Hide diagram"; -"web_keywords_title" = "Code keywords"; -"web_keywords_hint" = "if, while, for instead of Branch, For loop …"; -"web_palette_compact" = "Elements always compact"; -"web_palette_compact_hint" = "Symbol with a small name below, otherwise only when the column is narrow"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Third-party software"; -"web_about_software_text" = "The code editor uses CodeMirror and Lezer (MIT License). With Swing support, VisuStruct loads CheerpJ by Leaning Technologies (Community License) and javac from OpenJDK."; -"web_about_licenses" = "License texts"; -"web_live_run" = "Run"; -"web_live_run_title" = "Run the program: output and input appear below"; -"web_live_run_finished" = "Program finished."; -"web_live_run_stopped" = "Stopped."; -"web_console" = "Console"; -"web_console_hide" = "Hide console"; -"web_console_resize" = "Resize console"; -"web_diagram_tools" = "Diagram tools"; -"web_files_title" = "Files"; -"web_files_show" = "Show files"; -"web_files_hide" = "Hide files"; -"web_files_resize" = "Resize files"; -"web_files_new_folder" = "New folder"; -"web_files_switch" = "Choose another folder"; -"web_files_delete" = "Delete"; -"web_files_in_browser" = "In this browser’s storage"; -"web_files_save_hint_fmt" = "Saving puts the program in %@."; -"web_files_empty" = "Nothing saved yet. When you save, VisuStruct creates a folder with today’s date here."; -"web_files_reconnect_hint" = "After reloading, the browser asks once more whether VisuStruct may use your folder."; -"web_files_reconnect_fmt" = "Open folder “%@”"; -"web_files_connect_hint" = "Choose a folder as your workspace, ideally a new folder “VisuStruct-Files” in your Documents. VisuStruct creates a folder for each day in it and saves both diagram and code."; -"web_files_connect" = "Choose folder"; -"web_files_browser_hint" = "This browser can’t open folders on the device (for example on iPad). Your files then stay in this browser’s storage."; -"web_files_browser" = "Save in the browser"; -"web_files_delete_confirm_fmt" = "Really delete “%@”?"; -"web_files_folder_prompt" = "Name of the new folder:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Saved: %@"; -"web_files_create" = "Create"; -"web_learn_ludwig_tip" = "Ludwig’s tip"; -"web_game_title" = "Game: True or false?"; -"web_game_intro" = "Ludwig shows you values and a condition. Is the condition true or false? Ten rounds, getting trickier each time."; -"web_game_start" = "Start game"; -"web_game_round_fmt" = "Round %@ of %@"; -"web_game_score_fmt" = "Points: %@"; -"web_game_true" = "true"; -"web_game_false" = "false"; -"web_game_right" = "Correct!"; -"web_game_wrong" = "Not quite. This is how it works out:"; -"web_game_next" = "Next"; -"web_game_finish" = "Result"; -"web_game_done_fmt" = "%@ of %@ correct."; -"web_game_perfect" = "All correct – Ludwig is seriously impressed!"; -"web_game_good" = "Great! Have another look at your mistakes and try again."; -"web_game_practice" = "Practice makes perfect. Read the truth table above once more and play another round."; -"web_game_again" = "Play again"; -"web_game_wrong_short" = "Sorry, that's wrong."; -"web_game_practice_short" = "Practice makes perfect. Read the explanations again and play another round."; -"web_game_clicks" = "Clicks:"; -"web_game_nobody" = "Nobody is listening – nothing happens."; -"web_game_event_fmt" = "Click on “%@”: the listener hears it and runs its code."; -"web_game_try" = "Now try the buttons in the window yourself."; -"web_game_time_fmt" = "%@ s left"; -"web_game_defused" = "✂️ Defused! You found the mistake."; -"web_game_boom_time" = "💥 Boom! Time is up."; -"web_game_boom_wrong" = "💥 Boom! That was the wrong line."; -"web_game_boom_part" = "💥 Boom! Right line, but the mistake is in another part of it."; -"web_game_boom_wrong_part" = "💥 Boom! The mistake is in another line."; -"web_game_bomb_parts_hint" = "Tap exactly the wrong part."; -"web_game_fix" = "The correct line:"; -"web_game_order_hint" = "Tap the steps in the right order."; -"web_debug_step" = "Step"; -"web_debug_step_title" = "Step: run one statement and pause again"; -"web_debug_continue" = "Continue to the next breakpoint"; -"web_debug_paused_fmt" = "Paused before line %d."; -"web_debug_gutter_title" = "Click a line number to set or remove a breakpoint"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Caesar wheel"; -"web_learn_caesar_hint" = "Turn the inner wheel or tap −1 and +1. The outer ring shows the plain text, the inner ring the secret text."; -"web_learn_caesar_key_fmt" = "Key %d"; -"web_learn_caesar_plain" = "Plain text"; -"web_learn_caesar_secret" = "Secret text"; -"web_learn_caesar_encrypt" = "Encrypt"; -"web_learn_caesar_decrypt" = "Decrypt"; -"web_learn_caesar_back" = "Turn wheel back one"; -"web_learn_caesar_forward" = "Turn wheel forward one"; -"web_learn_rescue_station_fmt" = "Station %@ of %@: %@"; -"web_learn_rescue_number" = "Your number"; -"web_learn_rescue_not_number" = "Enter a whole number."; -"web_learn_rescue_wrong" = "Not yet. Read the code again, character by character."; -"web_learn_rescue_letter_moved" = "The letter goes into the crossword."; -"web_learn_rescue_alphabet" = "Your number turns into a letter:"; -"web_learn_rescue_to_crossword" = "To the crossword"; -"web_learn_rescue_crossword" = "The crossword"; -"web_learn_rescue_across" = "→ Across"; -"web_learn_rescue_down" = "↓ Down"; -"web_learn_rescue_cell_fmt" = "Square row %@, column %@"; -"web_learn_rescue_keyword" = "Secret word:"; -"web_learn_rescue_cw_wrong" = "The squares marked red are not right yet."; -"web_learn_rescue_cw_done" = "Solved! The yellow squares spell the secret word."; -"web_learn_rescue_to_gate" = "To the gate"; -"web_learn_rescue_gate" = "The gate"; -"web_learn_rescue_word" = "Secret word"; -"web_learn_rescue_open" = "Open the gate"; -"web_learn_rescue_gate_case" = "Almost! equals tells capital and small letters apart. Write the word exactly as in the crossword."; -"web_learn_rescue_gate_wrong" = "The gate stays shut. Look at the yellow squares again."; -"web_learn_rescue_freed" = "🎉 The gate is open!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "What do you want to work with?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: structure charts and Java with the whole course. You can switch any time in the gear menu."; -"web_visubot_world_visubot_hint" = "VisuBot: program the mBot2 robot, with its own lessons and tasks. You can switch any time in the gear menu."; -"web_visubot_connect" = "Connect real mBot2"; -"web_visubot_upload_button" = "Upload"; -"web_visubot_blocks" = "Blocks"; -"web_visubot_blocks_title" = "Show the structure chart as blocks"; -"web_visubot_blocks_back" = "Structure chart"; -"web_visubot_blocks_back_title" = "Back to the structure chart"; -"web_visubot_blocks_start" = "When the program starts"; -"web_visubot_blocks_empty" = "A block goes here"; -"web_visubot_blocks_hint" = "The same program as blocks. Drag blocks in from “Elements”, move them around or drop them in the trash. Click a number or text in a white field to change it right in the block; everything else in the Object Inspector below. Drop sensors onto a condition, or right onto the field they should replace. Drag operators and variables onto a field or a condition in the same way."; -"web_visubot_blocks_trash" = "Trash"; -"web_visubot_blocks_count" = "count with"; -"web_visubot_blocks_count_from" = "from"; -"web_visubot_blocks_count_below" = "to below"; -"web_visubot_blocks_count_to" = "to"; -"web_visubot_blocks_count_above" = "to above"; -"web_visubot_blocks_count_step" = "by"; -"web_visubot_blocks_repeat" = "repeat"; -"web_visubot_blocks_if" = "if"; -"web_visubot_blocks_else" = "else"; -"web_visubot_blocks_while" = "while"; -"web_visubot_blocks_endless" = "forever"; -"web_visubot_blocks_do" = "do"; -"web_visubot_blocks_not" = "not"; -"web_visubot_blocks_and" = "and"; -"web_visubot_blocks_or" = "or"; -"web_visubot_blocks_break" = "leave the loop"; -"web_visubot_blocks_repeat_times" = "times"; -"web_visubot_blocks_random_from" = "random number from"; -"web_visubot_blocks_random_to" = "to"; -"web_visubot_operators" = "Operators"; -"web_visubot_variables" = "Variables"; -"web_visubot_control" = "Control"; -"web_visubot_el_repeat" = "repeat 10 times"; -"web_visubot_upload_title" = "Upload program to the mBot2"; -"web_visubot_upload_step1" = "Connect the mBot2 with the USB cable and switch it on. This only works in Chrome or Edge."; -"web_visubot_upload_step2" = "Click “Upload now” and choose “USB Serial”. The mBot2 saves your program and restarts."; -"web_visubot_upload_step3" = "Unplug the cable and put the mBot2 at the start. When you press button A, your program starts. It stays saved, even after switching off."; -"web_visubot_upload_start" = "Upload now"; -"web_visubot_upload_busy" = "Uploading … do not unplug the cable."; -"web_visubot_upload_done" = "Done! Unplug the cable, put the mBot2 at the start, press button A."; -"web_visubot_upload_failed" = "The upload did not work. Restart the mBot2 and try again."; -"web_visubot_upload_label" = "A = Start"; -"web_visubot_upload_error_input" = "Your program asks for an input. The mBot2 has no keyboard, so this does not work."; -"web_visubot_upload_error_files" = "Your program works with files. This does not work on the mBot2."; -"web_visubot_upload_error_empty" = "Your program is still empty."; -"web_visubot_disconnect" = "Disconnect"; -"web_visubot_connecting" = "Connecting … (the CyberPi restarts briefly)"; -"web_visubot_connected" = "Real mBot2 drives along"; -"web_visubot_no_serial" = "Real mBot2: only in Chrome or Edge on a computer."; -"web_visubot_link_error" = "Connection lost"; -"web_visubot_world" = "VisuBot world"; -"web_visubot_no_3d" = "The 3D view cannot start in this browser."; -"web_visubot_distance" = "Distance"; -"web_visubot_line" = "Line"; -"web_visubot_bumps" = "bumped into the wall"; -"web_visubot_el_forward" = "move forward"; -"web_visubot_el_backward" = "move back"; -"web_visubot_el_right" = "turn right"; -"web_visubot_el_left" = "turn left"; -"web_visubot_el_led" = "LEDs on"; -"web_visubot_el_tone" = "play a tone"; -"web_visubot_drive" = "Drive"; -"web_visubot_depth_fmt" = "The loops must be nested %d deep."; -"web_visubot_tap_part" = "Rotate the mBot2 with the mouse or your finger. Tap a part to see its name."; -"web_visubot_quiz_right" = "Correct!"; -"web_visubot_quiz_wrong_fmt" = "That is: %@. Try again."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Screen"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Buttons A, B and Home"; -"web_visubot_part_leds" = "RGB LEDs"; -"web_visubot_part_lightSensor" = "Light sensor"; -"web_visubot_part_microphone" = "Microphone"; -"web_visubot_part_shield" = "mBot2 shield with battery"; -"web_visubot_part_powerSwitch" = "Power switch"; -"web_visubot_part_motors" = "Encoder motors"; -"web_visubot_part_wheels" = "Wheels"; -"web_visubot_part_ultrasonic" = "Ultrasonic sensor"; -"web_visubot_part_lineSensor" = "Line sensor (quad RGB)"; -"web_visubot_part_caster" = "Ball caster"; -"web_visubot_part_chassis" = "Chassis"; -"web_visubot_world_fmt" = "World %d"; -"web_visubot_goal_reached" = "Goal reached"; -"web_visubot_goal_missed" = "Goal not reached"; -"web_visubot_commands" = "mBot2 commands"; -"web_visubot_sensors" = "mBot2 sensors"; -"web_visubot_sensor_distance" = "Distance"; -"web_visubot_sensor_line" = "Line"; -"web_visubot_el_led_off" = "LEDs off"; -"web_visubot_el_led_color" = "set LED colour"; -"web_visubot_el_wait" = "wait a moment"; -"web_visubot_el_emotion" = "show a feeling"; -"web_visubot_el_text" = "show text"; -"web_visubot_sensor_color" = "Colour is red?"; -"web_visubot_sensor_button_a" = "Button A pressed?"; -"web_visubot_sensor_button_b" = "Button B pressed?"; -"web_visubot_sensor_joy_up" = "Joystick up?"; -"web_visubot_sensor_joy_down" = "Joystick down?"; -"web_visubot_sensor_joy_left" = "Joystick left?"; -"web_visubot_sensor_joy_right" = "Joystick right?"; -"web_visubot_sensor_brightness" = "Brightness"; -"web_visubot_sensor_loudness" = "Loudness"; -"web_visubot_sensor_pitch" = "Tilt forward/back"; -"web_visubot_sensor_roll" = "Tilt sideways"; -"web_visubot_sensor_shake" = "Shaken?"; -"web_visubot_el_drive" = "wheels separately"; -"web_visubot_el_stop" = "stop"; -"web_visubot_el_timer" = "reset stopwatch"; -"web_visubot_sensor_line_left" = "Line left?"; -"web_visubot_sensor_line_right" = "Line right?"; -"web_visubot_sensor_timer" = "Stopwatch (s)"; -"web_visubot_sensor_battery" = "Battery (%)"; -"web_visubot_actions" = "Commands"; -"web_visubot_led_on" = "LEDs on"; -"web_visubot_led_off" = "LEDs off"; -"web_visubot_tone_yes" = "tone"; -"web_visubot_tone_no" = "no tone"; -"web_visubot_controls" = "Try the sensors"; -"web_visubot_controls_hint" = "Without a real mBot2: set here what the sensors measure. Buttons, joystick and shaking last for one second."; -"web_visubot_shake" = "shake"; -"web_visubot_check" = "Test the mBot2"; -"web_visubot_check_hint" = "Try each actuator once. The sensor values update live: hold your hand in front of the ultrasonic sensor, press the buttons, tilt or shake the mBot2. Lift it up for the wheels."; -"web_visubot_check_forward" = "Wheels 1 s forward"; -"web_visubot_check_spin" = "Turn on the spot for 1 s"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Where do you keep your work?"; -"web_learn_start_hint" = "Your learning progress and programs live in a folder on your device. The progress is stored there in the file learnProgress.json."; -"web_learn_start_continue_fmt" = "Continue with “%@”"; -"web_learn_start_open" = "Open existing folder"; -"web_learn_start_create_fmt" = "Create new folder “%@”"; -"web_learn_start_create_hint" = "Next, choose where it should go, e.g. in “Documents”."; -"web_learn_start_folder" = "VisuStruct-Files"; -"web_learn_start_without" = "Continue without a folder"; -"web_learn_start_without_hint" = "Your learning progress is then lost when you close the page."; -"web_visubot_preview_title" = "mBot2 live"; -"web_visubot_preview_hint" = "Shows right away where your program drives the mBot2."; -"web_visubot_preview_sim_title" = "Simulation"; -"web_visubot_preview_sim_hint" = "The mBot2 drives here while the simulation runs."; -"web_visubot_world_in_preview" = "The mBot2 drives in the “Simulation” window."; -"web_visubot_preview_play" = "Play the drive"; -"web_visubot_preview_stop" = "Stop"; -"web_visubot_preview_hide" = "Collapse mBot2 live"; -"web_visubot_preview_show" = "Show mBot2 live"; -"web_visubot_preview_resize" = "Resize mBot2 live"; -"web_visubot_preview_stack" = "Below the code in the Code area"; -"web_visubot_preview_side" = "As a column of its own"; -"web_visubot_preview_distance_fmt" = "Distance: %d cm"; -"web_visubot_preview_input" = "needs an input, start the simulation for that"; -"web_visubot_preview_limit" = "runs for a very long time (endless loop?), showing the start"; -"web_visubot_group_drive" = "Driving and turning"; -"web_visubot_group_wheels" = "Wheels separately"; -"web_visubot_group_leds" = "Light"; -"web_visubot_group_sound" = "Sound"; -"web_visubot_group_screen" = "Screen"; -"web_visubot_group_emotion" = "Emotions"; -"web_visubot_group_wait" = "Waiting and stopwatch"; -"web_visubot_group_distance" = "Distance"; -"web_visubot_group_line" = "Line"; -"web_visubot_group_color" = "Colours"; -"web_visubot_group_buttons" = "Buttons and joystick"; -"web_visubot_group_light" = "Light and loudness"; -"web_visubot_group_tilt" = "Tilt and shaking"; -"web_visubot_group_timer" = "Stopwatch and battery"; -"web_swap_to_code" = "Code large, structogram narrow"; -"web_swap_to_editor" = "Structogram large, code narrow"; -"web_editor_resize" = "Resize the structogram"; -"web_palette_resize" = "Resize the elements (double-click: reset)"; -"web_palette_hide" = "Hide elements"; -"web_palette_show" = "Show elements"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: write classes in Java and see or draw them as a class diagram (from year 12). You can switch any time in the gear menu."; -"web_visuobject_subtitle" = "Class diagram"; -"web_visuobject_code" = "Java code"; -"web_visuobject_diagram" = "Class diagram"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Add a new interface to the diagram and the code"; -"web_visuobject_layout" = "Arrange again"; -"web_visuobject_layout_tip" = "Arrange all classes automatically: superclasses at the top"; -"web_visuobject_add_field" = "new attribute …"; -"web_visuobject_add_method" = "new method …"; -"web_visuobject_delete_class" = "Delete class"; -"web_visuobject_new_class_name" = "NewClass"; -"web_visuobject_new_interface_name" = "NewInterface"; -"web_visuobject_example" = "Example"; -"web_visuobject_example_tip" = "Load the example project Zoo: Tier and Hund in package tiere, Besitzer in personen"; -"web_visuobject_new_tip" = "New: empty project (Undo brings the old one back)"; -"web_visuobject_empty" = "No class yet. Click “+ Class” on the left or type for example “public class Dog { }” into a file."; -"web_visuobject_edit_hint" = "Double-click to change. Write it as in UML: “- name: String” or “+ bark(): void”. Leave it empty to delete."; -"web_visuobject_member_label" = "Attribute or method in UML notation"; -"web_visuobject_name_label" = "Class name"; -"web_visuobject_bad_name" = "“%@” is not a valid name or already exists."; -"web_visuobject_bad_line" = "I don’t understand “%@”. Example: - name: String or + bark(): void"; -"web_visuobject_open_failed" = "The file could not be read."; -"web_visuobject_field_ph" = "- name: String"; -"web_visuobject_seq_diagram" = "Sequence diagram"; -"web_visuobject_seq_empty" = "The sequence diagram is built while debugging: click “Debug” above and step through the program."; -"web_visuobject_seq_no_calls" = "No calls of your own methods yet."; -"web_visuobject_seq_truncated" = "… shortened: too many calls from here on."; -"web_visuobject_seq_hint" = "Each arrow is a call of one of your methods, the dashed arrow brings the return value back. Click an arrow to see the line in the code."; -"web_visuobject_dbg" = "Debug"; -"web_visuobject_dbg_tip" = "Run the program step by step. Breakpoint: click the line number. The object diagram shows the objects in memory."; -"web_visuobject_dbg_continue" = "Resume"; -"web_visuobject_dbg_continue_tip" = "Run to the next breakpoint (F8)"; -"web_visuobject_dbg_pause" = "Pause"; -"web_visuobject_dbg_pause_tip" = "Pause the program"; -"web_visuobject_dbg_over" = "Step"; -"web_visuobject_dbg_over_tip" = "Next line; methods run completely (F6)"; -"web_visuobject_dbg_into" = "Into"; -"web_visuobject_dbg_into_tip" = "Step into the called method (F5)"; -"web_visuobject_dbg_out" = "Out"; -"web_visuobject_dbg_out_tip" = "Finish the method and return to the caller (F7)"; -"web_visuobject_dbg_input" = "Input for the Scanner, then Enter"; -"web_visuobject_dbg_running" = "Debugger: program running …"; -"web_visuobject_dbg_waiting" = "Debugger: the program is waiting for your input."; -"web_visuobject_dbg_paused_fmt" = "Debugger: paused in %1$@, line %2$@"; -"web_visuobject_dbg_exception" = "Program stopped with an exception."; -"web_visuobject_dbg_code_changed" = "Code changed: debugger stopped."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Call stack"; -"web_visuobject_dbg_vars" = "Variables"; -"web_visuobject_dbg_var_name" = "Name"; -"web_visuobject_dbg_var_type" = "Type"; -"web_visuobject_dbg_no_vars" = "No variables"; -"web_visuobject_dbg_err_syntax" = "%1$@, line %2$@: the debugger does not understand this (%3$@). ▶ Start shows Java's message."; -"web_visuobject_dbg_err_symbol" = "%1$@, line %2$@: %3$@ is unknown."; -"web_visuobject_dbg_err_import" = "%1$@, line %2$@: %3$@ is missing at the very top. Without this line Java doesn’t know the class."; -"web_visuobject_dbg_err_typename" = "%1$@, line %2$@: Java doesn’t know this data type. Did you mean %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, line %2$@: the debugger cannot do %3$@ yet. ▶ Start runs the program in real Java."; -"web_visuobject_dbg_err_type" = "%1$@, line %2$@: something does not fit here (%3$@)."; -"web_visuobject_obj_diagram" = "Object diagram"; -"web_visuobject_obj_new" = "New object of class"; -"web_visuobject_obj_add" = "Object"; -"web_visuobject_obj_empty" = "No objects yet. Choose a class above and click “+ Object”."; -"web_visuobject_obj_no_classes" = "First create a class (not abstract) in the class diagram."; -"web_visuobject_obj_hint" = "Click an object to change its name, class and values here. Drag the handle to another object to connect them through a reference attribute."; -"web_visuobject_obj_live_hint" = "Live from the debugger: this is how the objects look in memory right now."; -"web_visuobject_obj_link" = "Drag to another object: set a reference"; -"web_visuobject_obj_name" = "Name"; -"web_visuobject_obj_class" = "Class"; -"web_visuobject_obj_attribute" = "Attribute"; -"web_visuobject_obj_value" = "Value"; -"web_visuobject_obj_delete" = "Delete object"; -"web_visuobject_obj_bad_name" = "“%@” is not a valid object name."; -"web_visuobject_obj_name_taken" = "There is already an object “%@”."; -"web_visuobject_obj_no_ref" = "%1$@ has no attribute that can refer to %2$@."; -"web_visuobject_tool_note" = "Note"; -"web_visuobject_tool_note_tip" = "Note: click into the class diagram, then type the text. Drag the handle to a class for a dashed line."; -"web_visuobject_note_ph" = "Note …"; -"web_visuobject_note_text" = "Text"; -"web_visuobject_note_attached" = "Attached to"; -"web_visuobject_note_attach" = "Drag to a class: dashed line"; -"web_visuobject_note_delete" = "Delete note"; -"web_visuobject_run" = "Run"; -"web_visuobject_run_tip" = "Run the program with real Java: all classes are compiled, the class with main is started (preferably the open one)."; -"web_visuobject_stop" = "Stop"; -"web_visuobject_stop_tip" = "End the program and close its windows"; -"web_visuobject_stopped" = "Program stopped."; -"web_visuobject_no_main" = "No class with public static void main(String[] args) found."; -"web_visuobject_running_fmt" = "%@ is running …"; -"web_visuobject_console_clear" = "Clear"; -"web_visuobject_section_fields" = "Attributes"; -"web_visuobject_section_refs" = "Reference attributes"; -"web_visuobject_section_ctors" = "Constructor"; -"web_visuobject_section_methods" = "Methods"; -"web_visuobject_insp_sections" = "Insert section comments"; -"web_visuobject_insp_sort" = "Sort into sections"; -"web_visuobject_insp_sections_tip" = "Writes // Attributes, // Reference attributes, // Constructor and // Methods into the class and sorts everything below them. New members from the class diagram then go straight to the right place."; -"web_visuobject_insp_doc" = "Description (Javadoc)"; -"web_visuobject_insp_doc_ph" = "What is the class for? Written in the code as a Javadoc comment above the class."; -"web_visuobject_insp_visibility" = "Visibility"; -"web_visuobject_insp_type" = "Type"; -"web_visuobject_insp_init" = "Initial value"; -"web_visuobject_insp_no_fields" = "No attributes yet."; -"web_visuobject_insp_add_field" = "Attribute"; -"web_visuobject_insp_params" = "Parameters"; -"web_visuobject_insp_return" = "Return type"; -"web_visuobject_insp_constructor" = "Constructor"; -"web_visuobject_insp_no_methods" = "No methods yet."; -"web_visuobject_insp_add_method" = "Method"; -"web_visuobject_insp_generate" = "Generate:"; -"web_visuobject_insp_gen_constructor" = "Constructor from attributes"; -"web_visuobject_insp_gen_constructor_tip" = "Like Eclipse “Generate Constructor using Fields”: a constructor that sets all attributes (except static)."; -"web_visuobject_insp_gen_accessors" = "Getters and setters"; -"web_visuobject_insp_gen_accessors_tip" = "Like Eclipse “Generate Getters and Setters”: get…/set… for each attribute (final attributes get only a getter)."; -"web_visuobject_insp_bad_params" = "Write parameters like this: name: Type, second: int (read “%@”)."; -"web_visuobject_insp_fields" = "Attributes"; -"web_visuobject_insp_methods" = "Methods"; -"web_visuobject_inspector_resize" = "Resize: drag the border between class diagram and object inspector up or down (double-click = default)"; -"web_visuobject_dep_title" = "Dependency «%@»"; -"web_visuobject_dep_create_text" = "%1$@ creates an object of class %2$@ in %3$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ uses the class %2$@ in %3$@."; -"web_visuobject_dep_hint" = "This is not an association: %@ does not keep the %@ object in an attribute, it only lives inside the method. That is why the line is dashed."; -"web_visuobject_dep_to_assoc" = "Keep as attribute (association to %@)"; -"web_visuobject_end_mult_ph" = "mult."; -"web_visuobject_end_tip" = "Click (line selected) or right-click: role, multiplicity and navigability at this end"; -"web_visuobject_end_role_ph" = "e.g. myCats"; -"web_visuobject_new_menu" = "New"; -"web_visuobject_new_menu_tip" = "Create a new project, source folder, package, class or interface"; -"web_visuobject_new_project" = "Java project"; -"web_visuobject_new_folder" = "Source folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Class"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "New Java project"; -"web_visuobject_new_project_hint" = "In the workspace every project gets its own folder with src."; -"web_visuobject_new_folder_title" = "New source folder"; -"web_visuobject_new_folder_hint" = "Another folder for source code next to src, e.g. test for test classes."; -"web_visuobject_new_package_title" = "New package"; -"web_visuobject_new_package_hint" = "Package names are lower case, parts separated by dots: animals or school.office."; -"web_visuobject_new_class_title" = "New Java class"; -"web_visuobject_new_class_hint" = "Class names start with a capital letter, e.g. Dog or BankAccount."; -"web_visuobject_new_interface_title" = "New Java interface"; -"web_visuobject_new_interface_hint" = "An interface defines methods that classes implement later."; -"web_visuobject_new_root" = "Source folder"; -"web_visuobject_new_name" = "Name"; -"web_visuobject_new_modifiers" = "Modifiers"; -"web_visuobject_new_package_private" = "package (no modifier)"; -"web_visuobject_new_superclass" = "Superclass"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Extends interfaces (extends)"; -"web_visuobject_new_stubs" = "Which method stubs should be created?"; -"web_visuobject_new_stub_constructors" = "Constructors from superclass"; -"web_visuobject_new_stub_inherited" = "Inherited abstract methods"; -"web_visuobject_new_comment_legend" = "Comment"; -"web_visuobject_new_comment" = "Javadoc comment with @author"; -"web_visuobject_new_author" = "Your name"; -"web_visuobject_new_finish" = "Finish"; -"web_visuobject_new_name_missing" = "Please enter a name."; -"web_visuobject_new_exists" = "“%@” already exists in the project."; -"web_visuobject_new_upper" = "In Java, class names start with a capital letter."; -"web_visuobject_bad_folder" = "“%@” is not a valid folder name or already exists."; -"web_visuobject_inspector_hide" = "Collapse object inspector"; -"web_visuobject_inspector_show" = "Expand object inspector"; -"web_visuobject_inspector_empty" = "Click a relationship (line) in the diagram to edit it here."; -"web_visuobject_rel_end_a" = "End A: %@ (line starts here)"; -"web_visuobject_rel_end_b" = "End B: %@ (line ends here)"; -"web_visuobject_ws_title" = "Workspace folder on your computer"; -"web_visuobject_ws_question" = "Where do you keep your projects?"; -"web_visuobject_ws_hint" = "Like in Eclipse: a workspace folder on your computer with one folder per project, holding src and the .java files."; -"web_visuobject_ws_create" = "Create folder “%@”"; -"web_visuobject_ws_open" = "Open existing workspace"; -"web_visuobject_ws_skip" = "Without a folder (browser only)"; -"web_visuobject_ws_choose" = "Choose workspace"; -"web_visuobject_ws_reopen" = "Open workspace “%@”"; -"web_visuobject_ws_switch" = "Switch"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Download the project as .zip, e.g. to hand it in"; -"web_visuobject_ws_saved" = "Saved to %@/%@"; -"web_visuobject_ws_created" = "New project “%@” in the workspace"; -"web_visuobject_ws_failed" = "Saving to the workspace failed: %@"; -"web_visuobject_ws_taken" = "The workspace already has a project “%@”."; -"web_visuobject_ws_open_project" = "Open project %@"; -"web_visuobject_save_ws_tip" = "Save to the workspace (Ctrl+S)"; -"web_visuobject_unsaved" = "not saved"; -"web_visuobject_rel_nav_navigable" = "navigable (arrow)"; -"web_visuobject_rel_nav_non-navigable" = "non-navigable (cross ×)"; -"web_visuobject_rel_nav_unspecified" = "unspecified (open)"; -"web_visuobject_rel_reading_flip" = "reverse"; -"web_visuobject_rel_reading_auto" = "With a name, the relationship reads in the direction you dragged."; -"web_visuobject_tools" = "Tools"; -"web_visuobject_tool_select" = "Select"; -"web_visuobject_tool_select_tip" = "Select and move"; -"web_visuobject_tool_class" = "Class"; -"web_visuobject_tool_class_tip" = "Class: drag onto the canvas, or pick it and click on the canvas"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: drag onto the canvas, or pick it and click on the canvas"; -"web_visuobject_tool_link" = "Association"; -"web_visuobject_tool_link_tip" = "Association without navigation: draw a plain line between two classes"; -"web_visuobject_rel_link" = "Association (no navigation)"; -"web_visuobject_tool_not_link" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_association" = "Directed"; -"web_visuobject_tool_association_tip" = "Directed association: drag from the class that knows the other one to the other (arrow)"; -"web_visuobject_tool_aggregation" = "Aggregation"; -"web_visuobject_tool_aggregation_tip" = "Aggregation: drag from the whole to the part (has, parts live on)"; -"web_visuobject_tool_composition" = "Composition"; -"web_visuobject_tool_composition_tip" = "Composition: drag from the whole to the part (consists of, parts belong to it)"; -"web_visuobject_tool_extends" = "Inheritance"; -"web_visuobject_tool_extends_tip" = "Inheritance: drag from the subclass to the superclass (extends)"; -"web_visuobject_tool_implements" = "Realization"; -"web_visuobject_tool_implements_tip" = "Realization: drag from the class to the interface (implements)"; -"web_visuobject_tool_pick_second" = "Now click the second class (from %@). Esc cancels."; -"web_visuobject_tool_not_association" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_aggregation" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_composition" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_extends" = "%@ cannot inherit from %@: classes extend classes, interfaces extend interfaces. For an interface use realization."; -"web_visuobject_tool_not_implements" = "%@ cannot implement %@: only a class implements an interface."; -"web_visuobject_inspector" = "Object inspector"; -"web_visuobject_connect" = "Drag: relationship to another class"; -"web_visuobject_rel_association" = "Association"; -"web_visuobject_rel_directed" = "Directed association"; -"web_visuobject_rel_aggregation" = "Aggregation (has, parts live on)"; -"web_visuobject_rel_composition" = "Composition (consists of, parts belong to it)"; -"web_visuobject_rel_extends" = "Inheritance (extends)"; -"web_visuobject_rel_implements" = "Realization (implements)"; -"web_visuobject_rel_extends_text" = "%@ inherits from %@ (extends in the code)."; -"web_visuobject_rel_implements_text" = "%@ implements the interface %@ (implements in the code)."; -"web_visuobject_rel_kind" = "Kind"; -"web_visuobject_rel_name" = "Name of the relationship"; -"web_visuobject_rel_name_ph" = "e.g. owns"; -"web_visuobject_rel_reading" = "Reading direction"; -"web_visuobject_rel_navigable" = "Navigability"; -"web_visuobject_rel_role" = "Role"; -"web_visuobject_rel_multiplicity" = "Multiplicity"; -"web_visuobject_rel_role_field" = "= attribute %@.%@ in the code"; -"web_visuobject_rel_role_only_uml" = "diagram only (no attribute while the arrow points one way)"; -"web_visuobject_rel_delete" = "Delete relationship"; -"web_visuobject_rel_impossible" = "There is no suitable relationship from %@ to %@."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Drag to resize (double-click: default)"; -"web_visuobject_pane_show" = "Expand area"; -"web_visuobject_pane_hide" = "Collapse area"; -"web_visuobject_close_tab" = "Close %@"; -"web_visuobject_collapse" = "Collapse"; -"web_visuobject_expand" = "Expand"; -"web_visuobject_tree_empty" = "Still empty. Create a package or class with “+ New”."; -"web_visuobject_delete" = "Delete"; -"web_visuobject_default_package" = "(default package)"; -"web_visuobject_bad_package" = "“%@” is not a valid package name or already exists. Package names are lower case, e.g. animals."; -"web_visuobject_new_package_name" = "newpackage"; -"web_visuobject_no_file" = "No file open"; -"web_visuobject_project_name" = "MyProject"; -"web_visuobject_explorer_show" = "Show Package Explorer"; -"web_visuobject_explorer_hide" = "Collapse Package Explorer"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Save the project as .zip: ProjectName/src/package/Class.java"; -"web_visuobject_open_tip" = "Open a project (.zip as from Eclipse or BlueJ) or add .java files to the project"; -"web_visuobject_method_ph" = "+ bark(): void"; -"web_code_scopes" = "Colored blocks"; -"web_code_scopes_hint" = "Code and structogram: loop pink, branch blue, method yellow, class green"; -"web_pseudocode" = "Pseudocode"; - -/* VisuFlow (draw flowcharts) */ -"web_visuflow_subtitle" = "Draw flowcharts"; -"web_visuflow_world_hint" = "VisuFlow: draw a program flowchart freely and export it as an image or PDF. You can switch at any time in the gear menu."; -"web_visuflow_palette" = "Symbols"; -"web_visuflow_palette_hint" = "Tap a symbol to add it below the selected one, joined by an arrow. You can also drag it onto the canvas."; -"web_visuflow_shape_start" = "Start"; -"web_visuflow_shape_ende" = "End"; -"web_visuflow_shape_anweisung" = "Statement"; -"web_visuflow_shape_ein" = "Input/Output"; -"web_visuflow_shape_verzweigung" = "Decision"; -"web_visuflow_shape_unterprogramm" = "Subroutine"; -"web_visuflow_shape_start_tip" = "Oval: the flow starts here"; -"web_visuflow_shape_ende_tip" = "Oval: the flow ends here"; -"web_visuflow_shape_anweisung_tip" = "Rectangle: one statement, for example “Boil water”"; -"web_visuflow_shape_ein_tip" = "Parallelogram: input or output, for example “Input: number”"; -"web_visuflow_shape_verzweigung_tip" = "Diamond: a question with the exits yes and no"; -"web_visuflow_shape_unterprogramm_tip" = "Rectangle with two bars: calls a subroutine"; -"web_visuflow_text_start" = "Start"; -"web_visuflow_text_ende" = "End"; -"web_visuflow_text_anweisung" = "Statement"; -"web_visuflow_text_ein" = "Input: number"; -"web_visuflow_text_verzweigung" = "Condition?"; -"web_visuflow_text_unterprogramm" = "Subroutine"; -"web_visuflow_new_tip" = "New: empty flowchart with Start (Undo brings the old one back)"; -"web_visuflow_open_tip" = "Open a flowchart file (.visuflow)"; -"web_visuflow_save_tip" = "Save the flowchart as a file (.visuflow)"; -"web_visuflow_delete" = "Delete"; -"web_visuflow_delete_tip" = "Delete the selected symbol or arrow (Del)"; -"web_visuflow_swap" = "swap yes/no"; -"web_visuflow_swap_tip" = "Diamond: “yes” and “no” swap sides"; -"web_visuflow_example" = "Example"; -"web_visuflow_example_tip" = "Load the example “Make tea” from lesson 1 (Undo brings the old flowchart back)"; -"web_visuflow_example_title" = "Make tea"; -"web_visuflow_example_water" = "Boil water"; -"web_visuflow_example_bag" = "Tea bag into the cup"; -"web_visuflow_example_hot" = "Tea still too hot?"; -"web_visuflow_example_wait" = "Wait"; -"web_visuflow_example_drink" = "Drink tea"; -"web_visuflow_title_label" = "Flowchart title"; -"web_visuflow_title_ph" = "Flowchart title"; -"web_visuflow_canvas_label" = "Flowchart canvas"; -"web_visuflow_open_error" = "This file is not a VisuFlow flowchart."; -"web_visuflow_saved" = "Saved as %@"; -"web_visuflow_status_empty" = "Drag a symbol from the bar onto the canvas or tap it."; -"web_visuflow_status_idle" = "Tap a symbol to select it. Drag from the dot at its exit to draw an arrow to the next symbol."; -"web_visuflow_status_node" = "Drag to move the symbol, tap again to change the text. Drag an arrow from the dot at the exit."; -"web_visuflow_status_edge" = "Arrow selected. Delete removes it."; -"web_visuflow_status_connect" = "Let go over the symbol the arrow leads to."; -"web_visuflow_edit_label" = "Text in the symbol"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Rename variable …"; -"web_rename_title" = "Rename variable"; -"web_rename_old" = "Name"; -"web_rename_new" = "New name"; -"web_rename_hint" = "Changes every place with exactly this spelling (number is not Number), in the code and in the structogram. Text in \"…\" and comments stay."; -"web_rename_count_fmt" = "Used %d times."; -"web_rename_exists_fmt" = "“%@” already exists: afterwards both would be one variable."; -"web_rename_invalid" = "A name starts with a letter and contains only letters, digits and _."; -"web_rename_keyword_fmt" = "“%@” is a Java keyword."; -"web_rename_apply" = "Rename"; -"web_rename_cancel" = "Cancel"; -"web_visubot_world_visucode_hint" = "Other programs like %1$@ or %2$@ are on visucode.de."; diff --git a/web/src/i18n/es.strings b/web/src/i18n/es.strings deleted file mode 100644 index 354bbf43..00000000 --- a/web/src/i18n/es.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Textos que solo existen en la versión web. Todo lo demás procede de los Localizable.strings de la app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagrama de VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Supr"; -"web_key_shift" = "Mayús"; -"web_export" = "Exportar…"; -"web_export_title" = "Guardar como imagen o PDF, o imprimir"; -"web_export_png" = "Imagen (PNG)"; -"web_export_svg" = "Gráfico vectorial (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Archivo VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Error al exportar: %@"; -"web_print_hint" = "Usa “Exportar… → PDF” para guardar el diagrama e imprimirlo desde allí."; -"web_delete" = "Eliminar"; -"web_language_title" = "Idioma de la interfaz"; -"web_simulation_start" = "Iniciar simulación"; -"web_simulation_end" = "Terminar simulación"; -"web_simulation_start_title" = "Ejecutar el diagrama paso a paso"; -"web_simulation_end_title" = "Terminar la simulación y seguir editando"; -"web_palette_hint" = "Arrastrar al diagrama"; -"web_tabs_label" = "Diagramas"; -"web_status_modified" = "modificado"; -"web_inspector_title" = "Propiedades"; -"web_inspector_resize" = "Cambiar la altura del inspector de objetos: arrastra o desliza la línea hacia arriba o abajo (doble clic: estándar)"; -"web_inspector_help_drop" = "Arrastra elementos de la paleta sobre una pieza: arriba = antes, abajo = después, sobre “ø” = reemplazar. Los elementos existentes se pueden mover con el ratón."; -"web_inspector_help_inline" = "Haz doble clic o doble toque en un elemento para editar su texto directamente en el diagrama (Intro aplica, Esc cancela). También los nombres de los casos."; -"web_inspector_help_files" = "También puedes soltar archivos en la ventana."; -"web_case_name" = "Nombre del caso"; -"web_case_name_placeholder" = "p. ej. 1, ok, default"; -"web_copied" = "Elemento copiado."; -"web_discard_message_fmt" = "Se perderán los cambios en “%@”."; -"web_err_unreadable_fmt" = "“%@” no es un archivo de VisuStruct legible (%@)."; -"web_saved_fmt" = "“%@” guardado."; -"web_saved_txt_fmt" = "Guardado como “%@”. Quita la extensión .txt para usarlo."; -"web_drop_impossible" = "No se puede soltar aquí"; -"web_sim_delay" = "Pausa por paso"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Lenguaje"; -"web_codegen_comments" = "Texto del diagrama como comentarios"; -"web_codegen_empty_else" = "Generar rama else vacía en el código"; -"web_copied_check" = "Copiado ✓"; -"web_copy_manual" = "Seleccionado, pulsa Ctrl+C para copiar"; -"web_run_stopped_loop" = "Ejecución detenida: posible bucle infinito."; -"web_run_cancelled" = "Ejecución cancelada."; -"web_run_error" = "Error durante la ejecución."; -"web_run_dropped_fmt" = "… %d líneas anteriores ocultas"; -"web_sim_call_arguments_fmt" = "La llamada no coincide con la cabecera de %@. Revisa los valores entre paréntesis."; -"web_sim_missing_return_fmt" = "%@ terminó sin devolver un valor con return."; -"web_sim_file_not_found_fmt" = "No existe ningún archivo llamado %@."; -"web_sim_end_of_file_fmt" = "El archivo %@ no tiene más líneas."; -"web_sim_null_value_fmt" = "%@ es null."; -"web_sim_unknown_variable_case_fmt" = "Variable desconocida: %1$@. Java distingue entre mayúsculas y minúsculas: ¿querías decir %2$@?"; -"web_sim_written_file_fmt" = "%@ (guardado)"; -"web_site_home" = "Página de inicio"; -"web_site_imprint" = "Aviso legal"; -"web_site_privacy" = "Privacidad"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programación"; -"web_live_hide" = "Ocultar programación"; -"web_scale_canvas" = "Tamaño del texto: diagrama"; -"web_scale_code" = "Tamaño del texto: programación"; -"web_live_indent" = "Sangrar"; -"web_live_indent_title" = "Sangrar el código: cuatro espacios por nivel (líneas seleccionadas, si no, todo)"; -"web_live_show" = "Mostrar programación"; -"web_live_resize" = "Cambiar el ancho del área de código (doble clic: restablecer)"; -"web_live_hint" = "El código crece con tu diagrama. Gris = marcador: escribe en el inspector y tu texto aparecerá ahí. Haz clic en una línea para seleccionar su elemento."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Tu código"; -"web_live_ph_end" = "fin"; -"web_live_language" = "Lenguaje de programación"; -"web_live_java_class" = "Como clase"; -"web_live_java_class_hint" = "Nombre de la clase = título del diagrama"; -"web_live_java_main" = "Con método main"; -"web_settings_display" = "Visualización"; -"web_live_swing" = "Java real (con Swing)"; -"web_live_swing_hint" = "Java real con ventanas (CheerpJ). Descarga unos 40 MB una sola vez, en la primera ejecución."; -"web_live_swing_windows" = "Ventanas de Java"; -"web_live_swing_hide" = "Cerrar ventanas de Java"; -"web_live_swing_loading" = "Cargando Java (unos 40 MB la primera vez) …"; -"web_live_swing_compiling" = "Compilando …"; -"web_live_swing_running" = "El programa se está ejecutando."; -"web_live_swing_compile_failed" = "Error de compilación, mira arriba."; -"web_live_swing_failed" = "No se pudo cargar Java. Comprueba la conexión a internet."; -"web_live_hint_edit" = "Escribe aquí código Java y el diagrama se construye solo. O trabaja en el diagrama y el código crece con él. Gris = marcador, escribe encima."; -"web_live_edit_label" = "Código Java"; -"web_parse_line_fmt" = "Línea %d: %@"; -"web_parse_missing" = "Aquí falta: %@"; -"web_parse_extra" = "Sobra: %@"; -"web_parse_unclosed_string" = "Falta el %@ de cierre."; -"web_parse_else_without_if" = "Este «else» no tiene un «if»."; -"web_parse_case_outside_switch" = "«case» y «default» van dentro de un «switch»."; -"web_parse_missing_do_while" = "Después de «do { … }» falta «while (condición);»."; -"web_parse_more_methods" = "Por ahora solo cuenta un método. Crea otros subprogramas en pestañas propias."; -"web_parse_missing_import" = "Falta %@ al principio. Sin esta línea, Java no conoce Scanner."; -"web_parse_missing_scanner" = "Falta antes %@ Sin esta línea, el Scanner no existe."; -"web_parse_unknown_type" = "Java no conoce este tipo de datos. ¿Querías decir %@?"; -"web_quickfix_insert_fmt" = "Sugerencia: insertar %@"; -"web_quickfix_replace_fmt" = "Sugerencia: %1$@ en lugar de %2$@"; -"web_parse_wrong_case" = "Java distingue entre mayúsculas y minúsculas. Lo correcto es %@."; -"web_editor_title" = "Diagrama"; -"web_editor_show" = "Mostrar diagrama"; -"web_editor_hide" = "Ocultar diagrama"; -"web_keywords_title" = "Palabras clave de código"; -"web_keywords_hint" = "if, while, for en lugar de los nombres de los elementos"; -"web_palette_compact" = "Elementos siempre compactos"; -"web_palette_compact_hint" = "Símbolo con el nombre pequeño debajo; si no, solo con la columna estrecha"; -"web_about_version_fmt" = "Versión %@"; -"web_about_software" = "Software utilizado"; -"web_about_software_text" = "El editor de código usa CodeMirror y Lezer (licencia MIT). Con la compatibilidad con Swing, VisuStruct carga CheerpJ de Leaning Technologies (licencia Community) y javac de OpenJDK."; -"web_about_licenses" = "Textos de las licencias"; -"web_live_run" = "Ejecutar"; -"web_live_run_title" = "Ejecutar el programa: la salida y la entrada aparecen abajo"; -"web_live_run_finished" = "Programa terminado."; -"web_live_run_stopped" = "Detenido."; -"web_console" = "Consola"; -"web_console_hide" = "Ocultar consola"; -"web_console_resize" = "Cambiar la altura de la consola"; -"web_diagram_tools" = "Herramientas del diagrama"; -"web_files_title" = "Archivos"; -"web_files_show" = "Mostrar archivos"; -"web_files_hide" = "Ocultar archivos"; -"web_files_resize" = "Cambiar el ancho de archivos"; -"web_files_new_folder" = "Nueva carpeta"; -"web_files_switch" = "Elegir otra carpeta"; -"web_files_delete" = "Eliminar"; -"web_files_in_browser" = "En el almacenamiento de este navegador"; -"web_files_save_hint_fmt" = "Al guardar, el programa se coloca en %@."; -"web_files_empty" = "Aún no hay nada guardado. Al guardar, VisuStruct crea aquí una carpeta con la fecha de hoy."; -"web_files_reconnect_hint" = "Tras recargar, el navegador vuelve a preguntar si VisuStruct puede usar tu carpeta."; -"web_files_reconnect_fmt" = "Abrir la carpeta «%@»"; -"web_files_connect_hint" = "Elige una carpeta como espacio de trabajo. VisuStruct crea en ella una carpeta para cada día y guarda el diagrama y el código."; -"web_files_connect" = "Elegir carpeta"; -"web_files_browser_hint" = "Este navegador no puede abrir carpetas del dispositivo (por ejemplo en el iPad). Tus archivos quedan en el almacenamiento de este navegador."; -"web_files_browser" = "Guardar en el navegador"; -"web_files_delete_confirm_fmt" = "¿Eliminar «%@»?"; -"web_files_folder_prompt" = "Nombre de la nueva carpeta:"; -"web_files_default_name" = "Programa"; -"web_files_saved_fmt" = "Guardado: %@"; -"web_files_create" = "Crear"; -"web_learn_ludwig_tip" = "El consejo de Ludwig"; -"web_game_title" = "Juego: ¿Verdadero o falso?"; -"web_game_intro" = "Ludwig te muestra valores y una condición. ¿Es verdadera (true) o falsa (false)? Diez rondas, cada vez más difíciles."; -"web_game_start" = "Empezar el juego"; -"web_game_round_fmt" = "Ronda %@ de %@"; -"web_game_score_fmt" = "Puntos: %@"; -"web_game_true" = "verdadero (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "¡Correcto!"; -"web_game_wrong" = "No del todo. Así se calcula:"; -"web_game_next" = "Siguiente"; -"web_game_finish" = "Resultado"; -"web_game_done_fmt" = "%@ de %@ correctas."; -"web_game_perfect" = "¡Todo correcto! Ludwig está impresionado."; -"web_game_good" = "¡Muy bien! Revisa tus errores e inténtalo de nuevo."; -"web_game_practice" = "La práctica hace al maestro. Vuelve a leer la tabla de verdad y juega otra ronda."; -"web_game_again" = "Jugar otra vez"; -"web_game_wrong_short" = "Lo siento, es incorrecto."; -"web_game_practice_short" = "La práctica hace al maestro. Vuelve a leer las explicaciones y juega otra ronda."; -"web_game_clicks" = "Clics:"; -"web_game_nobody" = "Nadie escucha: no pasa nada."; -"web_game_event_fmt" = "Clic en «%@»: el oyente lo oye y ejecuta su código."; -"web_game_try" = "Ahora prueba tú los botones de la ventana."; -"web_game_time_fmt" = "Quedan %@ s"; -"web_game_defused" = "✂️ ¡Desactivada! Has encontrado el error."; -"web_game_boom_time" = "💥 ¡Bum! Se acabó el tiempo."; -"web_game_boom_wrong" = "💥 ¡Bum! Esa no era la línea."; -"web_game_boom_part" = "💥 ¡Bum! La línea es correcta, pero el error está en otra parte."; -"web_game_boom_wrong_part" = "💥 ¡Bum! El error está en otra línea."; -"web_game_bomb_parts_hint" = "Toca exactamente la parte incorrecta."; -"web_game_fix" = "La línea correcta:"; -"web_game_order_hint" = "Toca los pasos en el orden correcto."; -"web_debug_step" = "Paso a paso"; -"web_debug_step_title" = "Paso a paso: ejecutar una instrucción y detenerse de nuevo"; -"web_debug_continue" = "Continuar hasta el siguiente punto de interrupción"; -"web_debug_paused_fmt" = "Detenido antes de la línea %d."; -"web_debug_gutter_title" = "Haz clic en un número de línea para poner o quitar un punto de interrupción"; -"web_swap_to_code" = "Programación grande"; -"web_swap_to_editor" = "Diagrama grande"; -"web_editor_resize" = "Cambiar el ancho del diagrama"; -"web_palette_resize" = "Cambiar el ancho de los elementos"; -"web_palette_hide" = "Ocultar elementos"; -"web_palette_show" = "Mostrar elementos"; -"web_code_scopes" = "Bloques de código en color"; -"web_code_scopes_hint" = "Clase, método, bucle, condición en sus propias cajas"; -"web_pseudocode" = "Pseudocódigo"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Renombrar variable …"; -"web_rename_title" = "Renombrar variable"; -"web_rename_old" = "Nombre"; -"web_rename_new" = "Nombre nuevo"; -"web_rename_hint" = "Cambia cada lugar con exactamente esta escritura (numero no es Numero), en el código y en el estructograma. El texto entre \"…\" y los comentarios no cambian."; -"web_rename_count_fmt" = "Aparece %d veces."; -"web_rename_exists_fmt" = "«%@» ya existe: después ambas serían una sola variable."; -"web_rename_invalid" = "Un nombre empieza con una letra y solo contiene letras, cifras y _."; -"web_rename_keyword_fmt" = "«%@» es una palabra clave de Java."; -"web_rename_apply" = "Renombrar"; -"web_rename_cancel" = "Cancelar"; diff --git a/web/src/i18n/fr.strings b/web/src/i18n/fr.strings deleted file mode 100644 index b0c86e4a..00000000 --- a/web/src/i18n/fr.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Textes propres à la version web. Tout le reste provient des Localizable.strings de l’app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Organigramme VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Suppr"; -"web_key_shift" = "Maj"; -"web_export" = "Exporter…"; -"web_export_title" = "Enregistrer comme image ou PDF, ou imprimer"; -"web_export_png" = "Image (PNG)"; -"web_export_svg" = "Graphique vectoriel (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Fichier VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Échec de l’exportation : %@"; -"web_print_hint" = "Utilisez « Exporter… → PDF » pour enregistrer le diagramme, puis imprimez-le."; -"web_delete" = "Supprimer"; -"web_language_title" = "Langue de l’interface"; -"web_simulation_start" = "Lancer la simulation"; -"web_simulation_end" = "Terminer la simulation"; -"web_simulation_start_title" = "Exécuter l’organigramme étape par étape"; -"web_simulation_end_title" = "Terminer la simulation et reprendre l’édition"; -"web_palette_hint" = "Glisser dans l’organigramme"; -"web_tabs_label" = "Diagrammes"; -"web_status_modified" = "modifié"; -"web_inspector_title" = "Propriétés"; -"web_inspector_resize" = "Modifier la hauteur de l’inspecteur d’objets : faire glisser la ligne vers le haut ou le bas (double-clic : par défaut)"; -"web_inspector_help_drop" = "Glissez des éléments de la palette sur une tuile : en haut = avant, en bas = après, sur « ø » = remplacer. Les éléments existants se déplacent à la souris."; -"web_inspector_help_inline" = "Double-cliquez ou touchez deux fois un élément pour modifier son texte directement dans le diagramme (Entrée valide, Échap annule). Idem pour les noms de cas."; -"web_inspector_help_files" = "Vous pouvez aussi déposer des fichiers dans la fenêtre."; -"web_case_name" = "Nom du cas"; -"web_case_name_placeholder" = "p. ex. 1, ok, default"; -"web_copied" = "Élément copié."; -"web_discard_message_fmt" = "Les modifications de « %@ » seront perdues."; -"web_err_unreadable_fmt" = "« %@ » n’est pas un fichier VisuStruct lisible (%@)."; -"web_saved_fmt" = "« %@ » enregistré."; -"web_saved_txt_fmt" = "Enregistré sous « %@ ». Supprimez l’extension .txt pour l’utiliser."; -"web_drop_impossible" = "Impossible de déposer ici"; -"web_sim_delay" = "Pause par étape"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Langage"; -"web_codegen_comments" = "Texte du diagramme en commentaires"; -"web_codegen_empty_else" = "Générer une branche else vide dans le code"; -"web_copied_check" = "Copié ✓"; -"web_copy_manual" = "Sélectionné, appuyez sur Ctrl+C pour copier"; -"web_run_stopped_loop" = "Exécution arrêtée : boucle infinie possible."; -"web_run_cancelled" = "Exécution annulée."; -"web_run_error" = "Erreur lors de l’exécution."; -"web_run_dropped_fmt" = "… %d lignes précédentes masquées"; -"web_sim_call_arguments_fmt" = "L’appel ne correspond pas à l’en-tête de %@. Vérifie les valeurs entre parenthèses."; -"web_sim_missing_return_fmt" = "%@ s’est terminé sans renvoyer de valeur avec return."; -"web_sim_file_not_found_fmt" = "Il n’existe aucun fichier nommé %@."; -"web_sim_end_of_file_fmt" = "Le fichier %@ n’a plus de ligne."; -"web_sim_null_value_fmt" = "%@ vaut null."; -"web_sim_unknown_variable_case_fmt" = "Variable inconnue : %1$@. Java distingue majuscules et minuscules : vouliez-vous dire %2$@ ?"; -"web_sim_written_file_fmt" = "%@ (enregistré)"; -"web_site_home" = "Accueil"; -"web_site_imprint" = "Mentions légales"; -"web_site_privacy" = "Confidentialité"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmation"; -"web_live_hide" = "Masquer la programmation"; -"web_scale_canvas" = "Taille du texte : structogramme"; -"web_scale_code" = "Taille du texte : programmation"; -"web_live_indent" = "Indenter"; -"web_live_indent_title" = "Indenter le code : quatre espaces par niveau (lignes sélectionnées, sinon tout)"; -"web_live_show" = "Afficher la programmation"; -"web_live_resize" = "Modifier la largeur de la zone de code (double-clic : réinitialiser)"; -"web_live_hint" = "Le code évolue avec ton diagramme. Gris = espace réservé : écris dans l’inspecteur et ton texte apparaît ici. Clique sur une ligne pour sélectionner son élément."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Ton code"; -"web_live_ph_end" = "fin"; -"web_live_language" = "Langage de programmation"; -"web_live_java_class" = "Comme classe"; -"web_live_java_class_hint" = "Nom de la classe = titre du diagramme"; -"web_live_java_main" = "Avec méthode main"; -"web_settings_display" = "Affichage"; -"web_live_swing" = "Vrai Java (avec Swing)"; -"web_live_swing_hint" = "Du vrai Java avec fenêtres (CheerpJ). Télécharge environ 40 Mo une seule fois, au premier lancement."; -"web_live_swing_windows" = "Fenêtres Java"; -"web_live_swing_hide" = "Fermer les fenêtres Java"; -"web_live_swing_loading" = "Chargement de Java (environ 40 Mo la première fois) …"; -"web_live_swing_compiling" = "Compilation …"; -"web_live_swing_running" = "Le programme s’exécute."; -"web_live_swing_compile_failed" = "Erreur de compilation, voir ci-dessus."; -"web_live_swing_failed" = "Impossible de charger Java. Vérifie la connexion Internet."; -"web_live_hint_edit" = "Tape ici du code Java et le diagramme se construit tout seul. Ou travaille dans le diagramme et le code suit. Gris = espace réservé, il suffit d’écrire par-dessus."; -"web_live_edit_label" = "Code Java"; -"web_parse_line_fmt" = "Ligne %d : %@"; -"web_parse_missing" = "Il manque encore ici : %@"; -"web_parse_extra" = "En trop : %@"; -"web_parse_unclosed_string" = "Le %@ de fermeture manque ici."; -"web_parse_else_without_if" = "Ce « else » n’a pas de « if »."; -"web_parse_case_outside_switch" = "« case » et « default » vont dans un « switch »."; -"web_parse_missing_do_while" = "Après « do { … } », il manque « while (condition); »."; -"web_parse_more_methods" = "Pour l’instant, une seule méthode compte ici. Crée les autres sous-programmes dans des onglets séparés."; -"web_parse_missing_import" = "Il manque %@ tout en haut. Sans cette ligne, Java ne connaît pas Scanner."; -"web_parse_missing_scanner" = "Il manque avant %@ Sans cette ligne, le Scanner n’existe pas."; -"web_parse_unknown_type" = "Java ne connaît pas ce type de données. Vouliez-vous dire %@ ?"; -"web_quickfix_insert_fmt" = "Suggestion : insérer %@"; -"web_quickfix_replace_fmt" = "Suggestion : %1$@ au lieu de %2$@"; -"web_parse_wrong_case" = "Java distingue majuscules et minuscules. La bonne écriture est %@."; -"web_editor_title" = "Diagramme"; -"web_editor_show" = "Afficher le diagramme"; -"web_editor_hide" = "Masquer le diagramme"; -"web_keywords_title" = "Mots-clés du code"; -"web_keywords_hint" = "if, while, for au lieu des noms des éléments"; -"web_palette_compact" = "Éléments toujours compacts"; -"web_palette_compact_hint" = "Symbole avec le nom en petit dessous, sinon seulement si la colonne est étroite"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Logiciels utilisés"; -"web_about_software_text" = "L’éditeur de code utilise CodeMirror et Lezer (licence MIT). Avec la prise en charge de Swing, VisuStruct charge CheerpJ de Leaning Technologies (licence Community) et javac d’OpenJDK."; -"web_about_licenses" = "Textes des licences"; -"web_live_run" = "Exécuter"; -"web_live_run_title" = "Exécuter le programme : les sorties et les entrées apparaissent en dessous"; -"web_live_run_finished" = "Programme terminé."; -"web_live_run_stopped" = "Arrêté."; -"web_console" = "Console"; -"web_console_hide" = "Masquer la console"; -"web_console_resize" = "Redimensionner la console"; -"web_diagram_tools" = "Outils du diagramme"; -"web_files_title" = "Fichiers"; -"web_files_show" = "Afficher les fichiers"; -"web_files_hide" = "Masquer les fichiers"; -"web_files_resize" = "Redimensionner les fichiers"; -"web_files_new_folder" = "Nouveau dossier"; -"web_files_switch" = "Choisir un autre dossier"; -"web_files_delete" = "Supprimer"; -"web_files_in_browser" = "Dans le stockage de ce navigateur"; -"web_files_save_hint_fmt" = "L’enregistrement place le programme dans %@."; -"web_files_empty" = "Rien d’enregistré pour l’instant. À l’enregistrement, VisuStruct crée ici un dossier à la date du jour."; -"web_files_reconnect_hint" = "Après un rechargement, le navigateur redemande si VisuStruct peut utiliser ton dossier."; -"web_files_reconnect_fmt" = "Ouvrir le dossier « %@ »"; -"web_files_connect_hint" = "Choisis un dossier comme espace de travail. VisuStruct y crée un dossier pour chaque jour et enregistre le diagramme et le code."; -"web_files_connect" = "Choisir un dossier"; -"web_files_browser_hint" = "Ce navigateur ne peut pas ouvrir de dossiers de l’appareil (par exemple sur iPad). Tes fichiers restent alors dans le stockage de ce navigateur."; -"web_files_browser" = "Enregistrer dans le navigateur"; -"web_files_delete_confirm_fmt" = "Supprimer vraiment « %@ » ?"; -"web_files_folder_prompt" = "Nom du nouveau dossier :"; -"web_files_default_name" = "Programme"; -"web_files_saved_fmt" = "Enregistré : %@"; -"web_files_create" = "Créer"; -"web_learn_ludwig_tip" = "Le conseil de Ludwig"; -"web_game_title" = "Jeu : Vrai ou faux ?"; -"web_game_intro" = "Ludwig te montre des valeurs et une condition. Est-elle vraie (true) ou fausse (false) ? Dix manches, de plus en plus difficiles."; -"web_game_start" = "Commencer le jeu"; -"web_game_round_fmt" = "Manche %@ sur %@"; -"web_game_score_fmt" = "Points : %@"; -"web_game_true" = "vrai (true)"; -"web_game_false" = "faux (false)"; -"web_game_right" = "Correct !"; -"web_game_wrong" = "Pas tout à fait. Voici le calcul :"; -"web_game_next" = "Suivant"; -"web_game_finish" = "Résultat"; -"web_game_done_fmt" = "%@ sur %@ correctes."; -"web_game_perfect" = "Tout juste – Ludwig est très impressionné !"; -"web_game_good" = "Bravo ! Regarde encore tes erreurs et réessaie."; -"web_game_practice" = "C’est en forgeant qu’on devient forgeron. Relis la table de vérité et rejoue une partie."; -"web_game_again" = "Rejouer"; -"web_game_wrong_short" = "Dommage, c'est faux."; -"web_game_practice_short" = "C'est en forgeant qu'on devient forgeron. Relis les explications et rejoue une partie."; -"web_game_clicks" = "Clics :"; -"web_game_nobody" = "Personne n'écoute – rien ne se passe."; -"web_game_event_fmt" = "Clic sur « %@ » : l'écouteur l'entend et exécute son code."; -"web_game_try" = "Essaie maintenant toi-même les boutons de la fenêtre."; -"web_game_time_fmt" = "Encore %@ s"; -"web_game_defused" = "✂️ Désamorcée ! Tu as trouvé l’erreur."; -"web_game_boom_time" = "💥 Boum ! Le temps est écoulé."; -"web_game_boom_wrong" = "💥 Boum ! Ce n’était pas la bonne ligne."; -"web_game_boom_part" = "💥 Boum ! Bonne ligne, mais l’erreur est dans une autre partie."; -"web_game_boom_wrong_part" = "💥 Boum ! L’erreur est dans une autre ligne."; -"web_game_bomb_parts_hint" = "Touche exactement la partie fausse."; -"web_game_fix" = "La ligne correcte :"; -"web_game_order_hint" = "Touche les étapes dans le bon ordre."; -"web_debug_step" = "Pas à pas"; -"web_debug_step_title" = "Pas à pas : exécuter une instruction et s’arrêter à nouveau"; -"web_debug_continue" = "Continuer jusqu’au prochain point d’arrêt"; -"web_debug_paused_fmt" = "Arrêté avant la ligne %d."; -"web_debug_gutter_title" = "Clique sur un numéro de ligne pour poser ou retirer un point d’arrêt"; -"web_swap_to_code" = "Programmation en grand"; -"web_swap_to_editor" = "Structogramme en grand"; -"web_editor_resize" = "Modifier la largeur du structogramme"; -"web_palette_resize" = "Modifier la largeur des éléments"; -"web_palette_hide" = "Masquer les éléments"; -"web_palette_show" = "Afficher les éléments"; -"web_code_scopes" = "Blocs de code en couleur"; -"web_code_scopes_hint" = "Classe, méthode, boucle, condition dans leurs propres cadres"; -"web_pseudocode" = "Pseudo-code"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Renommer la variable …"; -"web_rename_title" = "Renommer la variable"; -"web_rename_old" = "Nom"; -"web_rename_new" = "Nouveau nom"; -"web_rename_hint" = "Modifie chaque endroit avec exactement cette écriture (nombre n’est pas Nombre), dans le code et dans le structogramme. Le texte entre \"…\" et les commentaires restent."; -"web_rename_count_fmt" = "Apparaît %d fois."; -"web_rename_exists_fmt" = "« %@ » existe déjà : ensuite les deux seraient une seule variable."; -"web_rename_invalid" = "Un nom commence par une lettre et ne contient que des lettres, des chiffres et _."; -"web_rename_keyword_fmt" = "« %@ » est un mot-clé Java."; -"web_rename_apply" = "Renommer"; -"web_rename_cancel" = "Annuler"; diff --git a/web/src/i18n/he.strings b/web/src/i18n/he.strings deleted file mode 100644 index 00295d53..00000000 --- a/web/src/i18n/he.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* טקסטים שקיימים רק בגרסת הרשת. כל השאר מגיעים מקובץ Localizable.strings של האפליקציה. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "תרשים VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "ייצוא…"; -"web_export_title" = "שמירה כתמונה או כ‑PDF, או הדפסה"; -"web_export_png" = "תמונה (PNG)"; -"web_export_svg" = "גרפיקה וקטורית (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "קובץ VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "הייצוא נכשל: %@"; -"web_print_hint" = "השתמשו ב„ייצוא… → PDF” כדי לשמור את התרשים ולהדפיס אותו משם."; -"web_delete" = "מחיקה"; -"web_language_title" = "שפת הממשק"; -"web_simulation_start" = "התחלת סימולציה"; -"web_simulation_end" = "סיום סימולציה"; -"web_simulation_start_title" = "הרצת התרשים צעד אחר צעד"; -"web_simulation_end_title" = "סיום הסימולציה והמשך עריכה"; -"web_palette_hint" = "גררו לתוך התרשים"; -"web_tabs_label" = "תרשימים"; -"web_status_modified" = "שונה"; -"web_inspector_title" = "מאפיינים"; -"web_inspector_resize" = "שינוי גובה מפקח האובייקטים: גרור את הקו למעלה או למטה (לחיצה כפולה: ברירת מחדל)"; -"web_inspector_help_drop" = "גררו רכיבים מהלוח אל אריח: למעלה = לפני, למטה = אחרי, על „ø” = החלפה. ניתן להזיז רכיבים קיימים בעזרת העכבר."; -"web_inspector_help_inline" = "לחיצה כפולה או הקשה כפולה על רכיב לעריכת הטקסט ישירות בתרשים (Enter להחלה, Esc לביטול). כך גם שמות המקרים."; -"web_inspector_help_files" = "אפשר גם לגרור קבצים לתוך החלון."; -"web_case_name" = "שם המקרה"; -"web_case_name_placeholder" = "למשל 1, ok, default"; -"web_copied" = "הרכיב הועתק."; -"web_discard_message_fmt" = "השינויים ב„%@” יאבדו."; -"web_err_unreadable_fmt" = "„%@” אינו קובץ VisuStruct קריא (%@)."; -"web_saved_fmt" = "„%@” נשמר."; -"web_saved_txt_fmt" = "נשמר בשם „%@”. הסירו את הסיומת .txt כדי להשתמש בו."; -"web_drop_impossible" = "לא ניתן לשחרר כאן"; -"web_sim_delay" = "השהיה לכל צעד"; -"web_sim_delay_value_fmt" = "%@ שנ׳"; -"web_codegen_language" = "שפה"; -"web_codegen_comments" = "טקסט התרשים כהערות"; -"web_codegen_empty_else" = "יצירת ענף else ריק בקוד"; -"web_copied_check" = "הועתק ✓"; -"web_copy_manual" = "נבחר, הקישו Ctrl+C להעתקה"; -"web_run_stopped_loop" = "ההרצה נעצרה: ייתכן שיש לולאה אינסופית."; -"web_run_cancelled" = "ההרצה בוטלה."; -"web_run_error" = "שגיאה בזמן ההרצה."; -"web_run_dropped_fmt" = "… %d שורות קודמות מוסתרות"; -"web_sim_call_arguments_fmt" = "הקריאה אינה תואמת את הכותרת של %@. בדוק את הערכים בסוגריים."; -"web_sim_missing_return_fmt" = "%@ הסתיים בלי להחזיר ערך עם return."; -"web_sim_file_not_found_fmt" = "אין קובץ בשם %@."; -"web_sim_end_of_file_fmt" = "בקובץ %@ אין עוד שורות."; -"web_sim_null_value_fmt" = "%@ הוא null."; -"web_sim_unknown_variable_case_fmt" = "משתנה לא מוכר: %1$@. Java מבחינה בין אותיות גדולות לקטנות: האם התכוונת ל־%2$@?"; -"web_sim_written_file_fmt" = "%@ (נשמר)"; -"web_site_home" = "דף הבית"; -"web_site_imprint" = "פרטי המפרסם"; -"web_site_privacy" = "פרטיות"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "תכנות"; -"web_live_hide" = "הסתרת תכנות"; -"web_scale_canvas" = "גודל טקסט: תרשים"; -"web_scale_code" = "גודל טקסט: תכנות"; -"web_live_indent" = "הזחה"; -"web_live_indent_title" = "הזחת הקוד: ארבעה רווחים לכל רמה (השורות המסומנות, אחרת הכול)"; -"web_live_show" = "הצגת תכנות"; -"web_live_resize" = "שינוי רוחב אזור הקוד (לחיצה כפולה: איפוס)"; -"web_live_hint" = "הקוד גדל יחד עם התרשים. אפור = ממלא מקום: כתבו במפקח והטקסט יופיע כאן. לחצו על שורה כדי לבחור את הרכיב."; -"web_live_ph_selector" = "משתנה"; -"web_live_ph_code" = "הקוד שלך"; -"web_live_ph_end" = "סוף"; -"web_live_language" = "שפת תכנות"; -"web_live_java_class" = "כמחלקה"; -"web_live_java_class_hint" = "שם המחלקה = כותרת התרשים"; -"web_live_java_main" = "עם מתודת main"; -"web_settings_display" = "תצוגה"; -"web_live_swing" = "Java אמיתית (עם Swing)"; -"web_live_swing_hint" = "ג׳אווה אמיתית עם חלונות (CheerpJ). מורידה פעם אחת כ-40 MB בהרצה הראשונה."; -"web_live_swing_windows" = "חלונות ג׳אווה"; -"web_live_swing_hide" = "סגירת חלונות ג׳אווה"; -"web_live_swing_loading" = "טוען ג׳אווה (בפעם הראשונה כ-40 MB) …"; -"web_live_swing_compiling" = "מהדר …"; -"web_live_swing_running" = "התוכנית רצה."; -"web_live_swing_compile_failed" = "שגיאת הידור, ראה למעלה."; -"web_live_swing_failed" = "לא ניתן לטעון את ג׳אווה. בדוק את החיבור לאינטרנט."; -"web_live_hint_edit" = "הקלד כאן קוד Java והתרשים נבנה בעצמו. או עבוד בתרשים והקוד יגדל איתו. אפור = ממלא מקום, פשוט כתוב מעליו."; -"web_live_edit_label" = "קוד Java"; -"web_parse_line_fmt" = "שורה %d: %@"; -"web_parse_missing" = "עדיין חסר כאן: %@"; -"web_parse_extra" = "מיותר: %@"; -"web_parse_unclosed_string" = "חסר כאן ה־%@ הסוגר."; -"web_parse_else_without_if" = "ל־“else” הזה אין “if”."; -"web_parse_case_outside_switch" = "“case” ו־“default” שייכים בתוך “switch”."; -"web_parse_missing_do_while" = "אחרי “do { … }” עדיין חסר “while (תנאי);”."; -"web_parse_more_methods" = "כרגע נחשבת כאן רק מתודה אחת. צור תוכניות משנה נוספות בכרטיסיות נפרדות."; -"web_parse_missing_import" = "חסר בראש הקוד %@ בלי השורה הזו Java לא מכירה את Scanner."; -"web_parse_missing_scanner" = "חסר קודם %@ בלי השורה הזו אין Scanner."; -"web_parse_unknown_type" = "Java לא מכירה את סוג הנתונים הזה. האם התכוונת ל-%@?"; -"web_quickfix_insert_fmt" = "הצעה: להוסיף %@"; -"web_quickfix_replace_fmt" = "הצעה: %1$@ במקום %2$@"; -"web_parse_wrong_case" = "Java מבחינה בין אותיות גדולות לקטנות. הנכון הוא %@."; -"web_editor_title" = "תרשים"; -"web_editor_show" = "הצגת התרשים"; -"web_editor_hide" = "הסתרת התרשים"; -"web_keywords_title" = "מילות מפתח של קוד"; -"web_keywords_hint" = "if, while, for במקום שמות הרכיבים"; -"web_palette_compact" = "רכיבים תמיד בתצוגה מצומצמת"; -"web_palette_compact_hint" = "סמל עם שם קטן מתחתיו, אחרת רק כשהעמודה צרה"; -"web_about_version_fmt" = "גרסה %@"; -"web_about_software" = "תוכנה בשימוש"; -"web_about_software_text" = "עורך הקוד משתמש ב-CodeMirror וב-Lezer (רישיון MIT). עם תמיכה ב-Swing, VisuStruct טוען את CheerpJ של Leaning Technologies (רישיון Community) ואת javac מ-OpenJDK."; -"web_about_licenses" = "נוסחי הרישיונות"; -"web_live_run" = "הרצה"; -"web_live_run_title" = "הרצת התוכנית: הפלט והקלט מופיעים למטה"; -"web_live_run_finished" = "התוכנית הסתיימה."; -"web_live_run_stopped" = "נעצר."; -"web_console" = "מסוף"; -"web_console_hide" = "הסתרת המסוף"; -"web_console_resize" = "שינוי גובה המסוף"; -"web_diagram_tools" = "כלי התרשים"; -"web_files_title" = "קבצים"; -"web_files_show" = "הצגת קבצים"; -"web_files_hide" = "הסתרת קבצים"; -"web_files_resize" = "שינוי רוחב הקבצים"; -"web_files_new_folder" = "תיקייה חדשה"; -"web_files_switch" = "בחירת תיקייה אחרת"; -"web_files_delete" = "מחיקה"; -"web_files_in_browser" = "באחסון של דפדפן זה"; -"web_files_save_hint_fmt" = "השמירה מכניסה את התוכנית אל %@."; -"web_files_empty" = "עדיין לא נשמר דבר. בשמירה VisuStruct יוצר כאן תיקייה עם התאריך של היום."; -"web_files_reconnect_hint" = "אחרי טעינה מחדש הדפדפן שואל שוב אם VisuStruct רשאי להשתמש בתיקייה."; -"web_files_reconnect_fmt" = "פתיחת התיקייה „%@“"; -"web_files_connect_hint" = "בחרו תיקייה כסביבת עבודה. VisuStruct יוצר בה תיקייה לכל יום ושומר את התרשים ואת הקוד."; -"web_files_connect" = "בחירת תיקייה"; -"web_files_browser_hint" = "דפדפן זה אינו יכול לפתוח תיקיות במכשיר (למשל ב-iPad). הקבצים נשארים באחסון של הדפדפן."; -"web_files_browser" = "שמירה בדפדפן"; -"web_files_delete_confirm_fmt" = "למחוק את „%@“?"; -"web_files_folder_prompt" = "שם התיקייה החדשה:"; -"web_files_default_name" = "תוכנית"; -"web_files_saved_fmt" = "נשמר: %@"; -"web_files_create" = "יצירה"; -"web_learn_ludwig_tip" = "הטיפ של לודוויג"; -"web_game_title" = "משחק: אמת או שקר?"; -"web_game_intro" = "לודוויג מראה ערכים ותנאי. האם התנאי אמת (true) או שקר (false)? עשרה סבבים, כל פעם קשה יותר."; -"web_game_start" = "התחלת המשחק"; -"web_game_round_fmt" = "סבב %@ מתוך %@"; -"web_game_score_fmt" = "נקודות: %@"; -"web_game_true" = "אמת (true)"; -"web_game_false" = "שקר (false)"; -"web_game_right" = "נכון!"; -"web_game_wrong" = "לא בדיוק. כך מחשבים:"; -"web_game_next" = "הבא"; -"web_game_finish" = "תוצאה"; -"web_game_done_fmt" = "%@ מתוך %@ נכונות."; -"web_game_perfect" = "הכול נכון – לודוויג מתרשם מאוד!"; -"web_game_good" = "מצוין! עברו שוב על הטעויות ונסו שוב."; -"web_game_practice" = "תרגול עושה מושלם. קראו שוב את טבלת האמת ושחקו עוד סבב."; -"web_game_again" = "לשחק שוב"; -"web_game_wrong_short" = "לצערי לא נכון."; -"web_game_practice_short" = "תרגול מביא לשלמות. קרא שוב את ההסברים ושחק סיבוב נוסף."; -"web_game_clicks" = "לחיצות:"; -"web_game_nobody" = "אף אחד לא מאזין – שום דבר לא קורה."; -"web_game_event_fmt" = "לחיצה על „%@”: המאזין שומע ומריץ את הקוד שלו."; -"web_game_try" = "עכשיו נסה בעצמך את הכפתורים בחלון."; -"web_game_time_fmt" = "נותרו %@ שנ׳"; -"web_game_defused" = "✂️ נוטרלה! מצאת את הטעות."; -"web_game_boom_time" = "💥 בום! הזמן נגמר."; -"web_game_boom_wrong" = "💥 בום! זו הייתה השורה הלא נכונה."; -"web_game_boom_part" = "💥 בום! השורה נכונה, אבל הטעות בחלק אחר שלה."; -"web_game_boom_wrong_part" = "💥 בום! הטעות בשורה אחרת."; -"web_game_bomb_parts_hint" = "הקש בדיוק על החלק השגוי."; -"web_game_fix" = "השורה הנכונה:"; -"web_game_order_hint" = "הקש על השלבים בסדר הנכון."; -"web_debug_step" = "צעד"; -"web_debug_step_title" = "צעד: להריץ הוראה אחת ולעצור שוב"; -"web_debug_continue" = "להמשיך עד נקודת העצירה הבאה"; -"web_debug_paused_fmt" = "נעצר לפני שורה %d."; -"web_debug_gutter_title" = "לחיצה על מספר שורה מוסיפה או מסירה נקודת עצירה"; -"web_swap_to_code" = "תכנות גדול"; -"web_swap_to_editor" = "תרשים גדול"; -"web_editor_resize" = "שינוי רוחב התרשים"; -"web_palette_resize" = "שינוי רוחב הרכיבים"; -"web_palette_hide" = "הסתרת הרכיבים"; -"web_palette_show" = "הצגת הרכיבים"; -"web_code_scopes" = "בלוקי קוד צבעוניים"; -"web_code_scopes_hint" = "מחלקה, מתודה, לולאה, הסתעפות בתיבות משלהן"; -"web_pseudocode" = "פסאודו-קוד"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "שינוי שם המשתנה …"; -"web_rename_title" = "שינוי שם המשתנה"; -"web_rename_old" = "שם"; -"web_rename_new" = "שם חדש"; -"web_rename_hint" = "משנה כל מקום עם בדיוק הכתיב הזה (number אינו Number), בקוד ובתרשים המבנה. טקסט בתוך \"…\" והערות נשארים."; -"web_rename_count_fmt" = "מופיע %d פעמים."; -"web_rename_exists_fmt" = "„%@” כבר קיים: אחר כך שניהם יהיו משתנה אחד."; -"web_rename_invalid" = "שם מתחיל באות ומכיל רק אותיות, ספרות ו־_."; -"web_rename_keyword_fmt" = "„%@” היא מילת מפתח של Java."; -"web_rename_apply" = "שינוי שם"; -"web_rename_cancel" = "ביטול"; diff --git a/web/src/i18n/it.strings b/web/src/i18n/it.strings deleted file mode 100644 index 7bf030d6..00000000 --- a/web/src/i18n/it.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Testi presenti solo nella versione web. Tutto il resto proviene dai Localizable.strings dell’app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagramma VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Canc"; -"web_key_shift" = "Maiusc"; -"web_export" = "Esporta…"; -"web_export_title" = "Salva come immagine o PDF, oppure stampa"; -"web_export_png" = "Immagine (PNG)"; -"web_export_svg" = "Grafica vettoriale (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "File VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Esportazione non riuscita: %@"; -"web_print_hint" = "Usa “Esporta… → PDF” per salvare il diagramma e stamparlo da lì."; -"web_delete" = "Elimina"; -"web_language_title" = "Lingua dell’interfaccia"; -"web_simulation_start" = "Avvia simulazione"; -"web_simulation_end" = "Termina simulazione"; -"web_simulation_start_title" = "Esegui il diagramma passo dopo passo"; -"web_simulation_end_title" = "Termina la simulazione e continua a modificare"; -"web_palette_hint" = "Trascina nel diagramma"; -"web_tabs_label" = "Diagrammi"; -"web_status_modified" = "modificato"; -"web_inspector_title" = "Proprietà"; -"web_inspector_resize" = "Cambia l’altezza dell’ispettore oggetti: trascina o scorri la linea su o giù (doppio clic: predefinito)"; -"web_inspector_help_drop" = "Trascina gli elementi dalla tavolozza su un riquadro: in alto = prima, in basso = dopo, su “ø” = sostituisci. Gli elementi esistenti si possono spostare con il mouse."; -"web_inspector_help_inline" = "Doppio clic o doppio tocco su un elemento per modificarne il testo direttamente nel diagramma (Invio applica, Esc annulla). Anche i nomi dei casi."; -"web_inspector_help_files" = "Puoi anche trascinare file nella finestra."; -"web_case_name" = "Nome del caso"; -"web_case_name_placeholder" = "es. 1, ok, default"; -"web_copied" = "Elemento copiato."; -"web_discard_message_fmt" = "Le modifiche a “%@” andranno perse."; -"web_err_unreadable_fmt" = "“%@” non è un file VisuStruct leggibile (%@)."; -"web_saved_fmt" = "“%@” salvato."; -"web_saved_txt_fmt" = "Salvato come “%@”. Rimuovi l’estensione .txt per usarlo."; -"web_drop_impossible" = "Impossibile rilasciare qui"; -"web_sim_delay" = "Pausa per passo"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Linguaggio"; -"web_codegen_comments" = "Testo del diagramma come commenti"; -"web_codegen_empty_else" = "Genera ramo else vuoto nel codice"; -"web_copied_check" = "Copiato ✓"; -"web_copy_manual" = "Selezionato, premi Ctrl+C per copiare"; -"web_run_stopped_loop" = "Esecuzione interrotta: possibile ciclo infinito."; -"web_run_cancelled" = "Esecuzione annullata."; -"web_run_error" = "Errore durante l’esecuzione."; -"web_run_dropped_fmt" = "… %d righe precedenti nascoste"; -"web_sim_call_arguments_fmt" = "La chiamata non corrisponde all’intestazione di %@. Controlla i valori tra parentesi."; -"web_sim_missing_return_fmt" = "%@ è terminato senza restituire un valore con return."; -"web_sim_file_not_found_fmt" = "Non esiste nessun file chiamato %@."; -"web_sim_end_of_file_fmt" = "Il file %@ non ha più righe."; -"web_sim_null_value_fmt" = "%@ è null."; -"web_sim_unknown_variable_case_fmt" = "Variabile sconosciuta: %1$@. Java distingue tra maiuscole e minuscole: intendevi %2$@?"; -"web_sim_written_file_fmt" = "%@ (salvato)"; -"web_site_home" = "Pagina iniziale"; -"web_site_imprint" = "Note legali"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmazione"; -"web_live_hide" = "Nascondi programmazione"; -"web_scale_canvas" = "Dimensione testo: diagramma"; -"web_scale_code" = "Dimensione testo: programmazione"; -"web_live_indent" = "Indenta"; -"web_live_indent_title" = "Indenta il codice: quattro spazi per livello (righe selezionate, altrimenti tutto)"; -"web_live_show" = "Mostra programmazione"; -"web_live_resize" = "Modifica la larghezza dell’area codice (doppio clic: ripristina)"; -"web_live_hint" = "Il codice cresce con il tuo diagramma. Grigio = segnaposto: scrivi nell’ispettore e il tuo testo appare qui. Clicca su una riga per selezionarne l’elemento."; -"web_live_ph_selector" = "variabile"; -"web_live_ph_code" = "Il tuo codice"; -"web_live_ph_end" = "fine"; -"web_live_language" = "Linguaggio di programmazione"; -"web_live_java_class" = "Come classe"; -"web_live_java_class_hint" = "Nome della classe = titolo del diagramma"; -"web_live_java_main" = "Con metodo main"; -"web_settings_display" = "Visualizzazione"; -"web_live_swing" = "Java vero (con Swing)"; -"web_live_swing_hint" = "Java vero con finestre (CheerpJ). Scarica circa 40 MB una sola volta, alla prima esecuzione."; -"web_live_swing_windows" = "Finestre Java"; -"web_live_swing_hide" = "Chiudi finestre Java"; -"web_live_swing_loading" = "Caricamento di Java (circa 40 MB la prima volta) …"; -"web_live_swing_compiling" = "Compilazione …"; -"web_live_swing_running" = "Il programma è in esecuzione."; -"web_live_swing_compile_failed" = "Errore di compilazione, vedi sopra."; -"web_live_swing_failed" = "Impossibile caricare Java. Controlla la connessione a internet."; -"web_live_hint_edit" = "Scrivi qui codice Java e il diagramma si costruisce da solo. Oppure lavora nel diagramma e il codice cresce con lui. Grigio = segnaposto, basta scriverci sopra."; -"web_live_edit_label" = "Codice Java"; -"web_parse_line_fmt" = "Riga %d: %@"; -"web_parse_missing" = "Qui manca ancora: %@"; -"web_parse_extra" = "Di troppo: %@"; -"web_parse_unclosed_string" = "Manca il %@ di chiusura."; -"web_parse_else_without_if" = "Questo «else» non ha un «if»."; -"web_parse_case_outside_switch" = "«case» e «default» vanno dentro uno «switch»."; -"web_parse_missing_do_while" = "Dopo «do { … }» manca ancora «while (condizione);»."; -"web_parse_more_methods" = "Per ora qui conta un solo metodo. Crea gli altri sottoprogrammi in schede separate."; -"web_parse_missing_import" = "Manca %@ in cima. Senza questa riga Java non conosce Scanner."; -"web_parse_missing_scanner" = "Manca prima %@ Senza questa riga lo Scanner non esiste."; -"web_parse_unknown_type" = "Java non conosce questo tipo di dato. Intendevi %@?"; -"web_quickfix_insert_fmt" = "Suggerimento: inserisci %@"; -"web_quickfix_replace_fmt" = "Suggerimento: %1$@ invece di %2$@"; -"web_parse_wrong_case" = "Java distingue tra maiuscole e minuscole. La forma corretta è %@."; -"web_editor_title" = "Diagramma"; -"web_editor_show" = "Mostra diagramma"; -"web_editor_hide" = "Nascondi diagramma"; -"web_keywords_title" = "Parole chiave del codice"; -"web_keywords_hint" = "if, while, for al posto dei nomi degli elementi"; -"web_palette_compact" = "Elementi sempre compatti"; -"web_palette_compact_hint" = "Simbolo con il nome piccolo sotto, altrimenti solo con la colonna stretta"; -"web_about_version_fmt" = "Versione %@"; -"web_about_software" = "Software utilizzato"; -"web_about_software_text" = "L’editor di codice usa CodeMirror e Lezer (licenza MIT). Con il supporto Swing, VisuStruct carica CheerpJ di Leaning Technologies (licenza Community) e javac di OpenJDK."; -"web_about_licenses" = "Testi delle licenze"; -"web_live_run" = "Esegui"; -"web_live_run_title" = "Esegui il programma: output e input compaiono sotto"; -"web_live_run_finished" = "Programma terminato."; -"web_live_run_stopped" = "Fermato."; -"web_console" = "Console"; -"web_console_hide" = "Nascondi console"; -"web_console_resize" = "Ridimensiona la console"; -"web_diagram_tools" = "Strumenti del diagramma"; -"web_files_title" = "File"; -"web_files_show" = "Mostra file"; -"web_files_hide" = "Nascondi file"; -"web_files_resize" = "Ridimensiona file"; -"web_files_new_folder" = "Nuova cartella"; -"web_files_switch" = "Scegli un’altra cartella"; -"web_files_delete" = "Elimina"; -"web_files_in_browser" = "Nella memoria di questo browser"; -"web_files_save_hint_fmt" = "Salvando, il programma va in %@."; -"web_files_empty" = "Ancora niente di salvato. Quando salvi, VisuStruct crea qui una cartella con la data di oggi."; -"web_files_reconnect_hint" = "Dopo il ricaricamento il browser chiede di nuovo se VisuStruct può usare la tua cartella."; -"web_files_reconnect_fmt" = "Apri la cartella «%@»"; -"web_files_connect_hint" = "Scegli una cartella come spazio di lavoro. VisuStruct vi crea una cartella per ogni giorno e salva diagramma e codice."; -"web_files_connect" = "Scegli cartella"; -"web_files_browser_hint" = "Questo browser non può aprire cartelle del dispositivo (per esempio su iPad). I tuoi file restano nella memoria di questo browser."; -"web_files_browser" = "Salva nel browser"; -"web_files_delete_confirm_fmt" = "Eliminare davvero «%@»?"; -"web_files_folder_prompt" = "Nome della nuova cartella:"; -"web_files_default_name" = "Programma"; -"web_files_saved_fmt" = "Salvato: %@"; -"web_files_create" = "Crea"; -"web_learn_ludwig_tip" = "Il consiglio di Ludwig"; -"web_game_title" = "Gioco: Vero o falso?"; -"web_game_intro" = "Ludwig ti mostra dei valori e una condizione. È vera (true) o falsa (false)? Dieci turni, sempre più difficili."; -"web_game_start" = "Inizia il gioco"; -"web_game_round_fmt" = "Turno %@ di %@"; -"web_game_score_fmt" = "Punti: %@"; -"web_game_true" = "vero (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "Giusto!"; -"web_game_wrong" = "Non proprio. Ecco il calcolo:"; -"web_game_next" = "Avanti"; -"web_game_finish" = "Risultato"; -"web_game_done_fmt" = "%@ su %@ giuste."; -"web_game_perfect" = "Tutto giusto – Ludwig è davvero colpito!"; -"web_game_good" = "Ottimo! Riguarda gli errori e riprova."; -"web_game_practice" = "La pratica rende perfetti. Rileggi la tabella di verità e gioca un altro turno."; -"web_game_again" = "Gioca ancora"; -"web_game_wrong_short" = "Peccato, è sbagliato."; -"web_game_practice_short" = "La pratica rende perfetti. Rileggi le spiegazioni e gioca un altro turno."; -"web_game_clicks" = "Clic:"; -"web_game_nobody" = "Nessuno ascolta: non succede nulla."; -"web_game_event_fmt" = "Clic su «%@»: l'ascoltatore lo sente ed esegue il suo codice."; -"web_game_try" = "Ora prova tu i pulsanti della finestra."; -"web_game_time_fmt" = "Ancora %@ s"; -"web_game_defused" = "✂️ Disinnescata! Hai trovato l’errore."; -"web_game_boom_time" = "💥 Bum! Il tempo è scaduto."; -"web_game_boom_wrong" = "💥 Bum! Era la riga sbagliata."; -"web_game_boom_part" = "💥 Bum! La riga è giusta, ma l’errore è in un’altra parte."; -"web_game_boom_wrong_part" = "💥 Bum! L’errore è in un’altra riga."; -"web_game_bomb_parts_hint" = "Tocca esattamente la parte sbagliata."; -"web_game_fix" = "La riga corretta:"; -"web_game_order_hint" = "Tocca i passaggi nell’ordine giusto."; -"web_debug_step" = "Passo singolo"; -"web_debug_step_title" = "Passo singolo: esegui un’istruzione e fermati di nuovo"; -"web_debug_continue" = "Continua fino al prossimo punto di interruzione"; -"web_debug_paused_fmt" = "Fermo prima della riga %d."; -"web_debug_gutter_title" = "Clicca sul numero di riga per mettere o togliere un punto di interruzione"; -"web_swap_to_code" = "Programmazione grande"; -"web_swap_to_editor" = "Diagramma grande"; -"web_editor_resize" = "Modifica la larghezza del diagramma"; -"web_palette_resize" = "Modifica la larghezza degli elementi"; -"web_palette_hide" = "Nascondi elementi"; -"web_palette_show" = "Mostra elementi"; -"web_code_scopes" = "Blocchi di codice colorati"; -"web_code_scopes_hint" = "Classe, metodo, ciclo, selezione in riquadri propri"; -"web_pseudocode" = "Pseudocodice"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Rinomina variabile …"; -"web_rename_title" = "Rinomina variabile"; -"web_rename_old" = "Nome"; -"web_rename_new" = "Nuovo nome"; -"web_rename_hint" = "Cambia ogni punto con esattamente questa scrittura (numero non è Numero), nel codice e nello strutturogramma. Il testo tra \"…\" e i commenti restano."; -"web_rename_count_fmt" = "Compare %d volte."; -"web_rename_exists_fmt" = "«%@» esiste già: dopo le due sarebbero una sola variabile."; -"web_rename_invalid" = "Un nome inizia con una lettera e contiene solo lettere, cifre e _."; -"web_rename_keyword_fmt" = "«%@» è una parola chiave di Java."; -"web_rename_apply" = "Rinomina"; -"web_rename_cancel" = "Annulla"; diff --git a/web/src/i18n/ja.strings b/web/src/i18n/ja.strings deleted file mode 100644 index 71bb54c7..00000000 --- a/web/src/i18n/ja.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Web 版にのみ存在するテキスト。その他はすべてアプリの Localizable.strings から取得されます。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 構造図"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Delete"; -"web_key_shift" = "Shift"; -"web_export" = "エクスポート…"; -"web_export_title" = "画像または PDF として保存、または印刷"; -"web_export_png" = "画像(PNG)"; -"web_export_svg" = "ベクター画像(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct ファイル(.visustruct)"; -"web_export_failed_fmt" = "エクスポートに失敗しました:%@"; -"web_print_hint" = "「エクスポート… → PDF」で図を保存し、そこから印刷してください。"; -"web_delete" = "削除"; -"web_language_title" = "表示言語"; -"web_simulation_start" = "シミュレーション開始"; -"web_simulation_end" = "シミュレーション終了"; -"web_simulation_start_title" = "構造図をステップごとに実行"; -"web_simulation_end_title" = "シミュレーションを終了して編集を続ける"; -"web_palette_hint" = "構造図にドラッグ"; -"web_tabs_label" = "図"; -"web_status_modified" = "変更あり"; -"web_inspector_title" = "プロパティ"; -"web_inspector_resize" = "オブジェクトインスペクターの高さを変更:線を上下にドラッグまたはスワイプ(ダブルクリック:標準)"; -"web_inspector_help_drop" = "パレットの要素をタイルにドラッグ:上 = 前に、下 = 後に、「ø」の上 = 置き換え。既存の要素はマウスで移動できます。"; -"web_inspector_help_inline" = "要素をダブルクリック/ダブルタップすると、図の中で直接テキストを編集できます(Enter で確定、Esc で取消)。case 名も同様です。"; -"web_inspector_help_files" = "ファイルをウインドウにドロップすることもできます。"; -"web_case_name" = "ケース名"; -"web_case_name_placeholder" = "例:1, ok, default"; -"web_copied" = "要素をコピーしました。"; -"web_discard_message_fmt" = "「%@」への変更は失われます。"; -"web_err_unreadable_fmt" = "「%@」は読み込める VisuStruct ファイルではありません(%@)。"; -"web_saved_fmt" = "「%@」を保存しました。"; -"web_saved_txt_fmt" = "「%@」として保存しました。使用するには拡張子 .txt を削除してください。"; -"web_drop_impossible" = "ここにはドロップできません"; -"web_sim_delay" = "ステップごとの待ち時間"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "言語"; -"web_codegen_comments" = "図のテキストをコメントとして出力"; -"web_codegen_empty_else" = "空の else 分岐もコードに出力"; -"web_copied_check" = "コピーしました ✓"; -"web_copy_manual" = "選択済み。Ctrl+C でコピーしてください"; -"web_run_stopped_loop" = "実行を停止しました:無限ループの可能性があります。"; -"web_run_cancelled" = "実行を中止しました。"; -"web_run_error" = "実行中にエラーが発生しました。"; -"web_run_dropped_fmt" = "… 以前の %d 行は非表示"; -"web_sim_call_arguments_fmt" = "呼び出しが %@ の見出しと一致しません。かっこ内の値を確認してください。"; -"web_sim_missing_return_fmt" = "%@ は return で値を返さずに終了しました。"; -"web_sim_file_not_found_fmt" = "%@ という名前のファイルはありません。"; -"web_sim_end_of_file_fmt" = "ファイル %@ にはもう行がありません。"; -"web_sim_null_value_fmt" = "%@ は null です。"; -"web_sim_unknown_variable_case_fmt" = "不明な変数: %1$@。Java は大文字と小文字を区別します。%2$@ のことですか?"; -"web_sim_written_file_fmt" = "%@(保存済み)"; -"web_site_home" = "ホームページ"; -"web_site_imprint" = "運営者情報"; -"web_site_privacy" = "プライバシー"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "プログラミング"; -"web_live_hide" = "プログラミングを隠す"; -"web_scale_canvas" = "文字サイズ: 構造化チャート"; -"web_scale_code" = "文字サイズ: プログラミング"; -"web_live_indent" = "インデント"; -"web_live_indent_title" = "コードをインデント: 1 レベルにつき空白 4 つ(選択した行、なければ全体)"; -"web_live_show" = "プログラミングを表示"; -"web_live_resize" = "コード領域の幅を変更(ダブルクリック:リセット)"; -"web_live_hint" = "コードは図と一緒に育ちます。灰色=プレースホルダー:インスペクタに入力するとここに表示されます。行をクリックすると要素を選択します。"; -"web_live_ph_selector" = "変数"; -"web_live_ph_code" = "ここにコード"; -"web_live_ph_end" = "終了"; -"web_live_language" = "プログラミング言語"; -"web_live_java_class" = "クラスとして"; -"web_live_java_class_hint" = "クラス名 = 図のタイトル"; -"web_live_java_main" = "main メソッド付き"; -"web_settings_display" = "表示"; -"web_live_swing" = "本物の Java(Swing 対応)"; -"web_live_swing_hint" = "ウィンドウ付きの本物の Java(CheerpJ)。初回実行時に一度だけ約 40 MB をダウンロードします。"; -"web_live_swing_windows" = "Java ウィンドウ"; -"web_live_swing_hide" = "Java ウィンドウを閉じる"; -"web_live_swing_loading" = "Java を読み込み中(初回は約 40 MB)…"; -"web_live_swing_compiling" = "コンパイル中…"; -"web_live_swing_running" = "プログラム実行中。"; -"web_live_swing_compile_failed" = "コンパイルエラー。上を見てください。"; -"web_live_swing_failed" = "Java を読み込めませんでした。インターネット接続を確認してください。"; -"web_live_hint_edit" = "ここに Java コードを入力すると、図が一緒にできあがります。図で作業すると、コードも一緒に育ちます。灰色=プレースホルダー、そのまま上書きできます。"; -"web_live_edit_label" = "Java コード"; -"web_parse_line_fmt" = "%d 行目: %@"; -"web_parse_missing" = "ここにまだ足りません: %@"; -"web_parse_extra" = "多すぎます: %@"; -"web_parse_unclosed_string" = "閉じる %@ がありません。"; -"web_parse_else_without_if" = "この「else」に対応する「if」がありません。"; -"web_parse_case_outside_switch" = "「case」と「default」は「switch」の中に書きます。"; -"web_parse_missing_do_while" = "「do { … }」の後に「while (条件);」が必要です。"; -"web_parse_more_methods" = "今はここでメソッドを 1 つだけ使います。ほかのサブプログラムは別のタブに作ってください。"; -"web_parse_missing_import" = "先頭に %@ がありません。この行がないと Java は Scanner を知りません。"; -"web_parse_missing_scanner" = "先に %@ がありません。この行がないと Scanner はありません。"; -"web_parse_unknown_type" = "Java はこのデータ型を知りません。%@ のことですか?"; -"web_quickfix_insert_fmt" = "提案: %@ を挿入"; -"web_quickfix_replace_fmt" = "提案: %2$@ の代わりに %1$@"; -"web_parse_wrong_case" = "Java は大文字と小文字を区別します。正しくは %@ です。"; -"web_editor_title" = "構造図"; -"web_editor_show" = "構造図を表示"; -"web_editor_hide" = "構造図を隠す"; -"web_keywords_title" = "コードのキーワード"; -"web_keywords_hint" = "要素名の代わりに if, while, for"; -"web_palette_compact" = "要素を常にコンパクト表示"; -"web_palette_compact_hint" = "記号の下に小さく名前を表示。オフの場合は列が狭いときのみ"; -"web_about_version_fmt" = "バージョン %@"; -"web_about_software" = "使用しているソフトウェア"; -"web_about_software_text" = "コードエディターは CodeMirror と Lezer(MIT ライセンス)を使用しています。Swing サポートを有効にすると、VisuStruct は Leaning Technologies の CheerpJ(Community ライセンス)と OpenJDK の javac を読み込みます。"; -"web_about_licenses" = "ライセンス文"; -"web_live_run" = "実行"; -"web_live_run_title" = "プログラムを実行:出力と入力は下に表示されます"; -"web_live_run_finished" = "プログラムが終了しました。"; -"web_live_run_stopped" = "停止しました。"; -"web_console" = "コンソール"; -"web_console_hide" = "コンソールを隠す"; -"web_console_resize" = "コンソールの高さを変更"; -"web_diagram_tools" = "図のツール"; -"web_files_title" = "ファイル"; -"web_files_show" = "ファイルを表示"; -"web_files_hide" = "ファイルを隠す"; -"web_files_resize" = "ファイルの幅を変更"; -"web_files_new_folder" = "新しいフォルダ"; -"web_files_switch" = "別のフォルダを選ぶ"; -"web_files_delete" = "削除"; -"web_files_in_browser" = "このブラウザのストレージ"; -"web_files_save_hint_fmt" = "保存すると、プログラムは %@ に入ります。"; -"web_files_empty" = "まだ何も保存されていません。保存すると、VisuStruct がここに今日の日付のフォルダを作ります。"; -"web_files_reconnect_hint" = "再読み込み後、VisuStruct がフォルダを使ってよいか、ブラウザがもう一度たずねます。"; -"web_files_reconnect_fmt" = "フォルダ「%@」を開く"; -"web_files_connect_hint" = "作業フォルダを選んでください。VisuStruct が日付ごとのフォルダを作り、図とコードを保存します。"; -"web_files_connect" = "フォルダを選ぶ"; -"web_files_browser_hint" = "このブラウザは端末のフォルダを開けません(例:iPad)。ファイルはこのブラウザのストレージに残ります。"; -"web_files_browser" = "ブラウザに保存"; -"web_files_delete_confirm_fmt" = "「%@」を削除しますか?"; -"web_files_folder_prompt" = "新しいフォルダの名前:"; -"web_files_default_name" = "プログラム"; -"web_files_saved_fmt" = "保存しました:%@"; -"web_files_create" = "作成"; -"web_learn_ludwig_tip" = "ルートヴィヒのヒント"; -"web_game_title" = "ゲーム:真か偽か?"; -"web_game_intro" = "ルートヴィヒが値と条件を見せます。条件は真(true)?それとも偽(false)?10ラウンド、だんだん難しくなります。"; -"web_game_start" = "ゲームを始める"; -"web_game_round_fmt" = "ラウンド %@ / %@"; -"web_game_score_fmt" = "ポイント:%@"; -"web_game_true" = "真(true)"; -"web_game_false" = "偽(false)"; -"web_game_right" = "正解!"; -"web_game_wrong" = "残念。計算はこうなります:"; -"web_game_next" = "次へ"; -"web_game_finish" = "結果"; -"web_game_done_fmt" = "%@ / %@ 正解。"; -"web_game_perfect" = "全問正解――ルートヴィヒも感心しています!"; -"web_game_good" = "すごい!間違えたところを見直して、もう一度やってみよう。"; -"web_game_practice" = "練習あるのみ。上の真理値表をもう一度読んで、もう一回挑戦しよう。"; -"web_game_again" = "もう一度"; -"web_game_wrong_short" = "残念、不正解です。"; -"web_game_practice_short" = "習うより慣れよ。説明をもう一度読んで、もう一回遊んでみよう。"; -"web_game_clicks" = "クリック:"; -"web_game_nobody" = "だれも聞いていません。何も起こりません。"; -"web_game_event_fmt" = "「%@」をクリック: リスナーが気づいて自分のコードを実行します。"; -"web_game_try" = "ウィンドウのボタンを自分で試してみよう。"; -"web_game_time_fmt" = "残り %@ 秒"; -"web_game_defused" = "✂️ 解除成功!間違いを見つけました。"; -"web_game_boom_time" = "💥 ドカン!時間切れです。"; -"web_game_boom_wrong" = "💥 ドカン!その行ではありません。"; -"web_game_boom_part" = "💥 ドカン!行は合っているけど、間違いは別の部分にあるよ。"; -"web_game_boom_wrong_part" = "💥 ドカン!間違いは別の行にあるよ。"; -"web_game_bomb_parts_hint" = "間違っている部分をぴったりタップしよう。"; -"web_game_fix" = "正しい行:"; -"web_game_order_hint" = "正しい順番でステップをタップしよう。"; -"web_debug_step" = "ステップ実行"; -"web_debug_step_title" = "ステップ実行:命令を1つ実行して再び止まる"; -"web_debug_continue" = "次のブレークポイントまで続行"; -"web_debug_paused_fmt" = "%d 行目の前で一時停止中。"; -"web_debug_gutter_title" = "行番号をクリックするとブレークポイントを設定・解除できます"; -"web_swap_to_code" = "プログラミングを大きく"; -"web_swap_to_editor" = "構造図を大きく"; -"web_editor_resize" = "構造図の幅を変更"; -"web_palette_resize" = "要素の幅を変更"; -"web_palette_hide" = "要素を隠す"; -"web_palette_show" = "要素を表示"; -"web_code_scopes" = "コードブロックを色分け"; -"web_code_scopes_hint" = "クラス、メソッド、ループ、分岐をそれぞれの枠で表示"; -"web_pseudocode" = "疑似コード"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "変数の名前を変更 …"; -"web_rename_title" = "変数の名前を変更"; -"web_rename_old" = "名前"; -"web_rename_new" = "新しい名前"; -"web_rename_hint" = "つづりが完全に同じ箇所をすべて、コードと構造図で変更します(number と Number は別です)。\"…\" 内の文字列とコメントは変わりません。"; -"web_rename_count_fmt" = "%d 回使われています。"; -"web_rename_exists_fmt" = "「%@」はすでにあります:変更すると 2 つの変数が 1 つになります。"; -"web_rename_invalid" = "名前は文字で始まり、文字・数字・_ だけを含みます。"; -"web_rename_keyword_fmt" = "「%@」は Java のキーワードです。"; -"web_rename_apply" = "名前を変更"; -"web_rename_cancel" = "キャンセル"; diff --git a/web/src/i18n/ko.strings b/web/src/i18n/ko.strings deleted file mode 100644 index 4c7a28f0..00000000 --- a/web/src/i18n/ko.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* 웹 버전에만 있는 텍스트입니다. 나머지는 모두 앱의 Localizable.strings에서 가져옵니다. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 구조도"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "내보내기…"; -"web_export_title" = "이미지 또는 PDF로 저장하거나 인쇄"; -"web_export_png" = "이미지(PNG)"; -"web_export_svg" = "벡터 그래픽(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 파일(.visustruct)"; -"web_export_failed_fmt" = "내보내기 실패: %@"; -"web_print_hint" = "“내보내기… → PDF”로 다이어그램을 저장한 뒤 인쇄하세요."; -"web_delete" = "삭제"; -"web_language_title" = "인터페이스 언어"; -"web_simulation_start" = "시뮬레이션 시작"; -"web_simulation_end" = "시뮬레이션 종료"; -"web_simulation_start_title" = "구조도를 단계별로 실행"; -"web_simulation_end_title" = "시뮬레이션을 끝내고 계속 편집"; -"web_palette_hint" = "구조도로 드래그하세요"; -"web_tabs_label" = "다이어그램"; -"web_status_modified" = "수정됨"; -"web_inspector_title" = "속성"; -"web_inspector_resize" = "객체 검사기 높이 변경: 선을 위아래로 드래그하거나 스와이프 (더블 클릭: 기본값)"; -"web_inspector_help_drop" = "팔레트의 요소를 타일로 드래그하세요: 위쪽 = 앞에, 아래쪽 = 뒤에, “ø” 위 = 바꾸기. 기존 요소는 마우스로 옮길 수 있습니다."; -"web_inspector_help_inline" = "요소를 두 번 클릭하거나 두 번 탭하면 다이어그램에서 바로 텍스트를 편집할 수 있습니다(Enter 적용, Esc 취소). case 이름도 마찬가지입니다."; -"web_inspector_help_files" = "파일을 창에 끌어다 놓을 수도 있습니다."; -"web_case_name" = "케이스 이름"; -"web_case_name_placeholder" = "예: 1, ok, default"; -"web_copied" = "요소를 복사했습니다."; -"web_discard_message_fmt" = "“%@”의 변경 사항이 사라집니다."; -"web_err_unreadable_fmt" = "“%@”은(는) 읽을 수 있는 VisuStruct 파일이 아닙니다(%@)."; -"web_saved_fmt" = "“%@” 저장됨."; -"web_saved_txt_fmt" = "“%@”(으)로 저장했습니다. 사용하려면 .txt 확장자를 제거하세요."; -"web_drop_impossible" = "여기에 놓을 수 없음"; -"web_sim_delay" = "단계별 대기 시간"; -"web_sim_delay_value_fmt" = "%@초"; -"web_codegen_language" = "언어"; -"web_codegen_comments" = "다이어그램 텍스트를 주석으로"; -"web_codegen_empty_else" = "빈 else 분기도 코드에 출력"; -"web_copied_check" = "복사됨 ✓"; -"web_copy_manual" = "선택됨, Ctrl+C로 복사하세요"; -"web_run_stopped_loop" = "실행 중지: 무한 반복일 수 있습니다."; -"web_run_cancelled" = "실행이 취소되었습니다."; -"web_run_error" = "실행 중 오류가 발생했습니다."; -"web_run_dropped_fmt" = "… 이전 %d줄 숨김"; -"web_sim_call_arguments_fmt" = "호출이 %@의 머리글과 맞지 않습니다. 괄호 안의 값을 확인하세요."; -"web_sim_missing_return_fmt" = "%@이(가) return으로 값을 반환하지 않고 끝났습니다."; -"web_sim_file_not_found_fmt" = "%@(이)라는 파일이 없습니다."; -"web_sim_end_of_file_fmt" = "파일 %@에 더 이상 줄이 없습니다."; -"web_sim_null_value_fmt" = "%@은(는) null입니다."; -"web_sim_unknown_variable_case_fmt" = "알 수 없는 변수: %1$@. Java는 대문자와 소문자를 구분합니다. %2$@을(를) 뜻했나요?"; -"web_sim_written_file_fmt" = "%@ (저장됨)"; -"web_site_home" = "홈페이지"; -"web_site_imprint" = "사이트 정보"; -"web_site_privacy" = "개인정보"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "프로그래밍"; -"web_live_hide" = "프로그래밍 숨기기"; -"web_scale_canvas" = "글자 크기: 구조도"; -"web_scale_code" = "글자 크기: 프로그래밍"; -"web_live_indent" = "들여쓰기"; -"web_live_indent_title" = "코드 들여쓰기: 단계마다 공백 4칸 (선택한 줄, 없으면 전체)"; -"web_live_show" = "프로그래밍 표시"; -"web_live_resize" = "코드 영역 너비 변경(더블클릭: 초기화)"; -"web_live_hint" = "코드는 다이어그램과 함께 자랍니다. 회색 = 자리 표시자: 속성 창에 입력하면 여기에 표시됩니다. 줄을 클릭하면 해당 요소가 선택됩니다."; -"web_live_ph_selector" = "변수"; -"web_live_ph_code" = "코드 작성"; -"web_live_ph_end" = "끝"; -"web_live_language" = "프로그래밍 언어"; -"web_live_java_class" = "클래스로"; -"web_live_java_class_hint" = "클래스 이름 = 순서도 제목"; -"web_live_java_main" = "main 메서드 포함"; -"web_settings_display" = "표시"; -"web_live_swing" = "실제 Java (Swing 포함)"; -"web_live_swing_hint" = "창이 있는 진짜 Java(CheerpJ). 처음 실행할 때 한 번 약 40MB를 내려받습니다."; -"web_live_swing_windows" = "Java 창"; -"web_live_swing_hide" = "Java 창 닫기"; -"web_live_swing_loading" = "Java 불러오는 중(처음에는 약 40MB) …"; -"web_live_swing_compiling" = "컴파일 중 …"; -"web_live_swing_running" = "프로그램 실행 중."; -"web_live_swing_compile_failed" = "컴파일 오류, 위를 보세요."; -"web_live_swing_failed" = "Java를 불러올 수 없습니다. 인터넷 연결을 확인하세요."; -"web_live_hint_edit" = "여기에 Java 코드를 입력하면 순서도가 함께 만들어집니다. 또는 순서도에서 작업하면 코드가 함께 자랍니다. 회색 = 자리표시자, 그대로 덮어쓰면 됩니다."; -"web_live_edit_label" = "Java 코드"; -"web_parse_line_fmt" = "%d행: %@"; -"web_parse_missing" = "여기에 아직 없음: %@"; -"web_parse_extra" = "하나 더 많음: %@"; -"web_parse_unclosed_string" = "닫는 %@가 없습니다."; -"web_parse_else_without_if" = "이 “else”에 맞는 “if”가 없습니다."; -"web_parse_case_outside_switch" = "“case”와 “default”는 “switch” 안에 있어야 합니다."; -"web_parse_missing_do_while" = "“do { … }” 다음에 “while (조건);”이 필요합니다."; -"web_parse_more_methods" = "지금은 메서드 하나만 사용됩니다. 다른 서브프로그램은 별도 탭으로 만드세요."; -"web_parse_missing_import" = "맨 위에 %@ 이(가) 없습니다. 이 줄이 없으면 Java는 Scanner를 모릅니다."; -"web_parse_missing_scanner" = "먼저 %@ 이(가) 없습니다. 이 줄이 없으면 Scanner가 없습니다."; -"web_parse_unknown_type" = "Java는 이 데이터 형식을 알지 못합니다. %@을(를) 의미했나요?"; -"web_quickfix_insert_fmt" = "제안: %@ 삽입"; -"web_quickfix_replace_fmt" = "제안: %2$@ 대신 %1$@"; -"web_parse_wrong_case" = "Java는 대문자와 소문자를 구분합니다. 올바른 표기는 %@입니다."; -"web_editor_title" = "구조도"; -"web_editor_show" = "구조도 표시"; -"web_editor_hide" = "구조도 숨기기"; -"web_keywords_title" = "코드 키워드"; -"web_keywords_hint" = "요소 이름 대신 if, while, for"; -"web_palette_compact" = "요소 항상 간단히 보기"; -"web_palette_compact_hint" = "기호 아래에 작은 이름 표시, 아니면 열이 좁을 때만"; -"web_about_version_fmt" = "버전 %@"; -"web_about_software" = "사용된 소프트웨어"; -"web_about_software_text" = "코드 편집기는 CodeMirror와 Lezer(MIT 라이선스)를 사용합니다. Swing 지원을 켜면 VisuStruct는 Leaning Technologies의 CheerpJ(Community 라이선스)와 OpenJDK의 javac를 불러옵니다."; -"web_about_licenses" = "라이선스 전문"; -"web_live_run" = "실행"; -"web_live_run_title" = "프로그램 실행: 출력과 입력이 아래에 표시됩니다"; -"web_live_run_finished" = "프로그램이 끝났습니다."; -"web_live_run_stopped" = "중지됨."; -"web_console" = "콘솔"; -"web_console_hide" = "콘솔 숨기기"; -"web_console_resize" = "콘솔 크기 조절"; -"web_diagram_tools" = "다이어그램 도구"; -"web_files_title" = "파일"; -"web_files_show" = "파일 보기"; -"web_files_hide" = "파일 숨기기"; -"web_files_resize" = "파일 너비 조절"; -"web_files_new_folder" = "새 폴더"; -"web_files_switch" = "다른 폴더 선택"; -"web_files_delete" = "삭제"; -"web_files_in_browser" = "이 브라우저 저장소"; -"web_files_save_hint_fmt" = "저장하면 프로그램이 %@에 들어갑니다."; -"web_files_empty" = "아직 저장된 것이 없습니다. 저장하면 VisuStruct가 여기에 오늘 날짜 폴더를 만듭니다."; -"web_files_reconnect_hint" = "새로 고침 후 브라우저가 VisuStruct의 폴더 사용 여부를 다시 묻습니다."; -"web_files_reconnect_fmt" = "“%@” 폴더 열기"; -"web_files_connect_hint" = "작업 공간으로 쓸 폴더를 선택하세요. VisuStruct가 날짜별 폴더를 만들고 다이어그램과 코드를 저장합니다."; -"web_files_connect" = "폴더 선택"; -"web_files_browser_hint" = "이 브라우저는 기기의 폴더를 열 수 없습니다 (예: iPad). 파일은 이 브라우저 저장소에 남습니다."; -"web_files_browser" = "브라우저에 저장"; -"web_files_delete_confirm_fmt" = "“%@”을(를) 삭제할까요?"; -"web_files_folder_prompt" = "새 폴더 이름:"; -"web_files_default_name" = "프로그램"; -"web_files_saved_fmt" = "저장됨: %@"; -"web_files_create" = "만들기"; -"web_learn_ludwig_tip" = "루트비히의 팁"; -"web_game_title" = "게임: 참일까 거짓일까?"; -"web_game_intro" = "루트비히가 값과 조건을 보여 줍니다. 조건이 참(true)일까요, 거짓(false)일까요? 10라운드, 점점 어려워집니다."; -"web_game_start" = "게임 시작"; -"web_game_round_fmt" = "라운드 %@ / %@"; -"web_game_score_fmt" = "점수: %@"; -"web_game_true" = "참 (true)"; -"web_game_false" = "거짓 (false)"; -"web_game_right" = "정답!"; -"web_game_wrong" = "아쉽네요. 이렇게 계산합니다:"; -"web_game_next" = "다음"; -"web_game_finish" = "결과"; -"web_game_done_fmt" = "%@ / %@ 정답."; -"web_game_perfect" = "모두 정답 – 루트비히가 감탄했어요!"; -"web_game_good" = "훌륭해요! 틀린 것을 다시 보고 한 번 더 해 보세요."; -"web_game_practice" = "연습이 실력을 만듭니다. 위의 진리표를 다시 읽고 한 번 더 해 보세요."; -"web_game_again" = "다시 하기"; -"web_game_wrong_short" = "아쉽지만 틀렸어요."; -"web_game_practice_short" = "연습이 완벽을 만듭니다. 설명을 다시 읽고 한 판 더 해 보세요."; -"web_game_clicks" = "클릭:"; -"web_game_nobody" = "아무도 듣지 않아요. 아무 일도 일어나지 않습니다."; -"web_game_event_fmt" = "„%@” 클릭: 리스너가 듣고 자기 코드를 실행합니다."; -"web_game_try" = "이제 창의 버튼을 직접 눌러 보세요."; -"web_game_time_fmt" = "%@초 남음"; -"web_game_defused" = "✂️ 해체 성공! 오류를 찾았어요."; -"web_game_boom_time" = "💥 펑! 시간이 다 됐어요."; -"web_game_boom_wrong" = "💥 펑! 틀린 줄이었어요."; -"web_game_boom_part" = "💥 펑! 줄은 맞지만, 오류는 다른 부분에 있어요."; -"web_game_boom_wrong_part" = "💥 펑! 오류는 다른 줄에 있어요."; -"web_game_bomb_parts_hint" = "틀린 부분을 정확히 눌러 보세요."; -"web_game_fix" = "올바른 줄:"; -"web_game_order_hint" = "올바른 순서대로 단계를 눌러 보세요."; -"web_debug_step" = "한 단계"; -"web_debug_step_title" = "한 단계: 문장 하나를 실행하고 다시 멈춥니다"; -"web_debug_continue" = "다음 중단점까지 계속"; -"web_debug_paused_fmt" = "%d번째 줄 앞에서 멈춤."; -"web_debug_gutter_title" = "줄 번호를 클릭하면 중단점을 설정하거나 지웁니다"; -"web_swap_to_code" = "프로그래밍 크게"; -"web_swap_to_editor" = "구조도 크게"; -"web_editor_resize" = "구조도 너비 변경"; -"web_palette_resize" = "요소 너비 변경"; -"web_palette_hide" = "요소 숨기기"; -"web_palette_show" = "요소 표시"; -"web_code_scopes" = "코드 블록 색상 표시"; -"web_code_scopes_hint" = "클래스, 메서드, 반복, 분기를 각각의 상자로 표시"; -"web_pseudocode" = "의사 코드"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "변수 이름 바꾸기 …"; -"web_rename_title" = "변수 이름 바꾸기"; -"web_rename_old" = "이름"; -"web_rename_new" = "새 이름"; -"web_rename_hint" = "철자가 정확히 같은 모든 곳을 코드와 구조도에서 바꿉니다(number와 Number는 다릅니다). \"…\" 안의 텍스트와 주석은 그대로입니다."; -"web_rename_count_fmt" = "%d번 사용됨."; -"web_rename_exists_fmt" = "“%@”이(가) 이미 있습니다: 바꾸면 두 변수가 하나가 됩니다."; -"web_rename_invalid" = "이름은 문자로 시작하고 문자, 숫자, _만 포함합니다."; -"web_rename_keyword_fmt" = "“%@”은(는) Java 키워드입니다."; -"web_rename_apply" = "이름 바꾸기"; -"web_rename_cancel" = "취소"; diff --git a/web/src/i18n/nb.strings b/web/src/i18n/nb.strings deleted file mode 100644 index 2ca6f435..00000000 --- a/web/src/i18n/nb.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Tekster som bare finnes i nettversjonen. Alt annet kommer fra appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksporter…"; -"web_export_title" = "Lagre som bilde eller PDF, eller skriv ut"; -"web_export_png" = "Bilde (PNG)"; -"web_export_svg" = "Vektorgrafikk (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Eksporten mislyktes: %@"; -"web_print_hint" = "Bruk «Eksporter… → PDF» for å lagre diagrammet og skrive det ut derfra."; -"web_delete" = "Slett"; -"web_language_title" = "Språk i grensesnittet"; -"web_simulation_start" = "Start simulering"; -"web_simulation_end" = "Avslutt simulering"; -"web_simulation_start_title" = "Kjør struktogrammet trinn for trinn"; -"web_simulation_end_title" = "Avslutt simuleringen og fortsett redigeringen"; -"web_palette_hint" = "Dra inn i struktogrammet"; -"web_tabs_label" = "Diagrammer"; -"web_status_modified" = "endret"; -"web_inspector_title" = "Egenskaper"; -"web_inspector_resize" = "Endre høyden på objektinspektøren: dra eller sveip linjen opp eller ned (dobbeltklikk: standard)"; -"web_inspector_help_drop" = "Dra elementer fra paletten til en rute: øverst = før, nederst = etter, på «ø» = erstatt. Eksisterende elementer kan flyttes med musen."; -"web_inspector_help_inline" = "Dobbeltklikk eller dobbelttrykk på et element for å redigere teksten direkte i diagrammet (Enter bruker, Esc avbryter). Det gjelder også case-navn."; -"web_inspector_help_files" = "Du kan også slippe filer i vinduet."; -"web_case_name" = "Navn på case"; -"web_case_name_placeholder" = "f.eks. 1, ok, default"; -"web_copied" = "Element kopiert."; -"web_discard_message_fmt" = "Endringene i «%@» går tapt."; -"web_err_unreadable_fmt" = "«%@» er ikke en lesbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "«%@» lagret."; -"web_saved_txt_fmt" = "Lagret som «%@». Fjern filendelsen .txt for å bruke den."; -"web_drop_impossible" = "Kan ikke slippes her"; -"web_sim_delay" = "Pause per trinn"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Språk"; -"web_codegen_comments" = "Diagramtekst som kommentarer"; -"web_codegen_empty_else" = "Skriv ut tom else-gren i koden"; -"web_copied_check" = "Kopiert ✓"; -"web_copy_manual" = "Markert, trykk Ctrl+C for å kopiere"; -"web_run_stopped_loop" = "Kjøringen stoppet: mulig uendelig løkke."; -"web_run_cancelled" = "Kjøringen avbrutt."; -"web_run_error" = "Feil under kjøring."; -"web_run_dropped_fmt" = "… %d tidligere linjer skjult"; -"web_sim_call_arguments_fmt" = "Kallet passer ikke til hodet i %@. Sjekk verdiene i parentesene."; -"web_sim_missing_return_fmt" = "%@ ble avsluttet uten å returnere en verdi med return."; -"web_sim_file_not_found_fmt" = "Det finnes ingen fil som heter %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har ikke flere linjer."; -"web_sim_null_value_fmt" = "%@ er null."; -"web_sim_unknown_variable_case_fmt" = "Ukjent variabel: %1$@. Java skiller mellom store og små bokstaver: mente du %2$@?"; -"web_sim_written_file_fmt" = "%@ (lagret)"; -"web_site_home" = "Forside"; -"web_site_imprint" = "Kolofon"; -"web_site_privacy" = "Personvern"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Skjul programmering"; -"web_scale_canvas" = "Tekststørrelse: strukturdiagram"; -"web_scale_code" = "Tekststørrelse: programmering"; -"web_live_indent" = "Rykk inn"; -"web_live_indent_title" = "Rykk inn koden: fire mellomrom per nivå (merkede linjer, ellers alt)"; -"web_live_show" = "Vis programmering"; -"web_live_resize" = "Endre bredden på kodeområdet (dobbeltklikk: tilbakestill)"; -"web_live_hint" = "Koden vokser med diagrammet ditt. Grått = plassholder: skriv i inspektøren, så vises teksten her. Klikk på en linje for å velge elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kode"; -"web_live_ph_end" = "slutt"; -"web_live_language" = "Programmeringsspråk"; -"web_live_java_class" = "Som klasse"; -"web_live_java_class_hint" = "Klassenavn = diagrammets tittel"; -"web_live_java_main" = "Med main-metode"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Ekte Java (med Swing)"; -"web_live_swing_hint" = "Ekte Java med vinduer (CheerpJ). Laster ned ca. 40 MB én gang ved første kjøring."; -"web_live_swing_windows" = "Java-vinduer"; -"web_live_swing_hide" = "Lukk Java-vinduer"; -"web_live_swing_loading" = "Java lastes inn (første gang ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompilerer …"; -"web_live_swing_running" = "Programmet kjører."; -"web_live_swing_compile_failed" = "Kompileringsfeil, se over."; -"web_live_swing_failed" = "Java kunne ikke lastes inn. Sjekk internettforbindelsen."; -"web_live_hint_edit" = "Skriv Java-kode her, så bygger diagrammet seg selv. Eller arbeid i diagrammet, så vokser koden med. Grått = plassholder, bare skriv over."; -"web_live_edit_label" = "Java-kode"; -"web_parse_line_fmt" = "Linje %d: %@"; -"web_parse_missing" = "Her mangler fortsatt: %@"; -"web_parse_extra" = "For mye: %@"; -"web_parse_unclosed_string" = "Det avsluttende %@ mangler."; -"web_parse_else_without_if" = "Denne «else» har ingen «if»."; -"web_parse_case_outside_switch" = "«case» og «default» hører hjemme i en «switch»."; -"web_parse_missing_do_while" = "Etter «do { … }» mangler «while (betingelse);»."; -"web_parse_more_methods" = "Foreløpig teller bare én metode her. Lag andre underprogrammer i egne faner."; -"web_parse_missing_import" = "Øverst mangler %@ Uten denne linjen kjenner ikke Java Scanner."; -"web_parse_missing_scanner" = "Før mangler %@ Uten den linjen finnes ikke Scanneren."; -"web_parse_unknown_type" = "Java kjenner ikke denne datatypen. Mente du %@?"; -"web_quickfix_insert_fmt" = "Forslag: sett inn %@"; -"web_quickfix_replace_fmt" = "Forslag: %1$@ i stedet for %2$@"; -"web_parse_wrong_case" = "Java skiller mellom store og små bokstaver. Riktig er %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Vis strukturdiagram"; -"web_editor_hide" = "Skjul strukturdiagram"; -"web_keywords_title" = "Kode-nøkkelord"; -"web_keywords_hint" = "if, while, for i stedet for elementnavn"; -"web_palette_compact" = "Elementer alltid kompakte"; -"web_palette_compact_hint" = "Symbol med lite navn under, ellers bare når kolonnen er smal"; -"web_about_version_fmt" = "Versjon %@"; -"web_about_software" = "Programvare som brukes"; -"web_about_software_text" = "Kodeeditoren bruker CodeMirror og Lezer (MIT-lisens). Med Swing-støtte laster VisuStruct inn CheerpJ fra Leaning Technologies (Community-lisens) og javac fra OpenJDK."; -"web_about_licenses" = "Lisenstekster"; -"web_live_run" = "Kjør"; -"web_live_run_title" = "Kjør programmet: utdata og inndata vises nedenfor"; -"web_live_run_finished" = "Programmet er ferdig."; -"web_live_run_stopped" = "Stoppet."; -"web_console" = "Konsoll"; -"web_console_hide" = "Skjul konsollen"; -"web_console_resize" = "Endre høyden på konsollen"; -"web_diagram_tools" = "Diagramverktøy"; -"web_files_title" = "Filer"; -"web_files_show" = "Vis filer"; -"web_files_hide" = "Skjul filer"; -"web_files_resize" = "Endre bredden på filer"; -"web_files_new_folder" = "Ny mappe"; -"web_files_switch" = "Velg en annen mappe"; -"web_files_delete" = "Slett"; -"web_files_in_browser" = "I denne nettleserens lagring"; -"web_files_save_hint_fmt" = "Lagring legger programmet i %@."; -"web_files_empty" = "Ingenting lagret ennå. Når du lagrer, lager VisuStruct en mappe med dagens dato her."; -"web_files_reconnect_hint" = "Etter ny innlasting spør nettleseren igjen om VisuStruct kan bruke mappen din."; -"web_files_reconnect_fmt" = "Åpne mappen «%@»"; -"web_files_connect_hint" = "Velg en mappe som arbeidsområde. VisuStruct lager en mappe for hver dag der og lagrer diagram og kode."; -"web_files_connect" = "Velg mappe"; -"web_files_browser_hint" = "Denne nettleseren kan ikke åpne mapper på enheten (f.eks. på iPad). Filene dine blir i nettleserens lagring."; -"web_files_browser" = "Lagre i nettleseren"; -"web_files_delete_confirm_fmt" = "Vil du virkelig slette «%@»?"; -"web_files_folder_prompt" = "Navn på den nye mappen:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Lagret: %@"; -"web_files_create" = "Lag"; -"web_learn_ludwig_tip" = "Ludwigs tips"; -"web_game_title" = "Spill: Sant eller usant?"; -"web_game_intro" = "Ludwig viser deg verdier og en betingelse. Er betingelsen sann (true) eller usann (false)? Ti runder, stadig vanskeligere."; -"web_game_start" = "Start spillet"; -"web_game_round_fmt" = "Runde %@ av %@"; -"web_game_score_fmt" = "Poeng: %@"; -"web_game_true" = "sann (true)"; -"web_game_false" = "usann (false)"; -"web_game_right" = "Riktig!"; -"web_game_wrong" = "Ikke helt. Slik regnes det ut:"; -"web_game_next" = "Neste"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ av %@ riktige."; -"web_game_perfect" = "Alt riktig – Ludwig er imponert!"; -"web_game_good" = "Bra! Se på feilene dine og prøv igjen."; -"web_game_practice" = "Øvelse gjør mester. Les sannhetstabellen igjen og spill en runde til."; -"web_game_again" = "Spill igjen"; -"web_game_wrong_short" = "Dessverre feil."; -"web_game_practice_short" = "Øvelse gjør mester. Les forklaringene igjen og spill en runde til."; -"web_game_clicks" = "Klikk:"; -"web_game_nobody" = "Ingen lytter – ingenting skjer."; -"web_game_event_fmt" = "Klikk på «%@»: lytteren hører det og kjører koden sin."; -"web_game_try" = "Prøv nå knappene i vinduet selv."; -"web_game_time_fmt" = "%@ s igjen"; -"web_game_defused" = "✂️ Desarmert! Du fant feilen."; -"web_game_boom_time" = "💥 Bom! Tiden er ute."; -"web_game_boom_wrong" = "💥 Bom! Det var feil linje."; -"web_game_boom_part" = "💥 Pang! Riktig linje, men feilen er i en annen del."; -"web_game_boom_wrong_part" = "💥 Pang! Feilen er i en annen linje."; -"web_game_bomb_parts_hint" = "Trykk nøyaktig på den feile delen."; -"web_game_fix" = "Riktig linje:"; -"web_game_order_hint" = "Trykk på trinnene i riktig rekkefølge."; -"web_debug_step" = "Steg"; -"web_debug_step_title" = "Steg: kjør én setning og stopp igjen"; -"web_debug_continue" = "Fortsett til neste stoppunkt"; -"web_debug_paused_fmt" = "Stoppet før linje %d."; -"web_debug_gutter_title" = "Klikk på et linjenummer for å sette eller fjerne et stoppunkt"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Endre bredden på struktogrammet"; -"web_palette_resize" = "Endre bredden på elementene"; -"web_palette_hide" = "Skjul elementene"; -"web_palette_show" = "Vis elementene"; -"web_code_scopes" = "Fargede kodeblokker"; -"web_code_scopes_hint" = "Klasse, metode, løkke, forgrening i egne bokser"; -"web_pseudocode" = "Pseudokode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Gi variabelen nytt navn …"; -"web_rename_title" = "Gi variabelen nytt navn"; -"web_rename_old" = "Navn"; -"web_rename_new" = "Nytt navn"; -"web_rename_hint" = "Endrer hvert sted med nøyaktig denne skrivemåten (tall er ikke Tall), i koden og i strukturdiagrammet. Tekst i \"…\" og kommentarer blir værende."; -"web_rename_count_fmt" = "Forekommer %d ganger."; -"web_rename_exists_fmt" = "«%@» finnes allerede: etterpå ville begge være én variabel."; -"web_rename_invalid" = "Et navn begynner med en bokstav og inneholder bare bokstaver, sifre og _."; -"web_rename_keyword_fmt" = "«%@» er et nøkkelord i Java."; -"web_rename_apply" = "Gi nytt navn"; -"web_rename_cancel" = "Avbryt"; diff --git a/web/src/i18n/nl.strings b/web/src/i18n/nl.strings deleted file mode 100644 index ab624ca9..00000000 --- a/web/src/i18n/nl.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Teksten die alleen in de webversie bestaan. Al het andere komt uit de Localizable.strings van de app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-structogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exporteren…"; -"web_export_title" = "Opslaan als afbeelding of PDF, of afdrukken"; -"web_export_png" = "Afbeelding (PNG)"; -"web_export_svg" = "Vectorafbeelding (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-bestand (.visustruct)"; -"web_export_failed_fmt" = "Exporteren mislukt: %@"; -"web_print_hint" = "Gebruik “Exporteren… → PDF” om het diagram op te slaan en het daarna af te drukken."; -"web_delete" = "Verwijderen"; -"web_language_title" = "Taal van de interface"; -"web_simulation_start" = "Simulatie starten"; -"web_simulation_end" = "Simulatie beëindigen"; -"web_simulation_start_title" = "Het structogram stap voor stap uitvoeren"; -"web_simulation_end_title" = "Simulatie beëindigen en verder bewerken"; -"web_palette_hint" = "Naar het structogram slepen"; -"web_tabs_label" = "Diagrammen"; -"web_status_modified" = "gewijzigd"; -"web_inspector_title" = "Eigenschappen"; -"web_inspector_resize" = "Hoogte van de objectinspector wijzigen: sleep of veeg de lijn omhoog of omlaag (dubbelklik: standaard)"; -"web_inspector_help_drop" = "Sleep elementen uit het palet op een tegel: boven = ervoor, onder = erna, op “ø” = vervangen. Bestaande elementen kun je met de muis verplaatsen."; -"web_inspector_help_inline" = "Dubbelklik of dubbeltik op een element om de tekst direct in het diagram te bewerken (Enter past toe, Esc annuleert). Ook voor case-namen."; -"web_inspector_help_files" = "Je kunt ook bestanden in het venster neerzetten."; -"web_case_name" = "Naam van de case"; -"web_case_name_placeholder" = "bijv. 1, ok, default"; -"web_copied" = "Element gekopieerd."; -"web_discard_message_fmt" = "De wijzigingen in “%@” gaan verloren."; -"web_err_unreadable_fmt" = "“%@” is geen leesbaar VisuStruct-bestand (%@)."; -"web_saved_fmt" = "“%@” opgeslagen."; -"web_saved_txt_fmt" = "Opgeslagen als “%@”. Verwijder de extensie .txt om het te gebruiken."; -"web_drop_impossible" = "Hier neerzetten is niet mogelijk"; -"web_sim_delay" = "Pauze per stap"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Taal"; -"web_codegen_comments" = "Diagramtekst als commentaar"; -"web_codegen_empty_else" = "Lege else-tak in code genereren"; -"web_copied_check" = "Gekopieerd ✓"; -"web_copy_manual" = "Geselecteerd, druk op Ctrl+C om te kopiëren"; -"web_run_stopped_loop" = "Uitvoering gestopt: mogelijk oneindige lus."; -"web_run_cancelled" = "Uitvoering geannuleerd."; -"web_run_error" = "Fout tijdens het uitvoeren."; -"web_run_dropped_fmt" = "… %d eerdere regels verborgen"; -"web_sim_call_arguments_fmt" = "De aanroep past niet bij de kop van %@. Controleer de waarden tussen de haakjes."; -"web_sim_missing_return_fmt" = "%@ is geëindigd zonder met return een waarde terug te geven."; -"web_sim_file_not_found_fmt" = "Er is geen bestand met de naam %@."; -"web_sim_end_of_file_fmt" = "Het bestand %@ heeft geen regels meer."; -"web_sim_null_value_fmt" = "%@ is null."; -"web_sim_unknown_variable_case_fmt" = "Onbekende variabele: %1$@. Java is hoofdlettergevoelig: bedoelde je %2$@?"; -"web_sim_written_file_fmt" = "%@ (opgeslagen)"; -"web_site_home" = "Startpagina"; -"web_site_imprint" = "Colofon"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmeren"; -"web_live_hide" = "Programmeren verbergen"; -"web_scale_canvas" = "Tekstgrootte: structuurdiagram"; -"web_scale_code" = "Tekstgrootte: programmeren"; -"web_live_indent" = "Inspringen"; -"web_live_indent_title" = "Code laten inspringen: vier spaties per niveau (geselecteerde regels, anders alles)"; -"web_live_show" = "Programmeren tonen"; -"web_live_resize" = "Breedte van het codegebied wijzigen (dubbelklik: herstellen)"; -"web_live_hint" = "De code groeit mee met je diagram. Grijs = plaatshouder: typ in de inspector en je tekst verschijnt hier. Klik op een regel om het element te selecteren."; -"web_live_ph_selector" = "variabele"; -"web_live_ph_code" = "Jouw code"; -"web_live_ph_end" = "einde"; -"web_live_language" = "Programmeertaal"; -"web_live_java_class" = "Als klasse"; -"web_live_java_class_hint" = "Klassenaam = titel van het diagram"; -"web_live_java_main" = "Met main-methode"; -"web_settings_display" = "Weergave"; -"web_live_swing" = "Echte Java (met Swing)"; -"web_live_swing_hint" = "Echt Java met vensters (CheerpJ). Downloadt eenmalig ca. 40 MB bij de eerste keer uitvoeren."; -"web_live_swing_windows" = "Java-vensters"; -"web_live_swing_hide" = "Java-vensters sluiten"; -"web_live_swing_loading" = "Java wordt geladen (de eerste keer ca. 40 MB) …"; -"web_live_swing_compiling" = "Compileren …"; -"web_live_swing_running" = "Programma draait."; -"web_live_swing_compile_failed" = "Compileerfout, zie hierboven."; -"web_live_swing_failed" = "Java kon niet worden geladen. Controleer de internetverbinding."; -"web_live_hint_edit" = "Typ hier Java-code en het diagram bouwt zichzelf op. Of werk in het diagram en de code groeit mee. Grijs = tijdelijke tekst, typ er gewoon overheen."; -"web_live_edit_label" = "Java-code"; -"web_parse_line_fmt" = "Regel %d: %@"; -"web_parse_missing" = "Hier ontbreekt nog: %@"; -"web_parse_extra" = "Te veel: %@"; -"web_parse_unclosed_string" = "De afsluitende %@ ontbreekt."; -"web_parse_else_without_if" = "Bij deze “else” hoort geen “if”."; -"web_parse_case_outside_switch" = "“case” en “default” horen in een “switch”."; -"web_parse_missing_do_while" = "Na “do { … }” ontbreekt nog “while (voorwaarde);”."; -"web_parse_more_methods" = "Voorlopig telt hier maar één methode. Maak andere subprogramma’s in aparte tabbladen."; -"web_parse_missing_import" = "Bovenaan ontbreekt %@ Zonder deze regel kent Java Scanner niet."; -"web_parse_missing_scanner" = "Eerst ontbreekt %@ Zonder deze regel bestaat de Scanner niet."; -"web_parse_unknown_type" = "Java kent dit gegevenstype niet. Bedoelde je %@?"; -"web_quickfix_insert_fmt" = "Suggestie: %@ invoegen"; -"web_quickfix_replace_fmt" = "Suggestie: %1$@ in plaats van %2$@"; -"web_parse_wrong_case" = "Java is hoofdlettergevoelig. Juist is %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Diagram tonen"; -"web_editor_hide" = "Diagram verbergen"; -"web_keywords_title" = "Code-sleutelwoorden"; -"web_keywords_hint" = "if, while, for in plaats van elementnamen"; -"web_palette_compact" = "Elementen altijd compact"; -"web_palette_compact_hint" = "Symbool met kleine naam eronder, anders alleen bij een smalle kolom"; -"web_about_version_fmt" = "Versie %@"; -"web_about_software" = "Gebruikte software"; -"web_about_software_text" = "De code-editor gebruikt CodeMirror en Lezer (MIT-licentie). Met Swing-ondersteuning laadt VisuStruct CheerpJ van Leaning Technologies (Community-licentie) en javac uit OpenJDK."; -"web_about_licenses" = "Licentieteksten"; -"web_live_run" = "Uitvoeren"; -"web_live_run_title" = "Programma uitvoeren: uitvoer en invoer verschijnen eronder"; -"web_live_run_finished" = "Programma klaar."; -"web_live_run_stopped" = "Gestopt."; -"web_console" = "Console"; -"web_console_hide" = "Console verbergen"; -"web_console_resize" = "Hoogte van de console wijzigen"; -"web_diagram_tools" = "Diagramgereedschap"; -"web_files_title" = "Bestanden"; -"web_files_show" = "Bestanden tonen"; -"web_files_hide" = "Bestanden verbergen"; -"web_files_resize" = "Breedte van bestanden wijzigen"; -"web_files_new_folder" = "Nieuwe map"; -"web_files_switch" = "Andere map kiezen"; -"web_files_delete" = "Verwijderen"; -"web_files_in_browser" = "In de opslag van deze browser"; -"web_files_save_hint_fmt" = "Opslaan zet het programma in %@."; -"web_files_empty" = "Nog niets opgeslagen. Bij het opslaan maakt VisuStruct hier een map met de datum van vandaag."; -"web_files_reconnect_hint" = "Na het herladen vraagt de browser nog eens of VisuStruct je map mag gebruiken."; -"web_files_reconnect_fmt" = "Map „%@” openen"; -"web_files_connect_hint" = "Kies een map als werkruimte. VisuStruct maakt daarin een map voor elke dag en slaat diagram en code op."; -"web_files_connect" = "Map kiezen"; -"web_files_browser_hint" = "Deze browser kan geen mappen op het apparaat openen (bijv. op de iPad). Je bestanden blijven in de opslag van deze browser."; -"web_files_browser" = "Opslaan in de browser"; -"web_files_delete_confirm_fmt" = "„%@” echt verwijderen?"; -"web_files_folder_prompt" = "Naam van de nieuwe map:"; -"web_files_default_name" = "Programma"; -"web_files_saved_fmt" = "Opgeslagen: %@"; -"web_files_create" = "Maken"; -"web_learn_ludwig_tip" = "Ludwigs tip"; -"web_game_title" = "Spel: Waar of onwaar?"; -"web_game_intro" = "Ludwig laat je waarden en een voorwaarde zien. Is de voorwaarde waar (true) of onwaar (false)? Tien rondes, steeds lastiger."; -"web_game_start" = "Spel starten"; -"web_game_round_fmt" = "Ronde %@ van %@"; -"web_game_score_fmt" = "Punten: %@"; -"web_game_true" = "waar (true)"; -"web_game_false" = "onwaar (false)"; -"web_game_right" = "Goed!"; -"web_game_wrong" = "Helaas fout. Zo reken je het uit:"; -"web_game_next" = "Verder"; -"web_game_finish" = "Resultaat"; -"web_game_done_fmt" = "%@ van %@ goed."; -"web_game_perfect" = "Alles goed – Ludwig is diep onder de indruk!"; -"web_game_good" = "Sterk! Bekijk je fouten nog eens en probeer het opnieuw."; -"web_game_practice" = "Oefening baart kunst. Lees de waarheidstabel nog eens en speel nog een ronde."; -"web_game_again" = "Nog een keer"; -"web_game_wrong_short" = "Helaas, fout."; -"web_game_practice_short" = "Oefening baart kunst. Lees de uitleg nog eens en speel nog een ronde."; -"web_game_clicks" = "Klikken:"; -"web_game_nobody" = "Niemand luistert – er gebeurt niets."; -"web_game_event_fmt" = "Klik op ‘%@’: de luisteraar hoort het en voert zijn code uit."; -"web_game_try" = "Probeer de knoppen in het venster nu zelf uit."; -"web_game_time_fmt" = "Nog %@ s"; -"web_game_defused" = "✂️ Onschadelijk gemaakt! Je hebt de fout gevonden."; -"web_game_boom_time" = "💥 Boem! De tijd is om."; -"web_game_boom_wrong" = "💥 Boem! Dat was de verkeerde regel."; -"web_game_boom_part" = "💥 Boem! Goede regel, maar de fout zit in een ander deel."; -"web_game_boom_wrong_part" = "💥 Boem! De fout zit in een andere regel."; -"web_game_bomb_parts_hint" = "Tik precies op het foute deel."; -"web_game_fix" = "De juiste regel:"; -"web_game_order_hint" = "Tik de stappen in de juiste volgorde aan."; -"web_debug_step" = "Stap"; -"web_debug_step_title" = "Stap: één opdracht uitvoeren en weer pauzeren"; -"web_debug_continue" = "Doorgaan tot het volgende breekpunt"; -"web_debug_paused_fmt" = "Gepauzeerd vóór regel %d."; -"web_debug_gutter_title" = "Klik op een regelnummer om een breekpunt te plaatsen of te verwijderen"; -"web_swap_to_code" = "Programmeren groot"; -"web_swap_to_editor" = "Structogram groot"; -"web_editor_resize" = "Breedte van het structogram wijzigen"; -"web_palette_resize" = "Breedte van de elementen wijzigen"; -"web_palette_hide" = "Elementen verbergen"; -"web_palette_show" = "Elementen tonen"; -"web_code_scopes" = "Gekleurde codeblokken"; -"web_code_scopes_hint" = "Klasse, methode, lus, keuze in eigen kaders"; -"web_pseudocode" = "Pseudocode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Variabele hernoemen …"; -"web_rename_title" = "Variabele hernoemen"; -"web_rename_old" = "Naam"; -"web_rename_new" = "Nieuwe naam"; -"web_rename_hint" = "Wijzigt elke plek met precies deze schrijfwijze (getal is niet Getal), in de code en in het structogram. Tekst tussen \"…\" en commentaar blijven."; -"web_rename_count_fmt" = "Komt %d keer voor."; -"web_rename_exists_fmt" = "‘%@’ bestaat al: daarna zouden beide één variabele zijn."; -"web_rename_invalid" = "Een naam begint met een letter en bevat alleen letters, cijfers en _."; -"web_rename_keyword_fmt" = "‘%@’ is een Java-sleutelwoord."; -"web_rename_apply" = "Hernoemen"; -"web_rename_cancel" = "Annuleren"; diff --git a/web/src/i18n/pl.strings b/web/src/i18n/pl.strings deleted file mode 100644 index 0e59a42e..00000000 --- a/web/src/i18n/pl.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Teksty dostępne tylko w wersji webowej. Wszystko inne pochodzi z plików Localizable.strings aplikacji. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagram VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksportuj…"; -"web_export_title" = "Zapisz jako obraz lub PDF albo wydrukuj"; -"web_export_png" = "Obraz (PNG)"; -"web_export_svg" = "Grafika wektorowa (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Plik VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Eksport nie powiódł się: %@"; -"web_print_hint" = "Użyj „Eksportuj… → PDF“, aby zapisać diagram i wydrukować go z pliku."; -"web_delete" = "Usuń"; -"web_language_title" = "Język interfejsu"; -"web_simulation_start" = "Uruchom symulację"; -"web_simulation_end" = "Zakończ symulację"; -"web_simulation_start_title" = "Uruchom diagram krok po kroku"; -"web_simulation_end_title" = "Zakończ symulację i wróć do edycji"; -"web_palette_hint" = "Przeciągnij do diagramu"; -"web_tabs_label" = "Diagramy"; -"web_status_modified" = "zmieniony"; -"web_inspector_title" = "Właściwości"; -"web_inspector_resize" = "Zmień wysokość inspektora obiektów: przeciągnij lub przesuń linię w górę lub w dół (dwuklik: domyślnie)"; -"web_inspector_help_drop" = "Przeciągnij elementy z palety na kafelek: góra = przed, dół = za, na „ø“ = zastąp. Istniejące elementy można przesuwać myszą."; -"web_inspector_help_inline" = "Kliknij dwukrotnie lub stuknij dwa razy element, aby edytować tekst bezpośrednio w diagramie (Enter zatwierdza, Esc anuluje). Dotyczy też nazw przypadków."; -"web_inspector_help_files" = "Pliki można też upuścić w oknie."; -"web_case_name" = "Nazwa przypadku"; -"web_case_name_placeholder" = "np. 1, ok, default"; -"web_copied" = "Skopiowano element."; -"web_discard_message_fmt" = "Zmiany w „%@“ zostaną utracone."; -"web_err_unreadable_fmt" = "„%@“ nie jest czytelnym plikiem VisuStruct (%@)."; -"web_saved_fmt" = "Zapisano „%@“."; -"web_saved_txt_fmt" = "Zapisano jako „%@“. Usuń rozszerzenie .txt, aby go użyć."; -"web_drop_impossible" = "Nie można tu upuścić"; -"web_sim_delay" = "Pauza na krok"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Język"; -"web_codegen_comments" = "Tekst diagramu jako komentarze"; -"web_codegen_empty_else" = "Generuj pustą gałąź else w kodzie"; -"web_copied_check" = "Skopiowano ✓"; -"web_copy_manual" = "Zaznaczono, naciśnij Ctrl+C, aby skopiować"; -"web_run_stopped_loop" = "Wykonanie zatrzymane: możliwa pętla nieskończona."; -"web_run_cancelled" = "Wykonanie anulowane."; -"web_run_error" = "Błąd podczas wykonywania."; -"web_run_dropped_fmt" = "… ukryto wcześniejsze wiersze: %d"; -"web_sim_call_arguments_fmt" = "Wywołanie nie pasuje do nagłówka %@. Sprawdź wartości w nawiasach."; -"web_sim_missing_return_fmt" = "%@ zakończył się bez zwrócenia wartości przez return."; -"web_sim_file_not_found_fmt" = "Nie ma pliku o nazwie %@."; -"web_sim_end_of_file_fmt" = "Plik %@ nie ma już więcej wierszy."; -"web_sim_null_value_fmt" = "%@ ma wartość null."; -"web_sim_unknown_variable_case_fmt" = "Nieznana zmienna: %1$@. Java rozróżnia wielkość liter: czy chodziło o %2$@?"; -"web_sim_written_file_fmt" = "%@ (zapisano)"; -"web_site_home" = "Strona główna"; -"web_site_imprint" = "Nota prawna"; -"web_site_privacy" = "Prywatność"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programowanie"; -"web_live_hide" = "Ukryj programowanie"; -"web_scale_canvas" = "Rozmiar tekstu: diagram"; -"web_scale_code" = "Rozmiar tekstu: programowanie"; -"web_live_indent" = "Wcięcia"; -"web_live_indent_title" = "Popraw wcięcia kodu: cztery spacje na poziom (zaznaczone wiersze, w przeciwnym razie wszystko)"; -"web_live_show" = "Pokaż programowanie"; -"web_live_resize" = "Zmień szerokość obszaru kodu (dwuklik: resetuj)"; -"web_live_hint" = "Kod rośnie razem z diagramem. Szary = symbol zastępczy: wpisz tekst w inspektorze, a pojawi się tutaj. Kliknij wiersz, aby zaznaczyć jego element."; -"web_live_ph_selector" = "zmienna"; -"web_live_ph_code" = "Twój kod"; -"web_live_ph_end" = "koniec"; -"web_live_language" = "Język programowania"; -"web_live_java_class" = "Jako klasa"; -"web_live_java_class_hint" = "Nazwa klasy = tytuł diagramu"; -"web_live_java_main" = "Z metodą main"; -"web_settings_display" = "Wygląd"; -"web_live_swing" = "Prawdziwa Java (ze Swing)"; -"web_live_swing_hint" = "Prawdziwa Java z oknami (CheerpJ). Przy pierwszym uruchomieniu jednorazowo pobiera ok. 40 MB."; -"web_live_swing_windows" = "Okna Java"; -"web_live_swing_hide" = "Zamknij okna Java"; -"web_live_swing_loading" = "Ładowanie Javy (za pierwszym razem ok. 40 MB) …"; -"web_live_swing_compiling" = "Kompilowanie …"; -"web_live_swing_running" = "Program działa."; -"web_live_swing_compile_failed" = "Błąd kompilacji, zobacz powyżej."; -"web_live_swing_failed" = "Nie udało się załadować Javy. Sprawdź połączenie z internetem."; -"web_live_hint_edit" = "Wpisz tu kod Java, a diagram zbuduje się sam. Albo pracuj w diagramie, a kod będzie rósł razem z nim. Szary = symbol zastępczy, po prostu pisz."; -"web_live_edit_label" = "Kod Java"; -"web_parse_line_fmt" = "Wiersz %d: %@"; -"web_parse_missing" = "Tu jeszcze brakuje: %@"; -"web_parse_extra" = "Za dużo: %@"; -"web_parse_unclosed_string" = "Brakuje zamykającego %@."; -"web_parse_else_without_if" = "Ten „else” nie ma pasującego „if”."; -"web_parse_case_outside_switch" = "„case” i „default” należą do „switch”."; -"web_parse_missing_do_while" = "Po „do { … }” brakuje jeszcze „while (warunek);”."; -"web_parse_more_methods" = "Na razie liczy się tu tylko jedna metoda. Utwórz kolejne podprogramy w osobnych kartach."; -"web_parse_missing_import" = "Na samej górze brakuje %@ Bez tej linii Java nie zna klasy Scanner."; -"web_parse_missing_scanner" = "Wcześniej brakuje %@ Bez tej linii Scanner nie istnieje."; -"web_parse_unknown_type" = "Java nie zna tego typu danych. Czy chodziło ci o %@?"; -"web_quickfix_insert_fmt" = "Propozycja: wstaw %@"; -"web_quickfix_replace_fmt" = "Propozycja: %1$@ zamiast %2$@"; -"web_parse_wrong_case" = "Java rozróżnia wielkość liter. Poprawnie: %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Pokaż diagram"; -"web_editor_hide" = "Ukryj diagram"; -"web_keywords_title" = "Słowa kluczowe kodu"; -"web_keywords_hint" = "if, while, for zamiast nazw elementów"; -"web_palette_compact" = "Elementy zawsze kompaktowe"; -"web_palette_compact_hint" = "Symbol z małą nazwą pod spodem, w przeciwnym razie tylko przy wąskiej kolumnie"; -"web_about_version_fmt" = "Wersja %@"; -"web_about_software" = "Używane oprogramowanie"; -"web_about_software_text" = "Edytor kodu korzysta z CodeMirror i Lezer (licencja MIT). Z obsługą Swing VisuStruct wczytuje CheerpJ firmy Leaning Technologies (licencja Community) oraz javac z OpenJDK."; -"web_about_licenses" = "Teksty licencji"; -"web_live_run" = "Uruchom"; -"web_live_run_title" = "Uruchom program: wyjście i wejście pojawią się poniżej"; -"web_live_run_finished" = "Program zakończony."; -"web_live_run_stopped" = "Zatrzymano."; -"web_console" = "Konsola"; -"web_console_hide" = "Ukryj konsolę"; -"web_console_resize" = "Zmień wysokość konsoli"; -"web_diagram_tools" = "Narzędzia diagramu"; -"web_files_title" = "Pliki"; -"web_files_show" = "Pokaż pliki"; -"web_files_hide" = "Ukryj pliki"; -"web_files_resize" = "Zmień szerokość plików"; -"web_files_new_folder" = "Nowy folder"; -"web_files_switch" = "Wybierz inny folder"; -"web_files_delete" = "Usuń"; -"web_files_in_browser" = "W pamięci tej przeglądarki"; -"web_files_save_hint_fmt" = "Zapis umieszcza program w %@."; -"web_files_empty" = "Nic jeszcze nie zapisano. Przy zapisie VisuStruct tworzy tu folder z dzisiejszą datą."; -"web_files_reconnect_hint" = "Po przeładowaniu przeglądarka ponownie pyta, czy VisuStruct może używać twojego folderu."; -"web_files_reconnect_fmt" = "Otwórz folder „%@”"; -"web_files_connect_hint" = "Wybierz folder jako obszar roboczy. VisuStruct tworzy w nim folder na każdy dzień oraz zapisuje diagram i kod."; -"web_files_connect" = "Wybierz folder"; -"web_files_browser_hint" = "Ta przeglądarka nie może otwierać folderów na urządzeniu (np. na iPadzie). Twoje pliki pozostają w pamięci tej przeglądarki."; -"web_files_browser" = "Zapisz w przeglądarce"; -"web_files_delete_confirm_fmt" = "Na pewno usunąć „%@”?"; -"web_files_folder_prompt" = "Nazwa nowego folderu:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Zapisano: %@"; -"web_files_create" = "Utwórz"; -"web_learn_ludwig_tip" = "Wskazówka Ludwiga"; -"web_game_title" = "Gra: Prawda czy fałsz?"; -"web_game_intro" = "Ludwig pokazuje wartości i warunek. Czy warunek jest prawdziwy (true), czy fałszywy (false)? Dziesięć rund, coraz trudniejszych."; -"web_game_start" = "Zacznij grę"; -"web_game_round_fmt" = "Runda %@ z %@"; -"web_game_score_fmt" = "Punkty: %@"; -"web_game_true" = "prawda (true)"; -"web_game_false" = "fałsz (false)"; -"web_game_right" = "Dobrze!"; -"web_game_wrong" = "Niestety źle. Tak to się liczy:"; -"web_game_next" = "Dalej"; -"web_game_finish" = "Wynik"; -"web_game_done_fmt" = "%@ z %@ dobrze."; -"web_game_perfect" = "Wszystko dobrze – Ludwig jest pod wrażeniem!"; -"web_game_good" = "Świetnie! Przejrzyj błędy i spróbuj jeszcze raz."; -"web_game_practice" = "Trening czyni mistrza. Przeczytaj jeszcze raz tabelę prawdy i zagraj ponownie."; -"web_game_again" = "Zagraj ponownie"; -"web_game_wrong_short" = "Niestety źle."; -"web_game_practice_short" = "Praktyka czyni mistrza. Przeczytaj jeszcze raz wyjaśnienia i zagraj kolejną rundę."; -"web_game_clicks" = "Kliknięcia:"; -"web_game_nobody" = "Nikt nie słucha – nic się nie dzieje."; -"web_game_event_fmt" = "Kliknięcie „%@”: słuchacz to słyszy i wykonuje swój kod."; -"web_game_try" = "Teraz sam wypróbuj przyciski w oknie."; -"web_game_time_fmt" = "Zostało %@ s"; -"web_game_defused" = "✂️ Rozbrojona! Znalazłeś błąd."; -"web_game_boom_time" = "💥 Bum! Czas minął."; -"web_game_boom_wrong" = "💥 Bum! To była zła linia."; -"web_game_boom_part" = "💥 Bum! Dobra linia, ale błąd jest w innej części."; -"web_game_boom_wrong_part" = "💥 Bum! Błąd jest w innej linii."; -"web_game_bomb_parts_hint" = "Stuknij dokładnie w błędną część."; -"web_game_fix" = "Poprawna linia:"; -"web_game_order_hint" = "Stuknij kroki we właściwej kolejności."; -"web_debug_step" = "Krok"; -"web_debug_step_title" = "Krok: wykonaj jedną instrukcję i zatrzymaj się ponownie"; -"web_debug_continue" = "Dalej do następnego punktu przerwania"; -"web_debug_paused_fmt" = "Zatrzymano przed wierszem %d."; -"web_debug_gutter_title" = "Kliknij numer wiersza, aby ustawić lub usunąć punkt przerwania"; -"web_swap_to_code" = "Programowanie duże"; -"web_swap_to_editor" = "Diagram duży"; -"web_editor_resize" = "Zmień szerokość diagramu"; -"web_palette_resize" = "Zmień szerokość elementów"; -"web_palette_hide" = "Ukryj elementy"; -"web_palette_show" = "Pokaż elementy"; -"web_code_scopes" = "Kolorowe bloki kodu"; -"web_code_scopes_hint" = "Klasa, metoda, pętla, rozgałęzienie we własnych ramkach"; -"web_pseudocode" = "Pseudokod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Zmień nazwę zmiennej …"; -"web_rename_title" = "Zmień nazwę zmiennej"; -"web_rename_old" = "Nazwa"; -"web_rename_new" = "Nowa nazwa"; -"web_rename_hint" = "Zmienia każde miejsce o dokładnie tej pisowni (liczba to nie Liczba), w kodzie i w strukturogramie. Tekst w \"…\" i komentarze zostają."; -"web_rename_count_fmt" = "Występuje %d razy."; -"web_rename_exists_fmt" = "„%@” już istnieje: potem obie byłyby jedną zmienną."; -"web_rename_invalid" = "Nazwa zaczyna się od litery i zawiera tylko litery, cyfry i _."; -"web_rename_keyword_fmt" = "„%@” to słowo kluczowe Javy."; -"web_rename_apply" = "Zmień nazwę"; -"web_rename_cancel" = "Anuluj"; diff --git a/web/src/i18n/pt-PT.strings b/web/src/i18n/pt-PT.strings deleted file mode 100644 index 14917714..00000000 --- a/web/src/i18n/pt-PT.strings +++ /dev/null @@ -1,798 +0,0 @@ -/* Textos que só existem na versão web. Tudo o resto vem dos Localizable.strings da app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagrama estruturado VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exportar…"; -"web_export_title" = "Guardar como imagem ou PDF, ou imprimir"; -"web_export_png" = "Imagem (PNG)"; -"web_export_svg" = "Gráfico vetorial (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Ficheiro VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Falha na exportação: %@"; -"web_print_hint" = "Use “Exportar… → PDF” para guardar o diagrama e imprimi-lo a partir daí."; -"web_delete" = "Eliminar"; -"web_language_title" = "Idioma da interface"; -"web_simulation_start" = "Iniciar simulação"; -"web_simulation_end" = "Terminar simulação"; -"web_simulation_start_title" = "Executar o diagrama passo a passo"; -"web_simulation_end_title" = "Terminar a simulação e continuar a editar"; -"web_palette_hint" = "Arrastar para o diagrama"; -"web_tabs_label" = "Diagramas"; -"web_status_modified" = "alterado"; -"web_inspector_title" = "Inspetor de objetos"; -"web_inspector_help_drop" = "Arraste elementos da paleta para um bloco: em cima = antes, em baixo = depois, sobre “ø” = substituir. Os elementos existentes podem ser movidos com o rato."; -"web_inspector_help_inline" = "Faça duplo clique ou toque duplo num elemento para editar o texto diretamente no diagrama (Enter aplica, Esc cancela). Os nomes dos casos também."; -"web_inspector_help_files" = "Também pode largar ficheiros na janela."; -"web_case_name" = "Nome do caso"; -"web_case_name_placeholder" = "p. ex. 1, ok, default"; -"web_copied" = "Elemento copiado."; -"web_discard_message_fmt" = "As alterações a “%@” serão perdidas."; -"web_err_unreadable_fmt" = "“%@” não é um ficheiro VisuStruct legível (%@)."; -"web_saved_fmt" = "“%@” guardado."; -"web_saved_txt_fmt" = "Guardado como “%@”. Remova a extensão .txt para o utilizar."; -"web_drop_impossible" = "Não é possível largar aqui"; -"web_sim_delay" = "Pausa por passo"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Linguagem"; -"web_codegen_comments" = "Texto do diagrama como comentários"; -"web_codegen_empty_else" = "Gerar ramo else vazio no código"; -"web_copied_check" = "Copiado ✓"; -"web_copy_manual" = "Selecionado, prima Ctrl+C para copiar"; -"web_run_stopped_loop" = "Execução interrompida: possível ciclo infinito."; -"web_run_cancelled" = "Execução cancelada."; -"web_run_error" = "Erro durante a execução."; -"web_run_dropped_fmt" = "… %d linhas anteriores ocultas"; -"web_learn_title" = "Aprender"; -"web_learn_hide" = "Recolher a área de aprendizagem"; -"web_learn_show" = "Expandir a área de aprendizagem: lições, exercícios e consulta"; -"web_learn_lessons" = "Lições"; -"web_learn_tasks" = "Exercícios"; -"web_learn_reference" = "Consulta"; -"web_learn_intro" = "Aprende passo a passo, com exercícios. O teu progresso fica guardado neste navegador."; -"web_learn_tasks_intro" = "Pequenos projetos sem instruções. Cada um indica a lição que deves terminar primeiro."; -"web_learn_step_of_fmt" = "Passo %d de %d"; -"web_learn_lesson_fmt" = "Lição %d"; -"web_learn_all_lessons" = "Todas as lições"; -"web_learn_all_tasks" = "Todos os exercícios"; -"web_learn_back" = "Voltar"; -"web_learn_next" = "Seguinte"; -"web_learn_finish" = "Terminar a lição"; -"web_learn_done" = "Concluída"; -"web_learn_after_fmt" = "Depois da lição %d: %@"; -"web_learn_level_fmt" = "Dificuldade %d de 3"; -"web_learn_exercise" = "Exercício"; -"web_learn_brag" = "Curiosidades com o Ludwig"; -"web_learn_solved" = "resolvido"; -"web_learn_open_exercise" = "Abrir no editor"; -"web_learn_solve_in_editor" = "Resolve este exercício na área %@."; -"web_learn_solve_in_code" = "Resolve este exercício na área %@."; -"web_learn_solve_in_both" = "Resolve este exercício nas áreas %1$@ e %2$@."; -"web_learn_open_in_editor" = "Abrir no editor"; -"web_learn_replay" = "Repetir animação"; -"web_learn_graphic_labels" = "👆 Clica na imagem para mostrar ou esconder as legendas"; -"web_learn_check" = "Verificar"; -"web_learn_hint" = "Dica"; -"web_learn_reset" = "Recomeçar"; -"web_learn_reset_confirm" = "Queres mesmo recomeçar?"; -"web_learn_solution" = "Mostrar a solução"; -"web_learn_hint_more" = "Outra dica"; -"web_learn_hint_fmt" = "Dica %d de %d"; -"web_learn_teacher" = "Para professores"; -"web_learn_teacher_intro" = "O código de professor mostra as soluções de todos os exercícios. O navegador memoriza-o."; -"web_learn_teacher_code" = "Código de professor"; -"web_learn_teacher_unlock" = "Desbloquear"; -"web_learn_teacher_wrong" = "O código não está correto."; -"web_learn_teacher_on" = "O modo de professor está ativo: as soluções de todos os exercícios estão visíveis."; -"web_learn_teacher_off" = "Sair do modo de professor"; -"web_learn_open_first" = "Abre primeiro o exercício no editor e constrói lá o teu estrutograma."; -"web_learn_empty" = "O teu estrutograma ainda está vazio. Arrasta primeiro elementos da área «Elementos» para ele."; -"web_learn_passed" = "Muito bem! O teu estrutograma faz exatamente o que deve."; -"web_learn_failed" = "Ainda não está bem. Compara a saída esperada com a tua:"; -"web_learn_missing_fmt" = "O teu estrutograma ainda precisa de: %@"; -"web_learn_input_fmt" = "Entrada: %@"; -"web_learn_no_input" = "Sem entrada"; -"web_learn_expected" = "Esperado"; -"web_learn_actual" = "A tua saída"; -"web_learn_missing_input" = "O teu estrutograma pede mais entradas do que o previsto."; -"web_learn_unused_input" = "O teu estrutograma não pede todas as entradas."; -"web_learn_missing_line_break" = "Quase! Só falta uma quebra de linha. System.out.print continua a escrever na mesma linha, System.out.println começa depois uma linha nova."; -"web_learn_too_many_steps" = "Parado após 100 000 passos. Há um ciclo que nunca termina?"; -"web_learn_score_fmt" = "%d de %d certas"; -"web_learn_cloze_hint" = "Escreve as palavras que faltam nos espaços e carrega em “Verificar”."; -"web_learn_cloze_score_fmt" = "%d de %d espaços certos"; -"web_learn_cloze_all_right" = "Todos os espaços certos!"; -"web_learn_cloze_solution" = "Mostrar solução"; -"web_learn_cloze_again" = "De novo"; -"web_learn_pap_hint" = "Toca num elemento à direita e depois no seu lugar no fluxograma. Também o podes arrastar. Tocar num lugar ocupado devolve o elemento."; -"web_learn_pap_score_fmt" = "%d de %d elementos certos"; -"web_learn_pap_all_right" = "Tudo certo! O teu fluxograma está pronto."; -"web_learn_pap_missing_fmt" = "Ainda faltam %d elementos."; -"web_learn_pap_empty" = "Lugar vazio"; -"web_learn_pap_yes" = "sim"; -"web_learn_pap_no" = "não"; -"web_learn_pap_legend_oval" = "Início ou fim"; -"web_learn_pap_legend_rect" = "Instrução"; -"web_learn_pap_legend_diamond" = "Decisão: pergunta com sim e não"; -"web_learn_pap_legend_para" = "Entrada ou saída"; -"web_learn_review" = "Rever"; -"web_learn_terms" = "Termos técnicos"; -"web_inspector_resize" = "Alterar a altura do inspetor de objetos: arrastar ou deslizar a linha para cima ou para baixo (duplo clique: padrão)"; -"web_learn_resize" = "Alterar a largura da área de aprendizagem (duplo clique: repor)"; -"web_learn_competences_intro" = "No fim desta lição consigo …"; -"web_learn_rating_sun" = "consigo com segurança"; -"web_learn_rating_cloud" = "em parte"; -"web_learn_rating_umbrella" = "ainda não"; -"web_learn_review_title" = "A tua lista de verificação em comparação"; -"web_learn_review_hint" = "Aqui a tua autoavaliação e o teste não coincidem. Lê o passo outra vez e volta a avaliar-te na lista de verificação."; -"web_learn_review_match" = "A tua autoavaliação corresponde ao teu teste. Muito bem!"; -"web_learn_review_overrated_fmt" = "Escolheste ☀️, mas a pergunta %@ estava errada."; -"web_learn_review_underrated" = "Todas as perguntas sobre isto estavam certas. Sabes mais do que pensas!"; -"web_learn_review_unrated" = "ainda não avaliado"; -"web_learn_back_to_checklist" = "Voltar à lista de verificação"; -"web_learn_step_fmt" = "Passo %d: %@"; -"web_sim_call_arguments_fmt" = "A chamada não corresponde ao cabeçalho de %@. Verifica os valores entre parênteses."; -"web_sim_missing_return_fmt" = "%@ terminou sem devolver um valor com return."; -"web_sim_file_not_found_fmt" = "Não existe nenhum ficheiro chamado %@."; -"web_sim_end_of_file_fmt" = "O ficheiro %@ não tem mais linhas."; -"web_sim_null_value_fmt" = "%@ é null."; -"web_sim_unknown_variable_case_fmt" = "Variável desconhecida: %1$@. O Java distingue maiúsculas de minúsculas: querias dizer %2$@?"; -"web_sim_written_file_fmt" = "%@ (guardado)"; -"web_site_home" = "Página inicial"; -"web_site_imprint" = "Contacto"; -"web_site_privacy" = "Privacidade"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Código"; -"web_live_hide" = "Ocultar código"; -"web_scale_canvas" = "Tamanho do texto: estrutograma"; -"web_scale_code" = "Tamanho do texto: Código"; -"web_live_indent" = "Indentar"; -"web_live_indent_title" = "Indentar e formatar o código: cada } na sua própria linha, espaços à volta dos operadores, quatro espaços por nível (linhas selecionadas, senão tudo)"; -"web_live_show" = "Mostrar código"; -"web_live_resize" = "Alterar a largura da área de código (duplo clique: repor)"; -"web_live_hint" = "O código cresce com o teu diagrama. Cinzento = marcador: escreve no inspetor de objetos e o teu texto aparece aí. Clica numa linha para selecionar o elemento."; -"web_live_ph_selector" = "variável"; -"web_live_ph_code" = "O teu código"; -"web_live_ph_end" = "fim"; -"web_live_language" = "Linguagem de programação"; -"web_live_java_class" = "Como classe"; -"web_live_java_class_hint" = "Nome da classe = título do diagrama"; -"web_live_java_main" = "Com método main"; -"web_settings_display" = "Apresentação"; -"web_live_swing" = "Java verdadeiro (com Swing)"; -"web_live_swing_hint" = "Java verdadeiro com janelas (CheerpJ). Descarrega cerca de 40 MB uma vez, na primeira execução."; -"web_live_swing_windows" = "Janelas Java"; -"web_live_swing_hide" = "Fechar janelas Java"; -"web_live_swing_loading" = "A carregar o Java (cerca de 40 MB na primeira vez) …"; -"web_live_swing_compiling" = "A compilar …"; -"web_live_swing_running" = "O programa está a correr."; -"web_live_swing_compile_failed" = "Erro de compilação, vê acima."; -"web_live_swing_failed" = "Não foi possível carregar o Java. Verifica a ligação à internet."; -"web_live_hint_edit" = "Escreve aqui código Java e o diagrama constrói-se sozinho. Ou trabalha no diagrama e o código cresce com ele. Cinzento = marcador, basta escrever por cima."; -"web_live_edit_label" = "Código Java"; -"web_parse_line_fmt" = "Linha %d: %@"; -"web_parse_missing" = "Ainda falta aqui: %@"; -"web_parse_extra" = "Está a mais: %@"; -"web_parse_unclosed_string" = "Falta aqui o %@ de fecho."; -"web_parse_else_without_if" = "Este “else” não tem um “if” correspondente."; -"web_parse_case_outside_switch" = "“case” e “default” pertencem a um “switch”."; -"web_parse_missing_do_while" = "Depois de “do { … }” ainda falta “while (condição);”."; -"web_parse_more_methods" = "Por agora só conta um método aqui. Cria outros subprogramas em separadores próprios."; -"web_parse_missing_import" = "Falta %@ mesmo no início. Sem esta linha, o Java não conhece o Scanner."; -"web_parse_missing_scanner" = "Falta antes %@ Sem esta linha, o Scanner não existe."; -"web_parse_unknown_type" = "O Java não conhece este tipo de dados. Querias dizer %@?"; -"web_quickfix_insert_fmt" = "Sugestão: inserir %@"; -"web_quickfix_replace_fmt" = "Sugestão: %1$@ em vez de %2$@"; -"web_parse_wrong_case" = "O Java distingue maiúsculas de minúsculas. O correto é %@."; -"web_editor_title" = "Diagrama"; -"web_editor_show" = "Mostrar diagrama"; -"web_editor_hide" = "Ocultar diagrama"; -"web_keywords_title" = "Palavras-chave do código"; -"web_keywords_hint" = "if, while, for em vez de Decisão, Ciclo …"; -"web_palette_compact" = "Elementos sempre compactos"; -"web_palette_compact_hint" = "Símbolo com o nome pequeno por baixo; caso contrário, só com a coluna estreita"; -"web_about_version_fmt" = "Versão %@"; -"web_about_software" = "Software utilizado"; -"web_about_software_text" = "O editor de código usa o CodeMirror e o Lezer (licença MIT). Com o suporte para Swing, o VisuStruct carrega o CheerpJ da Leaning Technologies (licença Community) e o javac do OpenJDK."; -"web_about_licenses" = "Textos das licenças"; -"web_live_run" = "Executar"; -"web_live_run_title" = "Executar o programa: as saídas e entradas aparecem em baixo"; -"web_live_run_finished" = "Programa terminado."; -"web_live_run_stopped" = "Parado."; -"web_console" = "Consola"; -"web_console_hide" = "Ocultar consola"; -"web_console_resize" = "Alterar a altura da consola"; -"web_diagram_tools" = "Ferramentas do diagrama"; -"web_files_title" = "Ficheiros"; -"web_files_show" = "Mostrar ficheiros"; -"web_files_hide" = "Ocultar ficheiros"; -"web_files_resize" = "Alterar a largura dos ficheiros"; -"web_files_new_folder" = "Nova pasta"; -"web_files_switch" = "Escolher outra pasta"; -"web_files_delete" = "Eliminar"; -"web_files_in_browser" = "No armazenamento deste navegador"; -"web_files_save_hint_fmt" = "Guardar coloca o programa em %@."; -"web_files_empty" = "Ainda nada guardado. Ao guardar, o VisuStruct cria aqui uma pasta com a data de hoje."; -"web_files_reconnect_hint" = "Depois de recarregar, o navegador pergunta outra vez se o VisuStruct pode usar a tua pasta."; -"web_files_reconnect_fmt" = "Abrir a pasta “%@”"; -"web_files_connect_hint" = "Escolhe uma pasta como área de trabalho, de preferência uma pasta nova “VisuStruct-Ficheiros” nos teus Documentos. O VisuStruct cria lá uma pasta para cada dia e guarda o diagrama e o código."; -"web_files_connect" = "Escolher pasta"; -"web_files_browser_hint" = "Este navegador não consegue abrir pastas no dispositivo (por exemplo no iPad). Os teus ficheiros ficam no armazenamento deste navegador."; -"web_files_browser" = "Guardar no navegador"; -"web_files_delete_confirm_fmt" = "Eliminar mesmo “%@”?"; -"web_files_folder_prompt" = "Nome da nova pasta:"; -"web_files_default_name" = "Programa"; -"web_files_saved_fmt" = "Guardado: %@"; -"web_files_create" = "Criar"; -"web_learn_ludwig_tip" = "Dica do Ludwig"; -"web_game_title" = "Jogo: Verdadeiro ou falso?"; -"web_game_intro" = "O Ludwig mostra-te valores e uma condição. A condição é verdadeira (true) ou falsa (false)? Dez rondas, cada vez mais difíceis."; -"web_game_start" = "Começar o jogo"; -"web_game_round_fmt" = "Ronda %@ de %@"; -"web_game_score_fmt" = "Pontos: %@"; -"web_game_true" = "verdadeiro (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "Certo!"; -"web_game_wrong" = "Não exatamente. É assim que se calcula:"; -"web_game_next" = "Seguinte"; -"web_game_finish" = "Resultado"; -"web_game_done_fmt" = "%@ de %@ certas."; -"web_game_perfect" = "Tudo certo – o Ludwig está mesmo impressionado!"; -"web_game_good" = "Muito bem! Revê os teus erros e tenta outra vez."; -"web_game_practice" = "A prática faz o mestre. Lê outra vez a tabela de verdade acima e joga mais uma ronda."; -"web_game_again" = "Jogar outra vez"; -"web_game_wrong_short" = "Infelizmente errado."; -"web_game_practice_short" = "A prática leva à perfeição. Lê outra vez as explicações e joga mais uma ronda."; -"web_game_clicks" = "Cliques:"; -"web_game_nobody" = "Ninguém está a ouvir – não acontece nada."; -"web_game_event_fmt" = "Clique em “%@”: o ouvinte ouve e executa o seu código."; -"web_game_try" = "Agora experimenta tu os botões da janela."; -"web_game_time_fmt" = "Faltam %@ s"; -"web_game_defused" = "✂️ Desativada! Encontraste o erro."; -"web_game_boom_time" = "💥 Bum! O tempo acabou."; -"web_game_boom_wrong" = "💥 Bum! Era a linha errada."; -"web_game_boom_part" = "💥 Bum! A linha está certa, mas o erro está noutra parte dela."; -"web_game_boom_wrong_part" = "💥 Bum! O erro está noutra linha."; -"web_game_bomb_parts_hint" = "Toca exatamente na parte errada."; -"web_game_fix" = "A linha correta:"; -"web_game_order_hint" = "Toca nos passos pela ordem certa."; -"web_debug_step" = "Passo a passo"; -"web_debug_step_title" = "Passo a passo: executar uma instrução e parar outra vez"; -"web_debug_continue" = "Continuar até ao próximo ponto de paragem"; -"web_debug_paused_fmt" = "Parado antes da linha %d."; -"web_debug_gutter_title" = "Clica num número de linha para pôr ou tirar um ponto de paragem"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Disco de César"; -"web_learn_caesar_hint" = "Roda o disco interior ou toca em −1 e +1. Por fora está o texto simples, por dentro o texto cifrado."; -"web_learn_caesar_key_fmt" = "Chave %d"; -"web_learn_caesar_plain" = "Texto simples"; -"web_learn_caesar_secret" = "Texto cifrado"; -"web_learn_caesar_encrypt" = "Cifrar"; -"web_learn_caesar_decrypt" = "Decifrar"; -"web_learn_caesar_back" = "Rodar o disco uma letra para trás"; -"web_learn_caesar_forward" = "Rodar o disco uma letra para a frente"; -"web_learn_rescue_station_fmt" = "Estação %@ de %@: %@"; -"web_learn_rescue_number" = "O teu número"; -"web_learn_rescue_not_number" = "Escreve um número inteiro."; -"web_learn_rescue_wrong" = "Ainda não. Lê o código outra vez, carácter a carácter."; -"web_learn_rescue_letter_moved" = "A letra vai para as palavras cruzadas."; -"web_learn_rescue_alphabet" = "O teu número transforma-se numa letra:"; -"web_learn_rescue_to_crossword" = "Para as palavras cruzadas"; -"web_learn_rescue_crossword" = "As palavras cruzadas"; -"web_learn_rescue_across" = "→ Horizontais"; -"web_learn_rescue_down" = "↓ Verticais"; -"web_learn_rescue_cell_fmt" = "Quadrado linha %@, coluna %@"; -"web_learn_rescue_keyword" = "Palavra secreta:"; -"web_learn_rescue_cw_wrong" = "Os quadrados marcados a vermelho ainda não estão certos."; -"web_learn_rescue_cw_done" = "Resolvido! Os quadrados amarelos formam a palavra secreta."; -"web_learn_rescue_to_gate" = "Para o portão"; -"web_learn_rescue_gate" = "O portão"; -"web_learn_rescue_word" = "Palavra secreta"; -"web_learn_rescue_open" = "Abrir o portão"; -"web_learn_rescue_gate_case" = "Quase! O equals distingue maiúsculas de minúsculas. Escreve a palavra exatamente como nas palavras cruzadas."; -"web_learn_rescue_gate_wrong" = "O portão continua fechado. Olha outra vez para os quadrados amarelos."; -"web_learn_rescue_freed" = "🎉 O portão está aberto!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "Com o que queres trabalhar?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: estrutogramas e Java com o curso completo. Podes mudar a qualquer momento na roda dentada."; -"web_visubot_world_visubot_hint" = "VisuBot: programar o robô mBot2, com lições e tarefas próprias. Podes mudar a qualquer momento na roda dentada."; -"web_visubot_connect" = "Ligar o mBot2 real"; -"web_visubot_upload_button" = "Transferir"; -"web_visubot_blocks" = "Blocos"; -"web_visubot_blocks_title" = "Mostrar o diagrama como blocos"; -"web_visubot_blocks_back" = "Diagrama"; -"web_visubot_blocks_back_title" = "Voltar ao diagrama"; -"web_visubot_blocks_start" = "Quando o programa começa"; -"web_visubot_blocks_empty" = "Aqui vai um bloco"; -"web_visubot_blocks_hint" = "O mesmo programa em blocos. Arrasta blocos de “Elementos”, muda-os de lugar ou deita-os no lixo. Clica num número ou texto nos campos brancos para o alterar no próprio bloco; o resto altera-se em baixo, no Inspetor de objetos. Arrasta os sensores para uma condição ou mesmo para o campo que devem substituir. Arrasta operadores e variáveis da mesma forma para um campo ou uma condição."; -"web_visubot_blocks_trash" = "Lixo"; -"web_visubot_blocks_count" = "contar com"; -"web_visubot_blocks_count_from" = "de"; -"web_visubot_blocks_count_below" = "até abaixo de"; -"web_visubot_blocks_count_to" = "até"; -"web_visubot_blocks_count_above" = "até acima de"; -"web_visubot_blocks_count_step" = "em passos de"; -"web_visubot_blocks_repeat" = "repetir"; -"web_visubot_blocks_if" = "se"; -"web_visubot_blocks_else" = "senão"; -"web_visubot_blocks_while" = "enquanto"; -"web_visubot_blocks_endless" = "repetir sempre"; -"web_visubot_blocks_do" = "faz"; -"web_visubot_blocks_not" = "não"; -"web_visubot_blocks_and" = "e"; -"web_visubot_blocks_or" = "ou"; -"web_visubot_blocks_break" = "sair do ciclo"; -"web_visubot_blocks_repeat_times" = "vezes"; -"web_visubot_blocks_random_from" = "número aleatório de"; -"web_visubot_blocks_random_to" = "a"; -"web_visubot_operators" = "Operadores"; -"web_visubot_variables" = "Variáveis"; -"web_visubot_control" = "Controlo"; -"web_visubot_el_repeat" = "repetir 10 vezes"; -"web_visubot_upload_title" = "Transferir o programa para o mBot2"; -"web_visubot_upload_step1" = "Liga o mBot2 com o cabo USB e acende-o. Só funciona no Chrome ou no Edge."; -"web_visubot_upload_step2" = "Clica em “Transferir agora” e escolhe “USB Serial”. O mBot2 guarda o teu programa e reinicia."; -"web_visubot_upload_step3" = "Desliga o cabo e põe o mBot2 na partida. Quando carregas no botão A, o programa arranca. Fica guardado, mesmo depois de desligar."; -"web_visubot_upload_start" = "Transferir agora"; -"web_visubot_upload_busy" = "A transferir … não desligues o cabo."; -"web_visubot_upload_done" = "Pronto! Desliga o cabo, põe o mBot2 na partida e carrega no botão A."; -"web_visubot_upload_failed" = "A transferência não funcionou. Reinicia o mBot2 e tenta outra vez."; -"web_visubot_upload_label" = "A = Início"; -"web_visubot_upload_error_input" = "O teu programa pede uma entrada. O mBot2 não tem teclado, por isso não funciona."; -"web_visubot_upload_error_files" = "O teu programa trabalha com ficheiros. Isso não funciona no mBot2."; -"web_visubot_upload_error_empty" = "O teu programa ainda está vazio."; -"web_visubot_disconnect" = "Desligar"; -"web_visubot_connecting" = "A ligar … (o CyberPi reinicia brevemente)"; -"web_visubot_connected" = "O mBot2 real conduz também"; -"web_visubot_no_serial" = "mBot2 real: só no Chrome ou Edge num computador."; -"web_visubot_link_error" = "Ligação perdida"; -"web_visubot_world" = "Mundo VisuBot"; -"web_visubot_no_3d" = "A vista 3D não consegue arrancar neste navegador."; -"web_visubot_distance" = "Distância"; -"web_visubot_line" = "Linha"; -"web_visubot_bumps" = "bateu na parede"; -"web_visubot_el_forward" = "andar para a frente"; -"web_visubot_el_backward" = "andar para trás"; -"web_visubot_el_right" = "rodar à direita"; -"web_visubot_el_left" = "rodar à esquerda"; -"web_visubot_el_led" = "LEDs ligados"; -"web_visubot_el_tone" = "tocar um som"; -"web_visubot_drive" = "Percurso"; -"web_visubot_depth_fmt" = "Os ciclos têm de estar encaixados %d vezes."; -"web_visubot_tap_part" = "Roda o mBot2 com o rato ou o dedo. Toca numa peça para ver o nome."; -"web_visubot_quiz_right" = "Certo!"; -"web_visubot_quiz_wrong_fmt" = "Isso é: %@. Tenta outra vez."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Ecrã"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Botões A, B e Home"; -"web_visubot_part_leds" = "LEDs RGB"; -"web_visubot_part_lightSensor" = "Sensor de luz"; -"web_visubot_part_microphone" = "Microfone"; -"web_visubot_part_shield" = "Shield do mBot2 com bateria"; -"web_visubot_part_powerSwitch" = "Interruptor"; -"web_visubot_part_motors" = "Motores com encoder"; -"web_visubot_part_wheels" = "Rodas"; -"web_visubot_part_ultrasonic" = "Sensor ultrassónico"; -"web_visubot_part_lineSensor" = "Sensor de linha (quad RGB)"; -"web_visubot_part_caster" = "Roda livre"; -"web_visubot_part_chassis" = "Chassi"; -"web_visubot_world_fmt" = "Mundo %d"; -"web_visubot_goal_reached" = "Objetivo alcançado"; -"web_visubot_goal_missed" = "Objetivo não alcançado"; -"web_visubot_commands" = "Comandos do mBot2"; -"web_visubot_sensors" = "Sensores do mBot2"; -"web_visubot_sensor_distance" = "Distância"; -"web_visubot_sensor_line" = "Linha"; -"web_visubot_el_led_off" = "LEDs desligados"; -"web_visubot_el_led_color" = "cor do LED"; -"web_visubot_el_wait" = "esperar um pouco"; -"web_visubot_el_emotion" = "mostrar um sentimento"; -"web_visubot_el_text" = "mostrar texto"; -"web_visubot_sensor_color" = "A cor é vermelha?"; -"web_visubot_sensor_button_a" = "Botão A premido?"; -"web_visubot_sensor_button_b" = "Botão B premido?"; -"web_visubot_sensor_joy_up" = "Joystick para cima?"; -"web_visubot_sensor_joy_down" = "Joystick para baixo?"; -"web_visubot_sensor_joy_left" = "Joystick para a esquerda?"; -"web_visubot_sensor_joy_right" = "Joystick para a direita?"; -"web_visubot_sensor_brightness" = "Luminosidade"; -"web_visubot_sensor_loudness" = "Volume do som"; -"web_visubot_sensor_pitch" = "Inclinação frente/trás"; -"web_visubot_sensor_roll" = "Inclinação lateral"; -"web_visubot_sensor_shake" = "Abanado?"; -"web_visubot_el_drive" = "rodas separadas"; -"web_visubot_el_stop" = "parar"; -"web_visubot_el_timer" = "cronómetro a 0"; -"web_visubot_sensor_line_left" = "Linha à esquerda?"; -"web_visubot_sensor_line_right" = "Linha à direita?"; -"web_visubot_sensor_timer" = "Cronómetro (s)"; -"web_visubot_sensor_battery" = "Bateria (%)"; -"web_visubot_actions" = "Comandos"; -"web_visubot_led_on" = "LEDs ligados"; -"web_visubot_led_off" = "LEDs desligados"; -"web_visubot_tone_yes" = "som"; -"web_visubot_tone_no" = "sem som"; -"web_visubot_controls" = "Experimentar os sensores"; -"web_visubot_controls_hint" = "Sem um mBot2 real: define aqui o que os sensores medem. Botões, joystick e abanar duram um segundo."; -"web_visubot_shake" = "abanar"; -"web_visubot_check" = "Testar o mBot2"; -"web_visubot_check_hint" = "Experimenta cada atuador uma vez. Os valores dos sensores atualizam-se em direto: põe a mão à frente do sensor ultrassónico, carrega nos botões, inclina ou abana o mBot2. Levanta-o para testar as rodas."; -"web_visubot_check_forward" = "Rodas 1 s para a frente"; -"web_visubot_check_spin" = "Rodar no lugar 1 s"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Onde guardas o teu trabalho?"; -"web_learn_start_hint" = "O teu progresso e os teus programas ficam numa pasta no teu dispositivo. O progresso fica no ficheiro learnProgress.json."; -"web_learn_start_continue_fmt" = "Continuar com “%@”"; -"web_learn_start_open" = "Abrir pasta existente"; -"web_learn_start_create_fmt" = "Criar nova pasta “%@”"; -"web_learn_start_create_hint" = "Depois escolhes onde fica, por exemplo em “Documentos”."; -"web_learn_start_folder" = "VisuStruct-Ficheiros"; -"web_learn_start_without" = "Continuar sem pasta"; -"web_learn_start_without_hint" = "Assim o teu progresso perde-se ao fechar a página."; -"web_visubot_preview_title" = "mBot2 ao vivo"; -"web_visubot_preview_hint" = "Mostra logo para onde o teu programa leva o mBot2."; -"web_visubot_preview_sim_title" = "Simulação"; -"web_visubot_preview_sim_hint" = "O mBot2 anda aqui enquanto a simulação corre."; -"web_visubot_world_in_preview" = "O mBot2 anda na janela «Simulação»."; -"web_visubot_preview_play" = "Reproduzir o percurso"; -"web_visubot_preview_stop" = "Parar"; -"web_visubot_preview_hide" = "Recolher mBot2 ao vivo"; -"web_visubot_preview_show" = "Mostrar mBot2 ao vivo"; -"web_visubot_preview_resize" = "Alterar o tamanho de mBot2 ao vivo"; -"web_visubot_preview_stack" = "Por baixo do código na área Código"; -"web_visubot_preview_side" = "Como coluna própria"; -"web_visubot_preview_distance_fmt" = "Percurso: %d cm"; -"web_visubot_preview_input" = "precisa de uma entrada, inicia a simulação para isso"; -"web_visubot_preview_limit" = "demora muito (ciclo infinito?), mostra-se o início"; -"web_visubot_group_drive" = "Andar e rodar"; -"web_visubot_group_wheels" = "Rodas separadas"; -"web_visubot_group_leds" = "Luz"; -"web_visubot_group_sound" = "Som"; -"web_visubot_group_screen" = "Ecrã"; -"web_visubot_group_emotion" = "Emoções"; -"web_visubot_group_wait" = "Esperar e cronómetro"; -"web_visubot_group_distance" = "Distância"; -"web_visubot_group_line" = "Linha"; -"web_visubot_group_color" = "Cores"; -"web_visubot_group_buttons" = "Botões e joystick"; -"web_visubot_group_light" = "Luz e volume"; -"web_visubot_group_tilt" = "Inclinação e abanar"; -"web_visubot_group_timer" = "Cronómetro e bateria"; -"web_swap_to_code" = "Código grande, diagrama estreito"; -"web_swap_to_editor" = "Diagrama grande, código estreito"; -"web_editor_resize" = "Alterar a largura do diagrama"; -"web_palette_resize" = "Alterar a largura dos elementos (duplo clique: repor)"; -"web_palette_hide" = "Ocultar elementos"; -"web_palette_show" = "Mostrar elementos"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: programar classes em Java e vê-las ou desenhá-las como diagrama de classes (a partir do 12.º ano). Podes mudar a qualquer momento na roda dentada."; -"web_visuobject_subtitle" = "Diagrama de classes"; -"web_visuobject_code" = "Código Java"; -"web_visuobject_diagram" = "Diagrama de classes"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Nova interface no diagrama e no código"; -"web_visuobject_layout" = "Reorganizar"; -"web_visuobject_layout_tip" = "Organizar todas as classes automaticamente: superclasses em cima"; -"web_visuobject_add_field" = "novo atributo …"; -"web_visuobject_add_method" = "novo método …"; -"web_visuobject_delete_class" = "Apagar classe"; -"web_visuobject_new_class_name" = "NovaClasse"; -"web_visuobject_new_interface_name" = "NovaInterface"; -"web_visuobject_example" = "Exemplo"; -"web_visuobject_example_tip" = "Carregar o projeto de exemplo Zoo: Tier e Hund no package tiere, Besitzer em personen"; -"web_visuobject_new_tip" = "Novo: projeto vazio (Anular recupera o anterior)"; -"web_visuobject_empty" = "Ainda não há nenhuma classe. Clica em «+ Classe» à esquerda ou escreve, por exemplo, «public class Cao { }» num ficheiro."; -"web_visuobject_edit_hint" = "Duplo clique para alterar. Escreve como em UML: «- nome: String» ou «+ ladrar(): void». Deixar vazio apaga."; -"web_visuobject_member_label" = "Atributo ou método em notação UML"; -"web_visuobject_name_label" = "Nome da classe"; -"web_visuobject_bad_name" = "«%@» não é um nome válido ou já existe."; -"web_visuobject_bad_line" = "Não percebo «%@». Exemplo: - nome: String ou + ladrar(): void"; -"web_visuobject_open_failed" = "Não foi possível ler o ficheiro."; -"web_visuobject_field_ph" = "- nome: String"; -"web_visuobject_seq_diagram" = "Diagrama de sequência"; -"web_visuobject_seq_empty" = "O diagrama de sequência surge ao depurar: clica em “Depurar” em cima e percorre o programa passo a passo."; -"web_visuobject_seq_no_calls" = "Ainda não há chamadas dos teus métodos."; -"web_visuobject_seq_truncated" = "… encurtado: a partir daqui há chamadas demais."; -"web_visuobject_seq_hint" = "Cada seta é uma chamada de um dos teus métodos; a seta tracejada traz o valor de retorno. Clica numa seta para ver a linha no código."; -"web_visuobject_dbg" = "Depurar"; -"web_visuobject_dbg_tip" = "Executar o programa passo a passo. Ponto de paragem: clica no número da linha. O diagrama de objetos mostra os objetos na memória."; -"web_visuobject_dbg_continue" = "Continuar"; -"web_visuobject_dbg_continue_tip" = "Continuar até ao próximo ponto de paragem (F8)"; -"web_visuobject_dbg_pause" = "Pausa"; -"web_visuobject_dbg_pause_tip" = "Pausar o programa"; -"web_visuobject_dbg_over" = "Passo"; -"web_visuobject_dbg_over_tip" = "Próxima linha; os métodos correm até ao fim (F6)"; -"web_visuobject_dbg_into" = "Entrar"; -"web_visuobject_dbg_into_tip" = "Entrar no método chamado (F5)"; -"web_visuobject_dbg_out" = "Sair"; -"web_visuobject_dbg_out_tip" = "Terminar o método e voltar a quem o chamou (F7)"; -"web_visuobject_dbg_input" = "Entrada para o Scanner, depois Enter"; -"web_visuobject_dbg_running" = "Depurador: o programa está a correr …"; -"web_visuobject_dbg_waiting" = "Depurador: o programa espera pela tua entrada."; -"web_visuobject_dbg_paused_fmt" = "Depurador: parado em %1$@, linha %2$@"; -"web_visuobject_dbg_exception" = "O programa terminou com uma exceção."; -"web_visuobject_dbg_code_changed" = "Código alterado: depurador terminado."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Pilha de chamadas"; -"web_visuobject_dbg_vars" = "Variáveis"; -"web_visuobject_dbg_var_name" = "Nome"; -"web_visuobject_dbg_var_type" = "Tipo"; -"web_visuobject_dbg_no_vars" = "Sem variáveis"; -"web_visuobject_dbg_err_syntax" = "%1$@, linha %2$@: o depurador não entende isto (%3$@). ▶ Executar mostra a mensagem do Java."; -"web_visuobject_dbg_err_symbol" = "%1$@, linha %2$@: %3$@ é desconhecido."; -"web_visuobject_dbg_err_import" = "%1$@, linha %2$@: falta %3$@ mesmo no início. Sem esta linha, o Java não conhece a classe."; -"web_visuobject_dbg_err_typename" = "%1$@, linha %2$@: o Java não conhece este tipo de dados. Querias dizer %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, linha %2$@: o depurador ainda não consegue %3$@. ▶ Executar corre o programa em Java real."; -"web_visuobject_dbg_err_type" = "%1$@, linha %2$@: algo não encaixa aqui (%3$@)."; -"web_visuobject_obj_diagram" = "Diagrama de objetos"; -"web_visuobject_obj_new" = "Novo objeto da classe"; -"web_visuobject_obj_add" = "Objeto"; -"web_visuobject_obj_empty" = "Ainda sem objetos. Escolhe uma classe em cima e clica em “+ Objeto”."; -"web_visuobject_obj_no_classes" = "Cria primeiro uma classe (não abstrata) no diagrama de classes."; -"web_visuobject_obj_hint" = "Clica num objeto para mudar aqui o nome, a classe e os valores. Arrasta a pega até outro objeto para os ligar através de um atributo de referência."; -"web_visuobject_obj_live_hint" = "Ao vivo do depurador: é assim que os objetos estão agora na memória."; -"web_visuobject_obj_link" = "Arrastar até outro objeto: definir referência"; -"web_visuobject_obj_name" = "Nome"; -"web_visuobject_obj_class" = "Classe"; -"web_visuobject_obj_attribute" = "Atributo"; -"web_visuobject_obj_value" = "Valor"; -"web_visuobject_obj_delete" = "Apagar objeto"; -"web_visuobject_obj_bad_name" = "“%@” não é um nome válido para um objeto."; -"web_visuobject_obj_name_taken" = "Já existe um objeto “%@”."; -"web_visuobject_obj_no_ref" = "%1$@ não tem nenhum atributo que possa apontar para %2$@."; -"web_visuobject_tool_note" = "Nota"; -"web_visuobject_tool_note_tip" = "Nota: clica no diagrama de classes e escreve o texto. Arrasta a pega até uma classe para uma linha tracejada."; -"web_visuobject_note_ph" = "Nota …"; -"web_visuobject_note_text" = "Texto"; -"web_visuobject_note_attached" = "Ligada a"; -"web_visuobject_note_attach" = "Arrastar até uma classe: linha tracejada"; -"web_visuobject_note_delete" = "Apagar nota"; -"web_visuobject_run" = "Executar"; -"web_visuobject_run_tip" = "Executar o programa com Java verdadeiro: todas as classes são compiladas, é iniciada a classe com main (de preferência a aberta)."; -"web_visuobject_stop" = "Parar"; -"web_visuobject_stop_tip" = "Terminar o programa e fechar as suas janelas"; -"web_visuobject_stopped" = "Programa terminado."; -"web_visuobject_no_main" = "Nenhuma classe com public static void main(String[] args) encontrada."; -"web_visuobject_running_fmt" = "%@ está a correr …"; -"web_visuobject_console_clear" = "Limpar"; -"web_visuobject_section_fields" = "Atributos"; -"web_visuobject_section_refs" = "Atributos de referência"; -"web_visuobject_section_ctors" = "Construtor"; -"web_visuobject_section_methods" = "Métodos"; -"web_visuobject_insp_sections" = "Inserir comentários de secção"; -"web_visuobject_insp_sort" = "Ordenar por secções"; -"web_visuobject_insp_sections_tip" = "Escreve // Atributos, // Atributos de referência, // Construtor e // Métodos na classe e ordena tudo por baixo. O que for criado no diagrama de classes vai logo para o sítio certo."; -"web_visuobject_insp_doc" = "Descrição (Javadoc)"; -"web_visuobject_insp_doc_ph" = "Para que serve a classe? Fica no código como comentário Javadoc por cima da classe."; -"web_visuobject_insp_visibility" = "Visibilidade"; -"web_visuobject_insp_type" = "Tipo"; -"web_visuobject_insp_init" = "Valor inicial"; -"web_visuobject_insp_no_fields" = "Ainda sem atributos."; -"web_visuobject_insp_add_field" = "Atributo"; -"web_visuobject_insp_params" = "Parâmetros"; -"web_visuobject_insp_return" = "Tipo de retorno"; -"web_visuobject_insp_constructor" = "Construtor"; -"web_visuobject_insp_no_methods" = "Ainda sem métodos."; -"web_visuobject_insp_add_method" = "Método"; -"web_visuobject_insp_generate" = "Gerar:"; -"web_visuobject_insp_gen_constructor" = "Construtor a partir dos atributos"; -"web_visuobject_insp_gen_constructor_tip" = "Como no Eclipse “Generate Constructor using Fields”: um construtor que define todos os atributos (exceto static)."; -"web_visuobject_insp_gen_accessors" = "Getters e setters"; -"web_visuobject_insp_gen_accessors_tip" = "Como no Eclipse “Generate Getters and Setters”: get…/set… para cada atributo (atributos final só com getter)."; -"web_visuobject_insp_bad_params" = "Escreve os parâmetros assim: nome: Tipo, segundo: int (lido “%@”)."; -"web_visuobject_insp_fields" = "Atributos"; -"web_visuobject_insp_methods" = "Métodos"; -"web_visuobject_inspector_resize" = "Redimensionar: arrasta a fronteira entre o diagrama de classes e o inspetor para cima ou para baixo (duplo clique = padrão)"; -"web_visuobject_dep_title" = "Dependência «%@»"; -"web_visuobject_dep_create_text" = "%1$@ cria um objeto da classe %2$@ em %3$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ usa a classe %2$@ em %3$@."; -"web_visuobject_dep_hint" = "Isto não é uma associação: %@ não guarda o objeto %@ num atributo, ele só existe dentro do método. Por isso a linha é tracejada."; -"web_visuobject_dep_to_assoc" = "Guardar como atributo (associação a %@)"; -"web_visuobject_end_mult_ph" = "mult."; -"web_visuobject_end_tip" = "Clique (linha selecionada) ou clique direito: papel, multiplicidade e navegabilidade nesta extremidade"; -"web_visuobject_end_role_ph" = "p. ex. osMeusGatos"; -"web_visuobject_new_menu" = "Novo"; -"web_visuobject_new_menu_tip" = "Criar um novo projeto, source folder, package, classe ou interface"; -"web_visuobject_new_project" = "Projeto Java"; -"web_visuobject_new_folder" = "Source folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Classe"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "Novo projeto Java"; -"web_visuobject_new_project_hint" = "No workspace cada projeto tem uma pasta própria com src."; -"web_visuobject_new_folder_title" = "Novo source folder"; -"web_visuobject_new_folder_hint" = "Outra pasta para código ao lado de src, por exemplo test para classes de teste."; -"web_visuobject_new_package_title" = "Novo package"; -"web_visuobject_new_package_hint" = "Os nomes de package escrevem-se em minúsculas, partes com ponto: animais ou escola.secretaria."; -"web_visuobject_new_class_title" = "Nova classe Java"; -"web_visuobject_new_class_hint" = "Os nomes de classe começam com maiúscula, por exemplo Cao ou ContaBancaria."; -"web_visuobject_new_interface_title" = "Nova interface Java"; -"web_visuobject_new_interface_hint" = "Uma interface define métodos que as classes implementam depois."; -"web_visuobject_new_root" = "Source folder"; -"web_visuobject_new_name" = "Nome"; -"web_visuobject_new_modifiers" = "Modificadores"; -"web_visuobject_new_package_private" = "package (sem modificador)"; -"web_visuobject_new_superclass" = "Superclasse"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Estende interfaces (extends)"; -"web_visuobject_new_stubs" = "Que esqueletos de métodos criar?"; -"web_visuobject_new_stub_constructors" = "Construtores da superclasse"; -"web_visuobject_new_stub_inherited" = "Métodos abstratos herdados"; -"web_visuobject_new_comment_legend" = "Comentário"; -"web_visuobject_new_comment" = "Comentário Javadoc com @author"; -"web_visuobject_new_author" = "O teu nome"; -"web_visuobject_new_finish" = "Concluir"; -"web_visuobject_new_name_missing" = "Escreve um nome."; -"web_visuobject_new_exists" = "“%@” já existe no projeto."; -"web_visuobject_new_upper" = "Em Java, os nomes de classe começam com maiúscula."; -"web_visuobject_bad_folder" = "“%@” não é um nome de pasta válido ou já existe."; -"web_visuobject_inspector_hide" = "Recolher o inspetor de objetos"; -"web_visuobject_inspector_show" = "Expandir o inspetor de objetos"; -"web_visuobject_inspector_empty" = "Clica numa relação (linha) no diagrama para a editares aqui."; -"web_visuobject_rel_end_a" = "Extremidade A: %@ (a linha começa aqui)"; -"web_visuobject_rel_end_b" = "Extremidade B: %@ (a linha acaba aqui)"; -"web_visuobject_ws_title" = "Pasta do workspace no teu computador"; -"web_visuobject_ws_question" = "Onde guardas os teus projetos?"; -"web_visuobject_ws_hint" = "Como no Eclipse: uma pasta de workspace no teu computador, com uma pasta por projeto com src e os ficheiros .java."; -"web_visuobject_ws_create" = "Criar a pasta “%@”"; -"web_visuobject_ws_open" = "Abrir um workspace existente"; -"web_visuobject_ws_skip" = "Sem pasta (só no browser)"; -"web_visuobject_ws_choose" = "Escolher workspace"; -"web_visuobject_ws_reopen" = "Abrir o workspace “%@”"; -"web_visuobject_ws_switch" = "Mudar"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Descarregar o projeto como .zip, por exemplo para o entregar"; -"web_visuobject_ws_saved" = "Guardado em %@/%@"; -"web_visuobject_ws_created" = "Novo projeto “%@” no workspace"; -"web_visuobject_ws_failed" = "Não foi possível guardar no workspace: %@"; -"web_visuobject_ws_taken" = "O workspace já tem um projeto “%@”."; -"web_visuobject_ws_open_project" = "Abrir o projeto %@"; -"web_visuobject_save_ws_tip" = "Guardar no workspace (Ctrl+S)"; -"web_visuobject_unsaved" = "não guardado"; -"web_visuobject_rel_nav_navigable" = "navegável (seta)"; -"web_visuobject_rel_nav_non-navigable" = "não navegável (cruz ×)"; -"web_visuobject_rel_nav_unspecified" = "não especificado (aberto)"; -"web_visuobject_rel_reading_flip" = "inverter"; -"web_visuobject_rel_reading_auto" = "Com um nome, a relação lê-se no sentido em que arrastaste."; -"web_visuobject_tools" = "Ferramentas"; -"web_visuobject_tool_select" = "Seleção"; -"web_visuobject_tool_select_tip" = "Selecionar e mover"; -"web_visuobject_tool_class" = "Classe"; -"web_visuobject_tool_class_tip" = "Classe: arrasta para a área ou escolhe e clica na área"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: arrasta para a área ou escolhe e clica na área"; -"web_visuobject_tool_link" = "Associação"; -"web_visuobject_tool_link_tip" = "Associação sem navegação: desenha uma linha simples entre duas classes"; -"web_visuobject_rel_link" = "Associação (sem navegação)"; -"web_visuobject_tool_not_link" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_association" = "Dirigida"; -"web_visuobject_tool_association_tip" = "Associação dirigida: arrasta da classe que conhece a outra para a outra (seta)"; -"web_visuobject_tool_aggregation" = "Agregação"; -"web_visuobject_tool_aggregation_tip" = "Agregação: arrasta do todo para a parte (tem, as partes continuam a existir)"; -"web_visuobject_tool_composition" = "Composição"; -"web_visuobject_tool_composition_tip" = "Composição: arrasta do todo para a parte (é composto por, as partes pertencem-lhe)"; -"web_visuobject_tool_extends" = "Herança"; -"web_visuobject_tool_extends_tip" = "Herança: arrasta da subclasse para a superclasse (extends)"; -"web_visuobject_tool_implements" = "Realização"; -"web_visuobject_tool_implements_tip" = "Realização: arrasta da classe para a interface (implements)"; -"web_visuobject_tool_pick_second" = "Agora clica na segunda classe (a partir de %@). Esc cancela."; -"web_visuobject_tool_not_association" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_aggregation" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_composition" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_extends" = "%@ não pode herdar de %@: classes herdam de classes, interfaces de interfaces. Para uma interface usa a realização."; -"web_visuobject_tool_not_implements" = "%@ não pode implementar %@: só uma classe implementa uma interface."; -"web_visuobject_inspector" = "Inspetor de objetos"; -"web_visuobject_connect" = "Arrastar: relação com outra classe"; -"web_visuobject_rel_association" = "Associação"; -"web_visuobject_rel_directed" = "Associação dirigida"; -"web_visuobject_rel_aggregation" = "Agregação (tem, as partes continuam a existir)"; -"web_visuobject_rel_composition" = "Composição (é composto por, as partes pertencem-lhe)"; -"web_visuobject_rel_extends" = "Herança (extends)"; -"web_visuobject_rel_implements" = "Realização (implements)"; -"web_visuobject_rel_extends_text" = "%@ herda de %@ (extends no código)."; -"web_visuobject_rel_implements_text" = "%@ implementa a interface %@ (implements no código)."; -"web_visuobject_rel_kind" = "Tipo"; -"web_visuobject_rel_name" = "Nome da relação"; -"web_visuobject_rel_name_ph" = "por exemplo, possui"; -"web_visuobject_rel_reading" = "Sentido de leitura"; -"web_visuobject_rel_navigable" = "Navegabilidade"; -"web_visuobject_rel_role" = "Papel"; -"web_visuobject_rel_multiplicity" = "Multiplicidade"; -"web_visuobject_rel_role_field" = "= atributo %@.%@ no código"; -"web_visuobject_rel_role_only_uml" = "só no diagrama (sem atributo enquanto a seta só aponta num sentido)"; -"web_visuobject_rel_delete" = "Eliminar a relação"; -"web_visuobject_rel_impossible" = "Não há uma relação adequada de %@ para %@."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Arrastar para mudar a largura (duplo clique: padrão)"; -"web_visuobject_pane_show" = "Expandir a área"; -"web_visuobject_pane_hide" = "Recolher a área"; -"web_visuobject_close_tab" = "Fechar %@"; -"web_visuobject_collapse" = "Recolher"; -"web_visuobject_expand" = "Expandir"; -"web_visuobject_tree_empty" = "Ainda vazio. Cria um package ou uma classe com «+ Novo»."; -"web_visuobject_delete" = "Eliminar"; -"web_visuobject_default_package" = "(package predefinido)"; -"web_visuobject_bad_package" = "«%@» não é um nome de package válido ou já existe. Os nomes de package escrevem-se em minúsculas, por exemplo animais."; -"web_visuobject_new_package_name" = "novopackage"; -"web_visuobject_no_file" = "Nenhum ficheiro aberto"; -"web_visuobject_project_name" = "MeuProjeto"; -"web_visuobject_explorer_show" = "Mostrar o Package Explorer"; -"web_visuobject_explorer_hide" = "Recolher o Package Explorer"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Guardar o projeto como .zip: NomeDoProjeto/src/package/Classe.java"; -"web_visuobject_open_tip" = "Abrir um projeto (.zip como do Eclipse ou BlueJ) ou juntar ficheiros .java ao projeto"; -"web_visuobject_method_ph" = "+ ladrar(): void"; -"web_code_scopes" = "Blocos coloridos"; -"web_code_scopes_hint" = "Código e diagrama: ciclo rosa, decisão azul, método amarelo, classe verde"; -"web_pseudocode" = "Pseudocódigo"; - -/* VisuFlow (desenhar fluxogramas) */ -"web_visuflow_subtitle" = "Desenhar fluxogramas"; -"web_visuflow_world_hint" = "VisuFlow: desenhar livremente um fluxograma e exportá-lo como imagem ou PDF. Podes mudar a qualquer momento na roda dentada."; -"web_visuflow_palette" = "Símbolos"; -"web_visuflow_palette_hint" = "Toca num símbolo para o juntar abaixo do selecionado, ligado por uma seta. Também o podes arrastar para a área."; -"web_visuflow_shape_start" = "Início"; -"web_visuflow_shape_ende" = "Fim"; -"web_visuflow_shape_anweisung" = "Instrução"; -"web_visuflow_shape_ein" = "Entrada/Saída"; -"web_visuflow_shape_verzweigung" = "Decisão"; -"web_visuflow_shape_unterprogramm" = "Subprograma"; -"web_visuflow_shape_start_tip" = "Oval: aqui começa o fluxo"; -"web_visuflow_shape_ende_tip" = "Oval: aqui termina o fluxo"; -"web_visuflow_shape_anweisung_tip" = "Retângulo: uma instrução, por exemplo «Ferver água»"; -"web_visuflow_shape_ein_tip" = "Paralelogramo: entrada ou saída, por exemplo «Entrada: número»"; -"web_visuflow_shape_verzweigung_tip" = "Losango: uma pergunta com as saídas sim e não"; -"web_visuflow_shape_unterprogramm_tip" = "Retângulo com duas barras: chama um subprograma"; -"web_visuflow_text_start" = "Início"; -"web_visuflow_text_ende" = "Fim"; -"web_visuflow_text_anweisung" = "Instrução"; -"web_visuflow_text_ein" = "Entrada: número"; -"web_visuflow_text_verzweigung" = "Condição?"; -"web_visuflow_text_unterprogramm" = "Subprograma"; -"web_visuflow_new_tip" = "Novo: fluxograma vazio com Início (Anular recupera o anterior)"; -"web_visuflow_open_tip" = "Abrir um ficheiro de fluxograma (.visuflow)"; -"web_visuflow_save_tip" = "Guardar o fluxograma como ficheiro (.visuflow)"; -"web_visuflow_delete" = "Apagar"; -"web_visuflow_delete_tip" = "Apagar o símbolo ou a seta selecionada (Del)"; -"web_visuflow_swap" = "trocar sim/não"; -"web_visuflow_swap_tip" = "Losango: «sim» e «não» trocam de lado"; -"web_visuflow_example" = "Exemplo"; -"web_visuflow_example_tip" = "Carregar o exemplo «Fazer chá» da lição 1 (Anular recupera o fluxograma anterior)"; -"web_visuflow_example_title" = "Fazer chá"; -"web_visuflow_example_water" = "Ferver água"; -"web_visuflow_example_bag" = "Saqueta de chá na chávena"; -"web_visuflow_example_hot" = "O chá ainda está quente demais?"; -"web_visuflow_example_wait" = "Esperar"; -"web_visuflow_example_drink" = "Beber o chá"; -"web_visuflow_title_label" = "Título do fluxograma"; -"web_visuflow_title_ph" = "Título do fluxograma"; -"web_visuflow_canvas_label" = "Área do fluxograma"; -"web_visuflow_open_error" = "Este ficheiro não é um fluxograma VisuFlow."; -"web_visuflow_saved" = "Guardado como %@"; -"web_visuflow_status_empty" = "Arrasta um símbolo da barra para a área ou toca nele."; -"web_visuflow_status_idle" = "Toca num símbolo para o selecionar. Arrasta a partir do ponto na saída para desenhar uma seta até ao próximo símbolo."; -"web_visuflow_status_node" = "Arrasta para mover o símbolo, toca outra vez para mudar o texto. Arrasta uma seta a partir do ponto na saída."; -"web_visuflow_status_edge" = "Seta selecionada. Apagar remove-a."; -"web_visuflow_status_connect" = "Larga sobre o símbolo para onde a seta vai."; -"web_visuflow_edit_label" = "Texto no símbolo"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Mudar o nome da variável …"; -"web_rename_title" = "Mudar o nome da variável"; -"web_rename_old" = "Nome"; -"web_rename_new" = "Novo nome"; -"web_rename_hint" = "Altera todos os sítios com exatamente esta escrita (numero não é Numero), no código e no estruturograma. Texto entre \"…\" e comentários ficam iguais."; -"web_rename_count_fmt" = "Aparece %d vezes."; -"web_rename_exists_fmt" = "“%@” já existe: depois as duas seriam uma só variável."; -"web_rename_invalid" = "Um nome começa com uma letra e só contém letras, algarismos e _."; -"web_rename_keyword_fmt" = "“%@” é uma palavra-chave de Java."; -"web_rename_apply" = "Mudar o nome"; -"web_rename_cancel" = "Cancelar"; -"web_visubot_world_visucode_hint" = "Outros programas como %1$@ ou %2$@ estão em visucode.de."; diff --git a/web/src/i18n/ru.strings b/web/src/i18n/ru.strings deleted file mode 100644 index fc0ac558..00000000 --- a/web/src/i18n/ru.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Тексты, которые есть только в веб-версии. Все остальные берутся из Localizable.strings приложения. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Структурная схема VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Экспорт…"; -"web_export_title" = "Сохранить как изображение или PDF либо распечатать"; -"web_export_png" = "Изображение (PNG)"; -"web_export_svg" = "Векторная графика (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Файл VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Ошибка экспорта: %@"; -"web_print_hint" = "Через «Экспорт… → PDF» можно сохранить схему и затем распечатать её."; -"web_delete" = "Удалить"; -"web_language_title" = "Язык интерфейса"; -"web_simulation_start" = "Запустить симуляцию"; -"web_simulation_end" = "Завершить симуляцию"; -"web_simulation_start_title" = "Выполнить схему шаг за шагом"; -"web_simulation_end_title" = "Завершить симуляцию и продолжить редактирование"; -"web_palette_hint" = "Перетащите в схему"; -"web_tabs_label" = "Схемы"; -"web_status_modified" = "изменено"; -"web_inspector_title" = "Свойства"; -"web_inspector_resize" = "Изменить высоту инспектора объектов: перетащите линию вверх или вниз (двойной щелчок: по умолчанию)"; -"web_inspector_help_drop" = "Перетаскивайте элементы из палитры на плитку: сверху = перед, снизу = после, на «ø» = заменить. Существующие элементы можно перемещать мышью."; -"web_inspector_help_inline" = "Дважды щёлкните или коснитесь элемента, чтобы изменить текст прямо в диаграмме (Enter — применить, Esc — отмена). Так же меняются имена вариантов."; -"web_inspector_help_files" = "Файлы также можно перетащить в окно."; -"web_case_name" = "Имя варианта"; -"web_case_name_placeholder" = "напр. 1, ok, default"; -"web_copied" = "Элемент скопирован."; -"web_discard_message_fmt" = "Изменения в «%@» будут потеряны."; -"web_err_unreadable_fmt" = "«%@» не является читаемым файлом VisuStruct (%@)."; -"web_saved_fmt" = "«%@» сохранён."; -"web_saved_txt_fmt" = "Сохранено как «%@». Удалите расширение .txt, чтобы использовать файл."; -"web_drop_impossible" = "Сюда нельзя поместить"; -"web_sim_delay" = "Пауза на шаг"; -"web_sim_delay_value_fmt" = "%@ с"; -"web_codegen_language" = "Язык"; -"web_codegen_comments" = "Текст схемы как комментарии"; -"web_codegen_empty_else" = "Выводить пустую ветку else в коде"; -"web_copied_check" = "Скопировано ✓"; -"web_copy_manual" = "Выделено, нажмите Ctrl+C для копирования"; -"web_run_stopped_loop" = "Выполнение остановлено: возможен бесконечный цикл."; -"web_run_cancelled" = "Выполнение отменено."; -"web_run_error" = "Ошибка при выполнении."; -"web_run_dropped_fmt" = "… скрыто более ранних строк: %d"; -"web_sim_call_arguments_fmt" = "Вызов не соответствует заголовку %@. Проверь значения в скобках."; -"web_sim_missing_return_fmt" = "%@ завершилась, не вернув значение через return."; -"web_sim_file_not_found_fmt" = "Файла с именем %@ нет."; -"web_sim_end_of_file_fmt" = "В файле %@ больше нет строк."; -"web_sim_null_value_fmt" = "%@ равно null."; -"web_sim_unknown_variable_case_fmt" = "Неизвестная переменная: %1$@. Java различает заглавные и строчные буквы: может быть, %2$@?"; -"web_sim_written_file_fmt" = "%@ (сохранён)"; -"web_site_home" = "Главная страница"; -"web_site_imprint" = "Выходные данные"; -"web_site_privacy" = "Конфиденциальность"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Программирование"; -"web_live_hide" = "Скрыть программирование"; -"web_scale_canvas" = "Размер текста: структурная схема"; -"web_scale_code" = "Размер текста: программирование"; -"web_live_indent" = "Отступы"; -"web_live_indent_title" = "Расставить отступы: четыре пробела на уровень (выделенные строки, иначе всё)"; -"web_live_show" = "Показать программирование"; -"web_live_resize" = "Изменить ширину области кода (двойной щелчок: сбросить)"; -"web_live_hint" = "Код растёт вместе с диаграммой. Серый = заполнитель: пиши в инспекторе, и текст появится здесь. Щёлкни строку, чтобы выбрать элемент."; -"web_live_ph_selector" = "переменная"; -"web_live_ph_code" = "Твой код"; -"web_live_ph_end" = "конец"; -"web_live_language" = "Язык программирования"; -"web_live_java_class" = "Как класс"; -"web_live_java_class_hint" = "Имя класса = заголовок диаграммы"; -"web_live_java_main" = "С методом main"; -"web_settings_display" = "Отображение"; -"web_live_swing" = "Настоящая Java (со Swing)"; -"web_live_swing_hint" = "Настоящая Java с окнами (CheerpJ). При первом запуске однократно загружает около 40 МБ."; -"web_live_swing_windows" = "Окна Java"; -"web_live_swing_hide" = "Закрыть окна Java"; -"web_live_swing_loading" = "Загрузка Java (в первый раз около 40 МБ) …"; -"web_live_swing_compiling" = "Компиляция …"; -"web_live_swing_running" = "Программа выполняется."; -"web_live_swing_compile_failed" = "Ошибка компиляции, см. выше."; -"web_live_swing_failed" = "Не удалось загрузить Java. Проверь подключение к интернету."; -"web_live_hint_edit" = "Набери здесь код Java, и диаграмма построится сама. Или работай в диаграмме, и код будет расти вместе с ней. Серый = заполнитель, просто пиши поверх."; -"web_live_edit_label" = "Код Java"; -"web_parse_line_fmt" = "Строка %d: %@"; -"web_parse_missing" = "Здесь ещё не хватает: %@"; -"web_parse_extra" = "Лишнее: %@"; -"web_parse_unclosed_string" = "Не хватает закрывающей %@."; -"web_parse_else_without_if" = "У этого «else» нет «if»."; -"web_parse_case_outside_switch" = "«case» и «default» должны быть внутри «switch»."; -"web_parse_missing_do_while" = "После «do { … }» не хватает «while (условие);»."; -"web_parse_more_methods" = "Пока здесь учитывается только один метод. Создай другие подпрограммы в отдельных вкладках."; -"web_parse_missing_import" = "В самом начале не хватает %@ Без этой строки Java не знает Scanner."; -"web_parse_missing_scanner" = "Сначала не хватает %@ Без этой строки Scanner не существует."; -"web_parse_unknown_type" = "Java не знает такого типа данных. Может быть, %@?"; -"web_quickfix_insert_fmt" = "Предложение: вставить %@"; -"web_quickfix_replace_fmt" = "Предложение: %1$@ вместо %2$@"; -"web_parse_wrong_case" = "Java различает заглавные и строчные буквы. Правильно: %@."; -"web_editor_title" = "Диаграмма"; -"web_editor_show" = "Показать диаграмму"; -"web_editor_hide" = "Скрыть диаграмму"; -"web_keywords_title" = "Ключевые слова кода"; -"web_keywords_hint" = "if, while, for вместо названий элементов"; -"web_palette_compact" = "Элементы всегда компактно"; -"web_palette_compact_hint" = "Значок с маленьким названием под ним, иначе только при узкой колонке"; -"web_about_version_fmt" = "Версия %@"; -"web_about_software" = "Используемое ПО"; -"web_about_software_text" = "Редактор кода использует CodeMirror и Lezer (лицензия MIT). С поддержкой Swing VisuStruct загружает CheerpJ от Leaning Technologies (лицензия Community) и javac из OpenJDK."; -"web_about_licenses" = "Тексты лицензий"; -"web_live_run" = "Запустить"; -"web_live_run_title" = "Запустить программу: вывод и ввод появятся ниже"; -"web_live_run_finished" = "Программа завершена."; -"web_live_run_stopped" = "Остановлено."; -"web_console" = "Консоль"; -"web_console_hide" = "Скрыть консоль"; -"web_console_resize" = "Изменить высоту консоли"; -"web_diagram_tools" = "Инструменты диаграммы"; -"web_files_title" = "Файлы"; -"web_files_show" = "Показать файлы"; -"web_files_hide" = "Скрыть файлы"; -"web_files_resize" = "Изменить ширину файлов"; -"web_files_new_folder" = "Новая папка"; -"web_files_switch" = "Выбрать другую папку"; -"web_files_delete" = "Удалить"; -"web_files_in_browser" = "В хранилище этого браузера"; -"web_files_save_hint_fmt" = "При сохранении программа попадает в %@."; -"web_files_empty" = "Пока ничего не сохранено. При сохранении VisuStruct создаёт здесь папку с сегодняшней датой."; -"web_files_reconnect_hint" = "После перезагрузки браузер ещё раз спросит, может ли VisuStruct использовать твою папку."; -"web_files_reconnect_fmt" = "Открыть папку «%@»"; -"web_files_connect_hint" = "Выбери папку как рабочее пространство. VisuStruct создаёт в ней папку для каждого дня и сохраняет диаграмму и код."; -"web_files_connect" = "Выбрать папку"; -"web_files_browser_hint" = "Этот браузер не может открывать папки на устройстве (напр. на iPad). Твои файлы остаются в хранилище этого браузера."; -"web_files_browser" = "Сохранять в браузере"; -"web_files_delete_confirm_fmt" = "Действительно удалить «%@»?"; -"web_files_folder_prompt" = "Имя новой папки:"; -"web_files_default_name" = "Программа"; -"web_files_saved_fmt" = "Сохранено: %@"; -"web_files_create" = "Создать"; -"web_learn_ludwig_tip" = "Совет Людвига"; -"web_game_title" = "Игра: Истина или ложь?"; -"web_game_intro" = "Людвиг показывает значения и условие. Условие истинно (true) или ложно (false)? Десять раундов, всё сложнее."; -"web_game_start" = "Начать игру"; -"web_game_round_fmt" = "Раунд %@ из %@"; -"web_game_score_fmt" = "Очки: %@"; -"web_game_true" = "истина (true)"; -"web_game_false" = "ложь (false)"; -"web_game_right" = "Верно!"; -"web_game_wrong" = "Не совсем. Вот как это вычисляется:"; -"web_game_next" = "Дальше"; -"web_game_finish" = "Результат"; -"web_game_done_fmt" = "%@ из %@ верно."; -"web_game_perfect" = "Всё верно – Людвиг впечатлён!"; -"web_game_good" = "Отлично! Посмотри на ошибки и попробуй ещё раз."; -"web_game_practice" = "Повторение – мать учения. Перечитай таблицу истинности и сыграй ещё раз."; -"web_game_again" = "Играть снова"; -"web_game_wrong_short" = "К сожалению, неверно."; -"web_game_practice_short" = "Повторение — мать учения. Перечитай объяснения и сыграй ещё раунд."; -"web_game_clicks" = "Клики:"; -"web_game_nobody" = "Никто не слушает — ничего не происходит."; -"web_game_event_fmt" = "Клик по «%@»: слушатель слышит это и выполняет свой код."; -"web_game_try" = "Теперь попробуй кнопки в окне сам."; -"web_game_time_fmt" = "Осталось %@ с"; -"web_game_defused" = "✂️ Обезврежено! Ты нашёл ошибку."; -"web_game_boom_time" = "💥 Бум! Время вышло."; -"web_game_boom_wrong" = "💥 Бум! Это была не та строка."; -"web_game_boom_part" = "💥 Бум! Строка верная, но ошибка в другой её части."; -"web_game_boom_wrong_part" = "💥 Бум! Ошибка в другой строке."; -"web_game_bomb_parts_hint" = "Нажми точно на неправильную часть."; -"web_game_fix" = "Правильная строка:"; -"web_game_order_hint" = "Нажимай на шаги в правильном порядке."; -"web_debug_step" = "Шаг"; -"web_debug_step_title" = "Шаг: выполнить одну инструкцию и снова остановиться"; -"web_debug_continue" = "Продолжить до следующей точки останова"; -"web_debug_paused_fmt" = "Остановлено перед строкой %d."; -"web_debug_gutter_title" = "Нажми на номер строки, чтобы поставить или убрать точку останова"; -"web_swap_to_code" = "Программирование крупно"; -"web_swap_to_editor" = "Структограмма крупно"; -"web_editor_resize" = "Изменить ширину структограммы"; -"web_palette_resize" = "Изменить ширину элементов"; -"web_palette_hide" = "Скрыть элементы"; -"web_palette_show" = "Показать элементы"; -"web_code_scopes" = "Цветные блоки кода"; -"web_code_scopes_hint" = "Класс, метод, цикл, ветвление в отдельных рамках"; -"web_pseudocode" = "Псевдокод"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Переименовать переменную …"; -"web_rename_title" = "Переименовать переменную"; -"web_rename_old" = "Имя"; -"web_rename_new" = "Новое имя"; -"web_rename_hint" = "Меняет каждое место с точно таким написанием (number — не Number), в коде и на структурограмме. Текст в \"…\" и комментарии остаются."; -"web_rename_count_fmt" = "Встречается %d раз(а)."; -"web_rename_exists_fmt" = "«%@» уже есть: после этого обе станут одной переменной."; -"web_rename_invalid" = "Имя начинается с буквы и содержит только буквы, цифры и _."; -"web_rename_keyword_fmt" = "«%@» — ключевое слово Java."; -"web_rename_apply" = "Переименовать"; -"web_rename_cancel" = "Отмена"; diff --git a/web/src/i18n/sv.strings b/web/src/i18n/sv.strings deleted file mode 100644 index 9de9c094..00000000 --- a/web/src/i18n/sv.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Texter som bara finns i webbversionen. Allt annat kommer från appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exportera…"; -"web_export_title" = "Spara som bild eller PDF, eller skriv ut"; -"web_export_png" = "Bild (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Exporten misslyckades: %@"; -"web_print_hint" = "Använd ”Exportera… → PDF” för att spara diagrammet och skriva ut det därifrån."; -"web_delete" = "Radera"; -"web_language_title" = "Gränssnittets språk"; -"web_simulation_start" = "Starta simulering"; -"web_simulation_end" = "Avsluta simulering"; -"web_simulation_start_title" = "Kör struktogrammet steg för steg"; -"web_simulation_end_title" = "Avsluta simuleringen och fortsätt redigera"; -"web_palette_hint" = "Dra in i struktogrammet"; -"web_tabs_label" = "Diagram"; -"web_status_modified" = "ändrad"; -"web_inspector_title" = "Egenskaper"; -"web_inspector_resize" = "Ändra objektinspektörens höjd: dra eller svep linjen uppåt eller nedåt (dubbelklick: standard)"; -"web_inspector_help_drop" = "Dra element från paletten till en ruta: överst = före, nederst = efter, på ”ø” = ersätt. Befintliga element kan flyttas med musen."; -"web_inspector_help_inline" = "Dubbelklicka eller dubbeltryck på ett element för att redigera texten direkt i diagrammet (Enter verkställer, Esc avbryter). Gäller även case-namn."; -"web_inspector_help_files" = "Du kan också släppa filer i fönstret."; -"web_case_name" = "Namn på case"; -"web_case_name_placeholder" = "t.ex. 1, ok, default"; -"web_copied" = "Elementet kopierat."; -"web_discard_message_fmt" = "Ändringarna i ”%@” går förlorade."; -"web_err_unreadable_fmt" = "”%@” är inte en läsbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "”%@” sparad."; -"web_saved_txt_fmt" = "Sparad som ”%@”. Ta bort filändelsen .txt för att använda den."; -"web_drop_impossible" = "Kan inte släppas här"; -"web_sim_delay" = "Paus per steg"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Språk"; -"web_codegen_comments" = "Diagramtext som kommentarer"; -"web_codegen_empty_else" = "Skriv ut tom else-gren i koden"; -"web_copied_check" = "Kopierat ✓"; -"web_copy_manual" = "Markerat, tryck Ctrl+C för att kopiera"; -"web_run_stopped_loop" = "Körningen stoppades: möjlig oändlig loop."; -"web_run_cancelled" = "Körningen avbröts."; -"web_run_error" = "Fel vid körning."; -"web_run_dropped_fmt" = "… %d tidigare rader dolda"; -"web_sim_call_arguments_fmt" = "Anropet passar inte till huvudet i %@. Kontrollera värdena inom parentes."; -"web_sim_missing_return_fmt" = "%@ avslutades utan att returnera ett värde med return."; -"web_sim_file_not_found_fmt" = "Det finns ingen fil som heter %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har inga fler rader."; -"web_sim_null_value_fmt" = "%@ är null."; -"web_sim_unknown_variable_case_fmt" = "Okänd variabel: %1$@. Java skiljer på stora och små bokstäver: menade du %2$@?"; -"web_sim_written_file_fmt" = "%@ (sparad)"; -"web_site_home" = "Startsida"; -"web_site_imprint" = "Kontaktuppgifter"; -"web_site_privacy" = "Integritet"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Dölj programmering"; -"web_scale_canvas" = "Textstorlek: strukturdiagram"; -"web_scale_code" = "Textstorlek: programmering"; -"web_live_indent" = "Indrag"; -"web_live_indent_title" = "Gör indrag i koden: fyra blanksteg per nivå (markerade rader, annars allt)"; -"web_live_show" = "Visa programmering"; -"web_live_resize" = "Ändra kodområdets bredd (dubbelklick: återställ)"; -"web_live_hint" = "Koden växer med ditt diagram. Grått = platshållare: skriv i inspektören så visas texten här. Klicka på en rad för att markera elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kod"; -"web_live_ph_end" = "slut"; -"web_live_language" = "Programmeringsspråk"; -"web_live_java_class" = "Som klass"; -"web_live_java_class_hint" = "Klassnamn = diagrammets titel"; -"web_live_java_main" = "Med main-metod"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Riktig Java (med Swing)"; -"web_live_swing_hint" = "Riktig Java med fönster (CheerpJ). Laddar ner ca 40 MB en gång vid första körningen."; -"web_live_swing_windows" = "Java-fönster"; -"web_live_swing_hide" = "Stäng Java-fönster"; -"web_live_swing_loading" = "Java laddas (första gången ca 40 MB) …"; -"web_live_swing_compiling" = "Kompilerar …"; -"web_live_swing_running" = "Programmet körs."; -"web_live_swing_compile_failed" = "Kompileringsfel, se ovan."; -"web_live_swing_failed" = "Java kunde inte laddas. Kontrollera internetanslutningen."; -"web_live_hint_edit" = "Skriv Java-kod här så bygger diagrammet sig självt. Eller arbeta i diagrammet så växer koden med. Grått = platshållare, skriv bara över."; -"web_live_edit_label" = "Java-kod"; -"web_parse_line_fmt" = "Rad %d: %@"; -"web_parse_missing" = "Här saknas ännu: %@"; -"web_parse_extra" = "För mycket: %@"; -"web_parse_unclosed_string" = "Det avslutande %@ saknas."; -"web_parse_else_without_if" = "Denna ”else” har ingen ”if”."; -"web_parse_case_outside_switch" = "”case” och ”default” hör hemma i en ”switch”."; -"web_parse_missing_do_while" = "Efter ”do { … }” saknas ”while (villkor);”."; -"web_parse_more_methods" = "För tillfället räknas bara en metod här. Skapa andra underprogram i egna flikar."; -"web_parse_missing_import" = "Högst upp saknas %@ Utan den raden känner Java inte till Scanner."; -"web_parse_missing_scanner" = "Innan saknas %@ Utan den raden finns ingen Scanner."; -"web_parse_unknown_type" = "Java känner inte till den här datatypen. Menade du %@?"; -"web_quickfix_insert_fmt" = "Förslag: infoga %@"; -"web_quickfix_replace_fmt" = "Förslag: %1$@ i stället för %2$@"; -"web_parse_wrong_case" = "Java skiljer på stora och små bokstäver. Rätt är %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Visa strukturdiagram"; -"web_editor_hide" = "Dölj strukturdiagram"; -"web_keywords_title" = "Kodnyckelord"; -"web_keywords_hint" = "if, while, for i stället för elementnamn"; -"web_palette_compact" = "Element alltid kompakta"; -"web_palette_compact_hint" = "Symbol med litet namn under, annars bara när kolumnen är smal"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Programvara som används"; -"web_about_software_text" = "Kodredigeraren använder CodeMirror och Lezer (MIT-licens). Med Swing-stöd laddar VisuStruct CheerpJ från Leaning Technologies (Community-licens) och javac från OpenJDK."; -"web_about_licenses" = "Licenstexter"; -"web_live_run" = "Kör"; -"web_live_run_title" = "Kör programmet: utdata och indata visas nedanför"; -"web_live_run_finished" = "Programmet är klart."; -"web_live_run_stopped" = "Stoppat."; -"web_console" = "Konsol"; -"web_console_hide" = "Dölj konsolen"; -"web_console_resize" = "Ändra konsolens höjd"; -"web_diagram_tools" = "Diagramverktyg"; -"web_files_title" = "Filer"; -"web_files_show" = "Visa filer"; -"web_files_hide" = "Dölj filer"; -"web_files_resize" = "Ändra bredd på filer"; -"web_files_new_folder" = "Ny mapp"; -"web_files_switch" = "Välj en annan mapp"; -"web_files_delete" = "Ta bort"; -"web_files_in_browser" = "I den här webbläsarens lagring"; -"web_files_save_hint_fmt" = "Sparandet lägger programmet i %@."; -"web_files_empty" = "Inget sparat ännu. När du sparar skapar VisuStruct en mapp med dagens datum här."; -"web_files_reconnect_hint" = "Efter omladdning frågar webbläsaren igen om VisuStruct får använda din mapp."; -"web_files_reconnect_fmt" = "Öppna mappen ”%@”"; -"web_files_connect_hint" = "Välj en mapp som arbetsyta. VisuStruct skapar en mapp för varje dag där och sparar diagram och kod."; -"web_files_connect" = "Välj mapp"; -"web_files_browser_hint" = "Den här webbläsaren kan inte öppna mappar på enheten (t.ex. på iPad). Dina filer stannar i webbläsarens lagring."; -"web_files_browser" = "Spara i webbläsaren"; -"web_files_delete_confirm_fmt" = "Vill du verkligen ta bort ”%@”?"; -"web_files_folder_prompt" = "Namn på den nya mappen:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Sparat: %@"; -"web_files_create" = "Skapa"; -"web_learn_ludwig_tip" = "Ludwigs tips"; -"web_game_title" = "Spel: Sant eller falskt?"; -"web_game_intro" = "Ludwig visar värden och ett villkor. Är villkoret sant (true) eller falskt (false)? Tio rundor, allt svårare."; -"web_game_start" = "Starta spelet"; -"web_game_round_fmt" = "Runda %@ av %@"; -"web_game_score_fmt" = "Poäng: %@"; -"web_game_true" = "sant (true)"; -"web_game_false" = "falskt (false)"; -"web_game_right" = "Rätt!"; -"web_game_wrong" = "Inte riktigt. Så räknar man:"; -"web_game_next" = "Nästa"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ av %@ rätt."; -"web_game_perfect" = "Allt rätt – Ludwig är imponerad!"; -"web_game_good" = "Snyggt! Titta på dina misstag och försök igen."; -"web_game_practice" = "Övning ger färdighet. Läs sanningstabellen igen och spela en runda till."; -"web_game_again" = "Spela igen"; -"web_game_wrong_short" = "Tyvärr fel."; -"web_game_practice_short" = "Övning ger färdighet. Läs förklaringarna igen och spela en runda till."; -"web_game_clicks" = "Klick:"; -"web_game_nobody" = "Ingen lyssnar – ingenting händer."; -"web_game_event_fmt" = "Klick på ”%@”: lyssnaren hör det och kör sin kod."; -"web_game_try" = "Prova nu själv knapparna i fönstret."; -"web_game_time_fmt" = "%@ s kvar"; -"web_game_defused" = "✂️ Desarmerad! Du hittade felet."; -"web_game_boom_time" = "💥 Pang! Tiden är ute."; -"web_game_boom_wrong" = "💥 Pang! Det var fel rad."; -"web_game_boom_part" = "💥 Pang! Rätt rad, men felet sitter i en annan del."; -"web_game_boom_wrong_part" = "💥 Pang! Felet sitter på en annan rad."; -"web_game_bomb_parts_hint" = "Tryck exakt på den felaktiga delen."; -"web_game_fix" = "Rätt rad:"; -"web_game_order_hint" = "Tryck på stegen i rätt ordning."; -"web_debug_step" = "Steg"; -"web_debug_step_title" = "Steg: kör en sats och pausa igen"; -"web_debug_continue" = "Fortsätt till nästa brytpunkt"; -"web_debug_paused_fmt" = "Pausad före rad %d."; -"web_debug_gutter_title" = "Klicka på ett radnummer för att sätta eller ta bort en brytpunkt"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Ändra bredd på struktogrammet"; -"web_palette_resize" = "Ändra bredd på elementen"; -"web_palette_hide" = "Dölj elementen"; -"web_palette_show" = "Visa elementen"; -"web_code_scopes" = "Färgade kodblock"; -"web_code_scopes_hint" = "Klass, metod, loop, förgrening i egna rutor"; -"web_pseudocode" = "Pseudokod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Byt namn på variabel …"; -"web_rename_title" = "Byt namn på variabel"; -"web_rename_old" = "Namn"; -"web_rename_new" = "Nytt namn"; -"web_rename_hint" = "Ändrar varje ställe med exakt denna stavning (tal är inte Tal), i koden och i strukturdiagrammet. Text inom \"…\" och kommentarer blir kvar."; -"web_rename_count_fmt" = "Förekommer %d gånger."; -"web_rename_exists_fmt" = "”%@” finns redan: efteråt skulle båda vara en variabel."; -"web_rename_invalid" = "Ett namn börjar med en bokstav och innehåller bara bokstäver, siffror och _."; -"web_rename_keyword_fmt" = "”%@” är ett nyckelord i Java."; -"web_rename_apply" = "Byt namn"; -"web_rename_cancel" = "Avbryt"; diff --git a/web/src/i18n/tr.strings b/web/src/i18n/tr.strings deleted file mode 100644 index 9dcae9ee..00000000 --- a/web/src/i18n/tr.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Yalnızca web sürümünde bulunan metinler. Geri kalan her şey uygulamanın Localizable.strings dosyalarından gelir. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct yapı şeması"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Dışa aktar…"; -"web_export_title" = "Görsel veya PDF olarak kaydet ya da yazdır"; -"web_export_png" = "Görsel (PNG)"; -"web_export_svg" = "Vektör grafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct dosyası (.visustruct)"; -"web_export_failed_fmt" = "Dışa aktarma başarısız: %@"; -"web_print_hint" = "Diyagramı kaydetmek için “Dışa aktar… → PDF” seçeneğini kullanın ve oradan yazdırın."; -"web_delete" = "Sil"; -"web_language_title" = "Arayüz dili"; -"web_simulation_start" = "Simülasyonu başlat"; -"web_simulation_end" = "Simülasyonu bitir"; -"web_simulation_start_title" = "Yapı şemasını adım adım çalıştır"; -"web_simulation_end_title" = "Simülasyonu bitir ve düzenlemeye devam et"; -"web_palette_hint" = "Yapı şemasına sürükleyin"; -"web_tabs_label" = "Diyagramlar"; -"web_status_modified" = "değiştirildi"; -"web_inspector_title" = "Özellikler"; -"web_inspector_resize" = "Nesne denetçisinin yüksekliğini değiştir: çizgiyi yukarı veya aşağı sürükle ya da kaydır (çift tıklama: varsayılan)"; -"web_inspector_help_drop" = "Paletteki öğeleri bir kutucuğa sürükleyin: üst = önce, alt = sonra, “ø” üzerine = değiştir. Mevcut öğeler fareyle taşınabilir."; -"web_inspector_help_inline" = "Metni doğrudan diyagramda düzenlemek için bir öğeye çift tıklayın veya çift dokunun (Enter uygular, Esc iptal eder). Durum adları da böyle değişir."; -"web_inspector_help_files" = "Dosyaları pencereye de bırakabilirsiniz."; -"web_case_name" = "Durum adı"; -"web_case_name_placeholder" = "ör. 1, ok, default"; -"web_copied" = "Öğe kopyalandı."; -"web_discard_message_fmt" = "“%@” üzerindeki değişiklikler kaybolacak."; -"web_err_unreadable_fmt" = "“%@” okunabilir bir VisuStruct dosyası değil (%@)."; -"web_saved_fmt" = "“%@” kaydedildi."; -"web_saved_txt_fmt" = "“%@” olarak kaydedildi. Kullanmak için .txt uzantısını kaldırın."; -"web_drop_impossible" = "Buraya bırakılamaz"; -"web_sim_delay" = "Adım başına duraklama"; -"web_sim_delay_value_fmt" = "%@ sn"; -"web_codegen_language" = "Dil"; -"web_codegen_comments" = "Diyagram metni yorum olarak"; -"web_codegen_empty_else" = "Kodda boş else dalı oluştur"; -"web_copied_check" = "Kopyalandı ✓"; -"web_copy_manual" = "Seçildi, kopyalamak için Ctrl+C tuşlarına basın"; -"web_run_stopped_loop" = "Çalıştırma durduruldu: olası sonsuz döngü."; -"web_run_cancelled" = "Çalıştırma iptal edildi."; -"web_run_error" = "Çalıştırma sırasında hata."; -"web_run_dropped_fmt" = "… önceki %d satır gizlendi"; -"web_sim_call_arguments_fmt" = "Çağrı %@ başlığıyla eşleşmiyor. Parantez içindeki değerleri kontrol et."; -"web_sim_missing_return_fmt" = "%@ return ile bir değer döndürmeden bitti."; -"web_sim_file_not_found_fmt" = "%@ adında bir dosya yok."; -"web_sim_end_of_file_fmt" = "%@ dosyasında başka satır yok."; -"web_sim_null_value_fmt" = "%@ null."; -"web_sim_unknown_variable_case_fmt" = "Bilinmeyen değişken: %1$@. Java büyük ve küçük harfleri ayırt eder: %2$@ mı demek istedin?"; -"web_sim_written_file_fmt" = "%@ (kaydedildi)"; -"web_site_home" = "Ana sayfa"; -"web_site_imprint" = "Künye"; -"web_site_privacy" = "Gizlilik"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programlama"; -"web_live_hide" = "Programlamayı gizle"; -"web_scale_canvas" = "Yazı boyutu: yapı diyagramı"; -"web_scale_code" = "Yazı boyutu: programlama"; -"web_live_indent" = "Girinti"; -"web_live_indent_title" = "Kodu girintile: her seviye için dört boşluk (seçili satırlar, yoksa tümü)"; -"web_live_show" = "Programlamayı göster"; -"web_live_resize" = "Kod alanının genişliğini değiştir (çift tıklama: sıfırla)"; -"web_live_hint" = "Kod diyagramınla birlikte büyür. Gri = yer tutucu: denetçiye yaz, metnin burada görünür. Öğesini seçmek için bir satıra tıkla."; -"web_live_ph_selector" = "değişken"; -"web_live_ph_code" = "Kodun"; -"web_live_ph_end" = "bitiş"; -"web_live_language" = "Programlama dili"; -"web_live_java_class" = "Sınıf olarak"; -"web_live_java_class_hint" = "Sınıf adı = diyagram başlığı"; -"web_live_java_main" = "main metoduyla"; -"web_settings_display" = "Görünüm"; -"web_live_swing" = "Gerçek Java (Swing ile)"; -"web_live_swing_hint" = "Pencereli gerçek Java (CheerpJ). İlk çalıştırmada bir kez yaklaşık 40 MB indirir."; -"web_live_swing_windows" = "Java pencereleri"; -"web_live_swing_hide" = "Java pencerelerini kapat"; -"web_live_swing_loading" = "Java yükleniyor (ilk seferde yaklaşık 40 MB) …"; -"web_live_swing_compiling" = "Derleniyor …"; -"web_live_swing_running" = "Program çalışıyor."; -"web_live_swing_compile_failed" = "Derleme hatası, yukarıya bak."; -"web_live_swing_failed" = "Java yüklenemedi. İnternet bağlantını kontrol et."; -"web_live_hint_edit" = "Buraya Java kodu yaz, diyagram kendiliğinden oluşsun. Ya da diyagramda çalış, kod onunla büyüsün. Gri = yer tutucu, üzerine yazman yeterli."; -"web_live_edit_label" = "Java kodu"; -"web_parse_line_fmt" = "Satır %d: %@"; -"web_parse_missing" = "Burada hâlâ eksik: %@"; -"web_parse_extra" = "Fazla: %@"; -"web_parse_unclosed_string" = "Kapanış %@ eksik."; -"web_parse_else_without_if" = "Bu “else” için bir “if” yok."; -"web_parse_case_outside_switch" = "“case” ve “default” bir “switch” içinde olmalı."; -"web_parse_missing_do_while" = "“do { … }” sonrasında “while (koşul);” eksik."; -"web_parse_more_methods" = "Şimdilik burada yalnızca bir metot sayılır. Diğer alt programları ayrı sekmelerde oluştur."; -"web_parse_missing_import" = "En üstte %@ eksik. Bu satır olmadan Java Scanner’ı tanımaz."; -"web_parse_missing_scanner" = "Önce %@ eksik. Bu satır olmadan Scanner yoktur."; -"web_parse_unknown_type" = "Java bu veri türünü tanımıyor. %@ mı demek istedin?"; -"web_quickfix_insert_fmt" = "Öneri: %@ ekle"; -"web_quickfix_replace_fmt" = "Öneri: %2$@ yerine %1$@"; -"web_parse_wrong_case" = "Java büyük ve küçük harfleri ayırt eder. Doğrusu %@."; -"web_editor_title" = "Diyagram"; -"web_editor_show" = "Diyagramı göster"; -"web_editor_hide" = "Diyagramı gizle"; -"web_keywords_title" = "Kod anahtar sözcükleri"; -"web_keywords_hint" = "Öğe adları yerine if, while, for"; -"web_palette_compact" = "Öğeler her zaman kompakt"; -"web_palette_compact_hint" = "Simgenin altında küçük ad; aksi halde yalnızca sütun dar olduğunda"; -"web_about_version_fmt" = "Sürüm %@"; -"web_about_software" = "Kullanılan yazılımlar"; -"web_about_software_text" = "Kod düzenleyici CodeMirror ve Lezer kullanır (MIT lisansı). Swing desteğiyle VisuStruct, Leaning Technologies’in CheerpJ’sini (Community lisansı) ve OpenJDK’dan javac’ı yükler."; -"web_about_licenses" = "Lisans metinleri"; -"web_live_run" = "Çalıştır"; -"web_live_run_title" = "Programı çalıştır: çıktı ve girdi aşağıda görünür"; -"web_live_run_finished" = "Program bitti."; -"web_live_run_stopped" = "Durduruldu."; -"web_console" = "Konsol"; -"web_console_hide" = "Konsolu gizle"; -"web_console_resize" = "Konsolu yeniden boyutlandır"; -"web_diagram_tools" = "Diyagram araçları"; -"web_files_title" = "Dosyalar"; -"web_files_show" = "Dosyaları göster"; -"web_files_hide" = "Dosyaları gizle"; -"web_files_resize" = "Dosyaların genişliğini değiştir"; -"web_files_new_folder" = "Yeni klasör"; -"web_files_switch" = "Başka bir klasör seç"; -"web_files_delete" = "Sil"; -"web_files_in_browser" = "Bu tarayıcının belleğinde"; -"web_files_save_hint_fmt" = "Kaydetme programı %@ içine koyar."; -"web_files_empty" = "Henüz bir şey kaydedilmedi. Kaydettiğinde VisuStruct burada bugünün tarihiyle bir klasör oluşturur."; -"web_files_reconnect_hint" = "Yeniden yüklemeden sonra tarayıcı, VisuStruct’ın klasörünü kullanıp kullanamayacağını bir kez daha sorar."; -"web_files_reconnect_fmt" = "“%@” klasörünü aç"; -"web_files_connect_hint" = "Çalışma alanı olarak bir klasör seç. VisuStruct içinde her gün için bir klasör oluşturur, diyagramı ve kodu kaydeder."; -"web_files_connect" = "Klasör seç"; -"web_files_browser_hint" = "Bu tarayıcı cihazdaki klasörleri açamaz (ör. iPad’de). Dosyaların bu tarayıcının belleğinde kalır."; -"web_files_browser" = "Tarayıcıya kaydet"; -"web_files_delete_confirm_fmt" = "“%@” gerçekten silinsin mi?"; -"web_files_folder_prompt" = "Yeni klasörün adı:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Kaydedildi: %@"; -"web_files_create" = "Oluştur"; -"web_learn_ludwig_tip" = "Ludwig’in ipucu"; -"web_game_title" = "Oyun: Doğru mu yanlış mı?"; -"web_game_intro" = "Ludwig sana değerler ve bir koşul gösterir. Koşul doğru (true) mu yanlış (false) mı? On tur, giderek zorlaşır."; -"web_game_start" = "Oyunu başlat"; -"web_game_round_fmt" = "Tur %@ / %@"; -"web_game_score_fmt" = "Puan: %@"; -"web_game_true" = "doğru (true)"; -"web_game_false" = "yanlış (false)"; -"web_game_right" = "Doğru!"; -"web_game_wrong" = "Maalesef yanlış. Şöyle hesaplanır:"; -"web_game_next" = "İleri"; -"web_game_finish" = "Sonuç"; -"web_game_done_fmt" = "%@ / %@ doğru."; -"web_game_perfect" = "Hepsi doğru – Ludwig çok etkilendi!"; -"web_game_good" = "Harika! Hatalarına bir daha bak ve yeniden dene."; -"web_game_practice" = "Pratik mükemmelleştirir. Yukarıdaki doğruluk tablosunu tekrar oku ve bir tur daha oyna."; -"web_game_again" = "Tekrar oyna"; -"web_game_wrong_short" = "Maalesef yanlış."; -"web_game_practice_short" = "Pratik mükemmelleştirir. Açıklamaları tekrar oku ve bir tur daha oyna."; -"web_game_clicks" = "Tıklamalar:"; -"web_game_nobody" = "Kimse dinlemiyor – hiçbir şey olmuyor."; -"web_game_event_fmt" = "“%@” tıklandı: dinleyici bunu duyar ve kodunu çalıştırır."; -"web_game_try" = "Şimdi penceredeki düğmeleri kendin dene."; -"web_game_time_fmt" = "%@ sn kaldı"; -"web_game_defused" = "✂️ Etkisiz hâle getirildi! Hatayı buldun."; -"web_game_boom_time" = "💥 Bum! Süre doldu."; -"web_game_boom_wrong" = "💥 Bum! Yanlış satırdı."; -"web_game_boom_part" = "💥 Bum! Satır doğru, ama hata başka bir parçada."; -"web_game_boom_wrong_part" = "💥 Bum! Hata başka bir satırda."; -"web_game_bomb_parts_hint" = "Tam olarak yanlış parçaya dokun."; -"web_game_fix" = "Doğru satır:"; -"web_game_order_hint" = "Adımlara doğru sırayla dokun."; -"web_debug_step" = "Adım"; -"web_debug_step_title" = "Adım: bir komutu çalıştır ve yeniden dur"; -"web_debug_continue" = "Bir sonraki kesme noktasına kadar devam et"; -"web_debug_paused_fmt" = "%d. satırdan önce duraklatıldı."; -"web_debug_gutter_title" = "Kesme noktası koymak veya kaldırmak için satır numarasına tıkla"; -"web_swap_to_code" = "Programlama büyük"; -"web_swap_to_editor" = "Yapı diyagramı büyük"; -"web_editor_resize" = "Diyagram genişliğini değiştir"; -"web_palette_resize" = "Öğelerin genişliğini değiştir"; -"web_palette_hide" = "Öğeleri gizle"; -"web_palette_show" = "Öğeleri göster"; -"web_code_scopes" = "Renkli kod blokları"; -"web_code_scopes_hint" = "Sınıf, metot, döngü, dallanma kendi kutularında"; -"web_pseudocode" = "Sözde kod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Değişkeni yeniden adlandır …"; -"web_rename_title" = "Değişkeni yeniden adlandır"; -"web_rename_old" = "Ad"; -"web_rename_new" = "Yeni ad"; -"web_rename_hint" = "Tam olarak bu yazılışa sahip her yeri değiştirir (sayi, Sayi değildir), kodda ve yapı diyagramında. \"…\" içindeki metin ve yorumlar kalır."; -"web_rename_count_fmt" = "%d kez geçiyor."; -"web_rename_exists_fmt" = "“%@” zaten var: sonra ikisi tek bir değişken olur."; -"web_rename_invalid" = "Bir ad harfle başlar ve yalnızca harf, rakam ve _ içerir."; -"web_rename_keyword_fmt" = "“%@” bir Java anahtar sözcüğüdür."; -"web_rename_apply" = "Yeniden adlandır"; -"web_rename_cancel" = "İptal"; diff --git a/web/src/i18n/uk.strings b/web/src/i18n/uk.strings deleted file mode 100644 index 902f348a..00000000 --- a/web/src/i18n/uk.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* Тексти, які є лише у веб-версії. Усі інші беруться з Localizable.strings застосунку. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Структурна схема VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Експорт…"; -"web_export_title" = "Зберегти як зображення або PDF чи надрукувати"; -"web_export_png" = "Зображення (PNG)"; -"web_export_svg" = "Векторна графіка (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Файл VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Помилка експорту: %@"; -"web_print_hint" = "Через «Експорт… → PDF» можна зберегти схему, а потім надрукувати її."; -"web_delete" = "Видалити"; -"web_language_title" = "Мова інтерфейсу"; -"web_simulation_start" = "Запустити симуляцію"; -"web_simulation_end" = "Завершити симуляцію"; -"web_simulation_start_title" = "Виконати схему крок за кроком"; -"web_simulation_end_title" = "Завершити симуляцію та продовжити редагування"; -"web_palette_hint" = "Перетягніть у схему"; -"web_tabs_label" = "Схеми"; -"web_status_modified" = "змінено"; -"web_inspector_title" = "Властивості"; -"web_inspector_resize" = "Змінити висоту інспектора об’єктів: перетягніть лінію вгору або вниз (подвійне клацання: типово)"; -"web_inspector_help_drop" = "Перетягуйте елементи з палітри на плитку: зверху = перед, знизу = після, на «ø» = замінити. Наявні елементи можна переміщувати мишею."; -"web_inspector_help_inline" = "Двічі клацніть або торкніться елемента, щоб змінити текст прямо в діаграмі (Enter — застосувати, Esc — скасувати). Так само змінюються назви варіантів."; -"web_inspector_help_files" = "Файли також можна перетягнути у вікно."; -"web_case_name" = "Назва випадку"; -"web_case_name_placeholder" = "напр. 1, ok, default"; -"web_copied" = "Елемент скопійовано."; -"web_discard_message_fmt" = "Зміни в «%@» буде втрачено."; -"web_err_unreadable_fmt" = "«%@» не є придатним для читання файлом VisuStruct (%@)."; -"web_saved_fmt" = "«%@» збережено."; -"web_saved_txt_fmt" = "Збережено як «%@». Видаліть розширення .txt, щоб використати файл."; -"web_drop_impossible" = "Сюди не можна помістити"; -"web_sim_delay" = "Пауза на крок"; -"web_sim_delay_value_fmt" = "%@ с"; -"web_codegen_language" = "Мова"; -"web_codegen_comments" = "Текст схеми як коментарі"; -"web_codegen_empty_else" = "Виводити порожню гілку else в коді"; -"web_copied_check" = "Скопійовано ✓"; -"web_copy_manual" = "Виділено, натисніть Ctrl+C, щоб скопіювати"; -"web_run_stopped_loop" = "Виконання зупинено: можливий нескінченний цикл."; -"web_run_cancelled" = "Виконання скасовано."; -"web_run_error" = "Помилка під час виконання."; -"web_run_dropped_fmt" = "… приховано попередніх рядків: %d"; -"web_sim_call_arguments_fmt" = "Виклик не відповідає заголовку %@. Перевір значення в дужках."; -"web_sim_missing_return_fmt" = "%@ завершилася, не повернувши значення через return."; -"web_sim_file_not_found_fmt" = "Файлу з назвою %@ немає."; -"web_sim_end_of_file_fmt" = "У файлі %@ більше немає рядків."; -"web_sim_null_value_fmt" = "%@ дорівнює null."; -"web_sim_unknown_variable_case_fmt" = "Невідома змінна: %1$@. Java розрізняє великі й малі літери: можливо, %2$@?"; -"web_sim_written_file_fmt" = "%@ (збережено)"; -"web_site_home" = "Головна сторінка"; -"web_site_imprint" = "Вихідні дані"; -"web_site_privacy" = "Конфіденційність"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Програмування"; -"web_live_hide" = "Сховати програмування"; -"web_scale_canvas" = "Розмір тексту: структурна схема"; -"web_scale_code" = "Розмір тексту: програмування"; -"web_live_indent" = "Відступи"; -"web_live_indent_title" = "Розставити відступи: чотири пробіли на рівень (виділені рядки, інакше все)"; -"web_live_show" = "Показати програмування"; -"web_live_resize" = "Змінити ширину області коду (подвійний клік: скинути)"; -"web_live_hint" = "Код росте разом із діаграмою. Сірий = заповнювач: пиши в інспекторі, і текст з’явиться тут. Клацни рядок, щоб вибрати елемент."; -"web_live_ph_selector" = "змінна"; -"web_live_ph_code" = "Твій код"; -"web_live_ph_end" = "кінець"; -"web_live_language" = "Мова програмування"; -"web_live_java_class" = "Як клас"; -"web_live_java_class_hint" = "Назва класу = заголовок діаграми"; -"web_live_java_main" = "З методом main"; -"web_settings_display" = "Вигляд"; -"web_live_swing" = "Справжня Java (зі Swing)"; -"web_live_swing_hint" = "Справжня Java з вікнами (CheerpJ). Під час першого запуску одноразово завантажує близько 40 МБ."; -"web_live_swing_windows" = "Вікна Java"; -"web_live_swing_hide" = "Закрити вікна Java"; -"web_live_swing_loading" = "Завантаження Java (уперше близько 40 МБ) …"; -"web_live_swing_compiling" = "Компіляція …"; -"web_live_swing_running" = "Програма виконується."; -"web_live_swing_compile_failed" = "Помилка компіляції, див. вище."; -"web_live_swing_failed" = "Не вдалося завантажити Java. Перевір підключення до інтернету."; -"web_live_hint_edit" = "Набери тут код Java, і діаграма будується сама. Або працюй у діаграмі, і код росте разом із нею. Сірий = заповнювач, просто пиши поверх."; -"web_live_edit_label" = "Код Java"; -"web_parse_line_fmt" = "Рядок %d: %@"; -"web_parse_missing" = "Тут ще бракує: %@"; -"web_parse_extra" = "Зайве: %@"; -"web_parse_unclosed_string" = "Бракує закривного %@."; -"web_parse_else_without_if" = "Цей «else» не має «if»."; -"web_parse_case_outside_switch" = "«case» і «default» мають бути всередині «switch»."; -"web_parse_missing_do_while" = "Після «do { … }» бракує «while (умова);»."; -"web_parse_more_methods" = "Поки що тут враховується лише один метод. Інші підпрограми створи в окремих вкладках."; -"web_parse_missing_import" = "На самому початку бракує %@ Без цього рядка Java не знає Scanner."; -"web_parse_missing_scanner" = "Спочатку бракує %@ Без цього рядка Scanner не існує."; -"web_parse_unknown_type" = "Java не знає такого типу даних. Можливо, %@?"; -"web_quickfix_insert_fmt" = "Пропозиція: вставити %@"; -"web_quickfix_replace_fmt" = "Пропозиція: %1$@ замість %2$@"; -"web_parse_wrong_case" = "Java розрізняє великі й малі літери. Правильно: %@."; -"web_editor_title" = "Діаграма"; -"web_editor_show" = "Показати діаграму"; -"web_editor_hide" = "Сховати діаграму"; -"web_keywords_title" = "Ключові слова коду"; -"web_keywords_hint" = "if, while, for замість назв елементів"; -"web_palette_compact" = "Елементи завжди компактно"; -"web_palette_compact_hint" = "Значок із маленькою назвою під ним, інакше лише за вузької колонки"; -"web_about_version_fmt" = "Версія %@"; -"web_about_software" = "Використане програмне забезпечення"; -"web_about_software_text" = "Редактор коду використовує CodeMirror і Lezer (ліцензія MIT). З підтримкою Swing VisuStruct завантажує CheerpJ від Leaning Technologies (ліцензія Community) і javac з OpenJDK."; -"web_about_licenses" = "Тексти ліцензій"; -"web_live_run" = "Запустити"; -"web_live_run_title" = "Запустити програму: виведення і введення з’являться нижче"; -"web_live_run_finished" = "Програму завершено."; -"web_live_run_stopped" = "Зупинено."; -"web_console" = "Консоль"; -"web_console_hide" = "Сховати консоль"; -"web_console_resize" = "Змінити висоту консолі"; -"web_diagram_tools" = "Інструменти діаграми"; -"web_files_title" = "Файли"; -"web_files_show" = "Показати файли"; -"web_files_hide" = "Сховати файли"; -"web_files_resize" = "Змінити ширину файлів"; -"web_files_new_folder" = "Нова тека"; -"web_files_switch" = "Вибрати іншу теку"; -"web_files_delete" = "Видалити"; -"web_files_in_browser" = "У сховищі цього браузера"; -"web_files_save_hint_fmt" = "Під час збереження програма потрапляє в %@."; -"web_files_empty" = "Ще нічого не збережено. Під час збереження VisuStruct створює тут теку з сьогоднішньою датою."; -"web_files_reconnect_hint" = "Після перезавантаження браузер ще раз запитає, чи може VisuStruct використовувати твою теку."; -"web_files_reconnect_fmt" = "Відкрити теку «%@»"; -"web_files_connect_hint" = "Вибери теку як робочий простір. VisuStruct створює в ній теку для кожного дня і зберігає діаграму та код."; -"web_files_connect" = "Вибрати теку"; -"web_files_browser_hint" = "Цей браузер не може відкривати теки на пристрої (напр. на iPad). Твої файли залишаються у сховищі цього браузера."; -"web_files_browser" = "Зберегти в браузері"; -"web_files_delete_confirm_fmt" = "Справді видалити «%@»?"; -"web_files_folder_prompt" = "Назва нової теки:"; -"web_files_default_name" = "Програма"; -"web_files_saved_fmt" = "Збережено: %@"; -"web_files_create" = "Створити"; -"web_learn_ludwig_tip" = "Порада Людвіга"; -"web_game_title" = "Гра: Істина чи хиба?"; -"web_game_intro" = "Людвіг показує значення й умову. Умова істинна (true) чи хибна (false)? Десять раундів, щоразу складніше."; -"web_game_start" = "Почати гру"; -"web_game_round_fmt" = "Раунд %@ з %@"; -"web_game_score_fmt" = "Бали: %@"; -"web_game_true" = "істина (true)"; -"web_game_false" = "хиба (false)"; -"web_game_right" = "Правильно!"; -"web_game_wrong" = "Не зовсім. Ось як це обчислюється:"; -"web_game_next" = "Далі"; -"web_game_finish" = "Результат"; -"web_game_done_fmt" = "%@ з %@ правильно."; -"web_game_perfect" = "Усе правильно – Людвіг вражений!"; -"web_game_good" = "Чудово! Переглянь помилки й спробуй ще раз."; -"web_game_practice" = "Практика робить майстра. Перечитай таблицю істинності й зіграй ще раз."; -"web_game_again" = "Грати ще"; -"web_game_wrong_short" = "На жаль, неправильно."; -"web_game_practice_short" = "Повторення — мати навчання. Перечитай пояснення і зіграй ще раунд."; -"web_game_clicks" = "Кліки:"; -"web_game_nobody" = "Ніхто не слухає — нічого не відбувається."; -"web_game_event_fmt" = "Клік по «%@»: слухач чує це і виконує свій код."; -"web_game_try" = "Тепер спробуй кнопки у вікні сам."; -"web_game_time_fmt" = "Залишилось %@ с"; -"web_game_defused" = "✂️ Знешкоджено! Ти знайшов помилку."; -"web_game_boom_time" = "💥 Бум! Час вийшов."; -"web_game_boom_wrong" = "💥 Бум! Це був не той рядок."; -"web_game_boom_part" = "💥 Бум! Рядок правильний, але помилка в іншій його частині."; -"web_game_boom_wrong_part" = "💥 Бум! Помилка в іншому рядку."; -"web_game_bomb_parts_hint" = "Натисни точно на неправильну частину."; -"web_game_fix" = "Правильний рядок:"; -"web_game_order_hint" = "Натискай на кроки в правильному порядку."; -"web_debug_step" = "Крок"; -"web_debug_step_title" = "Крок: виконати одну інструкцію й знову зупинитися"; -"web_debug_continue" = "Далі до наступної точки зупинки"; -"web_debug_paused_fmt" = "Зупинено перед рядком %d."; -"web_debug_gutter_title" = "Клацни номер рядка, щоб поставити або прибрати точку зупинки"; -"web_swap_to_code" = "Програмування великим"; -"web_swap_to_editor" = "Структурограма великою"; -"web_editor_resize" = "Змінити ширину структурограми"; -"web_palette_resize" = "Змінити ширину елементів"; -"web_palette_hide" = "Сховати елементи"; -"web_palette_show" = "Показати елементи"; -"web_code_scopes" = "Кольорові блоки коду"; -"web_code_scopes_hint" = "Клас, метод, цикл, розгалуження в окремих рамках"; -"web_pseudocode" = "Псевдокод"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Перейменувати змінну …"; -"web_rename_title" = "Перейменувати змінну"; -"web_rename_old" = "Назва"; -"web_rename_new" = "Нова назва"; -"web_rename_hint" = "Змінює кожне місце з точно таким написанням (number — це не Number), у коді та на структурограмі. Текст у \"…\" і коментарі лишаються."; -"web_rename_count_fmt" = "Трапляється %d раз(и)."; -"web_rename_exists_fmt" = "«%@» уже існує: після цього обидві стануть однією змінною."; -"web_rename_invalid" = "Назва починається з літери й містить лише літери, цифри та _."; -"web_rename_keyword_fmt" = "«%@» — ключове слово Java."; -"web_rename_apply" = "Перейменувати"; -"web_rename_cancel" = "Скасувати"; diff --git a/web/src/i18n/zh-Hans.strings b/web/src/i18n/zh-Hans.strings deleted file mode 100644 index bc3b7ed5..00000000 --- a/web/src/i18n/zh-Hans.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* 仅存在于网页版中的文本。其他所有文本均来自应用的 Localizable.strings。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 结构图"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "导出…"; -"web_export_title" = "保存为图片或 PDF,或打印"; -"web_export_png" = "图片(PNG)"; -"web_export_svg" = "矢量图(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 文件(.visustruct)"; -"web_export_failed_fmt" = "导出失败:%@"; -"web_print_hint" = "请通过“导出… → PDF”保存图表,然后从那里打印。"; -"web_delete" = "删除"; -"web_language_title" = "界面语言"; -"web_simulation_start" = "开始模拟"; -"web_simulation_end" = "结束模拟"; -"web_simulation_start_title" = "逐步运行结构图"; -"web_simulation_end_title" = "结束模拟并继续编辑"; -"web_palette_hint" = "拖入结构图"; -"web_tabs_label" = "图表"; -"web_status_modified" = "已修改"; -"web_inspector_title" = "属性"; -"web_inspector_resize" = "更改对象检查器的高度:上下拖动或滑动分隔线(双击:默认)"; -"web_inspector_help_drop" = "将元素从面板拖到块上:上部 = 插入到前面,下部 = 插入到后面,拖到“ø”上 = 替换。已有元素可用鼠标移动。"; -"web_inspector_help_inline" = "双击或双点元素即可直接在图中编辑文字(Enter 确认,Esc 取消)。case 名称也一样。"; -"web_inspector_help_files" = "也可以直接将文件拖入窗口。"; -"web_case_name" = "分支名称"; -"web_case_name_placeholder" = "例如 1, ok, default"; -"web_copied" = "已复制元素。"; -"web_discard_message_fmt" = "对“%@”的更改将会丢失。"; -"web_err_unreadable_fmt" = "“%@”不是可读取的 VisuStruct 文件(%@)。"; -"web_saved_fmt" = "已保存“%@”。"; -"web_saved_txt_fmt" = "已另存为“%@”。去掉 .txt 扩展名后即可使用。"; -"web_drop_impossible" = "无法放置在此处"; -"web_sim_delay" = "每步暂停"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "语言"; -"web_codegen_comments" = "将图表文字作为注释"; -"web_codegen_empty_else" = "在代码中输出空的 else 分支"; -"web_copied_check" = "已复制 ✓"; -"web_copy_manual" = "已选中,按 Ctrl+C 复制"; -"web_run_stopped_loop" = "执行已停止:可能存在无限循环。"; -"web_run_cancelled" = "执行已取消。"; -"web_run_error" = "运行时出错。"; -"web_run_dropped_fmt" = "… 已隐藏之前的 %d 行"; -"web_sim_call_arguments_fmt" = "调用与 %@ 的首行不匹配。请检查括号中的值。"; -"web_sim_missing_return_fmt" = "%@ 结束时没有用 return 返回值。"; -"web_sim_file_not_found_fmt" = "没有名为 %@ 的文件。"; -"web_sim_end_of_file_fmt" = "文件 %@ 没有更多行了。"; -"web_sim_null_value_fmt" = "%@ 是 null。"; -"web_sim_unknown_variable_case_fmt" = "未知变量:%1$@。Java 区分大小写:你是指 %2$@ 吗?"; -"web_sim_written_file_fmt" = "%@(已保存)"; -"web_site_home" = "主页"; -"web_site_imprint" = "版权信息"; -"web_site_privacy" = "隐私"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "编程"; -"web_live_hide" = "隐藏编程"; -"web_scale_canvas" = "文字大小:结构图"; -"web_scale_code" = "文字大小:编程"; -"web_live_indent" = "缩进"; -"web_live_indent_title" = "缩进代码:每层四个空格(选中的行,否则全部)"; -"web_live_show" = "显示编程"; -"web_live_resize" = "更改代码区宽度(双击:重置)"; -"web_live_hint" = "代码随图一起生成。灰色 = 占位符:在检查器中输入,文字就会出现在这里。点击某行可选中对应元素。"; -"web_live_ph_selector" = "变量"; -"web_live_ph_code" = "你的代码"; -"web_live_ph_end" = "结束"; -"web_live_language" = "编程语言"; -"web_live_java_class" = "作为类"; -"web_live_java_class_hint" = "类名 = 结构图标题"; -"web_live_java_main" = "包含 main 方法"; -"web_settings_display" = "显示"; -"web_live_swing" = "真正的 Java(含 Swing)"; -"web_live_swing_hint" = "带窗口的真正 Java(CheerpJ)。首次运行时一次性下载约 40 MB。"; -"web_live_swing_windows" = "Java 窗口"; -"web_live_swing_hide" = "关闭 Java 窗口"; -"web_live_swing_loading" = "正在加载 Java(首次约 40 MB)…"; -"web_live_swing_compiling" = "正在编译…"; -"web_live_swing_running" = "程序正在运行。"; -"web_live_swing_compile_failed" = "编译错误,见上方。"; -"web_live_swing_failed" = "无法加载 Java。请检查网络连接。"; -"web_live_hint_edit" = "在这里输入 Java 代码,结构图会随之生成。或者在结构图中操作,代码也会一起增长。灰色 = 占位符,直接覆盖输入即可。"; -"web_live_edit_label" = "Java 代码"; -"web_parse_line_fmt" = "第 %d 行:%@"; -"web_parse_missing" = "这里还缺少:%@"; -"web_parse_extra" = "多余:%@"; -"web_parse_unclosed_string" = "这里缺少结尾的 %@。"; -"web_parse_else_without_if" = "这个“else”没有对应的“if”。"; -"web_parse_case_outside_switch" = "“case”和“default”应写在“switch”里面。"; -"web_parse_missing_do_while" = "“do { … }”之后还缺少“while (条件);”。"; -"web_parse_more_methods" = "目前这里只计入一个方法。请在单独的标签页中创建其他子程序。"; -"web_parse_missing_import" = "最上面缺少 %@ 没有这一行,Java 不认识 Scanner。"; -"web_parse_missing_scanner" = "前面缺少 %@ 没有这一行就没有 Scanner。"; -"web_parse_unknown_type" = "Java 不认识这个数据类型。你是想写 %@ 吗?"; -"web_quickfix_insert_fmt" = "建议:插入 %@"; -"web_quickfix_replace_fmt" = "建议:用 %1$@ 代替 %2$@"; -"web_parse_wrong_case" = "Java 区分大小写。正确写法是 %@。"; -"web_editor_title" = "结构图"; -"web_editor_show" = "显示结构图"; -"web_editor_hide" = "隐藏结构图"; -"web_keywords_title" = "代码关键字"; -"web_keywords_hint" = "用 if、while、for 代替元素名称"; -"web_palette_compact" = "元素始终紧凑显示"; -"web_palette_compact_hint" = "图标下方显示小字名称;否则仅在栏较窄时"; -"web_about_version_fmt" = "版本 %@"; -"web_about_software" = "使用的软件"; -"web_about_software_text" = "代码编辑器使用 CodeMirror 和 Lezer(MIT 许可证)。启用 Swing 支持后,VisuStruct 会加载 Leaning Technologies 的 CheerpJ(Community 许可证)和 OpenJDK 的 javac。"; -"web_about_licenses" = "许可证文本"; -"web_live_run" = "运行"; -"web_live_run_title" = "运行程序:输出和输入显示在下方"; -"web_live_run_finished" = "程序已结束。"; -"web_live_run_stopped" = "已停止。"; -"web_console" = "控制台"; -"web_console_hide" = "隐藏控制台"; -"web_console_resize" = "调整控制台高度"; -"web_diagram_tools" = "图表工具"; -"web_files_title" = "文件"; -"web_files_show" = "显示文件"; -"web_files_hide" = "隐藏文件"; -"web_files_resize" = "调整文件栏宽度"; -"web_files_new_folder" = "新建文件夹"; -"web_files_switch" = "选择其他文件夹"; -"web_files_delete" = "删除"; -"web_files_in_browser" = "在此浏览器的存储中"; -"web_files_save_hint_fmt" = "保存时程序将放入 %@。"; -"web_files_empty" = "还没有保存任何内容。保存时,VisuStruct 会在这里创建一个以今天日期命名的文件夹。"; -"web_files_reconnect_hint" = "重新加载后,浏览器会再次询问 VisuStruct 是否可以使用你的文件夹。"; -"web_files_reconnect_fmt" = "打开文件夹“%@”"; -"web_files_connect_hint" = "选择一个文件夹作为工作区。VisuStruct 会在其中为每一天创建文件夹,并保存图和代码。"; -"web_files_connect" = "选择文件夹"; -"web_files_browser_hint" = "此浏览器无法打开设备上的文件夹(例如 iPad)。你的文件会保留在此浏览器的存储中。"; -"web_files_browser" = "保存在浏览器中"; -"web_files_delete_confirm_fmt" = "确定删除“%@”?"; -"web_files_folder_prompt" = "新文件夹名称:"; -"web_files_default_name" = "程序"; -"web_files_saved_fmt" = "已保存:%@"; -"web_files_create" = "新建"; -"web_learn_ludwig_tip" = "路德维希的提示"; -"web_game_title" = "游戏:真还是假?"; -"web_game_intro" = "路德维希给你看一些值和一个条件。这个条件是真(true)还是假(false)?共十轮,越来越难。"; -"web_game_start" = "开始游戏"; -"web_game_round_fmt" = "第 %@ 轮,共 %@ 轮"; -"web_game_score_fmt" = "得分:%@"; -"web_game_true" = "真 (true)"; -"web_game_false" = "假 (false)"; -"web_game_right" = "答对了!"; -"web_game_wrong" = "不太对。是这样计算的:"; -"web_game_next" = "下一轮"; -"web_game_finish" = "结果"; -"web_game_done_fmt" = "答对 %@ / %@。"; -"web_game_perfect" = "全部正确——路德维希被你折服了!"; -"web_game_good" = "很棒!再看看错题,然后再试一次。"; -"web_game_practice" = "熟能生巧。再读一遍上面的真值表,再玩一轮吧。"; -"web_game_again" = "再玩一次"; -"web_game_wrong_short" = "很遗憾,答错了。"; -"web_game_practice_short" = "熟能生巧。再读一遍解释,再玩一轮吧。"; -"web_game_clicks" = "点击:"; -"web_game_nobody" = "没有人在监听——什么也不会发生。"; -"web_game_event_fmt" = "点击“%@”:监听器听到后执行它的代码。"; -"web_game_try" = "现在自己试试窗口里的按钮吧。"; -"web_game_time_fmt" = "还剩 %@ 秒"; -"web_game_defused" = "✂️ 拆除成功!你找到了错误。"; -"web_game_boom_time" = "💥 嘭!时间到了。"; -"web_game_boom_wrong" = "💥 嘭!这不是出错的那一行。"; -"web_game_boom_part" = "💥 砰!这一行对了,但错误在另一部分。"; -"web_game_boom_wrong_part" = "💥 砰!错误在另一行。"; -"web_game_bomb_parts_hint" = "准确点击出错的部分。"; -"web_game_fix" = "正确的写法:"; -"web_game_order_hint" = "按正确的顺序点击各个步骤。"; -"web_debug_step" = "单步"; -"web_debug_step_title" = "单步:执行一条语句后再次暂停"; -"web_debug_continue" = "继续运行到下一个断点"; -"web_debug_paused_fmt" = "在第 %d 行之前暂停。"; -"web_debug_gutter_title" = "点击行号可设置或删除断点"; -"web_swap_to_code" = "编程放大"; -"web_swap_to_editor" = "结构图放大"; -"web_editor_resize" = "调整结构图宽度"; -"web_palette_resize" = "调整元素宽度"; -"web_palette_hide" = "隐藏元素"; -"web_palette_show" = "显示元素"; -"web_code_scopes" = "代码块彩色显示"; -"web_code_scopes_hint" = "类、方法、循环、分支各有自己的框"; -"web_pseudocode" = "伪代码"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "重命名变量 …"; -"web_rename_title" = "重命名变量"; -"web_rename_old" = "名称"; -"web_rename_new" = "新名称"; -"web_rename_hint" = "在代码和结构图中更改所有拼写完全相同的地方(number 不是 Number)。\"…\" 中的文本和注释保持不变。"; -"web_rename_count_fmt" = "出现 %d 次。"; -"web_rename_exists_fmt" = "“%@”已存在:之后两者会成为同一个变量。"; -"web_rename_invalid" = "名称以字母开头,只包含字母、数字和 _。"; -"web_rename_keyword_fmt" = "“%@”是 Java 关键字。"; -"web_rename_apply" = "重命名"; -"web_rename_cancel" = "取消"; diff --git a/web/src/i18n/zh-Hant.strings b/web/src/i18n/zh-Hant.strings deleted file mode 100644 index 41b3a56b..00000000 --- a/web/src/i18n/zh-Hant.strings +++ /dev/null @@ -1,201 +0,0 @@ -/* 僅存在於網頁版的文字。其他所有文字皆來自 App 的 Localizable.strings。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 結構圖"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "匯出…"; -"web_export_title" = "儲存為圖片或 PDF,或列印"; -"web_export_png" = "圖片(PNG)"; -"web_export_svg" = "向量圖形(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 檔案(.visustruct)"; -"web_export_failed_fmt" = "匯出失敗:%@"; -"web_print_hint" = "請透過「匯出… → PDF」儲存圖表,再從那裡列印。"; -"web_delete" = "刪除"; -"web_language_title" = "介面語言"; -"web_simulation_start" = "開始模擬"; -"web_simulation_end" = "結束模擬"; -"web_simulation_start_title" = "逐步執行結構圖"; -"web_simulation_end_title" = "結束模擬並繼續編輯"; -"web_palette_hint" = "拖曳到結構圖中"; -"web_tabs_label" = "圖表"; -"web_status_modified" = "已修改"; -"web_inspector_title" = "屬性"; -"web_inspector_resize" = "變更物件檢閱器的高度:上下拖曳或滑動分隔線(按兩下:預設)"; -"web_inspector_help_drop" = "將元素從面板拖曳到區塊上:上方 = 插入在前,下方 = 插入在後,拖到「ø」上 = 取代。現有元素可用滑鼠移動。"; -"web_inspector_help_inline" = "雙擊或雙點元素即可直接在圖中編輯文字(Enter 確認,Esc 取消)。case 名稱也一樣。"; -"web_inspector_help_files" = "也可以直接將檔案拖曳到視窗中。"; -"web_case_name" = "分支名稱"; -"web_case_name_placeholder" = "例如 1, ok, default"; -"web_copied" = "已複製元素。"; -"web_discard_message_fmt" = "對「%@」所做的變更將會遺失。"; -"web_err_unreadable_fmt" = "「%@」不是可讀取的 VisuStruct 檔案(%@)。"; -"web_saved_fmt" = "已儲存「%@」。"; -"web_saved_txt_fmt" = "已儲存為「%@」。移除 .txt 副檔名後即可使用。"; -"web_drop_impossible" = "無法放置在此處"; -"web_sim_delay" = "每步暫停"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "語言"; -"web_codegen_comments" = "將圖表文字作為註解"; -"web_codegen_empty_else" = "在程式碼中輸出空的 else 分支"; -"web_copied_check" = "已複製 ✓"; -"web_copy_manual" = "已選取,按 Ctrl+C 複製"; -"web_run_stopped_loop" = "執行已停止:可能是無限迴圈。"; -"web_run_cancelled" = "執行已取消。"; -"web_run_error" = "執行時發生錯誤。"; -"web_run_dropped_fmt" = "… 已隱藏先前的 %d 行"; -"web_sim_call_arguments_fmt" = "呼叫與 %@ 的首行不相符。請檢查括號中的值。"; -"web_sim_missing_return_fmt" = "%@ 結束時沒有用 return 傳回值。"; -"web_sim_file_not_found_fmt" = "沒有名為 %@ 的檔案。"; -"web_sim_end_of_file_fmt" = "檔案 %@ 沒有更多行了。"; -"web_sim_null_value_fmt" = "%@ 是 null。"; -"web_sim_unknown_variable_case_fmt" = "未知變數:%1$@。Java 區分大小寫:你是指 %2$@ 嗎?"; -"web_sim_written_file_fmt" = "%@(已儲存)"; -"web_site_home" = "首頁"; -"web_site_imprint" = "版權資訊"; -"web_site_privacy" = "隱私"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "程式設計"; -"web_live_hide" = "隱藏程式設計"; -"web_scale_canvas" = "文字大小:結構圖"; -"web_scale_code" = "文字大小:程式設計"; -"web_live_indent" = "縮排"; -"web_live_indent_title" = "縮排程式碼:每層四個空格(選取的行,否則全部)"; -"web_live_show" = "顯示程式設計"; -"web_live_resize" = "變更程式碼區寬度(按兩下:重設)"; -"web_live_hint" = "程式碼會隨圖一起產生。灰色 = 預留位置:在檢閱器中輸入,文字就會出現在這裡。點一下某行可選取對應元素。"; -"web_live_ph_selector" = "變數"; -"web_live_ph_code" = "你的程式碼"; -"web_live_ph_end" = "結束"; -"web_live_language" = "程式語言"; -"web_live_java_class" = "作為類別"; -"web_live_java_class_hint" = "類別名稱 = 結構圖標題"; -"web_live_java_main" = "包含 main 方法"; -"web_settings_display" = "顯示"; -"web_live_swing" = "真正的 Java(含 Swing)"; -"web_live_swing_hint" = "帶視窗的真正 Java(CheerpJ)。首次執行時一次性下載約 40 MB。"; -"web_live_swing_windows" = "Java 視窗"; -"web_live_swing_hide" = "關閉 Java 視窗"; -"web_live_swing_loading" = "正在載入 Java(首次約 40 MB)…"; -"web_live_swing_compiling" = "正在編譯…"; -"web_live_swing_running" = "程式執行中。"; -"web_live_swing_compile_failed" = "編譯錯誤,見上方。"; -"web_live_swing_failed" = "無法載入 Java。請檢查網路連線。"; -"web_live_hint_edit" = "在這裡輸入 Java 程式碼,結構圖會隨之產生。或者在結構圖中操作,程式碼也會一起成長。灰色 = 預留位置,直接覆寫輸入即可。"; -"web_live_edit_label" = "Java 程式碼"; -"web_parse_line_fmt" = "第 %d 行:%@"; -"web_parse_missing" = "這裡還缺少:%@"; -"web_parse_extra" = "多餘:%@"; -"web_parse_unclosed_string" = "這裡缺少結尾的 %@。"; -"web_parse_else_without_if" = "這個「else」沒有對應的「if」。"; -"web_parse_case_outside_switch" = "「case」和「default」應寫在「switch」裡面。"; -"web_parse_missing_do_while" = "「do { … }」之後還缺少「while (條件);」。"; -"web_parse_more_methods" = "目前這裡只計入一個方法。請在單獨的分頁中建立其他子程式。"; -"web_parse_missing_import" = "最上面缺少 %@ 沒有這一行,Java 不認識 Scanner。"; -"web_parse_missing_scanner" = "前面缺少 %@ 沒有這一行就沒有 Scanner。"; -"web_parse_unknown_type" = "Java 不認識這個資料型別。你是想寫 %@ 嗎?"; -"web_quickfix_insert_fmt" = "建議:插入 %@"; -"web_quickfix_replace_fmt" = "建議:用 %1$@ 代替 %2$@"; -"web_parse_wrong_case" = "Java 區分大小寫。正確寫法是 %@。"; -"web_editor_title" = "結構圖"; -"web_editor_show" = "顯示結構圖"; -"web_editor_hide" = "隱藏結構圖"; -"web_keywords_title" = "程式碼關鍵字"; -"web_keywords_hint" = "用 if、while、for 取代元素名稱"; -"web_palette_compact" = "元素一律精簡顯示"; -"web_palette_compact_hint" = "圖示下方顯示小字名稱;否則僅在欄位較窄時"; -"web_about_version_fmt" = "版本 %@"; -"web_about_software" = "使用的軟體"; -"web_about_software_text" = "程式碼編輯器使用 CodeMirror 與 Lezer(MIT 授權)。啟用 Swing 支援後,VisuStruct 會載入 Leaning Technologies 的 CheerpJ(Community 授權)與 OpenJDK 的 javac。"; -"web_about_licenses" = "授權條款全文"; -"web_live_run" = "執行"; -"web_live_run_title" = "執行程式:輸出與輸入顯示在下方"; -"web_live_run_finished" = "程式已結束。"; -"web_live_run_stopped" = "已停止。"; -"web_console" = "主控台"; -"web_console_hide" = "隱藏主控台"; -"web_console_resize" = "調整主控台高度"; -"web_diagram_tools" = "圖表工具"; -"web_files_title" = "檔案"; -"web_files_show" = "顯示檔案"; -"web_files_hide" = "隱藏檔案"; -"web_files_resize" = "調整檔案欄寬度"; -"web_files_new_folder" = "新增資料夾"; -"web_files_switch" = "選擇其他資料夾"; -"web_files_delete" = "刪除"; -"web_files_in_browser" = "在此瀏覽器的儲存空間中"; -"web_files_save_hint_fmt" = "儲存時程式會放入 %@。"; -"web_files_empty" = "還沒有儲存任何內容。儲存時,VisuStruct 會在這裡建立一個以今天日期命名的資料夾。"; -"web_files_reconnect_hint" = "重新載入後,瀏覽器會再次詢問 VisuStruct 是否可以使用你的資料夾。"; -"web_files_reconnect_fmt" = "開啟資料夾「%@」"; -"web_files_connect_hint" = "選擇一個資料夾作為工作區。VisuStruct 會在其中為每一天建立資料夾,並儲存圖與程式碼。"; -"web_files_connect" = "選擇資料夾"; -"web_files_browser_hint" = "此瀏覽器無法開啟裝置上的資料夾(例如 iPad)。你的檔案會保留在此瀏覽器的儲存空間中。"; -"web_files_browser" = "儲存在瀏覽器中"; -"web_files_delete_confirm_fmt" = "確定刪除「%@」?"; -"web_files_folder_prompt" = "新資料夾名稱:"; -"web_files_default_name" = "程式"; -"web_files_saved_fmt" = "已儲存:%@"; -"web_files_create" = "新增"; -"web_learn_ludwig_tip" = "路德維希的提示"; -"web_game_title" = "遊戲:真還是假?"; -"web_game_intro" = "路德維希給你看一些值和一個條件。這個條件是真(true)還是假(false)?共十輪,越來越難。"; -"web_game_start" = "開始遊戲"; -"web_game_round_fmt" = "第 %@ 輪,共 %@ 輪"; -"web_game_score_fmt" = "得分:%@"; -"web_game_true" = "真 (true)"; -"web_game_false" = "假 (false)"; -"web_game_right" = "答對了!"; -"web_game_wrong" = "不太對。是這樣計算的:"; -"web_game_next" = "下一輪"; -"web_game_finish" = "結果"; -"web_game_done_fmt" = "答對 %@ / %@。"; -"web_game_perfect" = "全部正確——路德維希被你折服了!"; -"web_game_good" = "很棒!再看看錯題,然後再試一次。"; -"web_game_practice" = "熟能生巧。再讀一遍上面的真值表,再玩一輪吧。"; -"web_game_again" = "再玩一次"; -"web_game_wrong_short" = "很可惜,答錯了。"; -"web_game_practice_short" = "熟能生巧。再讀一遍說明,再玩一輪吧。"; -"web_game_clicks" = "點擊:"; -"web_game_nobody" = "沒有人在監聽——什麼也不會發生。"; -"web_game_event_fmt" = "點擊「%@」:監聽器聽到後執行它的程式碼。"; -"web_game_try" = "現在自己試試視窗裡的按鈕吧。"; -"web_game_time_fmt" = "還剩 %@ 秒"; -"web_game_defused" = "✂️ 拆除成功!你找到了錯誤。"; -"web_game_boom_time" = "💥 砰!時間到了。"; -"web_game_boom_wrong" = "💥 砰!這不是出錯的那一行。"; -"web_game_boom_part" = "💥 砰!這一行對了,但錯誤在另一部分。"; -"web_game_boom_wrong_part" = "💥 砰!錯誤在另一行。"; -"web_game_bomb_parts_hint" = "準確點擊出錯的部分。"; -"web_game_fix" = "正確的寫法:"; -"web_game_order_hint" = "按正確的順序點擊各個步驟。"; -"web_debug_step" = "單步"; -"web_debug_step_title" = "單步:執行一條敘述後再次暫停"; -"web_debug_continue" = "繼續執行到下一個中斷點"; -"web_debug_paused_fmt" = "在第 %d 行之前暫停。"; -"web_debug_gutter_title" = "點擊行號可設定或刪除中斷點"; -"web_swap_to_code" = "程式設計放大"; -"web_swap_to_editor" = "結構圖放大"; -"web_editor_resize" = "調整結構圖寬度"; -"web_palette_resize" = "調整元素寬度"; -"web_palette_hide" = "隱藏元素"; -"web_palette_show" = "顯示元素"; -"web_code_scopes" = "程式碼區塊彩色顯示"; -"web_code_scopes_hint" = "類別、方法、迴圈、分支各有自己的框"; -"web_pseudocode" = "虛擬碼"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "重新命名變數 …"; -"web_rename_title" = "重新命名變數"; -"web_rename_old" = "名稱"; -"web_rename_new" = "新名稱"; -"web_rename_hint" = "在程式碼和結構圖中更改所有拼寫完全相同的地方(number 不是 Number)。\"…\" 中的文字和註解保持不變。"; -"web_rename_count_fmt" = "出現 %d 次。"; -"web_rename_exists_fmt" = "「%@」已存在:之後兩者會成為同一個變數。"; -"web_rename_invalid" = "名稱以字母開頭,只包含字母、數字和 _。"; -"web_rename_keyword_fmt" = "「%@」是 Java 關鍵字。"; -"web_rename_apply" = "重新命名"; -"web_rename_cancel" = "取消"; diff --git a/web/src/learn/boolGame.ts b/web/src/learn/boolGame.ts deleted file mode 100644 index 7b144d46..00000000 --- a/web/src/learn/boolGame.ts +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Spiel „Wahr oder falsch?“ (Block `::: spiel` im Lernbereich): Werte und eine Bedingung zeigen, - * die Antwort prüfen und die Auswertung Schritt für Schritt erklären. - */ - -export type GameVar = { name: string; kind: 'int'; min: number; max: number } | { name: string; kind: 'boolean' } - -export interface BoolGame { - vars: GameVar[] - /** Bedingungen vom leichten zum schweren. */ - conditions: string[] -} - -export type Values = Record - -export class GameFormatError extends Error {} - -/** Zeilen `alter: 8..20`, `schueler: boolean` und `? bedingung`. */ -export function parseBoolGame(lines: string[], file: string): BoolGame { - const vars: GameVar[] = [] - const conditions: string[] = [] - for (const raw of lines) { - const line = raw.trim() - if (!line) continue - if (line.startsWith('?')) { - const condition = line.slice(1).trim() - evaluate(condition, sampleValues(vars)) // Fehler früh melden - conditions.push(condition) - continue - } - const m = /^([A-Za-z_]\w*)\s*:\s*(?:(-?\d+)\s*\.\.\s*(-?\d+)|(boolean))$/.exec(line) - if (!m) throw new GameFormatError(`${file}: Unbekannte Zeile im Spiel: „${line}“`) - vars.push(m[4] ? { name: m[1], kind: 'boolean' } : { name: m[1], kind: 'int', min: Number(m[2]), max: Number(m[3]) }) - } - if (!conditions.length) throw new GameFormatError(`${file}: Das Spiel braucht mindestens eine Zeile „? bedingung“.`) - return { vars, conditions } -} - -function sampleValues(vars: GameVar[]): Values { - return Object.fromEntries(vars.map((v) => [v.name, v.kind === 'boolean' ? true : v.min])) -} - -// MARK: - Auswerten - -type Token = { kind: 'num'; value: number } | { kind: 'bool'; value: boolean } | { kind: 'name'; value: string } | { kind: 'op'; value: string } - -function tokenize(text: string): Token[] { - const out: Token[] = [] - const re = /\s*(?:(\d+)|(true|false)\b|([A-Za-z_]\w*)|(&&|\|\||==|!=|<=|>=|<|>|!|\(|\)))/y - let pos = 0 - while (pos < text.length) { - if (/^\s*$/.test(text.slice(pos))) break - re.lastIndex = pos - const m = re.exec(text) - if (!m) throw new GameFormatError(`Unerwartetes Zeichen in „${text}“ bei „${text.slice(pos)}“`) - pos = re.lastIndex - if (m[1] !== undefined) out.push({ kind: 'num', value: Number(m[1]) }) - else if (m[2] !== undefined) out.push({ kind: 'bool', value: m[2] === 'true' }) - else if (m[3] !== undefined) out.push({ kind: 'name', value: m[3] }) - else out.push({ kind: 'op', value: m[4] }) - } - return out -} - -/** Bedingung mit diesen Werten auswerten (nur ganze Zahlen, Wahrheitswerte, Vergleiche, !, && und ||). */ -export function evaluate(text: string, values: Values): boolean { - const tokens = tokenize(text) - let i = 0 - const peek = () => tokens[i] - const isOp = (v: string) => peek()?.kind === 'op' && peek()!.value === v - const fail = (): never => { - throw new GameFormatError(`Bedingung nicht lesbar: „${text}“`) - } - - const primary = (): number | boolean => { - const tok = tokens[i++] ?? fail() - if (tok.kind === 'num' || tok.kind === 'bool') return tok.value - if (tok.kind === 'name') { - if (!(tok.value in values)) throw new GameFormatError(`Unbekannte Variable „${tok.value}“ in „${text}“`) - return values[tok.value] - } - if (tok.value === '(') { - const v = or() - if (!isOp(')')) fail() - i++ - return v - } - if (tok.value === '!') { - const v = primary() - if (typeof v !== 'boolean') fail() - return !v - } - return fail() - } - const comparison = (): number | boolean => { - const left = primary() - const op = peek() - if (op?.kind === 'op' && ['==', '!=', '<', '<=', '>', '>='].includes(op.value)) { - i++ - const right = primary() - switch (op.value) { - case '==': - return left === right - case '!=': - return left !== right - } - if (typeof left !== 'number' || typeof right !== 'number') fail() - const [a, b] = [left as number, right as number] - return op.value === '<' ? a < b : op.value === '<=' ? a <= b : op.value === '>' ? a > b : a >= b - } - return left - } - const and = (): number | boolean => { - let v = comparison() - while (isOp('&&')) { - i++ - const r = comparison() - v = (v as boolean) && (r as boolean) - } - return v - } - const or = (): number | boolean => { - let v = and() - while (isOp('||')) { - i++ - const r = and() - v = (v as boolean) || (r as boolean) - } - return v - } - const result = or() - if (i !== tokens.length || typeof result !== 'boolean') return fail() - return result -} - -// MARK: - Erklären - -/** - * Auswertung in Zwischenschritten, z. B. `alter >= 12 && alter < 18` → - * `15 >= 12 && 15 < 18` → `true && true` → `true`. - */ -export function explain(text: string, values: Values): string[] { - const steps = [text] - const substituted = text.replace(/\b[A-Za-z_]\w*\b/g, (name) => (name in values ? String(values[name]) : name)) - if (substituted !== text) steps.push(substituted) - // Jeden Vergleich durch sein Ergebnis ersetzen. - const compared = substituted.replace(/(-?\d+|true|false)\s*(==|!=|<=|>=|<|>)\s*(-?\d+|true|false)/g, (m) => String(evaluate(m, {}))) - if (compared !== steps[steps.length - 1]) steps.push(compared) - const result = String(evaluate(text, values)) - if (result !== steps[steps.length - 1]) steps.push(result) - return steps -} - -// MARK: - Runden - -/** Zahlen, mit denen in der Bedingung verglichen wird: dort und knapp daneben sind die spannenden Fälle. */ -function edgeValues(condition: string, name: string): number[] { - const out: number[] = [] - const re = new RegExp(`\\b${name}\\s*(?:==|!=|<=|>=|<|>)\\s*(-?\\d+)|(-?\\d+)\\s*(?:==|!=|<=|>=|<|>)\\s*${name}\\b`, 'g') - for (const m of condition.matchAll(re)) { - const c = Number(m[1] ?? m[2]) - out.push(c - 1, c, c + 1) - } - return out -} - -export interface Round { - condition: string - values: Values - answer: boolean -} - -/** Runde `index` von `count`: je später, desto schwerer die Bedingung. */ -export function makeRound(game: BoolGame, index: number, count: number, random: () => number = Math.random): Round { - const n = game.conditions.length - const base = Math.floor((index * n) / count) - const pick = Math.min(n - 1, base + (random() < 0.5 ? 0 : 1)) - const condition = game.conditions[pick] - const values: Values = {} - for (const v of game.vars) { - if (v.kind === 'boolean') { - values[v.name] = random() < 0.5 - continue - } - const edges = edgeValues(condition, v.name).filter((x) => x >= v.min && x <= v.max) - values[v.name] = edges.length && random() < 0.6 ? edges[Math.floor(random() * edges.length)] : v.min + Math.floor(random() * (v.max - v.min + 1)) - } - return { condition, values, answer: evaluate(condition, values) } -} - -/** Nur die Variablen, die in der Bedingung vorkommen. */ -export function usedValues(round: Round): [string, number | boolean][] { - return Object.entries(round.values).filter(([name]) => new RegExp(`\\b${name}\\b`).test(round.condition)) -} diff --git a/web/src/learn/cloze.ts b/web/src/learn/cloze.ts deleted file mode 100644 index 6d6d4893..00000000 --- a/web/src/learn/cloze.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Lückentext: fertiger Code, in dem einzelne Wörter fehlen. - * - * ::: lückentext - * titel: Lückentext: Zählschleife - * auftrag: Ergänze die fehlenden Wörter. - * ```java - * for ([[int]] i = 1; i [[<=]] 10; [[i++ | i += 1 | i = i + 1]]) { - * ``` - * erklärung: Wird gezeigt, wenn alle Lücken stimmen. - * ::: - * - * Mehrere Codeblöcke stehen untereinander, z. B. eine Methode und das Hauptprogramm. - * `[[a]]` ist eine Lücke. Weitere richtige Antworten stehen mit ` | ` (Leerzeichen davor und danach) - * dahinter, damit `||` und `|` selbst als Antwort gehen: `[[i++ | i += 1]]`. - */ -export interface Cloze { - title: string - task: string - /** Codeblöcke (z. B. Methode und Hauptprogramm wie in eigenen Reitern), darin Zeilen aus Text und Lücken. */ - blocks: ClozePart[][][] - explanation?: string -} - -export type ClozePart = string | { answers: string[] } - -const gapPattern = /\[\[(.+?)\]\]/g - -export function parseCloze(inner: string[], file: string): Cloze { - const cloze: Cloze = { title: '', task: '', blocks: [] } - const codes: string[][] = [] - let inCode = false - for (const raw of inner) { - if (/^\s*```/.test(raw)) { - if (!inCode) codes.push([]) - inCode = !inCode - continue - } - if (inCode) { - codes[codes.length - 1].push(raw.replace(/\s+$/, '')) - continue - } - const line = raw.trim() - if (!line) continue - const m = /^([a-zäöü]+):\s*(.*)$/i.exec(line) - if (!m) throw new Error(`${file}: Unbekannte Zeile im Lückentext: „${line}“.`) - const value = m[2].trim() - switch (m[1].toLowerCase()) { - case 'titel': cloze.title = value; break - case 'auftrag': cloze.task = value; break - case 'erklärung': - case 'erklaerung': cloze.explanation = value; break - default: throw new Error(`${file}: Unbekannter Schlüssel „${m[1]}“ im Lückentext.`) - } - } - if (inCode) throw new Error(`${file}: Der Codeblock im Lückentext wird nicht mit \`\`\` geschlossen.`) - if (!cloze.title) throw new Error(`${file}: Ein Lückentext braucht einen Titel.`) - if (!codes.some((c) => c.some((l) => l.trim()))) throw new Error(`${file}: Lückentext „${cloze.title}“ braucht einen Codeblock.`) - cloze.blocks = codes.map((code) => { - // Gemeinsame Einrückung entfernen, damit der Code links beginnt. - const indent = Math.min(...code.filter((l) => l.trim()).map((l) => /^ */.exec(l)![0].length)) - return code.map((l) => splitGaps(l.slice(indent), file, cloze.title)) - }) - if (!clozeGaps(cloze).length) { - throw new Error(`${file}: Lückentext „${cloze.title}“ braucht mindestens eine Lücke [[…]].`) - } - return cloze -} - -function splitGaps(line: string, file: string, title: string): ClozePart[] { - const parts: ClozePart[] = [] - let at = 0 - for (const m of line.matchAll(gapPattern)) { - if (m.index! > at) parts.push(line.slice(at, m.index)) - const answers = m[1].split(/\s+\|\s+/).map((a) => a.trim()).filter(Boolean) - if (!answers.length) throw new Error(`${file}: Leere Lücke im Lückentext „${title}“.`) - parts.push({ answers }) - at = m.index! + m[0].length - } - if (at < line.length) parts.push(line.slice(at)) - if (parts.some((p) => typeof p === 'string' && (p.includes('[[') || p.includes(']]')))) { - throw new Error(`${file}: Unvollständige Lücke im Lückentext „${title}“: „${line}“.`) - } - return parts -} - -/** Alle Lücken in Reihenfolge. */ -export function clozeGaps(cloze: Cloze): string[][] { - return cloze.blocks.flat().flatMap((l) => l.flatMap((p) => (typeof p === 'string' ? [] : [p.answers]))) -} - -/** Leerzeichen zählen nicht: `i = i + 1` und `i=i+1` sind gleich. Groß/klein zählt (wie in Java). */ -export function clozeAnswerRight(answers: string[], input: string): boolean { - const norm = (s: string) => s.replace(/\s+/g, '') - return norm(input) !== '' && answers.some((a) => norm(a) === norm(input)) -} diff --git a/web/src/learn/content.ts b/web/src/learn/content.ts deleted file mode 100644 index 8feda1c0..00000000 --- a/web/src/learn/content.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { registerTextFile } from '../core/simulation' -import { decodeDocument } from '../core/xmlCodec' -import { parseWorldMap, type RobotWorldSetup } from '../core/robotWorld' -import { setMBotColorLanguage } from '../core/mbot' -import type { VSDocument } from '../core/model' -import { parseGlossary, type GlossaryEntry } from './glossary' -import { parseLesson, parseTask, type Lesson, type Task } from './lessonFormat' - -/** - * Lektionen, Aufgaben und Diagramme aus `web/lessons` (werden beim Bauen eingebettet). - * Deutsch steht in `de/`, Englisch in `en/`, Portugiesisch (Portugal) in `pt/`; alle anderen Oberflächensprachen - * zeigen Englisch. Fehlt eine Datei in einer Sprache, gilt die englische (Holger-Entscheidung: Rückfall immer Englisch). - * Diagramme und Bilder mit übersetztem Text liegen unter gleichem Namen in `diagramme//` und `bilder//`. - */ - -export type ContentLanguage = 'de' | 'en' | 'pt' -export const contentLanguages: ContentLanguage[] = ['de', 'en', 'pt'] - -const lessonFiles = import.meta.glob('../../lessons/*/*.md', { query: '?raw', import: 'default', eager: true }) as Record -const taskFiles = import.meta.glob('../../lessons/*/aufgaben/*.md', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> -// VisuBot (mBot2-Modus): eigene Lektionen und Aufgaben in `/visubot/`, die normalen bleiben unberührt. -const visuBotLessonFiles = import.meta.glob('../../lessons/*/visubot/*.md', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> -// VisuBot mit Block-Ansicht (Holger 5.11.): kurze Lektionen für die 5./6. Klasse in `/visubot/bloecke/`. -const blockLessonFiles = import.meta.glob('../../lessons/*/visubot/bloecke/*.md', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> -// Dazu eigene Aufgaben zum Knobeln in `/visubot/bloecke/aufgaben/` (Holger 5.11.). -const blockTaskFiles = import.meta.glob('../../lessons/*/visubot/bloecke/aufgaben/*.md', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> -// VisuBot im Kurs: zusätzliche Schritte für normale Lektionen, Dateiname beginnt mit deren Nummer (`13-for-schleife.md`). -const visuBotTaskFiles = import.meta.glob('../../lessons/*/visubot/aufgaben/*.md', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> -const diagramFiles = import.meta.glob('../../lessons/diagramme/**/*.visustruct', { query: '?raw', import: 'default', eager: true }) as Record< - string, - string -> - -// VisuBot: Weltkarten für Übungen (`welt: labyrinth`), Zeichen wie in `parseWorldMap`. -const worldFiles = import.meta.glob('../../lessons/welten/*.txt', { query: '?raw', import: 'default', eager: true }) as Record - -const imageFiles = import.meta.glob('../../lessons/bilder/**/*.{jpg,png,webp,svg}', { query: '?url', import: 'default', eager: true }) as Record< - string, - string -> - -const baseName = (path: string) => path.replace(/^.*\//, '') - -/** Dateien von `lang`, ergänzt um die englischen, die es dort nicht gibt. */ -function filesFor(files: Record, folder: RegExp, lang: ContentLanguage): [string, string][] { - const pick = (l: string) => new Map(Object.entries(files).filter(([p]) => folder.exec(p)?.[1] === l).map(([p, s]) => [baseName(p), s])) - const merged = new Map([...pick('en'), ...(lang === 'en' ? [] : pick(lang))]) - return [...merged] -} - -/** Inhaltssprache zur Oberflächensprache: Deutsch für Deutsch, Portugiesisch für Portugiesisch, sonst Englisch. */ -export function contentLanguageFor(uiLanguage: string): ContentLanguage { - return uiLanguage === 'de' ? 'de' : uiLanguage === 'pt-PT' ? 'pt' : 'en' -} - -export let language: ContentLanguage = 'en' -export let lessons: Lesson[] = [] -export let tasks: Task[] = [] -export let reference = '' -export let glossary: GlossaryEntry[] = [] -/** - * Zwei Welten (Holger, 27.10.): VisuStruct (`off`, der Kurs ohne Roboter) oder VisuBot (`on`). - * VisuBot zeigt seit 3.11. nur die Roboter-Lektionen; für reines Java verweisen sie auf VisuStruct. - */ -export type VisuBotMode = 'off' | 'on' -export let visuBot: VisuBotMode = 'off' - -/** - * Block-Ansicht in VisuBot (Holger 5.11.): Sie ist für Jüngere (5./6. Klasse) gedacht. Ist sie an, zeigt der Lernbereich - * kurze Lektionen zum Ausprobieren aus `visubot/bloecke/` statt der Java-Reihe. Gibt es in der Sprache (und auf Englisch) - * keine, bleibt es bei der normalen Reihe. - */ -export let blockLessons = false - -/** Block-Lektionen ein- oder ausschalten; `true`, wenn sich der Inhalt dadurch ändert. */ -export function useBlockLessons(on: boolean): boolean { - if (on === blockLessons) return false - blockLessons = on - lessons = [] - useContentLanguage(language) - return visuBot === 'on' -} - -/** Zeigt der Lernbereich gerade die Block-Lektionen? */ -export const showingBlockLessons = () => visuBot === 'on' && blockLessons && lessons.some((l) => l.blocks) - -/** VisuBot-Modus für den Lernbereich wählen; Nachschlagen und Fachbegriffe bleiben dieselben. */ -export function useVisuBotContent(mode: VisuBotMode) { - if (mode === visuBot) return - visuBot = mode - lessons = [] - useContentLanguage(language) -} - -/** Wählt die Sprache der Lektionen; die Exporte oben zeigen danach die Inhalte dieser Sprache. */ -export function useContentLanguage(lang: ContentLanguage) { - setMBotColorLanguage(lang) - if (lang === language && lessons.length > 0) return - language = lang - const pages = filesFor(lessonFiles, /\/lessons\/([^/]+)\/[^/]+\.md$/, lang) - const parseLessons = (files: [string, string][], renumber?: Map) => - files - .filter(([name]) => /^\d+/.test(name)) - .map(([name, source]) => parseLesson(renumbered(source, renumber), `${lang}/${name}`)) - .sort((a, b) => a.number - b.number) - const parseTasks = (files: [string, string][], folder: string, renumber?: Map) => - files.map(([name, source]) => { - const task = parseTask(renumbered(source, renumber), `${lang}/${folder}${name}`) - return renumber && task.after !== undefined ? { ...task, after: renumber.get(task.after) ?? task.after } : task - }) - const normalTaskFiles = filesFor(taskFiles, /\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/, lang) - const juniorFiles = visuBot === 'on' && blockLessons ? filesFor(blockLessonFiles, /\/lessons\/([^/]+)\/visubot\/bloecke\/[^/]+\.md$/, lang) : [] - if (juniorFiles.some(([name]) => /^\d+/.test(name))) { - // Block-Lektionen: eigene kurze Reihe und eigene, kindgerechte Aufgaben (die normalen sind für Ältere) - const series = visuBotSeries(juniorFiles) - lessons = parseLessons(juniorFiles, series.renumber) - .map((l) => ({ ...l, number: series.number.get(l.id)!, robot: true, blocks: true })) - .sort((a, b) => a.number - b.number) - const juniorTaskFiles = filesFor(blockTaskFiles, /\/lessons\/([^/]+)\/visubot\/bloecke\/aufgaben\/[^/]+\.md$/, lang) - tasks = parseTasks(juniorTaskFiles, 'visubot/bloecke/aufgaben/', series.renumber).map((t) => ({ ...t, robot: true })) - } else if (visuBot === 'on') { - // Seit 3.11. (Holger): VisuBot zeigt nur die Roboter-Lektionen und -Aufgaben, normales Java steht in VisuStruct. - const robotLessonFiles = filesFor(visuBotLessonFiles, /\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/, lang) - const series = visuBotSeries(robotLessonFiles) - lessons = parseLessons(robotLessonFiles, series.renumber) - .map((l) => ({ ...l, number: series.number.get(l.id)!, robot: true })) - .sort((a, b) => a.number - b.number) - const robotTaskFiles = filesFor(visuBotTaskFiles, /\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/, lang) - tasks = parseTasks(robotTaskFiles, 'visubot/aufgaben/', series.renumber).map((t) => ({ ...t, robot: true })) - } else { - // Gleiches Durchzählen wie bei VisuBot: seit 4.11. ist Lektion 1 geteilt (`01-was-ist-…`, `01-weitere-darstellungen`). - const lessonFiles = pages.filter(([name]) => /^\d+/.test(name)) - const series = visuBotSeries(lessonFiles) - lessons = parseLessons(lessonFiles, series.renumber) - .map((l) => ({ ...l, number: series.number.get(l.id)! })) - .sort((a, b) => a.number - b.number) - tasks = parseTasks(normalTaskFiles, 'aufgaben/', series.renumber) - } - tasks.sort((a, b) => (a.after ?? 0) - (b.after ?? 0) || a.level - b.level || a.title.localeCompare(b.title, lang)) - // Textdateien aus den Lektionen kann die Simulation mit `Files.readString(Path.of("name"))` lesen. - for (const block of [...lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks)), ...tasks.flatMap((t) => t.blocks)]) { - if (block.kind === 'textFile') registerTextFile(block.name, block.content) - } - reference = pages.find(([name]) => name === 'nachschlagen.md')?.[1] ?? '' - // VisuBot: mBot2-Befehle und -Sensoren als eigene Kategorien - if (visuBot !== 'off') { - const robotReference = filesFor(visuBotLessonFiles, /\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/, lang).find(([name]) => name === 'nachschlagen.md')?.[1] - if (robotReference) reference = `${reference.trimEnd()}\n\n${robotReference}` - } - glossary = parseGlossary(pages.find(([name]) => name === 'begriffe.md')?.[1] ?? '') -} - -/** - * Nummern der Lektionsreihe (VisuBot und seit 4.11. auch VisuStruct): die Roboter-Lektionen in Dateireihenfolge, durchgezählt ab 1. So kann eine neue Lektion - * mit gleicher Nummer und späterem Namen (`07-linie.md`, `07-wand-oder-linie.md`) eingeschoben werden, ohne Dateien - * umzubenennen (Lernstand hängt am Dateinamen). Verweise „Lektion N“ in den Texten meinen die Dateinummer N und - * werden auf die Nummer in der Reihe umgeschrieben (bei gleicher Nummer zählt die erste Datei). - */ -export function visuBotSeries(files: [string, string][]): { number: Map; renumber: Map } { - const names = files - .map(([name]) => name) - .filter((name) => /^\d+/.test(name)) - .sort((a, b) => Number(/^\d+/.exec(a)![0]) - Number(/^\d+/.exec(b)![0]) || a.localeCompare(b)) - const number = new Map() - const renumber = new Map() - names.forEach((name, i) => { - number.set(name.replace(/\.md$/, ''), i + 1) - const fileNumber = Number(/^\d+/.exec(name)![0]) - if (!renumber.has(fileNumber)) renumber.set(fileNumber, i + 1) - }) - return { number, renumber } -} - -/** Verweise wie „Lektion 5“, „Lektionen 6 bis 13“, „Lesson 5“ oder „lição 5“ auf die neue Nummer umschreiben. */ -function renumbered(source: string, map?: Map): string { - if (!map) return source - return source.replace( - /\b(Lektion(?:en)?|Lessons?|Li[cç](?:ão|ões))(\s+\d+(?:\s*(?:,|bis|und|and|to|a|e|–|-)\s*\d+)*)/gi, - (_, word: string, numbers: string) => word + numbers.replace(/\d+/g, (n) => String(map.get(Number(n)) ?? n)), - ) -} - -useContentLanguage('en') - -/** Deutsch: `folder/name`, sonst die englische Fassung. Sonst `folder//name`, dann `folder/en/name`, dann `folder/name`. */ -function localized(files: Map, file: string): string | undefined { - if (language === 'de') return files.get(file) ?? files.get(`en/${file}`) - return (language === 'en' ? undefined : files.get(`${language}/${file}`)) ?? files.get(`en/${file}`) ?? files.get(file) -} - -const relative = (path: string, folder: string) => path.slice(path.indexOf(folder) + folder.length) - -const diagrams = new Map(Object.entries(diagramFiles).map(([path, xml]) => [relative(path, '/diagramme/'), xml])) - -export function diagram(file: string): VSDocument | undefined { - const xml = localized(diagrams, file) - return xml === undefined ? undefined : decodeDocument(xml) -} - -const images = new Map(Object.entries(imageFiles).map(([path, url]) => [relative(path, '/bilder/'), url])) - -/** Adresse eines Bildes aus `web/lessons/bilder` (übersetzt aus `bilder/`, falls vorhanden). */ -export function image(file: string): string | undefined { - return localized(images, file) -} - -const worldMaps = new Map(Object.entries(worldFiles).map(([path, text]) => [baseName(path).replace(/\.txt$/, ''), text])) -const parsedWorlds = new Map() - -/** Welt aus `web/lessons/welten/.txt`; `undefined`, wenn es sie nicht gibt. */ -export function world(name: string): RobotWorldSetup | undefined { - const text = worldMaps.get(name) - if (text === undefined) return undefined - let setup = parsedWorlds.get(name) - if (!setup) parsedWorlds.set(name, (setup = parseWorldMap(text))) - return setup -} - -export const worldNames = () => [...worldMaps.keys()] diff --git a/web/src/learn/driveGame.ts b/web/src/learn/driveGame.ts deleted file mode 100644 index e3e288aa..00000000 --- a/web/src/learn/driveGame.ts +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Spiel „Wo landet der mBot2?“ (Block `::: spiel fahrt`): Jede Runde zeigt Java-Code für den mBot2 und eine kleine - * Karte. Man tippt auf das Feld, auf dem der mBot2 am Ende steht; danach fährt er die Strecke vor. - * - * Format (Schlüsselwörter auf Deutsch, auch in den Übersetzungen): - * - * titel: Spiel: Wo landet der mBot2? - * intro: … - * frage: Tippe auf das Feld, auf dem der mBot2 am Ende steht. (für alle Runden, je Runde überschreibbar) - * feld: 30 (Zentimeter je Feld, 10, 20 oder 30; Standard 30) - * - * runde: - * mbot.forward(60); Code, mit vier Leerzeichen eingerückt - * karte: ..... | ..... | ..^.. Zeilen von hinten nach vorn, Zeichen wie in den Weltkarten - * ziel: 2,0 Spalte,Zeile ab 0, wo er am Ende steht (der Test rechnet nach) - * > Erklärung - * - * Kartenzeichen: `.` Boden, `#` Wand, `=` schwarzes Feld, `r g b y` farbige Felder, `^ > v <` Start mit Blickrichtung. - */ - -import { parseWorldMap, type Pose, type RobotWorldSetup } from '../core/robotWorld' -import { previewRun, type PreviewResult } from '../core/robotPreview' -import { parseLiveJava } from '../core/javaParser' -import { documentFromJava } from '../core/liveSource' -import type { LiveLabels } from '../core/codeGenerator' - -export interface DriveRound { - code: string - /** Kartenzeilen, oben ist hinten. */ - map: string[] - /** Spalte und Zeile (ab 0) des Zielfelds. */ - target: { col: number; row: number } - question: string - explanation: string -} - -export interface DriveGame { - title: string - intro: string - /** Zentimeter je Feld. */ - field: number - rounds: DriveRound[] -} - -export class DriveGameError extends Error {} - -export function parseDriveGame(lines: string[], file: string): DriveGame { - const fail = (msg: string): never => { - throw new DriveGameError(`${file}: ${msg}`) - } - let title = '' - let intro = '' - let question = '' - let field = 30 - const rounds: (Omit & { target?: DriveRound['target'] })[] = [] - let current: (typeof rounds)[number] | undefined - let inCode = false - for (const raw of lines) { - const line = raw.trim() - if (current && inCode && (/^ {4}|^\t/.test(raw) || line === '')) { - current.code += (current.code ? '\n' : '') + raw.replace(/^( {4}|\t)/, '') - continue - } - inCode = false - if (!line) continue - const key = /^(titel|intro|frage|feld|runde|karte|ziel):\s*(.*)$/.exec(line) - if (key) { - const [, name, value] = key - if (name === 'runde') { - current = { code: '', map: [], question, explanation: '' } - rounds.push(current) - inCode = true - } else if (!current) { - if (name === 'titel') title = value - else if (name === 'intro') intro = value - else if (name === 'frage') question = value - else if (name === 'feld') field = [10, 20, 30].includes(Number(value)) ? Number(value) : fail('„feld:“ ist 10, 20 oder 30 (Zentimeter).') - else fail(`„${name}:“ gehört in eine Runde.`) - } else if (name === 'frage') current.question = value - else if (name === 'karte') current.map = value.split('|').map((r) => r.trim()) - else if (name === 'ziel') { - const m = /^(\d+)\s*,\s*(\d+)$/.exec(value) - if (!m) fail(`„ziel: ${value}“ muss Spalte,Zeile sein, zum Beispiel „ziel: 2,0“.`) - current.target = { col: Number(m![1]), row: Number(m![2]) } - } else fail(`„${name}:“ gehört vor die erste Runde.`) - continue - } - if (current && line.startsWith('>')) current.explanation += (current.explanation ? ' ' : '') + line.slice(1).trim() - else fail(`Unbekannte Zeile im Spiel: „${line}“`) - } - if (!title) fail('Das Spiel braucht eine Zeile „titel:“.') - if (!rounds.length) fail('Das Spiel braucht mindestens eine „runde:“.') - rounds.forEach((round, i) => { - round.code = round.code.replace(/\n+$/, '') - if (!round.code.trim()) fail(`Runde ${i + 1}: Code fehlt.`) - if (!round.map.length || round.map.some((r) => r.length !== round.map[0].length)) fail(`Runde ${i + 1}: „karte:“ fehlt oder die Zeilen sind verschieden lang.`) - if (round.map.join('').replace(/[^\^> v <).`) - if (/[^.#=rgby^>= round.map.length || round.target!.col >= round.map[0].length) fail(`Runde ${i + 1}: „ziel:“ liegt außerhalb der Karte.`) - if (!round.question) fail(`Runde ${i + 1}: keine Frage.`) - }) - return { title, intro, field, rounds: rounds as DriveRound[] } -} - -/** Die Welt einer Runde: jedes Kartenzeichen ist ein Feld von `field` cm. */ -export function driveWorld(round: DriveRound, field: number): RobotWorldSetup { - return parseWorldMap([`raster: ${field / 10}`, ...round.map].join('\n')) -} - -/** Feld (Spalte, Zeile) unter einer Lage, oder undefined außerhalb der Karte. */ -export function cellOf(pose: Pose, round: DriveRound, field: number): { col: number; row: number } | undefined { - const width = round.map[0].length * field - const depth = round.map.length * field - const col = Math.floor((pose.x + width / 2) / field) - const row = Math.floor((depth / 2 - pose.y) / field) - if (col < 0 || row < 0 || col >= round.map[0].length || row >= round.map.length) return undefined - return { col, row } -} - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - -export interface DriveResult { - run: PreviewResult - end: Pose - cell?: { col: number; row: number } - problems: string[] -} - -/** Den Code der Runde in der Welt durchfahren, wie die Vorschau im Editor. */ -export function driveRound(round: DriveRound, field: number): DriveResult { - const parsed = parseLiveJava(round.code, labels) - const problems = parsed.problems.map((p) => (typeof p === 'string' ? p : JSON.stringify(p))) - const doc = documentFromJava({ caption: '', elements: [] }, parsed) - const run = previewRun(doc, undefined, driveWorld(round, field)) - const end = run.frames[run.frames.length - 1].pose - return { run, end, cell: cellOf(end, round, field), problems } -} diff --git a/web/src/learn/glossary.ts b/web/src/learn/glossary.ts deleted file mode 100644 index 506da425..00000000 --- a/web/src/learn/glossary.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** Fachbegriffe aus `lessons//begriffe.md`: `### Begriff`, optional `auch: Form, Form` (englisch `also:`), danach die Erklärung. */ - -export interface GlossaryEntry { - term: string - /** Alle Schreibweisen, die im Text erkannt werden (der Begriff selbst zuerst). */ - forms: string[] - text: string -} - -export function parseGlossary(source: string): GlossaryEntry[] { - const entries: GlossaryEntry[] = [] - for (const line of source.replace(/\r\n/g, '\n').split('\n')) { - const heading = /^###\s+(.+)$/.exec(line) - const entry = entries.at(-1) - if (heading) { - const term = heading[1].trim() - entries.push({ term, forms: [term], text: '' }) - } else if (entry && /^(auch|also):/i.test(line)) { - entry.forms.push(...line.replace(/^(auch|also):/i, '').split(',').map((f) => f.trim()).filter(Boolean)) - } else if (entry && line.trim() !== '') { - entry.text = (entry.text + ' ' + line.trim()).trim() - } - } - return entries.filter((e) => e.text !== '') -} - -const escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') - -/** Findet ganze Wörter (nicht Teil eines längeren Worts oder einer Bindestrich-Zusammensetzung). */ -export function termPattern(entries: GlossaryEntry[]): RegExp | undefined { - const forms = entries.flatMap((e) => e.forms).sort((a, b) => b.length - a.length) - if (forms.length === 0) return undefined - return new RegExp(`(? e.forms.includes(word)) -} diff --git a/web/src/learn/lessonFormat.ts b/web/src/learn/lessonFormat.ts deleted file mode 100644 index ca8d2968..00000000 --- a/web/src/learn/lessonFormat.ts +++ /dev/null @@ -1,543 +0,0 @@ -import type { ExerciseTest } from '../core/exerciseCheck' -import { driveSignature, isMBotPart, MBOT_PARTS, MBOT_SENSORS, parseActionSpec, parseDriveSpec, type MBotPart, type MBotSensorValue } from '../core/mbot' -import { parseBoolGame, type BoolGame } from './boolGame' -import { isRoundGameKind, parseRoundGame, type RoundGame } from './roundGame' -import { parseCrosswordGame, parseRescueGame, type CrosswordGame, type RescueGame } from './rescueGame' -import { parseDriveGame, type DriveGame } from './driveGame' -import { parseCloze, type Cloze } from './cloze' -import { parsePap, type Pap } from './pap' - -/** - * Lektionen und Aufgaben als Markdown mit Kopfzeilen und `:::`-Blöcken (siehe `lessons/README.md`). - * Jede `## Überschrift` beginnt einen neuen Schritt. - */ - -export type Block = - | { kind: 'markdown'; text: string } - | { kind: 'diagram'; file: string; caption: string } - | { kind: 'exercise'; exercise: Exercise } - | { kind: 'checklist'; items: ChecklistItem[] } - /** Kompetenzen am Anfang der Lektion („Diese Kompetenzen erwerbe ich jetzt“). */ - | { kind: 'competences'; items: string[] } - | { kind: 'quiz'; questions: QuizQuestion[] } - | { kind: 'brag'; text: string; tip?: boolean } - | { kind: 'images'; files: string[]; caption: string } - /** `labeled`: beschriftete Fassung, die ein Klick auf die Grafik ein- und ausblendet. - * `animated` (`::: grafik datei.svg animiert`): SVG mit Animation, die einmal abläuft und sich wiederholen lässt. */ - | { kind: 'graphic'; file: string; labeled?: string; animated?: boolean; caption: string } - | { kind: 'game'; game: BoolGame } - | { kind: 'roundGame'; game: RoundGame } - | { kind: 'rescueGame'; game: RescueGame } - | { kind: 'driveGame'; game: DriveGame } - | { kind: 'crosswordGame'; game: CrosswordGame } - | { kind: 'caesar'; key: number; text: string } - /** VisuBot: drehbares 3D-Modell des mBot2, Teile antippen zeigt ihre Erklärung. */ - /** VisuBot: der mBot2 in 3D; die Kamera fährt zu den Teilen in `focus` (Tour wie bei JavaPicoGoat). */ - | { kind: 'robotModel'; focus: MBotPart[]; view?: string; spin?: boolean } - /** VisuBot: Teile im Modell anklicken („Wo ist der Ultraschallsensor?“). */ - | { kind: 'robotQuiz'; tasks: { part: MBotPart; question: string }[]; done?: string } - /** Fertiger Code mit Lücken für einzelne Wörter. */ - | { kind: 'cloze'; cloze: Cloze } - /** Programmablaufplan mit leeren Plätzen, die fertigen Elemente legt man hinein. */ - | { kind: 'pap'; pap: Pap } - /** Eine Textdatei zum Einlesen: `Files.readString(Path.of("name"))` liefert ihren Inhalt. */ - | { kind: 'textFile'; name: string; content: string } - -export interface Exercise { - id: string - title: string - task: string - /** Startdiagramm (Datei in `lessons/diagramme`); sonst leeres Diagramm. */ - start?: string - tests: ExerciseTest[] - /** Elementarten, die vorkommen müssen (Schlüssel wie in der Palette, z. B. `verzweigung`). */ - requires: string[] - /** Gestufte Tipps (eine `tipp:`-Zeile je Tipp), vom allgemeinen zum genauen. */ - hints: string[] - /** Musterlösung (Datei in `lessons/diagramme`), nur im Lehrermodus sichtbar. */ - solution?: string - /** Unterprogramme zur Musterlösung (Dateien in `lessons/diagramme`), je eins pro Reiter. */ - subprograms: string[] - /** `code: java`: Die Übung wird in Code live auf Java gelöst; „Übung öffnen“ öffnet die Spalte gleich mit. */ - code?: 'java' - /** `bereich: struktogramm | code | beide`: wo man die Übung löst; „Im Editor öffnen“ öffnet genau diese Bereiche. Ohne Angabe: `code` bei `code: java`, sonst `struktogramm`. */ - area?: ExerciseArea - /** VisuBot: Schleifen müssen mindestens so tief ineinander stecken (`schleifentiefe: 2`). */ - loopDepth?: number -} - -export type ExerciseArea = 'struktogramm' | 'code' | 'beide' - -/** Bereich, in dem man die Übung löst (siehe `bereich:`). */ -export function exerciseArea(ex: Pick): ExerciseArea { - return ex.area ?? (ex.code === 'java' ? 'code' : 'struktogramm') -} - -export interface ChecklistItem { - text: string - /** Titel des Schritts, in dem der Punkt erklärt wird (`- Text → Schritt`). */ - ref?: string - /** Index dieses Schritts in der Lektion, von `parseLesson` aufgelöst. */ - step?: number -} - -export interface QuizQuestion { - question: string - options: { text: string; correct: boolean }[] - /** Zuordnung: Zu jedem linken Begriff wird der passende rechte gewählt. */ - pairs?: { left: string; right: string }[] - explanation?: string - /** Schritt, den die Frage prüft (`→ Titel`); verbindet sie mit dem Checklistenpunkt zu diesem Schritt. */ - ref?: string - step?: number -} - -export interface Step { - title: string - blocks: Block[] -} - -export interface Lesson { - id: string - number: number - title: string - section: string - summary: string - steps: Step[] - /** VisuBot-Lektion in der durchgehenden Reihe der VisuBot-Welt (bekommt ein 🤖 in der Liste). */ - robot?: boolean - /** Kurze Block-Lektion für Jüngere (VisuBot mit Block-Ansicht, `visubot/bloecke/`). */ - blocks?: boolean -} - -export interface Task { - id: string - title: string - /** Nummer der Lektion, die man vorher abgeschlossen haben sollte. */ - after?: number - level: number - blocks: Block[] - /** VisuBot-Aufgabe in der durchgehenden Reihe der VisuBot-Welt. */ - robot?: boolean -} - -export class FormatError extends Error {} - -function frontMatter(source: string, file: string): { meta: Map; body: string } { - const m = /^---\n([\s\S]*?)\n---\n?/.exec(source.replace(/\r\n/g, '\n')) - if (!m) throw new FormatError(`${file}: Kopfzeilen (--- … ---) fehlen.`) - const meta = new Map() - for (const line of m[1].split('\n')) { - const kv = /^([a-zäöüß]+):\s*(.*)$/i.exec(line.trim()) - if (kv) meta.set(kv[1].toLowerCase(), kv[2].trim()) - } - return { meta, body: source.replace(/\r\n/g, '\n').slice(m[0].length) } -} - -/** `3, 4 -> 7 | 8` = Eingaben 3 und 4, erwartete Ausgabezeilen 7 und 8. */ -export function parseTest(spec: string, file: string): ExerciseTest { - const parts = spec.split(/\s*(?:->|→)\s*/) - if (parts.length !== 2) throw new FormatError(`${file}: Test „${spec}“ braucht genau ein „->“.`) - const list = (s: string, sep: RegExp) => (s.trim() === '' || s.trim() === '-' ? [] : s.split(sep).map((x) => x.trim())) - return { inputs: list(parts[0], /\s*,\s*/), expected: list(parts[1], /\s*\|\s*/) } -} - -/** `getLoudness=0/80, isButtonA=true -> forward 30, ledOn` (siehe `messwerte:`). */ -export function parseSensorTest(value: string): ExerciseTest { - const arrow = /^(.*?)\s*(?:->|→)\s*(.*)$/.exec(value.trim()) - if (!arrow) throw new Error(`„messwerte: ${value}“ braucht ein „->“.`) - const sensors: Record = {} - for (const part of arrow[1].split(/\s*,\s*/).filter(Boolean)) { - const m = /^(\w+)\s*=\s*(.+)$/.exec(part) - if (!m || !(m[1] in MBOT_SENSORS)) throw new Error(`Unbekannter Sensor in „${part}“.`) - sensors[m[1]] = m[2].split('/').map((v) => { - const t = v.trim() - if (t === 'true' || t === 'false') return t === 'true' - if (/^-?\d+(\.\d+)?$/.test(t)) return Number(t) - // Text, z. B. eine Farbe: getColor=rot - if (typeof MBOT_SENSORS[m[1]].simulated === 'string') return t - throw new Error(`Messwert „${t}“ ist keine Zahl und nicht true/false.`) - }) - } - return robotExpectation({ inputs: [], expected: [], sensors }, arrow[2]) -} - -/** Rechte Seite von `welt: … ->` und `messwerte: … ->`: Fahrt sowie `ledOn`, `ledOff`, `tone`, `noTone`, `none` (fährt nicht), `drives` (fährt irgendwie), `screen "Text"`. */ -function robotExpectation(test: ExerciseTest, spec: string): ExerciseTest { - const drive: string[] = [] - // `screen "Abstand: 42 cm"`: dieser Text steht am Ende auf dem Bildschirm (darf Kommas enthalten) - spec = spec.replace(/\bscreen\s+("(?:[^"\\]|\\.)*")/u, (_, text: string) => { - test.screen = JSON.parse(text) as string - return '' - }) - for (const token of spec.split(/\s*,\s*/).filter(Boolean)) { - if (token === 'ledOn' || token === 'ledOff') test.led = token === 'ledOn' - else if (token === 'tone' || token === 'noTone') test.tone = token === 'tone' - else if (token === 'none') test.drive = [] - else if (token === 'drives') test.drives = true - else drive.push(token) - } - if (drive.length) test.drive = driveSignature(parseDriveSpec(drive.join(', '))) - return test -} - -function parseExercise(id: string, lines: string[], file: string): Exercise { - const ex: Exercise = { id, title: '', task: '', tests: [], requires: [], hints: [], subprograms: [] } - let last: 'task' | 'hint' | undefined - for (const raw of lines) { - const kv = /^(titel|auftrag|start|test|datei|fahrt|befehle|welt|messwerte|schleifentiefe|braucht|tipp|lösung|loesung|unterprogramm|code|bereich):\s*(.*)$/i.exec(raw.trim()) - if (kv) { - const [, key, value] = kv - last = undefined - switch (key.toLowerCase()) { - case 'titel': ex.title = value; break - case 'auftrag': ex.task = value; last = 'task'; break - case 'start': ex.start = value; break - case 'test': ex.tests.push(parseTest(value, file)); break - case 'datei': { - // `datei: neu.txt -> Heu | Äpfel`: Diese Datei soll das Programm im letzten Test speichern. - const m = /^([\w.-]+)\s*(?:->|→)\s*(.*)$/.exec(value.trim()) - if (!m || !ex.tests.length) throw new FormatError(`${file}: Übung „${id}“: „datei:“ braucht vorher einen Test und die Form „name.txt -> Zeile | Zeile“.`) - const expected = ex.tests[ex.tests.length - 1] - expected.files = [...(expected.files ?? []), { name: m[1], lines: m[2].trim() === '' ? [] : m[2].split(/\s*\|\s*/).map((x) => x.trim()) }] - break - } - case 'fahrt': - // VisuBot: `fahrt: 4 x (forward 50, turnRight 90)` – so soll der Roboter fahren (ohne Ausgabe, ohne Eingabe). - try { - ex.tests.push({ inputs: [], expected: [], drive: driveSignature(parseDriveSpec(value)) }) - } catch (err) { - throw new FormatError(`${file}: Übung „${id}“: ${(err as Error).message}`) - } - break - case 'welt': { - // VisuBot: `welt: wand-nah, wand-weit` – in jeder dieser Welten muss der Roboter ohne Anstoßen ins Ziel. - // `welt: wand-nah -> turnRight` – in dieser Welt soll er genau so fahren (für Verzweigungen mit Sensoren). - const arrow = /^([\w-]+)\s*(?:->|→)\s*(.+)$/.exec(value.trim()) - if (arrow) { - try { - ex.tests.push(robotExpectation({ inputs: [], expected: [], world: arrow[1] }, arrow[2])) - } catch (err) { - throw new FormatError(`${file}: Übung „${id}“: ${(err as Error).message}`) - } - break - } - for (const name of value.split(/\s*,\s*/).filter(Boolean)) { - if (!/^[\w-]+$/.test(name)) throw new FormatError(`${file}: Übung „${id}“: Weltname „${name}“ (nur Buchstaben, Ziffern, -).`) - ex.tests.push({ inputs: [], expected: [], world: name }) - } - break - } - case 'befehle': - // VisuBot: `befehle: 3 x (setLed 255 0 0, pause 500, ledOff, pause 500)` – genau diese Befehle für LEDs, Ton und Bildschirm. - try { - ex.tests.push({ inputs: [], expected: [], actions: parseActionSpec(value) }) - } catch (err) { - throw new FormatError(`${file}: Übung „${id}“: ${(err as Error).message}`) - } - break - case 'messwerte': - // VisuBot: `messwerte: getLoudness=0/80, isButtonA=false -> forward, ledOn` – mit diesen Sensorwerten - // (nacheinander, durch / getrennt) soll der Roboter so fahren bzw. leuchten (`ledOn`, `ledOff`, `tone`, `noTone`, `none`). - try { - ex.tests.push(parseSensorTest(value)) - } catch (err) { - throw new FormatError(`${file}: Übung „${id}“: ${(err as Error).message}`) - } - break - case 'schleifentiefe': - ex.loopDepth = Number(value) - if (!Number.isInteger(ex.loopDepth) || ex.loopDepth < 1) throw new FormatError(`${file}: Übung „${id}“: „schleifentiefe:“ braucht eine Zahl ab 1.`) - break - case 'braucht': ex.requires.push(...value.split(/\s*,\s*/).filter(Boolean)); break - case 'tipp': ex.hints.push(value); last = 'hint'; break - case 'lösung': - case 'loesung': ex.solution = value; break - case 'unterprogramm': ex.subprograms.push(...value.split(/\s*,\s*/).filter(Boolean)); break - case 'code': - if (value.trim().toLowerCase() !== 'java') throw new FormatError(`${file}: Übung „${id}“: „code:“ kennt nur „java“.`) - ex.code = 'java' - break - case 'bereich': { - const area = value.trim().toLowerCase() - if (area !== 'struktogramm' && area !== 'code' && area !== 'beide') throw new FormatError(`${file}: Übung „${id}“: „bereich:“ kennt nur „struktogramm“, „code“ oder „beide“.`) - ex.area = area - break - } - } - } else if (last && raw.trim() !== '') { - // Fortsetzungszeilen für Auftrag und Tipp - if (last === 'task') ex.task += '\n' + raw.trim() - else ex.hints[ex.hints.length - 1] += '\n' + raw.trim() - } else if (raw.trim() === '' && last === 'task') { - ex.task += '\n' - } - } - if (!ex.title) throw new FormatError(`${file}: Übung „${id}“ hat keinen Titel.`) - if (!ex.task.trim()) throw new FormatError(`${file}: Übung „${id}“ hat keinen Auftrag.`) - ex.task = ex.task.trim() - return ex -} - -function parseQuiz(lines: string[], file: string): QuizQuestion[] { - const questions: QuizQuestion[] = [] - for (const raw of lines) { - const line = raw.trim() - if (line.startsWith('?')) { - questions.push({ question: line.slice(1).trim(), options: [] }) - } else if (/^- \[[ xX]\]/.test(line)) { - const q = questions.at(-1) - if (!q) throw new FormatError(`${file}: Antwort ohne Frage im Quiz.`) - q.options.push({ text: line.slice(5).trim(), correct: line[3].toLowerCase() === 'x' }) - } else if (line.startsWith('= ')) { - const q = questions.at(-1) - const m = /^=\s+(.+?)\s+->\s+(.+)$/.exec(line) - if (!q || !m) throw new FormatError(`${file}: Zuordnung „${line}“ braucht die Form „= links -> rechts“ nach einer Frage.`) - ;(q.pairs ??= []).push({ left: m[1].trim(), right: m[2].trim() }) - } else if (line.startsWith('→')) { - const q = questions.at(-1) - if (!q) throw new FormatError(`${file}: „→ Schritt“ ohne Frage im Quiz.`) - q.ref = line.slice(1).trim() - } else if (line.startsWith('>')) { - const q = questions.at(-1) - if (q) q.explanation = ((q.explanation ? q.explanation + ' ' : '') + line.slice(1).trim()).trim() - } - } - for (const q of questions) { - if (q.pairs) { - const rights = new Set(q.pairs.map((p) => p.right)) - if (q.options.length > 0 || q.pairs.length < 2 || rights.size !== q.pairs.length) { - throw new FormatError(`${file}: Zuordnung „${q.question}“ braucht mindestens zwei Paare mit verschiedenen rechten Seiten und keine Antworten.`) - } - continue - } - if (q.options.length < 2 || !q.options.some((o) => o.correct)) { - throw new FormatError(`${file}: Quizfrage „${q.question}“ braucht mindestens zwei Antworten, davon eine richtige.`) - } - } - return questions -} - -/** Text in Blöcke zerlegen: normales Markdown und `::: art …` bis `:::`. */ -export function parseBlocks(body: string, file: string): Block[] { - const blocks: Block[] = [] - const lines = body.split('\n') - let markdown: string[] = [] - const flush = () => { - const text = markdown.join('\n').trim() - if (text) blocks.push({ kind: 'markdown', text }) - markdown = [] - } - for (let i = 0; i < lines.length; i++) { - const open = /^:::\s*([a-zäöüß][a-zäöüß0-9]*)\s*(.*)$/i.exec(lines[i].trim()) - if (!open) { - markdown.push(lines[i]) - continue - } - flush() - const inner: string[] = [] - let j = i + 1 - while (j < lines.length && lines[j].trim() !== ':::') inner.push(lines[j++]) - if (j >= lines.length) throw new FormatError(`${file}: Block „::: ${open[1]}“ wird nicht mit „:::“ geschlossen.`) - const kind = open[1].toLowerCase() - const arg = open[2].trim() - switch (kind) { - case 'diagramm': - if (!arg) throw new FormatError(`${file}: „::: diagramm“ braucht einen Dateinamen.`) - blocks.push({ kind: 'diagram', file: arg, caption: inner.join(' ').trim() }) - break - case 'übung': - case 'uebung': - if (!arg) throw new FormatError(`${file}: „::: übung“ braucht eine Kennung.`) - blocks.push({ kind: 'exercise', exercise: parseExercise(arg, inner, file) }) - break - case 'checkliste': - blocks.push({ kind: 'checklist', items: inner.map((l) => l.trim()).filter((l) => l.startsWith('- ')).map((l) => checklistItem(l.slice(2).trim())) }) - break - case 'kompetenzen': - blocks.push({ kind: 'competences', items: inner.map((l) => l.trim()).filter((l) => l.startsWith('- ')).map((l) => l.slice(2).trim()) }) - break - case 'quiz': - blocks.push({ kind: 'quiz', questions: parseQuiz(inner, file) }) - break - case 'bild': - if (!arg) throw new FormatError(`${file}: „::: bild“ braucht einen Dateinamen.`) - blocks.push({ kind: 'images', files: arg.split(/\s+/), caption: inner.join(' ').trim() }) - break - case 'grafik': - if (!arg) throw new FormatError(`${file}: „::: grafik“ braucht einen Dateinamen.`) - { - const [graphic, second] = arg.split(/\s+/) - const extra = second === 'animiert' ? { animated: true } : second ? { labeled: second } : {} - blocks.push({ kind: 'graphic', file: graphic, ...extra, caption: inner.join(' ').trim() }) - } - break - case 'angeberwissen': - blocks.push({ kind: 'brag', text: inner.join('\n').trim() }) - break - case 'spiel': - try { - if (isRoundGameKind(arg)) blocks.push({ kind: 'roundGame', game: parseRoundGame(arg, inner, file) }) - else if (arg === 'prinzessin') blocks.push({ kind: 'rescueGame', game: parseRescueGame(inner, file) }) - else if (arg === 'fahrt') blocks.push({ kind: 'driveGame', game: parseDriveGame(inner, file) }) - else if (arg === 'kreuzwort') blocks.push({ kind: 'crosswordGame', game: parseCrosswordGame(inner, file) }) - else if (arg) throw new FormatError(`${file}: Unbekanntes Spiel „${arg}“ (zuhoerer, vertrag, layout, bombe, frage, reihenfolge, prinzessin, fahrt oder kreuzwort).`) - else blocks.push({ kind: 'game', game: parseBoolGame(inner, file) }) - } catch (err) { - throw new FormatError((err as Error).message) - } - break - case 'lückentext': - case 'lueckentext': - try { - blocks.push({ kind: 'cloze', cloze: parseCloze(inner, file) }) - } catch (err) { - throw new FormatError((err as Error).message) - } - break - case 'pap': - try { - blocks.push({ kind: 'pap', pap: parsePap(inner, file) }) - } catch (err) { - throw new FormatError((err as Error).message) - } - break - case 'ludwig': - blocks.push({ kind: 'brag', text: inner.join('\n').trim(), tip: true }) - break - case 'caesar': { - const key = arg ? Number(arg) : 3 - if (!Number.isInteger(key) || key < 0 || key > 25) throw new FormatError(`${file}: „::: caesar“ braucht einen Schlüssel von 0 bis 25.`) - blocks.push({ kind: 'caesar', key, text: inner.join(' ').trim() }) - break - } - case 'mbot2': { - // `fokus: cyberpi, screen`, `ansicht: unten`, `drehen: ja` - const block: Extract = { kind: 'robotModel', focus: [] } - for (const line of inner.filter((l) => l.trim())) { - const m = /^\s*(fokus|focus|ansicht|view|drehen|spin):\s*(.*)$/i.exec(line) - if (!m) throw new FormatError(`${file}: „::: mbot2“ kennt nur Zeilen „fokus:“, „ansicht:“ und „drehen:“.`) - const key = m[1].toLowerCase() - if (key === 'fokus' || key === 'focus') block.focus = robotParts(m[2], file) - else if (key === 'ansicht' || key === 'view') block.view = m[2].trim().toLowerCase() - else block.spin = /^(ja|yes|true|sim)$/i.test(m[2].trim()) - } - blocks.push(block) - break - } - case 'mbot2quiz': { - // `- ultrasonic: Wo ist der **Ultraschallsensor**?` und `fertig: Super!` - const block: Extract = { kind: 'robotQuiz', tasks: [] } - for (const line of inner.filter((l) => l.trim())) { - const task = /^\s*-\s*(\w+)\s*:\s*(.+)$/.exec(line) - const done = /^\s*(fertig|done):\s*(.+)$/i.exec(line) - if (task) block.tasks.push({ part: robotParts(task[1], file)[0], question: task[2].trim() }) - else if (done) block.done = done[2].trim() - else throw new FormatError(`${file}: „::: mbot2quiz“ braucht Zeilen „- teil: Frage“ und optional „fertig: Text“.`) - } - if (!block.tasks.length) throw new FormatError(`${file}: „::: mbot2quiz“ hat keine Fragen.`) - blocks.push(block) - break - } - case 'datei': { - if (!/^[\w.-]+\.(txt|csv|json)$/u.test(arg)) throw new FormatError(`${file}: „::: datei“ braucht einen Dateinamen wie brief.txt, liste.csv oder daten.json.`) - // Der Inhalt bleibt genau so, wie er dasteht, nur ohne Leerzeilen am Anfang und Ende. - while (inner.length && inner[0].trim() === '') inner.shift() - while (inner.length && inner[inner.length - 1].trim() === '') inner.pop() - blocks.push({ kind: 'textFile', name: arg, content: inner.join('\n') }) - break - } - default: - throw new FormatError(`${file}: Unbekannter Block „::: ${open[1]}“.`) - } - i = j - } - flush() - return blocks -} - -function checklistItem(line: string): ChecklistItem { - const m = /^(.*?)\s+→\s+(.+)$/.exec(line) - return m ? { text: m[1], ref: m[2].trim() } : { text: line } -} - -/** Verweise aus Checklisten auf den erklärenden Schritt auflösen. */ -function resolveChecklistRefs(steps: Step[], file: string) { - const index = new Map(steps.map((s, i) => [s.title.toLowerCase(), i])) - for (const block of steps.flatMap((s) => s.blocks)) { - if (block.kind !== 'checklist') continue - for (const item of block.items) { - if (item.ref === undefined) continue - item.step = index.get(item.ref.toLowerCase()) - if (item.step === undefined) throw new FormatError(`${file}: Checkliste verweist auf unbekannten Schritt „${item.ref}“.`) - } - } - const checked = new Set(steps.flatMap((s) => s.blocks).flatMap((b) => (b.kind === 'checklist' ? b.items.map((i) => i.step) : []))) - for (const block of steps.flatMap((s) => s.blocks)) { - if (block.kind !== 'quiz') continue - for (const q of block.questions) { - if (q.ref === undefined) continue - q.step = index.get(q.ref.toLowerCase()) - if (q.step === undefined) throw new FormatError(`${file}: Quizfrage „${q.question}“ verweist auf unbekannten Schritt „${q.ref}“.`) - if (!checked.has(q.step)) throw new FormatError(`${file}: Zu „${q.ref}“ (Quizfrage „${q.question}“) gibt es keinen Checklistenpunkt.`) - } - } -} - -export function parseLesson(source: string, file: string): Lesson { - const { meta, body } = frontMatter(source, file) - const name = file.replace(/^.*\//, '').replace(/\.md$/, '') - const number = Number(/^(\d+)/.exec(name)?.[1]) - if (!Number.isFinite(number)) throw new FormatError(`${file}: Dateiname muss mit der Nummer beginnen (z. B. 01-…).`) - const steps: Step[] = [] - let intro: string[] = [] - let current: { title: string; lines: string[] } | undefined - const close = () => { - if (current) steps.push({ title: current.title, blocks: parseBlocks(current.lines.join('\n'), file) }) - } - for (const line of body.split('\n')) { - const h = /^##\s+(.*)$/.exec(line) - if (h) { - close() - current = { title: h[1].trim(), lines: [] } - } else if (current) { - current.lines.push(line) - } else { - intro.push(line) - } - } - close() - if (steps.length === 0) throw new FormatError(`${file}: Keine Schritte (## Überschrift) gefunden.`) - resolveChecklistRefs(steps, file) - const title = meta.get('titel') - if (!title) throw new FormatError(`${file}: „titel:“ fehlt.`) - return { - id: name, - number, - title, - section: meta.get('bereich') ?? '', - summary: meta.get('kurz') ?? intro.join(' ').trim(), - steps, - } -} - -export function parseTask(source: string, file: string): Task { - const { meta, body } = frontMatter(source, file) - const title = meta.get('titel') - if (!title) throw new FormatError(`${file}: „titel:“ fehlt.`) - const after = meta.get('nach') - return { - id: file.replace(/^.*\//, '').replace(/\.md$/, ''), - title, - after: after ? Number(after) : undefined, - level: Number(meta.get('stufe') ?? '1') || 1, - blocks: parseBlocks(body, file), - } -} - -/** `cyberpi, screen` → geprüfte Teilnamen des mBot2-Modells. */ -function robotParts(list: string, file: string): MBotPart[] { - const names = list.split(/\s*,\s*/).map((x) => x.trim()).filter(Boolean) - for (const n of names) if (!isMBotPart(n)) throw new FormatError(`${file}: Unbekanntes Teil „${n}“. Bekannt: ${MBOT_PARTS.join(', ')}.`) - return names as MBotPart[] -} diff --git a/web/src/learn/markdown.ts b/web/src/learn/markdown.ts deleted file mode 100644 index fd2c068b..00000000 --- a/web/src/learn/markdown.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** Kleines Markdown für Lektionstexte: Absätze, ## bis ####, Listen, Zitat als Hinweis, Code, Tabellen, **fett**, *kursiv*, `code`, [Link](url), - * [Text](?visustruct&lektion=09-…) als Verweis auf eine Lektion der anderen Welt, - * [Wort]{.blau} als farbige Markierung (blau, orange, gruen) passend zu farbigen Kästen, [Wort]{teil=cyberpi} zeigt auf ein Teil des mBot2. */ - -const escape = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -export function inline(text: string): string { - const codes: string[] = [] - let s = escape(text).replace(/`([^`]+)`/g, (_, c: string) => { - codes.push(c) - return `\u0000${codes.length - 1}\u0000` - }) - s = s - .replace(/\*\*(.+?)\*\*/g, '$1') - .replace(/(^|[^*])\*([^*\s][^*]*?)\*/g, '$1$2') - .replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (_, label: string, url: string) => { - // `?visustruct&lektion=09-…` öffnet eine Lektion der anderen Welt in einem neuen Fenster (VisuBot verweist auf VisuStruct). - const world = /^\?(visustruct|visubot)(&lektion=[\w-]+)?$/.test(url) - const safe = world || /^(https?:|mailto:|#|\.{0,2}\/)/.test(url) ? url : '#' - const external = world || /^https?:/.test(safe) ? ' target="_blank" rel="noopener noreferrer"' : '' - return `${label}` - }) - .replace(/\[([^\]]+)\]\{\.(blau|orange|gruen|gelb|rosa)\}/g, '$1') - // VisuBot: [Ultraschallsensor]{teil=ultrasonic} leuchtet im 3D-Modell auf, wenn man darauf zeigt. - .replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g, '$1') - return s.replace(/\u0000(\d+)\u0000/g, (_, i: string) => `${codes[Number(i)]}`) -} - -export function markdownToHTML(source: string): string { - const out: string[] = [] - const lines = source.replace(/\r\n/g, '\n').split('\n') - let i = 0 - while (i < lines.length) { - const line = lines[i] - if (line.trim() === '') { - i++ - continue - } - if (line.startsWith('```')) { - // ```java editor: Unter dem Beispiel steht „Im Editor öffnen“, dann kann man es in Programmieren ausprobieren. - const [lang, extra] = line.slice(3).trim().split(/\s+/) - const java = lang === 'java' - const open = java && extra === 'editor' - const code: string[] = [] - i++ - while (i < lines.length && !lines[i].startsWith('```')) code.push(lines[i++]) - i++ - out.push(`

${escape(code.join('\n'))}
`) - continue - } - const heading = /^(#{2,4})\s+(.*)$/.exec(line) - if (heading) { - const level = heading[1].length - // `### Licht {.bot-licht}`: Klasse an der Überschrift (Farbpunkt der VisuBot-Gruppe im Nachschlagen) - const cls = /\s*\{\.([a-z][a-z-]*)\}$/.exec(heading[2]) - const text = cls ? heading[2].slice(0, cls.index) : heading[2] - out.push(`${inline(text)}`) - i++ - continue - } - if (/^\s*([-*]|\d+\.)\s+/.test(line)) { - const ordered = /^\s*\d+\./.test(line) - const items: string[] = [] - while (i < lines.length && /^\s*([-*]|\d+\.)\s+/.test(lines[i])) { - let item = lines[i].replace(/^\s*([-*]|\d+\.)\s+/, '') - i++ - while (i < lines.length && /^\s{2,}\S/.test(lines[i]) && !/^\s*([-*]|\d+\.)\s+/.test(lines[i])) item += ' ' + lines[i++].trim() - items.push(`
  • ${inline(item)}
  • `) - } - out.push(ordered ? `
      ${items.join('')}
    ` : `
      ${items.join('')}
    `) - continue - } - if (line.startsWith('|') && /^\|?[\s:|-]*-{3,}[\s:|-]*$/.test(lines[i + 1] ?? '')) { - const cells = (row: string) => row.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map((c) => inline(c.trim())) - const head = cells(line) - i += 2 - const rows: string[][] = [] - while (i < lines.length && lines[i].startsWith('|')) rows.push(cells(lines[i++])) - out.push( - `
    ${head.map((c) => ``).join('')}${rows - .map((r) => `${r.map((c) => ``).join('')}`) - .join('')}
    ${c}
    ${c}
    `, - ) - continue - } - if (line.startsWith('>')) { - const quote: string[] = [] - while (i < lines.length && lines[i].startsWith('>')) quote.push(lines[i++].replace(/^>\s?/, '')) - out.push(``) - continue - } - const para: string[] = [] - while ( - i < lines.length && - lines[i].trim() !== '' && - !/^(```|#{3,4}\s|>|\||\s*([-*]|\d+\.)\s+)/.test(lines[i]) - ) { - para.push(lines[i++].trim()) - } - out.push(`

    ${inline(para.join(' '))}

    `) - } - return out.join('\n') -} diff --git a/web/src/learn/pap.ts b/web/src/learn/pap.ts deleted file mode 100644 index e6560d72..00000000 --- a/web/src/learn/pap.ts +++ /dev/null @@ -1,157 +0,0 @@ -/** - * PAP bauen: Ein Programmablaufplan mit leeren Plätzen, die fertigen Elemente legt man selbst hinein. - * - * ::: pap - * titel: Übung: Kuchen backen als PAP - * auftrag: Lege jedes Element an seinen Platz. - * start: Start - * anweisung: Teig rühren - * frage: Teig glatt? | nein -> Teig rühren - * frage: Stäbchen sauber? | nein: 5 Minuten weiterbacken - * ausgabe: „Fertig!“ - * ende: Ende - * erklärung: Wird gezeigt, wenn alles stimmt. - * legende: ja - * ::: - * - * Die Zeilen stehen von oben nach unten in der Hauptspalte. Eine Frage (Raute) hat zwei Ausgänge: Einer geht nach unten - * weiter, der andere steht hinter `|`. `nein -> Text` führt mit einem Pfeil zurück nach oben zu dem Element mit diesem - * Text. `nein: Text` führt zu einer Anweisung rechts daneben, von dort geht ein Pfeil zurück zur Raute (Schleife wie - * „1 Minute warten“ in Lektion 1). Statt `nein` geht auch `ja`; der andere Ausgang ist dann der nach unten. - */ -export type PapShape = 'oval' | 'rechteck' | 'raute' | 'parallelogramm' - -export interface PapNode { - shape: PapShape - text: string - /** Nur Raute: welcher Ausgang zur Seite geht. */ - sideExit?: 'ja' | 'nein' - /** Rücksprung nach oben: Index des Ziels in `nodes`. */ - backTo?: number - /** Anweisung rechts neben der Raute (Schleife), Index in `nodes`. */ - side?: number - /** Steht rechts neben einer Raute statt in der Hauptspalte. */ - isSide?: boolean -} - -export interface Pap { - title: string - task: string - nodes: PapNode[] - explanation?: string - /** `legende: ja` zeigt unter dem Plan, was die Symbole bedeuten. */ - legend?: boolean -} - -const shapeOf: Record = { - start: 'oval', - ende: 'oval', - anweisung: 'rechteck', - eingabe: 'parallelogramm', - ausgabe: 'parallelogramm', - frage: 'raute', -} - -export function parsePap(inner: string[], file: string): Pap { - const pap: Pap = { title: '', task: '', nodes: [] } - const pending: { node: number; target: string; line: string }[] = [] - for (const raw of inner) { - const line = raw.trim() - if (!line) continue - const m = /^([a-zäöü]+):\s*(.*)$/i.exec(line) - if (!m) throw new Error(`${file}: Unbekannte Zeile im PAP: „${line}“.`) - const key = m[1].toLowerCase() - const value = m[2].trim() - if (key === 'titel') pap.title = value - else if (key === 'auftrag') pap.task = value - else if (key === 'erklärung' || key === 'erklaerung') pap.explanation = value - else if (key === 'legende') pap.legend = /^(ja|yes|true|sim)$/i.test(value) - else if (key in shapeOf) { - const [text, exit] = value.split(/\s+\|\s+/) - if (!text) throw new Error(`${file}: Leeres Element im PAP: „${line}“.`) - const node: PapNode = { shape: shapeOf[key], text: text.trim() } - pap.nodes.push(node) - if (key !== 'frage') { - if (exit) throw new Error(`${file}: Nur eine Frage hat einen zweiten Ausgang: „${line}“.`) - continue - } - const e = /^(ja|nein)\s*(->|:)\s*(.+)$/i.exec(exit ?? '') - if (!e) throw new Error(`${file}: Eine Frage braucht „| nein -> Text“ oder „| nein: Text“: „${line}“.`) - node.sideExit = e[1].toLowerCase() as 'ja' | 'nein' - if (e[2] === ':') { - node.side = pap.nodes.length - pap.nodes.push({ shape: 'rechteck', text: e[3].trim(), isSide: true }) - } else { - pending.push({ node: pap.nodes.length - 1, target: e[3].trim(), line }) - } - } else throw new Error(`${file}: Unbekannter Schlüssel „${m[1]}“ im PAP.`) - } - for (const p of pending) { - const target = pap.nodes.findIndex((n, i) => i < p.node && !n.isSide && n.text === p.target) - if (target < 0) throw new Error(`${file}: Rücksprung zu „${p.target}“: kein Element mit diesem Text weiter oben („${p.line}“).`) - pap.nodes[p.node].backTo = target - } - if (!pap.title) throw new Error(`${file}: Ein PAP braucht einen Titel.`) - if (pap.nodes.length < 3) throw new Error(`${file}: PAP „${pap.title}“ braucht mindestens drei Elemente.`) - return pap -} - -/** Ein Element passt auf einen Platz, wenn Form und Text stimmen (zwei gleiche Elemente sind austauschbar). */ -export function papFits(pap: Pap, slot: number, card: number): boolean { - const a = pap.nodes[slot] - const b = pap.nodes[card] - return a.shape === b.shape && a.text === b.text -} - -/** Lage im Bild (viewBox 400 breit): Mittelpunkt, Breite, Höhe. */ -export interface PapBox { - x: number - y: number - w: number - h: number -} - -export const PAP_WIDTH = 400 -const MAIN_X = 140 -const MAIN_W = 180 -const SIDE_X = 327 -const SIDE_W = 130 -const GAP = 20 - -export function papHeight(shape: PapShape): number { - return shape === 'raute' ? 56 : shape === 'oval' ? 30 : 36 -} - -/** Plätze der Elemente und Gesamthöhe; Seitenkästen stehen auf Höhe ihrer Raute. */ -export function papLayout(pap: Pap): { boxes: PapBox[]; height: number } { - const boxes: PapBox[] = [] - let y = 10 - pap.nodes.forEach((n, i) => { - if (n.isSide) return - const h = papHeight(n.shape) - // Platz für den Pfeil, der von oben in eine Schleife zurückkommt. - if (pap.nodes.some((o) => o.backTo === i) || n.side !== undefined) y += 12 - boxes[i] = { x: MAIN_X, y: y + h / 2, w: n.shape === 'raute' ? 170 : n.shape === 'oval' ? 110 : MAIN_W, h } - if (n.side !== undefined) boxes[n.side] = { x: SIDE_X, y: y + h / 2, w: SIDE_W, h: 40 } - y += h + GAP - }) - return { boxes, height: y - GAP + 10 } -} - -/** Text auf höchstens zwei Zeilen umbrechen, wenn er bei Schriftgröße 13 nicht in `width` passt. */ -export function papLines(text: string, width: number): string[] { - const fits = (s: string) => s.length * 6.6 <= width - if (fits(text)) return [text] - const words = text.split(' ') - let best: string[] = [text] - let bestLong = Infinity - for (let i = 1; i < words.length; i++) { - const lines = [words.slice(0, i).join(' '), words.slice(i).join(' ')] - const long = Math.max(...lines.map((l) => l.length)) - if (long < bestLong) { - best = lines - bestLong = long - } - } - return best -} diff --git a/web/src/learn/progress.ts b/web/src/learn/progress.ts deleted file mode 100644 index b1b154ff..00000000 --- a/web/src/learn/progress.ts +++ /dev/null @@ -1,210 +0,0 @@ -/** - * Fortschritt im Lernbereich. Er steht nur in `learnProgress.json` im Workspace; der Browser merkt sich - * ihn nicht (nur den Ordner). Ohne Workspace gilt er bis zum Neuladen. - */ - -/** Selbsteinschätzung: Sonne = kann ich sicher, Wolke = teilweise, Regenschirm = noch nicht. */ -export type Rating = 'sun' | 'cloud' | 'umbrella' - -export interface LessonProgress { - step: number - done?: boolean - /** Selbsteinschätzung je Checklistenpunkt; `true` stammt aus der Zeit der Häkchen und gilt als Sonne. */ - checks?: Record - /** Gewählte Antwort je Frage („Block-Frage“ → Antwortindex). */ - quiz?: Record -} - -export interface ExerciseProgress { - done?: boolean - /** Letzter Stand des Diagramms als .visustruct-XML. */ - xml?: string -} - -interface Store { - lessons: Record - exercises: Record - /** Zuletzt geöffnete Ansicht. */ - view?: { tab: string; lesson?: string; task?: string } -} - -/** Früher lag der Lernstand zusätzlich im Browser; dieser Rest wird beim Start gelöscht. */ -const legacyKey = 'visustruct.learn.progress' - -/** Umbenannte Lektionen (alte Kennung → neue), damit der Fortschritt erhalten bleibt. */ -const renamedLessons: Record = { - '04-sequenz': '05-sequenz', - '05-variablen-und-datentypen': '04-variablen-und-datentypen', - '07-verzweigung': '08-verzweigung', - '08-bedingungen-verknuepfen': '09-bedingungen-verknuepfen', - '09-fallauswahl': '10-fallauswahl', - '10-while-schleife': '11-while-schleife', - '11-do-while-schleife': '12-do-while-schleife', - '12-for-schleife': '13-for-schleife', - '13-verschachteln': '14-verschachteln', - '14-arrays': '15-arrays', - '15-aufruf-und-aussprung': '18-aufruf-und-aussprung', - '16-aufruf-und-aussprung': '18-aufruf-und-aussprung', - '17-aufruf-und-aussprung': '18-aufruf-und-aussprung', - '17-suchen-und-sortieren': '19-suchen-und-sortieren', - '18-suchen-und-sortieren': '19-suchen-und-sortieren', - '16-simulation-und-schreibtischtest': '07-simulation-und-schreibtischtest', - '17-java': '20-java', - '18-java': '20-java', - '19-java': '20-java', - '18-python-und-javascript': '21-python-und-javascript', - '19-python-und-javascript': '21-python-und-javascript', - '20-python-und-javascript': '21-python-und-javascript', - '22-erstes-fenster': '28-erstes-fenster', - '23-knopf-im-fenster': '29-knopf-im-fenster', - '24-der-knopf-reagiert': '30-der-knopf-reagiert', - '23-erstes-fenster': '28-erstes-fenster', - '24-knopf-im-fenster': '29-knopf-im-fenster', - '25-der-knopf-reagiert': '30-der-knopf-reagiert', - '26-zahl-verdoppeln': '31-zahl-verdoppeln', - '27-klickzaehler': '32-klickzaehler', - '28-ampel': '33-ampel', - '29-notenrechner': '34-notenrechner', - '30-taschenrechner': '35-taschenrechner', - '31-zahlenraten': '36-zahlenraten', - // VisuBot ab 0.4.4 (neue Lektion 13 Einzelne LEDs) und ab 0.5 (Grundlagen-Lektionen 3, 9, 17, 19, 22) - '13-lautsprecher': '16-lautsprecher', - '14-bildschirm': '18-bildschirm', - '15-motoren': '20-motoren', - '16-stoppuhr-akku': '21-stoppuhr-akku', - '03-sensoren': '04-sensoren', - '04-bis-zur-wand': '05-bis-zur-wand', - '05-abstand': '06-abstand', - '06-linie': '07-linie', - '07-farben': '08-farben', - '08-tasten-joystick': '10-tasten-joystick', - '09-licht': '11-licht', - '10-lautstaerke': '12-lautstaerke', - '11-neigung': '13-neigung', - '12-leds': '14-leds', - '13-einzelne-leds': '15-einzelne-leds', - '14-lautsprecher': '16-lautsprecher', - '15-bildschirm': '18-bildschirm', - '16-motoren': '20-motoren', - '17-stoppuhr-akku': '21-stoppuhr-akku', -} - -function migrate(s: Store): Store { - const lessons = { ...s.lessons } - for (const [old, now] of Object.entries(renamedLessons)) { - if (s.lessons[old] && !s.lessons[now]) lessons[now] = s.lessons[old] - if (s.lessons[old]) delete lessons[old] - } - const view = s.view?.lesson && renamedLessons[s.view.lesson] ? { ...s.view, lesson: renamedLessons[s.view.lesson] } : s.view - return { ...s, lessons, view } -} - -function forgetLegacy() { - try { - localStorage.removeItem(legacyKey) - } catch { - /* ohne Speicher: nichts zu löschen */ - } -} - -const empty = (): Store => ({ lessons: {}, exercises: {} }) - -forgetLegacy() -let store = empty() -const listeners = new Set<() => void>() - -function save() { - for (const f of listeners) f() -} - -/** Kennung der Lernstand-Datei, damit eine fremde JSON-Datei nicht eingelesen wird. */ -export const progressFormat = 'visustruct-lernstand' - -function or(a?: boolean, b?: boolean): boolean | undefined { - return a || b || undefined -} - -function mergeLesson(mine: LessonProgress | undefined, theirs: LessonProgress): LessonProgress { - if (!mine) return theirs - const checks = { ...theirs.checks } - for (const [k, v] of Object.entries(mine.checks ?? {})) checks[k] = v || checks[k] || false - return { - step: Math.max(mine.step ?? 0, theirs.step ?? 0), - done: or(mine.done, theirs.done), - checks: Object.keys(checks).length ? checks : undefined, - quiz: mine.quiz || theirs.quiz ? { ...theirs.quiz, ...mine.quiz } : undefined, - } -} - -/** Zwei Stände zusammenführen: erledigt bleibt erledigt, der weiteste Schritt zählt, eigene Diagramme gehen vor. */ -export function mergeProgress(mine: Pick, theirs: Pick) { - const lessons = { ...mine.lessons } - for (const [id, l] of Object.entries(theirs.lessons)) lessons[id] = mergeLesson(mine.lessons[id], l) - const exercises = { ...mine.exercises } - for (const [id, e] of Object.entries(theirs.exercises)) { - const m = mine.exercises[id] - exercises[id] = m ? { done: or(m.done, e.done), xml: m.xml ?? e.xml } : e - } - return { lessons, exercises } -} - -export const progress = { - lesson(id: string): LessonProgress { - return store.lessons[id] ?? { step: 0 } - }, - updateLesson(id: string, change: Partial) { - store.lessons[id] = { ...progress.lesson(id), ...change } - save() - }, - exercise(id: string): ExerciseProgress { - return store.exercises[id] ?? {} - }, - updateExercise(id: string, change: Partial) { - store.exercises[id] = { ...progress.exercise(id), ...change } - save() - }, - resetExercise(id: string) { - delete store.exercises[id] - save() - }, - view() { - return store.view - }, - /** Schon etwas gelernt oder geübt (z. B. für die Warnung beim Schließen ohne Ordner)? */ - hasContent(): boolean { - return Object.values(store.lessons).some((l) => l.step > 0 || l.done || l.checks || l.quiz) || Object.keys(store.exercises).length > 0 - }, - setView(view: Store['view']) { - store.view = view - save() - }, - /** Bei jeder Änderung, z. B. um die Datei im Workspace nachzuziehen. */ - onChange(f: () => void): () => void { - listeners.add(f) - return () => listeners.delete(f) - }, - /** Inhalt von `learnProgress.json`. */ - toFile(): string { - return JSON.stringify({ format: progressFormat, version: 1, saved: new Date().toISOString(), lessons: store.lessons, exercises: store.exercises, view: store.view }, null, 2) - }, - /** - * `learnProgress.json` übernehmen: Die Datei ersetzt den Stand, nur mit `keepSession` kommt hinzu, was in dieser - * Sitzung vor dem Öffnen des Workspace gelernt wurde. Falsche Dateien bleiben unbeachtet. - */ - loadFile(text: string, keepSession = false): boolean { - let data: Partial & { format?: string } - try { - data = JSON.parse(text) as typeof data - } catch { - return false - } - if (data?.format !== progressFormat) return false - const file = migrate({ lessons: data.lessons ?? {}, exercises: data.exercises ?? {}, view: data.view }) - store = keepSession ? { ...mergeProgress(store, file), view: file.view ?? store.view } : file - return true - }, - /** Neuer Workspace ohne Datei: mit leerem Lernstand beginnen (bzw. den dieser Sitzung behalten). */ - clear() { - store = empty() - }, -} diff --git a/web/src/learn/rescueGame.ts b/web/src/learn/rescueGame.ts deleted file mode 100644 index 2ca15992..00000000 --- a/web/src/learn/rescueGame.ts +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Spiel „Prinzessin retten“ (Block `::: spiel prinzessin`): An jeder Station kommt eine Zahl heraus, - * `alphabet.charAt(zahl)` macht daraus einen Buchstaben, der ein Feld im Kreuzworträtsel füllt. Die markierten - * Felder des Rätsels ergeben das geheime Wort, das am Ende das Tor öffnet. - * - * Format (Schlüsselwörter auf Deutsch, auch in den Übersetzungen): - * - * titel: Spiel: Prinzessin retten - * intro: Der Fuchs hat … - * alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ (ohne Angabe A bis Z) - * - * station: Am Burggraben (Name der Station) - * String name = " Zora "; (Code, mit vier Leerzeichen eingerückt) - * frage: Welche Zahl steht in `zahl`? - * zahl: 4 - * feld: 5 1 (Zeile und Spalte im Rätsel, ab 1) - * tipp: … (nach einer falschen Antwort) - * > Erklärung - * - * kreuzwort: Löse das Rätsel … (Text über dem Rätsel) - * - → 1 3 BOOLEAN: Datentyp für wahr oder falsch (→ waagrecht, ↓ senkrecht, Zeile, Spalte) - * lösung: 1 3, 4 3 (Felder des geheimen Worts in seiner Reihenfolge) - * - * tor: Vor dir ist das Tor … (Text vor dem Schloss) - * if (eingabe.equals("???")) { (Code, ___ wird zum Eingabefeld) - * ende: Zora ist frei! - */ - -export interface RescueStation { - name: string - code: string - question: string - answer: number - /** Feld im Rätsel (ab 0). */ - row: number - col: number - hint: string - explanation: string -} - -export interface CrosswordWord { - /** Nummer im Rätsel, wie sie im Feld steht. */ - number: number - across: boolean - row: number - col: number - word: string - clue: string -} - -export interface RescueGame { - title: string - intro: string - alphabet: string - stations: RescueStation[] - crosswordText: string - rows: number - cols: number - words: CrosswordWord[] - /** Felder des geheimen Worts (ab 0). */ - solution: { row: number; col: number }[] - keyword: string - gateText: string - gateCode: string - end: string -} - -export class RescueGameError extends Error {} - -export const gatePlaceholder = '___' - -/** Das Rätsel als Gitter: `grid[zeile][spalte]` ist der Buchstabe oder `''`. */ -export function crosswordGrid(game: Pick): string[][] { - const grid = Array.from({ length: game.rows }, () => Array(game.cols).fill('')) - for (const w of game.words) [...w.word].forEach((c, k) => (grid[w.row + (w.across ? 0 : k)][w.col + (w.across ? k : 0)] = c)) - return grid -} - -export function parseRescueGame(lines: string[], file: string): RescueGame { - const fail = (msg: string): never => { - throw new RescueGameError(`${file}: ${msg}`) - } - const cell = (text: string, where: string) => { - const m = /^(\d+)\s+(\d+)$/.exec(text.trim()) - if (!m || Number(m[1]) < 1 || Number(m[2]) < 1) return fail(`${where}: „${text}“ ist kein Feld (Zeile Spalte, ab 1).`) - return { row: Number(m[1]) - 1, col: Number(m[2]) - 1 } - } - let title = '' - let intro = '' - let alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - let crosswordText = '' - let gateText = '' - let gateCode = '' - let end = '' - const stations: (Omit & { answer?: number; row?: number; col?: number })[] = [] - const raw: RawWord[] = [] - let solution: { row: number; col: number }[] = [] - /** Wohin eingerückte Zeilen gehören. */ - let codeTarget: 'station' | 'gate' | undefined - let section: 'start' | 'station' | 'crossword' | 'gate' = 'start' - for (const line of lines) { - const text = line.trim() - if (codeTarget && (/^( {4}|\t)/.test(line) || text === '')) { - const code = line.replace(/^( {4}|\t)/, '') - if (codeTarget === 'station') { - const s = stations[stations.length - 1] - s.code += (s.code ? '\n' : '') + code - } else gateCode += (gateCode ? '\n' : '') + code - continue - } - codeTarget = undefined - if (!text) continue - const key = /^(titel|intro|alphabet|station|frage|zahl|feld|tipp|kreuzwort|lösung|loesung|tor|ende):\s*(.*)$/.exec(text) - if (key) { - const [, name, value] = key - if (name === 'station') { - stations.push({ name: value, code: '', question: '', hint: '', explanation: '' }) - section = 'station' - codeTarget = 'station' - } else if (name === 'kreuzwort') { - crosswordText = value - section = 'crossword' - } else if (name === 'tor') { - gateText = value - section = 'gate' - codeTarget = 'gate' - } else if (name === 'titel') title = value - else if (name === 'intro') intro = value - else if (name === 'alphabet') alphabet = value - else if (name === 'ende') end = value - else if (name === 'lösung' || name === 'loesung') { - if (section !== 'crossword') fail('„lösung:“ gehört zum Kreuzworträtsel.') - solution = value.split(',').map((c) => cell(c, 'lösung')) - } else { - if (section !== 'station') fail(`„${name}:“ gehört in eine Station.`) - const s = stations[stations.length - 1] - if (name === 'frage') s.question = value - else if (name === 'tipp') s.hint = value - else if (name === 'zahl') s.answer = /^-?\d+$/.test(value) ? Number(value) : fail(`Station „${s.name}“: „zahl:“ muss eine ganze Zahl sein.`) - else Object.assign(s, cell(value, `Station „${s.name}“`)) - } - continue - } - if (section === 'crossword') { - raw.push(crosswordWord(text, fail)) - continue - } - if (section === 'station' && text.startsWith('>')) { - const s = stations[stations.length - 1] - s.explanation += (s.explanation ? ' ' : '') + text.slice(1).trim() - continue - } - fail(`Unbekannte Zeile im Spiel: „${text}“`) - } - - if (!title) fail('Das Spiel braucht eine Zeile „titel:“.') - if (!stations.length) fail('Das Spiel braucht mindestens eine „station:“.') - if (!raw.length) fail('Das Spiel braucht ein „kreuzwort:“ mit Wörtern.') - if (!solution.length) fail('Das Kreuzworträtsel braucht eine Zeile „lösung:“.') - if (!gateCode.includes(gatePlaceholder)) fail(`Der Code bei „tor:“ braucht ${gatePlaceholder} für das Eingabefeld.`) - if (new Set(alphabet).size !== alphabet.length) fail('Im Alphabet kommt ein Zeichen doppelt vor.') - - const { rows, cols, words, keyword, grid } = layoutCrossword(raw, solution, fail) - const letterAt = (r: number, c: number) => grid[r]?.[c] ?? '' - - const checked = stations.map((s) => { - if (!s.code) fail(`Station „${s.name}“: Code fehlt.`) - if (!s.question) fail(`Station „${s.name}“: „frage:“ fehlt.`) - if (s.answer === undefined) fail(`Station „${s.name}“: „zahl:“ fehlt.`) - if (s.row === undefined) fail(`Station „${s.name}“: „feld:“ fehlt.`) - const letter = alphabet.charAt(s.answer!) - if (!letter) fail(`Station „${s.name}“: alphabet.charAt(${s.answer}) gibt es nicht.`) - const target = letterAt(s.row!, s.col!) - if (target !== letter) fail(`Station „${s.name}“: alphabet.charAt(${s.answer}) ist ${letter}, im Feld ${s.row! + 1} ${s.col! + 1} steht aber „${target}“.`) - s.code = s.code.replace(/\n+$/, '') - return s as RescueStation - }) - return { title, intro, alphabet, stations: checked, crosswordText, rows, cols, words, solution, keyword, gateText, gateCode: gateCode.replace(/\n+$/, ''), end } -} - -type RawWord = { across: boolean; row: number; col: number; word: string; clue: string } - -/** Zeile eines Rätselworts: `- → 1 3 STRING: Hinweis` (→ waagrecht, ↓ senkrecht, Zeile, Spalte ab 1). */ -const crosswordLine = /^-\s+([→↓])\s+(\d+)\s+(\d+)\s+([A-ZÄÖÜ]+):\s*(.+)$/u - -function crosswordWord(text: string, fail: (msg: string) => never): RawWord { - const m = crosswordLine.exec(text) - if (!m) fail(`Kreuzworträtsel: „${text}“ verstehe ich nicht (z. B. „- → 1 3 STRING: Hinweis“).`) - return { across: m![1] === '→', row: Number(m![2]) - 1, col: Number(m![3]) - 1, word: m![4], clue: m![5] } -} - -/** Wörter ins Gitter legen (Kreuzungen müssen passen), nummerieren und das geheime Wort ablesen. */ -function layoutCrossword(raw: RawWord[], solution: { row: number; col: number }[], fail: (msg: string) => never) { - // Wörter ins Gitter legen: Kreuzungen müssen passen. - const rows = Math.max(...raw.map((w) => w.row + (w.across ? 1 : w.word.length))) - const cols = Math.max(...raw.map((w) => w.col + (w.across ? w.word.length : 1))) - const grid = Array.from({ length: rows }, () => Array(cols).fill('')) - for (const w of raw) { - ;[...w.word].forEach((c, k) => { - const r = w.row + (w.across ? 0 : k) - const col = w.col + (w.across ? k : 0) - if (grid[r][col] && grid[r][col] !== c) fail(`Kreuzworträtsel: ${w.word} passt in Zeile ${r + 1}, Spalte ${col + 1} nicht (dort steht ${grid[r][col]}).`) - grid[r][col] = c - }) - } - // Nummern wie in der Zeitung: von oben nach unten, links nach rechts; zwei Wörter im selben Feld teilen sich eine. - const starts = [...new Set(raw.map((w) => w.row * cols + w.col))].sort((a, b) => a - b) - const words: CrosswordWord[] = raw.map((w) => ({ ...w, number: starts.indexOf(w.row * cols + w.col) + 1 })) - const letterAt = (r: number, c: number) => grid[r]?.[c] ?? '' - - const keyword = solution - .map(({ row, col }) => letterAt(row, col) || fail(`lösung: In Zeile ${row + 1}, Spalte ${col + 1} ist kein Feld.`)) - .join('') - - return { rows, cols, words, keyword, grid } -} - -/** - * Spiel „Begriffe-Rätsel“ (Block `::: spiel kreuzwort`): ein Kreuzworträtsel mit Fachbegriffen, die markierten - * Felder ergeben ein Lösungswort. - * - * titel: Spiel: Begriffe-Rätsel - * intro: Fülle das Rätsel mit Fachbegriffen … - * - → 1 3 SENSOR: Bauteil, das etwas misst (→ waagrecht, ↓ senkrecht, Zeile, Spalte ab 1) - * lösung: 1 3, 4 3 (Felder des Lösungsworts in seiner Reihenfolge) - * ende: Gelöst! … (Text nach dem Lösen) - */ -export interface CrosswordGame { - title: string - intro: string - rows: number - cols: number - words: CrosswordWord[] - solution: { row: number; col: number }[] - keyword: string - end: string -} - -export function parseCrosswordGame(lines: string[], file: string): CrosswordGame { - const fail = (msg: string): never => { - throw new RescueGameError(`${file}: ${msg}`) - } - let title = '' - let intro = '' - let end = '' - let solution: { row: number; col: number }[] = [] - const raw: RawWord[] = [] - for (const line of lines) { - const text = line.trim() - if (!text) continue - const key = /^(titel|intro|lösung|loesung|ende):\s*(.*)$/.exec(text) - if (key) { - const [, name, value] = key - if (name === 'titel') title = value - else if (name === 'intro') intro = value - else if (name === 'ende') end = value - else - solution = value.split(',').map((c) => { - const m = /^(\d+)\s+(\d+)$/.exec(c.trim()) - if (!m || Number(m[1]) < 1 || Number(m[2]) < 1) return fail(`lösung: „${c.trim()}“ ist kein Feld (Zeile Spalte, ab 1).`) - return { row: Number(m[1]) - 1, col: Number(m[2]) - 1 } - }) - continue - } - if (text.startsWith('-')) raw.push(crosswordWord(text, fail)) - else fail(`Unbekannte Zeile im Spiel: „${text}“`) - } - if (!title) fail('Das Spiel braucht eine Zeile „titel:“.') - if (raw.length < 2) fail('Das Rätsel braucht mindestens zwei Wörter.') - if (!solution.length) fail('Das Rätsel braucht eine Zeile „lösung:“.') - const { rows, cols, words, keyword } = layoutCrossword(raw, solution, fail) - return { title, intro, rows, cols, words, solution, keyword, end } -} diff --git a/web/src/learn/roundGame.ts b/web/src/learn/roundGame.ts deleted file mode 100644 index 86079029..00000000 --- a/web/src/learn/roundGame.ts +++ /dev/null @@ -1,581 +0,0 @@ -/** - * Rundenspiele zu Swing (Block `::: spiel zuhoerer|vertrag|layout`): In jeder Runde Code zeigen, eine - * Frage mit Antworten stellen und die richtige Antwort erklären. - * - * - `zuhoerer` („Wer hört zu?“): Ein nachgebautes Fenster mit den Knöpfen aus dem Code. Nach der Antwort - * werden die Klicks abgespielt: Das Ereignis läuft zum Zuhörer, dessen Zeilen leuchten auf. - * - `vertrag` („Vertrag erfüllt?“): Klassen, die ein Interface erfüllen sollen. - * - `layout` („Wo landet der Knopf?“): Die Antworten sind kleine Fenster (`grid: A B / C D`, …). - * - `bombe` („Bombe entschärfen“): Code mit genau einer falschen Zeile und ein Countdown (`zeit:` Sekunden je - * Runde). Man tippt auf die Zeile; `fehler:` ist ihre Nummer (ab 1), `besser:` die richtige Zeile. Mit `daten: csv` - * ist der „Code“ eine CSV-Datei statt Java. Mit `stelle:` (z. B. `stelle: i++`) tippt man in dieser Runde nicht - * ganze Zeilen an, sondern Teile davon (siehe `bombParts`); `stelle:` ist der falsche Teil der Zeile `fehler:`. - * - `frage`: Code (auch leer) und eine Frage mit Antworten. `\n` in einer Antwort beginnt eine neue Zeile; solche - * Antworten erscheinen als kleine Datei. - * - `reihenfolge` („Wer ist dran?“): Die Antworten stehen in der richtigen Reihenfolge da (ohne `[x]`), das Spiel - * mischt sie. Man tippt sie der Reihe nach an; ein falscher Tipp beendet die Runde. - * - * Format (Schlüsselwörter wie in den anderen Blöcken auf Deutsch, auch in den Übersetzungen): - * - * titel: Spiel: Vertrag erfüllt? - * intro: Ludwig zeigt dir … - * antworten: erfüllt | nicht erfüllt (für alle Runden, dann je Runde `richtig: …`) - * frage: … (für alle Runden, je Runde überschreibbar) - * - * runde: - * Code, mit vier Leerzeichen eingerückt - * klicks: A, B (nur zuhoerer: Beschriftungen der Knöpfe) - * fehler: 2 (nur bombe, statt Antworten) - * besser: System.out.println(i); (nur bombe) - * - Antwort - * - [x] richtige Antwort - * > Erklärung - */ - -export type RoundGameKind = 'zuhoerer' | 'vertrag' | 'layout' | 'bombe' | 'frage' | 'reihenfolge' - -export interface RoundOption { - text: string - right: boolean -} - -export interface Round { - code: string - question: string - options: RoundOption[] - explanation: string - /** Beschriftungen der geklickten Knöpfe (nur `zuhoerer`). */ - clicks: string[] - /** Nur `bombe`: Nummer der falschen Zeile (ab 1) und die richtige Zeile. */ - wrongLine?: number - fix?: string - /** Nur `bombe`: Der falsche Teil der Zeile (`stelle:`); dann tippt man Teile statt ganzer Zeilen an. */ - wrongPart?: string -} - -export interface RoundGame { - kind: RoundGameKind - title: string - intro: string - /** Nur `bombe`: Sekunden je Runde. */ - seconds?: number - /** Nur `bombe`: Was in den Runden steht, Java (Standard) oder eine CSV-Datei. */ - data?: 'csv' - rounds: Round[] -} - -export class RoundGameError extends Error {} - -export function isRoundGameKind(arg: string): arg is RoundGameKind { - return arg === 'zuhoerer' || arg === 'vertrag' || arg === 'layout' || arg === 'bombe' || arg === 'frage' || arg === 'reihenfolge' -} - -export function parseRoundGame(kind: RoundGameKind, lines: string[], file: string): RoundGame { - const fail = (msg: string): never => { - throw new RoundGameError(`${file}: ${msg}`) - } - let title = '' - let intro = '' - let question = '' - let answers: string[] = [] - let seconds: number | undefined - let data: 'csv' | undefined - const rounds: (Round & { rightText?: string })[] = [] - let current: (Round & { rightText?: string }) | undefined - let inCode = false - for (const raw of lines) { - const line = raw.trim() - if (current && inCode && (/^ {4}|^\t/.test(raw) || line === '')) { - current.code += (current.code ? '\n' : '') + raw.replace(/^( {4}|\t)/, '') - continue - } - inCode = false - if (!line) continue - const key = /^(titel|intro|antworten|frage|runde|klicks|richtig|zeit|fehler|besser|daten|stelle):\s*(.*)$/.exec(line) - if (key) { - const [, name, value] = key - if (name === 'runde') { - current = { code: '', question, options: [], explanation: '', clicks: [] } - rounds.push(current) - inCode = true - } else if (!current) { - if (name === 'titel') title = value - else if (name === 'intro') intro = value - else if (name === 'antworten') answers = value.split('|').map((a) => a.trim()) - else if (name === 'frage') question = value - else if (name === 'zeit') seconds = Number(value) - else if (name === 'daten') data = value === 'csv' ? value : fail(`„daten:“ kennt nur „csv“.`) - else fail(`„${name}:“ gehört in eine Runde.`) - } else if (name === 'frage') current.question = value - else if (name === 'fehler') current.wrongLine = Number(value) - else if (name === 'besser') current.fix = value - else if (name === 'stelle') current.wrongPart = value.trim() - else if (name === 'klicks') current.clicks = value.split(',').map((c) => c.trim()).filter(Boolean) - else if (name === 'richtig') current.rightText = value - else fail(`„${name}:“ gehört vor die erste Runde.`) - continue - } - if (!current) fail(`Unbekannte Zeile vor der ersten Runde: „${line}“`) - const round = current! - const option = /^-\s+(\[x\]\s+)?(.+)$/.exec(line) - if (option) round.options.push({ text: option[2].trim().replaceAll('\\n', '\n'), right: !!option[1] }) - else if (line.startsWith('>')) round.explanation += (round.explanation ? ' ' : '') + line.slice(1).trim() - else fail(`Unbekannte Zeile im Spiel: „${line}“`) - } - if (!title) fail('Das Spiel braucht eine Zeile „titel:“.') - if (!rounds.length) fail('Das Spiel braucht mindestens eine „runde:“.') - rounds.forEach((round, i) => { - round.code = round.code.replace(/\n+$/, '') - if (kind === 'bombe') { - const lines = round.code.split('\n') - const n = round.wrongLine - if (!n || !Number.isInteger(n) || n < 1 || n > lines.length || !lines[n - 1].trim()) fail(`Runde ${i + 1}: „fehler:“ muss eine Zeile des Codes sein.`) - if (!round.fix) fail(`Runde ${i + 1}: „besser:“ fehlt.`) - if (round.options.length) fail(`Runde ${i + 1}: Bei „bombe“ gibt es keine Antworten, man tippt auf die Zeile.`) - if (!round.question) fail(`Runde ${i + 1}: keine Frage.`) - if (round.wrongPart !== undefined) { - if (data) fail(`Runde ${i + 1}: „stelle:“ geht nur bei Java, nicht bei CSV.`) - const parts = bombParts(lines[n! - 1]).filter((s) => s.part).map((s) => s.text) - if (parts.filter((p) => p === round.wrongPart).length !== 1) - fail(`Runde ${i + 1}: „stelle: ${round.wrongPart}“ ist kein Teil der Zeile ${n}. Teile: ${parts.map((p) => `„${p}“`).join(', ')}`) - } - return - } - if (kind === 'reihenfolge') { - if (round.options.length < 3) fail(`Runde ${i + 1}: „reihenfolge“ braucht mindestens drei Schritte.`) - if (round.options.some((o) => o.right)) fail(`Runde ${i + 1}: Bei „reihenfolge“ gibt es kein [x], die Schritte stehen der Reihe nach da.`) - if (new Set(round.options.map((o) => o.text)).size !== round.options.length) fail(`Runde ${i + 1}: zwei Schritte sind gleich.`) - if (!round.question) fail(`Runde ${i + 1}: keine Frage.`) - return - } - if (!round.options.length) { - if (!answers.length) fail(`Runde ${i + 1}: keine Antworten.`) - if (!round.rightText || !answers.includes(round.rightText)) fail(`Runde ${i + 1}: „richtig:“ muss eine der Antworten sein.`) - round.options = answers.map((text) => ({ text, right: text === round.rightText })) - } - if (round.options.filter((o) => o.right).length !== 1) fail(`Runde ${i + 1}: genau eine Antwort muss richtig sein.`) - if (!round.question) fail(`Runde ${i + 1}: keine Frage.`) - if (kind === 'layout') round.options.forEach((o) => parseLayoutPicture(o.text, `Runde ${i + 1}`, fail)) - if (kind === 'zuhoerer') { - try { - const window = parseSwingWindow(round.code) - for (const c of round.clicks) if (!window.buttons.some((b) => b.caption === c)) fail(`Runde ${i + 1}: Knopf „${c}“ gibt es nicht.`) - simulate(window, round.clicks) - } catch (err) { - if (err instanceof RoundGameError) throw err - fail(`Runde ${i + 1}: ${(err as Error).message}`) - } - } - delete round.rightText - }) - if (kind === 'bombe' && !(seconds && seconds > 0)) fail('„bombe“ braucht „zeit:“ mit den Sekunden je Runde.') - return { kind, title, intro, ...(kind === 'bombe' ? { seconds, ...(data ? { data } : {}) } : {}), rounds } -} - -// MARK: - Bombe: Teile einer Zeile - -/** Ein Stück einer Codezeile; `part` heißt: Man kann es antippen. */ -export interface LineSegment { - text: string - part: boolean -} - -/** Stellen auf oberster Ebene (nicht in Klammern oder Strings), an denen `test` zutrifft. */ -function topLevel(text: string, test: (text: string, i: number) => boolean): number[] { - const hits: number[] = [] - let depth = 0 - let quote = '' - for (let i = 0; i < text.length; i++) { - const c = text[i] - if (quote) { - if (c === '\\') i++ - else if (c === quote) quote = '' - continue - } - if (c === '"' || c === "'") quote = c - else if ('([{'.includes(c)) depth++ - else if (')]}'.includes(c)) depth-- - else if (depth === 0 && test(text, i)) hits.push(i) - } - return hits -} - -/** Die passende schließende Klammer zur öffnenden an `open`, oder -1. */ -function closing(text: string, open: number): number { - let depth = 0 - let quote = '' - for (let i = open; i < text.length; i++) { - const c = text[i] - if (quote) { - if (c === '\\') i++ - else if (c === quote) quote = '' - } else if (c === '"' || c === "'") quote = c - else if ('([{'.includes(c)) depth++ - else if (')]}'.includes(c) && --depth === 0) return i - } - return -1 -} - -/** Bereiche [von, bis) zwischen den Trennstellen, ohne Leerzeichen am Rand. */ -function pieces(text: string, offset: number, cuts: number[], width: number): [number, number][] { - const out: [number, number][] = [] - let start = 0 - for (const end of [...cuts, text.length]) { - let a = start - let b = end - while (a < b && /\s/.test(text[a])) a++ - while (b > a && /\s/.test(text[b - 1])) b-- - if (b > a) out.push([offset + a, offset + b]) - start = end + width - } - return out -} - -/** Ein `+` zwischen zwei Teilen (nicht `++` oder `+=`). */ -const isPlus = (t: string, i: number) => t[i] === '+' && t[i - 1] !== '+' && t[i + 1] !== '+' && t[i + 1] !== '=' -/** Ein einzelnes `=` (keine Vergleiche wie `==`, `<=`, `!=`). */ -const isAssign = (t: string, i: number) => t[i] === '=' && !'=<>!+-*/%'.includes(t[i - 1] ?? '') && t[i + 1] !== '=' - -/** - * Teilt eine Java-Zeile für „Bombe entschärfen“ in antippbare Teile: - * - `for (start; bedingung; schritt) {` → die drei Felder, - * - `if (…)`, `while (…)` → die Bedingung, - * - `ziel = wert;` → Ziel und Wert, - * - `aufruf(a + b, c);` → Aufruf und die Argumente, Argumente zusätzlich an `+` geteilt, - * - sonst die ganze Zeile. - */ -export function bombParts(line: string): LineSegment[] { - const indent = /^\s*/.exec(line)![0] - const body = line.slice(indent.length).replace(/\s+$/, '') - const ranges = ((): [number, number][] => { - const head = /^(?:\}\s*)?(?:else\s+)?(for|if|while)\s*\(/.exec(body) - if (head) { - const open = head[0].length - 1 - const close = closing(body, open) - if (close < 0) return [] - const inner = body.slice(open + 1, close) - if (head[1] !== 'for') return pieces(inner, open + 1, [], 0) - const cuts = topLevel(inner, (t, i) => t[i] === ';') - return cuts.length === 2 ? pieces(inner, open + 1, cuts, 1) : [] - } - if (!body.endsWith(';')) return [] - const stmt = body.slice(0, -1) - const assign = topLevel(stmt, isAssign) - if (assign.length === 1) return pieces(stmt, 0, assign, 1) - if (assign.length) return [] - const open = stmt.indexOf('(') - if (open <= 0 || closing(stmt, open) !== stmt.length - 1 || /^(new|return)\b/.test(stmt)) return [] - const callee = pieces(stmt.slice(0, open), 0, [], 0) - const args = stmt.slice(open + 1, -1) - const argRanges = pieces(args, open + 1, topLevel(args, (t, i) => t[i] === ','), 1).flatMap(([a, b]) => { - const arg = stmt.slice(a, b) - return pieces(arg, a, topLevel(arg, isPlus), 1) - }) - return [...callee, ...argRanges] - })() - const whole = ranges.length ? ranges : body ? [[0, body.length] as [number, number]] : [] - const segments: LineSegment[] = indent ? [{ text: indent, part: false }] : [] - let at = 0 - for (const [a, b] of whole) { - if (a > at) segments.push({ text: body.slice(at, a), part: false }) - segments.push({ text: body.slice(a, b), part: true }) - at = b - } - if (at < body.length) segments.push({ text: body.slice(at), part: false }) - return segments -} - -// MARK: - Layout-Bilder - -export type LayoutPicture = - | { kind: 'grid'; rows: string[][] } - | { kind: 'flow'; rows: string[][] } - | { kind: 'border'; areas: Partial> } - -/** `grid: A B / C D`, `flow: A B C`, `border: N=A C=B S=C`. */ -export function parseLayoutPicture(text: string, where = '', fail: (msg: string) => never = (m) => { throw new RoundGameError(m) }): LayoutPicture { - const m = /^(grid|flow|border):\s*(.+)$/.exec(text) - if (!m) return fail(`${where}: Antwort „${text}“ ist kein Fensterbild (grid:, flow: oder border:).`) - if (m[1] === 'border') { - const areas: Partial> = {} - for (const part of m[2].split(/\s+/)) { - const a = /^([NSWEC])=(.+)$/.exec(part) - if (!a) fail(`${where}: „${part}“ im BorderLayout-Bild verstehe ich nicht (z. B. N=A).`) - areas[a![1] as 'N'] = a![2] - } - return { kind: 'border', areas } - } - const rows = m[2].split('/').map((r) => r.trim().split(/\s+/).filter(Boolean)) - return { kind: m[1] as 'grid' | 'flow', rows } -} - -// MARK: - Nachgebautes Fenster für „Wer hört zu?“ - -export interface SwingButton { - name: string - caption: string -} - -export interface SwingListener { - button: string - /** Zeilen des Zuhörers im Code (ab 0, einschließlich). */ - from: number - to: number - statements: SwingStatement[] -} - -/** Eine Anweisung im Zuhörer: einfach (`text.setText(…)`) oder `if (…) { … } else { … }`. */ -export type SwingStatement = string | { condition: string; then: SwingStatement[]; otherwise: SwingStatement[] } - -export interface SwingWindow { - title: string - buttons: SwingButton[] - /** Beschriftungen (JLabel) mit ihrem Starttext, in der Reihenfolge im Code. */ - labels: { name: string; text: string }[] - ints: Record - listeners: SwingListener[] -} - -const str = '"((?:[^"\\\\]|\\\\.)*)"' - -/** - * Liest Knöpfe, Beschriftungen, int-Variablen und Zuhörer aus einfachem Swing-Code. Ein Zuhörer steht direkt am - * Knopf (`knopf.addActionListener(e -> …)`) oder als Variable (`ActionListener z = e -> …;`), die mit - * `knopf.addActionListener(z);` an mehreren Knöpfen hängen kann. - */ -export function parseSwingWindow(code: string): SwingWindow { - const lines = code.split('\n') - const win: SwingWindow = { title: '', buttons: [], labels: [], ints: {}, listeners: [] } - const named = new Map>() - /** Zuhörer ab Zeile i, `rest` ist der Text hinter dem Pfeil; `end` schließt einen Block ab (`});` oder `};`). */ - const lambda = (i: number, rest: string, end: string): Omit => { - if (rest.startsWith('{')) { - let j = i + 1 - const body: string[] = [] - while (j < lines.length && lines[j].trim() !== end) body.push(lines[j++].trim()) - if (j >= lines.length) throw new Error(`Dem Zuhörer fehlt „${end}“.`) - return { from: i, to: j, statements: parseStatements(body.join(' ')) } - } - const inner = end === '});' ? rest.replace(/\)\s*;\s*$/, '') : rest.replace(/;\s*$/, '') - return { from: i, to: i, statements: parseStatements(inner) } - } - const button = (name: string) => { - if (!win.buttons.some((b) => b.name === name)) throw new Error(`Knopf ${name} ist nicht angelegt.`) - return name - } - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim() - let m: RegExpExecArray | null - if ((m = new RegExp(`^JFrame\\s+\\w+\\s*=\\s*new JFrame\\(${str}\\)`).exec(line))) win.title = m[1] - else if ((m = new RegExp(`^JButton\\s+(\\w+)\\s*=\\s*new JButton\\(${str}\\)`).exec(line))) win.buttons.push({ name: m[1], caption: m[2] }) - else if ((m = new RegExp(`^JLabel\\s+(\\w+)\\s*=\\s*new JLabel\\(${str}`).exec(line))) win.labels.push({ name: m[1], text: m[2] }) - else if ((m = /^(?:static\s+)?int\s+(\w+)\s*=\s*(-?\d+)\s*;/.exec(line))) win.ints[m[1]] = Number(m[2]) - else if ((m = /^ActionListener\s+(\w+)\s*=\s*\w+\s*->\s*(.*)$/.exec(line))) { - const listener = lambda(i, m[2], '};') - named.set(m[1], listener) - i = listener.to - } else if ((m = /^(\w+)\.addActionListener\(\s*(\w+)\s*\)\s*;$/.exec(line))) { - const listener = named.get(m[2]) - if (!listener) throw new Error(`Zuhörer ${m[2]} ist nicht angelegt.`) - win.listeners.push({ button: button(m[1]), ...listener }) - } else if ((m = /^(\w+)\.addActionListener\(\s*\w+\s*->\s*(.*)$/.exec(line))) { - const listener = lambda(i, m[2], '});') - win.listeners.push({ button: button(m[1]), ...listener }) - i = listener.to - } - } - return win -} - -/** Zerlegt den Rumpf eines Zuhörers in Anweisungen, `if`/`else` mit oder ohne geschweifte Klammern. */ -function parseStatements(text: string): SwingStatement[] { - const out: SwingStatement[] = [] - let pos = 0 - const skip = () => { - while (pos < text.length && /\s/.test(text[pos])) pos++ - } - /** Text bis zur passenden schließenden Klammer; `pos` steht auf der öffnenden. */ - const balanced = (open: string, close: string): string => { - let depth = 0 - let quote = false - const start = pos + 1 - for (; pos < text.length; pos++) { - const c = text[pos] - if (quote) { - if (c === '\\') pos++ - else if (c === '"') quote = false - } else if (c === '"') quote = true - else if (c === open) depth++ - else if (c === close && --depth === 0) return text.slice(start, pos++) - } - throw new Error(`Es fehlt „${close}“.`) - } - /** Eine einfache Anweisung bis zum Semikolon außerhalb von Klammern und Text. */ - const simple = (): string => { - let depth = 0 - let quote = false - const start = pos - for (; pos < text.length; pos++) { - const c = text[pos] - if (quote) { - if (c === '\\') pos++ - else if (c === '"') quote = false - } else if (c === '"') quote = true - else if (c === '(') depth++ - else if (c === ')') depth-- - else if (c === ';' && depth === 0) return text.slice(start, pos++).trim() - } - return text.slice(start).trim() - } - const one = (): SwingStatement[] => { - skip() - if (text[pos] === '{') return parseStatements(balanced('{', '}')) - if (/^if\s*\(/.test(text.slice(pos))) { - pos = text.indexOf('(', pos) - const condition = balanced('(', ')').trim() - const then = one() - skip() - let otherwise: SwingStatement[] = [] - if (/^else\b/.test(text.slice(pos))) { - pos += 4 - otherwise = one() - } - return [{ condition, then, otherwise }] - } - const s = simple() - return s ? [s] : [] - } - for (skip(); pos < text.length; skip()) out.push(...one()) - return out -} - -export interface ClickStep { - button: string - /** Zuhörer, der lief; `undefined`: Niemand hört zu. */ - listener?: SwingListener - /** Texte aller Beschriftungen und Knöpfe nach dem Klick (Name → Text). */ - texts: Record - console: string[] -} - -export interface SwingState { - texts: Record - ints: Record -} - -export function startState(win: SwingWindow): SwingState { - const texts: Record = {} - for (const b of win.buttons) texts[b.name] = b.caption - for (const l of win.labels) texts[l.name] = l.text - return { texts, ints: { ...win.ints } } -} - -/** Ein Klick auf den Knopf mit dieser Beschriftung (verändert `state`). */ -export function click(win: SwingWindow, state: SwingState, caption: string): ClickStep { - const button = win.buttons.find((b) => b.caption === caption) ?? win.buttons.find((b) => state.texts[b.name] === caption) - if (!button) throw new Error(`Knopf „${caption}“ gibt es nicht.`) - return clickButton(win, state, button.name) -} - -/** Klick auf den Knopf mit diesem Variablennamen. */ -export function clickButton(win: SwingWindow, state: SwingState, name: string): ClickStep { - const listener = win.listeners.find((l) => l.button === name) - const output: string[] = [] - // `e.getActionCommand()` ist wie in Java die Beschriftung des Knopfs beim Klick. - const event: SwingEvent = { source: name, command: state.texts[name] } - for (const s of listener?.statements ?? []) run(s, state, output, event) - return { button: name, listener, texts: { ...state.texts }, console: output } -} - -export function simulate(win: SwingWindow, clicks: string[]): ClickStep[] { - const state = startState(win) - return clicks.map((c) => click(win, state, c)) -} - -interface SwingEvent { - source: string - command: string -} - -function run(statement: SwingStatement, state: SwingState, output: string[], event: SwingEvent) { - if (typeof statement !== 'string') { - for (const s of condition(statement.condition, state, event) ? statement.then : statement.otherwise) run(s, state, output, event) - return - } - let m: RegExpExecArray | null - if ((m = /^(\w+)\.setText\((.*)\)$/.exec(statement))) { - if (!(m[1] in state.texts)) throw new Error(`${m[1]} ist keine Beschriftung und kein Knopf.`) - state.texts[m[1]] = String(evaluate(m[2], state, event)) - } else if ((m = /^System\.out\.println\((.*)\)$/.exec(statement))) output.push(String(evaluate(m[1], state, event))) - else if ((m = /^(\w+)\s*(\+\+|--)$/.exec(statement))) state.ints[intName(m[1], state)] += m[2] === '++' ? 1 : -1 - else if ((m = /^(\w+)\s*([+-]?=)\s*(.+)$/.exec(statement))) { - const name = intName(m[1], state) - const value = Number(evaluate(m[3], state, event)) - state.ints[name] = m[2] === '=' ? value : m[2] === '+=' ? state.ints[name] + value : state.ints[name] - value - } else throw new Error(`Diese Anweisung kann das Spiel nicht nachspielen: „${statement}“`) -} - -/** `e.getSource() == knopf`, `text.equals("+")`, `zahl > 3` */ -function condition(text: string, state: SwingState, event: SwingEvent): boolean { - let m: RegExpExecArray | null - if ((m = /^e\.getSource\(\)\s*(==|!=)\s*(\w+)$/.exec(text))) { - if (!(m[2] in state.texts)) throw new Error(`${m[2]} ist kein Knopf.`) - return (event.source === m[2]) === (m[1] === '==') - } - if ((m = /^(!?)(.+)\.equals\((.+)\)$/.exec(text))) return (String(evaluate(m[2], state, event)) === String(evaluate(m[3], state, event))) !== (m[1] === '!') - if ((m = /^(.+?)\s*(==|!=|<=|>=|<|>)\s*(.+)$/.exec(text))) { - const a = Number(evaluate(m[1], state, event)) - const b = Number(evaluate(m[3], state, event)) - return { '==': a === b, '!=': a !== b, '<=': a <= b, '>=': a >= b, '<': a < b, '>': a > b }[m[2]]! - } - throw new Error(`Diese Bedingung kann das Spiel nicht nachspielen: „${text}“`) -} - -function intName(name: string, state: SwingState): string { - if (!(name in state.ints)) throw new Error(`Variable ${name} ist nicht angelegt.`) - return name -} - -/** `"Text" + zahl`, `"" + (a + b)`, `zahl * 2`, `e.getActionCommand()`: von links nach rechts wie in Java. */ -function evaluate(expr: string, state: SwingState, event?: SwingEvent): string | number { - const tokens = expr.match(new RegExp(`${str}|\\d+|e\\.getActionCommand\\(\\)|\\w+(?:\\.getText\\(\\))?|[-+*/()]`, 'g')) ?? [] - let pos = 0 - const atom = (): string | number => { - const tok = tokens[pos++] - if (tok === undefined) throw new Error(`Unvollständiger Ausdruck „${expr}“`) - if (tok === '(') { - const v = sum() - pos++ - return v - } - if (tok.startsWith('"')) return JSON.parse(tok) - if (/^\d+$/.test(tok)) return Number(tok) - if (tok === 'e.getActionCommand()') { - if (!event) throw new Error('e.getActionCommand() gibt es nur im Zuhörer.') - return event.command - } - if (tok.endsWith('.getText()')) return state.texts[tok.slice(0, -10)] ?? '' - if (tok in state.ints) return state.ints[tok] - throw new Error(`Unbekannt: „${tok}“`) - } - const product = (): string | number => { - let v = atom() - while (tokens[pos] === '*' || tokens[pos] === '/') { - const op = tokens[pos++] - const r = Number(atom()) - v = op === '*' ? Number(v) * r : Math.trunc(Number(v) / r) - } - return v - } - const sum = (): string | number => { - let v = product() - while (tokens[pos] === '+' || tokens[pos] === '-') { - const op = tokens[pos++] - const r = product() - if (op === '+') v = typeof v === 'string' || typeof r === 'string' ? `${v}${r}` : v + r - else v = Number(v) - Number(r) - } - return v - } - return sum() -} diff --git a/web/src/learn/teacher.ts b/web/src/learn/teacher.ts deleted file mode 100644 index d68550fe..00000000 --- a/web/src/learn/teacher.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Lehrermodus: Mit dem Lehrercode werden die Musterlösungen sichtbar. - * Im Code steht nur der SHA-256-Hash des Lehrercodes. Das hält Schüler ab, ist aber kein echter Schutz, - * denn alles läuft im Browser. - */ - -const codeHash = 'f4ecc8e489ae7865308288c7d0fa313333cf2be3ff529b23bc214bee010310e0' -const storageKey = 'visustruct.learn.teacher' -/** Gilt auch, wenn der Browser nichts speichern darf, dann bis zum Neuladen. */ -let unlocked = false - -export function isTeacher(): boolean { - if (unlocked) return true - try { - return localStorage.getItem(storageKey) === codeHash - } catch { - return false - } -} - -async function sha256(text: string): Promise { - const bytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text)) - return [...new Uint8Array(bytes)].map((b) => b.toString(16).padStart(2, '0')).join('') -} - -/** Prüft den Code und merkt sich den Lehrermodus im Browser. */ -export async function unlockTeacher(code: string): Promise { - let ok = false - try { - ok = (await sha256(code.trim())) === codeHash - } catch { - return false - } - if (ok) { - unlocked = true - try { - localStorage.setItem(storageKey, codeHash) - } catch { - /* ohne Speicher gilt der Lehrermodus bis zum Neuladen */ - } - } - return ok -} - -export function lockTeacher(): void { - unlocked = false - try { - localStorage.removeItem(storageKey) - } catch { - /* nichts zu tun */ - } -} diff --git a/web/src/main.ts b/web/src/main.ts deleted file mode 100644 index 9baf5b86..00000000 --- a/web/src/main.ts +++ /dev/null @@ -1,85 +0,0 @@ -import './ui/styles.css' -import { App, applyCanvasStubTexts } from './ui/app' -import { installTooltips } from './ui/tooltip' -import { preferredLanguage, setCodeKeywords, setLanguage, storedCodeKeywords } from './ui/i18n' -import { setVisuBotMode, setVisuFlowWorld, setVisuObjectWorld, visuFlowWorld, visuObjectWorld } from './ui/visubotView' -import { hostWorld } from './ui/site' - -// Nach einem Update kann eine noch offene oder zwischengespeicherte Seite Dateien der alten Version -// nachladen wollen, die es nicht mehr gibt. Dann einmal neu laden statt leer zu bleiben. -const reloadKey = 'visustruct.reloadedAfterError' - -function reloadOnce(): boolean { - try { - const last = Number(sessionStorage.getItem(reloadKey)) - if (last && Date.now() - last < 30_000) return false - sessionStorage.setItem(reloadKey, String(Date.now())) - } catch { - return false - } - location.reload() - return true -} - -/** Statt einer leeren Seite: kurzer Hinweis mit Knopf zum Neuladen (Texte fest, die Übersetzungen fehlen ja evtl.). */ -function showStartupError(error: unknown) { - console.error(error) - const de = (navigator.language || '').toLowerCase().startsWith('de') - const box = document.createElement('div') - box.className = 'startup-error' - const title = document.createElement('h1') - title.textContent = de ? 'VisuStruct konnte nicht starten' : 'VisuStruct could not start' - const text = document.createElement('p') - text.textContent = de - ? 'Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).' - : 'There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).' - const button = document.createElement('button') - button.textContent = de ? 'Neu laden' : 'Reload' - button.addEventListener('click', () => location.reload()) - const detail = document.createElement('pre') - detail.textContent = String(error instanceof Error ? error.message : error) - box.append(title, text, button, detail) - ;(document.getElementById('app') ?? document.body).replaceWith(box) -} - -window.addEventListener('vite:preloadError', (event) => { - if (reloadOnce()) event.preventDefault() -}) - -// Erst die Sprache (sie übernimmt ein altes „Java (Keywords)“), dann den Schalter Code-Keywords. -const language = preferredLanguage() -Promise.all([setLanguage(language, false), setCodeKeywords(storedCodeKeywords(), false)]) - .then(() => { - applyCanvasStubTexts() - installTooltips() - // Welten VisuObject (…/app/?visuobject) und VisuFlow (?visuflow) haben eine eigene Oberfläche; ?visustruct und ?visubot wählt die App selbst. - const query = new URLSearchParams(location.search) - // Auf einer Welt-Subdomain (visubot.visucode.de …) ohne Welt in der Adresse gilt immer die Welt der Seite; gefragt wird nicht. - // VisuFlow gibt es dort nur mit ?visuflow in der Adresse. Ohne Subdomain fragt der Start-Dialog. - const anyWorld = ['visustruct', 'visubot', 'visuobject', 'visuflow'].some((k) => query.has(k)) - const site = hostWorld() - if (!anyWorld && site) { - if (site === 'visubot') setVisuBotMode('on') - else if (site === 'visuobject') setVisuObjectWorld() - else setVisuBotMode('off') - } - if (query.has('visuobject')) setVisuObjectWorld() - if (query.has('visuflow')) setVisuFlowWorld() - const root = document.getElementById('app')! - const own = !query.has('visustruct') && !query.has('visubot') - if (visuObjectWorld() && own) return import('./ui/objectApp').then(({ ObjectApp }) => void new ObjectApp(root)) - if (visuFlowWorld() && own) return import('./ui/flowApp').then(({ FlowApp }) => void new FlowApp(root)) - new App(root) - }) - .then(() => { - try { - sessionStorage.removeItem(reloadKey) - } catch { - /* egal */ - } - }) - .catch((error: unknown) => { - // Fehlende Datei nach einem Update: einmal neu laden, sonst Hinweis zeigen. - if (/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(error)) && reloadOnce()) return - showStartupError(error) - }) diff --git a/web/src/ui/app.ts b/web/src/ui/app.ts deleted file mode 100644 index b6954198..00000000 --- a/web/src/ui/app.ts +++ /dev/null @@ -1,3130 +0,0 @@ -import { canvasTextLines, setCanvasStubTexts } from '../core/diagramText' -import { worldHomeURL } from './site' -import { - appendCaseToFallauswahl, - canDeleteElement, - deleteAtPath, - elementAt, - insertAfterSibling, - insertAt, - insertBeforeSibling, - isPlaceholderSlot, - moveAfterSibling, - moveBeforeSibling, - moveReplacingPlaceholder, - newEmptyDocument, - multiwayAncestorPath, - caseIndexInMultiway, - removeCaseFromFallauswahl, - replaceAtPath, - sanitizedSelection, - setFallauswahlCaseName, - setTextLines, - tryElementAt, -} from '../core/editing' -import * as LineEditor from '../core/lineEditorText' -import { diagramDisplayMetrics, LayoutEngine, type Layout, type LayoutNode, type Rect } from '../core/layout' -import { ElementType, makeElement, type VSDocument, type VSElement } from '../core/model' -import { paletteElement, paletteItems, type PaletteItem } from '../core/palette' -import { createCanvasMeasure } from '../core/textMeasurement' -import { decodeDocument, encodeDocument } from '../core/xmlCodec' -import { DiagramRenderer, displayElement, el, flattenNodes, samePath, scopeKind } from './renderer' -import { caseLabelAt, caseLabelRect, openInlineEditor, textRect, type InlineEditor, type InlineField } from './inlineEdit' -import { CodePanel } from './codePanel' -import { BlockView, programVariables, replaceBlockSensor, statementVariables, replaceBlockValue, withCountLoopDefaults, withoutBlockIcons, type BlockDrop } from './blockView' -import { blockViewLabels } from './blockPicture' -import { freshVariable, isBoolExpression, operatorBlocks, operatorName, repeatLoopLines, variableBlocks, variableName } from 'visublocks' -import { icons } from './icons' -import { FilesPanel, type WorkspaceFile } from './filesPanel' -import { LearnPanel, sidebarIcon, type LearnHost } from './learnPanel' -import type { UiArea } from './termTips' -import { LiveCodePanel } from './liveCodePanel' -import { codeWords, countInDocument, documentVariableNames, documentWords, elementVariableNames, nameRanges, renameInDocument, variableNames } from '../core/rename' -import { askRename, showRenameMenu } from './renameDialog' -import { RobotPreviewPanel } from './robotPreview' -import { codeScopes, setCodeScopes } from './javaEditor' -import type { LiveTarget } from '../core/codeGenerator' -import { exerciseArea, type Exercise } from '../learn/lessonFormat' -import { progress } from '../learn/progress' -import { codeKeywords, currentLanguage, offeredLanguages, setCodeKeywords, setLanguage, t, type LanguageCode } from './i18n' -import * as Export from './exporter' -import { SimulationPanel } from './simulationPanel' -import { mbotLinkText, setVisuBotMode, setVisuFlowWorld, setVisuObjectWorld, visuBotBrand, toggleMBotLink, visuBotEnabled, visuBotGroupColor, visuBotGroupIcon, visuBotMode, visuBotSensors, visuBotTemplates, VisuBotView, worldChooserHTML, worldTitleHTML, worldChosen, type WorldChoice } from './visubotView' -import { canConnectMBot, mbotLink } from '../core/mbotLink' -import { uploadToMBot } from './mbotUpload' -import { lessons, tasks, useBlockLessons, useVisuBotContent, world } from '../learn/content' -import type { RobotWorldSetup } from '../core/robotWorld' -import { parseSubprogramHeader, subprogramName } from '../core/simulation' - -type DropTarget = - | { kind: 'before' | 'after' | 'replace'; path: number[]; frame: Rect } - | { kind: 'rootAppend'; frame: Rect } - /** VisuBot: Sensorwert in die Bedingung (bzw. den Text) eines Elements schreiben */ - | { kind: 'condition'; path: number[]; frame: Rect } - /** Blöcke: verschobenes Element in den Papierkorb */ - | { kind: 'trash'; frame: Rect } - /** Blöcke: Sensor genau auf ein Wertfeld bzw. einen anderen Sensor */ - | { kind: 'slot'; path: number[]; slot: 'value' | 'sensor'; index: number; frame: Rect } - -/** - * Aus der Palette: neues Element (auch die VisuBot-Befehle) samt Name für das Ziehbild, - * oder ein VisuBot-Sensor wie `mbot.getDistance()`, der in eine Bedingung wandert. - */ -type DragSource = - | { kind: 'palette'; make: () => VSElement; label: string } - | { kind: 'sensor'; text: string; label: string } - | { kind: 'move'; path: number[] } - -/** Elemente, in deren Text ein Sensorwert passt: Bedingungen und Anweisungen (`int abstand = mbot.getDistance()`). */ -const takesSensor = [ElementType.verzweigung, ElementType.whileSchleife, ElementType.doUntilSchleife, ElementType.anweisung] - -interface DragState { - source: DragSource - pointerId: number - startX: number - startY: number - active: boolean - ghost?: HTMLElement - target?: DropTarget -} - -// Minimal-Typen der File System Access API (Chrome/Edge); Safari/Firefox fallen auf Download zurück. -interface FileHandle { - name: string - getFile(): Promise - createWritable(): Promise<{ write(data: Blob): Promise; close(): Promise }> -} -type PickerWindow = Window & { - showOpenFilePicker?: (o: object) => Promise - showSaveFilePicker?: (o: object) => Promise -} -const pickerTypes = () => [{ description: t('web_file_type'), accept: { 'application/xml': ['.visustruct', '.strk'] } }] - -/** `element_*` aus Localizable.strings. */ -const typeName = (type: ElementType) => t(`element_${ElementType[type]}`) - -/** `InspectorElementHints.conditionHintLine`: Beispiel über dem Editor. */ -const conditionHints: Partial> = { - [ElementType.verzweigung]: 'age >= 18', - [ElementType.whileSchleife]: 'i < 10', - [ElementType.doUntilSchleife]: 'again == 1', - [ElementType.fallauswahl]: 'day', -} - -/** Hinweis unter der Art (wie im Swift-Inspector, Englisch und code-nah). */ -const ioModeHints: Record = { - statement: 'int number = 5 | double x = 1.5 | String text = "Your text" | boolean ok = true | const double PI = 3.14', - input: 'input: int age "Enter age" | input: double price "Enter price" | input: String name "Enter name"', - output: 'output: number | output: "Your text" | output: "Your age: " + age', -} - -/** `lineEditorFixedPrefixLabel`: Schlüsselwort vor dem Editor, das nicht mitgetippt wird. */ -function fixedPrefix(el: VSElement): string | undefined { - switch (el.type) { - case ElementType.anweisung: { - const mode = LineEditor.ioMode(el.textLines.join('\n')) - return mode === 'input' ? 'input:' : mode === 'output' ? 'output:' : undefined - } - case ElementType.verzweigung: return 'if' - case ElementType.whileSchleife: - case ElementType.doUntilSchleife: - return 'while' - case ElementType.fallauswahl: return 'switch' - default: return undefined - } -} - -/** Text zum Bearbeiten (Inspektor und direkt im Struktogramm): ohne festes Schlüsselwort, leere Anweisung leer statt „ø“. */ -function editableText(el: VSElement): string { - const prefix = fixedPrefix(el) - const text = el.textLines.join('\n') - const shown = prefix ? LineEditor.strippingPrefixForEditing(prefix, text) : text - return el.type === ElementType.anweisung && shown.trim() === 'ø' ? '' : shown -} - -/** Bearbeiteten Text zurückschreiben (Gegenstück zu `editableText`). */ -function storingText(doc: VSDocument, path: number[], value: string): VSDocument | undefined { - const el = tryElementAt(doc, path) - if (!el) return undefined - const p = fixedPrefix(el) - if (el.type === ElementType.anweisung && !p && value.trim() === '') return setTextLines(doc, path, ['ø']) - const stored = p ? LineEditor.prefixingForEditing(p, LineEditor.strippingPrefixForEditing(p, value)) : value - return setTextLines(doc, path, stored.split('\n')) -} - -/** `InspectorElementHints.lineEditorPlaceholder`. */ -function placeholderFor(el: VSElement): string { - switch (el.type) { - case ElementType.anweisung: { - const mode = LineEditor.ioMode(el.textLines.join('\n')) - return mode === 'input' ? 'int age "Enter age"' : mode === 'output' ? '"Your age: " + age' : t('inspector_placeholder_statement') - } - case ElementType.verzweigung: - case ElementType.whileSchleife: - case ElementType.doUntilSchleife: - case ElementType.endlosschleife: - return t('inspector_placeholder_condition') - case ElementType.fallauswahl: return t('inspector_placeholder_selector') - case ElementType.aufruf: return t('inspector_placeholder_call') - case ElementType.aussprung: return t('inspector_placeholder_break') - default: return '' - } -} - -/** Kleines DOM-Hilfsmittel für den Inspector. */ -/** Aus `package.json`, siehe `vite.config.ts`. */ -declare const __APP_VERSION__: string - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -/** Ein Reiter wie `DiagramSheetTab.swift`: Dokument, Verlauf, Auswahl, verknüpfte Datei. */ -interface Tab { - doc: VSDocument - serial: number - /** Dateiname mit Endung; `undefined` = unbenannt. */ - fileName?: string - fileHandle?: FileHandle - /** Programm im Workspace (Spalte „Dateien“): Speichern schreibt dorthin, mit .java daneben. */ - workspace?: WorkspaceFile - dirty: boolean - undoStack: VSDocument[] - redoStack: VSDocument[] - selected?: number[] - /** Reiter gehört zu einer Übung im Lernbereich; ihr Stand wird im Browser gemerkt. */ - exerciseId?: string -} - -/** Unter dieser Breite der Struktogramm-Spalte stehen die Elemente kompakt. */ -const compactPaletteBelow = 760 - -/** `VisuStructUIScaleStep`: Textgröße des Struktogramms. */ -const zoomSteps = [ - { value: 1, label: 'settings_ui_scale_small' }, - { value: 1.22, label: 'settings_ui_scale_medium' }, - { value: 1.5, label: 'settings_ui_scale_large' }, - { value: 1.82, label: 'settings_ui_scale_extra_large' }, -] - -/** Schriftgröße in Code live (Code, Konsole), unabhängig vom Struktogramm. */ -const codeSizes = [ - { value: 14, label: 'settings_ui_scale_small' }, - { value: 17, label: 'settings_ui_scale_medium' }, - { value: 20, label: 'settings_ui_scale_large' }, - { value: 24, label: 'settings_ui_scale_extra_large' }, -] - -function applyCodeSize(px: number) { - document.documentElement.style.setProperty('--code-size', `${px}px`) -} - -const isMac = /Mac|iPhone|iPad/.test(navigator.platform) -/** Tastenkürzel im Tooltip, z. B. „Strg+S“ bzw. „⌘S“. */ -/** Startseite (oder ein Abschnitt ihrer Fußzeile) in der passenden Sprache der Webseite; im VisuBot-Modus die VisuBot-Startseite. */ -function siteURL(section?: 'contact' | 'privacy'): string { - return worldHomeURL(visuBotEnabled() ? 'visubot' : 'visustruct', currentLanguage(), section) -} - -/** Symbolknopf; der Name (mit Tastenkürzel) erscheint als Tooltip. */ -function iconButton(action: string, label: string, icon: string, keys?: string): string { - const tip = keys ? `${label} (${keys})` : label - return `` -} - -function shortcut(key: string, shift = false): string { - if (isMac) return `${shift ? '⇧' : ''}⌘${key}` - return [t('web_key_ctrl'), ...(shift ? [t('web_key_shift')] : []), key].join('+') -} -const e = escapeHTML -const zoomKey = 'visustruct.ui.scale.canvas' -const codeSizeKey = 'visustruct.ui.scale.code' -const learnKey = 'visustruct.learn.open' -const filesKey = 'visustruct.files.open' -const filesWidthKey = 'visustruct.files.width' -const learnWidthKey = 'visustruct.learn.width' -const liveKey = 'visustruct.live.open' -const liveWidthKey = 'visustruct.live.width' -/** VisuBot: Fenster „mBot2 live“ offen, unter dem Code statt als eigene Spalte, Breite bzw. Höhe. */ -const previewKey = 'visustruct.robotPreview.open' -/** „Programmieren groß“: Code ist die Hauptfläche, das Struktogramm schmal (Breite merken). */ -const codeMainKey = 'visustruct.codeMain' -/** VisuBot: Struktogramm als Blöcke zeigen (`1`). */ -const blocksKey = 'visustruct.visubot.blocks' -/** Selbst gezogene Breite der Elemente (leer = automatisch). */ -const paletteWidthKey = 'visustruct.palette.width' -const editorWidthKey = 'visustruct.editor.width' -/** Zugeklappte Gruppen der mBot2-Elemente. */ -const collapsedGroupsKey = 'visustruct.visubot.collapsedGroups' -const previewStackedKey = 'visustruct.robotPreview.stacked' -const previewWidthKey = 'visustruct.robotPreview.width' -const simWorkKey = 'visustruct.simulation.diagram' -/** Selbst gezogene Höhe des Objektinspektors unter dem Diagramm in px (leer = Standard). */ -const inspectorHeightKey = 'visustruct.inspector.height' -const previewHeightKey = 'visustruct.robotPreview.height' -const editorHiddenKey = 'visustruct.editor.hidden' -const compactPaletteKey = 'visustruct.palette.compact' -/** Elemente eingeklappt (schmale Leiste), z. B. wenn Code und Struktogramm nebeneinander Platz brauchen. */ -const paletteHiddenKey = 'visustruct.palette.hidden' -export const gearIcon = - '' - -/** Wie `VisuStructEditHistory.defaultMaxSteps`. */ -const maxUndoSteps = 80 - -export class App { - private tabs: Tab[] = [] - private tabIndex = 0 - private nextTabSerial = 1 - private clipboard?: VSElement - private zoom = 1 - private get tab(): Tab { - return this.tabs[this.tabIndex] - } - private get doc() { - return this.tab.doc - } - private set doc(v: VSDocument) { - this.tab.doc = v - } - private get fileName(): string { - return this.tab.fileName ?? `${tabTitle(this.tab)}.visustruct` - } - private get fileHandle() { - return this.tab.fileHandle - } - private set fileHandle(v: FileHandle | undefined) { - this.tab.fileHandle = v - } - private get dirty() { - return this.tab.dirty - } - private set dirty(v: boolean) { - this.tab.dirty = v - } - private get undoStack() { - return this.tab.undoStack - } - private get redoStack() { - return this.tab.redoStack - } - private get selected() { - return this.tab.selected - } - private set selected(v: number[] | undefined) { - this.tab.selected = v - } - private simulating = false - private exportButton!: HTMLButtonElement - private closeExport?: (ev: PointerEvent) => void - private learn: LearnPanel - private shell: HTMLElement - private railButton?: HTMLButtonElement - private liveRailButton?: HTMLButtonElement - private editorRailButton?: HTMLButtonElement - /** Werkzeugleiste über allen Spalten. */ - private topbar = h('div', { class: 'topbar' }) - /** Fußzeile unter allen Spalten. */ - private bottombar = h('div', { class: 'bottombar' }) - private editorHidden = false - /** Elemente ein- oder aufklappen (gesetzt, sobald die Elemente gebaut sind). */ - private setPaletteHidden?: (hidden: boolean) => void - private files!: FilesPanel - private filesRailButton?: HTMLButtonElement - private closeSettings?: (ev: PointerEvent) => void - private escapeSettings?: (ev: KeyboardEvent) => void - private exerciseSaveTimer?: number - private paletteObserver?: ResizeObserver - private resizeObserver?: ResizeObserver - private renderedHostSize = { width: -1, height: -1 } - /** Im Simulationsmodus markierter Schritt (ersetzt die Auswahl). */ - private simPath?: number[] - private sim!: SimulationPanel - private simButton!: HTMLButtonElement - private pseudocodeBox!: HTMLInputElement - /** VisuBot: dasselbe Struktogramm als Scratch-artige Blöcke (statt der Kästen). */ - private blockMode = false - /** VisuBot: Liste „Variablen“ in den Elementen und die zuletzt gezeigten Variablen-Bausteine */ - private varList?: HTMLUListElement - private shownVars = '' - private blocks?: BlockView - private blocksButton!: HTMLButtonElement - private coding = false - private code!: CodePanel - private codeButton!: HTMLButtonElement - /** Ansicht „Code live“ rechts neben dem Editor. */ - private liveCoding = false - /** Laufende Eingabe in „Code live“: fasst Tastendrücke zu Rückgängig-Schritten zusammen. */ - private codeTyping?: { tab: Tab; start: number; last: number } - private live: LiveCodePanel - private preview = new RobotPreviewPanel() - private previewOpen = false - /** „mBot2 live“ war zu und wurde nur für die Simulation geöffnet: danach wieder schließen. */ - private previewOpenedForSim = false - private codeMain = false - private previewStacked = false - private previewResizer!: HTMLElement - - private measure = createCanvasMeasure() - private metrics = diagramDisplayMetrics(true) - private engine = new LayoutEngine(this.metrics, this.measure) - private renderer = new DiagramRenderer(this.metrics, this.measure) - private layout?: Layout - private flat: LayoutNode[] = [] - - private canvasHost!: HTMLElement - private svg?: SVGSVGElement - private overlay?: SVGGElement - private inspector!: HTMLElement - private captionInput!: HTMLInputElement - private undoButton!: HTMLButtonElement - private redoButton!: HTMLButtonElement - private deleteButton!: HTMLButtonElement - private statusLine!: HTMLElement - private drag?: DragState - /** Offene Bearbeitung direkt im Struktogramm. */ - private inline?: InlineEditor - /** Letzter Klick/Tipp ins Struktogramm (Doppelklick selbst erkennen: der erste Klick zeichnet neu). */ - private lastCanvasTap = { spot: '', time: 0, x: 0, y: 0 } - /** Zweiter Tipp erkannt: beim Loslassen das Eingabefeld öffnen (dann behält es den Fokus). */ - private pendingInline?: { pointerId: number; path: number[]; point: { x: number; y: number } } - /** Nur in der claude.ai-Vorschau: Dateien über die `downloads`-Fähigkeit anbieten. */ - private downloads: { save(o: { filename: string; data: Blob }): Promise } | null = null - private readonly inViewer = 'claude' in window - /** VisuBot-Modus: Welt mit dem mBot2 im Simulationspanel (bleibt beim Neuaufbau erhalten). */ - private visuBot?: VisuBotView - private stopLinkListener?: () => void - - constructor(private root: HTMLElement) { - this.tabs.push(this.makeTab()) - // Link „VisuBot ausprobieren“ der Webseite: …/app/?visubot schaltet den Kurs mit mBot2-Schritten ein. - // Links der Webseite: …/app/?visubot öffnet die Welt VisuBot, …/app/?visustruct die Welt VisuStruct. - const query = new URLSearchParams(location.search) - if (query.has('visubot')) setVisuBotMode('on') - else if (query.has('visustruct')) setVisuBotMode('off') - useVisuBotContent(visuBotMode()) - // Block-Ansicht an: kurze Block-Lektionen für Jüngere - useBlockLessons(storedValue(blocksKey) === '1') - // Lernbereich links neben dem Editor; bleibt beim Neuaufbau der Oberfläche (Sprachwechsel) erhalten. - this.learn = new LearnPanel(this.learnHost()) - // Verweis aus einer VisuBot-Lektion: …/app/?visustruct&lektion=09-bedingungen-verknuepfen öffnet diese Lektion. - const wantedLesson = query.get('lektion') ?? undefined - if (wantedLesson) this.learn.showLesson(wantedLesson) - this.shell = document.createElement('div') - this.shell.className = 'shell' - root.replaceWith(this.shell) - this.live = new LiveCodePanel( - () => this.setLiveCoding(false), - (path) => { - this.selected = path - this.render() - }, - (doc, path) => this.commitFromCode(doc, path), - (redo) => (redo ? this.redo() : this.undo()), - ) - this.live.onRobotRun = (stepping) => this.runRobot(stepping) - this.live.onSwap = () => this.setCodeMain(!this.codeMain) - this.live.onRename = () => (this.codeTyping = undefined) - this.live.onReference = () => { - this.learn.showReference() - this.setLearning(true) - } - this.files = new FilesPanel({ - open: (xml, file, java) => this.openFromWorkspace(xml, file, java), - hide: () => this.setFilesOpen(false), - message: (text) => this.showMessage(text), - progressLoaded: () => { - this.learn.restore() - // Der Lernstand aus dem Ordner bringt die zuletzt offene Lektion mit; der Verweis geht vor. - if (wantedLesson) this.learn.showLesson(wantedLesson) - }, - chooseWorld: (mode) => this.chooseWorld(mode, false), - }) - // Oben die Werkzeugleiste, darunter vier Spalten: Dateien | Lernen | Struktogramm | Code live, jede einklappbar. - const columns = h('div', { class: 'columns' }) - columns.append( - this.filesRail(), - this.files.element, - this.panelResizer(this.files.element, 'files-resizer', filesWidthKey, t('web_files_resize'), 1), - this.learnRail(), - this.learn.element, - this.learnResizer(), - this.editorRail(), - root, - this.panelResizer(root, 'editor-resizer', editorWidthKey, t('web_editor_resize'), () => (this.codeMain ? -1 : 1), () => this.live.element), - this.liveResizer(), - this.live.element, - this.liveRail(), - (this.previewResizer = this.panelResizer(this.preview.element, 'preview-resizer', previewWidthKey, t('web_visubot_preview_resize'), -1)), - this.preview.element, - this.preview.rail, - ) - this.setupPreview() - this.shell.append(this.topbar, columns, this.bottombar) - const learnOpen = storedValue(learnKey) - // Link „Zu den Lektionen“ der Webseite: …/app/?learn. Danach aus der Adresse nehmen, - // sonst öffnet jedes Neuladen den Lernbereich wieder, obwohl man ihn eingeklappt hat. - const fromSite = new URLSearchParams(location.search).has('learn') || wantedLesson !== undefined - this.showWorldInURL() - this.setLearning(fromSite || (learnOpen === null ? window.innerWidth > 1100 : learnOpen === '1'), fromSite) - this.setFilesOpen(storedValue(filesKey) === '1') - const z = Number(storedValue(zoomKey)) - if (zoomSteps.some((s) => s.value === z)) this.zoom = z - this.setLiveCoding(storedValue(liveKey) === '1') - this.setEditorHidden(storedValue(editorHiddenKey) === '1') - this.buildUI() - this.setCodeMain(storedValue(codeMainKey) === '1') - this.render() - window.addEventListener('pointermove', (e) => this.onPointerMove(e)) - window.addEventListener('pointerup', (e) => this.onPointerUp(e)) - window.addEventListener('pointercancel', () => this.endDrag()) - window.addEventListener('keydown', (e) => this.onKeyDown(e)) - window.addEventListener('beforeunload', (e) => { - // Ohne geöffneten Ordner geht der Lernstand beim Schließen verloren: der Browser merkt ihn sich nicht. - if (this.tabs.some((t) => t.dirty && !t.exerciseId) || (!this.files.ready && progress.hasContent())) e.preventDefault() - }) - this.setupFileDrop() - // Nicht jede Vorschau mit `window.claude` kennt `use` (z. B. die Dateiansicht der Claude-App): dann ohne. - const claude = (window as { claude?: { use?: (name: string) => Promise } }).claude - if (typeof claude?.use === 'function') - claude - .use('downloads') - .then((d) => (this.downloads = d as App['downloads'])) - .catch(() => undefined) - } - - // MARK: - UI - - private buildUI() { - this.root.className = 'app' - this.root.innerHTML = ` -
    - ${visuBotEnabled() ? visuBotBrand : 'VisuStruct'} ${e(t('web_brand_suffix'))} -
    - ${iconButton('new', t('toolbar_new'), icons.newFile)} - ${iconButton('open', t('menu_open'), icons.open, shortcut('O'))} - ${iconButton('save', t('menu_save'), icons.save, shortcut('S'))} -
    -
    - - -
    -
    - - - - -
    - - -
    -
    - - - - ` - // Die Werkzeugleiste steht über allen Spalten, nicht im Editor. - this.topbar.replaceChildren(this.root.querySelector('.toolbar')!) - // Die Fußzeile ebenso unter allen Spalten. - this.bottombar.replaceChildren(this.root.querySelector('.statusbar')!) - const $ = (s: string) => - (this.root.querySelector(s) ?? this.topbar.querySelector(s) ?? this.bottombar.querySelector(s)) as T - this.canvasHost = $('.canvas') - this.blocks = new BlockView({ - // wie ein Klick ins Struktogramm: auswählen, mit Maus/Stift auch verschieben - press: (path, e) => { - if (this.simulating) return - if (document.activeElement instanceof HTMLElement) document.activeElement.blur() - const wasSelected = this.selected && samePath(path, this.selected) - this.selected = path - this.render() - if (e.pointerType !== 'touch' && !(isPlaceholderSlot(this.doc, path) && !wasSelected)) this.beginDrag(e, { kind: 'move', path }) - else e.preventDefault() - }, - // Wert im Block geändert (Zahl oder Text): wie Tippen in den Eigenschaften, ein Rückgängig-Schritt - editValue: (path, index, text) => { - // Zählschleife: nur Zahlen eintippen, der Java-Kopf (`int i = 0` …) entsteht von selbst - const lines = replaceBlockValue(this.doc, path, index, text) - if (lines) this.commit(setTextLines(this.doc, path, lines), path) - else this.render() - }, - labels: blockViewLabels(), - }) - this.canvasHost.after(this.blocks.element) - this.inspector = $('.inspector') - this.captionInput = $('.caption') - this.undoButton = $('[data-action=undo]') - this.redoButton = $('[data-action=redo]') - this.deleteButton = $('[data-action=delete]') - this.statusLine = $('.status') - this.simButton = $('[data-action=simulate]') - // Pseudocode (z. B. „Wasserkocher einschalten“): kein Java, die Simulation fragt die Bedingungen. - this.pseudocodeBox = $('[data-action=pseudocode]') - this.blocksButton = $('[data-action=blocks]') - this.blocksButton.addEventListener('click', () => this.setBlockMode(!this.blockMode, true)) - this.pseudocodeBox.addEventListener('change', () => this.commit({ ...this.doc, pseudocode: this.pseudocodeBox.checked || undefined })) - $('[data-action=hide-editor]').addEventListener('click', () => this.setEditorHidden(true)) - $('[data-action=swap-main]').addEventListener('click', () => this.setCodeMain(!this.codeMain)) - this.labelSwap() - this.sim = new SimulationPanel( - () => this.doc, - (path) => { - this.simPath = path - if (this.simulating) this.renderDiagramOnly() - this.scrollToSimPath() - }, - (name) => this.findSubprogram(name), - () => this.setSimulating(false), - (transcript) => { - if (this.simulating && this.liveCoding) this.live.showTranscript(transcript) - }, - ) - this.root.append(this.sim.element, this.simResizer(), this.inspectorResizer()) - if (visuBotEnabled()) { - this.visuBot ??= new VisuBotView() - this.sim.setRobot(this.visuBot) - } else { - this.preview.hostSimulation(undefined) - this.visuBot?.dispose() - this.visuBot = undefined - } - this.simButton.addEventListener('click', () => this.setSimulating(!this.simulating)) - this.codeButton = $('[data-action=code]') - this.code = new CodePanel( - () => this.doc, - (filename, text) => this.offerDownload(filename, new Blob([text], { type: 'text/plain' })), - () => this.setCoding(false), - (on) => this.commit({ ...this.doc, pseudocode: on || undefined }), - () => this.tabs.filter((tab) => tab !== this.tab && parseSubprogramHeader(tab.doc.caption)).map((tab) => tab.doc), - ) - this.root.append(this.code.element) - this.codeButton.addEventListener('click', () => this.setCoding(!this.coding)) - - // Schmale Struktogramm-Spalte: Elemente kompakt (Symbol, Name klein darunter). - this.paletteObserver?.disconnect() - // In den Einstellungen lässt sie sich auch dauerhaft einschalten. - // Selbst gezogene Breite der Elemente: schmal heißt kompakt, breit heißt mit Namen daneben. - const paletteWidth = () => Number(storedValue(paletteWidthKey)) || 0 - const updatePalette = () => - this.root.classList.toggle( - 'compact-palette', - storedValue(compactPaletteKey) === '1' || (paletteWidth() > 0 ? paletteWidth() < 150 : this.root.getBoundingClientRect().width < compactPaletteBelow), - ) - const paletteHidden = () => storedValue(paletteHiddenKey) === '1' - const setPaletteWidth = (width: number | undefined, remember: boolean) => { - const w = width === undefined ? undefined : Math.round(Math.max(80, Math.min(360, width))) - // Eingeklappt bleibt nur die schmale Leiste; die gezogene Breite gilt wieder beim Aufklappen. - if (paletteHidden()) this.root.style.setProperty('--palette-width', '36px') - else if (w === undefined) this.root.style.removeProperty('--palette-width') - else this.root.style.setProperty('--palette-width', `${w}px`) - if (remember) storeValue(paletteWidthKey, w === undefined ? '' : String(w)) - updatePalette() - } - const setPaletteHidden = (hidden: boolean) => { - storeValue(paletteHiddenKey, hidden ? '1' : '0') - this.root.classList.toggle('palette-hidden', hidden) - setPaletteWidth(paletteWidth() > 0 ? paletteWidth() : undefined, false) - } - setPaletteHidden(paletteHidden()) - this.setPaletteHidden = setPaletteHidden - $('[data-action=hide-palette]').addEventListener('click', () => setPaletteHidden(true)) - $('[data-action=show-palette]').addEventListener('click', () => setPaletteHidden(false)) - // Trennlinie zwischen Elementen und Struktogramm: ziehen, Pfeiltasten, Doppelklick setzt zurück. - const paletteBar = $('.palette-resizer') - const paletteEl = $('.palette') - const dir = () => (getComputedStyle(this.shell).direction === 'rtl' ? -1 : 1) - paletteBar.addEventListener('pointerdown', (ev) => { - if (ev.button !== 0) return - ev.preventDefault() - paletteBar.setPointerCapture(ev.pointerId) - const startX = ev.clientX - const start = paletteEl.getBoundingClientRect().width - const s = dir() - this.shell.classList.add('resizing') - const move = (m: PointerEvent) => setPaletteWidth(start + s * (m.clientX - startX), false) - const up = (u: PointerEvent) => { - paletteBar.removeEventListener('pointermove', move) - paletteBar.removeEventListener('pointerup', up) - paletteBar.removeEventListener('pointercancel', up) - this.shell.classList.remove('resizing') - const end = start + s * (u.clientX - startX) - // Ganz an den Rand gezogen: Elemente einklappen, die bisherige Breite bleibt gemerkt. - if (end < 50) setPaletteHidden(true) - else setPaletteWidth(end, true) - } - paletteBar.addEventListener('pointermove', move) - paletteBar.addEventListener('pointerup', up) - paletteBar.addEventListener('pointercancel', up) - }) - paletteBar.addEventListener('dblclick', () => setPaletteWidth(undefined, true)) - paletteBar.addEventListener('keydown', (k) => { - const step = k.key === 'ArrowRight' ? 20 : k.key === 'ArrowLeft' ? -20 : 0 - if (!step) return - k.preventDefault() - setPaletteWidth(paletteEl.getBoundingClientRect().width + dir() * step, true) - }) - this.paletteObserver = new ResizeObserver(updatePalette) - this.paletteObserver.observe(this.root) - const compactPalette = $('[data-action=compact-palette]') - compactPalette.checked = storedValue(compactPaletteKey) === '1' - compactPalette.addEventListener('change', () => { - storeValue(compactPaletteKey, compactPalette.checked ? '1' : '0') - updatePalette() - }) - - const addPaletteItem = (list: HTMLUListElement, icon: PaletteItem, label: string, make: () => VSElement, data: string) => { - const li = document.createElement('li') - li.className = 'palette-item' - li.dataset.item = data - // Gleiche Farbe wie der Kasten im Struktogramm und der Block im Code (Einstellung „Blöcke farbig“) - li.dataset.scope = scopeKind(make().type) ?? 'method' - li.append(this.paletteIcon(icon), document.createTextNode(label)) - li.addEventListener('pointerdown', (e) => this.beginDrag(e, { kind: 'palette', make, label })) - // Tastatur/Klick ohne Ziehen: hinter der Auswahl einfügen (bzw. Platzhalter ersetzen). - li.tabIndex = 0 - li.addEventListener('keydown', (e) => { - if (e.key === 'Enter' || e.key === ' ') this.insertNearSelection(make()) - }) - list.append(li) - } - const list = $('.palette-basic') - for (const { item } of paletteItems) addPaletteItem(list, item, typeName(paletteElement(item).type), () => paletteElement(item), item) - - // VisuBot: fertige mBot2-Kästen unter den normalen Elementen. - const robotOn = visuBotEnabled() - // Blöcke gibt es (vorerst) nur in VisuBot - this.blocksButton.hidden = !robotOn - this.setBlockMode(robotOn && storedValue(blocksKey) === '1', false) - this.root.classList.toggle('visubot-mode', robotOn) - this.shell.classList.toggle('robot-world', robotOn) - if (!robotOn) this.preview.pause() - document.documentElement.classList.toggle('visubot-theme', robotOn) - const robotList = $('.palette-visubot') - robotList.hidden = !robotOn - $('.palette-visubot-title').hidden = !robotOn - if (robotOn) { - const icon = { [ElementType.verzweigung]: 'verzweigung', [ElementType.whileSchleife]: 'whileSchleife' } as Partial> - // Gruppen wie im Nachschlagen (Fahren und Drehen, Abstand, Linie …), jede auf- und zuklappbar - const collapsed = new Set((storedValue(collapsedGroupsKey) ?? '').split(',').filter(Boolean)) - const groupTitle = (list: HTMLUListElement, group: string) => { - const li = document.createElement('li') - li.className = 'palette-group' - li.dataset.botColor = visuBotGroupColor(group) - const button = document.createElement('button') - button.type = 'button' - button.textContent = [visuBotGroupIcon[group], t(`web_visubot_group_${group}`)].filter(Boolean).join(' ') - const show = (open: boolean) => { - button.setAttribute('aria-expanded', String(open)) - for (const item of list.querySelectorAll(`[data-group="${group}"]`)) item.hidden = !open - } - button.addEventListener('click', () => { - const open = button.getAttribute('aria-expanded') !== 'true' - if (open) collapsed.delete(group) - else collapsed.add(group) - storeValue(collapsedGroupsKey, [...collapsed].join(',')) - show(open) - }) - li.append(button) - list.append(li) - return () => show(!collapsed.has(group)) - } - const grouped = (list: HTMLUListElement, items: T[], add: (item: T) => HTMLElement) => { - for (const group of new Set(items.map((i) => i.group))) { - const apply = groupTitle(list, group) - for (const item of items.filter((i) => i.group === group)) { - const el = add(item) - el.dataset.group = group - el.dataset.botColor = visuBotGroupColor(group) - } - apply() - } - } - grouped(robotList, visuBotTemplates, (tpl) => { - addPaletteItem(robotList, icon[tpl.type] ?? 'anweisung', t(tpl.key), tpl.make, tpl.key) - return robotList.lastElementChild as HTMLElement - }) - // Sensoren: Werte zum Einbauen in eine Bedingung, keine eigenen Kästen - const sensorList = $('.palette-visubot-sensors') - sensorList.replaceChildren() - grouped(sensorList, visuBotSensors, (sensor) => { - const label = t(sensor.key) - const li = document.createElement('li') - li.className = 'palette-item palette-sensor' - li.dataset.item = sensor.key - li.title = sensor.text - const code = document.createElement('code') - code.textContent = sensor.text - // in den Blöcken: Ja/Nein-Sensoren sechseckig, Messwerte rund (wie die Bausteine darin) - if (/^mbot\.is/.test(sensor.text)) code.classList.add('sensor-bool') - li.append(document.createTextNode(label), code) - li.addEventListener('pointerdown', (e) => this.beginDrag(e, { kind: 'sensor', text: sensor.text, label: sensor.text })) - li.tabIndex = 0 - li.addEventListener('keydown', (e) => { - if (e.key === 'Enter' || e.key === ' ') this.insertSensor(sensor.text) - }) - sensorList.append(li) - return li - }) - } - $('.palette-visubot-sensors').hidden = !robotOn - $('.palette-visubot-sensors-title').hidden = !robotOn - for (const part of ['ops', 'vars', 'control']) { - $(`.palette-visubot-${part}`).hidden = !robotOn - $(`.palette-visubot-${part}-title`).hidden = !robotOn - } - if (robotOn) { - const lang = currentLanguage() - // Operatoren (VisuBlocks): auf ein Wertfeld oder eine Bedingung ziehen wie einen Sensor - const opList = $('.palette-visubot-ops') - opList.replaceChildren( - ...operatorBlocks.map((op) => - this.expressionItem(operatorName(op, lang), op.java, op.shape === 'bool' ? 'bool' : 'round', 'op', op.id === 'random' ? '🎲 1 … 10' : undefined), - ), - ) - // Variablen: anlegen, setzen, ändern; die angelegten Variablen kommen in render() als Bausteine dazu - const varList = $('.palette-visubot-vars') - varList.replaceChildren() - for (const b of variableBlocks) { - const make = () => { - // neue Variable mit freiem Namen; setzen/ändern nimmt die zuletzt angelegte (keine Zählvariable) - const own = statementVariables(this.doc) - const name = b.id === 'declare' ? freshVariable(programVariables(this.doc)) : (own[own.length - 1] ?? 'zahl') - return makeElement(ElementType.anweisung, { textLines: [b.java(name)] }) - } - addPaletteItem(varList, 'anweisung', variableName(b, lang), make, `visublocks_var_${b.id}`) - ;(varList.lastElementChild as HTMLElement).dataset.botColor = 'variable' - } - this.varList = varList - this.shownVars = '' - // Steuerung: „wiederhole 10 mal“ (in Java eine for-Schleife, deren Zählvariable man nicht braucht) - const controlList = $('.palette-visubot-control') - controlList.replaceChildren() - addPaletteItem(controlList, 'forZaehlSchleife', t('web_visubot_el_repeat'), () => ({ ...paletteElement('forZaehlSchleife'), textLines: repeatLoopLines(10) }), 'web_visubot_el_repeat') - } - - this.tabStrip = $('.tabs') - this.exportButton = $('[data-action=export]') - const exportMenu = $('.export-menu') - this.exportButton.setAttribute('aria-haspopup', 'menu') - this.exportButton.addEventListener('click', () => { - exportMenu.hidden = !exportMenu.hidden - if (!exportMenu.hidden) exportMenu.querySelector('button')?.focus() - }) - exportMenu.addEventListener('click', (ev) => { - const kind = (ev.target as HTMLElement).closest('[data-export]')?.dataset.export as ExportKind | undefined - if (!kind) return - exportMenu.hidden = true - void this.exportDiagram(kind) - }) - exportMenu.addEventListener('keydown', (ev) => { - if (ev.key !== 'Escape') return - exportMenu.hidden = true - this.exportButton.focus() - }) - if (this.closeExport) document.removeEventListener('pointerdown', this.closeExport) - this.closeExport = (ev: PointerEvent) => { - if (!exportMenu.hidden && !exportMenu.parentElement!.contains(ev.target as Node)) exportMenu.hidden = true - } - document.addEventListener('pointerdown', this.closeExport) - const language = $('[data-action=language]') - language.value = currentLanguage() - language.addEventListener('change', () => void this.changeLanguage(() => setLanguage(language.value as LanguageCode), 'language')) - // Echter mBot2: Knopf in der Werkzeugleiste (neben der Simulation) und in den Einstellungen - const linkButtons = [$('[data-action=mbot-link]'), $('[data-action=mbot-link-settings]')] - const linkInfo = $('.settings-mbot-link small') - const showLink = () => { - const on = mbotLink.connected - const label = mbotLink.connecting ? t('web_visubot_connecting') : on ? t('web_visubot_disconnect') : t('web_visubot_connect') - linkButtons[0].hidden = !visuBotEnabled() || !canConnectMBot() - uploadButton.hidden = linkButtons[0].hidden - linkButtons[0].classList.toggle('connected', on) - const icon = mbotLink.connecting ? '⏳' : on ? '🟢' : '🔌' - linkButtons[0].textContent = `${icon} mBot2` - linkButtons[0].title = label - linkButtons[1].textContent = `${icon} ${label}` - linkButtons[1].disabled = !canConnectMBot() - linkButtons[1].parentElement!.hidden = !visuBotEnabled() - linkInfo.textContent = canConnectMBot() ? mbotLinkText() : t('web_visubot_no_serial') - } - for (const b of linkButtons) b.addEventListener('click', () => void toggleMBotLink()) - const uploadButton = $('[data-action=mbot-upload]') - uploadButton.addEventListener('click', () => - uploadToMBot( - this.doc, - this.tabs.filter((tab) => tab !== this.tab).map((tab) => tab.doc), - ), - ) - this.stopLinkListener?.() - this.stopLinkListener = mbotLink.listen(showLink) - showLink() - for (const b of this.topbar.querySelectorAll('[data-action=visubot] [data-world]')) - b.addEventListener('click', () => void this.chooseWorld(b.dataset.world as WorldChoice, true)) - const keywords = $('[data-action=keywords]') - keywords.checked = codeKeywords() - keywords.addEventListener('change', () => void this.changeLanguage(() => setCodeKeywords(keywords.checked), 'keywords')) - const scopes = $('[data-action=code-scopes]') - scopes.checked = codeScopes() - scopes.addEventListener('change', () => setCodeScopes(scopes.checked)) - const liveLanguage = $('[data-action=live-language]') - liveLanguage.value = this.live.language - const javaClass = $('[data-action=java-class]') - const javaMain = $('[data-action=java-main]') - const javaSwing = $('[data-action=java-swing]') - javaSwing.checked = this.live.swingSupport - javaSwing.addEventListener('change', () => this.live.setSwingSupport(javaSwing.checked)) - const showJavaForm = () => { - javaClass.checked = this.live.javaForm.asClass - javaMain.checked = this.live.javaForm.withMain - // Die Java-Einstellungen nur zeigen, wenn Java gewählt ist. - $('.settings-menu .java-only').hidden = this.live.language !== 'java' - } - showJavaForm() - liveLanguage.addEventListener('change', () => { - this.live.setTarget(liveLanguage.value as LiveTarget) - showJavaForm() - }) - for (const box of [javaClass, javaMain]) { - box.addEventListener('change', () => this.live.setJavaForm({ asClass: javaClass.checked, withMain: javaMain.checked })) - } - const zoom = $('[data-action=zoom]') - zoom.value = String(this.zoom) - zoom.addEventListener('change', () => { - this.zoom = Number(zoom.value) - storeValue(zoomKey, zoom.value) - this.renderDiagramOnly() - }) - const codeSize = $('[data-action=code-size]') - const storedSize = Number(storedValue(codeSizeKey)) - codeSize.value = String(codeSizes.some((s) => s.value === storedSize) ? storedSize : codeSizes[0].value) - applyCodeSize(Number(codeSize.value)) - codeSize.addEventListener('change', () => { - storeValue(codeSizeKey, codeSize.value) - applyCodeSize(Number(codeSize.value)) - }) - this.setupSettingsMenu($('[data-action=settings]'), $('.settings-menu')) - $('[data-action=about]').addEventListener('click', () => { - $('.settings-menu').hidden = true - this.showAbout() - }) - $('[data-action=cut]').addEventListener('click', () => this.cutSelection()) - $('[data-action=copy]').addEventListener('click', () => this.copySelection()) - $('[data-action=paste]').addEventListener('click', () => this.paste()) - - const fileInput = $('input[type=file]') - fileInput.addEventListener('change', async () => { - const f = fileInput.files?.[0] - fileInput.value = '' - if (f) this.loadXML(await f.text(), f.name) - }) - - $('[data-action=new]').addEventListener('click', () => this.addTab()) - $('[data-action=open]').addEventListener('click', () => this.open(fileInput)) - $('[data-action=save]').addEventListener('click', () => this.save()) - this.undoButton.addEventListener('click', () => this.undo()) - this.redoButton.addEventListener('click', () => this.redo()) - this.deleteButton.addEventListener('click', () => this.deleteSelection()) - - let captionBefore: VSDocument | undefined - this.captionInput.addEventListener('focus', () => (captionBefore = this.doc)) - this.captionInput.addEventListener('input', () => { - this.doc = { ...this.doc, caption: this.captionInput.value } - this.dirty = true - this.updateStatus() - // Der Titel ist in „Code live“ der Klassenname. - this.refreshLive() - }) - this.captionInput.addEventListener('change', () => { - if (captionBefore && captionBefore.caption !== this.doc.caption) this.pushUndo(captionBefore) - captionBefore = this.doc - }) - - this.canvasHost.addEventListener('pointerdown', (e) => this.onCanvasPointerDown(e)) - this.canvasHost.addEventListener('contextmenu', (e) => this.onCanvasContextMenu(e)) - this.resizeObserver?.disconnect() - // Nur bei echter Größenänderung neu zeichnen, sonst schaukeln sich Scrollbalken (Windows) gegenseitig auf - this.resizeObserver = new ResizeObserver(() => { - const { clientWidth, clientHeight } = this.canvasHost - if (clientWidth === this.renderedHostSize.width && clientHeight === this.renderedHostSize.height) return - this.renderDiagramOnly() - }) - this.resizeObserver.observe(this.canvasHost) - } - - /** Sprache wechseln wie in den App-Einstellungen: Oberfläche neu aufbauen, Reiter und Verlauf bleiben. */ - /** Sprache oder Code-Keywords umstellen und alle Texte neu aufbauen; das Einstellungsmenü bleibt offen. */ - /** `?visubot` oder `?visustruct` in der Adresse, damit man den Link mit der richtigen Welt weitergeben kann. */ - private showWorldInURL() { - const params = new URLSearchParams(location.search) - for (const key of ['learn', 'lektion', 'visubot', 'visustruct', 'visuobject', 'visuflow']) params.delete(key) - const rest = params.toString() - const world = visuBotMode() === 'on' ? 'visubot' : 'visustruct' - history.replaceState(history.state, '', `${location.pathname}?${world}${rest ? `&${rest}` : ''}${location.hash}`) - } - - /** VisuStruct oder VisuBot: Lernbereich, Elemente und Simulator neu aufbauen. */ - private async chooseWorld(mode: WorldChoice, fromSettings: boolean) { - if (mode === 'object') { - // VisuObject hat eine eigene Oberfläche: neu laden. Ungespeichertes fragt der Browser vorher ab. - setVisuObjectWorld() - location.href = `${location.pathname}?visuobject${location.hash}` - return - } - if (mode === 'flow') { - // VisuFlow (PAP zeichnen) hat ebenfalls eine eigene Oberfläche. - setVisuFlowWorld() - location.href = `${location.pathname}?visuflow${location.hash}` - return - } - if (mode === visuBotMode() && worldChosen()) return - await this.changeLanguage( - async () => { - setVisuBotMode(mode) - useVisuBotContent(mode) - this.showWorldInURL() - }, - fromSettings ? `visubot] [data-world=${mode}` : undefined, - ) - } - - private async changeLanguage(change: () => Promise, control?: string) { - this.setSimulating(false) - this.setCoding(false) - await change() - applyCanvasStubTexts() - this.sim.end() - this.live.build() - this.preview.relabel() - this.placePreview() - this.files.build() - this.buildUI() - this.render() - this.learn.render() - this.labelLearnRail() - this.labelLiveRail() - this.labelEditorRail() - this.labelFilesRail() - if (control === undefined) return - this.topbar.querySelector('[data-action=settings]')?.click() - this.topbar.querySelector(`[data-action=${control}]`)?.focus() - } - - /** Eingeklappte Bereiche öffnen (Zeiger im Lektionstext); zurück kommt, wie man genau diese wieder einklappt. */ - private revealAreas(areas: UiArea[]): () => void { - const undo: (() => void)[] = [] - for (const area of areas) { - if (area === 'editor' && this.editorHidden) { - this.setEditorHidden(false) - undo.push(() => this.setEditorHidden(true)) - } else if (area === 'palette' && this.root.classList.contains('palette-hidden')) { - this.setPaletteHidden?.(false) - undo.push(() => this.setPaletteHidden?.(true)) - } else if (area === 'livecode' && !this.liveCoding) { - this.setLiveCoding(true) - undo.push(() => this.setLiveCoding(false)) - } else if (area === 'files' && !this.shell.classList.contains('files-open')) { - this.setFilesOpen(true) - undo.push(() => this.setFilesOpen(false)) - } - } - return () => undo.reverse().forEach((f) => f()) - } - - // MARK: - Dateien - - private setFilesOpen(on: boolean) { - this.shell.classList.toggle('files-open', on) - storeValue(filesKey, on ? '1' : '0') - this.keepAColumnOpen() - if (this.canvasHost) this.renderDiagramOnly() - } - - private filesRail(): HTMLElement { - this.filesRailButton = h('button', { class: 'learn-rail files-rail' }) as HTMLButtonElement - this.labelFilesRail() - this.filesRailButton.addEventListener('click', () => this.setFilesOpen(true)) - return this.filesRailButton - } - - private labelFilesRail() { - if (!this.filesRailButton) return - this.filesRailButton.title = t('web_files_show') - this.filesRailButton.innerHTML = `${sidebarIcon}📁 ${e(t('web_files_title'))}` - } - - /** Programm aus dem Workspace öffnen; gespeicherter Code (.java) behält seine Kommentare. */ - private openFromWorkspace(xml: string, file: WorkspaceFile, java: string | undefined) { - const already = this.tabs.find((tab) => tab.workspace?.dir === file.dir && tab.workspace.base === file.base) - if (already) { - this.tabIndex = this.tabs.indexOf(already) - this.render() - return - } - if (xml) this.loadXML(xml, `${file.base}.visustruct`) - else if (java !== undefined) { - if (this.dirty || this.tab.fileName || this.tab.exerciseId) this.addTab() - this.doc = this.live.documentFromJavaText(java) - this.tab.fileName = `${file.base}.visustruct` - this.resetHistory() - } - this.tab.workspace = file - this.tab.fileHandle = undefined - if (java !== undefined) { - this.live.adoptJava(this.doc, java) - this.setLiveCoding(true) - } - this.render() - } - - /** Speichern in den Workspace: in den Ordner des Programms, sonst Klasse/Tagesordner. `false` = dort nicht möglich. */ - private async saveToWorkspace(): Promise { - if (!this.files.ready || (this.tab.fileHandle && !this.tab.workspace)) return false - const title = this.doc.caption.trim() || tabTitle(this.tab) - const java = this.live.language === 'java' ? this.live.javaFor(this.doc, this.tab) : undefined - try { - const place = await this.files.save(title, encodeDocument(this.doc), java, this.tab.workspace) - if (!place) { - this.setFilesOpen(true) - return true - } - this.tab.workspace = place - this.tab.fileName = `${place.base}.visustruct` - this.dirty = false - this.render() - this.showMessage(t('web_files_saved_fmt', place.path)) - } catch (err) { - this.showMessage((err as Error).message) - } - return true - } - - // MARK: - Lernbereich - - private setLearning(on: boolean, remember = true) { - this.shell.classList.toggle('learning', on) - if (remember) storeValue(learnKey, on ? '1' : '0') - this.keepAColumnOpen() - if (this.canvasHost) this.renderDiagramOnly() - } - - // MARK: - Spalte Struktogramm - - /** Struktogramm-Spalte einklappen, z. B. um nur Code live (wie in einer IDE) oder nur Lektionen zu sehen. */ - private setEditorHidden(hidden: boolean) { - this.editorHidden = hidden - this.shell.classList.toggle('editor-hidden', hidden) - storeValue(editorHiddenKey, hidden ? '1' : '0') - // Ohne Struktogramm soll der Code zu sehen sein, nicht eine leere Fläche. - if (hidden && !this.liveCoding && !this.shell.classList.contains('learning')) this.setLiveCoding(true) - if (!hidden && this.canvasHost) this.render() - } - - /** Mindestens eine Spalte bleibt offen; sonst kommt das Struktogramm zurück. */ - private keepAColumnOpen() { - if (this.editorHidden && !this.liveCoding && !this.shell.classList.contains('learning') && !this.shell.classList.contains('files-open')) { - this.setEditorHidden(false) - } - } - - private editorRail(): HTMLElement { - this.editorRailButton = h('button', { class: 'learn-rail editor-rail' }) as HTMLButtonElement - this.labelEditorRail() - this.editorRailButton.addEventListener('click', () => this.setEditorHidden(false)) - return this.editorRailButton - } - - private labelEditorRail() { - if (!this.editorRailButton) return - this.editorRailButton.title = t('web_editor_show') - this.editorRailButton.innerHTML = `${sidebarIcon}✎ ${e(t('web_editor_title'))}` - } - - /** „Über VisuStruct“ wie in der App (dieselben Texte aus `Localizable.strings`). */ - private showAbout() { - const link = (label: string, href: string, text: string) => - `` - const dialog = h('dialog', { class: 'about', 'aria-labelledby': 'about-title' }) as HTMLDialogElement - dialog.innerHTML = ` -
    -

    ${e(t('about_nav_title'))}

    - -
    -
    -
    - -
    -

    VisuStruct ${e(t('web_brand_suffix'))}

    -

    ${e(t('web_about_version_fmt').replace('%@', __APP_VERSION__))}

    -

    Holger Sebastiao

    - ${link('about_web_label', 'https://visustruct.visucode.de', 'visustruct.visucode.de')} - ${link('about_developer_label', 'https://www.sebastiao.org', 'www.sebastiao.org')} - ${link('about_project_github_label', 'https://github.com/code4teaching/VisuStruct', 'code4teaching/VisuStruct')} -
    -
    -

    ${e(t('about_dateiformat_heading'))}

    -

    ${e(t('about_dateiformat_part1'))}.visustruct${e(t('about_dateiformat_part2'))}

    -

    ${e(t('about_dateiformat_strk'))}

    -

    ${e(t('web_about_software'))}

    -

    ${e(t('web_about_software_text'))} ${e(t('web_about_licenses'))}

    -

    ${e(t('about_copyright'))}

    -
    ` - dialog.querySelector('[data-action=about-done]')!.addEventListener('click', () => dialog.close()) - // Klick auf den abgedunkelten Rand schließt ebenfalls. - dialog.addEventListener('click', (ev) => ev.target === dialog && dialog.close()) - dialog.addEventListener('close', () => dialog.remove()) - document.body.append(dialog) - dialog.showModal() - } - - /** Schmale Leiste am Rand, solange der Lernbereich eingeklappt ist. */ - /** Zahnrad oben rechts: Textgröße und Sprache. Schließt bei Klick daneben und mit Escape. */ - private setupSettingsMenu(button: HTMLButtonElement, menu: HTMLElement) { - const show = (open: boolean) => { - menu.hidden = !open - button.setAttribute('aria-expanded', String(open)) - } - button.addEventListener('click', () => show(menu.hidden)) - // Nach einem Sprachwechsel wird die Leiste neu gebaut: alten Zuhörer entfernen. - if (this.closeSettings) document.removeEventListener('pointerdown', this.closeSettings) - if (this.escapeSettings) document.removeEventListener('keydown', this.escapeSettings) - this.closeSettings = (ev: PointerEvent) => { - if (!menu.hidden && !button.parentElement!.contains(ev.target as Node)) show(false) - } - document.addEventListener('pointerdown', this.closeSettings) - // Am Dokument statt am Menü: Safari gibt einem angeklickten Haken keinen Fokus. - this.escapeSettings = (ev: KeyboardEvent) => { - if (ev.key !== 'Escape' || menu.hidden) return - show(false) - button.focus() - } - document.addEventListener('keydown', this.escapeSettings) - } - - private learnRail(): HTMLElement { - this.railButton = h('button', { class: 'learn-rail' }) as HTMLButtonElement - this.labelLearnRail() - this.railButton.addEventListener('click', () => this.setLearning(true)) - return this.railButton - } - - /** Wie beim Lernbereich: eingeklappt bleibt „Code live“ als schmale Leiste am rechten Rand. */ - private liveRail(): HTMLElement { - this.liveRailButton = h('button', { class: 'learn-rail live-rail' }) as HTMLButtonElement - this.labelLiveRail() - this.liveRailButton.addEventListener('click', () => this.setLiveCoding(true)) - return this.liveRailButton - } - - private labelLiveRail() { - if (!this.liveRailButton) return - this.liveRailButton.title = t('web_live_show') - this.liveRailButton.innerHTML = `${sidebarIcon}</> ${e(t('web_live_title'))}` - } - - private labelLearnRail() { - if (!this.railButton) return - this.railButton.title = t('web_learn_show') - this.railButton.innerHTML = `${sidebarIcon}🎓 ${e(t('web_learn_title'))}` - } - - private learnHost(): LearnHost { - return { - collapse: () => this.setLearning(false), - showEditor: () => { - if (this.editorHidden) this.setEditorHidden(false) - }, - showLiveCode: () => { - if (!this.liveCoding) this.setLiveCoding(true) - }, - showJava: () => this.openJavaColumn(), - showFiles: () => { - if (!this.shell.classList.contains('files-open')) this.setFilesOpen(true) - }, - reveal: (areas) => this.revealAreas(areas), - openExercise: (ex: Exercise, doc: VSDocument) => { - // Die Übung sagt, wo man sie löst (`bereich:`). Holger 2026-10-31: Lektionen bleiben offen, sonst ist nur - // dieser Bereich zu sehen (bei `beide` Struktogramm und Code); Dateien, mBot2 live usw. gehen zu. - const area = exerciseArea(ex) - if (area !== 'code') this.setEditorHidden(false) - // Java-Übungen stellen Code auf Java; sonst bleibt die Sprache (z. B. Python oder JavaScript in Lektion 21). - if (area !== 'struktogramm') { - if (ex.code === 'java') this.openJavaColumn() - else if (!this.liveCoding) this.setLiveCoding(true) - } - if (this.coding) this.setCoding(false) - if (this.shell.classList.contains('files-open')) this.setFilesOpen(false) - if (this.previewOpen) this.setPreviewOpen(false) - if (area === 'struktogramm' && this.liveCoding) this.setLiveCoding(false) - if (area === 'code' && !this.editorHidden) this.setEditorHidden(true) - const existing = this.tabs.findIndex((tab) => tab.exerciseId === ex.id) - if (existing >= 0) { - this.switchTab(existing) - this.setSimulating(false) - return - } - const tab = this.makeTab() - tab.doc = doc - tab.exerciseId = ex.id - tab.selected = doc.elements.length > 0 ? [0] : undefined - // Ein unberührter leerer Reiter wird ersetzt statt einen weiteren zu öffnen. - if (this.isPristine(this.tab)) this.tabs[this.tabIndex] = tab - else this.tabs.push(tab) - this.tabIndex = this.tabs.indexOf(tab) - this.setSimulating(false) - this.render() - }, - openJavaCode: (java: string) => { - this.openJavaColumn() - const tab = this.makeTab() - tab.doc = this.live.documentFromJavaText(java) - // Ein unberührter leerer Reiter wird ersetzt statt einen weiteren zu öffnen. - if (this.isPristine(this.tab)) this.tabs[this.tabIndex] = tab - else this.tabs.push(tab) - this.tabIndex = this.tabs.indexOf(tab) - this.setSimulating(false) - // Der Code bleibt so stehen, wie er in der Lektion steht. - this.live.adoptJava(tab.doc, java) - this.render() - }, - openDiagram: (doc: VSDocument, fileName: string) => { - this.setEditorHidden(false) - // Tab nach der Diagrammüberschrift benennen, nicht nach der Datei (l1-tee) - this.loadXML(encodeDocument(doc), doc.caption.trim() ? `${doc.caption.trim()}.visustruct` : fileName) - }, - exerciseDocument: (id: string) => { - const own = this.tabs.find((tab) => tab.exerciseId === id) - if (own) return own.doc - // Ohne „Übung öffnen“ gebaut: Das offene Struktogramm wird zur Übung, statt eine Fehlermeldung zu zeigen. - const tab = this.tab - if (tab.exerciseId || this.isPristine(tab)) return undefined - tab.exerciseId = id - progress.updateExercise(id, { xml: encodeDocument(tab.doc) }) - return tab.doc - }, - subprogramsFor: (id: string) => { - const own = this.tabs.find((tab) => tab.exerciseId === id) - return (name) => this.findSubprogram(name, own) - }, - stopSimulation: () => this.setSimulating(false), - resetExercise: (id: string, doc: VSDocument) => { - const tab = this.tabs.find((x) => x.exerciseId === id) - if (!tab) return - tab.undoStack.push(tab.doc) - tab.doc = doc - tab.redoStack = [] - tab.selected = [0] - if (tab === this.tab) this.render() - }, - preview: (doc: VSDocument) => { - const image = Export.renderExportSVG(doc, this.metrics, this.measure, 0) - if (!image) return undefined - // Kleine Diagramme nicht über ihre natürliche Größe hinaus vergrößern. - const width = image.svg.getAttribute('width') - if (width) { - image.svg.style.maxWidth = `${width}px` - // Breite Diagramme nicht bis zur Unlesbarkeit verkleinern: lieber seitlich scrollen. - image.svg.style.minWidth = `${Math.round(Number(width) * 0.6)}px` - } - image.svg.removeAttribute('width') - image.svg.removeAttribute('height') - return image.svg - }, - } - } - - private isPristine(tab: Tab): boolean { - return !tab.dirty && !tab.fileName && !tab.exerciseId && tab.undoStack.length === 0 - } - - /** Stand einer Übung merken (kurz verzögert, damit Tippen flüssig bleibt). */ - private rememberExercise() { - const tab = this.tab - if (!tab.exerciseId) return - clearTimeout(this.exerciseSaveTimer) - this.exerciseSaveTimer = window.setTimeout(() => { - if (tab.exerciseId) progress.updateExercise(tab.exerciseId, { xml: encodeDocument(tab.doc) }) - }, 300) - } - - /** Kleine Vorschau des Elements als Symbol in der Palette. */ - private paletteIcon(item: PaletteItem): SVGSVGElement { - const s = el('svg', { viewBox: '0 0 28 20', width: 28, height: 20, class: 'icon' }) - const stroke = { fill: 'none', stroke: 'currentColor', 'stroke-width': 1.5 } - s.append(el('rect', { x: 1, y: 1, width: 26, height: 18, ...stroke })) - const path = (d: string) => s.append(el('path', { d, ...stroke })) - switch (item) { - case 'verzweigung': - path('M1 1 L14 10 L27 1 M14 10 V19') - break - case 'fallauswahl': - path('M1 1 L20 10 L27 1 M1 10 H27 M10 10 V19 M20 10 V19') - break - case 'forZaehlSchleife': - case 'whileSchleife': - path('M7 7 H27 M7 7 V19') - break - case 'doUntilSchleife': - path('M7 1 V13 H27') - break - case 'endlosschleife': - path('M7 6 H27 M7 6 V14 H27') - break - case 'aufruf': - path('M5 1 V19 M23 1 V19') - break - case 'aussprung': - path('M6 1 L1 10 L6 19') - break - } - return s - } - - // MARK: - Rendering - - private render() { - // Gruppensymbole, die ältere Block-Ansichten in Befehle geschrieben haben, wieder entfernen - const withoutIcons = withoutBlockIcons(this.doc) - if (withoutIcons) { - this.doc = withoutIcons - this.dirty = true - } - const displayDoc: VSDocument = { ...this.doc, elements: this.doc.elements.map(displayElement) } - this.layout = this.engine.layout(displayDoc) - this.flat = flattenNodes(this.layout.elements) - if (this.selected && !tryElementAt(this.doc, this.selected)) this.selected = undefined - - // Wie `DiagramCanvasView`: mindestens so groß wie Struktur und sichtbarer Bereich (Ablegen unterhalb = ans Ende). - const z = this.zoom - const host = this.canvasHost - this.renderedHostSize = { width: host.clientWidth, height: host.clientHeight } - // Abgerundet, damit das Diagramm den sichtbaren Bereich nie um Bruchteile eines Pixels überragt - // (sonst erscheinen bei 125 % Skalierung unter Windows Scrollbalken ohne Grund) - const size = { - width: Math.max(320, this.layout.canvasSize.width, Math.floor(host.clientWidth / z)), - height: Math.max(240, this.layout.canvasSize.height + 60, Math.floor(host.clientHeight / z)), - } - this.pseudocodeBox.checked = !!this.doc.pseudocode - this.renderer.usesSimulationHighlight = this.simulating - this.renderer.fillsSelection = this.liveCoding - this.svg = this.renderer.render(this.layout, size, this.simulating ? this.simPath : this.selected) - // Textgröße wie `canvasScaleStep`: Layout und Linien wachsen gleichmäßig mit. - this.svg.setAttribute('width', String(Math.floor(size.width * z))) - this.svg.setAttribute('height', String(Math.floor(size.height * z))) - this.overlay = el('g', { class: 'drop-overlay' }) - this.svg.append(this.overlay) - // Während der Bearbeitung im Diagramm nur das Bild tauschen, das Eingabefeld bleibt (mit Fokus). - const oldSvg = this.inline?.element.isConnected ? this.canvasHost.querySelector(':scope > svg') : null - if (oldSvg) oldSvg.replaceWith(this.svg) - else this.canvasHost.replaceChildren(this.svg) - this.refreshVarPalette() - if (this.blockMode) this.blocks?.render(this.doc, this.simulating ? this.simPath : this.selected, this.simulating, z) - - if (document.activeElement !== this.captionInput) this.captionInput.value = this.doc.caption - this.undoButton.disabled = this.simulating || this.undoStack.length === 0 - this.redoButton.disabled = this.simulating || this.redoStack.length === 0 - this.deleteButton.disabled = this.simulating || !this.selected || !canDeleteElement(this.doc, this.selected) - this.captionInput.readOnly = this.simulating - this.codeButton.disabled = this.simulating - this.exportButton.disabled = this.simulating - if (this.coding) this.code.refresh() - this.refreshLive() - this.refreshPreview() - this.renderTabs() - this.renderInspector() - this.updateStatus() - } - - private refreshLive() { - if (!this.liveCoding) return - this.live.refresh(this.doc, this.simulating ? this.simPath : this.selected, { - owner: this.tab, - subprograms: new Set(this.tabs.filter((tab) => tab !== this.tab).flatMap((tab) => parseSubprogramHeader(tab.doc.caption)?.name ?? [])), - editable: !this.simulating, - resolve: (name) => this.findSubprogram(name), - }) - } - - private updateStatus() { - this.rememberExercise() - document.title = `${this.dirty ? '• ' : ''}${this.fileName} – VisuStruct Web` - this.statusLine.textContent = `${this.fileName}${this.dirty ? ` (${t('web_status_modified')})` : ''}` - } - - /** Wie `InspectorPanelBody` in Swift: Art (Anweisung/Ein-/Ausgabe), festes Schlüsselwort, Zählschleife, Fälle. */ - private renderInspector() { - const path = this.selected - const element = path ? tryElementAt(this.doc, path) : undefined - const box = this.inspector - if (!path || !element) { - box.replaceChildren( - h('h2', {}, t('web_inspector_title')), - h('p', { class: 'hint' }, t('inspector_no_selection')), - h('p', { class: 'hint' }, t('web_inspector_help_drop')), - h('p', { class: 'hint' }, t('web_inspector_help_inline')), - h('p', { class: 'hint' }, t('web_inspector_help_files')), - ) - return - } - box.replaceChildren(h('h2', {}, `${t('web_inspector_title')} · ${typeName(element.type)}`)) - - if (element.type === ElementType.anweisung) { - const mode = LineEditor.ioMode(element.textLines.join('\n')) - const seg = h('div', { class: 'segmented', role: 'group', 'aria-label': t('inspector_io_mode_title') }) - for (const [m, label] of [['statement', t('inspector_io_mode_statement')], ['input', t('inspector_io_mode_input')], ['output', t('inspector_io_mode_output')]] as const) { - const b = h('button', { 'aria-pressed': String(m === mode) }, label) - b.addEventListener('click', () => { - // Aktuellen Text lesen: das Textfeld kann ihn seit dem Aufbau geändert haben. - const current = tryElementAt(this.doc, path)?.textLines.join('\n') ?? '' - if (m === LineEditor.ioMode(current)) return - const text = LineEditor.applyingIOMode(m, current) - this.commit(setTextLines(this.doc, path, text.split('\n'))) - this.inspector.querySelector('textarea')?.focus() - }) - seg.append(b) - } - box.append(seg, h('p', { class: 'hint mono-hint' }, ioModeHints[mode])) - } - - if (element.type === ElementType.forSchleife) { - const row = h('div', { class: 'for-fields' }) - const parts = LineEditor.paddedForLoopParts(element.textLines) - const labels = [ - [t('inspector_for_init'), t('inspector_for_placeholder_init')], - [t('inspector_for_condition'), t('inspector_for_placeholder_condition')], - [t('inspector_for_step'), t('inspector_for_placeholder_step')], - ] - labels.forEach(([label, placeholder], i) => { - const input = h('input', { placeholder, spellcheck: 'false', autocomplete: 'off' }) as HTMLInputElement - input.value = parts[i] - this.liveEdit(input, (value) => { - const el = tryElementAt(this.doc, path) - if (!el) return undefined - const lines = LineEditor.paddedForLoopParts(el.textLines) - lines[i] = LineEditor.normalizedForLoopPart(value) - return setTextLines(this.doc, path, lines) - }) - row.append(h('label', {}, label, input)) - }) - box.append(row) - } else if (element.type !== ElementType.leerElement) { - const hint = conditionHints[element.type] - if (hint) box.append(h('p', { class: 'hint mono-hint' }, hint)) - const prefix = fixedPrefix(element) - const ta = h('textarea', { rows: '3', spellcheck: 'false' }) as HTMLTextAreaElement - // Leere Anweisung: im Struktogramm „ø“, im Textfeld leer (nichts erst löschen müssen). - ta.value = editableText(element) - ta.placeholder = placeholderFor(element) - this.liveEdit(ta, (value) => storingText(this.doc, path, value)) - const row = h('div', { class: 'editor-row' }) - if (prefix) row.append(h('span', { class: 'fixed-prefix' }, prefix)) - row.append(ta) - box.append(row) - } - - if (elementVariableNames(element).length > 0) { - const rename = h('button', { class: 'inspector-rename' }, t('web_rename_menu')) - rename.addEventListener('click', () => this.renameVariable(path)) - box.append(rename) - } - this.renderCaseControls(path) - } - - // MARK: - Umbenennen - - /** - * Fenster „Variable umbenennen“ für das Element an `path`: Mit getipptem Code wird dort umbenannt - * (Kommentare bleiben, das Struktogramm folgt), sonst im Struktogramm. - */ - private renameVariable(path: number[]) { - const element = tryElementAt(this.doc, path) - if (!element || this.simulating) return - const code = this.liveCoding ? this.live.editableCode : undefined - const own = elementVariableNames(element) - const all = code !== undefined ? variableNames([code]) : documentVariableNames(this.doc) - const names = [...own, ...all.filter((n) => !own.includes(n))] - if (names.length === 0) return - const existing = code !== undefined ? codeWords(code).map((w) => w.name) : documentWords(this.doc) - void askRename({ - names, - existing, - count: (name) => (code !== undefined ? nameRanges(code, name).length : countInDocument(this.doc, name)), - }).then((r) => { - if (!r) return - if (code !== undefined) this.live.renameInCode(r.from, r.to) - else { - const next = renameInDocument(this.doc, r.from, r.to) - if (next.count > 0) this.commit(next.doc) - } - }) - } - - /** Rechtsklick auf ein Element: auswählen und „Variable umbenennen …“ anbieten. */ - private onCanvasContextMenu(e: MouseEvent) { - if (this.simulating || this.inline) return - const p = this.svgPoint(e.clientX, e.clientY) - const node = p && this.nodeAt(p.x, p.y) - const element = node && tryElementAt(this.doc, node.idPath) - if (!node || !element || elementVariableNames(element).length === 0) return - e.preventDefault() - this.selected = node.idPath - this.render() - showRenameMenu(e.clientX, e.clientY, t('web_rename_menu'), () => this.renameVariable(node.idPath)) - } - - /** Fallname und „Fall hinzufügen/entfernen“, wenn die Auswahl in einer Fallauswahl liegt. */ - private renderCaseControls(path: number[]) { - const fa = multiwayAncestorPath(path, this.doc) - if (!fa) return - const cases = tryElementAt(this.doc, fa)?.cases ?? [] - const caseIdx = caseIndexInMultiway(path, fa) - const section = h('div', { class: 'case-controls' }) - if (caseIdx !== undefined && cases[caseIdx]) { - const input = h('input', { placeholder: t('web_case_name_placeholder'), spellcheck: 'false', autocomplete: 'off' }) as HTMLInputElement - input.value = cases[caseIdx].name - this.liveEdit(input, (value) => (value.trim() === '' ? undefined : setFallauswahlCaseName(this.doc, fa, caseIdx, value))) - section.append(h('label', {}, t('web_case_name'), input)) - } - const add = h('button', {}, `+ ${t('inspector_add_case')}`) - add.addEventListener('click', () => { - const r = appendCaseToFallauswahl(this.doc, fa) - this.commit(r.doc, r.path) - }) - const remove = h('button', { class: 'danger-text' }, `- ${t('inspector_remove_case')}`) as HTMLButtonElement - remove.disabled = cases.length <= 2 || caseIdx === undefined - remove.addEventListener('click', () => { - if (caseIdx === undefined) return - const r = removeCaseFromFallauswahl(this.doc, fa, caseIdx) - this.commit(r.doc, r.path) - }) - section.append(h('div', { class: 'group' }, add, remove)) - this.inspector.append(section) - } - - /** Eingabefeld, das beim Tippen das Diagramm ändert; ein Rückgängig-Schritt pro Bearbeitung. */ - private liveEdit(field: HTMLInputElement | HTMLTextAreaElement, apply: (value: string) => VSDocument | undefined) { - let before: VSDocument | undefined - field.addEventListener('focus', () => (before = this.doc)) - field.addEventListener('input', () => { - // Typografische Anführungszeichen sofort durch gerade ersetzen (gleiche Länge, Cursor bleibt). - const normalized = LineEditor.normalizingQuotes(field.value) - if (normalized !== field.value) { - const pos = field.selectionStart - field.value = normalized - field.setSelectionRange(pos, pos) - } - const next = apply(normalized) - if (!next) return - this.doc = next - this.dirty = true - this.renderDiagramOnly() - }) - field.addEventListener('blur', () => { - if (before && before !== this.doc) this.pushUndo(before) - before = undefined - // Inspector nicht neu aufbauen: ein Klick auf einen seiner Knöpfe soll sein Ziel behalten. - this.renderDiagramOnly() - }) - } - - // MARK: - Direkt im Struktogramm bearbeiten - - /** - * Eingabefeld über dem Text des Elements öffnen (Doppelklick, Doppeltipp oder Enter). - * `point` (Diagramm-Koordinaten) entscheidet bei der Fallauswahl, ob ein Fallname gemeint ist. - */ - private startInlineEdit(path: number[], point?: { x: number; y: number }) { - if (this.simulating || this.blockMode) return - this.inline?.finish(true) - const node = this.flat.find((n) => samePath(n.idPath, path)) - const element = tryElementAt(this.doc, path) - if (!node || !element || element.type === ElementType.leerElement) return - const lh = this.metrics.lineHeight - const base = { host: this.canvasHost, zoom: this.zoom, fontSize: this.metrics.fontSize, lineHeight: lh } - const open = (o: { rect: Rect; prefix?: string; fields: InlineField[]; center: boolean; apply: (values: string[]) => VSDocument | undefined }) => { - this.inline = openInlineEditor({ - ...base, - ...o, - onDone: (values) => { - this.inline = undefined - const next = values && o.apply(values) - const before = tryElementAt(this.doc, path) - const after = next && tryElementAt(next, path) - const changed = next && JSON.stringify([before?.textLines, before?.cases?.map((c) => c.name)]) !== JSON.stringify([after?.textLines, after?.cases?.map((c) => c.name)]) - if (changed) this.commit(next, path) - else this.render() - }, - }) - } - - const caseIdx = point ? caseLabelAt(node, point.x, point.y, lh) : undefined - if (caseIdx !== undefined && element.cases?.[caseIdx]) { - return open({ - rect: caseLabelRect(node, caseIdx, lh), - fields: [{ value: element.cases[caseIdx].name, placeholder: t('web_case_name_placeholder'), label: t('web_case_name') }], - center: true, - apply: ([v]) => (v.trim() === '' ? undefined : setFallauswahlCaseName(this.doc, path, caseIdx, v.trim())), - }) - } - if (element.type === ElementType.forSchleife) { - const parts = LineEditor.paddedForLoopParts(element.textLines) - const labels: [string, string][] = [ - [t('inspector_for_init'), t('inspector_for_placeholder_init')], - [t('inspector_for_condition'), t('inspector_for_placeholder_condition')], - [t('inspector_for_step'), t('inspector_for_placeholder_step')], - ] - return open({ - rect: textRect(node, lh), - prefix: 'for', - fields: labels.map(([label, placeholder], i) => ({ value: parts[i], placeholder, label })), - center: false, - apply: (values) => setTextLines(this.doc, path, values.map((v) => LineEditor.normalizedForLoopPart(v))), - }) - } - open({ - rect: textRect(node, lh), - prefix: fixedPrefix(element), - fields: [{ value: editableText(element), placeholder: placeholderFor(element), label: typeName(element.type) }], - center: element.type === ElementType.anweisung || element.type === ElementType.aufruf || element.type === ElementType.aussprung, - apply: ([v]) => storingText(this.doc, path, v), - }) - } - - /** VisuBot: Struktogramm als Blöcke (`on`) oder als Kästen; `remember` speichert die Wahl. */ - private setBlockMode(on: boolean, remember: boolean) { - this.blockMode = on - if (remember) storeValue(blocksKey, on ? '1' : '0') - // Die Lektionen folgen der Block-Ansicht (Holger 5.11.): Blöcke = kurze Lektionen für Jüngere - if (useBlockLessons(on)) this.learn?.render() - this.root.classList.toggle('block-mode', on) - this.canvasHost.hidden = on - if (this.blocks) this.blocks.element.hidden = !on - // Der Knopf nennt, wohin er führt (wie in VisuMicro): in den Blöcken zurück zum Struktogramm - const label = t(on ? 'web_visubot_blocks_back' : 'web_visubot_blocks') - this.blocksButton.innerHTML = `${e(label)}` - this.blocksButton.setAttribute('aria-pressed', String(on)) - this.blocksButton.dataset.tip = t(on ? 'web_visubot_blocks_back_title' : 'web_visubot_blocks_title') - if (remember) this.render() - } - - /** Beim Tippen: nur das Diagramm neu zeichnen, damit das Textfeld den Fokus behält. */ - private renderDiagramOnly() { - const sel = this.selected - const keepInspector = this.inspector - const placeholder = document.createElement('aside') - this.inspector = placeholder - this.render() - this.inspector = keepInspector - this.selected = sel - } - - // MARK: - Simulation - - /** Wie `SimulationController.begin/end`: Diagramm nur anzeigen, rechts das Simulationsfeld. */ - private setSimulating(on: boolean) { - if (on === this.simulating) return - if (document.activeElement instanceof HTMLElement) document.activeElement.blur() - this.endDrag() - this.simulating = on - this.root.classList.toggle('simulating', on) - // Erst nach dem Aufklappen von „mBot2 live“ steht die Breite fest. - if (on) requestAnimationFrame(() => this.fixSimSplit()) - this.simButton.setAttribute('aria-pressed', String(on)) - // Beschriftung statt Symbol allein: „Simulation starten“ wird zu „Simulation beenden“. - this.simButton.innerHTML = `${on ? icons.stop : icons.play}${e(t(on ? 'web_simulation_end' : 'web_simulation_start'))}` - this.simButton.dataset.tip = t(on ? 'web_simulation_end_title' : 'web_simulation_start_title') - this.simButton.setAttribute('aria-label', t(on ? 'web_simulation_end' : 'web_simulation_start')) - if (on) { - this.setCoding(false) - this.setEditorHidden(false) - // VisuBot: Die Simulation zeigt die Welten der Übung in diesem Reiter (sonst die freie Fläche). - this.visuBot?.setWorlds(exerciseWorlds(this.tab.exerciseId)) - // VisuBot: Der mBot2 der Simulation fährt im Fenster „mBot2 live“ (das dafür aufgeht). - if (this.visuBot && !this.previewOpen) { - this.setPreviewOpen(true) - this.previewOpenedForSim = true - } - this.placeSimulationRobot() - this.sim.begin() - } else { - this.sim.end() - this.placeSimulationRobot() - if (this.previewOpenedForSim) this.setPreviewOpen(false) - this.simPath = undefined - if (!this.selected && this.doc.elements.length > 0) this.selected = [0] - } - this.render() - } - - /** - * ▶ in Programmieren mit mBot2-Befehlen: Simulation öffnen und dort ausführen, damit die 3D-Welt - * (und der verbundene mBot2) mitfährt und der aktuelle Befehl in Struktogramm und Code markiert ist. - */ - private runRobot(stepping: boolean): boolean { - if (!this.visuBot || !/\bmbot\s*\./u.test(JSON.stringify(this.tabs.map((tab) => tab.doc)))) return false - if (this.simulating) this.sim.reset() - else this.setSimulating(true) - if (stepping) this.sim.step() - else this.sim.play() - return true - } - - // MARK: - Code - - private setCoding(on: boolean) { - if (on === this.coding) return - // Beide Code-Spalten nebeneinander wären zu eng. - if (on) { - this.setLiveCoding(false) - this.setEditorHidden(false) - } - this.coding = on - this.root.classList.toggle('coding', on) - this.codeButton.setAttribute('aria-pressed', String(on)) - if (on) this.code.refresh() - else this.code.close() - this.renderDiagramOnly() - } - - // MARK: - Code live - - /** Übungen mit `code: java`: Spalte Code öffnen und auf Java stellen, wie über das Zahnrad. */ - private openJavaColumn() { - if (this.live.language !== 'java') { - const sel = '[data-action=live-language]' - const select = this.topbar.querySelector(sel) ?? this.root.querySelector(sel) - if (select) { - select.value = 'java' - select.dispatchEvent(new Event('change')) - } else this.live.setTarget('java') - } - if (!this.liveCoding) this.setLiveCoding(true) - } - - // MARK: - Programmieren groß - - /** ⇄: Programmieren wird die große Fläche links, das Struktogramm schmal rechts daneben (Breite ziehbar); noch ein Klick tauscht zurück. */ - private setCodeMain(on: boolean) { - this.codeMain = on - storeValue(codeMainKey, on ? '1' : '0') - if (on && !this.liveCoding) this.setLiveCoding(true) - if (on && this.editorHidden) this.setEditorHidden(false) - this.shell.classList.toggle('code-main', on) - this.labelSwap() - if (this.canvasHost) this.render() - } - - private labelSwap() { - const tip = t(this.codeMain ? 'web_swap_to_editor' : 'web_swap_to_code') - for (const b of this.shell.querySelectorAll('[data-action=swap-main]')) { - b.dataset.tip = tip - b.setAttribute('aria-label', tip) - b.setAttribute('aria-pressed', String(this.codeMain)) - } - } - - // MARK: - mBot2 live - - private setupPreview() { - // Selbst auf- oder zugeklappt: bleibt so, auch nach der Simulation. - const open = (on: boolean) => { - this.previewOpenedForSim = false - this.setPreviewOpen(on) - } - this.preview.onHide = () => open(false) - this.preview.rail.addEventListener('click', () => open(true)) - this.preview.onToggleStacked = () => { - this.previewStacked = !this.previewStacked - storeValue(previewStackedKey, this.previewStacked ? '1' : '0') - // Unter dem Code geht nur mit offener Spalte „Code“. - if (this.previewStacked && !this.liveCoding) this.setLiveCoding(true) - this.placePreview() - } - this.previewStacked = storedValue(previewStackedKey) === '1' - const saved = storedValue(previewKey) - this.previewOpen = saved === null || saved === '1' - // Höhe unter dem Code: an der Linie darüber ziehen (nach oben = größer), Doppelklick setzt zurück. - const bar = this.preview.heightBar - const panel = this.preview.element - const apply = (height: number | undefined, remember: boolean) => { - const max = Math.max(160, (panel.parentElement?.getBoundingClientRect().height ?? 600) - 120) - const value = height === undefined ? undefined : Math.round(Math.max(160, Math.min(height, max))) - panel.style.height = value === undefined ? '' : `${value}px` - if (remember) storeValue(previewHeightKey, value === undefined ? '' : String(value)) - } - const savedHeight = Number(storedValue(previewHeightKey)) - if (savedHeight > 0) panel.style.height = `${savedHeight}px` - bar.addEventListener('pointerdown', (ev) => { - if (ev.button !== 0) return - ev.preventDefault() - bar.setPointerCapture(ev.pointerId) - const startY = ev.clientY - const startHeight = panel.getBoundingClientRect().height - this.shell.classList.add('resizing') - const move = (m: PointerEvent) => apply(startHeight - (m.clientY - startY), false) - const up = (u: PointerEvent) => { - bar.removeEventListener('pointermove', move) - bar.removeEventListener('pointerup', up) - bar.removeEventListener('pointercancel', up) - this.shell.classList.remove('resizing') - apply(startHeight - (u.clientY - startY), true) - } - bar.addEventListener('pointermove', move) - bar.addEventListener('pointerup', up) - bar.addEventListener('pointercancel', up) - }) - bar.addEventListener('dblclick', () => apply(undefined, true)) - bar.addEventListener('keydown', (k) => { - const step = k.key === 'ArrowUp' ? 20 : k.key === 'ArrowDown' ? -20 : 0 - if (!step) return - k.preventDefault() - apply(panel.getBoundingClientRect().height + step, true) - }) - this.placePreview() - } - - private setPreviewOpen(on: boolean) { - this.previewOpen = on - storeValue(previewKey, on ? '1' : '0') - if (!on) this.preview.pause() - this.placePreview() - this.placeSimulationRobot() - if (this.canvasHost) this.render() - } - - /** Simulation in VisuBot: ihre 3D-Ansicht im offenen Fenster „mBot2 live“, sonst im Simulationspanel. */ - private placeSimulationRobot() { - const robot = this.visuBot - const inPreview = !!robot && this.simulating && this.previewOpen - this.preview.hostSimulation(inPreview ? robot.viewport : undefined) - if (!inPreview) robot?.restoreViewport() - } - - /** Eigene Spalte ganz rechts oder unten in „Code“ (nur wenn diese Spalte offen ist). */ - private placePreview() { - const stacked = this.previewStacked && this.liveCoding - this.preview.setStacked(this.previewStacked) - this.shell.classList.toggle('preview', this.previewOpen) - this.shell.classList.toggle('preview-stacked', stacked) - if (stacked) { - if (this.preview.element.parentElement !== this.live.element) this.live.element.append(this.preview.element) - } else if (this.preview.element.previousElementSibling !== this.previewResizer) this.previewResizer.after(this.preview.element) - } - - /** Nach jeder Änderung: „mBot2 live“ rechnet das Programm neu durch (nur in VisuBot und wenn es offen ist). */ - private refreshPreview() { - if (!this.previewOpen || !visuBotEnabled()) return - this.preview.update( - this.doc, - (name) => this.findSubprogram(name), - exerciseWorlds(this.tab.exerciseId), - this.tab.exerciseId ?? '', - this.tabs.map((tab) => tab.doc), - ) - } - - private setLiveCoding(on: boolean) { - if (on && this.coding) this.setCoding(false) - this.liveCoding = on - this.shell.classList.toggle('live', on) - this.placePreview() - if (!on) this.live.hideConsole() - storeValue(liveKey, on ? '1' : '0') - this.keepAColumnOpen() - if (this.canvasHost) this.render() - } - - /** Markierten Schritt sichtbar halten, wenn das Diagramm größer als das Fenster ist. */ - /** Ein anderer Reiter, dessen Titel oder Dateiname zum Aufruf passt, z. B. `zeigeTitel()`. */ - /** - * Linie zwischen Diagramm und Steuerung während der Simulation. Gemerkt wird die Breite des Diagramms (`--sim-work`), - * die Steuerung füllt den Rest: Zieht man an der Linie zwischen Steuerung und Code, ändert sich so die Steuerung - * und nicht das Diagramm (Holger 2026-11-04). Doppelklick stellt den Standard wieder her. - */ - private simResizer(): HTMLElement { - const bar = h('div', { class: 'sim-resizer', role: 'separator', 'aria-orientation': 'vertical', tabindex: '0', title: t('web_visuobject_resize') }) - const root = this.root - const clamp = (width: number) => { - const total = root.getBoundingClientRect().width - return Math.round(Math.max(120, total > 0 ? Math.min(width, total - 240) : width)) - } - const apply = (width: number | undefined, remember: boolean) => { - if (remember) storeValue(simWorkKey, width === undefined ? '' : String(clamp(width))) - if (width === undefined) this.fixSimSplit() - else root.style.setProperty('--sim-work', `${clamp(width)}px`) - } - const work = () => root.getBoundingClientRect().width - this.sim.element.getBoundingClientRect().width - const sign = () => (getComputedStyle(this.shell).direction === 'rtl' ? -1 : 1) - bar.addEventListener('pointerdown', (e) => { - if (e.button !== 0) return - e.preventDefault() - bar.setPointerCapture(e.pointerId) - const startX = e.clientX - const startWidth = work() - const s = sign() - this.shell.classList.add('resizing') - const move = (ev: PointerEvent) => apply(startWidth + s * (ev.clientX - startX), false) - const up = (ev: PointerEvent) => { - bar.removeEventListener('pointermove', move) - bar.removeEventListener('pointerup', up) - bar.removeEventListener('pointercancel', up) - this.shell.classList.remove('resizing') - apply(startWidth + s * (ev.clientX - startX), true) - } - bar.addEventListener('pointermove', move) - bar.addEventListener('pointerup', up) - bar.addEventListener('pointercancel', up) - }) - bar.addEventListener('dblclick', () => apply(undefined, true)) - bar.addEventListener('keydown', (e) => { - const step = e.key === 'ArrowRight' ? 20 : e.key === 'ArrowLeft' ? -20 : 0 - if (!step) return - e.preventDefault() - apply(work() + sign() * step, true) - }) - return bar - } - - /** - * Waagerechte Linie zwischen Diagramm und Objektinspektor: mit Maus, Finger (wischen) oder Pfeiltasten - * nach oben oder unten ziehen ändert die Höhe des Objektinspektors (Holger 2026-11-05). Doppelklick = Standard. - */ - private inspectorResizer(): HTMLElement { - const label = t('web_inspector_resize') - const bar = h('div', { class: 'insp-resizer', role: 'separator', 'aria-orientation': 'horizontal', tabindex: '0', title: label, 'aria-label': label }) - const root = this.root - const clamp = (height: number) => { - const total = root.getBoundingClientRect().height - return Math.round(Math.max(48, total > 0 ? Math.min(height, total - 160) : height)) - } - const apply = (height: number | undefined, remember: boolean) => { - if (height === undefined) { - root.classList.remove('insp-sized') - root.style.removeProperty('--insp-height') - } else { - root.classList.add('insp-sized') - root.style.setProperty('--insp-height', `${clamp(height)}px`) - } - if (remember) storeValue(inspectorHeightKey, height === undefined ? '' : String(clamp(height))) - } - const current = () => this.inspector.getBoundingClientRect().height - bar.addEventListener('pointerdown', (e) => { - if (e.button !== 0) return - e.preventDefault() - bar.setPointerCapture(e.pointerId) - const startY = e.clientY - const startHeight = current() - this.shell.classList.add('resizing') - const move = (ev: PointerEvent) => apply(startHeight - (ev.clientY - startY), false) - const up = (ev: PointerEvent) => { - bar.removeEventListener('pointermove', move) - bar.removeEventListener('pointerup', up) - bar.removeEventListener('pointercancel', up) - this.shell.classList.remove('resizing') - apply(startHeight - (ev.clientY - startY), true) - } - bar.addEventListener('pointermove', move) - bar.addEventListener('pointerup', up) - bar.addEventListener('pointercancel', up) - }) - bar.addEventListener('dblclick', () => apply(undefined, true)) - bar.addEventListener('keydown', (e) => { - const step = e.key === 'ArrowUp' ? 20 : e.key === 'ArrowDown' ? -20 : 0 - if (!step) return - e.preventDefault() - apply(current() + step, true) - }) - const saved = Number(storedValue(inspectorHeightKey)) - if (saved > 0) apply(saved, false) - return bar - } - - /** Beim Start der Simulation: Diagramm bekommt die gemerkte Breite, sonst so viel, dass die Steuerung ihre Standardbreite hat. */ - private fixSimSplit() { - const root = this.root - const total = root.getBoundingClientRect().width - const saved = Number(storedValue(simWorkKey)) - const control = root.classList.contains('visubot-mode') ? Math.min(440, total * 0.45) : 320 - const width = saved > 0 ? saved : total - control - root.style.setProperty('--sim-work', `${Math.round(Math.max(120, total > 0 ? Math.min(width, total - 240) : width))}px`) - } - - /** Senkrechte Trennlinie: Breite des Lernbereichs mit Maus, Finger oder Pfeiltasten ändern, Doppelklick setzt zurück. */ - private learnResizer(): HTMLElement { - return this.panelResizer(this.learn.element, 'learn-resizer', learnWidthKey, t('web_learn_resize'), 1) - } - - /** Wie beim Lernbereich, nur am anderen Rand: Ziehen nach links macht den Code breiter. */ - private liveResizer(): HTMLElement { - return this.panelResizer(this.live.element, 'live-resizer', liveWidthKey, t('web_live_resize'), -1, () => this.root) - } - - /** - * Struktogramm und Programmieren teilen sich den Platz, den die anderen Spalten übrig lassen. Ist der zu knapp, - * geben beim Ziehen an der Linie dazwischen erst „mBot2 live“, dann Lernbereich und Dateien Breite ab (bis zu ihrer - * Mindestbreite), sonst ließe sich die Aufteilung bei vier offenen Spalten kaum verändern. - */ - private yieldingPanels(): { panel: HTMLElement; key: string }[] { - return [ - { panel: this.preview.element, key: previewWidthKey }, - { panel: this.learn.element, key: learnWidthKey }, - { panel: this.files.element, key: filesWidthKey }, - ].filter(({ panel }) => panel.offsetParent !== null && panel.parentElement === this.live.element.parentElement) - } - - /** `side`: 1 = Bereich liegt am Anfang der Zeile (links), -1 = am Ende (rechts); als Funktion, wenn ⇄ die Seite wechselt. */ - /** `partner`: die breitenvariable Spalte auf der anderen Seite der Linie; dann geben beim Ziehen auch weitere Spalten Platz ab. */ - private panelResizer( - panel: HTMLElement, - className: string, - widthKey: string, - title: string, - side: 1 | -1 | (() => 1 | -1), - partner?: () => HTMLElement, - ): HTMLElement { - const bar = h('div', { class: className, role: 'separator', 'aria-orientation': 'vertical', tabindex: '0', title }) - // Höchstens so breit, dass die Spalte daneben noch 240 px behält; feste Breiten anderer Bereiche zählen mit. - const clamp = (width: number) => { - const total = panel.parentElement?.getBoundingClientRect().width ?? 0 - if (total === 0) return clampPanelWidth(width) - const others = [this.files.element, this.learn.element, this.live.element, this.preview.element] - .filter((p) => p !== panel && p.offsetParent !== null && getComputedStyle(p).flexGrow === '0') - .reduce((sum, p) => sum + p.getBoundingClientRect().width, 0) - const min = parseFloat(getComputedStyle(panel).minWidth) || 200 - return Math.round(Math.max(min, Math.min(width, total - others - 240))) - } - const apply = (width: number | undefined, remember: boolean) => { - panel.style.width = width === undefined ? '' : `${clamp(width)}px` - if (remember) storeValue(widthKey, width === undefined ? '' : String(clamp(width))) - } - const saved = Number(storedValue(widthKey)) - if (saved > 0) apply(saved, false) - // Im Rechts-nach-links-Layout sind die Seiten vertauscht. - const sign = () => { - const s = typeof side === 'function' ? side() : side - return getComputedStyle(this.shell).direction === 'rtl' ? -s : s - } - bar.addEventListener('pointerdown', (e) => { - if (e.button !== 0) return - e.preventDefault() - bar.setPointerCapture(e.pointerId) - const startX = e.clientX - const startWidth = panel.getBoundingClientRect().width - const s = sign() - this.shell.classList.add('resizing') - const resize = partner ? this.pushResize(panel, widthKey, partner(), startWidth) : undefined - const drag = (ev: PointerEvent, remember: boolean) => (resize ?? apply)(startWidth + s * (ev.clientX - startX), remember) - const move = (ev: PointerEvent) => drag(ev, false) - const up = (ev: PointerEvent) => { - bar.removeEventListener('pointermove', move) - bar.removeEventListener('pointerup', up) - bar.removeEventListener('pointercancel', up) - this.shell.classList.remove('resizing') - drag(ev, true) - } - bar.addEventListener('pointermove', move) - bar.addEventListener('pointerup', up) - bar.addEventListener('pointercancel', up) - }) - bar.addEventListener('dblclick', () => apply(undefined, true)) - bar.addEventListener('keydown', (e) => { - const step = e.key === 'ArrowRight' ? 20 : e.key === 'ArrowLeft' ? -20 : 0 - if (!step) return - e.preventDefault() - apply(panel.getBoundingClientRect().width + sign() * step, true) - }) - return bar - } - - /** - * Ziehen an der Linie zwischen Struktogramm und Programmieren: `panel` hat eine feste Breite, `partner` füllt den Rest. - * Reicht der Platz des Partners (oder von `panel`) nicht, schrumpfen die anderen Spalten; ihre Breite wird gemerkt. - */ - private pushResize(panel: HTMLElement, widthKey: string, partner: HTMLElement, startWidth: number): (width: number, remember: boolean) => void { - const minOf = (p: HTMLElement, fallback: number) => Math.max(parseFloat(getComputedStyle(p).minWidth) || 0, fallback) - const panelMin = minOf(panel, 200) - const slack = Math.max(0, partner.getBoundingClientRect().width - minOf(partner, 240)) - const yielders = this.yieldingPanels().map((y) => ({ ...y, start: y.panel.getBoundingClientRect().width, min: minOf(y.panel, 200), changed: false })) - const spare = yielders.reduce((sum, y) => sum + Math.max(0, y.start - y.min), 0) - return (wanted, remember) => { - const width = Math.round(Math.max(panelMin, Math.min(wanted, startWidth + slack + spare))) - // Was weder `panel` noch der Partner aufnehmen kann, geben die anderen Spalten ab, die nächste zuerst. - let need = Math.max(0, width - startWidth - slack, panelMin - wanted) - for (const y of yielders) { - const give = Math.min(need, Math.max(0, y.start - y.min)) - need -= give - y.changed ||= give > 0 - if (!y.changed) continue - y.panel.style.width = `${Math.round(y.start - give)}px` - if (remember) storeValue(y.key, String(Math.round(y.start - give))) - } - panel.style.width = `${width}px` - if (remember) storeValue(widthKey, String(width)) - } - } - - private findSubprogram(name: string, current: Tab | undefined = this.tab): VSDocument | undefined { - const key = subprogramKey(name) - if (key === '') return undefined - const match = this.tabs.find( - (tab) => tab !== current && (subprogramKey(tab.doc.caption) === key || subprogramKey(tabTitle(tab)) === key), - ) - return match?.doc - } - - private scrollToSimPath() { - const path = this.simPath - if (!this.simulating || !path) return - if (this.blockMode) return this.blocks?.scrollTo(path) - const node = this.flat.find((n) => samePath(n.idPath, path)) - if (!node) return - const host = this.canvasHost - const z = this.zoom - const f = { x: node.frame.x * z, y: node.frame.y * z, width: node.frame.width * z, height: node.frame.height * z } - const pad = 24 - if (f.y < host.scrollTop) host.scrollTop = Math.max(0, f.y - pad) - else if (f.y + Math.min(f.height, host.clientHeight - 2 * pad) > host.scrollTop + host.clientHeight) { - host.scrollTop = f.y - pad - } - if (f.x < host.scrollLeft || f.x > host.scrollLeft + host.clientWidth - pad) host.scrollLeft = Math.max(0, f.x - pad) - } - - // MARK: - Dokument - - private commit(next: VSDocument, select?: number[]) { - this.codeTyping = undefined - this.pushUndo(this.doc) - this.doc = next - this.dirty = true - if (select) this.selected = select - this.render() - } - - /** - * Getippter Code in „Code live“ ergab ein neues Struktogramm. Wer am Stück tippt, bekommt einen - * Rückgängig-Schritt pro kurzer Pause statt einen pro Buchstabe. - */ - private commitFromCode(next: VSDocument, select?: number[]) { - const now = Date.now() - const typing = this.codeTyping - if (!typing || typing.tab !== this.tab || now - typing.last > 1000 || now - typing.start > 5000) { - this.pushUndo(this.doc) - this.codeTyping = { tab: this.tab, start: now, last: now } - } else typing.last = now - this.doc = next - this.dirty = true - this.selected = sanitizedSelection(select ?? this.selected, next) - this.render() - } - - private pushUndo(prev: VSDocument) { - this.undoStack.push(prev) - while (this.undoStack.length > maxUndoSteps) this.undoStack.shift() - this.tab.redoStack = [] - } - - private undo() { - const prev = this.undoStack.pop() - if (!prev) return - this.codeTyping = undefined - this.redoStack.push(this.doc) - this.doc = prev - this.dirty = true - this.selected = sanitizedSelection(this.selected, this.doc) - this.render() - } - - private redo() { - const next = this.redoStack.pop() - if (!next) return - this.codeTyping = undefined - this.undoStack.push(this.doc) - this.doc = next - this.dirty = true - this.selected = sanitizedSelection(this.selected, this.doc) - this.render() - } - - private resetHistory() { - this.setSimulating(false) - this.tab.undoStack = [] - this.tab.redoStack = [] - this.selected = undefined - this.dirty = false - this.render() - } - - // MARK: - Reiter (DiagramSheetTabsModel.swift) - - private tabStrip!: HTMLElement - - private makeTab(): Tab { - return { doc: newEmptyDocument(), serial: this.nextTabSerial++, dirty: false, undoStack: [], redoStack: [], selected: [0] } - } - - private addTab(tab = this.makeTab()) { - this.setSimulating(false) - this.tabs.push(tab) - this.tabIndex = this.tabs.length - 1 - this.render() - } - - private switchTab(index: number) { - if (index === this.tabIndex || !this.tabs[index]) return - if (document.activeElement instanceof HTMLElement) document.activeElement.blur() - this.setSimulating(false) - this.tabIndex = index - this.render() - } - - private async closeTab(index: number) { - if (this.tabs.length <= 1) return - const tab = this.tabs[index] - if (tab.dirty && !tab.exerciseId) { - this.switchTab(index) - if (!(await this.confirmDiscard())) return - } - this.setSimulating(false) - this.tabs.splice(index, 1) - if (this.tabIndex > index || this.tabIndex >= this.tabs.length) this.tabIndex = Math.max(0, this.tabIndex - 1) - this.render() - } - - private renderTabs() { - const strip = this.tabStrip - strip.replaceChildren() - this.tabs.forEach((tab, i) => { - const item = document.createElement('div') - item.className = 'tab' + (i === this.tabIndex ? ' active' : '') - item.setAttribute('role', 'tab') - item.setAttribute('aria-selected', String(i === this.tabIndex)) - const label = document.createElement('button') - label.className = 'tab-label' - label.textContent = tabTitle(tab) - label.title = tab.fileName ?? tabTitle(tab) - label.addEventListener('click', () => this.switchTab(i)) - item.append(label) - // Wie bei VS Code: ungespeichert zeigt rechts einen Punkt, beim Darüberfahren wird er zum ✕. - const unsaved = tab.dirty && !tab.exerciseId - if (this.tabs.length > 1) { - const close = document.createElement('button') - close.className = 'tab-close' + (unsaved ? ' unsaved' : '') - close.innerHTML = '✕' - close.title = t('a11y_close_tab') - close.setAttribute('aria-label', `${t('a11y_close_tab')}: ${tabTitle(tab)}`) - close.addEventListener('click', () => this.closeTab(i)) - item.append(close) - } else if (unsaved) { - item.append(Object.assign(document.createElement('span'), { className: 'tab-close unsaved', innerHTML: '●' })) - } - if (unsaved) label.setAttribute('aria-label', `${tabTitle(tab)} (${t('web_status_modified')})`) - strip.append(item) - }) - const add = document.createElement('button') - add.className = 'tab-add' - add.textContent = '+' - add.title = t('a11y_new_diagram_tab') - add.setAttribute('aria-label', t('a11y_new_diagram_tab')) - add.addEventListener('click', () => this.addTab()) - strip.append(add) - } - - // MARK: - Zwischenablage (Element) - - private copySelection() { - const el = this.selected && tryElementAt(this.doc, this.selected) - if (!el) return false - this.clipboard = structuredClone(el) - this.showMessage(t('web_copied')) - return true - } - - private cutSelection() { - if (this.selected && canDeleteElement(this.doc, this.selected) && this.copySelection()) this.deleteSelection() - } - - private paste() { - if (this.clipboard) this.insertNearSelection(structuredClone(this.clipboard)) - } - - private deleteSelection() { - if (!this.selected || !canDeleteElement(this.doc, this.selected)) return - this.commit(deleteAtPath(this.doc, this.selected)) - this.selected = undefined - this.render() - } - - /** Einfügen ohne Ziehen: Platzhalter ersetzen bzw. hinter der Auswahl (oder ans Ende) einfügen. */ - /** Baustein für „Operatoren“ bzw. eine Variable: Name und Java, zum Ziehen auf ein Feld oder eine Bedingung */ - private expressionItem(label: string, java: string, shape: 'round' | 'bool', kind: 'op' | 'var', shown = java): HTMLLIElement { - const li = document.createElement('li') - li.className = `palette-item palette-sensor palette-expr palette-${kind}` - li.dataset.botColor = kind === 'op' ? 'operator' : 'variable' - li.title = java - const code = document.createElement('code') - code.textContent = shown - if (shape === 'bool') code.classList.add('sensor-bool') - li.append(document.createTextNode(label), code) - li.addEventListener('pointerdown', (e) => this.beginDrag(e, { kind: 'sensor', text: java, label: shown })) - li.tabIndex = 0 - li.addEventListener('keydown', (e) => { - if (e.key === 'Enter' || e.key === ' ') this.insertSensor(java) - }) - return li - } - - /** VisuBot: jede angelegte Variable als Baustein unter „Variablen“ (nur neu bauen, wenn sich etwas ändert) */ - private refreshVarPalette() { - if (!this.varList) return - const vars = programVariables(this.doc) - const key = vars.join(',') - if (key === this.shownVars) return - this.shownVars = key - this.varList.querySelectorAll('.palette-var').forEach((li) => li.remove()) - this.varList.append(...vars.map((v) => this.expressionItem(v, v, 'round', 'var'))) - } - - /** - * Blöcke: Operator, Variable oder Sensor auf einen Block (nicht auf ein Feld). Eine Bedingung wird ersetzt; - * „und“/„oder“/„nicht“ verbinden sich mit der alten Bedingung. Auf eine Anweisung passen nur Sensoren. - */ - private dropOnCondition(text: string, path: number[]) { - const el = elementAt(this.doc, path) - if (el.type === ElementType.anweisung) { - if (/^mbot\./.test(text)) this.insertSensor(text, path) - return - } - const old = el.textLines.join(' ').trim() - const next = - !old || old === 'true' - ? text - : text === 'true && true' - ? `${old} && true` - : text === 'true || true' - ? `${old} || true` - : text === '!true' - ? `!(${old})` - : text - this.commit(setTextLines(this.doc, path, [next]), path) - } - - /** - * VisuBot: Sensorwert in den Text eines Elements schreiben (ohne Ziel: in das gewählte Element). - * Leere Bedingung → nur der Wert; sonst kommt er hinten dazu. Den Vergleich (`< 20`) schreiben die Schüler selbst. - */ - private insertSensor(text: string, path = this.selected) { - if (!path || isPlaceholderSlot(this.doc, path)) return - const el = elementAt(this.doc, path) - if (!takesSensor.includes(el.type)) return - const old = (el.textLines ?? []).join(' ').trim() - this.commit(setTextLines(this.doc, path, [old ? `${old} ${text}` : text]), path) - // Gleich weiterschreiben können, z. B. ` < 20` - const ta = this.inspector.querySelector('textarea') - if (ta) { - ta.focus() - ta.setSelectionRange(ta.value.length, ta.value.length) - } - } - - private insertNearSelection(element: VSElement) { - const path = this.selected - if (path && isPlaceholderSlot(this.doc, path)) return this.commit(replaceAtPath(this.doc, path, element), path) - if (path) { - const next = [...path.slice(0, -1), path[path.length - 1] + 1] - return this.commit(insertAfterSibling(this.doc, element, path), next) - } - if (this.doc.elements.length === 1 && isPlaceholderSlot(this.doc, [0])) { - return this.commit(replaceAtPath(this.doc, [0], element), [0]) - } - this.commit(insertAt(this.doc, [], this.doc.elements.length, element), [this.doc.elements.length]) - } - - // MARK: - Dateien - - /** Rückfrage im Fenster selbst (`window.confirm` ist in eingebetteten Ansichten gesperrt). */ - private confirmDiscard(): Promise { - if (!this.dirty) return Promise.resolve(true) - return new Promise((resolve) => { - const box = document.createElement('div') - box.className = 'confirm' - box.innerHTML = `
    -

    ${e(t('close_unsaved_title'))}

    -

    ${e(t('web_discard_message_fmt', this.fileName))}

    -
    -
    ` - box.addEventListener('click', (e) => { - const r = (e.target as HTMLElement).dataset.r - if (r === undefined && e.target !== box) return - box.remove() - resolve(r === '1') - }) - document.body.append(box) - box.querySelector('[data-r="0"]')!.focus() - }) - } - - private showMessage(text: string) { - this.statusLine.textContent = text - this.statusLine.classList.add('message') - setTimeout(() => { - this.statusLine.classList.remove('message') - this.updateStatus() - }, 6000) - } - - /** Wie `openIncomingDocument`: ungespeicherte Änderungen oder eine verknüpfte Datei → neuer Reiter. */ - private loadXML(xml: string, name: string, handle?: FileHandle) { - let doc: VSDocument - try { - doc = decodeDocument(xml) - } catch (err) { - this.showMessage(t('web_err_unreadable_fmt', name, (err as Error).message)) - return - } - // Eine Übung bleibt in ihrem Reiter, auch wenn sie noch leer ist. - if (this.dirty || this.tab.fileName || this.tab.exerciseId) this.addTab() - this.doc = doc - this.tab.fileName = name.replace(/\.(strk|xml)$/i, '.visustruct') - this.fileHandle = handle && /\.visustruct$/i.test(name) ? handle : undefined - this.resetHistory() - } - - private async open(fallback: HTMLInputElement) { - const w = window as PickerWindow - if (!w.showOpenFilePicker || this.inViewer) return fallback.click() - try { - const [handle] = await w.showOpenFilePicker({ types: pickerTypes() }) - const file = await handle.getFile() - this.loadXML(await file.text(), file.name, handle) - } catch { - /* abgebrochen */ - } - } - - private async save() { - if (!this.downloads && (await this.saveToWorkspace())) return - const blob = new Blob([encodeDocument(this.doc)], { type: 'application/xml' }) - const w = window as PickerWindow - try { - if (this.downloads) { - // Die Vorschau erlaubt nur bekannte Endungen; die echte Web-App speichert direkt als .visustruct. - const filename = this.fileName + '.txt' - await this.downloads.save({ filename, data: blob }) - this.tab.fileName ??= this.fileName - this.dirty = false - this.render() - this.showMessage(t('web_saved_txt_fmt', filename)) - return - } - if (!this.fileHandle && w.showSaveFilePicker && !this.inViewer) { - this.fileHandle = await w.showSaveFilePicker({ suggestedName: this.fileName, types: pickerTypes() }) - this.tab.fileName = this.fileHandle.name - } - if (this.fileHandle) { - const out = await this.fileHandle.createWritable() - await out.write(blob) - await out.close() - } else { - const a = document.createElement('a') - a.href = URL.createObjectURL(blob) - a.download = this.fileName - a.click() - setTimeout(() => URL.revokeObjectURL(a.href), 1000) - } - this.tab.fileName ??= this.fileName - this.dirty = false - this.render() - } catch { - /* abgebrochen */ - } - } - - /** Datei zum Herunterladen anbieten (in der Vorschau über die `downloads`-Fähigkeit). */ - // MARK: - Export (wie `DiagramExporter`) - - private async exportDiagram(kind: ExportKind) { - // Die Datei selbst zum Weitergeben, z. B. per Mail oder in die Lernplattform; ändert nicht, wo gespeichert wird. - if (kind === 'visustruct') { - const base = Export.exportFilenameBase(this.doc, tabTitle(this.tab)) - return this.offerDownload(`${base}.visustruct`, new Blob([encodeDocument(this.doc)], { type: 'application/xml' })) - } - const image = Export.renderExportSVG(this.doc, this.metrics, this.measure) - if (!image) { - this.showMessage(t(kind === 'print' ? 'err_diagram_too_small_print' : 'err_diagram_too_small_export')) - return - } - const base = Export.exportFilenameBase(this.doc, tabTitle(this.tab)) - // Wie `displayScale` × Textgröße: scharf auch auf hochauflösenden Bildschirmen. - const scale = Math.max(2, window.devicePixelRatio || 1) * this.zoom - try { - switch (kind) { - case 'svg': { - image.svg.setAttribute('width', String(image.width * this.zoom)) - image.svg.setAttribute('height', String(image.height * this.zoom)) - await this.offerDownload(`${base}.svg`, new Blob([Export.svgMarkup(image)], { type: 'image/svg+xml' })) - break - } - case 'png': { - const canvas = await Export.rasterize(image, scale) - await this.offerDownload(`${base}.png`, await Export.canvasToPNG(canvas)) - break - } - case 'pdf': { - const canvas = await Export.rasterize(image, Math.max(scale, 3)) - const pdf = await Export.buildDiagramPDF(Export.canvasRGB(canvas), canvas.width, canvas.height, image, Export.exportVisibleDiagramTitle(this.doc)) - await this.offerDownload(`${base}.pdf`, pdf) - break - } - case 'print': - this.printDiagram(image) - break - } - } catch (err) { - this.showMessage(t('web_export_failed_fmt', err instanceof Error ? err.message : String(err))) - } - } - - /** Drucken: nur das Export-Bild auf die Seite (siehe `@media print` in styles.css). */ - private printDiagram(image: Export.ExportImage) { - const sheet = document.createElement('div') - sheet.className = 'print-sheet' - image.svg.removeAttribute('width') - image.svg.removeAttribute('height') - sheet.append(image.svg) - document.body.append(sheet) - const cleanup = () => sheet.remove() - window.addEventListener('afterprint', cleanup, { once: true }) - try { - window.print() - } catch { - cleanup() - this.showMessage(`${t('err_print_unavailable')} ${t('web_print_hint')}`) - return - } - // Manche Browser senden kein `afterprint`. - setTimeout(cleanup, 60_000) - } - - private async offerDownload(filename: string, blob: Blob) { - try { - if (this.downloads) { - try { - await this.downloads.save({ filename, data: blob }) - this.showMessage(t('web_saved_fmt', filename)) - } catch { - // Die Vorschau erlaubt nur bekannte Endungen. - await this.downloads.save({ filename: filename + '.txt', data: blob }) - this.showMessage(t('web_saved_txt_fmt', filename + '.txt')) - } - return - } - const a = document.createElement('a') - a.href = URL.createObjectURL(blob) - a.download = filename - a.click() - setTimeout(() => URL.revokeObjectURL(a.href), 1000) - } catch { - this.showMessage(t('err_save_failed_fmt', filename)) - } - } - - private setupFileDrop() { - window.addEventListener('dragover', (e) => { - if (e.dataTransfer?.types.includes('Files')) { - e.preventDefault() - this.root.classList.add('file-drag') - } - }) - window.addEventListener('dragleave', (e) => { - if (e.relatedTarget === null) this.root.classList.remove('file-drag') - }) - window.addEventListener('drop', async (e) => { - this.root.classList.remove('file-drag') - const f = e.dataTransfer?.files[0] - if (!f) return - e.preventDefault() - this.loadXML(await f.text(), f.name) - }) - } - - private onKeyDown(e: KeyboardEvent) { - const mod = e.metaKey || e.ctrlKey - // Auch der Code-Editor in „Code live“ (contenteditable): Löschen und ⌘Z gehören dort dem Text. - const typing = - e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLInputElement || (e.target as HTMLElement | null)?.isContentEditable === true - if (mod && e.key.toLowerCase() === 's') { - e.preventDefault() - this.save() - } else if (mod && e.key.toLowerCase() === 'p') { - e.preventDefault() - if (!this.simulating) void this.exportDiagram('print') - } else if (mod && e.key.toLowerCase() === 'o') { - e.preventDefault() - this.open(this.root.querySelector('input[type=file]')!) - } else if (typing || this.simulating) { - return - } else if (mod && e.key.toLowerCase() === 'z') { - e.preventDefault() - if (e.shiftKey) this.redo() - else this.undo() - } else if (mod && e.key.toLowerCase() === 'c' && !getSelection()?.toString()) { - if (this.copySelection()) e.preventDefault() - } else if (mod && e.key.toLowerCase() === 'x') { - e.preventDefault() - this.cutSelection() - } else if (mod && e.key.toLowerCase() === 'v') { - e.preventDefault() - this.paste() - } else if (mod && e.key.toLowerCase() === 'y') { - e.preventDefault() - this.redo() - } else if (e.key === 'Enter' && this.selected && !this.blockMode && !mod) { - e.preventDefault() - this.startInlineEdit(this.selected) - } else if (e.key === 'F2' && this.selected) { - e.preventDefault() - this.renameVariable(this.selected) - } else if (e.key === 'Delete' || e.key === 'Backspace') { - e.preventDefault() - this.deleteSelection() - } else if (e.key === 'Escape') { - if (this.drag) this.endDrag() - else { - this.selected = undefined - this.render() - } - } - } - - // MARK: - Auswahl und Drag & Drop (Zeiger-Ereignisse: Maus, Stift und Finger gleich) - - private svgPoint(clientX: number, clientY: number): { x: number; y: number } | undefined { - if (!this.svg) return undefined - const r = this.svg.getBoundingClientRect() - const x = clientX - r.left - const y = clientY - r.top - if (x < 0 || y < 0 || x > r.width || y > r.height) return undefined - return { x: x / this.zoom, y: y / this.zoom } - } - - /** Tiefster Knoten unter dem Punkt (Kinder liegen über ihren Eltern). */ - private nodeAt(x: number, y: number): LayoutNode | undefined { - for (let i = this.flat.length - 1; i >= 0; i--) { - const f = this.flat[i].frame - if (x >= f.x && x <= f.x + f.width && y >= f.y && y <= f.y + f.height) return this.flat[i] - } - return undefined - } - - private onCanvasPointerDown(e: PointerEvent) { - if (this.simulating) return - const p = this.svgPoint(e.clientX, e.clientY) - if (!p) return - // Offene Texteingabe abschließen (zählt dann als ein Rückgängig-Schritt). - this.inline?.finish(true) - if (document.activeElement instanceof HTMLElement) document.activeElement.blur() - const node = this.nodeAt(p.x, p.y) - const wasSelected = node && this.selected && samePath(node.idPath, this.selected) - // Doppelklick bzw. Doppeltipp auf dasselbe Element: Text direkt im Struktogramm bearbeiten. - const spot = node ? node.idPath.join(',') : '' - const now = Date.now() - const last = this.lastCanvasTap - const twice = !!node && e.button === 0 && spot === last.spot && now - last.time < 500 && Math.hypot(e.clientX - last.x, e.clientY - last.y) < 24 - this.lastCanvasTap = { spot, time: twice ? 0 : now, x: e.clientX, y: e.clientY } - this.selected = node?.idPath - this.render() - if (twice && node) { - e.preventDefault() - this.pendingInline = { pointerId: e.pointerId, path: node.idPath, point: p } - return - } - // Verschieben mit Maus/Stift; mit dem Finger würde es mit dem Scrollen kollidieren. - if (node && e.pointerType !== 'touch' && !(isPlaceholderSlot(this.doc, node.idPath) && !wasSelected)) { - this.beginDrag(e, { kind: 'move', path: node.idPath }) - } - } - - private beginDrag(e: PointerEvent, source: DragSource) { - if (e.button !== 0 || this.simulating) return - e.preventDefault() - this.drag = { source, pointerId: e.pointerId, startX: e.clientX, startY: e.clientY, active: false } - } - - private onPointerMove(e: PointerEvent) { - const d = this.drag - if (!d || e.pointerId !== d.pointerId) return - if (!d.active) { - if (Math.hypot(e.clientX - d.startX, e.clientY - d.startY) < 5) return - d.active = true - d.ghost = this.makeGhost(d.source) - document.body.append(d.ghost) - this.root.classList.add('dragging') - if (this.blockMode && d.source.kind === 'move') this.blocks?.setMoving(true) - } - d.ghost!.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)` - this.autoScroll(e.clientX, e.clientY) - if (this.blockMode) { - d.target = this.blockDropAt(e.clientX, e.clientY, d.source) - } else { - const p = this.svgPoint(e.clientX, e.clientY) - d.target = p ? this.dropTargetAt(p.x, p.y, d.source) : undefined - } - this.showDropTarget(d.target) - } - - private onPointerUp(e: PointerEvent) { - const pending = this.pendingInline - if (pending && pending.pointerId === e.pointerId) { - this.pendingInline = undefined - this.startInlineEdit(pending.path, pending.point) - return - } - const d = this.drag - if (!d || e.pointerId !== d.pointerId) return - if (d.active && d.target) this.applyDrop(d.source, d.target) - else if (!d.active && d.source.kind === 'palette') this.insertNearSelection(d.source.make()) - else if (!d.active && d.source.kind === 'sensor') this.insertSensor(d.source.text) - this.endDrag() - } - - private endDrag() { - this.drag?.ghost?.remove() - this.drag = undefined - this.root.classList.remove('dragging') - this.blocks?.setMoving(false) - this.showDropTarget(undefined) - } - - /** Blöcke: Ablegestelle unter dem Zeiger, in derselben Form wie im Struktogramm. */ - private blockDropAt(clientX: number, clientY: number, source: DragSource): DropTarget | undefined { - const drop = this.blocks?.dropAt(clientX, clientY, { - moving: source.kind === 'move' ? source.path : undefined, - // Sensoren auch auf Anweisungen, Operatoren und Variablen nur auf Bedingungen (oder genau auf ein Feld) - sensor: - source.kind === 'sensor' - ? (path) => { - const type = elementAt(this.doc, path).type - return /^mbot\./.test(source.text) ? takesSensor.includes(type) : type !== ElementType.anweisung && takesSensor.includes(type) - } - : undefined, - }) - if (!drop) return undefined - return { ...drop, frame: { x: 0, y: 0, width: 0, height: 0 } } - } - - private makeGhost(source: DragSource): HTMLElement { - const g = document.createElement('div') - g.className = 'drag-ghost' - if (source.kind === 'palette' || source.kind === 'sensor') { - g.textContent = source.label - if (source.kind === 'sensor' && this.blockMode) { - const sensor = /^mbot\./.test(source.text) - const bool = sensor ? /^mbot\.is/.test(source.text) : isBoolExpression(source.text) - g.classList.add('drag-sensor', ...(bool ? ['sensor-bool'] : []), ...(sensor ? [] : [/^[A-Za-z_]\w*$/.test(source.text) ? 'drag-var' : 'drag-op'])) - } - // in den Blöcken sieht auch das Ziehbild wie ein Block aus - if (source.kind === 'palette' && this.blockMode) { - g.classList.add('drag-block') - g.dataset.scope = scopeKind(source.make().type) ?? 'method' - } - } else { - const e = elementAt(this.doc, source.path) - g.textContent = `${typeName(e.type)}: ${canvasTextLines(e)[0]}` - } - return g - } - - private autoScroll(clientX: number, clientY: number) { - const host = this.blockMode && this.blocks ? this.blocks.element : this.canvasHost - const r = host.getBoundingClientRect() - const edge = 40 - const step = 12 - if (clientY > r.bottom - edge && clientY < r.bottom + edge) host.scrollTop += step - else if (clientY < r.top + edge && clientY > r.top - edge) host.scrollTop -= step - if (clientX > r.right - edge && clientX < r.right + edge) host.scrollLeft += step - else if (clientX < r.left + edge && clientX > r.left - edge) host.scrollLeft -= step - } - - private dropTargetAt(x: number, y: number, source: DragSource): DropTarget | undefined { - const roots = this.layout?.elements ?? [] - const node = this.nodeAt(x, y) - if (source.kind === 'sensor') { - // Nur auf ein Element mit Bedingung oder eine Anweisung, nicht dazwischen - if (!node || isPlaceholderSlot(this.doc, node.idPath)) return undefined - return takesSensor.includes(elementAt(this.doc, node.idPath).type) ? { kind: 'condition', path: node.idPath, frame: node.frame } : undefined - } - if (!node) { - const last = roots[roots.length - 1] - if (!last) return undefined - const bottom = last.frame.y + last.frame.height - if (y > bottom) { - if (source.kind === 'move' && source.path.length === 1 && source.path[0] === roots.length - 1) return undefined - return { kind: 'rootAppend', frame: { x: last.frame.x, y: bottom, width: last.frame.width, height: 0 } } - } - if (y < roots[0].frame.y) return { kind: 'before', path: [0], frame: roots[0].frame } - return undefined - } - const path = node.idPath - if (source.kind === 'move' && path.length >= source.path.length && source.path.every((v, i) => path[i] === v)) { - return undefined // nicht in sich selbst ablegen - } - if (isPlaceholderSlot(this.doc, path)) return { kind: 'replace', path, frame: node.frame } - const upper = y < node.frame.y + node.frame.height / 2 - return { kind: upper ? 'before' : 'after', path, frame: node.frame } - } - - private showDropTarget(t: DropTarget | undefined) { - if (this.blockMode) { - this.blocks?.showDrop(t as BlockDrop | undefined) - return - } - if (!this.overlay) return - this.overlay.replaceChildren() - if (!t) return - const f = t.frame - if (t.kind === 'replace' || t.kind === 'condition') { - this.overlay.append(el('rect', { x: f.x + 2, y: f.y + 2, width: f.width - 4, height: f.height - 4, class: 'drop-replace' })) - return - } - const y = t.kind === 'before' ? f.y : f.y + f.height - this.overlay.append(el('rect', { x: f.x, y: y - 3, width: f.width, height: 6, rx: 3, class: 'drop-line' })) - } - - private applyDrop(source: DragSource, t: DropTarget) { - const doc = this.doc - try { - if (source.kind === 'sensor') { - if (t.kind === 'condition') { - if (this.blockMode) this.dropOnCondition(source.text, t.path) - else this.insertSensor(source.text, t.path) - } - if (t.kind === 'slot') { - // Blöcke: Wert bzw. Sensor durch Sensor, Operator oder Variable ersetzen (`mbot.forward(mbot.getDistance())`) - const next = t.slot === 'value' ? replaceBlockValue(doc, t.path, t.index, source.text) : replaceBlockSensor(doc, t.path, t.index, source.text) - if (next) this.commit(setTextLines(doc, t.path, next), t.path) - } - return - } - if (t.kind === 'condition' || t.kind === 'slot') return - if (t.kind === 'trash') { - if (source.kind === 'move' && canDeleteElement(doc, source.path)) this.commit(deleteAtPath(doc, source.path)) - return - } - if (source.kind === 'palette') { - const made = source.make() - // Blöcke: neue for-Schleife zählt gleich von 0 bis unter 10 (Kinder tippen nur noch Zahlen) - const element = this.blockMode ? withCountLoopDefaults(doc, t.kind === 'rootAppend' ? [doc.elements.length] : t.path, made) : made - switch (t.kind) { - case 'replace': - return this.commit(replaceAtPath(doc, t.path, element), t.path) - case 'before': - return this.commit(insertBeforeSibling(doc, element, t.path), t.path) - case 'after': - return this.commit(insertAfterSibling(doc, element, t.path), [...t.path.slice(0, -1), t.path[t.path.length - 1] + 1]) - case 'rootAppend': - return this.commit(insertAt(doc, [], doc.elements.length, element), [doc.elements.length]) - } - } - const from = source.path - switch (t.kind) { - case 'replace': - return this.commit(moveReplacingPlaceholder(doc, from, t.path)) - case 'before': - return this.commit(moveBeforeSibling(doc, from, t.path)) - case 'after': - return this.commit(moveAfterSibling(doc, from, t.path)) - case 'rootAppend': { - const moving = elementAt(doc, from) - return this.commit(insertAt(deleteAtPath(doc, from), [], Number.MAX_SAFE_INTEGER, moving)) - } - } - } catch (err) { - console.warn('Ablegen nicht möglich', err) - } finally { - if (source.kind === 'move') { - this.selected = undefined - this.render() - } - } - } -} - -type ExportKind = 'png' | 'svg' | 'pdf' | 'print' | 'visustruct' - -/** Wie `DiagramCanvasView.displayTextLines`: Texte leerer Elemente in der gewählten Sprache. */ -export function applyCanvasStubTexts() { - setCanvasStubTexts({ - [ElementType.anweisung]: t('canvas_stub_anweisung'), - [ElementType.verzweigung]: t('canvas_stub_condition'), - [ElementType.fallauswahl]: t('canvas_stub_fallauswahl'), - [ElementType.forSchleife]: t('canvas_stub_for'), - [ElementType.whileSchleife]: t('canvas_stub_while'), - [ElementType.doUntilSchleife]: t('canvas_stub_while'), - [ElementType.endlosschleife]: t('canvas_stub_endless'), - [ElementType.aussprung]: t('canvas_stub_break'), - [ElementType.aufruf]: t('canvas_stub_call'), - }) -} - -/** Gleiche Namen für Aufruf und Reiter: ohne `()`, ohne Groß- und Kleinschreibung. */ -function subprogramKey(text: string): string { - return subprogramName(text).toLowerCase() -} - -function tabTitle(tab: Tab): string { - if (tab.fileName) return tab.fileName.replace(/\.(visustruct|strk)$/i, '') - return tab.doc.caption.trim() || t('tab_title_format', tab.serial) -} - -/** Breite des Lernbereichs: mindestens 260 px, dem Editor bleiben mindestens 420 px. */ -function clampPanelWidth(width: number): number { - return Math.round(Math.max(200, Math.min(width, window.innerWidth - 300))) -} - -function storedValue(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function storeValue(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } -} - -function escapeHTML(s: string): string { - return s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) -} - -/** Welten einer VisuBot-Übung (`welt:`), in der Reihenfolge der Tests. */ -function exerciseWorlds(id: string | undefined): RobotWorldSetup[] { - if (!id) return [] - for (const block of [...lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks)), ...tasks.flatMap((t) => t.blocks)]) { - if (block.kind !== 'exercise' || block.exercise.id !== id) continue - return block.exercise.tests.flatMap((test) => { - const setup = test.world ? world(test.world) : undefined - return setup ? [setup] : [] - }) - } - return [] -} diff --git a/web/src/ui/blockPicture.ts b/web/src/ui/blockPicture.ts deleted file mode 100644 index d733cead..00000000 --- a/web/src/ui/blockPicture.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { LiveLabels } from '../core/codeGenerator' -import { parseLiveJava } from '../core/javaParser' -import { documentFromJava } from '../core/liveSource' -import { BlockView, type BlockViewOptions } from './blockView' -import { t } from './i18n' - -/** Beschriftungen der Block-Ansicht (übersetzt), für den Editor und für Bilder in Lektionen. */ -export function blockViewLabels(): BlockViewOptions['labels'] { - return { - start: t('web_visubot_blocks_start'), - else: t('web_visubot_blocks_else'), - empty: t('web_visubot_blocks_empty'), - hint: t('web_visubot_blocks_hint'), - trash: t('web_visubot_blocks_trash'), - count: t('web_visubot_blocks_count'), - countFrom: t('web_visubot_blocks_count_from'), - countBelow: t('web_visubot_blocks_count_below'), - countTo: t('web_visubot_blocks_count_to'), - countAbove: t('web_visubot_blocks_count_above'), - countStep: t('web_visubot_blocks_count_step'), - repeat: t('web_visubot_blocks_repeat'), - repeatTimes: t('web_visubot_blocks_repeat_times'), - randomFrom: t('web_visubot_blocks_random_from'), - randomTo: t('web_visubot_blocks_random_to'), - keywords: { - if: t('web_visubot_blocks_if'), - while: t('web_visubot_blocks_while'), - endless: t('web_visubot_blocks_endless'), - do: t('web_visubot_blocks_do'), - '!': t('web_visubot_blocks_not'), - '&&': t('web_visubot_blocks_and'), - '||': t('web_visubot_blocks_or'), - break: t('web_visubot_blocks_break'), - }, - } -} - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - -/** - * Java-Schnipsel einer Lektion (z. B. eine Runde von „Wo landet der mBot2?“) als Blöcke wie im Editor, nur zum Ansehen. - * Für die Block-Lektionen (Holger 5.11.): Jüngere sehen dort Blöcke statt Java. `undefined`, wenn der Code nicht passt. - */ -export function blockPicture(java: string): HTMLElement | undefined { - const parsed = parseLiveJava(java, labels) - if (parsed.problems.length > 0 || parsed.elements.length === 0) return undefined - const doc = documentFromJava({ caption: '', elements: [] }, parsed) - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: { ...blockViewLabels(), hint: '' } }) - view.render(doc, undefined, true) - view.element.hidden = false - view.element.classList.add('bk-picture') - return view.element -} diff --git a/web/src/ui/blockView.ts b/web/src/ui/blockView.ts deleted file mode 100644 index b1a17b58..00000000 --- a/web/src/ui/blockView.ts +++ /dev/null @@ -1,765 +0,0 @@ -import { canvasTextLines, keywordSplit } from '../core/diagramText' -import { isPlaceholderElement } from '../core/editing' -import { ElementType, type VSDocument, type VSElement } from '../core/model' -import { samePath } from './renderer' -import { countLoopLines, countVar, declaredVariables, insertExpression, isRepeatLoop, javaTypes, randomJava, randomPattern, readCountLoop, readRandom, setCountField, usesVariable, type CountLoop } from 'visublocks' -import { visuBotGroupColor, visuBotGroupIcon, visuBotSensors, visuBotTemplates } from './visubotView' - -/** - * Blöcke (VisuBot): dasselbe Struktogramm als Scratch-artige Blöcke, Aussehen wie der Block-Modus von VisuMicro. - * Anweisungen sind Stapelblöcke, Schleifen und Verzweigungen Klammerblöcke („C-Blöcke“) mit Maul. - * Die Farben sind die des Struktogramms (Anweisung gelb, Schleife rosa, Verzweigung blau); mBot2-Befehle - * tragen zusätzlich den Streifen und das Symbol ihrer Gruppe wie in der Palette. - * Blöcke lassen sich auswählen, aus der Palette hineinziehen, verschieben und in den Papierkorb werfen; - * Zahlen und Texte (weiße Felder) ändert man per Klick direkt im Block. - */ - -/** Ein Wort auf einem Block: Text, Schlüsselwort (fett), Wert (weißes Feld) oder Sensor (türkiser Baustein). */ -export interface BlockToken { - kind: 'text' | 'kw' | 'lit' | 'str' | 'sensor' | 'var' | 'random' - text: string - /** Variable, die gerade angelegt oder gesetzt wird: Baustein, aber kein Feld */ - fixed?: boolean - /** Zufallszahl: von, bis */ - from?: string - to?: string -} - -const sensorCalls = new Set(visuBotSensors.map((s) => s.text.match(/^mbot\.(\w+)\(\)/)?.[1]).filter((n): n is string => !!n)) - -/** - * Stellen in einer Zeile, die im Block besonders aussehen: Zufallszahl, Zeichenkette, Sensor (bzw. andere - * `mbot.…()`), Zahl, true/false/null und angelegte Variablen. - */ -const scanPattern = () => - new RegExp( - `(${randomPattern().source})|("(?:[^"\\\\]|\\\\.)*")|(mbot\\.(\\w+)\\(\\))|(\\b\\d+(?:\\.\\d+)?\\b)|\\b(true|false|null)\\b|\\b([A-Za-z_]\\w*)\\b`, - 'g', - ) - -/** Eine besondere Stelle: `field` = man kann sie per Klick ändern oder etwas darauf ziehen */ -interface Hit { - start: number - end: number - kind: 'random' | 'str' | 'sensor' | 'lit' | 'var' - text: string - field: boolean -} - -/** mBot2-Befehle, deren Zahl man in der leeren Klammer ergänzt (aus „Elemente“ kommen sie als `mbot.forward()`) */ -const emptyArgCommands = new Set(['forward', 'backward', 'turnRight', 'turnLeft']) - -const typeBefore = new RegExp(`\\b(?:${javaTypes.join('|')})\\s+$`) - -function scan(line: string, vars: ReadonlySet): Hit[] { - const out: Hit[] = [] - for (const m of line.matchAll(scanPattern())) { - const start = m.index ?? 0 - const end = start + m[0].length - const hit = (kind: Hit['kind'], field = true) => out.push({ start, end, kind, text: m[0], field }) - if (m[1]) hit('random') - else if (m[4]) hit('str') - else if (m[5]) { - // andere mbot-Aufrufe (mbot.stop()) sind kein Sensor; Befehle mit leerer Klammer (`mbot.forward()`) - // bekommen dort ein leeres Feld, damit Kinder die Zahl nur noch eintippen - if (sensorCalls.has(m[6])) hit('sensor') - else if (emptyArgCommands.has(m[6])) out.push({ start: end - 1, end: end - 1, kind: 'lit', text: '', field: true }) - } else if (m[7] || m[8]) hit('lit') - else if (m[9] && vars.has(m[9]) && line[start - 1] !== '.') { - // Name, der gerade angelegt (`int zahl`) oder gesetzt (`zahl = …`) wird: Baustein, aber kein Feld - const target = typeBefore.test(line.slice(0, start)) || /^\s*=(?!=)/.test(line.slice(end)) - hit('var', !target) - } - } - return out -} - -/** Felder einer Zeile in Block-Reihenfolge: jede Zufallszahl hat zwei (von, bis) */ -interface ValueField { - hit: Hit - /** bei der Zufallszahl: 0 = von, 1 = bis */ - part?: 0 | 1 -} - -function valueFields(line: string, vars: ReadonlySet): ValueField[] { - const out: ValueField[] = [] - for (const hit of scan(line, vars)) { - if (!hit.field || hit.kind === 'sensor') continue - if (hit.kind === 'random') out.push({ hit, part: 0 }, { hit, part: 1 }) - else out.push({ hit }) - } - return out -} - -const noVars: ReadonlySet = new Set() - -/** - * Den `index`-ten Wert (Zahl, Text, true/false/null, Variable, von/bis einer Zufallszahl) in den Zeilen - * eines Elements ersetzen. Die Werte stehen in den Blöcken in derselben Reihenfolge wie im gespeicherten - * Text (auch bei `for` und `while`). Ein Operator bekommt Klammern, wenn er sie braucht. - */ -export function replaceValue(lines: string[], index: number, value: string, vars = noVars): string[] | undefined { - let n = 0 - for (let l = 0; l < lines.length; l++) { - for (const f of valueFields(lines[l], vars)) { - if (n++ !== index) continue - const out = [...lines] - if (f.part !== undefined) { - // Zufallszahl: nur ganze Zahlen als Grenzen - const r = readRandom(f.hit.text) - if (!r || !/^-?\d+$/.test(value.trim())) return undefined - const v = Number(value) - out[l] = lines[l].slice(0, f.hit.start) + randomJava(f.part === 0 ? v : r.from, f.part === 1 ? v : r.to) + lines[l].slice(f.hit.end) - } else out[l] = insertExpression(lines[l], f.hit.start, f.hit.end, value) - return out - } - } - return undefined -} - -/** Den `index`-ten Sensor (`mbot.getDistance()` …) in den Zeilen eines Elements ersetzen. */ -export function replaceSensor(lines: string[], index: number, value: string, vars = noVars): string[] | undefined { - let n = 0 - for (let l = 0; l < lines.length; l++) { - for (const hit of scan(lines[l], vars)) { - if (hit.kind !== 'sensor' || n++ !== index) continue - const out = [...lines] - out[l] = insertExpression(lines[l], hit.start, hit.end, value) - return out - } - } - return undefined -} - -/** Alle Zeilen des Programms (für die angelegten Variablen) */ -function allLines(els: VSElement[], out: string[] = []): string[] { - for (const e of els) { - out.push(...e.textLines) - if (e.loopBody) allLines(e.loopBody, out) - for (const c of e.cases ?? []) allLines(c.elements, out) - } - return out -} - -/** Variablen, die in Anweisungen angelegt werden (ohne Zählvariablen von Schleifen) */ -export function statementVariables(doc: VSDocument): string[] { - const lines: string[] = [] - const walk = (els: VSElement[]) => { - for (const e of els) { - if (e.type === ElementType.anweisung) lines.push(...e.textLines) - if (e.loopBody) walk(e.loopBody) - for (const c of e.cases ?? []) walk(c.elements) - } - } - walk(doc.elements) - return declaredVariables(lines) -} - -/** Namen der angelegten Variablen im ganzen Programm (`int zahl = 0`, auch Zählvariablen) */ -export const programVariables = (doc: VSDocument): string[] => declaredVariables(allLines(doc.elements)) - -/** Element am Pfad und Zahl der umgebenden for-Schleifen (für den Namen der Zählvariable: i, j, k …) */ -export function elementWithForDepth(doc: VSDocument, path: number[]): { element?: VSElement; depth: number } { - let els = doc.elements - let depth = 0 - for (let k = 0; k < path.length; k += 2) { - const e = els[path[k]] - if (!e || k === path.length - 1) return { element: e, depth } - if (e.type === ElementType.forSchleife) depth++ - const next = e.loopBody && path[k + 1] === 0 ? e.loopBody : e.cases?.[path[k + 1]]?.elements - if (!next) return { depth } - els = next - } - return { depth } -} - -/** Zählschleife eines for-Elements (leere Schleife → Standard mit passender Variable), sonst `undefined` */ -export function countLoopOf(element: VSElement, depth: number): CountLoop | undefined { - return element.type === ElementType.forSchleife ? readCountLoop(element.textLines, countVar(depth)) : undefined -} - -/** - * Wert Nummer `index` im Block am Pfad ersetzen. Zählschleifen haben die Felder Start, Ende, Schritt und - * schreiben den ganzen Java-Kopf neu (`0` beim Start → `int i = 0`); sonst wie `replaceValue`. - */ -export function replaceBlockValue(doc: VSDocument, path: number[], index: number, value: string): string[] | undefined { - const { element, depth } = elementWithForDepth(doc, path) - if (!element) return undefined - const loop = countLoopOf(element, depth) - if (loop) { - const next = setCountField(loop, index, value) - return next && countLoopLines(next) - } - return replaceValue(element.textLines, index, value, new Set(programVariables(doc))) -} - -/** Sensor Nummer `index` im Block am Pfad ersetzen (auch durch einen Operator oder eine Variable) */ -export function replaceBlockSensor(doc: VSDocument, path: number[], index: number, value: string): string[] | undefined { - const { element } = elementWithForDepth(doc, path) - return element && replaceSensor(element.textLines, index, value, new Set(programVariables(doc))) -} - -/** Neue for-Schleife aus der Palette in den Blöcken: gleich „von 0 bis unter 10 in Schritten von 1“ */ -export function withCountLoopDefaults(doc: VSDocument, path: number[], element: VSElement): VSElement { - if (element.type !== ElementType.forSchleife || element.textLines.some((l) => l.trim() !== '')) return element - const { depth } = elementWithForDepth(doc, [...path.slice(0, -1), Number.MAX_SAFE_INTEGER]) - return { ...element, textLines: countLoopLines(readCountLoop([], countVar(depth))!) } -} - -/** Eingabe im Wertfeld → Java-Text: Zahl bzw. true/false/null bleibt, Text kommt in Anführungszeichen. */ -export function valueText(kind: 'lit' | 'str', input: string): string | undefined { - if (kind === 'str') return JSON.stringify(input) - const v = input.trim().replace(',', '.') - return /^-?\d+(\.\d+)?$/.test(v) || /^(true|false|null)$/.test(v) ? v : undefined -} - -/** Zeile → Wörter: führendes Schlüsselwort, Zeichenketten, Zahlen, Sensoren, Variablen und Zufallszahlen. */ -export function blockTokens(line: string, vars = noVars): BlockToken[] { - const out: BlockToken[] = [] - const split = keywordSplit(line) - let rest = line - if (split) { - out.push({ kind: 'kw', text: split.keyword }) - rest = split.rest ? ` ${split.rest}` : '' - } - let at = 0 - const text = (s: string) => { - if (!s) return - const last = out[out.length - 1] - if (last?.kind === 'text') last.text += s - else out.push({ kind: 'text', text: s }) - } - for (const h of scan(rest, vars)) { - text(rest.slice(at, h.start)) - if (h.kind === 'random') { - const r = readRandom(h.text)! - out.push({ kind: 'random', text: h.text, from: String(r.from), to: String(r.to) }) - } else out.push(h.kind === 'var' && !h.field ? { kind: 'var', text: h.text, fixed: true } : { kind: h.kind, text: h.text }) - at = h.end - } - text(rest.slice(at)) - return out -} - -const commandGroups = new Map() -for (const tpl of visuBotTemplates) { - const name = tpl.make().textLines[0]?.match(/^mbot\.(\w+)/)?.[1] - if (name && !commandGroups.has(name)) commandGroups.set(name, tpl.group) -} - -/** Gruppe eines mBot2-Befehls (`mbot.forward(50)` → `drive`), sonst `undefined`. */ -export function blockGroup(element: VSElement): string | undefined { - if (element.type !== ElementType.anweisung) return undefined - const name = element.textLines.join(' ').trim().match(/^mbot\.(\w+)/)?.[1] - return name ? commandGroups.get(name) : undefined -} - -/** Pfad des Elements und laufende Nummer seiner Werte */ -interface ValueSlot { - path: number[] - n: number - /** laufende Nummer der Sensoren */ - s: number -} - -const iconPrefix = new RegExp(`^(?:${Object.values(visuBotGroupIcon).map((i) => i.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|')})\\s+(?=mbot\\.)`, 'u') - -/** - * Bis 0.15.19 schrieben die Blöcke das Gruppensymbol versehentlich in den Befehl (`🚗 mbot.forward(50)`). - * Entfernt es aus allen Anweisungen; `undefined`, wenn nichts zu tun ist. - */ -export function withoutBlockIcons(doc: VSDocument): VSDocument | undefined { - let changed = false - const clean = (els: VSElement[]): VSElement[] => - els.map((e) => { - const textLines = e.type === ElementType.anweisung ? e.textLines.map((l) => l.replace(iconPrefix, '')) : e.textLines - if (textLines.some((l, i) => l !== e.textLines[i])) changed = true - return { - ...e, - textLines, - loopBody: e.loopBody && clean(e.loopBody), - cases: e.cases?.map((c) => ({ ...c, elements: clean(c.elements) })), - } - }) - const elements = clean(doc.elements) - return changed ? { ...doc, elements } : undefined -} - -export interface BlockViewOptions { - /** Zeiger auf einem Block: auswählen und ggf. Ziehen beginnen. */ - press: (path: number[], event: PointerEvent) => void - /** Wert Nummer `index` im Element `path` ändern (`text` ist schon Java: `50`, `"Hallo"`). */ - editValue: (path: number[], index: number, text: string) => void - /** Texte der Knöpfe/Beschriftungen (übersetzt). */ - labels: { - start: string - else: string - empty: string - hint: string - trash: string - /** Zählschleife: „zähle mit“ i „von“ 0 „bis unter“/„bis“/„bis über“ 10 „in Schritten von“ 1 */ - count: string - countFrom: string - countBelow: string - countTo: string - countAbove: string - countStep: string - /** „wiederhole“ [10] „mal“ */ - repeat: string - repeatTimes: string - /** „Zufallszahl von“ [1] „bis“ [10] */ - randomFrom: string - randomTo: string - /** Schlüsselwörter im Block übersetzt: `if` → „wenn“, `while` → „solange“, `endless` → „wiederhole immer“, `do` → „mache“. */ - keywords?: Record - } -} - -/** - * Wohin ein gezogener Block fällt: vor/hinter einen Block, an die Stelle eines leeren Platzes, ans Ende, - * in die Bedingung (Sensor) oder in den Papierkorb (nur beim Verschieben). - */ -export type BlockDrop = - | { kind: 'before' | 'after' | 'replace' | 'condition'; path: number[] } - /** Sensor auf ein Feld: Wert bzw. Sensor Nummer `index` im Element `path` ersetzen */ - | { kind: 'slot'; path: number[]; slot: 'value' | 'sensor'; index: number } - | { kind: 'rootAppend' } - | { kind: 'trash' } - -export interface BlockDropQuery { - /** Verschieben: dieser Block (er kann nicht in sich selbst fallen) */ - moving?: number[] - /** Sensor: passt er in diesen Block? (Bedingung oder Anweisung) */ - sensor?: (path: number[]) => boolean -} - -const pathOf = (el: Element | null | undefined): number[] | undefined => - el instanceof HTMLElement && el.dataset.path ? (JSON.parse(el.dataset.path) as number[]) : undefined -const startsWith = (path: number[], prefix: number[]) => path.length >= prefix.length && prefix.every((v, i) => path[i] === v) -const upperHalf = (el: Element, clientY: number) => { - const r = el.getBoundingClientRect() - return clientY < r.top + r.height / 2 -} - -export class BlockView { - readonly element: HTMLDivElement - private boxes: { path: number[]; el: HTMLElement }[] = [] - private enabled = true - /** gerade offenes Wertfeld: solange wird nicht neu gezeichnet */ - private editing = false - /** Schachtelung der for-Schleifen beim Zeichnen (Zählvariable i, j, k …) */ - private forDepth = 0 - /** angelegte Variablen des Programms (orange Bausteine) */ - private vars: ReadonlySet = new Set() - private pending?: () => void - - constructor(private options: BlockViewOptions) { - this.element = document.createElement('div') - this.element.className = 'blocks-view' - this.element.hidden = true - this.element.addEventListener('pointerdown', (e) => { - if (!this.enabled) return - if ((e.target as Element).closest('.bk-input')) return - const field = (e.target as Element).closest('[data-value]') - if (field && !this.editing) { - // Wert anklicken: direkt im Block ändern, nicht ziehen - e.preventDefault() - e.stopPropagation() - this.editField(field) - return - } - const box = (e.target as Element).closest('[data-path]') - if (!box) return - this.options.press(pathOf(box)!, e) - }) - } - - /** Ablegestelle unter dem Zeiger (`target` = Element unter dem Zeiger, sonst `elementFromPoint`). */ - dropAt(clientX: number, clientY: number, query: BlockDropQuery, target?: Element | null): BlockDrop | undefined { - const hit = target ?? document.elementFromPoint(clientX, clientY) - if (!hit || !this.element.contains(hit)) return undefined - if (hit.closest('.bk-trash')) return query.moving ? { kind: 'trash' } : undefined - const drop = this.rawDrop(hit, clientY, query) - if (!drop || !query.moving || !('path' in drop)) return drop - // nicht in sich selbst ablegen - return startsWith(drop.path, query.moving) ? undefined : drop - } - - private rawDrop(hit: Element, clientY: number, query: BlockDropQuery): BlockDrop | undefined { - const box = hit.closest('[data-path]') - if (query.sensor) { - // genau auf ein weißes Feld oder einen Sensor: diesen ersetzen - const field = hit.closest('[data-value], [data-sensor]') - if (field) { - const slot = field.dataset.value ? 'value' : 'sensor' - const { path, index } = JSON.parse(field.dataset.value ?? field.dataset.sensor!) as { path: number[]; index: number } - return { kind: 'slot', path, slot, index } - } - const path = pathOf(box) - return path && !box!.classList.contains('bk-empty') && query.sensor(path) ? { kind: 'condition', path } : undefined - } - if (!box) { - if (hit.closest('.bk-hat')) return { kind: 'before', path: [0] } - return hit.closest('.bk-stack, .blocks-view') ? { kind: 'rootAppend' } : undefined - } - const path = pathOf(box)! - if (box.classList.contains('bk-empty')) return { kind: 'replace', path } - const part = hit.closest('.bk-head, .bk-foot, .bk-clause, .bk-body') - const own = part && part.closest('[data-path]') === box ? part : undefined - if (!box.classList.contains('bk-c') || !own) return { kind: upperHalf(box, clientY) ? 'before' : 'after', path } - if (own.classList.contains('bk-clause')) return this.firstInto(own.nextElementSibling) - if (own.classList.contains('bk-body')) { - // freie Fläche im Maul: hinter den letzten Block darin - const last = [...own.children].filter((c) => c instanceof HTMLElement && c.dataset.path).pop() - const lastPath = pathOf(last) - if (!lastPath) return undefined - return last!.classList.contains('bk-empty') ? { kind: 'replace', path: lastPath } : { kind: 'after', path: lastPath } - } - if (own.classList.contains('bk-foot')) return { kind: 'after', path } - // Kopf: obere Hälfte davor, untere Hälfte als ersten Block ins Maul - return upperHalf(own, clientY) ? { kind: 'before', path } : this.firstInto(own.parentElement?.querySelector(':scope > .bk-body')) - } - - private firstInto(body: Element | null | undefined): BlockDrop | undefined { - const first = body?.firstElementChild - const path = pathOf(first) - if (!path) return undefined - return first!.classList.contains('bk-empty') ? { kind: 'replace', path } : { kind: 'before', path } - } - - /** Wertfeld durch ein Eingabefeld ersetzen; Enter oder Verlassen übernimmt, Escape bricht ab. */ - private editField(field: HTMLElement) { - const { path, index } = JSON.parse(field.dataset.value!) as { path: number[]; index: number } - const kind = field.classList.contains('tk-str') ? 'str' : 'lit' - const shown = field.textContent ?? '' - const input = document.createElement('input') - input.className = `bk-input tk-${kind}` - input.value = kind === 'str' ? (JSON.parse(shown) as string) : shown - const fit = () => (input.style.width = `calc(${Math.max(2, input.value.length + 1)}ch + 18px)`) - fit() - input.setAttribute('aria-label', shown) - input.addEventListener('input', fit) - this.editing = true - let done = false - const finish = (save: boolean) => { - if (done) return - done = true - this.editing = false - const text = save ? valueText(kind, input.value) : undefined - if (text !== undefined && text !== shown) this.options.editValue(path, index, text) - else if (this.pending) this.pending() - else input.replaceWith(field) - } - input.addEventListener('keydown', (e) => { - e.stopPropagation() - if (e.key === 'Enter') finish(true) - else if (e.key === 'Escape') finish(false) - }) - input.addEventListener('blur', () => finish(true)) - field.replaceWith(input) - input.focus() - input.select() - } - - /** Ablegestelle zeigen (Linie bzw. hervorgehobener Block); `undefined` räumt auf. */ - showDrop(drop: BlockDrop | undefined) { - this.element.querySelectorAll('.bk-drop').forEach((e) => e.classList.remove('bk-drop')) - this.element.querySelector('.bk-drop-line')?.remove() - this.element.querySelector('.bk-trash')?.classList.toggle('bk-trash-hot', drop?.kind === 'trash') - if (!drop || drop.kind === 'trash') return - if (drop.kind === 'slot') { - const key = JSON.stringify({ path: drop.path, index: drop.index }) - const attr = drop.slot === 'value' ? 'data-value' : 'data-sensor' - for (const f of this.element.querySelectorAll(`[${attr}]`)) { - if (f.getAttribute(attr) === key) f.classList.add('bk-drop') - } - return - } - const stack = this.element.querySelector('.bk-stack') - if (!stack) return - let box: HTMLElement | undefined - let below = true - if (drop.kind === 'rootAppend') { - box = [...stack.children].filter((c): c is HTMLElement => c instanceof HTMLElement && !!c.dataset.path).pop() - } else { - box = this.boxes.find((b) => samePath(b.path, drop.path))?.el - if (box && (drop.kind === 'replace' || drop.kind === 'condition')) { - box.classList.add('bk-drop') - return - } - below = drop.kind === 'after' - } - if (!box) return - const s = stack.getBoundingClientRect() - const r = box.getBoundingClientRect() - const line = document.createElement('div') - line.className = 'bk-drop-line' - line.style.left = `${r.left - s.left}px` - line.style.top = `${(below ? r.bottom : r.top) - s.top - 3}px` - line.style.width = `${Math.max(r.width, 120)}px` - stack.append(line) - } - - /** Beim Verschieben eines Blocks: Papierkorb zeigen. */ - setMoving(on: boolean) { - this.element.classList.toggle('bk-moving', on) - } - - /** Neu zeichnen; `mark` ist die Auswahl bzw. in der Simulation der laufende Schritt. */ - render(doc: VSDocument, mark: number[] | undefined, simulating: boolean, zoom = 1) { - if (this.editing) { - this.pending = () => this.render(doc, mark, simulating, zoom) - return - } - this.pending = undefined - this.enabled = !simulating - this.boxes = [] - this.forDepth = 0 - this.vars = new Set(programVariables(doc)) - this.element.style.setProperty('--bk-zoom', String(zoom)) - this.element.classList.toggle('bk-simulating', simulating) - const hint = document.createElement('p') - hint.className = 'bk-hint' - hint.textContent = this.options.labels.hint - const hat = document.createElement('div') - hat.className = 'bk bk-hat' - const head = document.createElement('div') - head.className = 'bk-head' - head.append(this.word({ kind: 'kw', text: `🏁 ${this.options.labels.start}` })) - hat.append(head) - const stack = document.createElement('div') - stack.className = 'bk-stack' - stack.append(hat, ...this.list(doc.elements, [])) - const trash = document.createElement('div') - trash.className = 'bk-trash' - trash.textContent = `🗑️ ${this.options.labels.trash}` - this.element.replaceChildren(hint, stack, trash) - for (const { path, el } of this.boxes) { - if (mark && samePath(path, mark)) el.classList.add(simulating ? 'bk-exec' : 'bk-sel') - } - } - - /** Den markierten Block sichtbar machen (Simulation). */ - scrollTo(path: number[]) { - const box = this.boxes.find((b) => samePath(b.path, path)) - box?.el.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - } - - private list(elements: VSElement[], parent: number[]): HTMLElement[] { - return elements.map((e, i) => this.block(e, [...parent, i])) - } - - private block(e: VSElement, path: number[]): HTMLElement { - const box = document.createElement('div') - // Werte im Block zählen wie im gespeicherten Text (für das Ändern per Klick) - const v: ValueSlot = { path, n: 0, s: 0 } - box.dataset.path = JSON.stringify(path) - this.boxes.push({ path, el: box }) - if (isPlaceholderElement(e)) { - box.className = 'bk-empty' - box.textContent = this.options.labels.empty - return box - } - // Kopie: das Symbol der Gruppe gehört nur auf den Block, nie in den gespeicherten Befehl - const lines = [...canvasTextLines(e)] - switch (e.type) { - case ElementType.forSchleife: { - box.className = 'bk bk-c bk-loop' - const loop = countLoopOf(e, this.forDepth) - const repeat = loop && isRepeatLoop(loop) && !usesVariable(allLines(e.loopBody ?? []), loop.v) - const head = loop ? (repeat ? this.repeatHead(loop, v) : this.countHead(loop, v)) : this.head(lines, v) - this.forDepth++ - const body = this.body(e.loopBody ?? [], [...path, 0]) - this.forDepth-- - box.append(head, body, this.foot([], v)) - break - } - case ElementType.whileSchleife: - case ElementType.endlosschleife: { - box.className = 'bk bk-c bk-loop' - // Endlosschleife: Kopf nur das Schlüsselwort („wiederhole immer“) - const head = e.type === ElementType.endlosschleife ? this.keywordHead('endless') : this.head(lines, v) - box.append(head, this.body(e.loopBody ?? [], [...path, 0]), this.foot([], v)) - break - } - case ElementType.doUntilSchleife: - // Bedingung erst am Ende geprüft: oben „do“, unten „while …“ wie im Struktogramm - box.className = 'bk bk-c bk-loop' - box.append(this.head(['do'], v), this.body(e.loopBody ?? [], [...path, 0]), this.foot(lines, v)) - break - case ElementType.verzweigung: { - box.className = 'bk bk-c bk-if' - const cases = e.cases ?? [] - box.append(this.head(lines, v)) - cases.forEach((c, i) => { - if (i > 0) box.append(this.clause(i === 1 && cases.length === 2 ? this.options.labels.else : c.name)) - box.append(this.body(c.elements, [...path, i])) - }) - box.append(this.foot([], v)) - break - } - case ElementType.fallauswahl: - box.className = 'bk bk-c bk-if' - box.append(this.head(lines, v)) - ;(e.cases ?? []).forEach((c, i) => { - box.append(this.clause(c.name.toLowerCase() === 'default' ? 'default' : `case ${c.name}`), this.body(c.elements, [...path, i])) - }) - box.append(this.foot([], v)) - break - case ElementType.aussprung: - box.className = 'bk bk-cap' - box.append(this.head(lines, v)) - break - case ElementType.aufruf: - box.className = 'bk bk-simple bk-call' - box.append(this.head(lines, v)) - break - default: { - box.className = 'bk bk-simple bk-stmt' - const group = blockGroup(e) - if (group) { - box.dataset.botColor = visuBotGroupColor(group) - const icon = visuBotGroupIcon[group] - if (icon) lines[0] = `${icon} ${lines[0]}` - } - box.append(this.head(lines, v)) - } - } - return box - } - - private head(lines: string[], v?: ValueSlot): HTMLElement { - const head = document.createElement('div') - head.className = 'bk-head' - for (const line of lines) { - const row = document.createElement('span') - row.className = 'bk-line' - for (const token of blockTokens(line, this.vars)) { - if (token.kind === 'random') { - row.append(this.randomWord(token, v)) - continue - } - // Schlüsselwörter in der Sprache der Oberfläche (Holger 5.11.: für Jüngere „wenn“ statt „if“) - const word = this.word(this.translated(token)) - if (v && (token.kind === 'lit' || token.kind === 'str' || (token.kind === 'var' && !token.fixed))) { - word.dataset.value = JSON.stringify({ path: v.path, index: v.n++ }) - } - if (v && token.kind === 'sensor') word.dataset.sensor = JSON.stringify({ path: v.path, index: v.s++ }) - // Ja/Nein-Sensoren (isButtonA, isLineLeft …) sechseckig wie Bedingungen in Scratch, Messwerte rund - if (token.kind === 'sensor' && /^mbot\.is/.test(token.text)) word.classList.add('tk-bool') - row.append(word) - } - head.append(row) - } - return head - } - - /** Zufallszahl als runder Operator-Baustein: „Zufallszahl von [1] bis [10]“ mit zwei Feldern */ - private randomWord(token: BlockToken, v?: ValueSlot): HTMLElement { - const l = this.options.labels - const pill = document.createElement('span') - pill.className = 'tk tk-op' - const field = (text: string) => { - const w = this.word({ kind: 'lit', text }) - if (v) w.dataset.value = JSON.stringify({ path: v.path, index: v.n++ }) - return w - } - pill.append(`${l.randomFrom} `, field(token.from!), ` ${l.randomTo} `, field(token.to!)) - return pill - } - - /** Feld des Kopfs einer Zählschleife: Zahl, Sensor oder Variable */ - private loopField(text: string, index: number, v: ValueSlot): HTMLElement { - const sensor = /^mbot\./.test(text) - const w = this.word({ kind: sensor ? 'sensor' : /^[A-Za-z_]/.test(text) ? 'var' : 'lit', text }) - if (sensor) w.dataset.sensor = JSON.stringify({ path: v.path, index: 0 }) - else w.dataset.value = JSON.stringify({ path: v.path, index }) - return w - } - - /** „wiederhole [10] mal“: Zählschleife, deren Variable im Rumpf nicht vorkommt; Feld 1 = Ende */ - private repeatHead(c: CountLoop, v: ValueSlot): HTMLElement { - const l = this.options.labels - const head = document.createElement('div') - head.className = 'bk-head' - const row = document.createElement('span') - row.className = 'bk-line' - row.append(this.word({ kind: 'kw', text: l.repeat }), this.word({ kind: 'text', text: ' ' }), this.loopField(c.end, 1, v), this.word({ kind: 'text', text: ` ${l.repeatTimes}` })) - head.append(row) - return head - } - - /** Zählschleife: „zähle mit i von [0] bis unter [10] in Schritten von [1]“, Felder 0 Start, 1 Ende, 2 Schritt */ - private countHead(c: CountLoop, v: ValueSlot): HTMLElement { - const l = this.options.labels - const head = document.createElement('div') - head.className = 'bk-head' - const row = document.createElement('span') - row.className = 'bk-line' - const field = (text: string, index: number) => this.loopField(text, index, v) - const to = c.op === '<' ? l.countBelow : c.op === '>' ? l.countAbove : l.countTo - row.append( - this.word({ kind: 'kw', text: l.count }), - this.word({ kind: 'text', text: ' ' }), - this.word({ kind: 'var', text: c.v }), - this.word({ kind: 'text', text: ` ${l.countFrom} ` }), - field(c.start, 0), - this.word({ kind: 'text', text: ` ${to} ` }), - field(c.end, 1), - this.word({ kind: 'text', text: ` ${l.countStep} ` }), - field(c.step, 2), - ) - head.append(row) - return head - } - - private foot(lines: string[], v?: ValueSlot): HTMLElement { - const foot = this.head(lines, v) - foot.className = 'bk-foot' - return foot - } - - /** Schlüsselwörter und `!`, `&&`, `||` in der Sprache der Oberfläche („nicht“, „und“, „oder“), falls übersetzt. */ - private translated(token: BlockToken): BlockToken { - const words = this.options.labels.keywords - if (!words) return token - if (token.kind === 'kw') return { ...token, text: words[token.text] ?? token.text } - if (token.kind !== 'text') return token - // Aussprung: „break“ als ganzer Satz („verlasse die Schleife“) - if (token.text.trim() === 'break' && words.break) return { kind: 'kw', text: words.break } - const text = token.text - .replace(/&&/g, words['&&'] ? ` ${words['&&']} ` : '&&') - .replace(/\|\|/g, words['||'] ? ` ${words['||']} ` : '||') - .replace(/!(?!=)/g, words['!'] ? `${words['!']} ` : '!') - .replace(/ {2,}/g, ' ') - return { ...token, text } - } - - private keywordHead(keyword: string): HTMLElement { - const head = document.createElement('div') - head.className = 'bk-head' - head.append(this.word({ kind: 'kw', text: this.options.labels.keywords?.[keyword] ?? keyword })) - return head - } - - private clause(label: string): HTMLElement { - const c = document.createElement('div') - c.className = 'bk-head bk-clause' - c.append(this.word({ kind: 'kw', text: label })) - return c - } - - private body(elements: VSElement[], parent: number[]): HTMLElement { - const body = document.createElement('div') - body.className = 'bk-body' - body.append(...this.list(elements, parent)) - return body - } - - private word(token: BlockToken): HTMLElement { - const span = document.createElement('span') - span.className = `tk tk-${token.kind}` - span.textContent = token.text - return span - } -} diff --git a/web/src/ui/caesarDisc.ts b/web/src/ui/caesarDisc.ts deleted file mode 100644 index 66148825..00000000 --- a/web/src/ui/caesarDisc.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { t } from './i18n' - -/** Digitale Caesar-Scheibe im Lernbereich: innere Scheibe drehen, Text live ver- und entschlüsseln. */ - -const letters = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZ') -const step = 360 / letters.length -const svgNS = 'http://www.w3.org/2000/svg' - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function s(tag: string, attrs: Record = {}, text?: string): SVGElement { - const e = document.createElementNS(svgNS, tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, String(v)) - if (text !== undefined) e.textContent = text - return e -} - -/** Verschiebt Buchstaben A–Z (groß und klein) um `key` Stellen, alles andere bleibt. */ -export function caesar(text: string, key: number): string { - const k = ((key % 26) + 26) % 26 - return Array.from(text) - .map((c) => { - const code = c.charCodeAt(0) - if (code >= 65 && code <= 90) return String.fromCharCode(((code - 65 + k) % 26) + 65) - if (code >= 97 && code <= 122) return String.fromCharCode(((code - 97 + k) % 26) + 97) - return c - }) - .join('') -} - -/** Ein Ring mit 26 Buchstaben auf dem Radius `r`, Buchstabe 0 oben. */ -function ring(r: number, cls: string): { group: SVGElement; cells: SVGElement[] } { - const group = s('g', { class: cls }) - const cells = letters.map((letter, i) => { - const cell = s('g', { transform: `rotate(${i * step})` }) - cell.append(s('text', { x: 0, y: -r, 'text-anchor': 'middle', 'dominant-baseline': 'central' }, letter)) - group.append(cell) - return cell - }) - return { group, cells } -} - -export function renderCaesarDisc(startKey: number, startText: string): HTMLElement { - let key = startKey - let decrypt = false - let rotation = -key * step - - const box = h('section', { class: 'learn-game learn-caesar' }) - box.append(h('div', { class: 'learn-game-head' }, h('strong', {}, t('web_learn_caesar_title')))) - box.append(h('p', { class: 'learn-game-status' }, t('web_learn_caesar_hint'))) - - const svg = s('svg', { viewBox: '-200 -200 400 400', class: 'learn-caesar-disc', role: 'img' }) as SVGSVGElement - svg.append(s('circle', { r: 196, class: 'outer-disc' })) - // Sichtfenster oben: Dieses Buchstabenpaar gehört zusammen - svg.append(s('path', { d: arcWedge(196, 92, step / 2), class: 'window' })) - const outer = ring(168, 'outer-letters') - svg.append(outer.group) - for (let i = 0; i < letters.length; i++) { - svg.append(s('line', { x1: 0, y1: -144, x2: 0, y2: -196, transform: `rotate(${(i + 0.5) * step})`, class: 'tick' })) - } - const inner = s('g', { class: 'inner' }) - inner.append(s('circle', { r: 142, class: 'inner-disc' })) - const innerRing = ring(118, 'inner-letters') - inner.append(innerRing.group) - for (let i = 0; i < letters.length; i++) { - inner.append(s('line', { x1: 0, y1: -94, x2: 0, y2: -142, transform: `rotate(${(i + 0.5) * step})`, class: 'tick' })) - } - inner.append(s('circle', { r: 94, class: 'hub' })) - svg.append(inner) - const keyText = s('text', { x: 0, y: 6, 'text-anchor': 'middle', 'dominant-baseline': 'central', class: 'key' }) - svg.append(keyText) - svg.append(s('text', { x: 0, y: -30, 'text-anchor': 'middle', class: 'key-label' }, 'k')) - - const minus = h('button', { type: 'button', 'aria-label': t('web_learn_caesar_back') }, '−1') - const plus = h('button', { type: 'button', 'aria-label': t('web_learn_caesar_forward') }, '+1') - const controls = h('div', { class: 'learn-caesar-controls' }, minus, plus) - - const mode = h('div', { class: 'learn-caesar-mode', role: 'group' }) - const encButton = h('button', { type: 'button' }, t('web_learn_caesar_encrypt')) - const decButton = h('button', { type: 'button' }, t('web_learn_caesar_decrypt')) - mode.append(encButton, decButton) - - const inputLabel = h('span') - const input = h('input', { type: 'text', autocomplete: 'off', autocapitalize: 'characters', spellcheck: 'false' }) as HTMLInputElement - input.value = startText || 'LUDWIG' - const outputLabel = h('span') - const output = h('output', { class: 'learn-caesar-output' }) - const fields = h('div', { class: 'learn-caesar-fields' }, h('label', {}, inputLabel, input), h('div', {}, outputLabel, output)) - - box.append(h('div', { class: 'learn-caesar-stage' }, svg, controls), mode, fields) - - const mark = (index?: number) => { - outer.cells.forEach((c, i) => c.classList.toggle('marked', i === index)) - innerRing.cells.forEach((c, i) => c.classList.toggle('marked', index !== undefined && i === (index + key) % 26)) - } - - const update = () => { - keyText.textContent = String(key) - inner.setAttribute('transform', `rotate(${rotation})`) - svg.setAttribute('aria-label', t('web_learn_caesar_key_fmt', key)) - inputLabel.textContent = t(decrypt ? 'web_learn_caesar_secret' : 'web_learn_caesar_plain') - outputLabel.textContent = t(decrypt ? 'web_learn_caesar_plain' : 'web_learn_caesar_secret') - encButton.classList.toggle('active', !decrypt) - decButton.classList.toggle('active', decrypt) - output.textContent = caesar(input.value, decrypt ? -key : key) || ' ' - // Das zuletzt getippte Zeichen auf der Scheibe zeigen: außen Klartext, innen Geheimtext - const last = Array.from(input.value.toUpperCase()).reverse().find((c) => letters.includes(c)) - if (last === undefined) return mark() - const index = letters.indexOf(last) - mark(decrypt ? (index - key + 26) % 26 : index) - } - - const setKey = (k: number) => { - key = ((k % 26) + 26) % 26 - rotation = -key * step - update() - } - - minus.addEventListener('click', () => setKey(key - 1)) - plus.addEventListener('click', () => setKey(key + 1)) - encButton.addEventListener('click', () => { - if (decrypt) input.value = output.textContent?.trim() ?? '' - decrypt = false - update() - }) - decButton.addEventListener('click', () => { - if (!decrypt) input.value = output.textContent?.trim() ?? '' - decrypt = true - update() - }) - input.addEventListener('input', update) - outer.cells.forEach((cell, i) => cell.addEventListener('click', () => mark(i))) - - // Innere Scheibe mit Maus oder Finger drehen, beim Loslassen rastet sie auf einem Buchstaben ein - let dragFrom: number | undefined - const angleAt = (e: PointerEvent) => { - const r = svg.getBoundingClientRect() - return (Math.atan2(e.clientY - (r.top + r.height / 2), e.clientX - (r.left + r.width / 2)) * 180) / Math.PI - } - inner.addEventListener('pointerdown', (e) => { - const pe = e as PointerEvent - dragFrom = angleAt(pe) - rotation - inner.classList.add('dragging') - svg.setPointerCapture(pe.pointerId) - pe.preventDefault() - }) - svg.addEventListener('pointermove', (e) => { - if (dragFrom === undefined) return - rotation = angleAt(e) - dragFrom - inner.setAttribute('transform', `rotate(${rotation})`) - const k = Math.round(-rotation / step) - if (((k % 26) + 26) % 26 !== key) { - key = ((k % 26) + 26) % 26 - const keep = rotation - update() - rotation = keep - inner.setAttribute('transform', `rotate(${rotation})`) - } - }) - const release = () => { - if (dragFrom === undefined) return - dragFrom = undefined - inner.classList.remove('dragging') - setKey(key) - } - svg.addEventListener('pointerup', release) - svg.addEventListener('pointercancel', release) - - update() - return box -} - -/** Keil um die obere Mitte, von Radius `r1` bis `r2`, halbe Breite `half` Grad. */ -function arcWedge(r1: number, r2: number, half: number): string { - const p = (r: number, a: number) => { - const rad = ((a - 90) * Math.PI) / 180 - return `${(r * Math.cos(rad)).toFixed(2)} ${(r * Math.sin(rad)).toFixed(2)}` - } - return `M ${p(r1, -half)} A ${r1} ${r1} 0 0 1 ${p(r1, half)} L ${p(r2, half)} A ${r2} ${r2} 0 0 0 ${p(r2, -half)} Z` -} diff --git a/web/src/ui/clozeView.ts b/web/src/ui/clozeView.ts deleted file mode 100644 index 683fb2d7..00000000 --- a/web/src/ui/clozeView.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { clozeAnswerRight, type Cloze } from '../learn/cloze' -import { inline } from '../learn/markdown' -import { t } from './i18n' - -/** Lückentext im Lernbereich: fertiger Code, die fehlenden Wörter tippt man direkt in die Lücken. */ - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function rich(tag: string, attrs: Record, markdown: string): HTMLElement { - const e = h(tag, attrs) - e.innerHTML = inline(markdown) - return e -} - -export function renderCloze(cloze: Cloze): HTMLElement { - const box = h('section', { class: 'learn-cloze' }) - box.append(h('strong', { class: 'learn-cloze-title' }, cloze.title)) - if (cloze.task) box.append(rich('p', {}, cloze.task)) - box.append(h('p', { class: 'learn-cloze-hint' }, t('web_learn_cloze_hint'))) - - const gaps: { input: HTMLInputElement; answers: string[] }[] = [] - for (const lines of cloze.blocks) { - const code = h('pre', { class: 'learn-cloze-code mono', dir: 'ltr' }) - for (const line of lines) { - const row = h('div', { class: 'ln' }) - for (const part of line) { - if (typeof part === 'string') { - row.append(part) - continue - } - const input = h('input', { - type: 'text', - class: 'learn-cloze-gap mono', - autocomplete: 'off', - autocapitalize: 'off', - autocorrect: 'off', - spellcheck: 'false', - enterkeyhint: 'done', - 'aria-label': `${gaps.length + 1}`, - }) as HTMLInputElement - input.style.width = `${Math.max(3, ...part.answers.map((a) => a.length)) + 1}ch` - gaps.push({ input, answers: part.answers }) - row.append(input) - } - // Leere Zeilen sollen ihre Höhe behalten. - if (!line.length) row.append('\n') - code.append(row) - } - box.append(code) - } - - const status = h('p', { class: 'learn-cloze-status', role: 'status' }) - const explanation = cloze.explanation ? rich('p', { class: 'learn-explanation' }, cloze.explanation) : undefined - if (explanation) explanation.hidden = true - const check = h('button', { class: 'learn-cloze-check' }, t('web_learn_check')) - const solution = h('button', {}, t('web_learn_cloze_solution')) - const again = h('button', {}, t('web_learn_cloze_again')) - solution.hidden = true - again.hidden = true - const actions = h('div', { class: 'learn-cloze-actions' }, check, solution, again) - box.append(actions, status) - if (explanation) box.append(explanation) - - const runCheck = () => { - let right = 0 - for (const gap of gaps) { - const ok = clozeAnswerRight(gap.answers, gap.input.value) - gap.input.classList.toggle('right', ok) - gap.input.classList.toggle('wrong', !ok) - if (ok) right++ - } - const all = right === gaps.length - status.textContent = all ? t('web_learn_cloze_all_right') : t('web_learn_cloze_score_fmt', right, gaps.length) - status.className = `learn-cloze-status ${all ? 'right' : 'wrong'}` - if (explanation) explanation.hidden = !all - if (all) { - gaps.forEach((g) => (g.input.disabled = true)) - check.hidden = true - again.hidden = false - } else { - // Nach einem Fehlversuch darf man sich die Lösung zeigen lassen. - solution.hidden = false - gaps.find((g) => g.input.classList.contains('wrong'))?.input.focus() - } - } - check.addEventListener('click', runCheck) - solution.addEventListener('click', () => { - for (const gap of gaps) { - gap.input.value = gap.answers[0] - gap.input.classList.remove('right', 'wrong') - gap.input.classList.add('shown') - gap.input.disabled = true - } - status.textContent = '' - status.className = 'learn-cloze-status' - if (explanation) explanation.hidden = false - check.hidden = true - solution.hidden = true - again.hidden = false - }) - again.addEventListener('click', () => { - for (const gap of gaps) { - gap.input.value = '' - gap.input.classList.remove('right', 'wrong', 'shown') - gap.input.disabled = false - } - status.textContent = '' - status.className = 'learn-cloze-status' - if (explanation) explanation.hidden = true - check.hidden = false - solution.hidden = true - again.hidden = true - gaps[0]?.input.focus() - }) - gaps.forEach((gap, i) => { - gap.input.addEventListener('input', () => gap.input.classList.remove('right', 'wrong')) - gap.input.addEventListener('keydown', (e) => { - if (e.key !== 'Enter') return - e.preventDefault() - // Enter springt zur nächsten Lücke, in der letzten wird geprüft. - if (i < gaps.length - 1) gaps[i + 1].input.focus() - else runCheck() - }) - }) - return box -} diff --git a/web/src/ui/codePanel.ts b/web/src/ui/codePanel.ts deleted file mode 100644 index 3a9a6d16..00000000 --- a/web/src/ui/codePanel.ts +++ /dev/null @@ -1,398 +0,0 @@ -import { t } from './i18n' -import { generateCode, generateJavaClassFile, sanitizedJavaClassName, type CodeTarget } from '../core/codeGenerator' -import { subprogramName } from '../core/simulation' -import type { VSDocument } from '../core/model' - -/** Port von `CodeGeneratorPanels.swift` und `Runner/JavaScriptRunner.swift`: Code ansehen, kopieren, speichern, JavaScript ausführen. */ - -const keys = { - target: 'visustruct.codegen.target', - javaMode: 'visustruct.codegen.javaOutputMode', - comments: 'visustruct.codegen.includeDiagramComments', - emptyElse: 'visustruct.codegen.includeEmptyElse', -} - -function stored(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function store(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } -} - -const stopMessage = () => t('web_run_stopped_loop') -const cancelMessage = () => t('web_run_cancelled') -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -/** Wie `javaScriptWithEndlessLoopGuard` in Swift: `while (true)` bricht nach 100 000 Durchläufen ab. */ -export function javaScriptWithEndlessLoopGuard(js: string): string { - let index = 0 - return js.replace(/^(\s*)while\s*\(\s*true\s*\)(?:\s*\/\*.*?\*\/)?\s*\{/gm, (_m, indent: string) => { - const g = `__visuStructLoopGuard${index++}` - return `${indent}for (let ${g} = 0; ${g} < 100000 || (() => { throw new Error(${JSON.stringify(stopMessage())}); })(); ${g}++) {` - }) -} - -/** `prompt(…)` wird zu einer Eingabe im Fenster; dafür läuft der Code als `async`-Funktion. */ -export function javaScriptRunnerCode(js: string): string { - return javaScriptWithEndlessLoopGuard(js).replace(/\bprompt\s*\(/g, 'await __visuStructPrompt(') -} - -/** Läuft im Worker: `console.log` und `prompt` gehen per Nachricht an die Seite. */ -const workerSource = ` -let answer -let lines = [] -// Text von \`process.stdout.write\` ohne neue Zeile (wie \`System.out.print\`). -let partial = '' -const flush = (all) => { - if (all && partial) { - lines.push(partial) - partial = '' - } - if (lines.length) postMessage({ type: 'log', lines }) - lines = [] -} -const send = (type, text) => { - flush(true) - postMessage({ type, text }) -} -const fmt = (a) => (typeof a === 'string' ? a : JSON.stringify(a)) -// Ausgaben gesammelt senden, sonst bremsen viele kleine Nachrichten (z. B. in Endlosschleifen) die Seite aus. -console.log = (...args) => { - lines.push(partial + args.map(fmt).join(' ')) - partial = '' - if (lines.length >= 500) flush() -} -const process = { stdout: { write: (text) => { - const parts = (partial + String(text)).split('\\n') - partial = parts.pop() - lines.push(...parts) - if (lines.length >= 500) flush() -} } } -setInterval(flush, 50) -const __visuStructPrompt = (label) => new Promise((resolve, reject) => { - answer = (value) => (value === null ? reject(new Error(${JSON.stringify(cancelMessage())})) : resolve(value)) - send('prompt', String(label ?? '')) -}) -onmessage = async (e) => { - if (e.data.type === 'answer') return answer && answer(e.data.value) - try { - const AsyncFunction = (async () => {}).constructor - await new AsyncFunction('__visuStructPrompt', e.data.code)(__visuStructPrompt) - send('done') - } catch (err) { - send('error', String(err)) - } -} -` - -type RunnerMessage = { type: 'log' | 'prompt' | 'error' | 'done'; text?: string; lines?: string[] } - -/** Höchstens so viele Zeilen anzeigen (Endlosschleifen erzeugen sonst riesige Ausgaben). */ -const maxOutputLines = 2000 - -export class CodePanel { - readonly element: HTMLElement - private target: CodeTarget - private javaMode: 'snippet' | 'class' - private comments: boolean - private emptyElse: boolean - private code = '' - - private codeView!: HTMLElement - private javaModeRow!: HTMLElement - private runButton!: HTMLButtonElement - private saveButton!: HTMLButtonElement - private copyButton!: HTMLButtonElement - private runner!: HTMLElement - private runOutput!: HTMLElement - private runInput!: HTMLFormElement - private pseudocodeBox!: HTMLInputElement - private pseudocodeHint!: HTMLElement - private worker?: Worker - private outputLines: string[] = [] - private droppedLines = 0 - private outputFrame?: number - - constructor( - private currentDocument: () => VSDocument, - private saveFile: (filename: string, text: string) => void, - private onClose: () => void, - private setPseudocode: (on: boolean) => void, - /** Unterprogramme aus den anderen Reitern, die in den Code gehören. */ - private subprograms: () => VSDocument[] = () => [], - ) { - const t = stored(keys.target) - this.target = t === 'python' || t === 'javascript' ? t : 'java' - this.javaMode = stored(keys.javaMode) === 'class' ? 'class' : 'snippet' - this.comments = stored(keys.comments) === 'true' - this.emptyElse = stored(keys.emptyElse) !== 'false' - this.element = document.createElement('aside') - this.element.className = 'codepanel' - this.build() - } - - /** Neu erzeugen, z. B. nach jeder Änderung am Diagramm. */ - refresh() { - const doc = this.currentDocument() - const options = this.options() - this.code = - this.target === 'java' && this.javaMode === 'class' - ? generateJavaClassFile(doc, this.classStem(), options, this.subprograms()) - : generateCode(doc, this.target, options, this.subprograms()) - this.codeView.textContent = this.code - this.javaModeRow.hidden = this.target !== 'java' - this.saveButton.hidden = this.target !== 'java' - // Pseudocode ist kein Programm: nicht ausführen. - this.runButton.hidden = this.target !== 'javascript' || !!doc.pseudocode - if (this.runButton.hidden) this.stopRun(true) - this.pseudocodeBox.checked = !!doc.pseudocode - this.pseudocodeHint.hidden = !doc.pseudocode - for (const b of this.element.querySelectorAll('[data-target]')) { - b.setAttribute('aria-pressed', String(b.dataset.target === this.target)) - } - for (const b of this.element.querySelectorAll('[data-java-mode]')) { - b.setAttribute('aria-pressed', String(b.dataset.javaMode === this.javaMode)) - } - } - - close() { - this.stopRun(true) - } - - private options() { - return { - includeDiagramTextAsComments: this.comments, - includeEmptyElseBranch: this.emptyElse, - pseudocodeNote: t('codegen_pseudocode_note'), - } - } - - private classStem(): string { - return subprogramName(this.currentDocument().caption) || 'Main' - } - - private build() { - this.element.innerHTML = ` -
    -

    ${esc(t('codegen_placeholder_title'))}

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

    ${esc(t('codegen_generated_hint'))}

    - ` - const q = (s: string) => this.element.querySelector(s) as T - this.codeView = q('.code-view') - this.javaModeRow = q('.java-mode') - this.runButton = q('[data-act=run]') - this.saveButton = q('[data-act=save]') - this.copyButton = q('[data-act=copy]') - this.runner = q('.runner') - this.runOutput = q('.runner-out') - this.runInput = q('.runner-input') - this.pseudocodeBox = q('[data-opt=pseudocode]') - this.pseudocodeHint = q('.pseudocode-hint') - this.pseudocodeBox.addEventListener('change', () => this.setPseudocode(this.pseudocodeBox.checked)) - - q('.code-close').addEventListener('click', () => this.onClose()) - for (const b of this.element.querySelectorAll('[data-target]')) { - b.addEventListener('click', () => { - this.target = b.dataset.target as CodeTarget - store(keys.target, this.target) - this.refresh() - }) - } - for (const b of this.element.querySelectorAll('[data-java-mode]')) { - b.addEventListener('click', () => { - this.javaMode = b.dataset.javaMode as 'snippet' | 'class' - store(keys.javaMode, this.javaMode) - this.refresh() - }) - } - const comments = q('[data-opt=comments]') - comments.checked = this.comments - comments.addEventListener('change', () => { - this.comments = comments.checked - store(keys.comments, String(this.comments)) - this.refresh() - }) - const emptyElse = q('[data-opt=emptyElse]') - emptyElse.checked = this.emptyElse - emptyElse.addEventListener('change', () => { - this.emptyElse = emptyElse.checked - store(keys.emptyElse, String(this.emptyElse)) - this.refresh() - }) - - this.copyButton.addEventListener('click', () => this.copy()) - this.saveButton.addEventListener('click', () => { - // Die Klasse muss so heißen wie die Datei; deshalb immer die vollständige Klasse speichern. - const className = sanitizedJavaClassName(this.classStem()) - const source = generateJavaClassFile(this.currentDocument(), this.classStem(), this.options()) - this.saveFile(`${className}.java`, source) - }) - this.runButton.addEventListener('click', () => this.run()) - q('[data-act=stop]').addEventListener('click', () => this.stopRun(false)) - q('[data-act=cancel]').addEventListener('click', () => this.answer(null)) - this.runInput.addEventListener('submit', (e) => { - e.preventDefault() - this.answer(this.runInput.querySelector('input')!.value) - }) - } - - private async copy() { - let ok = false - try { - await navigator.clipboard.writeText(this.code) - ok = true - } catch { - // Ohne Zwischenablage-Recht: Code markieren, damit Strg+C reicht. - const range = document.createRange() - range.selectNodeContents(this.codeView) - const sel = getSelection() - sel?.removeAllRanges() - sel?.addRange(range) - ok = document.execCommand?.('copy') ?? false - } - this.copyButton.textContent = t(ok ? 'web_copied_check' : 'web_copy_manual') - setTimeout(() => (this.copyButton.textContent = t('codegen_copy')), 2000) - } - - // MARK: - JavaScript ausführen - - private run() { - this.stopRun(true) - this.runner.hidden = false - this.runOutput.textContent = '' - this.outputLines = [] - this.droppedLines = 0 - this.runOutput.classList.remove('error') - const code = javaScriptRunnerCode(this.code) - const onMessage = (m: RunnerMessage) => this.onRunnerMessage(m) - try { - const url = URL.createObjectURL(new Blob([workerSource], { type: 'text/javascript' })) - const worker = new Worker(url) - URL.revokeObjectURL(url) - worker.onmessage = (e) => onMessage(e.data as RunnerMessage) - worker.onerror = (e) => { - e.preventDefault() - onMessage({ type: 'error', text: e.message || t('web_run_error') }) - } - worker.postMessage({ type: 'run', code }) - this.worker = worker - } catch { - this.runInPage(code, onMessage) - } - this.setRunning(true) - } - - /** Falls Worker gesperrt sind: im Fenster selbst ausführen (Endlosschleifen-Schutz wie in der App). */ - private runInPage(code: string, onMessage: (m: RunnerMessage) => void) { - const fakeConsole = { - log: (...args: unknown[]) => - onMessage({ type: 'log', lines: [args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ')] }), - } - const prompt = (label: string) => - new Promise((resolve, reject) => { - this.pendingAnswer = (v) => (v === null ? reject(new Error(cancelMessage())) : resolve(v)) - onMessage({ type: 'prompt', text: label }) - }) - const AsyncFunction = (async () => {}).constructor as new (...args: string[]) => (...a: unknown[]) => Promise - new AsyncFunction('__visuStructPrompt', 'console', code)(prompt, fakeConsole) - .then(() => onMessage({ type: 'done' })) - .catch((err: unknown) => onMessage({ type: 'error', text: String(err) })) - } - - private pendingAnswer?: (value: string | null) => void - - private onRunnerMessage(m: RunnerMessage) { - switch (m.type) { - case 'log': - this.appendOutput(m.lines ?? []) - break - case 'prompt': { - this.runInput.hidden = false - this.runInput.querySelector('label')!.textContent = m.text ?? '' - const field = this.runInput.querySelector('input')! - field.value = '' - field.focus() - break - } - case 'error': - this.appendOutput([m.text ?? '']) - this.runOutput.classList.add('error') - this.stopRun(false) - break - case 'done': - this.stopRun(false) - break - } - } - - private appendOutput(lines: string[]) { - this.outputLines.push(...lines) - if (this.outputLines.length > maxOutputLines) { - this.droppedLines += this.outputLines.length - maxOutputLines - this.outputLines.splice(0, this.outputLines.length - maxOutputLines) - } - if (this.outputFrame !== undefined) return - this.outputFrame = requestAnimationFrame(() => { - this.outputFrame = undefined - const head = this.droppedLines > 0 ? t('web_run_dropped_fmt', this.droppedLines) + '\n' : '' - this.runOutput.textContent = head + this.outputLines.join('\n') + (this.outputLines.length ? '\n' : '') - this.runOutput.scrollTop = this.runOutput.scrollHeight - }) - } - - private answer(value: string | null) { - this.runInput.hidden = true - if (this.worker) this.worker.postMessage({ type: 'answer', value }) - else this.pendingAnswer?.(value) - this.pendingAnswer = undefined - } - - private stopRun(hide: boolean) { - this.worker?.terminate() - this.worker = undefined - this.pendingAnswer = undefined - if (this.runInput) this.runInput.hidden = true - if (hide && this.runner) this.runner.hidden = true - this.setRunning(false) - } - - private setRunning(running: boolean) { - const stop = this.element.querySelector('[data-act=stop]') - if (stop) stop.disabled = !running - } -} diff --git a/web/src/ui/driveGameView.ts b/web/src/ui/driveGameView.ts deleted file mode 100644 index 51a62dc8..00000000 --- a/web/src/ui/driveGameView.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { blockPicture } from './blockPicture' -import { inline } from '../learn/markdown' -import { driveRound, driveWorld, type DriveGame } from '../learn/driveGame' -import type { Pose } from '../core/robotWorld' -import { t } from './i18n' - -/** Spiel „Wo landet der mBot2?“: Code lesen, Zielfeld antippen, dann fährt der mBot2 die Strecke auf der Karte vor. */ - -const SVG = 'http://www.w3.org/2000/svg' - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function s(tag: string, attrs: Record = {}): SVGElement { - const e = document.createElementNS(SVG, tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, String(v)) - return e -} - -function rich(tag: string, attrs: Record, markdown: string): HTMLElement { - const e = h(tag, attrs) - e.innerHTML = inline(markdown) - return e -} - -const FIELD_FILL: Record = { '#': '#6b7280', '=': '#111827', r: '#ef4444', g: '#22c55e', b: '#3b82f6', y: '#facc15' } -/** Millisekunden je Bild der Fahrt. */ -const frameMs = 450 - -/** `asBlocks`: Code der Runde als Blöcke zeigen (Block-Lektionen für Jüngere), sonst als Java. */ -export function renderDriveGame(game: DriveGame, ludwigURL: string, asBlocks = false): HTMLElement { - const box = h('section', { class: 'learn-game learn-round-game learn-drive-game' }) - const head = h('div', { class: 'learn-game-head' }) - head.append(h('img', { src: ludwigURL, alt: '', width: '40', height: '40' }), h('strong', {}, game.title)) - const status = h('p', { class: 'learn-game-status' }) - const stage = h('div', { class: 'learn-game-stage' }) - box.append(head, status, stage) - const total = game.rounds.length - const F = game.field - let index = 0 - let score = 0 - let timer = 0 - const showStatus = () => { - status.textContent = `${t('web_game_round_fmt', index + 1, total)} · ${t('web_game_score_fmt', score)}` - } - const next = () => { - const b = h('button', { class: 'primary' }, index + 1 < total ? t('web_game_next') : t('web_game_finish')) - b.addEventListener('click', () => { - index++ - if (index < total) showRound() - else showEnd() - }) - return b - } - - const showRound = () => { - window.clearInterval(timer) - showStatus() - const round = game.rounds[index] - const cols = round.map[0].length - const rows = round.map.length - const width = cols * F - const depth = rows * F - // Weltkoordinaten (Mitte 0,0, y nach hinten) → SVG (oben links 0,0, y nach unten) - const sx = (x: number) => x + width / 2 - const sy = (y: number) => depth / 2 - y - const world = driveWorld(round, F) - const result = driveRound(round, F) - const svg = s('svg', { viewBox: `-2 -2 ${width + 4} ${depth + 4}`, class: 'learn-drive-map', role: 'group', 'aria-label': round.question }) - const cells: SVGElement[][] = [] - round.map.forEach((line, r) => { - cells.push([]) - Array.from(line).forEach((ch, c) => { - const cell = s('rect', { x: c * F, y: r * F, width: F, height: F, class: 'cell', fill: FIELD_FILL[ch] ?? '#ffffff', tabindex: 0, role: 'button', 'aria-label': `${c + 1}, ${r + 1}` }) - const pick = () => choose(c, r) - cell.addEventListener('click', pick) - cell.addEventListener('keydown', (e) => { - if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') { - e.preventDefault() - pick() - } - }) - svg.append(cell) - cells[r].push(cell) - }) - }) - const trail = s('polyline', { class: 'trail', points: '', fill: 'none' }) - const robot = s('g', { class: 'robot' }) - const body = Math.min(F * 0.7, 20) - robot.append( - s('rect', { x: -body / 2, y: -body / 2, width: body, height: body, rx: body / 5, class: 'body' }), - s('path', { d: `M ${-body / 3} ${body / 6} L 0 ${-body / 2.4} L ${body / 3} ${body / 6} Z`, class: 'nose' }), - ) - // Kurs ohne Sprung von 359° auf 0°, damit die Drehung den kurzen Weg nimmt - let heading = world.start.heading - const place = (pose: Pose) => { - heading += ((((pose.heading - heading) % 360) + 540) % 360) - 180 - robot.style.transform = `translate(${sx(pose.x)}px, ${sy(pose.y)}px) rotate(${heading}deg)` - } - place(world.start) - svg.append(trail, robot) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const code = - (asBlocks && blockPicture(round.code)) || - h('pre', { class: 'learn-game-code mono', dir: 'ltr' }, ...round.code.split('\n').map((l) => h('div', { class: 'ln' }, l || ' '))) - let chosen = false - const choose = (c: number, r: number) => { - if (chosen) return - chosen = true - svg.classList.add('done') - const right = c === round.target.col && r === round.target.row - cells[r][c].classList.add(right ? 'right' : 'wrong') - if (right) score++ - showStatus() - // Jetzt fährt der mBot2 vor; danach leuchtet das richtige Feld. - const frames = result.run.frames - let f = 0 - const points: string[] = [`${sx(world.start.x)},${sy(world.start.y)}`] - const step = () => { - f++ - if (f >= frames.length) { - window.clearInterval(timer) - cells[round.target.row][round.target.col].classList.add('right') - const n = next() - feedback.className = `learn-game-feedback ${right ? 'right' : 'wrong'}` - feedback.replaceChildren(h('p', {}, right ? t('web_game_right') : t('web_game_wrong_short')), rich('div', { class: 'learn-game-explain' }, round.explanation), n) - n.focus({ preventScroll: true }) - return - } - const pose = frames[f].pose - place(pose) - points.push(`${sx(pose.x)},${sy(pose.y)}`) - trail.setAttribute('points', points.join(' ')) - } - timer = window.setInterval(() => { - if (!box.isConnected) return window.clearInterval(timer) - step() - }, frameMs) - } - stage.replaceChildren(code, rich('p', { class: 'learn-game-question' }, round.question), svg, feedback) - } - - const showEnd = () => { - window.clearInterval(timer) - status.textContent = '' - const again = h('button', { class: 'primary' }, t('web_game_again')) - again.addEventListener('click', () => { - index = score = 0 - showRound() - }) - stage.replaceChildren( - h('p', { class: 'learn-game-result' }, t('web_game_done_fmt', score, total)), - h('p', {}, t(score === total ? 'web_game_perfect' : score >= total * 0.7 ? 'web_game_good' : 'web_game_practice_short')), - again, - ) - } - const start = h('button', { class: 'primary' }, t('web_game_start')) - start.addEventListener('click', showRound) - stage.append(rich('p', {}, game.intro), start) - return box -} diff --git a/web/src/ui/exporter.ts b/web/src/ui/exporter.ts deleted file mode 100644 index 43f9f64b..00000000 --- a/web/src/ui/exporter.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { LayoutEngine, type Metrics } from '../core/layout' -import type { VSDocument } from '../core/model' -import type { MeasureText } from '../core/textMeasurement' -import { diagramFontFamily } from '../core/textMeasurement' -import { t as tr } from './i18n' -import { DiagramRenderer, displayElement, el } from './renderer' - -/** Port von `Export/DiagramSnapshotAndExport.swift` und `DiagramExporter.swift`: Bild, PDF und Druck. */ - -const exportInset = { left: 12, top: 10 } -const exportOuterMargin = 8 -const exportPixelCap = 8000 -const titleFontSize = 16 -const titlePadX = 12 -const background = '#fafafa' - -/** Wie `exportVisibleDiagramTitle`: leerer Titel → Platzhalter wie im Titelfeld. */ -export function exportVisibleDiagramTitle(doc: VSDocument): string { - const t = doc.caption.trim() - return t === '' ? tr('diagram_title_placeholder') : t -} - -/** Wie `sanitizedExportFilenameSlug` (Stil „Ohne Datum“). */ -export function exportFilenameSlug(raw: string): string { - let s = raw.trim().replace(/\.visustruct$/i, '') - if (s === '') return '' - s = s.replace(/\s/g, '-').replace(/[/:\\*?"<>|]/g, '-') - while (s.includes('--')) s = s.replace(/--/g, '-') - s = s.replace(/^-+|-+$/g, '') - if (s.length > 120) s = s.slice(0, 120).replace(/^-+|-+$/g, '') - return s -} - -export function exportFilenameBase(doc: VSDocument, tabTitle: string): string { - return exportFilenameSlug(doc.caption) || exportFilenameSlug(tabTitle) || 'VisuStruct' -} - -/** Titel auf höchstens zwei Zeilen umbrechen (`lineLimit(2)`). */ -function wrapTitle(title: string, width: number, measure: MeasureText): string[] { - const words = title.split(/\s+/) - const lines: string[] = [] - let line = '' - for (const w of words) { - const next = line ? `${line} ${w}` : w - if (line && measure(next, titleFontSize, 'bold') > width) { - lines.push(line) - line = w - } else { - line = next - } - } - if (line) lines.push(line) - if (lines.length > 2) { - let last = lines.slice(1).join(' ') - while (last.length > 1 && measure(last + '…', titleFontSize, 'bold') > width) last = last.slice(0, -1) - return [lines[0], last + '…'] - } - return lines -} - -export interface ExportImage { - svg: SVGSVGElement - width: number - height: number -} - -/** - * Diagramm mit sichtbarem Titel, ohne Auswahl (gleiche Grundlage für PNG, SVG, PDF und Druck). - * `minSize` wie in der App 320; die Vorschau im Lernbereich nimmt 0, damit kein Leerraum entsteht. - */ -export function renderExportSVG(doc: VSDocument, metrics: Metrics, measure: MeasureText, minSize = 320): ExportImage | undefined { - const displayDoc: VSDocument = { ...doc, elements: doc.elements.map(displayElement) } - const layout = new LayoutEngine(metrics, measure).layout(displayDoc, exportInset) - const w = Math.min(exportPixelCap, Math.max(minSize, layout.canvasSize.width)) - const h = Math.min(exportPixelCap, Math.max(minSize, layout.canvasSize.height)) - if (w <= 2 || h <= 2) return undefined - - const lines = wrapTitle(exportVisibleDiagramTitle(doc), w - 2 * titlePadX, measure) - const lineHeight = Math.ceil(titleFontSize * 1.2) - const titleH = Math.min(56, lines.length * lineHeight + 2) - const total = titleH + h - - const diagram = new DiagramRenderer(metrics, measure).render(layout, { width: w, height: h }, undefined, exportOuterMargin) - diagram.setAttribute('y', String(titleH)) - diagram.removeAttribute('class') - - const svg = el('svg', { - xmlns: 'http://www.w3.org/2000/svg', - width: w, - height: total, - viewBox: `0 0 ${w} ${total}`, - }) - svg.append(el('rect', { x: 0, y: 0, width: w, height: total, fill: background })) - const text = el('text', { - x: titlePadX, - y: 0, - 'font-family': diagramFontFamily, - 'font-size': titleFontSize, - 'font-weight': 600, - fill: 'black', - }) - lines.forEach((line, i) => { - const span = el('tspan', { x: titlePadX, y: i * lineHeight + titleFontSize }) - span.textContent = line - text.append(span) - }) - svg.append(text, diagram) - return { svg, width: w, height: total } -} - -export function svgMarkup(image: ExportImage): string { - return '\n' + new XMLSerializer().serializeToString(image.svg) -} - -/** Rastert das Export-SVG (Faktor wie `displayScale`, begrenzt auf 8000 Pixel pro Seite). */ -export async function rasterize(image: ExportImage, scale: number): Promise { - const s = Math.max(1, Math.min(scale, exportPixelCap / image.width, exportPixelCap / image.height)) - const url = URL.createObjectURL(new Blob([svgMarkup(image)], { type: 'image/svg+xml' })) - try { - const img = new Image() - img.src = url - await img.decode() - const canvas = document.createElement('canvas') - canvas.width = Math.round(image.width * s) - canvas.height = Math.round(image.height * s) - const ctx = canvas.getContext('2d')! - ctx.fillStyle = background - ctx.fillRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(img, 0, 0, canvas.width, canvas.height) - return canvas - } finally { - URL.revokeObjectURL(url) - } -} - -export function canvasToPNG(canvas: HTMLCanvasElement): Promise { - return new Promise((resolve, reject) => - canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('PNG konnte nicht erzeugt werden.'))), 'image/png'), - ) -} - -// MARK: - PDF (A4, eine Seite) - -export interface Rect { - x: number - y: number - width: number - height: number -} - -/** Wie `A4SinglePageLayout.pageAndImageDrawRect`: Hoch- oder Querformat, je nachdem, wo das Bild größer wird. */ -export function a4PageAndImageRect(imageWidth: number, imageHeight: number): { page: { width: number; height: number }; draw: Rect } { - const margin = 32 - const fudge = 0.98 - const iw = Math.max(1, imageWidth) - const ih = Math.max(1, imageHeight) - const fit = (page: { width: number; height: number }) => { - const cw = page.width - 2 * margin - const ch = page.height - 2 * margin - const s = Math.min(cw / iw, ch / ih) * fudge - return { s, cw, ch } - } - const portrait = { width: 595, height: 842 } - const landscape = { width: 842, height: 595 } - const p = fit(portrait) - const l = fit(landscape) - const [page, f] = l.s > p.s ? [landscape, l] : [portrait, p] - const sw = iw * f.s - const sh = ih * f.s - return { page, draw: { x: margin + (f.cw - sw) / 2, y: margin + (f.ch - sh) / 2, width: sw, height: sh } } -} - -async function deflate(data: Uint8Array): Promise { - const stream = new Blob([data as BlobPart]).stream().pipeThrough(new CompressionStream('deflate')) - return new Uint8Array(await new Response(stream).arrayBuffer()) -} - -/** PDF-Literal-String (UTF-16BE mit BOM, damit Umlaute im Titel stimmen). */ -function pdfTextString(s: string): string { - let hex = 'FEFF' - for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).padStart(4, '0').toUpperCase() - return `<${hex}>` -} - -/** - * Einseitiges PDF mit dem Diagramm als verlustfreiem Rasterbild (wie `writeTemporaryDiagramPDF`). - * `rgb` enthält 3 Byte pro Pixel, Zeile für Zeile von oben. - */ -export async function buildDiagramPDF(rgb: Uint8Array, pixelWidth: number, pixelHeight: number, imageSize: { width: number; height: number }, title: string): Promise { - const { page, draw } = a4PageAndImageRect(imageSize.width, imageSize.height) - const image = await deflate(rgb) - const fmt = (n: number) => (Math.round(n * 100) / 100).toString() - // PDF-Ursprung unten links. - const content = `q ${fmt(draw.width)} 0 0 ${fmt(draw.height)} ${fmt(draw.x)} ${fmt(page.height - draw.y - draw.height)} cm /Im0 Do Q` - const enc = new TextEncoder() - const objects: (string | Uint8Array)[][] = [ - ['<< /Type /Catalog /Pages 2 0 R >>'], - ['<< /Type /Pages /Kids [3 0 R] /Count 1 >>'], - [`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${page.width} ${page.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`], - [ - `<< /Type /XObject /Subtype /Image /Width ${pixelWidth} /Height ${pixelHeight} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${image.length} >>\nstream\n`, - image, - '\nendstream', - ], - [`<< /Length ${content.length} >>\nstream\n${content}\nendstream`], - [`<< /Creator ${pdfTextString('VisuStruct')} /Title ${pdfTextString(title)} >>`], - ] - const parts: Uint8Array[] = [] - let offset = 0 - const push = (p: string | Uint8Array) => { - const bytes = typeof p === 'string' ? enc.encode(p) : p - parts.push(bytes) - offset += bytes.length - } - push('%PDF-1.4\n%\xE2\xE3\xCF\xD3\n') - const offsets: number[] = [] - objects.forEach((obj, i) => { - offsets.push(offset) - push(`${i + 1} 0 obj\n`) - obj.forEach(push) - push('\nendobj\n') - }) - const xref = offset - push(`xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`) - for (const o of offsets) push(`${String(o).padStart(10, '0')} 00000 n \n`) - push(`trailer\n<< /Size ${objects.length + 1} /Root 1 0 R /Info ${objects.length} 0 R >>\nstartxref\n${xref}\n%%EOF\n`) - return new Blob(parts as BlobPart[], { type: 'application/pdf' }) -} - -export function canvasRGB(canvas: HTMLCanvasElement): Uint8Array { - const { data } = canvas.getContext('2d')!.getImageData(0, 0, canvas.width, canvas.height) - const rgb = new Uint8Array(canvas.width * canvas.height * 3) - for (let i = 0, j = 0; i < data.length; i += 4, j += 3) { - rgb[j] = data[i] - rgb[j + 1] = data[i + 1] - rgb[j + 2] = data[i + 2] - } - return rgb -} diff --git a/web/src/ui/filesPanel.ts b/web/src/ui/filesPanel.ts deleted file mode 100644 index b9aca548..00000000 --- a/web/src/ui/filesPanel.ts +++ /dev/null @@ -1,485 +0,0 @@ -import { progress } from '../learn/progress' -import { compareEntries, programBaseName, todayFolder, uniqueBaseName, validFolderName } from '../core/workspace' -import { t } from './i18n' -import { icons } from './icons' -import { sidebarIcon } from './learnPanel' -import { visucodeLinkHTML, worldBrandHTML, worldChooserHTML, type WorldChoice } from './visubotView' -import { hostWorld } from './site' -import { - browserWorkspace, - canPickFolder, - forgetFolder, - pickFolder, - reopenFolder, - storedFolder, - type Workspace, - type WsDir, -} from './workspaceStore' - -/** - * Spalte „Dateien“: ein Workspace als Baum. Oben die Klassen (z. B. 11FI1), darunter je Tag ein Ordner - * (beim Speichern automatisch angelegt), darin die Programme: Struktogramm (.visustruct) und Code (.java). - */ - -/** Wo ein Programm im Workspace liegt. */ -export interface WorkspaceFile { - dir: WsDir - /** Name ohne Endung; dazu gehören `.visustruct` und `.java`. */ - base: string - /** Für die Anzeige, z. B. `11FI1/2026-10-23/Rechner`. */ - path: string -} - -/** Lernstand im Workspace (ein Lernstand je Workspace). */ -export const progressFile = 'learnProgress.json' -/** Früherer Name der Lernstand-Datei (bis 0.3.31); wird übernommen und dann entfernt. */ -const legacyProgressFile = 'lernstand.json' - -export interface FilesHost { - open(xml: string, file: WorkspaceFile, java: string | undefined): void - hide(): void - message(text: string): void - /** Lernstand aus dem Workspace übernommen: Lernbereich neu zeichnen. */ - progressLoaded(): void - /** Start-Dialog: VisuStruct oder VisuBot gewählt. */ - chooseWorld(mode: WorldChoice): Promise -} - -const modeKey = 'visustruct.files.mode' -const expandedKey = 'visustruct.files.expanded' - -function storedList(key: string): string[] { - try { - const list: unknown = JSON.parse(stored(key) ?? '[]') - return Array.isArray(list) ? list.filter((x): x is string => typeof x === 'string') : [] - } catch { - return [] - } -} - -function stored(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function store(key: string, value: string | null) { - try { - if (value === null) localStorage.removeItem(key) - else localStorage.setItem(key, value) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } -} - -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -interface AskOptions { - title: string - hint?: string - /** Knöpfe, die ihren Text zurückgeben (z. B. vorhandene Klassen). */ - choices?: string[] - /** Eingabefeld mit diesem Platzhalter. */ - input?: string - ok?: string - danger?: boolean -} - -/** Rückfrage im Fenster selbst (`window.prompt`/`confirm` sind in eingebetteten Ansichten gesperrt). */ -function ask(o: AskOptions): Promise { - return new Promise((resolve) => { - const box = document.createElement('div') - box.className = 'confirm' - const choices = (o.choices ?? []).map((c) => ``).join('') - box.innerHTML = `` - const form = box.querySelector('form')! - const field = form.querySelector('input') - const done = (value: string | undefined) => { - box.remove() - resolve(value) - } - form.addEventListener('submit', (e) => { - e.preventDefault() - if (!field) return done('') - if (field.value.trim()) done(field.value) - else field.focus() - }) - box.addEventListener('click', (e) => { - const target = e.target as HTMLElement - const choice = target.closest('[data-choice]')?.dataset.choice - if (choice !== undefined) done(choice) - else if (target === box || target.closest('[data-cancel]')) done(undefined) - }) - box.addEventListener('keydown', (e) => e.key === 'Escape' && done(undefined)) - document.body.append(box) - ;(field ?? form.querySelector('[data-cancel]'))!.focus() - }) -} - -export class FilesPanel { - readonly element: HTMLElement - private body!: HTMLElement - private workspace?: Workspace - /** Gemerkter Ordner, für den der Browser erst wieder fragen muss. */ - private pending?: FileSystemDirectoryHandle - /** Aufgeklappte Ordner als Pfade, z. B. `2026-10-23`. */ - private expanded = new Set(storedList(expandedKey)) - private rendering = 0 - /** Workspace, mit dem der Lernstand gerade abgeglichen wird. */ - private progressWorkspace?: Workspace - /** Schon ein Workspace in dieser Sitzung: dann zählt beim Wechsel nur noch die Datei. */ - private hadWorkspace = false - private progressTimer?: number - - constructor(private host: FilesHost) { - this.element = document.createElement('aside') - this.element.className = 'files' - this.build() - progress.onChange(() => this.progressChanged()) - void this.restore() - } - - private rememberExpanded() { - store(expandedKey, JSON.stringify([...this.expanded])) - } - - get ready(): boolean { - return !!this.workspace - } - - /** Neu aufbauen, z. B. nach einem Sprachwechsel. */ - build() { - this.element.innerHTML = ` -
    -

    ${esc(t('web_files_title'))}

    - - - -
    -
    - ` - this.body = this.element.querySelector('.files-body')! - const on = (name: string, f: () => void) => this.element.querySelector(`[data-files=${name}]`)!.addEventListener('click', f) - on('hide', () => this.host.hide()) - on('new-folder', () => void this.newFolder()) - on('switch', () => void this.switchWorkspace()) - this.body.addEventListener('click', (e) => void this.onTreeClick(e)) - void this.render() - } - - // MARK: - Workspace wählen - - private async restore() { - if (stored(modeKey) === 'browser') { - this.workspace = browserWorkspace() - } else if (canPickFolder()) { - const folder = await storedFolder() - if (folder?.ready) this.workspace = await reopenFolder(folder.handle) - else this.pending = folder?.handle - } - await this.render() - if (!this.workspace) void this.startDialog() - } - - /** - * Beim Start ohne Workspace: fragen, wo Lernstand und Programme liegen. Der Browser merkt sich nur den Ordner, - * ohne Ordner ist der Lernstand nach dem Schließen weg. - */ - private async startDialog() { - const folderName = t('web_learn_start_folder') - const button = (start: string, label: string, primary = false, hint?: string) => - `${hint ? `

    ${esc(hint)}

    ` : ''}` - const options = canPickFolder() - ? [ - this.pending ? button('reconnect', `${icons.open} ${esc(t('web_learn_start_continue_fmt', this.pending.name))}`, true) : '', - button('pick', `${icons.open} ${esc(t('web_learn_start_open'))}`, !this.pending), - button('create', `${icons.newFolder} ${esc(t('web_learn_start_create_fmt', folderName))}`, false, t('web_learn_start_create_hint')), - ] - : [button('browser', esc(t('web_files_browser')), true, t('web_files_browser_hint'))] - const box = document.createElement('div') - box.className = 'confirm' - box.innerHTML = `` - const close = () => box.remove() - box.addEventListener('click', (e) => { - const world = (e.target as HTMLElement).closest('[data-world]')?.dataset.world as WorldChoice | undefined - if (world) { - void this.host.chooseWorld(world).then(() => (box.querySelector('.start-world')!.innerHTML = worldChooserHTML())) - return - } - const start = (e.target as HTMLElement).closest('[data-start]')?.dataset.start - if (!start) return - close() - if (start === 'reconnect') void this.reconnect() - else if (start === 'pick') void this.connectFolder() - else if (start === 'create') void this.connectFolder(folderName) - else if (start === 'browser') void this.useBrowser() - }) - box.addEventListener('keydown', (e) => e.key === 'Escape' && close()) - document.body.append(box) - box.querySelector('.files-start')?.focus() - } - - private async connectFolder(create?: string) { - try { - this.workspace = await pickFolder(create) - this.pending = undefined - store(modeKey, 'folder') - } catch { - /* abgebrochen */ - } - await this.render() - } - - private async reconnect() { - if (!this.pending) return - this.workspace = await reopenFolder(this.pending) - if (this.workspace) this.pending = undefined - await this.render() - } - - private async useBrowser() { - this.workspace = browserWorkspace() - store(modeKey, 'browser') - await this.render() - } - - /** Anderen Ordner wählen (bzw. am iPad: zurück zur Auswahl). */ - private async switchWorkspace() { - if (canPickFolder()) return this.connectFolder() - this.workspace = undefined - store(modeKey, null) - await forgetFolder() - await this.render() - } - - // MARK: - Lernstand - - /** - * Neuer Workspace: der Lernstand kommt allein aus `learnProgress.json` (oder der alten `lernstand.json`). - * Nur beim ersten Workspace der Sitzung bleibt dazu, was schon vorher gelernt wurde; danach wird die Datei geschrieben. - */ - private async syncProgress(ws: Workspace | undefined) { - this.progressWorkspace = ws - if (!ws) return - const first = !this.hadWorkspace - this.hadWorkspace = true - try { - const name = (await ws.root.has(progressFile)) ? progressFile : (await ws.root.has(legacyProgressFile)) ? legacyProgressFile : undefined - if (!name || !progress.loadFile(await ws.root.read(name), first)) { - if (!first) progress.clear() - } - this.host.progressLoaded() - await this.writeProgress(ws) - if (await ws.root.has(legacyProgressFile)) { - await ws.root.remove(legacyProgressFile) - await this.render() - } - } catch { - /* Ordner nicht lesbar: Lernstand nur bis zum Neuladen */ - } - } - - private async writeProgress(ws: Workspace) { - if (ws !== this.progressWorkspace) return - try { - const fresh = !(await ws.root.has(progressFile)) - await ws.root.write(progressFile, progress.toFile()) - if (fresh) await this.render() - } catch { - /* z. B. Zugriff nach dem Neuladen noch nicht erlaubt */ - } - } - - /** Änderungen im Lernbereich gesammelt (nach einer Sekunde Ruhe) in die Datei schreiben. */ - private progressChanged() { - const ws = this.progressWorkspace - if (!ws) return - window.clearTimeout(this.progressTimer) - this.progressTimer = window.setTimeout(() => void this.writeProgress(ws), 1000) - } - - // MARK: - Baum - - async render() { - const ticket = ++this.rendering - const ws = this.workspace - if (ws !== this.progressWorkspace) void this.syncProgress(ws) - this.element.querySelector('[data-files=new-folder]')!.hidden = !ws - this.element.querySelector('[data-files=switch]')!.hidden = !ws - if (!ws) { - this.body.innerHTML = this.startHTML() - return - } - const rows: string[] = [] - const walk = async (dir: WsDir, path: string, depth: number) => { - const entries = (await dir.list()).sort(compareEntries) - for (const entry of entries) { - const full = path ? `${path}/${entry.name}` : entry.name - if (entry.kind === 'directory') { - const open = this.expanded.has(full) - rows.push( - `
    - - -
    `, - ) - if (open) await walk(await dir.dir(entry.name), full, depth + 1) - } else if (/\.(visustruct|java|json)$/i.test(entry.name)) { - // Zu einem Programm gehören .visustruct und .java: angezeigt wird das Programm einmal. - if (/\.java$/i.test(entry.name) && entries.some((e) => e.name === entry.name.replace(/\.java$/i, '.visustruct'))) continue - const program = /\.(visustruct|java)$/i.test(entry.name) - rows.push( - `
    - - ${program ? `` : ''} -
    `, - ) - } - } - } - try { - await walk(ws.root, '', 0) - } catch (err) { - rows.push(`

    ${esc((err as Error).message)}

    `) - } - if (ticket !== this.rendering) return - const where = ws.kind === 'folder' ? `📁 ${esc(ws.root.name)}` : esc(t('web_files_in_browser')) - const hint = t('web_files_save_hint_fmt', todayFolder()) - this.body.innerHTML = ` -

    ${where}

    -
    ${rows.join('') || `

    ${esc(t('web_files_empty'))}

    `}
    -

    ${esc(hint)}

    - ` - } - - private startHTML(): string { - if (this.pending) { - return `

    ${esc(t('web_files_reconnect_hint'))}

    - - ` - } - if (canPickFolder()) { - return `

    ${esc(t('web_files_connect_hint'))}

    - ` - } - return `

    ${esc(t('web_files_browser_hint'))}

    - ` - } - - private async onTreeClick(e: Event) { - const target = e.target as HTMLElement - const start = target.closest('[data-start]')?.dataset.start - if (start === 'pick') return this.connectFolder() - if (start === 'reconnect') return this.reconnect() - if (start === 'browser') return this.useBrowser() - const row = target.closest('.files-row') - if (!row || !this.workspace) return - const path = row.dataset.path! - if (target.closest('.files-delete')) return this.remove(row) - if (row.dataset.kind === 'dir') { - if (this.expanded.has(path)) this.expanded.delete(path) - else this.expanded.add(path) - this.rememberExpanded() - return this.render() - } - if (row.dataset.kind === 'program') return this.openProgram(path) - } - - private async locate(path: string): Promise<{ dir: WsDir; name: string }> { - const parts = path.split('/') - let dir = this.workspace!.root - for (const part of parts.slice(0, -1)) dir = await dir.dir(part) - return { dir, name: parts.at(-1)! } - } - - private async openProgram(path: string) { - try { - const { dir, name } = await this.locate(path) - const base = name.replace(/\.(visustruct|java)$/i, '') - const xml = (await dir.has(`${base}.visustruct`)) ? await dir.read(`${base}.visustruct`) : undefined - const java = (await dir.has(`${base}.java`)) ? await dir.read(`${base}.java`) : undefined - if (xml === undefined && java === undefined) return - const file = { dir, base, path: path.replace(/\.(visustruct|java)$/i, '') } - this.host.open(xml ?? '', file, java) - } catch (err) { - this.host.message((err as Error).message) - } - } - - private async remove(row: HTMLElement) { - const path = row.dataset.path! - const program = row.dataset.kind === 'program' - const label = program ? path.replace(/\.(visustruct|java)$/i, '') : path - if ((await ask({ title: t('web_files_delete_confirm_fmt', label), ok: t('web_files_delete'), danger: true })) === undefined) return - try { - const { dir, name } = await this.locate(path) - if (program) { - const base = name.replace(/\.(visustruct|java)$/i, '') - for (const ext of ['.visustruct', '.java']) if (await dir.has(base + ext)) await dir.remove(base + ext) - } else { - await dir.remove(name) - } - } catch (err) { - this.host.message((err as Error).message) - } - await this.render() - } - - private async newFolder() { - if (!this.workspace) return - const name = validFolderName((await ask({ title: t('web_files_folder_prompt'), input: '', ok: t('web_files_create') })) ?? '') - if (!name) return - try { - await this.workspace.root.dir(name, true) - } catch (err) { - this.host.message((err as Error).message) - } - await this.render() - } - - // MARK: - Speichern - - /** - * Programm speichern: in seinen bisherigen Ordner, sonst in den Tagesordner im Workspace (wird angelegt). - * `undefined`, wenn noch kein Workspace gewählt ist. - */ - async save(title: string, xml: string, java: string | undefined, file?: WorkspaceFile): Promise { - const ws = this.workspace - if (!ws) return undefined - let target = file - if (!target) { - const day = todayFolder() - const dir = await ws.root.dir(day, true) - const base = uniqueBaseName(programBaseName(title, t('web_files_default_name')), (await dir.list()).map((e) => e.name)) - target = { dir, base, path: `${day}/${base}` } - this.expanded.add(day) - this.rememberExpanded() - } - await target.dir.write(`${target.base}.visustruct`, xml) - if (java !== undefined) await target.dir.write(`${target.base}.java`, java) - await this.render() - return target - } -} diff --git a/web/src/ui/flowApp.ts b/web/src/ui/flowApp.ts deleted file mode 100644 index b2d55148..00000000 --- a/web/src/ui/flowApp.ts +++ /dev/null @@ -1,792 +0,0 @@ -import { - addNode, - connect, - emptyFlow, - FLOW_FILL, - FLOW_GRID, - FLOW_LINE_HEIGHT, - FLOW_SHAPES, - flowBox, - flowFromJSON, - flowPorts, - flowToJSON, - freePort, - hasInput, - moveNode, - portPoint, - portSide, - removeEdge, - removeNode, - routeEdge, - setText, - swapYesNo, - type FlowBox, - type FlowDoc, - type FlowNode, - type FlowPort, - type FlowShape, -} from '../core/flowModel' -import { gearIcon } from './app' -import { buildDiagramPDF, canvasRGB, canvasToPNG, exportFilenameSlug, rasterize, svgMarkup, type ExportImage } from './exporter' -import { currentLanguage, t } from './i18n' -import { worldHomeURL } from './site' -import { icons } from './icons' -import { setVisuBotMode, setVisuObjectWorld, worldChooserHTML, worldTitleHTML, type WorldChoice } from './visubotView' - -/** - * Welt VisuFlow (…/app/?visuflow): einen PAP (flowchart) frei zeichnen. Symbole aus der Leiste ziehen oder antippen, - * Text eintippen, Pfeile vom Punkt am Ausgang zum nächsten Symbol ziehen, als Datei speichern und als Bild/PDF exportieren. - */ - -declare const __APP_VERSION__: string - -const SVG = 'http://www.w3.org/2000/svg' -const docKey = 'visuflow.doc' -const maxUndoSteps = 100 -const fontSize = 14 -const font = `${fontSize}px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` -const ink = '#1c1c1e' - -const e = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) - -function stored(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function store(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher nur für diese Sitzung */ - } -} - -function siteURL(): string { - return worldHomeURL('visustruct', currentLanguage()) -} - -function download(name: string, data: BlobPart, type: string) { - const url = URL.createObjectURL(new Blob([data], { type })) - const a = document.createElement('a') - a.href = url - a.download = name - a.click() - setTimeout(() => URL.revokeObjectURL(url), 1000) -} - -function s(tag: string, attrs: Record = {}): SVGElement { - const el = document.createElementNS(SVG, tag) - for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, String(v)) - return el -} - -let measureCtx: CanvasRenderingContext2D | null | undefined -function measure(text: string): number { - if (measureCtx === undefined) measureCtx = document.createElement('canvas').getContext('2d') - if (!measureCtx) return text.length * fontSize * 0.55 - measureCtx.font = font - return measureCtx.measureText(text).width -} - -const shapeName = (shape: FlowShape) => t(`web_visuflow_shape_${shape}`) -const defaultText = (shape: FlowShape) => t(`web_visuflow_text_${shape}`) - -/** Umriss eines Symbols nach DIN 66001. */ -function shapePath(shape: FlowShape, b: { x: number; y: number; w: number; h: number }): SVGElement { - const l = b.x - b.w / 2 - const r = b.x + b.w / 2 - const top = b.y - b.h / 2 - const bot = b.y + b.h / 2 - if (shape === 'verzweigung') return s('path', { d: `M${b.x} ${top} L${r} ${b.y} L${b.x} ${bot} L${l} ${b.y} Z` }) - if (shape === 'ein') return s('path', { d: `M${l + 14} ${top} L${r} ${top} L${r - 14} ${bot} L${l} ${bot} Z` }) - if (shape === 'unterprogramm') return s('path', { d: `M${l} ${top} H${r} V${bot} H${l} Z M${l + 10} ${top} V${bot} M${r - 10} ${top} V${bot}` }) - return s('rect', { x: l, y: top, width: b.w, height: b.h, rx: shape === 'anweisung' ? 2 : b.h / 2 }) -} - -function textLines(box: FlowBox): SVGElement { - const text = s('text', { 'text-anchor': 'middle', 'font-size': fontSize, fill: ink }) - box.lines.forEach((line, i) => { - const span = s('tspan', { x: box.x, y: box.y + 5 + (i - (box.lines.length - 1) / 2) * FLOW_LINE_HEIGHT }) - span.textContent = line - text.append(span) - }) - return text -} - -/** Kleines Symbol für die Leiste. */ -function paletteIcon(shape: FlowShape): string { - const svg = s('svg', { viewBox: '0 0 64 36', width: 64, height: 36, 'aria-hidden': 'true' }) - const p = shapePath(shape, { x: 32, y: 18, w: shape === 'verzweigung' ? 54 : 56, h: shape === 'verzweigung' ? 32 : 26 }) - p.setAttribute('fill', FLOW_FILL[shape]) - p.setAttribute('stroke', ink) - p.setAttribute('stroke-width', '1.5') - svg.append(p) - return svg.outerHTML -} - -/** Beispiel aus Lektion 1: Tee kochen mit Schleife „Tee noch zu heiß?“. */ -function exampleFlow(): FlowDoc { - let doc = emptyFlow(t('web_visuflow_example_title')) - const ids: string[] = [] - const add = (shape: FlowShape, x: number, y: number, text: string) => { - const r = addNode(doc, shape, x, y, text) - doc = r.doc - ids.push(r.id) - } - add('start', 240, 60, defaultText('start')) - add('anweisung', 240, 160, t('web_visuflow_example_water')) - add('anweisung', 240, 260, t('web_visuflow_example_bag')) - add('verzweigung', 240, 380, t('web_visuflow_example_hot')) - add('anweisung', 480, 380, t('web_visuflow_example_wait')) - add('anweisung', 240, 500, t('web_visuflow_example_drink')) - add('ende', 240, 600, defaultText('ende')) - const [start, water, bag, hot, wait, drink, end] = ids - doc = connect(doc, start, 'out', water) - doc = connect(doc, water, 'out', bag) - doc = connect(doc, bag, 'out', hot) - doc = swapYesNo(doc, hot) - doc = connect(doc, hot, 'ja', wait) - doc = connect(doc, wait, 'out', hot) - doc = connect(doc, hot, 'nein', drink) - doc = connect(doc, drink, 'out', end) - return doc -} - -function startFlow(): FlowDoc { - return addNode(emptyFlow(), 'start', 240, 60, defaultText('start')).doc -} - -type Selection = { kind: 'node' | 'edge'; id: string } - -export class FlowApp { - private shell: HTMLElement - private svg!: SVGSVGElement - private scroller!: HTMLElement - private status!: HTMLElement - private titleInput!: HTMLInputElement - private doc: FlowDoc - private selection?: Selection - private history: string[] = [] - private future: string[] = [] - private editor?: HTMLTextAreaElement - /** Pfeil, der gerade gezogen wird. */ - private dragLine?: SVGElement - - constructor(root: HTMLElement) { - document.documentElement.classList.add('visuflow-theme') - history.replaceState(history.state, '', `${location.pathname}?visuflow${location.hash}`) - this.doc = flowFromJSON(stored(docKey) ?? '') ?? exampleFlow() - this.shell = document.createElement('div') - this.shell.className = 'shell visuflow' - root.replaceWith(this.shell) - this.build() - this.render() - window.addEventListener('keydown', (ev) => this.onKey(ev)) - } - - // MARK: - Aufbau - - private build() { - const button = (action: string, label: string, icon: string, tip = label) => - `` - const palette = FLOW_SHAPES.map( - (shape) => ``, - ).join('') - this.shell.innerHTML = ` -
    - VisuFlow ${e(t('web_visuflow_subtitle'))} -
    - ${button('new', t('toolbar_new'), icons.newFile, t('web_visuflow_new_tip'))} - ${button('open', t('menu_open'), icons.open, t('web_visuflow_open_tip'))} - ${button('save', t('menu_save'), icons.save, t('web_visuflow_save_tip'))} - ${button('undo', t('toolbar_undo'), icons.undo)} - ${button('redo', t('toolbar_redo'), icons.redo)} - ${button('delete', t('web_visuflow_delete'), icons.trash, t('web_visuflow_delete_tip'))} - - -
    -
    - - -
    -
    - - -
    -
    -
    - -
    -
    -
    - -
    -

    -
    -
    - ` - const $ = (q: string) => this.shell.querySelector(q)! - this.svg = $('.vf-canvas') - this.scroller = $('.vf-scroll') - this.status = $('.vf-status') - this.titleInput = $('.vf-title') - const on = (action: string, run: () => void) => $(`[data-action=${action}]`).addEventListener('click', run) - on('new', () => this.replace(startFlow())) - on('example', () => this.replace(exampleFlow())) - on('open', () => $('input[type=file]').click()) - on('save', () => this.save()) - on('undo', () => this.undo(false)) - on('redo', () => this.undo(true)) - on('delete', () => this.deleteSelection()) - on('swap', () => { - if (this.selection?.kind === 'node') this.change(swapYesNo(this.doc, this.selection.id)) - }) - const fileInput = $('input[type=file]') - fileInput.addEventListener('change', async () => { - const f = fileInput.files?.[0] - fileInput.value = '' - if (!f) return - const doc = flowFromJSON(await f.text()) - if (!doc) return this.showStatus(t('web_visuflow_open_error')) - if (!doc.title) doc.title = f.name.replace(/\.(visuflow|json)$/i, '') - this.replace(doc) - }) - - let titleBefore: string | undefined - this.titleInput.addEventListener('focus', () => (titleBefore = flowToJSON(this.doc))) - this.titleInput.addEventListener('input', () => { - this.doc = { ...this.doc, title: this.titleInput.value } - store(docKey, flowToJSON(this.doc)) - }) - this.titleInput.addEventListener('change', () => { - if (titleBefore !== undefined && titleBefore !== flowToJSON(this.doc)) this.pushUndo(titleBefore) - titleBefore = flowToJSON(this.doc) - }) - - // Export - const exportButton = $('[data-action=export]') - const exportMenu = $('.vf-menu') - const showExport = (show: boolean) => { - exportMenu.hidden = !show - exportButton.setAttribute('aria-expanded', String(show)) - } - exportButton.addEventListener('click', () => showExport(exportMenu.hidden)) - exportMenu.addEventListener('click', (ev) => { - const kind = (ev.target as HTMLElement).closest('[data-export]')?.dataset.export - if (!kind) return - showExport(false) - void this.export(kind as 'png' | 'svg' | 'pdf') - }) - // Einstellungen mit der Welten-Auswahl - const settings = $('[data-action=settings]') - const menu = $('.settings-menu') - settings.addEventListener('click', () => { - menu.hidden = !menu.hidden - settings.setAttribute('aria-expanded', String(!menu.hidden)) - }) - document.addEventListener('pointerdown', (ev) => { - const target = ev.target as HTMLElement - if (!menu.hidden && !target.closest('.settings')) menu.hidden = true - if (!exportMenu.hidden && !target.closest('.vf-export')) showExport(false) - }) - for (const b of menu.querySelectorAll('[data-world]')) b.addEventListener('click', () => this.chooseWorld(b.dataset.world as WorldChoice)) - - for (const b of this.shell.querySelectorAll('.vf-shape')) this.setupPaletteButton(b) - this.svg.addEventListener('pointerdown', (ev) => this.onPointerDown(ev)) - this.svg.addEventListener('dblclick', (ev) => { - const id = (ev.target as Element).closest('[data-node]')?.dataset.node - if (id) this.editText(id) - }) - } - - private chooseWorld(world: WorldChoice) { - if (world === 'flow') return - if (world === 'object') { - setVisuObjectWorld() - location.href = `${location.pathname}?visuobject${location.hash}` - return - } - setVisuBotMode(world) - location.href = `${location.pathname}?${world === 'on' ? 'visubot' : 'visustruct'}${location.hash}` - } - - // MARK: - Zustand und Rückgängig - - private pushUndo(before: string) { - this.history.push(before) - if (this.history.length > maxUndoSteps) this.history.shift() - this.future = [] - } - - private change(next: FlowDoc, select?: Selection | null) { - if (next === this.doc) return - this.pushUndo(flowToJSON(this.doc)) - this.doc = next - if (select !== undefined) this.selection = select ?? undefined - this.afterChange() - } - - private replace(doc: FlowDoc) { - this.change(doc, null) - this.scroller.scrollTo(0, 0) - } - - private afterChange() { - store(docKey, flowToJSON(this.doc)) - if (this.selection && !this.find(this.selection)) this.selection = undefined - this.render() - } - - private find(sel: Selection) { - return sel.kind === 'node' ? this.doc.nodes.find((n) => n.id === sel.id) : this.doc.edges.find((x) => x.id === sel.id) - } - - private undo(redo: boolean) { - this.closeEditor(true) - const from = redo ? this.future : this.history - const to = redo ? this.history : this.future - const text = from.pop() - if (text === undefined) return - to.push(flowToJSON(this.doc)) - this.doc = flowFromJSON(text) ?? this.doc - this.afterChange() - } - - private deleteSelection() { - const sel = this.selection - if (!sel) return - this.change(sel.kind === 'node' ? removeNode(this.doc, sel.id) : removeEdge(this.doc, sel.id), null) - } - - private save() { - const base = exportFilenameSlug(this.doc.title) || 'PAP' - download(`${base}.visuflow`, flowToJSON(this.doc), 'application/json') - this.showStatus(t('web_visuflow_saved', `${base}.visuflow`)) - } - - // MARK: - Zeichnen - - private boxes(doc = this.doc) { - return new Map(doc.nodes.map((n) => [n.id, flowBox(n, measure)])) - } - - /** Zeichnet den Plan; `exporting` ohne Punkte an den Ausgängen und ohne Auswahl. */ - private drawInto(svg: SVGSVGElement, exporting: boolean) { - const boxes = this.boxes() - const yes = t('web_learn_pap_yes') - const no = t('web_learn_pap_no') - svg.innerHTML = `` - const edges = s('g', { class: 'vf-edges' }) - const labels = s('g', { class: 'vf-labels', 'font-size': 12, 'font-weight': 600 }) - const nodes = s('g', { class: 'vf-nodes' }) - const ports = s('g', { class: 'vf-ports' }) - let lane = 0 - for (const edge of this.doc.edges) { - const from = this.doc.nodes.find((n) => n.id === edge.from)! - const a = boxes.get(edge.from)! - const b = boxes.get(edge.to)! - const side = portSide(this.doc, from, edge.port) - const back = b.y - b.h / 2 < portPoint(a, side)[1] + FLOW_GRID - const pts = routeEdge(a, side, b, back ? lane++ : 0) - const points = pts.map((p) => p.join(',')).join(' ') - const g = s('g', { 'data-edge': edge.id, class: `vf-edge${!exporting && this.selection?.kind === 'edge' && this.selection.id === edge.id ? ' selected' : ''}` }) - if (!exporting) g.append(s('polyline', { points, class: 'vf-edge-hit', fill: 'none', stroke: 'transparent', 'stroke-width': 16 })) - g.append(s('polyline', { points, class: 'vf-edge-line', fill: 'none', stroke: ink, 'stroke-width': 2, 'marker-end': 'url(#vf-arrow)' })) - edges.append(g) - } - for (const node of this.doc.nodes) { - const b = boxes.get(node.id)! - const selected = !exporting && this.selection?.kind === 'node' && this.selection.id === node.id - const g = s('g', { 'data-node': node.id, class: `vf-node${selected ? ' selected' : ''}` }) - const p = shapePath(node.shape, b) - p.setAttribute('fill', FLOW_FILL[node.shape]) - p.setAttribute('stroke', ink) - p.setAttribute('stroke-width', '2') - g.append(p, textLines(b)) - nodes.append(g) - for (const port of flowPorts(node.shape)) { - const side = portSide(this.doc, node, port) - const [px, py] = portPoint(b, side) - const used = this.doc.edges.some((x) => x.from === node.id && x.port === port) - if (port !== 'out' && (used || !exporting)) { - const lbl = s('text', side === 'bottom' ? { x: px + 7, y: py + 15 } : { x: px + 6, y: py - 7 }) - lbl.setAttribute('fill', port === 'ja' ? '#248a3d' : '#d70015') - lbl.textContent = port === 'ja' ? yes : no - labels.append(lbl) - } - if (exporting) continue - const pg = s('g', { 'data-port': port, 'data-from': node.id, class: `vf-port${used ? ' used' : ''}` }) - pg.append(s('circle', { cx: px, cy: py, r: 16, fill: 'transparent' }), s('circle', { cx: px, cy: py, r: 6, class: 'vf-port-dot' })) - ports.append(pg) - } - } - svg.append(edges, nodes, labels, ports) - return boxes - } - - private render() { - this.closeEditor(true) - const boxes = this.drawInto(this.svg, false) - let w = 0 - let h = 0 - for (const b of boxes.values()) { - w = Math.max(w, b.x + b.w / 2) - h = Math.max(h, b.y + b.h / 2) - } - // Platz zum Weiterzeichnen nach rechts und unten. - const width = Math.max(this.scroller.clientWidth, w + 300) - const height = Math.max(this.scroller.clientHeight, h + 300) - this.svg.setAttribute('width', String(width)) - this.svg.setAttribute('height', String(height)) - this.svg.setAttribute('viewBox', `0 0 ${width} ${height}`) - if (document.activeElement !== this.titleInput) this.titleInput.value = this.doc.title - const sel = this.selection - const node = sel?.kind === 'node' ? this.doc.nodes.find((n) => n.id === sel.id) : undefined - this.shell.querySelector('[data-action=swap]')!.disabled = node?.shape !== 'verzweigung' - this.shell.querySelector('[data-action=delete]')!.disabled = !sel - this.shell.querySelector('[data-action=undo]')!.disabled = this.history.length === 0 - this.shell.querySelector('[data-action=redo]')!.disabled = this.future.length === 0 - this.showStatus(t(this.doc.nodes.length === 0 ? 'web_visuflow_status_empty' : sel?.kind === 'edge' ? 'web_visuflow_status_edge' : sel ? 'web_visuflow_status_node' : 'web_visuflow_status_idle')) - } - - private showStatus(text: string) { - this.status.textContent = text - } - - // MARK: - Leiste - - /** Symbol antippen hängt es an das gewählte an, Ziehen legt es auf die Fläche. */ - private setupPaletteButton(button: HTMLButtonElement) { - const shape = button.dataset.shape as FlowShape - button.addEventListener('pointerdown', (ev) => { - if (ev.button !== 0) return - ev.preventDefault() - const start = { x: ev.clientX, y: ev.clientY } - let ghost: HTMLElement | undefined - const move = (m: PointerEvent) => { - if (!ghost && Math.hypot(m.clientX - start.x, m.clientY - start.y) < 6) return - if (!ghost) { - ghost = document.createElement('div') - ghost.className = 'vf-ghost' - ghost.innerHTML = paletteIcon(shape) - document.body.append(ghost) - } - ghost.style.left = `${m.clientX}px` - ghost.style.top = `${m.clientY}px` - } - const up = (u: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - window.removeEventListener('pointercancel', up) - if (!ghost) return this.appendShape(shape) - ghost.remove() - if (u.type === 'pointercancel') return - const r = this.scroller.getBoundingClientRect() - if (u.clientX < r.left || u.clientX > r.right || u.clientY < r.top || u.clientY > r.bottom) return - const p = this.toCanvas(u) - const { doc, id } = addNode(this.doc, shape, p.x, p.y, defaultText(shape)) - this.change(doc, { kind: 'node', id }) - this.editText(id) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - window.addEventListener('pointercancel', up) - }) - button.addEventListener('keydown', (ev) => { - if (ev.key !== 'Enter' && ev.key !== ' ') return - ev.preventDefault() - this.appendShape(shape) - }) - } - - /** Neues Symbol unter (oder bei „nein“ rechts neben) das gewählte und gleich mit einem Pfeil verbinden. */ - private appendShape(shape: FlowShape) { - const sel = this.selection - const from = sel?.kind === 'node' ? this.doc.nodes.find((n) => n.id === sel.id) : undefined - const port = from && hasInput(shape) ? freePort(this.doc, from) : undefined - const probe = flowBox({ id: '', shape, x: 0, y: 0, text: defaultText(shape) }, measure) - let x = 240 - let y = 60 - if (from && port) { - const b = flowBox(from, measure) - if (portSide(this.doc, from, port) === 'right') { - x = b.x + b.w / 2 + 3 * FLOW_GRID + probe.w / 2 - y = b.y - } else { - x = b.x - y = b.y + b.h / 2 + 3 * FLOW_GRID + probe.h / 2 - } - } else if (this.doc.nodes.length) { - const boxes = [...this.boxes().values()] - const low = boxes.reduce((a, b) => (b.y + b.h / 2 > a.y + a.h / 2 ? b : a)) - x = from ? flowBox(from, measure).x : low.x - y = low.y + low.h / 2 + 3 * FLOW_GRID + probe.h / 2 - } - let { doc, id } = addNode(this.doc, shape, x, y, defaultText(shape)) - if (from && port) doc = connect(doc, from.id, port, id) - this.change(doc, { kind: 'node', id }) - const node = this.svg.querySelector(`[data-node="${id}"]`) - node?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' }) - this.editText(id) - } - - // MARK: - Zeichenfläche - - private toCanvas(ev: { clientX: number; clientY: number }) { - const r = this.svg.getBoundingClientRect() - return { x: ev.clientX - r.left, y: ev.clientY - r.top } - } - - private nodeAt(p: { x: number; y: number }, except?: string): FlowNode | undefined { - const boxes = this.boxes() - return [...this.doc.nodes].reverse().find((n) => { - const b = boxes.get(n.id)! - return n.id !== except && Math.abs(p.x - b.x) <= b.w / 2 + 4 && Math.abs(p.y - b.y) <= b.h / 2 + 4 - }) - } - - private onPointerDown(ev: PointerEvent) { - if (ev.button !== 0) return - const target = ev.target as Element - const port = target.closest('[data-port]') - if (port) return this.dragArrow(ev, port.dataset.from!, port.dataset.port as FlowPort) - const nodeId = target.closest('[data-node]')?.dataset.node - if (nodeId) return this.dragNode(ev, nodeId) - const edgeId = target.closest('[data-edge]')?.dataset.edge - this.closeEditor(true) - this.selection = edgeId ? { kind: 'edge', id: edgeId } : undefined - this.render() - } - - private dragNode(ev: PointerEvent, id: string) { - ev.preventDefault() - const wasSelected = this.selection?.kind === 'node' && this.selection.id === id - this.closeEditor(true) - this.selection = { kind: 'node', id } - this.render() - const node = this.doc.nodes.find((n) => n.id === id)! - const start = this.toCanvas(ev) - const before = flowToJSON(this.doc) - const origin = { x: node.x, y: node.y } - let moved = false - const move = (m: PointerEvent) => { - const p = this.toCanvas(m) - if (!moved && Math.hypot(p.x - start.x, p.y - start.y) < 5) return - moved = true - this.doc = moveNode(this.doc, id, origin.x + p.x - start.x, origin.y + p.y - start.y) - this.render() - } - const up = () => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - window.removeEventListener('pointercancel', up) - if (moved) { - if (flowToJSON(this.doc) !== before) this.pushUndo(before) - this.afterChange() - } else if (wasSelected) this.editText(id) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - window.addEventListener('pointercancel', up) - } - - /** Pfeil vom Ausgang ziehen und über dem Zielsymbol loslassen. */ - private dragArrow(ev: PointerEvent, from: string, port: FlowPort) { - ev.preventDefault() - this.closeEditor(true) - const node = this.doc.nodes.find((n) => n.id === from)! - const [sx, sy] = portPoint(flowBox(node, measure), portSide(this.doc, node, port)) - this.dragLine = s('line', { x1: sx, y1: sy, x2: sx, y2: sy, class: 'vf-drag-line', 'marker-end': 'url(#vf-arrow)' }) - this.svg.append(this.dragLine) - this.showStatus(t('web_visuflow_status_connect')) - let hover: SVGElement | null = null - const move = (m: PointerEvent) => { - const p = this.toCanvas(m) - this.dragLine!.setAttribute('x2', String(p.x)) - this.dragLine!.setAttribute('y2', String(p.y)) - const target = this.nodeAt(p, from) - hover?.classList.remove('drop-target') - hover = target && hasInput(target.shape) ? this.svg.querySelector(`[data-node="${target.id}"]`) : null - hover?.classList.add('drop-target') - } - const up = (u: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - window.removeEventListener('pointercancel', up) - this.dragLine?.remove() - this.dragLine = undefined - const target = u.type === 'pointercancel' ? undefined : this.nodeAt(this.toCanvas(u), from) - if (target && hasInput(target.shape)) this.change(connect(this.doc, from, port, target.id), { kind: 'node', id: target.id }) - else this.render() - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - window.addEventListener('pointercancel', up) - } - - // MARK: - Text eintippen - - private editText(id: string) { - this.closeEditor(true) - const node = this.doc.nodes.find((n) => n.id === id) - if (!node) return - const b = flowBox(node, measure) - const area = document.createElement('textarea') - area.className = 'vf-editor' - area.value = node.text - area.setAttribute('aria-label', t('web_visuflow_edit_label')) - const inner = node.shape === 'verzweigung' ? 0.62 : 0.92 - const w = Math.max(110, b.w * inner) - area.style.left = `${this.svg.getBoundingClientRect().left - this.scroller.getBoundingClientRect().left + this.scroller.scrollLeft + b.x - w / 2}px` - area.style.top = `${this.svg.getBoundingClientRect().top - this.scroller.getBoundingClientRect().top + this.scroller.scrollTop + b.y - Math.max(28, b.lines.length * FLOW_LINE_HEIGHT + 10) / 2}px` - area.style.width = `${w}px` - area.style.height = `${Math.max(28, b.lines.length * FLOW_LINE_HEIGHT + 10)}px` - area.dataset.node = id - this.scroller.append(area) - this.editor = area - area.focus() - area.select() - const fit = () => { - area.style.height = 'auto' - area.style.height = `${area.scrollHeight}px` - } - area.addEventListener('input', fit) - area.addEventListener('keydown', (k) => { - k.stopPropagation() - if (k.key === 'Enter' && !k.shiftKey) { - k.preventDefault() - this.closeEditor(true) - } else if (k.key === 'Escape') { - k.preventDefault() - this.closeEditor(false) - } - }) - area.addEventListener('blur', () => this.closeEditor(true)) - } - - private closeEditor(commit: boolean) { - const area = this.editor - if (!area) return - this.editor = undefined - area.remove() - const id = area.dataset.node! - const node = this.doc.nodes.find((n) => n.id === id) - const text = area.value.trim() - if (commit && node && text !== node.text) this.change(setText(this.doc, id, text)) - } - - // MARK: - Tastatur - - private onKey(ev: KeyboardEvent) { - const typing = (ev.target as HTMLElement).closest?.('input, textarea, [contenteditable]') - const mod = ev.ctrlKey || ev.metaKey - if (mod && ev.key.toLowerCase() === 's') { - ev.preventDefault() - return this.save() - } - if (typing) return - if (mod && ev.key.toLowerCase() === 'z') { - ev.preventDefault() - return this.undo(ev.shiftKey) - } - if (mod && ev.key.toLowerCase() === 'y') { - ev.preventDefault() - return this.undo(true) - } - const sel = this.selection - if (!sel) return - if (ev.key === 'Delete' || ev.key === 'Backspace') { - ev.preventDefault() - return this.deleteSelection() - } - if (sel.kind !== 'node') return - if (ev.key === 'Enter' || ev.key === 'F2') { - ev.preventDefault() - return this.editText(sel.id) - } - const step = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] }[ev.key] - if (!step) return - ev.preventDefault() - const node = this.doc.nodes.find((n) => n.id === sel.id)! - this.change(moveNode(this.doc, sel.id, node.x + step[0] * FLOW_GRID, node.y + step[1] * FLOW_GRID)) - } - - // MARK: - Export - - /** Plan ohne Auswahl und Punkte, zugeschnitten, mit Titel oben. */ - private exportImage(): ExportImage | undefined { - if (this.doc.nodes.length === 0) return undefined - const svg = document.createElementNS(SVG, 'svg') as SVGSVGElement - const boxes = this.drawInto(svg, true) - let x0 = Infinity - let y0 = Infinity - let x1 = -Infinity - let y1 = -Infinity - for (const b of boxes.values()) { - x0 = Math.min(x0, b.x - b.w / 2) - y0 = Math.min(y0, b.y - b.h / 2) - x1 = Math.max(x1, b.x + b.w / 2) - y1 = Math.max(y1, b.y + b.h / 2) - } - // Pfeile laufen rechts außen vorbei, Beschriftungen stehen neben den Ausgängen. - for (const pl of svg.querySelectorAll('polyline')) { - for (const pair of (pl.getAttribute('points') ?? '').split(' ')) { - const [px, py] = pair.split(',').map(Number) - x0 = Math.min(x0, px) - x1 = Math.max(x1, px + 4) - y0 = Math.min(y0, py) - y1 = Math.max(y1, py) - } - } - x1 += 30 - const margin = 20 - const title = this.doc.title.trim() - const titleH = title ? 32 : 0 - const width = Math.ceil(x1 - x0 + 2 * margin) - const height = Math.ceil(y1 - y0 + 2 * margin + titleH) - svg.setAttribute('xmlns', SVG) - svg.setAttribute('width', String(width)) - svg.setAttribute('height', String(height)) - svg.setAttribute('viewBox', `${x0 - margin} ${y0 - margin - titleH} ${width} ${height}`) - svg.setAttribute('font-family', font.replace(/^\d+px /, '')) - const bg = s('rect', { x: x0 - margin, y: y0 - margin - titleH, width, height, fill: '#ffffff' }) - svg.insertBefore(bg, svg.firstChild!.nextSibling) - if (title) { - const text = s('text', { x: x0 - margin + 12, y: y0 - margin - titleH + 26, 'font-size': 16, 'font-weight': 700, fill: ink }) - text.textContent = title - svg.append(text) - } - return { svg, width, height } - } - - private async export(kind: 'png' | 'svg' | 'pdf') { - const image = this.exportImage() - if (!image) return this.showStatus(t('web_visuflow_status_empty')) - const base = exportFilenameSlug(this.doc.title) || 'PAP' - if (kind === 'svg') return download(`${base}.svg`, svgMarkup(image), 'image/svg+xml') - const canvas = await rasterize(image, kind === 'png' ? 2 : 3) - if (kind === 'png') return download(`${base}.png`, await canvasToPNG(canvas), 'image/png') - const pdf = await buildDiagramPDF(canvasRGB(canvas), canvas.width, canvas.height, image, this.doc.title.trim() || 'PAP') - download(`${base}.pdf`, pdf, 'application/pdf') - } -} diff --git a/web/src/ui/i18n.ts b/web/src/ui/i18n.ts deleted file mode 100644 index ae913265..00000000 --- a/web/src/ui/i18n.ts +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Sprachen wie `AppLanguage.swift`: Texte aus den `Localizable.strings` der App, dazu - * `src/i18n/.strings` für Texte, die es nur in der Web-Version gibt. - * Fehlt ein Text in einer Sprache, gilt der englische (nie der Schlüssel selbst). - */ - -export const languages = [ - { code: 'de', name: 'Deutsch' }, - { code: 'en', name: 'English' }, - { code: 'es', name: 'Español' }, - { code: 'fr', name: 'Français' }, - { code: 'it', name: 'Italiano' }, - { code: 'pl', name: 'Polski' }, - { code: 'tr', name: 'Türkçe' }, - { code: 'ko', name: '한국어' }, - { code: 'ja', name: '日本語' }, - { code: 'el', name: 'Ελληνικά' }, - { code: 'uk', name: 'Українська' }, - { code: 'ar', name: 'العربية' }, - { code: 'ru', name: 'Русский' }, - { code: 'he', name: 'עברית' }, - { code: 'nl', name: 'Nederlands' }, - { code: 'sv', name: 'Svenska' }, - { code: 'da', name: 'Dansk' }, - { code: 'nb', name: 'Norsk bokmål' }, - { code: 'zh-Hans', name: '中文(简体)' }, - { code: 'zh-Hant', name: '中文(繁體)' }, - { code: 'pt-PT', name: 'Português' }, - { code: 'java', name: 'Java (Keywords)' }, -] as const - -export type LanguageCode = (typeof languages)[number]['code'] - -/** - * Sprachen, die die Web-App zur Auswahl anbietet (Holger, 2026-10-22). Die übrigen bleiben übersetzt und lassen sich hier wieder einschalten. - * Java ist keine Sprache mehr, sondern der Schalter „Code-Keywords“ in den Einstellungen (Holger, 2026-10-23). - */ -const offered: readonly LanguageCode[] = ['de', 'en', 'pt-PT'] -export const offeredLanguages = languages.filter((l) => offered.includes(l.code)) -const isOffered = (code: string): code is LanguageCode => offered.includes(code as LanguageCode) - -const appStrings = import.meta.glob('../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/*.lproj/Localizable.strings', { - query: '?raw', - import: 'default', -}) as Record Promise> -const javaStrings = import.meta.glob('../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Java.strings', { - query: '?raw', - import: 'default', -}) as Record Promise> -const webStrings = import.meta.glob('../i18n/*.strings', { query: '?raw', import: 'default' }) as Record< - string, - () => Promise -> - -function loader(table: Record Promise>, suffix: string): (() => Promise) | undefined { - return Object.entries(table).find(([path]) => path.endsWith(suffix))?.[1] -} - -/** Liest das Apple-Format `"schlüssel" = "wert";` (Kommentare werden übersprungen). */ -export function parseStrings(source: string): Map { - const map = new Map() - const withoutComments = source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '') - const re = /"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;/g - const unescape = (s: string) => - s.replace(/\\(u[0-9a-fA-F]{4}|.)/g, (_, c: string) => - c === 'n' ? '\n' : c === 't' ? '\t' : c.startsWith('u') && c.length === 5 ? String.fromCharCode(parseInt(c.slice(1), 16)) : c, - ) - for (const m of withoutComments.matchAll(re)) map.set(unescape(m[1]), unescape(m[2])) - return map -} - -async function loadTable(code: LanguageCode): Promise> { - const app = code === 'java' ? loader(javaStrings, '/Java.strings') : loader(appStrings, `/${code}.lproj/Localizable.strings`) - const web = loader(webStrings, `/${code}.strings`) - const table = new Map() - for (const load of [app, web]) { - if (!load) continue - for (const [k, v] of parseStrings(await load())) table.set(k, v) - } - return table -} - -let current: LanguageCode = 'en' -let table = new Map() -let english = new Map() - -const storageKey = 'appLanguageCode' -const keywordsKey = 'visustruct.keywords' - -/** Code-Keywords: Elemente heißen if, while, for … statt Verzweigung, While-Schleife …, unabhängig von der Sprache. */ -let keywords = new Map() -let keywordsOn = false - -/** Nur Beschriftungen im Struktogramm aus `Java.strings`: Elementnamen und Platzhalter. */ -const isKeywordLabel = (key: string) => key.startsWith('element_') || key.startsWith('canvas_stub_') - -/** Früher war „Java (Keywords)“ eine Sprache: gespeichert oder per ?lang=java wird daraus Englisch mit Code-Keywords. */ -function migrateJavaLanguage(): boolean { - try { - const java = new URLSearchParams(location.search).get('lang') === 'java' || localStorage.getItem(storageKey) === 'java' - if (java) { - localStorage.setItem(storageKey, 'en') - localStorage.setItem(keywordsKey, '1') - } - return java - } catch { - return false - } -} - -export function storedCodeKeywords(): boolean { - try { - return localStorage.getItem(keywordsKey) === '1' - } catch { - return false - } -} - -export async function setCodeKeywords(on: boolean, remember = true) { - if (on && keywords.size === 0) { - if (english.size === 0) english = await loadTable('en') - const load = loader(javaStrings, '/Java.strings') - // Nur echte Keywords: Wo Java.strings nur Englisch ist (z. B. „Statement“), bleibt die gewählte Sprache. - if (load) for (const [k, v] of parseStrings(await load())) if (isKeywordLabel(k) && v !== english.get(k)) keywords.set(k, v) - } - keywordsOn = on - if (remember) { - try { - localStorage.setItem(keywordsKey, on ? '1' : '0') - } catch { - /* nur für diese Sitzung */ - } - } -} - -export function codeKeywords(): boolean { - return keywordsOn -} - -/** Wie `AppLanguage.deviceDefault`: erste Browsersprache, die VisuStruct anbietet, sonst Englisch. */ -export function preferredLanguage(): LanguageCode { - if (migrateJavaLanguage()) return 'en' - // Link von der Webseite, z. B. visustruct.visucode.de/app/?lang=de - const fromURL = new URLSearchParams(location.search).get('lang') - if (fromURL && isOffered(fromURL)) return fromURL - try { - const saved = localStorage.getItem(storageKey) - if (saved && isOffered(saved)) return saved - } catch { - /* ohne Speicher */ - } - for (const tag of navigator.languages ?? [navigator.language]) { - const t = tag.toLowerCase() - if (t.startsWith('pt')) return 'pt-PT' - const hit = offeredLanguages.find((l) => l.code === t.split('-')[0]) - if (hit) return hit.code - } - return 'en' -} - -export async function setLanguage(code: LanguageCode, remember = true) { - if (english.size === 0) english = await loadTable('en') - table = code === 'en' ? english : await loadTable(code) - current = code - if (remember) { - try { - localStorage.setItem(storageKey, code) - } catch { - /* nur für diese Sitzung */ - } - } - const root = document.documentElement - root.lang = code === 'java' ? 'en' : code - root.dir = code === 'ar' || code === 'he' ? 'rtl' : 'ltr' -} - -export function currentLanguage(): LanguageCode { - return current -} - -/** Übersetzung zu `key`; `%@`, `%d` und `%1$@` werden der Reihe nach durch `args` ersetzt. */ -export function t(key: string, ...args: (string | number)[]): string { - const text = (keywordsOn ? keywords.get(key) : undefined) ?? table.get(key) ?? english.get(key) ?? key - if (args.length === 0) return text - let next = 0 - return text.replace(/%(?:(\d+)\$)?[@d]/g, (_, pos: string | undefined) => String(args[pos ? Number(pos) - 1 : next++] ?? '')) -} diff --git a/web/src/ui/icons.ts b/web/src/ui/icons.ts deleted file mode 100644 index cbfc7541..00000000 --- a/web/src/ui/icons.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** Symbole für Werkzeugleisten: 24er-Raster, Strich in Textfarbe. Name steht im Tooltip (`data-tip`). */ - -const svg = (body: string, filled = false) => - `` - -export const icons = { - newFile: svg(''), - open: svg(''), - save: svg(''), - undo: svg(''), - redo: svg(''), - cut: svg(''), - copy: svg(''), - paste: svg(''), - trash: svg(''), - share: svg(''), - book: svg(''), - code: svg(''), - play: svg('', true), - /** Einzelschritt (wie „Step over“ in Entwicklungsumgebungen): Bogen über eine Zeile zur nächsten. */ - step: svg(''), - indent: svg(''), - stop: svg('', true), - folder: svg(''), - newFolder: svg(''), - diagram: svg(''), - fileText: svg(''), - pencil: svg(''), -} diff --git a/web/src/ui/inlineEdit.ts b/web/src/ui/inlineEdit.ts deleted file mode 100644 index 2e685072..00000000 --- a/web/src/ui/inlineEdit.ts +++ /dev/null @@ -1,189 +0,0 @@ -import type { LayoutNode, Rect } from '../core/layout' -import { normalizingQuotes } from '../core/lineEditorText' -import { ElementType } from '../core/model' -import { diagramFontFamily } from '../core/textMeasurement' - -/** Text direkt im Struktogramm bearbeiten (Doppelklick/Doppeltipp), ohne Umweg über den Objektinspektor. */ - -export interface InlineField { - value: string - placeholder: string - label: string -} - -export interface InlineEditOptions { - host: HTMLElement - /** Fläche im Diagramm (Diagramm-Koordinaten, ohne Zoom). */ - rect: Rect - zoom: number - fontSize: number - lineHeight: number - /** Festes Schlüsselwort davor (`if`, `while`, `for`, `input:` …), nicht bearbeitbar. */ - prefix?: string - /** Ein Feld: Textfeld (Umschalt+Enter = neue Zeile). Mehrere: Eingabezeilen nebeneinander (Zählschleife). */ - fields: InlineField[] - /** Text mittig wie bei Anweisungen. */ - center: boolean - /** `undefined` = abgebrochen (Escape). */ - onDone(values: string[] | undefined): void -} - -export interface InlineEditor { - element: HTMLElement - /** Bearbeitung beenden; `save` übernimmt den Text. */ - finish(save: boolean): void -} - -/** Rand bei Aufruf (`callSideBarInset` im Renderer). */ -const callBar = 14 - -/** Fläche, in der der Text eines Elements steht (dort erscheint das Eingabefeld). */ -export function textRect(node: LayoutNode, lineHeight: number): Rect { - const r = node.frame - switch (node.element.type) { - case ElementType.aufruf: - return { x: r.x + callBar, y: r.y, width: Math.max(40, r.width - 2 * callBar), height: r.height } - case ElementType.aussprung: - return { x: r.x + callBar, y: r.y, width: Math.max(40, r.width - callBar), height: r.height } - case ElementType.verzweigung: - return { x: r.x, y: r.y, width: r.width, height: node.headerBandHeight } - case ElementType.fallauswahl: - return { x: r.x, y: r.y, width: r.width, height: Math.max(lineHeight + 8, node.headerBandHeight - caseBandHeight(lineHeight)) } - case ElementType.forSchleife: - case ElementType.whileSchleife: - case ElementType.endlosschleife: { - const bodyTop = node.children[0]?.frame.y ?? r.y + r.height - return { x: r.x, y: r.y, width: r.width, height: Math.max(lineHeight + 8, bodyTop - r.y) } - } - case ElementType.doUntilSchleife: - return { x: r.x, y: r.y + r.height - node.headerBandHeight, width: r.width, height: node.headerBandHeight } - default: - return r - } -} - -/** Höhe des Bands mit den Fallnamen unter dem Dach der Fallauswahl (wie im Renderer). */ -export function caseBandHeight(lineHeight: number): number { - return Math.max(26, lineHeight + 10) -} - -/** Fallauswahl: Index des Falls, wenn der Punkt auf einer Fallbeschriftung liegt. */ -export function caseLabelAt(node: LayoutNode, x: number, y: number, lineHeight: number): number | undefined { - if (node.element.type !== ElementType.fallauswahl) return undefined - const bottom = node.frame.y + node.headerBandHeight - if (y > bottom || y < bottom - caseBandHeight(lineHeight)) return undefined - const i = node.caseColumnFrames.findIndex((c) => x >= c.x && x <= c.x + c.width) - return i >= 0 ? i : undefined -} - -/** Fläche einer Fallbeschriftung. */ -export function caseLabelRect(node: LayoutNode, index: number, lineHeight: number): Rect { - const col = node.caseColumnFrames[index] - const band = caseBandHeight(lineHeight) - return { x: col.x, y: node.frame.y + node.headerBandHeight - band, width: col.width, height: band } -} - -export function openInlineEditor(o: InlineEditOptions): InlineEditor { - const z = o.zoom - const box = document.createElement('div') - box.className = 'inline-edit' - if (o.center) box.classList.add('inline-edit-center') - const minH = 40 - const top = o.rect.y * z - const height = Math.max(minH, o.rect.height * z) - Object.assign(box.style, { - left: `${o.rect.x * z}px`, - top: `${top - Math.max(0, (minH - o.rect.height * z) / 2)}px`, - width: `${Math.max(o.fields.length > 1 ? 300 : 120, o.rect.width * z)}px`, - minHeight: `${height}px`, - fontFamily: diagramFontFamily, - fontSize: `${o.fontSize * z}px`, - lineHeight: `${o.lineHeight * z}px`, - }) - if (o.prefix) { - const p = document.createElement('span') - p.className = 'inline-edit-prefix' - p.textContent = o.prefix - box.append(p) - } - const inputs: (HTMLInputElement | HTMLTextAreaElement)[] = [] - o.fields.forEach((f, i) => { - const multi = o.fields.length === 1 - const input = multi ? document.createElement('textarea') : document.createElement('input') - input.value = f.value - input.placeholder = f.placeholder - input.spellcheck = false - input.setAttribute('autocomplete', 'off') - input.setAttribute('autocapitalize', 'off') - input.setAttribute('autocorrect', 'off') - input.setAttribute('aria-label', f.label) - if (input instanceof HTMLTextAreaElement) input.rows = Math.max(1, f.value.split('\n').length) - if (i > 0) { - const sep = document.createElement('span') - sep.className = 'inline-edit-sep' - sep.textContent = ';' - box.append(sep) - } - box.append(input) - inputs.push(input) - }) - - const fit = (input: HTMLInputElement | HTMLTextAreaElement) => { - if (!(input instanceof HTMLTextAreaElement)) return - input.rows = Math.max(1, input.value.split('\n').length) - input.style.height = 'auto' - input.style.height = `${input.scrollHeight}px` - } - - let done = false - const finish = (save: boolean) => { - if (done) return - done = true - box.remove() - o.onDone(save ? inputs.map((i) => i.value) : undefined) - } - - for (const input of inputs as HTMLInputElement[]) { - input.addEventListener('input', () => { - // Typografische Anführungszeichen sofort durch gerade ersetzen (gleiche Länge, Cursor bleibt). - const normalized = normalizingQuotes(input.value) - if (normalized !== input.value) { - const pos = input.selectionStart - input.value = normalized - input.setSelectionRange(pos, pos) - } - fit(input) - }) - input.addEventListener('keydown', (ev) => { - ev.stopPropagation() - if (ev.key === 'Escape') { - ev.preventDefault() - finish(false) - } else if (ev.key === 'Enter' && !(ev.shiftKey && o.fields.length === 1) && !ev.isComposing) { - ev.preventDefault() - finish(true) - } - }) - } - // Daneben tippen übernimmt; Wechsel zwischen den Feldern der Zählschleife nicht. - box.addEventListener('focusout', (ev) => { - const next = ev.relatedTarget - if (next instanceof Node && box.contains(next)) return - // Kurz warten: Manche Browser verschieben den Fokus beim Öffnen noch einmal. - setTimeout(() => { - if (!done && !box.contains(document.activeElement)) finish(true) - }, 0) - }) - // Zeiger im Feld gehört dem Feld, nicht dem Struktogramm darunter. - for (const type of ['pointerdown', 'click', 'dblclick', 'contextmenu'] as const) { - box.addEventListener(type, (ev) => ev.stopPropagation()) - } - - o.host.append(box) - inputs.forEach(fit) - const first = inputs[0] - first.focus({ preventScroll: true }) - first.select() - box.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - return { element: box, finish } -} diff --git a/web/src/ui/javaEditor.ts b/web/src/ui/javaEditor.ts deleted file mode 100644 index b9b828e9..00000000 --- a/web/src/ui/javaEditor.ts +++ /dev/null @@ -1,687 +0,0 @@ -import { autocompletion, closeBrackets, closeBracketsKeymap, completionKeymap, snippetCompletion, type Completion, type CompletionContext } from '@codemirror/autocomplete' -import { defaultKeymap, indentWithTab } from '@codemirror/commands' -import { java } from '@codemirror/lang-java' -import { bracketMatching, HighlightStyle, indentOnInput, indentUnit, syntaxHighlighting, syntaxTree } from '@codemirror/language' -import { Annotation, ChangeSet, type ChangeSpec, Compartment, countColumn, EditorSelection, EditorState, Prec, RangeSet, RangeSetBuilder, StateEffect, StateField, type Extension, type Text } from '@codemirror/state' -import { Decoration, EditorView, gutter, GutterMarker, gutterLineClass, highlightActiveLineGutter, keymap, layer, lineNumbers, RectangleMarker, WidgetType, type BlockInfo, type DecorationSet } from '@codemirror/view' -import { tags } from '@lezer/highlight' -import { formatJavaEdits } from '../core/javaFormat' -import { indentJava } from '../core/javaIndent' -import { memberCompletionsAt, type JavaMember, type MemberLanguage, type OwnTypes } from '../core/javaMembers' -import { currentLanguage } from './i18n' - -/** - * Code-Editor der Ansicht „Code live“ (CodeMirror 6): farbige Java-Syntax, Vorschläge beim Tippen - * (Vorlagen für `if`, `for`, … mit Platzhaltern) und Markierungen, die `liveCodePanel` vorgibt. - */ - -export interface EditorMarks { - /** Graue Platzhalter-Wörter (Zeichenpositionen). */ - placeholders: { from: number; to: number }[] - /** Rote Wellenlinie: was noch fehlt oder zu viel ist. */ - problems: { from: number; to: number }[] - /** Zeilen des ausgewählten Elements (ab 0, einschließlich). */ - lines?: { from: number; to: number } - /** Debugger: Zeile, die als Nächstes ausgeführt wird (ab 0, gelb). */ - current?: number - /** Rote Zeilennummer: In dieser Zeile steckt ein Fehler (ab 0). */ - errorLines?: number[] - /** Glühbirne am Zeilenende: Ein Klick übernimmt den Vorschlag. */ - fixes?: QuickFix[] -} - -/** Vorschlag für einen Fehler: an `at` erscheint 💡, ein Klick ersetzt `from`–`to` durch `insert`. */ -export interface QuickFix { - at: number - title: string - from: number - to: number - insert: string -} - -/** Wörter der Vorlagen in der Sprache der Oberfläche. */ -export interface SnippetWords { - condition: string - selector: string - code: string - start: string - step: string - /** Erklärung je Vorlage, z. B. „Verzweigung“. */ - branch: string - branchElse: string - switchCase: string - forLoop: string - whileLoop: string - doLoop: string - output: string - input: string - /** VisuBot: `mb` → `mbot` anbieten. */ - robot?: boolean -} - -export interface JavaEditorHooks { - /** Getippter Text hat sich geändert. */ - onChange(): void - /** Cursor bewegt (ohne Textänderung). */ - onCaret(): void - /** ⌘Z / ⌘⇧Z: gilt für Code und Struktogramm gemeinsam. */ - onUndo(redo: boolean): void - words(): SnippetWords - /** Klick auf die Zeilennummer: Zeile für den Haltepunkt (Anfang des Elements) oder keine. */ - breakpointLine(line: number): number | undefined - /** Haltepunkte geändert. */ - onBreakpoints(): void - /** Eigene Klassen für Vorschläge nach dem Punkt (VisuObject); `pos` = Cursor. */ - ownTypes?(pos: number): OwnTypes | undefined - /** F2 bzw. Rechtsklick: Variable an `pos` umbenennen; `menu` = Stelle des Rechtsklicks. `true` = übernommen. */ - onRename?(pos: number, menu?: { x: number; y: number }): boolean -} - -/** Eigene Textänderungen (z. B. nach einer Änderung im Struktogramm) lösen kein `onChange` aus. */ -const fromOutside = Annotation.define() -const setMarks = StateEffect.define() - -const phMark = Decoration.mark({ class: 'cm-ph' }) -const errMark = Decoration.mark({ class: 'cm-err' }) -const currentLine = Decoration.line({ class: 'cm-debug-line' }) - -/** 💡 hinter der Zeile mit dem Fehler, wie die Glühbirne in Eclipse. */ -class QuickFixWidget extends WidgetType { - constructor(readonly fix: QuickFix) { - super() - } - eq(other: QuickFixWidget) { - return JSON.stringify(other.fix) === JSON.stringify(this.fix) - } - toDOM(view: EditorView) { - const button = document.createElement('button') - button.type = 'button' - button.className = 'cm-quickfix' - button.textContent = '💡' - button.dataset.tip = this.fix.title - button.setAttribute('aria-label', this.fix.title) - button.addEventListener('mousedown', (e) => e.preventDefault()) - button.addEventListener('click', () => { - const { from, to, insert } = this.fix - if (to > view.state.doc.length) return - view.dispatch({ changes: { from, to, insert }, selection: { anchor: from + insert.length }, userEvent: 'input' }) - view.focus() - }) - return button - } - ignoreEvent() { - return true - } -} - -interface MarkState { - marks: EditorMarks - decorations: DecorationSet -} - -function buildDecorations(state: EditorState, marks: EditorMarks): DecorationSet { - const len = state.doc.length - const ranges: { from: number; to: number; deco: Decoration }[] = [] - if (marks.current !== undefined && marks.current < state.doc.lines) { - ranges.push({ from: state.doc.line(marks.current + 1).from, to: state.doc.line(marks.current + 1).from, deco: currentLine }) - } - for (const p of marks.placeholders) if (p.to <= len && p.from < p.to) ranges.push({ from: p.from, to: p.to, deco: phMark }) - for (const p of marks.problems) { - const from = Math.min(p.from, len) - const to = Math.min(Math.max(p.to, from), len) - if (from < to) ranges.push({ from, to, deco: errMark }) - } - for (const f of marks.fixes ?? []) { - if (f.at <= len) ranges.push({ from: f.at, to: f.at, deco: Decoration.widget({ widget: new QuickFixWidget(f), side: 1 }) }) - } - // Zeilen-Dekorationen vor Markierungen an derselben Stelle. - const isLine = (d: Decoration) => d === currentLine - ranges.sort((a, b) => a.from - b.from || Number(isLine(b.deco)) - Number(isLine(a.deco)) || a.to - b.to) - const builder = new RangeSetBuilder() - for (const r of ranges) builder.add(r.from, r.to, r.deco) - return builder.finish() -} - -const marksField = StateField.define({ - create: () => ({ marks: { placeholders: [], problems: [] }, decorations: Decoration.none }), - update(value, tr) { - for (const e of tr.effects) if (e.is(setMarks)) return { marks: e.value, decorations: buildDecorations(tr.state, e.value) } - if (!tr.docChanged) return value - // Bis zur nächsten Auswertung mit dem Text mitwandern. - const map = (r: { from: number; to: number }) => ({ from: tr.changes.mapPos(r.from, 1), to: tr.changes.mapPos(r.to, -1) }) - const marks = { ...value.marks, placeholders: value.marks.placeholders.map(map).filter((r) => r.from < r.to), problems: [], errorLines: [], fixes: [] } - return { marks, decorations: buildDecorations(tr.state, marks) } - }, - provide: (f) => EditorView.decorations.from(f, (v) => v.decorations), -}) - -/** Rote Zeilennummer bei einem Fehler, wie in Xcode; anders als der runde Haltepunkt. */ -class ErrorLineMarker extends GutterMarker { - elementClass = 'cm-error-line' -} -const errorLineMarker = new ErrorLineMarker() -const errorLineGutter = gutterLineClass.compute([marksField], (state) => { - const lines = [...new Set(state.field(marksField).marks.errorLines ?? [])].filter((l) => l < state.doc.lines).sort((a, b) => a - b) - return RangeSet.of(lines.map((l) => errorLineMarker.range(state.doc.line(l + 1).from))) -}) - -// MARK: - Farbige Blöcke wie in BlueJ - -/** Art des Blocks → Farbe (`cm-scope-…` in styles.css). */ -const scopeKinds: Record = { - ClassDeclaration: 'class', - InterfaceDeclaration: 'class', - EnumDeclaration: 'class', - MethodDeclaration: 'method', - ConstructorDeclaration: 'method', - ForStatement: 'loop', - EnhancedForStatement: 'loop', - WhileStatement: 'loop', - DoStatement: 'loop', - IfStatement: 'if', - SwitchStatement: 'if', - TryStatement: 'try', -} - -/** - * Zeile der `}`, die den Block schließt, der in der Zeile von `pos` mit `{` beginnt. Bei Pseudocode - * (`while (Tee noch zu heiß) {`) bricht der Java-Parser den Block nach der ersten Zeile ab; so reicht der Kasten - * trotzdem bis zur schließenden Klammer wie im Struktogramm. - */ -function closingLine(doc: Text, pos: number): number { - const first = doc.lineAt(pos) - if (!first.text.trimEnd().endsWith('{')) return first.number - let depth = 0 - for (let n = first.number; n <= doc.lines; n++) { - for (const ch of doc.line(n).text.replace(/"(?:[^"\\]|\\.)*"|\/\/.*$/g, '')) { - if (ch === '{') depth++ - else if (ch === '}' && --depth === 0) return n - } - } - return first.number -} - -/** - * Jeder Block (Klasse, Methode, Schleife, Verzweigung …) bekommt einen eigenen Kasten, der bei seiner - * Einrückung beginnt; die Kästen liegen ineinander. Das ausgewählte Element bekommt einen Rahmen darüber. - */ -function scopeMarkers(view: EditorView): RectangleMarker[] { - const { state } = view - const doc = state.doc - const lineElt = view.contentDOM.querySelector('.cm-line') - if (!lineElt) return [] - const style = getComputedStyle(lineElt) - const scroller = view.scrollDOM.getBoundingClientRect() - const content = view.contentDOM.getBoundingClientRect() - const baseLeft = scroller.left - view.scrollDOM.scrollLeft - const baseTop = scroller.top - view.scrollDOM.scrollTop - const textLeft = content.left - baseLeft + parseFloat(style.paddingLeft) + parseFloat(style.borderLeftWidth) - const right = content.right - baseLeft - 6 - const top0 = view.documentTop - baseTop - const tabSize = state.tabSize - const charWidth = view.defaultCharacterWidth - const box = (className: string, fromLine: number, toLine: number, inset: number) => { - const first = doc.line(fromLine) - const col = countColumn(/^\s*/.exec(first.text)![0], tabSize) - const left = textLeft + col * charWidth - 7 - const top = view.lineBlockAt(first.from).top + top0 + inset - const bottom = view.lineBlockAt(doc.line(toLine).from).bottom + top0 - inset - return new RectangleMarker(className, left, top, Math.max(right - left, 20), Math.max(bottom - top, 4)) - } - const markers: RectangleMarker[] = [] - // Anweisungen ohne Klasse und Methode (Einstellung ohne `class`/`main`): ein gelber Kasten wie die Methode, - // damit sie wie die Anweisungen im Struktogramm aussehen. - const top = syntaxTree(state).topNode - const loose: { from: number; to: number }[] = [] - for (let c = top.firstChild; c; c = c.nextSibling) { - if (scopeKinds[c.name] === 'class' || c.name === 'MethodDeclaration') { - loose.length = 0 - break - } - if (c.name !== 'ImportDeclaration' && c.name !== 'PackageDeclaration' && !c.name.includes('Comment')) loose.push(c) - } - if (loose.length) markers.push(box('cm-scope cm-scope-method', doc.lineAt(loose[0].from).number, doc.lineAt(loose[loose.length - 1].to).number, 1)) - // Äußere Blöcke zuerst: Die inneren liegen darüber. - const blocks: { kind: string; from: number; to: number }[] = [] - syntaxTree(state).iterate({ - from: view.viewport.from, - to: view.viewport.to, - enter: (node) => { - const kind = scopeKinds[node.name] - if (!kind) return - // `else if` gehört zum Kasten des ersten `if`. - if (node.name === 'IfStatement' && node.node.parent?.name === 'IfStatement') return - const from = doc.lineAt(node.from).number - const to = Math.max(doc.lineAt(node.to).number, closingLine(doc, node.from)) - blocks.push({ kind, from, to }) - markers.push(box(`cm-scope cm-scope-${kind}`, from, to, 1)) - }, - }) - // Anweisungen in Schleifen und Verzweigungen bekommen wie im Struktogramm einen eigenen gelben Streifen. - for (let n = 1; n <= doc.lines; n++) { - let inner: { kind: string; from: number; to: number } | undefined - for (const b of blocks) if (b.from <= n && n <= b.to && (!inner || b.from >= inner.from)) inner = b - if (!inner || (inner.kind !== 'loop' && inner.kind !== 'if') || n === inner.from) continue - const text = doc.line(n).text.trim() - if (!text || text.startsWith('}') || text.endsWith('{') || text.startsWith('//') || text.startsWith('case ') || text.startsWith('default')) continue - markers.push(box('cm-scope cm-scope-method cm-scope-stmt', n, n, 2)) - } - const sel = state.field(marksField).marks.lines - if (sel && sel.from < doc.lines) markers.push(box('cm-scope cm-scope-sel', sel.from + 1, Math.min(sel.to + 1, doc.lines), 0)) - return markers -} - -const codeScopesKey = 'visustruct.code.scopes' - -/** Einstellung „Blöcke farbig“: ohne Speicher eingeschaltet. */ -export function codeScopes(): boolean { - try { - return localStorage.getItem(codeScopesKey) !== '0' - } catch { - return true - } -} - -/** Schaltet die farbigen Kästen in allen Code-Editoren um (der Rahmen der Auswahl bleibt). */ -export function setCodeScopes(on: boolean) { - try { - localStorage.setItem(codeScopesKey, on ? '1' : '0') - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } - document.documentElement.classList.toggle('no-code-scopes', !on) -} - -if (typeof document !== 'undefined') document.documentElement.classList.toggle('no-code-scopes', !codeScopes()) - -const scopeLayer = layer({ - above: false, - class: 'cm-scopeLayer', - markers: scopeMarkers, - update: (u) => - u.docChanged || - u.viewportChanged || - u.geometryChanged || - syntaxTree(u.state) !== syntaxTree(u.startState) || - u.transactions.some((t) => t.effects.some((e) => e.is(setMarks))), -}) - -// MARK: - Haltepunkte - -/** Roter Punkt vor der Zeilennummer: Hier hält „Ausführen“ an. */ -class BreakpointMarker extends GutterMarker { - toDOM() { - const dot = document.createElement('span') - dot.className = 'cm-breakpoint' - return dot - } -} -const breakpointMarker = new BreakpointMarker() -const toggleBreakpoint = StateEffect.define() -const resetBreakpoints = StateEffect.define() - -/** Haltepunkte als Positionen am Zeilenanfang: Sie wandern beim Tippen mit ihrer Zeile mit. */ -const breakpointsField = StateField.define>({ - create: () => RangeSet.empty, - update(set, tr) { - set = set.map(tr.changes) - for (const e of tr.effects) { - if (e.is(resetBreakpoints)) set = RangeSet.of(e.value.map((from) => breakpointMarker.range(from)), true) - if (!e.is(toggleBreakpoint)) continue - let has = false - set.between(e.value, e.value, () => { - has = true - }) - set = has ? set.update({ filter: (from) => from !== e.value }) : set.update({ add: [breakpointMarker.range(e.value)] }) - } - return set - }, -}) - -function breakpointGutter(hooks: JavaEditorHooks): Extension { - const toggle = (view: EditorView, block: BlockInfo) => { - const line = hooks.breakpointLine(view.state.doc.lineAt(block.from).number - 1) - if (line === undefined || line >= view.state.doc.lines) return false - view.dispatch({ effects: toggleBreakpoint.of(view.state.doc.line(line + 1).from) }) - queueMicrotask(() => hooks.onBreakpoints()) - return true - } - const handlers = { mousedown: toggle } - return [ - breakpointsField, - gutter({ - class: 'cm-breakpoint-gutter', - markers: (v) => v.state.field(breakpointsField), - initialSpacer: () => breakpointMarker, - domEventHandlers: handlers, - }), - lineNumbers({ domEventHandlers: handlers }), - ] -} - -/** Platzhalter am Cursor (auch direkt davor oder dahinter). */ -function placeholderAt(state: EditorState, pos: number) { - return state.field(marksField).marks.placeholders.find((p) => pos >= p.from && pos <= p.to) -} - -/** Wie in einem HTML-Formular: Wer in einen grauen Platzhalter tippt, ersetzt das ganze Wort. */ -const placeholderTyping = EditorView.inputHandler.of((view, from, to, text) => { - if (from !== to) return false - const ph = placeholderAt(view.state, from) - if (!ph) return false - view.dispatch({ changes: { from: ph.from, to: ph.to, insert: text }, selection: { anchor: ph.from + text.length }, userEvent: 'input.type' }) - return true -}) - -/** Einfügen und Hineinziehen ersetzen den Platzhalter genauso (sonst bleibt z. B. `// Dein Code` vor dem Text stehen). */ -const placeholderPaste = EditorState.transactionFilter.of((tr) => { - if (!tr.docChanged || !(tr.isUserEvent('input.paste') || tr.isUserEvent('input.drop'))) return tr - const changes: { from: number; to: number; text: string }[] = [] - tr.changes.iterChanges((from, to, _fromB, _toB, inserted) => changes.push({ from, to, text: inserted.toString() })) - if (changes.length !== 1 || changes[0].from !== changes[0].to) return tr - const ph = placeholderAt(tr.startState, changes[0].from) - if (!ph) return tr - const { text } = changes[0] - return { changes: { from: ph.from, to: ph.to, insert: text }, selection: { anchor: ph.from + text.length }, userEvent: 'input.paste', scrollIntoView: true } -}) - -const deletePlaceholder = (forward: boolean) => (view: EditorView) => { - const sel = view.state.selection.main - if (!sel.empty) return false - const ph = placeholderAt(view.state, sel.head) - if (!ph || (forward ? sel.head >= ph.to : sel.head <= ph.from)) return false - view.dispatch({ changes: { from: ph.from, to: ph.to }, selection: { anchor: ph.from }, userEvent: 'delete' }) - return true -} - -/** Klick mitten in einen Platzhalter wählt das ganze Wort aus. */ -const placeholderClick = EditorView.updateListener.of((u) => { - if (!u.selectionSet || u.docChanged || !u.transactions.some((t) => t.isUserEvent('select.pointer'))) return - const sel = u.state.selection.main - if (!sel.empty) return - const ph = u.state.field(marksField).marks.placeholders.find((p) => sel.head > p.from && sel.head < p.to) - // Nicht während der laufenden Aktualisierung neu auslösen. - if (ph) queueMicrotask(() => u.view.dispatch({ selection: EditorSelection.range(ph.from, ph.to) })) -}) - -const highlight = HighlightStyle.define([ - // Wie in Eclipse: int, boolean … sowie true, false und null sind Schlüsselwörter; Klassennamen bleiben schwarz. - { tag: [tags.keyword, tags.controlKeyword, tags.definitionKeyword, tags.modifier, tags.operatorKeyword, tags.standard(tags.typeName), tags.bool, tags.null], color: 'var(--syn-keyword)', fontWeight: '600' }, - { tag: [tags.string, tags.character], color: 'var(--syn-string)' }, - { tag: tags.number, color: 'var(--syn-number)' }, - { tag: [tags.lineComment, tags.blockComment], color: 'var(--syn-comment)', fontStyle: 'italic' }, -]) - -/** Vorlagen und Wörter für die Vorschläge. */ -export function completions(words: SnippetWords): Completion[] { - const w = words - // `${…}` = Feld zum Ausfüllen (Tab springt weiter); stehen gelassen bleibt es ein grauer Platzhalter. - const body = `\${// ${w.code}}` - const snippet = (label: string, template: string, detail: string, boost = 0) => - snippetCompletion(template, { label, detail, type: 'keyword', boost }) - return [ - snippet('if', `if (\${${w.condition}}) {\n\t${body}\n}`, w.branch, 2), - snippet('if … else', `if (\${${w.condition}}) {\n\t${body}\n} else {\n\t\${// ${w.code}}\n}`, w.branchElse, 1), - snippet('for', `for (int \${i} = \${0}; \${i} < \${10}; \${i}++) {\n\t${body}\n}`, w.forLoop, 2), - snippet('while', `while (\${${w.condition}}) {\n\t${body}\n}`, w.whileLoop, 2), - snippet('do … while', `do {\n\t${body}\n} while (\${${w.condition}});`, w.doLoop, 1), - snippet('switch', `switch (\${${w.selector}}) {\n\tcase \${1} -> {\n\t\t${body}\n\t}\n\tdefault -> {\n\t\t\${// ${w.code}}\n\t}\n}`, w.switchCase, 1), - snippet('System.out.println', 'System.out.println(${});', w.output, 3), - // Kürzel wie in Eclipse (`syso`, `sysout`) und IntelliJ/NetBeans (`sout`, `psvm`). - ...['syso', 'sysout', 'sout'].map((label) => snippet(label, 'System.out.println(${});', `System.out.println · ${w.output}`, 2)), - ...['main', 'psvm'].map((label) => snippet(label, `public static void main(String[] args) {\n\t${body}\n}`, 'public static void main(String[] args)', 2)), - scannerCompletion(w.input), - snippet('scanner.nextInt', 'int ${zahl} = scanner.nextInt();', w.input, 1), - snippet('scanner.next', 'String ${text} = scanner.next();', w.input), - snippet('scanner.nextDouble', 'double ${wert} = scanner.nextDouble();', w.input), - snippet('try … catch', `try {\n\t${body}\n} catch (\${Exception} e) {\n\t\${// ${w.code}}\n}`, 'try … catch', 1), - snippet('public class', `public class \${Main} {\n\t${body}\n}`, 'public class', -2), - // Bei `import` gleich die üblichen Zeilen anbieten. - ...['import java.util.Scanner;', 'import javax.swing.*;', 'import java.awt.*;', 'import java.awt.event.*;'].map((label, i) => - snippet(label, label, 'import', 1 - i), - ), - // Schlüsselwörter, auch für Klassen und Methoden (z. B. `pu` → public). - ...['int', 'double', 'String', 'boolean', 'char', 'long', 'final', 'break;', 'continue;', 'return', 'true', 'false', 'else', 'null', 'new', - 'public', 'private', 'static', 'void', 'class', 'extends', 'implements', 'interface', 'this'].map((label) => ({ - label, - type: 'keyword', - boost: -1, - })), - // `Scanner` allein nicht: dort steht die ganze Zeile (scannerCompletion) oben. - ...['Math', 'JFrame', 'JButton', 'JLabel', 'JTextField', 'ActionListener', 'ActionEvent', 'Color', 'FlowLayout', 'GridLayout', 'BorderLayout'].map((label) => ({ - label, - type: 'type', - boost: -2, - })), - // VisuBot: der Roboter heißt immer `mbot`; danach kommt mit `.` die Befehlsliste. - ...(w.robot ? [{ label: 'mbot', detail: 'mBot2', type: 'variable', boost: 3 }] : []), - ...['Math.random()', 'Math.abs(', 'Math.sqrt(', 'Math.max(', 'Math.min(', '.length()', '.equals('].map((label) => ({ label, type: 'function', boost: -2 })), - ] -} - -/** Fehlt `import java.util.Scanner;` (oder `java.util.*`), die Zeile dafür; sonst nichts. */ -export function scannerImport(text: string): ChangeSpec | undefined { - if (/^\s*import\s+java\.util\.(?:Scanner|\*)\s*;/m.test(text)) return undefined - // Hinter `package …;`, sonst ganz oben; vor anderen Imports ohne Leerzeile, vor dem Programm mit einer. - const pkg = /^\s*package\s+[\w.]+\s*;[^\n]*\n?/.exec(text) - const at = pkg ? pkg[0].length : 0 - const rest = text.slice(at).replace(/^\s*\n/, '') - return { from: at, insert: `import java.util.Scanner;\n${/^\s*import\b/.test(rest) ? '' : '\n'}` } -} - -/** - * `Scanner` → die ganze Zeile `Scanner scanner = new Scanner(System.in);` (Name wie in den Lektionen und im erzeugten Code, - * als Feld zum Überschreiben). Fehlt der Import, kommt er oben dazu. - */ -function scannerCompletion(input: string): Completion { - const line = snippetCompletion('Scanner ${scanner} = new Scanner(System.in);', { - label: 'Scanner scanner = new Scanner(System.in);', - detail: input, - type: 'keyword', - boost: 3, - }) - const insertLine = line.apply as (view: EditorView, completion: Completion, from: number, to: number) => void - return { - ...line, - apply(view, completion, from, to) { - const add = scannerImport(view.state.doc.toString()) - if (!add) return insertLine(view, completion, from, to) - const changes = view.state.changes(add) - view.dispatch({ changes, userEvent: 'input.complete' }) - insertLine(view, completion, changes.mapPos(from), changes.mapPos(to, 1)) - }, - } -} - -/** Vorschlag hinter dem Punkt: Methoden mit Klammern (Cursor dazwischen, wenn Werte nötig sind), Felder wie `length` ohne. */ -export function memberCompletion(member: JavaMember): Completion { - const label = member.kind === 'field' ? member.name : `${member.name}(${member.params ? '…' : ''})` - const completion: Completion = { - label, - detail: member.returns === 'void' || !member.returns ? member.description : member.description ? `${member.returns} · ${member.description}` : member.returns, - type: member.kind === 'field' ? 'property' : 'method', - } - if (member.kind === 'field') return { ...completion, apply: member.name } - return member.params ? snippetCompletion(`${member.name}(\${})`, completion) : { ...completion, apply: `${member.name}()` } -} - -function memberLanguage(): MemberLanguage { - const lang = currentLanguage() - return lang === 'de' ? 'de' : lang === 'pt-PT' ? 'pt' : 'en' -} - -/** Variablen aus dem eigenen Code: `int zahl = …`, `String[] namen`, Parameter. */ -function declaredNames(text: string): Completion[] { - const names = new Set() - for (const m of text.matchAll(/\b(?:int|long|double|float|boolean|char|String|Scanner)(?:\s*\[\s*\])*\s+([A-Za-z_]\w*)/g)) names.add(m[1]) - return [...names].map((label) => ({ label, type: 'variable', boost: 1 })) -} - -export class JavaEditor { - readonly view: EditorView - private readOnly = new Compartment() - - constructor(parent: HTMLElement, hooks: JavaEditorHooks, label: string) { - const source = (context: CompletionContext) => { - const word = context.matchBefore(/[\w.]+/) - if (!word || (word.from === word.to && !context.explicit)) return null - // In Zeichenketten und Kommentaren nichts vorschlagen. - const line = context.state.doc.lineAt(context.pos) - const before = line.text.slice(0, context.pos - line.from) - if (/\/\//.test(before) || (before.match(/"/g)?.length ?? 0) % 2 === 1) return null - // Hinter `variable.` die Methoden ihres Typs (aus der Deklaration im Code), z. B. `eingabe.` → nextInt(). - // Reihenfolge wie in der Liste (das Häufigste zuerst) statt alphabetisch. - const members = memberCompletionsAt(context.state.doc.toString(), context.pos, memberLanguage(), hooks.ownTypes?.(context.pos)) - if (members) return { from: members.from, options: members.members.map((m, i) => ({ ...memberCompletion(m), boost: 50 - i })), validFor: /^\w*$/ } - // Hinter `void` tippt man den Namen der Methode selbst: keine main-Vorlage anbieten. - const afterVoid = /\bvoid\s+[\w.]*$/.test(before) - const options = completions(hooks.words()).filter((c) => !(afterVoid && (c.label === 'main' || c.label === 'psvm'))) - return { - from: word.from, - options: [...options, ...declaredNames(context.state.doc.toString())], - // Ohne Punkt: beim Tippen von `.` neu fragen, damit die Methoden des Typs kommen. - validFor: /^\w*$/, - } - } - const extensions: Extension[] = [ - breakpointGutter(hooks), - highlightActiveLineGutter(), - java(), - syntaxHighlighting(highlight), - indentUnit.of(' '), - EditorState.tabSize.of(4), - indentOnInput(), - bracketMatching(), - closeBrackets(), - marksField, - errorLineGutter, - scopeLayer, - placeholderTyping, - placeholderPaste, - placeholderClick, - this.readOnly.of(EditorState.readOnly.of(false)), - autocompletion({ override: [source], icons: false }), - Prec.highest( - keymap.of([ - { key: 'Mod-z', run: () => (hooks.onUndo(false), true), preventDefault: true }, - { key: 'Mod-Shift-z', run: () => (hooks.onUndo(true), true), preventDefault: true }, - { key: 'Mod-y', run: () => (hooks.onUndo(true), true), preventDefault: true }, - { key: 'Backspace', run: deletePlaceholder(false) }, - { key: 'Delete', run: deletePlaceholder(true) }, - { key: 'F2', run: (view) => hooks.onRename?.(view.state.selection.main.head) ?? false, preventDefault: true }, - ]), - ), - keymap.of([...closeBracketsKeymap, ...completionKeymap, indentWithTab, ...defaultKeymap]), - EditorView.domEventHandlers({ - contextmenu: (e, view) => { - const pos = view.posAtCoords({ x: e.clientX, y: e.clientY }) - if (pos === null || !hooks.onRename?.(pos, { x: e.clientX, y: e.clientY })) return false - e.preventDefault() - return true - }, - }), - EditorView.contentAttributes.of({ 'aria-label': label, autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false' }), - EditorView.updateListener.of((u) => { - // Danach, denn die Rückmeldung zeichnet den Editor neu (Markierungen). - if (u.docChanged && !u.transactions.some((t) => t.annotation(fromOutside))) queueMicrotask(() => hooks.onChange()) - else if (u.selectionSet && !u.docChanged) queueMicrotask(() => hooks.onCaret()) - }), - ] - this.view = new EditorView({ parent, state: EditorState.create({ doc: '', extensions }) }) - } - - get text(): string { - return this.view.state.doc.toString() - } - - get caret(): number { - return this.view.state.selection.main.head - } - - get hasFocus(): boolean { - return this.view.hasFocus - } - - /** Zeilen mit Haltepunkt (ab 0). */ - get breakpoints(): Set { - const lines = new Set() - const doc = this.view.state.doc - this.view.state.field(breakpointsField).between(0, doc.length, (from) => { - lines.add(doc.lineAt(from).number - 1) - }) - return lines - } - - /** Haltepunkte einer anderen Datei zeigen (Zeilen ab 0). */ - setBreakpoints(lines: Iterable) { - const doc = this.view.state.doc - const from = [...new Set(lines)].filter((l) => l >= 0 && l < doc.lines).map((l) => doc.line(l + 1).from) - this.view.dispatch({ effects: resetBreakpoints.of(from) }) - } - - lineAt(offset: number): number { - return this.view.state.doc.lineAt(Math.min(offset, this.view.state.doc.length)).number - 1 - } - - /** Text von außen setzen (Struktogramm geändert, Rückgängig); der Cursor bleibt möglichst an seiner Stelle. */ - setText(text: string) { - const caret = Math.min(this.caret, text.length) - // Nur den geänderten Teil ersetzen: Haltepunkte davor und danach bleiben an ihrer Zeile. - const old = this.text - let start = 0 - while (start < old.length && start < text.length && old[start] === text[start]) start++ - let end = 0 - while (end < old.length - start && end < text.length - start && old[old.length - 1 - end] === text[text.length - 1 - end]) end++ - this.view.dispatch({ - changes: { from: start, to: old.length - end, insert: text.slice(start, text.length - end) }, - selection: { anchor: caret }, - annotations: fromOutside.of(true), - }) - } - - /** Umbenennen: alle Stellen in einem Schritt ersetzen (wie Tippen, das Struktogramm folgt). */ - replaceRanges(ranges: { from: number; to: number }[], insert: string) { - if (ranges.length === 0) return - this.view.dispatch({ changes: ranges.map((r) => ({ from: r.from, to: r.to, insert })), userEvent: 'input.rename' }) - } - - /** Knopf „Einrücken“: die markierten Zeilen, ohne Markierung den ganzen Code, erst formatieren, dann einrücken. */ - indent() { - const doc = this.view.state.doc - const sel = this.view.state.selection.main - const from = sel.empty ? 1 : doc.lineAt(sel.from).number - const to = sel.empty ? doc.lines : doc.lineAt(sel.to).number - // `}` auf eine eigene Zeile, Leerzeichen um Operatoren: nur Leerraum zwischen den Zeichen ändert sich. - const format = ChangeSet.of(formatJavaEdits(doc.toString(), from, to), doc.length) - const formatted = format.apply(doc) - const fromLine = formatted.lineAt(format.mapPos(doc.line(from).from, -1)).number - const toLine = formatted.lineAt(format.mapPos(doc.line(to).to, 1)).number - // Einrücken ändert nur die Leerzeichen am Zeilenanfang: Haltepunkte und Cursor bleiben in ihrer Zeile. - const changes: ChangeSpec[] = [] - indentJava(formatted.toString(), fromLine, toLine) - .split('\n') - .forEach((text, i) => { - const line = formatted.line(i + 1) - const old = /^\s*/.exec(line.text)![0] - const now = /^\s*/.exec(text)![0] - if (old !== now) changes.push({ from: line.from, to: line.from + old.length, insert: now }) - }) - const all = format.compose(ChangeSet.of(changes, formatted.length)) - if (!all.empty) this.view.dispatch({ changes: all, userEvent: 'input.indent' }) - this.view.focus() - } - - setMarks(marks: EditorMarks, scrollToSelection: boolean) { - const effects: StateEffect[] = [setMarks.of(marks)] - if (marks.current !== undefined && marks.current < this.view.state.doc.lines) { - effects.push(EditorView.scrollIntoView(this.view.state.doc.line(marks.current + 1).from, { y: 'nearest' })) - } else if (scrollToSelection && marks.lines && marks.lines.from < this.view.state.doc.lines) { - effects.push(EditorView.scrollIntoView(this.view.state.doc.line(marks.lines.from + 1).from, { y: 'nearest' })) - } - this.view.dispatch({ effects }) - } - - setReadOnly(readOnly: boolean) { - this.view.dispatch({ effects: this.readOnly.reconfigure(EditorState.readOnly.of(readOnly)) }) - } -} diff --git a/web/src/ui/javaRuntime.ts b/web/src/ui/javaRuntime.ts deleted file mode 100644 index 5b0dba01..00000000 --- a/web/src/ui/javaRuntime.ts +++ /dev/null @@ -1,298 +0,0 @@ -import { textFileEntries } from '../core/simulation' -/** - * Echtes Java (mit Swing) im Browser über CheerpJ (https://cheerpj.com), nur wenn im Zahnrad-Menü - * „„Echtes Java (mit Swing)““ an ist. Erst dann werden Laufzeit und Compiler geladen (einmalig, danach Browser-Cache). - * - * - Laufzeit: vom CDN des Herstellers (Community-Lizenz: kostenlos für Einzelne und Open Source, nur über dieses CDN). - * - Compiler: javac aus tools.jar (OpenJDK 8), aus dem JavaFiddle-Repo von Leaning Technologies (Apache-2.0). - * - Ausgaben von System.out landen in dem Element mit der id „console“ (so macht es CheerpJ). - */ - -const loaderURL = 'https://cjrtnc.leaningtech.com/4.3/loader.js' -const toolsURL = 'https://raw.githubusercontent.com/leaningtech/javafiddle/main/static/tools.jar' -const toolsJar = '/str/tools.jar' - -/** - * Startet die Programme der Schüler. Alle Läufe gehen über diese eine Klasse (als Bibliothek geladen), - * damit sie dieselben Fenster sehen: Ein eigener `cheerpjRunMain` pro Lauf sieht die Fenster des vorigen nicht. - */ -const runnerSource = `public class VisuStructRunner { - public static void mkdirs(String dir) { - new java.io.File(dir).mkdirs(); - } - - public static void copy(String from, String to) throws Exception { - java.nio.file.Files.copy(java.nio.file.Paths.get(from), java.nio.file.Paths.get(to), java.nio.file.StandardCopyOption.REPLACE_EXISTING); - } - - /** Namen der Dateien im Ordner, durch Zeilenumbrüche getrennt. */ - public static String list(String dir) { - String[] names = new java.io.File(dir).list(); - return names == null ? "" : String.join("\\n", names); - } - - /** Quelltext für javac schreiben (Ordner werden angelegt), z. B. ein Projekt mit Packages. */ - public static void write(String path, String text) throws Exception { - java.io.File f = new java.io.File(path); - f.getParentFile().mkdirs(); - java.nio.file.Files.write(f.toPath(), text.getBytes("UTF-8")); - } - - public static String read(String path) throws Exception { - return new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(path)), "UTF-8"); - } - - public static void closeAll() { - for (java.awt.Window w : java.awt.Window.getWindows()) w.dispose(); - } - - public static int openWindows() { - // Erst die Ereignisschlange abarbeiten lassen: main öffnet Fenster meist per invokeLater. - try { - javax.swing.SwingUtilities.invokeAndWait(() -> {}); - } catch (Exception e) { - } - int n = 0; - for (java.awt.Window w : java.awt.Window.getWindows()) if (w.isShowing()) n++; - return n; - } - - public static void run(String dir, String name) { - closeAll(); - try { - java.net.URLClassLoader loader = new java.net.URLClassLoader(new java.net.URL[] { new java.io.File(dir).toURI().toURL() }); - loader.loadClass(name).getMethod("main", String[].class).invoke(null, (Object) new String[0]); - } catch (java.lang.reflect.InvocationTargetException e) { - e.getCause().printStackTrace(); - } catch (NoSuchMethodException e) { - System.err.println("Die Klasse " + name + " hat keine Methode public static void main(String[] args)."); - } catch (Exception e) { - e.printStackTrace(); - } - } -} -` - -interface Runner { - mkdirs(dir: string): Promise - copy(from: string, to: string): Promise - list(dir: string): Promise - read(path: string): Promise - write(path: string, text: string): Promise - closeAll(): Promise - openWindows(): Promise - run(dir: string, name: string): Promise -} - -declare global { - function cheerpjInit(options?: object): Promise - function cheerpjCreateDisplay(width: number, height: number, parent?: HTMLElement): HTMLElement - function cheerpjRunMain(className: string, classPath: string, ...args: string[]): Promise - function cheerpjRunLibrary(classPath: string): Promise>> - function cheerpOSAddStringFile(path: string, data: string | Uint8Array): void -} - -let ready: Promise | undefined -let run = 0 - -function loadScript(src: string): Promise { - return new Promise((resolve, reject) => { - const script = document.createElement('script') - script.src = src - script.onload = () => resolve() - script.onerror = () => reject(new Error(src)) - document.head.append(script) - }) -} - -/** Laufzeit und Compiler laden; `display`: Fläche für die Swing-Fenster. Mehrfach aufrufbar. */ -export function prepareJava(display: HTMLElement): Promise { - ready ??= (async () => { - await loadScript(loaderURL) - await cheerpjInit({ status: 'none' }) - cheerpjCreateDisplay(-1, -1, display) - const response = await fetch(toolsURL) - if (!response.ok) throw new Error(toolsURL) - cheerpOSAddStringFile(toolsJar, new Uint8Array(await response.arrayBuffer())) - cheerpOSAddStringFile('/str/VisuStructRunner.java', runnerSource) - if ((await cheerpjRunMain('com.sun.tools.javac.Main', toolsJar, '/str/VisuStructRunner.java', '-d', '/files/')) !== 0) { - throw new Error('javac') - } - const lib = await cheerpjRunLibrary('/files/') - return (await lib.VisuStructRunner) as Runner - })() - ready.catch(() => (ready = undefined)) - return ready -} - -/** Name der Klasse, die gestartet wird: die öffentliche, sonst die erste. */ -export function mainClassName(source: string): string { - const m = source.match(/public\s+(?:final\s+)?class\s+(\w+)/) ?? source.match(/\bclass\s+(\w+)/) - return m ? m[1] : 'Main' -} - -/** Liest oder schreibt der Code Dateien? */ -export function usesFiles(source: string): boolean { - return /\bFiles\s*\.\s*\w+\s*\(|\bnew\s+(?:File|FileReader|FileWriter|PrintWriter|BufferedReader)\s*\(/.test(source) -} - -/** Dateinamen wie `"liste.txt"` im Code: Sie zeigen im Browser in den Ordner `dir`. */ -export function filesInto(source: string, dir: string): string { - return source.replace(/"([\w.-]+\.(?:txt|csv|json))"/g, `"${dir}$1"`) -} - -/** Der Compiler hier ist javac 8: `Files.readString` und `Files.writeString` (ab Java 11) werden umgeschrieben. */ -export function java8Files(source: string): string { - source = source.replace( - /\bFiles\s*\.\s*readString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g, - 'new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get($1)), "UTF-8")', - ) - const write = /\bFiles\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,/g - let out = '' - let last = 0 - for (let m = write.exec(source); m; m = write.exec(source)) { - // Das zweite Argument reicht bis zur schließenden Klammer von `writeString(`. - let depth = 1 - let i = m.index + m[0].length - let quote = false - for (; i < source.length && depth > 0; i++) { - const c = source[i] - if (quote) { - if (c === '\\') i++ - else if (c === '"') quote = false - } else if (c === '"') quote = true - else if (c === '(') depth++ - else if (c === ')') depth-- - } - if (depth > 0) break - const text = source.slice(m.index + m[0].length, i - 1).trim() - out += source.slice(last, m.index) + `java.nio.file.Files.write(java.nio.file.Paths.get(${m[1]}), (${text}).getBytes("UTF-8"))` - last = i - write.lastIndex = i - } - return out + source.slice(last) -} - -/** Code ohne Klasse (Snippet oder nur Methoden) in eine Klasse mit main packen. */ -export function asProgram(source: string): string { - if (/\bclass\s+\w+/.test(source)) return source - // Getippte Imports gehören vor die Klasse, nicht in `main`. - const own: string[] = [] - source = source.replace(/^[ \t]*import\s+[\w.]+(?:\.\*)?\s*;[ \t]*$/gm, (line) => (own.push(line.trim()), '')) - const imports = [...own, 'import java.util.*;', 'import java.awt.*;', 'import java.awt.event.*;', 'import javax.swing.*;'].join('\n') + '\n\n' - if (/\bstatic\s+void\s+main\s*\(/.test(source)) return `${imports}public class Main {\n${source}\n}\n` - // Dateien lesen und schreiben kann eine IOException werfen; ohne `throws` meldet javac einen Fehler. - const throwsClause = usesFiles(source) ? ' throws Exception' : '' - return `${imports}public class Main {\n public static void main(String[] args)${throwsClause} {\n${source}\n }\n}\n` -} - -/** Fenster des vorigen Laufs schließen. */ -export async function closeWindows() { - if (ready) await (await ready).closeAll() -} - -/** Geschrieben hat das Programm, was neu ist oder sich geändert hat. */ -async function writtenFiles(runner: Runner, data: string, before: Map): Promise> { - const written = new Map() - for (const file of (await runner.list(data)).split('\n').filter(Boolean)) { - const content = await runner.read(data + file) - if (before.get(file) !== content) written.set(file, content) - } - return written -} - -/** - * Ein Swing-Programm läuft nach main weiter und speichert vielleicht erst beim Klick. Solange seine Fenster offen sind - * und kein neuer Lauf beginnt, meldet `onChange` jede Datei, die danach neu gespeichert wird. Liefert die Funktion zum Beenden. - */ -export function watchWrittenFiles(shown: Map, onChange: (files: Map) => void): () => void { - const mine = run - const data = `/files/run${mine}/data/` - const before = new Map([...textFileEntries(), ...shown]) - let stopped = false - const tick = async () => { - if (stopped || run !== mine || !ready) return - try { - const runner = await ready - const changed = await writtenFiles(runner, data, before) - for (const [file, content] of changed) before.set(file, content) - if (changed.size) onChange(changed) - if ((await runner.openWindows()) === 0) return - } catch { - return - } - timer = window.setTimeout(tick, 1500) - } - let timer = window.setTimeout(tick, 1500) - return () => { - stopped = true - window.clearTimeout(timer) - } -} - -export type RunResult = { result: 'compile-error' | 'windows' | 'finished'; files: Map } - -/** - * Kompilieren und starten. `compile-error`: javac meldet Fehler (die stehen dann in der Konsole). - * Sonst nach dem Ende von main: `windows`, wenn noch Fenster offen sind (das Programm läuft weiter), oder `finished`. - */ -export async function compileAndRun(source: string, onCompiled: () => void): Promise { - const runner = await ready! - // Jeder Lauf in ein eigenes Verzeichnis mit eigenem Klassenlader, damit nichts vom vorigen Lauf übrig bleibt. - const dir = `/files/run${++run}/` - await runner.mkdirs(dir) - // Die Textdateien der Lektionen kommen in einen beschreibbaren Ordner des Laufs; `"brief.txt"` im Code zeigt dorthin. - const data = `${dir}data/` - const files = new Map(textFileEntries()) - await runner.mkdirs(data) - for (const [file, content] of files) { - cheerpOSAddStringFile(`/str/${file}`, content) - await runner.copy(`/str/${file}`, data + file) - } - const program = asProgram(java8Files(filesInto(source, data))) - const name = mainClassName(program) - cheerpOSAddStringFile(`/str/${name}.java`, program) - if ((await cheerpjRunMain('com.sun.tools.javac.Main', toolsJar, `/str/${name}.java`, '-d', dir, '-encoding', 'UTF-8')) !== 0) { - return { result: 'compile-error', files: new Map() } - } - // Die Fensterfläche muss vor dem Start sichtbar sein: Bei 0×0 Pixeln zeichnet Swing nichts. - onCompiled() - await runner.run(dir, name) - const written = await writtenFiles(runner, data, files) - if ((await runner.openWindows()) > 0) return { result: 'windows', files: written } - await new Promise((resolve) => setTimeout(resolve, 500)) - return { result: (await runner.openWindows()) > 0 ? 'windows' : 'finished', files: written } -} - -/** Eine Java-Datei eines Projekts (VisuObject): `pkg` wie in `package …;`, leer = Standard-Package. */ -export interface JavaSource { - pkg: string - name: string - text: string -} - -/** - * Projekt mit mehreren Klassen und Packages übersetzen und `main` der Klasse `mainClass` - * (voller Name, z. B. `spiel.Spielstarter`) starten. Rückgabe wie bei `compileAndRun`. - */ -export async function compileAndRunProject(files: JavaSource[], mainClass: string, onCompiled: () => void): Promise { - const runner = await ready! - const dir = `/files/run${++run}/` - const src = `${dir}src/` - const paths: string[] = [] - for (const f of files) { - const path = `${src}${f.pkg ? f.pkg.replace(/\./g, '/') + '/' : ''}${f.name}.java` - await runner.write(path, java8Files(f.text)) - paths.push(path) - } - const out = `${dir}classes/` - await runner.mkdirs(out) - if ((await cheerpjRunMain('com.sun.tools.javac.Main', toolsJar, ...paths, '-d', out, '-encoding', 'UTF-8')) !== 0) { - return { result: 'compile-error', files: new Map() } - } - onCompiled() - await runner.run(out, mainClass) - if ((await runner.openWindows()) > 0) return { result: 'windows', files: new Map() } - await new Promise((resolve) => setTimeout(resolve, 500)) - return { result: (await runner.openWindows()) > 0 ? 'windows' : 'finished', files: new Map() } -} diff --git a/web/src/ui/learnPanel.ts b/web/src/ui/learnPanel.ts deleted file mode 100644 index e7e99668..00000000 --- a/web/src/ui/learnPanel.ts +++ /dev/null @@ -1,1075 +0,0 @@ -import { checkExercise, fileLines, loopDepth, onlyLineBreaksMissing, usedElementTypes, type TestOutcome } from '../core/exerciseCheck' -import { compressDrive } from '../core/mbot' -import { isPlaceholderElement } from '../core/editing' -import { ElementType, makeElement, type VSDocument } from '../core/model' -import type { SubprogramResolver } from '../core/simulation' -import { decodeDocument } from '../core/xmlCodec' -import { explain, makeRound, usedValues, type BoolGame } from '../learn/boolGame' -import { contentLanguageFor, diagram, showingBlockLessons, glossary, image, lessons, reference, tasks, useContentLanguage, world } from '../learn/content' -import { exerciseArea, type Block, type ChecklistItem, type Exercise, type Lesson, type QuizQuestion, type Task } from '../learn/lessonFormat' -import { inline, markdownToHTML } from '../learn/markdown' -import ludwigURL from './ludwig.webp' -import { progress, type Rating } from '../learn/progress' -import { isTeacher, lockTeacher, unlockTeacher } from '../learn/teacher' -import { currentLanguage, t } from './i18n' -import { noticeText } from './simulationPanel' -import { renderCaesarDisc } from './caesarDisc' -import { renderRobotModel, renderRobotQuiz, wireRobotLinks } from './visubotModel' -import { renderRoundGame } from './roundGameView' -import { renderCrosswordGame, renderRescueGame } from './rescueGameView' -import { renderDriveGame } from './driveGameView' -import { renderCloze } from './clozeView' -import { renderPap } from './papView' -import { textFileView } from './textFileView' -import { attachPointers, attachTermTips, markPointers, markTerms, pointsIntoEditor, pointsIntoFiles, pointsIntoLiveCode, pointsIntoPalette, type UiArea } from './termTips' - -/** - * Lernbereich neben dem Editor (Vorbild: PicoJavaGoat): Lektionen in kurzen Schritten mit Übungen, - * Checkliste und Wissenstest, dazu Aufgaben und Nachschlagen. Übungen prüft die Simulation. - */ - -export interface LearnHost { - /** Übung im Editor öffnen (vorhandenen Reiter wählen oder neuen anlegen). */ - openExercise(exercise: Exercise, doc: VSDocument): void - /** Java-Beispiel aus dem Text in einem neuen Reiter öffnen, Spalte „Code“ auf Java. */ - openJavaCode(java: string): void - /** Beispieldiagramm in einem neuen Reiter öffnen. */ - openDiagram(doc: VSDocument, fileName: string): void - /** Diagramm des Reiters, in dem die Übung offen ist. */ - exerciseDocument(id: string): VSDocument | undefined - /** Unterprogramme für Aufrufe in der Übung: die anderen offenen Reiter. */ - subprogramsFor(id: string): SubprogramResolver - /** Eingeklappte Struktogramm-Spalte wieder zeigen. */ - showEditor(): void - /** Spalte „Code“ öffnen. */ - showLiveCode(): void - /** Spalte „Code“ auf Java öffnen (der Struktogramm-Editor bleibt, wie er ist). */ - showJava(): void - /** Spalte Dateien öffnen (die anderen Spalten bleiben, wie sie sind). */ - showFiles(): void - /** Eingeklappte Bereiche für einen Zeiger im Text öffnen; zurück kommt, wie man genau diese wieder einklappt. */ - reveal(areas: UiArea[]): () => void - /** Simulation beenden, damit man nach dem Prüfen gleich korrigieren kann. */ - stopSimulation(): void - /** Reiter einer Übung auf den Startzustand setzen (falls offen). */ - resetExercise(id: string, doc: VSDocument): void - preview(doc: VSDocument): SVGSVGElement | undefined - /** Lernbereich zur schmalen Leiste einklappen. */ - collapse(): void -} - -/** Seitenleisten-Symbol wie in Finder, Mail und Safari (kein ✕: Einklappen ist kein Schließen). */ -export const sidebarIcon = - '' - -type TabName = 'lessons' | 'tasks' | 'reference' - -const sections = (): { name: string; lessons: Lesson[] }[] => { - const out: { name: string; lessons: Lesson[] }[] = [] - for (const l of lessons) { - const last = out.at(-1) - if (last && last.name === l.section) last.lessons.push(l) - else out.push({ name: l.section, lessons: [l] }) - } - return out -} - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function html(tag: string, attrs: Record, markup: string): HTMLElement { - const e = h(tag, attrs) - e.innerHTML = markup - return e -} - -const typeName = (type: ElementType) => t(`element_${ElementType[type]}`) - -function emptyDocument(title: string): VSDocument { - return { caption: title, elements: [makeElement(ElementType.anweisung, { textLines: ['ø'] })] } -} - -export function startDocument(ex: Exercise): VSDocument { - const start = ex.start ? diagram(ex.start) : undefined - return start ? { ...start, caption: start.caption || ex.title } : emptyDocument(ex.title) -} - -export class LearnPanel { - readonly element: HTMLElement - private tab: TabName = 'lessons' - /** Wohin „Zurück zur Checkliste“ nach dem Nachlesen führt. */ - private returnTo?: { lesson: string; step: number; scroll: number } - private lessonId?: string - private taskId?: string - private body!: HTMLElement - private tips: { hide(): void } - private pointers: { off(): void } - - constructor(private host: LearnHost) { - this.element = h('aside', { class: 'learn', 'aria-label': t('web_learn_title') }) - this.tips = attachTermTips(this.element) - this.pointers = attachPointers(this.element, (areas) => this.host.reveal(areas)) - useContentLanguage(contentLanguageFor(currentLanguage())) - this.restore() - } - - /** Zuletzt geöffnete Ansicht aus dem Lernstand übernehmen und neu zeichnen, z. B. nach dem Einlesen der Datei. */ - restore() { - const view = progress.view() - if (view) { - this.tab = (['lessons', 'tasks', 'reference'] as const).find((x) => x === view.tab) ?? 'lessons' - this.lessonId = lessons.some((l) => l.id === view.lesson) ? view.lesson : undefined - this.taskId = tasks.some((x) => x.id === view.task) ? view.task : undefined - } - this.render() - } - - /** Neu aufbauen (z. B. nach einem Sprachwechsel). */ - render() { - this.tips.hide() - this.pointers.off() - useContentLanguage(contentLanguageFor(currentLanguage())) - const tabs = h('div', { class: 'segmented learn-tabs', role: 'tablist' }) - for (const [name, label] of [ - ['lessons', t('web_learn_lessons')], - ['tasks', t('web_learn_tasks')], - ['reference', t('web_learn_reference')], - ] as const) { - const b = h('button', { role: 'tab', 'aria-pressed': String(this.tab === name), 'data-learn-tab': name }, label) - b.addEventListener('click', () => { - if (this.tab === name) { - // Zweiter Klick: zurück zur Übersicht - if (name === 'lessons') this.lessonId = undefined - if (name === 'tasks') this.taskId = undefined - } - this.tab = name - this.persist() - this.render() - }) - tabs.append(b) - } - const hide = html('button', { class: 'learn-hide', title: t('web_learn_hide'), 'aria-label': t('web_learn_hide') }, sidebarIcon) - hide.addEventListener('click', () => this.host.collapse()) - const head = h('div', { class: 'learn-head' }, tabs, hide) - this.body = h('div', { class: 'learn-body' }) - this.element.replaceChildren(head, this.body) - if (this.tab === 'lessons') { - const lesson = lessons.find((l) => l.id === this.lessonId) - if (lesson) this.renderLesson(lesson) - else this.renderLessonList() - } else if (this.tab === 'tasks') { - const task = tasks.find((x) => x.id === this.taskId) - if (task) this.renderTask(task) - else this.renderTaskList() - } else { - const terms = glossary.map((e) => `- **${e.term}:** ${e.text}`).join('\n') - const text = html('div', { class: 'learn-text learn-reference' }, markdownToHTML(`${reference}\n\n## ${t('web_learn_terms')}\n\n${terms}`)) - this.body.append(text) - this.foldReference(text) - } - } - - /** Nachschlagen: jede Kategorie (## Überschrift) als aufklappbarer Abschnitt; offene Kategorien merkt sich der Browser. */ - private foldReference(root: HTMLElement) { - const key = 'visustruct.reference.open' - let open: string[] = [] - try { - open = JSON.parse(localStorage.getItem(key) ?? '[]') - } catch { - /* ohne Speicher alles zu */ - } - for (const heading of [...root.querySelectorAll('h2')]) { - const title = heading.textContent ?? '' - const details = h('details', { class: 'reference-group' }) as HTMLDetailsElement - details.open = open.includes(title) - const summary = h('summary', {}, title) - heading.replaceWith(details) - details.append(summary) - while (details.nextSibling && details.nextSibling.nodeName !== 'H2') details.append(details.nextSibling) - details.addEventListener('toggle', () => { - open = details.open ? [...new Set([...open, title])] : open.filter((x) => x !== title) - try { - localStorage.setItem(key, JSON.stringify(open)) - } catch { - /* nur für diese Sitzung */ - } - }) - } - } - - /** Reiter „Nachschlagen“ zeigen, z. B. vom Knopf in „Code“ aus. */ - showReference() { - this.tab = 'reference' - this.persist() - this.render() - } - - private persist() { - progress.setView({ tab: this.tab, lesson: this.lessonId, task: this.taskId }) - } - - /** Eine Lektion öffnen, z. B. aus einem Verweis der anderen Welt (`?visustruct&lektion=…`); unbekannte Kennungen bleiben unbeachtet. */ - showLesson(id: string) { - if (lessons.some((l) => l.id === id)) this.openLesson(id) - } - - private openLesson(id: string | undefined) { - this.tab = 'lessons' - this.lessonId = id - this.returnTo = undefined - this.persist() - this.render() - this.body.scrollTop = 0 - } - - // MARK: - Lektionen - - private renderLessonList() { - this.body.append(h('p', { class: 'hint' }, t('web_learn_intro'))) - for (const section of sections()) { - this.body.append(h('h3', { class: 'learn-section' }, section.name)) - const list = h('ol', { class: 'learn-list' }) - for (const l of section.lessons) { - const p = progress.lesson(l.id) - const status = p.done ? '✓' : p.step > 0 ? t('web_learn_step_of_fmt', p.step + 1, l.steps.length) : '' - const item = h( - 'button', - { class: 'learn-item' + (p.done ? ' done' : ''), 'data-lesson': l.id }, - h('span', { class: 'learn-num' }, String(l.number)), - h('span', { class: 'learn-item-text' }, h('strong', {}, l.robot ? `🤖 ${l.title}` : l.title), h('small', {}, l.summary)), - h('span', { class: 'learn-status' }, status), - ) - item.addEventListener('click', () => this.openLesson(l.id)) - list.append(h('li', {}, item)) - } - this.body.append(list) - } - this.body.append(this.renderTeacherBox()) - } - - private renderLesson(lesson: Lesson) { - const p = progress.lesson(lesson.id) - const index = Math.min(p.step, lesson.steps.length - 1) - const step = lesson.steps[index] - - const back = h('button', { class: 'learn-back' }, `← ${t('web_learn_all_lessons')}`) - back.addEventListener('click', () => this.openLesson(undefined)) - const bar = h('nav', { class: 'learn-progress', 'aria-label': t('web_learn_step_of_fmt', index + 1, lesson.steps.length) }) - bar.append( - ...lesson.steps.map((s, i) => { - const where = t('web_learn_step_fmt', i + 1, s.title) - const state = i < index ? 'past' : i === index ? 'current' : '' - // 🤖-Schritte (VisuBot im Kurs) türkis wie der mBot2 - const b = h('button', { class: s.title.startsWith('🤖') ? `${state} robot-step` : state, title: where, 'aria-label': where }, String(i + 1)) - if (i === index) b.setAttribute('aria-current', 'step') - b.addEventListener('click', () => this.goToStep(lesson, i)) - return b - }), - ) - // Kopf mit Zurück/Weiter bleibt oben stehen, nur der Inhalt darunter scrollt. - this.body.append( - h( - 'div', - { class: 'learn-lesson-head' }, - h('div', { class: 'learn-head-row' }, back, this.stepNav(lesson, index, p.done, 'learn-nav learn-nav-top')), - h('p', { class: 'learn-kicker' }, `${t('web_learn_lesson_fmt', lesson.number)} · ${lesson.section}${lesson.robot ? ' · 🤖 VisuBot' : ''}`), - // Dieselbe Nummer wie in der Liste, gut sichtbar neben dem Titel. - h('h2', { class: 'learn-title' }, h('span', { class: 'learn-num', 'aria-hidden': 'true' }, String(lesson.number)), lesson.title), - bar, - h('h3', { class: 'learn-step-title' }, `${index + 1}. ${step.title}`), - ), - ) - const ret = this.returnTo?.lesson === lesson.id && this.returnTo.step !== index ? this.returnTo : undefined - const backToChecklist = () => { - const b = h('button', { class: 'learn-return' }, `↩ ${t('web_learn_back_to_checklist')}`) - b.addEventListener('click', () => { - this.returnTo = undefined - this.goToStep(lesson, ret!.step) - this.body.scrollTop = ret!.scroll - }) - return b - } - if (ret) this.body.append(backToChecklist()) - step.blocks.forEach((block, bi) => this.body.append(this.renderBlock(block, `${index}-${bi}`, lesson))) - markPointers(this.body) - wireRobotLinks(this.body) - this.openNeededColumns(step.blocks) - markTerms(this.body, glossary) - - this.body.append(this.stepNav(lesson, index, p.done, 'learn-nav')) - if (ret) this.body.append(backToChecklist()) - } - - /** Zurück/Weiter (im letzten Schritt „Fertig“): oben im Kopf und unten nach dem Text. */ - private stepNav(lesson: Lesson, index: number, done: boolean | undefined, class_: string) { - const nav = h('div', { class: class_ }) - const prev = h('button', {}, `← ${t('web_learn_back')}`) as HTMLButtonElement - prev.disabled = index === 0 - prev.addEventListener('click', () => this.goToStep(lesson, index - 1)) - nav.append(prev) - if (index < lesson.steps.length - 1) { - const next = h('button', { class: 'primary' }, `${t('web_learn_next')} →`) - next.addEventListener('click', () => this.goToStep(lesson, index + 1)) - nav.append(next) - } else { - const finish = h('button', { class: 'primary' }, done ? `✓ ${t('web_learn_done')}` : t('web_learn_finish')) - finish.addEventListener('click', () => { - progress.updateLesson(lesson.id, { done: true }) - const following = lessons.find((l) => l.number === lesson.number + 1) - this.openLesson(following?.id) - }) - nav.append(finish) - } - return nav - } - - private goToStep(lesson: Lesson, step: number) { - progress.updateLesson(lesson.id, { step }) - this.render() - this.body.scrollTop = 0 - } - - // MARK: - Aufgaben - - /** Ein Schritt oder eine Aufgabe öffnet die Spalten, die sie gerade braucht. */ - private openNeededColumns(blocks: Block[]) { - const exercises = blocks.flatMap((b) => (b.kind === 'exercise' ? [b.exercise] : [])) - // Erklärt der Text Bereiche des Editors (z. B. Lektion 2), muss der Editor zu sehen sein. - if (pointsIntoEditor(this.body)) { - this.host.showEditor() - // Zeigt der Text auf die Elemente, dürfen sie nicht eingeklappt sein. - if (pointsIntoPalette(this.body)) this.host.reveal(['palette']) - } - // Geht es um die Spalte Dateien (Lektion 3), öffnet sie sich. - else if (pointsIntoFiles(this.body)) this.host.showFiles() - // Eine Struktogramm-Übung braucht den Struktogramm-Editor. - else if (exercises.some((ex) => ex.code !== 'java')) this.host.showEditor() - // Java (Beispiel als ```java oder Übung mit `code: java`) braucht die Spalte „Code“. - else if (exercises.length > 0 || this.body.querySelector('.lesson-code[data-lang=java]')) this.host.showJava() - // Dasselbe für Ausführen, Konsole und Einzelschritt in der Spalte „Code“. - if (pointsIntoLiveCode(this.body)) this.host.showLiveCode() - } - - private renderTaskList() { - this.body.append(h('p', { class: 'hint' }, t('web_learn_tasks_intro'))) - const list = h('ul', { class: 'learn-list' }) - for (const task of tasks) { - // Aufgaben ohne geprüfte Übung (z. B. Swing) gelten nie als erledigt. - const exercises = this.taskExercises(task) - const done = exercises.length > 0 && exercises.every((ex) => progress.exercise(ex.id).done) - const after = lessons.find((l) => l.number === task.after) - const item = h( - 'button', - { class: 'learn-item' + (done ? ' done' : ''), 'data-task': task.id }, - h('span', { class: 'learn-num', 'aria-label': t('web_learn_level_fmt', task.level) }, '★'.repeat(task.level)), - h( - 'span', - { class: 'learn-item-text' }, - h('strong', {}, task.title), - h('small', {}, after ? t('web_learn_after_fmt', after.number, after.title) : ''), - ), - h('span', { class: 'learn-status' }, done ? '✓' : ''), - ) - item.addEventListener('click', () => { - this.taskId = task.id - this.persist() - this.render() - this.body.scrollTop = 0 - }) - list.append(h('li', {}, item)) - } - this.body.append(list, this.renderTeacherBox()) - } - - /** Lehrkräfte schalten mit dem Lehrercode die Musterlösungen frei. */ - private renderTeacherBox(): HTMLElement { - const box = h('details', { class: 'learn-teacher' }, h('summary', {}, t('web_learn_teacher'))) - if (isTeacher()) { - box.setAttribute('open', '') - const off = h('button', {}, t('web_learn_teacher_off')) - off.addEventListener('click', () => { - lockTeacher() - this.render() - }) - box.append(h('p', {}, t('web_learn_teacher_on')), off) - return box - } - const input = h('input', { type: 'password', autocomplete: 'off', 'aria-label': t('web_learn_teacher_code'), placeholder: t('web_learn_teacher_code') }) as HTMLInputElement - const status = h('p', { class: 'learn-result', role: 'status' }) - const form = h('form', { class: 'group' }, input, h('button', { type: 'submit' }, t('web_learn_teacher_unlock'))) - form.addEventListener('submit', async (e) => { - e.preventDefault() - if (await unlockTeacher(input.value)) this.render() - else { - status.className = 'learn-result info' - status.textContent = t('web_learn_teacher_wrong') - } - }) - box.append(h('p', { class: 'hint' }, t('web_learn_teacher_intro')), form, status) - return box - } - - private taskExercises(task: Task): Exercise[] { - return task.blocks.flatMap((b) => (b.kind === 'exercise' ? [b.exercise] : [])) - } - - private renderTask(task: Task) { - const back = h('button', { class: 'learn-back' }, `← ${t('web_learn_all_tasks')}`) - back.addEventListener('click', () => { - this.taskId = undefined - this.persist() - this.render() - }) - const after = lessons.find((l) => l.number === task.after) - this.body.append(back, h('h2', { class: 'learn-title' }, task.title)) - if (after) { - const link = h('button', { class: 'link-button' }, t('web_learn_after_fmt', after.number, after.title)) - link.addEventListener('click', () => this.openLesson(after.id)) - this.body.append(h('p', { class: 'learn-kicker' }, link)) - } - task.blocks.forEach((block, i) => this.body.append(this.renderBlock(block, `task-${i}`))) - markPointers(this.body) - this.openNeededColumns(task.blocks) - markTerms(this.body, glossary) - } - - // MARK: - Blöcke - - private renderBlock(block: Block, key: string, lesson?: Lesson): HTMLElement { - switch (block.kind) { - case 'markdown': - return this.withOpenButtons(html('div', { class: 'learn-text' }, markdownToHTML(block.text))) - case 'diagram': - return this.renderDiagram(block.file, block.caption) - case 'exercise': - return this.renderExercise(block.exercise) - case 'competences': - return this.renderCompetences(block.items) - case 'checklist': - return this.renderChecklist(block.items, key, lesson) - case 'quiz': - return this.renderQuiz(block.questions, key, lesson) - case 'brag': - return this.renderBrag(block.text, block.tip) - case 'images': - return this.renderImages(block.files, block.caption) - case 'graphic': - return block.animated ? this.renderAnimation(block.file, block.caption) : this.renderGraphic(block.file, block.caption, block.labeled) - case 'game': - return this.renderGame(block.game) - case 'roundGame': - return renderRoundGame(block.game, ludwigURL, showingBlockLessons()) - case 'rescueGame': - return renderRescueGame(block.game, ludwigURL) - case 'driveGame': - return renderDriveGame(block.game, ludwigURL, showingBlockLessons()) - case 'crosswordGame': - return renderCrosswordGame(block.game, ludwigURL) - case 'caesar': - return renderCaesarDisc(block.key, block.text) - case 'cloze': - return renderCloze(block.cloze) - case 'pap': - return renderPap(block.pap) - case 'textFile': - return textFileView(block.name, block.content) - case 'robotModel': - return renderRobotModel(block.focus, block.view, block.spin) - case 'robotQuiz': - return renderRobotQuiz(block.tasks, block.done) - } - } - - /** Ludwig der Geißbock erzählt etwas zum Angeben oder gibt einen Tipp. */ - private renderBrag(text: string, tip = false): HTMLElement { - const box = h('aside', { class: 'learn-brag' }) - box.append(h('img', { src: ludwigURL, alt: '', width: '48', height: '48' })) - const body = h('div', {}, h('p', { class: 'learn-brag-title' }, t(tip ? 'web_learn_ludwig_tip' : 'web_learn_brag'))) - body.append(html('div', { class: 'learn-text' }, markdownToHTML(text))) - box.append(body) - return box - } - - /** Spiel „Wahr oder falsch?“: zehn Runden, die Bedingungen werden schwerer. */ - private renderGame(game: BoolGame): HTMLElement { - const rounds = 10 - const box = h('section', { class: 'learn-game' }) - const head = h('div', { class: 'learn-game-head' }) - head.append(h('img', { src: ludwigURL, alt: '', width: '40', height: '40' }), h('strong', {}, t('web_game_title'))) - const status = h('p', { class: 'learn-game-status' }) - const stage = h('div', { class: 'learn-game-stage' }) - box.append(head, status, stage) - let index = 0 - let score = 0 - - const showRound = () => { - const round = makeRound(game, index, rounds) - status.textContent = `${t('web_game_round_fmt', index + 1, rounds)} · ${t('web_game_score_fmt', score)}` - const values = h('div', { class: 'learn-game-values mono' }) - for (const [name, value] of usedValues(round)) values.append(h('code', {}, `${name} = ${value}`)) - const answers = h('div', { class: 'group learn-game-answers' }) - const yes = h('button', { class: 'learn-game-true' }, `✓ ${t('web_game_true')}`) as HTMLButtonElement - const no = h('button', { class: 'learn-game-false' }, `✗ ${t('web_game_false')}`) as HTMLButtonElement - answers.append(yes, no) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const answer = (guess: boolean) => { - yes.disabled = no.disabled = true - const right = guess === round.answer - if (right) score++ - status.textContent = `${t('web_game_round_fmt', index + 1, rounds)} · ${t('web_game_score_fmt', score)}` - feedback.className = `learn-game-feedback ${right ? 'right' : 'wrong'}` - const steps = h('div', { class: 'learn-game-steps mono' }) - explain(round.condition, round.values).forEach((s, i) => steps.append(h('div', {}, `${i ? '→ ' : ''}${s}`))) - const next = h('button', { class: 'primary' }, index + 1 < rounds ? t('web_game_next') : t('web_game_finish')) - next.addEventListener('click', () => { - index++ - if (index < rounds) showRound() - else showEnd() - }) - feedback.replaceChildren(h('p', {}, right ? t('web_game_right') : t('web_game_wrong')), steps, next) - next.focus() - } - yes.addEventListener('click', () => answer(true)) - no.addEventListener('click', () => answer(false)) - stage.replaceChildren(values, h('div', { class: 'learn-game-condition mono' }, round.condition), answers, feedback) - } - const showEnd = () => { - status.textContent = '' - const again = h('button', { class: 'primary' }, t('web_game_again')) - again.addEventListener('click', () => { - index = score = 0 - showRound() - }) - stage.replaceChildren( - h('p', { class: 'learn-game-result' }, t('web_game_done_fmt', score, rounds)), - h('p', {}, t(score === rounds ? 'web_game_perfect' : score >= rounds * 0.7 ? 'web_game_good' : 'web_game_practice')), - again, - ) - } - const start = h('button', { class: 'primary' }, t('web_game_start')) - start.addEventListener('click', showRound) - stage.append(h('p', {}, t('web_game_intro')), start) - return box - } - - private renderImages(files: string[], caption: string): HTMLElement { - const figure = h('figure', { class: 'learn-figure' }) - const row = h('div', { class: 'learn-images' }) - for (const f of files) { - const src = image(f) - if (src) row.append(h('img', { src, alt: '', loading: 'lazy' })) - } - figure.append(row) - if (caption) figure.append(html('figcaption', {}, inline(caption))) - return figure - } - - /** Erklärgrafik in voller Breite (meist SVG aus `lessons/bilder`). */ - private renderGraphic(file: string, caption: string, labeled?: string): HTMLElement { - const figure = h('figure', { class: 'learn-figure' }) - const src = image(file) - const labeledSrc = labeled ? image(labeled) : undefined - if (src && labeledSrc) { - // Ein Klick blendet die Beschriftung ein und wieder aus. - const img = h('img', { class: 'learn-graphic', src, alt: '', loading: 'lazy' }) as HTMLImageElement - const toggle = h('button', { class: 'learn-graphic-toggle', type: 'button', title: t('web_learn_graphic_labels'), 'aria-pressed': 'false' }, img) - toggle.addEventListener('click', () => { - const on = toggle.getAttribute('aria-pressed') !== 'true' - toggle.setAttribute('aria-pressed', String(on)) - img.src = on ? labeledSrc : src - }) - figure.append(toggle, h('p', { class: 'learn-graphic-hint' }, t('web_learn_graphic_labels'))) - } else if (src) figure.append(h('img', { class: 'learn-graphic', src, alt: '', loading: 'lazy' })) - if (caption) figure.append(html('figcaption', {}, inline(caption))) - return figure - } - - /** Animierte Erklärgrafik: Das SVG kommt direkt in die Seite, damit sich die CSS-Animation neu starten lässt. - * Sie startet, sobald die Grafik zu sehen ist; „Noch einmal abspielen“ spielt sie von vorn. - * Die SVGs stammen aus `lessons/bilder` und benennen ihre Klassen mit eigenem Präfix (z. B. `fz-`). - * Abspielen heißt: Klasse `play` am Wurzelelement, also z. B. `fz-play` bei `class="fz-svg"`. */ - private renderAnimation(file: string, caption: string): HTMLElement { - const figure = h('figure', { class: 'learn-figure' }) - const src = image(file) - if (!src) return figure - const stage = h('div', { class: 'learn-graphic learn-animation' }) - const replay = h('button', { class: 'learn-replay', type: 'button' }, `↻ ${t('web_learn_replay')}`) - let play = () => {} - fetch(src) - .then((r) => r.text()) - .then((text) => { - stage.innerHTML = text - const svg = stage.querySelector('svg') - const root = svg?.getAttribute('class')?.match(/(\S+-)svg\b/)?.[1] - if (!svg || !root) return - play = () => { - svg.classList.remove(`${root}play`) - void svg.getBoundingClientRect() - svg.classList.add(`${root}play`) - } - if (typeof IntersectionObserver === 'undefined') return play() - const seen = new IntersectionObserver((entries) => { - if (!entries.some((e) => e.isIntersecting)) return - seen.disconnect() - play() - }, { threshold: 0.6 }) - seen.observe(stage) - }) - .catch(() => stage.append(h('img', { src, alt: '' }))) - replay.addEventListener('click', () => play()) - figure.append(stage, replay) - if (caption) figure.append(html('figcaption', {}, inline(caption))) - return figure - } - - /** Unter jedes Java-Beispiel mit ```java editor kommt „Im Editor öffnen“. */ - private withOpenButtons(text: HTMLElement): HTMLElement { - for (const pre of text.querySelectorAll('pre.lesson-code[data-open=editor]')) { - const code = pre.textContent ?? '' - const open = h('button', { class: 'learn-open-code' }, t('web_learn_open_in_editor')) - open.addEventListener('click', () => this.host.openJavaCode(code)) - pre.after(open) - } - return text - } - - private renderDiagram(file: string, caption: string): HTMLElement { - const doc = diagram(file) - const figure = h('figure', { class: 'learn-figure' }) - if (!doc) return figure - const svg = this.host.preview(doc) - if (svg) figure.append(h('div', { class: 'learn-preview', dir: 'ltr' }, svg)) - if (caption) figure.append(html('figcaption', {}, inline(caption))) - const open = h('button', {}, t('web_learn_open_in_editor')) - open.addEventListener('click', () => this.host.openDiagram(doc, file)) - figure.append(open) - return figure - } - - private renderExercise(ex: Exercise): HTMLElement { - const card = h('section', { class: 'learn-exercise', 'data-exercise': ex.id }) - const state = () => progress.exercise(ex.id) - const badge = h('span', { class: 'learn-badge' }, `✓ ${t('web_learn_solved')}`) - badge.hidden = !state().done - card.append( - h('h4', {}, `${t('web_learn_exercise')}: ${ex.title}`, badge), - solveWhere(ex), - html('div', { class: 'learn-text' }, markdownToHTML(ex.task)), - ) - - const result = h('div', { class: 'learn-result', role: 'status' }) - // Tipps nacheinander aufdecken, vom allgemeinen zum genauen. Die Lösung gibt es nur im Lehrermodus. - const hints = h('div', { class: 'learn-hints' }) - - const actions = h('div', { class: 'group' }) - const open = h('button', { class: 'primary' }, t('web_learn_open_exercise')) - open.addEventListener('click', () => { - const saved = state().xml - let doc = startDocument(ex) - if (saved) { - try { - doc = decodeDocument(saved) - } catch { - /* gespeicherter Stand unlesbar: von vorn */ - } - } - this.host.openExercise(ex, doc) - }) - const check = h('button', {}, t('web_learn_check')) - check.addEventListener('click', () => { - const doc = this.host.exerciseDocument(ex.id) - if (!doc) { - result.className = 'learn-result info' - result.textContent = t('web_learn_open_first') - return - } - if (doc.elements.every(isPlaceholderElement)) { - result.className = 'learn-result info' - result.textContent = t('web_learn_empty') - return - } - this.host.stopSimulation() - const outcomes = checkExercise(doc, ex.tests, this.host.subprogramsFor(ex.id), world) - const used = usedElementTypes(doc) - const missing = ex.requires - .map((r) => (r === 'forZaehlSchleife' ? 'forSchleife' : r)) - .filter((r) => r in ElementType && !used.has(ElementType[r as keyof typeof ElementType])) - const tooFlat = ex.loopDepth !== undefined && loopDepth(doc.elements) < ex.loopDepth ? ex.loopDepth : undefined - const passed = outcomes.every((o) => o.passed) && missing.length === 0 && !tooFlat - this.showResult(result, outcomes, missing, passed, tooFlat) - if (passed) { - progress.updateExercise(ex.id, { done: true }) - badge.hidden = false - } - }) - actions.append(open, check) - if (ex.hints.length > 0) { - const tip = h('button', {}, t('web_learn_hint')) - tip.addEventListener('click', () => { - const shown = hints.children.length - if (shown >= ex.hints.length) return - const label = ex.hints.length > 1 ? `**${t('web_learn_hint_fmt', shown + 1, ex.hints.length)}:** ` : '' - hints.append(html('aside', { class: 'lesson-note' }, markdownToHTML(label + ex.hints[shown]))) - tip.textContent = t('web_learn_hint_more') - tip.toggleAttribute('disabled', shown + 1 >= ex.hints.length) - }) - actions.append(tip) - } - const reset = h('button', { class: 'danger-text' }, t('web_learn_reset')) - reset.addEventListener('click', () => { - if (reset.dataset.confirm !== '1') { - reset.dataset.confirm = '1' - reset.textContent = t('web_learn_reset_confirm') - setTimeout(() => { - reset.dataset.confirm = '' - reset.textContent = t('web_learn_reset') - }, 4000) - return - } - progress.resetExercise(ex.id) - this.host.resetExercise(ex.id, startDocument(ex)) - badge.hidden = true - result.replaceChildren() - result.className = 'learn-result' - reset.dataset.confirm = '' - reset.textContent = t('web_learn_reset') - }) - actions.append(reset) - card.append(actions, hints, result) - - if (isTeacher() && ex.solution) { - const solution = diagram(ex.solution) - if (solution) { - const details = h('details', { class: 'learn-solution' }, h('summary', {}, t('web_learn_solution'))) as HTMLDetailsElement - details.addEventListener('toggle', () => { - if (!details.open || details.querySelector('.learn-preview')) return - const svg = this.host.preview(solution) - if (svg) details.append(h('div', { class: 'learn-preview', dir: 'ltr' }, svg)) - const openSolution = h('button', {}, t('web_learn_open_in_editor')) - openSolution.addEventListener('click', () => { - this.host.openDiagram(solution, ex.solution!) - for (const file of ex.subprograms) { - const sub = diagram(file) - if (sub) this.host.openDiagram(sub, file) - } - }) - for (const file of ex.subprograms) { - const sub = diagram(file) - const subSvg = sub && this.host.preview(sub) - if (subSvg) details.append(h('div', { class: 'learn-preview', dir: 'ltr' }, subSvg)) - } - details.append(openSolution) - }) - card.append(details) - } - } - return card - } - - private showResult(box: HTMLElement, outcomes: TestOutcome[], missing: string[], passed: boolean, depth?: number) { - box.className = 'learn-result ' + (passed ? 'ok' : 'fail') - box.replaceChildren(h('p', { class: 'learn-result-head' }, passed ? `🎉 ${t('web_learn_passed')}` : t('web_learn_failed'))) - for (const m of missing) box.append(h('p', {}, `✗ ${t('web_learn_missing_fmt', typeName(ElementType[m as keyof typeof ElementType]))}`)) - if (depth) box.append(h('p', {}, `✗ ${t('web_visubot_depth_fmt', depth)}`)) - const list = h('ul', { class: 'learn-tests', dir: 'auto' }) - for (const o of outcomes) { - const worldIndex = o.test.world ? outcomes.filter((x) => x.test.world).indexOf(o) + 1 : 0 - const input = o.test.world - ? `🗺 ${t('web_visubot_world_fmt', worldIndex)}` - : o.test.actions - ? `🤖 ${t('web_visubot_actions')}` - : o.test.sensors - ? `🎛 ${Object.entries(o.test.sensors).map(([name, values]) => `mbot.${name}() = ${values.join(' → ')}`).join(', ')}` - : o.test.drive - ? `🤖 ${t('web_visubot_drive')}` - : o.test.inputs.length ? t('web_learn_input_fmt', o.test.inputs.join(', ')) : t('web_learn_no_input') - const lines: (string | Node)[] = [`${o.passed ? '✓' : '✗'} ${input}`] - const detail = h('div', { class: 'learn-test-detail' }) - if (o.test.drive) { - detail.append( - h('span', {}, `${t('web_learn_expected')}: `, h('code', {}, compressDrive(o.test.drive) || '–')), - h('span', {}, `${t('web_learn_actual')}: `, h('code', {}, compressDrive(o.result.drive ?? []) || '–')), - ) - } - if (o.test.actions) { - detail.append( - h('span', {}, `${t('web_learn_expected')}: `, h('code', {}, compressDrive(o.test.actions) || '–')), - h('span', {}, `${t('web_learn_actual')}: `, h('code', {}, compressDrive(o.result.actions ?? []) || '–')), - ) - } - if (o.test.led !== undefined) { - const led = (on: boolean | undefined) => t(on ? 'web_visubot_led_on' : 'web_visubot_led_off') - detail.append(h('span', {}, `💡 ${t('web_learn_expected')}: ${led(o.test.led)} · ${t('web_learn_actual')}: ${led(o.result.led)}`)) - } - if (o.test.tone !== undefined) { - const tone = (on: boolean | undefined) => t(on ? 'web_visubot_tone_yes' : 'web_visubot_tone_no') - detail.append(h('span', {}, `🔊 ${t('web_learn_expected')}: ${tone(o.test.tone)} · ${t('web_learn_actual')}: ${tone(o.result.tone)}`)) - } - if (o.test.screen !== undefined) - detail.append(h('span', {}, `📺 ${t('web_learn_expected')}: `, h('code', {}, o.test.screen), ` · ${t('web_learn_actual')}: `, h('code', {}, o.result.screen ?? '–'))) - if (o.test.world) { - if (world(o.test.world)?.goals?.length || world(o.test.world)?.targets?.length) - detail.append(h('span', {}, o.result.atGoal ? `✓ ${t('web_visubot_goal_reached')}` : `✗ ${t('web_visubot_goal_missed')}`)) - if (o.result.bumps) detail.append(h('span', { class: 'learn-error' }, `⚠︎ ${t('web_visubot_bumps')}: ${o.result.bumps}`)) - } - if ((!o.test.drive && !o.test.world && !o.test.sensors && !o.test.actions) || o.result.outputs.length) detail.append( - h('span', {}, `${t('web_learn_expected')}: `, h('code', {}, o.test.expected.join(' | ') || '–')), - h('span', {}, `${t('web_learn_actual')}: `, h('code', {}, o.result.outputs.join(' | ') || '–')), - ) - for (const f of o.test.files ?? []) { - detail.append( - h('span', {}, `📄 ${f.name}, ${t('web_learn_expected')}: `, h('code', {}, f.lines.join(' | ') || '–')), - h('span', {}, `📄 ${f.name}, ${t('web_learn_actual')}: `, h('code', {}, fileLines(o.result.files?.get(f.name)).join(' | ') || '–')), - ) - } - if (!o.passed && !o.result.error && onlyLineBreaksMissing(o.result.outputs, o.test.expected)) - detail.append(h('span', { class: 'learn-error' }, t('web_learn_missing_line_break'))) - if (o.result.error) detail.append(h('span', { class: 'learn-error' }, noticeText(o.result.error))) - if (o.result.missingInput) detail.append(h('span', { class: 'learn-error' }, t('web_learn_missing_input'))) - if (o.result.tooManySteps) detail.append(h('span', { class: 'learn-error' }, t('web_learn_too_many_steps'))) - if (!o.passed && o.result.unusedInputs) detail.append(h('span', { class: 'learn-error' }, t('web_learn_unused_input'))) - list.append(h('li', { class: o.passed ? 'ok' : 'fail' }, ...lines, detail)) - } - box.append(list) - } - - private renderCompetences(items: string[]): HTMLElement { - // Steht als eigener erster Schritt „Diese Kompetenzen erwerbe ich jetzt“; der Kasten braucht keine eigene Überschrift. - const box = h('aside', { class: 'learn-competences' }, h('p', { class: 'learn-competences-title' }, t('web_learn_competences_intro'))) - const list = h('ul', {}) - for (const item of items) list.append(html('li', {}, inline(item))) - box.append(list) - return box - } - - /** „Ich kann …“ mit Selbsteinschätzung rechts daneben: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. */ - private renderChecklist(items: ChecklistItem[], key: string, lesson?: Lesson): HTMLElement { - const ratings: { value: Rating; icon: string; label: string }[] = [ - { value: 'umbrella', icon: '☂️', label: t('web_learn_rating_umbrella') }, - { value: 'cloud', icon: '⛅', label: t('web_learn_rating_cloud') }, - { value: 'sun', icon: '☀️', label: t('web_learn_rating_sun') }, - ] - const wrap = h('div', { class: 'learn-checklist-wrap' }) - const legend = h('p', { class: 'learn-rating-legend' }) - for (const r of ratings) legend.append(h('span', {}, `${r.icon} ${r.label}`)) - const box = h('ul', { class: 'learn-checklist' }) - wrap.append(legend, box) - items.forEach((item, i) => { - const id = `${key}-${i}` - const stored = lesson ? progress.lesson(lesson.id).checks?.[id] : undefined - let current: Rating | undefined = stored === true ? 'sun' : stored || undefined - const text = html('span', { class: 'learn-check-text' }, inline(item.text)) - const group = h('span', { class: 'learn-rating', role: 'group', 'aria-label': text.textContent ?? '' }) - const buttons = ratings.map((r) => { - const b = h('button', { class: 'learn-rating-button', title: r.label, 'aria-label': r.label }, r.icon) - b.addEventListener('click', () => { - current = current === r.value ? undefined : r.value - show() - if (!lesson) return - const checks = { ...(progress.lesson(lesson.id).checks ?? {}) } - if (current) checks[id] = current - else delete checks[id] - progress.updateLesson(lesson.id, { checks: Object.keys(checks).length ? checks : undefined }) - }) - return b - }) - const show = () => { - buttons.forEach((b, bi) => b.setAttribute('aria-pressed', String(ratings[bi].value === current))) - li.dataset.rating = current ?? '' - } - group.append(...buttons) - const li = h('li', {}, text, group) - if (lesson && item.step !== undefined) { - const step = item.step - const where = t('web_learn_step_fmt', step + 1, lesson.steps[step].title) - const link = h('button', { class: 'link-button learn-check-link', title: where, 'aria-label': `${t('web_learn_review')}: ${where}` }, t('web_learn_review')) - link.addEventListener('click', () => { - this.returnTo = { lesson: lesson.id, step: progress.lesson(lesson.id).step, scroll: this.body.scrollTop } - this.goToStep(lesson, step) - }) - li.append(link) - } - show() - box.append(li) - }) - return wrap - } - - private renderQuiz(questions: QuizQuestion[], key: string, lesson?: Lesson): HTMLElement { - const box = h('div', { class: 'learn-quiz' }) - const score = h('p', { class: 'learn-score', role: 'status' }) - const answers = () => (lesson ? progress.lesson(lesson.id).quiz ?? {} : {}) - const review = h('div', { class: 'learn-review' }) - const updateScore = () => { - const a = answers() - const chosen = (q: QuizQuestion, qi: number) => - q.pairs ? q.pairs.every((_, pi) => a[`${key}-${qi}-${pi}`] !== undefined) : a[`${key}-${qi}`] !== undefined - const correct = (q: QuizQuestion, qi: number) => - !!(q.pairs ? q.pairs.every((_, pi) => matchOrder(q)[a[`${key}-${qi}-${pi}`]] === q.pairs![pi].right) : q.options[a[`${key}-${qi}`]]?.correct) - const answered = questions.filter(chosen).length - const right = questions.filter(correct).length - const complete = answered === questions.length - score.textContent = complete ? t('web_learn_score_fmt', right, questions.length) : '' - review.replaceChildren() - if (complete && lesson) this.fillChecklistReview(review, lesson, questions, (qi) => correct(questions[qi], qi)) - } - questions.forEach((q, qi) => { - const id = `${key}-${qi}` - const fieldset = h('fieldset', {}, html('legend', {}, inline(q.question))) - const explanation = html('p', { class: 'learn-explanation' }, inline(q.explanation ?? '')) - if (q.pairs) { - fieldset.append(this.renderMatch(q, id, answers, lesson, explanation, updateScore), explanation) - box.append(fieldset) - return - } - const showAnswer = (chosen: number | undefined) => { - fieldset.querySelectorAll('button').forEach((b, oi) => { - b.classList.toggle('right', chosen !== undefined && q.options[oi].correct) - b.classList.toggle('wrong', chosen === oi && !q.options[oi].correct) - b.setAttribute('aria-pressed', String(chosen === oi)) - }) - explanation.hidden = chosen === undefined || !q.explanation - } - q.options.forEach((o, oi) => { - const b = html('button', { class: 'learn-option' }, inline(o.text)) - b.addEventListener('click', () => { - if (lesson) progress.updateLesson(lesson.id, { quiz: { ...answers(), [id]: oi } }) - showAnswer(oi) - updateScore() - }) - fieldset.append(b) - }) - fieldset.append(explanation) - showAnswer(answers()[id]) - box.append(fieldset) - }) - box.append(score, review) - updateScore() - return box - } - - /** - * Nach dem Wissenstest die Checkliste noch einmal zeigen, mit Abweichungen: ☀️ gewählt, aber eine Frage zu diesem - * Schritt falsch, oder ⛅/☂️ gewählt und alle Fragen dazu richtig. Fragen verweisen mit `→ Schritt` auf den Schritt. - */ - private fillChecklistReview(box: HTMLElement, lesson: Lesson, questions: QuizQuestion[], correct: (qi: number) => boolean) { - const icons: Record = { sun: '☀️', cloud: '⛅', umbrella: '☂️' } - const checks = progress.lesson(lesson.id).checks ?? {} - const rows: HTMLElement[] = [] - let deviations = 0 - lesson.steps.forEach((step, si) => - step.blocks.forEach((block, bi) => { - if (block.kind !== 'checklist') return - block.items.forEach((item, i) => { - const stored = checks[`${si}-${bi}-${i}`] - const rating: Rating | undefined = stored === true ? 'sun' : stored || undefined - const linked = item.step === undefined ? [] : questions.map((q, qi) => (q.step === item.step ? qi : -1)).filter((qi) => qi >= 0) - const wrong = linked.filter((qi) => !correct(qi)) - let note = '' - if (rating === 'sun' && wrong.length) note = t('web_learn_review_overrated_fmt', wrong.map((qi) => qi + 1).join(', ')) - else if (rating && rating !== 'sun' && linked.length && !wrong.length) note = t('web_learn_review_underrated') - if (note) deviations++ - const li = h('li', { class: note ? 'learn-review-deviation' : '' }) - const text = html('span', { class: 'learn-check-text' }, inline(item.text)) - if (note) text.append(h('br', {}), h('em', {}, note)) - li.append(text, h('span', { class: 'learn-review-icon', 'aria-label': rating ? t(`web_learn_rating_${rating}`) : t('web_learn_review_unrated') }, rating ? icons[rating] : '–')) - if (note && rating === 'sun' && item.step !== undefined) { - const target = item.step - const link = h('button', { class: 'link-button learn-check-link' }, t('web_learn_review')) - link.addEventListener('click', () => { - this.returnTo = { lesson: lesson.id, step: progress.lesson(lesson.id).step, scroll: this.body.scrollTop } - this.goToStep(lesson, target) - }) - li.append(link) - } - rows.push(li) - }) - }), - ) - if (!rows.length) return - box.append( - h('p', { class: 'learn-review-title' }, `📋 ${t('web_learn_review_title')}`), - h('p', {}, deviations ? t('web_learn_review_hint') : t('web_learn_review_match')), - h('ul', { class: 'learn-checklist' }, ...rows), - ) - } - - /** Zuordnung: neben jedem linken Begriff eine Auswahl mit allen rechten Begriffen. */ - private renderMatch( - q: QuizQuestion, - id: string, - answers: () => Record, - lesson: Lesson | undefined, - explanation: HTMLElement, - updateScore: () => void, - ): HTMLElement { - const pairs = q.pairs! - const order = matchOrder(q) - const grid = h('div', { class: 'learn-match' }) - // Ohne Lektion (Aufgaben) merkt sich die Zuordnung ihre Antworten nur, solange sie angezeigt wird. - let local: Record = {} - const read = () => (lesson ? answers() : local) - const write = (next: Record) => (lesson ? progress.updateLesson(lesson.id, { quiz: next }) : (local = next)) - const value = (pi: number) => read()[`${id}-${pi}`] - const selects = pairs.map((p) => { - const select = h('select', { class: 'learn-match-select' }) as HTMLSelectElement - select.append(h('option', { value: '' }, '–')) - order.forEach((text, oi) => select.append(h('option', { value: String(oi) }, text))) - const label = html('label', { class: 'learn-match-left' }, inline(p.left)) - label.append(select) - grid.append(label) - return select - }) - const show = () => { - const complete = pairs.every((_, pi) => value(pi) !== undefined) - selects.forEach((select, pi) => { - const v = value(pi) - select.value = v === undefined ? '' : String(v) - select.classList.toggle('right', complete && order[v] === pairs[pi].right) - select.classList.toggle('wrong', complete && order[v] !== pairs[pi].right) - }) - explanation.hidden = !complete || !q.explanation - } - selects.forEach((select, pi) => - select.addEventListener('change', () => { - const next = { ...read() } - if (select.value === '') delete next[`${id}-${pi}`] - else next[`${id}-${pi}`] = Number(select.value) - write(next) - show() - updateScore() - }), - ) - show() - return grid - } -} - -/** Rechte Seiten einer Zuordnung in fester, alphabetischer Reihenfolge, damit die Auswahl nichts verrät. */ -function matchOrder(q: QuizQuestion): string[] { - return (q.pairs ?? []).map((p) => p.right).sort((a, b) => a.localeCompare(b, 'de')) -} - -/** - * Schild „Löse diese Übung im Struktogramm/im Code“. Die Bereichsnamen sind die Überschriften auf dem Bildschirm - * und stehen in der Farbe ihres Bereichs (Struktogramm grün, Code violett). - */ -function solveWhere(ex: Exercise): HTMLElement { - const area = exerciseArea(ex) - const key = area === 'beide' ? 'web_learn_solve_in_both' : area === 'code' ? 'web_learn_solve_in_code' : 'web_learn_solve_in_editor' - const names = { editor: t('web_editor_title'), code: t('web_live_title') } - const args = area === 'beide' ? ['\u0001editor', '\u0001code'] : [area === 'code' ? '\u0001code' : '\u0001editor'] - const p = h('p', { class: `learn-where learn-where-${area}` }) - for (const part of t(key, ...args).split(/(\u0001(?:editor|code))/)) { - if (part === '\u0001editor' || part === '\u0001code') { - const which = part.slice(1) as 'editor' | 'code' - p.append(h('span', { class: `area-name area-${which}` }, names[which])) - } else if (part) p.append(part) - } - return p -} - diff --git a/web/src/ui/liveCodePanel.ts b/web/src/ui/liveCodePanel.ts deleted file mode 100644 index f80bf046..00000000 --- a/web/src/ui/liveCodePanel.ts +++ /dev/null @@ -1,1023 +0,0 @@ -import { t } from './i18n' -import { - generateLiveCode, - livePlaceholderEnd, - livePlaceholderStart, - type LiveLabels, - type LiveSpan, - type LiveTarget, -} from '../core/codeGenerator' -import { parseLiveJava, type JavaProblem, type ParsedJava } from '../core/javaParser' -import { documentFromJava, liveJava, mergeLiveJava, plainLiveJava, type JavaForm } from '../core/liveSource' -import type { VSDocument } from '../core/model' -import { describeValue, SimulationEngine, type SimStep, type SubprogramResolver } from '../core/simulation' -import { gridTable, noticeText, type ConsoleTranscript } from './simulationPanel' -import { JavaEditor, type QuickFix, type SnippetWords } from './javaEditor' -import { icons } from './icons' -import { indentJava } from '../core/javaIndent' -import { sidebarIcon } from './learnPanel' -import { closeWindows, compileAndRun, prepareJava, watchWrittenFiles } from './javaRuntime' -import { writtenFilesView } from './textFileView' -import { codeWords, nameAt, nameRanges } from '../core/rename' -import { askRename, showRenameMenu } from './renameDialog' -import { visuBotEnabled } from './visubotView' - -/** - * Ansicht „Code live“: rechts neben dem Struktogramm der Java-, JavaScript- oder Python-Code, der bei jeder Änderung mitwächst. - * In Java kann man den Code auch selbst tippen: Dann baut sich das Struktogramm mit. - */ - -const targetKey = 'visustruct.live.target' -const javaClassKey = 'visustruct.live.javaClass' -const javaMainKey = 'visustruct.live.javaMain' -const swingKey = 'visustruct.live.swing' -const consoleHeightKey = 'visustruct.console.height' -const minConsoleHeight = 150 - -function storedFlag(key: string): boolean { - try { - return localStorage.getItem(key) === '1' - } catch { - return false - } -} - -function storedValue(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function storeValue(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } -} - -function storedTarget(): LiveTarget { - try { - const stored = localStorage.getItem(targetKey) - return stored === 'javascript' || stored === 'python' ? stored : 'java' - } catch { - return 'java' - } -} - -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>') - -/** Eine Codezeile als HTML; Platzhalter grau. */ -function lineHTML(line: string): string { - let out = '' - let rest = line - for (;;) { - const start = rest.indexOf(livePlaceholderStart) - if (start < 0) break - const end = rest.indexOf(livePlaceholderEnd, start) - if (end < 0) break - out += esc(rest.slice(0, start)) + `${esc(rest.slice(start + 1, end))}` - rest = rest.slice(end + 1) - } - return out + esc(rest) -} - -const samePath = (a: number[], b: number[]) => a.length === b.length && a.every((x, i) => x === b[i]) - -/** Innerstes Element, zu dem die Zeile gehört. */ -function spanAtLine(spans: LiveSpan[], line: number): LiveSpan | undefined { - let best: LiveSpan | undefined - for (const s of spans) { - if (line < s.from || line > s.to) continue - if (!best || s.to - s.from < best.to - best.from || (s.to - s.from === best.to - best.from && s.path.length > best.path.length)) best = s - } - return best -} - -/** Fehler erst nach einer kurzen Pause zeigen: Beim Tippen ist eine Zeile fast immer kurz „falsch“. */ -const problemDelay = 900 - -export interface LiveContext { - /** Gehört der Code zu diesem Reiter? Getippter Text wird je Reiter gemerkt. */ - owner: object - /** Unterprogramme aus den anderen Reitern. */ - subprograms: Set - /** Zeilen anklickbar und Code bearbeitbar (nicht während der Simulation). */ - editable: boolean - /** Für „Ausführen“: Unterprogramme in anderen Reitern. */ - resolve: SubprogramResolver -} - -/** So viele Schritte am Stück, dann kurz Luft für die Oberfläche (und für „Stopp“ bei Endlosschleifen). */ -const runChunk = 2000 - -export class LiveCodePanel { - readonly element: HTMLElement - private view!: HTMLElement - private editor!: HTMLElement - private code!: JavaEditor - private problemLine!: HTMLElement - private hint!: HTMLElement - private spans: LiveSpan[] = [] - private highlighted?: string - private html = '' - private target = storedTarget() - private last?: { doc: VSDocument; highlight?: number[]; context: LiveContext } - /** Getippter Code zu einem Dokument (auch für Rückgängig). */ - private textFor = new WeakMap() - private form: JavaForm = { asClass: storedFlag(javaClassKey), withMain: storedFlag(javaMainKey) } - /** Zuletzt gezeigter Code je Reiter: Grundlage, wenn sich das Struktogramm danach ändert. */ - private shown = new WeakMap() - private parsed?: ParsedJava - private placeholders: { from: number; to: number }[] = [] - private problems: JavaProblem[] = [] - private problemTimer?: number - private showProblems = true - /** Zeile (ab 0), in der die Simulation mit einem Fehler stehen geblieben ist: rote Zeilennummer. */ - private runErrorLine: number | undefined - /** - * Laufendes Programm. `paused`: Debugger hält vor einer Zeile an (Haltepunkt oder Einzelschritt). - * `stepping`: nach einer Eingabe wieder anhalten statt weiterlaufen. - */ - private run?: { - engine: SimulationEngine - doc: VSDocument - printed: number - timer?: number - paused: boolean - stepping: boolean - /** Einmal angehalten: Variablen bleiben bis zum Ende sichtbar. */ - debugged: boolean - /** Werte beim letzten Anhalten, um Änderungen hervorzuheben. */ - values?: Map - /** Text von `System.out.print("Note: ")`: steht während der Eingabe direkt vor dem Eingabefeld. */ - heldLine?: string - } - /** Zeile, die als Nächstes ausgeführt wird (gelb), solange der Debugger anhält. */ - private debugLine?: number - private breakpoints = new Set() - /** „Echtes Java (mit Swing)“ (Zahnrad-Menü): Java läuft dann als echtes Java mit CheerpJ. */ - private swing = storedFlag(swingKey) - /** Fläche für die Swing-Fenster; bleibt über `build()` hinweg bestehen, weil CheerpJ sie einmal übernimmt. */ - private swingElement: HTMLElement - private swingDisplay: HTMLElement - /** Beendet das Nachsehen, ob ein laufendes Swing-Programm noch Dateien speichert. */ - private stopWatchingFiles?: () => void - private runButton!: HTMLButtonElement - private stepButton!: HTMLButtonElement - private stopButton!: HTMLButtonElement - private indentButton!: HTMLButtonElement - private debugPanel!: HTMLElement - private debugVars!: HTMLElement - /** Konsole unter dem Code, darüber eine Trennlinie zum Verschieben. */ - private consoleElement: HTMLElement - private consoleResizer: HTMLElement - private consoleLines!: HTMLElement - private consoleForm!: HTMLFormElement - private consoleNotice!: HTMLElement - - /** Ausführen mit Roboter übernehmen; `true` = erledigt (setzt die App im VisuBot-Modus). */ - onRobotRun?: (stepping: boolean) => boolean - /** Knopf „Nachschlagen“: zeigt die Befehle im Lernbereich. */ - onReference?: () => void - /** ⇄: Programmieren groß und Struktogramm schmal bzw. zurück */ - onSwap?: () => void - /** Vor dem Umbenennen: eigener Rückgängig-Schritt statt Teil des Tippens davor. */ - onRename?: () => void - - constructor( - private onHide: () => void, - /** Klick auf eine Zeile wählt das Element im Struktogramm aus. */ - private onSelect: (path: number[]) => void, - /** Getippter Code ergab ein neues Struktogramm. */ - private onCode: (doc: VSDocument, select: number[] | undefined) => void, - private onUndo: (redo: boolean) => void, - ) { - this.element = document.createElement('aside') - this.element.className = 'livecode' - this.consoleElement = document.createElement('section') - this.consoleElement.className = 'console' - this.consoleElement.hidden = true - this.consoleResizer = this.makeConsoleResizer() - this.swingElement = document.createElement('section') - this.swingElement.className = 'console livecode-swing' - this.swingElement.hidden = true - this.swingDisplay = document.createElement('div') - this.swingDisplay.className = 'livecode-swing-display' - this.build() - } - - private get labels(): LiveLabels { - // Dieselben Wörter wie im Struktogramm und im Objektinspektor. - return { - condition: t('canvas_stub_condition'), - selector: t('web_live_ph_selector'), - code: t('web_live_ph_code'), - start: t('inspector_for_init'), - step: t('inspector_for_step'), - end: t('web_live_ph_end'), - } - } - - /** Neu aufbauen, z. B. nach einem Sprachwechsel. */ - build() { - if (this.run) window.clearTimeout(this.run.timer) - this.element.innerHTML = ` -
    -

    ${esc(t('web_live_title'))}

    - - - - - - - - -
    -

    -
    
    -      
    -

    - - ` - this.consoleElement.innerHTML = ` -
    -

    ${esc(t('web_console'))}

    - -
    -
    - -

    - ` - this.view = this.element.querySelector('.livecode-view')! - this.editor = this.element.querySelector('.livecode-editor')! - this.problemLine = this.element.querySelector('.livecode-problem')! - this.hint = this.element.querySelector('.hint')! - this.element.querySelector('.learn-hide')!.addEventListener('click', () => this.onHide()) - this.element.querySelector('.livecode-reference')!.addEventListener('click', () => this.onReference?.()) - this.element.querySelector('.livecode-swap')!.addEventListener('click', () => this.onSwap?.()) - this.runButton = this.element.querySelector('[data-run=play]')! - this.stepButton = this.element.querySelector('[data-run=step]')! - this.stopButton = this.element.querySelector('[data-run=stop]')! - this.indentButton = this.element.querySelector('.livecode-indent')! - this.indentButton.addEventListener('click', () => this.code.indent()) - this.debugPanel = this.element.querySelector('.livecode-debug')! - this.debugVars = this.element.querySelector('.livecode-vars')! - this.swingElement.innerHTML = ` -
    -

    ${esc(t('web_live_swing_windows'))}

    - -
    - ` - this.swingElement.append(this.swingDisplay) - this.swingElement.querySelector('.console-hide')!.addEventListener('click', () => { - this.swingElement.hidden = true - void closeWindows() - }) - const c = this.consoleElement - this.consoleResizer.title = t('web_console_resize') - this.element.append(this.swingElement, this.consoleResizer, c) - this.consoleLines = c.querySelector('.livecode-console-lines')! - this.consoleForm = c.querySelector('.livecode-console-input')! - this.consoleNotice = c.querySelector('.livecode-console-notice')! - c.querySelector('.console-hide')!.addEventListener('click', () => this.hideConsole()) - this.runButton.addEventListener('click', () => (this.run?.paused ? this.resume() : this.startRun(false))) - this.stepButton.addEventListener('click', () => (this.run?.paused ? this.stepOnce() : this.startRun(true))) - this.stopButton.addEventListener('click', () => this.stopRun(true)) - this.consoleForm.addEventListener('submit', (e) => { - e.preventDefault() - this.submitInput() - }) - this.run = undefined - this.view.addEventListener('click', (e) => { - const row = (e.target as HTMLElement).closest('.ln') - if (!row || !this.view.classList.contains('selectable')) return - const span = spanAtLine(this.spans, Number(row.dataset.line)) - if (span) this.onSelect(span.path) - }) - this.code = new JavaEditor( - this.editor, - { - onChange: () => this.codeChanged(), - onCaret: () => this.caretMoved(), - onUndo: (redo) => this.onUndo(redo), - words: () => this.snippetWords, - breakpointLine: (line) => spanAtLine(this.spans, line)?.from, - onBreakpoints: () => (this.breakpoints = this.code.breakpoints), - onRename: (pos, menu) => this.renameAt(pos, menu), - }, - t('web_live_edit_label'), - ) - this.editor.querySelector('.cm-gutters')!.title = t('web_debug_gutter_title') - this.breakpoints = new Set() - this.debugLine = undefined - this.highlighted = undefined - this.html = '' - this.parsed = undefined - this.showMode() - } - - /** Java-Code zum Speichern: wie in Code live (mit getippten Kommentaren), sonst neu erzeugt. */ - javaFor(doc: VSDocument, owner: object): string { - const known = this.textFor.get(doc) - if (known !== undefined) return known - const before = this.shown.get(owner) - if (before) return mergeLiveJava(before.text, before.doc, doc, this.labels, {}, this.form) - return plainLiveJava(doc, this.labels, this.form) - } - - /** Gespeicherten Code (.java) zum geöffneten Struktogramm übernehmen, samt Kommentaren. */ - adoptJava(doc: VSDocument, text: string) { - this.textFor.set(doc, text) - this.parsed = undefined - if (this.last) this.refresh(this.last.doc, this.last.highlight, this.last.context) - } - - /** Struktogramm aus einer .java-Datei ohne passendes .visustruct. */ - documentFromJavaText(text: string): VSDocument { - return documentFromJava({ caption: '', elements: [] }, parseLiveJava(text, this.labels)) - } - - /** Java als Snippet, mit `main`, in einer Klasse (Zahnrad-Menü). */ - get javaForm(): JavaForm { - return this.form - } - - setJavaForm(form: JavaForm) { - this.form = form - try { - localStorage.setItem(javaClassKey, form.asClass ? '1' : '0') - localStorage.setItem(javaMainKey, form.withMain ? '1' : '0') - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } - // Neu erzeugen: Der bisherige Text hat noch die alte Form. - this.textFor = new WeakMap() - this.shown = new WeakMap() - this.parsed = undefined - if (this.last) this.refresh(this.last.doc, this.last.highlight, this.last.context) - } - - /** „Echtes Java (mit Swing)“ (Zahnrad-Menü): erst beim nächsten Ausführen wird Java geladen. */ - get swingSupport(): boolean { - return this.swing - } - - setSwingSupport(on: boolean) { - this.swing = on - try { - localStorage.setItem(swingKey, on ? '1' : '0') - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } - if (!on) this.swingElement.hidden = true - } - - /** Programmiersprache (im Zahnrad-Menü). */ - get language(): LiveTarget { - return this.target - } - - setTarget(target: LiveTarget) { - this.target = target - try { - localStorage.setItem(targetKey, target) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } - this.showMode() - if (this.last) this.refresh(this.last.doc, this.last.highlight, this.last.context) - } - - /** Java: Code selbst tippen. JavaScript und Python: vorerst nur Anzeige. */ - private showMode() { - const java = this.target === 'java' - this.view.hidden = java - this.editor.hidden = !java - this.problemLine.hidden = !java - this.indentButton.hidden = !java - this.hint.textContent = t(java ? 'web_live_hint_edit' : 'web_live_hint') - this.element.querySelector('.livecode-lang')!.textContent = { java: 'Java', javascript: 'JavaScript', python: 'Python' }[this.target] - } - - /** `highlight`: ausgewähltes Element bzw. Schritt der Simulation. */ - refresh(doc: VSDocument, highlight: number[] | undefined, context: LiveContext) { - this.last = { doc, highlight, context } - if (this.target === 'java') this.refreshEditor(doc, highlight, context) - else this.refreshView(doc, highlight, context.editable) - } - - private refreshView(doc: VSDocument, highlight: number[] | undefined, selectable: boolean) { - const live = generateLiveCode(doc, this.target, this.labels) - this.spans = live.spans - const span = highlight && live.spans.find((s) => samePath(s.path, highlight)) - this.view.classList.toggle('selectable', selectable) - const html = live.text - .split('\n') - .map((line, i) => { - const marked = span && i >= span.from && i <= span.to - return `
    ${lineHTML(line) || ' '}
    ` - }) - .join('') - // Unverändert nicht neu aufbauen: Sonst geht ein Klick verloren, wenn das Verlassen des Objektinspektors - // zwischen Drücken und Loslassen neu zeichnet, und markierter Text bleibt markiert. - if (html !== this.html) this.view.innerHTML = html - this.html = html - // Nur scrollen, wenn sich die Markierung bewegt hat, sonst springt die Ansicht beim Tippen. - const key = span ? `${span.from}-${span.to}` : undefined - if (key && key !== this.highlighted) { - this.view.querySelector(`.ln[data-line="${span!.from}"]`)?.scrollIntoView({ block: 'nearest' }) - } - this.highlighted = key - } - - // MARK: - Ausführen - - /** - * Das Programm mit der Simulation ausführen: Ausgaben und Eingaben in der Konsole. - * Es hält an Haltepunkten an; `stepping`: gleich vor der ersten Zeile anhalten (Einzelschritt). - */ - private startRun(stepping: boolean) { - // VisuBot: Programme mit mBot2-Befehlen laufen in der Simulation (3D-Welt, echter mBot2, Markierung) - if (this.onRobotRun?.(stepping)) return - this.runErrorLine = undefined - // Wie javac: Ohne Import, ohne angelegten Scanner, mit vertipptem Datentyp oder falscher Groß- und Kleinschreibung - // (`system.out`) startet das Programm nicht. - const blocking = ['web_parse_missing_import', 'web_parse_missing_scanner', 'web_parse_unknown_type', 'web_parse_wrong_case'] - const missing = this.target === 'java' ? this.javaProblems.find((p) => blocking.includes(p.key)) : undefined - if (missing) { - this.stopRun(false) - this.setConsoleVisible(true) - this.consoleLines.replaceChildren() - this.consoleNotice.textContent = t('web_parse_line_fmt', this.code.lineAt(missing.from) + 1, t(missing.key, missing.arg ?? '')) - this.consoleNotice.classList.add('error') - this.showProblems = true - this.drawMarks(this.last?.highlight) - return - } - // Debuggen geht nur mit der Simulation; ohne Haltepunkt und Einzelschritt läuft Swing-Code als echtes Java. - if (this.swing && this.target === 'java' && !stepping && this.code.breakpoints.size === 0) return void this.startJavaRun() - if (!this.last) return - this.stopRun(false) - this.run = { - engine: new SimulationEngine(this.last.doc, this.last.context.resolve), - doc: this.last.doc, - printed: 0, - paused: false, - stepping, - debugged: false, - } - this.breakpoints = this.code.breakpoints - this.debugPanel.hidden = true - this.setConsoleVisible(true) - this.consoleLines.replaceChildren() - this.consoleNotice.textContent = '' - this.consoleNotice.classList.remove('error') - this.setRunning(true) - if (stepping) this.pause() - else this.continueRun(false) - } - - /** Mit „Echtes Java (mit Swing)“: den getippten Java-Code mit javac übersetzen und als echtes Java starten. */ - private async startJavaRun() { - this.stopRun(false) - this.stopWatchingFiles?.() - this.setConsoleVisible(true) - this.consoleLines.replaceChildren() - // CheerpJ schreibt System.out in das Element mit dieser id. - this.consoleLines.id = 'console' - this.consoleForm.hidden = true - this.consoleNotice.classList.remove('error') - this.runButton.disabled = this.stepButton.disabled = true - try { - this.consoleNotice.textContent = t('web_live_swing_loading') - await prepareJava(this.swingDisplay) - this.consoleNotice.textContent = t('web_live_swing_compiling') - const { result, files } = await compileAndRun(this.code.text, () => (this.swingElement.hidden = false)) - this.showWrittenFiles(files) - this.consoleNotice.textContent = t( - { 'compile-error': 'web_live_swing_compile_failed', windows: 'web_live_swing_running', finished: 'web_live_run_finished' }[result], - ) - this.consoleNotice.classList.toggle('error', result === 'compile-error') - // Ohne offenes Fenster braucht es die Fensterfläche nicht. - this.swingElement.hidden = result !== 'windows' - if (result === 'windows') this.stopWatchingFiles = watchWrittenFiles(files, (later) => this.showWrittenFiles(later)) - } catch { - this.consoleNotice.textContent = t('web_live_swing_failed') - this.consoleNotice.classList.add('error') - } - this.runButton.disabled = this.stepButton.disabled = false - } - - /** `fromPause`: Der erste Schritt läuft auch auf einem Haltepunkt, sonst bliebe „Weiter“ dort stehen. */ - private continueRun(fromPause: boolean) { - const run = this.run - if (!run) return - const { engine } = run - for (let i = 0; i < runChunk && engine.canStep; i++) { - if (!(fromPause && i === 0) && this.atBreakpoint(engine.steps[engine.state.stepIndex])) { - this.printNewLines() - return this.pause() - } - engine.step() - } - if (this.afterSteps()) return - run.timer = window.setTimeout(() => this.continueRun(false), 0) - } - - /** Ausgaben zeigen; Eingabe, Ende oder Fehler behandeln. `true`: Es geht nicht von selbst weiter. */ - private afterSteps(): boolean { - const run = this.run! - const state = run.engine.state - this.printNewLines() - if (state.inputRequest) { - this.askInput() - return true - } - if (state.isHalted || !run.engine.canStep) { - if (state.isHalted) this.runErrorLine = this.lineOf(run.engine.currentStepPath) - this.showWrittenFiles(state.files) - const notice = state.isHalted && state.notice ? noticeText(state.notice) : undefined - const where = this.runErrorLine - this.finishRun(notice ? (where !== undefined ? t('web_parse_line_fmt', where + 1, notice) : notice) : t('web_live_run_finished'), state.isHalted) - return true - } - return false - } - - /** Haltepunkt vor diesem Schritt? Im Unterprogramm nicht (dessen Zeilen stehen nicht hier), bei `for` nur vor der Bedingung. */ - private atBreakpoint(step: SimStep | undefined): boolean { - if (!step || step.callPath || step.kind === 'forLoopIncrement' || step.kind === 'forLoopStart' || step.kind === 'callEnd') return false - const line = this.lineOf(step.path) - return line !== undefined && this.breakpoints.has(line) - } - - private lineOf(path: number[] | undefined): number | undefined { - return path && this.spans.find((s) => samePath(s.path, path))?.from - } - - /** Debugger hält an: Zeile gelb, Element im Struktogramm ausgewählt, Variablen zeigen. */ - private pause() { - const run = this.run! - run.paused = true - run.debugged = true - const path = run.engine.currentStepPath - this.debugLine = this.lineOf(path) - this.consoleNotice.classList.remove('error') - this.consoleNotice.textContent = this.debugLine === undefined ? '' : t('web_debug_paused_fmt', this.debugLine + 1) - this.showVariables() - this.setRunning(true) - const current = this.last?.highlight - if (path && !(current && samePath(current, path))) this.onSelect(path) - else this.drawMarks(this.last?.highlight) - } - - /** Weiter bis zum nächsten Haltepunkt oder zum Ende. */ - private resume() { - const run = this.run - if (!run?.paused) return - run.paused = false - run.stepping = false - this.leavePause() - this.continueRun(true) - } - - /** Einzelschritt: einen Schritt ausführen und wieder anhalten. */ - private stepOnce() { - const run = this.run - if (!run?.paused) return - run.paused = false - run.stepping = true - this.leavePause() - const { engine } = run - const kind = engine.steps[engine.state.stepIndex]?.kind - engine.step() - // `for`: Zählen bzw. Anfangswert und Prüfen der Bedingung sind ein Schritt (dieselbe Zeile). - if ((kind === 'forLoopStart' || kind === 'forLoopIncrement') && engine.canStep && engine.steps[engine.state.stepIndex]?.kind === 'forLoopCondition') { - engine.step() - } - if (!this.afterSteps()) this.pause() - } - - private leavePause() { - this.debugLine = undefined - this.consoleNotice.textContent = '' - this.setRunning(true) - this.drawMarks(this.last?.highlight) - } - - /** Variablen wie in der Simulation; seit dem letzten Anhalten geänderte Werte leuchten kurz auf. */ - private showVariables() { - const run = this.run! - const variables = run.engine.state.variables - this.debugPanel.hidden = false - const names = [...variables.keys()].sort((a, b) => a.localeCompare(b)) - if (names.length === 0) { - this.debugVars.innerHTML = `

    ${esc(t('simulation_variables_placeholder'))}

    ` - } else { - const table = document.createElement('table') - for (const name of names) { - const value = variables.get(name)! - const text = describeValue(value) - const row = table.insertRow() - row.insertCell().textContent = name - const cell = row.insertCell() - if (value.kind === 'grid') cell.append(gridTable(value)) - else cell.textContent = text - if (run.values && run.values.get(name) !== text) row.classList.add('changed') - } - this.debugVars.replaceChildren(table) - } - // Beim ersten Anhalten ist alles neu: dann nichts hervorheben. - run.values = new Map(names.map((name) => [name, describeValue(variables.get(name)!)])) - } - - /** `typed`: Eingabezeile mit Frage und der getippten Antwort (farbig). */ - private printNewLines(typed?: { prompt: string; value: string; heldLine?: string }) { - const run = this.run - if (!run) return - const lines = run.engine.state.outputLines - for (; run.printed < lines.length; run.printed++) this.consoleLine(lines[run.printed]) - if (typed) { - // Nach `System.out.print("Note: ")` steht die Eingabe in derselben Zeile. - const div = this.consoleLine(typed.heldLine ?? (typed.prompt ? `${typed.prompt} ` : '')) - const value = document.createElement('span') - value.className = 'typed' - value.textContent = typed.value - div.append(value) - } - this.consoleLines.scrollTop = this.consoleLines.scrollHeight - } - - /** Nach dem Lauf: die Dateien, die das Programm gespeichert hat. */ - private showWrittenFiles(files: Map) { - if (!files.size) return - this.consoleLines.append(...writtenFilesView(files)) - this.consoleLines.scrollTop = this.consoleLines.scrollHeight - } - - private consoleLine(text: string): HTMLElement { - const div = document.createElement('div') - div.textContent = text - this.consoleLines.append(div) - return div - } - - private askInput() { - const run = this.run! - const request = run.engine.state.inputRequest! - const error = run.engine.state.inputErrorNotice - // Die angefangene Zeile wandert vor das Eingabefeld, damit die Frage auch in einer kleinen Konsole zu sehen ist. - const last = this.consoleLines.lastElementChild - if (request.continuesLine && run.heldLine === undefined && last) { - run.heldLine = last.textContent ?? '' - last.remove() - } - this.consoleForm.hidden = false - this.consoleForm.querySelector('span')!.textContent = run.heldLine ?? request.prompt - const field = this.consoleForm.querySelector('input')! - field.inputMode = request.valueType === 'string' || request.valueType === 'boolean' ? 'text' : 'decimal' - const errorLine = this.consoleForm.querySelector('.livecode-console-error')! - errorLine.textContent = error ? noticeText(error) : '' - errorLine.hidden = !error - requestAnimationFrame(() => field.focus()) - } - - private submitInput() { - const run = this.run - if (!run?.engine.state.inputRequest) return - const field = this.consoleForm.querySelector('input')! - const { prompt } = run.engine.state.inputRequest - run.engine.provideInput(field.value) - if (run.engine.state.inputRequest) return this.askInput() - const heldLine = run.heldLine - run.heldLine = undefined - this.printNewLines({ prompt, value: field.value, heldLine }) - field.value = '' - this.consoleForm.hidden = true - if (!run.stepping) return this.continueRun(false) - if (!this.afterSteps()) this.pause() - } - - private stopRun(byUser: boolean) { - if (!this.run) return - window.clearTimeout(this.run.timer) - if (this.run.heldLine !== undefined) this.consoleLine(this.run.heldLine) - if (byUser) this.finishRun(t('web_live_run_stopped'), false) - this.run = undefined - this.debugLine = undefined - this.debugPanel.hidden = true - this.setRunning(false) - this.drawMarks(this.last?.highlight) - } - - private finishRun(message: string, error: boolean) { - if (this.run) window.clearTimeout(this.run.timer) - this.consoleForm.hidden = true - this.consoleNotice.textContent = message - this.consoleNotice.classList.toggle('error', error) - // Nach dem Debuggen die Werte am Ende zeigen. - if (this.run?.debugged) this.showVariables() - else this.debugPanel.hidden = true - this.run = undefined - this.debugLine = undefined - this.setRunning(false) - this.drawMarks(this.last?.highlight) - } - - /** Während der Simulation: Konsole zeigt deren Ausgaben und Eingaben (beim Start leer). */ - showTranscript(transcript: ConsoleTranscript) { - this.stopRun(false) - this.setConsoleVisible(true) - this.consoleForm.hidden = true - this.consoleLines.replaceChildren() - for (const line of transcript.lines) { - const div = this.consoleLine(line.text) - if (line.typed !== undefined) { - const value = document.createElement('span') - value.className = 'typed' - value.textContent = line.typed - div.append(value) - } - } - if (transcript.pending !== undefined) this.consoleLine(transcript.pending).classList.add('pending') - this.consoleLines.scrollTop = this.consoleLines.scrollHeight - this.consoleNotice.textContent = transcript.notice ?? '' - this.consoleNotice.classList.toggle('error', transcript.error) - } - - /** Konsole schließen; ein laufendes Programm hält dabei an. */ - hideConsole() { - this.stopRun(false) - this.setConsoleVisible(false) - } - - private setConsoleVisible(on: boolean) { - if (this.consoleElement.hidden === !on) return - this.consoleElement.hidden = !on - this.consoleResizer.hidden = !on - } - - /** Waagrechte Trennlinie zwischen Code und Konsole: nach oben ziehen macht die Konsole höher. */ - private makeConsoleResizer(): HTMLElement { - const bar = document.createElement('div') - bar.className = 'console-resizer' - bar.hidden = true - bar.tabIndex = 0 - bar.setAttribute('role', 'separator') - bar.setAttribute('aria-orientation', 'horizontal') - const panel = this.consoleElement - // Mindestens so hoch, dass über dem Eingabefeld noch zwei Zeilen Ausgabe zu sehen sind. - const clamp = (height: number) => Math.round(Math.max(minConsoleHeight, Math.min(height, this.element.getBoundingClientRect().height - 160))) - const apply = (height: number | undefined, remember: boolean) => { - panel.style.height = height === undefined ? '' : `${clamp(height)}px` - if (remember) storeValue(consoleHeightKey, height === undefined ? '' : String(clamp(height))) - } - const saved = Number(storedValue(consoleHeightKey)) - if (saved > 0) panel.style.height = `${Math.max(minConsoleHeight, saved)}px` - bar.addEventListener('pointerdown', (e) => { - if (e.button !== 0) return - e.preventDefault() - bar.setPointerCapture(e.pointerId) - const startY = e.clientY - const startHeight = panel.getBoundingClientRect().height - bar.classList.add('dragging') - const move = (ev: PointerEvent) => apply(startHeight - (ev.clientY - startY), false) - const up = (ev: PointerEvent) => { - bar.removeEventListener('pointermove', move) - bar.removeEventListener('pointerup', up) - bar.removeEventListener('pointercancel', up) - bar.classList.remove('dragging') - apply(startHeight - (ev.clientY - startY), true) - } - bar.addEventListener('pointermove', move) - bar.addEventListener('pointerup', up) - bar.addEventListener('pointercancel', up) - }) - bar.addEventListener('dblclick', () => apply(undefined, true)) - bar.addEventListener('keydown', (e) => { - const step = e.key === 'ArrowUp' ? 20 : e.key === 'ArrowDown' ? -20 : 0 - if (!step) return - e.preventDefault() - apply(panel.getBoundingClientRect().height + step, true) - }) - return bar - } - - private setRunning(on: boolean) { - const paused = !!this.run?.paused - this.runButton.disabled = on && !paused - this.stepButton.disabled = on && !paused - this.stopButton.disabled = !on - this.indentButton.disabled = on - const tip = t(paused ? 'web_debug_continue' : 'web_live_run_title') - this.runButton.dataset.tip = tip - this.runButton.setAttribute('aria-label', paused ? tip : t('web_live_run')) - this.element.classList.toggle('running', on && !paused) - this.element.classList.toggle('debugging', paused) - // Während das Programm läuft, bleibt der Code, wie er ist. - this.code.setReadOnly(on || !this.last?.context.editable) - } - - // MARK: - Java tippen - - /** Code zum Dokument: selbst getippt, an eine Änderung im Struktogramm angepasst, oder neu erzeugt. */ - private textForDocument(doc: VSDocument, context: LiveContext): string { - const known = this.textFor.get(doc) - if (known !== undefined) return known - const before = this.shown.get(context.owner) - if (before) return indentChanged(before.text, mergeLiveJava(before.text, before.doc, doc, this.labels, { subprograms: context.subprograms }, this.form)) - return plainLiveJava(doc, this.labels, this.form) - } - - private refreshEditor(doc: VSDocument, highlight: number[] | undefined, context: LiveContext) { - const text = this.textForDocument(doc, context) - this.textFor.set(doc, text) - this.shown.set(context.owner, { doc, text }) - // Struktogramm geändert oder anderer Reiter: Das laufende Programm passt nicht mehr dazu. - if (this.run && this.run.doc !== doc) this.stopRun(false) - this.code.setReadOnly(!context.editable || !!this.run) - if (this.code.text !== text) { - this.code.setText(text) - this.analyze(text, context) - } else if (!this.parsed) this.analyze(text, context) - // Unverändert erzeugter Code: Zeilen genau wie beim Erzeugen (auch bei Kästen mit mehreren Zeilen). - const generated = liveJava(doc, this.labels, this.form) - this.spans = text === generated.text ? generated.spans : (this.parsed?.spans ?? []) - this.drawMarks(highlight) - } - - private analyze(text: string, context: LiveContext) { - this.parsed = parseLiveJava(text, this.labels, { subprograms: context.subprograms }) - this.placeholders = this.parsed.placeholders - this.problems = this.parsed.problems - } - - /** Pseudocode ist kein Java: keine Fehler anzeigen und den Start nicht verhindern. */ - private get javaProblems(): JavaProblem[] { - return this.last?.doc.pseudocode ? [] : this.problems - } - - private drawMarks(highlight: number[] | undefined) { - const span = highlight && this.spans.find((s) => samePath(s.path, highlight)) - const key = span ? `${span.from}-${span.to}` : undefined - // Während der Simulation ist die Markierung der aktuelle Befehl: gelb wie beim Debuggen - const simulated = this.last?.context.editable === false && span ? span.from : undefined - this.code.setMarks( - { - placeholders: this.placeholders, - problems: this.showProblems ? this.javaProblems : [], - lines: span && simulated === undefined ? { from: span.from, to: span.to } : undefined, - current: this.debugLine ?? simulated, - errorLines: this.errorLines(), - fixes: this.showProblems ? this.quickFixes() : [], - }, - key !== undefined && key !== this.highlighted && !this.code.hasFocus, - ) - const first = this.showProblems ? this.javaProblems[0] : undefined - this.problemLine.textContent = first ? t('web_parse_line_fmt', this.code.lineAt(first.from) + 1, t(first.key, first.arg ?? '')) : '' - this.highlighted = key - } - - /** Rote Zeilennummern: Zeilen mit Syntaxfehlern und die Zeile, an der das Programm abgebrochen ist. */ - private errorLines(): number[] { - const lines = this.showProblems ? this.javaProblems.map((p) => this.code.lineAt(p.from)) : [] - if (this.runErrorLine !== undefined) lines.push(this.runErrorLine) - return lines - } - - /** Glühbirnen: Für diese Fehler weiß VisuStruct genau, was fehlt. Pro Zeile höchstens ein Vorschlag. */ - private quickFixes(): QuickFix[] { - const text = this.code.text - const fixes: QuickFix[] = [] - for (const p of this.javaProblems) { - const lineStart = text.lastIndexOf('\n', p.from - 1) + 1 - const lineEnd = text.indexOf('\n', p.from) < 0 ? text.length : text.indexOf('\n', p.from) - if (fixes.some((f) => f.at === lineEnd)) continue - const insert = (from: number, what: string, shown = what.trim()) => - fixes.push({ at: lineEnd, title: t('web_quickfix_insert_fmt', shown), from, to: from, insert: what }) - const arg = p.arg ?? '' - if (p.key === 'web_parse_missing_import') { - // Hinter den vorhandenen Importen, sonst ganz oben - const imports = [...text.matchAll(/^import\s[^\n]*\n/gm)] - const last = imports[imports.length - 1] - insert(last ? last.index! + last[0].length : 0, `${arg}\n`) - } else if (p.key === 'web_parse_missing_scanner') { - const indent = /^[ \t]*/.exec(text.slice(lineStart))![0] - insert(lineStart, `${indent}${arg}\n`) - } else if ((p.key === 'web_parse_unknown_type' || p.key === 'web_parse_wrong_case') && arg) { - fixes.push({ at: lineEnd, title: t('web_quickfix_replace_fmt', arg, text.slice(p.from, p.to)), from: p.from, to: p.to, insert: arg }) - } else if (p.key === 'web_parse_missing' && (arg === ';' || arg === ')')) { - insert(p.to, arg) - } - } - return fixes - } - - /** Nach jeder Eingabe: Code lesen, Struktogramm neu, Element unter dem Cursor markieren. */ - private codeChanged() { - const context = this.last?.context - const doc = this.last?.doc - if (!context || !doc) return - const text = this.code.text - this.analyze(text, context) - const next = documentFromJava(doc, this.parsed!) - // Nur Kommentare oder Leerzeichen geändert: Struktogramm bleibt dasselbe. - const same = JSON.stringify([next.caption, next.elements]) === JSON.stringify([doc.caption, doc.elements]) - const result = same ? doc : next - this.textFor.set(result, text) - this.shown.set(context.owner, { doc: result, text }) - this.showProblems = false - this.runErrorLine = undefined - window.clearTimeout(this.problemTimer) - this.problemTimer = window.setTimeout(() => { - this.showProblems = true - this.drawMarks(this.last?.highlight) - }, problemDelay) - const line = this.code.lineAt(this.code.caret) - const path = spanAtLine(this.parsed!.spans, line)?.path - if (same) { - this.spans = this.parsed!.spans - this.drawMarks(this.last?.highlight) - if (path) this.onSelect(path) - } else this.onCode(result, path) - } - - /** Getippter Java-Code, solange man ihn bearbeiten kann (sonst gilt das Struktogramm). */ - get editableCode(): string | undefined { - return this.target === 'java' && this.last?.context.editable ? this.code.text : undefined - } - - /** Variable im Code umbenennen; das Struktogramm folgt wie beim Tippen. */ - renameInCode(from: string, to: string) { - this.onRename?.() - this.code.replaceRanges(nameRanges(this.code.text, from), to) - } - - /** F2 oder Rechtsklick im Code: Fenster „Variable umbenennen“ für das Wort an `pos`. */ - private renameAt(pos: number, menu?: { x: number; y: number }): boolean { - const text = this.editableCode - const word = text !== undefined ? nameAt(text, pos) : undefined - if (text === undefined || !word) return false - const ask = () => - void askRename({ - names: [word.name], - existing: codeWords(this.code.text).map((w) => w.name), - count: (name) => nameRanges(this.code.text, name).length, - }).then((r) => { - if (r) this.renameInCode(r.from, r.to) - this.code.view.focus() - }) - if (menu) showRenameMenu(menu.x, menu.y, t('web_rename_menu'), ask) - else ask() - return true - } - - /** Cursor in einer Zeile: passendes Element im Struktogramm markieren. */ - private caretMoved() { - const span = spanAtLine(this.spans, this.code.lineAt(this.code.caret)) - const current = this.last?.highlight - if (span && this.last?.context.editable && !(current && samePath(current, span.path))) this.onSelect(span.path) - } - - private get snippetWords(): SnippetWords { - const l = this.labels - return { - condition: l.condition, - selector: l.selector, - code: l.code, - start: l.start, - step: l.step, - branch: t('element_verzweigung'), - branchElse: t('element_verzweigung'), - switchCase: t('element_fallauswahl'), - forLoop: t('element_forSchleife'), - whileLoop: t('element_whileSchleife'), - doLoop: t('element_doUntilSchleife'), - output: t('inspector_io_mode_output'), - input: t('inspector_io_mode_input'), - robot: visuBotEnabled(), - } - } -} - -/** Nach einer Änderung im Struktogramm: nur die geänderten Zeilen passend zum getippten Code einrücken. */ -function indentChanged(before: string, after: string): string { - const a = before.split('\n') - const b = after.split('\n') - let start = 0 - while (start < a.length && start < b.length && a[start] === b[start]) start++ - if (start === b.length && a.length === b.length) return after - let end = 0 - while (end < a.length - start && end < b.length - start && a[a.length - 1 - end] === b[b.length - 1 - end]) end++ - return b.length - end > start ? indentJava(after, start + 1, b.length - end) : after -} diff --git a/web/src/ui/ludwig.webp b/web/src/ui/ludwig.webp deleted file mode 100644 index 28cfd94a8ff5b61dd4bb30984d3e0ba6887d31f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14066 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 diff --git a/web/src/ui/mbot2Model.ts b/web/src/ui/mbot2Model.ts deleted file mode 100644 index 6139de55..00000000 --- a/web/src/ui/mbot2Model.ts +++ /dev/null @@ -1,419 +0,0 @@ -import * as THREE from 'three' -import { RoundedBoxGeometry } from 'three/examples/jsm/geometries/RoundedBoxGeometry.js' -import type { MBotPart } from '../core/mbot' - -/** - * Der mBot2 aus Grundformen nachgebaut (keine Modelldaten von Makeblock), nach Fotos von Holgers Roboter. Maße in cm: - * türkises Aluminium-Chassis (Wanne mit Seitenwangen, vorn runde „Ohren“, hinten Platte mit „M“), darauf das - * durchsichtige Shield mit Akku, quer hinten oben der CyberPi, vorn der schwarze Ultraschallsensor 2. Unten hellblaue - * Getriebe mit silbernen Motoren, Kugelrolle und vorn der Quad-RGB-Sensor. - * Ursprung ist die Mitte der Radachse auf dem Boden (um sie dreht sich der Roboter). Vorn ist −z, oben +y. - */ - -export type RobotPart = MBotPart - -export interface MBot2Model { - group: THREE.Group - parts: Map - /** Teilgruppen, z. B. zum Hervorheben */ - partGroups: Record - leds: THREE.MeshStandardMaterial[] - /** Bildschirm des CyberPi (Canvas, kann neu bemalt werden) */ - screen: { canvas: HTMLCanvasElement; texture: THREE.CanvasTexture } -} - -const blueAlu = 0x0fa3c6 - -function material(color: number, extra: THREE.MeshStandardMaterialParameters = {}) { - return new THREE.MeshStandardMaterial({ color, roughness: 0.5, ...extra }) -} - -/** Bildschirm des CyberPi: ohne Text das Startgesicht, sonst der Text von `mbot.showText` (umgebrochen). */ -export function drawScreen(canvas: HTMLCanvasElement, text?: string) { - const g = canvas.getContext('2d') - if (!g) return - const s = canvas.width - const bg = g.createLinearGradient(0, 0, 0, s) - bg.addColorStop(0, '#0f2f5c') - bg.addColorStop(1, '#09182e') - g.fillStyle = bg - g.fillRect(0, 0, s, s) - if (text !== undefined) { - g.fillStyle = '#ffffff' - g.textAlign = 'center' - g.textBaseline = 'middle' - const size = text.length <= 8 ? 0.16 : 0.11 - g.font = `bold ${Math.round(s * size)}px system-ui, sans-serif` - // Wortweise umbrechen, höchstens vier Zeilen - const lines: string[] = [] - for (const word of text.split(/\s+/)) { - const last = lines[lines.length - 1] - if (last !== undefined && g.measureText(`${last} ${word}`).width < s * 0.9) lines[lines.length - 1] = `${last} ${word}` - else lines.push(word) - } - const shown = lines.slice(0, 4) - const step = s * size * 1.2 - shown.forEach((line, i) => g.fillText(line, s / 2, s / 2 + (i - (shown.length - 1) / 2) * step, s * 0.94)) - return - } - // Freundliches Gesicht wie beim Start des CyberPi - g.fillStyle = '#5ee7ff' - for (const x of [0.33, 0.67]) { - g.beginPath() - g.ellipse(s * x, s * 0.4, s * 0.08, s * 0.12, 0, 0, Math.PI * 2) - g.fill() - } - g.strokeStyle = '#5ee7ff' - g.lineWidth = s * 0.045 - g.lineCap = 'round' - g.beginPath() - g.arc(s / 2, s * 0.55, s * 0.18, Math.PI * 0.2, Math.PI * 0.8) - g.stroke() - g.fillStyle = '#ffffff' - g.font = `bold ${Math.round(s * 0.11)}px system-ui, sans-serif` - g.textAlign = 'center' - g.fillText('VisuBot', s / 2, s * 0.9) -} - -/** Etikett als Textur (Akku, Shield). */ -function labelTexture(lines: { text: string; size: number; bold?: boolean }[], w: number, h: number, fg: string, bg: string | undefined) { - const canvas = document.createElement('canvas') - canvas.width = w - canvas.height = h - const g = canvas.getContext('2d') - if (g) { - if (bg) { - g.fillStyle = bg - g.fillRect(0, 0, w, h) - } - g.fillStyle = fg - g.textAlign = 'center' - g.textBaseline = 'middle' - lines.forEach((l, i) => { - g.font = `${l.bold ? 'bold ' : ''}${l.size}px system-ui, sans-serif` - g.fillText(l.text, w / 2, (h * (i + 0.5)) / lines.length) - }) - } - const texture = new THREE.CanvasTexture(canvas) - texture.colorSpace = THREE.SRGBColorSpace - return texture -} - -/** Radkappe mit dem Gittermuster des mBot2-Rads (Kreise und Quadrate). */ -function rimTexture() { - const canvas = document.createElement('canvas') - canvas.width = canvas.height = 256 - const g = canvas.getContext('2d') - if (g) { - g.fillStyle = '#16181b' - g.fillRect(0, 0, 256, 256) - g.strokeStyle = '#2c3036' - g.lineWidth = 9 - for (let i = 0; i < 6; i++) - for (let k = 0; k < 6; k++) { - const x = 38 + i * 36 - const y = 38 + k * 36 - g.beginPath() - if ((i + k) % 2) g.arc(x, y, 12, 0, Math.PI * 2) - else g.rect(x - 11, y - 11, 22, 22) - g.stroke() - } - } - const texture = new THREE.CanvasTexture(canvas) - texture.colorSpace = THREE.SRGBColorSpace - return texture -} - -/** Seitenwange des Chassis in der z/y-Ebene: Rechteck, vorn ein rundes Ohr mit Lochkreis, hinten ein schräger Arm. */ -function sideWallShape(): THREE.Shape { - const s = new THREE.Shape() - s.moveTo(-7.2, 1.4) - s.lineTo(4.8, 1.4) - // hinterer Arm schräg nach oben - s.lineTo(9.6, 4.6) - s.lineTo(8.8, 5.9) - s.lineTo(4.6, 3.6) - s.lineTo(4.6, 4.7) - s.lineTo(-6.6, 4.7) - // vorderes Ohr - s.absarc(-8.4, 3.1, 1.9, Math.PI * 0.35, Math.PI * 1.55, false) - s.lineTo(-7.2, 1.4) - const hole = (z: number, y: number, r: number) => { - const p = new THREE.Path() - p.absarc(z, y, r, 0, Math.PI * 2, true) - s.holes.push(p) - } - hole(-8.4, 3.1, 0.55) - for (let k = 0; k < 8; k++) { - const a = (k / 8) * Math.PI * 2 - if (Math.cos(a) > 0.6) continue - hole(-8.4 + Math.cos(a) * 1.25, 3.1 + Math.sin(a) * 1.25, 0.22) - } - for (let c = 0; c < 4; c++) for (let r = 0; r < 3; r++) hole(-5.6 + c * 0.95, 2.1 + r * 0.95, 0.25) - for (let k = 0; k < 3; k++) hole(6.0 + k * 1.05, 4.0 + k * 0.7, 0.22) - return s -} - -export function buildMBot2(): MBot2Model { - const group = new THREE.Group() - const parts = new Map() - const partGroups = {} as Record - const part = (name: RobotPart, parent: THREE.Object3D = group) => { - const g = new THREE.Group() - g.name = name - partGroups[name] = g - parts.set(g, name) - parent.add(g) - return g - } - const mesh = (geometry: THREE.BufferGeometry, mat: THREE.Material, x: number, y: number, z: number, parent: THREE.Object3D) => { - const m = new THREE.Mesh(geometry, mat) - m.position.set(x, y, z) - parent.add(m) - return m - } - const alu = material(blueAlu, { metalness: 0.7, roughness: 0.3 }) - const black = material(0x1b1d21, { roughness: 0.6 }) - const darkPlastic = material(0x2a2e35, { roughness: 0.45 }) - const silver = material(0xc9ced6, { metalness: 0.9, roughness: 0.25 }) - const rubber = material(0x141414, { roughness: 0.9 }) - const greyButton = material(0x9aa0a7, { roughness: 0.55 }) - const white = material(0xf2f2f2, { roughness: 0.5 }) - const pcb = material(0x1d2226, { roughness: 0.7 }) - // Rauchglas-Gehäuse von Shield und CyberPi - const smoke = new THREE.MeshPhysicalMaterial({ color: 0x262c31, transparent: true, opacity: 0.55, roughness: 0.12, metalness: 0.1, clearcoat: 1, depthWrite: false }) - - // Chassis: Wanne aus Blech, zwei Seitenwangen mit Ohren und Armen, vorn und hinten eine Platte - const chassis = part('chassis') - const floor = new THREE.Shape() - floor.moveTo(-4.9, -7.2) - floor.lineTo(4.9, -7.2) - floor.lineTo(4.9, 4.8) - floor.lineTo(-4.9, 4.8) - // Ausschnitt in der Mitte: Von unten sieht man die Motoren. - const opening = new THREE.Path() - opening.moveTo(-3.6, -3.4) - opening.lineTo(-3.6, 2.8) - opening.lineTo(3.6, 2.8) - opening.lineTo(3.6, -3.4) - floor.holes.push(opening) - const floorGeo = new THREE.ExtrudeGeometry(floor, { depth: 0.22, bevelEnabled: false }) - floorGeo.rotateX(Math.PI / 2) - mesh(floorGeo, alu, 0, 1.62, 0, chassis) - const wallGeo = new THREE.ExtrudeGeometry(sideWallShape(), { depth: 0.22, bevelEnabled: false, curveSegments: 16 }) - wallGeo.rotateY(-Math.PI / 2) - for (const side of [-1, 1]) mesh(wallGeo, alu, side * 4.9 + (side > 0 ? 0.22 : 0), 0, 0, chassis) - // Vorderplatte mit Lächeln - mesh(new THREE.BoxGeometry(9.8, 3.3, 0.22), alu, 0, 3.05, -7.2, chassis) - const smile = new THREE.Mesh(new THREE.TorusGeometry(1.1, 0.16, 6, 20, Math.PI * 0.8), black) - smile.rotation.z = Math.PI * 1.1 - smile.position.set(0, 2.9, -7.33) - chassis.add(smile) - // Hinterplatte schräg mit „M“-Ausschnitt - const back = new THREE.Shape() - back.moveTo(-4.9, 0) - back.lineTo(4.9, 0) - back.lineTo(4.9, 3.4) - back.lineTo(-4.9, 3.4) - const m = new THREE.Path() - m.moveTo(-1.1, 0.6) - m.lineTo(-1.1, 2.6) - m.lineTo(-0.5, 2.6) - m.lineTo(0, 1.9) - m.lineTo(0.5, 2.6) - m.lineTo(1.1, 2.6) - m.lineTo(1.1, 0.6) - m.lineTo(0.6, 0.6) - m.lineTo(0.6, 1.8) - m.lineTo(0, 1.1) - m.lineTo(-0.6, 1.8) - m.lineTo(-0.6, 0.6) - back.holes.push(m) - const backPlate = new THREE.Mesh(new THREE.ExtrudeGeometry(back, { depth: 0.22, bevelEnabled: false }), alu) - backPlate.rotation.x = -0.35 - backPlate.position.set(0, 1.5, 4.8) - chassis.add(backPlate) - - // Antrieb: hellblaue Getriebe an den Rädern, silberne Motoren quer und gegeneinander versetzt - const motors = part('motors') - const gearMat = material(0x8cc4ea, { roughness: 0.55 }) - for (const side of [-1, 1]) { - mesh(new RoundedBoxGeometry(2.0, 2.8, 3.0, 2, 0.2), gearMat, side * 3.7, 3.3, 0, motors) - const motor = mesh(new THREE.CylinderGeometry(0.75, 0.75, 2.8, 20), silver, side * 1.55, 3.0, side * 0.8, motors) - motor.rotation.z = Math.PI / 2 - const cap = mesh(new THREE.CylinderGeometry(0.8, 0.8, 0.5, 20), gearMat, side * 2.6, 3.0, side * 0.8, motors) - cap.rotation.z = Math.PI / 2 - } - - // Räder: schwarzer Reifen, schwarze Felge mit Gittermuster - const wheels = part('wheels') - const rim = material(0xffffff, { map: rimTexture(), roughness: 0.6 }) - for (const side of [-1, 1]) { - const wheel = new THREE.Group() - const tire = new THREE.Mesh(new THREE.CylinderGeometry(3.3, 3.3, 2.2, 44), rubber) - tire.rotation.z = Math.PI / 2 - wheel.add(tire) - const lip = new THREE.Mesh(new THREE.TorusGeometry(2.75, 0.32, 10, 44), rubber) - lip.rotation.y = Math.PI / 2 - lip.position.x = side * 1.1 - wheel.add(lip) - const face = new THREE.Mesh(new THREE.CircleGeometry(2.6, 40), rim) - face.rotation.y = (side * Math.PI) / 2 - face.position.x = side * 1.0 - wheel.add(face) - const hub = new THREE.Mesh(new THREE.CylinderGeometry(0.3, 0.3, 0.3, 12), silver) - hub.rotation.z = Math.PI / 2 - hub.position.x = side * 1.05 - wheel.add(hub) - wheel.position.set(side * 6.45, 3.3, 0) - wheel.name = side < 0 ? 'wheelLeft' : 'wheelRight' - wheels.add(wheel) - } - - // Kugelrolle vorn unter dem Boden - const caster = part('caster') - const casterHousing = mesh(new THREE.SphereGeometry(1.3, 20, 10, 0, Math.PI * 2, 0, Math.PI / 2), black, 0, 0.75, -4.6, caster) - casterHousing.scale.set(1.3, 0.7, 1) - mesh(new THREE.SphereGeometry(0.75, 20, 14), black, 0, 0.75, -4.6, caster) - for (const x of [-0.9, 0.9]) mesh(new THREE.CylinderGeometry(0.25, 0.25, 0.2, 12), silver, x, 1.28, -5.6, caster) - - // Quad-RGB-Liniensensor: schwarze Platine, die vorn unter der Vorderplatte herausschaut - const lineSensor = part('lineSensor') - mesh(new RoundedBoxGeometry(8.0, 0.3, 2.4, 2, 0.1), pcb, 0, 1.25, -8.0, lineSensor) - for (let i = 0; i < 4; i++) { - const x = -3.3 + i * 2.2 - mesh(new THREE.BoxGeometry(0.6, 0.12, 0.6), material(0xf5f5f5, { emissive: 0xffffff, emissiveIntensity: 0.5 }), x, 1.06, -8.3, lineSensor) - mesh(new THREE.SphereGeometry(0.13, 8, 6), material(0xff4040, { emissive: 0xff2a2a, emissiveIntensity: 1.4 }), x, 1.06, -7.6, lineSensor) - } - - // Shield: durchsichtiges Gehäuse, darin Platine und Akku - const shield = part('shield') - const shell = new THREE.Mesh(new RoundedBoxGeometry(9.4, 3.4, 11.2, 3, 0.5), smoke) - shell.position.set(0, 6.5, -1.4) - shell.renderOrder = 1 - shield.add(shell) - mesh(new THREE.BoxGeometry(9.0, 0.16, 10.8), pcb, 0, 5.1, -1.4, shield) - for (const [x, z] of [[-2, -4], [1.5, -3.6], [-1.6, -2.2], [1.8, -2.4]]) mesh(new THREE.CylinderGeometry(0.45, 0.45, 0.4, 14), black, x, 5.35, z, shield) - const batteryLabel = labelTexture( - [ - { text: 'makeblock', size: 56, bold: true }, - { text: 'mBot2 One Robot Per Child', size: 30 }, - ], - 512, - 160, - '#e9edf0', - '#777d84', - ) - const battery = new THREE.Mesh(new THREE.CylinderGeometry(1.05, 1.05, 7.0, 28), new THREE.MeshStandardMaterial({ map: batteryLabel, roughness: 0.4, metalness: 0.3 })) - battery.rotation.z = Math.PI / 2 - battery.rotation.x = -Math.PI / 2 - battery.position.set(0, 6.3, 0.6) - shield.add(battery) - // Hinten: Motoranschlüsse M1, M2 und zwei mBuild-Buchsen mit Kabeln - for (const x of [-3.2, -2.3]) mesh(new THREE.BoxGeometry(0.6, 0.5, 0.3), white, x, 5.6, 4.25, shield) - for (const x of [0.4, 2.2]) { - mesh(new THREE.BoxGeometry(1.5, 0.45, 0.35), white, x, 5.6, 4.25, shield) - const cable = mesh(new THREE.TorusGeometry(0.7, 0.12, 6, 12, Math.PI), black, x, 5.0, 4.5, shield) - cable.rotation.y = Math.PI / 2 - } - // Links: Schalter ON/OFF und die Servo-Anschlüsse S1, S2 - const powerSwitch = part('powerSwitch') - mesh(new THREE.BoxGeometry(0.2, 0.5, 1.2), darkPlastic, -4.72, 5.8, -3.4, powerSwitch) - mesh(new THREE.BoxGeometry(0.3, 0.38, 0.45), white, -4.8, 5.8, -3.6, powerSwitch) - const switchLabel = new THREE.Mesh( - new THREE.PlaneGeometry(1.4, 0.4), - new THREE.MeshBasicMaterial({ map: labelTexture([{ text: 'ON/OFF', size: 44, bold: true }], 256, 72, '#e9edf0', undefined), transparent: true }), - ) - switchLabel.rotation.y = -Math.PI / 2 - switchLabel.position.set(-4.76, 5.25, -3.4) - powerSwitch.add(switchLabel) - for (const z of [-1.9, -0.9]) mesh(new THREE.BoxGeometry(0.3, 0.45, 0.7), white, -4.6, 5.8, z, shield) - - // CyberPi quer hinten oben: Joystick links, Bildschirm in der Mitte, zwei Tasten rechts - const cyberpiBody = new THREE.Group() - group.add(cyberpiBody) - const cyberpi = part('cyberpi', cyberpiBody) - const case_ = new THREE.Mesh(new RoundedBoxGeometry(7.9, 1.0, 3.1, 3, 0.25), smoke) - case_.renderOrder = 1 - cyberpi.add(case_) - mesh(new THREE.BoxGeometry(7.6, 0.12, 2.9), pcb, 0, -0.1, 0, cyberpi) - const nameLabel = new THREE.Mesh( - new THREE.PlaneGeometry(1.6, 0.4), - new THREE.MeshBasicMaterial({ map: labelTexture([{ text: 'CyberPi', size: 44 }], 256, 64, '#c9d1d8', undefined), transparent: true }), - ) - nameLabel.position.set(-2.6, 0, 1.56) - cyberpi.add(nameLabel) - // USB-C rechts an der Stirnseite (daneben die Home-Taste, siehe Tasten) - mesh(new THREE.BoxGeometry(0.12, 0.3, 0.9), black, 3.98, 0.05, -0.7, cyberpi) - - const screenPart = part('screen', cyberpiBody) - const canvas = document.createElement('canvas') - canvas.width = canvas.height = 256 - drawScreen(canvas) - const texture = new THREE.CanvasTexture(canvas) - texture.colorSpace = THREE.SRGBColorSpace - mesh(new THREE.BoxGeometry(3.0, 0.08, 2.6), material(0xdfe3e6), 0.1, 0.47, 0, screenPart) - const screen = new THREE.Mesh( - new THREE.PlaneGeometry(2.7, 2.3), - new THREE.MeshStandardMaterial({ map: texture, emissive: 0xffffff, emissiveMap: texture, emissiveIntensity: 0.9, roughness: 0.15 }), - ) - screen.rotation.x = -Math.PI / 2 - screen.position.set(0.1, 0.52, 0) - screenPart.add(screen) - - const joystick = part('joystick', cyberpiBody) - mesh(new THREE.CylinderGeometry(0.75, 0.75, 0.12, 24), material(0x8a9096), -2.75, 0.52, 0, joystick) - mesh(new THREE.CylinderGeometry(0.22, 0.22, 0.5, 12), material(0x6c7278), -2.75, 0.75, 0, joystick) - mesh(new THREE.CylinderGeometry(0.55, 0.6, 0.32, 24), greyButton, -2.75, 1.05, 0, joystick) - - // Tasten: Quadrat (zur Fahrtrichtung) und Dreieck; Home sitzt an der Seite - const buttons = part('buttons', cyberpiBody) - mesh(new RoundedBoxGeometry(0.85, 0.3, 0.85, 2, 0.15), greyButton, 2.6, 0.58, -0.62, buttons) - const triangle = mesh(new THREE.CylinderGeometry(0.55, 0.55, 0.3, 3), greyButton, 2.6, 0.58, 0.68, buttons) - triangle.rotation.y = Math.PI / 2 - mesh(new THREE.CylinderGeometry(0.24, 0.24, 0.22, 14).rotateZ(Math.PI / 2), greyButton, 3.98, 0.05, 0.5, buttons) - - // Fünf RGB-LEDs als Lichtleiste an der hinteren Längskante des CyberPi (Foto IMG_4737) - const ledPart = part('leds', cyberpiBody) - mesh(new THREE.BoxGeometry(6.6, 0.3, 0.06), material(0xeeeeee, { transparent: true, opacity: 0.3, roughness: 0.2 }), 0, -0.12, 1.68, ledPart) - const leds: THREE.MeshStandardMaterial[] = [] - for (let i = 0; i < 5; i++) { - const led = new THREE.MeshStandardMaterial({ color: 0xdddddd, emissiveIntensity: 1, roughness: 0.3, toneMapped: false }) - leds.push(led) - mesh(new THREE.BoxGeometry(0.7, 0.22, 0.08), led, -2.8 + i * 1.4, -0.12, 1.63, ledPart) - } - // Lichtsensor und Mikrofon neben dem Joystick - for (const [x, name] of [[-1.75, 'lightSensor'], [-1.75, 'microphone']] as const) { - const z = name === 'lightSensor' ? -1.05 : 1.05 - mesh(new THREE.CylinderGeometry(0.14, 0.14, 0.08, 10), material(0x0a0a0a, { roughness: 0.2 }), x, 0.52, z, part(name, cyberpiBody)) - } - cyberpiBody.position.set(0, 8.55, 3.15) - - // Ultraschallsensor 2 vorn: schwarzes Gehäuse, zwei schwarze Schallwandler mit grauem Ring - const ultrasonic = part('ultrasonic') - mesh(new RoundedBoxGeometry(6.4, 2.8, 1.3, 3, 0.4), black, 0, 0, 0, ultrasonic) - for (const side of [-1, 1]) { - const can = mesh(new THREE.CylinderGeometry(1.2, 1.2, 1.3, 32), black, side * 1.6, 0, -1.1, ultrasonic) - can.rotation.x = Math.PI / 2 - const ring = mesh(new THREE.TorusGeometry(0.98, 0.17, 10, 32), material(0x9ea4aa, { metalness: 0.5, roughness: 0.35 }), side * 1.6, 0, -1.76, ultrasonic) - ring.name = 'sonarRing' - const grid = mesh(new THREE.CircleGeometry(0.85, 28), material(0x3a3f45, { roughness: 0.9 }), side * 1.6, 0, -1.7, ultrasonic) - grid.rotation.y = Math.PI - } - // Halterung mit zwei Schrauben unter dem Sensor - mesh(new RoundedBoxGeometry(2.6, 1.5, 0.3, 2, 0.12), black, 0, -1.6, -0.3, ultrasonic) - for (const x of [-0.7, 0.7]) mesh(new THREE.CylinderGeometry(0.28, 0.28, 0.2, 12).rotateX(Math.PI / 2), silver, x, -1.75, -0.5, ultrasonic) - ultrasonic.position.set(0, 6.4, -8.0) - - // Jedes Teil bekommt eigene Materialien, damit beim Hervorheben nur dieses Teil leuchtet (LEDs bleiben geteilt). - group.traverse((o) => { - const mesh = o as THREE.Mesh - if (!mesh.isMesh) return - const transparent = (mesh.material as THREE.Material).transparent - mesh.castShadow = !transparent - mesh.receiveShadow = true - const m = mesh.material as THREE.MeshStandardMaterial - if (!leds.includes(m)) mesh.material = m.clone() - }) - return { group, parts, partGroups, leds, screen: { canvas, texture } } -} diff --git a/web/src/ui/mbotUpload.ts b/web/src/ui/mbotUpload.ts deleted file mode 100644 index 3d227555..00000000 --- a/web/src/ui/mbotUpload.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { mbotColorLanguage } from '../core/mbot' -import { mbotLink } from '../core/mbotLink' -import { mbotProgram } from '../core/mbotProgram' -import type { VSDocument } from '../core/model' -import { t } from './i18n' - -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>') - -/** - * VisuBot: „Auf mBot2 übertragen“. Übersetzt das Programm für den CyberPi, speichert es dort fest und erklärt, - * wie es weitergeht: Kabel ab, mBot2 an den Start, Taste A. - */ -export function uploadToMBot(doc: VSDocument, subprograms: VSDocument[]) { - const dialog = document.createElement('dialog') - dialog.className = 'about mbot-upload' - dialog.setAttribute('aria-labelledby', 'mbot-upload-title') - dialog.innerHTML = ` -
    -

    ⬆ ${esc(t('web_visubot_upload_title'))}

    - -
    -
    -
      -
    1. ${esc(t('web_visubot_upload_step1'))}
    2. -
    3. ${esc(t('web_visubot_upload_step2'))}
    4. -
    5. ${esc(t('web_visubot_upload_step3'))}
    6. -
    - -

    - -
    ` - const status = dialog.querySelector('.mbot-upload-status')! - const bar = dialog.querySelector('progress')! - const start = dialog.querySelector('[data-action=upload-start]')! - let busy = false - const close = () => !busy && dialog.close() - dialog.querySelector('[data-action=upload-close]')!.addEventListener('click', close) - dialog.addEventListener('cancel', (ev) => busy && ev.preventDefault()) - dialog.addEventListener('click', (ev) => ev.target === dialog && close()) - dialog.addEventListener('close', () => dialog.remove()) - - const program = mbotProgram(doc, subprograms, mbotColorLanguage(), t('web_visubot_upload_label')) - if ('error' in program) { - status.textContent = `⚠︎ ${t(`web_visubot_upload_error_${program.error}`)}` - start.hidden = true - } - - start.addEventListener('click', async () => { - if (!('source' in program)) return - busy = true - start.disabled = true - bar.hidden = false - bar.value = 0 - status.textContent = t('web_visubot_upload_busy') - try { - await mbotLink.upload(program.source, (done, total) => (bar.value = done / total)) - bar.value = 1 - status.textContent = `✓ ${t('web_visubot_upload_done')}` - status.classList.add('done') - } catch (e) { - const error = e as Error - // Auswahl des Anschlusses abgebrochen: nichts melden - status.textContent = error.name === 'NotFoundError' ? '' : `⚠︎ ${t('web_visubot_upload_failed')} (${error.message})` - bar.hidden = true - await mbotLink.disconnect(error.name === 'NotFoundError' ? undefined : error.message).catch(() => undefined) - } finally { - busy = false - start.disabled = false - } - }) - document.body.append(dialog) - dialog.showModal() -} diff --git a/web/src/ui/objectApp.ts b/web/src/ui/objectApp.ts deleted file mode 100644 index 68b088a4..00000000 --- a/web/src/ui/objectApp.ts +++ /dev/null @@ -1,3452 +0,0 @@ -import { - addInterface, - addMember, - classModifiers, - deleteClass, - deleteMember, - parseClasses, - parseUmlLine, - removeInterface, - renameClass, - replaceMember, - setAbstract, - setFieldType, - setFinal, - setPublic, - setSuperclass, - umlText, - type UmlClass, - type UmlMember, - type Visibility, -} from '../core/classModel' -import { - addFile, - addPackage, - addSourceFolder, - barePackage, - classFileText, - defaultRoot, - diskPath, - exampleProject, - fileNameOf, - filesIn, - isFolderName, - isPackageName, - moveFile, - packageKey, - packageOf, - packagesOf, - pathFor, - projectClasses, - projectFromFiles, - projectFromJSON, - projectToJSON, - removeFile, - removePackage, - removeSourceFolder, - renamePackage, - renameSourceFolder, - rootOf, - sourceFoldersOf, - updateFile, - type JavaProject, - type UmlNote, - type ProjectClass, - type UmlObject, -} from '../core/javaProject' -import { - associations, - dependencies, - ensureImport, - fieldNameFor, - fieldTypeFor, - generalizations, - isMany, - multiplicities, - relationKey, - renameInfo, - withInfo, - type Assoc, - type AssocInfo, - type AssocKind, - type Dependency, - type EndNav, - type Generalization, -} from '../core/umlRelations' -import { gearIcon } from './app' -import { currentLanguage, t } from './i18n' -import { worldHomeURL } from './site' -import { icons } from './icons' -import { codeScopes, JavaEditor, setCodeScopes } from './javaEditor' -import { closeWindows, compileAndRunProject, prepareJava } from './javaRuntime' -import { ObjectDiagram, type LiveState } from './objectDiagram' -import { sequenceSVG, type SequenceData } from './sequenceDiagram' -import { MiniJava, MiniJavaError, type FrameView, type HeapObject, type StepMode } from '../core/miniJava' -import type { OwnTypes } from '../core/javaMembers' -import { ownTypes } from '../core/ownTypes' -import { hasSections, keepSections, withSections, type SectionLabels } from '../core/sections' -import { ObjectLayout } from './objectLayout' -import { setVisuBotMode, setVisuFlowWorld, worldChooserHTML, worldTitleHTML, type WorldChoice } from './visubotView' -import { classSource, newWizard, type NewKind } from './objectNew' -import { addFieldConstructor, addGettersSetters, addToString, classDoc, fieldInfo, paramsText, parseParams, setClassDoc, setField, setMethod, type FieldInfo, type MethodInfo } from '../core/memberEdit' -import { freeProjectName, listProjects, readProject, safeFolderName, workspaceFolderName, writeProject, type Positions } from './objectWorkspace' -import { canPickFolder, pickFolder, reopenFolder, storedFolder, type WsDir } from './workspaceStore' - -/** - * Welt VisuObject: links der Package Explorer (Projekt › src › Packages › Dateien › Klassen › Mitglieder), - * in der Mitte der Java-Code der geöffneten Datei, rechts das Klassendiagramm aller Dateien. - * Tippen baut das Diagramm neu, eine Änderung im Diagramm schreibt nur die betroffene Stelle im Code neu. - * Siehe docs/visuobject/PLAN.md. - */ - -declare const __APP_VERSION__: string - -const projectKey = 'visuobject.project' -/** Stufe 1 hatte nur eine Datei. */ -const oldCodeKey = 'visuobject.code' -const activeKey = 'visuobject.active' -const positionsKey = 'visuobject.positions' -const treeKey = 'visuobject.tree' -const tabsKey = 'visuobject.tabs' -/** Zuletzt geöffnetes Projekt im Workspace. */ -const wsProjectKey = 'visuobject.wsProject' -/** `0`: Objektinspektor eingeklappt. */ -const inspectorKey = 'visuobject.inspector' -/** Höhe des Objektinspektors in px, leer = so hoch wie sein Inhalt. */ -const inspectorHeightKey = 'visuobject.inspectorHeight' -/** `1`: ohne Workspace-Ordner arbeiten, nicht mehr fragen. */ -const noWorkspaceKey = 'visuobject.noWorkspace' -const diagramModeKey = 'visuobject.diagram' -/** Haltepunkte je Datei: Pfad → Zeilen (ab 0). */ -const breakpointsKey = 'visuobject.breakpoints' -/** Gemerkter Workspace-Ordner, getrennt vom Ordner „VisuStruct-Dateien“. */ -const workspaceSlot = 'visuobject-workspace' -const maxUndoSteps = 80 - -type Point = { x: number; y: number } - -const e = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) -const identifier = /^[\p{L}_$][\p{L}\p{N}_$]*$/u - -function stored(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function store(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher nur für diese Sitzung */ - } -} - -function siteURL(): string { - return worldHomeURL('visuobject', currentLanguage()) -} - -function download(name: string, data: BlobPart, type: string) { - const url = URL.createObjectURL(new Blob([data], { type })) - const a = document.createElement('a') - a.href = url - a.download = name - a.click() - setTimeout(() => URL.revokeObjectURL(url), 1000) -} - -/** Was im Diagramm ausgewählt ist: eine Klasse, evtl. eines ihrer Mitglieder (Index in `members`). */ -interface Selection { - cls: string - member?: number -} - -/** Knoten im Package Explorer: `project`, `src`, `pkg:tiere`, `file:tiere/Hund.java`, `class:Hund`. */ -type NodeId = string - -type DiagramMode = 'class' | 'object' | 'sequence' - -const chevron = '' - -export class ObjectApp { - private shell: HTMLElement - private editor!: JavaEditor - private canvas!: HTMLElement - private lines!: SVGSVGElement - private frames!: SVGSVGElement - private status!: HTMLElement - private tree!: HTMLElement - private tabs!: HTMLElement - /** Offene Dateien als Reiter über dem Code. */ - private openTabs: string[] = [] - private project: JavaProject - /** Geöffnete Datei (Pfad unter `src/`). */ - private active?: string - /** Im Explorer gewähltes Package: Dort landen neue Klassen. */ - private currentPackage?: string - private classes: ProjectClass[] = [] - private positions = new Map() - private selection?: Selection - /** Gewählte Beziehung: `assoc:Klasse.attribut` oder `gen:extends:Hund:Tier`. */ - private relSelection?: string - private inspector!: HTMLElement - /** Gewähltes Werkzeug der Leiste über dem Diagramm. */ - private tool: Tool = 'select' - /** Beziehungswerkzeug: erste Klasse ist angeklickt, die zweite fehlt noch. */ - private pendingFrom?: string - /** Der Klick nach einem Werkzeug-Einsatz wählt nichts aus. */ - private suppressClick = false - /** `Klasse.attribut` aller Attribute, die als Rolle an einer Linie stehen. */ - private treeSelection?: NodeId - private open = new Map() - private history: string[] = [] - private future: string[] = [] - private lastTyping = 0 - /** Gerade bearbeitetes Eingabefeld im Diagramm oder Explorer: dann nicht neu zeichnen. */ - private editing = false - private objectDiagram!: ObjectDiagram - /** Im Diagramm-Bereich: Klassendiagramm oder Objektdiagramm. */ - private diagramMode: DiagramMode = (['object', 'sequence'] as const).find((m) => m === stored(diagramModeKey)) ?? 'class' - /** Letzter Mitschnitt fürs Sequenzdiagramm (bleibt nach dem Programmende stehen). */ - private sequence?: SequenceData - /** Gewählte Notiz im Diagramm. */ - private noteSelection?: string - /** Workspace-Ordner wie in Eclipse (nur Chrome/Edge); ohne ihn bleibt das Projekt im Browser. */ - private workspace?: WsDir - /** Gemerkter Ordner, für den der Browser erst wieder fragen muss. */ - private pendingFolder?: FileSystemDirectoryHandle - private projects: string[] = [] - /** Ordner des geöffneten Projekts im Workspace; nach dem Umbenennen bis zum Speichern noch der alte. */ - private folder?: string - /** Stand beim letzten Speichern bzw. Laden: Projekt als JSON und Text je Datei. */ - private saved?: string - private savedFiles = new Map() - private wsBox!: HTMLElement - private breakpoints = new Map>() - /** Laufender Debugger: Programm, Takt, Stand fürs Objektdiagramm. */ - private dbg?: { - vm: MiniJava - timer?: number - state: 'running' | 'paused' | 'input' - frames: FrameView[] - frame: number - places: Map - values: Map - vars: Map - } - - constructor(root: HTMLElement) { - document.documentElement.classList.add('visuobject-theme') - history.replaceState(history.state, '', `${location.pathname}?visuobject${location.hash}`) - try { - const saved = JSON.parse(stored(positionsKey) ?? '{}') as Record - for (const [name, p] of Object.entries(saved)) if (Number.isFinite(p?.x) && Number.isFinite(p?.y)) this.positions.set(name, p) - const tree = JSON.parse(stored(treeKey) ?? '{}') as Record - for (const [id, on] of Object.entries(tree)) this.open.set(id, !!on) - const bps = JSON.parse(stored(breakpointsKey) ?? '{}') as Record - for (const [path, lines] of Object.entries(bps)) if (Array.isArray(lines)) this.breakpoints.set(path, new Set(lines.filter(Number.isInteger))) - } catch { - /* alte oder kaputte Einstellungen: Standard */ - } - const old = stored(oldCodeKey) - this.project = projectFromJSON(stored(projectKey) ?? '') ?? (old !== null ? projectFromFiles('Projekt', [{ name: '', text: old }]) : exampleProject()) - const active = stored(activeKey) - this.active = this.project.files.some((f) => f.path === active) ? active! : this.project.files[0]?.path - try { - const tabs = JSON.parse(stored(tabsKey) ?? '[]') as unknown - if (Array.isArray(tabs)) this.openTabs = tabs.filter((p): p is string => typeof p === 'string' && this.project.files.some((f) => f.path === p)) - } catch { - /* ohne Reiter */ - } - this.shell = document.createElement('div') - this.shell.className = 'shell visuobject' - root.replaceWith(this.shell) - this.build() - new ObjectLayout(this.shell.querySelector('.vo-columns')!, () => this.drawLines()) - this.showActive() - this.refresh() - window.addEventListener('keydown', (ev) => this.onKey(ev)) - window.addEventListener('resize', () => this.drawLines()) - window.addEventListener('beforeunload', (ev) => { - if (this.isDirty()) ev.preventDefault() - }) - void this.restoreWorkspace() - } - - // MARK: - Aufbau - - private build() { - const button = (action: string, label: string, icon: string, tip = label) => - `` - this.shell.innerHTML = ` -
    - VisuObject ${e(t('web_visuobject_subtitle'))} -
    - ${button('new', t('toolbar_new'), icons.newFile, t('web_visuobject_new_tip'))} - ${button('open', t('menu_open'), icons.open, t('web_visuobject_open_tip'))} - ${button('save', t('menu_save'), icons.save, t('web_visuobject_save_tip'))} - ${button('undo', t('toolbar_undo'), icons.undo)} - ${button('redo', t('toolbar_redo'), icons.redo)} - -
    -
    - - - - -
    -
    - - -
    -
    -
    -
    - -
    -

    ${e(t('web_visuobject_explorer'))}

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

    ${e(t('web_visuobject_inspector'))}

    - -
    -
    -
    -

    ${e(t('web_visuobject_edit_hint'))}
    -
    -
    ` - this.canvas = this.shell.querySelector('.vo-canvas:not(.vo-objcanvas):not(.vo-seqcanvas)')! - this.shell.querySelector('.vo-seqcanvas')!.addEventListener('click', (ev) => { - const i = (ev.target as Element).closest('[data-ev]')?.dataset.ev - const pos = i !== undefined ? this.sequence?.events[Number(i)]?.pos : undefined - if (pos?.file) this.showLine(pos.file, pos.line) - }) - const objCanvas = this.shell.querySelector('.vo-objcanvas')! - this.objectDiagram = new ObjectDiagram({ - canvas: objCanvas, - lines: objCanvas.querySelector('.vo-objlines')!, - inspector: this.shell.querySelector('.vo-inspector')!, - classes: () => this.classes, - objects: () => this.project.objects ?? [], - setObjects: (objects) => this.setProject({ ...this.project, objects: objects.length ? objects : undefined }), - message: (text) => this.message(text), - }) - for (const b of this.shell.querySelectorAll('[data-diagram]')) b.addEventListener('click', () => this.setDiagramMode(b.dataset.diagram as DiagramMode)) - this.shell.querySelector('[data-obj-add]')!.addEventListener('click', () => { - const cls = this.shell.querySelector('[data-obj-class]')!.value - if (cls) this.objectDiagram.add(cls) - }) - this.lines = this.canvas.querySelector('.vo-lines')! - this.frames = this.canvas.querySelector('.vo-frames')! - this.status = this.shell.querySelector('.vo-status')! - this.inspector = this.shell.querySelector('.vo-inspector')! - // Der Objektinspektor hat einen festen Platz unter dem Diagramm und klappt mit „–“ ein. - const dock = this.shell.querySelector('.vo-dock')! - const dockToggle = dock.querySelector('[data-inspector=toggle]')! - const setDock = (open: boolean, redraw = true) => { - dock.classList.toggle('collapsed', !open) - dockToggle.textContent = open ? '–' : '+' - dockToggle.setAttribute('aria-expanded', String(open)) - const label = t(open ? 'web_visuobject_inspector_hide' : 'web_visuobject_inspector_show') - dockToggle.setAttribute('aria-label', label) - dockToggle.dataset.tip = label - store(inspectorKey, open ? '1' : '0') - if (redraw) this.drawLines() - } - dockToggle.addEventListener('click', () => setDock(dock.classList.contains('collapsed'))) - dock.querySelector('.vo-dock-bar')!.addEventListener('dblclick', () => setDock(dock.classList.contains('collapsed'))) - setDock(stored(inspectorKey) !== '0', false) - // Grenze zwischen Diagramm und Objektinspektor nach oben oder unten schieben (Doppelklick = Standard). - const split = this.shell.querySelector('.vo-hsplit')! - const pane = this.shell.querySelector('[data-pane=diagram]')! - const setHeight = (h: number | undefined) => { - if (h === undefined) { - this.inspector.style.removeProperty('height') - this.inspector.style.removeProperty('max-height') - store(inspectorHeightKey, '') - } else { - const max = Math.max(120, pane.clientHeight - 200) - const value = Math.round(Math.min(max, Math.max(60, h))) - this.inspector.style.height = `${value}px` - this.inspector.style.maxHeight = 'none' - store(inspectorHeightKey, String(value)) - } - this.drawLines() - } - const savedHeight = Number(stored(inspectorHeightKey)) - if (savedHeight > 0) { - this.inspector.style.height = `${savedHeight}px` - this.inspector.style.maxHeight = 'none' - } - split.addEventListener('pointerdown', (ev) => { - if (dock.classList.contains('collapsed') || ev.button !== 0) return - ev.preventDefault() - split.setPointerCapture(ev.pointerId) - const startY = ev.clientY - const startH = this.inspector.offsetHeight - split.classList.add('dragging') - const move = (m: PointerEvent) => setHeight(startH - (m.clientY - startY)) - const up = () => { - split.classList.remove('dragging') - split.removeEventListener('pointermove', move) - split.removeEventListener('pointerup', up) - split.removeEventListener('pointercancel', up) - } - split.addEventListener('pointermove', move) - split.addEventListener('pointerup', up) - split.addEventListener('pointercancel', up) - }) - split.addEventListener('dblclick', () => setHeight(undefined)) - split.addEventListener('keydown', (ev) => { - const d = ev.key === 'ArrowUp' ? 20 : ev.key === 'ArrowDown' ? -20 : 0 - if (!d) return - ev.preventDefault() - setHeight(this.inspector.offsetHeight + d) - }) - this.tree = this.shell.querySelector('.vo-tree')! - this.tabs = this.shell.querySelector('.vo-tabs')! - this.wsBox = this.shell.querySelector('.vo-ws')! - this.wsBox.addEventListener('click', (ev) => void this.onWorkspaceClick(ev)) - this.editor = new JavaEditor( - this.shell.querySelector('.vo-editor')!, - { - onChange: () => this.typed(), - onCaret: () => this.caretMoved(), - onUndo: (redo) => this.undo(redo), - words: () => ({ - condition: t('canvas_stub_condition'), - selector: t('web_live_ph_selector'), - code: t('web_live_ph_code'), - start: t('inspector_for_init'), - step: t('inspector_for_step'), - branch: t('element_verzweigung'), - branchElse: t('element_verzweigung'), - switchCase: t('element_fallauswahl'), - forLoop: t('element_forSchleife'), - whileLoop: t('element_whileSchleife'), - doLoop: t('element_doUntilSchleife'), - output: t('inspector_io_mode_output'), - input: t('inspector_io_mode_input'), - }), - breakpointLine: (line) => line, - onBreakpoints: () => this.saveBreakpoints(), - ownTypes: (pos) => this.ownTypesAt(pos), - }, - t('web_visuobject_code'), - ) - const on = (action: string, run: () => void) => this.shell.querySelector(`[data-action=${action}]`)!.addEventListener('click', run) - on('new', () => void this.newProject({ name: t('web_visuobject_project_name'), files: [], packages: [] })) - on('example', () => void this.newProject(exampleProject(), 'tiere/Tier.java')) - on('open', () => this.openFiles()) - on('save', () => void this.save()) - on('undo', () => this.undo(false)) - on('redo', () => this.undo(true)) - const newButton = this.shell.querySelector('[data-action=new-menu]')! - const newMenu = this.shell.querySelector('.vo-new-menu')! - const showNewMenu = (show: boolean) => { - newMenu.hidden = !show - newButton.setAttribute('aria-expanded', String(show)) - if (show) newMenu.querySelector('button')?.focus() - } - newButton.addEventListener('click', () => showNewMenu(newMenu.hidden)) - newMenu.addEventListener('click', (ev) => { - const kind = (ev.target as HTMLElement).closest('[data-new]')?.dataset.new as NewKind | undefined - if (!kind) return - showNewMenu(false) - void this.newFromWizard(kind) - }) - newMenu.addEventListener('keydown', (ev) => { - const items = [...newMenu.querySelectorAll('button')] - const i = items.indexOf(document.activeElement as HTMLElement) - if (ev.key === 'Escape') { - showNewMenu(false) - newButton.focus() - } else if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') { - ev.preventDefault() - items[(i + (ev.key === 'ArrowDown' ? 1 : items.length - 1)) % items.length]?.focus() - } - }) - document.addEventListener('pointerdown', (ev) => { - if (!newMenu.hidden && !(ev.target as HTMLElement).closest('.vo-new')) showNewMenu(false) - }) - on('layout', () => { - this.positions.clear() - this.savePositions() - this.render() - }) - const settings = this.shell.querySelector('[data-action=settings]')! - const menu = this.shell.querySelector('.settings-menu')! - settings.addEventListener('click', () => { - menu.hidden = !menu.hidden - settings.setAttribute('aria-expanded', String(!menu.hidden)) - }) - document.addEventListener('pointerdown', (ev) => { - if (!menu.hidden && !(ev.target as HTMLElement).closest('.settings')) menu.hidden = true - }) - for (const b of menu.querySelectorAll('[data-world]')) b.addEventListener('click', () => this.chooseWorld(b.dataset.world as WorldChoice)) - const scopes = menu.querySelector('[data-action=code-scopes]')! - scopes.checked = codeScopes() - scopes.addEventListener('change', () => setCodeScopes(scopes.checked)) - this.shell.querySelector('[data-action=run]')!.addEventListener('click', () => void this.runProgram()) - this.shell.querySelector('[data-action=stop]')!.addEventListener('click', () => (this.dbg ? this.stopDebug('web_visuobject_stopped') : void this.stopProgram())) - this.shell.querySelector('[data-action=debug]')!.addEventListener('click', () => void this.startDebug()) - for (const b of this.shell.querySelectorAll('[data-dbg]')) b.addEventListener('click', () => this.debugCommand(b.dataset.dbg as StepMode | 'continue' | 'pause')) - const consoleInput = this.shell.querySelector('.vo-console-input')! - consoleInput.addEventListener('submit', (ev) => { - ev.preventDefault() - const field = consoleInput.querySelector('input')! - this.debugInput(field.value) - field.value = '' - }) - window.addEventListener('keydown', (ev) => { - const command = ({ F5: 'into', F6: 'over', F7: 'out', F8: 'continue' } as const)[ev.key as 'F5'] - if (!command || !this.dbg) return - ev.preventDefault() - this.debugCommand(command) - }) - const consolePane = this.shell.querySelector('.vo-console')! - consolePane.querySelector('[data-console=clear]')!.addEventListener('click', () => consolePane.querySelector('.vo-console-lines')!.replaceChildren()) - consolePane.querySelector('[data-console=hide]')!.addEventListener('click', () => (consolePane.hidden = true)) - this.canvas.addEventListener('pointerdown', (ev) => this.onPointerDown(ev)) - this.canvas.addEventListener('click', (ev) => this.onClick(ev)) - this.canvas.addEventListener('contextmenu', (ev) => { - const el = (ev.target as Element).closest('[data-end]') - if (!el) return - ev.preventDefault() - if (this.relSelection !== el.dataset.rel) this.selectRelation(el.dataset.rel!) - this.openEnd(el.dataset.rel!, el.dataset.end as 'a' | 'b', ev) - }) - this.tree.addEventListener('click', (ev) => this.onTreeClick(ev)) - this.tabs.addEventListener('click', (ev) => this.onTabClick(ev)) - for (const b of this.shell.querySelectorAll('.vo-tool')) b.addEventListener('pointerdown', (ev) => this.onToolDown(ev, b.dataset.tool as Tool)) - this.tree.addEventListener('keydown', (ev) => this.onTreeKey(ev)) - } - - // MARK: - Ausführen (echtes Java über CheerpJ) - - /** Klasse mit `public static void main`: bevorzugt in der offenen Datei. Voller Name mit Package. */ - private mainClass(): string | undefined { - const withMain = this.classes.filter((c) => c.members.some((m) => m.kind === 'method' && m.name === 'main' && m.isStatic)) - const cls = withMain.find((c) => c.path === this.active) ?? withMain[0] - return cls && (cls.pkg ? `${cls.pkg}.${cls.name}` : cls.name) - } - - private async runProgram() { - const pane = this.shell.querySelector('.vo-console')! - const lines = pane.querySelector('.vo-console-lines')! - const status = pane.querySelector('.vo-console-status')! - const swing = pane.querySelector('.vo-swing')! - const run = this.shell.querySelector('[data-action=run]')! - const stop = this.shell.querySelector('[data-action=stop]')! - pane.hidden = false - const say = (key: string, error = false, ...args: string[]) => { - status.textContent = t(key, ...args) - status.classList.toggle('error', error) - } - const main = this.mainClass() - if (!main) return say('web_visuobject_no_main', true) - // Erst speichern, was im Editor steht, dann wie in Eclipse alle Dateien übersetzen. - if (this.workspace) await this.writeCurrent() - await closeWindows().catch(() => undefined) - lines.replaceChildren() - // CheerpJ schreibt System.out und System.err in das Element mit dieser id. - for (const el of document.querySelectorAll('#console')) el.removeAttribute('id') - lines.id = 'console' - swing.hidden = true - run.disabled = true - stop.disabled = false - try { - say('web_live_swing_loading') - await prepareJava(swing.querySelector('.livecode-swing-display')!) - say('web_live_swing_compiling') - const files = this.project.files.map((f) => ({ pkg: barePackage(packageOf(f.path)), name: fileNameOf(f.path).replace(/\.java$/i, ''), text: f.text })) - const { result } = await compileAndRunProject(files, main, () => { - swing.hidden = false - say('web_visuobject_running_fmt', false, main) - }) - say({ 'compile-error': 'web_live_swing_compile_failed', windows: 'web_live_swing_running', finished: 'web_live_run_finished' }[result], result === 'compile-error') - swing.hidden = result !== 'windows' - stop.disabled = result !== 'windows' - } catch { - say('web_live_swing_failed', true) - stop.disabled = true - } - run.disabled = false - } - - /** Stop: Fenster des Programms schließen (eine Endlosschleife in main hält CheerpJ nicht an). */ - private async stopProgram() { - await closeWindows().catch(() => undefined) - const pane = this.shell.querySelector('.vo-console')! - pane.querySelector('.vo-swing')!.hidden = true - const status = pane.querySelector('.vo-console-status')! - status.textContent = t('web_visuobject_stopped') - status.classList.remove('error') - this.shell.querySelector('[data-action=stop]')!.disabled = true - } - - // MARK: - Debugger (eigener Interpreter, Schritt für Schritt) - - private saveBreakpoints() { - if (!this.active) return - const lines = this.editor.breakpoints - if (lines.size) this.breakpoints.set(this.active, lines) - else this.breakpoints.delete(this.active) - const known = new Set(this.project.files.map((f) => f.path)) - store(breakpointsKey, JSON.stringify(Object.fromEntries([...this.breakpoints].filter(([p]) => known.has(p)).map(([p, l]) => [p, [...l]])))) - } - - private consolePane() { - const pane = this.shell.querySelector('.vo-console')! - return { - pane, - lines: pane.querySelector('.vo-console-lines')!, - status: pane.querySelector('.vo-console-status')!, - input: pane.querySelector('.vo-console-input')!, - } - } - - private debugStatus(text: string, error = false) { - const { status } = this.consolePane() - status.textContent = text - status.classList.toggle('error', error) - } - - private consoleWrite(text: string, kind: 'out' | 'err' | 'in' = 'out') { - const { lines } = this.consolePane() - const last = lines.lastElementChild as HTMLElement | null - if (last?.dataset.kind === kind) last.textContent += text - else { - const span = document.createElement('span') - span.dataset.kind = kind - span.className = `vo-out-${kind}` - span.textContent = text - lines.append(span) - } - lines.scrollTop = lines.scrollHeight - } - - private async startDebug() { - if (this.dbg) this.stopDebug() - const { pane, lines, input } = this.consolePane() - pane.hidden = false - pane.querySelector('.vo-swing')!.hidden = true - await closeWindows().catch(() => undefined) - if (this.workspace) await this.writeCurrent() - lines.replaceChildren() - lines.removeAttribute('id') - input.hidden = true - const main = this.mainClass() - if (!main) return this.debugStatus(t('web_visuobject_no_main'), true) - let vm: MiniJava - try { - vm = new MiniJava( - this.project.files.map((f) => ({ path: f.path, source: f.text })), - { out: (text, err) => this.consoleWrite(text, err ? 'err' : 'out') }, - ) - vm.start(main.split('.').pop()) - } catch (err) { - if (err instanceof MiniJavaError) return this.debugError(err) - throw err - } - this.dbg = { vm, state: 'running', frames: [], frame: 0, places: new Map(), values: new Map(), vars: new Map() } - this.shell.querySelector('.vo-dbg-controls')!.hidden = false - this.shell.querySelector('[data-action=stop]')!.disabled = false - this.shell.querySelector('[data-action=run]')!.disabled = true - this.sequence = undefined - if (this.diagramMode === 'class') this.setDiagramMode('object') - vm.go(this.allBreakpoints().size ? 'run' : 'into') - this.debugRun() - } - - private allBreakpoints(): Set { - const out = new Set() - for (const [path, lines] of this.breakpoints) for (const l of lines) out.add(`${path}:${l}`) - return out - } - - private debugCommand(command: StepMode | 'continue' | 'pause') { - const dbg = this.dbg - if (!dbg) return - if (command === 'pause') { - if (dbg.state !== 'running') return - dbg.vm.pause() - clearTimeout(dbg.timer) - return this.debugRun() - } - if (dbg.state !== 'paused') return - dbg.vm.go(command === 'continue' ? 'run' : command) - this.debugRun() - } - - /** Programm in kleinen Portionen laufen lassen, damit die Seite bedienbar bleibt (Pause, Stop). */ - private debugRun() { - const dbg = this.dbg - if (!dbg) return - dbg.state = 'running' - this.showDebugButtons() - this.debugStatus(t('web_visuobject_dbg_running')) - const bps = this.allBreakpoints() - const start = performance.now() - for (;;) { - const s = dbg.vm.run(bps, 2000) - if (s.k === 'running') { - if (performance.now() - start < 15) continue - dbg.timer = window.setTimeout(() => this.debugRun(), 0) - return - } - if (s.k === 'sleep') { - dbg.timer = window.setTimeout(() => this.debugRun(), Math.min(s.ms, 10000)) - return - } - if (s.k === 'input') { - dbg.state = 'input' - this.showDebugButtons() - this.showDebugState() - this.debugStatus(t('web_visuobject_dbg_waiting')) - const { input } = this.consolePane() - input.hidden = false - input.querySelector('input')!.focus() - return - } - if (s.k === 'paused') { - dbg.state = 'paused' - dbg.frame = 0 - this.showDebugButtons() - this.showDebugState() - this.debugStatus(t('web_visuobject_dbg_paused_fmt', s.pos.file.split('/').pop() ?? '', String(s.pos.line + 1))) - return - } - if (s.k === 'done') return this.stopDebug('web_live_run_finished') - if (s.k === 'exception') { - this.consoleWrite(`${s.text} -`, 'err') - if (s.pos) this.showLine(s.pos.file, s.pos.line) - return this.stopDebug('web_visuobject_dbg_exception', true) - } - return this.debugError(s.error) - } - } - - private debugInput(line: string) { - const dbg = this.dbg - if (!dbg || dbg.state !== 'input') return - this.consoleWrite(`${line} -`, 'in') - this.consolePane().input.hidden = true - dbg.vm.input(line) - this.debugRun() - } - - private debugError(err: MiniJavaError) { - const line = err.pos ? String(err.pos.line + 1) : '' - const file = err.pos?.file.split('/').pop() ?? '' - const what = err.detail.replace(/^expected:/, '') - const key = { syntax: 'web_visuobject_dbg_err_syntax', symbol: 'web_visuobject_dbg_err_symbol', unsupported: 'web_visuobject_dbg_err_unsupported', nomain: 'web_visuobject_no_main', type: 'web_visuobject_dbg_err_type', import: 'web_visuobject_dbg_err_import', typename: 'web_visuobject_dbg_err_typename' }[err.code] - if (err.pos) this.showLine(err.pos.file, err.pos.line) - this.stopDebug() - this.debugStatus(t(key, file, line, what), true) - } - - private showDebugButtons() { - const dbg = this.dbg - const paused = dbg?.state === 'paused' - for (const b of this.shell.querySelectorAll('[data-dbg]')) b.disabled = !dbg || (b.dataset.dbg === 'pause' ? dbg.state !== 'running' : !paused) - } - - /** Zeile im Editor zeigen (Datei wechseln, gelb markieren). */ - private showLine(path: string, line: number | undefined) { - if (this.project.files.some((f) => f.path === path) && path !== this.active) this.openFile(path) - this.editor.setMarks({ placeholders: [], problems: [], current: line }, true) - } - - /** Halt: gelbe Zeile, Objektdiagramm mit den Objekten im Speicher, Variablen und Aufrufstapel. */ - private showDebugState() { - const dbg = this.dbg - if (!dbg) return - dbg.frames = dbg.vm.stack() - const heap = dbg.vm.heap() - const frame = dbg.frames[dbg.frame] - if (frame) this.showLine(frame.pos.file, frame.pos.line) - const first = dbg.values.size === 0 && dbg.vars.size === 0 - const changed = new Set() - const values = new Map() - for (const o of heap) - for (const f of o.fields) { - const key = `dbg${o.id}.${f.name}` - values.set(key, f.value) - if (!first && dbg.values.get(key) !== f.value) changed.add(key) - } - dbg.values = values - const changedVars = new Set() - const vars = new Map() - dbg.frames.forEach((f, i) => { - for (const v of f.vars) { - const key = `${dbg.frames.length - i}|${f.title}|${v.name}` - vars.set(key, v.value) - if (!first && dbg.vars.get(key) !== v.value) changedVars.add(`${f.title}|${v.name}`) - } - }) - dbg.vars = vars - const live: LiveState = { - objects: this.liveObjects(heap), - changed, - frames: dbg.frames, - frame: dbg.frame, - changedVars, - onFrame: (i) => { - dbg.frame = i - live.frame = i - const f = dbg.frames[i] - if (f) this.showLine(f.pos.file, f.pos.line) - this.objectDiagram.renderInspector() - }, - move: (id, p) => dbg.places.set(id, p), - } - this.objectDiagram.live = live - this.sequence = dbg.vm.sequence() - if (this.diagramMode === 'object') this.objectDiagram.render() - if (this.diagramMode === 'sequence') this.renderSequence() - } - - /** Sequenzdiagramm aus dem letzten Debugger-Lauf; beim Anhalten ist der letzte Pfeil gelb. */ - private renderSequence() { - const box = this.shell.querySelector('.vo-seqcanvas')! - const svg = box.querySelector('.vo-seq')! - const empty = box.querySelector('.vo-empty')! - const data = this.sequence - empty.hidden = !!data && data.events.length > 0 - empty.textContent = t(data ? 'web_visuobject_seq_no_calls' : 'web_visuobject_seq_empty') - if (!data || !data.events.length) { - svg.innerHTML = '' - svg.setAttribute('width', '0') - } else { - const live = this.dbg?.state === 'paused' || this.dbg?.state === 'input' - const { svg: inner, width, height } = sequenceSVG(data, live ? data.events.length - 1 : undefined) - svg.innerHTML = inner + (data.truncated ? `${e(t('web_visuobject_seq_truncated'))}` : '') - svg.setAttribute('width', String(width)) - svg.setAttribute('height', String(height)) - if (live) svg.querySelector('.vo-seq-msg.current')?.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - } - this.renderSequenceInspector() - } - - private renderSequenceInspector() { - if (this.objectDiagram.live) return this.objectDiagram.renderInspector() - this.inspector.innerHTML = `

    ${e(t('web_visuobject_seq_hint'))}

    ` - } - - /** Objekte aus dem Speicher als Objektdiagramm; Lage wie selbst gezeichnet (gleicher Name) oder frei daneben. */ - private liveObjects(heap: HeapObject[]): UmlObject[] { - const dbg = this.dbg! - const drawn = this.project.objects ?? [] - const rows = (o: HeapObject) => 40 + o.fields.length * 20 - const used: { x: number; y: number; w: number; h: number }[] = [] - const out: UmlObject[] = [] - const pending: HeapObject[] = [] - for (const o of heap) { - const id = `dbg${o.id}` - const p = dbg.places.get(id) ?? drawn.find((d) => d.name === o.name && d.cls === o.cls) - if (!p) { - pending.push(o) - continue - } - dbg.places.set(id, { x: p.x, y: p.y }) - used.push({ x: p.x, y: p.y, w: 260, h: rows(o) }) - } - for (const o of pending) { - const h = rows(o) - let spot = { x: 24, y: 24 } - search: for (let y = 24; y < 6000; y += 30) - for (let x = 24; x <= 24 + 3 * 320; x += 320) - if (used.every((r) => x + 260 + 30 <= r.x || r.x + r.w + 30 <= x || y + h + 30 <= r.y || r.y + r.h + 30 <= y)) { - spot = { x, y } - break search - } - dbg.places.set(`dbg${o.id}`, spot) - used.push({ ...spot, w: 260, h }) - } - for (const o of heap) { - const id = `dbg${o.id}` - out.push({ id, name: o.name, cls: o.cls, ...dbg.places.get(id)!, values: Object.fromEntries(o.fields.map((f) => [f.name, f.value])) }) - } - return out - } - - private stopDebug(statusKey?: string, error = false) { - const dbg = this.dbg - if (dbg) clearTimeout(dbg.timer) - this.dbg = undefined - if (dbg) this.sequence = dbg.vm.sequence() - this.objectDiagram.live = undefined - this.consolePane().input.hidden = true - this.shell.querySelector('.vo-dbg-controls')!.hidden = true - this.shell.querySelector('[data-action=stop]')!.disabled = true - this.shell.querySelector('[data-action=run]')!.disabled = false - if (!error) this.editor.setMarks({ placeholders: [], problems: [] }, false) - if (statusKey) this.debugStatus(t(statusKey), error) - if (this.diagramMode === 'object') this.objectDiagram.render() - if (this.diagramMode === 'sequence') this.renderSequence() - } - - private chooseWorld(world: WorldChoice) { - if (world === 'object') return - if (world === 'flow') { - setVisuFlowWorld() - location.href = `${location.pathname}?visuflow${location.hash}` - return - } - setVisuBotMode(world) - location.href = `${location.pathname}?${world === 'on' ? 'visubot' : 'visustruct'}${location.hash}` - } - - // MARK: - Projekt und Code - - private get activeFile() { - return this.project.files.find((f) => f.path === this.active) - } - - /** Geöffnete Datei in den Editor. */ - private showActive() { - const file = this.activeFile - this.editor.setText(file?.text ?? '') - this.editor.setBreakpoints(file ? (this.breakpoints.get(file.path) ?? []) : []) - this.editor.setReadOnly(!file) - if (file && !this.openTabs.includes(file.path)) this.openTabs.push(file.path) - this.renderTabs() - store(activeKey, this.active ?? '') - } - - /** Reiter wie in WebGoatCode: eine pro offener Datei, × schließt sie. */ - private renderTabs() { - this.openTabs = this.openTabs.filter((p) => this.project.files.some((f) => f.path === p)) - store(tabsKey, JSON.stringify(this.openTabs)) - if (this.openTabs.length === 0) { - this.tabs.innerHTML = `${e(t('web_visuobject_no_file'))}` - return - } - this.tabs.innerHTML = this.openTabs - .map((path) => { - const on = path === this.active - // Wie in VS Code: ● statt ×, solange die Datei nicht gespeichert ist. - const dirty = this.isDirty(path) - return `
    - - -
    ` - }) - .join('') - } - - private onTabClick(ev: MouseEvent) { - const target = ev.target as HTMLElement - const path = target.closest('[data-tab]')?.dataset.tab - if (!path) return - if (target.closest('[data-close]')) return this.closeTab(path) - this.treeSelection = `file:${path}` - this.openFile(path) - } - - private closeTab(path: string) { - const i = this.openTabs.indexOf(path) - if (i < 0) return - this.openTabs.splice(i, 1) - if (path === this.active) { - this.active = this.openTabs[Math.min(i, this.openTabs.length - 1)] - this.lastTyping = 0 - this.showActive() - this.refresh() - } else this.renderTabs() - } - - private snapshot(): string { - return JSON.stringify({ project: this.project, active: this.active }) - } - - private remember() { - this.history.push(this.snapshot()) - if (this.history.length > maxUndoSteps) this.history.shift() - this.future = [] - } - - /** Projekt von außen ändern (Diagramm, Explorer, Neu, Beispiel, Öffnen): mit Rückgängig. */ - private setProject(next: JavaProject, active = this.active) { - this.remember() - this.lastTyping = 0 - this.project = next - this.active = next.files.some((f) => f.path === active) ? active : next.files[0]?.path - this.showActive() - this.refresh() - } - - private openFile(path: string) { - if (path === this.active) return - this.active = path - this.lastTyping = 0 - this.showActive() - const pkg = packageOf(path) - this.currentPackage = pkg - this.open.set(`pkg:${pkg}`, true) - this.refresh() - } - - private typed() { - const file = this.activeFile - if (!file) return - // Schnelles Tippen zählt als ein Schritt für Rückgängig. - const now = Date.now() - if (now - this.lastTyping > 1500) this.remember() - this.lastTyping = now - this.project = updateFile(this.project, file.path, this.editor.text) - this.saveBreakpoints() - if (this.dbg) this.stopDebug('web_visuobject_dbg_code_changed') - this.refresh() - // Klasse im Code umbenannt: kurz nach dem Tippen heißen Reiter und Datei mit (wie in Eclipse beim Speichern). - clearTimeout(this.renameTimer) - this.renameTimer = window.setTimeout(() => this.syncFileName(), 700) - } - - private renameTimer?: number - - /** Heißt die Datei wie keine ihrer Klassen mehr, bekommt sie den Namen der (ersten öffentlichen) Klasse. */ - private syncFileName() { - const file = this.activeFile - if (!file || this.editing) return - const old = fileNameOf(file.path).replace(/\.java$/i, '') - const inFile = this.classes.filter((c) => c.path === file.path) - if (inFile.length === 0 || inFile.some((c) => c.name === old)) return - const name = (/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(file.text)?.[1] ?? inFile[0].name) - if (!identifier.test(name) || inFile.filter((c) => c.name === name).length !== 1) return - const to = pathFor(packageOf(file.path), `${name}.java`) - if (this.project.files.some((f) => f.path === to)) return - let next = moveFile(this.project, file.path, to) - // Platz im Diagramm und UML-Zusätze gehören jetzt zum neuen Namen. - const p = this.positions.get(old) - if (p && !this.positions.has(name)) this.positions.set(name, p) - for (const key of Object.keys(next.uml ?? {})) if (key.startsWith(`${old}.`)) next = { ...next, uml: renameInfo(next.uml!, key, name + key.slice(old.length)) } - this.openTabs = this.openTabs.map((t) => (t === file.path ? to : t)) - if (this.treeSelection === `file:${file.path}`) this.treeSelection = `file:${to}` - if (this.isOpen(`file:${file.path}`)) this.open.set(`file:${to}`, true) - this.project = next - this.active = to - store(activeKey, to) - this.savePositions() - this.refresh() - } - - private undo(redo: boolean) { - const from = redo ? this.future : this.history - const to = redo ? this.history : this.future - const snap = from.pop() - if (snap === undefined) return - to.push(this.snapshot()) - const data = JSON.parse(snap) as { project: JavaProject; active?: string } - this.project = data.project - this.active = data.active - this.lastTyping = 0 - this.showActive() - this.refresh() - } - - private refresh() { - store(projectKey, projectToJSON(this.project)) - this.renderTabs() - this.classes = projectClasses(this.project) - if (this.selection && !this.findClass(this.selection.cls)) this.selection = undefined - if (this.relSelection && !this.findRelation(this.relSelection) && !this.findDependency(this.relSelection)) this.relSelection = undefined - if (!this.editing) { - this.render() - this.renderTree() - } - } - - /** Eigene Klassen für Vorschläge nach dem Punkt; die offene Datei frisch aus dem Editor gelesen. */ - private ownTypesAt(pos: number): OwnTypes | undefined { - const file = this.activeFile - if (!file) return undefined - const text = this.editor.view.state.doc.toString() - const pkg = barePackage(packageOf(file.path)) - const mine = parseClasses(text).map((c) => ({ ...c, pkg })) - const names = new Set(mine.map((c) => c.name)) - const here = mine.find((c) => c.headerFrom <= pos && pos <= c.bodyEnd) - const lang = currentLanguage() === 'de' ? 'de' : currentLanguage() === 'pt-PT' ? 'pt' : 'en' - return ownTypes([...mine, ...this.classes.filter((c) => c.path !== file.path && !names.has(c.name))], { cls: here?.name, pkg }, lang) - } - - private findClass(name: string): ProjectClass | undefined { - return this.classes.find((c) => c.name === name) - } - - /** Cursor im Code: passende Klasse bzw. passendes Mitglied im Diagramm markieren. */ - private caretMoved() { - const pos = this.editor.caret - const cls = this.classes.find((c) => c.path === this.active && pos >= c.from && pos <= c.to) - const member = cls?.members.findIndex((m) => pos >= m.from && pos <= m.to) - const next = cls ? { cls: cls.name, member: member !== undefined && member >= 0 ? member : undefined } : undefined - if (next?.cls === this.selection?.cls && next?.member === this.selection?.member) return - this.selection = next - if (!this.editing) { - this.render() - this.renderTree() - } - } - - /** Klasse bzw. Mitglied im Code zeigen: Datei öffnen und markieren. */ - private showInCode(cls: ProjectClass, member?: UmlMember) { - if (cls.path !== this.active) { - this.active = cls.path - this.lastTyping = 0 - this.showActive() - } - const view = this.editor.view - const [from, to] = member ? [member.headerFrom, member.headerTo] : [cls.nameFrom, cls.nameTo] - const end = Math.min(to, view.state.doc.length) - view.dispatch({ selection: { anchor: Math.min(from, end), head: end }, scrollIntoView: true }) - } - - /** Meldung unter dem Diagramm: rot bei Fehlern, grau bei Hinweisen. */ - private message(text: string, hint = false) { - this.status.textContent = text - this.status.classList.toggle('hint', hint) - } - - // MARK: - Datei - - private openFiles() { - const input = document.createElement('input') - input.type = 'file' - input.multiple = true - input.accept = '.zip,.java,.visuobject,application/zip,text/plain' - input.addEventListener('change', () => void this.readFiles([...(input.files ?? [])])) - input.click() - } - - private async readFiles(files: File[]) { - if (files.length === 0) return - try { - const zip = files.find((f) => /\.zip$/i.test(f.name)) - if (zip) { - const { projectFromZip } = await import('./projectZip') - const project = projectFromZip(new Uint8Array(await zip.arrayBuffer()), zip.name.replace(/\.zip$/i, '')) - await this.newProject(project) - return - } - const saved = files.find((f) => /\.visuobject$/i.test(f.name)) - if (saved) { - const project = projectFromJSON(await saved.text()) - if (!project) throw new Error('format') - await this.newProject(project) - return - } - // Einzelne .java-Dateien kommen ins aktuelle Projekt (Package aus der `package`-Zeile). - const added = projectFromFiles(this.project.name, await Promise.all(files.map(async (f) => ({ name: f.name, text: await f.text() })))) - let next = this.project - for (const f of added.files) next = addFile(next, f.path, f.text) - this.setProject(next, added.files[0]?.path) - } catch { - this.message(t('web_visuobject_open_failed')) - } - } - - /** In den Workspace, ohne ihn als ZIP. */ - private async save() { - if (this.workspace) await this.writeCurrent() - else await this.downloadZip() - } - - /** Als ZIP wie in Eclipse oder BlueJ: `Projekt/src/paket/Klasse.java`. */ - private async downloadZip() { - const { projectToZip } = await import('./projectZip') - const data = projectToZip(this.project) - download(`${this.project.name || 'Projekt'}.zip`, data.slice().buffer, 'application/zip') - } - - // MARK: - Workspace - - /** Ungespeichert: das ganze Projekt oder eine Datei (nur mit Workspace). */ - private isDirty(path?: string): boolean { - if (!this.workspace || this.saved === undefined) return false - if (path === undefined) return this.saved !== projectToJSON(this.project) - return this.savedFiles.get(path) !== this.project.files.find((f) => f.path === path)?.text - } - - private markSaved() { - this.saved = projectToJSON(this.project) - this.savedFiles = new Map(this.project.files.map((f) => [f.path, f.text])) - } - - /** Beim Start: gemerkten Workspace wieder öffnen; braucht der Browser einen Klick, wartet ein Knopf. */ - private async restoreWorkspace() { - if (!canPickFolder()) return - const folder = await storedFolder(workspaceSlot) - if (folder?.ready) { - const ws = await reopenFolder(folder.handle) - if (ws) return this.useWorkspace(ws.root, true) - } - this.pendingFolder = folder?.handle - this.renderWorkspace() - } - - /** `restoring`: nach dem Neuladen; ungespeicherte Änderungen aus dem Browser bleiben dann erhalten. */ - private async useWorkspace(root: WsDir, restoring = false) { - this.workspace = root - this.pendingFolder = undefined - store(noWorkspaceKey, '0') - try { - this.projects = await listProjects(root) - const last = stored(wsProjectKey) - const local = this.project - if (restoring && last && this.projects.includes(last)) { - const view = { active: this.active, tabs: [...this.openTabs], positions: new Map(this.positions) } - await this.loadProject(last) - // Nach dem Neuladen wie vorher: dieselben Reiter und Kästen. - this.positions = view.positions - this.savePositions() - // Was seit dem letzten Speichern getippt wurde, steht noch im Browser (mit Workspace immer dessen Projekt). - if (projectToJSON(local) !== this.saved) { - this.project = local - } - this.openTabs = view.tabs.filter((p) => this.project.files.some((f) => f.path === p)) - this.active = this.project.files.some((f) => f.path === view.active) ? view.active : this.project.files[0]?.path - this.showActive() - this.refresh() - } else if (!this.projects.some((p) => p.toLowerCase() === safeFolderName(local.name).toLowerCase()) && local.files.length) { - // Das Projekt aus dem Browser kommt mit in den neuen Workspace. - this.folder = safeFolderName(local.name) - await this.writeCurrent(false) - } else if (this.projects.length) await this.loadProject(this.projects.includes(last ?? '') ? last! : this.projects[0]) - else { - this.folder = safeFolderName(local.name) - await this.writeCurrent(false) - } - } catch (err) { - this.message(t('web_visuobject_ws_failed', String((err as Error)?.message ?? err))) - } - this.renderWorkspace() - this.refresh() - } - - private async loadProject(name: string) { - const { project, positions } = await readProject(this.workspace!, name) - this.folder = name - this.project = project - this.markSaved() - this.message('') - this.history = [] - this.future = [] - this.lastTyping = 0 - this.selection = undefined - this.relSelection = undefined - this.treeSelection = undefined - this.currentPackage = undefined - this.positions = new Map(Object.entries(positions)) - this.savePositions() - this.openTabs = [] - this.active = project.files[0]?.path - store(wsProjectKey, name) - this.showActive() - this.refresh() - } - - /** Geöffnetes Projekt in seinen Ordner schreiben; nach dem Umbenennen zieht es in den neuen Ordner. */ - private async writeCurrent(report = true): Promise { - const root = this.workspace - if (!root) return false - const target = safeFolderName(this.project.name) - const old = this.folder - const names = new Set(this.classes.map((c) => c.name)) - const positions: Positions = Object.fromEntries([...this.positions].filter(([n]) => names.has(n))) - if (target !== old && this.projects.some((p) => p !== old && p.toLowerCase() === target.toLowerCase())) { - this.message(t('web_visuobject_ws_taken', this.project.name)) - return false - } - try { - await writeProject(root, target, this.project, positions) - if (old && old !== target && this.projects.includes(old)) await root.remove(old) - this.folder = target - this.projects = await listProjects(root) - store(wsProjectKey, target) - this.markSaved() - if (report) this.message(t('web_visuobject_ws_saved', root.name, target), true) - this.refresh() - return true - } catch (err) { - this.message(t('web_visuobject_ws_failed', String((err as Error)?.message ?? err))) - return false - } - } - - /** Anderes Projekt öffnen; das geöffnete wird vorher gespeichert (wie „Save all“ in Eclipse). */ - private async switchProject(name: string) { - if (!this.workspace || name === this.folder) return - if (this.isDirty() && !(await this.writeCurrent(false))) return - try { - await this.loadProject(name) - } catch (err) { - this.message(t('web_visuobject_ws_failed', String((err as Error)?.message ?? err))) - } - } - - /** Neu, Beispiel, ZIP öffnen: im Workspace ein eigenes Projekt, sonst ersetzt es das alte (mit Rückgängig). */ - private async newProject(project: JavaProject, active?: string, named = false) { - if (!this.workspace) { - this.setProject(project, active ?? project.files[0]?.path) - if (project.files.length === 0 && !named) this.editProjectName() - return - } - if (this.isDirty() && !(await this.writeCurrent(false))) return - const name = freeProjectName(safeFolderName(project.name), this.projects) - this.project = { ...project, name } - this.folder = name - this.history = [] - this.future = [] - this.openTabs = [] - this.positions.clear() - this.savePositions() - this.active = project.files.some((f) => f.path === active) ? active : project.files[0]?.path - this.showActive() - this.refresh() - if (!(await this.writeCurrent(false))) return - this.message(t('web_visuobject_ws_created', name), true) - if (project.files.length === 0 && !named) this.editProjectName() - } - - // MARK: - Neu (wie in Eclipse) - - /** Source Folder und Package, in die etwas Neues kommt: das markierte, sonst das der offenen Datei. */ - private get currentPlace(): { root: string; pkg: string } { - const key = this.currentPackage ?? (this.active ? packageOf(this.active) : (packagesOf(this.project)[0] ?? '')) - return { root: rootOf(key), pkg: barePackage(key) } - } - - private async newFromWizard(kind: NewKind) { - const here = this.currentPlace - const freeName = (base: string, taken: (n: string) => boolean) => { - let name = base - for (let n = 2; taken(name); n++) name = base + n - return name - } - const result = await newWizard(kind, { - roots: sourceFoldersOf(this.project), - packagesIn: (root) => packagesOf(this.project, root).map(barePackage), - classes: this.classes, - root: here.root, - pkg: here.pkg, - suggest: (k) => - k === 'project' - ? freeProjectName(t('web_visuobject_project_name'), this.workspace ? [...this.projects, this.folder ?? ''] : []) - : k === 'folder' - ? freeName('test', (n) => sourceFoldersOf(this.project).includes(n)) - : k === 'package' - ? freeName(t('web_visuobject_new_package_name'), (n) => packagesOf(this.project).includes(packageKey(here.root, n))) - : this.uniqueClassName(t(k === 'class' ? 'web_visuobject_new_class_name' : 'web_visuobject_new_interface_name')), - check: (k, name, root, pkg) => { - if (!name) return t('web_visuobject_new_name_missing') - if (k === 'project') return this.workspace && this.projects.some((p) => p !== this.folder && p.toLowerCase() === safeFolderName(name).toLowerCase()) ? t('web_visuobject_ws_taken', name) : undefined - if (k === 'folder') return !isFolderName(name) || sourceFoldersOf(this.project).includes(name) ? t('web_visuobject_bad_folder', name) : undefined - if (k === 'package') return !isPackageName(name) || packagesOf(this.project).includes(packageKey(root, name)) ? t('web_visuobject_bad_package', name) : undefined - if (!identifier.test(name)) return t('web_visuobject_bad_name', name) - if (this.findClass(name) || this.project.files.some((f) => f.path === pathFor(packageKey(root, pkg), `${name}.java`))) return t('web_visuobject_new_exists', name) - if (name.charAt(0) !== name.charAt(0).toUpperCase()) return t('web_visuobject_new_upper') - return undefined - }, - }) - if (!result) return - const { name, root, pkg } = result - if (kind === 'project') return this.newProject({ name, files: [], packages: [] }, undefined, true) - this.message('') - if (kind === 'folder') { - this.currentPackage = packageKey(name, '') - this.treeSelection = `root:${name}` - this.open.set(`root:${name}`, true) - return this.setProject(addSourceFolder(this.project, name)) - } - if (kind === 'package') { - const key = packageKey(root, name) - this.currentPackage = key - this.treeSelection = `pkg:${key}` - this.open.set(`root:${root}`, true) - return this.setProject(addPackage(this.project, key)) - } - const key = packageKey(root, pkg) - const path = pathFor(key, `${name}.java`) - this.currentPackage = key - this.selection = { cls: name } - this.open.set(`root:${root}`, true) - this.open.set(`pkg:${key}`, true) - this.setProject(addFile(this.project, path, this.sectioned(classSource(result.options!), name)), path) - const cls = this.findClass(name) - if (cls) this.showInCode(cls) - this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(name)}"]`)?.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - } - - /** Wie bei „+ Package“: Der Name des neuen Projekts ist gleich zum Überschreiben markiert. */ - private editProjectName() { - this.treeSelection = 'project' - this.renderTree() - this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label')) - } - - private renderWorkspace() { - const box = this.wsBox - box.hidden = !canPickFolder() - const save = this.shell.querySelector('[data-action=save]')! - save.dataset.tip = t(this.workspace ? 'web_visuobject_save_ws_tip' : 'web_visuobject_save_tip') - if (box.hidden) return - const btn = (action: string, label: string, cls = 'text-button', tip?: string) => - `` - if (this.workspace) { - box.className = 'vo-ws' - box.innerHTML = `${e(this.workspace.name)} - ${btn('zip', t('web_visuobject_ws_zip'), 'text-button', t('web_visuobject_ws_zip_tip'))} - ${btn('switch', t('web_visuobject_ws_switch'), 'text-button')}` - } else if (this.pendingFolder) { - box.className = 'vo-ws' - box.innerHTML = `${btn('reopen', t('web_visuobject_ws_reopen', this.pendingFolder.name), 'text-button primary')}${btn('switch', t('web_visuobject_ws_switch'), 'text-button')}` - } else if (stored(noWorkspaceKey) === '1') { - box.className = 'vo-ws' - box.innerHTML = btn('open', t('web_visuobject_ws_choose'), 'text-button', t('web_visuobject_ws_hint')) - } else { - box.className = 'vo-ws ask' - box.innerHTML = `

    ${e(t('web_visuobject_ws_question'))}

    -

    ${e(t('web_visuobject_ws_hint'))}

    - ${btn('create', t('web_visuobject_ws_create', workspaceFolderName), 'text-button primary')} - ${btn('open', t('web_visuobject_ws_open'))} - ${btn('skip', t('web_visuobject_ws_skip'))}` - } - } - - private async onWorkspaceClick(ev: MouseEvent) { - const action = (ev.target as HTMLElement).closest('[data-ws]')?.dataset.ws - if (!action) return - if (action === 'zip') return this.downloadZip() - if (action === 'skip') { - store(noWorkspaceKey, '1') - return this.renderWorkspace() - } - try { - if (action === 'reopen' && this.pendingFolder) { - const ws = await reopenFolder(this.pendingFolder) - if (ws) await this.useWorkspace(ws.root, true) - return - } - if (this.isDirty() && !(await this.writeCurrent(false))) return - const ws = await pickFolder(action === 'create' ? workspaceFolderName : undefined, workspaceSlot) - store(wsProjectKey, '') - await this.useWorkspace(ws.root) - } catch (err) { - // Abbrechen im Ordner-Dialog ist kein Fehler. - if ((err as DOMException)?.name !== 'AbortError') this.message(t('web_visuobject_ws_failed', String((err as Error)?.message ?? err))) - } - } - - // MARK: - Diagramm → Code - - /** Datei der Klasse ändern; sie wird dabei geöffnet. */ - private changeFile(path: string, run: (source: string) => string, select?: Selection) { - const file = this.project.files.find((f) => f.path === path) - if (!file) return - if (select) this.selection = select - this.message('') - this.setProject(updateFile(this.project, path, run(file.text)), path) - } - - private uniqueClassName(base: string): string { - let name = base - for (let n = 2; this.findClass(name) || this.project.files.some((f) => fileNameOf(f.path) === `${name}.java`); n++) name = base + n - return name - } - - private newClass(kind: 'class' | 'interface', at?: Point) { - const name = this.uniqueClassName(t(kind === 'class' ? 'web_visuobject_new_class_name' : 'web_visuobject_new_interface_name')) - if (at) { - this.positions.set(name, { x: Math.max(0, Math.round(at.x)), y: Math.max(0, Math.round(at.y)) }) - } - const pkg = this.currentPackage ?? (this.active ? packageOf(this.active) : (packagesOf(this.project)[0] ?? '')) - const path = pathFor(pkg, `${name}.java`) - this.selection = { cls: name } - this.open.set(`pkg:${pkg}`, true) - this.setProject(addFile(this.project, path, this.sectioned(classFileText(pkg, name, kind), name)), path) - this.savePositions() - const cls = this.findClass(name) - if (cls) this.showInCode(cls) - const box = this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(name)}"]`) - box?.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - this.startEditing(box?.querySelector('.uml-name') ?? null) - } - - /** Klasse umbenennen; heißt die Datei wie die Klasse, heißt sie danach wie der neue Name. */ - private renameClassTo(cls: ProjectClass, name: string) { - if (name === cls.name) return - if (!identifier.test(name) || this.findClass(name)) return this.message(t('web_visuobject_bad_name', name)) - const file = this.project.files.find((f) => f.path === cls.path)! - let next = updateFile(this.project, cls.path, renameClass(file.text, cls, name)) - let path = cls.path - if (fileNameOf(cls.path) === `${cls.name}.java`) { - path = pathFor(packageOf(cls.path), `${name}.java`) - if (!next.files.some((f) => f.path === path)) next = moveFile(next, cls.path, path) - else path = cls.path - } - const p = this.positions.get(cls.name) - if (p) this.positions.set(name, p) - for (const key of Object.keys(next.uml ?? {})) if (key.startsWith(`${cls.name}.`)) next = { ...next, uml: renameInfo(next.uml!, key, name + key.slice(cls.name.length)) } - this.selection = { cls: name } - this.message('') - this.setProject(next, path) - } - - /** Klasse löschen; bleibt in der Datei keine Klasse übrig, verschwindet die Datei. */ - private deleteClassFromProject(cls: ProjectClass) { - const file = this.project.files.find((f) => f.path === cls.path)! - const text = deleteClass(file.text, cls) - const empty = parseClasses(text).length === 0 - this.selection = undefined - this.message('') - this.setProject(empty ? removeFile(this.project, cls.path) : updateFile(this.project, cls.path, text)) - } - - /** Eingabe im Diagramm oder Explorer übernehmen. `target` sagt, was bearbeitet wurde. */ - private commit(target: HTMLElement, value: string) { - const text = value.trim() - const node = target.closest('[data-node]')?.dataset.node - if (node) return this.commitTree(node, text) - const box = target.closest('.uml-class') - const cls = box && this.findClass(box.dataset.class!) - if (!cls) return - if (target.classList.contains('uml-name')) return this.renameClassTo(cls, text) - const add = target.dataset.add - if (add) { - if (!text) return - const line = parseUmlLine(text) - if (!line) return this.message(t('web_visuobject_bad_line', text)) - // „+ Attribut“ ohne Klammern bleibt ein Attribut, „+ Methode“ ohne Klammern wird eine Methode. - const typed = add === 'method' && line.kind === 'field' ? `${text}()` : text - this.changeFile(cls.path, (s) => this.sorted(addMember(s, cls, typed), cls.name), { cls: cls.name }) - return - } - const index = Number(target.dataset.member) - const member = cls.members[index] - if (!member) return - if (!text) { - this.changeFile(cls.path, (s) => deleteMember(s, member), { cls: cls.name }) - return - } - if (text === umlText(member)) return - const line = parseUmlLine(text) - if (!line) return this.message(t('web_visuobject_bad_line', text)) - if (member.kind === 'field' && line.kind === 'field' && line.name !== member.name && this.project.uml?.[relationKey(cls.name, member.name)]) { - const file = this.project.files.find((f) => f.path === cls.path)! - this.selection = { cls: cls.name, member: index } - this.setProject({ ...updateFile(this.project, cls.path, replaceMember(file.text, cls, member, text)), uml: renameInfo(this.project.uml!, relationKey(cls.name, member.name), relationKey(cls.name, line.name)) }, cls.path) - return - } - this.changeFile(cls.path, (s) => replaceMember(s, cls, member, text), { cls: cls.name, member: index }) - } - - private commitTree(node: NodeId, text: string) { - const [kind, ...rest] = node.split(':') - const id = rest.join(':') - if (kind === 'project') { - if (!text || text === this.project.name) return - const taken = this.projects.some((p) => p !== this.folder && p.toLowerCase() === safeFolderName(text).toLowerCase()) - if (taken) return this.message(t('web_visuobject_ws_taken', text)) - this.setProject({ ...this.project, name: text }) - } else if (kind === 'root') { - if (!text || text === id || id === defaultRoot) return - if (!isFolderName(text) || sourceFoldersOf(this.project).includes(text)) return this.message(t('web_visuobject_bad_folder', text)) - if (this.currentPackage && rootOf(this.currentPackage) === id) this.currentPackage = packageKey(text, barePackage(this.currentPackage)) - this.treeSelection = `root:${text}` - const moved = (p?: string) => (p && rootOf(p) === id ? `${text}:${p.slice(id.length + 1)}` : p) - this.openTabs = this.openTabs.map((p) => moved(p)!) - this.setProject(renameSourceFolder(this.project, id, text), moved(this.active)) - } else if (kind === 'pkg') { - const to = packageKey(rootOf(id), text) - if (!text || to === id) return - if (!isPackageName(text) || packagesOf(this.project).includes(to)) return this.message(t('web_visuobject_bad_package', text)) - if (this.currentPackage === id) this.currentPackage = to - this.treeSelection = `pkg:${to}` - this.open.set(`pkg:${to}`, true) - this.setProject(renamePackage(this.project, id, to), this.active && packageOf(this.active) === id ? pathFor(to, fileNameOf(this.active)) : this.active) - } else if (kind === 'file') { - const name = text.replace(/\.java$/i, '') - const cls = this.classes.find((c) => c.path === id && `${c.name}.java` === fileNameOf(id)) - if (cls) return this.renameClassTo(cls, name) - if (!identifier.test(name)) return this.message(t('web_visuobject_bad_name', name)) - const to = pathFor(packageOf(id), `${name}.java`) - if (to !== id && !this.project.files.some((f) => f.path === to)) this.setProject(moveFile(this.project, id, to), to) - } else if (kind === 'class') { - const cls = this.findClass(id) - if (cls) this.renameClassTo(cls, text) - } - } - - private startEditing(target: HTMLElement | null) { - if (!target || this.editing) return - const isName = target.classList.contains('uml-name') || target.classList.contains('vo-label') - const input = document.createElement('input') - input.className = 'uml-input' - input.spellcheck = false - input.autocapitalize = 'off' - input.setAttribute('autocomplete', 'off') - input.setAttribute('aria-label', t(isName ? 'web_visuobject_name_label' : 'web_visuobject_member_label')) - if (target.dataset.add) input.placeholder = t(target.dataset.add === 'field' ? 'web_visuobject_field_ph' : 'web_visuobject_method_ph') - input.value = target.dataset.add ? '' : (target.dataset.value ?? target.textContent ?? '') - input.size = Math.max(input.value.length, input.placeholder.length, 8) - target.replaceChildren(input) - this.editing = true - let done = false - const finish = (keep: boolean) => { - if (done) return - done = true - this.editing = false - if (keep) this.commit(target, input.value) - this.render() - this.renderTree() - } - input.addEventListener('keydown', (ev) => { - ev.stopPropagation() - if (ev.key === 'Enter') finish(true) - else if (ev.key === 'Escape') finish(false) - }) - input.addEventListener('click', (ev) => ev.stopPropagation()) - input.addEventListener('input', () => (input.size = Math.max(input.value.length, input.placeholder.length, 8))) - input.addEventListener('blur', () => finish(true)) - input.focus() - input.select() - } - - private onKey(ev: KeyboardEvent) { - if ((ev.metaKey || ev.ctrlKey) && ev.key.toLowerCase() === 's') { - ev.preventDefault() - void this.save() - return - } - if (ev.key === 'Escape' && this.endPop) { - this.closeEnd() - return - } - if (ev.key === 'Escape' && this.tool !== 'select') { - this.setTool('select') - return - } - if (this.editing || this.editor.hasFocus) return - const target = ev.target as HTMLElement - if (this.diagramMode === 'object' && !target.closest('input, select, textarea') && !(ev.metaKey || ev.ctrlKey) && this.objectDiagram.onKey(ev)) return - if (target.closest('input, select, textarea, .vo-tree')) return - const mod = ev.metaKey || ev.ctrlKey - if (mod && ev.key.toLowerCase() === 'z') { - ev.preventDefault() - this.undo(ev.shiftKey) - return - } - if (!this.canvas.contains(document.activeElement) && document.activeElement !== document.body) return - if (this.noteSelection && this.findNote(this.noteSelection)) { - if (ev.key === 'Delete' || ev.key === 'Backspace') { - ev.preventDefault() - this.deleteNote(this.noteSelection) - } else if (ev.key === 'Enter' || ev.key === 'F2') { - ev.preventDefault() - this.editNote(this.noteSelection) - } - return - } - if (this.relSelection && (ev.key === 'Delete' || ev.key === 'Backspace')) { - ev.preventDefault() - this.deleteRelation(this.relSelection) - return - } - const sel = this.selection - const cls = sel && this.findClass(sel.cls) - if (!cls) return - if (ev.key === 'Delete' || ev.key === 'Backspace') { - ev.preventDefault() - const member = sel.member !== undefined ? cls.members[sel.member] : undefined - if (member) this.changeFile(cls.path, (s) => deleteMember(s, member), { cls: cls.name }) - else this.deleteClassFromProject(cls) - } else if (ev.key === 'Enter' || ev.key === 'F2') { - ev.preventDefault() - const box = this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(cls.name)}"]`) - this.startEditing(box?.querySelector(sel.member !== undefined ? `[data-member="${sel.member}"]` : '.uml-name') ?? null) - } - } - - // MARK: - Package Explorer - - private isOpen(id: NodeId): boolean { - // Projekt, src, Packages und Klassen offen; Dateien zu, außer der geöffneten. Andere Projekte öffnet erst ein Klick. - if (id.startsWith('wsproject:')) return false - const value = this.open.get(id) - if (value !== undefined) return value - if (id.startsWith('file:')) return id === `file:${this.active}` - return true - } - - private toggle(id: NodeId) { - this.open.set(id, !this.isOpen(id)) - store(treeKey, JSON.stringify(Object.fromEntries(this.open))) - this.renderTree() - } - - private renderTree() { - const focused = (document.activeElement as HTMLElement | null)?.closest('[data-node]')?.dataset.node - const sel = this.treeSelection ?? (this.selection ? `class:${this.selection.cls}` : this.active ? `file:${this.active}` : undefined) - const row = (id: NodeId, depth: number, badge: string, label: string, opts: { children?: string; value?: string; extra?: string; title?: string; action?: boolean } = {}) => { - const hasChildren = opts.children !== undefined - const isOpen = hasChildren && this.isOpen(id) - const selected = id === sel - return `
  • -
    - ${hasChildren ? `` : ''} - ${badge}${e(label)}${opts.extra ?? ''} - ${opts.action ? `` : ''} -
    - ${isOpen && opts.children ? `
      ${opts.children}
    ` : ''} -
  • ` - } - const memberRow = (cls: ProjectClass, m: UmlMember, i: number, depth: number) => { - const vis = { '+': 'public', '-': 'private', '#': 'protected', '~': 'package' }[m.visibility] - const params = m.params.map((p) => p.type).join(', ') - const label = m.kind === 'field' ? m.name : `${m.name}(${params})` - const type = m.kind === 'constructor' ? '' : `: ${e(m.type)}` - return row(`member:${cls.name}:${i}`, depth, ``, label, { extra: type, title: umlText(m) }) - } - const classRow = (cls: ProjectClass, depth: number) => { - const letter = cls.kind === 'interface' ? 'I' : cls.isAbstract ? 'A' : 'C' - const members = cls.members.map((m, i) => memberRow(cls, m, i, depth + 1)).join('') - return row(`class:${cls.name}`, depth, ``, cls.name, { children: members }) - } - const fileRow = (path: string, depth: number) => { - const inFile = this.classes.filter((c) => c.path === path) - return row(`file:${path}`, depth, '', fileNameOf(path), { children: inFile.map((c) => classRow(c, depth + 1)).join(''), action: true }) - } - const packagesIn = (root: string) => - packagesOf(this.project, root) - .map((pkg) => { - const files = filesIn(this.project, pkg).map((f) => fileRow(f.path, 3)).join('') - const bare = barePackage(pkg) - const label = bare || t('web_visuobject_default_package') - return row(`pkg:${pkg}`, 2, ``, label, { children: files, value: bare, action: true }) - }) - .join('') - // Source Folders wie in Eclipse: `src`, dazu z. B. `test`. - const src = sourceFoldersOf(this.project) - .map((root) => - row(`root:${root}`, 1, '', root, { - children: packagesIn(root) || `
  • ${e(t('web_visuobject_tree_empty'))}
  • `, - action: root !== defaultRoot, - }), - ) - .join('') - const current = row('project', 0, '', this.project.name, { children: src, extra: this.isDirty() ? ` ●` : '' }) - // Im Workspace stehen alle Projekte untereinander wie in Eclipse; nur das geöffnete klappt auf. - const others = this.workspace ? this.projects.filter((p) => p !== this.folder) : [] - const all = [...others.map((name) => ({ name, html: row(`wsproject:${name}`, 0, '', name, { children: '', title: t('web_visuobject_ws_open_project', name) }) })), { name: this.folder ?? this.project.name, html: current }] - all.sort((a, b) => a.name.localeCompare(b.name)) - this.tree.innerHTML = `
      ${all.map((x) => x.html).join('')}
    ` - if (!this.tree.querySelector('[tabindex="0"]')) this.tree.querySelector('.vo-row')?.setAttribute('tabindex', '0') - if (focused) this.tree.querySelector(`[data-node="${CSS.escape(focused)}"] > .vo-row`)?.focus({ preventScroll: true }) - } - - private treeClick = { node: '', time: 0 } - - private onTreeClick(ev: MouseEvent) { - if (this.editing) return - const target = ev.target as HTMLElement - const item = target.closest('[data-node]') - const id = item?.dataset.node - if (!item || !id) return - if (target.closest('[data-toggle]')) return id.startsWith('wsproject:') ? void this.switchProject(id.slice(10)) : this.toggle(id) - if (target.closest('[data-delete]')) return this.deleteNode(id) - // Doppelklick selbst erkennen (der erste Klick zeichnet neu): Name ändern. - const now = Date.now() - const twice = this.treeClick.node === id && now - this.treeClick.time < 450 - this.treeClick = { node: id, time: twice ? 0 : now } - if (twice && !id.startsWith('member:') && !id.startsWith('wsproject:') && id !== `root:${defaultRoot}`) { - this.startEditing(this.tree.querySelector(`[data-node="${CSS.escape(id)}"] > .vo-row .vo-label`)) - return - } - this.selectNode(id) - } - - private selectNode(id: NodeId) { - const [kind, ...rest] = id.split(':') - const value = rest.join(':') - this.treeSelection = undefined - if (kind === 'wsproject') return void this.switchProject(value) - if (kind === 'pkg') { - this.currentPackage = value - this.treeSelection = id - } else if (kind === 'file') { - this.currentPackage = packageOf(value) - this.treeSelection = id - this.openFile(value) - } else if (kind === 'class' || kind === 'member') { - const [name, index] = value.split(':') - const cls = this.findClass(name) - if (!cls) return - const member = index !== undefined ? cls.members[Number(index)] : undefined - this.selection = { cls: cls.name, member: index !== undefined ? Number(index) : undefined } - this.currentPackage = packageOf(cls.path) - this.showInCode(cls, member) - if (index !== undefined) this.treeSelection = id - } else { - this.treeSelection = id - } - this.render() - this.renderTree() - } - - private deleteNode(id: NodeId) { - const [kind, ...rest] = id.split(':') - const value = rest.join(':') - this.treeSelection = undefined - if (kind === 'file') this.setProject(removeFile(this.project, value)) - else if (kind === 'root') { - if (this.currentPackage && rootOf(this.currentPackage) === value) this.currentPackage = undefined - this.setProject(removeSourceFolder(this.project, value)) - } - else if (kind === 'pkg') { - if (this.currentPackage === value) this.currentPackage = undefined - this.setProject(removePackage(this.project, value)) - } - } - - /** Pfeiltasten wie in einem Dateibaum: hoch/runter, rechts öffnet, links schließt, Eingabe wählt. */ - private onTreeKey(ev: KeyboardEvent) { - if (this.editing) return - const rows = [...this.tree.querySelectorAll('.vo-row')] - const current = (document.activeElement as HTMLElement | null)?.closest('.vo-row') - const index = current ? rows.indexOf(current) : -1 - const id = current?.closest('[data-node]')?.dataset.node - const focus = (i: number) => { - const next = rows[Math.max(0, Math.min(rows.length - 1, i))] - for (const r of rows) r.tabIndex = -1 - next.tabIndex = 0 - next.focus() - } - if (ev.key === 'ArrowDown') focus(index + 1) - else if (ev.key === 'ArrowUp') focus(index - 1) - else if (id && ev.key === 'ArrowRight' && current?.querySelector('[data-toggle]') && !this.isOpen(id)) this.toggle(id) - else if (id && ev.key === 'ArrowLeft' && current?.querySelector('[data-toggle]') && this.isOpen(id)) this.toggle(id) - else if (id && ev.key === 'Enter') this.selectNode(id) - else if (id && ev.key === 'F2') this.startEditing(current!.querySelector('.vo-label')) - else if (id && (ev.key === 'Delete' || ev.key === 'Backspace') && current?.querySelector('[data-delete]')) this.deleteNode(id) - else return - ev.preventDefault() - } - - // MARK: - Maus im Diagramm - - private drag?: { name: string; box: HTMLElement; start: Point; origin: Point; moved: boolean } - - private onPointerDown(ev: PointerEvent) { - this.closeEnd() - const target = ev.target as HTMLElement - if (this.tool !== 'select' && ev.button === 0 && !target.closest('.vo-dock, .vo-relmenu, input, select, button:not(.uml-connect)')) { - this.suppressClick = true - return this.useTool(ev) - } - const noteHandle = target.closest('[data-note-connect]') - if (noteHandle && ev.button === 0) return this.startNoteConnect(ev, noteHandle.closest('.uml-note')!.dataset.note!) - const noteBox = target.closest('.uml-note') - if (noteBox && ev.button === 0 && !target.closest('textarea')) return this.dragNote(ev, noteBox) - const handle = target.closest('[data-connect]') - if (handle && ev.button === 0) return this.startConnect(ev, handle.closest('.uml-class')!.dataset.class!) - if (target.closest('input, select, button, label')) return - const box = target.closest('.uml-class') - if (!box || ev.button !== 0) return - const origin = this.positions.get(box.dataset.class!) ?? { x: box.offsetLeft, y: box.offsetTop } - this.drag = { name: box.dataset.class!, box, start: { x: ev.clientX, y: ev.clientY }, origin, moved: false } - const move = (m: PointerEvent) => { - const d = this.drag - if (!d) return - const dx = m.clientX - d.start.x - const dy = m.clientY - d.start.y - if (!d.moved && Math.hypot(dx, dy) < 4) return - d.moved = true - const p = { x: Math.max(0, Math.round(d.origin.x + dx)), y: Math.max(0, Math.round(d.origin.y + dy)) } - this.positions.set(d.name, p) - d.box.style.left = `${p.x}px` - d.box.style.top = `${p.y}px` - this.drawLines() - } - const up = () => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - if (this.drag?.moved) this.savePositions() - // Klick nach dem Ziehen nicht als Auswahl werten. - setTimeout(() => (this.drag = undefined), 0) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - private lastClick = { spot: '', time: 0 } - - private onClick(ev: MouseEvent) { - if (this.suppressClick) { - this.suppressClick = false - return - } - if (this.drag?.moved || this.editing) return - const target = ev.target as HTMLElement - if (target.closest('input, select, label, textarea')) return - const noteEl = target.closest('.uml-note') - if (noteEl) { - const id = noteEl.dataset.note! - const now = Date.now() - const twice = this.lastClick.spot === `note|${id}` && now - this.lastClick.time < 450 - this.lastClick = { spot: `note|${id}`, time: twice ? 0 : now } - if (twice) return this.editNote(id) - return this.selectNote(id) - } - this.noteSelection = undefined - const action = target.closest('[data-class-action]') - const box = target.closest('.uml-class') - const cls = box && this.findClass(box.dataset.class!) - if (action && cls) { - if (action.dataset.classAction === 'delete') this.deleteClassFromProject(cls) - return - } - const add = target.closest('[data-add]') - if (add) { - this.startEditing(add) - return - } - const rel = target.closest('[data-rel]')?.dataset.rel - const endEl = target.closest('[data-end]') - if (rel && !cls && endEl && this.relSelection === rel) { - this.openEnd(rel, endEl.dataset.end as 'a' | 'b', ev, endEl.dataset.part as 'role' | 'mult' | undefined) - return - } - if (rel && !cls) { - this.selectRelation(rel) - return - } - if (!cls) { - this.relSelection = undefined - this.selection = undefined - this.render() - this.renderTree() - return - } - const row = target.closest('[data-member]') - const index = row ? Number(row.dataset.member) : undefined - // Doppelklick selbst erkennen: Der erste Klick zeichnet neu, dann meldet der Browser kein `dblclick`. - const spot = `${cls.name}|${index ?? (target.closest('.uml-name') ? 'name' : '')}` - const now = Date.now() - const twice = spot === this.lastClick.spot && now - this.lastClick.time < 450 && !spot.endsWith('|') - this.lastClick = { spot, time: twice ? 0 : now } - if (twice) { - const again = this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(cls.name)}"]`) - this.startEditing(again?.querySelector(index !== undefined ? `[data-member="${index}"]` : '.uml-name') ?? null) - return - } - this.selection = { cls: cls.name, member: index } - this.relSelection = undefined - this.treeSelection = undefined - this.currentPackage = packageOf(cls.path) - this.showInCode(cls, index !== undefined ? cls.members[index] : undefined) - this.render() - this.renderTree() - this.canvas.focus({ preventScroll: true }) - } - - // MARK: - Zeichnen - - private setDiagramMode(mode: DiagramMode) { - this.diagramMode = mode - store(diagramModeKey, mode) - this.setTool('select') - this.render() - } - - /** Umschalter, Werkzeuge und Fläche passend zum Diagramm zeigen. */ - private showDiagramMode() { - const object = this.diagramMode === 'object' - const cls = this.diagramMode === 'class' - for (const b of this.shell.querySelectorAll('[data-diagram]')) b.setAttribute('aria-selected', String(b.dataset.diagram === this.diagramMode)) - this.shell.querySelector('.vo-palette:not(.vo-obj-palette)')!.hidden = !cls - this.shell.querySelector('.vo-obj-palette')!.hidden = !object - this.canvas.hidden = !cls - this.shell.querySelector('.vo-objcanvas')!.hidden = !object - this.shell.querySelector('.vo-seqcanvas')!.hidden = this.diagramMode !== 'sequence' - this.shell.querySelector('[data-action=layout]')!.hidden = !cls - if (object) { - const select = this.shell.querySelector('[data-obj-class]')! - const names = [...new Set(this.classes.filter((c) => c.kind === 'class' && !c.isAbstract).map((c) => c.name))] - const keep = names.includes(select.value) ? select.value : names[0] - select.innerHTML = names.map((n) => `${e(n)}`).join('') - this.shell.querySelector('[data-obj-add]')!.disabled = names.length === 0 - } - } - - private savePositions() { - const names = new Set(this.classes.map((c) => c.name)) - store(positionsKey, JSON.stringify(Object.fromEntries([...this.positions].filter(([n]) => names.has(n))))) - } - - private render() { - this.showDiagramMode() - if (this.diagramMode === 'object') return this.objectDiagram.render() - if (this.diagramMode === 'sequence') return this.renderSequence() - for (const old of this.canvas.querySelectorAll('.uml-class, .uml-note, .vo-empty')) old.remove() - for (const note of this.project.notes ?? []) this.canvas.append(this.noteBox(note)) - if (this.classes.length === 0) { - const empty = document.createElement('p') - empty.className = 'vo-empty' - empty.textContent = t('web_visuobject_empty') - if (!this.project.notes?.length) this.canvas.append(empty) - this.drawLines() - return - } - const boxes = new Map() - for (const cls of this.classes) { - if (boxes.has(cls.name)) continue - const box = this.classBox(cls) - boxes.set(cls.name, box) - this.canvas.append(box) - } - this.placeNew(boxes) - this.drawLines() - } - - // MARK: - Notizen - - /** UML-Notiz: Kasten mit Eselsohr, Text wie getippt (Zeilenumbrüche bleiben). */ - private noteBox(note: UmlNote): HTMLElement { - const box = document.createElement('div') - const selected = this.noteSelection === note.id - box.className = `uml-note${selected ? ' selected' : ''}` - box.dataset.note = note.id - box.style.left = `${note.x}px` - box.style.top = `${note.y}px` - box.innerHTML = `${selected ? `` : ''}
    ${e(note.text || t('web_visuobject_note_ph'))}
    ` - return box - } - - private findNote(id: string | undefined): UmlNote | undefined { - return id ? this.project.notes?.find((n) => n.id === id) : undefined - } - - private setNotes(notes: UmlNote[]) { - this.setProject({ ...this.project, notes: notes.length ? notes : undefined }) - } - - private changeNote(id: string, change: Partial) { - this.setNotes((this.project.notes ?? []).map((n) => (n.id === id ? { ...n, ...change } : n))) - } - - private addNote(at: Point) { - const id = `n${Date.now().toString(36)}` - this.noteSelection = id - this.selection = undefined - this.relSelection = undefined - this.setNotes([...(this.project.notes ?? []), { id, text: '', x: Math.max(0, Math.round(at.x)), y: Math.max(0, Math.round(at.y)) }]) - this.editNote(id) - } - - private deleteNote(id: string) { - this.noteSelection = undefined - this.setNotes((this.project.notes ?? []).filter((n) => n.id !== id)) - } - - private selectNote(id: string) { - this.noteSelection = id - this.selection = undefined - this.relSelection = undefined - this.treeSelection = undefined - this.render() - this.renderTree() - this.canvas.focus({ preventScroll: true }) - } - - /** Text direkt im Kasten ändern; Strg+Enter oder Klick daneben übernimmt, Esc bricht ab. */ - private editNote(id: string) { - const note = this.findNote(id) - const box = this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(id)}"]`) - if (!note || !box) return - const area = document.createElement('textarea') - area.className = 'uml-note-edit' - area.value = note.text - area.placeholder = t('web_visuobject_note_ph') - area.rows = Math.max(3, note.text.split('\n').length + 1) - box.querySelector('.uml-note-text')!.replaceWith(area) - this.editing = true - let done = false - const finish = (keep: boolean) => { - if (done) return - done = true - this.editing = false - if (keep && area.value !== note.text) this.changeNote(id, { text: area.value }) - else this.render() - } - area.addEventListener('keydown', (ev) => { - ev.stopPropagation() - if (ev.key === 'Escape') finish(false) - else if (ev.key === 'Enter' && (ev.metaKey || ev.ctrlKey)) finish(true) - }) - area.addEventListener('blur', () => finish(true)) - area.focus() - } - - /** Vom Griff an der Notiz zu einer Klasse ziehen: gestrichelte Linie, wie in Astah. */ - private startNoteConnect(ev: PointerEvent, id: string) { - ev.preventDefault() - const box = this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(id)}"]`)! - const ghost = document.createElementNS('http://www.w3.org/2000/svg', 'line') - ghost.setAttribute('class', 'vo-rel vo-note-link ghost') - this.lines.append(ghost) - const start = { x: box.offsetLeft + box.offsetWidth, y: box.offsetTop + box.offsetHeight / 2 } - const targetAt = (m: PointerEvent) => document.elementFromPoint(m.clientX, m.clientY)?.closest('.uml-class') ?? undefined - const move = (m: PointerEvent) => { - const r = this.canvas.getBoundingClientRect() - ghost.setAttribute('x1', String(start.x)) - ghost.setAttribute('y1', String(start.y)) - ghost.setAttribute('x2', String(m.clientX - r.left + this.canvas.scrollLeft)) - ghost.setAttribute('y2', String(m.clientY - r.top + this.canvas.scrollTop)) - for (const el of this.canvas.querySelectorAll('.uml-class.drop')) el.classList.remove('drop') - targetAt(m)?.classList.add('drop') - } - const up = (m: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - ghost.remove() - const target = targetAt(m) - target?.classList.remove('drop') - this.suppressClick = true - const note = this.findNote(id) - const cls = target?.dataset.class - if (note && cls && !note.attach?.includes(cls)) this.changeNote(id, { attach: [...(note.attach ?? []), cls] }) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - private dragNote(ev: PointerEvent, box: HTMLElement) { - const note = this.findNote(box.dataset.note) - if (!note) return - const start = { x: ev.clientX, y: ev.clientY } - let moved = false - let p = { x: note.x, y: note.y } - const move = (m: PointerEvent) => { - const dx = m.clientX - start.x - const dy = m.clientY - start.y - if (!moved && Math.hypot(dx, dy) < 4) return - moved = true - p = { x: Math.max(0, Math.round(note.x + dx)), y: Math.max(0, Math.round(note.y + dy)) } - box.style.left = `${p.x}px` - box.style.top = `${p.y}px` - this.drawLines() - } - const up = () => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - if (!moved) return - this.suppressClick = true - this.changeNote(note.id, p) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - /** Gestrichelte Linien von Notizen zu ihren Klassen. */ - private noteLinksSVG(boxes: Map): string { - const out: string[] = [] - for (const note of this.project.notes ?? []) { - const nb = this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(note.id)}"]`) - if (!nb) continue - for (const cls of note.attach ?? []) { - const cb = boxes.get(cls) - if (!cb) continue - const ra = { x: nb.offsetLeft, y: nb.offsetTop, w: nb.offsetWidth, h: nb.offsetHeight } - const rb = { x: cb.offsetLeft, y: cb.offsetTop, w: cb.offsetWidth, h: cb.offsetHeight } - const ca = { x: ra.x + ra.w / 2, y: ra.y + ra.h / 2 } - const cc = { x: rb.x + rb.w / 2, y: rb.y + rb.h / 2 } - const a = edgePoint(ra, ca, cc) - const b = edgePoint(rb, cc, ca) - out.push(``) - } - } - return out.join('') - } - - private renderNoteInspector(note: UmlNote) { - this.inspector.dataset.rel = `note:${note.id}` - const classes = [...new Set(this.classes.map((c) => c.name))] - this.inspector.innerHTML = ` -

    ${e(t('web_visuobject_tool_note'))}

    - - ${classes.length ? `
    ${e(t('web_visuobject_note_attached'))}${classes.map((c) => ``).join('')}
    ` : ''} -
    ` - this.inspector.querySelector('[data-field=note-text]')!.addEventListener('change', (ev) => this.changeNote(note.id, { text: (ev.target as HTMLTextAreaElement).value })) - for (const box of this.inspector.querySelectorAll('[data-field=note-attach]')) - box.addEventListener('change', () => { - const attach = [...this.inspector.querySelectorAll('[data-field=note-attach]')].filter((b) => b.checked).map((b) => b.value) - this.changeNote(note.id, { attach: attach.length ? attach : undefined }) - }) - this.inspector.querySelector('[data-inspector=delete-note]')!.addEventListener('click', () => this.deleteNote(note.id)) - } - - private classBox(cls: ProjectClass): HTMLElement { - const sel = this.selection?.cls === cls.name ? this.selection : undefined - const box = document.createElement('div') - box.className = `uml-class${sel ? ' selected' : ''}${cls.kind === 'interface' ? ' interface' : ''}${cls.isAbstract ? ' abstract' : ''}` - box.dataset.class = cls.name - const p = this.positions.get(cls.name) - if (p) { - box.style.left = `${p.x}px` - box.style.top = `${p.y}px` - } - const row = (m: UmlMember, i: number) => { - const text = umlText(m) - const cls2 = `uml-member${m.isStatic ? ' static' : ''}${m.isAbstract ? ' abstract' : ''}${sel?.member === i ? ' selected' : ''}` - return `
  • ${e(text)}
  • ` - } - // Referenzattribute bleiben im Kasten, wie in Astah; die Linie trägt keine Rolle. - const fields = cls.members.map((m, i) => (m.kind === 'field' ? row(m, i) : '')).join('') - const methods = cls.members.map((m, i) => (m.kind !== 'field' ? row(m, i) : '')).join('') - const add = (kind: 'field' | 'method') => - sel ? `
  • ${e(t(kind === 'field' ? 'web_visuobject_add_field' : 'web_visuobject_add_method'))}
  • ` : '' - box.innerHTML = ` - ${sel && sel.member === undefined ? `` : ''} -
    ${cls.kind === 'interface' ? '«interface»' : cls.isAbstract ? '{abstract}' : ''}${e(cls.name)}
    - ${cls.kind === 'interface' && !fields ? '' : `
      ${fields}${add('field')}
    `} -
      ${methods}${add('method')}
    ` - return box - } - - /** - * Klassen ohne Position anordnen: jedes Package als eigener Block, die Blöcke nebeneinander, - * solange sie in die Breite passen, sonst darunter. Im Block stehen Oberklassen und Interfaces oben. - * Eine neue Klasse in einem schon gezeichneten Package kommt neben ihre Geschwister. - */ - private placeNew(boxes: Map) { - if (this.classes.every((c) => this.positions.has(c.name))) return - const parents = (c: ProjectClass) => [c.superclass, ...c.interfaces].filter((n): n is string => !!n && boxes.has(n)) - const level = new Map() - const depth = (c: ProjectClass, seen: Set): number => { - if (level.has(c.name)) return level.get(c.name)! - if (seen.has(c.name)) return 0 - seen.add(c.name) - // Nur Eltern im selben Package zählen für die Ebene im Block. - const up = parents(c) - .map((n) => this.findClass(n)!) - .filter((p) => p.pkg === c.pkg) - .map((p) => depth(p, seen)) - const d = up.length ? Math.max(...up) + 1 : 0 - level.set(c.name, d) - return d - } - for (const c of this.classes) depth(c, new Set()) - type Rect = { x: number; y: number; w: number; h: number } - const gap = 48 - const width = Math.max(this.canvas.clientWidth, 400) - 24 - const apart = (a: Rect, b: Rect, m: number) => a.x + a.w + m <= b.x || b.x + b.w + m <= a.x || a.y + a.h + m <= b.y || b.y + b.h + m <= a.y - const size = (c: ProjectClass) => ({ w: boxes.get(c.name)!.offsetWidth, h: boxes.get(c.name)!.offsetHeight }) - const put = (c: ProjectClass, x: number, y: number) => { - this.positions.set(c.name, { x, y }) - const box = boxes.get(c.name)! - box.style.left = `${x}px` - box.style.top = `${y}px` - } - // Rahmen eines Packages mit Reiter: 16 px Rand, oben 24 px mehr für den Namen. - const frameOf = (pkg: string): Rect | undefined => { - const rs = this.classes.filter((c) => c.pkg === pkg && boxes.has(c.name) && this.positions.has(c.name)).map((c) => ({ ...this.positions.get(c.name)!, ...size(c) })) - if (rs.length === 0) return undefined - const x = Math.min(...rs.map((r) => r.x)) - 16 - const y = Math.min(...rs.map((r) => r.y)) - 40 - return { x, y, w: Math.max(...rs.map((r) => r.x + r.w)) + 16 - x, h: Math.max(...rs.map((r) => r.y + r.h)) + 16 - y } - } - const packages = this.diagramPackages().filter((pkg) => this.classes.some((c) => c.pkg === pkg && boxes.has(c.name))) - for (const pkg of packages) { - const fresh = this.classes.filter((c) => c.pkg === pkg && boxes.has(c.name) && !this.positions.has(c.name)) - if (fresh.length === 0) continue - const others = packages.filter((p) => p !== pkg).map(frameOf).filter((r): r is Rect => !!r) - const own = frameOf(pkg) - if (own) { - // Neben die Geschwister, ohne in ein anderes Package zu ragen. - for (const c of fresh) { - const { w, h } = size(c) - const taken = this.classes.filter((o) => o.pkg === pkg && this.positions.has(o.name) && boxes.has(o.name)).map((o) => ({ ...this.positions.get(o.name)!, ...size(o) })) - let spot: { x: number; y: number } | undefined - for (let y = own.y + 40; !spot && y < own.y + 4000; y += 20) - for (let x = own.x + 16; x === own.x + 16 || x + w <= width; x += 20) { - const r = { x, y, w, h } - const outer = { x: x - 16, y: y - 40, w: w + 32, h: h + 56 } - if (taken.every((t) => apart(r, t, gap)) && others.every((o) => apart(outer, o, 24))) { - spot = { x, y } - break - } - } - spot ??= { x: own.x + 16, y: own.y + own.h + gap } - put(c, spot.x, spot.y) - } - continue - } - // Ganzer Block: Reihen nach Ebene, in der Reihe nebeneinander. - const rows: ProjectClass[][] = [] - for (const c of fresh) (rows[level.get(c.name)!] ??= []).push(c) - const local = new Map() - let y = 0 - let blockW = 0 - for (const row of rows) { - if (!row) continue - let x = 0 - let rowH = 0 - for (const c of row) { - const { w, h } = size(c) - local.set(c.name, { x, y }) - // Breiter Abstand nebeneinander: Platz für Rolle und Multiplizität an der Linie. - x += w + gap * 3 - rowH = Math.max(rowH, h) - } - blockW = Math.max(blockW, x - gap * 3) - y += rowH + gap * 1.5 - } - const blockH = y - gap * 1.5 - const outerW = blockW + 32 - const outerH = blockH + 56 - let spot: { x: number; y: number } | undefined - for (let oy = 4; !spot && oy < 20000; oy += 20) - for (let ox = 16; ox === 16 || ox + outerW <= width; ox += 20) - if (others.every((o) => apart({ x: ox, y: oy, w: outerW, h: outerH }, o, 32))) { - spot = { x: ox, y: oy } - break - } - spot ??= { x: 16, y: 4 } - for (const c of fresh) put(c, spot.x + 16 + local.get(c.name)!.x, spot.y + 40 + local.get(c.name)!.y) - } - this.savePositions() - } - - private drawLines() { - const boxes = new Map() - for (const b of this.canvas.querySelectorAll('.uml-class')) boxes.set(b.dataset.class!, b) - let width = 0 - let height = 0 - for (const b of boxes.values()) { - width = Math.max(width, b.offsetLeft + b.offsetWidth + 40) - height = Math.max(height, b.offsetTop + b.offsetHeight + 40) - } - for (const svg of [this.lines, this.frames]) { - svg.setAttribute('width', String(width)) - svg.setAttribute('height', String(height)) - } - this.frames.innerHTML = this.packageFrames(boxes) - const parts: string[] = [ - ` - - - `, - ] - const assocs = associations(this.classes, this.project.uml) - const gens = generalizations(this.classes) - // Mehrere Linien zwischen denselben Klassen leicht versetzen. - const pairCount = new Map() - const offset = (a: string, b: string) => { - const key = [a, b].sort().join('|') - const n = pairCount.get(key) ?? 0 - pairCount.set(key, n + 1) - return n * 16 - } - for (const g of gens) { - const a = boxes.get(g.from) - const b = boxes.get(g.to) - if (a && b && a !== b) parts.push(this.generalizationSVG(g, a, b, offset(g.from, g.to))) - } - for (const r of this.shownAssociations(assocs)) { - const a = boxes.get(r.from) - const b = boxes.get(r.to) - if (a && b && a !== b) parts.push(this.associationSVG(r, a, b, offset(r.from, r.to))) - } - for (const d of this.dependencies()) { - const a = boxes.get(d.from) - const b = boxes.get(d.to) - if (a && b && a !== b) parts.push(this.dependencySVG(d, a, b, offset(d.from, d.to))) - } - parts.push(this.noteLinksSVG(boxes)) - this.lines.innerHTML = parts.join('') - this.renderInspector() - } - - /** Java-Packages fürs Diagramm: Gleich benannte Packages in `src` und `test` sind dasselbe Package. */ - private diagramPackages(): string[] { - return [...new Set(packagesOf(this.project).map(barePackage))] - } - - /** UML-Package: Rahmen um seine Klassen mit Reiter oben links. */ - private packageFrames(boxes: Map): string { - const out: string[] = [] - for (const pkg of this.diagramPackages()) { - if (!pkg) continue - const els = this.classes.filter((c) => c.pkg === pkg).map((c) => boxes.get(c.name)).filter((b): b is HTMLElement => !!b) - if (els.length === 0) continue - const x = Math.min(...els.map((b) => b.offsetLeft)) - 16 - const y = Math.min(...els.map((b) => b.offsetTop)) - 16 - const right = Math.max(...els.map((b) => b.offsetLeft + b.offsetWidth)) + 16 - const bottom = Math.max(...els.map((b) => b.offsetTop + b.offsetHeight)) + 16 - const tab = Math.max(70, pkg.length * 7.6 + 20) - const current = this.currentPackage !== undefined && barePackage(this.currentPackage) === pkg ? ' current' : '' - out.push(` - - - ${e(pkg)} - `) - } - return out.join('') - } - - /** Linie zwischen den Rändern zweier Kästen, senkrecht um `offset` versetzt. */ - private segment(a: HTMLElement, b: HTMLElement, offset: number) { - const rect = (el: HTMLElement) => ({ x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight }) - const ra = rect(a) - const rb = rect(b) - const ca = { x: ra.x + ra.w / 2, y: ra.y + ra.h / 2 } - const cb = { x: rb.x + rb.w / 2, y: rb.y + rb.h / 2 } - const len = Math.hypot(cb.x - ca.x, cb.y - ca.y) || 1 - const nx = (-(cb.y - ca.y) / len) * offset - const ny = ((cb.x - ca.x) / len) * offset - const from = edgePoint(ra, { x: ca.x + nx, y: ca.y + ny }, { x: cb.x + nx, y: cb.y + ny }) - const to = edgePoint(rb, { x: cb.x + nx, y: cb.y + ny }, { x: ca.x + nx, y: ca.y + ny }) - const l = Math.hypot(to.x - from.x, to.y - from.y) || 1 - // u: Einheitsvektor von `from` nach `to`, n: senkrecht dazu - return { from, to, length: l, u: { x: (to.x - from.x) / l, y: (to.y - from.y) / l }, n: { x: -(to.y - from.y) / l, y: (to.x - from.x) / l } } - } - - private hitLine(id: string, from: Point, to: Point, label: string): string { - return `${e(label)}` - } - - private dependencies(): Dependency[] { - return dependencies(this.classes, (c) => this.project.files.find((f) => f.path === (c as ProjectClass).path)?.text) - } - - private findDependency(id: string): Dependency | undefined { - return this.dependencies().find((d) => `dep:${d.from}:${d.to}` === id) - } - - /** Abhängigkeit: gestrichelte Linie mit offener Pfeilspitze und «create» bzw. «use» in der Mitte. */ - private dependencySVG(d: Dependency, a: HTMLElement, b: HTMLElement, offset: number): string { - const { from, to, n } = this.segment(a, b, offset) - const id = `dep:${d.from}:${d.to}` - const selected = this.relSelection === id ? ' selected' : '' - const mid = { x: (from.x + to.x) / 2 + n.x * 12, y: (from.y + to.y) / 2 + n.y * 12 } - const anchor = Math.abs(n.x) < 0.35 ? 'middle' : n.x > 0 ? 'start' : 'end' - const label = t(`web_visuobject_dep_${d.kind}_text`, d.from, d.to, d.methods.join(', ')) - return ` - - «${d.kind}» - ${this.hitLine(id, from, to, label)} - ` - } - - private generalizationSVG(g: Generalization, a: HTMLElement, b: HTMLElement, offset: number): string { - const { from, to, u } = this.segment(a, b, offset) - // Linie endet an der Grundseite des hohlen Dreiecks, die Spitze berührt die Oberklasse. - const base = { x: to.x - u.x * 12, y: to.y - u.y * 12 } - const id = `gen:${g.kind}:${g.from}:${g.to}` - const selected = this.relSelection === id ? ' selected' : '' - const label = t(g.kind === 'implements' ? 'web_visuobject_rel_implements_text' : 'web_visuobject_rel_extends_text', g.from, g.to) - return ` - - ${this.hitLine(id, from, to, label)} - ` - } - - /** - * Assoziation: Raute am Ganzen (Aggregation hohl, Komposition gefüllt), Pfeilspitzen je nach Navigierbarkeit, - * an jedem Ende Multiplizität und Rolle gleich weit von der Klasse auf beiden Seiten der Linie, - * in der Mitte der Name mit Leserichtung. - */ - /** - * Wie Astah: Stehen die Referenzattribute im Kasten, gibt es je Klassenpaar nur eine Linie, - * ohne Rollen (das Attribut steht ja im Kasten). Vorne steht die Linie mit Name oder anderem UML-Zusatz. - * Bei mehreren Attributen (p1, p2, p3) entfallen auch die Multiplizitäten. - */ - private shownAssociations(assocs: Assoc[]): (Assoc & { several?: boolean })[] { - const pairs = new Map() - for (const r of assocs) { - const key = [r.from, r.to].sort().join('|') - pairs.set(key, [...(pairs.get(key) ?? []), r]) - } - return [...pairs.values()].map((group) => { - const info = (r: Assoc) => (r.name ? 2 : 0) + (r.kind !== 'association' || r.navTo !== 'navigable' || r.navFrom !== (r.back ? 'navigable' : 'unspecified') ? 1 : 0) - const main = [...group].sort((x, y) => info(y) - info(x))[0] - const toward = (from: string) => group.filter((r) => r.from === from).length + group.filter((r) => r.back && r.to === from).length - const several = toward(main.from) > 1 || toward(main.to) > 1 - // Gibt es auch Attribute in der Gegenrichtung, ist auch dieses Ende navigierbar. - const backward = group.some((r) => r.from === main.to) - return { ...main, navFrom: backward && main.navFrom === 'unspecified' ? 'navigable' : main.navFrom, several } - }) - } - - private associationSVG(r: Assoc & { several?: boolean }, a: HTMLElement, b: HTMLElement, offset: number): string { - const { from, to, length, u, n } = this.segment(a, b, offset) - const id = `assoc:${r.key}` - const selected = this.relSelection === id ? ' selected' : '' - const diamond = r.kind !== 'association' - const start = diamond ? { x: from.x + u.x * 20, y: from.y + u.y * 20 } : from - let svg = `` - // Nicht navigierbar: kleines Kreuz × kurz vor der Klasse. - const cross = (at: Point, dir: Point) => { - const c = { x: at.x + dir.x * 12, y: at.y + dir.y * 12 } - const a = { x: (dir.x + n.x) * 5, y: (dir.y + n.y) * 5 } - const b = { x: (dir.x - n.x) * 5, y: (dir.y - n.y) * 5 } - return `` - } - if (r.navTo === 'non-navigable') svg += cross(to, { x: -u.x, y: -u.y }) - if (r.navFrom === 'non-navigable') svg += cross(start, u) - if (diamond) { - const p = (along: number, side: number) => `${from.x + u.x * along + n.x * side},${from.y + u.y * along + n.y * side}` - svg += `` - } - // Beschriftung an einem Ende: Multiplizität auf der einen, Rolle auf der anderen Seite, gleich weit weg. - // Ist die Linie markiert, stehen leere Felder hellgrau da; ein Klick darauf bearbeitet das Ende (wie in Astah). - const end = (at: Point, dir: Point, along: number, endId: 'a' | 'b', multiplicity?: string, role?: string) => { - // Waagerechte Linie: Text beginnt dicht an der Klasse und wächst von ihr weg. - const flat = Math.abs(n.x) < 0.35 - const base = flat ? { x: at.x + dir.x * 8, y: at.y + dir.y * 8 } : { x: at.x + dir.x * along, y: at.y + dir.y * along } - const text = (side: number, value: string | undefined, cls: 'mult' | 'role') => { - const empty = !value - if (empty && (!selected || cls === 'role')) return '' - const x = base.x + n.x * side - const y = base.y + n.y * side - const anchor = flat ? (dir.x > 0 ? 'start' : 'end') : n.x * side > 0 ? 'start' : 'end' - const shown = empty ? t(cls === 'role' ? 'web_visuobject_rel_role' : 'web_visuobject_end_mult_ph') : value - return `${e(shown!)}` - } - // Unsichtbarer Kreis am Ende: Rechtsklick dort öffnet das Ende auch ohne Markierung. - const c = { x: at.x + dir.x * 16, y: at.y + dir.y * 16 } - const hit = `${e(t('web_visuobject_end_tip'))}` - return hit + text(12, multiplicity, 'mult') + text(-12, role, 'role') - } - const room = Math.min(30, length / 3) - // Rolle mit Sichtbarkeit, denn das Attribut steht nicht mehr im Kasten. - // Attribute stehen im Kasten: an der Linie nur die Multiplizität (bei p1, p2, p3 keine). - svg += end(to, { x: -u.x, y: -u.y }, room, 'b', r.several ? undefined : r.multiplicity) - svg += end(from, u, diamond ? Math.min(42, length / 3) : room, 'a', r.several ? undefined : r.sourceMultiplicity) - if (r.name) { - // Leserichtung als Dreieck, das in Richtung der gelesenen Klasse zeigt. - const dir = r.reading === 'backward' ? { x: -u.x, y: -u.y } : u - const arrow = !r.reading ? '' : Math.abs(dir.x) >= Math.abs(dir.y) ? (dir.x > 0 ? ' ▶' : '◀ ') : dir.y > 0 ? ' ▼' : ' ▲' - const text = arrow === '◀ ' ? `◀ ${r.name}` : `${r.name}${arrow}` - const free = this.freeMiddle(from, to, [r.from, r.to]) - const mid = { x: free.x + n.x * 14, y: free.y + n.y * 14 } - const anchor = Math.abs(n.x) < 0.35 ? 'middle' : n.x > 0 ? 'start' : 'end' - svg += `${e(text)}` - } - const label = t(`web_visuobject_rel_${r.kind}`) + `: ${r.from} – ${r.to}` - return `${svg}${this.hitLine(id, from, to, label)}` - } - - /** Mitte des längsten Stücks der Linie, das durch keinen anderen Kasten läuft (für den Namen). */ - private freeMiddle(from: Point, to: Point, ends: string[]): Point { - const others = [...this.canvas.querySelectorAll('.uml-class')] - .filter((b) => !ends.includes(b.dataset.class!)) - .map((b) => ({ x: b.offsetLeft - 8, y: b.offsetTop - 8, w: b.offsetWidth + 16, h: b.offsetHeight + 16 })) - // Die Enden gehören Multiplizität und Rolle. - const len = Math.hypot(to.x - from.x, to.y - from.y) - if (len > 120) { - const k = 48 / len - ;[from, to] = [ - { x: from.x + (to.x - from.x) * k, y: from.y + (to.y - from.y) * k }, - { x: to.x - (to.x - from.x) * k, y: to.y - (to.y - from.y) * k }, - ] - } - const steps = 40 - let best = { start: 0, length: 0 } - let run = -1 - for (let i = 0; i <= steps; i++) { - const x = from.x + ((to.x - from.x) * i) / steps - const y = from.y + ((to.y - from.y) * i) / steps - const blocked = others.some((r) => x >= r.x && x <= r.x + r.w && y >= r.y && y <= r.y + r.h) - if (!blocked && run < 0) run = i - if ((blocked || i === steps) && run >= 0) { - const end = blocked ? i - 1 : i - if (end - run > best.length) best = { start: run, length: end - run } - run = -1 - } - } - const at = (best.start + best.length / 2) / steps - return { x: from.x + (to.x - from.x) * at, y: from.y + (to.y - from.y) * at } - } - - // MARK: - Beziehungen bearbeiten - - private findRelation(id: string): Assoc | Generalization | undefined { - if (id.startsWith('assoc:')) return associations(this.classes, this.project.uml).find((r) => `assoc:${r.key}` === id || `assoc:${r.back?.key}` === id) - return generalizations(this.classes).find((g) => `gen:${g.kind}:${g.from}:${g.to}` === id) - } - - private selectRelation(id: string) { - this.noteSelection = undefined - this.relSelection = id - this.selection = undefined - this.treeSelection = undefined - this.message('') - this.render() - this.renderTree() - this.canvas.focus({ preventScroll: true }) - } - - /** Datei mit der Klasse `name` frisch lesen und ändern; so passen die Stellen auch nach einer vorigen Änderung. */ - private editClass(project: JavaProject, name: string, run: (text: string, cls: UmlClass) => string): JavaProject { - for (const f of project.files) { - const cls = parseClasses(f.text).find((c) => c.name === name) - if (cls) return updateFile(project, f.path, this.sorted(run(f.text, cls), name)) - } - return project - } - - private sectionLabels(): SectionLabels { - return { fields: t('web_visuobject_section_fields'), refs: t('web_visuobject_section_refs'), ctors: t('web_visuobject_section_ctors'), methods: t('web_visuobject_section_methods') } - } - - /** Neue Mitglieder unter den passenden Abschnitts-Kommentar (nur wenn die Klasse welche hat). */ - private sorted(text: string, name: string): string { - return keepSections(text, name, new Set(this.classes.map((c) => c.name)), this.sectionLabels()) - } - - /** Neue Klasse gleich mit `// Attribute`, `// Referenzattribute`, `// Konstruktor`, `// Methoden`. */ - private sectioned(text: string, name: string): string { - const cls = parseClasses(text).find((c) => c.name === name) - return cls ? withSections(text, cls, new Set([...this.classes.map((c) => c.name), name]), this.sectionLabels()) : text - } - - private fieldOf(cls: UmlClass, name: string) { - return cls.members.find((m) => m.kind === 'field' && m.name === name) - } - - /** Import ergänzen, wenn `user` die Klasse `used` aus einem anderen Package braucht. */ - private importFor(project: JavaProject, user: string, used: string): JavaProject { - const a = this.findClass(user) - const b = this.findClass(used) - if (!a || !b || a.pkg === b.pkg || !b.pkg) return project - return this.editClass(project, user, (text) => ensureImport(text, `${b.pkg}.${b.name}`)) - } - - /** Attribut für eine Assoziation anlegen (Typ der Klasse oder Liste davon). */ - private addAssociationField(project: JavaProject, from: string, to: string, many: boolean, wanted?: string): { project: JavaProject; field: string } { - const cls = projectClasses(project).find((c) => c.name === from)! - // Eine schon eingetragene Rolle wird der Name des Attributs. - const field = wanted && identifier.test(wanted) && !cls.members.some((m) => m.name === wanted) ? wanted : fieldNameFor(cls, to, many) - const { type, init } = fieldTypeFor(to, many) - let next = this.editClass(project, from, (text, c) => addMember(text, c, `- ${field}: ${type}`)) - if (init) { - next = this.editClass(next, from, (text, c) => { - const m = this.fieldOf(c, field) - return m ? setFieldType(text, m, type, init) : text - }) - next = this.editClass(next, from, (text) => ensureImport(text, 'java.util.ArrayList')) - } - return { project: this.importFor(next, from, to), field } - } - - private setUml(project: JavaProject, key: string, change: Partial): JavaProject { - return { ...project, uml: withInfo(project.uml ?? {}, key, change) } - } - - /** Neue Beziehung aus dem Ziehen von Klasse zu Klasse. */ - private createRelation(from: string, to: string, kind: RelationTool) { - const a = this.findClass(from) - const b = this.findClass(to) - if (!a || !b) return - let next = this.project - let id: string - if (kind === 'extends' && a.kind === 'class') { - next = this.importFor(this.editClass(next, from, (text, c) => setSuperclass(text, c, to)), from, to) - id = `gen:extends:${from}:${to}` - } else if (kind === 'extends' || kind === 'implements') { - next = this.importFor(this.editClass(next, from, (text, c) => addInterface(text, c, to)), from, to) - id = `gen:${a.kind === 'interface' ? 'extends' : 'implements'}:${from}:${to}` - } else { - const added = this.addAssociationField(next, from, to, false) - const key = relationKey(from, added.field) - next = kind === 'association' ? added.project : kind === 'link' ? this.setUml(added.project, key, { targetEnd: 'unspecified' }) : this.setUml(added.project, key, { kind }) - id = `assoc:${relationKey(from, added.field)}` - } - this.relSelection = id - this.selection = undefined - this.message('') - this.setProject(next, a.path) - this.canvas.focus({ preventScroll: true }) - } - - private deleteRelation(id: string) { - const rel = this.findRelation(id) - if (!rel) return - let next = this.project - if ('key' in rel) { - const drop = (p: JavaProject, cls: string, field: string) => - this.editClass(p, cls, (text, c) => { - const m = this.fieldOf(c, field) - return m ? deleteMember(text, m) : text - }) - next = drop(next, rel.from, rel.role) - if (rel.back) next = drop(next, rel.to, rel.back.field.name) - const uml = { ...(next.uml ?? {}) } - delete uml[rel.key] - if (rel.back) delete uml[rel.back.key] - next = { ...next, uml } - } else if (rel.kind === 'extends' && this.findClass(rel.from)?.kind === 'class') { - next = this.editClass(next, rel.from, (text, c) => setSuperclass(text, c, undefined)) - } else { - next = this.editClass(next, rel.from, (text, c) => removeInterface(text, c, rel.to)) - } - this.relSelection = undefined - this.setProject(next) - } - - /** Eine Einstellung im Objektinspektor ändern. */ - private changeAssoc(r: Assoc, what: string, value: string) { - let next = this.project - let key = r.key - const rename = (cls: string, oldName: string, name: string): boolean => { - if (!identifier.test(name)) { - this.message(t('web_visuobject_bad_name', name)) - return false - } - const c = this.findClass(cls) - if (c && c.members.some((m) => m.name === name)) { - this.message(t('web_visuobject_bad_name', name)) - return false - } - next = this.editClass(next, cls, (text, fresh) => { - const m = this.fieldOf(fresh, oldName) - return m ? replaceMember(text, fresh, m, `${m.visibility} ${name}: ${m.type}`) : text - }) - next = { ...next, uml: renameInfo(next.uml ?? {}, relationKey(cls, oldName), relationKey(cls, name)) } - return true - } - /** Multiplizität am Attribut `field` von `cls` (Typ `target`): bei Wechsel einzeln ↔ viele den Typ ändern. */ - const multiplicity = (cls: string, field: string, target: string, value: string, metaKey: string) => { - const many = isMany(value) - next = this.editClass(next, cls, (text, fresh) => { - const m = this.fieldOf(fresh, field) - if (!m) return text - const current = isMany(r.key === metaKey ? r.multiplicity : (r.sourceMultiplicity ?? '1')) - if (current === many) return text - const { type, init } = fieldTypeFor(target, many) - return setFieldType(text, m, type, init) - }) - if (many) next = this.editClass(next, cls, (text) => ensureImport(text, 'java.util.ArrayList')) - const derived = many ? '0..*' : '1' - next = this.setUml(next, metaKey, { multiplicity: value === derived ? undefined : value }) - } - switch (what) { - case 'kind': - next = this.setUml(next, key, { kind: value as AssocKind }) - break - case 'name': - next = this.setUml(next, key, { name: value.trim() || undefined }) - break - case 'reading': - // Umdrehen: gegen die Zugrichtung lesen und zurück. - next = this.setUml(next, key, { reading: r.reading === 'backward' ? undefined : 'backward' }) - break - case 'targetEnd': - next = this.setUml(next, key, { targetEnd: value as EndNav, navigable: undefined }) - break - case 'sourceEnd': { - if (value === 'navigable' && !r.back) { - // Navigierbar zurück heißt im Code: die andere Klasse bekommt ein Attribut. - const added = this.addAssociationField(next, r.to, r.from, isMany(r.sourceMultiplicity ?? '1'), r.sourceRole) - next = this.setUml(added.project, key, { sourceEnd: undefined, sourceRole: undefined, sourceMultiplicity: undefined }) - if (r.sourceMultiplicity && r.sourceMultiplicity !== (isMany(r.sourceMultiplicity) ? '0..*' : '1')) next = this.setUml(next, relationKey(r.to, added.field), { multiplicity: r.sourceMultiplicity }) - } else if (value !== 'navigable') { - if (r.back) { - const back = r.back - next = this.editClass(next, r.to, (text, c) => { - const m = this.fieldOf(c, back.field.name) - return m ? deleteMember(text, m) : text - }) - const uml = { ...(next.uml ?? {}) } - delete uml[back.key] - next = { ...next, uml } - next = this.setUml(next, key, { sourceRole: r.sourceRole, sourceMultiplicity: r.sourceMultiplicity }) - } - next = this.setUml(next, key, { sourceEnd: value as EndNav }) - } - break - } - case 'role': - if (value === r.role) return - if (!rename(r.from, r.role, value)) return - key = relationKey(r.from, value) - break - case 'multiplicity': - if (!value.trim()) return - multiplicity(r.from, r.role, r.to, value.trim(), key) - break - case 'sourceRole': - if (r.back) { - if (value === r.back.field.name) return - if (!rename(r.to, r.back.field.name, value)) return - } else next = this.setUml(next, key, { sourceRole: value.trim() || undefined }) - break - case 'sourceMultiplicity': - if (!value.trim()) return - if (r.back) multiplicity(r.to, r.back.field.name, r.from, value.trim(), r.back.key) - else next = this.setUml(next, key, { sourceMultiplicity: value.trim() }) - break - } - this.relSelection = `assoc:${key}` - this.message('') - this.setProject(next) - const now = this.findRelation(this.relSelection) - if (now && 'key' in now && `assoc:${now.key}` !== this.relSelection) { - this.relSelection = `assoc:${now.key}` - this.render() - } - } - - /** Objektinspektor rechts im Diagramm: zeigt die gewählte Beziehung. */ - /** - * Kleines Feld an einem Ende der Linie wie in Astah: Rolle, Multiplizität als Knöpfe, Navigierbarkeit. - * Ende A ist die Klasse, bei der die Linie beginnt, Ende B die, bei der sie endet. - */ - private openEnd(id: string, which: 'a' | 'b', ev: MouseEvent, part?: 'role' | 'mult') { - this.closeEnd() - const rel = this.findRelation(id) - if (!rel || !('key' in rel)) return - const isA = which === 'a' - const keys = isA ? { role: 'sourceRole', mult: 'sourceMultiplicity', nav: 'sourceEnd' } : { role: 'role', mult: 'multiplicity', nav: 'targetEnd' } - const role = (isA ? rel.sourceRole : rel.role) ?? '' - const mult = (isA ? rel.sourceMultiplicity : rel.multiplicity) ?? '' - const nav = isA ? rel.navFrom : rel.navTo - const cls = isA ? rel.from : rel.to - const pop = document.createElement('div') - pop.className = 'vo-endpop' - pop.setAttribute('role', 'dialog') - pop.setAttribute('aria-label', t(isA ? 'web_visuobject_rel_end_a' : 'web_visuobject_rel_end_b', cls)) - pop.innerHTML = `

    ${e(t(isA ? 'web_visuobject_rel_end_a' : 'web_visuobject_rel_end_b', cls))}

    - -
    ${e(t('web_visuobject_rel_multiplicity'))}${multiplicities.map((m) => ``).join('')}
    -
    ${e(t('web_visuobject_rel_navigable'))}${(['navigable', 'non-navigable', 'unspecified'] as const).map((v) => ``).join('')}
    ` - const stage = this.shell.querySelector('.vo-stage')! - const r = stage.getBoundingClientRect() - stage.append(pop) - const x = Math.min(Math.max(8, ev.clientX - r.left + 8), r.width - pop.offsetWidth - 8) - const y = Math.min(Math.max(8, ev.clientY - r.top + 8), r.height - pop.offsetHeight - 8) - pop.style.left = `${Math.max(8, x)}px` - pop.style.top = `${Math.max(8, y)}px` - const apply = (field: string, value: string) => { - const current = this.findRelation(id) - if (current && 'key' in current) this.changeAssoc(current, field, value) - // Nach dem Neuzeichnen bleibt das Feld offen, mit dem neuen Stand. - const focusPart = (document.activeElement as HTMLElement | null)?.dataset?.endField as 'role' | 'mult' | undefined - if (this.relSelection) this.reopenEnd(this.relSelection, which, pop, focusPart) - } - for (const input of pop.querySelectorAll('[data-end-field]')) { - input.addEventListener('change', () => apply(input.dataset.endField === 'role' ? keys.role : keys.mult, input.value.trim())) - input.addEventListener('keydown', (k) => { - k.stopPropagation() - if (k.key === 'Enter') input.blur() - if (k.key === 'Escape') this.closeEnd() - }) - } - for (const b of pop.querySelectorAll('[data-mult]')) b.addEventListener('click', () => apply(keys.mult, b.dataset.mult!)) - for (const b of pop.querySelectorAll('[data-nav]')) b.addEventListener('click', () => apply(keys.nav, b.dataset.nav!)) - pop.addEventListener('pointerdown', (p) => p.stopPropagation()) - pop.addEventListener('click', (c) => c.stopPropagation()) - this.endPop = pop - const first = pop.querySelector(`[data-end-field="${part === 'mult' ? 'mult' : 'role'}"]`) - first?.focus() - first?.select() - } - - /** Feld am Ende nach einer Änderung an derselben Stelle neu öffnen. */ - private reopenEnd(id: string, which: 'a' | 'b', old: HTMLElement, part?: 'role' | 'mult') { - const r = this.shell.querySelector('.vo-stage')!.getBoundingClientRect() - const fake = { clientX: r.left + parseFloat(old.style.left) - 8, clientY: r.top + parseFloat(old.style.top) - 8 } as MouseEvent - this.openEnd(id, which, fake, part) - } - - private endPop?: HTMLElement - - private closeEnd() { - this.endPop?.remove() - this.endPop = undefined - } - - /** - * Objektinspektor unter dem Diagramm. Ende A ist die Klasse, bei der die Linie beginnt (dort steht das Attribut), - * Ende B die Klasse, bei der sie endet. - */ - private renderInspector() { - if (this.diagramMode === 'object') return this.objectDiagram.renderInspector() - if (this.diagramMode === 'sequence') return this.renderSequenceInspector() - const note = this.findNote(this.noteSelection) - if (note) return this.renderNoteInspector(note) - const dep = this.relSelection?.startsWith('dep:') ? this.findDependency(this.relSelection) : undefined - if (dep) return this.renderDependency(dep) - const rel = this.relSelection ? this.findRelation(this.relSelection) : undefined - if (this.endPop && (!rel || !this.endPop.isConnected)) this.closeEnd() - const selectedClass = !rel && this.selection ? this.findClass(this.selection.cls) : undefined - if (selectedClass) return this.renderClassInspector(selectedClass) - if (!rel) { - delete this.inspector.dataset.rel - this.inspector.innerHTML = `

    ${e(t('web_visuobject_inspector_empty'))}

    ` - return - } - // Fokus nach dem Neuzeichnen wieder auf dasselbe Feld (z. B. nach Tab ins nächste). - const focused = this.inspector.contains(document.activeElement) ? ((document.activeElement as HTMLElement).dataset.field ?? (document.activeElement as HTMLElement).dataset.inspector) : undefined - this.inspector.dataset.rel = this.relSelection - const remove = `` - if (!('key' in rel)) { - const text = t(rel.kind === 'implements' ? 'web_visuobject_rel_implements_text' : 'web_visuobject_rel_extends_text', rel.from, rel.to) - this.inspector.innerHTML = `

    ${e(t(rel.kind === 'implements' ? 'web_visuobject_rel_implements' : 'web_visuobject_rel_extends'))}

    ${e(text)}

    ${remove}
    ` - } else { - const option = (value: string, label: string, current: string) => `` - const kinds = (['association', 'aggregation', 'composition'] as const).map((k) => option(k, t(`web_visuobject_rel_${k}`).replace(/\s*\(.*\)$/, ''), rel.kind)).join('') - const navs = (current: EndNav) => (['navigable', 'non-navigable', 'unspecified'] as const).map((v) => option(v, t(`web_visuobject_rel_nav_${v}`), current)).join('') - const [first, second] = rel.reading === 'backward' ? [rel.to, rel.from] : [rel.from, rel.to] - const reading = rel.name - ? `

    ${e(t('web_visuobject_rel_reading'))}: ${e(first)} ▶ ${e(second)}

    ` - : `

    ${e(t('web_visuobject_rel_reading_auto'))}

    ` - const list = `${multiplicities.map((m) => `` - const endFields = (title: string, roleKey: string, role: string | undefined, multKey: string, mult: string | undefined, roleHint: string, navKey: string, nav: EndNav) => ` -
    - ${e(title)} - - - - ${e(roleHint)} -
    ` - this.inspector.innerHTML = ` -
    - - - ${reading} - ${remove} -
    -
    - ${endFields(t('web_visuobject_rel_end_a', rel.from), 'sourceRole', rel.sourceRole, 'sourceMultiplicity', rel.sourceMultiplicity, rel.back ? t('web_visuobject_rel_role_field', rel.to, rel.back.field.name) : t('web_visuobject_rel_role_only_uml'), 'sourceEnd', rel.navFrom)} - ${endFields(t('web_visuobject_rel_end_b', rel.to), 'role', rel.role, 'multiplicity', rel.multiplicity, t('web_visuobject_rel_role_field', rel.from, rel.role), 'targetEnd', rel.navTo)} -
    - ${list}` - } - for (const el of this.inspector.querySelectorAll('[data-field]')) { - el.addEventListener('change', () => { - const current = this.relSelection && this.findRelation(this.relSelection) - if (current && 'key' in current) this.changeAssoc(current, el.dataset.field!, el.value) - }) - if (el instanceof HTMLInputElement) el.addEventListener('keydown', (ev) => ev.key === 'Enter' && el.blur()) - } - this.inspector.querySelector('[data-inspector=delete]')!.addEventListener('click', () => this.deleteRelation(this.relSelection!)) - if (focused) this.inspector.querySelector(`[data-field="${focused}"], [data-inspector="${focused}"]`)?.focus({ preventScroll: true }) - this.inspector.querySelector('[data-inspector=flip]')?.addEventListener('click', () => { - const current = this.relSelection && this.findRelation(this.relSelection) - if (current && 'key' in current) this.changeAssoc(current, 'reading', '') - }) - } - - /** Gewählter Reiter im Klassen-Inspektor. */ - private classTab: 'class' | 'fields' | 'methods' = 'class' - - /** - * Klassen-Inspektor wie in Eclipse/Astah mit drei Reitern: Klasse (Name, Package, Modifier, Oberklasse, - * Interfaces, Javadoc), Attribute und Methoden als Tabellen, dazu die Erzeuger aus „Source“. - * Jede Änderung schreibt sofort an die passende Stelle im Code. - */ - private renderClassInspector(cls: ProjectClass) { - const active = document.activeElement as HTMLElement | null - const focused = this.inspector.contains(active) ? (active?.dataset.field ? `${active.dataset.row ?? ''}|${active.dataset.field}` : undefined) : undefined - const text = this.project.files.find((f) => f.path === cls.path)?.text ?? '' - const mods = classModifiers(text, cls) - const isClass = cls.kind === 'class' - const option = (value: string, label: string, on: boolean) => `` - const visOptions = (v: Visibility, withPackage = true) => - (['+', '-', '#', '~'] as const) - .filter((x) => withPackage || x !== '~') - .map((x) => option(x, `${x} ${{ '+': 'public', '-': 'private', '#': 'protected', '~': 'package' }[x]}`, x === v)) - .join('') - const fields = cls.members.map((m, i) => ({ m, i })).filter((x) => x.m.kind === 'field') - const methods = cls.members.map((m, i) => ({ m, i })).filter((x) => x.m.kind !== 'field') - const tab = (id: typeof this.classTab, label: string) => `` - const types = `${['int', 'double', 'boolean', 'char', 'long', 'String', ...this.classes.map((c) => c.name), ...this.classes.map((c) => `ArrayList<${c.name}>`)].map((x) => `` - let body = '' - if (this.classTab === 'class') { - const supers = this.classes.filter((c) => c.kind === 'class' && c.name !== cls.name) - const ifaces = this.classes.filter((c) => c.kind === 'interface' && c.name !== cls.name) - const here = packageOf(cls.path) - const places = sourceFoldersOf(this.project).flatMap((root) => { - const list = packagesOf(this.project, root) - return list.includes(packageKey(root, '')) ? list : [...list, packageKey(root, '')] - }) - body = ` -
    - - - - ${isClass ? `` : ''} -
    -
    - ${isClass ? `` : ''} - ${ifaces.length ? `
    ${e(t(isClass ? 'web_visuobject_new_interfaces' : 'web_visuobject_new_extends_interfaces'))}${ifaces.map((c) => ``).join('')}
    ` : ''} -
    - -
    ${isClass ? `` : ''}
    ` - } else if (this.classTab === 'fields') { - const rows = fields - .map(({ m, i }) => { - const f = fieldInfo(text, m) - return ` - - - - - - - - ` - }) - .join('') - body = `${rows || ``}
    ${e(t('web_visuobject_insp_visibility'))}${e(t('web_visuobject_new_name'))}${e(t('web_visuobject_insp_type'))}staticfinal${e(t('web_visuobject_insp_init'))}
    ${e(t('web_visuobject_insp_no_fields'))}
    -
    ` - } else { - const canAbstract = isClass - const rows = methods - .map(({ m, i }) => { - const ctor = m.kind === 'constructor' - return ` - - - - - - - - ` - }) - .join('') - body = `${rows || ``}
    ${e(t('web_visuobject_insp_visibility'))}${e(t('web_visuobject_new_name'))}${e(t('web_visuobject_insp_params'))}${e(t('web_visuobject_insp_return'))}staticabstract
    ${e(t('web_visuobject_insp_no_methods'))}
    -
    - - ${isClass ? `${e(t('web_visuobject_insp_generate'))} - - - ` : ''} -
    ` - } - this.inspector.dataset.rel = `class:${cls.name}` - this.inspector.innerHTML = ` -
    -

    ${e(t(isClass ? 'web_visuobject_new_class' : 'web_visuobject_new_interface'))} ${e(cls.name)}

    -
    ${tab('class', t(isClass ? 'web_visuobject_new_class' : 'web_visuobject_new_interface'))}${tab('fields', `${t('web_visuobject_insp_fields')} (${fields.length})`)}${tab('methods', `${t('web_visuobject_insp_methods')} (${methods.length})`)}
    -
    - ${body}${types}` - const edit = (run: (source: string, c: UmlClass) => string, extra?: (p: JavaProject) => JavaProject) => { - this.message('') - let next = this.editClass(this.project, cls.name, run) - if (extra) next = extra(next) - this.setProject(next, cls.path) - } - const member = (c: UmlClass, el: HTMLElement) => c.members[Number(el.dataset.row)] - for (const b of this.inspector.querySelectorAll('[data-class-tab]')) - b.addEventListener('click', () => { - this.classTab = b.dataset.classTab as typeof this.classTab - this.renderInspector() - }) - for (const el of this.inspector.querySelectorAll('[data-field]')) { - el.addEventListener('change', () => { - const field = el.dataset.field! - const on = el instanceof HTMLInputElement && el.checked - const value = el.value.trim() - if (field === 'name') { - if (value && value !== cls.name) this.renameClassTo(cls, value) - } else if (field === 'package') { - const to = pathFor(el.value, fileNameOf(cls.path)) - if (to === cls.path) return - if (this.project.files.some((f) => f.path === to)) return this.message(t('web_visuobject_new_exists', fileNameOf(to))) - this.openTabs = this.openTabs.map((p) => (p === cls.path ? to : p)) - this.currentPackage = el.value - this.setProject(moveFile(this.project, cls.path, to), to) - } else if (field === 'visibility') edit((src, c) => setPublic(src, c, el.value === 'public')) - else if (field === 'abstract') - edit((src, c) => { - const base = on ? setFinal(src, c, false) : src - return setAbstract(base, parseClasses(base).find((x) => x.name === c.name) ?? c, on) - }) - else if (field === 'final') edit((src, c) => setFinal(src, c, on)) - else if (field === 'superclass') { - const sup = el.value || undefined - edit((src, c) => setSuperclass(src, c, sup), (p) => (sup ? this.importFor(p, cls.name, sup) : p)) - } else if (field === 'iface') { - const name = el.value - edit((src, c) => (on ? addInterface(src, c, name) : removeInterface(src, c, name)), (p) => (on ? this.importFor(p, cls.name, name) : p)) - } else if (field === 'doc') edit((src, c) => setClassDoc(src, c, el.value)) - else if (field.startsWith('f-')) { - if ((field === 'f-name' && !identifier.test(value)) || (field === 'f-type' && !value)) return this.message(t('web_visuobject_bad_name', value)) - const change: Partial = - field === 'f-vis' ? { visibility: el.value as Visibility } : field === 'f-name' ? { name: value } : field === 'f-type' ? { type: value } : field === 'f-static' ? { isStatic: on } : field === 'f-final' ? { isFinal: on } : { init: el.value } - const old = cls.members[Number(el.dataset.row)]?.name - edit( - (src, c) => setField(src, member(c, el), change), - (p) => (field === 'f-name' && old && p.uml?.[relationKey(cls.name, old)] ? { ...p, uml: renameInfo(p.uml, relationKey(cls.name, old), relationKey(cls.name, value)) } : p), - ) - } else if (field.startsWith('m-')) { - let change: Partial - if (field === 'm-params') { - const params = parseParams(el.value) - if (!params) return this.message(t('web_visuobject_insp_bad_params', el.value)) - change = { params } - } else if (field === 'm-name') { - if (!identifier.test(value)) return this.message(t('web_visuobject_bad_name', value)) - change = { name: value } - } else change = field === 'm-vis' ? { visibility: el.value as Visibility } : field === 'm-type' ? { type: value || 'void' } : field === 'm-static' ? { isStatic: on } : { isAbstract: on } - edit((src, c) => { - const out = setMethod(src, c, member(c, el), change) - // Abstrakte Methode in einer normalen Klasse: Die Klasse muss dann auch abstract sein. - if (field === 'm-abstract' && on && !c.isAbstract) { - const again = parseClasses(out).find((x) => x.name === c.name) - return again ? setAbstract(setFinal(out, again, false), parseClasses(setFinal(out, again, false)).find((x) => x.name === c.name)!, true) : out - } - return out - }) - } - }) - if (el instanceof HTMLInputElement && el.type === 'text') el.addEventListener('keydown', (ev) => ev.key === 'Enter' && el.blur()) - } - const on = (action: string, run: (b: HTMLElement) => void) => { - for (const b of this.inspector.querySelectorAll(`[data-inspector="${action}"]`)) b.addEventListener('click', () => run(b)) - } - on('delete-class', () => this.deleteClassFromProject(cls)) - on('sections', () => edit((src, c) => withSections(src, c, new Set(this.classes.map((x) => x.name)), this.sectionLabels()))) - on('delete-member', (b) => edit((src, c) => deleteMember(src, member(c, b)))) - on('add-field', () => edit((src, c) => addMember(src, c, `- ${this.freeMember(cls, 'attribut')}: int`))) - on('add-method', () => edit((src, c) => addMember(src, c, `+ ${this.freeMember(cls, 'methode')}(): void`))) - on('gen-constructor', () => edit((src, c) => addFieldConstructor(src, c))) - on('gen-accessors', () => edit((src, c) => addGettersSetters(src, c))) - on('gen-tostring', () => edit((src, c) => addToString(src, c))) - if (focused) { - const [row, field] = focused.split('|') - this.inspector.querySelector(row ? `[data-row="${row}"][data-field="${field}"]` : `[data-field="${field}"]`)?.focus({ preventScroll: true }) - } - } - - /** Freier Name für ein neues Mitglied: `attribut`, `attribut2` … */ - private freeMember(cls: ProjectClass, base: string): string { - let name = base - for (let n = 2; cls.members.some((m) => m.name === name); n++) name = base + n - return name - } - - /** Abhängigkeit im Inspektor: erklären, warum es keine Assoziation ist, und sie auf Wunsch zu einer machen. */ - private renderDependency(d: Dependency) { - this.closeEnd() - this.inspector.dataset.rel = this.relSelection - this.inspector.innerHTML = `
    -

    ${e(t('web_visuobject_dep_title', d.kind))}

    -

    ${e(t(`web_visuobject_dep_${d.kind}_text`, d.from, d.to, d.methods.join(', ')))}

    -
    -

    ${e(t('web_visuobject_dep_hint', d.from, d.to))}

    -
    ` - this.inspector.querySelector('[data-inspector=to-assoc]')!.addEventListener('click', () => { - const added = this.addAssociationField(this.project, d.from, d.to, false) - this.relSelection = `assoc:${relationKey(d.from, added.field)}` - this.setProject(added.project, this.findClass(d.from)?.path) - }) - } - - // MARK: - Werkzeugleiste - - private setTool(tool: Tool) { - this.tool = tool - this.pendingFrom = undefined - for (const el of this.canvas.querySelectorAll('.uml-class.source')) el.classList.remove('source') - for (const b of this.shell.querySelectorAll('.vo-tool')) b.setAttribute('aria-pressed', String(b.dataset.tool === tool)) - this.canvas.dataset.tool = tool - this.message(tool === 'select' ? '' : t(`web_visuobject_tool_${tool}_tip`), true) - } - - /** Werkzeug anklicken wählt es; Klasse oder Interface lässt sich auch direkt auf die Fläche ziehen. */ - private onToolDown(ev: PointerEvent, tool: Tool) { - if (ev.button !== 0) return - if (tool !== 'class' && tool !== 'interface') return this.setTool(this.tool === tool ? 'select' : tool) - ev.preventDefault() - const start = { x: ev.clientX, y: ev.clientY } - let ghost: HTMLElement | undefined - const move = (m: PointerEvent) => { - if (!ghost && Math.hypot(m.clientX - start.x, m.clientY - start.y) < 6) return - if (!ghost) { - ghost = document.createElement('div') - ghost.className = `vo-tool-ghost${tool === 'interface' ? ' interface' : ''}` - ghost.innerHTML = `${tool === 'interface' ? '«interface»' : ''}${e(t(tool === 'class' ? 'web_visuobject_new_class_name' : 'web_visuobject_new_interface_name'))}` - document.body.append(ghost) - } - ghost.style.left = `${m.clientX}px` - ghost.style.top = `${m.clientY}px` - } - const up = (m: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - if (!ghost) return this.setTool(this.tool === tool ? 'select' : tool) - ghost.remove() - const r = this.canvas.getBoundingClientRect() - if (m.clientX < r.left || m.clientX > r.right || m.clientY < r.top || m.clientY > r.bottom) return - this.setTool('select') - this.newClass(tool, { x: m.clientX - r.left + this.canvas.scrollLeft - 60, y: m.clientY - r.top + this.canvas.scrollTop - 14 }) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - /** Mit gewähltem Werkzeug auf die Fläche: Klasse anlegen oder Beziehung beginnen bzw. beenden. */ - private useTool(ev: PointerEvent) { - ev.preventDefault() - const tool = this.tool - const r = this.canvas.getBoundingClientRect() - const at = { x: ev.clientX - r.left + this.canvas.scrollLeft, y: ev.clientY - r.top + this.canvas.scrollTop } - if (tool === 'class' || tool === 'interface') { - this.setTool('select') - this.newClass(tool, { x: at.x - 60, y: at.y - 14 }) - return - } - if (tool === 'note') { - this.setTool('select') - this.addNote({ x: at.x - 20, y: at.y - 14 }) - return - } - const box = (ev.target as HTMLElement).closest('.uml-class') - if (!box) { - if (this.pendingFrom) this.setTool(tool) - return - } - const name = box.dataset.class! - if (this.pendingFrom && this.pendingFrom !== name) { - const from = this.pendingFrom - this.connectWith(from, name, tool as RelationTool) - return - } - this.startConnect(ev, name, tool as RelationTool) - } - - /** Beziehung mit dem Werkzeug anlegen, wenn sie zwischen diesen Klassen geht. */ - private connectWith(from: string, to: string, kind: RelationTool) { - const a = this.findClass(from) - const b = this.findClass(to) - this.setTool('select') - if (!a || !b) return - if (!relationChoices(a, b).includes(kind)) return this.message(t(`web_visuobject_tool_not_${kind}`, from, to)) - this.createRelation(from, to, kind) - } - - // MARK: - Beziehung ziehen - - /** Vom Griff am gewählten Kasten zu einer anderen Klasse ziehen, dann die Art wählen. */ - private startConnect(ev: PointerEvent, from: string, kind?: RelationTool) { - ev.preventDefault() - const ghost = document.createElementNS('http://www.w3.org/2000/svg', 'line') - ghost.setAttribute('class', 'vo-rel ghost') - this.lines.append(ghost) - const box = this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(from)}"]`)! - const local = (m: PointerEvent) => { - const r = this.canvas.getBoundingClientRect() - return { x: m.clientX - r.left + this.canvas.scrollLeft, y: m.clientY - r.top + this.canvas.scrollTop } - } - const start = { x: box.offsetLeft + box.offsetWidth, y: box.offsetTop + box.offsetHeight / 2 } - const targetAt = (m: PointerEvent) => { - const el = document.elementFromPoint(m.clientX, m.clientY)?.closest('.uml-class') - return el && el.dataset.class !== from ? el : undefined - } - const move = (m: PointerEvent) => { - const p = local(m) - ghost.setAttribute('x1', String(start.x)) - ghost.setAttribute('y1', String(start.y)) - ghost.setAttribute('x2', String(p.x)) - ghost.setAttribute('y2', String(p.y)) - for (const el of this.canvas.querySelectorAll('.uml-class.drop')) el.classList.remove('drop') - targetAt(m)?.classList.add('drop') - } - const up = (m: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - ghost.remove() - const target = targetAt(m) - target?.classList.remove('drop') - if (target && kind) this.connectWith(from, target.dataset.class!, kind) - else if (target) this.showRelationMenu(from, target.dataset.class!, local(m)) - else if (kind) { - // Nicht gezogen: jetzt die zweite Klasse anklicken. - this.pendingFrom = from - this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(from)}"]`)?.classList.add('source') - this.message(t('web_visuobject_tool_pick_second', from), true) - } - } - move(ev) - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - private showRelationMenu(from: string, to: string, at: Point) { - const a = this.findClass(from) - const b = this.findClass(to) - if (!a || !b) return - const choices = relationChoices(a, b).map((kind): [RelationTool, string] => [kind, kind === 'association' ? 'web_visuobject_rel_directed' : `web_visuobject_rel_${kind}`]) - if (choices.length === 0) return this.message(t('web_visuobject_rel_impossible', from, to)) - const menu = document.createElement('div') - menu.className = 'vo-relmenu' - menu.setAttribute('role', 'menu') - menu.style.left = `${at.x}px` - menu.style.top = `${at.y}px` - menu.innerHTML = `

    ${e(t('web_visuobject_rel_menu', from, to))}

    ` + choices.map(([kind, label]) => ``).join('') - this.canvas.append(menu) - const close = () => { - menu.remove() - document.removeEventListener('pointerdown', outside, true) - document.removeEventListener('keydown', escape, true) - } - const outside = (ev: Event) => { - if (!menu.contains(ev.target as Node)) close() - } - const escape = (ev: KeyboardEvent) => { - if (ev.key === 'Escape') { - ev.stopPropagation() - close() - } - } - menu.addEventListener('click', (ev) => { - const kind = (ev.target as HTMLElement).closest('[data-kind]')?.dataset.kind - if (!kind) return - close() - this.createRelation(from, to, kind as RelationTool) - }) - document.addEventListener('pointerdown', outside, true) - document.addEventListener('keydown', escape, true) - menu.querySelector('button')?.focus() - } -} - -/** `link`: Assoziation ohne Navigation (einfache Linie), `association`: gerichtet mit Pfeil. */ -type RelationTool = AssocKind | 'link' | 'extends' | 'implements' -type Tool = 'select' | 'class' | 'interface' | 'note' | RelationTool -const paletteTools: Tool[] = ['select', 'class', 'interface', 'note', 'link', 'association', 'aggregation', 'composition', 'extends', 'implements'] - -/** Welche Beziehungen von `a` nach `b` gehen: Attribute nur in Klassen, erben nur Klasse von Klasse bzw. Interface von Interface. */ -function relationChoices(a: UmlClass, b: UmlClass): RelationTool[] { - const out: RelationTool[] = [] - if (a.kind === 'class') out.push('link', 'association', 'aggregation', 'composition') - if (a.kind === b.kind && (a.kind === 'class' ? a.superclass !== b.name : !a.interfaces.includes(b.name))) out.push('extends') - if (a.kind === 'class' && b.kind === 'interface' && !a.interfaces.includes(b.name)) out.push('implements') - return out -} - -/** Symbol in der Werkzeugleiste. */ -function toolIcon(tool: Tool): string { - if (tool === 'select') - return '' - if (tool === 'class' || tool === 'interface') - return `` - if (tool === 'note') - return '' - return relationIcon(tool) -} - -/** Kleines Symbol im Menü: Linie mit offener Pfeilspitze, hohler oder gefüllter Raute, hohlem Dreieck. */ -function relationIcon(kind: string): string { - const line = (x1: number, x2: number, dashed = false) => `` - const shape = - kind === 'link' - ? line(1, 27) - : kind === 'association' - ? `${line(1, 27)}` - : kind === 'aggregation' || kind === 'composition' - ? `${line(13, 27)}` - : `${line(1, 18, kind === 'implements')}` - return `` -} - -/** Schnittpunkt der Strecke von der Mitte `inside` Richtung `toward` mit dem Rand des Rechtecks. */ -function edgePoint(r: { x: number; y: number; w: number; h: number }, inside: Point, toward: Point): Point { - const dx = toward.x - inside.x - const dy = toward.y - inside.y - const sx = dx === 0 ? Infinity : r.w / 2 / Math.abs(dx) - const sy = dy === 0 ? Infinity : r.h / 2 / Math.abs(dy) - const s = Math.min(sx, sy, 1) - return { x: Math.round(inside.x + dx * s), y: Math.round(inside.y + dy * s) } -} diff --git a/web/src/ui/objectDiagram.ts b/web/src/ui/objectDiagram.ts deleted file mode 100644 index 917ebaed..00000000 --- a/web/src/ui/objectDiagram.ts +++ /dev/null @@ -1,415 +0,0 @@ -/** - * VisuObject: Objektdiagramm wie in Astah. Objekte `s1 : Spieler` mit den Werten ihrer Attribute; - * ein Referenzattribut ist eine Linie zum Objekt, dessen Name im Wert steht. Selbst gezeichnet - * (gespeichert im Projekt) oder später live aus dem Debugger (`live`, nur lesen). - */ - -import type { ProjectClass, UmlObject } from '../core/javaProject' -import type { FrameView } from '../core/miniJava' -import { freeObjectName, isA, javaDefault, linkedValue, objectFields, refNames, type ObjectField } from '../core/objectModel' -import { t } from './i18n' -import { icons } from './icons' - -export type { Point } - -const e = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) -const identifier = /^[\p{L}_$][\p{L}\p{N}_$]*$/u - -type Point = { x: number; y: number } -type Rect = { x: number; y: number; w: number; h: number } - -export interface ObjectDiagramHost { - canvas: HTMLElement - lines: SVGSVGElement - inspector: HTMLElement - classes(): ProjectClass[] - objects(): UmlObject[] - setObjects(objects: UmlObject[]): void - message(text: string): void -} - -export interface LiveState { - objects: UmlObject[] - /** Geänderte Werte seit dem letzten Halt: `objektId.attribut`. */ - changed: Set - /** Aufrufstapel, oberste Methode zuerst; `frame` ist die gewählte Zeile. */ - frames: FrameView[] - frame: number - /** Geänderte Variablen: `Methode|Name`. */ - changedVars: Set - onFrame(index: number): void - move(id: string, p: Point): void -} - -export class ObjectDiagram { - selected?: string - /** Stand aus dem Debugger: wird gezeigt statt der gezeichneten Objekte; nur verschieben, nicht ändern. */ - live?: LiveState - private suppressClick = false - private lastClick = { id: '', time: 0 } - - constructor(private host: ObjectDiagramHost) { - host.canvas.addEventListener('pointerdown', (ev) => this.onPointerDown(ev)) - host.canvas.addEventListener('click', (ev) => this.onClick(ev)) - } - - private get objects(): UmlObject[] { - return this.live?.objects ?? this.host.objects() - } - - private find(id: string | undefined) { - return id ? this.objects.find((o) => o.id === id) : undefined - } - - private change(id: string, change: Partial) { - this.host.setObjects(this.host.objects().map((o) => (o.id === id ? { ...o, ...change } : o))) - } - - private fields(o: UmlObject): ObjectField[] { - return objectFields(this.host.classes(), o.cls) - } - - private valueOf(o: UmlObject, f: ObjectField): string { - return o.values[f.name] ?? javaDefault(f.type) - } - - // MARK: - Zeichnen - - render() { - const { canvas } = this.host - for (const old of canvas.querySelectorAll('.uml-object, .vo-empty')) old.remove() - if (this.objects.length === 0) { - const empty = document.createElement('p') - empty.className = 'vo-empty' - empty.textContent = t(this.host.classes().some((c) => c.kind === 'class' && !c.isAbstract) ? 'web_visuobject_obj_empty' : 'web_visuobject_obj_no_classes') - canvas.append(empty) - } - for (const o of this.objects) canvas.append(this.box(o)) - this.drawLinks() - this.renderInspector() - } - - private box(o: UmlObject): HTMLElement { - const box = document.createElement('div') - const selected = this.selected === o.id && !this.live - const known = this.host.classes().some((c) => c.name === o.cls) - box.className = `uml-class uml-object${selected ? ' selected' : ''}${known ? '' : ' unknown'}` - box.dataset.obj = o.id - box.style.left = `${o.x}px` - box.style.top = `${o.y}px` - const rows = this.fields(o) - .map((f) => { - const changed = this.live?.changed.has(`${o.id}.${f.name}`) - return `
  • ${e(f.name)} = ${e(this.valueOf(o, f))}
  • ` - }) - .join('') - box.innerHTML = `${selected ? `` : ''} -
    ${e(o.name)} : ${e(o.cls)}
    -
      ${rows}
    ` - return box - } - - /** Links: vom Objekt mit dem Referenzattribut zum Objekt, dessen Name im Wert steht; am Ziel der Attributname. */ - private drawLinks() { - const { canvas, lines } = this.host - const boxes = new Map() - for (const b of canvas.querySelectorAll('.uml-object')) boxes.set(b.dataset.obj!, b) - let width = 0 - let height = 0 - for (const b of boxes.values()) { - width = Math.max(width, b.offsetLeft + b.offsetWidth + 40) - height = Math.max(height, b.offsetTop + b.offsetHeight + 40) - } - lines.setAttribute('width', String(width)) - lines.setAttribute('height', String(height)) - const rect = (b: HTMLElement): Rect => ({ x: b.offsetLeft, y: b.offsetTop, w: b.offsetWidth, h: b.offsetHeight }) - const parts: string[] = [] - const pairs = new Map() - for (const o of this.objects) { - const from = boxes.get(o.id) - if (!from) continue - for (const f of this.fields(o)) { - if (!f.target) continue - for (const name of refNames(this.valueOf(o, f))) { - const target = this.objects.find((x) => x.name === name) - const to = target && boxes.get(target.id) - if (!to || to === from) continue - const key = [o.id, target.id].sort().join('|') - const n = pairs.get(key) ?? 0 - pairs.set(key, n + 1) - const ra = rect(from) - const rb = rect(to) - const ca = { x: ra.x + ra.w / 2, y: ra.y + ra.h / 2 } - const cb = { x: rb.x + rb.w / 2, y: rb.y + rb.h / 2 } - const len = Math.hypot(cb.x - ca.x, cb.y - ca.y) || 1 - const nx = (-(cb.y - ca.y) / len) * n * 14 - const ny = ((cb.x - ca.x) / len) * n * 14 - const a = edgePoint(ra, { x: ca.x + nx, y: ca.y + ny }, { x: cb.x + nx, y: cb.y + ny }) - const b = edgePoint(rb, { x: cb.x + nx, y: cb.y + ny }, { x: ca.x + nx, y: ca.y + ny }) - const ux = (a.x - b.x) / (Math.hypot(a.x - b.x, a.y - b.y) || 1) - const uy = (a.y - b.y) / (Math.hypot(a.x - b.x, a.y - b.y) || 1) - const label = { x: b.x + ux * 22 - uy * 10, y: b.y + uy * 22 + ux * 10 } - const changed = this.live?.changed.has(`${o.id}.${f.name}`) - parts.push(``) - parts.push(`${e(f.name)}`) - } - } - } - lines.innerHTML = parts.join('') - } - - // MARK: - Objektinspektor - - renderInspector() { - const { inspector } = this.host - if (this.live) return this.renderDebugger(this.live) - const o = this.find(this.selected) - if (!o) { - delete inspector.dataset.rel - inspector.innerHTML = `

    ${e(t('web_visuobject_obj_hint'))}

    ` - return - } - inspector.dataset.rel = `obj:${o.id}` - const classes = this.host.classes().filter((c) => c.kind === 'class') - const others = this.objects.filter((x) => x.id !== o.id) - const field = (f: ObjectField) => { - const value = this.valueOf(o, f) - if (f.target && !f.many) { - const choices = others.filter((x) => isA(this.host.classes(), x.cls, f.target!)) - return `` - } - return `` - } - const rows = this.fields(o) - .map((f) => `${e(f.name)} : ${e(f.type)}${field(f)}`) - .join('') - inspector.innerHTML = ` -
    - - -
    - - ${rows || ``}
    ${e(t('web_visuobject_obj_attribute'))}${e(t('web_visuobject_obj_value'))}
    ${e(t('web_visuobject_insp_no_fields'))}
    -
    ` - inspector.querySelector('[data-field=name]')!.addEventListener('change', (ev) => { - const name = (ev.target as HTMLInputElement).value.trim() - if (!identifier.test(name)) return this.host.message(t('web_visuobject_obj_bad_name', name)) - if (others.some((x) => x.name === name)) return this.host.message(t('web_visuobject_obj_name_taken', name)) - this.host.message('') - // Referenzen auf den alten Namen mitnehmen. - const old = o.name - this.host.setObjects( - this.host.objects().map((x) => { - const values = Object.fromEntries( - Object.entries(x.values).map(([k, v]) => [k, refNames(v).includes(old) ? v.replace(new RegExp(`(^|[\\s,\\[])${old}(?=$|[\\s,\\]])`, 'gu'), `$1${name}`) : v]), - ) - return x.id === o.id ? { ...x, name, values } : { ...x, values } - }), - ) - }) - inspector.querySelector('[data-field=cls]')!.addEventListener('change', (ev) => this.change(o.id, { cls: (ev.target as HTMLSelectElement).value })) - for (const el of inspector.querySelectorAll('[data-objval]')) - el.addEventListener('change', () => this.change(o.id, { values: { ...o.values, [el.dataset.objval!]: el.value.trim() } })) - inspector.querySelector('[data-obj-delete]')!.addEventListener('click', () => this.remove(o.id)) - } - - /** Beim Debuggen: Aufrufstapel und Variablen der gewählten Methode (wie in Eclipse). */ - private renderDebugger(live: LiveState) { - const { inspector } = this.host - delete inspector.dataset.rel - const frame = live.frames[live.frame] - const stack = live.frames - .map( - (f, i) => - `
  • `, - ) - .join('') - const vars = (frame?.vars ?? []) - .map( - (v) => - `${e(v.name)}${e(v.type)}${e(v.value)}`, - ) - .join('') - inspector.innerHTML = ` -
    -

    ${e(t('web_visuobject_dbg_stack'))}

      ${stack || `
    1. ${e(t('web_visuobject_obj_live_hint'))}
    2. `}
    -

    ${e(t('web_visuobject_dbg_vars'))}

    - - ${vars || ``}
    ${e(t('web_visuobject_dbg_var_name'))}${e(t('web_visuobject_dbg_var_type'))}${e(t('web_visuobject_obj_value'))}
    ${e(t('web_visuobject_dbg_no_vars'))}
    -
    -
    ` - for (const b of inspector.querySelectorAll('[data-frame]')) b.addEventListener('click', () => live.onFrame(Number(b.dataset.frame))) - } - - // MARK: - Bearbeiten - - /** Neues Objekt der Klasse an einer freien Stelle, Werte wie in Java nach `new`. */ - add(cls: string) { - const objects = this.host.objects() - const name = freeObjectName( - cls, - objects.map((o) => o.name), - ) - const taken = [...this.host.canvas.querySelectorAll('.uml-object')].map((b) => ({ x: b.offsetLeft, y: b.offsetTop, w: b.offsetWidth, h: b.offsetHeight })) - let spot: Point = { x: 24, y: 24 } - search: for (let y = 24; y < 4000; y += 40) - for (let x = 24; x < Math.max(400, this.host.canvas.clientWidth - 200); x += 40) - if (taken.every((r) => x + 200 + 40 <= r.x || r.x + r.w + 40 <= x || y + 110 + 30 <= r.y || r.y + r.h + 30 <= y)) { - spot = { x, y } - break search - } - const id = `o${Date.now().toString(36)}` - this.selected = id - this.host.setObjects([...objects, { id, name, cls, x: spot.x, y: spot.y, values: {} }]) - } - - remove(id: string) { - const gone = this.host.objects().find((o) => o.id === id) - if (!gone) return - this.selected = undefined - // Referenzen auf das gelöschte Objekt werden null bzw. fallen aus der Liste. - this.host.setObjects( - this.host - .objects() - .filter((o) => o.id !== id) - .map((o) => ({ - ...o, - values: Object.fromEntries( - Object.entries(o.values).map(([k, v]) => { - const names = refNames(v) - if (!names.includes(gone.name)) return [k, v] - return [k, /^\[/.test(v.trim()) ? `[${names.filter((n) => n !== gone.name).join(', ')}]` : 'null'] - }), - ), - })), - ) - } - - onKey(ev: KeyboardEvent): boolean { - if (this.live || !this.selected) return false - if (ev.key === 'Delete' || ev.key === 'Backspace') { - ev.preventDefault() - this.remove(this.selected) - return true - } - return false - } - - private select(id: string | undefined) { - this.selected = id - this.render() - this.host.canvas.focus({ preventScroll: true }) - } - - // MARK: - Maus - - private onPointerDown(ev: PointerEvent) { - if (ev.button !== 0) return - const target = ev.target as HTMLElement - const handle = target.closest('[data-obj-connect]') - const box = target.closest('.uml-object') - if (handle && box && !this.live) return this.startLink(ev, box) - if (box) this.drag(ev, box) - } - - private onClick(ev: MouseEvent) { - if (this.suppressClick) { - this.suppressClick = false - return - } - if (this.live) return - const box = (ev.target as HTMLElement).closest('.uml-object') - const id = box?.dataset.obj - const now = Date.now() - const twice = !!id && this.lastClick.id === id && now - this.lastClick.time < 450 - this.lastClick = { id: id ?? '', time: twice ? 0 : now } - this.select(id) - if (twice) this.host.inspector.querySelector('[data-field=name]')?.select() - } - - private drag(ev: PointerEvent, box: HTMLElement) { - const o = this.find(box.dataset.obj) - if (!o) return - const start = { x: ev.clientX, y: ev.clientY } - let moved = false - let p: Point = { x: o.x, y: o.y } - const move = (m: PointerEvent) => { - const dx = m.clientX - start.x - const dy = m.clientY - start.y - if (!moved && Math.hypot(dx, dy) < 4) return - moved = true - p = { x: Math.max(0, Math.round(o.x + dx)), y: Math.max(0, Math.round(o.y + dy)) } - box.style.left = `${p.x}px` - box.style.top = `${p.y}px` - this.drawLinks() - } - const up = () => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - if (!moved) return - this.suppressClick = true - if (this.live) { - Object.assign(o, p) - return this.live.move(o.id, p) - } - this.selected = o.id - this.change(o.id, p) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } - - /** Vom Griff zu einem anderen Objekt ziehen: passendes Referenzattribut bekommt dessen Namen. */ - private startLink(ev: PointerEvent, box: HTMLElement) { - ev.preventDefault() - const from = this.find(box.dataset.obj) - if (!from) return - const { canvas, lines } = this.host - const ghost = document.createElementNS('http://www.w3.org/2000/svg', 'line') - ghost.setAttribute('class', 'vo-rel ghost') - lines.append(ghost) - const start = { x: box.offsetLeft + box.offsetWidth, y: box.offsetTop + box.offsetHeight / 2 } - const targetAt = (m: PointerEvent) => { - const el = document.elementFromPoint(m.clientX, m.clientY)?.closest('.uml-object') - return el && el !== box ? el : undefined - } - const move = (m: PointerEvent) => { - const r = canvas.getBoundingClientRect() - ghost.setAttribute('x1', String(start.x)) - ghost.setAttribute('y1', String(start.y)) - ghost.setAttribute('x2', String(m.clientX - r.left + canvas.scrollLeft)) - ghost.setAttribute('y2', String(m.clientY - r.top + canvas.scrollTop)) - for (const el of canvas.querySelectorAll('.uml-object.drop')) el.classList.remove('drop') - targetAt(m)?.classList.add('drop') - } - const up = (m: PointerEvent) => { - window.removeEventListener('pointermove', move) - window.removeEventListener('pointerup', up) - ghost.remove() - const el = targetAt(m) - el?.classList.remove('drop') - this.suppressClick = true - const to = el && this.find(el.dataset.obj) - if (!to) return - const classes = this.host.classes() - const fits = this.fields(from).filter((f) => f.target && isA(classes, to.cls, f.target)) - // Erst ein freies Attribut nehmen (null), sonst eine Liste, sonst das erste passende. - const field = fits.find((f) => !f.many && refNames(this.valueOf(from, f)).length === 0) ?? fits.find((f) => f.many) ?? fits[0] - if (!field) return this.host.message(t('web_visuobject_obj_no_ref', from.cls, to.cls)) - this.host.message('') - this.change(from.id, { values: { ...from.values, [field.name]: linkedValue(field, this.valueOf(from, field), to.name) } }) - } - window.addEventListener('pointermove', move) - window.addEventListener('pointerup', up) - } -} - -/** Schnittpunkt der Strecke von `inside` (nahe der Mitte) Richtung `toward` mit dem Rand des Rechtecks. */ -function edgePoint(r: Rect, inside: Point, toward: Point): Point { - const dx = toward.x - inside.x - const dy = toward.y - inside.y - const sx = dx === 0 ? Infinity : r.w / 2 / Math.abs(dx) - const sy = dy === 0 ? Infinity : r.h / 2 / Math.abs(dy) - const s = Math.min(sx, sy, 1) - return { x: Math.round(inside.x + dx * s), y: Math.round(inside.y + dy * s) } -} diff --git a/web/src/ui/objectLayout.ts b/web/src/ui/objectLayout.ts deleted file mode 100644 index 4e8f7667..00000000 --- a/web/src/ui/objectLayout.ts +++ /dev/null @@ -1,136 +0,0 @@ -/** - * VisuObject: Aufteilung wie in WebGoatCode. Projekt, Java-Code und Klassendiagramm liegen flach - * nebeneinander; jeder Bereich klappt mit „–“ ein, übrig bleibt ein schmaler Streifen mit seinem Namen. - * Schieber ändern die Breite des Projekts und das Verhältnis von Code und Diagramm (Doppelklick = Standard). - * Am Handy liegen die Bereiche untereinander, dort gelten die Spalten nicht (siehe styles.css). - */ - -export type PaneId = 'explorer' | 'code' | 'diagram' - -const key = 'visuobject.layout' -/** Alter Schalter aus der ersten Fassung: `0` = Projekt eingeklappt. */ -const oldExplorerKey = 'visuobject.explorer' -const strip = '40px' -const defaults = { explorer: 260, split: 45 } - -const clamp = (n: number, min: number, max: number, fallback: number) => (Number.isFinite(n) ? Math.min(max, Math.max(min, Math.round(n))) : fallback) -const clampExplorer = (n: number) => clamp(n, 180, 480, defaults.explorer) -const clampSplit = (n: number) => clamp(n, 20, 80, defaults.split) - -export class ObjectLayout { - private collapsed = new Set() - /** Breite des Projekts in px. */ - private explorer = defaults.explorer - /** Anteil des Codes an Code + Diagramm in Prozent. */ - private split = defaults.split - - constructor( - private root: HTMLElement, - private changed: () => void, - ) { - try { - const saved = JSON.parse(localStorage.getItem(key) ?? 'null') as { collapsed?: PaneId[]; explorer?: number; split?: number } | null - if (saved) { - for (const id of saved.collapsed ?? []) if (id === 'explorer' || id === 'code' || id === 'diagram') this.collapsed.add(id) - this.explorer = clampExplorer(Number(saved.explorer ?? defaults.explorer)) - this.split = clampSplit(Number(saved.split ?? defaults.split)) - } else if (localStorage.getItem(oldExplorerKey) === '0') this.collapsed.add('explorer') - } catch { - /* ohne gespeicherte Aufteilung geht es auch */ - } - for (const b of root.querySelectorAll('[data-collapse]')) b.addEventListener('click', () => this.toggle(b.dataset.collapse as PaneId, true)) - for (const b of root.querySelectorAll('[data-expand]')) b.addEventListener('click', () => this.toggle(b.dataset.expand as PaneId, false)) - const explorerSplitter = root.querySelector('.vo-splitter[data-split=explorer]')! - const codeSplitter = root.querySelector('.vo-splitter[data-split=code]')! - this.splitter(explorerSplitter, { - at: (ev) => ev.clientX - root.getBoundingClientRect().left, - get: () => this.explorer, - set: (n) => (this.explorer = clampExplorer(n)), - reset: defaults.explorer, - step: 20, - }) - this.splitter(codeSplitter, { - at: (ev) => { - const code = root.querySelector('[data-pane=code]')!.getBoundingClientRect() - const diagram = root.querySelector('[data-pane=diagram]')!.getBoundingClientRect() - return ((ev.clientX - code.left) / (diagram.right - code.left)) * 100 - }, - get: () => this.split, - set: (n) => (this.split = clampSplit(n)), - reset: defaults.split, - step: 5, - }) - this.apply() - } - - isCollapsed(id: PaneId): boolean { - return this.collapsed.has(id) - } - - /** Bereich ein- oder ausklappen; der letzte offene Bereich bleibt offen. */ - toggle(id: PaneId, hide = !this.collapsed.has(id)) { - if (hide && !this.collapsed.has(id) && this.collapsed.size >= 2) return - if (hide) this.collapsed.add(id) - else this.collapsed.delete(id) - this.apply() - // Fokus dorthin, wo man weitermacht: aufgeklappt in den Bereich, eingeklappt auf den Streifen. - const pane = this.root.querySelector(`[data-pane=${id}]`)! - if (hide) pane.querySelector('.vo-strip')?.focus() - else pane.querySelector('[data-collapse]')?.focus() - } - - private apply() { - const c = this.collapsed - const bothRightGone = c.has('code') && c.has('diagram') - const explorer = c.has('explorer') ? strip : bothRightGone ? '1fr' : `${this.explorer}px` - const code = c.has('code') ? strip : `minmax(0, ${this.split}fr)` - const diagram = c.has('diagram') ? strip : `minmax(0, ${100 - this.split}fr)` - this.root.style.setProperty('--vo-cols', `${explorer} 1px ${code} 1px ${diagram}`) - for (const pane of this.root.querySelectorAll('[data-pane]')) pane.classList.toggle('collapsed', c.has(pane.dataset.pane as PaneId)) - const explorerSplitter = this.root.querySelector('.vo-splitter[data-split=explorer]')! - const codeSplitter = this.root.querySelector('.vo-splitter[data-split=code]')! - explorerSplitter.classList.toggle('fixed', c.has('explorer') || bothRightGone) - codeSplitter.classList.toggle('fixed', c.has('code') || c.has('diagram')) - explorerSplitter.setAttribute('aria-valuenow', String(this.explorer)) - codeSplitter.setAttribute('aria-valuenow', String(this.split)) - try { - localStorage.setItem(key, JSON.stringify({ collapsed: [...c], explorer: this.explorer, split: this.split })) - } catch { - /* nicht schlimm */ - } - this.changed() - } - - private splitter(el: HTMLElement, o: { at(ev: PointerEvent): number; get(): number; set(n: number): void; reset: number; step: number }) { - el.addEventListener('pointerdown', (ev) => { - if (el.classList.contains('fixed')) return - ev.preventDefault() - el.setPointerCapture(ev.pointerId) - this.root.classList.add('vo-resizing') - const move = (m: PointerEvent) => { - o.set(o.at(m)) - this.apply() - } - const up = () => { - this.root.classList.remove('vo-resizing') - el.removeEventListener('pointermove', move) - el.removeEventListener('pointerup', up) - el.removeEventListener('pointercancel', up) - } - el.addEventListener('pointermove', move) - el.addEventListener('pointerup', up) - el.addEventListener('pointercancel', up) - }) - el.addEventListener('dblclick', () => { - o.set(o.reset) - this.apply() - }) - el.addEventListener('keydown', (ev) => { - const d = ev.key === 'ArrowLeft' ? -o.step : ev.key === 'ArrowRight' ? o.step : 0 - if (!d) return - ev.preventDefault() - o.set(o.get() + d) - this.apply() - }) - } -} diff --git a/web/src/ui/objectNew.ts b/web/src/ui/objectNew.ts deleted file mode 100644 index 983341f8..00000000 --- a/web/src/ui/objectNew.ts +++ /dev/null @@ -1,243 +0,0 @@ -/** - * VisuObject: „Neu“ im Package Explorer wie in Eclipse (New Java Project, Source Folder, Package, - * Class, Interface). Jede Art hat ein kleines Fenster; für Klassen mit Modifier, abstract/final, - * Oberklasse, Interfaces und Methoden-Rümpfen. `classSource` schreibt daraus den Java-Code. - */ - -import type { ProjectClass } from '../core/javaProject' -import { t } from './i18n' - -export type NewKind = 'project' | 'folder' | 'package' | 'class' | 'interface' - -export interface NewClassOptions { - kind: 'class' | 'interface' - /** Java-Package ohne Source Folder; leer = Standard-Package. */ - pkg: string - name: string - isPublic: boolean - isAbstract: boolean - isFinal: boolean - superclass?: ProjectClass - interfaces: ProjectClass[] - main: boolean - constructors: boolean - inherited: boolean - comment: boolean - author: string -} - -const defaultValue = (type: string) => - type === 'boolean' ? 'false' : /^(int|long|short|byte|double|float)$/.test(type) ? '0' : type === 'char' ? "'\\0'" : 'null' - -const paramList = (params: { name: string; type: string }[]) => params.map((p) => `${p.type} ${p.name}`).join(', ') - -/** Abstrakte Methoden aus Oberklasse und Interfaces, die die neue Klasse schreiben muss (ohne doppelte). */ -function inheritedAbstract(o: NewClassOptions): { name: string; type: string; params: { name: string; type: string }[]; visibility: string }[] { - const out = new Map() - const add = (cls: ProjectClass, fromInterface: boolean) => { - for (const m of cls.members) - if (m.kind === 'method' && !m.isStatic && (fromInterface || m.isAbstract)) { - const sig = `${m.name}(${m.params.map((p) => p.type).join(',')})` - if (!out.has(sig)) out.set(sig, { name: m.name, type: m.type || 'void', params: m.params, visibility: fromInterface || m.visibility === '+' ? 'public' : m.visibility === '#' ? 'protected' : '' }) - } - } - if (o.superclass) add(o.superclass, false) - for (const i of o.interfaces) add(i, true) - return [...out.values()] -} - -/** Java-Datei der neuen Klasse bzw. des neuen Interfaces. */ -export function classSource(o: NewClassOptions): string { - const lines: string[] = [] - if (o.pkg) lines.push(`package ${o.pkg};`, '') - const imports = [o.superclass, ...o.interfaces].filter((c): c is ProjectClass => !!c && !!c.pkg && c.pkg !== o.pkg).map((c) => `import ${c.pkg}.${c.name};`) - if (imports.length) lines.push(...[...new Set(imports)].sort(), '') - if (o.comment) { - lines.push('/**', ` * ${o.name}`, ' *') - lines.push(` * @author ${o.author.trim() || '…'}`, ' */') - } - const mods = [o.isPublic ? 'public' : '', o.kind === 'class' && o.isAbstract ? 'abstract' : '', o.kind === 'class' && o.isFinal ? 'final' : ''].filter(Boolean).join(' ') - const names = o.interfaces.map((i) => i.name) - const head = - o.kind === 'class' - ? `${mods ? mods + ' ' : ''}class ${o.name}${o.superclass ? ` extends ${o.superclass.name}` : ''}${names.length ? ` implements ${names.join(', ')}` : ''}` - : `${mods ? mods + ' ' : ''}interface ${o.name}${names.length ? ` extends ${names.join(', ')}` : ''}` - lines.push(`${head} {`) - const body: string[][] = [] - if (o.kind === 'class') { - if (o.constructors && o.superclass) { - const ctors = o.superclass.members.filter((m) => m.kind === 'constructor') - for (const c of ctors.length ? ctors : [{ params: [] as { name: string; type: string }[] }]) - body.push([` public ${o.name}(${paramList(c.params)}) {`, ` super(${c.params.map((p) => p.name).join(', ')});`, ' }']) - } else if (o.constructors) body.push([` public ${o.name}() {`, ' }']) - if (o.inherited && !o.isAbstract) - for (const m of inheritedAbstract(o)) - body.push([' @Override', ` ${m.visibility ? m.visibility + ' ' : ''}${m.type} ${m.name}(${paramList(m.params)}) {`, ...(m.type === 'void' ? [] : [` return ${defaultValue(m.type)};`]), ' }']) - if (o.main) body.push([' public static void main(String[] args) {', ' }']) - } - if (body.length) lines.push('', body.map((b) => b.join('\n')).join('\n\n')) - lines.push('}', '') - return lines.join('\n') -} - -// MARK: - Fenster - -const esc = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) - -export interface WizardContext { - roots: string[] - /** Java-Packages (ohne Source Folder) je Source Folder, `''` = Standard-Package. */ - packagesIn(root: string): string[] - classes: ProjectClass[] - root: string - pkg: string - /** Fehlermeldung zum Namen oder `undefined`, wenn er passt. */ - check(kind: NewKind, name: string, root: string, pkg: string): string | undefined - suggest(kind: NewKind): string -} - -export interface WizardResult { - kind: NewKind - name: string - root: string - pkg: string - options?: NewClassOptions -} - -const authorKey = 'visuobject.author' -function storedAuthor(): string { - try { - return localStorage.getItem(authorKey) ?? '' - } catch { - return '' - } -} - -/** Fenster „Neu …“; `undefined` bei Abbrechen. Rückfragen nie mit `window.prompt` (in eingebetteten Ansichten gesperrt). */ -export function newWizard(kind: NewKind, ctx: WizardContext): Promise { - return new Promise((resolve) => { - const box = document.createElement('div') - box.className = 'confirm vo-wizard-back' - const isType = kind === 'class' || kind === 'interface' - const rootSelect = `` - const pkgSelect = `` - const others = ctx.classes - const superOptions = others.filter((c) => c.kind === 'class').map((c) => ``).join('') - const interfaces = others.filter((c) => c.kind === 'interface') - const interfaceBoxes = interfaces.length - ? `
    ${esc(t(kind === 'class' ? 'web_visuobject_new_interfaces' : 'web_visuobject_new_extends_interfaces'))}${interfaces.map((c) => ``).join('')}
    ` - : '' - const check = (name: string, label: string, on = false) => `` - const typeFields = isType - ? `${rootSelect}${pkgSelect} - -
    ${esc(t('web_visuobject_new_modifiers'))} - - ${kind === 'class' ? `${check('abstract', 'abstract')}${check('final', 'final')}` : ''} -
    - ${kind === 'class' ? `` : ''} - ${interfaceBoxes} - ${ - kind === 'class' - ? `
    ${esc(t('web_visuobject_new_stubs'))} - ${check('main', 'public static void main(String[] args)')} - ${check('constructors', esc(t('web_visuobject_new_stub_constructors')))} - ${check('inherited', esc(t('web_visuobject_new_stub_inherited')), true)} -
    ` - : '' - } -
    ${esc(t('web_visuobject_new_comment_legend'))} - ${check('comment', esc(t('web_visuobject_new_comment')))} - -
    ` - : `${kind === 'package' ? rootSelect : ''}` - box.innerHTML = `` - const form = box.querySelector('form')! - const field = (name: string) => form.querySelector(`[name="${name}"]`) - const nameInput = field('name')! - const rootInput = field('root') - const pkgInput = field('pkg') - const error = form.querySelector('.vo-wizard-error')! - nameInput.value = ctx.suggest(kind) - const fillPackages = () => { - if (!pkgInput) return - const pkgs = ctx.packagesIn(rootInput?.value ?? ctx.root) - const list = pkgs.includes('') ? pkgs : [...pkgs, ''] - const keep = pkgInput.value || ctx.pkg - pkgInput.innerHTML = list.map((p) => ``).join('') - } - fillPackages() - rootInput?.addEventListener('change', fillPackages) - // abstract und final schließen sich aus, wie in Eclipse. - const abstract = field('abstract') - const final = field('final') - abstract?.addEventListener('change', () => abstract.checked && final && (final.checked = false)) - final?.addEventListener('change', () => final.checked && abstract && (abstract.checked = false)) - const validate = () => { - const message = ctx.check(kind, nameInput.value.trim(), rootInput?.value ?? ctx.root, pkgInput?.value ?? ctx.pkg) - error.textContent = message ?? '' - return !message - } - nameInput.addEventListener('input', validate) - pkgInput?.addEventListener('change', validate) - const done = (value: WizardResult | undefined) => { - box.remove() - resolve(value) - } - form.addEventListener('submit', (ev) => { - ev.preventDefault() - if (!validate()) return nameInput.focus() - const name = nameInput.value.trim() - const root = rootInput?.value ?? ctx.root - const pkg = pkgInput?.value ?? '' - if (!isType) return done({ kind, name, root, pkg }) - const author = field('author')!.value - try { - localStorage.setItem(authorKey, author) - } catch { - /* nicht schlimm */ - } - const on = (n: string) => !!field(n)?.checked - const byName = (n: string) => ctx.classes.find((c) => c.name === n) - const superName = field('superclass')?.value - done({ - kind, - name, - root, - pkg, - options: { - kind, - pkg, - name, - isPublic: field('visibility')!.value === 'public', - isAbstract: on('abstract'), - isFinal: on('final'), - superclass: superName ? byName(superName) : undefined, - interfaces: [...form.querySelectorAll('[name=iface]:checked')].map((i) => byName(i.value)).filter((c): c is ProjectClass => !!c), - main: on('main'), - constructors: on('constructors'), - inherited: on('inherited'), - comment: on('comment'), - author, - }, - }) - }) - box.addEventListener('click', (ev) => { - const target = ev.target as HTMLElement - if (target === box || target.closest('[data-cancel]')) done(undefined) - }) - box.addEventListener('keydown', (ev) => { - ev.stopPropagation() - if (ev.key === 'Escape') done(undefined) - }) - document.body.append(box) - nameInput.focus() - nameInput.select() - }) -} diff --git a/web/src/ui/objectWorkspace.ts b/web/src/ui/objectWorkspace.ts deleted file mode 100644 index 7f12ccad..00000000 --- a/web/src/ui/objectWorkspace.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * VisuObject-Workspace wie in Eclipse: ein Ordner, darin ein Ordner je Projekt mit - * `src/paket/Klasse.java`, daneben `visuobject.json` (UML-Zusatz und Lage der Kästen) - * sowie `.project` und `.classpath`, damit Eclipse das Projekt direkt importieren kann. - * Beim Lesen zählt der Ordner unter dem Source Folder als Package, wie in Eclipse. - * Welche Ordner Source Folders sind (`src`, `test` …), steht in `.classpath`. - */ - -import { defaultRoot, isFolderName, notesFromJSON, objectsFromJSON, packageKey, packageOf, packagesOf, pathFor, rootOf, sourceFoldersOf, umlFromJSON, type JavaProject } from '../core/javaProject' -import type { WsDir } from './workspaceStore' - -export const workspaceFolderName = 'VisuObject-Workspace' -const umlFile = 'visuobject.json' - -export type Positions = Record - -export const safeFolderName = (name: string) => name.replace(/[\\/:*?"<>|]/g, '_').trim() || 'Projekt' - -async function tryDir(dir: WsDir, name: string): Promise { - try { - return await dir.dir(name) - } catch { - return undefined - } -} - -/** Projektordner im Workspace: alle Ordner mit `src` oder `visuobject.json`, sortiert. */ -export async function listProjects(root: WsDir): Promise { - const out: string[] = [] - for (const entry of await root.list()) { - if (entry.kind !== 'directory') continue - const dir = await root.dir(entry.name) - if ((await dir.has('src')) || (await dir.has(umlFile))) out.push(entry.name) - } - return out.sort((a, b) => a.localeCompare(b)) -} - -/** Source Folders aus `.classpath` (``); ohne Datei nur `src`. */ -export function classpathRoots(xml: string): string[] { - const roots = [...xml.matchAll(/]*>/g)] - .map((m) => m[0]) - .filter((tag) => /\bkind\s*=\s*"src"/.test(tag) && !/\bcombineaccessrules\b/.test(tag)) - .map((tag) => /\bpath\s*=\s*"([^"]+)"/.exec(tag)?.[1] ?? '') - .filter((p) => p && !p.startsWith('/') && !p.includes(':') && p.split('/').every(isFolderName)) - return roots.length ? [...new Set(roots)] : [defaultRoot] -} - -/** Source-Einträge in `.classpath` ersetzen, alles andere (z. B. Bibliotheken aus Eclipse) bleibt. */ -export function withClasspathRoots(xml: string, roots: string[]): string { - const entries = roots.map((r) => `\t\n`).join('') - const rest = xml.replace(/[ \t]*]*\bkind\s*=\s*"src"[^>]*\/>[ \t]*\n?/g, (tag) => (/\bcombineaccessrules\b/.test(tag) ? tag : '')) - return rest.replace(/(]*>[ \t]*\n?)/, `$1${entries}`) -} - -export async function readProject(root: WsDir, name: string): Promise<{ project: JavaProject; positions: Positions }> { - const dir = await root.dir(name) - const project: JavaProject = { name, files: [], packages: [] } - const roots = (await dir.has('.classpath')) ? classpathRoots(await dir.read('.classpath')) : [defaultRoot] - const walk = async (d: WsDir, sourceFolder: string, pkg: string) => { - const entries = await d.list() - const key = packageKey(sourceFolder, pkg) - if (pkg && !entries.some((x) => x.kind === 'file' && /\.java$/i.test(x.name))) project.packages.push(key) - for (const entry of entries) { - if (entry.kind === 'directory') await walk(await d.dir(entry.name), sourceFolder, pkg ? `${pkg}.${entry.name}` : entry.name) - else if (/\.java$/i.test(entry.name)) project.files.push({ path: pathFor(key, entry.name), text: await d.read(entry.name) }) - } - } - for (const r of roots) { - let d: WsDir | undefined = dir - for (const part of r.split('/')) d = d && (await tryDir(d, part)) - if (d) await walk(d, r, '') - } - const extra = roots.filter((r) => r !== defaultRoot) - if (extra.length) project.sourceFolders = extra - // Ein Ordner mit nur Unterordnern (z. B. `de` über `de.tiere`) ist kein eigenes Package. - project.packages = project.packages.filter((p) => !project.packages.some((q) => q.startsWith(p + '.')) && !project.files.some((f) => packageOf(f.path).startsWith(p + '.'))) - project.files.sort((a, b) => a.path.localeCompare(b.path)) - let positions: Positions = {} - if (await dir.has(umlFile)) { - try { - const data = JSON.parse(await dir.read(umlFile)) as { uml?: unknown; positions?: unknown; notes?: unknown; objects?: unknown } - const uml = umlFromJSON(data.uml) - if (uml) project.uml = uml - const notes = notesFromJSON(data.notes) - if (notes) project.notes = notes - const objects = objectsFromJSON(data.objects) - if (objects) project.objects = objects - if (data.positions && typeof data.positions === 'object') { - for (const [cls, p] of Object.entries(data.positions as Record)) - if (typeof p?.x === 'number' && typeof p?.y === 'number') positions[cls] = { x: p.x, y: p.y } - } - } catch { - positions = {} - } - } - return { project, positions } -} - -const eclipseProject = (name: string) => ` - - ${name.replace(/[&<>]/g, (c) => ({ '&': '&', '<': '<', '>': '>' })[c]!)} - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - -` - -const eclipseClasspath = ` - - - - -` - -/** - * Projekt in seinen Ordner schreiben. Dateien und Packages, die es nicht mehr gibt, verschwinden; - * alles andere im Ordner (z. B. `bin` von Eclipse) bleibt. - */ -export async function writeProject(root: WsDir, folder: string, project: JavaProject, positions: Positions): Promise { - const dir = await root.dir(folder, true) - const roots = sourceFoldersOf(project) - const oldClasspath = (await dir.has('.classpath')) ? await dir.read('.classpath') : undefined - // Source Folders, die es nicht mehr gibt, verschwinden samt Inhalt (nur solche, die `.classpath` kannte). - for (const old of oldClasspath ? classpathRoots(oldClasspath) : []) - if (!roots.includes(old) && !old.includes('/') && (await dir.has(old))) await dir.remove(old) - for (const sourceFolder of roots) { - let src = dir - for (const part of sourceFolder.split('/')) src = await src.dir(part, true) - const files = project.files.filter((f) => rootOf(f.path) === sourceFolder) - const wanted = new Set(files.map((f) => f.path.slice(f.path.indexOf(':') + 1))) - const keepDirs = new Set() - for (const key of packagesOf(project, sourceFolder)) { - const pkg = key.slice(key.indexOf(':') + 1) - if (!pkg) continue - const parts = pkg.split('.') - for (let i = 1; i <= parts.length; i++) keepDirs.add(parts.slice(0, i).join('/')) - } - // Erst aufräumen, dann schreiben: So bleibt keine alte Fassung einer verschobenen Datei liegen. - const clean = async (d: WsDir, path: string) => { - for (const entry of await d.list()) { - const full = path ? `${path}/${entry.name}` : entry.name - if (entry.kind === 'directory') { - if (keepDirs.has(full)) await clean(await d.dir(entry.name), full) - else if (!roots.some((r) => `${sourceFolder}/${full}` === r || r.startsWith(`${sourceFolder}/${full}/`))) await d.remove(entry.name) - } else if (/\.java$/i.test(entry.name) && !wanted.has(full)) await d.remove(entry.name) - } - } - await clean(src, '') - for (const key of packagesOf(project, sourceFolder)) { - const pkg = key.slice(key.indexOf(':') + 1) - let d = src - for (const part of pkg ? pkg.split('.') : []) d = await d.dir(part, true) - for (const f of files.filter((x) => packageOf(x.path) === key)) { - const name = f.path.slice(f.path.lastIndexOf('/') + 1).slice(f.path.includes('/') ? 0 : f.path.indexOf(':') + 1) - if (!(await d.has(name)) || (await d.read(name)) !== f.text) await d.write(name, f.text) - } - } - } - await dir.write(umlFile, JSON.stringify({ format: 'visuobject', version: 1, uml: project.uml ?? {}, ...(project.notes?.length ? { notes: project.notes } : {}), ...(project.objects?.length ? { objects: project.objects } : {}), positions }, null, 2) + '\n') - if (!(await dir.has('.project'))) await dir.write('.project', eclipseProject(project.name)) - const classpath = withClasspathRoots(oldClasspath ?? eclipseClasspath, roots) - if (classpath !== oldClasspath) await dir.write('.classpath', classpath) -} - -/** Freier Projektname im Workspace: `MeinProjekt`, `MeinProjekt2` … */ -export function freeProjectName(base: string, taken: string[]): string { - const lower = new Set(taken.map((n) => n.toLowerCase())) - let name = base - for (let n = 2; lower.has(name.toLowerCase()); n++) name = base + n - return name -} diff --git a/web/src/ui/papView.ts b/web/src/ui/papView.ts deleted file mode 100644 index 70b9fe8a..00000000 --- a/web/src/ui/papView.ts +++ /dev/null @@ -1,359 +0,0 @@ -import { inline } from '../learn/markdown' -import { papFits, papLayout, papLines, type Pap, type PapBox, type PapShape } from '../learn/pap' -import { t } from './i18n' - -/** - * PAP bauen im Lernbereich: Der Plan steht mit leeren Plätzen da, darunter liegen die fertigen Elemente gemischt. - * Element antippen und dann den Platz (oder Element auf den Platz ziehen). Ein belegter Platz gibt sein Element beim - * Antippen zurück. - */ - -const SVG = 'http://www.w3.org/2000/svg' -let papCount = 0 -const FILL: Record = { oval: '#d1f2d9', rechteck: '#e5f0ff', raute: '#fff4d6', parallelogramm: '#f2e6ff' } - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function s(tag: string, attrs: Record = {}): SVGElement { - const e = document.createElementNS(SVG, tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, String(v)) - return e -} - -function shapeEl(shape: PapShape, b: PapBox): SVGElement { - const l = b.x - b.w / 2 - const r = b.x + b.w / 2 - const t0 = b.y - b.h / 2 - const t1 = b.y + b.h / 2 - if (shape === 'raute') return s('path', { d: `M${b.x} ${t0} L${r} ${b.y} L${b.x} ${t1} L${l} ${b.y} Z` }) - if (shape === 'parallelogramm') return s('path', { d: `M${l + 10} ${t0} L${r} ${t0} L${r - 10} ${t1} L${l} ${t1} Z` }) - return s('rect', { x: l, y: t0, width: b.w, height: b.h, rx: shape === 'oval' ? b.h / 2 : 0 }) -} - -function textEl(text: string, b: PapBox, shape: PapShape): SVGElement { - const lines = papLines(text, b.w - (shape === 'raute' ? 50 : 14)) - const g = s('text', { 'text-anchor': 'middle', 'font-size': lines.length > 1 ? 12 : 13 }) - lines.forEach((line, i) => { - const span = s('tspan', { x: b.x, y: b.y + 4.5 + (i - (lines.length - 1) / 2) * 14 }) - span.textContent = line - g.append(span) - }) - return g -} - -function arrow(points: [number, number][], id: string): SVGElement { - return s('polyline', { points: points.map((p) => p.join(',')).join(' '), fill: 'none', 'marker-end': `url(#${id})` }) -} - -function label(text: string, x: number, y: number, yes: boolean): SVGElement { - const e = s('text', { x, y, 'font-size': 12, 'font-weight': 600, fill: yes ? '#248a3d' : '#d70015' }) - e.textContent = text - return e -} - -/** Element als kleines Bild für die Ablage unten. */ -function cardSVG(shape: PapShape, text: string): SVGElement { - const lines = papLines(text, 110) - const long = Math.max(...lines.map((l) => l.length)) - const w = Math.max(70, long * 6.6 + (shape === 'raute' ? 56 : 26)) - const hgt = shape === 'raute' ? 48 : lines.length > 1 ? 40 : 30 - const svg = s('svg', { viewBox: `0 0 ${w + 4} ${hgt + 4}`, width: w + 4, height: hgt + 4, 'aria-hidden': 'true' }) - const b = { x: (w + 4) / 2, y: (hgt + 4) / 2, w, h: hgt } - const shapeE = shapeEl(shape, b) - shapeE.setAttribute('fill', FILL[shape]) - shapeE.setAttribute('stroke', '#1c1c1e') - shapeE.setAttribute('stroke-width', '1.5') - svg.append(shapeE, textEl(text, { ...b, w: lines.length > 1 ? 124 : w }, shape)) - return svg -} - -function shuffled(n: number): number[] { - const order = [...Array(n).keys()] - for (let i = n - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)) - ;[order[i], order[j]] = [order[j], order[i]] - } - // Nie schon in der richtigen Reihenfolge anbieten. - if (n > 1 && order.every((v, i) => v === i)) order.reverse() - return order -} - -/** Legende: Symbol und Bedeutung für alle vier Formen. */ -function legend(): HTMLElement { - const list = h('dl', { class: 'learn-pap-legend' }) - const items: [PapShape, string][] = [ - ['oval', 'web_learn_pap_legend_oval'], - ['rechteck', 'web_learn_pap_legend_rect'], - ['raute', 'web_learn_pap_legend_diamond'], - ['parallelogramm', 'web_learn_pap_legend_para'], - ] - for (const [shape, key] of items) { - const w = shape === 'raute' ? 44 : 40 - const svg = s('svg', { viewBox: `0 0 ${w + 4} 28`, width: w + 4, height: 28, 'aria-hidden': 'true' }) - const el = shapeEl(shape, { x: (w + 4) / 2, y: 14, w, h: shape === 'raute' ? 24 : 18 }) - el.setAttribute('fill', FILL[shape]) - el.setAttribute('stroke', '#1c1c1e') - el.setAttribute('stroke-width', '1.5') - svg.append(el) - list.append(h('dt', {}, svg), h('dd', {}, t(key))) - } - return list -} - -export function renderPap(pap: Pap): HTMLElement { - const box = h('section', { class: 'learn-pap' }) - box.append(h('strong', { class: 'learn-pap-title' }, pap.title)) - if (pap.task) { - const p = h('p') - p.innerHTML = inline(pap.task) - box.append(p) - } - box.append(h('p', { class: 'learn-pap-hint' }, t('web_learn_pap_hint'))) - - const { boxes, height } = papLayout(pap) - // Nur so breit wie der Inhalt, damit der Plan in der schmalen Lernspalte möglichst groß wird. - const shown = boxes.filter(Boolean) - const minX = Math.min(...shown.map((b) => b.x - b.w / 2)) - 4 - const hasRaute = pap.nodes.some((n) => n.shape === 'raute') - const maxX = Math.max(...shown.map((b) => b.x + b.w / 2), hasRaute ? Math.max(...shown.map((b) => b.x)) + 85 + 40 : 0) + 4 - const svg = s('svg', { viewBox: `${minX} 0 ${maxX - minX} ${height}`, class: 'learn-pap-plan', role: 'group', 'aria-label': pap.title }) - const arrowId = `pap-arrow-${++papCount}` - svg.innerHTML = - `` - const lines = s('g', { stroke: '#1c1c1e', 'stroke-width': 2 }) - const labels = s('g') - const yes = t('web_learn_pap_yes') - const no = t('web_learn_pap_no') - const top = (i: number) => boxes[i].y - boxes[i].h / 2 - const bottom = (i: number) => boxes[i].y + boxes[i].h / 2 - const main = pap.nodes.map((_, i) => i).filter((i) => !pap.nodes[i].isSide) - main.forEach((i, k) => { - const n = pap.nodes[i] - const b = boxes[i] - const next = main[k + 1] - if (next !== undefined) { - lines.append(arrow([[b.x, bottom(i)], [b.x, top(next) - 2]], arrowId)) - if (n.shape === 'raute') labels.append(label(n.sideExit === 'nein' ? yes : no, b.x + 6, bottom(i) + 13, n.sideExit === 'nein')) - } - if (n.shape !== 'raute') return - const right = b.x + b.w / 2 - labels.append(label(n.sideExit === 'ja' ? yes : no, right + 5, b.y - 6, n.sideExit === 'ja')) - if (n.backTo !== undefined) { - const y = top(n.backTo) - 14 - lines.append(arrow([[right, b.y], [right + 22, b.y], [right + 22, y], [b.x, y]], arrowId)) - } else if (n.side !== undefined) { - const sb = boxes[n.side] - const y = top(i) - 14 - lines.append(arrow([[right, b.y], [sb.x - sb.w / 2 - 2, b.y]], arrowId)) - lines.append(arrow([[sb.x, sb.y - sb.h / 2], [sb.x, y], [b.x, y]], arrowId)) - } - }) - svg.append(lines, labels) - - const placed: (number | undefined)[] = pap.nodes.map(() => undefined) - const slots: SVGElement[] = [] - const cards: HTMLButtonElement[] = [] - let selected: number | undefined - - const status = h('p', { class: 'learn-pap-status', role: 'status' }) - const explanation = pap.explanation ? h('p', { class: 'learn-explanation' }) : undefined - if (explanation) { - explanation.innerHTML = inline(pap.explanation!) - explanation.hidden = true - } - let locked = false - - const clearMarks = () => { - slots.forEach((g) => g.classList.remove('right', 'wrong')) - status.textContent = '' - status.className = 'learn-pap-status' - } - - const drawSlot = (i: number) => { - const g = slots[i] - g.replaceChildren() - const n = pap.nodes[i] - const card = placed[i] - const shape = shapeEl(n.shape, boxes[i]) - shape.setAttribute('class', 'learn-pap-shape') - if (card === undefined) { - shape.setAttribute('fill', '#f7f7f9') - shape.setAttribute('stroke-dasharray', '6 4') - g.append(shape) - g.setAttribute('aria-label', t('web_learn_pap_empty')) - } else { - const c = pap.nodes[card] - shape.setAttribute('fill', FILL[c.shape]) - g.append(shape, textEl(c.text, boxes[i], n.shape)) - g.setAttribute('aria-label', c.text) - } - } - - const refresh = () => { - pap.nodes.forEach((_, i) => drawSlot(i)) - cards.forEach((c, i) => { - c.hidden = placed.includes(i) - c.classList.toggle('selected', selected === i) - }) - } - - const place = (slot: number, card: number) => { - if (locked) return - const before = placed.indexOf(card) - if (before >= 0) placed[before] = undefined - placed[slot] = card - selected = undefined - clearMarks() - refresh() - } - - pap.nodes.forEach((_, i) => { - const g = s('g', { class: 'learn-pap-slot', 'data-slot': i, tabindex: 0, role: 'button' }) - const activate = () => { - if (locked) return - if (selected !== undefined) place(i, selected) - else if (placed[i] !== undefined) { - placed[i] = undefined - clearMarks() - refresh() - } - } - g.addEventListener('click', activate) - g.addEventListener('keydown', (e) => { - if ((e as KeyboardEvent).key !== 'Enter' && (e as KeyboardEvent).key !== ' ') return - e.preventDefault() - activate() - }) - slots.push(g) - svg.append(g) - }) - - const tray = h('div', { class: 'learn-pap-tray' }) - let dragged = false - for (const i of shuffled(pap.nodes.length)) { - const n = pap.nodes[i] - const card = h('button', { class: 'learn-pap-card', type: 'button', 'aria-label': n.text }, cardSVG(n.shape, n.text)) as HTMLButtonElement - cards[i] = card - card.addEventListener('click', () => { - if (dragged || locked) return - selected = selected === i ? undefined : i - refresh() - }) - // Ziehen mit Maus, Stift oder Finger. - card.addEventListener('pointerdown', (down) => { - if (locked) return - dragged = false - let ghost: HTMLElement | undefined - const move = (e: PointerEvent) => { - if (!ghost && Math.hypot(e.clientX - down.clientX, e.clientY - down.clientY) < 6) return - if (!ghost) { - dragged = true - ghost = card.cloneNode(true) as HTMLElement - ghost.classList.add('learn-pap-ghost') - document.body.append(ghost) - card.classList.add('dragging') - } - ghost.style.left = `${e.clientX}px` - ghost.style.top = `${e.clientY}px` - slots.forEach((g) => g.classList.remove('over')) - target(e)?.classList.add('over') - } - const target = (e: PointerEvent) => { - if (ghost) ghost.style.display = 'none' - const el = document.elementFromPoint(e.clientX, e.clientY)?.closest('[data-slot]') as SVGElement | null - if (ghost) ghost.style.display = '' - return el && slots.includes(el) ? el : undefined - } - const up = (e: PointerEvent) => { - card.removeEventListener('pointermove', move) - card.removeEventListener('pointerup', up) - card.removeEventListener('pointercancel', up) - slots.forEach((g) => g.classList.remove('over')) - card.classList.remove('dragging') - if (!ghost) return - const slot = e.type === 'pointerup' ? target(e) : undefined - ghost.remove() - if (slot) place(Number(slot.getAttribute('data-slot')), i) - // Der Klick nach dem Loslassen soll nichts auswählen. - setTimeout(() => (dragged = false)) - } - card.setPointerCapture(down.pointerId) - card.addEventListener('pointermove', move) - card.addEventListener('pointerup', up) - card.addEventListener('pointercancel', up) - }) - tray.append(card) - } - - const check = h('button', { class: 'learn-pap-check' }, t('web_learn_check')) - const solution = h('button', {}, t('web_learn_cloze_solution')) - const again = h('button', {}, t('web_learn_cloze_again')) - solution.hidden = true - again.hidden = true - - const finish = () => { - locked = true - check.hidden = true - solution.hidden = true - again.hidden = false - tray.hidden = true - work.classList.add('done') - if (explanation) explanation.hidden = false - } - - check.addEventListener('click', () => { - const missing = placed.filter((p) => p === undefined).length - let right = 0 - placed.forEach((card, i) => { - const ok = card !== undefined && papFits(pap, i, card) - slots[i].classList.toggle('right', ok) - slots[i].classList.toggle('wrong', card !== undefined && !ok) - if (ok) right++ - }) - const all = right === pap.nodes.length - status.textContent = all - ? t('web_learn_pap_all_right') - : missing - ? t('web_learn_pap_missing_fmt', missing) - : t('web_learn_pap_score_fmt', right, pap.nodes.length) - status.className = `learn-pap-status ${all ? 'right' : 'wrong'}` - if (all) finish() - else if (!missing) solution.hidden = false - }) - solution.addEventListener('click', () => { - pap.nodes.forEach((_, i) => (placed[i] = i)) - selected = undefined - refresh() - clearMarks() - slots.forEach((g) => g.classList.add('shown')) - finish() - }) - again.addEventListener('click', () => { - pap.nodes.forEach((_, i) => (placed[i] = undefined)) - locked = false - selected = undefined - slots.forEach((g) => g.classList.remove('shown')) - clearMarks() - refresh() - check.hidden = false - again.hidden = true - tray.hidden = false - work.classList.remove('done') - if (explanation) explanation.hidden = true - }) - - refresh() - // Plan links, Bausteine rechts daneben: so sieht man am Laptop beides zugleich. - const plan = h('div', { class: 'learn-pap-left' }) - plan.append(svg) - if (pap.legend) plan.append(legend()) - const work = h('div', { class: 'learn-pap-work' }, plan, tray) - box.append(work, h('div', { class: 'learn-pap-actions' }, check, solution, again), status) - if (explanation) box.append(explanation) - return box -} diff --git a/web/src/ui/projectZip.ts b/web/src/ui/projectZip.ts deleted file mode 100644 index bfc8283b..00000000 --- a/web/src/ui/projectZip.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate' -import { barePackage, declaredPackage, defaultRoot, diskPath, isFolderName, packageKey, pathFor, notesFromJSON, objectsFromJSON, projectFromFiles, rootOf, sourceFoldersOf, umlFromJSON, type JavaProject } from '../core/javaProject' - -/** - * VisuObject-Projekt als ZIP wie in Eclipse oder BlueJ: `Name/src/paket/Klasse.java`. - * Beim Öffnen zählt die Zeile `package …;` in jeder Datei, nicht der Ordner im ZIP. - * Was nur UML kennt (Aggregation, Name der Beziehung …) liegt daneben in `Name/visuobject.json`. - */ - -const umlFile = 'visuobject.json' - -export function projectToZip(project: JavaProject): Uint8Array { - const folder = project.name.replace(/[\\/:*?"<>|]/g, '_') || 'Projekt' - const entries: Record = {} - for (const f of project.files) entries[`${folder}/${diskPath(f.path)}`] = new Uint8Array(strToU8(f.text)) // eigene Kopie: fflate prüft instanceof Uint8Array - // Leere Packages und Source Folders als Ordner behalten. - const dirs = [...project.packages.map((p) => `${folder}/${rootOf(p)}/${barePackage(p).replace(/\./g, '/')}/`), ...sourceFoldersOf(project).map((r) => `${folder}/${r}/`)] - for (const dir of dirs) if (!Object.keys(entries).some((k) => k.startsWith(dir))) entries[dir.replace(/\/\/$/, '/')] = new Uint8Array() - if ((project.uml && Object.keys(project.uml).length) || project.notes?.length || project.objects?.length) - entries[`${folder}/${umlFile}`] = new Uint8Array( - strToU8(JSON.stringify({ format: 'visuobject', version: 1, uml: project.uml ?? {}, ...(project.notes?.length ? { notes: project.notes } : {}), ...(project.objects?.length ? { objects: project.objects } : {}) }, null, 2)), - ) - return zipSync(entries, { level: 6 }) -} - -export function projectFromZip(data: Uint8Array, fallbackName: string): JavaProject { - const entries = unzipSync(data) - const javaFiles = Object.entries(entries) - .filter(([name]) => /\.java$/i.test(name) && !name.startsWith('__MACOSX/')) - .map(([name, bytes]) => ({ name, text: strFromU8(bytes) })) - const top = new Set(Object.keys(entries).map((n) => n.split('/')[0])) - const name = top.size === 1 && Object.keys(entries).some((n) => n.includes('/')) ? [...top][0] : fallbackName - // Nur Dateinamen weitergeben: Das Package kommt aus dem Code. Der Source Folder ist der Ordner über den Package-Ordnern. - const single = name !== fallbackName - const project = projectFromFiles(name, []) - for (const f of javaFiles) { - const one = projectFromFiles(name, [{ name: f.name.slice(f.name.lastIndexOf('/') + 1), text: f.text }]).files[0] - const dirs = f.name.split('/').slice(single ? 1 : 0, -1) - const pkgDirs = declaredPackage(one.text).split('.').filter(Boolean) - const tail = dirs.slice(dirs.length - pkgDirs.length).join('/') - const root = tail === pkgDirs.join('/') ? dirs.slice(0, dirs.length - pkgDirs.length).join('/') : '' - const sourceFolder = root && root !== defaultRoot && root.split('/').every(isFolderName) && !root.includes(':') ? root : defaultRoot - const path = pathFor(packageKey(sourceFolder, declaredPackage(one.text)), one.path.slice(one.path.lastIndexOf('/') + 1)) - project.files = [...project.files.filter((x) => x.path !== path), { ...one, path }] - if (sourceFolder !== defaultRoot && !project.sourceFolders?.includes(sourceFolder)) project.sourceFolders = [...(project.sourceFolders ?? []), sourceFolder] - } - const extra = Object.entries(entries).find(([n]) => n === umlFile || n.endsWith(`/${umlFile}`)) - if (extra) { - try { - const data = JSON.parse(strFromU8(extra[1])) as { uml?: unknown; notes?: unknown; objects?: unknown } - const uml = umlFromJSON(data.uml) - if (uml) project.uml = uml - const notes = notesFromJSON(data.notes) - if (notes) project.notes = notes - const objects = objectsFromJSON(data.objects) - if (objects) project.objects = objects - } catch { - /* ohne UML-Zusatz geht es auch */ - } - } - return project -} diff --git a/web/src/ui/renameDialog.ts b/web/src/ui/renameDialog.ts deleted file mode 100644 index 04c64ad0..00000000 --- a/web/src/ui/renameDialog.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { checkNewName } from '../core/rename' -import { t } from './i18n' - -export interface RenameRequest { - /** Namen zur Auswahl (Struktogramm); vorne der vorgeschlagene. Im Code genau einer: das Wort unter dem Cursor. */ - names: string[] - /** Alle Namen im Programm, um „gibt es schon“ zu erkennen. */ - existing: string[] - /** Stellen mit diesem Namen (für den Hinweis). */ - count(name: string): number -} - -const esc = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) - -/** Fenster „Variable umbenennen“: Name wählen, neuen Namen tippen, Enter übernimmt, Esc bricht ab. */ -export function askRename(request: RenameRequest): Promise<{ from: string; to: string } | undefined> { - return new Promise((resolve) => { - const box = document.createElement('div') - box.className = 'confirm' - const single = request.names.length === 1 - box.innerHTML = `` - const form = box.querySelector('form')! - const old = box.querySelector('label input, label select')! - const input = box.querySelector('.rename-new')! - const info = box.querySelector('.rename-info')! - const apply = box.querySelector('button[type=submit]')! - - const update = () => { - const from = old.value - const to = input.value.trim() - const check = checkNewName(from, to, request.existing) - const count = t('web_rename_count_fmt', request.count(from)) - info.classList.toggle('rename-warning', !check.ok ? to !== '' && to !== from : check.warning === 'exists') - if (!check.ok) { - info.textContent = check.reason === 'invalid' ? t('web_rename_invalid') : check.reason === 'keyword' ? t('web_rename_keyword_fmt', to) : count - } else info.textContent = check.warning === 'exists' ? `${count} ${t('web_rename_exists_fmt', to)}` : count - apply.disabled = !check.ok - } - const close = (result?: { from: string; to: string }) => { - box.remove() - resolve(result) - } - input.value = old.value - old.addEventListener('change', () => { - input.value = old.value - update() - }) - input.addEventListener('input', update) - form.addEventListener('submit', (e) => { - e.preventDefault() - const to = input.value.trim() - if (checkNewName(old.value, to, request.existing).ok) close({ from: old.value, to }) - }) - box.addEventListener('click', (e) => { - if (e.target === box || (e.target as HTMLElement).dataset.r === '0') close() - }) - box.addEventListener('keydown', (e) => { - if (e.key === 'Escape') { - e.preventDefault() - e.stopPropagation() - close() - } - }) - update() - document.body.append(box) - input.focus() - input.select() - }) -} - -/** Kleines Menü beim Rechtsklick mit „Umbenennen …“; schließt bei Klick daneben und mit Esc. */ -export function showRenameMenu(x: number, y: number, label: string, pick: () => void) { - document.querySelector('.rename-menu')?.remove() - const menu = document.createElement('div') - menu.className = 'rename-menu' - menu.setAttribute('role', 'menu') - const item = document.createElement('button') - item.setAttribute('role', 'menuitem') - item.textContent = label - menu.append(item) - menu.style.left = `${Math.min(x, window.innerWidth - 220)}px` - menu.style.top = `${Math.min(y, window.innerHeight - 50)}px` - const close = () => { - menu.remove() - document.removeEventListener('pointerdown', outside, true) - document.removeEventListener('keydown', escape, true) - } - const outside = (e: Event) => { - if (!menu.contains(e.target as Node)) close() - } - const escape = (e: KeyboardEvent) => { - if (e.key === 'Escape') close() - } - item.addEventListener('click', () => { - close() - pick() - }) - document.addEventListener('pointerdown', outside, true) - document.addEventListener('keydown', escape, true) - document.body.append(menu) - item.focus() -} diff --git a/web/src/ui/renderer.ts b/web/src/ui/renderer.ts deleted file mode 100644 index 2fa84b3c..00000000 --- a/web/src/ui/renderer.ts +++ /dev/null @@ -1,386 +0,0 @@ -import { canvasTextLines, keywordSplit } from '../core/diagramText' -import type { Layout, LayoutNode, Metrics, Rect } from '../core/layout' -import { ElementType, type VSElement } from '../core/model' -import { diagramFontFamily, fontExtents, type MeasureText } from '../core/textMeasurement' - -/** SVG-Port von `DiagramCanvasRenderer.swift` (Kacheln, Linien, Text). */ - -const SVG_NS = 'http://www.w3.org/2000/svg' - -/** `DiagramCanvasInk` (bei Diagramm-Stufe „klein“, Faktor 1). */ -const Ink = { - diagramLineWidth: 2, - outerFrameLineWidth: 2, - selectionLineWidth: 3.5, - canvasOuterMargin: 16, - cellTextInsetX: 18, - cellTextInsetY: 15, - multiHeaderFirstLineY: 14, - branchLabelInsetX: 10, - fallauswahlCaseLabelBand: 26, - callSideBarInset: 14, - callTextInsetFromSideBar: 20, - loopBodyLeadingInset: 20, -} - -type Omission = { top?: boolean; left?: boolean; bottom?: boolean; right?: boolean } - -/** Farbe wie bei den Codeblöcken (`cm-scope-…`): Schleife rosa, Verzweigung blau, Anweisungen gelb wie die Methode im Code. */ -export function scopeKind(type: ElementType): string | undefined { - switch (type) { - case ElementType.forSchleife: - case ElementType.whileSchleife: - case ElementType.doUntilSchleife: - case ElementType.endlosschleife: - return 'loop' - case ElementType.verzweigung: - case ElementType.fallauswahl: - return 'if' - default: - return undefined - } -} - -export function el( - tag: K, - attrs: Record = {}, -): SVGElementTagNameMap[K] { - const e = document.createElementNS(SVG_NS, tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, String(v)) - return e -} - -export class DiagramRenderer { - constructor( - private metrics: Metrics, - private measure: MeasureText, - ) {} - - private get lineHeight() { - return this.metrics.lineHeight - } - private get fontSize() { - return this.metrics.fontSize - } - - /** Im Simulationsmodus bedeutet die Markierung „aktueller Schritt“ statt Bearbeitungsauswahl. */ - usesSimulationHighlight = false - /** Code live offen: das Element der Cursorzeile wie die Codezeile hellblau füllen. */ - fillsSelection = false - - render( - layout: Layout, - size: { width: number; height: number }, - selectedPath?: number[], - /** Export: `exportCanvasOuterMarginPt` statt des Rands im Editor. */ - outerMargin = Ink.canvasOuterMargin, - ): SVGSVGElement { - const svg = el('svg', { - width: size.width, - height: size.height, - viewBox: `0 0 ${size.width} ${size.height}`, - 'font-family': diagramFontFamily, - 'font-size': this.fontSize, - class: 'diagram', - }) - svg.append(el('rect', { x: 0, y: 0, width: size.width, height: size.height, fill: '#fafafa' })) - const m = outerMargin - svg.append( - el('rect', { - x: m, - y: m, - width: layout.canvasSize.width - 2 * m - 1, - height: layout.canvasSize.height - 2 * m - 1, - fill: 'none', - stroke: 'black', - 'stroke-width': Ink.outerFrameLineWidth, - }), - ) - const g = el('g') - for (const n of layout.elements) this.drawNode(n, g, selectedPath, {}, undefined, 'method') - svg.append(g) - return svg - } - - private line(g: SVGElement, points: [number, number][]) { - g.append( - el('polyline', { - points: points.map((p) => p.join(',')).join(' '), - fill: 'none', - stroke: 'black', - 'stroke-width': Ink.diagramLineWidth, - 'stroke-linejoin': 'miter', - }), - ) - } - - private strokeCellBorder(g: SVGElement, r: Rect, o: Omission) { - const x0 = r.x - const y0 = r.y - const x1 = r.x + r.width - const y1 = r.y + r.height - if (!o.top && !o.left && !o.bottom && !o.right) { - g.append(el('rect', { x: x0, y: y0, width: r.width, height: r.height, fill: 'none', stroke: 'black', 'stroke-width': Ink.diagramLineWidth })) - return - } - if (!o.top) this.line(g, [[x0, y0], [x1, y0]]) - if (!o.right) this.line(g, [[x1, y0], [x1, y1]]) - if (!o.bottom) this.line(g, [[x1, y1], [x0, y1]]) - if (!o.left) this.line(g, [[x0, y1], [x0, y0]]) - } - - private textWidth(line: string): number { - const parts = keywordSplit(line) - if (parts) { - const kw = this.measure(parts.keyword, this.fontSize, 'bold') - return kw + (parts.rest === '' ? 0 : this.measure(' ' + parts.rest, this.fontSize, 'medium')) - } - return this.measure(line, this.fontSize, 'medium') - } - - /** Zeile mit fett gedrucktem Schlüsselwort, Ursprung oben links (`anchor: .topLeading`). */ - private drawKeywordLine(g: SVGElement, line: string, x: number, y: number) { - // Grundlinie selbst setzen: Safari kennt `dominant-baseline: text-before-edge` nicht - const t = el('text', { x, y: y + fontExtents(this.fontSize, 'medium').ascent, 'font-weight': 500 }) - t.style.whiteSpace = 'pre' - const parts = keywordSplit(line) - if (parts) { - const kw = el('tspan', { 'font-weight': 700 }) - kw.textContent = parts.keyword - t.append(kw) - if (parts.rest !== '') { - const rest = el('tspan', {}) - // geschütztes Leerzeichen: Safari verschluckt sonst das führende Leerzeichen im tspan - rest.textContent = '\u00a0' + parts.rest - t.append(rest) - } - } else { - t.textContent = line - } - g.append(t) - } - - private drawLabel(g: SVGElement, text: string, x: number, y: number, bold: boolean, baseline: 'top' | 'bottom') { - const extents = fontExtents(this.fontSize, bold ? 'bold' : 'medium') - const t = el('text', { - x, - y: baseline === 'top' ? y + extents.ascent : y - extents.descent, - 'font-weight': bold ? 700 : 500, - }) - t.style.whiteSpace = 'pre' - t.textContent = text - g.append(t) - } - - private roofMetrics(node: LayoutNode, r: Rect, headerH: number, dividerX: number) { - const roofBottom = r.y + headerH - const yInset = node.dividerYInset ?? 0 - const apexPadding = 12 - const blockH = Math.max(node.element.textLines.length, 1) * this.lineHeight - const topStart = r.y + Ink.multiHeaderFirstLineY - if (node.element.type === ElementType.fallauswahl) { - const caseBand = Math.max(Ink.fallauswahlCaseLabelBand, this.lineHeight + 10) - const titleBottomLimit = roofBottom - caseBand - const apexY = Math.min(roofBottom + yInset, titleBottomLimit - 8) - const apexClampedY = Math.max(apexY, topStart + blockH + 6) - return { apex: { x: dividerX, y: apexClampedY }, maxTextBottom: titleBottomLimit - apexPadding, roofBottom } - } - const apex = { x: dividerX, y: roofBottom + yInset } - return { apex, maxTextBottom: apex.y - apexPadding, roofBottom } - } - - private drawNode( - node: LayoutNode, - g: SVGElement, - selectedPath: number[] | undefined, - omission: Omission, - parentType?: ElementType, - parentScope?: string, - ) { - const r = node.frame - const e = node.element - const maxX = r.x + r.width - const maxY = r.y + r.height - const isMulti = e.type === ElementType.verzweigung || e.type === ElementType.fallauswahl - const headerH = isMulti ? node.headerBandHeight : 0 - const isSelected = selectedPath !== undefined && samePath(node.idPath, selectedPath) - const lines = canvasTextLines(e) - - const cell = el('g', { 'data-path': node.idPath.join(',') }) - g.append(cell) - const sim = this.usesSimulationHighlight - // Hintergrundfarbe aus der Datei (`bgcolor`), die Auswahl hat Vorrang. - const bg = e.backgroundColor - const own = bg && bg.a > 0 ? `rgba(${bg.r}, ${bg.g}, ${bg.b}, ${bg.a / 255})` : 'white' - const fill = isSelected && (sim || this.fillsSelection) ? 'rgba(199, 230, 255, 0.55)' : own - // Anweisung, Aufruf, Aussprung immer gelb; nur der leere Platzhalter ø nimmt die Farbe des Blocks. - const scope = scopeKind(e.type) ?? (e.type === ElementType.leerElement ? parentScope : 'method') - // Fläche in der Farbe des Blocks per CSS (Einstellung „Blöcke farbig“); im Export bleibt sie weiß. - const area = el('rect', { x: r.x, y: r.y, width: r.width, height: r.height, fill }) - if (fill === 'white' && scope) area.setAttribute('class', `ns-scope ns-scope-${scope}`) - cell.append(area) - this.strokeCellBorder(cell, r, omission) - - const bar = Ink.callSideBarInset - if (e.type === ElementType.aufruf) { - this.line(cell, [[r.x + bar, r.y], [r.x + bar, maxY]]) - this.line(cell, [[maxX - bar, r.y], [maxX - bar, maxY]]) - } else if (e.type === ElementType.aussprung) { - this.line(cell, [[r.x + bar, r.y], [r.x, r.y + r.height / 2], [r.x + bar, maxY]]) - } - - if (isMulti && node.dividerX !== undefined) { - const dividerX = node.dividerX - const roof = this.roofMetrics(node, r, headerH, dividerX) - const blockH = Math.max(lines.length, 1) * this.lineHeight - const topStart = r.y + Ink.multiHeaderFirstLineY - this.line(cell, [[r.x, r.y], [roof.apex.x, roof.apex.y], [maxX, r.y]]) - if (e.type === ElementType.fallauswahl) this.line(cell, [[r.x, roof.roofBottom], [maxX, roof.roofBottom]]) - - let firstY: number - if (topStart + blockH <= roof.maxTextBottom) firstY = topStart - else firstY = Math.max(r.y + 2, roof.maxTextBottom - (Math.max(lines.length, 1) - 1) * this.lineHeight - this.lineHeight) - lines.forEach((line, i) => { - const tw = this.textWidth(line) - let tx: number - if (e.type === ElementType.verzweigung) { - const lo = r.x + Ink.cellTextInsetX - const hi = maxX - tw - Ink.cellTextInsetX - tx = Math.min(Math.max(dividerX - tw / 2, lo), hi) - } else { - tx = r.x + r.width / 2 - tw / 2 - } - this.drawKeywordLine(cell, line, tx, firstY + i * this.lineHeight) - }) - } else if (e.type === ElementType.doUntilSchleife) { - // „do“ und Fuß werden nach den Kindern gezeichnet. - } else if (e.type === ElementType.anweisung || e.type === ElementType.aufruf || e.type === ElementType.aussprung) { - const ix = Ink.cellTextInsetX - let contentLeft = r.x + ix - let contentRight = maxX - ix - if (e.type === ElementType.aufruf) { - contentLeft = r.x + bar + Ink.callTextInsetFromSideBar - contentRight = maxX - bar - Ink.callTextInsetFromSideBar - } else if (e.type === ElementType.aussprung) { - contentLeft = r.x + bar + ix - } - const contentWidth = Math.max(0, contentRight - contentLeft) - let y = r.y + r.height / 2 - (Math.max(1, lines.length) * this.lineHeight) / 2 - for (const line of lines) { - this.drawKeywordLine(cell, line, contentLeft + (contentWidth - this.textWidth(line)) / 2, y) - y += this.lineHeight - } - } else { - const total = Math.max(1, lines.length) * this.lineHeight - let y = parentType === ElementType.doUntilSchleife ? r.y + r.height / 2 - total / 2 : r.y + Ink.cellTextInsetY - for (const line of lines) { - this.drawKeywordLine(cell, line, r.x + Ink.cellTextInsetX, y) - y += this.lineHeight - } - } - - node.children.forEach((c, idx) => { - const childOmission: Omission = e.type === ElementType.doUntilSchleife && idx === 0 ? { top: true, left: true } : {} - this.drawNode(c, g, selectedPath, childOmission, e.type, scope) - }) - - // Ab hier über den Kindern zeichnen. - const over = el('g') - g.append(over) - - if (e.type === ElementType.doUntilSchleife) { - const dividerX = node.children[0]?.frame.x ?? r.x + (node.loopBodyLeadingInset > 0 ? node.loopBodyLeadingInset : Ink.loopBodyLeadingInset) - this.drawLabel(over, 'do', r.x + 4, r.y + this.metrics.doUntilDoLabelTopInset, true, 'top') - const ySep = maxY - node.headerBandHeight - this.line(over, [[dividerX, ySep], [maxX, ySep]]) - this.line(over, [[dividerX, r.y], [dividerX, ySep]]) - let y = ySep + this.metrics.doUntilFooterTopInset - for (const line of lines) { - this.drawKeywordLine(over, line, r.x + Ink.cellTextInsetX, y) - y += this.lineHeight - } - } - - if (isMulti && node.dividerX !== undefined && node.caseColumnFrames.length > 1) { - const roof = this.roofMetrics(node, r, headerH, node.dividerX) - const apex = roof.apex - node.caseColumnFrames.forEach((col, idx) => { - if (idx >= node.caseColumnFrames.length - 1) return - const xSep = col.x + col.width - const yRaw = yOnHeaderDiagonal(xSep, r, apex) - const yTop = Number.isFinite(yRaw) ? Math.min(Math.max(yRaw, r.y), maxY) : r.y - this.line(over, [[xSep, maxY], [xSep, yTop]]) - }) - const cases = e.cases - if (cases && cases.length === node.caseColumnFrames.length) { - const labelY = e.type === ElementType.fallauswahl ? roof.roofBottom - 6 : r.y + headerH - 8 - const lx = Ink.branchLabelInsetX - if (e.type === ElementType.verzweigung && cases.length === 2) { - this.drawLabel(over, 'true', r.x + lx, labelY, true, 'bottom') - const right = node.caseColumnFrames[1] - const rw = this.measure('false', this.fontSize, 'bold') - this.drawLabel(over, 'false', right.x + right.width - lx - rw, labelY, true, 'bottom') - } else { - cases.forEach((c, idx) => { - const col = node.caseColumnFrames[idx] - const bold = ['default', 'true', 'false'].includes(c.name.toLowerCase()) - const tw = this.measure(c.name, this.fontSize, bold ? 'bold' : 'medium') - this.drawLabel(over, c.name, col.x + col.width / 2 - tw / 2, labelY, bold, 'bottom') - }) - } - } - } - - if (isSelected) { - over.append( - el('rect', { - x: r.x, - y: r.y, - width: r.width, - height: r.height, - class: 'selection-frame', - fill: 'none', - stroke: sim ? 'rgba(66, 140, 242, 0.78)' : 'rgba(0, 122, 255, 0.9)', - 'stroke-width': Ink.selectionLineWidth, - }), - ) - } - } -} - -function yOnHeaderDiagonal(xSep: number, rect: Rect, apex: { x: number; y: number }): number { - const topY = rect.y - if (xSep <= apex.x) { - const run = apex.x - rect.x - if (Math.abs(run) < 0.5) return apex.y - return topY + ((apex.y - topY) / run) * (xSep - rect.x) - } - const run = rect.x + rect.width - apex.x - if (Math.abs(run) < 0.5) return apex.y - return apex.y + ((topY - apex.y) / run) * (xSep - apex.x) -} - -export function samePath(a: number[], b: number[]): boolean { - return a.length === b.length && a.every((v, i) => v === b[i]) -} - -/** Alle Knoten in Zeichenreihenfolge (Eltern vor Kindern). */ -export function flattenNodes(nodes: LayoutNode[]): LayoutNode[] { - const out: LayoutNode[] = [] - const walk = (n: LayoutNode) => { - out.push(n) - n.children.forEach(walk) - } - nodes.forEach(walk) - return out -} - -/** Wie `displayDocumentForLayout`: Layout rechnet mit den angezeigten Zeilen (Schlüsselwörter, Platzhalter). */ -export function displayElement(e: VSElement): VSElement { - return { - ...e, - textLines: canvasTextLines(e), - loopBody: e.loopBody?.map(displayElement), - cases: e.cases?.map((c) => ({ name: c.name, elements: c.elements.map(displayElement) })), - } -} diff --git a/web/src/ui/rescueGameView.ts b/web/src/ui/rescueGameView.ts deleted file mode 100644 index caef98a4..00000000 --- a/web/src/ui/rescueGameView.ts +++ /dev/null @@ -1,339 +0,0 @@ -import { inline } from '../learn/markdown' -import { crosswordGrid, gatePlaceholder, type CrosswordGame, type RescueGame } from '../learn/rescueGame' -import { t } from './i18n' - -/** Spiel „Prinzessin retten“: Stationen mit Zahlen, Kreuzworträtsel und das Tor mit dem geheimen Wort. */ - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function rich(tag: string, attrs: Record, markdown: string): HTMLElement { - const e = h(tag, attrs) - e.innerHTML = inline(markdown) - return e -} - -function codeBlock(code: string): HTMLElement { - return h('pre', { class: 'learn-game-code mono', dir: 'ltr' }, ...code.split('\n').map((line) => h('div', { class: 'ln' }, line || ' '))) -} - -export function renderRescueGame(game: RescueGame, ludwigURL: string): HTMLElement { - const box = h('section', { class: 'learn-game learn-rescue' }) - const head = h('div', { class: 'learn-game-head' }) - head.append(h('img', { src: ludwigURL, alt: '', width: '40', height: '40' }), h('strong', {}, game.title)) - const total = game.stations.length - - // Der Weg zum Turm: Ludwig rückt mit jeder gelösten Station weiter. - const dots = game.stations.map(() => h('span', { class: 'learn-rescue-dot' })) - const ludwig = h('img', { class: 'learn-rescue-ludwig', src: ludwigURL, alt: '', width: '32', height: '32' }) - const tower = h('span', { class: 'learn-rescue-tower', 'aria-hidden': 'true' }, '🏰', h('span', { class: 'learn-rescue-zora' }, '🐐'), h('span', { class: 'learn-rescue-fox' }, '🦊')) - const zoraFree = h('span', { class: 'learn-rescue-free' }, '🐐') - const path = h('div', { class: 'learn-rescue-path', 'aria-hidden': 'true' }, ludwig, ...dots, tower) - const status = h('p', { class: 'learn-game-status' }) - const stage = h('div', { class: 'learn-game-stage' }) - const crossword = crosswordView(game) - box.append(head, path, status, stage) - - let solved = 0 - const moveLudwig = () => { - dots.forEach((d, i) => d.classList.toggle('done', i < solved)) - // Ludwig steht hinter dem letzten gelösten Punkt. - if (solved) dots[solved - 1].after(ludwig) - else path.prepend(ludwig) - } - - const alphabetView = () => { - const cells = [...game.alphabet].map((c, i) => h('span', { class: 'learn-rescue-letter' }, h('b', {}, c), h('small', {}, String(i)))) - return { element: h('div', { class: 'learn-rescue-alphabet mono', dir: 'ltr' }, ...cells), cells } - } - - const showStation = (index: number) => { - const station = game.stations[index] - status.textContent = t('web_learn_rescue_station_fmt', index + 1, total, station.name) - const alphabet = alphabetView() - const input = h('input', { type: 'text', inputmode: 'numeric', autocomplete: 'off', class: 'learn-rescue-number mono', 'aria-label': t('web_learn_rescue_number') }) as HTMLInputElement - const check = h('button', { class: 'primary' }, t('web_learn_check')) as HTMLButtonElement - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const submit = () => { - const value = input.value.trim() - if (!/^-?\d+$/.test(value)) { - feedback.className = 'learn-game-feedback wrong' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_not_number'))) - return - } - if (Number(value) !== station.answer) { - feedback.className = 'learn-game-feedback wrong' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_wrong')), ...(station.hint ? [rich('div', { class: 'learn-game-explain' }, `**${t('web_learn_hint')}:** ${station.hint}`)] : [])) - input.select() - return - } - input.disabled = check.disabled = true - const letter = game.alphabet.charAt(station.answer) - alphabet.cells[station.answer].classList.add('hit') - crossword.give(station.row, station.col, letter) - solved++ - moveLudwig() - const last = index + 1 === total - const next = h('button', { class: 'primary' }, last ? t('web_learn_rescue_to_crossword') : t('web_game_next')) - next.addEventListener('click', () => (last ? showCrossword() : showStation(index + 1))) - feedback.className = 'learn-game-feedback right' - feedback.replaceChildren( - h('p', {}, t('web_game_right')), - h('p', { class: 'learn-rescue-charat mono', dir: 'ltr' }, `alphabet.charAt(${station.answer})`, h('span', { 'aria-hidden': 'true' }, ' → '), h('code', {}, `'${letter}'`)), - rich('div', { class: 'learn-game-explain' }, station.explanation), - h('p', { class: 'learn-rescue-moved' }, t('web_learn_rescue_letter_moved')), - next, - ) - next.focus({ preventScroll: true }) - } - check.addEventListener('click', submit) - input.addEventListener('keydown', (e) => { - if (e.key === 'Enter') submit() - }) - stage.replaceChildren( - codeBlock(station.code), - rich('p', { class: 'learn-game-question' }, station.question), - h('div', { class: 'learn-rescue-answer' }, input, check), - feedback, - h('p', { class: 'learn-rescue-label' }, t('web_learn_rescue_alphabet')), - codeBlock(`String alphabet = "${game.alphabet}";`), - alphabet.element, - crossword.element, - ) - input.focus({ preventScroll: true }) - } - - const showCrossword = () => { - status.textContent = t('web_learn_rescue_crossword') - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const check = h('button', { class: 'primary' }, t('web_learn_check')) as HTMLButtonElement - check.addEventListener('click', () => { - if (!crossword.check()) { - feedback.className = 'learn-game-feedback wrong' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_cw_wrong'))) - return - } - check.disabled = true - crossword.lock() - const next = h('button', { class: 'primary' }, t('web_learn_rescue_to_gate')) - next.addEventListener('click', showGate) - feedback.className = 'learn-game-feedback right' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_cw_done')), next) - next.focus({ preventScroll: true }) - }) - crossword.unlock() - stage.replaceChildren(rich('p', {}, game.crosswordText), crossword.element, check, feedback) - crossword.focusFirst() - } - - const showGate = () => { - status.textContent = t('web_learn_rescue_gate') - const input = h('input', { type: 'text', autocomplete: 'off', autocapitalize: 'off', spellcheck: 'false', class: 'learn-rescue-word mono', size: String(game.keyword.length + 2), 'aria-label': t('web_learn_rescue_word') }) as HTMLInputElement - const lines = game.gateCode.split('\n').map((line) => { - const at = line.indexOf(gatePlaceholder) - if (at < 0) return h('div', { class: 'ln' }, line || ' ') - return h('div', { class: 'ln' }, line.slice(0, at), input, line.slice(at + gatePlaceholder.length)) - }) - const open = h('button', { class: 'primary' }, t('web_learn_rescue_open')) as HTMLButtonElement - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const submit = () => { - const value = input.value.trim() - if (value !== game.keyword) { - const almost = value.toUpperCase() === game.keyword.toUpperCase() - feedback.className = 'learn-game-feedback wrong' - feedback.replaceChildren(h('p', {}, t(almost ? 'web_learn_rescue_gate_case' : 'web_learn_rescue_gate_wrong'))) - input.select() - return - } - input.disabled = open.disabled = true - box.classList.add('freed') - ludwig.after(zoraFree) - status.textContent = '' - const again = h('button', {}, t('web_game_again')) - again.addEventListener('click', restart) - feedback.className = 'learn-game-feedback right' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_freed')), rich('div', { class: 'learn-game-explain' }, game.end), again) - } - open.addEventListener('click', submit) - input.addEventListener('keydown', (e) => { - if (e.key === 'Enter') submit() - }) - stage.replaceChildren(rich('p', {}, game.gateText), h('div', { class: 'learn-game-code mono learn-rescue-gate', dir: 'ltr' }, ...lines), open, feedback) - input.focus({ preventScroll: true }) - } - - const restart = () => { - solved = 0 - box.classList.remove('freed') - zoraFree.remove() - crossword.reset() - moveLudwig() - showStation(0) - } - - const start = h('button', { class: 'primary' }, t('web_game_start')) - start.addEventListener('click', restart) - stage.append(rich('p', {}, game.intro), start) - return box -} - -/** Spiel „Begriffe-Rätsel“: nur das Kreuzworträtsel mit Lösungswort. */ -export function renderCrosswordGame(game: CrosswordGame, ludwigURL: string): HTMLElement { - const box = h('section', { class: 'learn-game learn-rescue learn-crossword-game' }) - const head = h('div', { class: 'learn-game-head' }) - head.append(h('img', { src: ludwigURL, alt: '', width: '40', height: '40' }), h('strong', {}, game.title)) - const crossword = crosswordView(game) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const check = h('button', { class: 'primary' }, t('web_learn_check')) as HTMLButtonElement - check.addEventListener('click', () => { - if (!crossword.check()) { - feedback.className = 'learn-game-feedback wrong' - feedback.replaceChildren(h('p', {}, t('web_learn_rescue_cw_wrong'))) - return - } - check.disabled = true - crossword.lock() - const again = h('button', {}, t('web_game_again')) - again.addEventListener('click', () => { - crossword.reset() - crossword.unlock() - check.disabled = false - feedback.className = 'learn-game-feedback' - feedback.replaceChildren() - crossword.focusFirst() - }) - feedback.className = 'learn-game-feedback right' - feedback.replaceChildren( - h('p', {}, t('web_learn_rescue_cw_done')), - h('p', { class: 'learn-game-result' }, h('span', { class: 'mono', dir: 'ltr' }, game.keyword)), - ...(game.end ? [rich('p', {}, game.end)] : []), - again, - ) - }) - crossword.unlock() - box.append(head, rich('p', {}, game.intro), crossword.element, check, feedback) - return box -} - -/** Das Kreuzworträtsel: erst nur zum Anschauen, dann zum Ausfüllen. */ -function crosswordView(game: Pick) { - const grid = crosswordGrid(game) - const keyCells = new Map(game.solution.map((s, i) => [`${s.row} ${s.col}`, i])) - const numbers = new Map() - for (const w of game.words) numbers.set(`${w.row} ${w.col}`, w.number) - const inputs = new Map() - const board = h('div', { class: 'learn-cw-grid', dir: 'ltr' }) - board.style.gridTemplateColumns = `repeat(${game.cols}, var(--cw-cell))` - /** Richtung beim Tippen: waagrecht, außer das Feld gehört nur zu einem senkrechten Wort. */ - let across = true - const wordsAt = (r: number, c: number) => - game.words.filter((w) => (w.across ? w.row === r && c >= w.col && c < w.col + w.word.length : w.col === c && r >= w.row && r < w.row + w.word.length)) - const step = (r: number, c: number, d: number) => { - const next = across ? `${r} ${c + d}` : `${r + d} ${c}` - inputs.get(next)?.focus() - } - grid.forEach((row, r) => - row.forEach((letter, c) => { - if (!letter) return board.append(h('span', { class: 'learn-cw-empty' })) - const key = `${r} ${c}` - const input = h('input', { type: 'text', maxlength: '1', autocomplete: 'off', autocapitalize: 'characters', spellcheck: 'false', 'aria-label': t('web_learn_rescue_cell_fmt', r + 1, c + 1) }) as HTMLInputElement - input.disabled = true - input.addEventListener('focus', () => { - const ws = wordsAt(r, c) - if (!ws.some((w) => w.across === across)) across = ws[0].across - input.select() - }) - input.addEventListener('input', () => { - input.value = input.value.slice(-1).toUpperCase() - input.classList.remove('wrong') - updateKeyword() - if (input.value) step(r, c, 1) - }) - input.addEventListener('keydown', (e) => { - if (e.key === 'Backspace' && !input.value) step(r, c, -1) - else if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') { - across = true - step(r, c, e.key === 'ArrowRight' ? 1 : -1) - } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { - across = false - step(r, c, e.key === 'ArrowDown' ? 1 : -1) - } else return - e.preventDefault() - }) - inputs.set(key, input) - const keyIndex = keyCells.get(key) - const cell = h('span', { class: `learn-cw-cell${keyIndex !== undefined ? ' key' : ''}` }) - const number = numbers.get(key) - if (number) cell.append(h('small', { class: 'learn-cw-number' }, String(number))) - if (keyIndex !== undefined) cell.append(h('small', { class: 'learn-cw-keyindex' }, String(keyIndex + 1))) - cell.append(input) - board.append(cell) - }), - ) - const clueList = (isAcross: boolean) => { - const list = h('ol', { class: 'learn-cw-clues' }) - for (const w of game.words.filter((w) => w.across === isAcross).sort((a, b) => a.number - b.number)) { - const item = rich('li', { value: String(w.number) }, `${w.clue} (${w.word.length})`) - item.addEventListener('click', () => { - across = w.across - inputs.get(`${w.row} ${w.col}`)?.focus() - }) - list.append(item) - } - return h('div', {}, h('strong', {}, t(isAcross ? 'web_learn_rescue_across' : 'web_learn_rescue_down')), list) - } - const keyBoxes = game.solution.map(() => h('span', { class: 'learn-cw-keybox' })) - const updateKeyword = () => game.solution.forEach((s, i) => (keyBoxes[i].textContent = inputs.get(`${s.row} ${s.col}`)!.value || ' ')) - const element = h( - 'div', - { class: 'learn-cw' }, - h('div', { class: 'learn-cw-board' }, board, h('p', { class: 'learn-cw-keyword' }, `${t('web_learn_rescue_keyword')} `, h('span', { class: 'mono', dir: 'ltr' }, ...keyBoxes))), - h('div', { class: 'learn-cw-cluebox' }, clueList(true), clueList(false)), - ) - const given = new Set() - return { - element, - /** Buchstabe aus einer Station: steht fest im Feld. */ - give(r: number, c: number, letter: string) { - const input = inputs.get(`${r} ${c}`)! - input.value = letter - input.parentElement!.classList.add('given', 'arrived') - given.add(`${r} ${c}`) - updateKeyword() - }, - unlock() { - for (const [key, input] of inputs) input.disabled = given.has(key) - }, - lock() { - for (const input of inputs.values()) input.disabled = true - }, - focusFirst() { - ;[...inputs].find(([key]) => !given.has(key))?.[1].focus({ preventScroll: true }) - }, - /** Markiert falsche Felder; `true`, wenn alles stimmt. */ - check(): boolean { - let right = true - for (const [key, input] of inputs) { - const [r, c] = key.split(' ').map(Number) - const bad = input.value !== grid[r][c] - input.classList.toggle('wrong', bad) - if (bad) right = false - } - return right - }, - reset() { - given.clear() - for (const input of inputs.values()) { - input.value = '' - input.disabled = true - input.classList.remove('wrong') - input.parentElement!.classList.remove('given', 'arrived') - } - updateKeyword() - }, - } -} diff --git a/web/src/ui/robot3d.ts b/web/src/ui/robot3d.ts deleted file mode 100644 index 64ab61e5..00000000 --- a/web/src/ui/robot3d.ts +++ /dev/null @@ -1,443 +0,0 @@ -import * as THREE from 'three' -import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' -import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js' -import { buildMBot2, drawScreen, type MBot2Model, type RobotPart } from './mbot2Model' -import { CELL, LINE_WIDTH, type Point, type Pose, type RobotWorldSetup } from '../core/robotWorld' - -/** - * 3D-Ansicht des VisuBot-Simulators mit three.js (MIT). Der mBot2 ist aus einfachen Formen nachgebaut - * (keine Makeblock-Modelldaten). Einheit: 1 = 1 cm. Boden-y der Welt wird zu −z, damit man von hinten auf den Roboter schaut. - */ - -const toScene = (p: Point, height = 0) => new THREE.Vector3(p.x, height, -p.y) -const rad = (deg: number) => (deg * Math.PI) / 180 - -const colors = { - floor: 0xf4f1ea, - grid: 0xd6d0c4, - wall: 0xc9a46b, - tape: 0x222222, - trail: 0xe8590c, -} - -export type { RobotPart } - -/** Abstand der Räder (Mitte zu Mitte) und Radius, damit sich die Räder passend zur Fahrt drehen. */ -const TRACK = 12.9 -const WHEEL_RADIUS = 3.3 - -export class Robot3D { - readonly canvas: HTMLCanvasElement - private renderer: THREE.WebGLRenderer - private scene = new THREE.Scene() - private camera = new THREE.PerspectiveCamera(45, 1, 1, 2000) - private controls: OrbitControls - private model: MBot2Model - private robot: THREE.Group - /** Spur als flaches Band (Linienbreite lässt WebGL nicht zu): fertige Stücke plus eins, das gerade wächst. */ - private trailGroup = new THREE.Group() - private trailPiece = new THREE.BoxGeometry(1, 0.15, 1.4) - private trailMaterial = new THREE.MeshStandardMaterial({ color: colors.trail }) - private liveSegment: THREE.Mesh - private worldGroup = new THREE.Group() - private frame?: number - private sun: THREE.DirectionalLight - private resize: ResizeObserver - private shown: Pose = { x: 0, y: 0, heading: 0 } - private anim?: { from: Pose; to: Pose; start: number; ms: number } - private trail: Point[] = [] - private wasShown = false - /** Zuletzt gezeigte Lage, um die Räder mitzudrehen */ - private wheelPose?: Pose - /** Kamerafahrt zu einem Teil (Tour durch das Modell) */ - private flight?: { from: { pos: THREE.Vector3; target: THREE.Vector3 }; to: { pos: THREE.Vector3; target: THREE.Vector3 }; start: number; ms: number } - - constructor(private host: HTMLElement) { - this.canvas = document.createElement('canvas') - this.canvas.className = 'visubot-canvas' - host.append(this.canvas) - this.renderer = new THREE.WebGLRenderer({ canvas: this.canvas, antialias: true, alpha: true }) - this.renderer.setPixelRatio(Math.min(2, window.devicePixelRatio)) - this.renderer.toneMapping = THREE.ACESFilmicToneMapping - this.renderer.shadowMap.enabled = true - this.renderer.shadowMap.type = THREE.PCFSoftShadowMap - // Spiegelungen auf Aluminium und Kunststoff aus einer einfachen Raumumgebung - const pmrem = new THREE.PMREMGenerator(this.renderer) - this.scene.environment = pmrem.fromScene(new RoomEnvironment(), 0.04).texture - this.scene.environmentIntensity = 0.7 - pmrem.dispose() - this.scene.add(new THREE.HemisphereLight(0xffffff, 0x8a8170, 0.9)) - const sun = new THREE.DirectionalLight(0xffffff, 1.8) - sun.position.set(-40, 90, 50) - sun.castShadow = true - sun.shadow.mapSize.set(1024, 1024) - sun.shadow.camera.left = sun.shadow.camera.bottom = -30 - sun.shadow.camera.right = sun.shadow.camera.top = 30 - sun.shadow.camera.far = 300 - sun.shadow.bias = -0.0005 - this.sun = sun - this.scene.add(sun, sun.target) - this.scene.add(this.worldGroup) - this.model = buildMBot2() - this.robot = this.model.group - this.scene.add(this.robot) - this.scene.add(this.trailGroup) - this.liveSegment = new THREE.Mesh(this.trailPiece, this.trailMaterial) - this.scene.add(this.liveSegment) - this.camera.position.set(0, 75, 95) - this.controls = new OrbitControls(this.camera, this.canvas) - this.controls.target.set(0, 0, -15) - // Auch von unten anschauen (dort ist der Boden durchsichtig) - this.controls.maxPolarAngle = Math.PI - 0.05 - this.controls.minDistance = 12 - this.controls.maxDistance = 600 - this.controls.update() - // Wer selbst dreht, hält die Kamerafahrt und das langsame Kreisen an. - this.controls.addEventListener('start', () => { - this.flight = undefined - this.controls.autoRotate = false - }) - this.resize = new ResizeObserver(() => this.fit()) - this.resize.observe(host) - this.fit() - this.loop() - } - - dispose() { - if (this.frame !== undefined) cancelAnimationFrame(this.frame) - this.resize.disconnect() - this.controls.dispose() - this.renderer.dispose() - this.renderer.forceContextLoss() - this.canvas.remove() - } - - /** Boden, Wände und Klebeband neu aufbauen. */ - setWorld(setup: RobotWorldSetup) { - this.worldGroup.clear() - // Kamera so, dass der ganze Boden schräg von hinten zu sehen ist - const m = Math.max(setup.width, setup.depth, 80) - this.flight = undefined - this.controls.autoRotate = false - this.controls.target.set(0, 0, 0) - this.camera.position.set(0, m * 0.95, m * 0.5) - this.controls.update() - const floor = new THREE.Mesh(new THREE.PlaneGeometry(setup.width, setup.depth), new THREE.MeshStandardMaterial({ color: colors.floor, roughness: 0.9 })) - floor.rotation.x = -Math.PI / 2 - floor.receiveShadow = true - this.worldGroup.add(floor) - // Raster im Abstand von 10 cm (ein Schritt von mbot.forward()). - const grid: number[] = [] - for (let x = -setup.width / 2; x <= setup.width / 2 + 1e-6; x += 10) grid.push(x, 0.05, -setup.depth / 2, x, 0.05, setup.depth / 2) - for (let z = -setup.depth / 2; z <= setup.depth / 2 + 1e-6; z += 10) grid.push(-setup.width / 2, 0.05, z, setup.width / 2, 0.05, z) - const gridGeometry = new THREE.BufferGeometry() - gridGeometry.setAttribute('position', new THREE.Float32BufferAttribute(grid, 3)) - this.worldGroup.add(new THREE.LineSegments(gridGeometry, new THREE.LineBasicMaterial({ color: colors.grid }))) - const border = [ - { from: { x: -setup.width / 2, y: -setup.depth / 2 }, to: { x: setup.width / 2, y: -setup.depth / 2 } }, - { from: { x: setup.width / 2, y: -setup.depth / 2 }, to: { x: setup.width / 2, y: setup.depth / 2 } }, - { from: { x: setup.width / 2, y: setup.depth / 2 }, to: { x: -setup.width / 2, y: setup.depth / 2 } }, - { from: { x: -setup.width / 2, y: setup.depth / 2 }, to: { x: -setup.width / 2, y: -setup.depth / 2 } }, - ] - const wallMaterial = new THREE.MeshStandardMaterial({ color: colors.wall }) - for (const w of [...border.map((b) => ({ ...b, low: true })), ...setup.walls.map((b) => ({ ...b, low: false }))]) { - const length = Math.hypot(w.to.x - w.from.x, w.to.y - w.from.y) - const height = w.low ? 4 : 15 - const box = new THREE.Mesh(new THREE.BoxGeometry(length, height, 2), wallMaterial) - box.position.copy(toScene({ x: (w.from.x + w.to.x) / 2, y: (w.from.y + w.to.y) / 2 }, height / 2)) - box.rotation.y = Math.atan2(w.to.y - w.from.y, w.to.x - w.from.x) - this.worldGroup.add(box) - } - // Wandklötze, schwarze Felder und Ziele aus einer Weltkarte (wie die Bäume und Kleeblätter bei Kara) - const blockGeometry = new THREE.BoxGeometry(CELL, 12, CELL) - for (const b of setup.blocks ?? []) { - const box = new THREE.Mesh(blockGeometry, wallMaterial) - box.position.copy(toScene(b, 6)) - box.castShadow = box.receiveShadow = true - this.worldGroup.add(box) - } - const cellGeometry = new THREE.BoxGeometry(CELL, 0.1, CELL) - const markMaterial = new THREE.MeshStandardMaterial({ color: colors.tape }) - for (const m of setup.marks ?? []) { - const cell = new THREE.Mesh(cellGeometry, markMaterial) - cell.position.copy(toScene(m, 0.1)) - this.worldGroup.add(cell) - } - const goalMaterial = new THREE.MeshStandardMaterial({ color: colors.tape }) - const flagMaterial = new THREE.MeshStandardMaterial({ color: 0x2fb344, emissive: 0x1b7a2c, emissiveIntensity: 0.4 }) - const goals = setup.goals ?? [] - const isGoal = (x: number, y: number) => goals.some((g) => Math.abs(g.x - x) < 1e-6 && Math.abs(g.y - y) < 1e-6) - for (const g of goals) { - const cell = new THREE.Mesh(cellGeometry, goalMaterial) - cell.position.copy(toScene(g, 0.1)) - this.worldGroup.add(cell) - // Eine Fahne je Zielfläche: nur im Feld hinten rechts - if (isGoal(g.x + CELL, g.y) || isGoal(g.x, g.y + CELL)) continue - // Kleine Zielfahne in der Ecke, damit man das Ziel von den schwarzen Feldern unterscheidet - const pole = new THREE.Mesh(new THREE.CylinderGeometry(0.25, 0.25, 9, 8), new THREE.MeshStandardMaterial({ color: 0xdddddd })) - pole.position.copy(toScene({ x: g.x + CELL / 2 - 1, y: g.y + CELL / 2 - 1 }, 4.5)) - const flag = new THREE.Mesh(new THREE.BoxGeometry(4, 2.6, 0.2), flagMaterial) - flag.position.copy(toScene({ x: g.x + CELL / 2 - 3, y: g.y + CELL / 2 - 1 }, 7.6)) - this.worldGroup.add(pole, flag) - } - // Farbige Felder für den Farbsensor - const fieldColors = { red: 0xe03131, green: 0x2fb344, blue: 0x1c7ed6, yellow: 0xfab005 } - for (const c of setup.colors ?? []) { - const cell = new THREE.Mesh(cellGeometry, new THREE.MeshStandardMaterial({ color: fieldColors[c.color] })) - cell.position.copy(toScene(c.at, 0.1)) - this.worldGroup.add(cell) - } - // Haltefelder: hellgrün, der Liniensensor sieht sie nicht - const targetMaterial = new THREE.MeshStandardMaterial({ color: 0x2fb344, transparent: true, opacity: 0.3, depthWrite: false }) - for (const t of setup.targets ?? []) { - const cell = new THREE.Mesh(cellGeometry, targetMaterial) - cell.position.copy(toScene(t, 0.12)) - this.worldGroup.add(cell) - } - const tape = new THREE.MeshStandardMaterial({ color: colors.tape }) - for (const line of setup.lines) { - for (let i = 0; i + 1 < line.length; i++) { - const a = line[i] - const b = line[i + 1] - const length = Math.hypot(b.x - a.x, b.y - a.y) + LINE_WIDTH - const strip = new THREE.Mesh(new THREE.BoxGeometry(length, 0.1, LINE_WIDTH), tape) - strip.position.copy(toScene({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }, 0.1)) - strip.rotation.y = Math.atan2(b.y - a.y, b.x - a.x) - this.worldGroup.add(strip) - } - } - } - - /** Roboter sofort an `pose` stellen (Neustart). */ - place(pose: Pose, trail: Point[]) { - this.anim = undefined - this.shown = { ...pose } - this.trail = trail.map((p) => ({ ...p })) - this.trailGroup.clear() - this.applyPose(this.shown) - } - - /** Zu `pose` fahren bzw. drehen, in `ms` Millisekunden; `trail` ist die Spur danach. */ - moveTo(pose: Pose, trail: Point[], ms: number) { - if (this.anim) this.shown = { ...this.anim.to } - this.trail = trail.map((p) => ({ ...p })) - let to = { ...pose } - // Kürzester Weg beim Drehen, aber volle Umdrehungen (turnRight(360)) bleiben sichtbar. - const diff = to.heading - this.shown.heading - if (diff > 180) to = { ...to, heading: to.heading - 360 } - else if (diff < -180) to = { ...to, heading: to.heading + 360 } - this.anim = { from: { ...this.shown }, to, start: performance.now(), ms: Math.max(1, ms) } - } - - /** Nur der Roboter auf einer runden Scheibe, z. B. zum Kennenlernen in einer Lektion. */ - showcase() { - this.worldGroup.clear() - const disc = new THREE.Mesh(new THREE.CircleGeometry(16, 48), new THREE.MeshStandardMaterial({ color: 0xe9e4da, roughness: 0.95 })) - disc.rotation.x = -Math.PI / 2 - disc.receiveShadow = true - this.worldGroup.add(disc) - this.place({ x: 0, y: 0, heading: 0 }, [{ x: 0, y: 0 }]) - this.controls.target.set(0, 5, -2) - this.camera.position.set(-20, 18, -24) - this.controls.update() - } - - /** Teile hervorheben (leicht leuchten lassen), leere Liste = keins. */ - highlight(part: RobotPart | RobotPart[] | undefined) { - const lit = new Set(part === undefined ? [] : Array.isArray(part) ? part : [part]) - for (const [name, group] of Object.entries(this.model.partGroups) as [RobotPart, THREE.Group][]) { - group.traverse((o) => { - const mesh = o as THREE.Mesh - if (!mesh.isMesh) return - const m = mesh.material as THREE.MeshStandardMaterial - // Beschriftungen (MeshBasicMaterial) leuchten nicht mit - if (!m.emissive) return - m.userData.baseEmissive ??= { color: m.emissive.getHex(), intensity: m.emissiveIntensity } - const base = m.userData.baseEmissive as { color: number; intensity: number } - if (lit.has(name)) { - m.emissive.setHex(0xffb000) - m.emissiveIntensity = Math.max(base.intensity, 0.22) - } else { - m.emissive.setHex(base.color) - m.emissiveIntensity = base.intensity - } - }) - } - } - - /** - * Kamera fährt zu den Teilen (leer = ganzer Roboter). `view`: Blickrichtung vorn, hinten, oben, unten, seite; - * sonst schräg von vorn links. `spin`: danach langsam um den Roboter kreisen. - */ - focusOn(parts: RobotPart[], view = '', spin = false, ms = 900) { - const box = new THREE.Box3() - this.robot.updateMatrixWorld(true) - for (const p of parts) box.expandByObject(this.model.partGroups[p]) - if (box.isEmpty()) box.setFromObject(this.robot) - const target = box.getCenter(new THREE.Vector3()) - const size = box.getSize(new THREE.Vector3()).length() - const direction = new THREE.Vector3( - ...(( - { - vorn: [0, 0.35, -1], - front: [0, 0.35, -1], - hinten: [0, 0.55, 1], - back: [0, 0.55, 1], - oben: [0, 1, 0.12], - top: [0, 1, 0.12], - unten: [0.05, -1, -0.3], - bottom: [0.05, -1, -0.3], - seite: [-1, 0.5, 0.15], - side: [-1, 0.5, 0.15], - } as Record - )[view] ?? [-0.75, 0.6, -0.85]), - ).normalize() - const distance = Math.max(14, size * (parts.length ? 1.8 : 1.35) + 6) - const pos = target.clone().addScaledVector(direction, distance) - this.flight = { - from: { pos: this.camera.position.clone(), target: this.controls.target.clone() }, - to: { pos, target }, - start: performance.now(), - ms, - } - this.controls.autoRotate = spin - this.controls.autoRotateSpeed = 1.2 - } - - /** Text auf dem Bildschirm des CyberPi; `undefined` = Startgesicht. */ - setScreen(text: string | undefined) { - if (text === this.shownScreen) return - this.shownScreen = text - drawScreen(this.model.screen.canvas, text) - this.model.screen.texture.needsUpdate = true - } - - private shownScreen?: string - - /** Alle LEDs auf dem CyberPi in einer Farbe; `undefined` = aus. */ - setLed(rgb: [number, number, number] | undefined) { - this.setLeds(this.model.leds.map(() => rgb)) - } - - /** - * Jede LED einzeln (Nummer 1 bis 5). LED 1 sitzt von hinten gesehen links, auf der Seite des Joysticks (am echten mBot2 bestätigt) - * (Modell: kleinstes x). - */ - setLeds(leds: readonly ([number, number, number] | undefined)[]) { - for (const [i, m] of this.model.leds.entries()) { - const rgb = leds[i] - if (rgb) { - m.emissive.setRGB(rgb[0] / 255, rgb[1] / 255, rgb[2] / 255) - m.color.setRGB(rgb[0] / 255, rgb[1] / 255, rgb[2] / 255) - } else { - m.emissive.setRGB(0, 0, 0) - m.color.set(0xdddddd) - } - } - } - - /** Welches Teil liegt unter dem Punkt (Bildschirmkoordinaten)? */ - partAt(clientX: number, clientY: number): RobotPart | undefined { - const r = this.canvas.getBoundingClientRect() - const ray = new THREE.Raycaster() - ray.setFromCamera(new THREE.Vector2(((clientX - r.left) / r.width) * 2 - 1, -((clientY - r.top) / r.height) * 2 + 1), this.camera) - for (const hit of ray.intersectObject(this.robot, true)) { - for (let o: THREE.Object3D | null = hit.object; o; o = o.parent) { - const part = this.model.parts.get(o) - if (part) return part - } - } - return undefined - } - - - private fit() { - const w = Math.max(1, this.host.clientWidth) - const h = Math.max(1, this.host.clientHeight) - this.renderer.setSize(w, h, false) - this.camera.aspect = w / h - this.camera.updateProjectionMatrix() - } - - private loop = () => { - // Aus der Seite entfernt (z. B. andere Lektion): aufräumen statt weiterzuzeichnen. - if (this.canvas.isConnected) this.wasShown = true - else if (this.wasShown) return this.dispose() - this.frame = requestAnimationFrame(this.loop) - let current = this.shown - if (this.anim) { - const k = Math.min(1, (performance.now() - this.anim.start) / this.anim.ms) - const e = k < 0.5 ? 2 * k * k : 1 - (-2 * k + 2) ** 2 / 2 - const { from, to } = this.anim - current = { x: from.x + (to.x - from.x) * e, y: from.y + (to.y - from.y) * e, heading: from.heading + (to.heading - from.heading) * e } - if (k >= 1) { - this.shown = { ...to } - this.anim = undefined - } - } - this.applyPose(current) - const flying = !!this.flight - if (this.flight) { - const k = Math.min(1, (performance.now() - this.flight.start) / this.flight.ms) - const e = k < 0.5 ? 4 * k * k * k : 1 - (-2 * k + 2) ** 3 / 2 - const { from, to } = this.flight - this.controls.target.lerpVectors(from.target, to.target, e) - // Auf einem Bogen um das Ziel fliegen, nicht quer durch den Roboter - const a = from.pos.clone().sub(from.target) - const b = to.pos.clone().sub(to.target) - const dir = a.clone().normalize().lerp(b.clone().normalize(), e) - // Genau gegenüber (z. B. von oben nach unten): seitlich vorbei statt durch die Mitte - if (dir.lengthSq() < 1e-4) dir.set(-1, 0, 0) - dir.normalize() - const len = a.length() + (b.length() - a.length()) * e - this.camera.position.copy(this.controls.target).addScaledVector(dir, len) - if (k >= 1) this.flight = undefined - } - if (flying || this.controls.autoRotate) this.controls.update() - this.renderer.render(this.scene, this.camera) - } - - private applyPose(p: Pose) { - this.turnWheels(p) - this.robot.position.copy(toScene(p)) - this.robot.rotation.y = -rad(p.heading) - // Schatten folgt dem Roboter - this.sun.target.position.copy(this.robot.position) - this.sun.position.copy(this.robot.position).add(new THREE.Vector3(-40, 90, 50)) - // Spur bis zur gezeigten Position: das letzte Stück wächst mit, bis der Roboter ankommt. - const done = this.anim ? this.trail.length - 2 : this.trail.length - 1 - while (this.trailGroup.children.length > Math.max(0, done)) this.trailGroup.remove(this.trailGroup.children[this.trailGroup.children.length - 1]) - for (let i = this.trailGroup.children.length; i < done; i++) { - const piece = new THREE.Mesh(this.trailPiece, this.trailMaterial) - this.placeSegment(piece, this.trail[i], this.trail[i + 1]) - this.trailGroup.add(piece) - } - const from = this.anim ? this.trail[this.trail.length - 2] : undefined - this.liveSegment.visible = !!from - if (from) this.placeSegment(this.liveSegment, from, p) - } - - /** Räder drehen sich mit: vorwärts beide gleich, beim Drehen gegeneinander. */ - private turnWheels(p: Pose) { - const last = this.wheelPose - this.wheelPose = { ...p } - if (!last) return - const dx = p.x - last.x - const dy = p.y - last.y - const h = rad(last.heading) - const ds = dx * Math.sin(h) + dy * Math.cos(h) - const turn = rad(p.heading - last.heading) * (TRACK / 2) - const left = this.robot.getObjectByName('wheelLeft') - const right = this.robot.getObjectByName('wheelRight') - if (left) left.rotation.x -= (ds + turn) / WHEEL_RADIUS - if (right) right.rotation.x -= (ds - turn) / WHEEL_RADIUS - } - - private placeSegment(mesh: THREE.Object3D, a: Point, b: Point) { - const length = Math.hypot(b.x - a.x, b.y - a.y) - mesh.visible = length > 0.01 - mesh.scale.set(length + 1.4, 1, 1) - mesh.position.copy(toScene({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }, 0.2)) - mesh.rotation.y = Math.atan2(b.y - a.y, b.x - a.x) - } -} diff --git a/web/src/ui/robotPreview.ts b/web/src/ui/robotPreview.ts deleted file mode 100644 index 343cbdc5..00000000 --- a/web/src/ui/robotPreview.ts +++ /dev/null @@ -1,253 +0,0 @@ -import type { VSDocument } from '../core/model' -import { previewRun, type PreviewFrame, type PreviewResult } from '../core/robotPreview' -import { emptyWorld, type RobotWorldSetup } from '../core/robotWorld' -import type { SubprogramResolver } from '../core/simulation' -import { t } from './i18n' -import { icons } from './icons' -import { sidebarIcon } from './learnPanel' -import type { Robot3D } from './robot3d' -import { noticeText } from './simulationPanel' -import { playTone } from './visubotView' - -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -/** Zeit je Bild beim Abspielen. */ -const frameMs = 300 - -/** - * VisuBot: „mBot2 live“ neben dem Bearbeiten. Nach jeder Änderung rechnet es das Programm im Hintergrund durch - * und zeigt, wo der mBot2 am Ende steht und welche Spur er fährt; ▶ spielt die Fahrt ab. - * Steht als eigene Spalte oder unter dem Code in „Code“ (`stacked`). - */ -export class RobotPreviewPanel { - readonly element: HTMLElement - /** Eingeklappt: schmale Leiste am rechten Rand. */ - readonly rail: HTMLButtonElement - /** Waagrechte Trennlinie über dem Fenster, wenn es unter dem Code steht. */ - readonly heightBar: HTMLElement - onHide = () => {} - onToggleStacked = () => {} - private stage: HTMLElement - private status: HTMLElement - private picker: HTMLElement - private playButton: HTMLButtonElement - private stackButton: HTMLButtonElement - private view?: Robot3D - private loading?: Promise - private worlds: RobotWorldSetup[] = [] - private worldsKey?: string - private setup: RobotWorldSetup = emptyWorld - private result?: PreviewResult - private lastKey?: string - private pending?: number - private playTimer?: number - private input?: { doc: VSDocument; resolve?: SubprogramResolver } - /** Während der Simulation: deren 3D-Ansicht mit Welten und Messwerten statt der eigenen. */ - private simulation?: HTMLElement - - constructor() { - this.element = document.createElement('aside') - this.element.className = 'robotpreview' - this.element.innerHTML = ` - -
    -

    🤖 ${esc(t('web_visubot_preview_title'))}

    - - - -
    -

    ${esc(t('web_visubot_preview_hint'))}

    - -
    -

    ` - const q = (s: string) => this.element.querySelector(s) as T - this.heightBar = q('.robotpreview-height') - this.stage = q('.robotpreview-stage') - this.status = q('.robotpreview-status') - this.picker = q('.visubot-worlds') - this.playButton = q('.robotpreview-play') - this.stackButton = q('.robotpreview-stack') - this.playButton.addEventListener('click', () => (this.playTimer === undefined ? this.play() : this.stopPlaying(true))) - this.stackButton.addEventListener('click', () => this.onToggleStacked()) - q('.learn-hide').addEventListener('click', () => this.onHide()) - this.rail = document.createElement('button') - this.rail.className = 'learn-rail robotpreview-rail' - this.setStacked(false) - this.relabel() - } - - /** - * Simulation läuft: ihre 3D-Ansicht (`viewport` aus dem Simulationspanel) hier zeigen, die eigene Vorschau ruht. - * `undefined`: wieder die Vorschau (die Ansicht der Simulation hängt der Aufrufer zurück). - */ - hostSimulation(viewport: HTMLElement | undefined) { - if (viewport === this.simulation) return - this.simulation?.remove() - this.simulation = viewport - this.element.classList.toggle('simulation', !!viewport) - if (viewport) { - this.pause() - this.status.after(viewport) - } - this.relabel() - } - - /** Nach einem Sprachwechsel: Beschriftungen neu. */ - relabel() { - const q = (s: string) => this.element.querySelector(s) as T - const sim = !!this.simulation - q('h2').textContent = `🤖 ${t(sim ? 'web_visubot_preview_sim_title' : 'web_visubot_preview_title')}` - q('.hint').textContent = t(sim ? 'web_visubot_preview_sim_hint' : 'web_visubot_preview_hint') - this.heightBar.title = t('web_visubot_preview_resize') - const hide = q('.learn-hide') - hide.title = t('web_visubot_preview_hide') - hide.setAttribute('aria-label', t('web_visubot_preview_hide')) - this.rail.title = t('web_visubot_preview_show') - this.rail.innerHTML = `${sidebarIcon}🤖 ${esc(t('web_visubot_preview_title'))}` - this.setStacked(this.stackButton.textContent === '▥') - this.stopPlaying(false) - this.worldsKey = undefined - this.lastKey = undefined - } - - /** Beschriftung des Knopfs zum Umstellen: unter den Code bzw. wieder als eigene Spalte. */ - setStacked(stacked: boolean) { - const key = stacked ? 'web_visubot_preview_side' : 'web_visubot_preview_stack' - this.stackButton.innerHTML = stacked ? '▥' : '⬓' - this.stackButton.className = 'icon robotpreview-stack' - this.stackButton.dataset.tip = t(key) - this.stackButton.setAttribute('aria-label', t(key)) - } - - /** 3D-Ansicht erst bauen, wenn das Fenster sichtbar ist. */ - private show() { - this.loading ??= import('./robot3d') - .then(({ Robot3D }) => { - this.view = new Robot3D(this.stage) - this.view.setWorld(this.setup) - this.showFrame(this.result?.frames.at(-1)) - }) - .catch(() => { - this.stage.textContent = t('web_visubot_no_3d') - }) - } - - /** - * Nach einer Änderung (nur wenn das Fenster offen ist): Programm neu durchrechnen, kurz verzögert, - * damit schnelles Tippen nicht bremst. `worlds`: Welten der geöffneten Übung (leer = freie Fläche). - */ - update(doc: VSDocument, resolve: SubprogramResolver | undefined, worlds: RobotWorldSetup[], worldsKey: string, allDocs: VSDocument[]) { - if (this.simulation) return - this.show() - if (worldsKey !== this.worldsKey) { - this.worldsKey = worldsKey - this.setWorlds(worlds) - } - this.input = { doc, resolve } - const key = JSON.stringify(allDocs) + '\n' + JSON.stringify(doc) - if (key === this.lastKey) return - this.lastKey = key - window.clearTimeout(this.pending) - this.pending = window.setTimeout(() => this.recompute(), 120) - } - - private setWorlds(worlds: RobotWorldSetup[]) { - this.worlds = worlds - this.picker.replaceChildren() - this.picker.hidden = worlds.length < 2 - worlds.forEach((setup, i) => { - const b = document.createElement('button') - b.textContent = t('web_visubot_world_fmt', i + 1) - b.addEventListener('click', () => this.useWorld(setup)) - this.picker.append(b) - }) - this.useWorld(worlds[0] ?? emptyWorld) - } - - private useWorld(setup: RobotWorldSetup) { - this.worlds.forEach((w, i) => this.picker.children[i]?.classList.toggle('active', w === setup)) - if (setup === this.setup && this.result) return - this.setup = setup - this.view?.setWorld(setup) - this.recompute() - } - - private recompute() { - this.pending = undefined - this.stopPlaying(false) - if (!this.input) return - try { - this.result = previewRun(this.input.doc, this.input.resolve, this.setup) - } catch { - this.result = undefined - } - this.showFrame(this.result?.frames.at(-1)) - this.updateStatus() - } - - private showFrame(frame: PreviewFrame | undefined, ms = 0) { - if (!this.view) return - const f = frame ?? { pose: { ...this.setup.start }, trail: [{ x: this.setup.start.x, y: this.setup.start.y }], leds: Array(5).fill(undefined), screen: undefined } - if (ms > 0) this.view.moveTo(f.pose, f.trail, ms) - else this.view.place(f.pose, f.trail) - this.view.setLeds(f.leds) - this.view.setScreen(f.screen) - } - - /** ▶: die Fahrt Bild für Bild vom Start an zeigen. */ - play() { - const frames = this.result?.frames - if (!frames || frames.length < 2 || !this.view) return - this.stopPlaying(false) - let i = 0 - this.showFrame(frames[0]) - this.playButton.innerHTML = icons.stop - this.playButton.dataset.tip = t('web_visubot_preview_stop') - this.playButton.setAttribute('aria-label', t('web_visubot_preview_stop')) - const next = () => { - i++ - if (i >= frames.length) { - this.stopPlaying(false) - return - } - const f = frames[i] - if (f.tone) playTone(f.tone[0], f.tone[1]) - this.showFrame(f, frameMs - 30) - this.playTimer = window.setTimeout(next, frameMs) - } - this.playTimer = window.setTimeout(next, frameMs) - } - - /** Abspielen beenden; `showEnd`: gleich das Ende der Fahrt zeigen. */ - private stopPlaying(showEnd: boolean) { - if (this.playTimer !== undefined) window.clearTimeout(this.playTimer) - this.playTimer = undefined - this.playButton.innerHTML = icons.play - this.playButton.dataset.tip = t('web_visubot_preview_play') - this.playButton.setAttribute('aria-label', t('web_visubot_preview_play')) - if (showEnd) this.showFrame(this.result?.frames.at(-1)) - } - - private updateStatus() { - const r = this.result - this.playButton.disabled = !r || r.frames.length < 2 - if (!r) { - this.status.textContent = '' - return - } - const parts = [t('web_visubot_preview_distance_fmt', r.distance)] - if (r.bumps > 0) parts.push(`⚠︎ ${t('web_visubot_bumps')}: ${r.bumps}`) - if (r.stop === 'input') parts.push(t('web_visubot_preview_input')) - else if (r.stop === 'limit') parts.push(t('web_visubot_preview_limit')) - else if (r.stop === 'error' && r.notice) parts.push(`⚠︎ ${noticeText(r.notice)}`) - this.status.textContent = parts.join(' · ') - } - - /** Beim Schließen: Abspielen und Rechnen anhalten. */ - pause() { - window.clearTimeout(this.pending) - this.pending = undefined - this.lastKey = undefined - this.stopPlaying(false) - } -} diff --git a/web/src/ui/roundGameView.ts b/web/src/ui/roundGameView.ts deleted file mode 100644 index 88a8d05b..00000000 --- a/web/src/ui/roundGameView.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { inline } from '../learn/markdown' -import { bombParts, click, clickButton, parseLayoutPicture, parseSwingWindow, startState, type ClickStep, type RoundGame, type SwingWindow } from '../learn/roundGame' -import { blockPicture } from './blockPicture' -import { t } from './i18n' - -/** Rundenspiele „Wer hört zu?“, „Vertrag erfüllt?“, „Wo landet der Knopf?“, „Bombe entschärfen“ und „Wer ist dran?“ im Lernbereich. */ - -function h(tag: string, attrs: Record = {}, ...children: (Node | string)[]): HTMLElement { - const e = document.createElement(tag) - for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v) - e.append(...children) - return e -} - -function rich(tag: string, attrs: Record, markdown: string): HTMLElement { - const e = h(tag, attrs) - e.innerHTML = inline(markdown) - return e -} - -const stepDelay = 1100 - -/** `asBlocks`: Code der Runden bei „frage“ als Blöcke zeigen (Block-Lektionen für Jüngere), sonst als Java. */ -export function renderRoundGame(game: RoundGame, ludwigURL: string, asBlocks = false): HTMLElement { - const box = h('section', { class: `learn-game learn-round-game ${game.kind}` }) - const head = h('div', { class: 'learn-game-head' }) - head.append(h('img', { src: ludwigURL, alt: '', width: '40', height: '40' }), h('strong', {}, game.title)) - const status = h('p', { class: 'learn-game-status' }) - const stage = h('div', { class: 'learn-game-stage' }) - box.append(head, status, stage) - const total = game.rounds.length - let index = 0 - let score = 0 - let timers: number[] = [] - const clearTimers = () => { - timers.forEach((id) => { - window.clearTimeout(id) - window.clearInterval(id) - }) - timers = [] - } - const showStatus = () => { - status.textContent = `${t('web_game_round_fmt', index + 1, total)} · ${t('web_game_score_fmt', score)}` - } - - const next = () => { - const b = h('button', { class: 'primary' }, index + 1 < total ? t('web_game_next') : t('web_game_finish')) - b.addEventListener('click', () => { - index++ - if (index < total) showRound() - else showEnd() - }) - return b - } - - /** Bombe: Auf die falsche Zeile tippen, bevor der Countdown abläuft. */ - const showBombRound = () => { - const round = game.rounds[index] - const seconds = game.seconds! - const fuse = h('div', { class: 'learn-bomb-fuse' }, h('span', {})) - const left = h('span', { class: 'learn-bomb-time' }) - const bomb = h('div', { class: 'learn-bomb', 'aria-live': 'polite' }, h('span', { class: 'learn-bomb-icon', 'aria-hidden': 'true' }, '💣'), left, fuse) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - // Mit `stelle:` tippt man Teile der Zeilen an (z. B. nur `i++`), sonst ganze Zeilen. - const byParts = round.wrongPart !== undefined - const targets: { button: HTMLButtonElement; line: number; right: boolean }[] = [] - const rows = round.code.split('\n').map((line, i) => { - if (!byParts) { - const b = h('button', { class: 'ln', type: 'button' }, line || ' ') as HTMLButtonElement - b.disabled = !line.trim() - targets.push({ button: b, line: i + 1, right: i + 1 === round.wrongLine }) - return b - } - const row = h('div', { class: 'ln parts' }) - if (!line.trim()) row.append(' ') - for (const seg of bombParts(line)) { - if (!seg.part) { - row.append(seg.text) - continue - } - const b = h('button', { class: 'part', type: 'button' }, seg.text) as HTMLButtonElement - targets.push({ button: b, line: i + 1, right: i + 1 === round.wrongLine && seg.text === round.wrongPart }) - row.append(b) - } - return row - }) - for (const target of targets) - target.button.addEventListener('click', () => finish(target.right ? 'right' : target.line === round.wrongLine ? 'part' : 'wrong', target.button)) - const code = h('div', { class: `learn-game-code learn-bomb-code mono${byParts ? ' by-parts' : ''}`, dir: 'ltr' }, ...rows) - const started = Date.now() - const tick = () => { - // Lektion verlassen: Countdown anhalten - if (!box.isConnected && Date.now() - started > 1000) return clearTimers() - const rest = Math.max(0, seconds - (Date.now() - started) / 1000) - left.textContent = t('web_game_time_fmt', Math.ceil(rest)) - ;(fuse.firstChild as HTMLElement).style.width = `${(rest / seconds) * 100}%` - bomb.classList.toggle('hurry', rest <= 5) - if (rest <= 0) finish('time') - } - const finish = (how: 'right' | 'wrong' | 'part' | 'time', chosen?: HTMLButtonElement) => { - clearTimers() - for (const target of targets) { - target.button.disabled = true - if (target.right) target.button.classList.add('right') - } - if (byParts) rows[round.wrongLine! - 1].classList.add('right') - if (chosen && how !== 'right') chosen.classList.add('wrong') - const right = how === 'right' - if (right) score++ - showStatus() - bomb.classList.add(right ? 'defused' : 'boom') - bomb.firstChild!.textContent = right ? '✂️' : '💥' - feedback.className = `learn-game-feedback ${right ? 'right' : 'wrong'}` - const n = next() - feedback.replaceChildren( - h('p', {}, t(right ? 'web_game_defused' : how === 'time' ? 'web_game_boom_time' : how === 'part' ? 'web_game_boom_part' : byParts ? 'web_game_boom_wrong_part' : 'web_game_boom_wrong')), - rich('div', { class: 'learn-game-explain' }, round.explanation), - h('p', { class: 'learn-bomb-fix' }, `${t('web_game_fix')} `, h('code', {}, round.fix!.trim())), - n, - ) - n.focus({ preventScroll: true }) - } - const question = rich('p', { class: 'learn-game-question' }, round.question) - if (byParts) question.append(' ', h('span', { class: 'learn-bomb-hint' }, t('web_game_bomb_parts_hint'))) - stage.replaceChildren(bomb, question, code, feedback) - tick() - const id = window.setInterval(tick, 200) - timers.push(id) - } - - /** Reihenfolge: Die gemischten Schritte der Reihe nach antippen, ein falscher Tipp beendet die Runde. */ - const showOrderRound = () => { - const round = game.rounds[index] - const parts: HTMLElement[] = [] - if (round.code.trim()) parts.push(codeView(round.code).element) - parts.push(rich('p', { class: 'learn-game-question' }, round.question), h('p', { class: 'learn-order-hint' }, t('web_game_order_hint'))) - const list = h('div', { class: 'learn-game-options learn-order' }) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - let done = 0 - const buttons = shuffled(round.options.length).map((k) => { - const badge = h('span', { class: 'learn-order-badge', 'aria-hidden': 'true' }) - const text = h('span', {}) - text.innerHTML = inline(round.options[k].text) - const b = h('button', {}, badge, text) as HTMLButtonElement - b.addEventListener('click', () => { - if (k !== done) { - b.classList.add('wrong') - return finish(false) - } - b.classList.add('right') - badge.textContent = String(++done) - b.disabled = true - if (done === round.options.length) finish(true) - }) - list.append(b) - return { k, b, badge } - }) - const finish = (right: boolean) => { - // Zum Schluss stehen die Schritte richtig sortiert und nummeriert da. - for (const { k, b, badge } of [...buttons].sort((x, y) => x.k - y.k)) { - b.disabled = true - badge.textContent = String(k + 1) - list.append(b) - } - if (right) score++ - showStatus() - feedback.className = `learn-game-feedback ${right ? 'right' : 'wrong'}` - const n = next() - feedback.replaceChildren(h('p', {}, right ? t('web_game_right') : t('web_game_wrong_short')), rich('div', { class: 'learn-game-explain' }, round.explanation), n) - n.focus({ preventScroll: true }) - } - stage.replaceChildren(...parts, list, feedback) - } - - const showRound = () => { - clearTimers() - if (game.kind === 'bombe' || game.kind === 'reihenfolge') { - showStatus() - if (game.kind === 'bombe') showBombRound() - else showOrderRound() - return - } - const round = game.rounds[index] - showStatus() - const code = codeView(round.code) - const parts: HTMLElement[] = [] - let swing: ReturnType | undefined - if (game.kind === 'zuhoerer') { - swing = swingView(parseSwingWindow(round.code), code) - parts.push(h('div', { class: 'learn-swing-row' }, code.element, swing.element)) - if (round.clicks.length) parts.push(h('p', { class: 'learn-swing-clicks' }, `${t('web_game_clicks')} `, ...round.clicks.flatMap((c, i) => [...(i ? [' → '] : []), h('code', {}, c)]))) - } else if (round.code.trim()) parts.push((asBlocks && game.kind === 'frage' && blockPicture(round.code)) || code.element) - parts.push(rich('p', { class: 'learn-game-question' }, round.question)) - const answers = h('div', { class: `learn-game-options ${game.kind === 'layout' ? 'pictures' : ''}` }) - const feedback = h('div', { class: 'learn-game-feedback', role: 'status' }) - const buttons = round.options.map((option) => { - const b = h('button', {}) as HTMLButtonElement - if (game.kind === 'layout') b.append(layoutPicture(option.text)) - else if (option.text.includes('\n')) b.append(filePicture(option.text)) - else b.innerHTML = inline(option.text) - b.addEventListener('click', () => answer(option.right, b)) - answers.append(b) - return b - }) - const answer = (right: boolean, chosen: HTMLButtonElement) => { - buttons.forEach((b, i) => { - b.disabled = true - if (round.options[i].right) b.classList.add('right') - }) - if (!right) chosen.classList.add('wrong') - if (right) score++ - showStatus() - feedback.className = `learn-game-feedback ${right ? 'right' : 'wrong'}` - const n = next() - feedback.replaceChildren(h('p', {}, right ? t('web_game_right') : t('web_game_wrong_short')), rich('div', { class: 'learn-game-explain' }, round.explanation)) - feedback.append(n) - if (swing) timers = swing.replay(round.clicks, () => n.before(h('p', { class: 'learn-swing-try' }, t('web_game_try')))) - n.focus({ preventScroll: true }) - } - stage.replaceChildren(...parts, answers, feedback) - } - - const showEnd = () => { - clearTimers() - status.textContent = '' - const again = h('button', { class: 'primary' }, t('web_game_again')) - again.addEventListener('click', () => { - index = score = 0 - showRound() - }) - stage.replaceChildren( - h('p', { class: 'learn-game-result' }, t('web_game_done_fmt', score, total)), - h('p', {}, t(score === total ? 'web_game_perfect' : score >= total * 0.7 ? 'web_game_good' : 'web_game_practice_short')), - again, - ) - } - const start = h('button', { class: 'primary' }, t('web_game_start')) - start.addEventListener('click', showRound) - stage.append(rich('p', {}, game.intro), start) - return box -} - -/** Die Zahlen 0 bis n-1 gemischt, nie in der richtigen Reihenfolge. */ -function shuffled(n: number): number[] { - const order = [...Array(n).keys()] - while (order.every((k, i) => k === i)) { - for (let i = n - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)) - ;[order[i], order[j]] = [order[j], order[i]] - } - } - return order -} - -function codeView(code: string) { - const lines = code.split('\n').map((line) => h('div', { class: 'ln' }, line || ' ')) - const element = h('pre', { class: 'learn-game-code mono', dir: 'ltr' }, ...lines) - return { - element, - highlight(from?: number, to?: number) { - lines.forEach((l, i) => l.classList.toggle('hit', from !== undefined && i >= from && i <= (to ?? from))) - }, - } -} - -/** Nachgebautes Fenster mit Knöpfen und Beschriftungen; spielt Klicks ab. */ -function swingView(win: SwingWindow, code: ReturnType) { - const state = startState(win) - const element = h('div', { class: 'learn-swing-window', dir: 'ltr' }) - element.append(h('div', { class: 'learn-swing-title' }, win.title || ' ')) - const body = h('div', { class: 'learn-swing-body' }) - const views = new Map() - for (const l of win.labels) { - const v = h('div', { class: 'learn-swing-label' }, state.texts[l.name]) - views.set(l.name, v) - body.append(v) - } - const buttons = win.buttons.map((b) => { - const v = h('button', { class: 'learn-swing-button', disabled: '' }, state.texts[b.name]) as HTMLButtonElement - views.set(b.name, v) - body.append(v) - return v - }) - const event = h('p', { class: 'learn-swing-event', role: 'status' }) - const consoleBox = h('pre', { class: 'learn-swing-console mono', hidden: '' }) - element.append(body, event, consoleBox) - - const show = (step: ClickStep) => { - const view = views.get(step.button)! - view.classList.add('pressed') - window.setTimeout(() => view.classList.remove('pressed'), 350) - code.highlight(step.listener?.from, step.listener?.to) - event.textContent = step.listener ? t('web_game_event_fmt', view.textContent ?? '') : t('web_game_nobody') - event.className = `learn-swing-event ${step.listener ? 'heard' : 'nobody'}` - for (const [name, text] of Object.entries(step.texts)) { - const v = views.get(name) - if (v && v.textContent !== text) { - v.textContent = text - v.classList.remove('changed') - void v.offsetWidth // Animation neu starten - v.classList.add('changed') - } - } - if (step.console.length) { - consoleBox.hidden = false - consoleBox.textContent += step.console.map((l) => `${l}\n`).join('') - } - } - const press = (caption: string) => show(click(win, state, caption)) - - return { - element, - /** Die Klicks der Runde nacheinander abspielen, danach die Knöpfe zum Ausprobieren freigeben. */ - replay(clicks: string[], done: () => void): number[] { - const ids = clicks.map((c, i) => window.setTimeout(() => press(c), (i + 0.3) * stepDelay)) - ids.push( - window.setTimeout(() => { - win.buttons.forEach((b, i) => { - buttons[i].disabled = false - buttons[i].addEventListener('click', () => show(clickButton(win, state, b.name))) - }) - done() - }, (clicks.length + 0.3) * stepDelay), - ) - return ids - }, - } -} - -/** Mehrzeilige Antwort als kleine Datei; `(leer)` u. Ä. ohne Zeilen bleibt Text. */ -function filePicture(text: string): HTMLElement { - return h('pre', { class: 'learn-game-file mono', dir: 'ltr' }, text) -} - -/** Kleines Fenster als Antwort: GridLayout, FlowLayout oder BorderLayout. */ -function layoutPicture(text: string): HTMLElement { - const pic = parseLayoutPicture(text) - const frame = h('div', { class: 'learn-layout-window', dir: 'ltr' }, h('div', { class: 'learn-layout-title' })) - const body = h('div', { class: `learn-layout-body ${pic.kind}` }) - const cell = (name: string, area?: string) => h('span', { class: 'learn-layout-cell', ...(area ? { style: `grid-area:${area}` } : {}) }, name) - if (pic.kind === 'border') { - for (const [area, name] of Object.entries(pic.areas)) body.append(cell(name!, area)) - } else if (pic.kind === 'grid') { - const cols = Math.max(...pic.rows.map((r) => r.length)) - body.style.gridTemplateColumns = `repeat(${cols}, 1fr)` - for (const row of pic.rows) for (let i = 0; i < cols; i++) body.append(row[i] ? cell(row[i]) : h('span', {})) - } else { - for (const row of pic.rows) body.append(h('div', { class: 'learn-layout-row' }, ...row.map((n) => cell(n)))) - } - frame.append(body) - return frame -} - diff --git a/web/src/ui/sequenceDiagram.ts b/web/src/ui/sequenceDiagram.ts deleted file mode 100644 index d8d9ceea..00000000 --- a/web/src/ui/sequenceDiagram.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * VisuObject: Sequenzdiagramm aus dem Ablauf des Debuggers. Jedes Objekt (bzw. jede Klasse bei - * static) hat eine Lebenslinie; Aufrufe sind Pfeile mit gefüllter Spitze, Rückgaben gestrichelt, - * `new` ein gestrichelter «create»-Pfeil zum Kasten, der erst dort beginnt. Aktivierungsbalken - * zeigen, solange eine Methode läuft. - */ - -import type { SeqEvent, SeqParticipant } from '../core/miniJava' - -const e = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) - -const colW = 180 -const left = 30 -const top = 12 -const headH = 30 -const rowH = 34 -const barW = 10 - -export interface SequenceData { - participants: SeqParticipant[] - events: SeqEvent[] - truncated: boolean -} - -/** Etwa die Breite eines Texts in 12px-Schrift (für Kästen und Schleifen). */ -const textWidth = (s: string) => s.length * 7 + 16 - -/** Diagramm als SVG; `current` = Nummer des zuletzt ausgeführten Ereignisses (gelb). */ -export function sequenceSVG(data: SequenceData, current?: number): { svg: string; width: number; height: number } { - const index = new Map(data.participants.map((p, i) => [p.key, i])) - const cx = (key: string) => left + (index.get(key) ?? 0) * colW + colW / 2 - const created = new Map() - const parts: string[] = [] - const bars: string[] = [] - const heads: string[] = [] - // Offene Aktivierungen: Teilnehmer, Aufrufer, Beginn, Ebene (verschachtelt auf derselben Linie). - const open: { key: string; caller: string; y: number; level: number }[] = [] - const mainKey = data.participants[0]?.isStatic ? data.participants[0].key : '' - // Ebene der Aktivierung; main hat seinen Balken von Anfang an. - const level = (key: string) => open.filter((a) => a.key === key).length + (key === mainKey ? 1 : 0) - const barX = (key: string, lv: number) => cx(key) - barW / 2 + Math.max(0, lv - 1) * 6 - let y = top + headH + 24 - data.events.forEach((ev, i) => { - const on = i === current ? ' current' : '' - if (ev.k === 'return') { - const a = open.pop() - if (!a) return - if (ev.hidden) { - bars.push(``) - return - } - const from = barX(a.key, a.level) - const toLevel = level(a.caller) - const toX = a.caller === a.key ? barX(a.caller, toLevel) + barW : toLevel ? barX(a.caller, toLevel) + (cx(a.caller) < cx(a.key) ? barW : 0) : cx(a.caller) - const x1 = cx(a.caller) < cx(a.key) ? from : from + barW - bars.push(``) - if (a.caller !== a.key) - parts.push( - `${arrowOpen(toX, y, toX < x1 ? -1 : 1)}${ev.label ? `${e(ev.label)}` : ''}`, - ) - y += rowH - return - } - const fromLevel = level(ev.from) - const self = ev.from === ev.to - // Neuer Kasten braucht Platz: Pfeil in seine Mitte, darüber Luft für die Beschriftung. - if (ev.k === 'create') { - y += headH / 2 + 8 - created.set(ev.to, y) - } - const toLevel = level(ev.to) + 1 - const fx = fromLevel ? barX(ev.from, fromLevel) + (cx(ev.to) >= cx(ev.from) ? barW : 0) : cx(ev.from) - if (self) { - const x = fx - const bx = barX(ev.to, toLevel) + barW - parts.push( - `${arrowFilled(bx, y + 4, -1)}${e(ev.label)}`, - ) - open.push({ key: ev.to, caller: ev.from, y: y + 4 - 6, level: toLevel }) - y += rowH - return - } - const right = cx(ev.to) > cx(ev.from) - const tx = ev.k === 'create' ? cx(ev.to) + (right ? -textWidth(labelOf(data, ev.to)) / 2 : textWidth(labelOf(data, ev.to)) / 2) : barX(ev.to, toLevel) + (right ? 0 : barW) - const cls = ev.k === 'create' ? ' create' : '' - const label = ev.k === 'create' ? `«create» ${ev.label}` : ev.label - parts.push( - `${ev.k === 'create' ? arrowOpen(tx, y, right ? 1 : -1) : arrowFilled(tx, y, right ? 1 : -1)}${ev.k === 'create' ? `${e(label)}` : `${e(label)}`}`, - ) - open.push({ key: ev.to, caller: ev.from, y: ev.k === 'create' ? y + headH / 2 : y, level: toLevel }) - y += ev.k === 'create' ? rowH + headH / 2 : rowH - }) - // Noch laufende Methoden (angehalten): Balken bis unten. - for (const a of open) bars.push(``) - const bottom = y + 10 - // main läuft die ganze Zeit: Balken auf der ersten Lebenslinie. - const main = data.participants[0] - if (main?.isStatic) bars.unshift(``) - for (const p of data.participants) { - const x = cx(p.key) - const head = created.get(p.key) - const hy = head !== undefined ? head - headH / 2 : top - const w = Math.min(colW - 12, textWidth(p.label)) - heads.push( - `${e(p.label)}`, - ) - } - const width = left * 2 + data.participants.length * colW - const height = bottom + 20 - return { svg: `${heads.join('')}${bars.join('')}${parts.join('')}`, width, height } -} - -function labelOf(data: SequenceData, key: string) { - return data.participants.find((p) => p.key === key)?.label ?? '' -} - -function arrowFilled(x: number, y: number, dir: number) { - return `` -} - -function arrowOpen(x: number, y: number, dir: number) { - return `` -} diff --git a/web/src/ui/simulationPanel.ts b/web/src/ui/simulationPanel.ts deleted file mode 100644 index 5a490f20..00000000 --- a/web/src/ui/simulationPanel.ts +++ /dev/null @@ -1,427 +0,0 @@ -import { usedMBotSensors } from '../core/mbot' -import type { VSDocument } from '../core/model' -import { describeValue, SimulationEngine, type SimNotice, type SimValue, type SubprogramResolver } from '../core/simulation' -import { currentLanguage, t } from './i18n' -import { writtenFilesView } from './textFileView' -import type { VisuBotView } from './visubotView' - -/** Was eine Konsole zeigen würde: Ausgaben, Eingaben mit Antwort, offene Frage, Ende oder Fehler. */ -export interface ConsoleTranscript { - lines: { text: string; typed?: string }[] - /** Frage einer Eingabe, auf die die Simulation gerade wartet. */ - pending?: string - notice?: string - error: boolean -} - -/** `sim_notice_*` aus Localizable.strings. */ -export function noticeText(n: SimNotice): string { - switch (n.kind) { - case 'finished': return t('sim_notice_finished') - case 'infiniteLoopWithoutBody': return t('sim_notice_infinite_loop_empty') - case 'unsupportedStatement': return t('sim_notice_unsupported_statement_fmt', n.text) - case 'invalidExpression': return t('sim_notice_invalid_expression_fmt', n.text) - case 'unknownVariable': return n.similar ? t('web_sim_unknown_variable_case_fmt', n.text, n.similar) : t('sim_notice_unknown_variable_fmt', n.text) - case 'divisionByZero': return t('sim_notice_division_by_zero') - case 'wholeNumberExpected': return t('sim_notice_whole_number_expected') - case 'numberExpected': return t('sim_notice_number_expected') - case 'booleanExpected': return t('sim_notice_boolean_expected') - case 'subprogramNotFound': return t('sim_notice_subprogram_not_found_fmt', n.text) - case 'callTooDeep': return t('sim_notice_call_too_deep') - case 'callArguments': return t('web_sim_call_arguments_fmt', n.text) - case 'missingReturn': return t('web_sim_missing_return_fmt', n.text) - case 'fileNotFound': return t('web_sim_file_not_found_fmt', n.text) - case 'endOfFile': return t('web_sim_end_of_file_fmt', n.text) - case 'nullValue': return t('web_sim_null_value_fmt', n.text) - case 'other': return n.text - } -} - -const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -/** Port von `SimulationController.swift` und `SimulationPanels.swift`: Steuerung, Eingabe, Variablen, Ausgabe. */ - -type HighlightMode = 'lastExecuted' | 'nextToExecute' - -const delayOptions = ['0.2', '0.5', '1.0', '1.5', '2.0'] -const decimal = (d: string) => Number(d).toLocaleString(currentLanguage() === 'java' ? 'en' : currentLanguage(), { minimumFractionDigits: 1 }) -const delayKey = 'visustruct.simulation.stepDelay' -const highlightKey = 'visustruct.simulation.highlightMode' - -function stored(key: string): string | null { - try { - return localStorage.getItem(key) - } catch { - return null - } -} - -function store(key: string, value: string) { - try { - localStorage.setItem(key, value) - } catch { - /* ohne Speicher: nur für diese Sitzung */ - } -} - -export class SimulationPanel { - readonly element: HTMLElement - private engine: SimulationEngine - private isPlaying = false - private playTimer?: number - private wasPlayingBeforeInput = false - private delay = delayOptions.includes(stored(delayKey) ?? '') ? stored(delayKey)! : '0.5' - private highlightMode: HighlightMode = stored(highlightKey) === 'nextToExecute' ? 'nextToExecute' : 'lastExecuted' - - private buttons!: Record<'play' | 'pause' | 'step' | 'stop', HTMLButtonElement> - private inputSection!: HTMLElement - private trace!: HTMLElement - private variables!: HTMLElement - private output!: HTMLElement - private transcript: ConsoleTranscript['lines'] = [] - private printed = 0 - private notice!: HTMLElement - private editButton!: HTMLButtonElement - /** VisuBot: Roboter-Welt, die bei jedem Schritt mitfährt. */ - private robot?: VisuBotView - /** Echter mBot2 fährt gerade einen Schritt. */ - private liveBusy = false - - constructor( - private currentDocument: () => VSDocument, - /** Markierung des aktuellen Schritts im Diagramm. */ - private onHighlight: (path: number[] | undefined) => void, - /** Diagramm zu einem Aufruf-Kasten, z. B. ein anderer offener Reiter. */ - private findSubprogram: SubprogramResolver = () => undefined, - /** Simulation beenden und weiter bearbeiten. */ - private onEdit: () => void = () => {}, - /** Konsole in Code live: zeigt dieselben Ausgaben und Eingaben wie beim Ausführen. */ - private onTranscript: (transcript: ConsoleTranscript) => void = () => {}, - ) { - this.engine = new SimulationEngine(currentDocument(), findSubprogram) - this.element = document.createElement('aside') - this.element.className = 'simpanel' - this.build() - } - - // MARK: - Modus - - /** VisuBot ein- oder ausschalten: die Welt steht unter der Steuerung. */ - setRobot(robot: VisuBotView | undefined) { - if (this.robot === robot) return - this.robot?.element.remove() - this.robot = robot - if (robot) { - this.element.querySelector('section')!.after(robot.element) - robot.onWorldChange = () => this.restartEngine() - robot.reset() - } - } - - /** Beim Öffnen der Simulation sichtbar: erst dann wird die 3D-Ansicht gebaut. */ - showRobot() { - this.robot?.show() - } - - begin() { - this.pause() - this.restartEngine() - this.showRobot() - } - - end() { - this.pause() - } - - // MARK: - Steuerung - - step() { - if (this.robot?.live) { - void this.stepLive() - return - } - if (!this.engine.canStep) { - this.pause() - return - } - const wasPlaying = this.isPlaying - const lastExecutedPath = this.engine.currentStepPath - this.robot?.prepare(this.engine) - this.engine.step() - this.robot?.follow(this.engine.state.robotActions, wasPlaying ? Number(this.delay) * 850 : 450) - this.afterStep(wasPlaying, lastExecutedPath) - } - - /** Echter mBot2: Sensoren lesen, Schritt ausführen, warten bis er fertig gefahren ist. */ - private async stepLive() { - if (this.liveBusy) return - if (!this.engine.canStep) { - this.pause() - return - } - this.liveBusy = true - const robot = this.robot! - const wasPlaying = this.isPlaying - const lastExecutedPath = this.engine.currentStepPath - try { - await robot.prepareLive(this.engine, usedMBotSensors(JSON.stringify(this.currentDocument()))) - this.engine.step() - robot.follow(this.engine.state.robotActions, 450) - await robot.drive(this.engine.state.robotActions) - } catch (e) { - robot.liveFailed(e) - this.isPlaying = false - } finally { - this.liveBusy = false - } - this.afterStep(wasPlaying, lastExecutedPath) - } - - private afterStep(wasPlaying: boolean, lastExecutedPath: number[] | undefined) { - this.collectOutput() - if (this.highlightMode === 'nextToExecute' && this.engine.canStep) { - this.onHighlight(this.engine.currentStepPath) - } else { - // Letztes ausgeführtes Element bleibt markiert (auch am Ende oder bei einer Eingabe). - this.onHighlight(lastExecutedPath ?? this.engine.currentStepPath) - } - // Eingabe angefordert: Abspielen pausieren, nach OK automatisch weiterlaufen. - if (this.engine.state.inputRequest && wasPlaying) this.wasPlayingBeforeInput = true - if (!this.engine.canStep) this.pause() - this.update() - } - - reset() { - this.pause() - this.restartEngine() - } - - play() { - if (this.isPlaying || !this.engine.canStep) return - this.isPlaying = true - const tick = async () => { - this.playTimer = undefined - if (!this.isPlaying) return - if (this.robot?.live) await this.stepLive() - else this.step() - if (this.isPlaying && this.engine.canStep) { - this.playTimer = window.setTimeout(() => void tick(), Number(this.delay) * 1000) - } else { - this.isPlaying = false - this.update() - } - } - void tick() - } - - pause() { - if (this.playTimer !== undefined) window.clearTimeout(this.playTimer) - this.playTimer = undefined - this.isPlaying = false - this.update() - } - - private submitInput(field: HTMLInputElement) { - const shouldResume = this.isPlaying || this.wasPlayingBeforeInput - this.pause() - const prompt = this.engine.state.inputRequest?.prompt ?? '' - const continuesLine = this.engine.state.inputRequest?.continuesLine - this.engine.provideInput(field.value) - if (!this.engine.state.inputRequest) { - const last = this.transcript[this.transcript.length - 1] - if (continuesLine && last && last.typed === undefined) last.typed = field.value - else this.transcript.push({ text: prompt ? `${prompt} ` : '', typed: field.value }) - field.value = '' - } - this.onHighlight(this.engine.currentStepPath) - if (shouldResume && this.engine.canStep) { - this.wasPlayingBeforeInput = false - this.play() - } - this.update() - } - - private restartEngine() { - this.engine = new SimulationEngine(this.currentDocument(), this.findSubprogram) - this.transcript = [] - this.printed = 0 - this.wasPlayingBeforeInput = false - this.robot?.reset() - this.onHighlight(this.engine.currentStepPath) - this.update() - } - - // MARK: - Ansicht - - private build() { - this.element.innerHTML = ` -
    -

    ${esc(t('simulation_controls'))}

    -
    - - - - -
    - - -
    -

    - -

    ${esc(t('simulation_input'))}

    -

    ${esc(t('simulation_trace'))}

    -

    ${esc(t('simulation_variables'))}

    -

    ${esc(t('simulation_output'))}

    - ` - const q = (s: string) => this.element.querySelector(s) as T - this.buttons = { - play: q('[data-sim=play]'), - pause: q('[data-sim=pause]'), - step: q('[data-sim=step]'), - stop: q('[data-sim=stop]'), - } - this.buttons.play.addEventListener('click', () => this.play()) - this.buttons.pause.addEventListener('click', () => this.pause()) - this.buttons.step.addEventListener('click', () => this.step()) - this.buttons.stop.addEventListener('click', () => this.reset()) - this.editButton = q('.sim-edit') - this.editButton.addEventListener('click', () => this.onEdit()) - - const highlight = q('[data-sim=highlight]') - highlight.value = this.highlightMode - highlight.addEventListener('change', () => { - this.highlightMode = highlight.value as HighlightMode - store(highlightKey, this.highlightMode) - }) - const delay = q('[data-sim=delay]') - delay.value = this.delay - delay.addEventListener('change', () => { - this.delay = delay.value - store(delayKey, this.delay) - }) - - this.inputSection = q('.sim-input > div') - this.trace = q('.sim-trace') - this.variables = q('.sim-vars') - this.output = q('.sim-output') - this.notice = q('.sim-notice') - } - - private collectOutput() { - const lines = this.engine.state.outputLines - for (; this.printed < lines.length; this.printed++) this.transcript.push({ text: lines[this.printed] }) - } - - private update() { - if (!this.buttons) return - const { state, canStep } = this.engine - this.onTranscript({ - lines: this.transcript, - pending: state.inputRequest?.continuesLine ? undefined : state.inputRequest?.prompt, - notice: state.notice ? noticeText(state.notice) : undefined, - error: state.isHalted, - }) - this.buttons.play.disabled = this.isPlaying || !canStep - this.buttons.pause.disabled = !this.isPlaying - this.buttons.step.disabled = this.isPlaying || !canStep - - this.notice.textContent = state.notice ? noticeText(state.notice) : '' - this.notice.hidden = !state.notice - this.notice.classList.toggle('error', state.isHalted) - // Nach einem Fehler geht es nur mit Bearbeiten weiter; der Knopf steht direkt unter der Meldung. - this.editButton.hidden = !state.isHalted - - this.updateInput() - - this.trace.textContent = state.lastTrace ?? t('simulation_trace_placeholder') - this.trace.classList.toggle('placeholder', !state.lastTrace) - - const names = [...state.variables.keys()].sort((a, b) => a.localeCompare(b)) - if (names.length === 0) { - this.variables.innerHTML = `

    ${esc(t('simulation_variables_placeholder'))}

    ` - } else { - const table = document.createElement('table') - for (const name of names) { - const row = table.insertRow() - row.insertCell().textContent = name - const value = state.variables.get(name)! - const cell = row.insertCell() - // 2D-Array wie eine Tabelle: jede Zeile in einer eigenen Zeile - if (value.kind === 'grid') { - cell.append(gridTable(value)) - } else { - cell.textContent = describeValue(value) - } - } - this.variables.replaceChildren(table) - } - - if (state.outputLines.length === 0 && state.files.size === 0) { - this.output.innerHTML = `

    ${esc(t('simulation_output_placeholder'))}

    ` - } else { - this.output.replaceChildren( - ...state.outputLines.map((line) => { - const div = document.createElement('div') - div.textContent = line - return div - }), - ...writtenFilesView(state.files), - ) - this.output.scrollTop = this.output.scrollHeight - } - } - - private updateInput() { - const request = this.engine.state.inputRequest - const host = this.inputSection - host.parentElement!.classList.toggle('active', !!request) - if (!request) { - host.innerHTML = `

    ${esc(t('simulation_input_placeholder'))}

    ` - return - } - // Feld behalten, damit Tippen und Fokus nicht verloren gehen. - let form = host.querySelector('form') - if (!form) { - form = document.createElement('form') - form.innerHTML = `

    ` - const field = form.querySelector('input')! - form.addEventListener('submit', (e) => { - e.preventDefault() - this.submitInput(field) - }) - host.replaceChildren(form) - requestAnimationFrame(() => field.focus()) - } - // Ohne eigene Frage fragt die Ausgabe direkt davor (z. B. `System.out.print("Note für Mathe: ")`). - const lines = this.engine.state.outputLines - form.querySelector('.sim-prompt')!.textContent = request.prompt || (lines[lines.length - 1] ?? '') - const field = form.querySelector('input')! - field.inputMode = request.valueType === 'string' || request.valueType === 'boolean' ? 'text' : 'decimal' - const error = this.engine.state.inputErrorNotice - const errorLine = form.querySelector('.sim-input-error')! - errorLine.textContent = error ? noticeText(error) : '' - errorLine.hidden = !error - } -} - -/** Ein 2D-Array als kleine Tabelle: eine Tabellenzeile pro Zeile des Arrays. */ -export function gridTable(value: SimValue & { kind: 'grid' }): HTMLTableElement { - const table = document.createElement('table') - table.className = 'sim-grid' - for (const row of value.value) { - const tr = table.insertRow() - for (const x of row) { - const td = tr.insertCell() - td.textContent = String(x) - if (x === true) td.className = 'sim-grid-true' - } - } - return table -} diff --git a/web/src/ui/site.ts b/web/src/ui/site.ts deleted file mode 100644 index 54211816..00000000 --- a/web/src/ui/site.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Webseiten der Welten auf visucode.de: visustruct.visucode.de, visubot.visucode.de, visuobject.visucode.de. - * Jede Subdomain hat ihre eigene Startseite (/de/, /en/, /pt/ …) und eine eigene Kopie der Web-App unter /app/. - */ -export type SiteWorld = 'visustruct' | 'visubot' | 'visuobject' - -export const SITE_DOMAIN = 'visucode.de' - -/** Welt der Subdomain, auf der die App gerade läuft (z. B. `visubot` auf visubot.visucode.de), sonst `undefined`. */ -export function hostWorld(host: string = location.hostname): SiteWorld | undefined { - const m = /^(visustruct|visubot|visuobject)\.visucode\.de$/.exec(host.toLowerCase()) - return m ? (m[1] as SiteWorld) : undefined -} - -/** Startseite von VisuCode (visucode.de): dort wählt man ein anderes Programm (Deutsch in der Wurzel, sonst /en/, /pt/). */ -export function visucodeURL(languageCode: string): string { - const lang = siteLanguage(languageCode) - return `https://${SITE_DOMAIN}/${lang === 'de' ? '' : `${lang}/`}` -} - -/** Sprachordner der Webseite zur App-Sprache (die Seiten gibt es auf Deutsch, Englisch und Portugiesisch). */ -export function siteLanguage(code: string): 'de' | 'en' | 'pt' { - return code === 'pt-PT' ? 'pt' : code === 'de' ? 'de' : 'en' -} - -/** - * Startseite einer Welt, auf Wunsch mit Abschnitt (#contact, #privacy). - * Läuft die App unter /app/ auf der Subdomain dieser Welt, relativ (`../de/index.html`), sonst absolut. - */ -export function worldHomeURL( - world: SiteWorld, - languageCode: string, - section?: string, - where: { hostname: string; pathname: string } = location, -): string { - const lang = siteLanguage(languageCode) - const hash = section ? `#${section}` : '' - const local = hostWorld(where.hostname) === world && /\/app\/(index\.html)?$/.test(where.pathname) - return local ? `../${lang}/index.html${hash}` : `https://${world}.${SITE_DOMAIN}/${lang}/${hash}` -} diff --git a/web/src/ui/styles.css b/web/src/ui/styles.css deleted file mode 100644 index acad71fd..00000000 --- a/web/src/ui/styles.css +++ /dev/null @@ -1,7094 +0,0 @@ -:root { - --bg: #f2f2f7; - --panel: #ffffff; - --text: #1c1c1e; - --muted: #6e6e73; - --border: #d1d1d6; - --accent: #007aff; - --accent-soft: rgba(0, 122, 255, 0.18); - --accent-faint: rgba(0, 122, 255, 0.08); - --accent-glow: rgba(0, 122, 255, 0.35); - /* Farben der Bereiche (auch in VisuBot gleich): Überschrift, Leiste und Schild „Löse diese Übung im …“ */ - --area-editor: #2b8a3e; - --area-code: #7c3aed; - color-scheme: light; -} - -/* VisuBot-Modus: Navy und Lila aus dem VisuBot-Logo, Orange wie auf visucode.de - (Vollton #c2410c, Verlauf #ea580c → #c2410c; weiße Schrift darauf 5,2 : 1) */ -:root.visubot-theme { - --bg: #f1f0f8; - --text: #2f3454; - --muted: #6a6890; - --border: #d6d3e8; - --accent: #c2410c; - --accent-soft: rgba(234, 88, 12, 0.2); - --accent-faint: rgba(234, 88, 12, 0.08); - --accent-glow: rgba(194, 65, 12, 0.35); -} -:root.visubot-theme .selection-frame { - stroke: rgba(194, 65, 12, 0.9); -} - -* { - box-sizing: border-box; -} - -html, -body { - margin: 0; - height: 100%; - background: var(--bg); - color: var(--text); - font: 14px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} - -.app { - display: grid; - /* Wie in der App: Eingabe unter dem Diagramm, damit das Diagramm die ganze Breite bekommt */ - grid-template: 'tools tools' auto 'pal work' 1fr 'pal insp' auto / var(--palette-width, 210px) minmax(0, 1fr); - height: 100%; - flex: 1; - min-width: 0; -} - -/* Oben die Werkzeugleiste, darunter die Spalten Lernen | Struktogramm | Code live */ -.shell { - display: flex; - flex-direction: column; - height: 100vh; - height: 100dvh; -} -.columns { - display: flex; - flex: 1; - min-height: 0; -} -.columns > .app { - min-width: 240px; -} - -.toolbar { - display: flex; - flex-wrap: wrap; - gap: 8px 16px; - align-items: center; - padding: 8px 12px; - background: var(--panel); - border-bottom: 1px solid var(--border); -} - -/* Symbolknöpfe: Name im Tooltip (tooltip.ts) */ -button.icon { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 34px; - height: 32px; - padding: 0 7px; -} -button.icon svg { - display: block; -} -.tooltip { - position: fixed; - z-index: 1000; - max-width: 260px; - padding: 4px 8px; - border-radius: 6px; - background: #1c1c1e; - color: #fff; - font-size: 12px; - line-height: 1.35; - pointer-events: none; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); -} -.tooltip[hidden] { - display: none; -} -/* Werkzeuge des Struktogramms: eigene Zeile über dem Titel */ -.diagram-tools { - grid-area: tools; - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 4px; - padding: 5px 8px; - background: var(--panel); - border-bottom: 1px solid var(--border); -} -.diagram-tools button.icon { - min-width: 30px; - height: 30px; - padding: 0 5px; -} -.diagram-tools .sim-toggle { - margin-inline-start: auto; - display: inline-flex; - align-items: center; - gap: 6px; - height: 30px; - padding: 0 10px; - white-space: nowrap; -} -/* Wird die Werkzeugzeile schmal (z. B. iPad hochkant mit Lernbereich), bleibt nur das Symbol, damit alles in eine Zeile passt. */ -.diagram-tools { - container-type: inline-size; -} -@container (max-width: 520px) { - .diagram-tools .sim-toggle span { - display: none; - } -} -.diagram-tools .sep { - width: 1px; - height: 20px; - margin-inline: 3px; - background: var(--border); -} -.menu-host { - position: relative; -} -.export-menu { - position: absolute; - top: calc(100% + 4px); - inset-inline-end: 0; - z-index: 30; - display: grid; - min-width: 180px; - padding: 4px; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 10px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); -} -.export-menu[hidden] { - display: none; -} -.export-menu button { - border: none; - background: none; - text-align: start; - padding: 7px 10px; - border-radius: 6px; -} -.export-menu button:hover, -.export-menu button:focus-visible { - background: var(--accent-soft); -} - -/* Zahnrad oben rechts: Textgröße und Sprache */ -.settings { - position: relative; - margin-inline-start: auto; -} -.settings > button { - display: inline-flex; - align-items: center; - padding: 6px 8px; -} -.settings-menu { - position: absolute; - top: calc(100% + 6px); - inset-inline-end: 0; - z-index: 30; - display: grid; - width: 290px; - max-width: calc(100vw - 24px); - max-height: calc(100dvh - 80px); - overflow-y: auto; - padding: 4px 0; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 10px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); -} -.settings-menu[hidden] { - display: none; -} -/* Abschnitte mit Überschrift, durch feine Linien getrennt. */ -.settings-menu section, -.settings-menu footer { - display: grid; - gap: 10px; - padding: 10px 14px 12px; -} -.settings-menu section + section, -.settings-menu footer { - border-top: 1px solid var(--border); -} -.settings-menu footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; -} -.settings-version { - font-size: 12px; - color: var(--muted); -} -.settings-menu section[hidden] { - display: none; -} -.settings-menu h3 { - margin: 0; - font-size: 11px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.05em; - color: var(--muted); -} -.settings-menu label { - display: grid; - gap: 4px; - font-size: 13px; - font-weight: 600; - color: var(--muted); -} -.settings-menu select { - width: 100%; - max-width: none; -} -.settings-menu label.check { - grid-template-columns: auto 1fr; - align-items: start; - gap: 8px; - font-weight: 500; - color: var(--text); - cursor: pointer; -} -.settings-menu label.check input { - margin: 2px 0 0; -} -.settings-menu label small, -.settings-menu label.check small { - display: block; - font-weight: 400; - color: var(--muted); -} - -.settings-menu .about-button { - justify-self: start; - padding: 6px 10px; - font-size: 13px; -} - -/* „Über VisuStruct“: ohne Innenabstand, damit ein Klick auf den Dialog selbst nur der Rand sein kann. */ -dialog.about { - width: min(560px, calc(100vw - 32px)); - max-height: calc(100dvh - 48px); - padding: 0; - color: var(--text); - background: var(--panel); - border: 1px solid var(--border); - border-radius: 12px; - box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25); -} -dialog.about::backdrop { - background: rgba(0, 0, 0, 0.35); -} -dialog.about header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - padding: 12px 16px; - border-bottom: 1px solid var(--border); -} -dialog.about h2 { - margin: 0; - font-size: 16px; -} -.about-body { - padding: 20px 24px 24px; - font-size: 14px; - line-height: 1.5; -} -.about-body p { - margin: 0 0 8px; - color: var(--muted); -} -.about-head { - display: flex; - gap: 16px; - padding-bottom: 16px; - margin-bottom: 8px; - border-bottom: 1px solid var(--border); -} -.about-head .logo { - flex: none; - width: 40px; - height: 40px; - color: var(--accent); -} -.about-head h3 { - margin: 0 0 6px; - font-size: 20px; -} -.about-head h3 small { - font-weight: 400; - color: var(--muted); -} -.about-body .about-version { - font-variant-numeric: tabular-nums; -} -.about-body .about-author { - color: var(--text); - font-weight: 600; -} -.about-link { - margin: 0 0 2px; -} -.about-body h4 { - margin: 16px 0 6px; - font-size: 15px; -} -.about-body code { - font-weight: 600; - color: var(--text); -} -.about-body .about-copy { - margin-top: 16px; -} - -.brand { - font-weight: 700; - font-size: 16px; - display: flex; - align-items: center; - gap: 8px; -} -.visubot-logo { - width: auto; - height: 30px; - margin: -4px 0; -} -.visubot-bot { - /* wie der Schriftzug „Bot“ auf visucode.de */ - color: #c2410c; - background: linear-gradient(90deg, #ea580c, #c2410c); - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; - margin-left: -8px; -} -.brand small { - font-weight: 500; - color: var(--muted); - font-size: 12px; -} -.logo { - width: 20px; - height: 20px; - border: 2px solid currentColor; - background: linear-gradient(to bottom right, transparent 47%, currentColor 47% 53%, transparent 53%) left / 50% 60% no-repeat, - linear-gradient(to bottom left, transparent 47%, currentColor 47% 53%, transparent 53%) right / 50% 60% no-repeat; -} - -.group { - display: flex; - flex-wrap: wrap; - gap: 6px; -} - -button, -select { - font: inherit; - padding: 6px 12px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); - color: var(--text); - cursor: pointer; - min-height: 34px; -} -select { - max-width: 180px; -} -button:hover:not(:disabled), -select:hover { - border-color: var(--accent); -} -button:disabled { - opacity: 0.4; - cursor: default; -} - -.palette, -.inspector { - background: var(--panel); - padding: 12px; - overflow-y: auto; -} -.palette { - grid-area: pal; - border-inline-end: 1px solid var(--border); -} -.inspector { - grid-area: insp; - border-top: 1px solid var(--border); - max-height: 34vh; -} - -h2 { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); - margin: 0 0 4px; -} - -.hint { - color: var(--muted); - font-size: 12px; - margin: 0 0 10px; -} - -.palette ul { - list-style: none; - margin: 0; - padding: 0; - display: grid; - gap: 6px; -} - -.palette-item { - display: flex; - align-items: center; - gap: 10px; - padding: 8px 10px; - border: 1px solid var(--border); - border-radius: 8px; - cursor: grab; - line-height: 1.25; - user-select: none; - -webkit-user-select: none; - touch-action: none; /* Ziehen mit dem Finger statt Scrollen */ -} -.palette-item:hover, -.palette-item:focus-visible { - border-color: var(--accent); - outline: none; -} -.palette-item .icon { - flex: none; - color: var(--text); -} - -.workspace { - grid-area: work; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; -} - -.caption { - font: 600 18px system-ui, -apple-system, sans-serif; - border: none; - border-bottom: 1px solid var(--border); - padding: 10px 16px; - background: var(--panel); - outline: none; -} - -.canvas { - flex: 1; - overflow: auto; - position: relative; - /* Doppeltipp öffnet das Eingabefeld statt zu zoomen */ - touch-action: manipulation; - /* Platz für den Scrollbalken immer freihalten: unter Windows verschiebt er sonst das Layout */ - scrollbar-gutter: stable; - background: #fafafa; -} -/* Text direkt im Struktogramm bearbeiten (Doppelklick/Doppeltipp) */ -.inline-edit { - position: absolute; - z-index: 5; - box-sizing: border-box; - display: flex; - align-items: center; - gap: 4px; - padding: 4px 8px; - background: #fff; - border: 2px solid var(--accent); - border-radius: 6px; - box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18); -} -.inline-edit-center { - justify-content: center; -} -.inline-edit-prefix, -.inline-edit-sep { - font-weight: 700; - color: #000; - flex: none; -} -.inline-edit textarea, -.inline-edit input { - flex: 1 1 auto; - min-width: 3ch; - margin: 0; - padding: 2px 4px; - border: 1px solid #c8ccd2; - border-radius: 4px; - background: #fff; - color: #000; - font: inherit; - line-height: inherit; - resize: none; - overflow: hidden; - white-space: pre; -} -.inline-edit-center textarea { - text-align: center; -} -.inline-edit textarea:focus, -.inline-edit input:focus { - outline: none; - border-color: var(--accent); -} - -.canvas svg { - display: block; - user-select: none; - -webkit-user-select: none; -} - -.dragging, -.dragging * { - cursor: grabbing !important; -} - -.drop-line { - fill: var(--accent); -} -.drop-replace { - fill: var(--accent-soft); - stroke: var(--accent); - stroke-width: 3; -} - -.drag-ghost { - position: fixed; - left: 0; - top: 0; - z-index: 10; - pointer-events: none; - padding: 6px 10px; - border-radius: 8px; - background: var(--accent); - color: white; - font-weight: 600; - box-shadow: 0 4px 14px rgba(0, 0, 0, 0.2); - white-space: nowrap; - max-width: 260px; - overflow: hidden; - text-overflow: ellipsis; -} - -.inspector label { - display: block; - font-weight: 600; - margin: 8px 0 4px; -} -.inspector textarea { - width: 100%; - font: 14px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - padding: 8px; - border: 1px solid var(--border); - border-radius: 8px; - resize: vertical; -} - -.statusbar { - display: flex; - flex-wrap: wrap; - gap: 2px 16px; - align-items: baseline; - padding: 4px 12px; - font-size: 12px; - color: var(--muted); - background: var(--panel); - border-top: 1px solid var(--border); -} -.status { - flex: 1 1 auto; - min-width: 0; -} -.site-links { - display: flex; - gap: 12px; - margin-inline-start: auto; -} -.site-links a { - color: inherit; -} -.site-links a:hover, -.site-links a:focus-visible { - color: var(--accent); -} -a.brand { - color: inherit; - text-decoration: none; -} - -.file-drag .canvas { - outline: 3px dashed var(--accent); - outline-offset: -8px; -} - -/* Kompakte Elemente: Ist die Struktogramm-Spalte schmal (z. B. mit „Programmieren“ daneben), - steht der Name klein unter dem Symbol, damit das Struktogramm mehr Platz bekommt. */ -@media (min-width: 821px) { - .app.compact-palette { - --palette-width: 100px; - } - .app.compact-palette .palette { - padding: 8px 6px; - } - .app.compact-palette .palette h2 { - font-size: 10px; - letter-spacing: 0; - text-align: center; - } - .app.compact-palette .palette .hint { - display: none; - } - .app.compact-palette .palette-item { - flex-direction: column; - gap: 3px; - padding: 6px 2px; - font-size: 10.5px; - line-height: 1.15; - text-align: center; - overflow-wrap: break-word; - } -} - -/* Schmale Fenster (iPhone, iPad hochkant): Palette oben, Eigenschaften unten */ -@media (max-width: 820px) { - .palette-item { - white-space: nowrap; - } - .app { - grid-template: 'tools' auto 'pal' auto 'work' 1fr 'insp' auto / minmax(0, 1fr); - } - .palette, - .inspector { - min-width: 0; - } - .palette { - border-inline-end: none; - border-bottom: 1px solid var(--border); - padding: 8px; - } - .palette .hint, - .palette h2 { - display: none; - } - .palette ul { - display: flex; - overflow-x: auto; - overflow-y: hidden; - } - .palette-item { - white-space: nowrap; - } - .inspector { - max-height: 30vh; - } -} - -.status.message { - color: var(--text); - font-weight: 600; -} - -.confirm { - position: fixed; - inset: 0; - z-index: 20; - display: grid; - place-items: center; - background: rgba(0, 0, 0, 0.25); - padding: 16px; -} -.confirm-card { - background: var(--panel); - border-radius: 12px; - padding: 16px 18px; - max-width: 360px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); -} -.confirm-card p { - margin: 0 0 8px; -} -.confirm-card .group { - justify-content: flex-end; - margin-top: 12px; -} -/* „Variable umbenennen“ */ -.rename-card { - width: min(380px, 100%); -} -.rename-card label { - display: block; - margin-top: 8px; - font-size: 13px; -} -.rename-card input, -.rename-card select { - width: 100%; - box-sizing: border-box; - margin-top: 4px; - font-size: 15px; -} -.rename-card .rename-info { - min-height: 1.3em; - margin-top: 8px; -} -.rename-card .rename-warning { - color: #c93400; -} -.rename-menu { - position: fixed; - z-index: 30; - padding: 4px; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 8px; - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2); -} -.rename-menu button { - display: block; - width: 100%; - text-align: left; - border: none; - background: none; - padding: 6px 12px; - border-radius: 6px; -} -.rename-menu button:hover, -.rename-menu button:focus-visible { - background: var(--accent-soft); -} -.inspector-rename { - margin-top: 8px; -} -.files-ask { - width: min(360px, 100%); -} -.files-ask input { - width: 100%; - box-sizing: border-box; - margin-top: 4px; -} -.files-choices { - display: flex; - flex-wrap: wrap; - gap: 6px; - margin: 4px 0 10px; -} -.files-choice { - display: inline-flex; - align-items: center; - gap: 6px; -} -.files-choice svg { - width: 16px; - height: 16px; -} -button.danger { - background: #d70015; - border-color: #d70015; - color: white; -} - -/* Simulation: Diagramm nur anzeigen, rechts das Simulationsfeld */ -.simpanel { - display: none; - grid-area: insp; - background: var(--panel); - border-inline-start: 1px solid var(--border); - padding: 12px; - overflow-y: auto; -} -.app.simulating { - grid-template: 'tools tools' auto 'work insp' 1fr / minmax(0, var(--sim-work, 1fr)) minmax(240px, 1fr); -} -/* Linie zwischen Diagramm und Steuerung: zum Ziehen, liegt auf dem linken Rand der Steuerung. */ -.sim-resizer { - display: none; - grid-area: insp; - justify-self: start; - width: 10px; - margin-inline-start: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.app.simulating .sim-resizer { - display: block; -} -.sim-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.sim-resizer:hover::after, -.sim-resizer:focus-visible::after, -.shell.resizing .sim-resizer::after { - background: var(--accent); -} -.sim-resizer:focus-visible { - outline: none; -} -/* - * Linie zwischen Diagramm und Objektinspektor: liegt auf dem oberen Rand des Objektinspektors, ist für Finger - * 20 px hoch und zeigt einen kleinen Griff, damit man sie auf dem Tablet findet. - */ -.insp-resizer { - grid-area: insp; - align-self: start; - height: 20px; - margin-top: -10px; - z-index: 5; - cursor: row-resize; - touch-action: none; - position: relative; -} -.insp-resizer::before { - content: ''; - position: absolute; - inset-inline: 0; - top: 9px; - height: 2px; - background: transparent; - transition: background 0.15s; -} -.insp-resizer::after { - content: ''; - position: absolute; - left: 50%; - top: 7px; - width: 36px; - height: 6px; - margin-left: -18px; - border-radius: 3px; - background: var(--border); - transition: background 0.15s; -} -.insp-resizer:hover::before, -.insp-resizer:focus-visible::before, -.shell.resizing .insp-resizer::before, -.insp-resizer:hover::after, -.insp-resizer:focus-visible::after, -.shell.resizing .insp-resizer::after { - background: var(--accent); -} -.insp-resizer:focus-visible { - outline: none; -} -.app.insp-sized .inspector, -.app.insp-sized.coding .inspector { - height: var(--insp-height); - max-height: none; -} -.app.simulating .palette, -.app.simulating .inspector, -.app.simulating .insp-resizer { - display: none; -} -.app.simulating .simpanel { - display: block; -} -.app.simulating .caption { - cursor: default; -} -button.sim-toggle { - font-weight: 600; -} -/* Starten und Beenden sehen gleich aus, nur Symbol und Text wechseln. */ -button.sim-toggle { - background: var(--accent); - border-color: var(--accent); - color: white; -} -.simpanel section { - margin-bottom: 14px; -} -.sim-buttons { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 6px; - margin: 6px 0 10px; -} -.sim-option { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - margin-bottom: 6px; - font-size: 13px; -} -.mono, -.sim-vars td { - font: 13px/1.5 ui-monospace, 'SF Mono', Menlo, Consolas, monospace; -} -.sim-trace, -.sim-output, -.sim-vars { - background: var(--bg); - border-radius: 8px; - padding: 8px 10px; - overflow-wrap: anywhere; -} -.sim-output { - max-height: 220px; - overflow-y: auto; - white-space: pre-wrap; -} -.sim-vars table { - border-collapse: collapse; - width: 100%; -} -.sim-vars td { - padding: 2px 0; - vertical-align: top; -} -.sim-vars td:first-child { - color: var(--muted); - padding-inline-end: 12px; - width: 1%; - white-space: nowrap; -} -/* 2D-Array unter Variablen: kleine Tabelle, Zeile für Zeile */ -.sim-vars table.sim-grid { - width: auto; -} -.sim-vars .sim-grid td, -.sim-vars .sim-grid td:first-child { - border: 1px solid var(--border); - color: inherit; - font-size: 11px; - padding: 0 4px; - text-align: center; - width: auto; -} -.sim-vars .sim-grid td.sim-grid-true { - font-weight: 700; -} -.simpanel .placeholder { - color: var(--muted); - font: 13px system-ui, -apple-system, sans-serif; - margin: 0; -} -.sim-notice { - margin: 0 0 14px; - padding: 8px 10px; - border-radius: 8px; - background: rgba(52, 199, 89, 0.15); - font-weight: 600; -} -.sim-edit { - width: 100%; - margin: -6px 0 14px; -} -.sim-notice.error { - background: rgba(255, 59, 48, 0.15); - color: #b0000f; -} -.sim-input.active { - padding: 8px 10px; - margin-left: -10px; - margin-right: -10px; - border-radius: 10px; - background: var(--accent-faint); - outline: 2px solid var(--accent); -} -.sim-prompt { - margin: 4px 0 6px; - font-weight: 600; -} -.sim-input-row { - display: flex; - gap: 6px; -} -.sim-input-row input { - flex: 1; - min-width: 0; - font: inherit; - padding: 6px 10px; - border: 1px solid var(--border); - border-radius: 8px; -} -.sim-input-error { - color: #b0000f; - margin: 6px 0 0; - font-size: 13px; -} - -@media (max-width: 820px) { - .app.simulating { - grid-template: 'tools' auto 'work' minmax(200px, 1fr) 'insp' auto / minmax(0, 1fr); - } - .simpanel { - border-inline-start: none; - border-top: 1px solid var(--border); - max-height: 48vh; - } - .app.simulating .sim-resizer { - display: none; - } -} - -/* Code-Generator: rechts unter den Eigenschaften, Bearbeiten bleibt möglich */ -.codepanel { - display: none; - grid-area: code; - background: var(--panel); - border-inline-start: 1px solid var(--border); - padding: 12px; - overflow-y: auto; - min-height: 0; -} -.app.coding { - grid-template: - 'tools tools tools' auto - 'pal work code' 1fr - 'pal insp code' auto / var(--palette-width, 210px) minmax(0, 1fr) 400px; -} -.app.coding .codepanel { - display: block; -} -.app.coding .inspector { - max-height: 34vh; -} -button[data-action='code'][aria-pressed='true'] { - border-color: var(--accent); - background: var(--accent-soft); -} -.code-head, -.runner-head { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -} -.code-close { - min-height: 28px; - padding: 2px 10px; -} -.segmented { - display: flex; - margin-bottom: 8px; -} -.segmented button { - flex: 1; - border-radius: 0; - min-height: 30px; - padding: 4px 8px; -} -.segmented button:first-child { - border-radius: 8px 0 0 8px; -} -.segmented button:last-child { - border-radius: 0 8px 8px 0; -} -.segmented button + button { - border-inline-start: none; -} -.segmented button[aria-pressed='true'] { - background: var(--accent); - border-color: var(--accent); - color: white; -} -.segmented[hidden] { - display: none; -} -.check { - display: flex; - gap: 8px; - align-items: center; - font-size: 13px; - margin-bottom: 4px; -} -.code-actions { - display: flex; - flex-wrap: wrap; - gap: 6px; - margin: 10px 0; -} -.code-actions [hidden] { - display: none; -} -button.primary { - background: var(--accent); - border-color: var(--accent); - color: white; -} -.code-view, -.runner-out { - margin: 0; - padding: 10px 12px; - border-radius: 10px; - background: var(--bg); - font: 13px/1.5 ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - overflow: auto; - white-space: pre; - tab-size: 4; -} -.runner { - margin: 12px 0; -} -.runner-out { - background: #0b1220; - color: #e5e7eb; - min-height: 3em; - max-height: 240px; - white-space: pre-wrap; -} -.runner-out.error { - outline: 2px solid #ff453a; -} -.runner-input { - margin-top: 8px; -} -.runner-input label { - display: block; - font-weight: 600; - margin-bottom: 4px; -} - -@media (max-width: 820px) { - .app.coding { - grid-template: 'tools' auto 'pal' auto 'work' minmax(240px, 1fr) 'insp' auto 'code' auto / minmax(0, 1fr); - } - .codepanel { - border-inline-start: none; - border-top: 1px solid var(--border); - max-height: 50vh; - } -} - -/* Reiter (mehrere Diagramme) */ -.tabs { - display: flex; - align-items: flex-end; - gap: 2px; - padding: 6px 8px 0; - background: var(--bg); - border-bottom: 1px solid var(--border); - overflow-x: auto; - /* Nur waagerecht scrollen: sonst zeigt Windows hier einen winzigen senkrechten Scrollbalken */ - overflow-y: hidden; - scrollbar-width: thin; -} -.tab { - display: flex; - align-items: center; - max-width: 220px; - border: 1px solid var(--border); - border-bottom: none; - border-radius: 8px 8px 0 0; - background: rgba(255, 255, 255, 0.5); -} -.tab.active { - background: var(--panel); - margin-bottom: -1px; - padding-bottom: 1px; -} -.tab button { - border: none; - background: none; - min-height: 30px; - border-radius: 8px 8px 0 0; -} -.tab-label { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - padding: 4px 6px 4px 12px; -} -.tab.active .tab-label { - font-weight: 600; -} -.tab-close { - padding: 2px 8px; - color: var(--muted); - font-size: 11px; -} -.tab-close:hover { - color: var(--text); -} -.tab-dot, -.tab-close.unsaved .tab-x { - display: none; -} -.tab-close.unsaved .tab-dot { - display: inline; - color: var(--text); - font-size: 10px; -} -.tab-close.unsaved:hover .tab-dot { - display: none; -} -button.tab-close.unsaved:hover .tab-x { - display: inline; -} -span.tab-close { - padding: 2px 10px 2px 4px; -} -.tab-add { - min-height: 28px; - padding: 2px 10px; - margin: 0 0 3px 4px; - border-radius: 8px; -} - -/* Inspector wie in der App */ -.inspector .segmented { - margin: 6px 0 4px; - max-width: 420px; -} -.mono-hint { - font: 11px/1.45 ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - overflow-wrap: anywhere; -} -.editor-row { - display: flex; - gap: 8px; - align-items: flex-start; -} -.editor-row textarea { - flex: 1; - min-width: 0; -} -.fixed-prefix { - font: 14px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - color: var(--muted); - padding-top: 9px; -} -.inspector input:not([type]) { - width: 100%; - font: 14px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - padding: 7px 8px; - border: 1px solid var(--border); - border-radius: 8px; -} -.for-fields { - display: grid; - gap: 4px; -} -.for-fields label, -.case-controls label { - margin: 4px 0 0; - font-size: 12px; - color: var(--muted); - font-weight: 600; -} -.case-controls { - margin-top: 12px; - padding-top: 10px; - border-top: 1px solid var(--border); -} -.case-controls .group { - margin-top: 8px; -} -button.danger-text:not(:disabled) { - color: #d70015; -} - -/* Drucken: nur das Export-Bild, eingepasst auf die Seite. */ -.print-sheet { - display: none; -} -/* Dateien: Workspace als Baum (Klasse → Tag → Programme) */ -.files { - display: none; - flex: 0 1 auto; - flex-direction: column; - width: 260px; - min-width: 200px; - min-height: 0; - background: var(--panel); - border-inline-end: 1px solid var(--border); -} -.shell.files-open .files { - display: flex; -} -.shell.files-open .files-rail { - display: none; -} -.files-head { - display: flex; - align-items: center; - gap: 4px; - margin: 10px 12px 6px; -} -.files-head h2 { - flex: 1; - margin: 0; - font-size: 13px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); -} -.files-head button.icon { - min-width: 30px; - height: 30px; - padding: 0 5px; -} -.files-head [hidden] { - display: none; -} -.files-body { - flex: 1; - min-height: 0; - overflow: auto; - padding: 0 8px 12px; - font-size: 14px; -} -.files-where { - margin: 0 4px 6px; - font-size: 12px; - color: var(--muted); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.files-hint, -.files-empty { - margin: 8px 4px; - font-size: 13px; - color: var(--muted); -} -.start-ask .files-start { - margin-bottom: 2px; -} -.start-ask .hint { - font-size: 13px; - color: var(--muted); -} -.start-without { - display: block; - margin: 12px auto 0; - border: none; - background: none; - color: var(--accent); - text-decoration: underline; -} -.start-without + .hint { - text-align: center; -} -.files-start { - display: flex; - align-items: center; - gap: 6px; - width: 100%; - margin: 8px 0; - justify-content: center; -} -.files-row { - display: flex; - align-items: center; - border-radius: 6px; -} -.files-row:hover, -.files-row:focus-within { - background: var(--accent-soft); -} -.files-row.current > .files-name { - font-weight: 600; -} -.files-name { - flex: 1; - min-width: 0; - display: flex; - align-items: center; - gap: 6px; - padding: 4px 6px 4px calc(6px + var(--depth) * 16px); - border: none; - background: none; - text-align: start; - font: inherit; - color: var(--text); - cursor: pointer; -} -.files-name:disabled { - cursor: default; - color: var(--muted); -} -.files-name svg { - flex: none; - width: 16px; - height: 16px; - color: var(--muted); -} -.files-name span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.files-name small { - margin-inline-start: auto; - padding: 0 6px; - border-radius: 6px; - background: var(--accent); - color: white; - font-size: 11px; - font-weight: 600; -} -.files-row .files-delete { - visibility: hidden; - min-width: 26px; - height: 26px; - padding: 0 4px; - border: none; - background: none; - color: var(--muted); -} -.files-row:hover .files-delete, -.files-row:focus-within .files-delete { - visibility: visible; -} -.files-error { - color: #c62828; -} -.files-resizer { - display: none; - flex: none; - width: 10px; - margin-inline: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.shell.files-open .files-resizer { - display: block; -} -.files-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; -} -.files-resizer:hover::after, -.files-resizer:focus-visible::after { - background: var(--accent); -} - -/* Lernbereich */ -/* Lernen und Code live geben nach, wenn das Fenster zu schmal wird; das Struktogramm behält mindestens 240 px. */ -.learn { - display: none; - flex: 0 1 auto; - width: 400px; - min-width: 280px; - flex-direction: column; - background: var(--panel); - border-inline-end: 1px solid var(--border); - min-height: 0; -} -.shell.learning .learn { - display: flex; -} -/* Trennlinie zum Ziehen; breite Trefferfläche, damit es auch mit dem Finger geht. */ -.learn-resizer { - display: none; - flex: none; - width: 10px; - margin-inline: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.shell.learning .learn-resizer { - display: block; -} -.learn-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.learn-resizer:hover::after, -.learn-resizer:focus-visible::after, -.shell.resizing .learn-resizer::after { - background: var(--accent); -} -.learn-resizer:focus-visible { - outline: none; -} -.shell.resizing { - cursor: col-resize; - user-select: none; -} -/* Kopfzeile: Reiter und Einklapp-Knopf (Seitenleisten-Symbol wie auf dem Mac). */ -.learn-head { - display: flex; - align-items: flex-start; - gap: 6px; - margin: 10px 12px 0; -} -.learn-tabs { - flex: 1; - min-width: 0; -} -.learn-hide { - flex: none; - min-height: 30px; - padding: 4px 7px; - display: inline-flex; - align-items: center; - color: var(--muted); -} -/* Eingeklappt: schmale Leiste am Rand, ein Tipp klappt den Lernbereich wieder auf. */ -.learn-rail { - flex: none; - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - width: 36px; - padding: 10px 0; - border: none; - border-radius: 0; - border-inline-end: 1px solid var(--border); - background: var(--panel); - cursor: pointer; -} -.learn-rail:hover { - background: var(--accent-soft); -} -.learn-rail span { - writing-mode: vertical-rl; - white-space: nowrap; -} -.shell.learning .learn-rail:not(.live-rail):not(.editor-rail):not(.files-rail):not(.robotpreview-rail):not(.palette-rail) { - display: none; -} -/* Code live eingeklappt: dieselbe Leiste, nur am rechten Rand. */ -.live-rail { - border-inline-end: none; - border-inline-start: 1px solid var(--border); -} -.live-rail svg { - transform: scaleX(-1); -} -.shell.live .live-rail { - display: none; -} -/* Struktogramm eingeklappt: Leiste in der Mitte. Lernen behält seine (verschiebbare) Breite, Code live füllt den Rest. */ -.editor-rail { - display: none; - border-inline-start: 1px solid var(--border); -} -.shell.editor-hidden .editor-rail { - display: flex; -} -.shell.editor-hidden .app, -.shell.editor-hidden .live-resizer, -.shell.editor-hidden:not(.live) .learn-resizer { - display: none; -} -.shell.editor-hidden .livecode, -.shell.editor-hidden:not(.live) .learn { - flex: 1 1 0; - width: auto !important; - min-width: 0; -} -.learn-body { - overflow-y: auto; - /* Sonst: Scrollbalken erscheint → Vorschaubilder schmaler und kürzer → Scrollbalken verschwindet → … */ - scrollbar-gutter: stable; - padding: 4px 16px 24px; - flex: 1; - min-height: 0; - line-height: 1.5; -} -.learn-body h2.learn-title { - display: flex; - align-items: center; - gap: 8px; - font-size: 20px; - text-transform: none; - letter-spacing: 0; - color: var(--text); - margin: 2px 0 10px; -} -.learn-section { - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); - margin: 18px 0 6px; -} -.learn-list { - list-style: none; - padding: 0; - margin: 0; - display: grid; - gap: 6px; -} -.learn-item { - display: flex; - align-items: center; - gap: 10px; - width: 100%; - text-align: start; - padding: 8px 10px; -} -.learn-item.done { - border-color: #34c759; -} -.learn-num { - flex: none; - min-width: 28px; - height: 28px; - border-radius: 14px; - background: var(--accent-soft); - color: var(--accent); - display: grid; - place-items: center; - font-weight: 700; - font-size: 12px; - padding: 0 6px; -} -.learn-item.done .learn-num { - background: rgba(52, 199, 89, 0.18); - color: #248a3d; -} -.learn-item-text { - flex: 1; - display: grid; - min-width: 0; -} -.learn-item-text small { - color: var(--muted); -} -.learn-status { - flex: none; - color: var(--muted); - font-size: 12px; -} -.learn-item.done .learn-status { - color: #248a3d; - font-weight: 700; -} -.learn-back, -.link-button { - border: none; - background: none; - padding: 6px 0; - min-height: 0; - color: var(--accent); -} -.link-button { - padding: 0; - text-align: start; -} -/* Lektionskopf bleibt oben stehen, nur der Schritt darunter scrollt. */ -.learn-lesson-head { - position: sticky; - top: -4px; - z-index: 3; - margin: -4px -16px 10px; - padding: 4px 16px 8px; - background: var(--panel); - border-bottom: 1px solid var(--border); -} -.learn-lesson-head .learn-progress { - margin-bottom: 8px; -} -.learn-lesson-head .learn-step-title { - margin: 0; -} -.learn-head-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - flex-wrap: wrap; -} -.learn-nav.learn-nav-top { - margin-top: 0; - gap: 6px; -} -.learn-nav-top button { - padding: 3px 10px; - min-height: 0; - font-size: 13px; -} -.learn-kicker { - margin: 4px 0 0; - color: var(--muted); - font-size: 12px; -} -.learn-progress { - display: flex; - gap: 4px; - margin-bottom: 14px; -} -.learn-progress button { - flex: 1 1 0; - min-width: 0; - padding: 3px 0; - font-size: 13px; - font-variant-numeric: tabular-nums; - border-radius: 6px; -} -.learn-progress button.past { - border-color: var(--accent); - color: var(--accent); -} -.learn-progress button.current { - border-color: var(--accent); - background: var(--accent); - color: #fff; - font-weight: 600; -} -.learn-progress button.robot-step:not(.current) { - border-color: #0fa3c6; - background: rgba(15, 163, 198, 0.12); -} -.learn-progress button.robot-step.current { - border-color: #0fa3c6; - background: #0fa3c6; -} -.learn-step-title { - font-size: 16px; - margin: 0 0 6px; -} -.learn-text p, -.learn-text ul, -.learn-text ol { - margin: 0 0 10px; -} -.learn-text ul, -.learn-text ol { - padding-inline-start: 22px; -} -.learn-text code, -.learn-tests code { - font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - font-size: 12.5px; - background: var(--bg); - border-radius: 4px; - padding: 1px 4px; -} -.learn-text h3 { - font-size: 15px; - margin: 18px 0 4px; -} -/* Nachschlagen: Kategorien zum Aufklappen */ -.reference-group { - border: 1px solid var(--border); - border-radius: 8px; - margin: 0 0 8px; - padding: 0 12px; -} -.reference-group summary { - cursor: pointer; - font-weight: 600; - padding: 9px 0; -} -.reference-group[open] summary { - border-bottom: 1px solid var(--border); -} -.reference-group > h3:first-of-type { - margin-top: 10px; -} -.lesson-code { - background: var(--bg); - border-radius: 8px; - padding: 8px 10px; - margin: 0 0 10px; - overflow-x: auto; - overflow-y: hidden; - font-size: 12.5px; -} -.learn-open-code { - display: block; - margin: -4px 0 12px; -} -.lesson-code code { - background: none; - padding: 0; -} -.lesson-note { - border-inline-start: 3px solid var(--accent); - background: var(--accent-soft); - border-radius: 6px; - padding: 8px 10px; - margin: 0 0 10px; -} -.lesson-note p:last-child { - margin-bottom: 0; -} -.learn-images { - display: flex; - gap: 8px; - flex-wrap: wrap; -} -.learn-images img { - width: 150px; - height: 200px; - object-fit: cover; - border-radius: 8px; -} -.learn-file { - margin: 0 0 14px; - border: 1px solid var(--border); - border-radius: 10px; - overflow: hidden; - background: var(--panel); -} -.learn-file figcaption { - display: flex; - align-items: center; - gap: 6px; - padding: 6px 10px; - background: var(--bg); - border-bottom: 1px solid var(--border); - font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - font-size: 12.5px; - font-weight: 600; -} -.learn-file-text { - margin: 0; - padding: 8px 10px; - overflow-x: auto; - font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - font-size: 12.5px; - line-height: 1.5; - white-space: pre; -} -.learn-file.written { - margin: 8px 0; - border-color: #15803d; -} -.learn-file.written figcaption { - background: #dcfce7; -} -.learn-file-text .ln { - display: inline-block; - min-width: 2ch; - margin-inline-end: 10px; - color: var(--muted); - text-align: end; - user-select: none; -} - -.learn-brag { - display: grid; - grid-template-columns: 48px minmax(0, 1fr); - gap: 10px; - align-items: start; - border: 1px solid var(--border); - border-radius: 10px; - padding: 10px 12px; - margin: 0 0 14px; - background: var(--accent-soft); -} -.learn-brag img { - width: 48px; - height: 48px; - border-radius: 50%; -} -.learn-brag-title { - margin: 0 0 4px; - font-weight: 700; -} -.learn-brag .learn-text p:last-child { - margin-bottom: 0; -} -.learn-game { - border: 2px solid var(--accent); - border-radius: 12px; - padding: 12px 14px; - margin: 0 0 14px; -} -.learn-game-head { - display: flex; - align-items: center; - gap: 10px; - font-size: 1.05em; -} -.learn-game-head img { - width: 40px; - height: 40px; - border-radius: 50%; -} -.learn-game-status { - margin: 6px 0; - color: var(--muted); - font-size: 0.9em; -} -.learn-game-values { - display: flex; - flex-wrap: wrap; - gap: 6px; - margin-bottom: 8px; -} -.learn-game-values code { - background: var(--accent-soft); - border-radius: 6px; - padding: 2px 8px; -} -.learn-game-condition { - font-size: 1.15em; - font-weight: 600; - padding: 10px 12px; - border-radius: 8px; - background: var(--bg, #f2f2f7); - margin-bottom: 10px; - overflow-wrap: anywhere; -} -.learn-game-answers button { - flex: 1; - font-weight: 600; - padding-block: 10px; -} -.learn-game-true:not(:disabled) { - border-color: #15803d; - color: #15803d; -} -.learn-game-false:not(:disabled) { - border-color: #b91c1c; - color: #b91c1c; -} -.learn-game-feedback:empty { - display: none; -} -.learn-game-feedback { - margin-top: 10px; - padding: 10px 12px; - border-radius: 8px; -} -.learn-game-feedback.right { - background: #dcfce7; -} -.learn-game-feedback.wrong { - background: #fee2e2; -} -.learn-game-feedback p { - margin: 0 0 6px; - font-weight: 700; -} -.learn-game-steps { - margin-bottom: 10px; - line-height: 1.6; -} -.learn-game-result { - font-size: 1.2em; - font-weight: 700; -} -.learn-game-question { - font-weight: 600; - margin: 10px 0 8px; -} -.learn-game-code { - margin: 0 0 8px; - padding: 8px 0; - border-radius: 8px; - background: var(--bg, #f2f2f7); - font-size: 13px; - line-height: 1.5; - overflow-x: auto; -} -.learn-game-code .ln { - padding: 0 10px 0 calc(10px + 2ch); - text-indent: -2ch; - border-inline-start: 3px solid transparent; - white-space: pre-wrap; - overflow-wrap: anywhere; - transition: background 0.2s; -} -.learn-game-code .ln.hit { - background: #fef3c7; - border-inline-start-color: #d97706; -} -/* Bombe entschärfen: Zeilen sind Knöpfe, darüber der Countdown */ -.learn-bomb { - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 6px; - font-weight: 700; -} -.learn-bomb-icon { - font-size: 28px; - line-height: 1; -} -.learn-bomb.hurry .learn-bomb-icon { - animation: learn-bomb-shake 0.25s infinite alternate; -} -.learn-bomb.boom .learn-bomb-icon { - animation: learn-bomb-boom 0.5s ease-out; -} -@keyframes learn-bomb-shake { - from { transform: rotate(-8deg); } - to { transform: rotate(8deg); } -} -@keyframes learn-bomb-boom { - from { transform: scale(0.6); } - 60% { transform: scale(1.5); } - to { transform: scale(1); } -} -.learn-bomb-time { - min-width: 7ch; - font-variant-numeric: tabular-nums; -} -.learn-bomb-fuse { - flex: 1; - height: 8px; - border-radius: 4px; - background: #e5e7eb; - overflow: hidden; -} -.learn-bomb-fuse span { - display: block; - height: 100%; - background: #f59e0b; - transition: width 0.2s linear; -} -.learn-bomb.hurry .learn-bomb-fuse span { - background: #dc2626; -} -.learn-bomb.defused .learn-bomb-fuse span { - background: #15803d; -} -.learn-bomb-code .ln { - display: block; - width: 100%; - margin: 0; - border-radius: 0; - border-block: 0; - border-inline-end: 0; - background: none; - color: inherit; - font: inherit; - line-height: inherit; - min-height: 0; - height: auto; - padding-block: 1px; - text-align: start; - cursor: pointer; -} -.learn-bomb-code .ln:not(:disabled):hover { - background: #fef3c7; -} -.learn-bomb-code .ln:disabled { - cursor: default; - opacity: 1; -} -.learn-bomb-code .ln.right, -.learn-bomb-code .ln.right:hover { - background: #dcfce7; - border-inline-start-color: #15803d; -} -.learn-bomb-code .ln.wrong, -.learn-bomb-code .ln.wrong:hover { - background: #fee2e2; - border-inline-start-color: #b91c1c; -} -.learn-bomb-fix code { - white-space: pre-wrap; -} -/* Bombe mit `stelle:`: Teile der Zeilen sind Knöpfe, groß genug zum Antippen */ -.learn-bomb-code.by-parts .ln.parts { - cursor: default; - padding-block: 3px; - line-height: 1.9; -} -.learn-bomb-code.by-parts .ln.parts:hover { - background: none; -} -.learn-bomb-code.by-parts .ln.parts.right { - background: #f0fdf4; -} -.learn-bomb-code .part { - display: inline; - margin: 0; - padding: 2px 3px; - min-height: 0; - height: auto; - border: 1px dashed #94a3b8; - border-radius: 4px; - background: none; - color: inherit; - font: inherit; - line-height: inherit; - cursor: pointer; - -webkit-box-decoration-break: clone; - box-decoration-break: clone; -} -.learn-bomb-code .part:not(:disabled):hover { - background: #fef3c7; - border-color: #d97706; -} -.learn-bomb-code .part:disabled { - cursor: default; - opacity: 1; -} -.learn-bomb-code .part.right { - background: #dcfce7; - border: 2px solid #15803d; -} -.learn-bomb-code .part.wrong { - background: #fee2e2; - border: 2px solid #b91c1c; -} -.learn-bomb-hint { - color: var(--muted, #6b7280); - font-size: 0.92em; -} -.learn-game-options { - display: grid; - gap: 6px; -} -.learn-game-options button { - text-align: start; - padding: 8px 12px; -} -.learn-game-options.pictures { - grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); -} -.learn-game-options.pictures button { - padding: 6px; -} -.learn-game-options button.right { - border-color: #15803d; - background: #dcfce7; - color: inherit; - opacity: 1; -} -.learn-game-options button.wrong { - border-color: #b91c1c; - background: #fee2e2; - color: inherit; - opacity: 1; -} -.learn-order-hint { - margin: 0 0 6px; - font-size: 13px; - opacity: 0.75; -} -.learn-order button { - display: flex; - align-items: center; - gap: 10px; -} -.learn-order-badge { - flex: none; - display: inline-grid; - place-items: center; - width: 24px; - height: 24px; - border-radius: 50%; - border: 1.5px solid currentColor; - font-size: 13px; - font-weight: 700; - opacity: 0.5; -} -.learn-order button.right .learn-order-badge, -.learn-order button:disabled .learn-order-badge:not(:empty) { - opacity: 1; -} -.learn-game-file { - margin: 0; - padding: 2px 0; - font-size: 13px; - line-height: 1.45; - white-space: pre; - background: none; -} -.learn-game-explain { - margin-bottom: 10px; -} -/* „Wer hört zu?“: Code und nachgebautes Fenster nebeneinander (schmal: untereinander) */ -.learn-swing-row { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 8px; - align-items: start; -} -.learn-swing-window { - border: 1px solid var(--border); - border-radius: 8px; - overflow: hidden; - background: #fff; - color: #1c1c1e; -} -.learn-swing-title { - padding: 3px 8px; - font-size: 12px; - text-align: center; - background: #e5e5ea; - border-bottom: 1px solid #d1d1d6; - min-height: 1.4em; -} -.learn-swing-body { - display: grid; - gap: 6px; - padding: 10px; -} -.learn-swing-label { - padding: 4px 2px; - min-height: 1.4em; -} -.learn-swing-label.changed, -.learn-swing-button.changed { - animation: swing-changed 1s ease-out; -} -@keyframes swing-changed { - from { - background: rgba(255, 214, 10, 0.8); - } -} -.learn-swing-button { - padding: 6px 10px; - background: #fff; - color: #1c1c1e; - border: 1px solid #a1a1aa; - border-radius: 6px; -} -.learn-swing-button:disabled { - opacity: 1; - cursor: default; -} -.learn-swing-button.pressed { - background: var(--accent); - border-color: var(--accent); - color: #fff; - transform: scale(0.96); -} -.learn-swing-event { - margin: 0; - padding: 0 10px 8px; - font-size: 12px; - min-height: 1.4em; -} -.learn-swing-event.heard { - color: #b45309; - font-weight: 600; -} -.learn-swing-event.nobody { - color: #6b7280; - font-style: italic; -} -.learn-swing-console { - margin: 0 10px 10px; - padding: 6px 8px; - border-radius: 6px; - background: #1c1c1e; - color: #f2f2f7; - font-size: 12px; -} -.learn-swing-console[hidden] { - display: none; -} -.learn-swing-clicks { - margin: 8px 0 0; -} -.learn-swing-try { - font-weight: normal !important; - font-style: italic; -} -/* „Wo landet der Knopf?“: kleine Fenster als Antworten */ -.learn-layout-window { - width: 100%; - border: 1px solid #a1a1aa; - border-radius: 6px; - overflow: hidden; - background: #fff; - color: #1c1c1e; -} -.learn-layout-title { - height: 10px; - background: #e5e5ea; - border-bottom: 1px solid #d1d1d6; -} -.learn-layout-body { - height: 80px; - padding: 3px; - gap: 3px; - font-size: 12px; -} -.learn-layout-body.grid { - display: grid; - grid-auto-rows: 1fr; -} -.learn-layout-body.flow { - display: flex; - flex-direction: column; - gap: 3px; -} -.learn-layout-row { - display: flex; - justify-content: center; - gap: 3px; -} -.learn-layout-body.border { - display: grid; - grid-template: 'N N N' auto 'W C E' 1fr 'S S S' auto / auto 1fr auto; -} -.learn-layout-cell { - display: flex; - align-items: center; - justify-content: center; - min-width: 22px; - padding: 2px 6px; - border: 1px solid #a1a1aa; - border-radius: 4px; - background: #f4f4f5; - font-weight: 600; -} -.learn-figure { - margin: 0 0 14px; - display: grid; - gap: 6px; - justify-items: start; -} -.learn-preview { - width: 100%; - border: 1px solid var(--border); - border-radius: 8px; - overflow-x: auto; - overflow-y: hidden; - background: #fafafa; -} -.learn-preview > svg { - display: block; - width: 100%; - margin: 0 auto; - height: auto; -} -.learn-figure figcaption { - color: var(--muted); - font-size: 13px; -} -.learn-exercise { - border: 1px solid var(--accent); - border-radius: 10px; - padding: 10px 12px; - margin: 0 0 14px; - display: grid; - gap: 8px; -} -.learn-exercise h4 { - margin: 0; - font-size: 15px; - display: flex; - gap: 8px; - align-items: center; -} -.learn-badge { - font-size: 12px; - color: #248a3d; - background: rgba(52, 199, 89, 0.18); - border-radius: 10px; - padding: 1px 8px; -} -.learn-where { - margin: 0; - font-size: 13px; - font-weight: 600; - color: var(--muted); -} -.area-name { - display: inline-block; - color: #fff; - border-radius: 10px; - padding: 0 8px; -} -.area-name.area-editor { - background: var(--area-editor); -} -.area-name.area-code { - background: var(--area-code); -} -/* Jeder Bereich zeigt seine Farbe: oben ein farbiger Rand, eingeklappt die Leiste. */ -.columns > .app { - border-top: 3px solid var(--area-editor); -} -.livecode { - border-top: 3px solid var(--area-code); -} -.diagram-title { - margin: 0; - font-size: 16px; - color: var(--area-editor); -} -.livecode-head h2, -.live-rail span { - color: var(--area-code); -} -.editor-rail span { - color: var(--area-editor); -} -.live-rail, -.editor-rail { - font-weight: 600; -} -.learn-exercise .learn-text p:last-child { - margin-bottom: 0; -} -.learn-result:empty { - display: none; -} -.learn-result { - border-radius: 8px; - padding: 8px 10px; -} -.learn-result.ok { - background: rgba(52, 199, 89, 0.14); -} -.learn-result.fail { - background: rgba(255, 149, 0, 0.14); -} -.learn-result.info { - background: var(--bg); -} -.learn-result-head { - margin: 0 0 6px; - font-weight: 600; -} -.learn-tests { - list-style: none; - padding: 0; - margin: 0; - display: grid; - gap: 6px; -} -.learn-test-detail { - display: grid; - padding-inline-start: 16px; - font-size: 13px; -} -.learn-error { - color: #c4291c; -} -.learn-solution summary { - cursor: pointer; - color: var(--accent); -} -.learn-solution[open] { - display: grid; - gap: 6px; - justify-items: start; -} -.learn-checklist { - list-style: none; - padding: 0; - margin: 0 0 14px; - display: grid; - gap: 6px; -} -.learn-checklist li { - display: flex; - gap: 8px; - align-items: baseline; - justify-content: space-between; -} -.learn-checklist li { - align-items: center; - justify-content: flex-start; - padding: 4px 6px; - border-radius: 8px; -} -.learn-check-text { - flex: 1; -} -.learn-checklist li[data-rating='sun'] { - background: color-mix(in srgb, #f5b800 14%, transparent); -} -.learn-checklist li[data-rating='cloud'] { - background: color-mix(in srgb, #8a97a8 14%, transparent); -} -.learn-checklist li[data-rating='umbrella'] { - background: color-mix(in srgb, #3b82f6 12%, transparent); -} -.learn-rating { - display: inline-flex; - gap: 2px; - flex: none; -} -.learn-rating-button { - min-width: 34px; - min-height: 34px; - padding: 2px; - font-size: 1.15em; - line-height: 1; - border-radius: 8px; - opacity: 0.45; - filter: grayscale(0.7); -} -.learn-rating-button[aria-pressed='true'] { - opacity: 1; - filter: none; - border-color: var(--accent); - background: var(--accent-soft); -} -.learn-rating-legend { - display: flex; - flex-wrap: wrap; - gap: 4px 14px; - margin: 0 0 8px; - font-size: 0.9em; - color: var(--muted, inherit); -} -.learn-review { - margin: 12px 0 0; -} -.learn-review:empty { - display: none; -} -.learn-review-title { - margin: 0 0 4px; - font-weight: 700; -} -.learn-review-icon { - flex: none; - width: 1.6em; - text-align: center; -} -.learn-checklist li.learn-review-deviation { - border: 1px solid var(--accent); - background: var(--accent-soft); -} -.learn-competences { - border: 1px solid var(--accent); - border-radius: 10px; - padding: 10px 12px; - margin: 0 0 14px; - background: var(--accent-soft); -} -.learn-competences-title { - margin: 0 0 4px; - font-weight: 700; -} -.learn-competences ul { - margin: 0; - padding-left: 1.3em; -} -.learn-return { - width: 100%; - margin: 0 0 12px; - border-color: var(--accent); - background: var(--accent-soft); -} -.learn-nav + .learn-return { - margin: 12px 0 0; -} -.learn-check-link { - flex: none; - font-size: 13px; -} -.learn-quiz fieldset { - border: 1px solid var(--border); - border-radius: 10px; - padding: 8px 12px 10px; - margin: 0 0 10px; - display: grid; - gap: 6px; -} -.learn-quiz legend { - font-weight: 600; - padding: 0 4px; -} -.learn-option { - text-align: start; -} -.learn-option.right { - border-color: #34c759; - background: rgba(52, 199, 89, 0.14); -} -.learn-option.wrong { - border-color: #ff3b30; - background: rgba(255, 59, 48, 0.1); -} -.learn-match { - display: grid; - gap: 6px; -} -.learn-match-left { - display: grid; - grid-template-columns: 8.5em minmax(0, 1fr); - align-items: center; - gap: 8px; -} -.learn-match-select { - min-width: 0; - width: 100%; - max-width: none; -} -.learn-match-select.right { - border-color: #34c759; - background: rgba(52, 199, 89, 0.14); -} -.learn-match-select.wrong { - border-color: #ff3b30; - background: rgba(255, 59, 48, 0.1); -} -.learn-explanation { - margin: 0; - color: var(--muted); - font-size: 13px; -} -.learn-score { - font-weight: 600; -} -.learn-nav { - display: flex; - justify-content: space-between; - gap: 8px; - margin-top: 18px; -} -@media (max-width: 1100px) { - .learn { - width: 340px; - } -} -@media (max-width: 900px) { - .learn { - width: 300px; - } -} -/* Code live: rechts neben dem Editor, wächst bei jeder Änderung mit */ -.livecode { - display: none; - flex: 0 1 auto; - width: 420px; - min-width: 200px; - flex-direction: column; - gap: 6px; - padding: 10px 12px 12px; - background: var(--panel); - border-inline-start: 1px solid var(--border); - min-height: 0; -} -.shell.live .livecode { - display: flex; -} -.livecode-head { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - gap: 6px; -} -.livecode-head h2 { - margin: 0; - font-size: 16px; -} -.livecode-lang { - margin-inline-start: auto; - padding: 2px 8px; - border-radius: 6px; - background: var(--accent-soft); - color: var(--accent); - font-size: 12px; - font-weight: 600; -} -/* Seitenleisten-Symbol gespiegelt: der Bereich liegt rechts. */ -.livecode .learn-hide svg { - transform: scaleX(-1); -} -.livecode .hint { - margin: 0; -} -.livecode-view { - flex: 1; - min-height: 0; - padding: 10px 0; - font-size: var(--code-size, 14px); -} -.livecode-view .ln { - padding: 0 12px; - min-height: 1.5em; - border-inline-start: 3px solid transparent; -} -.livecode-view.selectable .ln { - cursor: pointer; -} -.livecode-view .ln.sel { - background: var(--accent-soft); - border-inline-start-color: var(--accent); -} -.livecode-view .ph { - color: var(--muted); - font-style: italic; -} -/* Java selbst tippen: Code-Editor (CodeMirror) */ -.livecode-editor { - flex: 1; - min-height: 0; - padding: 0; - font-size: var(--code-size, 14px); - white-space: normal; - overflow: hidden; - /* Farben wie in Eclipse: Text blau, Schlüsselwörter lila, Kommentare grün (Rot bleibt für Fehler) */ - --syn-keyword: #7f0055; - --syn-string: #2a00ff; - --syn-number: #986801; - --syn-comment: #3f7f5f; -} -.livecode-editor[hidden], -.livecode-view[hidden], -.livecode-problem[hidden] { - display: none; -} -.livecode-editor .cm-editor { - height: 100%; - background: transparent; -} -.livecode-editor .cm-editor.cm-focused { - outline: 2px solid var(--accent-soft); - outline-offset: -2px; - border-radius: 10px; -} -.livecode-editor .cm-scroller { - font: inherit; - font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - line-height: 1.5; -} -.livecode-editor .cm-gutters { - background: transparent; - border-inline-end: 1px solid var(--border); - color: var(--muted); -} -.livecode-editor .cm-lineNumbers .cm-gutterElement { - padding: 0 8px 0 10px; - min-width: 2ch; -} -.livecode-editor .cm-activeLineGutter { - background: transparent; - color: var(--text); -} -.livecode-editor .cm-content { - padding: 10px 0; - caret-color: var(--text); -} -.livecode-editor .cm-line { - padding: 0 12px; - border-inline-start: 3px solid transparent; -} -/* Farbige Blöcke wie in BlueJ: Klasse grün, Methode gelb, Schleife rosa, Verzweigung blau, try lila. - Zarte Fläche, feiner Rand und links ein kräftiger Streifen in der Farbe des Blocks. */ -.livecode-editor .cm-scopeLayer .cm-scope { - border: 1px solid color-mix(in srgb, var(--scope) 28%, transparent); - border-left: 3px solid var(--scope); - border-radius: 8px; - background: color-mix(in srgb, var(--scope) 9%, #fff); -} -.livecode-editor .cm-scopeLayer .cm-scope-class { - --scope: #34c47c; -} -.livecode-editor .cm-scopeLayer .cm-scope-method { - --scope: #f2b100; -} -.livecode-editor .cm-scopeLayer .cm-scope-loop { - --scope: #ec5fa6; -} -.livecode-editor .cm-scopeLayer .cm-scope-if { - --scope: #3b9cf0; -} -.livecode-editor .cm-scopeLayer .cm-scope-try { - --scope: #9a7cf0; -} -/* Einstellung „Blöcke farbig“ ausgeschaltet: nur der Rahmen der Auswahl bleibt */ -:root.no-code-scopes .livecode-editor .cm-scopeLayer .cm-scope:not(.cm-scope-sel) { - display: none; -} -/* Struktogramm in denselben Farben: Anweisungen gelb wie die Methode, Schleife rosa, Verzweigung/Fallauswahl blau. - Etwas kräftiger als im Code, weil der farbige Streifen links fehlt. */ -:root:not(.no-code-scopes) .ns-scope-method { - fill: color-mix(in srgb, #f2b100 14%, #fff); -} -:root:not(.no-code-scopes) .ns-scope-loop { - fill: color-mix(in srgb, #ec5fa6 14%, #fff); -} -:root:not(.no-code-scopes) .ns-scope-if { - fill: color-mix(in srgb, #3b9cf0 14%, #fff); -} -/* Elemente-Spalte in denselben Farben */ -:root:not(.no-code-scopes) .palette-item[data-scope='method'] { - background: color-mix(in srgb, #f2b100 14%, #fff); -} -:root:not(.no-code-scopes) .palette-item[data-scope='loop'] { - background: color-mix(in srgb, #ec5fa6 14%, #fff); -} -:root:not(.no-code-scopes) .palette-item[data-scope='if'] { - background: color-mix(in srgb, #3b9cf0 14%, #fff); -} -/* Ausgewähltes Element: Rahmen in der Akzentfarbe über den Blöcken */ -.livecode-editor .cm-scopeLayer .cm-scope-sel { - background: transparent; - border: 2px solid var(--accent); - box-shadow: 0 0 0 3px var(--accent-faint); -} -/* Debugger: nächste Zeile gelb, Haltepunkte als rote Punkte vor der Zeilennummer */ -.livecode-editor .cm-line.cm-debug-line { - background: rgba(255, 214, 10, 0.35); - border-inline-start-color: #e0a800; -} -.livecode-editor .cm-breakpoint-gutter .cm-gutterElement, -.livecode-editor .cm-lineNumbers .cm-gutterElement { - cursor: pointer; -} -.livecode-editor .cm-breakpoint-gutter .cm-gutterElement { - display: flex; - align-items: center; - justify-content: center; - width: 14px; - padding-inline-start: 4px; -} -/* Fehler: rote Zeilennummer (der Haltepunkt bleibt der runde Punkt) */ -.livecode-editor .cm-lineNumbers .cm-gutterElement.cm-error-line { - color: #fff; - background: #d33; - border-radius: 4px; - font-weight: 600; -} -.livecode-editor .cm-breakpoint { - display: inline-block; - width: 10px; - height: 10px; - border-radius: 50%; - background: #d33; -} -.livecode-editor .cm-breakpoint-gutter .cm-gutterElement:not(:has(.cm-breakpoint)):hover::before { - content: ''; - width: 10px; - height: 10px; - border-radius: 50%; - background: rgba(221, 51, 51, 0.3); -} -.livecode-debug { - flex: none; - max-height: 30%; - overflow-y: auto; -} -.livecode-debug[hidden] { - display: none; -} -.livecode-debug h2 { - margin: 0 0 4px; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); -} -.livecode-vars tr.changed td { - animation: var-changed 1.6s ease-out; - font-weight: 700; -} -@keyframes var-changed { - from { - background: rgba(255, 214, 10, 0.7); - } - to { - background: transparent; - } -} -.livecode-editor .cm-ph, -.livecode-editor .cm-ph * { - color: var(--muted) !important; - font-style: italic; - font-weight: normal !important; -} -.livecode-editor .cm-quickfix { - margin-inline-start: 8px; - padding: 0 3px; - border: 1px solid #e0a800; - border-radius: 4px; - background: rgba(255, 214, 10, 0.25); - font-size: 12px; - line-height: 1.3; - cursor: pointer; -} -.livecode-editor .cm-quickfix:hover { - background: rgba(255, 214, 10, 0.55); -} -.livecode-editor .cm-err { - text-decoration: underline wavy #d33; - text-decoration-skip-ink: none; - text-underline-offset: 3px; -} -.livecode-editor .cm-selectionBackground, -.livecode-editor .cm-focused .cm-selectionBackground { - background: color-mix(in srgb, var(--accent) 25%, transparent) !important; -} -.livecode-editor .cm-matchingBracket { - background: color-mix(in srgb, var(--accent) 20%, transparent); - outline: 1px solid color-mix(in srgb, var(--accent) 50%, transparent); -} -/* Vorschläge: groß genug für Finger auf dem Tablet */ -.cm-tooltip.cm-tooltip-autocomplete { - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); - overflow: hidden; -} -.cm-tooltip.cm-tooltip-autocomplete > ul { - font: 14px/1.4 ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - max-height: 16em; -} -.cm-tooltip.cm-tooltip-autocomplete > ul > li { - padding: 4px 10px; -} -.cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected] { - background: var(--accent); - color: white; -} -.cm-tooltip-autocomplete .cm-completionDetail { - margin-inline-start: 12px; - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - font-style: normal; - color: var(--muted); -} -.cm-tooltip-autocomplete li[aria-selected] .cm-completionDetail { - color: rgba(255, 255, 255, 0.85); -} -.livecode-run { - padding: 3px 10px; - font-size: 13px; - margin-inline-start: 6px; -} -/* Konsole in Code live unter dem Code: Ausgaben, Eingabefeld, Ende oder Fehler. */ -.console { - display: flex; - flex: none; - flex-direction: column; - gap: 6px; - height: 180px; - min-height: 80px; - padding: 6px 10px 8px; - background: var(--bg); - border: 1px solid var(--border); - border-radius: 8px; -} -.console[hidden], -.console-resizer[hidden] { - display: none; -} -.console-head { - display: flex; - align-items: center; - gap: 8px; -} -.console-head h2 { - margin: 0; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); -} -.console-hide { - margin-inline-start: auto; - padding: 0 8px; - font-size: 14px; -} -.console-resizer { - flex: none; - height: 10px; - margin-block: -5px; - cursor: row-resize; - touch-action: none; - position: relative; -} -.console-resizer::after { - content: ''; - position: absolute; - inset-inline: 0; - top: 4px; - height: 2px; -} -.console-resizer:hover::after, -.console-resizer:focus-visible::after, -.console-resizer.dragging::after { - background: var(--accent); -} -.console-resizer:focus-visible { - outline: none; -} -.livecode-console-lines { - flex: 1; - min-height: 0; - overflow: auto; - font-size: var(--code-size, 14px); - white-space: pre-wrap; -} -.livecode-console-lines .typed { - color: var(--accent); -} -/* Simulation wartet auf eine Eingabe (im Simulationsbereich). */ -.livecode-console-lines .pending::after { - content: '▌'; - color: var(--accent); - animation: blink 1s steps(1) infinite; -} -@keyframes blink { - 50% { - opacity: 0; - } -} -.livecode-console-input { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 6px; -} -.livecode-console-input[hidden] { - display: none; -} -.livecode-console-input label { - display: flex; - flex: 1; - align-items: center; - gap: 6px; - min-width: 0; - font-size: var(--code-size, 14px); -} -.livecode-console-input input { - flex: 1; - min-width: 60px; - padding: 4px 8px; - font: inherit; -} -.livecode-console-error, -.livecode-console-notice { - margin: 0; - font-size: 13px; - color: var(--muted); -} -.livecode-console-error { - flex-basis: 100%; - color: #c62828; -} -.livecode-console-notice.error { - color: #c62828; -} -.livecode-problem { - margin: 0; - min-height: 1.4em; - font-size: 13px; - color: #c62828; -} -.live-resizer { - display: none; - flex: none; - width: 10px; - margin-inline: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.shell.live .live-resizer { - display: block; -} -.live-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.live-resizer:hover::after, -.live-resizer:focus-visible::after, -.shell.resizing .live-resizer::after { - background: var(--accent); -} -.live-resizer:focus-visible { - outline: none; -} -@media (max-width: 1100px) { - .livecode { - width: 340px; - } -} - -/* Erst auf dem Handy untereinander; auf dem iPad hochkant bleibt der Lernbereich daneben. */ -@media (max-width: 700px) { - .shell.learning .learn-resizer, - .shell.live .live-resizer { - display: none; - } - .shell.files-open .files-resizer { - display: none; - } - .shell .files { - width: auto !important; - max-height: 40vh; - border-inline-end: none; - border-bottom: 1px solid var(--border); - } - .shell .learn, - .shell .livecode, - .columns > .app { - width: auto !important; - min-width: 0; - } - .livecode { - height: 40vh; - height: 40dvh; - border-inline-start: none; - border-top: 1px solid var(--border); - } - .learn-rail { - flex-direction: row; - justify-content: center; - width: auto; - padding: 4px 0; - border-inline-end: none; - border-bottom: 1px solid var(--border); - } - .learn-rail span { - writing-mode: horizontal-tb; - } - .live-rail { - border-inline-start: none; - border-bottom: none; - border-top: 1px solid var(--border); - } - .columns { - flex-direction: column; - } - .editor-rail { - border-inline-start: none; - border-bottom: 1px solid var(--border); - } - .learn { - width: auto; - height: 45vh; - height: 45dvh; - border-inline-end: none; - border-bottom: 1px solid var(--border); - } - .columns > .app, - .shell.editor-hidden .livecode { - flex: 1; - min-height: 0; - height: auto; - } -} - -@media print { - @page { - margin: 12mm; - } - body > *:not(.print-sheet) { - display: none !important; - } - body { - background: white !important; - } - .print-sheet { - display: block; - } - .print-sheet svg { - display: block; - width: 100%; - height: auto; - max-height: 100vh; - } -} -/* Fachbegriffe im Lernbereich: Erklärung beim Hovern, Antippen oder mit der Tastatur */ -.learn .term { - text-decoration: underline dotted var(--accent); - text-decoration-thickness: 2px; - text-underline-offset: 3px; - cursor: help; - border-radius: 3px; -} -.learn .term:focus-visible, -.learn .term[aria-expanded='true'] { - outline: none; - background: var(--accent-soft); -} -.term-tip { - position: fixed; - z-index: 1000; - max-width: min(300px, calc(100vw - 16px)); - padding: 8px 10px; - background: var(--panel); - color: var(--text); - border: 1px solid var(--border); - border-radius: 8px; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18); - font-size: 14px; - line-height: 1.4; -} -.term-tip[hidden] { - display: none; -} -/* Zeiger aus dem Lernbereich auf einen Bereich des Editors */ -.learn .ui-pointer { - color: var(--accent); - font-weight: 600; - border-bottom: 2px solid var(--accent-soft); - cursor: pointer; - border-radius: 3px; -} -.learn .ui-pointer:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 1px; -} -.ui-spot { - outline: 3px solid var(--accent) !important; - outline-offset: -3px; - box-shadow: inset 0 0 0 9999px var(--accent-faint); - animation: ui-spot-pulse 1.2s ease-in-out infinite; -} -@keyframes ui-spot-pulse { - 50% { - outline-color: var(--accent-glow); - } -} -@media (prefers-reduced-motion: reduce) { - .ui-spot { - animation: none; - } -} -/* Erklärgrafiken und Tabellen in Lektionen */ -.learn-graphic { - display: block; - width: 100%; - max-width: 440px; - height: auto; - margin: 0 auto; - border-radius: 8px; - border: 1px solid var(--border); -} -.learn-animation { - background: #fff; - overflow: hidden; -} -.learn-animation > svg { - display: block; - width: 100%; - height: auto; -} -.learn-replay { - justify-self: center; -} -.learn-graphic-toggle { - display: block; - width: 100%; - padding: 0; - border: 0; - background: none; - cursor: zoom-in; -} -.learn-graphic-toggle[aria-pressed='true'] { - cursor: zoom-out; -} -.learn-graphic-hint { - margin: 4px 0 0; - text-align: center; - font-size: 0.85em; - color: var(--muted); -} -.lesson-table { - overflow-x: auto; - margin: 8px 0; -} -.lesson-table table { - border-collapse: collapse; - font-size: 13px; - font-variant-numeric: tabular-nums; -} -.lesson-table th, -.lesson-table td { - border: 1px solid var(--border); - padding: 3px 8px; - text-align: start; - white-space: nowrap; -} -.lesson-table th { - background: var(--bg); -} - -.learn-hints .lesson-note { - margin-top: 8px; -} - -.learn-teacher { - margin-top: 24px; - border-top: 1px solid var(--border); - padding-top: 12px; -} - -.learn-teacher summary { - cursor: pointer; - color: var(--muted); -} - -.learn-teacher input { - flex: 1; - min-width: 0; -} -.shell.editor-hidden:not(.live):not(.learning) .files { - flex: 1 1 0; - width: auto !important; -} - -/* Swing-Fenster aus echtem Java (CheerpJ) über der Konsole. */ -.livecode-swing { - height: 380px; -} -.livecode-swing[hidden] { - display: none; -} -.livecode-swing-display { - position: relative; - flex: 1; - min-height: 0; - overflow: hidden; - border-radius: 6px; - background: #e9ecf0; -} - -/* Caesar-Scheibe im Lernbereich: außen Klartext (fest), innen Geheimtext (drehbar) */ -.learn-caesar-stage { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; -} -.learn-caesar-disc { - width: min(100%, 320px); - touch-action: none; - user-select: none; - -webkit-user-select: none; -} -.learn-caesar-disc text { - font: 600 19px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.learn-caesar-disc .outer-disc { - fill: #f3e6c8; - stroke: #8a6d3b; - stroke-width: 3; -} -.learn-caesar-disc .outer-letters text { - fill: #3d2f14; - cursor: pointer; -} -.learn-caesar-disc .inner { - cursor: grab; - transition: transform 0.25s ease; -} -.learn-caesar-disc .inner.dragging { - cursor: grabbing; - transition: none; -} -.learn-caesar-disc .inner-disc { - fill: #6b4f2a; - stroke: #3d2f14; - stroke-width: 2; -} -.learn-caesar-disc .inner-letters text { - fill: #fff8e8; -} -.learn-caesar-disc .tick { - stroke: #8a6d3b; - stroke-width: 1; - opacity: 0.6; -} -.learn-caesar-disc .hub { - fill: #f3e6c8; - stroke: #3d2f14; - stroke-width: 2; -} -.learn-caesar-disc .window { - fill: var(--accent-soft); - stroke: var(--accent); - stroke-width: 2.5; -} -.learn-caesar-disc .marked text { - fill: var(--accent); - font-size: 23px; -} -.learn-caesar-disc .inner-letters .marked text { - fill: #ffd54a; -} -.learn-caesar-disc .key { - font-size: 40px; - font-weight: 700; - fill: #3d2f14; -} -.learn-caesar-disc .key-label { - font-size: 15px; - fill: #6e5a33; -} -.learn-caesar-controls, -.learn-caesar-mode { - display: flex; - justify-content: center; - gap: 8px; -} -.learn-caesar-controls button { - min-width: 56px; - font-size: 1.05em; -} -.learn-caesar-mode { - margin: 10px 0 6px; -} -.learn-caesar-mode button.active { - background: var(--accent); - border-color: var(--accent); - color: #fff; -} -.learn-caesar-fields { - display: grid; - gap: 8px; -} -.learn-caesar-fields label, -.learn-caesar-fields > div { - display: grid; - gap: 3px; - color: var(--muted); - font-size: 0.9em; -} -.learn-caesar-fields input, -.learn-caesar-output { - font: 600 1.15em ui-monospace, Menlo, Consolas, monospace; - letter-spacing: 0.08em; - padding: 6px 8px; - border: 1px solid var(--border); - border-radius: 8px; - color: var(--text); - background: var(--panel); - overflow-wrap: anywhere; -} -.learn-caesar-output { - background: var(--bg); -} -/* Prinzessin retten: Weg zum Turm, Alphabet mit Indizes, Kreuzworträtsel */ -.learn-rescue-path { - display: flex; - align-items: center; - gap: 6px; - margin: 8px 0 2px; -} -.learn-rescue-ludwig { - width: 32px; - height: 32px; - border-radius: 50%; - flex: none; -} -.learn-rescue-dot { - flex: 1; - height: 6px; - max-width: 48px; - border-radius: 3px; - background: var(--border); - transition: background 0.3s; -} -.learn-rescue-dot.done { - background: #15803d; -} -.learn-rescue-tower { - position: relative; - font-size: 34px; - line-height: 1; - margin-inline-start: auto; -} -.learn-rescue-zora, -.learn-rescue-fox { - position: absolute; - font-size: 15px; -} -.learn-rescue-zora { - top: -4px; - left: 50%; - transform: translateX(-50%); -} -.learn-rescue-fox { - bottom: -2px; - right: -12px; - transition: transform 0.8s, opacity 0.8s; -} -.learn-rescue.freed .learn-rescue-fox { - transform: translateX(60px); - opacity: 0; -} -.learn-rescue.freed .learn-rescue-zora { - display: none; -} -.learn-rescue-free { - font-size: 24px; - line-height: 1; - animation: learn-rescue-jump 0.6s ease-out 3; -} -@keyframes learn-rescue-jump { - 50% { transform: translateY(-12px); } -} -.learn-rescue-answer { - display: flex; - gap: 8px; - align-items: center; -} -.learn-rescue-number { - width: 6ch; - font-size: 1.1em; - padding: 6px 8px; - text-align: center; -} -.learn-rescue-label { - margin: 14px 0 4px; - color: var(--muted); - font-size: 0.9em; -} -.learn-rescue-alphabet { - display: flex; - flex-wrap: wrap; - gap: 2px; - margin-bottom: 12px; -} -.learn-rescue-letter { - display: inline-flex; - flex-direction: column; - align-items: center; - min-width: 22px; - padding: 2px 0; - border-radius: 4px; - background: var(--bg); -} -.learn-rescue-letter small { - font-size: 10px; - color: var(--muted); -} -.learn-rescue-letter.hit { - background: #fde68a; - outline: 2px solid #d97706; -} -.learn-rescue-charat { - font-weight: 600; -} -.learn-rescue-moved { - font-weight: 400 !important; -} -.learn-rescue-word { - font: inherit; - padding: 1px 4px; - border: 1px solid var(--accent); - border-radius: 4px; -} -.learn-rescue-gate { - padding: 8px 0; - margin-bottom: 8px; -} -.learn-cw { - --cw-cell: 30px; - display: flex; - flex-wrap: wrap; - gap: 12px 20px; - margin-bottom: 10px; -} -.learn-cw-grid { - display: grid; - gap: 2px; -} -.learn-cw-cell { - position: relative; - width: var(--cw-cell); - height: var(--cw-cell); -} -.learn-cw-cell input { - width: 100%; - height: 100%; - box-sizing: border-box; - padding: 0; - border: 1px solid #6e6e73; - border-radius: 3px; - background: #fff; - color: #1c1c1e; - text-align: center; - font: 600 16px/1 ui-monospace, SFMono-Regular, Menlo, monospace; - text-transform: uppercase; -} -.learn-cw-cell input:disabled { - opacity: 1; - -webkit-text-fill-color: #1c1c1e; -} -.learn-cw-cell.key input { - background: #fde68a; -} -.learn-cw-cell.given input { - color: #1d4ed8; - -webkit-text-fill-color: #1d4ed8; -} -.learn-cw-cell.arrived input { - animation: learn-cw-arrive 0.6s ease-out; -} -.learn-cw-cell input.wrong { - border-color: #b91c1c; - background: #fee2e2; -} -@keyframes learn-cw-arrive { - from { transform: scale(1.6); } -} -.learn-cw-number, -.learn-cw-keyindex { - position: absolute; - font-size: 8px; - line-height: 1; - pointer-events: none; - color: #6e6e73; - z-index: 1; -} -.learn-cw-number { - top: 2px; - left: 2px; -} -.learn-cw-keyindex { - bottom: 2px; - right: 2px; - color: #b45309; -} -.learn-cw-keyword { - margin: 8px 0 0; - font-weight: 600; -} -.learn-cw-keybox { - display: inline-block; - width: 22px; - height: 24px; - margin-inline-end: 2px; - border-bottom: 2px solid #d97706; - background: #fef3c7; - text-align: center; - line-height: 24px; - white-space: pre; -} -.learn-cw-cluebox { - flex: 1; - min-width: 200px; -} -.learn-cw-clues { - margin: 4px 0 10px; - padding-inline-start: 24px; -} -.learn-cw-clues li { - cursor: pointer; -} -@media (max-width: 380px) { - .learn-cw { - --cw-cell: 28px; - } -} -/* Lückentext: fertiger Code mit Eingabefeldern für die fehlenden Wörter */ -.learn-cloze { - border: 2px solid var(--accent); - border-radius: 12px; - padding: 12px 14px; - margin: 0 0 14px; -} -.learn-cloze-title { - display: block; - font-size: 1.05em; - margin-bottom: 4px; -} -.learn-cloze p { - margin: 0 0 8px; -} -.learn-cloze-hint { - color: var(--muted); - font-size: 0.9em; -} -.learn-cloze-code { - margin: 0 0 10px; - padding: 8px 10px; - border-radius: 8px; - background: var(--bg, #f2f2f7); - font-size: 13px; - line-height: 1.9; - overflow-x: auto; -} -.learn-cloze-code .ln { - white-space: pre; - min-height: 1.9em; -} -.learn-cloze-gap { - font-size: 13px; - padding: 1px 3px; - margin: 0 1px; - min-width: 0; - max-width: none; - border: 1px solid #8e8e93; - border-bottom-width: 2px; - border-radius: 4px; - background: #fff; - color: #1c1c1e; - text-align: center; -} -.learn-cloze-gap.right { - border-color: #34c759; - background: rgba(52, 199, 89, 0.14); -} -.learn-cloze-gap.wrong { - border-color: #ff3b30; - background: rgba(255, 59, 48, 0.1); -} -.learn-cloze-gap.shown { - border-color: #d97706; - background: #fef3c7; -} -.learn-cloze-gap:disabled { - opacity: 1; - -webkit-text-fill-color: currentColor; -} -.learn-cloze-actions { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-bottom: 8px; -} -.learn-cloze-check { - font-weight: 600; -} -.learn-cloze-status:empty { - display: none; -} -.learn-cloze-status { - padding: 8px 12px; - border-radius: 8px; - font-weight: 600; -} -.learn-cloze-status.right { - background: #dcfce7; -} -.learn-cloze-status.wrong { - background: #fee2e2; -} -/* PAP bauen: Plan mit leeren Plätzen, darunter die fertigen Elemente */ -.learn-pap { - border: 2px solid var(--accent); - border-radius: 12px; - padding: 12px 14px; - margin: 0 0 14px; -} -.learn-pap-title { - display: block; - font-size: 1.05em; - margin-bottom: 4px; -} -.learn-pap p { - margin: 0 0 8px; -} -.learn-pap-hint { - color: var(--muted); - font-size: 0.9em; -} -.learn-pap-plan { - display: block; - width: 100%; - max-width: 420px; - margin: 0 auto 10px; - background: #fff; - border-radius: 8px; - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - fill: #1c1c1e; -} -.learn-pap-slot { - cursor: pointer; - outline: none; -} -.learn-pap-slot .learn-pap-shape { - stroke: #8e8e93; - stroke-width: 2; -} -.learn-pap-slot:focus-visible .learn-pap-shape, -.learn-pap-slot.over .learn-pap-shape { - stroke: var(--accent); - stroke-width: 3; -} -.learn-pap-slot.right .learn-pap-shape { - stroke: #34c759; - stroke-width: 3; -} -.learn-pap-slot.wrong .learn-pap-shape { - stroke: #ff3b30; - stroke-width: 3; -} -.learn-pap-slot.shown .learn-pap-shape { - stroke: #d97706; -} -.learn-pap-legend { - display: grid; - grid-template-columns: auto 1fr; - gap: 4px 10px; - align-items: center; - max-width: 420px; - margin: 0 auto 12px; - padding: 8px 10px; - border-radius: 8px; - background: var(--bg, #f2f2f7); - font-size: 0.9em; -} -.learn-pap-legend dt { - line-height: 0; -} -.learn-pap-legend dd { - margin: 0; -} -.learn-pap-work { - display: grid; - grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); - gap: 8px; - align-items: start; - margin-bottom: 10px; -} -.learn-pap-work.done { - grid-template-columns: minmax(0, 1fr); -} -.learn-pap-left .learn-pap-plan { - margin-bottom: 8px; -} -.learn-pap-tray { - position: sticky; - top: 0; - display: flex; - flex-direction: column; - align-items: center; - gap: 4px; - max-height: 100vh; - overflow-y: auto; - padding: 6px 2px; - border-radius: 8px; - background: var(--bg, #f2f2f7); -} -.learn-pap-tray:empty, -.learn-pap-tray:not(:has(.learn-pap-card:not([hidden]))) { - display: none; -} -.learn-pap-card svg { - max-width: 100%; - height: auto; -} -.learn-pap-card { - padding: 2px; - max-width: 100%; - border: 2px solid transparent; - border-radius: 10px; - background: none; - line-height: 0; - touch-action: none; - cursor: grab; - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - fill: #1c1c1e; -} -.learn-pap-card.selected { - border-color: var(--accent); - background: var(--accent-soft); -} -.learn-pap-card.dragging { - opacity: 0.3; -} -.learn-pap-ghost { - position: fixed; - z-index: 1000; - pointer-events: none; - transform: translate(-50%, -50%); - opacity: 0.9; -} -.learn-pap-actions { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-bottom: 8px; -} -.learn-pap-check { - font-weight: 600; -} -.learn-pap-status:empty { - display: none; -} -.learn-pap-status { - padding: 8px 12px; - border-radius: 8px; - font-weight: 600; -} -.learn-pap-status.right { - background: #dcfce7; -} -.learn-pap-status.wrong { - background: #fee2e2; -} -/* Farbige Markierung im Text, passend zu farbigen Kästen in Lektion 1 (gelb, blau, rosa wie „Blöcke farbig“) */ -.learn-mark { - color: inherit; - padding: 0 3px; - border-radius: 3px; -} -.learn-mark.blau { - background: #e4f1fd; -} -.learn-mark.orange { - background: #ffedd5; -} -.learn-mark.gruen { - background: #dcfce7; -} -.learn-mark.gelb { - background: #fdf4db; -} -.learn-mark.rosa { - background: #fce9f2; -} - -/* Hinweis statt leerer Seite, wenn die App nicht starten konnte (main.ts) */ -.startup-error { - max-width: 520px; - margin: 15vh auto 0; - padding: 0 16px; - font: 16px/1.5 system-ui, -apple-system, sans-serif; - color: var(--text); -} -.startup-error h1 { - font-size: 22px; -} -.startup-error button { - font-size: 16px; - padding: 8px 16px; -} -.startup-error pre { - margin-top: 24px; - color: var(--muted); - font-size: 12px; - white-space: pre-wrap; -} - -/* VisuBot: Welt mit dem mBot2 im Simulationspanel, zusätzliche Elemente in der Palette */ -.visubot-stage { - position: relative; - height: 280px; - border: 1px solid var(--border); - border-radius: 8px; - overflow: hidden; - background: linear-gradient(#dfe9f3, #f6f3ec); -} -.visubot-live { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 8px; - margin: 0 0 8px; - font-size: 12px; - color: var(--muted); -} -.visubot-live:empty { - display: none; -} -.visubot-live.connected { - color: #0f8a5f; - font-weight: 600; -} -.visubot-worlds { - display: flex; - gap: 6px; - margin: 0 0 6px; -} -.visubot-worlds button.active { - background: var(--accent); - border-color: var(--accent); - color: white; -} -.visubot-canvas { - display: block; - width: 100%; - height: 100%; - touch-action: none; -} -.visubot-status { - font-size: 12px; - color: var(--muted); - margin: 6px 0 0; -} -.visubot-controls { - margin-top: 8px; - font-size: 13px; -} -.visubot-controls summary { - cursor: pointer; - font-weight: 600; -} -.visubot-controls .hint { - color: var(--muted); - font-size: 12px; - margin: 4px 0 6px; -} -.visubot-controls label { - display: grid; - grid-template-columns: 9.5em 1fr 2.5em; - align-items: center; - gap: 6px; - margin: 2px 0; -} -.visubot-controls output { - text-align: end; - font-variant-numeric: tabular-nums; -} -.visubot-presses { - display: flex; - flex-wrap: wrap; - gap: 4px; - margin-top: 6px; -} -.visubot-presses button { - min-width: 2.2em; -} -.visubot-presses button.pressed { - background: var(--accent); - border-color: var(--accent); - color: #fff; -} -.visubot-check { - margin-top: 8px; - font-size: 13px; -} -.visubot-check summary { - cursor: pointer; - font-weight: 600; -} -.visubot-check .hint { - color: var(--muted); - font-size: 12px; - margin: 4px 0 6px; -} -.visubot-check-sensors { - margin-top: 8px; - border-collapse: collapse; - font-variant-numeric: tabular-nums; -} -.visubot-check-sensors th { - text-align: start; - font-weight: normal; - padding: 1px 12px 1px 0; -} -.palette-visubot-title { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--muted); - margin: 14px 0 6px; -} -.palette-sensor { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 2px; - border-style: dashed; -} -.palette-sensor code { - font-size: 12px; - color: var(--muted); -} -.palette-visubot .palette-item { - border-color: #a7a0d3; - background: color-mix(in srgb, #a7a0d3 16%, transparent); -} -.visubot-model { - margin: 12px 0; -} -.visubot-model .visubot-stage { - height: 300px; -} -.visubot-model-hint { - font-size: 13px; - margin: 4px 0 0; -} -.visubot-part-label { - position: absolute; - pointer-events: none; - padding: 2px 8px; - border-radius: 6px; - background: rgba(20, 24, 30, 0.85); - color: white; - font-size: 13px; - white-space: nowrap; - z-index: 1; -} -/* Wörter im Text, die auf ein Teil des mBot2 zeigen (wie bei JavaPicoGoat gelb unterstrichen) */ -.robot-part-link { - text-decoration: underline 2px #f2b705; - text-underline-offset: 3px; - cursor: pointer; -} -.robot-part-link:hover, -.robot-part-link:focus-visible { - background: color-mix(in srgb, #f2b705 25%, transparent); - outline: none; -} -.visubot-quiz-question { - font-size: 15px; - margin: 12px 0 6px; -} -.visubot-quiz-question.done { - color: var(--success, #2f9e44); -} -.visubot-quiz-feedback { - min-height: 1.4em; - margin: 6px 0; -} -.visubot-quiz-feedback.right { - color: var(--success, #2f9e44); -} -.visubot-quiz-feedback.wrong { - color: var(--danger, #c92a2a); -} - -/* Echter mBot2: Knopf neben „Simulation starten“ und in den Einstellungen */ -.diagram-tools .mbot-link { - margin-inline-start: auto; - height: 30px; - padding: 0 10px; - white-space: nowrap; -} -.diagram-tools .mbot-link:not([hidden]) + .sim-toggle, -.diagram-tools .mbot-upload:not([hidden]) + .sim-toggle { - margin-inline-start: 6px; -} -.diagram-tools .mbot-upload { - margin-inline-start: 6px; - height: 30px; - padding: 0 10px; - white-space: nowrap; -} -/* Übertragen auf den mBot2 */ -.mbot-upload-steps { - margin: 0 0 12px; - padding-inline-start: 22px; - line-height: 1.5; -} -.mbot-upload progress { - width: 100%; - height: 10px; -} -.mbot-upload-status.done { - color: var(--success, #2f9e44); - font-weight: 600; -} -.settings-mbot-link { - display: grid; - gap: 4px; - margin-top: 8px; -} -.settings-mbot-link[hidden] { - display: none; -} -.settings-mbot-link small { - font-size: 12px; - color: var(--muted); -} -/* VisuStruct oder VisuBot (Zahnrad und Start-Dialog) */ -.world-chooser { - margin-bottom: 4px; -} -/* Vier Welten: zwei Reihen mit je zwei Knöpfen, damit sie ins Zahnrad-Menü passen. */ -.segmented.world-chooser { - display: grid; - grid-template-columns: 1fr 1fr; -} -.segmented.world-chooser button { - border-radius: 0; - border-inline-start: 1px solid var(--border); -} -.segmented.world-chooser button:nth-child(even) { - border-inline-start: none; -} -.segmented.world-chooser button:nth-child(n + 3) { - border-top: none; -} -.segmented.world-chooser button:first-child { - border-start-start-radius: 8px; -} -.segmented.world-chooser button:nth-child(2) { - border-start-end-radius: 8px; -} -.segmented.world-chooser button:nth-last-child(2) { - border-end-start-radius: 8px; -} -.segmented.world-chooser button:last-child { - border-end-end-radius: 8px; -} -.segmented.world-chooser button[aria-pressed='true'] { - border-color: var(--accent); -} -.world-hint { - display: block; - font-size: 12px; - color: var(--muted); - margin-bottom: 8px; -} -.start-world { - margin-bottom: 14px; -} -/* Start-Dialog auf einer Welt-Subdomain: oben der Name der Welt */ -.start-brand { - display: flex; - align-items: center; - gap: 6px; - font-size: 22px; - font-weight: 700; - margin: 0 0 12px; -} -/* „Struct“ im Verlauf wie auf visucode.de (MARKE.md: Blau → Violett) */ -.visustruct-struct { - color: #4f46e5; - background: linear-gradient(90deg, #2563eb, #7c3aed); - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; -} -/* Auf einer Welt-Subdomain statt der Welt-Frage: Marke „VisuCode“ als Link auf visucode.de */ -.visucode-more { - margin: 6px 0 8px; -} -.visucode-more small { - display: block; - font-size: 12px; - color: var(--muted); -} -/* Schriftzug wie auf visucode.de (MARKE.md): „Visu“ in Textfarbe, „Code“ im Verlauf durch alle Produktfarben */ -.visucode-brand { - font-weight: 800; - font-size: 16px; - letter-spacing: -0.01em; - color: var(--text); - text-decoration: none; -} -.visucode-brand span { - color: #7c3aed; - background: linear-gradient(90deg, #2563eb, #c026d3, #e11d48, #ea580c, #eab308, #84cc16, #16a34a, #0f766e, #0284c7); - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; -} -.visucode-more .visucode-credit { - margin-top: 4px; -} -.visucode-more small a { - color: inherit; -} -.visucode-brand:hover { - text-decoration: underline; -} - -/* VisuBot: „mBot2 live“ als eigene Spalte ganz rechts oder unten in „Programmieren“. */ -.robotpreview, -.robotpreview-rail, -.preview-resizer { - display: none; -} -.shell.robot-world.preview .robotpreview { - display: flex; -} -.shell.robot-world:not(.preview) .robotpreview-rail { - display: flex; - border-inline-end: none; - border-inline-start: 1px solid var(--border); -} -.robotpreview-rail svg { - transform: scaleX(-1); -} -.shell.robot-world.preview:not(.preview-stacked) .preview-resizer { - display: block; -} -.robotpreview { - flex: 0 1 auto; - width: 360px; - min-width: 220px; - flex-direction: column; - gap: 6px; - padding: 10px 12px 12px; - background: var(--panel); - border-inline-start: 1px solid var(--border); - min-height: 0; - overflow-y: auto; -} -.robotpreview .hint { - margin: 0; - font-size: 0.85em; - color: var(--muted, inherit); -} -.robotpreview .robotpreview-stage { - flex: 1 1 auto; - height: auto; - min-height: 160px; -} -.robotpreview .robotpreview-status { - margin: 0; - min-height: 1.3em; -} -.robotpreview-height { - display: none; -} -/* Während der Simulation fährt hier deren mBot2 (Welten, 3D-Ansicht und Messwerte aus dem Simulationspanel). */ -.robotpreview.simulation > .visubot-worlds, -.robotpreview.simulation > .robotpreview-stage, -.robotpreview.simulation > .robotpreview-status, -.robotpreview.simulation .robotpreview-play { - display: none; -} -.robotpreview .visubot-viewport { - display: flex; - flex: 1 1 auto; - flex-direction: column; - min-height: 0; -} -.robotpreview .visubot-viewport .visubot-stage { - flex: 1 1 auto; - height: auto; - min-height: 160px; -} -.visubot-elsewhere { - display: none; - margin: 0 0 8px; - font-size: 12px; - color: var(--muted); -} -.visubot:not(:has(> .visubot-viewport)) .visubot-elsewhere { - display: block; -} -/* Unter dem Code: volle Breite der Spalte, Höhe an der Linie darüber verschieben. */ -.shell.preview-stacked .robotpreview { - flex: 0 0 auto; - width: auto !important; - height: 320px; - min-width: 0; - margin: 4px -12px -12px; - padding-top: 0; - border-inline-start: none; - border-top: 1px solid var(--border); - overflow: visible; -} -.shell.preview-stacked .robotpreview-height { - display: block; - height: 10px; - margin: -5px 0 0; - cursor: row-resize; - touch-action: none; - position: relative; -} -.robotpreview-height::after { - content: ''; - position: absolute; - inset-inline: 0; - top: 4px; - height: 2px; - background: transparent; - transition: background 0.15s; -} -.robotpreview-height:hover::after, -.robotpreview-height:focus-visible::after, -.shell.resizing .robotpreview-height::after { - background: var(--accent); -} -.robotpreview-height:focus-visible { - outline: none; -} -.preview-resizer { - flex: none; - width: 10px; - margin-inline: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.preview-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.preview-resizer:hover::after, -.preview-resizer:focus-visible::after, -.shell.resizing .preview-resizer::after { - background: var(--accent); -} -.preview-resizer:focus-visible { - outline: none; -} - -/* mBot2-Elemente: Gruppen wie im Nachschlagen, auf- und zuklappbar */ -.palette-group { - grid-column: 1 / -1; -} -.palette-group button { - display: flex; - align-items: center; - gap: 6px; - width: 100%; - margin-top: 4px; - padding: 2px 0; - border: none; - background: none; - color: var(--muted); - font-size: 12px; - font-weight: 600; - text-align: start; - cursor: pointer; -} -.palette-group button::before { - content: '▾'; - transition: transform 0.15s; -} -.palette-group button[aria-expanded='false']::before { - transform: rotate(-90deg); -} -.palette-item[hidden] { - display: none; -} - -/* ⇄ „Programmieren groß“: Code füllt den Platz, das Struktogramm wird schmal (an der Linie dazwischen ziehbar). */ -.editor-resizer { - display: none; - flex: none; - width: 10px; - margin-inline: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.editor-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.editor-resizer:hover::after, -.editor-resizer:focus-visible::after, -.shell.resizing .editor-resizer::after { - background: var(--accent); -} -.editor-resizer:focus-visible { - outline: none; -} -.shell.code-main.live:not(.editor-hidden) .editor-resizer { - display: block; -} -.shell.code-main.live:not(.editor-hidden) .live-resizer { - display: none; -} -.shell.code-main.live:not(.editor-hidden) .app { - flex: 0 1 auto; - width: 460px; - min-width: 300px; -} -.shell.code-main.live:not(.editor-hidden) .livecode { - flex: 1 1 0; - width: auto !important; - min-width: 0; -} -/* ⇄ tauscht auch die Plätze: Programmieren links, Struktogramm rechts daneben, danach mBot2 live. */ -.shell.code-main.live:not(.editor-hidden) .livecode { - order: 1; -} -.shell.code-main.live:not(.editor-hidden) .editor-resizer { - order: 2; -} -.shell.code-main.live:not(.editor-hidden) .app { - order: 3; - border-inline-start: 1px solid var(--border); -} -.shell.code-main.live:not(.editor-hidden) .live-rail, -.shell.code-main.live:not(.editor-hidden) .preview-resizer, -.shell.code-main.live:not(.editor-hidden) .robotpreview, -.shell.code-main.live:not(.editor-hidden) .robotpreview-rail { - order: 4; -} -[data-action='swap-main'] { - font-size: 16px; - line-height: 1; -} -[data-action='swap-main'][aria-pressed='true'] { - color: var(--accent); -} - -/* Trennlinie zwischen Elementen und Struktogramm (liegt über dem rechten Rand der Elemente) */ -.palette-resizer { - grid-area: pal; - justify-self: end; - width: 10px; - margin-inline-end: -5px; - z-index: 5; - cursor: col-resize; - touch-action: none; - position: relative; -} -.palette-resizer::after { - content: ''; - position: absolute; - inset-block: 0; - inset-inline-start: 4px; - width: 2px; - background: transparent; - transition: background 0.15s; -} -.palette-resizer:hover::after, -.palette-resizer:focus-visible::after, -.shell.resizing .palette-resizer::after { - background: var(--accent); -} -.palette-resizer:focus-visible { - outline: none; -} -.app.simulating .palette-resizer { - display: none; -} - -/* Welt VisuObject in Petrol: Java-Code links, Klassendiagramm rechts (objectApp.ts) */ -:root.visuobject-theme { - --bg: #edf4f6; - --text: #17292e; - --muted: #566a70; - --border: #cddde1; - --accent: #0e7c86; - --accent-soft: rgba(14, 124, 134, 0.2); - --accent-faint: rgba(14, 124, 134, 0.08); - --accent-glow: rgba(14, 124, 134, 0.35); -} -.visuobject-obj { - color: var(--accent); -} -.visuobject .brand .logo { - color: var(--accent); -} -.shell.visuobject button.text-button { - padding: 5px 10px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); - color: var(--text); - font: inherit; - cursor: pointer; -} -.shell.visuobject button.text-button:hover { - border-color: var(--accent); - color: var(--accent); -} -/* Aufteilung wie in WebGoatCode: flache Bereiche, 1 px Linie dazwischen (objectLayout.ts setzt --vo-cols) */ -:root.visuobject-theme { - --vo-bar: #e3edf0; -} -.vo-columns { - display: grid; - grid-template-columns: var(--vo-cols, 260px 1px minmax(0, 45fr) 1px minmax(0, 55fr)); - flex: 1; - min-height: 0; - border-top: 1px solid var(--border); -} -.vo-columns.vo-resizing { - cursor: col-resize; - user-select: none; -} -.vo-pane { - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; - background: var(--panel); -} -.vo-pane.collapsed > :not(.vo-strip) { - display: none; -} -.vo-strip { - display: none; - flex: 1; - align-items: center; - justify-content: center; - padding: 12px 0; - border: 0; - background: var(--vo-bar); - color: var(--muted); - font: 600 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - writing-mode: vertical-rl; - cursor: pointer; -} -.vo-pane.collapsed > .vo-strip { - display: flex; -} -.vo-strip:hover, -.vo-strip:focus-visible { - color: var(--accent); - background: var(--accent-faint); - outline: none; -} -.vo-splitter { - position: relative; - z-index: 4; - background: var(--border); - cursor: col-resize; - touch-action: none; - outline: none; -} -.vo-splitter::after { - content: ''; - position: absolute; - inset: 0 -4px; -} -.vo-splitter:hover, -.vo-splitter:focus-visible, -.vo-resizing .vo-splitter { - background: var(--accent); -} -.vo-splitter.fixed { - cursor: default; - background: var(--border); -} -/* Kopfleiste jedes Bereichs: links Titel oder Reiter, rechts Knöpfe, ganz rechts – zum Einklappen */ -.vo-bar { - display: flex; - flex-wrap: wrap; - align-items: stretch; - min-height: 40px; - background: var(--vo-bar); - border-bottom: 1px solid var(--border); - font-size: 14px; -} -.vo-bar-title { - display: flex; - flex: 1; - align-items: center; - margin: 0; - text-transform: none; - letter-spacing: normal; - padding: 0 12px; - font-size: 14px; - font-weight: 600; - color: var(--text); -} -.vo-bar-actions { - display: flex; - flex: 0 1 auto; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - gap: 6px; - padding: 4px 4px 4px 0; -} -.shell.visuobject .vo-bar button.text-button { - padding: 2px 8px; - border-radius: 6px; -} -.vo-collapse { - padding: 0 12px; - border: 0; - background: none; - color: var(--muted); - font-size: 16px; - font-weight: 700; - cursor: pointer; -} -.vo-collapse:hover, -.vo-collapse:focus-visible { - color: var(--accent); -} -/* Datei-Reiter wie index.html | style.css */ -.vo-tabs { - display: flex; - flex: 1; - min-width: 0; - overflow-x: auto; -} -.vo-tab { - display: flex; - align-items: stretch; - border-right: 1px solid var(--border); - border-bottom: 3px solid transparent; -} -.vo-tab.active { - background: var(--panel); - border-bottom-color: var(--accent); -} -.vo-tab [role='tab'] { - padding: 0 4px 0 14px; - border: 0; - background: none; - color: var(--text); - font: 13px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - white-space: nowrap; - cursor: pointer; -} -.vo-tab.active [role='tab'] { - font-weight: 700; -} -.vo-tab [role='tab']:hover { - color: var(--accent); -} -.vo-tab-close { - padding: 0 10px 0 6px; - border: 0; - background: none; - color: var(--muted); - font-size: 15px; - cursor: pointer; - visibility: hidden; -} -.vo-tab.active .vo-tab-close, -.vo-tab:hover .vo-tab-close { - visibility: visible; -} -.vo-tab-close:hover { - color: var(--accent); -} -.vo-tab-close .vo-dot, -.vo-tab-close.unsaved .vo-x { - display: none; -} -.vo-tab-close.unsaved { - visibility: visible; - color: var(--text); -} -.vo-tab-close.unsaved .vo-dot { - display: inline; - font-size: 11px; -} -.vo-tab-close.unsaved:hover .vo-dot { - display: none; -} -.vo-tab-close.unsaved:hover .vo-x { - display: inline; -} -.vo-no-file { - display: flex; - align-items: center; - padding: 0 12px; - color: var(--muted); -} -.vo-editor { - flex: 1; - min-height: 0; - overflow: auto; - font-size: 14px; -} -.vo-foot { - display: flex; - flex-wrap: wrap; - align-items: baseline; - gap: 4px 12px; - padding: 6px 12px; - border-top: 1px solid var(--border); - background: var(--vo-bar); -} -.vo-hint { - color: var(--muted); - flex: 1 1 260px; -} -.vo-canvas { - position: relative; - flex: 1; - min-height: 0; - overflow: auto; - background: radial-gradient(circle, var(--border) 1px, transparent 1px) 0 0 / 20px 20px; - outline: none; -} -.vo-frames { - position: absolute; - inset: 0 auto auto 0; - z-index: 0; - pointer-events: none; - overflow: visible; -} -.vo-package-frame { - fill: rgba(14, 124, 134, 0.035); - stroke: var(--muted); - stroke-width: 1.2; -} -.vo-package.current .vo-package-frame { - stroke: var(--accent); - fill: var(--accent-faint); -} -.vo-package-name { - font: 600 12px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - fill: var(--muted); -} -.vo-package.current .vo-package-name { - fill: var(--accent); -} -.vo-lines { - position: absolute; - inset: 0 auto auto 0; - z-index: 3; - pointer-events: none; - overflow: visible; -} -.vo-rel { - stroke: var(--text); - stroke-width: 1.4; - fill: none; -} -.vo-rel.ghost { - stroke: var(--accent); - stroke-dasharray: 4 4; -} -.vo-hit { - stroke: transparent; - stroke-width: 12; - pointer-events: stroke; - cursor: pointer; -} -.vo-relation:hover .vo-rel, -.vo-relation:hover .vo-diamond { - stroke: var(--accent); -} -.vo-relation.selected .vo-rel, -.vo-relation.selected .vo-diamond { - stroke: var(--accent); - stroke-width: 2.4; -} -.vo-relation.selected .vo-label-svg { - fill: var(--accent); -} -.vo-diamond { - fill: var(--panel); - stroke: var(--text); - stroke-width: 1.4; -} -.vo-diamond.filled { - fill: var(--text); -} -.vo-relation.selected .vo-diamond.filled { - fill: var(--accent); -} -.vo-label-svg.name { - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - font-style: italic; - fill: var(--text); -} -.vo-rel.dashed { - stroke-dasharray: 6 4; -} -.vo-hollow { - fill: none; - stroke: var(--text); - stroke-width: 1.4; -} -.vo-open { - fill: none; - stroke: var(--text); - stroke-width: 1.4; -} -.vo-label-svg { - font: 12px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - fill: var(--muted); - paint-order: stroke; - stroke: var(--panel); - stroke-width: 4px; -} -.vo-empty { - margin: 24px; - max-width: 40ch; - color: var(--muted); -} -.vo-status { - margin: 0; - color: #b3261e; -} -.vo-status:empty { - display: none; -} -.vo-status.hint { - color: var(--accent); -} -.uml-class { - position: absolute; - left: 16px; - top: 16px; - min-width: 150px; - background: var(--panel); - border: 1.5px solid var(--text); - font: 13px/1.5 ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - cursor: grab; - user-select: none; - touch-action: none; -} -/* Griff am gewählten Kasten: von hier eine Beziehung ziehen */ -.uml-connect { - position: absolute; - right: -11px; - top: 50%; - width: 20px; - height: 20px; - margin-top: -10px; - padding: 0; - border: 2px solid var(--panel); - border-radius: 50%; - background: var(--accent); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25); - cursor: crosshair; - touch-action: none; -} -.uml-connect::after { - content: ''; - position: absolute; - inset: 5px 4px 5px 5px; - background: #fff; - clip-path: polygon(0 35%, 55% 35%, 55% 0, 100% 50%, 55% 100%, 55% 65%, 0 65%); -} -.uml-class.drop { - border-color: var(--accent); - box-shadow: 0 0 0 4px var(--accent-soft); -} -.vo-relmenu { - position: absolute; - z-index: 10; - display: grid; - min-width: 220px; - padding: 6px; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 10px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18); - font: 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-relmenu p { - margin: 2px 8px 6px; - color: var(--muted); - font-size: 12px; -} -.vo-relmenu button { - display: flex; - align-items: center; - gap: 10px; - padding: 6px 8px; - border: 0; - border-radius: 6px; - background: none; - color: var(--text); - font: inherit; - text-align: left; - cursor: pointer; -} -.vo-relmenu button:hover, -.vo-relmenu button:focus-visible { - background: var(--accent-faint); - color: var(--accent); - outline: none; -} -.vo-relicon { - flex: none; -} -/* Werkzeugleiste über dem Diagramm (wie in Astah): Auswahl, Klasse, Interface, Beziehungen */ -.vo-palette { - display: flex; - flex-wrap: wrap; - align-items: stretch; - gap: 2px; - padding: 4px 6px; - border-bottom: 1px solid var(--border); - background: var(--panel); -} -.vo-palette-sep { - width: 1px; - margin: 4px 4px; - background: var(--border); -} -.vo-tool { - display: grid; - justify-items: center; - gap: 1px; - min-width: 44px; - padding: 3px 3px 2px; - border: 1px solid transparent; - border-radius: 7px; - background: none; - color: var(--text); - font: 11px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - cursor: pointer; - touch-action: none; - user-select: none; -} -.vo-tool:hover { - background: var(--accent-faint); - color: var(--accent); -} -.vo-tool[aria-pressed='true'] { - border-color: var(--accent); - background: var(--accent-soft); - color: var(--accent); -} -.vo-tool[data-tool='class'], -.vo-tool[data-tool='interface'] { - cursor: grab; -} -.vo-tool-ghost { - position: fixed; - z-index: 1000; - display: grid; - justify-items: center; - min-width: 120px; - padding: 4px 10px 14px; - margin: -14px 0 0 -60px; - border: 1.5px dashed var(--accent); - background: rgba(255, 255, 255, 0.9); - font: 13px ui-monospace, 'SF Mono', Menlo, Consolas, monospace; - pointer-events: none; -} -.vo-tool-ghost small { - color: var(--muted); - font-size: 11px; -} -.vo-canvas:not([data-tool='select'])[data-tool] { - cursor: crosshair; -} -.vo-canvas:not([data-tool='select'])[data-tool] .uml-class { - cursor: crosshair; -} -.vo-canvas:not([data-tool='select'])[data-tool] .uml-class:hover, -.uml-class.source { - border-color: var(--accent); -} -.uml-class.source { - box-shadow: 0 0 0 4px var(--accent-soft); -} -/* Objektinspektor rechts im Diagramm */ -.vo-stage { - position: relative; - display: flex; - flex: 1; - min-height: 0; -} -.vo-stage .vo-canvas { - flex: 1; -} -.vo-hsplit { - flex: 0 0 20px; - margin: -10px 0; - position: relative; - z-index: 5; - cursor: row-resize; - touch-action: none; -} -.vo-hsplit::before { - content: ''; - position: absolute; - left: 0; - right: 0; - top: 9px; - height: 2px; - background: transparent; -} -/* Griff in der Mitte: zeigt auf dem Tablet, wo man den Objektinspektor nach oben oder unten wischt. */ -.vo-hsplit::after { - content: ''; - position: absolute; - left: 50%; - top: 7px; - width: 36px; - height: 6px; - margin-left: -18px; - border-radius: 3px; - background: var(--border); -} -.vo-hsplit:hover::before, -.vo-hsplit:focus-visible::before, -.vo-hsplit.dragging::before, -.vo-hsplit:hover::after, -.vo-hsplit:focus-visible::after, -.vo-hsplit.dragging::after { - background: var(--accent); -} -.vo-dock.collapsed + .vo-hsplit::after, -.vo-hsplit:has(+ .vo-dock.collapsed)::after { - display: none; -} -.vo-hsplit:focus-visible { - outline: none; -} -.vo-dock.collapsed + .vo-hsplit, -.vo-hsplit:has(+ .vo-dock.collapsed) { - cursor: default; - pointer-events: none; -} -.vo-dock { - border-top: 1px solid var(--border); - background: var(--panel); -} -.vo-dock-bar { - min-height: 30px; -} -.vo-dock-bar .vo-bar-title { - font-size: 13px; -} -.vo-dock.collapsed .vo-inspector { - display: none; -} -.vo-inspector { - display: grid; - align-content: start; - gap: 8px; - height: 32vh; - overflow: auto; - padding: 8px 12px 10px; - font: 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-inspector-row > label.check, -.vo-inspector label.check { - flex: 0 0 auto; - display: inline-flex; - align-items: center; - gap: 6px; - padding-bottom: 6px; - color: var(--text); - font-size: 13px; -} -.vo-inspector input[type='checkbox'] { - width: auto; - margin: 0; - accent-color: var(--accent); -} -.vo-inspector fieldset.vo-inspector-ifaces { - display: flex; - flex-wrap: wrap; - gap: 4px 14px; -} -.vo-inspector-empty { - color: var(--muted); -} -.vo-inspector-row { - display: flex; - flex-wrap: wrap; - align-items: end; - gap: 8px 12px; -} -.vo-inspector-row > label { - flex: 1 1 160px; - max-width: 260px; -} -.vo-inspector-ends { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); - gap: 8px; -} -.vo-inspector label { - display: grid; - gap: 3px; - color: var(--muted); - font-size: 12px; -} -.vo-inspector input, -.vo-inspector select { - box-sizing: border-box; - width: 100%; - min-width: 0; - padding: 4px 6px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-inspector input:focus, -.vo-inspector select:focus { - border-color: var(--accent); - outline: 2px solid var(--accent-soft); -} -.vo-inspector fieldset { - display: grid; - grid-template-columns: minmax(0, 1fr) 84px; - align-items: start; - gap: 6px; - min-width: 0; - margin: 0; - padding: 6px 8px 8px; - border: 1px solid var(--border); - border-radius: 8px; -} -.vo-inspector fieldset .vo-wide { - grid-column: 1 / -1; -} -.vo-reading { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 4px 8px; - color: var(--muted); -} -.vo-reading b { - color: var(--text); -} -.shell.visuobject .vo-reading button.text-button { - padding: 1px 8px; - font-size: 12px; -} -.vo-inspector legend { - padding: 0 4px; - color: var(--text); - font-weight: 600; -} -.vo-inspector small { - color: var(--muted); - font-size: 11px; -} -.vo-inspector p { - margin: 0; -} -.vo-inspector-kind { - font-weight: 600; - padding-top: 4px; -} -.shell.visuobject .vo-inspector button.vo-danger { - display: inline-flex; - align-items: center; - justify-self: start; - gap: 6px; - color: #b3261e; -} -.vo-inspector .vo-danger svg { - width: 15px; - height: 15px; -} -.vo-insp-head { - position: sticky; - top: -8px; - z-index: 1; - margin-top: -8px; - padding-top: 8px; - background: var(--panel); - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - gap: 6px 12px; - border-bottom: 1px solid var(--border); -} -.vo-insp-head .vo-inspector-kind { - padding: 0; -} -.vo-insp-tabs { - display: flex; - gap: 2px; -} -.shell.visuobject .vo-insp-tabs button { - margin-bottom: -1px; - padding: 5px 12px; - border: 1px solid transparent; - border-bottom: none; - border-radius: 6px 6px 0 0; - background: none; - color: var(--muted); - font: 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - cursor: pointer; -} -.shell.visuobject .vo-insp-tabs button[aria-selected='true'] { - border-color: var(--border); - background: var(--panel); - color: var(--text); - font-weight: 600; -} -.vo-members { - width: 100%; - border-collapse: collapse; -} -.vo-members th { - padding: 0 4px 3px; - color: var(--muted); - font-size: 12px; - font-weight: 500; - text-align: left; -} -.vo-members td { - padding: 2px 4px; - vertical-align: middle; -} -.vo-members td.c { - width: 52px; - text-align: center; -} -.vo-members td:first-child { - width: 112px; -} -.vo-members td:last-child { - width: 32px; -} -.vo-members .icon svg { - width: 15px; - height: 15px; -} -.vo-doc textarea { - box-sizing: border-box; - width: 100%; - max-width: 780px; - padding: 4px 6px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - resize: vertical; -} -.vo-insp-sep { - align-self: stretch; - width: 1px; - margin: 0 4px; - background: var(--border); -} -.vo-insp-label { - align-self: center; - color: var(--muted); - font-size: 12px; -} -.uml-class.selected { - border-color: var(--accent); - box-shadow: 0 0 0 3px var(--accent-soft); - z-index: 2; -} -.uml-head { - display: grid; - justify-items: center; - padding: 4px 10px; - font-weight: 700; -} -.uml-head small { - font-weight: 400; - font-size: 11px; - color: var(--muted); -} -.uml-class.abstract .uml-name, -.uml-member.abstract { - font-style: italic; -} -.uml-member.static { - text-decoration: underline; -} -.uml-class ul { - list-style: none; - margin: 0; - padding: 3px 0; - border-top: 1.5px solid var(--text); - min-height: 12px; -} -.uml-class.selected ul { - border-top-color: var(--accent); -} -.uml-class li { - padding: 0 10px; - white-space: nowrap; -} -.uml-member.selected { - background: var(--accent-soft); -} -.uml-add { - color: var(--accent); - font-style: italic; - cursor: pointer; - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - font-size: 12px; -} -.uml-add:hover { - text-decoration: underline; -} -.uml-input { - font: inherit; - padding: 0 4px; - margin: 0 -5px; - border: 1px solid var(--accent); - border-radius: 4px; - outline: none; - max-width: 340px; -} -.uml-tools { - display: flex; - flex-wrap: wrap; - gap: 6px 10px; - align-items: center; - padding: 6px 10px; - border-top: 1px dashed var(--border); - font: 12px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - cursor: default; -} -.uml-tools label { - display: inline-flex; - gap: 4px; - align-items: center; -} -.uml-tools button.icon svg { - width: 16px; - height: 16px; -} -/* Package Explorer: Projekt › src › Packages › Dateien › Klassen › Attribute/Methoden */ -.vo-ws { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 6px; - padding: 8px 10px 4px; - font-size: 13px; -} -.vo-ws[hidden] { - display: none; -} -.vo-ws.ask { - margin: 8px 10px 4px; - padding: 10px; - border: 1px solid var(--accent); - border-radius: 8px; - background: var(--bg, #fff); -} -.vo-ws.ask p { - flex-basis: 100%; - margin: 0; -} -.vo-ws.ask .hint { - color: var(--muted); - font-size: 12px; - margin-bottom: 4px; -} -.vo-ws-name { - display: inline-flex; - align-items: center; - gap: 6px; - margin-right: auto; - font-weight: 600; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.shell.visuobject .vo-ws button.text-button { - padding: 2px 8px; - border-radius: 6px; -} -.shell.visuobject .vo-ws button.text-button.primary { - background: var(--accent); - border-color: var(--accent); - color: #fff; -} -.vo-lines .vo-end-hit { - fill: transparent; - pointer-events: all; - cursor: context-menu; -} -.vo-lines .vo-label-svg.editable { - pointer-events: all; - cursor: pointer; -} -.vo-lines .vo-label-svg.editable:hover { - fill: var(--accent); - text-decoration: underline; -} -.vo-lines .vo-label-svg.placeholder { - fill: var(--muted); - opacity: 0.6; - font-style: italic; -} -.vo-endpop { - position: absolute; - z-index: 12; - display: grid; - gap: 8px; - width: min(330px, calc(100% - 16px)); - box-sizing: border-box; - padding: 10px 12px; - background: var(--panel); - border: 1px solid var(--accent); - border-radius: 10px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16); - font: 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-endpop p { - margin: 0; -} -.vo-endpop label { - display: grid; - gap: 3px; - color: var(--muted); - font-size: 12px; -} -.vo-endpop input { - box-sizing: border-box; - min-width: 0; - padding: 4px 6px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-endpop-row { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 4px; -} -.vo-endpop-row > span { - flex-basis: 100%; - color: var(--muted); - font-size: 12px; -} -.vo-endpop-row button { - padding: 2px 8px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: 12px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - cursor: pointer; -} -.vo-endpop-row button[aria-pressed='true'] { - background: var(--accent); - border-color: var(--accent); - color: #fff; -} -.vo-endpop-row input { - width: 64px; -} -.vo-new { - position: relative; -} -.vo-new-menu { - position: absolute; - top: calc(100% + 4px); - left: 0; - z-index: 30; - display: grid; - min-width: 190px; - padding: 4px; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 8px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14); -} -.vo-new-menu[hidden] { - display: none; -} -.vo-new-menu button { - display: flex; - align-items: center; - gap: 8px; - padding: 6px 8px; - border: 0; - border-radius: 6px; - background: none; - color: var(--text); - font: 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - text-align: left; - cursor: pointer; -} -.vo-new-menu button:hover, -.vo-new-menu button:focus-visible { - background: var(--accent-soft); - outline: none; -} -.vo-badge.folder.source { - box-shadow: inset 0 3px 0 rgba(255, 255, 255, 0.35), inset -5px -4px 0 #8a6d2b; -} -.confirm-card.vo-wizard { - display: grid; - gap: 10px; - width: min(520px, 100%); - max-width: none; - max-height: calc(100vh - 32px); - overflow: auto; - box-sizing: border-box; - font: 14px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-wizard h2 { - margin: 0; - font-size: 17px; -} -.vo-wizard .hint { - margin: 0; - color: var(--muted); - font-size: 13px; -} -.vo-wizard > label { - display: grid; - grid-template-columns: 130px minmax(0, 1fr); - align-items: center; - gap: 8px; - color: var(--muted); - font-size: 13px; -} -.vo-wizard input[type='text'], -.vo-wizard select { - box-sizing: border-box; - width: 100%; - min-width: 0; - padding: 5px 7px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: inherit; -} -.vo-wizard fieldset { - margin: 0; - padding: 6px 10px 8px; - border: 1px solid var(--border); - border-radius: 8px; -} -.vo-wizard legend { - padding: 0 4px; - color: var(--muted); - font-size: 13px; -} -.vo-wizard-row { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 8px 16px; -} -.vo-wizard-row select, -.vo-wizard-row input[type='text'] { - width: auto; - flex: 1 1 160px; -} -.vo-wizard-list { - display: grid; - gap: 4px; -} -.vo-wizard .check { - display: inline-flex; - align-items: center; - gap: 6px; -} -.vo-wizard code { - font-size: 12px; -} -.vo-wizard-error { - min-height: 1em; - margin: 0; - color: #b3261e; - font-size: 13px; -} -.vo-wizard .group button.primary { - background: var(--accent); - border-color: var(--accent); - color: #fff; -} -@media (max-width: 560px) { - .vo-wizard > label { - grid-template-columns: 1fr; - } -} -.vo-dirty { - color: var(--accent); -} -.vo-tree-tools { - display: flex; - flex-wrap: wrap; - gap: 6px; - padding: 8px 10px 4px; -} -.shell.visuobject .vo-tree-tools button.text-button { - padding: 2px 8px; - border-radius: 6px; -} -.vo-tree { - flex: 1; - min-height: 0; - overflow: auto; - padding: 6px; - font: 13px/1.3 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.vo-tree ul { - list-style: none; - margin: 0; - padding: 0; -} -.vo-row { - display: flex; - align-items: center; - gap: 6px; - min-height: 28px; - padding: 0 6px 0 calc(4px + var(--depth, 0) * 14px); - border-radius: 7px; - cursor: pointer; - user-select: none; - white-space: nowrap; - outline: none; -} -.vo-row:hover { - background: var(--accent-faint); -} -.vo-row:focus-visible { - box-shadow: inset 0 0 0 2px var(--accent-soft); -} -.vo-row.active .vo-label { - font-weight: 600; -} -.vo-row.selected { - background: var(--accent-soft); - color: var(--text); -} -.vo-twisty, -.vo-twisty-space { - flex: none; - width: 18px; - height: 18px; -} -.vo-twisty { - display: grid; - place-items: center; - padding: 0; - border: 0; - border-radius: 4px; - background: none; - color: var(--muted); - cursor: pointer; -} -.vo-twisty svg { - transition: transform 0.15s ease; -} -[aria-expanded='true'] > .vo-row .vo-twisty svg { - transform: rotate(90deg); -} -.vo-twisty:hover { - color: var(--accent); -} -.vo-label { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; -} -.vo-type { - color: var(--muted); - font-size: 12px; - overflow: hidden; - text-overflow: ellipsis; -} -.vo-row .uml-input { - margin: 0; - font: inherit; -} -.vo-row-delete { - margin-left: auto; - visibility: hidden; -} -.vo-tree button.vo-row-delete { - width: 24px; - height: 24px; -} -.vo-tree button.vo-row-delete svg { - width: 14px; - height: 14px; -} -.vo-row:hover .vo-row-delete, -.vo-row.selected .vo-row-delete { - visibility: visible; -} -.vo-tree-empty { - padding: 6px 10px 6px 52px; - color: var(--muted); - font-size: 12px; - white-space: normal; -} -/* Symbole im Baum: modern statt Eclipse-Pixelgrafik */ -.vo-badge { - flex: none; - display: inline-grid; - place-items: center; - width: 16px; - height: 16px; - border-radius: 4px; - font: 700 10px/1 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - color: #fff; -} -.vo-badge.project { - background: var(--accent); - border-radius: 5px; - box-shadow: inset 0 -5px 0 rgba(0, 0, 0, 0.18); -} -.vo-badge.project.closed { - opacity: 0.55; -} -.vo-badge.folder { - width: 17px; - height: 13px; - border-radius: 2px 4px 3px 3px; - background: #e0a63b; - box-shadow: inset 0 3px 0 rgba(255, 255, 255, 0.35); -} -.vo-badge.package { - width: 14px; - height: 14px; - border-radius: 3px; - background: #b07a2a; - transform: rotate(45deg) scale(0.82); -} -.vo-badge.package.empty { - background: none; - border: 1.5px solid #b07a2a; -} -.vo-badge.file { - background: #e66a2c; - border-radius: 3px 6px 3px 3px; -} -.vo-badge.type.class { - background: #2f7d32; - border-radius: 50%; -} -.vo-badge.type.class.abstract { - background: #6a9c3a; - font-style: italic; -} -.vo-badge.type.interface { - background: #7b4fb0; - border-radius: 50%; -} -.vo-badge.field, -.vo-badge.method { - width: 9px; - height: 9px; - margin: 0 3px; -} -.vo-badge.field { - border-radius: 2px; -} -.vo-badge.method { - border-radius: 50%; -} -.vo-badge.public { - background: #2f9e44; -} -.vo-badge.private { - background: #d6453d; -} -.vo-badge.protected { - background: #e0a63b; -} -.vo-badge.package.field, -.vo-badge.package.method { - background: #3b82c4; - transform: none; - border: 0; -} -.vo-badge.static { - box-shadow: 0 0 0 2px var(--panel), 0 0 0 3px currentColor; - color: var(--muted); -} -@media (max-width: 760px) { - /* Am Handy untereinander; eingeklappt bleibt ein waagerechter Streifen */ - .vo-columns { - grid-template-columns: 1fr; - grid-auto-rows: auto; - overflow: auto; - } - .vo-splitter { - display: none; - } - .vo-explorer:not(.collapsed) { - height: 260px; - } - .vo-code:not(.collapsed) { - height: 320px; - } - .vo-diagram:not(.collapsed) { - min-height: 420px; - } - .vo-pane { - border-bottom: 1px solid var(--border); - } - .vo-strip { - writing-mode: horizontal-tb; - padding: 10px; - } -} - - -/* VisuObject: Start/Stop und Konsole unter dem Code (echtes Java über CheerpJ). */ -.shell.visuobject .vo-run-group button.vo-run { - color: var(--accent); - font-weight: 600; -} -.vo-console { - display: flex; - flex-direction: column; - height: 32vh; - min-height: 120px; - border-top: 1px solid var(--border); -} -.vo-console[hidden], -.vo-swing[hidden] { - display: none; -} -.vo-console .vo-dock-bar { - gap: 10px; -} -.vo-console-status { - flex: 1; - color: var(--muted); - font-size: 12px; -} -.vo-console-status.error { - color: #b3261e; -} -.vo-swing { - display: flex; - height: 60%; - padding: 6px; -} -.vo-console-lines { - flex: 1; - min-height: 0; - overflow: auto; - margin: 0; - padding: 6px 12px; - font-size: 13px; - white-space: pre-wrap; -} - -/* UML-Notiz: Kasten mit Eselsohr oben rechts, gestrichelt an Klassen geheftet. */ -.uml-note { - position: absolute; - min-width: 120px; - max-width: 260px; - padding: 8px 22px 8px 10px; - background: #fffbe6; - border: 1.2px solid var(--text); - clip-path: polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 0 100%); - font: 13px/1.45 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - color: #17292e; - cursor: grab; - user-select: none; - touch-action: none; - z-index: 1; -} -.uml-note::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 14px; - height: 14px; - background: linear-gradient(to bottom left, transparent 50%, #e9dfae 50%); - border-left: 1.2px solid var(--text); - border-bottom: 1.2px solid var(--text); -} -.uml-note.selected { - outline: 3px solid var(--accent-soft); - border-color: var(--accent); - clip-path: none; -} -.uml-note .uml-connect { - z-index: 2; -} -.uml-note-text { - white-space: pre-wrap; - overflow-wrap: anywhere; -} -.uml-note-text.placeholder { - color: #8a8a8a; - font-style: italic; -} -.uml-note-edit { - box-sizing: border-box; - width: 220px; - border: 1px solid var(--accent); - background: #fffef5; - font: inherit; - resize: both; -} -.vo-note-link { - stroke-dasharray: 5 4; -} - -/* VisuObject: Umschalter Klassendiagramm ⇄ Objektdiagramm und Objekte wie in Astah. */ -.vo-canvas[hidden], -.vo-palette[hidden] { - display: none; -} -.vo-diagram-switch { - display: flex; - gap: 2px; - padding: 2px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); -} -.shell.visuobject .vo-diagram-switch button { - padding: 3px 10px; - border: none; - border-radius: 6px; - background: none; - color: var(--muted); - font: 600 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; - cursor: pointer; -} -.shell.visuobject .vo-diagram-switch button[aria-selected='true'] { - background: var(--accent); - color: #fff; -} -.vo-obj-palette { - align-items: center; - gap: 8px; - padding: 6px 10px; -} -.vo-obj-new { - display: flex; - align-items: center; - gap: 6px; - font-size: 13px; -} -.vo-obj-new select { - padding: 3px 6px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--panel); - color: var(--text); - font: 13px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -} -.uml-object .uml-objname { - text-decoration: underline; - font-weight: 600; -} -.uml-object.unknown { - border-style: dashed; -} -.uml-object .uml-member.changed, -.vo-objlink.changed { - animation: vo-changed 1.2s ease-out; -} -.uml-object .uml-member.changed { - background: #fff3b0; -} -@keyframes vo-changed { - from { - background: #ffe066; - } -} -.vo-obj-values td:first-child { - width: auto; - white-space: nowrap; -} -.vo-obj-values td:last-child { - width: 50%; -} - -/* VisuObject-Debugger: Knöpfe, Eingabe in der Konsole, Aufrufstapel und Variablen im Inspektor. */ -.vo-dbg-controls { - display: inline-flex; - gap: 2px; -} -.vo-dbg-controls[hidden] { - display: none; -} -.vo-console-lines .vo-out-err { - color: #b3261e; -} -.vo-console-lines .vo-out-in { - color: var(--accent); - font-weight: 600; -} -.vo-console-input { - display: flex; - align-items: center; - gap: 6px; - padding: 4px 12px 8px; - color: var(--accent); -} -.vo-console-input[hidden] { - display: none; -} -.vo-console-input input { - flex: 1; - font-size: 13px; - padding: 4px 6px; - border: 1px solid var(--accent); - border-radius: 4px; -} -.vo-dbg { - display: grid; - grid-template-columns: minmax(160px, 1fr) minmax(220px, 2fr); - gap: 12px; - padding: 8px 12px; -} -.vo-dbg h3 { - margin: 0 0 6px; - font-size: 12px; - font-weight: 600; - color: var(--muted); -} -.vo-dbg ol { - list-style: none; - margin: 0; - padding: 0; -} -.vo-dbg-frame { - display: block; - width: 100%; - text-align: start; - padding: 3px 6px; - border: 0; - border-radius: 4px; - background: none; - color: inherit; - font: inherit; - cursor: pointer; -} -.vo-dbg-frame.on { - background: var(--accent-soft); -} -.vo-dbg-frame small { - color: var(--muted); -} -.vo-dbg-vars tr.changed td { - background: rgba(255, 214, 10, 0.35); -} -@media (max-width: 760px) { - .vo-dbg { - grid-template-columns: 1fr; - } -} - -/* VisuObject: Sequenzdiagramm aus dem Debugger. */ -.vo-seqcanvas { - overflow: auto; -} -.vo-seqcanvas .vo-empty[hidden] { - display: none; -} -.vo-seq { - display: block; - font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; -} -.vo-seq-head rect { - fill: var(--panel); - stroke: var(--text); - stroke-width: 1.2; -} -.vo-seq-head text { - fill: var(--text); - text-decoration: underline; -} -.vo-seq-head.static text { - text-decoration: none; - font-weight: 600; -} -.vo-seq-life { - stroke: var(--muted); - stroke-dasharray: 5 4; -} -.vo-seq-bar { - fill: var(--panel); - stroke: var(--text); - stroke-width: 1; -} -.vo-seq-bar.running { - fill: var(--accent-soft); -} -.vo-seq-msg { - cursor: pointer; -} -.vo-seq-msg line, -.vo-seq-msg path { - stroke: var(--text); - stroke-width: 1.2; -} -.vo-seq-msg .head.filled { - fill: var(--text); -} -.vo-seq-msg text { - fill: var(--text); -} -.vo-seq-msg.return line, -.vo-seq-msg.create line { - stroke-dasharray: 6 4; -} -.vo-seq-msg.exception line, -.vo-seq-msg.exception text { - stroke: #b3261e; - fill: #b3261e; -} -.vo-seq-msg.current line, -.vo-seq-msg.current path { - stroke: #e0a800; - stroke-width: 2.4; -} -.vo-seq-msg.current .head.filled { - fill: #e0a800; -} -.vo-seq-msg.current text { - font-weight: 700; -} -.vo-seq-msg:hover text { - fill: var(--accent); -} -.vo-seq-more { - fill: var(--muted); -} - -/* Elemente einklappen: Knopf neben der Überschrift, eingeklappt bleibt eine schmale Leiste. */ -.palette-head { - display: flex; - align-items: center; - gap: 4px; - margin: 0 0 4px; -} -.palette-head h2 { - flex: 1; - min-width: 0; - margin: 0; -} -.palette-hide { - min-height: 26px; - padding: 2px 5px; -} -.app.compact-palette .palette-head { - flex-direction: column; - gap: 2px; -} -.palette-rail { - display: none; - grid-area: pal; - width: auto; -} -.app.palette-hidden .palette, -.app.palette-hidden .palette-resizer { - display: none; -} -.app.palette-hidden:not(.simulating) .palette-rail { - display: flex; -} -/* Schmale Fenster: Elemente stehen als Zeile oben, dort gibt es kein Einklappen. */ -@media (max-width: 820px) { - .palette-head { - display: none; - } - .app.palette-hidden .palette { - display: block; - } - .app.palette-hidden .palette-rail { - display: none !important; - } -} -/* Haken „Pseudocode“ links vom ⇄ in der Werkzeugzeile. */ -.diagram-tools .pseudocode-toggle { - gap: 4px; - margin: 0 4px; - white-space: nowrap; - cursor: pointer; -} - -/* Welt VisuFlow (flowApp.ts): PAP zeichnen, Farbe Violett */ -:root.visuflow-theme { - --bg: #f3f0fb; - --text: #221a35; - --muted: #625a75; - --border: #ddd6ee; - --accent: #6f42c1; - --accent-soft: rgba(111, 66, 193, 0.2); - --accent-faint: rgba(111, 66, 193, 0.08); - --accent-glow: rgba(111, 66, 193, 0.35); -} -.visuflow-flow { - color: var(--accent); -} -.vf-logo { - width: 22px; - height: 22px; - background: no-repeat center / contain - url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236f42c1' stroke-width='2'%3E%3Crect x='6' y='1.5' width='12' height='5' rx='2.5'/%3E%3Cpath d='M12 6.5v3M12 9.5l5 4-5 4-5-4z M12 17.5v2'/%3E%3Crect x='7' y='19.5' width='10' height='3' rx='0.5'/%3E%3C/svg%3E"); -} -.shell.visuflow button.text-button { - padding: 5px 10px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); - color: var(--text); - font: inherit; - cursor: pointer; -} -.shell.visuflow button.text-button:hover:not(:disabled) { - border-color: var(--accent); - color: var(--accent); -} -.shell.visuflow button:disabled { - opacity: 0.45; - cursor: default; -} -.vf-export { - position: relative; -} -.vf-menu { - position: absolute; - top: calc(100% + 6px); - inset-inline-start: 0; - z-index: 30; - display: grid; - min-width: 190px; - padding: 4px; - background: var(--panel); - border: 1px solid var(--border); - border-radius: 10px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); -} -.vf-menu[hidden] { - display: none; -} -.vf-menu button { - padding: 8px 10px; - border: 0; - border-radius: 6px; - background: none; - color: var(--text); - font: inherit; - text-align: start; - cursor: pointer; -} -.vf-menu button:hover, -.vf-menu button:focus-visible { - background: var(--accent-faint); - color: var(--accent); -} -.vf-main { - display: flex; - flex: 1; - min-height: 0; - border-top: 1px solid var(--border); -} -.vf-palette { - display: flex; - flex-direction: column; - gap: 8px; - width: 190px; - flex-shrink: 0; - padding: 10px; - overflow-x: hidden; - overflow-y: auto; - background: var(--panel); - border-inline-end: 1px solid var(--border); -} -.vf-palette h2 { - margin: 0; - font-size: 11px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.05em; - color: var(--muted); -} -.vf-shapes { - display: grid; - gap: 6px; -} -.vf-shape { - display: flex; - align-items: center; - gap: 8px; - padding: 4px 6px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--panel); - color: var(--text); - font: inherit; - font-size: 13px; - text-align: start; - cursor: grab; - touch-action: none; - user-select: none; -} -.vf-shape:hover, -.vf-shape:focus-visible { - border-color: var(--accent); - background: var(--accent-faint); -} -.vf-shape svg { - flex-shrink: 0; - width: 48px; - height: 27px; -} -.vf-hint { - margin: 4px 0 0; - font-size: 12px; - line-height: 1.4; - color: var(--muted); -} -.vf-stage { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; -} -.vf-titlebar { - padding: 8px 12px; - background: var(--panel); - border-bottom: 1px solid var(--border); -} -.vf-title { - width: min(420px, 100%); - padding: 6px 8px; - border: 1px solid var(--border); - border-radius: 6px; - font: inherit; - font-weight: 600; -} -.vf-scroll { - position: relative; - flex: 1; - overflow: auto; - background-color: #ffffff; - background-image: radial-gradient(circle, #d9d4e6 1px, transparent 1.2px); - background-size: 20px 20px; - background-attachment: local; -} -.vf-canvas { - display: block; - touch-action: none; - user-select: none; - -webkit-user-select: none; -} -.vf-node { - cursor: move; -} -.vf-node.selected > :first-child { - stroke: var(--accent); - stroke-width: 3; - filter: drop-shadow(0 0 4px var(--accent-glow)); -} -.vf-node.drop-target > :first-child { - stroke: var(--accent); - stroke-width: 3; - stroke-dasharray: 6 3; -} -.vf-edge { - cursor: pointer; -} -.vf-edge.selected .vf-edge-line { - stroke: var(--accent); - stroke-width: 3; -} -.vf-port { - cursor: crosshair; -} -.vf-port-dot { - fill: #ffffff; - stroke: var(--accent); - stroke-width: 2; -} -.vf-port.used .vf-port-dot { - fill: var(--accent); - opacity: 0.55; -} -.vf-port:hover .vf-port-dot { - fill: var(--accent); - opacity: 1; -} -.vf-drag-line { - stroke: var(--accent); - stroke-width: 2; - stroke-dasharray: 6 4; - pointer-events: none; -} -.vf-editor { - position: absolute; - z-index: 5; - box-sizing: border-box; - padding: 4px 6px; - border: 2px solid var(--accent); - border-radius: 6px; - background: #ffffff; - color: var(--text); - font: 14px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - line-height: 16px; - text-align: center; - resize: none; - overflow: hidden; -} -.vf-ghost { - position: fixed; - z-index: 100; - pointer-events: none; - transform: translate(-50%, -50%) scale(1.6); - opacity: 0.85; -} -.vf-status { - margin: 0; - padding: 6px 12px; - font-size: 12px; - color: var(--muted); - background: var(--panel); - border-top: 1px solid var(--border); -} -@media (max-width: 700px) { - .vf-main { - flex-direction: column; - } - .vf-palette { - flex-direction: row; - width: auto; - overflow-x: auto; - border-inline-end: 0; - border-bottom: 1px solid var(--border); - } - .vf-palette h2, - .vf-hint { - display: none; - } - .vf-shapes { - display: flex; - } - .vf-shape { - flex-direction: column; - gap: 2px; - font-size: 11px; - } -} - -/* VisuBot-Befehle nach Gruppen: Streifen links in der Palette, Punkt an der Gruppe und im Nachschlagen. - Die Kästen bleiben gelb (Anweisung); mit „Blöcke farbig“ aus gehen auch die Streifen aus. */ -[data-bot-color='fahren'], .bot-fahren { --bot: #c2410c; } -[data-bot-color='licht'], .bot-licht { --bot: #84cc16; } -[data-bot-color='ton'], .bot-ton { --bot: #c026d3; } -[data-bot-color='anzeige'], .bot-anzeige { --bot: #4f46e5; } -[data-bot-color='warten'], .bot-warten { --bot: #6b7280; } -[data-bot-color='sensor'], .bot-sensor { --bot: #0891b2; } -[data-bot-color='operator'], .bot-operator { --bot: #16a34a; } -[data-bot-color='variable'], .bot-variable { --bot: #ea580c; } -:root:not(.no-code-scopes) .palette-item[data-bot-color] { - border-left: 4px solid var(--bot); -} -:root:not(.no-code-scopes) .palette-group[data-bot-color] button::after, -:root:not(.no-code-scopes) .learn-text h3[class^='bot-']::before { - content: ''; - display: inline-block; - width: 9px; - height: 9px; - flex-shrink: 0; - border-radius: 50%; - background: var(--bot); -} -:root:not(.no-code-scopes) .palette-group[data-bot-color] button::before { - order: -2; -} -:root:not(.no-code-scopes) .palette-group[data-bot-color] button::after { - order: -1; -} -:root:not(.no-code-scopes) .learn-text h3[class^='bot-']::before { - margin-inline-end: 7px; - vertical-align: 1px; -} - -/* Spiel „Wo landet der mBot2?“ */ -.learn-drive-map { - display: block; - width: 100%; - max-width: 320px; - margin: 8px auto; - touch-action: manipulation; -} -.learn-drive-map .cell { - stroke: #cbd5e1; - stroke-width: 0.6; - cursor: pointer; -} -.learn-drive-map:not(.done) .cell:hover, -.learn-drive-map .cell:focus-visible { - stroke: var(--accent); - stroke-width: 2; - outline: none; -} -.learn-drive-map.done .cell { - cursor: default; -} -.learn-drive-map .cell.right { - stroke: #16a34a; - stroke-width: 3; -} -.learn-drive-map .cell.wrong { - stroke: #dc2626; - stroke-width: 3; -} -.learn-drive-map .trail { - stroke: var(--accent); - stroke-width: 2; - stroke-dasharray: 3 2; - pointer-events: none; -} -.learn-drive-map .robot { - transition: transform 0.4s ease-in-out; - pointer-events: none; -} -.learn-drive-map .robot .body { - fill: #0ea5b7; - stroke: #0f172a; - stroke-width: 1; -} -.learn-drive-map .robot .nose { - fill: #ffffff; -} -@media (prefers-reduced-motion: reduce) { - .learn-drive-map .robot { - transition: none; - } -} - -/* VisuBot: Struktogramm als Blöcke (blockView.ts), Aussehen wie der Block-Modus von VisuMicro. - Farben des Struktogramms: Anweisung gelb, Schleife rosa, Verzweigung/Fallauswahl blau; Befehle des mBot2 - zusätzlich mit dem Streifen ihrer Gruppe. Schwarze Schrift, weiße Felder für Werte. */ -.diagram-tools .blocks-toggle { - display: inline-flex; - align-items: center; - gap: 5px; - height: 30px; - margin-inline-start: 6px; - padding: 0 10px; - white-space: nowrap; -} -.diagram-tools .blocks-toggle[hidden] { - display: none; -} -@container (max-width: 520px) { - .diagram-tools .blocks-toggle span + span { - display: none; - } -} -.blocks-view { - --bk-stmt: #f2b100; - --bk-loop: #ec5fa6; - --bk-if: #3b9cf0; - --bk-plain: #9aa3ae; - --bk-bump: 6px; - --bk-workspace: #fafafa; - flex: 1; - min-height: 0; - overflow: auto; - scrollbar-gutter: stable; - background: var(--bk-workspace); - padding: 10px 16px 32px; - font: 500 calc(15px * var(--bk-zoom, 1)) / 1.5 system-ui, -apple-system, sans-serif; - user-select: none; - -webkit-user-select: none; -} -.blocks-view[hidden] { - display: none; -} -.bk-hint { - margin: 0 0 6px; - max-width: 44em; - color: var(--muted); - font-size: 13px; - line-height: 1.4; -} -.bk-stack { - padding-top: 14px; -} -.bk { - --bk-color: var(--bk-stmt); - --bk-c: color-mix(in srgb, var(--bk-color) 42%, #fff); - --bk-e: color-mix(in srgb, var(--bk-color) 80%, #000); - position: relative; - width: fit-content; - min-width: 12em; - max-width: 100%; - border: 1px solid var(--bk-e); - border-radius: 5px; - background: var(--bk-c); - color: #000; - cursor: pointer; -} -.bk-loop { --bk-color: var(--bk-loop); } -.bk-if { --bk-color: var(--bk-if); } -.bk-hat { --bk-color: var(--bk-stmt); cursor: default; } -/* Einstellung „Blöcke farbig“ aus: alle Blöcke grau */ -:root.no-code-scopes .bk { --bk-color: var(--bk-plain); } -/* mBot2-Befehle: Streifen links in der Farbe der Gruppe, der Block selbst bleibt gelb */ -:root:not(.no-code-scopes) .bk[data-bot-color] { - border-left: 6px solid var(--bot); -} -/* gestapelte Blöcke liegen aneinander; die Nase des oberen greift in den unteren */ -.bk + .bk, -.bk + .bk-empty, -.bk-empty + .bk { - margin-top: -1px; -} -.bk-simple::after, -.bk-c::after, -.bk-hat::after, -.bk-c > .bk-head:first-child::after, -.bk-clause::after { - content: ''; - position: absolute; - z-index: 1; - left: 12px; - bottom: calc(-1 * var(--bk-bump) - 1px); - width: 1.6em; - height: var(--bk-bump); - background: var(--bk-c); - border: 1px solid var(--bk-e); - border-top: none; - border-radius: 0 0 6px 6px; -} -.bk-c > .bk-head:first-child::after, -.bk-clause::after { - left: calc(16px + 12px); -} -.bk-head, -.bk-foot { - position: relative; - display: flex; - flex-direction: column; - padding: calc(var(--bk-bump) - 1px) 10px 4px; -} -.bk-foot { - min-height: calc(var(--bk-bump) + 10px); - padding-top: var(--bk-bump); -} -.bk-line { - white-space: pre-wrap; -} -/* Hut-Block: runder Kopf wie „Wenn die grüne Flagge angeklickt“ */ -.bk-hat { - border-top-left-radius: 22px; - border-top-right-radius: 10px; -} -.bk-hat > .bk-head { - flex-direction: row; - flex-wrap: wrap; - column-gap: 1em; - padding-top: 8px; - padding-left: 14px; -} -.bk-hat::before { - content: ''; - position: absolute; - left: -1px; - top: -9px; - width: 7em; - height: 18px; - border: 1px solid var(--bk-e); - border-bottom: none; - border-radius: 50% 50% 0 0 / 100% 100% 0 0; - background: var(--bk-c); - clip-path: inset(0 0 8px 0); -} -/* Maul eines C-Blocks: links der Arm in Blockfarbe, innen die Arbeitsfläche */ -.bk-body { - margin-left: 16px; - margin-right: -1px; - padding-right: 2em; - min-height: 1em; - background: var(--bk-workspace); - border: 1px solid var(--bk-e); - border-right: none; - border-radius: 4px 0 0 4px; - color: var(--text); -} -.bk-body > :first-child { - margin-top: -1px; -} -/* break: Abschluss ohne Nase unten */ -.bk-cap { - border-bottom-left-radius: 2px; - border-bottom-right-radius: 10px; -} -/* Aufruf: senkrechte Linien wie der Kasten im Struktogramm */ -.bk-call > .bk-head { - margin: 0 6px; - border-inline: 2px solid var(--bk-e); -} -/* leerer Platz (Platzhalter): gestrichelt */ -.bk-empty { - width: fit-content; - min-width: 12em; - margin: 6px 8px; - padding: 2px 10px; - border: 1.5px dashed var(--border); - border-radius: 6px; - color: var(--muted); - font-style: italic; - font-size: 0.9em; - cursor: pointer; -} -.bk .tk-kw { - font-weight: 700; -} -/* Werte: weiße, runde Felder – hier wird man sie später direkt ändern */ -.bk .tk-lit, -.bk .tk-str { - padding: 0 6px; - border-radius: 999px; - background: #fff; - box-decoration-break: clone; - -webkit-box-decoration-break: clone; -} -/* leere Klammer (`mbot.forward()`): leeres weißes Feld zum Eintippen */ -.bk .tk-lit:empty { - display: inline-block; - min-width: 2.5ch; - min-height: 1.2em; - vertical-align: middle; -} -/* Variablen (zahl, i …): orange Bausteine */ -.bk .tk-var { - padding: 0 6px; - border-radius: 999px; - background: #fdba74; - color: #431407; - font-weight: 600; -} -/* Operatoren (Zufallszahl): grüner runder Baustein mit eigenen Feldern */ -.bk .tk-op { - padding: 1px 6px; - border: 1px solid #15803d; - border-radius: 999px; - background: #86efac; - color: #052e16; -} -/* Sensoren: türkiser Baustein wie in der Palette */ -.bk .tk-sensor { - padding: 0 6px; - border: 1px solid color-mix(in srgb, #0891b2 80%, #000); - border-radius: 999px; - background: color-mix(in srgb, #0891b2 35%, #fff); -} -:root.no-code-scopes .bk .tk-sensor { - border-color: #6b7280; - background: #e5e7eb; -} -/* Auswahl und laufender Schritt der Simulation */ -.bk-sel { - outline: 3px solid var(--accent); - outline-offset: 1px; - z-index: 2; -} -.bk-exec { - outline: 3px solid var(--text); - outline-offset: 1px; - box-shadow: 0 0 12px 4px var(--accent-glow); - z-index: 2; -} -.blocks-view.bk-simulating .bk, -.blocks-view.bk-simulating .bk-empty { - cursor: default; -} -/* Ziehen in den Blöcken: Linie an der Ablegestelle, Rahmen um einen leeren Platz bzw. die Bedingung */ -.bk-stack { - position: relative; -} -.bk-drop-line { - position: absolute; - z-index: 5; - height: 6px; - border-radius: 3px; - background: var(--accent); - box-shadow: 0 0 0 2px #fff; - pointer-events: none; -} -.bk-drop, -.bk-empty.bk-drop { - outline: 3px dashed var(--accent); - outline-offset: 1px; - z-index: 2; -} -/* Papierkorb: erscheint beim Verschieben eines Blocks unten rechts */ -.bk-trash { - display: none; - position: sticky; - bottom: 0; - margin: 16px 0 0 auto; - width: fit-content; - padding: 10px 16px; - border: 2px dashed var(--border); - border-radius: 12px; - background: var(--panel); - color: var(--muted); - font-size: 14px; -} -.blocks-view.bk-moving .bk-trash { - display: block; -} -.bk-trash.bk-trash-hot { - border-color: #dc2626; - background: #fee2e2; - color: #991b1b; -} -.blocks-view:not(.bk-simulating) .bk:not(.bk-hat) { - touch-action: pan-y; -} -/* Werte anklicken und direkt im Block ändern */ -.blocks-view:not(.bk-simulating) .bk [data-value] { - cursor: text; -} -.blocks-view:not(.bk-simulating) .bk [data-value]:hover { - box-shadow: 0 0 0 2px var(--accent); -} -.bk-input { - box-sizing: border-box; - min-width: 2ch; - padding: 0 6px; - border: 2px solid var(--accent); - border-radius: 999px; - background: #fff; - color: #000; - font: inherit; - text-align: center; - outline: none; -} -/* Stufe 4: Sensoren als Bausteine. Ja/Nein-Sensoren sechseckig wie Bedingungen in Scratch, Messwerte rund. */ -.bk .tk-sensor.tk-bool { - padding: 0 12px; - border: none; - border-radius: 0; - clip-path: polygon(8px 0, calc(100% - 8px) 0, 100% 50%, calc(100% - 8px) 100%, 8px 100%, 0 50%); -} -.bk .tk-sensor.bk-drop, -.bk [data-value].bk-drop { - outline: 3px dashed var(--accent); - outline-offset: 1px; - clip-path: none; -} -/* Elemente-Spalte in den Blöcken: Sensoren sehen aus wie die Bausteine, in die sie sich verwandeln */ -.app.block-mode .palette-sensor code { - display: inline-block; - margin-top: 2px; - padding: 0 8px; - border: 1px solid color-mix(in srgb, #0891b2 80%, #000); - border-radius: 999px; - background: color-mix(in srgb, #0891b2 35%, #fff); - color: #000; -} -.app.block-mode .palette-sensor code.sensor-bool, -.drag-ghost.drag-sensor.sensor-bool { - padding: 0 12px; - border: none; - border-radius: 0; - clip-path: polygon(8px 0, calc(100% - 8px) 0, 100% 50%, calc(100% - 8px) 100%, 8px 100%, 0 50%); -} -.drag-ghost.drag-sensor { - border: 1px solid color-mix(in srgb, #0891b2 80%, #000); - border-radius: 999px; - background: color-mix(in srgb, #0891b2 35%, #fff); - color: #000; - font-family: ui-monospace, monospace; -} -/* Blöcke an: auch die Elemente-Spalte zeigt Blöcke (Farbe, Nase, Klammerblöcke mit Maul) statt der Kästen-Symbole */ -.app.block-mode .palette-item:not(.palette-sensor), -.drag-ghost.drag-block { - --bk-color: #f2b100; - --bk-c: color-mix(in srgb, var(--bk-color) 42%, #fff); - --bk-e: color-mix(in srgb, var(--bk-color) 80%, #000); - border: 1px solid var(--bk-e); - border-radius: 5px; - background: var(--bk-c); - color: #000; - font-weight: 600; -} -.app.block-mode .palette-item[data-scope='loop'], -.drag-ghost.drag-block[data-scope='loop'] { - --bk-color: #ec5fa6; -} -.app.block-mode .palette-item[data-scope='if'], -.drag-ghost.drag-block[data-scope='if'] { - --bk-color: #3b9cf0; -} -:root.no-code-scopes .app.block-mode .palette-item:not(.palette-sensor), -:root.no-code-scopes .drag-ghost.drag-block { - --bk-color: #9aa3ae; -} -.app.block-mode .palette-item:not(.palette-sensor) .icon { - display: none; -} -.app.block-mode .palette-item:not(.palette-sensor):hover, -.app.block-mode .palette-item:not(.palette-sensor):focus-visible { - border-color: var(--bk-e); - box-shadow: 0 0 0 2px var(--accent); -} -.app.block-mode .palette-item:not(.palette-sensor) { - position: relative; - margin-bottom: 4px; -} -/* VisuBot-Befehle behalten ihren Gruppenstreifen */ -:root:not(.no-code-scopes) .app.block-mode .palette-item[data-bot-color] { - border-left: 6px solid var(--bot); -} -/* Nase unten wie bei den Blöcken */ -.app.block-mode .palette-item:not(.palette-sensor)::after, -.drag-ghost.drag-block::after { - content: ''; - position: absolute; - z-index: 1; - left: 12px; - bottom: -7px; - width: 1.6em; - height: 6px; - background: var(--bk-c); - border: 1px solid var(--bk-e); - border-top: none; - border-radius: 0 0 6px 6px; -} -/* Schleifen und Verzweigungen: Klammerblock mit leerem Maul */ -.app.block-mode .palette-item[data-scope='loop'], -.app.block-mode .palette-item[data-scope='if'], -.drag-ghost.drag-block[data-scope='loop'], -.drag-ghost.drag-block[data-scope='if'] { - padding-bottom: 26px; -} -.app.block-mode .palette-item[data-scope='loop']::before, -.app.block-mode .palette-item[data-scope='if']::before, -.drag-ghost.drag-block[data-scope='loop']::before, -.drag-ghost.drag-block[data-scope='if']::before { - content: ''; - position: absolute; - left: 14px; - right: -1px; - bottom: 8px; - height: 12px; - background: var(--panel); - border: 1px solid var(--bk-e); - border-right: none; - border-radius: 4px 0 0 4px; -} -.drag-ghost.drag-block { - padding: 6px 12px; - min-width: 9em; -} - -/* VisuBlocks: Operatoren grün, Variablen orange – in den Elementen (Blöcke an) und beim Ziehen */ -.app.block-mode .palette-op code, -.drag-ghost.drag-sensor.drag-op { - border-color: #15803d; - background: #86efac; -} -.app.block-mode .palette-var code, -.drag-ghost.drag-sensor.drag-var { - border-color: #c2410c; - background: #fdba74; -} - -/* Block-Lektionen für Jüngere: Programm einer Spielrunde als Blöcke, nur zum Ansehen */ -.blocks-view.bk-picture { - flex: none; - overflow: visible; - padding: 4px 8px 10px; - border-radius: 10px; - font-size: 14px; - margin-bottom: 8px; -} -.bk-picture .bk-hint, -.bk-picture .bk-trash { - display: none; -} -.bk-picture .bk-stack { - padding-top: 6px; -} diff --git a/web/src/ui/termTips.ts b/web/src/ui/termTips.ts deleted file mode 100644 index 088e6e1d..00000000 --- a/web/src/ui/termTips.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { entryFor, termPattern, type GlossaryEntry } from '../learn/glossary' - -/** - * Fachbegriffe im Lernbereich: das erste Vorkommen je Schritt wird markiert und zeigt seine Erklärung - * beim Hovern (Maus), beim Antippen (Tablet) und beim Ansteuern mit der Tastatur. - */ - -/** Hier wird nichts markiert: Code, Links, Überschriften, Knöpfe und fett Gesetztes (dort wird der Begriff gerade erklärt). */ -const skip = 'code, pre, a, button, h1, h2, h3, h4, strong, .term, .ui-pointer' - -/** Markiert in den `.learn-text`-Blöcken unter `root` jeden Begriff höchstens einmal. */ -export function markTerms(root: HTMLElement, entries: GlossaryEntry[]) { - const texts = [...root.querySelectorAll('.learn-text')] - const introduced = new Set() - for (const strong of texts.flatMap((t) => [...t.querySelectorAll('strong')])) { - const pattern = termPattern(entries) - const found = pattern?.exec(strong.textContent ?? '') - const entry = found ? entryFor(entries, found[0]) : undefined - if (entry) introduced.add(entry) - } - let open = entries.filter((e) => !introduced.has(e)) - for (const block of texts) { - const walker = document.createTreeWalker(block, NodeFilter.SHOW_TEXT) - const nodes: Text[] = [] - while (walker.nextNode()) { - const node = walker.currentNode as Text - if (!node.parentElement?.closest(skip)) nodes.push(node) - } - for (let node of nodes) { - for (;;) { - const pattern = termPattern(open) - const found = pattern?.exec(node.data) - const entry = found ? entryFor(open, found[0]) : undefined - if (!found || !entry) break - const word = node.splitText(found.index) - node = word.splitText(found[0].length) - const mark = document.createElement('span') - mark.className = 'term' - mark.tabIndex = 0 - mark.setAttribute('role', 'button') - mark.setAttribute('aria-describedby', 'term-tip') - mark.dataset.term = entry.term - mark.dataset.text = entry.text - word.replaceWith(mark) - mark.append(word) - open = open.filter((e) => e !== entry) - } - } - } -} - -/** Ein gemeinsames Erklärungsfeld für alle markierten Begriffe in `container`. */ -export function attachTermTips(container: HTMLElement) { - const tip = document.createElement('div') - tip.id = 'term-tip' - tip.className = 'term-tip' - tip.setAttribute('role', 'tooltip') - tip.hidden = true - document.body.append(tip) - let current: HTMLElement | undefined - let pinned = false - - const show = (term: HTMLElement) => { - current = term - tip.replaceChildren() - const title = document.createElement('strong') - title.textContent = term.dataset.term ?? '' - tip.append(title, document.createTextNode(' ' + (term.dataset.text ?? ''))) - tip.hidden = false - const r = term.getBoundingClientRect() - const w = tip.offsetWidth - const ht = tip.offsetHeight - const left = Math.max(8, Math.min(r.left, window.innerWidth - w - 8)) - const below = r.bottom + 6 - tip.style.left = `${left}px` - tip.style.top = `${below + ht > window.innerHeight - 8 ? Math.max(8, r.top - ht - 6) : below}px` - term.setAttribute('aria-expanded', 'true') - } - const hide = () => { - current?.setAttribute('aria-expanded', 'false') - current = undefined - pinned = false - tip.hidden = true - } - const termOf = (e: Event) => (e.target as Element | null)?.closest?.('.term') ?? undefined - - container.addEventListener('pointerover', (e) => { - const term = termOf(e) - if (term && e.pointerType === 'mouse' && !pinned) show(term) - }) - container.addEventListener('pointerout', (e) => { - if (termOf(e) && e.pointerType === 'mouse' && !pinned) hide() - }) - container.addEventListener('click', (e) => { - const term = termOf(e) - if (!term) return - if (pinned && current === term) return hide() - show(term) - pinned = true - }) - container.addEventListener('focusin', (e) => { - const term = termOf(e) - if (term && !pinned) show(term) - }) - container.addEventListener('focusout', (e) => { - if (termOf(e) && !pinned) hide() - }) - container.addEventListener('keydown', (e) => { - const term = termOf(e) - if (e.key === 'Escape' && current) hide() - else if (term && (e.key === 'Enter' || e.key === ' ')) { - e.preventDefault() - term.click() - } - }) - container.addEventListener('scroll', hide, true) - document.addEventListener('pointerdown', (e) => { - if (current && !termOf(e) && !tip.contains(e.target as Node)) hide() - }) - /** Nach dem Neuzeichnen des Lernbereichs gehört das Feld zu keinem Begriff mehr. */ - return { hide } -} - -/** - * Zeiger auf den Editor: Ein Link `[Elemente](#zeige-elemente)` im Lektionstext hebt beim Hovern den echten Bereich - * im Editor neben dem Lernbereich hervor. Ein Klick (oder Antippen) öffnet außerdem die Spalte, in der der Bereich - * liegt, auch wenn sie eingeklappt ist. - */ -export const uiTargets: Record = { - leiste: '.topbar > .toolbar', - // Die ganze Spalte Struktogramm-Editor; eingeklappt leuchtet ihre schmale Leiste. - editor: '.editor-rail, .columns > .app', - werkzeuge: '.diagram-tools', - // Eingeklappt leuchtet die schmale Leiste, sonst die Spalte. - dateien: '.files-rail, .files', - codelive: '.live-rail, .livecode', - ausfuehren: '[data-run=play]', - konsole: '.livecode .console', - einzelschritt: '[data-run=step]', - elemente: '.palette', - struktogramm: '.canvas', - objektinspektor: '.inspector', - reiter: '.tabs', - titel: '.caption', - neu: '[data-action=new]', - oeffnen: '[data-action=open]', - speichern: '[data-action=save]', - exportieren: '[data-action=export]', - rueckgaengig: '[data-action=undo]', - loeschen: '[data-action=delete]', - // Textgröße und Sprache liegen im Menü hinter dem Zahnrad. - textgroesse: '[data-action=settings]', - einstellungen: '[data-action=settings]', - lernen: '.learn .learn-hide', - code: '[data-action=code]', - simulation: '[data-action=simulate]', - // Nur in VisuBot: Knopf „Blöcke“ in den Werkzeugen. - bloecke: '[data-action=blocks]', -} - -/** Zeiger auf diese Bereiche brauchen die Struktogramm-Spalte. */ -const editorTargets = new Set(['editor', 'werkzeuge', 'elemente', 'struktogramm', 'objektinspektor', 'reiter', 'titel', 'rueckgaengig', 'loeschen', 'exportieren', 'code', 'simulation', 'bloecke']) - -/** Zeiger auf diese Bereiche brauchen die offene Spalte „Code“ (die schmale Leiste allein reicht nicht). */ -const liveCodeTargets = new Set(['ausfuehren', 'konsole', 'einzelschritt']) - -function pointsInto(root: HTMLElement, targets: Set): boolean { - return [...root.querySelectorAll('.ui-pointer')].some((p) => targets.has(p.dataset.target ?? '')) -} - -/** Eingeklappte Bereiche, die ein Zeiger öffnen kann: Struktogramm-Editor, Elemente, „Code“, Dateien. */ -export type UiArea = 'editor' | 'palette' | 'livecode' | 'files' - -/** Was offen sein muss, damit man den Bereich des Zeigers sieht (die Elemente liegen im Struktogramm-Editor). */ -export function areasOf(key: string): UiArea[] { - if (key === 'elemente') return ['editor', 'palette'] - if (editorTargets.has(key)) return ['editor'] - if (key === 'codelive' || liveCodeTargets.has(key)) return ['livecode'] - if (key === 'dateien') return ['files'] - return [] -} - -/** Zeigt der Text auf die Elemente? */ -export function pointsIntoPalette(root: HTMLElement): boolean { - return pointsInto(root, new Set(['elemente'])) -} - -/** Zeigt der Text auf die Spalte Dateien? */ -export function pointsIntoFiles(root: HTMLElement): boolean { - return pointsInto(root, new Set(['dateien'])) -} - -/** Zeigt der Text auf einen Bereich der Struktogramm-Spalte? */ -export function pointsIntoEditor(root: HTMLElement): boolean { - return pointsInto(root, editorTargets) -} - -/** Zeigt der Text auf einen Bereich der Spalte „Code“? */ -export function pointsIntoLiveCode(root: HTMLElement): boolean { - return pointsInto(root, liveCodeTargets) -} - -export function markPointers(root: HTMLElement) { - for (const a of root.querySelectorAll('a[href^="#zeige-"]')) { - const key = a.getAttribute('href')!.slice('#zeige-'.length) - if (!(key in uiTargets)) continue - const span = document.createElement('span') - span.className = 'ui-pointer' - span.tabIndex = 0 - span.setAttribute('role', 'button') - span.dataset.target = key - span.append(...a.childNodes) - a.replaceWith(span) - } -} - -/** - * `reveal`: eingeklappte Bereiche öffnen; zurück kommt, wie man sie wieder einklappt. Hovern öffnet nur so lange, - * wie die Maus auf dem Wort bleibt; Klicken, Antippen oder Enter lässt den Bereich offen. - */ -export function attachPointers(container: HTMLElement, reveal: (areas: UiArea[]) => () => void = () => () => {}) { - let lit: Element | undefined - let timer: number | undefined - /** Nur vom Hovern geöffnet: so wieder einklappen. */ - let undoHover: (() => void) | undefined - let hoverTimer: number | undefined - let leaveTimer: number | undefined - const off = () => { - lit?.classList.remove('ui-spot') - lit = undefined - window.clearTimeout(timer) - } - const on = (pointer: HTMLElement, forAWhile: boolean) => { - off() - // Bei mehreren Treffern (Spalte oder eingeklappte Leiste) zählt der sichtbare. - const target = [...document.querySelectorAll(uiTargets[pointer.dataset.target ?? ''] ?? ':not(*)')].find((el) => el.getClientRects().length > 0) - if (!target) return - lit = target - target.classList.add('ui-spot') - if (forAWhile) timer = window.setTimeout(off, 2500) - } - /** Nach dem Öffnen hat der Bereich erst im nächsten Bild seinen Platz. */ - const showSoon = (pointer: HTMLElement, forAWhile: boolean) => - requestAnimationFrame(() => { - on(pointer, forAWhile) - lit?.scrollIntoView({ block: 'nearest', inline: 'nearest' }) - }) - const closeHovered = () => { - window.clearTimeout(hoverTimer) - window.clearTimeout(leaveTimer) - undoHover?.() - undoHover = undefined - } - const openAndShow = (pointer: HTMLElement) => { - window.clearTimeout(hoverTimer) - window.clearTimeout(leaveTimer) - // Was das Hovern schon geöffnet hat, bleibt jetzt offen. - undoHover = undefined - reveal(areasOf(pointer.dataset.target ?? '')) - on(pointer, true) - showSoon(pointer, true) - } - const pointerOf = (e: Event) => (e.target as Element | null)?.closest?.('.ui-pointer') ?? undefined - container.addEventListener('pointerover', (e) => { - const p = pointerOf(e) - if (!p || e.pointerType !== 'mouse') return - window.clearTimeout(leaveTimer) - on(p, false) - // Kurz warten: Wer mit der Maus nur über den Text fährt, soll keine Spalten auf- und zuklappen. - window.clearTimeout(hoverTimer) - hoverTimer = window.setTimeout(() => { - if (undoHover) return - const areas = areasOf(p.dataset.target ?? '') - if (areas.length === 0) return - undoHover = reveal(areas) - showSoon(p, false) - }, 250) - }) - container.addEventListener('pointerout', (e) => { - if (!pointerOf(e) || e.pointerType !== 'mouse') return - off() - window.clearTimeout(hoverTimer) - // Etwas Spielraum, falls sich der Text beim Öffnen unter der Maus verschiebt. - window.clearTimeout(leaveTimer) - leaveTimer = window.setTimeout(closeHovered, 400) - }) - container.addEventListener('click', (e) => { - const p = pointerOf(e) - if (p) openAndShow(p) - }) - container.addEventListener('focusin', (e) => { - const p = pointerOf(e) - if (p) on(p, false) - }) - container.addEventListener('focusout', (e) => { - if (pointerOf(e)) off() - }) - container.addEventListener('keydown', (e) => { - const p = pointerOf(e) - if (p && (e.key === 'Enter' || e.key === ' ')) { - e.preventDefault() - openAndShow(p) - } - }) - return { - off: () => { - closeHovered() - off() - }, - } -} diff --git a/web/src/ui/textFileView.ts b/web/src/ui/textFileView.ts deleted file mode 100644 index ea0926f9..00000000 --- a/web/src/ui/textFileView.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { t } from './i18n' - -/** Eine Textdatei wie im Editor: Name oben, darunter der Inhalt mit Zeilennummern. `written`: vom Programm gespeichert. */ -export function textFileView(name: string, content: string, written = false): HTMLElement { - const box = document.createElement('figure') - box.className = written ? 'learn-file written' : 'learn-file' - const caption = document.createElement('figcaption') - const icon = document.createElement('span') - icon.className = 'learn-file-icon' - icon.setAttribute('aria-hidden', 'true') - icon.textContent = '📄' - caption.append(icon, written ? t('web_sim_written_file_fmt', name) : name) - const pre = document.createElement('pre') - pre.className = 'learn-file-text' - pre.dir = 'ltr' - // Am Ende steht meist ein Zeilenumbruch; dahinter beginnt keine neue Zeile. - const lines = content.replace(/\n$/, '').split('\n') - lines.forEach((line, i) => { - const n = document.createElement('span') - n.className = 'ln' - n.textContent = String(i + 1) - pre.append(n, line + '\n') - }) - box.append(caption, pre) - return box -} - -/** Alle Dateien, die ein Programm gespeichert hat. */ -export function writtenFilesView(files: Map): HTMLElement[] { - return [...files].map(([name, content]) => textFileView(name, content, true)) -} diff --git a/web/src/ui/tooltip.ts b/web/src/ui/tooltip.ts deleted file mode 100644 index f9c67552..00000000 --- a/web/src/ui/tooltip.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Tooltips für Symbolknöpfe: Name aus `data-tip`, erscheint kurz nach dem Überfahren oder beim Fokus mit der Tastatur. - * Ein einziges schwebendes Element, damit es am Fensterrand nicht abgeschnitten wird. - */ - -let tip: HTMLElement | undefined -let timer: number | undefined -let current: HTMLElement | undefined - -function show(target: HTMLElement) { - const text = target.dataset.tip - if (!text) return - tip ??= Object.assign(document.createElement('div'), { className: 'tooltip', role: 'tooltip' }) - if (!tip.isConnected) document.body.append(tip) - tip.textContent = text - tip.hidden = false - const r = target.getBoundingClientRect() - const w = tip.offsetWidth - const h = tip.offsetHeight - const left = Math.min(Math.max(8, r.left + r.width / 2 - w / 2), window.innerWidth - w - 8) - const below = r.bottom + 6 + h < window.innerHeight - tip.style.left = `${left}px` - tip.style.top = `${below ? r.bottom + 6 : r.top - h - 6}px` -} - -function hide() { - window.clearTimeout(timer) - timer = undefined - current = undefined - if (tip) tip.hidden = true -} - -export function installTooltips() { - document.addEventListener('pointerover', (e) => { - if (e.pointerType === 'touch') return - const target = (e.target as Element).closest('[data-tip]') - if (target === current) return - hide() - if (!target) return - current = target - timer = window.setTimeout(() => show(target), 350) - }) - document.addEventListener('focusin', (e) => { - const target = (e.target as Element).closest('[data-tip]') - hide() - if (target?.matches(':focus-visible')) show(target) - }) - for (const type of ['pointerdown', 'focusout', 'scroll', 'keydown']) document.addEventListener(type, hide, true) -} diff --git a/web/src/ui/visubot.webp b/web/src/ui/visubot.webp deleted file mode 100644 index 7dc5b040a8fa4d79dade3909766fb21dcb77d090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 E04ZhEH2?qr diff --git a/web/src/ui/visubotModel.ts b/web/src/ui/visubotModel.ts deleted file mode 100644 index 3ad21f73..00000000 --- a/web/src/ui/visubotModel.ts +++ /dev/null @@ -1,157 +0,0 @@ -import type { MBotPart } from '../core/mbot' -import { markdownToHTML } from '../learn/markdown' -import { t } from './i18n' -import type { Robot3D } from './robot3d' - -/** - * Tour durch den mBot2 wie bei JavaPicoGoat: Jeder Schritt einer Lektion zeigt das Modell, die Kamera fährt zu den Teilen, - * um die es geht. Gelb unterstrichene Wörter im Text lassen ihr Teil aufleuchten, Fahren mit der Maus zeigt den Namen. - */ - -export const partName = (part: MBotPart) => t(`web_visubot_part_${part}`) - -interface ModelView { - box: HTMLElement - /** Das Modell, sobald three.js geladen ist */ - ready: Promise - /** Teile, die der Schritt zeigt (leuchten, wenn sonst nichts gewählt ist) */ - focus: MBotPart[] - view?: string -} - -const models = new WeakMap() - -/** Bühne mit dem Modell; `onPick` bekommt das angeklickte Teil. */ -function modelStage(focus: MBotPart[], view: string | undefined, spin: boolean, onPick?: (part: MBotPart) => void): ModelView { - const box = document.createElement('div') - box.className = 'visubot-model' - const stage = document.createElement('div') - stage.className = 'visubot-stage' - const label = document.createElement('div') - label.className = 'visubot-part-label' - label.hidden = true - stage.append(label) - const showLabel = (part: MBotPart, x: number, y: number) => { - label.hidden = false - label.textContent = partName(part) - label.style.left = `${Math.min(x + 12, stage.clientWidth - 140)}px` - label.style.top = `${y + 12}px` - } - const hint = document.createElement('p') - hint.className = 'visubot-model-hint hint' - hint.textContent = t('web_visubot_tap_part') - hint.hidden = !!onPick - box.append(stage, hint) - const ready = import('./robot3d') - .then(({ Robot3D }) => { - const robot = new Robot3D(stage) - robot.showcase() - robot.highlight(focus) - // Geht es um die LEDs, leuchten sie blau wie nach dem Einschalten. - if (focus.includes('leds')) robot.setLed([40, 90, 255]) - // Zuerst etwas weiter weg, dann zu den Teilen fliegen: so sieht man, wo sie am Roboter sitzen. - robot.focusOn([], view === 'unten' || view === 'bottom' ? '' : view, false, 1) - robot.focusOn(focus, view, spin) - let down: { x: number; y: number } | undefined - stage.addEventListener('pointerdown', (e) => (down = { x: e.clientX, y: e.clientY })) - stage.addEventListener('pointerup', (e) => { - if (!down || Math.hypot(e.clientX - down.x, e.clientY - down.y) > 5) return - const part = robot.partAt(e.clientX, e.clientY) - if (!part) return - if (onPick) return onPick(part) - // Antippen zeigt das Teil und seinen Namen (auch ohne Maus) - robot.highlight(part) - const r = stage.getBoundingClientRect() - showLabel(part, e.clientX - r.left, e.clientY - r.top) - }) - // Name des Teils unter der Maus - stage.addEventListener('pointermove', (e) => { - // Im Suchspiel verrät der Name die Antwort. - if (e.pointerType !== 'mouse' || onPick) return - const part = robot.partAt(e.clientX, e.clientY) - label.hidden = !part - if (!part) return - const r = stage.getBoundingClientRect() - showLabel(part, e.clientX - r.left, e.clientY - r.top) - }) - stage.addEventListener('pointerleave', () => (label.hidden = true)) - return robot - }) - .catch((err: unknown) => { - console.error(err) - stage.textContent = t('web_visubot_no_3d') - return undefined - }) - const model: ModelView = { box, ready, focus, view } - models.set(box, model) - return model -} - -/** Lektionsblock `::: mbot2`. */ -export function renderRobotModel(focus: MBotPart[], view?: string, spin = false): HTMLElement { - return modelStage(focus, view, spin).box -} - -/** - * Gelb unterstrichene Wörter (`[Wort]{teil=…}`) mit dem Modell im selben Schritt verbinden: - * Zeigen lässt das Teil aufleuchten, Antippen fährt die Kamera hin. - */ -export function wireRobotLinks(root: HTMLElement) { - const box = root.querySelector('.visubot-model') - const model = box && models.get(box) - for (const link of root.querySelectorAll('[data-robot-part]')) { - const parts = (link.dataset.robotPart ?? '').split(',').filter(Boolean) as MBotPart[] - link.title = parts.map(partName).join(', ') - if (!model) continue - const show = () => void model.ready.then((r) => r?.highlight(parts)) - const back = () => void model.ready.then((r) => r?.highlight(model.focus)) - link.addEventListener('mouseenter', show) - link.addEventListener('focus', show) - link.addEventListener('mouseleave', back) - link.addEventListener('blur', back) - link.addEventListener('click', () => { - void model.ready.then((r) => { - r?.highlight(parts) - r?.focusOn(parts, model.view) - }) - model.box.scrollIntoView({ block: 'nearest', behavior: 'smooth' }) - }) - } -} - -/** Lektionsblock `::: mbot2quiz`: nacheinander das gesuchte Teil im Modell anklicken. */ -export function renderRobotQuiz(tasks: { part: MBotPart; question: string }[], done?: string): HTMLElement { - let index = 0 - const question = document.createElement('div') - question.className = 'visubot-quiz-question' - const feedback = document.createElement('p') - feedback.className = 'visubot-quiz-feedback' - feedback.setAttribute('aria-live', 'polite') - const ask = () => { - question.innerHTML = markdownToHTML(`**${index + 1}/${tasks.length}** ${tasks[index].question}`) - } - const model = modelStage([], undefined, false, (part) => { - if (index >= tasks.length) return - void model.ready.then((r) => r?.highlight(part)) - if (part !== tasks[index].part) { - feedback.className = 'visubot-quiz-feedback wrong' - feedback.textContent = t('web_visubot_quiz_wrong_fmt', partName(part)) - return - } - index++ - feedback.className = 'visubot-quiz-feedback right' - if (index < tasks.length) { - feedback.textContent = `✓ ${t('web_visubot_quiz_right')}` - ask() - } else { - feedback.textContent = '' - question.innerHTML = markdownToHTML(`✓ ${done ?? t('web_visubot_quiz_right')}`) - question.classList.add('done') - } - }) - ask() - const box = document.createElement('div') - box.className = 'visubot-quiz' - box.append(question, model.box, feedback) - return box -} diff --git a/web/src/ui/visubotView.ts b/web/src/ui/visubotView.ts deleted file mode 100644 index 63ed2404..00000000 --- a/web/src/ui/visubotView.ts +++ /dev/null @@ -1,536 +0,0 @@ -import { MBOT_SENSORS, mbotColorName, type MBotAction, type MBotSensorValues } from '../core/mbot' -import { HELLO, mbotLink, showLabel } from '../core/mbotLink' -import { ElementType, makeElement, type VSElement } from '../core/model' -import { emptyWorld, ROBOT_STEP_MS, RobotWorld, type RobotWorldSetup } from '../core/robotWorld' -import type { SimulationEngine } from '../core/simulation' -import { currentLanguage, t } from './i18n' -import { hostWorld, visucodeURL } from './site' -import type { VisuBotMode } from '../learn/content' -import type { Robot3D } from './robot3d' -import visuBotLogoURL from './visubot.webp' - -/** - * Welt, gespeichert im Browser: VisuStruct (`0`), VisuBot (`1`), VisuObject (`2`) oder VisuFlow (`3`). - * Der frühere Modus „Im Kurs“ (`kurs`) gilt jetzt als VisuBot. - */ -declare const __APP_VERSION__: string - -const modeKey = 'visustruct.visubot' - -function storedMode(): string | null { - try { - return localStorage.getItem(modeKey) - } catch { - return null - } -} - -export function visuBotMode(): VisuBotMode { - const value = storedMode() - return value === '1' || value === 'kurs' ? 'on' : 'off' -} - -/** Welt VisuObject: Klassendiagramm und Java statt Struktogramm (eigene Oberfläche, `objectApp.ts`). */ -export const visuObjectWorld = () => storedMode() === '2' - -export function setVisuObjectWorld() { - try { - localStorage.setItem(modeKey, '2') - } catch { - /* ohne Speicher nur für diese Sitzung */ - } -} - -/** Welt VisuFlow: PAP (flowchart) zeichnen, eigene Oberfläche (`flowApp.ts`). */ -export const visuFlowWorld = () => storedMode() === '3' - -export function setVisuFlowWorld() { - try { - localStorage.setItem(modeKey, '3') - } catch { - /* ohne Speicher nur für diese Sitzung */ - } -} - -/** Welt aus der Auswahl: `off` VisuStruct, `on` VisuBot, `object` VisuObject, `flow` VisuFlow. */ -export type WorldChoice = VisuBotMode | 'object' | 'flow' - -/** Hat man schon einmal zwischen VisuStruct und VisuBot gewählt? Sonst fragt der Start-Dialog. */ -export const worldChosen = () => storedMode() !== null - -export function setVisuBotMode(mode: VisuBotMode) { - try { - localStorage.setItem(modeKey, mode === 'on' ? '1' : '0') - } catch { - /* ohne Speicher nur für diese Sitzung */ - } -} - -/** Kopfzeile im VisuBot-Modus: der Roboter aus dem VisuBot-Logo und „Visu“ + orangefarbenes „Bot“. */ -export const visuBotBrand = `VisuBot` - -/** Gibt es mBot2-Kästen und den 3D-Simulator? (Nur in der Welt VisuBot.) */ -export const visuBotEnabled = () => visuBotMode() !== 'off' - -const escapeHTML = (s: string) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]!) - -/** - * Auswahl der Welt für Zahnrad und Start-Dialog; die Knöpfe tragen `data-world`. - * Auf einer Welt-Subdomain (visubot.visucode.de …) hat man die Welt schon gewählt: Dort gibt es nur die Welten dieser - * Seite, also keine Knöpfe, nur einen Link auf VisuCode. - */ -export function worldChooserHTML(): string { - const current: WorldChoice = visuObjectWorld() ? 'object' : visuFlowWorld() ? 'flow' : visuBotMode() - const site = hostWorld() - const all: [WorldChoice, string][] = [['off', 'VisuStruct'], ['on', 'VisuBot'], ['object', 'VisuObject'], ['flow', 'VisuFlow']] - const shown = site ? [] : all - const button = ([mode, label]: [WorldChoice, string]) => - `` - const hint = { off: 'web_visubot_world_visustruct_hint', on: 'web_visubot_world_visubot_hint', object: 'web_visuobject_world_hint', flow: 'web_visuflow_world_hint' }[current] - const buttons = shown.length - ? `
    ${shown.map(button).join('')}
    ` - : '' - return site - ? `${buttons}${visucodeLinkHTML()}` - : `${buttons} - ${escapeHTML(t(hint))}` -} - -/** Name der Welt der Subdomain für den Start-Dialog, z. B. „Visu“ + orangefarbenes „Bot“. */ -export function worldBrandHTML(): string { - const site = hostWorld() - return site === 'visubot' ? visuBotBrand : site === 'visuobject' ? 'VisuObject' : 'VisuStruct' -} - -/** Überschrift „Womit möchtest du arbeiten?“ im Zahnrad; entfällt auf den Welt-Subdomains (dort gibt es nichts zu wählen). */ -export function worldTitleHTML(): string { - const site = hostWorld() - return site ? '' : `

    ${escapeHTML(t('web_visubot_world_title'))}

    ` -} - -/** Marke „VisuCode“ als Link auf visucode.de, wo man ein anderes Programm wählt. */ -export function visucodeLinkHTML(): string { - const url = visucodeURL(currentLanguage()) - // Nur die anderen Programme nennen: wer in VisuBot ist, braucht keinen Hinweis auf VisuBot. - const own = { visustruct: 'VisuStruct', visubot: 'VisuBot', visuobject: 'VisuObject' }[hostWorld() ?? 'visustruct'] - const others = ['VisuStruct', 'VisuBot', 'VisuObject', 'VisuStudio'].filter((name) => name !== own) - return `

    VisuCode - ${escapeHTML(t('web_visubot_world_visucode_hint').replace('%1$@', others.slice(0, -1).join(', ')).replace('%2$@', others.at(-1)!)).replace('visucode.de', `visucode.de`)} - ${escapeHTML(t('web_about_version_fmt').replace('%@', __APP_VERSION__))} · Holger Sebastiao · sebastiao.org

    ` -} - -/** - * Simulator-Bereich im Simulationspanel: Welt von oben/schräg in 3D, darunter Sensorwerte. - * three.js wird erst geladen, wenn der Bereich das erste Mal gebraucht wird. - */ -export class VisuBotView { - readonly element: HTMLElement - world: RobotWorld - private view?: Robot3D - private loading?: Promise - private status: HTMLElement - private stage: HTMLElement - private picker: HTMLElement - private applied = 0 - /** Befehle, die der echte mBot2 schon gefahren ist. */ - private sent = 0 - private liveStatus: HTMLElement - /** Welten-Knöpfe, 3D-Ansicht und Messwerte: stehen während der Simulation im Fenster „mBot2 live“. */ - readonly viewport: HTMLElement - private stopListening: () => void - private realSensors?: MBotSensorValues - /** Regler und Knöpfe „Sensoren ausprobieren“: Werte, die keine Welt liefert. */ - private controls: MBotSensorValues = { getBrightness: 50, getLoudness: 0, getPitch: 0, getRoll: 0 } - private pressTimers = new Map() - /** „mBot2 testen“: alle Sensoren live und Knöpfe für die Aktoren (nur mit echtem mBot2) */ - private check: HTMLDetailsElement - private checking = false - /** Nach dem Umschalten der Welt: Simulation von vorn (setzt das Simulationspanel). */ - onWorldChange?: () => void - - constructor(setup: RobotWorldSetup = emptyWorld) { - this.world = new RobotWorld(setup) - this.element = document.createElement('section') - this.element.className = 'visubot' - this.element.innerHTML = `

    ${t('web_visubot_world')}

    ${t('web_visubot_world_in_preview')}

    ${controlsHTML()}${checkHTML()}` - this.stage = this.element.querySelector('.visubot-stage')! - this.picker = this.element.querySelector('.visubot-worlds')! - this.status = this.element.querySelector('.visubot-status')! - this.liveStatus = this.element.querySelector('.visubot-live')! - this.viewport = this.element.querySelector('.visubot-viewport')! - this.stopListening = mbotLink.listen(() => this.updateLive()) - this.setupControls() - this.check = this.element.querySelector('.visubot-check')! - this.setupCheck() - this.updateLive() - this.updateStatus() - } - - /** 3D-Ansicht aufbauen (beim ersten Einblenden). */ - show() { - this.loading ??= import('./robot3d').then(({ Robot3D }) => { - this.view = new Robot3D(this.stage) - this.view.setWorld(this.world.setup) - this.view.place(this.world.pose, this.world.trail) - this.view.setLeds(this.world.leds) - }).catch(() => { - this.stage.textContent = t('web_visubot_no_3d') - }) - } - - /** 3D-Ansicht zurück ins Simulationspanel (wenn „mBot2 live“ zu ist oder die Simulation endet). */ - restoreViewport() { - if (this.viewport.parentElement !== this.element) this.liveStatus.after(this.viewport) - } - - /** - * Welten einer Übung (Labyrinth usw.): Knöpfe zum Umschalten über der Ansicht; leer = freie Fläche. - * Programme laufen in der gewählten Welt. - */ - setWorlds(worlds: RobotWorldSetup[]) { - this.picker.replaceChildren() - this.picker.hidden = worlds.length < 2 - worlds.forEach((setup, i) => { - const b = document.createElement('button') - b.textContent = t('web_visubot_world_fmt', i + 1) - b.addEventListener('click', () => this.useWorld(setup, b)) - this.picker.append(b) - }) - this.useWorld(worlds[0] ?? emptyWorld, this.picker.firstElementChild as HTMLElement | null) - } - - private useWorld(setup: RobotWorldSetup, button: HTMLElement | null) { - for (const b of this.picker.children) b.classList.toggle('active', b === button) - if (setup === this.world.setup) return - this.world = new RobotWorld(setup) - this.applied = 0 - this.sent = 0 - this.view?.setWorld(setup) - this.view?.place(this.world.pose, this.world.trail) - this.view?.setLed(undefined) - this.view?.setScreen(undefined) - this.updateStatus() - this.onWorldChange?.() - } - - reset() { - this.world.reset() - this.applied = 0 - this.sent = 0 - this.realSensors = undefined - this.view?.place(this.world.pose, this.world.trail) - this.view?.setLed(undefined) - this.view?.setScreen(undefined) - this.updateStatus() - } - - /** Vor einem Schritt: Sensorwerte der Welt und der Regler an die Simulation geben. */ - prepare(engine: SimulationEngine) { - engine.robotSensors = { ...this.controls, ...this.world.sensors() } - } - - private setupControls() { - for (const range of this.element.querySelectorAll('.visubot-controls input[type=range]')) { - const out = range.parentElement!.querySelector('output')! - const update = () => { - this.controls[range.name] = Number(range.value) - out.textContent = range.value - } - range.addEventListener('input', update) - update() - } - // Tasten, Joystick, Schütteln: eine Sekunde lang „gedrückt“, damit die Simulation es im nächsten Schritt sieht - for (const button of this.element.querySelectorAll('.visubot-controls button[name]')) { - button.addEventListener('click', () => { - const name = button.name - this.controls[name] = true - button.classList.add('pressed') - window.clearTimeout(this.pressTimers.get(name)) - this.pressTimers.set( - name, - window.setTimeout(() => { - this.controls[name] = false - button.classList.remove('pressed') - }, 1000), - ) - }) - } - } - - private setupCheck() { - for (const button of this.check.querySelectorAll('button[data-py]')) { - button.addEventListener('click', () => { - // `data-after`: nach `data-wait` Millisekunden zurück (Räder anhalten, wieder „Hallo VisuBot!“ zeigen) - const { after, wait } = button.dataset - void mbotLink - .run(button.dataset.py!) - .then(() => (after ? new Promise((r) => setTimeout(r, Number(wait))).then(() => mbotLink.run(after)) : undefined)) - .catch((e: Error) => this.liveFailed(e)) - }) - } - this.check.addEventListener('toggle', () => void this.readCheck()) - } - - /** Solange „mBot2 testen“ offen ist: alle Sensoren reihum lesen und zeigen. */ - private async readCheck() { - if (this.checking) return - this.checking = true - try { - while (this.check.open && mbotLink.connected) { - for (const cell of this.check.querySelectorAll('[data-sensor]')) { - if (!this.check.open || !mbotLink.connected) break - const name = cell.dataset.sensor! - const value = await mbotLink.ask(MBOT_SENSORS[name].python).catch(() => undefined) - if (value === undefined) continue - cell.textContent = - typeof MBOT_SENSORS[name].simulated === 'boolean' - ? value === true || (typeof value === 'number' && value !== 0) ? '✓' : '–' - : String(typeof value === 'number' ? Math.round(value * 10) / 10 : value) - } - await new Promise((r) => setTimeout(r, 200)) - } - } finally { - this.checking = false - } - } - - /** Fährt der echte mBot2 mit? */ - get live(): boolean { - return mbotLink.connected - } - - /** - * Vor einem Schritt mit dem echten mBot2: seine Sensoren lesen (statt Welt und Reglern). - * Abstand und Linie immer, die übrigen nur, wenn das Programm sie benutzt (`used`), damit ein Schritt schnell bleibt. - */ - async prepareLive(engine: SimulationEngine, used: string[] = []) { - const values: MBotSensorValues = {} - for (const name of new Set(['getDistance', 'getLine', ...used])) { - const value = await mbotLink.ask(MBOT_SENSORS[name].python) - // Ja/Nein-Sensoren antworten mit 0 oder 1 statt False/True (getestet am echten mBot2). - if (typeof MBOT_SENSORS[name].simulated === 'boolean') values[name] = value === true || (typeof value === 'number' && value !== 0) - else if (typeof MBOT_SENSORS[name].simulated === 'string') values[name] = typeof value === 'string' ? value : String(MBOT_SENSORS[name].simulated) - else values[name] = typeof value === 'number' ? (name === 'getDistance' ? Math.round(value) : value) : 0 - } - this.realSensors = values - engine.robotSensors = { ...this.controls, ...this.world.sensors(), ...values } - } - - /** Nach einem Schritt: neue Befehle an den echten mBot2; kehrt zurück, wenn er fertig gefahren ist. */ - async drive(actions: MBotAction[]) { - for (; this.sent < actions.length; this.sent++) { - const action = actions[this.sent] - if (action.python) await mbotLink.run(action.python) - else if (action.method === 'pause') await new Promise((r) => setTimeout(r, action.args[0])) - } - } - - /** Nach einem Fehler der Verbindung: trennen und Grund zeigen. */ - liveFailed(error: unknown) { - void mbotLink.disconnect(error instanceof Error ? error.message : String(error)) - } - - private updateLive() { - this.liveStatus.textContent = mbotLinkText() - this.liveStatus.classList.toggle('connected', mbotLink.connected) - this.check.hidden = !mbotLink.connected - if (!mbotLink.connected) this.check.open = false - this.updateStatus() - } - - /** Nach einem Schritt: neue Befehle ausführen und in `ms` Millisekunden zeigen. */ - follow(actions: MBotAction[], ms: number) { - for (; this.applied < actions.length; this.applied++) { - const action = actions[this.applied] - this.world.apply(action) - // Ton im Browser hören (der echte mBot2 spielt ihn selbst) - if (action.method === 'playTone' && !this.live) playTone(action.args[0], action.args[1]) - this.view?.moveTo(this.world.pose, this.world.trail, ms) - this.view?.setLeds(this.world.leds) - this.view?.setScreen(this.world.screen) - } - // Mit `mbot.drive` fährt er auch ohne neuen Befehl weiter - const moving = this.world.wheels.some((p) => p !== 0) - this.world.tick(ROBOT_STEP_MS) - if (moving) this.view?.moveTo(this.world.pose, this.world.trail, ms) - this.updateStatus() - } - - dispose() { - this.stopListening() - for (const timer of this.pressTimers.values()) window.clearTimeout(timer) - this.view?.dispose() - this.view = undefined - this.loading = undefined - } - - private updateStatus() { - const line = this.world.lineState().toString(2).padStart(4, '0') - const parts = [ - `${t('web_visubot_distance')}: ${this.world.distance()} cm`, - `${t('web_visubot_line')}: ${line}`, - ] - if (this.world.bumps > 0) parts.push(`⚠︎ ${t('web_visubot_bumps')}: ${this.world.bumps}`) - if (this.world.screen !== undefined) parts.push(`📺 ${this.world.screen}`) - if (this.realSensors && mbotLink.connected) - parts.push(`🤖 ${t('web_visubot_distance')}: ${this.realSensors.getDistance} cm · ${t('web_visubot_line')}: ${Number(this.realSensors.getLine).toString(2).padStart(4, '0')}`) - this.status.textContent = parts.join(' · ') - } -} - -let audio: AudioContext | undefined - -/** Kurzer Ton über die Lautsprecher des Computers, wie der Lautsprecher des CyberPi. */ -export function playTone(hz: number, ms: number) { - try { - audio ??= new AudioContext() - const osc = audio.createOscillator() - const gain = audio.createGain() - osc.type = 'square' - osc.frequency.value = Math.max(20, Math.min(20000, hz)) - gain.gain.value = 0.05 - osc.connect(gain).connect(audio.destination) - const end = audio.currentTime + Math.min(Math.max(ms, 0), 5000) / 1000 - osc.start() - osc.stop(end) - } catch { - /* ohne Ton weiter */ - } -} - -/** Regler und Knöpfe für Sensoren, die keine Welt liefert (Licht, Lautstärke, Neigung, Tasten, Joystick, Schütteln). */ -function controlsHTML(): string { - const range = (name: string, key: string, min: number, max: number, value: number) => - `` - const press = (name: string, text: string, key: string) => `` - return `
    🎛 ${t('web_visubot_controls')} -

    ${t('web_visubot_controls_hint')}

    - ${range('getBrightness', 'web_visubot_sensor_brightness', 0, 100, 50)} - ${range('getLoudness', 'web_visubot_sensor_loudness', 0, 100, 0)} - ${range('getPitch', 'web_visubot_sensor_pitch', -90, 90, 0)} - ${range('getRoll', 'web_visubot_sensor_roll', -90, 90, 0)} -
    - ${press('isButtonA', 'A', 'web_visubot_sensor_button_a')}${press('isButtonB', 'B', 'web_visubot_sensor_button_b')} - ${press('isJoystickUp', '↑', 'web_visubot_sensor_joy_up')}${press('isJoystickDown', '↓', 'web_visubot_sensor_joy_down')} - ${press('isJoystickLeft', '←', 'web_visubot_sensor_joy_left')}${press('isJoystickRight', '→', 'web_visubot_sensor_joy_right')} - ${press('isShaken', `〰 ${t('web_visubot_shake')}`, 'web_visubot_sensor_shake')} -
    -
    ` -} - -/** „mBot2 testen“: jeden Aktor einmal auslösen, jeden Sensor live ablesen (wie die Labor-Seite). */ -function checkHTML(): string { - const attr = (py: string) => py.replace(/"/g, '"') - const act = (py: string, key: string, after?: string, wait = 1000) => - `` - const stop = "mbot2.EM_stop('ALL')" - const sensors = visuBotSensors - .map((s) => `${t(s.key)}…`) - .join('') - return `` -} - -/** Kurzer Zustand der Verbindung zum echten mBot2 (leer, wenn nicht verbunden und kein Fehler). */ -export function mbotLinkText(): string { - if (mbotLink.connecting) return t('web_visubot_connecting') - if (mbotLink.connected) return `✓ ${t('web_visubot_connected')}` - return mbotLink.error ? `⚠︎ ${t('web_visubot_link_error')}: ${mbotLink.error}` : '' -} - -/** Mit dem echten mBot2 verbinden bzw. trennen (Knopf in der Werkzeugleiste und in den Einstellungen). */ -export async function toggleMBotLink() { - if (mbotLink.connected || mbotLink.connecting) return mbotLink.disconnect() - try { - await mbotLink.connect() - } catch (e) { - // Abbrechen der Auswahl ist kein Fehler - await mbotLink.disconnect((e as Error).name === 'NotFoundError' ? undefined : (e as Error).message) - } -} - -/** Zusätzliche Elemente im VisuBot-Modus: fertig beschriftete Kästen zum Reinziehen. */ -export interface VisuBotTemplate { - /** Schlüssel des Namens in der Palette */ - key: string - /** Gruppe in der Palette wie im Nachschlagen (`web_visubot_group_…`) */ - group: string - type: ElementType - make: () => VSElement -} - -const statement = (text: string) => () => makeElement(ElementType.anweisung, { textLines: [text] }) - -export const visuBotTemplates: VisuBotTemplate[] = [ - { key: 'web_visubot_el_forward', group: 'drive', type: ElementType.anweisung, make: statement('mbot.forward()') }, - { key: 'web_visubot_el_backward', group: 'drive', type: ElementType.anweisung, make: statement('mbot.backward()') }, - { key: 'web_visubot_el_right', group: 'drive', type: ElementType.anweisung, make: statement('mbot.turnRight()') }, - { key: 'web_visubot_el_left', group: 'drive', type: ElementType.anweisung, make: statement('mbot.turnLeft()') }, - { key: 'web_visubot_el_drive', group: 'wheels', type: ElementType.anweisung, make: statement('mbot.drive(30, 30)') }, - { key: 'web_visubot_el_stop', group: 'wheels', type: ElementType.anweisung, make: statement('mbot.stop()') }, - { key: 'web_visubot_el_led', group: 'leds', type: ElementType.anweisung, make: statement('mbot.setLed(255, 0, 0)') }, - { key: 'web_visubot_el_led_off', group: 'leds', type: ElementType.anweisung, make: statement('mbot.ledOff()') }, - { key: 'web_visubot_el_led_color', group: 'leds', type: ElementType.anweisung, make: statement('mbot.led(0).setColor("grün")') }, - { key: 'web_visubot_el_tone', group: 'sound', type: ElementType.anweisung, make: statement('mbot.playTone(440, 300)') }, - { key: 'web_visubot_el_text', group: 'screen', type: ElementType.anweisung, make: statement('mbot.showText("Hallo")') }, - { key: 'web_visubot_el_emotion', group: 'emotion', type: ElementType.anweisung, make: statement('mbot.emotion("smile")') }, - { key: 'web_visubot_el_wait', group: 'wait', type: ElementType.anweisung, make: statement('mbot.pause(100)') }, - { key: 'web_visubot_el_timer', group: 'wait', type: ElementType.anweisung, make: statement('mbot.resetTimer()') }, -] - -/** Farbe der Gruppe (Streifen in der Palette, Punkt im Nachschlagen `{.bot-…}`): Fahren orange, Licht gelbgrün, - * Ton magenta, Bildschirm/Gefühle indigo, Warten grau, alle Sensoren türkis. Der Kasten selbst bleibt gelb. */ -export function visuBotGroupColor(group: string): string { - const colors: Record = { drive: 'fahren', wheels: 'fahren', leds: 'licht', sound: 'ton', screen: 'anzeige', emotion: 'anzeige', wait: 'warten' } - return colors[group] ?? 'sensor' -} - -/** Symbol jeder Gruppe (Palette und Nachschlagen): Symbole merkt man sich leichter als viele Farbtöne. */ -export const visuBotGroupIcon: Record = { - drive: '🚗', - wheels: '⚙️', - leds: '💡', - sound: '🔊', - screen: '🖥️', - emotion: '😊', - wait: '⏱️', - distance: '📏', - line: '➖', - color: '🎨', - buttons: '🕹️', - light: '🔆', - tilt: '📐', - timer: '🔋', -} - -/** Sensoren: Werte, die die Schüler selbst in eine Bedingung einbauen (`mbot.getDistance() < 20`). */ -export const visuBotSensors: { key: string; group: string; text: string }[] = [ - { key: 'web_visubot_sensor_distance', group: 'distance', text: 'mbot.getDistance()' }, - { key: 'web_visubot_sensor_line', group: 'line', text: 'mbot.getLine()' }, - { key: 'web_visubot_sensor_line_left', group: 'line', text: 'mbot.isLineLeft()' }, - { key: 'web_visubot_sensor_line_right', group: 'line', text: 'mbot.isLineRight()' }, - // Farbname in der Sprache der Lektionen ("rot" oder "red") - { key: 'web_visubot_sensor_color', group: 'color', get text() { return `mbot.getColor().equals("${mbotColorName('red')}")` } }, - { key: 'web_visubot_sensor_button_a', group: 'buttons', text: 'mbot.isButtonA()' }, - { key: 'web_visubot_sensor_button_b', group: 'buttons', text: 'mbot.isButtonB()' }, - { key: 'web_visubot_sensor_joy_up', group: 'buttons', text: 'mbot.isJoystickUp()' }, - { key: 'web_visubot_sensor_joy_down', group: 'buttons', text: 'mbot.isJoystickDown()' }, - { key: 'web_visubot_sensor_joy_left', group: 'buttons', text: 'mbot.isJoystickLeft()' }, - { key: 'web_visubot_sensor_joy_right', group: 'buttons', text: 'mbot.isJoystickRight()' }, - { key: 'web_visubot_sensor_brightness', group: 'light', text: 'mbot.getBrightness()' }, - { key: 'web_visubot_sensor_loudness', group: 'light', text: 'mbot.getLoudness()' }, - { key: 'web_visubot_sensor_pitch', group: 'tilt', text: 'mbot.getPitch()' }, - { key: 'web_visubot_sensor_roll', group: 'tilt', text: 'mbot.getRoll()' }, - { key: 'web_visubot_sensor_shake', group: 'tilt', text: 'mbot.isShaken()' }, - { key: 'web_visubot_sensor_timer', group: 'timer', text: 'mbot.getTimer()' }, - { key: 'web_visubot_sensor_battery', group: 'timer', text: 'mbot.getBattery()' }, -] diff --git a/web/src/ui/workspaceStore.ts b/web/src/ui/workspaceStore.ts deleted file mode 100644 index b3181773..00000000 --- a/web/src/ui/workspaceStore.ts +++ /dev/null @@ -1,220 +0,0 @@ -/** - * Speicherort des Workspace: ein echter Ordner (Chrome/Edge, File System Access API) oder, - * wo der Browser das nicht kann (iPad, Safari, Firefox), ein Ordnerbaum in IndexedDB. - * Beide sehen für die Spalte „Dateien“ gleich aus (`WsDir`). - */ - -export interface WsEntry { - kind: 'file' | 'directory' - name: string -} - -export interface WsDir { - readonly name: string - list(): Promise - /** Unterordner; ohne `create` Fehler, wenn er fehlt. */ - dir(name: string, create?: boolean): Promise - read(name: string): Promise - write(name: string, text: string): Promise - has(name: string): Promise - /** Datei oder Ordner samt Inhalt. */ - remove(name: string): Promise -} - -// MARK: - Echter Ordner - -// Teile der File System Access API, die TypeScript noch nicht kennt. -type PermissionHandle = FileSystemDirectoryHandle & { - queryPermission?(o: { mode: 'readwrite' }): Promise - requestPermission?(o: { mode: 'readwrite' }): Promise - values(): AsyncIterable -} -type DirectoryPickerWindow = Window & { showDirectoryPicker?: (o?: object) => Promise } - -export const canPickFolder = () => typeof (window as DirectoryPickerWindow).showDirectoryPicker === 'function' - -class NativeDir implements WsDir { - constructor(readonly handle: FileSystemDirectoryHandle) {} - - get name() { - return this.handle.name - } - - async list(): Promise { - const out: WsEntry[] = [] - for await (const entry of (this.handle as PermissionHandle).values()) { - if (entry.name.startsWith('.')) continue - out.push({ kind: entry.kind, name: entry.name }) - } - return out - } - - async dir(name: string, create = false): Promise { - return new NativeDir(await this.handle.getDirectoryHandle(name, { create })) - } - - async read(name: string): Promise { - return (await (await this.handle.getFileHandle(name)).getFile()).text() - } - - async write(name: string, text: string): Promise { - const file = await this.handle.getFileHandle(name, { create: true }) - const out = await file.createWritable() - await out.write(text) - await out.close() - } - - async has(name: string): Promise { - try { - await this.handle.getFileHandle(name) - return true - } catch { - try { - await this.handle.getDirectoryHandle(name) - return true - } catch { - return false - } - } - } - - async remove(name: string): Promise { - await this.handle.removeEntry(name, { recursive: true }) - } -} - -// MARK: - Im Browser (IndexedDB) - -const dbName = 'visustruct-workspace' - -function openDB(): Promise { - return new Promise((resolve, reject) => { - const req = indexedDB.open(dbName, 1) - req.onupgradeneeded = () => { - req.result.createObjectStore('files') - req.result.createObjectStore('meta') - } - req.onsuccess = () => resolve(req.result) - req.onerror = () => reject(req.error) - }) -} - -async function run(store: 'files' | 'meta', mode: IDBTransactionMode, body: (s: IDBObjectStore) => IDBRequest): Promise { - const db = await openDB() - return new Promise((resolve, reject) => { - const req = body(db.transaction(store, mode).objectStore(store)) - req.onsuccess = () => resolve(req.result) - req.onerror = () => reject(req.error) - }) -} - -/** Pfade wie `11FI1/2026-10-23/Rechner.visustruct`; ein Ordner ist ein Eintrag mit `/` am Ende. */ -class BrowserDir implements WsDir { - constructor( - readonly name: string, - private path: string, - ) {} - - private key(name: string) { - return this.path + name - } - - async list(): Promise { - const keys = (await run('files', 'readonly', (s) => s.getAllKeys())) as string[] - const seen = new Map() - for (const key of keys) { - if (!key.startsWith(this.path) || key === this.path) continue - const rest = key.slice(this.path.length) - const slash = rest.indexOf('/') - const name = slash < 0 ? rest : rest.slice(0, slash) - if (!seen.has(name)) seen.set(name, { kind: slash < 0 ? 'file' : 'directory', name }) - } - return [...seen.values()] - } - - async dir(name: string, create = false): Promise { - const key = this.key(name) + '/' - const exists = (await run('files', 'readonly', (s) => s.count(key))) > 0 - if (!exists) { - if (!create) throw new DOMException(name, 'NotFoundError') - await run('files', 'readwrite', (s) => s.put('', key)) - } - return new BrowserDir(name, key) - } - - async read(name: string): Promise { - const text = await run('files', 'readonly', (s) => s.get(this.key(name))) - if (typeof text !== 'string') throw new DOMException(name, 'NotFoundError') - return text - } - - async write(name: string, text: string): Promise { - await run('files', 'readwrite', (s) => s.put(text, this.key(name))) - } - - async has(name: string): Promise { - const n = await run('files', 'readonly', (s) => s.count(this.key(name))) - const d = await run('files', 'readonly', (s) => s.count(this.key(name) + '/')) - return n + d > 0 - } - - async remove(name: string): Promise { - const prefix = this.key(name) - await run('files', 'readwrite', (s) => s.delete(prefix)) - // Ordner: alles darunter (Schlüssel von `prefix/` bis `prefix/￿`). - await run('files', 'readwrite', (s) => s.delete(IDBKeyRange.bound(prefix + '/', prefix + '/￿'))) - } -} - -// MARK: - Welcher Workspace - -export type WorkspaceKind = 'folder' | 'browser' - -export interface Workspace { - kind: WorkspaceKind - root: WsDir -} - -/** - * Ordner wählen (nur Chrome/Edge). Der Ordner wird gemerkt, damit er nach dem Neuladen wieder da ist. - * Mit `create` wird darin ein Ordner dieses Namens angelegt (oder der vorhandene genommen) und benutzt. - */ -export async function pickFolder(create?: string, slot = 'folder'): Promise { - const picked = await (window as DirectoryPickerWindow).showDirectoryPicker!({ id: slot === 'folder' ? 'visustruct-workspace' : slot, mode: 'readwrite' }) - const handle = create && picked.name !== create ? await picked.getDirectoryHandle(create, { create: true }) : picked - await run('meta', 'readwrite', (s) => s.put(handle, slot)) - return { kind: 'folder', root: new NativeDir(handle) } -} - -export function browserWorkspace(): Workspace { - return { kind: 'browser', root: new BrowserDir('VisuStruct', '') } -} - -/** - * Gemerkter Ordner: `ready` = sofort nutzbar; sonst muss der Browser erst (mit einem Klick) fragen dürfen. - * `slot` trennt die Ordner der Welten (VisuStruct: `folder`, VisuObject: eigener Workspace). - */ -export async function storedFolder(slot = 'folder'): Promise<{ handle: FileSystemDirectoryHandle; ready: boolean } | undefined> { - try { - const handle = (await run('meta', 'readonly', (s) => s.get(slot))) as PermissionHandle | undefined - if (!handle) return undefined - const state = (await handle.queryPermission?.({ mode: 'readwrite' })) ?? 'granted' - return { handle, ready: state === 'granted' } - } catch { - return undefined - } -} - -/** Nach dem Neuladen: Zugriff auf den gemerkten Ordner erneut erlauben (braucht einen Klick). */ -export async function reopenFolder(handle: FileSystemDirectoryHandle): Promise { - const state = (await (handle as PermissionHandle).requestPermission?.({ mode: 'readwrite' })) ?? 'granted' - return state === 'granted' ? { kind: 'folder', root: new NativeDir(handle) } : undefined -} - -export async function forgetFolder(slot = 'folder'): Promise { - try { - await run('meta', 'readwrite', (s) => s.delete(slot)) - } catch { - /* nichts gemerkt */ - } -} diff --git a/web/start-visubot.png b/web/start-visubot.png deleted file mode 100644 index b27a9279c7a37cfe53ac3e0d2501681df12d3506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173899 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

    hOTPduH12*hk_j_suKpEmGXC5N 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

    4ToMxeKH?DDmIlyG`k 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 diff --git a/web/start.png b/web/start.png deleted file mode 100644 index 850e015162572b46ef9854b34d81cf9679d24512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164660 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 z 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 { - beforeAll(() => { - useVisuBotContent('on') - useContentLanguage('de') - useBlockLessons(true) - }) - afterAll(() => { - useBlockLessons(false) - useVisuBotContent('off') - }) - - it('erscheinen nur mit Block-Ansicht in VisuBot, mit eigenen Aufgaben', () => { - expect(showingBlockLessons()).toBe(true) - expect(lessons.length).toBeGreaterThanOrEqual(8) - expect(lessons.every((l) => l.blocks && l.robot)).toBe(true) - lessons.forEach((l, i) => expect(l.number, l.id).toBe(i + 1)) - expect(tasks.length).toBeGreaterThanOrEqual(4) - expect(tasks.every((t) => t.robot && t.id.startsWith('block-'))).toBe(true) - useBlockLessons(false) - expect(lessons.some((l) => l.blocks)).toBe(false) - expect(lessons.length).toBeGreaterThan(20) - useVisuBotContent('off') - useBlockLessons(true) - expect(showingBlockLessons()).toBe(false) - useVisuBotContent('on') - expect(showingBlockLessons()).toBe(true) - }) - - it('sind kurz: Kompetenzen vorn, ein Spiel, die Checkliste am Ende, kein Wissenstest', () => { - for (const l of lessons) { - const kinds = l.steps.map((s) => s.blocks.map((b) => b.kind as string)) - expect(l.steps.length, l.id).toBeLessThanOrEqual(7) - expect(l.steps[0].title, l.id).toBe('Das schaffst du heute') - expect(kinds[0], l.id).toContain('competences') - expect(l.steps[l.steps.length - 1].title, l.id).toBe('Das hab ich geschafft') - expect(kinds[kinds.length - 1], l.id).toContain('checklist') - expect(kinds.flat().filter((k) => k === 'checklist').length, l.id).toBe(1) - expect(kinds.flat(), l.id).not.toContain('quiz') - expect(kinds.slice(0, -1).flat().some((k) => k === 'driveGame' || k === 'game' || k === 'roundGame'), `${l.id}: Spiel`).toBe(true) - } - }) - - it('jede Übung prüft den mBot2, und die Musterlösung besteht sie', () => { - let checked = 0 - const sources = [...lessons.map((l) => ({ id: l.id, blocks: l.steps.flatMap((s) => s.blocks) })), ...tasks.map((t) => ({ id: t.id, blocks: t.blocks }))] - for (const l of sources) { - for (const block of l.blocks) { - if (block.kind !== 'exercise') continue - const ex = block.exercise - const where = `${l.id}: ${ex.id}` - expect(ex.id.startsWith('vbb-'), where).toBe(true) - expect(ex.tests.some((t) => t.drive || t.world || t.sensors || t.actions), where).toBe(true) - expect(ex.hints.length, where).toBeGreaterThanOrEqual(2) - const doc = diagram(ex.solution!)! - expect(doc, where).toBeDefined() - for (const o of checkExercise(doc, ex.tests, undefined, world)) expect(o.passed, `${where}: ${JSON.stringify(o.result)}`).toBe(true) - for (const r of ex.requires) expect(usedElementTypes(doc).has(ElementType[r as keyof typeof ElementType]), where).toBe(true) - expect(checkExercise({ caption: '', elements: [] }, ex.tests, undefined, world).every((o) => o.passed), where).toBe(false) - checked++ - } - } - expect(checked).toBeGreaterThanOrEqual(23) - }) - - it('jede Runde von „Wo landet der mBot2?“ endet auf dem angegebenen Feld', () => { - let checked = 0 - for (const l of lessons) { - for (const block of l.steps.flatMap((s) => s.blocks)) { - if (block.kind !== 'driveGame') continue - for (const [i, round] of block.game.rounds.entries()) { - const where = `${l.id}, Runde ${i + 1}` - const result = driveRound(round, block.game.field) - expect(result.problems, where).toEqual([]) - expect(result.run.bumps, where).toBe(0) - expect(result.cell, where).toEqual(round.target) - checked++ - } - } - } - expect(checked).toBeGreaterThanOrEqual(19) - }) -}) diff --git a/web/test/blockView.test.ts b/web/test/blockView.test.ts deleted file mode 100644 index 636e7b30..00000000 --- a/web/test/blockView.test.ts +++ /dev/null @@ -1,251 +0,0 @@ -// @vitest-environment jsdom -import { describe, expect, it } from 'vitest' -import type { LiveLabels } from '../src/core/codeGenerator' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava } from '../src/core/liveSource' -import { blockGroup, blockTokens, BlockView, programVariables, replaceBlockValue, replaceSensor, replaceValue, valueText, withoutBlockIcons } from '../src/ui/blockView' -import { ElementType, makeElement } from '../src/core/model' - -const blockLabels = { - start: 'Start', - else: 'else', - empty: 'leer', - hint: '', - trash: 'Papierkorb', - count: 'zähle mit', - countFrom: 'von', - countBelow: 'bis unter', - countTo: 'bis', - countAbove: 'bis über', - countStep: 'in Schritten von', - repeat: 'wiederhole', - repeatTimes: 'mal', - randomFrom: 'Zufallszahl von', - randomTo: 'bis', -} -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } -const main = (body: string) => `public class Main {\n public static void main(String[] args) {\n${body}\n }\n}` -const docOf = (java: string) => { - const parsed = parseLiveJava(java, labels, {}) - expect(parsed.problems).toEqual([]) - return documentFromJava({ caption: '', elements: [] }, parsed) -} - -describe('Blöcke (VisuBot)', () => { - it('teilt eine Zeile in Schlüsselwort, Werte und Sensoren', () => { - expect(blockTokens('while mbot.getDistance() > 20')).toEqual([ - { kind: 'kw', text: 'while' }, - { kind: 'text', text: ' ' }, - { kind: 'sensor', text: 'mbot.getDistance()' }, - { kind: 'text', text: ' > ' }, - { kind: 'lit', text: '20' }, - ]) - expect(blockTokens('mbot.showText("Hallo 1")')).toEqual([ - { kind: 'text', text: 'mbot.showText(' }, - { kind: 'str', text: '"Hallo 1"' }, - { kind: 'text', text: ')' }, - ]) - // Befehle sind keine Sensoren, Ziffern in Namen keine Werte - expect(blockTokens('mbot.stop(); x2 = 3')).toEqual([ - { kind: 'text', text: 'mbot.stop(); x2 = ' }, - { kind: 'lit', text: '3' }, - ]) - }) - - it('kennt die Gruppe jedes mBot2-Befehls', () => { - const st = (text: string) => makeElement(ElementType.anweisung, { textLines: [text] }) - expect(blockGroup(st('mbot.forward(50)'))).toBe('drive') - expect(blockGroup(st('mbot.led(2).setColor("rot")'))).toBe('leds') - expect(blockGroup(st('mbot.pause(100)'))).toBe('wait') - expect(blockGroup(st('x = 1'))).toBeUndefined() - }) - - it('zeichnet Schleifen und Verzweigungen als Klammerblöcke mit Pfaden', () => { - const doc = docOf(main('for (int i = 0; i < 4; i++) {\n mbot.forward(50);\n if (mbot.getDistance() < 10) {\n mbot.stop();\n } else {\n mbot.turnRight(90);\n }\n}')) - const selected: number[][] = [] - const view = new BlockView({ press: (p) => selected.push(p), editValue: () => {}, labels: blockLabels }) - view.render(doc, [0, 0, 1], false) - const root = view.element - const loop = root.querySelector('.bk-loop')! - expect(loop.querySelector(':scope > .bk-head')!.textContent).toBe('wiederhole 4 mal') - const stmt = loop.querySelector('.bk-stmt')! - expect(stmt.dataset.path).toBe('[0,0,0]') - expect(stmt.dataset.botColor).toBe('fahren') - const branch = loop.querySelector('.bk-if')! - expect(branch.classList.contains('bk-sel')).toBe(true) - expect(branch.querySelector('.tk-sensor')!.textContent).toBe('mbot.getDistance()') - expect(branch.querySelector('.bk-clause')!.textContent).toBe('else') - expect(branch.querySelectorAll(':scope > .bk-body')).toHaveLength(2) - branch.querySelectorAll('.bk-stmt')[1].dispatchEvent(new Event('pointerdown', { bubbles: true })) - expect(selected).toEqual([[0, 0, 1, 1, 0]]) - - // In der Simulation: laufender Schritt hervorgehoben, Klicks wählen nichts aus - view.render(doc, [0, 0, 0], true) - expect(root.querySelector('.bk-exec')!.getAttribute('data-path')).toBe('[0,0,0]') - root.querySelector('.bk-stmt')!.dispatchEvent(new Event('pointerdown', { bubbles: true })) - expect(selected).toHaveLength(1) - }) - it('findet die Ablegestelle in Blöcken', () => { - const doc = docOf(main('mbot.forward(50);\nwhile (mbot.getDistance() > 10) {\n mbot.forward(10);\n mbot.pause(100);\n}\nmbot.stop();')) - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: blockLabels }) - view.render(doc, undefined, false) - const root = view.element - const at = (el: Element | null, y: number, query = {}) => view.dropAt(0, y, query, el) - const loop = root.querySelector('.bk-loop')! - const first = root.querySelector('[data-path="[0]"]')! - // jsdom kennt keine Maße: y < 0 ist die obere Hälfte, y = 0 die untere - expect(at(first, -1)).toEqual({ kind: 'before', path: [0] }) - expect(at(first, 0)).toEqual({ kind: 'after', path: [0] }) - // Kopf der Schleife: unten = erster Block im Maul, Fuß = hinter die Schleife, freie Fläche im Maul = hinter den letzten - expect(at(loop.querySelector(':scope > .bk-head'), 0)).toEqual({ kind: 'before', path: [1, 0, 0] }) - expect(at(loop.querySelector(':scope > .bk-head'), -1)).toEqual({ kind: 'before', path: [1] }) - expect(at(loop.querySelector(':scope > .bk-foot'), 0)).toEqual({ kind: 'after', path: [1] }) - expect(at(loop.querySelector(':scope > .bk-body'), 0)).toEqual({ kind: 'after', path: [1, 0, 1] }) - expect(at(root.querySelector('.bk-hat'), 0)).toEqual({ kind: 'before', path: [0] }) - expect(at(root.querySelector('.bk-stack'), 0)).toEqual({ kind: 'rootAppend' }) - // Verschieben: nicht in sich selbst, Papierkorb nur beim Verschieben - expect(at(loop.querySelector('[data-path="[1,0,0]"]'), 0, { moving: [1] })).toBeUndefined() - expect(at(root.querySelector('.bk-trash'), 0, { moving: [0] })).toEqual({ kind: 'trash' }) - expect(at(root.querySelector('.bk-trash'), 0)).toBeUndefined() - // Sensor: nur in passende Blöcke - expect(at(loop.querySelector('.bk-head'), 0, { sensor: (p: number[]) => p.length === 1 })).toEqual({ kind: 'condition', path: [1] }) - expect(at(loop.querySelector('[data-path="[1,0,0]"]'), 0, { sensor: (p: number[]) => p.length === 1 })).toBeUndefined() - }) - it('ändert Werte direkt im Block', () => { - // dieselbe Reihenfolge wie im gespeicherten Text, auch bei for (drei Zeilen) und Sensoren dazwischen - expect(replaceValue(['int i = 0;', 'i < 4;', 'i++'], 1, '8')).toEqual(['int i = 0;', 'i < 8;', 'i++']) - expect(replaceValue(['mbot.getDistance() < 10 && x == 2'], 1, '5')).toEqual(['mbot.getDistance() < 10 && x == 5']) - expect(replaceValue(['mbot.led(0).setColor("rot")'], 1, '"grün"')).toEqual(['mbot.led(0).setColor("grün")']) - expect(replaceValue(['x = 1'], 3, '2')).toBeUndefined() - expect(valueText('lit', ' 2,5 ')).toBe('2.5') - expect(valueText('lit', 'abc')).toBeUndefined() - expect(valueText('str', 'Hallo "du"')).toBe('"Hallo \\"du\\""') - - const doc = docOf(main('for (int i = 0; i < 4; i++) {\n mbot.forward(50);\n}')) - const edits: [number[], number, string][] = [] - const view = new BlockView({ press: () => {}, editValue: (p, i, t) => edits.push([p, i, t]), labels: blockLabels }) - document.body.append(view.element) - view.element.hidden = false - view.render(doc, undefined, false) - const four = [...view.element.querySelectorAll('.tk-lit')].find((e) => e.textContent === '4')! - four.dispatchEvent(new Event('pointerdown', { bubbles: true })) - const input = view.element.querySelector('.bk-input')! - expect(input.value).toBe('4') - // solange das Feld offen ist, wird nicht neu gezeichnet - view.render(doc, undefined, false) - expect(view.element.querySelector('.bk-input')).toBe(input) - input.value = '6' - input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' })) - expect(edits).toEqual([[[0], 1, '6']]) - view.element.remove() - }) - it('setzt Sensoren als Bausteine in Felder', () => { - expect(replaceSensor(['mbot.getDistance() < 10 && mbot.isButtonA()'], 1, 'mbot.isButtonB()')).toEqual(['mbot.getDistance() < 10 && mbot.isButtonB()']) - // andere mbot-Befehle zählen nicht als Sensor - expect(replaceSensor(['mbot.stop()'], 0, 'mbot.getTimer()')).toBeUndefined() - expect(replaceValue(['mbot.forward(50)'], 0, 'mbot.getDistance()')).toEqual(['mbot.forward(mbot.getDistance())']) - - const doc = docOf(main('while (mbot.getDistance() > 10 && !mbot.isButtonA()) {\n mbot.forward(50);\n}')) - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: blockLabels }) - view.render(doc, undefined, false) - const root = view.element - const bool = root.querySelector('.tk-sensor.tk-bool')! - expect(bool.textContent).toBe('mbot.isButtonA()') - expect(JSON.parse(bool.dataset.sensor!)).toEqual({ path: [0], index: 1 }) - const sensor = { sensor: () => true } - expect(view.dropAt(0, 0, sensor, bool)).toEqual({ kind: 'slot', path: [0], slot: 'sensor', index: 1 }) - const fifty = [...root.querySelectorAll('.tk-lit')].find((e) => e.textContent === '50')! - expect(view.dropAt(0, 0, sensor, fifty)).toEqual({ kind: 'slot', path: [0, 0, 0], slot: 'value', index: 0 }) - // neben ein Feld: wie bisher in die Bedingung - expect(view.dropAt(0, 0, sensor, root.querySelector('.bk-loop > .bk-head'))).toEqual({ kind: 'condition', path: [0] }) - view.showDrop({ kind: 'slot', path: [0], slot: 'sensor', index: 1 }) - expect(bool.classList.contains('bk-drop')).toBe(true) - }) - it('schreibt das Gruppensymbol nie in den Befehl', () => { - const doc = docOf(main('mbot.forward(50);\nwhile (true) {\n mbot.pause(100);\n}')) - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: blockLabels }) - view.render(doc, undefined, false) - view.render(doc, undefined, false) - expect(doc.elements[0].textLines).toEqual(['mbot.forward(50)']) - expect(view.element.querySelector('.bk-stmt')!.textContent).toBe('🚗 mbot.forward(50)') - // alte Dateien mit Symbol werden gesäubert - const old = { ...doc, elements: [{ ...doc.elements[0], textLines: ['🚗 mbot.forward(50)'] }, { ...doc.elements[1], loopBody: [{ ...doc.elements[1].loopBody![0], textLines: ['⏱️ mbot.pause(100)'] }] }] } - const clean = withoutBlockIcons(old)! - expect(clean.elements[0].textLines).toEqual(['mbot.forward(50)']) - expect(clean.elements[1].loopBody![0].textLines).toEqual(['mbot.pause(100)']) - expect(withoutBlockIcons(doc)).toBeUndefined() - }) - - it('Variablen und Operatoren als Bausteine (Stufe 5)', () => { - const doc = docOf(main('int zahl = 3;\nfor (int i = 0; i < 5; i++) {\n mbot.forward(i);\n}\nzahl = zahl + 1;\nmbot.pause((int) (Math.random() * 10) + 1);')) - expect(programVariables(doc)).toEqual(['zahl', 'i']) - const vars = new Set(programVariables(doc)) - // angelegte bzw. gesetzte Variable: Baustein ohne Feld; rechts davon ein Feld - expect(blockTokens('zahl = zahl + 1', vars)).toEqual([ - { kind: 'var', text: 'zahl', fixed: true }, - { kind: 'text', text: ' = ' }, - { kind: 'var', text: 'zahl' }, - { kind: 'text', text: ' + ' }, - { kind: 'lit', text: '1' }, - ]) - // Wertfelder: zahl (0), 1 (1); Variable auf ein Feld ziehen - expect(replaceValue(['zahl = zahl + 1'], 1, 'i', vars)).toEqual(['zahl = zahl + i']) - expect(replaceValue(['zahl = zahl + 1'], 0, '2 * 3', vars)).toEqual(['zahl = (2 * 3) + 1']) - expect(replaceValue(['mbot.forward(50)'], 0, '0 + 0', vars)).toEqual(['mbot.forward(0 + 0)']) - // Zufallszahl: zwei Felder von/bis - const rnd = ['mbot.pause((int) (Math.random() * 10) + 1)'] - expect(replaceValue(rnd, 1, '6')).toEqual(['mbot.pause((int) (Math.random() * 6) + 1)']) - expect(replaceValue(rnd, 0, '5')).toEqual(['mbot.pause((int) (Math.random() * 6) + 5)']) - expect(replaceValue(rnd, 0, 'zahl', vars)).toBeUndefined() - // leere Klammer: ein leeres Feld, aber nicht bei mbot.stop() - expect(replaceValue(['mbot.forward()'], 0, '50')).toEqual(['mbot.forward(50)']) - expect(replaceValue(['mbot.stop()'], 0, '50')).toBeUndefined() - - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: blockLabels }) - view.render(doc, undefined, false) - const root = view.element - // die Schleife benutzt i → „zähle mit“; i im Befehl als oranger Baustein mit Feld - expect(root.querySelector('.bk-loop > .bk-head')!.textContent).toBe('zähle mit i von 0 bis unter 5 in Schritten von 1') - const iField = root.querySelector('.bk-loop .bk-stmt .tk-var')! - expect(iField.textContent).toBe('i') - expect(iField.dataset.value).toBe(JSON.stringify({ path: [1, 0, 0], index: 0 })) - const rndPill = root.querySelector('.tk-op')! - expect(rndPill.textContent).toBe('Zufallszahl von 1 bis 10') - expect(rndPill.querySelectorAll('[data-value]').length).toBe(2) - // Zählschleife über das Feld: Variable als Ende - expect(replaceBlockValue(doc, [1], 1, 'zahl')).toEqual(['int i = 0', 'i < zahl', 'i++']) - }) -}) - - -describe('Blöcke: Schlüsselwörter übersetzt', () => { - it('zeigt wenn/sonst/solange/wiederhole immer statt if/else/while/endless', () => { - const doc = docOf(main('while (true) {\n if (mbot.getDistance() < 20) {\n mbot.turnRight();\n } else {\n mbot.forward();\n }\n}\nwhile (mbot.getDistance() > 15) {\n mbot.forward();\n}')) - const keywords = { if: 'wenn', while: 'solange', endless: 'wiederhole immer', do: 'mache' } - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: { ...blockLabels, else: 'sonst', keywords } }) - view.render(doc, undefined, false) - const words = [...view.element.querySelectorAll('.tk-kw')].map((w) => w.textContent) - expect(words).toEqual(['🏁 Start', 'wiederhole immer', 'wenn', 'sonst', 'solange']) - // Werte bleiben anklickbar wie vorher - expect(view.element.querySelectorAll('[data-value]').length).toBe(5) - }) -}) - -describe('Blöcke: nicht, und, oder', () => { - it('zeigt „nicht“, „und“, „oder“ statt !, &&, || (nicht bei !=)', () => { - const doc = docOf(main('while (!mbot.isButtonA() && mbot.getDistance() != 5 || mbot.isButtonB()) {\n mbot.pause(100);\n}')) - const keywords = { while: 'solange', '!': 'nicht', '&&': 'und', '||': 'oder' } - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: { ...blockLabels, keywords } }) - view.render(doc, undefined, false) - const head = view.element.querySelector('.bk-loop .bk-head')!.textContent! - expect(head).toBe('solange nicht mbot.isButtonA() und mbot.getDistance() != 5 oder mbot.isButtonB()') - }) - - it('zeigt den Aussprung als „verlasse die Schleife“', () => { - const doc = docOf(main('while (true) {\n if (mbot.isButtonA()) {\n break;\n }\n mbot.forward();\n}')) - const view = new BlockView({ press: () => {}, editValue: () => {}, labels: { ...blockLabels, keywords: { break: 'verlasse die Schleife' } } }) - view.render(doc, undefined, false) - expect(view.element.textContent).toContain('verlasse die Schleife') - expect(view.element.textContent).not.toContain('break') - }) -}) diff --git a/web/test/boolGame.test.ts b/web/test/boolGame.test.ts deleted file mode 100644 index 59e6936b..00000000 --- a/web/test/boolGame.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { evaluate, explain, makeRound, parseBoolGame } from '../src/learn/boolGame' - -describe('Spiel „Wahr oder falsch?“', () => { - it('wertet Vergleiche, &&, || und ! wie Java aus', () => { - expect(evaluate('alter >= 12 && alter < 18', { alter: 15 })).toBe(true) - expect(evaluate('alter >= 12 && alter < 18', { alter: 18 })).toBe(false) - expect(evaluate('tag == 6 || tag == 7', { tag: 7 })).toBe(true) - expect(evaluate('!(note >= 1 && note <= 6)', { note: 0 })).toBe(true) - expect(evaluate('a || b && c', { a: false, b: true, c: false })).toBe(false) - expect(evaluate('(alter >= 12 && alter < 18) || schueler', { alter: 30, schueler: true })).toBe(true) - expect(evaluate('!schueler', { schueler: false })).toBe(true) - }) - - it('erklärt die Auswertung in Schritten', () => { - expect(explain('alter >= 12 && alter < 18', { alter: 15 })).toEqual(['alter >= 12 && alter < 18', '15 >= 12 && 15 < 18', 'true && true', 'true']) - expect(explain('!schueler', { schueler: true })).toEqual(['!schueler', '!true', 'false']) - }) - - it('liest den Block und erzeugt Runden vom leichten zum schweren', () => { - const game = parseBoolGame(['alter: 8..20', 'schueler: boolean', '? alter >= 18', '? alter >= 12 && schueler'], 'x.md') - expect(game.vars).toHaveLength(2) - expect(makeRound(game, 0, 10, () => 0).condition).toBe('alter >= 18') - const last = makeRound(game, 9, 10, () => 0.9) - expect(last.condition).toBe('alter >= 12 && schueler') - expect(last.answer).toBe(evaluate(last.condition, last.values)) - }) - - it('meldet Fehler im Block', () => { - expect(() => parseBoolGame(['? x > 1'], 'x.md')).toThrow(/Unbekannte Variable/) - expect(() => parseBoolGame(['alter: viel'], 'x.md')).toThrow(/Unbekannte Zeile/) - }) -}) diff --git a/web/test/classModel.test.ts b/web/test/classModel.test.ts deleted file mode 100644 index 2acba0b0..00000000 --- a/web/test/classModel.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { addClass, addMember, deleteClass, deleteMember, exampleJava, parseClasses, parseUmlLine, relations, renameClass, replaceMember, setAbstract, setSuperclass, umlText } from '../src/core/classModel' - -const byName = (source: string, name: string) => parseClasses(source).find((c) => c.name === name)! - -describe('Klassendiagramm aus Java', () => { - it('liest das Beispiel Tier, Hund, Besitzer', () => { - const classes = parseClasses(exampleJava) - expect(classes.map((c) => c.name)).toEqual(['Tier', 'Hund', 'Besitzer']) - expect(classes[0].members.map(umlText)).toEqual(['- name: String', '- alter: int', '+ Tier(name: String, alter: int)', '+ getName(): String', '+ lautGeben(): void']) - expect(classes[1].superclass).toBe('Tier') - expect(relations(classes)).toEqual([ - { kind: 'extends', from: 'Hund', to: 'Tier' }, - { kind: 'association', from: 'Besitzer', to: 'Hund', role: 'hunde', multiplicity: '0..*' }, - ]) - }) - - it('kennt Interfaces, abstrakte Klassen, static und Arrays', () => { - const src = `interface Haustier { void streicheln(); } -abstract class Tier implements Haustier { - protected static int anzahl = 0; - int[] werte = {1, 2}, mehr; - @Override public void streicheln() { if (true) { } } - abstract String laut(); -} -class Zoo { private Tier[] tiere; Tier chef; }` - const [h, tier, zoo] = parseClasses(src) - expect(h.kind).toBe('interface') - expect(h.members[0]).toMatchObject({ name: 'streicheln', isAbstract: true, visibility: '+' }) - expect(tier.isAbstract).toBe(true) - expect(tier.interfaces).toEqual(['Haustier']) - expect(tier.members.map(umlText)).toEqual(['# anzahl: int', '~ werte: int[]', '~ mehr: int[]', '+ streicheln(): void', '~ laut(): String']) - expect(tier.members[0].isStatic).toBe(true) - expect(tier.members[1].shared).toBe(true) - expect(tier.members[4].isAbstract).toBe(true) - expect(relations([h, tier, zoo]).map((r) => `${r.from}-${r.kind}-${r.to}${r.multiplicity ? ' ' + r.multiplicity : ''}`)).toEqual([ - 'Tier-implements-Haustier', - 'Zoo-association-Tier 0..*', - 'Zoo-association-Tier 1', - ]) - }) - - it('übersteht halb getippten Code und Kommentare', () => { - const src = `// class Falsch {}\npublic class Auto {\n private String marke; /* } */\n public void fahren() {\n String s = "}";\n` - const [auto] = parseClasses(src) - expect(auto.name).toBe('Auto') - expect(auto.members.map((m) => m.name)).toEqual(['marke', 'fahren']) - }) -}) - -describe('UML-Zeile lesen', () => { - it('versteht UML- und Java-Schreibweise', () => { - expect(parseUmlLine('- name: String')).toMatchObject({ kind: 'field', visibility: '-', name: 'name', type: 'String' }) - expect(parseUmlLine('int alter')).toMatchObject({ kind: 'field', name: 'alter', type: 'int' }) - expect(parseUmlLine('+ bellen(laut: int, wie: String): boolean')).toMatchObject({ - kind: 'method', - name: 'bellen', - type: 'boolean', - params: [{ name: 'laut', type: 'int' }, { name: 'wie', type: 'String' }], - }) - expect(parseUmlLine('public void fressen(int menge)')).toMatchObject({ kind: 'method', visibility: '+', name: 'fressen', type: 'void', params: [{ name: 'menge', type: 'int' }] }) - expect(parseUmlLine('static zaehler: int')).toMatchObject({ isStatic: true, name: 'zaehler' }) - expect(parseUmlLine('')).toBeUndefined() - }) -}) - -describe('Java aus dem Klassendiagramm', () => { - it('legt Klassen an und schreibt Attribute und Methoden hinein', () => { - let src = addClass('', 'Hund') - expect(src).toBe('public class Hund {\n}\n') - src = addMember(src, byName(src, 'Hund'), '- name: String') - src = addMember(src, byName(src, 'Hund'), '+ bellen(): void') - src = addMember(src, byName(src, 'Hund'), '- alter: int') - src = addMember(src, byName(src, 'Hund'), '+ getAlter(): int') - expect(src).toBe(`public class Hund { - private String name; - private int alter; - - public void bellen() { - // Dein Code - } - - public int getAlter() { - return 0; - } -} -`) - src = addClass(src, 'Tier') - src = setSuperclass(src, byName(src, 'Hund'), 'Tier') - expect(src.startsWith('public class Hund extends Tier {')).toBe(true) - src = setSuperclass(src, byName(src, 'Hund'), undefined) - expect(src.startsWith('public class Hund {')).toBe(true) - src = setAbstract(src, byName(src, 'Tier'), true) - expect(src).toContain('public abstract class Tier {') - }) - - it('ändert nur den Kopf: Rumpf und Startwert bleiben', () => { - let src = exampleJava - const tier = byName(src, 'Tier') - src = replaceMember(src, tier, tier.members[1], '- alter: double') - src = replaceMember(src, byName(src, 'Tier'), byName(src, 'Tier').members[4], '+ lautGeben(wie: String): void') - expect(src).toContain(' private double alter;\n') - expect(src).toContain(' public void lautGeben(String wie) {\n System.out.println("...");') - // ohne Sichtbarkeit getippt: alte bleibt - src = replaceMember(src, byName(src, 'Tier'), byName(src, 'Tier').members[0], 'spitzname: String') - expect(src).toContain(' private String spitzname;\n') - }) - - it('benennt Klasse samt Konstruktor um und löscht Teile', () => { - let src = renameClass(exampleJava, byName(exampleJava, 'Tier'), 'Lebewesen') - expect(src).toContain('public class Lebewesen {') - expect(src).toContain('public Lebewesen(String name, int alter) {') - const getter = byName(src, 'Lebewesen').members.find((m) => m.name === 'getName')! - src = deleteMember(src, getter) - expect(src).not.toContain('getName') - src = deleteClass(src, byName(src, 'Besitzer')) - expect(parseClasses(src).map((c) => c.name)).toEqual(['Lebewesen', 'Hund']) - expect(src.endsWith('}\n')).toBe(true) - }) - - it('Interface-Methoden ohne Rumpf', () => { - let src = addClass('', 'Haustier', 'interface') - src = addMember(src, byName(src, 'Haustier'), 'streicheln(): void') - expect(src).toBe('public interface Haustier {\n void streicheln();\n}\n') - }) -}) - -describe('Modifier der Klasse', () => { - it('public und final setzen und lesen', async () => { - const { classModifiers, setFinal, setPublic, setAbstract } = await import('../src/core/classModel') - let src = 'public abstract class Tier {\n}\n' - const c = () => parseClasses(src)[0] - src = setFinal(src, c(), true) - expect(src).toBe('public final class Tier {\n}\n') - expect(classModifiers(src, c())).toEqual({ isPublic: true, isFinal: true }) - src = setPublic(src, c(), false) - expect(src).toBe('final class Tier {\n}\n') - src = setPublic(setFinal(src, c(), false), parseClasses(setFinal(src, c(), false))[0], true) - expect(src).toBe('public class Tier {\n}\n') - expect(setAbstract(src, c(), true)).toBe('public abstract class Tier {\n}\n') - }) -}) - -describe('Neue Attribute', () => { - it('ohne Sichtbarkeit private, Methoden public', () => { - let src = 'public class Hund {\n}\n' - src = addMember(src, parseClasses(src)[0], 'name: String') - src = addMember(src, parseClasses(src)[0], 'bellen(): void') - expect(src).toContain('private String name;') - expect(src).toContain('public void bellen()') - }) -}) diff --git a/web/test/codeGenerator.test.ts b/web/test/codeGenerator.test.ts deleted file mode 100644 index 33cba7e3..00000000 --- a/web/test/codeGenerator.test.ts +++ /dev/null @@ -1,355 +0,0 @@ -import { readFileSync } from 'node:fs' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { generateCode, generateJavaClassFile, generateLiveCode, generateLiveJava, sanitizedJavaClassName, type CodeTarget } from '../src/core/codeGenerator' -import { ElementType, makeElement } from '../src/core/model' -import { decodeDocument } from '../src/core/xmlCodec' - -// Port von CodeGeneratorTests.swift. - -const examples = join(__dirname, '..', '..', 'VisuStruct-Dateien') -const text = (name: string) => readFileSync(join(examples, name), 'utf8') -const example = (name: string) => decodeDocument(text(name)) - -describe('Codegenerierung', () => { - it('Java-Klasse entspricht den mitgelieferten .java-Dateien', () => { - for (const name of ['Collatz', 'Fibonacci']) { - expect(generateJavaClassFile(example(`${name}.visustruct`), name), name).toBe(text(`${name}.java`)) - } - }) - - it('Java-Klasse mit Eingabe importiert Scanner genau einmal', () => { - const generated = generateJavaClassFile(example('2026-04-23-NumberEven.visustruct'), 'NumberEven') - expect(generated.startsWith('import java.util.Scanner;\n\npublic class NumberEven {\n')).toBe(true) - expect(generated.split('new Scanner(System.in)').length - 1).toBe(1) - expect(generated).toContain('if (number % 2 == 0) {') - }) - - it('Collatz in Python und JavaScript', () => { - const doc = example('Collatz.visustruct') - const python = generateCode(doc, 'python') - expect(python).toContain('while number != 1:') - expect(python).toContain('print(number)') - expect(python).not.toContain('{') - const js = generateCode(doc, 'javascript') - expect(js.startsWith('"use strict";')).toBe(true) - expect(js).toContain('while (number != 1) {') - expect(js).toContain('console.log(number);') - // int-Variable: Ganzzahldivision wie in Java - expect(js).toContain('number = Math.trunc(number / 2);') - }) - - it('Python: Java-Schreibweise wird übersetzt', () => { - const stmt = (t: string) => makeElement(ElementType.anweisung, { textLines: [t] }) - const doc = { - caption: '', - elements: [ - stmt('int n = 7'), - stmt('boolean ok = true'), - makeElement(ElementType.forSchleife, { - textLines: ['int i = 1', 'i <= n', 'i++'], - loopBody: [stmt('n--')], - }), - makeElement(ElementType.verzweigung, { - textLines: ['n > 2 && !ok || n == 0'], - cases: [ - { name: 'true', elements: [stmt('print: "Hälfte: " + n / 2')] }, - { name: 'false', elements: [stmt('ø')] }, - ], - }), - ], - } - const python = generateCode(doc, 'python') - expect(python).toContain('ok = True') - expect(python).toContain('for i in range(1, n + 1):') - expect(python).toContain(' n -= 1') - expect(python).toContain('if n > 2 and not ok or n == 0:') - expect(python).toContain('print("Hälfte: " + str(n // 2))') - expect(python).toMatch(/else:\n {4}# empty element\n {4}pass/) - }) - - it('Verzweigung allein im false-Zweig wird zu else if bzw. elif', () => { - const stmt = (t: string) => makeElement(ElementType.anweisung, { textLines: [t] }) - const branch = (cond: string, yes: string, no: ReturnType[]) => - makeElement(ElementType.verzweigung, { textLines: [cond], cases: [{ name: 'true', elements: [stmt(yes)] }, { name: 'false', elements: no }] }) - const chain = branch('wahl == 1', 'output: "Wasser"', [branch('wahl == 2', 'output: "Saft"', [stmt('output: "Kakao"')])]) - const doc = { caption: '', elements: [stmt('int wahl = 2'), chain] } - expect(generateCode(doc, 'java')).toContain( - 'if (wahl == 1) {\n System.out.println("Wasser");\n} else if (wahl == 2) {\n System.out.println("Saft");\n} else {\n System.out.println("Kakao");\n}', - ) - expect(generateCode(doc, 'javascript')).toContain('} else if (wahl == 2) {') - expect(generateCode(doc, 'python')).toContain('if wahl == 1:\n print("Wasser")\nelif wahl == 2:\n print("Saft")\nelse:\n print("Kakao")') - // Steht noch etwas neben der inneren Verzweigung, bleibt der Block verschachtelt. - const mixed = branch('wahl == 1', 'output: "Wasser"', [stmt('output: "Moment"'), branch('wahl == 2', 'output: "Saft"', [stmt('ø')])]) - expect(generateCode({ caption: '', elements: [stmt('int wahl = 2'), mixed] }, 'java')).toContain('} else {\n System.out.println("Moment");\n if (wahl == 2) {') - }) - - it('Pseudocode bekommt einen Hinweis über dem Code', () => { - const doc = { caption: '', pseudocode: true, elements: [makeElement(ElementType.anweisung, { textLines: ['Tasse hinstellen'] })] } - expect(generateCode(doc, 'python', { pseudocodeNote: 'Pseudocode' })).toBe('# Pseudocode\n\nTasse hinstellen') - expect(generateCode(doc, 'java', { pseudocodeNote: 'Pseudocode' }).startsWith('// Pseudocode\n\n')).toBe(true) - expect(generateCode({ ...doc, pseudocode: undefined }, 'python')).toBe('Tasse hinstellen') - const withInput = { ...doc, elements: [makeElement(ElementType.anweisung, { textLines: ['input: int n'] })] } - const javaClass = generateJavaClassFile(withInput, 'Tee', { pseudocodeNote: 'Pseudocode' }) - expect(javaClass.split('new Scanner(System.in)').length - 1).toBe(1) - expect(javaClass).toContain(' // Pseudocode\n') - }) - - it('Unterprogramme mit Kopfzeile werden zu Methoden und Funktionen', () => { - const stmt = (t: string) => makeElement(ElementType.anweisung, { textLines: [t] }) - const call = (t: string) => makeElement(ElementType.aufruf, { textLines: [t] }) - const quadrat = { caption: 'int quadrat(int x)', elements: [stmt('int y = x * x'), stmt('return y')] } - const zeige = { caption: 'void zeige(String text)', elements: [stmt('input: int n "Zahl?"'), stmt('output: text + n')] } - const main = { caption: 'Main', elements: [call('int q = quadrat(3)'), call('zeige("q=")'), stmt('output: q')] } - expect(generateCode(quadrat, 'java')).toBe('public static int quadrat(int x) {\n int y = x * x;\n return y;\n}') - expect(generateCode(main, 'python', {}, [quadrat])).toBe( - 'def quadrat(x):\n y = x * x\n return y\n\nq = quadrat(3)\nzeige("q=")\nprint(q)', - ) - expect(generateCode(main, 'javascript', {}, [quadrat])).toContain('function quadrat(x) {\n let y = x * x;\n return y;\n}\n\nlet q = quadrat(3);') - const javaClass = generateJavaClassFile(main, 'Main', {}, [quadrat, zeige]) - expect(javaClass).toContain(' static Scanner scanner = new Scanner(System.in);\n') - expect(javaClass.split('new Scanner(System.in)').length - 1).toBe(1) - expect(javaClass).toContain(' public static int quadrat(int x) {\n int y = x * x;\n return y;\n }\n') - expect(javaClass).toContain(' public static void zeige(String text) {\n') - const feld = { caption: 'Feld', elements: [stmt('String[] spalten = {"A", "B"}'), stmt('output: spalten[1] + (2 + 1)')] } - expect(generateCode(feld, 'python')).toContain('print(spalten[1] + str((2 + 1)))') - const leeren = { caption: 'void leeren(boolean[] reihe, int[][] tabelle)', elements: [stmt('reihe[0] = false')] } - expect(generateCode(leeren, 'java')).toContain('public static void leeren(boolean[] reihe, int[][] tabelle) {') - expect(generateCode(leeren, 'python')).toContain('def leeren(reihe, tabelle):') - // Ohne Unterprogramme bleibt die Klasse wie bisher. - expect(generateJavaClassFile(main, 'Main')).not.toContain('public static int') - }) - - it('bereinigt Java-Klassennamen', () => { - expect(sanitizedJavaClassName('Fibonacci')).toBe('Fibonacci') - const s = sanitizedJavaClassName('2 Summe bilden!') - expect(s).not.toBe('') - expect(s).not.toContain(' ') - expect(/^\d/.test(s)).toBe(false) - }) - - it('leeres Dokument erzeugt einen Platzhalter', () => { - for (const target of ['java', 'python', 'javascript'] as CodeTarget[]) { - expect(generateCode({ caption: '', elements: [] }, target).trim(), target).not.toBe('') - } - }) - - it('Eingabe, Fallauswahl und Schleifen in allen Sprachen', () => { - const doc = example('SummeBilden/switch-case.visustruct') - expect(generateCode(doc, 'python')).toMatch(/match .*:\n/) - expect(generateCode(doc, 'javascript')).toContain('break;') - const pin = example('2026-04-23-CheckPin.visustruct') - expect(generateCode(pin, 'javascript')).toContain('prompt(') - expect(generateCode(pin, 'python')).toContain('input(') - expect(generateCode(example('SummeBilden/for-loop.visustruct'), 'python')).toMatch(/for \w+ in range\(/) - }) - - it('JavaScript schneidet int / int wie Java ab', () => { - const s = (t: string) => makeElement(ElementType.anweisung, { textLines: [t] }) - const js = generateCode( - { caption: '', elements: [s('int a = 7'), s('int b = 2'), s('int q = a / b'), s('q /= 2'), s('double e = a / 2.0'), s('print: "x/y " + a / b')] }, - 'javascript', - ) - expect(js).toContain('let q = Math.trunc(a / b);') - expect(js).toContain('q = Math.trunc(q / 2);') - expect(js).toContain('a / 2.0') - expect(js).toContain('"x/y " + Math.trunc(a / b)') - // Wie in Java von links nach rechts: (x * x) / 2 und (a / b) * 2.5 - const chains = generateCode( - { caption: '', elements: [s('int x = 3'), s('int b = 2'), s('int y = x * x / 2'), s('double d = x / b * 2.5'), s('double e = 2.5 * x / b'), s('int r = x * b % 2')] }, - 'javascript', - ) - expect(chains).toContain('let y = Math.trunc(x * x / 2);') - expect(chains).toContain('let d = Math.trunc(x / b) * 2.5;') - expect(chains).toContain('let e = 2.5 * x / b;') - expect(chains).toContain('let r = x * b % 2;') - }) -}) - -describe('Codegenerierung: 2D-Arrays', () => { - const stmt = (t: string) => makeElement(ElementType.anweisung, { textLines: [t] }) - const doc = { - caption: 'Kino', - elements: [ - stmt('boolean[][] sitze = new boolean[3][4]'), - stmt('int[][] t = {{1, 2}, {3, 4}}'), - makeElement(ElementType.forSchleife, { textLines: ['int r = 0', 'r < sitze.length', 'r++'], loopBody: [ - makeElement(ElementType.forSchleife, { textLines: ['int p = 0', 'p < sitze[r].length', 'p++'], loopBody: [stmt('sitze[r][p] = true')] }), - ] }), - ], - } - - it('übersetzt Anlegen und Längen in alle Zielsprachen', () => { - const java = generateCode(doc, 'java') - expect(java).toContain('boolean[][] sitze = new boolean[3][4];') - expect(java).toContain('r < sitze.length;') - const python = generateCode(doc, 'python') - expect(python).toContain('sitze = [[False] * 4 for _ in range(3)]') - expect(python).toContain('t = [[1, 2], [3, 4]]') - expect(python).toContain('for p in range(len(sitze[r])):') - const js = generateCode(doc, 'javascript') - expect(js).toContain('let sitze = Array.from({ length: 3 }, () => new Array(4).fill(false));') - expect(js).toContain('let t = [[1, 2], [3, 4]];') - }) -}) - -describe('Codegenerierung: String-Methoden', () => { - const doc = { - caption: 'Wort', - elements: [ - makeElement(ElementType.anweisung, { - textLines: ['output: w.length() + w.charAt(w.length() - 1) + w.substring(1, 3) + w.substring(2) + w.indexOf("a") + w.trim().toUpperCase()'], - }), - makeElement(ElementType.anweisung, { textLines: ['boolean b = w.contains("x")'] }), - ], - } - - it('übersetzt sie nach Python und JavaScript', () => { - const python = generateCode(doc, 'python') - expect(python).toContain('len(w)') - expect(python).toContain('w[len(w) - 1]') - expect(python).toContain('w[1:3]') - expect(python).toContain('w[2:]') - expect(python).toContain('w.find("a")') - expect(python).toContain('w.strip().upper()') - expect(python).toContain('("x" in w)') - const js = generateCode(doc, 'javascript') - expect(js).toContain('w.length + w.charAt(w.length - 1)') - expect(js).toContain('w.includes("x")') - }) -}) - -describe('Code live (Anfänger-Ansicht)', () => { - const labels = { condition: 'Bedingung', selector: 'Variable', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - const plain = (s: string) => s.replace(//g, '«').replace(//g, '»') - const stub = () => makeElement(ElementType.anweisung, { textLines: ['ø'] }) - - it('leere Anweisung wird zu `;`, Text bekommt ein Semikolon', () => { - const doc = { caption: '', elements: [makeElement(ElementType.anweisung), makeElement(ElementType.anweisung, { textLines: ['int zahl = 0'] })] } - expect(plain(generateLiveJava(doc, labels).text)).toBe(';\nint zahl = 0;') - }) - - it('neue Verzweigung: `if (Bedingung)` mit Platzhaltern in den Blöcken', () => { - const doc = { - caption: '', - elements: [makeElement(ElementType.verzweigung, { cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [stub()] }] })], - } - expect(plain(generateLiveJava(doc, labels).text)).toBe( - 'if («Bedingung») {\n «// Dein Code»\n} else {\n «// Dein Code»\n}', - ) - }) - - it('leere Schleifenfelder werden Platzhalter, ausgefüllte bleiben', () => { - const doc = { - caption: '', - elements: [makeElement(ElementType.forSchleife, { textLines: ['int i = 0', '', 'i++'], loopBody: [stub()] })], - } - expect(plain(generateLiveJava(doc, labels).text).split('\n')[0]).toBe('for (int i = 0; «Bedingung»; i++) {') - }) - - it('ordnet jedem Element seine Zeilen zu (auch nach Scanner-Vorspann und bei else if)', () => { - const inner = makeElement(ElementType.verzweigung, { textLines: ['a < 0'], cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [stub()] }] }) - const doc = { - caption: '', - elements: [ - makeElement(ElementType.anweisung, { textLines: ['input: int a'] }), - makeElement(ElementType.verzweigung, { textLines: ['a > 0'], cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [inner] }] }), - ], - } - const live = generateLiveJava(doc, labels) - const lines = plain(live.text).split('\n') - const linesOf = (path: number[]) => { - const s = live.spans.find((x) => x.path.join() === path.join())! - return lines.slice(s.from, s.to + 1) - } - expect(linesOf([0])).toEqual(['System.out.println("a: ");', 'int a = scanner.nextInt();']) - expect(linesOf([1])[0]).toBe('if (a > 0) {') - expect(linesOf([1, 1, 0])[0]).toBe('} else if (a < 0) {') - expect(linesOf([1, 1, 0, 0, 0])).toEqual([' «// Dein Code»']) - }) - - it('der normale Code-Generator bleibt unverändert', () => { - const doc = { caption: '', elements: [makeElement(ElementType.verzweigung, { cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [stub()] }] })] } - expect(generateCode(doc, 'java')).toBe('if (true) {\n // empty element\n} else {\n // empty element\n}') - }) -}) - -describe('Code live in JavaScript', () => { - const labels = { condition: 'Bedingung', selector: 'Variable', code: 'Dein Code', start: 'Start', step: 'Schritt', end: 'Ende' } - const plain = (s: string) => s.replace(//g, '«').replace(//g, '»') - const stub = () => makeElement(ElementType.anweisung, { textLines: ['ø'] }) - - it('let statt int, Platzhalter wie in Java', () => { - const doc = { - caption: '', - elements: [ - makeElement(ElementType.anweisung, { textLines: ['int zahl = 0'] }), - makeElement(ElementType.verzweigung, { cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [stub()] }] }), - makeElement(ElementType.forSchleife, { textLines: ['int i = 0', '', ''], loopBody: [stub()] }), - ], - } - const live = generateLiveCode(doc, 'javascript', labels) - expect(plain(live.text)).toBe( - '"use strict";\n\nlet zahl = 0;\nif («Bedingung») {\n «// Dein Code»\n} else {\n «// Dein Code»\n}\n' + - 'for (let i = 0; «Bedingung»; «Schritt») {\n «// Dein Code»\n}', - ) - expect(live.spans.find((s) => s.path.join() === '0')).toMatchObject({ from: 2, to: 2 }) - }) -}) - -describe('Code live in Python', () => { - const labels = { condition: 'Bedingung', selector: 'Variable', code: 'Dein Code', start: 'Start', step: 'Schritt', end: 'Ende' } - const plain = (s: string) => s.replace(//g, '«').replace(//g, '»') - const stub = () => makeElement(ElementType.anweisung, { textLines: ['ø'] }) - const py = (elements: ReturnType[]) => plain(generateLiveCode({ caption: '', elements }, 'python', labels).text) - - it('pass statt `;`, `if Bedingung:` und `pass # Dein Code` in leeren Blöcken', () => { - expect( - py([ - makeElement(ElementType.anweisung), - makeElement(ElementType.anweisung, { textLines: ['int zahl = 0'] }), - makeElement(ElementType.verzweigung, { cases: [{ name: 'true', elements: [stub()] }, { name: 'false', elements: [stub()] }] }), - ]), - ).toBe('pass\nzahl = 0\nif «Bedingung»:\n «pass # Dein Code»\nelse:\n «pass # Dein Code»') - }) - - it('Zählschleife: range mit Platzhaltern, solange Felder fehlen', () => { - const loop = (lines: string[]) => py([makeElement(ElementType.forSchleife, { textLines: lines, loopBody: [stub()] })]).split('\n')[0] - expect(loop(['', '', ''])).toBe('for «Variable» in range(«Start», «Ende»):') - expect(loop(['int i = 0', '', ''])).toBe('for i in range(0, «Ende»):') - expect(loop(['int i = 1', 'i <= 10', ''])).toBe('for i in range(1, 11):') - expect(loop(['int i = 0', 'i < 10', 'i++'])).toBe('for i in range(10):') - }) - - it('Do-while und Unterprogramm', () => { - const doc = { - caption: 'int doppelt(int x)', - elements: [makeElement(ElementType.doUntilSchleife, { loopBody: [stub()] })], - } - const live = generateLiveCode(doc, 'python', labels) - expect(plain(live.text)).toBe('def doppelt(x):\n while True:\n «pass # Dein Code»\n if not («Bedingung»):\n break') - expect(live.spans.find((s) => s.path.join() === '0')).toMatchObject({ from: 1, to: 4 }) - }) -}) - -describe('Codegenerierung: Zeichen und Zeichencodes', () => { - const doc = { - caption: 'Caesar', - elements: [ - makeElement(ElementType.anweisung, { textLines: ['int code = (int) wort.charAt(i)'] }), - makeElement(ElementType.anweisung, { textLines: ['int z = (int) (x / 2)'] }), - makeElement(ElementType.anweisung, { textLines: ['geheim = geheim + (char) (code + 3)'] }), - ], - } - - it('übersetzt (int) und (char) nach Python und JavaScript', () => { - const python = generateCode(doc, 'python') - expect(python).toContain('code = ord(wort[i])') - expect(python).toContain('z = int(x / 2)') - expect(python).toContain('chr(code + 3)') - const js = generateCode(doc, 'javascript') - expect(js).toContain('wort.charAt(i).charCodeAt(0)') - expect(js).toContain('Math.floor(x / 2)') - expect(js).toContain('String.fromCharCode(code + 3)') - }) -}) diff --git a/web/test/codeKeywords.test.ts b/web/test/codeKeywords.test.ts deleted file mode 100644 index 8a5592dc..00000000 --- a/web/test/codeKeywords.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { afterEach, describe, expect, it } from 'vitest' -import { preferredLanguage, setCodeKeywords, setLanguage, storedCodeKeywords, t } from '../src/ui/i18n' - -describe('Code-Keywords (unabhängig von der Sprache)', () => { - afterEach(() => localStorage.clear()) - - it('ersetzt nur die Elementnamen durch Java-Keywords', async () => { - await setLanguage('de', false) - await setCodeKeywords(true, false) - expect(t('element_verzweigung')).toBe('if') - expect(t('element_whileSchleife')).toBe('while') - expect(t('element_anweisung')).toBe('Anweisung') - expect(t('settings_language_title')).toBe('Sprache') - await setCodeKeywords(false, false) - expect(t('element_verzweigung')).toBe('Verzweigung') - }) - - it('macht aus der alten Sprache „Java (Keywords)“ Englisch mit Code-Keywords', () => { - localStorage.setItem('appLanguageCode', 'java') - expect(preferredLanguage()).toBe('en') - expect(storedCodeKeywords()).toBe(true) - }) -}) diff --git a/web/test/countLoop.test.ts b/web/test/countLoop.test.ts deleted file mode 100644 index 21ec9f8a..00000000 --- a/web/test/countLoop.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { countLoopLines, countVar, readCountLoop, setCountField } from 'visublocks' -import { elementWithForDepth, replaceBlockValue, withCountLoopDefaults } from '../src/ui/blockView' -import { ElementType, makeElement, type VSDocument } from '../src/core/model' - -describe('VisuBlocks: Zählschleife', () => { - it('liest einfache for-Köpfe', () => { - expect(readCountLoop(['int i = 0', 'i < 10', 'i++'])).toEqual({ v: 'i', start: '0', op: '<', end: '10', step: '1' }) - expect(readCountLoop(['int j = 1; j <= 5; j += 2'])).toEqual({ v: 'j', start: '1', op: '<=', end: '5', step: '2' }) - expect(readCountLoop(['int i = 10', 'i > 0', 'i--'])).toEqual({ v: 'i', start: '10', op: '>', end: '0', step: '1' }) - expect(readCountLoop(['int i = 0', 'i < mbot.getDistance()', 'i = i + 3'])?.end).toBe('mbot.getDistance()') - // leere Schleife → Standard - expect(readCountLoop(['', '', ''], 'k')).toEqual({ v: 'k', start: '0', op: '<', end: '10', step: '1' }) - }) - - it('lässt kompliziertere Köpfe als Text', () => { - expect(readCountLoop(['int i = 0', 'i < anzahl', 'i++'])?.end).toBe('anzahl') - expect(readCountLoop(['int i = 0', 'j < 10', 'i++'])).toBeUndefined() - expect(readCountLoop(['int i = 0', 'i < 10', 'i--'])).toBeUndefined() - expect(readCountLoop(['int i = 0', 'i < 10', 'i *= 2'])).toBeUndefined() - }) - - it('schreibt den Java-Kopf aus den Zahlen', () => { - const c = readCountLoop(['', '', ''])! - expect(countLoopLines(c)).toEqual(['int i = 0', 'i < 10', 'i++']) - expect(countLoopLines(setCountField(c, 2, '2')!)).toEqual(['int i = 0', 'i < 10', 'i += 2']) - expect(countLoopLines({ v: 'i', start: '10', op: '>=', end: '1', step: '3' })).toEqual(['int i = 10', 'i >= 1', 'i -= 3']) - expect(setCountField(c, 0, '2.5')).toBeUndefined() - expect(setCountField(c, 2, '0')).toBeUndefined() - expect(setCountField(c, 1, 'mbot.getTimer()')?.end).toBe('mbot.getTimer()') - expect(countVar(1)).toBe('j') - }) - - it('Start 0 im Block ergibt im Code int i = 0, auch in leeren und verschachtelten Schleifen', () => { - const inner = makeElement(ElementType.forSchleife, { textLines: ['', '', ''], loopBody: [] }) - const outer = makeElement(ElementType.forSchleife, { textLines: ['', '', ''], loopBody: [inner] }) - const doc = { elements: [outer] } as unknown as VSDocument - expect(elementWithForDepth(doc, [0, 0, 0]).depth).toBe(1) - expect(replaceBlockValue(doc, [0], 0, '0')).toEqual(['int i = 0', 'i < 10', 'i++']) - expect(replaceBlockValue(doc, [0, 0, 0], 1, '5')).toEqual(['int j = 0', 'j < 5', 'j++']) - expect(replaceBlockValue(doc, [0], 0, '"Hallo"')).toBeUndefined() - // neue Schleife aus „Elemente“ im Rumpf der äußeren: gleich mit j - const fresh = makeElement(ElementType.forSchleife, { textLines: ['', '', ''], loopBody: [] }) - expect(withCountLoopDefaults(doc, [0, 0, 1], fresh).textLines).toEqual(['int j = 0', 'j < 10', 'j++']) - expect(withCountLoopDefaults(doc, [1], fresh).textLines).toEqual(['int i = 0', 'i < 10', 'i++']) - }) -}) diff --git a/web/test/driveGame.test.ts b/web/test/driveGame.test.ts deleted file mode 100644 index 55b4f593..00000000 --- a/web/test/driveGame.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { afterAll, describe, expect, it } from 'vitest' -import { lessons, useContentLanguage, useVisuBotContent } from '../src/learn/content' -import { driveRound, parseDriveGame } from '../src/learn/driveGame' - -describe('Spiel „Wo landet der mBot2?“', () => { - it('liest Runden und meldet Fehler im Format', () => { - const game = parseDriveGame(['titel: t', 'frage: Wo?', 'runde:', ' mbot.forward(60);', 'karte: ... | ... | .^.', 'ziel: 1,0', '> Zwei Felder.'], 't.md') - expect(game.field).toBe(30) - expect(game.rounds[0]).toMatchObject({ code: 'mbot.forward(60);', map: ['...', '...', '.^.'], target: { col: 1, row: 0 }, question: 'Wo?', explanation: 'Zwei Felder.' }) - expect(() => parseDriveGame(['titel: t', 'frage: Wo?', 'runde:', ' mbot.forward();', 'karte: ... | ...', 'ziel: 1,0'], 't.md')).toThrow(/Start/) - expect(() => parseDriveGame(['titel: t', 'frage: Wo?', 'runde:', ' mbot.forward();', 'karte: .^.', 'ziel: 5,0'], 't.md')).toThrow(/außerhalb/) - expect(() => parseDriveGame(['titel: t', 'feld: 25', 'runde:'], 't.md')).toThrow(/feld/) - }) - - it('rechnet die Fahrt mit der Simulation, auch mit Wänden', () => { - const game = parseDriveGame( - ['titel: t', 'frage: Wo?', 'runde:', ' while (mbot.getDistance() > 15) {', ' mbot.forward(30);', ' }', 'karte: ### | ... | ... | .^.', 'ziel: 1,1'], - 't.md', - ) - const result = driveRound(game.rounds[0], game.field) - expect(result.cell).toEqual({ col: 1, row: 1 }) - expect(result.run.bumps).toBe(0) - }) - - describe.each(['de', 'en'] as const)('in den VisuBot-Lektionen (%s)', (lang) => { - afterAll(() => useVisuBotContent('off')) - it('jede Runde endet ohne Anstoßen mitten auf dem angegebenen Feld', () => { - useVisuBotContent('on') - useContentLanguage(lang) - let checked = 0 - for (const lesson of lessons) { - for (const block of lesson.steps.flatMap((s) => s.blocks)) { - if (block.kind !== 'driveGame') continue - for (const [i, round] of block.game.rounds.entries()) { - const where = `${lesson.id}, Runde ${i + 1}` - const result = driveRound(round, block.game.field) - expect(result.problems, where).toEqual([]) - expect(result.run.stop, where).toBe('end') - expect(result.run.bumps, where).toBe(0) - expect(result.cell, where).toEqual(round.target) - const F = block.game.field - const cx = -(round.map[0].length * F) / 2 + (round.target.col + 0.5) * F - const cy = (round.map.length * F) / 2 - (round.target.row + 0.5) * F - expect(Math.hypot(result.end.x - cx, result.end.y - cy), `${where}: nicht mitten im Feld`).toBeLessThan(1) - checked++ - } - } - } - expect(checked).toBeGreaterThanOrEqual(20) - }) - }) -}) diff --git a/web/test/editing.test.ts b/web/test/editing.test.ts deleted file mode 100644 index 622d9153..00000000 --- a/web/test/editing.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { readFileSync } from 'node:fs' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { - deleteAtPath, - elementAt, - insertAfterSibling, - moveAfterSibling, - moveReplacingPlaceholder, - newEmptyDocument, - replaceAtPath, -} from '../src/core/editing' -import { LayoutEngine, diagramDisplayMetrics, type LayoutNode } from '../src/core/layout' -import { ElementType } from '../src/core/model' -import { paletteElement } from '../src/core/palette' -import { decodeDocument, encodeDocument } from '../src/core/xmlCodec' -import { displayElement, flattenNodes } from '../src/ui/renderer' - -const examples = join(__dirname, '..', '..', 'VisuStruct-Dateien') - -describe('Bearbeiten', () => { - it('ersetzt den Platzhalter und fügt dahinter ein', () => { - let doc = newEmptyDocument() - doc = replaceAtPath(doc, [0], paletteElement('verzweigung')) - doc = insertAfterSibling(doc, paletteElement('anweisung'), [0]) - expect(doc.elements.map((e) => e.type)).toEqual([ElementType.verzweigung, ElementType.anweisung]) - // Platzhalter im true-Zweig durch eine Schleife ersetzen - doc = replaceAtPath(doc, [0, 0, 0], paletteElement('whileSchleife')) - expect(elementAt(doc, [0, 0, 0]).type).toBe(ElementType.whileSchleife) - expect(elementAt(doc, [0, 0, 0, 0, 0]).textLines).toEqual(['ø']) - }) - - it('verschiebt Elemente und setzt leere Zweige wieder auf ø', () => { - let doc = newEmptyDocument() - doc = replaceAtPath(doc, [0], paletteElement('verzweigung')) - doc = insertAfterSibling(doc, { ...paletteElement('anweisung'), textLines: ['x = 1'] }, [0]) - doc = moveReplacingPlaceholder(doc, [1], [0, 1, 0]) - expect(doc.elements.length).toBe(1) - expect(elementAt(doc, [0, 1, 0]).textLines).toEqual(['x = 1']) - doc = moveAfterSibling(doc, [0, 1, 0], [0]) - expect(elementAt(doc, [0, 1, 0]).textLines).toEqual(['ø']) - expect(elementAt(doc, [1]).textLines).toEqual(['x = 1']) - doc = deleteAtPath(doc, [1]) - expect(doc.elements.length).toBe(1) - }) - - it('bearbeitete Dateien bleiben im Swift-Format lesbar', () => { - const doc = decodeDocument(readFileSync(join(examples, 'Collatz.visustruct'), 'utf8')) - const edited = insertAfterSibling(doc, paletteElement('fallauswahl'), [0]) - expect(decodeDocument(encodeDocument(edited))).toEqual(edited) - }) -}) - -describe('Layout', () => { - it('Collatz: Kinder liegen innerhalb ihrer Eltern, Geschwister gleich breit', () => { - const doc = decodeDocument(readFileSync(join(examples, 'Collatz.visustruct'), 'utf8')) - const engine = new LayoutEngine(diagramDisplayMetrics(true)) - const layout = engine.layout({ ...doc, elements: doc.elements.map(displayElement) }) - const check = (n: LayoutNode) => { - for (const c of n.children) { - expect(c.frame.x).toBeGreaterThanOrEqual(n.frame.x - 1e-6) - expect(c.frame.x + c.frame.width).toBeLessThanOrEqual(n.frame.x + n.frame.width + 1e-6) - expect(c.frame.y + c.frame.height).toBeLessThanOrEqual(n.frame.y + n.frame.height + 1e-6) - check(c) - } - } - layout.elements.forEach(check) - expect(new Set(layout.elements.map((n) => n.frame.width)).size).toBe(1) - for (const n of flattenNodes(layout.elements)) expect(Number.isFinite(n.frame.height)).toBe(true) - }) -}) diff --git a/web/test/editingParity.test.ts b/web/test/editingParity.test.ts deleted file mode 100644 index 061b0fd2..00000000 --- a/web/test/editingParity.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { - appendCaseToFallauswahl, - caseIndexInMultiway, - elementAt, - multiwayAncestorPath, - newEmptyDocument, - removeCaseFromFallauswahl, - sanitizedSelection, - setFallauswahlCaseName, -} from '../src/core/editing' -import * as L from '../src/core/lineEditorText' -import { ElementType, makeElement, type VSDocument } from '../src/core/model' - -// Port von MultiwayPathTests.swift und LineEditorTextTests.swift, dazu Fälle hinzufügen/entfernen/umbenennen. - -function multiwayDocument(): VSDocument { - const statement = makeElement(ElementType.anweisung, { textLines: ['x = 1'] }) - const inner = makeElement(ElementType.fallauswahl, { - textLines: ['y'], - cases: [ - { name: '1', elements: [statement] }, - { name: 'default', elements: [statement] }, - ], - }) - const outer = makeElement(ElementType.fallauswahl, { - textLines: ['x'], - cases: [ - { name: '1', elements: [statement] }, - { name: 'default', elements: [inner] }, - ], - }) - return { ...newEmptyDocument(), elements: [statement, outer] } -} - -describe('Fallauswahl', () => { - it('findet die innerste Fallauswahl', () => { - const doc = multiwayDocument() - expect(multiwayAncestorPath(undefined, doc)).toBeUndefined() - expect(multiwayAncestorPath([0], doc)).toBeUndefined() - expect(multiwayAncestorPath([1], doc)).toEqual([1]) - expect(multiwayAncestorPath([1, 0, 0], doc)).toEqual([1]) - expect(multiwayAncestorPath([1, 1, 0], doc)).toEqual([1, 1, 0]) - expect(multiwayAncestorPath([1, 1, 0, 1, 0], doc)).toEqual([1, 1, 0]) - }) - - it('Spaltenindex', () => { - expect(caseIndexInMultiway([1], [1])).toBeUndefined() - expect(caseIndexInMultiway(undefined, [1])).toBeUndefined() - expect(caseIndexInMultiway([1, 1, 0], [1])).toBe(1) - }) - - it('fügt Fälle vor default ein, entfernt und benennt sie', () => { - let doc = multiwayDocument() - const added = appendCaseToFallauswahl(doc, [1]) - doc = added.doc - expect(elementAt(doc, [1]).cases!.map((c) => c.name)).toEqual(['1', '2', 'default']) - expect(added.path).toEqual([1, 1, 0]) - expect(elementAt(doc, added.path).textLines).toEqual(['ø']) - doc = setFallauswahlCaseName(doc, [1], 1, ' zwei ') - expect(elementAt(doc, [1]).cases![1].name).toBe('zwei') - expect(() => setFallauswahlCaseName(doc, [1], 1, ' ')).toThrow() - const removed = removeCaseFromFallauswahl(doc, [1], 2) - expect(elementAt(removed.doc, [1]).cases!.map((c) => c.name)).toEqual(['1', 'zwei']) - expect(removed.path).toEqual([1, 1, 0]) - expect(() => removeCaseFromFallauswahl(removed.doc, [1], 0)).toThrow() - }) - - it('bereinigt die Auswahl', () => { - const doc = multiwayDocument() - expect(sanitizedSelection(undefined, doc)).toEqual([0]) - expect(sanitizedSelection([9], doc)).toEqual([0]) - expect(sanitizedSelection([1, 0, 0], doc)).toEqual([1, 0, 0]) - expect(sanitizedSelection([0], { caption: '', elements: [] })).toBeUndefined() - }) -}) - -describe('Zeileneditor', () => { - it('erkennt die Art', () => { - expect(L.ioMode('input: int age')).toBe('input') - expect(L.ioMode(' OUTPUT: x')).toBe('output') - expect(L.ioMode('print: x')).toBe('output') - expect(L.ioMode('x = 1')).toBe('statement') - }) - - it('tauscht das Präfix und behält den Inhalt', () => { - expect(L.applyingIOMode('input', 'print: age')).toBe('input: age') - expect(L.applyingIOMode('output', 'age')).toBe('output: age') - expect(L.applyingIOMode('statement', 'input: age ')).toBe('age') - expect(L.applyingIOMode('input', '')).toBe('input: ') - }) - - it('behält beim Tippen Leerzeichen', () => { - expect(L.strippingPrefixForEditing('input:', 'input: age ')).toBe('age ') - expect(L.strippingPrefixForEditing('if', 'if (a > 3)')).toBe('a > 3') - expect(L.strippingPrefixForEditing('if', 'if a > 3 ')).toBe('a > 3 ') - expect(L.strippingPrefixForEditing('while', 'until x == 1')).toBe('x == 1') - expect(L.strippingPrefixForEditing('if', 'iffy')).toBe('iffy') - }) - - it('setzt das Präfix', () => { - expect(L.prefixingForEditing('while', '')).toBe('while ') - expect(L.prefixingForEditing('while', 'i < 3')).toBe('while i < 3') - }) - - it('normalisiert Anführungszeichen', () => { - expect(L.normalizingQuotes('print: „Hallo“ ‚x’')).toBe('print: "Hallo" \'x\'') - }) - - it('Felder der Zählschleife', () => { - expect(L.paddedForLoopParts([])).toEqual(['', '', '']) - expect(L.paddedForLoopParts(['a', 'b', 'c', 'd'])).toEqual(['a', 'b', 'c']) - expect(L.normalizedForLoopPart('int i = 0;; ')).toBe('int i = 0') - }) -}) diff --git a/web/test/exporter.test.ts b/web/test/exporter.test.ts deleted file mode 100644 index 1bbfd73d..00000000 --- a/web/test/exporter.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -// @vitest-environment node -import { describe, expect, it } from 'vitest' -import { a4PageAndImageRect, buildDiagramPDF, exportFilenameSlug } from '../src/ui/exporter' - -describe('Export (DiagramSnapshotAndExport.swift)', () => { - it('bildet Dateinamen wie sanitizedExportFilenameSlug', () => { - expect(exportFilenameSlug(' Summe bilden / Teil 2 ')).toBe('Summe-bilden-Teil-2') - expect(exportFilenameSlug('Collatz.visustruct')).toBe('Collatz') - expect(exportFilenameSlug('a: b?')).toBe('a-b') - expect(exportFilenameSlug(' ')).toBe('') - }) - - it('wählt Hoch- oder Querformat wie A4SinglePageLayout', () => { - const tall = a4PageAndImageRect(300, 800) - expect(tall.page).toEqual({ width: 595, height: 842 }) - const wide = a4PageAndImageRect(1200, 400) - expect(wide.page).toEqual({ width: 842, height: 595 }) - // Zentriert innerhalb von 32 pt Rand, Seitenverhältnis bleibt. - expect(wide.draw.x).toBeGreaterThanOrEqual(32) - expect(wide.draw.width / wide.draw.height).toBeCloseTo(3, 5) - expect(wide.draw.x * 2 + wide.draw.width).toBeCloseTo(842, 5) - }) - - it('schreibt ein gültiges einseitiges PDF', async () => { - const rgb = new Uint8Array(4 * 2 * 3).fill(200) - const blob = await buildDiagramPDF(rgb, 4, 2, { width: 400, height: 200 }, 'Prüfung') - const bytes = new Uint8Array(await blob.arrayBuffer()) - const text = new TextDecoder('latin1').decode(bytes) - expect(text.startsWith('%PDF-1.4')).toBe(true) - expect(text.trimEnd().endsWith('%%EOF')).toBe(true) - expect(text).toContain('/MediaBox [0 0 842 595]') - // Jeder xref-Eintrag zeigt auf den Anfang seines Objekts. - const xrefAt = Number(/startxref\n(\d+)/.exec(text)![1]) - expect(text.slice(xrefAt, xrefAt + 4)).toBe('xref') - const entries = text.slice(xrefAt).split('\n').slice(3, 9) - entries.forEach((line, i) => { - const off = Number(line.slice(0, 10)) - expect(text.slice(off, off + `${i + 1} 0 obj`.length)).toBe(`${i + 1} 0 obj`) - }) - // Titel als UTF-16 („ü“ = 00FC). - expect(text).toContain('/Title s.length * 7 - -function sample() { - let doc = emptyFlow('Test') - const ids: string[] = [] - for (const [shape, y] of [['start', 60], ['verzweigung', 200], ['anweisung', 340], ['ende', 460]] as const) { - const r = addNode(doc, shape, 240, y, shape) - doc = r.doc - ids.push(r.id) - } - return { doc, ids } -} - -describe('VisuFlow (PAP)', () => { - it('verbindet Ausgänge mit Eingängen, ein Pfeil pro Ausgang', () => { - const { doc, ids } = sample() - let d = connect(doc, ids[0], 'out', ids[1]) - d = connect(d, ids[1], 'ja', ids[2]) - d = connect(d, ids[1], 'ja', ids[3]) - expect(d.edges.filter((e) => e.from === ids[1])).toEqual([expect.objectContaining({ port: 'ja', to: ids[3] })]) - expect(freePort(d, d.nodes[1])).toBe('nein') - // Start hat keinen Eingang, Ende keinen Ausgang, kein Pfeil auf sich selbst. - expect(connect(d, ids[2], 'out', ids[0])).toBe(d) - expect(connect(d, ids[3], 'out', ids[2])).toBe(d) - expect(connect(d, ids[2], 'out', ids[2])).toBe(d) - }) - - it('Löschen nimmt die Pfeile mit, Datei geht hin und zurück', () => { - const { doc, ids } = sample() - let d = connect(connect(doc, ids[0], 'out', ids[1]), ids[1], 'nein', ids[2]) - d = swapYesNo(d, ids[1]) - const back = flowFromJSON(flowToJSON(d))! - expect(back.title).toBe('Test') - expect(back.nodes).toEqual(d.nodes) - expect(back.edges.map((e) => [e.from, e.port, e.to])).toEqual(d.edges.map((e) => [e.from, e.port, e.to])) - expect(portSide(back, back.nodes[1], 'ja')).toBe('right') - expect(removeNode(d, ids[1]).edges).toEqual([]) - expect(flowFromJSON('kein json')).toBeUndefined() - }) - - it('Pfeil zurück nach oben läuft rechts an beiden Symbolen vorbei', () => { - const { doc } = sample() - const top = flowBox(doc.nodes[1], measure) - const low = flowBox(doc.nodes[2], measure) - const down = routeEdge(top, 'bottom', low) - expect(down).toEqual([[240, top.y + top.h / 2], [240, low.y - low.h / 2]]) - const up = routeEdge(low, 'bottom', top) - const right = Math.max(top.x + top.w / 2, low.x + low.w / 2) - expect(up.some(([x]) => x > right)).toBe(true) - expect(up.at(-1)).toEqual([240, top.y - top.h / 2]) - }) -}) diff --git a/web/test/glossary.test.ts b/web/test/glossary.test.ts deleted file mode 100644 index cf09f948..00000000 --- a/web/test/glossary.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -// @vitest-environment jsdom -import { describe, expect, it } from 'vitest' -import { contentLanguages, glossary, lessons, useContentLanguage } from '../src/learn/content' -import { markdownToHTML } from '../src/learn/markdown' -import { parseGlossary } from '../src/learn/glossary' -import { markPointers, markTerms, uiTargets } from '../src/ui/termTips' - -const entries = parseGlossary(`Vorspann wird ignoriert. - -### Variable -auch: Variablen -Eine beschriftete Kiste. - -### Schleife -auch: Schleifen -Wiederholt Schritte. -`) - -function step(html: string): HTMLElement { - const root = document.createElement('div') - root.innerHTML = html - markTerms(root, entries) - return root -} - -describe('Fachbegriffe', () => { - it('liest Begriffe, Formen und Erklärung', () => { - expect(entries).toEqual([ - { term: 'Variable', forms: ['Variable', 'Variablen'], text: 'Eine beschriftete Kiste.' }, - { term: 'Schleife', forms: ['Schleife', 'Schleifen'], text: 'Wiederholt Schritte.' }, - ]) - }) - - it.each(contentLanguages)('jeder Begriff in begriffe.md hat eine Erklärung (%s)', (lang) => { - useContentLanguage(lang) - expect(glossary.length).toBeGreaterThan(10) - for (const e of glossary) expect(e.text, e.term).not.toBe('') - }) - - it('markiert nur das erste Vorkommen je Schritt', () => { - const root = step('

    Zwei Variablen und noch eine Variable.

    Variable

    ') - const marks = [...root.querySelectorAll('.term')] - expect(marks.map((m) => m.textContent)).toEqual(['Variablen']) - expect((marks[0] as HTMLElement).dataset.text).toBe('Eine beschriftete Kiste.') - }) - - it('lässt fett erklärte Begriffe, Code und Zusammensetzungen aus', () => { - const root = step('

    Eine Variable ist … `x` ist eine Variable. Schleife While-Schleife Schleifenzähler

    ') - expect(root.querySelectorAll('.term').length).toBe(0) - }) - - it('markiert nur in Lektionstexten', () => { - const root = step('

    Variable

    Eine Schleife.

    ') - expect([...root.querySelectorAll('.term')].map((m) => m.textContent)).toEqual(['Schleife']) - }) -}) - -describe('Zeiger auf den Editor', () => { - it.each(contentLanguages)('jeder Zeiger in einer Lektion nennt einen bekannten Bereich (%s)', (lang) => { - useContentLanguage(lang) - for (const l of lessons) - for (const s of l.steps) - for (const b of s.blocks) - if (b.kind === 'markdown') - for (const m of b.text.matchAll(/\(#zeige-([^)]*)\)/g)) expect(Object.keys(uiTargets), `${l.id} / ${s.title}`).toContain(m[1]) - }) - - it('macht aus dem Link einen Zeiger und lässt ihn bei den Fachbegriffen aus', () => { - const root = document.createElement('div') - root.innerHTML = `
    ${markdownToHTML('Links die [Elemente](#zeige-elemente) und eine Variable.')}
    ` - markPointers(root) - markTerms(root, entries) - expect(root.querySelector('a')).toBeNull() - expect(root.querySelector('.ui-pointer')?.dataset.target).toBe('elemente') - expect([...root.querySelectorAll('.term')].map((m) => m.textContent)).toEqual(['Variable']) - }) -}) - -describe('Tabellen im Lektionstext', () => { - it('wird zu einer HTML-Tabelle', () => { - const html = markdownToHTML('| Schritt | i |\n|---|---|\n| `i = 1` | 1 |\n| `i++` | 2 |') - expect(html).toContain('Schritt') - expect(html).toContain('i = 11') - expect(html.match(//g)?.length).toBe(3) - }) -}) diff --git a/web/test/i18n.test.ts b/web/test/i18n.test.ts deleted file mode 100644 index ff0d7f5c..00000000 --- a/web/test/i18n.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -// @vitest-environment node -import { readdirSync, readFileSync } from 'node:fs' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { languages, parseStrings } from '../src/ui/i18n' - -const appDir = join(__dirname, '../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct') -const webDir = join(__dirname, '../src/i18n') -const read = (p: string) => parseStrings(readFileSync(p, 'utf8')) -const placeholders = (s: string) => (s.match(/%(\d+\$)?[@d]/g) ?? []).sort().join() - -describe('Sprachen (AppLanguage.swift)', () => { - const english = new Map([...read(join(appDir, 'en.lproj/Localizable.strings')), ...read(join(webDir, 'en.strings'))]) - const webEnglish = read(join(webDir, 'en.strings')) - - it('jeder Schlüssel im Code hat einen englischen Text', () => { - const srcDir = join(__dirname, '../src/ui') - const used = new Set() - for (const f of readdirSync(srcDir).filter((f) => f.endsWith('.ts'))) { - for (const m of readFileSync(join(srcDir, f), 'utf8').matchAll(/\bt\(\s*'([a-z0-9_]+)'/g)) used.add(m[1]) - } - expect(used.size).toBeGreaterThan(50) - expect([...used].filter((k) => !english.has(k))).toEqual([]) - }) - - it('jede Sprache hat alle Web-Texte mit denselben Platzhaltern', () => { - for (const { code } of languages) { - if (code === 'java') continue - const web = read(join(webDir, `${code}.strings`)) - // Lernbereich, VisuBot, VisuObject und VisuFlow gibt es auf Deutsch, Englisch und Portugiesisch; sonst Englisch. - const required = [...webEnglish.keys()].filter((k) => !k.startsWith('web_learn_') && !k.startsWith('web_visubot_') && !k.startsWith('web_visuobject_') && !k.startsWith('web_visuflow_')) - expect(required.filter((k) => !web.has(k)), code).toEqual([]) - for (const [k, v] of web) expect(placeholders(v), `${code} ${k}`).toBe(placeholders(webEnglish.get(k)!)) - } - }) - - it('liest Escapes wie Apple', () => { - const m = parseStrings('/* x */\n"a" = "Zeile\\nzwei \\"q\\"";\n// y\n"b"="c";') - expect(m.get('a')).toBe('Zeile\nzwei "q"') - expect(m.get('b')).toBe('c') - }) -}) diff --git a/web/test/inlineEdit.test.ts b/web/test/inlineEdit.test.ts deleted file mode 100644 index 5dd235f9..00000000 --- a/web/test/inlineEdit.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { caseBandHeight, caseLabelAt, caseLabelRect, textRect } from '../src/ui/inlineEdit' -import type { LayoutNode } from '../src/core/layout' -import { ElementType, makeElement } from '../src/core/model' - -const node = (type: ElementType, extra: Partial = {}): LayoutNode => ({ - idPath: [0], - element: makeElement(type), - frame: { x: 10, y: 20, width: 300, height: 120 }, - headerBandHeight: 60, - topBandHeight: 0, - loopBodyLeadingInset: 20, - caseColumnFrames: [], - children: [], - ...extra, -}) - -describe('Text direkt im Struktogramm bearbeiten', () => { - it('Anweisung: ganzes Feld', () => { - expect(textRect(node(ElementType.anweisung), 20)).toEqual({ x: 10, y: 20, width: 300, height: 120 }) - }) - - it('Schleife: nur der Kopf über dem Rumpf', () => { - const body = node(ElementType.anweisung, { frame: { x: 30, y: 60, width: 280, height: 80 } }) - expect(textRect(node(ElementType.whileSchleife, { children: [body] }), 20)).toEqual({ x: 10, y: 20, width: 300, height: 40 }) - }) - - it('Do-while: der Fuß', () => { - expect(textRect(node(ElementType.doUntilSchleife, { headerBandHeight: 30 }), 20)).toEqual({ x: 10, y: 110, width: 300, height: 30 }) - }) - - it('Fallauswahl: Fallname unter dem Dach erkennen', () => { - const cols = [ - { x: 10, y: 80, width: 100, height: 60 }, - { x: 110, y: 80, width: 100, height: 60 }, - { x: 210, y: 80, width: 100, height: 60 }, - ] - const fa = node(ElementType.fallauswahl, { caseColumnFrames: cols }) - const band = caseBandHeight(20) - expect(caseLabelAt(fa, 150, 80 - 5, 20)).toBe(1) - expect(caseLabelAt(fa, 150, 80 - band - 5, 20)).toBeUndefined() - expect(caseLabelAt(node(ElementType.verzweigung, { caseColumnFrames: cols }), 150, 75, 20)).toBeUndefined() - expect(caseLabelRect(fa, 2, 20)).toEqual({ x: 210, y: 80 - band, width: 100, height: band }) - }) -}) diff --git a/web/test/javaEditor.test.ts b/web/test/javaEditor.test.ts deleted file mode 100644 index 5df79b76..00000000 --- a/web/test/javaEditor.test.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { completions, JavaEditor } from '../src/ui/javaEditor' -import { parseLiveJava } from '../src/core/javaParser' -import type { LiveLabels } from '../src/core/codeGenerator' - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } -const hooks = { onChange() {}, onCaret() {}, onUndo() {}, words: () => ({}) as never, breakpointLine: (line: number) => line, onBreakpoints() {} } - -function editorWith(text: string) { - const editor = new JavaEditor(document.createElement('div'), hooks, 'Code') - editor.setText(text) - editor.setMarks({ placeholders: parseLiveJava(text, labels).placeholders, problems: [] }, false) - return editor -} - -describe('Code-Editor: Platzhalter', () => { - it('Einfügen hinter „// Dein Code“ ersetzt den Platzhalter', () => { - const editor = editorWith('// Dein Code') - const end = editor.text.length - editor.view.dispatch({ changes: { from: end, insert: 'import javax.swing.*;\n' }, userEvent: 'input.paste' }) - expect(editor.text).toBe('import javax.swing.*;\n') - editor.view.destroy() - }) - - it('Einfügen an anderer Stelle lässt den Text stehen', () => { - const editor = editorWith('int x = 1;') - editor.view.dispatch({ changes: { from: 0, insert: '// a\n' }, userEvent: 'input.paste' }) - expect(editor.text).toBe('// a\nint x = 1;') - editor.view.destroy() - }) -}) - -describe('Code-Editor: Kürzel', () => { - it('syso, sout und main stehen in den Vorschlägen', () => { - const words = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: '', step: '', branch: '', branchElse: '', switchCase: '', forLoop: '', whileLoop: '', doLoop: '', output: 'Ausgabe', input: 'Eingabe' } - const labels = completions(words).map((c) => c.label) - expect(labels).toEqual(expect.arrayContaining(['syso', 'sysout', 'sout', 'main', 'psvm'])) - }) - - it('Schlüsselwörter für Klassen und Methoden stehen in den Vorschlägen', () => { - const words = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: '', step: '', branch: '', branchElse: '', switchCase: '', forLoop: '', whileLoop: '', doLoop: '', output: 'Ausgabe', input: 'Eingabe' } - const labels = completions(words).map((c) => c.label) - expect(labels).toEqual(expect.arrayContaining(['public', 'private', 'static', 'void', 'class', 'public class', 'try … catch', 'JButton'])) - expect(new Set(labels).size).toBe(labels.length) - }) - - it('mbot nur in VisuBot', () => { - const words = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: '', step: '', branch: '', branchElse: '', switchCase: '', forLoop: '', whileLoop: '', doLoop: '', output: 'Ausgabe', input: 'Eingabe' } - expect(completions(words).map((c) => c.label)).not.toContain('mbot') - expect(completions({ ...words, robot: true }).map((c) => c.label)).toContain('mbot') - }) -}) - -describe('Code-Editor: Einrücken', () => { - it('rückt den ganzen Code ein, ohne Markierung', () => { - const editor = editorWith('if (x > 0) {\nx--;\n }') - editor.indent() - expect(editor.text).toBe('if (x > 0) {\n x--;\n}') - editor.view.destroy() - }) - - it('formatiert dabei: } auf eigener Zeile, Leerzeichen um >=', () => { - const editor = editorWith('if (punkte>=50) {\n a();} else {\n b();}') - editor.indent() - expect(editor.text).toBe('if (punkte >= 50) {\n a();\n} else {\n b();\n}') - editor.view.destroy() - }) -}) - -describe('Code-Editor: Scanner-Zeile', () => { - const words = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: '', step: '', branch: '', branchElse: '', switchCase: '', forLoop: '', whileLoop: '', doLoop: '', output: 'Ausgabe', input: 'Eingabe' } - const scannerLine = () => completions(words).find((c) => c.label === 'Scanner scanner = new Scanner(System.in);')! - const accept = (text: string) => { - const editor = editorWith(text) - const from = editor.text.indexOf('Scanner') - const apply = scannerLine().apply as (view: unknown, c: unknown, from: number, to: number) => void - apply(editor.view, scannerLine(), from, from + 'Scanner'.length) - const result = editor.text - editor.view.destroy() - return result - } - - it('ergänzt die Zeile und den fehlenden Import', () => { - expect(accept('public class Main {\n public static void main(String[] args) {\n Scanner\n }\n}')).toBe( - 'import java.util.Scanner;\n\npublic class Main {\n public static void main(String[] args) {\n Scanner scanner = new Scanner(System.in);\n }\n}', - ) - }) - - it('lässt einen vorhandenen Import stehen', () => { - expect(accept('import java.util.*;\n\nScanner')).toBe('import java.util.*;\n\nScanner scanner = new Scanner(System.in);') - }) - - it('setzt den Import zu den anderen Imports', () => { - expect(accept('import javax.swing.*;\n\nScanner')).toBe('import java.util.Scanner;\nimport javax.swing.*;\n\nScanner scanner = new Scanner(System.in);') - }) - - it('der erzeugte Code hat keinen Fehler', () => { - const code = accept('public class Main {\n public static void main(String[] args) {\n Scanner\n int zahl = scanner.nextInt();\n }\n}') - expect(parseLiveJava(code, labels).problems).toEqual([]) - }) -}) diff --git a/web/test/javaFormat.test.ts b/web/test/javaFormat.test.ts deleted file mode 100644 index 97d543bc..00000000 --- a/web/test/javaFormat.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { formatJava } from '../src/core/javaFormat' - -describe('Formatieren', () => { - it('schließende Klammern auf eigener Zeile, Leerzeichen um Operatoren (Beispiel von Holger)', () => { - const code = `import java.util.Scanner; -Scanner scanner = new Scanner(System.in); -int punkte = scanner.nextInt(); -if (punkte>=50) { - System.out.println("Bestanden");} else { - System.out.println("Nicht bestanden");}` - expect(formatJava(code)).toBe(`import java.util.Scanner; -Scanner scanner = new Scanner(System.in); -int punkte = scanner.nextInt(); -if (punkte >= 50) { - System.out.println("Bestanden"); -} else { - System.out.println("Nicht bestanden"); -}`) - }) - - it('Klassen, Schleifen, try/catch, Lambda, Generics und Array-Initialisierer', () => { - const code = `public class A{ -public static void main(String[] args){ -int[] a={1,2,3}; int x=-1; double d=(double) -x*2; -for(int i=0;i l=new ArrayList<>(); Map> m = new HashMap<>(); -do{x--;}while(x>0); -try{x=1/x;}catch(Exception e){x=0;}finally{x++;} -button.addActionListener(e->{x++;}); -if(x<5&&!b){y=x>3?1:0;}else if(x==2) {return;} -for (int z:a) {} -switch(x){case 1->{x=2;} default->x=3;} -String s="a{b}x>=1"+x; // Kommentar {x=1;} -} -}` - expect(formatJava(code)).toBe(`public class A { - public static void main(String[] args) { - int[] a = {1, 2, 3}; - int x = -1; - double d = (double) -x * 2; - for (int i = 0; i < a.length; i++) { - x += a[i]; - } - List l = new ArrayList<>(); - Map> m = new HashMap<>(); - do { - x--; - } while (x > 0); - try { - x = 1 / x; - } catch (Exception e) { - x = 0; - } finally { - x++; - } - button.addActionListener(e -> { - x++; - }); - if (x < 5 && !b) { - y = x > 3 ? 1 : 0; - } else if (x == 2) { - return; - } - for (int z : a) {} - switch (x) { - case 1 -> { - x = 2; - } - default -> x = 3; - } - String s = "a{b}x>=1" + x; // Kommentar {x=1;} - } -}`) - }) - - it('gut formatierter Code bleibt, wie er ist', () => { - const code = `import java.util.*; - -public class Main { - public static void main(String[] args) { - switch (x) { - case 1: - x = 2; - break; - default: - x = 0; - } - /* - * Blockkommentar - */ - if (Alter über 18?) { - System.out.println("Erwachsen"); - } - } -}` - expect(formatJava(code)).toBe(code) - }) - - it('nur die angegebenen Zeilen', () => { - expect(formatJava('if (a) {b();}\nif (c) {d();}', 2, 2)).toBe('if (a) {b();}\nif (c) {\n d();\n}') - }) -}) diff --git a/web/test/javaIndent.test.ts b/web/test/javaIndent.test.ts deleted file mode 100644 index d01939cd..00000000 --- a/web/test/javaIndent.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { indentJava } from '../src/core/javaIndent' - -const flat = (code: string) => code.split('\n').map((l) => l.trim()).join('\n') - -describe('Einrücken', () => { - it('Blöcke, switch, try/catch und Lambda wie in Eclipse', () => { - const code = `public class A { - public static void main(String[] args) { - int x = 3; // Kommentar mit { - if (x > 2) { - System.out.println("a { b"); - } else { - System.out.println("b"); - } - switch (x) { - case 1 -> { - System.out.println("1"); - } - default -> { - x++; - } - } - switch (x) { - case 1: - x = 2; - break; - default: - x = 0; - } - try { - x = 1 / x; - } catch (ArithmeticException e) { - x = 0; - } - button.addActionListener(e -> { - x++; - }); - /* - * Blockkommentar - */ - } -}` - expect(indentJava(flat(code))).toBe(code) - }) - - it('Pseudocode und halbfertiger Code', () => { - expect(indentJava('if (Alter über 18?) {\nSystem.out.println("Erwachsen");\n} else {\n x\n}')).toBe( - 'if (Alter über 18?) {\n System.out.println("Erwachsen");\n} else {\n x\n}', - ) - expect(indentJava('while (x > 0) {\nx--;')).toBe('while (x > 0) {\n x--;') - expect(indentJava('}\n}\nx++;')).toBe('}\n}\nx++;') - }) - - it('nur die angegebenen Zeilen', () => { - expect(indentJava('if (a) {\nb();\nc();\n}', 3, 3)).toBe('if (a) {\nb();\n c();\n}') - }) -}) diff --git a/web/test/javaMembers.test.ts b/web/test/javaMembers.test.ts deleted file mode 100644 index e7794490..00000000 --- a/web/test/javaMembers.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { declaredType, memberCompletionsAt, receiverType } from '../src/core/javaMembers' -import { memberCompletion } from '../src/ui/javaEditor' - -/** Vorschläge am Ende von `code`. */ -function names(code: string, lang: 'de' | 'en' | 'pt' = 'de') { - return memberCompletionsAt(code, code.length, lang)?.members.map((m) => m.name) -} - -const program = (body: string) => `import java.util.Scanner;\n\npublic class Main {\n public static void main(String[] args) {\n ${body}` - -describe('Vorschläge nach dem Punkt', () => { - it('schlägt nach mbot.led(0). setColor vor', () => { - expect(names(program('mbot.led(0).'))).toEqual(['setColor']) - }) - - it('Scanner mit beliebigem Namen: nextInt, nextLine …', () => { - const list = names(program('Scanner eingabe = new Scanner(System.in);\n int x = eingabe.')) - expect(list).toEqual(expect.arrayContaining(['nextInt', 'nextLine', 'nextDouble', 'hasNextLine', 'next'])) - }) - - it('angefangener Name: from zeigt hinter den Punkt', () => { - const code = program('Scanner sc = new Scanner(System.in);\n sc.nex') - expect(memberCompletionsAt(code, code.length)?.from).toBe(code.length - 3) - }) - - it('String, String-Array und Element', () => { - const decl = 'String name = "Ludwig";\n String[] namen = {"a"};\n ' - expect(names(program(decl + 'name.'))).toEqual(expect.arrayContaining(['length', 'charAt', 'equals', 'substring'])) - expect(names(program(decl + 'namen.'))).toEqual(['length']) - expect(names(program(decl + 'namen[0].'))).toContain('charAt') - expect(names(program(decl + 'args.'))).toEqual(['length']) - }) - - it('Ketten: eingabe.nextLine(). → String-Methoden, System.out. → println', () => { - expect(names(program('Scanner e = new Scanner(System.in);\n e.nextLine().'))).toContain('trim') - expect(names(program('System.'))).toEqual(expect.arrayContaining(['out', 'in'])) - expect(names(program('System.out.'))).toEqual(expect.arrayContaining(['println', 'print', 'printf'])) - expect(names(program('"Hallo".'))).toContain('toUpperCase') - }) - - it('Klassen mit Punkt: Math, Integer, Color', () => { - expect(names(program('double z = Math.'))).toEqual(expect.arrayContaining(['random', 'sqrt', 'pow', 'PI'])) - expect(names(program('int z = Integer.'))).toContain('parseInt') - expect(names(program('knopf.setBackground(Color.'))).toContain('RED') - }) - - it('Swing: JFrame, JButton, JLabel, JTextField mit geerbten Methoden', () => { - const swing = 'JFrame fenster = new JFrame("Hallo");\n JButton knopf = new JButton("OK");\n JTextField feld = new JTextField(10);\n JLabel l = new JLabel();\n ' - expect(names(program(swing + 'fenster.'))).toEqual(expect.arrayContaining(['setSize', 'setVisible', 'add', 'setLayout', 'setDefaultCloseOperation', 'setTitle'])) - expect(names(program(swing + 'knopf.'))).toEqual(expect.arrayContaining(['addActionListener', 'setText', 'setBackground'])) - expect(names(program(swing + 'feld.'))).toEqual(expect.arrayContaining(['getText', 'setText'])) - expect(names(program(swing + 'l.'))).toContain('setText') - expect(names(program(swing + 'fenster.setDefaultCloseOperation(JFrame.'))).toEqual(['EXIT_ON_CLOSE']) - }) - - it('Typen aus for-each, catch und var', () => { - expect(declaredType('for (String wort : woerter) {', 'wort')).toBe('String') - expect(declaredType('} catch (NumberFormatException fehler) {', 'fehler')).toBe('NumberFormatException') - expect(names('try { } catch (NumberFormatException fehler) {\n fehler.')).toContain('getMessage') - expect(declaredType('var sc = new Scanner(System.in);', 'sc')).toBe('Scanner') - expect(declaredType('int[][] feld = new int[3][3];', 'feld')).toBe('int[][]') - expect(receiverType('int[][] feld;', 'feld[0]')?.type).toBe('int[]') - }) - - it('Unbekanntes und Zahlen: keine Liste (die normalen Vorschläge bleiben)', () => { - expect(names(program('int zahl = 3;\n zahl.'))).toBeUndefined() - expect(names(program('unbekannt.'))).toBeUndefined() - expect(names(program('double d = 3.'))).toBeUndefined() - }) - - it('Beschreibung in der eingestellten Sprache, Englisch als Rückfall', () => { - const code = program('Scanner eingabe = new Scanner(System.in);\n eingabe.') - const de = memberCompletionsAt(code, code.length, 'de')!.members.find((m) => m.name === 'nextInt')! - const en = memberCompletionsAt(code, code.length, 'en')!.members.find((m) => m.name === 'nextInt')! - expect(de.description).toBe('Ganze Zahl einlesen') - expect(en.description).toBe('Read a whole number') - }) - - it('Vorschlag: Klammern, Felder ohne Klammern', () => { - const code = program('Scanner eingabe = new Scanner(System.in);\n String t = "";\n String[] a = {};\n ') - const at = (expr: string) => memberCompletionsAt(code + expr, (code + expr).length)!.members - const nextInt = memberCompletion(at('eingabe.').find((m) => m.name === 'nextInt')!) - expect(nextInt.label).toBe('nextInt()') - expect(nextInt.apply).toBe('nextInt()') - expect(nextInt.detail).toBe('int · Ganze Zahl einlesen') - expect(memberCompletion(at('t.').find((m) => m.name === 'charAt')!).label).toBe('charAt(…)') - expect(memberCompletion(at('a.')[0]).apply).toBe('length') - }) -}) diff --git a/web/test/javaParser.test.ts b/web/test/javaParser.test.ts deleted file mode 100644 index 567b1251..00000000 --- a/web/test/javaParser.test.ts +++ /dev/null @@ -1,401 +0,0 @@ -import { readdirSync, readFileSync, statSync } from 'node:fs' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import type { LiveLabels } from '../src/core/codeGenerator' -import { setTextLines, insertAfterSibling } from '../src/core/editing' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava, mergeLiveJava, plainLiveJava, type JavaForm } from '../src/core/liveSource' -import { ElementType, makeElement, type VSDocument } from '../src/core/model' -import { decodeDocument } from '../src/core/xmlCodec' -import { SimulationEngine } from '../src/core/simulation' -import { onlyLineBreaksMissing, sameOutput } from '../src/core/exerciseCheck' -import { generateCode } from '../src/core/codeGenerator' -import { indentJava } from '../src/core/javaIndent' - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } -const parse = (src: string, subprograms?: Set) => parseLiveJava(src, labels, { subprograms }) -const doc = (src: string): VSDocument => documentFromJava({ caption: '', elements: [] }, parse(src)) -const forms: JavaForm[] = [ - { asClass: false, withMain: false }, - { asClass: false, withMain: true }, - { asClass: true, withMain: false }, - { asClass: true, withMain: true }, -] -const types = (src: string) => parse(src).elements.map((e) => e.type) - -/** Alle Struktogramme im Repo: Beispiele, Lektionen, Übungen. */ -function diagramFiles(dir: string, out: string[] = []): string[] { - for (const name of readdirSync(dir)) { - if (name === 'node_modules' || name.startsWith('.')) continue - const path = join(dir, name) - if (statSync(path).isDirectory()) diagramFiles(path, out) - else if (name.endsWith('.visustruct')) out.push(path) - } - return out -} - -describe('Java tippen → Struktogramm', () => { - it('der Knopf „Einrücken“ lässt erzeugten Code unverändert', () => { - for (const file of diagramFiles(join(__dirname, '..', '..'))) { - const original = decodeDocument(readFileSync(file, 'utf8')) - for (const form of forms) { - const code = plainLiveJava(original, labels, form) - expect(indentJava(code), `${file} ${JSON.stringify(form)}`).toBe(code) - } - } - }) - - it('jedes Struktogramm im Repo: Code → Struktogramm → derselbe Code', () => { - const files = diagramFiles(join(__dirname, '..', '..')) - expect(files.length).toBeGreaterThan(100) - for (const file of files) { - const original = decodeDocument(readFileSync(file, 'utf8')) - for (const form of forms) { - const code = plainLiveJava(original, labels, form) - const back = documentFromJava(original, parse(code)) - expect(plainLiveJava(back, labels, form), `${file} ${JSON.stringify(form)}`).toBe(code) - expect(back.caption, file).toBe(original.caption) - } - const code = plainLiveJava(original, labels) - const parsed = parse(code) - // Fehlendes `;` erzeugt der Generator selbst bei Pseudocode wie „Switch on the kettle“. - // Übungen „Warum läuft das nicht?“ starten absichtlich mit falscher Schreibweise (`system.out`, `.Length`). - if (!file.endsWith('-laeuft-nicht-start.visustruct')) expect(parsed.problems.filter((p) => p.arg !== ';'), file).toEqual([]) - } - }) - - it('Grundformen werden zu den passenden Kästen', () => { - const src = [ - 'int x = 5;', - 'System.out.println("Hallo " + x);', - 'if (x > 3) { x--; } else { x++; }', - 'while (x < 10) { x++; }', - 'do { x--; } while (x > 0);', - 'for (int i = 0; i < 3; i++) { x += i; }', - 'while (true) { break; }', - 'switch (x) { case 1 -> { x = 2; } default -> { x = 0; } }', - ].join('\n') - expect(types(src)).toEqual([ - ElementType.anweisung, - ElementType.anweisung, - ElementType.verzweigung, - ElementType.whileSchleife, - ElementType.doUntilSchleife, - ElementType.forSchleife, - ElementType.endlosschleife, - ElementType.fallauswahl, - ]) - const els = parse(src).elements - expect(els[0].textLines).toEqual(['int x = 5']) - expect(els[1].textLines).toEqual(['output: "Hallo " + x']) - expect(els[5].textLines).toEqual(['int i = 0', 'i < 3', 'i++']) - expect(els[7].cases?.map((c) => c.name)).toEqual(['1', 'default']) - }) - - it('println ist schon beim Tippen eine Ausgabe', () => { - expect(parse('System.out.println();').elements[0].textLines).toEqual(['output: ']) - expect(parse('System.out.println(').elements[0].textLines).toEqual(['output: ']) - expect(parse('System.out.println("Hal').elements[0].textLines).toEqual(['output: "Hal']) - expect(plainLiveJava(doc('System.out.println();'), labels)).toBe('System.out.println();') - }) - - it('Eingabe mit Hinweis wird ein Eingabe-Kasten', () => { - const els = parse('System.out.println("Wie alt bist du?");\nint alter = scanner.nextInt();').elements - expect(els.map((e) => e.textLines)).toEqual([['input: int alter "Wie alt bist du?"']]) - expect(parse('System.out.println("n: ");\nint n = scanner.nextInt();').elements[0].textLines).toEqual(['input: int n']) - expect(parse('String w = scanner.nextLine();').elements[0].textLines).toEqual(['input: String w']) - }) - - it('Klasse mit main und Unterprogramm-Kopf', () => { - const cls = parse('import java.util.Scanner;\npublic class A {\n public static void main(String[] args) {\n int x = 1;\n }\n}') - expect(cls.caption).toBeUndefined() - expect(cls.elements[0].textLines).toEqual(['int x = 1']) - const method = parse('public static int quadrat(int x) {\n return x * x;\n}') - expect(method.caption).toBe('int quadrat(int x)') - expect(method.elements[0].textLines).toEqual(['return x * x']) - }) - - it('Klasse und main: Titel = Klassenname, in beide Richtungen', () => { - const doc0: VSDocument = { caption: 'Rechner', elements: [makeElement(ElementType.anweisung, { textLines: ['input: int x'] })] } - expect(plainLiveJava(doc0, labels, { asClass: true, withMain: true })).toBe( - [ - 'import java.util.Scanner;', - '', - 'public class Rechner {', - ' public static void main(String[] args) {', - ' Scanner scanner = new Scanner(System.in);', - '', - ' System.out.println("x: ");', - ' int x = scanner.nextInt();', - ' }', - '}', - ].join('\n'), - ) - // Der Import steht auch um `main` herum ganz oben, im Snippet in der ersten Zeile. - expect(plainLiveJava(doc0, labels, { asClass: false, withMain: true }).split('\n').slice(0, 3)).toEqual([ - 'import java.util.Scanner;', - '', - 'public static void main(String[] args) {', - ]) - expect(plainLiveJava(doc0, labels).split('\n')[0]).toBe('import java.util.Scanner;') - // Klassenname tippen ändert den Titel … - expect(documentFromJava(doc0, parse('public class Taschenrechner {\n}')).caption).toBe('Taschenrechner') - // … aber aus „Mein Programm“ wird `Mein_Programm`, und der Titel bleibt. - expect(documentFromJava({ ...doc0, caption: 'Mein Programm' }, parse('public class Mein_Programm {\n}')).caption).toBe('Mein Programm') - // Klasse ohne main: Anweisungen direkt in der Klasse. - expect(parse('public class A {\n int x = 1;\n}').elements[0].textLines).toEqual(['int x = 1']) - }) - - it('Scanner ohne import ist ein Fehler, wie bei javac', () => { - const keys = (src: string) => parse(src).problems.map((p) => p.key) - expect(keys('Scanner scanner = new Scanner(System.in);\nint x = scanner.nextInt();')).toEqual(['web_parse_missing_import']) - expect(keys('import java.util.Scanner;\nScanner scanner = new Scanner(System.in);')).toEqual([]) - expect(keys('import java.util.*;\npublic class A {\n public static void main(String[] args) {\n Scanner s = new Scanner(System.in);\n }\n}')).toEqual([]) - // Nur im Kommentar oder in einem Text zählt nicht. - expect(keys('// import java.util.Scanner;\nScanner s = new Scanner(System.in);')).toEqual(['web_parse_missing_import']) - expect(keys('System.out.println("Scanner");')).toEqual([]) - }) - - it('\\n in einer Ausgabe beginnt eine neue Zeile; fehlende Zeilenumbrüche werden erkannt', () => { - const run = (src: string) => { - const engine = new SimulationEngine(doc(src)) - let steps = 0 - while (engine.canStep && steps++ < 1000) engine.step() - return engine.state.outputLines - } - const expected = ['Ludwig ist 7 Jahre alt.', 'Größe: 1.2 m'] - expect(run('System.out.print("Ludwig ist 7 Jahre alt.\\n");\nSystem.out.print("Größe: 1.2 m");')).toEqual(expected) - expect(run('System.out.println("A\\nB");\nSystem.out.print("C");')).toEqual(['A', 'B', 'C']) - const joined = run('System.out.print("Ludwig ist 7 Jahre alt.");\nSystem.out.print("Größe: 1.2 m");') - expect(sameOutput(joined, expected)).toBe(false) - expect(onlyLineBreaksMissing(joined, expected)).toBe(true) - expect(onlyLineBreaksMissing(['Ludwig ist 7 Jahre alt. Größe: 1.3 m'], expected)).toBe(false) - expect(onlyLineBreaksMissing(expected, expected)).toBe(false) - }) - - it('System.out.print schreibt ohne neue Zeile, auch mit Array-Fach', () => { - const d = doc( - 'int[] intAllgemeinFach = {3, 5};\n' + - 'for (int i = 0; i < intAllgemeinFach.length; i++) {\n' + - ' System.out.print(intAllgemeinFach[i] + ": ");\n' + - ' System.out.println("ok");\n' + - '}\n' + - 'System.out.print("A");\n' + - 'System.out.print("B");\n' + - 'System.out.println();', - ) - const engine = new SimulationEngine(d) - let steps = 0 - while (engine.canStep && steps++ < 1000) engine.step() - expect(engine.message).not.toMatch(/Nicht unterstützte|Unsupported/u) - expect(engine.state.outputLines).toEqual(['3: ok', '5: ok', 'AB']) - const java = generateCode(d, 'java') - expect(java).toContain('System.out.print(intAllgemeinFach[i] + ": ");') - expect(generateCode(d, 'javascript')).toContain('process.stdout.write(String(intAllgemeinFach[i] + ": "));') - expect(generateCode(d, 'python')).toContain('print(str(intAllgemeinFach[i]) + ": ", end="")') - }) - - it('Eingabe nach einer Ausgabe fragt nicht noch einmal nach dem Variablennamen', () => { - const ask = (src: string) => { - const engine = new SimulationEngine(doc(src)) - while (engine.canStep && !engine.state.inputRequest) engine.step() - return { request: engine.state.inputRequest, lines: engine.state.outputLines } - } - const fach = 'String[] fach = {"Mathe"};\nint[] note = new int[1];\nint i = 0;\n' - expect(ask(fach + 'System.out.println("Note für Fach " + fach[i]);\nnote[i] = scanner.nextInt();')).toEqual({ - request: { variableName: 'note[i]', valueType: 'int', prompt: '' }, - lines: ['Note für Fach Mathe'], - }) - expect(ask(fach + 'System.out.print(fach[i] + ": ");\nnote[i] = scanner.nextInt();')).toEqual({ - request: { variableName: 'note[i]', valueType: 'int', prompt: '', continuesLine: true }, - lines: ['Mathe: '], - }) - // Ohne Ausgabe davor bleibt die Frage `name:`. - expect(ask(fach + 'note[i] = scanner.nextInt();').request?.prompt).toBe('note[i]:') - }) - - it('Arrays ohne import ist ein Fehler, wie bei javac', () => { - const keys = (src: string) => parse(src).problems.map((p) => p.key) - expect(keys('int[] a = {1, 2};\nSystem.out.println(Arrays.toString(a));')).toEqual(['web_parse_missing_import']) - expect(keys('import java.util.Arrays;\nint[] a = {1, 2};\nSystem.out.println(Arrays.toString(a));')).toEqual([]) - expect(keys('int[] a = {1, 2};\nSystem.out.println(a);')).toEqual([]) - }) - - it('Aufruf eines Unterprogramms aus einem anderen Reiter', () => { - expect(parse('int y = quadrat(4);', new Set(['quadrat'])).elements[0].type).toBe(ElementType.aufruf) - expect(parse('int y = quadrat(4);').elements[0].type).toBe(ElementType.anweisung) - }) - - it('klassisches switch mit break', () => { - const els = parse('switch (n) {\n case 1:\n x = 1;\n break;\n default:\n x = 0;\n}').elements - expect(els[0].cases?.map((c) => [c.name, c.elements.map((e) => e.textLines[0])])).toEqual([ - ['1', ['x = 1']], - ['default', ['x = 0']], - ]) - }) - - it('unfertiger Code beim Tippen: Struktogramm entsteht trotzdem', () => { - // Nach `if (x > 0) {` ist die Verzweigung schon da. - const open = parse('if (x > 0) {') - expect(open.elements.map((e) => e.type)).toEqual([ElementType.verzweigung]) - expect(open.problems.map((p) => p.arg)).toEqual(['}']) - // Fehlende `)` und fehlendes `;`. - const half = parse('if (x > 0 {\n System.out.println(x)\n}') - expect(half.elements[0].textLines).toEqual(['x > 0']) - expect(half.elements[0].cases![0].elements[0].textLines).toEqual(['output: x']) - expect(half.problems.map((p) => p.arg)).toEqual([')', ';']) - // Nur das Schlüsselwort. - expect(types('while')).toEqual([ElementType.whileSchleife]) - expect(types('for (int i = 0; i <')).toEqual([ElementType.forSchleife]) - // Offene Zeichenkette. - const str = parse('System.out.println("Hallo') - expect(str.elements).toHaveLength(1) - expect(str.problems.some((p) => p.key === 'web_parse_unclosed_string')).toBe(true) - // Zu viele Klammern. - expect(parse('x = 1;\n}').problems.map((p) => p.key)).toEqual(['web_parse_extra']) - }) - - it('Swing: Lambda und anonyme Klasse mit Rumpf sind eine Anweisung', () => { - const lambda = parse('knopf.addActionListener(e -> {\n knopf.setText("Ich wurde geklickt");\n});\nfenster.setVisible(true);') - expect(lambda.problems).toEqual([]) - expect(lambda.elements.map((e) => e.textLines)).toEqual([ - ['knopf.addActionListener(e -> { knopf.setText("Ich wurde geklickt"); })'], - ['fenster.setVisible(true)'], - ]) - const anonym = parse( - 'knopf.addActionListener(new ActionListener() {\n public void actionPerformed(ActionEvent e) {\n knopf.setText("Ich wurde geklickt");\n }\n});', - ) - expect(anonym.problems).toEqual([]) - expect(anonym.elements).toHaveLength(1) - // Noch nicht fertig getippt: Die fehlende `}` wird gemeldet. - expect(parse('knopf.addActionListener(e -> {\n knopf.setText("x");').problems.map((p) => p.arg)).toContain('}') - }) - - it('try/catch/finally ist ein Anweisungskasten', () => { - const r = parse('try {\n int z = Integer.parseInt(text);\n} catch (NumberFormatException e) {\n System.out.println("Keine Zahl");\n} finally {\n fertig = true;\n}\nSystem.out.println("Weiter");') - expect(r.problems).toEqual([]) - expect(r.elements.map((e) => e.textLines)).toEqual([ - ['try { int z = Integer.parseInt(text); } catch (NumberFormatException e) { System.out.println("Keine Zahl"); } finally { fertig = true; }'], - ['output: "Weiter"'], - ]) - expect(parse('try {\n int z = 1;').problems.map((p) => p.arg)).toEqual(['}']) - }) - - it('Platzhalter wie „Bedingung“ gelten als leer und werden markiert', () => { - const src = 'if (Bedingung) {\n // Dein Code\n}' - const p = parse(src) - expect(p.elements[0].textLines).toEqual(['']) - expect(p.placeholders.map((r) => src.slice(r.from, r.to))).toEqual(['Bedingung', '// Dein Code']) - expect(p.elements[0].cases![0].elements[0].textLines).toEqual(['ø']) - }) - - it('Zeilen der Elemente für die Markierung', () => { - const p = parse('int x = 1;\nwhile (x < 3) {\n x++;\n}') - expect(p.spans).toEqual([ - { path: [0], from: 0, to: 0 }, - { path: [1], from: 1, to: 3 }, - { path: [1, 0, 0], from: 2, to: 2 }, - ]) - }) -}) - -describe('Struktogramm ändern → getippter Code bleibt', () => { - const typed = [ - '// Mein erstes Programm', - 'int x = 1; // Startwert', - '', - 'while (x < 10) {', - ' // verdoppeln', - ' x = x * 2;', - '}', - 'System.out.println(x);', - ].join('\n') - const before = doc(typed) - - it('Text eines Kastens ändern: Kommentare bleiben', () => { - const after = setTextLines(before, [1, 0, 0], ['x = x * 3']) - expect(mergeLiveJava(typed, before, after, labels)).toBe(typed.replace('x = x * 2;', 'x = x * 3;')) - // Der Kommentar am Zeilenende wandert mit. - const start = setTextLines(before, [0], ['int x = 2']) - expect(mergeLiveJava(typed, before, start, labels)).toBe(typed.replace('int x = 1;', 'int x = 2;')) - }) - - it('Element einfügen und löschen', () => { - const added = insertAfterSibling(before, makeElement(ElementType.anweisung, { textLines: ['output: "fertig"'] }), [2]) - expect(mergeLiveJava(typed, before, added, labels)).toBe(typed + '\nSystem.out.println("fertig");') - const removed: VSDocument = { ...before, elements: before.elements.slice(0, 2) } - expect(mergeLiveJava(typed, before, removed, labels)).toBe(typed.split('\n').slice(0, -1).join('\n')) - }) - - it('unveränderter erzeugter Code wird einfach neu erzeugt', () => { - const code = plainLiveJava(before, labels) - const after = setTextLines(before, [0], ['int x = 3']) - expect(mergeLiveJava(code, before, after, labels)).toBe(plainLiveJava(after, labels)) - }) - - it('Farben der Kästen bleiben beim Tippen erhalten', () => { - const colored: VSDocument = { ...before, elements: before.elements.map((e, i) => (i === 1 ? { ...e, backgroundColor: { r: 1, g: 0, b: 0, a: 1 } } : e)) } - const next = documentFromJava(colored, parse(typed.replace('x < 10', 'x < 20'))) - expect(next.elements[1].backgroundColor).toEqual({ r: 1, g: 0, b: 0, a: 1 }) - expect(next.elements[1].textLines).toEqual(['x < 20']) - }) -}) - -describe('Scanner ohne Variable', () => { - const L = { code: 'Dein Code' } as Parameters[1] - const main = (body: string) => `import java.util.Scanner;\n\npublic class Main {\n public static void main(String[] args) {\n${body}\n }\n}` - const keys = (src: string) => parseLiveJava(src, L).problems.filter((p) => p.key === 'web_parse_missing_scanner').map((p) => [p.key, p.arg]) - - it('meldet eingabe.next() ohne angelegten Scanner', () => { - expect(keys(main(' String s = eingabe.next();'))).toEqual([['web_parse_missing_scanner', 'Scanner eingabe = new Scanner(System.in);']]) - }) - - it('nimmt angelegte Scanner, Attribute und Parameter an', () => { - expect(keys(main(' Scanner eingabe = new Scanner(System.in);\n String s = eingabe.next();\n while (eingabe.hasNextInt()) eingabe.nextInt();'))).toEqual([]) - expect(keys(`import java.util.Scanner;\n\npublic class Main {\n static Scanner sc = new Scanner(System.in);\n\n static int lies(Scanner in) {\n return in.nextInt();\n }\n\n public static void main(String[] args) {\n String s = sc.nextLine();\n }\n}`)).toEqual([]) - }) -}) - -describe('boolean und vertippte Datentypen', () => { - const typo = (src: string) => parse(src).problems.find((p) => p.key === 'web_parse_unknown_type')?.arg - it('meldet vertippte Grundtypen mit Vorschlag', () => { - expect(typo('booelan wpfAlleUeber5;')).toBe('boolean') - expect(typo('Int x = 3;')).toBe('int') - expect(typo('string s = "a";')).toBe('String') - expect(typo('dobule d = 2;')).toBe('double') - expect(typo('for (Int i = 0; i < 3; i++) {\n}')).toBe('int') - }) - it('lässt gültige Typen und eigene Klassen in Ruhe', () => { - for (const src of ['boolean b = true;', 'Boolean b = true;', 'Integer i = 3;', 'Kind k = new Kind();', 'Auto a;', 'String s;', 'return x;']) - expect(typo(src)).toBeUndefined() - }) - it('simuliert boolean ohne Startwert, Vergleiche und Ausgaben von Bedingungen', () => { - const src = 'boolean fertig;\nint x = 3;\nSystem.out.println(fertig);\nfertig = x < 5;\nif (fertig == true) {\n System.out.println("ja " + fertig);\n}\nSystem.out.println(!fertig);\nSystem.out.println(x + 1 > 3);\nSystem.out.println("klein: " + (x < 3));\nint a, b;\nSystem.out.println(a + b);' - const engine = new SimulationEngine(doc(src)) - let steps = 0 - while (engine.canStep && steps++ < 1000) engine.step() - expect(engine.state.outputLines).toEqual(['false', 'ja true', 'false', 'true', 'klein: false', '0']) - }) -}) - -describe('Groß- und Kleinschreibung', () => { - const wrongCase = (src: string) => parse(src).problems.find((p) => p.key === 'web_parse_wrong_case')?.arg - it('meldet falsch geschriebene Java-Wörter mit der richtigen Schreibweise', () => { - expect(wrongCase('system.out.println(1);')).toBe('System') - expect(wrongCase('System.Out.println(1);')).toBe('out') - expect(wrongCase('System.out.Println(1);')).toBe('println') - expect(wrongCase('double w = math.sqrt(4);')).toBe('Math') - expect(wrongCase('int[] a = {1};\nint n = a.Length;')).toBe('length') - expect(wrongCase('String s = "a";\nchar c = s.charat(0);')).toBe('charAt') - }) - it('lässt richtige Schreibweise und eigene Variablen in Ruhe', () => { - for (const src of ['System.out.println(1);', 'String string = "a";\nint n = string.length();', 'int zahl = 1;\nint Zahl = 2;\nSystem.out.println(zahl + Zahl);']) - expect(wrongCase(src)).toBeUndefined() - }) - it('die Simulation nennt bei einer unbekannten Variable den Namen in anderer Schreibweise', () => { - const engine = new SimulationEngine(doc('int zahl = 4;\nSystem.out.println(Zahl);')) - let steps = 0 - while (engine.canStep && steps++ < 100) engine.step() - expect(engine.state.notice).toEqual({ kind: 'unknownVariable', text: 'Zahl', similar: 'zahl' }) - }) -}) diff --git a/web/test/javaProject.test.ts b/web/test/javaProject.test.ts deleted file mode 100644 index 25aa98f0..00000000 --- a/web/test/javaProject.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { - addPackage, - classFileText, - exampleProject, - moveFile, - packageOf, - packagesOf, - projectClasses, - projectFromFiles, - projectFromJSON, - projectToJSON, - removeFile, - removePackage, - renamePackage, - withPackageLine, -} from '../src/core/javaProject' -import { projectFromZip, projectToZip } from '../src/ui/projectZip' - -describe('javaProject', () => { - it('liest Packages aus Pfaden', () => { - expect(packageOf('tiere/haus/Hund.java')).toBe('tiere.haus') - expect(packageOf('Main.java')).toBe('') - expect(packagesOf(exampleProject())).toEqual(['personen', 'tiere']) - }) - - it('zeigt das Standard-Package nur mit Dateien und leere Packages auch', () => { - let p = addPackage({ name: 'P', files: [], packages: [] }, 'leer') - expect(packagesOf(p)).toEqual(['leer']) - p = { ...p, files: [{ path: 'Main.java', text: 'public class Main {}' }] } - expect(packagesOf(p)).toEqual(['leer', '']) - }) - - it('setzt, ändert und entfernt die package-Zeile', () => { - expect(withPackageLine('public class A {}\n', 'x')).toBe('package x;\n\npublic class A {}\n') - expect(withPackageLine('package x;\n\npublic class A {}\n', 'y.z')).toBe('package y.z;\n\npublic class A {}\n') - expect(withPackageLine('// Kopf\npackage x;\n\npublic class A {}\n', '')).toBe('// Kopf\npublic class A {}\n') - expect(classFileText('tiere', 'Katze', 'class')).toBe('package tiere;\n\npublic class Katze {\n}\n') - }) - - it('kennt alle Klassen mit Datei und Package', () => { - const classes = projectClasses(exampleProject()) - expect(classes.map((c) => `${c.pkg}.${c.name}`).sort()).toEqual(['personen.Besitzer', 'tiere.Hund', 'tiere.Tier']) - expect(classes.find((c) => c.name === 'Hund')?.superclass).toBe('Tier') - }) - - it('verschiebt Dateien und benennt Packages um', () => { - let p = moveFile(exampleProject(), 'tiere/Hund.java', 'haustiere/Hund.java') - expect(p.files.find((f) => f.path === 'haustiere/Hund.java')?.text.startsWith('package haustiere;')).toBe(true) - p = renamePackage(p, 'tiere', 'zoo.tiere') - expect(p.files.find((f) => f.path === 'zoo/tiere/Tier.java')?.text.startsWith('package zoo.tiere;')).toBe(true) - }) - - it('behält ein Package nach dem Löschen der letzten Datei', () => { - let p = removeFile(exampleProject(), 'personen/Besitzer.java') - expect(packagesOf(p)).toContain('personen') - p = removePackage(p, 'personen') - expect(packagesOf(p)).toEqual(['tiere']) - }) - - it('macht aus einzelnen Dateien ein Projekt', () => { - const p = projectFromFiles('P', [{ name: 'code.txt', text: 'package a.b;\r\npublic class X {}' }]) - expect(p.files).toEqual([{ path: 'a/b/X.java', text: 'package a.b;\npublic class X {}' }]) - }) - - it('speichert als JSON und als ZIP', () => { - const p = addPackage(exampleProject(), 'leer') - expect(projectFromJSON(projectToJSON(p))).toEqual(p) - expect(projectFromJSON('kaputt')).toBeUndefined() - const back = projectFromZip(projectToZip(p), 'X') - expect(back.name).toBe('Zoo') - expect(back.uml).toEqual(p.uml) - expect(back.files.map((f) => f.path).sort()).toEqual(p.files.map((f) => f.path).sort()) - expect(back.files.find((f) => f.path === 'tiere/Hund.java')?.text).toBe(p.files[1].text) - }) -}) diff --git a/web/test/javaRuntime.test.ts b/web/test/javaRuntime.test.ts deleted file mode 100644 index 4dd92fe3..00000000 --- a/web/test/javaRuntime.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { asProgram, mainClassName } from '../src/ui/javaRuntime' - -describe('Java mit CheerpJ', () => { - it('nimmt die öffentliche Klasse als Startklasse', () => { - expect(mainClassName('class Hilfe {}\npublic class Zaehler { }')).toBe('Zaehler') - expect(mainClassName('class Main { }')).toBe('Main') - }) - - it('packt Code ohne Klasse in public class Main', () => { - const snippet = asProgram('System.out.println("Hallo");') - expect(snippet).toContain('public class Main {') - expect(snippet).toContain('public static void main(String[] args) {\nSystem.out.println("Hallo");') - const withMain = asProgram('public static void main(String[] args) {\n}') - expect(withMain.match(/static void main/g)).toHaveLength(1) - expect(mainClassName(withMain)).toBe('Main') - expect(asProgram('public class A {}')).toBe('public class A {}') - // Getippter Import kommt vor die Klasse, nicht in main. - const imported = asProgram('import java.util.Scanner;\nScanner s = new Scanner(System.in);') - expect(imported.startsWith('import java.util.Scanner;\n')).toBe(true) - expect(imported.split('public class Main')[1]).not.toContain('import') - }) -}) diff --git a/web/test/layoutColumns.test.ts b/web/test/layoutColumns.test.ts deleted file mode 100644 index 8e88b331..00000000 --- a/web/test/layoutColumns.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { expect, test } from 'vitest' -import { readdirSync, readFileSync, statSync } from 'node:fs' -import { join } from 'node:path' -import { decodeDocument } from '../src/core/xmlCodec' -import { LayoutEngine, type LayoutNode } from '../src/core/layout' - -/** Spalten einer Verzweigung/Fallauswahl müssen die ganze Breite des Kastens füllen - * (sonst bleibt rechts Kopffarbe stehen und das if sieht aus wie eine Schleife, Lektion 14). */ -test('Spalten füllen die Verzweigung in allen Lektionsdiagrammen', () => { - const gaps: string[] = [] - const check = (n: LayoutNode, file: string) => { - if (n.caseColumnFrames.length) { - const last = n.caseColumnFrames[n.caseColumnFrames.length - 1] - const end = last.x + last.width - if (Math.abs(end - (n.frame.x + n.frame.width)) > 1) gaps.push(`${file}: ${n.element.textLines[0]}`) - } - n.children.forEach((c) => check(c, file)) - } - const walk = (dir: string) => { - for (const f of readdirSync(dir)) { - const p = join(dir, f) - if (statSync(p).isDirectory()) walk(p) - else if (p.endsWith('.visustruct')) { - const doc = decodeDocument(readFileSync(p, 'utf8')) - new LayoutEngine().layout(doc).elements.forEach((n) => check(n, p)) - } - } - } - walk('lessons/diagramme') - expect(gaps).toEqual([]) -}) diff --git a/web/test/lessonEnd.ts b/web/test/lessonEnd.ts deleted file mode 100644 index e1657546..00000000 --- a/web/test/lessonEnd.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Lesson } from '../src/learn/lessonFormat' - -const GAMES = ['game', 'roundGame', 'rescueGame', 'driveGame', 'crosswordGame'] - -/** - * Jede Lektion endet so (Holger 2026-11-03): vorher mindestens ein Spiel, dann die Checkliste, zuletzt der Wissenstest. Checkliste und Wissenstest stehen nie im selben Schritt und nie zusammen mit anderem Inhalt. - * Liefert die Verstöße als lesbare Sätze, leer heißt alles in Ordnung. - */ -export function lessonEndProblems(lesson: Lesson): string[] { - const kinds = lesson.steps.map((s) => s.blocks.map((b) => b.kind as string)) - const where = (i: number) => `${lesson.id} / ${lesson.steps[i]?.title ?? '–'}` - const lists = kinds.flatMap((k, i) => (k.includes('checklist') ? [i] : [])) - if (lists.length !== 1) return [`${lesson.id}: ${lists.length} Checklisten statt einer`] - const ci = lists[0] - const last = kinds.length - 1 - const only = (i: number, kind: string) => kinds[i].includes(kind) && kinds[i].every((k) => k === kind || k === 'markdown') - const problems: string[] = [] - if (!only(ci, 'checklist')) problems.push(`${where(ci)}: Im Schritt der Checkliste steht noch anderes (${kinds[ci].join(', ')})`) - if (ci !== last - 1) problems.push(`${where(ci)}: Nach der Checkliste muss genau ein Schritt folgen, der Wissenstest`) - if (!only(last, 'quiz')) problems.push(`${where(last)}: Der letzte Schritt muss der Wissenstest sein, nur mit Fragen (${kinds[last].join(', ')})`) - const games = kinds.flatMap((k, i) => (k.some((x) => GAMES.includes(x)) ? [i] : [])) - if (!games.some((i) => i < ci)) problems.push(`${lesson.id}: Vor der Checkliste fehlt ein Spiel`) - return problems -} diff --git a/web/test/lessons.test.ts b/web/test/lessons.test.ts deleted file mode 100644 index 20adb2f5..00000000 --- a/web/test/lessons.test.ts +++ /dev/null @@ -1,573 +0,0 @@ -import { readdirSync, readFileSync } from 'node:fs' -import { join } from 'node:path' -import { beforeAll, describe, expect, it } from 'vitest' -import { decodeDocument } from '../src/core/xmlCodec' -import { checkExercise, runWithInputs, usedElementTypes } from '../src/core/exerciseCheck' -import type { LiveLabels } from '../src/core/codeGenerator' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava, plainLiveJava } from '../src/core/liveSource' -import { ElementType, makeElement, type VSElement } from '../src/core/model' -import { subprogramName } from '../src/core/simulation' -import { contentLanguages, diagram, image, lessons, reference, tasks, useContentLanguage } from '../src/learn/content' -import { exerciseArea, parseBlocks, parseLesson, parseTest, type Block } from '../src/learn/lessonFormat' -import { markdownToHTML } from '../src/learn/markdown' -import { clozeAnswerRight, clozeGaps, type Cloze } from '../src/learn/cloze' -import { papFits, papLayout, parsePap } from '../src/learn/pap' -import { bombParts, parseRoundGame, parseSwingWindow, simulate } from '../src/learn/roundGame' - -import { lessonEndProblems } from './lessonEnd' -const allBlocks = (): { where: string; block: Block }[] => [ - ...lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks.map((block) => ({ where: `${l.id} / ${s.title}`, block })))), - ...tasks.flatMap((t) => t.blocks.map((block) => ({ where: t.id, block }))), -] - -describe.each(contentLanguages)('Lernbereich: Inhalte (%s)', (lang) => { - beforeAll(() => useContentLanguage(lang)) - - it('Lektionen sind lückenlos nummeriert und haben Schritte', () => { - expect(lessons.length).toBeGreaterThanOrEqual(3) - lessons.forEach((l, i) => { - expect(l.number, l.id).toBe(i + 1) - expect(l.steps.length, l.id).toBeGreaterThan(1) - expect(l.section, l.id).not.toBe('') - }) - expect(reference).toContain({ de: '### Verzweigung', en: '### Branch', pt: '### Decisão' }[lang]) - }) - - it('kein Schritt heißt „Profiwissen: …“ (Profitipps stehen im Angeberwissen)', () => { - for (const lesson of lessons) { - for (const step of lesson.steps) expect(step.title, lesson.id).not.toMatch(/^(Profiwissen|Expert knowledge|Saber de profissional)\b/i) - } - }) - - it('jede Lektion hat mindestens ein Spiel, und es steht vor der Checkliste', () => { - for (const lesson of lessons) { - const kinds = lesson.steps.flatMap((s) => s.blocks.map((b) => b.kind)) - const game = kinds.findIndex((k) => k === 'game' || k === 'roundGame' || k === 'rescueGame' || k === 'driveGame' || k === 'crosswordGame') - expect(game, `${lesson.id}: kein Spiel`).toBeGreaterThanOrEqual(0) - expect(game, `${lesson.id}: Spiel nach der Checkliste`).toBeLessThan(kinds.indexOf('checklist')) - } - }) - - it('jede Lektion endet mit eigenen Schritten für Checkliste und Wissenstest', () => { - expect(lessons.flatMap(lessonEndProblems)).toEqual([]) - }) - - it('die Checkliste steht in einem eigenen Schritt „Checkliste“', () => { - const title = { de: 'Checkliste', en: 'Checklist', pt: 'Lista de verificação' }[lang] - for (const lesson of lessons) { - const step = lesson.steps.find((s) => s.blocks.some((b) => b.kind === 'checklist')) - expect(step?.title, lesson.id).toBe(title) - } - }) - - it('kein Text endet mit einem Doppelpunkt, ohne dass etwas folgt', () => { - // „probiere Folgendes aus:“ ohne Liste darunter (Lektion 3 hatte das) - const problems: string[] = [] - for (const lesson of lessons) { - for (const step of lesson.steps) { - step.blocks.forEach((block, i) => { - if (block.kind !== 'markdown') return - const parts = block.text.trim().split(/\n\s*\n/).map((p) => p.trim()) - const next = step.blocks[i + 1] - parts.forEach((part, k) => { - if (!part.endsWith(':') || part.includes('\n')) return - const follows = k + 1 < parts.length || (next && next.kind !== 'markdown' && next.kind !== 'checklist') - if (!follows) problems.push(`${lesson.id} / ${step.title}: ${part}`) - }) - }) - } - } - expect(problems).toEqual([]) - }) - - it('jedes verwendete Diagramm existiert und lässt sich laden', () => { - for (const { where, block } of allBlocks()) { - const files = - block.kind === 'diagram' ? [block.file] : block.kind === 'exercise' ? [block.exercise.start, block.exercise.solution, ...block.exercise.subprograms] : [] - for (const f of files.filter(Boolean)) expect(diagram(f!), `${where}: ${f}`).toBeDefined() - } - }) - - it('jede Übung hat mindestens zwei gestufte Tipps', () => { - const few = allBlocks().flatMap(({ where, block }) => (block.kind === 'exercise' && block.exercise.hints.length < 2 ? [`${where}: ${block.exercise.id}`] : [])) - expect(few).toEqual([]) - }) - - it('jedes verwendete Bild existiert', () => { - for (const { where, block } of allBlocks()) { - if (block.kind === 'images') for (const f of block.files) expect(image(f), `${where}: ${f}`).toBeDefined() - if (block.kind === 'graphic') expect(image(block.file), `${where}: ${block.file}`).toBeDefined() - if (block.kind === 'graphic' && block.labeled) expect(image(block.labeled), `${where}: ${block.labeled}`).toBeDefined() - } - }) - - it('jede Grafik-Unterschrift ist kurz (sonst fehlt das schließende „:::“)', () => { - for (const { where, block } of allBlocks()) { - if (block.kind === 'graphic' || block.kind === 'images') expect(block.caption.length, `${where}: ${block.caption.slice(0, 60)}`).toBeLessThan(400) - } - }) - - it('keine Schleife in einem Diagramm ist leer (Inhalt gehört in )', () => { - const loops = [ElementType.forSchleife, ElementType.whileSchleife, ElementType.doUntilSchleife, ElementType.endlosschleife] - const check = (els: VSElement[], where: string) => { - for (const e of els) { - if (loops.includes(e.type)) expect(e.loopBody?.length ?? 0, `${where}: ${e.textLines.join(' ')}`).toBeGreaterThan(0) - if (e.loopBody) check(e.loopBody, where) - for (const c of e.cases ?? []) check(c.elements, where) - } - } - for (const { where, block } of allBlocks()) { - const files = - block.kind === 'diagram' ? [block.file] : block.kind === 'exercise' ? [block.exercise.start, block.exercise.solution] : [] - for (const f of files.filter(Boolean)) { - const d = diagram(f!) - if (d) check(d.elements, `${where}: ${f}`) - } - } - }) - - it('jeder Punkt einer Checkliste verweist auf den Schritt, der ihn erklärt', () => { - for (const l of lessons) - for (const s of l.steps) - for (const b of s.blocks) - if (b.kind === 'checklist') for (const item of b.items) expect(item.step, `${l.id}: ${item.text}`).toBeDefined() - }) - - it('Kennungen von Übungen sind eindeutig', () => { - const ids = allBlocks().flatMap(({ block }) => (block.kind === 'exercise' ? [block.exercise.id] : [])) - expect(new Set(ids).size).toBe(ids.length) - }) - - it('jede Musterlösung besteht ihre eigenen Tests', () => { - let checked = 0 - for (const { where, block } of allBlocks()) { - if (block.kind !== 'exercise') continue - const ex = block.exercise - expect(ex.tests.length, `${where}: ${ex.id} hat keinen Test`).toBeGreaterThan(0) - for (const r of ex.requires) expect(r in ElementType || r === 'forZaehlSchleife', `${where}: braucht ${r}`).toBe(true) - if (!ex.solution) continue - const doc = diagram(ex.solution)! - const subs = ex.subprograms.map((f) => diagram(f)!) - const resolve = (name: string) => subs.find((s) => subprogramName(s.caption).toLowerCase() === subprogramName(name).toLowerCase()) - for (const outcome of checkExercise(doc, ex.tests, resolve)) { - expect(outcome.passed, `${where}: ${ex.id} ${JSON.stringify(outcome)}`).toBe(true) - } - for (const r of ex.requires) expect(usedElementTypes(doc).has(ElementType[r as keyof typeof ElementType])).toBe(true) - checked++ - } - expect(checked).toBeGreaterThanOrEqual(4) - }) - - it('Java-Übungen (code: java) lassen sich in Java lösen', () => { - const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - let checked = 0 - for (const { where, block } of allBlocks()) { - if (block.kind !== 'exercise' || block.exercise.code !== 'java') continue - const ex = block.exercise - expect(ex.solution, `${where}: ${ex.id} braucht eine Musterlösung`).toBeDefined() - // Die Musterlösung so, wie man sie in Java tippen würde, und daraus wieder das Struktogramm - const parsed = parseLiveJava(plainLiveJava(diagram(ex.solution!)!, labels), labels) - expect(parsed.problems, `${where}: ${ex.id}`).toEqual([]) - const doc = documentFromJava({ caption: '', elements: [] }, parsed) - for (const outcome of checkExercise(doc, ex.tests)) expect(outcome.passed, `${where}: ${ex.id} ${JSON.stringify(outcome)}`).toBe(true) - checked++ - } - expect(checked).toBeGreaterThanOrEqual(4) - }) - - it('ein leeres Startdiagramm besteht keine Übung', () => { - for (const { block } of allBlocks()) { - if (block.kind !== 'exercise') continue - const start = block.exercise.start ? diagram(block.exercise.start)! : { caption: '', elements: [] } - expect(checkExercise(start, block.exercise.tests).every((o) => o.passed), block.exercise.id).toBe(false) - } - }) -}) - -describe.each(['en', 'pt'] as const)('Lernbereich: Übersetzung (%s)', (lang) => { - const lessonFiles = import.meta.glob('../lessons/*/*.md', { query: '?raw', import: 'default', eager: true }) as Record - const taskFiles = import.meta.glob('../lessons/*/aufgaben/*.md', { query: '?raw', import: 'default', eager: true }) as Record - const names = (files: Record, lang: string) => - Object.keys(files).filter((p) => p.includes(`/lessons/${lang}/`)).map((p) => p.slice(p.indexOf(`/${lang}/`) + lang.length + 2)).sort() - - it('jede deutsche Lektion und Aufgabe gibt es auch übersetzt', () => { - expect(names(lessonFiles, lang)).toEqual(names(lessonFiles, 'de')) - expect(names(taskFiles, lang)).toEqual(names(taskFiles, 'de')) - }) - - it('beide Sprachen haben dieselben Übungen mit gleich vielen Tests', () => { - const exercises = (l: 'de' | 'en' | 'pt') => { - useContentLanguage(l) - return allBlocks().flatMap(({ block }) => - block.kind === 'exercise' ? [`${block.exercise.id}: ${block.exercise.tests.length}`] : [], - ).sort() - } - const de = exercises('de') - expect(exercises(lang)).toEqual(de) - useContentLanguage('de') - }) - - it('beide Sprachen haben gleich viele Lückentexte mit gleich vielen Lücken', () => { - const clozes = (l: 'de' | 'en' | 'pt') => { - useContentLanguage(l) - return allBlocks().flatMap(({ where, block }) => (block.kind === 'cloze' ? [`${where.split(' / ')[0]}: ${clozeGaps(block.cloze).length}`] : [])) - } - const de = clozes('de') - expect(clozes(lang)).toEqual(de) - useContentLanguage('de') - }) -}) - -describe('Lernbereich: Format', () => { - it('liest Tests mit Eingaben und mehreren Ausgabezeilen', () => { - expect(parseTest('3, 4 -> 7 | fertig', 'x')).toEqual({ inputs: ['3', '4'], expected: ['7', 'fertig'] }) - expect(parseTest('- -> Hallo', 'x')).toEqual({ inputs: [], expected: ['Hallo'] }) - }) - - it('liest Angeberwissen-Kästen', () => { - expect(parseBlocks('::: angeberwissen\nZeile eins\nZeile zwei\n:::', 'x.md')).toEqual([{ kind: 'brag', text: 'Zeile eins\nZeile zwei' }]) - }) - - it('meldet fehlerhafte Blöcke verständlich', () => { - expect(() => parseBlocks('::: diagramm a.visustruct\n', 'x.md')).toThrow(/nicht mit „:::“ geschlossen/) - expect(() => parseBlocks('::: quiz\n? Frage\n- [ ] a\n- [ ] b\n:::', 'x.md')).toThrow(/eine richtige/) - expect(() => parseBlocks('::: tabelle\n:::', 'x.md')).toThrow(/Unbekannter Block/) - }) - - it('liest Zuordnungen im Quiz', () => { - const [block] = parseBlocks('::: quiz\n? Ordne zu.\n= Fallauswahl -> Mehrfachauswahl\n= Schleife -> Wiederholungsstruktur\n> Erklärung\n:::', 'x.md') - expect(block).toEqual({ - kind: 'quiz', - questions: [{ - question: 'Ordne zu.', - options: [], - pairs: [{ left: 'Fallauswahl', right: 'Mehrfachauswahl' }, { left: 'Schleife', right: 'Wiederholungsstruktur' }], - explanation: 'Erklärung', - }], - }) - expect(() => parseBlocks('::: quiz\n? Ordne zu.\n= a -> b\n:::', 'x.md')).toThrow(/mindestens zwei Paare/) - expect(() => parseBlocks('::: quiz\n? Ordne zu.\n= a -> b\n= c -> b\n:::', 'x.md')).toThrow(/verschiedenen rechten/) - expect(() => parseBlocks('::: quiz\n? Ordne zu.\n= a b\n:::', 'x.md')).toThrow(/links -> rechts/) - }) - - it('liest bereich: und leitet den Bereich sonst aus code: ab', () => { - const ex = (extra: string) => { - const block = parseBlocks(`::: übung x\ntitel: T\nauftrag: A\ntest: - -> 1\n${extra}:::`, 'x.md')[0] - if (block.kind !== 'exercise') throw new Error('keine Übung') - return exerciseArea(block.exercise) - } - expect(ex('')).toBe('struktogramm') - expect(ex('code: java\n')).toBe('code') - expect(ex('bereich: beide\n')).toBe('beide') - expect(ex('code: java\nbereich: Beide\n')).toBe('beide') - expect(() => ex('bereich: links\n')).toThrow(/bereich:/) - }) - - it('löst Checklisten-Verweise auf und meldet unbekannte Schritte', () => { - const source = (ref: string) => `---\ntitel: T\n---\n## Erster Schritt\nText\n## Checkliste\n::: checkliste\n- Ich kann es. → ${ref}\n- Ohne Verweis\n:::\n` - const block = parseLesson(source('erster schritt'), '01-t.md').steps[1].blocks[0] - expect(block).toEqual({ kind: 'checklist', items: [{ text: 'Ich kann es.', ref: 'erster schritt', step: 0 }, { text: 'Ohne Verweis' }] }) - expect(() => parseLesson(source('Gibt es nicht'), '01-t.md')).toThrow(/unbekannten Schritt/) - }) - - it('liest Lückentexte', () => { - const [block] = parseBlocks( - '::: lückentext\ntitel: T\nauftrag: Ergänze.\n```java\n [[int]] x = 1;\n if (a [[||]] b) x[[++ | += 1]];\n```\nerklärung: E\n:::', - 'x.md', - ) - expect(block).toEqual({ - kind: 'cloze', - cloze: { - title: 'T', - task: 'Ergänze.', - blocks: [[[{ answers: ['int'] }, ' x = 1;'], ['if (a ', { answers: ['||'] }, ' b) x', { answers: ['++', '+= 1'] }, ';']]], - explanation: 'E', - }, - }) - expect(clozeAnswerRight(['i = i + 1'], 'i=i+1')).toBe(true) - expect(clozeAnswerRight(['int'], 'Int')).toBe(false) - expect(clozeAnswerRight(['int'], ' ')).toBe(false) - expect(() => parseBlocks('::: lückentext\ntitel: T\n```\nint x;\n```\n:::', 'x.md')).toThrow(/mindestens eine Lücke/) - expect(() => parseBlocks('::: lückentext\ntitel: T\n```\n[[int]] x;\n:::', 'x.md')).toThrow(/nicht mit/) - }) - - it('Markdown maskiert HTML', () => { - expect(markdownToHTML('x **fett** `a<b>x</b> fett a<b

    ') - expect(markdownToHTML('[x](javascript:alert(1))')).toContain('href="#"') - expect(markdownToHTML('[**Sequenz**]{.blau} und [rot]{.rot}')).toBe('

    Sequenz und [rot]{.rot}

    ') - }) -}) - -describe('Prüfen mit der Simulation', () => { - const doc = (lines: string[]) => ({ - caption: '', - elements: lines.map((t) => makeElement(ElementType.anweisung, { textLines: [t] })), - }) - - it('gibt Eingaben der Reihe nach und vergleicht die Ausgabe', () => { - const d = doc(['input: int a "a"', 'input: int b "b"', 'int s = a + b', 'output: s']) - expect(runWithInputs(d, ['3', '4']).outputs).toEqual(['7']) - expect(checkExercise(d, [{ inputs: ['3', '4'], expected: ['7'] }])[0].passed).toBe(true) - expect(checkExercise(d, [{ inputs: ['3', '4'], expected: ['8'] }])[0].passed).toBe(false) - expect(runWithInputs(d, ['3']).missingInput).toBe(true) - }) - - it('erkennt Fehler und vergleicht 2.0 wie 2', () => { - expect(runWithInputs(doc(['output: x']), []).error?.kind).toBe('unknownVariable') - expect(checkExercise(doc(['double x = 4.0 / 2', 'output: x']), [{ inputs: [], expected: ['2'] }])[0].passed).toBe(true) - }) -}) - -describe('Lernbereich: Grafiken', () => { - // Als geladen, zeigt der Browser ein SVG nur an, wenn es gültiges XML ist (z. B. `<` statt `<`). - const svgs = import.meta.glob('../lessons/bilder/**/*.svg', { query: '?raw', import: 'default', eager: true }) as Record - - it.each(Object.keys(svgs))('%s ist gültiges XML', (file) => { - const parsed = new DOMParser().parseFromString(svgs[file], 'image/svg+xml') - expect(parsed.getElementsByTagName('parsererror').length).toBe(0) - }) -}) - -describe('Lehrermodus', () => { - // Der richtige Code steht absichtlich nirgends im Repository, auch nicht hier. - it('bleibt mit einem falschen Code aus', async () => { - const { isTeacher, lockTeacher, unlockTeacher } = await import('../src/learn/teacher') - lockTeacher() - expect(await unlockTeacher('falsch')).toBe(false) - expect(await unlockTeacher('')).toBe(false) - expect(isTeacher()).toBe(false) - }) -}) - -describe('Lückentexte', () => { - const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - /** Jeder Codeblock mit der ersten Antwort in jeder Lücke, nur Lücke `gap` bekommt Antwort `answer`. */ - const filled = (cloze: Cloze, gap = -1, answer = 0) => { - let n = 0 - return cloze.blocks.map((lines) => lines.map((l) => l.map((p) => (typeof p === 'string' ? p : p.answers[n++ === gap ? answer : 0])).join('')).join('\n')) - } - const problems = (cloze: Cloze, gap = -1, answer = 0) => filled(cloze, gap, answer).flatMap((code) => parseLiveJava(code, labels).problems) - it.each(contentLanguages)('mit jeder richtigen Antwort ist der Java-Code fehlerfrei (%s)', (lang) => { - useContentLanguage(lang) - let checked = 0 - for (const { where, block } of allBlocks()) { - if (block.kind !== 'cloze') continue - const cloze = block.cloze - clozeGaps(cloze).forEach((answers, gi) => - answers.forEach((_, ai) => expect(problems(cloze, gi, ai), `${where}\n${filled(cloze, gi, ai).join('\n')}`).toEqual([])), - ) - checked++ - } - expect(checked).toBeGreaterThanOrEqual(8) - useContentLanguage('de') - }) -}) - -describe('Java-Beispiele mit „Im Editor öffnen“', () => { - it.each(contentLanguages)('```java editor lässt sich ohne Fehler parsen (%s)', (lang) => { - useContentLanguage(lang) - const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - let checked = 0 - for (const block of lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks))) { - if (block.kind !== 'markdown') continue - for (const m of block.text.matchAll(/^```java editor\n([\s\S]*?)^```/gm)) { - expect(parseLiveJava(m[1], labels).problems, m[1]).toEqual([]) - expect(markdownToHTML(m[0])).toContain('data-open="editor"') - checked++ - } - } - expect(checked).toBeGreaterThanOrEqual(1) - }) -}) - -describe('Bombe entschärfen', () => { - it.each(contentLanguages)('mit der verbesserten Zeile meldet Java keinen Fehler mehr (%s)', (lang) => { - useContentLanguage(lang) - const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - let checked = 0 - for (const block of lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks))) { - if (block.kind !== 'roundGame' || block.game.kind !== 'bombe') continue - for (const round of block.game.rounds) { - const lines = round.code.split('\n') - const wrong = lines[round.wrongLine! - 1] - expect(round.fix!.trim(), round.code).not.toBe(wrong.trim()) - lines[round.wrongLine! - 1] = wrong.match(/^\s*/)![0] + round.fix!.trim() - // CSV: Die richtige Zeile hat so viele Felder wie die Kopfzeile, die falsche nicht. - if (block.game.data === 'csv') { - const fields = (line: string) => line.split(';').length - expect(lines.every((l) => fields(l) === fields(lines[0])), lines.join('\n')).toBe(true) - expect(fields(wrong) === fields(lines[0]) && wrong.split(';').slice(1).every((v) => /^\d+$/.test(v.trim())), round.code).toBe(false) - } else expect(parseLiveJava(lines.join('\n'), labels).problems, lines.join('\n')).toEqual([]) - checked++ - } - } - expect(checked).toBeGreaterThanOrEqual(8) - }) -}) - -describe('Bombe: Teile einer Zeile (stelle:)', () => { - const show = (line: string) => bombParts(line).map((s) => (s.part ? `[${s.text}]` : s.text)).join('') - it('teilt for-Kopf, Bedingung, Zuweisung und Aufruf', () => { - expect(show(' for (int i = 10; i >= 1; i++) {')).toBe(' for ([int i = 10]; [i >= 1]; [i++]) {') - expect(show('if (punkte[i] > max) {')).toBe('if ([punkte[i] > max]) {') - expect(show('summe = summe + i;')).toBe('[summe] = [summe + i];') - expect(show('System.out.println(zahl + " x " + i);')).toBe('[System.out.println]([zahl] + [" x "] + [i]);') - expect(show('for (int i = 1, i <= 5, i++) {')).toBe('[for (int i = 1, i <= 5, i++) {]') - expect(show(' }')).toBe(' [}]') - }) - it('„stelle:“ muss ein Teil der falschen Zeile sein', () => { - const lines = (stelle: string) => ['titel: x', 'zeit: 20', 'runde:', ' for (int i = 0; i <= 5; i++) {', ' }', 'frage: ?', 'fehler: 1', `stelle: ${stelle}`, 'besser: for (int i = 0; i < 5; i++) {'] - expect(parseRoundGame('bombe', lines('i <= 5'), 't.md').rounds[0].wrongPart).toBe('i <= 5') - expect(() => parseRoundGame('bombe', lines('<= 5'), 't.md')).toThrow(/kein Teil der Zeile 1/) - }) -}) - -describe('Rundenspiele (Swing)', () => { - it('„reihenfolge“: Schritte stehen der Reihe nach da, ohne [x] und mindestens drei', () => { - const game = parseRoundGame('reihenfolge', ['titel: Spiel: Wer ist dran?', 'runde:', 'frage: Was zuerst?', '- Klick', '- `model.erhoehen()`', '- Anzeige', '> So.'], 't.md') - expect(game.rounds[0].options.map((o) => o.text)).toEqual(['Klick', '`model.erhoehen()`', 'Anzeige']) - expect(game.rounds[0].code).toBe('') - expect(() => parseRoundGame('reihenfolge', ['titel: x', 'runde:', 'frage: ?', '- a', '- b'], 't.md')).toThrow(/mindestens drei/) - expect(() => parseRoundGame('reihenfolge', ['titel: x', 'runde:', 'frage: ?', '- a', '- [x] b', '- c'], 't.md')).toThrow(/kein \[x\]/) - expect(() => parseRoundGame('reihenfolge', ['titel: x', 'runde:', 'frage: ?', '- a', '- a', '- c'], 't.md')).toThrow(/gleich/) - }) - - it('ein Zuhörer für mehrere Knöpfe mit getActionCommand, getSource und if/else', () => { - const win = parseSwingWindow( - [ - 'JLabel anzeige = new JLabel("");', - 'JButton eins = new JButton("1");', - 'JButton zwei = new JButton("2");', - 'JButton weg = new JButton("C");', - 'ActionListener taste = e -> {', - ' if (e.getSource() == weg) {', - ' anzeige.setText("");', - ' } else if (e.getActionCommand().equals("2")) anzeige.setText(anzeige.getText() + "zwei");', - ' else anzeige.setText(anzeige.getText() + e.getActionCommand());', - '};', - 'eins.addActionListener(taste);', - 'zwei.addActionListener(taste);', - 'weg.addActionListener(taste);', - ].join('\n'), - ) - expect(win.listeners.map((l) => [l.button, l.from, l.to])).toEqual([['eins', 4, 9], ['zwei', 4, 9], ['weg', 4, 9]]) - const steps = simulate(win, ['1', '2', '1']) - expect(steps.at(-1)!.texts.anzeige).toBe('1zwei1') - expect(simulate(win, ['1', 'C', '1']).at(-1)!.texts.anzeige).toBe('1') - }) - - it.each(contentLanguages)('„Wer hört zu?“: die richtige Antwort ergibt sich beim Nachspielen (%s)', (lang) => { - useContentLanguage(lang) - let checked = 0 - for (const block of lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks))) { - if (block.kind !== 'roundGame' || block.game.kind !== 'zuhoerer') continue - for (const round of block.game.rounds) { - const steps = simulate(parseSwingWindow(round.code), round.clicks) - const last = steps.at(-1)! - const results = [...Object.values(last.texts), String(steps.flatMap((s) => s.console).length)] - const right = round.options.find((o) => o.right)!.text - expect(results, `${round.code}\n→ ${right}`).toContain(right) - checked++ - } - } - expect(checked).toBeGreaterThan(5) - }) -}) - -describe('PAP bauen', () => { - const lines = (text: string) => text.trim().split('\n').map((l) => l.trim()) - - it('liest Rücksprung und Seitenkasten', () => { - const pap = parsePap( - lines(` - titel: Test - start: Start - anweisung: Rühren - frage: Glatt? | nein -> Rühren - frage: Fertig? | nein: Warten - ende: Ende - `), - 't.md', - ) - expect(pap.nodes.map((n) => n.shape)).toEqual(['oval', 'rechteck', 'raute', 'raute', 'rechteck', 'oval']) - expect(pap.nodes[2].backTo).toBe(1) - expect(pap.nodes[3].side).toBe(4) - expect(pap.nodes[4].isSide).toBe(true) - const { boxes } = papLayout(pap) - expect(boxes).toHaveLength(6) - expect(boxes[4].y).toBe(boxes[3].y) - }) - - it('meldet Rücksprung ohne Ziel und Fragen ohne zweiten Ausgang', () => { - expect(() => parsePap(['titel: x', 'start: S', 'frage: F? | nein -> Gibt es nicht', 'ende: E'], 't.md')).toThrow(/Rücksprung/) - expect(() => parsePap(['titel: x', 'start: S', 'frage: F?', 'ende: E'], 't.md')).toThrow(/zweiten Ausgang|braucht/) - }) - - it('gleiche Elemente sind austauschbar', () => { - const pap = parsePap(['titel: x', 'start: S', 'anweisung: A', 'anweisung: A', 'ende: E'], 't.md') - expect(papFits(pap, 1, 2)).toBe(true) - expect(papFits(pap, 0, 3)).toBe(false) - }) - - it('jede Sprache hat in Lektion 1 einen PAP zum Bauen', () => { - for (const lang of contentLanguages) { - useContentLanguage(lang) - const paps = allBlocks().filter(({ block }) => block.kind === 'pap') - expect(paps.length, lang).toBe(1) - expect(paps[0].block.kind === 'pap' && paps[0].block.pap.legend, lang).toBe(true) - } - }) -}) - -describe('Kompetenzen und Selbsteinschätzung', () => { - const lesson = (quizRef: string) => - parseLesson( - `---\ntitel: T\n---\n\n## Erster\n\n::: kompetenzen\n- etwas Neues\n:::\n\n## Checkliste\n\n::: checkliste\n- Ich kann etwas. → Erster\n:::\n\n## Test\n\n::: quiz\n? Frage\n→ ${quizRef}\n- [x] ja\n- [ ] nein\n:::\n`, - '01-t.md', - ) - - it('liest Kompetenzen und verbindet Quizfragen mit dem Checklistenpunkt', () => { - const l = lesson('Erster') - expect(l.steps[0].blocks[0]).toEqual({ kind: 'competences', items: ['etwas Neues'] }) - const quiz = l.steps[2].blocks[0] - expect(quiz.kind === 'quiz' && quiz.questions[0].step).toBe(0) - }) - - it('meldet Quizfragen ohne passenden Schritt oder Checklistenpunkt', () => { - expect(() => lesson('Gibt es nicht')).toThrow(/unbekannten Schritt/) - expect(() => lesson('Test')).toThrow(/keinen Checklistenpunkt/) - }) - - it('Lektion 1 ist geteilt: PAP und Pseudocode sind Lektion 2, die Verweise zählen mit', () => { - for (const lang of contentLanguages) { - useContentLanguage(lang) - expect(lessons[1].id, lang).toBe('01-weitere-darstellungen') - expect(lessons.find((l) => l.id === '02-der-editor')!.number, lang).toBe(3) - // „Lektion 18“ (Datei 18, Aussprung) heißt jetzt Lektion 19. - const text = JSON.stringify(lessons[1].steps) - expect(text, lang).toMatch(/\b(Lektion|lesson|lição) 19\b/i) - expect(text, lang).not.toMatch(/\b(Lektion|lesson|lição) 18\b/i) - } - }) - - it('Lektion 1 hat Kompetenzen und Ich-kann-Sätze in allen Sprachen', () => { - for (const lang of contentLanguages) { - useContentLanguage(lang) - const l1 = lessons.find((l) => l.number === 1)! - expect(l1.steps[0].blocks[0].kind, lang).toBe('competences') - } - }) -}) - -describe('Übungen „Warum läuft das nicht?“', () => { - it('der Start läuft wirklich nicht', () => { - const dir = join(__dirname, '..', 'lessons', 'diagramme') - const files = [dir, join(dir, 'en'), join(dir, 'pt')].flatMap((d) => readdirSync(d).filter((f) => f.endsWith('-laeuft-nicht-start.visustruct') || f === 'l04-gross-klein-start.visustruct').map((f) => join(d, f))) - expect(files.length).toBe(48) - for (const file of files) { - const doc = decodeDocument(readFileSync(file, 'utf8')) - expect(runWithInputs(doc, ['14']).error, file).toBeDefined() - } - }) -}) diff --git a/web/test/mbot.test.ts b/web/test/mbot.test.ts deleted file mode 100644 index 26bdc1c4..00000000 --- a/web/test/mbot.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { describe, expect, it } from 'vitest' -import type { LiveLabels } from '../src/core/codeGenerator' -import { memberCompletionsAt } from '../src/core/javaMembers' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava } from '../src/core/liveSource' -import { compressDrive, driveSignature, parseDriveSpec, parseMBotCommand, substituteMBotSensors } from '../src/core/mbot' -import { checkExercise, loopDepth } from '../src/core/exerciseCheck' -import { SimulationEngine } from '../src/core/simulation' - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - -function run(java: string, sensors: Record = {}) { - const parsed = parseLiveJava(java, labels, {}) - expect(parsed.problems).toEqual([]) - const engine = new SimulationEngine(documentFromJava({ caption: '', elements: [] }, parsed)) - engine.robotSensors = sensors - for (let i = 0; i < 1000 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted, engine.message).toBe(false) - return engine.state -} - -const main = (body: string) => `public class Main {\n public static void main(String[] args) {\n${body}\n }\n}` - -describe('mBot2', () => { - it('erkennt Befehle mit Argumenten', () => { - expect(parseMBotCommand('mbot.setLed(255, 0, x + 1)')).toEqual({ method: 'setLed', args: ['255', '0', 'x + 1'] }) - expect(parseMBotCommand('mbot.stop()')).toEqual({ method: 'stop', args: [] }) - expect(parseMBotCommand('x = 3')).toBe(undefined) - }) - - it('ersetzt Sensoren durch Zahlen', () => { - expect(substituteMBotSensors('mbot.getDistance() < 20', () => 15)).toBe('15 < 20') - expect(substituteMBotSensors('mbot.unknown()', () => 1)).toBe('mbot.unknown()') - }) - - it('überlädt forward und backward mit Einheit', () => { - const state = run(main(` mbot.forward(2, "Umdrehungen");\n mbot.forward(30, "cm");\n mbot.backward(1, "rotations");\n mbot.forward(15);`)) - expect(state.robotActions.map((a) => a.python)).toEqual(['mbot2.straight(40.84)', 'mbot2.straight(30)', 'mbot2.straight(-20.42)', 'mbot2.straight(15)']) - expect(state.robotActions[0].label).toBe('2 Umdrehungen vorwärts (40.84 cm)') - expect(state.robotActions[2].label).toBe('1 rotation rückwärts (20.42 cm)') - expect(driveSignature(state.robotActions)).toEqual(['forward 65.42']) - }) - - it('meldet eine unbekannte Einheit', () => { - const parsed = parseLiveJava(main(' mbot.forward(2, "Meter");'), labels, {}) - const engine = new SimulationEngine(documentFromJava({ caption: '', elements: [] }, parsed)) - for (let i = 0; i < 100 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted).toBe(true) - expect(engine.message).toContain('Umdrehungen') - }) - - it('fährt ein Quadrat und merkt sich die Python-Zeilen', () => { - const state = run(main(` for (int i = 0; i < 4; i++) {\n mbot.forward(20);\n mbot.turnRight(90);\n }`)) - expect(state.robotActions.map((a) => a.python)).toEqual(Array(4).fill(['mbot2.straight(20)', 'mbot2.turn(90)']).flat()) - expect(state.outputLines).toEqual([]) - }) - - it('liest den Abstand in Bedingungen und Variablen', () => { - const state = run(main(` int abstand = mbot.getDistance();\n if (mbot.getDistance() < 20) {\n mbot.stop();\n } else {\n mbot.forward(abstand - 20);\n }`), { getDistance: 15 }) - expect(state.robotActions.map((a) => a.method)).toEqual(['stop']) - expect(run(main(` int abstand = mbot.getDistance();\n if (mbot.getDistance() < 20) {\n mbot.stop();\n } else {\n mbot.forward(abstand - 20);\n }`)).robotActions[0].python).toBe('mbot2.straight(80)') - }) - - it('meldet falsche Befehle als Fehler', () => { - const engine = new SimulationEngine(documentFromJava({ caption: '', elements: [] }, parseLiveJava(main(' mbot.fly(3);'), labels, {}))) - engine.step() - expect(engine.state.isHalted).toBe(true) - }) - - it('schlägt nach mbot. die Befehle vor', () => { - const code = main(' mbot.') - const names = memberCompletionsAt(code, code.indexOf('mbot.') + 5)?.members.map((m) => m.name) - expect(names).toContain('forward') - expect(names).toContain('getDistance') - }) - - it('fasst die Fahrt zusammen und liest erwartete Fahrten', () => { - const square = parseDriveSpec('4 x (5 x (forward), turnRight)') - expect(driveSignature(square)).toEqual(Array(4).fill(['forward 50', 'turnRight 90']).flat()) - expect(driveSignature(parseDriveSpec('turnLeft 90, turnLeft 90, forward 10, backward 10'))).toEqual(['turnRight 180']) - expect(compressDrive(driveSignature(parseDriveSpec('4 x (forward 50, turnRight 90)')))).toBe('4 x (forward 50, turnRight 90)') - expect(() => parseDriveSpec('fly 3')).toThrow() - }) - - it('prüft eine Übung über die Fahrt und die Schleifentiefe', () => { - const parsed = parseLiveJava(main(' for (int i = 0; i < 4; i++) {\n for (int k = 0; k < 5; k++) {\n mbot.forward();\n }\n mbot.turnRight();\n }'), labels, {}) - const doc = documentFromJava({ caption: '', elements: [] }, parsed) - const drive = driveSignature(parseDriveSpec('4 x (forward 50, turnRight 90)')) - expect(checkExercise(doc, [{ inputs: [], expected: [], drive }])[0].passed).toBe(true) - expect(checkExercise(doc, [{ inputs: [], expected: [], drive: drive.slice(2) }])[0].passed).toBe(false) - expect(loopDepth(doc.elements)).toBe(2) - }) -}) diff --git a/web/test/mbotLink.test.ts b/web/test/mbotLink.test.ts deleted file mode 100644 index 3b4a619d..00000000 --- a/web/test/mbotLink.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { ASK, pythonFrame, readAnswers, RUN } from '../src/core/mbotLink' - -const bytes = (hex: string) => hex.split(' ').map((h) => parseInt(h, 16)) -const hex = (a: Uint8Array) => Array.from(a, (b) => b.toString(16).padStart(2, '0')).join(' ') - -// Rahmen aus Holgers Protokoll mit dem echten mBot2 (25.10.2026) -describe('mBot2 über USB', () => { - it('verpackt Python-Zeilen wie die Firmware sie erwartet', () => { - expect(hex(pythonFrame('mbot2.turn(90)', RUN, 8))).toBe('f3 07 14 00 28 04 08 00 0e 00 6d 62 6f 74 32 2e 74 75 72 6e 28 39 30 29 d7 f4') - expect(hex(pythonFrame('mbuild.ultrasonic2.get(1)', ASK, 10))).toBe( - 'f3 12 1f 00 28 01 0a 00 19 00 6d 62 75 69 6c 64 2e 75 6c 74 72 61 73 6f 6e 69 63 32 2e 67 65 74 28 31 29 5d f4', - ) - }) - - it('liest Antworten, auch zerstückelt und nach Textmüll', () => { - const answer = (body: string) => { - const b = bytes(body) - const len = b.length - return [0xf3, (0xf3 + len) & 0xff, len, 0, ...b, b.reduce((x, y) => x + y, 0) & 0xff, 0xf4] - } - const distance = answer('28 01 0a 00 0c 00 7b 22 72 65 74 22 3a 39 33 2e 39 7d') - const none = answer('28 01 02 00 0c 00 7b 22 72 65 74 22 3a 4e 6f 6e 65 7d') - const ping = answer('0d 00 00') - const rx = [0x29, 0x81, ...ping, ...distance.slice(0, 7)] - expect(readAnswers(rx)).toEqual([]) - rx.push(...distance.slice(7), ...none) - expect(readAnswers(rx)).toEqual([ - { idx: 10, value: 93.9 }, - { idx: 2, value: null }, - ]) - expect(rx).toEqual([]) - }) -}) diff --git a/web/test/mbotProgram.test.ts b/web/test/mbotProgram.test.ts deleted file mode 100644 index e7e30171..00000000 --- a/web/test/mbotProgram.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { MBOT_COMMANDS, MBOT_SENSORS } from '../src/core/mbot' -import { frame, pythonFrame, RUN, UPLOAD_PREPARE, uploadFrames } from '../src/core/mbotLink' -import { javaConcatenation, mbotProgram } from '../src/core/mbotProgram' -import { ElementType, type VSDocument } from '../src/core/model' -import { diagram, lessons, tasks, useContentLanguage, useVisuBotContent } from '../src/learn/content' -// Rahmen, die mBlock 5 beim Hochladen schickt (aus github.com/weare2plus3/cyberpi-uploader, MIT) -import fixture from './mbotUpload.fixture.json' - -const hex = (bytes: Uint8Array) => Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('') - -describe('Übertragen auf den mBot2', () => { - it('schickt dieselben Rahmen wie mBlock', () => { - expect(hex(frame([0x0d, 0x00, 0x00]))).toBe(fixture.PING) - expect(hex(pythonFrame(UPLOAD_PREPARE[0], RUN, 0))).toBe(fixture.EXEC1) - expect(hex(pythonFrame(UPLOAD_PREPARE[1], RUN, 0))).toBe(fixture.EXEC2) - const source = new TextDecoder().decode(Uint8Array.from(fixture.source.match(/../g)!.map((h) => parseInt(h, 16)))) - expect(uploadFrames(source).map(hex)).toEqual(fixture.frames) - }) - - it('verkettet Text wie Java', () => { - expect(javaConcatenation('mbot.showText("Akku: " + mbot.getBattery() + " %")')).toBe('mbot.showText("Akku: " + str(mbot.getBattery()) + " %")') - expect(javaConcatenation('mbot.showText(a + b + "x")')).toBe('mbot.showText(str(a + b) + "x")') - expect(javaConcatenation('x = "a" + len(t)')).toBe('x = "a" + str(len(t))') - expect(javaConcatenation('if a + 1 > 3:')).toBe('if a + 1 > 3:') - expect(javaConcatenation('print("Summe: " + str(summe))')).toBe('print("Summe: " + str(summe))') - expect(javaConcatenation('mbot.forward(i * 10 + 5)')).toBe('mbot.forward(i * 10 + 5)') - }) - - it('macht aus der Fallauswahl if/elif, MicroPython kennt kein match', () => { - const doc: VSDocument = { - caption: '', - elements: [ - { - type: ElementType.fallauswahl, - textLines: ['mbot.getColor()'], - cases: [ - { name: 'rot', elements: [{ type: ElementType.anweisung, textLines: ['mbot.turnRight()'] }] }, - { name: 'blau', elements: [{ type: ElementType.anweisung, textLines: ['mbot.turnLeft()'] }] }, - { name: 'sonst', elements: [{ type: ElementType.anweisung, textLines: ['mbot.forward()'] }] }, - ], - }, - ], - } as VSDocument - const r = mbotProgram(doc, [], 'de') - expect('source' in r && r.source).toContain(' wahl1 = mbot.getColor()\n if wahl1 == "rot":\n mbot.turnRight()\n elif wahl1 == "blau":') - expect('source' in r && r.source).not.toContain('match ') - }) - - it('kennt jeden Befehl und Sensor und startet mit Taste A', () => { - const r = mbotProgram({ caption: '', elements: [{ type: ElementType.anweisung, textLines: ['mbot.forward()'] }] } as VSDocument, [], 'de') - if (!('source' in r)) throw new Error(r.error) - for (const name of [...Object.keys(MBOT_COMMANDS).filter((n) => n !== 'ledColor'), ...Object.keys(MBOT_SENSORS)]) expect(r.source).toContain(` def ${name}(self`) - expect(r.source).toContain('@event.is_press("a")') - expect(r.source).toContain('A = Start') - expect(r.source).toContain('def programm():\n mbot.forward()') - expect(r.source).toContain('"red": "rot"') - const en = mbotProgram({ caption: '', elements: [{ type: ElementType.anweisung, textLines: ['mbot.forward()'] }] } as VSDocument, [], 'en') - expect('source' in en && en.source).toContain('"red": "red"') - }) - - it('lehnt leere Programme und Eingaben ab', () => { - expect(mbotProgram({ caption: '', elements: [] } as VSDocument, [], 'de')).toEqual({ error: 'empty' }) - expect(mbotProgram({ caption: '', elements: [{ type: ElementType.anweisung, textLines: ['input: int zahl'] }] } as VSDocument, [], 'de')).toEqual({ error: 'input' }) - }) - - describe('Musterlösungen', () => { - beforeAll(() => { - useVisuBotContent('on') - useContentLanguage('de') - }) - afterAll(() => useVisuBotContent('off')) - - it('jede VisuBot-Musterlösung wird ein Programm (außer mit Eingabe)', () => { - const blocks = [...lessons.filter((l) => l.robot).flatMap((l) => l.steps.flatMap((s) => s.blocks)), ...tasks.filter((t) => t.robot).flatMap((t) => t.blocks)] - let count = 0 - for (const b of blocks) { - if (b.kind !== 'exercise' || !b.exercise.solution) continue - const r = mbotProgram(diagram(b.exercise.solution)!, b.exercise.subprograms.map((f) => diagram(f)!), 'de') - if ('error' in r) { - expect(r.error, b.exercise.id).toBe('input') - continue - } - expect(r.source, b.exercise.id).not.toMatch(/\bmatch |empty element\n(?!\s*pass)/u) - count++ - } - expect(count).toBeGreaterThan(50) - }) - }) -}) diff --git a/web/test/mbotUpload.fixture.json b/web/test/mbotUpload.fixture.json deleted file mode 100644 index e709ecbf..00000000 --- a/web/test/mbotUpload.fixture.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "PING": "f3f603000d00000df4", - "EXEC1": "f3202d002804000027007472793a0a20202020696d706f727420636f6e6669670a6578636570743a0a2020202070617373b5f4", - "EXEC2": "f33c49002804000043007472793a0a20202020636f6e6669672e77726974655f636f6e66696728227265706c5f656e61626c65222c2046616c7365290a6578636570743a0a202020207061737389f4", - "source": "232048656c6c6f20437962657250693a2074657874206f6e2073637265656e2c204c45447320616e64206120736f756e642e0a696d706f7274206576656e742c20637962657270690a0a0a406576656e742e73746172740a646566206f6e5f737461727428293a0a20202020637962657270692e646973706c61792e636c65617228290a20202020637962657270692e646973706c61792e73686f775f6c6162656c282248656c6c6f21222c2031362c202263656e74657222290a20202020637962657270692e6c65642e6f6e28302c203235352c203029202020202020202020202320616c6c204c45447320677265656e0a20202020637962657270692e617564696f2e706c6179282268656c6c6f22290a", - "frames": [ - "f314210001005e011b000044010000426748612f666c6173682f5f78785f6d61696e2e7079e8f4", - "f34d5a0001005e02540000000000232048656c6c6f20437962657250693a2074657874206f6e2073637265656e2c204c45447320616e64206120736f756e642e0a696d706f7274206576656e742c20637962657270690a0a0a406576656e82f4", - "f34d5a0001005e02540050000000742e73746172740a646566206f6e5f737461727428293a0a20202020637962657270692e646973706c61792e636c65617228290a20202020637962657270692e646973706c61792e73686f775f6c61625ef4", - "f34d5a0001005e025400a0000000656c282248656c6c6f21222c2031362c202263656e74657222290a20202020637962657270692e6c65642e6f6e28302c203235352c203029202020202020202020202320616c6c204c45447320677265e1f4", - "f34d5a0001005e025400f0000000656e0a20202020637962657270692e617564696f2e706c6179282268656c6c6f22290a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a89f4", - "f3010e0001005e020800400100000a0a0a0ad2f4" - ] -} \ No newline at end of file diff --git a/web/test/memberEdit.test.ts b/web/test/memberEdit.test.ts deleted file mode 100644 index 11e1aff4..00000000 --- a/web/test/memberEdit.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { parseClasses } from '../src/core/classModel' -import { addFieldConstructor, addGettersSetters, addToString, classDoc, fieldInfo, parseParams, setClassDoc, setField, setMethod } from '../src/core/memberEdit' - -const src = `/** - * Ein Hund. - */ -public class Hund { - private String name = "Bello"; - private static int anzahl; - - public void bellen() { - System.out.println("Wuff"); - } -} -` -const cls = (s: string) => parseClasses(s)[0] - -describe('memberEdit', () => { - it('liest und schreibt Attribute mit Startwert und final', () => { - const f = cls(src).members[0] - expect(fieldInfo(src, f)).toEqual({ visibility: '-', name: 'name', type: 'String', isStatic: false, isFinal: false, init: '"Bello"' }) - const out = setField(src, f, { isFinal: true, visibility: '#' }) - expect(out).toContain(' protected final String name = "Bello";\n') - expect(fieldInfo(out, cls(out).members[0]).isFinal).toBe(true) - }) - - it('ändert den Methodenkopf, der Rumpf bleibt; abstract macht ;', () => { - const m = cls(src).members[2] - let out = setMethod(src, cls(src), m, { type: 'String', name: 'laut', params: parseParams('mal: int')! }) - expect(out).toContain('public String laut(int mal) {\n System.out.println("Wuff");') - out = setMethod(out, cls(out), cls(out).members[2], { isAbstract: true }) - expect(out).toContain('public abstract String laut(int mal);') - out = setMethod(out, cls(out), cls(out).members[2], { isAbstract: false }) - expect(out).toContain('public String laut(int mal) {\n return null;\n }') - }) - - it('Javadoc lesen und schreiben', () => { - expect(classDoc(src, cls(src))).toBe('Ein Hund.') - const out = setClassDoc(src, cls(src), 'Ein treuer Hund.\n@author Holger') - expect(out.startsWith('/**\n * Ein treuer Hund.\n * @author Holger\n */\npublic class Hund {')).toBe(true) - expect(setClassDoc(out, cls(out), '').startsWith('public class Hund {')).toBe(true) - }) - - it('erzeugt Konstruktor, Getter/Setter und toString wie Eclipse', () => { - let out = addFieldConstructor(src, cls(src)) - expect(out).toContain(' public Hund(String name) {\n this.name = name;\n }\n}') - out = addGettersSetters(out, cls(out)) - expect(out).toContain('public String getName() {\n return name;\n }') - expect(out).toContain('public void setName(String name) {\n this.name = name;\n }') - expect(addGettersSetters(out, cls(out))).toBe(out) - out = addToString(out, cls(out)) - expect(out).toContain('return "Hund [" + "name=" + name + "]";') - expect(parseClasses(out)[0].members.map((m) => m.name)).toEqual(['name', 'anzahl', 'bellen', 'Hund', 'getName', 'setName', 'toString']) - }) -}) diff --git a/web/test/miniJava.test.ts b/web/test/miniJava.test.ts deleted file mode 100644 index d542c3b4..00000000 --- a/web/test/miniJava.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { MiniJava, MiniJavaError, formatDouble } from '../src/core/miniJava' - -function run(files: Record | string, input: string[] = []) { - const list = typeof files === 'string' ? [{ path: 'Main.java', source: files }] : Object.entries(files).map(([path, source]) => ({ path, source })) - let out = '' - const vm = new MiniJava(list, { out: (t) => (out += t) }) - vm.start() - vm.go('run') - for (let guard = 0; guard < 1000; guard++) { - const s = vm.run(new Set(), 100000) - if (s.k === 'input') vm.input(input.length ? input.shift()! : null) - else if (s.k === 'sleep' || s.k === 'running') continue - else if (s.k === 'exception') return out + s.text - else if (s.k === 'error') throw s.error - else return out - } - throw new Error('läuft zu lange') -} - -const main = (body: string, extra = '') => `public class Main {\n${extra}\npublic static void main(String[] args) {\n${body}\n}\n}` - -describe('miniJava', () => { - it('rechnet wie Java', () => { - expect(run(main('System.out.println(7 / 2); System.out.println(7 / 2.0); System.out.println(7 % 3); System.out.println(1 + 2 + "x" + 1 + 2);'))).toBe('3\n3.5\n1\n3x12\n') - expect(run(main("double d = 5; System.out.println(d); int i = (int) 3.9; System.out.println(i); char c = 'A'; c++; System.out.println(c); System.out.println(c + 1);"))).toBe('5.0\n3\nB\n67\n') - expect(run(main('System.out.println(Integer.MAX_VALUE + 1); System.out.println(0.1 + 0.2); System.out.println(1e7);'))).toBe('-2147483648\n0.30000000000000004\n1.0E7\n') - expect(run(main('int x = 5; x += 2.7; System.out.println(x); String s = "a"; s += 1; System.out.println(s);'))).toBe('7\na1\n') - }) - - it('Schleifen, switch, Arrays', () => { - const src = 'import java.util.Arrays;\n' + main(` - int summe = 0; - for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; summe += i; } - System.out.println(summe); - int[] a = {3, 1, 2}; - Arrays.sort(a); - System.out.println(Arrays.toString(a) + " " + a.length); - int[][] g = new int[2][3]; - g[1][2] = 4; - System.out.println(g[1][2] + g[0][0]); - String tag = "Mo"; - switch (tag) { case "Mo": System.out.println("Montag"); case "Di": System.out.println("weiter"); break; default: System.out.println("nein"); } - int k = 0; while (true) { k++; if (k > 3) break; } System.out.println(k); - do { k--; } while (k > 0); System.out.println(k); - `) - expect(run(src)).toBe('25\n[1, 2, 3] 3\n4\nMontag\nweiter\n4\n0\n') - }) - - it('Klassen, Konstruktoren, Vererbung, toString', () => { - const files = { - 'Tier.java': `public abstract class Tier { - private String name; - protected int beine = 4; - public Tier(String name) { this.name = name; } - public String getName() { return name; } - public abstract String laut(); - public String toString() { return name + " sagt " + laut(); } - }`, - 'Hund.java': `public class Hund extends Tier { - public Hund(String name) { super(name); } - public String laut() { return "Wuff"; } - }`, - 'Vogel.java': `public class Vogel extends Tier { - public Vogel() { this("Piepmatz"); beine = 2; } - public Vogel(String n) { super(n); } - @Override public String laut() { return "Piep"; } - public String toString() { return super.toString() + " (" + beine + " Beine)"; } - }`, - 'Main.java': `import java.util.ArrayList; - public class Main { - static int zaehler = 0; - public static void main(String[] args) { - ArrayList tiere = new ArrayList<>(); - tiere.add(new Hund("Bello")); - tiere.add(new Vogel()); - for (Tier t : tiere) { System.out.println(t); zaehler++; } - System.out.println(zaehler + " " + tiere.size() + " " + (tiere.get(0) instanceof Hund)); - Tier t = tiere.get(1); - Vogel v = (Vogel) t; - System.out.println(v.getName()); - } - }`, - } - expect(run(files)).toBe('Bello sagt Wuff\nPiepmatz sagt Piep (2 Beine)\n2 2 true\nPiepmatz\n') - }) - - it('Exceptions mit try/catch/finally und ungefangen', () => { - const src = main(` - try { int x = 5 / 0; } catch (ArithmeticException e) { System.out.println("Fehler: " + e.getMessage()); } finally { System.out.println("fertig"); } - try { throw new KontoException("leer"); } catch (Exception e) { System.out.println(e.getMessage()); } - int[] a = new int[2]; - a[2] = 1; - `) - const files = { 'Main.java': src, 'KontoException.java': 'public class KontoException extends Exception { public KontoException(String m) { super(m); } }' } - expect(run(files)).toBe('Fehler: / by zero\nfertig\nleer\nException in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2\n\tat Main.main(Main.java:8)') - }) - - it('Scanner mit nextInt und nextLine wie in Java', () => { - const src = `import java.util.Scanner; - public class Main { public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - System.out.print("Zahl: "); - int z = sc.nextInt(); - String rest = sc.nextLine(); - String name = sc.nextLine(); - double d = sc.nextDouble(); - System.out.println(z * 2 + "|" + rest + "|" + name + "|" + d); - } }` - expect(run(src, ['21', 'Anna Lena', '2,5'])).toBe('Zahl: 42||Anna Lena|2.5\n') - }) - - it('printf und String-Methoden', () => { - expect( - run(main('System.out.printf("%5.2f|%-4d|%s%n", 3.14159, 7, "x"); String s = "Hallo"; System.out.println(s.charAt(1) + s.substring(2).toUpperCase() + s.indexOf("l") + s.equals("Hallo"));')), - ).toBe(' 3,14|7 |x\naLLO2true\n') - }) - - it('statische Methoden, Rekursion, enum', () => { - const src = `public class Main { - enum Farbe { ROT, GRUEN } - static int fak(int n) { return n <= 1 ? 1 : n * fak(n - 1); } - public static void main(String[] args) { - System.out.println(fak(5)); - Farbe f = Farbe.GRUEN; - switch (f) { case ROT: System.out.println("r"); break; case GRUEN: System.out.println("g"); break; } - System.out.println(f + " " + f.ordinal()); - } - }` - expect(() => run(src)).toThrow(MiniJavaError) // innere Klassen kann der Debugger nicht - const files = { 'Farbe.java': 'public enum Farbe { ROT, GRUEN }', 'Main.java': src.replace('enum Farbe { ROT, GRUEN }', '') } - expect(run(files)).toBe('120\ng\nGRUEN 1\n') - }) - - it('meldet Endlosrekursion als StackOverflowError', () => { - expect(run(main('f();', 'static void f() { f(); }'))).toMatch(/^Exception in thread "main" java.lang.StackOverflowError/) - }) - - it('hält an Haltepunkten und geht Schritt für Schritt', () => { - const src = `public class Main { - public static void main(String[] args) { - Konto k = new Konto(); - k.einzahlen(5); - k.einzahlen(7); - System.out.println(k.stand); - } -}` - const konto = `public class Konto { - int stand; - void einzahlen(int b) { - stand = stand + b; - } -}` - let out = '' - const vm = new MiniJava( - [ - { path: 'Main.java', source: src }, - { path: 'Konto.java', source: konto }, - ], - { out: (t) => (out += t) }, - ) - vm.start() - vm.go('run') - const bp = new Set(['Konto.java:3']) - let s = vm.run(bp) - expect(s).toEqual({ k: 'paused', pos: { file: 'Konto.java', line: 3 } }) - let stack = vm.stack() - expect(stack.map((f) => f.title)).toEqual(['Konto.einzahlen()', 'Main.main()']) - expect(stack[0].vars).toEqual([ - { name: 'this', type: 'Konto', value: 'k', ref: expect.any(Number) }, - { name: 'b', type: 'int', value: '5' }, - ]) - expect(vm.heap()).toEqual([{ id: expect.any(Number), name: 'k', cls: 'Konto', fields: [{ name: 'stand', type: 'int', value: '0' }] }]) - // Schritt: schließende Klammer der Methode, dann zurück in main - vm.go('into') - expect(vm.run(bp)).toEqual({ k: 'paused', pos: { file: 'Konto.java', line: 4 } }) - expect(vm.heap()[0].fields[0].value).toBe('5') - vm.go('out') - expect(vm.run(bp)).toEqual({ k: 'paused', pos: { file: 'Main.java', line: 4 } }) - vm.go('over') - // Ein Haltepunkt in der Methode hält auch beim Überspringen an (wie in Eclipse). - expect(vm.run(bp)).toEqual({ k: 'paused', pos: { file: 'Konto.java', line: 3 } }) - vm.go('out') - expect(vm.run(bp)).toEqual({ k: 'paused', pos: { file: 'Main.java', line: 5 } }) - expect(vm.heap()[0].fields[0].value).toBe('12') - vm.go('run') - s = vm.run(bp) - expect(s.k).toBe('done') - expect(out).toBe('12\n') - stack = vm.stack() - expect(stack).toEqual([]) - }) - - it('benennt Objekte nach Variablen und Attributen', () => { - const src = `import java.util.ArrayList; -public class Main { - public static void main(String[] args) { - Team t = new Team(); - t.add(new Spieler("Anna")); - t.add(new Spieler("Ben")); - Spieler s1 = t.liste.get(0); - System.out.println(s1); - } -} -class Team { ArrayList liste = new ArrayList<>(); Spieler kapitaen; void add(Spieler s) { liste.add(s); kapitaen = s; } } -class Spieler { String name; Spieler(String n) { name = n; } public String toString() { return name; } }` - const vm = new MiniJava([{ path: 'Main.java', source: src }], { out: () => {} }) - vm.start() - vm.go('run') - expect(vm.run(new Set(['Main.java:6']))).toMatchObject({ k: 'paused' }) - const heap = vm.heap() - expect(heap.map((o) => `${o.name}:${o.cls}`)).toEqual(['t:Team', 'spieler:Spieler', 'kapitaen:Spieler']) - expect(heap[0].fields).toEqual([ - { name: 'liste', type: 'ArrayList', value: '[spieler, kapitaen]' }, - { name: 'kapitaen', type: 'Spieler', value: 'kapitaen' }, - ]) - expect(heap[1].fields).toEqual([{ name: 'name', type: 'String', value: '"Anna"' }]) - }) - - it('formatiert Kommazahlen wie Java', () => { - expect([1, 0.5, 100, 1e-4, 12345678.9, -2].map(formatDouble)).toEqual(['1.0', '0.5', '100.0', '1.0E-4', '1.23456789E7', '-2.0']) - }) - - it('schneidet Aufrufe für das Sequenzdiagramm mit', () => { - const src = `public class Main { - public static void main(String[] args) { - Team t = new Team(); - Spieler s1 = new Spieler("Anna"); - t.aufnehmen(s1); - System.out.println(t.anzahl()); - } -} -class Team { int n; void aufnehmen(Spieler s) { n++; s.begruessen(); } int anzahl() { return n; } } -class Spieler { String name; Spieler(String n) { name = n; } void begruessen() { } }` - const vm = new MiniJava([{ path: 'Main.java', source: src }], { out: () => {} }) - vm.start() - vm.go('run') - expect(vm.run(new Set()).k).toBe('done') - const { participants, events } = vm.sequence() - expect(participants.map((p) => p.label)).toEqual(['Main', 't : Team', 's1 : Spieler']) - const key = Object.fromEntries(participants.map((p) => [p.key, p.label])) - expect(events.map((e) => (e.k === 'return' ? `return ${e.label}${e.hidden ? ' (hidden)' : ''}` : `${key[e.from]} -> ${key[e.to]}: ${e.label}`))).toEqual([ - 'Main -> t : Team: new Team()', - 'return (hidden)', - 'Main -> s1 : Spieler: new Spieler("Anna")', - 'return (hidden)', - 'Main -> t : Team: aufnehmen(s1)', - 't : Team -> s1 : Spieler: begruessen()', - 'return ', - 'return ', - 'Main -> t : Team: anzahl()', - 'return 1', - ]) - }) - - it('Scanner ohne Import ist wie bei javac ein Fehler', () => { - const body = 'Scanner eingabe = new Scanner(System.in); System.out.println(eingabe.next());' - let err: unknown - try { - run(main(body), ['Hallo']) - } catch (e) { - err = e - } - expect(err).toBeInstanceOf(MiniJavaError) - expect((err as MiniJavaError).code).toBe('import') - expect((err as MiniJavaError).detail).toBe('import java.util.Scanner;') - expect(run('import java.util.Scanner;\n' + main(body), ['Hallo'])).toBe('Hallo\n') - expect(run('import java.util.*;\n' + main(body), ['Hallo'])).toBe('Hallo\n') - }) - - it('boolean ohne Startwert und vertippte Datentypen wie bei javac', () => { - expect(run(main('boolean b; b = 3 > 2; System.out.println(b == true); boolean c = !b || false; if (!c) System.out.println(c);'))).toBe('true\nfalse\n') - let err: unknown - try { - run(main('booelan wpfAlleUeber5 = true;')) - } catch (e) { - err = e - } - expect((err as MiniJavaError).code).toBe('typename') - expect((err as MiniJavaError).detail).toBe('boolean') - expect(run({ 'Main.java': main('Kind k = new Kind(); System.out.println(k.name);'), 'Kind.java': 'public class Kind { String name = "Mia"; }' })).toBe('Mia\n') - }) -}) diff --git a/web/test/objectModel.test.ts b/web/test/objectModel.test.ts deleted file mode 100644 index 0d83f945..00000000 --- a/web/test/objectModel.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { parseClasses } from '../src/core/classModel' -import { freeObjectName, isA, linkedValue, objectFields, refNames } from '../src/core/objectModel' - -const classes = parseClasses(`class Person { private String name; static int anzahl; } -class Spieler extends Person { private int punkte; private Team team; private ArrayList freunde; } -class Team { }`) - -describe('Objektdiagramm', () => { - it('Attribute samt Oberklasse, ohne static', () => { - expect(objectFields(classes, 'Spieler').map((f) => `${f.name}:${f.target ?? ''}:${f.many}`)).toEqual(['name::false', 'punkte::false', 'team:Team:false', 'freunde:Spieler:true']) - }) - it('Referenzen lesen und verbinden', () => { - expect(refNames('[s1, s2]')).toEqual(['s1', 's2']) - expect(refNames('null')).toEqual([]) - const [, , team, freunde] = objectFields(classes, 'Spieler') - expect(linkedValue(team, 'null', 't1')).toBe('t1') - expect(linkedValue(freunde, '[s1]', 's2')).toBe('[s1, s2]') - expect(linkedValue(freunde, '[s1]', 's1')).toBe('[s1]') - }) - it('Vererbung und Namen', () => { - expect(isA(classes, 'Spieler', 'Person')).toBe(true) - expect(isA(classes, 'Team', 'Person')).toBe(false) - expect(freeObjectName('Spieler', ['spieler1'])).toBe('spieler2') - }) -}) diff --git a/web/test/objectNew.test.ts b/web/test/objectNew.test.ts deleted file mode 100644 index 9968224f..00000000 --- a/web/test/objectNew.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { exampleProject, projectClasses } from '../src/core/javaProject' -import { classSource } from '../src/ui/objectNew' - -const zoo = projectClasses(exampleProject()) -const tier = zoo.find((c) => c.name === 'Tier')! - -describe('objectNew', () => { - it('schreibt eine Klasse wie der Eclipse-Assistent', () => { - const text = classSource({ kind: 'class', pkg: 'haus', name: 'Katze', isPublic: true, isAbstract: false, isFinal: false, superclass: tier, interfaces: [], main: true, constructors: true, inherited: true, comment: true, author: 'Holger' }) - expect(text).toContain('package haus;') - expect(text).toContain('import tiere.Tier;') - expect(text).toContain('@author Holger') - expect(text).toContain('public class Katze extends Tier {') - expect(text).toContain('public Katze(String name, int alter) {\n super(name, alter);') - expect(text).toContain('public static void main(String[] args) {') - expect(projectClasses({ name: 'x', packages: [], files: [{ path: 'haus/Katze.java', text }] })[0].superclass).toBe('Tier') - }) - - it('Interface mit extends, Klasse mit geerbten Methoden', () => { - const iface = classSource({ kind: 'interface', pkg: '', name: 'Laut', isPublic: true, isAbstract: false, isFinal: false, interfaces: [], main: false, constructors: false, inherited: false, comment: false, author: '' }) - expect(iface).toBe('public interface Laut {\n}\n') - const laut = projectClasses({ name: 'x', packages: [], files: [{ path: 'Laut.java', text: 'public interface Laut {\n int lautstaerke();\n}\n' }] })[0] - const cls = classSource({ kind: 'class', pkg: '', name: 'Kuh', isPublic: false, isAbstract: false, isFinal: true, interfaces: [laut], main: false, constructors: false, inherited: true, comment: false, author: '' }) - expect(cls).toContain('final class Kuh implements Laut {') - expect(cls).toContain('@Override\n public int lautstaerke() {\n return 0;') - }) -}) diff --git a/web/test/objectWorkspace.test.ts b/web/test/objectWorkspace.test.ts deleted file mode 100644 index 9f1b4aec..00000000 --- a/web/test/objectWorkspace.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { exampleProject } from '../src/core/javaProject' -import { freeProjectName, listProjects, readProject, writeProject } from '../src/ui/objectWorkspace' -import type { WsDir, WsEntry } from '../src/ui/workspaceStore' - -/** Ordner im Speicher: Pfad → Text, Ordner enden auf `/`. */ -class MemDir implements WsDir { - constructor( - readonly name: string, - private files: Map, - private path = '', - ) {} - async list(): Promise { - const seen = new Map() - for (const key of this.files.keys()) { - if (!key.startsWith(this.path) || key === this.path) continue - const rest = key.slice(this.path.length) - const slash = rest.indexOf('/') - const name = slash < 0 ? rest : rest.slice(0, slash) - if (!name.startsWith('.') && !seen.has(name)) seen.set(name, { kind: slash < 0 ? 'file' : 'directory', name }) - } - return [...seen.values()] - } - async dir(name: string, create = false): Promise { - const key = `${this.path}${name}/` - if (![...this.files.keys()].some((k) => k.startsWith(key))) { - if (!create) throw new Error('missing') - this.files.set(key, '') - } - return new MemDir(name, this.files, key) - } - async read(name: string) { - const text = this.files.get(this.path + name) - if (text === undefined) throw new Error('missing') - return text - } - async write(name: string, text: string) { - this.files.set(this.path + name, text) - } - async has(name: string) { - return [...this.files.keys()].some((k) => k === this.path + name || k.startsWith(`${this.path}${name}/`)) - } - async remove(name: string) { - for (const k of [...this.files.keys()]) if (k === this.path + name || k.startsWith(`${this.path}${name}/`)) this.files.delete(k) - } -} - -describe('objectWorkspace', () => { - it('schreibt ein Projekt wie Eclipse und liest es wieder', async () => { - const files = new Map() - const root = new MemDir('VisuObject-Workspace', files) - const zoo = { ...exampleProject(), packages: ['leer'] } - await writeProject(root, 'Zoo', zoo, { Hund: { x: 10, y: 20 } }) - expect(files.has('Zoo/src/tiere/Hund.java')).toBe(true) - expect(files.has('Zoo/.project')).toBe(true) - expect(files.get('Zoo/.classpath')).toContain('kind="src" path="src"') - expect(await listProjects(root)).toEqual(['Zoo']) - const back = await readProject(root, 'Zoo') - expect(back.project.files.map((f) => f.path).sort()).toEqual(zoo.files.map((f) => f.path).sort()) - expect(back.project.packages).toEqual(['leer']) - expect(back.project.uml).toEqual(zoo.uml) - expect(back.positions).toEqual({ Hund: { x: 10, y: 20 } }) - }) - - it('räumt gelöschte Dateien und Packages weg, lässt bin stehen', async () => { - const files = new Map() - const root = new MemDir('ws', files) - const zoo = exampleProject() - await writeProject(root, 'Zoo', zoo, {}) - files.set('Zoo/bin/tiere/Hund.class', 'x') - await writeProject(root, 'Zoo', { ...zoo, files: zoo.files.filter((f) => !f.path.startsWith('personen/')) }, {}) - expect([...files.keys()].some((k) => k.startsWith('Zoo/src/personen'))).toBe(false) - expect(files.has('Zoo/bin/tiere/Hund.class')).toBe(true) - }) - - it('liest und schreibt mehrere Source Folders über .classpath', async () => { - const files = new Map() - const root = new MemDir('ws', files) - const zoo = { ...exampleProject(), sourceFolders: ['test'], files: [...exampleProject().files, { path: 'test:tiere/HundTest.java', text: 'package tiere;\n\npublic class HundTest {\n}\n' }] } - await writeProject(root, 'Zoo', zoo, {}) - expect(files.has('Zoo/test/tiere/HundTest.java')).toBe(true) - expect(files.get('Zoo/.classpath')).toContain('') - const back = await readProject(root, 'Zoo') - expect(back.project.files.map((f) => f.path)).toContain('test:tiere/HundTest.java') - expect(back.project.sourceFolders).toEqual(['test']) - await writeProject(root, 'Zoo', { ...back.project, sourceFolders: [], files: back.project.files.filter((f) => !f.path.startsWith('test:')) }, {}) - expect([...files.keys()].some((k) => k.startsWith('Zoo/test'))).toBe(false) - expect(files.get('Zoo/.classpath')).not.toContain('path="test"') - }) - - it('findet freie Namen', () => { - expect(freeProjectName('MeinProjekt', ['meinprojekt', 'MeinProjekt2'])).toBe('MeinProjekt3') - }) -}) diff --git a/web/test/ownTypes.test.ts b/web/test/ownTypes.test.ts deleted file mode 100644 index f74d3f28..00000000 --- a/web/test/ownTypes.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { parseClasses } from '../src/core/classModel' -import { memberCompletionsAt } from '../src/core/javaMembers' -import { ownTypes } from '../src/core/ownTypes' - -const spieler = `package spiel; -public class Spieler extends Person { - private int punkte; - public String name; - int level; - protected boolean aktiv; - public static int anzahl; - public Spieler() {} - public int getPunkte() { return punkte; } - public void setPunkte(int punkte) { this.punkte = punkte; } - private void geheim() {} - public static Spieler neu() { return new Spieler(); } -}` -const person = `package spiel; -public class Person { - public String getVorname() { return ""; } -}` -const fenster = `package gui; -public class Fenster extends JFrame { -}` - -const types = [...parseClasses(spieler).map((c) => ({ ...c, pkg: 'spiel' })), ...parseClasses(person).map((c) => ({ ...c, pkg: 'spiel' })), ...parseClasses(fenster).map((c) => ({ ...c, pkg: 'gui' }))] -const names = (code: string, place: { cls?: string; pkg: string }) => memberCompletionsAt(code, code.length, 'de', ownTypes(types, place))?.members.map((m) => m.name) - -describe('Vorschläge nach dem Punkt für eigene Klassen', () => { - it('zeigt Methoden und sichtbare Attribute samt Oberklasse', () => { - const code = 'Spieler s1 = new Spieler();\ns1.' - expect(names(code, { cls: 'Main', pkg: 'spiel' })).toEqual(['name', 'level', 'aktiv', 'getPunkte', 'setPunkte', 'getVorname']) - // Anderes Package: nur public. - expect(names(code, { cls: 'Main', pkg: 'app' })).toEqual(['name', 'getPunkte', 'setPunkte', 'getVorname']) - }) - it('this. zeigt auch private, Klasse. die static-Mitglieder', () => { - expect(names('this.', { cls: 'Spieler', pkg: 'spiel' })).toContain('geheim') - expect(names('Spieler.', { cls: 'Main', pkg: 'app' })).toEqual(['anzahl', 'neu']) - // private wird nicht vererbt: in Person ist punkte über einen Spieler nicht erreichbar. - expect(names('Spieler s = null;\ns.', { cls: 'Person', pkg: 'spiel' })).not.toContain('punkte') - }) - it('folgt Ketten und Standard-Oberklassen', () => { - expect(names('Spieler s = null;\ns.name.', { pkg: 'app' })).toContain('length') - expect(names('Fenster f = new Fenster();\nf.', { pkg: 'app' })).toContain('setVisible') - }) - it('kennt ArrayList mit dem Typ der Elemente', () => { - const code = 'private ArrayList spieler = new ArrayList<>();\n' - expect(names(code + 'spieler.', { pkg: 'app' })).toEqual(['add', 'get', 'size', 'set', 'remove', 'contains', 'indexOf', 'isEmpty', 'clear']) - expect(names(code + 'spieler.get(0).', { pkg: 'app' })).toContain('getPunkte') - expect(memberCompletionsAt(code + 'spieler.', code.length + 9, 'de')?.members.find((m) => m.name === 'get')?.returns).toBe('Spieler') - }) -}) diff --git a/web/test/progressMerge.test.ts b/web/test/progressMerge.test.ts deleted file mode 100644 index 6156011e..00000000 --- a/web/test/progressMerge.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { mergeProgress, progress } from '../src/learn/progress' - -describe('Lernstand zusammenführen', () => { - it('erledigt bleibt erledigt, der weiteste Schritt zählt', () => { - const mine = { lessons: { a: { step: 2, checks: { x: true } } }, exercises: { e: { xml: '' } } } - const theirs = { lessons: { a: { step: 5, done: true, checks: { x: false, y: true } }, b: { step: 1 } }, exercises: { e: { done: true, xml: '' }, f: { done: true } } } - const m = mergeProgress(mine, theirs) - expect(m.lessons.a).toEqual({ step: 5, done: true, checks: { x: true, y: true }, quiz: undefined }) - expect(m.lessons.b).toEqual({ step: 1 }) - expect(m.exercises.e).toEqual({ done: true, xml: '' }) - expect(m.exercises.f).toEqual({ done: true }) - }) - - it('die eigene Selbsteinschätzung geht vor', () => { - const m = mergeProgress({ lessons: { a: { step: 1, checks: { x: 'cloud' as const } } }, exercises: {} }, { lessons: { a: { step: 1, checks: { x: 'sun' as const, y: 'umbrella' as const } } }, exercises: {} }) - expect(m.lessons.a.checks).toEqual({ x: 'cloud', y: 'umbrella' }) - }) - - it('übernimmt die Datei, wenn im Browser nichts ist', () => { - const theirs = { lessons: { a: { step: 3, done: true } }, exercises: { e: { done: true, xml: '' } } } - expect(mergeProgress({ lessons: {}, exercises: {} }, theirs)).toEqual(theirs) - }) -}) - -describe('Lernstand aus der Datei', () => { - const file = (lessons: object, extra: object = {}) => JSON.stringify({ format: 'visustruct-lernstand', version: 1, lessons, exercises: {}, ...extra }) - - it('die Datei ersetzt den Stand, alte Reste verschwinden', () => { - expect(progress.loadFile(file({ a: { step: 4, done: true } }))).toBe(true) - progress.updateLesson('b', { step: 2 }) - expect(progress.loadFile(file({ c: { step: 1 } }))).toBe(true) - expect(progress.lesson('c').step).toBe(1) - expect(progress.lesson('a').step).toBe(0) - expect(JSON.parse(progress.toFile()).lessons.b).toBeUndefined() - }) - - it('behält auf Wunsch, was in der Sitzung vor dem Öffnen gelernt wurde, und übernimmt die Ansicht', () => { - progress.clear() - progress.updateLesson('a', { step: 3 }) - progress.loadFile(file({ b: { step: 2 } }, { view: { tab: 'tasks' } }), true) - expect(progress.lesson('a').step).toBe(3) - expect(progress.lesson('b').step).toBe(2) - expect(progress.view()).toEqual({ tab: 'tasks' }) - }) - - it('übernimmt umbenannte VisuBot-Lektionen und ignoriert fremde Dateien', () => { - progress.loadFile(file({ '13-lautsprecher': { step: 5 }, '03-sensoren': { step: 2 }, '17-stoppuhr-akku': { step: 1, done: true } })) - expect(progress.lesson('16-lautsprecher').step).toBe(5) - expect(progress.lesson('04-sensoren').step).toBe(2) - expect(progress.lesson('21-stoppuhr-akku').done).toBe(true) - expect(progress.lesson('03-sensoren').step).toBe(0) - expect(progress.loadFile('{"lessons":{}}')).toBe(false) - }) - - it('merkt sich nichts im Browser', () => { - progress.updateLesson('x', { step: 1 }) - expect(localStorage.getItem('visustruct.learn.progress')).toBeNull() - }) -}) diff --git a/web/test/pythonExport.test.ts b/web/test/pythonExport.test.ts deleted file mode 100644 index 4524f200..00000000 --- a/web/test/pythonExport.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { spawnSync } from 'node:child_process' -import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' -import { tmpdir } from 'node:os' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { generateCode } from '../src/core/codeGenerator' -import { fileLines, sameOutput, usedElementTypes } from '../src/core/exerciseCheck' -import { ElementType } from '../src/core/model' -import { parseSubprogramHeader, textFileEntries } from '../src/core/simulation' -import { contentLanguages, diagram, lessons, tasks, useContentLanguage } from '../src/learn/content' - -// Jede Musterlösung als echtes Python ausführen: gleiche Ausgabe wie in der Simulation. - -const python = spawnSync('python3', ['--version']).status === 0 - -/** Eingaben ohne Hinweistext lesen; `print("x: ")` direkt vor einem `input(` ist nur ein Hinweis. */ -function runnable(code: string): string { - const lines = code.split('\n') - const kept = lines.filter((line, i) => !(/^\s*print\("[^"]*"\)$/.test(line) && lines[i + 1]?.includes('input('))) - return 'import sys\ninput = lambda prompt="": sys.stdin.readline().rstrip("\\n")\n' + kept.join('\n') + '\n' -} - -describe.skipIf(!python)('Python-Export', () => { - it.each(contentLanguages)('jede Musterlösung läuft als Python mit derselben Ausgabe (%s)', (lang) => { - useContentLanguage(lang) - // Textdateien der Lektionen liegen im Arbeitsordner, wie bei `open("brief.txt")` erwartet. - const cwd = mkdtempSync(join(tmpdir(), 'visustruct-')) - for (const [name, content] of textFileEntries()) writeFileSync(join(cwd, name), content) - let checked = 0 - const blocks = [...lessons.flatMap((l) => l.steps.flatMap((s) => s.blocks)), ...tasks.flatMap((t) => t.blocks)] - for (const block of blocks) { - if (block.kind !== 'exercise' || !block.exercise.solution) continue - const doc = diagram(block.exercise.solution)! - const subs = block.exercise.subprograms.map((f) => diagram(f)!) - // Unterprogramme ohne Kopfzeile teilen sich die Variablen mit dem Hauptprogramm; das gibt es in Python nicht. - if (usedElementTypes(doc).has(ElementType.aufruf) && !(subs.length > 0 && subs.every((d) => parseSubprogramHeader(d.caption)))) continue - const code = generateCode(doc, 'python', {}, subs) - for (const test of block.exercise.tests) { - for (const f of test.files ?? []) rmSync(join(cwd, f.name), { force: true }) - const run = spawnSync('python3', ['-c', runnable(code)], { input: test.inputs.join('\n') + '\n', encoding: 'utf8', cwd }) - const outputs = run.stdout.split('\n').slice(0, -1) - const where = `${block.exercise.id} mit ${JSON.stringify(test.inputs)}\n${code}\n${run.stderr}` - expect(run.status, where).toBe(0) - expect(sameOutput(outputs, test.expected), `${where}\n${JSON.stringify(outputs)}`).toBe(true) - for (const f of test.files ?? []) { - const written = existsSync(join(cwd, f.name)) ? readFileSync(join(cwd, f.name), 'utf8') : undefined - expect(sameOutput(fileLines(written), f.lines), `${where}\n${f.name}: ${JSON.stringify(written)}`).toBe(true) - } - } - checked++ - } - expect(checked).toBeGreaterThan(20) - // Startet für jeden Testfall einen eigenen Python-Prozess; mit wachsender Zahl an Übungen dauert das länger als 5 s. - }, 60_000) -}) diff --git a/web/test/rename.test.ts b/web/test/rename.test.ts deleted file mode 100644 index 69ce6b44..00000000 --- a/web/test/rename.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { ElementType, makeElement, type VSDocument } from '../src/core/model' -import { checkNewName, documentVariableNames, nameAt, renameInDocument, renameInText, variableNames } from '../src/core/rename' - -describe('Umbenennen', () => { - it('ändert nur genau dieselbe Schreibweise, ganze Wörter', () => { - const code = 'int zahl = 3;\nint Zahl = zahl + 1;\nint zahlen = zahl;' - expect(renameInText(code, 'zahl', 'anzahl')).toEqual({ text: 'int anzahl = 3;\nint Zahl = anzahl + 1;\nint zahlen = anzahl;', count: 3 }) - }) - - it('lässt Zeichenketten, Zeichen, Kommentare und Felder hinter dem Punkt', () => { - const code = 'int length = 2; // length\nSystem.out.println("length " + length + feld.length + \'x\');\n/* length */' - const r = renameInText(code, 'length', 'laenge') - expect(r.count).toBe(2) - expect(r.text).toBe('int laenge = 2; // length\nSystem.out.println("length " + laenge + feld.length + \'x\');\n/* length */') - }) - - it('findet den Namen unter dem Cursor, aber keine Schlüsselwörter', () => { - const code = 'int zahl = 3;' - expect(nameAt(code, 6)?.name).toBe('zahl') - expect(nameAt(code, 8)?.name).toBe('zahl') - expect(nameAt(code, 1)).toBeUndefined() - }) - - it('nennt Variablen, keine Typen, Klassen oder Methoden', () => { - const names = variableNames(['Scanner sc = new Scanner(System.in);', 'int zahl = sc.nextInt();', 'String[] namen;', 'zahl = Math.max(zahl, Zahl);']) - expect(names).toEqual(['sc', 'zahl', 'namen', 'Zahl']) - }) - - it('benennt im ganzen Struktogramm um, auch in Kopf und Schleifen', () => { - const doc: VSDocument = { - caption: 'summe(int zahl)', - elements: [ - makeElement(ElementType.anweisung, { textLines: ['int Zahl = zahl'] }), - makeElement(ElementType.whileSchleife, { textLines: ['zahl > 0'], loopBody: [makeElement(ElementType.anweisung, { textLines: ['zahl = zahl - 1'] })] }), - ], - } - const r = renameInDocument(doc, 'zahl', 'wert') - expect(r.count).toBe(5) - expect(r.doc.caption).toBe('summe(int wert)') - expect(r.doc.elements[0].textLines).toEqual(['int Zahl = wert']) - expect(r.doc.elements[1].loopBody![0].textLines).toEqual(['wert = wert - 1']) - expect(documentVariableNames(r.doc)).toContain('Zahl') - }) - - it('prüft den neuen Namen', () => { - expect(checkNewName('Zahl', 'zahl', ['zahl', 'Zahl'])).toEqual({ ok: true, warning: 'exists' }) - expect(checkNewName('zahl', 'int', [])).toEqual({ ok: false, reason: 'keyword' }) - expect(checkNewName('zahl', '2te', [])).toEqual({ ok: false, reason: 'invalid' }) - expect(checkNewName('zahl', 'größe', [])).toEqual({ ok: true }) - }) -}) diff --git a/web/test/rescueGame.test.ts b/web/test/rescueGame.test.ts deleted file mode 100644 index 60ef642d..00000000 --- a/web/test/rescueGame.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { contentLanguages, lessons, useContentLanguage } from '../src/learn/content' -import { crosswordGrid, parseCrosswordGame, parseRescueGame, RescueGameError } from '../src/learn/rescueGame' - -const game = (extra = '', station = 'zahl: 1\nfeld: 1 2') => - `titel: Spiel -intro: Los -station: Eins - int zahl = "AB".indexOf("B"); -frage: Welche Zahl? -${station} -> Weil B bei 1 steht. -kreuzwort: Rätsel -- → 1 1 ABC: Anfang des Alphabets -- ↓ 1 3 CD: Danach -lösung: 1 2, 2 3 -${extra} -tor: Tor - String w = "___"; -ende: Frei`.split('\n') - -describe('Spiel „Prinzessin retten“', () => { - it('liest Stationen, Rätsel und Lösungswort', () => { - const g = parseRescueGame(game(), 'x.md') - expect(g.stations[0]).toMatchObject({ answer: 1, row: 0, col: 1, code: 'int zahl = "AB".indexOf("B");' }) - expect(g.keyword).toBe('BD') - expect(g.words.map((w) => w.number)).toEqual([1, 2]) - expect(crosswordGrid(g)).toEqual([ - ['A', 'B', 'C'], - ['', '', 'D'], - ]) - }) - - it('prüft, ob alphabet.charAt(zahl) ins Feld passt', () => { - expect(() => parseRescueGame(game('', 'zahl: 2\nfeld: 1 2'), 'x.md')).toThrow(/charAt\(2\) ist C/) - expect(() => parseRescueGame(game('', 'zahl: 40\nfeld: 1 2'), 'x.md')).toThrow(RescueGameError) - }) - - it('meldet Kreuzungen, die nicht passen', () => { - const lines = game().map((l) => (l.startsWith('- ↓') ? '- ↓ 1 3 XD: Falsch' : l)) - expect(() => parseRescueGame(lines, 'x.md')).toThrow(/XD passt/) - }) - - it.each(contentLanguages)('Lektion 17 (%s): Das Tor öffnet BREAK', (lang) => { - useContentLanguage(lang) - const blocks = lessons.find((l) => l.id.startsWith('17'))!.steps.flatMap((s) => s.blocks) - const block = blocks.find((b) => b.kind === 'rescueGame') - expect(block?.kind).toBe('rescueGame') - if (block?.kind !== 'rescueGame') return - expect(block.game.keyword).toBe('BREAK') - expect(block.game.stations).toHaveLength(6) - }) -}) - -describe('Begriffe-Rätsel (::: spiel kreuzwort)', () => { - it('legt die Wörter ins Gitter und liest das Lösungswort', () => { - const game = parseCrosswordGame(['titel: t', 'intro: i', '- → 1 1 SENSOR: misst', '- ↓ 1 1 STOP: hält an', 'lösung: 1 2, 2 1, 1 1'], 't.md') - expect(game.rows).toBe(4) - expect(game.cols).toBe(6) - expect(game.keyword).toBe('ETS') - expect(game.words.map((w) => w.number)).toEqual([1, 1]) - expect(() => parseCrosswordGame(['titel: t', '- → 1 1 SENSOR: misst', '- ↓ 1 1 AKTOR: tut', 'lösung: 1 1'], 't.md')).toThrow(/passt/) - expect(() => parseCrosswordGame(['titel: t', '- → 1 1 SENSOR: misst', '- ↓ 1 1 STOP: hält an'], 't.md')).toThrow(/lösung/) - }) -}) diff --git a/web/test/robotPreview.test.ts b/web/test/robotPreview.test.ts deleted file mode 100644 index fbcc3409..00000000 --- a/web/test/robotPreview.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from 'vitest' -import type { LiveLabels } from '../src/core/codeGenerator' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava } from '../src/core/liveSource' -import { previewRun } from '../src/core/robotPreview' -import { emptyWorld } from '../src/core/robotWorld' - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } -const doc = (java: string) => documentFromJava({ caption: '', elements: [] }, parseLiveJava(java, labels)) - -describe('mBot2-Vorschau beim Bearbeiten', () => { - it('rechnet das ganze Programm durch und merkt sich jedes Bild der Fahrt', () => { - const r = previewRun(doc('for (int i = 0; i < 4; i++) {\n mbot.forward(30);\n mbot.turnRight();\n}'), undefined, emptyWorld) - expect(r.stop).toBe('end') - expect(r.frames).toHaveLength(9) - expect(r.distance).toBe(120) - const last = r.frames.at(-1)! - expect(last.pose.x).toBeCloseTo(0) - expect(last.pose.y).toBeCloseTo(0) - }) - - it('leeres Programm: der mBot2 bleibt am Start', () => { - const r = previewRun(doc(''), undefined, emptyWorld) - expect(r.stop).toBe('end') - expect(r.frames).toHaveLength(1) - expect(r.distance).toBe(0) - }) - - it('Sensoren kommen aus der Welt: bis zur Wand und nicht weiter', () => { - const r = previewRun(doc('while (mbot.getDistance() > 10) {\n mbot.forward();\n}'), undefined, emptyWorld) - expect(r.stop).toBe('end') - expect(r.bumps).toBe(0) - expect(r.frames.at(-1)!.pose.y).toBeGreaterThan(70) - }) - - it('merkt Töne, LEDs und Bildschirm', () => { - const r = previewRun(doc('mbot.playTone(440, 200);\nmbot.setLed(255, 0, 0);\nmbot.showText("Hallo");'), undefined, emptyWorld) - expect(r.frames[1].tone).toEqual([440, 200]) - expect(r.frames.at(-1)!.leds.some((c) => c !== undefined)).toBe(true) - expect(r.frames.at(-1)!.screen).toBe('Hallo') - }) - - it('hält bei einer Eingabe und bei einer Endlosschleife an', () => { - expect(previewRun(doc('Scanner scanner = new Scanner(System.in);\nint n = scanner.nextInt();\nmbot.forward(n);'), undefined, emptyWorld).stop).toBe('input') - expect(previewRun(doc('while (true) {\n mbot.turnRight();\n}'), undefined, emptyWorld).stop).toBe('limit') - }) -}) diff --git a/web/test/robotWorld.test.ts b/web/test/robotWorld.test.ts deleted file mode 100644 index 9d55faec..00000000 --- a/web/test/robotWorld.test.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { makeMBotAction, mbotArguments } from '../src/core/mbot' -import { world } from '../src/learn/content' -import { RobotWorld, parseWorldMap } from '../src/core/robotWorld' - -const act = (w: RobotWorld, method: string, ...args: number[]) => w.apply(makeMBotAction(method, args)) - -describe('VisuBot-Welt', () => { - it('fährt ein Quadrat zurück zum Start', () => { - const w = new RobotWorld() - for (let i = 0; i < 4; i++) { - act(w, 'forward', 50) - act(w, 'turnRight', 90) - } - expect(w.pose.x).toBeCloseTo(0) - expect(w.pose.y).toBeCloseTo(0) - expect(w.pose.heading).toBeCloseTo(0) - expect(w.trail[1]).toEqual({ x: 0, y: 50 }) - expect(w.trail[2].x).toBeCloseTo(50) - }) - - it('misst den Abstand zum Rand und hält vor der Wand', () => { - const w = new RobotWorld() - expect(w.distance()).toBe(91) - act(w, 'forward', 500) - expect(w.pose.y).toBeCloseTo(90) - expect(w.bumps).toBe(1) - }) - - it('sieht eine Wand vor sich', () => { - const w = new RobotWorld({ width: 200, depth: 200, start: { x: 0, y: 0, heading: 0 }, walls: [{ from: { x: -20, y: 40 }, to: { x: 20, y: 40 } }], lines: [] }) - expect(w.distance()).toBe(31) - act(w, 'turnLeft', 90) - expect(w.distance()).toBe(91) - }) - - it('erkennt eine Linie unter dem Sensor', () => { - const line = [{ x: 0, y: -100 }, { x: 0, y: 100 }] - const w = new RobotWorld({ width: 200, depth: 200, start: { x: 0, y: 0, heading: 0 }, walls: [], lines: [line] }) - expect(w.lineState()).toBe(0b0110) - w.pose = { x: 3, y: 0, heading: 0 } - expect(w.lineState() & 0b1000).toBe(0b1000) - w.pose = { x: 30, y: 0, heading: 0 } - expect(w.lineState()).toBe(0) - }) -}) - -describe('Weltkarten', () => { - const step = (method: string, args: number[] = []) => ({ method, args: mbotArguments(method, args)!, label: method }) - - it('liest Wände, Felder, Ziel und Start', () => { - const w = parseWorldMap('// Kommentar\n#.=\n.Z.\n.>.\n') - expect(w.width).toBe(30) - expect(w.depth).toBe(30) - expect(w.start).toEqual({ x: 0, y: -10, heading: 90 }) - expect(w.blocks).toEqual([{ x: -10, y: 10 }]) - expect(w.marks).toEqual([{ x: 10, y: 10 }]) - expect(w.goals).toEqual([{ x: 0, y: 0 }]) - expect(() => parseWorldMap('...\n')).toThrow(/Start/) - expect(() => parseWorldMap('^^\n')).toThrow(/Start/) - }) - - it('Wandklötze bremsen und werden gemessen', () => { - const r = new RobotWorld(parseWorldMap('.#.\n...\n...\n.^.\n')) - expect(r.distance()).toBe(25 - 9) - r.apply(step('forward', [30])) - expect(r.bumps).toBe(1) - expect(r.pose.y).toBeCloseTo(-15 + 25 - 10, 5) - }) - - // Die Musterlösungen der Lektionen, hier direkt in TypeScript: so passen Karten und Schwellen zusammen. - const untilWall = (r: RobotWorld) => { - for (let i = 0; i < 200 && r.distance() > 15; i++) r.apply(step('forward')) - } - const maze = (r: RobotWorld) => { - for (let i = 0; i < 500 && r.lineState() === 0; i++) { - if (r.distance() > 15) r.apply(step('forward')) - else { - r.apply(step('turnRight')) - if (r.distance() < 15) r.apply(step('turnRight', [180])) - } - } - } - - it.each(['wand-kurz', 'wand-mittel', 'wand-lang'])('%s: bis zur Wand endet im Ziel', (name) => { - const r = new RobotWorld(world(name)!) - untilWall(r) - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - }) - - it.each(['labyrinth-1', 'labyrinth-2'])('%s: Wand-Regel findet das Ziel ohne Anstoßen', (name) => { - const r = new RobotWorld(world(name)!) - maze(r) - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - // Nur geradeaus ohne Sensor kommt nicht an - const blind = new RobotWorld(world(name)!) - blind.apply(step('forward', [100])) - expect(blind.atGoal()).toBe(false) - }) - - it('Raster 3: ein Zeichen wird 30 cm groß, Start in der Mitte, Haltefeld unsichtbar', () => { - const w = parseWorldMap('raster: 3\n#o\n>.\n') - expect(w.width).toBe(60) - expect(w.depth).toBe(60) - expect(w.start).toEqual({ x: -15, y: -15, heading: 90 }) - expect(w.blocks).toHaveLength(9) - expect(w.targets).toHaveLength(9) - const r = new RobotWorld(w) - expect(r.atGoal()).toBe(false) - r.apply(step('turnLeft')) - expect(r.distance()).toBe(6) - r.apply(step('turnRight')) - r.apply(step('forward', [30])) - r.apply(step('turnLeft')) - expect(r.lineState()).toBe(0) - expect(r.atGoal()).toBe(false) - r.apply(step('forward', [30])) - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - }) - - // Kara-Aufgaben: ein Feld = 30 cm, Baum im Nachbarfeld heißt Abstand < 20. - const go = (r: RobotWorld, ...moves: [string, number?][]) => moves.forEach(([m, a]) => r.apply(step(m, a === undefined ? [] : [a]))) - const around = (r: RobotWorld) => go(r, ['turnLeft'], ['forward', 30], ['turnRight'], ['forward', 60], ['turnRight'], ['forward', 30], ['turnLeft']) - const aroundRight = (r: RobotWorld) => go(r, ['turnRight'], ['forward', 30], ['turnLeft'], ['forward', 60], ['turnLeft'], ['forward', 30], ['turnRight']) - - it('slalom: abwechselnd oben und unten herum ins Ziel', () => { - const r = new RobotWorld(world('slalom')!) - for (let i = 0; i < 2; i++) { - around(r) - aroundRight(r) - } - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - const straight = new RobotWorld(world('slalom')!) - straight.apply(step('forward', [240])) - expect(straight.bumps).toBe(1) - }) - - it.each(['wald-1', 'wald-2'])('%s: Bäume umfahren bis zum Ziel', (name) => { - const r = new RobotWorld(world(name)!) - for (let i = 0; i < 50 && r.lineState() === 0; i++) { - if (r.distance() < 20) around(r) - else r.apply(step('forward', [30])) - } - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - }) - - it.each(['tunnel-1', 'tunnel-2'])('%s: hält im ersten Tunnelfeld', (name) => { - const r = new RobotWorld(world(name)!) - let left = 99 - let right = 99 - for (let i = 0; i < 50 && !(left < 20 && right < 20); i++) { - r.apply(step('forward', [30])) - r.apply(step('turnLeft')) - left = r.distance() - r.apply(step('turnRight', [180])) - right = r.distance() - r.apply(step('turnLeft')) - } - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - // Nur eine Seite prüfen reicht nicht - const half = new RobotWorld(world(name)!) - for (let i = 0; i < 50; i++) { - half.apply(step('forward', [30])) - half.apply(step('turnLeft')) - const d = half.distance() - half.apply(step('turnRight')) - if (d < 20) break - } - expect(half.atGoal()).toBe(false) - }) - - it.each(['ausgang-1', 'ausgang-2'])('%s: durch jede Lücke nach oben ins Ziel', (name) => { - const r = new RobotWorld(world(name)!) - for (let i = 0; i < 100 && r.lineState() === 0; i++) { - r.apply(step('turnLeft')) - if (r.distance() > 20) { - r.apply(step('forward', [60])) - r.apply(step('turnRight')) - } else { - r.apply(step('turnRight')) - r.apply(step('forward', [30])) - } - } - expect(r.atGoal()).toBe(true) - expect(r.bumps).toBe(0) - }) -}) diff --git a/web/test/sections.test.ts b/web/test/sections.test.ts deleted file mode 100644 index 7aa9a504..00000000 --- a/web/test/sections.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { addMember, parseClasses } from '../src/core/classModel' -import { keepSections, withSections } from '../src/core/sections' - -const de = { fields: 'Attribute', refs: 'Referenzattribute', ctors: 'Konstruktor', methods: 'Methoden' } -const names = new Set(['Spieler', 'Mannschaft']) -const src = `public class Spieler { - public int getPunkte() { - return punkte; - } - - private int punkte; - /** Das Team. */ - private Mannschaft team; - - @Override - public String toString() { - return ""; - } - public Spieler() { - } -} -` - -describe('Abschnitts-Kommentare', () => { - it('ordnet Attribute, Referenzattribute, Konstruktor und Methoden', () => { - const out = withSections(src, parseClasses(src)[0], names, de) - expect(out).toBe(`public class Spieler { - // Attribute - private int punkte; - - // Referenzattribute - /** Das Team. */ - private Mannschaft team; - - // Konstruktor - public Spieler() { - } - - // Methoden - public int getPunkte() { - return punkte; - } - - @Override - public String toString() { - return ""; - } -} -`) - // Zweimal ordnen ändert nichts mehr. - expect(withSections(out, parseClasses(out)[0], names, de)).toBe(out) - }) - it('neues Attribut aus dem Diagramm landet unter seinem Kommentar', () => { - const start = withSections(src, parseClasses(src)[0], names, de) - let next = addMember(start, parseClasses(start)[0], '- level: int') - next = keepSections(next, 'Spieler', names, de) - expect(next).toContain('// Attribute\n private int punkte;\n private int level;\n\n // Referenzattribute') - next = keepSections(addMember(next, parseClasses(next)[0], '- mitspieler: ArrayList'), 'Spieler', names, de) - expect(next).toContain('private Mannschaft team;\n private ArrayList mitspieler;\n\n // Konstruktor') - }) - it('leere Klasse bekommt alle vier Kommentare; ohne Kommentare bleibt alles', () => { - const empty = 'public class A {\n}\n' - expect(withSections(empty, parseClasses(empty)[0], names, de)).toBe('public class A {\n // Attribute\n\n // Referenzattribute\n\n // Konstruktor\n\n // Methoden\n}\n') - expect(keepSections(src, 'Spieler', names, de)).toBe(src) - }) -}) diff --git a/web/test/simulation.test.ts b/web/test/simulation.test.ts deleted file mode 100644 index 132976c5..00000000 --- a/web/test/simulation.test.ts +++ /dev/null @@ -1,763 +0,0 @@ -import { readFileSync } from 'node:fs' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { ElementType, makeElement, type VSDocument, type VSElement } from '../src/core/model' -import { registerTextFile, SimulationEngine, type SimState } from '../src/core/simulation' -import { decodeDocument } from '../src/core/xmlCodec' - -// Port von SimulationEngineTests.swift und SimulationConditionTests.swift. - -const examples = join(__dirname, '..', '..', 'VisuStruct-Dateien') -const example = (name: string) => decodeDocument(readFileSync(join(examples, name), 'utf8')) - -const doc = (elements: VSElement[]): VSDocument => ({ caption: '', elements }) -const stmt = (text: string) => makeElement(ElementType.anweisung, { textLines: [text] }) - -/** Lässt die Simulation bis zum Ende laufen und beantwortet `input:`-Anfragen der Reihe nach. */ -function runSimulation(document: VSDocument, inputs: string[] = [], maxSteps = 10_000): SimState & { message?: string } { - const engine = new SimulationEngine(document) - const remaining = [...inputs] - let steps = 0 - while (steps < maxSteps) { - if (engine.state.inputRequest) { - const next = remaining.shift() - if (next === undefined) throw new Error('Simulation wartet auf Eingabe, aber es sind keine Eingaben mehr übrig.') - engine.provideInput(next) - continue - } - if (!engine.canStep) break - engine.step() - steps += 1 - } - expect(steps).toBeLessThan(maxSteps) - return { ...engine.state, message: engine.message } -} - -describe('Simulation', () => { - it('Collatz gibt die Folge aus', () => { - const state = runSimulation(example('Collatz.visustruct')) - expect(state.outputLines).toEqual( - ['58', '29', '88', '44', '22', '11', '34', '17', '52', '26', '13', '40', '20', '10', '5', '16', '8', '4', '2', '1'], - ) - expect(state.variables.get('number')).toEqual({ kind: 'int', value: 1 }) - }) - - it('Fibonacci gibt die ersten zehn Zahlen aus', () => { - expect(runSimulation(example('Fibonacci.visustruct')).outputLines).toEqual( - ['1', '1', '2', '3', '5', '8', '13', '21', '34', '55'], - ) - }) - - it('NumberEven nutzt die Eingabe', () => { - const d = example('2026-04-23-NumberEven.visustruct') - expect(runSimulation(d, ['4']).outputLines).toEqual(['number is even']) - expect(runSimulation(d, ['7']).outputLines).toEqual(['number is odd']) - }) - - it('weist ungültige Ganzzahl-Eingaben zurück', () => { - const engine = new SimulationEngine(doc([stmt('input: int n'), stmt('print: n * 2')])) - engine.step() - expect(engine.state.inputRequest?.variableName).toBe('n') - engine.provideInput('abc') - expect(engine.state.inputErrorNotice).toEqual({ kind: 'wholeNumberExpected' }) - expect(engine.state.inputRequest).toBeDefined() - engine.provideInput('21') - expect(engine.state.inputRequest).toBeUndefined() - engine.step() - expect(engine.state.outputLines).toEqual(['42']) - }) - - it('zählende Schleifen', () => { - const forLoop = doc([ - stmt('int sum = 0'), - makeElement(ElementType.forSchleife, { textLines: ['int i = 1', 'i <= 4', 'i++'], loopBody: [stmt('sum += i')] }), - ]) - expect(runSimulation(forLoop).variables.get('sum')).toEqual({ kind: 'int', value: 10 }) - - const doUntil = doc([ - stmt('int k = 0'), - makeElement(ElementType.doUntilSchleife, { textLines: ['k < 3'], loopBody: [stmt('k++')] }), - ]) - expect(runSimulation(doUntil).variables.get('k')).toEqual({ kind: 'int', value: 3 }) - }) - - it('Fallauswahl springt in den default-Fall', () => { - const d = (day: number) => - doc([ - stmt(`int day = ${day}`), - makeElement(ElementType.fallauswahl, { - textLines: ['day'], - cases: [ - { name: '1', elements: [stmt('print: "Montag"')] }, - { name: '2', elements: [stmt('print: "Dienstag"')] }, - { name: 'default', elements: [stmt('print: "anderer Tag"')] }, - ], - }), - ]) - expect(runSimulation(d(2)).outputLines).toEqual(['Dienstag']) - expect(runSimulation(d(5)).outputLines).toEqual(['anderer Tag']) - }) - - it('überspringt den Platzhalter ø', () => { - const d = (a: number) => - doc([ - stmt('ø'), - stmt(`int a = ${a}`), - makeElement(ElementType.verzweigung, { - textLines: ['a > 3'], - cases: [ - { name: 'true', elements: [stmt('print: "groß"')] }, - { name: 'false', elements: [stmt('ø')] }, - ], - }), - ]) - const big = runSimulation(d(5)) - expect(big.outputLines).toEqual(['groß']) - expect(big.isHalted).toBe(false) - const small = runSimulation(d(1)) - expect(small.outputLines).toEqual([]) - expect(small.isHalted).toBe(false) - expect(small.message).toBe('Simulation finished.') - }) - - it('rechnet mit boolean-Variablen', () => { - const loop = makeElement(ElementType.whileSchleife, { - textLines: ['!fertig'], - loopBody: [stmt('i++'), stmt('fertig = i >= 3')], - }) - const state = runSimulation( - doc([ - stmt('int i = 0'), - stmt('boolean fertig = false'), - loop, - stmt('bool gross = i > 2 && fertig'), - stmt('print: "fertig: " + fertig'), - makeElement(ElementType.verzweigung, { - textLines: ['gross == true'], - cases: [ - { name: 'true', elements: [stmt('print: "ja"')] }, - { name: 'false', elements: [stmt('print: "nein"')] }, - ], - }), - stmt('gross = !gross'), - stmt('print: gross'), - ]), - ) - expect(state.isHalted).toBe(false) - expect(state.variables.get('i')).toEqual({ kind: 'int', value: 3 }) - expect(state.outputLines).toEqual(['fertig: true', 'ja', 'false']) - }) - - it('liest boolean ein', () => { - const engine = new SimulationEngine(doc([stmt('input: boolean ok "Okay?"'), stmt('print: ok')])) - engine.step() - expect(engine.state.inputRequest?.valueType).toBe('boolean') - engine.provideInput('vielleicht') - expect(engine.state.inputErrorNotice).toEqual({ kind: 'booleanExpected' }) - engine.provideInput('Wahr') - engine.step() - expect(engine.state.outputLines).toEqual(['true']) - }) - - it('Division durch null meldet einen Fehler', () => { - const engine = new SimulationEngine(doc([stmt('int x = 1 / 0')])) - engine.step() - expect(engine.state.notice).toEqual({ kind: 'divisionByZero' }) - expect(engine.message).toBe('Division by zero.') - expect(engine.state.variables.has('x')).toBe(false) - }) - - it('meldet das Ende nach dem letzten Schritt', () => { - const engine = new SimulationEngine(doc([stmt('int x = 1')])) - engine.step() - expect(engine.message).toBe('Simulation finished.') - }) - - it('gibt ein ganzes Array wie Java als Referenz aus, den Inhalt erst mit Arrays.toString', () => { - const state = runSimulation( - doc([ - stmt('int[] zahlenreihe = {1, 2, 3}'), - stmt('String[] namen = {"Ada", "Bob"}'), - stmt('double[][] t = new double[2][2]'), - stmt('output: zahlenreihe'), - stmt('zahlenreihe[0] = 9'), - stmt('output: "Reihe: " + zahlenreihe'), - stmt('output: namen'), - stmt('output: t'), - stmt('output: Arrays.toString(zahlenreihe)'), - stmt('output: Arrays.toString(namen)'), - stmt('output: Arrays.deepToString(t)'), - stmt('output: Arrays.toString(t)'), - ]), - ) - const [ref, refAgain, names, grid, ...rest] = state.outputLines - expect(ref).toMatch(/^\[I@[0-9a-f]+$/u) - expect(refAgain).toBe('Reihe: ' + ref) - expect(names).toMatch(/^\[Ljava\.lang\.String;@[0-9a-f]+$/u) - expect(grid).toMatch(/^\[\[D@[0-9a-f]+$/u) - expect(rest.slice(0, 3)).toEqual(['[9, 2, 3]', '[Ada, Bob]', '[[0.0, 0.0], [0.0, 0.0]]']) - expect(rest[3]).toMatch(/^\[\[D@[0-9a-f]+, \[D@[0-9a-f]+\]$/u) - // Die Variablentabelle zeigt weiter den Inhalt. - expect(state.variables.get('zahlenreihe')).toEqual({ kind: 'intArray', value: [9, 2, 3] }) - }) - - it('Werte und Arrays', () => { - const state = runSimulation( - doc([ - stmt('double d = 7.0 / 2'), - stmt('int[] a = {3, 4, 5}'), - stmt('a[1] = a[0] * 10'), - stmt('String s = "x"'), - stmt('print: "len=" + a.length + " a=" + Arrays.toString(a) + " d=" + d'), - stmt('d += 1'), - ]), - ) - expect(state.outputLines).toEqual(['len=3 a=[3, 30, 5] d=3.5']) - expect(state.variables.get('d')).toEqual({ kind: 'double', value: 4.5 }) - expect(state.lastTrace).toBe('d = 3.5 + 1.0 -> 4.5') - }) -}) - -describe('Bedingungen', () => { - const branch = (condition: string, setup = ['int a = 5', 'String name = "Anna"']) => - doc([ - ...setup.map(stmt), - makeElement(ElementType.verzweigung, { - textLines: [condition], - cases: [ - { name: 'true', elements: [stmt('print: "ja"')] }, - { name: 'false', elements: [stmt('print: "nein"')] }, - ], - }), - ]) - - const check = (condition: string, expected: boolean) => { - const state = runSimulation(branch(condition)) - expect(state.message === 'Simulation finished.' ? undefined : state.message, condition).toBeUndefined() - expect(state.outputLines, condition).toEqual([expected ? 'ja' : 'nein']) - } - - it('boolesche Operatoren', () => { - check('a > 3 && a < 10', true) - check('a < 3 || a == 5', true) - check('a != 5', false) - }) - - it('String-Vergleiche', () => { - check('name == "Anna"', true) - check('name != "Anna"', false) - check('"Anna" == name', true) - check('name.equals("Anna")', true) - check('!name.equals("Bob")', true) - check('name == "Anna" && a == 5', true) - }) - - it('Operatoren in String-Literalen sind Text', () => { - const state = runSimulation(branch('text == "a && b || c"', ['String text = "a && b || c"'])) - expect(state.outputLines).toEqual(['ja']) - }) - - it('Klammern und Negation', () => { - check('(a < 3 || a == 5) && a > 0', true) - check('(a < 3 || a > 10) && a > 0', false) - check('!(a > 3)', false) - check('!(a > 3 && a < 4)', true) - check('(a + 1) * 2 > 11', true) - check('((a == 5))', true) - }) - - it('Schlüsselwort mit getrennt geklammerten Teilen', () => { - check('if (a > 3) && (a < 10)', true) - check('if (a > 3) && (a > 10)', false) - }) - - it('while-Schleife mit String-Bedingung', () => { - const d = doc([ - stmt('String answer = "nein"'), - stmt('int tries = 0'), - makeElement(ElementType.whileSchleife, { - textLines: ['answer != "ja"'], - loopBody: [stmt('input: answer'), stmt('tries++')], - }), - ]) - expect(runSimulation(d, ['vielleicht', 'ja']).variables.get('tries')).toEqual({ kind: 'int', value: 2 }) - }) - - it('String mit Zahl vergleichen ist ein Fehler', () => { - const state = runSimulation(branch('name == 5')) - expect(state.isHalted).toBe(true) - expect(state.outputLines).toEqual([]) - }) - - it('bleibt beim fehlerhaften Schritt stehen', () => { - const engine = new SimulationEngine(doc([stmt('print: "vorher"'), stmt('int x = 1 / 0'), stmt('print: "danach"')])) - engine.step() - engine.step() - expect(engine.state.isHalted).toBe(true) - expect(engine.canStep).toBe(false) - expect(engine.currentStepPath).toEqual([1]) - expect(engine.message).toBe('Division by zero.') - engine.step() - expect(engine.state.outputLines).toEqual(['vorher']) - expect(engine.message).toBe('Division by zero.') - engine.reset() - expect(engine.state.isHalted).toBe(false) - expect(engine.canStep).toBe(true) - }) - - it('teilt ganze Zahlen wie Java', () => { - const state = runSimulation( - doc([ - stmt('int a = 7'), - stmt('int b = 2'), - stmt('int q = a / b'), - stmt('double d = a / b'), - stmt('double e = a / 2.0'), - stmt('int n = -7 / 2'), - stmt('double[] w = {1.5, 2.5}'), - stmt('print: "q=" + a / b + " d=" + d + " e=" + e + " n=" + n'), - stmt('double m = (w[0] + w[1]) / 2'), - stmt('int k = 10 / 4 * 2'), - ]), - ) - expect(state.variables.get('q')).toEqual({ kind: 'int', value: 3 }) - expect(state.variables.get('d')).toEqual({ kind: 'double', value: 3 }) - expect(state.variables.get('e')).toEqual({ kind: 'double', value: 3.5 }) - expect(state.variables.get('n')).toEqual({ kind: 'int', value: -3 }) - expect(state.outputLines).toEqual(['q=3 d=3.0 e=3.5 n=-3']) - expect(state.variables.get('m')).toEqual({ kind: 'double', value: 2 }) - expect(state.variables.get('k')).toEqual({ kind: 'int', value: 4 }) - }) - - it('rechnet mit mehreren Arrayfächern und erlaubt Leerzeichen im Index des Ziels', () => { - const state = runSimulation(doc([stmt('int[] a = {5, 3, 1}'), stmt('int d = a[0] - a[1]'), stmt('int i = 0'), stmt('a[i + 1] = a[i] + a[i + 2]')])) - expect(state.variables.get('d')).toEqual({ kind: 'int', value: 2 }) - expect(state.variables.get('a')).toEqual({ kind: 'intArray', value: [5, 6, 1] }) - }) - - it('Aussprung verlässt die innerste Schleife', () => { - const jump = makeElement(ElementType.aussprung, { textLines: ['Schleife verlassen'] }) - const document = doc([ - stmt('int summe = 0'), - makeElement(ElementType.endlosschleife, { - loopBody: [ - stmt('input: int zahl "Zahl?"'), - makeElement(ElementType.verzweigung, { - textLines: ['zahl == 0'], - cases: [ - { name: 'true', elements: [jump] }, - { name: 'false', elements: [stmt('summe = summe + zahl')] }, - ], - }), - ], - }), - makeElement(ElementType.forSchleife, { - textLines: ['int i = 0', 'i < 10', 'i++'], - loopBody: [ - makeElement(ElementType.verzweigung, { - textLines: ['i == 2'], - cases: [ - { name: 'true', elements: [jump] }, - { name: 'false', elements: [stmt('ø')] }, - ], - }), - ], - }), - stmt('print: "Summe: " + summe + " i=" + i'), - jump, - stmt('print: "nie"'), - ]) - const state = runSimulation(document, ['3', '4', '0']) - expect(state.outputLines).toEqual(['Summe: 7 i=2']) - expect(state.message).toBe('Simulation finished.') - }) - - it('Aufruf führt das Unterprogramm aus', () => { - const call = (name: string) => makeElement(ElementType.aufruf, { textLines: [name] }) - const titel: VSDocument = { caption: 'zeigeTitel()', elements: [stmt('print: "== Quiz =="'), stmt('int punkte = 0')] } - const zaehlen: VSDocument = { - caption: 'zaehlen', - elements: [ - makeElement(ElementType.whileSchleife, { textLines: ['true'], loopBody: [stmt('punkte++'), makeElement(ElementType.aussprung, {})] }), - stmt('print: "punkte=" + punkte'), - makeElement(ElementType.aussprung, {}), - stmt('print: "nie"'), - ], - } - const subprograms: Record = { zeigetitel: titel, zaehlen } - const engine = new SimulationEngine( - doc([call('zeigeTitel()'), call('zaehlen();'), call('zaehlen()'), call('fehlt()'), stmt('print: "Ende " + punkte')]), - (name) => subprograms[name.toLowerCase()], - ) - const paths: (number[] | undefined)[] = [] - while (engine.canStep) { - engine.step() - paths.push(engine.currentStepPath) - if (engine.state.notice?.kind === 'subprogramNotFound') expect(engine.message).toBe('No open diagram is called fehlt(). The call was skipped.') - } - expect(engine.state.outputLines).toEqual(['== Quiz ==', 'punkte=1', 'punkte=2', 'Ende 2']) - expect(engine.message).toBe('Simulation finished.') - // Im Unterprogramm bleibt der Aufruf-Kasten markiert - expect(paths[0]).toEqual([0]) - }) - - describe('Unterprogramme mit Kopfzeile', () => { - const call = (text: string) => makeElement(ElementType.aufruf, { textLines: [text] }) - const branch = (condition: string, yes: VSElement[], no: VSElement[]) => - makeElement(ElementType.verzweigung, { textLines: [condition], cases: [{ name: 'true', elements: yes }, { name: 'false', elements: no }] }) - const run = (main: VSElement[], subs: VSDocument[], inputs: string[] = []) => { - const engine = new SimulationEngine(doc(main), (name) => subs.find((d) => d.caption.includes(name + '('))) - const remaining = [...inputs] - for (let i = 0; i < 10_000 && (engine.canStep || engine.state.inputRequest); i++) { - if (engine.state.inputRequest) engine.provideInput(remaining.shift()!) - else engine.step() - } - return engine - } - - it('übergibt Werte, gibt mit return zurück und hält Variablen lokal', () => { - const quadrat: VSDocument = { caption: 'int quadrat(int x)', elements: [stmt('int y = x * x'), stmt('return y')] } - const engine = run([stmt('int x = 3'), stmt('int y = 10'), call('int q = quadrat(x + 1)'), stmt('print: x + " " + y + " " + q')], [quadrat]) - expect(engine.state.outputLines).toEqual(['3 10 16']) - expect(engine.state.variables.has('q')).toBe(true) - expect(engine.message).toBe('Simulation finished.') - }) - - it('ruft void-Unterprogramme mit Parametern auf und beendet sie mit return', () => { - const zeige: VSDocument = { - caption: 'void zeigeSumme(int a, int b)', - elements: [branch('a < 0', [stmt('return')], []), stmt('int summe = a + b'), stmt('print: "Summe: " + summe')], - } - const engine = run([call('zeigeSumme(3, 4)'), call('zeigeSumme(-1, 4);'), stmt('print: "Ende"')], [zeige]) - expect(engine.state.outputLines).toEqual(['Summe: 7', 'Ende']) - expect(engine.state.variables.has('summe')).toBe(false) - }) - - it('rechnet rekursiv mit eigenen Variablen je Aufruf', () => { - const fakultaet: VSDocument = { - caption: 'int fakultaet(int n)', - elements: [branch('n <= 1', [stmt('return 1')], [call('int rest = fakultaet(n - 1)'), stmt('return n * rest')])], - } - const engine = run([stmt('input: int n "Zahl?"'), call('int f = fakultaet(n)'), stmt('print: f')], [fakultaet], ['5']) - expect(engine.state.outputLines).toEqual(['120']) - }) - - it('meldet falsche Werte und fehlendes return', () => { - const quadrat: VSDocument = { caption: 'int quadrat(int x)', elements: [stmt('int y = x * x')] } - let engine = run([call('quadrat(1, 2)')], [quadrat]) - expect(engine.state.notice).toEqual({ kind: 'callArguments', text: 'quadrat' }) - engine = run([call('int q = quadrat(2)')], [quadrat]) - expect(engine.state.notice).toEqual({ kind: 'missingReturn', text: 'quadrat' }) - expect(engine.message).toBe('quadrat ended without returning a value with return.') - }) - - it('übergibt Zahlen als Kopie und Arrays als Referenz', () => { - const verdopple: VSDocument = { caption: 'void verdopple(int x)', elements: [stmt('x = x * 2'), stmt('print: "innen: " + x')] } - const leeren: VSDocument = { - caption: 'void leeren(boolean[] reihe)', - elements: [ - makeElement(ElementType.forSchleife, { textLines: ['int i = 0', 'i < reihe.length', 'i++'], loopBody: [stmt('reihe[i] = false')] }), - ], - } - const engine = run( - [ - stmt('int zahl = 5'), - call('verdopple(zahl)'), - stmt('print: "außen: " + zahl'), - stmt('boolean[] saal = {true, false, true}'), - call('leeren(saal)'), - stmt('print: saal[0] + " " + saal[2]'), - ], - [verdopple, leeren], - ) - expect(engine.state.outputLines).toEqual(['innen: 10', 'außen: 5', 'false false']) - expect(engine.state.variables.has('reihe')).toBe(false) - expect(engine.message).toBe('Simulation finished.') - }) - - it('gibt geänderte 2D-Arrays zurück und prüft den Array-Typ', () => { - const verkaufe: VSDocument = { caption: 'void verkaufe(boolean[][] sitze, int r, int p)', elements: [stmt('sitze[r][p] = true')] } - let engine = run([stmt('boolean[][] kino = new boolean[2][3]'), call('verkaufe(kino, 1, 2)'), stmt('print: kino[1][2]')], [verkaufe]) - expect(engine.state.outputLines).toEqual(['true']) - engine = run([stmt('int[] zahlen = {1, 2}'), call('verkaufe(zahlen, 0, 0)')], [verkaufe]) - expect(engine.state.notice?.kind).toBe('invalidExpression') - }) - - it('beendet mit return im Hauptprogramm das Programm', () => { - const engine = run([stmt('print: "a"'), stmt('return'), stmt('print: "b"')], []) - expect(engine.state.outputLines).toEqual(['a']) - expect(engine.message).toBe('Simulation finished.') - }) - }) - - it('bricht ab, wenn sich ein Unterprogramm selbst aufruft', () => { - const self: VSDocument = { caption: 'rekursion', elements: [makeElement(ElementType.aufruf, { textLines: ['rekursion()'] })] } - const engine = new SimulationEngine(self, () => self) - for (let i = 0; i < 1000 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted).toBe(true) - expect(engine.state.notice?.kind).toBe('callTooDeep') - }) -}) - -describe('Zweidimensionale Arrays und boolean-Arrays', () => { - it('legt ein 2D-Array an, schreibt und liest Fächer und kennt beide Längen', () => { - const state = runSimulation( - doc([ - stmt('boolean[][] sitze = new boolean[3][4]'), - stmt('sitze[1][2] = true'), - stmt('int r = 2'), - stmt('sitze[r][r + 1] = !sitze[1][2]'), - stmt('int reihen = sitze.length'), - stmt('int plaetze = sitze[0].length'), - stmt('int[][] t = {{1, 2, 3}, {4, 5, 6}}'), - stmt('t[1][0] = t[0][2] * 10'), - stmt('output: sitze[1][2] + " " + t[1][0] + " " + t[1][2]'), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - expect(state.variables.get('sitze')).toEqual({ - kind: 'grid', - elementType: 'boolean', - value: [ - [false, false, false, false], - [false, false, true, false], - [false, false, false, false], - ], - }) - expect(state.variables.get('reihen')).toEqual({ kind: 'int', value: 3 }) - expect(state.variables.get('plaetze')).toEqual({ kind: 'int', value: 4 }) - expect(state.variables.get('t')).toEqual({ kind: 'grid', elementType: 'int', value: [[1, 2, 3], [30, 5, 6]] }) - expect(state.outputLines).toEqual(['true 30 6']) - }) - - it('zählt freie Plätze mit verschachtelten Schleifen und boolean-Bedingung', () => { - const state = runSimulation( - doc([ - stmt('boolean[][] sitze = {{true, false}, {false, false}}'), - stmt('int frei = 0'), - makeElement(ElementType.forSchleife, { - textLines: ['int r = 0', 'r < sitze.length', 'r++'], - loopBody: [ - makeElement(ElementType.forSchleife, { - textLines: ['int p = 0', 'p < sitze[r].length', 'p++'], - loopBody: [ - makeElement(ElementType.verzweigung, { - textLines: ['!sitze[r][p]'], - cases: [ - { name: 'true', elements: [stmt('frei = frei + 1')] }, - { name: 'false', elements: [stmt('ø')] }, - ], - }), - ], - }), - ], - }), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - expect(state.variables.get('frei')).toEqual({ kind: 'int', value: 3 }) - }) - - it('kennt boolean-Arrays mit einer Dimension', () => { - const state = runSimulation(doc([stmt('boolean[] an = new boolean[3]'), stmt('an[1] = true'), stmt('output: an[1] + " " + an[2]')])) - expect(state.outputLines).toEqual(['true false']) - }) - - it('meldet Fächer außerhalb des 2D-Arrays', () => { - const state = runSimulation(doc([stmt('int[][] t = new int[2][2]'), stmt('t[2][0] = 1')])) - expect(state.notice?.kind).toBe('invalidExpression') - }) -}) - -describe('Zeichenketten', () => { - it('kennt die wichtigsten String-Methoden', () => { - const state = runSimulation( - doc([ - stmt('String wort = "Ziegenbock"'), - stmt('int n = wort.length()'), - stmt('char erster = wort.charAt(0)'), - stmt('char letzter = wort.charAt(wort.length() - 1)'), - stmt('String teil = wort.substring(0, 6)'), - stmt('String rest = wort.substring(6)'), - stmt('int pos = wort.indexOf("bock")'), - stmt('int fehlt = wort.indexOf("x")'), - stmt('String gross = wort.toUpperCase()'), - stmt('boolean hat = wort.contains("gen")'), - stmt('String[] woerter = "Ludwig ist ein Geißbock".split(" ")'), - stmt('output: woerter.length + " " + woerter[3] + " " + wort.substring(0, n - 4) + wort.charAt(1)'), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - const v = (name: string) => state.variables.get(name) - expect(v('n')).toEqual({ kind: 'int', value: 10 }) - expect(v('erster')).toEqual({ kind: 'string', value: 'Z' }) - expect(v('letzter')).toEqual({ kind: 'string', value: 'k' }) - expect(v('teil')).toEqual({ kind: 'string', value: 'Ziegen' }) - expect(v('rest')).toEqual({ kind: 'string', value: 'bock' }) - expect(v('pos')).toEqual({ kind: 'int', value: 6 }) - expect(v('fehlt')).toEqual({ kind: 'int', value: -1 }) - expect(v('gross')).toEqual({ kind: 'string', value: 'ZIEGENBOCK' }) - expect(v('hat')).toEqual({ kind: 'boolean', value: true }) - expect(state.outputLines).toEqual(['4 Geißbock Ziegeni']) - }) - - it('kennt weitere String-Methoden, parseInt, valueOf und Textdateien', () => { - registerTextFile('brief.txt', 'Liebe Ziege,\nder Fuchs hat dich eingesperrt.\nLudwig') - const state = runSimulation( - doc([ - stmt('String wort = "Ziegenbock"'), - stmt('int hinten = wort.lastIndexOf("e")'), - stmt('int ab = wort.indexOf("e", 3)'), - stmt('boolean leer = "".isEmpty()'), - stmt('boolean gleich = wort.equalsIgnoreCase("ZIEGENBOCK")'), - stmt('int vorher = "Anna".compareTo("Ben")'), - stmt('int laenger = "Ab".compareTo("A")'), - stmt('String linie = "-".repeat(4)'), - stmt('String ganz = "Ziegen".concat("bock")'), - stmt('int zahl = Integer.parseInt("41") + 1'), - stmt('double haelfte = Double.parseDouble("7") / 2'), - stmt('String text = String.valueOf(zahl) + "!"'), - stmt('String brief = Files.readString(Path.of("brief.txt"))'), - stmt('String[] zeilen = brief.split("\\n")'), - stmt('output: zeilen.length + " " + zeilen[2].toUpperCase() + " " + brief.indexOf("Fuchs")'), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - const v = (name: string) => state.variables.get(name) - expect(v('hinten')).toEqual({ kind: 'int', value: 4 }) - expect(v('ab')).toEqual({ kind: 'int', value: 4 }) - expect(v('leer')).toEqual({ kind: 'boolean', value: true }) - expect(v('gleich')).toEqual({ kind: 'boolean', value: true }) - expect(v('vorher')).toEqual({ kind: 'int', value: -1 }) - expect(v('laenger')).toEqual({ kind: 'int', value: 1 }) - expect(v('linie')).toEqual({ kind: 'string', value: '----' }) - expect(v('ganz')).toEqual({ kind: 'string', value: 'Ziegenbock' }) - expect(v('zahl')).toEqual({ kind: 'int', value: 42 }) - expect(v('haelfte')).toEqual({ kind: 'double', value: 3.5 }) - expect(v('text')).toEqual({ kind: 'string', value: '42!' }) - expect(state.outputLines).toEqual(['3 LUDWIG 17']) - }) - - it('addiert in einer Ausgabe wie Java erst die Zahlen und hängt ab dem ersten Text an', () => { - const state = runSimulation(doc([stmt('int a = 7'), stmt('double b = 0.5'), stmt('output: a + 1'), stmt('output: a + b + "!"'), stmt('output: "a = " + a + 1')])) - expect(state.outputLines).toEqual(['8', '7.5!', 'a = 71']) - }) - - it('meldet eine Datei, die es nicht gibt, und Text, der keine Zahl ist', () => { - expect(runSimulation(doc([stmt('String t = Files.readString(Path.of("gibtsnicht.txt"))')])).notice).toEqual({ kind: 'fileNotFound', text: 'gibtsnicht.txt' }) - expect(runSimulation(doc([stmt('int n = Integer.parseInt("zwölf")')])).notice?.kind).toBe('wholeNumberExpected') - }) - - it('liest Dateien mit Scanner und BufferedReader und schreibt sie erst beim close()', () => { - registerTextFile('vorrat.txt', 'Heu\nÄpfel') - const state = runSimulation( - doc([ - stmt('Scanner datei = new Scanner(new File("vorrat.txt"))'), - stmt('PrintWriter aus = new PrintWriter("kopie.txt")'), - makeElement(ElementType.whileSchleife, { textLines: ['datei.hasNextLine()'], loopBody: [stmt('aus.println(datei.nextLine())')] }), - stmt('aus.println("Kuchen")'), - stmt('datei.close()'), - stmt('output: "vorher: " + "x"'), - stmt('aus.close()'), - stmt('BufferedReader leser = new BufferedReader(new FileReader("kopie.txt"))'), - stmt('String zeile = leser.readLine()'), - makeElement(ElementType.whileSchleife, { textLines: ['zeile != null'], loopBody: [stmt('output: zeile'), stmt('zeile = leser.readLine()')] }), - stmt('leser.close()'), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - expect(state.outputLines).toEqual(['vorher: x', 'Heu', 'Äpfel', 'Kuchen']) - expect(state.files.get('kopie.txt')).toBe('Heu\nÄpfel\nKuchen\n') - }) - - it('setzt Texte mit \\" wie Java zusammen (JSON schreiben)', () => { - const state = runSimulation(doc([stmt('String name = "Zora"'), stmt('String eintrag = "{\\"name\\": \\"" + name + "\\"}"'), stmt('output: eintrag')])) - expect(state.outputLines).toEqual(['{"name": "Zora"}']) - }) - - it('rechnet wie Java mit Zeichencodes: (int), (char) und Zeichenliterale', () => { - const state = runSimulation( - doc([ - stmt('String wort = "XYZ"'), - stmt('int code = (int) wort.charAt(0)'), - stmt("char c = 'B'"), - stmt("int abstand = c - 'A'"), - stmt('char neu = (char) ((code - 65 + 3) % 26 + 65)'), - stmt('output: "Geheim: " + (char) (code + 1) + neu'), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - expect(state.variables.get('code')).toEqual({ kind: 'int', value: 88 }) - expect(state.variables.get('abstand')).toEqual({ kind: 'int', value: 1 }) - expect(state.variables.get('neu')).toEqual({ kind: 'string', value: 'A' }) - expect(state.outputLines).toEqual(['Geheim: YA']) - }) - - it('vergleicht Zeichen in einer Schleife', () => { - const state = runSimulation( - doc([ - stmt('String wort = "Kaffee"'), - stmt('int anzahl = 0'), - makeElement(ElementType.forSchleife, { - textLines: ['int i = 0', 'i < wort.length()', 'i++'], - loopBody: [ - makeElement(ElementType.verzweigung, { - textLines: ["wort.charAt(i) == 'e'"], - cases: [ - { name: 'true', elements: [stmt('anzahl = anzahl + 1')] }, - { name: 'false', elements: [stmt('ø')] }, - ], - }), - ], - }), - ]), - ) - expect(state.notice).toEqual({ kind: 'finished' }) - expect(state.variables.get('anzahl')).toEqual({ kind: 'int', value: 2 }) - }) - - it('meldet charAt außerhalb des Worts', () => { - const state = runSimulation(doc([stmt('String w = "abc"'), stmt('char c = w.charAt(3)')])) - expect(state.notice?.kind).toBe('invalidExpression') - }) -}) - -describe('Pseudocode', () => { - const lesson = (name: string) => decodeDocument(readFileSync(join(__dirname, '..', 'lessons', 'diagramme', name), 'utf8')) - - it('geht die Kästen von Lektion 1 ohne Fehler durch', () => { - for (const name of ['l1-tee.visustruct', 'l1-sequenz.visustruct', 'l1-grundbausteine.visustruct']) { - const state = runSimulation(lesson(name), ['true', 'false', 'false', 'false']) - expect(state.notice?.kind, name).toBe('finished') - } - expect(runSimulation(lesson('l1-tee.visustruct')).lastTrace).toBe('Teebeutel herausnehmen') - }) - - it('fragt bei einer Bedingung nach dem Weg', () => { - const branch = makeElement(ElementType.verzweigung, { - textLines: ['Regnet es?'], - cases: [ - { name: 'true', elements: [stmt('Schirm mitnehmen')] }, - { name: 'false', elements: [stmt('Sonnenbrille aufsetzen')] }, - ], - }) - const engine = new SimulationEngine({ caption: '', elements: [branch, stmt('Losgehen')], pseudocode: true }) - engine.step() - expect(engine.state.inputRequest?.prompt).toBe('Regnet es? (true/false)') - engine.provideInput('vielleicht') - expect(engine.state.inputErrorNotice?.kind).toBe('booleanExpected') - engine.provideInput('nein') - engine.step() - expect(engine.state.lastTrace).toBe('Sonnenbrille aufsetzen') - engine.step() - expect(engine.message).toBe('Simulation finished.') - }) - - it('wiederholt, solange man true antwortet', () => { - const loop = makeElement(ElementType.whileSchleife, { textLines: ['Teller nicht leer?'] }) - loop.loopBody = [stmt('Einen Bissen essen')] - const state = runSimulation({ caption: '', elements: [loop], pseudocode: true }, ['ja', 'ja', 'nein']) - expect(state.notice?.kind).toBe('finished') - expect(state.lastTrace).toBe('Teller nicht leer? -> false') - }) -}) diff --git a/web/test/site.test.ts b/web/test/site.test.ts deleted file mode 100644 index ee4c931a..00000000 --- a/web/test/site.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { hostWorld, siteLanguage, visucodeURL, worldHomeURL } from '../src/ui/site' - -describe('Webseiten auf visucode.de', () => { - it('erkennt die Welt an der Subdomain', () => { - expect(hostWorld('visubot.visucode.de')).toBe('visubot') - expect(hostWorld('VisuStruct.visucode.de')).toBe('visustruct') - expect(hostWorld('visuobject.visucode.de')).toBe('visuobject') - expect(hostWorld('visucode.de')).toBeUndefined() - expect(hostWorld('localhost')).toBeUndefined() - expect(hostWorld('visubot.visucode.de.example.com')).toBeUndefined() - }) - - it('nimmt de, en oder pt als Sprachordner', () => { - expect(siteLanguage('de')).toBe('de') - expect(siteLanguage('pt-PT')).toBe('pt') - expect(siteLanguage('fr')).toBe('en') - }) - - it('verlinkt die Startseite relativ nur auf der eigenen Subdomain', () => { - const bot = { hostname: 'visubot.visucode.de', pathname: '/app/index.html' } - expect(worldHomeURL('visubot', 'de', undefined, bot)).toBe('../de/index.html') - expect(worldHomeURL('visubot', 'pt-PT', 'privacy', bot)).toBe('../pt/index.html#privacy') - expect(worldHomeURL('visustruct', 'de', 'contact', bot)).toBe('https://visustruct.visucode.de/de/#contact') - const preview = { hostname: 'localhost', pathname: '/' } - expect(worldHomeURL('visuobject', 'en', undefined, preview)).toBe('https://visuobject.visucode.de/en/') - }) -}) - -describe('visucodeURL', () => { - it('führt auf visucode.de in der Sprache der App', () => { - expect(visucodeURL('de')).toBe('https://visucode.de/') - expect(visucodeURL('en')).toBe('https://visucode.de/en/') - expect(visucodeURL('pt-PT')).toBe('https://visucode.de/pt/') - expect(visucodeURL('fr')).toBe('https://visucode.de/en/') - }) -}) diff --git a/web/test/umlNotes.test.ts b/web/test/umlNotes.test.ts deleted file mode 100644 index ff158464..00000000 --- a/web/test/umlNotes.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { exampleProject, notesFromJSON, projectFromJSON, projectToJSON } from '../src/core/javaProject' -import { projectFromZip, projectToZip } from '../src/ui/projectZip' - -describe('Notizen im Klassendiagramm', () => { - const notes = [{ id: 'n1', text: 'Oberklasse\naller Tiere', x: 300, y: 40, attach: ['Tier'] }] - it('bleiben beim Speichern als JSON und ZIP erhalten', () => { - const project = { ...exampleProject(), notes } - expect(projectFromJSON(projectToJSON(project))?.notes).toEqual(notes) - expect(projectFromZip(projectToZip(project), 'x').notes).toEqual(notes) - }) - it('lässt kaputte Einträge weg', () => { - expect(notesFromJSON([{ id: 'a', text: 'ok', x: 1, y: 2 }, { id: 'b' }, null, 'x'])).toEqual([{ id: 'a', text: 'ok', x: 1, y: 2 }]) - expect(notesFromJSON({})).toBeUndefined() - }) -}) diff --git a/web/test/umlRelations.test.ts b/web/test/umlRelations.test.ts deleted file mode 100644 index 2c71e3cb..00000000 --- a/web/test/umlRelations.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { addInterface, parseClasses, removeInterface, setFieldType } from '../src/core/classModel' -import { associations, ensureImport, fieldNameFor, isMany, renameInfo, withInfo } from '../src/core/umlRelations' - -const code = `class Besitzer { - private ArrayList hunde = new ArrayList<>(); -} -class Hund { - private Besitzer besitzer; - private String name; -} -interface Laut {} -class Katze {} -` - -describe('umlRelations', () => { - it('erkennt viele an der Obergrenze', () => { - expect(['1', '0..1'].map(isMany)).toEqual([false, false]) - expect(['*', '0..*', '1..*', '2', '1..n'].map(isMany)).toEqual([true, true, true, true, true]) - }) - - it('macht aus zwei Attributen, die aufeinander zeigen, eine Linie mit zwei Pfeilen', () => { - const [r, ...rest] = associations(parseClasses(code)) - expect(rest).toEqual([]) - expect(r).toMatchObject({ from: 'Besitzer', to: 'Hund', role: 'hunde', multiplicity: '0..*', navFrom: 'navigable', navTo: 'navigable', sourceRole: 'besitzer', sourceMultiplicity: '1' }) - }) - - it('nimmt das Attribut mit UML-Zusatz nach vorne (Raute am Ganzen)', () => { - const [r] = associations(parseClasses(code), { 'Hund.besitzer': { kind: 'composition', multiplicity: '0..1' } }) - expect(r).toMatchObject({ key: 'Hund.besitzer', from: 'Hund', kind: 'composition', multiplicity: '0..1' }) - // Eine Multiplizität, die nicht zum Typ passt, gilt nicht. - const [s] = associations(parseClasses(code), { 'Besitzer.hunde': { name: 'führt aus', multiplicity: '1' } }) - expect(s).toMatchObject({ from: 'Besitzer', name: 'führt aus', multiplicity: '0..*' }) - }) - - it('schreibt UML-Zusatz ohne leere Felder', () => { - let uml = withInfo({}, 'A.b', { kind: 'aggregation', name: '' }) - expect(uml).toEqual({ 'A.b': { kind: 'aggregation' } }) - uml = withInfo(uml, 'A.b', { kind: 'association' }) - expect(uml).toEqual({}) - expect(renameInfo({ 'A.b': { name: 'x' } }, 'A.b', 'A.c')).toEqual({ 'A.c': { name: 'x' } }) - }) - - it('findet freie Attributnamen', () => { - const hund = parseClasses(code).find((c) => c.name === 'Hund')! - expect(fieldNameFor(hund, 'Besitzer', false)).toBe('besitzer2') - expect(fieldNameFor(hund, 'Katze', true)).toBe('katzeListe') - }) - - it('ergänzt Imports nur einmal', () => { - const text = 'package a;\n\nimport java.util.List;\n\npublic class X {}\n' - const once = ensureImport(text, 'b.Y') - expect(once).toBe('package a;\n\nimport java.util.List;\nimport b.Y;\n\npublic class X {}\n') - expect(ensureImport(once, 'b.Y')).toBe(once) - expect(ensureImport('package a;\n\npublic class X {}\n', 'b.Y')).toBe('package a;\n\nimport b.Y;\n\npublic class X {}\n') - }) - - it('ändert implements und den Typ eines Attributs', () => { - const katze = () => parseClasses(source).find((c) => c.name === 'Katze')! - let source = code - source = addInterface(source, katze(), 'Laut') - expect(source).toContain('class Katze implements Laut {}') - source = addInterface(source, katze(), 'Comparable') - expect(source).toContain('class Katze implements Laut, Comparable {}') - source = removeInterface(source, katze(), 'Laut') - expect(source).toContain('class Katze implements Comparable {}') - source = removeInterface(source, katze(), 'Comparable') - expect(source).toContain('class Katze {}') - const hund = parseClasses(code).find((c) => c.name === 'Hund')! - const field = hund.members.find((m) => m.name === 'besitzer')! - expect(setFieldType(code, field, 'ArrayList', 'new ArrayList<>()')).toContain('private ArrayList besitzer = new ArrayList<>();') - const besitzer = parseClasses(code).find((c) => c.name === 'Besitzer')! - expect(setFieldType(code, besitzer.members[0], 'Hund')).toContain(' private Hund hunde;\n') - }) -}) - -describe('dependencies', () => { - it('new in einer Methode ist «create», ein Parameter «use», ein Attribut keine Abhängigkeit', async () => { - const { parseClasses } = await import('../src/core/classModel') - const { dependencies } = await import('../src/core/umlRelations') - const texts: Record = { - Spielstarter: 'public class Spielstarter {\n public static void main(String[] args) {\n Ratespiel spiel = new Ratespiel();\n // new Punkte() zählt nicht\n }\n}\n', - Ratespiel: 'public class Ratespiel {\n private Punkte punkte;\n public void zeige(Anzeige a) {\n }\n}\n', - Punkte: 'public class Punkte {\n}\n', - Anzeige: 'public class Anzeige {\n}\n', - } - const classes = Object.values(texts).flatMap((x) => parseClasses(x)) - const deps = dependencies(classes, (c) => texts[c.name]) - expect(deps).toEqual([ - { from: 'Spielstarter', to: 'Ratespiel', kind: 'create', methods: ['main()'] }, - { from: 'Ratespiel', to: 'Anzeige', kind: 'use', methods: ['zeige()'] }, - ]) - }) -}) diff --git a/web/test/visubotLessons.test.ts b/web/test/visubotLessons.test.ts deleted file mode 100644 index a6b867f2..00000000 --- a/web/test/visubotLessons.test.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { checkExercise, loopDepth, usedElementTypes } from '../src/core/exerciseCheck' -import { ElementType } from '../src/core/model' -import { diagram, lessons, reference, tasks, useContentLanguage, useVisuBotContent, world } from '../src/learn/content' -import type { Block, Exercise } from '../src/learn/lessonFormat' -import { subprogramName } from '../src/core/simulation' -import type { LiveLabels } from '../src/core/codeGenerator' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava, plainLiveJava } from '../src/core/liveSource' -import { isMBotPart, MBOT_PARTS } from '../src/core/mbot' - -/** Unterprogramme einer Übung (`unterprogramm:`) für Aufrufe in der Musterlösung */ -import { lessonEndProblems } from './lessonEnd' -const resolver = (ex: Exercise) => { - const subs = ex.subprograms.map((f) => diagram(f)!) - return (name: string) => subs.find((s) => subprogramName(s.caption).toLowerCase() === subprogramName(name).toLowerCase()) -} - -const robotLessons = () => lessons.filter((l) => l.robot) - -const allBlocks = (): { where: string; block: Block }[] => [ - ...robotLessons().flatMap((l) => l.steps.flatMap((s) => s.blocks.map((block) => ({ where: `${l.id} / ${s.title}`, block })))), - ...tasks.filter((t) => t.robot).flatMap((t) => t.blocks.map((block) => ({ where: t.id, block }))), -] - -describe.each(['de', 'en'] as const)('VisuBot-Lektionen (%s)', (lang) => { - beforeAll(() => { - useVisuBotContent('on') - useContentLanguage(lang) - }) - afterAll(() => useVisuBotContent('off')) - - it('zeigt nur die Roboter-Lektionen und -Aufgaben, lückenlos nummeriert, in Teilen', () => { - expect(lessons.length).toBeGreaterThanOrEqual(33) - expect(lessons.every((l) => l.robot)).toBe(true) - lessons.forEach((l, i) => { - expect(l.number, l.id).toBe(i + 1) - expect(l.section, l.id).not.toBe('VisuBot') - }) - // vier Teile plus der Ausblick „Wie geht es weiter?“ ganz am Ende - expect(new Set(lessons.map((l) => l.section)).size).toBe(5) - expect(lessons[lessons.length - 1].id).toBe('23-wie-geht-es-weiter') - // die neue Lektion „Und, oder, nicht“ steht nach der Linie, ohne dass Dateien umbenannt werden - const at = (id: string) => lessons.findIndex((l) => l.id === id) - expect(at('07-und-oder')).toBe(at('07-linie') + 1) - expect(at('08-farben')).toBe(at('07-und-oder') + 1) - // Einstieg vorn, Testen nach den Variablen, do-while nach der While-Schleife, break nach den Tasten - expect(at('00-struktogramm-und-editor')).toBe(0) - // PAP und Pseudocode direkt nach dem Quadrat - expect(at('02-quadrat-als-pap')).toBe(at('02-das-quadrat') + 1) - expect(at('03-zeile-fuer-zeile-testen')).toBe(at('03-variablen-und-ausgabe') + 1) - expect(at('05-erst-fahren-dann-pruefen')).toBe(at('05-bis-zur-wand') + 1) - expect(at('10-unterbrechen-mit-break')).toBe(at('10-tasten-joystick') + 1) - // Grundlagen kleinschrittig: Zählen, Konstanten, else if, Maximum, Merker, Zustände - expect(at('05-zaehlen-und-summieren')).toBe(at('05-erst-fahren-dann-pruefen') + 1) - expect(at('06-konstanten-final')).toBe(at('06-abstand') + 1) - expect(at('06-nah-mittel-weit')).toBe(at('06-konstanten-final') + 1) - expect(at('08-groesster-wert')).toBe(at('08-farben') + 1) - expect(at('11-merker-boolean')).toBe(at('11-licht') + 1) - expect(at('21-zustaende')).toBe(at('21-stoppuhr-akku') + 1) - expect(tasks.length).toBeGreaterThanOrEqual(16) - expect(tasks.every((t) => t.robot)).toBe(true) - for (const t of tasks) if (t.after !== undefined) expect(lessons.some((l) => l.number === t.after), t.id).toBe(true) - }) - - it('Verweise auf VisuStruct zeigen auf vorhandene Lektionen', () => { - const targets = lessons.flatMap((l) => [...JSON.stringify(l.steps).matchAll(/\?visustruct&lektion=([\w-]+)/g)].map((m) => ({ lesson: l.id, target: m[1] }))) - expect(targets.length).toBeGreaterThanOrEqual(9) - useVisuBotContent('off') - const ids = new Set(lessons.map((l) => l.id)) - useVisuBotContent('on') - for (const { lesson, target } of targets) expect(ids.has(target), `${lesson} → ${target}`).toBe(true) - }) - - it('Verweise auf Lektionen zeigen auf die neue Nummer', () => { - const quadrat = lessons.find((l) => l.id === '02-das-quadrat')! - const tour = lessons.find((l) => l.id === '01-der-mbot2')! - const word = { de: 'Lektion', en: 'Lesson' }[lang] - expect(JSON.stringify(tour.steps).toLowerCase()).toContain(`${word} ${quadrat.number}`.toLowerCase()) - // eingeschobene Lektionen verschieben die Nummern: Motoren (Datei 20) ist Lektion 31 - const motoren = lessons.find((l) => l.id === '20-motoren')! - const sensoren = lessons.find((l) => l.id === '04-sensoren')! - expect(motoren.number).toBe(31) - expect(JSON.stringify(sensoren.steps).toLowerCase()).toContain(`${word} ${motoren.number}`.toLowerCase()) - }) - - it('jede Übung prüft eine Fahrt (ohne Roboter: eine Ausgabe), und die Musterlösung besteht sie', () => { - let checked = 0 - for (const { where, block } of allBlocks()) { - if (block.kind !== 'exercise') continue - const ex = block.exercise - expect(ex.id.startsWith('vb-'), `${where}: Kennung beginnt mit vb-`).toBe(true) - const robot = ex.tests.some((t) => t.drive || t.world || t.sensors || t.actions) - const doc = diagram(ex.solution!)! - expect(doc, `${where}: ${ex.solution}`).toBeDefined() - expect(robot, `${where}: fahrt:, befehle:, welt: oder messwerte:`).toBe(true) - expect(ex.hints.length).toBeGreaterThanOrEqual(2) - for (const o of checkExercise(doc, ex.tests, resolver(ex), world)) expect(o.passed, `${where}: ${JSON.stringify(o.result)}`).toBe(true) - for (const r of ex.requires) expect(usedElementTypes(doc).has(ElementType[r as keyof typeof ElementType])).toBe(true) - if (ex.loopDepth) expect(loopDepth(doc.elements)).toBeGreaterThanOrEqual(ex.loopDepth) - expect(checkExercise({ caption: '', elements: [] }, ex.tests, undefined, world).every((o) => o.passed)).toBe(false) - checked++ - } - expect(checked).toBeGreaterThanOrEqual(5) - }) - - it('Java-Übungen (code: java) lassen sich in Java tippen und bestehen', () => { - const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } - let checked = 0 - for (const { where, block } of allBlocks()) { - if (block.kind !== 'exercise' || block.exercise.code !== 'java') continue - const parsed = parseLiveJava(plainLiveJava(diagram(block.exercise.solution!)!, labels), labels) - expect(parsed.problems, where).toEqual([]) - const doc = documentFromJava({ caption: '', elements: [] }, parsed) - for (const o of checkExercise(doc, block.exercise.tests, undefined, world)) expect(o.passed, `${where}: ${JSON.stringify(o.result)}`).toBe(true) - checked++ - } - expect(checked).toBeGreaterThanOrEqual(20) - }) - - it('ab Lektion 4 hat jede Roboter-Lektion eine Übung „Warum läuft das nicht?“, deren Start die Tests nicht besteht', () => { - for (const l of robotLessons().filter((l) => Number(/^\d+/.exec(l.id)![0]) >= 4)) { - const blocks = l.steps.flatMap((s) => s.blocks) - const ex = blocks.find((b) => b.kind === 'exercise' && b.exercise.id === `vb-fehler-${l.id}`) - expect(ex, l.id).toBeDefined() - } - for (const { where, block } of allBlocks()) { - if (block.kind !== 'exercise' || !block.exercise.start) continue - const start = diagram(block.exercise.start) - expect(start, `${where}: ${block.exercise.start}`).toBeDefined() - expect(checkExercise(start!, block.exercise.tests, resolver(block.exercise), world).every((o) => o.passed), where).toBe(false) - } - }) - - it('jede Roboter-Lektion hat mindestens ein Spiel, und es steht vor der Checkliste', () => { - for (const lesson of robotLessons()) { - const kinds = lesson.steps.flatMap((s) => s.blocks.map((b) => b.kind)) - const game = kinds.findIndex((k) => k === 'game' || k === 'roundGame' || k === 'rescueGame' || k === 'driveGame' || k === 'crosswordGame') - expect(game, `${lesson.id}: kein Spiel`).toBeGreaterThanOrEqual(0) - expect(game, `${lesson.id}: Spiel nach der Checkliste`).toBeLessThan(kinds.indexOf('checklist')) - } - }) - - it('jede Roboter-Lektion endet mit eigenen Schritten für Checkliste und Wissenstest', () => { - expect(robotLessons().flatMap(lessonEndProblems)).toEqual([]) - }) - - it('Checklisten verweisen auf Schritte', () => { - for (const l of robotLessons()) - for (const s of l.steps) - for (const b of s.blocks) if (b.kind === 'checklist') for (const item of b.items) expect(item.step, `${l.id}: ${item.text}`).toBeDefined() - }) - - it('Lektion 1 ist eine Tour durch alle Teile, jedes gezeigte Teil ist im Text verlinkt', () => { - const tour = robotLessons().find((l) => l.id === '01-der-mbot2')! - const blocks = tour.steps.flatMap((s) => s.blocks) - const shown = new Set(blocks.flatMap((b) => (b.kind === 'robotModel' ? b.focus : b.kind === 'robotQuiz' ? b.tasks.map((t) => t.part) : []))) - expect([...shown].sort()).toEqual([...MBOT_PARTS].sort()) - expect(blocks.some((b) => b.kind === 'robotQuiz')).toBe(true) - for (const step of tour.steps) { - const text = JSON.stringify(step.blocks) - const linked = new Set([...text.matchAll(/\{(?:teil|part)=([\w,]+)\}/g)].flatMap((m) => m[1].split(','))) - for (const b of step.blocks) if (b.kind === 'robotModel') for (const p of b.focus) expect(linked, `${step.title}: ${p}`).toContain(p) - for (const p of linked) expect(isMBotPart(p), `${step.title}: ${p}`).toBe(true) - } - }) -}) - -describe.each(['de', 'en'] as const)('VisuStruct ohne Roboter, VisuBot nur mit Roboter (%s)', (lang) => { - const robotTasks = ['treppe', 'labyrinth', 'knight-rider', 'morsen'] - beforeAll(() => useContentLanguage(lang)) - afterAll(() => useVisuBotContent('off')) - - it('VisuStruct zeigt keine Roboter-Lektionen, -Aufgaben oder -Befehle', () => { - useVisuBotContent('off') - expect(lessons.length).toBeGreaterThanOrEqual(40) - expect(lessons.some((l) => l.section === 'VisuBot' || l.steps.some((s) => s.title.includes('🤖')))).toBe(false) - expect(tasks.some((t) => robotTasks.includes(t.id))).toBe(false) - expect(reference).not.toContain('mBot2') - }) - - it('VisuBot zeigt nur Roboter-Lektionen und -Aufgaben, Nachschlagen mit den mBot2-Kategorien', () => { - useVisuBotContent('on') - expect(lessons.filter((l) => l.robot).length).toBeGreaterThanOrEqual(33) - expect(lessons.filter((l) => !l.robot)).toEqual([]) - expect(tasks.map((t) => t.id)).toEqual(expect.arrayContaining(robotTasks)) - expect(tasks.filter((t) => !t.robot)).toEqual([]) - expect(reference).toContain('## 🤖 mBot2') - expect(reference).toContain('## 📡 mBot2') - expect(reference).toContain('### ' + { de: 'Verzweigung', en: 'Branch' }[lang]) - }) -}) diff --git a/web/test/visubotSensors.test.ts b/web/test/visubotSensors.test.ts deleted file mode 100644 index 074366f6..00000000 --- a/web/test/visubotSensors.test.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { describe, expect, it } from 'vitest' -import type { LiveLabels } from '../src/core/codeGenerator' -import { checkExercise } from '../src/core/exerciseCheck' -import { parseLiveJava } from '../src/core/javaParser' -import { documentFromJava } from '../src/core/liveSource' -import { actionSignature, mbotColorName, parseActionSpec, setMBotColorLanguage, usedMBotSensors } from '../src/core/mbot' -import { parseWorldMap, RobotWorld } from '../src/core/robotWorld' -import { SimulationEngine } from '../src/core/simulation' -import { parseSensorTest } from '../src/learn/lessonFormat' - -const labels: LiveLabels = { condition: 'Bedingung', selector: 'Wert', code: 'Dein Code', start: 'Startwert', step: 'Schritt', end: 'Ende' } -const main = (body: string) => `public class Main {\n public static void main(String[] args) {\n${body}\n }\n}` -const docOf = (java: string) => { - const parsed = parseLiveJava(java, labels, {}) - expect(parsed.problems).toEqual([]) - return documentFromJava({ caption: '', elements: [] }, parsed) -} - -function run(java: string, sensors: Record = {}) { - const engine = new SimulationEngine(docOf(java)) - engine.robotSensors = sensors - for (let i = 0; i < 1000 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted, engine.message).toBe(false) - return engine.state -} - -describe('mBot2-Sensoren', () => { - it('liest Wahrheitswerte wie Taste A in Bedingungen', () => { - const code = main(' if (mbot.isButtonA()) {\n mbot.forward();\n } else {\n mbot.turnRight();\n }') - expect(run(code, { isButtonA: true }).robotActions.map((a) => a.method)).toEqual(['forward']) - expect(run(code).robotActions.map((a) => a.method)).toEqual(['turnRight']) - const negated = main(' if (!mbot.isButtonB() && mbot.getBrightness() < 30) {\n mbot.setLed(255, 255, 255);\n }') - expect(run(negated, { getBrightness: 10 }).robotActions.map((a) => a.method)).toEqual(['setLed']) - expect(run(negated, { getBrightness: 10, isButtonB: true }).robotActions).toEqual([]) - }) - - it('speichert einen Sensorwert in einer boolean-Variable', () => { - const state = run(main(' boolean laut = mbot.getLoudness() > 50;\n boolean rot = mbot.getColor().equals("red");\n System.out.println(laut);\n System.out.println(rot);'), { getLoudness: 80, getColor: 'red' }) - expect(state.outputLines).toEqual(['true', 'true']) - }) - - it('liefert die Farbe als Text in der Sprache der Lektionen', () => { - const code = main(' String farbe = mbot.getColor();\n System.out.println(farbe);\n if (!mbot.getColor().equals("rot")) {\n mbot.forward();\n }') - setMBotColorLanguage('de') - try { - expect(run(code, { getColor: 'red' }).outputLines).toEqual(['rot']) - expect(run(code, { getColor: 'red' }).robotActions).toEqual([]) - // Messwerte in Lektionen dürfen deutsch oder englisch sein, der echte Sensor antwortet englisch - expect(run(code, { getColor: 'weiß' }).robotActions.map((a) => a.method)).toEqual(['forward']) - expect(mbotColorName('green')).toBe('grün') - } finally { - setMBotColorLanguage('en') - } - expect(run(code, { getColor: 'rot' }).outputLines).toEqual(['red']) - expect(parseSensorTest('getColor=rot/weiß -> none').sensors).toEqual({ getColor: ['rot', 'weiß'] }) - }) - - it('findet die benutzten Sensoren', () => { - expect(usedMBotSensors('if (mbot.getColor().equals("rot") || mbot.getPitch() > 20) mbot.forward(); mbot.getColor()').sort()).toEqual(['getColor', 'getPitch']) - }) - - it('erkennt farbige Felder unter dem Sensor', () => { - const world = new RobotWorld(parseWorldMap('...\n.r.\n...\n.^.')) - expect(world.sensors().getColor).toBe('white') - world.drive(10) - expect(world.colorUnder()).toBe('red') - expect(world.sensors()).toMatchObject({ getColor: 'red', getLine: 0 }) - expect(new RobotWorld(parseWorldMap('...\n.x.\n...\n.^.')).sensors().getColor).toBe('white') - }) - - it('prüft Übungen mit Messwerten, auch nacheinander', () => { - const wait = docOf(main(' while (mbot.getLoudness() < 50) {\n mbot.pause(100);\n }\n mbot.forward(30);')) - const test = parseSensorTest('getLoudness=0/80 -> forward 30') - expect(checkExercise(wait, [test])[0].passed).toBe(true) - const light = docOf(main(' if (mbot.getBrightness() < 30) {\n mbot.setLed(255, 255, 255);\n } else {\n mbot.ledOff();\n }')) - const tests = [parseSensorTest('getBrightness=10 -> ledOn, none'), parseSensorTest('getBrightness=80 -> ledOff')] - expect(checkExercise(light, tests).map((o) => o.passed)).toEqual([true, true]) - expect(checkExercise(light, [parseSensorTest('getBrightness=80 -> ledOn')])[0].passed).toBe(false) - expect(() => parseSensorTest('getFoo=1 -> forward')).toThrow() - }) - - it('zeigt Text mit Zahlen und Sensorwerten auf dem Bildschirm', () => { - const state = run(main(' int i = 3;\n mbot.showText("Abstand: " + mbot.getDistance());\n mbot.showText(i);'), { getDistance: 42 }) - expect(state.robotActions.map((a) => a.text)).toEqual(['Abstand: 42', '3']) - expect(state.robotActions[0].python).toBe(`exec("cyberpi.display.clear(); cyberpi.display.show_label(\\"Abstand: 42\\", 24, 'center')")`) - expect(actionSignature(state.robotActions)).toEqual(['showText "Abstand: 42"', 'showText "3"']) - }) - - it('zeigt Gefühle und lehnt unbekannte ab', () => { - const state = run(main(' mbot.emotion("smile");')) - expect(state.robotActions[0].python).toBe('cyberpi.emotion.smile()') - expect(actionSignature(state.robotActions)).toEqual(['emotion "smile"']) - const engine = new SimulationEngine(docOf(main(' mbot.emotion("tanzen");'))) - for (let i = 0; i < 10 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted).toBe(true) - }) - - it('steuert einzelne LEDs 0–4 mit Farbnamen und lehnt andere ab', () => { - const state = run(main(' for (int i = 0; i < 5; i++) {\n mbot.led(i).setColor("rot");\n }\n mbot.led(2).setColor("aus");\n mbot.led(4).setColor("blue");')) - expect(state.robotActions[0].python).toBe('cyberpi.led.on(255, 0, 0, id=1)') - expect(state.robotActions[5].python).toBe('cyberpi.led.on(0, 0, 0, id=3)') - expect(actionSignature(state.robotActions.slice(5))).toEqual(['ledColor 2 "aus"', 'ledColor 4 "blue"']) - const world = new RobotWorld() - for (const a of state.robotActions) world.apply(a) - expect(world.leds).toEqual([[255, 0, 0], [255, 0, 0], undefined, [255, 0, 0], [0, 0, 255]]) - world.apply({ method: 'ledOff', args: [], label: '' }) - expect(world.leds.every((l) => l === undefined)).toBe(true) - expect(parseActionSpec('ledColor 1 "grün", pause 100, ledColor 1 "aus"')).toEqual(['ledColor 1 "grün"', 'pause 100', 'ledColor 1 "aus"']) - expect(() => parseActionSpec('ledColor 5 "rot"')).toThrow() - for (const wrong of ['mbot.led(5).setColor("rot");', 'mbot.led(0).setColor("kariert");']) { - const engine = new SimulationEngine(docOf(main(` ${wrong}`))) - for (let i = 0; i < 10 && engine.canStep; i++) engine.step() - expect(engine.state.isHalted, wrong).toBe(true) - } - }) - - it('liest erwartete Befehle mit Wiederholung und Text', () => { - expect(parseActionSpec('2 x (setLed 0 0 255, pause 500), showText "Los, los!"')).toEqual(['setLed 0 0 255', 'pause 500', 'setLed 0 0 255', 'pause 500', 'showText "Los, los!"']) - expect(() => parseActionSpec('setLed 1 2')).toThrow() - }) -}) - -describe('mBot2-Motoren mit Geschwindigkeit', () => { - it('fährt mit drive weiter, bis stop kommt, und lenkt mit verschiedenen Rädern', () => { - const world = new RobotWorld() - world.apply({ method: 'drive', args: [50, 50], label: '' }) - world.tick(1000) - expect(world.pose.y).toBeCloseTo(10) - world.apply({ method: 'stop', args: [], label: '' }) - world.tick(1000) - expect(world.pose.y).toBeCloseTo(10) - world.apply({ method: 'drive', args: [10, 40], label: '' }) - world.tick(500) - expect(world.pose.heading).toBeGreaterThan(180) // nach links gedreht - expect(world.timer).toBe(2.5) - world.apply({ method: 'resetTimer', args: [], label: '' }) - expect(world.timer).toBe(0) - }) - - it('bleibt vor einer Wand stehen und zählt das Anstoßen einmal', () => { - const world = new RobotWorld(parseWorldMap('###\n...\n.^.')) - world.apply({ method: 'drive', args: [100, 100], label: '' }) - world.tick(3000) - expect(world.bumps).toBe(1) - expect(world.distance()).toBeLessThan(2) - }) - - it('liest Linien aus der Weltkarte und meldet die mittleren Fühler', () => { - const setup = parseWorldMap('.....\n.....\n..^..\nlinie: 2,2 2,0') - expect(setup.lines).toHaveLength(1) - const sensors = new RobotWorld(setup).sensors() - expect(sensors.isLineLeft).toBe(true) - expect(sensors.isLineRight).toBe(true) - }) - - it('prüft Bildschirmtext und ob er überhaupt fährt', () => { - const test = parseSensorTest('getBattery=15 -> drives, screen "Akku: 15 %, leer"') - expect(test.screen).toBe('Akku: 15 %, leer') - expect(test.drives).toBe(true) - const doc = docOf(main(' mbot.showText("Akku: " + mbot.getBattery() + " %, leer");\n mbot.forward();')) - expect(checkExercise(doc, [test])[0].passed).toBe(true) - expect(checkExercise(docOf(main(' mbot.showText("Akku");')), [test])[0].passed).toBe(false) - }) -}) diff --git a/web/test/workspace.test.ts b/web/test/workspace.test.ts deleted file mode 100644 index 73301b05..00000000 --- a/web/test/workspace.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { compareEntries, programBaseName, todayFolder, uniqueBaseName, validFolderName } from '../src/core/workspace' - -describe('Workspace', () => { - it('Tagesordner in Ortszeit', () => { - expect(todayFolder(new Date(2026, 9, 23, 23, 30))).toBe('2026-10-23') - expect(todayFolder(new Date(2026, 0, 5))).toBe('2026-01-05') - }) - - it('Ordner vor Dateien, Tage neueste zuerst', () => { - const entries = [ - { kind: 'file', name: 'lernstand.json' }, - { kind: 'directory', name: '2026-10-22' }, - { kind: 'directory', name: '2026-10-23' }, - { kind: 'directory', name: '11FI2' }, - { kind: 'directory', name: '11FI10' }, - ] - expect(entries.sort(compareEntries).map((e) => e.name)).toEqual(['11FI2', '11FI10', '2026-10-23', '2026-10-22', 'lernstand.json']) - }) - - it('Dateiname aus dem Titel', () => { - expect(programBaseName('Rechner', 'Programm')).toBe('Rechner') - expect(programBaseName(' Ja/Nein: Test? ', 'Programm')).toBe('Ja-Nein- Test-') - expect(programBaseName('', 'Programm')).toBe('Programm') - expect(programBaseName('Alt.visustruct', 'Programm')).toBe('Alt') - }) - - it('freier Name für Struktogramm und Code', () => { - expect(uniqueBaseName('Rechner', ['Andere.visustruct'])).toBe('Rechner') - expect(uniqueBaseName('Rechner', ['rechner.visustruct', 'Rechner 2.java'])).toBe('Rechner 3') - }) - - it('Ordnernamen', () => { - expect(validFolderName(' 11FI1 ')).toBe('11FI1') - expect(validFolderName('a/b')).toBe('ab') - expect(validFolderName('..')).toBeUndefined() - expect(validFolderName(' ')).toBeUndefined() - }) -}) diff --git a/web/test/xmlCodec.test.ts b/web/test/xmlCodec.test.ts deleted file mode 100644 index a6832ec3..00000000 --- a/web/test/xmlCodec.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { readdirSync, readFileSync, statSync } from 'node:fs' -import { join, relative } from 'node:path' -import { describe, expect, it } from 'vitest' -import { decodeJavaString, encodeJavaString } from '../src/core/javaStringCoding' -import { decodeDocument, encodeDocument } from '../src/core/xmlCodec' - -const examplesDir = join(__dirname, '..', '..', 'VisuStruct-Dateien') - -function allDiagramFiles(dir: string): string[] { - return readdirSync(dir) - .flatMap((name) => { - const p = join(dir, name) - if (statSync(p).isDirectory()) return allDiagramFiles(p) - return /\.(visustruct|strk)$/.test(name) ? [p] : [] - }) - .sort() -} - -describe('Java-Zeichenkodierung', () => { - it('kodiert wie Java encodeS', () => { - expect(encodeJavaString('')).toBe('-1;') - expect(encodeJavaString('a ä')).toBe('97;32;228;') - expect(encodeJavaString('😀')).toBe('128512;') - }) - it('dekodiert wie Java decodeS', () => { - expect(decodeJavaString('-1;')).toBe('') - expect(decodeJavaString('97;32;228;')).toBe('a ä') - expect(decodeJavaString('128512;')).toBe('😀') - }) -}) - -describe('Beispieldateien aus VisuStruct-Dateien', () => { - const files = allDiagramFiles(examplesDir) - - it('findet Beispieldateien', () => { - expect(files.length).toBeGreaterThan(0) - }) - - for (const file of files) { - const name = relative(examplesDir, file) - it(`${name}: Laden und Speichern ergibt dieselbe Datei wie die Swift-App`, () => { - const original = readFileSync(file, 'utf8') - const doc = decodeDocument(original) - expect(doc.elements.length).toBeGreaterThan(0) - const reencoded = encodeDocument(doc) - // Verlustfrei: erneutes Laden ergibt dasselbe Modell … - expect(decodeDocument(reencoded)).toEqual(doc) - // … und die Bytes entsprechen dem Swift-Encoder (der die Beispieldateien geschrieben hat). - // Unter Windows gespeicherte Dateien haben CRLF; Swift schreibt wie wir LF. - expect(reencoded).toBe(original.replace(/\r\n/g, '\n')) - }) - } -}) - -describe('Pseudocode-Markierung', () => { - it('bleibt beim Speichern erhalten und fehlt sonst', () => { - const marked = { caption: 'Tee', pseudocode: true, elements: [] } - const xml = encodeDocument(marked) - expect(xml).toContain('pseudocode="true"') - expect(decodeDocument(xml).pseudocode).toBe(true) - const plain = encodeDocument({ caption: 'Tee', elements: [] }) - expect(plain).not.toContain('pseudocode') - expect(decodeDocument(plain).pseudocode).toBeUndefined() - }) -}) diff --git a/web/tsconfig.json b/web/tsconfig.json deleted file mode 100644 index 6aaadbd1..00000000 --- a/web/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "skipLibCheck": true, - "types": ["vite/client", "node"] - }, - "include": ["src", "test"] -} diff --git a/web/vite.config.ts b/web/vite.config.ts deleted file mode 100644 index 27eb57af..00000000 --- a/web/vite.config.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { existsSync, readFileSync } from 'node:fs' -import { join } from 'node:path' -import type { Plugin } from 'vite' -import { defineConfig } from 'vitest/config' -import { viteSingleFile } from 'vite-plugin-singlefile' -import pkg from './package.json' - -/** - * `licenses.txt` neben der Web-App: die Lizenztexte aller mitgelieferten Pakete (Abhängigkeiten ohne devDependencies - * aus package-lock.json), dazu Hinweise auf das, was erst zur Laufzeit von fremden Servern geladen wird. - * Die MIT-Lizenz von CodeMirror und Lezer verlangt, dass ihr Text mit ausgeliefert wird. - */ -const CYBERPI_UPLOADER_LICENSE = `MIT License - -Copyright (c) 2026 TWO PLUS THREE LIMITED - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.` - -function thirdPartyLicenses(): Plugin { - return { - name: 'third-party-licenses', - generateBundle() { - const lock = JSON.parse(readFileSync('package-lock.json', 'utf8')) as { packages: Record } - const parts = [ - 'VisuStruct Web – verwendete Software / Third-party software', - '', - 'VisuStruct: MIT License, Copyright (c) 2026 Holger Sebastiao, https://github.com/code4teaching/VisuStruct-SwiftUI', - '', - 'Nur mit „Swing-Unterstützung“ wird zur Laufzeit geladen / Loaded at run time only with “Swing support”:', - '- CheerpJ by Leaning Technologies, https://cheerpj.com (CheerpJ Community License, from the CheerpJ CDN)', - '- javac from OpenJDK 8 (tools.jar from https://github.com/leaningtech/javafiddle, Apache License 2.0; OpenJDK: GPLv2 with Classpath Exception)', - '', - 'Übertragen auf den mBot2 / Upload to the mBot2: Ablauf nach / protocol after cyberpi-uploader, https://github.com/weare2plus3/cyberpi-uploader', - ...CYBERPI_UPLOADER_LICENSE.split('\n'), - '', - 'Mitgelieferte Pakete / Bundled packages:', - ] - const entries = Object.entries(lock.packages) - .filter(([path, p]) => path.startsWith('node_modules/') && !p.dev) - .sort(([a], [b]) => a.localeCompare(b)) - for (const [path, p] of entries) { - const name = path.replace(/^.*node_modules\//, '') - const file = ['LICENSE', 'LICENSE.md', 'LICENSE.txt', 'LICENCE'].map((f) => join(path, f)).find((f) => existsSync(f)) - parts.push('', '='.repeat(72), `${name} ${p.version ?? ''} (${p.license ?? 'see below'})`, '='.repeat(72), '') - parts.push(file ? readFileSync(file, 'utf8').trim() : 'License text not found in the package.') - } - this.emitFile({ type: 'asset', fileName: 'licenses.txt', source: parts.join('\n') + '\n' }) - }, - } -} - -// `npm run build` → dist/ (relative paths, e.g. for website/app/). -// `npm run build:single` → one self-contained index.html (preview/sharing). -export default defineConfig(({ mode }) => ({ - base: './', - // Versionsnummer der Web-App für „Über VisuStruct“; vor jeder Veröffentlichung in package.json erhöhen. - define: { __APP_VERSION__: JSON.stringify(pkg.version) }, - plugins: mode === 'single' ? [viteSingleFile()] : [thirdPartyLicenses()], - build: { outDir: mode === 'single' ? 'dist-single' : 'dist' }, - // Beispieldateien liegen eine Ebene höher in `VisuStruct-Dateien`. - server: { fs: { allow: ['..'] } }, - // VisuBlocks kommt als TypeScript-Quelle (github:code4teaching/visublocks): von Vitest mit übersetzen lassen - test: { environment: 'jsdom', server: { deps: { inline: ['visublocks'] } } }, -})) diff --git a/website/app/assets/Java-Bpx1Vwvg.js b/website/app/assets/Java-Bpx1Vwvg.js deleted file mode 100644 index 587f4c9b..00000000 --- a/website/app/assets/Java-Bpx1Vwvg.js +++ /dev/null @@ -1,226 +0,0 @@ -const e=`/* VisuStruct Java-Desktop-Preset (kein .lproj — gültig für App Store; Tabelle „Java“). */ - -/* Palette — short labels like Java */ -"palette_header" = "Blocks"; - -/* Actions */ -"action_share_png" = "Share Graphic…"; -"action_share_document" = "Share File…"; -"action_export_pdf" = "Preview PDF…"; -"action_generate_code" = "Generate Code…"; -"action_simulation" = "Simulation"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "The simulation mode will run the diagram step by step, highlight the current element, and show variable values and output."; -"simulation_controls" = "Controls"; -"simulation_highlight_label" = "Highlight"; -"simulation_highlight_last" = "Last step"; -"simulation_highlight_next" = "Next step"; -"simulation_not_available" = "Play runs the simulation automatically with a 0.5 second pause per step."; -"simulation_play" = "Play"; -"simulation_pause" = "Pause"; -"simulation_step" = "Step"; -"simulation_stop" = "Stop"; -"simulation_input" = "Input"; -"simulation_input_placeholder" = "No input required."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Please enter a whole number."; -"simulation_trace" = "Last Step"; -"simulation_trace_placeholder" = "The last executed step will be explained here."; -"simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Current variable values will be shown here later."; -"simulation_output" = "Output"; -"simulation_output_placeholder" = "The simulation output will appear here later."; -"action_delete_selection" = "Delete Selection"; -"ctx_copy" = "Copy"; -"ctx_cut" = "Cut"; -"ctx_paste" = "Paste"; -"action_settings" = "Settings"; -"action_about" = "About VisuStruct"; -"recent_files_menu" = "Recent Files"; -"recent_files_empty" = "No recent files"; -"recent_files_clear" = "Clear List"; -"recent_files_unavailable" = "File is no longer available."; - -/* In-app settings */ -"settings_language_title" = "Language"; -"settings_language_de" = "German"; -"settings_language_en" = "English"; -"settings_language_es" = "Spanish"; -"settings_language_fr" = "French"; -"settings_language_it" = "Italian"; -"settings_language_pl" = "Polish"; -"settings_language_tr" = "Turkish"; -"settings_language_ko" = "Korean"; -"settings_language_ja" = "Japanese"; -"settings_language_el" = "Greek"; -"settings_language_uk" = "Ukrainian"; -"settings_language_ar" = "Arabic"; -"settings_language_ru" = "Russian"; -"settings_language_he" = "Hebrew"; -"settings_language_zh_hans" = "Chinese (Simplified)"; -"settings_language_zh_hant" = "Chinese (Traditional)"; -"settings_language_ptpt" = "Portuguese"; -"settings_language_java" = "Java (keywords)"; - - - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "File name suggestion"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "With date"; -"settings_export_filename_title_only" = "Without date"; -"settings_export_filename_footer_with_date" = "With date: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Without date: Filename.visustruct"; - - -/* Error overlay */ -"error_title" = "Error"; -"error_back_editor" = "Back to Editor"; - -/* Toolbar */ -"toolbar_undo" = "Undo"; -"toolbar_redo" = "Redo"; -"toolbar_new" = "New"; -"menu_open" = "Open…"; -"menu_save" = "Save"; -"menu_save_as" = "Save As…"; -"menu_print" = "Print…"; -"menu_file" = "File"; -"menu_new" = "New"; -"menu_close" = "Close"; - -/* Accessibility */ -"a11y_generate_code" = "Generate code from the structure chart"; -"a11y_generate_code_locked" = "Generate code, available after purchase"; -"a11y_unsaved_changes" = "Unsaved changes"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Generate code"; -"codegen_gate_body" = "Java, Python, and JavaScript code from your diagram will unlock via in-app purchase (coming soon)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Code generator"; -"codegen_placeholder_body" = "Generated code will appear here."; -"codegen_placeholder_compare" = "Switch between Java, Python, and JavaScript to compare syntax (sample below)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condition) {\\n statement();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if condition:\\n statement()\\nelse:\\n alternative()"; -"codegen_generated_hint" = "Preview from the current structure chart (Java 17, Python 3.10+, modern JavaScript)."; -"codegen_copy" = "Copy"; -"codegen_run_in_browser" = "Test in browser"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "New diagram tab"; -"a11y_close_tab" = "Close tab"; - -"close_unsaved_title" = "Unsaved Changes"; -"close_unsaved_message" = "This diagram contains unsaved changes. Do you want to save them before closing?"; -"close_unsaved_discard" = "Discard"; -"close_unsaved_cancel" = "Cancel"; -"a11y_placeholder_drop" = "Drop an element here to replace the placeholder. Press and hold to drag and move."; -"a11y_node_drop" = "Press and hold a block, then drag: drop on the top or bottom edge of a target to insert before or after. Center drop only on a ø placeholder."; -"a11y_codegen_panel_drag" = "Drag to move code generator panel"; - -/* Diagram */ -"diagram_title_label" = "Title"; -"diagram_title_placeholder" = "No title"; - -/* Inspector */ -"inspector_no_selection" = "No element selected — tap a tile."; -"inspector_apply_text" = "Apply Text"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; -"inspector_io_mode_title" = "Kind"; -"inspector_io_mode_statement" = "Statement"; -"inspector_io_mode_input" = "Input"; -"inspector_io_mode_output" = "Output"; -"inspector_io_mode_help_java_like" = "Input: input: … | Output: output: …"; -"inspector_add_case" = "Add Case"; -"inspector_remove_case" = "Remove Case"; -"inspector_group_element" = "Element text"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Insert condition…"; -"inspector_placeholder_selector" = "Insert selector…"; -"inspector_placeholder_call" = "Insert call…"; -"inspector_placeholder_break" = "Comment (optional)"; - -/* Element types — JAVA_STANDARD_PALETTE_LABELS (palette + inspector title) */ -"element_anweisung" = "Statement"; -"element_verzweigung" = "if"; -"element_fallauswahl" = "switch"; -"element_forSchleife" = "for"; -"element_whileSchleife" = "while"; -"element_doUntilSchleife" = "do"; -"element_endlosschleife" = "while(true)"; -"element_aussprung" = "break"; -"element_aufruf" = "call"; -"element_leerElement" = "ø"; - -/* Tabs */ -"tab_title_format" = "Diagram %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Empty structure chart"; -"canvas_empty_hint" = "Drag a block from “Blocks” here."; - -/* New block stubs — PRESETS[PRESET_ENGLISH_JAVA] */ -"canvas_stub_anweisung" = "Statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "selector"; -"canvas_stub_for" = "i = 0; i < n; i++"; -"canvas_stub_while" = "condition"; -"canvas_stub_until" = "condition"; -"canvas_stub_endless" = "∞"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "method()"; - -/* About */ -"about_version_fmt" = "Version %@ (%@)"; -"about_nav_title" = "About VisuStruct"; -"about_features_heading" = "Features"; -"about_bullet_palette" = "Insert blocks from the palette or drag them into the diagram"; -"about_bullet_edit" = "Edit the chart: change text, select elements, and remove them if needed"; -"about_bullet_tabs" = "Several diagrams in tabs — each with its own title"; -"about_bullet_file" = "Save and reopen diagrams as .visustruct files"; -"about_bullet_share" = "Share the structure chart as an image (PNG)"; -"about_dateiformat_heading" = "File format"; -"about_dateiformat_part1" = "VisuStruct’s native format uses the extension "; -"about_dateiformat_part2" = ". You can keep diagrams and exchange them with other apps that support the same format."; -"about_dateiformat_strk" = "Files with the .strk extension can also be opened."; -"about_project_github_label" = "Java app (source & releases):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Developer:"; -"about_lineage_heading" = "Lineage"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Done"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Cancel insert"; -"phone_show_text_editor" = "Edit text"; - -/* Alerts */ -"err_save_failed_fmt" = "Could not save: %@"; -"err_share_prepare_failed_fmt" = "Could not prepare sharing: %@"; -"err_diagram_too_small_export" = "The diagram is too small — nothing to export."; -"err_image_render_failed" = "Could not create the image."; -"err_diagram_too_small_print" = "The diagram is too small — nothing to print."; -"err_print_unavailable" = "Printing is not available on this device."; - -"inspector_header" = "Object Inspector"; -`;export{e as default}; diff --git a/website/app/assets/Localizable-1QZ0wfvJ.js b/website/app/assets/Localizable-1QZ0wfvJ.js deleted file mode 100644 index 5db9238a..00000000 --- a/website/app/assets/Localizable-1QZ0wfvJ.js +++ /dev/null @@ -1,240 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Элементы"; -"inspector_header" = "Инспектор объектов"; - -/* Actions */ -"action_share_png" = "Поделиться изображением…"; -"action_share_document" = "Поделиться файлом…"; -"action_export_pdf" = "Предпросмотр PDF…"; -"action_generate_code" = "Сгенерировать код…"; -"action_simulation" = "Симуляция"; -"action_diagram" = "Диаграмма"; -"simulation_placeholder_body" = "Режим симуляции выполняет диаграмму шаг за шагом, подсвечивает текущий элемент и показывает значения переменных и вывод."; -"simulation_controls" = "Управление"; -"simulation_highlight_label" = "Подсветка"; -"simulation_highlight_last" = "Последний шаг"; -"simulation_highlight_next" = "Следующий шаг"; -"simulation_not_available" = "Play автоматически выполняет симуляцию с паузой 0,5 секунды на шаг."; -"simulation_play" = "Пуск"; -"simulation_pause" = "Пауза"; -"simulation_step" = "Шаг"; -"simulation_stop" = "Стоп"; -"simulation_input" = "Ввод"; -"simulation_input_placeholder" = "Ввод не требуется."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Введите целое число."; -"simulation_trace" = "Последний шаг"; -"simulation_trace_placeholder" = "Ещё не выполнено ни одного шага."; -"simulation_variables" = "Переменные"; -"simulation_variables_placeholder" = "Переменных пока нет."; -"simulation_output" = "Вывод"; -"simulation_output_placeholder" = "Вывода пока нет."; -"action_delete_selection" = "Удалить выделение"; -"ctx_copy" = "Копировать"; -"ctx_cut" = "Вырезать"; -"ctx_paste" = "Вставить"; -"action_settings" = "Настройки"; -"action_about" = "О VisuStruct"; -"recent_files_menu" = "Недавние файлы"; -"recent_files_empty" = "Нет недавних файлов"; -"recent_files_clear" = "Очистить список"; -"recent_files_unavailable" = "Файл больше недоступен."; - -/* In-app settings */ -"settings_language_title" = "Язык"; -"settings_language_de" = "Немецкий"; -"settings_language_en" = "Английский"; -"settings_language_es" = "Испанский"; -"settings_language_fr" = "Французский"; -"settings_language_it" = "Итальянский"; -"settings_language_pl" = "Польский"; -"settings_language_tr" = "Турецкий"; -"settings_language_ko" = "Корейский"; -"settings_language_ja" = "Японский"; -"settings_language_el" = "Греческий"; -"settings_language_uk" = "Украинский"; -"settings_language_ar" = "Арабский"; -"settings_language_ru" = "Русский"; -"settings_language_zh_hans" = "Китайский (упрощённый)"; -"settings_language_zh_hant" = "Китайский (традиционный)"; -"settings_language_ptpt" = "Португальский"; -"settings_language_java" = "Java (ключевые слова)"; - - -/* Error overlay */ -"error_title" = "Ошибка"; -"error_back_editor" = "Назад в редактор"; - -/* Toolbar */ -"toolbar_undo" = "Отменить"; -"toolbar_redo" = "Повторить"; -"toolbar_new" = "Новый"; -"menu_open" = "Открыть…"; -"menu_save" = "Сохранить"; -"menu_save_as" = "Сохранить как…"; -"menu_print" = "Печать…"; -"menu_file" = "Файл"; -"menu_new" = "Создать"; -"menu_close" = "Закрыть"; - -/* Accessibility */ -"a11y_generate_code" = "Сгенерировать код по схеме"; -"a11y_generate_code_locked" = "Сгенерировать код (после покупки)"; -"a11y_unsaved_changes" = "Несохранённые изменения"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Сгенерировать код"; -"codegen_gate_body" = "Код Java, Python и JavaScript по вашей схеме будет разблокирован через покупку в приложении (скоро)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Генератор кода"; -"codegen_placeholder_body" = "Сгенерированный код появится здесь."; -"codegen_placeholder_compare" = "Переключайтесь между Java, Python и JavaScript, чтобы сравнить синтаксис (пример ниже)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (условие) {\\n statement();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if условие:\\n statement()\\nelse:\\n alternative()"; -"codegen_copy" = "Копировать"; -"codegen_run_in_browser" = "Проверить в браузере"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Новая вкладка схемы"; -"a11y_close_tab" = "Закрыть вкладку"; - -"close_unsaved_title" = "Несохранённые изменения"; -"close_unsaved_message" = "В этой диаграмме есть несохранённые изменения. Сохранить их перед закрытием?"; -"close_unsaved_discard" = "Отбросить"; -"close_unsaved_cancel" = "Отмена"; -"a11y_placeholder_drop" = "Перетащите элемент сюда, чтобы заменить заполнитель. Нажмите и удерживайте, чтобы перемещать."; -"a11y_node_drop" = "Нажмите и удерживайте блок, затем перетащите: отпустите на верхнем или нижнем крае цели, чтобы вставить до или после. Сброс в центр — только на заполнителе ø."; -"a11y_codegen_panel_drag" = "Перетащите панель генератора кода"; - -/* Diagram */ -"diagram_title_label" = "Название"; -"diagram_title_placeholder" = "Без названия"; - -/* Inspector */ -"inspector_no_selection" = "Элемент не выбран — нажмите на плитку."; -"inspector_apply_text" = "Применить текст"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Вид"; -"inspector_io_mode_statement" = "Инструкция"; -"inspector_io_mode_input" = "Ввод"; -"inspector_io_mode_output" = "Вывод"; -"inspector_io_mode_help_java_like" = "Ввод: input: … | Вывод: output: …"; -"inspector_add_case" = "Добавить вариант"; -"inspector_remove_case" = "Удалить вариант"; -"inspector_group_element" = "Текст элемента"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Вставить условие…"; -"inspector_placeholder_selector" = "Вставить селектор…"; -"inspector_placeholder_call" = "Вставить вызов…"; -"inspector_placeholder_break" = "Комментарий (необязательно)"; - -/* Element types (Russian + keyword hint) */ -"element_anweisung" = "Оператор (statement)"; -"element_verzweigung" = "Условие (if/else)"; -"element_fallauswahl" = "Выбор (switch)"; -"element_forSchleife" = "Цикл (for)"; -"element_whileSchleife" = "Цикл (while)"; -"element_doUntilSchleife" = "Цикл (do-while)"; -"element_endlosschleife" = "Бесконечный цикл (while true)"; -"element_aussprung" = "Выход (break)"; -"element_aufruf" = "Вызов (call)"; -"element_leerElement" = "Пустой элемент"; - -/* Tabs */ -"tab_title_format" = "Схема %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Пустая структурная схема"; -"canvas_empty_hint" = "Перетащите элемент из «Элементы» сюда."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Выбор (switch)"; -"canvas_stub_anweisung" = "Оператор (statement)"; -"canvas_stub_condition" = "Условие"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "бесконечно"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Вызов()"; - -/* About */ -"about_version_fmt" = "Версия %@ (%@)"; -"about_nav_title" = "О VisuStruct"; -"about_features_heading" = "Возможности"; -"about_bullet_palette" = "Вставляйте блоки из палитры или перетаскивайте их в схему"; -"about_bullet_edit" = "Редактируйте схему: меняйте текст, выбирайте элементы и удаляйте при необходимости"; -"about_bullet_tabs" = "Несколько схем во вкладках — каждая со своим названием"; -"about_bullet_file" = "Сохраняйте и открывайте схемы как файлы .visustruct"; -"about_bullet_share" = "Делитесь схемой как изображением (PNG)"; -"about_dateiformat_heading" = "Формат файла"; -"about_dateiformat_part1" = "Родной формат VisuStruct использует расширение "; -"about_dateiformat_part2" = ". Вы можете сохранять схемы и обмениваться ими с другими приложениями, поддерживающими этот формат."; -"about_dateiformat_strk" = "Файлы с расширением .strk также можно открывать."; -"about_project_github_label" = "Java‑приложение (исходники и релизы):"; -"about_web_label" = "Веб:"; -"about_developer_label" = "Разработчик:"; -"about_lineage_heading" = "Происхождение"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Готово"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Отменить вставку"; -"phone_show_text_editor" = "Редактировать текст"; -"phone_hide_text_editor" = "Свернуть"; -"phone_title_done" = "Готово"; - -/* Alerts */ -"err_save_failed_fmt" = "Не удалось сохранить: %@"; -"err_share_prepare_failed_fmt" = "Не удалось подготовить общий доступ: %@"; -"err_diagram_too_small_export" = "Схема слишком мала — нечего экспортировать."; -"err_image_render_failed" = "Не удалось создать изображение."; -"err_diagram_too_small_print" = "Схема слишком мала — нечего печатать."; -"err_print_unavailable" = "Печать недоступна на этом устройстве."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Имя файла (предложение)"; -"settings_export_filename_picker" = "Формат"; -"settings_export_filename_date_title" = "С датой"; -"settings_export_filename_title_only" = "Без даты"; -"settings_export_filename_footer_with_date" = "С датой: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Без даты: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Симуляция завершена."; -"sim_notice_infinite_loop_empty" = "У бесконечного цикла нет тела."; -"sim_notice_unsupported_statement_fmt" = "Неподдерживаемая инструкция: %@"; -"sim_notice_invalid_expression_fmt" = "Недопустимое выражение: %@"; -"sim_notice_unknown_variable_fmt" = "Неизвестная переменная: %@"; -"sim_notice_division_by_zero" = "Деление на ноль."; -"sim_notice_whole_number_expected" = "Введите целое число."; -"sim_notice_number_expected" = "Введите число."; -"sim_notice_boolean_expected" = "Введите true или false."; -"sim_notice_subprogram_not_found_fmt" = "Нет открытой диаграммы с именем %@. Вызов пропущен."; -"sim_notice_call_too_deep" = "Слишком много вложенных вызовов. Подпрограмма вызывает сама себя?"; - -"codegen_pseudocode_toggle" = "Псевдокод (не исполняемый код)"; -"codegen_pseudocode_note" = "Псевдокод – не исполняемая программа"; -"codegen_pseudocode_hint" = "Эта диаграмма отмечена как псевдокод. Код — лишь набросок, его нельзя запустить."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-BAutdlBb.js b/website/app/assets/Localizable-BAutdlBb.js deleted file mode 100644 index ab6b7d13..00000000 --- a/website/app/assets/Localizable-BAutdlBb.js +++ /dev/null @@ -1,153 +0,0 @@ -const e=`/* NOTE: Initial Danish localization. */ -"palette_header" = "Elementer"; -"inspector_header" = "Objektinspektør"; - -/* Actions */ -"action_share_png" = "Del billede…"; -"action_share_document" = "Del fil…"; -"action_export_pdf" = "Vis PDF…"; -"action_generate_code" = "Generér kode…"; -"action_simulation" = "Simulering"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "Simuleringstilstanden kører diagrammet trin for trin, fremhæver det aktuelle element og viser variabelværdier og output."; -"simulation_controls" = "Kontroller"; -"simulation_highlight_label" = "Fremhævning"; -"simulation_highlight_last" = "Sidste trin"; -"simulation_highlight_next" = "Næste trin"; -"simulation_not_available" = "Play kører simuleringen automatisk med en pause på 0,5 sekund pr. trin."; -"simulation_play" = "Afspil"; -"simulation_pause" = "Pause"; -"simulation_step" = "Trin"; -"simulation_stop" = "Stop"; -"simulation_input" = "Input"; -"simulation_input_placeholder" = "Ingen input påkrævet."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Indtast et heltal."; -"simulation_trace" = "Sidste trin"; -"simulation_trace_placeholder" = "Intet trin udført endnu."; -"simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Ingen variabler endnu."; -"simulation_output" = "Output"; -"simulation_output_placeholder" = "Intet output endnu."; -"action_delete_selection" = "Slet markering"; -"ctx_copy" = "Kopiér"; -"ctx_cut" = "Klip"; -"ctx_paste" = "Indsæt"; -"action_settings" = "Indstillinger"; -"action_about" = "Om VisuStruct"; -"recent_files_menu" = "Seneste filer"; -"recent_files_empty" = "Ingen seneste filer"; -"recent_files_clear" = "Ryd liste"; -"recent_files_unavailable" = "Filen er ikke længere tilgængelig."; - -/* In-app settings */ -"settings_language_title" = "Sprog"; - -/* Toolbar */ -"toolbar_undo" = "Fortryd"; -"toolbar_redo" = "Annuller fortryd"; -"toolbar_new" = "Ny"; -"menu_open" = "Åbn…"; -"menu_save" = "Gem"; -"menu_save_as" = "Gem som…"; -"menu_print" = "Udskriv…"; -"menu_file" = "Arkiv"; -"menu_new" = "Ny"; -"menu_close" = "Luk"; - -/* Inspector */ -"inspector_no_selection" = "Intet valgt — tryk på en flise."; -"inspector_apply_text" = "Anvend tekst"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Type"; -"inspector_io_mode_statement" = "Sætning"; -"inspector_io_mode_input" = "Input"; -"inspector_io_mode_output" = "Output"; -"inspector_io_mode_help_java_like" = "Input: input: … | Output: output: …"; -"inspector_add_case" = "Tilføj case"; -"inspector_remove_case" = "Fjern case"; -"inspector_group_element" = "Elementtekst"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Indtast condition…"; -"inspector_placeholder_selector" = "Indtast selector…"; -"inspector_placeholder_call" = "Indtast call…"; -"inspector_placeholder_break" = "Kommentar (valgfrit)"; - -/* Element types */ -"element_anweisung" = "Sætning"; -"element_verzweigung" = "Betingelse (if/else)"; -"element_fallauswahl" = "Valg (switch)"; -"element_forSchleife" = "For-løkke"; -"element_whileSchleife" = "While-løkke"; -"element_doUntilSchleife" = "Do-while-løkke"; -"element_endlosschleife" = "Uendelig løkke"; -"element_aussprung" = "Break"; -"element_aufruf" = "Kald"; -"element_leerElement" = "Tomt element"; - -/* Diagram */ -"diagram_title_label" = "Titel"; -"diagram_title_placeholder" = "Ingen titel"; -"canvas_empty_title" = "Tomt struktogram"; -"canvas_empty_hint" = "Træk et element fra “Elementer” hertil."; - -/* Diagram stubs */ -"canvas_stub_anweisung" = "statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "switch"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Kald()"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Forslag til filnavn"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Med dato"; -"settings_export_filename_title_only" = "Uden dato"; -"settings_export_filename_footer_with_date" = "Med dato: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Uden dato: Filename.visustruct"; - -"close_unsaved_title" = "Ikke-gemte ændringer"; -"close_unsaved_message" = "Dette diagram indeholder ikke-gemte ændringer. Vil du gemme dem før lukning?"; -"close_unsaved_discard" = "Kassér"; -"close_unsaved_cancel" = "Annuller"; - -/* Accessibility — code generator floating panel */ -"a11y_codegen_panel_drag" = "Træk for at flytte kodegeneratorpanelet"; -"about_dateiformat_strk" = "Filer med endelsen .strk kan også åbnes."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simuleringen er færdig."; -"sim_notice_infinite_loop_empty" = "Den uendelige løkke har intet indhold."; -"sim_notice_unsupported_statement_fmt" = "Sætning understøttes ikke: %@"; -"sim_notice_invalid_expression_fmt" = "Ugyldigt udtryk: %@"; -"sim_notice_unknown_variable_fmt" = "Ukendt variabel: %@"; -"sim_notice_division_by_zero" = "Division med nul."; -"sim_notice_whole_number_expected" = "Indtast et heltal."; -"sim_notice_number_expected" = "Indtast et tal."; -"sim_notice_boolean_expected" = "Indtast true eller false."; -"sim_notice_subprogram_not_found_fmt" = "Intet åbent diagram hedder %@. Kaldet blev sprunget over."; -"sim_notice_call_too_deep" = "For mange indlejrede kald. Kalder et underprogram sig selv?"; -"phone_hide_text_editor" = "Skjul"; -"phone_title_done" = "Færdig"; - -"codegen_pseudocode_toggle" = "Pseudokode (ikke kørbar kode)"; -"codegen_pseudocode_note" = "Pseudokode – ikke et kørbart program"; -"codegen_pseudocode_hint" = "Dette diagram er markeret som pseudokode. Koden er kun en skitse og kan ikke køres."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-BJ55WGVD.js b/website/app/assets/Localizable-BJ55WGVD.js deleted file mode 100644 index 2d294726..00000000 --- a/website/app/assets/Localizable-BJ55WGVD.js +++ /dev/null @@ -1,153 +0,0 @@ -const e=`/* NOTE: Initial Dutch localization. */ -"palette_header" = "Elementen"; -"inspector_header" = "Objectinspector"; - -/* Actions */ -"action_share_png" = "Deel afbeelding…"; -"action_share_document" = "Deel bestand…"; -"action_export_pdf" = "PDF-voorbeeld…"; -"action_generate_code" = "Genereer code…"; -"action_simulation" = "Simulatie"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "De simulatiemodus voert het diagram stap voor stap uit, markeert het huidige element en toont variabele waarden en uitvoer."; -"simulation_controls" = "Besturing"; -"simulation_highlight_label" = "Highlight"; -"simulation_highlight_last" = "Last step"; -"simulation_highlight_next" = "Next step"; -"simulation_not_available" = "Play voert de simulatie automatisch uit met een pauze van 0,5 seconde per stap."; -"simulation_play" = "Afspelen"; -"simulation_pause" = "Pauze"; -"simulation_step" = "Stap"; -"simulation_stop" = "Stop"; -"simulation_input" = "Invoer"; -"simulation_input_placeholder" = "Geen invoer vereist."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Voer een geheel getal in."; -"simulation_trace" = "Laatste stap"; -"simulation_trace_placeholder" = "Nog geen stap uitgevoerd."; -"simulation_variables" = "Variabelen"; -"simulation_variables_placeholder" = "Nog geen variabelen."; -"simulation_output" = "Uitvoer"; -"simulation_output_placeholder" = "Nog geen uitvoer."; -"action_delete_selection" = "Selectie verwijderen"; -"ctx_copy" = "Kopiëren"; -"ctx_cut" = "Knippen"; -"ctx_paste" = "Plakken"; -"action_settings" = "Instellingen"; -"action_about" = "Over VisuStruct"; -"recent_files_menu" = "Recente bestanden"; -"recent_files_empty" = "Geen recente bestanden"; -"recent_files_clear" = "Lijst wissen"; -"recent_files_unavailable" = "Bestand is niet meer beschikbaar."; - -/* In-app settings */ -"settings_language_title" = "Taal"; - -/* Toolbar */ -"toolbar_undo" = "Ongedaan maken"; -"toolbar_redo" = "Opnieuw"; -"toolbar_new" = "Nieuw"; -"menu_open" = "Open…"; -"menu_save" = "Bewaar"; -"menu_save_as" = "Bewaar als…"; -"menu_print" = "Print…"; -"menu_file" = "Bestand"; -"menu_new" = "Nieuw"; -"menu_close" = "Sluit"; - -/* Inspector */ -"inspector_no_selection" = "Geen element geselecteerd — tik op een tegel."; -"inspector_apply_text" = "Tekst toepassen"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Soort"; -"inspector_io_mode_statement" = "Opdracht"; -"inspector_io_mode_input" = "Invoer"; -"inspector_io_mode_output" = "Uitvoer"; -"inspector_io_mode_help_java_like" = "Invoer: input: … | Uitvoer: output: …"; -"inspector_add_case" = "Case toevoegen"; -"inspector_remove_case" = "Case verwijderen"; -"inspector_group_element" = "Elementtekst"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Voer condition in…"; -"inspector_placeholder_selector" = "Voer selector in…"; -"inspector_placeholder_call" = "Voer call in…"; -"inspector_placeholder_break" = "Opmerking (optioneel)"; - -/* Element types */ -"element_anweisung" = "Instructie"; -"element_verzweigung" = "Voorwaarde (if/else)"; -"element_fallauswahl" = "Keuze (switch)"; -"element_forSchleife" = "For-lus"; -"element_whileSchleife" = "While-lus"; -"element_doUntilSchleife" = "Do-while-lus"; -"element_endlosschleife" = "Oneindige lus"; -"element_aussprung" = "Break"; -"element_aufruf" = "Aanroep"; -"element_leerElement" = "Leeg element"; - -/* Diagram */ -"diagram_title_label" = "Titel"; -"diagram_title_placeholder" = "Geen titel"; -"canvas_empty_title" = "Leeg structogram"; -"canvas_empty_hint" = "Sleep een element uit “Elementen” hierheen."; - -/* Diagram stubs */ -"canvas_stub_anweisung" = "statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "switch"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Aanroep()"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Bestandsnaamsuggestie"; -"settings_export_filename_picker" = "Indeling"; -"settings_export_filename_date_title" = "Met datum"; -"settings_export_filename_title_only" = "Zonder datum"; -"settings_export_filename_footer_with_date" = "Met datum: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Zonder datum: Filename.visustruct"; - -"close_unsaved_title" = "Niet-opgeslagen wijzigingen"; -"close_unsaved_message" = "Dit diagram bevat niet-opgeslagen wijzigingen. Wil je ze opslaan voordat je sluit?"; -"close_unsaved_discard" = "Verwerpen"; -"close_unsaved_cancel" = "Annuleren"; - -/* Accessibility — code generator floating panel */ -"a11y_codegen_panel_drag" = "Sleep om het codegeneratorpaneel te verplaatsen"; -"about_dateiformat_strk" = "Bestanden met de extensie .strk kunnen ook worden geopend."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulatie voltooid."; -"sim_notice_infinite_loop_empty" = "De oneindige lus heeft geen inhoud."; -"sim_notice_unsupported_statement_fmt" = "Niet-ondersteunde opdracht: %@"; -"sim_notice_invalid_expression_fmt" = "Ongeldige expressie: %@"; -"sim_notice_unknown_variable_fmt" = "Onbekende variabele: %@"; -"sim_notice_division_by_zero" = "Deling door nul."; -"sim_notice_whole_number_expected" = "Voer een geheel getal in."; -"sim_notice_number_expected" = "Voer een getal in."; -"sim_notice_boolean_expected" = "Voer true of false in."; -"sim_notice_subprogram_not_found_fmt" = "Er is geen open diagram met de naam %@. De aanroep is overgeslagen."; -"sim_notice_call_too_deep" = "Te veel geneste aanroepen. Roept een subprogramma zichzelf aan?"; -"phone_hide_text_editor" = "Inklappen"; -"phone_title_done" = "Gereed"; - -"codegen_pseudocode_toggle" = "Pseudocode (geen uitvoerbare code)"; -"codegen_pseudocode_note" = "Pseudocode – geen uitvoerbaar programma"; -"codegen_pseudocode_hint" = "Dit diagram is gemarkeerd als pseudocode. De code is alleen een schets en kan niet worden uitgevoerd."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-BM86Igqt.js b/website/app/assets/Localizable-BM86Igqt.js deleted file mode 100644 index e5a53b6f..00000000 --- a/website/app/assets/Localizable-BM86Igqt.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Öğeler"; -"inspector_header" = "Nesne denetçisi"; - -/* Actions */ -"action_share_png" = "Görseli paylaş…"; -"action_share_document" = "Dosyayı paylaş…"; -"action_export_pdf" = "PDF önizleme…"; -"action_generate_code" = "Kod üret…"; -"action_simulation" = "Simülasyon"; -"action_diagram" = "Diyagram"; -"simulation_placeholder_body" = "Simülasyon modu diyagramı adım adım çalıştırır, geçerli öğeyi vurgular ve değişken değerlerini ve çıktıyı gösterir."; -"simulation_controls" = "Kontroller"; -"simulation_highlight_label" = "Vurgu"; -"simulation_highlight_last" = "Son adım"; -"simulation_highlight_next" = "Sonraki adım"; -"simulation_not_available" = "Play simülasyonu adım başına 0,5 saniye duraklamayla otomatik çalıştırır."; -"simulation_play" = "Oynat"; -"simulation_pause" = "Duraklat"; -"simulation_step" = "Adım"; -"simulation_stop" = "Durdur"; -"simulation_input" = "Girdi"; -"simulation_input_placeholder" = "Girdi gerekli değil."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Lütfen bir tam sayı girin."; -"simulation_trace" = "Son Adım"; -"simulation_trace_placeholder" = "Henüz adım çalıştırılmadı."; -"simulation_variables" = "Değişkenler"; -"simulation_variables_placeholder" = "Henüz değişken yok."; -"simulation_output" = "Çıktı"; -"simulation_output_placeholder" = "Henüz çıktı yok."; -"action_delete_selection" = "Seçimi sil"; -"ctx_copy" = "Kopyala"; -"ctx_cut" = "Kes"; -"ctx_paste" = "Yapıştır"; -"action_settings" = "Ayarlar"; -"action_about" = "VisuStruct Hakkında"; -"recent_files_menu" = "Son Kullanılanlar"; -"recent_files_empty" = "Son kullanılan dosya yok"; -"recent_files_clear" = "Listeyi temizle"; -"recent_files_unavailable" = "Dosya artık kullanılamıyor."; - -/* In-app settings */ -"settings_language_title" = "Dil"; -"settings_language_de" = "Almanca"; -"settings_language_en" = "İngilizce"; -"settings_language_es" = "İspanyolca"; -"settings_language_fr" = "Fransızca"; -"settings_language_it" = "İtalyanca"; -"settings_language_pl" = "Lehçe"; -"settings_language_tr" = "Türkçe"; -"settings_language_ko" = "Korece"; -"settings_language_ja" = "Japonca"; -"settings_language_el" = "Yunanca"; -"settings_language_uk" = "Ukraynaca"; -"settings_language_ar" = "Arapça"; -"settings_language_ru" = "Rusça"; -"settings_language_he" = "İbranice"; -"settings_language_zh_hans" = "Çince (Basitleştirilmiş)"; -"settings_language_zh_hant" = "Çince (Geleneksel)"; -"settings_language_ptpt" = "Portekizce"; -"settings_language_java" = "Java (anahtar kelimeler)"; - - -/* Error overlay */ -"error_title" = "Hata"; -"error_back_editor" = "Düzenleyiciye dön"; - -/* Toolbar */ -"toolbar_undo" = "Geri al"; -"toolbar_redo" = "Yinele"; -"toolbar_new" = "Yeni"; -"menu_open" = "Aç…"; -"menu_save" = "Kaydet"; -"menu_save_as" = "Farklı kaydet…"; -"menu_print" = "Yazdır…"; -"menu_file" = "Dosya"; -"menu_new" = "Yeni"; -"menu_close" = "Kapat"; - -/* Accessibility */ -"a11y_generate_code" = "Yapı şemasından kod üret"; -"a11y_generate_code_locked" = "Kod üret, satın alma sonrası kullanılabilir"; -"a11y_unsaved_changes" = "Kaydedilmemiş değişiklikler"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Kod üret"; -"codegen_gate_body" = "Diyagramınızdan Java, Python ve JavaScript kodu uygulama içi satın alma ile açılacak (yakında)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Kod üretici"; -"codegen_placeholder_body" = "Üretilen kod burada görünecek."; -"codegen_placeholder_compare" = "Sözdizimini karşılaştırmak için Java, Python ve JavaScript arasında geçiş yapın (aşağıda örnek)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (koşul) {\\n ifade();\\n} else {\\n alternatif();\\n}"; -"codegen_preview_python" = "if koşul:\\n ifade()\\nelse:\\n alternatif()"; -"codegen_copy" = "Kopyala"; -"codegen_run_in_browser" = "Tarayıcıda test et"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Yeni diyagram sekmesi"; -"a11y_close_tab" = "Sekmeyi kapat"; - -"close_unsaved_title" = "Kaydedilmemiş değişiklikler"; -"close_unsaved_message" = "Bu diyagram kaydedilmemiş değişiklikler içeriyor. Kapatmadan önce kaydetmek ister misiniz?"; -"close_unsaved_discard" = "Vazgeç"; -"close_unsaved_cancel" = "İptal"; -"a11y_placeholder_drop" = "Yer tutucuyu değiştirmek için buraya bir öğe bırakın. Sürükleyip taşımak için basılı tutun."; -"a11y_node_drop" = "Bir bloğa basılı tutup sürükleyin: önce/sonra eklemek için hedefin üst veya alt kenarına bırakın. Ortaya bırakma yalnızca ø yer tutucuda."; -"a11y_codegen_panel_drag" = "Kod üretici panelini taşımak için sürükleyin"; - -/* Diagram */ -"diagram_title_label" = "Başlık"; -"diagram_title_placeholder" = "Başlıksız"; - -/* Inspector */ -"inspector_no_selection" = "Seçili öğe yok — bir kutucuğa dokunun."; -"inspector_apply_text" = "Metni uygula"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Tür"; -"inspector_io_mode_statement" = "Komut"; -"inspector_io_mode_input" = "Giriş"; -"inspector_io_mode_output" = "Çıkış"; -"inspector_io_mode_help_java_like" = "Giriş: input: … | Çıkış: output: …"; -"inspector_add_case" = "Durum ekle"; -"inspector_remove_case" = "Durumu kaldır"; -"inspector_group_element" = "Öğe metni"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Koşul ekle…"; -"inspector_placeholder_selector" = "Seçici ekle…"; -"inspector_placeholder_call" = "Çağrı ekle…"; -"inspector_placeholder_break" = "Açıklama (isteğe bağlı)"; - -/* Element types */ -"element_anweisung" = "İfade"; -"element_verzweigung" = "Dal"; -"element_fallauswahl" = "Seçim"; -"element_forSchleife" = "for döngüsü"; -"element_whileSchleife" = "while döngüsü"; -"element_doUntilSchleife" = "do-while döngüsü"; -"element_endlosschleife" = "Sonsuz döngü"; -"element_aussprung" = "Çık"; -"element_aufruf" = "Çağrı"; -"element_leerElement" = "Boş öğe"; - -/* Tabs */ -"tab_title_format" = "Diyagram %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Boş yapı şeması"; -"canvas_empty_hint" = "“Öğeler”den bir öğeyi buraya sürükleyin."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Seçim"; -"canvas_stub_anweisung" = "İfade"; -"canvas_stub_condition" = "Koşul"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "sonsuz"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Çağrı()"; - -/* About */ -"about_version_fmt" = "Sürüm %@ (%@)"; -"about_nav_title" = "VisuStruct Hakkında"; -"about_features_heading" = "Özellikler"; -"about_bullet_palette" = "Paletten blok ekleyin veya diyagrama sürükleyin"; -"about_bullet_edit" = "Şemayı düzenleyin: metni değiştirin, öğeleri seçin ve gerekirse silin"; -"about_bullet_tabs" = "Sekmelerde birden fazla diyagram — her birinin kendi başlığı var"; -"about_bullet_file" = "Diyagramları .visustruct dosyaları olarak kaydedin ve yeniden açın"; -"about_bullet_share" = "Yapı şemasını görsel olarak paylaşın (PNG)"; -"about_dateiformat_heading" = "Dosya biçimi"; -"about_dateiformat_part1" = "VisuStruct’ün yerel biçimi şu uzantıyı kullanır: "; -"about_dateiformat_part2" = ". Diyagramları saklayabilir ve aynı biçimi destekleyen diğer uygulamalarla paylaşabilirsiniz."; -"about_dateiformat_strk" = ".strk uzantılı dosyalar da açılabilir."; -"about_project_github_label" = "Java uygulaması (kaynak ve sürümler):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Geliştirici:"; -"about_lineage_heading" = "Köken"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Bitti"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Ekleme iptal"; -"phone_show_text_editor" = "Metni düzenle"; -"phone_hide_text_editor" = "Daralt"; -"phone_title_done" = "Bitti"; - -/* Alerts */ -"err_save_failed_fmt" = "Kaydedilemedi: %@"; -"err_share_prepare_failed_fmt" = "Paylaşım hazırlanamadı: %@"; -"err_diagram_too_small_export" = "Diyagram çok küçük — dışa aktarılacak bir şey yok."; -"err_image_render_failed" = "Görsel oluşturulamadı."; -"err_diagram_too_small_print" = "Diyagram çok küçük — yazdırılacak bir şey yok."; -"err_print_unavailable" = "Bu aygıtta yazdırma kullanılamıyor."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Dosya adı önerisi"; -"settings_export_filename_picker" = "Biçim"; -"settings_export_filename_date_title" = "Tarihli"; -"settings_export_filename_title_only" = "Tarihsiz"; -"settings_export_filename_footer_with_date" = "Tarihli: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Tarihsiz: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simülasyon tamamlandı."; -"sim_notice_infinite_loop_empty" = "Sonsuz döngünün gövdesi yok."; -"sim_notice_unsupported_statement_fmt" = "Desteklenmeyen komut: %@"; -"sim_notice_invalid_expression_fmt" = "Geçersiz ifade: %@"; -"sim_notice_unknown_variable_fmt" = "Bilinmeyen değişken: %@"; -"sim_notice_division_by_zero" = "Sıfıra bölme."; -"sim_notice_whole_number_expected" = "Lütfen bir tam sayı girin."; -"sim_notice_number_expected" = "Lütfen bir sayı girin."; -"sim_notice_boolean_expected" = "true veya false girin."; -"sim_notice_subprogram_not_found_fmt" = "%@ adında açık bir diyagram yok. Çağrı atlandı."; -"sim_notice_call_too_deep" = "Çok fazla iç içe çağrı. Bir alt program kendini mi çağırıyor?"; - -"codegen_pseudocode_toggle" = "Sözde kod (çalıştırılamaz kod)"; -"codegen_pseudocode_note" = "Sözde kod – çalıştırılabilir bir program değil"; -"codegen_pseudocode_hint" = "Bu diyagram sözde kod olarak işaretlendi. Kod yalnızca bir taslaktır ve çalıştırılamaz."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-BYJK0mdR.js b/website/app/assets/Localizable-BYJK0mdR.js deleted file mode 100644 index b6e04f44..00000000 --- a/website/app/assets/Localizable-BYJK0mdR.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Elementy"; -"inspector_header" = "Inspektor obiektów"; - -/* Actions */ -"action_share_png" = "Udostępnij obraz…"; -"action_share_document" = "Udostępnij plik…"; -"action_export_pdf" = "Podgląd PDF…"; -"action_generate_code" = "Generuj kod…"; -"action_simulation" = "Symulacja"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "Tryb symulacji uruchamia diagram krok po kroku, podświetla bieżący element oraz pokazuje wartości zmiennych i wyjście."; -"simulation_controls" = "Sterowanie"; -"simulation_highlight_label" = "Podświetlenie"; -"simulation_highlight_last" = "Ostatni krok"; -"simulation_highlight_next" = "Następny krok"; -"simulation_not_available" = "Play uruchamia symulację automatycznie z pauzą 0,5 sekundy na krok."; -"simulation_play" = "Odtwórz"; -"simulation_pause" = "Pauza"; -"simulation_step" = "Krok"; -"simulation_stop" = "Stop"; -"simulation_input" = "Wejście"; -"simulation_input_placeholder" = "Brak wymaganych danych wejściowych."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Wpisz liczbę całkowitą."; -"simulation_trace" = "Ostatni krok"; -"simulation_trace_placeholder" = "Nie wykonano jeszcze żadnego kroku."; -"simulation_variables" = "Zmienne"; -"simulation_variables_placeholder" = "Brak zmiennych."; -"simulation_output" = "Wyjście"; -"simulation_output_placeholder" = "Brak wyjścia."; -"action_delete_selection" = "Usuń zaznaczenie"; -"ctx_copy" = "Kopiuj"; -"ctx_cut" = "Wytnij"; -"ctx_paste" = "Wklej"; -"action_settings" = "Ustawienia"; -"action_about" = "O VisuStruct"; -"recent_files_menu" = "Ostatnie pliki"; -"recent_files_empty" = "Brak ostatnich plików"; -"recent_files_clear" = "Wyczyść listę"; -"recent_files_unavailable" = "Plik nie jest już dostępny."; - -/* In-app settings */ -"settings_language_title" = "Język"; -"settings_language_de" = "Niemiecki"; -"settings_language_en" = "Angielski"; -"settings_language_es" = "Hiszpański"; -"settings_language_fr" = "Francuski"; -"settings_language_it" = "Włoski"; -"settings_language_pl" = "Polski"; -"settings_language_tr" = "Turecki"; -"settings_language_ko" = "Koreański"; -"settings_language_ja" = "Japoński"; -"settings_language_el" = "Grecki"; -"settings_language_uk" = "Ukraiński"; -"settings_language_ar" = "Arabski"; -"settings_language_ru" = "Rosyjski"; -"settings_language_he" = "Hebrajski"; -"settings_language_zh_hans" = "Chiński (uproszczony)"; -"settings_language_zh_hant" = "Chiński (tradycyjny)"; -"settings_language_ptpt" = "Portugalski"; -"settings_language_java" = "Java (słowa kluczowe)"; - - -/* Error overlay */ -"error_title" = "Błąd"; -"error_back_editor" = "Powrót do edytora"; - -/* Toolbar */ -"toolbar_undo" = "Cofnij"; -"toolbar_redo" = "Ponów"; -"toolbar_new" = "Nowe"; -"menu_open" = "Otwórz…"; -"menu_save" = "Zapisz"; -"menu_save_as" = "Zapisz jako…"; -"menu_print" = "Drukuj…"; -"menu_file" = "Plik"; -"menu_new" = "Nowy"; -"menu_close" = "Zamknij"; - -/* Accessibility */ -"a11y_generate_code" = "Generuj kod z diagramu"; -"a11y_generate_code_locked" = "Generuj kod, dostępne po zakupie"; -"a11y_unsaved_changes" = "Niezapisane zmiany"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Generuj kod"; -"codegen_gate_body" = "Kod Java, Python i JavaScript z Twojego diagramu odblokuje zakup w aplikacji (wkrótce)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Generator kodu"; -"codegen_placeholder_body" = "Tutaj pojawi się wygenerowany kod."; -"codegen_placeholder_compare" = "Przełączaj między Java, Python i JavaScript, aby porównać składnię (przykład poniżej)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (warunek) {\\n instrukcja();\\n} else {\\n alternatywa();\\n}"; -"codegen_preview_python" = "if warunek:\\n instrukcja()\\nelse:\\n alternatywa()"; -"codegen_copy" = "Kopiuj"; -"codegen_run_in_browser" = "Testuj w przeglądarce"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Nowa karta diagramu"; -"a11y_close_tab" = "Zamknij kartę"; - -"close_unsaved_title" = "Niezapisane zmiany"; -"close_unsaved_message" = "Ten diagram zawiera niezapisane zmiany. Czy chcesz je zapisać przed zamknięciem?"; -"close_unsaved_discard" = "Odrzuć"; -"close_unsaved_cancel" = "Anuluj"; -"a11y_placeholder_drop" = "Upuść element tutaj, aby zastąpić symbol zastępczy. Naciśnij i przytrzymaj, aby przeciągnąć i przenieść."; -"a11y_node_drop" = "Naciśnij i przytrzymaj blok, a następnie przeciągnij: upuść na górnej lub dolnej krawędzi celu, aby wstawić przed lub po. Upuszczenie na środku tylko na symbolu ø."; -"a11y_codegen_panel_drag" = "Przeciągnij, aby przesunąć panel generatora kodu"; - -/* Diagram */ -"diagram_title_label" = "Tytuł"; -"diagram_title_placeholder" = "Bez tytułu"; - -/* Inspector */ -"inspector_no_selection" = "Nie wybrano elementu — stuknij kafelek."; -"inspector_apply_text" = "Zastosuj tekst"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Rodzaj"; -"inspector_io_mode_statement" = "Instrukcja"; -"inspector_io_mode_input" = "Wejście"; -"inspector_io_mode_output" = "Wyjście"; -"inspector_io_mode_help_java_like" = "Wejście: input: … | Wyjście: output: …"; -"inspector_add_case" = "Dodaj przypadek"; -"inspector_remove_case" = "Usuń przypadek"; -"inspector_group_element" = "Tekst elementu"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Wstaw warunek…"; -"inspector_placeholder_selector" = "Wstaw selektor…"; -"inspector_placeholder_call" = "Wstaw wywołanie…"; -"inspector_placeholder_break" = "Komentarz (opcjonalnie)"; - -/* Element types */ -"element_anweisung" = "Instrukcja"; -"element_verzweigung" = "Rozgałęzienie"; -"element_fallauswahl" = "Wybór"; -"element_forSchleife" = "Pętla for"; -"element_whileSchleife" = "Pętla while"; -"element_doUntilSchleife" = "Pętla do-while"; -"element_endlosschleife" = "Pętla nieskończona"; -"element_aussprung" = "Wyjście"; -"element_aufruf" = "Wywołanie"; -"element_leerElement" = "Pusty element"; - -/* Tabs */ -"tab_title_format" = "Diagram %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Pusty diagram"; -"canvas_empty_hint" = "Przeciągnij element z „Elementy” tutaj."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Wybór"; -"canvas_stub_anweisung" = "Instrukcja"; -"canvas_stub_condition" = "Warunek"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "nieskończona"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Wywołanie()"; - -/* About */ -"about_version_fmt" = "Wersja %@ (%@)"; -"about_nav_title" = "O VisuStruct"; -"about_features_heading" = "Funkcje"; -"about_bullet_palette" = "Wstawiaj bloki z palety lub przeciągaj je do diagramu"; -"about_bullet_edit" = "Edytuj diagram: zmieniaj tekst, wybieraj elementy i usuwaj je w razie potrzeby"; -"about_bullet_tabs" = "Kilka diagramów w kartach — każdy z własnym tytułem"; -"about_bullet_file" = "Zapisuj i otwieraj diagramy jako pliki .visustruct"; -"about_bullet_share" = "Udostępniaj diagram jako obraz (PNG)"; -"about_dateiformat_heading" = "Format pliku"; -"about_dateiformat_part1" = "Natywny format VisuStruct używa rozszerzenia "; -"about_dateiformat_part2" = ". Możesz zachować diagramy i wymieniać je z innymi aplikacjami obsługującymi ten sam format."; -"about_dateiformat_strk" = "Można także otwierać pliki z rozszerzeniem .strk."; -"about_project_github_label" = "Aplikacja Java (źródła i wydania):"; -"about_web_label" = "WWW:"; -"about_developer_label" = "Programista:"; -"about_lineage_heading" = "Pochodzenie"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Gotowe"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Anuluj wstawianie"; -"phone_show_text_editor" = "Edytuj tekst"; -"phone_hide_text_editor" = "Zwiń"; -"phone_title_done" = "Gotowe"; - -/* Alerts */ -"err_save_failed_fmt" = "Nie można zapisać: %@"; -"err_share_prepare_failed_fmt" = "Nie można przygotować udostępniania: %@"; -"err_diagram_too_small_export" = "Diagram jest zbyt mały — nic do eksportu."; -"err_image_render_failed" = "Nie można utworzyć obrazu."; -"err_diagram_too_small_print" = "Diagram jest zbyt mały — nic do drukowania."; -"err_print_unavailable" = "Drukowanie nie jest dostępne na tym urządzeniu."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Propozycja nazwy pliku"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Z datą"; -"settings_export_filename_title_only" = "Bez daty"; -"settings_export_filename_footer_with_date" = "Z datą: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Bez daty: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Symulacja zakończona."; -"sim_notice_infinite_loop_empty" = "Pętla nieskończona nie ma treści."; -"sim_notice_unsupported_statement_fmt" = "Nieobsługiwana instrukcja: %@"; -"sim_notice_invalid_expression_fmt" = "Nieprawidłowe wyrażenie: %@"; -"sim_notice_unknown_variable_fmt" = "Nieznana zmienna: %@"; -"sim_notice_division_by_zero" = "Dzielenie przez zero."; -"sim_notice_whole_number_expected" = "Wprowadź liczbę całkowitą."; -"sim_notice_number_expected" = "Wprowadź liczbę."; -"sim_notice_boolean_expected" = "Wpisz true lub false."; -"sim_notice_subprogram_not_found_fmt" = "Żaden otwarty diagram nie nazywa się %@. Wywołanie pominięto."; -"sim_notice_call_too_deep" = "Zbyt wiele zagnieżdżonych wywołań. Czy podprogram wywołuje sam siebie?"; - -"codegen_pseudocode_toggle" = "Pseudokod (kod niewykonywalny)"; -"codegen_pseudocode_note" = "Pseudokod – to nie jest wykonywalny program"; -"codegen_pseudocode_hint" = "Ten diagram jest oznaczony jako pseudokod. Kod jest tylko szkicem i nie można go uruchomić."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-BudCXCER.js b/website/app/assets/Localizable-BudCXCER.js deleted file mode 100644 index 5dd80e26..00000000 --- a/website/app/assets/Localizable-BudCXCER.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "요소"; -"inspector_header" = "개체 검사기"; - -/* Actions */ -"action_share_png" = "이미지 공유…"; -"action_share_document" = "파일 공유…"; -"action_export_pdf" = "PDF 미리보기…"; -"action_generate_code" = "코드 생성…"; -"action_simulation" = "시뮬레이션"; -"action_diagram" = "다이어그램"; -"simulation_placeholder_body" = "시뮬레이션 모드는 다이어그램을 단계별로 실행하고 현재 요소를 강조 표시하며 변수 값과 출력을 보여줍니다."; -"simulation_controls" = "제어"; -"simulation_highlight_label" = "강조 표시"; -"simulation_highlight_last" = "마지막 단계"; -"simulation_highlight_next" = "다음 단계"; -"simulation_not_available" = "Play는 각 단계마다 0.5초씩 쉬면서 시뮬레이션을 자동으로 실행합니다."; -"simulation_play" = "재생"; -"simulation_pause" = "일시정지"; -"simulation_step" = "단계"; -"simulation_stop" = "정지"; -"simulation_input" = "입력"; -"simulation_input_placeholder" = "입력이 필요하지 않습니다."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "정수를 입력하세요."; -"simulation_trace" = "마지막 단계"; -"simulation_trace_placeholder" = "아직 실행된 단계가 없습니다."; -"simulation_variables" = "변수"; -"simulation_variables_placeholder" = "아직 변수가 없습니다."; -"simulation_output" = "출력"; -"simulation_output_placeholder" = "아직 출력이 없습니다."; -"action_delete_selection" = "선택 삭제"; -"ctx_copy" = "복사"; -"ctx_cut" = "잘라내기"; -"ctx_paste" = "붙여넣기"; -"action_settings" = "설정"; -"action_about" = "VisuStruct 정보"; -"recent_files_menu" = "최근 파일"; -"recent_files_empty" = "최근 파일 없음"; -"recent_files_clear" = "목록 지우기"; -"recent_files_unavailable" = "파일을 더 이상 사용할 수 없습니다."; - -/* In-app settings */ -"settings_language_title" = "언어"; -"settings_language_de" = "독일어"; -"settings_language_en" = "영어"; -"settings_language_es" = "스페인어"; -"settings_language_fr" = "프랑스어"; -"settings_language_it" = "이탈리아어"; -"settings_language_pl" = "폴란드어"; -"settings_language_tr" = "터키어"; -"settings_language_ko" = "한국어"; -"settings_language_ja" = "일본어"; -"settings_language_el" = "그리스어"; -"settings_language_uk" = "우크라이나어"; -"settings_language_ar" = "아랍어"; -"settings_language_ru" = "러시아어"; -"settings_language_he" = "히브리어"; -"settings_language_zh_hans" = "중국어(간체)"; -"settings_language_zh_hant" = "중국어(번체)"; -"settings_language_ptpt" = "포르투갈어"; -"settings_language_java" = "Java(키워드)"; - - -/* Error overlay */ -"error_title" = "오류"; -"error_back_editor" = "편집기로 돌아가기"; - -/* Toolbar */ -"toolbar_undo" = "실행 취소"; -"toolbar_redo" = "다시 실행"; -"toolbar_new" = "새로 만들기"; -"menu_open" = "열기…"; -"menu_save" = "저장"; -"menu_save_as" = "다른 이름으로 저장…"; -"menu_print" = "인쇄…"; -"menu_file" = "파일"; -"menu_new" = "새로 만들기"; -"menu_close" = "닫기"; - -/* Accessibility */ -"a11y_generate_code" = "구조도에서 코드 생성"; -"a11y_generate_code_locked" = "코드 생성(구매 후 사용 가능)"; -"a11y_unsaved_changes" = "저장되지 않은 변경 사항"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "코드 생성"; -"codegen_gate_body" = "다이어그램에서 생성된 Java, Python, JavaScript 코드는 앱 내 구매로 잠금 해제됩니다(곧 제공)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "코드 생성기"; -"codegen_placeholder_body" = "생성된 코드는 여기에 표시됩니다."; -"codegen_placeholder_compare" = "Java, Python, JavaScript 간에 전환하여 문법을 비교하세요(아래 예시)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (조건) {\\n 문장();\\n} else {\\n 대안();\\n}"; -"codegen_preview_python" = "if 조건:\\n 문장()\\nelse:\\n 대안()"; -"codegen_copy" = "복사"; -"codegen_run_in_browser" = "브라우저에서 테스트"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "새 다이어그램 탭"; -"a11y_close_tab" = "탭 닫기"; - -"close_unsaved_title" = "저장되지 않은 변경사항"; -"close_unsaved_message" = "이 다이어그램에 저장되지 않은 변경사항이 있습니다. 닫기 전에 저장하시겠습니까?"; -"close_unsaved_discard" = "버리기"; -"close_unsaved_cancel" = "취소"; -"a11y_placeholder_drop" = "자리 표시자를 바꾸려면 여기에 요소를 놓으세요. 길게 눌러 드래그하여 이동할 수 있습니다."; -"a11y_node_drop" = "블록을 길게 누른 뒤 드래그하세요: 대상의 위/아래 가장자리에 놓으면 앞/뒤에 삽입됩니다. 가운데 놓기는 ø 자리 표시자에서만 가능합니다."; -"a11y_codegen_panel_drag" = "코드 생성기 패널을 움직이려면 드래그하세요"; - -/* Diagram */ -"diagram_title_label" = "제목"; -"diagram_title_placeholder" = "제목 없음"; - -/* Inspector */ -"inspector_no_selection" = "선택된 요소가 없습니다 — 타일을 탭하세요."; -"inspector_apply_text" = "텍스트 적용"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "종류"; -"inspector_io_mode_statement" = "명령문"; -"inspector_io_mode_input" = "입력"; -"inspector_io_mode_output" = "출력"; -"inspector_io_mode_help_java_like" = "입력: input: … | 출력: output: …"; -"inspector_add_case" = "케이스 추가"; -"inspector_remove_case" = "케이스 제거"; -"inspector_group_element" = "요소 텍스트"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "조건 입력…"; -"inspector_placeholder_selector" = "선택식 입력…"; -"inspector_placeholder_call" = "호출 입력…"; -"inspector_placeholder_break" = "주석(선택)"; - -/* Element types (Korean + keyword hint) */ -"element_anweisung" = "문장 (statement)"; -"element_verzweigung" = "조건문 (if/else)"; -"element_fallauswahl" = "선택문 (switch)"; -"element_forSchleife" = "반복문 (for)"; -"element_whileSchleife" = "반복문 (while)"; -"element_doUntilSchleife" = "반복문 (do-while)"; -"element_endlosschleife" = "무한 반복 (while true)"; -"element_aussprung" = "탈출 (break)"; -"element_aufruf" = "호출 (call)"; -"element_leerElement" = "빈 요소"; - -/* Tabs */ -"tab_title_format" = "다이어그램 %d"; - -/* Empty canvas */ -"canvas_empty_title" = "빈 구조도"; -"canvas_empty_hint" = "“요소”에서 블록을 여기로 드래그하세요."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "선택문 (switch)"; -"canvas_stub_anweisung" = "문장 (statement)"; -"canvas_stub_condition" = "조건"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "무한"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "호출()"; - -/* About */ -"about_version_fmt" = "버전 %@ (%@)"; -"about_nav_title" = "VisuStruct 정보"; -"about_features_heading" = "기능"; -"about_bullet_palette" = "팔레트에서 블록을 추가하거나 다이어그램으로 드래그하세요"; -"about_bullet_edit" = "다이어그램 편집: 텍스트 변경, 요소 선택, 필요 시 삭제"; -"about_bullet_tabs" = "탭에서 여러 다이어그램 — 각각 제목 포함"; -"about_bullet_file" = ".visustruct 파일로 저장하고 다시 열기"; -"about_bullet_share" = "구조도를 이미지(PNG)로 공유"; -"about_dateiformat_heading" = "파일 형식"; -"about_dateiformat_part1" = "VisuStruct의 기본 형식은 확장자 "; -"about_dateiformat_part2" = "를 사용합니다. 같은 형식을 지원하는 다른 앱과 교환할 수 있습니다."; -"about_dateiformat_strk" = ".strk 확장자 파일도 열 수 있습니다."; -"about_project_github_label" = "Java 앱(소스 및 릴리스):"; -"about_web_label" = "웹:"; -"about_developer_label" = "개발자:"; -"about_lineage_heading" = "계보"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java 업스트림:"; -"about_done" = "완료"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "삽입 취소"; -"phone_show_text_editor" = "텍스트 편집"; -"phone_hide_text_editor" = "접기"; -"phone_title_done" = "완료"; - -/* Alerts */ -"err_save_failed_fmt" = "저장할 수 없음: %@"; -"err_share_prepare_failed_fmt" = "공유를 준비할 수 없음: %@"; -"err_diagram_too_small_export" = "다이어그램이 너무 작아 내보낼 수 없습니다."; -"err_image_render_failed" = "이미지를 만들 수 없습니다."; -"err_diagram_too_small_print" = "다이어그램이 너무 작아 인쇄할 수 없습니다."; -"err_print_unavailable" = "이 기기에서는 인쇄를 사용할 수 없습니다."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "파일 이름 제안"; -"settings_export_filename_picker" = "형식"; -"settings_export_filename_date_title" = "날짜 포함"; -"settings_export_filename_title_only" = "날짜 없음"; -"settings_export_filename_footer_with_date" = "날짜 포함: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "날짜 없음: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "시뮬레이션이 끝났습니다."; -"sim_notice_infinite_loop_empty" = "무한 루프에 본문이 없습니다."; -"sim_notice_unsupported_statement_fmt" = "지원되지 않는 명령문: %@"; -"sim_notice_invalid_expression_fmt" = "잘못된 식: %@"; -"sim_notice_unknown_variable_fmt" = "알 수 없는 변수: %@"; -"sim_notice_division_by_zero" = "0으로 나눌 수 없습니다."; -"sim_notice_whole_number_expected" = "정수를 입력하세요."; -"sim_notice_number_expected" = "숫자를 입력하세요."; -"sim_notice_boolean_expected" = "true 또는 false를 입력하세요."; -"sim_notice_subprogram_not_found_fmt" = "%@(이)라는 열린 다이어그램이 없습니다. 호출을 건너뛰었습니다."; -"sim_notice_call_too_deep" = "중첩 호출이 너무 많습니다. 서브프로그램이 자기 자신을 호출하나요?"; - -"codegen_pseudocode_toggle" = "의사 코드(실행할 수 없는 코드)"; -"codegen_pseudocode_note" = "의사 코드 – 실행 가능한 프로그램이 아닙니다"; -"codegen_pseudocode_hint" = "이 다이어그램은 의사 코드로 표시되어 있습니다. 코드는 초안일 뿐이며 실행할 수 없습니다."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-ByPZS4RL.js b/website/app/assets/Localizable-ByPZS4RL.js deleted file mode 100644 index e17162dd..00000000 --- a/website/app/assets/Localizable-ByPZS4RL.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Éléments"; -"inspector_header" = "Inspecteur d’objets"; - -/* Actions */ -"action_share_png" = "Partager l’image…"; -"action_share_document" = "Partager le fichier…"; -"action_export_pdf" = "Aperçu PDF…"; -"action_generate_code" = "Générer le code…"; -"action_simulation" = "Simulation"; -"action_diagram" = "Diagramme"; -"simulation_placeholder_body" = "Le mode simulation exécute le diagramme étape par étape, met en évidence l’élément actuel et affiche les valeurs des variables et les sorties."; -"simulation_controls" = "Commandes"; -"simulation_highlight_label" = "Surlignage"; -"simulation_highlight_last" = "Dernière étape"; -"simulation_highlight_next" = "Étape suivante"; -"simulation_not_available" = "Play exécute automatiquement la simulation avec une pause de 0,5 seconde par étape."; -"simulation_play" = "Lecture"; -"simulation_pause" = "Pause"; -"simulation_step" = "Pas"; -"simulation_stop" = "Arrêt"; -"simulation_input" = "Entrée"; -"simulation_input_placeholder" = "Aucune entrée requise."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Veuillez saisir un nombre entier."; -"simulation_trace" = "Dernière étape"; -"simulation_trace_placeholder" = "Aucune étape exécutée pour l’instant."; -"simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Aucune variable pour l’instant."; -"simulation_output" = "Sortie"; -"simulation_output_placeholder" = "Aucune sortie pour l’instant."; -"action_delete_selection" = "Supprimer la sélection"; -"ctx_copy" = "Copier"; -"ctx_cut" = "Couper"; -"ctx_paste" = "Coller"; -"action_settings" = "Réglages"; -"action_about" = "À propos de VisuStruct"; -"recent_files_menu" = "Fichiers récents"; -"recent_files_empty" = "Aucun fichier récent"; -"recent_files_clear" = "Effacer la liste"; -"recent_files_unavailable" = "Le fichier n’est plus disponible."; - -/* In-app settings */ -"settings_language_title" = "Langue"; -"settings_language_de" = "Allemand"; -"settings_language_en" = "Anglais"; -"settings_language_es" = "Espagnol"; -"settings_language_fr" = "Français"; -"settings_language_it" = "Italien"; -"settings_language_pl" = "Polonais"; -"settings_language_tr" = "Turc"; -"settings_language_ko" = "Coréen"; -"settings_language_ja" = "Japonais"; -"settings_language_el" = "Grec"; -"settings_language_uk" = "Ukrainien"; -"settings_language_ar" = "Arabe"; -"settings_language_ru" = "Russe"; -"settings_language_he" = "Hébreu"; -"settings_language_zh_hans" = "Chinois (simplifié)"; -"settings_language_zh_hant" = "Chinois (traditionnel)"; -"settings_language_ptpt" = "Portugais"; -"settings_language_java" = "Java (mots‑clés)"; - - -/* Error overlay */ -"error_title" = "Erreur"; -"error_back_editor" = "Retour à l’éditeur"; - -/* Toolbar */ -"toolbar_undo" = "Annuler"; -"toolbar_redo" = "Rétablir"; -"toolbar_new" = "Nouveau"; -"menu_open" = "Ouvrir…"; -"menu_save" = "Enregistrer"; -"menu_save_as" = "Enregistrer sous…"; -"menu_print" = "Imprimer…"; -"menu_file" = "Fichier"; -"menu_new" = "Nouveau"; -"menu_close" = "Fermer"; - -/* Accessibility */ -"a11y_generate_code" = "Générer du code à partir de l’organigramme"; -"a11y_generate_code_locked" = "Générer du code, disponible après achat"; -"a11y_unsaved_changes" = "Modifications non enregistrées"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Générer le code"; -"codegen_gate_body" = "Le code Java, Python et JavaScript à partir de votre diagramme sera déverrouillé via un achat intégré (bientôt)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Générateur de code"; -"codegen_placeholder_body" = "Le code généré apparaîtra ici."; -"codegen_placeholder_compare" = "Passez entre Java, Python et JavaScript pour comparer la syntaxe (exemple ci‑dessous)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condition) {\\n instruction();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if condition:\\n instruction()\\nelse:\\n alternative()"; -"codegen_copy" = "Copier"; -"codegen_run_in_browser" = "Tester dans le navigateur"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Nouvel onglet de diagramme"; -"a11y_close_tab" = "Fermer l’onglet"; - -"close_unsaved_title" = "Modifications non enregistrées"; -"close_unsaved_message" = "Ce diagramme contient des modifications non enregistrées. Voulez-vous les enregistrer avant de fermer ?"; -"close_unsaved_discard" = "Ignorer"; -"close_unsaved_cancel" = "Annuler"; -"a11y_placeholder_drop" = "Déposez un élément ici pour remplacer l’espace réservé. Appuyez longuement pour glisser et déplacer."; -"a11y_node_drop" = "Appuyez longuement sur un bloc, puis faites glisser : déposez sur le bord haut ou bas pour insérer avant ou après. Dépôt au centre uniquement sur un espace réservé ø."; -"a11y_codegen_panel_drag" = "Glisser pour déplacer le panneau du générateur de code"; - -/* Diagram */ -"diagram_title_label" = "Titre"; -"diagram_title_placeholder" = "Sans titre"; - -/* Inspector */ -"inspector_no_selection" = "Aucun élément sélectionné — touchez une tuile."; -"inspector_apply_text" = "Appliquer le texte"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Type"; -"inspector_io_mode_statement" = "Instruction"; -"inspector_io_mode_input" = "Entrée"; -"inspector_io_mode_output" = "Sortie"; -"inspector_io_mode_help_java_like" = "Entrée: input: … | Sortie: output: …"; -"inspector_add_case" = "Ajouter un cas"; -"inspector_remove_case" = "Supprimer le cas"; -"inspector_group_element" = "Texte de l’élément"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Insérer une condition…"; -"inspector_placeholder_selector" = "Insérer un sélecteur…"; -"inspector_placeholder_call" = "Insérer un appel…"; -"inspector_placeholder_break" = "Commentaire (facultatif)"; - -/* Element types */ -"element_anweisung" = "Instruction"; -"element_verzweigung" = "Branche"; -"element_fallauswahl" = "Sélection"; -"element_forSchleife" = "Boucle for"; -"element_whileSchleife" = "Boucle while"; -"element_doUntilSchleife" = "Boucle do‑while"; -"element_endlosschleife" = "Boucle infinie"; -"element_aussprung" = "Sortie"; -"element_aufruf" = "Appel"; -"element_leerElement" = "Élément vide"; - -/* Tabs */ -"tab_title_format" = "Diagramme %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Organigramme vide"; -"canvas_empty_hint" = "Glissez un élément depuis « Éléments » ici."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Sélection"; -"canvas_stub_anweisung" = "Instruction"; -"canvas_stub_condition" = "Condition"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "infini"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Appel()"; - -/* About */ -"about_version_fmt" = "Version %@ (%@)"; -"about_nav_title" = "À propos de VisuStruct"; -"about_features_heading" = "Fonctionnalités"; -"about_bullet_palette" = "Insérer des blocs depuis la palette ou les glisser dans le diagramme"; -"about_bullet_edit" = "Modifier le diagramme : changer le texte, sélectionner des éléments et les supprimer si nécessaire"; -"about_bullet_tabs" = "Plusieurs diagrammes en onglets — chacun avec son titre"; -"about_bullet_file" = "Enregistrer et rouvrir des diagrammes en fichiers .visustruct"; -"about_bullet_share" = "Partager le diagramme comme image (PNG)"; -"about_dateiformat_heading" = "Format de fichier"; -"about_dateiformat_part1" = "Le format natif de VisuStruct utilise l’extension "; -"about_dateiformat_part2" = ". Vous pouvez conserver vos diagrammes et les échanger avec d’autres apps compatibles."; -"about_dateiformat_strk" = "Les fichiers avec l’extension .strk peuvent également être ouverts."; -"about_project_github_label" = "Application Java (code & versions) :"; -"about_web_label" = "Web :"; -"about_developer_label" = "Développeur :"; -"about_lineage_heading" = "Origine"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Upstream Java :"; -"about_done" = "Terminé"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Annuler l’insertion"; -"phone_show_text_editor" = "Modifier le texte"; -"phone_hide_text_editor" = "Réduire"; -"phone_title_done" = "OK"; - -/* Alerts */ -"err_save_failed_fmt" = "Impossible d’enregistrer : %@"; -"err_share_prepare_failed_fmt" = "Impossible de préparer le partage : %@"; -"err_diagram_too_small_export" = "Le diagramme est trop petit — rien à exporter."; -"err_image_render_failed" = "Impossible de créer l’image."; -"err_diagram_too_small_print" = "Le diagramme est trop petit — rien à imprimer."; -"err_print_unavailable" = "L’impression n’est pas disponible sur cet appareil."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Suggestion de nom de fichier"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Avec date"; -"settings_export_filename_title_only" = "Sans date"; -"settings_export_filename_footer_with_date" = "Avec date: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Sans date: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulation terminée."; -"sim_notice_infinite_loop_empty" = "La boucle infinie n’a pas de corps."; -"sim_notice_unsupported_statement_fmt" = "Instruction non prise en charge : %@"; -"sim_notice_invalid_expression_fmt" = "Expression non valide : %@"; -"sim_notice_unknown_variable_fmt" = "Variable inconnue : %@"; -"sim_notice_division_by_zero" = "Division par zéro."; -"sim_notice_whole_number_expected" = "Saisissez un nombre entier."; -"sim_notice_number_expected" = "Saisissez un nombre."; -"sim_notice_boolean_expected" = "Saisissez true ou false."; -"sim_notice_subprogram_not_found_fmt" = "Aucun diagramme ouvert ne s’appelle %@. L’appel a été ignoré."; -"sim_notice_call_too_deep" = "Trop d’appels imbriqués. Un sous-programme s’appelle-t-il lui-même ?"; - -"codegen_pseudocode_toggle" = "Pseudo-code (code non exécutable)"; -"codegen_pseudocode_note" = "Pseudo-code – pas un programme exécutable"; -"codegen_pseudocode_hint" = "Ce diagramme est marqué comme pseudo-code. Le code n’est qu’une ébauche et ne peut pas être exécuté."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-CHv0OL9S.js b/website/app/assets/Localizable-CHv0OL9S.js deleted file mode 100644 index e34630d6..00000000 --- a/website/app/assets/Localizable-CHv0OL9S.js +++ /dev/null @@ -1,256 +0,0 @@ -const e=`/* Paleta */ -"palette_header" = "Elementos"; -"inspector_header" = "Inspetor de objetos"; - -/* Ações */ -"action_share_png" = "Partilhar gráfico…"; -"action_share_document" = "Partilhar ficheiro…"; -"action_export_pdf" = "Pré-visualizar PDF…"; -"action_generate_code" = "Gerar código…"; -"action_simulation" = "Simulação"; -"action_diagram" = "Diagrama"; -"simulation_placeholder_body" = "O modo de simulação executa o diagrama passo a passo, destaca o elemento atual e mostra os valores das variáveis e a saída."; -"simulation_controls" = "Controlos"; -"simulation_highlight_label" = "Destaque"; -"simulation_highlight_last" = "Último passo"; -"simulation_highlight_next" = "Próximo passo"; -"simulation_not_available" = "Play executa a simulação automaticamente com uma pausa de 0,5 segundos por passo."; -"simulation_play" = "Reproduzir"; -"simulation_pause" = "Pausa"; -"simulation_step" = "Passo"; -"simulation_stop" = "Parar"; -"simulation_input" = "Entrada"; -"simulation_input_placeholder" = "Nenhuma entrada necessária."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Introduza um número inteiro."; -"simulation_trace" = "Último passo"; -"simulation_trace_placeholder" = "Ainda não foi executado nenhum passo."; -"simulation_variables" = "Variáveis"; -"simulation_variables_placeholder" = "Ainda não há variáveis."; -"simulation_output" = "Saída"; -"simulation_output_placeholder" = "Ainda não há saída."; -"action_delete_selection" = "Eliminar seleção"; -"ctx_copy" = "Copiar"; -"ctx_cut" = "Cortar"; -"ctx_paste" = "Colar"; -"action_settings" = "Definições"; -"action_about" = "Acerca do VisuStruct"; -"recent_files_menu" = "Recentes"; -"recent_files_empty" = "Sem ficheiros recentes"; -"recent_files_clear" = "Limpar lista"; -"recent_files_unavailable" = "O ficheiro já não está disponível."; - -/* Definições (na app) */ -"settings_language_title" = "Idioma"; -"settings_language_de" = "Alemão"; -"settings_language_en" = "Inglês"; -"settings_language_es" = "Espanhol"; -"settings_language_fr" = "Francês"; -"settings_language_it" = "Italiano"; -"settings_language_pl" = "Polaco"; -"settings_language_tr" = "Turco"; -"settings_language_ko" = "Coreano"; -"settings_language_ja" = "Japonês"; -"settings_language_el" = "Grego"; -"settings_language_uk" = "Ucraniano"; -"settings_language_ar" = "Árabe"; -"settings_language_ru" = "Russo"; -"settings_language_he" = "Hebraico"; -"settings_language_zh_hans" = "Chinês (simplificado)"; -"settings_language_zh_hant" = "Chinês (tradicional)"; -"settings_language_ptpt" = "Português"; -"settings_language_java" = "Java (palavras-chave)"; - - - -/* Erro */ -"error_title" = "Erro"; -"error_back_editor" = "Voltar ao editor"; - -/* Barra de ferramentas */ -"toolbar_undo" = "Anular"; -"toolbar_redo" = "Refazer"; -"toolbar_new" = "Novo"; -"menu_open" = "Abrir…"; -"menu_save" = "Guardar"; -"menu_save_as" = "Guardar como…"; -"menu_print" = "Imprimir…"; -"menu_file" = "Ficheiro"; -"menu_new" = "Novo"; -"menu_close" = "Fechar"; - -/* Acessibilidade */ -"a11y_generate_code" = "Gerar código a partir do diagrama"; -"a11y_generate_code_locked" = "Gerar código, disponível após comprar"; -"a11y_unsaved_changes" = "Alterações não guardadas"; - -/* Gerador de código (compra na app em breve) */ -"codegen_gate_title" = "Gerar código"; -"codegen_gate_body" = "O código Java, Python e JavaScript a partir do diagrama ficará disponível com uma compra na aplicação (em breve)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Gerador de código"; -"codegen_placeholder_body" = "O código gerado aparecerá aqui."; -"codegen_placeholder_compare" = "Alterne entre Java, Python e JavaScript para comparar a sintaxe (exemplo abaixo)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condicao) {\\n instrucao();\\n} else {\\n alternativa();\\n}"; -"codegen_preview_python" = "if condicao:\\n instrucao()\\nelse:\\n alternativa()"; -"codegen_generated_hint" = "Pré-visualização a partir do diagrama atual (Java 17, Python 3.10+, JavaScript moderno)."; -"codegen_copy" = "Copiar"; -"codegen_run_in_browser" = "Testar no navegador"; -"codegen_save_java" = "Guardar Java…"; -"codegen_java_output_mode" = "Saída Java"; -"codegen_java_output_snippet" = "Excerto"; -"codegen_java_output_class" = "Classe"; -"a11y_new_diagram_tab" = "Novo separador de diagrama"; -"a11y_close_tab" = "Fechar separador"; - -"close_unsaved_title" = "Alterações não guardadas"; -"close_unsaved_message" = "Este diagrama contém alterações não guardadas. Pretende guardá-las antes de fechar?"; -"close_unsaved_discard" = "Descartar"; -"close_unsaved_cancel" = "Cancelar"; -"a11y_placeholder_drop" = "Largue aqui um elemento para substituir o marcador. Mantenha premido para arrastar e mover."; -"a11y_node_drop" = "Mantenha premido um bloco e arraste: largue na borda superior ou inferior do destino (antes/depois). No centro só em marcador ø."; -"a11y_codegen_panel_drag" = "Arraste para mover o painel do gerador de código"; - -/* Diagrama */ -"diagram_title_label" = "Título"; -"diagram_title_placeholder" = "Sem título"; - -/* Inspetor */ -"inspector_no_selection" = "Nenhum elemento selecionado — toque num bloco."; -"inspector_apply_text" = "Aplicar texto"; -"inspector_for_init" = "Início"; -"inspector_for_condition" = "Condição"; -"inspector_for_step" = "Passo"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Tipo"; -"inspector_io_mode_statement" = "Instrução"; -"inspector_io_mode_input" = "Entrada"; -"inspector_io_mode_output" = "Saída"; -"inspector_io_mode_help_java_like" = "Entrada: input: … | Saída: output: …"; -"inspector_add_case" = "Adicionar caso"; -"inspector_remove_case" = "Remover caso"; -"inspector_group_element" = "Texto do elemento"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Inserir condição…"; -"inspector_placeholder_selector" = "Inserir seletor…"; -"inspector_placeholder_call" = "Inserir chamada…"; -"inspector_placeholder_break" = "Comentário (opcional)"; - -/* Tipos de elemento */ -"element_anweisung" = "Instrução"; -"element_verzweigung" = "Decisão"; -"element_fallauswahl" = "Seleção"; -"element_forSchleife" = "Ciclo for"; -"element_whileSchleife" = "Ciclo while"; -"element_doUntilSchleife" = "Ciclo do-while"; -"element_endlosschleife" = "Ciclo infinito"; -"element_aussprung" = "Interrupção"; -"element_aufruf" = "Chamada"; -"element_leerElement" = "Elemento vazio"; - -/* Separadores */ -"tab_title_format" = "Diagrama %d"; - -/* Ecrã vazio */ -"canvas_empty_title" = "Diagrama vazio"; -"canvas_empty_hint" = "Arraste um elemento de «Elementos» para aqui."; - -/* Diagrama: textos de elementos novos e cabeçalhos de coluna (exibição) */ -"canvas_stub_fallauswahl" = "Seleção"; -"canvas_stub_anweisung" = "Instrução"; -"canvas_stub_condition" = "Condição"; -"canvas_stub_for" = "for 0 < i < quantidade"; -"canvas_stub_while" = "enquanto …"; -"canvas_stub_until" = "até …"; -"canvas_stub_endless" = "infinito"; -"canvas_stub_break" = "parar"; -"canvas_stub_call" = "Chamada()"; - -/* Acerca */ -"about_version_fmt" = "Versão %@ (%@)"; -"about_nav_title" = "Acerca do VisuStruct"; -"about_features_heading" = "Funcionalidades"; -"about_bullet_palette" = "Inserir blocos a partir da paleta ou arrastá-los para o diagrama"; -"about_bullet_edit" = "Editar o diagrama: alterar textos, selecionar elementos e removê-los se necessário"; -"about_bullet_tabs" = "Vários diagramas em separadores — cada um com o seu título"; -"about_bullet_file" = "Guardar e reabrir diagramas como ficheiros .visustruct"; -"about_bullet_share" = "Partilhar o diagrama estruturado como imagem (PNG)"; -"about_dateiformat_heading" = "Formato do ficheiro"; -"about_dateiformat_part1" = "O formato nativo do VisuStruct utiliza a extensão "; -"about_dateiformat_part2" = ". Pode guardar diagramas e trocá-los com outras apps que suportem o mesmo formato."; -"about_dateiformat_strk" = "Também é possível abrir ficheiros com a extensão .strk."; -"about_project_github_label" = "App Java (código-fonte e releases):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Programador:"; -"about_lineage_heading" = "Origem"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Upstream Java:"; -"about_done" = "Concluído"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: inserir por toque */ -"phone_insert_cancel" = "Cancelar inserção"; -"phone_show_text_editor" = "Editar texto"; -"phone_hide_text_editor" = "Recolher"; -"phone_title_done" = "OK"; - -/* Alertas */ -"err_save_failed_fmt" = "Não foi possível guardar: %@"; -"err_share_prepare_failed_fmt" = "Não foi possível preparar a partilha: %@"; -"err_diagram_too_small_export" = "O diagrama é demasiado pequeno — nada para exportar."; -"err_image_render_failed" = "Não foi possível criar a imagem."; -"err_diagram_too_small_print" = "O diagrama é demasiado pequeno — nada para imprimir."; -"err_print_unavailable" = "A impressão não está disponível neste dispositivo."; - -"settings_ui_scale_section" = "Tamanho do texto"; -"settings_ui_scale_canvas" = "Diagrama"; -"settings_ui_scale_inspector" = "Introdução de texto em baixo"; -"settings_ui_scale_small" = "Pequeno"; -"settings_ui_scale_medium" = "Médio"; -"settings_ui_scale_large" = "Grande"; -"settings_ui_scale_extra_large" = "Muito grande"; - -"settings_export_filename_section" = "Sugestão de nome de ficheiro"; -"settings_export_filename_picker" = "Formato"; -"settings_export_filename_date_title" = "Com data"; -"settings_export_filename_title_only" = "Sem data"; -"settings_export_filename_footer_with_date" = "Com data: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Sem data: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulação terminada."; -"sim_notice_infinite_loop_empty" = "O ciclo infinito não tem corpo."; -"sim_notice_unsupported_statement_fmt" = "Instrução não suportada: %@"; -"sim_notice_invalid_expression_fmt" = "Expressão inválida: %@"; -"sim_notice_unknown_variable_fmt" = "Variável desconhecida: %@"; -"sim_notice_division_by_zero" = "Divisão por zero."; -"sim_notice_whole_number_expected" = "Introduza um número inteiro."; -"sim_notice_number_expected" = "Introduza um número."; -"sim_notice_boolean_expected" = "Introduza true ou false."; -"sim_notice_subprogram_not_found_fmt" = "Nenhum diagrama aberto se chama %@. A chamada foi ignorada."; -"sim_notice_call_too_deep" = "Demasiadas chamadas aninhadas. Um subprograma chama-se a si próprio?"; - -"codegen_pseudocode_toggle" = "Pseudocódigo (código não executável)"; -"codegen_pseudocode_note" = "Pseudocódigo – não é um programa executável"; -"codegen_pseudocode_hint" = "Este diagrama está marcado como pseudocódigo. O código é apenas um esboço e não pode ser executado."; - -"course_title" = "Curso"; -"course_intro" = "Aprender a programar passo a passo: do primeiro diagrama ao teu próprio programa em Java."; -"course_bullet_lessons" = "Todas as lições com explicações, testes e exercícios"; -"course_bullet_java" = "Tarefas de programação «Agora em Java» em cada lição"; -"course_bullet_games" = "Jogos de aprendizagem e dicas graduais"; -"course_bullet_once" = "Compra uma vez e usa no iPhone, iPad e Mac"; -"course_unlocked" = "Curso desbloqueado – obrigado!"; -"course_free_note" = "Criar diagramas, a simulação e a exportação de código continuam gratuitos."; -"course_restore" = "Restaurar compras"; -"course_restore_done" = "A tua compra do curso foi restaurada."; -"course_restore_none" = "Não foi encontrada nenhuma compra do curso para esta Conta Apple."; -"course_unavailable" = "Neste momento não é possível carregar o curso da App Store. Verifica a ligação à internet e tenta mais tarde."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-CaVEL1es.js b/website/app/assets/Localizable-CaVEL1es.js deleted file mode 100644 index 74e69fc5..00000000 --- a/website/app/assets/Localizable-CaVEL1es.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "元素"; -"inspector_header" = "对象检查器"; - -/* Actions */ -"action_share_png" = "分享图片…"; -"action_share_document" = "分享文件…"; -"action_export_pdf" = "PDF 预览…"; -"action_generate_code" = "生成代码…"; -"action_simulation" = "模拟"; -"action_diagram" = "图表"; -"simulation_placeholder_body" = "模拟模式会逐步运行图表,突出显示当前元素,并显示变量值和输出。"; -"simulation_controls" = "控制"; -"simulation_highlight_label" = "高亮"; -"simulation_highlight_last" = "上一步"; -"simulation_highlight_next" = "下一步"; -"simulation_not_available" = "Play 会自动运行模拟,每步暂停 0.5 秒。"; -"simulation_play" = "播放"; -"simulation_pause" = "暂停"; -"simulation_step" = "单步"; -"simulation_stop" = "停止"; -"simulation_input" = "输入"; -"simulation_input_placeholder" = "不需要输入。"; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "请输入一个整数。"; -"simulation_trace" = "上一步"; -"simulation_trace_placeholder" = "尚未执行任何步骤。"; -"simulation_variables" = "变量"; -"simulation_variables_placeholder" = "暂无变量。"; -"simulation_output" = "输出"; -"simulation_output_placeholder" = "暂无输出。"; -"action_delete_selection" = "删除所选"; -"ctx_copy" = "复制"; -"ctx_cut" = "剪切"; -"ctx_paste" = "粘贴"; -"action_settings" = "设置"; -"action_about" = "关于 VisuStruct"; -"recent_files_menu" = "最近文件"; -"recent_files_empty" = "没有最近文件"; -"recent_files_clear" = "清除列表"; -"recent_files_unavailable" = "文件不再可用。"; - -/* In-app settings */ -"settings_language_title" = "语言"; -"settings_language_de" = "德语"; -"settings_language_en" = "英语"; -"settings_language_es" = "西班牙语"; -"settings_language_fr" = "法语"; -"settings_language_it" = "意大利语"; -"settings_language_pl" = "波兰语"; -"settings_language_tr" = "土耳其语"; -"settings_language_ko" = "韩语"; -"settings_language_ja" = "日语"; -"settings_language_el" = "希腊语"; -"settings_language_uk" = "乌克兰语"; -"settings_language_ar" = "阿拉伯语"; -"settings_language_ru" = "俄语"; -"settings_language_he" = "希伯来语"; -"settings_language_zh_hans" = "中文(简体)"; -"settings_language_zh_hant" = "中文(繁體)"; -"settings_language_ptpt" = "葡萄牙语"; -"settings_language_java" = "Java(关键词)"; - - -/* Error overlay */ -"error_title" = "错误"; -"error_back_editor" = "返回编辑器"; - -/* Toolbar */ -"toolbar_undo" = "撤销"; -"toolbar_redo" = "重做"; -"toolbar_new" = "新建"; -"menu_open" = "打开…"; -"menu_save" = "保存"; -"menu_save_as" = "另存为…"; -"menu_print" = "打印…"; -"menu_file" = "文件"; -"menu_new" = "新建"; -"menu_close" = "关闭"; - -/* Accessibility */ -"a11y_generate_code" = "从结构图生成代码"; -"a11y_generate_code_locked" = "生成代码(购买后可用)"; -"a11y_unsaved_changes" = "未保存的更改"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "生成代码"; -"codegen_gate_body" = "将通过应用内购买解锁从图表生成的 Java、Python 和 JavaScript 代码(即将推出)。"; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "代码生成器"; -"codegen_placeholder_body" = "生成的代码会显示在这里。"; -"codegen_placeholder_compare" = "在 Java、Python 和 JavaScript 之间切换以比较语法(下方示例)。"; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (条件) {\\n 语句();\\n} else {\\n 替代();\\n}"; -"codegen_preview_python" = "if 条件:\\n 语句()\\nelse:\\n 替代()"; -"codegen_copy" = "复制"; -"codegen_run_in_browser" = "在浏览器中测试"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "新建图表标签页"; -"a11y_close_tab" = "关闭标签页"; - -"close_unsaved_title" = "未保存的更改"; -"close_unsaved_message" = "此图表包含未保存的更改。关闭前要保存吗?"; -"close_unsaved_discard" = "放弃"; -"close_unsaved_cancel" = "取消"; -"a11y_placeholder_drop" = "将元素拖放到这里以替换占位符。长按可拖动移动。"; -"a11y_node_drop" = "长按块并拖动:在目标上边缘或下边缘放下以插入到前/后。仅在 ø 占位符上可居中放下。"; -"a11y_codegen_panel_drag" = "拖移以移动代码生成器面板"; - -/* Diagram */ -"diagram_title_label" = "标题"; -"diagram_title_placeholder" = "无标题"; - -/* Inspector */ -"inspector_no_selection" = "未选择元素 — 点击一个块。"; -"inspector_apply_text" = "应用文本"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "类型"; -"inspector_io_mode_statement" = "语句"; -"inspector_io_mode_input" = "输入"; -"inspector_io_mode_output" = "输出"; -"inspector_io_mode_help_java_like" = "输入: input: … | 输出: output: …"; -"inspector_add_case" = "添加分支"; -"inspector_remove_case" = "移除分支"; -"inspector_group_element" = "元素文本"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "输入条件…"; -"inspector_placeholder_selector" = "输入选择式…"; -"inspector_placeholder_call" = "输入调用…"; -"inspector_placeholder_break" = "注释(可选)"; - -/* Element types */ -"element_anweisung" = "语句"; -"element_verzweigung" = "分支"; -"element_fallauswahl" = "选择"; -"element_forSchleife" = "for 循环"; -"element_whileSchleife" = "while 循环"; -"element_doUntilSchleife" = "do-while 循环"; -"element_endlosschleife" = "无限循环"; -"element_aussprung" = "跳出"; -"element_aufruf" = "调用"; -"element_leerElement" = "空元素"; - -/* Tabs */ -"tab_title_format" = "图表 %d"; - -/* Empty canvas */ -"canvas_empty_title" = "空结构图"; -"canvas_empty_hint" = "从“元素”中拖拽一个块到这里。"; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "选择"; -"canvas_stub_anweisung" = "语句"; -"canvas_stub_condition" = "条件"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "无限"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "调用()"; - -/* About */ -"about_version_fmt" = "版本 %@ (%@)"; -"about_nav_title" = "关于 VisuStruct"; -"about_features_heading" = "功能"; -"about_bullet_palette" = "从调色板插入块,或拖入图表"; -"about_bullet_edit" = "编辑图表:修改文本、选择元素,必要时删除"; -"about_bullet_tabs" = "多个图表标签页——每个都有自己的标题"; -"about_bullet_file" = "将图表保存并以 .visustruct 文件重新打开"; -"about_bullet_share" = "将结构图分享为图片(PNG)"; -"about_dateiformat_heading" = "文件格式"; -"about_dateiformat_part1" = "VisuStruct 的原生格式使用扩展名 "; -"about_dateiformat_part2" = "。你可以保存图表,并与支持相同格式的应用交换。"; -"about_dateiformat_strk" = "也可以打开 .strk 扩展名的文件。"; -"about_project_github_label" = "Java 应用(源码与版本):"; -"about_web_label" = "网页:"; -"about_developer_label" = "开发者:"; -"about_lineage_heading" = "来源"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java 上游:"; -"about_done" = "完成"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "取消插入"; -"phone_show_text_editor" = "编辑文本"; -"phone_hide_text_editor" = "收起"; -"phone_title_done" = "完成"; - -/* Alerts */ -"err_save_failed_fmt" = "无法保存:%@"; -"err_share_prepare_failed_fmt" = "无法准备分享:%@"; -"err_diagram_too_small_export" = "图表太小——无内容可导出。"; -"err_image_render_failed" = "无法创建图片。"; -"err_diagram_too_small_print" = "图表太小——无内容可打印。"; -"err_print_unavailable" = "此设备不支持打印。"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "文件名建议"; -"settings_export_filename_picker" = "格式"; -"settings_export_filename_date_title" = "含日期"; -"settings_export_filename_title_only" = "不含日期"; -"settings_export_filename_footer_with_date" = "含日期: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "不含日期: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "模拟已结束。"; -"sim_notice_infinite_loop_empty" = "无限循环没有循环体。"; -"sim_notice_unsupported_statement_fmt" = "不支持的语句:%@"; -"sim_notice_invalid_expression_fmt" = "无效的表达式:%@"; -"sim_notice_unknown_variable_fmt" = "未知变量:%@"; -"sim_notice_division_by_zero" = "除数为零。"; -"sim_notice_whole_number_expected" = "请输入整数。"; -"sim_notice_number_expected" = "请输入数字。"; -"sim_notice_boolean_expected" = "请输入 true 或 false。"; -"sim_notice_subprogram_not_found_fmt" = "没有名为 %@ 的已打开图表。已跳过该调用。"; -"sim_notice_call_too_deep" = "嵌套调用过多。是否有子程序调用了自身?"; - -"codegen_pseudocode_toggle" = "伪代码(不可运行的代码)"; -"codegen_pseudocode_note" = "伪代码 – 不是可运行的程序"; -"codegen_pseudocode_hint" = "此图已标记为伪代码。代码只是草稿,无法运行。"; -`;export{e as default}; diff --git a/website/app/assets/Localizable-CkJEmEEP.js b/website/app/assets/Localizable-CkJEmEEP.js deleted file mode 100644 index 32b34aa8..00000000 --- a/website/app/assets/Localizable-CkJEmEEP.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "要素"; -"inspector_header" = "オブジェクトインスペクタ"; - -/* Actions */ -"action_share_png" = "画像を共有…"; -"action_share_document" = "ファイルを共有…"; -"action_export_pdf" = "PDF をプレビュー…"; -"action_generate_code" = "コード生成…"; -"action_simulation" = "シミュレーション"; -"action_diagram" = "図"; -"simulation_placeholder_body" = "シミュレーションモードは図をステップごとに実行し、現在の要素を強調表示して、変数の値と出力を表示します。"; -"simulation_controls" = "操作"; -"simulation_highlight_label" = "ハイライト"; -"simulation_highlight_last" = "前のステップ"; -"simulation_highlight_next" = "次のステップ"; -"simulation_not_available" = "Play は各ステップごとに0.5秒停止しながらシミュレーションを自動実行します。"; -"simulation_play" = "再生"; -"simulation_pause" = "一時停止"; -"simulation_step" = "ステップ"; -"simulation_stop" = "停止"; -"simulation_input" = "入力"; -"simulation_input_placeholder" = "入力は不要です。"; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "整数を入力してください。"; -"simulation_trace" = "最後のステップ"; -"simulation_trace_placeholder" = "まだステップは実行されていません。"; -"simulation_variables" = "変数"; -"simulation_variables_placeholder" = "まだ変数はありません。"; -"simulation_output" = "出力"; -"simulation_output_placeholder" = "まだ出力はありません。"; -"action_delete_selection" = "選択を削除"; -"ctx_copy" = "コピー"; -"ctx_cut" = "切り取り"; -"ctx_paste" = "貼り付け"; -"action_settings" = "設定"; -"action_about" = "VisuStruct について"; -"recent_files_menu" = "最近使ったファイル"; -"recent_files_empty" = "最近使ったファイルはありません"; -"recent_files_clear" = "リストを消去"; -"recent_files_unavailable" = "ファイルは利用できなくなりました。"; - -/* In-app settings */ -"settings_language_title" = "言語"; -"settings_language_de" = "ドイツ語"; -"settings_language_en" = "英語"; -"settings_language_es" = "スペイン語"; -"settings_language_fr" = "フランス語"; -"settings_language_it" = "イタリア語"; -"settings_language_pl" = "ポーランド語"; -"settings_language_tr" = "トルコ語"; -"settings_language_ko" = "韓国語"; -"settings_language_ja" = "日本語"; -"settings_language_el" = "ギリシャ語"; -"settings_language_uk" = "ウクライナ語"; -"settings_language_ar" = "アラビア語"; -"settings_language_ru" = "ロシア語"; -"settings_language_he" = "ヘブライ語"; -"settings_language_zh_hans" = "中国語(簡体字)"; -"settings_language_zh_hant" = "中国語(繁体字)"; -"settings_language_ptpt" = "ポルトガル語"; -"settings_language_java" = "Java(キーワード)"; - - -/* Error overlay */ -"error_title" = "エラー"; -"error_back_editor" = "エディタに戻る"; - -/* Toolbar */ -"toolbar_undo" = "取り消し"; -"toolbar_redo" = "やり直し"; -"toolbar_new" = "新規"; -"menu_open" = "開く…"; -"menu_save" = "保存"; -"menu_save_as" = "別名で保存…"; -"menu_print" = "印刷…"; -"menu_file" = "ファイル"; -"menu_new" = "新規"; -"menu_close" = "閉じる"; - -/* Accessibility */ -"a11y_generate_code" = "構造図からコードを生成"; -"a11y_generate_code_locked" = "コード生成(購入後に利用可能)"; -"a11y_unsaved_changes" = "未保存の変更"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "コード生成"; -"codegen_gate_body" = "図から生成される Java、Python、JavaScript のコードはアプリ内課金で利用可能になります(近日公開)。"; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "コード生成"; -"codegen_placeholder_body" = "生成されたコードはここに表示されます。"; -"codegen_placeholder_compare" = "Java、Python、JavaScript を切り替えて構文を比較できます(下の例)。"; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (条件) {\\n 文();\\n} else {\\n 代替();\\n}"; -"codegen_preview_python" = "if 条件:\\n 文()\\nelse:\\n 代替()"; -"codegen_copy" = "コピー"; -"codegen_run_in_browser" = "ブラウザでテスト"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "新しい図のタブ"; -"a11y_close_tab" = "タブを閉じる"; - -"close_unsaved_title" = "未保存の変更"; -"close_unsaved_message" = "この図には未保存の変更があります。閉じる前に保存しますか?"; -"close_unsaved_discard" = "破棄"; -"close_unsaved_cancel" = "キャンセル"; -"a11y_placeholder_drop" = "要素をここにドロップしてプレースホルダーを置き換えます。長押ししてドラッグし移動できます。"; -"a11y_node_drop" = "ブロックを長押ししてドラッグ:対象の上端/下端にドロップすると前/後に挿入。中央へのドロップは ø プレースホルダーのみ。"; -"a11y_codegen_panel_drag" = "ドラッグしてコード生成パネルを移動"; - -/* Diagram */ -"diagram_title_label" = "タイトル"; -"diagram_title_placeholder" = "タイトルなし"; - -/* Inspector */ -"inspector_no_selection" = "要素が選択されていません — タイルをタップしてください。"; -"inspector_apply_text" = "テキストを適用"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "種類"; -"inspector_io_mode_statement" = "文"; -"inspector_io_mode_input" = "入力"; -"inspector_io_mode_output" = "出力"; -"inspector_io_mode_help_java_like" = "入力: input: … | 出力: output: …"; -"inspector_add_case" = "ケースを追加"; -"inspector_remove_case" = "ケースを削除"; -"inspector_group_element" = "要素テキスト"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "条件を入力…"; -"inspector_placeholder_selector" = "セレクタを入力…"; -"inspector_placeholder_call" = "呼び出しを入力…"; -"inspector_placeholder_break" = "コメント(任意)"; - -/* Element types (Japanese + keyword hint) */ -"element_anweisung" = "文 (statement)"; -"element_verzweigung" = "条件分岐 (if/else)"; -"element_fallauswahl" = "選択 (switch)"; -"element_forSchleife" = "繰り返し (for)"; -"element_whileSchleife" = "繰り返し (while)"; -"element_doUntilSchleife" = "繰り返し (do-while)"; -"element_endlosschleife" = "無限ループ (while true)"; -"element_aussprung" = "脱出 (break)"; -"element_aufruf" = "呼び出し (call)"; -"element_leerElement" = "空の要素"; - -/* Tabs */ -"tab_title_format" = "図 %d"; - -/* Empty canvas */ -"canvas_empty_title" = "空の構造図"; -"canvas_empty_hint" = "「要素」からブロックをここにドラッグしてください。"; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "選択 (switch)"; -"canvas_stub_anweisung" = "文 (statement)"; -"canvas_stub_condition" = "条件"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "無限"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "呼び出し()"; - -/* About */ -"about_version_fmt" = "バージョン %@ (%@)"; -"about_nav_title" = "VisuStruct について"; -"about_features_heading" = "機能"; -"about_bullet_palette" = "パレットからブロックを挿入、または図へドラッグ&ドロップ"; -"about_bullet_edit" = "図を編集:テキスト変更、要素選択、必要に応じて削除"; -"about_bullet_tabs" = "複数の図をタブで管理(それぞれタイトル付き)"; -"about_bullet_file" = ".visustruct ファイルとして保存し再度開く"; -"about_bullet_share" = "構造図を画像(PNG)として共有"; -"about_dateiformat_heading" = "ファイル形式"; -"about_dateiformat_part1" = "VisuStruct のネイティブ形式は拡張子 "; -"about_dateiformat_part2" = " を使用します。同じ形式をサポートする他のアプリと交換できます。"; -"about_dateiformat_strk" = ".strk 拡張子のファイルも開けます。"; -"about_project_github_label" = "Java アプリ(ソース&リリース):"; -"about_web_label" = "Web:"; -"about_developer_label" = "開発者:"; -"about_lineage_heading" = "系譜"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "完了"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "挿入をキャンセル"; -"phone_show_text_editor" = "テキストを編集"; -"phone_hide_text_editor" = "折りたたむ"; -"phone_title_done" = "完了"; - -/* Alerts */ -"err_save_failed_fmt" = "保存できませんでした:%@"; -"err_share_prepare_failed_fmt" = "共有の準備ができませんでした:%@"; -"err_diagram_too_small_export" = "図が小さすぎます — エクスポートできません。"; -"err_image_render_failed" = "画像を作成できませんでした。"; -"err_diagram_too_small_print" = "図が小さすぎます — 印刷できません。"; -"err_print_unavailable" = "このデバイスでは印刷できません。"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "ファイル名の候補"; -"settings_export_filename_picker" = "形式"; -"settings_export_filename_date_title" = "日付あり"; -"settings_export_filename_title_only" = "日付なし"; -"settings_export_filename_footer_with_date" = "日付あり: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "日付なし: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "シミュレーションが終了しました。"; -"sim_notice_infinite_loop_empty" = "無限ループに本体がありません。"; -"sim_notice_unsupported_statement_fmt" = "サポートされていない文: %@"; -"sim_notice_invalid_expression_fmt" = "無効な式: %@"; -"sim_notice_unknown_variable_fmt" = "不明な変数: %@"; -"sim_notice_division_by_zero" = "0 で割ることはできません。"; -"sim_notice_whole_number_expected" = "整数を入力してください。"; -"sim_notice_number_expected" = "数値を入力してください。"; -"sim_notice_boolean_expected" = "true または false を入力してください。"; -"sim_notice_subprogram_not_found_fmt" = "%@ という名前の開いている図はありません。呼び出しをスキップしました。"; -"sim_notice_call_too_deep" = "呼び出しの入れ子が多すぎます。サブプログラムが自分自身を呼び出していませんか?"; - -"codegen_pseudocode_toggle" = "疑似コード(実行できないコード)"; -"codegen_pseudocode_note" = "疑似コード – 実行可能なプログラムではありません"; -"codegen_pseudocode_hint" = "この図は疑似コードとしてマークされています。コードは下書きにすぎず、実行できません。"; -`;export{e as default}; diff --git a/website/app/assets/Localizable-CxCno28C.js b/website/app/assets/Localizable-CxCno28C.js deleted file mode 100644 index 61b9585a..00000000 --- a/website/app/assets/Localizable-CxCno28C.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "العناصر"; -"inspector_header" = "مفتش الكائنات"; - -/* Actions */ -"action_share_png" = "مشاركة الصورة…"; -"action_share_document" = "مشاركة الملف…"; -"action_export_pdf" = "معاينة PDF…"; -"action_generate_code" = "إنشاء الشفرة…"; -"action_simulation" = "محاكاة"; -"action_diagram" = "مخطط"; -"simulation_placeholder_body" = "يشغّل وضع المحاكاة المخطط خطوة بخطوة، ويبرز العنصر الحالي، ويعرض قيم المتغيرات والمخرجات."; -"simulation_controls" = "عناصر التحكم"; -"simulation_highlight_label" = "تمييز"; -"simulation_highlight_last" = "آخر خطوة"; -"simulation_highlight_next" = "الخطوة التالية"; -"simulation_not_available" = "يقوم Play بتشغيل المحاكاة تلقائيًا مع توقف 0.5 ثانية لكل خطوة."; -"simulation_play" = "تشغيل"; -"simulation_pause" = "إيقاف مؤقت"; -"simulation_step" = "خطوة"; -"simulation_stop" = "إيقاف"; -"simulation_input" = "إدخال"; -"simulation_input_placeholder" = "لا يلزم إدخال."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "يرجى إدخال عدد صحيح."; -"simulation_trace" = "آخر خطوة"; -"simulation_trace_placeholder" = "لم يُنفَّذ أي خطوة بعد."; -"simulation_variables" = "المتغيرات"; -"simulation_variables_placeholder" = "لا توجد متغيرات بعد."; -"simulation_output" = "المخرجات"; -"simulation_output_placeholder" = "لا يوجد إخراج بعد."; -"action_delete_selection" = "حذف التحديد"; -"ctx_copy" = "نسخ"; -"ctx_cut" = "قص"; -"ctx_paste" = "لصق"; -"action_settings" = "الإعدادات"; -"action_about" = "حول VisuStruct"; -"recent_files_menu" = "الملفات الأخيرة"; -"recent_files_empty" = "لا توجد ملفات حديثة"; -"recent_files_clear" = "مسح القائمة"; -"recent_files_unavailable" = "لم يعد الملف متاحًا."; - -/* In-app settings */ -"settings_language_title" = "اللغة"; -"settings_language_de" = "الألمانية"; -"settings_language_en" = "الإنجليزية"; -"settings_language_es" = "الإسبانية"; -"settings_language_fr" = "الفرنسية"; -"settings_language_it" = "الإيطالية"; -"settings_language_pl" = "البولندية"; -"settings_language_tr" = "التركية"; -"settings_language_ko" = "الكورية"; -"settings_language_ja" = "اليابانية"; -"settings_language_el" = "اليونانية"; -"settings_language_uk" = "الأوكرانية"; -"settings_language_ar" = "العربية"; -"settings_language_ru" = "الروسية"; -"settings_language_he" = "العبرية"; -"settings_language_zh_hans" = "الصينية (مبسطة)"; -"settings_language_zh_hant" = "الصينية (تقليدية)"; -"settings_language_ptpt" = "البرتغالية"; -"settings_language_java" = "Java (كلمات مفتاحية)"; - - -/* Error overlay */ -"error_title" = "خطأ"; -"error_back_editor" = "العودة إلى المحرر"; - -/* Toolbar */ -"toolbar_undo" = "تراجع"; -"toolbar_redo" = "إعادة"; -"toolbar_new" = "جديد"; -"menu_open" = "فتح…"; -"menu_save" = "حفظ"; -"menu_save_as" = "حفظ باسم…"; -"menu_print" = "طباعة…"; -"menu_file" = "ملف"; -"menu_new" = "جديد"; -"menu_close" = "إغلاق"; - -/* Accessibility */ -"a11y_generate_code" = "إنشاء شفرة من المخطط"; -"a11y_generate_code_locked" = "إنشاء الشفرة، متاح بعد الشراء"; -"a11y_unsaved_changes" = "تغييرات غير محفوظة"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "إنشاء الشفرة"; -"codegen_gate_body" = "سيتم فتح شفرة Java وPython وJavaScript من المخطط عبر عملية شراء داخل التطبيق (قريبًا)."; -"codegen_gate_ok" = "حسنًا"; -"codegen_placeholder_title" = "مولّد الشفرة"; -"codegen_placeholder_body" = "ستظهر الشفرة المُولَّدة هنا."; -"codegen_placeholder_compare" = "بدّل بين Java وPython وJavaScript لمقارنة الصياغة (مثال بالأسفل)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (الشرط) {\\n statement();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if الشرط:\\n statement()\\nelse:\\n alternative()"; -"codegen_copy" = "نسخ"; -"codegen_run_in_browser" = "اختبار في المتصفح"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "علامة تبويب جديدة للمخطط"; -"a11y_close_tab" = "إغلاق علامة التبويب"; - -"close_unsaved_title" = "تغييرات غير محفوظة"; -"close_unsaved_message" = "يحتوي هذا المخطط على تغييرات غير محفوظة. هل تريد حفظها قبل الإغلاق؟"; -"close_unsaved_discard" = "تجاهل"; -"close_unsaved_cancel" = "إلغاء"; -"a11y_placeholder_drop" = "أفلت عنصرًا هنا لاستبدال العنصر النائب. اضغط مطولًا للسحب والتحريك."; -"a11y_node_drop" = "اضغط مطولًا على كتلة ثم اسحب: أفلت على الحافة العلوية أو السفلية لإدراجها قبل أو بعد. الإسقاط في الوسط فقط على عنصر نائب ø."; -"a11y_codegen_panel_drag" = "اسحب لتحريك لوحة مولّد الشفرة"; - -/* Diagram */ -"diagram_title_label" = "العنوان"; -"diagram_title_placeholder" = "بدون عنوان"; - -/* Inspector */ -"inspector_no_selection" = "لا يوجد عنصر محدد — اضغط على كتلة."; -"inspector_apply_text" = "تطبيق النص"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "النوع"; -"inspector_io_mode_statement" = "تعليمة"; -"inspector_io_mode_input" = "إدخال"; -"inspector_io_mode_output" = "إخراج"; -"inspector_io_mode_help_java_like" = "إدخال: input: … | إخراج: output: …"; -"inspector_add_case" = "إضافة حالة"; -"inspector_remove_case" = "إزالة الحالة"; -"inspector_group_element" = "نص العنصر"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "أدخل condition…"; -"inspector_placeholder_selector" = "أدخل selector…"; -"inspector_placeholder_call" = "أدخل call…"; -"inspector_placeholder_break" = "تعليق (اختياري)"; - -/* Element types — keep Java-like (LTR) to reduce RTL confusion */ -"element_anweisung" = "Statement"; -"element_verzweigung" = "if"; -"element_fallauswahl" = "switch"; -"element_forSchleife" = "for"; -"element_whileSchleife" = "while"; -"element_doUntilSchleife" = "do"; -"element_endlosschleife" = "while(true)"; -"element_aussprung" = "break"; -"element_aufruf" = "استدعاء"; -"element_leerElement" = "ø"; - -/* Tabs */ -"tab_title_format" = "مخطط %d"; - -/* Empty canvas */ -"canvas_empty_title" = "مخطط فارغ"; -"canvas_empty_hint" = "اسحب عنصرًا من «العناصر» إلى هنا."; - -/* Diagram: new element stubs & column headers — keep Java-like */ -"canvas_stub_anweisung" = "Statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "selector"; -"canvas_stub_for" = "i = 0; i < n; i++"; -"canvas_stub_while" = "condition"; -"canvas_stub_until" = "condition"; -"canvas_stub_endless" = "∞"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "استدعاء()"; - -/* About */ -"about_version_fmt" = "الإصدار %@ (%@)"; -"about_nav_title" = "حول VisuStruct"; -"about_features_heading" = "الميزات"; -"about_bullet_palette" = "أدرج الكتل من اللوحة أو اسحبها إلى المخطط"; -"about_bullet_edit" = "حرّر المخطط: غيّر النص، حدّد العناصر وأزلها عند الحاجة"; -"about_bullet_tabs" = "عدة مخططات في علامات تبويب — لكل مخطط عنوانه"; -"about_bullet_file" = "احفظ وأعد فتح المخططات كملفات .visustruct"; -"about_bullet_share" = "شارك المخطط كصورة (PNG)"; -"about_dateiformat_heading" = "تنسيق الملف"; -"about_dateiformat_part1" = "يستخدم تنسيق VisuStruct الأصلي الامتداد "; -"about_dateiformat_part2" = ". يمكنك حفظ المخططات وتبادلها مع تطبيقات أخرى تدعم نفس التنسيق."; -"about_dateiformat_strk" = "يمكن أيضًا فتح الملفات ذات الامتداد .strk."; -"about_project_github_label" = "تطبيق Java (المصدر والإصدارات):"; -"about_web_label" = "الويب:"; -"about_developer_label" = "المطوّر:"; -"about_lineage_heading" = "الأصل"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "تم"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "إلغاء الإدراج"; -"phone_show_text_editor" = "تحرير النص"; -"phone_hide_text_editor" = "طيّ"; -"phone_title_done" = "تم"; - -/* Alerts */ -"err_save_failed_fmt" = "تعذر الحفظ: %@"; -"err_share_prepare_failed_fmt" = "تعذر تجهيز المشاركة: %@"; -"err_diagram_too_small_export" = "المخطط صغير جدًا — لا يوجد ما يمكن تصديره."; -"err_image_render_failed" = "تعذر إنشاء الصورة."; -"err_diagram_too_small_print" = "المخطط صغير جدًا — لا يوجد ما يمكن طباعته."; -"err_print_unavailable" = "الطباعة غير متاحة على هذا الجهاز."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "اقتراح اسم الملف"; -"settings_export_filename_picker" = "النمط"; -"settings_export_filename_date_title" = "مع التاريخ"; -"settings_export_filename_title_only" = "بدون تاريخ"; -"settings_export_filename_footer_with_date" = "مع التاريخ: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "بدون تاريخ: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "انتهت المحاكاة."; -"sim_notice_infinite_loop_empty" = "الحلقة اللانهائية ليس لها جسم."; -"sim_notice_unsupported_statement_fmt" = "تعليمة غير مدعومة: %@"; -"sim_notice_invalid_expression_fmt" = "تعبير غير صالح: %@"; -"sim_notice_unknown_variable_fmt" = "متغير غير معروف: %@"; -"sim_notice_division_by_zero" = "القسمة على صفر."; -"sim_notice_whole_number_expected" = "أدخل عددًا صحيحًا."; -"sim_notice_number_expected" = "أدخل رقمًا."; -"sim_notice_boolean_expected" = "أدخل true أو false."; -"sim_notice_subprogram_not_found_fmt" = "لا يوجد مخطط مفتوح باسم %@. تم تخطي الاستدعاء."; -"sim_notice_call_too_deep" = "استدعاءات متداخلة كثيرة جدًا. هل يستدعي برنامج فرعي نفسه؟"; - -"codegen_pseudocode_toggle" = "شبه كود (ليس كودًا قابلًا للتشغيل)"; -"codegen_pseudocode_note" = "شبه كود – ليس برنامجًا قابلًا للتشغيل"; -"codegen_pseudocode_hint" = "هذا المخطط معلَّم كشبه كود. الكود مجرد مسودة ولا يمكن تشغيله."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-DBLIUcBd.js b/website/app/assets/Localizable-DBLIUcBd.js deleted file mode 100644 index 3e1e935f..00000000 --- a/website/app/assets/Localizable-DBLIUcBd.js +++ /dev/null @@ -1,255 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Elements"; -"inspector_header" = "Object Inspector"; - -/* Actions */ -"action_share_png" = "Share Graphic…"; -"action_share_document" = "Share File…"; -"action_export_pdf" = "Preview PDF…"; -"action_generate_code" = "Generate Code…"; -"action_simulation" = "Simulation"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "The simulation mode will run the diagram step by step, highlight the current element, and show variable values and output."; -"simulation_controls" = "Controls"; -"simulation_highlight_label" = "Highlight"; -"simulation_highlight_last" = "Last step"; -"simulation_highlight_next" = "Next step"; -"simulation_not_available" = "Play runs the simulation automatically with a 0.5 second pause per step."; -"simulation_play" = "Play"; -"simulation_pause" = "Pause"; -"simulation_step" = "Step"; -"simulation_stop" = "Stop"; -"simulation_input" = "Input"; -"simulation_input_placeholder" = "No input required."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Please enter a whole number."; -"simulation_trace" = "Last Step"; -"simulation_trace_placeholder" = "No step executed yet."; -"simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "No variables yet."; -"simulation_output" = "Output"; -"simulation_output_placeholder" = "No output yet."; -"action_delete_selection" = "Delete Selection"; -"ctx_copy" = "Copy"; -"ctx_cut" = "Cut"; -"ctx_paste" = "Paste"; -"action_settings" = "Settings"; -"action_about" = "About VisuStruct"; -"recent_files_menu" = "Recent Files"; -"recent_files_empty" = "No recent files"; -"recent_files_clear" = "Clear List"; -"recent_files_unavailable" = "File is no longer available."; - -/* In-app settings */ -"settings_language_title" = "Language"; -"settings_language_de" = "German"; -"settings_language_en" = "English"; -"settings_language_es" = "Spanish"; -"settings_language_fr" = "French"; -"settings_language_it" = "Italian"; -"settings_language_pl" = "Polish"; -"settings_language_tr" = "Turkish"; -"settings_language_ko" = "Korean"; -"settings_language_ja" = "Japanese"; -"settings_language_el" = "Greek"; -"settings_language_uk" = "Ukrainian"; -"settings_language_ar" = "Arabic"; -"settings_language_ru" = "Russian"; -"settings_language_he" = "Hebrew"; -"settings_language_zh_hans" = "Chinese (Simplified)"; -"settings_language_zh_hant" = "Chinese (Traditional)"; -"settings_language_ptpt" = "Portuguese"; -"settings_language_java" = "Java (keywords)"; - - - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "File name suggestion"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "With date"; -"settings_export_filename_title_only" = "Without date"; -"settings_export_filename_footer_with_date" = "With date: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Without date: Filename.visustruct"; - - -/* Error overlay */ -"error_title" = "Error"; -"error_back_editor" = "Back to Editor"; - -/* Toolbar */ -"toolbar_undo" = "Undo"; -"toolbar_redo" = "Redo"; -"toolbar_new" = "New"; -"menu_open" = "Open…"; -"menu_save" = "Save"; -"menu_save_as" = "Save As…"; -"menu_print" = "Print…"; -"menu_file" = "File"; -"menu_new" = "New"; -"menu_close" = "Close"; - -/* Accessibility */ -"a11y_generate_code" = "Generate code from the structure chart"; -"a11y_generate_code_locked" = "Generate code, available after purchase"; -"a11y_unsaved_changes" = "Unsaved changes"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Generate code"; -"codegen_gate_body" = "Java, Python, and JavaScript code from your diagram will unlock via in-app purchase (coming soon)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Code generator"; -"codegen_placeholder_body" = "Generated code will appear here."; -"codegen_placeholder_compare" = "Switch between Java, Python, and JavaScript to compare syntax (sample below)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condition) {\\n statement();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if condition:\\n statement()\\nelse:\\n alternative()"; -"codegen_generated_hint" = "Preview from the current structure chart (Java 17, Python 3.10+, modern JavaScript)."; -"codegen_copy" = "Copy"; -"codegen_run_in_browser" = "Test in browser"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "New diagram tab"; -"a11y_close_tab" = "Close tab"; - -"close_unsaved_title" = "Unsaved Changes"; -"close_unsaved_message" = "This diagram contains unsaved changes. Do you want to save them before closing?"; -"close_unsaved_discard" = "Discard"; -"close_unsaved_cancel" = "Cancel"; -"a11y_placeholder_drop" = "Drop an element here to replace the placeholder. Press and hold to drag and move."; -"a11y_node_drop" = "Press and hold a block, then drag: drop on the top or bottom edge of a target to insert before or after. Center drop only on a ø placeholder."; -"a11y_codegen_panel_drag" = "Drag to move code generator panel"; - -/* Diagram */ -"diagram_title_label" = "Title"; -"diagram_title_placeholder" = "No title"; - -/* Inspector */ -"inspector_no_selection" = "No element selected — tap a tile."; -"inspector_apply_text" = "Apply Text"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; -"inspector_io_mode_title" = "Kind"; -"inspector_io_mode_statement" = "Statement"; -"inspector_io_mode_input" = "Input"; -"inspector_io_mode_output" = "Output"; -"inspector_io_mode_help_java_like" = "Input: input: … | Output: output: …"; -"inspector_add_case" = "Add Case"; -"inspector_remove_case" = "Remove Case"; -"inspector_group_element" = "Element text"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Insert condition…"; -"inspector_placeholder_selector" = "Insert selector…"; -"inspector_placeholder_call" = "Insert call…"; -"inspector_placeholder_break" = "Comment (optional)"; - -/* Element types */ -"element_anweisung" = "Statement"; -"element_verzweigung" = "Branch"; -"element_fallauswahl" = "Switch"; -"element_forSchleife" = "For loop"; -"element_whileSchleife" = "While loop"; -"element_doUntilSchleife" = "Do-while loop"; -"element_endlosschleife" = "Endless loop"; -"element_aussprung" = "Break"; -"element_aufruf" = "Call"; -"element_leerElement" = "Empty element"; - -/* Tabs */ -"tab_title_format" = "Diagram %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Empty structure chart"; -"canvas_empty_hint" = "Drag an element from “Elements” here."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Switch"; -"canvas_stub_anweisung" = "Statement"; -"canvas_stub_condition" = "Condition"; -"canvas_stub_for" = "for 0 < i < count"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Call()"; - -/* About */ -"about_version_fmt" = "Version %@ (%@)"; -"about_nav_title" = "About VisuStruct"; -"about_features_heading" = "Features"; -"about_bullet_palette" = "Insert blocks from the palette or drag them into the diagram"; -"about_bullet_edit" = "Edit the chart: change text, select elements, and remove them if needed"; -"about_bullet_tabs" = "Several diagrams in tabs — each with its own title"; -"about_bullet_file" = "Save and reopen diagrams as .visustruct files"; -"about_bullet_share" = "Share the structure chart as an image (PNG)"; -"about_dateiformat_heading" = "File format"; -"about_dateiformat_part1" = "VisuStruct’s native format uses the extension "; -"about_dateiformat_part2" = ". You can keep diagrams and exchange them with other apps that support the same format."; -"about_dateiformat_strk" = "Files with the .strk extension can also be opened."; -"about_project_github_label" = "Java app (source & releases):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Developer:"; -"about_lineage_heading" = "Lineage"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Done"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Cancel insert"; -"phone_show_text_editor" = "Edit text"; -"phone_hide_text_editor" = "Collapse"; -"phone_title_done" = "Done"; - -/* Alerts */ -"err_save_failed_fmt" = "Could not save: %@"; -"err_share_prepare_failed_fmt" = "Could not prepare sharing: %@"; -"err_diagram_too_small_export" = "The diagram is too small — nothing to export."; -"err_image_render_failed" = "Could not create the image."; -"err_diagram_too_small_print" = "The diagram is too small — nothing to print."; -"err_print_unavailable" = "Printing is not available on this device."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulation finished."; -"sim_notice_infinite_loop_empty" = "Infinite loop has no body."; -"sim_notice_unsupported_statement_fmt" = "Unsupported statement: %@"; -"sim_notice_invalid_expression_fmt" = "Invalid expression: %@"; -"sim_notice_unknown_variable_fmt" = "Unknown variable: %@"; -"sim_notice_division_by_zero" = "Division by zero."; -"sim_notice_whole_number_expected" = "Please enter a whole number."; -"sim_notice_number_expected" = "Please enter a number."; -"sim_notice_boolean_expected" = "Please enter true or false."; -"sim_notice_subprogram_not_found_fmt" = "No open diagram is called %@. The call was skipped."; -"sim_notice_call_too_deep" = "Too many nested calls. Does a subprogram call itself?"; - -"codegen_pseudocode_toggle" = "Pseudocode (not runnable code)"; -"codegen_pseudocode_note" = "Pseudocode – not a runnable program"; -"codegen_pseudocode_hint" = "This diagram is marked as pseudocode. The code is only a sketch and cannot be run."; - -"course_title" = "Course"; -"course_intro" = "Learn programming step by step: from the first structure chart to your own Java programs."; -"course_bullet_lessons" = "All lessons with explanations, quizzes and exercises"; -"course_bullet_java" = "“Now in Java” programming tasks in every lesson"; -"course_bullet_games" = "Learning games and step-by-step hints"; -"course_bullet_once" = "Pay once, use it on iPhone, iPad and Mac"; -"course_unlocked" = "Course unlocked – thank you!"; -"course_free_note" = "Creating structure charts, simulation and code export stay free."; -"course_restore" = "Restore purchases"; -"course_restore_done" = "Your course purchase has been restored."; -"course_restore_none" = "No course purchase was found for this Apple Account."; -"course_unavailable" = "The course can’t be loaded from the App Store right now. Please check your internet connection and try again later."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-DSvkBkp-.js b/website/app/assets/Localizable-DSvkBkp-.js deleted file mode 100644 index d381e295..00000000 --- a/website/app/assets/Localizable-DSvkBkp-.js +++ /dev/null @@ -1,153 +0,0 @@ -const e=`/* NOTE: Initial Norwegian Bokmål localization. */ -"palette_header" = "Elementer"; -"inspector_header" = "Objektinspektør"; - -/* Actions */ -"action_share_png" = "Del bilde…"; -"action_share_document" = "Del fil…"; -"action_export_pdf" = "Forhåndsvis PDF…"; -"action_generate_code" = "Generer kode…"; -"action_simulation" = "Simulering"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "Simuleringsmodus kjører diagrammet trinn for trinn, markerer gjeldende element og viser variabelverdier og utdata."; -"simulation_controls" = "Kontroller"; -"simulation_highlight_label" = "Markering"; -"simulation_highlight_last" = "Siste steg"; -"simulation_highlight_next" = "Neste steg"; -"simulation_not_available" = "Play kjører simuleringen automatisk med en pause på 0,5 sekund per steg."; -"simulation_play" = "Spill av"; -"simulation_pause" = "Pause"; -"simulation_step" = "Trinn"; -"simulation_stop" = "Stopp"; -"simulation_input" = "Inndata"; -"simulation_input_placeholder" = "Ingen inndata kreves."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Skriv inn et heltall."; -"simulation_trace" = "Siste steg"; -"simulation_trace_placeholder" = "Ingen trinn er utført ennå."; -"simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Ingen variabler ennå."; -"simulation_output" = "Utdata"; -"simulation_output_placeholder" = "Ingen utdata ennå."; -"action_delete_selection" = "Slett markering"; -"ctx_copy" = "Kopier"; -"ctx_cut" = "Klipp ut"; -"ctx_paste" = "Lim inn"; -"action_settings" = "Innstillinger"; -"action_about" = "Om VisuStruct"; -"recent_files_menu" = "Nylige filer"; -"recent_files_empty" = "Ingen nylige filer"; -"recent_files_clear" = "Tøm liste"; -"recent_files_unavailable" = "Filen er ikke lenger tilgjengelig."; - -/* In-app settings */ -"settings_language_title" = "Språk"; - -/* Toolbar */ -"toolbar_undo" = "Angre"; -"toolbar_redo" = "Gjør om"; -"toolbar_new" = "Ny"; -"menu_open" = "Åpne…"; -"menu_save" = "Lagre"; -"menu_save_as" = "Lagre som…"; -"menu_print" = "Skriv ut…"; -"menu_file" = "Arkiv"; -"menu_new" = "Ny"; -"menu_close" = "Lukk"; - -/* Inspector */ -"inspector_no_selection" = "Ingen valgt — trykk på en rute."; -"inspector_apply_text" = "Bruk tekst"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Type"; -"inspector_io_mode_statement" = "Setning"; -"inspector_io_mode_input" = "Inndata"; -"inspector_io_mode_output" = "Utdata"; -"inspector_io_mode_help_java_like" = "Inndata: input: … | Utdata: output: …"; -"inspector_add_case" = "Legg til case"; -"inspector_remove_case" = "Fjern case"; -"inspector_group_element" = "Elementtekst"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Skriv condition…"; -"inspector_placeholder_selector" = "Skriv selector…"; -"inspector_placeholder_call" = "Skriv call…"; -"inspector_placeholder_break" = "Kommentar (valgfritt)"; - -/* Element types */ -"element_anweisung" = "Setning"; -"element_verzweigung" = "Betingelse (if/else)"; -"element_fallauswahl" = "Valg (switch)"; -"element_forSchleife" = "For-løkke"; -"element_whileSchleife" = "While-løkke"; -"element_doUntilSchleife" = "Do-while-løkke"; -"element_endlosschleife" = "Uendelig løkke"; -"element_aussprung" = "Break"; -"element_aufruf" = "Kall"; -"element_leerElement" = "Tomt element"; - -/* Diagram */ -"diagram_title_label" = "Tittel"; -"diagram_title_placeholder" = "Ingen tittel"; -"canvas_empty_title" = "Tomt struktogram"; -"canvas_empty_hint" = "Dra et element fra “Elementer” hit."; - -/* Diagram stubs */ -"canvas_stub_anweisung" = "statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "switch"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Kall()"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Forslag til filnavn"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Med dato"; -"settings_export_filename_title_only" = "Uten dato"; -"settings_export_filename_footer_with_date" = "Med dato: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Uten dato: Filename.visustruct"; - -"close_unsaved_title" = "Ulagrede endringer"; -"close_unsaved_message" = "Dette diagrammet inneholder ulagrede endringer. Vil du lagre dem før du lukker?"; -"close_unsaved_discard" = "Forkast"; -"close_unsaved_cancel" = "Avbryt"; - -/* Accessibility — code generator floating panel */ -"a11y_codegen_panel_drag" = "Dra for å flytte kodegeneratorpanelet"; -"about_dateiformat_strk" = "Filer med endelsen .strk kan også åpnes."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simuleringen er ferdig."; -"sim_notice_infinite_loop_empty" = "Den uendelige løkken har ikke noe innhold."; -"sim_notice_unsupported_statement_fmt" = "Setning støttes ikke: %@"; -"sim_notice_invalid_expression_fmt" = "Ugyldig uttrykk: %@"; -"sim_notice_unknown_variable_fmt" = "Ukjent variabel: %@"; -"sim_notice_division_by_zero" = "Divisjon med null."; -"sim_notice_whole_number_expected" = "Skriv inn et heltall."; -"sim_notice_number_expected" = "Skriv inn et tall."; -"sim_notice_boolean_expected" = "Skriv inn true eller false."; -"sim_notice_subprogram_not_found_fmt" = "Ingen åpne diagrammer heter %@. Kallet ble hoppet over."; -"sim_notice_call_too_deep" = "For mange nøstede kall. Kaller et underprogram seg selv?"; -"phone_hide_text_editor" = "Skjul"; -"phone_title_done" = "Ferdig"; - -"codegen_pseudocode_toggle" = "Pseudokode (ikke kjørbar kode)"; -"codegen_pseudocode_note" = "Pseudokode – ikke et kjørbart program"; -"codegen_pseudocode_hint" = "Dette diagrammet er merket som pseudokode. Koden er bare en skisse og kan ikke kjøres."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-DXAPah1g.js b/website/app/assets/Localizable-DXAPah1g.js deleted file mode 100644 index 0e75f8f3..00000000 --- a/website/app/assets/Localizable-DXAPah1g.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Elementi"; -"inspector_header" = "Ispettore oggetti"; - -/* Actions */ -"action_share_png" = "Condividi immagine…"; -"action_share_document" = "Condividi file…"; -"action_export_pdf" = "Anteprima PDF…"; -"action_generate_code" = "Genera codice…"; -"action_simulation" = "Simulazione"; -"action_diagram" = "Diagramma"; -"simulation_placeholder_body" = "La modalità simulazione esegue il diagramma passo dopo passo, evidenzia l’elemento corrente e mostra i valori delle variabili e l’output."; -"simulation_controls" = "Controlli"; -"simulation_highlight_label" = "Evidenziazione"; -"simulation_highlight_last" = "Ultimo passo"; -"simulation_highlight_next" = "Prossimo passo"; -"simulation_not_available" = "Play esegue automaticamente la simulazione con una pausa di 0,5 secondi per passo."; -"simulation_play" = "Avvia"; -"simulation_pause" = "Pausa"; -"simulation_step" = "Passo"; -"simulation_stop" = "Stop"; -"simulation_input" = "Input"; -"simulation_input_placeholder" = "Nessun input richiesto."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Inserisci un numero intero."; -"simulation_trace" = "Ultimo passo"; -"simulation_trace_placeholder" = "Nessun passo ancora eseguito."; -"simulation_variables" = "Variabili"; -"simulation_variables_placeholder" = "Nessuna variabile per ora."; -"simulation_output" = "Output"; -"simulation_output_placeholder" = "Nessun output per ora."; -"action_delete_selection" = "Elimina selezione"; -"ctx_copy" = "Copia"; -"ctx_cut" = "Taglia"; -"ctx_paste" = "Incolla"; -"action_settings" = "Impostazioni"; -"action_about" = "Informazioni su VisuStruct"; -"recent_files_menu" = "File recenti"; -"recent_files_empty" = "Nessun file recente"; -"recent_files_clear" = "Cancella elenco"; -"recent_files_unavailable" = "Il file non è più disponibile."; - -/* In-app settings */ -"settings_language_title" = "Lingua"; -"settings_language_de" = "Tedesco"; -"settings_language_en" = "Inglese"; -"settings_language_es" = "Spagnolo"; -"settings_language_fr" = "Francese"; -"settings_language_it" = "Italiano"; -"settings_language_pl" = "Polacco"; -"settings_language_tr" = "Turco"; -"settings_language_ko" = "Coreano"; -"settings_language_ja" = "Giapponese"; -"settings_language_el" = "Greco"; -"settings_language_uk" = "Ucraino"; -"settings_language_ar" = "Arabo"; -"settings_language_ru" = "Russo"; -"settings_language_he" = "Ebraico"; -"settings_language_zh_hans" = "Cinese (semplificato)"; -"settings_language_zh_hant" = "Cinese (tradizionale)"; -"settings_language_ptpt" = "Portoghese"; -"settings_language_java" = "Java (parole chiave)"; - - -/* Error overlay */ -"error_title" = "Errore"; -"error_back_editor" = "Torna all’editor"; - -/* Toolbar */ -"toolbar_undo" = "Annulla"; -"toolbar_redo" = "Ripeti"; -"toolbar_new" = "Nuovo"; -"menu_open" = "Apri…"; -"menu_save" = "Salva"; -"menu_save_as" = "Salva con nome…"; -"menu_print" = "Stampa…"; -"menu_file" = "File"; -"menu_new" = "Nuovo"; -"menu_close" = "Chiudi"; - -/* Accessibility */ -"a11y_generate_code" = "Genera codice dal diagramma"; -"a11y_generate_code_locked" = "Genera codice, disponibile dopo l’acquisto"; -"a11y_unsaved_changes" = "Modifiche non salvate"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Genera codice"; -"codegen_gate_body" = "Il codice Java, Python e JavaScript dal diagramma si sbloccherà con un acquisto in-app (in arrivo)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Generatore di codice"; -"codegen_placeholder_body" = "Il codice generato apparirà qui."; -"codegen_placeholder_compare" = "Passa tra Java, Python e JavaScript per confrontare la sintassi (esempio sotto)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condizione) {\\n istruzione();\\n} else {\\n alternativa();\\n}"; -"codegen_preview_python" = "if condizione:\\n istruzione()\\nelse:\\n alternativa()"; -"codegen_copy" = "Copia"; -"codegen_run_in_browser" = "Prova nel browser"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Nuova scheda diagramma"; -"a11y_close_tab" = "Chiudi scheda"; - -"close_unsaved_title" = "Modifiche non salvate"; -"close_unsaved_message" = "Questo diagramma contiene modifiche non salvate. Vuoi salvarle prima di chiudere?"; -"close_unsaved_discard" = "Scarta"; -"close_unsaved_cancel" = "Annulla"; -"a11y_placeholder_drop" = "Rilascia un elemento qui per sostituire il segnaposto. Tieni premuto per trascinare e spostare."; -"a11y_node_drop" = "Tieni premuto un blocco, poi trascina: rilascia sul bordo superiore o inferiore per inserire prima o dopo. Rilascio al centro solo su un segnaposto ø."; -"a11y_codegen_panel_drag" = "Trascina per spostare il pannello del generatore di codice"; - -/* Diagram */ -"diagram_title_label" = "Titolo"; -"diagram_title_placeholder" = "Senza titolo"; - -/* Inspector */ -"inspector_no_selection" = "Nessun elemento selezionato — tocca un riquadro."; -"inspector_apply_text" = "Applica testo"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Tipo"; -"inspector_io_mode_statement" = "Istruzione"; -"inspector_io_mode_input" = "Input"; -"inspector_io_mode_output" = "Output"; -"inspector_io_mode_help_java_like" = "Input: input: … | Output: output: …"; -"inspector_add_case" = "Aggiungi caso"; -"inspector_remove_case" = "Rimuovi caso"; -"inspector_group_element" = "Testo dell’elemento"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Inserisci condizione…"; -"inspector_placeholder_selector" = "Inserisci selettore…"; -"inspector_placeholder_call" = "Inserisci chiamata…"; -"inspector_placeholder_break" = "Commento (opzionale)"; - -/* Element types */ -"element_anweisung" = "Istruzione"; -"element_verzweigung" = "Ramo"; -"element_fallauswahl" = "Selezione"; -"element_forSchleife" = "Ciclo for"; -"element_whileSchleife" = "Ciclo while"; -"element_doUntilSchleife" = "Ciclo do-while"; -"element_endlosschleife" = "Ciclo infinito"; -"element_aussprung" = "Uscita"; -"element_aufruf" = "Chiamata"; -"element_leerElement" = "Elemento vuoto"; - -/* Tabs */ -"tab_title_format" = "Diagramma %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Diagramma vuoto"; -"canvas_empty_hint" = "Trascina un elemento da “Elementi” qui."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Selezione"; -"canvas_stub_anweisung" = "Istruzione"; -"canvas_stub_condition" = "Condizione"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "infinito"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Chiamata()"; - -/* About */ -"about_version_fmt" = "Versione %@ (%@)"; -"about_nav_title" = "Informazioni su VisuStruct"; -"about_features_heading" = "Funzionalità"; -"about_bullet_palette" = "Inserisci blocchi dalla tavolozza o trascinali nel diagramma"; -"about_bullet_edit" = "Modifica il diagramma: cambia il testo, seleziona elementi e rimuovili se necessario"; -"about_bullet_tabs" = "Più diagrammi in schede — ognuno con il proprio titolo"; -"about_bullet_file" = "Salva e riapri diagrammi come file .visustruct"; -"about_bullet_share" = "Condividi il diagramma come immagine (PNG)"; -"about_dateiformat_heading" = "Formato file"; -"about_dateiformat_part1" = "Il formato nativo di VisuStruct usa l’estensione "; -"about_dateiformat_part2" = ". Puoi conservare i diagrammi e scambiarli con altre app che supportano lo stesso formato."; -"about_dateiformat_strk" = "È possibile aprire anche i file con estensione .strk."; -"about_project_github_label" = "App Java (sorgente e release):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Sviluppatore:"; -"about_lineage_heading" = "Origine"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Fine"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Annulla inserimento"; -"phone_show_text_editor" = "Modifica testo"; -"phone_hide_text_editor" = "Comprimi"; -"phone_title_done" = "Fine"; - -/* Alerts */ -"err_save_failed_fmt" = "Impossibile salvare: %@"; -"err_share_prepare_failed_fmt" = "Impossibile preparare la condivisione: %@"; -"err_diagram_too_small_export" = "Il diagramma è troppo piccolo — niente da esportare."; -"err_image_render_failed" = "Impossibile creare l’immagine."; -"err_diagram_too_small_print" = "Il diagramma è troppo piccolo — niente da stampare."; -"err_print_unavailable" = "La stampa non è disponibile su questo dispositivo."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Suggerimento nome file"; -"settings_export_filename_picker" = "Formato"; -"settings_export_filename_date_title" = "Con data"; -"settings_export_filename_title_only" = "Senza data"; -"settings_export_filename_footer_with_date" = "Con data: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Senza data: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulazione terminata."; -"sim_notice_infinite_loop_empty" = "Il ciclo infinito non ha corpo."; -"sim_notice_unsupported_statement_fmt" = "Istruzione non supportata: %@"; -"sim_notice_invalid_expression_fmt" = "Espressione non valida: %@"; -"sim_notice_unknown_variable_fmt" = "Variabile sconosciuta: %@"; -"sim_notice_division_by_zero" = "Divisione per zero."; -"sim_notice_whole_number_expected" = "Inserisci un numero intero."; -"sim_notice_number_expected" = "Inserisci un numero."; -"sim_notice_boolean_expected" = "Inserisci true o false."; -"sim_notice_subprogram_not_found_fmt" = "Nessun diagramma aperto si chiama %@. La chiamata è stata saltata."; -"sim_notice_call_too_deep" = "Troppe chiamate annidate. Un sottoprogramma chiama se stesso?"; - -"codegen_pseudocode_toggle" = "Pseudocodice (codice non eseguibile)"; -"codegen_pseudocode_note" = "Pseudocodice – non è un programma eseguibile"; -"codegen_pseudocode_hint" = "Questo diagramma è contrassegnato come pseudocodice. Il codice è solo una bozza e non può essere eseguito."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-Dk8F86qS.js b/website/app/assets/Localizable-Dk8F86qS.js deleted file mode 100644 index f5ef6ff8..00000000 --- a/website/app/assets/Localizable-Dk8F86qS.js +++ /dev/null @@ -1,255 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Elemente"; -"inspector_header" = "Objektinspektor"; - -/* Aktionen */ -"action_share_png" = "Grafik teilen …"; -"action_share_document" = "Datei teilen …"; -"action_export_pdf" = "PDF-Vorschau …"; -"action_generate_code" = "Code erzeugen …"; -"action_simulation" = "Simulation"; -"action_diagram" = "Diagramm"; -"simulation_placeholder_body" = "Der Simulationsmodus führt das Diagramm Schritt für Schritt aus, markiert das aktuelle Element und zeigt Variablenwerte und Ausgaben."; -"simulation_controls" = "Steuerung"; -"simulation_highlight_label" = "Markierung"; -"simulation_highlight_last" = "Letzter Schritt"; -"simulation_highlight_next" = "Nächster Schritt"; -"simulation_not_available" = "Play führt die Simulation automatisch mit 0,5 Sekunden Pause pro Schritt aus."; -"simulation_play" = "Start"; -"simulation_pause" = "Pause"; -"simulation_step" = "Schritt"; -"simulation_stop" = "Stopp"; -"simulation_input" = "Eingabe"; -"simulation_input_placeholder" = "Keine Eingabe erforderlich."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Bitte eine ganze Zahl eingeben."; -"simulation_trace" = "Letzter Schritt"; -"simulation_trace_placeholder" = "Noch kein Schritt ausgeführt."; -"simulation_variables" = "Variablen"; -"simulation_variables_placeholder" = "Noch keine Variablen."; -"simulation_output" = "Ausgabe"; -"simulation_output_placeholder" = "Noch keine Ausgabe."; -"action_delete_selection" = "Auswahl löschen"; -"ctx_copy" = "Kopieren"; -"ctx_cut" = "Ausschneiden"; -"ctx_paste" = "Einfügen"; -"action_settings" = "Einstellungen"; -"action_about" = "Über VisuStruct"; -"recent_files_menu" = "Zuletzt verwendet"; -"recent_files_empty" = "Keine zuletzt verwendeten Dateien"; -"recent_files_clear" = "Liste leeren"; -"recent_files_unavailable" = "Datei ist nicht mehr verfügbar."; - -/* Einstellungen (In-App) */ -"settings_language_title" = "Sprache"; -"settings_language_de" = "Deutsch"; -"settings_language_en" = "Englisch"; -"settings_language_es" = "Spanisch"; -"settings_language_fr" = "Französisch"; -"settings_language_it" = "Italienisch"; -"settings_language_pl" = "Polnisch"; -"settings_language_tr" = "Türkisch"; -"settings_language_ko" = "Koreanisch"; -"settings_language_ja" = "Japanisch"; -"settings_language_el" = "Griechisch"; -"settings_language_uk" = "Ukrainisch"; -"settings_language_ar" = "Arabisch"; -"settings_language_ru" = "Russisch"; -"settings_language_he" = "Hebräisch"; -"settings_language_zh_hans" = "Chinesisch (vereinfacht)"; -"settings_language_zh_hant" = "Chinesisch (traditionell)"; -"settings_language_ptpt" = "Portugiesisch"; -"settings_language_java" = "Java (Schlüsselwörter)"; - - - -"settings_ui_scale_section" = "Textgröße"; -"settings_ui_scale_canvas" = "Struktogramm"; -"settings_ui_scale_inspector" = "Eingabe unten"; -"settings_ui_scale_small" = "Klein"; -"settings_ui_scale_medium" = "Mittel"; -"settings_ui_scale_large" = "Groß"; -"settings_ui_scale_extra_large" = "Sehr groß"; - -"settings_export_filename_section" = "Dateivorschlag"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Mit Datum"; -"settings_export_filename_title_only" = "Ohne Datum"; -"settings_export_filename_footer_with_date" = "Mit Datum: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Ohne Datum: Filename.visustruct"; - - -/* Fehler-Overlay */ -"error_title" = "Fehler"; -"error_back_editor" = "Zurück zum Editor"; - -/* Toolbar */ -"toolbar_undo" = "Rückgängig"; -"toolbar_redo" = "Wiederholen"; -"toolbar_new" = "Neu"; -"menu_open" = "Öffnen …"; -"menu_save" = "Speichern"; -"menu_save_as" = "Speichern unter …"; -"menu_print" = "Drucken …"; -"menu_file" = "Ablage"; -"menu_new" = "Neu"; -"menu_close" = "Schließen"; - -/* Barrierefreiheit */ -"a11y_generate_code" = "Code aus dem Struktogramm erzeugen"; -"a11y_generate_code_locked" = "Code erzeugen, nach dem Kauf verfügbar"; -"a11y_unsaved_changes" = "Ungespeicherte Änderungen"; - -/* Code-Generator (IAP folgt) */ -"codegen_gate_title" = "Code erzeugen"; -"codegen_gate_body" = "Java-, Python- und JavaScript-Code aus dem Struktogramm wird über einen In-App-Kauf freigeschaltet (demnächst)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Code-Generator"; -"codegen_placeholder_body" = "Hier erscheint später der erzeugte Code."; -"codegen_placeholder_compare" = "Zwischen Java, Python und JavaScript wechseln, um die Syntax zu vergleichen (Beispiel unten)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (bedingung) {\\n anweisung();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if bedingung:\\n anweisung()\\nelse:\\n alternative()"; -"codegen_generated_hint" = "Vorschau aus dem aktuellen Struktogramm (Java 17, Python 3.10+, modernes JavaScript)."; -"codegen_copy" = "Kopieren"; -"codegen_run_in_browser" = "Im Browser testen"; -"codegen_save_java" = "Java speichern …"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Weiteres Struktogramm"; -"a11y_close_tab" = "Reiter schließen"; - -"close_unsaved_title" = "Ungespeicherte Änderungen"; -"close_unsaved_message" = "Dieses Diagramm enthält ungespeicherte Änderungen. Möchtest du sie vor dem Schließen speichern?"; -"close_unsaved_discard" = "Verwerfen"; -"close_unsaved_cancel" = "Abbrechen"; -"a11y_placeholder_drop" = "Element hier ablegen, um den Platzhalter zu ersetzen. Lang drücken und ziehen zum Verschieben."; -"a11y_node_drop" = "Block lang drücken, dann ziehen: am Ziel am oberen oder unteren Rand ablegen (davor/danach). In die Mitte nur auf Platzhalter ø."; -"a11y_codegen_panel_drag" = "Codegenerator-Panel verschieben"; - -/* Diagramm */ -"diagram_title_label" = "Titel"; -"diagram_title_placeholder" = "Ohne Titel"; - -/* Inspector */ -"inspector_no_selection" = "Kein Element gewählt — tippe auf eine Kachel."; -"inspector_apply_text" = "Text übernehmen"; -"inspector_for_init" = "Start"; -"inspector_for_condition" = "Bedingung"; -"inspector_for_step" = "Schritt"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; -"inspector_io_mode_title" = "Art"; -"inspector_io_mode_statement" = "Anweisung"; -"inspector_io_mode_input" = "Eingabe"; -"inspector_io_mode_output" = "Ausgabe"; -"inspector_io_mode_help_java_like" = "Eingabe: input: … | Ausgabe: output: …"; -"inspector_add_case" = "Weiteren Fall hinzufügen"; -"inspector_remove_case" = "Fall entfernen"; -"inspector_group_element" = "Elementtext"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Bedingung einfügen …"; -"inspector_placeholder_selector" = "Auswahl einfügen …"; -"inspector_placeholder_call" = "Aufruf einfügen …"; -"inspector_placeholder_break" = "Kommentar (optional)"; - -/* Elementtypen (Palette + Inspector) */ -"element_anweisung" = "Anweisung"; -"element_verzweigung" = "Verzweigung"; -"element_fallauswahl" = "Fallauswahl"; -"element_forSchleife" = "For-Schleife"; -"element_whileSchleife" = "While-Schleife"; -"element_doUntilSchleife" = "Do-while-Schleife"; -"element_endlosschleife" = "Endlosschleife"; -"element_aussprung" = "Aussprung"; -"element_aufruf" = "Aufruf"; -"element_leerElement" = "Leeres Element"; - -/* Tabs */ -"tab_title_format" = "Diagramm %d"; - -/* Leeres Canvas */ -"canvas_empty_title" = "Leeres Struktogramm"; -"canvas_empty_hint" = "Element aus „Elemente“ hierher ziehen."; - -/* Diagramm: Texte neuer Elemente & Spaltenköpfe (Anzeige) */ -"canvas_stub_fallauswahl" = "Fallauswahl"; -"canvas_stub_anweisung" = "Anweisung"; -"canvas_stub_condition" = "Bedingung"; -"canvas_stub_for" = "for 0 < i < anzahl"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Aufruf()"; - -/* Über */ -"about_version_fmt" = "Version %@ (%@)"; -"about_nav_title" = "Über VisuStruct"; -"about_features_heading" = "Funktionen"; -"about_bullet_palette" = "Bausteine aus der Palette einfügen oder per Drag & Drop ins Diagramm ziehen"; -"about_bullet_edit" = "Struktogramm bearbeiten: Texte anpassen, Elemente auswählen und bei Bedarf entfernen"; -"about_bullet_tabs" = "Mehrere Diagramme in Tabs – jeweils mit eigenem Titel"; -"about_bullet_file" = "Diagramme als .visustruct-Datei speichern und wieder öffnen"; -"about_bullet_share" = "Struktogramm als Grafik teilen (PNG)"; -"about_dateiformat_heading" = "Dateiformat"; -"about_dateiformat_part1" = "Das native Dateiformat von VisuStruct nutzt die Endung "; -"about_dateiformat_part2" = ". So kannst du Diagramme sichern und mit anderen Programmen austauschen, die dasselbe Format unterstützen."; -"about_dateiformat_strk" = "Zusätzlich können Dateien mit der Endung .strk geöffnet werden."; -"about_project_github_label" = "Java-App (Quellen & Releases):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Entwickler:"; -"about_lineage_heading" = "Herkunft"; -"about_lineage_body" = "VisuStruct entstand ursprünglich als Java-Desktop-App und bleibt für den schulischen Einsatz plattformübergreifend verfügbar. Die aktuelle Swift/SwiftUI-Version ist die moderne native App für Mac, iPad und iPhone und bleibt kompatibel mit dem .visustruct-Dateiformat. Sie basiert auf der ursprünglichen Open-Source-Arbeit von Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java-Upstream:"; -"about_done" = "Fertig"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: Einfügen per Tap */ -"phone_insert_cancel" = "Einfügen abbrechen"; -"phone_show_text_editor" = "Text bearbeiten"; -"phone_hide_text_editor" = "Einklappen"; -"phone_title_done" = "Fertig"; - -/* Meldungen */ -"err_save_failed_fmt" = "Speichern fehlgeschlagen: %@"; -"err_share_prepare_failed_fmt" = "Teilen konnte nicht vorbereitet werden: %@"; -"err_diagram_too_small_export" = "Diagramm ist zu klein — nichts zu exportieren."; -"err_image_render_failed" = "Grafik konnte nicht erzeugt werden."; -"err_diagram_too_small_print" = "Diagramm ist zu klein — nichts zu drucken."; -"err_print_unavailable" = "Drucken ist auf diesem Gerät nicht verfügbar."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulation beendet."; -"sim_notice_infinite_loop_empty" = "Die Endlosschleife hat keinen Rumpf."; -"sim_notice_unsupported_statement_fmt" = "Nicht unterstützte Anweisung: %@"; -"sim_notice_invalid_expression_fmt" = "Ungültiger Ausdruck: %@"; -"sim_notice_unknown_variable_fmt" = "Unbekannte Variable: %@"; -"sim_notice_division_by_zero" = "Division durch null."; -"sim_notice_whole_number_expected" = "Bitte eine ganze Zahl eingeben."; -"sim_notice_number_expected" = "Bitte eine Zahl eingeben."; -"sim_notice_boolean_expected" = "Bitte true oder false eingeben."; -"sim_notice_subprogram_not_found_fmt" = "Kein offenes Diagramm heißt %@. Der Aufruf wurde übersprungen."; -"sim_notice_call_too_deep" = "Zu viele verschachtelte Aufrufe. Ruft sich ein Unterprogramm selbst auf?"; - -"codegen_pseudocode_toggle" = "Pseudocode (kein lauffähiger Code)"; -"codegen_pseudocode_note" = "Pseudocode – kein lauffähiges Programm"; -"codegen_pseudocode_hint" = "Dieses Diagramm ist als Pseudocode markiert. Der Code ist nur eine Skizze und lässt sich nicht ausführen."; - -"course_title" = "Kurs"; -"course_intro" = "Programmieren lernen, Schritt für Schritt: vom ersten Struktogramm bis zum eigenen Java-Programm."; -"course_bullet_lessons" = "Alle Lektionen mit Erklärungen, Wissenstests und Übungen"; -"course_bullet_java" = "In jeder Lektion Programmieraufgaben „Jetzt in Java“"; -"course_bullet_games" = "Lernspiele und gestufte Tipps"; -"course_bullet_once" = "Einmal kaufen, auf iPhone, iPad und Mac nutzen"; -"course_unlocked" = "Kurs freigeschaltet – danke!"; -"course_free_note" = "Struktogramme erstellen, Simulation und Code-Export bleiben kostenlos."; -"course_restore" = "Käufe wiederherstellen"; -"course_restore_done" = "Dein Kurs-Kauf wurde wiederhergestellt."; -"course_restore_none" = "Für diesen Apple Account wurde kein Kurs-Kauf gefunden."; -"course_unavailable" = "Der Kurs kann gerade nicht aus dem App Store geladen werden. Bitte prüfe die Internetverbindung und versuche es später noch einmal."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-DqIDp_hh.js b/website/app/assets/Localizable-DqIDp_hh.js deleted file mode 100644 index 7a8b5baa..00000000 --- a/website/app/assets/Localizable-DqIDp_hh.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "元素"; -"inspector_header" = "物件檢閱器"; - -/* Actions */ -"action_share_png" = "分享圖片…"; -"action_share_document" = "分享檔案…"; -"action_export_pdf" = "PDF 預覽…"; -"action_generate_code" = "產生程式碼…"; -"action_simulation" = "模擬"; -"action_diagram" = "圖表"; -"simulation_placeholder_body" = "模擬模式會逐步執行圖表,醒目提示目前元素,並顯示變數值和輸出。"; -"simulation_controls" = "控制"; -"simulation_highlight_label" = "醒目提示"; -"simulation_highlight_last" = "上一步"; -"simulation_highlight_next" = "下一步"; -"simulation_not_available" = "Play 會自動執行模擬,每步暫停 0.5 秒。"; -"simulation_play" = "播放"; -"simulation_pause" = "暫停"; -"simulation_step" = "單步"; -"simulation_stop" = "停止"; -"simulation_input" = "輸入"; -"simulation_input_placeholder" = "不需要輸入。"; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "請輸入一個整數。"; -"simulation_trace" = "上一步"; -"simulation_trace_placeholder" = "尚未執行任何步驟。"; -"simulation_variables" = "變數"; -"simulation_variables_placeholder" = "暫無變數。"; -"simulation_output" = "輸出"; -"simulation_output_placeholder" = "暫無輸出。"; -"action_delete_selection" = "刪除選取項目"; -"ctx_copy" = "複製"; -"ctx_cut" = "剪下"; -"ctx_paste" = "貼上"; -"action_settings" = "設定"; -"action_about" = "關於 VisuStruct"; -"recent_files_menu" = "最近檔案"; -"recent_files_empty" = "沒有最近檔案"; -"recent_files_clear" = "清除列表"; -"recent_files_unavailable" = "檔案已無法使用。"; - -/* In-app settings */ -"settings_language_title" = "語言"; -"settings_language_de" = "德文"; -"settings_language_en" = "英文"; -"settings_language_es" = "西班牙文"; -"settings_language_fr" = "法文"; -"settings_language_it" = "義大利文"; -"settings_language_pl" = "波蘭文"; -"settings_language_tr" = "土耳其文"; -"settings_language_ko" = "韓文"; -"settings_language_ja" = "日文"; -"settings_language_el" = "希臘文"; -"settings_language_uk" = "烏克蘭文"; -"settings_language_ar" = "阿拉伯文"; -"settings_language_ru" = "俄文"; -"settings_language_he" = "希伯來文"; -"settings_language_zh_hans" = "中文(簡體)"; -"settings_language_zh_hant" = "中文(繁體)"; -"settings_language_ptpt" = "葡萄牙文"; -"settings_language_java" = "Java(關鍵字)"; - - -/* Error overlay */ -"error_title" = "錯誤"; -"error_back_editor" = "回到編輯器"; - -/* Toolbar */ -"toolbar_undo" = "復原"; -"toolbar_redo" = "重做"; -"toolbar_new" = "新增"; -"menu_open" = "開啟…"; -"menu_save" = "儲存"; -"menu_save_as" = "另存新檔…"; -"menu_print" = "列印…"; -"menu_file" = "檔案"; -"menu_new" = "新增"; -"menu_close" = "關閉"; - -/* Accessibility */ -"a11y_generate_code" = "從結構圖產生程式碼"; -"a11y_generate_code_locked" = "產生程式碼(購買後可用)"; -"a11y_unsaved_changes" = "未儲存的變更"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "產生程式碼"; -"codegen_gate_body" = "將透過 App 內購買解鎖從圖表產生的 Java、Python 與 JavaScript 程式碼(即將推出)。"; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "程式碼產生器"; -"codegen_placeholder_body" = "產生的程式碼會顯示在這裡。"; -"codegen_placeholder_compare" = "在 Java、Python 與 JavaScript 之間切換以比較語法(下方範例)。"; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (條件) {\\n 陳述式();\\n} else {\\n 替代();\\n}"; -"codegen_preview_python" = "if 條件:\\n 陳述式()\\nelse:\\n 替代()"; -"codegen_copy" = "複製"; -"codegen_run_in_browser" = "在瀏覽器中測試"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "新增圖表分頁"; -"a11y_close_tab" = "關閉分頁"; - -"close_unsaved_title" = "未儲存的變更"; -"close_unsaved_message" = "此圖表包含未儲存的變更。關閉前要儲存嗎?"; -"close_unsaved_discard" = "捨棄"; -"close_unsaved_cancel" = "取消"; -"a11y_placeholder_drop" = "將元素拖放到這裡以取代佔位符。長按可拖曳移動。"; -"a11y_node_drop" = "長按區塊並拖曳:放到目標上緣或下緣以插入到前/後。僅能在 ø 佔位符上置中放下。"; -"a11y_codegen_panel_drag" = "拖移以移動程式碼產生器面板"; - -/* Diagram */ -"diagram_title_label" = "標題"; -"diagram_title_placeholder" = "無標題"; - -/* Inspector */ -"inspector_no_selection" = "未選取任何元素 — 點一下區塊。"; -"inspector_apply_text" = "套用文字"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "類型"; -"inspector_io_mode_statement" = "敘述"; -"inspector_io_mode_input" = "輸入"; -"inspector_io_mode_output" = "輸出"; -"inspector_io_mode_help_java_like" = "輸入: input: … | 輸出: output: …"; -"inspector_add_case" = "新增分支"; -"inspector_remove_case" = "移除分支"; -"inspector_group_element" = "元素文字"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "輸入條件…"; -"inspector_placeholder_selector" = "輸入選擇式…"; -"inspector_placeholder_call" = "輸入呼叫…"; -"inspector_placeholder_break" = "註解(選填)"; - -/* Element types */ -"element_anweisung" = "陳述式"; -"element_verzweigung" = "分支"; -"element_fallauswahl" = "選擇"; -"element_forSchleife" = "for 迴圈"; -"element_whileSchleife" = "while 迴圈"; -"element_doUntilSchleife" = "do-while 迴圈"; -"element_endlosschleife" = "無限迴圈"; -"element_aussprung" = "跳出"; -"element_aufruf" = "呼叫"; -"element_leerElement" = "空元素"; - -/* Tabs */ -"tab_title_format" = "圖表 %d"; - -/* Empty canvas */ -"canvas_empty_title" = "空結構圖"; -"canvas_empty_hint" = "從「元素」拖曳一個區塊到這裡。"; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "選擇"; -"canvas_stub_anweisung" = "陳述式"; -"canvas_stub_condition" = "條件"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "無限"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "呼叫()"; - -/* About */ -"about_version_fmt" = "版本 %@ (%@)"; -"about_nav_title" = "關於 VisuStruct"; -"about_features_heading" = "功能"; -"about_bullet_palette" = "從調色盤插入區塊,或拖曳到圖表"; -"about_bullet_edit" = "編輯圖表:修改文字、選取元素,必要時刪除"; -"about_bullet_tabs" = "多個圖表分頁——每個都有自己的標題"; -"about_bullet_file" = "將圖表儲存並以 .visustruct 檔案重新開啟"; -"about_bullet_share" = "將結構圖分享為圖片(PNG)"; -"about_dateiformat_heading" = "檔案格式"; -"about_dateiformat_part1" = "VisuStruct 的原生格式使用副檔名 "; -"about_dateiformat_part2" = "。你可以保存圖表,並與支援相同格式的其他 App 交換。"; -"about_dateiformat_strk" = "也可以開啟 .strk 副檔名的檔案。"; -"about_project_github_label" = "Java App(原始碼與版本):"; -"about_web_label" = "網站:"; -"about_developer_label" = "開發者:"; -"about_lineage_heading" = "沿革"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java 上游:"; -"about_done" = "完成"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "取消插入"; -"phone_show_text_editor" = "編輯文字"; -"phone_hide_text_editor" = "收合"; -"phone_title_done" = "完成"; - -/* Alerts */ -"err_save_failed_fmt" = "無法儲存:%@"; -"err_share_prepare_failed_fmt" = "無法準備分享:%@"; -"err_diagram_too_small_export" = "圖表太小——沒有可匯出的內容。"; -"err_image_render_failed" = "無法建立圖片。"; -"err_diagram_too_small_print" = "圖表太小——沒有可列印的內容。"; -"err_print_unavailable" = "此裝置不支援列印。"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "檔名建議"; -"settings_export_filename_picker" = "格式"; -"settings_export_filename_date_title" = "含日期"; -"settings_export_filename_title_only" = "不含日期"; -"settings_export_filename_footer_with_date" = "含日期: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "不含日期: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "模擬已結束。"; -"sim_notice_infinite_loop_empty" = "無限迴圈沒有迴圈主體。"; -"sim_notice_unsupported_statement_fmt" = "不支援的敘述:%@"; -"sim_notice_invalid_expression_fmt" = "無效的運算式:%@"; -"sim_notice_unknown_variable_fmt" = "未知變數:%@"; -"sim_notice_division_by_zero" = "除數為零。"; -"sim_notice_whole_number_expected" = "請輸入整數。"; -"sim_notice_number_expected" = "請輸入數字。"; -"sim_notice_boolean_expected" = "請輸入 true 或 false。"; -"sim_notice_subprogram_not_found_fmt" = "沒有名為 %@ 的已開啟圖表。已略過該呼叫。"; -"sim_notice_call_too_deep" = "巢狀呼叫過多。是否有子程式呼叫了自己?"; - -"codegen_pseudocode_toggle" = "虛擬碼(無法執行的程式碼)"; -"codegen_pseudocode_note" = "虛擬碼 – 不是可執行的程式"; -"codegen_pseudocode_hint" = "此圖已標示為虛擬碼。程式碼只是草稿,無法執行。"; -`;export{e as default}; diff --git a/website/app/assets/Localizable-LSTVB2Q5.js b/website/app/assets/Localizable-LSTVB2Q5.js deleted file mode 100644 index 1ac68831..00000000 --- a/website/app/assets/Localizable-LSTVB2Q5.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Elementos"; -"inspector_header" = "Inspector de objetos"; - -/* Actions */ -"action_share_png" = "Compartir imagen…"; -"action_share_document" = "Compartir archivo…"; -"action_export_pdf" = "Vista previa PDF…"; -"action_generate_code" = "Generar código…"; -"action_simulation" = "Simulación"; -"action_diagram" = "Diagrama"; -"simulation_placeholder_body" = "El modo de simulación ejecuta el diagrama paso a paso, resalta el elemento actual y muestra los valores de variables y las salidas."; -"simulation_controls" = "Controles"; -"simulation_highlight_label" = "Resaltado"; -"simulation_highlight_last" = "Último paso"; -"simulation_highlight_next" = "Siguiente paso"; -"simulation_not_available" = "Play ejecuta la simulación automáticamente con una pausa de 0,5 segundos por paso."; -"simulation_play" = "Reproducir"; -"simulation_pause" = "Pausa"; -"simulation_step" = "Paso"; -"simulation_stop" = "Detener"; -"simulation_input" = "Entrada"; -"simulation_input_placeholder" = "No se requiere entrada."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Introduce un número entero."; -"simulation_trace" = "Último paso"; -"simulation_trace_placeholder" = "Aún no se ha ejecutado ningún paso."; -"simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Aún no hay variables."; -"simulation_output" = "Salida"; -"simulation_output_placeholder" = "Aún no hay salida."; -"action_delete_selection" = "Eliminar selección"; -"ctx_copy" = "Copiar"; -"ctx_cut" = "Cortar"; -"ctx_paste" = "Pegar"; -"action_settings" = "Ajustes"; -"action_about" = "Acerca de VisuStruct"; -"recent_files_menu" = "Recientes"; -"recent_files_empty" = "No hay archivos recientes"; -"recent_files_clear" = "Borrar lista"; -"recent_files_unavailable" = "El archivo ya no está disponible."; - -/* In-app settings */ -"settings_language_title" = "Idioma"; -"settings_language_de" = "Alemán"; -"settings_language_en" = "Inglés"; -"settings_language_es" = "Español"; -"settings_language_fr" = "Francés"; -"settings_language_it" = "Italiano"; -"settings_language_pl" = "Polaco"; -"settings_language_tr" = "Turco"; -"settings_language_ko" = "Coreano"; -"settings_language_ja" = "Japonés"; -"settings_language_el" = "Griego"; -"settings_language_uk" = "Ucraniano"; -"settings_language_ar" = "Árabe"; -"settings_language_ru" = "Ruso"; -"settings_language_he" = "Hebreo"; -"settings_language_zh_hans" = "Chino (simplificado)"; -"settings_language_zh_hant" = "Chino (tradicional)"; -"settings_language_ptpt" = "Portugués"; -"settings_language_java" = "Java (palabras clave)"; - - -/* Error overlay */ -"error_title" = "Error"; -"error_back_editor" = "Volver al editor"; - -/* Toolbar */ -"toolbar_undo" = "Deshacer"; -"toolbar_redo" = "Rehacer"; -"toolbar_new" = "Nuevo"; -"menu_open" = "Abrir…"; -"menu_save" = "Guardar"; -"menu_save_as" = "Guardar como…"; -"menu_print" = "Imprimir…"; -"menu_file" = "Archivo"; -"menu_new" = "Nuevo"; -"menu_close" = "Cerrar"; - -/* Accessibility */ -"a11y_generate_code" = "Generar código a partir del diagrama"; -"a11y_generate_code_locked" = "Generar código, disponible tras la compra"; -"a11y_unsaved_changes" = "Cambios sin guardar"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Generar código"; -"codegen_gate_body" = "El código Java, Python y JavaScript a partir de tu diagrama estará disponible mediante una compra integrada (próximamente)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Generador de código"; -"codegen_placeholder_body" = "Aquí aparecerá el código generado."; -"codegen_placeholder_compare" = "Cambia entre Java, Python y JavaScript para comparar la sintaxis (ejemplo abajo)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condición) {\\n instrucción();\\n} else {\\n alternativa();\\n}"; -"codegen_preview_python" = "if condición:\\n instrucción()\\nelse:\\n alternativa()"; -"codegen_copy" = "Copiar"; -"codegen_run_in_browser" = "Probar en el navegador"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Nueva pestaña de diagrama"; -"a11y_close_tab" = "Cerrar pestaña"; - -"close_unsaved_title" = "Cambios sin guardar"; -"close_unsaved_message" = "Este diagrama contiene cambios sin guardar. ¿Quieres guardarlos antes de cerrar?"; -"close_unsaved_discard" = "Descartar"; -"close_unsaved_cancel" = "Cancelar"; -"a11y_placeholder_drop" = "Suelta un elemento aquí para reemplazar el marcador. Mantén pulsado para arrastrar y mover."; -"a11y_node_drop" = "Mantén pulsado un bloque y arrastra: suelta en el borde superior o inferior para insertar antes o después. Suelta en el centro solo sobre un marcador ø."; -"a11y_codegen_panel_drag" = "Arrastra para mover el panel del generador de código"; - -/* Diagram */ -"diagram_title_label" = "Título"; -"diagram_title_placeholder" = "Sin título"; - -/* Inspector */ -"inspector_no_selection" = "Ningún elemento seleccionado — toca una pieza."; -"inspector_apply_text" = "Aplicar texto"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Tipo"; -"inspector_io_mode_statement" = "Instrucción"; -"inspector_io_mode_input" = "Entrada"; -"inspector_io_mode_output" = "Salida"; -"inspector_io_mode_help_java_like" = "Entrada: input: … | Salida: output: …"; -"inspector_add_case" = "Añadir caso"; -"inspector_remove_case" = "Eliminar caso"; -"inspector_group_element" = "Texto del elemento"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Insertar condición…"; -"inspector_placeholder_selector" = "Insertar selector…"; -"inspector_placeholder_call" = "Insertar llamada…"; -"inspector_placeholder_break" = "Comentario (opcional)"; - -/* Element types */ -"element_anweisung" = "Instrucción"; -"element_verzweigung" = "Decisión"; -"element_fallauswahl" = "Selección"; -"element_forSchleife" = "Bucle for"; -"element_whileSchleife" = "Bucle while"; -"element_doUntilSchleife" = "Bucle do-while"; -"element_endlosschleife" = "Bucle infinito"; -"element_aussprung" = "Salida"; -"element_aufruf" = "Llamada"; -"element_leerElement" = "Elemento vacío"; - -/* Tabs */ -"tab_title_format" = "Diagrama %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Diagrama vacío"; -"canvas_empty_hint" = "Arrastra un elemento de «Elementos» aquí."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Selección"; -"canvas_stub_anweisung" = "Instrucción"; -"canvas_stub_condition" = "Condición"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "infinito"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Llamada()"; - -/* About */ -"about_version_fmt" = "Versión %@ (%@)"; -"about_nav_title" = "Acerca de VisuStruct"; -"about_features_heading" = "Funciones"; -"about_bullet_palette" = "Insertar bloques desde la paleta o arrastrarlos al diagrama"; -"about_bullet_edit" = "Editar el diagrama: cambiar texto, seleccionar elementos y eliminarlos si es necesario"; -"about_bullet_tabs" = "Varios diagramas en pestañas — cada uno con su propio título"; -"about_bullet_file" = "Guardar y volver a abrir diagramas como archivos .visustruct"; -"about_bullet_share" = "Compartir el diagrama como imagen (PNG)"; -"about_dateiformat_heading" = "Formato de archivo"; -"about_dateiformat_part1" = "El formato nativo de VisuStruct usa la extensión "; -"about_dateiformat_part2" = ". Puedes guardar diagramas e intercambiarlos con otras apps compatibles."; -"about_dateiformat_strk" = "También se pueden abrir archivos con la extensión .strk."; -"about_project_github_label" = "App Java (código y versiones):"; -"about_web_label" = "Web:"; -"about_developer_label" = "Desarrollador:"; -"about_lineage_heading" = "Origen"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Hecho"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Cancelar inserción"; -"phone_show_text_editor" = "Editar texto"; -"phone_hide_text_editor" = "Contraer"; -"phone_title_done" = "Listo"; - -/* Alerts */ -"err_save_failed_fmt" = "No se pudo guardar: %@"; -"err_share_prepare_failed_fmt" = "No se pudo preparar para compartir: %@"; -"err_diagram_too_small_export" = "El diagrama es demasiado pequeño — nada que exportar."; -"err_image_render_failed" = "No se pudo crear la imagen."; -"err_diagram_too_small_print" = "El diagrama es demasiado pequeño — nada que imprimir."; -"err_print_unavailable" = "La impresión no está disponible en este dispositivo."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Sugerencia de nombre de archivo"; -"settings_export_filename_picker" = "Formato"; -"settings_export_filename_date_title" = "Con fecha"; -"settings_export_filename_title_only" = "Sin fecha"; -"settings_export_filename_footer_with_date" = "Con fecha: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Sin fecha: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simulación terminada."; -"sim_notice_infinite_loop_empty" = "El bucle infinito no tiene cuerpo."; -"sim_notice_unsupported_statement_fmt" = "Instrucción no admitida: %@"; -"sim_notice_invalid_expression_fmt" = "Expresión no válida: %@"; -"sim_notice_unknown_variable_fmt" = "Variable desconocida: %@"; -"sim_notice_division_by_zero" = "División por cero."; -"sim_notice_whole_number_expected" = "Introduce un número entero."; -"sim_notice_number_expected" = "Introduce un número."; -"sim_notice_boolean_expected" = "Introduce true o false."; -"sim_notice_subprogram_not_found_fmt" = "Ningún diagrama abierto se llama %@. Se omitió la llamada."; -"sim_notice_call_too_deep" = "Demasiadas llamadas anidadas. ¿Un subprograma se llama a sí mismo?"; - -"codegen_pseudocode_toggle" = "Pseudocódigo (código no ejecutable)"; -"codegen_pseudocode_note" = "Pseudocódigo – no es un programa ejecutable"; -"codegen_pseudocode_hint" = "Este diagrama está marcado como pseudocódigo. El código es solo un esbozo y no se puede ejecutar."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-M33nNbEe.js b/website/app/assets/Localizable-M33nNbEe.js deleted file mode 100644 index ca1fdc43..00000000 --- a/website/app/assets/Localizable-M33nNbEe.js +++ /dev/null @@ -1,153 +0,0 @@ -const e=`/* NOTE: Initial Swedish localization. */ -"palette_header" = "Element"; -"inspector_header" = "Objektinspektör"; - -/* Actions */ -"action_share_png" = "Dela bild…"; -"action_share_document" = "Dela fil…"; -"action_export_pdf" = "Förhandsvisa PDF…"; -"action_generate_code" = "Generera kod…"; -"action_simulation" = "Simulering"; -"action_diagram" = "Diagram"; -"simulation_placeholder_body" = "Simuleringsläget kör diagrammet steg för steg, markerar det aktuella elementet och visar variabelvärden och utdata."; -"simulation_controls" = "Kontroller"; -"simulation_highlight_label" = "Markering"; -"simulation_highlight_last" = "Senaste steg"; -"simulation_highlight_next" = "Nästa steg"; -"simulation_not_available" = "Play kör simuleringen automatiskt med 0,5 sekunders paus per steg."; -"simulation_play" = "Spela"; -"simulation_pause" = "Paus"; -"simulation_step" = "Steg"; -"simulation_stop" = "Stopp"; -"simulation_input" = "Inmatning"; -"simulation_input_placeholder" = "Ingen inmatning krävs."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Ange ett heltal."; -"simulation_trace" = "Senaste steg"; -"simulation_trace_placeholder" = "Inget steg har körts ännu."; -"simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Inga variabler ännu."; -"simulation_output" = "Utdata"; -"simulation_output_placeholder" = "Ingen utmatning ännu."; -"action_delete_selection" = "Radera markering"; -"ctx_copy" = "Kopiera"; -"ctx_cut" = "Klipp ut"; -"ctx_paste" = "Klistra in"; -"action_settings" = "Inställningar"; -"action_about" = "Om VisuStruct"; -"recent_files_menu" = "Senaste filer"; -"recent_files_empty" = "Inga senaste filer"; -"recent_files_clear" = "Rensa lista"; -"recent_files_unavailable" = "Filen är inte längre tillgänglig."; - -/* In-app settings */ -"settings_language_title" = "Språk"; - -/* Toolbar */ -"toolbar_undo" = "Ångra"; -"toolbar_redo" = "Gör om"; -"toolbar_new" = "Ny"; -"menu_open" = "Öppna…"; -"menu_save" = "Spara"; -"menu_save_as" = "Spara som…"; -"menu_print" = "Skriv ut…"; -"menu_file" = "Arkiv"; -"menu_new" = "Ny"; -"menu_close" = "Stäng"; - -/* Inspector */ -"inspector_no_selection" = "Ingen markering — tryck på en ruta."; -"inspector_apply_text" = "Tillämpa text"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Typ"; -"inspector_io_mode_statement" = "Sats"; -"inspector_io_mode_input" = "Inmatning"; -"inspector_io_mode_output" = "Utmatning"; -"inspector_io_mode_help_java_like" = "Inmatning: input: … | Utmatning: output: …"; -"inspector_add_case" = "Lägg till case"; -"inspector_remove_case" = "Ta bort case"; -"inspector_group_element" = "Elementtext"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Skriv condition…"; -"inspector_placeholder_selector" = "Skriv selector…"; -"inspector_placeholder_call" = "Skriv call…"; -"inspector_placeholder_break" = "Kommentar (valfritt)"; - -/* Element types */ -"element_anweisung" = "Sats"; -"element_verzweigung" = "Villkor (if/else)"; -"element_fallauswahl" = "Val (switch)"; -"element_forSchleife" = "For-loop"; -"element_whileSchleife" = "While-loop"; -"element_doUntilSchleife" = "Do-while-loop"; -"element_endlosschleife" = "Oändlig loop"; -"element_aussprung" = "Break"; -"element_aufruf" = "Anrop"; -"element_leerElement" = "Tomt element"; - -/* Diagram */ -"diagram_title_label" = "Titel"; -"diagram_title_placeholder" = "Ingen titel"; -"canvas_empty_title" = "Tomt struktogram"; -"canvas_empty_hint" = "Dra ett element från “Element” hit."; - -/* Diagram stubs */ -"canvas_stub_anweisung" = "statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "switch"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "endless"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Anrop()"; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Förslag på filnamn"; -"settings_export_filename_picker" = "Format"; -"settings_export_filename_date_title" = "Med datum"; -"settings_export_filename_title_only" = "Utan datum"; -"settings_export_filename_footer_with_date" = "Med datum: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Utan datum: Filename.visustruct"; - -"close_unsaved_title" = "Osparade ändringar"; -"close_unsaved_message" = "Det här diagrammet innehåller osparade ändringar. Vill du spara dem innan du stänger?"; -"close_unsaved_discard" = "Kasta"; -"close_unsaved_cancel" = "Avbryt"; - -/* Accessibility — code generator floating panel */ -"a11y_codegen_panel_drag" = "Dra för att flytta kodgeneratorpanelen"; -"about_dateiformat_strk" = "Filer med tillägget .strk kan också öppnas."; - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Simuleringen är klar."; -"sim_notice_infinite_loop_empty" = "Den oändliga loopen saknar innehåll."; -"sim_notice_unsupported_statement_fmt" = "Sats som inte stöds: %@"; -"sim_notice_invalid_expression_fmt" = "Ogiltigt uttryck: %@"; -"sim_notice_unknown_variable_fmt" = "Okänd variabel: %@"; -"sim_notice_division_by_zero" = "Division med noll."; -"sim_notice_whole_number_expected" = "Ange ett heltal."; -"sim_notice_number_expected" = "Ange ett tal."; -"sim_notice_boolean_expected" = "Ange true eller false."; -"sim_notice_subprogram_not_found_fmt" = "Inget öppet diagram heter %@. Anropet hoppades över."; -"sim_notice_call_too_deep" = "För många nästlade anrop. Anropar ett underprogram sig självt?"; -"phone_hide_text_editor" = "Fäll ihop"; -"phone_title_done" = "Klar"; - -"codegen_pseudocode_toggle" = "Pseudokod (inte körbar kod)"; -"codegen_pseudocode_note" = "Pseudokod – inte ett körbart program"; -"codegen_pseudocode_hint" = "Det här diagrammet är markerat som pseudokod. Koden är bara en skiss och kan inte köras."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-R-16GCrk.js b/website/app/assets/Localizable-R-16GCrk.js deleted file mode 100644 index 2d8f645d..00000000 --- a/website/app/assets/Localizable-R-16GCrk.js +++ /dev/null @@ -1,241 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "רכיבים"; -"inspector_header" = "מפקח אובייקטים"; - -/* Actions */ -"action_share_png" = "שיתוף תמונה…"; -"action_share_document" = "שיתוף קובץ…"; -"action_export_pdf" = "תצוגה מקדימה של PDF…"; -"action_generate_code" = "יצירת קוד…"; -"action_simulation" = "סימולציה"; -"action_diagram" = "תרשים"; -"simulation_placeholder_body" = "מצב הסימולציה מריץ את התרשים צעד אחר צעד, מדגיש את הרכיב הנוכחי ומציג ערכי משתנים ופלט."; -"simulation_controls" = "פקדים"; -"simulation_highlight_label" = "הדגשה"; -"simulation_highlight_last" = "הצעד האחרון"; -"simulation_highlight_next" = "הצעד הבא"; -"simulation_not_available" = "Play מריץ את הסימולציה אוטומטית עם השהיה של 0.5 שניות לכל צעד."; -"simulation_play" = "הפעלה"; -"simulation_pause" = "השהיה"; -"simulation_step" = "צעד"; -"simulation_stop" = "עצירה"; -"simulation_input" = "קלט"; -"simulation_input_placeholder" = "לא נדרש קלט."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "הזינו מספר שלם."; -"simulation_trace" = "הצעד האחרון"; -"simulation_trace_placeholder" = "עדיין לא בוצע אף צעד."; -"simulation_variables" = "משתנים"; -"simulation_variables_placeholder" = "עדיין אין משתנים."; -"simulation_output" = "פלט"; -"simulation_output_placeholder" = "עדיין אין פלט."; -"action_delete_selection" = "מחיקת בחירה"; -"ctx_copy" = "העתק"; -"ctx_cut" = "גזור"; -"ctx_paste" = "הדבק"; -"action_settings" = "הגדרות"; -"action_about" = "אודות VisuStruct"; -"recent_files_menu" = "קבצים אחרונים"; -"recent_files_empty" = "אין קבצים אחרונים"; -"recent_files_clear" = "נקה רשימה"; -"recent_files_unavailable" = "הקובץ אינו זמין עוד."; - -/* In-app settings */ -"settings_language_title" = "שפה"; -"settings_language_de" = "גרמנית"; -"settings_language_en" = "אנגלית"; -"settings_language_es" = "ספרדית"; -"settings_language_fr" = "צרפתית"; -"settings_language_it" = "איטלקית"; -"settings_language_pl" = "פולנית"; -"settings_language_tr" = "טורקית"; -"settings_language_ko" = "קוריאנית"; -"settings_language_ja" = "יפנית"; -"settings_language_el" = "יוונית"; -"settings_language_uk" = "אוקראינית"; -"settings_language_ar" = "ערבית"; -"settings_language_ru" = "רוסית"; -"settings_language_he" = "עברית"; -"settings_language_zh_hans" = "סינית (מפושטת)"; -"settings_language_zh_hant" = "סינית (מסורתית)"; -"settings_language_ptpt" = "פורטוגזית"; -"settings_language_java" = "Java (מילות מפתח)"; - - -/* Error overlay */ -"error_title" = "שגיאה"; -"error_back_editor" = "חזרה לעורך"; - -/* Toolbar */ -"toolbar_undo" = "בטל"; -"toolbar_redo" = "בצע שוב"; -"toolbar_new" = "חדש"; -"menu_open" = "פתח…"; -"menu_save" = "שמור"; -"menu_save_as" = "שמור בשם…"; -"menu_print" = "הדפס…"; -"menu_file" = "קובץ"; -"menu_new" = "חדש"; -"menu_close" = "סגור"; - -/* Accessibility */ -"a11y_generate_code" = "יצירת קוד מהתרשים"; -"a11y_generate_code_locked" = "יצירת קוד, זמין לאחר רכישה"; -"a11y_unsaved_changes" = "שינויים שלא נשמרו"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "יצירת קוד"; -"codegen_gate_body" = "קוד Java, Python ו‑JavaScript מהתרשים ייפתח באמצעות רכישה בתוך האפליקציה (בקרוב)."; -"codegen_gate_ok" = "אישור"; -"codegen_placeholder_title" = "מחולל קוד"; -"codegen_placeholder_body" = "הקוד שייווצר יופיע כאן."; -"codegen_placeholder_compare" = "עברו בין Java, Python ו‑JavaScript להשוואת תחביר (דוגמה למטה)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (condition) {\\n statement();\\n} else {\\n alternative();\\n}"; -"codegen_preview_python" = "if condition:\\n statement()\\nelse:\\n alternative()"; -"codegen_copy" = "העתק"; -"codegen_run_in_browser" = "בדיקה בדפדפן"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "כרטיסיית תרשים חדשה"; -"a11y_close_tab" = "סגור כרטיסייה"; - -"close_unsaved_title" = "שינויים שלא נשמרו"; -"close_unsaved_message" = "בתרשים זה יש שינויים שלא נשמרו. לשמור אותם לפני הסגירה?"; -"close_unsaved_discard" = "התעלם"; -"close_unsaved_cancel" = "ביטול"; -"a11y_placeholder_drop" = "שחררו רכיב כאן כדי להחליף את מציין המקום. לחצו והחזיקו כדי לגרור ולהזיז."; -"a11y_node_drop" = "לחצו והחזיקו בלוק ואז גררו: שחררו על הקצה העליון או התחתון כדי להוסיף לפני או אחרי. שחרור במרכז רק על מציין מקום ø."; -"a11y_codegen_panel_drag" = "גרור כדי להזיז את לוח מחולל הקוד"; - -/* Diagram */ -"diagram_title_label" = "כותרת"; -"diagram_title_placeholder" = "ללא כותרת"; - -/* Inspector */ -"inspector_no_selection" = "לא נבחר רכיב — הקישו על אריח."; -"inspector_apply_text" = "החל טקסט"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "סוג"; -"inspector_io_mode_statement" = "הוראה"; -"inspector_io_mode_input" = "קלט"; -"inspector_io_mode_output" = "פלט"; -"inspector_io_mode_help_java_like" = "קלט: input: … | פלט: output: …"; -"inspector_add_case" = "הוסף מקרה"; -"inspector_remove_case" = "הסר מקרה"; -"inspector_group_element" = "טקסט רכיב"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "הוסף condition…"; -"inspector_placeholder_selector" = "הוסף selector…"; -"inspector_placeholder_call" = "הוסף call…"; -"inspector_placeholder_break" = "הערה (רשות)"; - -/* Element types — keep Java-like (LTR) to reduce RTL confusion */ -"element_anweisung" = "Statement"; -"element_verzweigung" = "if"; -"element_fallauswahl" = "switch"; -"element_forSchleife" = "for"; -"element_whileSchleife" = "while"; -"element_doUntilSchleife" = "do"; -"element_endlosschleife" = "while(true)"; -"element_aussprung" = "break"; -"element_aufruf" = "קריאה"; -"element_leerElement" = "ø"; - -/* Tabs */ -"tab_title_format" = "תרשים %d"; - -/* Empty canvas */ -"canvas_empty_title" = "תרשים ריק"; -"canvas_empty_hint" = "גררו בלוק מתוך „רכיבים“ לכאן."; - -/* Diagram: new element stubs & column headers — keep Java-like */ -"canvas_stub_anweisung" = "Statement"; -"canvas_stub_condition" = "condition"; -"canvas_stub_fallauswahl" = "selector"; -"canvas_stub_for" = "i = 0; i < n; i++"; -"canvas_stub_while" = "condition"; -"canvas_stub_until" = "condition"; -"canvas_stub_endless" = "∞"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "קריאה()"; - -/* About */ -"about_version_fmt" = "גרסה %@ (%@)"; -"about_nav_title" = "אודות VisuStruct"; -"about_features_heading" = "תכונות"; -"about_bullet_palette" = "הוספת בלוקים מהפלטה או גרירה אל התרשים"; -"about_bullet_edit" = "עריכת התרשים: שינוי טקסט, בחירת רכיבים ומחיקה לפי הצורך"; -"about_bullet_tabs" = "כמה תרשימים בכרטיסיות — לכל אחד כותרת משלו"; -"about_bullet_file" = "שמירה ופתיחה של תרשימים כקבצי ‎.visustruct"; -"about_bullet_share" = "שיתוף התרשים כתמונה (PNG)"; -"about_dateiformat_heading" = "פורמט קובץ"; -"about_dateiformat_part1" = "הפורמט המקורי של VisuStruct משתמש בסיומת "; -"about_dateiformat_part2" = ". ניתן לשמור תרשימים ולהחליף אותם עם אפליקציות אחרות שתומכות באותו פורמט."; -"about_dateiformat_strk" = "ניתן לפתוח גם קבצים עם הסיומת .strk."; -"about_project_github_label" = "אפליקציית Java (מקור וגרסאות):"; -"about_web_label" = "אתר:"; -"about_developer_label" = "מפתח:"; -"about_lineage_heading" = "מקור"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "סיום"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "בטל הוספה"; -"phone_show_text_editor" = "עריכת טקסט"; -"phone_hide_text_editor" = "כיווץ"; -"phone_title_done" = "סיום"; - -/* Alerts */ -"err_save_failed_fmt" = "לא ניתן לשמור: %@"; -"err_share_prepare_failed_fmt" = "לא ניתן להכין שיתוף: %@"; -"err_diagram_too_small_export" = "התרשים קטן מדי — אין מה לייצא."; -"err_image_render_failed" = "לא ניתן ליצור תמונה."; -"err_diagram_too_small_print" = "התרשים קטן מדי — אין מה להדפיס."; -"err_print_unavailable" = "הדפסה אינה זמינה במכשיר זה."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "הצעת שם קובץ"; -"settings_export_filename_picker" = "פורמט"; -"settings_export_filename_date_title" = "עם תאריך"; -"settings_export_filename_title_only" = "בלי תאריך"; -"settings_export_filename_footer_with_date" = "עם תאריך: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "בלי תאריך: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "הסימולציה הסתיימה."; -"sim_notice_infinite_loop_empty" = "ללולאה האינסופית אין גוף."; -"sim_notice_unsupported_statement_fmt" = "הוראה לא נתמכת: %@"; -"sim_notice_invalid_expression_fmt" = "ביטוי לא חוקי: %@"; -"sim_notice_unknown_variable_fmt" = "משתנה לא ידוע: %@"; -"sim_notice_division_by_zero" = "חלוקה באפס."; -"sim_notice_whole_number_expected" = "יש להזין מספר שלם."; -"sim_notice_number_expected" = "יש להזין מספר."; -"sim_notice_boolean_expected" = "הזן true או false."; -"sim_notice_subprogram_not_found_fmt" = "אין תרשים פתוח בשם %@. הקריאה דולגה."; -"sim_notice_call_too_deep" = "יותר מדי קריאות מקוננות. האם תת־תוכנית קוראת לעצמה?"; - -"codegen_pseudocode_toggle" = "פסאודו-קוד (קוד שאינו ניתן להרצה)"; -"codegen_pseudocode_note" = "פסאודו-קוד – לא תוכנית שניתן להריץ"; -"codegen_pseudocode_hint" = "תרשים זה מסומן כפסאודו-קוד. הקוד הוא רק טיוטה ולא ניתן להריץ אותו."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-UGog_aku.js b/website/app/assets/Localizable-UGog_aku.js deleted file mode 100644 index 0caa0638..00000000 --- a/website/app/assets/Localizable-UGog_aku.js +++ /dev/null @@ -1,238 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Елементи"; -"inspector_header" = "Інспектор об’єктів"; - -/* Actions */ -"action_share_png" = "Поділитися зображенням…"; -"action_share_document" = "Поділитися файлом…"; -"action_export_pdf" = "Перегляд PDF…"; -"action_generate_code" = "Згенерувати код…"; -"action_simulation" = "Симуляція"; -"action_diagram" = "Діаграма"; -"simulation_placeholder_body" = "Режим симуляції виконує діаграму крок за кроком, підсвічує поточний елемент і показує значення змінних та вивід."; -"simulation_controls" = "Керування"; -"simulation_highlight_label" = "Підсвічування"; -"simulation_highlight_last" = "Останній крок"; -"simulation_highlight_next" = "Наступний крок"; -"simulation_not_available" = "Play автоматично виконує симуляцію з паузою 0,5 секунди на крок."; -"simulation_play" = "Відтворити"; -"simulation_pause" = "Пауза"; -"simulation_step" = "Крок"; -"simulation_stop" = "Стоп"; -"simulation_input" = "Ввід"; -"simulation_input_placeholder" = "Ввід не потрібен."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Введіть ціле число."; -"simulation_trace" = "Останній крок"; -"simulation_trace_placeholder" = "Ще не виконано жодного кроку."; -"simulation_variables" = "Змінні"; -"simulation_variables_placeholder" = "Змінних поки немає."; -"simulation_output" = "Вивід"; -"simulation_output_placeholder" = "Виведення поки немає."; -"action_delete_selection" = "Видалити вибране"; -"ctx_copy" = "Копіювати"; -"ctx_cut" = "Вирізати"; -"ctx_paste" = "Вставити"; -"action_settings" = "Налаштування"; -"action_about" = "Про VisuStruct"; -"recent_files_menu" = "Останні файли"; -"recent_files_empty" = "Немає останніх файлів"; -"recent_files_clear" = "Очистити список"; -"recent_files_unavailable" = "Файл більше недоступний."; - -/* In-app settings */ -"settings_language_title" = "Мова"; -"settings_language_de" = "Німецька"; -"settings_language_en" = "Англійська"; -"settings_language_es" = "Іспанська"; -"settings_language_fr" = "Французька"; -"settings_language_it" = "Італійська"; -"settings_language_pl" = "Польська"; -"settings_language_tr" = "Турецька"; -"settings_language_ko" = "Корейська"; -"settings_language_ja" = "Японська"; -"settings_language_el" = "Грецька"; -"settings_language_uk" = "Українська"; -"settings_language_zh_hans" = "Китайська (спрощена)"; -"settings_language_zh_hant" = "Китайська (традиційна)"; -"settings_language_ptpt" = "Португальська"; -"settings_language_java" = "Java (ключові слова)"; - - -/* Error overlay */ -"error_title" = "Помилка"; -"error_back_editor" = "Назад до редактора"; - -/* Toolbar */ -"toolbar_undo" = "Скасувати"; -"toolbar_redo" = "Повторити"; -"toolbar_new" = "Нове"; -"menu_open" = "Відкрити…"; -"menu_save" = "Зберегти"; -"menu_save_as" = "Зберегти як…"; -"menu_print" = "Друк…"; -"menu_file" = "Файл"; -"menu_new" = "Створити"; -"menu_close" = "Закрити"; - -/* Accessibility */ -"a11y_generate_code" = "Згенерувати код зі структурної схеми"; -"a11y_generate_code_locked" = "Згенерувати код, доступно після покупки"; -"a11y_unsaved_changes" = "Незбережені зміни"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Згенерувати код"; -"codegen_gate_body" = "Код Java, Python і JavaScript з вашої схеми буде розблоковано через покупку в застосунку (незабаром)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Генератор коду"; -"codegen_placeholder_body" = "Згенерований код з’явиться тут."; -"codegen_placeholder_compare" = "Перемикайтеся між Java, Python і JavaScript, щоб порівняти синтаксис (приклад нижче)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (умова) {\\n інструкція();\\n} else {\\n альтернатива();\\n}"; -"codegen_preview_python" = "if умова:\\n інструкція()\\nelse:\\n альтернатива()"; -"codegen_copy" = "Копіювати"; -"codegen_run_in_browser" = "Перевірити в браузері"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Нова вкладка схеми"; -"a11y_close_tab" = "Закрити вкладку"; - -"close_unsaved_title" = "Незбережені зміни"; -"close_unsaved_message" = "Ця діаграма містить незбережені зміни. Зберегти їх перед закриттям?"; -"close_unsaved_discard" = "Відхилити"; -"close_unsaved_cancel" = "Скасувати"; -"a11y_placeholder_drop" = "Перетягніть елемент сюди, щоб замінити заповнювач. Натисніть і утримуйте, щоб перемістити."; -"a11y_node_drop" = "Натисніть і утримуйте блок, потім перетягніть: скиньте на верхній або нижній край цілі, щоб вставити до або після. Скидання в центрі лише на заповнювач ø."; -"a11y_codegen_panel_drag" = "Перетягніть панель генератора коду"; - -/* Diagram */ -"diagram_title_label" = "Назва"; -"diagram_title_placeholder" = "Без назви"; - -/* Inspector */ -"inspector_no_selection" = "Елемент не вибрано — торкніться плитки."; -"inspector_apply_text" = "Застосувати текст"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Вид"; -"inspector_io_mode_statement" = "Інструкція"; -"inspector_io_mode_input" = "Введення"; -"inspector_io_mode_output" = "Виведення"; -"inspector_io_mode_help_java_like" = "Java: input: int zahl | output: number"; -"inspector_add_case" = "Додати випадок"; -"inspector_remove_case" = "Видалити випадок"; -"inspector_group_element" = "Текст елемента"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Вставити умову…"; -"inspector_placeholder_selector" = "Вставити selector…"; -"inspector_placeholder_call" = "Вставити виклик…"; -"inspector_placeholder_break" = "Коментар (необов'язково)"; - -/* Element types (Ukrainian + keyword hint) */ -"element_anweisung" = "Інструкція (statement)"; -"element_verzweigung" = "Умова (if/else)"; -"element_fallauswahl" = "Вибір (switch)"; -"element_forSchleife" = "Цикл (for)"; -"element_whileSchleife" = "Цикл (while)"; -"element_doUntilSchleife" = "Цикл (do-while)"; -"element_endlosschleife" = "Нескінченний цикл (while true)"; -"element_aussprung" = "Вихід (break)"; -"element_aufruf" = "Виклик (call)"; -"element_leerElement" = "Порожній елемент"; - -/* Tabs */ -"tab_title_format" = "Схема %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Порожня структурна схема"; -"canvas_empty_hint" = "Перетягніть елемент з «Елементи» сюди."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Вибір (switch)"; -"canvas_stub_anweisung" = "Інструкція (statement)"; -"canvas_stub_condition" = "Умова"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "нескінченний"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Виклик()"; - -/* About */ -"about_version_fmt" = "Версія %@ (%@)"; -"about_nav_title" = "Про VisuStruct"; -"about_features_heading" = "Можливості"; -"about_bullet_palette" = "Вставляйте блоки з палітри або перетягуйте їх у схему"; -"about_bullet_edit" = "Редагуйте схему: змінюйте текст, вибирайте елементи та видаляйте за потреби"; -"about_bullet_tabs" = "Кілька схем у вкладках — кожна з власною назвою"; -"about_bullet_file" = "Зберігайте та відкривайте схеми як файли .visustruct"; -"about_bullet_share" = "Поділіться схемою як зображенням (PNG)"; -"about_dateiformat_heading" = "Формат файлу"; -"about_dateiformat_part1" = "Рідний формат VisuStruct використовує розширення "; -"about_dateiformat_part2" = ". Ви можете зберігати схеми та обмінюватися ними з іншими застосунками, що підтримують цей формат."; -"about_dateiformat_strk" = "Файли з розширенням .strk також можна відкривати."; -"about_project_github_label" = "Java застосунок (код і релізи):"; -"about_web_label" = "Веб:"; -"about_developer_label" = "Розробник:"; -"about_lineage_heading" = "Походження"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Готово"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Скасувати вставку"; -"phone_show_text_editor" = "Редагувати текст"; -"phone_hide_text_editor" = "Згорнути"; -"phone_title_done" = "Готово"; - -/* Alerts */ -"err_save_failed_fmt" = "Не вдалося зберегти: %@"; -"err_share_prepare_failed_fmt" = "Не вдалося підготувати поширення: %@"; -"err_diagram_too_small_export" = "Схема занадто мала — нічого експортувати."; -"err_image_render_failed" = "Не вдалося створити зображення."; -"err_diagram_too_small_print" = "Схема занадто мала — нічого друкувати."; -"err_print_unavailable" = "Друк недоступний на цьому пристрої."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Запропонована назва файлу"; -"settings_export_filename_picker" = "Формат"; -"settings_export_filename_date_title" = "З датою"; -"settings_export_filename_title_only" = "Без дати"; -"settings_export_filename_footer_with_date" = "З датою: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Без дати: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Симуляцію завершено."; -"sim_notice_infinite_loop_empty" = "Нескінченний цикл не має тіла."; -"sim_notice_unsupported_statement_fmt" = "Непідтримувана інструкція: %@"; -"sim_notice_invalid_expression_fmt" = "Неприпустимий вираз: %@"; -"sim_notice_unknown_variable_fmt" = "Невідома змінна: %@"; -"sim_notice_division_by_zero" = "Ділення на нуль."; -"sim_notice_whole_number_expected" = "Введіть ціле число."; -"sim_notice_number_expected" = "Введіть число."; -"sim_notice_boolean_expected" = "Введіть true або false."; -"sim_notice_subprogram_not_found_fmt" = "Немає відкритої діаграми з назвою %@. Виклик пропущено."; -"sim_notice_call_too_deep" = "Забагато вкладених викликів. Підпрограма викликає сама себе?"; - -"codegen_pseudocode_toggle" = "Псевдокод (не виконуваний код)"; -"codegen_pseudocode_note" = "Псевдокод – не виконувана програма"; -"codegen_pseudocode_hint" = "Цю діаграму позначено як псевдокод. Код — лише ескіз, його не можна запустити."; -`;export{e as default}; diff --git a/website/app/assets/Localizable-rqA-20hM.js b/website/app/assets/Localizable-rqA-20hM.js deleted file mode 100644 index 71a0cbb2..00000000 --- a/website/app/assets/Localizable-rqA-20hM.js +++ /dev/null @@ -1,238 +0,0 @@ -const e=`/* Palette */ -"palette_header" = "Στοιχεία"; -"inspector_header" = "Επιθεωρητής αντικειμένων"; - -/* Actions */ -"action_share_png" = "Κοινή χρήση εικόνας…"; -"action_share_document" = "Κοινή χρήση αρχείου…"; -"action_export_pdf" = "Προεπισκόπηση PDF…"; -"action_generate_code" = "Δημιουργία κώδικα…"; -"action_simulation" = "Προσομοίωση"; -"action_diagram" = "Διάγραμμα"; -"simulation_placeholder_body" = "Η λειτουργία προσομοίωσης εκτελεί το διάγραμμα βήμα προς βήμα, επισημαίνει το τρέχον στοιχείο και εμφανίζει τις τιμές των μεταβλητών και την έξοδο."; -"simulation_controls" = "Έλεγχος"; -"simulation_highlight_label" = "Επισήμανση"; -"simulation_highlight_last" = "Τελευταίο βήμα"; -"simulation_highlight_next" = "Επόμενο βήμα"; -"simulation_not_available" = "Το Play εκτελεί αυτόματα την προσομοίωση με παύση 0,5 δευτερολέπτων ανά βήμα."; -"simulation_play" = "Αναπαραγωγή"; -"simulation_pause" = "Παύση"; -"simulation_step" = "Βήμα"; -"simulation_stop" = "Διακοπή"; -"simulation_input" = "Είσοδος"; -"simulation_input_placeholder" = "Δεν απαιτείται είσοδος."; -"simulation_input_submit" = "OK"; -"simulation_input_invalid_int" = "Πληκτρολογήστε έναν ακέραιο αριθμό."; -"simulation_trace" = "Τελευταίο βήμα"; -"simulation_trace_placeholder" = "Δεν έχει εκτελεστεί ακόμη κανένα βήμα."; -"simulation_variables" = "Μεταβλητές"; -"simulation_variables_placeholder" = "Δεν υπάρχουν ακόμη μεταβλητές."; -"simulation_output" = "Έξοδος"; -"simulation_output_placeholder" = "Δεν υπάρχει ακόμη έξοδος."; -"action_delete_selection" = "Διαγραφή επιλογής"; -"ctx_copy" = "Αντιγραφή"; -"ctx_cut" = "Αποκοπή"; -"ctx_paste" = "Επικόλληση"; -"action_settings" = "Ρυθμίσεις"; -"action_about" = "Σχετικά με το VisuStruct"; -"recent_files_menu" = "Πρόσφατα αρχεία"; -"recent_files_empty" = "Δεν υπάρχουν πρόσφατα αρχεία"; -"recent_files_clear" = "Εκκαθάριση λίστας"; -"recent_files_unavailable" = "Το αρχείο δεν είναι πλέον διαθέσιμο."; - -/* In-app settings */ -"settings_language_title" = "Γλώσσα"; -"settings_language_de" = "Γερμανικά"; -"settings_language_en" = "Αγγλικά"; -"settings_language_es" = "Ισπανικά"; -"settings_language_fr" = "Γαλλικά"; -"settings_language_it" = "Ιταλικά"; -"settings_language_pl" = "Πολωνικά"; -"settings_language_tr" = "Τουρκικά"; -"settings_language_ko" = "Κορεατικά"; -"settings_language_ja" = "Ιαπωνικά"; -"settings_language_el" = "Ελληνικά"; -"settings_language_uk" = "Ουκρανικά"; -"settings_language_zh_hans" = "Κινέζικα (Απλοποιημένα)"; -"settings_language_zh_hant" = "Κινέζικα (Παραδοσιακά)"; -"settings_language_ptpt" = "Πορτογαλικά"; -"settings_language_java" = "Java (λέξεις-κλειδιά)"; - - -/* Error overlay */ -"error_title" = "Σφάλμα"; -"error_back_editor" = "Πίσω στον επεξεργαστή"; - -/* Toolbar */ -"toolbar_undo" = "Αναίρεση"; -"toolbar_redo" = "Επανάληψη"; -"toolbar_new" = "Νέο"; -"menu_open" = "Άνοιγμα…"; -"menu_save" = "Αποθήκευση"; -"menu_save_as" = "Αποθήκευση ως…"; -"menu_print" = "Εκτύπωση…"; -"menu_file" = "Αρχείο"; -"menu_new" = "Νέο"; -"menu_close" = "Κλείσιμο"; - -/* Accessibility */ -"a11y_generate_code" = "Δημιουργία κώδικα από το διάγραμμα"; -"a11y_generate_code_locked" = "Δημιουργία κώδικα, διαθέσιμο μετά την αγορά"; -"a11y_unsaved_changes" = "Μη αποθηκευμένες αλλαγές"; - -/* Code generator (IAP to follow) */ -"codegen_gate_title" = "Δημιουργία κώδικα"; -"codegen_gate_body" = "Ο κώδικας Java, Python και JavaScript από το διάγραμμά σας θα ξεκλειδωθεί μέσω αγοράς εντός εφαρμογής (σύντομα)."; -"codegen_gate_ok" = "OK"; -"codegen_placeholder_title" = "Γεννήτρια κώδικα"; -"codegen_placeholder_body" = "Ο παραγόμενος κώδικας θα εμφανίζεται εδώ."; -"codegen_placeholder_compare" = "Εναλλαγή μεταξύ Java, Python και JavaScript για σύγκριση σύνταξης (παράδειγμα παρακάτω)."; -"codegen_target_java" = "Java"; -"codegen_target_python" = "Python"; -"codegen_target_javascript" = "JavaScript"; -"codegen_preview_java" = "if (συνθήκη) {\\n εντολή();\\n} else {\\n εναλλακτική();\\n}"; -"codegen_preview_python" = "if συνθήκη:\\n εντολή()\\nelse:\\n εναλλακτική()"; -"codegen_copy" = "Αντιγραφή"; -"codegen_run_in_browser" = "Δοκιμή στο πρόγραμμα περιήγησης"; -"codegen_save_java" = "Save Java…"; -"codegen_java_output_mode" = "Java output"; -"codegen_java_output_snippet" = "Snippet"; -"codegen_java_output_class" = "Class"; -"a11y_new_diagram_tab" = "Νέα καρτέλα διαγράμματος"; -"a11y_close_tab" = "Κλείσιμο καρτέλας"; - -"close_unsaved_title" = "Μη αποθηκευμένες αλλαγές"; -"close_unsaved_message" = "Αυτό το διάγραμμα περιέχει μη αποθηκευμένες αλλαγές. Θέλετε να τις αποθηκεύσετε πριν το κλείσιμο;"; -"close_unsaved_discard" = "Απόρριψη"; -"close_unsaved_cancel" = "Άκυρο"; -"a11y_placeholder_drop" = "Αποθέστε ένα στοιχείο εδώ για να αντικαταστήσετε το σύμβολο κράτησης. Πατήστε παρατεταμένα για μετακίνηση."; -"a11y_node_drop" = "Πατήστε παρατεταμένα ένα μπλοκ και σύρετε: αποθέστε στην πάνω/κάτω ακμή για εισαγωγή πριν/μετά. Κεντρική απόθεση μόνο σε ø."; -"a11y_codegen_panel_drag" = "Σύρετε για να μετακινήσετε το πλαίσιο δημιουργίας κώδικα"; - -/* Diagram */ -"diagram_title_label" = "Τίτλος"; -"diagram_title_placeholder" = "Χωρίς τίτλο"; - -/* Inspector */ -"inspector_no_selection" = "Δεν έχει επιλεγεί στοιχείο — πατήστε ένα πλακίδιο."; -"inspector_apply_text" = "Εφαρμογή κειμένου"; -"inspector_for_init" = "Init"; -"inspector_for_condition" = "Condition"; -"inspector_for_step" = "Step"; -"inspector_for_placeholder_init" = "int i = 0"; -"inspector_for_placeholder_condition" = "i < 5"; -"inspector_for_placeholder_step" = "i++"; - -"inspector_io_mode_title" = "Είδος"; -"inspector_io_mode_statement" = "Εντολή"; -"inspector_io_mode_input" = "Είσοδος"; -"inspector_io_mode_output" = "Έξοδος"; -"inspector_io_mode_help_java_like" = "Java: input: int zahl | output: number"; -"inspector_add_case" = "Προσθήκη περίπτωσης"; -"inspector_remove_case" = "Αφαίρεση περίπτωσης"; -"inspector_group_element" = "Κείμενο στοιχείου"; -"inspector_placeholder_statement" = "int sum = number1 + number2"; -"inspector_placeholder_condition" = "Εισαγωγή συνθήκης…"; -"inspector_placeholder_selector" = "Εισαγωγή selector…"; -"inspector_placeholder_call" = "Εισαγωγή κλήσης…"; -"inspector_placeholder_break" = "Σχόλιο (προαιρετικό)"; - -/* Element types (Greek + keyword hint) */ -"element_anweisung" = "Εντολή (statement)"; -"element_verzweigung" = "Συνθήκη (if/else)"; -"element_fallauswahl" = "Επιλογή (switch)"; -"element_forSchleife" = "Επανάληψη (for)"; -"element_whileSchleife" = "Επανάληψη (while)"; -"element_doUntilSchleife" = "Επανάληψη (do-while)"; -"element_endlosschleife" = "Ατέρμονος βρόχος (while true)"; -"element_aussprung" = "Έξοδος (break)"; -"element_aufruf" = "Κλήση (call)"; -"element_leerElement" = "Κενό στοιχείο"; - -/* Tabs */ -"tab_title_format" = "Διάγραμμα %d"; - -/* Empty canvas */ -"canvas_empty_title" = "Κενό διάγραμμα"; -"canvas_empty_hint" = "Σύρετε ένα στοιχείο από τα «Στοιχεία» εδώ."; - -/* Diagram: new element stubs & column headers (display) */ -"canvas_stub_fallauswahl" = "Επιλογή (switch)"; -"canvas_stub_anweisung" = "Εντολή (statement)"; -"canvas_stub_condition" = "Συνθήκη"; -"canvas_stub_for" = "for 0 < i < n"; -"canvas_stub_while" = "while …"; -"canvas_stub_until" = "until …"; -"canvas_stub_endless" = "ατέρμονο"; -"canvas_stub_break" = "break"; -"canvas_stub_call" = "Κλήση()"; - -/* About */ -"about_version_fmt" = "Έκδοση %@ (%@)"; -"about_nav_title" = "Σχετικά με το VisuStruct"; -"about_features_heading" = "Δυνατότητες"; -"about_bullet_palette" = "Εισαγωγή μπλοκ από την παλέτα ή μεταφορά τους στο διάγραμμα"; -"about_bullet_edit" = "Επεξεργασία διαγράμματος: αλλαγή κειμένου, επιλογή στοιχείων και διαγραφή αν χρειάζεται"; -"about_bullet_tabs" = "Πολλά διαγράμματα σε καρτέλες — το καθένα με τίτλο"; -"about_bullet_file" = "Αποθήκευση και άνοιγμα διαγραμμάτων ως αρχεία .visustruct"; -"about_bullet_share" = "Κοινή χρήση διαγράμματος ως εικόνα (PNG)"; -"about_dateiformat_heading" = "Μορφή αρχείου"; -"about_dateiformat_part1" = "Η εγγενής μορφή του VisuStruct χρησιμοποιεί την επέκταση "; -"about_dateiformat_part2" = ". Μπορείτε να αποθηκεύετε και να ανταλλάσσετε διαγράμματα με άλλες εφαρμογές που υποστηρίζουν την ίδια μορφή."; -"about_dateiformat_strk" = "Μπορούν να ανοίξουν και αρχεία με επέκταση .strk."; -"about_project_github_label" = "Εφαρμογή Java (πηγαίος κώδικας & εκδόσεις):"; -"about_web_label" = "Ιστός:"; -"about_developer_label" = "Προγραμματιστής:"; -"about_lineage_heading" = "Καταγωγή"; -"about_lineage_body" = "VisuStruct originally began as a Java desktop app and remains available across platforms for use in schools. The current Swift/SwiftUI version is the modern native app for Mac, iPad, and iPhone and remains compatible with the .visustruct file format. It builds on the original open-source work by Kevin Krummenauer (MIT)."; -"about_lineage_upstream_label" = "Java upstream:"; -"about_done" = "Τέλος"; -"about_copyright" = "Copyright © 2026 Holger Sebastiao"; - -/* iPhone: tap-to-insert */ -"phone_insert_cancel" = "Ακύρωση εισαγωγής"; -"phone_show_text_editor" = "Επεξεργασία κειμένου"; -"phone_hide_text_editor" = "Σύμπτυξη"; -"phone_title_done" = "Τέλος"; - -/* Alerts */ -"err_save_failed_fmt" = "Δεν ήταν δυνατή η αποθήκευση: %@"; -"err_share_prepare_failed_fmt" = "Δεν ήταν δυνατή η προετοιμασία κοινής χρήσης: %@"; -"err_diagram_too_small_export" = "Το διάγραμμα είναι πολύ μικρό — δεν υπάρχει τίποτα για εξαγωγή."; -"err_image_render_failed" = "Δεν ήταν δυνατή η δημιουργία εικόνας."; -"err_diagram_too_small_print" = "Το διάγραμμα είναι πολύ μικρό — δεν υπάρχει τίποτα για εκτύπωση."; -"err_print_unavailable" = "Η εκτύπωση δεν είναι διαθέσιμη σε αυτή τη συσκευή."; - -"settings_ui_scale_section" = "Text size"; -"settings_ui_scale_canvas" = "Structure chart"; -"settings_ui_scale_inspector" = "Text entry below"; -"settings_ui_scale_small" = "Small"; -"settings_ui_scale_medium" = "Medium"; -"settings_ui_scale_large" = "Large"; -"settings_ui_scale_extra_large" = "Extra large"; - -"settings_export_filename_section" = "Πρόταση ονόματος αρχείου"; -"settings_export_filename_picker" = "Μορφή"; -"settings_export_filename_date_title" = "Με ημερομηνία"; -"settings_export_filename_title_only" = "Χωρίς ημερομηνία"; -"settings_export_filename_footer_with_date" = "Με ημερομηνία: yyyy-mm-dd-Filename.visustruct"; -"settings_export_filename_footer_without_date" = "Χωρίς ημερομηνία: Filename.visustruct"; - - -/* Simulation: Meldungen */ -"sim_notice_finished" = "Η προσομοίωση ολοκληρώθηκε."; -"sim_notice_infinite_loop_empty" = "Ο ατέρμονος βρόχος δεν έχει σώμα."; -"sim_notice_unsupported_statement_fmt" = "Μη υποστηριζόμενη εντολή: %@"; -"sim_notice_invalid_expression_fmt" = "Μη έγκυρη έκφραση: %@"; -"sim_notice_unknown_variable_fmt" = "Άγνωστη μεταβλητή: %@"; -"sim_notice_division_by_zero" = "Διαίρεση με το μηδέν."; -"sim_notice_whole_number_expected" = "Εισαγάγετε έναν ακέραιο αριθμό."; -"sim_notice_number_expected" = "Εισαγάγετε έναν αριθμό."; -"sim_notice_boolean_expected" = "Πληκτρολογήστε true ή false."; -"sim_notice_subprogram_not_found_fmt" = "Κανένα ανοιχτό διάγραμμα δεν ονομάζεται %@. Η κλήση παραλείφθηκε."; -"sim_notice_call_too_deep" = "Πάρα πολλές ένθετες κλήσεις. Καλεί ένα υποπρόγραμμα τον εαυτό του;"; - -"codegen_pseudocode_toggle" = "Ψευδοκώδικας (μη εκτελέσιμος κώδικας)"; -"codegen_pseudocode_note" = "Ψευδοκώδικας – όχι εκτελέσιμο πρόγραμμα"; -"codegen_pseudocode_hint" = "Αυτό το διάγραμμα έχει επισημανθεί ως ψευδοκώδικας. Ο κώδικας είναι μόνο ένα σχέδιο και δεν μπορεί να εκτελεστεί."; -`;export{e as default}; diff --git a/website/app/assets/ada-lovelace-DS_988PF.jpg b/website/app/assets/ada-lovelace-DS_988PF.jpg deleted file mode 100644 index 1c5802bd67caa16e84f2d4c5405c1e99e91df09c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70192 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 diff --git a/website/app/assets/ar-AgbDXJ1P.js b/website/app/assets/ar-AgbDXJ1P.js deleted file mode 100644 index 0da61abc..00000000 --- a/website/app/assets/ar-AgbDXJ1P.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* نصوص موجودة في نسخة الويب فقط. أما بقية النصوص فتأتي من ملف Localizable.strings الخاص بالتطبيق. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "مخطط VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "تصدير…"; -"web_export_title" = "حفظ كصورة أو PDF، أو طباعة"; -"web_export_png" = "صورة (PNG)"; -"web_export_svg" = "رسم متجهي (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "ملف VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "فشل التصدير: %@"; -"web_print_hint" = "استخدم «تصدير… → PDF» لحفظ المخطط ثم طباعته من هناك."; -"web_delete" = "حذف"; -"web_language_title" = "لغة الواجهة"; -"web_simulation_start" = "بدء المحاكاة"; -"web_simulation_end" = "إنهاء المحاكاة"; -"web_simulation_start_title" = "تشغيل المخطط خطوة بخطوة"; -"web_simulation_end_title" = "إنهاء المحاكاة ومتابعة التحرير"; -"web_palette_hint" = "اسحب إلى المخطط"; -"web_tabs_label" = "المخططات"; -"web_status_modified" = "معدَّل"; -"web_inspector_title" = "الخصائص"; -"web_inspector_resize" = "تغيير ارتفاع مفتش الكائنات: اسحب الخط لأعلى أو لأسفل (نقر مزدوج: الافتراضي)"; -"web_inspector_help_drop" = "اسحب العناصر من اللوحة إلى كتلة: أعلى = قبل، أسفل = بعد، على «ø» = استبدال. يمكن نقل العناصر الموجودة بالفأرة."; -"web_inspector_help_inline" = "انقر نقرًا مزدوجًا أو المس مرتين على عنصر لتعديل نصه مباشرة في المخطط (Enter للتطبيق، Esc للإلغاء). وكذلك أسماء الحالات."; -"web_inspector_help_files" = "يمكنك أيضًا إفلات الملفات في النافذة."; -"web_case_name" = "اسم الحالة"; -"web_case_name_placeholder" = "مثلًا 1، ok، default"; -"web_copied" = "تم نسخ العنصر."; -"web_discard_message_fmt" = "ستُفقد التغييرات على «%@»."; -"web_err_unreadable_fmt" = "«%@» ليس ملف VisuStruct قابلًا للقراءة (%@)."; -"web_saved_fmt" = "تم حفظ «%@»."; -"web_saved_txt_fmt" = "تم الحفظ باسم «%@». احذف الامتداد .txt لاستخدامه."; -"web_drop_impossible" = "لا يمكن الإفلات هنا"; -"web_sim_delay" = "التوقف لكل خطوة"; -"web_sim_delay_value_fmt" = "%@ ث"; -"web_codegen_language" = "اللغة"; -"web_codegen_comments" = "نص المخطط كتعليقات"; -"web_codegen_empty_else" = "إخراج فرع else فارغ في الشفرة"; -"web_copied_check" = "تم النسخ ✓"; -"web_copy_manual" = "تم التحديد، اضغط Ctrl+C للنسخ"; -"web_run_stopped_loop" = "توقف التنفيذ: حلقة لا نهائية محتملة."; -"web_run_cancelled" = "تم إلغاء التنفيذ."; -"web_run_error" = "خطأ أثناء التشغيل."; -"web_run_dropped_fmt" = "… تم إخفاء %d من الأسطر السابقة"; -"web_sim_call_arguments_fmt" = "الاستدعاء لا يطابق ترويسة %@. تحقق من القيم بين القوسين."; -"web_sim_missing_return_fmt" = "انتهى %@ دون إرجاع قيمة باستخدام return."; -"web_sim_file_not_found_fmt" = "لا يوجد ملف باسم %@."; -"web_sim_end_of_file_fmt" = "لا يوجد سطر آخر في الملف %@."; -"web_sim_null_value_fmt" = "القيمة في %@ هي null."; -"web_sim_unknown_variable_case_fmt" = "متغير غير معروف: %1$@. تميّز Java بين الأحرف الكبيرة والصغيرة: هل تقصد %2$@؟"; -"web_sim_written_file_fmt" = "%@ (محفوظ)"; -"web_site_home" = "الصفحة الرئيسية"; -"web_site_imprint" = "بيانات الناشر"; -"web_site_privacy" = "الخصوصية"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "البرمجة"; -"web_live_hide" = "إخفاء البرمجة"; -"web_scale_canvas" = "حجم النص: المخطط"; -"web_scale_code" = "حجم النص: البرمجة"; -"web_live_indent" = "إزاحة"; -"web_live_indent_title" = "إزاحة الشيفرة: أربع مسافات لكل مستوى (الأسطر المحددة، وإلا فالكل)"; -"web_live_show" = "إظهار البرمجة"; -"web_live_resize" = "تغيير عرض منطقة الشيفرة (نقر مزدوج: إعادة تعيين)"; -"web_live_hint" = "تنمو الشيفرة مع مخططك. الرمادي = عنصر نائب: اكتب في المفتش ليظهر نصك هنا. انقر على سطر لتحديد عنصره."; -"web_live_ph_selector" = "المتغير"; -"web_live_ph_code" = "شيفرتك"; -"web_live_ph_end" = "النهاية"; -"web_live_language" = "لغة البرمجة"; -"web_live_java_class" = "كصنف"; -"web_live_java_class_hint" = "اسم الصنف = عنوان المخطط"; -"web_live_java_main" = "مع الطريقة main"; -"web_settings_display" = "العرض"; -"web_live_swing" = "جافا حقيقية (مع Swing)"; -"web_live_swing_hint" = "جافا حقيقية مع نوافذ (CheerpJ). تُنزّل نحو 40 ميغابايت مرة واحدة عند أول تشغيل."; -"web_live_swing_windows" = "نوافذ جافا"; -"web_live_swing_hide" = "إغلاق نوافذ جافا"; -"web_live_swing_loading" = "جارٍ تحميل جافا (نحو 40 ميغابايت في المرة الأولى) …"; -"web_live_swing_compiling" = "جارٍ الترجمة …"; -"web_live_swing_running" = "البرنامج قيد التشغيل."; -"web_live_swing_compile_failed" = "خطأ في الترجمة، انظر أعلاه."; -"web_live_swing_failed" = "تعذّر تحميل جافا. تحقّق من الاتصال بالإنترنت."; -"web_live_hint_edit" = "اكتب هنا شيفرة Java وسيُبنى المخطط تلقائيًا. أو اعمل في المخطط وستنمو الشيفرة معه. الرمادي = عنصر نائب، اكتب فوقه مباشرة."; -"web_live_edit_label" = "شيفرة Java"; -"web_parse_line_fmt" = "السطر %d: %@"; -"web_parse_missing" = "ما زال ينقص هنا: %@"; -"web_parse_extra" = "زائد: %@"; -"web_parse_unclosed_string" = "ينقص %@ الإغلاق هنا."; -"web_parse_else_without_if" = "لا يوجد «if» لهذا «else»."; -"web_parse_case_outside_switch" = "«case» و«default» مكانهما داخل «switch»."; -"web_parse_missing_do_while" = "بعد «do { … }» ينقص «while (الشرط);»."; -"web_parse_more_methods" = "حاليًا تُحتسب طريقة واحدة فقط هنا. أنشئ البرامج الفرعية الأخرى في علامات تبويب منفصلة."; -"web_parse_missing_import" = "ينقص في الأعلى %@ بدون هذا السطر لا تعرف Java الصنف Scanner."; -"web_parse_missing_scanner" = "ينقص قبل ذلك %@ بدون هذا السطر لا يوجد Scanner."; -"web_parse_unknown_type" = "لا تعرف Java نوع البيانات هذا. هل تقصد %@؟"; -"web_quickfix_insert_fmt" = "اقتراح: إدراج %@"; -"web_quickfix_replace_fmt" = "اقتراح: %1$@ بدلاً من %2$@"; -"web_parse_wrong_case" = "تميّز Java بين الأحرف الكبيرة والصغيرة. الصحيح هو %@."; -"web_editor_title" = "المخطط"; -"web_editor_show" = "إظهار المخطط"; -"web_editor_hide" = "إخفاء المخطط"; -"web_keywords_title" = "كلمات الشيفرة المفتاحية"; -"web_keywords_hint" = "if و while و for بدلًا من أسماء العناصر"; -"web_palette_compact" = "العناصر مضغوطة دائمًا"; -"web_palette_compact_hint" = "رمز مع اسم صغير تحته، وإلا فقط عندما يكون العمود ضيقًا"; -"web_about_version_fmt" = "الإصدار %@"; -"web_about_software" = "البرمجيات المستخدمة"; -"web_about_software_text" = "يستخدم محرر الشيفرة CodeMirror و Lezer (ترخيص MIT). مع دعم Swing يحمّل VisuStruct برنامج CheerpJ من Leaning Technologies (ترخيص Community) و javac من OpenJDK."; -"web_about_licenses" = "نصوص التراخيص"; -"web_live_run" = "تشغيل"; -"web_live_run_title" = "تشغيل البرنامج: تظهر المخرجات والمدخلات بالأسفل"; -"web_live_run_finished" = "انتهى البرنامج."; -"web_live_run_stopped" = "تم الإيقاف."; -"web_console" = "وحدة التحكم"; -"web_console_hide" = "إخفاء وحدة التحكم"; -"web_console_resize" = "تغيير ارتفاع وحدة التحكم"; -"web_diagram_tools" = "أدوات المخطط"; -"web_files_title" = "الملفات"; -"web_files_show" = "إظهار الملفات"; -"web_files_hide" = "إخفاء الملفات"; -"web_files_resize" = "تغيير عرض الملفات"; -"web_files_new_folder" = "مجلد جديد"; -"web_files_switch" = "اختيار مجلد آخر"; -"web_files_delete" = "حذف"; -"web_files_in_browser" = "في تخزين هذا المتصفح"; -"web_files_save_hint_fmt" = "الحفظ يضع البرنامج في %@."; -"web_files_empty" = "لم يُحفظ شيء بعد. عند الحفظ ينشئ VisuStruct هنا مجلداً بتاريخ اليوم."; -"web_files_reconnect_hint" = "بعد إعادة التحميل يسأل المتصفح مرة أخرى إن كان يمكن لـ VisuStruct استخدام مجلدك."; -"web_files_reconnect_fmt" = "فتح المجلد «%@»"; -"web_files_connect_hint" = "اختر مجلداً كمساحة عمل. ينشئ VisuStruct فيه مجلداً لكل يوم ويحفظ المخطط والشيفرة."; -"web_files_connect" = "اختيار مجلد"; -"web_files_browser_hint" = "لا يستطيع هذا المتصفح فتح مجلدات الجهاز (مثلاً على iPad). تبقى ملفاتك في تخزين هذا المتصفح."; -"web_files_browser" = "الحفظ في المتصفح"; -"web_files_delete_confirm_fmt" = "هل تريد حذف «%@» فعلاً؟"; -"web_files_folder_prompt" = "اسم المجلد الجديد:"; -"web_files_default_name" = "برنامج"; -"web_files_saved_fmt" = "تم الحفظ: %@"; -"web_files_create" = "إنشاء"; -"web_learn_ludwig_tip" = "نصيحة لودفيغ"; -"web_game_title" = "لعبة: صحيح أم خطأ؟"; -"web_game_intro" = "يعرض لك لودفيغ قيماً وشرطاً. هل الشرط صحيح (true) أم خطأ (false)؟ عشر جولات تزداد صعوبة."; -"web_game_start" = "ابدأ اللعبة"; -"web_game_round_fmt" = "الجولة %@ من %@"; -"web_game_score_fmt" = "النقاط: %@"; -"web_game_true" = "صحيح (true)"; -"web_game_false" = "خطأ (false)"; -"web_game_right" = "صحيح!"; -"web_game_wrong" = "ليس تماماً. هكذا يُحسب:"; -"web_game_next" = "التالي"; -"web_game_finish" = "النتيجة"; -"web_game_done_fmt" = "%@ من %@ صحيحة."; -"web_game_perfect" = "كلها صحيحة – لودفيغ معجب جداً!"; -"web_game_good" = "رائع! راجع أخطاءك وحاول مرة أخرى."; -"web_game_practice" = "التمرين يصنع الإتقان. اقرأ جدول الحقيقة مرة أخرى والعب جولة أخرى."; -"web_game_again" = "العب مرة أخرى"; -"web_game_wrong_short" = "للأسف خطأ."; -"web_game_practice_short" = "التمرين يصنع الإتقان. اقرأ الشروح مرة أخرى والعب جولة أخرى."; -"web_game_clicks" = "النقرات:"; -"web_game_nobody" = "لا أحد يستمع – لا يحدث شيء."; -"web_game_event_fmt" = "نقرة على «%@»: المستمع يسمعها وينفّذ شيفرته."; -"web_game_try" = "جرّب الآن أزرار النافذة بنفسك."; -"web_game_time_fmt" = "متبقٍ %@ ث"; -"web_game_defused" = "✂️ تم تعطيلها! وجدت الخطأ."; -"web_game_boom_time" = "💥 بوم! انتهى الوقت."; -"web_game_boom_wrong" = "💥 بوم! كان ذلك السطر الخطأ."; -"web_game_boom_part" = "💥 بوم! السطر صحيح، لكن الخطأ في جزء آخر منه."; -"web_game_boom_wrong_part" = "💥 بوم! الخطأ في سطر آخر."; -"web_game_bomb_parts_hint" = "اضغط على الجزء الخاطئ بالضبط."; -"web_game_fix" = "السطر الصحيح:"; -"web_game_order_hint" = "اضغط على الخطوات بالترتيب الصحيح."; -"web_debug_step" = "خطوة"; -"web_debug_step_title" = "خطوة: تنفيذ تعليمة واحدة ثم التوقف مجدداً"; -"web_debug_continue" = "متابعة حتى نقطة التوقف التالية"; -"web_debug_paused_fmt" = "متوقف قبل السطر %d."; -"web_debug_gutter_title" = "انقر على رقم السطر لوضع نقطة توقف أو إزالتها"; -"web_swap_to_code" = "البرمجة كبيرة"; -"web_swap_to_editor" = "المخطط كبير"; -"web_editor_resize" = "تغيير عرض المخطط"; -"web_palette_resize" = "تغيير عرض العناصر"; -"web_palette_hide" = "إخفاء العناصر"; -"web_palette_show" = "إظهار العناصر"; -"web_code_scopes" = "كتل الشيفرة ملوّنة"; -"web_code_scopes_hint" = "الصنف والدالة والحلقة والتفرّع في مربعات خاصة"; -"web_pseudocode" = "شبه كود"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "إعادة تسمية المتغير …"; -"web_rename_title" = "إعادة تسمية المتغير"; -"web_rename_old" = "الاسم"; -"web_rename_new" = "الاسم الجديد"; -"web_rename_hint" = "يغيّر كل موضع بهذه الكتابة تمامًا (number ليس Number)، في الشيفرة وفي المخطط الهيكلي. يبقى النص بين \\"…\\" والتعليقات كما هي."; -"web_rename_count_fmt" = "يظهر %d مرة."; -"web_rename_exists_fmt" = "«%@» موجود بالفعل: بعدها يصبح المتغيران متغيرًا واحدًا."; -"web_rename_invalid" = "يبدأ الاسم بحرف ويحتوي على حروف وأرقام و _ فقط."; -"web_rename_keyword_fmt" = "«%@» كلمة مفتاحية في Java."; -"web_rename_apply" = "إعادة تسمية"; -"web_rename_cancel" = "إلغاء"; -`;export{e as default}; diff --git a/website/app/assets/aufgabe-mehrwertsteuer-C-TFTrWz.svg b/website/app/assets/aufgabe-mehrwertsteuer-C-TFTrWz.svg deleted file mode 100644 index 57094a66..00000000 --- a/website/app/assets/aufgabe-mehrwertsteuer-C-TFTrWz.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - zu: Handy - - - - aufklappen - - - - - - - - - - - - - - - NEU - - auf: Tablet - - - - - KASSENBON - Falt-Handy - netto1000,00 € - +19% MwSt190,00 € - - SUMME1190,00 € - - - - So setzt sich der Preis zusammen: - - netto 1000 € - - 190 € - - - - - - - - - - - Finanzamt - - - - - - brutto 1190 € - Das zahlst du an der Kasse. - diff --git a/website/app/assets/aufgabe-mehrwertsteuer-CnrZ00ny.svg b/website/app/assets/aufgabe-mehrwertsteuer-CnrZ00ny.svg deleted file mode 100644 index 920b4411..00000000 --- a/website/app/assets/aufgabe-mehrwertsteuer-CnrZ00ny.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - phone - - - - unfold - - - - - - - - - - - - - - - NEW - - tablet - - - - - RECEIPT - Folding phone - net€1,000.00 - +19% VAT€190.00 - - TOTAL€1,190.00 - - - - This is how the price is made up: - - net €1,000 - - €190 - - - - - - - - - - - Tax office - - - - - - gross €1,190 - You pay this at the till. - diff --git a/website/app/assets/aufgabe-mehrwertsteuer-KUkerRBd.svg b/website/app/assets/aufgabe-mehrwertsteuer-KUkerRBd.svg deleted file mode 100644 index 70b4b6bb..00000000 --- a/website/app/assets/aufgabe-mehrwertsteuer-KUkerRBd.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - 12:34 - - - telemóvel - - - - abrir - - - - - - - - - - - - - - - NOVO - - tablet - - - - - TALÃO - Telem. dobrável - s/ IVA1000,00 € - +23% IVA230,00 € - - TOTAL1230,00 € - - - - Assim se forma o preço: - - sem IVA 1000 € - - 230 € - - - - - - - - - - - Finanças - - - - - - com IVA 1230 € - É isto que pagas na caixa. - diff --git a/website/app/assets/ben-shneiderman-Cev5hrqS.jpg b/website/app/assets/ben-shneiderman-Cev5hrqS.jpg deleted file mode 100644 index 369a8ef07074183e428aa69f946f13fe0940d2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19298 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 z 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 diff --git a/website/app/assets/caesar-ascii-Bix93F5i.svg b/website/app/assets/caesar-ascii-Bix93F5i.svg deleted file mode 100644 index d6beace8..00000000 --- a/website/app/assets/caesar-ascii-Bix93F5i.svg +++ /dev/null @@ -1,98 +0,0 @@ - - -A -65 - -B -66 - -C -67 - -D -68 - -E -69 - -F -70 - -G -71 - -H -72 - -I -73 - -J -74 - -K -75 - -L -76 - -M -77 - -N -78 - -O -79 - -P -80 - -Q -81 - -R -82 - -S -83 - -T -84 - -U -85 - -V -86 - -W -87 - -X -88 - -Y -89 - -Z -90 -(int) 'X' -→ -88 -88 - 65 -→ -23 -23 + 3 -→ -26 -26 % 26 -→ -0 -0 + 65 -→ -65 -(char) 65 -→ -'A' - \ No newline at end of file diff --git a/website/app/assets/caesar-scheibe-CMRPZI6Y.svg b/website/app/assets/caesar-scheibe-CMRPZI6Y.svg deleted file mode 100644 index 8d8484de..00000000 --- a/website/app/assets/caesar-scheibe-CMRPZI6Y.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z - -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z - - - - \ No newline at end of file diff --git a/website/app/assets/caesar-verschiebung-DIR-lDbs.svg b/website/app/assets/caesar-verschiebung-DIR-lDbs.svg deleted file mode 100644 index 81035fc3..00000000 --- a/website/app/assets/caesar-verschiebung-DIR-lDbs.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - -A - -B - -C - -D - -E - -F - -G - -H - -I - -J - -K - -L - -M - -D - -E - -F - -G - -H - -I - -J - -K - -L - -M - -N - -O - -P - - - - - - - - - - - - - - -N - -O - -P - -Q - -R - -S - -T - -U - -V - -W - -X - -Y - -Z - -Q - -R - -S - -T - -U - -V - -W - -X - -Y - -Z - -A - -B - -C - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/app/assets/da-DCJmT-QF.js b/website/app/assets/da-DCJmT-QF.js deleted file mode 100644 index 5229bc7a..00000000 --- a/website/app/assets/da-DCJmT-QF.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Tekster, der kun findes i webversionen. Alt andet kommer fra appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksportér…"; -"web_export_title" = "Gem som billede eller PDF, eller udskriv"; -"web_export_png" = "Billede (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Eksport mislykkedes: %@"; -"web_print_hint" = "Brug »Eksportér… → PDF« til at gemme diagrammet og udskrive det derfra."; -"web_delete" = "Slet"; -"web_language_title" = "Sprog i brugerfladen"; -"web_simulation_start" = "Start simulering"; -"web_simulation_end" = "Afslut simulering"; -"web_simulation_start_title" = "Kør struktogrammet trin for trin"; -"web_simulation_end_title" = "Afslut simuleringen og fortsæt redigeringen"; -"web_palette_hint" = "Træk ind i struktogrammet"; -"web_tabs_label" = "Diagrammer"; -"web_status_modified" = "ændret"; -"web_inspector_title" = "Egenskaber"; -"web_inspector_resize" = "Skift højden på objektinspektøren: træk eller stryg linjen op eller ned (dobbeltklik: standard)"; -"web_inspector_help_drop" = "Træk elementer fra paletten over på en flise: øverst = før, nederst = efter, på »ø« = erstat. Eksisterende elementer kan flyttes med musen."; -"web_inspector_help_inline" = "Dobbeltklik eller dobbelttryk på et element for at redigere teksten direkte i diagrammet (Enter anvender, Esc annullerer). Det gælder også case-navne."; -"web_inspector_help_files" = "Du kan også slippe filer i vinduet."; -"web_case_name" = "Navn på case"; -"web_case_name_placeholder" = "f.eks. 1, ok, default"; -"web_copied" = "Element kopieret."; -"web_discard_message_fmt" = "Ændringerne i »%@« går tabt."; -"web_err_unreadable_fmt" = "»%@« er ikke en læsbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "»%@« gemt."; -"web_saved_txt_fmt" = "Gemt som »%@«. Fjern filtypenavnet .txt for at bruge den."; -"web_drop_impossible" = "Kan ikke slippes her"; -"web_sim_delay" = "Pause pr. trin"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Sprog"; -"web_codegen_comments" = "Diagramtekst som kommentarer"; -"web_codegen_empty_else" = "Skriv tom else-gren i koden"; -"web_copied_check" = "Kopieret ✓"; -"web_copy_manual" = "Markeret, tryk Ctrl+C for at kopiere"; -"web_run_stopped_loop" = "Kørslen stoppet: mulig uendelig løkke."; -"web_run_cancelled" = "Kørslen annulleret."; -"web_run_error" = "Fejl under kørsel."; -"web_run_dropped_fmt" = "… %d tidligere linjer skjult"; -"web_sim_call_arguments_fmt" = "Kaldet passer ikke til hovedet i %@. Tjek værdierne i parenteserne."; -"web_sim_missing_return_fmt" = "%@ sluttede uden at returnere en værdi med return."; -"web_sim_file_not_found_fmt" = "Der findes ingen fil med navnet %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har ikke flere linjer."; -"web_sim_null_value_fmt" = "%@ er null."; -"web_sim_unknown_variable_case_fmt" = "Ukendt variabel: %1$@. Java skelner mellem store og små bogstaver: mente du %2$@?"; -"web_sim_written_file_fmt" = "%@ (gemt)"; -"web_site_home" = "Forside"; -"web_site_imprint" = "Kolofon"; -"web_site_privacy" = "Privatliv"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Skjul programmering"; -"web_scale_canvas" = "Tekststørrelse: struktogram"; -"web_scale_code" = "Tekststørrelse: programmering"; -"web_live_indent" = "Indryk"; -"web_live_indent_title" = "Indryk koden: fire mellemrum pr. niveau (markerede linjer, ellers alt)"; -"web_live_show" = "Vis programmering"; -"web_live_resize" = "Skift kodeområdets bredde (dobbeltklik: nulstil)"; -"web_live_hint" = "Koden vokser med dit diagram. Gråt = pladsholder: skriv i inspektøren, så vises teksten her. Klik på en linje for at vælge elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kode"; -"web_live_ph_end" = "slut"; -"web_live_language" = "Programmeringssprog"; -"web_live_java_class" = "Som klasse"; -"web_live_java_class_hint" = "Klassenavn = diagrammets titel"; -"web_live_java_main" = "Med main-metode"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Ægte Java (med Swing)"; -"web_live_swing_hint" = "Rigtig Java med vinduer (CheerpJ). Henter ca. 40 MB én gang ved første kørsel."; -"web_live_swing_windows" = "Java-vinduer"; -"web_live_swing_hide" = "Luk Java-vinduer"; -"web_live_swing_loading" = "Java indlæses (første gang ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompilerer …"; -"web_live_swing_running" = "Programmet kører."; -"web_live_swing_compile_failed" = "Kompileringsfejl, se ovenfor."; -"web_live_swing_failed" = "Java kunne ikke indlæses. Tjek internetforbindelsen."; -"web_live_hint_edit" = "Skriv Java-kode her, så bygger diagrammet sig selv. Eller arbejd i diagrammet, så vokser koden med. Gråt = pladsholder, skriv bare ovenpå."; -"web_live_edit_label" = "Java-kode"; -"web_parse_line_fmt" = "Linje %d: %@"; -"web_parse_missing" = "Her mangler stadig: %@"; -"web_parse_extra" = "For meget: %@"; -"web_parse_unclosed_string" = "Det afsluttende %@ mangler."; -"web_parse_else_without_if" = "Denne “else” har ingen “if”."; -"web_parse_case_outside_switch" = "“case” og “default” hører til i en “switch”."; -"web_parse_missing_do_while" = "Efter “do { … }” mangler “while (betingelse);”."; -"web_parse_more_methods" = "Indtil videre tæller kun én metode her. Opret andre underprogrammer i egne faner."; -"web_parse_missing_import" = "Øverst mangler %@ Uden denne linje kender Java ikke Scanner."; -"web_parse_missing_scanner" = "Før mangler %@ Uden den linje findes Scanneren ikke."; -"web_parse_unknown_type" = "Java kender ikke denne datatype. Mente du %@?"; -"web_quickfix_insert_fmt" = "Forslag: indsæt %@"; -"web_quickfix_replace_fmt" = "Forslag: %1$@ i stedet for %2$@"; -"web_parse_wrong_case" = "Java skelner mellem store og små bogstaver. Det rigtige er %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Vis strukturdiagram"; -"web_editor_hide" = "Skjul strukturdiagram"; -"web_keywords_title" = "Kode-nøgleord"; -"web_keywords_hint" = "if, while, for i stedet for elementnavne"; -"web_palette_compact" = "Elementer altid kompakte"; -"web_palette_compact_hint" = "Symbol med lille navn nedenunder, ellers kun når kolonnen er smal"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Anvendt software"; -"web_about_software_text" = "Kodeeditoren bruger CodeMirror og Lezer (MIT-licens). Med Swing-understøttelse indlæser VisuStruct CheerpJ fra Leaning Technologies (Community-licens) og javac fra OpenJDK."; -"web_about_licenses" = "Licenstekster"; -"web_live_run" = "Kør"; -"web_live_run_title" = "Kør programmet: output og input vises nedenfor"; -"web_live_run_finished" = "Programmet er færdigt."; -"web_live_run_stopped" = "Stoppet."; -"web_console" = "Konsol"; -"web_console_hide" = "Skjul konsollen"; -"web_console_resize" = "Ændr konsollens højde"; -"web_diagram_tools" = "Diagramværktøjer"; -"web_files_title" = "Filer"; -"web_files_show" = "Vis filer"; -"web_files_hide" = "Skjul filer"; -"web_files_resize" = "Ændr bredden på filer"; -"web_files_new_folder" = "Ny mappe"; -"web_files_switch" = "Vælg en anden mappe"; -"web_files_delete" = "Slet"; -"web_files_in_browser" = "I denne browsers lager"; -"web_files_save_hint_fmt" = "Når du gemmer, lægges programmet i %@."; -"web_files_empty" = "Intet gemt endnu. Når du gemmer, opretter VisuStruct her en mappe med dagens dato."; -"web_files_reconnect_hint" = "Efter genindlæsning spørger browseren igen, om VisuStruct må bruge din mappe."; -"web_files_reconnect_fmt" = "Åbn mappen “%@”"; -"web_files_connect_hint" = "Vælg en mappe som arbejdsområde. VisuStruct opretter en mappe for hver dag og gemmer diagram og kode."; -"web_files_connect" = "Vælg mappe"; -"web_files_browser_hint" = "Denne browser kan ikke åbne mapper på enheden (fx på iPad). Dine filer bliver i browserens lager."; -"web_files_browser" = "Gem i browseren"; -"web_files_delete_confirm_fmt" = "Vil du virkelig slette “%@”?"; -"web_files_folder_prompt" = "Navn på den nye mappe:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Gemt: %@"; -"web_files_create" = "Opret"; -"web_learn_ludwig_tip" = "Ludwigs tip"; -"web_game_title" = "Spil: Sandt eller falsk?"; -"web_game_intro" = "Ludwig viser dig værdier og en betingelse. Er betingelsen sand (true) eller falsk (false)? Ti runder, sværere og sværere."; -"web_game_start" = "Start spillet"; -"web_game_round_fmt" = "Runde %@ af %@"; -"web_game_score_fmt" = "Point: %@"; -"web_game_true" = "sand (true)"; -"web_game_false" = "falsk (false)"; -"web_game_right" = "Rigtigt!"; -"web_game_wrong" = "Ikke helt. Sådan regnes det ud:"; -"web_game_next" = "Videre"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ af %@ rigtige."; -"web_game_perfect" = "Alt rigtigt – Ludwig er dybt imponeret!"; -"web_game_good" = "Flot! Se på dine fejl og prøv igen."; -"web_game_practice" = "Øvelse gør mester. Læs sandhedstabellen igen, og spil en runde mere."; -"web_game_again" = "Spil igen"; -"web_game_wrong_short" = "Desværre forkert."; -"web_game_practice_short" = "Øvelse gør mester. Læs forklaringerne igen og spil en runde til."; -"web_game_clicks" = "Klik:"; -"web_game_nobody" = "Ingen lytter – der sker ingenting."; -"web_game_event_fmt" = "Klik på »%@«: lytteren hører det og kører sin kode."; -"web_game_try" = "Prøv nu selv knapperne i vinduet."; -"web_game_time_fmt" = "%@ s tilbage"; -"web_game_defused" = "✂️ Desarmeret! Du fandt fejlen."; -"web_game_boom_time" = "💥 Bum! Tiden er gået."; -"web_game_boom_wrong" = "💥 Bum! Det var den forkerte linje."; -"web_game_boom_part" = "💥 Bang! Rigtig linje, men fejlen er i en anden del."; -"web_game_boom_wrong_part" = "💥 Bang! Fejlen er i en anden linje."; -"web_game_bomb_parts_hint" = "Tryk præcis på den forkerte del."; -"web_game_fix" = "Den rigtige linje:"; -"web_game_order_hint" = "Tryk på trinnene i den rigtige rækkefølge."; -"web_debug_step" = "Trin"; -"web_debug_step_title" = "Trin: kør én sætning og hold pause igen"; -"web_debug_continue" = "Fortsæt til næste breakpoint"; -"web_debug_paused_fmt" = "Sat på pause før linje %d."; -"web_debug_gutter_title" = "Klik på et linjenummer for at sætte eller fjerne et breakpoint"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Skift bredde på struktogrammet"; -"web_palette_resize" = "Skift bredde på elementerne"; -"web_palette_hide" = "Skjul elementerne"; -"web_palette_show" = "Vis elementerne"; -"web_code_scopes" = "Farvede kodeblokke"; -"web_code_scopes_hint" = "Klasse, metode, løkke, forgrening i egne felter"; -"web_pseudocode" = "Pseudokode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Omdøb variabel …"; -"web_rename_title" = "Omdøb variabel"; -"web_rename_old" = "Navn"; -"web_rename_new" = "Nyt navn"; -"web_rename_hint" = "Ændrer hvert sted med præcis denne stavemåde (tal er ikke Tal), i koden og i strukturdiagrammet. Tekst i \\"…\\" og kommentarer bliver."; -"web_rename_count_fmt" = "Forekommer %d gange."; -"web_rename_exists_fmt" = "“%@” findes allerede: bagefter ville begge være én variabel."; -"web_rename_invalid" = "Et navn begynder med et bogstav og indeholder kun bogstaver, cifre og _."; -"web_rename_keyword_fmt" = "“%@” er et Java-nøgleord."; -"web_rename_apply" = "Omdøb"; -"web_rename_cancel" = "Annuller"; -`;export{e as default}; diff --git a/website/app/assets/de-Bw3STH-g.js b/website/app/assets/de-Bw3STH-g.js deleted file mode 100644 index b0dfc833..00000000 --- a/website/app/assets/de-Bw3STH-g.js +++ /dev/null @@ -1,801 +0,0 @@ -const e=`/* Texte, die es nur in der Web-Version gibt. Alle anderen kommen aus den Localizable.strings der App. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-Struktogramm"; -"web_key_ctrl" = "Strg"; -"web_key_delete" = "Entf"; -"web_key_shift" = "Umschalt"; -"web_export" = "Exportieren …"; -"web_export_title" = "Als Bild oder PDF speichern oder drucken"; -"web_export_png" = "Bild (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-Datei (.visustruct)"; -"web_export_failed_fmt" = "Export fehlgeschlagen: %@"; -"web_print_hint" = "Über „Exportieren … → PDF“ lässt sich das Diagramm speichern und dann drucken."; -"web_delete" = "Löschen"; -"web_language_title" = "Sprache der Oberfläche"; -"web_simulation_start" = "Simulation starten"; -"web_simulation_end" = "Simulation beenden"; -"web_simulation_start_title" = "Struktogramm Schritt für Schritt ausführen"; -"web_simulation_end_title" = "Simulation beenden und weiter bearbeiten"; -"web_palette_hint" = "Ins Struktogramm ziehen"; -"web_tabs_label" = "Diagramme"; -"web_status_modified" = "geändert"; -"web_inspector_title" = "Objektinspektor"; -"web_inspector_help_drop" = "Elemente aus dem Bereich „Elemente“ auf eine Kachel ziehen: oben = davor, unten = dahinter, auf „ø“ = ersetzen. Vorhandene Elemente lassen sich mit der Maus verschieben."; -"web_inspector_help_inline" = "Doppelklick oder Doppeltipp auf ein Element: Text direkt im Struktogramm ändern (Enter übernimmt, Esc bricht ab). Auch Fallnamen lassen sich so ändern."; -"web_inspector_help_files" = "Dateien können auch einfach ins Fenster gezogen werden."; -"web_case_name" = "Fallname"; -"web_case_name_placeholder" = "z. B. 1, ok, default"; -"web_copied" = "Element kopiert."; -"web_discard_message_fmt" = "Die Änderungen an „%@“ gehen verloren."; -"web_err_unreadable_fmt" = "„%@“ ist keine lesbare VisuStruct-Datei (%@)."; -"web_saved_fmt" = "„%@“ gespeichert."; -"web_saved_txt_fmt" = "Gespeichert als „%@“. Zum Verwenden die Endung .txt entfernen."; -"web_drop_impossible" = "Ablegen nicht möglich"; -"web_sim_delay" = "Pause pro Schritt"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Sprache"; -"web_codegen_comments" = "Diagramm-Text als Kommentare"; -"web_codegen_empty_else" = "Leeren else-Zweig im Code ausgeben"; -"web_copied_check" = "Kopiert ✓"; -"web_copy_manual" = "Markiert, mit Strg+C kopieren"; -"web_run_stopped_loop" = "Ausführung gestoppt: mögliche Endlosschleife."; -"web_run_cancelled" = "Ausführung abgebrochen."; -"web_run_error" = "Fehler beim Ausführen."; -"web_run_dropped_fmt" = "… %d frühere Zeilen ausgeblendet"; - -/* Lernbereich (Lektionen gibt es vorerst nur auf Deutsch) */ -"web_learn_title" = "Lernen"; -"web_learn_hide" = "Lernbereich einklappen"; -"web_learn_show" = "Lernbereich aufklappen: Lektionen, Aufgaben und Nachschlagen"; -"web_learn_lessons" = "Lektionen"; -"web_learn_tasks" = "Aufgaben"; -"web_learn_reference" = "Nachschlagen"; -"web_learn_intro" = "Schritt für Schritt lernen, mit Übungen. Dein Fortschritt wird in diesem Browser gemerkt."; -"web_learn_tasks_intro" = "Kleine Projekte ohne Anleitung. Jede Aufgabe nennt die Lektion, die du vorher abgeschlossen haben solltest."; -"web_learn_step_of_fmt" = "Schritt %d von %d"; -"web_learn_lesson_fmt" = "Lektion %d"; -"web_learn_all_lessons" = "Alle Lektionen"; -"web_learn_all_tasks" = "Alle Aufgaben"; -"web_learn_back" = "Zurück"; -"web_learn_next" = "Weiter"; -"web_learn_finish" = "Lektion abschließen"; -"web_learn_done" = "Abgeschlossen"; -"web_learn_after_fmt" = "Nach Lektion %d: %@"; -"web_learn_level_fmt" = "Schwierigkeit %d von 3"; -"web_learn_exercise" = "Übung"; -"web_learn_brag" = "Angeberwissen mit Ludwig"; -"web_learn_solved" = "geschafft"; -"web_learn_open_exercise" = "Im Editor öffnen"; -"web_learn_solve_in_editor" = "Löse diese Übung im %@."; -"web_learn_solve_in_code" = "Löse diese Übung im %@."; -"web_learn_solve_in_both" = "Löse diese Übung im %1$@ und im %2$@."; -"web_learn_open_in_editor" = "Im Editor öffnen"; -"web_learn_replay" = "Noch einmal abspielen"; -"web_learn_graphic_labels" = "👆 Klick aufs Bild: Beschriftung ein oder aus"; -"web_learn_check" = "Prüfen"; -"web_learn_hint" = "Tipp"; -"web_learn_reset" = "Von vorn"; -"web_learn_reset_confirm" = "Wirklich von vorn?"; -"web_learn_solution" = "Musterlösung ansehen"; -"web_learn_hint_more" = "Noch ein Tipp"; -"web_learn_hint_fmt" = "Tipp %d von %d"; -"web_learn_teacher" = "Für Lehrkräfte"; -"web_learn_teacher_intro" = "Mit dem Lehrercode werden bei allen Übungen die Musterlösungen sichtbar. Der Browser merkt sich das."; -"web_learn_teacher_code" = "Lehrercode"; -"web_learn_teacher_unlock" = "Freischalten"; -"web_learn_teacher_wrong" = "Der Code stimmt nicht."; -"web_learn_teacher_on" = "Lehrermodus ist an: Bei allen Übungen sind die Musterlösungen sichtbar."; -"web_learn_teacher_off" = "Lehrermodus beenden"; -"web_learn_open_first" = "Öffne die Übung zuerst im Editor und baue dort dein Struktogramm."; -"web_learn_empty" = "Dein Struktogramm ist noch leer. Ziehe zuerst Elemente aus dem Bereich „Elemente“ hinein."; -"web_learn_passed" = "Geschafft! Dein Struktogramm macht genau, was es soll."; -"web_learn_failed" = "Noch nicht ganz. Vergleiche die erwartete mit deiner Ausgabe:"; -"web_learn_missing_fmt" = "Dein Struktogramm braucht noch: %@"; -"web_learn_input_fmt" = "Eingabe: %@"; -"web_learn_no_input" = "Ohne Eingabe"; -"web_learn_expected" = "Erwartet"; -"web_learn_actual" = "Deine Ausgabe"; -"web_learn_missing_input" = "Dein Struktogramm fragt nach mehr Eingaben als vorgesehen."; -"web_learn_unused_input" = "Dein Struktogramm fragt nicht alle Eingaben ab."; -"web_learn_missing_line_break" = "Fast! Es fehlt nur ein Zeilenumbruch. System.out.print schreibt weiter in derselben Zeile, System.out.println beginnt danach eine neue."; -"web_learn_too_many_steps" = "Abbruch nach 100 000 Schritten. Läuft eine Schleife endlos?"; -"web_learn_score_fmt" = "%d von %d richtig"; -"web_learn_cloze_hint" = "Tippe die fehlenden Wörter in die Lücken und drücke „Prüfen“."; -"web_learn_cloze_score_fmt" = "%d von %d Lücken richtig"; -"web_learn_cloze_all_right" = "Alle Lücken richtig!"; -"web_learn_cloze_solution" = "Lösung zeigen"; -"web_learn_cloze_again" = "Nochmal"; -"web_learn_pap_hint" = "Tippe ein Element rechts an und dann seinen Platz im Plan. Du kannst es auch hinziehen. Ein belegter Platz gibt sein Element beim Antippen zurück."; -"web_learn_pap_score_fmt" = "%d von %d Elementen richtig"; -"web_learn_pap_all_right" = "Alles richtig! Dein PAP ist fertig."; -"web_learn_pap_missing_fmt" = "Es fehlen noch %d Elemente."; -"web_learn_pap_empty" = "Leerer Platz"; -"web_learn_pap_yes" = "ja"; -"web_learn_pap_no" = "nein"; -"web_learn_pap_legend_oval" = "Start oder Ende"; -"web_learn_pap_legend_rect" = "Anweisung"; -"web_learn_pap_legend_diamond" = "Verzweigung: Frage mit ja und nein"; -"web_learn_pap_legend_para" = "Ein- oder Ausgabe"; -"web_learn_review" = "Nachlesen"; -"web_learn_terms" = "Fachbegriffe"; -"web_inspector_resize" = "Höhe des Objektinspektors ändern: Linie nach oben oder unten ziehen oder wischen (Doppelklick: Standard)"; -"web_learn_resize" = "Breite des Lernbereichs ändern (Doppelklick: zurücksetzen)"; -"web_learn_competences_intro" = "Am Ende dieser Lektion kann ich …"; -"web_learn_rating_sun" = "kann ich sicher"; -"web_learn_rating_cloud" = "teilweise"; -"web_learn_rating_umbrella" = "noch nicht"; -"web_learn_review_title" = "Deine Checkliste im Vergleich"; -"web_learn_review_hint" = "Hier weichen deine Einschätzung und der Test voneinander ab. Lies den Schritt noch einmal nach und schätze dich in der Checkliste neu ein."; -"web_learn_review_match" = "Deine Einschätzung passt zu deinem Test. Gut gemacht!"; -"web_learn_review_overrated_fmt" = "Du hast ☀️ gewählt, aber Frage %@ war falsch."; -"web_learn_review_underrated" = "Alle Fragen dazu waren richtig. Du kannst mehr, als du denkst!"; -"web_learn_review_unrated" = "noch nicht eingeschätzt"; -"web_learn_back_to_checklist" = "Zurück zur Checkliste"; -"web_learn_step_fmt" = "Schritt %d: %@"; -"web_sim_call_arguments_fmt" = "Der Aufruf passt nicht zur Kopfzeile von %@. Prüfe die Werte in den Klammern."; -"web_sim_missing_return_fmt" = "%@ hat keinen Wert mit return zurückgegeben."; -"web_sim_file_not_found_fmt" = "Es gibt keine Datei %@."; -"web_sim_end_of_file_fmt" = "Die Datei %@ hat keine Zeile mehr."; -"web_sim_null_value_fmt" = "%@ ist null."; -"web_sim_unknown_variable_case_fmt" = "Unbekannte Variable: %1$@. Java unterscheidet Groß- und Kleinschreibung: Meintest du %2$@?"; -"web_sim_written_file_fmt" = "%@ (gespeichert)"; -"web_site_home" = "Startseite"; -"web_site_imprint" = "Impressum"; -"web_site_privacy" = "Datenschutz"; - -/* Code (früher „Code live“, dann „Programmieren“) */ -"web_live_title" = "Code"; -"web_live_hide" = "Code ausblenden"; -"web_scale_canvas" = "Textgröße Struktogramm"; -"web_scale_code" = "Textgröße Code"; -"web_live_indent" = "Einrücken"; -"web_live_indent_title" = "Code einrücken und formatieren: jede } auf eigener Zeile, Leerzeichen um Operatoren, jede Ebene vier Leerzeichen tiefer (markierte Zeilen, sonst alles)"; -"web_live_show" = "Code aufklappen"; -"web_live_resize" = "Breite des Codebereichs ändern (Doppelklick: zurücksetzen)"; -"web_live_hint" = "Der Code wächst mit deinem Struktogramm. Grau = Platzhalter: Schreib im Objektinspektor, dann steht dort dein Text. Klick auf eine Zeile markiert das Element."; -"web_live_ph_selector" = "Variable"; -"web_live_ph_code" = "Dein Code"; -"web_live_ph_end" = "Ende"; -"web_live_language" = "Programmiersprache"; -"web_live_java_class" = "Als Klasse"; -"web_live_java_class_hint" = "Klassenname = Titel des Struktogramms"; -"web_live_java_main" = "Mit main-Methode"; -"web_settings_display" = "Darstellung"; -"web_live_swing" = "Echtes Java (mit Swing)"; -"web_live_swing_hint" = "Echtes Java mit Fenstern (CheerpJ). Lädt beim ersten Ausführen einmalig ca. 40 MB."; -"web_live_swing_windows" = "Java-Fenster"; -"web_live_swing_hide" = "Java-Fenster schließen"; -"web_live_swing_loading" = "Java wird geladen (beim ersten Mal ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompiliere …"; -"web_live_swing_running" = "Programm läuft."; -"web_live_swing_compile_failed" = "Fehler beim Kompilieren, siehe oben."; -"web_live_swing_failed" = "Java konnte nicht geladen werden. Prüfe die Internetverbindung."; -"web_live_hint_edit" = "Tippe hier Java-Code, dann baut sich das Struktogramm mit. Oder arbeite im Struktogramm, dann wächst der Code mit. Grau = Platzhalter, einfach drüberschreiben."; -"web_live_edit_label" = "Java-Code"; -"web_parse_line_fmt" = "Zeile %d: %@"; -"web_parse_missing" = "Hier fehlt noch: %@"; -"web_parse_extra" = "Das ist zu viel: %@"; -"web_parse_unclosed_string" = "Hier fehlt das schließende %@."; -"web_parse_else_without_if" = "Zu diesem „else“ gehört kein „if“."; -"web_parse_case_outside_switch" = "„case“ und „default“ gehören in ein „switch“."; -"web_parse_missing_do_while" = "Nach „do { … }“ fehlt noch „while (Bedingung);“."; -"web_parse_more_methods" = "Hier zählt im Moment nur eine Methode. Lege weitere Unterprogramme als eigene Reiter an."; -"web_parse_missing_import" = "Ganz oben fehlt %@ Ohne diese Zeile kennt Java den Scanner nicht."; -"web_parse_missing_scanner" = "Vorher fehlt %@ Ohne diese Zeile gibt es den Scanner nicht."; -"web_parse_unknown_type" = "Diesen Datentyp kennt Java nicht. Meintest du %@?"; -"web_quickfix_insert_fmt" = "Vorschlag: %@ einfügen"; -"web_quickfix_replace_fmt" = "Vorschlag: %1$@ statt %2$@"; -"web_parse_wrong_case" = "Java unterscheidet Groß- und Kleinschreibung. Richtig ist %@."; -"web_editor_title" = "Struktogramm"; -"web_editor_show" = "Struktogramm aufklappen"; -"web_editor_hide" = "Struktogramm einklappen"; -"web_keywords_title" = "Code-Keywords"; -"web_keywords_hint" = "if, while, for statt Verzweigung, For-Schleife …"; -"web_palette_compact" = "Elemente immer kompakt"; -"web_palette_compact_hint" = "Symbol mit kleinem Namen darunter, sonst nur bei schmaler Spalte"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Verwendete Software"; -"web_about_software_text" = "Der Code-Editor nutzt CodeMirror und Lezer (MIT-Lizenz). Mit Swing-Unterstützung lädt VisuStruct CheerpJ von Leaning Technologies (Community-Lizenz) und javac aus OpenJDK."; -"web_about_licenses" = "Lizenztexte"; -"web_live_run" = "Ausführen"; -"web_live_run_title" = "Programm ausführen: Ausgaben und Eingaben erscheinen darunter"; -"web_live_run_finished" = "Programm beendet."; -"web_live_run_stopped" = "Gestoppt."; -"web_console" = "Konsole"; -"web_console_hide" = "Konsole ausblenden"; -"web_console_resize" = "Höhe der Konsole ändern"; -"web_diagram_tools" = "Werkzeuge für das Struktogramm"; -"web_files_title" = "Dateien"; -"web_files_show" = "Dateien einblenden"; -"web_files_hide" = "Dateien ausblenden"; -"web_files_resize" = "Breite der Dateien ändern"; -"web_files_new_folder" = "Neuer Ordner"; -"web_files_switch" = "Anderen Ordner wählen"; -"web_files_delete" = "Löschen"; -"web_files_in_browser" = "Im Speicher dieses Browsers"; -"web_files_save_hint_fmt" = "Speichern legt das Programm in %@ ab."; -"web_files_empty" = "Noch nichts gespeichert. Beim Speichern legt VisuStruct hier einen Ordner mit dem heutigen Datum an."; -"web_files_reconnect_hint" = "Der Browser fragt nach dem Neuladen noch einmal, ob VisuStruct deinen Ordner benutzen darf."; -"web_files_reconnect_fmt" = "Ordner „%@“ öffnen"; -"web_files_connect_hint" = "Wähle einen Ordner als Arbeitsbereich, am besten einen neuen Ordner „VisuStruct-Dateien“ in deinen Dokumenten. VisuStruct legt darin für jeden Tag einen Ordner an und speichert Struktogramm und Code."; -"web_files_connect" = "Ordner wählen"; -"web_files_browser_hint" = "Dieser Browser kann keine Ordner auf dem Gerät öffnen (z. B. auf dem iPad). Deine Dateien bleiben dann im Speicher dieses Browsers."; -"web_files_browser" = "Im Browser speichern"; -"web_files_delete_confirm_fmt" = "„%@“ wirklich löschen?"; -"web_files_folder_prompt" = "Name des neuen Ordners:"; -"web_files_default_name" = "Programm"; -"web_files_saved_fmt" = "Gespeichert: %@"; -"web_files_create" = "Anlegen"; -"web_learn_ludwig_tip" = "Ludwigs Tipp"; -"web_game_title" = "Spiel: Wahr oder falsch?"; -"web_game_intro" = "Ludwig zeigt dir Werte und eine Bedingung. Ist die Bedingung wahr (true) oder falsch (false)? Zehn Runden, es wird von Runde zu Runde kniffliger."; -"web_game_start" = "Spiel starten"; -"web_game_round_fmt" = "Runde %@ von %@"; -"web_game_score_fmt" = "Punkte: %@"; -"web_game_true" = "wahr (true)"; -"web_game_false" = "falsch (false)"; -"web_game_right" = "Richtig!"; -"web_game_wrong" = "Leider falsch. So wird gerechnet:"; -"web_game_next" = "Weiter"; -"web_game_finish" = "Ergebnis"; -"web_game_done_fmt" = "%@ von %@ richtig."; -"web_game_perfect" = "Alles richtig – Ludwig ist schwer beeindruckt!"; -"web_game_good" = "Stark! Schau dir die Fehler noch einmal an und versuch es nochmal."; -"web_game_practice" = "Übung macht den Meister. Lies dir die Wahrheitstabelle oben noch einmal durch und spiel noch eine Runde."; -"web_game_again" = "Noch einmal"; -"web_game_wrong_short" = "Leider falsch."; -"web_game_practice_short" = "Übung macht den Meister. Lies dir die Erklärungen noch einmal durch und spiel noch eine Runde."; -"web_game_clicks" = "Klicks:"; -"web_game_nobody" = "Niemand hört zu – nichts passiert."; -"web_game_event_fmt" = "Klick auf „%@“: Der Zuhörer hört es und führt seinen Code aus."; -"web_game_try" = "Probier die Knöpfe im Fenster jetzt selbst aus."; -"web_game_time_fmt" = "Noch %@ s"; -"web_game_defused" = "✂️ Entschärft! Du hast den Fehler gefunden."; -"web_game_boom_time" = "💥 Bumm! Die Zeit ist abgelaufen."; -"web_game_boom_wrong" = "💥 Bumm! Das war die falsche Zeile."; -"web_game_boom_part" = "💥 Bumm! Die Zeile stimmt, aber der Fehler steckt in einem anderen Teil."; -"web_game_boom_wrong_part" = "💥 Bumm! Der Fehler steckt in einer anderen Zeile."; -"web_game_bomb_parts_hint" = "Tippe genau auf den falschen Teil."; -"web_game_fix" = "So stimmt die Zeile:"; -"web_game_order_hint" = "Tippe die Schritte in der richtigen Reihenfolge an."; -"web_debug_step" = "Einzelschritt"; -"web_debug_step_title" = "Einzelschritt: eine Anweisung ausführen und wieder anhalten"; -"web_debug_continue" = "Weiter bis zum nächsten Haltepunkt"; -"web_debug_paused_fmt" = "Angehalten vor Zeile %d."; -"web_debug_gutter_title" = "Auf die Zeilennummer klicken: Haltepunkt setzen oder entfernen"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Caesar-Scheibe"; -"web_learn_caesar_hint" = "Drehe die innere Scheibe oder tippe auf −1 und +1. Außen steht der Klartext, innen der Geheimtext."; -"web_learn_caesar_key_fmt" = "Schlüssel %d"; -"web_learn_caesar_plain" = "Klartext"; -"web_learn_caesar_secret" = "Geheimtext"; -"web_learn_caesar_encrypt" = "Verschlüsseln"; -"web_learn_caesar_decrypt" = "Entschlüsseln"; -"web_learn_caesar_back" = "Scheibe eins zurück"; -"web_learn_caesar_forward" = "Scheibe eins weiter"; -"web_learn_rescue_station_fmt" = "Station %@ von %@: %@"; -"web_learn_rescue_number" = "Deine Zahl"; -"web_learn_rescue_not_number" = "Gib eine ganze Zahl ein."; -"web_learn_rescue_wrong" = "Noch nicht. Lies den Code noch einmal Zeichen für Zeichen."; -"web_learn_rescue_letter_moved" = "Der Buchstabe wandert ins Kreuzworträtsel."; -"web_learn_rescue_alphabet" = "Aus deiner Zahl wird ein Buchstabe:"; -"web_learn_rescue_to_crossword" = "Zum Kreuzworträtsel"; -"web_learn_rescue_crossword" = "Das Kreuzworträtsel"; -"web_learn_rescue_across" = "→ Waagrecht"; -"web_learn_rescue_down" = "↓ Senkrecht"; -"web_learn_rescue_cell_fmt" = "Feld Zeile %@, Spalte %@"; -"web_learn_rescue_keyword" = "Geheimes Wort:"; -"web_learn_rescue_cw_wrong" = "Die rot markierten Felder stimmen noch nicht."; -"web_learn_rescue_cw_done" = "Gelöst! Die gelben Felder ergeben das geheime Wort."; -"web_learn_rescue_to_gate" = "Zum Tor"; -"web_learn_rescue_gate" = "Das Tor"; -"web_learn_rescue_word" = "Geheimes Wort"; -"web_learn_rescue_open" = "Tor öffnen"; -"web_learn_rescue_gate_case" = "Fast! equals unterscheidet Groß- und Kleinbuchstaben. Schreib das Wort genau so wie im Rätsel."; -"web_learn_rescue_gate_wrong" = "Das Tor bleibt zu. Schau noch einmal auf die gelben Felder."; -"web_learn_rescue_freed" = "🎉 Das Tor ist offen!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "Womit möchtest du arbeiten?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: Struktogramme und Java mit dem ganzen Kurs. Wechseln geht jederzeit im Zahnrad."; -"web_visubot_world_visubot_hint" = "VisuBot: den Roboter mBot2 programmieren, mit eigenen Lektionen und Aufgaben. Wechseln geht jederzeit im Zahnrad."; -"web_visubot_connect" = "Mit echtem mBot2 verbinden"; -"web_visubot_upload_button" = "Übertragen"; -"web_visubot_blocks" = "Blöcke"; -"web_visubot_blocks_title" = "Das Struktogramm als Blöcke zeigen"; -"web_visubot_blocks_back" = "Struktogramm"; -"web_visubot_blocks_back_title" = "Zurück zum Struktogramm"; -"web_visubot_blocks_start" = "Wenn das Programm startet"; -"web_visubot_blocks_empty" = "Hier kommt ein Block hin"; -"web_visubot_blocks_hint" = "Dasselbe Programm als Blöcke. Ziehe Blöcke aus „Elemente“ hinein, verschiebe sie oder wirf sie in den Papierkorb. Zahlen und Texte in den weißen Feldern änderst du per Klick direkt im Block, alles andere unten im Objektinspektor. Sensoren ziehst du auf eine Bedingung oder genau auf ein Feld, das sie ersetzen sollen. Operatoren und Variablen ziehst du genauso auf ein Feld oder eine Bedingung."; -"web_visubot_blocks_trash" = "Papierkorb"; -"web_visubot_blocks_count" = "zähle mit"; -"web_visubot_blocks_count_from" = "von"; -"web_visubot_blocks_count_below" = "bis unter"; -"web_visubot_blocks_count_to" = "bis"; -"web_visubot_blocks_count_above" = "bis über"; -"web_visubot_blocks_count_step" = "in Schritten von"; -"web_visubot_blocks_repeat" = "wiederhole"; -"web_visubot_blocks_if" = "wenn"; -"web_visubot_blocks_else" = "sonst"; -"web_visubot_blocks_while" = "solange"; -"web_visubot_blocks_endless" = "wiederhole immer"; -"web_visubot_blocks_do" = "mache"; -"web_visubot_blocks_not" = "nicht"; -"web_visubot_blocks_and" = "und"; -"web_visubot_blocks_or" = "oder"; -"web_visubot_blocks_break" = "verlasse die Schleife"; -"web_visubot_blocks_repeat_times" = "mal"; -"web_visubot_blocks_random_from" = "Zufallszahl von"; -"web_visubot_blocks_random_to" = "bis"; -"web_visubot_operators" = "Operatoren"; -"web_visubot_variables" = "Variablen"; -"web_visubot_control" = "Steuerung"; -"web_visubot_el_repeat" = "wiederhole 10 mal"; -"web_visubot_upload_title" = "Programm auf den mBot2 übertragen"; -"web_visubot_upload_step1" = "Schließe den mBot2 mit dem USB-Kabel an und schalte ihn ein. Das geht nur in Chrome oder Edge."; -"web_visubot_upload_step2" = "Klicke auf „Jetzt übertragen“ und wähle „USB Serial“. Der mBot2 speichert dein Programm und startet neu."; -"web_visubot_upload_step3" = "Zieh das Kabel ab und setze den mBot2 an den Start. Drückst du Taste A, fährt dein Programm los. Es bleibt gespeichert, auch nach dem Ausschalten."; -"web_visubot_upload_start" = "Jetzt übertragen"; -"web_visubot_upload_busy" = "Wird übertragen … Kabel nicht abziehen."; -"web_visubot_upload_done" = "Fertig! Kabel ab, mBot2 an den Start, Taste A drücken."; -"web_visubot_upload_failed" = "Das Übertragen hat nicht geklappt. Starte den mBot2 neu und versuche es noch einmal."; -"web_visubot_upload_label" = "A = Start"; -"web_visubot_upload_error_input" = "Dein Programm fragt nach einer Eingabe. Am mBot2 gibt es keine Tastatur, deshalb geht das nicht."; -"web_visubot_upload_error_files" = "Dein Programm arbeitet mit Dateien. Das geht am mBot2 nicht."; -"web_visubot_upload_error_empty" = "Dein Programm ist noch leer."; -"web_visubot_disconnect" = "Trennen"; -"web_visubot_connecting" = "Verbinde … (der CyberPi startet kurz neu)"; -"web_visubot_connected" = "Echter mBot2 fährt mit"; -"web_visubot_no_serial" = "Echter mBot2: nur in Chrome oder Edge am Computer."; -"web_visubot_link_error" = "Verbindung getrennt"; -"web_visubot_world" = "VisuBot-Welt"; -"web_visubot_no_3d" = "Die 3D-Ansicht kann in diesem Browser nicht starten."; -"web_visubot_distance" = "Abstand"; -"web_visubot_line" = "Linie"; -"web_visubot_bumps" = "an die Wand gestoßen"; -"web_visubot_el_forward" = "fahre vor"; -"web_visubot_el_backward" = "fahre zurück"; -"web_visubot_el_right" = "drehe rechts"; -"web_visubot_el_left" = "drehe links"; -"web_visubot_el_led" = "LEDs an"; -"web_visubot_el_tone" = "Ton spielen"; -"web_visubot_drive" = "Fahrt"; -"web_visubot_depth_fmt" = "Die Schleifen müssen %d-fach ineinander stecken."; -"web_visubot_tap_part" = "Dreh den mBot2 mit der Maus oder dem Finger. Tippst du ein Teil an, siehst du seinen Namen."; -"web_visubot_quiz_right" = "Richtig!"; -"web_visubot_quiz_wrong_fmt" = "Das ist: %@. Versuch es noch einmal."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Bildschirm"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Tasten A, B und Home"; -"web_visubot_part_leds" = "RGB-LEDs"; -"web_visubot_part_lightSensor" = "Lichtsensor"; -"web_visubot_part_microphone" = "Mikrofon"; -"web_visubot_part_shield" = "mBot2-Shield mit Akku"; -"web_visubot_part_powerSwitch" = "Ein-Aus-Schalter"; -"web_visubot_part_motors" = "Encoder-Motoren"; -"web_visubot_part_wheels" = "Räder"; -"web_visubot_part_ultrasonic" = "Ultraschallsensor"; -"web_visubot_part_lineSensor" = "Liniensensor (Quad-RGB)"; -"web_visubot_part_caster" = "Kugelrolle"; -"web_visubot_part_chassis" = "Chassis"; -"web_visubot_world_fmt" = "Welt %d"; -"web_visubot_goal_reached" = "Ziel erreicht"; -"web_visubot_goal_missed" = "Ziel nicht erreicht"; -"web_visubot_commands" = "mBot2-Befehle"; -"web_visubot_sensors" = "mBot2-Sensoren"; -"web_visubot_sensor_distance" = "Abstand"; -"web_visubot_sensor_line" = "Linie"; -"web_visubot_el_led_off" = "LEDs aus"; -"web_visubot_el_led_color" = "LED-Farbe setzen"; -"web_visubot_el_wait" = "kurz warten"; -"web_visubot_el_emotion" = "Gefühl zeigen"; -"web_visubot_el_text" = "Text anzeigen"; -"web_visubot_sensor_color" = "Farbe ist rot?"; -"web_visubot_sensor_button_a" = "Taste A gedrückt?"; -"web_visubot_sensor_button_b" = "Taste B gedrückt?"; -"web_visubot_sensor_joy_up" = "Joystick oben?"; -"web_visubot_sensor_joy_down" = "Joystick unten?"; -"web_visubot_sensor_joy_left" = "Joystick links?"; -"web_visubot_sensor_joy_right" = "Joystick rechts?"; -"web_visubot_sensor_brightness" = "Helligkeit"; -"web_visubot_sensor_loudness" = "Lautstärke"; -"web_visubot_sensor_pitch" = "Neigung vorn/hinten"; -"web_visubot_sensor_roll" = "Neigung seitlich"; -"web_visubot_sensor_shake" = "geschüttelt?"; -"web_visubot_el_drive" = "Räder einzeln"; -"web_visubot_el_stop" = "anhalten"; -"web_visubot_el_timer" = "Stoppuhr auf 0"; -"web_visubot_sensor_line_left" = "Linie links?"; -"web_visubot_sensor_line_right" = "Linie rechts?"; -"web_visubot_sensor_timer" = "Stoppuhr (s)"; -"web_visubot_sensor_battery" = "Akku (%)"; -"web_visubot_actions" = "Befehle"; -"web_visubot_led_on" = "LEDs an"; -"web_visubot_led_off" = "LEDs aus"; -"web_visubot_tone_yes" = "Ton"; -"web_visubot_tone_no" = "kein Ton"; -"web_visubot_controls" = "Sensoren ausprobieren"; -"web_visubot_controls_hint" = "Ohne echten mBot2: Hier stellst du ein, was die Sensoren messen. Tasten, Joystick und Schütteln gelten eine Sekunde lang."; -"web_visubot_shake" = "schütteln"; -"web_visubot_check" = "mBot2 testen"; -"web_visubot_check_hint" = "Probiere jeden Aktor einmal aus. Die Sensorwerte laufen live mit: Halte die Hand vor den Ultraschall, drück die Tasten, neige oder schüttle den mBot2. Heb ihn für die Räder hoch."; -"web_visubot_check_forward" = "Räder 1 s vorwärts"; -"web_visubot_check_spin" = "1 s auf der Stelle drehen"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Wo speicherst du deine Arbeit?"; -"web_learn_start_hint" = "Lernstand und Programme liegen in einem Ordner auf deinem Gerät. Der Lernstand steht dort in der Datei learnProgress.json."; -"web_learn_start_continue_fmt" = "Weiter mit „%@“"; -"web_learn_start_open" = "Vorhandenen Ordner öffnen"; -"web_learn_start_create_fmt" = "Neuen Ordner „%@“ anlegen"; -"web_learn_start_create_hint" = "Danach wählst du, wo er liegen soll, z. B. in „Dokumente“."; -"web_learn_start_folder" = "VisuStruct-Dateien"; -"web_learn_start_without" = "Ohne Ordner weiter"; -"web_learn_start_without_hint" = "Dann ist dein Lernstand nach dem Schließen weg."; -"web_visubot_preview_title" = "mBot2 live"; -"web_visubot_preview_hint" = "Zeigt sofort, wohin dein Programm den mBot2 fährt."; -"web_visubot_preview_sim_title" = "Simulation"; -"web_visubot_preview_sim_hint" = "Hier fährt der mBot2 mit, während die Simulation läuft."; -"web_visubot_world_in_preview" = "Der mBot2 fährt im Fenster „Simulation“."; -"web_visubot_preview_play" = "Fahrt abspielen"; -"web_visubot_preview_stop" = "Anhalten"; -"web_visubot_preview_hide" = "mBot2 live einklappen"; -"web_visubot_preview_show" = "mBot2 live zeigen"; -"web_visubot_preview_resize" = "Größe von mBot2 live ändern"; -"web_visubot_preview_stack" = "Unter den Code im Bereich Code"; -"web_visubot_preview_side" = "Als eigene Spalte"; -"web_visubot_preview_distance_fmt" = "Strecke: %d cm"; -"web_visubot_preview_input" = "braucht eine Eingabe, dafür die Simulation starten"; -"web_visubot_preview_limit" = "läuft sehr lange (Endlosschleife?), gezeigt ist der Anfang"; -"web_visubot_group_drive" = "Fahren und Drehen"; -"web_visubot_group_wheels" = "Räder einzeln"; -"web_visubot_group_leds" = "Licht"; -"web_visubot_group_sound" = "Ton"; -"web_visubot_group_screen" = "Bildschirm"; -"web_visubot_group_emotion" = "Gefühle"; -"web_visubot_group_wait" = "Warten und Stoppuhr"; -"web_visubot_group_distance" = "Abstand"; -"web_visubot_group_line" = "Linie"; -"web_visubot_group_color" = "Farben"; -"web_visubot_group_buttons" = "Tasten und Joystick"; -"web_visubot_group_light" = "Licht und Lautstärke"; -"web_visubot_group_tilt" = "Neigung und Schütteln"; -"web_visubot_group_timer" = "Stoppuhr und Akku"; -"web_swap_to_code" = "Code groß, Struktogramm schmal"; -"web_swap_to_editor" = "Struktogramm groß, Code schmal"; -"web_editor_resize" = "Breite des Struktogramms ändern"; -"web_palette_resize" = "Breite der Elemente ändern (Doppelklick: zurücksetzen)"; -"web_palette_hide" = "Elemente einklappen"; -"web_palette_show" = "Elemente aufklappen"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: Klassen in Java programmieren und als Klassendiagramm sehen oder zeichnen (ab Klasse 12). Wechseln geht jederzeit im Zahnrad."; -"web_visuobject_subtitle" = "Klassendiagramm"; -"web_visuobject_code" = "Java-Code"; -"web_visuobject_diagram" = "Klassendiagramm"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Neues Interface ins Diagramm und in den Code"; -"web_visuobject_layout" = "Neu anordnen"; -"web_visuobject_layout_tip" = "Alle Klassen automatisch anordnen: Oberklassen oben"; -"web_visuobject_add_field" = "neues Attribut …"; -"web_visuobject_add_method" = "neue Methode …"; -"web_visuobject_delete_class" = "Klasse löschen"; -"web_visuobject_new_class_name" = "NeueKlasse"; -"web_visuobject_new_interface_name" = "NeuesInterface"; -"web_visuobject_example" = "Beispiel"; -"web_visuobject_example_tip" = "Beispielprojekt Zoo laden: Tier und Hund im Package tiere, Besitzer in personen"; -"web_visuobject_new_tip" = "Neu: leeres Projekt (Rückgängig holt das alte zurück)"; -"web_visuobject_empty" = "Noch keine Klasse. Klicke links auf „+ Klasse“ oder tippe zum Beispiel „public class Hund { }“ in eine Datei."; -"web_visuobject_edit_hint" = "Doppelklick ändert. Schreibweise wie in UML: „- name: String“ oder „+ bellen(): void“. Leer lassen löscht."; -"web_visuobject_member_label" = "Attribut oder Methode in UML-Schreibweise"; -"web_visuobject_name_label" = "Name der Klasse"; -"web_visuobject_bad_name" = "„%@“ ist kein gültiger Name oder gibt es schon."; -"web_visuobject_bad_line" = "„%@“ verstehe ich nicht. Beispiel: - name: String oder + bellen(): void"; -"web_visuobject_open_failed" = "Die Datei konnte nicht gelesen werden."; -"web_visuobject_field_ph" = "- name: String"; -"web_visuobject_seq_diagram" = "Sequenzdiagramm"; -"web_visuobject_seq_empty" = "Das Sequenzdiagramm entsteht beim Debuggen: Klicke oben auf „Debuggen“ und gehe Schritt für Schritt durch das Programm."; -"web_visuobject_seq_no_calls" = "Noch keine Aufrufe eigener Methoden."; -"web_visuobject_seq_truncated" = "… gekürzt: Ab hier sind es zu viele Aufrufe."; -"web_visuobject_seq_hint" = "Jeder Pfeil ist ein Aufruf einer eigenen Methode, gestrichelt kommt die Rückgabe zurück. Klick auf einen Pfeil zeigt die Zeile im Code."; -"web_visuobject_dbg" = "Debuggen"; -"web_visuobject_dbg_tip" = "Programm Schritt für Schritt ausführen. Haltepunkt: auf die Zeilennummer klicken. Das Objektdiagramm zeigt dabei die Objekte im Speicher."; -"web_visuobject_dbg_continue" = "Weiter"; -"web_visuobject_dbg_continue_tip" = "Weiter bis zum nächsten Haltepunkt (F8)"; -"web_visuobject_dbg_pause" = "Pause"; -"web_visuobject_dbg_pause_tip" = "Programm anhalten"; -"web_visuobject_dbg_over" = "Schritt"; -"web_visuobject_dbg_over_tip" = "Nächste Zeile; Methoden laufen ganz durch (F6)"; -"web_visuobject_dbg_into" = "Hinein"; -"web_visuobject_dbg_into_tip" = "In die aufgerufene Methode hineingehen (F5)"; -"web_visuobject_dbg_out" = "Heraus"; -"web_visuobject_dbg_out_tip" = "Methode zu Ende ausführen und zurück zum Aufrufer (F7)"; -"web_visuobject_dbg_input" = "Eingabe für den Scanner, dann Enter"; -"web_visuobject_dbg_running" = "Debugger: Programm läuft …"; -"web_visuobject_dbg_waiting" = "Debugger: Das Programm wartet auf deine Eingabe."; -"web_visuobject_dbg_paused_fmt" = "Debugger: angehalten in %1$@, Zeile %2$@"; -"web_visuobject_dbg_exception" = "Programm mit einer Exception abgebrochen."; -"web_visuobject_dbg_code_changed" = "Code geändert: Debugger beendet."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Aufrufstapel"; -"web_visuobject_dbg_vars" = "Variablen"; -"web_visuobject_dbg_var_name" = "Name"; -"web_visuobject_dbg_var_type" = "Typ"; -"web_visuobject_dbg_no_vars" = "Keine Variablen"; -"web_visuobject_dbg_err_syntax" = "%1$@, Zeile %2$@: Das versteht der Debugger nicht (%3$@). Mit ▶ Start siehst du die Meldung von Java."; -"web_visuobject_dbg_err_symbol" = "%1$@, Zeile %2$@: %3$@ ist unbekannt."; -"web_visuobject_dbg_err_import" = "%1$@, Zeile %2$@: Ganz oben fehlt %3$@ Ohne diese Zeile kennt Java die Klasse nicht."; -"web_visuobject_dbg_err_typename" = "%1$@, Zeile %2$@: Diesen Datentyp kennt Java nicht. Meintest du %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, Zeile %2$@: %3$@ kann der Debugger noch nicht. Mit ▶ Start läuft das Programm in echtem Java."; -"web_visuobject_dbg_err_type" = "%1$@, Zeile %2$@: Hier passt etwas nicht zusammen (%3$@)."; -"web_visuobject_obj_diagram" = "Objektdiagramm"; -"web_visuobject_obj_new" = "Neues Objekt der Klasse"; -"web_visuobject_obj_add" = "Objekt"; -"web_visuobject_obj_empty" = "Noch keine Objekte. Wähle oben eine Klasse und klicke auf „+ Objekt“."; -"web_visuobject_obj_no_classes" = "Lege zuerst im Klassendiagramm eine Klasse an (nicht abstract)."; -"web_visuobject_obj_hint" = "Klicke auf ein Objekt, dann kannst du hier Name, Klasse und Werte ändern. Vom Griff am Objekt zu einem anderen ziehen verbindet sie über ein Referenzattribut."; -"web_visuobject_obj_live_hint" = "Live aus dem Debugger: So sehen die Objekte gerade im Speicher aus."; -"web_visuobject_obj_link" = "Zu einem anderen Objekt ziehen: Referenz setzen"; -"web_visuobject_obj_name" = "Name"; -"web_visuobject_obj_class" = "Klasse"; -"web_visuobject_obj_attribute" = "Attribut"; -"web_visuobject_obj_value" = "Wert"; -"web_visuobject_obj_delete" = "Objekt löschen"; -"web_visuobject_obj_bad_name" = "„%@“ ist kein gültiger Name für ein Objekt."; -"web_visuobject_obj_name_taken" = "Ein Objekt „%@“ gibt es schon."; -"web_visuobject_obj_no_ref" = "%1$@ hat kein Attribut, das auf %2$@ zeigen kann."; -"web_visuobject_tool_note" = "Notiz"; -"web_visuobject_tool_note_tip" = "Notiz: Klicke ins Klassendiagramm, dann tippe den Text. Mit dem Griff ziehst du eine gestrichelte Linie zu einer Klasse."; -"web_visuobject_note_ph" = "Notiz …"; -"web_visuobject_note_text" = "Text"; -"web_visuobject_note_attached" = "Verbunden mit"; -"web_visuobject_note_attach" = "Zu einer Klasse ziehen: gestrichelte Linie"; -"web_visuobject_note_delete" = "Notiz löschen"; -"web_visuobject_run" = "Start"; -"web_visuobject_run_tip" = "Programm mit echtem Java starten: alle Klassen werden übersetzt, gestartet wird die Klasse mit main (bevorzugt die offene)."; -"web_visuobject_stop" = "Stop"; -"web_visuobject_stop_tip" = "Programm beenden und seine Fenster schließen"; -"web_visuobject_stopped" = "Programm beendet."; -"web_visuobject_no_main" = "Keine Klasse mit public static void main(String[] args) gefunden."; -"web_visuobject_running_fmt" = "%@ läuft …"; -"web_visuobject_console_clear" = "Leeren"; -"web_visuobject_section_fields" = "Attribute"; -"web_visuobject_section_refs" = "Referenzattribute"; -"web_visuobject_section_ctors" = "Konstruktor"; -"web_visuobject_section_methods" = "Methoden"; -"web_visuobject_insp_sections" = "Abschnitts-Kommentare einfügen"; -"web_visuobject_insp_sort" = "Einsortieren"; -"web_visuobject_insp_sections_tip" = "Schreibt // Attribute, // Referenzattribute, // Konstruktor und // Methoden in die Klasse und sortiert alles darunter. Neues aus dem Klassendiagramm kommt dann gleich an die richtige Stelle."; -"web_visuobject_insp_doc" = "Beschreibung (Javadoc)"; -"web_visuobject_insp_doc_ph" = "Wofür ist die Klasse da? Steht im Code als Javadoc-Kommentar über der Klasse."; -"web_visuobject_insp_visibility" = "Sichtbarkeit"; -"web_visuobject_insp_type" = "Typ"; -"web_visuobject_insp_init" = "Startwert"; -"web_visuobject_insp_no_fields" = "Noch keine Attribute."; -"web_visuobject_insp_add_field" = "Attribut"; -"web_visuobject_insp_params" = "Parameter"; -"web_visuobject_insp_return" = "Rückgabetyp"; -"web_visuobject_insp_constructor" = "Konstruktor"; -"web_visuobject_insp_no_methods" = "Noch keine Methoden."; -"web_visuobject_insp_add_method" = "Methode"; -"web_visuobject_insp_generate" = "Erzeugen:"; -"web_visuobject_insp_gen_constructor" = "Konstruktor aus Attributen"; -"web_visuobject_insp_gen_constructor_tip" = "Wie in Eclipse „Generate Constructor using Fields“: ein Konstruktor, der alle Attribute (ohne static) setzt."; -"web_visuobject_insp_gen_accessors" = "Getter und Setter"; -"web_visuobject_insp_gen_accessors_tip" = "Wie in Eclipse „Generate Getters and Setters“: für jedes Attribut get…/set… (final-Attribute nur Getter)."; -"web_visuobject_insp_bad_params" = "Parameter so schreiben: name: Typ, zweiter: int (gelesen wurde „%@“)."; -"web_visuobject_insp_fields" = "Attribute"; -"web_visuobject_insp_methods" = "Methoden"; -"web_visuobject_inspector_resize" = "Größe ändern: Grenze zwischen Klassendiagramm und Objektinspektor nach oben oder unten ziehen (Doppelklick = Standard)"; -"web_visuobject_dep_title" = "Abhängigkeit «%@»"; -"web_visuobject_dep_create_text" = "%1$@ erzeugt in %3$@ ein Objekt der Klasse %2$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ benutzt die Klasse %2$@ in %3$@."; -"web_visuobject_dep_hint" = "Das ist keine Assoziation: %@ merkt sich das %@-Objekt nicht in einem Attribut, es lebt nur in der Methode. Darum gestrichelt."; -"web_visuobject_dep_to_assoc" = "Als Attribut merken (Assoziation zu %@)"; -"web_visuobject_end_mult_ph" = "Mult."; -"web_visuobject_end_tip" = "Klick (Linie markiert) oder Rechtsklick: Rolle, Multiplizität und Navigierbarkeit an diesem Ende"; -"web_visuobject_end_role_ph" = "z. B. meineKatzen"; -"web_visuobject_new_menu" = "Neu"; -"web_visuobject_new_menu_tip" = "Neues Projekt, Source Folder, Package, Klasse oder Interface anlegen"; -"web_visuobject_new_project" = "Java-Projekt"; -"web_visuobject_new_folder" = "Source Folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Klasse"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "Neues Java-Projekt"; -"web_visuobject_new_project_hint" = "Im Workspace bekommt jedes Projekt einen eigenen Ordner mit src."; -"web_visuobject_new_folder_title" = "Neuer Source Folder"; -"web_visuobject_new_folder_hint" = "Ein weiterer Ordner für Quellcode neben src, z. B. test für Testklassen."; -"web_visuobject_new_package_title" = "Neues Package"; -"web_visuobject_new_package_hint" = "Package-Namen schreibt man klein, Teile mit Punkt: tiere oder schule.verwaltung."; -"web_visuobject_new_class_title" = "Neue Java-Klasse"; -"web_visuobject_new_class_hint" = "Klassennamen beginnen mit einem Großbuchstaben, z. B. Hund oder Bankkonto."; -"web_visuobject_new_interface_title" = "Neues Java-Interface"; -"web_visuobject_new_interface_hint" = "Ein Interface legt Methoden fest, die Klassen später implementieren."; -"web_visuobject_new_root" = "Source Folder"; -"web_visuobject_new_name" = "Name"; -"web_visuobject_new_modifiers" = "Modifier"; -"web_visuobject_new_package_private" = "package (ohne Modifier)"; -"web_visuobject_new_superclass" = "Oberklasse"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Erweitert Interfaces (extends)"; -"web_visuobject_new_stubs" = "Welche Methoden-Rümpfe sollen entstehen?"; -"web_visuobject_new_stub_constructors" = "Konstruktoren der Oberklasse"; -"web_visuobject_new_stub_inherited" = "Geerbte abstrakte Methoden"; -"web_visuobject_new_comment_legend" = "Kommentar"; -"web_visuobject_new_comment" = "Javadoc-Kommentar mit @author"; -"web_visuobject_new_author" = "Dein Name"; -"web_visuobject_new_finish" = "Fertigstellen"; -"web_visuobject_new_name_missing" = "Bitte gib einen Namen ein."; -"web_visuobject_new_exists" = "„%@“ gibt es im Projekt schon."; -"web_visuobject_new_upper" = "Klassennamen beginnen in Java mit einem Großbuchstaben."; -"web_visuobject_bad_folder" = "„%@“ ist kein gültiger Ordnername oder gibt es schon."; -"web_visuobject_inspector_hide" = "Objektinspektor einklappen"; -"web_visuobject_inspector_show" = "Objektinspektor aufklappen"; -"web_visuobject_inspector_empty" = "Klicke im Diagramm auf eine Beziehung (Linie), dann kannst du sie hier bearbeiten."; -"web_visuobject_rel_end_a" = "Ende A: %@ (Linie beginnt hier)"; -"web_visuobject_rel_end_b" = "Ende B: %@ (Linie endet hier)"; -"web_visuobject_ws_title" = "Workspace-Ordner auf deinem Rechner"; -"web_visuobject_ws_question" = "Wo speicherst du deine Projekte?"; -"web_visuobject_ws_hint" = "Wie in Eclipse: ein Workspace-Ordner auf deinem Rechner, darin ein Ordner je Projekt mit src und den .java-Dateien."; -"web_visuobject_ws_create" = "Ordner „%@“ anlegen"; -"web_visuobject_ws_open" = "Vorhandenen Workspace öffnen"; -"web_visuobject_ws_skip" = "Ohne Ordner (nur im Browser)"; -"web_visuobject_ws_choose" = "Workspace wählen"; -"web_visuobject_ws_reopen" = "Workspace „%@“ öffnen"; -"web_visuobject_ws_switch" = "Wechseln"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Projekt als .zip herunterladen, z. B. zum Abgeben"; -"web_visuobject_ws_saved" = "Gespeichert in %@/%@"; -"web_visuobject_ws_created" = "Neues Projekt „%@“ im Workspace"; -"web_visuobject_ws_failed" = "Speichern im Workspace hat nicht geklappt: %@"; -"web_visuobject_ws_taken" = "Im Workspace gibt es schon ein Projekt „%@“."; -"web_visuobject_ws_open_project" = "Projekt %@ öffnen"; -"web_visuobject_save_ws_tip" = "Im Workspace speichern (Strg+S)"; -"web_visuobject_unsaved" = "nicht gespeichert"; -"web_visuobject_rel_nav_navigable" = "navigierbar (Pfeil)"; -"web_visuobject_rel_nav_non-navigable" = "nicht navigierbar (Kreuz ×)"; -"web_visuobject_rel_nav_unspecified" = "nicht spezifiziert (offen)"; -"web_visuobject_rel_reading_flip" = "umdrehen"; -"web_visuobject_rel_reading_auto" = "Mit einem Namen liest sich die Beziehung in Zugrichtung."; -"web_visuobject_tools" = "Werkzeuge"; -"web_visuobject_tool_select" = "Auswahl"; -"web_visuobject_tool_select_tip" = "Auswählen und verschieben"; -"web_visuobject_tool_class" = "Klasse"; -"web_visuobject_tool_class_tip" = "Klasse: auf die Fläche ziehen oder wählen und auf die Fläche klicken"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: auf die Fläche ziehen oder wählen und auf die Fläche klicken"; -"web_visuobject_tool_link" = "Assoziation"; -"web_visuobject_tool_link_tip" = "Assoziation ohne Navigation: einfache Linie zwischen zwei Klassen ziehen"; -"web_visuobject_rel_link" = "Assoziation (ohne Navigation)"; -"web_visuobject_tool_not_link" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_association" = "Gerichtet"; -"web_visuobject_tool_association_tip" = "Gerichtete Assoziation: von der Klasse, die die andere kennt, zur anderen ziehen (Pfeil)"; -"web_visuobject_tool_aggregation" = "Aggregation"; -"web_visuobject_tool_aggregation_tip" = "Aggregation: vom Ganzen zum Teil ziehen (hat, Teile leben weiter)"; -"web_visuobject_tool_composition" = "Komposition"; -"web_visuobject_tool_composition_tip" = "Komposition: vom Ganzen zum Teil ziehen (besteht aus, Teile gehören fest dazu)"; -"web_visuobject_tool_extends" = "Vererbung"; -"web_visuobject_tool_extends_tip" = "Vererbung: von der Unterklasse zur Oberklasse ziehen (erbt von)"; -"web_visuobject_tool_implements" = "Realisierung"; -"web_visuobject_tool_implements_tip" = "Realisierung: von der Klasse zum Interface ziehen (implementiert)"; -"web_visuobject_tool_pick_second" = "Jetzt die zweite Klasse anklicken (von %@ aus). Esc bricht ab."; -"web_visuobject_tool_not_association" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_aggregation" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_composition" = "%@ ist ein Interface und kann keine Attribute haben. Zieh die Beziehung von einer Klasse aus."; -"web_visuobject_tool_not_extends" = "%@ kann nicht von %@ erben: Klassen erben von Klassen, Interfaces von Interfaces. Für ein Interface nimm Realisierung."; -"web_visuobject_tool_not_implements" = "%@ kann %@ nicht implementieren: Nur eine Klasse implementiert ein Interface."; -"web_visuobject_inspector" = "Objektinspektor"; -"web_visuobject_connect" = "Ziehen: Beziehung zu einer anderen Klasse"; -"web_visuobject_rel_association" = "Assoziation"; -"web_visuobject_rel_directed" = "Gerichtete Assoziation"; -"web_visuobject_rel_aggregation" = "Aggregation (hat, Teile leben weiter)"; -"web_visuobject_rel_composition" = "Komposition (besteht aus, Teile gehören fest dazu)"; -"web_visuobject_rel_extends" = "Vererbung (erbt von)"; -"web_visuobject_rel_implements" = "Realisierung (implementiert)"; -"web_visuobject_rel_extends_text" = "%@ erbt von %@ (extends im Code)."; -"web_visuobject_rel_implements_text" = "%@ implementiert das Interface %@ (implements im Code)."; -"web_visuobject_rel_kind" = "Art"; -"web_visuobject_rel_name" = "Name der Beziehung"; -"web_visuobject_rel_name_ph" = "z. B. besitzt"; -"web_visuobject_rel_reading" = "Leserichtung"; -"web_visuobject_rel_navigable" = "Navigierbarkeit"; -"web_visuobject_rel_role" = "Rolle"; -"web_visuobject_rel_multiplicity" = "Multiplizität"; -"web_visuobject_rel_role_field" = "= Attribut %@.%@ im Code"; -"web_visuobject_rel_role_only_uml" = "nur im Diagramm (kein Attribut, solange der Pfeil nur in eine Richtung zeigt)"; -"web_visuobject_rel_delete" = "Beziehung löschen"; -"web_visuobject_rel_impossible" = "Von %@ zu %@ gibt es keine passende Beziehung."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Breite ziehen (Doppelklick: Standard)"; -"web_visuobject_pane_show" = "Bereich aufklappen"; -"web_visuobject_pane_hide" = "Bereich einklappen"; -"web_visuobject_close_tab" = "%@ schließen"; -"web_visuobject_collapse" = "Einklappen"; -"web_visuobject_expand" = "Aufklappen"; -"web_visuobject_tree_empty" = "Noch leer. Lege mit „+ Neu“ ein Package oder eine Klasse an."; -"web_visuobject_delete" = "Löschen"; -"web_visuobject_default_package" = "(Standard-Package)"; -"web_visuobject_bad_package" = "„%@“ ist kein gültiger Package-Name oder gibt es schon. Package-Namen schreibt man klein, z. B. tiere."; -"web_visuobject_new_package_name" = "neuespackage"; -"web_visuobject_no_file" = "Keine Datei offen"; -"web_visuobject_project_name" = "MeinProjekt"; -"web_visuobject_explorer_show" = "Package Explorer zeigen"; -"web_visuobject_explorer_hide" = "Package Explorer einklappen"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Projekt als .zip speichern: Projektname/src/package/Klasse.java"; -"web_visuobject_open_tip" = "Projekt öffnen (.zip wie aus Eclipse oder BlueJ) oder .java-Dateien ins Projekt holen"; -"web_visuobject_method_ph" = "+ bellen(): void"; -"web_code_scopes" = "Blöcke farbig"; -"web_code_scopes_hint" = "Code und Struktogramm: Schleife rosa, Verzweigung blau, Methode gelb, Klasse grün"; -"web_pseudocode" = "Pseudocode"; - -/* VisuFlow (PAP zeichnen) */ -"web_visuflow_subtitle" = "PAP zeichnen"; -"web_visuflow_world_hint" = "VisuFlow: einen Programmablaufplan (PAP, englisch flowchart) frei zeichnen und als Bild oder PDF exportieren. Wechseln geht jederzeit im Zahnrad."; -"web_visuflow_palette" = "Symbole"; -"web_visuflow_palette_hint" = "Antippen hängt das Symbol unter das gewählte an und verbindet es mit einem Pfeil. Du kannst es auch auf die Fläche ziehen."; -"web_visuflow_shape_start" = "Start"; -"web_visuflow_shape_ende" = "Ende"; -"web_visuflow_shape_anweisung" = "Anweisung"; -"web_visuflow_shape_ein" = "Ein-/Ausgabe"; -"web_visuflow_shape_verzweigung" = "Verzweigung"; -"web_visuflow_shape_unterprogramm" = "Unterprogramm"; -"web_visuflow_shape_start_tip" = "Oval: Hier beginnt der Ablauf"; -"web_visuflow_shape_ende_tip" = "Oval: Hier endet der Ablauf"; -"web_visuflow_shape_anweisung_tip" = "Rechteck: eine Anweisung, zum Beispiel „Wasser kochen“"; -"web_visuflow_shape_ein_tip" = "Parallelogramm: Eingabe oder Ausgabe, zum Beispiel „Eingabe: Zahl“"; -"web_visuflow_shape_verzweigung_tip" = "Raute: eine Frage mit den Ausgängen ja und nein"; -"web_visuflow_shape_unterprogramm_tip" = "Rechteck mit zwei Strichen: ruft ein Unterprogramm auf"; -"web_visuflow_text_start" = "Start"; -"web_visuflow_text_ende" = "Ende"; -"web_visuflow_text_anweisung" = "Anweisung"; -"web_visuflow_text_ein" = "Eingabe: Zahl"; -"web_visuflow_text_verzweigung" = "Bedingung?"; -"web_visuflow_text_unterprogramm" = "Unterprogramm"; -"web_visuflow_new_tip" = "Neu: leerer PAP mit Start (Rückgängig holt den alten zurück)"; -"web_visuflow_open_tip" = "PAP-Datei (.visuflow) öffnen"; -"web_visuflow_save_tip" = "PAP als Datei (.visuflow) speichern"; -"web_visuflow_delete" = "Löschen"; -"web_visuflow_delete_tip" = "Gewähltes Symbol oder gewählten Pfeil löschen (Entf)"; -"web_visuflow_swap" = "ja/nein tauschen"; -"web_visuflow_swap_tip" = "Raute: „ja“ und „nein“ tauschen die Seiten"; -"web_visuflow_example" = "Beispiel"; -"web_visuflow_example_tip" = "Beispiel „Tee kochen“ aus Lektion 1 laden (Rückgängig holt den alten PAP zurück)"; -"web_visuflow_example_title" = "Tee kochen"; -"web_visuflow_example_water" = "Wasser kochen"; -"web_visuflow_example_bag" = "Teebeutel in die Tasse"; -"web_visuflow_example_hot" = "Tee noch zu heiß?"; -"web_visuflow_example_wait" = "Warten"; -"web_visuflow_example_drink" = "Tee trinken"; -"web_visuflow_title_label" = "Titel des PAP"; -"web_visuflow_title_ph" = "Titel des PAP"; -"web_visuflow_canvas_label" = "Zeichenfläche des PAP"; -"web_visuflow_open_error" = "Die Datei ist kein VisuFlow-PAP."; -"web_visuflow_saved" = "Gespeichert als %@"; -"web_visuflow_status_empty" = "Zieh ein Symbol aus der Leiste auf die Fläche oder tippe es an."; -"web_visuflow_status_idle" = "Symbol antippen wählt es aus. Vom Punkt am Ausgang ziehst du einen Pfeil zum nächsten Symbol."; -"web_visuflow_status_node" = "Ziehen verschiebt das Symbol, nochmal antippen ändert den Text. Vom Punkt am Ausgang einen Pfeil ziehen."; -"web_visuflow_status_edge" = "Pfeil gewählt. Löschen entfernt ihn."; -"web_visuflow_status_connect" = "Loslassen über dem Symbol, zu dem der Pfeil führt."; -"web_visuflow_edit_label" = "Text im Symbol"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Variable umbenennen …"; -"web_rename_title" = "Variable umbenennen"; -"web_rename_old" = "Name"; -"web_rename_new" = "Neuer Name"; -"web_rename_hint" = "Ändert jede Stelle mit genau dieser Schreibweise (zahl ist nicht Zahl), im Code und im Struktogramm. Text in \\"…\\" und Kommentare bleiben."; -"web_rename_count_fmt" = "Kommt %d-mal vor."; -"web_rename_exists_fmt" = "„%@“ gibt es schon: Danach wären beide eine Variable."; -"web_rename_invalid" = "Ein Name beginnt mit einem Buchstaben und enthält nur Buchstaben, Ziffern und _."; -"web_rename_keyword_fmt" = "„%@“ ist ein Java-Schlüsselwort."; -"web_rename_apply" = "Umbenennen"; -"web_rename_cancel" = "Abbrechen"; -"web_visubot_world_visucode_hint" = "Andere Programme wie %1$@ oder %2$@ findest du auf visucode.de."; -`;export{e as default}; diff --git a/website/app/assets/el-MJ37lw3F.js b/website/app/assets/el-MJ37lw3F.js deleted file mode 100644 index 3db10676..00000000 --- a/website/app/assets/el-MJ37lw3F.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Κείμενα που υπάρχουν μόνο στην έκδοση web. Όλα τα άλλα προέρχονται από το Localizable.strings της εφαρμογής. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Διάγραμμα VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Εξαγωγή…"; -"web_export_title" = "Αποθήκευση ως εικόνα ή PDF ή εκτύπωση"; -"web_export_png" = "Εικόνα (PNG)"; -"web_export_svg" = "Διανυσματικό γραφικό (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Αρχείο VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Η εξαγωγή απέτυχε: %@"; -"web_print_hint" = "Με «Εξαγωγή… → PDF» μπορείτε να αποθηκεύσετε το διάγραμμα και να το εκτυπώσετε από εκεί."; -"web_delete" = "Διαγραφή"; -"web_language_title" = "Γλώσσα περιβάλλοντος"; -"web_simulation_start" = "Έναρξη προσομοίωσης"; -"web_simulation_end" = "Τέλος προσομοίωσης"; -"web_simulation_start_title" = "Εκτέλεση του διαγράμματος βήμα προς βήμα"; -"web_simulation_end_title" = "Τέλος προσομοίωσης και συνέχεια επεξεργασίας"; -"web_palette_hint" = "Σύρετε στο διάγραμμα"; -"web_tabs_label" = "Διαγράμματα"; -"web_status_modified" = "τροποποιήθηκε"; -"web_inspector_title" = "Ιδιότητες"; -"web_inspector_resize" = "Αλλαγή ύψους του επιθεωρητή αντικειμένων: σύρετε τη γραμμή πάνω ή κάτω (διπλό κλικ: προεπιλογή)"; -"web_inspector_help_drop" = "Σύρετε στοιχεία από την παλέτα σε ένα πλακίδιο: πάνω = πριν, κάτω = μετά, πάνω στο «ø» = αντικατάσταση. Τα υπάρχοντα στοιχεία μετακινούνται με το ποντίκι."; -"web_inspector_help_inline" = "Διπλό κλικ ή διπλό πάτημα σε ένα στοιχείο για επεξεργασία του κειμένου απευθείας στο διάγραμμα (Enter εφαρμογή, Esc ακύρωση). Το ίδιο και για τα ονόματα περιπτώσεων."; -"web_inspector_help_files" = "Μπορείτε επίσης να σύρετε αρχεία στο παράθυρο."; -"web_case_name" = "Όνομα περίπτωσης"; -"web_case_name_placeholder" = "π.χ. 1, ok, default"; -"web_copied" = "Το στοιχείο αντιγράφηκε."; -"web_discard_message_fmt" = "Οι αλλαγές στο «%@» θα χαθούν."; -"web_err_unreadable_fmt" = "Το «%@» δεν είναι αναγνώσιμο αρχείο VisuStruct (%@)."; -"web_saved_fmt" = "Το «%@» αποθηκεύτηκε."; -"web_saved_txt_fmt" = "Αποθηκεύτηκε ως «%@». Αφαιρέστε την κατάληξη .txt για να το χρησιμοποιήσετε."; -"web_drop_impossible" = "Δεν είναι δυνατή η απόθεση εδώ"; -"web_sim_delay" = "Παύση ανά βήμα"; -"web_sim_delay_value_fmt" = "%@ δευτ."; -"web_codegen_language" = "Γλώσσα"; -"web_codegen_comments" = "Κείμενο διαγράμματος ως σχόλια"; -"web_codegen_empty_else" = "Εμφάνιση κενού κλάδου else στον κώδικα"; -"web_copied_check" = "Αντιγράφηκε ✓"; -"web_copy_manual" = "Επιλέχθηκε, πατήστε Ctrl+C για αντιγραφή"; -"web_run_stopped_loop" = "Η εκτέλεση διακόπηκε: πιθανός ατέρμονος βρόχος."; -"web_run_cancelled" = "Η εκτέλεση ακυρώθηκε."; -"web_run_error" = "Σφάλμα κατά την εκτέλεση."; -"web_run_dropped_fmt" = "… %d προηγούμενες γραμμές κρυμμένες"; -"web_sim_call_arguments_fmt" = "Η κλήση δεν ταιριάζει με την κεφαλίδα του %@. Έλεγξε τις τιμές μέσα στις παρενθέσεις."; -"web_sim_missing_return_fmt" = "Το %@ τελείωσε χωρίς να επιστρέψει τιμή με return."; -"web_sim_file_not_found_fmt" = "Δεν υπάρχει αρχείο με όνομα %@."; -"web_sim_end_of_file_fmt" = "Το αρχείο %@ δεν έχει άλλες γραμμές."; -"web_sim_null_value_fmt" = "Το %@ είναι null."; -"web_sim_unknown_variable_case_fmt" = "Άγνωστη μεταβλητή: %1$@. Η Java ξεχωρίζει κεφαλαία και πεζά: μήπως εννοούσες %2$@;"; -"web_sim_written_file_fmt" = "%@ (αποθηκεύτηκε)"; -"web_site_home" = "Αρχική σελίδα"; -"web_site_imprint" = "Στοιχεία εκδότη"; -"web_site_privacy" = "Απόρρητο"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Προγραμματισμός"; -"web_live_hide" = "Απόκρυψη προγραμματισμού"; -"web_scale_canvas" = "Μέγεθος κειμένου: διάγραμμα"; -"web_scale_code" = "Μέγεθος κειμένου: προγραμματισμός"; -"web_live_indent" = "Εσοχή"; -"web_live_indent_title" = "Εσοχή κώδικα: τέσσερα κενά ανά επίπεδο (επιλεγμένες γραμμές, αλλιώς όλα)"; -"web_live_show" = "Εμφάνιση προγραμματισμού"; -"web_live_resize" = "Αλλαγή πλάτους περιοχής κώδικα (διπλό κλικ: επαναφορά)"; -"web_live_hint" = "Ο κώδικας μεγαλώνει μαζί με το διάγραμμα. Γκρι = σύμβολο κράτησης: γράψε στον επιθεωρητή και το κείμενό σου εμφανίζεται εδώ. Κάνε κλικ σε μια γραμμή για να επιλέξεις το στοιχείο."; -"web_live_ph_selector" = "μεταβλητή"; -"web_live_ph_code" = "Ο κώδικάς σου"; -"web_live_ph_end" = "τέλος"; -"web_live_language" = "Γλώσσα προγραμματισμού"; -"web_live_java_class" = "Ως κλάση"; -"web_live_java_class_hint" = "Όνομα κλάσης = τίτλος διαγράμματος"; -"web_live_java_main" = "Με μέθοδο main"; -"web_settings_display" = "Εμφάνιση"; -"web_live_swing" = "Πραγματική Java (με Swing)"; -"web_live_swing_hint" = "Πραγματική Java με παράθυρα (CheerpJ). Κατεβάζει μία φορά περίπου 40 MB στην πρώτη εκτέλεση."; -"web_live_swing_windows" = "Παράθυρα Java"; -"web_live_swing_hide" = "Κλείσιμο παραθύρων Java"; -"web_live_swing_loading" = "Φόρτωση Java (την πρώτη φορά περίπου 40 MB) …"; -"web_live_swing_compiling" = "Μεταγλώττιση …"; -"web_live_swing_running" = "Το πρόγραμμα εκτελείται."; -"web_live_swing_compile_failed" = "Σφάλμα μεταγλώττισης, δες παραπάνω."; -"web_live_swing_failed" = "Δεν ήταν δυνατή η φόρτωση της Java. Έλεγξε τη σύνδεση στο διαδίκτυο."; -"web_live_hint_edit" = "Γράψε εδώ κώδικα Java και το διάγραμμα φτιάχνεται μόνο του. Ή δούλεψε στο διάγραμμα και ο κώδικας μεγαλώνει μαζί. Γκρι = σύμβολο κράτησης θέσης, απλώς γράψε από πάνω."; -"web_live_edit_label" = "Κώδικας Java"; -"web_parse_line_fmt" = "Γραμμή %d: %@"; -"web_parse_missing" = "Λείπει ακόμα εδώ: %@"; -"web_parse_extra" = "Περισσεύει: %@"; -"web_parse_unclosed_string" = "Λείπει το %@ που κλείνει."; -"web_parse_else_without_if" = "Αυτό το «else» δεν έχει «if»."; -"web_parse_case_outside_switch" = "Τα «case» και «default» ανήκουν μέσα σε «switch»."; -"web_parse_missing_do_while" = "Μετά το «do { … }» λείπει το «while (συνθήκη);»."; -"web_parse_more_methods" = "Προς το παρόν μετράει μόνο μία μέθοδος. Δημιούργησε τα άλλα υποπρογράμματα σε ξεχωριστές καρτέλες."; -"web_parse_missing_import" = "Λείπει στην αρχή το %@ Χωρίς αυτή τη γραμμή η Java δεν γνωρίζει το Scanner."; -"web_parse_missing_scanner" = "Λείπει πρώτα %@ Χωρίς αυτή τη γραμμή ο Scanner δεν υπάρχει."; -"web_parse_unknown_type" = "Η Java δεν γνωρίζει αυτόν τον τύπο δεδομένων. Μήπως εννοείς %@;"; -"web_quickfix_insert_fmt" = "Πρόταση: εισαγωγή %@"; -"web_quickfix_replace_fmt" = "Πρόταση: %1$@ αντί για %2$@"; -"web_parse_wrong_case" = "Η Java ξεχωρίζει κεφαλαία και πεζά. Το σωστό είναι %@."; -"web_editor_title" = "Διάγραμμα"; -"web_editor_show" = "Εμφάνιση διαγράμματος"; -"web_editor_hide" = "Απόκρυψη διαγράμματος"; -"web_keywords_title" = "Λέξεις-κλειδιά κώδικα"; -"web_keywords_hint" = "if, while, for αντί για ονόματα στοιχείων"; -"web_palette_compact" = "Στοιχεία πάντα συμπαγή"; -"web_palette_compact_hint" = "Σύμβολο με μικρό όνομα από κάτω, αλλιώς μόνο όταν η στήλη είναι στενή"; -"web_about_version_fmt" = "Έκδοση %@"; -"web_about_software" = "Λογισμικό που χρησιμοποιείται"; -"web_about_software_text" = "Ο επεξεργαστής κώδικα χρησιμοποιεί τα CodeMirror και Lezer (άδεια MIT). Με την υποστήριξη Swing, το VisuStruct φορτώνει το CheerpJ της Leaning Technologies (άδεια Community) και το javac από το OpenJDK."; -"web_about_licenses" = "Κείμενα αδειών"; -"web_live_run" = "Εκτέλεση"; -"web_live_run_title" = "Εκτέλεση προγράμματος: η έξοδος και η είσοδος εμφανίζονται παρακάτω"; -"web_live_run_finished" = "Το πρόγραμμα τελείωσε."; -"web_live_run_stopped" = "Διακόπηκε."; -"web_console" = "Κονσόλα"; -"web_console_hide" = "Απόκρυψη κονσόλας"; -"web_console_resize" = "Αλλαγή ύψους κονσόλας"; -"web_diagram_tools" = "Εργαλεία διαγράμματος"; -"web_files_title" = "Αρχεία"; -"web_files_show" = "Εμφάνιση αρχείων"; -"web_files_hide" = "Απόκρυψη αρχείων"; -"web_files_resize" = "Αλλαγή πλάτους αρχείων"; -"web_files_new_folder" = "Νέος φάκελος"; -"web_files_switch" = "Επιλογή άλλου φακέλου"; -"web_files_delete" = "Διαγραφή"; -"web_files_in_browser" = "Στον χώρο αυτού του προγράμματος περιήγησης"; -"web_files_save_hint_fmt" = "Η αποθήκευση βάζει το πρόγραμμα στο %@."; -"web_files_empty" = "Δεν έχει αποθηκευτεί τίποτα ακόμη. Κατά την αποθήκευση το VisuStruct δημιουργεί εδώ έναν φάκελο με τη σημερινή ημερομηνία."; -"web_files_reconnect_hint" = "Μετά την επαναφόρτωση, το πρόγραμμα περιήγησης ρωτά ξανά αν το VisuStruct μπορεί να χρησιμοποιήσει τον φάκελό σου."; -"web_files_reconnect_fmt" = "Άνοιγμα φακέλου «%@»"; -"web_files_connect_hint" = "Επίλεξε έναν φάκελο ως χώρο εργασίας. Το VisuStruct δημιουργεί εκεί έναν φάκελο για κάθε ημέρα και αποθηκεύει διάγραμμα και κώδικα."; -"web_files_connect" = "Επιλογή φακέλου"; -"web_files_browser_hint" = "Αυτό το πρόγραμμα περιήγησης δεν μπορεί να ανοίξει φακέλους της συσκευής (π.χ. στο iPad). Τα αρχεία σου μένουν στον χώρο του."; -"web_files_browser" = "Αποθήκευση στο πρόγραμμα περιήγησης"; -"web_files_delete_confirm_fmt" = "Να διαγραφεί οριστικά το «%@»;"; -"web_files_folder_prompt" = "Όνομα νέου φακέλου:"; -"web_files_default_name" = "Πρόγραμμα"; -"web_files_saved_fmt" = "Αποθηκεύτηκε: %@"; -"web_files_create" = "Δημιουργία"; -"web_learn_ludwig_tip" = "Η συμβουλή του Ludwig"; -"web_game_title" = "Παιχνίδι: Αληθές ή ψευδές;"; -"web_game_intro" = "Ο Ludwig σου δείχνει τιμές και μια συνθήκη. Είναι αληθής (true) ή ψευδής (false); Δέκα γύροι, όλο και δυσκολότεροι."; -"web_game_start" = "Έναρξη παιχνιδιού"; -"web_game_round_fmt" = "Γύρος %@ από %@"; -"web_game_score_fmt" = "Πόντοι: %@"; -"web_game_true" = "αληθές (true)"; -"web_game_false" = "ψευδές (false)"; -"web_game_right" = "Σωστά!"; -"web_game_wrong" = "Όχι ακριβώς. Έτσι υπολογίζεται:"; -"web_game_next" = "Επόμενο"; -"web_game_finish" = "Αποτέλεσμα"; -"web_game_done_fmt" = "%@ από %@ σωστά."; -"web_game_perfect" = "Όλα σωστά – ο Ludwig εντυπωσιάστηκε!"; -"web_game_good" = "Μπράβο! Δες ξανά τα λάθη σου και δοκίμασε πάλι."; -"web_game_practice" = "Η εξάσκηση φέρνει την τελειότητα. Διάβασε ξανά τον πίνακα αλήθειας και παίξε άλλον έναν γύρο."; -"web_game_again" = "Παίξε ξανά"; -"web_game_wrong_short" = "Δυστυχώς λάθος."; -"web_game_practice_short" = "Η εξάσκηση φέρνει την τελειότητα. Διάβασε ξανά τις εξηγήσεις και παίξε άλλον έναν γύρο."; -"web_game_clicks" = "Κλικ:"; -"web_game_nobody" = "Κανείς δεν ακούει – δεν συμβαίνει τίποτα."; -"web_game_event_fmt" = "Κλικ στο «%@»: ο ακροατής το ακούει και εκτελεί τον κώδικά του."; -"web_game_try" = "Δοκίμασε τώρα μόνος σου τα κουμπιά στο παράθυρο."; -"web_game_time_fmt" = "Απομένουν %@ δ"; -"web_game_defused" = "✂️ Εξουδετερώθηκε! Βρήκες το λάθος."; -"web_game_boom_time" = "💥 Μπαμ! Ο χρόνος τελείωσε."; -"web_game_boom_wrong" = "💥 Μπαμ! Ήταν λάθος γραμμή."; -"web_game_boom_part" = "💥 Μπαμ! Σωστή γραμμή, αλλά το λάθος είναι σε άλλο κομμάτι της."; -"web_game_boom_wrong_part" = "💥 Μπαμ! Το λάθος είναι σε άλλη γραμμή."; -"web_game_bomb_parts_hint" = "Πάτησε ακριβώς το λάθος κομμάτι."; -"web_game_fix" = "Η σωστή γραμμή:"; -"web_game_order_hint" = "Πάτησε τα βήματα με τη σωστή σειρά."; -"web_debug_step" = "Βήμα"; -"web_debug_step_title" = "Βήμα: εκτέλεση μίας εντολής και νέα παύση"; -"web_debug_continue" = "Συνέχεια έως το επόμενο σημείο διακοπής"; -"web_debug_paused_fmt" = "Παύση πριν από τη γραμμή %d."; -"web_debug_gutter_title" = "Κάνε κλικ σε αριθμό γραμμής για να βάλεις ή να βγάλεις σημείο διακοπής"; -"web_swap_to_code" = "Μεγάλος προγραμματισμός"; -"web_swap_to_editor" = "Μεγάλο διάγραμμα"; -"web_editor_resize" = "Αλλαγή πλάτους διαγράμματος"; -"web_palette_resize" = "Αλλαγή πλάτους στοιχείων"; -"web_palette_hide" = "Απόκρυψη στοιχείων"; -"web_palette_show" = "Εμφάνιση στοιχείων"; -"web_code_scopes" = "Χρωματιστά μπλοκ κώδικα"; -"web_code_scopes_hint" = "Κλάση, μέθοδος, βρόχος, διακλάδωση σε δικά τους πλαίσια"; -"web_pseudocode" = "Ψευδοκώδικας"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Μετονομασία μεταβλητής …"; -"web_rename_title" = "Μετονομασία μεταβλητής"; -"web_rename_old" = "Όνομα"; -"web_rename_new" = "Νέο όνομα"; -"web_rename_hint" = "Αλλάζει κάθε σημείο με ακριβώς αυτή τη γραφή (number δεν είναι Number), στον κώδικα και στο δομόγραμμα. Το κείμενο σε \\"…\\" και τα σχόλια μένουν."; -"web_rename_count_fmt" = "Εμφανίζεται %d φορές."; -"web_rename_exists_fmt" = "Το «%@» υπάρχει ήδη: μετά θα ήταν και τα δύο μία μεταβλητή."; -"web_rename_invalid" = "Ένα όνομα αρχίζει με γράμμα και περιέχει μόνο γράμματα, ψηφία και _."; -"web_rename_keyword_fmt" = "Το «%@» είναι λέξη-κλειδί της Java."; -"web_rename_apply" = "Μετονομασία"; -"web_rename_cancel" = "Άκυρο"; -`;export{e as default}; diff --git a/website/app/assets/en-gIMn8Pa3.js b/website/app/assets/en-gIMn8Pa3.js deleted file mode 100644 index d49ea542..00000000 --- a/website/app/assets/en-gIMn8Pa3.js +++ /dev/null @@ -1,801 +0,0 @@ -const e=`/* Texts that exist only in the web version. Everything else comes from the app's Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct structure chart"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Export…"; -"web_export_title" = "Save as image or PDF, or print"; -"web_export_png" = "Image (PNG)"; -"web_export_svg" = "Vector graphic (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct file (.visustruct)"; -"web_export_failed_fmt" = "Export failed: %@"; -"web_print_hint" = "Use “Export… → PDF” to save the diagram and print it from there."; -"web_delete" = "Delete"; -"web_language_title" = "Interface language"; -"web_simulation_start" = "Start simulation"; -"web_simulation_end" = "End simulation"; -"web_simulation_start_title" = "Run the structure chart step by step"; -"web_simulation_end_title" = "End the simulation and continue editing"; -"web_palette_hint" = "Drag into the structure chart"; -"web_tabs_label" = "Diagrams"; -"web_status_modified" = "modified"; -"web_inspector_title" = "Object Inspector"; -"web_inspector_help_drop" = "Drag elements from the “Elements” area onto a tile: top = before, bottom = after, onto “ø” = replace. Existing elements can be moved with the mouse."; -"web_inspector_help_inline" = "Double-click or double-tap an element to edit its text right in the structure chart (Enter applies, Esc cancels). Case labels work the same way."; -"web_inspector_help_files" = "You can also drop files into the window."; -"web_case_name" = "Case name"; -"web_case_name_placeholder" = "e.g. 1, ok, default"; -"web_copied" = "Element copied."; -"web_discard_message_fmt" = "The changes to “%@” will be lost."; -"web_err_unreadable_fmt" = "“%@” is not a readable VisuStruct file (%@)."; -"web_saved_fmt" = "“%@” saved."; -"web_saved_txt_fmt" = "Saved as “%@”. Remove the .txt extension to use it."; -"web_drop_impossible" = "Cannot drop here"; -"web_sim_delay" = "Pause per step"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Language"; -"web_codegen_comments" = "Diagram text as comments"; -"web_codegen_empty_else" = "Emit empty else branch in code"; -"web_copied_check" = "Copied ✓"; -"web_copy_manual" = "Selected, press Ctrl+C to copy"; -"web_run_stopped_loop" = "Execution stopped: possible infinite loop."; -"web_run_cancelled" = "Execution cancelled."; -"web_run_error" = "Error while running."; -"web_run_dropped_fmt" = "… %d earlier lines hidden"; - -/* Learning area (lessons are German only for now) */ -"web_learn_title" = "Learn"; -"web_learn_hide" = "Collapse the learning area"; -"web_learn_show" = "Expand the learning area: lessons, exercises and reference"; -"web_learn_lessons" = "Lessons"; -"web_learn_tasks" = "Exercises"; -"web_learn_reference" = "Reference"; -"web_learn_intro" = "Learn step by step, with exercises. Your progress is remembered in this browser."; -"web_learn_tasks_intro" = "Small projects without instructions. Each one names the lesson you should finish first."; -"web_learn_step_of_fmt" = "Step %d of %d"; -"web_learn_lesson_fmt" = "Lesson %d"; -"web_learn_all_lessons" = "All lessons"; -"web_learn_all_tasks" = "All exercises"; -"web_learn_back" = "Back"; -"web_learn_next" = "Next"; -"web_learn_finish" = "Finish lesson"; -"web_learn_done" = "Finished"; -"web_learn_after_fmt" = "After lesson %d: %@"; -"web_learn_level_fmt" = "Difficulty %d of 3"; -"web_learn_exercise" = "Exercise"; -"web_learn_brag" = "Fun facts with Ludwig"; -"web_learn_solved" = "solved"; -"web_learn_open_exercise" = "Open in editor"; -"web_learn_solve_in_editor" = "Solve this exercise in the %@ area."; -"web_learn_solve_in_code" = "Solve this exercise in the %@ area."; -"web_learn_solve_in_both" = "Solve this exercise in the %1$@ and %2$@ areas."; -"web_learn_open_in_editor" = "Open in editor"; -"web_learn_replay" = "Play again"; -"web_learn_graphic_labels" = "👆 Click the picture to show or hide the labels"; -"web_learn_check" = "Check"; -"web_learn_hint" = "Hint"; -"web_learn_reset" = "Start over"; -"web_learn_reset_confirm" = "Really start over?"; -"web_learn_solution" = "Show sample solution"; -"web_learn_hint_more" = "Another hint"; -"web_learn_hint_fmt" = "Hint %d of %d"; -"web_learn_teacher" = "For teachers"; -"web_learn_teacher_intro" = "The teacher code shows the sample solutions for all exercises. The browser remembers it."; -"web_learn_teacher_code" = "Teacher code"; -"web_learn_teacher_unlock" = "Unlock"; -"web_learn_teacher_wrong" = "The code is not correct."; -"web_learn_teacher_on" = "Teacher mode is on: sample solutions are visible for all exercises."; -"web_learn_teacher_off" = "Leave teacher mode"; -"web_learn_open_first" = "Open the exercise in the editor first and build your structure chart there."; -"web_learn_empty" = "Your structure chart is still empty. Drag elements from the “Elements” area into it first."; -"web_learn_passed" = "Well done! Your structure chart does exactly what it should."; -"web_learn_failed" = "Not quite yet. Compare the expected output with yours:"; -"web_learn_missing_fmt" = "Your structure chart still needs: %@"; -"web_learn_input_fmt" = "Input: %@"; -"web_learn_no_input" = "No input"; -"web_learn_expected" = "Expected"; -"web_learn_actual" = "Your output"; -"web_learn_missing_input" = "Your structure chart asks for more input than planned."; -"web_learn_unused_input" = "Your structure chart does not ask for all inputs."; -"web_learn_missing_line_break" = "Almost! Only a line break is missing. System.out.print keeps writing on the same line, System.out.println starts a new line afterwards."; -"web_learn_too_many_steps" = "Stopped after 100,000 steps. Is a loop running forever?"; -"web_learn_score_fmt" = "%d of %d correct"; -"web_learn_cloze_hint" = "Type the missing words into the gaps and press “Check”."; -"web_learn_cloze_score_fmt" = "%d of %d gaps correct"; -"web_learn_cloze_all_right" = "All gaps correct!"; -"web_learn_cloze_solution" = "Show solution"; -"web_learn_cloze_again" = "Try again"; -"web_learn_pap_hint" = "Tap an element on the right and then its place in the chart. You can also drag it there. Tapping a filled place gives its element back."; -"web_learn_pap_score_fmt" = "%d of %d elements correct"; -"web_learn_pap_all_right" = "All correct! Your flowchart is finished."; -"web_learn_pap_missing_fmt" = "%d elements are still missing."; -"web_learn_pap_empty" = "Empty place"; -"web_learn_pap_yes" = "yes"; -"web_learn_pap_no" = "no"; -"web_learn_pap_legend_oval" = "Start or end"; -"web_learn_pap_legend_rect" = "Statement"; -"web_learn_pap_legend_diamond" = "Decision: question with yes and no"; -"web_learn_pap_legend_para" = "Input or output"; -"web_learn_review" = "Review"; -"web_learn_terms" = "Technical terms"; -"web_inspector_resize" = "Change the height of the object inspector: drag or swipe the line up or down (double-click: default)"; -"web_learn_resize" = "Change the width of the learning area (double-click: reset)"; -"web_learn_competences_intro" = "At the end of this lesson I can …"; -"web_learn_rating_sun" = "I can do this confidently"; -"web_learn_rating_cloud" = "partly"; -"web_learn_rating_umbrella" = "not yet"; -"web_learn_review_title" = "Your checklist compared"; -"web_learn_review_hint" = "Here your self-assessment and the quiz do not match. Read the step again and rate yourself again in the checklist."; -"web_learn_review_match" = "Your self-assessment matches your quiz. Well done!"; -"web_learn_review_overrated_fmt" = "You chose ☀️, but question %@ was wrong."; -"web_learn_review_underrated" = "All questions on this were right. You can do more than you think!"; -"web_learn_review_unrated" = "not rated yet"; -"web_learn_back_to_checklist" = "Back to checklist"; -"web_learn_step_fmt" = "Step %d: %@"; -"web_sim_call_arguments_fmt" = "The call does not match the header of %@. Check the values in the parentheses."; -"web_sim_missing_return_fmt" = "%@ ended without returning a value with return."; -"web_sim_file_not_found_fmt" = "There is no file called %@."; -"web_sim_end_of_file_fmt" = "The file %@ has no more lines."; -"web_sim_null_value_fmt" = "%@ is null."; -"web_sim_unknown_variable_case_fmt" = "Unknown variable: %1$@. Java is case-sensitive: did you mean %2$@?"; -"web_sim_written_file_fmt" = "%@ (saved)"; -"web_site_home" = "Home page"; -"web_site_imprint" = "Imprint"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Code"; -"web_live_hide" = "Hide code"; -"web_scale_canvas" = "Text size: structure chart"; -"web_scale_code" = "Text size: Code"; -"web_live_indent" = "Indent"; -"web_live_indent_title" = "Indent and format the code: every } on its own line, spaces around operators, four spaces per level (selected lines, otherwise everything)"; -"web_live_show" = "Show code"; -"web_live_resize" = "Change width of the code area (double-click: reset)"; -"web_live_hint" = "The code grows with your diagram. Grey = placeholder: type in the object inspector and your text appears there. Click a line to select its element."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Your code"; -"web_live_ph_end" = "end"; -"web_live_language" = "Programming language"; -"web_live_java_class" = "As a class"; -"web_live_java_class_hint" = "Class name = title of the diagram"; -"web_live_java_main" = "With main method"; -"web_settings_display" = "Display"; -"web_live_swing" = "Real Java (with Swing)"; -"web_live_swing_hint" = "Real Java with windows (CheerpJ). Downloads about 40 MB once, on the first run."; -"web_live_swing_windows" = "Java windows"; -"web_live_swing_hide" = "Close Java windows"; -"web_live_swing_loading" = "Loading Java (about 40 MB the first time) …"; -"web_live_swing_compiling" = "Compiling …"; -"web_live_swing_running" = "Program is running."; -"web_live_swing_compile_failed" = "Compile error, see above."; -"web_live_swing_failed" = "Java could not be loaded. Check your internet connection."; -"web_live_hint_edit" = "Type Java code here and the diagram builds itself. Or work in the diagram and the code grows along. Grey = placeholder, just type over it."; -"web_live_edit_label" = "Java code"; -"web_parse_line_fmt" = "Line %d: %@"; -"web_parse_missing" = "Still missing here: %@"; -"web_parse_extra" = "One too many: %@"; -"web_parse_unclosed_string" = "The closing %@ is missing here."; -"web_parse_else_without_if" = "This “else” has no matching “if”."; -"web_parse_case_outside_switch" = "“case” and “default” belong inside a “switch”."; -"web_parse_missing_do_while" = "After “do { … }” you still need “while (condition);”."; -"web_parse_more_methods" = "Only one method counts here for now. Create further subprograms as separate tabs."; -"web_parse_missing_import" = "%@ is missing at the very top. Without this line Java doesn’t know Scanner."; -"web_parse_missing_scanner" = "%@ is missing before this line. Without it the Scanner doesn’t exist."; -"web_parse_unknown_type" = "Java doesn’t know this data type. Did you mean %@?"; -"web_quickfix_insert_fmt" = "Suggestion: insert %@"; -"web_quickfix_replace_fmt" = "Suggestion: %1$@ instead of %2$@"; -"web_parse_wrong_case" = "Java is case-sensitive. The right spelling is %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Show diagram"; -"web_editor_hide" = "Hide diagram"; -"web_keywords_title" = "Code keywords"; -"web_keywords_hint" = "if, while, for instead of Branch, For loop …"; -"web_palette_compact" = "Elements always compact"; -"web_palette_compact_hint" = "Symbol with a small name below, otherwise only when the column is narrow"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Third-party software"; -"web_about_software_text" = "The code editor uses CodeMirror and Lezer (MIT License). With Swing support, VisuStruct loads CheerpJ by Leaning Technologies (Community License) and javac from OpenJDK."; -"web_about_licenses" = "License texts"; -"web_live_run" = "Run"; -"web_live_run_title" = "Run the program: output and input appear below"; -"web_live_run_finished" = "Program finished."; -"web_live_run_stopped" = "Stopped."; -"web_console" = "Console"; -"web_console_hide" = "Hide console"; -"web_console_resize" = "Resize console"; -"web_diagram_tools" = "Diagram tools"; -"web_files_title" = "Files"; -"web_files_show" = "Show files"; -"web_files_hide" = "Hide files"; -"web_files_resize" = "Resize files"; -"web_files_new_folder" = "New folder"; -"web_files_switch" = "Choose another folder"; -"web_files_delete" = "Delete"; -"web_files_in_browser" = "In this browser’s storage"; -"web_files_save_hint_fmt" = "Saving puts the program in %@."; -"web_files_empty" = "Nothing saved yet. When you save, VisuStruct creates a folder with today’s date here."; -"web_files_reconnect_hint" = "After reloading, the browser asks once more whether VisuStruct may use your folder."; -"web_files_reconnect_fmt" = "Open folder “%@”"; -"web_files_connect_hint" = "Choose a folder as your workspace, ideally a new folder “VisuStruct-Files” in your Documents. VisuStruct creates a folder for each day in it and saves both diagram and code."; -"web_files_connect" = "Choose folder"; -"web_files_browser_hint" = "This browser can’t open folders on the device (for example on iPad). Your files then stay in this browser’s storage."; -"web_files_browser" = "Save in the browser"; -"web_files_delete_confirm_fmt" = "Really delete “%@”?"; -"web_files_folder_prompt" = "Name of the new folder:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Saved: %@"; -"web_files_create" = "Create"; -"web_learn_ludwig_tip" = "Ludwig’s tip"; -"web_game_title" = "Game: True or false?"; -"web_game_intro" = "Ludwig shows you values and a condition. Is the condition true or false? Ten rounds, getting trickier each time."; -"web_game_start" = "Start game"; -"web_game_round_fmt" = "Round %@ of %@"; -"web_game_score_fmt" = "Points: %@"; -"web_game_true" = "true"; -"web_game_false" = "false"; -"web_game_right" = "Correct!"; -"web_game_wrong" = "Not quite. This is how it works out:"; -"web_game_next" = "Next"; -"web_game_finish" = "Result"; -"web_game_done_fmt" = "%@ of %@ correct."; -"web_game_perfect" = "All correct – Ludwig is seriously impressed!"; -"web_game_good" = "Great! Have another look at your mistakes and try again."; -"web_game_practice" = "Practice makes perfect. Read the truth table above once more and play another round."; -"web_game_again" = "Play again"; -"web_game_wrong_short" = "Sorry, that's wrong."; -"web_game_practice_short" = "Practice makes perfect. Read the explanations again and play another round."; -"web_game_clicks" = "Clicks:"; -"web_game_nobody" = "Nobody is listening – nothing happens."; -"web_game_event_fmt" = "Click on “%@”: the listener hears it and runs its code."; -"web_game_try" = "Now try the buttons in the window yourself."; -"web_game_time_fmt" = "%@ s left"; -"web_game_defused" = "✂️ Defused! You found the mistake."; -"web_game_boom_time" = "💥 Boom! Time is up."; -"web_game_boom_wrong" = "💥 Boom! That was the wrong line."; -"web_game_boom_part" = "💥 Boom! Right line, but the mistake is in another part of it."; -"web_game_boom_wrong_part" = "💥 Boom! The mistake is in another line."; -"web_game_bomb_parts_hint" = "Tap exactly the wrong part."; -"web_game_fix" = "The correct line:"; -"web_game_order_hint" = "Tap the steps in the right order."; -"web_debug_step" = "Step"; -"web_debug_step_title" = "Step: run one statement and pause again"; -"web_debug_continue" = "Continue to the next breakpoint"; -"web_debug_paused_fmt" = "Paused before line %d."; -"web_debug_gutter_title" = "Click a line number to set or remove a breakpoint"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Caesar wheel"; -"web_learn_caesar_hint" = "Turn the inner wheel or tap −1 and +1. The outer ring shows the plain text, the inner ring the secret text."; -"web_learn_caesar_key_fmt" = "Key %d"; -"web_learn_caesar_plain" = "Plain text"; -"web_learn_caesar_secret" = "Secret text"; -"web_learn_caesar_encrypt" = "Encrypt"; -"web_learn_caesar_decrypt" = "Decrypt"; -"web_learn_caesar_back" = "Turn wheel back one"; -"web_learn_caesar_forward" = "Turn wheel forward one"; -"web_learn_rescue_station_fmt" = "Station %@ of %@: %@"; -"web_learn_rescue_number" = "Your number"; -"web_learn_rescue_not_number" = "Enter a whole number."; -"web_learn_rescue_wrong" = "Not yet. Read the code again, character by character."; -"web_learn_rescue_letter_moved" = "The letter goes into the crossword."; -"web_learn_rescue_alphabet" = "Your number turns into a letter:"; -"web_learn_rescue_to_crossword" = "To the crossword"; -"web_learn_rescue_crossword" = "The crossword"; -"web_learn_rescue_across" = "→ Across"; -"web_learn_rescue_down" = "↓ Down"; -"web_learn_rescue_cell_fmt" = "Square row %@, column %@"; -"web_learn_rescue_keyword" = "Secret word:"; -"web_learn_rescue_cw_wrong" = "The squares marked red are not right yet."; -"web_learn_rescue_cw_done" = "Solved! The yellow squares spell the secret word."; -"web_learn_rescue_to_gate" = "To the gate"; -"web_learn_rescue_gate" = "The gate"; -"web_learn_rescue_word" = "Secret word"; -"web_learn_rescue_open" = "Open the gate"; -"web_learn_rescue_gate_case" = "Almost! equals tells capital and small letters apart. Write the word exactly as in the crossword."; -"web_learn_rescue_gate_wrong" = "The gate stays shut. Look at the yellow squares again."; -"web_learn_rescue_freed" = "🎉 The gate is open!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "What do you want to work with?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: structure charts and Java with the whole course. You can switch any time in the gear menu."; -"web_visubot_world_visubot_hint" = "VisuBot: program the mBot2 robot, with its own lessons and tasks. You can switch any time in the gear menu."; -"web_visubot_connect" = "Connect real mBot2"; -"web_visubot_upload_button" = "Upload"; -"web_visubot_blocks" = "Blocks"; -"web_visubot_blocks_title" = "Show the structure chart as blocks"; -"web_visubot_blocks_back" = "Structure chart"; -"web_visubot_blocks_back_title" = "Back to the structure chart"; -"web_visubot_blocks_start" = "When the program starts"; -"web_visubot_blocks_empty" = "A block goes here"; -"web_visubot_blocks_hint" = "The same program as blocks. Drag blocks in from “Elements”, move them around or drop them in the trash. Click a number or text in a white field to change it right in the block; everything else in the Object Inspector below. Drop sensors onto a condition, or right onto the field they should replace. Drag operators and variables onto a field or a condition in the same way."; -"web_visubot_blocks_trash" = "Trash"; -"web_visubot_blocks_count" = "count with"; -"web_visubot_blocks_count_from" = "from"; -"web_visubot_blocks_count_below" = "to below"; -"web_visubot_blocks_count_to" = "to"; -"web_visubot_blocks_count_above" = "to above"; -"web_visubot_blocks_count_step" = "by"; -"web_visubot_blocks_repeat" = "repeat"; -"web_visubot_blocks_if" = "if"; -"web_visubot_blocks_else" = "else"; -"web_visubot_blocks_while" = "while"; -"web_visubot_blocks_endless" = "forever"; -"web_visubot_blocks_do" = "do"; -"web_visubot_blocks_not" = "not"; -"web_visubot_blocks_and" = "and"; -"web_visubot_blocks_or" = "or"; -"web_visubot_blocks_break" = "leave the loop"; -"web_visubot_blocks_repeat_times" = "times"; -"web_visubot_blocks_random_from" = "random number from"; -"web_visubot_blocks_random_to" = "to"; -"web_visubot_operators" = "Operators"; -"web_visubot_variables" = "Variables"; -"web_visubot_control" = "Control"; -"web_visubot_el_repeat" = "repeat 10 times"; -"web_visubot_upload_title" = "Upload program to the mBot2"; -"web_visubot_upload_step1" = "Connect the mBot2 with the USB cable and switch it on. This only works in Chrome or Edge."; -"web_visubot_upload_step2" = "Click “Upload now” and choose “USB Serial”. The mBot2 saves your program and restarts."; -"web_visubot_upload_step3" = "Unplug the cable and put the mBot2 at the start. When you press button A, your program starts. It stays saved, even after switching off."; -"web_visubot_upload_start" = "Upload now"; -"web_visubot_upload_busy" = "Uploading … do not unplug the cable."; -"web_visubot_upload_done" = "Done! Unplug the cable, put the mBot2 at the start, press button A."; -"web_visubot_upload_failed" = "The upload did not work. Restart the mBot2 and try again."; -"web_visubot_upload_label" = "A = Start"; -"web_visubot_upload_error_input" = "Your program asks for an input. The mBot2 has no keyboard, so this does not work."; -"web_visubot_upload_error_files" = "Your program works with files. This does not work on the mBot2."; -"web_visubot_upload_error_empty" = "Your program is still empty."; -"web_visubot_disconnect" = "Disconnect"; -"web_visubot_connecting" = "Connecting … (the CyberPi restarts briefly)"; -"web_visubot_connected" = "Real mBot2 drives along"; -"web_visubot_no_serial" = "Real mBot2: only in Chrome or Edge on a computer."; -"web_visubot_link_error" = "Connection lost"; -"web_visubot_world" = "VisuBot world"; -"web_visubot_no_3d" = "The 3D view cannot start in this browser."; -"web_visubot_distance" = "Distance"; -"web_visubot_line" = "Line"; -"web_visubot_bumps" = "bumped into the wall"; -"web_visubot_el_forward" = "move forward"; -"web_visubot_el_backward" = "move back"; -"web_visubot_el_right" = "turn right"; -"web_visubot_el_left" = "turn left"; -"web_visubot_el_led" = "LEDs on"; -"web_visubot_el_tone" = "play a tone"; -"web_visubot_drive" = "Drive"; -"web_visubot_depth_fmt" = "The loops must be nested %d deep."; -"web_visubot_tap_part" = "Rotate the mBot2 with the mouse or your finger. Tap a part to see its name."; -"web_visubot_quiz_right" = "Correct!"; -"web_visubot_quiz_wrong_fmt" = "That is: %@. Try again."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Screen"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Buttons A, B and Home"; -"web_visubot_part_leds" = "RGB LEDs"; -"web_visubot_part_lightSensor" = "Light sensor"; -"web_visubot_part_microphone" = "Microphone"; -"web_visubot_part_shield" = "mBot2 shield with battery"; -"web_visubot_part_powerSwitch" = "Power switch"; -"web_visubot_part_motors" = "Encoder motors"; -"web_visubot_part_wheels" = "Wheels"; -"web_visubot_part_ultrasonic" = "Ultrasonic sensor"; -"web_visubot_part_lineSensor" = "Line sensor (quad RGB)"; -"web_visubot_part_caster" = "Ball caster"; -"web_visubot_part_chassis" = "Chassis"; -"web_visubot_world_fmt" = "World %d"; -"web_visubot_goal_reached" = "Goal reached"; -"web_visubot_goal_missed" = "Goal not reached"; -"web_visubot_commands" = "mBot2 commands"; -"web_visubot_sensors" = "mBot2 sensors"; -"web_visubot_sensor_distance" = "Distance"; -"web_visubot_sensor_line" = "Line"; -"web_visubot_el_led_off" = "LEDs off"; -"web_visubot_el_led_color" = "set LED colour"; -"web_visubot_el_wait" = "wait a moment"; -"web_visubot_el_emotion" = "show a feeling"; -"web_visubot_el_text" = "show text"; -"web_visubot_sensor_color" = "Colour is red?"; -"web_visubot_sensor_button_a" = "Button A pressed?"; -"web_visubot_sensor_button_b" = "Button B pressed?"; -"web_visubot_sensor_joy_up" = "Joystick up?"; -"web_visubot_sensor_joy_down" = "Joystick down?"; -"web_visubot_sensor_joy_left" = "Joystick left?"; -"web_visubot_sensor_joy_right" = "Joystick right?"; -"web_visubot_sensor_brightness" = "Brightness"; -"web_visubot_sensor_loudness" = "Loudness"; -"web_visubot_sensor_pitch" = "Tilt forward/back"; -"web_visubot_sensor_roll" = "Tilt sideways"; -"web_visubot_sensor_shake" = "Shaken?"; -"web_visubot_el_drive" = "wheels separately"; -"web_visubot_el_stop" = "stop"; -"web_visubot_el_timer" = "reset stopwatch"; -"web_visubot_sensor_line_left" = "Line left?"; -"web_visubot_sensor_line_right" = "Line right?"; -"web_visubot_sensor_timer" = "Stopwatch (s)"; -"web_visubot_sensor_battery" = "Battery (%)"; -"web_visubot_actions" = "Commands"; -"web_visubot_led_on" = "LEDs on"; -"web_visubot_led_off" = "LEDs off"; -"web_visubot_tone_yes" = "tone"; -"web_visubot_tone_no" = "no tone"; -"web_visubot_controls" = "Try the sensors"; -"web_visubot_controls_hint" = "Without a real mBot2: set here what the sensors measure. Buttons, joystick and shaking last for one second."; -"web_visubot_shake" = "shake"; -"web_visubot_check" = "Test the mBot2"; -"web_visubot_check_hint" = "Try each actuator once. The sensor values update live: hold your hand in front of the ultrasonic sensor, press the buttons, tilt or shake the mBot2. Lift it up for the wheels."; -"web_visubot_check_forward" = "Wheels 1 s forward"; -"web_visubot_check_spin" = "Turn on the spot for 1 s"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Where do you keep your work?"; -"web_learn_start_hint" = "Your learning progress and programs live in a folder on your device. The progress is stored there in the file learnProgress.json."; -"web_learn_start_continue_fmt" = "Continue with “%@”"; -"web_learn_start_open" = "Open existing folder"; -"web_learn_start_create_fmt" = "Create new folder “%@”"; -"web_learn_start_create_hint" = "Next, choose where it should go, e.g. in “Documents”."; -"web_learn_start_folder" = "VisuStruct-Files"; -"web_learn_start_without" = "Continue without a folder"; -"web_learn_start_without_hint" = "Your learning progress is then lost when you close the page."; -"web_visubot_preview_title" = "mBot2 live"; -"web_visubot_preview_hint" = "Shows right away where your program drives the mBot2."; -"web_visubot_preview_sim_title" = "Simulation"; -"web_visubot_preview_sim_hint" = "The mBot2 drives here while the simulation runs."; -"web_visubot_world_in_preview" = "The mBot2 drives in the “Simulation” window."; -"web_visubot_preview_play" = "Play the drive"; -"web_visubot_preview_stop" = "Stop"; -"web_visubot_preview_hide" = "Collapse mBot2 live"; -"web_visubot_preview_show" = "Show mBot2 live"; -"web_visubot_preview_resize" = "Resize mBot2 live"; -"web_visubot_preview_stack" = "Below the code in the Code area"; -"web_visubot_preview_side" = "As a column of its own"; -"web_visubot_preview_distance_fmt" = "Distance: %d cm"; -"web_visubot_preview_input" = "needs an input, start the simulation for that"; -"web_visubot_preview_limit" = "runs for a very long time (endless loop?), showing the start"; -"web_visubot_group_drive" = "Driving and turning"; -"web_visubot_group_wheels" = "Wheels separately"; -"web_visubot_group_leds" = "Light"; -"web_visubot_group_sound" = "Sound"; -"web_visubot_group_screen" = "Screen"; -"web_visubot_group_emotion" = "Emotions"; -"web_visubot_group_wait" = "Waiting and stopwatch"; -"web_visubot_group_distance" = "Distance"; -"web_visubot_group_line" = "Line"; -"web_visubot_group_color" = "Colours"; -"web_visubot_group_buttons" = "Buttons and joystick"; -"web_visubot_group_light" = "Light and loudness"; -"web_visubot_group_tilt" = "Tilt and shaking"; -"web_visubot_group_timer" = "Stopwatch and battery"; -"web_swap_to_code" = "Code large, structogram narrow"; -"web_swap_to_editor" = "Structogram large, code narrow"; -"web_editor_resize" = "Resize the structogram"; -"web_palette_resize" = "Resize the elements (double-click: reset)"; -"web_palette_hide" = "Hide elements"; -"web_palette_show" = "Show elements"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: write classes in Java and see or draw them as a class diagram (from year 12). You can switch any time in the gear menu."; -"web_visuobject_subtitle" = "Class diagram"; -"web_visuobject_code" = "Java code"; -"web_visuobject_diagram" = "Class diagram"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Add a new interface to the diagram and the code"; -"web_visuobject_layout" = "Arrange again"; -"web_visuobject_layout_tip" = "Arrange all classes automatically: superclasses at the top"; -"web_visuobject_add_field" = "new attribute …"; -"web_visuobject_add_method" = "new method …"; -"web_visuobject_delete_class" = "Delete class"; -"web_visuobject_new_class_name" = "NewClass"; -"web_visuobject_new_interface_name" = "NewInterface"; -"web_visuobject_example" = "Example"; -"web_visuobject_example_tip" = "Load the example project Zoo: Tier and Hund in package tiere, Besitzer in personen"; -"web_visuobject_new_tip" = "New: empty project (Undo brings the old one back)"; -"web_visuobject_empty" = "No class yet. Click “+ Class” on the left or type for example “public class Dog { }” into a file."; -"web_visuobject_edit_hint" = "Double-click to change. Write it as in UML: “- name: String” or “+ bark(): void”. Leave it empty to delete."; -"web_visuobject_member_label" = "Attribute or method in UML notation"; -"web_visuobject_name_label" = "Class name"; -"web_visuobject_bad_name" = "“%@” is not a valid name or already exists."; -"web_visuobject_bad_line" = "I don’t understand “%@”. Example: - name: String or + bark(): void"; -"web_visuobject_open_failed" = "The file could not be read."; -"web_visuobject_field_ph" = "- name: String"; -"web_visuobject_seq_diagram" = "Sequence diagram"; -"web_visuobject_seq_empty" = "The sequence diagram is built while debugging: click “Debug” above and step through the program."; -"web_visuobject_seq_no_calls" = "No calls of your own methods yet."; -"web_visuobject_seq_truncated" = "… shortened: too many calls from here on."; -"web_visuobject_seq_hint" = "Each arrow is a call of one of your methods, the dashed arrow brings the return value back. Click an arrow to see the line in the code."; -"web_visuobject_dbg" = "Debug"; -"web_visuobject_dbg_tip" = "Run the program step by step. Breakpoint: click the line number. The object diagram shows the objects in memory."; -"web_visuobject_dbg_continue" = "Resume"; -"web_visuobject_dbg_continue_tip" = "Run to the next breakpoint (F8)"; -"web_visuobject_dbg_pause" = "Pause"; -"web_visuobject_dbg_pause_tip" = "Pause the program"; -"web_visuobject_dbg_over" = "Step"; -"web_visuobject_dbg_over_tip" = "Next line; methods run completely (F6)"; -"web_visuobject_dbg_into" = "Into"; -"web_visuobject_dbg_into_tip" = "Step into the called method (F5)"; -"web_visuobject_dbg_out" = "Out"; -"web_visuobject_dbg_out_tip" = "Finish the method and return to the caller (F7)"; -"web_visuobject_dbg_input" = "Input for the Scanner, then Enter"; -"web_visuobject_dbg_running" = "Debugger: program running …"; -"web_visuobject_dbg_waiting" = "Debugger: the program is waiting for your input."; -"web_visuobject_dbg_paused_fmt" = "Debugger: paused in %1$@, line %2$@"; -"web_visuobject_dbg_exception" = "Program stopped with an exception."; -"web_visuobject_dbg_code_changed" = "Code changed: debugger stopped."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Call stack"; -"web_visuobject_dbg_vars" = "Variables"; -"web_visuobject_dbg_var_name" = "Name"; -"web_visuobject_dbg_var_type" = "Type"; -"web_visuobject_dbg_no_vars" = "No variables"; -"web_visuobject_dbg_err_syntax" = "%1$@, line %2$@: the debugger does not understand this (%3$@). ▶ Start shows Java's message."; -"web_visuobject_dbg_err_symbol" = "%1$@, line %2$@: %3$@ is unknown."; -"web_visuobject_dbg_err_import" = "%1$@, line %2$@: %3$@ is missing at the very top. Without this line Java doesn’t know the class."; -"web_visuobject_dbg_err_typename" = "%1$@, line %2$@: Java doesn’t know this data type. Did you mean %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, line %2$@: the debugger cannot do %3$@ yet. ▶ Start runs the program in real Java."; -"web_visuobject_dbg_err_type" = "%1$@, line %2$@: something does not fit here (%3$@)."; -"web_visuobject_obj_diagram" = "Object diagram"; -"web_visuobject_obj_new" = "New object of class"; -"web_visuobject_obj_add" = "Object"; -"web_visuobject_obj_empty" = "No objects yet. Choose a class above and click “+ Object”."; -"web_visuobject_obj_no_classes" = "First create a class (not abstract) in the class diagram."; -"web_visuobject_obj_hint" = "Click an object to change its name, class and values here. Drag the handle to another object to connect them through a reference attribute."; -"web_visuobject_obj_live_hint" = "Live from the debugger: this is how the objects look in memory right now."; -"web_visuobject_obj_link" = "Drag to another object: set a reference"; -"web_visuobject_obj_name" = "Name"; -"web_visuobject_obj_class" = "Class"; -"web_visuobject_obj_attribute" = "Attribute"; -"web_visuobject_obj_value" = "Value"; -"web_visuobject_obj_delete" = "Delete object"; -"web_visuobject_obj_bad_name" = "“%@” is not a valid object name."; -"web_visuobject_obj_name_taken" = "There is already an object “%@”."; -"web_visuobject_obj_no_ref" = "%1$@ has no attribute that can refer to %2$@."; -"web_visuobject_tool_note" = "Note"; -"web_visuobject_tool_note_tip" = "Note: click into the class diagram, then type the text. Drag the handle to a class for a dashed line."; -"web_visuobject_note_ph" = "Note …"; -"web_visuobject_note_text" = "Text"; -"web_visuobject_note_attached" = "Attached to"; -"web_visuobject_note_attach" = "Drag to a class: dashed line"; -"web_visuobject_note_delete" = "Delete note"; -"web_visuobject_run" = "Run"; -"web_visuobject_run_tip" = "Run the program with real Java: all classes are compiled, the class with main is started (preferably the open one)."; -"web_visuobject_stop" = "Stop"; -"web_visuobject_stop_tip" = "End the program and close its windows"; -"web_visuobject_stopped" = "Program stopped."; -"web_visuobject_no_main" = "No class with public static void main(String[] args) found."; -"web_visuobject_running_fmt" = "%@ is running …"; -"web_visuobject_console_clear" = "Clear"; -"web_visuobject_section_fields" = "Attributes"; -"web_visuobject_section_refs" = "Reference attributes"; -"web_visuobject_section_ctors" = "Constructor"; -"web_visuobject_section_methods" = "Methods"; -"web_visuobject_insp_sections" = "Insert section comments"; -"web_visuobject_insp_sort" = "Sort into sections"; -"web_visuobject_insp_sections_tip" = "Writes // Attributes, // Reference attributes, // Constructor and // Methods into the class and sorts everything below them. New members from the class diagram then go straight to the right place."; -"web_visuobject_insp_doc" = "Description (Javadoc)"; -"web_visuobject_insp_doc_ph" = "What is the class for? Written in the code as a Javadoc comment above the class."; -"web_visuobject_insp_visibility" = "Visibility"; -"web_visuobject_insp_type" = "Type"; -"web_visuobject_insp_init" = "Initial value"; -"web_visuobject_insp_no_fields" = "No attributes yet."; -"web_visuobject_insp_add_field" = "Attribute"; -"web_visuobject_insp_params" = "Parameters"; -"web_visuobject_insp_return" = "Return type"; -"web_visuobject_insp_constructor" = "Constructor"; -"web_visuobject_insp_no_methods" = "No methods yet."; -"web_visuobject_insp_add_method" = "Method"; -"web_visuobject_insp_generate" = "Generate:"; -"web_visuobject_insp_gen_constructor" = "Constructor from attributes"; -"web_visuobject_insp_gen_constructor_tip" = "Like Eclipse “Generate Constructor using Fields”: a constructor that sets all attributes (except static)."; -"web_visuobject_insp_gen_accessors" = "Getters and setters"; -"web_visuobject_insp_gen_accessors_tip" = "Like Eclipse “Generate Getters and Setters”: get…/set… for each attribute (final attributes get only a getter)."; -"web_visuobject_insp_bad_params" = "Write parameters like this: name: Type, second: int (read “%@”)."; -"web_visuobject_insp_fields" = "Attributes"; -"web_visuobject_insp_methods" = "Methods"; -"web_visuobject_inspector_resize" = "Resize: drag the border between class diagram and object inspector up or down (double-click = default)"; -"web_visuobject_dep_title" = "Dependency «%@»"; -"web_visuobject_dep_create_text" = "%1$@ creates an object of class %2$@ in %3$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ uses the class %2$@ in %3$@."; -"web_visuobject_dep_hint" = "This is not an association: %@ does not keep the %@ object in an attribute, it only lives inside the method. That is why the line is dashed."; -"web_visuobject_dep_to_assoc" = "Keep as attribute (association to %@)"; -"web_visuobject_end_mult_ph" = "mult."; -"web_visuobject_end_tip" = "Click (line selected) or right-click: role, multiplicity and navigability at this end"; -"web_visuobject_end_role_ph" = "e.g. myCats"; -"web_visuobject_new_menu" = "New"; -"web_visuobject_new_menu_tip" = "Create a new project, source folder, package, class or interface"; -"web_visuobject_new_project" = "Java project"; -"web_visuobject_new_folder" = "Source folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Class"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "New Java project"; -"web_visuobject_new_project_hint" = "In the workspace every project gets its own folder with src."; -"web_visuobject_new_folder_title" = "New source folder"; -"web_visuobject_new_folder_hint" = "Another folder for source code next to src, e.g. test for test classes."; -"web_visuobject_new_package_title" = "New package"; -"web_visuobject_new_package_hint" = "Package names are lower case, parts separated by dots: animals or school.office."; -"web_visuobject_new_class_title" = "New Java class"; -"web_visuobject_new_class_hint" = "Class names start with a capital letter, e.g. Dog or BankAccount."; -"web_visuobject_new_interface_title" = "New Java interface"; -"web_visuobject_new_interface_hint" = "An interface defines methods that classes implement later."; -"web_visuobject_new_root" = "Source folder"; -"web_visuobject_new_name" = "Name"; -"web_visuobject_new_modifiers" = "Modifiers"; -"web_visuobject_new_package_private" = "package (no modifier)"; -"web_visuobject_new_superclass" = "Superclass"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Extends interfaces (extends)"; -"web_visuobject_new_stubs" = "Which method stubs should be created?"; -"web_visuobject_new_stub_constructors" = "Constructors from superclass"; -"web_visuobject_new_stub_inherited" = "Inherited abstract methods"; -"web_visuobject_new_comment_legend" = "Comment"; -"web_visuobject_new_comment" = "Javadoc comment with @author"; -"web_visuobject_new_author" = "Your name"; -"web_visuobject_new_finish" = "Finish"; -"web_visuobject_new_name_missing" = "Please enter a name."; -"web_visuobject_new_exists" = "“%@” already exists in the project."; -"web_visuobject_new_upper" = "In Java, class names start with a capital letter."; -"web_visuobject_bad_folder" = "“%@” is not a valid folder name or already exists."; -"web_visuobject_inspector_hide" = "Collapse object inspector"; -"web_visuobject_inspector_show" = "Expand object inspector"; -"web_visuobject_inspector_empty" = "Click a relationship (line) in the diagram to edit it here."; -"web_visuobject_rel_end_a" = "End A: %@ (line starts here)"; -"web_visuobject_rel_end_b" = "End B: %@ (line ends here)"; -"web_visuobject_ws_title" = "Workspace folder on your computer"; -"web_visuobject_ws_question" = "Where do you keep your projects?"; -"web_visuobject_ws_hint" = "Like in Eclipse: a workspace folder on your computer with one folder per project, holding src and the .java files."; -"web_visuobject_ws_create" = "Create folder “%@”"; -"web_visuobject_ws_open" = "Open existing workspace"; -"web_visuobject_ws_skip" = "Without a folder (browser only)"; -"web_visuobject_ws_choose" = "Choose workspace"; -"web_visuobject_ws_reopen" = "Open workspace “%@”"; -"web_visuobject_ws_switch" = "Switch"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Download the project as .zip, e.g. to hand it in"; -"web_visuobject_ws_saved" = "Saved to %@/%@"; -"web_visuobject_ws_created" = "New project “%@” in the workspace"; -"web_visuobject_ws_failed" = "Saving to the workspace failed: %@"; -"web_visuobject_ws_taken" = "The workspace already has a project “%@”."; -"web_visuobject_ws_open_project" = "Open project %@"; -"web_visuobject_save_ws_tip" = "Save to the workspace (Ctrl+S)"; -"web_visuobject_unsaved" = "not saved"; -"web_visuobject_rel_nav_navigable" = "navigable (arrow)"; -"web_visuobject_rel_nav_non-navigable" = "non-navigable (cross ×)"; -"web_visuobject_rel_nav_unspecified" = "unspecified (open)"; -"web_visuobject_rel_reading_flip" = "reverse"; -"web_visuobject_rel_reading_auto" = "With a name, the relationship reads in the direction you dragged."; -"web_visuobject_tools" = "Tools"; -"web_visuobject_tool_select" = "Select"; -"web_visuobject_tool_select_tip" = "Select and move"; -"web_visuobject_tool_class" = "Class"; -"web_visuobject_tool_class_tip" = "Class: drag onto the canvas, or pick it and click on the canvas"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: drag onto the canvas, or pick it and click on the canvas"; -"web_visuobject_tool_link" = "Association"; -"web_visuobject_tool_link_tip" = "Association without navigation: draw a plain line between two classes"; -"web_visuobject_rel_link" = "Association (no navigation)"; -"web_visuobject_tool_not_link" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_association" = "Directed"; -"web_visuobject_tool_association_tip" = "Directed association: drag from the class that knows the other one to the other (arrow)"; -"web_visuobject_tool_aggregation" = "Aggregation"; -"web_visuobject_tool_aggregation_tip" = "Aggregation: drag from the whole to the part (has, parts live on)"; -"web_visuobject_tool_composition" = "Composition"; -"web_visuobject_tool_composition_tip" = "Composition: drag from the whole to the part (consists of, parts belong to it)"; -"web_visuobject_tool_extends" = "Inheritance"; -"web_visuobject_tool_extends_tip" = "Inheritance: drag from the subclass to the superclass (extends)"; -"web_visuobject_tool_implements" = "Realization"; -"web_visuobject_tool_implements_tip" = "Realization: drag from the class to the interface (implements)"; -"web_visuobject_tool_pick_second" = "Now click the second class (from %@). Esc cancels."; -"web_visuobject_tool_not_association" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_aggregation" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_composition" = "%@ is an interface and cannot have attributes. Drag the relationship from a class."; -"web_visuobject_tool_not_extends" = "%@ cannot inherit from %@: classes extend classes, interfaces extend interfaces. For an interface use realization."; -"web_visuobject_tool_not_implements" = "%@ cannot implement %@: only a class implements an interface."; -"web_visuobject_inspector" = "Object inspector"; -"web_visuobject_connect" = "Drag: relationship to another class"; -"web_visuobject_rel_association" = "Association"; -"web_visuobject_rel_directed" = "Directed association"; -"web_visuobject_rel_aggregation" = "Aggregation (has, parts live on)"; -"web_visuobject_rel_composition" = "Composition (consists of, parts belong to it)"; -"web_visuobject_rel_extends" = "Inheritance (extends)"; -"web_visuobject_rel_implements" = "Realization (implements)"; -"web_visuobject_rel_extends_text" = "%@ inherits from %@ (extends in the code)."; -"web_visuobject_rel_implements_text" = "%@ implements the interface %@ (implements in the code)."; -"web_visuobject_rel_kind" = "Kind"; -"web_visuobject_rel_name" = "Name of the relationship"; -"web_visuobject_rel_name_ph" = "e.g. owns"; -"web_visuobject_rel_reading" = "Reading direction"; -"web_visuobject_rel_navigable" = "Navigability"; -"web_visuobject_rel_role" = "Role"; -"web_visuobject_rel_multiplicity" = "Multiplicity"; -"web_visuobject_rel_role_field" = "= attribute %@.%@ in the code"; -"web_visuobject_rel_role_only_uml" = "diagram only (no attribute while the arrow points one way)"; -"web_visuobject_rel_delete" = "Delete relationship"; -"web_visuobject_rel_impossible" = "There is no suitable relationship from %@ to %@."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Drag to resize (double-click: default)"; -"web_visuobject_pane_show" = "Expand area"; -"web_visuobject_pane_hide" = "Collapse area"; -"web_visuobject_close_tab" = "Close %@"; -"web_visuobject_collapse" = "Collapse"; -"web_visuobject_expand" = "Expand"; -"web_visuobject_tree_empty" = "Still empty. Create a package or class with “+ New”."; -"web_visuobject_delete" = "Delete"; -"web_visuobject_default_package" = "(default package)"; -"web_visuobject_bad_package" = "“%@” is not a valid package name or already exists. Package names are lower case, e.g. animals."; -"web_visuobject_new_package_name" = "newpackage"; -"web_visuobject_no_file" = "No file open"; -"web_visuobject_project_name" = "MyProject"; -"web_visuobject_explorer_show" = "Show Package Explorer"; -"web_visuobject_explorer_hide" = "Collapse Package Explorer"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Save the project as .zip: ProjectName/src/package/Class.java"; -"web_visuobject_open_tip" = "Open a project (.zip as from Eclipse or BlueJ) or add .java files to the project"; -"web_visuobject_method_ph" = "+ bark(): void"; -"web_code_scopes" = "Colored blocks"; -"web_code_scopes_hint" = "Code and structogram: loop pink, branch blue, method yellow, class green"; -"web_pseudocode" = "Pseudocode"; - -/* VisuFlow (draw flowcharts) */ -"web_visuflow_subtitle" = "Draw flowcharts"; -"web_visuflow_world_hint" = "VisuFlow: draw a program flowchart freely and export it as an image or PDF. You can switch at any time in the gear menu."; -"web_visuflow_palette" = "Symbols"; -"web_visuflow_palette_hint" = "Tap a symbol to add it below the selected one, joined by an arrow. You can also drag it onto the canvas."; -"web_visuflow_shape_start" = "Start"; -"web_visuflow_shape_ende" = "End"; -"web_visuflow_shape_anweisung" = "Statement"; -"web_visuflow_shape_ein" = "Input/Output"; -"web_visuflow_shape_verzweigung" = "Decision"; -"web_visuflow_shape_unterprogramm" = "Subroutine"; -"web_visuflow_shape_start_tip" = "Oval: the flow starts here"; -"web_visuflow_shape_ende_tip" = "Oval: the flow ends here"; -"web_visuflow_shape_anweisung_tip" = "Rectangle: one statement, for example “Boil water”"; -"web_visuflow_shape_ein_tip" = "Parallelogram: input or output, for example “Input: number”"; -"web_visuflow_shape_verzweigung_tip" = "Diamond: a question with the exits yes and no"; -"web_visuflow_shape_unterprogramm_tip" = "Rectangle with two bars: calls a subroutine"; -"web_visuflow_text_start" = "Start"; -"web_visuflow_text_ende" = "End"; -"web_visuflow_text_anweisung" = "Statement"; -"web_visuflow_text_ein" = "Input: number"; -"web_visuflow_text_verzweigung" = "Condition?"; -"web_visuflow_text_unterprogramm" = "Subroutine"; -"web_visuflow_new_tip" = "New: empty flowchart with Start (Undo brings the old one back)"; -"web_visuflow_open_tip" = "Open a flowchart file (.visuflow)"; -"web_visuflow_save_tip" = "Save the flowchart as a file (.visuflow)"; -"web_visuflow_delete" = "Delete"; -"web_visuflow_delete_tip" = "Delete the selected symbol or arrow (Del)"; -"web_visuflow_swap" = "swap yes/no"; -"web_visuflow_swap_tip" = "Diamond: “yes” and “no” swap sides"; -"web_visuflow_example" = "Example"; -"web_visuflow_example_tip" = "Load the example “Make tea” from lesson 1 (Undo brings the old flowchart back)"; -"web_visuflow_example_title" = "Make tea"; -"web_visuflow_example_water" = "Boil water"; -"web_visuflow_example_bag" = "Tea bag into the cup"; -"web_visuflow_example_hot" = "Tea still too hot?"; -"web_visuflow_example_wait" = "Wait"; -"web_visuflow_example_drink" = "Drink tea"; -"web_visuflow_title_label" = "Flowchart title"; -"web_visuflow_title_ph" = "Flowchart title"; -"web_visuflow_canvas_label" = "Flowchart canvas"; -"web_visuflow_open_error" = "This file is not a VisuFlow flowchart."; -"web_visuflow_saved" = "Saved as %@"; -"web_visuflow_status_empty" = "Drag a symbol from the bar onto the canvas or tap it."; -"web_visuflow_status_idle" = "Tap a symbol to select it. Drag from the dot at its exit to draw an arrow to the next symbol."; -"web_visuflow_status_node" = "Drag to move the symbol, tap again to change the text. Drag an arrow from the dot at the exit."; -"web_visuflow_status_edge" = "Arrow selected. Delete removes it."; -"web_visuflow_status_connect" = "Let go over the symbol the arrow leads to."; -"web_visuflow_edit_label" = "Text in the symbol"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Rename variable …"; -"web_rename_title" = "Rename variable"; -"web_rename_old" = "Name"; -"web_rename_new" = "New name"; -"web_rename_hint" = "Changes every place with exactly this spelling (number is not Number), in the code and in the structogram. Text in \\"…\\" and comments stay."; -"web_rename_count_fmt" = "Used %d times."; -"web_rename_exists_fmt" = "“%@” already exists: afterwards both would be one variable."; -"web_rename_invalid" = "A name starts with a letter and contains only letters, digits and _."; -"web_rename_keyword_fmt" = "“%@” is a Java keyword."; -"web_rename_apply" = "Rename"; -"web_rename_cancel" = "Cancel"; -"web_visubot_world_visucode_hint" = "Other programs like %1$@ or %2$@ are on visucode.de."; -`;export{e as default}; diff --git a/website/app/assets/es-or5dA7qu.js b/website/app/assets/es-or5dA7qu.js deleted file mode 100644 index 086a99d8..00000000 --- a/website/app/assets/es-or5dA7qu.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Textos que solo existen en la versión web. Todo lo demás procede de los Localizable.strings de la app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagrama de VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Supr"; -"web_key_shift" = "Mayús"; -"web_export" = "Exportar…"; -"web_export_title" = "Guardar como imagen o PDF, o imprimir"; -"web_export_png" = "Imagen (PNG)"; -"web_export_svg" = "Gráfico vectorial (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Archivo VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Error al exportar: %@"; -"web_print_hint" = "Usa “Exportar… → PDF” para guardar el diagrama e imprimirlo desde allí."; -"web_delete" = "Eliminar"; -"web_language_title" = "Idioma de la interfaz"; -"web_simulation_start" = "Iniciar simulación"; -"web_simulation_end" = "Terminar simulación"; -"web_simulation_start_title" = "Ejecutar el diagrama paso a paso"; -"web_simulation_end_title" = "Terminar la simulación y seguir editando"; -"web_palette_hint" = "Arrastrar al diagrama"; -"web_tabs_label" = "Diagramas"; -"web_status_modified" = "modificado"; -"web_inspector_title" = "Propiedades"; -"web_inspector_resize" = "Cambiar la altura del inspector de objetos: arrastra o desliza la línea hacia arriba o abajo (doble clic: estándar)"; -"web_inspector_help_drop" = "Arrastra elementos de la paleta sobre una pieza: arriba = antes, abajo = después, sobre “ø” = reemplazar. Los elementos existentes se pueden mover con el ratón."; -"web_inspector_help_inline" = "Haz doble clic o doble toque en un elemento para editar su texto directamente en el diagrama (Intro aplica, Esc cancela). También los nombres de los casos."; -"web_inspector_help_files" = "También puedes soltar archivos en la ventana."; -"web_case_name" = "Nombre del caso"; -"web_case_name_placeholder" = "p. ej. 1, ok, default"; -"web_copied" = "Elemento copiado."; -"web_discard_message_fmt" = "Se perderán los cambios en “%@”."; -"web_err_unreadable_fmt" = "“%@” no es un archivo de VisuStruct legible (%@)."; -"web_saved_fmt" = "“%@” guardado."; -"web_saved_txt_fmt" = "Guardado como “%@”. Quita la extensión .txt para usarlo."; -"web_drop_impossible" = "No se puede soltar aquí"; -"web_sim_delay" = "Pausa por paso"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Lenguaje"; -"web_codegen_comments" = "Texto del diagrama como comentarios"; -"web_codegen_empty_else" = "Generar rama else vacía en el código"; -"web_copied_check" = "Copiado ✓"; -"web_copy_manual" = "Seleccionado, pulsa Ctrl+C para copiar"; -"web_run_stopped_loop" = "Ejecución detenida: posible bucle infinito."; -"web_run_cancelled" = "Ejecución cancelada."; -"web_run_error" = "Error durante la ejecución."; -"web_run_dropped_fmt" = "… %d líneas anteriores ocultas"; -"web_sim_call_arguments_fmt" = "La llamada no coincide con la cabecera de %@. Revisa los valores entre paréntesis."; -"web_sim_missing_return_fmt" = "%@ terminó sin devolver un valor con return."; -"web_sim_file_not_found_fmt" = "No existe ningún archivo llamado %@."; -"web_sim_end_of_file_fmt" = "El archivo %@ no tiene más líneas."; -"web_sim_null_value_fmt" = "%@ es null."; -"web_sim_unknown_variable_case_fmt" = "Variable desconocida: %1$@. Java distingue entre mayúsculas y minúsculas: ¿querías decir %2$@?"; -"web_sim_written_file_fmt" = "%@ (guardado)"; -"web_site_home" = "Página de inicio"; -"web_site_imprint" = "Aviso legal"; -"web_site_privacy" = "Privacidad"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programación"; -"web_live_hide" = "Ocultar programación"; -"web_scale_canvas" = "Tamaño del texto: diagrama"; -"web_scale_code" = "Tamaño del texto: programación"; -"web_live_indent" = "Sangrar"; -"web_live_indent_title" = "Sangrar el código: cuatro espacios por nivel (líneas seleccionadas, si no, todo)"; -"web_live_show" = "Mostrar programación"; -"web_live_resize" = "Cambiar el ancho del área de código (doble clic: restablecer)"; -"web_live_hint" = "El código crece con tu diagrama. Gris = marcador: escribe en el inspector y tu texto aparecerá ahí. Haz clic en una línea para seleccionar su elemento."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Tu código"; -"web_live_ph_end" = "fin"; -"web_live_language" = "Lenguaje de programación"; -"web_live_java_class" = "Como clase"; -"web_live_java_class_hint" = "Nombre de la clase = título del diagrama"; -"web_live_java_main" = "Con método main"; -"web_settings_display" = "Visualización"; -"web_live_swing" = "Java real (con Swing)"; -"web_live_swing_hint" = "Java real con ventanas (CheerpJ). Descarga unos 40 MB una sola vez, en la primera ejecución."; -"web_live_swing_windows" = "Ventanas de Java"; -"web_live_swing_hide" = "Cerrar ventanas de Java"; -"web_live_swing_loading" = "Cargando Java (unos 40 MB la primera vez) …"; -"web_live_swing_compiling" = "Compilando …"; -"web_live_swing_running" = "El programa se está ejecutando."; -"web_live_swing_compile_failed" = "Error de compilación, mira arriba."; -"web_live_swing_failed" = "No se pudo cargar Java. Comprueba la conexión a internet."; -"web_live_hint_edit" = "Escribe aquí código Java y el diagrama se construye solo. O trabaja en el diagrama y el código crece con él. Gris = marcador, escribe encima."; -"web_live_edit_label" = "Código Java"; -"web_parse_line_fmt" = "Línea %d: %@"; -"web_parse_missing" = "Aquí falta: %@"; -"web_parse_extra" = "Sobra: %@"; -"web_parse_unclosed_string" = "Falta el %@ de cierre."; -"web_parse_else_without_if" = "Este «else» no tiene un «if»."; -"web_parse_case_outside_switch" = "«case» y «default» van dentro de un «switch»."; -"web_parse_missing_do_while" = "Después de «do { … }» falta «while (condición);»."; -"web_parse_more_methods" = "Por ahora solo cuenta un método. Crea otros subprogramas en pestañas propias."; -"web_parse_missing_import" = "Falta %@ al principio. Sin esta línea, Java no conoce Scanner."; -"web_parse_missing_scanner" = "Falta antes %@ Sin esta línea, el Scanner no existe."; -"web_parse_unknown_type" = "Java no conoce este tipo de datos. ¿Querías decir %@?"; -"web_quickfix_insert_fmt" = "Sugerencia: insertar %@"; -"web_quickfix_replace_fmt" = "Sugerencia: %1$@ en lugar de %2$@"; -"web_parse_wrong_case" = "Java distingue entre mayúsculas y minúsculas. Lo correcto es %@."; -"web_editor_title" = "Diagrama"; -"web_editor_show" = "Mostrar diagrama"; -"web_editor_hide" = "Ocultar diagrama"; -"web_keywords_title" = "Palabras clave de código"; -"web_keywords_hint" = "if, while, for en lugar de los nombres de los elementos"; -"web_palette_compact" = "Elementos siempre compactos"; -"web_palette_compact_hint" = "Símbolo con el nombre pequeño debajo; si no, solo con la columna estrecha"; -"web_about_version_fmt" = "Versión %@"; -"web_about_software" = "Software utilizado"; -"web_about_software_text" = "El editor de código usa CodeMirror y Lezer (licencia MIT). Con la compatibilidad con Swing, VisuStruct carga CheerpJ de Leaning Technologies (licencia Community) y javac de OpenJDK."; -"web_about_licenses" = "Textos de las licencias"; -"web_live_run" = "Ejecutar"; -"web_live_run_title" = "Ejecutar el programa: la salida y la entrada aparecen abajo"; -"web_live_run_finished" = "Programa terminado."; -"web_live_run_stopped" = "Detenido."; -"web_console" = "Consola"; -"web_console_hide" = "Ocultar consola"; -"web_console_resize" = "Cambiar la altura de la consola"; -"web_diagram_tools" = "Herramientas del diagrama"; -"web_files_title" = "Archivos"; -"web_files_show" = "Mostrar archivos"; -"web_files_hide" = "Ocultar archivos"; -"web_files_resize" = "Cambiar el ancho de archivos"; -"web_files_new_folder" = "Nueva carpeta"; -"web_files_switch" = "Elegir otra carpeta"; -"web_files_delete" = "Eliminar"; -"web_files_in_browser" = "En el almacenamiento de este navegador"; -"web_files_save_hint_fmt" = "Al guardar, el programa se coloca en %@."; -"web_files_empty" = "Aún no hay nada guardado. Al guardar, VisuStruct crea aquí una carpeta con la fecha de hoy."; -"web_files_reconnect_hint" = "Tras recargar, el navegador vuelve a preguntar si VisuStruct puede usar tu carpeta."; -"web_files_reconnect_fmt" = "Abrir la carpeta «%@»"; -"web_files_connect_hint" = "Elige una carpeta como espacio de trabajo. VisuStruct crea en ella una carpeta para cada día y guarda el diagrama y el código."; -"web_files_connect" = "Elegir carpeta"; -"web_files_browser_hint" = "Este navegador no puede abrir carpetas del dispositivo (por ejemplo en el iPad). Tus archivos quedan en el almacenamiento de este navegador."; -"web_files_browser" = "Guardar en el navegador"; -"web_files_delete_confirm_fmt" = "¿Eliminar «%@»?"; -"web_files_folder_prompt" = "Nombre de la nueva carpeta:"; -"web_files_default_name" = "Programa"; -"web_files_saved_fmt" = "Guardado: %@"; -"web_files_create" = "Crear"; -"web_learn_ludwig_tip" = "El consejo de Ludwig"; -"web_game_title" = "Juego: ¿Verdadero o falso?"; -"web_game_intro" = "Ludwig te muestra valores y una condición. ¿Es verdadera (true) o falsa (false)? Diez rondas, cada vez más difíciles."; -"web_game_start" = "Empezar el juego"; -"web_game_round_fmt" = "Ronda %@ de %@"; -"web_game_score_fmt" = "Puntos: %@"; -"web_game_true" = "verdadero (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "¡Correcto!"; -"web_game_wrong" = "No del todo. Así se calcula:"; -"web_game_next" = "Siguiente"; -"web_game_finish" = "Resultado"; -"web_game_done_fmt" = "%@ de %@ correctas."; -"web_game_perfect" = "¡Todo correcto! Ludwig está impresionado."; -"web_game_good" = "¡Muy bien! Revisa tus errores e inténtalo de nuevo."; -"web_game_practice" = "La práctica hace al maestro. Vuelve a leer la tabla de verdad y juega otra ronda."; -"web_game_again" = "Jugar otra vez"; -"web_game_wrong_short" = "Lo siento, es incorrecto."; -"web_game_practice_short" = "La práctica hace al maestro. Vuelve a leer las explicaciones y juega otra ronda."; -"web_game_clicks" = "Clics:"; -"web_game_nobody" = "Nadie escucha: no pasa nada."; -"web_game_event_fmt" = "Clic en «%@»: el oyente lo oye y ejecuta su código."; -"web_game_try" = "Ahora prueba tú los botones de la ventana."; -"web_game_time_fmt" = "Quedan %@ s"; -"web_game_defused" = "✂️ ¡Desactivada! Has encontrado el error."; -"web_game_boom_time" = "💥 ¡Bum! Se acabó el tiempo."; -"web_game_boom_wrong" = "💥 ¡Bum! Esa no era la línea."; -"web_game_boom_part" = "💥 ¡Bum! La línea es correcta, pero el error está en otra parte."; -"web_game_boom_wrong_part" = "💥 ¡Bum! El error está en otra línea."; -"web_game_bomb_parts_hint" = "Toca exactamente la parte incorrecta."; -"web_game_fix" = "La línea correcta:"; -"web_game_order_hint" = "Toca los pasos en el orden correcto."; -"web_debug_step" = "Paso a paso"; -"web_debug_step_title" = "Paso a paso: ejecutar una instrucción y detenerse de nuevo"; -"web_debug_continue" = "Continuar hasta el siguiente punto de interrupción"; -"web_debug_paused_fmt" = "Detenido antes de la línea %d."; -"web_debug_gutter_title" = "Haz clic en un número de línea para poner o quitar un punto de interrupción"; -"web_swap_to_code" = "Programación grande"; -"web_swap_to_editor" = "Diagrama grande"; -"web_editor_resize" = "Cambiar el ancho del diagrama"; -"web_palette_resize" = "Cambiar el ancho de los elementos"; -"web_palette_hide" = "Ocultar elementos"; -"web_palette_show" = "Mostrar elementos"; -"web_code_scopes" = "Bloques de código en color"; -"web_code_scopes_hint" = "Clase, método, bucle, condición en sus propias cajas"; -"web_pseudocode" = "Pseudocódigo"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Renombrar variable …"; -"web_rename_title" = "Renombrar variable"; -"web_rename_old" = "Nombre"; -"web_rename_new" = "Nombre nuevo"; -"web_rename_hint" = "Cambia cada lugar con exactamente esta escritura (numero no es Numero), en el código y en el estructograma. El texto entre \\"…\\" y los comentarios no cambian."; -"web_rename_count_fmt" = "Aparece %d veces."; -"web_rename_exists_fmt" = "«%@» ya existe: después ambas serían una sola variable."; -"web_rename_invalid" = "Un nombre empieza con una letra y solo contiene letras, cifras y _."; -"web_rename_keyword_fmt" = "«%@» es una palabra clave de Java."; -"web_rename_apply" = "Renombrar"; -"web_rename_cancel" = "Cancelar"; -`;export{e as default}; diff --git a/website/app/assets/flowApp-BYyoSxMn.js b/website/app/assets/flowApp-BYyoSxMn.js deleted file mode 100644 index c948f479..00000000 --- a/website/app/assets/flowApp-BYyoSxMn.js +++ /dev/null @@ -1,50 +0,0 @@ -var dt=Object.defineProperty;var lt=(i,t,e)=>t in i?dt(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var y=(i,t,e)=>lt(i,typeof t!="symbol"?t+"":t,e);import{t as h,g as ct,i as I,w as ht,a as ut,q as ft,h as pt,u as G,v as gt,x as wt,y as vt,z as mt,A as xt,n as yt,o as bt}from"./index-BqSgHxq8.js";const et=["start","anweisung","ein","verzweigung","unterprogramm","ende"],m=20,st={start:"#d1f2d9",ende:"#d1f2d9",anweisung:"#e5f0ff",ein:"#f2e6ff",verzweigung:"#fff4d6",unterprogramm:"#e5f0ff"},z=16,_t=170;function $t(i,t,e){const n=[];for(const s of i.split(` -`)){let o="";for(const r of s.split(/\s+/).filter(Boolean)){const a=o?`${o} ${r}`:r;o&&e(a)>t?(n.push(o),o=r):o=a}n.push(o)}return n.length?n:[""]}const U=i=>Math.round(i/m)*m;function C(i,t){const e=$t(i.text,_t,t),n=Math.max(0,...e.map(t)),s=e.length*z;let o,r;if(i.shape==="verzweigung")o=Math.max(140,n*1.7+30),r=Math.max(80,s*1.8+24);else{const a=i.shape==="ein"?44:i.shape==="unterprogramm"?40:i.shape==="anweisung"?24:36;o=Math.max(i.shape==="start"||i.shape==="ende"?100:120,n+a),r=Math.max(40,s+18)}return{x:i.x,y:i.y,w:Math.ceil(o/m)*m,h:Math.ceil(r/m)*m,lines:e}}function V(i){return i==="ende"?[]:i==="verzweigung"?["ja","nein"]:["out"]}const P=i=>i!=="start";function j(i,t,e){var s;if(e==="out")return"bottom";const n=((s=i.yesRight)==null?void 0:s.includes(t.id))??!1;return e==="ja"===n?"right":"bottom"}function F(i,t){return t==="bottom"?[i.x,i.y+i.h/2]:[i.x+i.w/2,i.y]}const Lt=i=>[i.x,i.y-i.h/2];function Et(i,t,e,n=0){const[s,o]=F(i,t),[r,a]=Lt(e),d=m,u=Math.max(i.x+i.w/2,e.x+e.w/2)+d*(1.5+n);if(t==="bottom"){if(a>=o+d){if(s===r)return[[s,o],[r,a]];const l=o+d;return[[s,o],[s,l],[r,l],[r,a]]}return[[s,o],[s,o+d],[u,o+d],[u,a-d],[r,a-d],[r,a]]}const p=e.x-e.w/2;if(p>=s+d&&Math.abs(e.y-o)=o+d){if(r>=s+d)return[[s,o],[r,o],[r,a]];const l=s+d;return[[s,o],[l,o],[l,a-d],[r,a-d],[r,a]]}const f=Math.max(s+d,u);return[[s,o],[f,o],[f,a-d],[r,a-d],[r,a]]}function nt(i=""){return{title:i,nodes:[],edges:[]}}function it(i,t){const e=new Set([...i.nodes.map(s=>s.id),...i.edges.map(s=>s.id)]);let n=1;for(;e.has(`${t}${n}`);)n++;return`${t}${n}`}function q(i,t,e,n,s){const o=it(i,"n");return{doc:{...i,nodes:[...i.nodes,{id:o,shape:t,x:U(e),y:U(n),text:s}]},id:o}}function J(i,t,e,n){return{...i,nodes:i.nodes.map(s=>s.id===t?{...s,x:Math.max(m*4,U(e)),y:Math.max(m*2,U(n))}:s)}}function kt(i,t,e){return{...i,nodes:i.nodes.map(n=>n.id===t?{...n,text:e}:n)}}function _(i,t,e,n){const s=i.nodes.find(a=>a.id===t),o=i.nodes.find(a=>a.id===n);if(!s||!o||t===n||!V(s.shape).includes(e)||!P(o.shape))return i;const r=i.edges.filter(a=>!(a.from===t&&a.port===e));return{...i,edges:[...r,{id:it(i,"e"),from:t,port:e,to:n}]}}function St(i,t){return V(t.shape).find(e=>!i.edges.some(n=>n.from===t.id&&n.port===e))}function Mt(i,t){var e;return{...i,nodes:i.nodes.filter(n=>n.id!==t),edges:i.edges.filter(n=>n.from!==t&&n.to!==t),yesRight:(e=i.yesRight)==null?void 0:e.filter(n=>n!==t)}}function At(i,t){return{...i,edges:i.edges.filter(e=>e.id!==t)}}function ot(i,t){const e=new Set(i.yesRight??[]);return e.has(t)?e.delete(t):e.add(t),{...i,yesRight:[...e]}}function b(i){return JSON.stringify({format:"visuflow",version:1,...i},null,2)}function W(i){let t;try{t=JSON.parse(i)}catch{return}if(!t||typeof t!="object")return;const e=t;if(!Array.isArray(e.nodes)||!Array.isArray(e.edges))return;const n=[];for(const o of e.nodes)!o||typeof o.id!="string"||!et.includes(o.shape)||!Number.isFinite(o.x)||!Number.isFinite(o.y)||n.some(r=>r.id===o.id)||n.push({id:o.id,shape:o.shape,x:o.x,y:o.y,text:typeof o.text=="string"?o.text:""});let s={title:typeof e.title=="string"?e.title:"",nodes:n,edges:[]};for(const o of e.edges)!o||typeof o.from!="string"||typeof o.to!="string"||typeof o.port!="string"||(s=_(s,o.from,o.port,o.to));return Array.isArray(e.yesRight)&&(s.yesRight=e.yesRight.filter(o=>typeof o=="string"&&n.some(r=>r.id===o))),s}const H="http://www.w3.org/2000/svg",X="visuflow.doc",It=100,Y=14,rt=`${Y}px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`,T="#1c1c1e",w=i=>i.replace(/[&<>"]/g,t=>({"&":"&","<":"<",">":">",'"':"""})[t]);function Ct(i){try{return localStorage.getItem(i)}catch{return null}}function Z(i,t){try{localStorage.setItem(i,t)}catch{}}function Rt(){return yt("visustruct",bt())}function D(i,t,e){const n=URL.createObjectURL(new Blob([t],{type:e})),s=document.createElement("a");s.href=n,s.download=i,s.click(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function v(i,t={}){const e=document.createElementNS(H,i);for(const[n,s]of Object.entries(t))e.setAttribute(n,String(s));return e}let N;function R(i){return N===void 0&&(N=document.createElement("canvas").getContext("2d")),N?(N.font=rt,N.measureText(i).width):i.length*Y*.55}const Tt=i=>h(`web_visuflow_shape_${i}`),B=i=>h(`web_visuflow_text_${i}`);function at(i,t){const e=t.x-t.w/2,n=t.x+t.w/2,s=t.y-t.h/2,o=t.y+t.h/2;return i==="verzweigung"?v("path",{d:`M${t.x} ${s} L${n} ${t.y} L${t.x} ${o} L${e} ${t.y} Z`}):i==="ein"?v("path",{d:`M${e+14} ${s} L${n} ${s} L${n-14} ${o} L${e} ${o} Z`}):i==="unterprogramm"?v("path",{d:`M${e} ${s} H${n} V${o} H${e} Z M${e+10} ${s} V${o} M${n-10} ${s} V${o}`}):v("rect",{x:e,y:s,width:t.w,height:t.h,rx:i==="anweisung"?2:t.h/2})}function Bt(i){const t=v("text",{"text-anchor":"middle","font-size":Y,fill:T});return i.lines.forEach((e,n)=>{const s=v("tspan",{x:i.x,y:i.y+5+(n-(i.lines.length-1)/2)*z});s.textContent=e,t.append(s)}),t}function Q(i){const t=v("svg",{viewBox:"0 0 64 36",width:64,height:36,"aria-hidden":"true"}),e=at(i,{x:32,y:18,w:i==="verzweigung"?54:56,h:i==="verzweigung"?32:26});return e.setAttribute("fill",st[i]),e.setAttribute("stroke",T),e.setAttribute("stroke-width","1.5"),t.append(e),t.outerHTML}function tt(){let i=nt(h("web_visuflow_example_title"));const t=[],e=(p,f,l,c)=>{const g=q(i,p,f,l,c);i=g.doc,t.push(g.id)};e("start",240,60,B("start")),e("anweisung",240,160,h("web_visuflow_example_water")),e("anweisung",240,260,h("web_visuflow_example_bag")),e("verzweigung",240,380,h("web_visuflow_example_hot")),e("anweisung",480,380,h("web_visuflow_example_wait")),e("anweisung",240,500,h("web_visuflow_example_drink")),e("ende",240,600,B("ende"));const[n,s,o,r,a,d,u]=t;return i=_(i,n,"out",s),i=_(i,s,"out",o),i=_(i,o,"out",r),i=ot(i,r),i=_(i,r,"ja",a),i=_(i,a,"out",r),i=_(i,r,"nein",d),i=_(i,d,"out",u),i}function Nt(){return q(nt(),"start",240,60,B("start")).doc}class Pt{constructor(t){y(this,"shell");y(this,"svg");y(this,"scroller");y(this,"status");y(this,"titleInput");y(this,"doc");y(this,"selection");y(this,"history",[]);y(this,"future",[]);y(this,"editor");y(this,"dragLine");document.documentElement.classList.add("visuflow-theme"),history.replaceState(history.state,"",`${location.pathname}?visuflow${location.hash}`),this.doc=W(Ct(X)??"")??tt(),this.shell=document.createElement("div"),this.shell.className="shell visuflow",t.replaceWith(this.shell),this.build(),this.render(),window.addEventListener("keydown",e=>this.onKey(e))}build(){const t=(l,c,g,x=c)=>``,e=et.map(l=>``).join("");this.shell.innerHTML=` - -
    - -
    -
    -
    - -
    -

    -
    -
    - `;const n=l=>this.shell.querySelector(l);this.svg=n(".vf-canvas"),this.scroller=n(".vf-scroll"),this.status=n(".vf-status"),this.titleInput=n(".vf-title");const s=(l,c)=>n(`[data-action=${l}]`).addEventListener("click",c);s("new",()=>this.replace(Nt())),s("example",()=>this.replace(tt())),s("open",()=>n("input[type=file]").click()),s("save",()=>this.save()),s("undo",()=>this.undo(!1)),s("redo",()=>this.undo(!0)),s("delete",()=>this.deleteSelection()),s("swap",()=>{var l;((l=this.selection)==null?void 0:l.kind)==="node"&&this.change(ot(this.doc,this.selection.id))});const o=n("input[type=file]");o.addEventListener("change",async()=>{var g;const l=(g=o.files)==null?void 0:g[0];if(o.value="",!l)return;const c=W(await l.text());if(!c)return this.showStatus(h("web_visuflow_open_error"));c.title||(c.title=l.name.replace(/\.(visuflow|json)$/i,"")),this.replace(c)});let r;this.titleInput.addEventListener("focus",()=>r=b(this.doc)),this.titleInput.addEventListener("input",()=>{this.doc={...this.doc,title:this.titleInput.value},Z(X,b(this.doc))}),this.titleInput.addEventListener("change",()=>{r!==void 0&&r!==b(this.doc)&&this.pushUndo(r),r=b(this.doc)});const a=n("[data-action=export]"),d=n(".vf-menu"),u=l=>{d.hidden=!l,a.setAttribute("aria-expanded",String(l))};a.addEventListener("click",()=>u(d.hidden)),d.addEventListener("click",l=>{var g;const c=(g=l.target.closest("[data-export]"))==null?void 0:g.dataset.export;c&&(u(!1),this.export(c))});const p=n("[data-action=settings]"),f=n(".settings-menu");p.addEventListener("click",()=>{f.hidden=!f.hidden,p.setAttribute("aria-expanded",String(!f.hidden))}),document.addEventListener("pointerdown",l=>{const c=l.target;!f.hidden&&!c.closest(".settings")&&(f.hidden=!0),!d.hidden&&!c.closest(".vf-export")&&u(!1)});for(const l of f.querySelectorAll("[data-world]"))l.addEventListener("click",()=>this.chooseWorld(l.dataset.world));for(const l of this.shell.querySelectorAll(".vf-shape"))this.setupPaletteButton(l);this.svg.addEventListener("pointerdown",l=>this.onPointerDown(l)),this.svg.addEventListener("dblclick",l=>{var g;const c=(g=l.target.closest("[data-node]"))==null?void 0:g.dataset.node;c&&this.editText(c)})}chooseWorld(t){if(t!=="flow"){if(t==="object"){ft(),location.href=`${location.pathname}?visuobject${location.hash}`;return}pt(t),location.href=`${location.pathname}?${t==="on"?"visubot":"visustruct"}${location.hash}`}}pushUndo(t){this.history.push(t),this.history.length>It&&this.history.shift(),this.future=[]}change(t,e){t!==this.doc&&(this.pushUndo(b(this.doc)),this.doc=t,e!==void 0&&(this.selection=e??void 0),this.afterChange())}replace(t){this.change(t,null),this.scroller.scrollTo(0,0)}afterChange(){Z(X,b(this.doc)),this.selection&&!this.find(this.selection)&&(this.selection=void 0),this.render()}find(t){return t.kind==="node"?this.doc.nodes.find(e=>e.id===t.id):this.doc.edges.find(e=>e.id===t.id)}undo(t){this.closeEditor(!0);const e=t?this.future:this.history,n=t?this.history:this.future,s=e.pop();s!==void 0&&(n.push(b(this.doc)),this.doc=W(s)??this.doc,this.afterChange())}deleteSelection(){const t=this.selection;t&&this.change(t.kind==="node"?Mt(this.doc,t.id):At(this.doc,t.id),null)}save(){const t=G(this.doc.title)||"PAP";D(`${t}.visuflow`,b(this.doc),"application/json"),this.showStatus(h("web_visuflow_saved",`${t}.visuflow`))}boxes(t=this.doc){return new Map(t.nodes.map(e=>[e.id,C(e,R)]))}drawInto(t,e){var f,l;const n=this.boxes(),s=h("web_learn_pap_yes"),o=h("web_learn_pap_no");t.innerHTML=``;const r=v("g",{class:"vf-edges"}),a=v("g",{class:"vf-labels","font-size":12,"font-weight":600}),d=v("g",{class:"vf-nodes"}),u=v("g",{class:"vf-ports"});let p=0;for(const c of this.doc.edges){const g=this.doc.nodes.find(M=>M.id===c.from),x=n.get(c.from),$=n.get(c.to),k=j(this.doc,g,c.port),L=$.y-$.h/2M.join(",")).join(" "),E=v("g",{"data-edge":c.id,class:`vf-edge${!e&&((f=this.selection)==null?void 0:f.kind)==="edge"&&this.selection.id===c.id?" selected":""}`});e||E.append(v("polyline",{points:S,class:"vf-edge-hit",fill:"none",stroke:"transparent","stroke-width":16})),E.append(v("polyline",{points:S,class:"vf-edge-line",fill:"none",stroke:T,"stroke-width":2,"marker-end":"url(#vf-arrow)"})),r.append(E)}for(const c of this.doc.nodes){const g=n.get(c.id),x=!e&&((l=this.selection)==null?void 0:l.kind)==="node"&&this.selection.id===c.id,$=v("g",{"data-node":c.id,class:`vf-node${x?" selected":""}`}),k=at(c.shape,g);k.setAttribute("fill",st[c.shape]),k.setAttribute("stroke",T),k.setAttribute("stroke-width","2"),$.append(k,Bt(g)),d.append($);for(const L of V(c.shape)){const O=j(this.doc,c,L),[S,E]=F(g,O),M=this.doc.edges.some(A=>A.from===c.id&&A.port===L);if(L!=="out"&&(M||!e)){const A=v("text",O==="bottom"?{x:S+7,y:E+15}:{x:S+6,y:E-7});A.setAttribute("fill",L==="ja"?"#248a3d":"#d70015"),A.textContent=L==="ja"?s:o,a.append(A)}if(e)continue;const K=v("g",{"data-port":L,"data-from":c.id,class:`vf-port${M?" used":""}`});K.append(v("circle",{cx:S,cy:E,r:16,fill:"transparent"}),v("circle",{cx:S,cy:E,r:6,class:"vf-port-dot"})),u.append(K)}}return t.append(r,d,a,u),n}render(){this.closeEditor(!0);const t=this.drawInto(this.svg,!1);let e=0,n=0;for(const d of t.values())e=Math.max(e,d.x+d.w/2),n=Math.max(n,d.y+d.h/2);const s=Math.max(this.scroller.clientWidth,e+300),o=Math.max(this.scroller.clientHeight,n+300);this.svg.setAttribute("width",String(s)),this.svg.setAttribute("height",String(o)),this.svg.setAttribute("viewBox",`0 0 ${s} ${o}`),document.activeElement!==this.titleInput&&(this.titleInput.value=this.doc.title);const r=this.selection,a=(r==null?void 0:r.kind)==="node"?this.doc.nodes.find(d=>d.id===r.id):void 0;this.shell.querySelector("[data-action=swap]").disabled=(a==null?void 0:a.shape)!=="verzweigung",this.shell.querySelector("[data-action=delete]").disabled=!r,this.shell.querySelector("[data-action=undo]").disabled=this.history.length===0,this.shell.querySelector("[data-action=redo]").disabled=this.future.length===0,this.showStatus(h(this.doc.nodes.length===0?"web_visuflow_status_empty":(r==null?void 0:r.kind)==="edge"?"web_visuflow_status_edge":r?"web_visuflow_status_node":"web_visuflow_status_idle"))}showStatus(t){this.status.textContent=t}setupPaletteButton(t){const e=t.dataset.shape;t.addEventListener("pointerdown",n=>{if(n.button!==0)return;n.preventDefault();const s={x:n.clientX,y:n.clientY};let o;const r=d=>{!o&&Math.hypot(d.clientX-s.x,d.clientY-s.y)<6||(o||(o=document.createElement("div"),o.className="vf-ghost",o.innerHTML=Q(e),document.body.append(o)),o.style.left=`${d.clientX}px`,o.style.top=`${d.clientY}px`)},a=d=>{if(window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",a),window.removeEventListener("pointercancel",a),!o)return this.appendShape(e);if(o.remove(),d.type==="pointercancel")return;const u=this.scroller.getBoundingClientRect();if(d.clientXu.right||d.clientYu.bottom)return;const p=this.toCanvas(d),{doc:f,id:l}=q(this.doc,e,p.x,p.y,B(e));this.change(f,{kind:"node",id:l}),this.editText(l)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",a),window.addEventListener("pointercancel",a)}),t.addEventListener("keydown",n=>{n.key!=="Enter"&&n.key!==" "||(n.preventDefault(),this.appendShape(e))})}appendShape(t){var f;const e=this.selection,n=(e==null?void 0:e.kind)==="node"?this.doc.nodes.find(l=>l.id===e.id):void 0,s=n&&P(t)?St(this.doc,n):void 0,o=C({shape:t,x:0,y:0,text:B(t)},R);let r=240,a=60;if(n&&s){const l=C(n,R);j(this.doc,n,s)==="right"?(r=l.x+l.w/2+3*m+o.w/2,a=l.y):(r=l.x,a=l.y+l.h/2+3*m+o.h/2)}else if(this.doc.nodes.length){const c=[...this.boxes().values()].reduce((g,x)=>x.y+x.h/2>g.y+g.h/2?x:g);r=n?C(n,R).x:c.x,a=c.y+c.h/2+3*m+o.h/2}let{doc:d,id:u}=q(this.doc,t,r,a,B(t));n&&s&&(d=_(d,n.id,s,u)),this.change(d,{kind:"node",id:u});const p=this.svg.querySelector(`[data-node="${u}"]`);(f=p==null?void 0:p.scrollIntoView)==null||f.call(p,{block:"nearest",inline:"nearest"}),this.editText(u)}toCanvas(t){const e=this.svg.getBoundingClientRect();return{x:t.clientX-e.left,y:t.clientY-e.top}}nodeAt(t,e){const n=this.boxes();return[...this.doc.nodes].reverse().find(s=>{const o=n.get(s.id);return s.id!==e&&Math.abs(t.x-o.x)<=o.w/2+4&&Math.abs(t.y-o.y)<=o.h/2+4})}onPointerDown(t){var r,a;if(t.button!==0)return;const e=t.target,n=e.closest("[data-port]");if(n)return this.dragArrow(t,n.dataset.from,n.dataset.port);const s=(r=e.closest("[data-node]"))==null?void 0:r.dataset.node;if(s)return this.dragNode(t,s);const o=(a=e.closest("[data-edge]"))==null?void 0:a.dataset.edge;this.closeEditor(!0),this.selection=o?{kind:"edge",id:o}:void 0,this.render()}dragNode(t,e){var f;t.preventDefault();const n=((f=this.selection)==null?void 0:f.kind)==="node"&&this.selection.id===e;this.closeEditor(!0),this.selection={kind:"node",id:e},this.render();const s=this.doc.nodes.find(l=>l.id===e),o=this.toCanvas(t),r=b(this.doc),a={x:s.x,y:s.y};let d=!1;const u=l=>{const c=this.toCanvas(l);!d&&Math.hypot(c.x-o.x,c.y-o.y)<5||(d=!0,this.doc=J(this.doc,e,a.x+c.x-o.x,a.y+c.y-o.y),this.render())},p=()=>{window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p),d?(b(this.doc)!==r&&this.pushUndo(r),this.afterChange()):n&&this.editText(e)};window.addEventListener("pointermove",u),window.addEventListener("pointerup",p),window.addEventListener("pointercancel",p)}dragArrow(t,e,n){t.preventDefault(),this.closeEditor(!0);const s=this.doc.nodes.find(p=>p.id===e),[o,r]=F(C(s,R),j(this.doc,s,n));this.dragLine=v("line",{x1:o,y1:r,x2:o,y2:r,class:"vf-drag-line","marker-end":"url(#vf-arrow)"}),this.svg.append(this.dragLine),this.showStatus(h("web_visuflow_status_connect"));let a=null;const d=p=>{const f=this.toCanvas(p);this.dragLine.setAttribute("x2",String(f.x)),this.dragLine.setAttribute("y2",String(f.y));const l=this.nodeAt(f,e);a==null||a.classList.remove("drop-target"),a=l&&P(l.shape)?this.svg.querySelector(`[data-node="${l.id}"]`):null,a==null||a.classList.add("drop-target")},u=p=>{var l;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u),window.removeEventListener("pointercancel",u),(l=this.dragLine)==null||l.remove(),this.dragLine=void 0;const f=p.type==="pointercancel"?void 0:this.nodeAt(this.toCanvas(p),e);f&&P(f.shape)?this.change(_(this.doc,e,n,f.id),{kind:"node",id:f.id}):this.render()};window.addEventListener("pointermove",d),window.addEventListener("pointerup",u),window.addEventListener("pointercancel",u)}editText(t){this.closeEditor(!0);const e=this.doc.nodes.find(d=>d.id===t);if(!e)return;const n=C(e,R),s=document.createElement("textarea");s.className="vf-editor",s.value=e.text,s.setAttribute("aria-label",h("web_visuflow_edit_label"));const o=e.shape==="verzweigung"?.62:.92,r=Math.max(110,n.w*o);s.style.left=`${this.svg.getBoundingClientRect().left-this.scroller.getBoundingClientRect().left+this.scroller.scrollLeft+n.x-r/2}px`,s.style.top=`${this.svg.getBoundingClientRect().top-this.scroller.getBoundingClientRect().top+this.scroller.scrollTop+n.y-Math.max(28,n.lines.length*z+10)/2}px`,s.style.width=`${r}px`,s.style.height=`${Math.max(28,n.lines.length*z+10)}px`,s.dataset.node=t,this.scroller.append(s),this.editor=s,s.focus(),s.select();const a=()=>{s.style.height="auto",s.style.height=`${s.scrollHeight}px`};s.addEventListener("input",a),s.addEventListener("keydown",d=>{d.stopPropagation(),d.key==="Enter"&&!d.shiftKey?(d.preventDefault(),this.closeEditor(!0)):d.key==="Escape"&&(d.preventDefault(),this.closeEditor(!1))}),s.addEventListener("blur",()=>this.closeEditor(!0))}closeEditor(t){const e=this.editor;if(!e)return;this.editor=void 0,e.remove();const n=e.dataset.node,s=this.doc.nodes.find(r=>r.id===n),o=e.value.trim();t&&s&&o!==s.text&&this.change(kt(this.doc,n,o))}onKey(t){var a,d;const e=(d=(a=t.target).closest)==null?void 0:d.call(a,"input, textarea, [contenteditable]"),n=t.ctrlKey||t.metaKey;if(n&&t.key.toLowerCase()==="s")return t.preventDefault(),this.save();if(e)return;if(n&&t.key.toLowerCase()==="z")return t.preventDefault(),this.undo(t.shiftKey);if(n&&t.key.toLowerCase()==="y")return t.preventDefault(),this.undo(!0);const s=this.selection;if(!s)return;if(t.key==="Delete"||t.key==="Backspace")return t.preventDefault(),this.deleteSelection();if(s.kind!=="node")return;if(t.key==="Enter"||t.key==="F2")return t.preventDefault(),this.editText(s.id);const o={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]}[t.key];if(!o)return;t.preventDefault();const r=this.doc.nodes.find(u=>u.id===s.id);this.change(J(this.doc,s.id,r.x+o[0]*m,r.y+o[1]*m))}exportImage(){if(this.doc.nodes.length===0)return;const t=document.createElementNS(H,"svg"),e=this.drawInto(t,!0);let n=1/0,s=1/0,o=-1/0,r=-1/0;for(const c of e.values())n=Math.min(n,c.x-c.w/2),s=Math.min(s,c.y-c.h/2),o=Math.max(o,c.x+c.w/2),r=Math.max(r,c.y+c.h/2);for(const c of t.querySelectorAll("polyline"))for(const g of(c.getAttribute("points")??"").split(" ")){const[x,$]=g.split(",").map(Number);n=Math.min(n,x),o=Math.max(o,x+4),s=Math.min(s,$),r=Math.max(r,$)}o+=30;const a=20,d=this.doc.title.trim(),u=d?32:0,p=Math.ceil(o-n+2*a),f=Math.ceil(r-s+2*a+u);t.setAttribute("xmlns",H),t.setAttribute("width",String(p)),t.setAttribute("height",String(f)),t.setAttribute("viewBox",`${n-a} ${s-a-u} ${p} ${f}`),t.setAttribute("font-family",rt.replace(/^\d+px /,""));const l=v("rect",{x:n-a,y:s-a-u,width:p,height:f,fill:"#ffffff"});if(t.insertBefore(l,t.firstChild.nextSibling),d){const c=v("text",{x:n-a+12,y:s-a-u+26,"font-size":16,"font-weight":700,fill:T});c.textContent=d,t.append(c)}return{svg:t,width:p,height:f}}async export(t){const e=this.exportImage();if(!e)return this.showStatus(h("web_visuflow_status_empty"));const n=G(this.doc.title)||"PAP";if(t==="svg")return D(`${n}.svg`,gt(e),"image/svg+xml");const s=await wt(e,t==="png"?2:3);if(t==="png")return D(`${n}.png`,await vt(s),"image/png");const o=await mt(xt(s),s.width,s.height,e,this.doc.title.trim()||"PAP");D(`${n}.pdf`,o,"application/pdf")}}export{Pt as FlowApp}; diff --git a/website/app/assets/fr-D5Wy8Mcd.js b/website/app/assets/fr-D5Wy8Mcd.js deleted file mode 100644 index e1b383dd..00000000 --- a/website/app/assets/fr-D5Wy8Mcd.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Textes propres à la version web. Tout le reste provient des Localizable.strings de l’app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Organigramme VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Suppr"; -"web_key_shift" = "Maj"; -"web_export" = "Exporter…"; -"web_export_title" = "Enregistrer comme image ou PDF, ou imprimer"; -"web_export_png" = "Image (PNG)"; -"web_export_svg" = "Graphique vectoriel (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Fichier VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Échec de l’exportation : %@"; -"web_print_hint" = "Utilisez « Exporter… → PDF » pour enregistrer le diagramme, puis imprimez-le."; -"web_delete" = "Supprimer"; -"web_language_title" = "Langue de l’interface"; -"web_simulation_start" = "Lancer la simulation"; -"web_simulation_end" = "Terminer la simulation"; -"web_simulation_start_title" = "Exécuter l’organigramme étape par étape"; -"web_simulation_end_title" = "Terminer la simulation et reprendre l’édition"; -"web_palette_hint" = "Glisser dans l’organigramme"; -"web_tabs_label" = "Diagrammes"; -"web_status_modified" = "modifié"; -"web_inspector_title" = "Propriétés"; -"web_inspector_resize" = "Modifier la hauteur de l’inspecteur d’objets : faire glisser la ligne vers le haut ou le bas (double-clic : par défaut)"; -"web_inspector_help_drop" = "Glissez des éléments de la palette sur une tuile : en haut = avant, en bas = après, sur « ø » = remplacer. Les éléments existants se déplacent à la souris."; -"web_inspector_help_inline" = "Double-cliquez ou touchez deux fois un élément pour modifier son texte directement dans le diagramme (Entrée valide, Échap annule). Idem pour les noms de cas."; -"web_inspector_help_files" = "Vous pouvez aussi déposer des fichiers dans la fenêtre."; -"web_case_name" = "Nom du cas"; -"web_case_name_placeholder" = "p. ex. 1, ok, default"; -"web_copied" = "Élément copié."; -"web_discard_message_fmt" = "Les modifications de « %@ » seront perdues."; -"web_err_unreadable_fmt" = "« %@ » n’est pas un fichier VisuStruct lisible (%@)."; -"web_saved_fmt" = "« %@ » enregistré."; -"web_saved_txt_fmt" = "Enregistré sous « %@ ». Supprimez l’extension .txt pour l’utiliser."; -"web_drop_impossible" = "Impossible de déposer ici"; -"web_sim_delay" = "Pause par étape"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Langage"; -"web_codegen_comments" = "Texte du diagramme en commentaires"; -"web_codegen_empty_else" = "Générer une branche else vide dans le code"; -"web_copied_check" = "Copié ✓"; -"web_copy_manual" = "Sélectionné, appuyez sur Ctrl+C pour copier"; -"web_run_stopped_loop" = "Exécution arrêtée : boucle infinie possible."; -"web_run_cancelled" = "Exécution annulée."; -"web_run_error" = "Erreur lors de l’exécution."; -"web_run_dropped_fmt" = "… %d lignes précédentes masquées"; -"web_sim_call_arguments_fmt" = "L’appel ne correspond pas à l’en-tête de %@. Vérifie les valeurs entre parenthèses."; -"web_sim_missing_return_fmt" = "%@ s’est terminé sans renvoyer de valeur avec return."; -"web_sim_file_not_found_fmt" = "Il n’existe aucun fichier nommé %@."; -"web_sim_end_of_file_fmt" = "Le fichier %@ n’a plus de ligne."; -"web_sim_null_value_fmt" = "%@ vaut null."; -"web_sim_unknown_variable_case_fmt" = "Variable inconnue : %1$@. Java distingue majuscules et minuscules : vouliez-vous dire %2$@ ?"; -"web_sim_written_file_fmt" = "%@ (enregistré)"; -"web_site_home" = "Accueil"; -"web_site_imprint" = "Mentions légales"; -"web_site_privacy" = "Confidentialité"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmation"; -"web_live_hide" = "Masquer la programmation"; -"web_scale_canvas" = "Taille du texte : structogramme"; -"web_scale_code" = "Taille du texte : programmation"; -"web_live_indent" = "Indenter"; -"web_live_indent_title" = "Indenter le code : quatre espaces par niveau (lignes sélectionnées, sinon tout)"; -"web_live_show" = "Afficher la programmation"; -"web_live_resize" = "Modifier la largeur de la zone de code (double-clic : réinitialiser)"; -"web_live_hint" = "Le code évolue avec ton diagramme. Gris = espace réservé : écris dans l’inspecteur et ton texte apparaît ici. Clique sur une ligne pour sélectionner son élément."; -"web_live_ph_selector" = "variable"; -"web_live_ph_code" = "Ton code"; -"web_live_ph_end" = "fin"; -"web_live_language" = "Langage de programmation"; -"web_live_java_class" = "Comme classe"; -"web_live_java_class_hint" = "Nom de la classe = titre du diagramme"; -"web_live_java_main" = "Avec méthode main"; -"web_settings_display" = "Affichage"; -"web_live_swing" = "Vrai Java (avec Swing)"; -"web_live_swing_hint" = "Du vrai Java avec fenêtres (CheerpJ). Télécharge environ 40 Mo une seule fois, au premier lancement."; -"web_live_swing_windows" = "Fenêtres Java"; -"web_live_swing_hide" = "Fermer les fenêtres Java"; -"web_live_swing_loading" = "Chargement de Java (environ 40 Mo la première fois) …"; -"web_live_swing_compiling" = "Compilation …"; -"web_live_swing_running" = "Le programme s’exécute."; -"web_live_swing_compile_failed" = "Erreur de compilation, voir ci-dessus."; -"web_live_swing_failed" = "Impossible de charger Java. Vérifie la connexion Internet."; -"web_live_hint_edit" = "Tape ici du code Java et le diagramme se construit tout seul. Ou travaille dans le diagramme et le code suit. Gris = espace réservé, il suffit d’écrire par-dessus."; -"web_live_edit_label" = "Code Java"; -"web_parse_line_fmt" = "Ligne %d : %@"; -"web_parse_missing" = "Il manque encore ici : %@"; -"web_parse_extra" = "En trop : %@"; -"web_parse_unclosed_string" = "Le %@ de fermeture manque ici."; -"web_parse_else_without_if" = "Ce « else » n’a pas de « if »."; -"web_parse_case_outside_switch" = "« case » et « default » vont dans un « switch »."; -"web_parse_missing_do_while" = "Après « do { … } », il manque « while (condition); »."; -"web_parse_more_methods" = "Pour l’instant, une seule méthode compte ici. Crée les autres sous-programmes dans des onglets séparés."; -"web_parse_missing_import" = "Il manque %@ tout en haut. Sans cette ligne, Java ne connaît pas Scanner."; -"web_parse_missing_scanner" = "Il manque avant %@ Sans cette ligne, le Scanner n’existe pas."; -"web_parse_unknown_type" = "Java ne connaît pas ce type de données. Vouliez-vous dire %@ ?"; -"web_quickfix_insert_fmt" = "Suggestion : insérer %@"; -"web_quickfix_replace_fmt" = "Suggestion : %1$@ au lieu de %2$@"; -"web_parse_wrong_case" = "Java distingue majuscules et minuscules. La bonne écriture est %@."; -"web_editor_title" = "Diagramme"; -"web_editor_show" = "Afficher le diagramme"; -"web_editor_hide" = "Masquer le diagramme"; -"web_keywords_title" = "Mots-clés du code"; -"web_keywords_hint" = "if, while, for au lieu des noms des éléments"; -"web_palette_compact" = "Éléments toujours compacts"; -"web_palette_compact_hint" = "Symbole avec le nom en petit dessous, sinon seulement si la colonne est étroite"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Logiciels utilisés"; -"web_about_software_text" = "L’éditeur de code utilise CodeMirror et Lezer (licence MIT). Avec la prise en charge de Swing, VisuStruct charge CheerpJ de Leaning Technologies (licence Community) et javac d’OpenJDK."; -"web_about_licenses" = "Textes des licences"; -"web_live_run" = "Exécuter"; -"web_live_run_title" = "Exécuter le programme : les sorties et les entrées apparaissent en dessous"; -"web_live_run_finished" = "Programme terminé."; -"web_live_run_stopped" = "Arrêté."; -"web_console" = "Console"; -"web_console_hide" = "Masquer la console"; -"web_console_resize" = "Redimensionner la console"; -"web_diagram_tools" = "Outils du diagramme"; -"web_files_title" = "Fichiers"; -"web_files_show" = "Afficher les fichiers"; -"web_files_hide" = "Masquer les fichiers"; -"web_files_resize" = "Redimensionner les fichiers"; -"web_files_new_folder" = "Nouveau dossier"; -"web_files_switch" = "Choisir un autre dossier"; -"web_files_delete" = "Supprimer"; -"web_files_in_browser" = "Dans le stockage de ce navigateur"; -"web_files_save_hint_fmt" = "L’enregistrement place le programme dans %@."; -"web_files_empty" = "Rien d’enregistré pour l’instant. À l’enregistrement, VisuStruct crée ici un dossier à la date du jour."; -"web_files_reconnect_hint" = "Après un rechargement, le navigateur redemande si VisuStruct peut utiliser ton dossier."; -"web_files_reconnect_fmt" = "Ouvrir le dossier « %@ »"; -"web_files_connect_hint" = "Choisis un dossier comme espace de travail. VisuStruct y crée un dossier pour chaque jour et enregistre le diagramme et le code."; -"web_files_connect" = "Choisir un dossier"; -"web_files_browser_hint" = "Ce navigateur ne peut pas ouvrir de dossiers de l’appareil (par exemple sur iPad). Tes fichiers restent alors dans le stockage de ce navigateur."; -"web_files_browser" = "Enregistrer dans le navigateur"; -"web_files_delete_confirm_fmt" = "Supprimer vraiment « %@ » ?"; -"web_files_folder_prompt" = "Nom du nouveau dossier :"; -"web_files_default_name" = "Programme"; -"web_files_saved_fmt" = "Enregistré : %@"; -"web_files_create" = "Créer"; -"web_learn_ludwig_tip" = "Le conseil de Ludwig"; -"web_game_title" = "Jeu : Vrai ou faux ?"; -"web_game_intro" = "Ludwig te montre des valeurs et une condition. Est-elle vraie (true) ou fausse (false) ? Dix manches, de plus en plus difficiles."; -"web_game_start" = "Commencer le jeu"; -"web_game_round_fmt" = "Manche %@ sur %@"; -"web_game_score_fmt" = "Points : %@"; -"web_game_true" = "vrai (true)"; -"web_game_false" = "faux (false)"; -"web_game_right" = "Correct !"; -"web_game_wrong" = "Pas tout à fait. Voici le calcul :"; -"web_game_next" = "Suivant"; -"web_game_finish" = "Résultat"; -"web_game_done_fmt" = "%@ sur %@ correctes."; -"web_game_perfect" = "Tout juste – Ludwig est très impressionné !"; -"web_game_good" = "Bravo ! Regarde encore tes erreurs et réessaie."; -"web_game_practice" = "C’est en forgeant qu’on devient forgeron. Relis la table de vérité et rejoue une partie."; -"web_game_again" = "Rejouer"; -"web_game_wrong_short" = "Dommage, c'est faux."; -"web_game_practice_short" = "C'est en forgeant qu'on devient forgeron. Relis les explications et rejoue une partie."; -"web_game_clicks" = "Clics :"; -"web_game_nobody" = "Personne n'écoute – rien ne se passe."; -"web_game_event_fmt" = "Clic sur « %@ » : l'écouteur l'entend et exécute son code."; -"web_game_try" = "Essaie maintenant toi-même les boutons de la fenêtre."; -"web_game_time_fmt" = "Encore %@ s"; -"web_game_defused" = "✂️ Désamorcée ! Tu as trouvé l’erreur."; -"web_game_boom_time" = "💥 Boum ! Le temps est écoulé."; -"web_game_boom_wrong" = "💥 Boum ! Ce n’était pas la bonne ligne."; -"web_game_boom_part" = "💥 Boum ! Bonne ligne, mais l’erreur est dans une autre partie."; -"web_game_boom_wrong_part" = "💥 Boum ! L’erreur est dans une autre ligne."; -"web_game_bomb_parts_hint" = "Touche exactement la partie fausse."; -"web_game_fix" = "La ligne correcte :"; -"web_game_order_hint" = "Touche les étapes dans le bon ordre."; -"web_debug_step" = "Pas à pas"; -"web_debug_step_title" = "Pas à pas : exécuter une instruction et s’arrêter à nouveau"; -"web_debug_continue" = "Continuer jusqu’au prochain point d’arrêt"; -"web_debug_paused_fmt" = "Arrêté avant la ligne %d."; -"web_debug_gutter_title" = "Clique sur un numéro de ligne pour poser ou retirer un point d’arrêt"; -"web_swap_to_code" = "Programmation en grand"; -"web_swap_to_editor" = "Structogramme en grand"; -"web_editor_resize" = "Modifier la largeur du structogramme"; -"web_palette_resize" = "Modifier la largeur des éléments"; -"web_palette_hide" = "Masquer les éléments"; -"web_palette_show" = "Afficher les éléments"; -"web_code_scopes" = "Blocs de code en couleur"; -"web_code_scopes_hint" = "Classe, méthode, boucle, condition dans leurs propres cadres"; -"web_pseudocode" = "Pseudo-code"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Renommer la variable …"; -"web_rename_title" = "Renommer la variable"; -"web_rename_old" = "Nom"; -"web_rename_new" = "Nouveau nom"; -"web_rename_hint" = "Modifie chaque endroit avec exactement cette écriture (nombre n’est pas Nombre), dans le code et dans le structogramme. Le texte entre \\"…\\" et les commentaires restent."; -"web_rename_count_fmt" = "Apparaît %d fois."; -"web_rename_exists_fmt" = "« %@ » existe déjà : ensuite les deux seraient une seule variable."; -"web_rename_invalid" = "Un nom commence par une lettre et ne contient que des lettres, des chiffres et _."; -"web_rename_keyword_fmt" = "« %@ » est un mot-clé Java."; -"web_rename_apply" = "Renommer"; -"web_rename_cancel" = "Annuler"; -`;export{e as default}; diff --git a/website/app/assets/grace-hopper-DltOT1I5.jpg b/website/app/assets/grace-hopper-DltOT1I5.jpg deleted file mode 100644 index d767c68d6484b9567f67a3aae2c9f8d81dad74f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46537 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 Zf;K7Rl4XzR6)vMJBpOpaC&2$L{13pmwzvQQ diff --git a/website/app/assets/he-CYY5d1yw.js b/website/app/assets/he-CYY5d1yw.js deleted file mode 100644 index 20966685..00000000 --- a/website/app/assets/he-CYY5d1yw.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* טקסטים שקיימים רק בגרסת הרשת. כל השאר מגיעים מקובץ Localizable.strings של האפליקציה. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "תרשים VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "ייצוא…"; -"web_export_title" = "שמירה כתמונה או כ‑PDF, או הדפסה"; -"web_export_png" = "תמונה (PNG)"; -"web_export_svg" = "גרפיקה וקטורית (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "קובץ VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "הייצוא נכשל: %@"; -"web_print_hint" = "השתמשו ב„ייצוא… → PDF” כדי לשמור את התרשים ולהדפיס אותו משם."; -"web_delete" = "מחיקה"; -"web_language_title" = "שפת הממשק"; -"web_simulation_start" = "התחלת סימולציה"; -"web_simulation_end" = "סיום סימולציה"; -"web_simulation_start_title" = "הרצת התרשים צעד אחר צעד"; -"web_simulation_end_title" = "סיום הסימולציה והמשך עריכה"; -"web_palette_hint" = "גררו לתוך התרשים"; -"web_tabs_label" = "תרשימים"; -"web_status_modified" = "שונה"; -"web_inspector_title" = "מאפיינים"; -"web_inspector_resize" = "שינוי גובה מפקח האובייקטים: גרור את הקו למעלה או למטה (לחיצה כפולה: ברירת מחדל)"; -"web_inspector_help_drop" = "גררו רכיבים מהלוח אל אריח: למעלה = לפני, למטה = אחרי, על „ø” = החלפה. ניתן להזיז רכיבים קיימים בעזרת העכבר."; -"web_inspector_help_inline" = "לחיצה כפולה או הקשה כפולה על רכיב לעריכת הטקסט ישירות בתרשים (Enter להחלה, Esc לביטול). כך גם שמות המקרים."; -"web_inspector_help_files" = "אפשר גם לגרור קבצים לתוך החלון."; -"web_case_name" = "שם המקרה"; -"web_case_name_placeholder" = "למשל 1, ok, default"; -"web_copied" = "הרכיב הועתק."; -"web_discard_message_fmt" = "השינויים ב„%@” יאבדו."; -"web_err_unreadable_fmt" = "„%@” אינו קובץ VisuStruct קריא (%@)."; -"web_saved_fmt" = "„%@” נשמר."; -"web_saved_txt_fmt" = "נשמר בשם „%@”. הסירו את הסיומת .txt כדי להשתמש בו."; -"web_drop_impossible" = "לא ניתן לשחרר כאן"; -"web_sim_delay" = "השהיה לכל צעד"; -"web_sim_delay_value_fmt" = "%@ שנ׳"; -"web_codegen_language" = "שפה"; -"web_codegen_comments" = "טקסט התרשים כהערות"; -"web_codegen_empty_else" = "יצירת ענף else ריק בקוד"; -"web_copied_check" = "הועתק ✓"; -"web_copy_manual" = "נבחר, הקישו Ctrl+C להעתקה"; -"web_run_stopped_loop" = "ההרצה נעצרה: ייתכן שיש לולאה אינסופית."; -"web_run_cancelled" = "ההרצה בוטלה."; -"web_run_error" = "שגיאה בזמן ההרצה."; -"web_run_dropped_fmt" = "… %d שורות קודמות מוסתרות"; -"web_sim_call_arguments_fmt" = "הקריאה אינה תואמת את הכותרת של %@. בדוק את הערכים בסוגריים."; -"web_sim_missing_return_fmt" = "%@ הסתיים בלי להחזיר ערך עם return."; -"web_sim_file_not_found_fmt" = "אין קובץ בשם %@."; -"web_sim_end_of_file_fmt" = "בקובץ %@ אין עוד שורות."; -"web_sim_null_value_fmt" = "%@ הוא null."; -"web_sim_unknown_variable_case_fmt" = "משתנה לא מוכר: %1$@. Java מבחינה בין אותיות גדולות לקטנות: האם התכוונת ל־%2$@?"; -"web_sim_written_file_fmt" = "%@ (נשמר)"; -"web_site_home" = "דף הבית"; -"web_site_imprint" = "פרטי המפרסם"; -"web_site_privacy" = "פרטיות"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "תכנות"; -"web_live_hide" = "הסתרת תכנות"; -"web_scale_canvas" = "גודל טקסט: תרשים"; -"web_scale_code" = "גודל טקסט: תכנות"; -"web_live_indent" = "הזחה"; -"web_live_indent_title" = "הזחת הקוד: ארבעה רווחים לכל רמה (השורות המסומנות, אחרת הכול)"; -"web_live_show" = "הצגת תכנות"; -"web_live_resize" = "שינוי רוחב אזור הקוד (לחיצה כפולה: איפוס)"; -"web_live_hint" = "הקוד גדל יחד עם התרשים. אפור = ממלא מקום: כתבו במפקח והטקסט יופיע כאן. לחצו על שורה כדי לבחור את הרכיב."; -"web_live_ph_selector" = "משתנה"; -"web_live_ph_code" = "הקוד שלך"; -"web_live_ph_end" = "סוף"; -"web_live_language" = "שפת תכנות"; -"web_live_java_class" = "כמחלקה"; -"web_live_java_class_hint" = "שם המחלקה = כותרת התרשים"; -"web_live_java_main" = "עם מתודת main"; -"web_settings_display" = "תצוגה"; -"web_live_swing" = "Java אמיתית (עם Swing)"; -"web_live_swing_hint" = "ג׳אווה אמיתית עם חלונות (CheerpJ). מורידה פעם אחת כ-40 MB בהרצה הראשונה."; -"web_live_swing_windows" = "חלונות ג׳אווה"; -"web_live_swing_hide" = "סגירת חלונות ג׳אווה"; -"web_live_swing_loading" = "טוען ג׳אווה (בפעם הראשונה כ-40 MB) …"; -"web_live_swing_compiling" = "מהדר …"; -"web_live_swing_running" = "התוכנית רצה."; -"web_live_swing_compile_failed" = "שגיאת הידור, ראה למעלה."; -"web_live_swing_failed" = "לא ניתן לטעון את ג׳אווה. בדוק את החיבור לאינטרנט."; -"web_live_hint_edit" = "הקלד כאן קוד Java והתרשים נבנה בעצמו. או עבוד בתרשים והקוד יגדל איתו. אפור = ממלא מקום, פשוט כתוב מעליו."; -"web_live_edit_label" = "קוד Java"; -"web_parse_line_fmt" = "שורה %d: %@"; -"web_parse_missing" = "עדיין חסר כאן: %@"; -"web_parse_extra" = "מיותר: %@"; -"web_parse_unclosed_string" = "חסר כאן ה־%@ הסוגר."; -"web_parse_else_without_if" = "ל־“else” הזה אין “if”."; -"web_parse_case_outside_switch" = "“case” ו־“default” שייכים בתוך “switch”."; -"web_parse_missing_do_while" = "אחרי “do { … }” עדיין חסר “while (תנאי);”."; -"web_parse_more_methods" = "כרגע נחשבת כאן רק מתודה אחת. צור תוכניות משנה נוספות בכרטיסיות נפרדות."; -"web_parse_missing_import" = "חסר בראש הקוד %@ בלי השורה הזו Java לא מכירה את Scanner."; -"web_parse_missing_scanner" = "חסר קודם %@ בלי השורה הזו אין Scanner."; -"web_parse_unknown_type" = "Java לא מכירה את סוג הנתונים הזה. האם התכוונת ל-%@?"; -"web_quickfix_insert_fmt" = "הצעה: להוסיף %@"; -"web_quickfix_replace_fmt" = "הצעה: %1$@ במקום %2$@"; -"web_parse_wrong_case" = "Java מבחינה בין אותיות גדולות לקטנות. הנכון הוא %@."; -"web_editor_title" = "תרשים"; -"web_editor_show" = "הצגת התרשים"; -"web_editor_hide" = "הסתרת התרשים"; -"web_keywords_title" = "מילות מפתח של קוד"; -"web_keywords_hint" = "if, while, for במקום שמות הרכיבים"; -"web_palette_compact" = "רכיבים תמיד בתצוגה מצומצמת"; -"web_palette_compact_hint" = "סמל עם שם קטן מתחתיו, אחרת רק כשהעמודה צרה"; -"web_about_version_fmt" = "גרסה %@"; -"web_about_software" = "תוכנה בשימוש"; -"web_about_software_text" = "עורך הקוד משתמש ב-CodeMirror וב-Lezer (רישיון MIT). עם תמיכה ב-Swing, VisuStruct טוען את CheerpJ של Leaning Technologies (רישיון Community) ואת javac מ-OpenJDK."; -"web_about_licenses" = "נוסחי הרישיונות"; -"web_live_run" = "הרצה"; -"web_live_run_title" = "הרצת התוכנית: הפלט והקלט מופיעים למטה"; -"web_live_run_finished" = "התוכנית הסתיימה."; -"web_live_run_stopped" = "נעצר."; -"web_console" = "מסוף"; -"web_console_hide" = "הסתרת המסוף"; -"web_console_resize" = "שינוי גובה המסוף"; -"web_diagram_tools" = "כלי התרשים"; -"web_files_title" = "קבצים"; -"web_files_show" = "הצגת קבצים"; -"web_files_hide" = "הסתרת קבצים"; -"web_files_resize" = "שינוי רוחב הקבצים"; -"web_files_new_folder" = "תיקייה חדשה"; -"web_files_switch" = "בחירת תיקייה אחרת"; -"web_files_delete" = "מחיקה"; -"web_files_in_browser" = "באחסון של דפדפן זה"; -"web_files_save_hint_fmt" = "השמירה מכניסה את התוכנית אל %@."; -"web_files_empty" = "עדיין לא נשמר דבר. בשמירה VisuStruct יוצר כאן תיקייה עם התאריך של היום."; -"web_files_reconnect_hint" = "אחרי טעינה מחדש הדפדפן שואל שוב אם VisuStruct רשאי להשתמש בתיקייה."; -"web_files_reconnect_fmt" = "פתיחת התיקייה „%@“"; -"web_files_connect_hint" = "בחרו תיקייה כסביבת עבודה. VisuStruct יוצר בה תיקייה לכל יום ושומר את התרשים ואת הקוד."; -"web_files_connect" = "בחירת תיקייה"; -"web_files_browser_hint" = "דפדפן זה אינו יכול לפתוח תיקיות במכשיר (למשל ב-iPad). הקבצים נשארים באחסון של הדפדפן."; -"web_files_browser" = "שמירה בדפדפן"; -"web_files_delete_confirm_fmt" = "למחוק את „%@“?"; -"web_files_folder_prompt" = "שם התיקייה החדשה:"; -"web_files_default_name" = "תוכנית"; -"web_files_saved_fmt" = "נשמר: %@"; -"web_files_create" = "יצירה"; -"web_learn_ludwig_tip" = "הטיפ של לודוויג"; -"web_game_title" = "משחק: אמת או שקר?"; -"web_game_intro" = "לודוויג מראה ערכים ותנאי. האם התנאי אמת (true) או שקר (false)? עשרה סבבים, כל פעם קשה יותר."; -"web_game_start" = "התחלת המשחק"; -"web_game_round_fmt" = "סבב %@ מתוך %@"; -"web_game_score_fmt" = "נקודות: %@"; -"web_game_true" = "אמת (true)"; -"web_game_false" = "שקר (false)"; -"web_game_right" = "נכון!"; -"web_game_wrong" = "לא בדיוק. כך מחשבים:"; -"web_game_next" = "הבא"; -"web_game_finish" = "תוצאה"; -"web_game_done_fmt" = "%@ מתוך %@ נכונות."; -"web_game_perfect" = "הכול נכון – לודוויג מתרשם מאוד!"; -"web_game_good" = "מצוין! עברו שוב על הטעויות ונסו שוב."; -"web_game_practice" = "תרגול עושה מושלם. קראו שוב את טבלת האמת ושחקו עוד סבב."; -"web_game_again" = "לשחק שוב"; -"web_game_wrong_short" = "לצערי לא נכון."; -"web_game_practice_short" = "תרגול מביא לשלמות. קרא שוב את ההסברים ושחק סיבוב נוסף."; -"web_game_clicks" = "לחיצות:"; -"web_game_nobody" = "אף אחד לא מאזין – שום דבר לא קורה."; -"web_game_event_fmt" = "לחיצה על „%@”: המאזין שומע ומריץ את הקוד שלו."; -"web_game_try" = "עכשיו נסה בעצמך את הכפתורים בחלון."; -"web_game_time_fmt" = "נותרו %@ שנ׳"; -"web_game_defused" = "✂️ נוטרלה! מצאת את הטעות."; -"web_game_boom_time" = "💥 בום! הזמן נגמר."; -"web_game_boom_wrong" = "💥 בום! זו הייתה השורה הלא נכונה."; -"web_game_boom_part" = "💥 בום! השורה נכונה, אבל הטעות בחלק אחר שלה."; -"web_game_boom_wrong_part" = "💥 בום! הטעות בשורה אחרת."; -"web_game_bomb_parts_hint" = "הקש בדיוק על החלק השגוי."; -"web_game_fix" = "השורה הנכונה:"; -"web_game_order_hint" = "הקש על השלבים בסדר הנכון."; -"web_debug_step" = "צעד"; -"web_debug_step_title" = "צעד: להריץ הוראה אחת ולעצור שוב"; -"web_debug_continue" = "להמשיך עד נקודת העצירה הבאה"; -"web_debug_paused_fmt" = "נעצר לפני שורה %d."; -"web_debug_gutter_title" = "לחיצה על מספר שורה מוסיפה או מסירה נקודת עצירה"; -"web_swap_to_code" = "תכנות גדול"; -"web_swap_to_editor" = "תרשים גדול"; -"web_editor_resize" = "שינוי רוחב התרשים"; -"web_palette_resize" = "שינוי רוחב הרכיבים"; -"web_palette_hide" = "הסתרת הרכיבים"; -"web_palette_show" = "הצגת הרכיבים"; -"web_code_scopes" = "בלוקי קוד צבעוניים"; -"web_code_scopes_hint" = "מחלקה, מתודה, לולאה, הסתעפות בתיבות משלהן"; -"web_pseudocode" = "פסאודו-קוד"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "שינוי שם המשתנה …"; -"web_rename_title" = "שינוי שם המשתנה"; -"web_rename_old" = "שם"; -"web_rename_new" = "שם חדש"; -"web_rename_hint" = "משנה כל מקום עם בדיוק הכתיב הזה (number אינו Number), בקוד ובתרשים המבנה. טקסט בתוך \\"…\\" והערות נשארים."; -"web_rename_count_fmt" = "מופיע %d פעמים."; -"web_rename_exists_fmt" = "„%@” כבר קיים: אחר כך שניהם יהיו משתנה אחד."; -"web_rename_invalid" = "שם מתחיל באות ומכיל רק אותיות, ספרות ו־_."; -"web_rename_keyword_fmt" = "„%@” היא מילת מפתח של Java."; -"web_rename_apply" = "שינוי שם"; -"web_rename_cancel" = "ביטול"; -`;export{e as default}; diff --git a/website/app/assets/hedy-lamarr-MFZMAlPQ.jpg b/website/app/assets/hedy-lamarr-MFZMAlPQ.jpg deleted file mode 100644 index e304bd1ea5eb654db50e2fa478ba0c1f0380aa0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40173 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 TY5~!oi!C$;v5o4KWX1p4xzFi$ diff --git a/website/app/assets/ike-nassi-D2w47gvX.jpg b/website/app/assets/ike-nassi-D2w47gvX.jpg deleted file mode 100644 index a0a78f3730fd90e8dd4f0bfab7c5bd2563c81dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19505 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 diff --git a/website/app/assets/index-BqSgHxq8.js b/website/app/assets/index-BqSgHxq8.js deleted file mode 100644 index 89271f35..00000000 --- a/website/app/assets/index-BqSgHxq8.js +++ /dev/null @@ -1,83699 +0,0 @@ -var E3=Object.defineProperty;var N3=(i,e,t)=>e in i?E3(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var y=(i,e,t)=>N3(i,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const r of s.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function t(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(a){if(a.ep)return;a.ep=!0;const s=t(a);fetch(a.href,s)}})();const F3="modulepreload",R3=function(i,e){return new URL(i,e).href},Fu={},ee=function(e,t,n){let a=Promise.resolve();if(t&&t.length>0){let r=function(m){return Promise.all(m.map(c=>Promise.resolve(c).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};const o=document.getElementsByTagName("link"),l=document.querySelector("meta[property=csp-nonce]"),u=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));a=r(t.map(m=>{if(m=R3(m,n),m in Fu)return;Fu[m]=!0;const c=m.endsWith(".css"),d=c?'[rel="stylesheet"]':"";if(!!n)for(let f=o.length-1;f>=0;f--){const b=o[f];if(b.href===m&&(!c||b.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${m}"]${d}`))return;const g=document.createElement("link");if(g.rel=c?"stylesheet":F3,c||(g.as="script"),g.crossOrigin="",g.href=m,u&&g.setAttribute("nonce",u),document.head.appendChild(g),c)return new Promise((f,b)=>{g.addEventListener("load",f),g.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${m}`)))})}))}function s(r){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=r,window.dispatchEvent(o),!o.defaultPrevented)throw r}return a.then(r=>{for(const o of r||[])o.status==="rejected"&&s(o.reason);return e().catch(s)})};var S=(i=>(i[i.anweisung=0]="anweisung",i[i.verzweigung=1]="verzweigung",i[i.fallauswahl=2]="fallauswahl",i[i.forSchleife=3]="forSchleife",i[i.whileSchleife=4]="whileSchleife",i[i.doUntilSchleife=5]="doUntilSchleife",i[i.endlosschleife=6]="endlosschleife",i[i.aussprung=7]="aussprung",i[i.aufruf=8]="aufruf",i[i.leerElement=9]="leerElement",i))(S||{});function J3(i){return i===3||i===4||i===5||i===6}function G3(i){return i===1||i===2}function je(i,e={}){return{type:i,zoomX:0,zoomY:0,textLines:[""],...e}}function H3(i){const e=i.textLines;if(!e.every(t=>t.trim()===""))switch(i.type){case S.forSchleife:return e.length<=1?e:[q3(e)];case S.verzweigung:return xa("if",e);case S.whileSchleife:return xa("while",e);case S.doUntilSchleife:return xa("while",V3(e));case S.fallauswahl:return xa("switch",e);default:return e}}function V3(i){if(i.length===0)return i;const e=i[0].trim(),t=e.toLowerCase(),n=[...i];if(t==="until")n[0]="";else if(t.startsWith("until "))n[0]=e.slice(6).trim();else if(t.startsWith("until("))n[0]=e.slice(5);else return i;return n}function Go(i){const e=new Set(["if","for","while","until","switch"]),t=["input:","output:","print:"],n=i.trim(),a=n.toLowerCase();for(const o of t){if(a===o)return{keyword:n,rest:""};if(a.startsWith(o+" "))return{keyword:n.slice(0,o.length),rest:n.slice(o.length).trim()}}const s=n.indexOf(" ");if(s<0)return;const r=n.slice(0,s);if(e.has(r.toLowerCase()))return{keyword:r,rest:n.slice(s+1).trim()}}function xa(i,e){if(e.length===0)return e;const t=e[0].trim(),n=t.toLowerCase();if(n===i||n.startsWith(i+" "))return e;const a=[...e];return a[0]=i+" "+t,a}function q3(i){let e=[...i];for(;e.length<3;)e.push("");e=e.slice(0,3);const t=a=>{let s=a.trim();for(;s.endsWith(";");)s=s.slice(0,-1).trim();return s},n=e.map(t).join("; ").trim();return n===""?"for":"for "+n}const Nh={[S.anweisung]:"Anweisung",[S.verzweigung]:"Bedingung",[S.fallauswahl]:"Fallauswahl",[S.forSchleife]:"for 0 < i < anzahl",[S.whileSchleife]:"while …",[S.doUntilSchleife]:"while …",[S.endlosschleife]:"endless",[S.aussprung]:"break",[S.aufruf]:"Aufruf()",[S.leerElement]:"ø"};function U3(i){Object.assign(Nh,i)}function vr(i){return H3(i)??[Nh[i.type]]}const Fh="visucode.de";function En(i=location.hostname){const e=/^(visustruct|visubot|visuobject)\.visucode\.de$/.exec(i.toLowerCase());return e?e[1]:void 0}function Q3(i){const e=Rh(i);return`https://${Fh}/${e==="de"?"":`${e}/`}`}function Rh(i){return i==="pt-PT"?"pt":i==="de"?"de":"en"}function $3(i,e,t,n=location){const a=Rh(e),s=t?`#${t}`:"";return En(n.hostname)===i&&/\/app\/(index\.html)?$/.test(n.pathname)?`../${a}/index.html${s}`:`https://${i}.${Fh}/${a}/${s}`}class Ne extends Error{}const zn=i=>structuredClone(i);function sn(){return je(S.anweisung,{textLines:["ø"]})}function Y3(){return{caption:"",elements:[sn()]}}function wr(i){if(i.type===S.leerElement)return!0;if(i.type===S.anweisung){const e=i.textLines;return e.length===0||e.length===1&&e[0]==="ø"}return!1}function gn(i,e){const t=st(i,e);return t!==void 0&&wr(t)}function oa(i,e){if(e.length===0)throw new Ne("Invalid element path.");const[t,...n]=e;if(t<0||t>=i.length)throw new Ne("Invalid element path.");if(n.length===0)return{list:i,index:t};const[a,...s]=n;if(s.length===0)throw new Ne("Invalid element path.");return oa(Jh(i[t],a),s)}function Jh(i,e){if(J3(i.type)){if(e!==0||!i.loopBody)throw new Ne("Invalid element path.");return i.loopBody}if(G3(i.type)){if(!i.cases||e<0||e>=i.cases.length)throw new Ne("Invalid element path.");return i.cases[e].elements}throw new Ne("Invalid element path.")}function bt(i,e){const{list:t,index:n}=oa(i.elements,e);return t[n]}function st(i,e){try{return bt(i,e)}catch{return}}function Wn(i,e,t){const n=zn(i),{list:a,index:s}=oa(n.elements,e);return a[s]=zn(t),n}function pn(i,e,t){const n=zn(bt(i,e));return n.textLines=t.length===0?[""]:t,Wn(i,e,n)}function va(i,e){return e.length===0?!1:e.length===1&&i.elements.length===1?!gn(i,e):st(i,e)!==void 0}function L1(i,e){const t=zn(i),{list:n,index:a}=oa(t.elements,e);if(e.length===1&&n.length===1){if(wr(n[0]))throw new Ne("The last root element cannot be deleted.");return n[0]=sn(),t}return n.splice(a,1),e.length>1&&n.length===0&&n.push(sn()),t}function wi(i,e,t,n){const a=zn(i);let s;if(e.length===0)s=a.elements;else{const r=e.slice(0,-1),o=e[e.length-1],{list:l,index:u}=oa(a.elements,r);s=Jh(l[u],o)}return s.splice(Math.min(Math.max(0,t),s.length),0,zn(n)),a}function Gh(i,e,t){if(t.length===0)throw new Ne("Invalid element path.");return wi(i,t.slice(0,-1),t[t.length-1],e)}function Ho(i,e,t){if(t.length===0)throw new Ne("Invalid element path.");return wi(i,t.slice(0,-1),t[t.length-1]+1,e)}function x0(i,e){return i.lengthe[n]===t)}function v0(i,e){if(e.length===0)return i;const t=e[e.length-1],n=e.slice(0,-1);if(i.length<=n.length||!n.every((r,o)=>i[o]===r))return i;const a=n.length;if(i[a]<=t)return i;const s=[...i];return s[a]-=1,s}const w0=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function K3(i,e,t){if(w0(e,t))return i;if(x0(e,t))throw new Ne("Invalid element path.");const n=bt(i,e),a=L1(i,e);return Gh(a,n,v0(t,e))}function X3(i,e,t){if(w0(e,t))return i;if(x0(e,t))throw new Ne("Invalid element path.");const n=bt(i,e),a=L1(i,e);return Ho(a,n,v0(t,e))}function eb(i,e,t){if(!gn(i,t))throw new Ne("Invalid element path.");if(w0(e,t))return i;if(x0(e,t))throw new Ne("Invalid element path.");const n=bt(i,e),a=L1(i,e);return Wn(a,v0(t,e),n)}function tb(i,e){const t=zn(bt(i,e)),n=t.cases;if(t.type!==S.fallauswahl||!n||n.length===0)throw new Ne("Invalid element path.");const a=n[n.length-1].name.toLowerCase()==="default",s=a?n.length-1:n.length,r=String(a?n.length:n.length+1);return n.splice(s,0,{name:r,elements:[sn()]}),{doc:Wn(i,e,t),path:[...e,s,0]}}function nb(i,e,t){const n=zn(bt(i,e)),a=n.cases;if(n.type!==S.fallauswahl||!a)throw new Ne("Invalid element path.");if(a.length<=2)throw new Ne("A switch needs at least two cases.");if(t<0||t>=a.length)throw new Ne("Invalid element path.");a.splice(t,1);const s=Math.min(t,a.length-1);return{doc:Wn(i,e,n),path:[...e,s,0]}}function Ru(i,e,t,n){const a=zn(bt(i,e)),s=a.cases;if(a.type!==S.fallauswahl||!s)throw new Ne("Invalid element path.");if(t<0||t>=s.length)throw new Ne("Invalid element path.");const r=n.trim();if(r==="")throw new Ne("Invalid element path.");return s[t].name=r,Wn(i,e,a)}function ib(i,e){var t;if(!(!i||i.length===0))for(let n=i.length;n>=1;n--){const a=i.slice(0,n);if(((t=st(e,a))==null?void 0:t.type)===S.fallauswahl)return a}}function ab(i,e){if(!(!i||i.length<=e.length))return i[e.length]}function Gr(i,e){if(e.elements.length!==0)return!i||!st(e,i)?[0]:i}const Hh=i=>i!==void 0&&/\s/.test(i);function Ss(i){const e=i.trim().toLowerCase();return e.startsWith("input:")?"input":e.startsWith("output:")||e.startsWith("print:")?"output":"statement"}function sb(i){const e=i.trim(),t=e.toLowerCase();return t.startsWith("input:")?e.slice(6).trim():t.startsWith("output:")?e.slice(7).trim():t.startsWith("print:")?e.slice(6).trim():i}function Ju(i,e){const t=e.trim();return t===""?`${i} `:`${i} ${t}`}function rb(i,e){const t=sb(e);switch(i){case"statement":return t;case"input":return Ju("input:",t);case"output":return Ju("output:",t)}}const ls=i=>Hh(i[0])?i.slice(1):i;function ob(i){const e=i.replace(/^\s+/,""),t=e.toLowerCase();return t.startsWith("input:")?ls(e.slice(6)):t.startsWith("output:")?ls(e.slice(7)):t.startsWith("print:")?ls(e.slice(6)):i}function Gu(i,e){const t=e.replace(/^\s+/,"");if(!t.toLowerCase().startsWith(i.toLowerCase()))return e;const n=t.slice(i.length);if(!(n===""||Hh(n[0])||n[0]==="("))return e;const a=ls(n);return a.startsWith("(")&&a.endsWith(")")&&a.length>=2?a.slice(1,-1):a}function Vh(i,e){if(i==="input:"||i==="output:")return ob(e);const t=Gu(i,e);if(i==="while"&&t===e){const n=Gu("until",e);if(n!==e)return n}return t}function lb(i,e){return e===""?`${i} `:`${i} ${e}`}function y0(i){return i.replace(/[“”„«»]/g,'"').replace(/[’‘‚´]/g,"'")}function Hr(i){const e=i.length===0?[""]:i.slice(0,3);for(;e.length<3;)e.push("");return e}function Hu(i){let e=y0(i);for(;;){const t=e.trim();if(!t.endsWith(";"))return e;e=t.slice(0,-1).trim()}}const la='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif';function ub(i,e){return`${e==="bold"?700:500} ${i}px ${la}`}const qh=(i,e,t)=>[...i].length*e*(t==="bold"?.68:.62);function mb(){if(typeof document>"u"||!document.body)return;const i="http://www.w3.org/2000/svg",e=document.createElementNS(i,"svg");e.setAttribute("aria-hidden","true"),e.setAttribute("width","0"),e.setAttribute("height","0"),e.style.cssText="position:absolute;left:-9999px;top:0;visibility:hidden;overflow:hidden";const t=document.createElementNS(i,"text");if(t.setAttribute("font-family",la),t.style.whiteSpace="pre",e.append(t),document.body.append(e),typeof t.getComputedTextLength!="function"||typeof t.getBBox!="function"){e.remove();return}if(t.textContent="Mg",t.setAttribute("font-size","20"),!(t.getComputedTextLength()>0)){e.remove();return}return t}let Vr;function Uh(){return Vr===void 0&&(Vr=mb()??null),Vr??void 0}function Qh(i,e,t){i.setAttribute("font-size",String(e)),i.setAttribute("font-weight",t==="bold"?"700":"500")}function Vu(i,e){const t=`${i}|${e}`;let n=qu.get(t);if(!n){const a=Uh();if(n={ascent:i*.95,descent:i*.24},a){Qh(a,i,e),a.setAttribute("y","0"),a.textContent="Mg";const s=a.getBBox();s.height>0&&(n={ascent:-s.y,descent:s.height+s.y})}qu.set(t,n)}return n}const qu=new Map;function cb(){const i=Uh();if(i){const n=new Map;return(a,s,r)=>{const o=`${s}|${r}|${a}`;let l=n.get(o);return l===void 0&&(Qh(i,s,r),i.textContent=a,l=a===""?0:i.getComputedTextLength(),n.size>2e3&&n.clear(),n.set(o,l)),l}}const e=typeof document<"u"?document.createElement("canvas").getContext("2d"):null;if(!e)return qh;const t=new Map;return(n,a,s)=>{const r=`${a}|${s}|${n}`;let o=t.get(r);return o===void 0&&(e.font=ub(a,s),o=e.measureText(n).width,t.size>2e3&&t.clear(),t.set(r,o)),o}}const $h={fontSize:15,lineHeight:20,charWidth:7,baseHeaderExtra:20,minSidePadding:42,cellTextInsetY:15,doUntilDoLabelTopInset:2,doUntilFooterTopInset:6,doUntilFooterBottomInset:8};function db(i){return{...$h,fontSize:14,lineHeight:21,charWidth:5.5*(14/12),baseHeaderExtra:21,minSidePadding:40}}const wa=i=>i===S.forSchleife||i===S.whileSchleife||i===S.doUntilSchleife||i===S.endlosschleife,gi=i=>i===S.fallauswahl||i===S.verzweigung;function ya(i,e,t,n=0){return{idPath:i,element:e,frame:t,headerBandHeight:n,topBandHeight:0,loopBodyLeadingInset:0,caseColumnFrames:[],children:[]}}function at(i){return{...i,frame:{...i.frame}}}class Yh{constructor(e=$h,t=qh){this.metrics=e,this.measure=t}layout(e,t={left:28,top:28}){const a=this.layoutList(e.elements,t.left,t.top,[]).map(l=>this.stretchLoopBodiesVertically(l));let s=0,r=0;const o=l=>{s=Math.max(s,l.frame.x+l.frame.width),r=Math.max(r,l.frame.y+l.frame.height),l.children.forEach(o)};return a.forEach(o),{canvasSize:{width:s+t.left,height:r+t.top},elements:a}}lineWidth(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"medium"))}lineWidthBold(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"bold"))}layoutList(e,t,n,a){let s=[],r=n;e.forEach((l,u)=>{const m=this.layoutElement(l,t,r,[...a,u]);s.push(m),r+=m.frame.height});const o=Math.max(0,...s.map(l=>l.frame.width));return o>0&&(s=s.map(l=>this.stretchNodeTreeToWidth(l,o))),s}stretchMultiwayNodeToWidth(e,t){const n=at(e);if(n.caseColumnFrames.length===0)return n;const a=n.caseColumnFrames.reduce((l,u)=>l+u.width,0);if(!(a>0))return n;const s=t/a;n.frame.width=t;let r=n.frame.x;const o=n.caseColumnFrames.map(l=>{const u=l.width*s,m={x:r,y:l.y,width:u,height:l.height};return r+=u,m});return n.caseColumnFrames=o,n.dividerX=o.length>0?o[o.length-1].x:n.frame.x+t,n.columns&&n.columns.length===o.length&&(n.columns=n.columns.map((l,u)=>{const m=o[u];return l.map(c=>{const d=at(c);return d.frame.x=m.x,d.frame.width=m.width,this.stretchDescendantsWidths(d,m.width)})}),n.children=n.columns.flat()),n}stretchLoopChildren(e,t){const n=this.effectiveLoopBodyLeading(e),a=Math.max(0,t-n);e.children=e.children.map(s=>{const r=at(s);return r.frame.x=e.frame.x+n,r.frame.width=a,this.stretchDescendantsWidths(r,a)})}stretchNodeTreeToWidth(e,t){const n=at(e);return n.frame.width>0?gi(n.element.type)&&n.caseColumnFrames.length>0?this.stretchMultiwayNodeToWidth(n,t):(n.frame.width=t,wa(n.element.type)?this.stretchLoopChildren(n,t):n.children=n.children.map(s=>this.stretchDescendantsWidths(s,t)),n):n}stretchDescendantsWidths(e,t){let n=at(e);return gi(n.element.type)?n=this.stretchNodeTreeToWidth(n,t):wa(n.element.type)?(n.frame.width=t,this.stretchLoopChildren(n,t)):(n.frame.width=t,n.children=n.children.map(a=>this.stretchDescendantsWidths(a,t))),n}stretchLoopBodiesVertically(e){const t=at(e);if(t.columns&&t.columns.length>0)return t.columns=t.columns.map(s=>s.map(r=>this.stretchLoopBodiesVertically(r))),t.children=t.columns.flat(),t;t.children=t.children.map(s=>this.stretchLoopBodiesVertically(s));const n=s=>s===S.anweisung||s===S.leerElement||s===S.aufruf||s===S.aussprung||wa(s);let a;switch(t.element.type){case S.forSchleife:case S.whileSchleife:case S.endlosschleife:{const s=t.element.type===S.endlosschleife?40:0;a=t.frame.y+t.frame.height-s;break}case S.doUntilSchleife:a=t.frame.y+t.frame.height-t.headerBandHeight;break}if(a!==void 0&&t.children.length>0){const s=t.children.length-1;let r=at(t.children[s]);const o=a-(r.frame.y+r.frame.height);o>.5&&n(r.element.type)&&(r.frame.height+=o,r=this.stretchLoopBodiesVertically(r),t.children=[...t.children.slice(0,s),r])}return t}headerHeight(e){const t=this.metrics,n=Math.max(1,e.textLines.length);if(e.type===S.doUntilSchleife)return t.doUntilFooterTopInset+n*t.lineHeight+t.doUntilFooterBottomInset+e.zoomY;let a;switch(e.type){case S.fallauswahl:a=40;break;case S.verzweigung:a=20;break;case S.forSchleife:case S.whileSchleife:case S.endlosschleife:a=t.baseHeaderExtra+4;break;default:a=14}return a+n*t.lineHeight+e.zoomY}doUntilBodyLeadingInset(){return Math.max(20,this.lineWidthBold("do")+12)}effectiveLoopBodyLeading(e){return e.element.type===S.doUntilSchleife?e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:this.doUntilBodyLeadingInset():20}horizontalPaddingInsideCell(e){return gi(e)?Math.max(100,this.metrics.minSidePadding*2.45):this.metrics.minSidePadding}minWidth(e){const t=e.textLines.length===0?0:Math.max(...e.textLines.map(s=>this.lineWidth(s)));let n=t+e.zoomX+this.horizontalPaddingInsideCell(e.type);if(e.type===S.aufruf){const s=Math.max(68,this.metrics.minSidePadding*1.7),r=Math.max(8,this.metrics.minSidePadding*.2);n=Math.max(n,t+e.zoomX+s+r)}const a=e.type===S.leerElement?76:e.type===S.aufruf?104:72;return Math.max(a,n)}layoutElement(e,t,n,a){if(gi(e.type))return this.layoutMultiway(e,t,n,a);if(wa(e.type))return this.layoutLoop(e,t,n,a);const s=this.headerHeight(e);return ya(a,e,{x:t,y:n,width:this.minWidth(e),height:s},s)}layoutLoop(e,t,n,a){const s=b=>b.reduce((x,v)=>x+v.frame.height,0),r=b=>Math.max(0,...b.map(x=>x.frame.width)),o=e.loopBody??[];if(e.type===S.doUntilSchleife){const b=this.doUntilBodyLeadingInset(),x=e.zoomY,v=this.headerHeight(e),w=this.layoutList(o,t+b,n+x,[...a,0]),z=Math.max(this.minWidth(e),r(w)+b),I=s(w)+v+x,T=Math.max(0,z-b),k=ya(a,e,{x:t,y:n,width:z,height:I},v);return k.topBandHeight=x,k.loopBodyLeadingInset=b,k.children=w.map(C=>{const P=at(C);return P.frame.x=t+b,P.frame.width=T,this.stretchDescendantsWidths(P,T)}),k}const l=20,u=this.headerHeight(e),m=e.type===S.endlosschleife?40:0,c=this.layoutList(o,t+l,n+u,[...a,0]),d=Math.max(this.minWidth(e),r(c)+l),h=u+m+s(c),g=Math.max(0,d-l),f=ya(a,e,{x:t,y:n,width:d,height:h},u);return f.children=c.map(b=>{const x=at(b);return x.frame.x=t+l,x.frame.width=g,this.stretchDescendantsWidths(x,g)}),f}layoutMultiway(e,t,n,a){const s=this.headerHeight(e),r=e.cases??[],o=Math.max(1,r.length),l=Math.max(this.minWidth(e)/o,132);let u=[],m=[],c=0,d=0;if(r.forEach((b,x)=>{const v=t+c,w=this.layoutList(b.elements,v,n+s,[...a,x]),z=Math.max(0,...w.map(k=>k.frame.width));let I;e.type===S.verzweigung&&o===2?I=Math.max(z,(x===0?"true":"false").length*this.metrics.charWidth+24):I=Math.max(l,z);const T=w.reduce((k,C)=>k+C.frame.height,0);d=Math.max(d,T),u.push({x:v,y:n+s,width:I,height:T}),m.push(w.map(k=>{const C=at(k);return C.frame.x=v,C.frame.width=I,this.stretchDescendantsWidths(C,I)})),c+=I}),e.type===S.verzweigung&&o===2&&u.length===2&&!r.some(b=>Vo(b.elements))){const b=Math.max(u[0].width,u[1].width),x=t,v=t+b,w=v-u[1].x;u[0]={...u[0],x,width:b},u[1]={...u[1],x:v,width:b},c=b*2,m[0]=m[0].map(z=>{const I=at(z);return I.frame.x=x,I.frame.width=b,this.stretchDescendantsWidths(I,b)}),m[1]=m[1].map(z=>{const I=qo(z,w);return I.frame.width=b,this.stretchDescendantsWidths(I,b)})}if(m.length>0){const b=hb(m,n+s);m=b.columns.map(x=>x.map(v=>this.stretchLoopBodiesVertically(v)));for(let x=0;x0?Math.max(...b.columnHeights):d}let h=Math.max(c,this.minWidth(e));if(c>.5&&h>c+.5){const b=h/c;let x=t;const v=[],w=[];u.forEach((z,I)=>{const T=z.width*b;w.push(m[I].map(k=>{const C=at(k);return C.frame.x=x,C.frame.width=T,this.stretchDescendantsWidths(C,T)})),v.push({x,y:z.y,width:T,height:z.height}),x+=T}),u=v,m=w,c=x-t,h=c}const g=u.length>0?u[u.length-1].width:c/o,f=ya(a,e,{x:t,y:n,width:h,height:s+d},s);return f.caseColumnFrames=u,f.dividerX=u.length>0?u[u.length-1].x:t+c-g,f.dividerYInset=e.type===S.fallauswahl?-20:0,f.columns=m,f.children=m.flat(),f}}function Vo(i){return i.some(e=>gi(e.type)||Vo(e.loopBody??[])||(e.cases??[]).some(t=>Vo(t.elements)))}function Kh(i,e){if(Math.abs(e)<=1e-4)return i;const t=at(i),n=a=>{const s=at(a);return s.frame.y+=e,Kh(s,e)};return t.columns?(t.columns=t.columns.map(a=>a.map(n)),t.children=t.columns.flat()):t.children=t.children.map(n),t}function qo(i,e){if(Math.abs(e)<=1e-4)return i;const t=at(i);return t.frame.x+=e,t.columns?(t.columns=t.columns.map(n=>n.map(a=>qo(a,e))),t.children=t.columns.flat()):t.children=t.children.map(n=>qo(n,e)),t}function hb(i,e){if(i.length<2)return{columns:i,columnHeights:i.map(u=>u.reduce((m,c)=>m+c.frame.height,0))};const t=.5,n=[e];for(const u of i)for(const m of u)n.push(m.frame.y+m.frame.height);const a=Math.max(...n);n.push(a),n.sort((u,m)=>u-m);let s=[];for(const u of n)s.length>0&&Math.abs(u-s[s.length-1])<=t||s.push(u);(s.length===0||Math.abs(s[0]-e)>t)&&s.unshift(e),s.length===0?s=[e,a]:s[s.length-1]{let c=Math.max(0,m);for(;c{let g=at(d);const f=s[c],b=d.frame.y+d.frame.height,x=h===u.length-1?s.length-1:r(b,c+1),v=s[x],w=f-g.frame.y;g.frame.y=f,g.frame.height=Math.max(0,v-f),g=Kh(g,w),m.push(g),c=x}),o.push(m),l.push(s[s.length-1]-e)}return{columns:o,columnHeights:l}}const gb=[{item:"anweisung",label:"Anweisung"},{item:"verzweigung",label:"Verzweigung"},{item:"fallauswahl",label:"Fallauswahl"},{item:"forZaehlSchleife",label:"For-Schleife"},{item:"whileSchleife",label:"While-Schleife"},{item:"doUntilSchleife",label:"Do-while-Schleife"},{item:"endlosschleife",label:"Endlosschleife"},{item:"aufruf",label:"Aufruf"},{item:"aussprung",label:"Aussprung"}];function qr(i){const e=sn;switch(i){case"anweisung":return je(S.anweisung);case"verzweigung":return je(S.verzweigung,{cases:[{name:"true",elements:[e()]},{name:"false",elements:[e()]}]});case"fallauswahl":return je(S.fallauswahl,{cases:[{name:"1",elements:[e()]},{name:"2",elements:[e()]},{name:"default",elements:[e()]}]});case"forZaehlSchleife":return je(S.forSchleife,{textLines:["","",""],loopBody:[e()]});case"whileSchleife":return je(S.whileSchleife,{loopBody:[e()]});case"doUntilSchleife":return je(S.doUntilSchleife,{loopBody:[e()]});case"endlosschleife":return je(S.endlosschleife,{loopBody:[e()]});case"aussprung":return je(S.aussprung);case"aufruf":return je(S.aufruf)}}function Ts(i){if(i==="")return"-1;";let e="";for(const t of i)e+=t.codePointAt(0)+";";return e}function Uo(i){const e=i.split(";").filter(n=>n!=="");if(e.length===1&&e[0]==="-1")return"";let t="";for(const n of e){if(!/^[+-]?\d+$/.test(n))continue;const a=Number(n);a!==-1&&(a<0||a>1114111||a>=55296&&a<=57343||(t+=String.fromCodePoint(a)))}return t}class Uu extends Error{}function z0(i){const e=new DOMParser().parseFromString(i,"application/xml");if(e.getElementsByTagName("parsererror").length>0)throw new Uu("Could not read XML.");const t=e.documentElement;if(!t||t.tagName!=="struktogramm")throw new Uu("Invalid XML: root element is not .");const n={caption:$u(t,"caption")??"",elements:$o(t)},a=$u(t,"fontfamily");a!==void 0&&(n.fontFamily=a);const s=yi(t,"fontsize");s!==void 0&&(n.fontSize=s);const r=yi(t,"fontstyle");return r!==void 0&&(n.fontStyle=r),t.getAttribute("pseudocode")==="true"&&(n.pseudocode=!0),n}function x1(i){const e=(n,a)=>a===void 0?"":` ${n}="${Xh(a)}"`;let t=` -`;t+=" -`;for(const n of i.elements)t+=Qo(n," ");return t+=` -`,t}function Qo(i,e){let t=`${e} -`;for(const n of i.textLines)t+=`${e} ${pb(Ts(n))} -`;if(i.loopBody){t+=`${e} -`;for(const n of i.loopBody)t+=Qo(n,e+" ");t+=`${e} -`}if(i.cases)for(const n of i.cases){t+=`${e} -`;for(const a of n.elements)t+=Qo(a,e+" ");t+=`${e} -`}return t+=`${e} -`,t}function Xh(i){return i.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function pb(i){return i.replace(/&/g,"&").replace(//g,">")}function Qu(i){return String(i.a<<24|i.r<<16|i.g<<8|i.b|0)}function us(i,e){return Array.from(i.children).filter(t=>t.tagName===e)}function $o(i){const e=[];for(const t of us(i,"strelem")){const n=fb(t);n&&e.push(n)}return e}function fb(i){const e=yi(i,"typ");if(e===void 0||S[e]===void 0)return;const t={type:e,zoomX:yi(i,"zx")??0,zoomY:yi(i,"zy")??0,textLines:us(i,"text").map(o=>Uo((o.textContent??"").trim()))},n=Yu(i.getAttribute("textcolor"));n&&(t.textColor=n);const a=Yu(i.getAttribute("bgcolor"));a&&(t.backgroundColor=a),t.textLines.length===0&&(t.textLines=[""]);const s=us(i,"schleifeninhalt")[0];if(s){const o=$o(s);o.length>0&&(t.loopBody=o)}const r=us(i,"fall").map(o=>({name:Uo(o.getAttribute("fallname")??""),elements:$o(o)}));return r.length>0&&(t.cases=r),t}function $u(i,e){const t=i.getAttribute(e);return t===null?void 0:Uo(t)}function yi(i,e){const t=i.getAttribute(e);if(!(t===null||!/^[+-]?\d+$/.test(t)))return Number(t)}function Yu(i){if(i===null||!/^[+-]?\d+$/.test(i))return;const e=Number(i);if(e<-2147483648||e>2147483647)return;const t=e>>>0;return{a:t>>>24&255,r:t>>>16&255,g:t>>>8&255,b:t&255}}const bb="http://www.w3.org/2000/svg",Fe={diagramLineWidth:2,outerFrameLineWidth:2,selectionLineWidth:3.5,canvasOuterMargin:16,cellTextInsetX:18,cellTextInsetY:15,multiHeaderFirstLineY:14,branchLabelInsetX:10,fallauswahlCaseLabelBand:26,callSideBarInset:14,callTextInsetFromSideBar:20,loopBodyLeadingInset:20};function Yo(i){switch(i){case S.forSchleife:case S.whileSchleife:case S.doUntilSchleife:case S.endlosschleife:return"loop";case S.verzweigung:case S.fallauswahl:return"if";default:return}}function Te(i,e={}){const t=document.createElementNS(bb,i);for(const[n,a]of Object.entries(e))t.setAttribute(n,String(a));return t}class eg{constructor(e,t){y(this,"usesSimulationHighlight",!1);y(this,"fillsSelection",!1);this.metrics=e,this.measure=t}get lineHeight(){return this.metrics.lineHeight}get fontSize(){return this.metrics.fontSize}render(e,t,n,a=Fe.canvasOuterMargin){const s=Te("svg",{width:t.width,height:t.height,viewBox:`0 0 ${t.width} ${t.height}`,"font-family":la,"font-size":this.fontSize,class:"diagram"});s.append(Te("rect",{x:0,y:0,width:t.width,height:t.height,fill:"#fafafa"}));const r=a;s.append(Te("rect",{x:r,y:r,width:e.canvasSize.width-2*r-1,height:e.canvasSize.height-2*r-1,fill:"none",stroke:"black","stroke-width":Fe.outerFrameLineWidth}));const o=Te("g");for(const l of e.elements)this.drawNode(l,o,n,{},void 0,"method");return s.append(o),s}line(e,t){e.append(Te("polyline",{points:t.map(n=>n.join(",")).join(" "),fill:"none",stroke:"black","stroke-width":Fe.diagramLineWidth,"stroke-linejoin":"miter"}))}strokeCellBorder(e,t,n){const a=t.x,s=t.y,r=t.x+t.width,o=t.y+t.height;if(!n.top&&!n.left&&!n.bottom&&!n.right){e.append(Te("rect",{x:a,y:s,width:t.width,height:t.height,fill:"none",stroke:"black","stroke-width":Fe.diagramLineWidth}));return}n.top||this.line(e,[[a,s],[r,s]]),n.right||this.line(e,[[r,s],[r,o]]),n.bottom||this.line(e,[[r,o],[a,o]]),n.left||this.line(e,[[a,o],[a,s]])}textWidth(e){const t=Go(e);return t?this.measure(t.keyword,this.fontSize,"bold")+(t.rest===""?0:this.measure(" "+t.rest,this.fontSize,"medium")):this.measure(e,this.fontSize,"medium")}drawKeywordLine(e,t,n,a){const s=Te("text",{x:n,y:a+Vu(this.fontSize,"medium").ascent,"font-weight":500});s.style.whiteSpace="pre";const r=Go(t);if(r){const o=Te("tspan",{"font-weight":700});if(o.textContent=r.keyword,s.append(o),r.rest!==""){const l=Te("tspan",{});l.textContent=" "+r.rest,s.append(l)}}else s.textContent=t;e.append(s)}drawLabel(e,t,n,a,s,r){const o=Vu(this.fontSize,s?"bold":"medium"),l=Te("text",{x:n,y:r==="top"?a+o.ascent:a-o.descent,"font-weight":s?700:500});l.style.whiteSpace="pre",l.textContent=t,e.append(l)}roofMetrics(e,t,n,a){const s=t.y+n,r=e.dividerYInset??0,o=12,l=Math.max(e.element.textLines.length,1)*this.lineHeight,u=t.y+Fe.multiHeaderFirstLineY;if(e.element.type===S.fallauswahl){const c=Math.max(Fe.fallauswahlCaseLabelBand,this.lineHeight+10),d=s-c,h=Math.min(s+r,d-8),g=Math.max(h,u+l+6);return{apex:{x:a,y:g},maxTextBottom:d-o,roofBottom:s}}const m={x:a,y:s+r};return{apex:m,maxTextBottom:m.y-o,roofBottom:s}}drawNode(e,t,n,a,s,r){var C;const o=e.frame,l=e.element,u=o.x+o.width,m=o.y+o.height,c=l.type===S.verzweigung||l.type===S.fallauswahl,d=c?e.headerBandHeight:0,h=n!==void 0&&Mn(e.idPath,n),g=vr(l),f=Te("g",{"data-path":e.idPath.join(",")});t.append(f);const b=this.usesSimulationHighlight,x=l.backgroundColor,v=x&&x.a>0?`rgba(${x.r}, ${x.g}, ${x.b}, ${x.a/255})`:"white",w=h&&(b||this.fillsSelection)?"rgba(199, 230, 255, 0.55)":v,z=Yo(l.type)??(l.type===S.leerElement?r:"method"),I=Te("rect",{x:o.x,y:o.y,width:o.width,height:o.height,fill:w});w==="white"&&z&&I.setAttribute("class",`ns-scope ns-scope-${z}`),f.append(I),this.strokeCellBorder(f,o,a);const T=Fe.callSideBarInset;if(l.type===S.aufruf?(this.line(f,[[o.x+T,o.y],[o.x+T,m]]),this.line(f,[[u-T,o.y],[u-T,m]])):l.type===S.aussprung&&this.line(f,[[o.x+T,o.y],[o.x,o.y+o.height/2],[o.x+T,m]]),c&&e.dividerX!==void 0){const P=e.dividerX,D=this.roofMetrics(e,o,d,P),B=Math.max(g.length,1)*this.lineHeight,j=o.y+Fe.multiHeaderFirstLineY;this.line(f,[[o.x,o.y],[D.apex.x,D.apex.y],[u,o.y]]),l.type===S.fallauswahl&&this.line(f,[[o.x,D.roofBottom],[u,D.roofBottom]]);let Z;j+B<=D.maxTextBottom?Z=j:Z=Math.max(o.y+2,D.maxTextBottom-(Math.max(g.length,1)-1)*this.lineHeight-this.lineHeight),g.forEach((F,U)=>{const ne=this.textWidth(F);let ge;if(l.type===S.verzweigung){const ie=o.x+Fe.cellTextInsetX,ue=u-ne-Fe.cellTextInsetX;ge=Math.min(Math.max(P-ne/2,ie),ue)}else ge=o.x+o.width/2-ne/2;this.drawKeywordLine(f,F,ge,Z+U*this.lineHeight)})}else if(l.type!==S.doUntilSchleife)if(l.type===S.anweisung||l.type===S.aufruf||l.type===S.aussprung){const P=Fe.cellTextInsetX;let D=o.x+P,B=u-P;l.type===S.aufruf?(D=o.x+T+Fe.callTextInsetFromSideBar,B=u-T-Fe.callTextInsetFromSideBar):l.type===S.aussprung&&(D=o.x+T+P);const j=Math.max(0,B-D);let Z=o.y+o.height/2-Math.max(1,g.length)*this.lineHeight/2;for(const F of g)this.drawKeywordLine(f,F,D+(j-this.textWidth(F))/2,Z),Z+=this.lineHeight}else{const P=Math.max(1,g.length)*this.lineHeight;let D=s===S.doUntilSchleife?o.y+o.height/2-P/2:o.y+Fe.cellTextInsetY;for(const B of g)this.drawKeywordLine(f,B,o.x+Fe.cellTextInsetX,D),D+=this.lineHeight}e.children.forEach((P,D)=>{const B=l.type===S.doUntilSchleife&&D===0?{top:!0,left:!0}:{};this.drawNode(P,t,n,B,l.type,z)});const k=Te("g");if(t.append(k),l.type===S.doUntilSchleife){const P=((C=e.children[0])==null?void 0:C.frame.x)??o.x+(e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:Fe.loopBodyLeadingInset);this.drawLabel(k,"do",o.x+4,o.y+this.metrics.doUntilDoLabelTopInset,!0,"top");const D=m-e.headerBandHeight;this.line(k,[[P,D],[u,D]]),this.line(k,[[P,o.y],[P,D]]);let B=D+this.metrics.doUntilFooterTopInset;for(const j of g)this.drawKeywordLine(k,j,o.x+Fe.cellTextInsetX,B),B+=this.lineHeight}if(c&&e.dividerX!==void 0&&e.caseColumnFrames.length>1){const P=this.roofMetrics(e,o,d,e.dividerX),D=P.apex;e.caseColumnFrames.forEach((j,Z)=>{if(Z>=e.caseColumnFrames.length-1)return;const F=j.x+j.width,U=xb(F,o,D),ne=Number.isFinite(U)?Math.min(Math.max(U,o.y),m):o.y;this.line(k,[[F,m],[F,ne]])});const B=l.cases;if(B&&B.length===e.caseColumnFrames.length){const j=l.type===S.fallauswahl?P.roofBottom-6:o.y+d-8,Z=Fe.branchLabelInsetX;if(l.type===S.verzweigung&&B.length===2){this.drawLabel(k,"true",o.x+Z,j,!0,"bottom");const F=e.caseColumnFrames[1],U=this.measure("false",this.fontSize,"bold");this.drawLabel(k,"false",F.x+F.width-Z-U,j,!0,"bottom")}else B.forEach((F,U)=>{const ne=e.caseColumnFrames[U],ge=["default","true","false"].includes(F.name.toLowerCase()),ie=this.measure(F.name,this.fontSize,ge?"bold":"medium");this.drawLabel(k,F.name,ne.x+ne.width/2-ie/2,j,ge,"bottom")})}}h&&k.append(Te("rect",{x:o.x,y:o.y,width:o.width,height:o.height,class:"selection-frame",fill:"none",stroke:b?"rgba(66, 140, 242, 0.78)":"rgba(0, 122, 255, 0.9)","stroke-width":Fe.selectionLineWidth}))}}function xb(i,e,t){const n=e.y;if(i<=t.x){const s=t.x-e.x;return Math.abs(s)<.5?t.y:n+(t.y-n)/s*(i-e.x)}const a=e.x+e.width-t.x;return Math.abs(a)<.5?t.y:t.y+(n-t.y)/a*(i-t.x)}function Mn(i,e){return i.length===e.length&&i.every((t,n)=>t===e[n])}function vb(i){const e=[],t=n=>{e.push(n),n.children.forEach(t)};return i.forEach(t),e}function _s(i){var e,t;return{...i,textLines:vr(i),loopBody:(e=i.loopBody)==null?void 0:e.map(_s),cases:(t=i.cases)==null?void 0:t.map(n=>({name:n.name,elements:n.elements.map(_s)}))}}const za=14;function Ku(i,e){var n;const t=i.frame;switch(i.element.type){case S.aufruf:return{x:t.x+za,y:t.y,width:Math.max(40,t.width-2*za),height:t.height};case S.aussprung:return{x:t.x+za,y:t.y,width:Math.max(40,t.width-za),height:t.height};case S.verzweigung:return{x:t.x,y:t.y,width:t.width,height:i.headerBandHeight};case S.fallauswahl:return{x:t.x,y:t.y,width:t.width,height:Math.max(e+8,i.headerBandHeight-I0(e))};case S.forSchleife:case S.whileSchleife:case S.endlosschleife:{const a=((n=i.children[0])==null?void 0:n.frame.y)??t.y+t.height;return{x:t.x,y:t.y,width:t.width,height:Math.max(e+8,a-t.y)}}case S.doUntilSchleife:return{x:t.x,y:t.y+t.height-i.headerBandHeight,width:t.width,height:i.headerBandHeight};default:return t}}function I0(i){return Math.max(26,i+10)}function wb(i,e,t,n){if(i.element.type!==S.fallauswahl)return;const a=i.frame.y+i.headerBandHeight;if(t>a||te>=r.x&&e<=r.x+r.width);return s>=0?s:void 0}function yb(i,e,t){const n=i.caseColumnFrames[e],a=I0(t);return{x:n.x,y:i.frame.y+i.headerBandHeight-a,width:n.width,height:a}}function zb(i){const e=i.zoom,t=document.createElement("div");t.className="inline-edit",i.center&&t.classList.add("inline-edit-center");const n=40,a=i.rect.y*e,s=Math.max(n,i.rect.height*e);if(Object.assign(t.style,{left:`${i.rect.x*e}px`,top:`${a-Math.max(0,(n-i.rect.height*e)/2)}px`,width:`${Math.max(i.fields.length>1?300:120,i.rect.width*e)}px`,minHeight:`${s}px`,fontFamily:la,fontSize:`${i.fontSize*e}px`,lineHeight:`${i.lineHeight*e}px`}),i.prefix){const c=document.createElement("span");c.className="inline-edit-prefix",c.textContent=i.prefix,t.append(c)}const r=[];i.fields.forEach((c,d)=>{const g=i.fields.length===1?document.createElement("textarea"):document.createElement("input");if(g.value=c.value,g.placeholder=c.placeholder,g.spellcheck=!1,g.setAttribute("autocomplete","off"),g.setAttribute("autocapitalize","off"),g.setAttribute("autocorrect","off"),g.setAttribute("aria-label",c.label),g instanceof HTMLTextAreaElement&&(g.rows=Math.max(1,c.value.split(` -`).length)),d>0){const f=document.createElement("span");f.className="inline-edit-sep",f.textContent=";",t.append(f)}t.append(g),r.push(g)});const o=c=>{c instanceof HTMLTextAreaElement&&(c.rows=Math.max(1,c.value.split(` -`).length),c.style.height="auto",c.style.height=`${c.scrollHeight}px`)};let l=!1;const u=c=>{l||(l=!0,t.remove(),i.onDone(c?r.map(d=>d.value):void 0))};for(const c of r)c.addEventListener("input",()=>{const d=y0(c.value);if(d!==c.value){const h=c.selectionStart;c.value=d,c.setSelectionRange(h,h)}o(c)}),c.addEventListener("keydown",d=>{d.stopPropagation(),d.key==="Escape"?(d.preventDefault(),u(!1)):d.key==="Enter"&&!(d.shiftKey&&i.fields.length===1)&&!d.isComposing&&(d.preventDefault(),u(!0))});t.addEventListener("focusout",c=>{const d=c.relatedTarget;d instanceof Node&&t.contains(d)||setTimeout(()=>{!l&&!t.contains(document.activeElement)&&u(!0)},0)});for(const c of["pointerdown","click","dblclick","contextmenu"])t.addEventListener(c,d=>d.stopPropagation());i.host.append(t),r.forEach(o);const m=r[0];return m.focus({preventScroll:!0}),m.select(),t.scrollIntoView({block:"nearest",inline:"nearest"}),{element:t,finish:u}}const Ib=[{code:"de",name:"Deutsch"},{code:"en",name:"English"},{code:"es",name:"Español"},{code:"fr",name:"Français"},{code:"it",name:"Italiano"},{code:"pl",name:"Polski"},{code:"tr",name:"Türkçe"},{code:"ko",name:"한국어"},{code:"ja",name:"日本語"},{code:"el",name:"Ελληνικά"},{code:"uk",name:"Українська"},{code:"ar",name:"العربية"},{code:"ru",name:"Русский"},{code:"he",name:"עברית"},{code:"nl",name:"Nederlands"},{code:"sv",name:"Svenska"},{code:"da",name:"Dansk"},{code:"nb",name:"Norsk bokmål"},{code:"zh-Hans",name:"中文(简体)"},{code:"zh-Hant",name:"中文(繁體)"},{code:"pt-PT",name:"Português"},{code:"java",name:"Java (Keywords)"}],tg=["de","en","pt-PT"],ng=Ib.filter(i=>tg.includes(i.code)),Xu=i=>tg.includes(i),kb=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-CxCno28C.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-BAutdlBb.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-Dk8F86qS.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-rqA-20hM.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-DBLIUcBd.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-LSTVB2Q5.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-ByPZS4RL.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-R-16GCrk.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-DXAPah1g.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-CkJEmEEP.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-BudCXCER.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-DSvkBkp-.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-BJ55WGVD.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-BYJK0mdR.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-CHv0OL9S.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-1QZ0wfvJ.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-M33nNbEe.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-BM86Igqt.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-UGog_aku.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-CaVEL1es.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings":()=>ee(()=>import("./Localizable-DqIDp_hh.js"),[],import.meta.url).then(i=>i.default)}),ig=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Java.strings":()=>ee(()=>import("./Java-Bpx1Vwvg.js"),[],import.meta.url).then(i=>i.default)}),Sb=Object.assign({"../i18n/ar.strings":()=>ee(()=>import("./ar-AgbDXJ1P.js"),[],import.meta.url).then(i=>i.default),"../i18n/da.strings":()=>ee(()=>import("./da-DCJmT-QF.js"),[],import.meta.url).then(i=>i.default),"../i18n/de.strings":()=>ee(()=>import("./de-Bw3STH-g.js"),[],import.meta.url).then(i=>i.default),"../i18n/el.strings":()=>ee(()=>import("./el-MJ37lw3F.js"),[],import.meta.url).then(i=>i.default),"../i18n/en.strings":()=>ee(()=>import("./en-gIMn8Pa3.js"),[],import.meta.url).then(i=>i.default),"../i18n/es.strings":()=>ee(()=>import("./es-or5dA7qu.js"),[],import.meta.url).then(i=>i.default),"../i18n/fr.strings":()=>ee(()=>import("./fr-D5Wy8Mcd.js"),[],import.meta.url).then(i=>i.default),"../i18n/he.strings":()=>ee(()=>import("./he-CYY5d1yw.js"),[],import.meta.url).then(i=>i.default),"../i18n/it.strings":()=>ee(()=>import("./it-B0g-vqj6.js"),[],import.meta.url).then(i=>i.default),"../i18n/ja.strings":()=>ee(()=>import("./ja-BNDo5HzU.js"),[],import.meta.url).then(i=>i.default),"../i18n/ko.strings":()=>ee(()=>import("./ko-D37jf4Vi.js"),[],import.meta.url).then(i=>i.default),"../i18n/nb.strings":()=>ee(()=>import("./nb-CsT7SL7q.js"),[],import.meta.url).then(i=>i.default),"../i18n/nl.strings":()=>ee(()=>import("./nl-CPGJmQ49.js"),[],import.meta.url).then(i=>i.default),"../i18n/pl.strings":()=>ee(()=>import("./pl-DDkdCN00.js"),[],import.meta.url).then(i=>i.default),"../i18n/pt-PT.strings":()=>ee(()=>import("./pt-PT-aHTlqnII.js"),[],import.meta.url).then(i=>i.default),"../i18n/ru.strings":()=>ee(()=>import("./ru-bst4sg1r.js"),[],import.meta.url).then(i=>i.default),"../i18n/sv.strings":()=>ee(()=>import("./sv-BZ9E37oq.js"),[],import.meta.url).then(i=>i.default),"../i18n/tr.strings":()=>ee(()=>import("./tr-C3W_u6Ol.js"),[],import.meta.url).then(i=>i.default),"../i18n/uk.strings":()=>ee(()=>import("./uk-D0HDyCtp.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hans.strings":()=>ee(()=>import("./zh-Hans-R_GuNvYU.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hant.strings":()=>ee(()=>import("./zh-Hant-DoE9BrE1.js"),[],import.meta.url).then(i=>i.default)});function ms(i,e){var t;return(t=Object.entries(i).find(([n])=>n.endsWith(e)))==null?void 0:t[1]}function ag(i){const e=new Map,t=i.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*\/\/.*$/gm,""),n=/"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;/g,a=s=>s.replace(/\\(u[0-9a-fA-F]{4}|.)/g,(r,o)=>o==="n"?` -`:o==="t"?" ":o.startsWith("u")&&o.length===5?String.fromCharCode(parseInt(o.slice(1),16)):o);for(const s of t.matchAll(n))e.set(a(s[1]),a(s[2]));return e}async function Ko(i){const e=i==="java"?ms(ig,"/Java.strings"):ms(kb,`/${i}.lproj/Localizable.strings`),t=ms(Sb,`/${i}.strings`),n=new Map;for(const a of[e,t])if(a)for(const[s,r]of ag(await a()))n.set(s,r);return n}let sg="en",rg=new Map,s1=new Map;const As="appLanguageCode",k0="visustruct.keywords";let Xo=new Map,S0=!1;const Tb=i=>i.startsWith("element_")||i.startsWith("canvas_stub_");function _b(){try{const i=new URLSearchParams(location.search).get("lang")==="java"||localStorage.getItem(As)==="java";return i&&(localStorage.setItem(As,"en"),localStorage.setItem(k0,"1")),i}catch{return!1}}function Ab(){try{return localStorage.getItem(k0)==="1"}catch{return!1}}async function og(i,e=!0){if(i&&Xo.size===0){s1.size===0&&(s1=await Ko("en"));const t=ms(ig,"/Java.strings");if(t)for(const[n,a]of ag(await t()))Tb(n)&&a!==s1.get(n)&&Xo.set(n,a)}if(S0=i,e)try{localStorage.setItem(k0,i?"1":"0")}catch{}}function jb(){return S0}function Cb(){if(_b())return"en";const i=new URLSearchParams(location.search).get("lang");if(i&&Xu(i))return i;try{const e=localStorage.getItem(As);if(e&&Xu(e))return e}catch{}for(const e of navigator.languages??[navigator.language]){const t=e.toLowerCase();if(t.startsWith("pt"))return"pt-PT";const n=ng.find(a=>a.code===t.split("-")[0]);if(n)return n.code}return"en"}async function lg(i,e=!0){if(s1.size===0&&(s1=await Ko("en")),rg=i==="en"?s1:await Ko(i),sg=i,e)try{localStorage.setItem(As,i)}catch{}const t=document.documentElement;t.lang=i==="java"?"en":i,t.dir=i==="ar"||i==="he"?"rtl":"ltr"}function In(){return sg}function p(i,...e){const t=(S0?Xo.get(i):void 0)??rg.get(i)??s1.get(i)??i;if(e.length===0)return t;let n=0;return t.replace(/%(?:(\d+)\$)?[@d]/g,(a,s)=>String(e[s?Number(s)-1:n++]??""))}const js=243,Db=244,ug=40,Ur=4,Bb=1;function T0(i){const e=i.length,t=js+(e&255)+(e>>8)&255,n=i.reduce((a,s)=>a+s,0)&255;return Uint8Array.from([js,t,e&255,e>>8,...i,n,Db])}function Pb(i,e,t){const n=Array.from(new TextEncoder().encode(i));return T0([ug,e,t&255,t>>8&255,n.length&255,n.length>>8,...n])}function Ob(i){if(i[0]!==ug||i.length<6)return;const e=new TextDecoder().decode(Uint8Array.from(i.slice(6))),t=/"ret"\s*:\s*([^}]*)\}/.exec(e);return t?{idx:i[2]|i[3]<<8,value:Zb(t[1].trim())}:void 0}function Mb(i){const e=[];for(;;){const t=i.indexOf(js);if(t<0){i.length=0;break}if(i.splice(0,t),i.length<4)break;const n=i[2]|i[3]<<8;if(i[1]!==(js+i[2]+i[3]&255)||n>4096){i.splice(0,1);continue}if(i.lengthArray.from({length:e},(t,n)=>i>>>8*n&255);function Nb(i){let e=0;for(let t=0;t>>0;return zi(e,4)}const Qr=(i,e)=>T0([1,0,mg,i,...zi(e.length,2),...e]);function Fb(i,e=Lb){const t=new TextEncoder().encode(i),n=(4-t.length%ii+ii)%ii,a=new Uint8Array(t.length+n).fill(10);a.set(t);const s=[Qr(1,[0,...zi(a.length,4),...Nb(a),...Array.from(new TextEncoder().encode(e))])],r=a.length-4;for(let o=0;oi.length===3&&i[0]===13,Jb=i=>i.length===7||i.some((e,t)=>e===mg&&i[t+1]===240),cg=()=>typeof navigator>"u"?void 0:navigator.serial,$r=()=>cg()!==void 0,Gb=(...i)=>`exec(${JSON.stringify(i.join("; "))})`,yr=(i,e=24)=>Gb("cyberpi.display.clear()",`cyberpi.display.show_label(${JSON.stringify(i)}, ${e}, 'center')`),dg=yr("VisuBot",32);class Hb{constructor(){y(this,"port");y(this,"writer");y(this,"reader");y(this,"loop");y(this,"rx",[]);y(this,"idx",1);y(this,"frameWaiters",[]);y(this,"waiting",new Map);y(this,"queue",Promise.resolve());y(this,"listeners",new Set);y(this,"error");y(this,"connecting",!1)}listen(e){return this.listeners.add(e),()=>this.listeners.delete(e)}changed(){for(const e of this.listeners)e()}get connected(){return this.writer!==void 0&&!this.connecting}async connect(){const e=cg();if(!e)throw new Error("Web Serial");const t=await e.requestPort();await t.open({baudRate:115200}),this.port=t,this.writer=t.writable.getWriter(),this.error=void 0,this.connecting=!0,this.changed(),this.loop=this.readLoop(),window.addEventListener("pagehide",()=>void this.disconnect(),{once:!0}),await new Promise(n=>setTimeout(n,3e3)),this.writer&&(this.rx.length=0,this.connecting=!1,this.changed(),await this.run(dg))}async disconnect(e){if(!this.port)return this.error=e,this.changed();if(!e&&this.writer&&!this.connecting)for(const r of["mbot2.EM_stop('ALL')","cyberpi.led.off()",yr("Bis bald!")])await this.send(r,Ur,2e3).catch(()=>{});const t=this.port,n=this.writer,a=this.reader,s=this.loop;this.port=this.writer=this.reader=this.loop=void 0,this.error=e,this.connecting=!1;for(const r of this.waiting.values())r.reject(new Error(e??"getrennt"));this.waiting.clear();try{await(a==null?void 0:a.cancel()),await s,await(n==null?void 0:n.close())}catch{}try{n==null||n.releaseLock(),await t.close()}catch(r){console.warn("[mBot2] Schließen",r.message)}this.changed()}run(e){return this.send(e,Ur,3e4).then(()=>{})}ask(e){return this.send(e,Bb,3e3)}async upload(e,t=()=>{}){if(this.port||await this.connect(),!this.writer)throw new Error(this.error??"nicht verbunden");const n=Fb(e),a=6+n.length+3;let s=0;const r=()=>t(++s,a),o=async()=>{await this.sendFrame(T0(Wb),Rb),r();for(const l of Eb)await this.send(l,Ur,3e3),r()};await o(),await o();for(const l of n)await this.sendFrame(l,Jb),r();s=a-3,await o(),await this.restart()}sendFrame(e,t){const n=this.queue.then(async()=>{for(let a=0;a<3;a++){if(!this.writer)throw new Error("nicht verbunden");let s=()=>{};const r=new Promise(u=>s=u),o={match:t,resolve:s};this.frameWaiters.push(o),await this.writer.write(e);const l=await Promise.race([r.then(()=>!0),new Promise(u=>setTimeout(()=>u(!1),3e3))]);if(this.frameWaiters=this.frameWaiters.filter(u=>u!==o),l)return}throw new Error("keine Antwort")});return this.queue=n.catch(()=>{}),n}async restart(){const e=this.port;await this.disconnect("restart"),this.error=void 0,await new Promise(t=>setTimeout(t,300)),await e.open({baudRate:115200}),await new Promise(t=>setTimeout(t,500)),await e.close(),this.changed()}send(e,t,n){const a=this.queue.then(()=>new Promise((s,r)=>{if(!this.writer)return r(new Error("nicht verbunden"));const o=this.idx;this.idx=this.idx%65535+1;const l=setTimeout(()=>{this.waiting.delete(o),r(new Error("keine Antwort"))},n);this.waiting.set(o,{resolve:u=>(clearTimeout(l),s(u)),reject:u=>(clearTimeout(l),r(u))}),this.writer.write(Pb(e,t,o)).catch(u=>{this.waiting.delete(o),r(u)})}));return this.queue=a.catch(()=>{}),a}async readLoop(){var e;for(;(e=this.port)!=null&&e.readable;){const t=this.port.readable.getReader();this.reader=t;try{for(;;){const{value:n,done:a}=await t.read();if(a)break;this.rx.push(...n);for(const s of Mb(this.rx)){const r=this.frameWaiters.findIndex(u=>u.match(s));r>=0&&this.frameWaiters.splice(r,1)[0].resolve();const o=Ob(s);if(!o)continue;const l=this.waiting.get(o.idx);this.waiting.delete(o.idx),l==null||l.resolve(o.value)}}}catch(n){const a=["BufferOverrunError","FramingError","BreakError","ParityError"].includes(n.name);console.warn("[mBot2] Lesefehler",n.name,n.message),!a&&this.port&&this.disconnect(n.message)}finally{t.releaseLock()}if(!this.writer)break}}}const be=new Hb,hg=5,Vb=i=>Number.isInteger(i)&&i>=0&&iString(Math.round(i*100)/100),el=6.5,v1=Math.PI*el,Ub={cm:{cm:1,one:"cm",many:"cm"},umdrehungen:{cm:v1,one:"Umdrehung",many:"Umdrehungen"},umdrehung:{cm:v1,one:"Umdrehung",many:"Umdrehungen"},rotations:{cm:v1,one:"rotation",many:"rotations"},rotation:{cm:v1,one:"rotation",many:"rotations"},rotações:{cm:v1,one:"rotação",many:"rotações"},rotação:{cm:v1,one:"rotação",many:"rotações"}},Qb=["cm","Umdrehungen","rotations"];function $b(i,e,t){const n=Ub[t.trim().toLowerCase()];if(!n)return;const a=e*n.cm,s=tl(i,[a]);if(n.cm===1)return s;const r=e===1?n.one:n.many;return{...s,label:`${Ie(e)} ${r} ${i==="forward"?"vorwärts":"rückwärts"} (${Ie(a)} cm)`}}const Li={forward:{args:1,defaults:[em],python:([i])=>`mbot2.straight(${Ie(i)})`,label:([i])=>`${Ie(i)} cm vorwärts`},backward:{args:1,defaults:[em],python:([i])=>`mbot2.straight(${Ie(-i)})`,label:([i])=>`${Ie(i)} cm rückwärts`},turnLeft:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${Ie(-i)})`,label:([i])=>`${Ie(i)}° nach links drehen`},turnRight:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${Ie(i)})`,label:([i])=>`${Ie(i)}° nach rechts drehen`},stop:{args:0,python:()=>'mbot2.EM_stop("ALL")',label:()=>"anhalten"},drive:{args:2,python:([i,e])=>`mbot2.drive_power(${Ie(i)}, ${Ie(-e)})`,label:([i,e])=>`Räder links ${Ie(i)} %, rechts ${Ie(e)} %`},setLed:{args:3,python:([i,e,t])=>`cyberpi.led.on(${Ie(i)}, ${Ie(e)}, ${Ie(t)})`,label:([i,e,t])=>`LEDs (${Ie(i)}, ${Ie(e)}, ${Ie(t)})`},ledOff:{args:0,python:()=>"cyberpi.led.off()",label:()=>"LEDs aus"},ledColor:{args:1,text:!0,choices:Object.keys(Cs),valid:([i])=>Vb(i),python:([i],e)=>`cyberpi.led.on(${Cs[e].join(", ")}, id=${i+1})`,label:([i],e)=>`LED ${i}: ${e}`},playTone:{args:2,python:([i,e])=>`cyberpi.audio.play_tone(${Ie(i)}, ${Ie(e/1e3)})`,label:([i,e])=>`Ton ${Ie(i)} Hz, ${Ie(e)} ms`},pause:{args:1,label:([i])=>`${Ie(i)} ms warten`},resetTimer:{args:0,python:()=>"cyberpi.timer.reset()",label:()=>"Stoppuhr auf 0"},emotion:{args:0,text:!0,choices:qb,python:(i,e)=>`cyberpi.emotion.${e}()`,label:(i,e)=>`Gefühl: ${e}`},showText:{args:0,text:!0,python:(i,e)=>yr(e),label:(i,e)=>`Bildschirm: ${e}`}},tm={red:{de:"rot",en:"red"},green:{de:"grün",en:"green"},blue:{de:"blau",en:"blue"},yellow:{de:"gelb",en:"yellow"},cyan:{de:"türkis",en:"cyan"},purple:{de:"lila",en:"purple"},white:{de:"weiß",en:"white"},black:{de:"schwarz",en:"black"}};let _0="en";function Yb(i){_0=i==="de"?"de":"en"}const Kb=()=>_0;function gg(i){const e=i.trim().toLowerCase(),t=tm[e]??Object.values(tm).find(n=>n.de===e);return t?t[_0]:e}const w1=i=>({python:`cyberpi.controller.is_press('${i}')`,simulated:!1}),Bt={getDistance:{python:"mbuild.ultrasonic2.get(1)",simulated:100},getLine:{python:"mbuild.quad_rgb_sensor.get_line_sta('all', 1)",simulated:0},isLineLeft:{python:"mbuild.quad_rgb_sensor.is_line('L1', 1)",simulated:!1},isLineRight:{python:"mbuild.quad_rgb_sensor.is_line('R1', 1)",simulated:!1},getColor:{python:"mbuild.quad_rgb_sensor.get_color_sta('L1', 1)",simulated:"white"},isButtonA:w1("a"),isButtonB:w1("b"),isJoystickUp:w1("up"),isJoystickDown:w1("down"),isJoystickLeft:w1("left"),isJoystickRight:w1("right"),getBrightness:{python:"cyberpi.get_bri()",simulated:50},getLoudness:{python:"cyberpi.get_loudness('maximum')",simulated:0},getPitch:{python:"cyberpi.get_pitch()",simulated:0},getRoll:{python:"cyberpi.get_roll()",simulated:0},isShaken:{python:"cyberpi.is_shake()",simulated:!1},getBattery:{python:"cyberpi.get_battery()",simulated:100},getTimer:{python:"cyberpi.timer.get()",simulated:0}};function Xb(i){const e=new Set;for(const t of i.matchAll(/\bmbot\s*\.\s*([A-Za-z_]\w*)\s*\(\s*\)/gu))t[1]in Bt&&e.add(t[1]);return[...e]}function ex(i){const e=/^mbot\s*\.\s*led\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)\s*\.\s*setColor\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(e)return{method:"ledColor",args:[e[1].trim(),e[2].trim()]};const t=/^mbot\s*\.\s*([A-Za-z_]\w*)\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(!t)return;const n=t[2].trim();return{method:t[1],args:n===""?[]:ix(n)}}function Ds(i,e){const t=Li[i];if(!t)return;const n=e.length===0&&t.defaults?t.defaults:e;if(n.length===t.args)return!t.valid||t.valid(n)?n:void 0}function tl(i,e,t=""){var a;const n=Li[i];return{method:i,args:e,python:(a=n.python)==null?void 0:a.call(n,e,t),waitMs:i==="pause"?Math.max(0,e[0]):void 0,label:n.label(e,t),...n.text?{text:t}:{}}}function pg(i){return i.map(e=>[e.method,...e.args.map(Ie),...e.text!==void 0?[JSON.stringify(e.text)]:[]].join(" "))}function tx(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const c=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let d=0;d{if(!(n in Bt))return t;const a=e(n);return typeof a=="string"?JSON.stringify(n==="getColor"?gg(a):a):String(a)}):i}function ix(i){const e=[];let t=0,n=!1,a=0;for(let s=0;s{const a=t==="turn"?((n+180)%360+360)%360-180:n;if(Math.abs(a)<1e-6)return[];const s=Math.round(Math.abs(a)*100)/100;return t==="drive"?[`${a>0?"forward":"backward"} ${s}`]:[a===-180?"turnRight 180":`${a>0?"turnRight":"turnLeft"} ${s}`]})}function fg(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const u=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let m=0;ma===i[s%t])){const a=pi(i.slice(0,t));return`${n} x ${t===1?a:`(${a})`}`}}return i.join(", ")}const bg=["cyberpi","screen","joystick","buttons","leds","lightSensor","microphone","shield","powerSwitch","motors","wheels","ultrasonic","lineSensor","caster","chassis"],ax=i=>bg.includes(i),sx=100;function xg(i){switch(i.kind){case"finished":return"Simulation finished.";case"infiniteLoopWithoutBody":return"Infinite loop has no body.";case"unsupportedStatement":return`Unsupported statement: ${i.text}`;case"invalidExpression":return`Invalid expression: ${i.text}`;case"unknownVariable":return i.similar?`Unknown variable: ${i.text}. Java is case-sensitive: did you mean ${i.similar}?`:`Unknown variable: ${i.text}`;case"divisionByZero":return"Division by zero.";case"wholeNumberExpected":return"Please enter a whole number.";case"numberExpected":return"Please enter a number.";case"booleanExpected":return"Please enter true or false.";case"subprogramNotFound":return`No open diagram is called ${i.text}. The call was skipped.`;case"callTooDeep":return"Too many nested calls. Does a subprogram call itself?";case"callArguments":return`The call does not match the header of ${i.text}. Check the values in the parentheses.`;case"missingReturn":return`${i.text} ended without returning a value with return.`;case"fileNotFound":return`There is no file called ${i.text}.`;case"endOfFile":return`The file ${i.text} has no more lines.`;case"nullValue":return`${i.text} is null.`;case"other":return i.text}}class He extends Error{constructor(e){super(xg(e)),this.notice=e}}const tt=i=>new He({kind:"unsupportedStatement",text:i}),G=i=>new He({kind:"invalidExpression",text:i}),_1=(i,e)=>{const t=e&&[...e.keys()].find(n=>n!==i&&n.toLowerCase()===i.toLowerCase());return new He(t?{kind:"unknownVariable",text:i,similar:t}:{kind:"unknownVariable",text:i})},rx=()=>new He({kind:"divisionByZero"}),Ps=new Map;function ox(i,e){Ps.set(i,e)}const vg=()=>[...Ps];function nm(i){return i instanceof He?i.notice:{kind:"other",text:i instanceof Error?i.message:String(i)}}function lx(i){if(i===0)return"0";if(!Number.isFinite(i))return Number.isNaN(i)?"nan":i>0?"inf":"-inf";const e=Math.floor(Math.log10(Math.abs(Number(i.toPrecision(12)))));if(e<-4||e>=12){const[n,a]=i.toExponential(11).split("e"),s=n.includes(".")?n.replace(/0+$/,"").replace(/\.$/,""):n,r=Number(a);return`${s}e${r<0?"-":"+"}${String(Math.abs(r)).padStart(2,"0")}`}const t=i.toFixed(Math.max(0,11-e));return t.includes(".")?t.replace(/0+$/,"").replace(/\.$/,""):t}function im(i){return Number.isFinite(i)&&Math.round(i)===i?i.toFixed(1):lx(i)}function _e(i){switch(i.kind){case"int":return String(i.value);case"double":return im(i.value);case"string":return i.value;case"boolean":return String(i.value);case"intArray":return"["+i.value.map(String).join(", ")+"]";case"doubleArray":return"["+i.value.map(im).join(", ")+"]";case"stringArray":return"["+i.value.join(", ")+"]";case"booleanArray":return"["+i.value.map(String).join(", ")+"]";case"grid":return"["+ux(i).join(", ")+"]";case"reader":return`${i.className}(${i.file})`;case"writer":return`PrintWriter(${i.file})`;case"null":return"null"}}function ux(i){return i.value.map(e=>"["+e.map(t=>_e(nl(i.elementType,t))).join(", ")+"]")}function nl(i,e){switch(i){case"int":return{kind:"int",value:e};case"double":return{kind:"double",value:e};case"string":return{kind:"string",value:e};case"boolean":return{kind:"boolean",value:e}}}function am(i){return i==="string"?"":i==="boolean"?!1:0}const Os=new WeakMap;let mx=0;function sm(i){const e=s=>({int:"I",double:"D",boolean:"Z",string:"Ljava.lang.String;"})[s],t=i.kind==="grid"?"[["+e(i.elementType):i.kind==="intArray"?"[I":i.kind==="doubleArray"?"[D":i.kind==="booleanArray"?"[Z":i.kind==="stringArray"?"[Ljava.lang.String;":void 0;if(!t||!("value"in i))return _e(i);const n=i.value;let a=Os.get(n);return a||(a=(Math.imul(++mx,2654435761)>>>0&2147483647).toString(16),Os.set(n,a)),t+"@"+a}function rm(i,e){const t=Os.get(i);t&&Os.set(e,t)}function cs(i){return i.kind==="intArray"||i.kind==="doubleArray"||i.kind==="stringArray"||i.kind==="booleanArray"||i.kind==="grid"}function cx(i){return i.kind==="int"||i.kind==="double"?i.value:NaN}const _t=i=>({kind:"int",value:i}),At=i=>({kind:"double",value:i}),A0=i=>i!==void 0&&/\s/u.test(i),Ms=i=>new RegExp("\\p{L}","u").test(i),fi=i=>new RegExp("\\p{N}","u").test(i);function Ii(i){const e=Array.from(i);return e.length===0||!(Ms(e[0])||e[0]==="_")?!1:e.every(t=>Ms(t)||fi(t)||t==="_")}function nn(i){switch(i.toLowerCase()){case"int":return"int";case"double":return"double";case"string":return"string";case"char":return"string";case"boolean":case"bool":return"boolean";default:return}}function om(i){return i.kind==="int"?"int":i.kind==="double"?"double":i.kind==="boolean"?"boolean":"string"}function ct(i){const e=Array.from(i);if(e.length===3&&e[0]==="'"&&e[2]==="'")return e[1];if(e.length<2||e[0]!=='"'||e[e.length-1]!=='"')return;const t=e.slice(1,-1).join("");if(/^(?:[^"\\]|\\.)*$/u.test(t))return t.replaceAll('\\"','"').replaceAll("\\n",` -`)}function lm(i){return i.replaceAll("(int)","").replaceAll("(double)","").trim()}function j0(i){const e=new Array(i.length).fill(!1);let t=0,n=!1,a=!1;return i.forEach((s,r)=>{if(n){a?a=!1:s==="\\"?a=!0:s==='"'&&(n=!1);return}switch(s){case'"':n=!0;break;case"(":case"[":t+=1;break;case")":case"]":t-=1;break;default:e[r]=t===0}}),e}function Zs(i,e){const t=Array.from(i),n=Array.from(e),a=j0(t),s=[];let r=[],o=0;for(;ot[o+m]===u)&&a.slice(o,l).every(Boolean)){s.push(r.join("").trim()),r=[],o=l;continue}r.push(t[o]),o+=1}return s.push(r.join("").trim()),s}function dx(i){const e=Array.from(i),t=j0(e);for(let n=0;n=","<=","==","!="].includes(o)&&(a=o)}if(a===void 0&&(e[n]==="<"||e[n]===">")&&(a=e[n]),a===void 0)continue;const s=e.slice(0,n).join("").trim(),r=e.slice(n+a.length).join("").trim();return{lhs:s,op:a,rhs:r}}}function zr(i,e){let t=0,n=!1,a=!1;for(let s=e;se.length||!t.every((r,o)=>e[a+o]===r))continue;const s=a+t.length-1;if(zr(e,s)===e.length-1)return{lhs:e.slice(0,a).join("").trim(),rhs:e.slice(s+1,-1).join("").trim()}}}function Ia(i){const e=i.trim();for(const t of["if","while","until","switch"]){if(!e.startsWith(t))continue;const n=e.slice(t.length);if(!(n===""||A0(n[0])||n[0]==="("))continue;let a=n.trim();const s=wg(a);return s!==void 0&&(a=s),a===""?"true":a}return e===""?"true":e}function A1(i){const e=i.trim(),t=e.indexOf("[");if(!e.endsWith("]")||t<0)return;const n=e.slice(0,t).trim();if(!Ii(n))return;const a=[];let s=t;for(;s2))return{arrayName:n,indexExpressions:a}}function gx(i){const e=i.trim();if(!e.endsWith(")"))return;const t=/^([A-Za-z_]\w*(?:\s*\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*([A-Za-z_]\w*)\s*\(/u.exec(e);if(!t)return;const n=Array.from(e),a=Array.from(t[0]).length-1;if(zr(n,a)!==n.length-1)return;const s=n.slice(a+1,-1).join("").trim();return{target:t[1],method:t[2],args:s===""?[]:Zs(s,",")}}function um(i){return Ii(i)||A1(i)!==void 0}function Yr(i){const e=[];let t="",n=!1,a=!1,s=0;for(const r of i){if(a){t+=r,a=!1;continue}if(r==="\\"){t+=r,a=!0;continue}if(r==='"'){n=!n,t+=r;continue}if(!n&&r==="("&&(s+=1),!n&&r===")"&&(s-=1),r==="+"&&!n&&s===0){e.push(t),t="";continue}t+=r}if(n)throw G(i);return e.push(t),e}function px(i){const e=[];let t=0,n="";for(const a of i){if(a==="{"&&(t+=1),a==="}"&&(t-=1),a===","&&t===0){e.push(n),n="";continue}n+=a}return n.trim()!==""&&e.push(n),e}function mm(i){const e=Array.from(i),t=[];let n=0;for(;n1)throw G(i)}else if(!fi(e[n]))break;n+=1}const o=e.slice(s,n).join("");if(o==="."||!/^[0-9]*\.?[0-9]*$/.test(o))throw G(i);t.push({t:"number",literal:o,value:Number(o)});continue}if(Ms(a)||a==="_"){const s=n;for(;n=0&&s=0&&o=0&&s|&&|\|\||^\s*!/u.test(e)}function r1(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function dm(i){const e=i.slice(0,3);for(;e.length<3;)e.push("");return e}function al(i){const e=i.map(t=>r1(t).trim());return e.length===1&&e[0].includes(";")?dm(e[0].split(";").map(t=>t.trim())):dm(e)}const pt=i=>i.frame?{frame:i.frame,callPath:i.callPath}:{};function Yt(i,e=[],t={}){const n=[],a=s=>n.push(t.frame?{...s,...t}:s);return i.forEach((s,r)=>{const o=[...e,r],l=s.textLines.join(" ").trim();switch(s.type){case S.anweisung:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"statement"});break;case S.verzweigung:a({path:o,text:l||"true",kind:"branch",cases:s.cases});break;case S.fallauswahl:a({path:o,text:l||"0",kind:"switchSelection",cases:s.cases});break;case S.forSchleife:a({path:o,text:l,kind:"forLoopStart",loopBody:s.loopBody,forParts:al(s.textLines)});break;case S.whileSchleife:a({path:o,text:l||"true",kind:"whileLoop",loopBody:s.loopBody});break;case S.doUntilSchleife:a({path:o,text:l||"true",kind:"doUntilLoop",loopBody:s.loopBody});break;case S.endlosschleife:a({path:o,text:l||"true",kind:"infiniteLoop",loopBody:s.loopBody});break;case S.aussprung:a({path:o,text:l,kind:"jump"});break;case S.aufruf:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"call"});break}}),n}function bx(i,e){const t=i.trim().replaceAll(",",".");switch(e){case"int":if(!/^[+-]?[0-9]+$/.test(t))throw new He({kind:"wholeNumberExpected"});return _t(Number(t));case"double":if(!/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?$/.test(t))throw new He({kind:"numberExpected"});return At(Number(t));case"string":return{kind:"string",value:i};case"boolean":switch(t.toLowerCase()){case"true":case"wahr":return{kind:"boolean",value:!0};case"false":case"falsch":return{kind:"boolean",value:!1};default:throw new He({kind:"booleanExpected"})}}}function hm(){return{stepIndex:0,variables:new Map,outputLines:[],isHalted:!1,files:new Map,robotActions:[]}}function xx(i,e){for(let t=0;tt===e.path[n])}function Tt(i){const e=/^(void|int|double|String|boolean)\s+([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(r1(i));if(!e)return;const t=[];if(e[3].trim()!=="")for(const n of e[3].split(",")){const a=/^(int|double|String|boolean|char)\s*((?:\[\s*\]){0,2})\s+([A-Za-z_]\w*)$/u.exec(n.trim());if(!a)return;const s=(a[2].match(/\[/gu)??[]).length;t.push({type:nn(a[1]),name:a[3],...s>0?{dims:s}:{}})}return{returnType:nn(e[1]),name:e[2],params:t}}function yg(i){const e=/^(?:(?:(int|double|String|boolean)\s+)?([A-Za-z_]\w*)\s*=\s*)?([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(r1(i));if(e)return{targetType:e[1]?nn(e[1]):void 0,target:e[2],name:e[3],args:e[4].trim()===""?[]:Zs(e[4],",")}}function Ls(i){var t,n;const e=r1(i);return((t=Tt(e))==null?void 0:t.name)??((n=yg(e))==null?void 0:n.name)??e.replace(/\(\s*\)$/u,"").trim()}class Wi{constructor(e,t=()=>{}){y(this,"steps");y(this,"state",hm());y(this,"nextFrame",1);y(this,"callDepth",0);y(this,"frames",new Map);y(this,"peeking",!1);y(this,"robotSensors",{});y(this,"pseudocode");y(this,"decided");y(this,"afterOutput",!1);this.resolveSubprogram=t,this.steps=Yt(e.elements),this.pseudocode=!!e.pseudocode}get currentStepPath(){const e=this.steps[this.state.stepIndex];return(e==null?void 0:e.callPath)??(e==null?void 0:e.path)}get canStep(){return!this.state.isHalted&&!this.state.inputRequest&&this.state.stepIndex ${_e(n)}`}catch(n){this.state.inputErrorNotice=nm(n);return}this.state.inputRequest=void 0,this.state.inputErrorNotice=void 0,this.state.stepIndex+=1,this.state.notice=this.finishedIfAtEnd()}}provideDecision(e){var s;if(((s=this.state.inputRequest)==null?void 0:s.valueType)==="string")return this.state.inputRequest=void 0,this.decided=e.trim(),this.step();const t=e.trim().toLowerCase(),n=["true","wahr","ja","yes","sim","verdadeiro"].includes(t),a=["false","falsch","nein","no","não","nao","falso"].includes(t);if(!n&&!a){this.state.inputErrorNotice={kind:"booleanExpected"};return}this.state.inputRequest=void 0,this.state.inputErrorNotice=void 0,this.decided=n,this.step()}condition(e){if(!this.pseudocode)return this.evaluateBool(e);const t=this.decided;if(typeof t=="boolean")return this.decided=void 0,t;this.state.inputRequest={variableName:"",valueType:"boolean",prompt:`${e} (true/false)`,decision:!0},this.state.inputErrorNotice=void 0,this.state.notice=void 0}finishedIfAtEnd(){return this.state.stepIndex>=this.steps.length?{kind:"finished"}:void 0}splice(e){this.steps.splice(this.state.stepIndex,1,...e)}noticeAfterEntering(e){return e.length>0?void 0:this.finishedIfAtEnd()}executeBranch(e){const t=e.cases;if(!t||t.length<2)throw tt(e.text);const n=Ia(e.text),a=this.condition(n);if(a===void 0)return;const s=a?0:1,r=Yt(t[s].elements,[...e.path,s],pt(e));this.splice(r),this.state.lastTrace=`${n} -> ${a}`,this.state.notice=this.noticeAfterEntering(r)}executeSwitchSelection(e){const t=e.cases;if(!t||t.length===0)throw tt(e.text);const n=Ia(e.text);let a;if(this.pseudocode){const r=this.decided;if(typeof r!="string"){const l=t.map(u=>u.name).join(" / ");this.state.inputRequest={variableName:"",valueType:"string",prompt:`${n} (${l})`,decision:!0},this.state.notice=void 0;return}this.decided=void 0;const o=t.findIndex(l=>l.name.trim().toLowerCase()===r.toLowerCase());a=o>=0?o:t.length-1}else a=xx(this.evaluateSwitchSelector(n),t)??t.length-1;const s=Yt(t[a].elements,[...e.path,a],pt(e));this.splice(s),this.state.lastTrace=`${n} -> ${t[a].name}`,this.state.notice=this.noticeAfterEntering(s)}executeForLoopStart(e){if(this.pseudocode)return this.splice([{...e,kind:"whileLoop"}]);const t=al(e.forParts??[e.text]);t[0]!==""&&this.executeStatement(t[0]),this.splice([{...pt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}executeForLoopCondition(e){const t=al(e.forParts??[e.text]),n=t[1]===""?"true":t[1],a=this.condition(n);if(a!==void 0)if(this.state.lastTrace=`${n} -> ${a}`,a){const s=Yt(e.loopBody??[],[...e.path,0],pt(e));this.splice([...s,{...pt(e),path:e.path,text:t[2],kind:"forLoopIncrement",loopBody:e.loopBody,forParts:t},{...pt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}executeForLoopIncrement(e){const t=e.text.trim();t!==""&&this.executeIncrement(t),this.splice([])}executeWhileLoop(e){const t=Ia(e.text),n=this.condition(t);if(n!==void 0)if(this.state.lastTrace=`${t} -> ${n}`,n){const a=Yt(e.loopBody??[],[...e.path,0],pt(e));this.splice([...a,{...pt(e),path:e.path,text:e.text,kind:"whileLoop",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(a)}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterDoUntilLoop(e){const t=Yt(e.loopBody??[],[...e.path,0],pt(e));this.splice([...t,{...pt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(t)}executeDoUntilCondition(e){const t=Ia(e.text),n=this.condition(t);if(n!==void 0)if(this.state.lastTrace=`${t} -> ${n}`,n){const a=Yt(e.loopBody??[],[...e.path,0],pt(e));this.splice([...a,{...pt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterInfiniteLoop(e){const t=Yt(e.loopBody??[],[...e.path,0],pt(e));this.splice([...t,{...pt(e),path:e.path,text:e.text,kind:"infiniteLoop",loopBody:e.loopBody}]),this.state.lastTrace="true -> true",this.state.notice=t.length>0?void 0:{kind:"infiniteLoopWithoutBody"}}executeJump(e){const t=e.frame??0,n=o=>o.lengthl===e.path[u]);let a=this.steps.length,s="end";for(let o=this.state.stepIndex+1;o ${s}`,s==="return"&&this.finishFrame(r),this.state.notice=this.finishedIfAtEnd()}executeCall(e){const t=e.text,n=this.resolveSubprogram(Ls(t));if(!n){this.splice([]),this.state.lastTrace=`${t} -> ?`,this.state.notice={kind:"subprogramNotFound",text:t},this.state.stepIndex>=this.steps.length&&(this.state.notice={kind:"finished"});return}const a=yg(t),s=Tt(n.caption);if(s?((a==null?void 0:a.args.length)??0)!==s.params.length||(a==null?void 0:a.target)!==void 0&&!s.returnType:a!==void 0&&(a.args.length>0||a.target!==void 0))throw new He({kind:"callArguments",text:(s==null?void 0:s.name)??Ls(t)});if(this.callDepth>=sx)throw new He({kind:"callTooDeep"});const o=new Map,l=[];s==null||s.params.forEach((d,h)=>{const g=a.args[h].trim();if(!d.dims){o.set(d.name,this.evaluateExpression(g,d.type));return}const f=this.state.variables.get(g);if(!f)throw/^[A-Za-z_]\w*$/u.test(g)?_1(g,this.state.variables):G(g);if(!(d.dims===1?f.kind===`${d.type}Array`:f.kind==="grid"&&f.elementType===d.type))throw G(g);o.set(d.name,f),l.push({param:d.name,callerName:g})}),this.callDepth+=1;const u={frame:this.nextFrame++,callPath:e.callPath??e.path};s&&(this.frames.set(u.frame,{saved:this.state.variables,header:s,call:a,references:l}),this.state.variables=o);const m=Yt(n.elements,[],u);this.splice([...m,{...u,path:e.path,text:t,kind:"callEnd"}]);const c=s==null?void 0:s.params.map((d,h)=>`${d.name} = ${d.dims?a.args[h].trim():_e(o.get(d.name))}`).join(", ");this.state.lastTrace=c?`${t} -> ${c}`:`${t} -> call`}executeCallEnd(e){this.callDepth-=1,this.splice([]),this.state.lastTrace=`${e.text} -> return`,this.finishFrame(e),this.state.notice=this.finishedIfAtEnd()}executeReturn(e){const t=e.frame??0,n=r1(e.text).slice(6).trim(),a=this.frames.get(t);if(a&&n!==""){if(!a.header.returnType)throw G(e.text);a.returnValue=this.evaluateExpression(n,a.header.returnType)}const s=a!=null&&a.returnValue?`${e.text} -> ${_e(a.returnValue)}`:`${e.text} -> return`;if(t===0){this.steps.splice(this.state.stepIndex),this.state.lastTrace=s,this.state.notice={kind:"finished"};return}let r=this.state.stepIndex+1;for(;r0?new Map(t.saved):t.saved;for(const m of t.references){const c=this.state.variables.get(m.param);c&&n.set(m.callerName,c)}this.state.variables=n;const a=t.returnValue;if(t.header.returnType&&!a)throw new He({kind:"missingReturn",text:t.header.name});const s=(l=t.call)==null?void 0:l.target;if(!s||!a)return;let r=(u=t.call)==null?void 0:u.targetType;if(!r)try{r=this.inferTargetValueType(s)}catch{r=t.header.returnType}const o=r==="double"&&a.kind==="int"?At(a.value):r==="string"?{kind:"string",value:_e(a)}:a;if(om(o)!==r)throw G(e.text);this.assignValue(o,s),this.state.lastTrace=`${s} = ${e.text.slice(e.text.indexOf("=")+1).trim()} -> ${_e(o)}`}executeStatement(e){const t=this.state,n=e.trim(),a=n.toLowerCase(),s=this.afterOutput;if(this.afterOutput=!1,a.startsWith("input:")){t.inputRequest=this.parseInputRequest(n,s),t.outputLineOpen=!1,t.inputErrorNotice=void 0;return}const r=/^System\s*\.\s*out\s*\.\s*(println|print)\s*\(([\s\S]*)\)\s*;?$/u.exec(n);if(a.startsWith("output:")||a.startsWith("print:")||r){const v=r?r[2]:n.slice(a.startsWith("output:")?7:6),w=this.peek(()=>this.renderOutputExpression(v)),z=v.trim()===""?"":this.evaluateOutputExpression(v),I=(r==null?void 0:r[1])==="print",T=I&&z.endsWith(` -`),[k,...C]=(T?z.slice(0,-1):z).split(` -`);t.outputLineOpen&&t.outputLines.length?t.outputLines[t.outputLines.length-1]+=k:t.outputLines.push(k),t.outputLines.push(...C),t.outputLineOpen=I&&!T,this.afterOutput=!0,t.lastTrace=`${w} -> ${z}`;return}const o=ex(n);if(o){this.executeMBotCommand(o.method,o.args,n);return}if(this.executeFileStatement(n))return;if(n.endsWith("++")||n.endsWith("--")||n.includes("+=")||n.includes("-=")){this.executeIncrement(n);return}const l=/^(?:final\s+)?([A-Za-z]+)\s+([A-Za-z_]\w*(?:\s*,\s*[A-Za-z_]\w*)*)$/u.exec(r1(n).trim()),u=l?nn(l[1]):void 0;if(l&&u){const v=l[2].split(",").map(w=>w.trim());for(const w of v)t.variables.set(w,nl(u,am(u)));t.lastTrace=v.map(w=>`${w} = ${_e(t.variables.get(w))}`).join(", ");return}const m=n.indexOf("=");if(m<0)throw tt(n);const c=n.slice(0,m).trim(),d=n.slice(m+1),h=this.parseArrayDeclaration(c,d);if(h){t.variables.set(h.name,h.value),t.lastTrace=`${h.name} = new ${h.typeName}[${h.count}]`;return}const g=this.parseAssignmentTarget(c);let f;try{f=this.peek(()=>this.renderNumericExpression(d))}catch{f=d.trim()}let b=g.valueType;if(!b)try{b=this.inferTargetValueType(g.variableName)}catch{b="int"}const x=this.evaluateExpression(d,b);this.assignValue(x,g.variableName),t.lastTrace=`${g.variableName} = ${f} -> ${_e(x)}`}executeMBotCommand(e,t,n){var r;if((r=Li[e])!=null&&r.text){const o=Li[e];if(t.length!==o.args+1)throw G(n);const l=Ds(e,t.slice(0,-1).map(c=>this.evaluateDouble(c)));if(!l)throw G(n);const u=tl(e,l,this.evaluateOutputExpression(t[t.length-1])),m=o.choices;if(m&&!m.includes(u.text??""))throw G(`${n} (${m.join(", ")})`);this.state.robotActions.push(u),this.state.lastTrace=`${n} -> ${u.label}`;return}if((e==="forward"||e==="backward")&&t.length===2){const o=this.evaluateOutputExpression(t[1]),l=$b(e,this.evaluateDouble(t[0]),o);if(!l)throw G(`${n} (${Qb.map(u=>`"${u}"`).join(", ")})`);this.state.robotActions.push(l),this.state.lastTrace=`${n} -> ${l.label}`;return}const a=Ds(e,t.map(o=>this.evaluateDouble(o)));if(!a)throw G(n);const s=tl(e,a);this.state.robotActions.push(s),this.state.lastTrace=`${n} -> ${s.label}`}executeFileStatement(e){const t=this.state,n=r1(e).trim(),a=/^(?:(Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*new\s+(Scanner|BufferedReader|PrintWriter)\s*\(([\s\S]*)\)$/u.exec(n);if(a){const[,m,c,d,h]=a;if(m&&m!==d)throw G(n);const g=d==="Scanner"?/^new\s+File\s*\(([\s\S]+)\)$/u.exec(h.trim()):d==="BufferedReader"?/^new\s+FileReader\s*\(([\s\S]+)\)$/u.exec(h.trim()):/^(?:new\s+(?:File|FileWriter)\s*\(([\s\S]+)\)|([\s\S]+))$/u.exec(h.trim());if(!g)throw tt(n);const f=this.fileNameValue(g[1]??g[2]);if(d==="PrintWriter")t.variables.set(c,{kind:"writer",file:f,text:""});else{const x=this.fileContent(f).split(/\r?\n/u);x[x.length-1]===""&&x.pop(),t.variables.set(c,{kind:"reader",className:d,file:f,lines:x,next:0})}return t.lastTrace=`${c} = new ${d}(${f})`,!0}const s=/^Files\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(([^()]+)\)\s*,([\s\S]+)\)$/u.exec(n);if(s){const m=this.fileNameValue(s[1]),c=this.evaluateOutputExpression(s[2]);return t.files.set(m,c),t.lastTrace=`${m} ← ${JSON.stringify(c)}`,!0}const r=/^([A-Za-z_]\w*)\s*\.\s*(println|print|close)\s*\(([\s\S]*)\)$/u.exec(n),o=r&&t.variables.get(r[1]);if(!r||!o)return!1;if(o.kind==="null")throw new He({kind:"nullValue",text:r[1]});if(o.kind==="reader"&&r[2]==="close")return t.lastTrace=`${r[1]}.close()`,!0;if(o.kind!=="writer")return!1;if(r[2]==="close")return t.files.set(o.file,o.text),t.lastTrace=`${o.file} ← ${JSON.stringify(o.text)}`,!0;const l=r[3].trim()===""?"":this.evaluateOutputExpression(r[3]),u=r[2]==="println"?l+` -`:l;return t.variables.set(r[1],{...o,text:o.text+u}),t.lastTrace=`${r[1]}.${r[2]}(${JSON.stringify(l)})`,!0}fileNameValue(e){const t=e.trim(),n=ct(t);if(n!==void 0)return n;const a=this.evaluateReference(t);if((a==null?void 0:a.kind)==="string")return a.value;throw G(t)}fileContent(e){const t=this.state.files.get(e)??Ps.get(e);if(t===void 0)throw new He({kind:"fileNotFound",text:e});return t}readerMethod(e,t,n,a){if(n.args.length)throw G(a);const s=t.next0?"+":"-";if(r.kind==="int"){t.set(s,_t(r.value+a)),this.state.lastTrace=`${s} = ${r.value} ${o} 1 -> ${r.value+a}`;return}if(r.kind==="double"){const l=r.value+a;t.set(s,At(l)),this.state.lastTrace=`${s} = ${_e(r)} ${o} 1 -> ${_e(At(l))}`;return}throw tt(e)}for(const[n,a]of[["+=",1],["-=",-1]]){const s=e.indexOf(n);if(s<0)continue;const r=e.slice(0,s).trim(),o=e.slice(s+2),l=t.get(r);if(!Ii(r)||!l)throw tt(e);const u=a>0?"+":"-";if(l.kind==="int"){const m=this.evaluateInt(o),c=l.value+a*m;t.set(r,_t(c)),this.state.lastTrace=`${r} = ${l.value} ${u} ${m} -> ${c}`;return}if(l.kind==="double"){const m=this.evaluateDouble(o),c=l.value+a*m;t.set(r,At(c)),this.state.lastTrace=`${r} = ${_e(l)} ${u} ${_e(At(m))} -> ${_e(At(c))}`;return}throw tt(e)}this.executeStatement(e)}parseAssignmentTarget(e){if(A1(e))return{variableName:e.trim()};const t=e.split(/\s+/u).filter(Boolean);let n,a;if(t.length===1)n=t[0];else if(t.length===2&&nn(t[0]))n=t[1],a=nn(t[0]);else if(t.length===3&&t[0]==="const"&&nn(t[1]))n=t[2],a=nn(t[1]);else throw tt(e);if(!um(n))throw tt(e);return{variableName:n,valueType:a}}parseInputRequest(e,t=!1){const n=e.slice(6).trim(),a=/^(\S+)(?:\s+(\S+))?(?:\s+([\s\S]*))?$/u.exec(n);if(!a)throw tt(e);const s=[a[1],a[2],a[3]].filter(c=>c!==void 0);let r,o,l;const u=nn(s[0]);if(s.length>=2&&u?(r=s[1],o=u,l=(s[2]??"").trim()):(r=s[0],o=this.inferTargetValueType(r),l=(s[1]??"").trim()),!um(r))throw tt(e);const m=ct(l)??l;return m===""&&t?this.state.outputLineOpen?{variableName:r,valueType:o,prompt:"",continuesLine:!0}:{variableName:r,valueType:o,prompt:""}:{variableName:r,valueType:o,prompt:m===""?`${r}:`:m}}parseArrayDeclaration(e,t){const n=e.split(/\s+/u).filter(Boolean);if(n.length!==2||!n[0].endsWith("[]"))return;const a=n[0].endsWith("[][]"),s=n[0].slice(0,a?-4:-2),r=nn(s),o=n[1];if(!r||!Ii(o))throw tt(e);if(a)return this.parseGridDeclaration(o,s,r,t);const l=t.trim();if(l.startsWith("{")&&l.endsWith("}")){const h=l.slice(1,-1).split(",").map(f=>f.trim());let g;switch(r){case"int":g={kind:"intArray",value:h.map(f=>this.evaluateInt(f))};break;case"double":g={kind:"doubleArray",value:h.map(f=>this.evaluateDouble(f))};break;case"string":g={kind:"stringArray",value:h.map(f=>ct(f)??this.evaluateOutputExpression(f))};break;case"boolean":g={kind:"booleanArray",value:h.map(f=>this.evaluateBool(f))};break}return{name:o,typeName:s,count:h.length,value:g}}const u=`new ${s}[`;if(!l.startsWith(u)){const h=this.evaluateStringMethod(l);if((h==null?void 0:h.kind)==="stringArray"&&r==="string")return{name:o,typeName:s,count:h.value.length,value:h}}if(!l.startsWith(u)||!l.endsWith("]"))throw tt(t);const m=l.slice(u.length,-1),c=this.evaluateInt(m);if(c<0)throw G(m);const d=r==="int"?{kind:"intArray",value:new Array(c).fill(0)}:r==="double"?{kind:"doubleArray",value:new Array(c).fill(0)}:r==="boolean"?{kind:"booleanArray",value:new Array(c).fill(!1)}:{kind:"stringArray",value:new Array(c).fill("")};return{name:o,typeName:s,count:c,value:d}}parseGridDeclaration(e,t,n,a){var c;const s=a.trim(),r=d=>{switch(n){case"int":return this.evaluateInt(d);case"double":return this.evaluateDouble(d);case"boolean":return this.evaluateBool(d);case"string":return ct(d.trim())??this.evaluateOutputExpression(d)}};if(s.startsWith("{")&&s.endsWith("}")){const d=px(s.slice(1,-1)).map(h=>{const g=h.trim();if(!g.startsWith("{")||!g.endsWith("}"))throw G(g);return g.slice(1,-1).trim()===""?[]:g.slice(1,-1).split(",").map(f=>r(f.trim()))});return{name:e,typeName:t,count:`${d.length}][${((c=d[0])==null?void 0:c.length)??0}`,value:{kind:"grid",elementType:n,value:d}}}const o=new RegExp(String.raw`^new\s+${t}\s*\[(.+)\]\s*\[(.+)\]$`,"u").exec(s);if(!o)throw tt(a);const l=this.evaluateInt(o[1]),u=this.evaluateInt(o[2]);if(l<0)throw G(o[1]);if(u<0)throw G(o[2]);const m={kind:"grid",elementType:n,value:Array.from({length:l},()=>new Array(u).fill(am(n)))};return{name:e,typeName:t,count:`${l}][${u}`,value:m}}arrayIndex(e){const t=this.evaluateInt(e);if(t<0)throw G(e);return t}evaluateReference(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n;const a=this.evaluateStringMethod(t);if(a)return a;const s=/^\(\s*char\s*\)\s*(.+)$/su.exec(t);if(s){const o=this.evaluateInt(s[1]);if(!(o>=0&&o<=1114111))throw G(t);return{kind:"string",value:String.fromCodePoint(o)}}const r=A1(t);if(r)return this.valueInArray(r.arrayName,r.indexExpressions.map(o=>this.arrayIndex(o)))}evaluateStringMethod(e){const t=gx(e);if(!t)return;const n=this.evaluateStaticCall(e,t);if(n)return n;const a=this.state.variables.get(t.target.trim());if((a==null?void 0:a.kind)==="reader")return this.readerMethod(t.target.trim(),a,t,e);if((a==null?void 0:a.kind)==="null")throw new He({kind:"nullValue",text:t.target.trim()});const s=ct(t.target)??this.stringValueOf(t.target);if(s===void 0)return;const r=t.args,o=d=>{const h=r[d];if(h===void 0)throw G(e);const g=ct(h.trim());if(g!==void 0)return g;const f=this.evaluateReference(h);if((f==null?void 0:f.kind)==="string")return f.value;throw G(h)},l=d=>{if(r[d]===void 0)throw G(e);return this.evaluateInt(r[d])},u=d=>{if(r.length!==d)throw G(e)},m=Array.from(s),c=(d,h)=>{if(d<0||d>h)throw G(e);return d};switch(t.method){case"length":return u(0),_t(m.length);case"charAt":return u(1),{kind:"string",value:m[c(l(0),m.length-1)]};case"substring":{if(r.length!==1&&r.length!==2)throw G(e);const d=c(l(0),m.length),h=r.length===2?c(l(1),m.length):m.length;if(h0&&h[h.length-1]==="";)h.pop();return{kind:"stringArray",value:h}}default:return}}evaluateStaticCall(e,t){const n=()=>{if(t.args.length!==1)throw G(e);return t.args[0]},a=s=>{const r=ct(s.trim());if(r!==void 0)return r;const o=this.evaluateReference(s);if((o==null?void 0:o.kind)==="string")return o.value;throw G(s)};switch(`${t.target}.${t.method}`){case"Integer.parseInt":{const s=a(n()).trim();if(!/^[+-]?\d+$/u.test(s))throw new He({kind:"wholeNumberExpected"});return _t(Number(s))}case"Double.parseDouble":{const s=Number(a(n()).trim());if(!Number.isFinite(s))throw new He({kind:"numberExpected"});return At(s)}case"String.valueOf":return{kind:"string",value:this.evaluateOutputExpression(n())};case"Arrays.toString":case"Arrays.deepToString":{const s=this.state.variables.get(n().trim());if(!s||!cs(s))throw G(e);return s.kind==="grid"&&t.method==="toString"?{kind:"string",value:"["+s.value.map(o=>sm({kind:`${s.elementType}Array`,value:o})).join(", ")+"]"}:{kind:"string",value:_e(s)}}case"Files.readString":{const s=/^(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)$/u.exec(n().trim());if(!s)throw G(e);const r=ct(s[1]),o=Ps.get(r);if(o===void 0)throw new He({kind:"fileNotFound",text:r});return{kind:"string",value:o}}default:return}}stringValueOf(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n.kind==="string"?n.value:void 0;const a=A1(t);if(!a)return;const s=this.valueInArray(a.arrayName,a.indexExpressions.map(r=>this.arrayIndex(r)));return s.kind==="string"?s.value:void 0}substituteStringCalls(e){if(!e.includes("("))return e;let t="",n=e;const a=/([A-Za-z_]\w*(?:\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*(length|indexOf|lastIndexOf|compareTo|charAt|parseInt|parseDouble)\s*\(/u;for(let s=a.exec(n);s;s=a.exec(n)){const r=s.index+s[0].length-1,o=zr(Array.from(n),Array.from(n.slice(0,r)).length);if(o===void 0)break;const l=Array.from(n),u=l.slice(Array.from(n.slice(0,s.index)).length,o+1).join(""),m=this.evaluateStringMethod(u),c=l.slice(0,Array.from(n.slice(0,s.index)).length).join(""),d=(m==null?void 0:m.kind)==="string"?il(m.value):void 0;(m==null?void 0:m.kind)==="int"?t+=c+String(m.value):(m==null?void 0:m.kind)==="double"?t+=c+(Number.isInteger(m.value)?m.value.toFixed(1):String(m.value)):d!==void 0?t+=c+String(d):t+=c+u,n=l.slice(o+1).join("")}return t+n}valueInArray(e,t){const n=this.state.variables.get(e);if(!n)throw _1(e,this.state.variables);const a=`${e}[${t.join("][")}]`;if(n.kind==="grid"){if(t.length!==2)throw G(a);const r=n.value[t[0]];if(!r||t[1]>=r.length)throw G(a);return nl(n.elementType,r[t[1]])}if(t.length!==1)throw G(a);const s=t[0];if(!cs(n))throw G(e);if(s>=n.value.length)throw G(a);switch(n.kind){case"intArray":return _t(n.value[s]);case"doubleArray":return At(n.value[s]);case"stringArray":return{kind:"string",value:n.value[s]};case"booleanArray":return{kind:"boolean",value:n.value[s]};default:throw G(e)}}inferTargetValueType(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return om(n);const a=A1(t);if(a){const s=this.state.variables.get(a.arrayName);if(!s)throw _1(a.arrayName,this.state.variables);if(s.kind==="intArray")return"int";if(s.kind==="doubleArray")return"double";if(s.kind==="stringArray")return"string";if(s.kind==="booleanArray")return"boolean";if(s.kind==="grid")return s.elementType;throw G(a.arrayName)}throw tt(e)}assignValue(e,t){const n=t.trim(),a=A1(n);if(!a){this.state.variables.set(n,e);return}const s=a.indexExpressions.map(u=>this.arrayIndex(u)),r=this.state.variables.get(a.arrayName);if(!r)throw _1(a.arrayName,this.state.variables);if(r.kind==="grid"){if(s.length!==2||s[0]>=r.value.length||s[1]>=r.value[s[0]].length)throw G(n);const u=r.elementType==="double"&&e.kind==="int"||e.kind===r.elementType?e.value:void 0;if(u===void 0||cs(e))throw G(n);const m=r.value.map(c=>[...c]);m[s[0]][s[1]]=u,rm(r.value,m),this.state.variables.set(a.arrayName,{...r,value:m});return}if(s.length!==1)throw G(n);const o=s[0];let l;if(r.kind==="intArray"&&e.kind==="int")l={kind:"intArray",value:[...r.value]};else if(r.kind==="doubleArray"&&(e.kind==="double"||e.kind==="int"))l={kind:"doubleArray",value:[...r.value]};else if(r.kind==="stringArray"&&e.kind==="string")l={kind:"stringArray",value:[...r.value]};else if(r.kind==="booleanArray"&&e.kind==="boolean")l={kind:"booleanArray",value:[...r.value]};else throw G(n);if(o>=l.value.length)throw G(n);l.value[o]=e.value,rm(r.value,l.value),this.state.variables.set(a.arrayName,l)}evaluateOutputExpression(e){const t=this.withSensors(e).trim();if(cm(t)&&Yr(t).every(s=>ct(s.trim())===void 0)&&!this.evaluateReference(t))return String(this.evaluateBool(t));let n,a;for(const s of Yr(this.withSensors(e))){const r=s.trim(),o=ct(r),l=o!==void 0?{kind:"string",value:o}:this.evaluateReference(r)??(cm(r)?{kind:"boolean",value:this.evaluateBool(r)}:this.evaluateNumeric(r)),u=l.kind==="int"||l.kind==="double";if(a===void 0&&u){n?n=n.kind==="int"&&l.kind==="int"?_t(n.value+l.value):At(n.value+l.value):n=l;continue}a=(a??(n?_e(n):""))+sm(l),n=void 0}return a??(n?_e(n):"")}renderOutputExpression(e){return Yr(e).map(t=>{const n=t.trim();if(ct(n)!==void 0)return n;const a=this.evaluateReference(n);if(a)return _e(a);try{return this.renderNumericExpression(n)}catch{return n}}).join(" + ")}evaluateExpression(e,t){switch(t){case"int":return _t(this.evaluateInt(e));case"double":return At(this.evaluateDouble(e));case"string":{const n=e.trim(),a=ct(n);if(a!==void 0)return{kind:"string",value:a};if(n==="null")return{kind:"null"};const s=this.evaluateReference(n);return(s==null?void 0:s.kind)==="null"?s:s?{kind:"string",value:_e(s)}:{kind:"string",value:this.evaluateOutputExpression(e)}}case"boolean":return{kind:"boolean",value:this.evaluateBool(e)}}}evaluateNumeric(e){const{v:t,int:n}=this.parser(e).parseNumber();return n||Number.isFinite(t)&&Math.round(t)===t?_t(t):At(t)}parser(e){const t=this.withSensors(e);return new fx(mm(lm(this.substituteStringCalls(t))),this.state.variables)}withSensors(e){return nx(e,t=>this.robotSensors[t]??Bt[t].simulated)}evaluateInt(e){return this.parser(e).parseInt()}evaluateDouble(e){return this.parser(e).parseDouble()}evaluateBool(e){const t=this.withSensors(e).trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);if((n==null?void 0:n.kind)==="boolean")return n.value;const a=Zs(t,"||");if(a.length>1)return a.some(u=>this.evaluateBool(u));const s=Zs(t,"&&");if(s.length>1)return s.every(u=>this.evaluateBool(u));if(t.startsWith("!")&&!t.startsWith("!="))return!this.evaluateBool(t.slice(1));const r=wg(t);if(r!==void 0)return this.evaluateBool(r);const o=hx(t);if(o)return this.evaluateComparison(o.lhs,"==",o.rhs);const l=dx(t);if(l)return this.evaluateComparison(l.lhs,l.op,l.rhs);if(this.stringOperand(t)!==void 0)throw G(t);return this.evaluateDouble(t)!==0}evaluateComparison(e,t,n){if((e.trim()==="null"||n.trim()==="null")&&(t==="=="||t==="!=")){const m=d=>{var h;return d.trim()==="null"||((h=this.evaluateReference(d))==null?void 0:h.kind)==="null"},c=m(e)===m(n);return t==="=="?c:!c}const a=this.booleanOperand(e),s=this.booleanOperand(n);if((a!==void 0||s!==void 0)&&(t==="=="||t==="!=")){const m=a??this.evaluateBool(e),c=s??this.evaluateBool(n);return t==="=="?m===c:m!==c}const r=this.stringOperand(e),o=this.stringOperand(n);let l,u;if(r!==void 0||o!==void 0){if(r===void 0||o===void 0)throw G(`${e} ${t} ${n}`);l=r,u=o}else l=this.evaluateDouble(e),u=this.evaluateDouble(n);switch(t){case"==":return l===u;case"!=":return l!==u;case"<":return l":return l>u;case">=":return l>=u;default:throw G(`${e} ${t} ${n}`)}}booleanOperand(e){const t=e.trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);return(n==null?void 0:n.kind)==="boolean"?n.value:void 0}stringOperand(e){const t=e.trim(),n=ct(t);if(n!==void 0)return n;const a=this.evaluateReference(t);return(a==null?void 0:a.kind)==="string"?a.value:void 0}evaluateSwitchSelector(e){const t=this.withSensors(e).trim(),n=ct(t);if(n!==void 0)return{kind:"text",value:n};const a=this.state.variables.get(t);if(a)switch(a.kind){case"int":return{kind:"int",value:a.value};case"double":return{kind:"int",value:Math.trunc(a.value)};case"string":return{kind:"text",value:a.value};default:throw G(t)}return/^[+-]?[0-9]+$/.test(t)?{kind:"int",value:Number(t)}:{kind:"int",value:this.evaluateInt(t)}}renderNumericExpression(e){return mm(lm(e)).map(t=>{if(t.t==="number")return t.literal;if(t.t==="identifier"){const n=this.state.variables.get(t.name);if(!n)throw _1(t.name,this.state.variables);return _e(n)}return t.t}).join(" ").replaceAll("( ","(").replaceAll(" )",")").replaceAll(" . ",".").replaceAll("[ ","[").replaceAll(" ]","]")}}const zg={baseIndent:0,indentPerLevel:4,includeDiagramTextAsComments:!1,includeEmptyElseBranch:!0,pseudocodeNote:"Pseudocode – not a runnable program"};function Ws(i,e,t={},n=[]){const a=C0(i,e,t);let s="";e==="javascript"&&(s+=`"use strict"; - -`);const r=[i,...e==="java"?[]:n];if(e==="python"&&r.some(Lg)&&(s+=`import random - -`),e!=="java"&&(s+=ol(r,e)),e==="java"&&Fs(i)&&(s+=`// import java.util.Scanner; -`,s+=`Scanner scanner = new Scanner(System.in); - -`),i.pseudocode&&(s+=(e==="python"?"# ":"// ")+a.pseudocodeNote+` - -`),e!=="java")for(const u of n){if(u===i)continue;const m=Tt(u.caption);m&&(s+=sl(u,m,e,t,0)+` -`)}const o=Tt(i.caption),l={out:""};if(o)l.out=sl(i,o,e,t,a.baseIndent);else for(const u of i.elements)Tr(u,e,a,a.baseIndent,l);if(s+=l.out,s.trim()===""){const u=yx(e);return e==="javascript"?`"use strict"; - -`+u:u}return Fg(s.replace(/^[\n\r]+|[\n\r]+$/g,""),e)}function C0(i,e,t){const n={...zg,...t,jsIntVariables:new Set,arrayElementTypes:Cx(i),stringVariables:jx(i)};return e!=="java"&&(n.jsIntVariables=Yx(i)),n}const gm=i=>i==="string"?"String":i===void 0?"void":i;function Ig(i){const e=i.params.map(t=>`${gm(t.type)}${"[]".repeat(t.dims??0)} ${t.name}`).join(", ");return`public static ${gm(i.returnType)} ${i.name}(${e}) {`}function sl(i,e,t,n,a){const s=C0(i,t,n);for(const l of e.params)l.dims||(l.type==="int"&&s.jsIntVariables.add(l.name),l.type==="string"&&s.stringVariables.add(l.name));const r=e.params.map(l=>l.name).join(", "),o={out:""};for(const l of i.elements)Tr(l,t,s,a+s.indentPerLevel,o);switch(o.out.trim()===""&&(o.out=L(a+s.indentPerLevel)+(t==="python"?`pass -`:` -`)),t){case"java":return`${L(a)}${Ig(e)} -${o.out}${L(a)}} -`;case"python":return`${L(a)}def ${e.name}(${r}): -${o.out}`;case"javascript":return`${L(a)}function ${e.name}(${r}) { -${o.out}${L(a)}} -`}}const L=i=>i>0?" ".repeat(i):"";function ye(i,e){const t=i.exec(e);return t?Array.from(t,n=>n??""):void 0}function yx(i,e){return i==="python"?"# empty element":"// empty element"}const rl=i=>i.trim()==="ø";function kg(i,e){return L(i)+(e==="python"?`# empty element -`:`// empty element -`)}function zx(i){switch(i.type){case S.leerElement:return!0;case S.anweisung:case S.aufruf:return i.textLines.map(e=>e.trim()).every(e=>e===""||rl(e));default:return!1}}function Ix(i){return i.every(zx)}function D0(i,e,t){const n=i.map(a=>a.replace(/^[ \t]+|[ \t]+$/g,"")).filter(a=>a!=="");return n.length===0?"":e==="python"?L(t)+`""" -`+n.map(a=>L(t)+a+` -`).join("")+L(t)+`""" -`:n.length===1?L(t)+"/* "+n[0]+` */ -`:L(t)+`/* -`+n.map(a=>L(t)+" * "+a+` -`).join("")+L(t)+` */ -`}const kx=i=>i==="java"||i==="javascript";function Es(i){const e=i.trim();if(e==="")return"";if(e.startsWith("//")||e.startsWith("/*")||e.startsWith("*")||e.startsWith("#")||e.startsWith("{")||e.startsWith("}")||e.endsWith("{")||e.endsWith(";"))return e;const t=e.toLowerCase();for(const n of["if ","else","for ","while ","do ","switch ","case ","default"])if(t.startsWith(n))return e;return e+";"}function ds(i){const e=i.map(t=>t.trim()).filter(t=>t!=="");return Sx(e.length===0?"true":e.join(" "))}function Sx(i){const e=i.trim();for(const t of["if","while","until","switch"]){const n=Sg(t,e);if(n!==void 0)return n===""?"true":n}return e}function Sg(i,e){if(!e.toLowerCase().startsWith(i))return;const t=e.slice(i.length);if(!(t===""||/^\s/.test(t)||t[0]==="("))return;let n=t.trim();return n.startsWith("(")&&n.endsWith(")")&&n.length>=2&&(n=n.slice(1,-1).trim()),n}function Ut(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function Tx(i){const e=i.trim(),t=e.toLowerCase();let n;if(t.startsWith("output:"))n=e.slice(7).trim();else if(t.startsWith("print:"))n=e.slice(6).trim();else return;return n===""?void 0:n}const Ir=i=>i.name.includes("[")&&i.name.includes("]");function B0(i){const e=i.trim();if(e==="")return;const t=ye(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)(?:\s+"([^"]*)")?\s*$/i,e);if(t){const s=t[2].replaceAll(" ","");if(s==="")return;const r=(t[3]??"").trim();return{type:Ns(t[1]),name:s,customPrompt:r===""?void 0:r}}const n=ye(/^\s*([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)\s+"([^"]*)"\s*$/i,e);if(n){const s=n[1].replaceAll(" ","");return["int","integer","long","float","double","string","boolean","char","bool","void"].includes(s.toLowerCase())?void 0:{type:s.includes("[")?"String":"int",name:s,customPrompt:n[2].trim()}}const a=_x(e);if(a)return{type:Ns(a[0]),name:a[1]}}function Ns(i){switch(i.trim().toLowerCase()){case"integer":case"int":return"int";case"long":return"long";case"float":return"float";case"double":return"double";case"string":return"String";case"boolean":case"bool":return"boolean";case"char":return"char";default:return i}}function _x(i){const e=i.split(/[ \t]+/).filter(Boolean);if(e.length===0)return;if(e.length>=2)return[e[0],e[1]];if(!["int","double","string","boolean","char","long","float","short","byte","void","bool","integer"].includes(e[0].toLowerCase()))return["int",e[0]]}function Ax(i,e,t,n,a){const s=Ut(i).trim();if(s.startsWith('"'))switch(e){case"java":return L(t)+"System.out.println("+s+`); -`;case"javascript":return L(t)+"console.log("+s+`); -`;case"python":return L(t)+"print("+Nn(s,n,a)+`) -`}}function Ei(i){return i.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll(` -`,"\\n").replaceAll("\r","\\r")}function P0(i,e){const t=i.trim();if(!t.toLowerCase().startsWith("input:"))return;const n=t.slice(6).trim();if(n==="")return;const a=B0(n);if(a&&Ir(a)&&!/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s/i.test(n)){const s=e.get(a.name.slice(0,a.name.indexOf("[")).trim());if(s)return{...a,type:s}}return a}function jx(i){const e=new Set;return kn(i.elements,t=>{for(const n of t.textLines){const a=n.trim();if(a.toLowerCase().startsWith("input:")){const o=B0(a.slice(6).trim());(o==null?void 0:o.type)==="String"&&!Ir(o)&&e.add(o.name);continue}const s=ye(/^\s*(?:const\s+)?string\s+([a-zA-Z_]\w*)\s*=/i,a);s&&e.add(s[1]);const r=ye(/^\s*string\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=/i,a);r&&e.add(r[1]+"[]")}}),e}function Cx(i){const e=new Map;return kn(i.elements,t=>{for(const n of t.textLines){const a=ye(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s*\[\s*\]\s*([a-zA-Z_]\w*)/i,n)??ye(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*)\s*\[\s*\]/i,n);a&&e.set(a[2],Ns(a[1]))}}),e}function Dx(i,e,t){const n=P0(i,t);if(!n)return;const a=n.customPrompt?n.customPrompt:n.name+": ",s=L(e)+'System.out.println("'+Ei(a)+`"); -`,r=o=>Ir(n)?n.name:`${o} ${n.name}`;switch(n.type){case"int":return s+L(e)+`${r("int")} = scanner.nextInt(); -`;case"double":return s+L(e)+`${r("double")} = scanner.nextDouble(); -`;case"String":return s+L(e)+`${r("String")} = scanner.next(); -`;case"boolean":return s+L(e)+`${r("boolean")} = scanner.nextBoolean(); -`;default:return}}function Bx(i,e,t){const n=P0(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":L(e)+'console.log("'+Ei(n.name+": ")+`"); -`,r=l=>{const u=a?n.customPrompt:n.name+": ";return`(prompt("${Ei(u)}") ?? "${l}")`},o=Ir(n)?n.name:`let ${n.name}`;switch(n.type){case"int":return s+L(e)+`${o} = parseInt(${r("0")}, 10); -`;case"double":return s+L(e)+`${o} = Number(${r("0")}); -`;case"String":return s+L(e)+`${o} = ${r("")}; -`;case"boolean":return s+L(e)+`${o} = ${r("")}.trim().toLowerCase() === "true"; -`;default:return}}function Px(i,e,t){const n=P0(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":L(e)+'print("'+Ei(n.name+": ")+`") -`,r=`input("${Ei(a?n.customPrompt:n.name+": ")}")`;switch(n.type){case"int":return s+L(e)+`${n.name} = int(${r}) -`;case"double":return s+L(e)+`${n.name} = float(${r}) -`;case"String":return s+L(e)+`${n.name} = ${r} -`;case"boolean":return s+L(e)+`${n.name} = ${r}.strip().lower() in ("true", "wahr") -`;default:return}}const Kr=String.raw`("(?:[^"\\]|\\.)*"|[A-Za-z_]\w*)`,Ox=[[new RegExp(String.raw`^new\s+Scanner\s*\(\s*new\s+File\s*\(\s*${Kr}\s*\)\s*\)$`),"Scanner"],[new RegExp(String.raw`^new\s+BufferedReader\s*\(\s*new\s+FileReader\s*\(\s*${Kr}\s*\)\s*\)$`),"BufferedReader"],[new RegExp(String.raw`^new\s+PrintWriter\s*\(\s*(?:new\s+(?:File|FileWriter)\s*\(\s*)?${Kr}\s*\)?\s*\)$`),"PrintWriter"]];function Tg(i){const e=i.trim();for(const[t,n]of Ox){const a=t.exec(e);if(a)return{kind:n,name:a[1]}}}function Mx(i,e,t,n,a){if(e==="java")return;const s=Ut(i).trim(),r=/^(?:(?:Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*(new\s[\s\S]+)$/.exec(s),o=r&&Tg(r[2]);if(r&&o){const m=/^(?:Scanner|BufferedReader|PrintWriter)\s/.test(s);return e==="python"?L(t)+`${r[1]} = ${o.kind}(${o.name}) -`:L(t)+`${m?"let ":""}${r[1]} = new ${o.kind}(${o.name}); -`}const l=/^([A-Za-z_]\w*)\.(println|print)\s*\(([\s\S]*)\)$/.exec(s);if(l&&l[1]!=="System"){const m=l[3].trim(),c=e==="python"&&m!==""?Nn(m,n,a):m;return L(t)+`${l[1]}.${l[2]}(${c})${e==="javascript"?";":""} -`}const u=/^Files\.writeString\s*\(\s*(?:Path\.of|Paths\.get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,\s*([\s\S]+)\)$/.exec(s);if(u){const m=u[2].trim();return e==="python"?L(t)+`open(${u[1]}, "w", encoding="utf-8").write(${Nn(m,n,a)}) -`:L(t)+`require("fs").writeFileSync(${u[1]}, ${m}); -`}}function Zx(i){const e=new Set;for(const t of i)kn(t.elements,n=>{for(const a of n.textLines){const s=/=\s*(new\s.+?);?\s*$/.exec(a),r=s&&Tg(s[1]);r&&e.add(r.kind)}});return e}const Lx={Scanner:`class Scanner: - def __init__(self, name): - self.lines = open(name, encoding="utf-8").read().splitlines() - def hasNextLine(self): - return len(self.lines) > 0 - def nextLine(self): - return self.lines.pop(0) - def close(self): - pass -`,BufferedReader:`class BufferedReader: - def __init__(self, name): - self.lines = open(name, encoding="utf-8").read().splitlines() - def readLine(self): - return self.lines.pop(0) if self.lines else None - def close(self): - pass -`,PrintWriter:`class PrintWriter: - def __init__(self, name): - self.file = open(name, "w", encoding="utf-8") - def println(self, text=""): - self.file.write(str(text) + "\\n") - def print(self, text): - self.file.write(str(text)) - def close(self): - self.file.close() -`},Wx={Scanner:`class Scanner { - constructor(name) { this.lines = require("fs").readFileSync(name, "utf8").split(/\\r?\\n/); if (this.lines.at(-1) === "") this.lines.pop(); } - hasNextLine() { return this.lines.length > 0; } - nextLine() { return this.lines.shift(); } - close() {} -} -`,BufferedReader:`class BufferedReader { - constructor(name) { this.lines = require("fs").readFileSync(name, "utf8").split(/\\r?\\n/); if (this.lines.at(-1) === "") this.lines.pop(); } - readLine() { return this.lines.length > 0 ? this.lines.shift() : null; } - close() {} -} -`,PrintWriter:`class PrintWriter { - constructor(name) { this.name = name; this.text = ""; } - println(text = "") { this.text += text + "\\n"; } - print(text) { this.text += text; } - close() { require("fs").writeFileSync(this.name, this.text); } -} -`};function ol(i,e){const t=Zx(i);if(t.size===0)return"";const n=e==="python"?Lx:Wx;return[...t].map(a=>n[a]).join(` -`)+` -`}function Ex(i,e,t,n,a){const s=/^System\s*\.\s*out\s*\.\s*print\s*\(([\s\S]*)\)$/.exec(Ut(i).trim());if(s){const o=s[1].trim();switch(e){case"java":return L(t)+"System.out.print("+o+`); -`;case"javascript":return L(t)+"process.stdout.write(String("+o+`)); -`;case"python":return L(t)+"print("+(o===""?"":Nn(o,n,a)+", ")+`end="") -`}}const r=Tx(i);if(r===void 0)return/^\s*(?:output|print):\s*$/i.test(i)?L(t)+{java:"System.out.println();",javascript:"console.log();",python:"print()"}[e]+` -`:void 0;switch(e){case"java":return L(t)+"System.out.println("+r+`); -`;case"javascript":return L(t)+"console.log("+r+`); -`;case"python":return L(t)+"print("+Nn(r,n,a)+`) -`}}function O0(i){const e=i.map(Ut).filter(t=>t!=="");return e.length===0?";;":e.join("; ")}function Nx(i){const t=O0(i).split(";"),n=_g(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function _g(i){const e=ye(/^(\s*)(?:integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?\s*$/i,i);if(!e)return;const t=e[2].trim();if(t==="")return;const n=(e[3]??"").trim();return i.includes("=")&&n!==""?e[1]+`let ${t} = ${n}`:e[1]+`let ${t}`}function Fx(i){const e=i.map(n=>Ut(n).trim()).filter(n=>n!=="");let t=e;if(e.length===1){let n=e[0];const a=Sg("for",n);a!==void 0&&(n=a),t=n.split(";").map(s=>s.trim())}if(!(t.length!==3||t.some(n=>n==="")))return[t[0],t[1],t[2]]}function Ag(i,e){let t=ye(/^\s*(\w+)\s*(\+\+|--)\s*$/,i)??ye(/^\s*(\+\+|--)\s*(\w+)\s*$/,i);if(t){const[n,a]=t[1]==="++"||t[1]==="--"?[t[2],t[1]]:[t[1],t[2]];return n===e?a==="++"?1:-1:void 0}if(t=ye(/^\s*(\w+)\s*(\+|-)=\s*(\d+)\s*$/,i),t)return t[1]===e?(t[2]==="+"?1:-1)*Number(t[3]):void 0;if(t=ye(/^\s*(\w+)\s*=\s*(\w+)\s*(\+|-)\s*(\d+)\s*$/,i),t)return t[1]===e&&t[2]===e?(t[3]==="+"?1:-1)*Number(t[4]):void 0}function ll(i,e){if(/^-?\d+$/.test(i))return String(Number(i)+e);const t=/^[\w.()[\]]+$/.test(i)?i:`(${i})`;return e>0?`${t} + ${e}`:`${t} - ${-e}`}function Rx(i,e){const t=Fx(i);if(!t)return;const[n,a,s]=t,r=ye(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n);if(!r)return;const o=r[1],l={variable:o,init:`${o} = ${We(r[2],e)}`,condition:a,increment:s},u=ye(/^\s*(\w+)\s*(<=|<|>=|>)\s*(.+)$/,a),m=Ag(s,o);if(!u||u[1]!==o||m===void 0||m===0)return l;const c=We(r[2],e);let d=We(u[3],e);const h=u[2];if(m>0&&h==="<=")d=ll(d,1);else if(m<0&&h===">=")d=ll(d,-1);else if(!(m>0&&h==="<")&&!(m<0&&h===">"))return l;const g=m===1?c==="0"?[d]:[c,d]:[c,d,String(m)];return l.rangeLine=`for ${o} in range(${g.join(", ")}):`,l}function jg(i){const e=Ut(i).trim();if(e==="")return;const t=ye(/^\s*const\s+(integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?$/i,e);if(!t)return;const n=t[2].trim();if(n==="")return;if(!e.includes("="))return{rawType:t[1].trim(),name:n};const a=(t[3]??"").trim();if(a!=="")return{rawType:t[1].trim(),name:n,rhs:a}}function Jx(i,e,t,n){var o;const a=jg(i);if(!a)return;const s=Ns(a.rawType),r=(o=a.rhs)==null?void 0:o.trim();switch(e){case"java":return L(t)+Es(r?`final ${s} ${a.name} = ${r}`:`final ${s} ${a.name}`)+` -`;case"javascript":return r?L(t)+Es(`const ${a.name} = ${r}`)+` -`:L(t)+`let ${a.name}; // from diagram: const ${s} ${a.name} -`;case"python":return r?L(t)+`${a.name} = ${Sr(r,n)} # const ${s} -`:L(t)+`${a.name} = None # const ${s}, uninitialized -`}}function Gx(i){const e=Ut(i).trim();if(e===""||Mg(e))return;const t=ye(/^\s*(?:integer|int|long|float|double|string|boolean|char|bool)(?:\s*\[\s*\]\s+(\w+)|\s+(\w+)(\s*\[\s*\])?)\s*=\s*(.*)$/i,e);if(!t)return;const n=t[1]===""?t[2]:t[1],a=t[4].trim();if(a!=="")return{name:n,rhs:a,isArray:t[1]!==""||t[3]!==""}}function kr(i){const e=ye(/^\s*\(\s*int(?:eger)?\s*\)\s*(.+?)\s*$/i,i),t=e==null?void 0:e[1].trim();if(!(!t||Cg(t)))return t.startsWith("(")&&ul(t,0)===t.length-1?t.slice(1,-1).trim():t}function ul(i,e){let t=0;for(let n=e;n/^'.'$/u.test(i)||/\.charAt\(.*\)$/.test(i);function Hx(i,e){if(i[e]==="("){const a=ul(i,e);return a<0?-1:a+1}if(i[e]==="'")return i[e+2]==="'"?e+3:-1;const t=/^(?:[A-Za-z_]\w*|\d+)/.exec(i.slice(e));if(!t)return-1;let n=e+t[0].length;for(;;){const a=/^\.[A-Za-z_]\w*/.exec(i.slice(n));if(a)n+=a[0].length;else if(i[n]==="("||i[n]==="["){const s=ul(i,n);if(s<0)return-1;n=s+1}else return n}}function ml(i,e){return M0(i,t=>{const n=/\(\s*(int|char)\s*\)\s*/g;let a="",s=0;for(let r=n.exec(t);r;r=n.exec(t)){const o=r.index+r[0].length,l=Hx(t,o);if(l<0)continue;const u=t.slice(o,l);if(r[1]==="int"&&!Cg(u))continue;const m=ml(u.startsWith("(")?u.slice(1,-1).trim():u,e),c=r[1]==="int"?e==="python"?`ord(${m})`:`${m}.charCodeAt(0)`:e==="python"?`chr(${m})`:`String.fromCharCode(${m})`;a+=t.slice(s,r.index)+c,s=l,n.lastIndex=l}return a+t.slice(s)})}function Sr(i,e=new Set){const t=i.trim();if(t==="null")return"None";const n=kr(t);return n!==void 0?`int(${Sr(n,e)})`:We(t,e)}function M0(i,e){let t="",n="",a=0;for(;a/^\d+$/.test(a)||e.has(a);return M0(t,a=>a.replace(/\bMath\.random\s*\(\s*\)/gi,"random.random()").replace(/===/g,"==").replace(/!==/g,"!=").replace(/\s*&&\s*/g," and ").replace(/\s*\|\|\s*/g," or ").replace(/!(?!=)\s*/g,"not ").replace(/\btrue\b/g,"True").replace(/\bfalse\b/g,"False").replace(/\bnull\b/g,"None").replace(new RegExp("(?n(r)&&n(o)?`${r} // ${o}`:s))}function Dg(i){const e=[];let t=0,n="",a=!1;for(let s=0;s/^"(?:[^"\\]|\\.)*"$/.test(i);function Nn(i,e,t){const n=Dg(i),a=s=>Z0(s)||t.has(s)||t.has(s.replace(/^([A-Za-z_]\w*)\[[^[\]]*\]$/u,"$1[]"));return n.length<2||!n.some(a)||n.some(s=>s==="")?We(i,e):n.map(s=>a(s)?s:`str(${We(s,e)})`).join(" + ")}function Bg(i,e,t=new Set){const n=Ut(i).trim(),a=ye(/^(\w+(?:\[[^\]]*\])?)\s*(\+\+|--)$/,n)??ye(/^(\+\+|--)\s*(\w+(?:\[[^\]]*\])?)$/,n);if(a){const[o,l]=a[1]==="++"||a[1]==="--"?[a[2],a[1]]:[a[1],a[2]];return`${We(o,e)} ${l==="++"?"+=":"-="} 1`}const s=ye(/^(\w+)\s*\/=\s*(.+)$/,n);if(s&&e.has(s[1]))return`${s[1]} //= ${We(s[2],e)}`;const r=ye(/^([\w[\]. ]+?)\s*(=|\+=|-=|\*=|\/=|%=)\s*(.+)$/,n);if(r&&!r[3].startsWith("=")){const[,o,l,u]=r;let m;if(l==="+="&&t.has(o.trim())){const c=Dg(u);m=Nn(`"" + ${u}`,e,t).replace(/^"" \+ /,""),c.length===1&&!Z0(u.trim())&&!t.has(u.trim())&&(m=`str(${We(u,e)})`)}else l==="="&&kr(u)===void 0&&u.trim()!=="null"?m=Nn(u,e,t):m=l==="="?Sr(u,e):We(u,e);return`${o} ${l} ${m}`}return We(n,e)}const Vx=i=>i.replace(/\bMath\.random\b(?!\s*\()/gi,"Math.random()");function Pg(i){const e=i.trim();return e.startsWith("{")&&e.endsWith("}")?"["+e.slice(1,-1)+"]":i}function Og(i){const e=ye(/^\s*new\s+(?:byte|short|int|long|float|double|boolean|char|string)\s*\[\s*(.+)\s*\]\s*$/i,i),t=e==null?void 0:e[1].trim();return t||void 0}function Mg(i){const e=ye(/^\s*(int|double|string|boolean)\s*\[\s*\]\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,Ut(i).trim());return e?{elementType:e[1].toLowerCase(),name:e[2],rhs:e[3].trim()}:void 0}function qx(i){const e=ye(/^\s*new\s+(?:int|double|string|boolean)\s*\[\s*(.+?)\s*\]\s*\[\s*(.+?)\s*\]\s*$/i,i);return e?[e[1],e[2]]:void 0}const pm=i=>i.replaceAll("{","[").replaceAll("}","]");function fm(i,e){return i==="boolean"?e==="python"?"False":"false":i==="string"?'""':i==="double"?"0.0":"0"}function Ux(i,e,t){const n=qx(i.rhs);return e==="javascript"?n?`Array.from({ length: ${n[0]} }, () => new Array(${n[1]}).fill(${fm(i.elementType,e)}))`:pm(i.rhs):n?`[[${fm(i.elementType,e)}] * ${We(n[1],t)} for _ in range(${We(n[0],t)})]`:We(pm(i.rhs),t)}function Zg(i,e){const t=i.trim();if(e){const a=Og(t);return a!==void 0?`new Array(${a})`:Pg(t)}const n=kr(t);return n!==void 0?`Math.floor(${Zg(n,!1)})`:Vx(t)}function Qx(i,e,t){const n=i.trim();if(e){const a=Og(n);return a!==void 0?`[None] * ${a}`:We(Pg(n),t)}return Sr(n,t)}function $x(i,e,t,n,a){if(e==="java")return;const s=Mg(i);if(s){const u=Ux(s,e,n);return e==="javascript"?L(t)+`let ${s.name} = ${u}; -`:L(t)+`${s.name} = ${u} -`}const r=Gx(i);if(!r)return;if(e==="javascript")return L(t)+Es(`let ${r.name} = ${Zg(r.rhs,r.isArray)}`)+` -`;const l=!r.isArray&&kr(r.rhs)===void 0&&r.rhs.trim()!=="null"?Nn(r.rhs,n,a):Qx(r.rhs,r.isArray,n);return L(t)+`${r.name} = ${l} -`}function kn(i,e){for(const t of i){e(t),t.loopBody&&kn(t.loopBody,e);for(const n of t.cases??[])kn(n.elements,e)}}function Yx(i){const e=n=>["int","integer","long","short","byte"].includes(n.trim().toLowerCase()),t=new Set;return kn(i.elements,n=>{for(const a of n.textLines){const s=a.trim();if(s==="")continue;if(s.toLowerCase().startsWith("input:")){const l=B0(s.slice(6).trim());l&&e(l.type)&&!l.name.includes("[")&&t.add(l.name);continue}const r=jg(s);if(r&&e(r.rawType)){t.add(r.name);continue}const o=ye(/^\s*(integer|int|long|short|byte)\s+([a-zA-Z_]\w*)\s*=/i,s);o&&t.add(o[2].trim())}}),t}function cl(i,e){const t=r=>/^\d+$/.test(r)||e.has(r),n=String.raw`(?:[a-zA-Z_]\w*|\d+(?:\.\d+)?)`,a=new RegExp(String.raw`(?{const o=r.split(/\s*([*/%])\s*/);if(!o.some(m=>m==="/"))return r;let l=o[0],u=t(o[0]);for(let m=1;mr.replace(a,s).replace(new RegExp("(?t(l)&&t(u)?`${l} = Math.trunc(${l} / ${u})`:o))}function Fs(i){let e=!1;return kn(i.elements,t=>{t.type===S.anweisung&&t.textLines.some(n=>n.trim().toLowerCase().startsWith("input:"))&&(e=!0)}),e}const L0="import java.util.Arrays;";function W0(i){let e=!1,t=!1,n=!1,a=!1;return kn(i.elements,s=>{for(const r of s.textLines)/\bArrays\s*\./.test(r)&&(a=!0),/\bFiles\s*\./.test(r)&&(e=!0),/\bnew\s+(?:File|PrintWriter|FileReader|FileWriter|BufferedReader)\s*\(/.test(r)&&(t=!0),/\bnew\s+Scanner\s*\(\s*new\s+File\b/.test(r)&&(n=!0)}),[...t?["import java.io.*;"]:[],...e?["import java.nio.file.*;"]:[],...n?["import java.util.Scanner;"]:[],...a?[L0]:[]]}function Kx(i){return W0(i).some(e=>e!==L0)}function Lg(i){let e=!1;return kn(i.elements,t=>{t.textLines.some(n=>/\bMath\.random\s*\(/i.test(n))&&(e=!0)}),e}function ka(i,e){const t=i.trim();return t===""?e==="python"?'""':"0":e==="java"||new RegExp("^\\p{N}+$","u").test(t)||Z0(t)?t:'"'+t.replaceAll('"','\\"')+'"'}function ai(i,e){const t=i.trim();if(t==="")return"";switch(e){case"java":return"/* "+t+" */";case"python":return" # "+t;case"javascript":return" /* "+t+" */"}}function Xx(i,e,t,n,a){const s=i.map(r=>r.trim());if(s.every(r=>r==="")){t.live&&(a.out+=L(n)+(e==="python"?"pass":";")+` -`);return}if(t.includeDiagramTextAsComments){const r=s.filter(o=>o!==""&&!rl(o));r.length>0&&(a.out+=D0(r,e,n))}for(const r of s){if(r==="")continue;if(rl(r)){a.out+=t.live?N0(n,t.live):kg(n,e);continue}const o=t.jsIntVariables??new Set,l=t.arrayElementTypes??new Map,u=t.stringVariables??new Set,m=(e==="java"?Dx(r,n,l):void 0)??(e==="javascript"?Bx(r,n,l):void 0)??(e==="python"?Px(r,n,l):void 0)??Mx(r,e,n,o,u)??Ex(r,e,n,o,u)??Jx(r,e,n,o)??$x(r,e,n,o,u)??Ax(r,e,n,o,u);if(m!==void 0){a.out+=e==="javascript"?cl(m,o):m;continue}let c=r;kx(e)?c=Es(e==="javascript"?cl(r,o):r):e==="python"&&(c=Bg(r,o,u)),c!==""&&(a.out+=L(n)+c+` -`)}}function ki(i,e,t,n,a,s,r,o=(l=>(l=a.live)==null?void 0:l.labels.condition)()){if(a.includeDiagramTextAsComments&&(r.out+=D0(t,n,s)),o!==void 0&&F0(t)){r.out+=L(s)+i+o1(o)+e;return}const u=ds(t),m=a.jsIntVariables??new Set,c=n==="python"?We(u,m):n==="javascript"?cl(u,m):u;r.out+=L(s)+i+c+e}function D1(i,e,t,n,a){const s=a.out.length;for(const o of i)Tr(o,e,t,n,a);if(t.live&&a.out.length===s&&(a.out+=N0(n,t.live)),e!=="python")return;a.out.slice(s).split(` -`).map(o=>o.trim()).every(o=>o===""||o.startsWith("#"))&&(a.out+=L(n)+`pass -`)}function e4(i,e){var n;if(e.includeDiagramTextAsComments||i.length!==1)return;const t=i[0];return t.type===S.verzweigung&&(((n=t.cases)==null?void 0:n.length)??0)>=2?t:void 0}function dl(i,e,t,n,a,s){const r=i.cases;if(!r||r.length<2)return;const o=e==="python",l=n+t.indentPerLevel,u=!t.includeEmptyElseBranch&&Ix(r[1].elements),m=u?void 0:e4(r[1].elements,t);if(o){ki(s?"elif ":"if ",`: -`,i.textLines,e,t,n,a),D1(r[0].elements,e,t,l,a),m?dl(m,e,t,n,a,!0):u||(a.out+=L(n)+`else: -`,D1(r[1].elements,e,t,l,a));return}if(ki(s?"} else if (":"if (",`) { -`,i.textLines,e,t,n,a),D1(r[0].elements,e,t,l,a),m){const c=a.out.length;dl(m,e,t,n,a,!0),Eg(t,m,a,c)}else u||(a.out+=L(n)+`} else { -`,D1(r[1].elements,e,t,l,a)),a.out+=L(n)+`} -`}function Tr(i,e,t,n,a){const s=a.out.length;t4(i,e,t,n,a),Eg(t,i,a,s)}function t4(i,e,t,n,a){var m;const s=t.indentPerLevel,r=e==="python",o=(c,d)=>D1(c,e,t,d,a),l=(c,d)=>ki(c,d,i.textLines,e,t,n,a),u=(c=n)=>{t.includeDiagramTextAsComments&&(a.out+=D0(i.textLines,e,c))};switch(i.type){case S.leerElement:a.out+=t.live?N0(n,t.live):kg(n,e);return;case S.anweisung:case S.aufruf:Xx(i.textLines,e,t,n,a);return;case S.aussprung:{const c=ds(i.textLines);i.textLines.some(d=>d.trim()!=="")&&u(),r?a.out+=L(n)+(c===""?`break -`:`break # ${c} -`):a.out+=L(n)+(c===""?`break; -`:`break; // ${c} -`);return}case S.verzweigung:dl(i,e,t,n,a,!1);return;case S.fallauswahl:{const c=i.cases;if(!c||c.length===0)return;if(r&&t.pythonWithoutMatch){const d=`wahl${n/s+1}`;ki(d+" = ",` -`,i.textLines,e,t,n,a),c.forEach((h,g)=>{const f=g===c.length-1;f&&g===0?a.out+=L(n)+"if True:"+ai(h.name,e)+` -`:f?a.out+=L(n)+"else:"+ai(h.name,e)+` -`:a.out+=L(n)+(g===0?"if ":"elif ")+d+" == "+ka(h.name,e)+`: -`,o(h.elements,n+s)});return}ki(r?"match ":"switch (",r?`: -`:`) { -`,i.textLines,e,t,n,a,(m=t.live)==null?void 0:m.labels.selector),c.forEach((d,h)=>{const g=h===c.length-1;if(e==="java"){const f=g?"default -> { "+ai(d.name,e)+` -`:"case "+ka(d.name,e)+` -> { -`;a.out+=L(n+s)+f,o(d.elements,n+s*2),a.out+=L(n+s)+`} -`}else if(r){const f=g?"case _:"+ai(d.name,e):"case "+ka(d.name,e)+":";a.out+=L(n+s)+f+` -`,o(d.elements,n+s*2)}else{const f=g?"default:"+ai(d.name,e):"case "+ka(d.name,e)+":";a.out+=L(n+s)+f+` -`,o(d.elements,n+s*2),a.out+=L(n+s*2)+`break; -`}}),r||(a.out+=L(n)+`} -`);return}case S.forSchleife:if(e==="java"){u();const c=t.live?Wg(i.textLines,t.live.labels):O0(i.textLines);a.out+=L(n)+"for ("+c+`) { -`}else if(r){const c=t.jsIntVariables??new Set,d=Rx(i.textLines,c);if((d==null?void 0:d.rangeLine)!==void 0)u(),a.out+=L(n)+d.rangeLine+` -`;else if(d){u(),a.out+=L(n)+d.init+` -`,a.out+=L(n)+"while "+We(d.condition,c)+`: -`;for(const h of i.loopBody??[])Tr(h,e,t,n+s,a);a.out+=L(n+s)+Bg(d.increment,c)+` -`;return}else t.live?a.out+=L(n)+i4(i.textLines,t.live.labels,c)+` -`:l("for ",`: -`)}else{u();const c=t.live?n4(i.textLines,t.live.labels):Nx(i.textLines);a.out+=L(n)+"for ("+c+`) { -`}o(i.loopBody??[],n+s),r||(a.out+=L(n)+`} -`);return;case S.whileSchleife:l(r?"while ":"while (",r?`: -`:`) { -`),o(i.loopBody??[],n+s),r||(a.out+=L(n)+`} -`);return;case S.doUntilSchleife:{const c=t.live&&F0(i.textLines)?o1(t.live.labels.condition):ds(i.textLines);if(r){a.out+=L(n)+`while True: -`;const d=n+s;o(i.loopBody??[],d),u(d);const h=c.includes(ua)?c:We(c,t.jsIntVariables??new Set);a.out+=L(d)+"if not ("+h+`): -`,a.out+=L(d+s)+`break -`}else a.out+=L(n)+`do { -`,o(i.loopBody??[],n+s),u(),a.out+=L(n)+"} while ("+c+`); -`;return}case S.endlosschleife:{const c=ds(i.textLines),d=c===""||c==="true";d||u(),r?a.out+=L(n)+(d?`while True: -`:`while True: # ${c} -`):a.out+=L(n)+(d?`while (true) { -`:`while (true) /* ${c} */ { -`),o(i.loopBody??[],n+s),r||(a.out+=L(n)+`} -`);return}}}const ua="",E0="",o1=i=>ua+i+E0,N0=(i,e)=>L(i)+o1(e.target==="python"?`pass # ${e.labels.code}`:`// ${e.labels.code}`)+` -`,F0=i=>i.every(e=>e.trim()==="");function Wg(i,e){return F0(i)||i.length===3?[e.start,e.condition,e.step].map((n,a)=>{const s=Ut(i[a]??"");return s===""?o1(n):s}).join("; "):O0(i)}function n4(i,e){const t=Wg(i,e).split(";"),n=t[0].includes(ua)?void 0:_g(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function i4(i,e,t){var h;const[n="",a="",s=""]=i.length===3?i.map(g=>Ut(g)):[],r=ye(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n),o=(r==null?void 0:r[1])??((h=ye(/^\s*([a-zA-Z_]\w*)\s*(?:<=|<|>=|>)/,a))==null?void 0:h[1]),l=r?We(r[2],t):o1(e.start),u=ye(/^\s*(\w+)\s*(<=|<)\s*(.+)$/,a);let m=o1(e.end);u&&(o===void 0||u[1]===o)&&(m=We(u[3],t),u[2]==="<="&&(m=ll(m,1)));const c=o===void 0?void 0:Ag(s,o),d=[l,m,...c!==void 0&&c!==1?[String(c)]:[]];return`for ${o??o1(e.selector)} in range(${d.join(", ")}):`}function hl(i,e=[],t=new Map){return i.forEach((n,a)=>{var r;const s=[...e,a];t.has(n)||t.set(n,s),n.loopBody&&hl(n.loopBody,[...s,0],t),(r=n.cases)==null||r.forEach((o,l)=>hl(o.elements,[...s,l],t))}),t}function Eg(i,e,t,n){const a=i.live,s=a==null?void 0:a.paths.get(e);if(!a||!s||t.out.length===n)return;const r=o=>t.out.slice(0,o).split(` -`).length-1;a.spans.push({path:s,from:r(n),to:r(t.out.length-1)})}function Ng(i,e,t){const n={target:e,labels:t,paths:hl(i.elements),spans:[]},a=C0(i,e,{includeEmptyElseBranch:!0,live:n}),s=Tt(i.caption);let r="";if(e==="java"){const u=W0(i);for(const m of u)r+=m+` -`;Fs(i)?(u.includes("import java.util.Scanner;")||(r+=`import java.util.Scanner; -`),r+=`Scanner scanner = new Scanner(System.in); - -`):u.length&&(r+=` -`),s&&(r+=Ig(s)+` -`)}else{if(s)for(const m of s.params)m.dims||(m.type==="int"&&a.jsIntVariables.add(m.name),m.type==="string"&&a.stringVariables.add(m.name));const u=s==null?void 0:s.params.map(m=>m.name).join(", ");e==="javascript"?(r+=`"use strict"; - -`,r+=ol([i],"javascript"),s&&(r+=`function ${s.name}(${u}) { -`)):(Lg(i)&&(r+=`import random - -`),r+=ol([i],"python"),s&&(r+=`def ${s.name}(${u}): -`))}const o={out:""};D1(i.elements,e,a,s?a.indentPerLevel:0,o),s&&e!=="python"&&(o.out+=`} -`);const l=r.split(` -`).length-1;return{text:Fg((r+o.out).replace(/\n+$/,""),e),spans:n.spans.map(u=>({...u,from:u.from+l,to:u.to+l}))}}function Fg(i,e){switch(e){case"javascript":return r4(ml(i,"javascript")).replace(/\.length\(\)/g,".length").replace(/\.contains\(/g,".includes(");case"python":return a4(ml(i,"python")).replace(/\b([a-zA-Z_]\w*(?:\[[^[\]]*\])?)\.length(?:\(\)|\b)/g,"len($1)");case"java":return u4(i)}}function a4(i){for(let e=0;e<5;e++){const t=Rg(s4(i),"python");if(t===i)break;i=t}return i}const bm={indexOf:"find",lastIndexOf:"rfind",toUpperCase:"upper",toLowerCase:"lower",trim:"strip",startsWith:"startswith",endsWith:"endswith"};function s4(i){return R0(i,["charAt","substring","contains","isEmpty","equalsIgnoreCase","compareTo","repeat","concat",...Object.keys(bm)],(e,t,n)=>{switch(t){case"charAt":return`${e}[${n}]`;case"substring":{const a=o4(n);return a.length===2?`${e}[${a[0].trim()}:${a[1].trim()}]`:`${e}[${n.trim()}:]`}case"contains":return`(${n.trim()} in ${e})`;case"isEmpty":return`(len(${e}) == 0)`;case"equalsIgnoreCase":return`(${e}.lower() == ${n.trim()}.lower())`;case"compareTo":return`((${e} > ${n.trim()}) - (${e} < ${n.trim()}))`;case"repeat":return`(${e} * ${n.trim()})`;case"concat":return`(${e} + ${n.trim()})`;default:return`${e}.${bm[t]}(${n})`}})}function r4(i){for(let e=0;e<5;e++){const t=Rg(R0(i,["isEmpty","equalsIgnoreCase","compareTo","replace"],(n,a,s)=>{switch(a){case"isEmpty":return`(${n}.length === 0)`;case"equalsIgnoreCase":return`(${n}.toLowerCase() === ${s.trim()}.toLowerCase())`;case"compareTo":return`${n}.localeCompare(${s.trim()})`;default:return`${n}.replaceAll(${s})`}}),"javascript");if(t===i)break;i=t}return i}function Rg(i,e){const t=/\bFiles\.readString\(\s*(?:Path\.of|Paths\.get)\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g;return e==="python"?i.replace(t,'open($1, encoding="utf-8").read()').replace(/\bInteger\.parseInt\(/g,"int(").replace(/\bDouble\.parseDouble\(/g,"float(").replace(/\bString\.valueOf\(/g,"str("):i.replace(t,'require("fs").readFileSync($1, "utf8")').replace(/\bInteger\.parseInt\(/g,"parseInt(").replace(/\bDouble\.parseDouble\(/g,"parseFloat(").replace(/\bString\.valueOf\(/g,"String(")}function o4(i){let e=0;const t=[...i].findIndex(n=>n==="("?(e+=1,!1):n===")"?(e-=1,!1):n===","&&e===0);return t<0?[i]:[i.slice(0,t),i.slice(t+1)]}function R0(i,e,t){const n=new RegExp(`([A-Za-z_]\\w*(?:\\[[^[\\]]*\\]|\\.\\w+\\(\\))*|"(?:[^"\\\\]|\\\\.)*")\\.(${e.join("|")})\\(`,"g");let a="",s=0;for(let r=n.exec(i);r;r=n.exec(i)){const o=r.index+r[0].length-1;let l=0,u=-1;for(let c=o;ce.has(n.toLowerCase())?t:`${n}.length()`)}const m4=new Set("abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while true false null var record sealed permits yield module open opens requires exports to uses provides with transitive".split(" "));function _r(i){const e=i.trim();if(e==="")return"Main";let t="";return Array.from(e).forEach((n,a)=>{a===0?new RegExp("\\p{L}","u").test(n)||n==="_"||n==="$"?t+=n:new RegExp("\\p{Nd}","u").test(n)?t+="_"+n:t+="_":/[\p{L}\p{M}\p{N}]/u.test(n)||n==="_"||n==="$"?t+=n:t+="_"}),t=t.replace(/_{2,}/g,"_").replace(/^_+|_+$/g,""),t===""?"Main":(new RegExp("^\\p{Nd}","u").test(t)&&(t="_"+t),m4.has(t.toLowerCase())&&(t="_"+t),t)}function xm(i,e,t={},n=[]){const a={...zg,...t},s=_r(e),r=[i,...n].filter((z,I,T)=>T.indexOf(z)===I).map(z=>({d:z,header:Tt(z.caption)})).filter(z=>z.header!==void 0),o=r.map(z=>sl(z.d,z.header,"java",t,a.indentPerLevel)),l=Tt(i.caption),u=r.some(z=>Fs(z.d)),m=Ws(i,"java",a),c=a.indentPerLevel*2,d=Fs(i),h=d?c4(m):m,g=L(c),f=h.trim()===""?"":h.split(` -`).map(z=>z.trim()===""?g:g+z).join(` -`);let b="";const x=o.length>0&&(d||u),v=[...new Set([i,...r.map(z=>z.d)].flatMap(W0))],w=v.some(z=>z!==L0);(d||u)&&!v.includes("import java.util.Scanner;")&&v.push("import java.util.Scanner;");for(const z of v)b+=z+` -`;v.length&&(b+=` -`),b+=`public class ${s} { -`,x&&(b+=L(a.indentPerLevel)+`static Scanner scanner = new Scanner(System.in); - -`),l||(b+=L(a.indentPerLevel)+`public static void main(String[] args)${w?" throws Exception":""} { -`,d&&!x&&(b+=L(c)+`Scanner scanner = new Scanner(System.in); -`,f!==""&&(b+=` -`)),b+=f,f!==""&&!f.endsWith(` -`)&&(b+=` -`),b+=L(a.indentPerLevel)+`} -`);for(const[z,I]of o.entries())b+=(z>0||!l?` -`:"")+I;return b+=`} -`,b}function c4(i){const e=i.split(` -`);let t=0;for(e[t]==="// import java.util.Scanner;"&&t++;t=e.length?"":e.slice(t).join(` -`)}const Tn={target:"visustruct.codegen.target",javaMode:"visustruct.codegen.javaOutputMode",comments:"visustruct.codegen.includeDiagramComments",emptyElse:"visustruct.codegen.includeEmptyElse"};function Sa(i){try{return localStorage.getItem(i)}catch{return null}}function Ta(i,e){try{localStorage.setItem(i,e)}catch{}}const d4=()=>p("web_run_stopped_loop"),Jg=()=>p("web_run_cancelled"),Re=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function h4(i){let e=0;return i.replace(/^(\s*)while\s*\(\s*true\s*\)(?:\s*\/\*.*?\*\/)?\s*\{/gm,(t,n)=>{const a=`__visuStructLoopGuard${e++}`;return`${n}for (let ${a} = 0; ${a} < 100000 || (() => { throw new Error(${JSON.stringify(d4())}); })(); ${a}++) {`})}function g4(i){return h4(i).replace(/\bprompt\s*\(/g,"await __visuStructPrompt(")}const p4=` -let answer -let lines = [] -// Text von \`process.stdout.write\` ohne neue Zeile (wie \`System.out.print\`). -let partial = '' -const flush = (all) => { - if (all && partial) { - lines.push(partial) - partial = '' - } - if (lines.length) postMessage({ type: 'log', lines }) - lines = [] -} -const send = (type, text) => { - flush(true) - postMessage({ type, text }) -} -const fmt = (a) => (typeof a === 'string' ? a : JSON.stringify(a)) -// Ausgaben gesammelt senden, sonst bremsen viele kleine Nachrichten (z. B. in Endlosschleifen) die Seite aus. -console.log = (...args) => { - lines.push(partial + args.map(fmt).join(' ')) - partial = '' - if (lines.length >= 500) flush() -} -const process = { stdout: { write: (text) => { - const parts = (partial + String(text)).split('\\n') - partial = parts.pop() - lines.push(...parts) - if (lines.length >= 500) flush() -} } } -setInterval(flush, 50) -const __visuStructPrompt = (label) => new Promise((resolve, reject) => { - answer = (value) => (value === null ? reject(new Error(${JSON.stringify(Jg())})) : resolve(value)) - send('prompt', String(label ?? '')) -}) -onmessage = async (e) => { - if (e.data.type === 'answer') return answer && answer(e.data.value) - try { - const AsyncFunction = (async () => {}).constructor - await new AsyncFunction('__visuStructPrompt', e.data.code)(__visuStructPrompt) - send('done') - } catch (err) { - send('error', String(err)) - } -} -`,Xr=2e3;class f4{constructor(e,t,n,a,s=()=>[]){y(this,"element");y(this,"target");y(this,"javaMode");y(this,"comments");y(this,"emptyElse");y(this,"code","");y(this,"codeView");y(this,"javaModeRow");y(this,"runButton");y(this,"saveButton");y(this,"copyButton");y(this,"runner");y(this,"runOutput");y(this,"runInput");y(this,"pseudocodeBox");y(this,"pseudocodeHint");y(this,"worker");y(this,"outputLines",[]);y(this,"droppedLines",0);y(this,"outputFrame");y(this,"pendingAnswer");this.currentDocument=e,this.saveFile=t,this.onClose=n,this.setPseudocode=a,this.subprograms=s;const r=Sa(Tn.target);this.target=r==="python"||r==="javascript"?r:"java",this.javaMode=Sa(Tn.javaMode)==="class"?"class":"snippet",this.comments=Sa(Tn.comments)==="true",this.emptyElse=Sa(Tn.emptyElse)!=="false",this.element=document.createElement("aside"),this.element.className="codepanel",this.build()}refresh(){const e=this.currentDocument(),t=this.options();this.code=this.target==="java"&&this.javaMode==="class"?xm(e,this.classStem(),t,this.subprograms()):Ws(e,this.target,t,this.subprograms()),this.codeView.textContent=this.code,this.javaModeRow.hidden=this.target!=="java",this.saveButton.hidden=this.target!=="java",this.runButton.hidden=this.target!=="javascript"||!!e.pseudocode,this.runButton.hidden&&this.stopRun(!0),this.pseudocodeBox.checked=!!e.pseudocode,this.pseudocodeHint.hidden=!e.pseudocode;for(const n of this.element.querySelectorAll("[data-target]"))n.setAttribute("aria-pressed",String(n.dataset.target===this.target));for(const n of this.element.querySelectorAll("[data-java-mode]"))n.setAttribute("aria-pressed",String(n.dataset.javaMode===this.javaMode))}close(){this.stopRun(!0)}options(){return{includeDiagramTextAsComments:this.comments,includeEmptyElseBranch:this.emptyElse,pseudocodeNote:p("codegen_pseudocode_note")}}classStem(){return Ls(this.currentDocument().caption)||"Main"}build(){this.element.innerHTML=` -
    -

    ${Re(p("codegen_placeholder_title"))}

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

    ${Re(p("codegen_generated_hint"))}

    - `;const e=a=>this.element.querySelector(a);this.codeView=e(".code-view"),this.javaModeRow=e(".java-mode"),this.runButton=e("[data-act=run]"),this.saveButton=e("[data-act=save]"),this.copyButton=e("[data-act=copy]"),this.runner=e(".runner"),this.runOutput=e(".runner-out"),this.runInput=e(".runner-input"),this.pseudocodeBox=e("[data-opt=pseudocode]"),this.pseudocodeHint=e(".pseudocode-hint"),this.pseudocodeBox.addEventListener("change",()=>this.setPseudocode(this.pseudocodeBox.checked)),e(".code-close").addEventListener("click",()=>this.onClose());for(const a of this.element.querySelectorAll("[data-target]"))a.addEventListener("click",()=>{this.target=a.dataset.target,Ta(Tn.target,this.target),this.refresh()});for(const a of this.element.querySelectorAll("[data-java-mode]"))a.addEventListener("click",()=>{this.javaMode=a.dataset.javaMode,Ta(Tn.javaMode,this.javaMode),this.refresh()});const t=e("[data-opt=comments]");t.checked=this.comments,t.addEventListener("change",()=>{this.comments=t.checked,Ta(Tn.comments,String(this.comments)),this.refresh()});const n=e("[data-opt=emptyElse]");n.checked=this.emptyElse,n.addEventListener("change",()=>{this.emptyElse=n.checked,Ta(Tn.emptyElse,String(this.emptyElse)),this.refresh()}),this.copyButton.addEventListener("click",()=>this.copy()),this.saveButton.addEventListener("click",()=>{const a=_r(this.classStem()),s=xm(this.currentDocument(),this.classStem(),this.options());this.saveFile(`${a}.java`,s)}),this.runButton.addEventListener("click",()=>this.run()),e("[data-act=stop]").addEventListener("click",()=>this.stopRun(!1)),e("[data-act=cancel]").addEventListener("click",()=>this.answer(null)),this.runInput.addEventListener("submit",a=>{a.preventDefault(),this.answer(this.runInput.querySelector("input").value)})}async copy(){var t;let e=!1;try{await navigator.clipboard.writeText(this.code),e=!0}catch{const n=document.createRange();n.selectNodeContents(this.codeView);const a=getSelection();a==null||a.removeAllRanges(),a==null||a.addRange(n),e=((t=document.execCommand)==null?void 0:t.call(document,"copy"))??!1}this.copyButton.textContent=p(e?"web_copied_check":"web_copy_manual"),setTimeout(()=>this.copyButton.textContent=p("codegen_copy"),2e3)}run(){this.stopRun(!0),this.runner.hidden=!1,this.runOutput.textContent="",this.outputLines=[],this.droppedLines=0,this.runOutput.classList.remove("error");const e=g4(this.code),t=n=>this.onRunnerMessage(n);try{const n=URL.createObjectURL(new Blob([p4],{type:"text/javascript"})),a=new Worker(n);URL.revokeObjectURL(n),a.onmessage=s=>t(s.data),a.onerror=s=>{s.preventDefault(),t({type:"error",text:s.message||p("web_run_error")})},a.postMessage({type:"run",code:e}),this.worker=a}catch{this.runInPage(e,t)}this.setRunning(!0)}runInPage(e,t){const n={log:(...r)=>t({type:"log",lines:[r.map(o=>typeof o=="string"?o:JSON.stringify(o)).join(" ")]})},a=r=>new Promise((o,l)=>{this.pendingAnswer=u=>u===null?l(new Error(Jg())):o(u),t({type:"prompt",text:r})}),s=(async()=>{}).constructor;new s("__visuStructPrompt","console",e)(a,n).then(()=>t({type:"done"})).catch(r=>t({type:"error",text:String(r)}))}onRunnerMessage(e){switch(e.type){case"log":this.appendOutput(e.lines??[]);break;case"prompt":{this.runInput.hidden=!1,this.runInput.querySelector("label").textContent=e.text??"";const t=this.runInput.querySelector("input");t.value="",t.focus();break}case"error":this.appendOutput([e.text??""]),this.runOutput.classList.add("error"),this.stopRun(!1);break;case"done":this.stopRun(!1);break}}appendOutput(e){this.outputLines.push(...e),this.outputLines.length>Xr&&(this.droppedLines+=this.outputLines.length-Xr,this.outputLines.splice(0,this.outputLines.length-Xr)),this.outputFrame===void 0&&(this.outputFrame=requestAnimationFrame(()=>{this.outputFrame=void 0;const t=this.droppedLines>0?p("web_run_dropped_fmt",this.droppedLines)+` -`:"";this.runOutput.textContent=t+this.outputLines.join(` -`)+(this.outputLines.length?` -`:""),this.runOutput.scrollTop=this.runOutput.scrollHeight}))}answer(e){var t;this.runInput.hidden=!0,this.worker?this.worker.postMessage({type:"answer",value:e}):(t=this.pendingAnswer)==null||t.call(this,e),this.pendingAnswer=void 0}stopRun(e){var t;(t=this.worker)==null||t.terminate(),this.worker=void 0,this.pendingAnswer=void 0,this.runInput&&(this.runInput.hidden=!0),e&&this.runner&&(this.runner.hidden=!0),this.setRunning(!1)}setRunning(e){const t=this.element.querySelector("[data-act=stop]");t&&(t.disabled=!e)}}const b4=["start","end","step"],Gg=(i="i")=>({v:i,start:"0",op:"<",end:"10",step:"1"}),Hg=i=>"ijkmn"[i]??`i${i}`,hs=String.raw`[A-Za-z_]\w*`,Rs=String.raw`-?\d+`;function Vg(i,e="i"){const t=(i.length===1?i[0].split(";"):i).map(c=>c.trim());if(t.every(c=>c===""))return Gg(e);if(t.length!==3)return;const[n,a,s]=t,r=n.match(new RegExp(`^(?:int\\s+)?(${hs})\\s*=\\s*(${Rs})$`));if(!r)return;const o=a.match(new RegExp(`^(${hs})\\s*(<=|>=|<|>)\\s*(${Rs}|mbot\\.\\w+\\(\\)|${hs})$`));if(!o||o[1]!==r[1])return;const l=o[2],u=l==="<"||l==="<=",m=x4(s,r[1]);if(!(!m||m.up!==u))return{v:r[1],start:r[2],op:l,end:o[3],step:m.by}}function x4(i,e){const t=i.replace(/\s+/g,"");if(t===`${e}++`||t===`++${e}`)return{up:!0,by:"1"};if(t===`${e}--`||t===`--${e}`)return{up:!1,by:"1"};const n=t.match(new RegExp(`^${e}(?:([+-])=|=${e}([+-]))(\\d+)$`));if(!(!n||Number(n[3])<=0))return{up:(n[1]??n[2])==="+",by:n[3]}}function J0(i){const e=i.op==="<"||i.op==="<=",t=i.step==="1"?`${i.v}${e?"++":"--"}`:`${i.v} ${e?"+=":"-="} ${i.step}`;return[`int ${i.v} = ${i.start}`,`${i.v} ${i.op} ${i.end}`,t]}function v4(i,e,t){const n=t.trim();switch(b4[e]){case"start":return new RegExp(`^${Rs}$`).test(n)?{...i,start:String(Number(n))}:void 0;case"end":return/^mbot\.\w+\(\)$/.test(n)||new RegExp(`^${hs}$`).test(n)&&n!==i.v?{...i,end:n}:new RegExp(`^${Rs}$`).test(n)?{...i,end:String(Number(n))}:void 0;case"step":return/^\d+$/.test(n)&&Number(n)>0?{...i,step:String(Number(n))}:void 0}}const w4=i=>i.start==="0"&&i.op==="<"&&i.step==="1",y4=(i=10,e="i")=>J0({...Gg(e),end:String(i)});function qg(i,e){const[t,n]=i<=e?[i,e]:[e,i];return`(int) (Math.random() * ${n-t+1}) + ${t}`}const z4=[{id:"add",java:"0 + 0",shape:"round",names:{de:"plus",en:"plus",pt:"mais"}},{id:"sub",java:"0 - 0",shape:"round",names:{de:"minus",en:"minus",pt:"menos"}},{id:"mul",java:"0 * 0",shape:"round",names:{de:"mal",en:"times",pt:"vezes"}},{id:"div",java:"0 / 1",shape:"round",names:{de:"geteilt durch",en:"divided by",pt:"a dividir por"}},{id:"mod",java:"0 % 2",shape:"round",names:{de:"Rest beim Teilen",en:"remainder",pt:"resto da divisão"}},{id:"random",java:qg(1,10),shape:"round",names:{de:"Zufallszahl",en:"random number",pt:"número aleatório"}},{id:"lt",java:"0 < 10",shape:"bool",names:{de:"kleiner als",en:"less than",pt:"menor que"}},{id:"gt",java:"0 > 10",shape:"bool",names:{de:"größer als",en:"greater than",pt:"maior que"}},{id:"eq",java:"0 == 10",shape:"bool",names:{de:"gleich",en:"equals",pt:"igual a"}},{id:"and",java:"true && true",shape:"bool",names:{de:"und",en:"and",pt:"e"}},{id:"or",java:"true || true",shape:"bool",names:{de:"oder",en:"or",pt:"ou"}},{id:"not",java:"!true",shape:"bool",names:{de:"nicht",en:"not",pt:"não"}}],I4=(i,e)=>i.names[e]??i.names.en,k4=i=>/^!|&&|\|\||[<>]=?|==|!=/.test(i.trim()),Ug=()=>/\(int\)\s*\(\s*Math\.random\(\)\s*\*\s*(\d+)\s*\)\s*\+\s*(-?\d+)/g;function Qg(i){const e=[...i.matchAll(Ug())][0];if(!e||e.index!==0||e[0].length!==i.length)return;const t=Number(e[2]);return{from:t,to:t+Number(e[1])-1}}function S4(i,e,t){const n=t.trim();if(!/\s(\+|-|\*|\/|%|<|>|<=|>=|==|!=|&&|\|\|)\s/.test(n)&&!/^\(int\)/.test(n))return!1;const a=i.trimEnd(),s=e.trimStart(),r=a===""||/(^|[^=!<>])=$/.test(a)||/[(,]$/.test(a)||/^(if|while|for|return)$/.test(a),o=s===""||/^[),;]/.test(s);return!(r&&o)}function $g(i,e,t,n){const a=i.slice(0,e),s=i.slice(t),r=S4(a,s,n)?`(${n.trim()})`:n.trim();return a+r+s}const Yg=["int","double","boolean","String","char","long","float"],T4=()=>new RegExp(String.raw`\b(?:${Yg.join("|")})\s+([A-Za-z_]\w*)\s*(?:=|;|$)`,"g");function Kg(i){const e=[];for(const t of i)for(const n of t.matchAll(T4()))e.includes(n[1])||e.push(n[1]);return e}function _4(i,e="zahl"){if(!i.includes(e))return e;let t=2;for(;i.includes(`${e}${t}`);)t++;return`${e}${t}`}const A4=[{id:"declare",java:i=>`int ${i} = 0`,names:{de:"Variable anlegen",en:"make a variable",pt:"criar variável"}},{id:"set",java:i=>`${i} = 0`,names:{de:"setze Variable auf",en:"set variable to",pt:"definir variável para"}},{id:"change",java:i=>`${i} = ${i} + 1`,names:{de:"ändere Variable um",en:"change variable by",pt:"alterar variável em"}}],j4=(i,e)=>i.names[e]??i.names.en;function C4(i,e){const t=new RegExp(String.raw`\b${e}\b`);return i.some(n=>t.test(n.replace(/"(?:[^"\\]|\\.)*"/g,'""')))}const t1=10;function Xg(i){let e=i.replace(/\r/g,"").split(` -`).filter(m=>!m.startsWith("//"));const t=e.filter(m=>/^linie:/.test(m)).map(m=>m.slice(6).trim());e=e.filter(m=>!/^linie:/.test(m));const n=e.findIndex(m=>/^raster:\s*\d+\s*$/.test(m));if(n>=0){const m=Number(e[n].split(":")[1]);e.splice(n,1),e=e.flatMap(c=>Array.from({length:m},(d,h)=>Array.from(c).map(g=>Array.from({length:m},(f,b)=>"^>v<".includes(g)?h===m>>1&&b===m>>1?g:".":g).join("")).join("")))}for(;e.length&&e[e.length-1].trim()==="";)e.pop();for(;e.length&&e[0].trim()==="";)e.shift();const s=Math.max(...e.map(m=>m.length))*t1,r=e.length*t1,o=(m,c)=>({x:-s/2+(m+.5)*t1,y:r/2-(c+.5)*t1}),l={width:s,depth:r,start:{x:0,y:0,heading:0},walls:[],lines:[],blocks:[],marks:[],goals:[],targets:[],colors:[]};let u=0;e.forEach((m,c)=>{Array.from(m).forEach((d,h)=>{const g=o(h,c);d==="#"?l.blocks.push(g):d==="="?l.marks.push(g):d==="Z"?l.goals.push(g):d==="o"?l.targets.push(g):d in vm?l.colors.push({at:g,color:vm[d]}):"^>v<".includes(d)&&(u++,l.start={...g,heading:{"^":0,">":90,v:180,"<":270}[d]})})});for(const m of t)l.lines.push(m.split(/\s+/).map(c=>{const[d,h]=c.split(",").map(Number);if(!Number.isFinite(d)||!Number.isFinite(h))throw new Error(`Linie: „${c}“ ist kein Feld (Spalte,Zeile).`);return o(d,h)}));if(u!==1)throw new Error(`Die Weltkarte braucht genau einen Start (^ > v <), gefunden: ${u}`);return l}const vm={r:"red",g:"green",b:"blue",y:"yellow"},si=(i,e)=>Math.abs(i.x-e.x)<=t1/2&&Math.abs(i.y-e.y)<=t1/2,wm=10,ym=9,D4=300,y1=8,B4=[-3.6,-1.2,1.2,3.6],P4=2.5,O4=20,M4=12,G0=100,Ni={width:200,depth:200,start:{x:0,y:0,heading:0},walls:[],lines:[]},zm=i=>i*Math.PI/180,z1=i=>({x:Math.sin(zm(i)),y:Math.cos(zm(i))}),_a=()=>Array.from({length:hg},()=>{}),Im=([i,e,t])=>i>0||e>0||t>0?[i,e,t]:void 0;class Js{constructor(e=Ni){y(this,"pose");y(this,"trail");y(this,"bumps",0);y(this,"leds",_a());y(this,"screen");y(this,"wheels",[0,0]);y(this,"time",0);y(this,"timerStart",0);y(this,"blocked",!1);y(this,"blockWallCache");this.setup=e,this.pose={...e.start},this.trail=[{x:e.start.x,y:e.start.y}]}reset(){this.pose={...this.setup.start},this.trail=[{x:this.pose.x,y:this.pose.y}],this.bumps=0,this.leds=_a(),this.screen=void 0,this.wheels=[0,0],this.time=0,this.timerStart=0,this.blocked=!1}get allWalls(){const e=this.setup.width/2,t=this.setup.depth/2,n=[{x:-e,y:-t},{x:e,y:-t},{x:e,y:t},{x:-e,y:t}];return[...this.setup.walls,...n.map((a,s)=>({from:a,to:n[(s+1)%4]})),...this.blockWalls]}get blockWalls(){return this.blockWallCache??(this.blockWallCache=(this.setup.blocks??[]).flatMap(e=>{const t=t1/2,n=[{x:e.x-t,y:e.y-t},{x:e.x+t,y:e.y-t},{x:e.x+t,y:e.y+t},{x:e.x-t,y:e.y+t}];return n.map((a,s)=>({from:a,to:n[(s+1)%4]}))})),this.blockWallCache}atGoal(){const e=z1(this.pose.heading),t={x:this.pose.x+e.x*y1,y:this.pose.y+e.y*y1};return(this.setup.goals??[]).some(n=>si(this.pose,n)||si(t,n))||(this.setup.targets??[]).some(n=>si(this.pose,n))}apply(e){switch(e.method){case"forward":return this.wheels=[0,0],this.drive(e.args[0]);case"backward":return this.wheels=[0,0],this.drive(-e.args[0]);case"turnRight":return this.wheels=[0,0],this.turn(e.args[0]);case"turnLeft":return this.wheels=[0,0],this.turn(-e.args[0]);case"stop":this.wheels=[0,0];return;case"drive":this.wheels=[km(e.args[0]),km(e.args[1])];return;case"pause":return this.tick(e.args[0]);case"resetTimer":this.timerStart=this.time;return;case"setLed":this.leds=_a().map(()=>Im(e.args));return;case"ledOff":this.leds=_a();return;case"ledColor":this.leds[e.args[0]]=Im(Cs[e.text??""]??[0,0,0]);return;case"showText":this.screen=e.text;return}}tick(e){if(e<=0)return;this.time+=e;const[t,n]=this.wheels.map(o=>o/100*O4);if(t===0&&n===0)return;const a=Math.ceil(e/10),s=e/1e3/a;let r=!1;for(let o=0;o{const r={x:this.pose.x+e.x*y1+t.x*a,y:this.pose.y+e.y*y1+t.y*a};([...this.setup.marks??[],...this.setup.goals??[]].some(l=>si(r,l))||this.setup.lines.some(l=>L4(r,l)<=P4/2))&&(n|=1<<3-s)}),n}colorUnder(){var n;const e=z1(this.pose.heading),t={x:this.pose.x+e.x*y1,y:this.pose.y+e.y*y1};return(n=(this.setup.colors??[]).find(a=>si(t,a.at)))==null?void 0:n.color}sensors(){const e=this.lineState();return{getDistance:this.distance(),getLine:e,getColor:this.colorUnder()??(e&6?"black":"white"),isLineLeft:(e&4)!==0,isLineRight:(e&2)!==0,getTimer:this.timer}}freeDistance(e,t){let n=1/0;for(const a of this.allWalls){const s=Z4(e,t,a.from,a.to);s!==void 0&&sMath.max(-100,Math.min(100,i));function Sm(i){const e=(i%360+360)%360;return Math.abs(e-360)<1e-9?0:e}function Z4(i,e,t,n){const a={x:n.x-t.x,y:n.y-t.y},s=e.x*a.y-e.y*a.x;if(Math.abs(s)<1e-12)return;const r={x:t.x-i.x,y:t.y-i.y},o=(r.x*a.y-r.y*a.x)/s,l=(r.x*e.y-r.y*e.x)/s;return o>=0&&l>=0&&l<=1?o:void 0}function L4(i,e){let t=1/0;for(let n=0;n+1jr()==="2";function gl(){try{localStorage.setItem(Ar,"2")}catch{}}const tp=()=>jr()==="3";function np(){try{localStorage.setItem(Ar,"3")}catch{}}const N4=()=>jr()!==null;function Ti(i){try{localStorage.setItem(Ar,i==="on"?"1":"0")}catch{}}const ip=`VisuBot`,jn=()=>Si()!=="off",Fi=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function pl(){const i=ep()?"object":tp()?"flow":Si(),e=En(),n=e?[]:[["off","VisuStruct"],["on","VisuBot"],["object","VisuObject"],["flow","VisuFlow"]],a=([o,l])=>``,s={off:"web_visubot_world_visustruct_hint",on:"web_visubot_world_visubot_hint",object:"web_visuobject_world_hint",flow:"web_visuflow_world_hint"}[i],r=n.length?`
    ${n.map(a).join("")}
    `:"";return e?`${r}${ap()}`:`${r} - ${Fi(p(s))}`}function F4(){const i=En();return i==="visubot"?ip:i==="visuobject"?'VisuObject':'VisuStruct'}function R4(){return En()?"":`

    ${Fi(p("web_visubot_world_title"))}

    `}function ap(){const i=Q3(In()),e={visustruct:"VisuStruct",visubot:"VisuBot",visuobject:"VisuObject"}[En()??"visustruct"],t=["VisuStruct","VisuBot","VisuObject","VisuStudio"].filter(n=>n!==e);return`

    VisuCode - ${Fi(p("web_visubot_world_visucode_hint").replace("%1$@",t.slice(0,-1).join(", ")).replace("%2$@",t.at(-1))).replace("visucode.de",`visucode.de`)} - ${Fi(p("web_about_version_fmt").replace("%@","0.15.29"))} · Holger Sebastiao · sebastiao.org

    `}class J4{constructor(e=Ni){y(this,"element");y(this,"world");y(this,"view");y(this,"loading");y(this,"status");y(this,"stage");y(this,"picker");y(this,"applied",0);y(this,"sent",0);y(this,"liveStatus");y(this,"viewport");y(this,"stopListening");y(this,"realSensors");y(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});y(this,"pressTimers",new Map);y(this,"check");y(this,"checking",!1);y(this,"onWorldChange");this.world=new Js(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

    ${p("web_visubot_world")}

    ${p("web_visubot_world_in_preview")}

    ${G4()}${H4()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=be.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=ee(async()=>{const{Robot3D:e}=await import("./robot3d-CJE1N58D.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??Ni,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new Js(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;be.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>be.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&be.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!be.connected)break;const t=e.dataset.sensor,n=await be.ask(Bt[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof Bt[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return be.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await be.ask(Bt[a].python);typeof Bt[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof Bt[a].simulated=="string"?n[a]=typeof s=="string"?s:String(Bt[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){be.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=rp(),this.liveStatus.classList.toggle("connected",be.connected),this.check.hidden=!be.connected,be.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(G0),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&be.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let ri;function sp(i,e){try{ri??(ri=new AudioContext);const t=ri.createOscillator(),n=ri.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(ri.destination);const a=ri.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function G4(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
    🎛 ${p("web_visubot_controls")} -

    ${p("web_visubot_controls_hint")}

    - ${i("getBrightness","web_visubot_sensor_brightness",0,100,50)} - ${i("getLoudness","web_visubot_sensor_loudness",0,100,0)} - ${i("getPitch","web_visubot_sensor_pitch",-90,90,0)} - ${i("getRoll","web_visubot_sensor_roll",-90,90,0)} -
    - ${e("isButtonA","A","web_visubot_sensor_button_a")}${e("isButtonB","B","web_visubot_sensor_button_b")} - ${e("isJoystickUp","↑","web_visubot_sensor_joy_up")}${e("isJoystickDown","↓","web_visubot_sensor_joy_down")} - ${e("isJoystickLeft","←","web_visubot_sensor_joy_left")}${e("isJoystickRight","→","web_visubot_sensor_joy_right")} - ${e("isShaken",`〰 ${p("web_visubot_shake")}`,"web_visubot_sensor_shake")} -
    -
    `}function H4(){const i=a=>a.replace(/"/g,"""),e=(a,s,r,o=1e3)=>``,t="mbot2.EM_stop('ALL')",n=V0.map(a=>`${p(a.key)}…`).join("");return``}function rp(){return be.connecting?p("web_visubot_connecting"):be.connected?`✓ ${p("web_visubot_connected")}`:be.error?`⚠︎ ${p("web_visubot_link_error")}: ${be.error}`:""}async function V4(){if(be.connected||be.connecting)return be.disconnect();try{await be.connect()}catch(i){await be.disconnect(i.name==="NotFoundError"?void 0:i.message)}}const ft=i=>()=>je(S.anweisung,{textLines:[i]}),op=[{key:"web_visubot_el_forward",group:"drive",type:S.anweisung,make:ft("mbot.forward()")},{key:"web_visubot_el_backward",group:"drive",type:S.anweisung,make:ft("mbot.backward()")},{key:"web_visubot_el_right",group:"drive",type:S.anweisung,make:ft("mbot.turnRight()")},{key:"web_visubot_el_left",group:"drive",type:S.anweisung,make:ft("mbot.turnLeft()")},{key:"web_visubot_el_drive",group:"wheels",type:S.anweisung,make:ft("mbot.drive(30, 30)")},{key:"web_visubot_el_stop",group:"wheels",type:S.anweisung,make:ft("mbot.stop()")},{key:"web_visubot_el_led",group:"leds",type:S.anweisung,make:ft("mbot.setLed(255, 0, 0)")},{key:"web_visubot_el_led_off",group:"leds",type:S.anweisung,make:ft("mbot.ledOff()")},{key:"web_visubot_el_led_color",group:"leds",type:S.anweisung,make:ft('mbot.led(0).setColor("grün")')},{key:"web_visubot_el_tone",group:"sound",type:S.anweisung,make:ft("mbot.playTone(440, 300)")},{key:"web_visubot_el_text",group:"screen",type:S.anweisung,make:ft('mbot.showText("Hallo")')},{key:"web_visubot_el_emotion",group:"emotion",type:S.anweisung,make:ft('mbot.emotion("smile")')},{key:"web_visubot_el_wait",group:"wait",type:S.anweisung,make:ft("mbot.pause(100)")},{key:"web_visubot_el_timer",group:"wait",type:S.anweisung,make:ft("mbot.resetTimer()")}];function fl(i){return{drive:"fahren",wheels:"fahren",leds:"licht",sound:"ton",screen:"anzeige",emotion:"anzeige",wait:"warten"}[i]??"sensor"}const H0={drive:"🚗",wheels:"⚙️",leds:"💡",sound:"🔊",screen:"🖥️",emotion:"😊",wait:"⏱️",distance:"📏",line:"➖",color:"🎨",buttons:"🕹️",light:"🔆",tilt:"📐",timer:"🔋"},V0=[{key:"web_visubot_sensor_distance",group:"distance",text:"mbot.getDistance()"},{key:"web_visubot_sensor_line",group:"line",text:"mbot.getLine()"},{key:"web_visubot_sensor_line_left",group:"line",text:"mbot.isLineLeft()"},{key:"web_visubot_sensor_line_right",group:"line",text:"mbot.isLineRight()"},{key:"web_visubot_sensor_color",group:"color",get text(){return`mbot.getColor().equals("${gg("red")}")`}},{key:"web_visubot_sensor_button_a",group:"buttons",text:"mbot.isButtonA()"},{key:"web_visubot_sensor_button_b",group:"buttons",text:"mbot.isButtonB()"},{key:"web_visubot_sensor_joy_up",group:"buttons",text:"mbot.isJoystickUp()"},{key:"web_visubot_sensor_joy_down",group:"buttons",text:"mbot.isJoystickDown()"},{key:"web_visubot_sensor_joy_left",group:"buttons",text:"mbot.isJoystickLeft()"},{key:"web_visubot_sensor_joy_right",group:"buttons",text:"mbot.isJoystickRight()"},{key:"web_visubot_sensor_brightness",group:"light",text:"mbot.getBrightness()"},{key:"web_visubot_sensor_loudness",group:"light",text:"mbot.getLoudness()"},{key:"web_visubot_sensor_pitch",group:"tilt",text:"mbot.getPitch()"},{key:"web_visubot_sensor_roll",group:"tilt",text:"mbot.getRoll()"},{key:"web_visubot_sensor_shake",group:"tilt",text:"mbot.isShaken()"},{key:"web_visubot_sensor_timer",group:"timer",text:"mbot.getTimer()"},{key:"web_visubot_sensor_battery",group:"timer",text:"mbot.getBattery()"}],q4=new Set(V0.map(i=>{var e;return(e=i.text.match(/^mbot\.(\w+)\(\)/))==null?void 0:e[1]}).filter(i=>!!i)),U4=()=>new RegExp(`(${Ug().source})|("(?:[^"\\\\]|\\\\.)*")|(mbot\\.(\\w+)\\(\\))|(\\b\\d+(?:\\.\\d+)?\\b)|\\b(true|false|null)\\b|\\b([A-Za-z_]\\w*)\\b`,"g"),Q4=new Set(["forward","backward","turnRight","turnLeft"]),$4=new RegExp(`\\b(?:${Yg.join("|")})\\s+$`);function q0(i,e){const t=[];for(const n of i.matchAll(U4())){const a=n.index??0,s=a+n[0].length,r=(o,l=!0)=>t.push({start:a,end:s,kind:o,text:n[0],field:l});if(n[1])r("random");else if(n[4])r("str");else if(n[5])q4.has(n[6])?r("sensor"):Q4.has(n[6])&&t.push({start:s-1,end:s-1,kind:"lit",text:"",field:!0});else if(n[7]||n[8])r("lit");else if(n[9]&&e.has(n[9])&&i[a-1]!=="."){const o=$4.test(i.slice(0,a))||/^\s*=(?!=)/.test(i.slice(s));r("var",!o)}}return t}function Y4(i,e){const t=[];for(const n of q0(i,e))!n.field||n.kind==="sensor"||(n.kind==="random"?t.push({hit:n,part:0},{hit:n,part:1}):t.push({hit:n}));return t}const U0=new Set;function K4(i,e,t,n=U0){let a=0;for(let s=0;s{for(const a of n){a.type===S.anweisung&&e.push(...a.textLines),a.loopBody&&t(a.loopBody);for(const s of a.cases??[])t(s.elements)}};return t(i.elements),Kg(e)}const Ri=i=>Kg(Gs(i.elements));function Q0(i,e){var a,s;let t=i.elements,n=0;for(let r=0;ra.trim()!==""))return t;const{depth:n}=Q0(i,[...e.slice(0,-1),Number.MAX_SAFE_INTEGER]);return{...t,textLines:J0(Vg([],Hg(n)))}}function iv(i,e){if(i==="str")return JSON.stringify(e);const t=e.trim().replace(",",".");return/^-?\d+(\.\d+)?$/.test(t)||/^(true|false|null)$/.test(t)?t:void 0}function av(i,e=U0){const t=[],n=Go(i);let a=i;n&&(t.push({kind:"kw",text:n.keyword}),a=n.rest?` ${n.rest}`:"");let s=0;const r=o=>{if(!o)return;const l=t[t.length-1];(l==null?void 0:l.kind)==="text"?l.text+=o:t.push({kind:"text",text:o})};for(const o of q0(a,e)){if(r(a.slice(s,o.start)),o.kind==="random"){const l=Qg(o.text);t.push({kind:"random",text:o.text,from:String(l.from),to:String(l.to)})}else t.push(o.kind==="var"&&!o.field?{kind:"var",text:o.text,fixed:!0}:{kind:o.kind,text:o.text});s=o.end}return r(a.slice(s)),t}const bl=new Map;var Wh,Eh;for(const i of op){const e=(Eh=(Wh=i.make().textLines[0])==null?void 0:Wh.match(/^mbot\.(\w+)/))==null?void 0:Eh[1];e&&!bl.has(e)&&bl.set(e,i.group)}function sv(i){var t;if(i.type!==S.anweisung)return;const e=(t=i.textLines.join(" ").trim().match(/^mbot\.(\w+)/))==null?void 0:t[1];return e?bl.get(e):void 0}const rv=new RegExp(`^(?:${Object.values(H0).map(i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})\\s+(?=mbot\\.)`,"u");function ov(i){let e=!1;const t=a=>a.map(s=>{var o;const r=s.type===S.anweisung?s.textLines.map(l=>l.replace(rv,"")):s.textLines;return r.some((l,u)=>l!==s.textLines[u])&&(e=!0),{...s,textLines:r,loopBody:s.loopBody&&t(s.loopBody),cases:(o=s.cases)==null?void 0:o.map(l=>({...l,elements:t(l.elements)}))}}),n=t(i.elements);return e?{...i,elements:n}:void 0}const oi=i=>i instanceof HTMLElement&&i.dataset.path?JSON.parse(i.dataset.path):void 0,lv=(i,e)=>i.length>=e.length&&e.every((t,n)=>i[n]===t),_m=(i,e)=>{const t=i.getBoundingClientRect();return e{if(!this.enabled||t.target.closest(".bk-input"))return;const n=t.target.closest("[data-value]");if(n&&!this.editing){t.preventDefault(),t.stopPropagation(),this.editField(n);return}const a=t.target.closest("[data-path]");a&&this.options.press(oi(a),t)})}dropAt(e,t,n,a){const s=a??document.elementFromPoint(e,t);if(!s||!this.element.contains(s))return;if(s.closest(".bk-trash"))return n.moving?{kind:"trash"}:void 0;const r=this.rawDrop(s,t,n);return!r||!n.moving||!("path"in r)?r:lv(r.path,n.moving)?void 0:r}rawDrop(e,t,n){var l;const a=e.closest("[data-path]");if(n.sensor){const u=e.closest("[data-value], [data-sensor]");if(u){const c=u.dataset.value?"value":"sensor",{path:d,index:h}=JSON.parse(u.dataset.value??u.dataset.sensor);return{kind:"slot",path:d,slot:c,index:h}}const m=oi(a);return m&&!a.classList.contains("bk-empty")&&n.sensor(m)?{kind:"condition",path:m}:void 0}if(!a)return e.closest(".bk-hat")?{kind:"before",path:[0]}:e.closest(".bk-stack, .blocks-view")?{kind:"rootAppend"}:void 0;const s=oi(a);if(a.classList.contains("bk-empty"))return{kind:"replace",path:s};const r=e.closest(".bk-head, .bk-foot, .bk-clause, .bk-body"),o=r&&r.closest("[data-path]")===a?r:void 0;if(!a.classList.contains("bk-c")||!o)return{kind:_m(a,t)?"before":"after",path:s};if(o.classList.contains("bk-clause"))return this.firstInto(o.nextElementSibling);if(o.classList.contains("bk-body")){const u=[...o.children].filter(c=>c instanceof HTMLElement&&c.dataset.path).pop(),m=oi(u);return m?u.classList.contains("bk-empty")?{kind:"replace",path:m}:{kind:"after",path:m}:void 0}return o.classList.contains("bk-foot")?{kind:"after",path:s}:_m(o,t)?{kind:"before",path:s}:this.firstInto((l=o.parentElement)==null?void 0:l.querySelector(":scope > .bk-body"))}firstInto(e){const t=e==null?void 0:e.firstElementChild,n=oi(t);if(n)return t.classList.contains("bk-empty")?{kind:"replace",path:n}:{kind:"before",path:n}}editField(e){const{path:t,index:n}=JSON.parse(e.dataset.value),a=e.classList.contains("tk-str")?"str":"lit",s=e.textContent??"",r=document.createElement("input");r.className=`bk-input tk-${a}`,r.value=a==="str"?JSON.parse(s):s;const o=()=>r.style.width=`calc(${Math.max(2,r.value.length+1)}ch + 18px)`;o(),r.setAttribute("aria-label",s),r.addEventListener("input",o),this.editing=!0;let l=!1;const u=m=>{if(l)return;l=!0,this.editing=!1;const c=m?iv(a,r.value):void 0;c!==void 0&&c!==s?this.options.editValue(t,n,c):this.pending?this.pending():r.replaceWith(e)};r.addEventListener("keydown",m=>{m.stopPropagation(),m.key==="Enter"?u(!0):m.key==="Escape"&&u(!1)}),r.addEventListener("blur",()=>u(!0)),e.replaceWith(r),r.focus(),r.select()}showDrop(e){var l,u,m;if(this.element.querySelectorAll(".bk-drop").forEach(c=>c.classList.remove("bk-drop")),(l=this.element.querySelector(".bk-drop-line"))==null||l.remove(),(u=this.element.querySelector(".bk-trash"))==null||u.classList.toggle("bk-trash-hot",(e==null?void 0:e.kind)==="trash"),!e||e.kind==="trash")return;if(e.kind==="slot"){const c=JSON.stringify({path:e.path,index:e.index}),d=e.slot==="value"?"data-value":"data-sensor";for(const h of this.element.querySelectorAll(`[${d}]`))h.getAttribute(d)===c&&h.classList.add("bk-drop");return}const t=this.element.querySelector(".bk-stack");if(!t)return;let n,a=!0;if(e.kind==="rootAppend")n=[...t.children].filter(c=>c instanceof HTMLElement&&!!c.dataset.path).pop();else{if(n=(m=this.boxes.find(c=>Mn(c.path,e.path)))==null?void 0:m.el,n&&(e.kind==="replace"||e.kind==="condition")){n.classList.add("bk-drop");return}a=e.kind==="after"}if(!n)return;const s=t.getBoundingClientRect(),r=n.getBoundingClientRect(),o=document.createElement("div");o.className="bk-drop-line",o.style.left=`${r.left-s.left}px`,o.style.top=`${(a?r.bottom:r.top)-s.top-3}px`,o.style.width=`${Math.max(r.width,120)}px`,t.append(o)}setMoving(e){this.element.classList.toggle("bk-moving",e)}render(e,t,n,a=1){if(this.editing){this.pending=()=>this.render(e,t,n,a);return}this.pending=void 0,this.enabled=!n,this.boxes=[],this.forDepth=0,this.vars=new Set(Ri(e)),this.element.style.setProperty("--bk-zoom",String(a)),this.element.classList.toggle("bk-simulating",n);const s=document.createElement("p");s.className="bk-hint",s.textContent=this.options.labels.hint;const r=document.createElement("div");r.className="bk bk-hat";const o=document.createElement("div");o.className="bk-head",o.append(this.word({kind:"kw",text:`🏁 ${this.options.labels.start}`})),r.append(o);const l=document.createElement("div");l.className="bk-stack",l.append(r,...this.list(e.elements,[]));const u=document.createElement("div");u.className="bk-trash",u.textContent=`🗑️ ${this.options.labels.trash}`,this.element.replaceChildren(s,l,u);for(const{path:m,el:c}of this.boxes)t&&Mn(m,t)&&c.classList.add(n?"bk-exec":"bk-sel")}scrollTo(e){const t=this.boxes.find(n=>Mn(n.path,e));t==null||t.el.scrollIntoView({block:"nearest",inline:"nearest"})}list(e,t){return e.map((n,a)=>this.block(n,[...t,a]))}block(e,t){const n=document.createElement("div"),a={path:t,n:0,s:0};if(n.dataset.path=JSON.stringify(t),this.boxes.push({path:t,el:n}),wr(e))return n.className="bk-empty",n.textContent=this.options.labels.empty,n;const s=[...vr(e)];switch(e.type){case S.forSchleife:{n.className="bk bk-c bk-loop";const r=lp(e,this.forDepth),o=r&&w4(r)&&!C4(Gs(e.loopBody??[]),r.v),l=r?o?this.repeatHead(r,a):this.countHead(r,a):this.head(s,a);this.forDepth++;const u=this.body(e.loopBody??[],[...t,0]);this.forDepth--,n.append(l,u,this.foot([],a));break}case S.whileSchleife:case S.endlosschleife:{n.className="bk bk-c bk-loop";const r=e.type===S.endlosschleife?this.keywordHead("endless"):this.head(s,a);n.append(r,this.body(e.loopBody??[],[...t,0]),this.foot([],a));break}case S.doUntilSchleife:n.className="bk bk-c bk-loop",n.append(this.head(["do"],a),this.body(e.loopBody??[],[...t,0]),this.foot(s,a));break;case S.verzweigung:{n.className="bk bk-c bk-if";const r=e.cases??[];n.append(this.head(s,a)),r.forEach((o,l)=>{l>0&&n.append(this.clause(l===1&&r.length===2?this.options.labels.else:o.name)),n.append(this.body(o.elements,[...t,l]))}),n.append(this.foot([],a));break}case S.fallauswahl:n.className="bk bk-c bk-if",n.append(this.head(s,a)),(e.cases??[]).forEach((r,o)=>{n.append(this.clause(r.name.toLowerCase()==="default"?"default":`case ${r.name}`),this.body(r.elements,[...t,o]))}),n.append(this.foot([],a));break;case S.aussprung:n.className="bk bk-cap",n.append(this.head(s,a));break;case S.aufruf:n.className="bk bk-simple bk-call",n.append(this.head(s,a));break;default:{n.className="bk bk-simple bk-stmt";const r=sv(e);if(r){n.dataset.botColor=fl(r);const o=H0[r];o&&(s[0]=`${o} ${s[0]}`)}n.append(this.head(s,a))}}return n}head(e,t){const n=document.createElement("div");n.className="bk-head";for(const a of e){const s=document.createElement("span");s.className="bk-line";for(const r of av(a,this.vars)){if(r.kind==="random"){s.append(this.randomWord(r,t));continue}const o=this.word(this.translated(r));t&&(r.kind==="lit"||r.kind==="str"||r.kind==="var"&&!r.fixed)&&(o.dataset.value=JSON.stringify({path:t.path,index:t.n++})),t&&r.kind==="sensor"&&(o.dataset.sensor=JSON.stringify({path:t.path,index:t.s++})),r.kind==="sensor"&&/^mbot\.is/.test(r.text)&&o.classList.add("tk-bool"),s.append(o)}n.append(s)}return n}randomWord(e,t){const n=this.options.labels,a=document.createElement("span");a.className="tk tk-op";const s=r=>{const o=this.word({kind:"lit",text:r});return t&&(o.dataset.value=JSON.stringify({path:t.path,index:t.n++})),o};return a.append(`${n.randomFrom} `,s(e.from),` ${n.randomTo} `,s(e.to)),a}loopField(e,t,n){const a=/^mbot\./.test(e),s=this.word({kind:a?"sensor":/^[A-Za-z_]/.test(e)?"var":"lit",text:e});return a?s.dataset.sensor=JSON.stringify({path:n.path,index:0}):s.dataset.value=JSON.stringify({path:n.path,index:t}),s}repeatHead(e,t){const n=this.options.labels,a=document.createElement("div");a.className="bk-head";const s=document.createElement("span");return s.className="bk-line",s.append(this.word({kind:"kw",text:n.repeat}),this.word({kind:"text",text:" "}),this.loopField(e.end,1,t),this.word({kind:"text",text:` ${n.repeatTimes}`})),a.append(s),a}countHead(e,t){const n=this.options.labels,a=document.createElement("div");a.className="bk-head";const s=document.createElement("span");s.className="bk-line";const r=(l,u)=>this.loopField(l,u,t),o=e.op==="<"?n.countBelow:e.op===">"?n.countAbove:n.countTo;return s.append(this.word({kind:"kw",text:n.count}),this.word({kind:"text",text:" "}),this.word({kind:"var",text:e.v}),this.word({kind:"text",text:` ${n.countFrom} `}),r(e.start,0),this.word({kind:"text",text:` ${o} `}),r(e.end,1),this.word({kind:"text",text:` ${n.countStep} `}),r(e.step,2)),a.append(s),a}foot(e,t){const n=this.head(e,t);return n.className="bk-foot",n}translated(e){const t=this.options.labels.keywords;if(!t)return e;if(e.kind==="kw")return{...e,text:t[e.text]??e.text};if(e.kind!=="text")return e;if(e.text.trim()==="break"&&t.break)return{kind:"kw",text:t.break};const n=e.text.replace(/&&/g,t["&&"]?` ${t["&&"]} `:"&&").replace(/\|\|/g,t["||"]?` ${t["||"]} `:"||").replace(/!(?!=)/g,t["!"]?`${t["!"]} `:"!").replace(/ {2,}/g," ");return{...e,text:n}}keywordHead(e){var n;const t=document.createElement("div");return t.className="bk-head",t.append(this.word({kind:"kw",text:((n=this.options.labels.keywords)==null?void 0:n[e])??e})),t}clause(e){const t=document.createElement("div");return t.className="bk-head bk-clause",t.append(this.word({kind:"kw",text:e})),t}body(e,t){const n=document.createElement("div");return n.className="bk-body",n.append(...this.list(e,t)),n}word(e){const t=document.createElement("span");return t.className=`tk tk-${e.kind}`,t.textContent=e.text,t}}const mp=["boolean","int","double","String","char","long","float","short","byte"],uv=new Set([...mp,"Boolean","Integer","Double","Character","Long","Float","Short","Byte","var","void"]);function mv(i){if(uv.has(i))return;const e=i.toLowerCase();for(const t of mp)if(cv(e,t.toLowerCase())<=(t.length>=6?2:1))return t}function cv(i,e){const t=Array.from({length:i.length+1},(n,a)=>Array.from({length:e.length+1},(s,r)=>a===0?r:r===0?a:0));for(let n=1;n<=i.length;n++)for(let a=1;a<=e.length;a++){const s=i[n-1]===e[a-1]?0:1;t[n][a]=Math.min(t[n-1][a]+1,t[n][a-1]+1,t[n-1][a-1]+s),n>1&&a>1&&i[n-1]===e[a-2]&&i[n-2]===e[a-1]&&(t[n][a]=Math.min(t[n][a],t[n-2][a-2]+1))}return t[i.length][e.length]}const dv=[">>>=","<<=",">>=",">>>","->","::","++","--","==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","&=","|=","^=","<<"];function hv(i,e){const t=[];let n=0,a=0;const s=(r,o,l,u)=>t.push({kind:r,text:i.slice(o,l),start:o,end:l,line:u});for(;ni.startsWith(d,n))??r;n+=c.length,s("op",o,n,l)}return t}const Aa=new Set(["if","else","for","while","do","switch","case","default","break","return","try"]),eo=new Set(["public","private","protected","static","final","abstract"]),Am="(?:int|long|short|byte|float|double|boolean|char|String)";let gv=class{constructor(e,t,n){y(this,"toks");y(this,"comments");y(this,"i",0);y(this,"problems",[]);y(this,"placeholders",[]);y(this,"lines",new Map);y(this,"className");y(this,"imports",[]);y(this,"fileScanners",new Set);this.src=e,this.labels=t,this.opts=n;const a=hv(e,this.problems);this.toks=a.filter(s=>s.kind!=="comment"),this.comments=a.filter(s=>s.kind==="comment")}get tok(){return this.toks[this.i]}is(e,t=this.tok){return t!==void 0&&t.text===e&&t.kind!=="str"}next(){return this.toks[this.i++]}eat(e){return this.is(e)?this.next():void 0}prev(){return this.toks[this.i-1]}problem(e,t,n){const a=t??{start:this.src.length,end:this.src.length};this.problems.push({from:a.start,to:Math.max(a.end,a.start+1),key:e,arg:n})}missingAfter(e,t){const n=e?e.end:this.src.length;this.problems.push({from:Math.max(0,n-1),to:n,key:"web_parse_missing",arg:t})}text(e,t){let n="",a=e;for(const s of this.comments)s.end<=e||s.start>=t||(n+=this.src.slice(a,Math.max(a,s.start)),a=Math.max(a,s.end));return n+=this.src.slice(a,Math.max(a,t)),n.replace(/\s*\n\s*/g," ").trim()}slot(e,t,n){const a=this.text(e,t);if(a===n){const s=this.src.indexOf(n,e);return s>=0&&this.placeholders.push({from:s,to:s+n.length}),""}return a}record(e,t,n){return this.lines.set(e,[t,n]),{element:e,from:t,to:n}}lineOf(e){var t;return(e==null?void 0:e.line)??((t=this.toks[this.toks.length-1])==null?void 0:t.line)??0}checkImports(){const e=["File","PrintWriter","FileReader","FileWriter","BufferedReader","IOException","FileNotFoundException"].map(t=>[t,"java.io"]);for(const[t,n]of[["Scanner","java.util"],["Arrays","java.util"],["Files","java.nio.file"],["Path","java.nio.file"],["Paths","java.nio.file"],...e]){const a=this.imports.some(r=>r===`import${n}.${t};`||r===`import${n}.*;`),s=this.toks.find((r,o)=>{var l;return r.kind==="id"&&r.text===t&&(t!=="Arrays"&&n!=="java.nio.file"||((l=this.toks[o+1])==null?void 0:l.text)===".")});if(!a&&s){this.problem("web_parse_missing_import",s,n==="java.util"?`import ${n}.${t};`:`import ${n}.*;`);return}}}checkScanners(){var n;const e=new Set(["next","nextInt","nextDouble","nextLine","nextBoolean","nextLong","nextFloat","hasNext","hasNextInt","hasNextLine","hasNextDouble"]),t=a=>this.toks.some((s,r)=>{const o=this.toks[r-1];return s.kind==="id"&&s.text===a&&!!o&&(o.kind==="id"&&!Aa.has(o.text)&&o.text!=="new"||o.text===">"||o.text==="]")});for(let a=0;a{var s;return((s=this.toks[a-1])==null?void 0:s.text)==="class"}).map(n=>n.text));for(let n=0;nthis.toks.some((c,d)=>{var h;return c.text===m&&((h=this.toks[d-1])==null?void 0:h.kind)==="id"&&!Aa.has(this.toks[d-1].text)}),n=["println","print","printf"],a=["length","charAt","substring","indexOf","equals","equalsIgnoreCase","compareTo","contains","startsWith","endsWith","toUpperCase","toLowerCase","trim","isEmpty","split","replace","sqrt","pow","abs","max","min","random","round","parseInt","parseDouble","nextInt","nextDouble","nextLine","next","hasNext","hasNextInt","hasNextLine"],s=(m,c)=>c.find(d=>d!==m&&d.toLowerCase()===m.toLowerCase());for(let m=0;mo.text).join(""));continue}const a=this.classStart();if(a!==void 0){this.className??(this.className=a.name),this.i=a.index;const r=this.parseClassBody();e.push(...r.elements),t??(t=r.caption);continue}const s=this.methodStart();if(s){n&&this.problem("web_parse_more_methods",this.tok);const r=this.parseMethod(s);n||(t=s.caption,e.push(...r)),n=!0;continue}if(this.is("}")){this.problem("web_parse_extra",this.next(),"}");continue}e.push(...this.parseStatement())}return{caption:t,elements:this.finishList(e)}}skipPast(e){for(;this.tok&&!this.is(e);)this.next();this.eat(e)}classStart(){var n,a;let e=this.i;for(;this.toks[e]&&eo.has(this.toks[e].text);)e++;if(((n=this.toks[e])==null?void 0:n.text)!=="class"||((a=this.toks[e+1])==null?void 0:a.kind)!=="id")return;const t=this.toks[e+1].text;for(e+=2;this.toks[e]&&this.toks[e].text!=="{";)e++;return{name:t,index:e+1}}parseClassBody(){let e,t,n=!1;const a=[];for(;this.tok&&!this.is("}");){const s=this.methodStart();if(!s){this.is("{")?a.push(...this.parseBlock().elements):a.push(...this.parseStatement());continue}const r=this.tok,o=this.parseMethod(s);s.name==="main"?e??(e=o):t?n=!0:t={caption:s.caption,body:o},(e&&t||n)&&this.problem("web_parse_more_methods",r)}return this.eat("}"),e?{elements:e}:a.length>0||!t?{elements:a}:{caption:t.caption,elements:t.body}}methodStart(){var g,f,b,x,v,w,z,I,T,k,C;let e=this.i,t=0;for(;this.toks[e]&&eo.has(this.toks[e].text);)e++,t++;const n=this.toks[e];if((n==null?void 0:n.kind)!=="id"||Aa.has(n.text)||n.text==="new")return;for(e++;((g=this.toks[e])==null?void 0:g.text)==="["&&((f=this.toks[e+1])==null?void 0:f.text)==="]";)e+=2;const a=this.toks[e];if((a==null?void 0:a.kind)!=="id"||((b=this.toks[e+1])==null?void 0:b.text)!=="(")return;let s=0,r=e+1;for(;this.toks[r];r++){const P=this.toks[r].text;if(P==="(")s++;else{if(P===")"&&--s===0)break;if(P===";"||P==="{"||P==="}")break}}let o=r+1;if(((x=this.toks[r])==null?void 0:x.text)===")"&&((v=this.toks[o])==null?void 0:v.text)==="throws")for(o++;((w=this.toks[o])==null?void 0:w.kind)==="id"&&(((z=this.toks[o+1])==null?void 0:z.text)===","||((I=this.toks[o+1])==null?void 0:I.text)==="{"||((T=this.toks[o+1])==null?void 0:T.text)===".");)o+=this.toks[o+1].text==="{"?1:2;const l=this.toks[o],u=((k=this.toks[r])==null?void 0:k.text)===")"&&(l==null?void 0:l.text)==="{";if(!u&&!(t>0&&(l===void 0||this.toks[r]===void 0)))return;const m=((C=this.toks[r])==null?void 0:C.text)===")"?this.toks[r].start:this.src.length,c=this.text(this.toks[e+1].end,m),h=`${this.text(n.start,this.toks[e-1].end).replace(/\s+/g,"")} ${a.text}(${c.replace(/\s*,\s*/g,", ")})`;return this.i=Math.min(u?o:r+1,this.toks.length),{name:a.text,caption:a.text==="main"||!Tt(h)?void 0:h}}parseMethod(e){return this.is("{")?this.parseBlock().elements:(this.missingAfter(this.prev(),"{"),[])}parseBlock(){const e=this.next(),t=[];for(;this.tok&&!this.is("}")&&!(this.is("case")||this.is("default"));)t.push(...this.parseStatement());const n=this.eat("}");if(n||this.problem("web_parse_missing",e,"}"),t.length===0){const a=(n==null?void 0:n.start)??this.src.length,s=this.comments.find(r=>r.start>e.end&&r.startn.element)}parseStatement(){const e=this.tok;switch(e.kind==="id"?e.text:""){case"if":return[this.parseIf()];case"while":return[this.parseWhile()];case"do":return[this.parseDo()];case"for":return[this.parseFor()];case"switch":return[this.parseSwitch()];case"try":return this.parseTry();case"break":{this.next();const t=this.eat(";");t||this.missingAfter(e,";");const n=this.trailingComment(t??e);return[this.record(je(S.aussprung,{textLines:[n]}),e.line,e.line)]}case"else":return this.problem("web_parse_else_without_if",this.next()),[];case"case":case"default":for(this.problem("web_parse_case_outside_switch",this.next());this.tok&&!this.is(":")&&!this.is("->")&&!this.is(";");)this.next();return this.next(),[]}return this.is("{")?this.parseBlock().elements:this.is(";")?(this.next(),[this.record(je(S.anweisung),e.line,e.line)]):this.parseSimple()}parseTry(){const e=this.next();let t=e;const n=(r,o)=>{t=this.next();let u=1;for(;this.tok;){const m=this.next();if(t=m,m.kind!=="str"){if(m.text===r)u++;else if(m.text===o&&--u===0)return!0}}return this.missingAfter(t,o),!1};let a=!0;for(this.is("(")&&(a=n("(",")")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{");a&&(this.is("catch")||this.is("finally"));){const r=this.next().text==="catch";t=this.prev(),r&&(this.is("(")?a=n("(",")"):this.missingAfter(t,"(")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{")}const s=this.text(e.start,t.end).replace(/\s+/g," ");return[this.record(je(S.anweisung,{textLines:[s]}),e.line,t.line)]}trailingComment(e){const t=this.comments.find(a=>a.start>=e.end&&a.line===e.line),n=this.toks.find(a=>a.start>=e.end);return!t||n&&n.start1;)m.push("");const c=this.parseBody();return this.record(je(S.forSchleife,{textLines:m,loopBody:c.elements}),e.line,c.end)}parseSwitch(){const e=this.next(),t=this.parenthesized(e,this.labels.selector),n=[];let a=this.lineOf(this.prev());const s=this.eat("{");if(!s)this.missingAfter(this.prev(),"{");else{for(;this.tok&&!this.is("}");){if(!this.is("case")&&!this.is("default")){this.problem("web_parse_case_outside_switch",this.tok),this.parseStatement();continue}n.push(this.parseCase())}const o=this.eat("}");o||this.problem("web_parse_missing",s,"}"),a=this.lineOf(o??this.prev())}n.some(o=>o.isDefault)||n.push({name:"default",elements:[sn()],isDefault:!0});const r=[...n.filter(o=>!o.isDefault),...n.filter(o=>o.isDefault)].map(({name:o,elements:l})=>({name:o,elements:l}));return this.record(je(S.fallauswahl,{textLines:[t.text],cases:r}),e.line,a)}parseCase(){var l;const e=this.next(),t=e.text==="default",n=((l=this.tok)==null?void 0:l.start)??e.end;let a=n;for(;this.tok&&!this.is("->")&&!this.is(":")&&!this.is("{")&&!this.is("}");)a=this.next().end;const s=this.eat("->")??this.eat(":");s||this.missingAfter(this.prev(),"->");let r=t?"default":this.text(n,a),o=[];if((s==null?void 0:s.text)==="->")this.is("{")?(t&&(r=this.trailingComment(this.tok)||r),o=this.parseBlock().elements):this.tok&&!this.is("}")&&(o=this.parseStatement());else{for(t&&s&&(r=this.trailingComment(s)||r);this.tok&&!this.is("case")&&!this.is("default")&&!this.is("}");)o.push(...this.parseStatement());const u=o[o.length-1];(u==null?void 0:u.element.type)===S.aussprung&&u.element.textLines.every(m=>m==="")&&o.pop()}return{name:r,elements:this.finishList(o),isDefault:t}}parseSimple(){const e=this.next();let t=e;const n=e.text==="("||e.text==="["||e.text==="{"?[e.text]:[],a=()=>n.length>0&&n[n.length-1]==="{"&&e.text!=="{";let s;for(;this.tok;){const u=this.tok;if(u.text===";"&&u.kind==="op"&&!a()){s=this.next();break}if(u.line!==t.line&&!a()&&(n.length===0||u.kind==="id"&&Aa.has(u.text)||u.text==="}")||u.text==="}"&&n.length===0)break;(u.text==="("||u.text==="["||u.text==="{")&&n.push(u.text),(u.text===")"||u.text==="]"||u.text==="}")&&n.pop(),t=this.next()}s||this.missingAfter(t,";"),this.checkBrackets(e,t);const r=this.text(e.start,t.end),o=this.simpleElement(r);if(!o)return[];const l=this.record(o.element,e.line,t.line);return l.prompt=o.prompt,[l]}checkBrackets(e,t){const n=[],a={")":"(","]":"[","}":"{"},s={"(":")","[":"]","{":"}"};for(let r=this.toks.indexOf(e);r>=0&&rje(S.anweisung,{textLines:[u]}),a=/^System\.out\.println\s*\(([\s\S]*?)\)?$/.exec(e);if(a){const u=a[1].trim();if(u==="")return{element:n("output: ")};const m=/^"((?:[^"\\]|\\.)*)"$/.exec(u),c=m?pv(m[1]):void 0;return{element:n(`output: ${u}`),prompt:c!==void 0&&!c.includes('"')?c:void 0}}const s=new RegExp(`^(?:(${Am})\\s+)?([A-Za-z_]\\w*(?:\\s*\\[[^\\]]+\\])*)\\s*=\\s*\\w+\\.(nextInt|nextDouble|nextLine|next|nextBoolean)\\s*\\(\\s*\\)$`).exec(e);if(s&&!this.fileScanners.has(e.replace(/^[\s\S]*=\s*(\w+)\.\w+\s*\(\s*\)$/,"$1"))){const u={nextInt:"int",nextDouble:"double",nextLine:"String",next:"String",nextBoolean:"boolean"}[s[3]],m=s[2].replace(/\s+/g,"");if((s[1]===u||!s[1]&&m.includes("["))&&u)return{element:n(`input: ${u} ${m}`)}}const r=new RegExp(`^final\\s+(${Am}\\s+[\\s\\S]*)$`).exec(e);if(r)return{element:n(`const ${r[1]}`)};const o=/^(?:(?:\w+\s+)?\w+\s*=\s*)?([A-Za-z_]\w*)\s*\(/.exec(e);return o&&((l=this.opts.subprograms)!=null&&l.has(o[1]))?{element:je(S.aufruf,{textLines:[e]})}:{element:n(e)}}spansFor(e,t=[],n=[]){return e.forEach((a,s)=>{var l;const r=[...t,s],o=this.lines.get(a);o&&n.push({path:r,from:o[0],to:o[1]}),a.loopBody&&this.spansFor(a.loopBody,[...r,0],n),(l=a.cases)==null||l.forEach((u,m)=>this.spansFor(u.elements,[...r,m],n))}),n}isCodePlaceholder(e){return e.text.startsWith("//")&&e.text.slice(2).trim()===this.labels.code}markPlaceholderComments(){for(const e of this.comments)this.isCodePlaceholder(e)&&this.placeholders.push({from:e.start,to:e.end})}};function pv(i){return i.replace(/\\(.)/g,(e,t)=>({n:` -`,r:"\r",t:" "})[t]??t)}function Ji(i,e,t={}){const n=new gv(i,e,t),{caption:a,elements:s}=n.parseProgram();n.markPlaceholderComments(),n.checkImports(),n.checkScanners(),n.checkTypes(),n.checkCase();const r=n.spansFor(s),o=n.problems.sort((l,u)=>l.from-u.from);return{caption:a,className:n.className,elements:s,spans:r,placeholders:n.placeholders.sort((l,u)=>l.from-u.from),problems:o}}const $0={asClass:!1,withMain:!1},jm=i=>/^import\s+[\w.]+(?:\.\*)?\s*;$/.test(i.trim()),Cm=i=>i.map(e=>e.trim()===""?"":" "+e);function cp(i,e,t=$0){var u;const n=Ng(i,"java",e);let a=n.text.replaceAll(ua,"").replaceAll(E0,"").split(` -`),s=n.spans;const r=m=>s=s.map(c=>({...c,from:c.from+m,to:c.to+m})),o=Tt(i.caption)!==void 0,l=[];if(t.withMain&&!o||t.asClass){for(let m=a.findIndex(jm);m>=0;m=a.findIndex(jm))l.push(a[m].trim()),a.splice(m,1),s=s.map(c=>({...c,from:c.from>m?c.from-1:c.from,to:c.to>m?c.to-1:c.to}));l.length&&((u=a[0])==null?void 0:u.trim())===""&&(a.splice(0,1),s=s.map(m=>({...m,from:m.from>0?m.from-1:m.from,to:m.to>0?m.to-1:m.to}))),l.length&&l.push("")}return t.withMain&&!o&&(a=[`public static void main(String[] args)${Kx(i)?" throws Exception":""} {`,...Cm(a),"}"],r(1)),t.asClass&&(a=[`public class ${_r(o?"Main":i.caption)} {`,...Cm(a),"}"],r(1)),l.length&&(a=[...l,...a],r(l.length)),{text:a.join(` -`),spans:s}}function _i(i,e,t=$0){return cp(i,e,t).text}function to(i){const e=dp(i).code;return(e.trim()===""?i:e).replace(/\s+/g,"")}function dp(i){let e="";for(let t=0;tnew Array(a+1).fill(0));for(let u=n-1;u>=0;u--)for(let m=a-1;m>=0;m--)s[u][m]=t(i[u],e[m])?s[u+1][m+1]+1:Math.max(s[u+1][m],s[u][m+1]);const r=[];let o=0,l=0;for(;o=s[o][l+1])?r.push({kind:"del",a:o++}):r.push({kind:"ins",b:l++});return r}function Bm(i,e,t,n,a={},s=$0){const r=_i(t,n,s),o=_i(e,n,s);if(i===o)return r;const l=o.split(` -`),u=r.split(` -`),m=i.split(` -`),c=new Array(l.length).fill(-1);for(const v of Dm(l,m,(w,z)=>to(w)!==""&&to(w)===to(z)))v.kind==="keep"&&(c[v.a]=v.b);const d=[];let h=0,g="";const f=v=>{for(;hw===z))if(v.kind==="keep")c[v.a]>=0&&(f(c[v.a]+1),g="");else if(v.kind==="del"){const w=c[v.a];if(w<0)continue;f(w),g||(g=dp(m[w]).comment),h=w+1}else{const w=u[v.b];d.push(g&&w.trim()!==""?`${w} ${g}`:w),w.trim()!==""&&(g="")}f(m.length);const b=d.join(` -`),x=Ji(b,n,a);return _i(Gi(t,x),n,s)===r?b:r}function Gi(i,e){let t=e.caption??(Tt(i.caption)?"":i.caption);return!e.caption&&e.className&&_r(t)!==e.className&&(t=e.className),{...i,caption:t,elements:xl(i.elements,e.elements)}}function xl(i,e){return e.map((t,n)=>{const a=i[n];if(!a||a.type!==t.type)return t;const s={...t,zoomX:a.zoomX,zoomY:a.zoomY};return a.textColor&&(s.textColor=a.textColor),a.backgroundColor&&(s.backgroundColor=a.backgroundColor),t.loopBody&&(s.loopBody=xl(a.loopBody??[],t.loopBody)),t.cases&&(s.cases=t.cases.map((r,o)=>{var l,u;return{...r,elements:xl(((u=(l=a.cases)==null?void 0:l[o])==null?void 0:u.elements)??[],r.elements)}})),s})}function hp(){return{start:p("web_visubot_blocks_start"),else:p("web_visubot_blocks_else"),empty:p("web_visubot_blocks_empty"),hint:p("web_visubot_blocks_hint"),trash:p("web_visubot_blocks_trash"),count:p("web_visubot_blocks_count"),countFrom:p("web_visubot_blocks_count_from"),countBelow:p("web_visubot_blocks_count_below"),countTo:p("web_visubot_blocks_count_to"),countAbove:p("web_visubot_blocks_count_above"),countStep:p("web_visubot_blocks_count_step"),repeat:p("web_visubot_blocks_repeat"),repeatTimes:p("web_visubot_blocks_repeat_times"),randomFrom:p("web_visubot_blocks_random_from"),randomTo:p("web_visubot_blocks_random_to"),keywords:{if:p("web_visubot_blocks_if"),while:p("web_visubot_blocks_while"),endless:p("web_visubot_blocks_endless"),do:p("web_visubot_blocks_do"),"!":p("web_visubot_blocks_not"),"&&":p("web_visubot_blocks_and"),"||":p("web_visubot_blocks_or"),break:p("web_visubot_blocks_break")}}}const fv={condition:"Bedingung",selector:"Wert",code:"Dein Code",start:"Startwert",step:"Schritt",end:"Ende"};function gp(i){const e=Ji(i,fv);if(e.problems.length>0||e.elements.length===0)return;const t=Gi({caption:"",elements:[]},e),n=new up({press:()=>{},editValue:()=>{},labels:{...hp(),hint:""}});return n.render(t,void 0,!0),n.element.hidden=!1,n.element.classList.add("bk-picture"),n.element}const Pe=(i,e=!1)=>``,me={newFile:Pe(''),open:Pe(''),save:Pe(''),undo:Pe(''),redo:Pe(''),cut:Pe(''),copy:Pe(''),paste:Pe(''),trash:Pe(''),share:Pe(''),book:Pe(''),code:Pe(''),play:Pe('',!0),step:Pe(''),indent:Pe(''),stop:Pe('',!0),folder:Pe(''),newFolder:Pe(''),diagram:Pe(''),fileText:Pe('')},bv="visustruct.learn.progress",no={"04-sequenz":"05-sequenz","05-variablen-und-datentypen":"04-variablen-und-datentypen","07-verzweigung":"08-verzweigung","08-bedingungen-verknuepfen":"09-bedingungen-verknuepfen","09-fallauswahl":"10-fallauswahl","10-while-schleife":"11-while-schleife","11-do-while-schleife":"12-do-while-schleife","12-for-schleife":"13-for-schleife","13-verschachteln":"14-verschachteln","14-arrays":"15-arrays","15-aufruf-und-aussprung":"18-aufruf-und-aussprung","16-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-suchen-und-sortieren":"19-suchen-und-sortieren","18-suchen-und-sortieren":"19-suchen-und-sortieren","16-simulation-und-schreibtischtest":"07-simulation-und-schreibtischtest","17-java":"20-java","18-java":"20-java","19-java":"20-java","18-python-und-javascript":"21-python-und-javascript","19-python-und-javascript":"21-python-und-javascript","20-python-und-javascript":"21-python-und-javascript","22-erstes-fenster":"28-erstes-fenster","23-knopf-im-fenster":"29-knopf-im-fenster","24-der-knopf-reagiert":"30-der-knopf-reagiert","23-erstes-fenster":"28-erstes-fenster","24-knopf-im-fenster":"29-knopf-im-fenster","25-der-knopf-reagiert":"30-der-knopf-reagiert","26-zahl-verdoppeln":"31-zahl-verdoppeln","27-klickzaehler":"32-klickzaehler","28-ampel":"33-ampel","29-notenrechner":"34-notenrechner","30-taschenrechner":"35-taschenrechner","31-zahlenraten":"36-zahlenraten","13-lautsprecher":"16-lautsprecher","14-bildschirm":"18-bildschirm","15-motoren":"20-motoren","16-stoppuhr-akku":"21-stoppuhr-akku","03-sensoren":"04-sensoren","04-bis-zur-wand":"05-bis-zur-wand","05-abstand":"06-abstand","06-linie":"07-linie","07-farben":"08-farben","08-tasten-joystick":"10-tasten-joystick","09-licht":"11-licht","10-lautstaerke":"12-lautstaerke","11-neigung":"13-neigung","12-leds":"14-leds","13-einzelne-leds":"15-einzelne-leds","14-lautsprecher":"16-lautsprecher","15-bildschirm":"18-bildschirm","16-motoren":"20-motoren","17-stoppuhr-akku":"21-stoppuhr-akku"};function xv(i){var n;const e={...i.lessons};for(const[a,s]of Object.entries(no))i.lessons[a]&&!i.lessons[s]&&(e[s]=i.lessons[a]),i.lessons[a]&&delete e[a];const t=(n=i.view)!=null&&n.lesson&&no[i.view.lesson]?{...i.view,lesson:no[i.view.lesson]}:i.view;return{...i,lessons:e,view:t}}function vv(){try{localStorage.removeItem(bv)}catch{}}const pp=()=>({lessons:{},exercises:{}});vv();let nt=pp();const vl=new Set;function ja(){for(const i of vl)i()}const Pm="visustruct-lernstand";function fp(i,e){return i||e||void 0}function wv(i,e){if(!i)return e;const t={...e.checks};for(const[n,a]of Object.entries(i.checks??{}))t[n]=a||t[n]||!1;return{step:Math.max(i.step??0,e.step??0),done:fp(i.done,e.done),checks:Object.keys(t).length?t:void 0,quiz:i.quiz||e.quiz?{...e.quiz,...i.quiz}:void 0}}function yv(i,e){const t={...i.lessons};for(const[a,s]of Object.entries(e.lessons))t[a]=wv(i.lessons[a],s);const n={...i.exercises};for(const[a,s]of Object.entries(e.exercises)){const r=i.exercises[a];n[a]=r?{done:fp(r.done,s.done),xml:r.xml??s.xml}:s}return{lessons:t,exercises:n}}const ve={lesson(i){return nt.lessons[i]??{step:0}},updateLesson(i,e){nt.lessons[i]={...ve.lesson(i),...e},ja()},exercise(i){return nt.exercises[i]??{}},updateExercise(i,e){nt.exercises[i]={...ve.exercise(i),...e},ja()},resetExercise(i){delete nt.exercises[i],ja()},view(){return nt.view},hasContent(){return Object.values(nt.lessons).some(i=>i.step>0||i.done||i.checks||i.quiz)||Object.keys(nt.exercises).length>0},setView(i){nt.view=i,ja()},onChange(i){return vl.add(i),()=>vl.delete(i)},toFile(){return JSON.stringify({format:Pm,version:1,saved:new Date().toISOString(),lessons:nt.lessons,exercises:nt.exercises,view:nt.view},null,2)},loadFile(i,e=!1){let t;try{t=JSON.parse(i)}catch{return!1}if((t==null?void 0:t.format)!==Pm)return!1;const n=xv({lessons:t.lessons??{},exercises:t.exercises??{},view:t.view});return nt=e?{...yv(nt,n),view:n.view??nt.view}:n,!0},clear(){nt=pp()}};function Om(i=new Date){const e=t=>String(t).padStart(2,"0");return`${i.getFullYear()}-${e(i.getMonth()+1)}-${e(i.getDate())}`}const Mm=i=>/^\d{4}-\d{2}-\d{2}$/.test(i);function zv(i,e){return i.kind!==e.kind?i.kind==="directory"?-1:1:Mm(i.name)&&Mm(e.name)?e.name.localeCompare(i.name):i.name.localeCompare(e.name,void 0,{numeric:!0,sensitivity:"base"})}function Iv(i,e){return i.replace(/\.(visustruct|strk|java)$/i,"").replace(/[\\/:*?"<>|\u0000-\u001f]/g,"-").replace(/\s+/g," ").trim().replace(/^\.+/,"")||e}function kv(i,e){const t=new Set([...e].map(a=>a.toLowerCase())),n=a=>!t.has(`${a}.visustruct`.toLowerCase())&&!t.has(`${a}.java`.toLowerCase());if(n(i))return i;for(let a=2;;a++)if(n(`${i} ${a}`))return`${i} ${a}`}function Sv(i){const e=i.replace(/[\\/:*?"<>|\u0000-\u001f]/g,"").trim();return e&&e!=="."&&e!==".."?e:void 0}const Tv=40,_v=1e5,Av=new Set(["forward","backward","turnLeft","turnRight","stop","drive"]);function jv(i,e,t,n,a){const s=new Wi(i,t),r=[...e],o=new Js(n);let l=0;for(let u=0;u<_v;u++){const{state:m}=s;for(;l0&&o.tick(G0),s.robotSensors={...o.sensors(),...Cv(a,u)};const c=()=>({outputs:[...m.outputLines],files:new Map(m.files),drive:m.robotActions.length?Bs(m.robotActions):void 0,...n?{atGoal:o.atGoal(),bumps:o.bumps}:{},led:o.leds.some(d=>d!==void 0),tone:m.robotActions.some(d=>d.method==="playTone"),screen:o.screen,actions:pg(m.robotActions.filter(d=>!Av.has(d.method)))});if(m.inputRequest){const d=r.shift();if(d===void 0)return{...c(),missingInput:!0};if(s.provideInput(d),m.inputErrorNotice)return{...c(),error:m.inputErrorNotice};continue}if(m.isHalted)return{...c(),error:m.notice};if(!s.canStep)return{...c(),unusedInputs:r.length||void 0};s.step()}return{outputs:[...s.state.outputLines],files:new Map(s.state.files),drive:Bs(s.state.robotActions),tooManySteps:!0}}function Cv(i,e){const t=Math.floor(e/Tv);return Object.fromEntries(Object.entries(i??{}).map(([n,a])=>[n,a[Math.min(t,a.length-1)]]))}function bp(i){return i===void 0||i===""?[]:i.replace(/\n$/,"").split(` -`)}function Ca(i,e){return i.length!==e.length?!1:i.every((t,n)=>Zm(t)===Zm(e[n]))}function Dv(i,e){const t=n=>n.join("").replace(/\s+/g,"");return i.length>0&&i.length{var d,h,g;const s=a.world?n==null?void 0:n(a.world):void 0;if(a.world&&!s)throw new Error(`Weltkarte „${a.world}“ fehlt.`);const r=jv(i,a.inputs,t,s,a.sensors),o=(a.files??[]).every(f=>{var b;return Ca(bp((b=r.files)==null?void 0:b.get(f.name)),f.lines)}),l=!a.drive||Ca(r.drive??[],a.drive),u=!a.world||r.bumps===0&&(!((d=s==null?void 0:s.goals)!=null&&d.length||(h=s==null?void 0:s.targets)!=null&&h.length)||r.atGoal===!0),m=(a.led===void 0||r.led===a.led)&&(a.tone===void 0||r.tone===a.tone)&&(a.screen===void 0||r.screen===a.screen)&&(a.drives===void 0||(((g=r.drive)==null?void 0:g.length)??0)>0===a.drives)&&(!a.actions||Ca(r.actions??[],a.actions)),c=!r.error&&!r.missingInput&&!r.tooManySteps&&Ca(r.outputs,a.expected)&&o&&l&&u&&m;return{test:a,result:r,passed:c}})}function Pv(i){const e=new Set,t=n=>{for(const a of n){e.add(a.type),a.loopBody&&t(a.loopBody);for(const s of a.cases??[])t(s.elements)}};return t(i.elements),e}function wl(i){const e=[S.forSchleife,S.whileSchleife,S.doUntilSchleife,S.endlosschleife];let t=0;for(const n of i){const a=Math.max(wl(n.loopBody??[]),...(n.cases??[]).map(s=>wl(s.elements)));t=Math.max(t,a+(e.includes(n.type)?1:0))}return t}class Hi extends Error{}function Ov(i,e){const t=[],n=[];for(const a of i){const s=a.trim();if(!s)continue;if(s.startsWith("?")){const o=s.slice(1).trim();Hs(o,Mv(t)),n.push(o);continue}const r=/^([A-Za-z_]\w*)\s*:\s*(?:(-?\d+)\s*\.\.\s*(-?\d+)|(boolean))$/.exec(s);if(!r)throw new Hi(`${e}: Unbekannte Zeile im Spiel: „${s}“`);t.push(r[4]?{name:r[1],kind:"boolean"}:{name:r[1],kind:"int",min:Number(r[2]),max:Number(r[3])})}if(!n.length)throw new Hi(`${e}: Das Spiel braucht mindestens eine Zeile „? bedingung“.`);return{vars:t,conditions:n}}function Mv(i){return Object.fromEntries(i.map(e=>[e.name,e.kind==="boolean"?!0:e.min]))}function Zv(i){const e=[],t=/\s*(?:(\d+)|(true|false)\b|([A-Za-z_]\w*)|(&&|\|\||==|!=|<=|>=|<|>|!|\(|\)))/y;let n=0;for(;nt[n],s=d=>{var h;return((h=a())==null?void 0:h.kind)==="op"&&a().value===d},r=()=>{throw new Hi(`Bedingung nicht lesbar: „${i}“`)},o=()=>{const d=t[n++]??r();if(d.kind==="num"||d.kind==="bool")return d.value;if(d.kind==="name"){if(!(d.value in e))throw new Hi(`Unbekannte Variable „${d.value}“ in „${i}“`);return e[d.value]}if(d.value==="("){const h=m();return s(")")||r(),n++,h}if(d.value==="!"){const h=o();return typeof h!="boolean"&&r(),!h}return r()},l=()=>{const d=o(),h=a();if((h==null?void 0:h.kind)==="op"&&["==","!=","<","<=",">",">="].includes(h.value)){n++;const g=o();switch(h.value){case"==":return d===g;case"!=":return d!==g}(typeof d!="number"||typeof g!="number")&&r();const[f,b]=[d,g];return h.value==="<"?f"?f>b:f>=b}return d},u=()=>{let d=l();for(;s("&&");){n++;const h=l();d=d&&h}return d},m=()=>{let d=u();for(;s("||");){n++;const h=u();d=d||h}return d},c=m();return n!==t.length||typeof c!="boolean"?r():c}function Lv(i,e){const t=[i],n=i.replace(/\b[A-Za-z_]\w*\b/g,r=>r in e?String(e[r]):r);n!==i&&t.push(n);const a=n.replace(/(-?\d+|true|false)\s*(==|!=|<=|>=|<|>)\s*(-?\d+|true|false)/g,r=>String(Hs(r,{})));a!==t[t.length-1]&&t.push(a);const s=String(Hs(i,e));return s!==t[t.length-1]&&t.push(s),t}function Wv(i,e){const t=[],n=new RegExp(`\\b${e}\\s*(?:==|!=|<=|>=|<|>)\\s*(-?\\d+)|(-?\\d+)\\s*(?:==|!=|<=|>=|<|>)\\s*${e}\\b`,"g");for(const a of i.matchAll(n)){const s=Number(a[1]??a[2]);t.push(s-1,s,s+1)}return t}function Ev(i,e,t,n=Math.random){const a=i.conditions.length,s=Math.floor(e*a/t),r=Math.min(a-1,s+(n()<.5?0:1)),o=i.conditions[r],l={};for(const u of i.vars){if(u.kind==="boolean"){l[u.name]=n()<.5;continue}const m=Wv(o,u.name).filter(c=>c>=u.min&&c<=u.max);l[u.name]=m.length&&n()<.6?m[Math.floor(n()*m.length)]:u.min+Math.floor(n()*(u.max-u.min+1))}return{condition:o,values:l,answer:Hs(o,l)}}function Nv(i){return Object.entries(i.values).filter(([e])=>new RegExp(`\\b${e}\\b`).test(i.condition))}const Fv=`--- -titel: Was ist ein Struktogramm? -bereich: Erste Schritte -kurz: Algorithmen als Folge klarer Schritte darstellen und lesen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Algorithmus ist -- ein Struktogramm lesen -- die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen -::: - -## Ein Algorithmus ist eine genaue Anleitung - -Ein **Algorithmus** beschreibt Schritt für Schritt, wie man eine Aufgabe löst. Jeder Schritt muss so eindeutig sein, dass ihn jemand ohne Nachfragen ausführen kann, ein Mensch genauso wie ein Computer. - -Du kennst Algorithmen aus dem Alltag: ein Kochrezept, eine Wegbeschreibung oder die Anleitung für einen Schrank. - -::: diagramm l1-tee.visustruct -Tee kochen als Struktogramm: Jeder Kasten ist ein Schritt. -::: - -::: angeberwissen -Määäh, wer hat das erste Programm geschrieben? Eine Frau, und zwar schon 1843, lange vor dem ersten Computer! **Ada Lovelace** beschrieb Schritt für Schritt, wie die *Analytical Engine* (Analytische Maschine) von Charles Babbage die sogenannten Bernoulli-Zahlen ausrechnen sollte. Das war ein echter Algorithmus für eine Maschine. Die Befehle sollten auf Lochkarten stehen (mehr dazu in Lektion 3). Gebaut wurde die Maschine allerdings nie. - -Ada hatte noch eine geniale Idee: Eine solche Maschine kann mehr als rechnen. Sie könnte auch mit Buchstaben, Zeichen oder sogar Musik arbeiten. Genau das machen Computer heute. Ihr zu Ehren heißt eine Programmiersprache **Ada**. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), Mathematikerin (Bild: Aquarell von Alfred Edward Chalon, um 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), gemeinfrei). -::: - -## So liest du ein Struktogramm - -Ein Struktogramm wird **von oben nach unten** gelesen. Jeder Kasten ist ein Schritt. Erst wenn ein Schritt fertig ist, kommt der nächste dran. - -Die Darstellung stammt von **Isaac Nassi und Ben Shneiderman** (1973). Deshalb heißt sie auch Nassi-Shneiderman-Diagramm. In Deutschland ist sie als DIN 66261 genormt. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -Links Isaac „Ike“ Nassi (Foto: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/deed.de), zugeschnitten), rechts Ben Shneiderman (Foto: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> Ein Struktogramm hat immer genau einen Anfang (oben) und ein Ende (unten). Es gibt keine Pfeile und keine Sprünge kreuz und quer. Programme, die kreuz und quer springen, nennt man **Spaghetticode**, weil sich ihr Ablauf verheddert wie Nudeln auf dem Teller. Mehr dazu in der nächsten Lektion. - -::: angeberwissen -Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der Stony Brook University bei New York, Shneiderman etwa 25 und Nassi etwa 23. Also quasi zwei Studis, die nebenbei Informatikgeschichte geschrieben haben. -::: - -## Baustein 1: Die Sequenz - -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: **Sequenz**, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen: [Anweisungen]{.gelb} sind gelb, Verzweigungen blau, Schleifen rosa. Die Sequenz hat keine eigene Farbe, sie ist einfach die Reihe von Anweisungen untereinander. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. - -Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. - -So sieht sie aus: - -- Jede Anweisung ist ein **einfaches Rechteck**. -- Die Rechtecke stehen ohne Lücke **untereinander**. -- Ausgeführt wird von oben nach unten, eine Anweisung nach der anderen. - -::: diagramm l1-sequenz.visustruct -Vier Anweisungen als Sequenz. Erst wird aufgestanden, dann Zähne geputzt und so weiter. -::: - -> Auch das Tee-Beispiel von oben ist eine Sequenz. - -::: angeberwissen -15 Minuten! So lange hat Shneiderman für die erste Skizze mit Sequenz, Verzweigung und Schleife gebraucht. Ich brauche länger, um mich zwischen Heu und Klee zu entscheiden. -::: - -## Baustein 2: Die Verzweigung - -Oft hängt der nächste Schritt von einer **Bedingung** ab. Eine Bedingung ist eine Frage, die man nur mit **ja oder nein** beantworten kann, zum Beispiel *Regnet es?* In VisuStruct heißt ja **true** (wahr) und nein **false** (falsch). - -Für solche Entscheidungen gibt es die **Verzweigung**. So sieht sie aus: - -- Oben steht die Bedingung in einem **Dreieck**. -- Darunter teilt sich der Kasten in **zwei Spalten**: links der Weg für **true**, rechts der Weg für **false**. -- Es wird **immer nur einer** der beiden Wege ausgeführt. Danach geht es unter der Verzweigung für beide gemeinsam weiter. - -::: diagramm l1-verzweigung.visustruct -Regnet es, wird der linke Weg ausgeführt, sonst der rechte. Danach geht es in beiden Fällen mit „Losgehen“ weiter. -::: - -> Soll in einem Fall nichts passieren, bleibt dieser Weg leer. Das zeigt das Zeichen **ø**. - -::: angeberwissen -Rechtschreib-Alarm! Es heißt Shneiderman, ohne c. Wer „Schneiderman“ schreibt, bekommt von mir einen sanften Hornstupser. Er selbst weist übrigens darauf hin, dass ihm ständig ein c untergeschmuggelt wird. -::: - -## Baustein 3: Die Wiederholung - -Soll etwas **mehrmals** passieren, schreibt man es nicht mehrmals hin. Stattdessen benutzt man eine **Wiederholung**, auch **Schleife** genannt. - -So sieht sie aus: - -- Oben steht die Bedingung, zum Beispiel *Teller nicht leer*. -- Die Schritte, die wiederholt werden, stehen **eingerückt** darunter. Oben und links bildet der Kasten ein **gekipptes L** um sie. -- Vor jedem Durchlauf wird die Bedingung geprüft. Solange sie **true** ist, werden die Schritte im gekippten L noch einmal ausgeführt. Ist sie **false**, geht es unter der Schleife weiter. - -::: diagramm l1-wiederholung.visustruct -Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Teller abgeräumt. -::: - -> Es gibt noch weitere Arten von Schleifen. Du lernst sie in späteren Lektionen kennen. - -## Alle drei zusammen - -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine Sequenz von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen [Anweisungen]{.gelb}. Auch die Anweisungen in einer Verzweigung oder Schleife sind gelb. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. - -::: diagramm l1-grundbausteine.visustruct -Die Verzweigung erkennst du am Dreieck, die Schleife am gekippten L. Alles zusammen steht in einer Sequenz. -::: - -Die Kästen können auch **ineinander geschachtelt** werden: In einer Schleife oder einem Zweig können wieder Sequenzen, Verzweigungen und Schleifen stehen. - -::: angeberwissen -Trostpflaster für alle mit einer verpatzten Arbeit: Die berühmte Fachzeitschrift *Communications of the ACM* hat den Struktogramm-Artikel abgelehnt. Laut Nassi meinte der Gutachter sogar, sie sollten alle Exemplare einsammeln und verbrennen. Autsch! Er erschien 1973 dann in einem kleineren Heft und wird heute tausendfach zitiert. Ätsch! -::: - -## Erst die Struktur, dann der Code - -Beim Programmieren passieren zwei Dinge gleichzeitig: Du musst dir den Ablauf überlegen und die Schreibweise der Programmiersprache beachten. Mit einem Struktogramm trennst du beides. - -1. Du denkst zuerst über die **Logik** nach: Welche Schritte, welche Bedingungen, welche Wiederholungen? -2. Danach übersetzt du die fertige Struktur in **Java, Python oder JavaScript**. VisuStruct kann dir den Code sogar erzeugen. - -Mit der **Simulation** kannst du dein Struktogramm außerdem Schritt für Schritt ausführen und prüfen, ob es wirklich tut, was es soll. - -## Spiel: Welcher Baustein? - -::: spiel frage -titel: Spiel: Welcher Baustein? -intro: Ludwig beschreibt Dinge aus seinem Alltag. Welcher der drei Bausteine steckt darin? Acht Runden. -antworten: Sequenz | Verzweigung | Wiederholung - -runde: -frage: „Zahnpasta auf die Bürste, Zähne putzen, Mund ausspülen.“ -richtig: Sequenz -> Drei Schritte, jeder genau einmal und immer in dieser Reihenfolge. - -runde: -frage: „Wenn es regnet, nimm den Schirm mit, sonst die Sonnenbrille.“ -richtig: Verzweigung -> Eine Bedingung entscheidet, welcher der zwei Wege genommen wird. - -runde: -frage: „Rühre, bis der Teig glatt ist.“ -richtig: Wiederholung -> Das Rühren wird wiederholt, solange der Teig noch nicht glatt ist. - -runde: -frage: „Laufe zehn Runden um den Sportplatz.“ -richtig: Wiederholung -> Dieselbe Runde wird zehnmal gelaufen. - -runde: -frage: „Schuhe an, Jacke an, Tür auf, losgehen.“ -richtig: Sequenz -> Ein Schritt nach dem anderen, nichts wird übersprungen oder wiederholt. - -runde: -frage: „Ist die Ampel grün, gehst du über die Straße.“ -richtig: Verzweigung -> Auch ohne „sonst“ ist es eine Verzweigung. Der Sonst-Zweig ist einfach leer. - -runde: -frage: „Würfle so lange, bis du eine Sechs hast.“ -richtig: Wiederholung -> Du weißt vorher nicht, wie oft. Gewürfelt wird, bis die Bedingung erfüllt ist. - -runde: -frage: „Sagt jemand ‚Herein‘, gehst du hinein. Sonst wartest du vor der Tür.“ -richtig: Verzweigung -> Die Antwort entscheidet zwischen zwei Wegen: hineingehen oder warten. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Algorithmus ist. → Ein Algorithmus ist eine genaue Anleitung -- Ich kann ein Struktogramm von oben nach unten lesen. → So liest du ein Struktogramm -- Ich kann die drei Grundbausteine Sequenz, Verzweigung und Wiederholung nennen. → Baustein 1: Die Sequenz -- Ich kann jeden Baustein im Struktogramm an seiner Form erkennen. → Alle drei zusammen -::: - -## Wissenstest - -::: quiz -? In welcher Richtung wird ein Struktogramm gelesen? -→ So liest du ein Struktogramm -- [ ] Von links nach rechts -- [x] Von oben nach unten -- [ ] Von unten nach oben -> Jeder Kasten ist ein Schritt, und die Schritte folgen von oben nach unten aufeinander. - -? Welcher Baustein gehört NICHT zu den drei Grundbausteinen? -→ Baustein 1: Die Sequenz -- [ ] Sequenz -- [ ] Verzweigung -- [x] Sprung -- [ ] Wiederholung -> Sprünge gibt es im Struktogramm nicht. Sequenz, Verzweigung und Wiederholung reichen für jeden Algorithmus. - -? Woran erkennst du im Struktogramm eine Verzweigung? -→ Alle drei zusammen -- [ ] An einem gekippten L -- [x] An einem Dreieck mit der Bedingung und zwei Spalten darunter -- [ ] An mehreren Rechtecken untereinander -> Das gekippte L gehört zur Schleife, Rechtecke untereinander sind eine Sequenz. - -? Wann wird der Inhalt einer Schleife noch einmal ausgeführt? -→ Alle drei zusammen -- [x] Solange die Bedingung true ist -- [ ] Nur, wenn die Bedingung false ist -- [ ] Immer genau zweimal -> Vor jedem Durchlauf wird die Bedingung geprüft. Ist sie false, geht es unter der Schleife weiter. - -? Was ist ein Algorithmus? -→ Ein Algorithmus ist eine genaue Anleitung -- [x] Eine eindeutige Schritt-für-Schritt-Anleitung zum Lösen einer Aufgabe -- [ ] Ein bestimmtes Programm in Java -- [ ] Ein Bild, das ein Programm erklärt -> Ein Algorithmus ist unabhängig von der Programmiersprache. Ein Struktogramm ist eine Möglichkeit, ihn aufzuschreiben. -::: -`,Rv=`--- -titel: PAP und Pseudocode -bereich: Erste Schritte -kurz: Algorithmen als Programmablaufplan und als Pseudocode darstellen und mit dem Struktogramm vergleichen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen PAP (englisch *flowchart*) lesen und selbst zusammenbauen -- erklären, warum Sprünge im PAP zu Fehlern führen -- einen einfachen Algorithmus als Pseudocode lesen -::: - -## Andere Darstellungen: Der PAP - -Es gibt noch zwei weitere Arten, Algorithmen darzustellen: den **Programmablaufplan**, kurz **PAP**, und den **Pseudocode**. Beide wirst du im Unterricht treffen. Auf Englisch heißt der PAP **flowchart**, auf Deutsch auch Flussdiagramm. Das englische Wort begegnet dir oft, zum Beispiel in Programmen und im Internet. - -Hier siehst du noch einmal unser Struktogramm zum Teetrinken aus der letzten Lektion. Als Nächstes schauen wir uns den PAP an, und zwar mit demselben Beispiel. - -::: diagramm l1-grundbausteine.visustruct -Das Tee-Beispiel als Struktogramm: erst die Tasse, dann die Verzweigung für den Zucker, dann die Schleife. -::: - -### Derselbe Algorithmus als PAP - -::: grafik l01-pap.svg -Das Tee-Beispiel als Programmablaufplan. Der Pfeil von „1 Minute warten“ zurück nach oben bildet die Schleife. -::: - -### Die Elemente - -Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. - -- **Oval:** Start oder Ende. Jeder PAP hat genau einen Start und ein Ende. -- **Rechteck:** eine Anweisung, zum Beispiel *Tasse auf den Tisch stellen*. -- **Raute:** eine Verzweigung. In der Raute steht eine Frage, heraus führen zwei Pfeile: **ja** und **nein**. -- **Parallelogramm:** eine Ein- oder Ausgabe. Im Tee-Beispiel kommt sie nicht vor. -- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. - -Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie daran, dass ein Pfeil **zurück nach oben** führt. - -### Die Vorteile - -- **Sehr gut lesbar**, auch für Leute, die noch nie einen PAP gesehen haben. Man folgt einfach den Pfeilen mit dem Finger. -- Flussdiagramme benutzt man nicht nur beim Programmieren, sondern überall, wo ein Ablauf erklärt wird: in Bedienungsanleitungen, bei der Fehlersuche („Leuchtet die Lampe? Nein: Steckt der Stecker?“) oder in Firmen für Arbeitsabläufe. - -## Übung: Kuchen backen als PAP - -Jetzt baust du selbst einen PAP. Ludwig backt einen Kuchen und geht so vor: - -Er gibt die Zutaten in die Schüssel und rührt den Teig. Ist der Teig noch nicht glatt, rührt er weiter. Ist er glatt, füllt er den Teig in die Form und backt den Kuchen 30 Minuten. Dann prüft er mit einem Holzstäbchen: Klebt noch Teig daran, backt er 5 Minuten weiter und prüft noch einmal. Ist das Stäbchen sauber, nimmt er den Kuchen heraus und ruft: „Der Kuchen ist fertig!“ - -::: pap -titel: Übung: Kuchen backen als PAP -auftrag: Die Plätze im Plan sind leer. Lege jedes Element an seinen Platz. Die Form des Platzes hilft dir. -start: Start -anweisung: Zutaten in die Schüssel geben -anweisung: Teig rühren -frage: Teig glatt? | nein -> Teig rühren -anweisung: Teig in die Form füllen -anweisung: Kuchen 30 Minuten backen -frage: Stäbchen sauber? | nein: 5 Minuten weiterbacken -anweisung: Kuchen herausnehmen -ausgabe: „Der Kuchen ist fertig!“ -ende: Ende -erklärung: Zwei Schleifen, zwei Pfeile zurück nach oben: Beim Rühren führt der Pfeil zurück zu „Teig rühren“, beim Backen von „5 Minuten weiterbacken“ zurück zur Frage. Die Ausgabe steht im Parallelogramm. -legende: ja -::: - -**Eigene PAPs zeichnen:** Mit **VisuFlow** zeichnest du deinen PAP ganz leicht selbst. Die Symbole liegen fertig in einer Leiste: Antippen hängt das nächste Symbol an und verbindet es gleich mit einem Pfeil. Zum Start kannst du das Tee-Beispiel laden. Deinen PAP speicherst du als Datei und exportierst ihn als Bild oder PDF, zum Beispiel für dein Heft oder eine Präsentation. [VisuFlow öffnen](https://visustruct.visucode.de/app/?visuflow) - -## Nachteile des PAP: Sprünge - -Ein Pfeil im PAP darf von jedem Symbol zu jedem anderen führen. Das klingt praktisch, ist aber gefährlich. - -Früher hat man Programme genau so geschrieben. Jede Zeile hatte eine **Nummer**, und der Befehl **GOTO**, auf Deutsch „gehe zu“, sprang zu einer Zeilennummer. Jedes GEHE ZU ist ein Pfeil aus dem PAP. Unser Tee-Beispiel sähe so aus: - -\`\`\` -10 Tasse auf den Tisch stellen -20 WENN kein Zucker gewünscht, GEHE ZU 40 -30 Zucker hineingeben -40 WENN Tee nicht zu heiß, GEHE ZU 70 -50 1 Minute warten -60 GEHE ZU 40 -70 Tee trinken -\`\`\` - -### Eine Zeile mehr, und schon springt es falsch - -Jetzt verbesserst du den Algorithmus: Nach dem Zucker soll der Teebeutel heraus. Du fügst die neue Zeile 40 ein, und alle Zeilen darunter rutschen eine Nummer weiter. Die Sprünge zeigen aber noch auf die alten Nummern: - -\`\`\` -10 Tasse auf den Tisch stellen -20 WENN kein Zucker gewünscht, GEHE ZU 40 -30 Zucker hineingeben -40 Teebeutel herausnehmen -50 WENN Tee nicht zu heiß, GEHE ZU 70 -60 1 Minute warten -70 GEHE ZU 40 -80 Tee trinken -\`\`\` - -Spiel es durch: Zeile 70 schickt dich nicht mehr zur Prüfung in Zeile 50, sondern zum Teebeutel. Und wenn der Tee kühl genug ist, springt Zeile 50 zu Zeile 70 und nicht mehr zu *Tee trinken*. Du nimmst also immer wieder den Teebeutel heraus und trinkst nie. Bei jeder Änderung musst du jedes GEHE ZU prüfen. In einem großen Programm mit Hunderten Sprüngen geht dabei leicht etwas schief. - -### Kreuz und quer: Spaghetticode - -Mit Pfeilen kann man auch mitten aus einer Schleife herausspringen oder von außen mitten in eine Schleife hinein. Solche **Aussprünge** und Einsprünge machen den Plan schnell unübersichtlich. Bei vielen Sprüngen kreuzen sich die Pfeile, bis der Plan aussieht wie ein Teller Spaghetti. Deshalb nennt man das **Spaghetticode**. Den Ablauf kann man kaum noch verfolgen, und Fehler verstecken sich gut. - -Im Struktogramm gibt es keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit, und kein Sprung kann auf die falsche Stelle zeigen. Für das vorzeitige Verlassen einer Schleife gibt es dort einen eigenen, ordentlichen Kasten, den Aussprung. Den lernst du in Lektion 18 kennen. - -::: angeberwissen -1968 schrieb der Informatiker Edsger Dijkstra einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist \`goto\` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. -::: - -## Pseudocode und Vergleich - -**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Sprünge gibt es auch hier nicht. Das ist unser Tee-Beispiel: - -\`\`\` -Tasse auf den Tisch stellen -WENN Zucker gewünscht DANN - Zucker hineingeben -ENDE WENN -SOLANGE Tee noch zu heiß - 1 Minute warten -ENDE SOLANGE -Tee trinken -\`\`\` - -Pseudocode hat **keine feste Schreibweise**. Manche schreiben FALLS statt WENN, andere setzen einen Pfeil für die Zuweisung (\`zahl ← 5\`) oder schreiben ganz ohne ENDE-Zeilen. Das ist alles erlaubt. Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. Pseudocode ist also keine weitere Programmiersprache, die man lernen muss. - -::: angeberwissen -Kommt dir Pseudocode bekannt vor? Die Programmiersprache Python sieht ihm sehr ähnlich, und das ist Absicht: Ihr Erfinder Guido van Rossum wollte, dass sich Programme fast wie normaler Text lesen. Auch Python zeigt mit der Einrückung, was zusammengehört. Aber Vorsicht: Python ist eine echte Programmiersprache mit festen Regeln. Ein Leerzeichen zu viel, und der Computer meckert. Pseudocode ist da großzügiger, so wie ich beim Frühstück. -::: - -### Im Vergleich - -- **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick, wilde Sprünge sind unmöglich. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich, und Sprünge kreuz und quer sind möglich. -- **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen SOLANGE und ENDE SOLANGE. Schnell geschrieben und schon nah am Programmcode. - -> Alle drei beschreiben denselben Algorithmus. Wenn du eine Form lesen kannst, lernst du die anderen schnell. - -::: angeberwissen -Nassi und Shneiderman wollten den Pfeilen an den Kragen! Ihr Artikel von 1973 hieß „Flowchart Techniques for Structured Programming“. Flowchart ist das englische Wort für Ablaufplan. Mit Pfeilen kann man nämlich kreuz und quer springen, bis der Plan aussieht wie ein Teller Spaghetti. Im Struktogramm geht das gar nicht. Mäh, so mag ich das: ordentlich, wie mein Stall. -::: - -## Spiel: Welche Darstellung? - -::: spiel frage -titel: Spiel: Welche Darstellung? -intro: Ludwig beschreibt eine Darstellung, ohne ihren Namen zu verraten. Ist es das Struktogramm, der PAP oder der Pseudocode? Acht Runden. -antworten: Struktogramm | PAP | Pseudocode - -runde: -frage: „Bei mir zeigt ein Pfeil zurück nach oben, wenn etwas wiederholt wird.“ -richtig: PAP -> Im PAP hat die Schleife kein eigenes Symbol. Ein Pfeil führt zurück nach oben. - -runde: -frage: „Meine Schleife sieht aus wie ein gekipptes L.“ -richtig: Struktogramm -> Oben und links umschließt der Kasten die Schritte, die wiederholt werden. - -runde: -frage: „Ich bestehe aus Wörtern wie WENN und SOLANGE, und die Einrückung zeigt, was dazugehört.“ -richtig: Pseudocode -> Pseudocode ist Text in normaler Sprache, der wie ein Programm aufgebaut ist. - -runde: -frage: „Meine Verzweigung ist eine Raute mit den Ausgängen ja und nein.“ -richtig: PAP -> Im Struktogramm steht die Bedingung dagegen in einem Dreieck. - -runde: -frage: „Bei mir können sich die Pfeile kreuz und quer verheddern wie Spaghetti.“ -richtig: PAP -> Weil Pfeile überallhin führen dürfen, ist im PAP Spaghetticode möglich. - -runde: -frage: „Ich habe keine feste Schreibweise. FALLS statt WENN ist bei mir auch erlaubt.“ -richtig: Pseudocode -> Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. - -runde: -frage: „Die Bedingung steht oben in einem Dreieck, darunter teile ich mich in zwei Spalten.“ -richtig: Struktogramm -> So sieht die Verzweigung im Struktogramm aus: links true, rechts false. - -runde: -frage: „Fügst du einen Kasten ein, rutscht alles darunter einfach mit. Kein Sprung kann danebengehen.“ -richtig: Struktogramm -> Im Struktogramm gibt es keine Pfeile und keine Sprünge, deshalb kann nichts auf die falsche Stelle zeigen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Elemente eines PAP benennen und einen einfachen PAP lesen. → Andere Darstellungen: Der PAP -- Ich kann einen einfachen Algorithmus selbst als PAP zusammenbauen. → Übung: Kuchen backen als PAP -- Ich kann erklären, warum Sprünge mit GOTO zu Fehlern und Spaghetticode führen. → Nachteile des PAP: Sprünge -- Ich kann einen einfachen Algorithmus als Pseudocode lesen. → Pseudocode und Vergleich -::: - -## Wissenstest - -::: quiz -? Woran erkennst du in einem Programmablaufplan (PAP) eine Schleife? -→ Andere Darstellungen: Der PAP -- [ ] An einem gekippten L -- [x] An einem Pfeil, der zurück nach oben führt -- [ ] Am Wort SOLANGE -> Das gekippte L gehört zum Struktogramm, SOLANGE zum Pseudocode. - -? Ordne jedem Symbol im PAP seine Bedeutung zu. -→ Andere Darstellungen: Der PAP -= Oval -> Start oder Ende -= Rechteck -> Anweisung -= Raute -> Verzweigung -= Parallelogramm -> Ein- oder Ausgabe -> Die Raute hat zwei Ausgänge: ja und nein. - -? Wie heißt der Programmablaufplan auf Englisch? -→ Andere Darstellungen: Der PAP -- [x] Flowchart -- [ ] Structure chart -- [ ] Pseudocode -> Auf Deutsch sagt man auch Flussdiagramm. Structure chart ist das Struktogramm. - -? Du fügst in ein Programm mit GOTO eine neue Zeile ein. Was kann passieren? -→ Nachteile des PAP: Sprünge -- [x] Die Sprünge zeigen auf die falschen Zeilen, weil sich die Nummern verschoben haben -- [ ] Nichts, die Sprünge passen sich von selbst an -- [ ] Das Programm wird automatisch schneller -> Jedes GEHE ZU zeigt auf eine feste Zeilennummer. Rutschen die Zeilen weiter, springt das Programm an die falsche Stelle. - -? Was zeigt im Pseudocode, welche Zeilen zu einer Schleife gehören? -→ Pseudocode und Vergleich -- [ ] Die Farbe -- [x] Die Einrückung und das ENDE SOLANGE -- [ ] Ein Pfeil -> Alles zwischen SOLANGE und ENDE SOLANGE ist eingerückt und wird wiederholt. -::: -`,Jv=`--- -titel: Der Editor -bereich: Erste Schritte -kurz: Elemente einfügen, Text eingeben, verschieben und löschen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Element aus dem Bereich Elemente einfügen und einen Platzhalter ersetzen -- den Text eines Kastens ändern und zwischen Anweisung, Eingabe und Ausgabe umschalten -- Kästen verschieben, kopieren, löschen und Schritte rückgängig machen -::: - -## Die Oberfläche - -VisuStruct hat zwei Editoren: den [Struktogramm-Editor](#zeige-editor), um den es in dieser Lektion geht, und rechts den Bereich [Code](#zeige-codelive) für Java-Code (ab Lektion 4). Ist der Struktogramm-Editor eingeklappt, öffnet ihn diese Lektion von selbst. Die blauen Wörter zeigen dir die Bereiche, auch wenn sie gerade eingeklappt sind: Fährst du mit der Maus darüber, öffnet sich der Bereich neben dem Lernbereich und leuchtet auf. Klickst du darauf (oder tippst es an), bleibt er offen. - -Der Struktogramm-Editor besteht aus mehreren Bereichen. Fahre mit der Maus über ein blaues Wort oder tippe es an, dann leuchtet der Bereich im Editor auf, eingeklappte Bereiche wie die Elemente öffnen sich dabei. - -- **Ganz oben die [Leiste](#zeige-leiste):** Neu, Öffnen und Speichern. Ganz rechts das Zahnrad für die [Einstellungen](#zeige-einstellungen): Textgröße und Sprache. -- **Darunter die [Werkzeuge](#zeige-werkzeuge)** über den Elementen und dem Struktogramm: Rückgängig, Ausschneiden, Kopieren, Einfügen, Löschen, Exportieren, Code und Simulation. Die Knöpfe zeigen nur Symbole. Hältst du die Maus darüber, erscheint ihr Name. -- **Links die [Elemente](#zeige-elemente):** Hier liegen alle Bausteine, die du ins Struktogramm ziehen kannst. Manche nennen diesen Bereich auch Palette. -- **In der Mitte das [Struktogramm](#zeige-struktogramm):** Ein neues Diagramm enthält nur einen leeren Platzhalter, erkennbar an **ø**. -- **Unten der [Objektinspektor](#zeige-objektinspektor):** Hier bearbeitest du den Text des ausgewählten Elements. Ist er dir zu klein oder zu groß, ziehst du die Linie mit dem Griff darüber nach oben oder unten. - -> Diesen Lernbereich kannst du jederzeit mit dem [Seitenleisten-Symbol](#zeige-lernen) oben in diesem Bereich einklappen. Dann bleibt links nur die schmale Leiste „🎓 Lernen“, ein Klick darauf öffnet ihn wieder. Er bleibt neben dem Editor offen, damit du gleich ausprobieren kannst, was du liest. Genauso gibt es links die Spalte [📁 Dateien](#zeige-dateien) für deine gespeicherten Programme (Lektion 3) und rechts den Bereich [Code](#zeige-codelive) für Java (ab Lektion 4). - -## Ein Element einfügen - -Ziehe ein Element aus dem Bereich **Elemente** auf das Struktogramm. Beim Ziehen zeigt eine blaue Linie, wo es landet: - -- **Auf den Platzhalter ø:** Das Element ersetzt den Platzhalter. -- **Auf die obere Hälfte eines Kastens:** Das Element kommt davor. -- **Auf die untere Hälfte eines Kastens:** Das Element kommt dahinter. - -::: grafik l02-einfuegen.svg -Wohin du ziehst, entscheidet, wo das neue Element landet. -::: - -Es geht auch ohne Ziehen: **Klicke** auf ein Element im Bereich Elemente (oder tippe es an). Dann wird es hinter dem ausgewählten Kasten eingefügt. Ist der Platzhalter **ø** ausgewählt, ersetzt es ihn. - -Mit der Tastatur springst du mit der **Tab**-Taste zu einem Element und drückst **Enter**. Das neue Element landet dann ebenfalls hinter dem ausgewählten Kasten. - -::: angeberwissen -Kästen packen und herumziehen, so wie du gerade, hat einen schicken Namen: **direkte Manipulation**. Den Begriff hat 1982 Ben Shneiderman geprägt, genau, der vom Struktogramm. Der Mann war fleißiger als ich beim Grasen. -::: - -## Text eingeben - -Klicke einen Kasten an. Er wird blau umrandet, und im Objektinspektor unter dem Diagramm erscheint sein Text. Was du dort tippst, siehst du sofort im Diagramm. - -Schneller geht es mit einem **Doppelklick** auf den Kasten, auf dem Tablet mit einem **Doppeltipp**. Dann tippst du den Text direkt im Struktogramm. **Enter** übernimmt ihn, **Esc** bricht ab. Mit der Tastatur wählst du den Kasten aus und drückst **Enter**. - -Der Kasten aus dem Bereich Elemente heißt **Anweisung**. Oben wählst du, welche Art von Anweisung er sein soll: - -- **Anweisung:** etwas berechnen oder festlegen, z. B. \`int zahl = 5\`. Wie das geht, lernst du in Lektion 4. -- **Eingabe:** beim Ausführen einen Wert abfragen. Das kommt in Lektion 6. -- **Ausgabe:** etwas anzeigen. Im Diagramm steht dann \`output:\` davor, z. B. \`output: "Hallo"\`. - -Für den Anfang brauchst du nur die Ausgabe. Texte, die genau so angezeigt werden sollen, schreibst du in **Anführungszeichen**. - -::: diagramm l2-ausgabe.visustruct -Zwei Ausgaben nacheinander. Öffne das Diagramm im Editor und starte die [Simulation](#zeige-simulation) in den Werkzeugen, um die Ausgabe zu sehen. Genauer lernst du sie in Lektion 7 kennen. -::: - -## Verschieben, kopieren, löschen - -- **Verschieben:** Einen vorhandenen Kasten mit der Maus an eine neue Stelle ziehen. -- **Kopieren und Einfügen:** Kasten auswählen, dann Strg+C und Strg+V (am Mac ⌘C und ⌘V). Die Kopie kommt hinter den ausgewählten Kasten. Ohne Tastatur, zum Beispiel auf dem Tablet, tippst du in den [Werkzeugen](#zeige-werkzeuge) auf **Kopieren** und **Einfügen**. -- **Löschen:** Kasten auswählen und Entf drücken oder in den Werkzeugen auf den [Mülleimer](#zeige-loeschen) „Auswahl löschen“ klicken. -- **Rückgängig:** Strg+Z macht den letzten Schritt rückgängig, Strg+Umschalt+Z stellt ihn wieder her (am Mac ⌘Z und ⌘⇧Z). Ohne Tastatur tippst du in den Werkzeugen auf [Rückgängig](#zeige-rueckgaengig). - -## Übung: Hallo Welt - -::: übung l2-hallo -titel: Hallo Welt -auftrag: Baue ein Struktogramm, das **Hallo Welt** ausgibt. -Ziehe eine **Anweisung** aus den Elementen auf den Platzhalter **ø** und klicke den Kasten an. Im Objektinspektor unter dem Struktogramm stehen oben drei Knöpfe: Anweisung, Eingabe und Ausgabe. Klicke auf **Ausgabe**. Schreibe dann in das Textfeld darunter \`"Hallo Welt"\`, mit Anführungszeichen. -test: - -> Hallo Welt -braucht: anweisung -tipp: Du brauchst nur einen einzigen Kasten. Der Text, der erscheinen soll, steht im Objektinspektor im Eingabefeld. -tipp: Achte auf die Anführungszeichen. Ohne sie sucht VisuStruct nach einer Variablen mit dem Namen Hallo. -lösung: l2-hallo-loesung.visustruct -::: - -Klicke auf **Prüfen**, wenn du fertig bist. VisuStruct führt dein Struktogramm aus und vergleicht die Ausgabe. - -## Übung: Zwei Zeilen - -::: übung l2-zwei-zeilen -titel: Zwei Zeilen -auftrag: Gib zuerst **Hallo** und danach **Ich lerne Struktogramme** aus, jeweils in einer eigenen Zeile. -test: - -> Hallo | Ich lerne Struktogramme -tipp: Zwei Zeilen heißt: zwei Ausgaben. Die Kästen stehen untereinander und werden von oben nach unten ausgeführt. -tipp: Jede Ausgabe ist ein eigener Kasten. Ziehe die zweite Anweisung auf die untere Hälfte der ersten. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Spiel: Editor-Profi - -::: spiel frage -titel: Spiel: Editor-Profi -intro: Ludwig testet, ob du den Editor im Griff hast. Sieben Runden. - -runde: -frage: Du ziehst eine Anweisung auf den Platzhalter **ø**. Was passiert? -- [x] Die Anweisung ersetzt den Platzhalter. -- Die Anweisung kommt hinter den Platzhalter. -- Nichts, auf ø darf man nichts ziehen. -> Der Platzhalter hält nur den Platz frei. Das neue Element nimmt ihn ein. - -runde: -frage: Du ziehst ein Element auf die **obere** Hälfte eines Kastens. Wo landet es? -- [x] davor -- dahinter -- Es ersetzt den Kasten. -> Obere Hälfte heißt davor, untere Hälfte heißt dahinter. Die blaue Linie zeigt es dir beim Ziehen. - -runde: -frage: Du ziehst ein Element auf die **untere** Hälfte eines Kastens. Wo landet es? -- davor -- [x] dahinter -- ganz am Ende des Struktogramms -> Untere Hälfte heißt: direkt hinter diesen Kasten. - -runde: -frage: Du hast aus Versehen einen Kasten gelöscht. Was holt ihn zurück? -- Strg+C / ⌘C -- [x] Strg+Z / ⌘Z -- Strg+V / ⌘V -> Strg+Z / ⌘Z macht den letzten Schritt rückgängig. Strg+C / ⌘C kopiert, Strg+V / ⌘V fügt ein. - -runde: -frage: Beim Ausführen soll genau **Hallo** erscheinen. Was steht im Kasten? -- [x] output: "Hallo" -- output: Hallo -- "Hallo" -> Text, der genau so angezeigt werden soll, steht in Anführungszeichen. Das \`output:\` setzt der Editor davor, wenn du die Art Ausgabe wählst. - -runde: -frage: Wo änderst du den Text des ausgewählten Kastens? -- in den Elementen -- [x] im Objektinspektor -- in der Leiste ganz oben -> Der Objektinspektor unter dem Diagramm zeigt den Text des ausgewählten Kastens. - -runde: -frage: Du klickst im Bereich Elemente auf ein Element, ohne zu ziehen. Wo landet es? -- [x] hinter dem ausgewählten Kasten -- ganz am Anfang -- ganz am Ende -> Ohne Ziehen (Klick oder Tab und Enter) kommt das neue Element hinter den Kasten, der gerade ausgewählt ist. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Element aus dem Bereich Elemente einfügen und einen Platzhalter ersetzen. → Ein Element einfügen -- Ich kann den Text eines Kastens ändern und zwischen Anweisung, Eingabe und Ausgabe umschalten. → Text eingeben -- Ich kann Kästen verschieben, kopieren, löschen und Schritte rückgängig machen. → Verschieben, kopieren, löschen -::: - -## Wissenstest - -::: quiz -? Was bedeutet das Zeichen ø in einem Kasten? -→ Ein Element einfügen -- [ ] Der Kasten enthält einen Fehler. -- [x] Hier ist noch ein leerer Platzhalter. -- [ ] Das Programm endet hier. -> Ein Platzhalter wird ersetzt, wenn du ein Element darauf ziehst. - -? Du ziehst eine Anweisung auf die untere Hälfte eines Kastens. Wo landet sie? -→ Ein Element einfügen -- [ ] Davor -- [x] Dahinter -- [ ] Der Kasten wird ersetzt. - -? Wie gibst du den Text Guten Tag genau so aus? -→ Text eingeben -- [ ] output: Guten Tag -- [x] output: "Guten Tag" -- [ ] input: "Guten Tag" -> Ohne Anführungszeichen wird Guten Tag als Name einer Variablen verstanden. -::: -`,Gv=`--- -titel: Speichern, Öffnen, Exportieren -bereich: Erste Schritte -kurz: Dateien sichern, deinen Workspace nutzen, mehrere Diagramme öffnen und als Bild oder PDF weitergeben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einem Diagramm einen Titel geben -- ein Diagramm als .visustruct-Datei speichern und wieder öffnen -- ein Diagramm als Bild (PNG) oder PDF exportieren -- ein zweites Diagramm in einem neuen Reiter öffnen -- meinen Workspace \`VisuStruct-Dateien\` anlegen -- ein Programm in meinem Workspace speichern -::: - -## Die Datei .visustruct - -Struktogramme werden als **.visustruct**-Datei gespeichert. Dasselbe Format nutzen alle VisuStruct-Versionen: im Browser, auf Mac, iPad und iPhone und die Java-App am Rechner. Du kannst also in der Schule im Browser anfangen und zu Hause in der App weitermachen. - -::: angeberwissen -Zu Nassis Studienzeit gab es keine Dateien zum Speichern, sondern Lochkarten. Nassi erzählt, dass ein Date am Samstagabend so aussah: seine spätere Frau saß mit ihm im Rechenzentrum und stanzte seine Lochkarten. Romantik, Informatik-Style! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -So sah eine Lochkarte aus. Eine Karte war eine Zeile Programm, hier \`PRINT *, 'HALLO WELT'\` in der Sprache Fortran. Jede Spalte ist ein Zeichen, die Löcher darin sind sein Code. Ein ganzes Programm war ein Stapel solcher Karten. Fiel er herunter, musste man alles wieder sortieren. -::: - -::: angeberwissen -Ein Computerpionier aus unserer Gegend: **Konrad Zuse**. Am 12. Mai 1941 stellte er in Berlin die **Z3** vor, den ersten funktionsfähigen programmgesteuerten Digitalrechner der Welt. Sie rechnete schon im **Binärsystem**, also nur mit 0 und 1, mit rund 2000 Relais (elektrischen Schaltern). Ihr Programm stand nicht auf Lochkarten, sondern als Löcher in einem gebrauchten Kinofilm. Danach erfand Zuse den **Plankalkül**, eine der ersten Programmiersprachen überhaupt. Später lebte er bis zu seinem Tod 1995 in **Hünfeld** bei Fulda. Im Konrad-Zuse-Museum dort stehen Nachbauten der Z3. Mein Ausflugstipp für eure Klasse! Wann es offen hat, steht auf der Webseite der Stadt Hünfeld. -::: - -::: grafik l03-zuse-lochstreifen.svg -So ungefähr sah Zuses Programmstreifen aus: ein alter Kinofilm mit gestanzten Löchern. Jede Spalte ist ein Befehl aus 8 Stellen. Ein Loch heißt 1, kein Loch heißt 0. Die Maschine las den Streifen Befehl für Befehl. -::: - -## Speichern und Öffnen - -- **[Speichern](#zeige-speichern)** (Strg+S, am Mac ⌘S): Das Diagramm wird als Datei gespeichert. Ist die Spalte **Dateien** eingerichtet (siehe unten), landet es dort. Sonst fragt der Browser nach dem Ort oder legt die Datei in den Download-Ordner. -- **[Öffnen](#zeige-oeffnen)** (Strg+O, am Mac ⌘O): Eine gespeicherte Datei wieder laden. Du kannst eine Datei auch einfach ins Browserfenster ziehen. - -> Deine Übungen merkt sich der Browser automatisch. Das klappt aber nur in diesem Browser auf diesem Gerät. Wichtige Arbeiten solltest du deshalb immer zusätzlich als Datei speichern. - -## Die Spalte Dateien - -Links neben dem Lernbereich findest du die Spalte [📁 Dateien](#zeige-dateien). Dort sammelst du alle deine Programme an einem Ort, deinem **Workspace** (Arbeitsbereich). - -**Jetzt du:** Richte deinen Workspace jetzt gleich ein, bevor du weiterliest. Ab heute speicherst du alle deine Programme dort. - -1. Lege einen Workspace an: Öffne die Spalte und klicke auf **Ordner wählen**. Gehe im Fenster zu deinen **Dokumenten**, lege dort mit **Neuer Ordner** einen Ordner namens \`VisuStruct-Dateien\` an und wähle ihn aus. Erlaube VisuStruct, den Ordner zu benutzen. Das geht in Chrome und Edge. Auf dem iPad und in anderen Browsern klickst du stattdessen auf **Im Browser speichern**. -2. Speichere wie gewohnt. VisuStruct legt in deinem Workspace automatisch einen Ordner mit dem heutigen Datum an, zum Beispiel \`2026-10-23\`, und speichert das Programm darin. Der Dateiname kommt aus dem Titel. - -So sieht dein Workspace danach aus: - -\`\`\`text -VisuStruct-Dateien ← Workspace -└── 2026-10-23 ← Tag - └── Fakultaet.visustruct -\`\`\` - -Ein Klick auf ein Programm in der Spalte öffnet es wieder. So findest du später jede Stunde schnell wieder. - -Auch dein **Lernstand** landet im Workspace: in der Datei \`learnProgress.json\` stehen deine erledigten Lektionen und Übungen. Öffnest du den Workspace in einem anderen Browser, ist dein Lernstand wieder da. - -> Warum ein echter Ordner? Dein Lernstand und deine Programme liegen dann als Dateien darin. Den Ordner kannst du mitnehmen, zum Beispiel auf einem USB-Stick oder in deinem Cloud-Ordner wie OneDrive. So machst du zu Hause an einem anderen Rechner genau da weiter, wo du aufgehört hast. Speicherst du nur im Browser, bleibt alles in diesem einen Browser auf diesem Gerät. Löscht jemand die Browserdaten, ist auch dein Lernstand weg. - -## Mehrere Diagramme in Reitern - -Über dem Struktogramm siehst du die [Reiter](#zeige-reiter). Mit **+** oder [Neu](#zeige-neu) öffnest du ein weiteres, leeres Diagramm. Ein Punkt • vor dem Namen zeigt, dass es ungespeicherte Änderungen gibt. - -Den [Titel](#zeige-titel) eines Diagramms trägst du in das Feld über dem Struktogramm ein. Er erscheint auch beim Exportieren und wird als Dateiname vorgeschlagen. - -## Weitergeben: Bild, PDF oder Datei - -Über [Exportieren](#zeige-exportieren) bei den Werkzeugen (Symbol mit Pfeil nach oben) gibst du dein Struktogramm weiter: - -- **Bild (PNG):** zum Einfügen in ein Arbeitsblatt oder eine Präsentation -- **Vektorgrafik (SVG):** bleibt in jeder Größe scharf -- **PDF (A4):** eine Seite zum Abgeben oder Ausdrucken -- **VisuStruct-Datei (.visustruct):** zum Weitergeben an jemanden, der dein Struktogramm in VisuStruct öffnen und weiterbearbeiten soll, zum Beispiel per Mail oder über die Lernplattform -- **Drucken** (Strg+P, am Mac ⌘P): direkt auf den Drucker - -Unter dem [Zahnrad](#zeige-textgroesse) oben rechts stellst du bei Textgröße die Schriftgröße ein. Ein größerer Text wirkt auch beim Exportieren als Bild. - -## Ausprobieren - -Öffne eine deiner Übungen aus Lektion 2 und probiere Folgendes aus: - -1. Gib dem Diagramm im Feld [Titel](#zeige-titel) über dem Struktogramm einen Namen, zum Beispiel \`Hallo Welt\`. -2. [Speichere](#zeige-speichern) es in deinem Workspace. Schau in der Spalte [📁 Dateien](#zeige-dateien) nach: Steht es im Ordner von heute? -3. Öffne mit **+** einen zweiten Reiter und klicke dort in der Spalte Dateien auf dein Programm. Es öffnet sich wieder. -4. [Exportiere](#zeige-exportieren) es als **Bild (PNG)** und als **PDF (A4)**. Öffne beide Dateien und vergleiche sie. - -Klappt alles? Dann weißt du, wo deine Programme liegen, und kannst sie weitergeben. - -## Spiel: Wie gibst du es weiter? - -::: spiel frage -titel: Spiel: Wie gibst du es weiter? -intro: Ludwig will sein Struktogramm weitergeben. Welches Format passt am besten? Sechs Runden. -frage: Welches Format passt? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: Du willst morgen an deinem Struktogramm weiterarbeiten. -richtig: .visustruct -> Nur die .visustruct-Datei kann VisuStruct wieder öffnen und bearbeiten. - -runde: -frage: Das Struktogramm soll als Bild in eine Präsentation. -richtig: PNG -> Ein PNG-Bild lässt sich in jede Präsentation und jedes Arbeitsblatt einfügen. - -runde: -frage: Die Lehrkraft will deine Abgabe als eine A4-Seite ausdrucken. -richtig: PDF -> Das PDF ist genau eine A4-Seite zum Abgeben oder Ausdrucken. - -runde: -frage: Das Struktogramm kommt auf ein Plakat und soll auch riesig noch scharf sein. -richtig: SVG -> Eine Vektorgrafik bleibt in jeder Größe scharf. Ein PNG wird beim Vergrößern pixelig. - -runde: -frage: Deine Freundin soll das Struktogramm in ihrer VisuStruct-App auf dem iPad ändern. -richtig: .visustruct -> Alle VisuStruct-Versionen öffnen dieselbe .visustruct-Datei: im Browser, auf Mac, iPad und iPhone. - -runde: -frage: Du willst ein Bild schnell in einen Chat schicken. -richtig: PNG -> Ein PNG kann jeder sofort ansehen, ohne VisuStruct. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einem Diagramm einen Titel geben. → Ausprobieren -- Ich kann ein Diagramm als .visustruct-Datei speichern und wieder öffnen. → Speichern und Öffnen -- Ich kann ein Diagramm als Bild (PNG) oder PDF exportieren. → Weitergeben: Bild, PDF oder Datei -- Ich kann ein zweites Diagramm in einem neuen Reiter öffnen. → Mehrere Diagramme in Reitern -- Ich kann meinen Workspace \`VisuStruct-Dateien\` anlegen. → Die Spalte Dateien -- Ich kann ein Programm in meinem Workspace speichern. → Die Spalte Dateien -::: - -## Wissenstest - -::: quiz -? Welche Datei kannst du in der Mac-App und in der Java-App wieder öffnen? -→ Speichern und Öffnen -- [x] Die .visustruct-Datei -- [ ] Das exportierte PNG-Bild -- [ ] Das exportierte PDF -> Bilder und PDFs sind nur zum Ansehen. Weiterbearbeiten kannst du nur die .visustruct-Datei. - -? Deine Übungen werden im Browser gemerkt. Warum solltest du trotzdem speichern? -→ Speichern und Öffnen -- [ ] Weil die Übungen sonst nicht geprüft werden -- [x] Weil der Browser die Daten nur auf diesem Gerät behält und sie verloren gehen können -- [ ] Weil man ohne Speichern nicht exportieren kann - -? Du speicherst heute ein Programm in deinem Workspace. Wo landet es? -→ Die Spalte Dateien -- [ ] Im Download-Ordner -- [x] Im Workspace in einem Ordner mit dem heutigen Datum -- [ ] Direkt im Workspace ohne Unterordner -> VisuStruct legt für jeden Tag automatisch einen Datumsordner an. So bleiben die Programme nach Stunden sortiert. -::: -`,Hv=`--- -titel: Variablen und Datentypen -bereich: Grundlagen -kurz: Werte speichern, die Datentypen int, double, String und boolean kennen und rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable mit Datentyp, Namen und Wert anlegen -- erklären, dass Java Groß- und Kleinschreibung unterscheidet (\`zahl\` ist nicht \`Zahl\`) -- die Datentypen int, double, String und boolean unterscheiden -- erklären, dass = eine Zuweisung ist und kein Vergleich -- mit + - * / % rechnen und die ganzzahlige Division anwenden -- Variablen in Java anlegen und ausgeben -::: - -## Was ist eine Variable? - -Eine **Variable** ist wie eine beschriftete Kiste. Sie hat einen **Namen**, einen **Datentyp** und einen **Wert**. - -\`\`\` -int alter = 14 -\`\`\` - -Hier heißt die Variable \`alter\`, ihr Datentyp ist \`int\` (ganze Zahl), und ihr Wert ist 14. Über den Namen kannst du den Wert später wieder benutzen. - -::: grafik l04-variable.svg -Die Variable als Kiste: Name auf dem Etikett, Datentyp als Aufkleber, Wert darin. -::: - -> Variablennamen beginnen mit einem **Kleinbuchstaben** und enthalten keine Leerzeichen. Gute Namen sagen, was drinsteht: \`preis\` ist besser als \`p\`. - -::: angeberwissen -Im September 1999 ging die Mars-Sonde Mars Climate Orbiter verloren. Ein Team rechnete die Schubkraft in amerikanischen Einheiten (Pfund), das andere erwartete metrische Einheiten (Newton). In den Daten stand nur die Zahl, nicht die Einheit. Die Sonde flog zu tief in die Mars-Atmosphäre und verglühte, Schaden rund 125 Millionen Dollar. Ein sprechender Name wie \`impulsInNewtonSekunden\` hätte gesagt, was drinsteht. Ich schreibe auf mein Heufach übrigens immer \`heuInKilo\`. -::: - -Besteht ein Name aus mehreren Wörtern, schreibst du sie zusammen und beginnst jedes weitere Wort mit einem Großbuchstaben: \`preisMitSteuer\`, \`anzahlSchueler\`. Diese Schreibweise heißt **CamelCase**. - -::: angeberwissen -CamelCase heißt so, weil die Großbuchstaben in der Mitte wie die Höcker eines Kamels aus dem Wort ragen: \`preisMitSteuer\` hat zwei Höcker. Ich als Geißbock habe übrigens null Höcker, dafür zwei Hörner. Leider hat noch niemand die GeißbockSchreibweise erfunden. -::: - -::: grafik l04-camelcase.svg -Die Großbuchstaben M und S ragen heraus wie die zwei Höcker des Kamels. -::: - -## Groß- und Kleinschreibung - -Java unterscheidet **Groß- und Kleinschreibung**. Auf Englisch heißt das **case-sensitive**. Für Java sind \`zahl\`, \`Zahl\` und \`ZAHL\` drei verschiedene Namen, also drei verschiedene Kisten: - -\`\`\` -int zahl = 4 -int Zahl = 6 -\`\`\` - -Hier gibt es zwei Variablen. Schreibst du später \`ZAHL\`, findet Java keine Variable mit diesem Namen. Das Programm läuft nicht, und du bekommst eine Fehlermeldung. - -> Das gilt auch für Java-Wörter: \`String\` und \`System\` schreibt man groß, \`int\` und \`double\` klein. Lege in deinen eigenen Programmen nie zwei Variablen an, die sich nur in der Groß- und Kleinschreibung unterscheiden. Das verwirrt dich und alle, die deinen Code lesen. - -## Übung: Drei Namen - -::: übung l04-gross-klein -titel: Drei Namen -auftrag: Ludwig hat zwei Variablen angelegt: \`zahl\` mit dem Wert 4 und \`Zahl\` mit dem Wert 6. Das Struktogramm soll beide malnehmen und **Ergebnis: 24** ausgeben. Es läuft aber nicht. - Klicke auf „Im Editor öffnen“, dann auf Prüfen, und lies die Fehlermeldung. Repariere die Anweisung und klicke noch einmal auf Prüfen. -start: l04-gross-klein-start.visustruct -test: - -> Ergebnis: 24 -braucht: anweisung -tipp: Wie viele verschiedene Namen stehen im Struktogramm? \`zahl\`, \`Zahl\` und \`ZAHL\` sind für den Computer drei verschiedene Namen. -tipp: \`ZAHL\` gibt es nicht. Für 24 brauchst du 4 mal 6, also \`zahl\` mal \`Zahl\`: \`int ergebnis = zahl * Zahl\`. Mit \`zahl * zahl\` kommt 16 heraus. -lösung: l04-gross-klein-loesung.visustruct -::: - -## Die vier Datentypen - -Der Datentyp legt fest, welche Art von Wert in der Variablen stehen darf. - -- **int:** ganze Zahlen, z. B. \`int anzahl = 3\` oder \`int temperatur = -5\` -- **double:** Kommazahlen, z. B. \`double preis = 2.5\`. Statt Komma schreibst du einen **Punkt**. -- **String:** Text, z. B. \`String name = "Mia"\`. Text steht in Anführungszeichen. -- **boolean:** Wahrheitswerte, nur \`true\` (wahr) oder \`false\` (falsch) - -Es gibt noch mehr Datentypen. Einen wirst du bald brauchen: \`char\` für ein **einzelnes Zeichen**, z. B. \`char note = 'C'\`. Ein \`char\` steht in **einfachen** Anführungszeichen. Genauer lernst du ihn in Lektion 17 kennen. - -::: diagramm l05-datentypen.visustruct -Drei Variablen mit verschiedenen Datentypen. Öffne das Diagramm und starte die [Simulation](#zeige-simulation). -::: - -Wahrheitswerte begegnen dir vor allem in **Bedingungen**: \`alter >= 18\` ist entweder \`true\` oder \`false\`. Darum geht es in Lektion 8. Eine Variable vom Typ \`boolean\` bekommt einfach \`true\` oder \`false\`: - -\`\`\` -boolean volljaehrig = false -\`\`\` - -::: angeberwissen -Am 4. Juni 1996 explodierte die Rakete Ariane 5 schon 37 Sekunden nach dem Start. Schuld war eine einzige Zeile: Eine Kommazahl für die Geschwindigkeit wurde in eine Ganzzahl-Variable gesteckt, die für so große Werte zu klein war. Der Datentyp ist also keine Nebensache, er kann eine halbe Milliarde Euro kosten. -::: - -## Zuweisung mit = - -Das Zeichen \`=\` heißt **Zuweisung**. Es bedeutet nicht „ist gleich“ wie in Mathe, sondern: Berechne die rechte Seite und speichere das Ergebnis in der Variablen links. - -\`\`\` -int punkte = 10 -punkte = punkte + 5 -\`\`\` - -In Mathe wäre die zweite Zeile falsch, denn keine Zahl ist gleich sich selbst plus 5. Beim Programmieren liest du sie so: Nimm den alten Wert 10, rechne plus 5 und speichere 15 in \`punkte\`. Den Datentyp schreibst du nur beim ersten Mal, wenn die Variable angelegt wird. - -::: grafik l04-zuweisung.svg -Erst wird rechts gerechnet, dann landet das Ergebnis in der Variablen links. -::: - -## Rechnen - -Mit Zahlen kannst du rechnen: - -- \`+\` plus, \`-\` minus, \`*\` mal, \`/\` geteilt -- \`%\` Rest beim Teilen (gesprochen „Modulo“), z. B. ist \`17 % 5\` gleich 2 - -**Teilen mit Rest** kennst du aus der Grundschule, als du noch keine Kommazahlen hattest: 17 : 5 = 3 Rest 2. Die 5 passt dreimal in die 17, das sind 15. Bis 17 fehlen dann noch 2, das ist der Rest. Genau so rechnet der Computer mit ganzen Zahlen: \`/\` liefert das Ergebnis ohne Rest, \`%\` nur den Rest. - -| Grundschule | mit \`/\` | mit \`%\` | -|---|---|---| -| 17 : 5 = 3 Rest 2 | \`17 / 5\` ergibt 3 | \`17 % 5\` ergibt 2 | -| 20 : 5 = 4 Rest 0 | \`20 / 5\` ergibt 4 | \`20 % 5\` ergibt 0 | -| 3 : 5 = 0 Rest 3 | \`3 / 5\` ergibt 0 | \`3 % 5\` ergibt 3 | - -Ist der Rest 0, geht die Teilung auf. So prüfst du später, ob eine Zahl gerade ist: Bei geraden Zahlen ist \`zahl % 2\` gleich 0. - -Es gilt **Punkt vor Strich**, und Klammern werden zuerst ausgerechnet: \`2 * (3 + 4)\` ist 14. - -### Text und Ergebnis zusammen ausgeben - -Ein Ergebnis allein sagt wenig. Mit \`+\` hängst du einen Text und den Wert einer Variablen aneinander: - -\`\`\` -int alter = 14 -output: "Alter: " + alter -\`\`\` - -Das zeigt **Alter: 14**. Der Text in Anführungszeichen erscheint genau so, für \`alter\` setzt der Computer den Wert ein. Das Leerzeichen nach dem Doppelpunkt gehört zum Text, sonst steht dort \`Alter:14\`. - -## Übung: Rechteck - -::: übung l05-rechteck -titel: Rechteck berechnen -auftrag: Ein Rechteck ist 7 lang und 4 breit. Lege die Variablen \`laenge\` und \`breite\` an. Berechne die Fläche und den Umfang in eigenen Variablen und gib beide aus, so wie hier: -\`Fläche: 28\` und in der nächsten Zeile \`Umfang: 22\`. -test: - -> Fläche: 28 | Umfang: 22 -braucht: anweisung -tipp: Überlege zuerst, welche Variablen du brauchst: zwei für die Maße und zwei für die Ergebnisse. Alle sind ganze Zahlen. -tipp: Die Fläche ist Länge mal Breite, der Umfang ist 2 mal (Länge plus Breite). Für die Ausgabe schreibst du z. B. \`output: "Fläche: " + flaeche\`. Das \`+\` hängt dabei den Text und den Wert der Variablen aneinander. -lösung: l05-rechteck-loesung.visustruct -::: - -## Ganzzahlige Division - -Teilst du zwei ganze Zahlen und speicherst das Ergebnis in einer \`int\`-Variablen, fällt alles nach dem Komma weg. Es wird **nicht gerundet**. - -\`\`\` -int x = 7 / 2 ergibt 3 -int r = 7 % 2 ergibt 1 (der Rest) -double d = 7.0 / 2 ergibt 3.5 -\`\`\` - -Mit \`/\` und \`%\` zusammen kannst du gut umrechnen, zum Beispiel Minuten in Stunden und Minuten: - -::: diagramm l05-division.visustruct -135 Minuten sind 2 Stunden (135 / 60) und 15 Minuten Rest (135 % 60). -::: - -## Übung: Sekunden umrechnen - -::: übung l05-sekunden -titel: Sekunden umrechnen -auftrag: 200 Sekunden sollen als Minuten und Sekunden ausgegeben werden. Die erste und die letzte Anweisung sind schon da. Füge dazwischen Anweisungen ein, die \`minuten\` und \`rest\` berechnen. -start: l05-sekunden-start.visustruct -test: - -> 3 Minuten und 20 Sekunden -braucht: anweisung -tipp: Wie viele ganze Minuten passen in 200 Sekunden, und wie viele Sekunden bleiben übrig? Rechne es erst im Kopf aus. -tipp: Eine Minute hat 60 Sekunden. Nutze \`/\` für die ganzen Minuten und \`%\` für den Rest. Beide Variablen sind vom Typ \`int\`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Übung: Einkauf - -::: übung l05-einkauf -titel: Einkauf -auftrag: Du kaufst 3 Hefte zu je 2.5 Euro. Lege \`anzahl\` als \`int\` und \`preis\` als \`double\` an, berechne den Gesamtpreis in einer Variablen \`gesamtPreis\` und gib \`Gesamt: 7.5 Euro\` aus. -test: - -> Gesamt: 7.5 Euro -braucht: anweisung -tipp: Anzahl mal Preis ergibt den Gesamtpreis. Überlege für jede Variable, ob sie eine ganze Zahl oder eine Kommazahl ist. -tipp: Der Gesamtpreis ist eine Kommazahl, also braucht \`gesamtPreis\` den Typ \`double\`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Jetzt in Java - -Ein Struktogramm ist ein Plan. In **Java** wird daraus ein Programm, das der Computer ausführt. Dein Einkauf aus der Übung sieht so aus: - -\`\`\`java editor -int anzahl = 3; -double preis = 2.5; -double gesamtPreis = anzahl * preis; -System.out.println("Gesamt: " + gesamtPreis + " Euro"); -\`\`\` - -- Erst der Datentyp, dann der Name, dann der Wert, genau wie im Kasten. -- Jede Anweisung endet mit einem **Semikolon** \`;\`. -- Eine Ausgabe heißt in Java \`System.out.println(…)\`. - -Wie der Computer deinen Java-Code versteht und warum er auf Windows, macOS und Linux gleich läuft, erfährst du in der Lektion „Struktogramm und Code“. - -::: angeberwissen -Java hieß zuerst **Oak** (Eiche), nach dem Baum vor dem Bürofenster von James Gosling. Sein Team bei Sun Microsystems wollte ab 1991 kleine Geräte wie Fernseh-Boxen programmieren. Den Namen Oak hatte aber schon eine andere Firma. Also wurde es 1995 **Java**, wie der Kaffee von der Insel Java. -::: - -## Text in Java - -Variablen speichern nicht nur Zahlen. Für Text gibt es den Datentyp \`String\`: - -\`\`\`java editor -String name = "Mia"; -int alter = 14; -double groesse = 1.62; -System.out.println(name + " ist " + alter + " Jahre alt."); -System.out.println("Größe: " + groesse + " m"); -\`\`\` - -- Text steht in Anführungszeichen. -- \`String\` schreibst du groß, \`int\`, \`double\` und \`boolean\` klein. Java unterscheidet das. -- Mit \`+\` hängst du Text und Zahlen aneinander. - -Java tippst du im Bereich [Code](#zeige-codelive). Das Struktogramm entsteht dabei von selbst. „Im Editor öffnen“ holt das Beispiel in den Bereich Code. Klicke dort auf „Ausführen“, ändere dann Name, Alter oder Größe und probiere es noch einmal. - -::: übung l04-java-steckbrief -titel: Steckbrief in Java -bereich: beide -code: java -auftrag: Schreibe einen Steckbrief für Ludwig den Geißbock. Lege drei Variablen an: den Namen **Ludwig**, das Alter **7** und die Größe **1.2**. Gib dann diese zwei Zeilen aus: - **Ludwig ist 7 Jahre alt.** und **Größe: 1.2 m** - „Im Editor öffnen“ öffnet rechts auch den Bereich Code. Tippe dort deinen Code, das Struktogramm entsteht dabei von selbst. Klicke dann auf Prüfen. -test: - -> Ludwig ist 7 Jahre alt. | Größe: 1.2 m -braucht: anweisung -tipp: Du brauchst einen \`String\`, einen \`int\` und einen \`double\`. Jede Zeile endet mit einem Semikolon. -tipp: \`String name = "Ludwig";\`, \`int alter = 7;\` und \`double groesse = 1.2;\`. Die Ausgabe setzt du mit \`+\` zusammen: \`System.out.println(name + " ist " + alter + " Jahre alt.");\` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Lückentext: Datentypen - -::: lückentext -titel: Steckbrief in Java -auftrag: Ergänze die fehlenden Wörter. Ganz außen steht der Rahmen, den jedes Java-Programm in einer eigenen Datei braucht. Darin stehen die Variablen. -\`\`\`java -[[public]] class Steckbrief { - public static [[void]] main(String[] args) { - [[int]] alter = 14; - [[double]] groesse = 1.62; - [[String]] name = "Mia"; - [[boolean]] hatHaustier = true; - System.out.[[println]](name + " ist " + alter + " Jahre alt."); - } -} -\`\`\` -erklärung: Ganze Zahlen sind \`int\`, Kommazahlen \`double\`, Texte \`String\` (groß geschrieben) und Wahrheitswerte \`boolean\`. \`public class\` und \`public static void main\` bilden den Rahmen. Im Bereich Code darfst du ihn weglassen, mehr dazu in der Lektion „Struktogramm und Code“. -::: - -## Fehler finden: Sekunden - -::: übung l04-java-fehler -titel: Sekunden reparieren -code: java -auftrag: Das Programm soll 200 Sekunden in Minuten und Sekunden umrechnen und **3 min 20 s** ausgeben. Es gibt aber **20 min 3 s** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: \`/\` teilt ganzzahlig, \`%\` liefert den Rest. Welches Zeichen brauchst du für die Minuten, welches für die übrigen Sekunden? -tipp: Die beiden Zeichen sind vertauscht: \`int minuten = sekunden / 60;\` und \`int rest = sekunden % 60;\` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l04-java-laeuft-nicht -titel: Steckbrief reparieren -code: java -auftrag: Das Programm soll **Ludwig ist 7 Jahre alt.** ausgeben. Es läuft aber nicht, denn zwei Wörter sind falsch geschrieben. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig ist 7 Jahre alt. -braucht: anweisung -tipp: Java unterscheidet Groß- und Kleinschreibung. Vergleiche jedes Wort in der Ausgabe genau mit dem, was oben angelegt ist. -tipp: \`System\` schreibt man mit großem S. Die Variable heißt \`alter\` mit kleinem a: \`System.out.println(name + " ist " + alter + " Jahre alt.");\` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Datentyp? - -::: spiel frage -titel: Spiel: Welcher Datentyp? -intro: Ludwig hat Werte gesammelt. Welcher Datentyp passt zu jedem Wert? Acht Runden. -antworten: int | double | String | boolean - -runde: -frage: Welcher Datentyp passt zu \`17\`? -richtig: int -> Eine ganze Zahl ohne Komma ist ein \`int\`. - -runde: -frage: Welcher Datentyp passt zu \`3.5\`? -richtig: double -> Kommazahlen sind \`double\`. In Java steht statt des Kommas ein Punkt. - -runde: -frage: Welcher Datentyp passt zu \`"Hallo"\`? -richtig: String -> Text in Anführungszeichen ist ein \`String\`. - -runde: -frage: Welcher Datentyp passt zu \`true\`? -richtig: boolean -> \`true\` und \`false\` sind die beiden Wahrheitswerte, Datentyp \`boolean\`. - -runde: -frage: Welcher Datentyp passt zu \`"17"\`? -richtig: String -> Vorsicht, Anführungszeichen! Hier ist 17 ein Text, mit dem man nicht rechnen kann. - -runde: -frage: Welcher Datentyp passt zu \`-4\`? -richtig: int -> Auch negative ganze Zahlen sind \`int\`. - -runde: -frage: Welcher Datentyp passt zu \`0.0\`? -richtig: double -> Der Punkt macht es zur Kommazahl, auch wenn hinten nur eine 0 steht. - -runde: -frage: Welcher Datentyp passt zu \`"false"\`? -richtig: String -> In Anführungszeichen ist auch false nur ein Text. Der Wahrheitswert steht ohne Anführungszeichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable mit Datentyp, Namen und Wert anlegen. → Was ist eine Variable? -- Ich kann erklären, dass Java Groß- und Kleinschreibung unterscheidet (\`zahl\` ist nicht \`Zahl\`). → Groß- und Kleinschreibung -- Ich kann die Datentypen int, double, String und boolean unterscheiden. → Die vier Datentypen -- Ich kann erklären, dass = eine Zuweisung ist und kein Vergleich. → Zuweisung mit = -- Ich kann mit + - * / % rechnen und die ganzzahlige Division anwenden. → Rechnen -- Ich kann Variablen in Java anlegen und ausgeben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welcher Datentyp passt zu dem Wert 3.75? -→ Die vier Datentypen -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Kommazahlen haben den Typ double. In VisuStruct schreibst du sie mit Punkt. - -? Wie viele Variablen legen \`int zahl = 1\`, \`int Zahl = 2\` und \`int ZAHL = 3\` an? -→ Groß- und Kleinschreibung -- [ ] eine -- [ ] zwei -- [x] drei -> Java unterscheidet Groß- und Kleinschreibung. Die drei Namen sind verschieden, also gibt es drei Variablen. - -? Welchen Wert hat x nach \`int x = 17 / 5\`? -→ Rechnen -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> Bei ganzen Zahlen fällt alles nach dem Komma weg. Es wird nicht gerundet. - -? Was ergibt \`17 % 5\`? -→ Rechnen -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 geteilt durch 5 ist 3, Rest 2. Der Operator % liefert den Rest. - -? Am Anfang ist \`int punkte = 10\`. Was steht nach \`punkte = punkte * 2\` in punkte? -→ Zuweisung mit = -- [ ] 10 -- [ ] 12 -- [x] 20 -> Rechts wird mit dem alten Wert 10 gerechnet, das Ergebnis 20 wird in punkte gespeichert. - -? Welche Zeile legt in Java richtig eine Kommazahl an? -→ Jetzt in Java -- [ ] double preis = 2,5; -- [x] double preis = 2.5; -- [ ] Double preis = 2.5 -> Kommazahlen schreibst du mit Punkt, und am Ende steht ein Semikolon. -::: -`,Vv=`--- -titel: Sequenz -bereich: Grundlagen -kurz: Schritte nacheinander ausführen, auf die Reihenfolge achten und Werte tauschen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass eine Sequenz von oben nach unten ausgeführt wird -- erklären, warum die Reihenfolge der Schritte wichtig ist -- zwei Werte mit einer Hilfsvariablen tauschen -- eine Sequenz in Java schreiben -::: - -## Schritt für Schritt - -Eine **Sequenz** ist eine Folge von Schritten, die genau einmal und genau in dieser Reihenfolge ausgeführt werden. Im Struktogramm stehen die Kästen einfach untereinander. - -Jeder Kasten wird erst begonnen, wenn der Kasten darüber fertig ist. Es wird nichts übersprungen und nichts wiederholt. - -::: diagramm l05-sequenz.visustruct -Eine Sequenz aus vier Kästen: Zuerst bekommen \`laenge\` und \`breite\` ihre Werte, dann wird die Fläche berechnet, und zum Schluss wird sie ausgegeben. Jeder Kasten läuft genau einmal, von oben nach unten. Ausgabe: 15. -::: - -> Die Sequenz ist der einfachste der drei Grundbausteine. Fast jedes Struktogramm besteht zum größten Teil aus Sequenzen. - -## Die Reihenfolge zählt - -Beim Tee kochen merkst du sofort, wenn die Reihenfolge falsch ist. Bei Rechnungen ist es genauso, nur fällt es weniger auf. - -::: diagramm l04-rechnen.visustruct -Erst verdoppeln, dann 1 addieren: Das Ergebnis ist 7. Tauschst du die beiden mittleren Kästen, kommt 8 heraus. -::: - -Die Anweisung \`zahl = zahl * 2\` bedeutet: Nimm den Wert von \`zahl\`, rechne mal 2 und speichere das Ergebnis wieder in \`zahl\`. Was in \`zahl\` steht, hängt also davon ab, was vorher passiert ist. - -::: angeberwissen -Struktogramme sind kein reiner Schulkram. Laut Shneiderman haben auch Firmen wie IBM und Siemens damit ihre Programme geplant. Du lernst hier also Profi-Zeug. Määäh-ga! -::: - -## Übung: Reihenfolge ordnen - -::: übung l04-reihenfolge -titel: Reihenfolge ordnen -auftrag: Im Startdiagramm stehen die richtigen Kästen, aber in der falschen Reihenfolge. Verschiebe sie so, dass am Ende **20** ausgegeben wird. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Lies jeden Kasten und frage dich: Welche Variable braucht er, und wo bekommt diese Variable ihren Wert? -tipp: Eine Variable muss zuerst angelegt werden, bevor du mit ihr rechnest. Die Ausgabe kommt ganz zum Schluss. Rechne im Kopf nach: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Zwei Werte tauschen - -Stell dir zwei Gläser vor: eins mit Saft, eins mit Wasser. Willst du die Inhalte tauschen, brauchst du ein drittes, leeres Glas. - -Mit Variablen ist es genauso. Schreibst du einfach \`a = b\` und danach \`b = a\`, ist der alte Wert von \`a\` schon verloren. Am Ende haben beide Variablen denselben Wert. - -Die Lösung ist eine **Hilfsvariable**, die den alten Wert kurz aufbewahrt: - -::: grafik l05-tauschen.svg -Drei Schritte mit einem leeren Glas: erst Saft in hilf, dann Wasser nach links, dann den Saft aus hilf nach rechts. -::: - -::: diagramm l04-tauschen.visustruct -Zuerst wird a in hilf gemerkt. Dann bekommt a den Wert von b, und b bekommt den gemerkten Wert aus hilf. -::: - -## Übung: Gläser tauschen - -::: übung l04-glaeser-tauschen -titel: Gläser tauschen -auftrag: Im linken Glas ist Saft, im rechten Wasser. Tausche die Inhalte der Variablen \`links\` und \`rechts\`, bevor sie ausgegeben werden. -Ändere dazu nicht die ersten beiden Kästen, sondern füge dazwischen neue Anweisungen ein. -start: l04-tauschen-start.visustruct -test: - -> Links: Wasser | Rechts: Saft -braucht: anweisung -tipp: Wie tauschst du zwei volle Gläser im echten Leben? Du brauchst ein drittes, leeres Glas. -tipp: Lege mit \`String hilf = links\` eine Hilfsvariable an. Danach brauchst du noch zwei Zuweisungen. -lösung: l04-tauschen-loesung.visustruct -::: - -## Jetzt in Java - -Wie in Lektion 4 kannst du auch eine Sequenz direkt in Java schreiben. Das Tauschen von oben sieht so aus: - -\`\`\`java editor -int a = 5; -int b = 9; -int hilf = a; -a = b; -b = hilf; -System.out.println("a = " + a); -System.out.println("b = " + b); -\`\`\` - -- Jeder Kasten wird zu einer Zeile. Die Zeilen laufen von oben nach unten, genau wie die Kästen. -- Am Ende jeder Anweisung steht ein **Semikolon** \`;\`. -- Eine Ausgabe heißt in Java \`System.out.println(…)\`. Achte auf das große S bei \`System\`, Java unterscheidet Groß- und Kleinbuchstaben. - -Java tippst du im Bereich [Code](#zeige-codelive) rechts neben dem Struktogramm. Während du tippst, baut VisuStruct das Struktogramm mit. So siehst du sofort, welcher Kasten zu welcher Zeile gehört. - -::: übung l05-java-kino -titel: Kinokarten in Java -bereich: beide -code: java -auftrag: Eine Kinokarte kostet 9 Euro. Schreibe ein Java-Programm, das den Preis für 3 Karten ausrechnet und **Gesamt: 27** ausgibt. - „Im Editor öffnen“ öffnet rechts auch den Bereich Code. Tippe dort deinen Code, das Struktogramm entsteht dabei von selbst. Klicke dann auf Prüfen. -test: - -> Gesamt: 27 -braucht: anweisung -tipp: Du brauchst drei Variablen: den Preis, die Anzahl und das Ergebnis. Jede Zeile endet mit einem Semikolon. -tipp: \`int preis = 9;\` und \`int anzahl = 3;\` legen die Variablen an. \`int gesamt = preis * anzahl;\` rechnet, und \`System.out.println("Gesamt: " + gesamt);\` gibt das Ergebnis aus. -lösung: l05-java-kino-loesung.visustruct -::: - -## Lückentext: Gläser tauschen - -::: lückentext -titel: Zwei Werte tauschen -auftrag: Die Werte von \`a\` und \`b\` sollen getauscht werden. Ergänze die fehlenden Wörter. -\`\`\`java -int a = 3; -int b = 8; -[[int]] hilf = [[a]]; -a = [[b]]; -b = [[hilf]]; -System.out.println("a = " + a + ", b = " + b); -\`\`\` -erklärung: Erst rettest du \`a\` in die Hilfsvariable, dann bekommt \`a\` den Wert von \`b\`, und zuletzt bekommt \`b\` den geretteten Wert. Ausgabe: **a = 8, b = 3** -::: - -## Fehler finden: Guthaben - -::: übung l05-java-fehler -titel: Guthaben reparieren -code: java -auftrag: Auf der Mensakarte sind 20 Euro. Ein Essen kostet 7 Euro. Das Programm soll das Guthaben **nach** dem Bezahlen ausgeben, also **Übrig: 13**. Es gibt aber **Übrig: 20** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l05-java-fehler-start.visustruct -test: - -> Übrig: 13 -braucht: anweisung -tipp: Alle Zeilen stimmen, nur die Reihenfolge nicht. Wann wird das Guthaben ausgegeben, wann wird bezahlt? -tipp: Tausche die letzten beiden Zeilen: erst \`guthaben = guthaben - preis;\`, dann die Ausgabe. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l05-java-laeuft-nicht -titel: Pizza teilen -code: java -auftrag: Eine Pizza hat 8 Stücke, 4 Freunde teilen sie. Das Programm soll **Jeder bekommt 2 Stücke.** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Jeder bekommt 2 Stücke. -braucht: anweisung -tipp: Vergleiche den Namen in der Ausgabe Buchstabe für Buchstabe mit dem Namen, der in der dritten Zeile angelegt wird. -tipp: Die Variable heißt \`proPerson\` mit großem P (CamelCase). Schreibe sie in der Ausgabe genauso. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Kästen sortieren - -::: spiel reihenfolge -titel: Spiel: Kästen sortieren -intro: Ludwig hat die Kästen durcheinandergeworfen. Bring sie in die richtige Reihenfolge. Vier Runden. - -runde: -frage: Am Ende soll **7** ausgegeben werden. -- \`int zahl = 3\` -- \`zahl = zahl * 2\` -- \`zahl = zahl + 1\` -- \`output: zahl\` -> Erst verdoppeln, dann 1 dazu: 3 · 2 + 1 = 7. Andersherum käme (3 + 1) · 2 = 8 heraus. - -runde: -frage: Am Ende soll **8** ausgegeben werden. -- \`int zahl = 3\` -- \`zahl = zahl + 1\` -- \`zahl = zahl * 2\` -- \`output: zahl\` -> Dieselben Kästen, andere Reihenfolge, anderes Ergebnis: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a und b sollen ihre Werte tauschen. -- \`int hilf = a\` -- \`a = b\` -- \`b = hilf\` -- \`output: a + " " + b\` -> Zuerst wird a in hilf gerettet. Sonst ist der alte Wert weg, sobald a den Wert von b bekommt. - -runde: -frage: Ludwig kocht Tee. -- Wasser in den Wasserkocher füllen -- Wasserkocher einschalten -- Warten, bis das Wasser kocht -- Wasser über den Teebeutel gießen -- Tee ziehen lassen -> Jeder Schritt braucht den vorherigen. Genau wie im Struktogramm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass eine Sequenz von oben nach unten ausgeführt wird. → Schritt für Schritt -- Ich kann erklären, warum die Reihenfolge der Schritte wichtig ist. → Die Reihenfolge zählt -- Ich kann zwei Werte mit einer Hilfsvariablen tauschen. → Zwei Werte tauschen -- Ich kann eine Sequenz in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie oft wird jeder Kasten einer Sequenz ausgeführt? -→ Schritt für Schritt -- [ ] So oft, bis eine Bedingung falsch ist -- [x] Genau einmal -- [ ] Gar nicht, wenn er leer ist -> In einer Sequenz wird nichts wiederholt und nichts übersprungen. Für Wiederholungen gibt es Schleifen. - -? Am Anfang ist a = 5 und b = 9. Danach wird \`a = b\` und dann \`b = a\` ausgeführt. Was steht am Ende in den Variablen? -→ Zwei Werte tauschen -- [ ] a = 9 und b = 5 -- [x] a = 9 und b = 9 -- [ ] a = 5 und b = 5 -> Nach \`a = b\` ist der alte Wert 5 verloren. \`b = a\` kopiert dann nur die 9 zurück. - -? Wozu brauchst du beim Tauschen eine Hilfsvariable? -→ Zwei Werte tauschen -- [x] Damit ein Wert nicht überschrieben wird, bevor er gebraucht wird -- [ ] Damit das Struktogramm länger wird -- [ ] Weil man Variablen sonst nicht ausgeben kann - -? Was gibt die Sequenz \`int x = 4\`, \`x = x + 1\`, \`x = x * 3\`, \`output: x\` aus? -→ Die Reihenfolge zählt -- [ ] 13 -- [x] 15 -- [ ] 4 -> Erst wird x zu 5, dann zu 15. - -? Womit endet in Java jede Anweisung? -→ Jetzt in Java -- [ ] Mit einem Punkt . -- [x] Mit einem Semikolon ; -- [ ] Mit einem Doppelpunkt : -> Fehlt das Semikolon, zeigt VisuStruct unter dem Code einen Hinweis. -::: -`,qv=`--- -titel: Eingabe und Ausgabe -bereich: Grundlagen -kurz: Werte abfragen, Ergebnisse anzeigen und das EVA-Prinzip anwenden. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- das EVA-Prinzip erklären -- eine Eingabe mit Datentyp, Namen und Frage schreiben -- Text und Variablen in einer Ausgabe mit + verbinden -- ein Ergebnis zuerst ausrechnen und in einer Variablen speichern, dann diese Variable ausgeben, z. B. \`int summe = a + b\`, danach \`output: summe\` -- aus einem Aufgabentext Eingabe, Verarbeitung und Ausgabe herauslesen -- in Java mit dem Scanner Zahlen einlesen -- Kommentare mit \`//\` und \`/* */\` schreiben und damit meinen Code einteilen und erklären -::: - -## Das EVA-Prinzip - -Viele Programme arbeiten in drei Teilen: - -1. **Eingabe:** Das Programm fragt Werte ab, z. B. zwei Zahlen. -2. **Verarbeitung:** Es rechnet mit den Werten. -3. **Ausgabe:** Es zeigt das Ergebnis an. - -Die Anfangsbuchstaben ergeben **EVA**. Bisher standen die Werte fest im Struktogramm. Mit einer Eingabe kann bei jedem Durchlauf ein anderer Wert verwendet werden. - -::: diagramm l06-eva.visustruct -Oben die Eingabe, in der Mitte die Verarbeitung, unten die Ausgabe. Starte die Simulation und probiere verschiedene Zahlen aus. -::: - -## Eingabe mit input: - -Eine Eingabe fragt beim Ausführen einen Wert ab und speichert ihn in einer Variablen. Du schreibst den **Datentyp**, den **Namen** und eine **Frage** in Anführungszeichen: - -\`\`\` -input: int alter "Wie alt bist du?" -input: double preis "Preis in Euro?" -input: String name "Wie heißt du?" -\`\`\` - -Im Editor wählst du bei einer Anweisung oben die Art **Eingabe**. Das Wort \`input:\` steht dann schon davor, und du tippst nur noch \`int alter "Wie alt bist du?"\`. - -> Der Datentyp entscheidet, was eingegeben werden darf. Bei \`int\` meldet die Simulation einen Fehler, wenn jemand 2.5 oder Hallo eintippt. - -## Ausgabe mit output: - -Eine Ausgabe zeigt Text und Werte an. Text steht in Anführungszeichen, Variablen ohne. Mit \`+\` hängst du die Teile **aneinander**: - -\`\`\` -output: "Hallo " + name + "!" -output: "Du bist " + alter + " Jahre alt." -\`\`\` - -Achte auf die Leerzeichen innerhalb der Anführungszeichen. Ohne sie klebt alles zusammen, und du siehst \`HalloMia!\` statt \`Hallo Mia!\`. - -## Übung: Begrüßung - -::: übung l06-begruessung -titel: Begrüßung -auftrag: Frage nach dem Namen und begrüße die Person. Bei der Eingabe Ada soll **Hallo Ada!** ausgegeben werden. -test: Ada -> Hallo Ada! -test: Ben -> Hallo Ben! -braucht: anweisung -tipp: Zuerst kommt eine Eingabe für den Namen, danach eine Ausgabe, die den Namen benutzt. -tipp: Der Name ist Text, die Eingabe braucht also den Typ \`String\`. In der Ausgabe verbindest du \`"Hallo "\`, die Variable und \`"!"\` mit \`+\`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Vorsicht mit + in der Ausgabe - -In einer Ausgabe hängt \`+\` die Teile **immer** aneinander, auch bei Zahlen. Sind \`a\` gleich 3 und \`b\` gleich 4, dann zeigt - -\`\`\` -output: a + b -\`\`\` - -nicht 7, sondern **34**. Rechne deshalb vorher in einer Variablen und gib dann die Variable aus: - -\`\`\` -int summe = a + b -output: "Summe: " + summe -\`\`\` - -Das passt auch zum EVA-Prinzip: Gerechnet wird in der Verarbeitung, nicht in der Ausgabe. - -## Vom Aufgabentext zum Struktogramm - -Bevor du den ersten Kasten ziehst, liest du die Aufgabe genau und zerlegst sie. Das nennt man **Problemanalyse**. Drei Fragen helfen dir dabei: - -1. **Was ist gegeben?** Diese Werte werden zur **Eingabe**. Überlege auch den Datentyp. -2. **Was ist gesucht?** Das wird zur **Ausgabe**. -3. **Wie kommt man vom Gegebenen zum Gesuchten?** Das ist die **Verarbeitung**, oft eine Formel. - -Ein Beispiel: *Eine Kinokarte kostet 9 €. Das Programm fragt, wie viele Karten jemand kauft, und zeigt den Gesamtpreis an.* - -- Gegeben: die Anzahl der Karten → \`input: int anzahl "Wie viele Karten?"\` -- Gesucht: der Gesamtpreis → \`output: "Gesamtpreis: " + gesamt\` -- Weg: Anzahl mal 9 → \`int gesamt = anzahl * 9\` - -Jetzt musst du die drei Teile nur noch in der Reihenfolge E, V, A untereinander setzen. - -> Achte im Aufgabentext auf Signalwörter: *fragt*, *liest ein* oder *gibt ein* deuten auf eine Eingabe. *Zeigt*, *gibt aus* oder *meldet* deuten auf eine Ausgabe. - -## Übung: Rechner - -::: übung l06-rechner -titel: Summe und Produkt -auftrag: Frage zwei ganze Zahlen ab. Gib danach ihre Summe und ihr Produkt aus, jeweils in einer eigenen Zeile. -Bei 3 und 4 sieht das so aus: \`Summe: 7\` und \`Produkt: 12\`. -test: 3, 4 -> Summe: 7 | Produkt: 12 -test: 10, -2 -> Summe: 8 | Produkt: -20 -test: 0, 5 -> Summe: 5 | Produkt: 0 -braucht: anweisung -tipp: Plane die Reihenfolge: erst beide Zahlen einlesen, dann rechnen, dann ausgeben. -tipp: Du brauchst zwei Eingaben, zwei Anweisungen zum Rechnen und zwei Ausgaben. Rechne die Summe in einer eigenen Variablen, sonst hängt \`+\` die Zahlen aneinander. -lösung: l06-rechner-loesung.visustruct -::: - -## Übung: Mittelwert - -::: übung l06-mittelwert -titel: Mittelwert -auftrag: Frage zwei Zahlen ab, die auch Kommazahlen sein dürfen. Gib ihren Mittelwert aus, bei 2 und 3 also \`Mittelwert: 2.5\`. -test: 2, 3 -> Mittelwert: 2.5 -test: 4, 6 -> Mittelwert: 5.0 -test: 1.5, 2 -> Mittelwert: 1.75 -braucht: anweisung -tipp: Den Mittelwert zweier Zahlen bekommst du, wenn du sie addierst und das Ergebnis halbierst. -tipp: Für Kommazahlen nimmst du den Typ \`double\`. Der Mittelwert ist die Summe geteilt durch 2. Denk an die Klammern: \`(x + y) / 2\`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Jetzt in Java - -So sieht das EVA-Beispiel vom Anfang in Java aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Erste Zahl?"); -int a = scanner.nextInt(); -System.out.println("Zweite Zahl?"); -int b = scanner.nextInt(); -int summe = a + b; -System.out.println("Summe: " + summe); -\`\`\` - -- Für Eingaben braucht Java einen **Scanner**. Die ersten beiden Zeilen schreibst du einmal ganz oben, dann kannst du beliebig oft einlesen. -- \`scanner.nextInt()\` liest eine ganze Zahl, \`scanner.nextDouble()\` eine Kommazahl und \`scanner.next()\` ein Wort. -- Die Frage an den Benutzer ist eine normale Ausgabe direkt davor. VisuStruct macht aus beiden Zeilen zusammen einen Eingabe-Kasten. - -::: angeberwissen -Java sollte ursprünglich kleine Geräte steuern, und das tut es heute noch: Auf vielen SIM-Karten im Handy und auf Bankkarten läuft eine Mini-Version namens **Java Card**. Gut möglich, dass du gerade Java in der Hosentasche hast. -::: - -::: übung l06-java-tage -titel: Alter in Tagen -code: java -auftrag: Schreibe ein Java-Programm, das nach dem Alter in Jahren fragt und ausgibt, wie viele Tage das ungefähr sind. Rechne mit 365 Tagen pro Jahr. Bei 2 Jahren erscheint **Das sind etwa 730 Tage.** -test: 2 -> Das sind etwa 730 Tage. -test: 10 -> Das sind etwa 3650 Tage. -test: 1 -> Das sind etwa 365 Tage. -braucht: anweisung -tipp: Erst die beiden Scanner-Zeilen, dann Frage und Eingabe, dann rechnen, dann ausgeben. -tipp: \`int jahre = scanner.nextInt();\` liest ein. \`int tage = jahre * 365;\` rechnet, und \`System.out.println("Das sind etwa " + tage + " Tage.");\` gibt aus. -lösung: l06-java-tage-loesung.visustruct -::: - -## Kommentare im Code - -Im Code darfst du dir Notizen machen. Sie heißen **Kommentare** (englisch *comments*). Java überspringt sie beim Ausführen, das Programm und das Struktogramm bleiben also gleich. Es gibt zwei Arten: - -- \`//\` macht den Rest der Zeile zum Kommentar. Das ist ein **einzeiliger Kommentar**. -- \`/*\` beginnt einen **mehrzeiligen Kommentar**, \`*/\` beendet ihn. Alles dazwischen gehört zum Kommentar, egal wie viele Zeilen. Die Sternchen am Anfang der Zeilen dazwischen braucht Java nicht, sie sehen nur ordentlich aus. - -In fertigen Programmen siehst du manchmal auch \`/** … */\` mit zwei Sternchen am Anfang. Das ist ein **Javadoc-Kommentar**, aus dem Java eine Beschreibung des Programms erzeugen kann. Für dich reichen \`//\` und \`/* */\`. - -So sieht das EVA-Beispiel mit Kommentaren aus: - -\`\`\`java editor -/* - * Aufgabe: Das Programm fragt nach zwei Zahlen - * und gibt ihre Summe aus. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Eingabe -System.out.println("Erste Zahl?"); -int a = scanner.nextInt(); -System.out.println("Zweite Zahl?"); -int b = scanner.nextInt(); - -// Verarbeitung -int summe = a + b; // die beiden Zahlen addieren - -// Ausgabe -System.out.println("Summe: " + summe); // bei 3 und 4 erwarte ich: Summe: 7 - -// Nächstes Mal: auch Kommazahlen erlauben -\`\`\` - -Wofür Kommentare gut sind: - -- **Aufgabenstellung:** Oben im mehrzeiligen Kommentar steht, was das Programm können soll. -- **Einteilung:** \`// Eingabe\`, \`// Verarbeitung\` und \`// Ausgabe\` teilen den Code nach dem EVA-Prinzip ein. -- **Erklärung:** Ein Kommentar hinter einer Zeile sagt, was dein Algorithmus dort macht. -- **Erwartung:** Schreib auf, welche Ausgabe du erwartest. Beim Testen vergleichst du dann. -- **Klammern zuordnen:** Später kommen Blöcke in geschweiften Klammern \`{ }\` dazu. Dann zeigt z. B. \`} // Ende for\`, welche Klammer was schließt. -- **Gedanken festhalten:** Woran musst du denken, wenn du nächstes Mal weiterarbeitest? - -Klicke auf **Im Editor öffnen**, ändere einen Kommentar oder schreib einen neuen dazu. Das Struktogramm bleibt gleich, und VisuStruct behält deine Kommentare. - -> Schreib nicht hinter jede Zeile einen Kommentar. Erkläre, was dein Algorithmus macht und warum, nicht jedes einzelne Zeichen. - -::: angeberwissen -Beide Arten sind viel älter als Java: \`/* … */\` stammt aus der Sprache PL/I von 1964, \`//\` aus BCPL von 1967. Java hat sie über C und C++ geerbt. -::: - -## Lückentext: Kommentare - -::: lückentext -titel: Kommentare ergänzen -auftrag: Ergänze die Zeichen, damit oben ein mehrzeiliger Kommentar mit der Aufgabe steht und die anderen beiden Notizen einzeilige Kommentare sind. -\`\`\`java -[[/*]] - * Aufgabe: Das Programm rechnet Euro in Cent um. - [[*/]] -int euro = 3; -[[//]] Verarbeitung -int cent = euro * 100; -[[//]] Ausgabe, erwartet: 300 -System.out.println(cent); -\`\`\` -erklärung: \`/*\` öffnet den mehrzeiligen Kommentar und \`*/\` schließt ihn. \`//\` gilt nur bis zum Ende der Zeile, darum braucht jede Notiz ihr eigenes \`//\`. -::: - -## Lückentext: Eingabe - -::: lückentext -titel: Name und Alter einlesen -auftrag: Ergänze die fehlenden Wörter, damit das Programm einen Namen und ein Alter einliest. -\`\`\`java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("Wie heißt du?"); -[[String]] name = scanner.[[next]](); -System.out.println("Wie alt bist du?"); -int alter = scanner.[[nextInt]](); -System.out.println("Hallo " + name + ", nächstes Jahr bist du " + [[(alter + 1)]] + "."); -\`\`\` -erklärung: \`scanner.next()\` liest ein Wort, \`scanner.nextInt()\` eine ganze Zahl. Die Klammern um \`alter + 1\` sind wichtig: Ohne sie hängt Java erst \`alter\` und dann \`1\` an den Text an, aus 14 würde **141**. -::: - -## Fehler finden: Summe - -::: übung l06-java-fehler -titel: Summe reparieren -code: java -auftrag: Das Programm liest zwei Zahlen ein und soll ihre Summe ausgeben. Bei 3 und 4 erscheint aber **Summe: 34** statt **Summe: 7**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Summe: 7 -test: 10, 5 -> Summe: 15 -test: 0, 9 -> Summe: 9 -braucht: anweisung -tipp: Lies die Ausgabe von links nach rechts: Was ergibt \`"Summe: " + a\`? Und was passiert, wenn danach noch \`+ b\` kommt? -tipp: Setze Klammern, damit Java zuerst rechnet: \`System.out.println("Summe: " + (a + b));\` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l06-java-laeuft-nicht -titel: Alter im nächsten Jahr -code: java -auftrag: Das Programm fragt nach deinem Alter und soll sagen, wie alt du nächstes Jahr bist. Bei 14 also **Nächstes Jahr bist du 15**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> Nächstes Jahr bist du 15 -test: 9 -> Nächstes Jahr bist du 10 -braucht: anweisung -tipp: Die Eingabe landet in einer Variablen. Wie genau heißt sie, und wie heißt sie in der Ausgabe? -tipp: Die Variable heißt \`alter\` mit kleinem a: \`System.out.println("Nächstes Jahr bist du " + (alter + 1));\` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Was wird ausgegeben? - -::: spiel frage -titel: Spiel: Was wird ausgegeben? -intro: Ludwig hat Ein- und Ausgaben gebaut. Sag vorher, was passiert. Sieben Runden. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: Was wird ausgegeben? -- 7 -- [x] 34 -- a + b -> In einer Ausgabe hängt \`+\` die Teile immer aneinander, auch bei Zahlen. - -runde: - int a = 3 - int b = 4 - int summe = a + b - output: "Summe: " + summe -frage: Was wird ausgegeben? -- [x] Summe: 7 -- Summe: 34 -- Summe: summe -> Gerechnet wird vorher in einer Variablen. Die Ausgabe hängt nur noch Text und Ergebnis aneinander. - -runde: - input: String name "Wie heißt du?" - output: "Hallo" + name + "!" -frage: Du tippst Mia. Was wird ausgegeben? -- Hallo Mia! -- [x] HalloMia! -- Hallo name! -> Im Text \`"Hallo"\` fehlt das Leerzeichen am Ende. Darum klebt alles zusammen. - -runde: - input: int alter "Wie alt bist du?" -frage: Du tippst 2.5. Was passiert? -- alter ist 2. -- alter ist 2.5. -- [x] Die Simulation meldet einen Fehler. -> Der Datentyp \`int\` erlaubt nur ganze Zahlen. - -runde: - input: double preis "Preis in Euro?" -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- [x] Eingabe -- Verarbeitung -- Ausgabe -> \`input:\` fragt einen Wert ab. Das ist die Eingabe. - -runde: - double mittel = (a + b) / 2.0 -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- Eingabe -- [x] Verarbeitung -- Ausgabe -> Hier wird gerechnet. Das ist die Verarbeitung. - -runde: - output: "Mittelwert: " + mittel -frage: Zu welchem Teil von EVA gehört dieser Kasten? -- Eingabe -- Verarbeitung -- [x] Ausgabe -> \`output:\` zeigt das Ergebnis an. Das ist die Ausgabe. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann das EVA-Prinzip erklären. → Das EVA-Prinzip -- Ich kann eine Eingabe mit Datentyp, Namen und Frage schreiben. → Eingabe mit input: -- Ich kann Text und Variablen in einer Ausgabe mit + verbinden. → Vorsicht mit + in der Ausgabe -- Ich kann ein Ergebnis zuerst ausrechnen und in einer Variablen speichern, dann diese Variable ausgeben, z. B. \`int summe = a + b\`, danach \`output: summe\`. → Vorsicht mit + in der Ausgabe -- Ich kann aus einem Aufgabentext Eingabe, Verarbeitung und Ausgabe herauslesen. → Vom Aufgabentext zum Struktogramm -- Ich kann in Java mit dem Scanner Zahlen einlesen. → Jetzt in Java -- Ich kann Kommentare mit \`//\` und \`/* */\` schreiben und damit meinen Code einteilen und erklären. → Kommentare im Code -::: - -## Wissenstest - -::: quiz -? Wofür steht EVA? -→ Das EVA-Prinzip -- [x] Eingabe, Verarbeitung, Ausgabe -- [ ] Eingabe, Variable, Anweisung -- [ ] Erst Variablen anlegen -> Viele Programme fragen erst Werte ab, verarbeiten sie und zeigen dann das Ergebnis. - -? Die Variablen a und b haben die Werte 3 und 4. Was zeigt \`output: a + b\`? -→ Vorsicht mit + in der Ausgabe -- [ ] 7 -- [x] 34 -- [ ] a + b -> In der Ausgabe hängt + die Teile aneinander. Rechne die Summe vorher in einer Variablen aus. - -? Welche Eingabe passt, wenn ein Preis wie 4.99 eingegeben werden soll? -→ Eingabe mit input: -- [ ] input: int preis "Preis?" -- [x] input: double preis "Preis?" -- [ ] input: String "Preis?" -> 4.99 ist eine Kommazahl, also double. Außerdem braucht jede Eingabe einen Variablennamen. - -? Was zeigt \`output: "Alter: " + alter\`, wenn alter den Wert 12 hat? -→ Vorsicht mit + in der Ausgabe -- [x] Alter: 12 -- [ ] "Alter: " + 12 -- [ ] Alter: alter - -? Aufgabe: *Das Programm fragt nach dem Radius eines Kreises und zeigt seinen Umfang an.* Ordne jedem Teil des Textes zu, wohin er im EVA-Prinzip gehört. -→ Vom Aufgabentext zum Struktogramm -= fragt nach dem Radius -> Eingabe -= Umfang = 2 * 3.14 * Radius -> Verarbeitung -= zeigt seinen Umfang an -> Ausgabe -> Gegeben ist der Radius, gesucht der Umfang. Die Formel verbindet beides. - -? Was liest \`scanner.nextInt()\` ein? -→ Jetzt in Java -- [x] Eine ganze Zahl -- [ ] Eine Kommazahl -- [ ] Einen ganzen Satz -> Für Kommazahlen gibt es \`scanner.nextDouble()\`, für ein Wort \`scanner.next()\`. - -? Was macht Java mit einem Kommentar? -→ Kommentare im Code -- [ ] Es gibt ihn als Text aus. -- [x] Es überspringt ihn. -- [ ] Es meldet einen Fehler. -> Kommentare sind Notizen für Menschen. Das Programm läuft mit und ohne sie genau gleich. - -? Wo endet ein Kommentar, der mit \`/*\` beginnt? -→ Kommentare im Code -- [x] Bei \`*/\` -- [ ] Am Ende der Zeile -- [ ] Bei der nächsten Leerzeile -> Darum kann ein Kommentar mit \`/*\` über mehrere Zeilen gehen. Ein Kommentar mit \`//\` endet dagegen am Zeilenende. -::: -`,Uv=`--- -titel: Simulation und Schreibtischtest -bereich: Grundlagen -kurz: Ein Struktogramm Schritt für Schritt ausführen, von Hand nachrechnen und Fehler finden. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Simulation starten, anhalten, einzelne Schritte ausführen und stoppen -- während der Simulation Variablen, Ausgabe und den letzten Schritt ablesen -- einen Schreibtischtest als Tabelle von Hand durchführen -- Syntaxfehler, Laufzeitfehler und Logikfehler unterscheiden -- einen Fehler finden, indem ich die Werte mit meiner Erwartung vergleiche -- Java-Code mit dem Einzelschritt und Haltepunkten verfolgen -::: - -## Die Simulation starten - -Bevor es mit Verzweigungen und Schleifen weitergeht, lernst du dein wichtigstes Werkzeug kennen. Mit der Simulation prüfst du ab jetzt jede Übung selbst. - -Mit dem Knopf [▶︎ Simulation starten](#zeige-simulation) rechts bei den Werkzeugen führt VisuStruct dein Struktogramm aus. Solange die Simulation läuft, kannst du das Diagramm nicht bearbeiten. Derselbe Knopf heißt dann **■ Simulation beenden**, damit kehrst du zum Bearbeiten zurück. - -Rechts erscheint die **Steuerung**: - -- **Start** führt das Diagramm automatisch Schritt für Schritt aus. Wie lange zwischen zwei Schritten gewartet wird, stellst du bei **Pause pro Schritt** ein. -- **Pause** hält an. Danach geht es mit Start oder Schritt weiter. -- **Schritt** führt genau einen Schritt aus. So kannst du in Ruhe zuschauen. -- **Stopp** bricht ab und setzt alles auf den Anfang zurück. - -Öffne das folgende Diagramm im Editor und gehe es mit **Schritt** durch: - -::: diagramm sim-tausch.visustruct -Die Werte von a und b werden vertauscht. Die Variable hilf merkt sich dabei einen Wert. -::: - -## Was die Simulation anzeigt - -- **Markierung:** Ein Kasten im Diagramm ist farbig hervorgehoben. Bei **Letzter Schritt** ist es der Kasten, der gerade ausgeführt wurde. Bei **Nächster Schritt** ist es der Kasten, der als Nächstes drankommt. -- **Eingabe:** Fragt das Diagramm nach einem Wert, tippst du ihn hier ein und bestätigst mit **OK**. -- **Letzter Schritt:** Hier steht, was gerade passiert ist, z. B. \`a = 5 -> 5\` nach dem Kasten \`a = b\`. Links sind die Variablen schon durch ihre Werte ersetzt, rechts vom Pfeil steht das Ergebnis. -- **Variablen:** Alle Variablen mit ihren aktuellen Werten. -- **Ausgabe:** Alles, was mit \`output:\` ausgegeben wurde. - -Ist rechts der Bereich [Code](#zeige-codelive) geöffnet, läuft dort zusätzlich die [Konsole](#zeige-konsole) mit. Sie wird beim Start geleert und zeigt dann die Ausgaben und Eingaben so, wie sie auch beim echten Programm erscheinen würden. - -Am Ende erscheint **Simulation beendet**. Geht etwas schief, bleibt die Simulation auf dem fehlerhaften Kasten stehen und zeigt eine Meldung, z. B. **Unbekannte Variable: gesamt**. - -## Der Schreibtischtest - -Beim **Schreibtischtest** spielst du selbst den Computer. Du gehst das Struktogramm mit Stift und Papier durch und schreibst nach jedem Schritt die Werte der Variablen auf. Am besten machst du eine Tabelle: eine Spalte für den Schritt, eine für jede Variable und eine für die Ausgabe. - -::: grafik l07-schreibtischtest-de.svg -Ein Blatt Papier und ein Stift genügen: Du schreibst nach jedem Schritt die neuen Werte in eine neue Zeile. -::: - -Für das Diagramm oben sieht die Tabelle so aus: - -| Schritt | a | b | hilf | Ausgabe | -|---|---|---|---|---| -| \`int a = 3\` | 3 | – | – | | -| \`int b = 5\` | 3 | 5 | – | | -| \`int hilf = a\` | 3 | 5 | 3 | | -| \`a = b\` | 5 | 5 | 3 | | -| \`b = hilf\` | 5 | 3 | 3 | | -| \`output: "a = " + a\` | 5 | 3 | 3 | a = 5 | -| \`output: "b = " + b\` | 5 | 3 | 3 | b = 3 | - -Vergleiche danach deine Tabelle mit der Simulation. Stimmen die Werte unter **Variablen** nach jedem Schritt mit deiner Zeile überein? - -> Der Schreibtischtest lohnt sich besonders in Prüfungen. Dort hast du keinen Computer, aber du kannst trotzdem zeigen, was dein Struktogramm tut. - -::: angeberwissen -Früher war „Computer“ ein Beruf: Menschen, die mit Stift, Papier und Rechenmaschine rechneten. Eine der besten war die Mathematikerin Katherine Johnson bei der NASA. Sie berechnete Flugbahnen für Raumkapseln, später auch für den Flug von Apollo 11 zum Mond. - -1962 sollte John Glenn als erster Amerikaner die Erde umkreisen. Die Flugbahn hatte ein neuer IBM-Computer berechnet. Glenn traute der Maschine nicht ganz und sagte: „Holt das Mädchen, sie soll die Zahlen prüfen. Wenn sie sagt, sie stimmen, fliege ich.“ Katherine Johnson rechnete alles von Hand nach, also ein echter Schreibtischtest. Ihre Zahlen stimmten, und Glenn flog. - -Katherine Johnson war Schwarz, und im US-Bundesstaat Virginia trennten damals Gesetze Schwarze und Weiße. Im Film „Hidden Figures“ (2016) muss sie für jeden Toilettengang quer über das Gelände laufen. Das ist für den Film zugespitzt: Getrennte Toiletten gab es wirklich, aber Katherine Johnson hat das Schild nach eigener Aussage einfach ignoriert. - -Ihre Kollegin Dorothy Vaughan merkte früh, dass die IBM-Computer die Rechenarbeit übernehmen würden. Sie brachte sich und ihrem ganzen Team die Programmiersprache FORTRAN bei. So wurden aus menschlichen Computern Programmiererinnen. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), Mathematikerin bei der NASA (Foto: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), gemeinfrei). -::: - -## Drei Arten von Fehlern - -Fehler gehören zum Programmieren dazu, auch bei Profis. Man unterscheidet drei Arten, denn jede findest du auf einem anderen Weg: - -- **Syntaxfehler** (syntax error): Der Text hält sich nicht an die Regeln der Sprache, z. B. fehlt am Ende ein \`;\`. Das Programm startet gar nicht. -- **Laufzeitfehler** (runtime error): Das Programm startet, bricht aber an einer Stelle ab, z. B. beim Teilen durch 0. -- **Logikfehler** (logic error): Das Programm läuft bis zum Ende, aber das Ergebnis ist falsch, z. B. weil Klammern fehlen: \`a + b / 2\` statt \`(a + b) / 2\`. - -So zeigt dir VisuStruct die Fehler: - -- **Syntaxfehler:** Im Struktogramm passieren sie seltener, weil die Kästen die Form vorgeben. Im Bereich [Code](#zeige-codelive) wird die Stelle rot unterstrichen, die Zeilennummer wird rot, und dazu steht z. B. **Zeile 2: Hier fehlt noch: ;**. -- **Laufzeitfehler:** Die Simulation bleibt auf dem Kasten stehen und meldet z. B. **Division durch null.** Im Bereich Code wird die Zeilennummer rot, und die [Konsole](#zeige-konsole) nennt die Zeile: **Zeile 3: Division durch null.** -- **Logikfehler:** Hier meldet niemand etwas. Der Computer weiß nicht, was du eigentlich wolltest. Nur du kennst das richtige Ergebnis, darum hilft hier der Schreibtischtest. - -> Eine rote Zeilennummer zeigt einen Fehler. Der runde rote Punkt vor der Zeilennummer ist etwas anderes: ein Haltepunkt. Den lernst du unten bei „Jetzt in Java“ kennen. - -## Fehler finden - -Gibt ein Struktogramm etwas Falsches aus, ist das ein Logikfehler. Dann gehst du so vor: - -1. **Erwartung aufschreiben:** Was soll bei einer bestimmten Eingabe herauskommen? -2. **Schritt für Schritt ausführen:** Starte die Simulation mit **Schritt** und beobachte die Variablen. -3. **Die Stelle finden:** Wo weicht ein Wert zum ersten Mal von deiner Erwartung ab? Genau dort steckt der Fehler. - -Häufige Fehler in einer Sequenz sind: - -- Die **Reihenfolge** stimmt nicht: Eine Variable wird benutzt, bevor sie einen Wert hat. -- Ein Wert wird **überschrieben**, bevor er gebraucht wird. -- **Klammern** fehlen: \`a + b / 2\` ist etwas anderes als \`(a + b) / 2\`. -- Zwei ganze Zahlen werden geteilt: \`7 / 2\` ergibt \`3\`, weil bei \`int\` die Nachkommastellen wegfallen. - -> Später kommen Verzweigungen und Schleifen dazu. Dann zeigt dir die Simulation auch, welcher Weg genommen wird und wie oft eine Schleife läuft. - -::: angeberwissen -Am 9. September 1947 fand das Team von Grace Hopper im Rechner Harvard Mark II eine echte Motte, die zwischen zwei Kontakten klemmte. Sie klebten sie ins Logbuch und schrieben dazu: „Erster echter Fall, dass ein Bug gefunden wurde.“ Die Motte liegt heute in einem Museum in Washington. - -Grace Hopper war eine der ersten Programmiererinnen der Welt. 1952 baute sie einen der ersten **Compiler**: ein Programm, das Code in Maschinencode übersetzt. Sie fand, dass man Computern Befehle in fast normalem Englisch geben sollte. Daraus entstand die Programmiersprache COBOL, mit der viele Banken bis heute rechnen. Bei der US-Marine wurde sie sogar Admiralin. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), Informatikerin und Admiralin (Foto: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), gemeinfrei). -::: - -## Übung: Tauschen reparieren - -::: übung sim-tausch -titel: Tauschen reparieren -auftrag: Das Struktogramm soll zwei Zahlen einlesen und sie vertauscht wieder ausgeben. Bei 3 und 5 soll also erst **5** und dann **3** erscheinen. Es gibt aber zweimal 5 aus. - Mache einen Schreibtischtest oder nutze **Schritt** und repariere den Fehler. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Gehe das Diagramm mit **Schritt** durch und schreibe nach jedem Schritt die Werte von a und b auf. Wo verschwindet die 3? -tipp: Schau dir a nach dem Schritt \`a = b\` an. Wo ist der alte Wert von a geblieben? Merke ihn dir vorher in einer Hilfsvariablen, wie im Beispiel oben. -lösung: sim-tausch-loesung.visustruct -::: - -## Übung: Kinokarten reparieren - -::: übung sim-kino -titel: Kinokarten reparieren -auftrag: Eine Kinokarte kostet 8.50 €. Das Struktogramm soll nach der Anzahl fragen und den Gesamtpreis ausgeben, bei 2 Karten also \`Gesamt: 17.0\`. - Starte die Simulation. Sie bleibt mit einer Fehlermeldung stehen. Finde heraus, warum, und repariere das Struktogramm. -start: sim-kino-start.visustruct -test: 2 -> Gesamt: 17.0 -test: 3 -> Gesamt: 25.5 -test: 0 -> Gesamt: 0.0 -braucht: anweisung -tipp: Lies die Fehlermeldung der Simulation genau. Welche Variable kennt sie noch nicht? -tipp: Die Simulation führt die Kästen von oben nach unten aus. Hat gesamt schon einen Wert, wenn die Ausgabe drankommt? Du kannst Kästen mit der Maus verschieben. -lösung: sim-kino-loesung.visustruct -::: - -> Läuft eine Simulation endlos weiter, klicke auf **Stopp**. Beim **Prüfen** einer Übung bricht VisuStruct nach sehr vielen Schritten von selbst ab. - -## Jetzt in Java - -Auch Java-Code kannst du Schritt für Schritt ausführen. Im Bereich [Code](#zeige-codelive) heißt das Werkzeug dafür **Debugger**: - -- Klicke links auf eine Zeilennummer. Ein roter Punkt erscheint, das ist ein **Haltepunkt**. [▶︎ Ausführen](#zeige-ausfuehren) hält vor dieser Zeile an. -- Der Knopf [Einzelschritt](#zeige-einzelschritt) führt genau eine Zeile aus, wie **Schritt** in der Simulation. -- Unter dem Code steht, welchen Wert jede Variable gerade hat. Das ist dein Schreibtischtest, nur dass der Computer mitschreibt. - -::: übung l07-java-pizza -titel: Pizzabestellung reparieren -code: java -auftrag: Eine Pizza kostet 8 Euro, Extra-Käse 2 Euro. Für 3 Pizzen mit Extra-Käse soll das Programm **Gesamt: 30** ausgeben. Es gibt aber 14 aus. - Gehe den Java-Code mit dem Einzelschritt durch und beobachte \`gesamt\`. Finde den Fehler und repariere ihn im Code. -start: l07-java-pizza-start.visustruct -test: - -> Gesamt: 30 -braucht: anweisung -tipp: Welcher Wert steht nach der vierten Zeile in \`gesamt\`? Rechne im Kopf nach, was Java zuerst ausrechnet. -tipp: Wie in Mathe gilt Punkt vor Strich: \`preis + kaese * anzahl\` ist \`8 + 6\`. Setze Klammern: \`(preis + kaese) * anzahl\`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Lückentext: Schreibtischtest - -::: lückentext -titel: Was steht in den Variablen? -auftrag: Mach einen Schreibtischtest im Kopf. Trage hinter jeder Zeile ein, welchen Wert die Variable danach hat, und in der letzten Zeile, was ausgegeben wird. -\`\`\`java -int a = 5; -int b = 2; -a = a + b; // a ist jetzt [[7]] -b = a * 2; // b ist jetzt [[14]] -a = b - a; // a ist jetzt [[7]] -System.out.println(a + b); // Ausgabe: [[21]] -\`\`\` -erklärung: Jede Zeile rechnet mit den Werten, die gerade in den Variablen stehen: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, Ausgabe 7 + 14 = 21. Mit dem Einzelschritt im Bereich Code kannst du es nachprüfen. -::: - -## Fehler finden: Spielstand - -::: übung l07-java-fehler -titel: Spielstand reparieren -code: java -auftrag: Ludwig bekommt in einem Spiel erst 10 Punkte, dann 5 Punkte, dann verliert er 3 Punkte. Am Ende soll **Punkte: 12** erscheinen. Es erscheint aber **Punkte: 3**. - Gehe den Code mit dem Einzelschritt durch und beobachte \`punkte\`. Repariere die falsche Zeile und klicke auf Prüfen. -start: l07-java-fehler-start.visustruct -test: - -> Punkte: 12 -braucht: anweisung -tipp: Nach welcher Zeile hat \`punkte\` plötzlich den Wert 3? Was soll in dieser Zeile eigentlich passieren? -tipp: Ludwig verliert 3 Punkte, also wird vom alten Wert abgezogen: \`punkte = punkte - 3;\` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l07-java-laeuft-nicht -titel: Bonus reparieren -code: java -auftrag: Ludwig hat 10 Punkte und bekommt 5 Bonuspunkte. Am Ende soll **Punkte: 15** erscheinen. Der Code läuft aber nicht. Gehe ihn auch mit dem Einzelschritt durch: In welcher Zeile bleibt er stehen? - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Punkte: 15 -braucht: anweisung -tipp: Java arbeitet den Code von oben nach unten ab. Gibt es \`bonus\` schon, wenn damit gerechnet wird? -tipp: Lege \`bonus\` vor der Rechnung an: erst \`int bonus = 5;\`, dann \`punkte = punkte + bonus;\` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Mach im Kopf den Schreibtischtest und tippe auf die falsche Zeile, bevor die Zeit abläuft. Die Programme sind in Java, aber jede Zeile ist ein Kasten wie im Struktogramm. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int hilf = a; - a = b; - b = a; -frage: Soll die Werte von a und b tauschen. -fehler: 5 -besser: b = hilf; -> In a steht schon der Wert von b. Der alte Wert von a steckt in hilf. - -runde: - int a = 4; - int b = 6; - double mittel = a + b / 2; - System.out.println(mittel); -frage: Soll den Mittelwert 5.0 ausgeben. -fehler: 3 -besser: double mittel = (a + b) / 2.0; -> Ohne Klammern wird zuerst geteilt: 4 + 6 / 2 = 7. - -runde: - int karten = 3; - double preis = 8.5; - double gesamt = karten + preis; - System.out.println("Gesamt: " + gesamt); -frage: Soll den Preis für 3 Kinokarten zu je 8,50 € ausgeben. -fehler: 3 -besser: double gesamt = karten * preis; -> Für den Gesamtpreis wird malgenommen, nicht addiert. - -runde: - int minuten = 135; - int stunden = minuten / 60; - int rest = minuten / 60; - System.out.println(stunden + " h " + rest + " min"); -frage: Soll 2 h 15 min ausgeben. -fehler: 3 -besser: int rest = minuten % 60; -> Den Rest beim Teilen liefert \`%\`. Mit \`/\` stünde auch in rest eine 2. - -runde: - String name = "Ada"; - System.out.println("Hallo " + "name" + "!"); -frage: Soll „Hallo Ada!“ ausgeben. -fehler: 2 -besser: System.out.println("Hallo " + name + "!"); -> In Anführungszeichen ist name nur ein Text. Die Variable steht ohne Anführungszeichen. - -runde: - double preis = 100; - preis = preis * 0.1; - System.out.println(preis); -frage: Soll den Preis um 10 % erhöhen, also 110.0 ausgeben. -fehler: 2 -besser: preis = preis + preis * 0.1; -> Mal 0.1 ergibt nur die 10 %, also 10.0. Die müssen zum alten Preis dazukommen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Simulation starten, anhalten, einzelne Schritte ausführen und stoppen. → Die Simulation starten -- Ich kann während der Simulation Variablen, Ausgabe und den letzten Schritt ablesen. → Was die Simulation anzeigt -- Ich kann einen Schreibtischtest als Tabelle von Hand durchführen. → Der Schreibtischtest -- Ich kann Syntaxfehler, Laufzeitfehler und Logikfehler unterscheiden. → Drei Arten von Fehlern -- Ich kann einen Fehler finden, indem ich die Werte mit meiner Erwartung vergleiche. → Fehler finden -- Ich kann Java-Code mit dem Einzelschritt und Haltepunkten verfolgen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Mit welchem Knopf führst du genau einen Schritt aus? -→ Die Simulation starten -- [ ] Start -- [x] Schritt -- [ ] Stopp -> Start läuft automatisch weiter, Schritt führt nur einen Schritt aus. - -? Was schreibst du beim Schreibtischtest nach jedem Schritt auf? -→ Der Schreibtischtest -- [ ] Nur die Ausgabe am Ende -- [x] Die aktuellen Werte aller Variablen -- [ ] Den erzeugten Java-Code -> So siehst du genau, an welcher Stelle ein Wert anders ist als erwartet. - -? Erst \`int a = 3\`, dann \`int b = 5\`, dann \`a = b\`. Welche Werte haben a und b danach? -→ Der Schreibtischtest -- [ ] a = 5 und b = 3 -- [x] a = 5 und b = 5 -- [ ] a = 3 und b = 5 -> Der alte Wert von a ist überschrieben. Darum braucht man beim Tauschen eine Hilfsvariable. - -? Im Feld Letzter Schritt steht \`preis = 4 * 2.5 -> 10.0\`. Was bedeutet das? -→ Was die Simulation anzeigt -- [ ] Die Variable preis hat jetzt den Wert 4. -- [x] 4 * 2.5 wurde ausgerechnet und das Ergebnis 10.0 in preis gespeichert. -- [ ] Die Simulation hat einen Fehler gefunden. - -? Die Simulation meldet **Unbekannte Variable: summe**. Was ist ein wahrscheinlicher Grund? -→ Fehler finden -- [x] summe wird benutzt, bevor sie einen Wert bekommen hat. -- [ ] summe ist zu groß. -- [ ] Das Struktogramm hat zu viele Kästen. - -? Was macht ein roter Punkt vor einer Zeilennummer im Bereich Code? -→ Jetzt in Java -- [ ] Er markiert einen Fehler. -- [x] Das Programm hält vor dieser Zeile an. -- [ ] Die Zeile wird übersprungen. -> Das ist ein Haltepunkt. Mit ▶︎ oder dem Einzelschritt geht es weiter. -? Ordne jedem Fehler seine Fehlerart zu. -→ Drei Arten von Fehlern -= Am Zeilenende fehlt das Semikolon. -> Syntaxfehler -= Das Programm teilt durch 0 und bricht ab. -> Laufzeitfehler -= Der Durchschnitt ist zu groß, weil Klammern fehlen. -> Logikfehler - -? Das Programm läuft ohne Meldung bis zum Ende, gibt aber 12 statt 21 aus. Welche Fehlerart ist das? -→ Drei Arten von Fehlern -- [ ] Syntaxfehler -- [ ] Laufzeitfehler -- [x] Logikfehler -> Es gibt keine Meldung, das Ergebnis ist trotzdem falsch. So einen Fehler findest du nur mit deiner Erwartung und dem Schreibtischtest. -::: -`,Qv=`--- -titel: Verzweigung -bereich: Grundlagen -kurz: Mit einer Bedingung entscheiden, welcher von zwei Wegen ausgeführt wird. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass bei einer Verzweigung genau ein Zweig ausgeführt wird -- die Vergleichsoperatoren == != < <= > >= anwenden -- == und = unterscheiden -- eine Verzweigung mit einem leeren Zweig bauen -- eine Verzweigung mit if und else in Java schreiben -::: - -## Wenn, dann, sonst - -Bisher wurden alle Kästen immer ausgeführt. Oft soll ein Programm aber **entscheiden**: Wenn eine Bedingung erfüllt ist, tue das eine, sonst das andere. - -::: diagramm l07-alter-pruefen.visustruct -Je nach eingegebenem Alter erscheint die eine oder die andere Meldung. Probiere in der Simulation 17 und 18 aus. -::: - -Dafür gibt es die **Verzweigung**. Oben im Dreieck steht die Bedingung. Darunter teilt sich das Struktogramm in zwei Zweige: - -- **true** (links): wird ausgeführt, wenn die Bedingung wahr ist -- **false** (rechts): wird ausgeführt, wenn die Bedingung falsch ist - -Es wird immer **genau einer** der beiden Zweige ausgeführt. Danach geht es unter der Verzweigung weiter. - -## Eine Verzweigung einfügen - -Ziehe die **Verzweigung** aus dem Bereich Elemente ins Struktogramm. Klicke das Dreieck an und schreibe im Objektinspektor die Bedingung, z. B. \`alter >= 18\`. Das Wort \`if\` steht schon davor. - -In jedem Zweig liegt zuerst ein Platzhalter ø. Ziehe dort Anweisungen hinein. In einem Zweig dürfen auch mehrere Kästen untereinander stehen. - -## Vergleichsoperatoren - -Eine Bedingung ist meistens ein **Vergleich**. Sein Ergebnis ist immer \`true\` oder \`false\`. - -- \`==\` gleich, z. B. \`zahl == 0\` -- \`!=\` ungleich, z. B. \`antwort != 42\` -- \`<\` kleiner, \`<=\` kleiner oder gleich -- \`>\` größer, \`>=\` größer oder gleich - -> Verwechsle \`==\` nicht mit \`=\`. Ein einzelnes \`=\` ist eine Zuweisung und speichert einen Wert. Zum Vergleichen brauchst du zwei Gleichheitszeichen. - -Mit \`%\` prüfst du, ob eine Zahl durch eine andere teilbar ist: \`zahl % 2 == 0\` ist wahr, wenn \`zahl\` gerade ist. - -## Übung: Gerade oder ungerade - -::: übung l07-gerade -titel: Gerade oder ungerade -auftrag: Frage eine ganze Zahl ab. Gib **gerade** aus, wenn sie gerade ist, und sonst **ungerade**. -test: 4 -> gerade -test: 7 -> ungerade -test: 0 -> gerade -braucht: verzweigung -tipp: Hier gibt es zwei Möglichkeiten, also brauchst du eine Verzweigung. Woran erkennst du eine gerade Zahl? -tipp: Eine Zahl ist gerade, wenn beim Teilen durch 2 kein Rest bleibt. Die Bedingung lautet \`zahl % 2 == 0\`. -lösung: l07-gerade-loesung.visustruct -::: - -## Übung: Die größere Zahl - -::: übung l07-maximum -titel: Die größere Zahl -auftrag: Frage zwei ganze Zahlen ab und gib nur die größere von beiden aus. Sind beide gleich, gib diese Zahl aus. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: Eine Verzweigung vergleicht die beiden Zahlen. In jedem Zweig steht genau eine Ausgabe. -tipp: Vergleiche mit \`a > b\`. Im true-Zweig gibst du \`a\` aus, im false-Zweig \`b\`. -lösung: l07-maximum-loesung.visustruct -::: - -## Ein leerer Zweig - -Manchmal soll nur dann etwas passieren, wenn die Bedingung wahr ist, und sonst gar nichts. Dann bleibt der false-Zweig **leer**. Im Struktogramm steht dort der Platzhalter **ø**. - -::: diagramm l07-rabatt.visustruct -Ab 50 Euro gibt es 5 Euro Rabatt. Sonst passiert nichts, der false-Zweig ist leer. Die Ausgabe darunter wird in beiden Fällen ausgeführt. -::: - -::: angeberwissen -Eine einzige vergessene Verzweigung hat 2014 halb das Internet in Aufregung versetzt: die Sicherheitslücke **Heartbleed** in OpenSSL, einem Programm, das viele Webseiten für die Verschlüsselung benutzen. Ein Computer konnte dem Server sagen: „Schick mir das Wort *Hut* zurück, es hat 500 Buchstaben.“ Der Server hat nicht geprüft, ob die 500 zur echten Länge 3 passen, und einfach 500 Zeichen aus seinem Speicher zurückgeschickt. Darin standen manchmal Passwörter anderer Leute. Gefehlt hat nur ein if: Wenn die angegebene Länge größer ist als die echte, dann nichts zurückschicken. Mit Klammern hatte das übrigens nichts zu tun. Mäh, prüf deine Eingaben, bevor du ihnen glaubst. -::: - -## Übung: Betrag - -::: übung l07-betrag -titel: Betrag einer Zahl -auftrag: Frage eine ganze Zahl ab. Ist sie negativ, mache sie positiv. Gib danach die Zahl aus. Aus -5 wird also 5, und 7 bleibt 7. -Nutze eine Verzweigung mit einem leeren Zweig und nur **einer** Ausgabe unter der Verzweigung. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Nur negative Zahlen müssen verändert werden. Was passiert mit einer Zahl, wenn du sie mal -1 nimmst? -tipp: Die Bedingung ist \`zahl < 0\`. Im true-Zweig drehst du das Vorzeichen um, z. B. mit \`zahl = 0 - zahl\`. Der false-Zweig bleibt leer. -lösung: l07-betrag-loesung.visustruct -::: - -## Jetzt in Java - -So sieht die Altersprüfung vom Anfang dieser Lektion in Java aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie alt bist du?"); -int alter = scanner.nextInt(); -if (alter >= 18) { - System.out.println("Du bist volljährig."); -} else { - System.out.println("Du bist noch nicht volljährig."); -} -\`\`\` - -- Die Bedingung steht nach \`if\` in **runden Klammern** \`( )\`. -- Der true-Zweig steht in **geschweiften Klammern** \`{ }\`, der false-Zweig folgt nach \`else\` in eigenen geschweiften Klammern. Hinter einer geschweiften Klammer steht kein Semikolon. -- Ist der false-Zweig leer, lässt du \`else { }\` einfach weg. -- Die ersten beiden Zeilen braucht dein Programm einmal, sobald es etwas einliest. Danach liest \`scanner.nextInt()\` eine ganze Zahl ein. Die Frage davor ist eine normale Ausgabe. - -::: angeberwissen -Java hat auch ein Maskottchen: **Duke**, ein kleiner schwarz-weißer Kerl mit großer roter Nase. Er wurde 1992 im Team von Java gezeichnet und winkt seitdem von Konferenzen und T-Shirts. Ludwig findet, ein Geißbock hätte besser gepasst. -::: - -::: übung l08-java-bestanden -titel: Bestanden in Java -code: java -auftrag: Schreibe ein Java-Programm, das nach der Punktzahl fragt. Ab 50 Punkten gibt es **bestanden** aus, sonst **nicht bestanden**. - Tippe den Code im Bereich Code und klicke dann auf Prüfen. -test: 50 -> bestanden -test: 49 -> nicht bestanden -test: 100 -> bestanden -test: 0 -> nicht bestanden -braucht: verzweigung -tipp: Fang mit den beiden Zeilen für den Scanner an. Dann fragst du nach den Punkten, liest sie ein und vergleichst sie mit \`if\`. -tipp: Die Bedingung lautet \`punkte >= 50\`. In den Zweigen steht \`System.out.println("bestanden");\` und nach \`else\` \`System.out.println("nicht bestanden");\`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Lückentext: Gerade oder ungerade - -::: lückentext -titel: Gerade oder ungerade -auftrag: Ergänze die fehlenden Wörter und Zeichen. Das Programm soll ausgeben, ob eine Zahl gerade ist. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Zahl?"); -int zahl = scanner.nextInt(); -[[if]] (zahl [[%]] 2 [[==]] 0) [[{]] - System.out.println("gerade"); -[[}]] [[else]] { - System.out.println("ungerade"); -} -\`\`\` -erklärung: \`zahl % 2\` ist der Rest beim Teilen durch 2. Ist er 0, ist die Zahl gerade. Zum Vergleichen brauchst du \`==\`, ein einzelnes \`=\` ist eine Zuweisung. Beide Zweige stehen in geschweiften Klammern. -::: - -::: angeberwissen -Steht im Zweig nur eine einzige Anweisung, darf man in Java die geschweiften Klammern sogar weglassen. Wir machen das trotzdem nie, und zwar aus diesem Grund: - -\`\`\`java -if (alter >= 18) - System.out.println("Du bist volljährig."); - System.out.println("Du darfst den Film sehen."); -\`\`\` - -Ohne Klammern gehört nur die erste Zeile zum if. Die zweite läuft immer, auch für Zwölfjährige. Die Einrückung täuscht, denn Java achtet nicht auf Leerzeichen. - -Genau so ein Fehler steckte 2014 in iPhones und Macs, bekannt als **„goto fail“**. In der Sprache C stand unter einem if ohne Klammern die Zeile \`goto fail;\` aus Versehen zweimal. Die zweite lief immer und übersprang die Prüfung der Sicherheitszertifikate. In einem offenen WLAN hätte sich ein Angreifer so zum Beispiel als deine Bank ausgeben können. Mäh, Klammern kosten zwei Zeichen, eine Sicherheitslücke kostet viel mehr. -::: - -## Fehler finden: Eintritt - -::: übung l08-java-fehler -titel: Eintritt reparieren -code: java -auftrag: Im Zoo haben Kinder **unter** 6 Jahren freien Eintritt, alle anderen zahlen 4 Euro. Das Programm lässt aber auch Sechsjährige umsonst hinein. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l08-java-fehler-start.visustruct -test: 5 -> Eintritt frei -test: 6 -> 4 Euro -test: 10 -> 4 Euro -test: 0 -> Eintritt frei -braucht: verzweigung -tipp: Probiere das Programm mit 6 aus. Welcher Vergleichsoperator lässt die 6 noch durch? -tipp: „Unter 6“ heißt \`alter < 6\`. \`<=\` bedeutet „kleiner oder gleich“. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l08-java-laeuft-nicht -titel: Film ab 16 -code: java -auftrag: Der Film ist ab 16. Ludwig ist 15, also soll das Programm **Kein Einlass** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> Kein Einlass -braucht: verzweigung -tipp: Schau dir die Bedingung in der Klammer nach \`if\` genau an. Gibt es diese Variable? -tipp: Die Variable heißt \`alter\` mit kleinem a: \`if (alter >= 16) {\` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Weg? - -::: spiel frage -titel: Spiel: Welcher Weg? -intro: Ludwig hat Verzweigungen in Java geschrieben. Rechne die Bedingung im Kopf aus und sag vorher, was ausgegeben wird. Sieben Runden. - -runde: - int x = 5; - if (x > 5) { - System.out.println("groß"); - } else { - System.out.println("klein"); - } -frage: Was wird ausgegeben? -- groß -- [x] klein -- nichts -> 5 > 5 ist falsch, denn 5 ist nicht größer als 5. Also der false-Zweig. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("groß"); - } else { - System.out.println("klein"); - } -frage: Was wird ausgegeben? -- [x] groß -- klein -- groß und klein -> \`>=\` heißt „größer oder gleich“. 5 >= 5 ist wahr. - -runde: - int zahl = 7; - if (zahl % 2 == 0) { - System.out.println("gerade"); - } else { - System.out.println("ungerade"); - } -frage: Was wird ausgegeben? -- gerade -- [x] ungerade -- 1 -> 7 % 2 ist der Rest 1, also nicht 0. Die Zahl ist ungerade. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: Was wird ausgegeben? -- -4 -- [x] 4 -- nichts -> -4 < 0 ist wahr, also wird das Vorzeichen umgedreht. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: Was wird ausgegeben? -- -4 -- [x] 4 -- nichts -> 4 < 0 ist falsch. Der false-Zweig ist leer, das Programm macht einfach unten weiter. - -runde: - int note = 3; - if (note != 3) { - System.out.println("anders"); - } else { - System.out.println("drei"); - } -frage: Was wird ausgegeben? -- anders -- [x] drei -- nichts -> \`!=\` heißt „ungleich“. 3 != 3 ist falsch. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: Was wird ausgegeben? -- 8 -- [x] 12 -- 20 -> Das Programm gibt die größere der beiden Zahlen aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass bei einer Verzweigung genau ein Zweig ausgeführt wird. → Wenn, dann, sonst -- Ich kann die Vergleichsoperatoren == != < <= > >= anwenden. → Vergleichsoperatoren -- Ich kann == und = unterscheiden. → Vergleichsoperatoren -- Ich kann eine Verzweigung mit einem leeren Zweig bauen. → Ein leerer Zweig -- Ich kann eine Verzweigung mit if und else in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welcher Zweig wird ausgeführt, wenn die Bedingung falsch ist? -→ Wenn, dann, sonst -- [ ] Der true-Zweig -- [x] Der false-Zweig -- [ ] Beide Zweige -- [ ] Keiner, das Programm endet -> Bei false wird der rechte Zweig ausgeführt. Danach geht es unter der Verzweigung weiter. - -? Mit welcher Bedingung prüfst du, ob alter genau 18 ist? -→ Vergleichsoperatoren -- [ ] alter = 18 -- [x] alter == 18 -- [ ] alter >= 18 -> Ein einzelnes = ist eine Zuweisung. Zum Vergleichen brauchst du ==. - -? Was bedeutet ø in einem Zweig? -→ Ein leerer Zweig -- [x] In diesem Fall passiert nichts. -- [ ] Das Programm endet hier. -- [ ] Die Bedingung ist falsch. - -? Die Bedingung lautet \`punkte >= 50\`. Bei welchem Wert ist sie wahr? -→ Vergleichsoperatoren -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= heißt größer oder gleich. 50 gehört also dazu. - -? In Schulbüchern hat die Verzweigung oft noch einen anderen Namen. Welchen? -→ Wenn, dann, sonst -- [ ] Mehrfachauswahl -- [x] Bedingte Anweisung -- [ ] Wiederholungsstruktur -> Die Anweisungen in einem Zweig werden nur unter einer Bedingung ausgeführt. Darum heißt sie auch bedingte Anweisung. - -? Wo steht in Java die Bedingung einer Verzweigung? -→ Jetzt in Java -- [x] In runden Klammern direkt nach if -- [ ] In geschweiften Klammern nach else -- [ ] Hinter einem Semikolon -> \`if (alter >= 18) { … }\`: Die runden Klammern gehören zur Bedingung, die geschweiften zum Zweig. -::: -`,$v=`--- -titel: Bedingungen verknüpfen -bereich: Grundlagen -kurz: Mehrere Bedingungen mit und, oder und nicht verbinden und Wertebereiche prüfen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, wann eine Verknüpfung mit && wahr ist -- erklären, wann eine Verknüpfung mit || wahr ist -- eine Bedingung mit ! umdrehen -- prüfen, ob ein Wert in einem Bereich wie 1 bis 6 liegt -- die Wahrheitstabelle für &&, || und ! lesen -- das Ergebnis einer Bedingung in einer boolean-Variablen speichern -- zusammengesetzte Bedingungen sicher auswerten -- Bedingungen in Java mit && und || verknüpfen -::: - -## Und: && - -Manchmal reicht ein einzelner Vergleich nicht. Ein Jugendticket gibt es zum Beispiel nur, wenn jemand **mindestens 12 und jünger als 18** ist. - -Mit \`&&\` (und) verbindest du zwei Bedingungen. Das Ergebnis ist nur dann \`true\`, wenn **beide** Bedingungen wahr sind. - -::: diagramm l08-jugendticket.visustruct -Beide Vergleiche müssen stimmen. Probiere in der Simulation 11, 12, 17 und 18 aus. -::: - -## Oder: || - -Mit \`||\` (oder) ist das Ergebnis \`true\`, wenn **mindestens eine** der Bedingungen wahr ist. Es dürfen auch beide wahr sein. - -\`\`\` -tag == 6 || tag == 7 -\`\`\` - -Diese Bedingung ist wahr, wenn \`tag\` den Wert 6 oder den Wert 7 hat, also am Samstag oder Sonntag. - -> Die beiden senkrechten Striche \`|\` tippst du auf vielen Tastaturen mit AltGr und der Taste \`<\`, am Mac mit Option und 7. - -## Übung: Wochenende - -::: übung l08-wochenende -titel: Wochenende -auftrag: Frage einen Wochentag als Zahl ab (1 ist Montag, 7 ist Sonntag). Gib **Wochenende** aus, wenn es Samstag oder Sonntag ist, sonst **Werktag**. -test: 6 -> Wochenende -test: 7 -> Wochenende -test: 1 -> Werktag -test: 5 -> Werktag -braucht: verzweigung -tipp: Wochenende ist, wenn der Tag 6 **oder** 7 ist. Dafür brauchst du zwei Vergleiche in einer Bedingung. -tipp: Samstag ist 6, Sonntag ist 7. Verbinde die beiden Vergleiche mit \`||\`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Wertebereiche prüfen - -Schulnoten gehen von 1 bis 6. Ob eine Note **im Bereich** liegt, prüfst du mit zwei Vergleichen und \`&&\`: - -\`\`\` -note >= 1 && note <= 6 -\`\`\` - -::: grafik l08-zahlenstrahl.svg -Gültig ist der grüne Bereich von 1 bis 6, beide Ränder gehören dazu. -::: - -Umgekehrt ist eine Note **außerhalb** des Bereichs, wenn sie zu klein **oder** zu groß ist: - -::: diagramm l08-note.visustruct -Eine Note kleiner als 1 oder größer als 6 gibt es nicht. -::: - -> Die Schreibweise aus Mathe \`1 <= note <= 6\` funktioniert nicht. Du musst sie in zwei Vergleiche aufteilen und mit \`&&\` verbinden. - -## Übung: Gültige Note - -::: übung l08-note-gueltig -titel: Gültige Note -auftrag: Frage eine Note als ganze Zahl ab. Gib **gültig** aus, wenn sie zwischen 1 und 6 liegt (1 und 6 gehören dazu), sonst **ungültig**. -test: 1 -> gültig -test: 6 -> gültig -test: 3 -> gültig -test: 0 -> ungültig -test: 7 -> ungültig -braucht: verzweigung -tipp: Eine gültige Note muss zwei Dinge gleichzeitig erfüllen: nicht zu klein **und** nicht zu groß. -tipp: Die Note muss größer oder gleich 1 und gleichzeitig kleiner oder gleich 6 sein. -lösung: l08-gueltig-loesung.visustruct -::: - -## Nicht und Klammern - -Mit \`!\` (nicht) drehst du eine Bedingung um: Aus \`true\` wird \`false\` und umgekehrt. - -\`\`\` -!(note >= 1 && note <= 6) -\`\`\` - -Das ist wahr, wenn die Note **nicht** im Bereich liegt, und bedeutet dasselbe wie \`note < 1 || note > 6\`. - -Kommen \`&&\` und \`||\` zusammen vor, wird \`&&\` zuerst ausgewertet, so wie Punkt vor Strich. Setze lieber **Klammern**, dann ist klar, was zusammengehört: - -\`\`\` -(alter >= 12 && alter < 18) || schueler == 1 -\`\`\` - -## Die Wahrheitstabelle - -Eine **Wahrheitstabelle** zeigt auf einen Blick, was bei \`&&\`, \`||\` und \`!\` herauskommt. Links stehen alle vier Möglichkeiten für zwei Bedingungen \`a\` und \`b\`, rechts das Ergebnis: - -::: grafik l09-wahrheitstabelle.svg -Grün ist true, rot ist false. Bei && gibt es nur eine grüne Zeile, bei || nur eine rote. -::: - -Merksätze: - -- \`a && b\` ist nur wahr, wenn **beide** wahr sind. -- \`a || b\` ist nur falsch, wenn **beide** falsch sind. -- \`!a\` dreht den Wert um. - -::: angeberwissen -Der Datentyp \`boolean\` heißt nach **George Boole**. Der Engländer hat schon 1847 gezeigt, dass man mit wahr und falsch rechnen kann wie mit Zahlen, fast hundert Jahre bevor es den ersten Computer gab. Heute steckt seine Logik in jedem Chip. -::: - -## Wahrheitswerte in Variablen - -Das Ergebnis einer Bedingung ist ein **Wahrheitswert** vom Typ \`boolean\`. Du kannst ihn wie eine Zahl in einer Variablen speichern und später benutzen: - -\`\`\` -boolean wochenende = tag == 6 || tag == 7 -\`\`\` - -In der Verzweigung steht dann nur noch \`wochenende\`. Das liest sich fast wie ein Satz: „Wenn Wochenende, dann …“. Schreibe nicht \`wochenende == true\`, denn \`wochenende\` ist ja schon true oder false. - -Mit \`!wochenende\` fragst du nach dem Gegenteil, also nach einem Werktag. - -::: ludwig -Lange Bedingungen werden übersichtlich, wenn du Teile davon in boolean-Variablen mit sprechenden Namen packst, zum Beispiel \`boolean jugendlich = alter >= 12 && alter < 18\`. -::: - -## Spiel: Wahr oder falsch? - -Jetzt bist du dran. Rechne jede Bedingung im Kopf aus. Nach jeder Antwort siehst du, wie VisuStruct sie Schritt für Schritt auswertet. - -::: spiel -alter: 8..20 -tag: 1..7 -note: 0..7 -schueler: boolean -wochenende: boolean -? alter >= 18 -? tag == 6 -? note != 3 -? alter >= 12 && alter < 18 -? tag == 6 || tag == 7 -? schueler && wochenende -? !schueler -? note >= 1 && note <= 6 -? !(alter < 18) -? schueler || alter >= 18 -? (alter >= 12 && alter < 18) || schueler -? !(note >= 1 && note <= 6) -? !wochenende && tag != 3 -? alter >= 12 && alter < 18 && !schueler -::: - -## Übung: Schaltjahr - -::: übung l08-schaltjahr -titel: Schaltjahr -auftrag: Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, aber nicht durch 100. Jahre, die durch 400 teilbar sind, sind trotzdem Schaltjahre. -Frage eine Jahreszahl ab und gib **Schaltjahr** oder **kein Schaltjahr** aus. -test: 2024 -> Schaltjahr -test: 2023 -> kein Schaltjahr -test: 1900 -> kein Schaltjahr -test: 2000 -> Schaltjahr -braucht: verzweigung -tipp: Prüfe die Regel zuerst an Beispielen: 2024 ist ein Schaltjahr, 1900 nicht, 2000 schon. Teilbar heißt: Der Rest ist 0. -tipp: Teilbar durch 4 heißt \`jahr % 4 == 0\`, nicht teilbar durch 100 heißt \`jahr % 100 != 0\`. Verbinde diese beiden mit \`&&\`, setze Klammern darum und hänge mit \`||\` den Fall für 400 an. -tipp: Fast die Lösung: Eine einzige Verzweigung mit der Bedingung \`(jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0\`. Im true-Zweig steht \`output: "Schaltjahr"\`, im false-Zweig \`output: "kein Schaltjahr"\`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Jetzt in Java - -Das Jugendticket vom Anfang sieht in Java so aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie alt bist du?"); -int alter = scanner.nextInt(); -if (alter >= 12 && alter < 18) { - System.out.println("Jugendticket"); -} else { - System.out.println("Kein Jugendticket"); -} -\`\`\` - -Die Zeichen \`&&\`, \`||\` und \`!\` sind genau die, die du schon im Struktogramm benutzt. Sie kommen aus Java. Die ganze Bedingung steht wie immer in den runden Klammern nach \`if\`. - -::: übung l09-java-schule -titel: Schule oder Freizeit -code: java -auftrag: Schreibe ein Java-Programm, das nach der Stunde fragt (0 bis 23). Von 8 bis einschließlich 15 Uhr gibt es **Schule** aus, sonst **Freizeit**. -test: 8 -> Schule -test: 15 -> Schule -test: 16 -> Freizeit -test: 7 -> Freizeit -braucht: verzweigung -tipp: Die Stunde muss zwei Bedingungen gleichzeitig erfüllen. Welcher Operator heißt „und“? -tipp: \`if (stunde >= 8 && stunde <= 15) { … } else { … }\` -lösung: l09-java-schule-loesung.visustruct -::: - -## Lückentext: Bedingungen - -::: lückentext -titel: Note und Wochenende -auftrag: Ergänze die fehlenden Operatoren und Wörter. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Note?"); -int note = scanner.nextInt(); -if (note >= 1 [[&&]] note [[<=]] 6) { - System.out.println("gültige Note"); -} else { - System.out.println("ungültige Note"); -} -System.out.println("Welcher Tag (1 bis 7)?"); -int tag = scanner.nextInt(); -[[boolean]] wochenende = tag == 6 [[||]] tag == 7; -if ([[!]]wochenende) { - System.out.println("Schultag"); -} -\`\`\` -erklärung: Eine Note ist gültig, wenn **beide** Bedingungen stimmen, also \`&&\`. Wochenende ist, wenn **eine** der beiden stimmt, also \`||\`. Das Ergebnis passt in eine \`boolean\`-Variable, und \`!\` dreht es um. -::: - -## Fehler finden: Schulfrei - -::: übung l09-java-fehler -titel: Schulfrei reparieren -code: java -auftrag: Das Programm soll bei Tag 6 (Samstag) und Tag 7 (Sonntag) **schulfrei** ausgeben, sonst **Schule**. Es gibt aber immer **Schule** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l09-java-fehler-start.visustruct -test: 6 -> schulfrei -test: 7 -> schulfrei -test: 3 -> Schule -test: 1 -> Schule -braucht: verzweigung -tipp: Kann \`tag\` gleichzeitig 6 **und** 7 sein? -tipp: Es reicht, wenn eine der beiden Bedingungen stimmt: \`tag == 6 || tag == 7\`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l09-java-laeuft-nicht -titel: Wochenende reparieren -code: java -auftrag: Tag 6 ist Samstag, Tag 7 ist Sonntag. Heute ist Tag 7, also soll **schulfrei** erscheinen. Das Programm läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> schulfrei -braucht: verzweigung -tipp: Die Bedingung besteht aus zwei Teilen. Vergleiche in beiden Teilen den Namen der Variablen. -tipp: Auch im zweiten Teil heißt die Variable \`tag\` mit kleinem t: \`if (tag == 6 || tag == 7) {\` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, wann eine Verknüpfung mit && wahr ist. → Und: && -- Ich kann erklären, wann eine Verknüpfung mit || wahr ist. → Oder: || -- Ich kann eine Bedingung mit ! umdrehen. → Nicht und Klammern -- Ich kann prüfen, ob ein Wert in einem Bereich wie 1 bis 6 liegt. → Wertebereiche prüfen -- Ich kann die Wahrheitstabelle für &&, || und ! lesen. → Die Wahrheitstabelle -- Ich kann das Ergebnis einer Bedingung in einer boolean-Variablen speichern. → Wahrheitswerte in Variablen -- Ich kann zusammengesetzte Bedingungen sicher auswerten (im Spiel mindestens 8 von 10 richtig). → Spiel: Wahr oder falsch? -- Ich kann Bedingungen in Java mit && und || verknüpfen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wann ist \`a && b\` wahr? -→ Und: && -- [ ] Wenn a oder b wahr ist -- [x] Nur wenn a und b beide wahr sind -- [ ] Wenn genau eins von beiden wahr ist -> Bei && müssen beide Teile stimmen. Ist einer falsch, ist das Ganze falsch. - -? Die Variable tag hat den Wert 6. Was ergibt \`tag == 6 || tag == 7\`? -→ Oder: || -- [x] true -- [ ] false -> Bei || reicht es, wenn eine Seite wahr ist. - -? Mit welcher Bedingung prüfst du, ob zahl zwischen 10 und 20 liegt (beide eingeschlossen)? -→ Wertebereiche prüfen -- [ ] 10 <= zahl <= 20 -- [ ] zahl >= 10 || zahl <= 20 -- [x] zahl >= 10 && zahl <= 20 -> Mit || wäre jede Zahl erlaubt, denn jede Zahl ist größer als 10 oder kleiner als 20. - -? Was ergibt \`!(5 > 3)\`? -→ Nicht und Klammern -- [ ] true -- [x] false -> 5 > 3 ist wahr, und ! dreht das um. - -? Wie schreibst du in Java „alter ist mindestens 12 und kleiner als 18“? -→ Jetzt in Java -- [ ] if (12 <= alter < 18) -- [x] if (alter >= 12 && alter < 18) -- [ ] if (alter >= 12 || alter < 18) -> Jeder Vergleich steht für sich, verbunden mit \`&&\`. -::: -`,Yv=`--- -titel: Fallauswahl -bereich: Grundlagen -kurz: Je nach Wert einer Variablen einen von vielen Fällen ausführen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Fallauswahl einfügen, Fälle hinzufügen und Fallnamen ändern -- erklären, wann der Fall default ausgeführt wird -- entscheiden, ob eine Fallauswahl oder eine Verzweigung besser passt -- eine Fallauswahl in Java mit switch schreiben -::: - -## Viele Möglichkeiten, eine Variable - -Ein Getränkeautomat hat drei Tasten: 1 für Wasser, 2 für Saft, 3 für Kakao. Mit Verzweigungen brauchst du dafür drei ineinander geschachtelte Kästen. Das wird schnell breit und unübersichtlich. - -::: diagramm l09-verschachtelt.visustruct -Der Automat mit drei verschachtelten Verzweigungen. Jede Verzweigung prüft wieder dieselbe Variable wahl. -::: - -Immer wenn du **eine Variable** mit **mehreren festen Werten** vergleichst, geht es einfacher: mit der **Fallauswahl**. - -## So ist die Fallauswahl aufgebaut - -Oben im Kasten steht die Variable, nach der ausgewählt wird. Darunter steht für jeden Fall eine eigene Spalte. Über jeder Spalte steht der Wert, zu dem sie gehört. - -::: diagramm l09-automat.visustruct -Derselbe Automat als Fallauswahl. Hat wahl den Wert 2, wird nur die Spalte 2 ausgeführt. -::: - -- Die Simulation sucht den Fall, dessen Name genau zum Wert passt. -- Passt kein Fall, wird **default** ausgeführt. Dieser Fall steht immer ganz rechts. -- Danach geht es unter der Fallauswahl weiter. Es wird immer nur **ein** Fall ausgeführt. - -> Eine neue Fallauswahl hat die Fälle 1, 2 und default. Klicke einen Fall an, um im Objektinspektor seinen **Fallnamen** zu ändern. Mit **Weiteren Fall hinzufügen** bekommst du eine neue Spalte vor default. - -## Fälle mit Texten - -Die Fälle müssen keine Zahlen sein. Du kannst auch nach dem Inhalt einer \`String\`-Variablen auswählen. Als Fallname schreibst du dann den Text in Anführungszeichen, zum Beispiel \`"rot"\`. So erkennt man wie im Code, dass es ein Text ist. - -::: diagramm l09-ampel.visustruct -Eine Ampel: Je nach eingegebener Farbe erscheint ein anderer Hinweis. Probiere in der Simulation auch eine Farbe aus, die es nicht gibt. -::: - -Groß- und Kleinschreibung zählt: \`Rot\` passt nicht zum Fall \`"rot"\`. - -## Übung: Note in Worten - -::: übung l09-note -titel: Note in Worten -auftrag: Frage eine Note als ganze Zahl ab und gib sie in Worten aus: 1 sehr gut, 2 gut, 3 befriedigend, 4 ausreichend, 5 mangelhaft, 6 ungenügend. - Bei jeder anderen Zahl soll **Keine gültige Note** erscheinen. -test: 1 -> sehr gut -test: 4 -> ausreichend -test: 6 -> ungenügend -test: 9 -> Keine gültige Note -braucht: fallauswahl -tipp: Für viele feste Werte ist die Fallauswahl übersichtlicher als viele Verzweigungen. Jede Note bekommt ihren eigenen Fall. -tipp: Füge mit „Weiteren Fall hinzufügen“ so lange Fälle hinzu, bis du die Fälle 1 bis 6 und default hast. Oben in die Fallauswahl schreibst du \`note\`. -lösung: l09-note-loesung.visustruct -::: - -## Übung: Taschenrechner - -::: übung l09-rechner -titel: Taschenrechner -auftrag: Frage nacheinander eine ganze Zahl \`a\`, ein Rechenzeichen als \`String\` und eine zweite ganze Zahl \`b\` ab. - Bei \`+\`, \`-\` und \`*\` gibst du das Ergebnis aus. Bei jedem anderen Zeichen erscheint **Unbekanntes Rechenzeichen**. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Lies erst alle drei Werte ein. Danach entscheidet eine Fallauswahl über das Rechenzeichen, was gerechnet wird. -tipp: Lege vor der Fallauswahl \`int ergebnis = 0\` an. In jedem Fall rechnest du zum Beispiel \`ergebnis = a + b\` und gibst danach \`ergebnis\` aus. Die Fallnamen sind \`"+"\`, \`"-"\` und \`"*"\` in Anführungszeichen, weil das Rechenzeichen ein \`String\` ist. -tipp: Das Gerüst von oben nach unten: drei Eingaben (\`int a\`, \`String zeichen\`, \`int b\`), dann \`int ergebnis = 0\`, dann eine Fallauswahl über \`zeichen\`. Im Fall \`"+"\` stehen \`ergebnis = a + b\` und \`output: ergebnis\`, bei \`"-"\` und \`"*"\` genauso. Im Sonst-Fall steht \`output: "Unbekanntes Rechenzeichen"\`. -lösung: l09-rechner-loesung.visustruct -::: - -## Fallauswahl oder Verzweigung? - -Die Fallauswahl prüft nur, ob ein Wert **genau gleich** einem Fallnamen ist. Daraus folgt: - -- **Fallauswahl:** eine Variable, mehrere feste Werte. Beispiele: Menüauswahl, Wochentag als Zahl, Noten. -- **Verzweigung:** Bereiche und verknüpfte Bedingungen. Beispiele: \`alter >= 18\`, \`temperatur < 0 || temperatur > 30\`. - -Für „Alter ab 18“ brauchst du also weiter die Verzweigung. Du kannst nicht für jedes mögliche Alter einen eigenen Fall anlegen. - -## Jetzt in Java - -Der Getränkeautomat sieht in Java so aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 Wasser, 2 Saft, 3 Kakao"); -int wahl = scanner.nextInt(); -switch (wahl) { - case 1 -> { - System.out.println("Hier ist dein Wasser."); - } - case 2 -> { - System.out.println("Hier ist dein Saft."); - } - case 3 -> { - System.out.println("Hier ist dein Kakao."); - } - default -> { - System.out.println("Diese Taste gibt es nicht."); - } -} -\`\`\` - -- Nach \`switch\` steht in runden Klammern die Variable, die verglichen wird. -- Jeder Fall beginnt mit \`case\`, dem Wert und einem Pfeil \`->\`. Dahinter steht in geschweiften Klammern, was passieren soll. -- \`default\` ist der Sonst-Fall. Er läuft, wenn kein Wert passt. - -::: angeberwissen -Den Pfeil \`case 1 ->\` gibt es in Java erst seit 2020 (Java 14). Davor schrieb man \`case 1:\` und musste jeden Fall mit \`break;\` beenden. Wer das vergaß, lief einfach in den nächsten Fall weiter. Der Pfeil hat also sehr vielen Programmierern Ärger erspart. -::: - -::: übung l10-java-wuerfel -titel: Würfel in Worten -code: java -auftrag: Schreibe ein Java-Programm mit \`switch\`, das eine Zahl einliest. Bei 1 gibt es **eins** aus, bei 2 **zwei**, bei 3 **drei** und sonst **kenne ich nicht**. -test: 1 -> eins -test: 2 -> zwei -test: 3 -> drei -test: 7 -> kenne ich nicht -braucht: fallauswahl -tipp: Du brauchst drei \`case\`-Fälle und einen \`default\`-Fall. -tipp: \`switch (zahl) { case 1 -> { System.out.println("eins"); } … default -> { System.out.println("kenne ich nicht"); } }\` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Lückentext: switch - -::: lückentext -titel: Monate in Worten -auftrag: Ergänze die fehlenden Wörter und Zeichen der Fallauswahl. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welcher Monat (1 bis 3)?"); -int monat = scanner.nextInt(); -[[switch]] (monat) { - [[case]] 1 -> { - System.out.println("Januar"); - } - case 2 [[->]] { - System.out.println("Februar"); - } - [[case]] 3 -> { - System.out.println("März"); - } - [[default]] -> { - System.out.println("Kenne ich nicht"); - } -} -\`\`\` -erklärung: Nach \`switch\` steht die Variable in runden Klammern. Jeder Fall beginnt mit \`case\`, dem Wert und dem Pfeil \`->\`. \`default\` läuft, wenn kein Fall passt. -::: - -## Fehler finden: Rechner - -::: übung l10-java-fehler -titel: Rechner reparieren -code: java -auftrag: Der Rechner liest zwei Zahlen und eine Wahl ein: 1 plus, 2 minus, 3 mal. Bei 7, 3 und Wahl 2 soll **4** herauskommen, er rechnet aber **-4**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Gibt es nicht -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Plus und mal stimmen. Schau dir den Fall \`case 2\` genau an. -tipp: Beim Minus zählt die Reihenfolge: \`a - b\` statt \`b - a\`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l10-java-laeuft-nicht -titel: Note reparieren -code: java -auftrag: Ludwig hat die Note 2 geschrieben. Das Programm soll **gut** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> gut -braucht: fallauswahl -tipp: Welche Variable prüft die Fallauswahl? Steht sie genauso oben? -tipp: In der Klammer nach \`switch\` muss \`note\` mit kleinem n stehen: \`switch (note) {\` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Fall? - -::: spiel frage -titel: Spiel: Welcher Fall? -intro: Ludwig drückt Tasten am Getränkeautomaten und an anderen Fallauswahlen. Was passiert? Sechs Runden. - -runde: - int wahl = 2; - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - case 2 -> { System.out.println("Saft"); } - case 3 -> { System.out.println("Kakao"); } - default -> { System.out.println("Diese Taste gibt es nicht."); } - } -frage: Was wird ausgegeben? -- Wasser -- [x] Saft -- Diese Taste gibt es nicht. -> wahl ist 2, also läuft genau der Fall \`case 2\`. - -runde: - int wahl = 4; - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - case 2 -> { System.out.println("Saft"); } - case 3 -> { System.out.println("Kakao"); } - default -> { System.out.println("Diese Taste gibt es nicht."); } - } -frage: Was wird ausgegeben? -- Kakao -- nichts -- [x] Diese Taste gibt es nicht. -> Kein Fall passt zu 4, also läuft \`default\`. - -runde: - String tag = "montag"; - switch (tag) { - case "Montag" -> { System.out.println("Mathe"); } - case "Dienstag" -> { System.out.println("Sport"); } - default -> { System.out.println("frei"); } - } -frage: Was wird ausgegeben? -- Mathe -- Sport -- [x] frei -> Bei Texten zählt jeder Buchstabe: "montag" mit kleinem m ist nicht "Montag". - -runde: - int note = 0; - switch (note) { - case 1 -> { System.out.println("sehr gut"); } - case 2 -> { System.out.println("gut"); } - case 3 -> { System.out.println("befriedigend"); } - } -frage: Was wird ausgegeben? -- sehr gut -- [x] nichts -- befriedigend -> Kein Fall passt, und es gibt kein \`default\`. Dann passiert einfach nichts. - -runde: -frage: Du willst prüfen, ob \`alter >= 18\` ist. Was passt besser? -- [x] eine Verzweigung -- eine Fallauswahl -> Eine Fallauswahl vergleicht nur mit festen Werten. Für „größer oder gleich“ brauchst du eine Verzweigung. - -runde: -frage: Ein Würfel zeigt 1 bis 6, und für jede Zahl soll ein anderes Wort erscheinen. Was passt besser? -- eine Verzweigung -- [x] eine Fallauswahl -> Eine Variable, sechs feste Werte: genau dafür ist die Fallauswahl da. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Fallauswahl einfügen, Fälle hinzufügen und Fallnamen ändern. → So ist die Fallauswahl aufgebaut -- Ich kann erklären, wann der Fall default ausgeführt wird. → So ist die Fallauswahl aufgebaut -- Ich kann entscheiden, ob eine Fallauswahl oder eine Verzweigung besser passt. → Fallauswahl oder Verzweigung? -- Ich kann eine Fallauswahl in Java mit switch schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Die Variable tag hat den Wert 5. Es gibt die Fälle 1, 2, 3 und default. Was wird ausgeführt? -→ So ist die Fallauswahl aufgebaut -- [ ] Gar nichts -- [ ] Der Fall 3 -- [x] Der Fall default -> Kein Fallname passt zu 5, deshalb greift default. - -? Wie viele Fälle werden bei einem Durchlauf der Fallauswahl ausgeführt? -→ So ist die Fallauswahl aufgebaut -- [x] Genau einer -- [ ] Alle Fälle ab dem passenden -- [ ] Alle Fälle -> Nach dem passenden Fall geht es direkt unter der Fallauswahl weiter. - -? Wofür ist eine Fallauswahl NICHT geeignet? -→ Fallauswahl oder Verzweigung? -- [ ] Menüpunkt 1, 2 oder 3 auswählen -- [x] Prüfen, ob eine Temperatur über 30 Grad liegt -- [ ] Eine Farbe wie rot, gelb oder grün auswerten -> „Über 30“ ist ein Bereich. Dafür brauchst du eine Verzweigung mit einem Vergleich. - -? Du gibst bei der Ampel \`Rot\` ein, der Fall heißt \`"rot"\`. Was passiert? -→ So ist die Fallauswahl aufgebaut -- [ ] Der Fall \`"rot"\` wird ausgeführt. -- [x] Der Fall default wird ausgeführt. -- [ ] Die Simulation meldet einen Fehler. -> Groß- und Kleinschreibung zählt. Rot und rot sind verschiedene Texte. - -? Unter welchem Namen findest du die Fallauswahl auch in Schulbüchern? -→ So ist die Fallauswahl aufgebaut -- [ ] Bedingte Anweisung -- [ ] Sequenz -- [x] Mehrfachauswahl -> Aus vielen Fällen wird einer ausgewählt. Darum heißt sie auch Mehrfachauswahl. - -? Wie heißt in Java der Sonst-Fall einer Fallauswahl? -→ Jetzt in Java -- [ ] else -- [x] default -- [ ] case 0 -::: -`,Kv=`--- -titel: While-Schleife -bereich: Grundlagen -kurz: Schritte wiederholen, solange eine Bedingung wahr ist. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die While-Schleife ihre Bedingung vor jedem Durchlauf prüft -- eine Zählvariable mit Startwert, Bedingung und Veränderung verwenden -- erkennen, wenn eine Schleife nie endet, und den Fehler beheben -- eine Schleife im Schreibtischtest Durchlauf für Durchlauf verfolgen -- eine While-Schleife in Java schreiben -::: - -## Wiederholen, solange etwas gilt - -Oft soll ein Programm etwas mehrmals tun. Statt denselben Kasten fünfmal hinzuschreiben, nimmst du eine **Schleife**. - -Die **While-Schleife** wiederholt ihren Inhalt, **solange** ihre Bedingung wahr ist. Die Bedingung steht oben im Kopf des Kastens. Der Inhalt steht eingerückt darunter, links von einer Klammer eingefasst. - -::: diagramm l10-countdown.visustruct -Ein Countdown: Solange zahl größer als 0 ist, wird zahl ausgegeben und um 1 kleiner. Danach erscheint Start! -::: - -## Die Bedingung kommt zuerst - -Die While-Schleife ist **kopfgesteuert**. Vor **jedem** Durchlauf wird die Bedingung geprüft: - -1. Bedingung prüfen. -2. Ist sie wahr, den Inhalt einmal ausführen und wieder bei 1 anfangen. -3. Ist sie falsch, geht es unter der Schleife weiter. - -::: grafik l10-kopfgesteuert.svg -Nach jedem Durchlauf geht es zurück zur Bedingung. Erst wenn sie false ist, geht es unter der Schleife weiter. -::: - -Im Countdown wird die Bedingung viermal geprüft: bei 3, 2 und 1 ist sie wahr, bei 0 ist sie falsch. - -> Ist die Bedingung schon beim ersten Prüfen falsch, wird der Inhalt **kein einziges Mal** ausgeführt. Starte den Countdown mit \`int zahl = 0\`, dann erscheint nur Start! - -## Eine Zählvariable - -Viele Schleifen zählen mit. Dafür brauchst du drei Dinge: - -- **Startwert vor der Schleife**, z. B. \`int i = 1\` -- **Bedingung im Kopf**, z. B. \`i <= 5\` -- **Veränderung im Inhalt**, z. B. \`i = i + 1\` (kurz \`i++\`) - -Fehlt einer dieser Teile, zählt die Schleife falsch oder gar nicht. - -::: angeberwissen -Zählschleifen sind uralt! Im Artikel von 1973 haben Nassi und Shneiderman ihre Idee unter anderem an der **Fakultät** gezeigt: 5! = 1 · 2 · 3 · 4 · 5 = 120. Hier ist meine Ziegen-Version davon. Probier sie mit **Schritt** in der Simulation aus und schau zu, wie \`fakultaet\` wächst. Määäh, das geht schnell! -::: - -::: diagramm l10-fakultaet.visustruct -Die Fakultät mit einer Zählvariable \`i\`, nachgebaut nach einem Beispiel aus dem Artikel von 1973. -::: - -## Übung: Zählen bis n - -::: übung l10-bis-n -titel: Zählen bis n -auftrag: Frage eine ganze Zahl \`n\` ab und gib alle Zahlen von 1 bis \`n\` aus, jede in einer eigenen Zeile. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: Du brauchst eine Zählvariable, die bei 1 beginnt und in jedem Durchlauf um 1 wächst. -tipp: Lege vor der Schleife \`int i = 1\` an. Die Bedingung ist \`i <= n\`. Im Inhalt gibst du \`i\` aus und erhöhst danach \`i\` um 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Vorsicht, Endlosschleife - -Wenn sich im Inhalt nichts an der Bedingung ändert, bleibt sie für immer wahr. Die Schleife hört nie auf. Das nennt man **Endlosschleife**. - -::: diagramm l10-endlos.visustruct -Hier fehlt zahl = zahl - 1. Die Schleife gibt immer wieder 3 aus und erreicht Start! nie. -::: - -Frage dich bei jeder Schleife: **Was im Inhalt sorgt dafür, dass die Bedingung irgendwann falsch wird?** Beim Prüfen einer Übung bricht VisuStruct nach sehr vielen Schritten ab und meldet eine mögliche Endlosschleife. - -## Übung: Verdoppeln bis 100 - -::: übung l10-verdoppeln -titel: Verdoppeln bis 100 -auftrag: Frage eine ganze Zahl ab. Verdopple sie so lange, bis sie mindestens 100 ist. - Gib am Ende aus, **wie oft** du verdoppelt hast. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: Die Schleife läuft, solange die Zahl noch zu klein ist. Zähle nebenbei mit, wie oft sie gelaufen ist. -tipp: Du brauchst eine zweite Variable \`int schritte = 0\`. Die Bedingung lautet \`zahl < 100\`. Im Inhalt verdoppelst du die Zahl mit \`zahl = zahl * 2\` und erhöhst \`schritte\` um 1. Ist die Zahl schon 100, läuft die Schleife gar nicht. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Schleifen im Schreibtischtest - -Bei einer Schleife wird der **Schreibtischtest** besonders wertvoll. Du siehst genau, wie oft die Schleife läuft und mit welchem Wert sie aufhört. Jede Prüfung der Bedingung bekommt eine eigene Zeile. - -::: diagramm l16-schreibtisch.visustruct -Eine While-Schleife zählt die Zahlen 1, 2 und 3 zusammen. -::: - -| Schritt | summe | i | Ausgabe | -|---|---|---|---| -| \`int summe = 0\` | 0 | – | | -| \`int i = 1\` | 0 | 1 | | -| \`i <= 3\` → wahr | 0 | 1 | | -| \`summe = summe + i\` | 1 | 1 | | -| \`i = i + 1\` | 1 | 2 | | -| \`i <= 3\` → wahr | 1 | 2 | | -| \`summe = summe + i\` | 3 | 2 | | -| \`i = i + 1\` | 3 | 3 | | -| \`i <= 3\` → wahr | 3 | 3 | | -| \`summe = summe + i\` | 6 | 3 | | -| \`i = i + 1\` | 6 | 4 | | -| \`i <= 3\` → falsch | 6 | 4 | | -| \`output: summe\` | 6 | 4 | 6 | - -Häufige Fehler in Schleifen sind: - -- Die Schleife läuft **einmal zu oft oder zu wenig**, z. B. \`<\` statt \`<=\`. -- Eine Variable wird in der Schleife **nicht verändert** oder in die falsche Richtung. Dann endet die Schleife nie. -- Eine Variable bekommt ihren Startwert **in** der Schleife statt davor und wird bei jedem Durchlauf zurückgesetzt. - -## Übung: Countdown reparieren - -::: übung l16-countdown -titel: Countdown reparieren -auftrag: Der Countdown soll vom Startwert herunterzählen und am Ende **Los!** ausgeben. Bei 3 also 3, 2, 1, Los! - Im Startdiagramm stecken zwei Fehler. Finde und behebe beide. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Los! -test: 1 -> 1 | Los! -test: 0 -> Los! -tipp: Es gibt zwei Fehler. Einer betrifft das Zählen, der andere die Ausgabe am Ende. -tipp: Starte die Simulation mit Startwert 3 und beobachte i unter Variablen. Wird i kleiner? Vergleiche außerdem die letzte Ausgabe genau mit dem Auftrag. -lösung: l16-countdown-loesung.visustruct -::: - -## Jetzt in Java - -Der Countdown vom Anfang dieser Lektion sieht in Java so aus: - -\`\`\`java editor -int zahl = 3; -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -\`\`\` - -- Nach \`while\` steht die Bedingung in runden Klammern, wie bei \`if\`. -- Alles, was wiederholt wird, steht in geschweiften Klammern. Das ist der Rumpf der Schleife. -- Der Rumpf ist eingerückt. So erkennst du wie im Struktogramm, was zur Schleife gehört. - -::: übung l11-java-gerade -titel: Gerade Zahlen in Java -code: java -auftrag: Schreibe ein Java-Programm, das eine ganze Zahl \`n\` einliest und mit einer While-Schleife alle geraden Zahlen von 2 bis höchstens \`n\` ausgibt. Bei 7 also 2, 4 und 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: Du brauchst eine Zählvariable, die bei 2 beginnt. Die Schleife läuft, solange sie nicht größer als \`n\` ist. -tipp: \`int zahl = 2;\` vor der Schleife, dann \`while (zahl <= n) { … }\`. Im Rumpf gibst du \`zahl\` aus und erhöhst sie mit \`zahl = zahl + 2;\`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Lückentext: while - -::: lückentext -titel: Summe von 1 bis 10 -auftrag: Das Programm soll die Zahlen von 1 bis 10 zusammenzählen. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -int summe = 0; -int zahl = 1; -[[while]] (zahl [[<=]] 10) [[{]] - summe = summe + [[zahl]]; - [[zahl]] = zahl + 1; -} -System.out.println("Summe: " + summe); -\`\`\` -erklärung: Die Schleife läuft, solange \`zahl\` höchstens 10 ist. In jedem Durchlauf kommt \`zahl\` zur Summe dazu, danach wird \`zahl\` um 1 größer. Ohne diese Zeile wäre es eine Endlosschleife. Ausgabe: **Summe: 55** -::: - -## Fehler finden: Sparen - -::: übung l11-java-fehler -titel: Sparplan reparieren -code: java -auftrag: Ludwig spart jede Woche 5 Euro. Das Programm fragt nach dem Sparziel und soll ausgeben, nach wie vielen Wochen er es erreicht hat. Bei 50 Euro sind das 10 Wochen, das Programm sagt aber **Wochen: 11**. - Gehe den Code mit dem Einzelschritt durch und beobachte \`geld\` und \`wochen\`. Repariere den Fehler und klicke auf Prüfen. -start: l11-java-fehler-start.visustruct -test: 50 -> Wochen: 10 -test: 12 -> Wochen: 3 -test: 5 -> Wochen: 1 -test: 1 -> Wochen: 1 -braucht: whileSchleife -tipp: Wie viel Geld hat Ludwig, wenn die Schleife zum letzten Mal läuft? Muss er dann wirklich noch eine Woche sparen? -tipp: Gespart wird nur, solange das Ziel noch **nicht erreicht** ist: \`while (geld < ziel)\`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l11-java-laeuft-nicht -titel: Countdown reparieren -code: java -auftrag: Der Countdown soll **3**, **2**, **1** und dann **Start!** ausgeben. Er läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Start! -braucht: whileSchleife -tipp: Der Fehler steckt in der Schleife. Welche Variable soll ausgegeben werden, und wie heißt sie wirklich? -tipp: Gib \`zahl\` mit kleinem z aus: \`System.out.println(zahl);\` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Wie oft? - -::: spiel frage -titel: Spiel: Wie oft? -intro: Ludwig hat While-Schleifen geschrieben. Mach im Kopf den Schreibtischtest. Sechs Runden. - -runde: - int zahl = 3; - while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; - } - System.out.println("Start!"); -frage: Was wird ausgegeben? -- [x] 3\\n2\\n1\\nStart! -- 3\\n2\\n1\\n0\\nStart! -- Start! -> Bei zahl gleich 0 ist \`zahl > 0\` falsch, die 0 wird also nicht mehr ausgegeben. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: Was wird ausgegeben? -- [x] nichts -- 10 -- 10 bis 4 -> Die Bedingung wird zuerst geprüft. 10 < 5 ist falsch, der Rumpf läuft kein einziges Mal. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: Was passiert? -- 1, 2 und 3 werden ausgegeben. -- [x] Die Schleife hört nie auf. -- Es wird nichts ausgegeben. -> i wird im Rumpf nie größer. Die Bedingung bleibt immer wahr: eine Endlosschleife. - -runde: - int zahl = 1; - while (zahl < 100) { - zahl = zahl * 2; - } - System.out.println(zahl); -frage: Was wird ausgegeben? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Erst bei 128 ist \`zahl < 100\` falsch. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: Was wird ausgegeben? -- 4 -- 5 -- [x] 6 -> i läuft 0, 2, 4, 6. Bei 6 ist \`i < 5\` falsch. Die 5 wird übersprungen. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: Wie oft läuft der Rumpf? -- 3-mal -- [x] 4-mal -- 10-mal -> Der Rumpf läuft bei i = 1, 4, 7 und 10. Danach ist i 13. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die While-Schleife ihre Bedingung vor jedem Durchlauf prüft. → Die Bedingung kommt zuerst -- Ich kann eine Zählvariable mit Startwert, Bedingung und Veränderung verwenden. → Eine Zählvariable -- Ich kann erkennen, wenn eine Schleife nie endet, und den Fehler beheben. → Vorsicht, Endlosschleife -- Ich kann eine Schleife im Schreibtischtest Durchlauf für Durchlauf verfolgen. → Schleifen im Schreibtischtest -- Ich kann eine While-Schleife in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet kopfgesteuert? -→ Die Bedingung kommt zuerst -- [x] Die Bedingung wird vor jedem Durchlauf geprüft. -- [ ] Die Bedingung wird nach jedem Durchlauf geprüft. -- [ ] Die Schleife läuft immer genau einmal. -> Der Kopf mit der Bedingung steht oben und wird zuerst ausgewertet. - -? \`int i = 5\`, danach eine While-Schleife mit der Bedingung \`i < 3\`. Wie oft läuft der Inhalt? -→ Die Bedingung kommt zuerst -- [x] Keinmal -- [ ] Einmal -- [ ] Dreimal -> Schon beim ersten Prüfen ist 5 < 3 falsch. - -? Warum endet eine Schleife mit der Bedingung \`zahl > 0\` nie, wenn im Inhalt nur \`output: zahl\` steht? -→ Vorsicht, Endlosschleife -- [ ] Weil output die Zahl vergrößert -- [x] Weil sich zahl nie ändert und die Bedingung wahr bleibt -- [ ] Weil die Bedingung falsch geschrieben ist -> Im Inhalt muss etwas passieren, das die Bedingung irgendwann falsch macht. - -? Wie nennt man Schleifen in Schulbüchern auch? -→ Die Bedingung kommt zuerst -- [x] Wiederholungsstrukturen -- [ ] Verzweigungen -- [ ] Unterprogramme -> Eine Schleife wiederholt Anweisungen. Darum heißt sie auch Wiederholungsstruktur. - -? Eine Schleife soll von 1 bis 5 zählen, läuft aber nur bis 4. Was ist der wahrscheinliche Fehler? -→ Eine Zählvariable -- [x] In der Bedingung steht i < 5 statt i <= 5. -- [ ] Die Schleife ist eine While-Schleife. -- [ ] Die Variable i heißt falsch. - -? Welche Zeile startet in Java eine While-Schleife richtig? -→ Jetzt in Java -- [ ] while zahl > 0 { -- [x] while (zahl > 0) { -- [ ] while (zahl > 0); -> Die Bedingung steht in runden Klammern, danach öffnet \`{\` den Rumpf. -::: -`,Xv=`--- -titel: Do-while-Schleife -bereich: Grundlagen -kurz: Erst ausführen, dann prüfen: Schleifen mit mindestens einem Durchlauf. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft -- erklären, warum der Inhalt mindestens einmal ausgeführt wird -- eine Eingabe so lange wiederholen lassen, bis sie gültig ist -- eine Do-while-Schleife in Java schreiben -::: - -## Erst machen, dann prüfen - -Die **Do-while-Schleife** ist **fußgesteuert**. Die Bedingung steht unten im Fuß des Kastens. Der Ablauf ist: - -1. Den Inhalt einmal ausführen. -2. Die Bedingung prüfen. -3. Ist sie wahr, wieder bei 1 anfangen. Ist sie falsch, geht es unter der Schleife weiter. - -::: grafik l11-vergleich.svg -Links prüft die While-Schleife zuerst, rechts führt die Do-while-Schleife zuerst aus. -::: - -Oben im Kasten steht \`do\`, unten im Fuß die Bedingung. Wenn du die Schleife anklickst, steht im Objektinspektor vor dem Textfeld das Wort \`while\`: Die Bedingung bedeutet „wiederhole, solange …“. - -> Die Bedingung sagt wie bei der While-Schleife, **wann wiederholt wird**. Solange sie wahr ist, läuft die Schleife weiter. - -::: angeberwissen -Python hat gar keine Do-while-Schleife. Wer dort „erst machen, dann prüfen“ will, schreibt \`while True:\` und verlässt die Schleife mit \`break\`. Java, C und JavaScript haben \`do … while\` dagegen schon seit Jahrzehnten. -::: - -## Mindestens ein Durchlauf - -Weil die Bedingung erst am Ende geprüft wird, läuft der Inhalt **immer mindestens einmal**. Das ist der wichtigste Unterschied zur While-Schleife. - -::: diagramm l11-einmal.visustruct -i ist 10 und damit nicht kleiner als 5. Trotzdem wird 10 einmal ausgegeben, denn geprüft wird erst danach. -::: - -Mit einer While-Schleife und derselben Bedingung \`i < 5\` würde hier gar nichts ausgegeben. - -## Typisch: Eingabe wiederholen - -Die Do-while-Schleife passt immer dann, wenn etwas zuerst passieren muss, bevor man es prüfen kann. Das beste Beispiel ist eine Eingabe: Erst wenn jemand etwas eingegeben hat, weißt du, ob es gültig ist. - -::: diagramm l11-eingabe-pruefen.visustruct -Die Frage kommt so lange wieder, bis eine Zahl von 1 bis 10 eingegeben wurde. Probiere in der Simulation zuerst 0 und dann 12 aus. -::: - -Die Bedingung beschreibt hier die **ungültige** Eingabe: \`zahl < 1 || zahl > 10\`. Solange die Eingabe ungültig ist, wird noch einmal gefragt. - -## Übung: Gültige Note - -::: übung l11-note -titel: Gültige Note -auftrag: Frage eine Note ab. Ist sie nicht zwischen 1 und 6, frage noch einmal. Ist sie gültig, gib sie aus, zum Beispiel **Deine Note: 3**. -test: 3 -> Deine Note: 3 -test: 0, 7, 2 -> Deine Note: 2 -test: 9, 6 -> Deine Note: 6 -test: -1, 1 -> Deine Note: 1 -braucht: doUntilSchleife -tipp: Die Note wird mindestens einmal abgefragt. Danach entscheidet die Bedingung, ob noch einmal gefragt wird. -tipp: Lege vor der Schleife \`int note = 0\` an. In die Schleife kommt die Eingabe \`input: note "Note von 1 bis 6"\`. Die Bedingung lautet \`note < 1 || note > 6\`. -lösung: l11-note-loesung.visustruct -::: - -## Übung: Summe bis 0 - -::: übung l11-summe -titel: Summe bis 0 -auftrag: Frage so lange Zahlen ab, bis eine 0 eingegeben wird. Gib danach die Summe aller eingegebenen Zahlen aus. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: Du brauchst eine Variable für die Summe, die vor der Schleife bei 0 beginnt. In jedem Durchlauf kommt die neue Zahl dazu. -tipp: Lege vor der Schleife \`int summe = 0\` und \`int zahl = 0\` an. In der Schleife fragst du \`zahl\` ab und rechnest \`summe = summe + zahl\`. Die 0 zu addieren schadet nicht. Die Schleife läuft weiter, solange \`zahl != 0\` ist. -tipp: Das Gerüst: \`int summe = 0\` und \`int zahl = 0\`, dann eine Do-while-Schleife mit der Bedingung \`zahl != 0\`. In ihr stehen die Eingabe von \`zahl\` und \`summe = summe + zahl\`. Unter der Schleife steht \`output: summe\`. -lösung: l11-summe-loesung.visustruct -::: - -## Jetzt in Java - -Die Schleife, die trotzdem einmal läuft, sieht in Java so aus: - -\`\`\`java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -\`\`\` - -- Der Rumpf steht zwischen \`do {\` und \`}\`, die Bedingung kommt erst danach. -- Hinter \`while (…)\` steht hier ein **Semikolon**. Das ist anders als bei der While-Schleife. - -::: übung l12-java-verdoppeln -titel: Mindestens einmal verdoppeln -code: java -auftrag: Schreibe ein Java-Programm, das eine Startzahl einliest. Mit einer Do-while-Schleife wird sie verdoppelt und ausgegeben, solange sie kleiner als 100 ist. Auch eine Zahl ab 100 wird mindestens einmal verdoppelt: Aus 200 wird 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: Im Rumpf verdoppelst du die Zahl und gibst sie aus. Die Bedingung steht am Ende. -tipp: \`do { zahl = zahl * 2; System.out.println(zahl); } while (zahl < 100);\` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Lückentext: do-while - -::: lückentext -titel: Verdreifachen -auftrag: Die Zahl wird verdreifacht und ausgegeben, solange sie kleiner als 100 ist. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -int zahl = 1; -[[do]] { - zahl = zahl * 3; - System.out.println(zahl); -} [[while]] (zahl [[<]] 100)[[;]] -\`\`\` -erklärung: Der Rumpf steht zwischen \`do {\` und \`}\`, die Bedingung erst danach. Hinter \`while (…)\` steht bei der Do-while-Schleife ein Semikolon. Ausgabe: 3, 9, 27, 81 und 243. -::: - -## Fehler finden: Halbieren - -::: übung l12-java-fehler -titel: Halbieren reparieren -code: java -auftrag: Das Programm liest eine Startzahl ein und teilt sie mit einer Do-while-Schleife immer wieder ganzzahlig durch 2. Jedes Ergebnis wird ausgegeben, bis **0** erreicht ist. Bei 10 also 5, 2, 1 und 0. Die 0 fehlt aber. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: Welchen Wert hat \`zahl\`, nachdem die 1 ausgegeben wurde? Läuft die Schleife dann noch einmal? -tipp: Die Schleife soll weiterlaufen, solange die Zahl größer als 0 ist: \`while (zahl > 0);\` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l12-java-laeuft-nicht -titel: Verdoppeln reparieren -code: java -auftrag: Das Programm soll ab 1 immer verdoppeln, solange die Zahl kleiner als 20 ist: **1**, **2**, **4**, **8**, **16**. Es gibt nur die 1 aus und bleibt dann stehen. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: Die erste Runde läuft noch. Der Fehler kommt erst, wenn die Bedingung unten zum ersten Mal geprüft wird. -tipp: In der Bedingung muss \`grenze\` mit kleinem g stehen: \`} while (zahl < grenze);\` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Mindestens einmal? - -::: spiel frage -titel: Spiel: Mindestens einmal? -intro: While oder do-while? Ludwig zeigt dir Schleifen. Sag vorher, was passiert. Sechs Runden. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: Was wird ausgegeben? -- nichts -- [x] 10 -- 10 bis 4 -> Erst machen, dann prüfen: Der Rumpf läuft einmal, danach ist 11 < 5 falsch. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: Was wird ausgegeben? -- [x] nichts -- 10 -- 11 -> Bei der While-Schleife kommt die Bedingung zuerst. 10 < 5 ist falsch, also läuft gar nichts. - -runde: - int zahl = 200; - do { - zahl = zahl * 2; - } while (zahl < 100); - System.out.println(zahl); -frage: Was wird ausgegeben? -- 200 -- [x] 400 -- 800 -> Einmal wird auf jeden Fall verdoppelt. Danach ist 400 < 100 falsch. - -runde: - int zahl = 30; - do { - zahl = zahl * 2; - System.out.println(zahl); - } while (zahl < 100); -frage: Was wird ausgegeben? -- 60 -- [x] 60\\n120 -- 60\\n120\\n240 -> Nach 60 ist 60 < 100 wahr, es geht weiter. Nach 120 ist Schluss. - -runde: -frage: Welche Zeile beendet eine Do-while-Schleife in Java richtig? -- [x] \`} while (i < 5);\` -- \`} while (i < 5)\` -- \`while (i < 5) {\` -> Hinter dem \`while (…)\` der Do-while-Schleife steht ein Semikolon. - -runde: -frage: Wofür nimmt man typischerweise eine Do-while-Schleife? -- [x] eine Eingabe wiederholen, bis sie gültig ist -- von 1 bis 10 zählen -- zwei Werte tauschen -> Gefragt wird mindestens einmal. Erst danach weiß man, ob die Eingabe gültig war. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft. → Erst machen, dann prüfen -- Ich kann erklären, warum der Inhalt mindestens einmal ausgeführt wird. → Mindestens ein Durchlauf -- Ich kann eine Eingabe so lange wiederholen lassen, bis sie gültig ist. → Typisch: Eingabe wiederholen -- Ich kann eine Do-while-Schleife in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet fußgesteuert? -→ Erst machen, dann prüfen -- [ ] Die Bedingung wird vor jedem Durchlauf geprüft. -- [x] Die Bedingung wird nach jedem Durchlauf geprüft. -- [ ] Die Schleife hat keine Bedingung. -> Die Bedingung steht im Fuß, also unten, und wird nach dem Inhalt ausgewertet. - -? Die Bedingung einer Do-while-Schleife ist von Anfang an falsch. Wie oft läuft der Inhalt? -→ Mindestens ein Durchlauf -- [ ] Keinmal -- [x] Genau einmal -- [ ] Endlos -> Der Inhalt läuft zuerst. Erst danach merkt die Schleife, dass sie aufhören soll. - -? Du willst eine Zahl von 1 bis 10 abfragen. Welche Bedingung gehört in den Fuß? -→ Typisch: Eingabe wiederholen -- [ ] \`zahl >= 1 && zahl <= 10\` -- [x] \`zahl < 1 || zahl > 10\` -- [ ] \`zahl == 10\` -> Wiederholt wird, solange die Eingabe ungültig ist, also kleiner als 1 oder größer als 10. - -? Wann ist eine Do-while-Schleife besser als eine While-Schleife? -→ Mindestens ein Durchlauf -- [x] Wenn der Inhalt auf jeden Fall einmal laufen muss, z. B. bei einer Eingabe -- [ ] Wenn die Schleife vielleicht gar nicht laufen soll -- [ ] Wenn man genau bis 10 zählen will - -? Was steht in Java am Ende einer Do-while-Schleife? -→ Jetzt in Java -- [ ] } while (bedingung) { -- [x] } while (bedingung); -- [ ] } until (bedingung); -> Nach der Bedingung kommt ein Semikolon. -::: -`,ew=`--- -titel: For-Schleife -bereich: Grundlagen -kurz: Mit Start, Bedingung und Schritt eine feste Anzahl von Durchläufen zählen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die drei Teile Start, Bedingung und Schritt der For-Schleife benennen -- erklären, in welcher Reihenfolge die drei Teile ausgeführt werden -- mit einer For-Schleife vorwärts, rückwärts und in größeren Schritten zählen -- eine For-Schleife in Java schreiben und ihre drei Felder erklären -::: - -## Zählen mit festem Plan - -In der While-Schleife hast du schon mitgezählt: Startwert vor der Schleife, Bedingung im Kopf, Veränderung im Inhalt. Die **For-Schleife** schreibt diese drei Teile zusammen in den Kopf. So siehst du auf einen Blick, wie gezählt wird. - -::: grafik l12-while-zu-for.svg animiert -Aus der While-Schleife wird eine For-Schleife: Start, Bedingung und Schritt wandern zusammen in den Kopf. -::: - -Wenn du eine For-Schleife anklickst, hat sie rechts drei Felder: - -- **Start:** \`int i = 1\` legt die Zählvariable an. -- **Bedingung:** \`i <= 5\` sagt, wie lange gezählt wird. -- **Schritt:** \`i++\` erhöht \`i\` nach jedem Durchlauf um 1. - -::: diagramm l12-eins-bis-fuenf.visustruct -Eine For-Schleife, die die Zahlen von 1 bis 5 ausgibt. -::: - -::: angeberwissen -Warum heißt die Zählvariable fast immer \`i\`? In der Mathematik steht \`i\` schon lange für einen Index. Und in FORTRAN, einer der ersten Programmiersprachen von 1957, waren alle Variablen, die mit I bis N anfingen, automatisch ganze Zahlen. Programmierer haben sich das bis heute nicht abgewöhnt. -::: - -## In welcher Reihenfolge? - -Die drei Teile kommen zu unterschiedlichen Zeiten dran: - -1. **Start** wird genau einmal ausgeführt, ganz am Anfang. -2. **Bedingung** wird vor jedem Durchlauf geprüft. Ist sie falsch, ist die Schleife fertig. -3. Nach dem Inhalt kommt der **Schritt**, dann wieder die Bedingung. - -::: grafik l12-for-ablauf.svg -Der Start kommt nur einmal dran. Danach wiederholen sich Bedingung, Inhalt und Schritt. -::: - -Die For-Schleife ist also kopfgesteuert wie die While-Schleife. Gehe das Beispiel in der Simulation mit **Schritt** durch und beobachte, wie sich \`i\` verändert. - -> Nimm die For-Schleife, wenn du schon vorher weißt, wie oft etwas passieren soll. Hängt das Ende von etwas ab, das erst während der Schleife passiert, zum Beispiel einer Eingabe, ist die While- oder Do-while-Schleife besser. - -## Beispiel: Summe von 1 bis n - -Eine For-Schleife eignet sich gut, um Zahlen aufzusummieren. Vor der Schleife steht \`int summe = 0\`. In jedem Durchlauf kommt die aktuelle Zahl \`i\` dazu. - -::: diagramm l12-summe.visustruct -Bei n = 4 rechnet die Schleife 0 + 1 + 2 + 3 + 4. Am Ende wird 10 ausgegeben. -::: - -## Andere Schritte - -Der Schritt muss nicht immer \`i++\` sein: - -- \`i--\` zählt rückwärts, zum Beispiel mit Start \`int i = 10\` und Bedingung \`i >= 1\`. -- \`i = i + 2\` springt in Zweierschritten, zum Beispiel 0, 2, 4, 6. - -Achte darauf, dass Start, Bedingung und Schritt zusammenpassen. Mit Start \`int i = 1\`, Bedingung \`i >= 1\` und Schritt \`i++\` wird die Bedingung nie falsch. - -::: übung l12-countdown -titel: Countdown -auftrag: Frage eine ganze Zahl \`n\` ab. Zähle mit einer For-Schleife von \`n\` rückwärts bis 1 und gib jede Zahl aus. Gib danach **Los!** aus. -test: 3 -> 3 | 2 | 1 | Los! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Los! -test: 1 -> 1 | Los! -braucht: forSchleife -tipp: Diesmal zählt die For-Schleife rückwärts. Überlege, wo sie beginnt, wann sie aufhört und wie sie zählt. -tipp: Start ist \`int i = n\`, die Bedingung \`i >= 1\` und der Schritt \`i--\`. Die Ausgabe Los! steht unter der Schleife, nicht darin. -lösung: l12-countdown-loesung.visustruct -::: - -## Übung: Einmaleins - -::: übung l12-einmaleins -titel: Einmaleins -auftrag: Frage eine Zahl ab und gib ihre Einmaleins-Reihe von 1 bis 10 aus. Jede Zeile sieht so aus: **3 x 1 = 3**, **3 x 2 = 6** und so weiter. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: Die Schleife zählt von 1 bis 10. In jedem Durchlauf gibst du eine Zeile der Reihe aus. -tipp: Rechne im Inhalt zuerst \`int produkt = zahl * i\`. Danach gibst du \`zahl + " x " + i + " = " + produkt\` aus. Denk an die Leerzeichen innerhalb der Anführungszeichen. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Übung: Summe reparieren - -::: übung l16-summe -titel: Summe reparieren -auftrag: Das Struktogramm soll alle Zahlen von 1 bis n zusammenzählen. Bei n = 4 soll also 1 + 2 + 3 + 4 = **10** herauskommen. Es gibt aber 6 aus. - Mache einen Schreibtischtest oder nutze **Schritt** und repariere den Fehler. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Gehe die Schleife mit n = 4 im Kopf oder mit **Schritt** durch. Welche Zahlen werden wirklich addiert? -tipp: Schau, mit welchem Wert von i die Schleife zuletzt läuft. Bei n = 4 muss auch i = 4 noch dazugezählt werden. -lösung: l16-summe-loesung.visustruct -::: - -## Jetzt in Java - -Die Summe von 1 bis n sieht in Java so aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Bis zu welcher Zahl?"); -int n = scanner.nextInt(); -int summe = 0; -for (int i = 1; i <= n; i++) { - summe = summe + i; -} -System.out.println(summe); -\`\`\` - -In den runden Klammern nach \`for\` stehen die drei Felder der For-Schleife, getrennt durch Semikolons: - -| Feld | In Java | Bedeutung | -|---|---|---| -| Startwert | \`int i = 1\` | \`i\` beginnt bei 1. | -| Bedingung | \`i <= n\` | Die Schleife läuft, solange das gilt. | -| Schritt | \`i++\` | Nach jedem Durchlauf wird \`i\` um 1 größer. | - -\`i++\` ist die Kurzform von \`i = i + 1\`. Rückwärts zählst du mit \`i--\`. - -::: übung l13-java-quadrate -titel: Quadratzahlen in Java -code: java -auftrag: Schreibe ein Java-Programm, das eine ganze Zahl \`n\` einliest und mit einer For-Schleife die Quadratzahlen von 1 bis \`n\` ausgibt, jede in einer eigenen Zeile. Bei 3 also 1, 4 und 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: Die Schleife zählt \`i\` von 1 bis \`n\`. Die Quadratzahl von \`i\` ist \`i * i\`. -tipp: \`for (int i = 1; i <= n; i++) { … }\` und im Rumpf \`System.out.println(i * i);\`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Lückentext: for - -::: lückentext -titel: Hoch- und runterzählen -auftrag: Die erste Schleife zählt die Zahlen von 1 bis 5 zusammen, die zweite zählt von 10 bis 0 rückwärts. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -int summe = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -\`\`\` -erklärung: In den runden Klammern stehen Startwert, Bedingung und Schritt, getrennt durch Semikolons. \`i++\` zählt hoch, \`i--\` zählt runter. Beim Rückwärtszählen bis 0 heißt die Bedingung \`i >= 0\`. -::: - -## Fehler finden: Einmaleins - -::: übung l13-java-fehler -titel: Einmaleins reparieren -code: java -auftrag: Das Programm fragt nach einer Reihe und soll sie vom 1-fachen bis zum 10-fachen ausgeben, bei 7 also 7, 14, … bis 70. Die 70 fehlt aber. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: Wie oft läuft die Schleife? Zähle nach, welche Werte \`i\` annimmt. -tipp: \`i\` soll auch den Wert 10 annehmen: \`i <= 10\` statt \`i < 10\`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l13-java-laeuft-nicht -titel: Treppe reparieren -code: java -auftrag: Ludwig klettert 5 Stufen hoch, jede ist 20 cm hoch. Das Programm soll **Höhe: 100 cm** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Höhe: 100 cm -braucht: forSchleife -tipp: Mit \`hoehe\` wird gerechnet, aber wo wird die Variable angelegt? Und mit welchem Wert startet Ludwig? -tipp: Lege \`hoehe\` vor der Schleife an: \`int hoehe = 0;\` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was das Programm tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sind die Teile einer Zeile umrandet, tippst du genau auf den falschen Teil, zum Beispiel nur auf \`i++\`. Acht Runden, je 25 Sekunden. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Soll 1, 2 und 3 ausgeben. -fehler: 2 -besser: System.out.println(i); -> Am Ende der Anweisung fehlt das Semikolon. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Soll 1 bis 5 ausgeben. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> Die drei Felder der For-Schleife werden mit Semikolons getrennt, nicht mit Kommas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Soll von 10 bis 1 rückwärts zählen. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> Mit \`i++\` wird \`i\` immer größer, die Bedingung \`i >= 1\` bleibt wahr: eine Endlosschleife. Rückwärts zählst du mit \`i--\`. - -runde: - int summe = 0; - for (int i = 1; i <= 4; i++) { - summe = i; - } - System.out.println(summe); -frage: Soll die Summe 1 + 2 + 3 + 4 = 10 ausgeben. -fehler: 3 -stelle: i -besser: summe = summe + i; -> \`summe = i\` überschreibt die Summe in jedem Durchlauf. Am Ende steht dort nur 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Määäh"); - } -frage: Soll genau fünfmal Määäh ausgeben. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> Von 0 bis einschließlich 5 sind es sechs Durchläufe. Wer bei 0 anfängt, nimmt \`<\`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Soll 1, 2 und 3 ausgeben. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> Java unterscheidet Groß- und Kleinbuchstaben: \`System\` schreibt man mit großem S. - -runde: - int zahl = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(zahl + " x " + i + " = " + zahl * zahl); - } -frage: Soll die Siebenerreihe ausgeben: 7 x 1 = 7, 7 x 2 = 14 und so weiter. -fehler: 3 -stelle: zahl * zahl -besser: System.out.println(zahl + " x " + i + " = " + zahl * i); -> \`zahl * zahl\` ist immer 49. Gerechnet werden muss \`zahl * i\`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Soll die geraden Zahlen 2, 4, 6, 8 und 10 ausgeben. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> \`i + 2\` rechnet nur, speichert aber nichts. Damit \`i\` wirklich wächst, braucht es \`i = i + 2\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die drei Teile Start, Bedingung und Schritt der For-Schleife benennen. → Zählen mit festem Plan -- Ich kann erklären, in welcher Reihenfolge die drei Teile ausgeführt werden. → In welcher Reihenfolge? -- Ich kann mit einer For-Schleife vorwärts, rückwärts und in größeren Schritten zählen. → Andere Schritte -- Ich kann eine For-Schleife in Java schreiben und ihre drei Felder erklären. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie oft wird der Start einer For-Schleife ausgeführt? -→ In welcher Reihenfolge? -- [x] Genau einmal -- [ ] Vor jedem Durchlauf -- [ ] Nach jedem Durchlauf -> Der Start legt die Zählvariable einmal am Anfang an. - -? Start \`int i = 0\`, Bedingung \`i < 3\`, Schritt \`i++\`. Welche Werte hat i im Inhalt? -→ Zählen mit festem Plan -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> Bei i = 3 ist die Bedingung falsch, deshalb läuft der Inhalt dann nicht mehr. - -? Start \`int i = 2\`, Bedingung \`i <= 10\`, Schritt \`i = i + 2\`. Wie oft läuft der Inhalt? -→ Andere Schritte -- [ ] 4-mal -- [x] 5-mal -- [ ] 10-mal -> i nimmt die Werte 2, 4, 6, 8 und 10 an. - -? Wann passt eine For-Schleife am besten? -→ Zählen mit festem Plan -- [x] Wenn vorher feststeht, wie oft wiederholt wird -- [ ] Wenn so lange gefragt wird, bis eine Eingabe gültig ist -- [ ] Wenn nur ein einziger Wert geprüft wird - -? Was bedeutet \`i++\` in einer For-Schleife? -→ Zählen mit festem Plan -- [ ] i wird verdoppelt. -- [x] i wird um 1 größer. -- [ ] i wird ausgegeben. -> \`i++\` ist die Kurzform von \`i = i + 1\`. -::: -`,tw=`--- -titel: Verschachteln -bereich: Grundlagen -kurz: Verzweigungen in Schleifen und Schleifen in Schleifen kombinieren. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Verzweigung in eine Schleife setzen -- eine Schleife in eine andere Schleife setzen -- erklären, dass die innere Schleife bei jedem Durchlauf der äußeren komplett durchläuft -- verschachtelte Schleifen und Verzweigungen in Java schreiben -::: - -## Bausteine ineinander - -Du kennst jetzt alle wichtigen Bausteine: Sequenz, Verzweigung, Fallauswahl und drei Arten von Schleifen. Richtig stark werden sie erst zusammen. - -Jeder Zweig und jeder Schleifeninhalt ist selbst wieder eine Sequenz. Dort darfst du jedes Element einsetzen, auch weitere Verzweigungen und Schleifen. Das nennt man **Verschachteln**. - -> Ziehe dazu ein Element einfach auf den Platzhalter ø im Inneren einer Schleife oder eines Zweigs. - -## Verzweigung in der Schleife - -Die Schleife geht alle Zahlen durch, die Verzweigung entscheidet bei jeder einzelnen Zahl, ob etwas passiert. So kannst du zum Beispiel zählen, wie viele gerade Zahlen es von 1 bis n gibt. - -::: diagramm l13-gerade-zaehlen.visustruct -Bei jedem Durchlauf prüft die Verzweigung mit i % 2 == 0, ob i gerade ist. Nur dann wird anzahl um 1 erhöht. Der false-Zweig bleibt leer. -::: - -Bei n = 7 sind das die Zahlen 2, 4 und 6, also wird 3 ausgegeben. - -## Übung: Gerade Eingaben zählen - -::: übung l13-gerade-eingaben -titel: Gerade Eingaben zählen -auftrag: Frage nacheinander genau **fünf** ganze Zahlen ab. Gib danach aus, wie viele davon gerade waren. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Fünfmal dasselbe tun heißt: Schleife. In jedem Durchlauf wird eine Zahl eingelesen und geprüft. -tipp: Eine For-Schleife von 1 bis 5. Im Inhalt steht zuerst die Eingabe \`input: int zahl "Zahl eingeben"\`, darunter eine Verzweigung mit \`zahl % 2 == 0\`. Im true-Zweig erhöhst du \`anzahl\` um 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## Schleife in der Schleife - -Steht eine Schleife in einer anderen, läuft die **innere Schleife bei jedem Durchlauf der äußeren komplett durch**. Damit kannst du Muster aus Zeilen und Spalten bauen. - -::: diagramm l13-dreieck.visustruct -Die äußere Schleife zählt die Zeilen. Die innere hängt so viele Sterne an den Text, wie die Zeilennummer angibt. Bei n = 3 entsteht ein Dreieck aus 1, 2 und 3 Sternen. -::: - -Mit \`String text = ""\` beginnt jede Zeile leer. \`text = text + "*"\` hängt einen Stern an. Erst wenn die Zeile fertig ist, wird sie ausgegeben. - -Erfahrene Programmierer nennen die Zählvariablen kurz \`i\` und \`j\`: außen \`i\`, innen \`j\`. Dann sieht es so aus, hier mit einer kleinen Einmaleins-Tabelle: - -::: grafik l13-verschachtelt-tabelle.svg animiert -Die äußere Schleife zählt mit \`i\` die Zeilen, die innere mit \`j\` die Zahlen in einer Zeile. Bei jeder neuen Zeile fängt \`j\` wieder bei 1 an. -::: - -## Übung: Rechteck - -::: übung l13-rechteck -titel: Rechteck -auftrag: Frage eine Breite und eine Höhe ab. Gib ein Rechteck aus \`#\` aus: so viele Zeilen wie die Höhe, und in jeder Zeile so viele \`#\` wie die Breite. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: Du brauchst zwei Schleifen ineinander: eine für die Zeilen und darin eine für die Zeichen einer Zeile. -tipp: Baue es wie das Dreieck. Der Unterschied: Die innere Schleife zählt immer bis \`breite\`, nicht bis zur Zeilennummer. Die äußere Schleife zählt bis \`hoehe\`. -tipp: Das Gerüst: Eingaben \`breite\` und \`hoehe\`. Äußere For-Schleife \`int zeile = 1\`, \`zeile <= hoehe\`, \`zeile++\`. Darin zuerst \`String text = ""\`, dann die innere For-Schleife \`int spalte = 1\`, \`spalte <= breite\`, \`spalte++\` mit \`text = text + "#"\`, und unter der inneren Schleife \`output: text\`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Den Überblick behalten - -Bei verschachtelten Diagrammen hilft dir die Darstellung: Was weiter innen steht, ist eingerückt und von seiner Schleife oder seinem Zweig umschlossen. - -- Lies von außen nach innen: Was wiederholt sich? Was wird bei jedem Durchlauf entschieden? -- Gib Zählvariablen sprechende Namen wie \`zeile\` und \`spalte\`. Zwei Schleifen dürfen nicht dieselbe Zählvariable verändern. -- Gehe ein Beispiel in der Simulation mit **Schritt** durch und beobachte die Variablen. - -::: angeberwissen -Genau dafür wurde das Struktogramm erfunden. Shneiderman fragte sich: Wenn man auf GOTO verzichten soll, warum dann nicht gleich auf die Pfeile im Flussdiagramm? Ergebnis: kein Pfeil-Spaghetti, und jeder Block bleibt brav in seinem Gatter. -::: - -## Jetzt in Java - -Das Zählen der geraden Zahlen sieht in Java so aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Bis zu welcher Zahl?"); -int n = scanner.nextInt(); -int anzahl = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - anzahl++; - } // Ende if -} // Ende for -System.out.println(anzahl); -\`\`\` - -Was im Struktogramm ineinander steckt, steht in Java in geschweiften Klammern ineinander. Jede Ebene ist vier Leerzeichen weiter eingerückt. Ist dein Code durcheinander, hilft der Knopf **Einrücken** oben im Bereich Code. - -Bei vielen schließenden Klammern \`}\` verliert man leicht den Überblick: Welche Klammer gehört zu welchem Block? Ein Kommentar dahinter sagt es dir, z. B. \`} // Ende if\` und \`} // Ende for\`. Das hilft dir auch, wenn du später weiterarbeitest. - -\`anzahl++\` ist die Kurzform von \`anzahl = anzahl + 1\`. - -::: übung l14-java-treppe -titel: Treppe aus Sternen -code: java -auftrag: Schreibe ein Java-Programm, das die Anzahl der Stufen einliest und eine Treppe aus Sternchen ausgibt. Bei 3 Stufen also \`*\`, \`**\` und \`***\`, jede Stufe in einer eigenen Zeile. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: Eine äußere Schleife zählt die Stufen. In jeder Stufe baut eine innere Schleife einen Text aus Sternchen zusammen. -tipp: In der äußeren Schleife: \`String zeile = "";\`, dann \`for (int j = 1; j <= i; j++) { zeile = zeile + "*"; }\` und danach \`System.out.println(zeile);\`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Lückentext: verschachteln - -::: lückentext -titel: Rechteck aus Sternen -auftrag: Das Programm gibt ein Rechteck aus 3 Zeilen mit je 4 Sternchen aus. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -for (int zeile = 1; zeile <= 3; zeile++) { - String text = [[""]]; - [[for]] (int spalte = 1; spalte [[<=]] 4; [[spalte++ | spalte += 1 | spalte = spalte + 1]]) { - text = text [[+]] "*"; - } - System.out.[[println]](text); -[[}]] -\`\`\` -erklärung: Die innere Schleife baut eine Zeile aus 4 Sternchen, die äußere wiederholt das dreimal. Jede Zeile beginnt mit einem leeren Text \`""\`. Die letzte Klammer schließt die äußere Schleife. -::: - -## Fehler finden: durch 3 teilbar - -::: übung l14-java-fehler -titel: Zählen reparieren -code: java -auftrag: Das Programm soll zählen, wie viele Zahlen von 1 bis \`n\` durch 3 teilbar sind, und **einmal** das Ergebnis ausgeben. Bei 10 also nur **Anzahl: 3**. Es gibt aber viel zu viele Zeilen aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l14-java-fehler-start.visustruct -test: 10 -> Anzahl: 3 -test: 3 -> Anzahl: 1 -test: 2 -> Anzahl: 0 -braucht: forSchleife, verzweigung -tipp: Achte auf die geschweiften Klammern: Steht die Ausgabe in der Schleife oder dahinter? -tipp: Verschiebe die Zeile \`System.out.println("Anzahl: " + anzahl);\` hinter die schließende Klammer der Schleife. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l14-java-laeuft-nicht -titel: Gerade Zahlen reparieren -code: java -auftrag: Das Programm soll die geraden Zahlen von 1 bis 10 ausgeben: **2**, **4**, **6**, **8**, **10**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: Der Fehler steckt ganz innen, in der Ausgabe. Wie heißt die Zählvariable der Schleife? -tipp: Die Zählvariable heißt \`i\` mit kleinem i: \`System.out.println(i);\` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Innen und außen - -::: spiel frage -titel: Spiel: Innen und außen -intro: Ludwig hat Bausteine ineinander gesteckt. Lies von außen nach innen und sag vorher, was passiert. Sechs Runden. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: Wie viele Sterne werden ausgegeben? -- 3 -- 5 -- [x] 6 -> Die innere Schleife läuft bei jedem der 3 Durchläufe der äußeren komplett durch: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Welche Zeile wird als vierte ausgegeben? -- 1 4 -- [x] 2 1 -- 2 2 -> Erst läuft j für i = 1 durch: 1 1, 1 2, 1 3. Danach beginnt j wieder bei 1, jetzt mit i = 2. - -runde: - int anzahl = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - anzahl++; - } - } - System.out.println(anzahl); -frage: Was wird ausgegeben? -- [x] 3 -- 10 -- 4 -> Die Verzweigung zählt nur 3, 6 und 9 mit. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("gerade"); - } else { - System.out.println(i); - } - } -frage: Was wird ausgegeben? -- 1\\n2\\n3\\n4 -- [x] 1\\ngerade\\n3\\ngerade -- gerade\\ngerade -> Bei jeder Zahl entscheidet die Verzweigung neu: ungerade Zahlen selbst, gerade als Wort. - -runde: - for (int i = 1; i <= 3; i++) { - String zeile = ""; - for (int j = 1; j <= i; j++) { - zeile = zeile + "*"; - } - System.out.println(zeile); - } -frage: Was wird ausgegeben? -- ***\\n***\\n*** -- [x] *\\n**\\n*** -- ***\\n**\\n* -> Die innere Schleife läuft bis i. Darum wird jede Zeile einen Stern länger. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: Was passiert? -- 1 bis 3 wird dreimal ausgegeben. -- 1 bis 3 wird einmal ausgegeben. -- [x] Java meldet einen Fehler. -> Zwei Schleifen ineinander brauchen zwei verschiedene Zählvariablen, zum Beispiel \`zeile\` und \`spalte\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Verzweigung in eine Schleife setzen. → Verzweigung in der Schleife -- Ich kann eine Schleife in eine andere Schleife setzen. → Schleife in der Schleife -- Ich kann erklären, dass die innere Schleife bei jedem Durchlauf der äußeren komplett durchläuft. → Schleife in der Schleife -- Ich kann verschachtelte Schleifen und Verzweigungen in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Die äußere Schleife läuft 3-mal, die innere 4-mal. Wie oft wird der Inhalt der inneren Schleife insgesamt ausgeführt? -→ Schleife in der Schleife -- [ ] 7-mal -- [x] 12-mal -- [ ] 4-mal -> Bei jedem der 3 äußeren Durchläufe läuft die innere Schleife 4-mal, also 3 · 4 = 12. - -? Woran erkennst du, ob eine Zahl gerade ist? -→ Verzweigung in der Schleife -- [ ] \`zahl / 2 == 0\` -- [x] \`zahl % 2 == 0\` -- [ ] \`zahl == 2\` -> % liefert den Rest beim Teilen. Bei geraden Zahlen ist der Rest beim Teilen durch 2 null. - -? In einer For-Schleife steht eine Verzweigung. Wie oft wird die Bedingung der Verzweigung geprüft? -→ Verzweigung in der Schleife -- [ ] Einmal -- [x] Einmal pro Durchlauf der Schleife -- [ ] Nur wenn sie wahr ist -> Die Verzweigung gehört zum Inhalt und kommt bei jedem Durchlauf dran. - -? Woran erkennst du in Java, was zu einer Schleife gehört? -→ Jetzt in Java -- [ ] An der Farbe -- [x] An den geschweiften Klammern und der Einrückung -- [ ] An den Semikolons -::: -`,nw=`--- -titel: Arrays -bereich: Grundlagen -kurz: Viele Werte unter einem Namen speichern, mit dem Index darauf zugreifen und sie mit einer Schleife durchlaufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Array mit Werten oder mit \`new int[5]\` anlegen -- erklären, dass der Index bei 0 beginnt und der letzte Index \`length - 1\` ist -- ein Array mit einer For-Schleife durchlaufen und füllen -- die Summe und das Maximum eines Arrays berechnen -- in Java ein Array anlegen und mit einer Schleife durchlaufen -::: - -## Viele Werte unter einem Namen - -Stell dir vor, du willst die Punkte von fünf Tests speichern. Mit fünf Variablen \`punkte1\` bis \`punkte5\` wird das schnell unübersichtlich. Ein **Array** ist eine Reihe von Fächern, die alle denselben Namen und denselben Datentyp haben. - -Du legst ein Array mit einer Anweisung an. Hinter den Datentyp schreibst du eckige Klammern \`[]\`: - -\`\`\` -int[] zahlen = {2, 4, 6, 8, 10} -String[] namen = {"Ada", "Ben", "Cem"} -\`\`\` - -Die Werte in den geschweiften Klammern stehen gleich in den Fächern. Du kannst auch ein leeres Array mit einer festen Anzahl von Fächern anlegen: - -\`\`\` -int[] punkte = new int[5] -String[] namen = new String[3] -\`\`\` - -Bei \`new int[5]\` stehen in allen fünf Fächern zuerst Nullen, bei \`new String[3]\` leere Texte. - -## Der Index beginnt bei 0 - -Jedes Fach hat eine Nummer, den **Index**. Gezählt wird ab **0**. Bei \`int[] zahlen = {2, 4, 6, 8, 10}\` gilt also: - -- \`zahlen[0]\` ist 2 -- \`zahlen[1]\` ist 4 -- \`zahlen[4]\` ist 10 - -::: grafik l14-array.svg -Fünf Fächer mit den Indizes 0 bis 4. Der Index steht über dem Fach, der Wert darin. -::: - -**Warum beginnt man bei 0?** In der Informatik ist der Index kein „wievieltes Fach“, sondern der **Abstand vom Anfang**. Das erste Fach liegt direkt am Anfang, also 0 Schritte entfernt. Das zweite liegt 1 Schritt entfernt, das dritte 2 Schritte. Du kennst das aus dem Aufzug: Das Erdgeschoss ist die **0**, der erste Stock liegt eine Etage darüber. - -Daraus folgt eine Regel, die du dir merken solltest: Bei 5 Fächern ist der **letzte Index 4**, also immer eins weniger als die Anzahl. - -::: angeberwissen -Dass ab 0 gezählt wird, ist ziemlich alt. Schon die Programmiersprache C von 1972 rechnet so: Der Computer kennt die Adresse des ersten Fachs und rechnet für \`zahlen[i]\` einfach „Anfang plus i Fächer weiter“. Bei i = 0 bleibt er am Anfang stehen, das spart eine Rechnung. Java, Python und JavaScript haben das übernommen. Ich zähle meine Hörner übrigens auch ab 0: Horn 0 links, Horn 1 rechts. -::: - -Mit dem Index liest du einen Wert oder schreibst einen neuen hinein: - -\`\`\` -output: zahlen[0] -zahlen[1] = 99 -\`\`\` - -> Ein Array mit 5 Fächern hat die Indizes 0 bis 4. \`zahlen[5]\` gibt es nicht. Die Simulation meldet dann einen ungültigen Ausdruck. - -## Die Länge eines Arrays - -Wie viele Fächer ein Array hat, verrät \`zahlen.length\`. Bei fünf Werten ist das 5. Der **letzte** Index ist deshalb immer \`zahlen.length - 1\`: - -\`\`\` -output: zahlen.length -output: zahlen[zahlen.length - 1] -\`\`\` - -Die zweite Zeile gibt den letzten Wert aus, egal wie lang das Array ist. VisuStruct versteht auch die Schreibweise \`zahlen.length()\`. - -::: übung l14-erster-letzter -titel: Erster und letzter Wert -auftrag: Lege das Array \`int[] werte = {4, 8, 15, 16, 23, 42}\` an. Gib danach in drei Zeilen aus: den ersten Wert, den letzten Wert und die Anzahl der Werte. - Für den letzten Wert sollst du die Länge benutzen und nicht einfach den Index 5 hinschreiben. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Gezählt wird ab 0. Das erste Fach hat also den Index 0. Und wie heißt der Index des letzten Fachs? -tipp: Der erste Wert ist \`werte[0]\`. Der letzte ist \`werte[werte.length - 1]\`. Die Anzahl ist \`werte.length\`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Ein Array mit der Schleife durchlaufen - -Seine Stärke zeigt ein Array zusammen mit einer **For-Schleife**. Die Zählvariable \`i\` läuft von 0 bis zum letzten Index und dient als Index: - -\`\`\` -int i = 0 -i < zahlen.length -i++ -\`\`\` - -Im ersten Durchlauf ist \`i\` gleich 0, im letzten gleich 4. Weil die Bedingung \`i < zahlen.length\` lautet, passt die Schleife zu jeder Länge. - -::: diagramm l14-array-durchlaufen.visustruct -Die For-Schleife gibt alle fünf Werte nacheinander aus. Schau in der Simulation unter Variablen zu, wie i von 0 bis 4 zählt. -::: - -So füllst du ein leeres Array auch mit Eingaben. Als Ziel der Eingabe schreibst du das Fach \`namen[i]\`: - -::: diagramm l14-namen-eingeben.visustruct -Drei Namen werden abgefragt und in die Fächer 0, 1 und 2 geschrieben. -::: - -::: übung l14-rueckwaerts -titel: Rückwärts ausgeben -auftrag: Lege ein Array für 4 ganze Zahlen an und lies die 4 Zahlen mit einer Schleife ein. Gib sie danach in **umgekehrter** Reihenfolge aus, jede in einer eigenen Zeile. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: Du brauchst zwei Schleifen: eine zum Einlesen von vorn nach hinten und eine zum Ausgeben von hinten nach vorn. -tipp: Mit \`int[] zahlen = new int[4]\` legst du das Array an. Die Eingabe lautet \`input: zahlen[i] "Zahl eingeben"\`. Für die zweite Schleife beginnst du bei \`int i = zahlen.length - 1\`, prüfst \`i >= 0\` und zählst mit \`i--\` herunter. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr** aus Wien war in den 1940er-Jahren ein berühmter Hollywood-Filmstar. In ihrer Freizeit erfand sie gern. 1942 bekam sie zusammen mit dem Komponisten George Antheil ein Patent auf eine Funkverbindung, die der Feind nicht stören sollte: Sender und Empfänger springen gemeinsam durch eine Liste von **88 Frequenzen**, so viele, wie ein Klavier Tasten hat. Die Liste stand auf einem Lochstreifen wie bei einem selbstspielenden Klavier. Beide gehen dieselbe Liste in derselben Reihenfolge durch, so wie deine Schleife mit \`i\` durch ein Array. Wer nur eine Frequenz abhört oder stört, bekommt fast nichts mit. - -Dieses **Frequenzsprungverfahren** (englisch *frequency hopping*) steckt heute zum Beispiel in Bluetooth. Ganz allein erfunden hat sie es nicht, es gab schon frühere Ideen. Ihr Patent gilt aber als wichtiger Vorläufer, und 1997 wurde sie dafür ausgezeichnet. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), Schauspielerin und Erfinderin, 1944 (Pressefoto: [unbekannt](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), gemeinfrei). -::: - -## Summe und Maximum - -Zwei Aufgaben kommen bei Arrays immer wieder vor: - -- **Summe:** Du beginnst mit \`summe = 0\` und zählst in der Schleife jeden Wert dazu. -- **Maximum:** Du merkst dir zuerst den Wert im Fach 0 als bisher größten. In der Schleife prüfst du jeden Wert. Ist er größer, wird er das neue Maximum. - -::: diagramm l14-summe-maximum.visustruct -Summe und Maximum in einem einzigen Durchlauf. Das Maximum beginnt mit punkte[0] und nicht mit 0, damit es auch bei negativen Zahlen stimmt. -::: - -::: übung l14-summe-max -titel: Summe und Maximum -auftrag: Lies 5 ganze Zahlen in ein Array ein. Gib danach **Summe: …** und in der nächsten Zeile **Maximum: …** aus. -test: 3, 9, 2, 9, 1 -> Summe: 24 | Maximum: 9 -test: 10, 20, 30, 40, 50 -> Summe: 150 | Maximum: 50 -test: -5, -2, -9, -1, -3 -> Summe: -20 | Maximum: -1 -braucht: forSchleife, verzweigung -tipp: Gehe das Array mit einer Schleife durch. Zähle jeden Wert zur Summe und merke dir den größten bisher gesehenen Wert. -tipp: Rechne Summe und Maximum in eigenen Variablen aus und gib sie erst am Ende aus, z. B. mit \`output: "Summe: " + summe\`. Beginnt dein Maximum bei 0, scheitert der dritte Test. -tipp: Das Gerüst: Array anlegen und mit einer Schleife einlesen. Dann \`int summe = 0\` und \`int max = zahlen[0]\`. Eine zweite Schleife rechnet \`summe = summe + zahlen[i]\`, und eine Verzweigung \`zahlen[i] > max\` setzt im true-Zweig \`max = zahlen[i]\`. Zum Schluss die beiden Ausgaben. -lösung: l14-summe-max-loesung.visustruct -::: - -## Jetzt in Java - -Das Durchlaufen eines Arrays sieht in Java so aus: - -\`\`\`java editor -int[] zahlen = {2, 4, 6, 8, 10}; -for (int i = 0; i < zahlen.length; i++) { - System.out.println(zahlen[i]); -} -\`\`\` - -- \`int[]\` heißt „Array aus ganzen Zahlen“. Die Werte stehen in geschweiften Klammern. -- Ein leeres Array mit 5 Fächern legst du mit \`new int[5]\` an. -- \`zahlen[i]\` ist das Fach mit dem Index \`i\`, \`zahlen.length\` die Länge. - -Gibst du das ganze Array aus, also \`System.out.println(zahlen);\`, zeigt Java nicht die Zahlen. Du siehst nur einen Text wie \`[I@1b6d3586\`. Das ist die **Referenz**, also die Stelle, an der das Array im Speicher liegt. Den Inhalt zeigt erst \`Arrays.toString(zahlen)\`, das ergibt \`[2, 4, 6, 8, 10]\`. Dafür schreibst du ganz oben \`import java.util.Arrays;\`. - -::: übung l15-java-noten -titel: Notensumme in Java -code: java -auftrag: Lege in Java das Array \`noten\` mit den Werten 2, 3, 1 und 4 an. Zähle alle Noten mit einer For-Schleife zusammen und gib **Summe: 10** aus. -test: - -> Summe: 10 -braucht: forSchleife -tipp: Lege vor der Schleife \`int summe = 0;\` an. Die Schleife läuft von 0 bis \`noten.length - 1\`. -tipp: \`int[] noten = {2, 3, 1, 4};\`, dann \`for (int i = 0; i < noten.length; i++) { summe = summe + noten[i]; }\` und zum Schluss \`System.out.println("Summe: " + summe);\`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Lückentext: Arrays - -::: lückentext -titel: Das Maximum suchen -auftrag: Das Programm sucht den größten Wert im Array. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -[[int]][] werte = {3, 7, 1, 9, 4}; -int max = werte[0]; -[[for]] (int i = 1; i < werte.[[length]]; i++) { - if (werte[i] [[>]] max) { - max = werte[i]; - } -} -System.out.println("Maximum: " + max); -\`\`\` -erklärung: \`int[]\` ist ein Array aus ganzen Zahlen, \`werte.length\` seine Länge. \`max\` beginnt mit dem ersten Wert, die Schleife vergleicht alle weiteren damit. Ausgabe: **Maximum: 9** -::: - -## Fehler finden: Temperaturen - -::: übung l15-java-fehler -titel: Höchste Temperatur reparieren -code: java -auftrag: Im Januar wurden die Temperaturen -5, -2, -8 und -3 Grad gemessen. Das Programm soll die höchste ausgeben, also **Höchste Temperatur: -2**. Es behauptet aber 0 Grad, obwohl es so warm nie war. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l15-java-fehler-start.visustruct -test: - -> Höchste Temperatur: -2 -braucht: forSchleife, verzweigung -tipp: Mit welchem Wert beginnt \`max\`? Ist irgendeine der Temperaturen größer als dieser Startwert? -tipp: \`max\` muss mit einem Wert aus dem Array beginnen: \`int max = temperaturen[0];\` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l15-java-laeuft-nicht -titel: Punkte zusammenzählen -code: java -auftrag: Im Array \`punkte\` stehen 4, 7, 2 und 5. Das Programm soll alle zusammenzählen und **Summe: 18** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Summe: 18 -braucht: forSchleife -tipp: Der Code-Bereich unterstreicht das falsche Wort rot. Wie schreibt man die Länge eines Arrays? -tipp: \`length\` schreibt man ganz klein: \`i < punkte.length\` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler** rund um Arrays, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Sind die Teile einer Zeile umrandet, tippst du genau auf den falschen Teil. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - for (int i = 0; i <= zahlen.length; i++) { - System.out.println(zahlen[i]); - } -frage: Soll alle fünf Werte ausgeben. -fehler: 2 -stelle: i <= zahlen.length -besser: for (int i = 0; i < zahlen.length; i++) { -> Mit \`<=\` läuft i bis 5. Das Fach \`zahlen[5]\` gibt es nicht. - -runde: - String[] namen = {"Ada", "Ben", "Cem"}; - System.out.println(namen[1]); -frage: Soll den ersten Namen ausgeben, also Ada. -fehler: 2 -stelle: namen[1] -besser: System.out.println(namen[0]); -> Gezählt wird ab 0. \`namen[1]\` ist schon Ben. - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - System.out.println(zahlen[zahlen.length]); -frage: Soll den letzten Wert ausgeben, also 10. -fehler: 2 -stelle: zahlen[zahlen.length] -besser: System.out.println(zahlen[zahlen.length - 1]); -> Der letzte Index ist immer eins weniger als die Länge. - -runde: - int[] punkte = {3, 9, 2}; - int summe = 0; - for (int i = 0; i < punkte.length; i++) { - summe = punkte[i]; - } - System.out.println(summe); -frage: Soll die Summe 14 ausgeben. -fehler: 4 -stelle: punkte[i] -besser: summe = summe + punkte[i]; -> So überschreibt jeder Wert den vorigen, am Ende steht nur 2 in summe. - -runde: - int[] punkte = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < punkte.length; i++) { - if (punkte[i] > max) { - max = punkte[i]; - } - } - System.out.println(max); -frage: Soll das Maximum -2 ausgeben. -fehler: 2 -stelle: 0 -besser: int max = punkte[0]; -> Keine der Zahlen ist größer als 0, also bliebe max bei 0. Das Maximum beginnt deshalb mit dem ersten Fach. - -runde: - int[] zahlen = {2, 4, 6, 8, 10}; - for (int i = zahlen.length; i >= 0; i--) { - System.out.println(zahlen[i]); - } -frage: Soll die Werte rückwärts ausgeben, von 10 bis 2. -fehler: 2 -stelle: int i = zahlen.length -besser: for (int i = zahlen.length - 1; i >= 0; i--) { -> Rückwärts beginnt man beim letzten Index, und der ist \`zahlen.length - 1\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Array mit Werten oder mit \`new int[5]\` anlegen. → Viele Werte unter einem Namen -- Ich kann erklären, dass der Index bei 0 beginnt und der letzte Index \`length - 1\` ist. → Der Index beginnt bei 0 -- Ich kann ein Array mit einer For-Schleife durchlaufen und füllen. → Ein Array mit der Schleife durchlaufen -- Ich kann die Summe und das Maximum eines Arrays berechnen. → Summe und Maximum -- Ich kann in Java ein Array anlegen und mit einer Schleife durchlaufen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was gibt \`output: zahlen[2]\` bei \`int[] zahlen = {5, 10, 15, 20}\` aus? -→ Der Index beginnt bei 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Gezählt wird ab 0: zahlen[0] ist 5, zahlen[1] ist 10, zahlen[2] ist 15. - -? Ein Array hat 8 Fächer. Welcher Index ist der letzte? -→ Der Index beginnt bei 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> Der letzte Index ist immer length - 1. - -? Welche Bedingung passt in eine For-Schleife, die alle Werte von \`zahlen\` durchläuft und bei \`int i = 0\` beginnt? -→ Ein Array mit der Schleife durchlaufen -- [x] i < zahlen.length -- [ ] i <= zahlen.length -- [ ] i > zahlen.length -> Mit <= würde die Schleife auch zahlen[length] lesen, und dieses Fach gibt es nicht. - -? Womit sollte das Maximum beginnen, bevor die Schleife startet? -→ Summe und Maximum -- [ ] Immer mit 0 -- [x] Mit dem ersten Wert des Arrays -- [ ] Mit der Länge des Arrays -> Beginnt es mit 0, wäre bei lauter negativen Zahlen 0 das Ergebnis, obwohl 0 gar nicht im Array steht. - -? Welches deutsche Wort wird oft für Array benutzt? -→ Viele Werte unter einem Namen -- [ ] Zweig -- [x] Feld -- [ ] Fall -> Ein Array heißt auf Deutsch oft Feld. Gemeint ist dasselbe: viele Fächer unter einem Namen. - -? Welche Zeile legt in Java ein Array mit drei Zahlen an? -→ Jetzt in Java -- [x] int[] zahlen = {1, 2, 3}; -- [ ] int zahlen = [1, 2, 3]; -- [ ] array zahlen = (1, 2, 3); -::: -`,iw=`--- -titel: Zweidimensionale Arrays -bereich: Grundlagen -kurz: Werte in Zeilen und Spalten speichern, wie die Sitze in einem Kinosaal, und mit zwei verschachtelten Schleifen durchlaufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein 2D-Array anlegen und erklären, was die beiden Zahlen bedeuten -- ein Fach mit Reihe und Platz lesen und schreiben -- \`sitze.length\` und \`sitze[0].length\` unterscheiden -- erklären, in welcher Reihenfolge zwei verschachtelte Schleifen die Fächer besuchen -- in Java ein zweidimensionales Array anlegen und durchlaufen -::: - -## Ein Kinosaal als Tabelle - -Ein Kinosaal hat mehrere **Reihen**, und jede Reihe hat mehrere **Plätze**. Für jeden Sitz wollen wir uns merken, ob die Karte schon verkauft ist. Das ist eine Ja-oder-nein-Frage, also passt der Datentyp \`boolean\`: \`true\` heißt verkauft, \`false\` heißt frei. - -Ein normales Array ist eine einzige Reihe von Fächern. Für den Saal brauchen wir eine **Tabelle** mit Zeilen und Spalten. Das ist ein **zweidimensionales Array**, kurz 2D-Array. Du schreibst dafür zwei Paar eckige Klammern: - -\`\`\` -boolean[][] sitze = new boolean[3][5] -\`\`\` - -Das ergibt 3 Reihen mit je 5 Plätzen, also 15 Fächer. Am Anfang steht in allen Fächern \`false\`: Alle Plätze sind frei. - -::: grafik kino-saal.svg -Der erste Index ist die Reihe, der zweite der Platz. Beide werden ab 0 gezählt. -::: - -## Ein Fach ansprechen - -Für ein Fach brauchst du jetzt **zwei** Indizes: zuerst die Reihe, dann den Platz. - -\`\`\` -sitze[1][2] = true -\`\`\` - -Damit ist in Reihe 1 der Platz 2 verkauft. Gelesen wird genauso: \`sitze[1][2]\` ist jetzt \`true\`. - -Auch die Größe kannst du abfragen: - -- \`sitze.length\` ist die Anzahl der **Reihen**, hier 3. -- \`sitze[0].length\` ist die Anzahl der **Plätze** in Reihe 0, hier 5. - -::: diagramm kino-verkaufen.visustruct -Drei Karten werden verkauft. Danach gibt das Diagramm die Größe des Saals aus und ob Reihe 1, Platz 2 verkauft ist. Schau in der Simulation unter Variablen zu: sitze wird Zeile für Zeile angezeigt. -::: - -> Wie beim normalen Array gibt es kein Fach \`sitze[3][0]\`, denn die Reihen heißen 0, 1 und 2. Die Simulation meldet dann einen ungültigen Ausdruck. - -## Zwei Schleifen ineinander - -Um **alle** Plätze anzusehen, brauchst du zwei For-Schleifen ineinander: - -- Die **äußere Schleife** zählt die Reihe: \`reihe\` läuft von 0 bis 2. -- Die **innere Schleife** zählt den Platz: \`platz\` läuft von 0 bis 4. - -::: grafik kino-schleifen.svg -Blau ist die äußere Schleife, Orange die innere. Die Zahlen zeigen, in welcher Reihenfolge die Plätze drankommen. -::: - -Für jede Reihe läuft die innere Schleife einmal **komplett** durch. Erst wenn \`platz\` alle fünf Plätze besucht hat, zählt die äußere Schleife \`reihe\` um eins weiter. Danach beginnt \`platz\` wieder bei 0. So kommen alle 3 · 5 = 15 Plätze genau einmal dran. - -Die Bedingungen lauten \`reihe < sitze.length\` und \`platz < sitze[reihe].length\`. So passen die Schleifen zu jeder Saalgröße. - -::: diagramm kino-saalplan.visustruct -Der Saalplan: Für jede Reihe wird eine Zeile aus X (verkauft) und O (frei) zusammengesetzt und ausgegeben. Gehe es mit Schritt durch und beobachte, wie platz immer wieder von vorn beginnt, während reihe nur langsam weiterzählt. -::: - -::: angeberwissen -Jedes Handyfoto ist ein 2D-Array! Ein Foto mit 4000 · 3000 Pixeln hat 3000 Zeilen mit je 4000 Fächern, also 12 Millionen Pixel. In jedem Fach steht die Farbe eines Punkts. Wenn du ein Foto heller machst, läuft das Handy mit zwei verschachtelten Schleifen über alle Pixel. Mein Profilbild hat übrigens nur ein Fach: braun. -::: - -## Übung: Freie Plätze zählen - -::: übung kino-frei -titel: Freie Plätze zählen -auftrag: Im Startdiagramm sind schon drei Karten verkauft. Zähle mit zwei verschachtelten Schleifen, wie viele Plätze noch **frei** sind, und gib z. B. \`Frei: 12\` aus. -start: kino-frei-start.visustruct -test: - -> Frei: 12 -braucht: forSchleife, verzweigung -tipp: Du gehst wie beim Saalplan mit zwei Schleifen über alle Plätze. Statt etwas auszugeben, zählst du mit. -tipp: Lege vor den Schleifen \`int frei = 0\` an. Ein Platz ist frei, wenn \`sitze[reihe][platz]\` falsch ist. Die Bedingung dafür lautet \`!sitze[reihe][platz]\`. -lösung: kino-frei-loesung.visustruct -::: - -## Übung: Karte verkaufen - -::: übung kino-karte -titel: Karte verkaufen -auftrag: Das Startdiagramm fragt nach Reihe und Platz. Ist der Platz schon verkauft, gib \`Schon verkauft\` aus. Sonst markiere ihn als verkauft und gib z. B. \`Verkauft: Reihe 0, Platz 4\` aus. -start: kino-karte-start.visustruct -test: 1, 2 -> Schon verkauft -test: 0, 4 -> Verkauft: Reihe 0, Platz 4 -test: 2, 0 -> Verkauft: Reihe 2, Platz 0 -braucht: verzweigung -tipp: Zuerst wird geprüft, ob der Platz verkauft ist. Je nach Antwort passiert etwas anderes. -tipp: Hier brauchst du keine Schleife. Eine Verzweigung mit der Bedingung \`sitze[reihe][platz]\` genügt. Im false-Zweig setzt du das Fach auf \`true\`. -lösung: kino-karte-loesung.visustruct -::: - -## Übung: Einmaleins-Tabelle - -::: übung kino-einmaleins -titel: Einmaleins-Tabelle -auftrag: Lege \`int[][] tabelle = new int[10][10]\` an und fülle sie mit zwei Schleifen mit dem kleinen Einmaleins. Frage danach zwei Zahlen von 1 bis 10 ab und lies das Ergebnis aus der Tabelle, z. B. \`3 · 4 = 12\`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: Erst füllen zwei verschachtelte Schleifen die Tabelle, danach liest du nur ein einziges Fach aus. -tipp: Die Indizes laufen von 0 bis 9, die Zahlen aber von 1 bis 10. Darum steht im Fach \`tabelle[i][j]\` der Wert \`(i + 1) * (j + 1)\`, und für 3 · 4 liest du \`tabelle[a - 1][b - 1]\`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Jetzt in Java - -Der Kinosaal sieht in Java so aus: - -\`\`\`java editor -boolean[][] sitze = new boolean[3][5]; -sitze[0][2] = true; -sitze[1][1] = true; -sitze[1][2] = true; -System.out.println("Reihen: " + sitze.length); -System.out.println("Plätze pro Reihe: " + sitze[0].length); -System.out.println("Reihe 1, Platz 2 verkauft? " + sitze[1][2]); -\`\`\` - -- Zwei Paar eckige Klammern \`[][]\` stehen für eine Tabelle: erst die Reihe, dann der Platz. -- \`sitze.length\` ist die Zahl der Reihen, \`sitze[0].length\` die Zahl der Plätze in einer Reihe. -- Mit festen Werten schreibst du jede Reihe in eigene geschweifte Klammern: \`int[][] t = {{1, 2}, {3, 4}};\` - -::: übung l16-java-punkte -titel: Punkte zusammenzählen -code: java -auftrag: Drei Spieler haben je zwei Runden gespielt. Lege in Java die Tabelle \`punkte\` mit den Reihen {3, 5}, {4, 1} und {2, 2} an. Zähle mit zwei verschachtelten For-Schleifen alle Punkte zusammen und gib **Summe: 17** aus. -test: - -> Summe: 17 -braucht: forSchleife -tipp: Die äußere Schleife geht durch die Reihen, die innere durch die Plätze einer Reihe. -tipp: \`int[][] punkte = {{3, 5}, {4, 1}, {2, 2}};\` und in der inneren Schleife \`summe = summe + punkte[i][j];\`. Die innere Schleife läuft bis \`punkte[i].length\`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Lückentext: Tabellen - -::: lückentext -titel: Alle Felder zusammenzählen -auftrag: Das Programm zählt alle Zahlen in der Tabelle zusammen. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -[[int]][][] feld = {{1, 2, 3}, {4, 5, 6}}; -int summe = 0; -for (int r = 0; r < feld.[[length]]; r++) { - for (int s = 0; s < feld[r].[[length]]; s++) { - summe = summe [[+]] feld[r][s]; - } -} -System.out.println("Summe: " + summe); -\`\`\` -erklärung: \`int[][]\` ist eine Tabelle. \`feld.length\` ist die Zahl der Reihen (2), \`feld[r].length\` die Zahl der Felder in Reihe \`r\` (3). Ausgabe: **Summe: 21** -::: - -## Fehler finden: Punkte - -::: übung l16-java-fehler -titel: Spieler 2 reparieren -code: java -auftrag: In der Tabelle \`punkte\` steht jede Reihe für einen Spieler. Das Programm soll die Punkte von Spieler 2 (Reihe 1) zusammenzählen, also **Spieler 2: 11**. Stattdessen meldet es einen Fehler. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l16-java-fehler-start.visustruct -test: - -> Spieler 2: 11 -braucht: forSchleife -tipp: Bei \`punkte[a][b]\` ist \`a\` die Reihe und \`b\` der Platz in der Reihe. Welche Zahl steht für die Reihe von Spieler 2? -tipp: Die Indizes sind vertauscht: \`punkte[1][j]\` statt \`punkte[j][1]\`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l16-java-laeuft-nicht -titel: Spielstand ablesen -code: java -auftrag: In der Tabelle \`punkte\` steht jede Reihe für einen Spieler, jede Spalte für eine Runde. Das Programm soll die Punkte von Spieler 2 in Runde 1 ausgeben, also **Spieler 2, Runde 1: 4**. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Spieler 2, Runde 1: 4 -braucht: anweisung -tipp: Die Fächer \`[1][0]\` stimmen. Schau dir den Namen der Tabelle an. -tipp: Die Tabelle heißt \`punkte\` mit kleinem p: \`punkte[1][0]\` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Welcher Platz? - -::: spiel frage -titel: Spiel: Welcher Platz? -intro: Ludwig verkauft Kinokarten. Erst die Reihe, dann der Platz, beide ab 0. Sieben Runden. - -runde: - boolean[][] sitze = new boolean[3][5]; - System.out.println(sitze.length); -frage: Was wird ausgegeben? -- [x] 3 -- 5 -- 15 -> \`sitze.length\` ist die Anzahl der Reihen. - -runde: - boolean[][] sitze = new boolean[3][5]; - System.out.println(sitze[0].length); -frage: Was wird ausgegeben? -- 3 -- [x] 5 -- 15 -> \`sitze[0]\` ist die Reihe 0. Ihre Länge ist die Anzahl der Plätze in dieser Reihe. - -runde: - int[][] tabelle = new int[4][6]; -frage: Wie viele Fächer hat die Tabelle? -- 10 -- [x] 24 -- 35 -> 4 Reihen mit je 6 Plätzen: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: Was wird ausgegeben? -- 2 -- [x] 3 -- 4 -> Reihe 1 ist \`{3, 4}\`, darin Platz 0 die 3. - -runde: - boolean[][] sitze = new boolean[3][5]; - sitze[3][0] = true; -frage: Was passiert? -- Der erste Platz in Reihe 3 ist verkauft. -- Der erste Platz in der letzten Reihe ist verkauft. -- [x] Es gibt einen Fehler, denn die Reihen heißen 0, 1 und 2. -> Wie beim normalen Array ist der letzte Index eins weniger als die Länge. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int summe = 0; - for (int reihe = 0; reihe < t.length; reihe++) { - for (int platz = 0; platz < t[reihe].length; platz++) { - summe = summe + t[reihe][platz]; - } - } - System.out.println(summe); -frage: Was wird ausgegeben? -- 6 -- 15 -- [x] 21 -> Die zwei Schleifen besuchen alle sechs Fächer: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Zwei Schleifen gehen den Saal \`new boolean[3][5]\` durch. Welches Fach kommt direkt nach \`sitze[0][4]\`? -- \`sitze[0][5]\` -- [x] \`sitze[1][0]\` -- \`sitze[1][4]\` -> Reihe 0 ist fertig. Die äußere Schleife zählt weiter, und der Platz beginnt wieder bei 0. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein 2D-Array anlegen und erklären, was die beiden Zahlen bedeuten. → Ein Kinosaal als Tabelle -- Ich kann ein Fach mit Reihe und Platz lesen und schreiben. → Ein Fach ansprechen -- Ich kann \`sitze.length\` und \`sitze[0].length\` unterscheiden. → Ein Fach ansprechen -- Ich kann erklären, in welcher Reihenfolge zwei verschachtelte Schleifen die Fächer besuchen. → Zwei Schleifen ineinander -- Ich kann in Java ein zweidimensionales Array anlegen und durchlaufen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Wie viele Fächer hat \`boolean[][] sitze = new boolean[4][6]\`? -→ Ein Kinosaal als Tabelle -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 Reihen mit je 6 Plätzen: 4 · 6 = 24. - -? Was steht nach \`new boolean[3][5]\` in allen Fächern? -→ Ein Kinosaal als Tabelle -- [ ] true -- [x] false -- [ ] Nichts, die Fächer sind leer -> Ein neues boolean-Array ist mit false gefüllt. Im Kino heißt das: alle Plätze frei. - -? Zwei verschachtelte Schleifen laufen über 3 Reihen mit 5 Plätzen. Wie oft wird der Inhalt der **inneren** Schleife ausgeführt? -→ Zwei Schleifen ineinander -- [ ] 3-mal -- [ ] 8-mal -- [x] 15-mal -> Für jede der 3 Reihen läuft die innere Schleife 5-mal: 3 · 5 = 15. - -? Ordne zu, was der Ausdruck im Kinosaal bedeutet. -→ Ein Fach ansprechen -= sitze.length -> Anzahl der Reihen -= sitze[0].length -> Anzahl der Plätze in Reihe 0 -= sitze[2][4] -> Reihe 2, Platz 4 -= sitze[1][0] = true -> In Reihe 1 ist Platz 0 verkauft - -? Was gibt \`sitze.length\` bei \`new boolean[3][5]\` an? -→ Ein Fach ansprechen -- [x] 3, die Zahl der Reihen -- [ ] 5, die Zahl der Plätze -- [ ] 15, alle Plätze zusammen -::: -`,aw=`--- -titel: Zeichenketten -bereich: Grundlagen -kurz: Mit Texten arbeiten, also einzelne Zeichen lesen, Teile herausschneiden, suchen, vergleichen und zerlegen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass auch die Zeichen eines Strings ab 0 gezählt werden -- mit \`length()\` und \`charAt(i)\` arbeiten -- einen \`char\` von einem String unterscheiden und mit \`(int)\` und \`(char)\` den Zeichencode nutzen -- mit \`substring\` einen Teil aus einem Text schneiden -- \`indexOf\`, \`contains\`, \`toUpperCase\` und \`equals\` anwenden -- einen Text mit einer Schleife Zeichen für Zeichen durchgehen -- einen Text mit \`split\` in ein String-Array zerlegen -- in Java einen Text einlesen und mit \`equals\` vergleichen -- weitere Methoden wie \`lastIndexOf\`, \`replace\`, \`compareTo\` und \`Integer.parseInt\` anwenden -- einen Text aus einer Datei mit \`split("\\n")\` in Zeilen zerlegen -- eine Methode in der Java-API nachschlagen und ihre Beschreibung lesen -::: - -## Text ist eine Reihe von Zeichen - -Einen \`String\` kennst du schon: \`String name = "Ludwig"\`. In der Informatik heißt so ein Text auch **Zeichenkette**, weil die Zeichen wie Perlen an einer Kette hintereinander hängen. Jedes Zeichen hat einen Platz mit einem Index, genau wie bei einem Array. Auch hier wird **ab 0 gezählt**: Das erste Zeichen ist 0 Schritte vom Anfang entfernt. - -::: grafik zk-zeichen.svg -Die acht Zeichen von „Geißbock“ mit ihren Indizes 0 bis 7. -::: - -Ein String bringt **Methoden** mit. Du schreibst den Namen der Variablen, einen Punkt und die Methode: - -- \`wort.length()\` liefert die Anzahl der Zeichen, hier 8. -- \`wort.charAt(0)\` liefert das Zeichen mit dem Index 0, hier \`'G'\`. - -> Bei Strings schreibst du \`length()\` **mit** Klammern, bei Arrays \`length\` **ohne**. Das ist in Java leider so. - -Das letzte Zeichen hat wie beim Array den Index \`length() - 1\`. - -## Ein einzelnes Zeichen: char - -Für ein einzelnes Zeichen hat Java einen eigenen Datentyp: **char**, kurz für englisch *character* (Zeichen). Ein \`char\` steht in **einfachen** Anführungszeichen, ein String in doppelten: - -- \`'C'\` ist ein \`char\`: genau ein Zeichen. -- \`"C"\` ist ein String: ein Text, der nur ein Zeichen lang ist. -- Ein \`char\` hat immer genau ein Zeichen. Einen leeren \`char\` wie \`''\` gibt es nicht, einen leeren String \`""\` schon. - -\`charAt\` liefert dir so ein Zeichen aus einem Text: - -\`\`\` -char erster = wort.charAt(0) -char letzter = wort.charAt(wort.length() - 1) -\`\`\` - -Zwei \`char\` vergleichst du mit \`==\`: \`wort.charAt(0) == 'G'\` ist \`true\`. - -Hinter jedem Zeichen steckt eine Zahl, sein **Zeichencode**. Welche Zahl zu welchem Zeichen gehört, steht in der ASCII-Tabelle: \`'A'\` hat den Code 65, \`'B'\` 66, \`'C'\` 67 und so weiter bis \`'Z'\` mit 90. Mit \`(int)\` bekommst du den Code eines Zeichens, mit \`(char)\` wird aus einem Code wieder ein Zeichen: - -\`\`\` -int code = (int) 'C' -code = code + 1 -char naechstes = (char) code -\`\`\` - -Danach ist \`code\` 68 und \`naechstes\` ist \`'D'\`. So verschiebst du einen Buchstaben im Alphabet, und genau das brauchst du später bei der Caesar-Verschlüsselung. - -## Teile herausschneiden - -Mit \`substring\` schneidest du einen Teil aus dem Text: - -- \`wort.substring(0, 4)\` liefert die Zeichen von Index 0 **bis vor** Index 4, also \`"Geiß"\`. -- \`wort.substring(4)\` liefert alles ab Index 4 bis zum Ende, also \`"bock"\`. - -Das Ende gehört **nicht** mehr dazu. Praktisch ist: \`substring(0, 4)\` liefert genau 4 Zeichen. - -::: diagramm zk-zeichen.visustruct -Alle Methoden aus dieser Lektion an einem Beispiel. Gehe es in der Simulation durch und vergleiche jede Ausgabe mit der Grafik. -::: - -## Suchen und vergleichen - -Weitere Methoden, die du oft brauchst: - -| Methode | Bedeutung | Beispiel mit \`"Geißbock"\` | -|---|---|---| -| \`indexOf("bock")\` | Wo beginnt der Text? | 4 | -| \`indexOf("x")\` | nicht gefunden | -1 | -| \`contains("eiß")\` | Kommt der Text vor? | true | -| \`toUpperCase()\` | alles groß | GEISSBOCK | -| \`toLowerCase()\` | alles klein | geißbock | -| \`equals("Geißbock")\` | gleicher Text? | true | - -> Zwei Strings vergleichst du in Java mit \`equals\`, nicht mit \`==\`. Zwei einzelne Zeichen (\`char\`) vergleichst du dagegen mit \`==\`, z. B. \`wort.charAt(i) == 'e'\`. - -::: angeberwissen -Probier mal \`"Geißbock".toUpperCase()\` aus. Heraus kommt GEISSBOCK, und das Wort ist plötzlich ein Zeichen **länger**! Ein großes ß gab es auf Schreibmaschinen nie, darum wird es zu SS. Erst seit 2017 ist das große ẞ offiziell erlaubt, aber Java bleibt beim SS. In meinem Namen kommt zum Glück kein ß vor, nur im Wort Geißbock. -::: - -## Zeichen für Zeichen - -Mit einer For-Schleife gehst du einen Text Zeichen für Zeichen durch. Der Index \`i\` läuft von 0 bis \`wort.length() - 1\`, genau wie bei einem Array: - -::: diagramm zk-zaehlen.visustruct -Zählt, wie oft der Buchstabe e vorkommt. Probiere in der Simulation „Kaffeebecher“ aus und beobachte i und anzahl. -::: - -## Zerlegen mit split - -Oft stehen mehrere Angaben in einer einzigen Zeile, getrennt durch ein Zeichen, z. B. \`"Ludwig;Geißbock;7"\`. Mit \`split\` zerlegst du die Zeile an diesem Zeichen. Heraus kommt ein **String-Array**: - -\`\`\` -String[] teile = zeile.split(";") -\`\`\` - -Danach ist \`teile[0]\` gleich \`"Ludwig"\`, \`teile[1]\` gleich \`"Geißbock"\` und \`teile[2]\` gleich \`"7"\`. Mit \`teile.length\` erfährst du, wie viele Teile es sind. - -::: diagramm zk-split.visustruct -Die Zeile wird am Semikolon zerlegt und jeder Teil mit seinem Index ausgegeben. -::: - -> So sind auch CSV-Dateien aufgebaut, die du aus Tabellenkalkulationen kennst: eine Zeile pro Datensatz, die Werte durch Semikolon getrennt. - -## Übung: Initialen - -::: übung zk-initialen -titel: Initialen -auftrag: Frage nach Vorname und Nachname und gib die Initialen aus. Bei Ludwig Geißbock also \`L. G.\` -test: Ludwig, Geißbock -> L. G. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: Die Initiale ist der erste Buchstabe eines Namens. Welche Methode liefert ein Zeichen an einer bestimmten Stelle? -tipp: Den ersten Buchstaben liefert \`vorname.charAt(0)\`. Die Ausgabe ist dann \`vorname.charAt(0) + ". " + nachname.charAt(0) + "."\` -lösung: zk-initialen-loesung.visustruct -::: - -## Übung: Rückwärts - -::: übung zk-rueckwaerts -titel: Rückwärts -auftrag: Frage nach einem Wort und gib es rückwärts aus. Aus Ludwig wird \`giwduL\`. -test: Ludwig -> giwduL -test: Anna -> annA -test: a -> a -braucht: forSchleife -tipp: Gehe das Wort Zeichen für Zeichen durch, aber von hinten nach vorn, und baue dabei einen neuen Text zusammen. -tipp: Lege \`String rueckwaerts = ""\` an. Die Schleife beginnt beim letzten Index \`wort.length() - 1\` und zählt mit \`i--\` bis 0 herunter. In jedem Durchlauf hängst du \`wort.charAt(i)\` hinten an. -tipp: Das Gerüst: Eingabe \`wort\`, dann \`String rueckwaerts = ""\`. For-Schleife mit Start \`int i = wort.length() - 1\`, Bedingung \`i >= 0\` und Schritt \`i--\`. Darin \`rueckwaerts = rueckwaerts + wort.charAt(i)\`. Unter der Schleife \`output: rueckwaerts\`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Übung: Wörter zählen - -::: übung zk-woerter -titel: Wörter zählen -auftrag: Frage nach einem Satz und gib aus, wie viele Wörter er hat, z. B. \`Wörter: 4\` bei „Ludwig ist ein Geißbock“. Die Wörter sind durch genau ein Leerzeichen getrennt. -test: Ludwig ist ein Geißbock -> Wörter: 4 -test: Hallo -> Wörter: 1 -test: Struktogramme machen Spaß -> Wörter: 3 -braucht: anweisung -tipp: Zwischen den Wörtern steht immer ein Leerzeichen. Welche Methode zerlegt einen Text an einem Zeichen? -tipp: Zerlege den Satz mit \`satz.split(" ")\` in ein String-Array. Seine Länge ist die Anzahl der Wörter. -tipp: Das ganze Programm hat drei Kästen: die Eingabe \`satz\`, dann \`String[] woerter = satz.split(" ")\` und zum Schluss \`output: "Wörter: " + woerter.length\`. -lösung: zk-woerter-loesung.visustruct -::: - -## Jetzt in Java - -Die Methoden in dieser Lektion sind schon Java. Ein ganzes Programm mit einem Text sieht so aus: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Wie heißt du?"); -String name = scanner.next(); -System.out.println("Hallo " + name.toUpperCase() + "!"); -System.out.println("Dein Name hat " + name.length() + " Buchstaben."); -\`\`\` - -- \`scanner.next()\` liest ein Wort, also Text bis zum nächsten Leerzeichen. Für Zahlen nimmst du weiter \`scanner.nextInt()\`. -- Text steht in **doppelten** Anführungszeichen \`"Ludwig"\`, ein einzelnes Zeichen in **einfachen** \`'L'\`. -- Hinter \`length()\`, \`toUpperCase()\` und den anderen Methoden stehen immer runde Klammern, auch wenn nichts darin steht. -- Zwei Texte vergleichst du mit \`equals\`. Dabei zählt jeder Buchstabe: \`"Ludwig".equals("ludwig")\` ist false. - -::: übung l17-java-passwort -titel: Passwort prüfen -code: java -auftrag: Schreibe in Java ein Programm, das nach dem Passwort fragt. Ist es **Ludwig**, gibt es **Willkommen!** aus, sonst **Falsches Passwort**. - Achte auf Groß- und Kleinschreibung: \`ludwig\` ist falsch. -test: Ludwig -> Willkommen! -test: ludwig -> Falsches Passwort -test: Geißbock -> Falsches Passwort -braucht: verzweigung -tipp: Lies das Passwort mit \`scanner.next()\` in eine String-Variable. Dann vergleichst du in einer Verzweigung. -tipp: Die Bedingung heißt \`eingabe.equals("Ludwig")\`. Mit \`==\` klappt der Vergleich von Texten in Java nicht zuverlässig. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Lückentext: Texte - -::: lückentext -titel: Ein Wort untersuchen -auftrag: Ergänze die fehlenden Methoden und Wörter. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Ein Wort?"); -[[String]] wort = scanner.next(); -System.out.println("Länge: " + wort.[[length]]()); -System.out.println("Groß: " + wort.[[toUpperCase]]()); -System.out.println("Erster Buchstabe: " + wort.[[charAt]](0)); -if (wort.[[equals]]("Ludwig")) { - System.out.println("Hallo Ludwig!"); -} -\`\`\` -erklärung: \`length()\` zählt die Zeichen, \`toUpperCase()\` macht alles groß, \`charAt(0)\` liefert das erste Zeichen. Texte vergleichst du mit \`equals\`, nicht mit \`==\`. -::: - -## Fehler finden: Initialen - -::: übung l17-java-fehler -titel: Initialen reparieren -code: java -auftrag: Das Programm liest Vor- und Nachnamen ein und soll die Initialen ausgeben. Bei Ludwig Geißbock also **L. G.** Es gibt aber **u. e.** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: Bei welchem Index beginnt Java zu zählen? -tipp: Das erste Zeichen hat den Index 0: \`vorname.charAt(0)\` und \`nachname.charAt(0)\`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l17-java-laeuft-nicht -titel: Buchstaben zählen -code: java -auftrag: Das Programm soll den ersten Buchstaben und die Länge von **Ludwig** ausgeben, also **L hat 6 Buchstaben**. Es läuft aber nicht, denn zwei Methoden sind falsch geschrieben. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L hat 6 Buchstaben -braucht: anweisung -tipp: Methodennamen sind auch CamelCase: Sie beginnen klein, jedes weitere Wort beginnt groß. -tipp: Richtig sind \`name.charAt(0)\` mit großem A und \`name.length()\` ganz klein. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Noch mehr Methoden - -Ein String kann noch viel mehr. Diese Methoden brauchst du auch oft: - -| Methode | Bedeutung | Beispiel | Ergebnis | -|---|---|---|---| -| \`lastIndexOf("e")\` | Wo steht das letzte e? | \`"Ziegenbock".lastIndexOf("e")\` | 4 | -| \`isEmpty()\` | Ist der Text leer? | \`"".isEmpty()\` | true | -| \`equalsIgnoreCase(…)\` | gleicher Text, egal ob groß oder klein? | \`"Ziegenbock".equalsIgnoreCase("ZIEGENBOCK")\` | true | -| \`replace(alt, neu)\` | ersetzt jede Stelle | \`"Ziegenbock".replace("bock", "käse")\` | Ziegenkäse | -| \`repeat(n)\` | den Text n-mal hintereinander | \`"Mäh".repeat(3)\` | MähMähMäh | -| \`concat(…)\` | hängt Text an, wie \`+\` | \`"Ziegen".concat("bock")\` | Ziegenbock | -| \`compareTo(…)\` | Wer kommt im Alphabet zuerst? | \`"Anna".compareTo("Ben")\` | -1 | - -\`compareTo\` liefert eine Zahl: **negativ**, wenn der Text im Alphabet vorher kommt, **0**, wenn beide gleich sind, und **positiv**, wenn er danach kommt. Damit kannst du Namen sortieren. - -Zwei Methoden gehören nicht zu einem Text, sondern zu einer Klasse. Davor steht deshalb der Name der Klasse: - -- \`Integer.parseInt("7")\` macht aus dem Text "7" die Zahl 7. Mit ihr kannst du rechnen. -- \`String.valueOf(7)\` macht aus der Zahl 7 den Text "7". - -::: diagramm zk-mehr.visustruct -Alle neuen Methoden an einem Beispiel. Gehe es in der Simulation durch und vergleiche jede Ausgabe mit der Tabelle. -::: - -## Text aus einer Datei - -Programme bekommen Text oft aus einer **Datei**. Prinzessin Zora hat Ludwig einen Brief geschrieben. Er liegt als Datei \`brief.txt\` bereit: - -::: datei brief.txt -Lieber Ludwig, -der Fuchs hat mich in seinen Turm gesperrt. -Die Tür hat ein Schloss mit einem geheimen Wort. -Das Wort findest du nur mit Java. -Bitte hilf mir! -Deine Prinzessin Zora -::: - -Diese Zeilen lesen die ganze Datei in einen String: - -\`\`\` -import java.nio.file.*; - -String brief = Files.readString(Path.of("brief.txt")); -\`\`\` - -Wie das Lesen genau funktioniert, lernst du später in einer eigenen Lektion über Dateien. Hier reicht: Danach steht der ganze Brief in \`brief\`, mit allen Zeilen. - -Am Ende jeder Zeile steht ein unsichtbares Zeichen für den **Zeilenumbruch**. In Java schreibst du es als \`"\\n"\`. Mit \`brief.split("\\n")\` zerlegst du den Brief deshalb in seine Zeilen. - -::: übung l17-java-brief -titel: Wo steckt der Fuchs? -code: java -auftrag: Im Startcode wird der Brief schon gelesen. Zerlege ihn in Zeilen und gib **Zeilen:** und die Anzahl aus. Suche dann die Zeile, in der **Fuchs** steht, und gib **Fuchs in Zeile** und ihre Nummer aus. Die erste Zeile hat die Nummer 1. -start: l17-java-brief-start.visustruct -test: - -> Zeilen: 6 | Fuchs in Zeile 2 -braucht: forSchleife, verzweigung -tipp: \`String[] zeilen = brief.split("\\n");\` zerlegt den Brief. Mit einer For-Schleife gehst du dann alle Zeilen durch. -tipp: In der Schleife prüfst du \`zeilen[i].contains("Fuchs")\`. Der Index beginnt bei 0, deshalb gibst du \`(i + 1)\` aus. Die Klammern brauchst du, damit Java rechnet und nicht 1 an den Text hängt. -lösung: l17-java-brief-loesung.visustruct -::: - -## Die Java-API - -Niemand kennt alle Methoden auswendig, auch Profis nicht. Sie schlagen nach, in der **Java-API**. API heißt Application Programming Interface. Gemeint ist die Beschreibung von allem, was Java schon mitbringt. - -Alle Methoden von String findest du hier: [String in der Java-API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Scrolle dort zur Tabelle **Method Summary**. Jede Zeile beschreibt eine Methode: - -| Spalte | Beispiel | Bedeutung | -|---|---|---| -| Modifier and Type | \`int\` | Was die Methode zurückgibt | -| Method | \`lastIndexOf(String str)\` | Name und Parameter mit ihrem Datentyp | -| Description | Returns the index within this string of the last occurrence … | Was die Methode macht | - -Die API ist auf Englisch. Dein Browser kann die Seite übersetzen. Die Namen der Methoden bleiben englisch, denn so schreibst du sie auch in Java. - -::: ludwig -Die Seite ist sehr lang. Mit Strg+F (am Mac ⌘+F) suchst du nach dem Namen der Methode und bist sofort da. -::: - -Schlag diese Methoden nach. Sie stehen nicht in dieser Lektion: - -::: quiz -? Schlag \`strip()\` nach. Was macht die Methode? -- [ ] Sie entfernt alle Leerzeichen im Text. -- [x] Sie entfernt die Leerzeichen am Anfang und am Ende. -- [ ] Sie schneidet das letzte Zeichen ab. -> Wie \`trim()\`. \`strip()\` kennt aber auch besondere Leerzeichen aus anderen Schriften. - -? Schlag \`isBlank()\` nach. Was liefert \`" ".isBlank()\`? -- [x] true -- [ ] false -- [ ] 3 -> isBlank prüft, ob der Text leer ist oder nur aus Leerzeichen besteht. \`" ".isEmpty()\` wäre dagegen false. - -? Schlag \`toCharArray()\` nach. Welchen Datentyp liefert die Methode? -- [ ] String -- [ ] String[] -- [x] char[] -> Ein Array mit allen Zeichen des Textes, für jedes Zeichen ein Fach. - -? Schlag \`indexOf\` mit zwei Parametern nach. Was liefert \`"Ziegenbock".indexOf("e", 3)\`? -- [ ] 2 -- [x] 4 -- [ ] -1 -> Die Suche beginnt erst bei Index 3. Das erste e ab dort steht bei Index 4. - -? Schlag \`startsWith\` nach. Welchen Datentyp liefert die Methode? -- [x] boolean -- [ ] int -- [ ] String -> In der Spalte „Modifier and Type“ steht boolean: Die Antwort ist true oder false. -::: - -## Spiel: Prinzessin retten - -Jetzt hilfst du Ludwig. Der Fuchs hat Prinzessin Zora in seinen Turm gesperrt, und das Tor öffnet sich nur mit einem geheimen Wort. - -::: spiel prinzessin -titel: Spiel: Prinzessin retten -intro: Auf dem Weg zum Turm kommt Ludwig an **sechs Stationen**. An jeder steht ein Stück Java-Code, und heraus kommt eine Zahl. Mit \`alphabet.charAt(zahl)\` wird aus der Zahl ein Buchstabe, der im **Kreuzworträtsel** landet. Löst du das Rätsel, ergeben die gelben Felder das geheime Wort für das Tor. - -station: Am Burggraben - String name = " Zora "; - int zahl = name.trim().length(); -frage: Welche Zahl steht in \`zahl\`? -zahl: 4 -feld: 5 1 -tipp: \`trim()\` schneidet die Leerzeichen vorne und hinten ab. Zähle danach die Zeichen. -> Nach \`trim()\` bleibt \`"Zora"\` übrig, und das sind 4 Zeichen. - -station: Im Fuchswald - String ort = "Fuchsbau"; - int zahl = ort.length(); -frage: Welche Zahl steht in \`zahl\`? -zahl: 8 -feld: 4 4 -tipp: \`length()\` zählt alle Zeichen. Zähle F-u-c-h-s-b-a-u. -> „Fuchsbau“ hat 8 Zeichen. - -station: Am Ziegenfelsen - String wort = "Ziegenbock"; - int zahl = wort.indexOf("bock"); -frage: Welche Zahl steht in \`zahl\`? -zahl: 6 -feld: 4 6 -tipp: \`indexOf\` gibt die Stelle zurück, an der „bock“ anfängt. Das Z hat den Index 0. -> Z i e g e n hat die Indizes 0 bis 5, also beginnt „bock“ bei Index 6. - -station: Auf der Turmtreppe - String wort = "Prinzessin"; - int zahl = wort.indexOf("s", 7); -frage: Welche Zahl steht in \`zahl\`? Schlag \`indexOf(String str, int fromIndex)\` in der Java-API nach. -zahl: 7 -feld: 6 6 -tipp: Die Suche beginnt bei Index 7, und Index 7 zählt schon mit. Schreib dir die Indizes unter die Buchstaben. -> P r i n z e s s i n hat die Indizes 0 bis 9. Ab Index 7 gesucht, steht das erste „s“ genau bei 7. - -station: Vor der Fuchshöhle - int zahl = "Zora".compareTo("Zoe"); -frage: Welche Zahl steht in \`zahl\`? -zahl: 13 -feld: 1 9 -tipp: \`compareTo\` sucht die erste Stelle, an der sich die Texte unterscheiden, und rechnet die Differenz der Zeichencodes aus. \`'r'\` ist 114, \`'e'\` ist 101. -> „Zo“ ist gleich, dann kommt \`'r'\` gegen \`'e'\`: 114 − 101 = 13. - -station: Am Turmtor - int zahl = Integer.parseInt("1" + "1") / 5; -frage: Welche Zahl steht in \`zahl\`? -zahl: 2 -feld: 6 5 -tipp: Zuerst werden die Texte verbunden, dann wird daraus eine Zahl. Bei \`int\` wird beim Teilen der Rest weggelassen. -> \`"1" + "1"\` ist \`"11"\`, \`parseInt\` macht daraus 11, und 11 / 5 ist bei ganzen Zahlen 2. - -kreuzwort: Die blauen Buchstaben hast du schon. Fülle die anderen Felder mit Fachbegriffen aus Java. Klick auf einen Hinweis, um zum Wort zu springen. -- → 1 3 BOOLEAN: Datentyp für wahr oder falsch -- → 4 1 STRING: Datentyp für Text, also für eine Zeichenkette -- → 6 5 CHAR: Datentyp für ein einzelnes Zeichen -- ↓ 1 6 LENGTH: Methode, die die Zeichen eines Strings zählt -- ↓ 2 1 ELSE: Der „sonst“-Teil einer Verzweigung -- ↓ 3 3 BREAK: Springt sofort aus einer Schleife heraus -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: Ludwig steht vor dem Tor. Das Schloss vergleicht dein Wort mit \`equals\`. Trag das geheime Wort ein. - String wort = "___"; - if (wort.equals(geheimesWort)) { - tor.oeffnen(); - } -ende: Zora ist frei, und der Fuchs ist schnell davongelaufen. Das geheime Wort war \`BREAK\`: Mit \`break\` kommt man aus jeder Schleife heraus, und Zora aus dem Turm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass auch die Zeichen eines Strings ab 0 gezählt werden. → Text ist eine Reihe von Zeichen -- Ich kann mit \`length()\` und \`charAt(i)\` arbeiten. → Text ist eine Reihe von Zeichen -- Ich kann einen \`char\` von einem String unterscheiden und mit \`(int)\` und \`(char)\` den Zeichencode nutzen. → Ein einzelnes Zeichen: char -- Ich kann mit \`substring\` einen Teil aus einem Text schneiden. → Teile herausschneiden -- Ich kann \`indexOf\`, \`contains\`, \`toUpperCase\` und \`equals\` anwenden. → Suchen und vergleichen -- Ich kann einen Text mit einer Schleife Zeichen für Zeichen durchgehen. → Zeichen für Zeichen -- Ich kann einen Text mit \`split\` in ein String-Array zerlegen. → Zerlegen mit split -- Ich kann in Java einen Text einlesen und mit \`equals\` vergleichen. → Jetzt in Java -- Ich kann weitere Methoden wie \`lastIndexOf\`, \`replace\`, \`compareTo\` und \`Integer.parseInt\` anwenden. → Noch mehr Methoden -- Ich kann einen Text aus einer Datei mit \`split("\\n")\` in Zeilen zerlegen. → Text aus einer Datei -- Ich kann eine Methode in der Java-API nachschlagen und ihre Beschreibung lesen. → Die Java-API -::: - -## Wissenstest - -::: quiz -? Was liefert \`"Ludwig".charAt(1)\`? -→ Text ist eine Reihe von Zeichen -- [ ] L -- [x] u -- [ ] d -> Gezählt wird ab 0: L hat den Index 0, u den Index 1. - -? Was ist \`'C'\`? -→ Ein einzelnes Zeichen: char -- [x] ein \`char\`, also genau ein Zeichen -- [ ] ein String -- [ ] eine Variable mit dem Namen C -> Einfache Anführungszeichen stehen für ein einzelnes Zeichen, also einen \`char\`. \`"C"\` in doppelten wäre ein String. - -? \`'A'\` hat den Zeichencode 65. Was ergibt \`(char) 67\`? -→ Ein einzelnes Zeichen: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 ist A, 66 ist B, 67 ist C. Mit \`(char)\` wird aus dem Code wieder ein Zeichen. - -? Was liefert \`"Struktogramm".substring(0, 6)\`? -→ Teile herausschneiden -- [x] Strukt -- [ ] Struktog -- [ ] truktog -> Die Zeichen mit den Indizes 0 bis 5. Das Ende 6 gehört nicht mehr dazu. - -? Ein Wort hat 7 Zeichen. Welchen Index hat das letzte Zeichen? -→ Text ist eine Reihe von Zeichen -- [ ] 7 -- [x] 6 -- [ ] 8 -> Wie beim Array: immer eins weniger als die Länge. - -? Wie vergleichst du in Java zwei Strings auf gleichen Inhalt? -→ Suchen und vergleichen -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Ordne jeder Methode zu, was sie bei \`"Geißbock"\` liefert. -→ Suchen und vergleichen -= length() -> 8 -= charAt(0) -> G -= indexOf("bock") -> 4 -= substring(4) -> bock - -? Welche Bedingung prüft in Java, ob in \`eingabe\` der Text Ludwig steht? -→ Jetzt in Java -- [ ] eingabe = "Ludwig" -- [ ] eingabe == 'Ludwig' -- [x] eingabe.equals("Ludwig") -> Texte vergleichst du mit equals. Einfache Anführungszeichen sind nur für ein einzelnes Zeichen. - -? Was liefert \`Integer.parseInt("12") + 1\`? -→ Noch mehr Methoden -- [ ] "121" -- [x] 13 -- [ ] eine Fehlermeldung -> parseInt macht aus dem Text eine Zahl. Danach rechnet Java ganz normal. -::: -`,sw=`--- -titel: Aufruf und Aussprung -bereich: Grundlagen -kurz: Große Aufgaben in Unterprogramme zerlegen und Schleifen vorzeitig verlassen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine große Aufgabe in Teilprobleme zerlegen -- einen Aufruf einfügen und ein Unterprogramm in einem eigenen Reiter bauen -- einem Unterprogramm mit Parametern Werte übergeben -- mit return einen Rückgabewert liefern und ihn beim Aufruf speichern -- erklären, warum ein Unterprogramm eine Zahl nicht verändern kann, ein Array aber schon -- erklären, was ein Aussprung macht und warum er in einer Verzweigung steht -- eine Schleife mit einem Aussprung oder über ihre Bedingung beenden -- in Java eine Methode erkennen und eine Schleife mit \`break\` verlassen -::: - -## Große Aufgaben zerlegen - -Lange Struktogramme werden schnell unübersichtlich. Deshalb zerlegst du eine große Aufgabe in **Teilprobleme**. Jedes Teilproblem bekommt einen eigenen Namen und ein eigenes Struktogramm, ein **Unterprogramm**. - -Ein Quiz besteht zum Beispiel aus drei Teilen: begrüßen, Fragen stellen, Ergebnis zeigen. Das Hauptprogramm nennt nur noch diese drei Teile: - -::: diagramm l15-hauptprogramm.visustruct -Das Hauptprogramm besteht nur aus drei Aufrufen. Was in jedem Teil passiert, steht in einem eigenen Struktogramm. -::: - -So siehst du auf einen Blick, wie das Programm aufgebaut ist. Die Einzelheiten stehen woanders. - -## Der Aufruf - -Ein **Aufruf** ist ein Kasten mit doppelten senkrechten Linien links und rechts. Er bedeutet: Führe hier das Unterprogramm mit diesem Namen aus und mache danach weiter. - -- Du ziehst **Aufruf** aus dem Bereich Elemente und schreibst den Namen hinein, z. B. \`zeigeBegruessung()\`. -- Die runden Klammern am Ende zeigen, dass es ein Unterprogramm ist. So schreibt man es auch in Java, Python und JavaScript. -- Das Unterprogramm selbst baust du als eigenes Struktogramm in einem neuen Reiter. Als Titel trägst du denselben Namen ein. - -::: diagramm l15-unterprogramm.visustruct -Das Unterprogramm zeigeBegruessung() als eigenes Struktogramm. -::: - -> **In der Simulation:** Erreicht die Simulation einen Aufruf, sucht sie unter den offenen Reitern das Struktogramm mit diesem Titel und führt es aus. Danach macht sie im Hauptprogramm weiter. Solange das Unterprogramm läuft, bleibt der Aufruf-Kasten markiert. Ein Unterprogramm wie dieses, nur mit Namen als Titel, teilt sich die Variablen mit dem Hauptprogramm. Wie ein Unterprogramm eigene Variablen bekommt, lernst du gleich. Gibt es keinen passenden Reiter, überspringt die Simulation den Aufruf und zeigt einen Hinweis. - -::: angeberwissen -Warum sagt dein Lehrer bei Java immer „Methode“ und nie „Funktion“ oder „Prozedur“? Weil in Java jedes Unterprogramm zu einer Klasse gehören muss, und Unterprogramme einer Klasse heißen Methoden. Den Unterschied gibt es trotzdem: Liefert eine Methode ein Ergebnis zurück, ist sie eigentlich eine Funktion. Steht \`void\` davor, liefert sie nichts und ist eigentlich eine Prozedur. Java ist da einfach bequem und nennt beide Methode. Ich auch: Meine Methode heißt Fressen. -::: - -## Übung: Aufruf einbauen - -::: übung l15-titel -titel: Begrüßung mit Aufruf -auftrag: Stell dir vor, das Unterprogramm \`zeigeTitel()\` gibt es schon. Baue das Hauptprogramm: Es ruft zuerst \`zeigeTitel()\` auf. Danach fragt es nach dem Namen und gibt **Hallo** und den Namen aus. - Bei der Eingabe Ada erscheint also **Hallo Ada**. -test: Ada -> Hallo Ada -test: Ben -> Hallo Ben -braucht: aufruf -tipp: Das Hauptprogramm hat drei Teile: den Aufruf, die Eingabe und die Ausgabe. -tipp: Ziehe einen Aufruf aus dem Bereich Elemente ganz nach oben und schreibe \`zeigeTitel()\` hinein. Darunter kommen die Eingabe \`input: String name "Wie heißt du?"\` und die Ausgabe. -lösung: l15-titel-loesung.visustruct -::: - -## Werte übergeben: Parameter - -Oft soll ein Unterprogramm mit Werten arbeiten, die erst beim Aufruf feststehen. Dann bekommt es als Titel eine **Kopfzeile**: - -\`\`\` -void zeigeSumme(int a, int b) -\`\`\` - -- \`void\` heißt: Das Unterprogramm liefert kein Ergebnis zurück. -- \`zeigeSumme\` ist der Name. -- In den Klammern stehen die **Parameter**: Variablen mit Datentyp, die beim Aufruf ihre Werte bekommen. Mehrere trennst du mit Komma. - -::: diagramm l15-zeige-summe.visustruct -Das Unterprogramm mit der Kopfzeile als Titel. Es rechnet mit a und b, als wären es normale Variablen. -::: - -Im Aufruf-Kasten schreibst du die Werte in die Klammern, z. B. \`zeigeSumme(3, 4)\`. Der erste Wert kommt in \`a\`, der zweite in \`b\`. Statt Zahlen gehen auch Variablen und Rechnungen wie \`zeigeSumme(x, x + 1)\`. - -::: diagramm l15-zeige-summe-haupt.visustruct -Das Hauptprogramm ruft zeigeSumme zweimal mit anderen Werten auf. Öffne beide Diagramme und starte hier die Simulation. -::: - -> **Lokale Variablen:** Die Parameter und alle Variablen, die im Unterprogramm entstehen, gehören nur dem Unterprogramm. Es bekommt **Kopien** der Werte, mehr dazu weiter unten bei der Wertübergabe (call by value). In der Simulation siehst du während des Aufrufs nur die Variablen des Unterprogramms. - -## Ergebnis zurückgeben: return - -Ein Unterprogramm kann auch ein Ergebnis liefern, den **Rückgabewert**. Dann steht in der Kopfzeile statt \`void\` der Datentyp des Ergebnisses: - -\`\`\` -int quadrat(int x) -\`\`\` - -Die Anweisung \`return ergebnis\` gibt den Wert zurück und beendet das Unterprogramm sofort. Beim Aufruf speicherst du das Ergebnis in einer Variablen: Nach \`int q = quadrat(5)\` steht in \`q\` der Wert 25. - -::: diagramm l15-quadrat.visustruct -Das Unterprogramm quadrat rechnet und gibt das Ergebnis mit return zurück. -::: - -::: diagramm l15-quadrat-haupt.visustruct -Das Hauptprogramm speichert den Rückgabewert in q. Öffne beide Diagramme und probiere die Simulation aus. -::: - -> Ein Unterprogramm mit Rückgabewert muss mit \`return\` enden. Fehlt das return, meldet die Simulation einen Fehler. - -In der **Code-Ansicht** wird aus der Kopfzeile eine Java-Methode (\`public static int quadrat(int x)\`), in Python ein \`def\` und in JavaScript eine \`function\`. Sind die Unterprogramme in anderen Reitern offen, stehen sie beim Hauptprogramm mit im Code. - -## Übung: Fläche berechnen - -::: übung l15-flaeche -titel: Fläche berechnen -auftrag: Baue zwei Diagramme. Das Unterprogramm \`int flaeche(int a, int b)\` gibt die Fläche eines Rechtecks zurück, also a mal b. Das Hauptprogramm fragt nach Länge und Breite, ruft \`flaeche\` auf und gibt **Fläche:** und das Ergebnis aus. - Bei 3 und 4 erscheint **Fläche: 12**. -test: 3, 4 -> Fläche: 12 -test: 5, 5 -> Fläche: 25 -test: 7, 0 -> Fläche: 0 -braucht: aufruf -tipp: Du baust zwei Diagramme: ein Unterprogramm, das nur rechnet und das Ergebnis zurückgibt, und ein Hauptprogramm für Eingabe und Ausgabe. -tipp: Lege mit **+** einen neuen Reiter an und gib ihm den Titel \`int flaeche(int a, int b)\`. Darin reicht eine Anweisung: \`return a * b\`. Im Hauptprogramm schreibst du in den Aufruf-Kasten \`int f = flaeche(laenge, breite)\`. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Kopie oder Original: call by value und call by reference - -Was passiert, wenn ein Unterprogramm seinen Parameter verändert? Das hängt davon ab, **was** übergeben wird. - -**Wertübergabe**, englisch **call by value**: Bei \`int\`, \`double\`, \`boolean\`, \`char\` und \`String\` bekommt das Unterprogramm eine **Kopie** des Werts. Ändert es seinen Parameter, bleibt die Variable des Aufrufers, wie sie war. - -**Referenzübergabe**, englisch **call by reference**: Bei einem **Array** bekommt das Unterprogramm keine Kopie, sondern einen Verweis auf dasselbe Array. Ändert es ein Fach, ist das Fach auch beim Aufrufer geändert. Die Kopfzeile dafür sieht so aus: - -\`\`\` -void leeren(boolean[] plaetze) -\`\`\` - -::: grafik uebergabe.svg -Oben bekommt verdopple eine Kopie von zahl. Unten zeigen reihe und plaetze auf dasselbe Array. -::: - -Probiere beides aus. Öffne die drei Diagramme und starte im Hauptprogramm die Simulation: - -::: diagramm uebergabe-verdopple.visustruct -verdopple ändert nur seine Kopie x. -::: - -::: diagramm uebergabe-leeren.visustruct -leeren setzt alle Plätze auf false, zum Beispiel wenn eine Vorstellung ausfällt. -::: - -::: diagramm uebergabe-haupt.visustruct -zahl ist nach dem Aufruf immer noch 5. Die Plätze in reihe sind nach dem Aufruf dagegen frei. -::: - -> Willst du mit einer Zahl aus einem Unterprogramm etwas zurückbekommen, nimmst du \`return\`, z. B. \`zahl = verdopple(zahl)\` mit der Kopfzeile \`int verdopple(int x)\`. Ein Array dagegen kann das Unterprogramm direkt verändern. - -::: angeberwissen -Ganz genau genommen kennt Java nur die Wertübergabe, also call by value. Bei einem Array wird aber nicht das ganze Array kopiert, sondern nur seine **Adresse** im Speicher. Mit der kopierten Adresse findet das Unterprogramm dasselbe Array. Das ist so, als würde ich dir eine Kopie meines Schließfachschlüssels geben: Der Schlüssel ist kopiert, das Heu im Fach gibt es nur einmal. -::: - -## Übung: Bonuspunkte - -::: übung uebergabe-bonus -titel: Bonuspunkte -auftrag: Das Hauptprogramm ruft \`bonus(punkte)\` auf und gibt danach alle Punkte aus. Baue das Unterprogramm \`void bonus(int[] punkte)\`, das jede Punktzahl im Array um 1 erhöht. Statt 3, 5 und 8 erscheinen dann **4**, **6** und **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: Das Hauptprogramm ist schon fertig. Du baust nur das Unterprogramm in einem neuen Reiter. -tipp: Lege mit **+** einen neuen Reiter mit dem Titel \`void bonus(int[] punkte)\` an. Darin läuft eine For-Schleife über alle Fächer und rechnet \`punkte[i] = punkte[i] + 1\`. Ein return brauchst du nicht, denn das Array wird direkt geändert. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## Der Aussprung - -Manchmal soll eine Schleife **vorzeitig** enden, mitten im Rumpf. Dafür gibt es den **Aussprung**. Er verlässt sofort die Schleife, in der er steht. Das Programm macht mit dem ersten Kasten nach der Schleife weiter. In Java, Python und JavaScript heißt das \`break\`. - -Den Aussprung erkennst du an der Spitze am linken Rand. In den Kasten kannst du einen kurzen Kommentar schreiben, z. B. \`Schleife verlassen\`. Er erscheint im Code als Kommentar hinter \`break\`. - -Ein Aussprung steht fast immer in einer **Verzweigung**: Nur wenn eine Bedingung zutrifft, wird die Schleife verlassen. - -Typisch ist die **Endlosschleife mit Aussprung**. Die Schleife selbst hat keine Bedingung. Sie läuft so lange, bis der Aussprung erreicht wird: - -::: diagramm l15-endlos-aussprung.visustruct -Die Schleife fragt immer wieder nach einer Zahl. Bei 0 springt sie heraus, sonst zählt sie die Zahl zur Summe. -::: - -Ohne Aussprung würde eine Endlosschleife wirklich nie enden. - -## Aussprung in der Simulation - -Die Simulation führt den Aussprung aus wie \`break\`: Sie verlässt die innerste Schleife und macht nach ihr weiter. Steht ein Aussprung außerhalb jeder Schleife, endet das Unterprogramm, im Hauptprogramm das ganze Programm. Dasselbe macht \`return\`. - -Oft geht es auch ganz ohne Aussprung: Du schreibst die Abbruchbedingung direkt in die Schleife. Das ist meist sogar übersichtlicher. - -## Übung: Summe bis 0 - -::: übung l15-bis-null -titel: Summe bis 0 -auftrag: Baue das Programm „Summe bis 0“ **ohne** Aussprung nach. Es fragt so lange nach ganzen Zahlen, bis jemand 0 eingibt. Danach gibt es **Summe:** und die Summe aller eingegebenen Zahlen aus. -test: 3, 4, 0 -> Summe: 7 -test: 0 -> Summe: 0 -test: 10, -2, 5, 0 -> Summe: 13 -tipp: Ohne Aussprung muss die Bedingung der Schleife selbst prüfen, ob die 0 eingegeben wurde. -tipp: Frage die erste Zahl schon vor der Schleife ab. Die While-Schleife läuft mit der Bedingung \`zahl != 0\`. Im Rumpf zählst du die Zahl zur Summe und fragst danach die nächste Zahl ab. Bei der zweiten Eingabe schreibst du nur \`input: zahl "…"\`, weil es \`zahl\` schon gibt. -lösung: l15-bis-null-loesung.visustruct -::: - -## Jetzt in Java - -Ein Unterprogramm heißt in Java **Methode**. Das Quadrat von oben sieht so aus: - -\`\`\`java -public static int quadrat(int x) { - int ergebnis = x * x; - return ergebnis; -} -\`\`\` - -Das Hauptprogramm ruft die Methode mit ihrem Namen auf und gibt ihr den Wert in runden Klammern mit: - -\`\`\`java -int q = quadrat(zahl); -System.out.println("Das Quadrat ist " + q); -\`\`\` - -- In der Kopfzeile steht vor dem Namen, was die Methode zurückgibt (\`int\`). Gibt sie nichts zurück, steht dort \`void\`. -- Die Parameter stehen mit Datentyp in den runden Klammern: \`(int x)\`. Mehrere trennst du mit Komma. -- Im Bereich Code schreibst du jede Methode in einen eigenen Reiter, so wie jedes Unterprogramm ein eigenes Struktogramm hat. -- Der Aussprung heißt in Java \`break\`. Mit \`while (true)\` baust du eine Schleife, die nur durch \`break\` endet. - -::: übung l18-java-kasse -titel: Kasse mit break -code: java -auftrag: Schreibe in Java eine Kasse. Sie fragt immer wieder nach einem Preis in ganzen Euro. Bei 0 verlässt sie die Schleife mit \`break\`. Danach gibt sie aus, wie viele Artikel es waren und was alles zusammen kostet. - Bei 3, 4 und dann 0 erscheint **Artikel: 2** und **Gesamt: 7**. -test: 3, 4, 0 -> Artikel: 2 | Gesamt: 7 -test: 0 -> Artikel: 0 | Gesamt: 0 -test: 10, 2, 5, 0 -> Artikel: 3 | Gesamt: 17 -braucht: endlosschleife, aussprung -tipp: Du brauchst zwei Variablen, die vor der Schleife mit 0 anfangen: eine für die Summe und eine für die Anzahl. -tipp: In \`while (true) { … }\` liest du den Preis ein. Gleich danach prüfst du \`if (preis == 0) { break; }\`. Erst dahinter zählst du den Preis zur Summe und die Anzahl um 1 hoch. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Lückentext: Methoden und break - -::: lückentext -titel: Methode und Aussprung -auftrag: Ergänze die fehlenden Wörter. Oben steht die Methode, die ein Quadrat ausrechnet. Darunter steht das Hauptprogramm, das sie aufruft. Im Bereich Code stehen beide in eigenen Reitern. -\`\`\`java -public static [[int]] quadrat(int x) { - [[return]] x * x; -} -\`\`\` -\`\`\`java -int zahl = 1; -while ([[true]]) { - int q = [[quadrat]](zahl); - if (q > 50) { - [[break]]; - } - System.out.println(q); - zahl = zahl + 1; -} -\`\`\` -erklärung: \`int\` vor dem Methodennamen heißt: Die Methode gibt eine ganze Zahl zurück, und zwar mit \`return\`. Gibt eine Methode nichts zurück, steht dort \`void\`. \`while (true)\` läuft endlos, bis \`break\` die Schleife verlässt. Ausgabe: 1, 4, 9, 16, 25, 36 und 49. -::: - -## Fehler finden: Raten - -::: übung l18-java-fehler -titel: Versuche zählen reparieren -code: java -auftrag: Beim Zahlenraten ist die gesuchte Zahl 7. Das Programm fragt so lange nach einem Tipp, bis die 7 kommt, und gibt dann die Zahl der Versuche aus. Bei 3, 5 und 7 waren es 3 Versuche, das Programm sagt aber **Versuche: 2**. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Versuche: 3 -test: 7 -> Versuche: 1 -test: 1, 2, 3, 7 -> Versuche: 4 -braucht: endlosschleife, aussprung -tipp: Was passiert beim richtigen Tipp? Wird er noch mitgezählt, bevor \`break\` die Schleife verlässt? -tipp: Zähle zuerst hoch und prüfe danach: \`versuche = versuche + 1;\` gehört vor das \`if\` mit dem \`break\`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Spiel: Was kommt zurück? - -::: spiel frage -titel: Spiel: Was kommt zurück? -intro: Ludwig ruft Methoden auf und springt aus Schleifen. Sag vorher, was ausgegeben wird. Sieben Runden. - -runde: - public static int quadrat(int x) { - return x * x; - } - - int q = quadrat(5); - System.out.println(q); -frage: Was wird ausgegeben? -- 5 -- 10 -- [x] 25 -> Der Aufruf gibt 5 in x, return liefert 5 · 5 zurück. - -runde: - public static void zeigeSumme(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - zeigeSumme(x, x + 1); -frage: Was wird ausgegeben? -- [x] 5 -- 23 -- 3 -> Der erste Wert 2 kommt in a, der zweite 3 in b. In Java rechnet \`a + b\` mit Zahlen ganz normal. - -runde: -frage: Was liefert eine Methode zurück, vor deren Namen \`void\` steht? -- eine ganze Zahl -- [x] nichts -- immer 0 -> \`void\` heißt: kein Rückgabewert. Steht dort \`int\`, kommt eine ganze Zahl zurück. - -runde: - public static void verdopple(int x) { - x = x * 2; - } - - int zahl = 5; - verdopple(zahl); - System.out.println(zahl); -frage: Was wird ausgegeben? -- [x] 5 -- 10 -- 0 -> Call by value: verdopple bekommt eine Kopie. zahl bleibt 5. - -runde: - public static void leeren(boolean[] plaetze) { - for (int i = 0; i < plaetze.length; i++) { - plaetze[i] = false; - } - } - - boolean[] reihe = {true, true}; - leeren(reihe); - System.out.println(reihe[0]); -frage: Was wird ausgegeben? -- true -- [x] false -> Bei einem Array zeigen reihe und plaetze auf dasselbe Array. Die Änderung sieht auch der Aufrufer. - -runde: - int summe = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - summe = summe + i; - } - System.out.println(summe); -frage: Was wird ausgegeben? -- [x] 6 -- 10 -- 55 -> Bei i = 4 springt \`break\` sofort aus der Schleife. Gezählt sind nur 1 + 2 + 3. - -runde: - int zahl = 1; - while (true) { - zahl = zahl * 3; - if (zahl > 20) { - break; - } - } - System.out.println(zahl); -frage: Was wird ausgegeben? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Erst 27 ist größer als 20, dann endet die Endlosschleife mit break. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine große Aufgabe in Teilprobleme zerlegen. → Große Aufgaben zerlegen -- Ich kann einen Aufruf einfügen und ein Unterprogramm in einem eigenen Reiter bauen. → Der Aufruf -- Ich kann einem Unterprogramm mit Parametern Werte übergeben. → Werte übergeben: Parameter -- Ich kann mit return einen Rückgabewert liefern und ihn beim Aufruf speichern. → Ergebnis zurückgeben: return -- Ich kann erklären, warum ein Unterprogramm eine Zahl nicht verändern kann, ein Array aber schon. → Kopie oder Original: call by value und call by reference -- Ich kann erklären, was ein Aussprung macht und warum er in einer Verzweigung steht. → Der Aussprung -- Ich kann eine Schleife mit einem Aussprung oder über ihre Bedingung beenden. → Aussprung in der Simulation -- Ich kann in Java eine Methode erkennen und eine Schleife mit \`break\` verlassen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Was bedeutet ein Aufruf-Kasten mit dem Text \`zeigeErgebnis()\`? -→ Der Aufruf -- [ ] Das Programm endet hier. -- [x] Hier wird das Unterprogramm zeigeErgebnis() ausgeführt, danach geht es weiter. -- [ ] Hier wird das Wort zeigeErgebnis() ausgegeben. - -? Wo geht es nach einem Aussprung weiter? -→ Der Aussprung -- [ ] Am Anfang der Schleife -- [x] Beim ersten Kasten nach der Schleife -- [ ] Ganz am Anfang des Programms -> Der Aussprung verlässt die Schleife, in der er steht. In Java, Python und JavaScript heißt er break. - -? Warum steht ein Aussprung meistens in einer Verzweigung? -→ Der Aussprung -- [x] Damit die Schleife nur verlassen wird, wenn eine Bedingung zutrifft -- [ ] Weil ein Aussprung sonst nicht gespeichert werden kann -- [ ] Weil eine Verzweigung selbst eine Schleife ist -> Ohne Verzweigung würde die Schleife schon im ersten Durchlauf verlassen. - -? Wo findet die Simulation das Unterprogramm zu einem Aufruf \`zeigeErgebnis()\`? -→ Der Aufruf -- [ ] Es muss im selben Struktogramm stehen. -- [x] In einem offenen Reiter mit dem Titel zeigeErgebnis() -- [ ] Die Simulation kann keine Unterprogramme ausführen. -> Baue jedes Unterprogramm in einem eigenen Reiter und gib ihm als Titel den Namen aus dem Aufruf. - -? Das Unterprogramm hat die Kopfzeile \`void zeigeSumme(int a, int b)\`. Welcher Aufruf passt? -→ Werte übergeben: Parameter -- [ ] zeigeSumme() -- [x] zeigeSumme(3, 4) -- [ ] int s = zeigeSumme(3, 4) -> Zwei Parameter brauchen zwei Werte. Und \`void\` heißt: Es kommt nichts zurück, das man speichern könnte. - -? Nach \`int q = quadrat(5)\` steht in q die 25. Was steht im Unterprogramm quadrat am Ende? -→ Ergebnis zurückgeben: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> Mit return gibt das Unterprogramm den Wert an den Aufruf zurück. Eine Ausgabe würde ihn nur anzeigen. - -? \`void verdopple(int x)\` rechnet \`x = x * 2\`. Im Hauptprogramm steht \`int zahl = 5\` und dann der Aufruf \`verdopple(zahl)\`. Welchen Wert hat zahl danach? -→ Kopie oder Original: call by value und call by reference -- [x] 5 -- [ ] 10 -- [ ] 0 -> Wertübergabe (call by value): verdopple hat nur eine Kopie von zahl verändert. - -? \`void leeren(boolean[] plaetze)\` setzt alle Fächer auf false. Was gilt nach \`leeren(reihe)\` für das Array reihe im Hauptprogramm? -→ Kopie oder Original: call by value und call by reference -- [ ] Es ist unverändert, weil das Unterprogramm eine Kopie bekommt. -- [x] Alle Fächer sind false, weil plaetze und reihe dasselbe Array sind. -- [ ] Das Array ist gelöscht. -> Referenzübergabe (call by reference): Ein Array wird als Referenz übergeben. Änderungen an den Fächern sieht auch der Aufrufer. - -? Wie heißt ein Unterprogramm in Java? -→ Jetzt in Java -- [ ] Klasse -- [x] Methode -- [ ] Schleife -> In Java ist ein Unterprogramm eine Methode, zum Beispiel die \`main\`-Methode. Je nach Art sagt man auch Prozedur oder Funktion. - -? Viele Bausteine haben in Schulbüchern einen zweiten Namen. Ordne jedem Begriff aus VisuStruct den anderen Namen zu. -→ Jetzt in Java -= Verzweigung -> Bedingte Anweisung -= Fallauswahl -> Mehrfachauswahl -= Schleife -> Wiederholungsstruktur -= Array -> Feld -= Unterprogramm -> Methode -> Beide Namen meinen dasselbe. Wenn du einen davon kennst, verstehst du auch den anderen. - -? Was steht in Java in der Kopfzeile einer Methode, die nichts zurückgibt? -→ Ergebnis zurückgeben: return -- [ ] int -- [x] void -- [ ] return -> void heißt „leer“: Die Methode macht etwas, gibt aber keinen Wert zurück. -::: -`,rw=`--- -titel: Suchen und Sortieren -bereich: Grundlagen -kurz: Mit Spielkarten verstehen, wie lineare und binäre Suche und Bubblesort arbeiten und warum manche Verfahren viel schneller sind. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, wie die lineare Suche ein Array durchsucht -- eine lineare Suche als Struktogramm bauen -- erklären, warum die binäre Suche nur bei sortierten Werten funktioniert -- begründen, warum die binäre Suche bei vielen Werten viel schneller ist -- einen Durchgang von Bubblesort mit Spielkarten vormachen -- in Java ein Array durchsuchen und Treffer zählen -::: - -## Eine Karte suchen - -Du hast einen Stapel Spielkarten verdeckt in einer Reihe vor dir liegen. Gesucht ist die 9. Was machst du? Du drehst eine Karte nach der anderen um, bis du die 9 findest oder alle Karten umgedreht hast. - -::: grafik ss-lineare-suche.svg -Die Karten liegen durcheinander. Jede umgedrehte Karte ist ein Vergleich: Ist das die 9? -::: - -Genau so arbeitet die **lineare Suche**: Sie geht das Array vom Index 0 bis zum Ende durch und vergleicht jedes Fach mit dem gesuchten Wert. Sie funktioniert immer, auch wenn die Werte durcheinander liegen. - -Im Array stehen unsere Karten als Zahlen. Bube, Dame und König lassen wir weg. - -::: diagramm ss-lineare-suche.visustruct -Die Schleife läuft, bis die Karte gefunden ist oder kein Fach mehr übrig ist. Die Variable vergleiche zählt mit, wie oft verglichen wurde. Suche in der Simulation die 2, die 27 und die 4. -::: - -> Ist die Karte nicht dabei, bleibt \`position\` bei **-1**. Einen Index -1 gibt es nicht, darum bedeutet -1 hier „nicht gefunden“. - -## Übung: Karte suchen - -::: übung ss-karte-suchen -titel: Karte suchen -auftrag: Lege das Array \`int[] karten = {8, 4, 11, 4, 6}\` an und frage nach einer Karte. Gib die Position der **ersten** passenden Karte aus, z. B. \`Position: 1\` bei der 4. Ist die Karte nicht dabei, gib \`Nicht gefunden\` aus. -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 8 -> Position: 0 -test: 9 -> Nicht gefunden -braucht: whileSchleife, verzweigung -tipp: Gehe das Array von vorn nach hinten durch und vergleiche jede Karte mit der gesuchten. -tipp: Baue das Beispiel oben nach. Die Variable vergleiche brauchst du hier nicht. Die Schleife muss aufhören, sobald \`position\` nicht mehr -1 ist, sonst findest du bei der 4 die zweite statt der ersten. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Binäre Suche: sortiert geht es schneller - -Jetzt liegen die Karten **sortiert** vor dir, von klein nach groß. Gesucht ist die 27. Du drehst nicht mehr vorne die erste Karte um, sondern die **mittlere**: - -- Ist sie die gesuchte, bist du fertig. -- Ist sie kleiner, kann die gesuchte Karte nur noch rechts liegen. Die ganze linke Hälfte fällt weg. -- Ist sie größer, fällt die rechte Hälfte weg. - -Mit dem Rest machst du dasselbe noch einmal. Bei jedem Vergleich halbiert sich der Stapel. - -::: grafik ss-binaere-suche.svg -Drei Vergleiche statt vierzehn: Mit jeder Mitte fällt die Hälfte der übrigen Karten weg. -::: - -Im Struktogramm merken sich zwei Variablen den Bereich, in dem noch gesucht wird: \`links\` und \`rechts\`. Die Mitte ist \`(links + rechts) / 2\`. Weil das eine Ganzzahldivision ist, kommt immer ein ganzer Index heraus. - -::: diagramm ss-binaere-suche.visustruct -Dasselbe Array wie bei der linearen Suche. Suche in der Simulation wieder die 27 und vergleiche die Ausgabe Vergleiche mit der linearen Suche. -::: - -> Die binäre Suche funktioniert **nur bei sortierten Werten**. Bei durcheinander liegenden Karten weißt du nach dem Blick auf die Mitte nicht, in welcher Hälfte du weitersuchen musst. - -::: angeberwissen -Ich denke mir eine Zahl von 1 bis 100, du darfst raten und ich sage nur „größer“ oder „kleiner“. Mit der binären Suche brauchst du höchstens **7** Versuche. Bei einer Zahl bis eine Million sind es höchstens 20, bei einer Milliarde 30. Jede Verdopplung kostet nur einen einzigen Versuch mehr. So suchen auch Datenbanken in Millionen von Einträgen in Sekundenbruchteilen. Ich suche übrigens linear: Ich fresse die Wiese von links nach rechts ab. -::: - -## Wie schnell ist das? - -Wie gut ein Verfahren ist, misst man an der Zahl der Vergleiche, die es **im schlimmsten Fall** braucht. Bei der linearen Suche ist das der Fall, dass die Karte ganz hinten liegt oder fehlt. - -::: grafik ss-vergleiche.svg -Bei 100 Karten braucht die lineare Suche bis zu 100 Vergleiche, die binäre höchstens 7. -::: - -| Anzahl Karten | Lineare Suche | Binäre Suche | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1 000 | 1 000 | 10 | -| 1 000 000 | 1 000 000 | 20 | - -Die lineare Suche wächst im gleichen Maß wie die Kartenzahl. Bei der binären Suche kommt bei doppelt so vielen Karten nur **ein** Vergleich dazu. - -## Sortieren mit Bubblesort - -Für die binäre Suche müssen die Werte sortiert sein. Eines der einfachsten Sortierverfahren ist **Bubblesort**. Du gehst die Reihe von links nach rechts durch und vergleichst immer **zwei Nachbarn**. Steht die größere Karte links, tauschst du die beiden. - -::: grafik ss-bubblesort.svg -Nach einem Durchgang steht die größte Karte ganz rechts. -::: - -Nach dem ersten Durchgang steht die größte Karte ganz rechts, wie eine Luftblase, die nach oben steigt. Daher kommt der Name. Danach wiederholst du den Durchgang für die übrigen Karten. Bei 5 Karten brauchst du 4 Durchgänge. - -Im Struktogramm stecken zwei For-Schleifen ineinander. Die äußere zählt die Durchgänge, die innere vergleicht die Nachbarn \`karten[i]\` und \`karten[i + 1]\`. Das Tauschen kennst du schon: Es braucht eine **Hilfsvariable**. - -::: diagramm ss-bubblesort.visustruct -Die innere Schleife wird mit jedem Durchgang kürzer, weil rechts schon die größten Karten richtig stehen. Gehe es in der Simulation mit Schritt durch und beobachte das Array unter Variablen. -::: - -Bubblesort ist leicht zu verstehen, aber langsam. Bei n Karten braucht es bis zu n · (n − 1) / 2 Vergleiche: bei 10 Karten 45, bei 100 Karten schon 4 950 und bei 1 000 Karten fast eine halbe Million. Schnellere Verfahren wie Quicksort lernst du vielleicht später kennen. - -## Übung: Absteigend sortieren - -::: übung ss-absteigend -titel: Absteigend sortieren -auftrag: Das Startdiagramm liest 5 Karten ein und sortiert sie mit Bubblesort **aufsteigend**, also von klein nach groß. Ändere es so, dass die Karten **absteigend** ausgegeben werden, die größte zuerst. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Schau dir die Bedingung in der Verzweigung an. Sie entscheidet, wann zwei Nachbarn getauscht werden. -tipp: Du musst nur ein einziges Zeichen ändern. Wann sollen zwei Nachbarn getauscht werden, wenn die größere Karte nach links soll? -tipp: Ändere in der Verzweigung \`karten[i] > karten[i + 1]\` in \`karten[i] < karten[i + 1]\`. Dann wird getauscht, wenn rechts die größere Karte liegt, und die große Karte wandert nach links. -lösung: ss-absteigend-loesung.visustruct -::: - -## Jetzt in Java - -Die lineare Suche aus der Übung sieht in Java so aus: - -\`\`\`java editor -int[] karten = {8, 4, 11, 4, 6}; -int gesucht = 4; -int position = -1; -int i = 0; -while (position == -1 && i < karten.length) { - if (karten[i] == gesucht) { - position = i; - } - i = i + 1; -} -System.out.println("Position: " + position); -\`\`\` - -- \`&&\` heißt „und“: Die Schleife läuft nur, solange noch nichts gefunden ist **und** es noch Karten gibt. -- Ist der false-Zweig leer, lässt du \`else\` einfach weg. -- Der Tausch beim Bubblesort braucht auch in Java eine Hilfsvariable: \`int hilf = karten[i];\` - -::: übung l19-java-zaehlen -titel: Karten zählen -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Schreibe in Java ein Programm, das nach einer Karte fragt und zählt, wie oft sie vorkommt. Es gibt **Anzahl:** und die Zahl aus. - Bei 4 erscheint **Anzahl: 2**. -test: 4 -> Anzahl: 2 -test: 8 -> Anzahl: 1 -test: 9 -> Anzahl: 0 -braucht: forSchleife, verzweigung -tipp: Anders als bei der Suche hörst du beim ersten Treffer nicht auf. Eine For-Schleife geht alle Karten durch. -tipp: \`for (int i = 0; i < karten.length; i++)\` und darin \`if (karten[i] == gesucht) { anzahl = anzahl + 1; }\`. \`anzahl\` startet vor der Schleife mit 0. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Lückentext: Bubblesort - -::: lückentext -titel: Karten sortieren -auftrag: Das Programm sortiert die Karten mit Bubblesort aufsteigend. Ergänze die fehlenden Wörter und Zeichen. -\`\`\`java -int[] karten = {5, 2, 8, 1}; -for (int runde = 0; runde < karten.[[length]] - 1; runde++) { - for (int i = 0; i < karten.length - 1; i++) { - if (karten[i] [[>]] karten[i + 1]) { - [[int]] hilf = karten[i]; - karten[i] = karten[i + 1]; - karten[i + 1] = [[hilf]]; - } - } -} -for (int i = 0; i < karten.length; i++) { - System.out.println(karten[i]); -} -\`\`\` -erklärung: Ist eine Karte größer als ihre rechte Nachbarin, werden die beiden getauscht, mit einer Hilfsvariablen wie beim Gläsertauschen. Nach \`length - 1\` Runden ist alles sortiert: 1, 2, 5, 8. -::: - -## Fehler finden: Suche - -::: übung l19-java-fehler -titel: Lineare Suche reparieren -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Das Programm soll die **erste** Position der gesuchten Karte ausgeben, bei 4 also **Position: 1**. Es gibt aber **Position: 3** aus. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Finde den Fehler, repariere ihn und klicke auf Prüfen. -start: l19-java-fehler-start.visustruct -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 9 -> Position: -1 -test: 8 -> Position: 0 -braucht: whileSchleife, verzweigung -tipp: Die Schleife läuft immer bis zur letzten Karte. Was passiert, wenn die 4 ein zweites Mal kommt? -tipp: Die Schleife soll aufhören, sobald etwas gefunden ist: \`while (position == -1 && i < karten.length)\`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Warum läuft das nicht? - -::: übung l19-java-laeuft-nicht -titel: Karte suchen -code: java -auftrag: Die Karten {8, 4, 11, 4, 6} liegen in einem Array. Das Programm sucht die 11 und soll **Position: 2** ausgeben. Es läuft aber nicht. - „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Position: 2 -braucht: forSchleife, verzweigung -tipp: Vergleiche die Namen in der Bedingung mit den Namen, die oben angelegt werden. -tipp: Die gesuchte Karte steht in \`gesucht\` mit kleinem g: \`if (karten[i] == gesucht) {\` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Spiel: Suchprofi - -::: spiel frage -titel: Spiel: Suchprofi -intro: Ludwig sucht und sortiert Karten. Wie schnell geht das, und was kommt heraus? Sieben Runden. - -runde: - int[] karten = {8, 4, 11, 4, 6}; - int gesucht = 4; - int position = -1; - int i = 0; - while (position == -1 && i < karten.length) { - if (karten[i] == gesucht) { - position = i; - } - i = i + 1; - } - System.out.println("Position: " + position); -frage: Was wird ausgegeben? -- [x] Position: 1 -- Position: 3 -- Position: 2 -> Die Suche hört bei der ersten 4 auf. Sie liegt im Fach 1, gezählt wird ab 0. - -runde: - int[] karten = {8, 4, 11, 4, 6}; - int gesucht = 7; -frage: Mit derselben linearen Suche: Was steht danach in position? -- 0 -- 5 -- [x] -1 -> Die 7 ist nicht dabei. position bleibt bei -1, das bedeutet „nicht gefunden“. - -runde: -frage: Bei welchen Karten funktioniert die binäre Suche? -- bei allen -- [x] nur bei sortierten -- nur bei weniger als 100 -> Nur wenn die Karten sortiert sind, weißt du nach dem Blick auf die Mitte, in welcher Hälfte du weitersuchen musst. - -runde: -frage: Wie viele Vergleiche braucht die binäre Suche bei 100 Karten höchstens? -- 50 -- [x] 7 -- 100 -> Jeder Vergleich halbiert den Stapel. 7-mal halbieren reicht bis 128 Karten, also auch für 100. - -runde: -frage: Statt 1 000 Karten sind es jetzt 2 000. Wie viele Vergleiche braucht die binäre Suche höchstens mehr? -- [x] einen -- doppelt so viele -- 1 000 -> Der erste Vergleich halbiert 2 000 auf 1 000. Danach geht es weiter wie vorher. - -runde: - int[] karten = {5, 3, 8, 1}; -frage: Ein Durchgang Bubblesort vergleicht von links nach rechts immer zwei Nachbarn. Wie liegen die Karten danach? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 und 3 tauschen, 5 und 8 bleiben, 8 und 1 tauschen. Die größte Karte ist ganz rechts. - -runde: -frage: Bubblesort tauscht \`karten[i]\` und \`karten[i + 1]\`. Was braucht es dafür? -- [x] eine Hilfsvariable -- ein zweites Array -- eine binäre Suche -> Wie beim Tauschen zweier Variablen: \`int hilf = karten[i];\`, sonst geht ein Wert verloren. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, wie die lineare Suche ein Array durchsucht. → Eine Karte suchen -- Ich kann eine lineare Suche als Struktogramm bauen. → Übung: Karte suchen -- Ich kann erklären, warum die binäre Suche nur bei sortierten Werten funktioniert. → Binäre Suche: sortiert geht es schneller -- Ich kann begründen, warum die binäre Suche bei vielen Werten viel schneller ist. → Wie schnell ist das? -- Ich kann einen Durchgang von Bubblesort mit Spielkarten vormachen. → Sortieren mit Bubblesort -- Ich kann in Java ein Array durchsuchen und Treffer zählen. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? Welche Voraussetzung braucht die binäre Suche? -→ Binäre Suche: sortiert geht es schneller -- [ ] Das Array muss genau 100 Fächer haben. -- [x] Die Werte müssen sortiert sein. -- [ ] Der gesuchte Wert muss vorkommen. -> Nur bei sortierten Werten weißt du nach dem Blick auf die Mitte, in welcher Hälfte du weitersuchst. - -? Ein sortiertes Array hat 1 000 Werte. Wie viele Vergleiche braucht die binäre Suche höchstens? -→ Wie schnell ist das? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1 000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: Nach etwa 10 Halbierungen bleibt ein Wert übrig. - -? Was vergleicht Bubblesort in jedem Schritt? -→ Sortieren mit Bubblesort -- [ ] Die erste und die letzte Karte -- [x] Zwei benachbarte Karten -- [ ] Jede Karte mit der Mitte -> Steht die größere Karte links, werden die Nachbarn getauscht. - -? Wo steht nach dem ersten Durchgang von Bubblesort die größte Karte? -→ Sortieren mit Bubblesort -- [ ] Ganz links -- [ ] In der Mitte -- [x] Ganz rechts -> Sie wird bei jedem Vergleich weitergetauscht und steigt wie eine Blase nach rechts. - -? Was bedeutet \`position = -1\` in der linearen Suche? -→ Eine Karte suchen -- [x] Die Karte wurde (noch) nicht gefunden. -- [ ] Die Karte liegt ganz hinten. -- [ ] Das Array ist leer. - -? Ordne jedem Verfahren die passende Beschreibung zu. -→ Eine Karte suchen -= Lineare Suche -> eine Karte nach der anderen ansehen -= Binäre Suche -> die Mitte ansehen und eine Hälfte weglassen -= Bubblesort -> Nachbarn vergleichen und tauschen - -? Warum nimmst du zum Zählen eine For-Schleife und keine Suche, die beim ersten Treffer aufhört? -→ Jetzt in Java -- [ ] Eine For-Schleife ist immer schneller. -- [x] Du musst jede Karte ansehen, sonst fehlen spätere Treffer. -- [ ] Eine While-Schleife kann keine Arrays durchlaufen. -> Die Karte kann mehrmals vorkommen. Darum gehst du alle Karten bis zum Ende durch. -::: -`,ow=`--- -titel: Struktogramm und Code -bereich: Vom Struktogramm zum Code -kurz: Alle Elemente in Java auf einen Blick, Code erzeugen, im Bereich Code Java schreiben, ausführen und Fehler suchen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Code-Ansicht öffnen und Java als Sprache wählen -- Ausgabe, Eingabe, Verzweigung und Schleifen in Java erkennen -- den Unterschied zwischen Snippet und Class erklären -- erklären, wie Java-Code mit Compiler, Bytecode und JVM auf jedem Betriebssystem läuft -- JDK und JRE unterscheiden -- erklären, warum man ein C++-Programm für jedes Betriebssystem neu kompilieren muss, ein Java-Programm aber nicht -- ein kurzes Java-Programm als Struktogramm nachbauen -- im Bereich Code Java tippen und das entstehende Struktogramm lesen -- ein Programm mit ▶︎ ausführen und Ein- und Ausgaben in der Konsole nutzen -- an der roten Zeilennummer einen Syntaxfehler oder Laufzeitfehler finden -- Haltepunkte setzen und ein Programm im Einzelschritt verfolgen -::: - -## Die Code-Ansicht - -In den Lektionen 4 bis 19 hast du jedes Element schon einmal in Java geschrieben. Hier siehst du alles auf einen Blick und lernst, wie VisuStruct aus einem ganzen Struktogramm ein Java-Programm macht. - -Ein Struktogramm beschreibt einen Ablauf. Damit ein Computer ihn ausführt, brauchst du ein Programm in einer Programmiersprache. VisuStruct schreibt diesen Code für dich. - -Klicke bei den Werkzeugen auf [Code](#zeige-code) (Symbol mit spitzen Klammern). Rechts erscheint der **Code-Generator**: - -- Oben wählst du die Sprache: **Java**, **Python** oder **JavaScript**. -- Bei Java wählst du zusätzlich **Snippet** (nur die Anweisungen) oder **Class** (eine vollständige Java-Datei). -- **Diagramm-Text als Kommentare** schreibt den Text jedes Kastens als Kommentar über den Code. -- **Kopieren** legt den Code in die Zwischenablage, **Java speichern …** speichert eine \`.java\`-Datei. - -Der Code ändert sich sofort mit, wenn du am Struktogramm etwas änderst. - -::: angeberwissen -Nassi hat später an der Programmiersprache Ada mitgearbeitet und war bei Apple für Software zuständig. Wer Struktogramme erfindet, landet also nicht im Ziegenstall, sondern bei Apple. -::: - -::: diagramm l17-beispiel.visustruct -Ein kleines Programm mit Eingabe, For-Schleife und Verzweigung. Öffne es und schau dir den Java-Code dazu an. -::: - -## So sieht das Beispiel in Java aus - -Für das Diagramm oben erzeugt VisuStruct als **Snippet** diesen Code: - -\`\`\` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Welche Reihe?"); -int zahl = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int ergebnis = zahl * i; - System.out.println(i + " mal " + zahl + " = " + ergebnis); -} -if (zahl > 10) { - System.out.println("Das war schwer!"); -} else { - System.out.println("Das war leicht."); -} -\`\`\` - -Jede Anweisung endet in Java mit einem **Semikolon** \`;\`. Was in einem Kasten steht, steht in Java in **geschweiften Klammern** \`{ }\`. Die Einrückung zeigt dir, was zusammengehört. - -## Die Elemente in Java - -| Element | Java | Lektion | -|---|---|---| -| Anweisung | \`int summe = 0;\` | 4, 5 | -| Ausgabe | \`System.out.println(summe);\` | 6 | -| Eingabe | \`int zahl = scanner.nextInt();\` | 6 | -| Verzweigung | \`if (bedingung) { … } else { … }\` | 8, 9 | -| Fallauswahl | \`switch (wert) { case 1 -> { … } default -> { … } }\` | 10 | -| While-Schleife | \`while (bedingung) { … }\` | 11 | -| Do-while-Schleife | \`do { … } while (bedingung);\` | 12 | -| For-Schleife | \`for (int i = 0; i < 5; i++) { … }\` | 13 | -| Endlosschleife | \`while (true) { … }\` | 11, 18 | -| Aussprung | \`break;\` | 18 | -| Aufruf | \`berechne();\` | 18 | -| Array | \`int[] zahlen = new int[5];\` | 15, 16 | -| Text (String) | \`String name = scanner.next();\` | 17 | - -Für Eingaben steht ganz oben einmal \`import java.util.Scanner;\` und \`Scanner scanner = new Scanner(System.in);\`. Vor jeder Eingabe gibt VisuStruct die Frage mit \`System.out.println(…)\` aus. - -Ist der Nein-Zweig einer Verzweigung leer, erzeugt VisuStruct trotzdem einen \`else\`-Teil, in dem nur der Kommentar \`// empty element\` steht. Wenn du **Leeren else-Zweig im Code ausgeben** ausschaltest, fällt der leere \`else\`-Teil weg. - -## Snippet oder Class - -Ein **Snippet** kannst du in ein vorhandenes Java-Programm in die \`main\`-Methode einfügen. Mit **Class** bekommst du eine vollständige Datei, die du sofort übersetzen und starten kannst: - -\`\`\` -import java.util.Scanner; - -public class Einmaleins { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Welche Reihe?"); - int zahl = scanner.nextInt(); - ... - } // Ende main -} // Ende Klasse -\`\`\` - -Die Kommentare \`// Ende main\` und \`// Ende Klasse\` hinter den letzten beiden Klammern sind nicht nötig, aber sehr hilfreich: So siehst du sofort, welche Klammer was schließt, und vergisst keine. - -Der Name der Klasse kommt aus dem **Titel** des Diagramms. Die Datei muss genauso heißen, hier also \`Einmaleins.java\`. Das erledigt **Java speichern …** für dich. - -> Der erzeugte Code ist ein guter Anfang, aber prüfe ihn. Legst du eine Variable zuerst an und liest sie später mit einer Eingabe neu ein, schreibt VisuStruct trotzdem \`int pin = scanner.nextInt();\`. Java meldet dann, dass es \`pin\` schon gibt. Lösche in dieser Zeile einfach das \`int\`. - -## Wie Java auf jedem Computer läuft - -Deine Datei \`Einmaleins.java\` ist **Quellcode**: Text für Menschen. Der Prozessor deines Computers versteht ihn nicht direkt. Deshalb läuft Java in zwei Schritten: - -1. Der **Compiler** \`javac\` übersetzt den Quellcode in **Bytecode**. Heraus kommt die Datei \`Einmaleins.class\`. -2. Die **JVM** (Java Virtual Machine) liest den Bytecode und übersetzt ihn beim Ausführen in **Maschinencode**, also in Befehle für den Prozessor deines Computers. - -::: grafik l20-jvm.svg -Einmal kompilieren: Derselbe Bytecode läuft auf jeder JVM. -::: - -Den Bytecode gibt es nur einmal. Die JVM gibt es dagegen für Windows, macOS, Linux und viele andere Systeme. Deshalb läuft dieselbe \`.class\`-Datei auf jedem Computer, auf dem eine JVM installiert ist. Das nennt man **plattformunabhängig**. Der Werbespruch dazu heißt **„Write once, run anywhere“**: einmal schreiben, überall ausführen. - -::: angeberwissen -Einen der ersten Compiler hat 1952 **Grace Hopper** gebaut, die du schon aus Lektion 7 kennst. Viele sagten ihr damals, Computer könnten nur rechnen und keine Programme übersetzen. Sie hat es trotzdem gemacht. -::: - -Zum Vergleich **C++**: Dort übersetzt der Compiler den Quellcode direkt in Maschinencode für genau einen Prozessor und ein Betriebssystem. Das fertige Programm läuft nur dort. Für Windows, macOS und Linux musst du es jeweils neu kompilieren. - -::: grafik l20-cpp.svg -C++ wird für jedes System einzeln zu Maschinencode kompiliert. -::: - -| | C++ | Java | -|---|---|---| -| Der Compiler erzeugt | Maschinencode | Bytecode | -| Wie oft kompilieren? | für jedes System neu | einmal | -| Was braucht der Computer zum Ausführen? | nichts weiter | eine JVM | - -Ist Java dadurch langsamer? Kaum. Programmteile, die oft laufen, zum Beispiel Schleifen, übersetzt der **JIT-Compiler** der JVM („just in time“, gerade rechtzeitig) einmal komplett in Maschinencode. Danach laufen sie fast so schnell wie C++. - -> Stell dir die JVM wie einen kleinen Computer aus Software vor, fast wie ein eigenes Betriebssystem nur für Java-Programme. Genau genommen ist sie aber kein Betriebssystem, sondern eine **virtuelle Maschine**: ein Programm, das selbst auf Windows, macOS oder Linux läuft und darin einen gedachten Computer nachspielt. - -Beim Installieren begegnen dir zwei Abkürzungen: - -| Abkürzung | Was steckt drin? | Wofür? | -|---|---|---| -| **JRE** (Java Runtime Environment) | die JVM und fertige Bausteine wie \`Scanner\` | Java-Programme ausführen | -| **JDK** (Java Development Kit) | die JRE und dazu den Compiler \`javac\` und weitere Werkzeuge | Java-Programme schreiben und übersetzen | - -Zum Programmieren brauchst du also das JDK. Heute lädt man meist nur noch das JDK herunter, die JRE steckt darin. Für VisuStruct im Browser musst du nichts davon installieren. - -::: angeberwissen -Mit einem JDK kannst du alles auch selbst in der Konsole machen, also im Terminal oder in der Eingabeaufforderung: - -\`\`\` -java -version -javac Einmaleins.java -java Einmaleins -\`\`\` - -- \`java -version\` zeigt, welche Java-Version installiert ist. Kommt eine Fehlermeldung, fehlt Java noch. -- \`javac Einmaleins.java\` startet den Compiler. Danach hast du zwei Dateien im Ordner: \`Einmaleins.java\` mit deinem Quellcode und neu \`Einmaleins.class\` mit dem Bytecode. -- \`java Einmaleins\` startet die JVM mit deinem Bytecode. Den Klassennamen schreibst du hier ohne \`.class\`. - -Klappt \`java -version\`, aber \`javac -version\` nicht, ist nur eine JRE installiert. Dann fehlt dir das JDK. -::: - -::: angeberwissen -Jede übersetzte Java-Datei (\`.class\`) beginnt mit denselben vier Bytes, in Hexadezimal geschrieben: \`CA FE BA BE\`. Daran erkennt der Computer, dass es Java ist. Das „Kaffee-Baby“ hat sich James Gosling ausgedacht, passend zum Kaffee im Namen. -::: - -## Der Java-Sprachmodus - -Unter dem [Zahnrad](#zeige-einstellungen) oben rechts kannst du **Code-Keywords** einschalten. Dann heißen die Bausteine im Bereich Elemente so wie die Befehle in Java: \`if\`, \`switch\`, \`for\`, \`while\`, \`do\`, \`while(true)\`, \`break\` und \`call\`. Die übrige Oberfläche bleibt in deiner Sprache. - -Das hilft dir, die Kästen und die Java-Befehle einander zuzuordnen. Dein Diagramm selbst bleibt dabei unverändert. - -## Java direkt schreiben - -Bisher hast du zuerst das Struktogramm gezeichnet und dann den Code angesehen. Im Bereich [Code](#zeige-codelive) geht es auch andersherum. Klicke rechts auf die schmale Leiste **Code**. Neben dem Struktogramm erscheint eine Spalte, in die du Java selbst tippst. - -- **Struktogramm zu Code:** Änderst du etwas im Struktogramm, ändert sich der Java-Code sofort mit. -- **Code zu Struktogramm:** Tippst du Java, baut VisuStruct beim Tippen das Struktogramm dazu. Fehlt noch etwas, zum Beispiel eine schließende Klammer \`}\`, steht unter dem Code ein Hinweis. -- **Vorschläge:** Beim Tippen schlägt VisuStruct Vorlagen vor, etwa für \`if\`, \`for\` oder \`while\`. Mit der Eingabetaste übernimmst du eine Vorlage. Grau geschriebene Platzhalter ersetzt du einfach durch deinen Text. -- **Einrücken:** Ist dein Code durcheinandergeraten, klicke oben im Bereich Code auf den Knopf **Einrücken**. Jede Ebene steht dann vier Leerzeichen tiefer, wie in Eclipse oder IntelliJ. Hast du Zeilen markiert, rückt VisuStruct nur diese ein. - -So kannst du beide Wege ausprobieren. Erst das Struktogramm zeichnen ist gut, um einen Ablauf zu planen. Direkt Code schreiben ist schneller, wenn du schon weißt, was du willst. Das Struktogramm hilft dir dann, deinen Code zu kontrollieren. - -## Das Programm ausführen - -Oben im Bereich Code startet [▶︎ Ausführen](#zeige-ausfuehren) dein Programm, **■ Stopp** bricht es ab, zum Beispiel bei einer Endlosschleife. Was dein Programm ausgibt, erscheint unten in der [Konsole](#zeige-konsole). Fragt es nach einer Eingabe, tippst du sie dort ein und drückst die Eingabetaste. - -Die Grenze zwischen Code und Konsole kannst du mit der Maus nach oben oder unten ziehen. - -Geht etwas schief, wird die Zeilennummer rot. Bei einem Syntaxfehler ist die Stelle zusätzlich rot unterstrichen, und es steht z. B. **Zeile 2: Hier fehlt noch: ;** darunter. Dann startet ▶︎ das Programm gar nicht erst. Bricht das Programm beim Ausführen ab, ist es ein Laufzeitfehler, und die Konsole nennt die Zeile, z. B. **Zeile 3: Division durch null.** Die drei Fehlerarten kennst du aus der Lektion „Simulation und Schreibtischtest“. - -Weiß VisuStruct genau, was fehlt, steht am Ende der Zeile eine 💡. Fährst du mit der Maus darauf, siehst du den Vorschlag, z. B. **Vorschlag: import java.util.Scanner; einfügen**. Ein Klick übernimmt ihn. Lies trotzdem nach, was eingefügt wurde, damit du es beim nächsten Mal selbst weißt. - -> Der Bereich Code versteht die Java-Befehle, die es auch als Kasten im Struktogramm gibt. Eigene Klassen und Objekte kennt es noch nicht. Fenster mit Swing gehen trotzdem: Schalte dafür im Zahnrad **Echtes Java (mit Swing)** ein (Lektion „Dein erstes Fenster“). - -::: angeberwissen -Profis nennen ein Programm, in dem man Code schreibt, ausführt und Fehler sucht, eine **IDE** (Integrated Development Environment). Mit dem Bereich Code ist VisuStruct eine kleine IDE mit eingebautem Struktogramm. -::: - -## Fehler suchen mit dem Debugger - -Manchmal läuft ein Programm, rechnet aber falsch. Das ist ein Logikfehler. Dann hilft der **Debugger**: Er führt dein Programm langsam aus, und du schaust ihm dabei zu. - -- **Haltepunkt:** Klicke links auf eine Zeilennummer. Ein roter Punkt erscheint. [▶︎ Ausführen](#zeige-ausfuehren) hält vor dieser Zeile an. Ein zweiter Klick nimmt den Punkt wieder weg. -- **Gelbe Zeile:** Sie wird als Nächstes ausgeführt. Im Struktogramm ist der passende Kasten markiert. -- **Variablen:** Unter dem Code steht, welchen Wert jede Variable gerade hat. Was sich seit dem letzten Anhalten geändert hat, leuchtet kurz gelb. -- **Einzelschritt:** Der Knopf [Einzelschritt](#zeige-einzelschritt) neben ▶︎ führt genau eine Zeile aus und hält wieder an. Ohne Haltepunkt startet er das Programm und hält vor der ersten Zeile. -- **Weiter:** ▶︎ läuft bis zum nächsten Haltepunkt oder bis zum Ende. **■ Stopp** bricht ab. - -Probier es mit diesem Programm aus. Setze einen Haltepunkt in Zeile 3 und drücke mehrmals ▶︎. Wie wachsen \`i\` und \`summe\`? - -\`\`\` -int summe = 0; -for (int i = 1; i <= 4; i++) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -\`\`\` - -::: ludwig -Das ist ein Schreibtischtest, nur dass der Computer für dich mitschreibt. Überleg dir vor jedem Schritt, welchen Wert die Variable gleich haben müsste. Stimmt die Tabelle nicht mit deiner Vermutung überein, hast du die Stelle mit dem Fehler gefunden. -::: - -## Übung: Erst Code, dann Struktogramm - -Diesmal zeichnest du nicht. Öffne den Bereich Code und tippe diesen Java-Code ab: - -\`\`\` -System.out.println("Startzahl?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -\`\`\` - -::: übung l20-countdown -titel: Countdown -bereich: beide -auftrag: Tippe den Java-Code oben im Bereich Code ab. Führe ihn mit ▶︎ aus und gib in der Konsole eine Startzahl ein. - Sieh dir dann das Struktogramm an, das dabei entstanden ist, und klicke auf Prüfen. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Öffne den Bereich Code mit der schmalen Leiste ganz rechts und tippe einfach los. -tipp: Achte auf das Semikolon am Ende jeder Anweisung und auf die geschweiften Klammern der While-Schleife. Unter dem Code steht ein Hinweis, wenn noch etwas fehlt. -lösung: l20-countdown-loesung.visustruct -::: - -## Übung: Java als Struktogramm - -Jetzt andersherum: Hier ist ein Stück Java-Code. Baue es als Struktogramm nach. - -\`\`\` -System.out.println("Zahl eingeben"); -int n = scanner.nextInt(); -int fakultaet = 1; -for (int i = 1; i <= n; i++) { - fakultaet = fakultaet * i; -} -System.out.println(fakultaet); -\`\`\` - -::: übung l17-fakultaet -titel: Fakultät aus Java -bereich: beide -auftrag: Baue den Java-Code oben als Struktogramm nach. Das Programm liest eine Zahl n ein und gibt das Produkt 1 · 2 · … · n aus. - Kontrolliere am Ende in der Code-Ansicht, ob dein Java-Code genauso aussieht. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Lies den Java-Code Zeile für Zeile und überlege, welcher Kasten zu jeder Zeile passt. -tipp: Die beiden ersten Java-Zeilen sind zusammen eine einzige Eingabe: \`input: int n "Zahl eingeben"\`. Die For-Schleife hat die drei Felder \`int i = 1\`, \`i <= n\` und \`i++\`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Übung: else if - -In Java schreibt man mehrere Fälle oft als \`else if\`: - -\`\`\` -if (alter < 6) { - System.out.println("Eintritt frei"); -} else if (alter < 18) { - System.out.println("Kinderticket: 4 Euro"); -} else { - System.out.println("Erwachsenenticket: 8 Euro"); -} -\`\`\` - -Im Struktogramm gibt es kein \`else if\`. Dort steckt eine zweite Verzweigung im Nein-Zweig der ersten. Steht im Nein-Zweig nur diese eine Verzweigung, macht VisuStruct beim Erzeugen des Codes daraus wieder \`else if\`, in Python \`elif\`. - -::: übung l17-ticket -titel: Ticketpreis -bereich: beide -auftrag: Frage nach dem Alter als ganze Zahl und baue den Java-Code oben als Struktogramm nach. -test: 5 -> Eintritt frei -test: 6 -> Kinderticket: 4 Euro -test: 17 -> Kinderticket: 4 Euro -test: 18 -> Erwachsenenticket: 8 Euro -braucht: verzweigung -tipp: Im Java-Code steckt in einem \`else\` ein weiteres \`if\`. Im Struktogramm ist das eine Verzweigung in einem Zweig. -tipp: Ziehe in den false-Zweig der ersten Verzweigung eine zweite Verzweigung mit der Bedingung \`alter < 18\`. -lösung: l17-ticket-loesung.visustruct -::: - -## Spiel: Welcher Kasten? - -::: spiel frage -titel: Spiel: Welcher Kasten? -intro: Ludwig zeigt dir Java. Welcher Kasten aus dem Struktogramm steckt dahinter? Acht Runden. -frage: Welcher Kasten ist das? - -runde: - do { - zahl = zahl * 2; - } while (zahl < 100); -- While-Schleife -- [x] Do-while-Schleife -- For-Schleife -> Die Bedingung steht unten. Der Rumpf läuft also mindestens einmal. - -runde: - switch (wahl) { - case 1 -> { System.out.println("Wasser"); } - default -> { System.out.println("Gibt es nicht."); } - } -- Verzweigung -- [x] Fallauswahl -- Aufruf -> Eine Variable wird mit festen Werten verglichen: Das ist die Fallauswahl. - -runde: - break; -- Aufruf -- Endlosschleife -- [x] Aussprung -> \`break\` verlässt sofort die Schleife, in der es steht. - -runde: - berechne(); -- [x] Aufruf -- Ausgabe -- Anweisung -> Name mit runden Klammern: Hier wird ein Unterprogramm aufgerufen. - -runde: - int zahl = scanner.nextInt(); -- Ausgabe -- [x] Eingabe -- Aufruf -> Der Scanner liest einen Wert ein. Das ist eine Eingabe. - -runde: - while (true) { - System.out.println("Hallo"); - } -- While-Schleife mit Bedingung -- [x] Endlosschleife -- Do-while-Schleife -> \`while (true)\` hat keine echte Bedingung. Nur ein break könnte sie beenden. - -runde: -frage: Du willst eine vollständige Java-Datei, die du sofort übersetzen und starten kannst. Was wählst du in der Code-Ansicht? -- Snippet -- [x] Class -> Ein Snippet sind nur die Anweisungen für die \`main\`-Methode. Class erzeugt die ganze Datei. - -runde: -frage: Im Debugger ist eine Zeile gelb. Was bedeutet das? -- Sie hat einen Fehler. -- [x] Sie wird als Nächstes ausgeführt. -- Dort steht ein Haltepunkt. -> Gelb ist die nächste Zeile. Ein Haltepunkt ist ein roter Punkt an der Zeilennummer. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Code-Ansicht öffnen und Java als Sprache wählen. → Die Code-Ansicht -- Ich kann Ausgabe, Eingabe, Verzweigung und Schleifen in Java erkennen. → Die Elemente in Java -- Ich kann den Unterschied zwischen Snippet und Class erklären. → Snippet oder Class -- Ich kann erklären, wie Java-Code mit Compiler, Bytecode und JVM auf jedem Betriebssystem läuft. → Wie Java auf jedem Computer läuft -- Ich kann JDK und JRE unterscheiden. → Wie Java auf jedem Computer läuft -- Ich kann erklären, warum man ein C++-Programm für jedes Betriebssystem neu kompilieren muss, ein Java-Programm aber nicht. → Wie Java auf jedem Computer läuft -- Ich kann ein kurzes Java-Programm als Struktogramm nachbauen. → Übung: Java als Struktogramm -- Ich kann im Bereich Code Java tippen und das entstehende Struktogramm lesen. → Java direkt schreiben -- Ich kann ein Programm mit ▶︎ ausführen und Ein- und Ausgaben in der Konsole nutzen. → Das Programm ausführen -- Ich kann an der roten Zeilennummer einen Syntaxfehler oder Laufzeitfehler finden. → Das Programm ausführen -- Ich kann Haltepunkte setzen und ein Programm im Einzelschritt verfolgen. → Fehler suchen mit dem Debugger -::: - -## Wissenstest - -::: quiz -? Wie sieht \`output: "Hallo"\` in Java aus? -→ Die Elemente in Java -- [ ] print("Hallo") -- [x] System.out.println("Hallo"); -- [ ] console.log("Hallo"); -> print ist Python, console.log ist JavaScript. - -? Woher kommt der Klassenname bei Class? -→ Snippet oder Class -- [ ] Er heißt immer Main. -- [x] Aus dem Titel des Diagramms -- [ ] Aus dem ersten Kasten -> Ohne Titel heißt die Klasse Main. - -? Welcher Java-Code gehört zu einer Do-while-Schleife? -→ Die Elemente in Java -- [ ] while (bedingung) { … } -- [x] do { … } while (bedingung); -- [ ] for (;;) { … } -> Bei do-while steht die Bedingung am Ende, deshalb läuft der Rumpf mindestens einmal. - -? Was wird aus einem Aussprung im Java-Code? -→ Die Elemente in Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? Was passiert an einem roten Punkt vor der Zeilennummer? -→ Fehler suchen mit dem Debugger -- [ ] Die Zeile wird übersprungen. -- [x] Das Programm hält vor dieser Zeile an. -- [ ] Die Zeile enthält einen Fehler. -> Das ist ein Haltepunkt. Danach geht es mit ▶︎ oder dem Einzelschritt weiter. - -? Warum läuft dieselbe \`.class\`-Datei auf Windows, macOS und Linux? -→ Wie Java auf jedem Computer läuft -- [ ] Der Compiler erzeugt für jedes Betriebssystem eine eigene Datei. -- [x] Auf jedem Betriebssystem führt eine JVM denselben Bytecode aus. -- [ ] Java-Programme brauchen kein Betriebssystem. -> Der Bytecode bleibt gleich. Nur die JVM gibt es für jedes System extra. - -? Was brauchst du, um Java-Programme zu schreiben und zu übersetzen? -→ Wie Java auf jedem Computer läuft -- [ ] nur die JRE -- [x] das JDK -- [ ] nur die JVM -> Die JRE reicht zum Ausführen. Den Compiler \`javac\` gibt es nur im JDK. - -? Du willst dein Programm auf Windows und auf dem Mac nutzen. Was stimmt? -→ Wie Java auf jedem Computer läuft -- [ ] Java musst du für jedes System neu kompilieren, C++ nicht. -- [x] C++ musst du für jedes System neu kompilieren, Java nicht. -- [ ] Beide musst du nur einmal kompilieren. -> C++ wird direkt zu Maschinencode für ein System. Java wird zu Bytecode, und den führt auf jedem System die JVM aus. - -? Die Zeilennummer 3 im Bereich Code ist rot. Was heißt das? -→ Das Programm ausführen -- [ ] In Zeile 3 ist ein Haltepunkt. -- [x] In Zeile 3 steckt ein Fehler. -- [ ] Zeile 3 wird als Nächstes ausgeführt. -> Der Haltepunkt ist ein runder roter Punkt, die nächste Zeile ist gelb. Eine rote Zeilennummer zeigt einen Syntaxfehler oder einen Laufzeitfehler. -::: -`,lw=`--- -titel: Python und JavaScript -bereich: Vom Struktogramm zum Code -kurz: Python- und JavaScript-Code aus dem Struktogramm erzeugen und JavaScript direkt im Browser ausführen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Python und JavaScript in der Code-Ansicht auswählen und vergleichen -- erklären, dass Python Blöcke durch Einrückung bildet und keine Datentypen braucht -- erklären, was VisuStruct beim Übersetzen nach Python anpasst -- JavaScript mit Im Browser testen ausführen -::: - -## Dasselbe Diagramm, drei Sprachen - -In der Code-Ansicht ([Code](#zeige-code) bei den Werkzeugen) wählst du oben die Sprache. Das Struktogramm bleibt gleich, nur die Schreibweise ändert sich. So kannst du die Sprachen gut vergleichen. - -::: diagramm l18-beispiel.visustruct -Eine Zahl wird so lange um 3 verkleinert, bis sie nicht mehr größer als 0 ist. -::: - -## Python - -Für das Diagramm oben erzeugt VisuStruct diesen Python-Code: - -\`\`\` -zahl = int(input("Startwert?")) -while zahl > 0: - print(zahl) - zahl = zahl - 3 -print("Ende") -\`\`\` - -Was in Python anders ist als in Java: - -- Es gibt **keine Semikolons** und **keine geschweiften Klammern**. Was zu einer Schleife oder Verzweigung gehört, erkennt Python allein an der **Einrückung**. Hinter \`while\`, \`if\` und \`else\` steht ein Doppelpunkt. -- Variablen bekommen **keinen Datentyp**: aus \`int zahl = 5\` wird \`zahl = 5\`. -- Die Ausgabe heißt \`print(…)\`, die Eingabe \`input(…)\`. Für eine Zahl steht \`int(…)\` darum herum. -- Arrays heißen in Python **Listen**: aus \`int[] zahlen = {2, 4, 6}\` wird \`zahlen = [2, 4, 6]\`, und aus \`zahlen.length\` wird \`len(zahlen)\`. -- Eine einfache For-Schleife wie \`int i = 0\`, \`i < 5\`, \`i++\` wird zu \`for i in range(5):\`. - -## Worauf du bei Python achten musst - -Python ist an einigen Stellen strenger als Java. VisuStruct übersetzt die Java-Schreibweise beim Export deshalb gleich mit: - -- **Text und Zahl mit +:** \`"Summe: " + summe\` wird zu \`"Summe: " + str(summe)\`. Ohne \`str(…)\` bricht Python ab. -- **i++ gibt es nicht:** daraus wird \`i += 1\`. -- **&&, || und !** heißen in Python \`and\`, \`or\` und \`not\`, \`true\` und \`false\` werden zu \`True\` und \`False\`. -- **Ganzzahlige Division:** In Python ergibt \`7 / 2\` immer 3.5. Teilt das Struktogramm zwei \`int\`-Werte, schreibt VisuStruct deshalb \`7 // 2\`, das ergibt wie in Java 3. -- **For-Schleifen:** Zählschleifen werden zu \`for … in range(…)\`, auch mit \`i <= n\`, Rückwärtszählen oder Schritten wie \`i = i + 2\`. Passt eine Schleife nicht dazu, wird daraus eine \`while\`-Schleife. -- **do-while gibt es nicht:** daraus wird \`while True:\` mit \`if not (…): break\` am Ende. - -Ist ein Diagramm als **Pseudocode** markiert, steht nur ein Hinweis über dem Code. Dann ist der Text eine Skizze und kein lauffähiges Programm. - -## JavaScript - -Dasselbe Diagramm in JavaScript: - -\`\`\` -"use strict"; - -let zahl = parseInt((prompt("Startwert?") ?? "0"), 10); -while (zahl > 0) { - console.log(zahl); - zahl = zahl - 3; -} -console.log("Ende"); -\`\`\` - -JavaScript sieht Java ähnlich: geschweifte Klammern, Semikolons, \`while (…)\` und \`if (…)\`. Die Unterschiede: - -- Variablen werden mit \`let\` angelegt, ohne Datentyp. Konstanten mit \`const\`. -- Die Ausgabe heißt \`console.log(…)\`, die Eingabe \`prompt(…)\`. Mit \`parseInt(…)\` wird aus der Eingabe eine ganze Zahl. -- Arrays stehen in eckigen Klammern: \`let zahlen = [2, 4, 6];\`. -- \`"use strict";\` ganz oben sorgt dafür, dass JavaScript bei Tippfehlern in Variablennamen meckert. -- JavaScript kennt nur einen Zahlentyp. Teilt das Struktogramm zwei \`int\`-Werte, schreibt VisuStruct \`Math.trunc(a / b)\`. Dann fallen die Nachkommastellen wie in Java weg. - -::: angeberwissen -JavaScript hat mit Java fast nichts zu tun. Brendan Eich hat es 1995 in nur zehn Tagen für den Browser Netscape gebaut. Erst hieß es Mocha, dann LiveScript. Weil Java gerade alle begeisterte, wurde es kurz vor dem Start aus Werbegründen in JavaScript umbenannt. Seitdem werden die beiden ständig verwechselt, bis heute. Programmierer sagen dazu: Java und JavaScript haben so viel gemeinsam wie Auto und Autogramm. -::: - -## JavaScript im Browser ausführen - -JavaScript ist die Sprache der Browser. Deshalb kann VisuStruct den Code **sofort ausführen**: - -::: angeberwissen -Warum sind Links im Browser eigentlich blau? Ben Shneidermans Team hat 1985 untersucht, welche Farbe man gut sieht und die beim Lesen nicht stört. Gewonnen hat Hellblau. Rot fiel zwar mehr auf, aber man konnte sich den Text danach schlechter merken. -::: - -1. Wähle in der Code-Ansicht **JavaScript**. -2. Klicke auf **Im Browser testen**. -3. Unter **Ausgabe** erscheint, was \`console.log\` ausgibt. Fragt das Programm mit \`prompt\` nach einem Wert, tippst du ihn ein und klickst auf **OK**. -4. Mit **Stopp** brichst du das Programm ab. - -Eine Endlosschleife \`while (true)\` hält VisuStruct nach 100 000 Durchläufen von selbst an und meldet **Ausführung gestoppt: mögliche Endlosschleife.** - -> Ein **Aufruf** braucht im JavaScript-Code ein Unterprogramm mit diesem Namen, sonst meldet JavaScript einen Fehler. Anders als die Simulation sucht der Browser nicht in den anderen Reitern. - -## Übung: Python als Struktogramm - -Dieses Python-Programm gibt alle geraden Zahlen von 0 bis zu einer Grenze aus: - -\`\`\` -grenze = int(input("Bis wohin?")) -for i in range(0, grenze + 1, 2): - print(i) -\`\`\` - -\`range(0, grenze + 1, 2)\` heißt: bei 0 anfangen, vor \`grenze + 1\` aufhören, in Zweierschritten zählen. - -::: übung l18-python -titel: Gerade Zahlen -bereich: beide -auftrag: Baue das Python-Programm oben als Struktogramm mit einer For-Schleife nach. Bei der Grenze 7 gibt es 0, 2, 4 und 6 aus. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: \`range(0, grenze + 1, 2)\` zählt von 0 bis zur Grenze in Zweierschritten. Das ist eine For-Schleife. -tipp: Die drei Felder der For-Schleife sind \`int i = 0\`, \`i <= grenze\` und \`i = i + 2\`. -lösung: l18-python-loesung.visustruct -::: - -## Übung: JavaScript als Struktogramm - -\`\`\` -let alter = parseInt((prompt("Wie alt bist du?") ?? "0"), 10); -if (alter >= 16) { - console.log("Du darfst wählen."); -} else { - let jahre = 16 - alter; - console.log("Noch " + jahre + " Jahre warten."); -} -\`\`\` - -::: übung l18-js -titel: Wählen ab 16 -bereich: beide -auftrag: Baue den JavaScript-Code oben als Struktogramm nach. Teste danach in der Code-Ansicht mit **JavaScript** und **Im Browser testen**, ob dein Code dasselbe ausgibt wie die Simulation. -test: 12 -> Noch 4 Jahre warten. -test: 16 -> Du darfst wählen. -test: 13 -> Noch 3 Jahre warten. -test: 40 -> Du darfst wählen. -braucht: verzweigung -tipp: Lies den Code Zeile für Zeile. \`if\` und \`else\` werden zu einer Verzweigung. -tipp: \`prompt\` und \`parseInt\` sind zusammen eine Eingabe: \`input: int alter "Wie alt bist du?"\`. Im false-Zweig stehen zwei Kästen: erst \`int jahre = 16 - alter\`, dann die Ausgabe. -lösung: l18-js-loesung.visustruct -::: - -## Spiel: Welche Sprache? - -::: spiel frage -titel: Spiel: Welche Sprache? -intro: Ludwig hat Zeilen aus drei Sprachen gemischt. Erkennst du, woher jede stammt? Acht Runden. -frage: In welcher Sprache ist das geschrieben? -antworten: Java | Python | JavaScript - -runde: - print(zahl) -richtig: Python -> Die Ausgabe heißt in Python \`print(…)\`, ohne Semikolon. - -runde: - console.log(zahl); -richtig: JavaScript -> \`console.log\` ist die Ausgabe in JavaScript. - -runde: - System.out.println(zahl); -richtig: Java -> Die lange Ausgabe mit \`System.out\` gibt es nur in Java. - -runde: - let zahlen = [2, 4, 6]; -richtig: JavaScript -> \`let\` und eckige Klammern: ein Array in JavaScript. - -runde: - for i in range(5): -richtig: Python -> Doppelpunkt statt geschweifter Klammern und \`range\`: typisch Python. - -runde: - int[] zahlen = {2, 4, 6}; -richtig: Java -> Nur Java schreibt den Datentyp \`int[]\` davor. - -runde: - zahl = int(input("Startwert?")) -richtig: Python -> Kein Datentyp vor der Variablen, kein Semikolon, und \`int(…)\` um die Eingabe. - -runde: - let zahl = parseInt(prompt("Startwert?"), 10); -richtig: JavaScript -> \`prompt\` fragt im Browser nach einem Wert, \`parseInt\` macht eine Zahl daraus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Python und JavaScript in der Code-Ansicht auswählen und vergleichen. → Dasselbe Diagramm, drei Sprachen -- Ich kann erklären, dass Python Blöcke durch Einrückung bildet und keine Datentypen braucht. → Python -- Ich kann erklären, was VisuStruct beim Übersetzen nach Python anpasst. → Worauf du bei Python achten musst -- Ich kann JavaScript mit Im Browser testen ausführen. → JavaScript im Browser ausführen -::: - -## Wissenstest - -::: quiz -? Woran erkennt Python, welche Zeilen zu einer Schleife gehören? -→ Python -- [ ] An den geschweiften Klammern -- [x] An der Einrückung -- [ ] Am Semikolon am Zeilenende - -? Wie heißt \`output: summe\` in JavaScript? -→ Dasselbe Diagramm, drei Sprachen -- [ ] print(summe) -- [ ] System.out.println(summe); -- [x] console.log(summe); - -? Welche Sprache kann VisuStruct direkt im Browser ausführen? -→ JavaScript im Browser ausführen -- [ ] Java -- [ ] Python -- [x] JavaScript -> Jeder Browser kann JavaScript ausführen. Für Java und Python brauchst du ein eigenes Programm. - -? Was passiert in Python bei \`print("Summe: " + summe)\`, wenn summe die Zahl 7 ist? -→ Worauf du bei Python achten musst -- [ ] Es wird Summe: 7 ausgegeben. -- [x] Python meldet einen Fehler, weil Text und Zahl nicht mit + verbunden werden können. -- [ ] Es wird Summe: ausgegeben. -> Mit str(summe) wird aus der Zahl ein Text. -::: -`,uw=`--- -titel: Wenn das Programm abstürzt: try und catch -bereich: Fehler abfangen -kurz: Mit echtem Java Fehlermeldungen lesen und Abstürze mit try und catch abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- echtes Java im Bereich Code einschalten -- aus einer Fehlermeldung die Exception und die Zeile ablesen -- eine Exception mit try und catch auffangen -- Text mit Integer.parseInt in eine Zahl umwandeln und die NumberFormatException abfangen -- ein Programm schreiben, das sicher teilt, auch durch 0 -::: - -## Abgestürzt! - -Dieses Programm soll drei Noten ausgeben. Tippe es im Bereich [Code](#zeige-codelive) ab und klicke auf [▶︎ Ausführen](#zeige-ausfuehren): - -\`\`\`java -int[] noten = {2, 3, 1}; -System.out.println("Erste Note: " + noten[0]); -System.out.println("Vierte Note: " + noten[3]); -System.out.println("Fertig!"); -\`\`\` - -Die erste Note erscheint, dann ist Schluss. VisuStruct meldet „Ungültiger Ausdruck: noten[3]“, und „Fertig!“ kommt nie an. Das Array hat nur die Fächer 0, 1 und 2, ein Fach 3 gibt es nicht. - -::: ludwig -Ist dir das auch schon passiert? Ein kleiner Fehler, und das ganze Programm ist weg. Mir ist das so oft passiert, dass ich vor dem Bildschirm geweint habe. Aber es gibt eine Lösung, und die heißt **try** und **catch**. -::: - -::: angeberwissen -1947 fand das Team von Grace Hopper im Rechner Mark II an der Universität Harvard eine Motte, die einen Fehler verursacht hatte. Sie klebten sie ins Logbuch und schrieben dazu: „First actual case of bug being found“. Seitdem heißen Programmfehler **Bugs** (englisch für Käfer). -::: - -## Echtes Java einschalten - -Der Bereich Code rechnet normalerweise mit derselben Simulation wie das Struktogramm. Die hält bei einem Fehler einfach an. Um zu sehen, was echtes Java macht, schaltest du echtes Java ein: - -1. Klicke oben rechts auf das [Zahnrad](#zeige-einstellungen) und wähle als **Programmiersprache** Java. -2. Setze im Abschnitt Java den Haken bei **Echtes Java (mit Swing)**. - -Beim ersten Ausführen lädt VisuStruct einmalig etwa 40 MB. Danach wird dein Code wie in einer richtigen Java-Entwicklungsumgebung übersetzt und ausgeführt. - -> Mit echtem Java funktionieren Eingaben über die Konsole (\`Scanner\`) noch nicht. Unsere Beispiele kommen deshalb ohne Eingabe aus. - -Schreib das Programm jetzt als ganze Klasse, damit die Zeilennummern stimmen, und führe es aus: - -\`\`\`java -public class Noten { - public static void main(String[] args) { - int[] noten = {2, 3, 1}; - System.out.println("Erste Note: " + noten[0]); - System.out.println("Vierte Note: " + noten[3]); - System.out.println("Fertig!"); - } -} -\`\`\` - -In der [Konsole](#zeige-konsole) steht jetzt: - -\`\`\` -Erste Note: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Noten.main(Noten.java:5) -\`\`\` - -## Die Fehlermeldung lesen - -So eine Meldung sieht erst einmal erschreckend aus. Sie verrät dir aber genau, was los ist: - -| Teil | Bedeutung | -|---|---| -| \`ArrayIndexOutOfBoundsException\` | Die Art des Fehlers: Der Index liegt außerhalb des Arrays. | -| \`3\` | Der falsche Index. | -| \`Noten.java:5\` | Die Zeile, in der es passiert ist: Zeile 5. | - -So einen Laufzeitfehler nennt Java eine **Exception** (englisch für Ausnahme). Man sagt: Java *wirft* eine Exception. Fängt sie niemand auf, bricht das Programm ab. Deshalb erscheint „Fertig!“ nicht. - -::: ludwig -Lies Fehlermeldungen immer von oben: Erst der Name der Exception, dann die Zeilennummer. Die Zeilennummern stehen im Bereich Code links neben dem Code. -::: - -## try und catch - -Mit **try** und **catch** fängst du die Exception auf. Ändere die Zeile mit \`noten[3]\` so: - -\`\`\`java -try { - System.out.println("Vierte Note: " + noten[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Diese Note gibt es nicht."); -} -System.out.println("Fertig!"); -\`\`\` - -- \`try\` heißt „versuche“. Java führt den Block in den geschweiften Klammern ganz normal aus. -- Wirft eine Zeile darin eine Exception, springt Java sofort in den \`catch\`-Block. Der Rest des \`try\`-Blocks wird übersprungen. -- In der Klammer hinter \`catch\` steht, welche Exception aufgefangen wird, und ein Name dafür, meistens \`e\`. -- Danach geht das Programm normal weiter. Jetzt erscheint auch „Fertig!“. - -Läuft im \`try\`-Block alles gut, wird der \`catch\`-Block einfach übersprungen. - -::: ludwig -try und catch sind wie das Netz unter dem Trapez im Zirkus: Solange alles klappt, merkst du nichts davon. Fällt jemand, fängt das Netz ihn auf, und die Vorstellung geht weiter. -::: - -> Im Struktogramm gibt es keinen Kasten für try und catch. VisuStruct zeigt den ganzen Block deshalb als eine Anweisung. Ausführen kannst du ihn nur mit echtem Java. - -::: angeberwissen -Im Juli 1969 landete Apollo 11 auf dem Mond. Kurz vor der Landung meldete der Bordcomputer plötzlich die Fehler **1202** und **1201**: Er hatte mehr zu tun, als er schaffen konnte. Abgestürzt ist er trotzdem nicht. Das Team von **Margaret Hamilton** hatte die Software so gebaut, dass sie solche Fehler erkennt, Unwichtiges liegen lässt und nur das Wichtigste weiterrechnet. Die Landung klappte. - -Margaret Hamilton leitete am MIT die Gruppe, die die Software für die Apollo-Raumschiffe schrieb. Sie plante immer ein, dass etwas schiefgehen kann, so wie du mit \`try\` und \`catch\`. Damit Software genauso ernst genommen wird wie Hardware, nannte sie ihre Arbeit **Software Engineering**. Heute heißt so ein ganzes Fach der Informatik. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (geb. 1936) im Jahr 1969 neben den ausgedruckten Programmen, die ihr Team für Apollo geschrieben hat (Foto: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), gemeinfrei). -::: - -## Text in eine Zahl umwandeln - -Oft steht eine Zahl zuerst als Text da, zum Beispiel später in einem Textfeld im Fenster. \`Integer.parseInt\` wandelt Text in eine ganze Zahl um: - -\`\`\`java -String eingabe = "zwölf"; -try { - int zahl = Integer.parseInt(eingabe); - System.out.println("Doppelt: " + zahl * 2); -} catch (NumberFormatException e) { - System.out.println("Das ist keine Zahl: " + eingabe); -} -\`\`\` - -„zwölf“ kann Java nicht umwandeln und wirft eine \`NumberFormatException\`. Das Programm gibt „Das ist keine Zahl: zwölf“ aus. Ändere die erste Zeile in \`String eingabe = "12";\` und führe es noch einmal aus: Jetzt erscheint „Doppelt: 24“. - -## Exceptions sind Objekte - -Das steht nicht im Lehrplan, ist aber praktisch zu wissen. - -::: angeberwissen -Jede Exception ist ein Objekt einer eigenen Klasse, zum Beispiel \`ArithmeticException\` für das Teilen durch 0. \`e.getMessage()\` liefert ihre Meldung, etwa \`/ by zero\`. - -Hinter einem \`try\` dürfen mehrere \`catch\`-Blöcke stehen, für jede Art von Fehler einer. \`catch (Exception e)\` fängt alle Exceptions auf, verrät dir dann aber weniger darüber, was passiert ist. Und ein Block \`finally { … }\` am Ende läuft immer, egal ob es einen Fehler gab oder nicht. -::: - -## Spiel: Fängt das Netz? - -::: spiel frage -titel: Spiel: Fängt das Netz? -intro: Ludwig turnt am Trapez. Fängt try und catch ihn auf, oder stürzt das Programm ab? Sieben Runden. - -runde: - int[] noten = {2, 3, 1}; - System.out.println(noten[3]); - System.out.println("Fertig!"); -frage: Was passiert mit echtem Java? -- Es erscheint 1 und Fertig! -- Es erscheint nur Fertig! -- [x] Das Programm stürzt mit einer ArrayIndexOutOfBoundsException ab. -> Ein Fach 3 gibt es nicht. Niemand fängt die Exception auf, also kommt Fertig! nie an. - -runde: - int[] noten = {2, 3, 1}; - try { - System.out.println(noten[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Diese Note gibt es nicht."); - } - System.out.println("Fertig!"); -frage: Was wird ausgegeben? -- Fertig! -- [x] Diese Note gibt es nicht.\\nFertig! -- Diese Note gibt es nicht. -> Der catch-Block fängt die Exception auf, danach geht das Programm normal weiter. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: Was wird ausgegeben? -- A\\nB\\nC -- [x] A\\nC -- C -> Bei 10 / 0 springt Java sofort in den catch-Block. Der Rest des try-Blocks, also B, wird übersprungen. - -runde: - String eingabe = "12"; - try { - int zahl = Integer.parseInt(eingabe); - System.out.println("Doppelt: " + zahl * 2); - } catch (NumberFormatException e) { - System.out.println("Das ist keine Zahl: " + eingabe); - } -frage: Was wird ausgegeben? -- [x] Doppelt: 24 -- Das ist keine Zahl: 12 -- Doppelt: 1212 -> „12“ lässt sich umwandeln. Läuft im try-Block alles gut, wird catch übersprungen. - -runde: -frage: Welche Exception wirft \`Integer.parseInt("2.5")\`? -- ArithmeticException -- [x] NumberFormatException -- keine, das Ergebnis ist 2 -> parseInt wandelt nur ganze Zahlen um. Mit Komma oder Punkt ist es kein gültiges Format. - -runde: -frage: Welche Exception wirft \`12 / 0\` mit \`int\`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Durch 0 teilen geht mit ganzen Zahlen nicht. Die Meldung lautet \`/ by zero\`. - -runde: - try { - int stuecke = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Fehler!"); - } - System.out.println("Fertig!"); -frage: Was passiert? -- Es erscheint Fehler! und Fertig! -- Es erscheint nur Fertig! -- [x] Das Programm stürzt ab. -> catch fängt nur die Exception, die in der Klammer steht. Eine ArithmeticException fällt durch das Netz. -::: - -## Aufgabe: Sicher teilen - -Dieses Programm stürzt ab: - -\`\`\`java -int kuchen = 12; -int personen = 0; -System.out.println("Jeder bekommt " + kuchen / personen + " Stücke."); -System.out.println("Guten Appetit!"); -\`\`\` - -1. Führe es mit echtem Java aus und lies die Fehlermeldung. Welche Exception ist es? -2. Fange sie mit try und catch ab. Statt des Absturzes soll „Ohne Personen kann man nicht teilen.“ erscheinen, und „Guten Appetit!“ soll trotzdem kommen. -3. Setze \`personen\` auf 4 und prüfe, dass dann „Jeder bekommt 3 Stücke.“ erscheint. - -::: ludwig -Die Exception heißt \`ArithmeticException\`. Schreib in den \`try\`-Block nur die Zeile, die abstürzen kann. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann echtes Java im Bereich Code einschalten. → Echtes Java einschalten -- Ich kann aus einer Fehlermeldung die Exception und die Zeile ablesen. → Die Fehlermeldung lesen -- Ich kann eine Exception mit try und catch auffangen. → try und catch -- Ich kann Text mit Integer.parseInt in eine Zahl umwandeln und die NumberFormatException abfangen. → Text in eine Zahl umwandeln -- Ich kann ein Programm schreiben, das sicher teilt, auch durch 0. → Aufgabe: Sicher teilen -::: - -## Wissenstest - -::: quiz -? Was passiert, wenn eine Exception nicht aufgefangen wird? -→ Die Fehlermeldung lesen -- [ ] Java überspringt die Zeile und macht weiter. -- [x] Das Programm bricht ab. -- [ ] Der Computer startet neu. -> Deshalb erscheint im ersten Beispiel „Fertig!“ nicht. - -? Was passiert im try-Block nach der Zeile, die eine Exception wirft? -→ try und catch -- [ ] Die restlichen Zeilen laufen trotzdem. -- [x] Der Rest wird übersprungen, Java springt in den catch-Block. -- [ ] Java beginnt den try-Block von vorne. - -? Welche Exception wirft Integer.parseInt("zwölf")? -→ Text in eine Zahl umwandeln -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> „zwölf“ hat kein Zahlenformat, das Java versteht. - -? Ordne jeder Exception ihre Ursache zu. -→ Die Fehlermeldung lesen -= ArrayIndexOutOfBoundsException -> Index außerhalb des Arrays -= ArithmeticException -> Teilen durch 0 -= NumberFormatException -> Text ist keine Zahl -::: -`,mw=`--- -titel: Text einlesen und speichern -bereich: Dateien -kurz: Mit Scanner eine Textdatei Zeile für Zeile lesen und mit PrintWriter eine Datei speichern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, warum Programme Daten in Dateien speichern -- eine Textdatei mit Scanner, hasNextLine und nextLine Zeile für Zeile lesen -- erklären, warum Java bei Dateien try und catch oder throws verlangt -- mit PrintWriter eine Datei schreiben und sie mit close() abschließen -- eine Datei lesen, ergänzen und nummeriert wieder speichern -::: - -## Warum Dateien? - -Alles, was in Variablen steht, ist weg, sobald das Programm endet. Soll sich ein Programm etwas merken, zum Beispiel einen Spielstand, eine Liste oder Noten, speichert es die Daten in einer **Datei**. Beim nächsten Start liest es die Datei wieder ein. - -Zora ist frei, und Ludwig plant ein Fest. Seine Einkaufsliste liegt als Datei \`einkauf.txt\` bereit: - -::: datei einkauf.txt -Heu -Äpfel -Karotten -Löwenzahn -::: - -Eine Datei mit der Endung \`.txt\` enthält nur Text, Zeile für Zeile. Du kannst sie mit jedem Editor öffnen, zum Beispiel mit dem Editor von Windows oder TextEdit am Mac. - -## Eine Datei lesen mit Scanner - -Den \`Scanner\` kennst du schon: \`new Scanner(System.in)\` liest von der Tastatur. Gibst du ihm statt \`System.in\` eine Datei, liest er aus der Datei: - -\`\`\`java -import java.io.*; -import java.util.Scanner; - -Scanner datei = new Scanner(new File("einkauf.txt")); -while (datei.hasNextLine()) { - String zeile = datei.nextLine(); - System.out.println(zeile); -} -datei.close(); -\`\`\` - -| Methode | Bedeutung | -|---|---| -| \`new File("einkauf.txt")\` | die Datei mit diesem Namen | -| \`hasNextLine()\` | Gibt es noch eine Zeile? \`true\` oder \`false\` | -| \`nextLine()\` | liefert die nächste Zeile und rückt eine Zeile weiter | -| \`close()\` | schließt die Datei, wenn du fertig bist | - -Die Schleife läuft, solange es noch eine Zeile gibt. In jedem Durchlauf holt \`nextLine()\` die nächste Zeile. \`File\` steht im Paket \`java.io\`, deshalb brauchst du \`import java.io.*;\`. - -::: diagramm dt-lesen.visustruct -So sieht das Lesen im Struktogramm aus. Probier es in der Simulation aus. -::: - -::: ludwig -Stell dir den Scanner wie einen Finger vor, der auf eine Zeile zeigt. \`nextLine()\` liest die Zeile unter dem Finger und schiebt ihn eine Zeile weiter. Ist der Finger unter der letzten Zeile, liefert \`hasNextLine()\` \`false\`. -::: - -## Was, wenn die Datei fehlt? - -Gibt es die Datei nicht, kann Java sie nicht lesen und wirft eine \`FileNotFoundException\`. Java verlangt, dass dein Programm damit rechnet. Entweder du fängst sie mit try und catch auf, wie in Lektion 22: - -\`\`\`java -try { - Scanner datei = new Scanner(new File("einkauf.txt")); - // ... lesen ... - datei.close(); -} catch (FileNotFoundException e) { - System.out.println("Die Datei einkauf.txt fehlt!"); -} -\`\`\` - -Oder du schreibst hinter \`main\` den Zusatz \`throws Exception\`. Das heißt: „Diese Methode kann eine Exception werfen, ich kümmere mich nicht darum.“ Dann bricht das Programm ab, wenn die Datei fehlt. - -\`\`\`java -public static void main(String[] args) throws Exception { -\`\`\` - -> VisuStruct schreibt \`throws Exception\` automatisch hinter \`main\`, sobald dein Programm mit Dateien arbeitet. In der Simulation meldet VisuStruct eine fehlende Datei mit „Es gibt keine Datei …“. - -## Übung: Einkaufsliste nummerieren - -::: übung l23-java-nummern -titel: Einkaufsliste nummerieren -code: java -auftrag: Lies \`einkauf.txt\` Zeile für Zeile und gib jede Zeile mit ihrer Nummer aus: **1. Heu**, **2. Äpfel** und so weiter. -start: l23-java-nummern-start.visustruct -test: - -> 1. Heu | 2. Äpfel | 3. Karotten | 4. Löwenzahn -braucht: whileSchleife -tipp: Lege vor der Schleife \`int nummer = 1;\` an und erhöhe die Nummer am Ende jedes Durchlaufs. -tipp: Die Ausgabe ist \`System.out.println(nummer + ". " + zeile);\` -lösung: l23-java-nummern-loesung.visustruct -::: - -## In eine Datei schreiben mit PrintWriter - -Zum Schreiben gibt es den \`PrintWriter\`. Seine Methoden heißen wie bei \`System.out\`: - -\`\`\`java -PrintWriter aus = new PrintWriter("gruss.txt"); -aus.println("Hallo Zora!"); -aus.println("Bis morgen, Ludwig"); -aus.close(); -\`\`\` - -Danach steht in \`gruss.txt\`: - -\`\`\` -Hallo Zora! -Bis morgen, Ludwig -\`\`\` - -- \`println\` schreibt den Text und beginnt danach eine neue Zeile, \`print\` schreibt ohne neue Zeile. -- Gibt es die Datei schon, wird sie **überschrieben**. Der alte Inhalt ist dann weg. -- Nach dem Lauf zeigt VisuStruct unter der Ausgabe, was in der Datei gespeichert wurde. - -::: ludwig -Vergiss \`close()\` nicht! Der PrintWriter sammelt den Text erst in einem Zwischenspeicher und schreibt ihn beim Schließen in die Datei. Ohne \`close()\` bleibt die Datei leer. Mir ist so schon eine ganze Geschichte verloren gegangen. -::: - -## Übung: Einkaufsliste ergänzen - -::: übung l23-java-ergaenzen -titel: Einkaufsliste ergänzen -code: java -auftrag: Ludwig braucht noch Kuchen. Lies \`einkauf.txt\` und schreibe jede Zeile in die neue Datei \`einkauf-neu.txt\`. Schreibe danach **Kuchen** als letzte Zeile dazu. Gib am Ende aus, wie viele Zeilen gespeichert wurden: **5 Zeilen gespeichert**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 Zeilen gespeichert -datei: einkauf-neu.txt -> Heu | Äpfel | Karotten | Löwenzahn | Kuchen -braucht: whileSchleife -tipp: In der Schleife liest du eine Zeile mit \`datei.nextLine()\` und schreibst sie mit \`aus.println(zeile)\` gleich wieder hinaus. -tipp: Nach der Schleife kommt \`aus.println("Kuchen");\`. Schließe beide Dateien mit \`close()\`, sonst bleibt \`einkauf-neu.txt\` leer. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Spiel: Was steht in der Datei? - -::: spiel frage -titel: Spiel: Was steht in der Datei? -intro: Ludwig schreibt Dateien mit dem PrintWriter. Lies den Code und sag voraus, was danach in der Datei steht. Sechs Runden. -frage: Was steht danach in der Datei? - -runde: - PrintWriter aus = new PrintWriter("gruss.txt"); - aus.println("Hallo"); - aus.println("Zora"); - aus.close(); -- [x] Hallo\\nZora -- HalloZora -- Zora -> \`println\` beginnt nach jedem Text eine neue Zeile. - -runde: - PrintWriter aus = new PrintWriter("wort.txt"); - aus.print("Ha"); - aus.print("llo"); - aus.println("!"); - aus.close(); -- Ha\\nllo\\n! -- [x] Hallo! -- Ha llo ! -> \`print\` schreibt ohne neue Zeile weiter, die Teile hängen direkt aneinander. - -runde: - PrintWriter aus = new PrintWriter("geheim.txt"); - aus.println("Der Schatz liegt im Turm"); -- Der Schatz liegt im Turm -- [x] Nichts, die Datei bleibt leer. -- Java meldet einen Fehler. -> Ohne \`close()\` landet der Text nie in der Datei. Er bleibt im Zwischenspeicher. - -runde: - // In notiz.txt steht vorher: Alt - PrintWriter aus = new PrintWriter("notiz.txt"); - aus.println("Neu"); - aus.close(); -- Alt\\nNeu -- [x] Neu -- Neu\\nAlt -> Ein neuer PrintWriter überschreibt die Datei. Der alte Inhalt ist weg. - -runde: - PrintWriter aus = new PrintWriter("zahlen.txt"); - for (int i = 1; i <= 3; i++) { - aus.println(i * 2); - } - aus.close(); -- 1\\n2\\n3 -- 246 -- [x] 2\\n4\\n6 -> Die Schleife schreibt 2, 4 und 6, jede Zahl in eine eigene Zeile. - -runde: - // In einkauf.txt steht: Heu, Äpfel (je eine Zeile) - Scanner datei = new Scanner(new File("einkauf.txt")); - PrintWriter aus = new PrintWriter("gross.txt"); - while (datei.hasNextLine()) { - aus.println(datei.nextLine().toUpperCase()); - } - datei.close(); - aus.close(); -- Heu\\nÄpfel -- [x] HEU\\nÄPFEL -- HEUÄPFEL -> Jede Zeile wird gelesen, in Großbuchstaben verwandelt und in eine eigene Zeile geschrieben. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, warum Programme Daten in Dateien speichern. → Warum Dateien? -- Ich kann eine Textdatei mit Scanner, hasNextLine und nextLine Zeile für Zeile lesen. → Eine Datei lesen mit Scanner -- Ich kann erklären, warum Java bei Dateien try und catch oder throws verlangt. → Was, wenn die Datei fehlt? -- Ich kann mit PrintWriter eine Datei schreiben und sie mit close() abschließen. → In eine Datei schreiben mit PrintWriter -- Ich kann eine Datei lesen, ergänzen und nummeriert wieder speichern. → Übung: Einkaufsliste ergänzen -::: - -## Wissenstest - -::: quiz -? Was liefert hasNextLine()? -→ Eine Datei lesen mit Scanner -- [ ] die nächste Zeile -- [x] true, wenn es noch eine Zeile gibt, sonst false -- [ ] die Anzahl der Zeilen -> Mit hasNextLine() prüft die Schleife, ob es weitergeht. - -? Was passiert, wenn du new PrintWriter("liste.txt") für eine Datei aufrufst, die es schon gibt? -→ In eine Datei schreiben mit PrintWriter -- [ ] Der neue Text wird hinten angehängt. -- [x] Die Datei wird überschrieben. -- [ ] Java meldet einen Fehler. - -? Warum bleibt eine Datei leer, obwohl println aufgerufen wurde? -→ In eine Datei schreiben mit PrintWriter -- [ ] Weil println nur in die Konsole schreibt. -- [x] Weil close() fehlt. -- [ ] Weil der Dateiname auf .txt endet. -> Erst close() schreibt den Zwischenspeicher in die Datei. - -? Ordne jeder Methode ihre Aufgabe zu. -→ Eine Datei lesen mit Scanner -= nextLine() -> liest die nächste Zeile -= println(text) -> schreibt eine Zeile -= close() -> schließt die Datei -::: -`,cw=`--- -titel: Zeile für Zeile mit BufferedReader -bereich: Dateien -kurz: Mit BufferedReader und readLine lesen, bis null kommt, und mit Files eine ganze Datei auf einmal lesen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Datei mit BufferedReader und readLine lesen -- das Dateiende erkennen, weil readLine dort null liefert -- zählen, wie oft ein Wort in einer Datei vorkommt -- eine ganze Datei mit Files.readString lesen und mit split in Zeilen zerlegen -- den längsten Eintrag einer Datei finden -::: - -## Der Kuchen ist weg! - -Am Morgen nach dem Fest ist Ludwigs Kuchen verschwunden. Zum Glück führt die Burg ein Logbuch. Jede Zeile beginnt mit dem Tag und der Uhrzeit: - -::: datei logbuch.txt -Mo 08:15 Ludwig füttert die Ziegen -Mo 12:30 Zora liest im Turm -Mo 18:00 Fuchs schleicht am Tor vorbei -Di 09:00 Ludwig backt einen Kuchen -Di 14:45 Hase bringt Karotten -Di 16:20 Fuchs fragt nach dem Rezept -Di 23:55 Der Kuchen ist weg -Mi 07:00 Zora findet Krümel vor dem Fuchsbau -::: - -Mit dem Scanner aus Lektion 23 könntest du es schon lesen. Profis nehmen für Dateien aber oft den **BufferedReader**. - -## Lesen mit BufferedReader - -\`\`\`java -import java.io.*; - -BufferedReader leser = new BufferedReader(new FileReader("logbuch.txt")); -String zeile = leser.readLine(); -while (zeile != null) { - System.out.println(zeile); - zeile = leser.readLine(); -} -leser.close(); -\`\`\` - -- \`new FileReader("logbuch.txt")\` öffnet die Datei, \`new BufferedReader(…)\` legt einen Puffer drumherum. Er holt die Datei in großen Stücken und ist deshalb bei langen Dateien schneller. -- \`readLine()\` liefert die nächste Zeile. Gibt es keine Zeile mehr, liefert es **null**. -- Die Schleife läuft deshalb, solange \`zeile != null\` ist. Am Ende jedes Durchlaufs liest sie die nächste Zeile. - -::: diagramm dt-buffered.visustruct -Erst eine Zeile lesen, dann prüfen, dann am Ende des Durchlaufs die nächste lesen. -::: - -**null** heißt „gar nichts“. Es ist nicht der leere Text \`""\`, sondern kein Text. Eine Variable mit \`null\` hat keine Methoden: \`zeile.length()\` bricht dann mit einer \`NullPointerException\` ab. Prüfe deshalb immer zuerst \`zeile != null\`. - -| | Scanner | BufferedReader | -|---|---|---| -| Anlegen | \`new Scanner(new File(…))\` | \`new BufferedReader(new FileReader(…))\` | -| Gibt es noch eine Zeile? | \`hasNextLine()\` | \`readLine()\` liefert \`null\` | -| Nächste Zeile | \`nextLine()\` | \`readLine()\` | -| Stärke | kann auch Zahlen lesen (\`nextInt()\`) | schnell, auch bei großen Dateien | - -::: ludwig -Die Schleife sieht anders aus als beim Scanner: Die erste Zeile wird **vor** der Schleife gelesen, jede weitere **am Ende** des Durchlaufs. Vergisst du das Lesen am Ende, liest das Programm immer wieder dieselbe Zeile und hört nie auf. -::: - -::: angeberwissen -Wo eine Zeile endet, ist nicht überall gleich: Windows schreibt zwei unsichtbare Zeichen, „Wagenrücklauf“ und „Zeilenvorschub“, Linux und macOS nur den Zeilenvorschub. Die Namen stammen von der Schreibmaschine, bei der der Papierwagen zurückfuhr und das Papier eine Zeile weiterrückte. \`readLine()\` kommt mit beidem klar. -::: - -## Übung: Wie oft kommt der Fuchs vor? - -::: übung l24-java-fuchs -titel: Wie oft kommt der Fuchs vor? -code: java -auftrag: Lies das Logbuch mit dem BufferedReader und zähle die Zeilen, in denen **Fuchs** vorkommt. Gib am Ende **Fuchs:** und die Anzahl aus. -start: l24-java-fuchs-start.visustruct -test: - -> Fuchs: 3 -braucht: whileSchleife, verzweigung -tipp: Lege vor der Schleife \`int anzahl = 0;\` an. In der Schleife prüfst du \`zeile.contains("Fuchs")\`. -tipp: Das \`zeile = leser.readLine();\` gehört ans Ende der Schleife, nach dem if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Automatisch schließen - -Damit \`close()\` auch nach einer Exception nicht vergessen wird, gibt es eine Kurzform von try: Was in den runden Klammern hinter \`try\` angelegt wird, schließt Java am Ende von selbst. - -\`\`\`java -try (BufferedReader leser = new BufferedReader(new FileReader("logbuch.txt"))) { - String zeile = leser.readLine(); - while (zeile != null) { - System.out.println(zeile); - zeile = leser.readLine(); - } -} catch (IOException e) { - System.out.println("Das Logbuch fehlt."); -} -\`\`\` - -Das heißt **try-with-resources**. \`IOException\` fängt alle Fehler beim Lesen und Schreiben auf, auch eine fehlende Datei. - -> Wie try und catch läuft auch try-with-resources nur mit echtem Java (Lektion 22). In der Simulation schreibst du \`close()\` selbst. - -## Die Abkürzung: Files - -Seit Java 11 geht es noch kürzer. \`Files.readString\` liest die ganze Datei auf einmal, das kennst du aus Lektion 17. Mit \`split("\\n")\` zerlegst du den Text in ein Array von Zeilen: - -\`\`\`java -import java.nio.file.*; - -String text = Files.readString(Path.of("logbuch.txt")); -String[] zeilen = text.split("\\n"); -for (int i = 0; i < zeilen.length; i++) { - System.out.println(zeilen[i]); -} -\`\`\` - -Jetzt stehen alle Zeilen im Array. Du kannst sie in beliebiger Reihenfolge ansehen, zum Beispiel rückwärts oder nur jede zweite. - -| Weg | Gut für | -|---|---| -| \`Scanner\` | kleine Dateien, Zahlen und Wörter lesen | -| \`BufferedReader\` | große Dateien, Zeile für Zeile | -| \`Files.readString\` | kleine Dateien, die ganz ins Programm passen | - -::: ludwig -Eine Datei mit einer Million Zeilen liest du besser mit dem BufferedReader Zeile für Zeile. Mit \`Files.readString\` müsste die ganze Datei auf einmal in den Speicher. -::: - -## Übung: Der längste Eintrag - -::: übung l24-java-laengster -titel: Der längste Eintrag -code: java -auftrag: Im Startcode stehen die Zeilen des Logbuchs schon im Array \`zeilen\`. Finde die längste Zeile und gib sie so aus: **Längster Eintrag:** und dann die Zeile. -start: l24-java-laengster-start.visustruct -test: - -> Längster Eintrag: Mi 07:00 Zora findet Krümel vor dem Fuchsbau -braucht: forSchleife, verzweigung -tipp: Merke dir die bisher längste Zeile in \`String laengster = zeilen[0];\` und gehe die anderen Zeilen mit einer for-Schleife durch. -tipp: Ist \`zeilen[i].length() > laengster.length()\`, wird \`zeilen[i]\` der neue Längste. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Spiel: Datei-Detektiv - -::: spiel frage -titel: Spiel: Datei-Detektiv -intro: Wer hat den Kuchen genommen? Jedes Programm durchsucht das **Logbuch** von oben. Sag voraus, was es ausgibt, und sammle so die Hinweise. Fünf Runden. -frage: Was gibt das Programm aus? - -runde: - String zeile = leser.readLine(); - zeile = leser.readLine(); - System.out.println(zeile.substring(9)); -- Ludwig füttert die Ziegen -- [x] Zora liest im Turm -- Mo 12:30 Zora liest im Turm -> Das zweite \`readLine()\` liefert die zweite Zeile. Ab Index 9 beginnt der Text nach der Uhrzeit. - -runde: - int n = 0; - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.startsWith("Di")) n++; - zeile = leser.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Vier Einträge stammen vom Dienstag. - -runde: - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.contains("Kuchen")) { - System.out.println(zeile.substring(3, 8)); - } - zeile = leser.readLine(); - } -- [x] 09:00\\n23:55 -- 09:00 -- Di\\nDi -> Zwei Zeilen enthalten „Kuchen“. \`substring(3, 8)\` schneidet die Uhrzeit heraus. - -runde: - String zeile = leser.readLine(); - String letzte = ""; - while (zeile != null) { - if (zeile.contains("Fuchs")) letzte = zeile; - zeile = leser.readLine(); - } - System.out.println(letzte); -- Di 16:20 Fuchs fragt nach dem Rezept -- [x] Mi 07:00 Zora findet Krümel vor dem Fuchsbau -- Mo 18:00 Fuchs schleicht am Tor vorbei -> \`letzte\` wird bei jedem Treffer überschrieben. Am Ende steht der letzte Treffer darin. „Fuchsbau“ enthält auch „Fuchs“. - -runde: - String zeile = leser.readLine(); - while (zeile != null) { - if (zeile.contains("Krümel")) { - int bei = zeile.indexOf("vor dem "); - System.out.println(zeile.substring(bei + 8)); - } - zeile = leser.readLine(); - } -- [x] Fuchsbau -- vor dem Fuchsbau -- Krümel -> Die Krümel liegen vor dem Fuchsbau. Der Fuchs hat nach dem Rezept gefragt, und um 23:55 war der Kuchen weg. Fall gelöst! -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Datei mit BufferedReader und readLine lesen. → Lesen mit BufferedReader -- Ich kann das Dateiende erkennen, weil readLine dort null liefert (zeile != null). → Lesen mit BufferedReader -- Ich kann zählen, wie oft ein Wort in einer Datei vorkommt. → Übung: Wie oft kommt der Fuchs vor? -- Ich kann eine ganze Datei mit Files.readString lesen und mit split in Zeilen zerlegen. → Die Abkürzung: Files -- Ich kann den längsten Eintrag einer Datei finden. → Übung: Der längste Eintrag -::: - -## Wissenstest - -::: quiz -? Was liefert readLine(), wenn die Datei zu Ende ist? -→ Lesen mit BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null heißt: Es gibt keinen Text mehr. - -? Warum steht in der Schleife am Ende noch einmal zeile = leser.readLine()? -→ Lesen mit BufferedReader -- [ ] Damit die Datei geschlossen wird. -- [x] Sonst bleibt zeile immer gleich, und die Schleife hört nie auf. -- [ ] Damit die erste Zeile doppelt ausgegeben wird. - -? Was macht try-with-resources? -→ Lesen mit BufferedReader -- [ ] Es liest die Datei schneller. -- [x] Es schließt die Datei am Ende von selbst. -- [ ] Es verhindert jede Exception. - -? Ordne jedem Weg zu, wofür er gut ist. -→ Die Abkürzung: Files -= BufferedReader -> große Dateien, Zeile für Zeile -= Files.readString -> kleine Dateien auf einmal -= Scanner -> Zahlen und Wörter lesen -::: -`,dw=`--- -titel: Tabellen als CSV -bereich: Dateien -kurz: Eine Tabelle als CSV-Datei lesen, jede Zeile mit split zerlegen und mit den Zahlen rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- den Aufbau einer CSV-Datei erklären: Kopfzeile, Datensätze, Trennzeichen -- eine Zeile mit split zerlegen und mit Integer.parseInt eine Zahl daraus machen -- die Kopfzeile überspringen, bevor ich rechne -- einen Durchschnitt aus einer Spalte einer CSV-Datei berechnen -- den besten Wert in einer Spalte einer CSV-Datei finden -- eine Stärke und eine Schwäche von CSV nennen -::: - -## Eine Tabelle in einer Textdatei - -Frau Ziege, die Lehrerin der Burgschule, hat die Noten ihrer Klasse als Tabelle gespeichert: - -| Name | Mathe | Deutsch | Englisch | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Fuchs | 4 | 3 | 5 | -| Hase | 2 | 1 | 3 | - -In der Datei sieht die Tabelle so aus: - -::: datei klasse.csv -Name;Mathe;Deutsch;Englisch -Ludwig;2;3;1 -Zora;1;2;2 -Fuchs;4;3;5 -Hase;2;1;3 -::: - -Das ist eine **CSV-Datei**. CSV heißt „Comma-Separated Values“, also „durch Kommas getrennte Werte“. Jede Zeile ist eine Zeile der Tabelle, die Spalten sind durch ein Trennzeichen getrennt. In Deutschland nimmt man meist das **Semikolon** \`;\`, weil das Komma schon in Zahlen wie \`2,5\` steckt. - -- Die erste Zeile ist die **Kopfzeile**. Sie sagt, was in den Spalten steht. -- Jede weitere Zeile ist ein **Datensatz**, hier eine Schülerin oder ein Schüler. -- Excel, LibreOffice und Numbers öffnen CSV-Dateien direkt als Tabelle. - -## Eine Zeile zerlegen mit split - -\`split(";")\` kennst du aus Lektion 17. Es zerlegt einen Text an jedem Semikolon und liefert ein Array: - -\`\`\`java -String zeile = "Zora;1;2;2"; -String[] teile = zeile.split(";"); -// teile[0] ist "Zora", teile[1] ist "1", teile[2] ist "2", teile[3] ist "2" -\`\`\` - -Die Noten sind danach noch **Text**. Rechnen kannst du erst, wenn du sie mit \`Integer.parseInt\` in eine Zahl verwandelst: - -\`\`\`java -int mathe = Integer.parseInt(teile[1]); -\`\`\` - -::: diagramm dt-csv.visustruct -Eine CSV-Zeile zerlegen und die Mathenote als Zahl lesen. -::: - -## Die ganze Datei lesen - -Für die ganze Datei kombinierst du den BufferedReader aus Lektion 24 mit \`split\`. Die Kopfzeile enthält keine Noten, deshalb liest du sie vor der Schleife und überspringst sie: - -\`\`\`java -BufferedReader leser = new BufferedReader(new FileReader("klasse.csv")); -String zeile = leser.readLine(); // Kopfzeile -zeile = leser.readLine(); // erster Datensatz -while (zeile != null) { - String[] teile = zeile.split(";"); - System.out.println(teile[0] + ": Mathe " + teile[1]); - zeile = leser.readLine(); -} -leser.close(); -\`\`\` - -::: ludwig -Ohne das zweite \`readLine()\` vor der Schleife landet die Kopfzeile in der Schleife. Dann versucht \`Integer.parseInt("Mathe")\` aus dem Wort eine Zahl zu machen, und Java bricht mit einer \`NumberFormatException\` ab. -::: - -## Übung: Notenschnitt in Mathe - -::: übung l25-java-schnitt -titel: Notenschnitt in Mathe -code: java -auftrag: Berechne den Notenschnitt in Mathe. Überspringe die Kopfzeile, addiere die Mathenoten (Spalte 1) und teile durch die Anzahl der Datensätze. Gib **Schnitt Mathe:** und den Schnitt aus. -start: l25-java-schnitt-start.visustruct -test: - -> Schnitt Mathe: 2.25 -braucht: whileSchleife -tipp: Lege vor der Schleife \`double summe = 0;\` und \`int anzahl = 0;\` an. Mit \`double\` wird beim Teilen nichts abgeschnitten. -tipp: In der Schleife: \`String[] teile = zeile.split(";");\`, dann \`summe = summe + Integer.parseInt(teile[1]);\` und \`anzahl++;\`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Übung: Beste Note in Englisch - -::: übung l25-java-beste -titel: Beste Note in Englisch -code: java -auftrag: Wer hat die beste Note in Englisch (Spalte 3)? Gib **Beste Note in Englisch:**, den Namen und in Klammern die Note aus. -start: l25-java-beste-start.visustruct -test: - -> Beste Note in Englisch: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Merke dir die bisher beste Note in \`int besteNote = 7;\` und den Namen in \`String besterName = "";\`. Jede echte Note ist besser als 7. -tipp: Ist \`note < besteNote\`, merkst du dir die neue Note und \`teile[0]\` als Namen. -lösung: l25-java-beste-loesung.visustruct -::: - -## Stärken und Schwächen von CSV - -| Gut | Schwierig | -|---|---| -| Tabellen brauchen wenig Platz. | Steht das Trennzeichen im Text, zum Beispiel \`Hase;sehr gut; fleißig\`, zerfällt die Zeile in zu viele Teile. | -| Excel und andere Programme öffnen die Datei direkt. | Alles ist eine flache Tabelle. Hat ein Tier mehrere Lieblingsessen, passt das nicht gut in eine Zelle. | -| Jedes Programm kann sie mit \`split\` lesen. | Die Datei sagt nicht, ob \`1\` eine Zahl oder ein Text ist. | - -::: ludwig -Excel speichert CSV-Dateien in Deutschland mit Semikolon, in England und den USA mit Komma. Wer eine Datei aus dem Ausland öffnet, sieht deshalb manchmal alles in einer einzigen Spalte. -::: - -## Spiel: Kaputte Zeile - -::: spiel bombe -titel: Spiel: Kaputte Zeile -intro: In jeder CSV-Datei ist **genau eine Zeile kaputt**, und die Bombe tickt. Vergleiche jede Zeile mit der Kopfzeile und tippe auf die kaputte Zeile, bevor die Zeit abläuft. Fünf Runden, je 20 Sekunden. -zeit: 20 -daten: csv - -runde: - Name;Mathe;Deutsch;Englisch - Ludwig;2;3;1 - Zora;1 - Fuchs;4;3;5 -frage: Jede Zeile braucht vier Spalten. -fehler: 3 -besser: Zora;1;2;2 -> Bei Zora fehlen zwei Noten. \`teile[3]\` gibt es dann nicht, und Java bricht mit einer \`ArrayIndexOutOfBoundsException\` ab. - -runde: - Name;Note;Bemerkung - Ludwig;2;arbeitet gut mit - Hase;1;sehr gut; fleißig - Zora;1;liest viel -frage: Jede Zeile braucht drei Spalten. -fehler: 3 -besser: Hase;1;sehr gut, fleißig -> Das Semikolon in der Bemerkung trennt eine vierte Spalte ab. Im Text darf das Trennzeichen nicht vorkommen. - -runde: - Name;Mathe;Deutsch;Englisch - Ludwig;2;3;1 - Zora;1;2;2 - Fuchs,4,3,5 -frage: Getrennt wird mit Semikolon. -fehler: 4 -besser: Fuchs;4;3;5 -> Hier stehen Kommas statt Semikolons. \`split(";")\` findet kein Semikolon und liefert die ganze Zeile als ein einziges Teil. - -runde: - Name;Mathe;Deutsch;Englisch - Hase;2;1;3 - Fuchs;vier;3;5 - Ludwig;2;3;1 -frage: Noten sind Zahlen. -fehler: 3 -besser: Fuchs;4;3;5 -> \`Integer.parseInt("vier")\` kann aus dem Wort keine Zahl machen und wirft eine \`NumberFormatException\`. - -runde: - Name;Mathe;Deutsch;Englisch - Zora;1;2;2 - Hase;2;1;3 - Ludwig;2;;1 -frage: Kein Feld darf leer sein. -fehler: 4 -besser: Ludwig;2;3;1 -> Zwischen den beiden Semikolons steht nichts. \`Integer.parseInt("")\` wirft eine \`NumberFormatException\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann den Aufbau einer CSV-Datei erklären: Kopfzeile, Datensätze, Trennzeichen. → Eine Tabelle in einer Textdatei -- Ich kann eine Zeile mit split zerlegen und mit Integer.parseInt eine Zahl daraus machen. → Eine Zeile zerlegen mit split -- Ich kann die Kopfzeile überspringen, bevor ich rechne. → Die ganze Datei lesen -- Ich kann einen Durchschnitt aus einer Spalte einer CSV-Datei berechnen. → Übung: Notenschnitt in Mathe -- Ich kann den besten Wert in einer Spalte einer CSV-Datei finden. → Übung: Beste Note in Englisch -- Ich kann eine Stärke und eine Schwäche von CSV nennen. → Stärken und Schwächen von CSV -::: - -## Wissenstest - -::: quiz -? Was liefert "Hase;2;1;3".split(";")[2]? -→ Eine Zeile zerlegen mit split -- [ ] "2" -- [x] "1" -- [ ] 1 -> Die Zählung beginnt bei 0. Und das Ergebnis ist ein Text, keine Zahl. - -? Warum liest das Programm vor der Schleife zweimal readLine()? -→ Die ganze Datei lesen -- [ ] Damit die Datei schneller gelesen wird. -- [x] Die erste Zeile ist die Kopfzeile ohne Noten. Sie wird übersprungen. -- [ ] Weil readLine immer zwei Zeilen braucht. - -? Was passiert bei Integer.parseInt("Mathe")? -→ Eine Zeile zerlegen mit split -- [ ] Es liefert 0. -- [x] Java wirft eine NumberFormatException. -- [ ] Es liefert die Länge des Wortes. - -? Ordne zu. -→ Stärken und Schwächen von CSV -= Kopfzeile -> sagt, was in den Spalten steht -= Datensatz -> eine Zeile mit Werten -= Trennzeichen -> trennt die Spalten, meist ; -::: -`,hw=`--- -titel: Daten als JSON -bereich: Dateien -kurz: JSON-Dateien verstehen, Werte mit indexOf und substring herausholen und selbst JSON schreiben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Objekte, Schlüssel, Werte und Listen in JSON erkennen -- mit indexOf und substring einen Wert aus einer JSON-Zeile holen -- alle Werte zu einem Schlüssel aus einer JSON-Datei ausgeben -- mit + und \\" einen JSON-Eintrag bauen und speichern -- Daten als JSON-Datei speichern -- eine Stärke und eine Schwäche von JSON nennen -::: - -## Daten mit Namen - -Der Burgzoo speichert seine Tiere in einer Datei \`zoo.json\`: - -::: datei zoo.json -{ - "zoo": "Burgzoo", - "tiere": [ - {"name": "Ludwig", "art": "Geißbock", "alter": 7}, - {"name": "Zora", "art": "Ziege", "alter": 6}, - {"name": "Fuchs", "art": "Rotfuchs", "alter": 4}, - {"name": "Hase", "art": "Feldhase", "alter": 2} - ] -} -::: - -Das ist **JSON**, die „JavaScript Object Notation“. Fast jede Web-App und jedes Spiel schickt und speichert Daten so. Anders als in einer CSV-Datei steht vor jedem Wert sein **Name**, der **Schlüssel**. - -| Zeichen | Bedeutung | Beispiel | -|---|---|---| -| \`{ … }\` | ein **Objekt**: Paare aus Schlüssel und Wert | \`{"name": "Zora", "alter": 6}\` | -| \`"schlüssel": wert\` | ein Paar, getrennt durch einen Doppelpunkt | \`"alter": 6\` | -| \`[ … ]\` | eine **Liste** von Werten, wie ein Array | \`"tiere": [ … ]\` | -| \`,\` | trennt die Paare und die Einträge einer Liste | | -| \`"…"\` | ein Text. Zahlen und \`true\`/\`false\` stehen ohne Anführungszeichen. | \`"Ziege"\`, \`6\` | - -Objekte und Listen lassen sich **verschachteln**: Das ganze Zoo-Objekt enthält die Liste \`tiere\`, und jedes Tier ist wieder ein Objekt. Wie bei Arrays zählt die Liste ab 0: \`tiere[1].name\` ist \`"Zora"\`. - -::: angeberwissen -JSON hat Douglas Crockford Anfang der 2000er bekannt gemacht. In die Lizenz seines JSON-Programms schrieb er: „Die Software soll für Gutes verwendet werden, nicht für Böses.“ Die Firma IBM fragte deshalb nach, ob sie es trotzdem benutzen darf. Er antwortete, IBM und seine Kunden dürften es auch für Böses verwenden. -::: - -## Einen Wert herausholen - -Profis lesen JSON mit einer Bibliothek, zum Beispiel **Gson**. Sie gehört nicht zu Java und muss erst eingebunden werden. Für unsere Zoo-Datei reichen die String-Methoden aus Lektion 17, denn jedes Tier steht in einer eigenen Zeile. - -Ein Anführungszeichen im Text schreibst du in Java als \`\\"\`. Der Text \`"\\"name\\": \\""\` ist also \`"name": "\`, genau das, was vor jedem Namen steht. - -\`\`\`java -String zeile = "{\\"name\\": \\"Zora\\", \\"art\\": \\"Ziege\\", \\"alter\\": 6},"; -int start = zeile.indexOf("\\"name\\": \\"") + 9; -int ende = zeile.indexOf("\\"", start); -String name = zeile.substring(start, ende); -\`\`\` - -- \`indexOf("\\"name\\": \\"")\` findet den Anfang von \`"name": "\`. Das sind 9 Zeichen, also beginnt der Name 9 Zeichen weiter. -- \`indexOf("\\"", start)\` sucht **ab** \`start\` das nächste Anführungszeichen. Dort endet der Name. -- \`substring(start, ende)\` schneidet den Namen heraus: \`Zora\`. - -::: diagramm dt-json.visustruct -Den Namen aus einer JSON-Zeile holen. -::: - -## Übung: Alle Namen aus dem Zoo - -::: übung l26-java-namen -titel: Alle Namen aus dem Zoo -code: java -auftrag: Lies \`zoo.json\` Zeile für Zeile. Gib in jeder Zeile, die \`"name"\` enthält, nur den Namen aus. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Fuchs | Hase -braucht: whileSchleife, verzweigung -tipp: Prüfe mit \`zeile.contains("\\"name\\"")\`, ob in der Zeile ein Name steht. Die anderen Zeilen überspringst du. -tipp: Im if: \`int start = zeile.indexOf("\\"name\\": \\"") + 9;\`, dann \`int ende = zeile.indexOf("\\"", start);\` und \`System.out.println(zeile.substring(start, ende));\`. -lösung: l26-java-namen-loesung.visustruct -::: - -## JSON schreiben - -Zum Schreiben setzt du den Text mit \`+\` zusammen und schreibst ihn mit dem PrintWriter aus Lektion 23 in die Datei. Texte im JSON brauchen Anführungszeichen, also \`\\"\` im Java-Text, Zahlen nicht: - -\`\`\`java -String name = "Zora"; -int punkte = 15; -String eintrag = "{\\"name\\": \\"" + name + "\\", \\"punkte\\": " + punkte + "}"; -// eintrag ist {"name": "Zora", "punkte": 15} -\`\`\` - -Bei einer Liste steht zwischen den Einträgen ein Komma, hinter dem letzten aber **keins**. Das prüfst du mit einem if. - -::: ludwig -Ein einziges vergessenes Anführungszeichen oder ein Komma zu viel, und kein Programm kann die Datei mehr lesen. JSON ist streng. Darum benutzen Profis zum Schreiben auch eine Bibliothek. -::: - -## Übung: Punkte als JSON speichern - -::: übung l26-java-schreiben -titel: Punkte als JSON speichern -code: java -auftrag: Speichere die Punkte aus dem Quiz-Turnier als Liste in \`punkte.json\`. Jede Zeile enthält ein Objekt mit **name** und **punkte**, zwischen den Objekten steht ein Komma. Gib am Ende **3 Einträge gespeichert** aus. -start: l26-java-schreiben-start.visustruct -test: - -> 3 Einträge gespeichert -datei: punkte.json -> [ | {"name": "Ludwig", "punkte": 12}, | {"name": "Zora", "punkte": 15}, | {"name": "Fuchs", "punkte": 9} | ] -braucht: forSchleife, verzweigung -tipp: Gehe mit \`for (int i = 0; i < namen.length; i++)\` durch die Arrays. Baue den Eintrag mit \`" {\\"name\\": \\"" + namen[i] + "\\", \\"punkte\\": " + punkte[i] + "}"\`. -tipp: Ist \`i < namen.length - 1\`, hängst du noch \`","\` an. Schreibe nach der Schleife \`"]"\` und schließe die Datei. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Stärken und Schwächen von JSON - -| Gut | Schwierig | -|---|---| -| Jeder Wert hat einen Namen. Man sieht sofort, was \`6\` bedeutet. | Die Datei ist länger als eine CSV-Datei, weil die Schlüssel in jeder Zeile stehen. | -| Daten lassen sich verschachteln, zum Beispiel eine Liste in einem Objekt. | Java kann JSON nicht von selbst lesen. Man braucht eine Bibliothek wie Gson. | -| JSON ist der Standard im Web. Fast jede Programmiersprache kennt es. | Ein Zeichen zu viel oder zu wenig macht die ganze Datei unlesbar. | - -## Spiel: Welcher Schlüssel? - -::: spiel frage -titel: Spiel: Welcher Schlüssel? -intro: Ludwig sucht Werte in JSON-Dateien. Lies die Datei und sag, welcher Wert gemeint ist. Fünf Runden. - -runde: - {"name": "Zora", "art": "Ziege", "alter": 6} -frage: Was ist der Wert von **alter**? -- "alter" -- [x] 6 -- "Ziege" -> Vor dem Doppelpunkt steht der Schlüssel, dahinter der Wert. Zahlen stehen ohne Anführungszeichen. - -runde: - { - "tiere": [ - {"name": "Ludwig", "alter": 7}, - {"name": "Zora", "alter": 6}, - {"name": "Fuchs", "alter": 4} - ] - } -frage: Was ist **tiere[1].name**? -- Ludwig -- [x] Zora -- Fuchs -> Die Liste zählt wie ein Array ab 0. \`tiere[1]\` ist das zweite Tier. - -runde: - { - "zoo": "Burgzoo", - "chef": {"name": "Ludwig", "art": "Geißbock"} - } -frage: Wie kommst du an **Geißbock**? -- [x] chef.art -- art -- zoo.chef.art -> \`art\` steckt im Objekt \`chef\`. Darum geht der Weg über \`chef\`. - -runde: - { - "name": "Hase", - "lieblingsessen": ["Karotten", "Klee", "Löwenzahn"] - } -frage: Was ist **lieblingsessen[2]**? -- Klee -- Karotten -- [x] Löwenzahn -> Index 0 ist Karotten, 1 ist Klee, 2 ist Löwenzahn. So etwas passt in CSV nur schwer in eine Zelle. - -runde: - {"name": "Fuchs", "alter": 4, "hungrig": true} -frage: Welcher Schlüssel hat einen Wahrheitswert? -- name -- alter -- [x] hungrig -> \`true\` und \`false\` stehen wie Zahlen ohne Anführungszeichen. In Java wäre das ein \`boolean\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Objekte, Schlüssel, Werte und Listen in JSON erkennen. → Daten mit Namen -- Ich kann mit indexOf und substring einen Wert aus einer JSON-Zeile holen. → Einen Wert herausholen -- Ich kann alle Werte zu einem Schlüssel aus einer JSON-Datei ausgeben. → Übung: Alle Namen aus dem Zoo -- Ich kann mit + und \\" einen JSON-Eintrag bauen und speichern. → JSON schreiben -- Ich kann Daten als JSON-Datei speichern. → Übung: Punkte als JSON speichern -- Ich kann eine Stärke und eine Schwäche von JSON nennen. → Stärken und Schwächen von JSON -::: - -## Wissenstest - -::: quiz -? Was steht in JSON vor jedem Wert? -→ Daten mit Namen -- [ ] seine Zeilennummer -- [x] sein Schlüssel, zum Beispiel "name" -- [ ] ein Semikolon -> Schlüssel und Wert werden durch einen Doppelpunkt getrennt. - -? Wie schreibst du ein Anführungszeichen in einem Java-Text? -→ JSON schreiben -- [ ] "" -- [x] \\" -- [ ] '"' - -? Was ist bei {"tiere": [{"name": "Ludwig"}, {"name": "Zora"}]} der Wert von tiere[0].name? -→ Daten mit Namen -- [x] Ludwig -- [ ] Zora -- [ ] tiere -> Die Liste zählt ab 0. - -? Ordne zu. -→ Stärken und Schwächen von JSON -= { } -> ein Objekt mit Schlüsseln und Werten -= [ ] -> eine Liste -= : -> trennt Schlüssel und Wert -::: -`,gw=`--- -titel: Formate im Vergleich -bereich: Dateien -kurz: Dieselben Daten als txt, CSV und JSON vergleichen, das passende Format wählen und eine Datei in ein anderes Format umwandeln. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- dieselben Daten als txt, CSV und JSON erkennen -- Stärken und Schwächen von txt, CSV und JSON vergleichen -- eine CSV-Datei in Sätze umwandeln -- eine CSV-Datei in JSON umwandeln -::: - -## Dreimal dieselben Tiere - -Ludwig hat die Tiere der Burg in drei Dateien gespeichert. In allen steht dasselbe, nur anders aufgeschrieben. - -Als Text, so wie man es einem Menschen schreiben würde: - -::: datei tiere.txt -Ludwig (Geißbock) ist 7 Jahre alt. -Zora (Ziege) ist 6 Jahre alt. -Fuchs (Rotfuchs) ist 4 Jahre alt. -::: - -Als Tabelle in CSV: - -::: datei tiere.csv -Name;Art;Alter -Ludwig;Geißbock;7 -Zora;Ziege;6 -Fuchs;Rotfuchs;4 -::: - -Als JSON: - -::: datei tiere.json -[ - {"name": "Ludwig", "art": "Geißbock", "alter": 7}, - {"name": "Zora", "art": "Ziege", "alter": 6}, - {"name": "Fuchs", "art": "Rotfuchs", "alter": 4} -] -::: - -## Was kann welches Format? - -| | txt | CSV | JSON | -|---|---|---|---| -| Für Menschen gut lesbar | ja | geht so | geht so | -| Feste Ordnung für Programme | nein | ja, Spalten | ja, Schlüssel | -| Was bedeutet ein Wert? | steht im Satz | steht in der Kopfzeile | steht direkt davor | -| Verschachteln (Liste in einem Eintrag) | nein | schwer | ja | -| Öffnen in Excel | nein | ja | nein | -| Lesen in Java | Scanner, BufferedReader | dazu \`split\` | String-Methoden oder eine Bibliothek | -| Größe | klein | am kleinsten | am größten | - -Kurz gesagt: - -- **txt** für Texte, die Menschen lesen: Briefe, Notizen, ein Logbuch. -- **CSV** für Tabellen: Noten, Messwerte, eine Bestenliste. Jede Zeile hat dieselben Spalten. -- **JSON** für Daten mit Struktur: Spielstände, Einstellungen, alles, was zwischen Programmen und im Web hin- und hergeht. - -::: ludwig -Wenn deine Wetter-App die Temperatur holt, kommt die Antwort fast immer als JSON. Und wenn die Lehrkraft die Noten aus dem Schulprogramm exportiert, bekommt sie oft eine CSV-Datei. -::: - -## Übung: Aus CSV werden Sätze - -::: übung l27-java-saetze -titel: Aus CSV werden Sätze -code: java -auftrag: Wandle \`tiere.csv\` in Text um. Schreibe für jedes Tier einen Satz wie **Ludwig (Geißbock) ist 7 Jahre alt.** in die Datei \`saetze.txt\`. Gib am Ende **3 Sätze gespeichert** aus. -start: l27-java-saetze-start.visustruct -test: - -> 3 Sätze gespeichert -datei: saetze.txt -> Ludwig (Geißbock) ist 7 Jahre alt. | Zora (Ziege) ist 6 Jahre alt. | Fuchs (Rotfuchs) ist 4 Jahre alt. -braucht: whileSchleife -tipp: Die Kopfzeile ist im Startcode schon übersprungen. Zerlege jede Zeile mit \`String[] teile = zeile.split(";");\`. -tipp: Der Satz ist \`teile[0] + " (" + teile[1] + ") ist " + teile[2] + " Jahre alt."\`. Zähle mit \`anzahl++\` mit und lies am Ende der Schleife die nächste Zeile. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Übung: Aus CSV wird JSON - -::: übung l27-java-json -titel: Aus CSV wird JSON -code: java -auftrag: Wandle \`tiere.csv\` in JSON um und speichere es in \`tiere-neu.json\`, genau wie \`tiere.json\` oben. Gib am Ende **3 Tiere gespeichert** aus. -start: l27-java-json-start.visustruct -test: - -> 3 Tiere gespeichert -datei: tiere-neu.json -> [ | {"name": "Ludwig", "art": "Geißbock", "alter": 7}, | {"name": "Zora", "art": "Ziege", "alter": 6}, | {"name": "Fuchs", "art": "Rotfuchs", "alter": 4} | ] -braucht: forSchleife, verzweigung -tipp: \`zeilen[0]\` ist die Kopfzeile. Beginne die for-Schleife deshalb bei \`i = 1\` und zerlege \`zeilen[i]\` mit \`split(";")\`. -tipp: Baue den Eintrag wie in Lektion 26 mit \`\\"\`. Das Alter ist eine Zahl und steht ohne Anführungszeichen. Ein Komma hängst du nur an, wenn \`i < zeilen.length - 1\` ist. -lösung: l27-java-json-loesung.visustruct -::: - -## Spiel: Welches Format passt? - -::: spiel frage -titel: Spiel: Welches Format passt? -intro: Ludwig will Daten speichern und weiß nicht, welches Format er nehmen soll. Hilf ihm. Sechs Runden. -antworten: txt | CSV | JSON - -runde: -frage: Die Noten der ganzen Klasse sollen in Excel geöffnet werden. -richtig: CSV -> Noten sind eine Tabelle, und Excel öffnet CSV-Dateien direkt. - -runde: -frage: Ludwig schreibt Zora einen Brief. -richtig: txt -> Ein Brief ist Text für Menschen. Er braucht keine Spalten und keine Schlüssel. - -runde: -frage: Ein Spielstand mit Name, Level und einer Liste aller gesammelten Schlüssel. -richtig: JSON -> Eine Liste in einem Eintrag lässt sich in JSON verschachteln. In CSV passt sie nur schwer in eine Zelle. - -runde: -frage: Ein Messgerät speichert jede Minute Uhrzeit und Temperatur, ein ganzes Jahr lang. -richtig: CSV -> Viele gleiche Zeilen mit denselben Spalten: CSV ist dafür am kleinsten. JSON würde die Schlüssel in jeder Zeile wiederholen. - -runde: -frage: Eine Wetter-App holt die Vorhersage von einem Server im Internet. -richtig: JSON -> JSON ist der Standard im Web. Fast jede App bekommt ihre Daten so. - -runde: -frage: Das Logbuch der Burg, in dem jeder Eintrag ein kurzer Satz ist. -richtig: txt -> Jede Zeile ist ein Satz für Menschen. Gelesen wird sie Zeile für Zeile, wie in Lektion 24. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann dieselben Daten als txt, CSV und JSON erkennen. → Dreimal dieselben Tiere -- Ich kann Stärken und Schwächen von txt, CSV und JSON vergleichen. → Was kann welches Format? -- Ich kann eine CSV-Datei in Sätze umwandeln. → Übung: Aus CSV werden Sätze -- Ich kann eine CSV-Datei in JSON umwandeln. → Übung: Aus CSV wird JSON -::: - -## Wissenstest - -::: quiz -? Welches Format öffnet Excel direkt als Tabelle? -→ Was kann welches Format? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Warum ist eine JSON-Datei meist größer als eine CSV-Datei mit denselben Daten? -→ Was kann welches Format? -- [ ] Weil JSON mehr Zahlen speichert. -- [x] Weil die Schlüssel in jedem Eintrag wiederholt werden. -- [ ] Weil JSON keine Kommas benutzt. - -? In welchem Format sagt jeder Wert selbst, was er bedeutet? -→ Was kann welches Format? -- [ ] txt -- [ ] CSV -- [x] JSON -> In JSON steht der Schlüssel direkt vor dem Wert, zum Beispiel "alter": 7. - -? Ordne jedem Zweck ein Format zu. -→ Was kann welches Format? -= ein Brief an Zora -> txt -= die Notenliste der Klasse -> CSV -= ein Spielstand mit Listen -> JSON -::: -`,pw=`--- -titel: Dein erstes Fenster -bereich: Fenster mit Swing -kurz: Mit Java und Swing ein eigenes Fenster öffnen, Zeile für Zeile erklärt. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- im Bereich Code „Echtes Java“ einschalten -- ein Fenster mit Titel und Größe öffnen -- erklären, was jede Zeile des Fensterprogramms macht -- erklären, warum setVisible(true) am Ende steht -::: - -## Programme mit Fenstern - -Bisher haben deine Programme Text in die Konsole geschrieben. Die meisten Programme, die du kennst, haben aber **Fenster** mit Knöpfen und Textfeldern. Das nennt man eine grafische Oberfläche. - -Java bringt dafür einen Werkzeugkasten mit: **Swing**. In VisuStruct schaltest du ihn so ein: - -1. Öffne rechts den Bereich [Code](#zeige-codelive). -2. Klicke oben rechts auf das [Zahnrad](#zeige-einstellungen) und wähle als **Programmiersprache** Java. -3. Setze darunter im Abschnitt Java den Haken bei **Echtes Java (mit Swing)**. - -Beim ersten [▶︎ Ausführen](#zeige-ausfuehren) lädt VisuStruct einmalig etwa 40 MB, das dauert einen Moment. Danach läuft dein Code als echtes Java, und deine Fenster erscheinen im Bereich Code im Feld **Java-Fenster** über der Konsole. - -> Mit „Echtes Java“ funktionieren Eingaben über die Konsole (\`Scanner\`) noch nicht. Für Programme mit Eingabe schaltest du den Haken wieder aus. - -::: angeberwissen -Swing gibt es seit 1998. Davor hatte Java nur das ältere AWT mit einer Klasse \`Frame\`. Damit man die neuen Bausteine nicht verwechselt, beginnen in Swing fast alle Namen mit **J**: \`JFrame\`, \`JButton\`, \`JLabel\`. Am J erkennst du Swing also sofort. -::: - -## Das ganze Programm - -So sieht das kleinste Programm aus, das ein Fenster öffnet. Tippe es im Bereich Code ab und klicke auf [▶︎ Ausführen](#zeige-ausfuehren): - -\`\`\`java -import javax.swing.*; - -public class MeinFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Mein erstes Fenster"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); - } -} -\`\`\` - -Ein leeres graues Fenster mit dem Titel „Mein erstes Fenster“ erscheint. Mehr nicht, aber es ist dein eigenes Fenster! - -Den Rahmen mit \`public class\` und \`main\` kennst du schon aus der Lektion Java. Neu sind die erste Zeile und die vier Zeilen in \`main\`. Die schauen wir uns jetzt einzeln an. - -::: ludwig -Schau dir das Struktogramm neben dem Code an: Jede Zeile in \`main\` ist ein Kasten, alle untereinander. Ein Fensterprogramm ist am Anfang also nur eine Sequenz. -::: - -## Zeile für Zeile - -| Zeile | Was sie macht | -|---|---| -| \`import javax.swing.*;\` | Holt den Werkzeugkasten Swing ins Programm. Ohne diese Zeile kennt Java \`JFrame\` nicht. | -| \`JFrame fenster = new JFrame("Mein erstes Fenster");\` | Baut ein neues Fenster. Der Text in Klammern ist der Titel oben im Fensterrahmen. Über die Variable \`fenster\` sprichst du es danach an. | -| \`fenster.setSize(300, 200);\` | Das Fenster wird 300 Pixel breit und 200 Pixel hoch. | -| \`fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\` | Schließt jemand das Fenster, endet auch das Programm. | -| \`fenster.setVisible(true);\` | Jetzt erst wird das Fenster sichtbar. | - -Der Punkt in \`fenster.setSize(…)\` bedeutet: „Fenster, mach das!“ Vor dem Punkt steht, wer etwas tun soll, dahinter, was es tun soll. - -> Ohne \`setDefaultCloseOperation\` versteckt Java das Fenster beim Schließen nur. Das Programm läuft dann unsichtbar weiter. - -::: quiz -? Was bedeutet der Punkt in \`fenster.setSize(300, 200)\`? -- [x] „Fenster, mach das!“: Vor dem Punkt steht, wer etwas tut, dahinter, was es tut. -- [ ] Er trennt die beiden Zahlen. -- [ ] Er beendet die Zeile. -> Vor dem Punkt steht das Objekt \`fenster\`, dahinter seine Methode \`setSize\`. -::: - -## Warum setVisible am Ende steht - -\`setVisible(true)\` zeigt das Fenster so, wie es in diesem Moment ist. Deshalb richtest du zuerst alles ein: Titel, Größe, später auch Knöpfe. Erst ganz am Ende machst du das Fenster sichtbar. - -Was du erst nach \`setVisible(true)\` ins Fenster legst, erscheint oft nicht. Java zeichnet das Fenster nämlich nicht von selbst neu. Manchmal taucht es erst auf, wenn man die Größe des Fensters ändert. Solche Fehler sind schwer zu finden. - -::: ludwig -Erst einrichten, dann zeigen. Wie im Theater: Der Vorhang geht erst auf, wenn die Bühne fertig aufgebaut ist. -::: - -Probier es aus: Lösche die Zeile mit \`setVisible(true)\` und führe das Programm noch einmal aus. Das Programm läuft, aber du siehst kein Fenster. - -## Klassen und Objekte - -Das steht nicht im Lehrplan, hilft dir aber, Swing zu verstehen. - -::: angeberwissen -Java ist eigentlich eine **objektorientierte** Sprache. \`JFrame\` ist eine Klasse, also ein Bauplan für Fenster. Mit \`new JFrame(…)\` baut Java nach diesem Bauplan ein echtes Fenster, ein **Objekt**. Du könntest mit zwei \`new\` auch zwei Fenster bauen, beide nach demselben Bauplan. - -\`setSize\` und \`setVisible\` sind Methoden, die jedes Fenster-Objekt kann. Deshalb schreibst du \`fenster.setSize(…)\`: Das Objekt \`fenster\` führt seine Methode aus. Auch dein Programm selbst ist eine Klasse, nämlich \`MeinFenster\`. -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Ludwig hat am Fensterprogramm herumgebastelt. Lies die Zeilen und sag vorher, was passiert. Sechs Runden. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: Was siehst du nach dem Ausführen? -- ein Fenster mit dem Titel „Hallo“ -- [x] gar kein Fenster -- eine Fehlermeldung -> \`setVisible(true)\` fehlt. Das Fenster ist gebaut, bleibt aber unsichtbar. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(200, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); -frage: Wie sieht das Fenster aus? -- breiter als hoch -- [x] höher als breit -- quadratisch -> Die erste Zahl ist die Breite, die zweite die Höhe: 200 breit, 300 hoch. - -runde: - JFrame fenster = new JFrame("Hallo"); - fenster.setSize(300, 200); - fenster.setVisible(true); -frage: Du schließt das Fenster. Was passiert mit dem Programm? -- Es endet. -- [x] Es läuft unsichtbar weiter. -- Das Fenster geht sofort wieder auf. -> Ohne \`setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\` versteckt Java das Fenster nur. - -runde: - JFrame fenster = new JFrame(); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setVisible(true); -frage: Was steht oben im Fensterrahmen? -- fenster -- JFrame -- [x] nichts, der Titel ist leer -> Ohne Text in den Klammern hat das Fenster keinen Titel. Der Variablenname \`fenster\` erscheint nie im Fenster. - -runde: - public class Test { - public static void main(String[] args) { - JFrame fenster = new JFrame("Test"); - fenster.setVisible(true); - } - } -frage: Was meldet javac? -- [x] cannot find symbol: class JFrame -- nichts, das Fenster erscheint -- missing return statement -> Die Zeile \`import javax.swing.*;\` fehlt. Ohne sie kennt Java \`JFrame\` nicht. - -runde: - JFrame a = new JFrame("Eins"); - JFrame b = new JFrame("Zwei"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: Was siehst du? -- [x] ein Fenster mit dem Titel „Eins“ -- zwei Fenster -- ein Fenster mit dem Titel „Zwei“ -> Zwei Fenster nach demselben Bauplan, aber nur \`a\` wird sichtbar gemacht. -::: - -## Aufgabe: Dein eigenes Fenster - -Ändere das Programm so, dass - -- im Titel „Hallo“ und dein Name steht, -- das Fenster 400 Pixel breit und 300 Pixel hoch ist, -- das Programm endet, wenn du das Fenster schließt. - -Führe es aus und prüfe alle drei Punkte. - -::: ludwig -Du willst nicht so viel tippen? Mit „Echtes Java“ darfst du im Bereich Code auch nur die vier Zeilen aus \`main\` schreiben. VisuStruct packt sie dann selbst in eine Klasse und ergänzt die \`import\`-Zeilen. In einer richtigen Java-Entwicklungsumgebung brauchst du aber das ganze Programm. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann im Bereich Code „Echtes Java“ einschalten. → Programme mit Fenstern -- Ich kann ein Fenster mit Titel und Größe öffnen. → Das ganze Programm -- Ich kann erklären, was jede Zeile des Fensterprogramms macht. → Zeile für Zeile -- Ich kann erklären, warum setVisible(true) am Ende steht. → Warum setVisible am Ende steht -::: - -## Wissenstest - -::: quiz -? Welche Zeile macht das Fenster sichtbar? -→ Warum setVisible am Ende steht -- [ ] fenster.setSize(300, 200); -- [x] fenster.setVisible(true); -- [ ] new JFrame("Hallo"); -> Ohne setVisible(true) bleibt das Fenster unsichtbar. - -? Wo steht fenster.setVisible(true) am besten? -→ Warum setVisible am Ende steht -- [ ] Ganz am Anfang von main -- [x] Am Ende, wenn das Fenster fertig eingerichtet ist -- [ ] Das ist egal. -> Was nach setVisible(true) dazukommt, erscheint oft nicht. - -? Was bewirkt setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)? -→ Zeile für Zeile -- [ ] Das Fenster schließt sich sofort. -- [x] Schließt man das Fenster, endet das Programm. -- [ ] Das Fenster lässt sich nicht mehr schließen. - -? Woran erkennst du Bausteine aus Swing? -→ Zeile für Zeile -- [x] Ihr Name beginnt mit J, z. B. JFrame. -- [ ] Sie stehen in geschweiften Klammern. -- [ ] Sie enden mit Window. -::: -`,fw=`--- -titel: Ein Knopf im Fenster -bereich: Fenster mit Swing -kurz: Einen Knopf ins Fenster legen und mit einem Layout ordentlich anordnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Knopf bauen und mit add ins Fenster legen -- erklären, warum der Knopf vor setVisible(true) hineinkommt -- mit FlowLayout dafür sorgen, dass der Knopf normal groß ist -- ein Fenster mit einem Knopf bauen, den man drücken kann -::: - -## Einen Knopf bauen - -Ein leeres Fenster ist langweilig. Jetzt kommt ein Knopf hinein. In Swing heißt ein Knopf **JButton** (button ist englisch für Knopf). - -Zwei neue Zeilen brauchst du dafür: - -\`\`\`java -JButton knopf = new JButton("Klick mich"); -fenster.add(knopf); -\`\`\` - -- \`new JButton("Klick mich")\` baut einen Knopf. Der Text in Klammern steht später auf dem Knopf. -- \`fenster.add(knopf)\` legt den Knopf ins Fenster. Ohne \`add\` gibt es den Knopf zwar, aber er liegt nirgends und du siehst ihn nicht. - -::: quiz -? Was steht auf dem Knopf nach \`new JButton("Start")\`? -- [ ] knopf -- [x] Start -- [ ] JButton -> Der Text in Klammern ist die Beschriftung. \`knopf\` ist nur der Name der Variable. -::: - -## Das ganze Programm - -Beide Zeilen kommen **vor** \`setVisible(true)\`, denn das Fenster soll erst fertig eingerichtet und dann gezeigt werden: - -\`\`\`java -import javax.swing.*; - -public class KnopfFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton knopf = new JButton("Klick mich"); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -\`\`\` - -Führe das Programm aus. Überraschung: Der Knopf ist riesig und füllt das ganze Fenster! - -::: ludwig -Die Reihenfolge ist wie beim ersten Fenster: einrichten, Knopf bauen, Knopf hineinlegen und ganz zum Schluss zeigen. Die Leerzeilen im Code helfen dir, diese Teile zu sehen. -::: - -## Der Riesenknopf - -Wie ein Fenster seine Teile anordnet, bestimmt sein **Layout**. Ein \`JFrame\` legt ohne weitere Angabe alles in die Mitte und macht es so groß wie das ganze Fenster. - -Mit einem anderen Layout bekommt der Knopf seine normale Größe. Das **FlowLayout** stellt alles wie Wörter in einer Zeile nebeneinander, so groß wie nötig: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class KnopfFenster { - public static void main(String[] args) { - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new FlowLayout()); - - JButton knopf = new JButton("Klick mich"); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -\`\`\` - -\`FlowLayout\` gehört zum älteren Werkzeugkasten AWT. Deshalb steht oben eine zweite Zeile: \`import java.awt.*;\`. - -::: angeberwissen -Beim FlowLayout fließen die Bausteine wie Text: Passt ein Knopf nicht mehr in die Zeile, rutscht er in die nächste. Mach das Fenster schmal und schau zu, wie die Knöpfe umbrechen. Flow ist englisch für Fluss. -::: - -## Klicken geht, aber nichts passiert - -Klicke auf den Knopf. Er wird kurz dunkler, wenn du ihn drückst. Swing zeigt also, dass er gedrückt wurde. Sonst passiert aber nichts. - -Das ist kein Fehler: Du hast dem Programm noch nicht gesagt, **was** beim Klick passieren soll. Das lernst du in der nächsten Lektion. - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Fensterprogramm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was das Programm tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sechs Runden, je 25 Sekunden. -zeit: 25 - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - JButton knopf = new JButton(Klick mich); - fenster.add(knopf); - fenster.setVisible(true); -frage: Soll einen Knopf „Klick mich“ zeigen. -fehler: 3 -besser: JButton knopf = new JButton("Klick mich"); -> Die Beschriftung ist ein Text und braucht Anführungszeichen. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - JButton knopf = new JButton("OK"); - fenster.add(fenster); - fenster.setVisible(true); -frage: Soll den Knopf „OK“ ins Fenster legen. -fehler: 4 -besser: fenster.add(knopf); -> Ins Fenster gehört der Knopf, nicht das Fenster selbst. - -runde: - import java.swing.*; - import java.awt.*; -frage: Soll Swing und das FlowLayout ins Programm holen. -fehler: 1 -besser: import javax.swing.*; -> Swing liegt in \`javax.swing\`, mit x. Das FlowLayout kommt aus \`java.awt\`, ohne x. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout); - fenster.add(new JButton("OK")); - fenster.setVisible(true); -frage: Soll den Knopf in normaler Größe zeigen. -fehler: 3 -besser: fenster.setLayout(new FlowLayout()); -> Nach \`new\` und dem Namen kommen immer runde Klammern, auch wenn nichts darin steht. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout()); - JButton knopf = new Jbutton("OK"); - fenster.add(knopf); - fenster.setVisible(true); -frage: Soll einen Knopf „OK“ zeigen. -fehler: 4 -besser: JButton knopf = new JButton("OK"); -> Java unterscheidet Groß- und Kleinschreibung: \`JButton\` mit großem B. - -runde: - JFrame fenster = new JFrame("Knopf"); - fenster.setSize(300, 200); - fenster.setLayout(new FlowLayout()); - fenster.add(new JButton("OK")); - fenster.setVisible(false); -frage: Soll das Fenster mit dem Knopf zeigen. -fehler: 5 -besser: fenster.setVisible(true); -> Mit \`false\` bleibt das Fenster unsichtbar. -::: - -## Aufgabe: Klick mich - -Baue ein Fenster mit dem Titel „Knopf-Test“, 300 mal 200 Pixel groß, mit einem Knopf „Klick mich“ in normaler Größe. Der Knopf soll sich drücken lassen, auch wenn noch nichts passiert. - -Zusatz: Lege einen zweiten Knopf „Ich auch“ daneben. In welcher Reihenfolge stehen die Knöpfe? Tausche die beiden \`add\`-Zeilen und probiere es noch einmal. - -**Du bist fertig, wenn …** - -- oben im Fenster „Knopf-Test“ steht, -- das Fenster 300 Pixel breit und 200 Pixel hoch ist, -- der Knopf „Klick mich“ nur so groß ist wie seine Schrift und nicht das ganze Fenster füllt, -- sich der Knopf beim Klicken sichtbar eindrückt. - -::: ludwig -Jeder Knopf braucht eine eigene Variable, zum Beispiel \`knopf\` und \`knopf2\`, und ein eigenes \`add\`. Das FlowLayout stellt die Knöpfe in der Reihenfolge der \`add\`-Zeilen auf. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Knopf bauen und mit add ins Fenster legen. → Einen Knopf bauen -- Ich kann erklären, warum der Knopf vor setVisible(true) hineinkommt. → Das ganze Programm -- Ich kann mit FlowLayout dafür sorgen, dass der Knopf normal groß ist. → Der Riesenknopf -- Ich kann ein Fenster mit einem Knopf bauen, den man drücken kann. → Aufgabe: Klick mich -::: - -## Wissenstest - -::: quiz -? Was macht fenster.add(knopf)? -→ Einen Knopf bauen -- [ ] Es baut einen neuen Knopf. -- [x] Es legt den Knopf ins Fenster. -- [ ] Es macht den Knopf klickbar. -> Gebaut wird der Knopf mit new JButton(…). - -? Warum füllt der Knopf ohne FlowLayout das ganze Fenster? -→ Der Riesenknopf -- [ ] Weil der Text zu lang ist -- [x] Weil das Fenster ohne eigenes Layout alles so groß wie das Fenster macht -- [ ] Weil setSize fehlt - -? Welche import-Zeile brauchst du für FlowLayout? -→ Der Riesenknopf -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> FlowLayout stammt aus dem älteren AWT. - -? Was passiert beim Klick auf den Knopf in dieser Lektion? -→ Aufgabe: Klick mich -- [ ] Das Programm endet. -- [x] Der Knopf wird kurz dunkler, sonst passiert nichts. -- [ ] Auf dem Knopf steht „Ich wurde geklickt“. -> Was beim Klick passieren soll, lernst du in der nächsten Lektion. -::: -`,bw=`--- -titel: Der Knopf reagiert -bereich: Fenster mit Swing -kurz: Mit einem ActionListener festlegen, was beim Klick passiert. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Ereignis ist -- mit addActionListener festlegen, was beim Klick passiert -- beim Klick mehrere Anweisungen ausführen -- einen Knopf bauen, der nach dem Klick seinen Text ändert -::: - -## Ein Klick ist ein Ereignis - -In der letzten Lektion ließ sich der Knopf drücken, aber nichts geschah. Bei einem Fensterprogramm bestimmt nämlich der Mensch, wann etwas passiert: Er klickt, tippt oder schließt ein Fenster. Jede solche Aktion heißt **Ereignis**. - -Dein Programm muss deshalb auf den Klick warten und ihn bemerken. Dafür meldest du beim Knopf einen Zuhörer an, einen **ActionListener** (englisch für „Aktions-Zuhörer“). Bei jedem Klick ruft der Knopf seinen Zuhörer, und der führt deinen Code aus. - -::: ludwig -Bisher lief dein Programm von oben nach unten durch, wie im Struktogramm. Der Code im Zuhörer läuft dagegen erst später, nämlich immer dann, wenn jemand klickt. Wie oft das ist, weiß vorher niemand. -::: - -## Die Zeile mit dem Pfeil - -So meldest du den Zuhörer an: - -\`\`\`java -knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); -\`\`\` - -Von außen nach innen gelesen: - -- \`knopf.addActionListener( … )\` meldet beim Knopf einen Zuhörer an. -- \`e\` ist das Ereignis. Darin steht zum Beispiel, wann geklickt wurde. Hier brauchst du es nicht, aber der Name muss dastehen. -- \`->\` liest du als „dann mach“. -- \`knopf.setText("Ich wurde geklickt")\` ist das, was beim Klick passiert: Der Knopf bekommt eine neue Beschriftung. - -Die Zeile steht nach \`new JButton(…)\`, denn den Knopf muss es schon geben. Und wie alles andere kommt sie vor \`setVisible(true)\`. - -::: quiz -? Wofür steht das \`e\` in \`e -> knopf.setText(…)\`? -- [x] Für das Ereignis, also den Klick -- [ ] Für „Ende“ -- [ ] Für einen Fehler -> Hier brauchst du \`e\` nicht, aber der Name muss dastehen. -::: - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class KlickMich { - public static void main(String[] args) { - JFrame fenster = new JFrame("Klick mich"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new FlowLayout()); - - JButton knopf = new JButton("Klick mich"); - knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -\`\`\` - -Führe es aus und klicke auf den Knopf. Jetzt steht darauf „Ich wurde geklickt“. - -> Ist der neue Text länger als der alte, macht das FlowLayout den Knopf von selbst breiter. - -## Mehrere Anweisungen beim Klick - -Soll beim Klick mehr als eine Sache passieren, setzt du hinter den Pfeil geschweifte Klammern. Darin steht jede Anweisung mit Semikolon, wie in einem Schleifenrumpf: - -\`\`\`java -knopf.addActionListener(e -> { - knopf.setText("Ich wurde geklickt"); - fenster.setTitle("Danke!"); - System.out.println("Klick!"); -}); -\`\`\` - -\`System.out.println\` schreibt wie gewohnt in die [Konsole](#zeige-konsole). Klicke mehrmals: Bei jedem Klick erscheint eine neue Zeile „Klick!“. So siehst du, dass der Code im Zuhörer wirklich bei jedem Klick läuft. - -::: ludwig -Achte auf das Ende: Erst schließt \`}\` den Block, dann \`)\` die Klammer von \`addActionListener\`, dann kommt das Semikolon. Also \`});\`. Fehlt etwas davon, steht unter dem Code ein Hinweis. -::: - -## Spiel: Wer hört zu? - -::: spiel zuhoerer -titel: Spiel: Wer hört zu? -intro: Ludwig zeigt dir Code und das Fenster dazu. Darunter steht, welche Knöpfe nacheinander geklickt werden. Was passiert? Nach deiner Antwort spielt Ludwig die Klicks ab: Du siehst, welcher Zuhörer das Ereignis hört und welche Zeilen dann laufen. -frage: Was steht nach den Klicks in der Beschriftung? - -runde: - JFrame fenster = new JFrame("Gruß"); - JLabel text = new JLabel("Start"); - JButton knopf = new JButton("Hallo"); - knopf.addActionListener(e -> text.setText("Hallo Welt")); -klicks: Hallo -- Start -- [x] Hallo Welt -- Hallo -> Der Knopf hat einen Zuhörer. Beim Klick führt er \`text.setText("Hallo Welt")\` aus, und die Beschriftung zeigt „Hallo Welt“. - -runde: - JFrame fenster = new JFrame("Obst"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apfel")); - b.addActionListener(e -> text.setText("Birne")); -klicks: A, B -- Apfel -- [x] Birne -- Apfel Birne -> Jeder Knopf hat seinen eigenen Zuhörer. Erst schreibt A „Apfel“ hinein, dann überschreibt B das mit „Birne“. \`setText\` ersetzt den alten Text, es hängt nichts an. - -runde: - JFrame fenster = new JFrame("Obst"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apfel")); -klicks: B -- Apfel -- Birne -- [x] ? -> Beim Knopf B hat sich niemand angemeldet: Es gibt kein \`b.addActionListener\`. Der Klick ist ein Ereignis, aber niemand hört zu. Deshalb bleibt das Fragezeichen stehen. - -runde: - JFrame fenster = new JFrame("Farben"); - JLabel text = new JLabel("keine"); - JButton rot = new JButton("Rot"); - JButton blau = new JButton("Blau"); - rot.addActionListener(e -> text.setText("Blau")); - blau.addActionListener(e -> text.setText("Rot")); -klicks: Rot -- Rot -- [x] Blau -- keine -> Aufgepasst: Was passiert, entscheidet der Code im Zuhörer, nicht die Beschriftung des Knopfs. Der Zuhörer am Knopf „Rot“ schreibt „Blau“ hinein. - -runde: - JFrame fenster = new JFrame("Knopf"); - JLabel text = new JLabel("Bitte klicken"); - JButton knopf = new JButton("Klick mich"); - knopf.addActionListener(e -> { - knopf.setText("Danke!"); - text.setText("Geklickt"); - }); -klicks: Klick mich -frage: Was steht nach dem Klick auf dem Knopf? -- Klick mich -- [x] Danke! -- Geklickt -> Im Block hinter dem Pfeil stehen zwei Anweisungen. Beide laufen beim Klick nacheinander: Der Knopf bekommt „Danke!“, die Beschriftung „Geklickt“. - -runde: - JFrame fenster = new JFrame("Konsole"); - JButton knopf = new JButton("Los"); - knopf.addActionListener(e -> System.out.println("Klick!")); -klicks: Los, Los, Los -frage: Wie viele Zeilen „Klick!“ stehen danach in der Konsole? -- 1 -- [x] 3 -- 0 -> Der Zuhörer läuft bei **jedem** Klick, nicht nur beim ersten. Drei Klicks, drei Zeilen. -::: - -## ActionListener ist ein Interface - -Das steht nicht im Lehrplan. Wenn du wissen willst, was hinter dem Pfeil steckt, lies weiter. - -::: angeberwissen -\`ActionListener\` ist ein **Interface**, eine Art Vertrag. Darin steht: Wer ein ActionListener sein will, muss eine Methode \`actionPerformed(ActionEvent e)\` haben. Der Knopf ruft bei jedem Klick genau diese Methode auf. -::: - -Die Zeile mit dem Pfeil kennst du schon aus Schritt 3: - -\`\`\`java -knopf.addActionListener(e -> knopf.setText("Ich wurde geklickt")); -\`\`\` - -Ohne Pfeil schreibt man den Zuhörer als Klasse ohne Namen, die den Vertrag erfüllt (eine anonyme Klasse): - -\`\`\`java -knopf.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - knopf.setText("Ich wurde geklickt"); - } -}); -\`\`\` - -Dafür brauchst du oben noch \`import java.awt.event.*;\`. Beide Schreibweisen machen genau dasselbe. Der Pfeil \`e -> …\` ist die Kurzform (ein Lambda-Ausdruck, seit Java 8): \`e\` ist der Parameter von \`actionPerformed\`, und hinter dem Pfeil steht ihr Rumpf. Die Kurzform geht, weil das Interface nur eine einzige Methode hat. Java weiß also, welche Methode gemeint ist. - -## Spiel: Vertrag erfüllt? - -::: spiel vertrag -titel: Spiel: Vertrag erfüllt? -intro: Der Vertrag \`ActionListener\` verlangt genau eine Methode: \`public void actionPerformed(ActionEvent e)\`. Ludwig zeigt dir Code. Erfüllt er den Vertrag, sodass man ihn beim Knopf anmelden kann? Jede Antwort hat Ludwig mit dem echten Java-Compiler geprüft. -frage: Erfüllt das den Vertrag ActionListener? -antworten: erfüllt | nicht erfüllt - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Alles da: \`implements ActionListener\` unterschreibt den Vertrag, und die Methode heißt genau \`actionPerformed\`, ist \`public\`, gibt nichts zurück (\`void\`) und bekommt ein \`ActionEvent\`. - -runde: - class Gruss implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Schau genau hin: \`actionPerfomed\` statt \`actionPerformed\`, ein r fehlt. Für Java ist das eine ganz andere Methode. Der Compiler meldet, dass \`actionPerformed\` fehlt. - -runde: - class Gruss implements ActionListener { - public void actionPerformed() { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Der Parameter fehlt. Der Vertrag verlangt \`actionPerformed(ActionEvent e)\`, denn der Knopf übergibt beim Klick das Ereignis. - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent ereignis) { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Der Name des Parameters ist frei wählbar. Wichtig ist nur der Typ \`ActionEvent\`. Statt \`e\` darf er also auch \`ereignis\` heißen. - -runde: - class Gruss implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } -richtig: nicht erfüllt -> Das \`public\` fehlt. Alle Methoden eines Interfaces sind öffentlich, denn der Knopf muss sie von außen aufrufen können. Ohne \`public\` meldet der Compiler einen Fehler. - -runde: - class Gruss implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: nicht erfüllt -> Der Vertrag sagt \`void\`: Die Methode gibt nichts zurück. Mit \`int\` als Rückgabetyp passt sie nicht mehr. - -runde: - class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - sagHallo(); - } - void sagHallo() { - System.out.println("Hallo"); - } - } -richtig: erfüllt -> Zusätzliche Methoden sind erlaubt. Der Vertrag verlangt nur, dass \`actionPerformed\` da ist, nicht, dass sonst nichts da ist. - -runde: - class Gruss { - public void actionPerformed(ActionEvent e) { - System.out.println("Hallo"); - } - } - knopf.addActionListener(new Gruss()); -richtig: nicht erfüllt -> Die Methode stimmt, aber der Vertrag ist nicht unterschrieben: Es fehlt \`implements ActionListener\`. Java nimmt beim Knopf nur Objekte an, die den Vertrag offiziell erfüllen. - -runde: - knopf.addActionListener(e -> System.out.println("Hallo")); -richtig: erfüllt -> Der Pfeil ist die Kurzform. Weil der Vertrag nur eine Methode hat, weiß Java: \`e\` ist der Parameter von \`actionPerformed\`, und hinter dem Pfeil steht ihr Rumpf. - -runde: - knopf.addActionListener((a, b) -> System.out.println("Hallo")); -richtig: nicht erfüllt -> Hier hat der Pfeil zwei Parameter. \`actionPerformed\` bekommt aber genau einen, das Ereignis. Darum passt diese Kurzform nicht zum Vertrag. -::: - -## Aufgabe: Ich wurde geklickt - -Jetzt machst du die Aufgabe fertig: Baue ein Fenster mit einem Knopf „Klick mich“ in normaler Größe. Nach dem Klick steht auf dem Knopf „Ich wurde geklickt“. - -Zusatz: Baue zwei Knöpfe „Rot“ und „Blau“. Ein Klick auf einen Knopf schreibt seinen Namen in den Titel des Fensters, zum Beispiel „Du hast Rot gewählt“. - -**Du bist fertig, wenn …** - -- vor dem Klick „Klick mich“ auf dem Knopf steht, -- nach dem Klick „Ich wurde geklickt“ darauf steht, -- der Knopf nicht das ganze Fenster füllt. - -::: ludwig -Jeder Knopf bekommt seinen eigenen Zuhörer mit eigenem \`addActionListener\`. Den Titel änderst du mit \`fenster.setTitle(…)\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Ereignis ist. → Ein Klick ist ein Ereignis -- Ich kann mit addActionListener festlegen, was beim Klick passiert. → Die Zeile mit dem Pfeil -- Ich kann beim Klick mehrere Anweisungen ausführen. → Mehrere Anweisungen beim Klick -- Ich kann einen Knopf bauen, der nach dem Klick seinen Text ändert. → Aufgabe: Ich wurde geklickt -::: - -## Wissenstest - -::: quiz -? Was ist ein ActionListener? -→ Ein Klick ist ein Ereignis -- [ ] Ein Knopf mit Text -- [x] Ein Zuhörer, der bei jedem Klick deinen Code ausführt -- [ ] Ein Layout für Fenster -> Du meldest ihn mit addActionListener beim Knopf an. - -? Wann läuft knopf.setText("Ich wurde geklickt") im Zuhörer? -→ Die Zeile mit dem Pfeil -- [ ] Sofort beim Start des Programms -- [x] Jedes Mal, wenn jemand auf den Knopf klickt -- [ ] Nur beim ersten Klick -> Der Code im Zuhörer läuft erst, wenn das Ereignis eintritt. - -? Wie endet ein Zuhörer mit geschweiften Klammern? -→ Die Zeile mit dem Pfeil -- [ ] };) -- [x] }); -- [ ] );} -> Erst schließt der Block, dann die Klammer von addActionListener, dann das Semikolon. - -? Ordne jedem Teil seine Aufgabe zu. -→ Die Zeile mit dem Pfeil -= JButton -> ein Knopf -= addActionListener -> Zuhörer anmelden -= setText -> Beschriftung ändern -= setVisible(true) -> Fenster zeigen -::: -`,xw=`--- -titel: Zahl verdoppeln im Fenster -bereich: Fenster mit Swing -kurz: Beschriftung, Textfeld und Knopf mit einem GridLayout anordnen und mit dem Text im Textfeld rechnen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- JLabel und JTextField ins Fenster legen -- erklären, warum ohne Layout nur der letzte Baustein zu sehen ist -- mit GridLayout(0, 1) alles untereinander anordnen -- mit getText, Integer.parseInt und setText rechnen -- ein Programm schreiben, das bei „abc“ nicht abstürzt -::: - -## Das Ziel - -Wir bauen ein kleines Rechenprogramm mit Fenster: Oben steht eine Beschriftung, darunter ein Textfeld und ein Knopf **Berechne**. Gibst du 2 ein und klickst, steht im Textfeld 4. Klickst du noch einmal, wird daraus 8, dann 16 und so weiter. - -Dafür brauchst du zwei neue Bausteine: - -- **JLabel**: eine Beschriftung, also einfacher Text im Fenster. -- **JTextField**: ein Textfeld, in das man etwas tippen kann. - -Schalte wie in den letzten Lektionen im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Drei Bausteine ins Fenster - -Wir legen alle drei Bausteine ins Fenster, genau wie den Knopf in Lektion 29: - -\`\`\`java -import javax.swing.*; - -public class Verdoppeln { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahl verdoppeln"); - fenster.setSize(250, 150); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel beschriftung = new JLabel("Gib eine Zahl ein:"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Berechne"); - fenster.add(beschriftung); - fenster.add(feld); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -\`\`\` - -Führe das Programm aus. Hoppla: Man sieht nur den riesigen Knopf. Wo sind die Beschriftung und das Textfeld? - -## Warum nur der Knopf zu sehen ist - -::: ludwig -Erinnerst du dich an den Riesenknopf? Ein \`JFrame\` hat ohne eigenes Layout nur **einen** Platz: die Mitte. Jedes \`add\` legt den neuen Baustein genau dorthin, so groß wie das ganze Fenster. Die drei Bausteine landen also übereinander auf demselben Platz, und das Fenster zeigt nur den zuletzt hineingelegten: den Knopf. Benutzen kannst du das Programm so nicht. -::: - -Die Lösung ist wieder ein Layout. Diesmal nehmen wir das **GridLayout**. Es teilt das Fenster in gleich große Zellen wie ein Gitter: - -\`\`\`java -fenster.setLayout(new GridLayout(0, 1)); -\`\`\` - -Die beiden Zahlen sind Zeilen und Spalten. \`0\` Zeilen heißt „so viele wie nötig“, \`1\` Spalte heißt: alles untereinander. Für \`GridLayout\` brauchst du oben außerdem \`import java.awt.*;\`. - -| Layout | So ordnet es an | -|---|---| -| ohne Layout | alles in die Mitte, übereinander | -| \`FlowLayout\` | nebeneinander wie Wörter, Zeilenumbruch wenn nötig | -| \`GridLayout(0, 1)\` | untereinander, jede Zeile gleich hoch | - -## Das Fenster mit GridLayout - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Verdoppeln { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahl verdoppeln"); - fenster.setSize(250, 150); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel beschriftung = new JLabel("Gib eine Zahl ein:"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Berechne"); - fenster.add(beschriftung); - fenster.add(feld); - fenster.add(knopf); - - fenster.setVisible(true); - } -} -\`\`\` - -Jetzt stehen alle drei untereinander. Du kannst ins Textfeld tippen und den Knopf drücken. Rechnen tut das Programm aber noch nicht. - -::: angeberwissen -Mit \`new GridLayout(2, 3)\` bekommst du 2 Zeilen mit je 3 Spalten, also 6 gleich große Zellen. So baut man zum Beispiel die Tasten eines Taschenrechners. Die Bausteine füllen die Zellen in der Reihenfolge der \`add\`-Zeilen, Zeile für Zeile von links nach rechts. -::: - -## Mit dem Text im Textfeld rechnen - -Beim Klick soll das Programm die Zahl aus dem Textfeld holen, verdoppeln und wieder hineinschreiben. Das machen drei Methoden: - -- \`feld.getText()\` liefert den Text im Textfeld, zum Beispiel \`"2"\`. -- \`Integer.parseInt(…)\` macht daraus die Zahl 2. Das kennst du aus Lektion 22. -- \`feld.setText(…)\` schreibt einen neuen Text ins Textfeld. - -Zusammen mit dem ActionListener aus Lektion 30 sieht das so aus: - -\`\`\`java -knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); -}); -\`\`\` - -\`setText\` braucht einen Text. \`"" + zahl * 2\` hängt das Ergebnis an einen leeren Text und macht so aus der Zahl einen Text. - -## Keine Zahl? Kein Absturz! - -Tippe „abc“ ins Textfeld und klicke auf Berechne. Das Fenster bleibt, aber es passiert nichts, und in der [Konsole](#zeige-konsole) steht eine \`NumberFormatException\`. Aus Lektion 22 weißt du, was zu tun ist: - -\`\`\`java -knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } -}); -\`\`\` - -Statt eines Fehlers in der Konsole sieht man jetzt einen Hinweis im Fenster. - -::: ludwig -Der Pfeil hat schon ein \`e\` für das Ereignis. Deshalb braucht die Exception im \`catch\` einen anderen Namen, hier \`fehler\`. Zwei Variablen mit demselben Namen erlaubt Java nicht. -::: - -::: quiz -? Warum heißt die Exception im \`catch\` hier \`fehler\` und nicht \`e\`? -- [ ] \`catch\` verlangt immer den Namen \`fehler\`. -- [x] \`e\` ist schon das Ereignis des Pfeils, und zwei Variablen mit demselben Namen erlaubt Java nicht. -- [ ] \`e\` ist nur für Zahlen erlaubt. -> Den Namen darfst du frei wählen, nur nicht doppelt. -::: - -## Spiel: Was steht danach im Fenster? - -::: spiel frage -titel: Spiel: Was steht danach im Fenster? -intro: Ludwig tippt etwas ins Textfeld und klickt auf Berechne. Lies den Zuhörer und sag vorher, was danach im Fenster steht. Sechs Runden. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - }); -frage: Im Textfeld steht 21. Was steht nach dem Klick darin? -- 2121 -- [x] 42 -- 21 -> \`parseInt\` macht aus dem Text die Zahl 21. Das Doppelte ist 42. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - }); -frage: Im Textfeld steht 21. Du klickst zweimal. Was steht danach darin? -- 42 -- [x] 84 -- 4242 -> Jeder Klick verdoppelt, was gerade im Feld steht: 21, 42, 84. - -runde: - knopf.addActionListener(e -> { - feld.setText(feld.getText() + feld.getText()); - }); -frage: Im Textfeld steht 21. Was steht nach dem Klick darin? -- 42 -- [x] 2121 -- 21 -> Ohne \`parseInt\` bleibt es ein Text, und \`+\` hängt Texte aneinander. - -runde: - knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } - }); -frage: Im Textfeld steht abc. Was passiert beim Klick? -- [x] Die Beschriftung zeigt „Bitte eine ganze Zahl eingeben!“ -- Im Textfeld steht abcabc. -- Das Fenster stürzt ab. -> \`parseInt\` wirft eine NumberFormatException, und \`catch\` fängt sie ab. - -runde: - knopf.addActionListener(e -> { - try { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl * 2); - } catch (NumberFormatException fehler) { - beschriftung.setText("Bitte eine ganze Zahl eingeben!"); - } - }); -frage: Im Textfeld steht 2.5. Was passiert beim Klick? -- Im Textfeld steht 5.0. -- Im Textfeld steht 5. -- [x] Die Beschriftung zeigt „Bitte eine ganze Zahl eingeben!“ -> \`Integer.parseInt\` kennt nur ganze Zahlen. 2.5 ist für ihn keine Zahl. - -runde: - knopf.addActionListener(e -> { - int zahl = Integer.parseInt(feld.getText()); - feld.setText("" + zahl + zahl); - }); -frage: Im Textfeld steht 5. Was steht nach dem Klick darin? -- 10 -- [x] 55 -- 5 -> \`"" + zahl\` ist schon ein Text, und das zweite \`+\` hängt die 5 noch einmal an. Mit \`"" + (zahl + zahl)\` wird zuerst gerechnet. -::: - -## Aufgabe: Zahl verdoppeln - -Baue das ganze Programm zusammen: - -- ein Fenster mit dem Titel „Zahl verdoppeln“, 250 Pixel breit und 150 Pixel hoch, -- untereinander eine Beschriftung, ein Textfeld und ein Knopf „Berechne“, -- jeder Klick verdoppelt die Zahl im Textfeld: 2, 4, 8, 16, … -- bei „abc“ erscheint in der Beschriftung ein Hinweis statt eines Absturzes. - -Zusatz: Ein zweiter Knopf „Halbieren“ teilt die Zahl durch 2. Was passiert bei 5? - -**Du bist fertig, wenn …** - -- der Titel „Zahl verdoppeln“ heißt und Beschriftung, Textfeld und Knopf untereinander stehen, -- aus 2 nach drei Klicks nacheinander 4, 8 und 16 werden, -- bei „abc“ ein Hinweis in der Beschriftung steht und das Programm weiterläuft. - -::: ludwig -Der Knopf „Halbieren“ kommt als vierte Zeile ins GridLayout und bekommt seinen eigenen ActionListener. Bei \`int\` schneidet Java beim Teilen die Nachkommastellen ab. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann JLabel und JTextField ins Fenster legen. → Drei Bausteine ins Fenster -- Ich kann erklären, warum ohne Layout nur der letzte Baustein zu sehen ist. → Warum nur der Knopf zu sehen ist -- Ich kann mit GridLayout(0, 1) alles untereinander anordnen. → Das Fenster mit GridLayout -- Ich kann mit getText, Integer.parseInt und setText rechnen. → Mit dem Text im Textfeld rechnen -- Ich kann ein Programm schreiben, das bei „abc“ nicht abstürzt. → Keine Zahl? Kein Absturz! -::: - -## Wissenstest - -::: quiz -? Warum ist ohne Layout nur der Knopf zu sehen? -→ Warum nur der Knopf zu sehen ist -- [ ] Weil Beschriftung und Textfeld fehlen -- [x] Weil alle Bausteine in der Mitte übereinander liegen und der letzte die anderen verdeckt -- [ ] Weil das Fenster zu klein ist - -? Was bedeutet new GridLayout(0, 1)? -→ Das Fenster mit GridLayout -- [ ] Keine Zeile und eine Spalte, also ist das Fenster leer -- [x] So viele Zeilen wie nötig in einer Spalte, also alles untereinander -- [ ] Eine Zeile, alles nebeneinander - -? Was liefert feld.getText()? -→ Mit dem Text im Textfeld rechnen -- [ ] Immer eine Zahl -- [x] Den Text im Textfeld -- [ ] Den Titel des Fensters -> Für eine Zahl brauchst du noch Integer.parseInt. - -? Ordne jedem Baustein seine Aufgabe zu. -→ Drei Bausteine ins Fenster -= JLabel -> Beschriftung -= JTextField -> Textfeld zum Tippen -= JButton -> Knopf -= GridLayout -> Anordnung im Gitter -::: -`,vw=`--- -titel: Klickzähler mit Reset -bereich: Fenster mit Swing -kurz: Zwei Knöpfe ändern dieselbe Zahl: eine Variable für die ganze Klasse anlegen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, warum ein Zuhörer eine Variable aus main nicht ändern darf -- eine static-Variable in der Klasse anlegen -- zwei Knöpfe dieselbe Zahl ändern lassen -- einen Zähler mit −1 bauen, der nie unter 0 fällt -::: - -## Das Ziel - -Ein Fenster zählt Klicks: Oben steht die Zahl, darunter zwei Knöpfe. **+1** zählt eins hoch, **Reset** setzt die Zahl wieder auf 0. - -Neu ist diesmal: Zwei Knöpfe arbeiten mit **derselben** Zahl. Dafür brauchst du eine Variable, die beide Zuhörer kennen. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Der erste Versuch - -Naheliegend wäre, die Zahl wie gewohnt in \`main\` anzulegen und im Zuhörer hochzuzählen: - -\`\`\`java -int anzahl = 0; -knopf.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); -}); -\`\`\` - -Führst du das mit echtem Java aus, meldet der Compiler einen Fehler: - -\`\`\` -local variables referenced from a lambda expression must be final or effectively final -\`\`\` - -::: ludwig -Der Zuhörer läuft erst später, bei jedem Klick, wenn \`main\` längst fertig ist. Deshalb darf er die Variablen aus \`main\` zwar lesen, aber nicht verändern. Java besteht darauf: Eine Variable aus \`main\`, die im Pfeil vorkommt, muss gleich bleiben. Für eine Zahl, die sich bei jedem Klick ändert, brauchen wir einen anderen Platz. -::: - -## Eine Variable für die ganze Klasse - -Die Lösung: Die Variable kommt **nicht** in \`main\`, sondern direkt in die Klasse, über \`main\`. Dann gehört sie der ganzen Klasse, und jeder Zuhörer darf sie ändern: - -\`\`\`java -public class Zaehler { - static int anzahl = 0; - - public static void main(String[] args) { - // hier wie gewohnt das Fenster - } -} -\`\`\` - -- \`static\` heißt: Die Variable gehört zur Klasse selbst. Weil \`main\` auch \`static\` ist, braucht es das hier. -- Eine solche Variable nennt man **Attribut** der Klasse. Sie lebt so lange wie das Programm, nicht nur so lange wie \`main\`. - -::: quiz -? Wie nennt man eine Variable, die direkt in der Klasse steht und nicht in \`main\`? -- [ ] Parameter -- [x] Attribut -- [ ] Zuhörer -> Ein Attribut lebt so lange wie das Programm, nicht nur so lange wie \`main\`. -::: - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Zaehler { - static int anzahl = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - reset.addActionListener(e -> { - anzahl = 0; - zahl.setText("0"); - }); - - fenster.add(zahl); - fenster.add(plus); - fenster.add(reset); - fenster.setVisible(true); - } -} -\`\`\` - -\`SwingConstants.CENTER\` setzt den Text der Beschriftung in die Mitte. Klicke ein paarmal auf +1 und dann auf Reset. - -::: angeberwissen -Mit \`zahl.setFont(new Font("SansSerif", Font.BOLD, 48));\` wird die Zahl groß und fett. \`Font\` kommt aus \`java.awt\`, das du schon importiert hast. -::: - -## Spiel: Wer zählt mit? - -::: spiel zuhoerer -titel: Spiel: Wer zählt mit? -intro: Jetzt rechnen die Zuhörer mit der Variable aus der Klasse. Ludwig zeigt dir Code, Fenster und die Klicks. Welche Zahl steht am Ende da? Danach spielt Ludwig die Klicks ab. -frage: Was steht nach den Klicks in der Beschriftung? - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> Die Variable steht in der Klasse und behält ihren Wert zwischen den Klicks. Jeder Klick zählt eins hoch: 1, 2, 3. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - reset.addActionListener(e -> { - anzahl = 0; - zahl.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> Nach zwei Klicks steht 2 da. Reset setzt die Variable auf 0, und der letzte Klick zählt wieder auf 1. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> anzahl++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> Die Variable ist danach 2, aber niemand schreibt sie in die Beschriftung. Ohne \`zahl.setText(…)\` zeigt das Fenster weiter 0. Rechnen und Anzeigen sind zwei verschiedene Dinge. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("Klicks: 0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("Klicks: " + anzahl + 1); - }); -klicks: +1 -- Klicks: 2 -- Klicks: 1 -- [x] Klicks: 11 -> Die Klammerfalle: Java rechnet von links nach rechts. \`"Klicks: " + anzahl\` ergibt den Text „Klicks: 1“, und \`+ 1\` hängt eine weitere 1 an. - -runde: - static int anzahl = 0; - JLabel zahl = new JLabel("0"); - JButton eins = new JButton("+1"); - JButton zehn = new JButton("+10"); - eins.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); - zehn.addActionListener(e -> { - anzahl += 10; - zahl.setText("" + anzahl); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Beide Zuhörer ändern dieselbe Variable: 10, dann 11, dann 21. \`anzahl += 10\` ist die Kurzform von \`anzahl = anzahl + 10\`. -::: - -## Aufgabe: Klickzähler - -Baue den Klickzähler nach und erweitere ihn: - -- ein Knopf **−1**, der eins herunterzählt, -- die Zahl soll nie unter 0 fallen. Steht sie auf 0, passiert bei −1 nichts. - -**Du bist fertig, wenn …** - -- **+1** eins hochzählt und **−1** eins herunterzählt, -- bei 0 ein Klick auf **−1** nichts ändert, -- **Reset** die Zahl wieder auf 0 setzt. - -::: ludwig -Für „nie unter 0“ brauchst du im Zuhörer von −1 ein \`if\`: Nur wenn \`anzahl > 0\` ist, wird heruntergezählt. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, warum ein Zuhörer eine Variable aus main nicht ändern darf. → Der erste Versuch -- Ich kann eine static-Variable in der Klasse anlegen. → Eine Variable für die ganze Klasse -- Ich kann zwei Knöpfe dieselbe Zahl ändern lassen. → Das ganze Programm -- Ich kann einen Zähler mit −1 bauen, der nie unter 0 fällt. → Aufgabe: Klickzähler -::: - -## Wissenstest - -::: quiz -? Warum darf der Zuhörer die Variable anzahl aus main nicht verändern? -→ Der erste Versuch -- [ ] Weil Zahlen in Swing nicht erlaubt sind -- [x] Weil der Zuhörer erst später läuft und Java Variablen aus main im Pfeil nicht verändern lässt -- [ ] Weil anzahl zu groß wird - -? Wo steht static int anzahl = 0;? -→ Eine Variable für die ganze Klasse -- [ ] In main, ganz oben -- [x] In der Klasse, außerhalb von main -- [ ] Im Zuhörer - -? Was macht SwingConstants.CENTER bei new JLabel("0", SwingConstants.CENTER)? -→ Das ganze Programm -- [x] Es setzt den Text in die Mitte der Beschriftung. -- [ ] Es setzt das Fenster in die Mitte des Bildschirms. -- [ ] Es macht die Schrift größer. -::: -`,ww=`--- -titel: Eine Ampel mit Farben -bereich: Fenster mit Swing -kurz: Hintergrundfarben setzen und mit einer Zustandsvariable eine Ampel weiterschalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit setOpaque und setBackground eine Beschriftung färben -- mir mit einer static-Variable einen Zustand merken -- mit BorderLayout etwas groß in die Mitte und etwas schmal nach unten setzen -- erklären, wofür FlowLayout, GridLayout und BorderLayout gut sind -- eine Ampel mit vier Phasen programmieren -::: - -## Das Ziel - -Wir bauen eine Ampel: Eine große Fläche leuchtet rot. Bei jedem Klick auf **Weiter** schaltet sie um: Rot, Grün, Gelb und wieder Rot. - -Neu sind diesmal **Farben** und ein **Zustand**: Das Programm muss sich merken, welche Farbe gerade dran ist. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Farben in Swing - -Farben stehen in der Klasse \`Color\` aus \`java.awt\`. Fertige Farben sind zum Beispiel \`Color.RED\`, \`Color.GREEN\`, \`Color.YELLOW\`, \`Color.ORANGE\` und \`Color.WHITE\`. - -Eine Beschriftung färbst du so: - -\`\`\`java -JLabel licht = new JLabel("", SwingConstants.CENTER); -licht.setOpaque(true); -licht.setBackground(Color.RED); -\`\`\` - -- \`setBackground(…)\` legt die Hintergrundfarbe fest. -- \`setOpaque(true)\` braucht ein \`JLabel\` dazu. Ohne diese Zeile ist der Hintergrund durchsichtig, und die Farbe bleibt unsichtbar. - -::: ludwig -\`opaque\` ist englisch für „undurchsichtig“. Eine Beschriftung ist normalerweise durchsichtig wie Schrift auf einer Glasscheibe. Erst mit \`setOpaque(true)\` bekommt sie eine eigene Fläche, die man anmalen kann. -::: - -::: quiz -? Welche Zeile malt den Hintergrund der Beschriftung \`licht\` grün an? -- [ ] \`licht.setText(Color.GREEN);\` -- [x] \`licht.setBackground(Color.GREEN);\` -- [ ] \`licht.setColor("grün");\` -> Die Hintergrundfarbe setzt \`setBackground\`. Damit man sie sieht, braucht ein \`JLabel\` vorher \`setOpaque(true)\`. -::: - -## Sich die Farbe merken - -Damit die Ampel weiß, was als Nächstes kommt, merkt sie sich ihren Zustand in einer Zahl: 0 heißt Rot, 1 heißt Grün, 2 heißt Gelb. Wie beim Klickzähler aus Lektion 32 steht die Variable in der Klasse, damit der Zuhörer sie ändern darf: - -\`\`\`java -static int phase = 0; -\`\`\` - -Bei jedem Klick geht die Phase eins weiter. Nach Gelb (2) kommt wieder Rot (0): - -\`\`\`java -weiter.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - licht.setBackground(Color.RED); - } else if (phase == 1) { - licht.setBackground(Color.GREEN); - } else { - licht.setBackground(Color.YELLOW); - } -}); -\`\`\` - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Ampel { - static int phase = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Ampel"); - fenster.setSize(200, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new BorderLayout()); - - JLabel licht = new JLabel("", SwingConstants.CENTER); - licht.setOpaque(true); - licht.setBackground(Color.RED); - JButton weiter = new JButton("Weiter"); - - weiter.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - licht.setBackground(Color.RED); - } else if (phase == 1) { - licht.setBackground(Color.GREEN); - } else { - licht.setBackground(Color.YELLOW); - } - }); - - fenster.add(licht, BorderLayout.CENTER); - fenster.add(weiter, BorderLayout.SOUTH); - fenster.setVisible(true); - } -} -\`\`\` - -Hier kommt ein neues Layout zum Einsatz, das **BorderLayout**. Es hat fünf Plätze: \`NORTH\` (oben), \`SOUTH\` (unten), \`WEST\` (links), \`EAST\` (rechts) und \`CENTER\` (Mitte). Die Mitte bekommt allen Platz, der übrig bleibt. So wird das Licht groß, und der Knopf bleibt unten schmal. - -::: angeberwissen -Das BorderLayout ist das Layout, das ein \`JFrame\` ohne eigenes Layout benutzt. Ein \`add\` ohne Platzangabe landet in \`CENTER\`. Deshalb lagen in Lektion 31 alle Bausteine übereinander. -::: - -::: angeberwissen -Profis schreiben das Weiterschalten in einer Zeile: \`phase = (phase + 1) % 3;\`. Der Rest-Operator \`%\` liefert den Rest beim Teilen. 3 % 3 ist 0, also beginnt es nach 2 wieder bei 0. -::: - -## Welches Layout wofür? - -Du kennst jetzt drei Layouts. Jedes ordnet die Bausteine anders an: - -| Layout | So ordnet es an | Gut für | -|---|---|---| -| \`FlowLayout\` (Lektion 29) | nebeneinander wie Wörter in einer Zeile, jeder Baustein so groß wie nötig | ein paar Knöpfe in einer Reihe | -| \`GridLayout\` (Lektion 31) | ein Gitter aus gleich großen Zellen, Zeile für Zeile gefüllt | Formulare, Tastenfelder wie beim Taschenrechner | -| \`BorderLayout\` (diese Lektion) | fünf Plätze: oben, unten, links, rechts und die Mitte, die den Rest bekommt | etwas Großes in der Mitte, z. B. ein Bild oder eine Anzeige, mit Knöpfen am Rand | - -Ohne \`setLayout\` benutzt ein Fenster das BorderLayout. Darum landet dann alles in der Mitte. - -::: ludwig -Frag dich beim Planen: Sollen alle Teile gleich groß sein? Dann GridLayout. Soll ein Teil groß sein und der Rest schmal am Rand? Dann BorderLayout. Sollen die Teile einfach ihre normale Größe behalten? Dann FlowLayout. -::: - -## Spiel: Wo landet der Knopf? - -::: spiel layout -titel: Spiel: Wo landet der Knopf? -intro: Du kennst jetzt drei Layouts und das Fenster ganz ohne Layout. Ludwig zeigt dir Code mit den Knöpfen A, B, C … Wie sieht das Fenster aus? Tippe auf das richtige Bild. -frage: Wie sieht das Fenster aus? - -runde: - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Ohne eigenes Layout landet jedes \`add\` in der Mitte, so groß wie das Fenster. Die drei liegen übereinander, man sieht nur den letzten: C. - -runde: - fenster.setLayout(new FlowLayout()); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> FlowLayout setzt die Knöpfe in normaler Größe nebeneinander, wie Wörter in einer Zeile, und zentriert sie. - -runde: - fenster.setLayout(new GridLayout(0, 1)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> Eine Spalte, so viele Zeilen wie nötig: alles untereinander, jede Zeile gleich hoch und so breit wie das Fenster. - -runde: - fenster.setLayout(new GridLayout(0, 2)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); - fenster.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Zwei Spalten. Die Zellen werden Zeile für Zeile gefüllt, immer erst links, dann rechts: A B, dann C D. - -runde: - fenster.setLayout(new GridLayout(2, 3)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); - fenster.add(new JButton("D")); - fenster.add(new JButton("E")); - fenster.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Erst kommen die Zeilen, dann die Spalten: 2 Zeilen mit je 3 Spalten. - -runde: - fenster.setLayout(new GridLayout(0, 2)); - fenster.add(new JButton("A")); - fenster.add(new JButton("B")); - fenster.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Zwei Spalten, drei Knöpfe: Die erste Zeile ist voll, in der zweiten steht C links, und rechts bleibt die Zelle leer. - -runde: - fenster.setLayout(new BorderLayout()); - fenster.add(new JButton("A"), BorderLayout.NORTH); - fenster.add(new JButton("B"), BorderLayout.CENTER); - fenster.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH ist oben, SOUTH unten. Die Mitte bekommt den ganzen übrigen Platz, darum ist B groß. - -runde: - fenster.setLayout(new BorderLayout()); - fenster.add(new JButton("A"), BorderLayout.WEST); - fenster.add(new JButton("B")); - fenster.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST ist links, EAST rechts. B hat keine Platzangabe und landet deshalb in CENTER. -::: - -## Aufgabe: Ampel - -Baue die Ampel nach und mach sie echter. In Deutschland leuchten nach Rot kurz Rot und Gelb zusammen. Nimm deshalb eine vierte Phase dazu: - -- 0: Rot -- 1: Rot-Gelb (nimm dafür \`Color.ORANGE\`) -- 2: Grün -- 3: Gelb - -Zusatz: Schreib in jeder Phase zusätzlich mit \`licht.setText(…)\`, was die Ampel bedeutet, zum Beispiel „Stehen“ oder „Gehen“. - -**Du bist fertig, wenn …** - -- jeder Klick die nächste Phase zeigt: Rot, Rot-Gelb (orange), Grün, Gelb, -- nach Gelb wieder Rot kommt, -- im Zusatz zu jeder Phase der passende Text steht. - -::: ludwig -Mit vier Phasen kommt nach 3 wieder 0. Pass also die Zahl in \`if (phase > 2)\` an. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit setOpaque und setBackground eine Beschriftung färben. → Farben in Swing -- Ich kann mir mit einer static-Variable einen Zustand merken. → Sich die Farbe merken -- Ich kann mit BorderLayout etwas groß in die Mitte und etwas schmal nach unten setzen. → Das ganze Programm -- Ich kann erklären, wofür FlowLayout, GridLayout und BorderLayout gut sind. → Welches Layout wofür? -- Ich kann eine Ampel mit vier Phasen programmieren. → Aufgabe: Ampel -::: - -## Wissenstest - -::: quiz -? Warum bleibt die Farbe ohne setOpaque(true) unsichtbar? -→ Farben in Swing -- [ ] Weil Color.RED nicht existiert -- [x] Weil eine Beschriftung sonst durchsichtig ist -- [ ] Weil das Fenster zu klein ist - -? Welcher Platz im BorderLayout bekommt den übrigen Platz? -→ Das ganze Programm -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? phase ist 2 und der Zuhörer führt phase++ und dann if (phase > 2) { phase = 0; } aus. Welchen Wert hat phase danach? -→ Sich die Farbe merken -- [x] 0 -- [ ] 2 -- [ ] 3 -> Nach phase++ ist sie 3, das ist größer als 2, also wird sie 0. -::: -`,yw=`--- -titel: Notenrechner im Fenster -bereich: Fenster mit Swing -kurz: Punkte eingeben, mit else if die Note bestimmen und falsche Eingaben abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit else if Punkte in eine Note umrechnen -- die Note im Fenster anzeigen -- „abc“ und Punkte außerhalb von 0 bis 100 abfangen und melden -- ein Programm an den Grenzen testen, zum Beispiel mit 92 und 91 -::: - -## Das Ziel - -Ein Fenster rechnet Punkte in eine Note um: Du tippst die Punkte einer Klassenarbeit ein (0 bis 100), klickst auf **Note berechnen**, und unten steht die Note. - -Diesmal kommt kein neuer Swing-Baustein dazu. Neu ist, dass du alles Bisherige kombinierst: Textfeld, Knopf, \`else if\` aus Lektion 20 und try/catch aus Lektion 22. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Der Notenschlüssel - -Wir nehmen den Notenschlüssel der IHK-Prüfungen: - -| Punkte | Note | -|---|---| -| 92 bis 100 | 1 | -| 81 bis 91 | 2 | -| 67 bis 80 | 3 | -| 50 bis 66 | 4 | -| 30 bis 49 | 5 | -| 0 bis 29 | 6 | - -Mit \`else if\` prüfst du von oben nach unten. Die erste Bedingung, die zutrifft, gewinnt: - -\`\`\`java -int note; -if (punkte >= 92) { - note = 1; -} else if (punkte >= 81) { - note = 2; -} else if (punkte >= 67) { - note = 3; -} else if (punkte >= 50) { - note = 4; -} else if (punkte >= 30) { - note = 5; -} else { - note = 6; -} -\`\`\` - -::: ludwig -Bei 85 Punkten ist \`punkte >= 92\` falsch, aber \`punkte >= 81\` wahr. Also Note 2, und die restlichen Bedingungen werden gar nicht mehr geprüft. Deshalb reicht jeweils die untere Grenze. -::: - -Du kannst diesen Teil ohne Fenster im Bereich [Code](#zeige-codelive) ausprobieren. Schreib \`int punkte = 85;\` davor und \`System.out.println("Note: " + note);\` dahinter. Das Struktogramm zeigt dir die verschachtelten Verzweigungen. - -::: quiz -? Welche Note ergibt der Schlüssel bei 29 Punkten? -- [ ] 4 -- [ ] 5 -- [x] 6 -> Alle Bedingungen sind falsch, auch \`punkte >= 30\`. Dann gilt der \`else\`-Zweig. -::: - -## Das Fenster - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Notenrechner { - public static void main(String[] args) { - JFrame fenster = new JFrame("Notenrechner"); - fenster.setSize(260, 180); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel frage = new JLabel("Punkte (0 bis 100):"); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Note berechnen"); - JLabel ergebnis = new JLabel("Note: ?"); - - knopf.addActionListener(e -> { - int punkte = Integer.parseInt(feld.getText()); - int note; - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else if (punkte >= 50) { - note = 4; - } else if (punkte >= 30) { - note = 5; - } else { - note = 6; - } - ergebnis.setText("Note: " + note); - }); - - fenster.add(frage); - fenster.add(feld); - fenster.add(knopf); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -\`\`\` - -Probiere 100, 85, 50 und 12 aus. - -## Falsche Eingaben abfangen - -Zwei Dinge können noch schiefgehen: - -1. Jemand tippt „abc“. Dann wirft \`Integer.parseInt\` eine \`NumberFormatException\`. -2. Jemand tippt 150 oder −5. Das ist zwar eine Zahl, aber keine gültige Punktzahl. - -Den ersten Fall fängst du mit try/catch ab, den zweiten mit einem \`if\` vor der Notenberechnung: - -\`\`\`java -knopf.addActionListener(e -> { - try { - int punkte = Integer.parseInt(feld.getText()); - if (punkte < 0 || punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - // hier die Notenberechnung von oben - } - } catch (NumberFormatException fehler) { - ergebnis.setText("Das ist keine Zahl."); - } -}); -\`\`\` - -::: ludwig -\`||\` heißt „oder“ (Lektion 9). Die Bedingung ist wahr, wenn die Punkte zu klein **oder** zu groß sind. -::: - -## Spiel: Welche Note? - -::: spiel frage -titel: Spiel: Welche Note? -intro: Ludwig hat Notenrechner gebaut, aber nicht alle sind richtig. Rechne nach, welche Note herauskommt. Sechs Runden. - -runde: - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else { - note = 4; - } -frage: punkte ist 81. Welche Note kommt heraus? -- 1 -- [x] 2 -- 3 -> 81 >= 92 ist falsch, 81 >= 81 ist wahr. Die Grenze gehört noch zur 2. - -runde: - if (punkte >= 92) { - note = 1; - } else if (punkte >= 81) { - note = 2; - } else if (punkte >= 67) { - note = 3; - } else if (punkte >= 50) { - note = 4; - } else { - note = 5; - } -frage: punkte ist 66. Welche Note kommt heraus? -- 3 -- [x] 4 -- 5 -> 66 >= 67 ist knapp falsch, 66 >= 50 ist wahr. Also Note 4. - -runde: - if (punkte >= 50) { - note = 4; - } else if (punkte >= 92) { - note = 1; - } else { - note = 6; - } -frage: punkte ist 95. Welche Note kommt heraus? -- 1 -- [x] 4 -- 6 -> Die erste wahre Bedingung gewinnt. 95 >= 50 ist schon wahr, die 1 wird nie erreicht. Deshalb prüft man von den hohen Punkten nach unten. - -runde: - note = 6; - if (punkte >= 30) { - note = 5; - } - if (punkte >= 50) { - note = 4; - } -frage: punkte ist 70. Welche Note steht danach in note? -- 6 -- 5 -- [x] 4 -> Ohne \`else\` wird jedes \`if\` geprüft. Beide sind wahr, das letzte setzt die Note 4. - -runde: - // note ist schon berechnet - if (punkte < 0 || punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - ergebnis.setText("Note: " + note); - } -frage: Im Textfeld steht 100. Was zeigt das Fenster? -- [x] Note: 1 -- Bitte 0 bis 100 eingeben. -- Das ist keine Zahl. -> 100 > 100 ist falsch. 100 Punkte sind also gültig und ergeben die Note 1. - -runde: - // note ist schon berechnet - if (punkte < 0 && punkte > 100) { - ergebnis.setText("Bitte 0 bis 100 eingeben."); - } else { - ergebnis.setText("Note: " + note); - } -frage: Im Textfeld steht 150. Was zeigt das Fenster? -- Bitte 0 bis 100 eingeben. -- [x] eine Note, obwohl 150 ungültig ist -- Das ist keine Zahl. -> Mit \`&&\` müssten die Punkte gleichzeitig unter 0 und über 100 sein. Das geht nie, also warnt das Programm nie. Richtig ist \`||\`. -::: - -## Aufgabe: Notenrechner - -Baue den Notenrechner zusammen, mit beiden Prüfungen aus dem letzten Schritt. Teste ihn mit 92, 91, 0, 100, 101 und „zehn“. - -Zusatz: Schreib die Note zusätzlich als Wort hin, zum Beispiel „Note: 2 (gut)“. Die Wörter sind sehr gut, gut, befriedigend, ausreichend, mangelhaft und ungenügend. - -**Du bist fertig, wenn …** - -- 92 und 100 eine 1 ergeben, 91 eine 2 und 0 eine 6, -- bei 101 der Hinweis „Bitte 0 bis 100 eingeben.“ erscheint, -- bei „zehn“ ein Hinweis erscheint und das Programm weiterläuft. - -::: ludwig -Teste immer die Grenzen: 92 muss eine 1 sein, 91 eine 2. An den Grenzen stecken die meisten Fehler, zum Beispiel \`>\` statt \`>=\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit else if Punkte in eine Note umrechnen. → Der Notenschlüssel -- Ich kann die Note im Fenster anzeigen. → Das Fenster -- Ich kann „abc“ und Punkte außerhalb von 0 bis 100 abfangen und melden. → Falsche Eingaben abfangen -- Ich kann ein Programm an den Grenzen testen, zum Beispiel mit 92 und 91. → Aufgabe: Notenrechner -::: - -## Wissenstest - -::: quiz -? Welche Note ergibt der Schlüssel bei 67 Punkten? -→ Der Notenschlüssel -- [ ] 2 -- [x] 3 -- [ ] 4 -> 67 ist die untere Grenze für die 3. - -? Warum reicht in jeder Bedingung die untere Grenze? -→ Der Notenschlüssel -- [x] Weil else if die oberen Fälle schon vorher aussortiert hat -- [ ] Weil Java obere Grenzen nicht kennt -- [ ] Weil die Punkte immer 100 sind - -? Welche Bedingung erkennt ungültige Punkte? -→ Falsche Eingaben abfangen -- [ ] punkte < 0 && punkte > 100 -- [x] punkte < 0 || punkte > 100 -- [ ] punkte >= 0 || punkte <= 100 -> Eine Zahl kann nicht gleichzeitig kleiner als 0 und größer als 100 sein, deshalb braucht es oder. -::: -`,zw=`--- -titel: Ein Taschenrechner -bereich: Fenster mit Swing -kurz: Zwei Spalten mit GridLayout, vier Rechenknöpfe und die Division durch 0 abfangen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit GridLayout(0, 2) zwei Spalten bauen -- erklären, warum "" + (a + b) Klammern braucht -- alle vier Rechenknöpfe programmieren -- einen Rechner bauen, der bei 0 und bei „abc“ nicht abstürzt -::: - -## Das Ziel - -Wir bauen einen kleinen Taschenrechner: zwei Textfelder für die Zahlen, vier Knöpfe **+**, **-**, **\\*** und **/** und eine Zeile für das Ergebnis. - -Neu sind diesmal **zwei Spalten** im GridLayout und **mehrere Knöpfe**, die alle mit denselben Textfeldern rechnen. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Zwei Spalten - -Bisher stand mit \`GridLayout(0, 1)\` alles untereinander. Mit \`GridLayout(0, 2)\` gibt es zwei Spalten. Die Bausteine füllen die Zellen in der Reihenfolge der \`add\`-Zeilen, immer erst links, dann rechts: - -| links | rechts | -|---|---| -| Erste Zahl: | Textfeld | -| Zweite Zahl: | Textfeld | -| + | - | -| \\* | / | -| Ergebnis: | ? | - -Die Beschriftungen links brauchst du später nicht mehr. Du kannst sie deshalb direkt in \`add\` bauen, ohne Variable: - -\`\`\`java -fenster.add(new JLabel("Erste Zahl:")); -fenster.add(feld1); -\`\`\` - -## Das Fenster mit dem ersten Knopf - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Rechner { - public static void main(String[] args) { - JFrame fenster = new JFrame("Rechner"); - fenster.setSize(280, 220); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 2)); - - JTextField feld1 = new JTextField(); - JTextField feld2 = new JTextField(); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - JButton mal = new JButton("*"); - JButton geteilt = new JButton("/"); - JLabel ergebnis = new JLabel("?"); - - plus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a + b)); - }); - - fenster.add(new JLabel("Erste Zahl:")); - fenster.add(feld1); - fenster.add(new JLabel("Zweite Zahl:")); - fenster.add(feld2); - fenster.add(plus); - fenster.add(minus); - fenster.add(mal); - fenster.add(geteilt); - fenster.add(new JLabel("Ergebnis:")); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -\`\`\` - -Tippe 3 und 4 ein und klicke auf +. Unten steht 7. - -::: ludwig -Achte auf die Klammern in \`"" + (a + b)\`. Ohne sie rechnet Java von links nach rechts: \`"" + a\` ergibt den Text „3“, und \`"3" + b\` hängt die 4 hinten an. Heraus kommt „34“ statt 7. Die Klammer sorgt dafür, dass zuerst gerechnet wird. -::: - -## Die anderen drei Knöpfe - -Die Knöpfe -, \\* und / funktionieren genauso. Nur das Rechenzeichen in der letzten Zeile ändert sich: - -\`\`\`java -minus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a - b)); -}); -\`\`\` - -Bei / gibt es zwei Besonderheiten: - -- Mit \`int\` schneidet Java beim Teilen die Nachkommastellen ab. 7 / 2 ergibt 3. -- Bei 0 als zweiter Zahl wirft Java eine \`ArithmeticException\`, wie bei der Aufgabe „Sicher teilen“ in Lektion 22. - -## Division durch 0 abfangen - -\`\`\`java -geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } -}); -\`\`\` - -::: angeberwissen -Mit \`double\` und \`Double.parseDouble(…)\` gibt es Nachkommastellen: 7 / 2 ergibt 3.5. Dafür wirft Java bei Kommazahlen keine Exception beim Teilen durch 0. Das Ergebnis heißt dann \`Infinity\`, also „unendlich“. -::: - -::: quiz -? Was zeigt der Rechner bei 8 geteilt durch 0? -- [ ] 0 -- [ ] Infinity -- [x] Nicht durch 0! -> Mit \`int\` wirft \`a / b\` eine \`ArithmeticException\`. Das \`catch\` fängt sie ab und zeigt den Hinweis. -::: - -## Eine eigene Methode - -Das steht nicht im Lehrplan, macht den Code aber kürzer. - -::: angeberwissen -Jeder Zuhörer liest dieselben zwei Felder. Diese Wiederholung kannst du in eine eigene Methode auslagern, ein Unterprogramm wie in Lektion 18. Sie steht in der Klasse neben \`main\`: - -\`static int zahl(JTextField feld) { return Integer.parseInt(feld.getText()); }\` - -Im Zuhörer heißt es dann nur noch \`ergebnis.setText("" + (zahl(feld1) + zahl(feld2)));\`. -::: - -## Spiel: Was zeigt der Rechner? - -::: spiel frage -titel: Spiel: Was zeigt der Rechner? -intro: Ludwig hat am Taschenrechner geschraubt. Lies den Zuhörer und sag vorher, was im Ergebnis steht. Sechs Runden. - -runde: - plus.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + a + b); - }); -frage: Du tippst 3 und 4 und klickst auf +. Was steht im Ergebnis? -- 7 -- [x] 34 -- 12 -> Ohne Klammern rechnet Java von links nach rechts: \`"" + 3\` ist der Text „3“, und \`+ 4\` hängt die 4 an. - -runde: - mal.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + a * b); - }); -frage: Du tippst 3 und 4 und klickst auf *. Was steht im Ergebnis? -- 34 -- [x] 12 -- 7 -> Punkt vor Strich gilt auch hier: Erst rechnet Java 3 * 4, dann hängt es die 12 an den Text. Beim Plus fehlt dieser Vorrang, darum braucht es dort die Klammern. - -runde: - geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - ergebnis.setText("" + (a / b)); - }); -frage: Du tippst 7 und 2 und klickst auf /. Was steht im Ergebnis? -- 3.5 -- [x] 3 -- 4 -> Mit \`int\` schneidet Java die Nachkommastellen ab. Es wird nicht gerundet. - -runde: - geteilt.addActionListener(e -> { - int a = Integer.parseInt(feld1.getText()); - int b = Integer.parseInt(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } - }); -frage: Du tippst 8 und 0 und klickst auf /. Was steht im Ergebnis? -- 0 -- [x] Nicht durch 0! -- Infinity -> Bei \`int\` wirft das Teilen durch 0 eine ArithmeticException, und \`catch\` schreibt den Hinweis. - -runde: - geteilt.addActionListener(e -> { - double a = Double.parseDouble(feld1.getText()); - double b = Double.parseDouble(feld2.getText()); - ergebnis.setText("" + (a / b)); - }); -frage: Du tippst 7 und 2 und klickst auf /. Was steht im Ergebnis? -- 3 -- [x] 3.5 -- 3.0 -> Mit \`double\` bleiben die Nachkommastellen erhalten. - -runde: - geteilt.addActionListener(e -> { - double a = Double.parseDouble(feld1.getText()); - double b = Double.parseDouble(feld2.getText()); - try { - ergebnis.setText("" + (a / b)); - } catch (ArithmeticException fehler) { - ergebnis.setText("Nicht durch 0!"); - } - }); -frage: Du tippst 8 und 0 und klickst auf /. Was steht im Ergebnis? -- Nicht durch 0! -- [x] Infinity -- 0.0 -> Bei \`double\` gibt es keine Exception. Das Ergebnis ist \`Infinity\`, also „unendlich“, und das \`catch\` kommt nie dran. -::: - -## Aufgabe: Taschenrechner - -Baue den Rechner fertig: - -- alle vier Knöpfe rechnen, -- / meldet „Nicht durch 0!“ statt abzustürzen, -- steht in einem Feld „abc“ oder nichts, erscheint „Bitte zwei Zahlen eingeben“. - -Zusatz: Ein fünfter Knopf **C** leert beide Felder und setzt das Ergebnis wieder auf „?“. - -**Du bist fertig, wenn …** - -- 7 und 2 bei +, −, * und / die Ergebnisse 9, 5, 14 und 3 zeigen, -- 7 / 0 „Nicht durch 0!“ meldet, -- bei „abc“ oder einem leeren Feld „Bitte zwei Zahlen eingeben“ erscheint und nichts abstürzt. - -::: ludwig -Für „abc“ brauchst du in jedem Zuhörer ein try/catch mit \`NumberFormatException\`. Hinter einem \`try\` dürfen auch zwei \`catch\` stehen, einer für \`NumberFormatException\` und einer für \`ArithmeticException\`. Ein leeres Feld liefert übrigens den Text \`""\`, und auch der ist keine Zahl. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit GridLayout(0, 2) zwei Spalten bauen. → Zwei Spalten -- Ich kann erklären, warum "" + (a + b) Klammern braucht. → Das Fenster mit dem ersten Knopf -- Ich kann alle vier Rechenknöpfe programmieren. → Die anderen drei Knöpfe -- Ich kann einen Rechner bauen, der bei 0 und bei „abc“ nicht abstürzt. → Aufgabe: Taschenrechner -::: - -## Wissenstest - -::: quiz -? a ist 3 und b ist 4. Was ergibt "" + a + b? -→ Das Fenster mit dem ersten Knopf -- [ ] 7 -- [x] 34 -- [ ] Einen Fehler -> Java rechnet von links nach rechts: Erst entsteht der Text "3", dann wird die 4 angehängt. - -? Was ergibt 7 / 2 mit int? -→ Die anderen drei Knöpfe -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? In welcher Reihenfolge füllt GridLayout(0, 2) die Zellen? -→ Zwei Spalten -- [x] Zeile für Zeile, jeweils erst links, dann rechts -- [ ] Spalte für Spalte, erst ganz links von oben nach unten -- [ ] Zufällig -::: -`,Iw=`--- -titel: Zahlenraten -bereich: Fenster mit Swing -kurz: Ein Spiel mit Zufallszahl, Versuchszähler und einem Knopf, der sich am Ende abschaltet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit Math.random eine ganze Zufallszahl von 1 bis 100 erzeugen -- entscheiden, welche Variablen in die Klasse gehören -- einen Knopf mit setEnabled abschalten -- ein Ratespiel mit einem Knopf „Neues Spiel“ bauen -::: - -## Das Ziel - -Jetzt wird gespielt: Der Computer denkt sich eine Zahl von 1 bis 100 aus. Du rätst, und das Fenster sagt dir „zu klein“ oder „zu groß“. Hast du sie gefunden, verrät es dir, wie viele Versuche du gebraucht hast. - -Neu sind diesmal **Zufallszahlen** und ein Knopf, der sich am Ende **abschaltet**. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Eine Zufallszahl - -\`Math.random()\` liefert eine zufällige Kommazahl von 0 bis knapp unter 1, zum Beispiel 0.4173. Daraus wird in drei Schritten eine ganze Zahl von 1 bis 100: - -\`\`\`java -int geheim = (int) (Math.random() * 100) + 1; -\`\`\` - -| Schritt | Beispiel | -|---|---| -| \`Math.random()\` | 0.4173 | -| \`* 100\` | 41.73 | -| \`(int)\` schneidet die Nachkommastellen ab | 41 | -| \`+ 1\` | 42 | - -Ohne \`+ 1\` käme 0 bis 99 heraus. - -Probiere es im Bereich [Code](#zeige-codelive) aus: \`int geheim = (int) (Math.random() * 100) + 1;\` und \`System.out.println(geheim);\`. Jedes Ausführen liefert eine andere Zahl. - -::: angeberwissen -Computer können eigentlich gar nicht würfeln. \`Math.random()\` rechnet mit einer Formel eine lange Folge von Zahlen aus, die nur zufällig **aussehen**. Man nennt sie Pseudozufallszahlen. Für Spiele reicht das völlig. -::: - -## Was sich das Spiel merkt - -Zwei Dinge muss sich das Spiel über alle Klicks hinweg merken: die geheime Zahl und die Zahl der Versuche. Wie beim Klickzähler aus Lektion 32 stehen beide in der Klasse: - -\`\`\`java -static int geheim = (int) (Math.random() * 100) + 1; -static int versuche = 0; -\`\`\` - -::: quiz -? Warum stehen \`geheim\` und \`versuche\` in der Klasse und nicht in \`main\`? -- [ ] Weil \`Math.random()\` nur in der Klasse funktioniert -- [x] Weil sie über alle Klicks erhalten bleiben und der Zuhörer \`versuche\` ändern muss -- [ ] Weil \`main\` keine Zahlen speichern kann -> Wie beim Klickzähler: Variablen aus \`main\` darf der Zuhörer nicht verändern. -::: - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Zahlenraten { - static int geheim = (int) (Math.random() * 100) + 1; - static int versuche = 0; - - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahlenraten"); - fenster.setSize(320, 180); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JLabel hinweis = new JLabel("Ich denke mir eine Zahl von 1 bis 100."); - JTextField feld = new JTextField(); - JButton knopf = new JButton("Raten"); - - knopf.addActionListener(e -> { - int tipp = Integer.parseInt(feld.getText()); - versuche++; - if (tipp < geheim) { - hinweis.setText(tipp + " ist zu klein."); - } else if (tipp > geheim) { - hinweis.setText(tipp + " ist zu groß."); - } else { - hinweis.setText("Richtig! Du hast " + versuche + " Versuche gebraucht."); - knopf.setEnabled(false); - } - feld.setText(""); - }); - - fenster.add(hinweis); - fenster.add(feld); - fenster.add(knopf); - fenster.setVisible(true); - } -} -\`\`\` - -- \`feld.setText("")\` leert das Textfeld nach jedem Tipp, damit du gleich den nächsten eintippen kannst. -- \`knopf.setEnabled(false)\` schaltet den Knopf ab. Er wird grau und lässt sich nicht mehr klicken. Das Spiel ist vorbei. - -::: ludwig -Mit \`setEnabled(true)\` schaltest du einen Knopf wieder ein. So kannst du zum Beispiel einen Knopf erst freigeben, wenn etwas eingegeben wurde. -::: - -## Mit 7 Versuchen gewinnen - -::: angeberwissen -Wer geschickt rät, braucht nie mehr als 7 Versuche. Rate immer die Mitte des Bereichs, der noch übrig ist: erst 50, dann 25 oder 75 und so weiter. Jeder Tipp halbiert den Bereich: 100, 50, 25, 13, 7, 4, 2, 1. Das ist die **binäre Suche** aus Lektion 19. Weil 2 hoch 7 = 128 größer als 100 ist, reichen 7 Tipps. -::: - -## Aufgabe: Zahlenraten - -Baue das Spiel nach und mach es besser: - -- Eine Eingabe wie „abc“ zählt nicht als Versuch und bringt den Hinweis „Bitte eine Zahl eingeben“. -- Ein zweiter Knopf **Neues Spiel** denkt sich eine neue Zahl aus, setzt die Versuche auf 0, schaltet den Knopf Raten wieder ein und setzt den Hinweis zurück. - -Zusatz: Nach 7 Fehlversuchen ist das Spiel verloren. Das Fenster verrät dann die geheime Zahl. - -**Du bist fertig, wenn …** - -- du bei jedem falschen Tipp „zu klein“ oder „zu groß“ siehst, -- „abc“ den Hinweis „Bitte eine Zahl eingeben“ bringt und die Versuche dabei gleich bleiben, -- **Neues Spiel** die Versuche auf 0 setzt, den Knopf Raten wieder einschaltet und den Hinweis zurücksetzt. - -::: ludwig -Für „zählt nicht als Versuch“ muss \`versuche++\` **hinter** \`Integer.parseInt\` stehen, beides im \`try\`-Block. Wirft \`parseInt\` eine Exception, wird die Zeile mit \`versuche++\` übersprungen. -::: - -## Spiel: Zu klein oder zu groß? - -::: spiel frage -titel: Spiel: Zu klein oder zu groß? -intro: Ludwig spielt Zahlenraten. Lies den Code und sag vorher, was passiert. Sieben Runden. - -runde: - // geheim ist 42 - if (tipp < geheim) { - hinweis.setText(tipp + " ist zu klein."); - } else if (tipp > geheim) { - hinweis.setText(tipp + " ist zu groß."); - } else { - hinweis.setText("Richtig!"); - } -frage: Ludwig tippt 50. Was steht im Hinweis? -- 50 ist zu klein. -- [x] 50 ist zu groß. -- Richtig! -> 50 ist größer als 42. - -runde: -frage: Die Zahl liegt von 1 bis 100. 50 war zu groß, 25 war zu klein. Welche Zahl rät Ludwig klug als Nächstes? -- 26 -- [x] 37 -- 49 -> Übrig sind 26 bis 49. Die Mitte davon ist 37 (oder 38). So halbiert jeder Tipp den Bereich. - -runde: - int wurf = (int) (Math.random() * 6) + 1; -frage: Welche Zahlen kann \`wurf\` haben? -- 0 bis 6 -- [x] 1 bis 6 -- 1 bis 7 -> \`Math.random() * 6\` liegt von 0 bis knapp unter 6. \`(int)\` macht 0 bis 5 daraus, \`+ 1\` dann 1 bis 6. Ein Würfel! - -runde: - int zahl = (int) (Math.random() * 10); -frage: Welche Zahlen kann \`zahl\` haben? -- [x] 0 bis 9 -- 1 bis 10 -- 0 bis 10 -> Ohne \`+ 1\` fängt es bei 0 an, und die 10 wird nie erreicht. - -runde: - // geheim ist 42 - versuche++; - if (tipp == geheim) { - hinweis.setText("Richtig! Du hast " + versuche + " Versuche gebraucht."); - } -frage: Ludwig tippt 50, dann 25, dann 42. Was steht am Ende im Hinweis? -- Richtig! Du hast 2 Versuche gebraucht. -- [x] Richtig! Du hast 3 Versuche gebraucht. -- Richtig! Du hast 42 Versuche gebraucht. -> \`versuche++\` zählt bei jedem Klick hoch, auch beim Treffer. - -runde: - knopf.setEnabled(false); -frage: Ludwig hat die Zahl gefunden und klickt noch einmal auf **Raten**. Was passiert? -- Das Spiel beginnt von vorn. -- Es zählt einen Versuch mehr. -- [x] Nichts, der Knopf ist grau und lässt sich nicht klicken. -> \`setEnabled(false)\` schaltet den Knopf ab. - -runde: -frage: Die Zahl liegt jetzt von 1 bis 1000. Wie viele Tipps braucht man mit der binären Suche höchstens? -- 7 -- [x] 10 -- 500 -> 2 hoch 10 = 1024 ist größer als 1000. Zehn Halbierungen reichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit Math.random eine ganze Zufallszahl von 1 bis 100 erzeugen. → Eine Zufallszahl -- Ich kann entscheiden, welche Variablen in die Klasse gehören. → Was sich das Spiel merkt -- Ich kann einen Knopf mit setEnabled abschalten. → Das ganze Programm -- Ich kann ein Ratespiel mit einem Knopf „Neues Spiel“ bauen. → Aufgabe: Zahlenraten -::: - -## Wissenstest - -::: quiz -? Welche Zahlen liefert (int) (Math.random() * 100) + 1? -→ Eine Zufallszahl -- [ ] 0 bis 100 -- [x] 1 bis 100 -- [ ] 1 bis 101 - -? Was macht knopf.setEnabled(false)? -→ Das ganze Programm -- [ ] Es löscht den Knopf aus dem Fenster. -- [x] Der Knopf wird grau und lässt sich nicht mehr klicken. -- [ ] Es ändert die Beschriftung des Knopfs. - -? Wie viele Versuche braucht man mit der binären Suche höchstens bei 1 bis 100? -→ Aufgabe: Zahlenraten -- [ ] 50 -- [ ] 10 -- [x] 7 -> Jeder Tipp halbiert den Bereich, und 2 hoch 7 = 128 ist größer als 100. -::: -`,kw=`--- -titel: Viele Knöpfe, ein Zuhörer -bereich: Fenster mit Swing -kurz: Ein Zuhörer für viele Knöpfe, mit getActionCommand und getSource herausfinden, welcher Knopf geklickt wurde. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Zuhörer in einer Variable vom Typ ActionListener speichern und bei mehreren Knöpfen anmelden -- erklären, was getActionCommand und getSource liefern -- Knöpfe in einer Schleife auf ein JPanel setzen -- ein Zahlenschloss bauen, das sich nur mit dem richtigen Code öffnet -::: - -## Das Ziel - -Seit der Sache mit dem Kuchen will Ludwig seinen Stall abschließen. Er baut ein **Zahlenschloss**: neun Zifferntasten, eine Null, **C** zum Löschen und **OK** zum Prüfen. Nur wer 1234 eintippt, bekommt „Tor offen!“. - -Das sind zwölf Knöpfe. Bisher hatte jeder Knopf seinen eigenen Zuhörer, wie beim Taschenrechner in Lektion 35. Heute lernst du, wie **ein** Zuhörer für alle Knöpfe reicht. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Neun fast gleiche Zuhörer - -So sähe es mit einem Zuhörer pro Taste aus: - -\`\`\`java -eins.addActionListener(e -> anzeige.setText(anzeige.getText() + "1")); -zwei.addActionListener(e -> anzeige.setText(anzeige.getText() + "2")); -drei.addActionListener(e -> anzeige.setText(anzeige.getText() + "3")); -// ... und so weiter bis 9 -\`\`\` - -Die Zeilen unterscheiden sich nur in der Ziffer. Wer eine Kleinigkeit ändern will, muss es neunmal tun und vergisst bestimmt eine Zeile. - -## Ein Zuhörer als Variable - -Ein Zuhörer kann auch in einer **Variable** stehen. Ihr Datentyp ist \`ActionListener\`, der Vertrag aus Lektion 30. Danach meldest du denselben Zuhörer bei mehreren Knöpfen an: - -\`\`\`java -ActionListener ziffer = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - -eins.addActionListener(ziffer); -zwei.addActionListener(ziffer); -drei.addActionListener(ziffer); -\`\`\` - -\`ActionListener\` steht im Paket \`java.awt.event\`. Du brauchst deshalb oben \`import java.awt.event.*;\`. - -Jetzt gibt es den Code nur einmal. Aber woher weiß der Zuhörer, welche Ziffer er anhängen soll? - -## Wer hat geklickt? - -Das \`e\` vor dem Pfeil ist das **Ereignis**, ein Objekt vom Typ \`ActionEvent\`. Der Knopf gibt es bei jedem Klick mit, und darin steht, was passiert ist: - -| Aufruf | Liefert | Beispiel | -|---|---|---| -| \`e.getActionCommand()\` | die Beschriftung des geklickten Knopfs, als Text | \`"7"\` | -| \`e.getSource()\` | den geklickten Knopf selbst | der Knopf \`ok\` | - -- \`getActionCommand()\` ist praktisch, wenn die Beschriftung schon sagt, was zu tun ist, wie bei den Ziffern. -- \`getSource()\` vergleichst du mit \`==\` mit einem Knopf: \`if (e.getSource() == ok)\`. Hier ist \`==\` richtig, denn es geht um genau dieses eine Objekt, nicht um einen Text. - -::: ludwig -Texte vergleichst du mit \`equals\`, Knöpfe mit \`==\`. Willst du über die Beschriftung entscheiden, schreibst du \`e.getActionCommand().equals("OK")\`. Das geht auch, bricht aber, sobald jemand die Beschriftung in „Öffnen“ ändert. \`e.getSource() == ok\` bleibt richtig. -::: - -## Knöpfe in einer Schleife - -Mit einem gemeinsamen Zuhörer kannst du die Zifferntasten sogar in einer Schleife bauen. Damit sie ordentlich im Raster stehen, kommen sie auf ein **JPanel**. Ein JPanel ist eine Fläche im Fenster mit einem eigenen Layout: - -\`\`\`java -JPanel tasten = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton ziffer = new JButton("" + i); - ziffer.addActionListener(taste); - tasten.add(ziffer); -} -\`\`\` - -- \`"" + i\` macht aus der Zahl \`i\` den Text für die Beschriftung. -- In jedem Durchlauf entsteht ein neuer Knopf. Alle bekommen denselben Zuhörer \`taste\`. -- \`fenster.add(tasten, BorderLayout.CENTER)\` setzt die ganze Fläche mit allen Tasten ins Fenster. - -::: quiz -? Wie viele Knöpfe und wie viele Zuhörer entstehen in dieser Schleife? -- [ ] 9 Knöpfe und 9 Zuhörer -- [x] 9 Knöpfe und 1 Zuhörer -- [ ] 1 Knopf und 9 Zuhörer -> In jedem Durchlauf kommt ein neuer Knopf dazu. Alle bekommen denselben Zuhörer \`taste\`. -::: - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Zahlenschloss { - public static void main(String[] args) { - JFrame fenster = new JFrame("Zahlenschloss"); - fenster.setSize(240, 300); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new BorderLayout()); - - JLabel anzeige = new JLabel("", SwingConstants.CENTER); - JPanel tasten = new JPanel(new GridLayout(0, 3)); - JButton loeschen = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener taste = e -> { - if (e.getSource() == loeschen) { - anzeige.setText(""); - } else if (e.getSource() == ok) { - if (anzeige.getText().equals("1234")) { - anzeige.setText("Tor offen!"); - } else { - anzeige.setText("Falsch"); - } - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton ziffer = new JButton("" + i); - ziffer.addActionListener(taste); - tasten.add(ziffer); - } - JButton nullTaste = new JButton("0"); - nullTaste.addActionListener(taste); - loeschen.addActionListener(taste); - ok.addActionListener(taste); - tasten.add(loeschen); - tasten.add(nullTaste); - tasten.add(ok); - - fenster.add(anzeige, BorderLayout.NORTH); - fenster.add(tasten, BorderLayout.CENTER); - fenster.setVisible(true); - } -} -\`\`\` - -- \`loeschen\` und \`ok\` werden **vor** dem Zuhörer angelegt, denn der Zuhörer vergleicht mit ihnen. -- Der Zuhörer prüft erst die beiden besonderen Knöpfe. Alle anderen sind Ziffern und hängen ihre Beschriftung an. -- Die Null heißt \`nullTaste\`, weil \`null\` in Java schon ein Wort mit fester Bedeutung ist. - -::: angeberwissen -Das Zahlenfeld am Telefon hat die 1 oben links, das am Taschenrechner und an der Computertastatur hat die 7 oben links. Warum? Als die Tastentelefone kamen, gab es Tests mit Leuten, die damit wählen sollten. Mit der 1 oben ging es schneller, und Rechenmaschinen hatten ihre Anordnung da schon längst. Ludwigs Schloss macht es wie das Telefon. -::: - -## Spiel: Wer hat geklickt? - -::: spiel zuhoerer -titel: Spiel: Wer hat geklickt? -intro: In jeder Runde hört **ein** Zuhörer an mehreren Knöpfen. Ludwig zeigt dir Code, Fenster und die Klicks. Was steht am Ende in der Anzeige? Danach spielt Ludwig die Klicks ab. -frage: Was steht nach den Klicks in der Anzeige? - -runde: - JFrame fenster = new JFrame("Buchstaben"); - JLabel anzeige = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> Ein Zuhörer, zwei Knöpfe. \`e.getActionCommand()\` liefert jedes Mal die Beschriftung des geklickten Knopfs, und sie wird hinten angehängt. - -runde: - JFrame fenster = new JFrame("Zähler"); - static int zahl = 0; - JLabel anzeige = new JLabel("0"); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == plus) { - zahl++; - } else { - zahl--; - } - anzeige.setText("" + zahl); - }; - plus.addActionListener(z); - minus.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> \`e.getSource()\` sagt, welcher Knopf es war. Zweimal plus, einmal minus: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame fenster = new JFrame("Buchstaben"); - JLabel anzeige = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> anzeige.setText(anzeige.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> Der Zuhörer ist nur bei A und B angemeldet. Beim Klick auf C hört niemand zu. - -runde: - JFrame fenster = new JFrame("Tasten"); - JLabel anzeige = new JLabel(""); - JButton eins = new JButton("1"); - JButton zwei = new JButton("2"); - JButton weg = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - anzeige.setText(""); - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - eins.addActionListener(z); - zwei.addActionListener(z); - weg.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> Nach 1 und 2 steht „12“ da. C löscht alles, und die letzte 1 steht allein. - -runde: - JFrame fenster = new JFrame("Schloss"); - JLabel anzeige = new JLabel(""); - JButton vier = new JButton("4"); - JButton zwei = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (anzeige.getText().equals("42")) { - anzeige.setText("Tor offen!"); - } else { - anzeige.setText("Falsch"); - } - } else { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; - vier.addActionListener(z); - zwei.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Tor offen! -- [x] Falsch -- 24OK -> Eingetippt ist „24“, das Geheimnis ist aber „42“. Die Reihenfolge der Klicks zählt. -::: - -## Aufgabe: Zahlenschloss - -Baue das Zahlenschloss nach und probiere es aus. - -Dann mach es besser: - -- Nach drei falschen Versuchen schaltet sich **OK** ab, wie der Knopf beim Zahlenraten in Lektion 36. Zähle die Versuche in einer \`static int\`-Variable in der Klasse. -- Zusatz: Die Anzeige zeigt \`*\` statt der Ziffern. Merke dir die echte Eingabe in einer \`static String eingabe = "";\` und hänge an die Anzeige nur einen Stern an. - -**Du bist fertig, wenn …** - -- der richtige Code das Schloss öffnet und ein falscher nicht, -- nach drei falschen Versuchen **OK** ausgeschaltet ist, -- im Zusatz die Anzeige nur Sterne zeigt, der Code aber trotzdem geprüft wird. - -::: ludwig -Zähle im Zweig für **OK** bei jedem falschen Code \`versuche++\` und prüfe danach \`if (versuche >= 3)\`. Dann schaltet \`ok.setEnabled(false)\` den Knopf ab, wie beim Zahlenraten. Für die Sterne: \`eingabe = eingabe + e.getActionCommand();\` und \`anzeige.setText(anzeige.getText() + "*");\`. Verglichen wird dann \`eingabe\`, nicht der Text der Anzeige. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Zuhörer in einer Variable vom Typ ActionListener speichern und bei mehreren Knöpfen anmelden. → Ein Zuhörer als Variable -- Ich kann erklären, was getActionCommand und getSource liefern. → Wer hat geklickt? -- Ich kann Knöpfe in einer Schleife auf ein JPanel setzen. → Knöpfe in einer Schleife -- Ich kann ein Zahlenschloss bauen, das sich nur mit dem richtigen Code öffnet. → Aufgabe: Zahlenschloss -::: - -## Wissenstest - -::: quiz -? Was liefert e.getActionCommand() bei einem Klick auf den Knopf new JButton("7")? -→ Wer hat geklickt? -- [ ] die Zahl 7 -- [x] den Text "7" -- [ ] den Knopf selbst - -? Wie prüfst du, ob der Knopf ok geklickt wurde? -→ Wer hat geklickt? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource liefert den Knopf selbst, und den vergleichst du mit ==. - -? Warum steht ein Zuhörer in einer Variable? -→ Ein Zuhörer als Variable -- [ ] Damit er schneller läuft. -- [x] Damit man ihn bei mehreren Knöpfen anmelden kann und den Code nur einmal schreibt. -- [ ] Weil Lambdas sonst nicht erlaubt sind. - -? Ordne zu. -→ Wer hat geklickt? -= ActionListener -> Datentyp eines Zuhörers -= ActionEvent -> das Ereignis e mit den Infos zum Klick -= JPanel -> eine Fläche mit eigenem Layout -::: -`,Sw=`--- -titel: Innere Klassen -bereich: Fenster mit Swing -kurz: Einen Zuhörer als benannte innere Klasse, als anonyme Klasse und als Lambda schreiben und wissen, wer was sehen darf. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Zuhörer als benannte innere Klasse schreiben -- einen Zuhörer als anonyme Klasse schreiben -- erklären, was beim Lambda weggelassen wird -- erklären, welche Schreibweise welche Variablen sieht -- einen Zähler mit drei Knöpfen in drei Schreibweisen bauen -::: - -## Das Ziel - -Den Klickzähler aus Lektion 32 kennst du schon. Heute schreibst du seinen Zuhörer auf **drei Arten**, die alle genau dasselbe tun: - -1. als **benannte innere Klasse**, wie man es vor Java 8 meistens gemacht hat, -2. als **anonyme Klasse**, die du aus Lektion 30 („ActionListener ist ein Interface“) kennst, -3. als **Lambda** mit dem Pfeil, so wie bisher. - -In fremdem Code, in Büchern und im Internet triffst du alle drei Schreibweisen. Nach dieser Lektion erkennst du sie. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Erinnerung: der Vertrag - -Ein Zuhörer ist alles, was den Vertrag \`ActionListener\` erfüllt. Darin steht genau eine Methode: - -\`\`\` -public void actionPerformed(ActionEvent e) -\`\`\` - -Der Knopf ruft sie bei jedem Klick auf. Die drei Schreibweisen sind drei Wege, diese eine Methode zu liefern. - -## 1. Die benannte innere Klasse - -Eine **innere Klasse** steht innerhalb einer anderen Klasse. Sie hat einen Namen, hier \`Plus\`, und erfüllt den Vertrag mit \`implements ActionListener\`: - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Zaehler { - static int anzahl = 0; - static JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - static class Plus implements ActionListener { - public void actionPerformed(ActionEvent e) { - anzahl++; - zahl.setText("" + anzahl); - } - } - - public static void main(String[] args) { - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - JButton nochmal = new JButton("Auch +1"); - plus.addActionListener(new Plus()); - nochmal.addActionListener(new Plus()); - - fenster.add(zahl); - fenster.add(plus); - fenster.add(nochmal); - fenster.setVisible(true); - } -} -\`\`\` - -- \`new Plus()\` erzeugt ein Objekt der Klasse \`Plus\`. Das ist der Zuhörer, den der Knopf bekommt. -- Weil die Klasse einen Namen hat, kannst du sie bei mehreren Knöpfen benutzen, hier bei \`plus\` und \`nochmal\`. -- Die Klasse steht **außerhalb** von \`main\`. Darum sieht sie nur, was in der Klasse \`Zaehler\` steht: \`anzahl\` und \`zahl\`. Deshalb ist \`zahl\` diesmal eine Variable der Klasse und nicht von \`main\`. -- \`static class\` brauchst du, weil \`main\` static ist. Ohne \`static\` meldet javac „non-static variable this cannot be referenced from a static context“. - -## 2. Die anonyme Klasse - -Brauchst du den Zuhörer nur an einer Stelle, kannst du die Klasse direkt dort schreiben, wo das Objekt gebraucht wird. Sie bekommt dann keinen Namen: - -\`\`\`java -plus.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - anzahl++; - zahl.setText("" + anzahl); - } -}); -\`\`\` - -- \`new ActionListener() { … }\` heißt: „ein neues Objekt, das den Vertrag ActionListener erfüllt, und zwar so: …“. -- Am Ende steht \`});\`: die geschweifte Klammer schließt die Klasse, die runde den Aufruf von \`addActionListener\`. -- Die anonyme Klasse steht **in** \`main\`. Sie sieht deshalb auch die Variablen von \`main\`, solange diese sich nicht mehr ändern. - -::: quiz -? Was schließt \`});\` am Ende der anonymen Klasse? -- [x] \`}\` schließt die Klasse, \`)\` den Aufruf von \`addActionListener\`. -- [ ] \`}\` schließt \`main\`, \`)\` die Klasse. -- [ ] Beides schließt die Methode \`actionPerformed\`. -> Die Methode \`actionPerformed\` endet schon eine Zeile davor mit ihrer eigenen \`}\`. -::: - -## 3. Das Lambda - -Das Lambda ist die Kurzform der anonymen Klasse, seit Java 8: - -\`\`\`java -plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); -}); -\`\`\` - -Weggelassen wird alles, was Java sowieso weiß: \`new ActionListener()\`, der Name \`actionPerformed\`, \`public void\` und der Typ \`ActionEvent\`. Übrig bleiben der Parameter \`e\`, der Pfeil und der Rumpf. Das geht nur, weil der Vertrag genau **eine** Methode hat. - -## Die drei im Vergleich - -| | benannte innere Klasse | anonyme Klasse | Lambda | -|---|---|---|---| -| hat einen Namen | ja, z. B. \`Plus\` | nein | nein | -| steht | in der Klasse, außerhalb von \`main\` | direkt beim Knopf | direkt beim Knopf | -| für mehrere Knöpfe | ja, \`new Plus()\` | nein | ja, in einer Variable (Lektion 37) | -| sieht Variablen von \`main\` | nein | ja, wenn sie sich nicht ändern | ja, wenn sie sich nicht ändern | -| Länge | am längsten | mittel | am kürzesten | - -::: ludwig -Wenn sich eine Variable von \`main\` im Zuhörer ändern soll, wie \`anzahl++\`, muss sie in die Klasse, egal welche Schreibweise du nimmst. Das war das Problem aus Lektion 32. -::: - -::: angeberwissen -Schau nach dem Übersetzen in den Ordner mit den \`.class\`-Dateien. Für jede Klasse legt javac eine Datei an: \`Zaehler.class\`, für die innere Klasse \`Zaehler$Plus.class\` und für die anonyme Klasse \`Zaehler$1.class\`. Weil sie keinen Namen hat, bekommt sie eine Nummer. Für ein Lambda gibt es keine eigene Datei, Java baut es erst beim Start. -::: - -## Spiel: Welche Schreibweise? - -::: spiel frage -titel: Spiel: Welche Schreibweise? -intro: Ludwig zeigt dir Zuhörer aus fremden Programmen. Welche Schreibweise ist das? Sechs Runden. -frage: Welche Schreibweise ist das? -antworten: benannte innere Klasse | anonyme Klasse | Lambda - -runde: - knopf.addActionListener(e -> text.setText("Hallo")); -richtig: Lambda -> Der Pfeil \`->\` verrät das Lambda. - -runde: - knopf.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - text.setText("Hallo"); - } - }); -richtig: anonyme Klasse -> \`new ActionListener() {\` und dahinter eine ganze Methode: Hier wird eine Klasse ohne Namen geschrieben. - -runde: - static class Gruss implements ActionListener { - public void actionPerformed(ActionEvent e) { - text.setText("Hallo"); - } - } -richtig: benannte innere Klasse -> Die Klasse heißt \`Gruss\` und erfüllt den Vertrag mit \`implements ActionListener\`. - -runde: - knopf.addActionListener(new Gruss()); -richtig: benannte innere Klasse -> \`new Gruss()\` erzeugt ein Objekt der Klasse \`Gruss\`. Die Klasse selbst steht woanders, sie hat einen Namen. - -runde: - ActionListener taste = e -> { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - }; -richtig: Lambda -> Ein Lambda in einer Variable, wie beim Zahlenschloss in Lektion 37. Der Pfeil verrät es. - -runde: - ActionListener taste = new ActionListener() { - public void actionPerformed(ActionEvent e) { - anzeige.setText(anzeige.getText() + e.getActionCommand()); - } - }; -richtig: anonyme Klasse -> Auch eine anonyme Klasse kann in einer Variable stehen. Dann kann man sie wie das Lambda bei mehreren Knöpfen anmelden. -::: - -## Aufgabe: Ein Zähler, drei Schreibweisen - -Baue den Klickzähler mit drei Knöpfen: - -- **+1** bekommt die benannte innere Klasse \`Plus\`. -- **-1** bekommt eine anonyme Klasse. -- **Reset** bekommt ein Lambda. - -Probiere aus, ob alle drei Knöpfe wie erwartet zählen. Lass dann bei der Klasse \`Plus\` das \`static\` weg und lies die Fehlermeldung von javac. - -**Du bist fertig, wenn …** - -- **+1** hoch-, **-1** herunterzählt und **Reset** auf 0 setzt, -- im Code genau eine benannte innere Klasse, eine anonyme Klasse und ein Lambda stehen, -- du ohne \`static\` bei \`Plus\` die Fehlermeldung von javac gelesen hast und erklären kannst, was sie bedeutet. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Zuhörer als benannte innere Klasse schreiben. → 1. Die benannte innere Klasse -- Ich kann einen Zuhörer als anonyme Klasse schreiben. → 2. Die anonyme Klasse -- Ich kann erklären, was beim Lambda weggelassen wird. → 3. Das Lambda -- Ich kann erklären, welche Schreibweise welche Variablen sieht. → Die drei im Vergleich -- Ich kann einen Zähler mit drei Knöpfen in drei Schreibweisen bauen. → Aufgabe: Ein Zähler, drei Schreibweisen -::: - -## Wissenstest - -::: quiz -? Warum geht die Kurzform mit dem Pfeil bei ActionListener? -→ 3. Das Lambda -- [ ] Weil ActionListener eine Klasse ist. -- [x] Weil der Vertrag genau eine Methode hat. -- [ ] Weil der Knopf es so verlangt. - -? Welche Schreibweise kannst du mit new Plus() bei mehreren Knöpfen benutzen, ohne sie in eine Variable zu speichern? -→ 1. Die benannte innere Klasse -- [x] die benannte innere Klasse -- [ ] die anonyme Klasse -- [ ] das Lambda - -? Warum steht static vor class Plus? -→ 1. Die benannte innere Klasse -- [ ] Damit die Klasse schneller ist. -- [x] Weil main static ist und sonst kein Objekt von Plus erzeugen kann. -- [ ] Weil jede Klasse static sein muss. - -? Ordne zu. -→ Die drei im Vergleich -= class Plus implements ActionListener -> benannte innere Klasse -= new ActionListener() { … } -> anonyme Klasse -= der Pfeil hinter e -> Lambda -::: -`,Tw=`--- -titel: Zwei Reiter -bereich: Fenster mit Swing -kurz: Ein Fenster mit zwei Reitern bauen, Daten von einem Reiter zum anderen bringen und die Liste als Textdatei speichern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Fenster mit zwei Reitern bauen -- mit append Zeilen an eine JTextArea anhängen -- erklären, warum ein Zuhörer Bausteine auf beiden Reitern benutzen kann -- im Zuhörer mit try und catch eine Datei speichern -- eine Einkaufsliste bauen, die mitzählt, wie viele Dinge darauf stehen -::: - -## Das Ziel - -Ludwigs Einkaufsliste aus Lektion 23 bekommt ein Fenster. Es hat zwei **Reiter**, wie die Tabs im Browser: - -- Im Reiter **Eingabe** tippst du ein, was du brauchst, und klickst auf **Hinzufügen**. -- Im Reiter **Liste** steht alles, was du eingegeben hast. Ein Knopf **Speichern** schreibt die Liste in eine Textdatei. - -Neu sind die Reiter (\`JTabbedPane\`), ein Textbereich mit mehreren Zeilen (\`JTextArea\`) und das Speichern aus einem Zuhörer heraus. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Reiter mit JTabbedPane - -Jeder Reiter zeigt eine eigene Fläche. Die Flächen sind JPanels, wie das Tastenfeld beim Zahlenschloss in Lektion 37: - -\`\`\`java -JTabbedPane reiter = new JTabbedPane(); -JPanel eingabe = new JPanel(new GridLayout(0, 1)); -JPanel liste = new JPanel(new BorderLayout()); - -reiter.addTab("Eingabe", eingabe); -reiter.addTab("Liste", liste); -fenster.add(reiter); -\`\`\` - -| Aufruf | Bedeutung | -|---|---| -| \`addTab("Eingabe", eingabe)\` | neuer Reiter mit der Beschriftung „Eingabe“, er zeigt das JPanel \`eingabe\` | -| \`setSelectedIndex(1)\` | wechselt zum zweiten Reiter, gezählt wird ab 0 | -| \`setTitleAt(1, "Liste (3)")\` | ändert die Beschriftung des zweiten Reiters | - -Beim Start ist der Reiter offen, der zuerst hinzugefügt wurde. - -## Ein Textbereich mit mehreren Zeilen - -Ein \`JTextField\` hat nur eine Zeile. Für die Liste brauchst du eine \`JTextArea\`: - -\`\`\`java -JTextArea bereich = new JTextArea(); -bereich.setEditable(false); -bereich.append("Heu\\n"); -\`\`\` - -- \`append\` hängt Text hinten an. Das \`"\\n"\` beginnt danach eine neue Zeile, wie beim Zerlegen mit \`split("\\n")\` in Lektion 24. -- \`setEditable(false)\` verhindert, dass man in der Liste selbst herumtippt. -- \`getText()\` liefert den ganzen Text mit allen Zeilen. - -::: quiz -? Was macht \`bereich.append("Heu\\n")\`? -- [ ] Es ersetzt den ganzen Text durch „Heu“. -- [x] Es hängt „Heu“ hinten an und beginnt danach eine neue Zeile. -- [ ] Es schreibt „Heu\\n“ genau so in die Liste. -> \`append\` hängt an, \`"\\n"\` ist der Zeilenumbruch. -::: - -## Von einem Reiter zum anderen - -Der Knopf **Hinzufügen** steht im Reiter Eingabe, der Textbereich im Reiter Liste. Trotzdem kann der Zuhörer beide benutzen. Alle Bausteine sind Variablen in \`main\`, und das Lambda sieht sie alle, egal auf welchem Reiter sie später angezeigt werden: - -\`\`\`java -hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\\n"); - info.setText(feld.getText() + " steht auf der Liste."); - feld.setText(""); -}); -\`\`\` - -::: ludwig -Ein Baustein kann nur auf **einer** Fläche liegen. Fügst du denselben Knopf erst zu \`eingabe\` und dann zu \`liste\` hinzu, nimmt Swing ihn bei \`eingabe\` wieder weg. Er erscheint nur im Reiter Liste. -::: - -## Speichern im Zuhörer - -Zum Speichern nimmst du den \`PrintWriter\` aus Lektion 23. Im Zuhörer gibt es aber einen Haken: Den Ausweg \`throws Exception\` aus Lektion 23 gibt es hier nicht. Das Lambda ist eine eigene Methode, \`actionPerformed\`, und die darf laut Vertrag keine \`FileNotFoundException\` weiterwerfen. Darum steht das Speichern in try und catch: - -\`\`\`java -speichern.addActionListener(e -> { - try { - PrintWriter aus = new PrintWriter("einkaufsliste.txt"); - aus.print(bereich.getText()); - aus.close(); - info.setText("Gespeichert in einkaufsliste.txt"); - reiter.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Speichern ging nicht."); - } -}); -\`\`\` - -- Die Exception heißt hier \`ex\`, weil der Name \`e\` schon für das Ereignis vergeben ist. -- Nach dem Speichern springt das Fenster mit \`setSelectedIndex(0)\` zurück zum Reiter Eingabe, wo die Meldung steht. -- VisuStruct zeigt die gespeicherte Datei unter der Konsole, sobald du auf Speichern geklickt hast. - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class Einkaufsliste { - public static void main(String[] args) { - JFrame fenster = new JFrame("Einkaufsliste"); - fenster.setSize(300, 250); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane reiter = new JTabbedPane(); - - JPanel eingabe = new JPanel(new GridLayout(0, 1)); - JTextField feld = new JTextField(); - JButton hinzufuegen = new JButton("Hinzufügen"); - JLabel info = new JLabel("Noch nichts auf der Liste."); - eingabe.add(new JLabel("Was brauchst du?")); - eingabe.add(feld); - eingabe.add(hinzufuegen); - eingabe.add(info); - - JPanel liste = new JPanel(new BorderLayout()); - JTextArea bereich = new JTextArea(); - bereich.setEditable(false); - JButton speichern = new JButton("Speichern"); - liste.add(bereich, BorderLayout.CENTER); - liste.add(speichern, BorderLayout.SOUTH); - - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); - - hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\\n"); - info.setText(feld.getText() + " steht auf der Liste."); - feld.setText(""); - }); - - speichern.addActionListener(e -> { - try { - PrintWriter aus = new PrintWriter("einkaufsliste.txt"); - aus.print(bereich.getText()); - aus.close(); - info.setText("Gespeichert in einkaufsliste.txt"); - reiter.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Speichern ging nicht."); - } - }); - - fenster.add(reiter); - fenster.setVisible(true); - } -} -\`\`\` - -Tippe Heu ein, klicke auf Hinzufügen, dann Äpfel und noch einmal Hinzufügen. Wechsle zum Reiter Liste und klicke auf Speichern. - -## Spiel: Wo landet es? - -::: spiel frage -titel: Spiel: Wo landet es? -intro: Ludwig baut Fenster mit Reitern. Lies den Code und sag voraus, was du siehst. Sechs Runden. - -runde: - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); -frage: Welcher Reiter ist beim Start offen? -- [x] Eingabe -- Liste -- keiner -> Beim Start ist der Reiter offen, der zuerst hinzugefügt wurde. - -runde: - reiter.addTab("Liste", liste); - reiter.addTab("Eingabe", eingabe); -frage: Welcher Reiter ist beim Start offen? -- Eingabe -- [x] Liste -- beide -> Diesmal kommt Liste zuerst. Die Reihenfolge von \`addTab\` bestimmt die Reihenfolge der Reiter. - -runde: - reiter.addTab("Eingabe", eingabe); - reiter.addTab("Liste", liste); - reiter.addTab("Hilfe", hilfe); - reiter.setSelectedIndex(1); -frage: Welcher Reiter ist offen? -- Eingabe -- [x] Liste -- Hilfe -> Gezählt wird ab 0: 0 ist Eingabe, 1 ist Liste, 2 ist Hilfe. - -runde: - hinzufuegen.addActionListener(e -> { - bereich.append(feld.getText() + "\\n"); - feld.setText(""); - }); - // Du tippst Heu, klickst Hinzufügen, tippst Äpfel, klickst Hinzufügen. -frage: Was steht danach im Reiter Liste? -- Äpfel -- HeuÄpfel -- [x] Heu\\nÄpfel -> \`append\` hängt an, und jedes \`"\\n"\` beginnt eine neue Zeile. - -runde: - JButton knopf = new JButton("OK"); - eingabe.add(knopf); - liste.add(knopf); -frage: Wo erscheint der Knopf OK? -- in beiden Reitern -- nur im Reiter Eingabe -- [x] nur im Reiter Liste -> Ein Baustein kann nur auf einer Fläche liegen. Beim zweiten \`add\` nimmt Swing ihn von \`eingabe\` weg. - -runde: - speichern.addActionListener(e -> { - bereich.setText(""); - reiter.setTitleAt(1, "Liste (leer)"); - reiter.setSelectedIndex(0); - }); - // Der Knopf speichern liegt im Reiter Liste. -frage: Was siehst du nach dem Klick? -- den leeren Reiter Liste -- [x] den Reiter Eingabe, und der zweite Reiter heißt „Liste (leer)“ -- den Reiter Eingabe, der zweite Reiter heißt weiter „Liste“ -> Der Zuhörer leert den Bereich, benennt den Reiter um und wechselt zu Reiter 0. Alles passiert bei einem Klick. -::: - -## Aufgabe: Einkaufsliste mit Reitern - -Baue das Programm nach und probiere es aus. - -Dann mach es besser: - -- Leere Eingaben kommen nicht auf die Liste. Prüfe vorher \`feld.getText().isEmpty()\` (Lektion 17). -- Der Reiter Liste zeigt in seinem Titel, wie viele Dinge auf der Liste stehen: „Liste (3)“. Zähle in einer \`static int\`-Variable mit und benutze \`setTitleAt\`. -- Zusatz: Ein dritter Reiter **Hilfe** mit einem JLabel, das erklärt, wie das Programm geht. - -**Du bist fertig, wenn …** - -- ein eingegebener Eintrag nach dem Klick im Reiter Liste steht, -- ein leeres Feld nichts zur Liste hinzufügt, -- der Reiter nach drei Einträgen „Liste (3)“ heißt. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Fenster mit zwei Reitern bauen. → Reiter mit JTabbedPane -- Ich kann mit append Zeilen an eine JTextArea anhängen. → Ein Textbereich mit mehreren Zeilen -- Ich kann erklären, warum ein Zuhörer Bausteine auf beiden Reitern benutzen kann. → Von einem Reiter zum anderen -- Ich kann im Zuhörer mit try und catch eine Datei speichern. → Speichern im Zuhörer -- Ich kann eine Einkaufsliste bauen, die mitzählt, wie viele Dinge darauf stehen. → Aufgabe: Einkaufsliste mit Reitern -::: - -## Wissenstest - -::: quiz -? Welcher Reiter ist nach reiter.setSelectedIndex(0) offen? -→ Reiter mit JTabbedPane -- [x] der erste -- [ ] der zweite -- [ ] keiner - -? Warum steht das Speichern im Zuhörer in try und catch? -→ Speichern im Zuhörer -- [ ] Weil PrintWriter nur in try funktioniert. -- [x] Weil actionPerformed keine FileNotFoundException weiterwerfen darf. -- [ ] Weil main kein throws hat. - -? Was ist der Unterschied zwischen JTextField und JTextArea? -→ Ein Textbereich mit mehreren Zeilen -- [ ] Es gibt keinen. -- [x] JTextArea kann mehrere Zeilen zeigen. -- [ ] JTextField kann man nicht beschreiben. - -? Ordne zu. -→ Reiter mit JTabbedPane -= JTabbedPane -> eine Fläche mit Reitern -= JPanel -> die Fläche eines Reiters -= JTextArea -> ein Textbereich mit mehreren Zeilen -::: -`,_w=`--- -titel: Model View Controller -bereich: Fenster mit Swing -kurz: Den Klickzähler in Model, View und Controller zerlegen und verstehen, wer mit wem redet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- sagen, was Model, View und Controller jeweils tun -- ein Model ohne Swing schreiben und ohne Fenster testen -- erklären, was new Zaehler() baut und warum dort kein static steht -- die vier Nachrichten nach einem Klick nennen -- eine zweite View dazubauen, ohne das Model zu ändern -- einen Zähler mit −1, Reset und Grenzen im Model bauen -::: - -## Das Ziel - -Große Programme mit Fenstern haben fast immer denselben Aufbau. Er heißt **Model View Controller**, kurz **MVC**: - -- Das **Model** hält die Daten und kennt ihre Regeln. -- Die **View** zeigt die Daten nur an. -- Der **Controller** reagiert auf Klicks und gibt Bescheid. - -Du lernst MVC am Klickzähler aus Lektion 32. Er wird Schritt für Schritt in drei Teile zerlegt. Am Ende zeigt er denselben Zählerstand zweimal an: als Zahl und als Balken. - -Schalte im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** ein. - -## Alles in einer Klasse - -So sah der Klickzähler bisher aus, alles steckt in \`main\` und einer Variable der Klasse: - -\`\`\`java -static int anzahl = 0; - -public static void main(String[] args) { - // ... Fenster bauen ... - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - anzahl++; - zahl.setText("" + anzahl); - }); -} -\`\`\` - -Das läuft. Aber stell dir vor, der Zählerstand soll zusätzlich als Balken erscheinen, später noch in einem zweiten Fenster und in einer Datei. Dann muss jeder Zuhörer an alle Anzeigen denken. Rechnen und Anzeigen sind ineinander verknotet, und mit jeder Anzeige wird der Knoten größer. - -MVC löst den Knoten: Jede Aufgabe bekommt ihre eigene Klasse. - -## Das Model - -Das Model ist der Zähler selbst, ganz ohne Swing: - -\`\`\`java -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} -\`\`\` - -- Diesmal steht vor \`wert\` und den Methoden kein \`static\`. Dann gehören sie zu einem **Objekt**: \`new Zaehler()\` baut einen Zähler mit eigenem \`wert\`, so wie \`new JButton("+1")\` einen Knopf mit eigener Beschriftung baut. -- \`model.erhoehen()\` ruft die Methode dieses einen Zählers auf, genau wie \`knopf.setText(…)\`. -- Wer den Wert wissen will, fragt mit \`getWert()\`. Ändern geht nur über \`erhoehen()\`. - -Weil das Model kein Fenster braucht, kannst du es ganz ohne Fenster ausprobieren: - -\`\`\`java -public class ZaehlerTest { - public static void main(String[] args) { - Zaehler model = new Zaehler(); - model.erhoehen(); - model.erhoehen(); - System.out.println(model.getWert()); - } -} - -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} -\`\`\` - -Die Ausgabe ist 2. Mehrere Klassen dürfen in einer Datei stehen. Nur eine davon ist \`public\`, und die enthält \`main\`. - -## Die View - -Die View zeigt den Wert an und macht sonst nichts. Sie rechnet nicht und weiß nicht, woher die Zahl kommt: - -\`\`\`java -class ZahlAnzeige { - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - void aktualisieren(int wert) { - zahl.setText("" + wert); - } -} -\`\`\` - -- Die View bekommt den Wert mit \`aktualisieren(int wert)\` geliefert und schreibt ihn in ihr JLabel. -- Fenster und Knopf baust du wie immer in \`main\`. Mit \`fenster.add(view.zahl)\` kommt das JLabel der View ins Fenster. - -## Der Controller - -Der Controller ist der Zuhörer am Knopf. Er verbindet Model und View: - -\`\`\`java -Zaehler model = new Zaehler(); -ZahlAnzeige view = new ZahlAnzeige(); - -plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); -}); -\`\`\` - -- Erst ändert er das Model, dann holt er den neuen Wert und gibt ihn der View. -- Das Problem aus Lektion 32 ist weg: Die Variable \`model\` ändert sich nie, sie zeigt immer auf denselben Zähler. Nur der \`wert\` darin ändert sich. Deshalb darf das Lambda \`model\` benutzen, ganz ohne \`static\`. - -## Wer redet mit wem? - -Bei jedem Klick laufen vier Nachrichten, immer in derselben Reihenfolge: - -::: grafik mvc-klick.svg -Die Pfeile leuchten der Reihe nach auf. Das Model zählt beim zweiten Pfeil hoch, die Anzeige erst beim vierten. -::: - -1. Der Knopf meldet den Klick an den Controller (\`actionPerformed\`). -2. Der Controller sagt dem Model: \`erhoehen()\`. -3. Der Controller fragt das Model nach dem neuen Wert: \`getWert()\`. -4. Der Controller gibt den Wert an die View: \`aktualisieren(wert)\`. - -Das Model redet mit niemandem. Es wartet, bis es gefragt wird. - -::: ludwig -Merk dir: Das Model weiß nichts von Fenstern. In \`Zaehler\` steht kein einziges \`JLabel\` und kein \`import javax.swing\`. Wenn du dort Swing brauchst, gehört der Code in die View. -::: - -::: quiz -? Mit wem redet das Model von sich aus? -- [ ] Mit der View -- [ ] Mit dem Knopf -- [x] Mit niemandem -> Das Model wartet, bis der Controller es fragt. -::: - -## Der Gewinn: eine zweite View - -Jetzt soll der Zählerstand zusätzlich als Balken erscheinen. Dafür kommt eine zweite View dazu. Ein \`JProgressBar\` ist ein Balken, der sich füllt, hier von 0 bis 10: - -\`\`\`java -class BalkenAnzeige { - JProgressBar balken = new JProgressBar(0, 10); - - void aktualisieren(int wert) { - balken.setValue(wert); - } -} -\`\`\` - -Der Controller bekommt eine Zeile mehr. Das Model bleibt genau, wie es war: - -\`\`\`java -plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); -}); -\`\`\` - -Genau das ist der Gewinn von MVC: Du kannst Anzeigen dazubauen oder austauschen, ohne das Model anzufassen. - -## Das ganze Programm - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -class Zaehler { - int wert = 0; - - void erhoehen() { - wert++; - } - - int getWert() { - return wert; - } -} - -class ZahlAnzeige { - JLabel zahl = new JLabel("0", SwingConstants.CENTER); - - void aktualisieren(int wert) { - zahl.setText("" + wert); - } -} - -class BalkenAnzeige { - JProgressBar balken = new JProgressBar(0, 10); - - void aktualisieren(int wert) { - balken.setValue(wert); - } -} - -public class KlickZaehler { - public static void main(String[] args) { - Zaehler model = new Zaehler(); - ZahlAnzeige view = new ZahlAnzeige(); - BalkenAnzeige balken = new BalkenAnzeige(); - - JFrame fenster = new JFrame("Klickzähler"); - fenster.setSize(250, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); - }); - - fenster.add(view.zahl); - fenster.add(balken.balken); - fenster.add(plus); - fenster.setVisible(true); - } -} -\`\`\` - -Klick ein paar Mal auf +1 und sieh zu, wie Zahl und Balken gemeinsam wachsen. - -::: angeberwissen -MVC hat sich der Norweger Trygve Reenskaug 1979 ausgedacht, im Forschungszentrum Xerox PARC in Kalifornien. Dort standen damals schon Computer mit Fenstern und Maus. Im selben Jahr besuchte Steve Jobs das Labor und war so begeistert, dass Apple danach Computer mit Fenstern und Maus baute. -::: - -## Spiel: Wohin gehört der Code? - -::: spiel frage -titel: Spiel: Wohin gehört der Code? -intro: Ludwig hat Code aus einem MVC-Programm auf einen Haufen geworfen. Sortier jedes Stück ein. Acht Runden. -frage: Wohin gehört dieser Code? -antworten: Model | View | Controller - -runde: - int wert = 0; -richtig: Model -> Der Zählerstand sind die Daten. Daten wohnen im Model. - -runde: - zahl.setText("" + wert); -richtig: View -> Etwas auf dem Bildschirm anzeigen ist die Aufgabe der View. - -runde: - plus.addActionListener(e -> model.erhoehen()); -richtig: Controller -> Auf einen Klick reagieren und dem Model Bescheid geben: Das macht der Controller. - -runde: - void erhoehen() { - wert++; - } -richtig: Model -> Das Model weiß selbst, wie es seine Daten ändert. - -runde: - balken.setValue(wert); -richtig: View -> Ein Balken, der sich füllt, zeigt nur an. Also View. - -runde: - void erhoehen() { - if (wert < 10) { - wert++; - } - } -richtig: Model -> „Höchstens 10“ ist eine Regel für die Daten. Regeln gehören ins Model, dann gelten sie für jeden Knopf und jede View. - -runde: - view.aktualisieren(model.getWert()); -richtig: Controller -> Den Wert beim Model abholen und der View geben: Das ist der Controller in der Mitte. - -runde: - JLabel zahl = new JLabel("0", SwingConstants.CENTER); -richtig: View -> Ein JLabel ist ein Baustein der Oberfläche. Im Model steht kein Swing. -::: - -## Spiel: Wer ist dran? - -::: spiel reihenfolge -titel: Spiel: Wer ist dran? -intro: Nach einem Klick reden Model, View und Controller miteinander, aber nur in einer Reihenfolge funktioniert es. Bring die Schritte in die richtige Reihenfolge. Fünf Runden. - -runde: -frage: Du klickst im Klickzähler auf +1. Was passiert der Reihe nach? -- Du klickst auf +1. -- Der Controller bekommt \`actionPerformed\`. -- Der Controller ruft \`model.erhoehen()\` auf. -- Das Model zählt \`wert\` hoch. -- Der Controller holt \`model.getWert()\`. -- Die View zeigt die neue Zahl. -> Klick, Controller, Model ändern, Wert holen, anzeigen. Das sind die vier Pfeile aus der Grafik, mit dem Hochzählen in der Mitte. - -runde: - plus.addActionListener(e -> { - model.erhoehen(); - view.aktualisieren(model.getWert()); - balken.aktualisieren(model.getWert()); - }); -frage: Was passiert nach einem Klick auf +1 der Reihe nach? -- Der Klick auf +1 -- \`model.erhoehen()\` -- Die Zahl zeigt den neuen Wert. -- Der Balken wächst. -> Der Zuhörer arbeitet seine Zeilen von oben nach unten ab: erst das Model, dann die Zahl, dann der Balken. - -runde: -frage: Bring den Controller in die richtige Reihenfolge, damit die View die neue Zahl zeigt. -- \`plus.addActionListener(e -> {\` -- \`model.erhoehen();\` -- \`view.aktualisieren(model.getWert());\` -- \`});\` -> Erst ändern, dann anzeigen. Andersherum zeigt die View noch den alten Wert. - -runde: - reset.addActionListener(e -> { - model.zuruecksetzen(); - view.aktualisieren(model.getWert()); - }); -frage: Der Zähler steht auf 5. Du klickst auf Reset. Was passiert der Reihe nach? -- Du klickst auf Reset. -- Das Model setzt \`wert\` auf 0. -- \`model.getWert()\` liefert 0. -- Die View zeigt 0. -> Auch Reset läuft über den Controller ins Model. Die View erfährt den neuen Wert erst ganz am Schluss. - -runde: -frage: Ein Test ohne Fenster soll 1 ausgeben. In welcher Reihenfolge stehen die Zeilen in main? -- \`Zaehler model = new Zaehler();\` -- \`model.erhoehen();\` -- \`System.out.println(model.getWert());\` -> Erst das Objekt bauen, dann damit arbeiten, zum Schluss nachsehen. Das Model lässt sich ganz ohne Fenster testen. -::: - -## Aufgabe: Ein Zähler mit Grenzen - -Baue das ganze Programm und probier es aus. - -Dann mach es besser: - -- Ein Knopf **−1** zählt herunter. Das Model bekommt dafür eine Methode \`verringern()\`, der Controller einen zweiten Zuhörer. -- Ein Knopf **Reset** setzt den Zähler mit \`zuruecksetzen()\` auf 0. -- Das Model achtet selbst auf die Grenzen: nie unter 0 und nie über 10, denn dann ist der Balken voll. -- Extra: eine dritte View \`KonsolenAnzeige\`, deren \`aktualisieren\` mit \`System.out.println\` „Neuer Wert: 3“ ausgibt. Eine View muss kein Fenster sein. - -**Du bist fertig, wenn …** - -- **+1**, **−1** und **Reset** richtig zählen, -- der Zähler nie unter 0 und nie über 10 geht, egal wie oft du klickst, -- Zahl und Balken immer denselben Wert zeigen, -- in der Klasse des Model kein \`JButton\`, \`JLabel\` oder anderes Swing vorkommt. - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann sagen, was Model, View und Controller jeweils tun. → Das Ziel -- Ich kann ein Model ohne Swing schreiben und ohne Fenster testen. → Das Model -- Ich kann erklären, was new Zaehler() baut und warum dort kein static steht. → Das Model -- Ich kann die vier Nachrichten nach einem Klick nennen. → Wer redet mit wem? -- Ich kann eine zweite View dazubauen, ohne das Model zu ändern. → Der Gewinn: eine zweite View -- Ich kann einen Zähler mit −1, Reset und Grenzen im Model bauen. → Aufgabe: Ein Zähler mit Grenzen -::: - -## Wissenstest - -::: quiz -? Wo steht die Regel „Der Zähler geht nie über 10“? -→ Das Model -- [x] im Model -- [ ] in der View -- [ ] im Controller -> Regeln über die Daten gehören ins Model. Dann gelten sie, egal welcher Knopf drückt. - -? Was macht die View? -→ Das Ziel -- [ ] Sie rechnet den neuen Wert aus. -- [x] Sie zeigt den Wert an, den sie bekommt. -- [ ] Sie hört auf Klicks. - -? Warum darf das Lambda model benutzen, obwohl model eine Variable von main ist? -→ Wer redet mit wem? -- [ ] Weil Zaehler public ist. -- [x] Weil model immer auf denselben Zähler zeigt; nur der wert darin ändert sich. -- [ ] Weil Lambdas alle Variablen ändern dürfen. - -? Was musst du am Model ändern, wenn eine zweite View dazukommt? -→ Der Gewinn: eine zweite View -- [x] nichts -- [ ] eine zweite Methode erhoehen -- [ ] ein zweites JLabel - -? Ordne zu. -→ Das Ziel -= Zaehler mit wert und erhoehen() -> Model -= ZahlAnzeige mit aktualisieren(int wert) -> View -= der Zuhörer am Knopf -> Controller -::: -`,Aw=`Fachbegriffe für den Lernbereich. Kommt ein Begriff in einem Schritt vor, wird er dort einmal markiert und zeigt beim -Hovern oder Antippen seine Erklärung. Steht er im Schritt fett, wird er gerade erklärt und deshalb nicht markiert. -\`auch:\` nennt weitere Formen, die ebenfalls erkannt werden. Groß- und Kleinschreibung zählt. - -### Algorithmus -auch: Algorithmen -Eine genaue Schritt-für-Schritt-Anleitung, mit der man eine Aufgabe löst. Jeder Schritt ist eindeutig. - -### Struktogramm -auch: Struktogramme, Struktogramms, Struktogrammen -Ein Algorithmus als Bild aus Kästen. Es wird von oben nach unten gelesen. - -### Programmablaufplan -auch: PAP, Programmablaufpläne, Programmablaufplans -Ein Algorithmus als Bild aus Symbolen, die mit Pfeilen verbunden sind (DIN 66001). Eine Raute ist eine Verzweigung. - -### Pseudocode -Ein Algorithmus als Text in normaler Sprache mit festen Wörtern wie WENN und SOLANGE. Die Einrückung zeigt, was zusammengehört. - -### Anweisung -auch: Anweisungen -Ein einzelner Schritt im Struktogramm, zum Beispiel eine Rechnung, eine Eingabe oder eine Ausgabe. - -### Sequenz -auch: Sequenzen -Schritte, die nacheinander von oben nach unten ausgeführt werden, jeder genau einmal. - -### Verzweigung -auch: Verzweigungen, bedingte Anweisung, bedingte Anweisungen -Ein Baustein, der mit einer Bedingung entscheidet, welcher von zwei Wegen ausgeführt wird. Im Lehrplan heißt sie auch bedingte Anweisung. - -### Zweig -auch: Zweige, Zweigen -Einer der beiden Wege einer Verzweigung: links für true, rechts für false. - -### Schleife -auch: Schleifen, Wiederholung, Wiederholungen, Wiederholungsstruktur, Wiederholungsstrukturen -Ein Baustein, der Schritte wiederholt, solange eine Bedingung gilt. Im Lehrplan heißt sie auch Wiederholungsstruktur. - -### Rumpf -Der Inhalt einer Schleife, also die Schritte, die wiederholt werden. - -### Durchlauf -auch: Durchläufe, Durchlaufs, Durchläufen -Ein einmaliges Ausführen des Inhalts einer Schleife. - -### Bedingung -auch: Bedingungen -Eine Frage, die nur mit ja (true) oder nein (false) beantwortet wird, zum Beispiel alter >= 18. - -### Platzhalter -Ein leerer Kasten mit dem Zeichen ø. Ziehst du ein Element darauf, wird er ersetzt. - -### Objektinspektor -Der Bereich unter dem Diagramm. Hier bearbeitest du Text und Einstellungen des Kastens, den du gerade angeklickt hast. - -### Simulation -Führt dein Struktogramm im Editor aus, auf Wunsch Schritt für Schritt. So siehst du, was passiert. - -### Variable -auch: Variablen -Eine beschriftete Kiste für einen Wert. Sie hat einen Namen, einen Datentyp und einen Wert. - -### CamelCase -auch: camelCase -Schreibweise für Namen aus mehreren Wörtern: zusammengeschrieben, jedes weitere Wort beginnt groß, z. B. \`preisMitSteuer\`. - -### case-sensitive -auch: Groß- und Kleinschreibung -Java unterscheidet Groß- und Kleinbuchstaben: \`zahl\`, \`Zahl\` und \`ZAHL\` sind drei verschiedene Namen. \`system\` statt \`System\` ist ein Fehler. - -### Konstante -auch: Konstanten -Eine Variable, deren Wert nach dem Festlegen gleich bleibt. Man schreibt \`const\` davor, z. B. \`const double MWST = 0.19\`. - -### Datentyp -auch: Datentypen, Datentyps -Legt fest, welche Art von Wert in eine Variable passt: int (ganze Zahl), double (Kommazahl), String (Text), boolean (true oder false) oder char (ein einzelnes Zeichen). - -### Zuweisung -auch: Zuweisungen -Das Zeichen =. Es rechnet die rechte Seite aus und speichert das Ergebnis in der Variablen links. - -### Hilfsvariable -auch: Hilfsvariablen -Eine zusätzliche Variable, die einen Wert kurz aufbewahrt, zum Beispiel beim Tauschen. - -### EVA-Prinzip -Eingabe, Verarbeitung, Ausgabe: erst Werte abfragen, dann rechnen, dann das Ergebnis anzeigen. - -### Problemanalyse -Du liest eine Aufgabe genau und klärst, was gegeben ist, was gesucht ist und wie man vom einen zum anderen kommt. - -### Vergleichsoperator -auch: Vergleichsoperatoren -Ein Zeichen, das zwei Werte vergleicht, zum Beispiel == oder <. Das Ergebnis ist true oder false. - -### Fallauswahl -auch: Mehrfachauswahl -Ein Baustein, der je nach Wert einer Variablen genau einen von mehreren Fällen ausführt. Im Lehrplan heißt sie auch Mehrfachauswahl. - -### kopfgesteuert -auch: kopfgesteuerte, kopfgesteuerten -Die Schleife prüft ihre Bedingung vor jedem Durchlauf. Ist sie gleich zu Beginn falsch, läuft die Schleife kein einziges Mal. - -### fußgesteuert -auch: fußgesteuerte, fußgesteuerten -Die Schleife prüft ihre Bedingung erst nach jedem Durchlauf. Sie läuft also mindestens einmal. - -### Zählvariable -auch: Zählvariablen -Eine Variable, die in einer Schleife mitzählt, meistens i. - -### Endlosschleife -auch: Endlosschleifen -Eine Schleife, deren Bedingung nie falsch wird. Sie hört nie von selbst auf. - -### Merker -Eine Variable vom Typ boolean, die mit false anfängt und auf true gesetzt wird, sobald etwas passiert ist. - -### Zustandsautomat -auch: Zustandsautomaten, Zustandsvariable, Zustandsvariablen -Ein Programm, das immer in genau einem Zustand ist und nach festen Regeln in den nächsten Zustand wechselt, z. B. eine Ampel. - -### Array -auch: Arrays -Eine Reihe von Fächern mit einem gemeinsamen Namen und demselben Datentyp. Im Lehrplan heißt es auch Feld. - -### Index -Die Nummer eines Fachs in einem Array. Gezählt wird ab 0. - -### char -Der Datentyp für ein einzelnes Zeichen. Er steht in einfachen Anführungszeichen, z. B. 'C'. "C" mit doppelten Anführungszeichen ist dagegen ein String. - -### Zeichencode -auch: Zeichencodes, ASCII-Code, ASCII-Tabelle -Die Zahl, die hinter einem Zeichen steckt. In der ASCII-Tabelle hat A den Code 65, B 66 und so weiter. In Java wird mit (int) aus einem Zeichen sein Code und mit (char) aus einem Code das Zeichen. - -### Zeichenkette -auch: Zeichenketten -Ein Text, also eine Reihe von Zeichen. In Java heißt der Datentyp String. Die Zeichen werden ab 0 gezählt. - -### 2D-Array -auch: 2D-Arrays, zweidimensionales Array, zweidimensionale Arrays -Ein Array mit Zeilen und Spalten, wie eine Tabelle. Ein Fach braucht zwei Indizes, z. B. \`sitze[1][2]\`. - -### Unterprogramm -auch: Unterprogramme, Unterprogramms, Unterprogrammen, Methode, Methoden, Prozedur, Prozeduren, Funktion, Funktionen -Ein eigenes Struktogramm für eine Teilaufgabe. Es wird mit einem Aufruf ausgeführt. Im Lehrplan und in Java heißt es auch Methode, je nach Art auch Prozedur oder Funktion. - -### Parameter -auch: Parametern -Eine Variable in der Kopfzeile eines Unterprogramms. Beim Aufruf bekommt sie den Wert aus den Klammern. - -### Überladung -auch: überladen, überladene, überladenen, overloading -Mehrere Methoden mit demselben Namen, aber verschiedenen Parametern, z. B. \`mbot.forward(30)\` und \`mbot.forward(2, "Umdrehungen")\`. Java wählt beim Aufruf die passende nach Anzahl und Typ der Parameter. - -### Spaghetticode -Ein Programm, das so kreuz und quer springt, dass man den Ablauf kaum noch verfolgen kann. Struktogramme verhindern das. - -### Wertübergabe -auch: call by value -Englisch call by value. Ein Unterprogramm bekommt eine Kopie des Werts. Ändert es seinen Parameter, bleibt die Variable des Aufrufers unverändert. - -### Referenzübergabe -auch: call by reference -Englisch call by reference. Ein Unterprogramm bekommt einen Verweis auf dieselben Daten, z. B. auf ein Array. Ändert es ein Fach, sieht auch der Aufrufer die Änderung. - -### Rückgabewert -auch: Rückgabewerte -Das Ergebnis, das ein Unterprogramm mit return an den Aufruf zurückgibt. - -### Aussprung -Verlässt sofort die Schleife, in der er steht. Danach geht es unter der Schleife weiter. - -### Syntaxfehler -auch: Syntaxfehlern, Syntaxfehlers -Ein Fehler in der Schreibweise, zum Beispiel ein fehlendes \`;\`. Das Programm startet gar nicht. Englisch: syntax error. - -### Laufzeitfehler -auch: Laufzeitfehlern, Laufzeitfehlers -Ein Fehler, der erst beim Ausführen auftritt, zum Beispiel Teilen durch 0. Das Programm bricht an dieser Stelle ab. Englisch: runtime error. - -### Logikfehler -auch: Logikfehlern, Logikfehlers -Das Programm läuft ohne Meldung, liefert aber ein falsches Ergebnis. Du findest ihn mit dem Schreibtischtest. Englisch: logic error. - -### Schreibtischtest -auch: Schreibtischtests -Du führst ein Struktogramm auf Papier aus und notierst nach jedem Schritt die Werte der Variablen. - -### lineare Suche -auch: Lineare Suche -Ein Suchverfahren, das alle Werte der Reihe nach mit dem gesuchten Wert vergleicht. Es funktioniert auch bei unsortierten Werten. - -### binäre Suche -auch: Binäre Suche -Ein Suchverfahren für sortierte Werte. Es sieht sich die Mitte an und sucht nur in der passenden Hälfte weiter. - -### Bubblesort -Ein einfaches Sortierverfahren. Es vergleicht immer zwei Nachbarn und tauscht sie, wenn sie falsch herum stehen. - -### Ereignis -auch: Ereignisse, Ereignissen, Ereignisses -Etwas, das der Mensch an einem Fensterprogramm tut, zum Beispiel einen Knopf anklicken. Das Programm reagiert darauf mit einem Zuhörer (ActionListener). - -### Interface -auch: Interfaces -Eine Art Vertrag in Java: Er legt fest, welche Methoden eine Klasse haben muss. \`ActionListener\` ist ein Interface mit der Methode \`actionPerformed\`. - -### Exception -auch: Exceptions -Ein Fehler, der erst beim Ausführen auftritt, zum Beispiel ein Index außerhalb des Arrays. Fängt ihn kein \`catch\` auf, bricht das Programm ab. - -### Attribut -auch: Attribute, Attributs -Eine Variable, die direkt in der Klasse steht und nicht in einer Methode. Mit \`static\` gehört sie zur Klasse selbst und lebt so lange wie das Programm, zum Beispiel ein Klickzähler, den mehrere Zuhörer ändern. - -### Scanner -Ein fertiger Baustein von Java, der Eingaben über die Tastatur liest, z. B. mit \`scanner.nextInt()\` eine Zahl. Er braucht ganz oben \`import java.util.Scanner;\`. - -### Kommentar -auch: Kommentare, Kommentaren, Kommentars -Eine Notiz im Code für Menschen. Java überspringt sie beim Ausführen. \`//\` gilt bis zum Ende der Zeile, \`/* … */\` kann über mehrere Zeilen gehen. - -### import -Eine Zeile ganz oben im Java-Code, die einen fertigen Baustein aus einem Paket holt, z. B. \`import java.util.Scanner;\`. Ohne sie kennt Java den Namen nicht. - -### Quellcode -Der Programmtext, den Menschen schreiben und lesen, zum Beispiel in einer Datei \`Einmaleins.java\`. - -### Compiler -auch: Compilers -Ein Programm, das Quellcode übersetzt. In Java heißt er \`javac\` und macht aus einer \`.java\`-Datei Bytecode in einer \`.class\`-Datei. - -### Bytecode -Die übersetzte Form eines Java-Programms in einer \`.class\`-Datei. Ihn liest nicht der Mensch, sondern die JVM. - -### JVM -auch: Java Virtual Machine, virtuelle Maschine -Die Java Virtual Machine führt Bytecode aus. Sie ist ein Programm, das wie ein kleiner Computer aus Software auf Windows, macOS oder Linux läuft. Deshalb ist Java plattformunabhängig. - -### JRE -Java Runtime Environment: die JVM und fertige Bausteine. Damit kann man Java-Programme ausführen, aber nicht übersetzen. - -### JDK -Java Development Kit: die JRE und dazu den Compiler \`javac\` und weitere Werkzeuge. Das braucht man zum Programmieren. - -### plattformunabhängig -Ein Programm läuft ohne Änderung auf verschiedenen Betriebssystemen. Bei Java sorgt die JVM dafür: „Write once, run anywhere“. - -### Maschinencode -Befehle als Zahlen, die der Prozessor direkt ausführt. Jede Prozessorart hat ihren eigenen Maschinencode. - -### JIT-Compiler -auch: JIT -Ein Teil der JVM, der oft benutzten Bytecode während des Ausführens („just in time“) in Maschinencode übersetzt. Dadurch wird Java schneller. -`,jw=`## Grundbausteine - -### Anweisung - -Ein einzelner Schritt. Damit legst du Variablen an oder rechnest. - -\`\`\` -int zahl = 5 -double preis = 2.5 -String name = "Ada" -zahl = zahl + 1 -\`\`\` - -### Datentypen - -Der Datentyp steht vor dem Namen der Variablen. - -| Datentyp | Bedeutung | Beispiel | -|---|---|---| -| \`int\` | ganze Zahl | \`int anzahl = 3\` | -| \`double\` | Kommazahl (mit Punkt) | \`double preis = 2.5\` | -| \`String\` | Text in doppelten Anführungszeichen | \`String name = "Ada"\` | -| \`boolean\` | Wahrheitswert | \`boolean fertig = false\` | -| \`char\` | ein einzelnes Zeichen in einfachen Anführungszeichen | \`char note = 'C'\` | - -\`'C'\` ist ein \`char\`, \`"C"\` ein String. Ein Zeichen aus einem Text holst du mit \`charAt\`: \`char erster = name.charAt(0)\`. Jedes Zeichen hat einen Zeichencode: \`(int) 'A'\` ist 65, \`(char) 66\` ist \`'B'\`. - -### Eingabe - -Fragt beim Ausführen einen Wert ab und speichert ihn in einer Variablen. Der Text in Anführungszeichen ist die Frage. - -\`\`\` -input: int alter "Wie alt bist du?" -input: double preis "Preis eingeben" -input: String name "Wie heißt du?" -\`\`\` - -### Ausgabe - -Zeigt einen Text oder einen Wert an. Texte stehen in Anführungszeichen, mit \`+\` verbindest du Text und Variablen. - -\`\`\` -output: "Hallo" -output: summe -output: "Du bist " + alter + " Jahre alt." -\`\`\` - -> In der Ausgabe hängt \`+\` die Teile immer aneinander: \`output: a + b\` zeigt bei 3 und 4 also 34. Rechne deshalb vorher in einer Variablen, z. B. \`int summe = a + b\`, und gib dann \`summe\` aus. - -## Verzweigungen - -### Verzweigung - -Prüft eine Bedingung. Ist sie wahr, wird der linke Zweig (true) ausgeführt, sonst der rechte (false). - -\`\`\` -alter >= 18 -zahl % 2 == 0 -note < 1 || note > 6 -\`\`\` - -### Fallauswahl - -Wählt je nach Wert einer Variablen einen von mehreren Fällen. Passt kein Fall, gilt \`default\`. Fälle fügst du rechts mit **Weiteren Fall hinzufügen** hinzu. - -## Schleifen - -### While-Schleife - -Wiederholt den Inhalt, **solange** die Bedingung wahr ist. Die Bedingung wird vor jedem Durchlauf geprüft. - -\`\`\` -zahl != 1 -i < 10 -\`\`\` - -### Do-while-Schleife - -Führt den Inhalt **mindestens einmal** aus und prüft die Bedingung erst danach. - -### For-Schleife - -Zählt eine Variable von einem Startwert bis zu einer Grenze. Die drei Felder sind Start, Bedingung und Schritt. - -\`\`\` -int i = 0 -i < 5 -i++ -\`\`\` - -### Endlosschleife - -Wiederholt den Inhalt ohne Bedingung. Mit einem **Aussprung** im Inneren verlässt du sie. - -### Aussprung - -Verlässt die umgebende Schleife (\`break\`). - -## Unterprogramme - -### Aufruf - -Steht für ein Unterprogramm, z. B. \`berechneSumme()\`. Mit Parametern und Rückgabewert hat das Unterprogramm eine Kopfzeile als Titel: - -\`\`\` -int quadrat(int x) Kopfzeile des Unterprogramms -return x * x gibt das Ergebnis zurück -int q = quadrat(5) Aufruf, q bekommt 25 -zeigeSumme(3, 4) Aufruf eines void-Unterprogramms -\`\`\` - -## Rechnen und Vergleichen - -### Rechenzeichen und Vergleiche - -- \`+ - * /\` Grundrechenarten -- \`%\` Rest beim Teilen (\`7 % 2\` ist 1) -- \`==\` gleich, \`!=\` ungleich -- \`<\` \`<=\` \`>\` \`>=\` kleiner, kleiner gleich, größer, größer gleich -- \`&&\` und, \`||\` oder - -## Arrays - -### Arrays - -Mehrere Werte unter einem Namen. Gezählt wird ab 0. - -\`\`\` -int[] zahlen = {3, 7, 1} -output: zahlen[0] -int[] leer = new int[5] -\`\`\` - -Ein **2D-Array** ist eine Tabelle mit Zeilen und Spalten: - -\`\`\` -boolean[][] sitze = new boolean[3][5] -sitze[1][4] = true -output: sitze.length + " Reihen, " + sitze[0].length + " Plätze" -\`\`\` - -## Java - -### Vom Code zum Programm - -Der Compiler \`javac\` übersetzt \`Datei.java\` in Bytecode (\`Datei.class\`). Die JVM übersetzt den Bytecode beim Ausführen in Maschinencode, auf Windows, macOS und Linux gleich. C++ wird dagegen direkt zu Maschinencode und muss für jedes System neu kompiliert werden. - -| | enthält | wofür | -|---|---|---| -| JRE | JVM und Bibliotheken | ausführen | -| JDK | JRE, Compiler \`javac\`, Werkzeuge | programmieren | - -### Kommentare - -Notizen im Code. Java überspringt sie, das Struktogramm bleibt gleich. - -\`\`\`java -/* - * Aufgabe: die Zahlen von 1 bis 10 addieren - * (mehrzeiliger Kommentar) - */ -// Verarbeitung (einzeiliger Kommentar) -int summe = 0; -for (int i = 1; i <= 10; i++) { - summe = summe + i; // Kommentar hinter dem Code -} // Ende for -\`\`\` - -Gut für: die Aufgabenstellung, die Einteilung in Eingabe, Verarbeitung und Ausgabe, eine Erklärung, das Ende eines Blocks hinter \`}\`, die erwartete Ausgabe und Notizen fürs nächste Mal. -`,Cw=`--- -titel: What is a structure chart? -bereich: First steps -kurz: Show and read algorithms as a series of clear steps. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an algorithm is -- read a structure chart -- recognise the three basic building blocks: sequence, branch and loop -::: - -## An algorithm is an exact set of instructions - -An **algorithm** describes step by step how to solve a task. Every step must be so clear that someone can carry it out without asking, a person just as well as a computer. - -You know algorithms from everyday life: a recipe, directions to a place or the instructions for building a wardrobe. - -::: diagramm l1-tee.visustruct -Making tea as a structure chart: every box is one step. -::: - -::: angeberwissen -Baaah, who wrote the first program? A woman, back in 1843, long before the first computer! **Ada Lovelace** described step by step how Charles Babbage's *Analytical Engine* should calculate the so-called Bernoulli numbers. That was a real algorithm for a machine. The instructions were meant to be stored on punched cards (more on this in lesson 3). However, the machine was never built. - -Ada had another brilliant idea: a machine like this can do more than calculate. It could also work with letters, symbols or even music. That is exactly what computers do today. A programming language called **Ada** is named after her. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), mathematician (picture: watercolour by Alfred Edward Chalon, around 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), public domain). -::: - -## How to read a structure chart - -You read a structure chart **from top to bottom**. Every box is one step. Only when a step is finished does the next one start. - -This way of drawing was invented by **Isaac Nassi and Ben Shneiderman** (1973). That is why it is also called a Nassi-Shneiderman diagram. In Germany it is standardised as DIN 66261. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -Left: Isaac “Ike” Nassi (photo: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/), cropped), right: Ben Shneiderman (photo: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> A structure chart always has exactly one start (at the top) and one end (at the bottom). There are no arrows and no jumps all over the place. Programs that jump all over the place are called **spaghetti code**, because their flow gets tangled like noodles on a plate. More on this in the next lesson. - -::: angeberwissen -Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony Brook University near New York. Shneiderman was about 25 and Nassi about 23. So basically two students who wrote computer science history on the side. -::: - -## Building block 1: the sequence - -Every algorithm can be built from just **three basic building blocks**: **sequence**, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them: [statements]{.gelb} are yellow, branches blue, loops pink. The sequence has no colour of its own, it is simply the row of statements one below the other. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. - -The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. - -This is what it looks like: - -- Every statement is a **simple rectangle**. -- The rectangles sit **on top of each other** without a gap. -- They run from top to bottom, one statement after the other. - -::: diagramm l1-sequenz.visustruct -Four statements as a sequence. First you get up, then you brush your teeth, and so on. -::: - -> The tea example above is a sequence, too. - -::: angeberwissen -15 minutes! That is how long Shneiderman needed for the first sketch with sequence, branch and loop. I need longer than that to choose between hay and clover. -::: - -## Building block 2: the branch - -Often the next step depends on a **condition**. A condition is a question you can only answer with **yes or no**, for example *Is it raining?* In VisuStruct yes is **true** and no is **false**. - -For decisions like this there is the **branch**. This is what it looks like: - -- At the top, the condition sits in a **triangle**. -- Below it, the box splits into **two columns**: on the left the path for **true**, on the right the path for **false**. -- **Only one** of the two paths ever runs. After that, both paths continue together below the branch. - -::: diagramm l1-verzweigung.visustruct -If it is raining, the left path runs, otherwise the right one. After that, both cases continue with “Leave”. -::: - -> If nothing should happen in one case, that path stays empty. The sign **ø** shows this. - -::: angeberwissen -Spelling alert! It is Shneiderman, with no c. Anyone who writes “Schneiderman” gets a gentle nudge from my horns. He himself points out that people keep sneaking a c into his name. -::: - -## Building block 3: the loop - -If something should happen **several times**, you do not write it down several times. Instead you use a **loop**, also called repetition. - -This is what it looks like: - -- At the top is the condition, for example *Plate not empty*. -- The steps that are repeated are **indented** below it. At the top and on the left, the box forms an **upside-down L** around them. -- Before every pass the condition is checked. As long as it is **true**, the steps inside the upside-down L run once more. If it is **false**, the program continues below the loop. - -::: diagramm l1-wiederholung.visustruct -As long as the plate is not empty, you take a bite. After that, the plate is cleared. -::: - -> There are more kinds of loops. You will meet them in later lessons. - -## All three together - -The building blocks become really useful when you combine them. This diagram contains all three: a sequence from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple [statements]{.gelb}. The statements inside a branch or a loop are yellow too. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. - -::: diagramm l1-grundbausteine.visustruct -You recognise the branch by its triangle and the loop by its upside-down L. Everything together sits in a sequence. -::: - -The boxes can also be **nested** inside each other: a loop or a path can contain sequences, branches and loops again. - -::: angeberwissen -Comfort for anyone who has messed up a test: the famous journal *Communications of the ACM* rejected the structure chart article. According to Nassi, the reviewer even said they should collect every copy and burn it. Ouch! It then appeared in 1973 in a smaller journal and today it is quoted thousands of times. Ha! -::: - -## Structure first, then code - -When you program, two things happen at once: you have to think about the steps and pay attention to how the programming language is written. A structure chart lets you keep the two apart. - -1. First you think about the **logic**: which steps, which conditions, which repetitions? -2. Then you translate the finished structure into **Java, Python or JavaScript**. VisuStruct can even generate the code for you. - -With the **simulation** you can also run your structure chart step by step and check whether it really does what it should. - -## Game: Which building block? - -::: spiel frage -titel: Game: Which building block? -intro: Ludwig describes things from his everyday life. Which of the three building blocks is hidden in each? Eight rounds. -antworten: sequence | branch | loop - -runde: -frage: "Toothpaste on the brush, brush your teeth, rinse your mouth." -richtig: sequence -> Three steps, each exactly once and always in this order. - -runde: -frage: "If it rains, take the umbrella, otherwise the sunglasses." -richtig: branch -> A condition decides which of the two ways is taken. - -runde: -frage: "Stir until the dough is smooth." -richtig: loop -> Stirring is repeated as long as the dough isn't smooth yet. - -runde: -frage: "Run ten laps around the sports field." -richtig: loop -> The same lap is run ten times. - -runde: -frage: "Shoes on, jacket on, door open, off you go." -richtig: sequence -> One step after the other, nothing is skipped or repeated. - -runde: -frage: "If the light is green, you cross the street." -richtig: branch -> Even without "otherwise" it is a branch. The otherwise branch is simply empty. - -runde: -frage: "Roll the dice until you get a six." -richtig: loop -> You don't know beforehand how often. You roll until the condition is met. - -runde: -frage: "If someone says 'Come in', you go in. Otherwise you wait at the door." -richtig: branch -> The answer decides between two ways: go in or wait. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an algorithm is. → An algorithm is an exact set of instructions -- I can read a structure chart from top to bottom. → How to read a structure chart -- I can name the three basic building blocks: sequence, branch and loop. → Building block 1: the sequence -- I can recognise every building block in a structure chart by its shape. → All three together -::: - -## Quiz - -::: quiz -? In which direction do you read a structure chart? -→ How to read a structure chart -- [ ] From left to right -- [x] From top to bottom -- [ ] From bottom to top -> Every box is one step, and the steps follow each other from top to bottom. - -? Which building block is NOT one of the three basic building blocks? -→ Building block 1: the sequence -- [ ] Sequence -- [ ] Branch -- [x] Jump -- [ ] Loop -> There are no jumps in a structure chart. Sequence, branch and loop are enough for every algorithm. - -? How do you recognise a branch in a structure chart? -→ All three together -- [ ] By an upside-down L -- [x] By a triangle with the condition and two columns below it -- [ ] By several rectangles on top of each other -> The upside-down L belongs to the loop, and rectangles on top of each other are a sequence. - -? When does the inside of a loop run once more? -→ All three together -- [x] As long as the condition is true -- [ ] Only if the condition is false -- [ ] Always exactly twice -> The condition is checked before every pass. If it is false, the program continues below the loop. - -? What is an algorithm? -→ An algorithm is an exact set of instructions -- [x] Clear step-by-step instructions for solving a task -- [ ] A particular program in Java -- [ ] A picture that explains a program -> An algorithm does not depend on a programming language. A structure chart is one way to write it down. -::: -`,Dw=`--- -titel: Flowcharts and pseudocode -bereich: First steps -kurz: Show algorithms as a flowchart and as pseudocode, and compare them with the structure chart. ---- - -## Skills I will gain now - -::: kompetenzen -- read a flowchart and build one myself -- explain why jumps in a flowchart lead to mistakes -- read a simple algorithm as pseudocode -::: - -## Other ways to draw it: the flowchart - -There are two more ways to show an algorithm: the **flowchart** and **pseudocode**. You will meet both in class. - -Here you see our structure chart for drinking tea from the last lesson once more. Next we look at the flowchart, using the same example. - -::: diagramm l1-grundbausteine.visustruct -The tea example as a structure chart: first the cup, then the branch for the sugar, then the loop. -::: - -### The same algorithm as a flowchart - -::: grafik l01-pap.svg -The tea example as a flowchart. The arrow from “Wait 1 minute” back up forms the loop. -::: - -### The symbols - -A flowchart is made of a few symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). - -- **Oval:** start or end. Every flowchart has exactly one start and one end. -- **Rectangle:** a statement, for example *Put a cup on the table*. -- **Diamond:** a decision. The diamond holds a question, and two arrows lead out of it: **yes** and **no**. -- **Parallelogram:** an input or output. The tea example does not have one. -- **Arrow:** shows which step comes next. - -A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. - -### The advantages - -- **Very easy to read**, even for people who have never seen a flowchart. You simply follow the arrows with your finger. -- Flowcharts are not only used in programming but wherever a process is explained: in user manuals, for troubleshooting (“Is the lamp on? No: is it plugged in?”) or in companies for work processes. - -## Exercise: Baking a cake as a flowchart - -Now you build a flowchart yourself. Ludwig bakes a cake like this: - -He puts the ingredients in the bowl and stirs the batter. If the batter is not smooth yet, he keeps stirring. Once it is smooth, he pours the batter into the tin and bakes the cake for 30 minutes. Then he checks with a wooden skewer: if batter still sticks to it, he bakes for 5 more minutes and checks again. Once the skewer comes out clean, he takes the cake out and calls: “The cake is ready!” - -::: pap -titel: Exercise: Baking a cake as a flowchart -auftrag: The places in the chart are empty. Put each element in its place. The shape of the place helps you. -start: Start -anweisung: Put ingredients in the bowl -anweisung: Stir the batter -frage: Batter smooth? | nein -> Stir the batter -anweisung: Pour batter into the tin -anweisung: Bake for 30 minutes -frage: Skewer clean? | nein: Bake 5 more minutes -anweisung: Take the cake out -ausgabe: “The cake is ready!” -ende: End -erklärung: Two loops, two arrows back up: when stirring, the arrow leads back to “Stir the batter”; when baking, it leads from “Bake 5 more minutes” back to the question. The output sits in the parallelogram. -legende: ja -::: - -**Draw your own flowcharts:** With **VisuFlow** you can easily draw your own flowchart. The symbols are ready in a bar: tapping one adds the next symbol and connects it with an arrow right away. To get started you can load the tea example. You save your flowchart as a file and export it as an image or PDF, for example for your notebook or a presentation. [Open VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Drawbacks of the flowchart: jumps - -An arrow in a flowchart may lead from any symbol to any other. That sounds handy, but it is dangerous. - -In the old days, programs were written exactly like that. Every line had a **number**, and the command **GOTO** jumped to a line number. Every GOTO is an arrow from the flowchart. Our tea example would look like this: - -\`\`\` -10 Put a cup on the table -20 IF no sugar wanted, GOTO 40 -30 Add sugar -40 IF tea not too hot, GOTO 70 -50 Wait 1 minute -60 GOTO 40 -70 Drink the tea -\`\`\` - -### One more line, and the jumps go wrong - -Now you improve the algorithm: after the sugar, the tea bag should come out. You insert the new line 40, and all lines below move down one number. But the jumps still point to the old numbers: - -\`\`\` -10 Put a cup on the table -20 IF no sugar wanted, GOTO 40 -30 Add sugar -40 Take out the tea bag -50 IF tea not too hot, GOTO 70 -60 Wait 1 minute -70 GOTO 40 -80 Drink the tea -\`\`\` - -Play it through: line 70 no longer sends you to the check in line 50 but to the tea bag. And when the tea is cool enough, line 50 jumps to line 70 instead of *Drink the tea*. So you keep taking out the tea bag and never drink. With every change you have to check every GOTO. In a big program with hundreds of jumps, something easily goes wrong. - -### All over the place: spaghetti code - -With arrows you can also jump out of the middle of a loop, or from outside into the middle of a loop. Such jumps quickly make the chart confusing. With many jumps the arrows cross until the chart looks like a plate of spaghetti. That is why it is called **spaghetti code**. You can hardly follow the flow any more, and mistakes hide well. - -A structure chart has no arrows. If you insert a box, everything below simply moves down with it, and no jump can point to the wrong place. For leaving a loop early there is a separate, tidy box, the break. You will meet it in lesson 18. - -::: angeberwissen -In 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, \`goto\` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. -::: - -## Pseudocode and comparison - -**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. There are no jumps here either. This is our tea example: - -\`\`\` -Put a cup on the table -IF sugar wanted THEN - Add sugar -END IF -WHILE tea still too hot - Wait 1 minute -END WHILE -Drink the tea -\`\`\` - -Pseudocode has **no fixed notation**. Some people write WHEN instead of IF, others use an arrow for assignment (\`number ← 5\`) or leave out the END lines. All of that is fine. What matters is that anyone can understand it without an explanation. So pseudocode is not another programming language you have to learn. - -::: angeberwissen -Does pseudocode look familiar? The programming language Python looks very similar, and that is on purpose: its inventor Guido van Rossum wanted programs to read almost like plain text. Python also uses indentation to show what belongs together. But careful: Python is a real programming language with strict rules. One space too many and the computer complains. Pseudocode is more relaxed, just like me at breakfast. -::: - -### Compared - -- **Structure chart:** boxes inside boxes, the loop is an upside-down L. You see the structure at a glance, and wild jumps are impossible. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing, and jumps all over the place are possible. -- **Pseudocode:** text with indentation, the loop sits between WHILE and END WHILE. Quick to write and already close to program code. - -> All three describe the same algorithm. Once you can read one form, you learn the others quickly. - -::: angeberwissen -Nassi and Shneiderman were out to get the arrows! Their 1973 article was called “Flowchart Techniques for Structured Programming”. With arrows you can jump all over the place until the chart looks like a plate of spaghetti. In a structure chart that is simply impossible. Baah, that is how I like it: tidy, like my stable. -::: - -## Game: Which way of drawing? - -::: spiel frage -titel: Game: Which way of drawing? -intro: Ludwig describes a way of drawing an algorithm without saying its name. Is it the structure chart, the flowchart or pseudocode? Eight rounds. -antworten: structure chart | flowchart | pseudocode - -runde: -frage: “When something is repeated, one of my arrows points back up.” -richtig: flowchart -> A flowchart has no special symbol for a loop. An arrow leads back up. - -runde: -frage: “My loop looks like an upside-down L.” -richtig: structure chart -> The box wraps around the repeated steps at the top and on the left. - -runde: -frage: “I am made of words like IF and WHILE, and the indentation shows what belongs together.” -richtig: pseudocode -> Pseudocode is text in plain language that is laid out like a program. - -runde: -frage: “My branch is a diamond with the exits yes and no.” -richtig: flowchart -> In a structure chart, the condition sits in a triangle instead. - -runde: -frage: “My arrows can get tangled all over the place like spaghetti.” -richtig: flowchart -> Because arrows may lead anywhere, spaghetti code is possible in a flowchart. - -runde: -frage: “I have no fixed way of writing. You may write WHEN instead of IF.” -richtig: pseudocode -> All that matters is that anyone can understand it without an explanation. - -runde: -frage: “The condition sits at the top in a triangle, and below it I split into two columns.” -richtig: structure chart -> This is how a branch looks in a structure chart: true on the left, false on the right. - -runde: -frage: “If you insert a box, everything below simply moves down with it. No jump can go wrong.” -richtig: structure chart -> A structure chart has no arrows and no jumps, so nothing can point to the wrong place. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the symbols of a flowchart and read a simple flowchart. → Other ways to draw it: the flowchart -- I can build a simple algorithm as a flowchart myself. → Exercise: Baking a cake as a flowchart -- I can explain why jumps with GOTO lead to mistakes and spaghetti code. → Drawbacks of the flowchart: jumps -- I can read a simple algorithm as pseudocode. → Pseudocode and comparison -::: - -## Quiz - -::: quiz -? How do you recognise a loop in a flowchart? -→ Other ways to draw it: the flowchart -- [ ] By an upside-down L -- [x] By an arrow that leads back up -- [ ] By the word WHILE -> The upside-down L belongs to the structure chart, and WHILE to pseudocode. - -? Match each flowchart symbol to its meaning. -→ Other ways to draw it: the flowchart -= Oval -> Start or end -= Rectangle -> Statement -= Diamond -> Decision -= Parallelogram -> Input or output -> The diamond has two exits: yes and no. - -? You insert a new line into a program with GOTO. What can happen? -→ Drawbacks of the flowchart: jumps -- [x] The jumps point to the wrong lines because the numbers have moved -- [ ] Nothing, the jumps adjust by themselves -- [ ] The program automatically gets faster -> Every GOTO points to a fixed line number. If the lines move down, the program jumps to the wrong place. - -? In pseudocode, what shows which lines belong to a loop? -→ Pseudocode and comparison -- [ ] The colour -- [x] The indentation and the END WHILE -- [ ] An arrow -> Everything between WHILE and END WHILE is indented and is repeated. -::: -`,Bw=`--- -titel: The editor -bereich: First steps -kurz: Insert elements, type text, move and delete. ---- - -## Skills I will gain now - -::: kompetenzen -- insert an element from the Elements area and replace a placeholder -- change the text of a box and switch between Statement, Input and Output -- move, copy and delete boxes and undo steps -::: - -## The screen - -VisuStruct has two editors: the [structure chart editor](#zeige-editor), which this lesson is about, and on the right the [Code](#zeige-codelive) area for Java code (from lesson 4). If the structure chart editor is collapsed, this lesson opens it for you. The blue words show you the areas, even when they are collapsed: move the mouse over one, and the area opens next to the learning area and lights up. Click it (or tap it), and it stays open. - -The structure chart editor has several areas. Move the mouse over a blue word or tap it, and that area lights up in the editor; collapsed areas such as Elements open. - -- **At the very top, the [toolbar](#zeige-leiste):** New, Open and Save. On the far right, the gear for [Settings](#zeige-einstellungen): text size and language. -- **Below it, the [tools](#zeige-werkzeuge)** above the elements and the structure chart: Undo, Cut, Copy, Paste, Delete, Export, Code and Simulation. The buttons only show icons. Hold the mouse over one and its name appears. -- **On the left, the [Elements](#zeige-elemente):** Here are all the building blocks you can drag into the structure chart. Some people also call this area the palette. -- **In the middle, the [structure chart](#zeige-struktogramm):** A new diagram contains only an empty placeholder, marked with **ø**. -- **At the bottom, the [Object Inspector](#zeige-objektinspektor):** Here you edit the text of the selected element. If it is too small or too big, drag the line with the grip above it up or down. - -> You can collapse this learning area at any time with the [sidebar icon](#zeige-lernen) at the top of this area. Then only the slim “🎓 Learn” strip stays on the left; click it to open the area again. It stays open next to the editor so you can try out right away what you read. In the same way there is the [📁 Files](#zeige-dateien) column on the left for your saved programs (lesson 3) and the [Code](#zeige-codelive) area on the right for Java (from lesson 4). - -## Insert an element - -Drag an element from the **Elements** area onto the structure chart. While you drag, a blue line shows where it will land: - -- **Onto the placeholder ø:** The element replaces the placeholder. -- **Onto the top half of a box:** The element goes in front of it. -- **Onto the bottom half of a box:** The element goes after it. - -::: grafik l02-einfuegen.svg -Where you drop it decides where the new element lands. -::: - -It also works without dragging: **click** an element in the Elements area (or tap it). Then it is inserted after the selected box. If the placeholder **ø** is selected, it replaces it. - -With the keyboard, press **Tab** to jump to an element and press **Enter**. The new element also goes after the selected box. - -::: angeberwissen -Grabbing boxes and dragging them around, just like you are doing now, has a fancy name: **direct manipulation**. Ben Shneiderman coined the term in 1982. Yes, the structure chart guy. That man worked harder than I do when I graze. -::: - -## Type text - -Click a box. It gets a blue outline, and its text appears in the Object Inspector below the diagram. Whatever you type there shows up in the diagram straight away. - -It is quicker to **double-click** the box, or **double-tap** it on a tablet. Then you type the text right in the structure chart. **Enter** takes it, **Esc** cancels. With the keyboard, select the box and press **Enter**. - -The box from the Elements area is called a **Statement**. At the top of the Object Inspector you choose what sort of statement it should be: - -- **Statement:** calculate or set something, e.g. \`int number = 5\`. You will learn how in lesson 4. -- **Input:** ask for a value while the chart runs. That comes in lesson 6. -- **Output:** show something. In the diagram it then has \`output:\` in front, e.g. \`output: "Hello"\`. - -To start with, you only need Output. Texts that should be shown exactly as they are go in **quotation marks**. - -::: diagramm l2-ausgabe.visustruct -Two outputs one after the other. Open the diagram in the editor and start the [simulation](#zeige-simulation) in the tools to see the output. You will learn more about it in lesson 7. -::: - -## Move, copy, delete - -- **Move:** Drag an existing box to a new place with the mouse. -- **Copy and paste:** Select a box, then press Ctrl+C and Ctrl+V (on a Mac ⌘C and ⌘V). The copy goes after the selected box. Without a keyboard, for example on a tablet, tap **Copy** and **Paste** in the [tools](#zeige-werkzeuge). -- **Delete:** Select a box and press Del, or click the [trash can](#zeige-loeschen) „Delete Selection“ in the tools. -- **Undo:** Ctrl+Z undoes the last step, Ctrl+Shift+Z brings it back (on a Mac ⌘Z and ⌘⇧Z). Without a keyboard, tap [Undo](#zeige-rueckgaengig) in the tools. - -## Exercise: Hello World - -::: übung l2-hallo -titel: Hello World -auftrag: Build a structure chart that outputs **Hello World**. -Drag a **Statement** from the Elements onto the placeholder **ø** and click the box. In the Object Inspector below the structure chart there are three buttons at the top: Statement, Input and Output. Click **Output**. Then type \`"Hello World"\` in the text field below, with quotation marks. -test: - -> Hello World -braucht: anweisung -tipp: You only need one single box. The text that should appear goes into the text field in the Object Inspector. -tipp: Watch out for the quotation marks. Without them, VisuStruct looks for a variable called Hello. -lösung: l2-hallo-loesung.visustruct -::: - -Click **Check** when you are done. VisuStruct runs your structure chart and compares the output. - -## Exercise: Two lines - -::: übung l2-zwei-zeilen -titel: Two lines -auftrag: First output **Hello** and then **I am learning structure charts**, each on its own line. -test: - -> Hello | I am learning structure charts -tipp: Two lines means two outputs. The boxes sit on top of each other and run from top to bottom. -tipp: Every output is a box of its own. Drag the second Statement onto the bottom half of the first one. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Game: Editor pro - -::: spiel frage -titel: Game: Editor pro -intro: Ludwig tests whether you have the editor under control. Seven rounds. - -runde: -frage: You drag a statement onto the placeholder **ø**. What happens? -- [x] The statement replaces the placeholder. -- The statement goes after the placeholder. -- Nothing, you can't drop anything on ø. -> The placeholder only keeps the place free. The new element takes it. - -runde: -frage: You drag an element onto the **top** half of a box. Where does it end up? -- [x] in front of it -- after it -- It replaces the box. -> Top half means in front, bottom half means after. The blue line shows you while dragging. - -runde: -frage: You drag an element onto the **bottom** half of a box. Where does it end up? -- in front of it -- [x] after it -- at the very end of the structure chart -> Bottom half means: directly after this box. - -runde: -frage: You deleted a box by accident. What brings it back? -- Ctrl+C / ⌘C -- [x] Ctrl+Z / ⌘Z -- Ctrl+V / ⌘V -> Ctrl+Z / ⌘Z undoes the last step. Ctrl+C / ⌘C copies, Ctrl+V / ⌘V pastes. - -runde: -frage: When it runs, exactly **Hello** should appear. What is in the box? -- [x] output: "Hello" -- output: Hello -- "Hello" -> Text that should be shown exactly like that goes in quotation marks. The editor puts \`output:\` in front when you choose the kind Output. - -runde: -frage: Where do you change the text of the selected box? -- in the Elements -- [x] in the Object Inspector -- in the toolbar at the very top -> The Object Inspector below the diagram shows the text of the selected box. - -runde: -frage: You click an element in the Elements area without dragging. Where does it end up? -- [x] after the selected box -- at the very beginning -- at the very end -> Without dragging (click, or Tab and Enter) the new element goes after the box that is selected right now. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can insert an element from the Elements area and replace a placeholder. → Insert an element -- I can change the text of a box and switch between Statement, Input and Output. → Type text -- I can move, copy and delete boxes and undo steps. → Move, copy, delete -::: - -## Quiz - -::: quiz -? What does the sign ø in a box mean? -→ Insert an element -- [ ] The box contains a mistake. -- [x] There is still an empty placeholder here. -- [ ] The program ends here. -> A placeholder is replaced when you drag an element onto it. - -? You drag a Statement onto the bottom half of a box. Where does it land? -→ Insert an element -- [ ] In front of it -- [x] After it -- [ ] The box is replaced. - -? How do you output the text Good morning exactly as it is? -→ Type text -- [ ] output: Good morning -- [x] output: "Good morning" -- [ ] input: "Good morning" -> Without quotation marks, Good morning is understood as the name of a variable. -::: -`,Pw=`--- -titel: Save, open, export -bereich: First steps -kurz: Keep your files safe, use your workspace, open several diagrams and share them as an image or PDF. ---- - -## Skills I will gain now - -::: kompetenzen -- give a diagram a title -- save a diagram as a .visustruct file and open it again -- export a diagram as an image (PNG) or PDF -- open a second diagram in a new tab -- create my workspace \`VisuStruct-Files\` -- save a program in my workspace -::: - -## The .visustruct file - -Structure charts are saved as **.visustruct** files. All versions of VisuStruct use the same format: in the browser, on Mac, iPad and iPhone, and the Java app on the computer. So you can start in the browser at school and carry on in the app at home. - -::: angeberwissen -When Nassi was a student, there were no files to save. There were punched cards. Nassi says a Saturday night date looked like this: his future wife sat with him in the computer centre and punched his cards. Romance, computer science style! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -This is what a punched card looked like. One card held one line of a program, here \`PRINT *, 'HELLO WORLD'\` in the Fortran language. Each column is one character, and the holes in it are its code. A whole program was a stack of these cards. If you dropped it, you had to sort everything again. -::: - -::: angeberwissen -A computer pioneer from my home region in Germany: **Konrad Zuse**. On 12 May 1941 he presented the **Z3** in Berlin, the world's first working program-controlled digital computer. It already calculated in the **binary system**, using only 0 and 1, with about 2,000 relays (electric switches). Its program was not on punched cards but punched as holes into used cinema film. Zuse then invented **Plankalkül**, one of the very first programming languages. Later he lived in **Hünfeld** near Fulda until his death in 1995. The Konrad Zuse Museum there shows replicas of the Z3. My tip for a school trip! The town of Hünfeld's website tells you when it is open. -::: - -::: grafik l03-zuse-lochstreifen.svg -Roughly what Zuse's program strip looked like: old cinema film with punched holes. Each column is one instruction with 8 positions. A hole means 1, no hole means 0. The machine read the strip one instruction after another. -::: - -## Save and open - -- **[Save](#zeige-speichern)** (Ctrl+S, on a Mac ⌘S): The diagram is saved as a file. If the **Files** column is set up (see below), it goes there. Otherwise the browser asks where to put it or puts the file in your downloads folder. -- **[Open](#zeige-oeffnen)** (Ctrl+O, on a Mac ⌘O): Load a saved file again. You can also simply drag a file into the browser window. - -> The browser remembers your exercises automatically. But that only works in this browser on this device. So always save important work as a file as well. - -## The Files column - -To the left of the learning area you find the [📁 Files](#zeige-dateien) column. There you keep all your programs in one place, your **workspace**. - -**Your turn:** Set up your workspace right now, before you read on. From today on you save all your programs there. - -1. Create a workspace: open the column and click **Choose folder**. In the window, go to your **Documents**, use **New Folder** to create a folder called \`VisuStruct-Files\` there and select it. Allow VisuStruct to use the folder. This works in Chrome and Edge. On the iPad and in other browsers, click **Save in the browser** instead. -2. Save as usual. In your workspace, VisuStruct automatically creates a folder with today's date, for example \`2026-10-23\`, and saves the program in it. The file name comes from the title. - -This is what your workspace looks like then: - -\`\`\`text -VisuStruct-Files ← workspace -└── 2026-10-23 ← day - └── Factorial.visustruct -\`\`\` - -Clicking a program in the column opens it again. That way you quickly find every lesson later. - -Your **learning progress** goes into the workspace too: the file \`learnProgress.json\` lists the lessons and exercises you have finished. If you open the workspace in another browser, your progress is back. - -> Why a real folder? Your learning progress and your programs are stored in it as files. You can take the folder with you, for example on a USB stick or in your cloud folder such as OneDrive. That way you carry on at home on another computer exactly where you stopped. If you only save in the browser, everything stays in this one browser on this device. If someone deletes the browser data, your learning progress is gone too. - -## Several diagrams in tabs - -Above the structure chart you see the [tabs](#zeige-reiter). With **+** or [New](#zeige-neu) you open another, empty diagram. A dot • in front of the name shows that there are unsaved changes. - -You type the [title](#zeige-titel) of a diagram into the field above the structure chart. It also appears when you export and is suggested as the file name. - -## Share: image, PDF or file - -With [Export](#zeige-exportieren) in the tools (icon with an arrow pointing up) you can share your structure chart: - -- **Image (PNG):** to put into a worksheet or a presentation -- **Vector graphic (SVG):** stays sharp at any size -- **PDF (A4):** one page to hand in or print -- **VisuStruct file (.visustruct):** to pass on to someone who should open and keep editing your structure chart in VisuStruct, for example by email or through the learning platform -- **Print** (Ctrl+P, on a Mac ⌘P): straight to the printer - -Under the [gear](#zeige-textgroesse) at the top right, Text size sets the font size. Larger text also shows when you export an image. - -## Try it out - -Open one of your exercises from lesson 2 and try the following: - -1. Give the diagram a name in the [title](#zeige-titel) field above the structure chart, for example \`Hello World\`. -2. [Save](#zeige-speichern) it in your workspace. Look in the [📁 Files](#zeige-dateien) column: is it in today's folder? -3. Open a second tab with **+** and click your program in the Files column there. It opens again. -4. [Export](#zeige-exportieren) it as an **image (PNG)** and as a **PDF (A4)**. Open both files and compare them. - -Did everything work? Then you know where your programs are and how to share them. - -## Game: How do you pass it on? - -::: spiel frage -titel: Game: How do you pass it on? -intro: Ludwig wants to pass on his structure chart. Which format fits best? Six rounds. -frage: Which format fits? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: You want to keep working on your structure chart tomorrow. -richtig: .visustruct -> Only the .visustruct file can be opened and edited in VisuStruct again. - -runde: -frage: The structure chart should go into a presentation as a picture. -richtig: PNG -> A PNG image can be put into any presentation and any worksheet. - -runde: -frage: Your teacher wants to print your work as one A4 page. -richtig: PDF -> The PDF is exactly one A4 page to hand in or print. - -runde: -frage: The structure chart goes on a poster and should stay sharp even when huge. -richtig: SVG -> A vector graphic stays sharp at any size. A PNG gets pixelated when you enlarge it. - -runde: -frage: Your friend should change the structure chart in her VisuStruct app on the iPad. -richtig: .visustruct -> All VisuStruct versions open the same .visustruct file: in the browser, on Mac, iPad and iPhone. - -runde: -frage: You want to send a picture into a chat quickly. -richtig: PNG -> Anyone can look at a PNG straight away, without VisuStruct. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can give a diagram a title. → Try it out -- I can save a diagram as a .visustruct file and open it again. → Save and open -- I can export a diagram as an image (PNG) or PDF. → Share: image, PDF or file -- I can open a second diagram in a new tab. → Several diagrams in tabs -- I can create my workspace \`VisuStruct-Files\`. → The Files column -- I can save a program in my workspace. → The Files column -::: - -## Quiz - -::: quiz -? Which file can you open again in the Mac app and in the Java app? -→ Save and open -- [x] The .visustruct file -- [ ] The exported PNG image -- [ ] The exported PDF -> Images and PDFs are only for looking at. You can only keep editing the .visustruct file. - -? The browser remembers your exercises. Why should you still save? -→ Save and open -- [ ] Because otherwise the exercises are not checked -- [x] Because the browser only keeps the data on this device and it can get lost -- [ ] Because you cannot export without saving - -? Today you save a program in your workspace. Where does it end up? -→ The Files column -- [ ] In the downloads folder -- [x] In the workspace, inside a folder with today's date -- [ ] Directly in the workspace without a subfolder -> VisuStruct automatically creates a date folder for each day. That keeps the programs sorted by lesson. -::: -`,Ow=`--- -titel: Variables and data types -bereich: Basics -kurz: Store values, get to know the data types int, double, String and boolean, and calculate. ---- - -## Skills I will gain now - -::: kompetenzen -- create a variable with a data type, a name and a value -- explain that Java is case-sensitive (\`number\` is not \`Number\`) -- tell the data types int, double, String and boolean apart -- explain that = is an assignment and not a comparison -- calculate with + - * / % and use whole-number division -- create and output variables in Java -::: - -## What is a variable? - -A **variable** is like a labelled box. It has a **name**, a **data type** and a **value**. - -\`\`\` -int age = 14 -\`\`\` - -Here the variable is called \`age\`, its data type is \`int\` (whole number), and its value is 14. You can use the value again later through its name. - -::: grafik l04-variable.svg -The variable as a box: the name on the label, the data type as a sticker, the value inside. -::: - -> Variable names start with a **lowercase letter** and contain no spaces. Good names say what is inside: \`price\` is better than \`p\`. - -::: angeberwissen -In September 1999 the Mars Climate Orbiter space probe was lost. One team calculated the thrust in American units (pounds), the other expected metric units (newtons). The data only contained the number, not the unit. The probe flew too low into the Martian atmosphere and burned up, a loss of about 125 million dollars. A meaningful name like \`impulseInNewtonSeconds\` would have said what is inside. By the way, I always label my hay box \`hayInKilos\`. -::: - -If a name is made of several words, you write them together and start every further word with a capital letter: \`priceWithTax\`, \`numberOfStudents\`. This way of writing is called **camelCase**. - -::: angeberwissen -camelCase got its name because the capital letters in the middle stick out of the word like the humps of a camel: \`priceWithTax\` has two humps. Me, I'm a billy goat with zero humps but two horns. Sadly, nobody has invented GoatCase yet. -::: - -::: grafik l04-camelcase.svg -The capitals W and T stick out like the camel's two humps. -::: - -## Upper and lower case - -Java tells **upper and lower case** apart. The English word for this is **case-sensitive**. For Java, \`number\`, \`Number\` and \`NUMBER\` are three different names, so three different boxes: - -\`\`\` -int number = 4 -int Number = 6 -\`\`\` - -There are two variables here. If you later write \`NUMBER\`, Java finds no variable with that name. The program doesn’t run and you get an error message. - -> This also applies to Java words: \`String\` and \`System\` start with a capital, \`int\` and \`double\` are small. In your own programs, never create two variables that differ only in upper and lower case. It confuses you and everyone who reads your code. - -## Exercise: Three names - -::: übung l04-gross-klein -titel: Three names -auftrag: Ludwig created two variables: \`number\` with the value 4 and \`Number\` with the value 6. The structure chart should multiply them and output **Result: 24**. But it doesn’t run. - Click “Open in editor”, then Check, and read the error message. Fix the statement and click Check again. -start: l04-gross-klein-start.visustruct -test: - -> Result: 24 -braucht: anweisung -tipp: How many different names are in the structure chart? \`number\`, \`Number\` and \`NUMBER\` are three different names for the computer. -tipp: \`NUMBER\` doesn’t exist. For 24 you need 4 times 6, so \`number\` times \`Number\`: \`int result = number * Number\`. \`number * number\` gives 16. -lösung: l04-gross-klein-loesung.visustruct -::: - -## The four data types - -The data type says what kind of value may be stored in the variable. - -- **int:** whole numbers, e.g. \`int count = 3\` or \`int temperature = -5\` -- **double:** decimal numbers, e.g. \`double price = 2.5\`. You write a **point**, never a comma. -- **String:** text, e.g. \`String name = "Mia"\`. Text goes in quotation marks. -- **boolean:** truth values, only \`true\` or \`false\` - -There are more data types. You will soon need one of them: \`char\` for a **single character**, e.g. \`char grade = 'C'\`. A \`char\` goes in **single** quotation marks. You will get to know it better in lesson 17. - -::: diagramm l05-datentypen.visustruct -Three variables with different data types. Open the diagram and start the [simulation](#zeige-simulation). -::: - -You mostly meet truth values in **conditions**: \`age >= 18\` is either \`true\` or \`false\`. That is what lesson 8 is about. A variable of type \`boolean\` simply gets \`true\` or \`false\`: - -\`\`\` -boolean adult = false -\`\`\` - -::: angeberwissen -On 4 June 1996 the Ariane 5 rocket exploded just 37 seconds after launch. The cause was a single line: a decimal number for the speed was put into a whole-number variable that was too small for such large values. So the data type is no small matter, it can cost half a billion euros. -::: - -## Assignment with = - -The sign \`=\` is called an **assignment**. It does not mean “equals” as in maths. It means: work out the right-hand side and store the result in the variable on the left. - -\`\`\` -int points = 10 -points = points + 5 -\`\`\` - -In maths the second line would be wrong, because no number equals itself plus 5. In programming you read it like this: take the old value 10, add 5 and store 15 in \`points\`. You only write the data type the first time, when the variable is created. - -::: grafik l04-zuweisung.svg -First the right-hand side is calculated, then the result lands in the variable on the left. -::: - -## Calculating - -You can calculate with numbers: - -- \`+\` plus, \`-\` minus, \`*\` times, \`/\` divided by -- \`%\` remainder of a division (called “modulo”), e.g. \`17 % 5\` is 2 - -You know **division with remainder** from primary school, before you learned about decimals: 17 ÷ 5 = 3 remainder 2. 5 fits into 17 three times, that makes 15. To get to 17, 2 are still missing: that is the remainder. The computer calculates with whole numbers in exactly this way: \`/\` gives the result without the remainder, \`%\` gives only the remainder. - -| Primary school | with \`/\` | with \`%\` | -|---|---|---| -| 17 ÷ 5 = 3 remainder 2 | \`17 / 5\` gives 3 | \`17 % 5\` gives 2 | -| 20 ÷ 5 = 4 remainder 0 | \`20 / 5\` gives 4 | \`20 % 5\` gives 0 | -| 3 ÷ 5 = 0 remainder 3 | \`3 / 5\` gives 0 | \`3 % 5\` gives 3 | - -If the remainder is 0, the division works out exactly. Later you use this to check whether a number is even: for even numbers, \`number % 2\` is 0. - -**Multiplication and division come before addition and subtraction**, and brackets are worked out first: \`2 * (3 + 4)\` is 14. - -### Output text and result together - -A result on its own says little. With \`+\` you join a text and the value of a variable: - -\`\`\` -int age = 14 -output: "Age: " + age -\`\`\` - -This shows **Age: 14**. The text in quotation marks appears exactly as written; for \`age\` the computer puts in the value. The space after the colon belongs to the text, otherwise you get \`Age:14\`. - -## Exercise: Rectangle - -::: übung l05-rechteck -titel: Work out a rectangle -auftrag: A rectangle is 7 long and 4 wide. Create the variables \`length\` and \`width\`. Calculate the area and the perimeter in variables of their own and output both, like this: -\`Area: 28\` and on the next line \`Perimeter: 22\`. -test: - -> Area: 28 | Perimeter: 22 -braucht: anweisung -tipp: First think about which variables you need: two for the measurements and two for the results. They are all whole numbers. -tipp: The area is length times width, the perimeter is 2 times (length plus width). For the output you write e.g. \`output: "Area: " + area\`. The \`+\` joins the text and the value of the variable together. -lösung: l05-rechteck-loesung.visustruct -::: - -## Whole-number division - -If you divide two whole numbers and store the result in an \`int\` variable, everything after the decimal point is dropped. It is **not rounded**. - -\`\`\` -int x = 7 / 2 gives 3 -int r = 7 % 2 gives 1 (the remainder) -double d = 7.0 / 2 gives 3.5 -\`\`\` - -With \`/\` and \`%\` together you can convert things nicely, for example minutes into hours and minutes: - -::: diagramm l05-division.visustruct -135 minutes are 2 hours (135 / 60) with 15 minutes left over (135 % 60). -::: - -## Exercise: Convert seconds - -::: übung l05-sekunden -titel: Convert seconds -auftrag: 200 seconds should be output as minutes and seconds. The first and the last statement are already there. Insert statements between them that calculate \`minutes\` and \`remainder\`. -start: l05-sekunden-start.visustruct -test: - -> 3 minutes and 20 seconds -braucht: anweisung -tipp: How many whole minutes fit into 200 seconds, and how many seconds are left over? Work it out in your head first. -tipp: A minute has 60 seconds. Use \`/\` for the whole minutes and \`%\` for the remainder. Both variables have the type \`int\`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Exercise: Shopping - -::: übung l05-einkauf -titel: Shopping -auftrag: You buy 3 exercise books at 2.5 euros each. Create \`count\` as an \`int\` and \`price\` as a \`double\`, calculate the total price in a variable \`totalPrice\` and output \`Total: 7.5 euros\`. -test: - -> Total: 7.5 euros -braucht: anweisung -tipp: The count times the price gives the total price. For each variable, think about whether it is a whole number or a decimal number. -tipp: The total price is a decimal number, so \`totalPrice\` needs the type \`double\`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Now in Java - -A structure chart is a plan. In **Java** it becomes a program that the computer runs. Your shopping from the exercise looks like this: - -\`\`\`java editor -int count = 3; -double price = 2.5; -double totalPrice = count * price; -System.out.println("Total: " + totalPrice + " euros"); -\`\`\` - -- First the data type, then the name, then the value, just like in the box. -- Every statement ends with a **semicolon** \`;\`. -- Output in Java is written \`System.out.println(…)\`. - -How the computer understands your Java code and why it runs the same on Windows, macOS and Linux is explained in the lesson “Structure chart and code”. - -::: angeberwissen -Java was first called **Oak**, after the tree outside James Gosling’s office window. From 1991 his team at Sun Microsystems wanted to program small devices such as TV set-top boxes. But another company already had the name Oak. So in 1995 it became **Java**, like the coffee from the island of Java. -::: - -## Text in Java - -Variables do not only store numbers. For text there is the data type \`String\`: - -\`\`\`java editor -String name = "Mia"; -int age = 14; -double height = 1.62; -System.out.println(name + " is " + age + " years old."); -System.out.println("Height: " + height + " m"); -\`\`\` - -- Text goes in quotation marks. -- You write \`String\` with a capital letter, \`int\`, \`double\` and \`boolean\` in lowercase. Java tells them apart. -- With \`+\` you join text and numbers together. - -You type Java in the [Code](#zeige-codelive) area. The structure chart builds itself as you type. “Open in editor” brings the example into the Code area. Click “Run” there, then change the name, age or height and try again. - -::: übung l04-java-steckbrief -titel: Profile in Java -bereich: beide -code: java -auftrag: Write a profile of Ludwig the billy goat. Create three variables: the name **Ludwig**, the age **7** and the height **1.2**. Then output these two lines: - **Ludwig is 7 years old.** and **Height: 1.2 m** - “Open in editor” also opens the Code area on the right. Type your code there; the structure chart builds itself. Then click Check. -test: - -> Ludwig is 7 years old. | Height: 1.2 m -braucht: anweisung -tipp: You need a \`String\`, an \`int\` and a \`double\`. Every line ends with a semicolon. -tipp: \`String name = "Ludwig";\`, \`int age = 7;\` and \`double height = 1.2;\`. You join the output with \`+\`: \`System.out.println(name + " is " + age + " years old.");\` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Fill in the gaps: data types - -::: lückentext -titel: Profile in Java -auftrag: Fill in the missing words. On the outside is the frame that every Java program in its own file needs. The variables go inside it. -\`\`\`java -[[public]] class Profile { - public static [[void]] main(String[] args) { - [[int]] age = 14; - [[double]] height = 1.62; - [[String]] name = "Mia"; - [[boolean]] hasPet = true; - System.out.[[println]](name + " is " + age + " years old."); - } -} -\`\`\` -erklärung: Whole numbers are \`int\`, decimal numbers \`double\`, texts \`String\` (with a capital S) and truth values \`boolean\`. \`public class\` and \`public static void main\` make up the frame. In the Code area you may leave it out, more on this in the lesson “Structure chart and code”. -::: - -## Find the bug: seconds - -::: übung l04-java-fehler -titel: Fix the seconds -code: java -auftrag: The program should convert 200 seconds into minutes and seconds and output **3 min 20 s**. But it outputs **20 min 3 s**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: \`/\` divides without a remainder, \`%\` gives the remainder. Which one do you need for the minutes, which one for the seconds left over? -tipp: The two operators are swapped: \`int minutes = seconds / 60;\` and \`int rest = seconds % 60;\` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l04-java-laeuft-nicht -titel: Fix the profile -code: java -auftrag: The program should output **Ludwig is 7 years old.** But it doesn’t run, because two words are spelled wrong. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig is 7 years old. -braucht: anweisung -tipp: Java is case-sensitive. Compare every word in the output carefully with what was created above. -tipp: \`System\` is written with a capital S. The variable is called \`age\` with a small a: \`System.out.println(name + " is " + age + " years old.");\` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which data type? - -::: spiel frage -titel: Game: Which data type? -intro: Ludwig has collected values. Which data type fits each value? Eight rounds. -antworten: int | double | String | boolean - -runde: -frage: Which data type fits \`17\`? -richtig: int -> A whole number without a decimal point is an \`int\`. - -runde: -frage: Which data type fits \`3.5\`? -richtig: double -> Numbers with a decimal point are \`double\`. - -runde: -frage: Which data type fits \`"Hello"\`? -richtig: String -> Text in quotation marks is a \`String\`. - -runde: -frage: Which data type fits \`true\`? -richtig: boolean -> \`true\` and \`false\` are the two truth values, data type \`boolean\`. - -runde: -frage: Which data type fits \`"17"\`? -richtig: String -> Careful, quotation marks! Here 17 is a text you can't calculate with. - -runde: -frage: Which data type fits \`-4\`? -richtig: int -> Negative whole numbers are \`int\` as well. - -runde: -frage: Which data type fits \`0.0\`? -richtig: double -> The point makes it a decimal number, even if there is only a 0 behind it. - -runde: -frage: Which data type fits \`"false"\`? -richtig: String -> In quotation marks, false is just a text too. The truth value has no quotation marks. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a variable with a data type, a name and a value. → What is a variable? -- I can explain that Java is case-sensitive (\`number\` is not \`Number\`). → Upper and lower case -- I can tell the data types int, double, String and boolean apart. → The four data types -- I can explain that = is an assignment and not a comparison. → Assignment with = -- I can calculate with + - * / % and use whole-number division. → Calculating -- I can create and output variables in Java. → Now in Java -::: - -## Quiz - -::: quiz -? Which data type fits the value 3.75? -→ The four data types -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Decimal numbers have the type double. In VisuStruct you write them with a point. - -? How many variables do \`int number = 1\`, \`int Number = 2\` and \`int NUMBER = 3\` create? -→ Upper and lower case -- [ ] one -- [ ] two -- [x] three -> Java is case-sensitive. The three names are different, so there are three variables. - -? What value does x have after \`int x = 17 / 5\`? -→ Calculating -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> With whole numbers, everything after the decimal point is dropped. It is not rounded. - -? What does \`17 % 5\` give? -→ Calculating -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 divided by 5 is 3, remainder 2. The operator % gives the remainder. - -? At the start, \`int points = 10\`. What is in points after \`points = points * 2\`? -→ Assignment with = -- [ ] 10 -- [ ] 12 -- [x] 20 -> The right-hand side is calculated with the old value 10, and the result 20 is stored in points. - -? Which line correctly creates a decimal number in Java? -→ Now in Java -- [ ] double price = 2,5; -- [x] double price = 2.5; -- [ ] Double price = 2.5 -> Decimal numbers use a point, and the line ends with a semicolon. -::: -`,Mw=`--- -titel: Sequence -bereich: Basics -kurz: Run steps one after another, watch the order and swap values. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that a sequence runs from top to bottom -- explain why the order of the steps matters -- swap two values with a temporary variable -- write a sequence in Java -::: - -## Step by step - -A **sequence** is a series of steps that run exactly once and in exactly this order. In the structure chart the boxes simply sit on top of each other. - -Each box only starts when the box above it is finished. Nothing is skipped and nothing is repeated. - -::: diagramm l05-sequenz.visustruct -A sequence of four boxes: first \`length\` and \`width\` get their values, then the area is calculated, and finally it is output. Each box runs exactly once, from top to bottom. Output: 15. -::: - -> The sequence is the simplest of the three basic building blocks. Almost every structure chart is mostly made of sequences. - -## Order matters - -When you make tea, you notice straight away if the order is wrong. With calculations it is just the same, only it is harder to spot. - -::: diagramm l04-rechnen.visustruct -First double, then add 1: the result is 7. If you swap the two middle boxes, you get 8. -::: - -The statement \`number = number * 2\` means: take the value of \`number\`, multiply it by 2 and store the result in \`number\` again. So what is in \`number\` depends on what happened before. - -::: angeberwissen -Structure charts are not just school stuff. According to Shneiderman, companies like IBM and Siemens planned their programs with them too. So you are learning pro stuff here. Baaa-mazing! -::: - -## Exercise: Put in order - -::: übung l04-reihenfolge -titel: Put in order -auftrag: The start diagram has the right boxes, but in the wrong order. Move them so that **20** is output at the end. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Read each box and ask yourself: which variable does it need, and where does that variable get its value? -tipp: A variable has to be created before you calculate with it. The output comes right at the end. Check in your head: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Swap two values - -Imagine two glasses: one with juice, one with water. If you want to swap what is in them, you need a third, empty glass. - -It is exactly the same with variables. If you simply write \`a = b\` and then \`b = a\`, the old value of \`a\` is already lost. In the end both variables have the same value. - -The solution is a **temporary variable** that keeps the old value for a short time: - -::: grafik l05-tauschen.svg -Three steps with an empty glass: first the juice into temp, then the water to the left, then the juice from temp to the right. -::: - -::: diagramm l04-tauschen.visustruct -First a is kept in temp. Then a gets the value of b, and b gets the kept value from temp. -::: - -## Exercise: Swap glasses - -::: übung l04-glaeser-tauschen -titel: Swap glasses -auftrag: The left glass holds juice, the right one water. Swap the contents of the variables \`left\` and \`right\` before they are output. -Do not change the first two boxes. Insert new statements between them instead. -start: l04-tauschen-start.visustruct -test: - -> Left: water | Right: juice -braucht: anweisung -tipp: How do you swap two full glasses in real life? You need a third, empty glass. -tipp: Create a temporary variable with \`String temp = left\`. After that you need two more assignments. -lösung: l04-tauschen-loesung.visustruct -::: - -## Now in Java - -As in lesson 4, you can also write a sequence directly in Java. The swap from above looks like this: - -\`\`\`java editor -int a = 5; -int b = 9; -int temp = a; -a = b; -b = temp; -System.out.println("a = " + a); -System.out.println("b = " + b); -\`\`\` - -- Every box becomes one line. The lines run from top to bottom, just like the boxes. -- Every statement ends with a **semicolon** \`;\`. -- An output is called \`System.out.println(…)\` in Java. Mind the capital S in \`System\`: Java tells upper and lower case apart. - -You type Java in the [Code](#zeige-codelive) area to the right of the structure chart. While you type, VisuStruct builds the structure chart along with it. So you see straight away which box belongs to which line. - -::: übung l05-java-kino -titel: Cinema tickets in Java -bereich: beide -code: java -auftrag: A cinema ticket costs 9 euros. Write a Java program that calculates the price of 3 tickets and outputs **Total: 27**. - “Open in editor” also opens the Code area on the right. Type your code there; the structure chart builds itself. Then click Check. -test: - -> Total: 27 -braucht: anweisung -tipp: You need three variables: the price, the number of tickets and the result. Every line ends with a semicolon. -tipp: \`int price = 9;\` and \`int count = 3;\` create the variables. \`int total = price * count;\` calculates, and \`System.out.println("Total: " + total);\` outputs the result. -lösung: l05-java-kino-loesung.visustruct -::: - -## Fill in the gaps: swapping glasses - -::: lückentext -titel: Swap two values -auftrag: The values of \`a\` and \`b\` should be swapped. Fill in the missing words. -\`\`\`java -int a = 3; -int b = 8; -[[int]] temp = [[a]]; -a = [[b]]; -b = [[temp]]; -System.out.println("a = " + a + ", b = " + b); -\`\`\` -erklärung: First you save \`a\` in the helper variable, then \`a\` gets the value of \`b\`, and finally \`b\` gets the saved value. Output: **a = 8, b = 3** -::: - -## Find the bug: credit - -::: übung l05-java-fehler -titel: Fix the credit -code: java -auftrag: The canteen card holds 20 euros. A meal costs 7 euros. The program should output the credit **after** paying, so **Left: 13**. But it outputs **Left: 20**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l05-java-fehler-start.visustruct -test: - -> Left: 13 -braucht: anweisung -tipp: All lines are right, only their order is not. When is the credit output, and when is the meal paid? -tipp: Swap the last two lines: first \`credit = credit - price;\`, then the output. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l05-java-laeuft-nicht -titel: Share a pizza -code: java -auftrag: A pizza has 8 slices and 4 friends share it. The program should output **Everyone gets 2 slices.** But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Everyone gets 2 slices. -braucht: anweisung -tipp: Compare the name in the output letter by letter with the name created in the third line. -tipp: The variable is called \`perPerson\` with a capital P (camelCase). Write it exactly like that in the output. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Sort the boxes - -::: spiel reihenfolge -titel: Game: Sort the boxes -intro: Ludwig has mixed up the boxes. Put them in the right order. Four rounds. - -runde: -frage: At the end, **7** should be output. -- \`int number = 3\` -- \`number = number * 2\` -- \`number = number + 1\` -- \`output: number\` -> First double, then add 1: 3 · 2 + 1 = 7. The other way round you'd get (3 + 1) · 2 = 8. - -runde: -frage: At the end, **8** should be output. -- \`int number = 3\` -- \`number = number + 1\` -- \`number = number * 2\` -- \`output: number\` -> The same boxes, a different order, a different result: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a and b should swap their values. -- \`int temp = a\` -- \`a = b\` -- \`b = temp\` -- \`output: a + " " + b\` -> First a is saved in temp. Otherwise the old value is gone as soon as a gets the value of b. - -runde: -frage: Ludwig makes tea. -- Fill the kettle with water -- Switch the kettle on -- Wait until the water boils -- Pour the water over the tea bag -- Let the tea brew -> Every step needs the one before. Just like in a structure chart. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that a sequence runs from top to bottom. → Step by step -- I can explain why the order of the steps matters. → Order matters -- I can swap two values with a temporary variable. → Swap two values -- I can write a sequence in Java. → Now in Java -::: - -## Quiz - -::: quiz -? How often does each box of a sequence run? -→ Step by step -- [ ] Until a condition is false -- [x] Exactly once -- [ ] Not at all if it is empty -> In a sequence nothing is repeated and nothing is skipped. Loops are there for repetition. - -? At the start a = 5 and b = 9. Then \`a = b\` runs and after that \`b = a\`. What is in the variables at the end? -→ Swap two values -- [ ] a = 9 and b = 5 -- [x] a = 9 and b = 9 -- [ ] a = 5 and b = 5 -> After \`a = b\` the old value 5 is lost. \`b = a\` then only copies the 9 back. - -? Why do you need a temporary variable when swapping? -→ Swap two values -- [x] So that a value is not overwritten before it is needed -- [ ] So that the structure chart gets longer -- [ ] Because otherwise you cannot output variables - -? What does the sequence \`int x = 4\`, \`x = x + 1\`, \`x = x * 3\`, \`output: x\` output? -→ Order matters -- [ ] 13 -- [x] 15 -- [ ] 4 -> First x becomes 5, then 15. - -? What does every statement end with in Java? -→ Now in Java -- [ ] With a full stop . -- [x] With a semicolon ; -- [ ] With a colon : -> If the semicolon is missing, VisuStruct shows a hint below the code. -::: -`,Zw=`--- -titel: Input and output -bereich: Basics -kurz: Ask for values, show results and use the IPO model. ---- - -## Skills I will gain now - -::: kompetenzen -- explain the IPO model -- write an input with a data type, a name and a question -- join text and variables in an output with + -- work out a result first and store it in a variable, then output that variable, e.g. \`int sum = a + b\`, then \`output: sum\` -- pick out input, process and output from a task -- read numbers in Java with the scanner -- write comments with \`//\` and \`/* */\` and use them to structure and explain my code -::: - -## The IPO model - -Many programs work in three parts: - -1. **Input:** The program asks for values, e.g. two numbers. -2. **Process:** It calculates with the values. -3. **Output:** It shows the result. - -The first letters give **IPO**. So far the values were fixed in the structure chart. With an input, a different value can be used every time the chart runs. - -::: diagramm l06-eva.visustruct -Input at the top, process in the middle, output at the bottom. Start the simulation and try different numbers. -::: - -## Input with input: - -An input asks for a value while the chart runs and stores it in a variable. You write the **data type**, the **name** and a **question** in quotation marks: - -\`\`\` -input: int age "How old are you?" -input: double price "Price in euros?" -input: String name "What is your name?" -\`\`\` - -In the editor you choose the kind **Input** at the top of a Statement. The word \`input:\` is then already in front, and you only type \`int age "How old are you?"\`. - -> The data type decides what may be typed in. With \`int\`, the simulation reports an error if someone types 2.5 or Hello. - -## Output with output: - -An output shows text and values. Text goes in quotation marks, variables do not. With \`+\` you **join** the parts together: - -\`\`\` -output: "Hello " + name + "!" -output: "You are " + age + " years old." -\`\`\` - -Watch out for the spaces inside the quotation marks. Without them everything sticks together, and you see \`HelloMia!\` instead of \`Hello Mia!\`. - -## Exercise: Greeting - -::: übung l06-begruessung -titel: Greeting -auftrag: Ask for a name and greet the person. When Ada is typed in, **Hello Ada!** should be output. -test: Ada -> Hello Ada! -test: Ben -> Hello Ben! -braucht: anweisung -tipp: First comes an input for the name, then an output that uses the name. -tipp: The name is text, so the input needs the type \`String\`. In the output you join \`"Hello "\`, the variable and \`"!"\` with \`+\`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Careful with + in an output - -In an output, \`+\` **always** joins the parts together, even with numbers. If \`a\` is 3 and \`b\` is 4, then - -\`\`\` -output: a + b -\`\`\` - -does not show 7 but **34**. So calculate in a variable first and then output the variable: - -\`\`\` -int sum = a + b -output: "Sum: " + sum -\`\`\` - -That also fits the IPO model: you calculate in the process part, not in the output. - -## From the task to the structure chart - -Before you drag the first box, read the task carefully and take it apart. This is called **problem analysis**. Three questions help you: - -1. **What is given?** These values become the **input**. Also think about the data type. -2. **What are you looking for?** That becomes the **output**. -3. **How do you get from what is given to what you are looking for?** That is the **process**, often a formula. - -An example: *A cinema ticket costs 9 euros. The program asks how many tickets someone buys and shows the total price.* - -- Given: the number of tickets → \`input: int count "How many tickets?"\` -- Looking for: the total price → \`output: "Total price: " + total\` -- Way: count times 9 → \`int total = count * 9\` - -Now you only have to put the three parts on top of each other in the order I, P, O. - -> Look out for signal words in the task: *asks*, *reads in* or *enters* point to an input. *Shows*, *outputs* or *reports* point to an output. - -## Exercise: Calculator - -::: übung l06-rechner -titel: Sum and product -auftrag: Ask for two whole numbers. Then output their sum and their product, each on its own line. -With 3 and 4 it looks like this: \`Sum: 7\` and \`Product: 12\`. -test: 3, 4 -> Sum: 7 | Product: 12 -test: 10, -2 -> Sum: 8 | Product: -20 -test: 0, 5 -> Sum: 5 | Product: 0 -braucht: anweisung -tipp: Plan the order: first read in both numbers, then calculate, then output. -tipp: You need two inputs, two statements for calculating and two outputs. Calculate the sum in a variable of its own, otherwise \`+\` joins the numbers together. -lösung: l06-rechner-loesung.visustruct -::: - -## Exercise: Mean - -::: übung l06-mittelwert -titel: Mean -auftrag: Ask for two numbers, which may also be decimal numbers. Output their mean, so for 2 and 3 that is \`Mean: 2.5\`. -test: 2, 3 -> Mean: 2.5 -test: 4, 6 -> Mean: 5.0 -test: 1.5, 2 -> Mean: 1.75 -braucht: anweisung -tipp: You get the mean of two numbers by adding them and halving the result. -tipp: For decimal numbers you use the type \`double\`. The mean is the sum divided by 2. Remember the brackets: \`(x + y) / 2\`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Now in Java - -This is the IPO example from the start in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("First number?"); -int a = scanner.nextInt(); -System.out.println("Second number?"); -int b = scanner.nextInt(); -int sum = a + b; -System.out.println("Sum: " + sum); -\`\`\` - -- For input, Java needs a **Scanner**. You write the first two lines once at the very top, then you can read as often as you like. -- \`scanner.nextInt()\` reads a whole number, \`scanner.nextDouble()\` a decimal number and \`scanner.next()\` a word. -- The question to the user is a normal output right before it. VisuStruct turns both lines together into one input box. - -::: angeberwissen -Java was originally meant to control small devices, and it still does: many SIM cards in phones and many bank cards run a mini version called **Java Card**. Quite possibly you have Java in your pocket right now. -::: - -::: übung l06-java-tage -titel: Age in days -code: java -auftrag: Write a Java program that asks for the age in years and outputs roughly how many days that is. Use 365 days per year. For 2 years it shows **That is about 730 days.** -test: 2 -> That is about 730 days. -test: 10 -> That is about 3650 days. -test: 1 -> That is about 365 days. -braucht: anweisung -tipp: First the two scanner lines, then the question and the input, then the calculation, then the output. -tipp: \`int years = scanner.nextInt();\` reads. \`int days = years * 365;\` calculates, and \`System.out.println("That is about " + days + " days.");\` outputs. -lösung: l06-java-tage-loesung.visustruct -::: - -## Comments in code - -You may write notes in your code. They are called **comments**. Java skips them when it runs, so the program and the structure chart stay the same. There are two kinds: - -- \`//\` turns the rest of the line into a comment. This is a **single-line comment**. -- \`/*\` starts a **multi-line comment** and \`*/\` ends it. Everything in between belongs to the comment, however many lines. Java does not need the stars at the start of the lines in between, they just look tidy. - -In finished programs you sometimes also see \`/** … */\` with two stars at the start. That is a **Javadoc comment**, from which Java can create a description of the program. For you, \`//\` and \`/* */\` are enough. - -This is the IPO example with comments: - -\`\`\`java editor -/* - * Task: The program asks for two numbers - * and outputs their sum. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Input -System.out.println("First number?"); -int a = scanner.nextInt(); -System.out.println("Second number?"); -int b = scanner.nextInt(); - -// Process -int sum = a + b; // add the two numbers - -// Output -System.out.println("Sum: " + sum); // for 3 and 4 I expect: Sum: 7 - -// Next time: allow decimal numbers too -\`\`\` - -What comments are good for: - -- **The task:** the multi-line comment at the top says what the program should do. -- **Structure:** \`// Input\`, \`// Process\` and \`// Output\` divide the code by the IPO model. -- **Explanation:** a comment after a line says what your algorithm does there. -- **Expectation:** write down which output you expect. When you test, you compare. -- **Matching brackets:** later you will meet blocks in curly brackets \`{ }\`. Then, for example, \`} // end for\` shows which bracket closes what. -- **Keeping your thoughts:** what do you need to remember when you carry on next time? - -Click **Open in editor**, change a comment or add a new one. The structure chart stays the same, and VisuStruct keeps your comments. - -> Don't put a comment after every line. Explain what your algorithm does and why, not every single character. - -::: angeberwissen -Both kinds are much older than Java: \`/* … */\` comes from the language PL/I from 1964, \`//\` from BCPL from 1967. Java inherited them via C and C++. -::: - -## Fill in the gaps: comments - -::: lückentext -titel: Add the comments -auftrag: Add the characters so that a multi-line comment with the task is at the top and the other two notes are single-line comments. -\`\`\`java -[[/*]] - * Task: The program converts euros to cents. - [[*/]] -int euros = 3; -[[//]] Process -int cents = euros * 100; -[[//]] Output, expected: 300 -System.out.println(cents); -\`\`\` -erklärung: \`/*\` opens the multi-line comment and \`*/\` closes it. \`//\` only lasts until the end of the line, so every note needs its own \`//\`. -::: - -## Fill in the gaps: input - -::: lückentext -titel: Read a name and an age -auftrag: Fill in the missing words so that the program reads a name and an age. -\`\`\`java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("What is your name?"); -[[String]] name = scanner.[[next]](); -System.out.println("How old are you?"); -int age = scanner.[[nextInt]](); -System.out.println("Hello " + name + ", next year you will be " + [[(age + 1)]] + "."); -\`\`\` -erklärung: \`scanner.next()\` reads a word, \`scanner.nextInt()\` a whole number. The brackets around \`age + 1\` matter: without them Java first appends \`age\` and then \`1\` to the text, and 14 would become **141**. -::: - -## Find the bug: sum - -::: übung l06-java-fehler -titel: Fix the sum -code: java -auftrag: The program reads two numbers and should output their sum. For 3 and 4, however, it shows **Sum: 34** instead of **Sum: 7**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Sum: 7 -test: 10, 5 -> Sum: 15 -test: 0, 9 -> Sum: 9 -braucht: anweisung -tipp: Read the output from left to right: what is \`"Sum: " + a\`? And what happens when \`+ b\` comes after it? -tipp: Add brackets so that Java calculates first: \`System.out.println("Sum: " + (a + b));\` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l06-java-laeuft-nicht -titel: Age next year -code: java -auftrag: The program asks for your age and should say how old you will be next year. For 14 that is **Next year you will be 15**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> Next year you will be 15 -test: 9 -> Next year you will be 10 -braucht: anweisung -tipp: The input ends up in a variable. What exactly is it called, and what is it called in the output? -tipp: The variable is called \`age\` with a small a: \`System.out.println("Next year you will be " + (age + 1));\` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Game: What is output? - -::: spiel frage -titel: Game: What is output? -intro: Ludwig has built inputs and outputs. Predict what happens. Seven rounds. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: What is output? -- 7 -- [x] 34 -- a + b -> In an output, \`+\` always joins the parts together, even numbers. - -runde: - int a = 3 - int b = 4 - int sum = a + b - output: "Sum: " + sum -frage: What is output? -- [x] Sum: 7 -- Sum: 34 -- Sum: sum -> The calculating happens before, in a variable. The output only joins text and result. - -runde: - input: String name "What is your name?" - output: "Hello" + name + "!" -frage: You type Mia. What is output? -- Hello Mia! -- [x] HelloMia! -- Hello name! -> The text \`"Hello"\` has no space at the end. That's why everything sticks together. - -runde: - input: int age "How old are you?" -frage: You type 2.5. What happens? -- age is 2. -- age is 2.5. -- [x] The simulation reports an error. -> The data type \`int\` only allows whole numbers. - -runde: - input: double price "Price in euros?" -frage: Which part of IPO does this box belong to? -- [x] Input -- Process -- Output -> \`input:\` asks for a value. That is the input. - -runde: - double mean = (a + b) / 2.0 -frage: Which part of IPO does this box belong to? -- Input -- [x] Process -- Output -> Here something is calculated. That is the process. - -runde: - output: "Mean: " + mean -frage: Which part of IPO does this box belong to? -- Input -- Process -- [x] Output -> \`output:\` shows the result. That is the output. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain the IPO model. → The IPO model -- I can write an input with a data type, a name and a question. → Input with input: -- I can join text and variables in an output with +. → Careful with + in an output -- I can work out a result first and store it in a variable, then output that variable, e.g. \`int sum = a + b\`, then \`output: sum\`. → Careful with + in an output -- I can pick out input, process and output from a task. → From the task to the structure chart -- I can read numbers in Java with the scanner. → Now in Java -- I can write comments with \`//\` and \`/* */\` and use them to structure and explain my code. → Comments in code -::: - -## Quiz - -::: quiz -? What does IPO stand for? -→ The IPO model -- [x] Input, process, output -- [ ] Input, program, order -- [ ] Insert, paste, open -> Many programs first ask for values, process them and then show the result. - -? The variables a and b have the values 3 and 4. What does \`output: a + b\` show? -→ Careful with + in an output -- [ ] 7 -- [x] 34 -- [ ] a + b -> In an output, + joins the parts together. Calculate the sum in a variable first. - -? Which input fits if a price such as 4.99 should be typed in? -→ Input with input: -- [ ] input: int price "Price?" -- [x] input: double price "Price?" -- [ ] input: String "Price?" -> 4.99 is a decimal number, so double. Also, every input needs a variable name. - -? What does \`output: "Age: " + age\` show if age has the value 12? -→ Careful with + in an output -- [x] Age: 12 -- [ ] "Age: " + 12 -- [ ] Age: age - -? Task: *The program asks for the radius of a circle and shows its circumference.* Match each part of the text to where it belongs in the IPO model. -→ From the task to the structure chart -= asks for the radius -> Input -= circumference = 2 * 3.14 * radius -> Process -= shows its circumference -> Output -> The radius is given, the circumference is what you are looking for. The formula connects the two. - -? What does \`scanner.nextInt()\` read? -→ Now in Java -- [x] A whole number -- [ ] A decimal number -- [ ] A whole sentence -> For decimal numbers there is \`scanner.nextDouble()\`, for a word \`scanner.next()\`. - -? What does Java do with a comment? -→ Comments in code -- [ ] It outputs it as text. -- [x] It skips it. -- [ ] It reports an error. -> Comments are notes for people. The program runs exactly the same with or without them. - -? Where does a comment that starts with \`/*\` end? -→ Comments in code -- [x] At \`*/\` -- [ ] At the end of the line -- [ ] At the next empty line -> That is why a comment with \`/*\` can span several lines. A comment with \`//\`, on the other hand, ends at the end of the line. -::: -`,Lw=`--- -titel: Simulation and desk check -bereich: Basics -kurz: Run a structure chart step by step, work it out by hand and find mistakes. ---- - -## Skills I will gain now - -::: kompetenzen -- start the simulation, pause it, run single steps and stop it -- read the variables, the output and the last step during the simulation -- do a desk check by hand as a table -- tell syntax errors, runtime errors and logic errors apart -- find a mistake by comparing the values with what I expect -- follow Java code with Step and breakpoints -::: - -## Start the simulation - -Before branches and loops come along, you get to know your most important tool. From now on you can use the simulation to check every exercise yourself. - -With the [▶︎ Start simulation](#zeige-simulation) button on the right of the tools, VisuStruct runs your structure chart. While the simulation is running, you cannot edit the diagram. The same button is then called **■ End simulation**; it takes you back to editing. - -On the right, the **Controls** appear: - -- **Play** runs the diagram automatically, step by step. You set how long it waits between two steps under **Pause per step**. -- **Pause** stops for a moment. Then you carry on with Play or Step. -- **Step** runs exactly one step. That way you can watch calmly. -- **Stop** cancels and resets everything to the start. - -Open the following diagram in the editor and go through it with **Step**: - -::: diagramm sim-tausch.visustruct -The values of a and b are swapped. The variable temp keeps one value meanwhile. -::: - -## What the simulation shows - -- **Highlight:** One box in the diagram is coloured. With **Last step** it is the box that has just run. With **Next step** it is the box that comes next. -- **Input:** If the diagram asks for a value, you type it in here and confirm with **OK**. -- **Last Step:** Here you see what has just happened, e.g. \`a = 5 -> 5\` after the box \`a = b\`. On the left, the variables have already been replaced by their values; to the right of the arrow is the result. -- **Variables:** All variables with their current values. -- **Output:** Everything that was output with \`output:\`. - -If the [Code](#zeige-codelive) area is open on the right, the [console](#zeige-konsole) runs along there as well. It is cleared at the start and then shows output and input just as they would appear in the real program. - -At the end, **Simulation finished.** appears. If something goes wrong, the simulation stops on the faulty box and shows a message, e.g. **Unknown variable: total**. - -## The desk check - -In a **desk check** you play the computer yourself. You go through the structure chart with pen and paper and write down the values of the variables after every step. It is best to make a table: one column for the step, one for each variable and one for the output. - -::: grafik l07-schreibtischtest-en.svg -A sheet of paper and a pen are all you need: after each step you write the new values in a new row. -::: - -For the diagram above, the table looks like this: - -| Step | a | b | temp | Output | -|---|---|---|---|---| -| \`int a = 3\` | 3 | – | – | | -| \`int b = 5\` | 3 | 5 | – | | -| \`int temp = a\` | 3 | 5 | 3 | | -| \`a = b\` | 5 | 5 | 3 | | -| \`b = temp\` | 5 | 3 | 3 | | -| \`output: "a = " + a\` | 5 | 3 | 3 | a = 5 | -| \`output: "b = " + b\` | 5 | 3 | 3 | b = 3 | - -Then compare your table with the simulation. Do the values under **Variables** match your row after every step? - -> A desk check is especially useful in tests. There you have no computer, but you can still show what your structure chart does. - -::: angeberwissen -“Computer” used to be a job: people who did calculations with pencil, paper and a calculating machine. One of the best was the mathematician Katherine Johnson at NASA. She calculated flight paths for space capsules, and later also for the Apollo 11 flight to the Moon. - -In 1962 John Glenn was to become the first American to orbit the Earth. A new IBM computer had calculated the flight path. Glenn did not fully trust the machine and said: “Get the girl to check the numbers. If she says they’re good, I’m ready to go.” Katherine Johnson checked everything by hand, a real desk check. Her numbers were right, and Glenn flew. - -Katherine Johnson was Black, and at that time laws in the US state of Virginia separated Black and white people. In the film “Hidden Figures” (2016) she has to run across the whole site every time she needs the toilet. The film exaggerates this: separate toilets really existed, but Katherine Johnson said she simply ignored the sign. - -Her colleague Dorothy Vaughan saw early on that the IBM computers would take over the calculating work. She taught herself and her whole team the programming language FORTRAN. That is how human computers became programmers. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), mathematician at NASA (photo: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), public domain). -::: - -## Three kinds of errors - -Errors are part of programming, even for professionals. There are three kinds, and you find each of them in a different way: - -- **Syntax error**: The text breaks the rules of the language, e.g. a \`;\` is missing at the end. The program does not start at all. -- **Runtime error**: The program starts but stops at one point, e.g. when it divides by 0. -- **Logic error**: The program runs to the end, but the result is wrong, e.g. because brackets are missing: \`a + b / 2\` instead of \`(a + b) / 2\`. - -This is how VisuStruct shows you the errors: - -- **Syntax error:** They happen less often in a structure chart, because the boxes give you the shape. In the [Code](#zeige-codelive) area the spot is underlined in red, the line number turns red, and you read e.g. **Line 2: Still missing here: ;**. -- **Runtime error:** The simulation stops on the box and reports e.g. **Division by zero.** In the Code area the line number turns red, and the [console](#zeige-konsole) names the line: **Line 3: Division by zero.** -- **Logic error:** Nobody reports anything here. The computer does not know what you actually wanted. Only you know the right result, so the desk check helps here. - -> A red line number shows an error. The round red dot in front of the line number is something else: a breakpoint. You will meet it below in “Now in Java”. - -## Find mistakes - -If a structure chart outputs something wrong, that is a logic error. Then do this: - -1. **Write down what you expect:** What should come out for a particular input? -2. **Run it step by step:** Start the simulation with **Step** and watch the variables. -3. **Find the spot:** Where does a value first differ from what you expected? That is exactly where the mistake is. - -Common mistakes in a sequence are: - -- The **order** is wrong: a variable is used before it has a value. -- A value is **overwritten** before it is needed. -- **Brackets** are missing: \`a + b / 2\` is not the same as \`(a + b) / 2\`. -- Two whole numbers are divided: \`7 / 2\` gives \`3\`, because with \`int\` everything after the decimal point is dropped. - -> Later, branches and loops come along. Then the simulation also shows you which path is taken and how often a loop runs. - -::: angeberwissen -On 9 September 1947 Grace Hopper’s team found a real moth stuck between two contacts in the Harvard Mark II computer. They taped it into the logbook and wrote: “First actual case of bug being found.” Today the moth is in a museum in Washington. - -Grace Hopper was one of the first programmers in the world. In 1952 she built one of the first **compilers**: a program that translates code into machine code. She believed people should be able to give computers instructions in almost normal English. This led to the programming language COBOL, which many banks still use today. She even became an admiral in the US Navy. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), computer scientist and admiral (photo: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), public domain). -::: - -## Exercise: Fix the swap - -::: übung sim-tausch -titel: Fix the swap -auftrag: The structure chart should read in two numbers and output them swapped. So with 3 and 5, first **5** and then **3** should appear. But it outputs 5 twice. - Do a desk check or use **Step** and fix the mistake. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Go through the diagram with **Step** and write down the values of a and b after every step. Where does the 3 disappear? -tipp: Look at a after the step \`a = b\`. Where did the old value of a go? Keep it in a temporary variable first, as in the example above. -lösung: sim-tausch-loesung.visustruct -::: - -## Exercise: Fix the cinema tickets - -::: übung sim-kino -titel: Fix the cinema tickets -auftrag: A cinema ticket costs 8.50 euros. The structure chart should ask for the number of tickets and output the total price, so for 2 tickets \`Total: 17.0\`. - Start the simulation. It stops with an error message. Find out why and fix the structure chart. -start: sim-kino-start.visustruct -test: 2 -> Total: 17.0 -test: 3 -> Total: 25.5 -test: 0 -> Total: 0.0 -braucht: anweisung -tipp: Read the error message of the simulation carefully. Which variable does it not know yet? -tipp: The simulation runs the boxes from top to bottom. Does total already have a value when the output comes? You can move boxes with the mouse. -lösung: sim-kino-loesung.visustruct -::: - -> If a simulation keeps running forever, click **Stop**. When you **Check** an exercise, VisuStruct stops by itself after a very large number of steps. - -## Now in Java - -You can run Java code step by step too. In the [Code](#zeige-codelive) area the tool for this is called the **debugger**: - -- Click a line number on the left. A red dot appears: that is a **breakpoint**. [▶︎ Run](#zeige-ausfuehren) pauses before this line. -- The [Step](#zeige-einzelschritt) button runs exactly one line, like **Step** in the simulation. -- Below the code you see the current value of every variable. That is your desk check, except that the computer writes it down for you. - -::: übung l07-java-pizza -titel: Fix the pizza order -code: java -auftrag: A pizza costs 8 euros, extra cheese 2 euros. For 3 pizzas with extra cheese the program should output **Total: 30**. But it outputs 14. - Go through the Java code with Step and watch \`total\`. Find the mistake and fix it in the code. -start: l07-java-pizza-start.visustruct -test: - -> Total: 30 -braucht: anweisung -tipp: What value is in \`total\` after the fourth line? Work out in your head what Java calculates first. -tipp: As in maths, multiplication comes before addition: \`price + cheese * count\` is \`8 + 6\`. Add brackets: \`(price + cheese) * count\`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Fill in the gaps: desk check - -::: lückentext -titel: What is in the variables? -auftrag: Do a desk check in your head. After each line, write down the value the variable has afterwards, and in the last line what is output. -\`\`\`java -int a = 5; -int b = 2; -a = a + b; // a is now [[7]] -b = a * 2; // b is now [[14]] -a = b - a; // a is now [[7]] -System.out.println(a + b); // output: [[21]] -\`\`\` -erklärung: Each line calculates with the values that are in the variables right now: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, output 7 + 14 = 21. You can check it with Step in the Code area. -::: - -## Find the bug: score - -::: übung l07-java-fehler -titel: Fix the score -code: java -auftrag: In a game Ludwig first gets 10 points, then 5 points, then he loses 3 points. At the end **Points: 12** should appear. But **Points: 3** appears. - Go through the code with Step and watch \`points\`. Fix the wrong line and click Check. -start: l07-java-fehler-start.visustruct -test: - -> Points: 12 -braucht: anweisung -tipp: After which line does \`points\` suddenly have the value 3? What should actually happen in that line? -tipp: Ludwig loses 3 points, so 3 is subtracted from the old value: \`points = points - 3;\` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l07-java-laeuft-nicht -titel: Fix the bonus -code: java -auftrag: Ludwig has 10 points and gets 5 bonus points. At the end **Points: 15** should appear. But the code doesn’t run. Also step through it with Single step: in which line does it stop? - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Points: 15 -braucht: anweisung -tipp: Java runs the code from top to bottom. Does \`bonus\` already exist when it is used in the calculation? -tipp: Create \`bonus\` before the calculation: first \`int bonus = 5;\`, then \`points = points + bonus;\` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Do the desk check in your head and tap the wrong line before time runs out. The programs are in Java, but every line is a box like in the structure chart. Six rounds, 30 seconds each. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int temp = a; - a = b; - b = a; -frage: Should swap the values of a and b. -fehler: 5 -besser: b = temp; -> a already holds the value of b. The old value of a is in temp. - -runde: - int a = 4; - int b = 6; - double mean = a + b / 2; - System.out.println(mean); -frage: Should output the mean 5.0. -fehler: 3 -besser: double mean = (a + b) / 2.0; -> Without brackets the division comes first: 4 + 6 / 2 = 7. - -runde: - int tickets = 3; - double price = 8.5; - double total = tickets + price; - System.out.println("Total: " + total); -frage: Should output the price for 3 cinema tickets at €8.50 each. -fehler: 3 -besser: double total = tickets * price; -> For the total price you multiply, you don't add. - -runde: - int minutes = 135; - int hours = minutes / 60; - int rest = minutes / 60; - System.out.println(hours + " h " + rest + " min"); -frage: Should output 2 h 15 min. -fehler: 3 -besser: int rest = minutes % 60; -> \`%\` gives the remainder of a division. With \`/\` rest would hold a 2 as well. - -runde: - String name = "Ada"; - System.out.println("Hello " + "name" + "!"); -frage: Should output "Hello Ada!". -fehler: 2 -besser: System.out.println("Hello " + name + "!"); -> In quotation marks, name is just a text. The variable has no quotation marks. - -runde: - double price = 100; - price = price * 0.1; - System.out.println(price); -frage: Should raise the price by 10 %, so output 110.0. -fehler: 2 -besser: price = price + price * 0.1; -> Times 0.1 only gives the 10 %, so 10.0. That has to be added to the old price. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can start the simulation, pause it, run single steps and stop it. → Start the simulation -- I can read the variables, the output and the last step during the simulation. → What the simulation shows -- I can do a desk check by hand as a table. → The desk check -- I can tell syntax errors, runtime errors and logic errors apart. → Three kinds of errors -- I can find a mistake by comparing the values with what I expect. → Find mistakes -- I can follow Java code with Step and breakpoints. → Now in Java -::: - -## Quiz - -::: quiz -? Which button runs exactly one step? -→ Start the simulation -- [ ] Play -- [x] Step -- [ ] Stop -> Play keeps going automatically, Step runs only one step. - -? What do you write down after every step in a desk check? -→ The desk check -- [ ] Only the output at the end -- [x] The current values of all variables -- [ ] The generated Java code -> That way you see exactly where a value is different from what you expected. - -? First \`int a = 3\`, then \`int b = 5\`, then \`a = b\`. What values do a and b have afterwards? -→ The desk check -- [ ] a = 5 and b = 3 -- [x] a = 5 and b = 5 -- [ ] a = 3 and b = 5 -> The old value of a has been overwritten. That is why you need a temporary variable when swapping. - -? The Last Step field shows \`price = 4 * 2.5 -> 10.0\`. What does that mean? -→ What the simulation shows -- [ ] The variable price now has the value 4. -- [x] 4 * 2.5 was worked out and the result 10.0 was stored in price. -- [ ] The simulation has found a mistake. - -? The simulation reports **Unknown variable: sum**. What is a likely reason? -→ Find mistakes -- [x] sum is used before it has been given a value. -- [ ] sum is too big. -- [ ] The structure chart has too many boxes. - -? What does a red dot in front of a line number in the Code area do? -→ Now in Java -- [ ] It marks an error. -- [x] The program pauses before this line. -- [ ] The line is skipped. -> That is a breakpoint. ▶︎ or Step carries on. -? Match each error to its kind. -→ Three kinds of errors -= The semicolon at the end of the line is missing. -> Syntax error -= The program divides by 0 and stops. -> Runtime error -= The average is too big because brackets are missing. -> Logic error - -? The program runs to the end without any message but prints 12 instead of 21. What kind of error is that? -→ Three kinds of errors -- [ ] Syntax error -- [ ] Runtime error -- [x] Logic error -> There is no message, but the result is still wrong. You only find an error like this with your expectation and a desk check. -::: -`,Ww=`--- -titel: Branch -bereich: Basics -kurz: Use a condition to decide which of two paths runs. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that exactly one path of a branch runs -- use the comparison operators == != < <= > >= -- tell == and = apart -- build a branch with an empty path -- write a branch with if and else in Java -::: - -## If, then, else - -So far every box always ran. But often a program should **decide**: if a condition is met, do one thing, otherwise do the other. - -::: diagramm l07-alter-pruefen.visustruct -Depending on the age typed in, one message or the other appears. Try 17 and 18 in the simulation. -::: - -That is what the **branch** is for. The condition sits in the triangle at the top. Below it, the structure chart splits into two paths: - -- **true** (left): runs if the condition is true -- **false** (right): runs if the condition is false - -Always **exactly one** of the two paths runs. After that, the program continues below the branch. - -## Insert a branch - -Drag the **Branch** from the Elements area into the structure chart. Click the triangle and type the condition in the Object Inspector, e.g. \`age >= 18\`. The word \`if\` is already in front. - -Each path starts with a placeholder ø. Drag statements into it. A path may also hold several boxes on top of each other. - -## Comparison operators - -A condition is usually a **comparison**. Its result is always \`true\` or \`false\`. - -- \`==\` equal, e.g. \`number == 0\` -- \`!=\` not equal, e.g. \`answer != 42\` -- \`<\` less than, \`<=\` less than or equal -- \`>\` greater than, \`>=\` greater than or equal - -> Do not mix up \`==\` and \`=\`. A single \`=\` is an assignment and stores a value. To compare, you need two equals signs. - -With \`%\` you check whether a number can be divided by another: \`number % 2 == 0\` is true if \`number\` is even. - -## Exercise: Even or odd - -::: übung l07-gerade -titel: Even or odd -auftrag: Ask for a whole number. Output **even** if it is even, otherwise **odd**. -test: 4 -> even -test: 7 -> odd -test: 0 -> even -braucht: verzweigung -tipp: There are two possibilities here, so you need a branch. How do you recognise an even number? -tipp: A number is even if there is no remainder when you divide it by 2. The condition is \`number % 2 == 0\`. -lösung: l07-gerade-loesung.visustruct -::: - -## Exercise: The larger number - -::: übung l07-maximum -titel: The larger number -auftrag: Ask for two whole numbers and output only the larger one. If both are the same, output that number. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: A branch compares the two numbers. Each path holds exactly one output. -tipp: Compare with \`a > b\`. In the true path you output \`a\`, in the false path \`b\`. -lösung: l07-maximum-loesung.visustruct -::: - -## An empty path - -Sometimes something should only happen if the condition is true, and otherwise nothing at all. Then the false path stays **empty**. In the structure chart it shows the placeholder **ø**. - -::: diagramm l07-rabatt.visustruct -From 50 euros on, you get 5 euros off. Otherwise nothing happens; the false path is empty. The output below runs in both cases. -::: - -::: angeberwissen -A single forgotten branch caused a stir across half the internet in 2014: the security hole **Heartbleed** in OpenSSL, a program that many websites use for encryption. A computer could tell the server: “Send me back the word *hat*, it has 500 letters.” The server did not check whether 500 matched the real length of 3 and simply sent back 500 characters from its memory. Sometimes they contained other people's passwords. All that was missing was one if: if the stated length is greater than the real one, then send nothing back. By the way, this had nothing to do with brackets. Baah, check your inputs before you believe them. -::: - -## Exercise: Absolute value - -::: übung l07-betrag -titel: Absolute value of a number -auftrag: Ask for a whole number. If it is negative, make it positive. Then output the number. So -5 becomes 5, and 7 stays 7. -Use a branch with an empty path and only **one** output below the branch. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Only negative numbers need to be changed. What happens to a number if you multiply it by -1? -tipp: The condition is \`number < 0\`. In the true path you flip the sign, e.g. with \`number = 0 - number\`. The false path stays empty. -lösung: l07-betrag-loesung.visustruct -::: - -## Now in Java - -This is the age check from the start of this lesson in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("How old are you?"); -int age = scanner.nextInt(); -if (age >= 18) { - System.out.println("You are an adult."); -} else { - System.out.println("You are not an adult yet."); -} -\`\`\` - -- The condition comes after \`if\` in **round brackets** \`( )\`. -- The true branch is in **curly brackets** \`{ }\`, the false branch follows after \`else\` in its own curly brackets. There is no semicolon after a curly bracket. -- If the false branch is empty, simply leave out \`else { }\`. -- Your program needs the first two lines once as soon as it reads input. After that, \`scanner.nextInt()\` reads a whole number. The question before it is a normal output. - -::: angeberwissen -Java has a mascot too: **Duke**, a little black-and-white fellow with a big red nose. He was drawn by the Java team in 1992 and has been waving from conferences and T-shirts ever since. Ludwig thinks a billy goat would have been a better fit. -::: - -::: übung l08-java-bestanden -titel: Passed in Java -code: java -auftrag: Write a Java program that asks for the number of points. From 50 points on it outputs **passed**, otherwise **not passed**. - Type the code in the Code area and then click Check. -test: 50 -> passed -test: 49 -> not passed -test: 100 -> passed -test: 0 -> not passed -braucht: verzweigung -tipp: Start with the two lines for the scanner. Then ask for the points, read them and compare them with \`if\`. -tipp: The condition is \`points >= 50\`. One branch has \`System.out.println("passed");\`, and after \`else\` comes \`System.out.println("not passed");\`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Fill in the gaps: even or odd - -::: lückentext -titel: Even or odd -auftrag: Fill in the missing words and symbols. The program should output whether a number is even. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which number?"); -int number = scanner.nextInt(); -[[if]] (number [[%]] 2 [[==]] 0) [[{]] - System.out.println("even"); -[[}]] [[else]] { - System.out.println("odd"); -} -\`\`\` -erklärung: \`number % 2\` is the remainder when dividing by 2. If it is 0, the number is even. To compare you need \`==\`, a single \`=\` is an assignment. Both branches are in curly brackets. -::: - -::: angeberwissen -If a branch holds only a single statement, Java even lets you leave out the curly brackets. We never do that, and here is why: - -\`\`\`java -if (age >= 18) - System.out.println("You are an adult."); - System.out.println("You may watch the film."); -\`\`\` - -Without brackets only the first line belongs to the if. The second one always runs, even for twelve-year-olds. The indentation is misleading, because Java ignores spaces. - -Exactly this kind of mistake was hidden in iPhones and Macs in 2014, known as **“goto fail”**. In the language C, the line \`goto fail;\` accidentally appeared twice under an if without brackets. The second one always ran and skipped the check of the security certificates. On an open Wi-Fi network, an attacker could have pretended to be your bank, for example. Baah, brackets cost two characters, a security hole costs much more. -::: - -## Find the bug: admission - -::: übung l08-java-fehler -titel: Fix the admission -code: java -auftrag: At the zoo, children **under** 6 get in for free, everyone else pays 4 euros. But the program also lets six-year-olds in for free. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l08-java-fehler-start.visustruct -test: 5 -> Free entry -test: 6 -> 4 euros -test: 10 -> 4 euros -test: 0 -> Free entry -braucht: verzweigung -tipp: Try the program with 6. Which comparison operator still lets 6 through? -tipp: “Under 6” means \`age < 6\`. \`<=\` means “less than or equal to”. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l08-java-laeuft-nicht -titel: Rated 16 -code: java -auftrag: The film is rated 16. Ludwig is 15, so the program should output **No entry**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> No entry -braucht: verzweigung -tipp: Look closely at the condition in the brackets after \`if\`. Does this variable exist? -tipp: The variable is called \`age\` with a small a: \`if (age >= 16) {\` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which way? - -::: spiel frage -titel: Game: Which way? -intro: Ludwig has written branches in Java. Work out the condition in your head and predict what is output. Seven rounds. - -runde: - int x = 5; - if (x > 5) { - System.out.println("big"); - } else { - System.out.println("small"); - } -frage: What is output? -- big -- [x] small -- nothing -> 5 > 5 is false, because 5 is not greater than 5. So the false branch. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("big"); - } else { - System.out.println("small"); - } -frage: What is output? -- [x] big -- small -- big and small -> \`>=\` means "greater than or equal". 5 >= 5 is true. - -runde: - int number = 7; - if (number % 2 == 0) { - System.out.println("even"); - } else { - System.out.println("odd"); - } -frage: What is output? -- even -- [x] odd -- 1 -> 7 % 2 is the remainder 1, so not 0. The number is odd. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: What is output? -- -4 -- [x] 4 -- nothing -> -4 < 0 is true, so the sign is turned around. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: What is output? -- -4 -- [x] 4 -- nothing -> 4 < 0 is false. The false branch is empty, the program simply carries on below. - -runde: - int grade = 3; - if (grade != 3) { - System.out.println("different"); - } else { - System.out.println("three"); - } -frage: What is output? -- different -- [x] three -- nothing -> \`!=\` means "not equal". 3 != 3 is false. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: What is output? -- 8 -- [x] 12 -- 20 -> The program outputs the bigger of the two numbers. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that exactly one path of a branch runs. → If, then, else -- I can use the comparison operators == != < <= > >=. → Comparison operators -- I can tell == and = apart. → Comparison operators -- I can build a branch with an empty path. → An empty path -- I can write a branch with if and else in Java. → Now in Java -::: - -## Quiz - -::: quiz -? Which path runs if the condition is false? -→ If, then, else -- [ ] The true path -- [x] The false path -- [ ] Both paths -- [ ] Neither, the program ends -> With false, the right path runs. After that, the program continues below the branch. - -? Which condition checks whether age is exactly 18? -→ Comparison operators -- [ ] age = 18 -- [x] age == 18 -- [ ] age >= 18 -> A single = is an assignment. To compare, you need ==. - -? What does ø in a path mean? -→ An empty path -- [x] Nothing happens in this case. -- [ ] The program ends here. -- [ ] The condition is false. - -? The condition is \`points >= 50\`. For which value is it true? -→ Comparison operators -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= means greater than or equal. So 50 is included. - -? In textbooks the branch often has another name. Which one? -→ If, then, else -- [ ] Multiple selection -- [x] Conditional statement -- [ ] Iteration -> The statements in a path only run under a condition. That is why it is also called a conditional statement. - -? Where does the condition of a branch go in Java? -→ Now in Java -- [x] In round brackets right after if -- [ ] In curly brackets after else -- [ ] After a semicolon -> \`if (age >= 18) { … }\`: the round brackets belong to the condition, the curly ones to the branch. -::: -`,Ew=`--- -titel: Combining conditions -bereich: Basics -kurz: Join several conditions with and, or and not, and check ranges of values. ---- - -## Skills I will gain now - -::: kompetenzen -- explain when a combination with && is true -- explain when a combination with || is true -- turn a condition round with ! -- check whether a value is in a range such as 1 to 6 -- read the truth table for &&, || and ! -- store the result of a condition in a boolean variable -- evaluate combined conditions confidently -- combine conditions in Java with && and || -::: - -## And: && - -Sometimes a single comparison is not enough. For example, you only get a youth ticket if you are **at least 12 and younger than 18**. - -With \`&&\` (and) you join two conditions. The result is only \`true\` if **both** conditions are true. - -::: diagramm l08-jugendticket.visustruct -Both comparisons must be right. Try 11, 12, 17 and 18 in the simulation. -::: - -## Or: || - -With \`||\` (or) the result is \`true\` if **at least one** of the conditions is true. Both may be true as well. - -\`\`\` -day == 6 || day == 7 -\`\`\` - -This condition is true if \`day\` has the value 6 or the value 7, so on Saturday or Sunday. - -> On many keyboards you type the vertical bar \`|\` with Shift and the backslash key. On a German keyboard it is AltGr and \`<\`, on a Mac Option and 7. - -## Exercise: Weekend - -::: übung l08-wochenende -titel: Weekend -auftrag: Ask for a day of the week as a number (1 is Monday, 7 is Sunday). Output **Weekend** if it is Saturday or Sunday, otherwise **Weekday**. -test: 6 -> Weekend -test: 7 -> Weekend -test: 1 -> Weekday -test: 5 -> Weekday -braucht: verzweigung -tipp: It is the weekend if the day is 6 **or** 7. For that you need two comparisons in one condition. -tipp: Saturday is 6, Sunday is 7. Join the two comparisons with \`||\`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Check ranges of values - -In German schools, grades go from 1 (best) to 6. You check whether a grade is **in the range** with two comparisons and \`&&\`: - -\`\`\` -grade >= 1 && grade <= 6 -\`\`\` - -::: grafik l08-zahlenstrahl.svg -The green range from 1 to 6 is valid; both ends are included. -::: - -The other way round, a grade is **outside** the range if it is too small **or** too big: - -::: diagramm l08-note.visustruct -There is no grade smaller than 1 or bigger than 6. -::: - -> The way you write it in maths, \`1 <= grade <= 6\`, does not work. You have to split it into two comparisons and join them with \`&&\`. - -## Exercise: Valid grade - -::: übung l08-note-gueltig -titel: Valid grade -auftrag: Ask for a grade as a whole number. Output **valid** if it is between 1 and 6 (1 and 6 are included), otherwise **invalid**. -test: 1 -> valid -test: 6 -> valid -test: 3 -> valid -test: 0 -> invalid -test: 7 -> invalid -braucht: verzweigung -tipp: A valid grade has to meet two things at once: not too small **and** not too big. -tipp: The grade must be greater than or equal to 1 and at the same time less than or equal to 6. -lösung: l08-gueltig-loesung.visustruct -::: - -## Not and brackets - -With \`!\` (not) you turn a condition round: \`true\` becomes \`false\` and the other way round. - -\`\`\` -!(grade >= 1 && grade <= 6) -\`\`\` - -This is true if the grade is **not** in the range, and it means the same as \`grade < 1 || grade > 6\`. - -If \`&&\` and \`||\` appear together, \`&&\` is worked out first, just like multiplication before addition. It is better to use **brackets**; then it is clear what belongs together: - -\`\`\` -(age >= 12 && age < 18) || student == 1 -\`\`\` - -## The truth table - -A **truth table** shows at a glance what \`&&\`, \`||\` and \`!\` produce. On the left are all four possibilities for two conditions \`a\` and \`b\`, on the right the result: - -::: grafik l09-wahrheitstabelle.svg -Green is true, red is false. With && there is only one green row, with || only one red one. -::: - -Rules of thumb: - -- \`a && b\` is only true if **both** are true. -- \`a || b\` is only false if **both** are false. -- \`!a\` flips the value. - -::: angeberwissen -The data type \`boolean\` is named after **George Boole**. As early as 1847 this Englishman showed that you can calculate with true and false just like with numbers, almost a hundred years before the first computer existed. Today his logic is in every chip. -::: - -## Truth values in variables - -The result of a condition is a **truth value** of type \`boolean\`. You can store it in a variable just like a number and use it later: - -\`\`\` -boolean weekend = day == 6 || day == 7 -\`\`\` - -The branch then only says \`weekend\`. That reads almost like a sentence: "If weekend, then …". Don't write \`weekend == true\`, because \`weekend\` already is true or false. - -With \`!weekend\` you ask for the opposite, a weekday. - -::: ludwig -Long conditions become clearer when you put parts of them into boolean variables with meaningful names, for example \`boolean teenager = age >= 12 && age < 18\`. -::: - -## Game: True or false? - -Now it's your turn. Work out each condition in your head. After every answer you see how VisuStruct evaluates it step by step. - -::: spiel -age: 8..20 -day: 1..7 -grade: 0..7 -student: boolean -weekend: boolean -? age >= 18 -? day == 6 -? grade != 3 -? age >= 12 && age < 18 -? day == 6 || day == 7 -? student && weekend -? !student -? grade >= 1 && grade <= 6 -? !(age < 18) -? student || age >= 18 -? (age >= 12 && age < 18) || student -? !(grade >= 1 && grade <= 6) -? !weekend && day != 3 -? age >= 12 && age < 18 && !student -::: - -## Exercise: Leap year - -::: übung l08-schaltjahr -titel: Leap year -auftrag: A year is a leap year if it can be divided by 4 but not by 100. Years that can be divided by 400 are leap years anyway. -Ask for a year and output **Leap year** or **Not a leap year**. -test: 2024 -> Leap year -test: 2023 -> Not a leap year -test: 1900 -> Not a leap year -test: 2000 -> Leap year -braucht: verzweigung -tipp: Check the rule with examples first: 2024 is a leap year, 1900 is not, 2000 is. “Can be divided” means the remainder is 0. -tipp: Divisible by 4 means \`year % 4 == 0\`, not divisible by 100 means \`year % 100 != 0\`. Join these two with \`&&\`, put brackets around them and add the case for 400 with \`||\`. -tipp: Almost the solution: one single branch with the condition \`(year % 4 == 0 && year % 100 != 0) || year % 400 == 0\`. The true branch has \`output: "Leap year"\`, the false branch \`output: "Not a leap year"\`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Now in Java - -The youth ticket from the start looks like this in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("How old are you?"); -int age = scanner.nextInt(); -if (age >= 12 && age < 18) { - System.out.println("Youth ticket"); -} else { - System.out.println("No youth ticket"); -} -\`\`\` - -The symbols \`&&\`, \`||\` and \`!\` are exactly the ones you already use in the structure chart. They come from Java. As always, the whole condition is in the round brackets after \`if\`. - -::: übung l09-java-schule -titel: School or free time -code: java -auftrag: Write a Java program that asks for the hour (0 to 23). From 8 up to and including 15 it outputs **School**, otherwise **Free time**. -test: 8 -> School -test: 15 -> School -test: 16 -> Free time -test: 7 -> Free time -braucht: verzweigung -tipp: The hour has to meet two conditions at the same time. Which operator means “and”? -tipp: \`if (hour >= 8 && hour <= 15) { … } else { … }\` -lösung: l09-java-schule-loesung.visustruct -::: - -## Fill in the gaps: conditions - -::: lückentext -titel: Grade and weekend -auftrag: Fill in the missing operators and words. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which grade?"); -int grade = scanner.nextInt(); -if (grade >= 1 [[&&]] grade [[<=]] 6) { - System.out.println("valid grade"); -} else { - System.out.println("invalid grade"); -} -System.out.println("Which day (1 to 7)?"); -int day = scanner.nextInt(); -[[boolean]] weekend = day == 6 [[||]] day == 7; -if ([[!]]weekend) { - System.out.println("school day"); -} -\`\`\` -erklärung: A grade is valid when **both** conditions are true, so \`&&\`. It is the weekend when **one** of the two is true, so \`||\`. The result fits into a \`boolean\` variable, and \`!\` turns it around. -::: - -## Find the bug: no school - -::: übung l09-java-fehler -titel: Fix the day off -code: java -auftrag: The program should output **no school** for day 6 (Saturday) and day 7 (Sunday), otherwise **school**. But it always outputs **school**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l09-java-fehler-start.visustruct -test: 6 -> no school -test: 7 -> no school -test: 3 -> school -test: 1 -> school -braucht: verzweigung -tipp: Can \`day\` be 6 **and** 7 at the same time? -tipp: It is enough if one of the two conditions is true: \`day == 6 || day == 7\`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l09-java-laeuft-nicht -titel: Fix the weekend -code: java -auftrag: Day 6 is Saturday, day 7 is Sunday. Today is day 7, so **no school** should appear. But the program doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> no school -braucht: verzweigung -tipp: The condition has two parts. Compare the variable name in both parts. -tipp: In the second part the variable is also called \`day\` with a small d: \`if (day == 6 || day == 7) {\` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain when a combination with && is true. → And: && -- I can explain when a combination with || is true. → Or: || -- I can turn a condition round with !. → Not and brackets -- I can check whether a value is in a range such as 1 to 6. → Check ranges of values -- I can read the truth table for &&, || and !. → The truth table -- I can store the result of a condition in a boolean variable. → Truth values in variables -- I can evaluate combined conditions confidently (at least 8 of 10 right in the game). → Game: True or false? -- I can combine conditions in Java with && and ||. → Now in Java -::: - -## Quiz - -::: quiz -? When is \`a && b\` true? -→ And: && -- [ ] If a or b is true -- [x] Only if a and b are both true -- [ ] If exactly one of them is true -> With && both parts must be right. If one is false, the whole thing is false. - -? The variable day has the value 6. What does \`day == 6 || day == 7\` give? -→ Or: || -- [x] true -- [ ] false -> With || it is enough if one side is true. - -? Which condition checks whether number is between 10 and 20 (both included)? -→ Check ranges of values -- [ ] 10 <= number <= 20 -- [ ] number >= 10 || number <= 20 -- [x] number >= 10 && number <= 20 -> With || every number would be allowed, because every number is greater than 10 or less than 20. - -? What does \`!(5 > 3)\` give? -→ Not and brackets -- [ ] true -- [x] false -> 5 > 3 is true, and ! turns that round. - -? How do you write “age is at least 12 and less than 18” in Java? -→ Now in Java -- [ ] if (12 <= age < 18) -- [x] if (age >= 12 && age < 18) -- [ ] if (age >= 12 || age < 18) -> Each comparison stands on its own, joined with \`&&\`. -::: -`,Nw=`--- -titel: Switch -bereich: Basics -kurz: Run one of many cases, depending on the value of a variable. ---- - -## Skills I will gain now - -::: kompetenzen -- insert a switch, add cases and change case names -- explain when the case default runs -- decide whether a switch or a branch fits better -- write a case selection in Java with switch -::: - -## Many possibilities, one variable - -A drinks machine has three buttons: 1 for water, 2 for juice, 3 for cocoa. With branches you need three boxes nested inside each other. That quickly gets wide and confusing. - -::: diagramm l09-verschachtelt.visustruct -The machine with three nested branches. Each branch checks the same variable choice again. -::: - -Whenever you compare **one variable** with **several fixed values**, there is an easier way: the **switch**. - -## How a switch is built - -At the top of the box is the variable that decides. Below it there is a column of its own for every case. Above each column is the value it belongs to. - -::: diagramm l09-automat.visustruct -The same machine as a switch. If choice has the value 2, only column 2 runs. -::: - -- The simulation looks for the case whose name matches the value exactly. -- If no case matches, **default** runs. This case is always on the far right. -- After that, the program continues below the switch. Only **one** case ever runs. - -> A new switch has the cases 1, 2 and default. Click a case to change its **Case name** in the Object Inspector. With **Add Case** you get a new column in front of default. - -## Cases with text - -The cases do not have to be numbers. You can also choose by the content of a \`String\` variable. Then you write the text in quotation marks as the case name, for example \`"red"\`. Just like in code, this shows that it is a text. - -::: diagramm l09-ampel.visustruct -A traffic light: depending on the colour typed in, a different message appears. In the simulation, also try a colour that does not exist. -::: - -Upper and lower case matter: \`Red\` does not match the case \`"red"\`. - -## Exercise: Grade in words - -::: übung l09-note -titel: Grade in words -auftrag: Ask for a grade as a whole number and output it in words: 1 very good, 2 good, 3 satisfactory, 4 sufficient, 5 poor, 6 fail. - For any other number, **Not a valid grade** should appear. -test: 1 -> very good -test: 4 -> sufficient -test: 6 -> fail -test: 9 -> Not a valid grade -braucht: fallauswahl -tipp: For many fixed values, a switch is clearer than lots of branches. Every grade gets a case of its own. -tipp: Keep using “Add Case” until you have the cases 1 to 6 and default. At the top of the switch you write \`grade\`. -lösung: l09-note-loesung.visustruct -::: - -## Exercise: Calculator - -::: übung l09-rechner -titel: Calculator -auftrag: Ask, one after another, for a whole number \`a\`, an operator as a \`String\` and a second whole number \`b\`. - For \`+\`, \`-\` and \`*\` you output the result. For any other sign, **Unknown operator** appears. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Unknown operator -braucht: fallauswahl -tipp: First read in all three values. After that, a switch on the operator decides what is calculated. -tipp: Before the switch, create \`int result = 0\`. In each case you calculate, for example, \`result = a + b\` and then output \`result\`. The case names are \`"+"\`, \`"-"\` and \`"*"\` in quotation marks, because the operator is a \`String\`. -tipp: The outline from top to bottom: three inputs (\`int a\`, \`String operator\`, \`int b\`), then \`int result = 0\`, then a switch over \`operator\`. Case \`"+"\` holds \`result = a + b\` and \`output: result\`, cases \`"-"\` and \`"*"\` the same. The default case holds \`output: "Unknown operator"\`. -lösung: l09-rechner-loesung.visustruct -::: - -## Switch or branch? - -The switch only checks whether a value is **exactly equal** to a case name. So: - -- **Switch:** one variable, several fixed values. Examples: choosing from a menu, day of the week as a number, grades. -- **Branch:** ranges and combined conditions. Examples: \`age >= 18\`, \`temperature < 0 || temperature > 30\`. - -So for “age 18 or older” you still need the branch. You cannot create a case of its own for every possible age. - -## Now in Java - -The drinks machine looks like this in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 water, 2 juice, 3 cocoa"); -int choice = scanner.nextInt(); -switch (choice) { - case 1 -> { - System.out.println("Here is your water."); - } - case 2 -> { - System.out.println("Here is your juice."); - } - case 3 -> { - System.out.println("Here is your cocoa."); - } - default -> { - System.out.println("This button does not exist."); - } -} -\`\`\` - -- After \`switch\`, the variable being compared is in round brackets. -- Every case starts with \`case\`, the value and an arrow \`->\`. After it, curly brackets hold what should happen. -- \`default\` is the otherwise case. It runs when no value matches. - -::: angeberwissen -The arrow \`case 1 ->\` has only existed in Java since 2020 (Java 14). Before that you wrote \`case 1:\` and had to end every case with \`break;\`. If you forgot it, the program simply ran on into the next case. So the arrow has saved a lot of programmers a lot of trouble. -::: - -::: übung l10-java-wuerfel -titel: Dice in words -code: java -auftrag: Write a Java program with \`switch\` that reads a number. For 1 it outputs **one**, for 2 **two**, for 3 **three** and otherwise **unknown**. -test: 1 -> one -test: 2 -> two -test: 3 -> three -test: 7 -> unknown -braucht: fallauswahl -tipp: You need three \`case\` branches and one \`default\` branch. -tipp: \`switch (number) { case 1 -> { System.out.println("one"); } … default -> { System.out.println("unknown"); } }\` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Fill in the gaps: switch - -::: lückentext -titel: Months in words -auftrag: Fill in the missing words and symbols of the case selection. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which month (1 to 3)?"); -int month = scanner.nextInt(); -[[switch]] (month) { - [[case]] 1 -> { - System.out.println("January"); - } - case 2 [[->]] { - System.out.println("February"); - } - [[case]] 3 -> { - System.out.println("March"); - } - [[default]] -> { - System.out.println("Unknown"); - } -} -\`\`\` -erklärung: After \`switch\` the variable is in round brackets. Each case starts with \`case\`, the value and the arrow \`->\`. \`default\` runs when no case matches. -::: - -## Find the bug: calculator - -::: übung l10-java-fehler -titel: Fix the calculator -code: java -auftrag: The calculator reads two numbers and a choice: 1 plus, 2 minus, 3 times. For 7, 3 and choice 2 the result should be **4**, but it calculates **-4**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Not an option -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Plus and times are right. Take a close look at \`case 2\`. -tipp: With minus the order matters: \`a - b\` instead of \`b - a\`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l10-java-laeuft-nicht -titel: Fix the grade -code: java -auftrag: Ludwig got grade 2. The program should output **good**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> good -braucht: fallauswahl -tipp: Which variable does the case selection check? Is it written the same way above? -tipp: The brackets after \`switch\` need \`grade\` with a small g: \`switch (grade) {\` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which case? - -::: spiel frage -titel: Game: Which case? -intro: Ludwig presses buttons on the drinks machine and other case selections. What happens? Six rounds. - -runde: - int choice = 2; - switch (choice) { - case 1 -> { System.out.println("water"); } - case 2 -> { System.out.println("juice"); } - case 3 -> { System.out.println("cocoa"); } - default -> { System.out.println("There is no such button."); } - } -frage: What is output? -- water -- [x] juice -- There is no such button. -> choice is 2, so exactly \`case 2\` runs. - -runde: - int choice = 4; - switch (choice) { - case 1 -> { System.out.println("water"); } - case 2 -> { System.out.println("juice"); } - case 3 -> { System.out.println("cocoa"); } - default -> { System.out.println("There is no such button."); } - } -frage: What is output? -- cocoa -- nothing -- [x] There is no such button. -> No case fits 4, so \`default\` runs. - -runde: - String day = "monday"; - switch (day) { - case "Monday" -> { System.out.println("maths"); } - case "Tuesday" -> { System.out.println("sports"); } - default -> { System.out.println("free"); } - } -frage: What is output? -- maths -- sports -- [x] free -> With texts every letter counts: "monday" with a small m is not "Monday". - -runde: - int grade = 0; - switch (grade) { - case 1 -> { System.out.println("very good"); } - case 2 -> { System.out.println("good"); } - case 3 -> { System.out.println("satisfactory"); } - } -frage: What is output? -- very good -- [x] nothing -- satisfactory -> No case fits, and there is no \`default\`. Then simply nothing happens. - -runde: -frage: You want to check whether \`age >= 18\`. What fits better? -- [x] a branch -- a case selection -> A case selection only compares with fixed values. For "greater than or equal" you need a branch. - -runde: -frage: A dice shows 1 to 6, and for every number a different word should appear. What fits better? -- a branch -- [x] a case selection -> One variable, six fixed values: that's exactly what the case selection is for. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can insert a switch, add cases and change case names. → How a switch is built -- I can explain when the case default runs. → How a switch is built -- I can decide whether a switch or a branch fits better. → Switch or branch? -- I can write a case selection in Java with switch. → Now in Java -::: - -## Quiz - -::: quiz -? The variable day has the value 5. There are the cases 1, 2, 3 and default. What runs? -→ How a switch is built -- [ ] Nothing at all -- [ ] The case 3 -- [x] The case default -> No case name matches 5, so default applies. - -? How many cases run each time the switch runs? -→ How a switch is built -- [x] Exactly one -- [ ] All cases from the matching one on -- [ ] All cases -> After the matching case, the program continues straight below the switch. - -? What is a switch NOT suitable for? -→ Switch or branch? -- [ ] Choosing menu item 1, 2 or 3 -- [x] Checking whether a temperature is above 30 degrees -- [ ] Handling a colour such as red, yellow or green -> “Above 30” is a range. For that you need a branch with a comparison. - -? At the traffic light you type \`Red\`, and the case is called \`"red"\`. What happens? -→ How a switch is built -- [ ] The case \`"red"\` runs. -- [x] The case default runs. -- [ ] The simulation reports an error. -> Upper and lower case matter. Red and red are different texts. - -? Under which name do you also find the switch in textbooks? -→ How a switch is built -- [ ] Conditional statement -- [ ] Sequence -- [x] Multiple selection -> One of many cases is selected. That is why it is also called multiple selection. - -? What is the otherwise case of a switch called in Java? -→ Now in Java -- [ ] else -- [x] default -- [ ] case 0 -::: -`,Fw=`--- -titel: While loop -bereich: Basics -kurz: Repeat steps as long as a condition is true. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the while loop checks its condition before every pass -- use a counter variable with a start value, a condition and a change -- notice when a loop never ends and fix the mistake -- follow a loop pass by pass in a desk check -- write a while loop in Java -::: - -## Repeat as long as something holds - -Often a program should do something several times. Instead of writing the same box five times, you use a **loop**. - -The **while loop** repeats its inside **as long as** its condition is true. The condition is at the top, in the head of the box. The inside is indented below it, framed by a bracket on the left. - -::: diagramm l10-countdown.visustruct -A countdown: as long as number is greater than 0, number is output and gets smaller by 1. After that, Start! appears. -::: - -## The condition comes first - -The while loop is a **pre-test loop**. Before **every** pass, the condition is checked: - -1. Check the condition. -2. If it is true, run the inside once and start again at 1. -3. If it is false, the program continues below the loop. - -::: grafik l10-kopfgesteuert.svg -After every pass it goes back to the condition. Only when it is false does the program continue below the loop. -::: - -In the countdown the condition is checked four times: with 3, 2 and 1 it is true, with 0 it is false. - -> If the condition is already false the first time it is checked, the inside runs **not even once**. Start the countdown with \`int number = 0\` and only Start! appears. - -## A counter variable - -Many loops count along. For that you need three things: - -- **A start value before the loop**, e.g. \`int i = 1\` -- **A condition in the head**, e.g. \`i <= 5\` -- **A change inside**, e.g. \`i = i + 1\` (short: \`i++\`) - -If one of these parts is missing, the loop counts wrongly or not at all. - -::: angeberwissen -Counting loops are ancient! In their 1973 article, Nassi and Shneiderman showed their idea using the **factorial**, among other things: 5! = 1 · 2 · 3 · 4 · 5 = 120. Here is my goat version of it. Try it with **Step** in the simulation and watch \`factorial\` grow. Baaah, that goes fast! -::: - -::: diagramm l10-fakultaet.visustruct -The factorial with a counter variable \`i\`, rebuilt from an example in the 1973 article. -::: - -## Exercise: Count to n - -::: übung l10-bis-n -titel: Count to n -auftrag: Ask for a whole number \`n\` and output all numbers from 1 to \`n\`, each on its own line. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: You need a counter variable that starts at 1 and grows by 1 in every pass. -tipp: Before the loop, create \`int i = 1\`. The condition is \`i <= n\`. Inside, you output \`i\` and then increase \`i\` by 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Watch out: endless loop - -If nothing inside the loop changes the condition, it stays true forever. The loop never stops. This is called an **endless loop**. - -::: diagramm l10-endlos.visustruct -Here number = number - 1 is missing. The loop outputs 3 again and again and never reaches Start! -::: - -Ask yourself for every loop: **What inside makes sure that the condition becomes false at some point?** When an exercise is checked, VisuStruct stops after a very large number of steps and reports a possible endless loop. - -## Exercise: Double up to 100 - -::: übung l10-verdoppeln -titel: Double up to 100 -auftrag: Ask for a whole number. Keep doubling it until it is at least 100. - At the end, output **how often** you doubled it. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: The loop runs as long as the number is still too small. Count along how often it has run. -tipp: You need a second variable \`int steps = 0\`. The condition is \`number < 100\`. Inside, you double the number with \`number = number * 2\` and increase \`steps\` by 1. If the number is already 100, the loop does not run at all. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Loops in a desk check - -With a loop, the **desk check** is especially valuable. You see exactly how often the loop runs and with which value it stops. Every check of the condition gets a row of its own. - -::: diagramm l16-schreibtisch.visustruct -A while loop adds up the numbers 1, 2 and 3. -::: - -| Step | sum | i | Output | -|---|---|---|---| -| \`int sum = 0\` | 0 | – | | -| \`int i = 1\` | 0 | 1 | | -| \`i <= 3\` → true | 0 | 1 | | -| \`sum = sum + i\` | 1 | 1 | | -| \`i = i + 1\` | 1 | 2 | | -| \`i <= 3\` → true | 1 | 2 | | -| \`sum = sum + i\` | 3 | 2 | | -| \`i = i + 1\` | 3 | 3 | | -| \`i <= 3\` → true | 3 | 3 | | -| \`sum = sum + i\` | 6 | 3 | | -| \`i = i + 1\` | 6 | 4 | | -| \`i <= 3\` → false | 6 | 4 | | -| \`output: sum\` | 6 | 4 | 6 | - -Common mistakes in loops are: - -- The loop runs **once too often or once too few**, e.g. \`<\` instead of \`<=\`. -- A variable is **not changed** in the loop, or changed in the wrong direction. Then the loop never ends. -- A variable gets its start value **inside** the loop instead of before it and is reset in every pass. - -## Exercise: Fix the countdown - -::: übung l16-countdown -titel: Fix the countdown -auftrag: The countdown should count down from the start value and output **Go!** at the end. So with 3: 3, 2, 1, Go! - The start diagram has two mistakes. Find and fix both. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Go! -test: 1 -> 1 | Go! -test: 0 -> Go! -tipp: There are two mistakes. One is about counting, the other about the output at the end. -tipp: Start the simulation with start value 3 and watch i under Variables. Does i get smaller? Also compare the last output carefully with the task. -lösung: l16-countdown-loesung.visustruct -::: - -## Now in Java - -The countdown from the start of this lesson looks like this in Java: - -\`\`\`java editor -int number = 3; -while (number > 0) { - System.out.println(number); - number = number - 1; -} -System.out.println("Start!"); -\`\`\` - -- After \`while\` the condition is in round brackets, as with \`if\`. -- Everything that is repeated is in curly brackets. That is the body of the loop. -- The body is indented. As in the structure chart, you can see what belongs to the loop. - -::: übung l11-java-gerade -titel: Even numbers in Java -code: java -auftrag: Write a Java program that reads a whole number \`n\` and uses a while loop to output all even numbers from 2 up to at most \`n\`. For 7 that is 2, 4 and 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: You need a counter variable that starts at 2. The loop runs as long as it is not greater than \`n\`. -tipp: \`int number = 2;\` before the loop, then \`while (number <= n) { … }\`. In the body you output \`number\` and increase it with \`number = number + 2;\`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Fill in the gaps: while - -::: lückentext -titel: Sum from 1 to 10 -auftrag: The program should add up the numbers from 1 to 10. Fill in the missing words and symbols. -\`\`\`java -int sum = 0; -int number = 1; -[[while]] (number [[<=]] 10) [[{]] - sum = sum + [[number]]; - [[number]] = number + 1; -} -System.out.println("Sum: " + sum); -\`\`\` -erklärung: The loop runs as long as \`number\` is at most 10. In each pass \`number\` is added to the sum, then \`number\` goes up by 1. Without that line it would be an endless loop. Output: **Sum: 55** -::: - -## Find the bug: saving - -::: übung l11-java-fehler -titel: Fix the savings plan -code: java -auftrag: Ludwig saves 5 euros every week. The program asks for the savings goal and should output after how many weeks he has reached it. For 50 euros that is 10 weeks, but the program says **Weeks: 11**. - Go through the code with Step and watch \`money\` and \`weeks\`. Fix the bug and click Check. -start: l11-java-fehler-start.visustruct -test: 50 -> Weeks: 10 -test: 12 -> Weeks: 3 -test: 5 -> Weeks: 1 -test: 1 -> Weeks: 1 -braucht: whileSchleife -tipp: How much money does Ludwig have when the loop runs for the last time? Does he really need to save for another week? -tipp: He only saves as long as the goal has **not been reached** yet: \`while (money < goal)\`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l11-java-laeuft-nicht -titel: Fix the countdown -code: java -auftrag: The countdown should output **3**, **2**, **1** and then **Go!** But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Go! -braucht: whileSchleife -tipp: The bug is inside the loop. Which variable should be output, and what is it really called? -tipp: Output \`number\` with a small n: \`System.out.println(number);\` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Game: How often? - -::: spiel frage -titel: Game: How often? -intro: Ludwig has written while loops. Do the desk check in your head. Six rounds. - -runde: - int number = 3; - while (number > 0) { - System.out.println(number); - number = number - 1; - } - System.out.println("Go!"); -frage: What is output? -- [x] 3\\n2\\n1\\nGo! -- 3\\n2\\n1\\n0\\nGo! -- Go! -> When number is 0, \`number > 0\` is false, so the 0 is not output any more. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: What is output? -- [x] nothing -- 10 -- 10 to 4 -> The condition is checked first. 10 < 5 is false, the body doesn't run even once. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: What happens? -- 1, 2 and 3 are output. -- [x] The loop never stops. -- Nothing is output. -> i never gets bigger in the body. The condition always stays true: an endless loop. - -runde: - int number = 1; - while (number < 100) { - number = number * 2; - } - System.out.println(number); -frage: What is output? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Only at 128 is \`number < 100\` false. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: What is output? -- 4 -- 5 -- [x] 6 -> i runs 0, 2, 4, 6. At 6, \`i < 5\` is false. The 5 is skipped. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: How often does the body run? -- 3 times -- [x] 4 times -- 10 times -> The body runs at i = 1, 4, 7 and 10. After that i is 13. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the while loop checks its condition before every pass. → The condition comes first -- I can use a counter variable with a start value, a condition and a change. → A counter variable -- I can notice when a loop never ends and fix the mistake. → Watch out: endless loop -- I can follow a loop pass by pass in a desk check. → Loops in a desk check -- I can write a while loop in Java. → Now in Java -::: - -## Quiz - -::: quiz -? What does pre-test loop mean? -→ The condition comes first -- [x] The condition is checked before every pass. -- [ ] The condition is checked after every pass. -- [ ] The loop always runs exactly once. -> The head with the condition is at the top and is worked out first. - -? \`int i = 5\`, then a while loop with the condition \`i < 3\`. How often does the inside run? -→ The condition comes first -- [x] Not at all -- [ ] Once -- [ ] Three times -> The very first time it is checked, 5 < 3 is false. - -? Why does a loop with the condition \`number > 0\` never end if the inside only contains \`output: number\`? -→ Watch out: endless loop -- [ ] Because output makes the number bigger -- [x] Because number never changes and the condition stays true -- [ ] Because the condition is written wrongly -> Something has to happen inside that makes the condition false at some point. - -? What else are loops called in textbooks? -→ The condition comes first -- [x] Iteration or repetition -- [ ] Branches -- [ ] Subprograms -> A loop repeats statements. That is why it is also called iteration or repetition. - -? A loop should count from 1 to 5, but it only goes up to 4. What is the likely mistake? -→ A counter variable -- [x] The condition says i < 5 instead of i <= 5. -- [ ] The loop is a while loop. -- [ ] The variable i has the wrong name. - -? Which line starts a while loop correctly in Java? -→ Now in Java -- [ ] while number > 0 { -- [x] while (number > 0) { -- [ ] while (number > 0); -> The condition is in round brackets, then \`{\` opens the body. -::: -`,Rw=`--- -titel: Do-while loop -bereich: Basics -kurz: Run first, check afterwards: loops with at least one pass. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the do-while loop only checks its condition after the inside -- explain why the inside runs at least once -- repeat an input until it is valid -- write a do-while loop in Java -::: - -## Do first, check afterwards - -The **do-while loop** is a **post-test loop**. The condition is at the bottom, in the foot of the box. This is how it runs: - -1. Run the inside once. -2. Check the condition. -3. If it is true, start again at 1. If it is false, the program continues below the loop. - -::: grafik l11-vergleich.svg -On the left, the while loop checks first; on the right, the do-while loop runs first. -::: - -At the top of the box is \`do\`, and the condition is in the foot. When you click the loop, the word \`while\` is in front of the text field in the Object Inspector: the condition means “repeat as long as …”. - -> Just like with the while loop, the condition says **when the loop repeats**. As long as it is true, the loop keeps running. - -::: angeberwissen -Python has no do-while loop at all. If you want “do first, check later” there, you write \`while True:\` and leave the loop with \`break\`. Java, C and JavaScript, on the other hand, have had \`do … while\` for decades. -::: - -## At least one pass - -Because the condition is only checked at the end, the inside **always runs at least once**. That is the most important difference from the while loop. - -::: diagramm l11-einmal.visustruct -i is 10 and so it is not less than 5. Still, 10 is output once, because the check only comes afterwards. -::: - -With a while loop and the same condition \`i < 5\`, nothing at all would be output here. - -## Typical use: repeat an input - -The do-while loop fits whenever something has to happen first before you can check it. The best example is an input: only after someone has typed something do you know whether it is valid. - -::: diagramm l11-eingabe-pruefen.visustruct -The question comes again until a number from 1 to 10 has been typed in. In the simulation, first try 0 and then 12. -::: - -Here the condition describes the **invalid** input: \`number < 1 || number > 10\`. As long as the input is invalid, the question is asked again. - -## Exercise: Valid grade - -::: übung l11-note -titel: Valid grade -auftrag: Ask for a grade. If it is not between 1 and 6, ask again. If it is valid, output it, for example **Your grade: 3**. -test: 3 -> Your grade: 3 -test: 0, 7, 2 -> Your grade: 2 -test: 9, 6 -> Your grade: 6 -test: -1, 1 -> Your grade: 1 -braucht: doUntilSchleife -tipp: The grade is asked for at least once. After that, the condition decides whether to ask again. -tipp: Before the loop, create \`int grade = 0\`. The input \`input: grade "Grade from 1 to 6"\` goes inside the loop. The condition is \`grade < 1 || grade > 6\`. -lösung: l11-note-loesung.visustruct -::: - -## Exercise: Sum until 0 - -::: übung l11-summe -titel: Sum until 0 -auftrag: Keep asking for numbers until a 0 is typed in. Then output the sum of all the numbers typed in. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: You need a variable for the sum that starts at 0 before the loop. In every pass the new number is added. -tipp: Before the loop, create \`int sum = 0\` and \`int number = 0\`. In the loop you ask for \`number\` and calculate \`sum = sum + number\`. Adding the 0 does no harm. The loop keeps running as long as \`number != 0\`. -tipp: The outline: \`int sum = 0\` and \`int number = 0\`, then a do-while loop with the condition \`number != 0\`. Inside it: the input of \`number\` and \`sum = sum + number\`. Below the loop: \`output: sum\`. -lösung: l11-summe-loesung.visustruct -::: - -## Now in Java - -The loop that still runs once looks like this in Java: - -\`\`\`java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -\`\`\` - -- The body is between \`do {\` and \`}\`, the condition only comes afterwards. -- Here there is a **semicolon** after \`while (…)\`. That is different from the while loop. - -::: übung l12-java-verdoppeln -titel: Double at least once -code: java -auftrag: Write a Java program that reads a start number. A do-while loop doubles it and outputs it as long as it is less than 100. A number of 100 or more is still doubled at least once: 200 becomes 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: In the body you double the number and output it. The condition comes at the end. -tipp: \`do { number = number * 2; System.out.println(number); } while (number < 100);\` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Fill in the gaps: do-while - -::: lückentext -titel: Tripling -auftrag: The number is tripled and output as long as it is less than 100. Fill in the missing words and symbols. -\`\`\`java -int number = 1; -[[do]] { - number = number * 3; - System.out.println(number); -} [[while]] (number [[<]] 100)[[;]] -\`\`\` -erklärung: The body is between \`do {\` and \`}\`, the condition only comes afterwards. In a do-while loop there is a semicolon after \`while (…)\`. Output: 3, 9, 27, 81 and 243. -::: - -## Find the bug: halving - -::: übung l12-java-fehler -titel: Fix the halving -code: java -auftrag: The program reads a start number and keeps dividing it by 2 (whole-number division) with a do-while loop. Every result is output until **0** is reached. For 10 that is 5, 2, 1 and 0. But the 0 is missing. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: What value does \`number\` have after the 1 has been output? Does the loop run once more then? -tipp: The loop should keep going as long as the number is greater than 0: \`while (number > 0);\` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l12-java-laeuft-nicht -titel: Fix the doubling -code: java -auftrag: Starting at 1, the program should keep doubling as long as the number is less than 20: **1**, **2**, **4**, **8**, **16**. It outputs only the 1 and then stops. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: The first round still runs. The bug appears when the condition at the bottom is checked for the first time. -tipp: The condition needs \`limit\` with a small l: \`} while (number < limit);\` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Game: At least once? - -::: spiel frage -titel: Game: At least once? -intro: While or do-while? Ludwig shows you loops. Predict what happens. Six rounds. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: What is output? -- nothing -- [x] 10 -- 10 to 4 -> First do, then check: the body runs once, after that 11 < 5 is false. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: What is output? -- [x] nothing -- 10 -- 11 -> In a while loop the condition comes first. 10 < 5 is false, so nothing runs at all. - -runde: - int number = 200; - do { - number = number * 2; - } while (number < 100); - System.out.println(number); -frage: What is output? -- 200 -- [x] 400 -- 800 -> It is doubled once no matter what. After that 400 < 100 is false. - -runde: - int number = 30; - do { - number = number * 2; - System.out.println(number); - } while (number < 100); -frage: What is output? -- 60 -- [x] 60\\n120 -- 60\\n120\\n240 -> After 60, 60 < 100 is true, so it goes on. After 120 it stops. - -runde: -frage: Which line ends a do-while loop in Java correctly? -- [x] \`} while (i < 5);\` -- \`} while (i < 5)\` -- \`while (i < 5) {\` -> After the \`while (…)\` of a do-while loop there is a semicolon. - -runde: -frage: What is a do-while loop typically used for? -- [x] repeating an input until it is valid -- counting from 1 to 10 -- swapping two values -> The question is asked at least once. Only after that do you know whether the input was valid. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the do-while loop only checks its condition after the inside. → Do first, check afterwards -- I can explain why the inside runs at least once. → At least one pass -- I can repeat an input until it is valid. → Typical use: repeat an input -- I can write a do-while loop in Java. → Now in Java -::: - -## Quiz - -::: quiz -? What does post-test loop mean? -→ Do first, check afterwards -- [ ] The condition is checked before every pass. -- [x] The condition is checked after every pass. -- [ ] The loop has no condition. -> The condition is in the foot, at the bottom, and is worked out after the inside. - -? The condition of a do-while loop is false from the start. How often does the inside run? -→ At least one pass -- [ ] Not at all -- [x] Exactly once -- [ ] Forever -> The inside runs first. Only then does the loop notice that it should stop. - -? You want to ask for a number from 1 to 10. Which condition goes in the foot? -→ Typical use: repeat an input -- [ ] \`number >= 1 && number <= 10\` -- [x] \`number < 1 || number > 10\` -- [ ] \`number == 10\` -> The loop repeats as long as the input is invalid, that is, less than 1 or greater than 10. - -? When is a do-while loop better than a while loop? -→ At least one pass -- [x] When the inside has to run at least once, e.g. for an input -- [ ] When the loop might not need to run at all -- [ ] When you want to count exactly to 10 - -? What comes at the end of a do-while loop in Java? -→ Now in Java -- [ ] } while (condition) { -- [x] } while (condition); -- [ ] } until (condition); -> A semicolon follows the condition. -::: -`,Jw=`--- -titel: For loop -bereich: Basics -kurz: Count a fixed number of passes with Init, Condition and Step. ---- - -## Skills I will gain now - -::: kompetenzen -- name the three parts Init, Condition and Step of the for loop -- explain in which order the three parts run -- count forwards, backwards and in bigger steps with a for loop -- write a for loop in Java and explain its three fields -::: - -## Counting with a fixed plan - -In the while loop you already counted along: a start value before the loop, a condition in the head, a change inside. The **for loop** puts these three parts together in the head. That way you see at a glance how it counts. - -::: grafik l12-while-zu-for.svg animiert -The while loop becomes a for loop: init, condition and step move together into the head. -::: - -When you click a for loop, it has three fields on the right: - -- **Init:** \`int i = 1\` creates the counter variable. -- **Condition:** \`i <= 5\` says how long to count. -- **Step:** \`i++\` increases \`i\` by 1 after every pass. - -::: diagramm l12-eins-bis-fuenf.visustruct -A for loop that outputs the numbers from 1 to 5. -::: - -::: angeberwissen -Why is the counting variable almost always called \`i\`? In maths \`i\` has long stood for an index. And in FORTRAN, one of the first programming languages from 1957, all variables starting with I to N were automatically whole numbers. Programmers have not broken the habit to this day. -::: - -## In which order? - -The three parts run at different times: - -1. **Init** runs exactly once, right at the start. -2. **Condition** is checked before every pass. If it is false, the loop is finished. -3. After the inside comes the **Step**, then the condition again. - -::: grafik l12-for-ablauf.svg -Init only runs once. After that, condition, inside and step repeat. -::: - -So the for loop is a pre-test loop, like the while loop. Go through the example in the simulation with **Step** and watch how \`i\` changes. - -> Use the for loop when you know beforehand how often something should happen. If the end depends on something that only happens during the loop, for example an input, the while or do-while loop is better. - -## Example: sum from 1 to n - -A for loop is good for adding up numbers. Before the loop there is \`int sum = 0\`. In every pass the current number \`i\` is added. - -::: diagramm l12-summe.visustruct -With n = 4 the loop calculates 0 + 1 + 2 + 3 + 4. At the end, 10 is output. -::: - -## Other steps - -The step does not always have to be \`i++\`: - -- \`i--\` counts backwards, for example with Init \`int i = 10\` and Condition \`i >= 1\`. -- \`i = i + 2\` jumps in steps of two, for example 0, 2, 4, 6. - -Make sure that Init, Condition and Step fit together. With Init \`int i = 1\`, Condition \`i >= 1\` and Step \`i++\`, the condition never becomes false. - -::: übung l12-countdown -titel: Countdown -auftrag: Ask for a whole number \`n\`. Use a for loop to count backwards from \`n\` to 1 and output each number. Then output **Go!**. -test: 3 -> 3 | 2 | 1 | Go! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Go! -test: 1 -> 1 | Go! -braucht: forSchleife -tipp: This time the for loop counts backwards. Think about where it starts, when it stops and how it counts. -tipp: Init is \`int i = n\`, the condition \`i >= 1\` and the step \`i--\`. The output Go! goes below the loop, not inside it. -lösung: l12-countdown-loesung.visustruct -::: - -## Exercise: Times table - -::: übung l12-einmaleins -titel: Times table -auftrag: Ask for a number and output its times table from 1 to 10. Each line looks like this: **3 x 1 = 3**, **3 x 2 = 6** and so on. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: The loop counts from 1 to 10. In every pass you output one line of the table. -tipp: Inside, first calculate \`int product = number * i\`. Then output \`number + " x " + i + " = " + product\`. Remember the spaces inside the quotation marks. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Exercise: Fix the sum - -::: übung l16-summe -titel: Fix the sum -auftrag: The structure chart should add up all numbers from 1 to n. So with n = 4 the result should be 1 + 2 + 3 + 4 = **10**. But it outputs 6. - Do a desk check or use **Step** and fix the mistake. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Go through the loop with n = 4 in your head or with **Step**. Which numbers are really added? -tipp: Look at the last value of i the loop runs with. With n = 4, i = 4 must be added too. -lösung: l16-summe-loesung.visustruct -::: - -## Now in Java - -The sum from 1 to n looks like this in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Up to which number?"); -int n = scanner.nextInt(); -int sum = 0; -for (int i = 1; i <= n; i++) { - sum = sum + i; -} -System.out.println(sum); -\`\`\` - -The round brackets after \`for\` hold the three fields of the for loop, separated by semicolons: - -| Field | In Java | Meaning | -|---|---|---| -| Init | \`int i = 1\` | \`i\` starts at 1. | -| Condition | \`i <= n\` | The loop runs as long as this is true. | -| Step | \`i++\` | After every pass \`i\` gets 1 bigger. | - -\`i++\` is short for \`i = i + 1\`. To count backwards, use \`i--\`. - -::: übung l13-java-quadrate -titel: Square numbers in Java -code: java -auftrag: Write a Java program that reads a whole number \`n\` and uses a for loop to output the square numbers from 1 to \`n\`, each on its own line. For 3 that is 1, 4 and 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: The loop counts \`i\` from 1 to \`n\`. The square of \`i\` is \`i * i\`. -tipp: \`for (int i = 1; i <= n; i++) { … }\` and in the body \`System.out.println(i * i);\`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Fill in the gaps: for - -::: lückentext -titel: Counting up and down -auftrag: The first loop adds up the numbers from 1 to 5, the second counts down from 10 to 0. Fill in the missing words and symbols. -\`\`\`java -int sum = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - sum = sum + i; -} -System.out.println("Sum: " + sum); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -\`\`\` -erklärung: The round brackets hold the start value, the condition and the step, separated by semicolons. \`i++\` counts up, \`i--\` counts down. When counting down to 0 the condition is \`i >= 0\`. -::: - -## Find the bug: times table - -::: übung l13-java-fehler -titel: Fix the times table -code: java -auftrag: The program asks for a times table and should output it from 1 times to 10 times, for 7 that is 7, 14, … up to 70. But the 70 is missing. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: How often does the loop run? Count which values \`i\` takes. -tipp: \`i\` should also take the value 10: \`i <= 10\` instead of \`i < 10\`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l13-java-laeuft-nicht -titel: Fix the stairs -code: java -auftrag: Ludwig climbs 5 steps, each 20 cm high. The program should output **Height: 100 cm**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Height: 100 cm -braucht: forSchleife -tipp: \`height\` is used in a calculation, but where is the variable created? And at what height does Ludwig start? -tipp: Create \`height\` before the loop: \`int height = 0;\` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program hides **exactly one mistake**, and the bomb is ticking. Read what the program should do and tap the wrong line before time runs out. If the parts of a line have a border, tap exactly the wrong part, for example just \`i++\`. Eight rounds, 25 seconds each. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Should output 1, 2 and 3. -fehler: 2 -besser: System.out.println(i); -> The semicolon at the end of the statement is missing. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Should output 1 to 5. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> The three fields of the for loop are separated by semicolons, not commas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Should count backwards from 10 to 1. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> With \`i++\`, \`i\` keeps growing and the condition \`i >= 1\` stays true: an endless loop. To count backwards, use \`i--\`. - -runde: - int sum = 0; - for (int i = 1; i <= 4; i++) { - sum = i; - } - System.out.println(sum); -frage: Should output the sum 1 + 2 + 3 + 4 = 10. -fehler: 3 -stelle: i -besser: sum = sum + i; -> \`sum = i\` overwrites the sum in every pass. In the end it only holds 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Baaa"); - } -frage: Should output Baaa exactly five times. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> From 0 up to and including 5 there are six passes. If you start at 0, use \`<\`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Should output 1, 2 and 3. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> Java tells upper and lower case apart: \`System\` is written with a capital S. - -runde: - int number = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(number + " x " + i + " = " + number * number); - } -frage: Should output the 7 times table: 7 x 1 = 7, 7 x 2 = 14 and so on. -fehler: 3 -stelle: number * number -besser: System.out.println(number + " x " + i + " = " + number * i); -> \`number * number\` is always 49. It has to be \`number * i\`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Should output the even numbers 2, 4, 6, 8 and 10. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> \`i + 2\` only calculates and stores nothing. For \`i\` to really grow, you need \`i = i + 2\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the three parts Init, Condition and Step of the for loop. → Counting with a fixed plan -- I can explain in which order the three parts run. → In which order? -- I can count forwards, backwards and in bigger steps with a for loop. → Other steps -- I can write a for loop in Java and explain its three fields. → Now in Java -::: - -## Quiz - -::: quiz -? How often does the Init of a for loop run? -→ In which order? -- [x] Exactly once -- [ ] Before every pass -- [ ] After every pass -> Init creates the counter variable once at the start. - -? Init \`int i = 0\`, Condition \`i < 3\`, Step \`i++\`. Which values does i have inside the loop? -→ Counting with a fixed plan -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> With i = 3 the condition is false, so the inside does not run any more. - -? Init \`int i = 2\`, Condition \`i <= 10\`, Step \`i = i + 2\`. How often does the inside run? -→ Other steps -- [ ] 4 times -- [x] 5 times -- [ ] 10 times -> i takes the values 2, 4, 6, 8 and 10. - -? When does a for loop fit best? -→ Counting with a fixed plan -- [x] When you know beforehand how often to repeat -- [ ] When you keep asking until an input is valid -- [ ] When only a single value is checked - -? What does \`i++\` mean in a for loop? -→ Counting with a fixed plan -- [ ] i is doubled. -- [x] i gets 1 bigger. -- [ ] i is output. -> \`i++\` is short for \`i = i + 1\`. -::: -`,Gw=`--- -titel: Nesting -bereich: Basics -kurz: Combine branches inside loops and loops inside loops. ---- - -## Skills I will gain now - -::: kompetenzen -- put a branch inside a loop -- put a loop inside another loop -- explain that the inner loop runs all the way through in every pass of the outer one -- write nested loops and branches in Java -::: - -## Building blocks inside each other - -You now know all the important building blocks: sequence, branch, switch and three kinds of loops. They only get really powerful together. - -Every path and every loop body is a sequence itself. You may put any element there, including more branches and loops. This is called **nesting**. - -> To do this, simply drag an element onto the placeholder ø inside a loop or a path. - -## A branch inside a loop - -The loop goes through all the numbers, and the branch decides for each single number whether something happens. That way you can count, for example, how many even numbers there are from 1 to n. - -::: diagramm l13-gerade-zaehlen.visustruct -In every pass the branch checks with i % 2 == 0 whether i is even. Only then is count increased by 1. The false path stays empty. -::: - -With n = 7 these are the numbers 2, 4 and 6, so 3 is output. - -## Exercise: Count even inputs - -::: übung l13-gerade-eingaben -titel: Count even inputs -auftrag: Ask for exactly **five** whole numbers, one after another. Then output how many of them were even. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Doing the same thing five times means: loop. In every pass a number is read in and checked. -tipp: A for loop from 1 to 5. Inside, first comes the input \`input: int number "Enter a number"\`, below it a branch with \`number % 2 == 0\`. In the true path you increase \`count\` by 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## A loop inside a loop - -If one loop sits inside another, the **inner loop runs all the way through in every pass of the outer one**. With this you can build patterns of rows and columns. - -::: diagramm l13-dreieck.visustruct -The outer loop counts the lines. The inner one adds as many stars to the text as the line number says. With n = 3 you get a triangle of 1, 2 and 3 stars. -::: - -With \`String text = ""\` every line starts empty. \`text = text + "*"\` adds a star. Only when the line is finished is it output. - -Experienced programmers give the counter variables the short names \`i\` and \`j\`: \`i\` outside, \`j\` inside. Then it looks like this, here with a small times table: - -::: grafik l13-verschachtelt-tabelle.svg animiert -The outer loop counts the lines with \`i\`, the inner one counts the numbers in a line with \`j\`. On every new line, \`j\` starts again at 1. -::: - -## Exercise: Rectangle - -::: übung l13-rechteck -titel: Rectangle -auftrag: Ask for a width and a height. Output a rectangle made of \`#\`: as many lines as the height, and in each line as many \`#\` as the width. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: You need two loops inside each other: one for the lines and inside it one for the characters of a line. -tipp: Build it like the triangle. The difference: the inner loop always counts up to \`width\`, not up to the line number. The outer loop counts up to \`height\`. -tipp: The outline: inputs \`width\` and \`height\`. Outer for loop \`int line = 1\`, \`line <= height\`, \`line++\`. Inside it first \`String text = ""\`, then the inner for loop \`int column = 1\`, \`column <= width\`, \`column++\` with \`text = text + "#"\`, and below the inner loop \`output: text\`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Keep track - -With nested diagrams, the drawing helps you: whatever is further inside is indented and surrounded by its loop or path. - -- Read from the outside in: what repeats? What is decided in every pass? -- Give counter variables meaningful names such as \`line\` and \`column\`. Two loops must not change the same counter variable. -- Go through an example in the simulation with **Step** and watch the variables. - -::: angeberwissen -This is exactly what the structure chart was invented for. Shneiderman asked himself: if we are supposed to do without GOTO, why not do without the arrows in the flowchart as well? The result: no arrow spaghetti, and every block stays nicely in its pen. -::: - -## Now in Java - -Counting the even numbers looks like this in Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Up to which number?"); -int n = scanner.nextInt(); -int count = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - count++; - } // end if -} // end for -System.out.println(count); -\`\`\` - -What is nested in the structure chart is nested in curly brackets in Java. Every level is indented four spaces further. If your code gets messy, the **Indent** button at the top of the Code area helps. - -With many closing brackets \`}\` it is easy to lose track: which bracket belongs to which block? A comment after it tells you, for example \`} // end if\` and \`} // end for\`. This also helps when you carry on later. - -\`count++\` is short for \`count = count + 1\`. - -::: übung l14-java-treppe -titel: Stairs of stars -code: java -auftrag: Write a Java program that reads the number of steps and outputs stairs made of stars. For 3 steps that is \`*\`, \`**\` and \`***\`, each step on its own line. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: An outer loop counts the steps. In each step an inner loop builds a text of stars. -tipp: In the outer loop: \`String line = "";\`, then \`for (int j = 1; j <= i; j++) { line = line + "*"; }\` and after that \`System.out.println(line);\`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Fill in the gaps: nesting - -::: lückentext -titel: Rectangle of stars -auftrag: The program outputs a rectangle of 3 lines with 4 stars each. Fill in the missing words and symbols. -\`\`\`java -for (int line = 1; line <= 3; line++) { - String text = [[""]]; - [[for]] (int column = 1; column [[<=]] 4; [[column++ | column += 1 | column = column + 1]]) { - text = text [[+]] "*"; - } - System.out.[[println]](text); -[[}]] -\`\`\` -erklärung: The inner loop builds one line of 4 stars, the outer loop repeats that three times. Each line starts with an empty text \`""\`. The last bracket closes the outer loop. -::: - -## Find the bug: divisible by 3 - -::: übung l14-java-fehler -titel: Fix the counting -code: java -auftrag: The program should count how many numbers from 1 to \`n\` are divisible by 3 and output the result **once**. For 10 that is just **Count: 3**. But it outputs far too many lines. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l14-java-fehler-start.visustruct -test: 10 -> Count: 3 -test: 3 -> Count: 1 -test: 2 -> Count: 0 -braucht: forSchleife, verzweigung -tipp: Look at the curly brackets: is the output inside the loop or after it? -tipp: Move the line \`System.out.println("Count: " + count);\` after the closing bracket of the loop. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l14-java-laeuft-nicht -titel: Fix the even numbers -code: java -auftrag: The program should output the even numbers from 1 to 10: **2**, **4**, **6**, **8**, **10**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: The bug is right inside, in the output. What is the loop’s counter variable called? -tipp: The counter variable is \`i\` with a small i: \`System.out.println(i);\` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Inside and outside - -::: spiel frage -titel: Game: Inside and outside -intro: Ludwig has put building blocks inside each other. Read from the outside in and predict what happens. Six rounds. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: How many stars are output? -- 3 -- 5 -- [x] 6 -> The inner loop runs completely in each of the 3 runs of the outer loop: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Which line is output fourth? -- 1 4 -- [x] 2 1 -- 2 2 -> First j runs through for i = 1: 1 1, 1 2, 1 3. Then j starts again at 1, now with i = 2. - -runde: - int count = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - count++; - } - } - System.out.println(count); -frage: What is output? -- [x] 3 -- 10 -- 4 -> The branch only counts 3, 6 and 9. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("even"); - } else { - System.out.println(i); - } - } -frage: What is output? -- 1\\n2\\n3\\n4 -- [x] 1\\neven\\n3\\neven -- even\\neven -> For every number the branch decides again: odd numbers themselves, even ones as a word. - -runde: - for (int i = 1; i <= 3; i++) { - String line = ""; - for (int j = 1; j <= i; j++) { - line = line + "*"; - } - System.out.println(line); - } -frage: What is output? -- ***\\n***\\n*** -- [x] *\\n**\\n*** -- ***\\n**\\n* -> The inner loop runs up to i. That's why every line gets one star longer. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: What happens? -- 1 to 3 is output three times. -- 1 to 3 is output once. -- [x] Java reports an error. -> Two loops inside each other need two different counter variables, for example \`row\` and \`column\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can put a branch inside a loop. → A branch inside a loop -- I can put a loop inside another loop. → A loop inside a loop -- I can explain that the inner loop runs all the way through in every pass of the outer one. → A loop inside a loop -- I can write nested loops and branches in Java. → Now in Java -::: - -## Quiz - -::: quiz -? The outer loop runs 3 times, the inner one 4 times. How often does the inside of the inner loop run in total? -→ A loop inside a loop -- [ ] 7 times -- [x] 12 times -- [ ] 4 times -> In each of the 3 outer passes, the inner loop runs 4 times, so 3 · 4 = 12. - -? How can you tell whether a number is even? -→ A branch inside a loop -- [ ] \`number / 2 == 0\` -- [x] \`number % 2 == 0\` -- [ ] \`number == 2\` -> % gives the remainder of a division. For even numbers, the remainder when dividing by 2 is zero. - -? There is a branch inside a for loop. How often is the condition of the branch checked? -→ A branch inside a loop -- [ ] Once -- [x] Once per pass of the loop -- [ ] Only if it is true -> The branch is part of the inside and runs in every pass. - -? How can you tell in Java what belongs to a loop? -→ Now in Java -- [ ] By the colour -- [x] By the curly brackets and the indentation -- [ ] By the semicolons -::: -`,Hw=`--- -titel: Arrays -bereich: Basics -kurz: Store many values under one name, reach them with the index and go through them with a loop. ---- - -## Skills I will gain now - -::: kompetenzen -- create an array with values or with \`new int[5]\` -- explain that the index starts at 0 and that the last index is \`length - 1\` -- go through and fill an array with a for loop -- calculate the sum and the maximum of an array -- create an array in Java and go through it with a loop -::: - -## Many values under one name - -Imagine you want to store the points from five tests. With five variables \`points1\` to \`points5\` that quickly gets confusing. An **array** is a row of slots that all have the same name and the same data type. - -You create an array with a statement. After the data type you write square brackets \`[]\`: - -\`\`\` -int[] numbers = {2, 4, 6, 8, 10} -String[] names = {"Ada", "Ben", "Cem"} -\`\`\` - -The values in the curly brackets go straight into the slots. You can also create an empty array with a fixed number of slots: - -\`\`\` -int[] points = new int[5] -String[] names = new String[3] -\`\`\` - -With \`new int[5]\` all five slots hold zeros at first, with \`new String[3]\` empty texts. - -## The index starts at 0 - -Every slot has a number, the **index**. Counting starts at **0**. So with \`int[] numbers = {2, 4, 6, 8, 10}\`: - -- \`numbers[0]\` is 2 -- \`numbers[1]\` is 4 -- \`numbers[4]\` is 10 - -::: grafik l14-array.svg -Five slots with the indices 0 to 4. The index is above the slot, the value inside it. -::: - -**Why start at 0?** In computer science the index is not “which slot” but the **distance from the start**. The first slot is right at the start, so 0 steps away. The second is 1 step away, the third 2 steps. You know this from a lift: the ground floor is **0**, and the first floor is one level above it. - -This gives you a rule worth remembering: with 5 slots the **last index is 4**, always one less than the number of slots. - -::: angeberwissen -Counting from 0 is pretty old. The programming language C from 1972 already works like this: the computer knows the address of the first slot, and for \`numbers[i]\` it simply calculates “start plus i slots further”. With i = 0 it stays at the start, which saves a calculation. Java, Python and JavaScript took this over. By the way, I count my horns from 0 as well: horn 0 on the left, horn 1 on the right. -::: - -With the index you read a value or write a new one into it: - -\`\`\` -output: numbers[0] -numbers[1] = 99 -\`\`\` - -> An array with 5 slots has the indices 0 to 4. \`numbers[5]\` does not exist. The simulation then reports an invalid expression. - -## The length of an array - -\`numbers.length\` tells you how many slots an array has. With five values it is 5. So the **last** index is always \`numbers.length - 1\`: - -\`\`\` -output: numbers.length -output: numbers[numbers.length - 1] -\`\`\` - -The second line outputs the last value, however long the array is. VisuStruct also understands \`numbers.length()\`. - -::: übung l14-erster-letzter -titel: First and last value -auftrag: Create the array \`int[] values = {4, 8, 15, 16, 23, 42}\`. Then output on three lines: the first value, the last value and the number of values. - For the last value, use the length and do not simply write the index 5. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Counting starts at 0, so the first slot has the index 0. And what is the index of the last slot? -tipp: The first value is \`values[0]\`. The last one is \`values[values.length - 1]\`. The number of values is \`values.length\`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Go through an array with a loop - -An array shows its strength together with a **for loop**. The counter variable \`i\` runs from 0 to the last index and is used as the index: - -\`\`\` -int i = 0 -i < numbers.length -i++ -\`\`\` - -In the first pass \`i\` is 0, in the last one 4. Because the condition is \`i < numbers.length\`, the loop fits any length. - -::: diagramm l14-array-durchlaufen.visustruct -The for loop outputs all five values one after another. Under Variables in the simulation, watch i count from 0 to 4. -::: - -This is also how you fill an empty array with inputs. As the target of the input you write the slot \`names[i]\`: - -::: diagramm l14-namen-eingeben.visustruct -Three names are asked for and written into the slots 0, 1 and 2. -::: - -::: übung l14-rueckwaerts -titel: Print backwards -auftrag: Create an array for 4 whole numbers and read in the 4 numbers with a loop. Then output them in **reverse** order, each on its own line. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: You need two loops: one for reading in from front to back and one for outputting from back to front. -tipp: You create the array with \`int[] numbers = new int[4]\`. The input is \`input: numbers[i] "Enter a number"\`. For the second loop you start at \`int i = numbers.length - 1\`, check \`i >= 0\` and count down with \`i--\`. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr** from Vienna was a famous Hollywood film star in the 1940s. In her spare time she liked to invent things. In 1942, together with the composer George Antheil, she received a patent for a radio link that an enemy should not be able to jam: sender and receiver jump together through a list of **88 frequencies**, as many as a piano has keys. The list was punched into a paper strip like the roll of a self-playing piano. Both go through the same list in the same order, just like your loop goes through an array with \`i\`. Anyone who listens to or jams only one frequency gets almost nothing. - -This method, **frequency hopping**, is used today in Bluetooth, for example. She did not invent it all by herself; there were earlier ideas. But her patent is seen as an important forerunner, and in 1997 she received an award for it. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), actress and inventor, 1944 (publicity photo: [unknown](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), public domain). -::: - -## Sum and maximum - -Two tasks come up with arrays again and again: - -- **Sum:** You start with \`sum = 0\` and add every value in the loop. -- **Maximum:** First you remember the value in slot 0 as the largest so far. In the loop you check every value. If it is larger, it becomes the new maximum. - -::: diagramm l14-summe-maximum.visustruct -Sum and maximum in one single pass. The maximum starts with points[0] and not with 0, so that it is also right for negative numbers. -::: - -::: übung l14-summe-max -titel: Sum and maximum -auftrag: Read 5 whole numbers into an array. Then output **Sum: …** and on the next line **Maximum: …**. -test: 3, 9, 2, 9, 1 -> Sum: 24 | Maximum: 9 -test: 10, 20, 30, 40, 50 -> Sum: 150 | Maximum: 50 -test: -5, -2, -9, -1, -3 -> Sum: -20 | Maximum: -1 -braucht: forSchleife, verzweigung -tipp: Go through the array with a loop. Add every value to the sum and remember the largest value seen so far. -tipp: Calculate the sum and the maximum in variables of their own and only output them at the end, e.g. with \`output: "Sum: " + sum\`. If your maximum starts at 0, the third test fails. -tipp: The outline: create the array and read it in with a loop. Then \`int sum = 0\` and \`int max = numbers[0]\`. A second loop calculates \`sum = sum + numbers[i]\`, and a branch \`numbers[i] > max\` sets \`max = numbers[i]\` in its true branch. Finally the two outputs. -lösung: l14-summe-max-loesung.visustruct -::: - -## Now in Java - -Going through an array looks like this in Java: - -\`\`\`java editor -int[] numbers = {2, 4, 6, 8, 10}; -for (int i = 0; i < numbers.length; i++) { - System.out.println(numbers[i]); -} -\`\`\` - -- \`int[]\` means “array of whole numbers”. The values are in curly brackets. -- You create an empty array with 5 slots with \`new int[5]\`. -- \`numbers[i]\` is the slot with index \`i\`, \`numbers.length\` is the length. - -If you output the whole array, that is \`System.out.println(numbers);\`, Java does not show the numbers. You only see a text like \`[I@1b6d3586\`. This is the **reference**, the place where the array is stored in memory. \`Arrays.toString(numbers)\` shows the content: \`[2, 4, 6, 8, 10]\`. For this you write \`import java.util.Arrays;\` at the very top. - -::: übung l15-java-noten -titel: Sum of grades in Java -code: java -auftrag: Create the array \`grades\` in Java with the values 2, 3, 1 and 4. Add up all grades with a for loop and output **Sum: 10**. -test: - -> Sum: 10 -braucht: forSchleife -tipp: Create \`int sum = 0;\` before the loop. The loop runs from 0 to \`grades.length - 1\`. -tipp: \`int[] grades = {2, 3, 1, 4};\`, then \`for (int i = 0; i < grades.length; i++) { sum = sum + grades[i]; }\` and finally \`System.out.println("Sum: " + sum);\`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Fill in the gaps: arrays - -::: lückentext -titel: Finding the maximum -auftrag: The program looks for the largest value in the array. Fill in the missing words and symbols. -\`\`\`java -[[int]][] values = {3, 7, 1, 9, 4}; -int max = values[0]; -[[for]] (int i = 1; i < values.[[length]]; i++) { - if (values[i] [[>]] max) { - max = values[i]; - } -} -System.out.println("Maximum: " + max); -\`\`\` -erklärung: \`int[]\` is an array of whole numbers, \`values.length\` is its length. \`max\` starts with the first value, and the loop compares all the others with it. Output: **Maximum: 9** -::: - -## Find the bug: temperatures - -::: übung l15-java-fehler -titel: Fix the highest temperature -code: java -auftrag: In January the temperatures -5, -2, -8 and -3 degrees were measured. The program should output the highest, so **Highest temperature: -2**. But it claims 0 degrees, although it was never that warm. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l15-java-fehler-start.visustruct -test: - -> Highest temperature: -2 -braucht: forSchleife, verzweigung -tipp: What value does \`max\` start with? Is any of the temperatures greater than this start value? -tipp: \`max\` has to start with a value from the array: \`int max = temperatures[0];\` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l15-java-laeuft-nicht -titel: Add up the points -code: java -auftrag: The array \`points\` holds 4, 7, 2 and 5. The program should add them all up and output **Sum: 18**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Sum: 18 -braucht: forSchleife -tipp: The Code area underlines the wrong word in red. How do you write the length of an array? -tipp: \`length\` is written all in small letters: \`i < points.length\` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake** to do with arrays, and the bomb is ticking. Tap the wrong line before time runs out. If the parts of a line have a border, tap exactly the wrong part. Six rounds, 30 seconds each. -zeit: 30 - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - for (int i = 0; i <= numbers.length; i++) { - System.out.println(numbers[i]); - } -frage: Should output all five values. -fehler: 2 -stelle: i <= numbers.length -besser: for (int i = 0; i < numbers.length; i++) { -> With \`<=\`, i runs up to 5. There is no slot \`numbers[5]\`. - -runde: - String[] names = {"Ada", "Ben", "Cem"}; - System.out.println(names[1]); -frage: Should output the first name, Ada. -fehler: 2 -stelle: names[1] -besser: System.out.println(names[0]); -> Counting starts at 0. \`names[1]\` is already Ben. - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - System.out.println(numbers[numbers.length]); -frage: Should output the last value, 10. -fehler: 2 -stelle: numbers[numbers.length] -besser: System.out.println(numbers[numbers.length - 1]); -> The last index is always one less than the length. - -runde: - int[] points = {3, 9, 2}; - int sum = 0; - for (int i = 0; i < points.length; i++) { - sum = points[i]; - } - System.out.println(sum); -frage: Should output the sum 14. -fehler: 4 -stelle: points[i] -besser: sum = sum + points[i]; -> Like this every value overwrites the one before, and at the end sum only holds 2. - -runde: - int[] points = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < points.length; i++) { - if (points[i] > max) { - max = points[i]; - } - } - System.out.println(max); -frage: Should output the maximum -2. -fehler: 2 -stelle: 0 -besser: int max = points[0]; -> None of the numbers is greater than 0, so max would stay 0. That's why the maximum starts with the first slot. - -runde: - int[] numbers = {2, 4, 6, 8, 10}; - for (int i = numbers.length; i >= 0; i--) { - System.out.println(numbers[i]); - } -frage: Should output the values backwards, from 10 to 2. -fehler: 2 -stelle: int i = numbers.length -besser: for (int i = numbers.length - 1; i >= 0; i--) { -> Backwards you start at the last index, and that is \`numbers.length - 1\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create an array with values or with \`new int[5]\`. → Many values under one name -- I can explain that the index starts at 0 and that the last index is \`length - 1\`. → The index starts at 0 -- I can go through and fill an array with a for loop. → Go through an array with a loop -- I can calculate the sum and the maximum of an array. → Sum and maximum -- I can create an array in Java and go through it with a loop. → Now in Java -::: - -## Quiz - -::: quiz -? What does \`output: numbers[2]\` output with \`int[] numbers = {5, 10, 15, 20}\`? -→ The index starts at 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Counting starts at 0: numbers[0] is 5, numbers[1] is 10, numbers[2] is 15. - -? An array has 8 slots. Which index is the last one? -→ The index starts at 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> The last index is always length - 1. - -? Which condition fits a for loop that goes through all values of \`numbers\` and starts at \`int i = 0\`? -→ Go through an array with a loop -- [x] i < numbers.length -- [ ] i <= numbers.length -- [ ] i > numbers.length -> With <= the loop would also read numbers[length], and that slot does not exist. - -? What should the maximum start with before the loop begins? -→ Sum and maximum -- [ ] Always with 0 -- [x] With the first value of the array -- [ ] With the length of the array -> If it starts with 0, then with only negative numbers the result would be 0, although 0 is not in the array at all. - -? What does \`output: numbers.length\` output with \`int[] numbers = {5, 10, 15, 20}\`? -→ Many values under one name -- [ ] 3 -- [x] 4 -- [ ] 20 -> length is the number of slots, not the last index and not the last value. - -? Which line creates an array with three numbers in Java? -→ Now in Java -- [x] int[] numbers = {1, 2, 3}; -- [ ] int numbers = [1, 2, 3]; -- [ ] array numbers = (1, 2, 3); -::: -`,Vw=`--- -titel: Two-dimensional arrays -bereich: Basics -kurz: Store values in rows and columns, like the seats in a cinema, and go through them with two nested loops. ---- - -## Skills I will gain now - -::: kompetenzen -- create a 2D array and explain what the two numbers mean -- read and write a slot with a row and a seat -- tell \`seats.length\` and \`seats[0].length\` apart -- explain in which order two nested loops visit the slots -- create and go through a two-dimensional array in Java -::: - -## A cinema as a table - -A cinema has several **rows**, and every row has several **seats**. For every seat we want to remember whether its ticket has already been sold. That is a yes-or-no question, so the data type \`boolean\` fits: \`true\` means sold, \`false\` means free. - -A normal array is one single row of slots. For the cinema we need a **table** with rows and columns. That is a **two-dimensional array**, 2D array for short. You write two pairs of square brackets for it: - -\`\`\` -boolean[][] seats = new boolean[3][5] -\`\`\` - -That gives 3 rows with 5 seats each, so 15 slots. At the start every slot holds \`false\`: all seats are free. - -::: grafik kino-saal.svg -The first index is the row, the second the seat. Both are counted from 0. -::: - -## Reach a slot - -For a slot you now need **two** indices: first the row, then the seat. - -\`\`\` -seats[1][2] = true -\`\`\` - -Now seat 2 in row 1 is sold. Reading works the same way: \`seats[1][2]\` is now \`true\`. - -You can also ask for the size: - -- \`seats.length\` is the number of **rows**, here 3. -- \`seats[0].length\` is the number of **seats** in row 0, here 5. - -::: diagramm kino-verkaufen.visustruct -Three tickets are sold. After that, the diagram outputs the size of the cinema and whether row 1, seat 2 is sold. Watch under Variables in the simulation: seats is shown row by row. -::: - -> Just like with a normal array, there is no slot \`seats[3][0]\`, because the rows are called 0, 1 and 2. The simulation then reports an invalid expression. - -## Two loops inside each other - -To look at **all** seats, you need two for loops inside each other: - -- The **outer loop** counts the row: \`row\` runs from 0 to 2. -- The **inner loop** counts the seat: \`seat\` runs from 0 to 4. - -::: grafik kino-schleifen.svg -Blue is the outer loop, orange the inner one. The numbers show the order in which the seats come up. -::: - -For every row, the inner loop runs **all the way** through once. Only when \`seat\` has visited all five seats does the outer loop move \`row\` on by one. Then \`seat\` starts at 0 again. That way all 3 · 5 = 15 seats come up exactly once. - -The conditions are \`row < seats.length\` and \`seat < seats[row].length\`. That way the loops fit a cinema of any size. - -::: diagramm kino-saalplan.visustruct -The seating plan: for every row, a line of X (sold) and O (free) is put together and output. Go through it with Step and watch how seat keeps starting again from the beginning while row only slowly counts on. -::: - -::: angeberwissen -Every phone photo is a 2D array! A photo with 4000 · 3000 pixels has 3000 rows with 4000 slots each, so 12 million pixels. Every slot holds the colour of one dot. When you make a photo brighter, the phone runs over all the pixels with two nested loops. My profile picture, by the way, has only one slot: brown. -::: - -## Exercise: Count free seats - -::: übung kino-frei -titel: Count free seats -auftrag: In the start diagram three tickets have already been sold. Use two nested loops to count how many seats are still **free**, and output e.g. \`Free: 12\`. -start: kino-frei-start.visustruct -test: - -> Free: 12 -braucht: forSchleife, verzweigung -tipp: Just like for the seating plan, you go over all seats with two loops. Instead of outputting something, you count. -tipp: Before the loops, create \`int free = 0\`. A seat is free if \`seats[row][seat]\` is false. The condition for that is \`!seats[row][seat]\`. -lösung: kino-frei-loesung.visustruct -::: - -## Exercise: Sell a ticket - -::: übung kino-karte -titel: Sell a ticket -auftrag: The start diagram asks for a row and a seat. If the seat is already sold, output \`Already sold\`. Otherwise mark it as sold and output e.g. \`Sold: row 0, seat 4\`. -start: kino-karte-start.visustruct -test: 1, 2 -> Already sold -test: 0, 4 -> Sold: row 0, seat 4 -test: 2, 0 -> Sold: row 2, seat 0 -braucht: verzweigung -tipp: First check whether the seat is sold. Depending on the answer, something different happens. -tipp: You do not need a loop here. A branch with the condition \`seats[row][seat]\` is enough. In the false path you set the slot to \`true\`. -lösung: kino-karte-loesung.visustruct -::: - -## Exercise: Times table grid - -::: übung kino-einmaleins -titel: Times table grid -auftrag: Create \`int[][] table = new int[10][10]\` and fill it with the times tables up to 10 using two loops. Then ask for two numbers from 1 to 10 and read the result from the table, e.g. \`3 · 4 = 12\`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: First two nested loops fill the table; after that you read only one single slot. -tipp: The indices run from 0 to 9, but the numbers from 1 to 10. That is why the slot \`table[i][j]\` holds the value \`(i + 1) * (j + 1)\`, and for 3 · 4 you read \`table[a - 1][b - 1]\`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Now in Java - -The cinema looks like this in Java: - -\`\`\`java editor -boolean[][] seats = new boolean[3][5]; -seats[0][2] = true; -seats[1][1] = true; -seats[1][2] = true; -System.out.println("Rows: " + seats.length); -System.out.println("Seats per row: " + seats[0].length); -System.out.println("Row 1, seat 2 sold? " + seats[1][2]); -\`\`\` - -- Two pairs of square brackets \`[][]\` stand for a table: first the row, then the seat. -- \`seats.length\` is the number of rows, \`seats[0].length\` the number of seats in one row. -- With fixed values you write every row in its own curly brackets: \`int[][] t = {{1, 2}, {3, 4}};\` - -::: übung l16-java-punkte -titel: Add up the points -code: java -auftrag: Three players have played two rounds each. Create the table \`points\` in Java with the rows {3, 5}, {4, 1} and {2, 2}. Add up all points with two nested for loops and output **Sum: 17**. -test: - -> Sum: 17 -braucht: forSchleife -tipp: The outer loop goes through the rows, the inner one through the seats of a row. -tipp: \`int[][] points = {{3, 5}, {4, 1}, {2, 2}};\` and in the inner loop \`sum = sum + points[i][j];\`. The inner loop runs up to \`points[i].length\`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Fill in the gaps: tables - -::: lückentext -titel: Adding up all fields -auftrag: The program adds up all numbers in the table. Fill in the missing words and symbols. -\`\`\`java -[[int]][][] grid = {{1, 2, 3}, {4, 5, 6}}; -int sum = 0; -for (int r = 0; r < grid.[[length]]; r++) { - for (int c = 0; c < grid[r].[[length]]; c++) { - sum = sum [[+]] grid[r][c]; - } -} -System.out.println("Sum: " + sum); -\`\`\` -erklärung: \`int[][]\` is a table. \`grid.length\` is the number of rows (2), \`grid[r].length\` the number of fields in row \`r\` (3). Output: **Sum: 21** -::: - -## Find the bug: points - -::: übung l16-java-fehler -titel: Fix player 2 -code: java -auftrag: In the table \`points\` each row stands for one player. The program should add up the points of player 2 (row 1), so **Player 2: 11**. Instead it reports an error. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l16-java-fehler-start.visustruct -test: - -> Player 2: 11 -braucht: forSchleife -tipp: In \`points[a][b]\`, \`a\` is the row and \`b\` the place in the row. Which number stands for the row of player 2? -tipp: The indices are swapped: \`points[1][j]\` instead of \`points[j][1]\`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l16-java-laeuft-nicht -titel: Read the score -code: java -auftrag: In the table \`points\` each row is a player and each column a round. The program should output player 2’s points in round 1, so **Player 2, round 1: 4**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Player 2, round 1: 4 -braucht: anweisung -tipp: The cells \`[1][0]\` are right. Look at the name of the table. -tipp: The table is called \`points\` with a small p: \`points[1][0]\` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Which seat? - -::: spiel frage -titel: Game: Which seat? -intro: Ludwig is selling cinema tickets. First the row, then the seat, both from 0. Seven rounds. - -runde: - boolean[][] seats = new boolean[3][5]; - System.out.println(seats.length); -frage: What is output? -- [x] 3 -- 5 -- 15 -> \`seats.length\` is the number of rows. - -runde: - boolean[][] seats = new boolean[3][5]; - System.out.println(seats[0].length); -frage: What is output? -- 3 -- [x] 5 -- 15 -> \`seats[0]\` is row 0. Its length is the number of seats in this row. - -runde: - int[][] table = new int[4][6]; -frage: How many slots does the table have? -- 10 -- [x] 24 -- 35 -> 4 rows with 6 seats each: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: What is output? -- 2 -- [x] 3 -- 4 -> Row 1 is \`{3, 4}\`, and seat 0 in it is the 3. - -runde: - boolean[][] seats = new boolean[3][5]; - seats[3][0] = true; -frage: What happens? -- The first seat in row 3 is sold. -- The first seat in the last row is sold. -- [x] There is an error, because the rows are called 0, 1 and 2. -> Just like with a normal array, the last index is one less than the length. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int sum = 0; - for (int row = 0; row < t.length; row++) { - for (int seat = 0; seat < t[row].length; seat++) { - sum = sum + t[row][seat]; - } - } - System.out.println(sum); -frage: What is output? -- 6 -- 15 -- [x] 21 -> The two loops visit all six slots: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Two loops go through the cinema \`new boolean[3][5]\`. Which slot comes right after \`seats[0][4]\`? -- \`seats[0][5]\` -- [x] \`seats[1][0]\` -- \`seats[1][4]\` -> Row 0 is done. The outer loop counts on, and the seat starts again at 0. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a 2D array and explain what the two numbers mean. → A cinema as a table -- I can read and write a slot with a row and a seat. → Reach a slot -- I can tell \`seats.length\` and \`seats[0].length\` apart. → Reach a slot -- I can explain in which order two nested loops visit the slots. → Two loops inside each other -- I can create and go through a two-dimensional array in Java. → Now in Java -::: - -## Quiz - -::: quiz -? How many slots does \`boolean[][] seats = new boolean[4][6]\` have? -→ A cinema as a table -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 rows with 6 seats each: 4 · 6 = 24. - -? What is in all slots after \`new boolean[3][5]\`? -→ A cinema as a table -- [ ] true -- [x] false -- [ ] Nothing, the slots are empty -> A new boolean array is filled with false. In the cinema that means: all seats are free. - -? Two nested loops run over 3 rows with 5 seats. How often does the inside of the **inner** loop run? -→ Two loops inside each other -- [ ] 3 times -- [ ] 8 times -- [x] 15 times -> For each of the 3 rows the inner loop runs 5 times: 3 · 5 = 15. - -? Match what each expression means in the cinema. -→ Reach a slot -= seats.length -> Number of rows -= seats[0].length -> Number of seats in row 0 -= seats[2][4] -> Row 2, seat 4 -= seats[1][0] = true -> Seat 0 in row 1 is sold - -? What does \`seats.length\` give for \`new boolean[3][5]\`? -→ Reach a slot -- [x] 3, the number of rows -- [ ] 5, the number of seats -- [ ] 15, all seats together -::: -`,qw=`--- -titel: Strings -bereich: Basics -kurz: Work with text: read single characters, cut out parts, search, compare and split. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the characters of a String are also counted from 0 -- work with \`length()\` and \`charAt(i)\` -- tell a \`char\` from a String and use the character code with \`(int)\` and \`(char)\` -- cut a part out of a text with \`substring\` -- use \`indexOf\`, \`contains\`, \`toUpperCase\` and \`equals\` -- go through a text character by character with a loop -- split a text into a String array with \`split\` -- read a text in Java and compare it with \`equals\` -- use more methods such as \`lastIndexOf\`, \`replace\`, \`compareTo\` and \`Integer.parseInt\` -- split a text from a file into lines with \`split("\\n")\` -- look up a method in the Java API and read its description -::: - -## Text is a row of characters - -You already know \`String\`: \`String name = "Ludwig"\`. In computer science such a text is called a **string**, because the characters hang one after another like beads on a string. Every character has a place with an index, just like in an array. Here, too, **counting starts at 0**: the first character is 0 steps away from the start. - -::: grafik zk-zeichen.svg -The nine characters of “Billygoat” with their indices 0 to 8. -::: - -A String comes with **methods**. You write the name of the variable, a dot and the method: - -- \`word.length()\` gives the number of characters, here 9. -- \`word.charAt(0)\` gives the character with the index 0, here \`'B'\`. - -> With Strings you write \`length()\` **with** brackets, with arrays \`length\` **without**. Sadly, that is just how Java is. - -Just like in an array, the last character has the index \`length() - 1\`. - -## A single character: char - -Java has its own data type for a single character: **char**, short for *character*. A \`char\` goes in **single** quotation marks, a String in double ones: - -- \`'C'\` is a \`char\`: exactly one character. -- \`"C"\` is a String: a text that is only one character long. -- A \`char\` always holds exactly one character. There is no empty \`char\` like \`''\`, but there is an empty String \`""\`. - -\`charAt\` gives you such a character from a text: - -\`\`\` -char first = word.charAt(0) -char last = word.charAt(word.length() - 1) -\`\`\` - -You compare two \`char\` values with \`==\`: \`word.charAt(0) == 'B'\` is \`true\`. - -Behind every character there is a number, its **character code**. Which number belongs to which character is listed in the ASCII table: \`'A'\` has the code 65, \`'B'\` 66, \`'C'\` 67 and so on up to \`'Z'\` with 90. With \`(int)\` you get the code of a character, with \`(char)\` a code turns back into a character: - -\`\`\` -int code = (int) 'C' -code = code + 1 -char next = (char) code -\`\`\` - -After that \`code\` is 68 and \`next\` is \`'D'\`. This is how you shift a letter in the alphabet, and that is exactly what you will need later for the Caesar cipher. - -## Cut out parts - -With \`substring\` you cut a part out of the text: - -- \`word.substring(0, 5)\` gives the characters from index 0 **up to just before** index 5, so \`"Billy"\`. -- \`word.substring(5)\` gives everything from index 5 to the end, so \`"goat"\`. - -The end is **not** included. Handy: \`substring(0, 5)\` gives exactly 5 characters. - -::: diagramm zk-zeichen.visustruct -All the methods from this lesson in one example. Go through it in the simulation and compare every output with the picture. -::: - -## Search and compare - -More methods you often need: - -| Method | Meaning | Example with \`"Billygoat"\` | -|---|---|---| -| \`indexOf("goat")\` | Where does the text start? | 5 | -| \`indexOf("x")\` | not found | -1 | -| \`contains("lly")\` | Does the text appear? | true | -| \`toUpperCase()\` | all capitals | BILLYGOAT | -| \`toLowerCase()\` | all small letters | billygoat | -| \`equals("Billygoat")\` | same text? | true | - -> In Java you compare two Strings with \`equals\`, not with \`==\`. Two single characters (\`char\`), on the other hand, you compare with \`==\`, e.g. \`word.charAt(i) == 'e'\`. - -::: angeberwissen -Try \`"Billygoat".equals("billygoat")\`. The answer is false! For a computer, B and b are completely different characters. Inside, every character is stored as a number: B is 66 and b is 98. This numbering is called ASCII and dates from 1963. Baah, so for a computer Ludwig and ludwig are two different goats. I am the one with the capital L. -::: - -## Character by character - -With a for loop you go through a text character by character. The index \`i\` runs from 0 to \`word.length() - 1\`, just like with an array: - -::: diagramm zk-zaehlen.visustruct -Counts how often the letter e appears. In the simulation, try “cheese” and watch i and count. -::: - -## Split with split - -Often several pieces of information sit in one single line, separated by a character, e.g. \`"Ludwig;billy goat;7"\`. With \`split\` you cut the line apart at this character. The result is a **String array**: - -\`\`\` -String[] parts = line.split(";") -\`\`\` - -After that, \`parts[0]\` is \`"Ludwig"\`, \`parts[1]\` is \`"billy goat"\` and \`parts[2]\` is \`"7"\`. With \`parts.length\` you find out how many parts there are. - -::: diagramm zk-split.visustruct -The line is split at the semicolon, and every part is output with its index. -::: - -> CSV files, which you know from spreadsheets, are built the same way: one line per record, the values separated by a comma or semicolon. - -## Exercise: Initials - -::: übung zk-initialen -titel: Initials -auftrag: Ask for a first name and a last name and output the initials. So for Ludwig Billygoat that is \`L. B.\` -test: Ludwig, Billygoat -> L. B. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: The initial is the first letter of a name. Which method gives the character at a particular place? -tipp: \`firstName.charAt(0)\` gives the first letter. The output is then \`firstName.charAt(0) + ". " + lastName.charAt(0) + "."\` -lösung: zk-initialen-loesung.visustruct -::: - -## Exercise: Backwards - -::: übung zk-rueckwaerts -titel: Backwards -auftrag: Ask for a word and output it backwards. Ludwig becomes \`giwduL\`. -test: Ludwig -> giwduL -test: Anna -> annA -test: a -> a -braucht: forSchleife -tipp: Go through the word character by character, but from back to front, and build a new text as you go. -tipp: Create \`String backwards = ""\`. The loop starts at the last index \`word.length() - 1\` and counts down to 0 with \`i--\`. In every pass you add \`word.charAt(i)\` at the end. -tipp: The outline: input \`word\`, then \`String backwards = ""\`. For loop with start \`int i = word.length() - 1\`, condition \`i >= 0\` and step \`i--\`. Inside it \`backwards = backwards + word.charAt(i)\`. Below the loop \`output: backwards\`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Exercise: Count words - -::: übung zk-woerter -titel: Count words -auftrag: Ask for a sentence and output how many words it has, e.g. \`Words: 4\` for “Ludwig is a goat”. The words are separated by exactly one space. -test: Ludwig is a goat -> Words: 4 -test: Hello -> Words: 1 -test: I like goats -> Words: 3 -braucht: anweisung -tipp: There is always a space between the words. Which method splits a text at a character? -tipp: Split the sentence into a String array with \`sentence.split(" ")\`. Its length is the number of words. -tipp: The whole program has three boxes: the input \`sentence\`, then \`String[] words = sentence.split(" ")\` and finally \`output: "Words: " + words.length\`. -lösung: zk-woerter-loesung.visustruct -::: - -## Now in Java - -The methods in this lesson already are Java. A whole program with a text looks like this: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("What is your name?"); -String name = scanner.next(); -System.out.println("Hello " + name.toUpperCase() + "!"); -System.out.println("Your name has " + name.length() + " letters."); -\`\`\` - -- \`scanner.next()\` reads one word, that is text up to the next space. For numbers you keep using \`scanner.nextInt()\`. -- Text goes in **double** quotes \`"Ludwig"\`, a single character in **single** quotes \`'L'\`. -- \`length()\`, \`toUpperCase()\` and the other methods always have round brackets after them, even when nothing is inside. -- You compare two texts with \`equals\`. Every letter counts: \`"Ludwig".equals("ludwig")\` is false. - -::: übung l17-java-passwort -titel: Check the password -code: java -auftrag: Write a Java program that asks for the password. If it is **Ludwig**, it outputs **Welcome!**, otherwise **Wrong password**. - Mind upper and lower case: \`ludwig\` is wrong. -test: Ludwig -> Welcome! -test: ludwig -> Wrong password -test: Geißbock -> Wrong password -braucht: verzweigung -tipp: Read the password with \`scanner.next()\` into a String variable. Then compare it in a selection. -tipp: The condition is \`input.equals("Ludwig")\`. In Java, \`==\` does not reliably compare texts. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Fill in the gaps: texts - -::: lückentext -titel: Examining a word -auftrag: Fill in the missing methods and words. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("A word?"); -[[String]] word = scanner.next(); -System.out.println("Length: " + word.[[length]]()); -System.out.println("Capitals: " + word.[[toUpperCase]]()); -System.out.println("First letter: " + word.[[charAt]](0)); -if (word.[[equals]]("Ludwig")) { - System.out.println("Hello Ludwig!"); -} -\`\`\` -erklärung: \`length()\` counts the characters, \`toUpperCase()\` makes everything upper case, \`charAt(0)\` gives the first character. You compare texts with \`equals\`, not with \`==\`. -::: - -## Find the bug: initials - -::: übung l17-java-fehler -titel: Fix the initials -code: java -auftrag: The program reads a first name and a last name and should output the initials. For Ludwig Geißbock that is **L. G.** But it outputs **u. e.** - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: At which index does Java start counting? -tipp: The first character has the index 0: \`first.charAt(0)\` and \`last.charAt(0)\`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l17-java-laeuft-nicht -titel: Count the letters -code: java -auftrag: The program should output the first letter and the length of **Ludwig**, so **L has 6 letters**. But it doesn’t run, because two methods are spelled wrong. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L has 6 letters -braucht: anweisung -tipp: Method names are camelCase too: they start small, and every further word starts with a capital. -tipp: Correct are \`name.charAt(0)\` with a capital A and \`name.length()\` all small. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Even more methods - -A String can do much more. You will often need these methods too: - -| Method | Meaning | Example | Result | -|---|---|---|---| -| \`lastIndexOf("l")\` | Where is the last l? | \`"Billygoat".lastIndexOf("l")\` | 3 | -| \`isEmpty()\` | Is the text empty? | \`"".isEmpty()\` | true | -| \`equalsIgnoreCase(…)\` | same text, whether upper or lower case? | \`"Billygoat".equalsIgnoreCase("BILLYGOAT")\` | true | -| \`replace(old, new)\` | replaces every occurrence | \`"Billygoat".replace("Billy", "Nanny")\` | Nannygoat | -| \`repeat(n)\` | the text n times in a row | \`"Baa".repeat(3)\` | BaaBaaBaa | -| \`concat(…)\` | adds text to the end, like \`+\` | \`"Billy".concat("goat")\` | Billygoat | -| \`compareTo(…)\` | Which comes first in the alphabet? | \`"Anna".compareTo("Ben")\` | -1 | - -\`compareTo\` returns a number: **negative** if the text comes earlier in the alphabet, **0** if both are the same, and **positive** if it comes later. You can use it to sort names. - -Two methods do not belong to a text but to a class. That is why the class name comes first: - -- \`Integer.parseInt("7")\` turns the text "7" into the number 7. You can calculate with it. -- \`String.valueOf(7)\` turns the number 7 into the text "7". - -::: diagramm zk-mehr.visustruct -All the new methods in one example. Go through it in the simulation and compare every output with the table. -::: - -## Text from a file - -Programs often get their text from a **file**. Princess Zora has written Ludwig a letter. It is ready as the file \`letter.txt\`: - -::: datei letter.txt -Dear Ludwig, -the fox has locked me in his tower. -The door has a lock with a secret word. -You can only find the word with Java. -Please help me! -Yours, Princess Zora -::: - -These lines read the whole file into a String: - -\`\`\` -import java.nio.file.*; - -String letter = Files.readString(Path.of("letter.txt")); -\`\`\` - -You will learn exactly how reading works later, in a lesson of its own about files. For now this is enough: afterwards the whole letter is in \`letter\`, with all its lines. - -At the end of every line there is an invisible character for the **line break**. In Java you write it as \`"\\n"\`. So \`letter.split("\\n")\` splits the letter into its lines. - -::: übung l17-java-brief -titel: Where is the fox? -code: java -auftrag: The start code already reads the letter. Split it into lines and output **Lines:** and the number of lines. Then find the line that contains **fox** and output **Fox in line** and its number. The first line has the number 1. -start: l17-java-brief-start.visustruct -test: - -> Lines: 6 | Fox in line 2 -braucht: forSchleife, verzweigung -tipp: \`String[] lines = letter.split("\\n");\` splits the letter. Then a for loop goes through all the lines. -tipp: In the loop you check \`lines[i].contains("fox")\`. The index starts at 0, so you output \`(i + 1)\`. You need the brackets so that Java calculates instead of adding 1 to the text. -lösung: l17-java-brief-loesung.visustruct -::: - -## The Java API - -Nobody knows all methods by heart, not even professionals. They look them up in the **Java API**. API stands for Application Programming Interface. It means the description of everything Java already brings along. - -You can find all methods of String here: [String in the Java API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Scroll down to the table **Method Summary**. Each row describes one method: - -| Column | Example | Meaning | -|---|---|---| -| Modifier and Type | \`int\` | What the method returns | -| Method | \`lastIndexOf(String str)\` | Name and parameters with their data type | -| Description | Returns the index within this string of the last occurrence … | What the method does | - -::: ludwig -The page is very long. Press Ctrl+F (on a Mac ⌘+F) and search for the name of the method to get there at once. -::: - -Look up these methods. They are not in this lesson: - -::: quiz -? Look up \`strip()\`. What does the method do? -- [ ] It removes all spaces in the text. -- [x] It removes the spaces at the beginning and the end. -- [ ] It cuts off the last character. -> Like \`trim()\`. But \`strip()\` also knows special spaces from other writing systems. - -? Look up \`isBlank()\`. What does \`" ".isBlank()\` return? -- [x] true -- [ ] false -- [ ] 3 -> isBlank checks whether the text is empty or only contains spaces. \`" ".isEmpty()\`, on the other hand, would be false. - -? Look up \`toCharArray()\`. Which data type does the method return? -- [ ] String -- [ ] String[] -- [x] char[] -> An array with all characters of the text, one element for each character. - -? Look up \`indexOf\` with two parameters. What does \`"Billygoat".indexOf("l", 3)\` return? -- [ ] 2 -- [x] 3 -- [ ] -1 -> The search only starts at index 3. The first l from there is at index 3. - -? Look up \`startsWith\`. Which data type does the method return? -- [x] boolean -- [ ] int -- [ ] String -> The column “Modifier and Type” says boolean: the answer is true or false. -::: - -## Game: Rescue the princess - -Now you help Ludwig. The fox has locked Princess Zora in his tower, and the gate only opens with a secret word. - -::: spiel prinzessin -titel: Game: Rescue the princess -intro: On the way to the tower Ludwig comes to **six stations**. Each one has a piece of Java code, and a number comes out. \`alphabet.charAt(number)\` turns the number into a letter that goes into the **crossword**. Solve the crossword, and the yellow squares spell the secret word for the gate. - -station: At the moat - String name = " Zora "; - int number = name.trim().length(); -frage: Which number is in \`number\`? -zahl: 4 -feld: 5 1 -tipp: \`trim()\` cuts off the spaces at the front and the back. Then count the characters. -> After \`trim()\` only \`"Zora"\` is left, and that is 4 characters. - -station: In the fox forest - String place = "Fox lair"; - int number = place.length(); -frage: Which number is in \`number\`? -zahl: 8 -feld: 4 4 -tipp: \`length()\` counts every character, the space too. -> F-o-x, the space and l-a-i-r make 8 characters. - -station: At the goat rock - String text = "Ludwig the goat"; - int number = text.indexOf(" "); -frage: Which number is in \`number\`? -zahl: 6 -feld: 4 6 -tipp: \`indexOf\` returns the position of the first space. The L has index 0. -> L u d w i g has the indexes 0 to 5, so the first space is at index 6. - -station: On the tower stairs - String word = "Princess"; - int number = word.indexOf("s", 7); -frage: Which number is in \`number\`? Look up \`indexOf(String str, int fromIndex)\` in the Java API. -zahl: 7 -feld: 6 6 -tipp: The search starts at index 7, and index 7 itself counts. Write the indexes under the letters. -> P r i n c e s s has the indexes 0 to 7. Searching from index 7, the first “s” is right at 7. - -station: In front of the fox den - int number = "Zora".compareTo("Zoe"); -frage: Which number is in \`number\`? -zahl: 13 -feld: 1 9 -tipp: \`compareTo\` looks for the first position where the texts differ and subtracts the character codes. \`'r'\` is 114, \`'e'\` is 101. -> “Zo” is the same, then \`'r'\` meets \`'e'\`: 114 − 101 = 13. - -station: At the tower gate - int number = Integer.parseInt("1" + "1") / 5; -frage: Which number is in \`number\`? -zahl: 2 -feld: 6 5 -tipp: First the texts are joined, then they become a number. With \`int\`, division drops the remainder. -> \`"1" + "1"\` is \`"11"\`, \`parseInt\` makes 11 of it, and 11 / 5 is 2 for whole numbers. - -kreuzwort: You already have the blue letters. Fill the other squares with Java terms. Click a clue to jump to its word. -- → 1 3 BOOLEAN: Data type for true or false -- → 4 1 STRING: Data type for text -- → 6 5 CHAR: Data type for a single character -- ↓ 1 6 LENGTH: Method that counts the characters of a string -- ↓ 2 1 ELSE: The “otherwise” part of a branch -- ↓ 3 3 BREAK: Jumps straight out of a loop -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: Ludwig stands in front of the gate. The lock compares your word with \`equals\`. Enter the secret word. - String word = "___"; - if (word.equals(secretWord)) { - gate.open(); - } -ende: Zora is free, and the fox has run off. The secret word was \`BREAK\`: with \`break\` you get out of any loop, and Zora gets out of the tower. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the characters of a String are also counted from 0. → Text is a row of characters -- I can work with \`length()\` and \`charAt(i)\`. → Text is a row of characters -- I can tell a \`char\` from a String and use the character code with \`(int)\` and \`(char)\`. → A single character: char -- I can cut a part out of a text with \`substring\`. → Cut out parts -- I can use \`indexOf\`, \`contains\`, \`toUpperCase\` and \`equals\`. → Search and compare -- I can go through a text character by character with a loop. → Character by character -- I can split a text into a String array with \`split\`. → Split with split -- I can read a text in Java and compare it with \`equals\`. → Now in Java -- I can use more methods such as \`lastIndexOf\`, \`replace\`, \`compareTo\` and \`Integer.parseInt\`. → Even more methods -- I can split a text from a file into lines with \`split("\\n")\`. → Text from a file -- I can look up a method in the Java API and read its description. → The Java API -::: - -## Quiz - -::: quiz -? What does \`"Ludwig".charAt(1)\` give? -→ Text is a row of characters -- [ ] L -- [x] u -- [ ] d -> Counting starts at 0: L has the index 0, u the index 1. - -? What is \`'C'\`? -→ A single character: char -- [x] a \`char\`, that is, exactly one character -- [ ] a String -- [ ] a variable called C -> Single quotation marks stand for a single character, a \`char\`. \`"C"\` in double ones would be a String. - -? \`'A'\` has the character code 65. What does \`(char) 67\` give? -→ A single character: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 is A, 66 is B, 67 is C. With \`(char)\` the code turns back into a character. - -? What does \`"Structure".substring(0, 6)\` give? -→ Cut out parts -- [x] Struct -- [ ] Structu -- [ ] tructu -> The characters with the indices 0 to 5. The end 6 is not included. - -? A word has 7 characters. Which index does the last character have? -→ Text is a row of characters -- [ ] 7 -- [x] 6 -- [ ] 8 -> Just like with an array: always one less than the length. - -? How do you compare two Strings for the same content in Java? -→ Search and compare -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Match each method to what it gives for \`"Billygoat"\`. -→ Search and compare -= length() -> 9 -= charAt(0) -> B -= indexOf("goat") -> 5 -= substring(5) -> goat - -? Which condition checks in Java whether \`input\` contains the text Ludwig? -→ Now in Java -- [ ] input = "Ludwig" -- [ ] input == 'Ludwig' -- [x] input.equals("Ludwig") -> You compare texts with equals. Single quotes are only for a single character. - -? What does \`Integer.parseInt("12") + 1\` return? -→ Even more methods -- [ ] "121" -- [x] 13 -- [ ] an error message -> parseInt turns the text into a number. After that Java calculates as usual. -::: -`,Uw=`--- -titel: Call and break -bereich: Basics -kurz: Split big tasks into subprograms and leave loops early. ---- - -## Skills I will gain now - -::: kompetenzen -- split a big task into smaller problems -- insert a call and build a subprogram in a tab of its own -- pass values to a subprogram with parameters -- hand back a return value with return and store it when calling -- explain why a subprogram cannot change a number but can change an array -- explain what a Break does and why it sits in a branch -- end a loop with a Break or through its condition -- recognise a method in Java and leave a loop with \`break\` -::: - -## Split big tasks - -Long structure charts quickly get confusing. That is why you split a big task into **smaller problems**. Every smaller problem gets a name of its own and a structure chart of its own, a **subprogram**. - -A quiz, for example, has three parts: greet, ask questions, show the result. The main program only names these three parts: - -::: diagramm l15-hauptprogramm.visustruct -The main program is made of just three calls. What happens in each part is in a structure chart of its own. -::: - -That way you see at a glance how the program is built. The details are somewhere else. - -## The call - -A **call** is a box with double vertical lines on the left and right. It means: run the subprogram with this name here, then carry on. - -- You drag **Call** from the Elements area and type the name into it, e.g. \`showGreeting()\`. -- The round brackets at the end show that it is a subprogram. That is how you write it in Java, Python and JavaScript, too. -- You build the subprogram itself as a structure chart of its own in a new tab. As the title you type the same name. - -::: diagramm l15-unterprogramm.visustruct -The subprogram showGreeting() as a structure chart of its own. -::: - -> **In the simulation:** When the simulation reaches a call, it looks among the open tabs for the structure chart with this title and runs it. Then it carries on in the main program. While the subprogram is running, the call box stays highlighted. A subprogram like this one, with only a name as its title, shares its variables with the main program. You will soon learn how a subprogram gets variables of its own. If there is no matching tab, the simulation skips the call and shows a note. - -::: angeberwissen -Why does your teacher always say “method” in Java and never “function” or “procedure”? Because in Java every subprogram has to belong to a class, and the subprograms of a class are called methods. The difference still exists, though: if a method hands back a result, it is really a function. If it has \`void\` in front, it hands back nothing and is really a procedure. Java just keeps it simple and calls both methods. So do I: my method is called Munching. -::: - -## Exercise: Add a call - -::: übung l15-titel -titel: Greeting with a call -auftrag: Imagine the subprogram \`showTitle()\` already exists. Build the main program: first it calls \`showTitle()\`. Then it asks for a name and outputs **Hello** and the name. - So when Ada is typed in, **Hello Ada** appears. -test: Ada -> Hello Ada -test: Ben -> Hello Ben -braucht: aufruf -tipp: The main program has three parts: the call, the input and the output. -tipp: Drag a Call from the Elements area right to the top and type \`showTitle()\` into it. Below it come the input \`input: String name "What is your name?"\` and the output. -lösung: l15-titel-loesung.visustruct -::: - -## Pass values: parameters - -Often a subprogram should work with values that are only known when it is called. Then it gets a **header line** as its title: - -\`\`\` -void showSum(int a, int b) -\`\`\` - -- \`void\` means: the subprogram does not hand back a result. -- \`showSum\` is the name. -- The brackets hold the **parameters**: variables with a data type that get their values when the subprogram is called. You separate several of them with commas. - -::: diagramm l15-zeige-summe.visustruct -The subprogram with the header line as its title. It calculates with a and b as if they were normal variables. -::: - -In the call box you write the values in the brackets, e.g. \`showSum(3, 4)\`. The first value goes into \`a\`, the second into \`b\`. Instead of numbers you can also use variables and calculations such as \`showSum(x, x + 1)\`. - -::: diagramm l15-zeige-summe-haupt.visustruct -The main program calls showSum twice with different values. Open both diagrams and start the simulation here. -::: - -> **Local variables:** The parameters and all variables created in the subprogram belong only to the subprogram. It gets **copies** of the values; more on that below under call by value. During the call, the simulation only shows the variables of the subprogram. - -## Hand back a result: return - -A subprogram can also hand back a result, the **return value**. Then the header line has the data type of the result instead of \`void\`: - -\`\`\` -int square(int x) -\`\`\` - -The statement \`return result\` hands back the value and ends the subprogram straight away. When you call it, you store the result in a variable: after \`int q = square(5)\`, \`q\` holds the value 25. - -::: diagramm l15-quadrat.visustruct -The subprogram square calculates and hands back the result with return. -::: - -::: diagramm l15-quadrat-haupt.visustruct -The main program stores the return value in q. Open both diagrams and try the simulation. -::: - -> A subprogram with a return value has to end with \`return\`. If the return is missing, the simulation reports an error. - -In the **code view**, the header line becomes a Java method (\`public static int square(int x)\`), a \`def\` in Python and a \`function\` in JavaScript. If the subprograms are open in other tabs, they appear in the code together with the main program. - -## Exercise: Calculate the area - -::: übung l15-flaeche -titel: Calculate the area -auftrag: Build two diagrams. The subprogram \`int area(int a, int b)\` hands back the area of a rectangle, that is a times b. The main program asks for the length and the width, calls \`area\` and outputs **Area:** and the result. - With 3 and 4, **Area: 12** appears. -test: 3, 4 -> Area: 12 -test: 5, 5 -> Area: 25 -test: 7, 0 -> Area: 0 -braucht: aufruf -tipp: You build two diagrams: a subprogram that only calculates and hands back the result, and a main program for input and output. -tipp: Open a new tab with **+** and give it the title \`int area(int a, int b)\`. One statement is enough inside: \`return a * b\`. In the main program you type \`int f = area(length, width)\` into the call box. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Copy or original: call by value and call by reference - -What happens if a subprogram changes its parameter? That depends on **what** is passed. - -**Call by value:** With \`int\`, \`double\`, \`boolean\`, \`char\` and \`String\`, the subprogram gets a **copy** of the value. If it changes its parameter, the caller's variable stays as it was. - -**Call by reference:** With an **array**, the subprogram does not get a copy but a reference to the same array. If it changes a slot, the slot is changed for the caller too. The header line for this looks like this: - -\`\`\` -void clear(boolean[] seats) -\`\`\` - -::: grafik uebergabe.svg -At the top, doubleIt gets a copy of number. At the bottom, row and seats point to the same array. -::: - -Try out both. Open the three diagrams and start the simulation in the main program: - -::: diagramm uebergabe-verdopple.visustruct -doubleIt only changes its copy x. -::: - -::: diagramm uebergabe-leeren.visustruct -clear sets all seats to false, for example when a showing is cancelled. -::: - -::: diagramm uebergabe-haupt.visustruct -number is still 5 after the call. The seats in row, on the other hand, are free after the call. -::: - -> If you want to get a number back from a subprogram, use \`return\`, e.g. \`number = doubleIt(number)\` with the header line \`int doubleIt(int x)\`. An array, on the other hand, can be changed by the subprogram directly. - -::: angeberwissen -Strictly speaking, Java only knows call by value. But with an array, the whole array is not copied, only its **address** in memory. With the copied address, the subprogram finds the same array. It is as if I gave you a copy of my locker key: the key is copied, but the hay in the locker only exists once. -::: - -## Exercise: Bonus points - -::: übung uebergabe-bonus -titel: Bonus points -auftrag: The main program calls \`bonus(points)\` and then outputs all the points. Build the subprogram \`void bonus(int[] points)\` that increases every score in the array by 1. Instead of 3, 5 and 8 you then see **4**, **6** and **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: The main program is already finished. You only build the subprogram in a new tab. -tipp: Open a new tab with **+** and the title \`void bonus(int[] points)\`. Inside, a for loop runs over all slots and calculates \`points[i] = points[i] + 1\`. You do not need a return, because the array is changed directly. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## The break - -Sometimes a loop should end **early**, in the middle of its body. That is what the **Break** is for. It leaves the loop it is in straight away. The program carries on with the first box after the loop. In Java, Python and JavaScript this is called \`break\`. - -You recognise the Break by the point on its left edge. You can write a short comment into the box, e.g. \`Leave the loop\`. It appears in the code as a comment after \`break\`. - -A Break almost always sits in a **branch**: the loop is only left if a condition is met. - -A typical case is the **endless loop with a Break**. The loop itself has no condition. It runs until the Break is reached: - -::: diagramm l15-endlos-aussprung.visustruct -The loop keeps asking for a number. With 0 it jumps out, otherwise it adds the number to the sum. -::: - -Without a Break, an endless loop would really never end. - -## Break in the simulation - -The simulation runs the Break like \`break\`: it leaves the innermost loop and carries on after it. If a Break is outside every loop, the subprogram ends; in the main program, the whole program ends. \`return\` does the same. - -Often you can do without a Break altogether: you write the stop condition straight into the loop. That is usually even clearer. - -## Exercise: Sum until 0 - -::: übung l15-bis-null -titel: Sum until 0 -auftrag: Rebuild the program “Sum until 0” **without** a Break. It keeps asking for whole numbers until someone types 0. Then it outputs **Sum:** and the sum of all the numbers typed in. -test: 3, 4, 0 -> Sum: 7 -test: 0 -> Sum: 0 -test: 10, -2, 5, 0 -> Sum: 13 -tipp: Without a Break, the condition of the loop itself has to check whether 0 was typed in. -tipp: Ask for the first number before the loop. The while loop runs with the condition \`number != 0\`. In the body you add the number to the sum and then ask for the next number. For the second input you only write \`input: number "…"\`, because \`number\` already exists. -lösung: l15-bis-null-loesung.visustruct -::: - -## Now in Java - -In Java a subprogram is called a **method**. The square from above looks like this: - -\`\`\`java -public static int square(int x) { - int result = x * x; - return result; -} -\`\`\` - -The main program calls the method by its name and passes the value in round brackets: - -\`\`\`java -int q = square(number); -System.out.println("The square is " + q); -\`\`\` - -- In the header, what the method returns (\`int\`) comes before the name. If it returns nothing, it says \`void\`. -- The parameters go in the round brackets with their data type: \`(int x)\`. You separate several with commas. -- In the Code area you write every method in its own tab, just as every subprogram has its own structure chart. -- In Java the exit is called \`break\`. With \`while (true)\` you build a loop that only ends through \`break\`. - -::: übung l18-java-kasse -titel: Till with break -code: java -auftrag: Write a till in Java. It keeps asking for a price in whole euros. At 0 it leaves the loop with \`break\`. Then it outputs how many items there were and what they cost altogether. - For 3, 4 and then 0 you see **Items: 2** and **Total: 7**. -test: 3, 4, 0 -> Items: 2 | Total: 7 -test: 0 -> Items: 0 | Total: 0 -test: 10, 2, 5, 0 -> Items: 3 | Total: 17 -braucht: endlosschleife, aussprung -tipp: You need two variables that start at 0 before the loop: one for the sum and one for the count. -tipp: Inside \`while (true) { … }\` you read the price. Right after that you check \`if (price == 0) { break; }\`. Only after that do you add the price to the sum and increase the count by 1. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Fill in the gaps: methods and break - -::: lückentext -titel: Method and exit -auftrag: Fill in the missing words. At the top is the method that calculates a square. Below is the main program that calls it. In the Code area both are in tabs of their own. -\`\`\`java -public static [[int]] square(int x) { - [[return]] x * x; -} -\`\`\` -\`\`\`java -int number = 1; -while ([[true]]) { - int q = [[square]](number); - if (q > 50) { - [[break]]; - } - System.out.println(q); - number = number + 1; -} -\`\`\` -erklärung: \`int\` before the method name means: the method returns a whole number, with \`return\`. If a method returns nothing, it says \`void\` there. \`while (true)\` runs endlessly until \`break\` leaves the loop. Output: 1, 4, 9, 16, 25, 36 and 49. -::: - -## Find the bug: guessing - -::: übung l18-java-fehler -titel: Fix the try counter -code: java -auftrag: In this guessing game the secret number is 7. The program keeps asking for a guess until 7 comes, then it outputs the number of tries. For 3, 5 and 7 that was 3 tries, but the program says **Tries: 2**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Tries: 3 -test: 7 -> Tries: 1 -test: 1, 2, 3, 7 -> Tries: 4 -braucht: endlosschleife, aussprung -tipp: What happens with the right guess? Is it still counted before \`break\` leaves the loop? -tipp: Count first, then check: \`tries = tries + 1;\` belongs before the \`if\` with the \`break\`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Game: What comes back? - -::: spiel frage -titel: Game: What comes back? -intro: Ludwig calls methods and jumps out of loops. Predict what is output. Seven rounds. - -runde: - public static int square(int x) { - return x * x; - } - - int q = square(5); - System.out.println(q); -frage: What is output? -- 5 -- 10 -- [x] 25 -> The call puts 5 into x, and return gives back 5 · 5. - -runde: - public static void showSum(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - showSum(x, x + 1); -frage: What is output? -- [x] 5 -- 23 -- 3 -> The first value 2 goes into a, the second value 3 into b. In Java, \`a + b\` calculates with numbers as usual. - -runde: -frage: What does a method return when \`void\` stands in front of its name? -- a whole number -- [x] nothing -- always 0 -> \`void\` means: no return value. With \`int\` there, a whole number comes back. - -runde: - public static void doubleIt(int x) { - x = x * 2; - } - - int number = 5; - doubleIt(number); - System.out.println(number); -frage: What is output? -- [x] 5 -- 10 -- 0 -> Call by value: doubleIt gets a copy. number stays 5. - -runde: - public static void clear(boolean[] seats) { - for (int i = 0; i < seats.length; i++) { - seats[i] = false; - } - } - - boolean[] row = {true, true}; - clear(row); - System.out.println(row[0]); -frage: What is output? -- true -- [x] false -> With an array, row and seats point to the same array. The caller sees the change too. - -runde: - int sum = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - sum = sum + i; - } - System.out.println(sum); -frage: What is output? -- [x] 6 -- 10 -- 55 -> At i = 4, \`break\` jumps out of the loop straight away. Only 1 + 2 + 3 have been added. - -runde: - int number = 1; - while (true) { - number = number * 3; - if (number > 20) { - break; - } - } - System.out.println(number); -frage: What is output? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Only 27 is greater than 20, then the endless loop ends with break. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can split a big task into smaller problems. → Split big tasks -- I can insert a call and build a subprogram in a tab of its own. → The call -- I can pass values to a subprogram with parameters. → Pass values: parameters -- I can hand back a return value with return and store it when calling. → Hand back a result: return -- I can explain why a subprogram cannot change a number but can change an array. → Copy or original: call by value and call by reference -- I can explain what a Break does and why it sits in a branch. → The break -- I can end a loop with a Break or through its condition. → Break in the simulation -- I can recognise a method in Java and leave a loop with \`break\`. → Now in Java -::: - -## Quiz - -::: quiz -? What does a call box with the text \`showResult()\` mean? -→ The call -- [ ] The program ends here. -- [x] The subprogram showResult() runs here, and then the program carries on. -- [ ] The word showResult() is output here. - -? Where does the program carry on after a Break? -→ The break -- [ ] At the start of the loop -- [x] At the first box after the loop -- [ ] Right at the start of the program -> The Break leaves the loop it is in. In Java, Python and JavaScript it is called break. - -? Why does a Break usually sit in a branch? -→ The break -- [x] So that the loop is only left if a condition is met -- [ ] Because otherwise a Break cannot be saved -- [ ] Because a branch is a loop itself -> Without a branch, the loop would be left in the very first pass. - -? Where does the simulation find the subprogram for a call \`showResult()\`? -→ The call -- [ ] It has to be in the same structure chart. -- [x] In an open tab with the title showResult() -- [ ] The simulation cannot run subprograms. -> Build every subprogram in a tab of its own and give it the name from the call as its title. - -? The subprogram has the header line \`void showSum(int a, int b)\`. Which call fits? -→ Pass values: parameters -- [ ] showSum() -- [x] showSum(3, 4) -- [ ] int s = showSum(3, 4) -> Two parameters need two values. And \`void\` means nothing comes back that you could store. - -? After \`int q = square(5)\`, q holds 25. What is at the end of the subprogram square? -→ Hand back a result: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> With return the subprogram hands the value back to the call. An output would only show it. - -? \`void doubleIt(int x)\` calculates \`x = x * 2\`. The main program has \`int number = 5\` and then the call \`doubleIt(number)\`. What value does number have afterwards? -→ Copy or original: call by value and call by reference -- [x] 5 -- [ ] 10 -- [ ] 0 -> Call by value: doubleIt only changed a copy of number. - -? \`void clear(boolean[] seats)\` sets all slots to false. What is true for the array row in the main program after \`clear(row)\`? -→ Copy or original: call by value and call by reference -- [ ] It is unchanged, because the subprogram gets a copy. -- [x] All slots are false, because seats and row are the same array. -- [ ] The array is deleted. -> Call by reference: an array is passed as a reference. The caller sees changes to the slots too. - -? What is a subprogram called in Java? -→ Now in Java -- [ ] Class -- [x] Method -- [ ] Loop -> In Java a subprogram is a method, for example the \`main\` method. Depending on its kind, it is also called a procedure or a function. - -? Many building blocks have a second name in textbooks. Match each term from VisuStruct to its other name. -→ Now in Java -= Branch -> Conditional statement -= Switch -> Multiple selection -= Loop -> Iteration -= Subprogram -> Method -> Both names mean the same thing. If you know one of them, you understand the other as well. - -? What is written in the header of a Java method that returns nothing? -→ Hand back a result: return -- [ ] int -- [x] void -- [ ] return -> void means “empty”: the method does something but returns no value. -::: -`,Qw=`--- -titel: Searching and sorting -bereich: Basics -kurz: Use playing cards to understand how linear search, binary search and bubble sort work, and why some methods are much faster. ---- - -## Skills I will gain now - -::: kompetenzen -- explain how linear search goes through an array -- build a linear search as a structure chart -- explain why binary search only works with sorted values -- explain why binary search is much faster with many values -- show one round of bubble sort with playing cards -- search an array in Java and count matches -::: - -## Look for a card - -A pile of playing cards lies face down in a row in front of you. You are looking for the 9. What do you do? You turn over one card after another until you find the 9 or have turned over all the cards. - -::: grafik ss-lineare-suche.svg -The cards are mixed up. Every card you turn over is one comparison: is this the 9? -::: - -This is exactly how **linear search** works: it goes through the array from index 0 to the end and compares every slot with the value it is looking for. It always works, even if the values are mixed up. - -In the array our cards are numbers. We leave out jack, queen and king. - -::: diagramm ss-lineare-suche.visustruct -The loop runs until the card is found or there is no slot left. The variable comparisons counts how often a comparison was made. In the simulation, look for the 2, the 27 and the 4. -::: - -> If the card is not there, \`position\` stays at **-1**. There is no index -1, so here -1 means “not found”. - -## Exercise: Find a card - -::: übung ss-karte-suchen -titel: Find a card -auftrag: Create the array \`int[] cards = {8, 4, 11, 4, 6}\` and ask for a card. Output the position of the **first** matching card, e.g. \`Position: 1\` for the 4. If the card is not there, output \`Not found\`. -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 8 -> Position: 0 -test: 9 -> Not found -braucht: whileSchleife, verzweigung -tipp: Go through the array from front to back and compare every card with the one you are looking for. -tipp: Rebuild the example above. You do not need the variable comparisons here. The loop has to stop as soon as \`position\` is no longer -1, otherwise for the 4 you find the second one instead of the first. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Binary search: sorted is faster - -Now the cards lie in front of you **sorted**, from small to large. You are looking for the 27. You no longer turn over the first card at the front, but the **middle** one: - -- If it is the one you are looking for, you are done. -- If it is smaller, the card you are looking for can only be on the right. The whole left half drops out. -- If it is larger, the right half drops out. - -You do the same again with the rest. With every comparison the pile is halved. - -::: grafik ss-binaere-suche.svg -Three comparisons instead of fourteen: with every middle, half of the remaining cards drop out. -::: - -In the structure chart, two variables remember the range that is still being searched: \`left\` and \`right\`. The middle is \`(left + right) / 2\`. Because this is whole-number division, the result is always a whole index. - -::: diagramm ss-binaere-suche.visustruct -The same array as for the linear search. In the simulation, look for the 27 again and compare the output Comparisons with the linear search. -::: - -> Binary search **only works with sorted values**. With mixed-up cards, after looking at the middle you do not know which half to keep searching in. - -::: angeberwissen -I think of a number from 1 to 100. You may guess, and I only say “higher” or “lower”. With binary search you need at most **7** guesses. For a number up to a million it is at most 20, for a billion 30. Every doubling costs only one single extra guess. This is how databases search millions of entries in a fraction of a second. I search linearly, by the way: I eat the meadow from left to right. -::: - -## How fast is it? - -How good a method is gets measured by the number of comparisons it needs **in the worst case**. For linear search, that is the case where the card is right at the back or missing. - -::: grafik ss-vergleiche.svg -With 100 cards, linear search needs up to 100 comparisons, binary search at most 7. -::: - -| Number of cards | Linear search | Binary search | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1,000 | 1,000 | 10 | -| 1,000,000 | 1,000,000 | 20 | - -Linear search grows at the same rate as the number of cards. With binary search, twice as many cards add only **one** comparison. - -## Sorting with bubble sort - -For binary search the values must be sorted. One of the simplest ways of sorting is **bubble sort**. You go through the row from left to right and always compare **two neighbours**. If the larger card is on the left, you swap the two. - -::: grafik ss-bubblesort.svg -After one round, the largest card is on the far right. -::: - -After the first round the largest card is on the far right, like an air bubble rising to the top. That is where the name comes from. Then you repeat the round for the remaining cards. With 5 cards you need 4 rounds. - -The structure chart has two for loops inside each other. The outer one counts the rounds, the inner one compares the neighbours \`cards[i]\` and \`cards[i + 1]\`. You already know how to swap: it needs a **temporary variable**. - -::: diagramm ss-bubblesort.visustruct -The inner loop gets shorter with every round, because the largest cards on the right are already in the right place. Go through it in the simulation with Step and watch the array under Variables. -::: - -Bubble sort is easy to understand, but slow. With n cards it needs up to n · (n − 1) / 2 comparisons: with 10 cards 45, with 100 cards already 4,950 and with 1,000 cards almost half a million. You may get to know faster methods such as quicksort later. - -## Exercise: Sort descending - -::: übung ss-absteigend -titel: Sort descending -auftrag: The start diagram reads in 5 cards and sorts them with bubble sort **ascending**, that is from small to large. Change it so that the cards are output **descending**, the largest first. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Look at the condition in the branch. It decides when two neighbours are swapped. -tipp: You only need to change one single character. When should two neighbours be swapped if the larger card is supposed to go to the left? -tipp: In the branch, change \`cards[i] > cards[i + 1]\` to \`cards[i] < cards[i + 1]\`. Then two neighbours swap when the bigger card is on the right, and the big card moves to the left. -lösung: ss-absteigend-loesung.visustruct -::: - -## Now in Java - -The linear search from the exercise looks like this in Java: - -\`\`\`java editor -int[] cards = {8, 4, 11, 4, 6}; -int wanted = 4; -int position = -1; -int i = 0; -while (position == -1 && i < cards.length) { - if (cards[i] == wanted) { - position = i; - } - i = i + 1; -} -System.out.println("Position: " + position); -\`\`\` - -- \`&&\` means “and”: the loop only runs while nothing has been found **and** there are still cards left. -- If the false branch is empty, you simply leave out \`else\`. -- The swap in bubble sort needs a helper variable in Java too: \`int temp = cards[i];\` - -::: übung l19-java-zaehlen -titel: Count cards -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. Write a Java program that asks for a card and counts how often it appears. It outputs **Count:** and the number. - For 4 you see **Count: 2**. -test: 4 -> Count: 2 -test: 8 -> Count: 1 -test: 9 -> Count: 0 -braucht: forSchleife, verzweigung -tipp: Unlike the search, you do not stop at the first match. A for loop goes through all cards. -tipp: \`for (int i = 0; i < cards.length; i++)\` and inside it \`if (cards[i] == wanted) { count = count + 1; }\`. \`count\` starts at 0 before the loop. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Fill in the gaps: bubble sort - -::: lückentext -titel: Sorting cards -auftrag: The program sorts the cards in ascending order with bubble sort. Fill in the missing words and symbols. -\`\`\`java -int[] cards = {5, 2, 8, 1}; -for (int round = 0; round < cards.[[length]] - 1; round++) { - for (int i = 0; i < cards.length - 1; i++) { - if (cards[i] [[>]] cards[i + 1]) { - [[int]] temp = cards[i]; - cards[i] = cards[i + 1]; - cards[i + 1] = [[temp]]; - } - } -} -for (int i = 0; i < cards.length; i++) { - System.out.println(cards[i]); -} -\`\`\` -erklärung: If a card is larger than its right neighbour, the two are swapped, with a helper variable as when swapping glasses. After \`length - 1\` rounds everything is sorted: 1, 2, 5, 8. -::: - -## Find the bug: search - -::: übung l19-java-fehler -titel: Fix the linear search -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. The program should output the **first** position of the card you are looking for, so for 4 **Position: 1**. But it outputs **Position: 3**. - “Open in editor” shows the code in the Code area. Find the bug, fix it and click Check. -start: l19-java-fehler-start.visustruct -test: 4 -> Position: 1 -test: 6 -> Position: 4 -test: 9 -> Position: -1 -test: 8 -> Position: 0 -braucht: whileSchleife, verzweigung -tipp: The loop always runs up to the last card. What happens when the 4 comes a second time? -tipp: The loop should stop as soon as something has been found: \`while (position == -1 && i < cards.length)\`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Why doesn’t it run? - -::: übung l19-java-laeuft-nicht -titel: Find a card -code: java -auftrag: The cards {8, 4, 11, 4, 6} are in an array. The program searches for the 11 and should output **Position: 2**. But it doesn’t run. - “Open in editor” shows the code in the Code area. Click “Run” and read the error message. Fix the bug and click Check. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Position: 2 -braucht: forSchleife, verzweigung -tipp: Compare the names in the condition with the names created above. -tipp: The card you are looking for is in \`wanted\` with a small w: \`if (cards[i] == wanted) {\` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Game: Search pro - -::: spiel frage -titel: Game: Search pro -intro: Ludwig searches and sorts cards. How fast is it, and what comes out? Seven rounds. - -runde: - int[] cards = {8, 4, 11, 4, 6}; - int wanted = 4; - int position = -1; - int i = 0; - while (position == -1 && i < cards.length) { - if (cards[i] == wanted) { - position = i; - } - i = i + 1; - } - System.out.println("Position: " + position); -frage: What is output? -- [x] Position: 1 -- Position: 3 -- Position: 2 -> The search stops at the first 4. It lies in slot 1, counting from 0. - -runde: - int[] cards = {8, 4, 11, 4, 6}; - int wanted = 7; -frage: With the same linear search: what is in position afterwards? -- 0 -- 5 -- [x] -1 -> The 7 isn't there. position stays -1, which means "not found". - -runde: -frage: For which cards does binary search work? -- for all of them -- [x] only for sorted ones -- only for fewer than 100 -> Only if the cards are sorted do you know, after looking at the middle, in which half to keep searching. - -runde: -frage: How many comparisons does binary search need at most for 100 cards? -- 50 -- [x] 7 -- 100 -> Every comparison halves the pile. Halving 7 times is enough for up to 128 cards, so for 100 as well. - -runde: -frage: Instead of 1,000 cards there are now 2,000. How many more comparisons does binary search need at most? -- [x] one -- twice as many -- 1,000 -> The first comparison halves 2,000 to 1,000. After that it goes on as before. - -runde: - int[] cards = {5, 3, 8, 1}; -frage: One pass of bubble sort compares two neighbours at a time, from left to right. What is the order of the cards afterwards? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 and 3 swap, 5 and 8 stay, 8 and 1 swap. The biggest card is on the far right. - -runde: -frage: Bubble sort swaps \`cards[i]\` and \`cards[i + 1]\`. What does it need for that? -- [x] a temporary variable -- a second array -- a binary search -> Just like swapping two variables: \`int temp = cards[i];\`, otherwise a value gets lost. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain how linear search goes through an array. → Look for a card -- I can build a linear search as a structure chart. → Exercise: Find a card -- I can explain why binary search only works with sorted values. → Binary search: sorted is faster -- I can explain why binary search is much faster with many values. → How fast is it? -- I can show one round of bubble sort with playing cards. → Sorting with bubble sort -- I can search an array in Java and count matches. → Now in Java -::: - -## Quiz - -::: quiz -? What does binary search need? -→ Binary search: sorted is faster -- [ ] The array must have exactly 100 slots. -- [x] The values must be sorted. -- [ ] The value you are looking for must be there. -> Only with sorted values do you know, after looking at the middle, which half to keep searching in. - -? A sorted array has 1,000 values. How many comparisons does binary search need at most? -→ How fast is it? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1,000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: after about 10 halvings, one value is left. - -? What does bubble sort compare in every step? -→ Sorting with bubble sort -- [ ] The first and the last card -- [x] Two neighbouring cards -- [ ] Every card with the middle -> If the larger card is on the left, the neighbours are swapped. - -? Where is the largest card after the first round of bubble sort? -→ Sorting with bubble sort -- [ ] On the far left -- [ ] In the middle -- [x] On the far right -> It is swapped on with every comparison and rises to the right like a bubble. - -? What does \`position = -1\` mean in linear search? -→ Look for a card -- [x] The card has not been found (yet). -- [ ] The card is right at the back. -- [ ] The array is empty. - -? Match each method to the right description. -→ Look for a card -= Linear search -> look at one card after another -= Binary search -> look at the middle and drop one half -= Bubble sort -> compare neighbours and swap them - -? Why do you use a for loop for counting and not a search that stops at the first match? -→ Now in Java -- [ ] A for loop is always faster. -- [x] You have to look at every card, otherwise later matches are missing. -- [ ] A while loop cannot go through arrays. -> The card can appear several times. That is why you go through all cards to the end. -::: -`,$w=`--- -titel: Structure chart and code -bereich: From structure chart to code -kurz: All elements in Java at a glance, generate code, write Java in the Code area, run it and find mistakes. ---- - -## Skills I will gain now - -::: kompetenzen -- open the code view and choose Java as the language -- recognise output, input, branches and loops in Java -- explain the difference between Snippet and Class -- explain how Java code runs on every operating system with the compiler, bytecode and the JVM -- tell the JDK and the JRE apart -- explain why a C++ program has to be compiled again for every operating system but a Java program does not -- rebuild a short Java program as a structure chart -- type Java in the Code area and read the structure chart that is built -- run a program with ▶︎ and use input and output in the console -- find a syntax error or a runtime error by its red line number -- set breakpoints and follow a program step by step -::: - -## The code view - -In lessons 4 to 19 you have already written every element in Java. Here you see everything at a glance and learn how VisuStruct turns a whole structure chart into a Java program. - -A structure chart describes a process. For a computer to run it, you need a program in a programming language. VisuStruct writes this code for you. - -Click [Code](#zeige-code) in the tools (icon with angle brackets). On the right, the **Code generator** appears: - -- At the top you choose the language: **Java**, **Python** or **JavaScript**. -- For Java you also choose under **Java output** between **Snippet** (only the statements) and **Class** (a complete Java file). -- **Diagram text as comments** writes the text of every box as a comment above the code. -- **Copy** puts the code on the clipboard, **Save Java…** saves a \`.java\` file. - -The code changes straight away whenever you change something in the structure chart. - -::: angeberwissen -Later on, Nassi worked on the programming language Ada and was in charge of software at Apple. So if you invent structure charts, you do not end up in a goat shed, you end up at Apple. -::: - -::: diagramm l17-beispiel.visustruct -A small program with an input, a for loop and a branch. Open it and look at the Java code for it. -::: - -## This is the example in Java - -For the diagram above, VisuStruct generates this code as a **Snippet**: - -\`\`\` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Which times table?"); -int number = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int result = number * i; - System.out.println(i + " times " + number + " = " + result); -} -if (number > 10) { - System.out.println("That was hard!"); -} else { - System.out.println("That was easy."); -} -\`\`\` - -In Java every statement ends with a **semicolon** \`;\`. Whatever is inside a box goes in **curly brackets** \`{ }\` in Java. The indentation shows you what belongs together. - -## The elements in Java - -| Element | Java | Lesson | -|---|---|---| -| Statement | \`int sum = 0;\` | 4, 5 | -| Output | \`System.out.println(sum);\` | 6 | -| Input | \`int number = scanner.nextInt();\` | 6 | -| Branch | \`if (condition) { … } else { … }\` | 8, 9 | -| Switch | \`switch (value) { case 1 -> { … } default -> { … } }\` | 10 | -| While loop | \`while (condition) { … }\` | 11 | -| Do-while loop | \`do { … } while (condition);\` | 12 | -| For loop | \`for (int i = 0; i < 5; i++) { … }\` | 13 | -| Endless loop | \`while (true) { … }\` | 11, 18 | -| Break | \`break;\` | 18 | -| Call | \`calculate();\` | 18 | -| Array | \`int[] numbers = new int[5];\` | 15, 16 | -| Text (String) | \`String name = scanner.next();\` | 17 | - -For input, \`import java.util.Scanner;\` and \`Scanner scanner = new Scanner(System.in);\` are written once at the very top. Before every input VisuStruct outputs the question with \`System.out.println(…)\`. - -If the false path of a branch is empty, VisuStruct still generates an \`else\` part that contains only the comment \`// empty element\`. If you switch off **Emit empty else branch in code**, the empty \`else\` part disappears. - -## Snippet or Class - -You can paste a **Snippet** into the \`main\` method of an existing Java program. With **Class** you get a complete file that you can compile and run straight away: - -\`\`\` -import java.util.Scanner; - -public class TimesTable { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Which times table?"); - int number = scanner.nextInt(); - ... - } // end main -} // end class -\`\`\` - -The comments \`// end main\` and \`// end class\` after the last two brackets are not needed, but very helpful: you see at once which bracket closes what, and you don't forget one. - -The name of the class comes from the **title** of the diagram. The file must have exactly the same name, so here \`TimesTable.java\`. **Save Java…** takes care of that for you. - -> The generated code is a good start, but check it. If you first create a variable and later read it in again with an input, VisuStruct still writes \`int pin = scanner.nextInt();\`. Java then reports that \`pin\` already exists. Simply delete the \`int\` in that line. - -## How Java runs on every computer - -Your file \`TimesTable.java\` is **source code**: text for people. The processor in your computer cannot understand it directly. That is why Java runs in two steps: - -1. The **compiler** \`javac\` translates the source code into **bytecode**. The result is the file \`TimesTable.class\`. -2. The **JVM** (Java Virtual Machine) reads the bytecode and, while running it, translates it into **machine code**: instructions for the processor in your computer. - -::: grafik l20-jvm.svg -Compile once: the same bytecode runs on every JVM. -::: - -There is only one bytecode. But there is a JVM for Windows, macOS, Linux and many other systems. That is why the same \`.class\` file runs on every computer that has a JVM installed. This is called **platform independent**. The slogan for it is **“Write once, run anywhere”**. - -::: angeberwissen -One of the first compilers was built in 1952 by **Grace Hopper**, whom you already know from lesson 7. Back then many people told her that computers could only do arithmetic and could not translate programs. She did it anyway. -::: - -Compare this with **C++**: there the compiler translates the source code directly into machine code for exactly one processor and one operating system. The finished program only runs there. For Windows, macOS and Linux you have to compile it again each time. - -::: grafik l20-cpp.svg -C++ is compiled to machine code separately for every system. -::: - -| | C++ | Java | -|---|---|---| -| The compiler creates | machine code | bytecode | -| How often do you compile? | again for every system | once | -| What does the computer need to run it? | nothing else | a JVM | - -Does that make Java slower? Hardly. Parts of a program that run often, loops for example, are translated completely into machine code once by the JVM’s **JIT compiler** (“just in time”). After that they run almost as fast as C++. - -> Think of the JVM as a small computer made of software, almost like an operating system of its own just for Java programs. Strictly speaking it is not an operating system, though, but a **virtual machine**: a program that itself runs on Windows, macOS or Linux and pretends to be a computer inside it. - -When you install Java you meet two abbreviations: - -| Abbreviation | What is inside? | What for? | -|---|---|---| -| **JRE** (Java Runtime Environment) | the JVM and ready-made building blocks such as \`Scanner\` | running Java programs | -| **JDK** (Java Development Kit) | the JRE plus the compiler \`javac\` and other tools | writing and compiling Java programs | - -So to program you need the JDK. Today you usually only download the JDK, the JRE is inside it. For VisuStruct in the browser you don't need to install any of this. - -::: angeberwissen -With a JDK you can do all of this yourself in the console, that is in the terminal or the command prompt: - -\`\`\` -java -version -javac TimesTable.java -java TimesTable -\`\`\` - -- \`java -version\` shows which Java version is installed. If you get an error message, Java is still missing. -- \`javac TimesTable.java\` starts the compiler. Afterwards there are two files in the folder: \`TimesTable.java\` with your source code and the new \`TimesTable.class\` with the bytecode. -- \`java TimesTable\` starts the JVM with your bytecode. Here you write the class name without \`.class\`. - -If \`java -version\` works but \`javac -version\` doesn't, only a JRE is installed. Then you are missing the JDK. -::: - -::: angeberwissen -Every compiled Java file (\`.class\`) starts with the same four bytes, written in hexadecimal: \`CA FE BA BE\`. That is how the computer recognises it as Java. James Gosling came up with this “cafe babe”, to go with the coffee in the name. -::: - -## The Java language mode - -Under the [gear](#zeige-einstellungen) at the top right you can switch on **Code keywords**. Then the building blocks in the Elements area have the same names as the commands in Java: \`if\`, \`switch\`, \`for\`, \`while\`, \`do\`, \`while(true)\`, \`break\` and \`call\`. The rest of the interface stays in your language. - -This helps you match the boxes to the Java commands. Your diagram itself stays unchanged. - -## Write Java directly - -So far you drew the structure chart first and then looked at the code. In the [Code](#zeige-codelive) area it also works the other way round. Click the slim **Code** strip on the right. Next to the structure chart a column appears where you type Java yourself. - -- **Structure chart to code:** When you change something in the structure chart, the Java code changes right away. -- **Code to structure chart:** When you type Java, VisuStruct builds the structure chart as you type. If something is still missing, for example a closing bracket \`}\`, a hint appears below the code. -- **Suggestions:** While you type, VisuStruct suggests templates, for example for \`if\`, \`for\` or \`while\`. Press Enter to accept a template. Simply replace the grey placeholders with your own text. -- **Indent:** If your code has got messy, click the **Indent** button at the top of the Code area. Every level then sits four spaces deeper, as in Eclipse or IntelliJ. If you have selected lines, VisuStruct only indents those. - -So you can try both ways. Drawing the structure chart first is good for planning a process. Writing code directly is faster when you already know what you want. The structure chart then helps you check your code. - -## Run the program - -At the top of the Code area, [▶︎ Run](#zeige-ausfuehren) starts your program and **■ Stop** ends it, for example in an endless loop. What your program outputs appears below in the [console](#zeige-konsole). If it asks for input, type it there and press Enter. - -You can drag the border between code and console up or down with the mouse. - -If something goes wrong, the line number turns red. With a syntax error the spot is also underlined in red, and below it you read e.g. **Line 2: Still missing here: ;**. Then ▶︎ does not even start the program. If the program stops while it runs, it is a runtime error, and the console names the line, e.g. **Line 3: Division by zero.** You know the three kinds of errors from the lesson “Simulation and desk check”. - -If VisuStruct knows exactly what is missing, there is a 💡 at the end of the line. Move the mouse onto it to see the suggestion, e.g. **Suggestion: insert import java.util.Scanner;**. A click applies it. Still read what was inserted, so that you know it yourself next time. - -> The Code area understands the Java commands that also exist as boxes in the structure chart. It does not know your own classes and objects yet. Windows with Swing work anyway: turn on **Real Java (with Swing)** under the gear (lesson “Your first window”). - -::: angeberwissen -Professionals call a program where you write code, run it and look for mistakes an **IDE** (Integrated Development Environment). With the Code area, VisuStruct is a small IDE with a built-in structure chart. -::: - -## Find mistakes with the debugger - -Sometimes a program runs but calculates something wrong. That is a logic error. Then the **debugger** helps: it runs your program slowly while you watch. - -- **Breakpoint:** Click a line number on the left. A red dot appears. [▶︎ Run](#zeige-ausfuehren) pauses before this line. Click again to remove the dot. -- **Yellow line:** This line runs next. The matching box is selected in the structure chart. -- **Variables:** Below the code you see the current value of every variable. Whatever changed since the last pause lights up yellow for a moment. -- **Step:** The [Step](#zeige-einzelschritt) button next to ▶︎ runs exactly one line and pauses again. Without a breakpoint it starts the program and pauses before the first line. -- **Continue:** ▶︎ runs to the next breakpoint or to the end. **■ Stop** ends it. - -Try it with this program. Set a breakpoint on line 3 and press ▶︎ several times. How do \`i\` and \`summe\` grow? - -\`\`\` -int summe = 0; -for (int i = 1; i <= 4; i++) { - summe = summe + i; -} -System.out.println("Summe: " + summe); -\`\`\` - -::: ludwig -This is a desk check, except the computer takes the notes for you. Before each step, think about which value the variable should have next. When the table doesn't match your guess, you have found the place with the mistake. -::: - -## Exercise: Code first, then the structure chart - -This time you don't draw. Open the Code area and type in this Java code: - -\`\`\` -System.out.println("Start number?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -\`\`\` - -::: übung l20-countdown -titel: Countdown -bereich: beide -auftrag: Type the Java code above into the Code area. Run it with ▶︎ and enter a start number in the console. - Then look at the structure chart that was built and click Check. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Open the Code area with the slim strip on the far right and just start typing. -tipp: Watch out for the semicolon at the end of every statement and the curly brackets of the while loop. A hint below the code tells you when something is still missing. -lösung: l20-countdown-loesung.visustruct -::: - -## Exercise: Java as a structure chart - -Now the other way round: here is a piece of Java code. Rebuild it as a structure chart. - -\`\`\` -System.out.println("Enter a number"); -int n = scanner.nextInt(); -int factorial = 1; -for (int i = 1; i <= n; i++) { - factorial = factorial * i; -} -System.out.println(factorial); -\`\`\` - -::: übung l17-fakultaet -titel: Factorial from Java -bereich: beide -auftrag: Rebuild the Java code above as a structure chart. The program reads in a number n and outputs the product 1 · 2 · … · n. - At the end, check in the code view whether your Java code looks the same. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Read the Java code line by line and think about which box fits each line. -tipp: The first two Java lines together are one single input: \`input: int n "Enter a number"\`. The for loop has the three fields \`int i = 1\`, \`i <= n\` and \`i++\`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Exercise: else if - -In Java, several cases are often written as \`else if\`: - -\`\`\` -if (age < 6) { - System.out.println("Free entry"); -} else if (age < 18) { - System.out.println("Child ticket: 4 euros"); -} else { - System.out.println("Adult ticket: 8 euros"); -} -\`\`\` - -There is no \`else if\` in a structure chart. There, a second branch sits in the false path of the first one. If the false path holds only this one branch, VisuStruct turns it back into \`else if\` when it generates the code, and into \`elif\` in Python. - -::: übung l17-ticket -titel: Ticket price -bereich: beide -auftrag: Ask for the age as a whole number and rebuild the Java code above as a structure chart. -test: 5 -> Free entry -test: 6 -> Child ticket: 4 euros -test: 17 -> Child ticket: 4 euros -test: 18 -> Adult ticket: 8 euros -braucht: verzweigung -tipp: In the Java code there is another \`if\` inside an \`else\`. In the structure chart that is a branch inside a path. -tipp: Drag a second branch with the condition \`age < 18\` into the false path of the first branch. -lösung: l17-ticket-loesung.visustruct -::: - -## Game: Which box? - -::: spiel frage -titel: Game: Which box? -intro: Ludwig shows you Java. Which box from the structure chart is behind it? Eight rounds. -frage: Which box is this? - -runde: - do { - number = number * 2; - } while (number < 100); -- While loop -- [x] Do-while loop -- For loop -> The condition is at the bottom. So the body runs at least once. - -runde: - switch (choice) { - case 1 -> { System.out.println("water"); } - default -> { System.out.println("There is no such button."); } - } -- Branch -- [x] Switch -- Call -> One variable is compared with fixed values: that is the switch. - -runde: - break; -- Call -- Endless loop -- [x] Break -> \`break\` leaves the loop it stands in straight away. - -runde: - calculate(); -- [x] Call -- Output -- Statement -> A name with round brackets: a subprogram is called here. - -runde: - int number = scanner.nextInt(); -- Output -- [x] Input -- Call -> The scanner reads in a value. That is an input. - -runde: - while (true) { - System.out.println("Hello"); - } -- While loop with a condition -- [x] Endless loop -- Do-while loop -> \`while (true)\` has no real condition. Only a break could end it. - -runde: -frage: You want a complete Java file that you can compile and run straight away. What do you choose in the code view? -- Snippet -- [x] Class -> A snippet is only the statements for the \`main\` method. Class creates the whole file. - -runde: -frage: In the debugger, a line is yellow. What does that mean? -- It has a mistake. -- [x] It runs next. -- There is a breakpoint there. -> Yellow is the next line. A breakpoint is a red dot at the line number. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can open the code view and choose Java as the language. → The code view -- I can recognise output, input, branches and loops in Java. → The elements in Java -- I can explain the difference between Snippet and Class. → Snippet or Class -- I can explain how Java code runs on every operating system with the compiler, bytecode and the JVM. → How Java runs on every computer -- I can tell the JDK and the JRE apart. → How Java runs on every computer -- I can explain why a C++ program has to be compiled again for every operating system but a Java program does not. → How Java runs on every computer -- I can rebuild a short Java program as a structure chart. → Exercise: Java as a structure chart -- I can type Java in the Code area and read the structure chart that is built. → Write Java directly -- I can run a program with ▶︎ and use input and output in the console. → Run the program -- I can find a syntax error or a runtime error by its red line number. → Run the program -- I can set breakpoints and follow a program step by step. → Find mistakes with the debugger -::: - -## Quiz - -::: quiz -? What does \`output: "Hello"\` look like in Java? -→ The elements in Java -- [ ] print("Hello") -- [x] System.out.println("Hello"); -- [ ] console.log("Hello"); -> print is Python, console.log is JavaScript. - -? Where does the class name come from with Class? -→ Snippet or Class -- [ ] It is always called Main. -- [x] From the title of the diagram -- [ ] From the first box -> Without a title, the class is called Main. - -? Which Java code belongs to a do-while loop? -→ The elements in Java -- [ ] while (condition) { … } -- [x] do { … } while (condition); -- [ ] for (;;) { … } -> With do-while the condition is at the end, so the body runs at least once. - -? What does a Break become in Java code? -→ The elements in Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? What happens at a red dot before the line number? -→ Find mistakes with the debugger -- [ ] The line is skipped. -- [x] The program pauses before this line. -- [ ] The line contains a mistake. -> That is a breakpoint. Continue with ▶︎ or Step. - -? Why does the same \`.class\` file run on Windows, macOS and Linux? -→ How Java runs on every computer -- [ ] The compiler creates a separate file for every operating system. -- [x] On every operating system a JVM runs the same bytecode. -- [ ] Java programs don't need an operating system. -> The bytecode stays the same. Only the JVM exists separately for each system. - -? What do you need to write and compile Java programs? -→ How Java runs on every computer -- [ ] only the JRE -- [x] the JDK -- [ ] only the JVM -> The JRE is enough to run programs. The compiler \`javac\` only comes with the JDK. - -? You want to use your program on Windows and on a Mac. What is true? -→ How Java runs on every computer -- [ ] You have to compile Java again for every system, but not C++. -- [x] You have to compile C++ again for every system, but not Java. -- [ ] You only compile both once. -> C++ becomes machine code for one system directly. Java becomes bytecode, and the JVM runs it on every system. - -? Line number 3 in the Code area is red. What does that mean? -→ Run the program -- [ ] There is a breakpoint in line 3. -- [x] There is an error in line 3. -- [ ] Line 3 runs next. -> A breakpoint is a round red dot, and the next line is yellow. A red line number shows a syntax error or a runtime error. -::: -`,Yw=`--- -titel: Python and JavaScript -bereich: From structure chart to code -kurz: Generate Python and JavaScript code from the structure chart and run JavaScript straight in the browser. ---- - -## Skills I will gain now - -::: kompetenzen -- choose and compare Python and JavaScript in the code view -- explain that Python forms blocks by indentation and needs no data types -- explain what VisuStruct adjusts when translating to Python -- run JavaScript with Test in browser -::: - -## The same diagram, three languages - -In the code view ([Code](#zeige-code) in the tools) you choose the language at the top. The structure chart stays the same; only the way it is written changes. That way you can compare the languages easily. - -::: diagramm l18-beispiel.visustruct -A number is made smaller by 3 again and again until it is no longer greater than 0. -::: - -## Python - -For the diagram above, VisuStruct generates this Python code: - -\`\`\` -number = int(input("Start value?")) -while number > 0: - print(number) - number = number - 3 -print("End") -\`\`\` - -What is different in Python compared with Java: - -- There are **no semicolons** and **no curly brackets**. Python recognises what belongs to a loop or a branch by the **indentation** alone. After \`while\`, \`if\` and \`else\` there is a colon. -- Variables get **no data type**: \`int number = 5\` becomes \`number = 5\`. -- Output is called \`print(…)\`, input \`input(…)\`. For a number, \`int(…)\` goes around it. -- In Python, arrays are called **lists**: \`int[] numbers = {2, 4, 6}\` becomes \`numbers = [2, 4, 6]\`, and \`numbers.length\` becomes \`len(numbers)\`. -- A simple for loop such as \`int i = 0\`, \`i < 5\`, \`i++\` becomes \`for i in range(5):\`. - -## What to watch out for in Python - -In some places Python is stricter than Java. That is why VisuStruct translates the Java way of writing things when it exports: - -- **Text and number with +:** \`"Sum: " + sum\` becomes \`"Sum: " + str(sum)\`. Without \`str(…)\`, Python stops with an error. -- **There is no i++:** it becomes \`i += 1\`. -- **&&, || and !** are called \`and\`, \`or\` and \`not\` in Python, and \`true\` and \`false\` become \`True\` and \`False\`. -- **Whole-number division:** In Python, \`7 / 2\` always gives 3.5. If the structure chart divides two \`int\` values, VisuStruct writes \`7 // 2\`, which gives 3, just like in Java. -- **For loops:** Counting loops become \`for … in range(…)\`, also with \`i <= n\`, counting backwards or steps such as \`i = i + 2\`. If a loop does not fit that pattern, it becomes a \`while\` loop. -- **There is no do-while:** it becomes \`while True:\` with \`if not (…): break\` at the end. - -If a diagram is marked as **pseudocode**, only a note appears above the code. Then the text is a sketch and not a runnable program. - -## JavaScript - -The same diagram in JavaScript: - -\`\`\` -"use strict"; - -let number = parseInt((prompt("Start value?") ?? "0"), 10); -while (number > 0) { - console.log(number); - number = number - 3; -} -console.log("End"); -\`\`\` - -JavaScript looks similar to Java: curly brackets, semicolons, \`while (…)\` and \`if (…)\`. The differences: - -- Variables are created with \`let\`, without a data type. Constants with \`const\`. -- Output is called \`console.log(…)\`, input \`prompt(…)\`. \`parseInt(…)\` turns the input into a whole number. -- Arrays go in square brackets: \`let numbers = [2, 4, 6];\`. -- \`"use strict";\` at the very top makes JavaScript complain about typos in variable names. -- JavaScript has only one number type. If the structure chart divides two \`int\` values, VisuStruct writes \`Math.trunc(a / b)\`. Then the digits after the decimal point are dropped, just like in Java. - -::: angeberwissen -JavaScript has almost nothing to do with Java. Brendan Eich built it in 1995 in just ten days for the Netscape browser. First it was called Mocha, then LiveScript. Because everyone was excited about Java at the time, it was renamed JavaScript shortly before launch, for advertising reasons. People have been mixing the two up ever since. Programmers say: Java is to JavaScript as car is to carpet. -::: - -## Run JavaScript in the browser - -JavaScript is the language of browsers. That is why VisuStruct can **run the code straight away**: - -::: angeberwissen -Why are links in the browser blue, anyway? In 1985 Ben Shneiderman's team tested which colour is easy to see but does not get in the way when you read. Light blue won. Red stood out more, but people remembered the text less well afterwards. -::: - -1. Choose **JavaScript** in the code view. -2. Click **Test in browser**. -3. Whatever \`console.log\` outputs appears under **Output**. If the program asks for a value with \`prompt\`, type it in and click **OK**. -4. **Stop** cancels the program. - -VisuStruct stops an endless loop \`while (true)\` by itself after 100,000 passes and reports **Execution stopped: possible infinite loop.** - -> In JavaScript code, a **Call** needs a subprogram with that name, otherwise JavaScript reports an error. Unlike the simulation, the browser does not look in the other tabs. - -## Exercise: Python as a structure chart - -This Python program outputs all even numbers from 0 up to a limit: - -\`\`\` -limit = int(input("Up to which number?")) -for i in range(0, limit + 1, 2): - print(i) -\`\`\` - -\`range(0, limit + 1, 2)\` means: start at 0, stop before \`limit + 1\`, count in steps of two. - -::: übung l18-python -titel: Even numbers -bereich: beide -auftrag: Rebuild the Python program above as a structure chart with a for loop. With the limit 7 it outputs 0, 2, 4 and 6. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: \`range(0, limit + 1, 2)\` counts from 0 up to the limit in steps of two. That is a for loop. -tipp: The three fields of the for loop are \`int i = 0\`, \`i <= limit\` and \`i = i + 2\`. -lösung: l18-python-loesung.visustruct -::: - -## Exercise: JavaScript as a structure chart - -\`\`\` -let age = parseInt((prompt("How old are you?") ?? "0"), 10); -if (age >= 16) { - console.log("You may vote."); -} else { - let years = 16 - age; - console.log("Wait " + years + " more years."); -} -\`\`\` - -::: übung l18-js -titel: Voting from 16 -bereich: beide -auftrag: Rebuild the JavaScript code above as a structure chart. Then test in the code view with **JavaScript** and **Test in browser** whether your code outputs the same as the simulation. -test: 12 -> Wait 4 more years. -test: 16 -> You may vote. -test: 13 -> Wait 3 more years. -test: 40 -> You may vote. -braucht: verzweigung -tipp: Read the code line by line. \`if\` and \`else\` become a branch. -tipp: \`prompt\` and \`parseInt\` together are one input: \`input: int age "How old are you?"\`. The false path holds two boxes: first \`int years = 16 - age\`, then the output. -lösung: l18-js-loesung.visustruct -::: - -## Game: Which language? - -::: spiel frage -titel: Game: Which language? -intro: Ludwig has mixed up lines from three languages. Can you tell where each comes from? Eight rounds. -frage: Which language is this written in? -antworten: Java | Python | JavaScript - -runde: - print(number) -richtig: Python -> In Python the output is called \`print(…)\`, without a semicolon. - -runde: - console.log(number); -richtig: JavaScript -> \`console.log\` is the output in JavaScript. - -runde: - System.out.println(number); -richtig: Java -> The long output with \`System.out\` only exists in Java. - -runde: - let numbers = [2, 4, 6]; -richtig: JavaScript -> \`let\` and square brackets: an array in JavaScript. - -runde: - for i in range(5): -richtig: Python -> A colon instead of curly brackets, and \`range\`: typical Python. - -runde: - int[] numbers = {2, 4, 6}; -richtig: Java -> Only Java writes the data type \`int[]\` in front. - -runde: - number = int(input("Start value?")) -richtig: Python -> No data type in front of the variable, no semicolon, and \`int(…)\` around the input. - -runde: - let number = parseInt(prompt("Start value?"), 10); -richtig: JavaScript -> \`prompt\` asks for a value in the browser, \`parseInt\` turns it into a number. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can choose and compare Python and JavaScript in the code view. → The same diagram, three languages -- I can explain that Python forms blocks by indentation and needs no data types. → Python -- I can explain what VisuStruct adjusts when translating to Python. → What to watch out for in Python -- I can run JavaScript with Test in browser. → Run JavaScript in the browser -::: - -## Quiz - -::: quiz -? How does Python recognise which lines belong to a loop? -→ Python -- [ ] By the curly brackets -- [x] By the indentation -- [ ] By the semicolon at the end of the line - -? What is \`output: sum\` in JavaScript? -→ The same diagram, three languages -- [ ] print(sum) -- [ ] System.out.println(sum); -- [x] console.log(sum); - -? Which language can VisuStruct run straight in the browser? -→ Run JavaScript in the browser -- [ ] Java -- [ ] Python -- [x] JavaScript -> Every browser can run JavaScript. For Java and Python you need a program of its own. - -? What happens in Python with \`print("Sum: " + sum)\` if sum is the number 7? -→ What to watch out for in Python -- [ ] Sum: 7 is output. -- [x] Python reports an error, because text and a number cannot be joined with +. -- [ ] Sum: is output. -> str(sum) turns the number into text. -::: -`,Kw=`--- -titel: When the program crashes: try and catch -bereich: Catching errors -kurz: Use real Java to read error messages and catch crashes with try and catch. ---- - -## Skills I will gain now - -::: kompetenzen -- switch on real Java in the Code area -- read the exception and the line from an error message -- catch an exception with try and catch -- turn text into a number with Integer.parseInt and catch the NumberFormatException -- write a program that divides safely, even by 0 -::: - -## Crashed! - -This program should print three grades. Type it into the [Code](#zeige-codelive) area and click [▶︎ Run](#zeige-ausfuehren): - -\`\`\`java -int[] grades = {2, 3, 1}; -System.out.println("First grade: " + grades[0]); -System.out.println("Fourth grade: " + grades[3]); -System.out.println("Done!"); -\`\`\` - -The first grade appears, then it stops. VisuStruct reports “Invalid expression: grades[3]”, and “Done!” never shows up. The array only has the slots 0, 1 and 2; there is no slot 3. - -::: ludwig -Has this ever happened to you? One small mistake, and the whole program is gone. It happened to me so often that I cried in front of the screen. But there is a solution, and it is called **try** and **catch**. -::: - -::: angeberwissen -In 1947 Grace Hopper's team found a moth in the Mark II computer at Harvard University that had caused a fault. They taped it into the logbook and wrote: “First actual case of bug being found”. Since then, program errors have been called **bugs**. -::: - -## Switching on real Java - -The Code area normally calculates with the same simulation as the structure chart. It simply stops when there is an error. To see what real Java does, switch on real Java: - -1. Click the [gear](#zeige-einstellungen) at the top right and choose Java as the **Programming language**. -2. In the Java section, tick **Real Java (with Swing)**. - -The first time you run a program, VisuStruct downloads about 40 MB once. After that your code is compiled and run just like in a real Java development environment. - -> With real Java, input from the console (\`Scanner\`) does not work yet. That is why our examples work without input. - -Now write the program as a whole class, so that the line numbers match, and run it: - -\`\`\`java -public class Grades { - public static void main(String[] args) { - int[] grades = {2, 3, 1}; - System.out.println("First grade: " + grades[0]); - System.out.println("Fourth grade: " + grades[3]); - System.out.println("Done!"); - } -} -\`\`\` - -The [console](#zeige-konsole) now shows: - -\`\`\` -First grade: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Grades.main(Grades.java:5) -\`\`\` - -## Reading the error message - -A message like this looks scary at first. But it tells you exactly what is going on: - -| Part | Meaning | -|---|---| -| \`ArrayIndexOutOfBoundsException\` | The kind of error: the index is outside the array. | -| \`3\` | The wrong index. | -| \`Grades.java:5\` | The line where it happened: line 5. | - -Java calls a runtime error like this an **exception**. We say: Java *throws* an exception. If nobody catches it, the program stops. That is why “Done!” does not appear. - -::: ludwig -Always read error messages from the top: first the name of the exception, then the line number. In the Code area the line numbers are on the left next to the code. -::: - -## try and catch - -With **try** and **catch** you catch the exception. Change the line with \`grades[3]\` like this: - -\`\`\`java -try { - System.out.println("Fourth grade: " + grades[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("This grade does not exist."); -} -System.out.println("Done!"); -\`\`\` - -- \`try\` means “give it a go”. Java runs the block in curly brackets as usual. -- If a line in it throws an exception, Java jumps straight into the \`catch\` block. The rest of the \`try\` block is skipped. -- The brackets after \`catch\` say which exception is caught, plus a name for it, usually \`e\`. -- After that the program carries on as normal. Now “Done!” appears too. - -If everything in the \`try\` block goes well, the \`catch\` block is simply skipped. - -::: ludwig -try and catch are like the net under the trapeze at the circus: as long as everything works, you don't notice it. If someone falls, the net catches them and the show goes on. -::: - -> The structure chart has no box for try and catch. So VisuStruct shows the whole block as one statement. You can only run it with real Java. - -::: angeberwissen -In July 1969, Apollo 11 landed on the Moon. Shortly before touchdown, the onboard computer suddenly reported the errors **1202** and **1201**: it had more work than it could handle. Still, it did not crash. **Margaret Hamilton**'s team had built the software so that it recognised such errors, put aside the unimportant jobs and kept only the most important ones running. The landing succeeded. - -Margaret Hamilton led the group at MIT that wrote the software for the Apollo spacecraft. She always planned for things going wrong, just like you do with \`try\` and \`catch\`. So that software would be taken as seriously as hardware, she called her work **software engineering**. Today a whole field of computer science has that name. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (born 1936) in 1969, next to the printed programs her team wrote for Apollo (photo: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), public domain). -::: - -## Turning text into a number - -Often a number is text at first, for example later in a text field in a window. \`Integer.parseInt\` turns text into a whole number: - -\`\`\`java -String input = "twelve"; -try { - int number = Integer.parseInt(input); - System.out.println("Double: " + number * 2); -} catch (NumberFormatException e) { - System.out.println("That is not a number: " + input); -} -\`\`\` - -Java cannot convert “twelve” and throws a \`NumberFormatException\`. The program prints “That is not a number: twelve”. Change the first line to \`String input = "12";\` and run it again: now “Double: 24” appears. - -## Exceptions are objects - -This is not in the curriculum, but it is useful to know. - -::: angeberwissen -Every exception is an object of its own class, for example \`ArithmeticException\` for dividing by 0. \`e.getMessage()\` gives you its message, such as \`/ by zero\`. - -A \`try\` may be followed by several \`catch\` blocks, one for each kind of error. \`catch (Exception e)\` catches all exceptions, but then tells you less about what happened. And a \`finally { … }\` block at the end always runs, whether there was an error or not. -::: - -## Game: Does the net catch it? - -::: spiel frage -titel: Game: Does the net catch it? -intro: Ludwig is swinging on the trapeze. Do try and catch save him, or does the program crash? Seven rounds. - -runde: - int[] grades = {2, 3, 1}; - System.out.println(grades[3]); - System.out.println("Done!"); -frage: What happens with real Java? -- 1 and Done! appear. -- Only Done! appears. -- [x] The program crashes with an ArrayIndexOutOfBoundsException. -> There is no slot 3. Nobody catches the exception, so Done! never arrives. - -runde: - int[] grades = {2, 3, 1}; - try { - System.out.println(grades[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("This grade does not exist."); - } - System.out.println("Done!"); -frage: What is output? -- Done! -- [x] This grade does not exist.\\nDone! -- This grade does not exist. -> The catch block catches the exception, and after that the program carries on as normal. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: What is output? -- A\\nB\\nC -- [x] A\\nC -- C -> At 10 / 0, Java jumps straight into the catch block. The rest of the try block, B, is skipped. - -runde: - String input = "12"; - try { - int number = Integer.parseInt(input); - System.out.println("Double: " + number * 2); - } catch (NumberFormatException e) { - System.out.println("That is not a number: " + input); - } -frage: What is output? -- [x] Double: 24 -- That is not a number: 12 -- Double: 1212 -> "12" can be converted. If everything goes well in the try block, catch is skipped. - -runde: -frage: Which exception does \`Integer.parseInt("2.5")\` throw? -- ArithmeticException -- [x] NumberFormatException -- none, the result is 2 -> parseInt only converts whole numbers. With a point it isn't a valid format. - -runde: -frage: Which exception does \`12 / 0\` throw with \`int\`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Dividing by 0 doesn't work with whole numbers. The message is \`/ by zero\`. - -runde: - try { - int pieces = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Error!"); - } - System.out.println("Done!"); -frage: What happens? -- Error! and Done! appear. -- Only Done! appears. -- [x] The program crashes. -> catch only catches the exception named in the brackets. An ArithmeticException falls through the net. -::: - -## Task: dividing safely - -This program crashes: - -\`\`\`java -int cake = 12; -int people = 0; -System.out.println("Everyone gets " + cake / people + " pieces."); -System.out.println("Enjoy!"); -\`\`\` - -1. Run it with real Java and read the error message. Which exception is it? -2. Catch it with try and catch. Instead of the crash, “You can't share without people.” should appear, and “Enjoy!” should still be printed. -3. Set \`people\` to 4 and check that “Everyone gets 3 pieces.” appears. - -::: ludwig -The exception is called \`ArithmeticException\`. Only put the line that can crash into the \`try\` block. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can switch on real Java in the Code area. → Switching on real Java -- I can read the exception and the line from an error message. → Reading the error message -- I can catch an exception with try and catch. → try and catch -- I can turn text into a number with Integer.parseInt and catch the NumberFormatException. → Turning text into a number -- I can write a program that divides safely, even by 0. → Task: dividing safely -::: - -## Quiz - -::: quiz -? What happens if an exception is not caught? -→ Reading the error message -- [ ] Java skips the line and carries on. -- [x] The program stops. -- [ ] The computer restarts. -> That is why “Done!” does not appear in the first example. - -? What happens in the try block after the line that throws an exception? -→ try and catch -- [ ] The remaining lines run anyway. -- [x] The rest is skipped and Java jumps into the catch block. -- [ ] Java starts the try block again. - -? Which exception does Integer.parseInt("twelve") throw? -→ Turning text into a number -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> “twelve” is not in a number format that Java understands. - -? Match each exception to its cause. -→ Reading the error message -= ArrayIndexOutOfBoundsException -> index outside the array -= ArithmeticException -> dividing by 0 -= NumberFormatException -> text is not a number -::: -`,Xw=`--- -titel: Reading and saving text -bereich: Files -kurz: Read a text file line by line with Scanner and save a file with PrintWriter. ---- - -## Skills I will gain now - -::: kompetenzen -- explain why programs save data in files -- read a text file line by line with Scanner, hasNextLine and nextLine -- explain why Java requires try and catch or throws for files -- write a file with PrintWriter and finish it with close -- read a file, add to it and save it again with numbers -::: - -## Why files? - -Everything stored in variables is gone as soon as the program ends. If a program should remember something, for example a game score, a list or grades, it saves the data in a **file**. The next time it starts, it reads the file again. - -Zora is free, and Ludwig is planning a party. His shopping list is ready in the file \`shopping.txt\`: - -::: datei shopping.txt -Hay -Apples -Carrots -Dandelions -::: - -A file ending in \`.txt\` contains only text, line by line. You can open it with any editor, for example Notepad on Windows or TextEdit on a Mac. - -## Reading a file with Scanner - -You already know the \`Scanner\`: \`new Scanner(System.in)\` reads from the keyboard. If you give it a file instead of \`System.in\`, it reads from the file: - -\`\`\`java -import java.io.*; -import java.util.Scanner; - -Scanner file = new Scanner(new File("shopping.txt")); -while (file.hasNextLine()) { - String line = file.nextLine(); - System.out.println(line); -} -file.close(); -\`\`\` - -| Method | Meaning | -|---|---| -| \`new File("shopping.txt")\` | the file with this name | -| \`hasNextLine()\` | Is there another line? \`true\` or \`false\` | -| \`nextLine()\` | returns the next line and moves on by one line | -| \`close()\` | closes the file when you are done | - -The loop runs as long as there is another line. In each pass, \`nextLine()\` fetches the next line. \`File\` belongs to the package \`java.io\`, so you need \`import java.io.*;\`. - -::: diagramm dt-lesen.visustruct -This is what reading looks like in a structure chart. Try it in the simulation. -::: - -::: ludwig -Imagine the Scanner as a finger pointing at a line. \`nextLine()\` reads the line under the finger and moves the finger down one line. Once the finger is below the last line, \`hasNextLine()\` returns \`false\`. -::: - -## What if the file is missing? - -If the file does not exist, Java cannot read it and throws a \`FileNotFoundException\`. Java insists that your program is prepared for this. Either you catch it with try and catch, as in lesson 22: - -\`\`\`java -try { - Scanner file = new Scanner(new File("shopping.txt")); - // ... read ... - file.close(); -} catch (FileNotFoundException e) { - System.out.println("The file shopping.txt is missing!"); -} -\`\`\` - -Or you write \`throws Exception\` after \`main\`. It means: "This method may throw an exception, I won't deal with it." Then the program stops if the file is missing. - -\`\`\`java -public static void main(String[] args) throws Exception { -\`\`\` - -> VisuStruct adds \`throws Exception\` after \`main\` automatically as soon as your program works with files. In the simulation, VisuStruct reports a missing file with "There is no file called …". - -## Exercise: Numbering the shopping list - -::: übung l23-java-nummern -titel: Numbering the shopping list -code: java -auftrag: Read \`shopping.txt\` line by line and print each line with its number: **1. Hay**, **2. Apples** and so on. -start: l23-java-nummern-start.visustruct -test: - -> 1. Hay | 2. Apples | 3. Carrots | 4. Dandelions -braucht: whileSchleife -tipp: Create \`int number = 1;\` before the loop and increase the number at the end of each pass. -tipp: The output is \`System.out.println(number + ". " + line);\` -lösung: l23-java-nummern-loesung.visustruct -::: - -## Writing to a file with PrintWriter - -For writing there is the \`PrintWriter\`. Its methods have the same names as those of \`System.out\`: - -\`\`\`java -PrintWriter out = new PrintWriter("greeting.txt"); -out.println("Hello Zora!"); -out.println("See you tomorrow, Ludwig"); -out.close(); -\`\`\` - -Afterwards \`greeting.txt\` contains: - -\`\`\` -Hello Zora! -See you tomorrow, Ludwig -\`\`\` - -- \`println\` writes the text and then starts a new line, \`print\` writes without a new line. -- If the file already exists, it is **overwritten**. The old content is gone. -- After the run, VisuStruct shows below the output what was saved in the file. - -::: ludwig -Don't forget \`close()\`! The PrintWriter first collects the text in a buffer and only writes it to the file when it is closed. Without \`close()\` the file stays empty. I once lost a whole story that way. -::: - -## Exercise: Adding to the shopping list - -::: übung l23-java-ergaenzen -titel: Adding to the shopping list -code: java -auftrag: Ludwig still needs cake. Read \`shopping.txt\` and write each line to the new file \`shopping-new.txt\`. Then add **Cake** as the last line. At the end, print how many lines were saved: **5 lines saved**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 lines saved -datei: shopping-new.txt -> Hay | Apples | Carrots | Dandelions | Cake -braucht: whileSchleife -tipp: In the loop, read a line with \`file.nextLine()\` and write it straight out again with \`out.println(line)\`. -tipp: After the loop comes \`out.println("Cake");\`. Close both files with \`close()\`, otherwise \`shopping-new.txt\` stays empty. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Game: What is in the file? - -::: spiel frage -titel: Game: What is in the file? -intro: Ludwig writes files with the PrintWriter. Read the code and predict what is in the file afterwards. Six rounds. -frage: What is in the file afterwards? - -runde: - PrintWriter out = new PrintWriter("greeting.txt"); - out.println("Hello"); - out.println("Zora"); - out.close(); -- [x] Hello\\nZora -- HelloZora -- Zora -> \`println\` starts a new line after each text. - -runde: - PrintWriter out = new PrintWriter("word.txt"); - out.print("He"); - out.print("llo"); - out.println("!"); - out.close(); -- He\\nllo\\n! -- [x] Hello! -- He llo ! -> \`print\` carries on without a new line, so the parts are joined directly. - -runde: - PrintWriter out = new PrintWriter("secret.txt"); - out.println("The treasure is in the tower"); -- The treasure is in the tower -- [x] Nothing, the file stays empty. -- Java reports an error. -> Without \`close()\` the text never reaches the file. It stays in the buffer. - -runde: - // Before, note.txt contains: Old - PrintWriter out = new PrintWriter("note.txt"); - out.println("New"); - out.close(); -- Old\\nNew -- [x] New -- New\\nOld -> A new PrintWriter overwrites the file. The old content is gone. - -runde: - PrintWriter out = new PrintWriter("numbers.txt"); - for (int i = 1; i <= 3; i++) { - out.println(i * 2); - } - out.close(); -- 1\\n2\\n3 -- 246 -- [x] 2\\n4\\n6 -> The loop writes 2, 4 and 6, each number on its own line. - -runde: - // shopping.txt contains: Hay, Apples (one per line) - Scanner file = new Scanner(new File("shopping.txt")); - PrintWriter out = new PrintWriter("big.txt"); - while (file.hasNextLine()) { - out.println(file.nextLine().toUpperCase()); - } - file.close(); - out.close(); -- Hay\\nApples -- [x] HAY\\nAPPLES -- HAYAPPLES -> Each line is read, turned into capital letters and written on its own line. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain why programs save data in files. → Why files? -- I can read a text file line by line with Scanner, hasNextLine and nextLine. → Reading a file with Scanner -- I can explain why Java requires try and catch or throws for files. → What if the file is missing? -- I can write a file with PrintWriter and finish it with close(). → Writing to a file with PrintWriter -- I can read a file, add to it and save it again with numbers. → Exercise: Adding to the shopping list -::: - -## Quiz - -::: quiz -? What does hasNextLine() return? -→ Reading a file with Scanner -- [ ] the next line -- [x] true if there is another line, otherwise false -- [ ] the number of lines -> With hasNextLine() the loop checks whether to carry on. - -? What happens if you call new PrintWriter("list.txt") for a file that already exists? -→ Writing to a file with PrintWriter -- [ ] The new text is added at the end. -- [x] The file is overwritten. -- [ ] Java reports an error. - -? Why does a file stay empty even though println was called? -→ Writing to a file with PrintWriter -- [ ] Because println only writes to the console. -- [x] Because close() is missing. -- [ ] Because the file name ends in .txt. -> Only close() writes the buffer into the file. - -? Match each method to its job. -→ Reading a file with Scanner -= nextLine() -> reads the next line -= println(text) -> writes a line -= close() -> closes the file -::: -`,ey=`--- -titel: Line by line with BufferedReader -bereich: Files -kurz: Read with BufferedReader and readLine until null comes, and read a whole file at once with Files. ---- - -## Skills I will gain now - -::: kompetenzen -- read a file with BufferedReader and readLine -- spot the end of a file, because readLine returns null there -- count how often a word appears in a file -- read a whole file with Files.readString and split it into lines with split -- find the longest entry in a file -::: - -## The cake is gone! - -The morning after the party, Ludwig's cake has disappeared. Luckily the castle keeps a logbook. Every line starts with the day and the time: - -::: datei logbook.txt -Mo 08:15 Ludwig feeds the goats -Mo 12:30 Zora reads in the tower -Mo 18:00 Fox sneaks past the gate -Tu 09:00 Ludwig bakes a cake -Tu 14:45 Hare brings carrots -Tu 16:20 Fox asks for the recipe -Tu 23:55 The cake is gone -We 07:00 Zora finds crumbs at Fox's den -::: - -You could already read it with the Scanner from lesson 23. For files, though, professionals often use the **BufferedReader**. - -## Reading with BufferedReader - -\`\`\`java -import java.io.*; - -BufferedReader reader = new BufferedReader(new FileReader("logbook.txt")); -String line = reader.readLine(); -while (line != null) { - System.out.println(line); - line = reader.readLine(); -} -reader.close(); -\`\`\` - -- \`new FileReader("logbook.txt")\` opens the file, and \`new BufferedReader(…)\` puts a buffer around it. It fetches the file in large chunks and is therefore faster for long files. -- \`readLine()\` returns the next line. When there are no more lines, it returns **null**. -- That is why the loop runs as long as \`line != null\`. At the end of each pass it reads the next line. - -::: diagramm dt-buffered.visustruct -First read a line, then check, then read the next one at the end of the pass. -::: - -**null** means "nothing at all". It is not the empty text \`""\`, but no text. A variable holding \`null\` has no methods: \`line.length()\` then stops with a \`NullPointerException\`. So always check \`line != null\` first. - -| | Scanner | BufferedReader | -|---|---|---| -| Create | \`new Scanner(new File(…))\` | \`new BufferedReader(new FileReader(…))\` | -| Is there another line? | \`hasNextLine()\` | \`readLine()\` returns \`null\` | -| Next line | \`nextLine()\` | \`readLine()\` | -| Strength | can also read numbers (\`nextInt()\`) | fast, even with large files | - -::: ludwig -The loop looks different from the Scanner one: the first line is read **before** the loop, every further one **at the end** of the pass. If you forget the read at the end, the program reads the same line again and again and never stops. -::: - -::: angeberwissen -Where a line ends is not the same everywhere: Windows writes two invisible characters, “carriage return” and “line feed”, Linux and macOS only the line feed. The names come from the typewriter, where the carriage moved back and the paper moved up one line. \`readLine()\` copes with both. -::: - -## Exercise: How often does the fox appear? - -::: übung l24-java-fuchs -titel: How often does the fox appear? -code: java -auftrag: Read the logbook with the BufferedReader and count the lines that contain **Fox**. At the end, print **Fox:** and the count. -start: l24-java-fuchs-start.visustruct -test: - -> Fox: 3 -braucht: whileSchleife, verzweigung -tipp: Create \`int count = 0;\` before the loop. In the loop, check \`line.contains("Fox")\`. -tipp: The \`line = reader.readLine();\` belongs at the end of the loop, after the if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Closing automatically - -So that \`close()\` isn't forgotten even after an exception, there is a short form of try: whatever is created in the round brackets after \`try\` is closed by Java on its own at the end. - -\`\`\`java -try (BufferedReader reader = new BufferedReader(new FileReader("logbook.txt"))) { - String line = reader.readLine(); - while (line != null) { - System.out.println(line); - line = reader.readLine(); - } -} catch (IOException e) { - System.out.println("The logbook is missing."); -} -\`\`\` - -This is called **try-with-resources**. \`IOException\` catches all errors while reading and writing, including a missing file. - -> Like try and catch, try-with-resources only runs with real Java (lesson 22). In the simulation, you write \`close()\` yourself. - -## The shortcut: Files - -Since Java 11 it is even shorter. \`Files.readString\` reads the whole file at once, as you know from lesson 17. With \`split("\\n")\` you split the text into an array of lines: - -\`\`\`java -import java.nio.file.*; - -String text = Files.readString(Path.of("logbook.txt")); -String[] lines = text.split("\\n"); -for (int i = 0; i < lines.length; i++) { - System.out.println(lines[i]); -} -\`\`\` - -Now all lines are in the array. You can look at them in any order, for example backwards or only every second one. - -| Way | Good for | -|---|---| -| \`Scanner\` | small files, reading numbers and words | -| \`BufferedReader\` | large files, line by line | -| \`Files.readString\` | small files that fit into the program as a whole | - -::: ludwig -A file with a million lines is better read line by line with the BufferedReader. With \`Files.readString\` the whole file would have to go into memory at once. -::: - -## Exercise: The longest entry - -::: übung l24-java-laengster -titel: The longest entry -code: java -auftrag: In the start code, the lines of the logbook are already in the array \`lines\`. Find the longest line and print it like this: **Longest entry:** followed by the line. -start: l24-java-laengster-start.visustruct -test: - -> Longest entry: We 07:00 Zora finds crumbs at Fox's den -braucht: forSchleife, verzweigung -tipp: Remember the longest line so far in \`String longest = lines[0];\` and go through the other lines with a for loop. -tipp: If \`lines[i].length() > longest.length()\`, then \`lines[i]\` becomes the new longest. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Game: File detective - -::: spiel frage -titel: Game: File detective -intro: Who took the cake? Each program searches the **logbook** from the top. Predict what it prints and collect the clues. Five rounds. -frage: What does the program print? - -runde: - String line = reader.readLine(); - line = reader.readLine(); - System.out.println(line.substring(9)); -- Ludwig feeds the goats -- [x] Zora reads in the tower -- Mo 12:30 Zora reads in the tower -> The second \`readLine()\` returns the second line. The text after the time starts at index 9. - -runde: - int n = 0; - String line = reader.readLine(); - while (line != null) { - if (line.startsWith("Tu")) n++; - line = reader.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Four entries are from Tuesday. - -runde: - String line = reader.readLine(); - while (line != null) { - if (line.contains("cake")) { - System.out.println(line.substring(3, 8)); - } - line = reader.readLine(); - } -- [x] 09:00\\n23:55 -- 09:00 -- Tu\\nTu -> Two lines contain "cake". \`substring(3, 8)\` cuts out the time. - -runde: - String line = reader.readLine(); - String last = ""; - while (line != null) { - if (line.contains("Fox")) last = line; - line = reader.readLine(); - } - System.out.println(last); -- Tu 16:20 Fox asks for the recipe -- [x] We 07:00 Zora finds crumbs at Fox's den -- Mo 18:00 Fox sneaks past the gate -> \`last\` is overwritten at every match. At the end it holds the last match. "Fox's den" contains "Fox" too. - -runde: - String line = reader.readLine(); - while (line != null) { - if (line.contains("crumbs")) { - int at = line.indexOf("at "); - System.out.println(line.substring(at + 3)); - } - line = reader.readLine(); - } -- [x] Fox's den -- at Fox's den -- crumbs -> The crumbs are at Fox's den. The fox asked for the recipe, and at 23:55 the cake was gone. Case solved! -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can read a file with BufferedReader and readLine. → Reading with BufferedReader -- I can spot the end of a file, because readLine returns null there (line != null). → Reading with BufferedReader -- I can count how often a word appears in a file. → Exercise: How often does the fox appear? -- I can read a whole file with Files.readString and split it into lines with split. → The shortcut: Files -- I can find the longest entry in a file. → Exercise: The longest entry -::: - -## Quiz - -::: quiz -? What does readLine() return when the file has ended? -→ Reading with BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null means: there is no more text. - -? Why is there another line = reader.readLine() at the end of the loop? -→ Reading with BufferedReader -- [ ] So that the file is closed. -- [x] Otherwise line never changes and the loop never stops. -- [ ] So that the first line is printed twice. - -? What does try-with-resources do? -→ Reading with BufferedReader -- [ ] It reads the file faster. -- [x] It closes the file on its own at the end. -- [ ] It prevents every exception. - -? Match each way to what it is good for. -→ The shortcut: Files -= BufferedReader -> large files, line by line -= Files.readString -> small files all at once -= Scanner -> reading numbers and words -::: -`,ty=`--- -titel: Tables as CSV -bereich: Files -kurz: Read a table as a CSV file, split each line with split and calculate with the numbers. ---- - -## Skills I will gain now - -::: kompetenzen -- explain how a CSV file is built: header, records, separator -- split a line with split and make a number out of it with Integer.parseInt -- skip the header before calculating -- calculate an average from a column of a CSV file -- find the best value in a column of a CSV file -- name one strength and one weakness of CSV -::: - -## A table in a text file - -Mrs Goat, the teacher at the castle school, has saved her class's grades as a table. As in Germany, 1 is the best grade and 6 the worst: - -| Name | Maths | German | English | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Fox | 4 | 3 | 5 | -| Hare | 2 | 1 | 3 | - -In the file, the table looks like this: - -::: datei class.csv -Name;Maths;German;English -Ludwig;2;3;1 -Zora;1;2;2 -Fox;4;3;5 -Hare;2;1;3 -::: - -This is a **CSV file**. CSV stands for "Comma-Separated Values". Each line is a row of the table, and the columns are separated by a separator character. In English-speaking countries this is usually a comma, in Germany and many other countries a **semicolon** \`;\`, because the comma is already used in numbers like \`2,5\`. We use the semicolon. - -- The first line is the **header**. It says what is in the columns. -- Every further line is a **record**, here one pupil. -- Excel, LibreOffice and Numbers open CSV files directly as a table. - -## Splitting a line with split - -You know \`split(";")\` from lesson 17. It splits a text at every semicolon and returns an array: - -\`\`\`java -String line = "Zora;1;2;2"; -String[] parts = line.split(";"); -// parts[0] is "Zora", parts[1] is "1", parts[2] is "2", parts[3] is "2" -\`\`\` - -Afterwards the grades are still **text**. You can only calculate with them once you have turned them into a number with \`Integer.parseInt\`: - -\`\`\`java -int maths = Integer.parseInt(parts[1]); -\`\`\` - -::: diagramm dt-csv.visustruct -Split a CSV line and read the maths grade as a number. -::: - -## Reading the whole file - -For the whole file, you combine the BufferedReader from lesson 24 with \`split\`. The header contains no grades, so you read it before the loop and skip it: - -\`\`\`java -BufferedReader reader = new BufferedReader(new FileReader("class.csv")); -String line = reader.readLine(); // header -line = reader.readLine(); // first record -while (line != null) { - String[] parts = line.split(";"); - System.out.println(parts[0] + ": Maths " + parts[1]); - line = reader.readLine(); -} -reader.close(); -\`\`\` - -::: ludwig -Without the second \`readLine()\` before the loop, the header ends up in the loop. Then \`Integer.parseInt("Maths")\` tries to make a number out of the word, and Java stops with a \`NumberFormatException\`. -::: - -## Exercise: Maths average - -::: übung l25-java-schnitt -titel: Maths average -code: java -auftrag: Calculate the average maths grade. Skip the header, add up the maths grades (column 1) and divide by the number of records. Print **Maths average:** and the average. -start: l25-java-schnitt-start.visustruct -test: - -> Maths average: 2.25 -braucht: whileSchleife -tipp: Create \`double sum = 0;\` and \`int count = 0;\` before the loop. With \`double\`, nothing is cut off when dividing. -tipp: In the loop: \`String[] parts = line.split(";");\`, then \`sum = sum + Integer.parseInt(parts[1]);\` and \`count++;\`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Exercise: Best grade in English - -::: übung l25-java-beste -titel: Best grade in English -code: java -auftrag: Who has the best grade in English (column 3)? Print **Best grade in English:**, the name and the grade in brackets. -start: l25-java-beste-start.visustruct -test: - -> Best grade in English: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Remember the best grade so far in \`int bestGrade = 7;\` and the name in \`String bestName = "";\`. Every real grade is better than 7. -tipp: If \`grade < bestGrade\`, remember the new grade and \`parts[0]\` as the name. -lösung: l25-java-beste-loesung.visustruct -::: - -## Strengths and weaknesses of CSV - -| Good | Tricky | -|---|---| -| Tables take up little space. | If the separator appears in the text, for example \`Hare;very good; hard-working\`, the line falls apart into too many parts. | -| Excel and other programs open the file directly. | Everything is a flat table. If an animal has several favourite foods, that doesn't fit well into one cell. | -| Every program can read it with \`split\`. | The file doesn't say whether \`1\` is a number or a text. | - -::: ludwig -Excel saves CSV files with semicolons in Germany and with commas in England and the USA. That is why someone opening a file from another country sometimes sees everything in one single column. -::: - -## Game: Broken line - -::: spiel bombe -titel: Game: Broken line -intro: In every CSV file **exactly one line is broken**, and the bomb is ticking. Compare each line with the header and tap the broken line before time runs out. Five rounds, 20 seconds each. -zeit: 20 -daten: csv - -runde: - Name;Maths;German;English - Ludwig;2;3;1 - Zora;1 - Fox;4;3;5 -frage: Every line needs four columns. -fehler: 3 -besser: Zora;1;2;2 -> Two grades are missing for Zora. Then there is no \`parts[3]\`, and Java stops with an \`ArrayIndexOutOfBoundsException\`. - -runde: - Name;Grade;Comment - Ludwig;2;works well with others - Hare;1;very good; hard-working - Zora;1;reads a lot -frage: Every line needs three columns. -fehler: 3 -besser: Hare;1;very good, hard-working -> The semicolon in the comment splits off a fourth column. The separator must not appear in the text. - -runde: - Name;Maths;German;English - Ludwig;2;3;1 - Zora;1;2;2 - Fox,4,3,5 -frage: The separator is a semicolon. -fehler: 4 -besser: Fox;4;3;5 -> Here there are commas instead of semicolons. \`split(";")\` finds no semicolon and returns the whole line as a single part. - -runde: - Name;Maths;German;English - Hare;2;1;3 - Fox;four;3;5 - Ludwig;2;3;1 -frage: Grades are numbers. -fehler: 3 -besser: Fox;4;3;5 -> \`Integer.parseInt("four")\` cannot make a number out of the word and throws a \`NumberFormatException\`. - -runde: - Name;Maths;German;English - Zora;1;2;2 - Hare;2;1;3 - Ludwig;2;;1 -frage: No field may be empty. -fehler: 4 -besser: Ludwig;2;3;1 -> There is nothing between the two semicolons. \`Integer.parseInt("")\` throws a \`NumberFormatException\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain how a CSV file is built: header, records, separator. → A table in a text file -- I can split a line with split and make a number out of it with Integer.parseInt. → Splitting a line with split -- I can skip the header before calculating. → Reading the whole file -- I can calculate an average from a column of a CSV file. → Exercise: Maths average -- I can find the best value in a column of a CSV file. → Exercise: Best grade in English -- I can name one strength and one weakness of CSV. → Strengths and weaknesses of CSV -::: - -## Quiz - -::: quiz -? What does "Hare;2;1;3".split(";")[2] return? -→ Splitting a line with split -- [ ] "2" -- [x] "1" -- [ ] 1 -> Counting starts at 0. And the result is a text, not a number. - -? Why does the program call readLine() twice before the loop? -→ Reading the whole file -- [ ] So that the file is read faster. -- [x] The first line is the header without grades. It is skipped. -- [ ] Because readLine always needs two lines. - -? What happens with Integer.parseInt("Maths")? -→ Splitting a line with split -- [ ] It returns 0. -- [x] Java throws a NumberFormatException. -- [ ] It returns the length of the word. - -? Match. -→ Strengths and weaknesses of CSV -= header -> says what is in the columns -= record -> a line with values -= separator -> separates the columns, often ; -::: -`,ny=`--- -titel: Data as JSON -bereich: Files -kurz: Understand JSON files, get values out with indexOf and substring, and write JSON yourself. ---- - -## Skills I will gain now - -::: kompetenzen -- recognise objects, keys, values and lists in JSON -- get a value out of a JSON line with indexOf and substring -- output all values of one key from a JSON file -- build and save a JSON entry with + and \\" -- save data as a JSON file -- name one strength and one weakness of JSON -::: - -## Data with names - -The castle zoo stores its animals in a file \`zoo.json\`: - -::: datei zoo.json -{ - "zoo": "Castle Zoo", - "animals": [ - {"name": "Ludwig", "species": "billy goat", "age": 7}, - {"name": "Zora", "species": "goat", "age": 6}, - {"name": "Fox", "species": "red fox", "age": 4}, - {"name": "Hare", "species": "brown hare", "age": 2} - ] -} -::: - -This is **JSON**, the "JavaScript Object Notation". Almost every web app and every game sends and stores data like this. Unlike in a CSV file, each value has its **name** in front of it, the **key**. - -| Character | Meaning | Example | -|---|---|---| -| \`{ … }\` | an **object**: pairs of key and value | \`{"name": "Zora", "age": 6}\` | -| \`"key": value\` | a pair, separated by a colon | \`"age": 6\` | -| \`[ … ]\` | a **list** of values, like an array | \`"animals": [ … ]\` | -| \`,\` | separates the pairs and the entries of a list | | -| \`"…"\` | a text. Numbers and \`true\`/\`false\` have no quotation marks. | \`"goat"\`, \`6\` | - -Objects and lists can be **nested**: the whole zoo object contains the list \`animals\`, and each animal is an object again. As with arrays, the list counts from 0: \`animals[1].name\` is \`"Zora"\`. - -::: angeberwissen -Douglas Crockford made JSON popular in the early 2000s. In the licence of his JSON program he wrote: “The Software shall be used for Good, not Evil.” So the company IBM asked whether it could use it anyway. He replied that IBM and its customers were allowed to use it for evil. -::: - -## Getting a value out - -Professionals read JSON with a library, for example **Gson**. It is not part of Java and has to be added first. For our zoo file, the string methods from lesson 17 are enough, because each animal is on its own line. - -In Java you write a quotation mark inside a text as \`\\"\`. So the text \`"\\"name\\": \\""\` is \`"name": "\`, exactly what comes before each name. - -\`\`\`java -String line = "{\\"name\\": \\"Zora\\", \\"species\\": \\"goat\\", \\"age\\": 6},"; -int start = line.indexOf("\\"name\\": \\"") + 9; -int end = line.indexOf("\\"", start); -String name = line.substring(start, end); -\`\`\` - -- \`indexOf("\\"name\\": \\"")\` finds the start of \`"name": "\`. That is 9 characters, so the name begins 9 characters further on. -- \`indexOf("\\"", start)\` searches for the next quotation mark **from** \`start\`. That is where the name ends. -- \`substring(start, end)\` cuts out the name: \`Zora\`. - -::: diagramm dt-json.visustruct -Getting the name out of a JSON line. -::: - -## Exercise: All the names in the zoo - -::: übung l26-java-namen -titel: All the names in the zoo -code: java -auftrag: Read \`zoo.json\` line by line. In every line that contains \`"name"\`, print only the name. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Fox | Hare -braucht: whileSchleife, verzweigung -tipp: Check with \`line.contains("\\"name\\"")\` whether there is a name in the line. Skip the other lines. -tipp: Inside the if: \`int start = line.indexOf("\\"name\\": \\"") + 9;\`, then \`int end = line.indexOf("\\"", start);\` and \`System.out.println(line.substring(start, end));\`. -lösung: l26-java-namen-loesung.visustruct -::: - -## Writing JSON - -To write, you put the text together with \`+\` and write it to the file with the PrintWriter from lesson 23. Texts in JSON need quotation marks, so \`\\"\` in the Java text, numbers don't: - -\`\`\`java -String name = "Zora"; -int points = 15; -String entry = "{\\"name\\": \\"" + name + "\\", \\"points\\": " + points + "}"; -// entry is {"name": "Zora", "points": 15} -\`\`\` - -In a list there is a comma between the entries, but **none** after the last one. You check that with an if. - -::: ludwig -A single forgotten quotation mark or one comma too many, and no program can read the file any more. JSON is strict. That is why professionals also use a library for writing. -::: - -## Exercise: Saving points as JSON - -::: übung l26-java-schreiben -titel: Saving points as JSON -code: java -auftrag: Save the points from the quiz tournament as a list in \`points.json\`. Each line contains an object with **name** and **points**, and there is a comma between the objects. At the end, print **3 entries saved**. -start: l26-java-schreiben-start.visustruct -test: - -> 3 entries saved -datei: points.json -> [ | {"name": "Ludwig", "points": 12}, | {"name": "Zora", "points": 15}, | {"name": "Fox", "points": 9} | ] -braucht: forSchleife, verzweigung -tipp: Go through the arrays with \`for (int i = 0; i < names.length; i++)\`. Build the entry with \`" {\\"name\\": \\"" + names[i] + "\\", \\"points\\": " + points[i] + "}"\`. -tipp: If \`i < names.length - 1\`, add \`","\`. After the loop, write \`"]"\` and close the file. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Strengths and weaknesses of JSON - -| Good | Tricky | -|---|---| -| Every value has a name. You can see at once what \`6\` means. | The file is longer than a CSV file, because the keys appear on every line. | -| Data can be nested, for example a list inside an object. | Java can't read JSON on its own. You need a library such as Gson. | -| JSON is the standard on the web. Almost every programming language knows it. | One character too many or too few makes the whole file unreadable. | - -## Game: Which key? - -::: spiel frage -titel: Game: Which key? -intro: Ludwig is looking for values in JSON files. Read the file and say which value is meant. Five rounds. - -runde: - {"name": "Zora", "species": "goat", "age": 6} -frage: What is the value of **age**? -- "age" -- [x] 6 -- "goat" -> The key comes before the colon, the value after it. Numbers have no quotation marks. - -runde: - { - "animals": [ - {"name": "Ludwig", "age": 7}, - {"name": "Zora", "age": 6}, - {"name": "Fox", "age": 4} - ] - } -frage: What is **animals[1].name**? -- Ludwig -- [x] Zora -- Fox -> The list counts from 0, like an array. \`animals[1]\` is the second animal. - -runde: - { - "zoo": "Castle Zoo", - "boss": {"name": "Ludwig", "species": "billy goat"} - } -frage: How do you get to **billy goat**? -- [x] boss.species -- species -- zoo.boss.species -> \`species\` is inside the object \`boss\`. So the way goes through \`boss\`. - -runde: - { - "name": "Hare", - "favouriteFood": ["carrots", "clover", "dandelions"] - } -frage: What is **favouriteFood[2]**? -- clover -- carrots -- [x] dandelions -> Index 0 is carrots, 1 is clover, 2 is dandelions. Something like this hardly fits into one cell in CSV. - -runde: - {"name": "Fox", "age": 4, "hungry": true} -frage: Which key has a truth value? -- name -- age -- [x] hungry -> \`true\` and \`false\` have no quotation marks, like numbers. In Java this would be a \`boolean\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can recognise objects, keys, values and lists in JSON. → Data with names -- I can get a value out of a JSON line with indexOf and substring. → Getting a value out -- I can output all values of one key from a JSON file. → Exercise: All the names in the zoo -- I can build and save a JSON entry with + and \\". → Writing JSON -- I can save data as a JSON file. → Exercise: Saving points as JSON -- I can name one strength and one weakness of JSON. → Strengths and weaknesses of JSON -::: - -## Quiz - -::: quiz -? What comes before each value in JSON? -→ Data with names -- [ ] its line number -- [x] its key, for example "name" -- [ ] a semicolon -> Key and value are separated by a colon. - -? How do you write a quotation mark inside a Java text? -→ Writing JSON -- [ ] "" -- [x] \\" -- [ ] '"' - -? In {"animals": [{"name": "Ludwig"}, {"name": "Zora"}]}, what is the value of animals[0].name? -→ Data with names -- [x] Ludwig -- [ ] Zora -- [ ] animals -> The list counts from 0. - -? Match. -→ Strengths and weaknesses of JSON -= { } -> an object with keys and values -= [ ] -> a list -= : -> separates key and value -::: -`,iy=`--- -titel: Comparing formats -bereich: Files -kurz: Compare the same data as txt, CSV and JSON, choose the right format and convert a file into another format. ---- - -## Skills I will gain now - -::: kompetenzen -- recognise the same data as txt, CSV and JSON -- compare strengths and weaknesses of txt, CSV and JSON -- convert a CSV file into sentences -- convert a CSV file into JSON -::: - -## The same animals three times - -Ludwig has saved the castle's animals in three files. They all contain the same, just written down differently. - -As text, the way you would write it to a person: - -::: datei animals.txt -Ludwig (billy goat) is 7 years old. -Zora (goat) is 6 years old. -Fox (red fox) is 4 years old. -::: - -As a table in CSV: - -::: datei animals.csv -Name;Species;Age -Ludwig;billy goat;7 -Zora;goat;6 -Fox;red fox;4 -::: - -As JSON: - -::: datei animals.json -[ - {"name": "Ludwig", "species": "billy goat", "age": 7}, - {"name": "Zora", "species": "goat", "age": 6}, - {"name": "Fox", "species": "red fox", "age": 4} -] -::: - -## What can each format do? - -| | txt | CSV | JSON | -|---|---|---|---| -| Easy for people to read | yes | so-so | so-so | -| Fixed order for programs | no | yes, columns | yes, keys | -| What does a value mean? | it's in the sentence | it's in the header | it's right in front of it | -| Nesting (a list inside an entry) | no | hard | yes | -| Opens in Excel | no | yes | no | -| Reading in Java | Scanner, BufferedReader | plus \`split\` | string methods or a library | -| Size | small | smallest | largest | - -In short: - -- **txt** for texts that people read: letters, notes, a logbook. -- **CSV** for tables: grades, measurements, a high-score list. Every line has the same columns. -- **JSON** for data with structure: game saves, settings, everything that goes back and forth between programs and on the web. - -::: ludwig -When your weather app fetches the temperature, the answer almost always comes as JSON. And when a teacher exports the grades from the school software, they often get a CSV file. -::: - -## Exercise: From CSV to sentences - -::: übung l27-java-saetze -titel: From CSV to sentences -code: java -auftrag: Convert \`animals.csv\` into text. For each animal, write a sentence like **Ludwig (billy goat) is 7 years old.** into the file \`sentences.txt\`. At the end, print **3 sentences saved**. -start: l27-java-saetze-start.visustruct -test: - -> 3 sentences saved -datei: sentences.txt -> Ludwig (billy goat) is 7 years old. | Zora (goat) is 6 years old. | Fox (red fox) is 4 years old. -braucht: whileSchleife -tipp: The start code already skips the header. Split each line with \`String[] parts = line.split(";");\`. -tipp: The sentence is \`parts[0] + " (" + parts[1] + ") is " + parts[2] + " years old."\`. Count along with \`count++\` and read the next line at the end of the loop. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Exercise: From CSV to JSON - -::: übung l27-java-json -titel: From CSV to JSON -code: java -auftrag: Convert \`animals.csv\` into JSON and save it in \`animals-new.json\`, exactly like \`animals.json\` above. At the end, print **3 animals saved**. -start: l27-java-json-start.visustruct -test: - -> 3 animals saved -datei: animals-new.json -> [ | {"name": "Ludwig", "species": "billy goat", "age": 7}, | {"name": "Zora", "species": "goat", "age": 6}, | {"name": "Fox", "species": "red fox", "age": 4} | ] -braucht: forSchleife, verzweigung -tipp: \`lines[0]\` is the header. So start the for loop at \`i = 1\` and split \`lines[i]\` with \`split(";")\`. -tipp: Build the entry with \`\\"\` as in lesson 26. The age is a number and has no quotation marks. Only add a comma if \`i < lines.length - 1\`. -lösung: l27-java-json-loesung.visustruct -::: - -## Game: Which format fits? - -::: spiel frage -titel: Game: Which format fits? -intro: Ludwig wants to save data and doesn't know which format to use. Help him. Six rounds. -antworten: txt | CSV | JSON - -runde: -frage: The grades of the whole class should be opened in Excel. -richtig: CSV -> Grades are a table, and Excel opens CSV files directly. - -runde: -frage: Ludwig writes a letter to Zora. -richtig: txt -> A letter is text for people. It needs no columns and no keys. - -runde: -frage: A game save with a name, a level and a list of all the keys collected. -richtig: JSON -> A list inside an entry can be nested in JSON. In CSV it hardly fits into one cell. - -runde: -frage: A measuring device saves the time and temperature every minute, for a whole year. -richtig: CSV -> Many identical lines with the same columns: CSV is the smallest for this. JSON would repeat the keys on every line. - -runde: -frage: A weather app fetches the forecast from a server on the internet. -richtig: JSON -> JSON is the standard on the web. Almost every app gets its data this way. - -runde: -frage: The castle logbook, where every entry is a short sentence. -richtig: txt -> Every line is a sentence for people. It is read line by line, as in lesson 24. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can recognise the same data as txt, CSV and JSON. → The same animals three times -- I can compare strengths and weaknesses of txt, CSV and JSON. → What can each format do? -- I can convert a CSV file into sentences. → Exercise: From CSV to sentences -- I can convert a CSV file into JSON. → Exercise: From CSV to JSON -::: - -## Quiz - -::: quiz -? Which format does Excel open directly as a table? -→ What can each format do? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Why is a JSON file usually larger than a CSV file with the same data? -→ What can each format do? -- [ ] Because JSON stores more numbers. -- [x] Because the keys are repeated in every entry. -- [ ] Because JSON uses no commas. - -? In which format does every value say what it means? -→ What can each format do? -- [ ] txt -- [ ] CSV -- [x] JSON -> In JSON the key comes right before the value, for example "age": 7. - -? Match each purpose with a format. -→ What can each format do? -= a letter to Zora -> txt -= the class grade list -> CSV -= a game save with lists -> JSON -::: -`,ay=`--- -titel: Your first window -bereich: Windows with Swing -kurz: Open your own window with Java and Swing, explained line by line. ---- - -## Skills I will gain now - -::: kompetenzen -- switch on “Real Java” in the Code area -- open a window with a title and a size -- explain what each line of the window program does -- explain why setVisible(true) comes last -::: - -## Programs with windows - -So far your programs have written text to the console. Most programs you know, however, have **windows** with buttons and text fields. This is called a graphical user interface. - -Java comes with a toolbox for this: **Swing**. In VisuStruct you switch it on like this: - -1. Open the [Code](#zeige-codelive) area on the right. -2. Click the [gear](#zeige-einstellungen) at the top right and choose Java as the **Programming language**. -3. Below that, in the Java section, tick **Real Java (with Swing)**. - -The first time you click [▶︎ Run](#zeige-ausfuehren), VisuStruct downloads about 40 MB once, which takes a moment. After that your code runs as real Java, and your windows appear in the Code area in the **Java windows** box above the console. - -> With “Real Java”, input from the console (\`Scanner\`) does not work yet. For programs with input, untick the box again. - -::: angeberwissen -Swing has been around since 1998. Before that, Java only had the older AWT with a class called \`Frame\`. So that nobody mixes up the new building blocks, almost all names in Swing start with **J**: \`JFrame\`, \`JButton\`, \`JLabel\`. The J tells you straight away that it is Swing. -::: - -## The whole program - -This is the smallest program that opens a window. Type it into the Code area and click [▶︎ Run](#zeige-ausfuehren): - -\`\`\`java -import javax.swing.*; - -public class MyWindow { - public static void main(String[] args) { - JFrame window = new JFrame("My first window"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); - } -} -\`\`\` - -An empty grey window with the title “My first window” appears. That's all, but it is your very own window! - -You already know the frame with \`public class\` and \`main\` from the Java lesson. The first line and the four lines inside \`main\` are new. Let's look at them one by one. - -::: ludwig -Look at the structure chart next to the code: every line in \`main\` is a box, one below the other. So at the start, a window program is just a sequence. -::: - -## Line by line - -| Line | What it does | -|---|---| -| \`import javax.swing.*;\` | Brings the Swing toolbox into the program. Without this line Java does not know \`JFrame\`. | -| \`JFrame window = new JFrame("My first window");\` | Builds a new window. The text in brackets is the title at the top of the window frame. After that you talk to it through the variable \`window\`. | -| \`window.setSize(300, 200);\` | The window becomes 300 pixels wide and 200 pixels high. | -| \`window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\` | When someone closes the window, the program ends too. | -| \`window.setVisible(true);\` | Only now does the window become visible. | - -The dot in \`window.setSize(…)\` means: “Window, do this!” Before the dot is who should do something, after it is what they should do. - -> Without \`setDefaultCloseOperation\`, Java only hides the window when it is closed. The program then keeps running invisibly. - -::: quiz -? What does the dot in \`window.setSize(300, 200)\` mean? -- [x] “Window, do this!”: before the dot is who does something, after it what they do. -- [ ] It separates the two numbers. -- [ ] It ends the line. -> Before the dot is the object \`window\`, after it its method \`setSize\`. -::: - -## Why setVisible comes last - -\`setVisible(true)\` shows the window exactly as it is at that moment. So you set everything up first: title, size, and later buttons too. Only at the very end do you make the window visible. - -Things you put into the window after \`setVisible(true)\` often do not appear. Java does not redraw the window on its own. Sometimes they only show up when you resize the window. Mistakes like that are hard to find. - -::: ludwig -Set up first, then show. Like in the theatre: the curtain only goes up once the stage is ready. -::: - -Try it: delete the line with \`setVisible(true)\` and run the program again. The program runs, but you do not see a window. - -## Classes and objects - -This is not in the curriculum, but it helps you understand Swing. - -::: angeberwissen -Java is really an **object-oriented** language. \`JFrame\` is a class, a blueprint for windows. With \`new JFrame(…)\` Java builds a real window from this blueprint, an **object**. With two \`new\` you could build two windows, both from the same blueprint. - -\`setSize\` and \`setVisible\` are methods that every window object has. That is why you write \`window.setSize(…)\`: the object \`window\` runs its method. Your program itself is a class too, namely \`MyWindow\`. -::: - -## Game: What happens? - -::: spiel frage -titel: Game: What happens? -intro: Ludwig has been tinkering with the window program. Read the lines and predict what happens. Six rounds. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: What do you see after running it? -- a window with the title "Hello" -- [x] no window at all -- an error message -> \`setVisible(true)\` is missing. The window is built, but it stays invisible. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(200, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); -frage: What does the window look like? -- wider than high -- [x] higher than wide -- square -> The first number is the width, the second the height: 200 wide, 300 high. - -runde: - JFrame window = new JFrame("Hello"); - window.setSize(300, 200); - window.setVisible(true); -frage: You close the window. What happens to the program? -- It ends. -- [x] It keeps running invisibly. -- The window opens again right away. -> Without \`setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\` Java only hides the window. - -runde: - JFrame window = new JFrame(); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setVisible(true); -frage: What is written at the top of the window frame? -- window -- JFrame -- [x] nothing, the title is empty -> Without text in the brackets the window has no title. The variable name \`window\` never shows up in the window. - -runde: - public class Test { - public static void main(String[] args) { - JFrame window = new JFrame("Test"); - window.setVisible(true); - } - } -frage: What does javac report? -- [x] cannot find symbol: class JFrame -- nothing, the window appears -- missing return statement -> The line \`import javax.swing.*;\` is missing. Without it Java doesn't know \`JFrame\`. - -runde: - JFrame a = new JFrame("One"); - JFrame b = new JFrame("Two"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: What do you see? -- [x] one window with the title "One" -- two windows -- one window with the title "Two" -> Two windows from the same blueprint, but only \`a\` is made visible. -::: - -## Task: your own window - -Change the program so that - -- the title says “Hello” and your name, -- the window is 400 pixels wide and 300 pixels high, -- the program ends when you close the window. - -Run it and check all three points. - -::: ludwig -Don't feel like typing so much? With “Real Java” you may type just the four lines from \`main\` into the Code area. VisuStruct then wraps them in a class itself and adds the \`import\` lines. In a real Java development environment, though, you need the whole program. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can switch on “Real Java” in the Code area. → Programs with windows -- I can open a window with a title and a size. → The whole program -- I can explain what each line of the window program does. → Line by line -- I can explain why setVisible(true) comes last. → Why setVisible comes last -::: - -## Quiz - -::: quiz -? Which line makes the window visible? -→ Why setVisible comes last -- [ ] window.setSize(300, 200); -- [x] window.setVisible(true); -- [ ] new JFrame("Hello"); -> Without setVisible(true) the window stays invisible. - -? Where is the best place for window.setVisible(true)? -→ Why setVisible comes last -- [ ] At the very start of main -- [x] At the end, once the window is set up -- [ ] It does not matter. -> Things added after setVisible(true) often do not appear. - -? What does setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) do? -→ Line by line -- [ ] The window closes immediately. -- [x] When you close the window, the program ends. -- [ ] The window can no longer be closed. - -? How do you recognise building blocks from Swing? -→ Line by line -- [x] Their name starts with J, e.g. JFrame. -- [ ] They are in curly brackets. -- [ ] They end in Window. -::: -`,sy=`--- -titel: A button in the window -bereich: Windows with Swing -kurz: Put a button into the window and arrange it neatly with a layout. ---- - -## Skills I will gain now - -::: kompetenzen -- build a button and put it into the window with add -- explain why the button goes in before setVisible -- use FlowLayout so that the button has its normal size -- build a window with a button you can press -::: - -## Building a button - -An empty window is boring. Now a button goes in. In Swing a button is called **JButton**. - -You need two new lines for it: - -\`\`\`java -JButton button = new JButton("Click me"); -window.add(button); -\`\`\` - -- \`new JButton("Click me")\` builds a button. The text in brackets will be written on the button. -- \`window.add(button)\` puts the button into the window. Without \`add\` the button exists, but it is not placed anywhere and you cannot see it. - -::: quiz -? What is written on the button after \`new JButton("Start")\`? -- [ ] button -- [x] Start -- [ ] JButton -> The text in brackets is the label. \`button\` is only the name of the variable. -::: - -## The whole program - -Both lines go **before** \`setVisible(true)\`, because the window should be set up completely first and then shown: - -\`\`\`java -import javax.swing.*; - -public class ButtonWindow { - public static void main(String[] args) { - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton button = new JButton("Click me"); - window.add(button); - - window.setVisible(true); - } -} -\`\`\` - -Run the program. Surprise: the button is huge and fills the whole window! - -::: ludwig -The order is the same as with your first window: set up, build the button, put the button in and show everything at the very end. The empty lines in the code help you see these parts. -::: - -## The giant button - -How a window arranges its parts is decided by its **layout**. Without further instructions, a \`JFrame\` puts everything in the middle and makes it as big as the whole window. - -With a different layout the button gets its normal size. The **FlowLayout** places everything side by side like words in a line, only as big as needed: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class ButtonWindow { - public static void main(String[] args) { - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new FlowLayout()); - - JButton button = new JButton("Click me"); - window.add(button); - - window.setVisible(true); - } -} -\`\`\` - -\`FlowLayout\` belongs to the older AWT toolbox. That is why there is a second line at the top: \`import java.awt.*;\`. - -::: angeberwissen -With FlowLayout the building blocks flow like text: if a button no longer fits into the line, it moves to the next one. Make the window narrow and watch the buttons wrap. That is where the name comes from. -::: - -## Clicking works, but nothing happens - -Click the button. It turns a little darker while you press it. So Swing shows that it was pressed. Apart from that, nothing happens. - -That is not a mistake: you have not told the program **what** should happen on a click yet. You will learn that in the next lesson. - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every window program contains **exactly one mistake**, and the bomb is ticking. Read what the program should do and tap the wrong line before time runs out. Six rounds, 25 seconds each. -zeit: 25 - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - JButton button = new JButton(Click me); - window.add(button); - window.setVisible(true); -frage: Should show a button "Click me". -fehler: 3 -besser: JButton button = new JButton("Click me"); -> The caption is a text and needs quotation marks. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - JButton button = new JButton("OK"); - window.add(window); - window.setVisible(true); -frage: Should put the button "OK" into the window. -fehler: 4 -besser: window.add(button); -> The button goes into the window, not the window itself. - -runde: - import java.swing.*; - import java.awt.*; -frage: Should bring Swing and the FlowLayout into the program. -fehler: 1 -besser: import javax.swing.*; -> Swing lives in \`javax.swing\`, with an x. The FlowLayout comes from \`java.awt\`, without an x. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout); - window.add(new JButton("OK")); - window.setVisible(true); -frage: Should show the button at its normal size. -fehler: 3 -besser: window.setLayout(new FlowLayout()); -> After \`new\` and the name there are always round brackets, even if nothing is inside. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout()); - JButton button = new Jbutton("OK"); - window.add(button); - window.setVisible(true); -frage: Should show a button "OK". -fehler: 4 -besser: JButton button = new JButton("OK"); -> Java tells capital and small letters apart: \`JButton\` with a capital B. - -runde: - JFrame window = new JFrame("Button"); - window.setSize(300, 200); - window.setLayout(new FlowLayout()); - window.add(new JButton("OK")); - window.setVisible(false); -frage: Should show the window with the button. -fehler: 5 -besser: window.setVisible(true); -> With \`false\` the window stays invisible. -::: - -## Task: click me - -Build a window with the title “Button test”, 300 by 200 pixels, with a button “Click me” in normal size. It should be possible to press the button, even though nothing happens yet. - -Extra: put a second button “Me too” next to it. In which order are the buttons? Swap the two \`add\` lines and try again. - -**You are done when …** - -- the window title says “Button test”, -- the window is 300 pixels wide and 200 pixels high, -- the “Click me” button is only as big as its text and does not fill the whole window, -- the button visibly presses down when you click it. - -::: ludwig -Every button needs its own variable, for example \`button\` and \`button2\`, and its own \`add\`. FlowLayout places the buttons in the order of the \`add\` lines. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a button and put it into the window with add. → Building a button -- I can explain why the button goes in before setVisible(true). → The whole program -- I can use FlowLayout so that the button has its normal size. → The giant button -- I can build a window with a button you can press. → Task: click me -::: - -## Quiz - -::: quiz -? What does window.add(button) do? -→ Building a button -- [ ] It builds a new button. -- [x] It puts the button into the window. -- [ ] It makes the button clickable. -> The button is built with new JButton(…). - -? Why does the button fill the whole window without FlowLayout? -→ The giant button -- [ ] Because the text is too long -- [x] Because without its own layout the window makes everything as big as the window -- [ ] Because setSize is missing - -? Which import line do you need for FlowLayout? -→ The giant button -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> FlowLayout comes from the older AWT. - -? What happens when you click the button in this lesson? -→ Task: click me -- [ ] The program ends. -- [x] The button turns darker for a moment, nothing else happens. -- [ ] The button says “I was clicked”. -> What should happen on a click is what you learn in the next lesson. -::: -`,ry=`--- -titel: The button reacts -bereich: Windows with Swing -kurz: Use an ActionListener to decide what happens on a click. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an event is -- use addActionListener to decide what happens on a click -- run several statements on a click -- build a button that changes its text after the click -::: - -## A click is an event - -In the last lesson you could press the button, but nothing happened. In a window program it is the person who decides when something happens: they click, type or close a window. Each such action is called an **event**. - -So your program has to wait for the click and notice it. For this you register a listener with the button, an **ActionListener**. On every click the button calls its listener, and the listener runs your code. - -::: ludwig -Until now your program ran from top to bottom, just like the structure chart. The code in the listener only runs later, whenever someone clicks. Nobody knows in advance how often that will be. -::: - -## The line with the arrow - -This is how you register the listener: - -\`\`\`java -button.addActionListener(e -> button.setText("I was clicked")); -\`\`\` - -Read from the outside in: - -- \`button.addActionListener( … )\` registers a listener with the button. -- \`e\` is the event. It contains, for example, when the click happened. You do not need it here, but the name has to be there. -- Read \`->\` as “then do”. -- \`button.setText("I was clicked")\` is what happens on a click: the button gets a new label. - -The line comes after \`new JButton(…)\`, because the button has to exist already. And like everything else it comes before \`setVisible(true)\`. - -::: quiz -? What does the \`e\` in \`e -> button.setText(…)\` stand for? -- [x] The event, that is the click -- [ ] “End” -- [ ] An error -> You do not need \`e\` here, but the name has to be there. -::: - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class ClickMe { - public static void main(String[] args) { - JFrame window = new JFrame("Click me"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new FlowLayout()); - - JButton button = new JButton("Click me"); - button.addActionListener(e -> button.setText("I was clicked")); - window.add(button); - - window.setVisible(true); - } -} -\`\`\` - -Run it and click the button. Now it says “I was clicked”. - -> If the new text is longer than the old one, FlowLayout makes the button wider on its own. - -## Several statements on a click - -If more than one thing should happen on a click, put curly brackets after the arrow. Inside, every statement has its semicolon, just like in a loop body: - -\`\`\`java -button.addActionListener(e -> { - button.setText("I was clicked"); - window.setTitle("Thank you!"); - System.out.println("Click!"); -}); -\`\`\` - -\`System.out.println\` writes to the [console](#zeige-konsole) as usual. Click several times: every click adds a new line “Click!”. That shows you that the code in the listener really runs on every click. - -::: ludwig -Watch the ending: first \`}\` closes the block, then \`)\` closes the bracket of \`addActionListener\`, then comes the semicolon. So \`});\`. If any of it is missing, a hint appears below the code. -::: - -## Game: Who is listening? - -::: spiel zuhoerer -titel: Game: Who is listening? -intro: Ludwig shows you code and the window that goes with it. Below it you see which buttons are clicked, one after the other. What happens? After your answer Ludwig plays the clicks: you see which listener hears the event and which lines then run. -frage: What does the label say after the clicks? - -runde: - JFrame window = new JFrame("Greeting"); - JLabel text = new JLabel("Start"); - JButton button = new JButton("Hello"); - button.addActionListener(e -> text.setText("Hello world")); -klicks: Hello -- Start -- [x] Hello world -- Hello -> The button has a listener. On a click it runs \`text.setText("Hello world")\`, and the label shows “Hello world”. - -runde: - JFrame window = new JFrame("Fruit"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apple")); - b.addActionListener(e -> text.setText("Pear")); -klicks: A, B -- Apple -- [x] Pear -- Apple Pear -> Each button has its own listener. First A writes “Apple”, then B overwrites it with “Pear”. \`setText\` replaces the old text, it doesn't add anything. - -runde: - JFrame window = new JFrame("Fruit"); - JLabel text = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> text.setText("Apple")); -klicks: B -- Apple -- Pear -- [x] ? -> Nobody signed up at button B: there is no \`b.addActionListener\`. The click is an event, but nobody is listening. So the question mark stays. - -runde: - JFrame window = new JFrame("Colours"); - JLabel text = new JLabel("none"); - JButton red = new JButton("Red"); - JButton blue = new JButton("Blue"); - red.addActionListener(e -> text.setText("Blue")); - blue.addActionListener(e -> text.setText("Red")); -klicks: Red -- Red -- [x] Blue -- none -> Careful: what happens is decided by the code in the listener, not by the caption of the button. The listener on the button “Red” writes “Blue”. - -runde: - JFrame window = new JFrame("Button"); - JLabel text = new JLabel("Please click"); - JButton button = new JButton("Click me"); - button.addActionListener(e -> { - button.setText("Thanks!"); - text.setText("Clicked"); - }); -klicks: Click me -frage: What does the button say after the click? -- Click me -- [x] Thanks! -- Clicked -> The block after the arrow has two statements. Both run on the click, one after the other: the button gets “Thanks!”, the label “Clicked”. - -runde: - JFrame window = new JFrame("Console"); - JButton button = new JButton("Go"); - button.addActionListener(e -> System.out.println("Click!")); -klicks: Go, Go, Go -frage: How many lines “Click!” are in the console afterwards? -- 1 -- [x] 3 -- 0 -> The listener runs on **every** click, not only on the first one. Three clicks, three lines. -::: - -## ActionListener is an interface - -This is not in the curriculum. If you want to know what is behind the arrow, read on. - -::: angeberwissen -\`ActionListener\` is an **interface**, a kind of contract. It says: whoever wants to be an ActionListener must have a method \`actionPerformed(ActionEvent e)\`. On every click the button calls exactly this method. -::: - -You already know the line with the arrow from step 3: - -\`\`\`java -button.addActionListener(e -> button.setText("I was clicked")); -\`\`\` - -Without the arrow you write the listener as a class without a name that fulfils the contract (an anonymous class): - -\`\`\`java -button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - button.setText("I was clicked"); - } -}); -\`\`\` - -For this you also need \`import java.awt.event.*;\` at the top. Both ways do exactly the same. The arrow \`e -> …\` is the short form (a lambda expression, since Java 8): \`e\` is the parameter of \`actionPerformed\`, and after the arrow comes its body. The short form works because the interface has only one method. So Java knows which method is meant. - -## Game: Contract fulfilled? - -::: spiel vertrag -titel: Game: Contract fulfilled? -intro: The contract \`ActionListener\` asks for exactly one method: \`public void actionPerformed(ActionEvent e)\`. Ludwig shows you code. Does it fulfil the contract, so that you can sign it up at a button? Ludwig checked every answer with the real Java compiler. -frage: Does this fulfil the contract ActionListener? -antworten: fulfilled | not fulfilled - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: fulfilled -> Everything is there: \`implements ActionListener\` signs the contract, and the method is called exactly \`actionPerformed\`, is \`public\`, returns nothing (\`void\`) and gets an \`ActionEvent\`. - -runde: - class Greeting implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> Look closely: \`actionPerfomed\` instead of \`actionPerformed\`, an r is missing. For Java that is a completely different method. The compiler reports that \`actionPerformed\` is missing. - -runde: - class Greeting implements ActionListener { - public void actionPerformed() { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> The parameter is missing. The contract asks for \`actionPerformed(ActionEvent e)\`, because on a click the button hands over the event. - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent event) { - System.out.println("Hello"); - } - } -richtig: fulfilled -> You can choose the name of the parameter freely. Only the type \`ActionEvent\` matters. So instead of \`e\` it may also be called \`event\`. - -runde: - class Greeting implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } -richtig: not fulfilled -> The \`public\` is missing. All methods of an interface are public, because the button has to be able to call them from outside. Without \`public\` the compiler reports an error. - -runde: - class Greeting implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: not fulfilled -> The contract says \`void\`: the method returns nothing. With \`int\` as the return type it no longer fits. - -runde: - class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - sayHello(); - } - void sayHello() { - System.out.println("Hello"); - } - } -richtig: fulfilled -> Extra methods are allowed. The contract only asks that \`actionPerformed\` is there, not that nothing else is there. - -runde: - class Greeting { - public void actionPerformed(ActionEvent e) { - System.out.println("Hello"); - } - } - button.addActionListener(new Greeting()); -richtig: not fulfilled -> The method is right, but the contract isn't signed: \`implements ActionListener\` is missing. At a button Java only accepts objects that officially fulfil the contract. - -runde: - button.addActionListener(e -> System.out.println("Hello")); -richtig: fulfilled -> The arrow is the short form. Because the contract has only one method, Java knows: \`e\` is the parameter of \`actionPerformed\`, and after the arrow comes its body. - -runde: - button.addActionListener((a, b) -> System.out.println("Hello")); -richtig: not fulfilled -> Here the arrow has two parameters. But \`actionPerformed\` gets exactly one, the event. So this short form doesn't fit the contract. -::: - -## Task: I was clicked - -Now you finish the task: build a window with a button “Click me” in normal size. After the click the button says “I was clicked”. - -Extra: build two buttons “Red” and “Blue”. Clicking a button writes its name into the window title, for example “You chose Red”. - -**You are done when …** - -- the button says “Click me” before the click, -- it says “I was clicked” after the click, -- the button does not fill the whole window. - -::: ludwig -Every button gets its own listener with its own \`addActionListener\`. You change the title with \`window.setTitle(…)\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an event is. → A click is an event -- I can use addActionListener to decide what happens on a click. → The line with the arrow -- I can run several statements on a click. → Several statements on a click -- I can build a button that changes its text after the click. → Task: I was clicked -::: - -## Quiz - -::: quiz -? What is an ActionListener? -→ A click is an event -- [ ] A button with text -- [x] A listener that runs your code on every click -- [ ] A layout for windows -> You register it with the button using addActionListener. - -? When does button.setText("I was clicked") in the listener run? -→ The line with the arrow -- [ ] Right when the program starts -- [x] Every time someone clicks the button -- [ ] Only on the first click -> The code in the listener only runs when the event happens. - -? How does a listener with curly brackets end? -→ The line with the arrow -- [ ] };) -- [x] }); -- [ ] );} -> First the block closes, then the bracket of addActionListener, then the semicolon. - -? Match each part to its job. -→ The line with the arrow -= JButton -> a button -= addActionListener -> register a listener -= setText -> change the label -= setVisible(true) -> show the window -::: -`,oy=`--- -titel: Doubling a number in a window -bereich: Windows with Swing -kurz: Arrange a label, a text field and a button with a GridLayout and calculate with the text in the text field. ---- - -## Skills I will gain now - -::: kompetenzen -- put a JLabel and a JTextField into the window -- explain why only the last building block shows without a layout -- arrange everything below each other with GridLayout -- calculate with getText, Integer.parseInt and setText -- write a program that doesn't crash with “abc” -::: - -## The goal - -We build a small calculator with a window: at the top there is a label, below it a text field and a button **Calculate**. If you type 2 and click, the text field shows 4. Click again and it becomes 8, then 16 and so on. - -For this you need two new building blocks: - -- **JLabel**: a label, simply text in the window. -- **JTextField**: a text field you can type into. - -As in the last lessons, tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Three building blocks in the window - -We put all three building blocks into the window, just like the button in lesson 29: - -\`\`\`java -import javax.swing.*; - -public class Doubling { - public static void main(String[] args) { - JFrame window = new JFrame("Double the number"); - window.setSize(250, 150); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel label = new JLabel("Enter a number:"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate"); - window.add(label); - window.add(field); - window.add(button); - - window.setVisible(true); - } -} -\`\`\` - -Run the program. Oops: all you can see is the giant button. Where are the label and the text field? - -## Why only the button shows - -::: ludwig -Remember the giant button? Without a layout of its own, a \`JFrame\` has only **one** place: the middle. Every \`add\` puts the new building block exactly there, as big as the whole window. So the three building blocks land on top of each other in the same place, and the window only shows the last one you put in: the button. You can't use the program like this. -::: - -The solution is a layout again. This time we use the **GridLayout**. It divides the window into cells of equal size, like a grid: - -\`\`\`java -window.setLayout(new GridLayout(0, 1)); -\`\`\` - -The two numbers are rows and columns. \`0\` rows means “as many as needed”, \`1\` column means: everything below each other. For \`GridLayout\` you also need \`import java.awt.*;\` at the top. - -| Layout | How it arranges things | -|---|---| -| no layout | everything in the middle, on top of each other | -| \`FlowLayout\` | side by side like words, with a line break when needed | -| \`GridLayout(0, 1)\` | below each other, every row the same height | - -## The window with GridLayout - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Doubling { - public static void main(String[] args) { - JFrame window = new JFrame("Double the number"); - window.setSize(250, 150); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel label = new JLabel("Enter a number:"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate"); - window.add(label); - window.add(field); - window.add(button); - - window.setVisible(true); - } -} -\`\`\` - -Now all three are below each other. You can type into the text field and press the button. But the program doesn't calculate anything yet. - -::: angeberwissen -With \`new GridLayout(2, 3)\` you get 2 rows with 3 columns each, so 6 cells of the same size. That is how you build the keys of a calculator, for example. The building blocks fill the cells in the order of the \`add\` lines, row by row from left to right. -::: - -## Calculating with the text in the text field - -On a click, the program should take the number from the text field, double it and write it back. Three methods do this: - -- \`field.getText()\` gives you the text in the text field, for example \`"2"\`. -- \`Integer.parseInt(…)\` turns it into the number 2. You know this from lesson 22. -- \`field.setText(…)\` writes a new text into the text field. - -Together with the ActionListener from lesson 30 it looks like this: - -\`\`\`java -button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); -}); -\`\`\` - -\`setText\` needs a text. \`"" + number * 2\` appends the result to an empty text and so turns the number into a text. - -## Not a number? No crash! - -Type “abc” into the text field and click Calculate. The window stays, but nothing happens, and the [console](#zeige-konsole) shows a \`NumberFormatException\`. From lesson 22 you know what to do: - -\`\`\`java -button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } -}); -\`\`\` - -Instead of an error in the console, you now see a hint in the window. - -::: ludwig -The arrow already has an \`e\` for the event. That is why the exception in \`catch\` needs a different name, here \`error\`. Java doesn't allow two variables with the same name. -::: - -::: quiz -? Why is the exception in \`catch\` called \`error\` here and not \`e\`? -- [ ] \`catch\` always needs the name \`error\`. -- [x] \`e\` is already the event of the arrow, and Java does not allow two variables with the same name. -- [ ] \`e\` is only allowed for numbers. -> You can choose the name freely, just not twice. -::: - -## Game: What is in the window afterwards? - -::: spiel frage -titel: Game: What is in the window afterwards? -intro: Ludwig types something into the text field and clicks Calculate. Read the listener and predict what the window shows afterwards. Six rounds. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - }); -frage: The text field says 21. What does it say after the click? -- 2121 -- [x] 42 -- 21 -> \`parseInt\` turns the text into the number 21. Double that is 42. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - }); -frage: The text field says 21. You click twice. What does it say afterwards? -- 42 -- [x] 84 -- 4242 -> Every click doubles whatever is in the field right now: 21, 42, 84. - -runde: - button.addActionListener(e -> { - field.setText(field.getText() + field.getText()); - }); -frage: The text field says 21. What does it say after the click? -- 42 -- [x] 2121 -- 21 -> Without \`parseInt\` it stays a text, and \`+\` joins texts together. - -runde: - button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } - }); -frage: The text field says abc. What happens on the click? -- [x] The label shows "Please enter a whole number!" -- The text field says abcabc. -- The window crashes. -> \`parseInt\` throws a NumberFormatException, and \`catch\` catches it. - -runde: - button.addActionListener(e -> { - try { - int number = Integer.parseInt(field.getText()); - field.setText("" + number * 2); - } catch (NumberFormatException error) { - label.setText("Please enter a whole number!"); - } - }); -frage: The text field says 2.5. What happens on the click? -- The text field says 5.0. -- The text field says 5. -- [x] The label shows "Please enter a whole number!" -> \`Integer.parseInt\` only knows whole numbers. For it, 2.5 is not a number. - -runde: - button.addActionListener(e -> { - int number = Integer.parseInt(field.getText()); - field.setText("" + number + number); - }); -frage: The text field says 5. What does it say after the click? -- 10 -- [x] 55 -- 5 -> \`"" + number\` is already a text, and the second \`+\` adds the 5 once more. With \`"" + (number + number)\` Java calculates first. -::: - -## Task: doubling a number - -Put the whole program together: - -- a window with the title “Double the number”, 250 pixels wide and 150 pixels high, -- below each other a label, a text field and a button “Calculate”, -- every click doubles the number in the text field: 2, 4, 8, 16, … -- with “abc” a hint appears in the label instead of a crash. - -Extra: a second button “Halve” divides the number by 2. What happens with 5? - -**You are done when …** - -- the title is “Double the number” and label, text field and button are stacked, -- 2 becomes 4, 8 and 16 after three clicks, -- with “abc” a hint appears in the label and the program keeps running. - -::: ludwig -The “Halve” button goes into the GridLayout as the fourth row and gets its own ActionListener. With \`int\`, Java cuts off the decimal places when dividing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can put a JLabel and a JTextField into the window. → Three building blocks in the window -- I can explain why only the last building block shows without a layout. → Why only the button shows -- I can arrange everything below each other with GridLayout(0, 1). → The window with GridLayout -- I can calculate with getText, Integer.parseInt and setText. → Calculating with the text in the text field -- I can write a program that doesn't crash with “abc”. → Not a number? No crash! -::: - -## Quiz - -::: quiz -? Why does only the button show without a layout? -→ Why only the button shows -- [ ] Because the label and the text field are missing -- [x] Because all building blocks lie on top of each other in the middle and the last one hides the others -- [ ] Because the window is too small - -? What does new GridLayout(0, 1) mean? -→ The window with GridLayout -- [ ] No row and one column, so the window is empty -- [x] As many rows as needed in one column, so everything below each other -- [ ] One row, everything side by side - -? What does field.getText() give you? -→ Calculating with the text in the text field -- [ ] Always a number -- [x] The text in the text field -- [ ] The title of the window -> For a number you still need Integer.parseInt. - -? Match each building block to its job. -→ Three building blocks in the window -= JLabel -> label -= JTextField -> text field for typing -= JButton -> button -= GridLayout -> arrangement in a grid -::: -`,ly=`--- -titel: Click counter with reset -bereich: Windows with Swing -kurz: Two buttons change the same number: create a variable for the whole class. ---- - -## Skills I will gain now - -::: kompetenzen -- explain why a listener may not change a variable from main -- create a static variable in the class -- let two buttons change the same number -- build a counter with −1 that never goes below 0 -::: - -## The goal - -A window counts clicks: the number is at the top, two buttons below it. **+1** counts up by one, **Reset** sets the number back to 0. - -What's new this time: two buttons work with the **same** number. For that you need a variable that both listeners know. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## The first attempt - -The obvious idea is to create the number in \`main\` as usual and count it up in the listener: - -\`\`\`java -int count = 0; -button.addActionListener(e -> { - count++; - number.setText("" + count); -}); -\`\`\` - -If you run this with real Java, the compiler reports an error: - -\`\`\` -local variables referenced from a lambda expression must be final or effectively final -\`\`\` - -::: ludwig -The listener only runs later, on every click, long after \`main\` has finished. That is why it may read the variables from \`main\`, but not change them. Java insists: a variable from \`main\` that appears in the arrow must stay the same. For a number that changes on every click, we need a different place. -::: - -## A variable for the whole class - -The solution: the variable does **not** go into \`main\`, but directly into the class, above \`main\`. Then it belongs to the whole class, and every listener may change it: - -\`\`\`java -public class Counter { - static int count = 0; - - public static void main(String[] args) { - // the window as usual - } -} -\`\`\` - -- \`static\` means: the variable belongs to the class itself. Because \`main\` is \`static\` too, it is needed here. -- A variable like this is called a **field** of the class. It lives as long as the program, not just as long as \`main\`. - -::: quiz -? What do you call a variable that sits directly in the class and not in \`main\`? -- [ ] A parameter -- [x] A field -- [ ] A listener -> A field lives as long as the program, not just as long as \`main\`. -::: - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Counter { - static int count = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel number = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); - reset.addActionListener(e -> { - count = 0; - number.setText("0"); - }); - - window.add(number); - window.add(plus); - window.add(reset); - window.setVisible(true); - } -} -\`\`\` - -\`SwingConstants.CENTER\` puts the text of the label in the middle. Click +1 a few times and then Reset. - -::: angeberwissen -With \`number.setFont(new Font("SansSerif", Font.BOLD, 48));\` the number becomes big and bold. \`Font\` comes from \`java.awt\`, which you have already imported. -::: - -## Game: Who is counting? - -::: spiel zuhoerer -titel: Game: Who is counting? -intro: Now the listeners calculate with the variable of the class. Ludwig shows you code, window and the clicks. Which number is shown at the end? Afterwards Ludwig plays the clicks. -frage: What does the label say after the clicks? - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> The variable is in the class and keeps its value between the clicks. Every click counts up by one: 1, 2, 3. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - JButton reset = new JButton("Reset"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); - reset.addActionListener(e -> { - count = 0; - number.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> After two clicks it shows 2. Reset sets the variable to 0, and the last click counts up to 1 again. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> count++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> Afterwards the variable is 2, but nobody writes it into the label. Without \`number.setText(…)\` the window keeps showing 0. Calculating and showing are two different things. - -runde: - static int count = 0; - JLabel number = new JLabel("Clicks: 0"); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("Clicks: " + count + 1); - }); -klicks: +1 -- Clicks: 2 -- Clicks: 1 -- [x] Clicks: 11 -> The bracket trap: Java works from left to right. \`"Clicks: " + count\` gives the text “Clicks: 1”, and \`+ 1\` adds another 1 to the end. - -runde: - static int count = 0; - JLabel number = new JLabel("0"); - JButton one = new JButton("+1"); - JButton ten = new JButton("+10"); - one.addActionListener(e -> { - count++; - number.setText("" + count); - }); - ten.addActionListener(e -> { - count += 10; - number.setText("" + count); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Both listeners change the same variable: 10, then 11, then 21. \`count += 10\` is the short form of \`count = count + 10\`. -::: - -## Task: click counter - -Rebuild the click counter and extend it: - -- a button **−1** that counts down by one, -- the number should never go below 0. If it is 0, −1 does nothing. - -**You are done when …** - -- **+1** counts up by one and **−1** counts down by one, -- at 0 a click on **−1** changes nothing, -- **Reset** sets the number back to 0. - -::: ludwig -For “never below 0” the listener of −1 needs an \`if\`: only if \`count > 0\` does it count down. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain why a listener may not change a variable from main. → The first attempt -- I can create a static variable in the class. → A variable for the whole class -- I can let two buttons change the same number. → The whole program -- I can build a counter with −1 that never goes below 0. → Task: click counter -::: - -## Quiz - -::: quiz -? Why may the listener not change the variable count from main? -→ The first attempt -- [ ] Because numbers are not allowed in Swing -- [x] Because the listener runs later and Java doesn't let the arrow change variables from main -- [ ] Because count gets too big - -? Where does static int count = 0; go? -→ A variable for the whole class -- [ ] In main, at the very top -- [x] In the class, outside main -- [ ] In the listener - -? What does SwingConstants.CENTER do in new JLabel("0", SwingConstants.CENTER)? -→ The whole program -- [x] It puts the text in the middle of the label. -- [ ] It puts the window in the middle of the screen. -- [ ] It makes the font bigger. -::: -`,uy=`--- -titel: A traffic light with colours -bereich: Windows with Swing -kurz: Set background colours and switch a traffic light on with a state variable. ---- - -## Skills I will gain now - -::: kompetenzen -- colour a label with setOpaque and setBackground -- remember a state with a static variable -- use BorderLayout to put something big in the middle and something narrow at the bottom -- explain what FlowLayout, GridLayout and BorderLayout are good for -- program a traffic light with four phases -::: - -## The goal - -We build a traffic light: a large area lights up red. Each click on **Next** switches it on: red, green, yellow and red again. - -New this time are **colours** and a **state**: the program has to remember which colour is currently showing. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Colours in Swing - -Colours live in the class \`Color\` from \`java.awt\`. Ready-made colours are, for example, \`Color.RED\`, \`Color.GREEN\`, \`Color.YELLOW\`, \`Color.ORANGE\` and \`Color.WHITE\`. - -This is how you colour a label: - -\`\`\`java -JLabel light = new JLabel("", SwingConstants.CENTER); -light.setOpaque(true); -light.setBackground(Color.RED); -\`\`\` - -- \`setBackground(…)\` sets the background colour. -- A \`JLabel\` also needs \`setOpaque(true)\`. Without this line the background is transparent and the colour stays invisible. - -::: ludwig -\`opaque\` means “not see-through”. A label is normally transparent, like writing on a pane of glass. Only with \`setOpaque(true)\` does it get its own area that can be painted. -::: - -::: quiz -? Which line paints the background of the label \`light\` green? -- [ ] \`light.setText(Color.GREEN);\` -- [x] \`light.setBackground(Color.GREEN);\` -- [ ] \`light.setColor("green");\` -> \`setBackground\` sets the background colour. To see it, a \`JLabel\` first needs \`setOpaque(true)\`. -::: - -## Remembering the colour - -So that the traffic light knows what comes next, it remembers its state in a number: 0 means red, 1 means green, 2 means yellow. As with the click counter from lesson 32, the variable is in the class so that the listener may change it: - -\`\`\`java -static int phase = 0; -\`\`\` - -On every click the phase moves on by one. After yellow (2) comes red (0) again: - -\`\`\`java -next.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - light.setBackground(Color.RED); - } else if (phase == 1) { - light.setBackground(Color.GREEN); - } else { - light.setBackground(Color.YELLOW); - } -}); -\`\`\` - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class TrafficLight { - static int phase = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Traffic light"); - window.setSize(200, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new BorderLayout()); - - JLabel light = new JLabel("", SwingConstants.CENTER); - light.setOpaque(true); - light.setBackground(Color.RED); - JButton next = new JButton("Next"); - - next.addActionListener(e -> { - phase++; - if (phase > 2) { - phase = 0; - } - if (phase == 0) { - light.setBackground(Color.RED); - } else if (phase == 1) { - light.setBackground(Color.GREEN); - } else { - light.setBackground(Color.YELLOW); - } - }); - - window.add(light, BorderLayout.CENTER); - window.add(next, BorderLayout.SOUTH); - window.setVisible(true); - } -} -\`\`\` - -This uses a new layout, the **BorderLayout**. It has five places: \`NORTH\` (top), \`SOUTH\` (bottom), \`WEST\` (left), \`EAST\` (right) and \`CENTER\` (middle). The middle gets all the space that is left. So the light becomes big, and the button stays narrow at the bottom. - -::: angeberwissen -BorderLayout is the layout a \`JFrame\` uses when you don't give it one. An \`add\` without a place lands in \`CENTER\`. That is why all the building blocks lay on top of each other in lesson 31. -::: - -::: angeberwissen -Professionals switch on in one line: \`phase = (phase + 1) % 3;\`. The remainder operator \`%\` gives the remainder of a division. 3 % 3 is 0, so after 2 it starts at 0 again. -::: - -## Which layout for what? - -You now know three layouts. Each one arranges the building blocks differently: - -| Layout | How it arranges | Good for | -|---|---|---| -| \`FlowLayout\` (lesson 29) | next to each other like words in a line, each block as big as needed | a few buttons in a row | -| \`GridLayout\` (lesson 31) | a grid of cells of the same size, filled row by row | forms, keypads like on a calculator | -| \`BorderLayout\` (this lesson) | five places: top, bottom, left, right and the middle, which gets the rest | something big in the middle, such as a picture or a display, with buttons at the edge | - -Without \`setLayout\` a window uses the BorderLayout. That is why everything then lands in the middle. - -::: ludwig -Ask yourself when planning: should all parts be the same size? Then GridLayout. Should one part be big and the rest narrow at the edge? Then BorderLayout. Should the parts simply keep their normal size? Then FlowLayout. -::: - -## Game: Where does the button go? - -::: spiel layout -titel: Game: Where does the button go? -intro: You now know three layouts and the window with no layout at all. Ludwig shows you code with the buttons A, B, C … What does the window look like? Tap the right picture. -frage: What does the window look like? - -runde: - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Without a layout of its own, every \`add\` lands in the centre, as big as the window. The three lie on top of each other, and you only see the last one: C. - -runde: - window.setLayout(new FlowLayout()); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> FlowLayout puts the buttons next to each other at their normal size, like words in a line, and centres them. - -runde: - window.setLayout(new GridLayout(0, 1)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> One column, as many rows as needed: everything below each other, every row the same height and as wide as the window. - -runde: - window.setLayout(new GridLayout(0, 2)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); - window.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Two columns. The cells are filled row by row, always left first, then right: A B, then C D. - -runde: - window.setLayout(new GridLayout(2, 3)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); - window.add(new JButton("D")); - window.add(new JButton("E")); - window.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Rows come first, then columns: 2 rows with 3 columns each. - -runde: - window.setLayout(new GridLayout(0, 2)); - window.add(new JButton("A")); - window.add(new JButton("B")); - window.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Two columns, three buttons: the first row is full, in the second C is on the left, and the cell on the right stays empty. - -runde: - window.setLayout(new BorderLayout()); - window.add(new JButton("A"), BorderLayout.NORTH); - window.add(new JButton("B"), BorderLayout.CENTER); - window.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH is at the top, SOUTH at the bottom. The centre gets all the remaining space, which is why B is big. - -runde: - window.setLayout(new BorderLayout()); - window.add(new JButton("A"), BorderLayout.WEST); - window.add(new JButton("B")); - window.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST is on the left, EAST on the right. B has no place given, so it lands in CENTER. -::: - -## Task: traffic light - -Rebuild the traffic light and make it more realistic. In the UK and Germany, red and amber light up together briefly after red. So add a fourth phase: - -- 0: red -- 1: red and amber (use \`Color.ORANGE\`) -- 2: green -- 3: amber (yellow) - -Extra: in each phase, also write with \`light.setText(…)\` what the light means, for example “Stop” or “Go”. - -**You are done when …** - -- every click shows the next phase: red, red-yellow (orange), green, yellow, -- red comes again after yellow, -- for the extra, every phase shows its matching text. - -::: ludwig -With four phases, 0 comes after 3. So change the number in \`if (phase > 2)\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can colour a label with setOpaque and setBackground. → Colours in Swing -- I can remember a state with a static variable. → Remembering the colour -- I can use BorderLayout to put something big in the middle and something narrow at the bottom. → The whole program -- I can explain what FlowLayout, GridLayout and BorderLayout are good for. → Which layout for what? -- I can program a traffic light with four phases. → Task: traffic light -::: - -## Quiz - -::: quiz -? Why does the colour stay invisible without setOpaque(true)? -→ Colours in Swing -- [ ] Because Color.RED doesn't exist -- [x] Because a label is transparent otherwise -- [ ] Because the window is too small - -? Which place in the BorderLayout gets the space that is left? -→ The whole program -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? phase is 2 and the listener runs phase++ and then if (phase > 2) { phase = 0; }. What is phase afterwards? -→ Remembering the colour -- [x] 0 -- [ ] 2 -- [ ] 3 -> After phase++ it is 3, which is greater than 2, so it becomes 0. -::: -`,my=`--- -titel: Grade calculator in a window -bereich: Windows with Swing -kurz: Enter points, work out the grade with else if and catch wrong input. ---- - -## Skills I will gain now - -::: kompetenzen -- turn points into a grade with else if -- show the grade in the window -- catch and report “abc” and points outside 0 to 100 -- test a program at the limits, for example with 90 and 89 -::: - -## The goal - -A window turns points into a grade: you type the points of a test (0 to 100), click **Calculate grade**, and the grade appears at the bottom. - -This time there is no new Swing building block. What's new is that you combine everything so far: text field, button, \`else if\` from lesson 20 and try/catch from lesson 22. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## The grading scale - -We use this grading scale: - -| Points | Grade | -|---|---| -| 90 to 100 | A | -| 80 to 89 | B | -| 70 to 79 | C | -| 60 to 69 | D | -| 0 to 59 | F | - -With \`else if\` you check from top to bottom. The first condition that is true wins: - -\`\`\`java -String grade; -if (points >= 90) { - grade = "A"; -} else if (points >= 80) { - grade = "B"; -} else if (points >= 70) { - grade = "C"; -} else if (points >= 60) { - grade = "D"; -} else { - grade = "F"; -} -\`\`\` - -::: ludwig -With 85 points, \`points >= 90\` is false, but \`points >= 80\` is true. So grade B, and the remaining conditions are not checked at all. That is why the lower limit is enough each time. -::: - -You can try this part without a window in the [Code](#zeige-codelive) area. Put \`int points = 85;\` in front of it and \`System.out.println("Grade: " + grade);\` after it. The structure chart shows you the nested branches. - -::: quiz -? Which grade does the key give for 29 points? -- [ ] 4 -- [ ] 5 -- [x] 6 -> All conditions are false, even \`points >= 30\`. Then the \`else\` branch applies. -::: - -## The window - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class GradeCalculator { - public static void main(String[] args) { - JFrame window = new JFrame("Grade calculator"); - window.setSize(260, 180); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel question = new JLabel("Points (0 to 100):"); - JTextField field = new JTextField(); - JButton button = new JButton("Calculate grade"); - JLabel result = new JLabel("Grade: ?"); - - button.addActionListener(e -> { - int points = Integer.parseInt(field.getText()); - String grade; - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else if (points >= 60) { - grade = "D"; - } else { - grade = "F"; - } - result.setText("Grade: " + grade); - }); - - window.add(question); - window.add(field); - window.add(button); - window.add(result); - window.setVisible(true); - } -} -\`\`\` - -Try 100, 85, 60 and 12. - -## Catching wrong input - -Two things can still go wrong: - -1. Someone types “abc”. Then \`Integer.parseInt\` throws a \`NumberFormatException\`. -2. Someone types 150 or −5. That is a number, but not a valid score. - -You catch the first case with try/catch, the second with an \`if\` before working out the grade: - -\`\`\`java -button.addActionListener(e -> { - try { - int points = Integer.parseInt(field.getText()); - if (points < 0 || points > 100) { - result.setText("Please enter 0 to 100."); - } else { - // the grade calculation from above goes here - } - } catch (NumberFormatException error) { - result.setText("That is not a number."); - } -}); -\`\`\` - -::: ludwig -\`||\` means “or” (lesson 9). The condition is true if the points are too small **or** too big. -::: - -## Game: Which grade? - -::: spiel frage -titel: Game: Which grade? -intro: Ludwig has built grade calculators, but not all of them are right. Work out which grade comes out. Six rounds. - -runde: - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else { - grade = "D"; - } -frage: points is 80. Which grade comes out? -- A -- [x] B -- C -> 80 >= 90 is false, 80 >= 80 is true. The limit still belongs to B. - -runde: - if (points >= 90) { - grade = "A"; - } else if (points >= 80) { - grade = "B"; - } else if (points >= 70) { - grade = "C"; - } else if (points >= 60) { - grade = "D"; - } else { - grade = "F"; - } -frage: points is 69. Which grade comes out? -- C -- [x] D -- F -> 69 >= 70 is only just false, 69 >= 60 is true. So grade D. - -runde: - if (points >= 60) { - grade = "D"; - } else if (points >= 90) { - grade = "A"; - } else { - grade = "F"; - } -frage: points is 95. Which grade comes out? -- A -- [x] D -- F -> The first true condition wins. 95 >= 60 is already true, so A is never reached. That's why you check from the high points downwards. - -runde: - grade = "F"; - if (points >= 60) { - grade = "D"; - } - if (points >= 70) { - grade = "C"; - } -frage: points is 85. What is in grade afterwards? -- F -- D -- [x] C -> Without \`else\` every \`if\` is checked. Both are true, and the last one sets grade C. - -runde: - // grade has already been worked out - if (points < 0 || points > 100) { - result.setText("Please enter 0 to 100."); - } else { - result.setText("Grade: " + grade); - } -frage: The text field says 100. What does the window show? -- [x] Grade: A -- Please enter 0 to 100. -- That is not a number. -> 100 > 100 is false. So 100 points are valid and give grade A. - -runde: - // grade has already been worked out - if (points < 0 && points > 100) { - result.setText("Please enter 0 to 100."); - } else { - result.setText("Grade: " + grade); - } -frage: The text field says 150. What does the window show? -- Please enter 0 to 100. -- [x] a grade, although 150 is not valid -- That is not a number. -> With \`&&\` the points would have to be below 0 and above 100 at the same time. That never happens, so the program never warns. The right one is \`||\`. -::: - -## Task: grade calculator - -Put the grade calculator together, with both checks from the last step. Test it with 90, 89, 0, 100, 101 and “ten”. - -Extra: also write a word for the grade, for example “Grade: B (good)”. The words are excellent, good, satisfactory, poor and fail. - -**You are done when …** - -- 92 and 100 give a 1, 91 a 2 and 0 a 6, -- 101 shows the hint to enter 0 to 100, -- “ten” shows a hint and the program keeps running. - -::: ludwig -Always test the limits: 90 must be an A, 89 a B. Most mistakes hide at the limits, for example \`>\` instead of \`>=\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can turn points into a grade with else if. → The grading scale -- I can show the grade in the window. → The window -- I can catch and report “abc” and points outside 0 to 100. → Catching wrong input -- I can test a program at the limits, for example with 90 and 89. → Task: grade calculator -::: - -## Quiz - -::: quiz -? Which grade does the scale give for 70 points? -→ The grading scale -- [ ] B -- [x] C -- [ ] D -> 70 is the lower limit for a C. - -? Why is the lower limit enough in each condition? -→ The grading scale -- [x] Because else if has already sorted out the higher cases -- [ ] Because Java doesn't know upper limits -- [ ] Because the points are always 100 - -? Which condition detects invalid points? -→ Catching wrong input -- [ ] points < 0 && points > 100 -- [x] points < 0 || points > 100 -- [ ] points >= 0 || points <= 100 -> A number can't be smaller than 0 and bigger than 100 at the same time, so you need or. -::: -`,cy=`--- -titel: A calculator -bereich: Windows with Swing -kurz: Two columns with GridLayout, four arithmetic buttons and catching division by 0. ---- - -## Skills I will gain now - -::: kompetenzen -- build two columns with GridLayout -- explain why "" + (a + b) needs brackets -- program all four arithmetic buttons -- build a calculator that doesn't crash with 0 or “abc” -::: - -## The goal - -We build a small calculator: two text fields for the numbers, four buttons **+**, **-**, **\\*** and **/** and a line for the result. - -New this time are **two columns** in the GridLayout and **several buttons** that all calculate with the same text fields. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Two columns - -So far \`GridLayout(0, 1)\` put everything below each other. \`GridLayout(0, 2)\` gives you two columns. The building blocks fill the cells in the order of the \`add\` lines, always left first, then right: - -| left | right | -|---|---| -| First number: | text field | -| Second number: | text field | -| + | - | -| \\* | / | -| Result: | ? | - -You won't need the labels on the left later. So you can build them directly inside \`add\`, without a variable: - -\`\`\`java -window.add(new JLabel("First number:")); -window.add(field1); -\`\`\` - -## The window with the first button - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Calculator { - public static void main(String[] args) { - JFrame window = new JFrame("Calculator"); - window.setSize(280, 220); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 2)); - - JTextField field1 = new JTextField(); - JTextField field2 = new JTextField(); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - JButton times = new JButton("*"); - JButton divide = new JButton("/"); - JLabel result = new JLabel("?"); - - plus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a + b)); - }); - - window.add(new JLabel("First number:")); - window.add(field1); - window.add(new JLabel("Second number:")); - window.add(field2); - window.add(plus); - window.add(minus); - window.add(times); - window.add(divide); - window.add(new JLabel("Result:")); - window.add(result); - window.setVisible(true); - } -} -\`\`\` - -Type 3 and 4 and click +. The result shows 7. - -::: ludwig -Watch the brackets in \`"" + (a + b)\`. Without them Java works from left to right: \`"" + a\` gives the text “3”, and \`"3" + b\` appends the 4. You get “34” instead of 7. The bracket makes sure the calculation happens first. -::: - -## The other three buttons - -The buttons -, \\* and / work the same way. Only the operator in the last line changes: - -\`\`\`java -minus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a - b)); -}); -\`\`\` - -/ has two special features: - -- With \`int\`, Java cuts off the decimal places when dividing. 7 / 2 gives 3. -- If the second number is 0, Java throws an \`ArithmeticException\`, as in the task “Dividing safely” in lesson 22. - -## Catching division by 0 - -\`\`\`java -divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } -}); -\`\`\` - -::: angeberwissen -With \`double\` and \`Double.parseDouble(…)\` you get decimal places: 7 / 2 gives 3.5. In return, Java throws no exception when dividing decimal numbers by 0. The result is then \`Infinity\`. -::: - -::: quiz -? What does the calculator show for 8 divided by 0? -- [ ] 0 -- [ ] Infinity -- [x] Not by 0! -> With \`int\`, \`a / b\` throws an \`ArithmeticException\`. The \`catch\` catches it and shows the message. -::: - -## A method of your own - -This is not in the curriculum, but it makes the code shorter. - -::: angeberwissen -Every listener reads the same two fields. You can move this repetition into a method of your own, a subprogram like in lesson 18. It goes in the class next to \`main\`: - -\`static int number(JTextField field) { return Integer.parseInt(field.getText()); }\` - -The listener then just says \`result.setText("" + (number(field1) + number(field2)));\`. -::: - -## Game: What does the calculator show? - -::: spiel frage -titel: Game: What does the calculator show? -intro: Ludwig has been tinkering with the calculator. Read the listener and predict what the result shows. Six rounds. - -runde: - plus.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + a + b); - }); -frage: You type 3 and 4 and click +. What does the result show? -- 7 -- [x] 34 -- 12 -> Without brackets Java works from left to right: \`"" + 3\` is the text "3", and \`+ 4\` adds the 4 to the end. - -runde: - times.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + a * b); - }); -frage: You type 3 and 4 and click *. What does the result show? -- 34 -- [x] 12 -- 7 -> Multiplication comes before addition here too: Java first works out 3 * 4, then adds the 12 to the text. Plus doesn't get this priority, which is why it needs the brackets. - -runde: - divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - result.setText("" + (a / b)); - }); -frage: You type 7 and 2 and click /. What does the result show? -- 3.5 -- [x] 3 -- 4 -> With \`int\` Java cuts off the decimal places. It doesn't round. - -runde: - divide.addActionListener(e -> { - int a = Integer.parseInt(field1.getText()); - int b = Integer.parseInt(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } - }); -frage: You type 8 and 0 and click /. What does the result show? -- 0 -- [x] Not by 0! -- Infinity -> With \`int\`, dividing by 0 throws an ArithmeticException, and \`catch\` writes the hint. - -runde: - divide.addActionListener(e -> { - double a = Double.parseDouble(field1.getText()); - double b = Double.parseDouble(field2.getText()); - result.setText("" + (a / b)); - }); -frage: You type 7 and 2 and click /. What does the result show? -- 3 -- [x] 3.5 -- 3.0 -> With \`double\` the decimal places are kept. - -runde: - divide.addActionListener(e -> { - double a = Double.parseDouble(field1.getText()); - double b = Double.parseDouble(field2.getText()); - try { - result.setText("" + (a / b)); - } catch (ArithmeticException error) { - result.setText("Not by 0!"); - } - }); -frage: You type 8 and 0 and click /. What does the result show? -- Not by 0! -- [x] Infinity -- 0.0 -> With \`double\` there is no exception. The result is \`Infinity\`, and the \`catch\` never gets its turn. -::: - -## Task: calculator - -Finish the calculator: - -- all four buttons calculate, -- / reports “Not by 0!” instead of crashing, -- if a field contains “abc” or nothing, “Please enter two numbers” appears. - -Extra: a fifth button **C** empties both fields and sets the result back to “?”. - -**You are done when …** - -- 7 and 2 give 9, 5, 14 and 3 for +, −, * and /, -- 7 / 0 shows the “not by 0” message, -- “abc” or an empty field shows the “enter two numbers” message and nothing crashes. - -::: ludwig -For “abc” every listener needs a try/catch with \`NumberFormatException\`. A \`try\` may also be followed by two \`catch\` blocks, one for \`NumberFormatException\` and one for \`ArithmeticException\`. By the way, an empty field gives the text \`""\`, and that isn't a number either. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build two columns with GridLayout(0, 2). → Two columns -- I can explain why "" + (a + b) needs brackets. → The window with the first button -- I can program all four arithmetic buttons. → The other three buttons -- I can build a calculator that doesn't crash with 0 or “abc”. → Task: calculator -::: - -## Quiz - -::: quiz -? a is 3 and b is 4. What does "" + a + b give? -→ The window with the first button -- [ ] 7 -- [x] 34 -- [ ] An error -> Java works from left to right: first the text "3" is created, then the 4 is appended. - -? What does 7 / 2 give with int? -→ The other three buttons -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? In which order does GridLayout(0, 2) fill the cells? -→ Two columns -- [x] Row by row, left first, then right -- [ ] Column by column, starting top to bottom on the far left -- [ ] Randomly -::: -`,dy=`--- -titel: Guess the number -bereich: Windows with Swing -kurz: A game with a random number, a counter for the guesses and a button that switches itself off at the end. ---- - -## Skills I will gain now - -::: kompetenzen -- create a random whole number from 1 to 100 with Math.random -- decide which variables belong in the class -- switch a button off with setEnabled -- build a guessing game with a “New game” button -::: - -## The goal - -Time for a game: the computer thinks of a number from 1 to 100. You guess, and the window tells you “too small” or “too big”. Once you have found it, it tells you how many guesses you needed. - -New this time are **random numbers** and a button that **switches itself off** at the end. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## A random number - -\`Math.random()\` gives a random decimal number from 0 to just under 1, for example 0.4173. Three steps turn it into a whole number from 1 to 100: - -\`\`\`java -int secret = (int) (Math.random() * 100) + 1; -\`\`\` - -| Step | Example | -|---|---| -| \`Math.random()\` | 0.4173 | -| \`* 100\` | 41.73 | -| \`(int)\` cuts off the decimal places | 41 | -| \`+ 1\` | 42 | - -Without \`+ 1\` you would get 0 to 99. - -Try it in the [Code](#zeige-codelive) area: \`int secret = (int) (Math.random() * 100) + 1;\` and \`System.out.println(secret);\`. Every run gives a different number. - -::: angeberwissen -Computers can't actually roll dice. \`Math.random()\` uses a formula to calculate a long sequence of numbers that only **look** random. They are called pseudo-random numbers. For games that is perfectly fine. -::: - -## What the game remembers - -The game has to remember two things across all clicks: the secret number and the number of guesses. As with the click counter from lesson 32, both go in the class: - -\`\`\`java -static int secret = (int) (Math.random() * 100) + 1; -static int guesses = 0; -\`\`\` - -::: quiz -? Why are \`secret\` and \`guesses\` in the class and not in \`main\`? -- [ ] Because \`Math.random()\` only works in the class -- [x] Because they must last over all clicks and the listener has to change \`guesses\` -- [ ] Because \`main\` cannot store numbers -> Like in the click counter: the listener must not change variables from \`main\`. -::: - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class GuessTheNumber { - static int secret = (int) (Math.random() * 100) + 1; - static int guesses = 0; - - public static void main(String[] args) { - JFrame window = new JFrame("Guess the number"); - window.setSize(320, 180); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JLabel hint = new JLabel("I'm thinking of a number from 1 to 100."); - JTextField field = new JTextField(); - JButton button = new JButton("Guess"); - - button.addActionListener(e -> { - int guess = Integer.parseInt(field.getText()); - guesses++; - if (guess < secret) { - hint.setText(guess + " is too small."); - } else if (guess > secret) { - hint.setText(guess + " is too big."); - } else { - hint.setText("Correct! You needed " + guesses + " guesses."); - button.setEnabled(false); - } - field.setText(""); - }); - - window.add(hint); - window.add(field); - window.add(button); - window.setVisible(true); - } -} -\`\`\` - -- \`field.setText("")\` empties the text field after each guess, so you can type the next one straight away. -- \`button.setEnabled(false)\` switches the button off. It turns grey and can't be clicked any more. The game is over. - -::: ludwig -\`setEnabled(true)\` switches a button back on. That way you can, for example, only allow a button once something has been entered. -::: - -## Winning in 7 guesses - -::: angeberwissen -If you guess cleverly, you never need more than 7 guesses. Always guess the middle of the range that is left: first 50, then 25 or 75 and so on. Each guess halves the range: 100, 50, 25, 13, 7, 4, 2, 1. That is the **binary search** from lesson 19. Because 2 to the power of 7 = 128 is bigger than 100, 7 guesses are enough. -::: - -## Task: guess the number - -Rebuild the game and improve it: - -- An input like “abc” doesn't count as a guess and shows the hint “Please enter a number”. -- A second button **New game** thinks of a new number, sets the guesses to 0, switches the Guess button back on and resets the hint. - -Extra: after 7 wrong guesses the game is lost. The window then reveals the secret number. - -**You are done when …** - -- every wrong guess shows “too small” or “too big”, -- “abc” shows the hint to enter a number and the number of guesses stays the same, -- **New game** sets the guesses to 0, turns the guess button back on and resets the hint. - -::: ludwig -For “doesn't count as a guess”, \`guesses++\` must come **after** \`Integer.parseInt\`, both in the \`try\` block. If \`parseInt\` throws an exception, the line with \`guesses++\` is skipped. -::: - -## Game: Too small or too big? - -::: spiel frage -titel: Game: Too small or too big? -intro: Ludwig is playing guess the number. Read the code and predict what happens. Seven rounds. - -runde: - // secret is 42 - if (guess < secret) { - hint.setText(guess + " is too small."); - } else if (guess > secret) { - hint.setText(guess + " is too big."); - } else { - hint.setText("Correct!"); - } -frage: Ludwig types 50. What does the hint say? -- 50 is too small. -- [x] 50 is too big. -- Correct! -> 50 is greater than 42. - -runde: -frage: The number is between 1 and 100. 50 was too big, 25 was too small. Which number does Ludwig cleverly guess next? -- 26 -- [x] 37 -- 49 -> 26 to 49 are left. The middle of that is 37 (or 38). That way every guess halves the range. - -runde: - int roll = (int) (Math.random() * 6) + 1; -frage: Which numbers can \`roll\` have? -- 0 to 6 -- [x] 1 to 6 -- 1 to 7 -> \`Math.random() * 6\` is from 0 to just under 6. \`(int)\` turns that into 0 to 5, and \`+ 1\` into 1 to 6. A dice! - -runde: - int number = (int) (Math.random() * 10); -frage: Which numbers can \`number\` have? -- [x] 0 to 9 -- 1 to 10 -- 0 to 10 -> Without \`+ 1\` it starts at 0, and 10 is never reached. - -runde: - // secret is 42 - guesses++; - if (guess == secret) { - hint.setText("Correct! You needed " + guesses + " guesses."); - } -frage: Ludwig types 50, then 25, then 42. What does the hint say at the end? -- Correct! You needed 2 guesses. -- [x] Correct! You needed 3 guesses. -- Correct! You needed 42 guesses. -> \`guesses++\` counts up with every click, including the hit. - -runde: - button.setEnabled(false); -frage: Ludwig has found the number and clicks **Guess** once more. What happens? -- The game starts again. -- It counts one more guess. -- [x] Nothing, the button is grey and can't be clicked. -> \`setEnabled(false)\` switches the button off. - -runde: -frage: The number is now between 1 and 1000. How many guesses do you need at most with binary search? -- 7 -- [x] 10 -- 500 -> 2 to the power of 10 = 1024 is greater than 1000. Ten halvings are enough. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a random whole number from 1 to 100 with Math.random. → A random number -- I can decide which variables belong in the class. → What the game remembers -- I can switch a button off with setEnabled. → The whole program -- I can build a guessing game with a “New game” button. → Task: guess the number -::: - -## Quiz - -::: quiz -? Which numbers does (int) (Math.random() * 100) + 1 give? -→ A random number -- [ ] 0 to 100 -- [x] 1 to 100 -- [ ] 1 to 101 - -? What does button.setEnabled(false) do? -→ The whole program -- [ ] It removes the button from the window. -- [x] The button turns grey and can't be clicked any more. -- [ ] It changes the text on the button. - -? With binary search, how many guesses do you need at most for 1 to 100? -→ Task: guess the number -- [ ] 50 -- [ ] 10 -- [x] 7 -> Each guess halves the range, and 2 to the power of 7 = 128 is bigger than 100. -::: -`,hy=`--- -titel: Many buttons, one listener -bereich: Windows with Swing -kurz: One listener for many buttons, and finding out with getActionCommand and getSource which button was clicked. ---- - -## Skills I will gain now - -::: kompetenzen -- store a listener in a variable of type ActionListener and sign it up at several buttons -- explain what getActionCommand and getSource return -- put buttons onto a JPanel in a loop -- build a code lock that only opens with the right code -::: - -## The goal - -Since the business with the cake, Ludwig wants to lock his stable. He builds a **code lock**: nine digit keys, a zero, **C** to clear and **OK** to check. Only someone who types 1234 gets "Gate open!". - -That's twelve buttons. Until now every button had its own listener, as with the calculator in lesson 35. Today you learn how **one** listener is enough for all buttons. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Nine almost identical listeners - -With one listener per key it would look like this: - -\`\`\`java -one.addActionListener(e -> display.setText(display.getText() + "1")); -two.addActionListener(e -> display.setText(display.getText() + "2")); -three.addActionListener(e -> display.setText(display.getText() + "3")); -// ... and so on up to 9 -\`\`\` - -The lines only differ in the digit. If you want to change a small detail, you have to do it nine times and are bound to forget one line. - -## A listener as a variable - -A listener can also be stored in a **variable**. Its data type is \`ActionListener\`, the contract from lesson 30. Then you sign up the same listener at several buttons: - -\`\`\`java -ActionListener digit = e -> display.setText(display.getText() + e.getActionCommand()); - -one.addActionListener(digit); -two.addActionListener(digit); -three.addActionListener(digit); -\`\`\` - -\`ActionListener\` is in the package \`java.awt.event\`. So you need \`import java.awt.event.*;\` at the top. - -Now the code exists only once. But how does the listener know which digit to add? - -## Who clicked? - -The \`e\` before the arrow is the **event**, an object of type \`ActionEvent\`. The button passes it along with every click, and it contains what happened: - -| Call | Returns | Example | -|---|---|---| -| \`e.getActionCommand()\` | the caption of the clicked button, as text | \`"7"\` | -| \`e.getSource()\` | the clicked button itself | the button \`ok\` | - -- \`getActionCommand()\` is handy when the caption already says what to do, as with the digits. -- You compare \`getSource()\` with a button using \`==\`: \`if (e.getSource() == ok)\`. Here \`==\` is right, because it is about exactly this one object, not about a text. - -::: ludwig -You compare texts with \`equals\` and buttons with \`==\`. If you want to decide by the caption, you write \`e.getActionCommand().equals("OK")\`. That works too, but breaks as soon as someone changes the caption to "Open". \`e.getSource() == ok\` stays correct. -::: - -## Buttons in a loop - -With a shared listener you can even build the digit keys in a loop. So that they line up neatly in a grid, they go onto a **JPanel**. A JPanel is an area in the window with its own layout: - -\`\`\`java -JPanel keys = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton digit = new JButton("" + i); - digit.addActionListener(key); - keys.add(digit); -} -\`\`\` - -- \`"" + i\` turns the number \`i\` into the text for the caption. -- Each pass creates a new button. All of them get the same listener \`key\`. -- \`window.add(keys, BorderLayout.CENTER)\` puts the whole area with all the keys into the window. - -::: quiz -? How many buttons and how many listeners does this loop create? -- [ ] 9 buttons and 9 listeners -- [x] 9 buttons and 1 listener -- [ ] 1 button and 9 listeners -> Each pass adds a new button. All of them get the same listener \`key\`. -::: - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class CodeLock { - public static void main(String[] args) { - JFrame window = new JFrame("Code lock"); - window.setSize(240, 300); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new BorderLayout()); - - JLabel display = new JLabel("", SwingConstants.CENTER); - JPanel keys = new JPanel(new GridLayout(0, 3)); - JButton clear = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener key = e -> { - if (e.getSource() == clear) { - display.setText(""); - } else if (e.getSource() == ok) { - if (display.getText().equals("1234")) { - display.setText("Gate open!"); - } else { - display.setText("Wrong"); - } - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton digit = new JButton("" + i); - digit.addActionListener(key); - keys.add(digit); - } - JButton zeroKey = new JButton("0"); - zeroKey.addActionListener(key); - clear.addActionListener(key); - ok.addActionListener(key); - keys.add(clear); - keys.add(zeroKey); - keys.add(ok); - - window.add(display, BorderLayout.NORTH); - window.add(keys, BorderLayout.CENTER); - window.setVisible(true); - } -} -\`\`\` - -- \`clear\` and \`ok\` are created **before** the listener, because the listener compares with them. -- The listener first checks the two special buttons. All the others are digits and add their caption. - -::: angeberwissen -The keypad on a phone has the 1 at the top left, the one on a calculator and a computer keyboard has the 7 at the top left. Why? When push-button phones came along, there were tests with people who had to dial with them. With the 1 at the top they were faster, and calculating machines had their layout long before that. Ludwig's lock does it like the phone. -::: - -## Game: Who clicked? - -::: spiel zuhoerer -titel: Game: Who clicked? -intro: In every round **one** listener listens at several buttons. Ludwig shows you code, the window and the clicks. What does the display say at the end? Afterwards Ludwig plays the clicks. -frage: What does the display say after the clicks? - -runde: - JFrame window = new JFrame("Letters"); - JLabel display = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> display.setText(display.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> One listener, two buttons. Each time, \`e.getActionCommand()\` returns the caption of the clicked button, and it is added at the end. - -runde: - JFrame window = new JFrame("Counter"); - static int number = 0; - JLabel display = new JLabel("0"); - JButton plus = new JButton("+"); - JButton minus = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == plus) { - number++; - } else { - number--; - } - display.setText("" + number); - }; - plus.addActionListener(z); - minus.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> \`e.getSource()\` tells you which button it was. Plus twice, minus once: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame window = new JFrame("Letters"); - JLabel display = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> display.setText(display.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> The listener is only signed up at A and B. Nobody is listening when C is clicked. - -runde: - JFrame window = new JFrame("Keys"); - JLabel display = new JLabel(""); - JButton one = new JButton("1"); - JButton two = new JButton("2"); - JButton del = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - display.setText(""); - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - one.addActionListener(z); - two.addActionListener(z); - del.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> After 1 and 2 the display says "12". C clears everything, and the last 1 stands alone. - -runde: - JFrame window = new JFrame("Lock"); - JLabel display = new JLabel(""); - JButton four = new JButton("4"); - JButton two = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (display.getText().equals("42")) { - display.setText("Gate open!"); - } else { - display.setText("Wrong"); - } - } else { - display.setText(display.getText() + e.getActionCommand()); - } - }; - four.addActionListener(z); - two.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Gate open! -- [x] Wrong -- 24OK -> "24" was typed, but the secret is "42". The order of the clicks matters. -::: - -## Task: Code lock - -Build the code lock and try it out. - -Then make it better: - -- After three wrong attempts, **OK** switches itself off, like the button in Guess the number in lesson 36. Count the attempts in a \`static int\` variable in the class. -- Extra: the display shows \`*\` instead of the digits. Remember the real input in a \`static String input = "";\` and only add a star to the display. - -**You are done when …** - -- the right code opens the lock and a wrong one doesn’t, -- after three wrong tries **OK** is switched off, -- for the extra, the display only shows stars but the code is still checked. - -::: ludwig -In the branch for **OK**, count \`attempts++\` for every wrong code and then check \`if (attempts >= 3)\`. Then \`ok.setEnabled(false)\` switches the button off, like in the guessing game. For the stars: \`input = input + e.getActionCommand();\` and \`display.setText(display.getText() + "*");\`. Then you compare \`input\`, not the text of the display. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can store a listener in a variable of type ActionListener and sign it up at several buttons. → A listener as a variable -- I can explain what getActionCommand and getSource return. → Who clicked? -- I can put buttons onto a JPanel in a loop. → Buttons in a loop -- I can build a code lock that only opens with the right code. → Task: Code lock -::: - -## Quiz - -::: quiz -? What does e.getActionCommand() return for a click on the button new JButton("7")? -→ Who clicked? -- [ ] the number 7 -- [x] the text "7" -- [ ] the button itself - -? How do you check whether the button ok was clicked? -→ Who clicked? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource returns the button itself, and you compare it with ==. - -? Why is a listener stored in a variable? -→ A listener as a variable -- [ ] So that it runs faster. -- [x] So that you can sign it up at several buttons and write the code only once. -- [ ] Because lambdas aren't allowed otherwise. - -? Match. -→ Who clicked? -= ActionListener -> data type of a listener -= ActionEvent -> the event e with the information about the click -= JPanel -> an area with its own layout -::: -`,gy=`--- -titel: Inner classes -bereich: Windows with Swing -kurz: Write a listener as a named inner class, as an anonymous class and as a lambda, and know who can see what. ---- - -## Skills I will gain now - -::: kompetenzen -- write a listener as a named inner class -- write a listener as an anonymous class -- explain what is left out in a lambda -- explain which way of writing sees which variables -- build a counter with three buttons written in three ways -::: - -## The goal - -You already know the click counter from lesson 32. Today you write its listener in **three ways**, all of which do exactly the same: - -1. as a **named inner class**, the way it was mostly done before Java 8, -2. as an **anonymous class**, which you know from lesson 30 (“ActionListener is an interface”), -3. as a **lambda** with the arrow, as before. - -In other people's code, in books and on the internet you will meet all three. After this lesson you will recognise them. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Reminder: the contract - -A listener is anything that fulfils the contract \`ActionListener\`. It contains exactly one method: - -\`\`\` -public void actionPerformed(ActionEvent e) -\`\`\` - -The button calls it with every click. The three ways of writing are three ways of providing this one method. - -## 1. The named inner class - -An **inner class** is a class inside another class. It has a name, here \`Plus\`, and fulfils the contract with \`implements ActionListener\`: - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Counter { - static int count = 0; - static JLabel number = new JLabel("0", SwingConstants.CENTER); - - static class Plus implements ActionListener { - public void actionPerformed(ActionEvent e) { - count++; - number.setText("" + count); - } - } - - public static void main(String[] args) { - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - JButton again = new JButton("Also +1"); - plus.addActionListener(new Plus()); - again.addActionListener(new Plus()); - - window.add(number); - window.add(plus); - window.add(again); - window.setVisible(true); - } -} -\`\`\` - -- \`new Plus()\` creates an object of the class \`Plus\`. That is the listener the button gets. -- Because the class has a name, you can use it for several buttons, here for \`plus\` and \`again\`. -- The class is **outside** \`main\`. So it only sees what is in the class \`Counter\`: \`count\` and \`number\`. That's why \`number\` is a variable of the class this time and not of \`main\`. -- You need \`static class\` because \`main\` is static. Without \`static\`, javac reports "non-static variable this cannot be referenced from a static context". - -## 2. The anonymous class - -If you only need the listener in one place, you can write the class right where the object is needed. Then it gets no name: - -\`\`\`java -plus.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - count++; - number.setText("" + count); - } -}); -\`\`\` - -- \`new ActionListener() { … }\` means: "a new object that fulfils the contract ActionListener, like this: …". -- At the end there is \`});\`: the curly bracket closes the class, the round one closes the call to \`addActionListener\`. -- The anonymous class is **inside** \`main\`. So it also sees the variables of \`main\`, as long as they don't change any more. - -::: quiz -? What does \`});\` close at the end of the anonymous class? -- [x] \`}\` closes the class, \`)\` closes the call of \`addActionListener\`. -- [ ] \`}\` closes \`main\`, \`)\` closes the class. -- [ ] Both close the method \`actionPerformed\`. -> The method \`actionPerformed\` already ends one line earlier with its own \`}\`. -::: - -## 3. The lambda - -The lambda is the short form of the anonymous class, since Java 8: - -\`\`\`java -plus.addActionListener(e -> { - count++; - number.setText("" + count); -}); -\`\`\` - -Everything Java knows anyway is left out: \`new ActionListener()\`, the name \`actionPerformed\`, \`public void\` and the type \`ActionEvent\`. What remains is the parameter \`e\`, the arrow and the body. This only works because the contract has exactly **one** method. - -## The three compared - -| | named inner class | anonymous class | lambda | -|---|---|---|---| -| has a name | yes, e.g. \`Plus\` | no | no | -| stands | in the class, outside \`main\` | right at the button | right at the button | -| for several buttons | yes, \`new Plus()\` | no | yes, in a variable (lesson 37) | -| sees variables of \`main\` | no | yes, if they don't change | yes, if they don't change | -| length | longest | medium | shortest | - -::: ludwig -If a variable of \`main\` should change in the listener, like \`count++\`, it has to go into the class, whichever way you write the listener. That was the problem from lesson 32. -::: - -::: angeberwissen -After compiling, look into the folder with the \`.class\` files. javac creates one file for every class: \`Counter.class\`, \`Counter$Plus.class\` for the inner class and \`Counter$1.class\` for the anonymous class. As it has no name, it gets a number. A lambda gets no file of its own, Java only builds it when the program starts. -::: - -## Game: Which way of writing? - -::: spiel frage -titel: Game: Which way of writing? -intro: Ludwig shows you listeners from other people's programs. Which way of writing is it? Six rounds. -frage: Which way of writing is this? -antworten: named inner class | anonymous class | lambda - -runde: - button.addActionListener(e -> text.setText("Hello")); -richtig: lambda -> The arrow \`->\` gives the lambda away. - -runde: - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - text.setText("Hello"); - } - }); -richtig: anonymous class -> \`new ActionListener() {\` followed by a whole method: a class without a name is being written here. - -runde: - static class Greeting implements ActionListener { - public void actionPerformed(ActionEvent e) { - text.setText("Hello"); - } - } -richtig: named inner class -> The class is called \`Greeting\` and fulfils the contract with \`implements ActionListener\`. - -runde: - button.addActionListener(new Greeting()); -richtig: named inner class -> \`new Greeting()\` creates an object of the class \`Greeting\`. The class itself is somewhere else and has a name. - -runde: - ActionListener key = e -> { - display.setText(display.getText() + e.getActionCommand()); - }; -richtig: lambda -> A lambda in a variable, as with the code lock in lesson 37. The arrow gives it away. - -runde: - ActionListener key = new ActionListener() { - public void actionPerformed(ActionEvent e) { - display.setText(display.getText() + e.getActionCommand()); - } - }; -richtig: anonymous class -> An anonymous class can be stored in a variable too. Then it can be signed up at several buttons, just like the lambda. -::: - -## Task: One counter, three ways - -Build the click counter with three buttons: - -- **+1** gets the named inner class \`Plus\`. -- **-1** gets an anonymous class. -- **Reset** gets a lambda. - -Check that all three buttons count as expected. Then remove the \`static\` from the class \`Plus\` and read javac's error message. - -**You are done when …** - -- **+1** counts up, **-1** counts down and **Reset** sets 0, -- the code contains exactly one named inner class, one anonymous class and one lambda, -- you have read javac’s error message without \`static\` on \`Plus\` and can explain what it means. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can write a listener as a named inner class. → 1. The named inner class -- I can write a listener as an anonymous class. → 2. The anonymous class -- I can explain what is left out in a lambda. → 3. The lambda -- I can explain which way of writing sees which variables. → The three compared -- I can build a counter with three buttons written in three ways. → Task: One counter, three ways -::: - -## Quiz - -::: quiz -? Why does the short form with the arrow work for ActionListener? -→ 3. The lambda -- [ ] Because ActionListener is a class. -- [x] Because the contract has exactly one method. -- [ ] Because the button demands it. - -? Which way of writing can you use with new Plus() for several buttons without storing it in a variable? -→ 1. The named inner class -- [x] the named inner class -- [ ] the anonymous class -- [ ] the lambda - -? Why is there static in front of class Plus? -→ 1. The named inner class -- [ ] So that the class is faster. -- [x] Because main is static and couldn't create an object of Plus otherwise. -- [ ] Because every class has to be static. - -? Match. -→ The three compared -= class Plus implements ActionListener -> named inner class -= new ActionListener() { … } -> anonymous class -= the arrow after e -> lambda -::: -`,py=`--- -titel: Two tabs -bereich: Windows with Swing -kurz: Build a window with two tabs, bring data from one tab to the other and save the list as a text file. ---- - -## Skills I will gain now - -::: kompetenzen -- build a window with two tabs -- add lines to a JTextArea with append -- explain why a listener can use building blocks on both tabs -- save a file inside a listener with try and catch -- build a shopping list that counts how many things are on it -::: - -## The goal - -Ludwig's shopping list from lesson 23 gets a window. It has two **tabs**, like the tabs in a browser: - -- In the tab **Input** you type what you need and click **Add**. -- The tab **List** shows everything you have entered. A button **Save** writes the list into a text file. - -New are the tabs (\`JTabbedPane\`), a text area with several lines (\`JTextArea\`) and saving from inside a listener. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Tabs with JTabbedPane - -Each tab shows its own area. The areas are JPanels, like the keypad of the code lock in lesson 37: - -\`\`\`java -JTabbedPane tabs = new JTabbedPane(); -JPanel input = new JPanel(new GridLayout(0, 1)); -JPanel list = new JPanel(new BorderLayout()); - -tabs.addTab("Input", input); -tabs.addTab("List", list); -window.add(tabs); -\`\`\` - -| Call | Meaning | -|---|---| -| \`addTab("Input", input)\` | a new tab with the caption "Input", it shows the JPanel \`input\` | -| \`setSelectedIndex(1)\` | switches to the second tab, counting starts at 0 | -| \`setTitleAt(1, "List (3)")\` | changes the caption of the second tab | - -At the start, the tab that was added first is open. - -## A text area with several lines - -A \`JTextField\` has only one line. For the list you need a \`JTextArea\`: - -\`\`\`java -JTextArea area = new JTextArea(); -area.setEditable(false); -area.append("Hay\\n"); -\`\`\` - -- \`append\` adds text at the end. The \`"\\n"\` then starts a new line, as when splitting with \`split("\\n")\` in lesson 24. -- \`setEditable(false)\` stops people from typing into the list itself. -- \`getText()\` returns the whole text with all lines. - -::: quiz -? What does \`area.append("Hay\\n")\` do? -- [ ] It replaces the whole text with “Hay”. -- [x] It adds “Hay” at the end and then starts a new line. -- [ ] It writes “Hay\\n” into the list exactly like that. -> \`append\` adds at the end, \`"\\n"\` is the line break. -::: - -## From one tab to the other - -The button **Add** is on the tab Input, the text area on the tab List. Still, the listener can use both. All building blocks are variables in \`main\`, and the lambda sees all of them, no matter on which tab they are shown later: - -\`\`\`java -add.addActionListener(e -> { - area.append(field.getText() + "\\n"); - info.setText(field.getText() + " is on the list."); - field.setText(""); -}); -\`\`\` - -::: ludwig -A building block can only lie on **one** area. If you add the same button first to \`input\` and then to \`list\`, Swing takes it away from \`input\`. It only shows up on the tab List. -::: - -## Saving inside the listener - -To save, you use the \`PrintWriter\` from lesson 23. Inside the listener there is a catch, though: the way out with \`throws Exception\` from lesson 23 doesn't exist here. The lambda is a method of its own, \`actionPerformed\`, and according to the contract it must not pass on a \`FileNotFoundException\`. That's why saving goes into try and catch: - -\`\`\`java -save.addActionListener(e -> { - try { - PrintWriter out = new PrintWriter("shoppinglist.txt"); - out.print(area.getText()); - out.close(); - info.setText("Saved in shoppinglist.txt"); - tabs.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Saving didn't work."); - } -}); -\`\`\` - -- The exception is called \`ex\` here, because the name \`e\` is already taken by the event. -- After saving, the window jumps back to the tab Input with \`setSelectedIndex(0)\`, where the message is. -- VisuStruct shows the saved file below the console as soon as you have clicked Save. - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class ShoppingList { - public static void main(String[] args) { - JFrame window = new JFrame("Shopping list"); - window.setSize(300, 250); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane tabs = new JTabbedPane(); - - JPanel input = new JPanel(new GridLayout(0, 1)); - JTextField field = new JTextField(); - JButton add = new JButton("Add"); - JLabel info = new JLabel("Nothing on the list yet."); - input.add(new JLabel("What do you need?")); - input.add(field); - input.add(add); - input.add(info); - - JPanel list = new JPanel(new BorderLayout()); - JTextArea area = new JTextArea(); - area.setEditable(false); - JButton save = new JButton("Save"); - list.add(area, BorderLayout.CENTER); - list.add(save, BorderLayout.SOUTH); - - tabs.addTab("Input", input); - tabs.addTab("List", list); - - add.addActionListener(e -> { - area.append(field.getText() + "\\n"); - info.setText(field.getText() + " is on the list."); - field.setText(""); - }); - - save.addActionListener(e -> { - try { - PrintWriter out = new PrintWriter("shoppinglist.txt"); - out.print(area.getText()); - out.close(); - info.setText("Saved in shoppinglist.txt"); - tabs.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Saving didn't work."); - } - }); - - window.add(tabs); - window.setVisible(true); - } -} -\`\`\` - -Type Hay, click Add, then Apples and Add again. Switch to the tab List and click Save. - -## Game: Where does it end up? - -::: spiel frage -titel: Game: Where does it end up? -intro: Ludwig builds windows with tabs. Read the code and predict what you see. Six rounds. - -runde: - tabs.addTab("Input", input); - tabs.addTab("List", list); -frage: Which tab is open at the start? -- [x] Input -- List -- none -> At the start, the tab that was added first is open. - -runde: - tabs.addTab("List", list); - tabs.addTab("Input", input); -frage: Which tab is open at the start? -- Input -- [x] List -- both -> This time List comes first. The order of \`addTab\` decides the order of the tabs. - -runde: - tabs.addTab("Input", input); - tabs.addTab("List", list); - tabs.addTab("Help", help); - tabs.setSelectedIndex(1); -frage: Which tab is open? -- Input -- [x] List -- Help -> Counting starts at 0: 0 is Input, 1 is List, 2 is Help. - -runde: - add.addActionListener(e -> { - area.append(field.getText() + "\\n"); - field.setText(""); - }); - // You type Hay, click Add, type Apples, click Add. -frage: What is on the tab List afterwards? -- Apples -- HayApples -- [x] Hay\\nApples -> \`append\` adds at the end, and each \`"\\n"\` starts a new line. - -runde: - JButton button = new JButton("OK"); - input.add(button); - list.add(button); -frage: Where does the button OK show up? -- on both tabs -- only on the tab Input -- [x] only on the tab List -> A building block can only lie on one area. With the second \`add\`, Swing takes it away from \`input\`. - -runde: - save.addActionListener(e -> { - area.setText(""); - tabs.setTitleAt(1, "List (empty)"); - tabs.setSelectedIndex(0); - }); - // The button save is on the tab List. -frage: What do you see after the click? -- the empty tab List -- [x] the tab Input, and the second tab is called "List (empty)" -- the tab Input, the second tab is still called "List" -> The listener empties the area, renames the tab and switches to tab 0. All of it happens with one click. -::: - -## Task: Shopping list with tabs - -Build the program and try it out. - -Then make it better: - -- Empty inputs don't go onto the list. Check \`field.getText().isEmpty()\` first (lesson 17). -- The tab List shows in its title how many things are on the list: "List (3)". Count along in a \`static int\` variable and use \`setTitleAt\`. -- Extra: a third tab **Help** with a JLabel that explains how the program works. - -**You are done when …** - -- an entry you type appears in the list tab after the click, -- an empty field adds nothing to the list, -- after three entries the tab title shows the count, e.g. “List (3)”. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a window with two tabs. → Tabs with JTabbedPane -- I can add lines to a JTextArea with append. → A text area with several lines -- I can explain why a listener can use building blocks on both tabs. → From one tab to the other -- I can save a file inside a listener with try and catch. → Saving inside the listener -- I can build a shopping list that counts how many things are on it. → Task: Shopping list with tabs -::: - -## Quiz - -::: quiz -? Which tab is open after tabs.setSelectedIndex(0)? -→ Tabs with JTabbedPane -- [x] the first one -- [ ] the second one -- [ ] none - -? Why is saving inside the listener in try and catch? -→ Saving inside the listener -- [ ] Because PrintWriter only works inside try. -- [x] Because actionPerformed must not pass on a FileNotFoundException. -- [ ] Because main has no throws. - -? What is the difference between JTextField and JTextArea? -→ A text area with several lines -- [ ] There is none. -- [x] JTextArea can show several lines. -- [ ] You can't write into a JTextField. - -? Match. -→ Tabs with JTabbedPane -= JTabbedPane -> an area with tabs -= JPanel -> the area of a tab -= JTextArea -> a text area with several lines -::: -`,fy=`--- -titel: Model View Controller -bereich: Windows with Swing -kurz: Split the click counter into model, view and controller and understand who talks to whom. ---- - -## Skills I will gain now - -::: kompetenzen -- say what model, view and controller each do -- write a model without Swing and test it without a window -- explain what new Counter() builds and why there is no static -- name the four messages after a click -- add a second view without changing the model -- build a counter with −1, Reset and limits in the model -::: - -## The goal - -Big programs with windows almost always share the same structure. It is called **Model View Controller**, **MVC** for short: - -- The **model** holds the data and knows its rules. -- The **view** only shows the data. -- The **controller** reacts to clicks and passes the word on. - -You learn MVC with the click counter from lesson 32. It is split into three parts, step by step. In the end it shows the same count twice: as a number and as a bar. - -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). - -## Everything in one class - -This is what the click counter looked like so far, everything sits in \`main\` and in one variable of the class: - -\`\`\`java -static int count = 0; - -public static void main(String[] args) { - // ... build the window ... - JLabel number = new JLabel("0", SwingConstants.CENTER); - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - count++; - number.setText("" + count); - }); -} -\`\`\` - -That works. But imagine the count should also show up as a bar, later in a second window and in a file as well. Then every listener has to think of every display. Counting and showing are tied up in a knot, and with every display the knot gets bigger. - -MVC unties the knot: every job gets its own class. - -## The model - -The model is the counter itself, without any Swing: - -\`\`\`java -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} -\`\`\` - -- This time there is no \`static\` in front of \`value\` and the methods. That makes them belong to an **object**: \`new Counter()\` builds a counter with its own \`value\`, just as \`new JButton("+1")\` builds a button with its own caption. -- \`model.increase()\` calls the method of this one counter, just like \`button.setText(…)\`. -- Whoever wants to know the value asks with \`getValue()\`. It can only be changed through \`increase()\`. - -As the model needs no window, you can try it out without a window at all: - -\`\`\`java -public class CounterTest { - public static void main(String[] args) { - Counter model = new Counter(); - model.increase(); - model.increase(); - System.out.println(model.getValue()); - } -} - -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} -\`\`\` - -The output is 2. Several classes may stand in one file. Only one of them is \`public\`, and that one contains \`main\`. - -## The view - -The view shows the value and does nothing else. It doesn't calculate, and it doesn't know where the number comes from: - -\`\`\`java -class NumberView { - JLabel number = new JLabel("0", SwingConstants.CENTER); - - void update(int value) { - number.setText("" + value); - } -} -\`\`\` - -- The view is handed the value with \`update(int value)\` and writes it into its JLabel. -- You build the window and the button in \`main\`, as always. \`window.add(view.number)\` puts the view's JLabel into the window. - -## The controller - -The controller is the listener at the button. It connects model and view: - -\`\`\`java -Counter model = new Counter(); -NumberView view = new NumberView(); - -plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); -}); -\`\`\` - -- First it changes the model, then it fetches the new value and hands it to the view. -- The problem from lesson 32 is gone: the variable \`model\` never changes, it always points to the same counter. Only the \`value\` inside it changes. That's why the lambda may use \`model\`, without any \`static\`. - -## Who talks to whom? - -With every click four messages run, always in the same order: - -::: grafik mvc-klick.svg -The arrows light up one after the other. The model counts up at the second arrow, the display only at the fourth. -::: - -1. The button reports the click to the controller (\`actionPerformed\`). -2. The controller tells the model: \`increase()\`. -3. The controller asks the model for the new value: \`getValue()\`. -4. The controller hands the value to the view: \`update(value)\`. - -The model talks to nobody. It waits until it is asked. - -::: ludwig -Remember: the model knows nothing about windows. In \`Counter\` there isn't a single \`JLabel\` and no \`import javax.swing\`. If you need Swing there, the code belongs in the view. -::: - -::: quiz -? Who does the model talk to on its own? -- [ ] The view -- [ ] The button -- [x] Nobody -> The model waits until the controller asks it. -::: - -## The pay-off: a second view - -Now the count should also show up as a bar. For that a second view joins in. A \`JProgressBar\` is a bar that fills up, here from 0 to 10: - -\`\`\`java -class BarView { - JProgressBar bar = new JProgressBar(0, 10); - - void update(int value) { - bar.setValue(value); - } -} -\`\`\` - -The controller gets one more line. The model stays exactly as it was: - -\`\`\`java -plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); -}); -\`\`\` - -That is exactly the pay-off of MVC: you can add or swap displays without touching the model. - -## The whole program - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -class Counter { - int value = 0; - - void increase() { - value++; - } - - int getValue() { - return value; - } -} - -class NumberView { - JLabel number = new JLabel("0", SwingConstants.CENTER); - - void update(int value) { - number.setText("" + value); - } -} - -class BarView { - JProgressBar bar = new JProgressBar(0, 10); - - void update(int value) { - bar.setValue(value); - } -} - -public class ClickCounter { - public static void main(String[] args) { - Counter model = new Counter(); - NumberView view = new NumberView(); - BarView bar = new BarView(); - - JFrame window = new JFrame("Click counter"); - window.setSize(250, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JButton plus = new JButton("+1"); - plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); - }); - - window.add(view.number); - window.add(bar.bar); - window.add(plus); - window.setVisible(true); - } -} -\`\`\` - -Click +1 a few times and watch the number and the bar grow together. - -::: angeberwissen -MVC was invented in 1979 by the Norwegian Trygve Reenskaug, at the research centre Xerox PARC in California. Back then there were already computers with windows and a mouse there. In the same year Steve Jobs visited the lab and was so excited that Apple went on to build computers with windows and a mouse. -::: - -## Game: Where does the code belong? - -::: spiel frage -titel: Game: Where does the code belong? -intro: Ludwig has thrown code from an MVC program onto a pile. Sort every piece. Eight rounds. -frage: Where does this code belong? -antworten: Model | View | Controller - -runde: - int value = 0; -richtig: Model -> The count is the data. Data lives in the model. - -runde: - number.setText("" + value); -richtig: View -> Showing something on the screen is the view's job. - -runde: - plus.addActionListener(e -> model.increase()); -richtig: Controller -> Reacting to a click and telling the model: that's what the controller does. - -runde: - void increase() { - value++; - } -richtig: Model -> The model itself knows how to change its data. - -runde: - bar.setValue(value); -richtig: View -> A bar that fills up only shows something. So: view. - -runde: - void increase() { - if (value < 10) { - value++; - } - } -richtig: Model -> "At most 10" is a rule for the data. Rules belong in the model, then they hold for every button and every view. - -runde: - view.update(model.getValue()); -richtig: Controller -> Fetching the value from the model and handing it to the view: that's the controller in the middle. - -runde: - JLabel number = new JLabel("0", SwingConstants.CENTER); -richtig: View -> A JLabel is a building block of the screen. There is no Swing in the model. -::: - -## Game: Whose turn is it? - -::: spiel reihenfolge -titel: Game: Whose turn is it? -intro: After a click, model, view and controller talk to each other, but it only works in one order. Put the steps in the right order. Five rounds. - -runde: -frage: You click +1 in the click counter. What happens, one after the other? -- You click +1. -- The controller gets \`actionPerformed\`. -- The controller calls \`model.increase()\`. -- The model counts \`value\` up. -- The controller fetches \`model.getValue()\`. -- The view shows the new number. -> Click, controller, change the model, fetch the value, show it. Those are the four arrows from the picture, with counting up in the middle. - -runde: - plus.addActionListener(e -> { - model.increase(); - view.update(model.getValue()); - bar.update(model.getValue()); - }); -frage: What happens after a click on +1, one after the other? -- The click on +1 -- \`model.increase()\` -- The number shows the new value. -- The bar grows. -> The listener works through its lines from top to bottom: first the model, then the number, then the bar. - -runde: -frage: Put the controller in the right order so that the view shows the new number. -- \`plus.addActionListener(e -> {\` -- \`model.increase();\` -- \`view.update(model.getValue());\` -- \`});\` -> First change, then show. The other way round, the view still shows the old value. - -runde: - reset.addActionListener(e -> { - model.reset(); - view.update(model.getValue()); - }); -frage: The counter is at 5. You click Reset. What happens, one after the other? -- You click Reset. -- The model sets \`value\` to 0. -- \`model.getValue()\` returns 0. -- The view shows 0. -> Reset also runs through the controller into the model. The view only learns about the new value at the very end. - -runde: -frage: A test without a window should print 1. In which order do the lines stand in main? -- \`Counter model = new Counter();\` -- \`model.increase();\` -- \`System.out.println(model.getValue());\` -> First build the object, then work with it, and look at the result last. The model can be tested without any window. -::: - -## Task: A counter with limits - -Build the whole program and try it out. - -Then make it better: - -- A button **−1** counts down. The model gets a method \`decrease()\` for it, the controller a second listener. -- A button **Reset** sets the counter back to 0 with \`reset()\`. -- The model itself takes care of the limits: never below 0 and never above 10, because then the bar is full. -- Extra: a third view \`ConsoleView\` whose \`update\` prints "New value: 3" with \`System.out.println\`. A view doesn't have to be a window. - -**You are done when …** - -- **+1**, **−1** and **Reset** count correctly, -- the counter never goes below 0 or above 10, however often you click, -- number and bar always show the same value, -- the model class contains no \`JButton\`, \`JLabel\` or other Swing. - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can say what model, view and controller each do. → The goal -- I can write a model without Swing and test it without a window. → The model -- I can explain what new Counter() builds and why there is no static. → The model -- I can name the four messages after a click. → Who talks to whom? -- I can add a second view without changing the model. → The pay-off: a second view -- I can build a counter with −1, Reset and limits in the model. → Task: A counter with limits -::: - -## Quiz - -::: quiz -? Where does the rule "The counter never goes above 10" belong? -→ The model -- [x] in the model -- [ ] in the view -- [ ] in the controller -> Rules about the data belong in the model. Then they hold no matter which button is pressed. - -? What does the view do? -→ The goal -- [ ] It calculates the new value. -- [x] It shows the value it is given. -- [ ] It listens for clicks. - -? Why may the lambda use model, even though model is a variable of main? -→ Who talks to whom? -- [ ] Because Counter is public. -- [x] Because model always points to the same counter; only the value inside it changes. -- [ ] Because lambdas may change any variable. - -? What do you have to change in the model when a second view joins in? -→ The pay-off: a second view -- [x] nothing -- [ ] a second method increase -- [ ] a second JLabel - -? Match. -→ The goal -= Counter with value and increase() -> model -= NumberView with update(int value) -> view -= the listener at the button -> controller -::: -`,by=`Technical terms for the learning area. When a term appears in a step, it is marked there once and shows its explanation -on hover or tap. If it is in bold in that step, it is being explained right there and is not marked. -\`also:\` lists other forms that are recognised too. Upper and lower case matter. - -### Algorithm -also: algorithm, algorithms, Algorithms -Exact step-by-step instructions for solving a task. Every step is clear. - -### Structure chart -also: structure chart, structure charts, Structure charts, Nassi-Shneiderman diagram, Nassi-Shneiderman diagrams -An algorithm drawn as a picture made of boxes. You read it from top to bottom. It is also called a Nassi-Shneiderman diagram. - -### Flowchart -also: flowchart, flowcharts, Flowcharts -An algorithm drawn as symbols joined by arrows (DIN 66001 / ISO 5807). A diamond is a decision. - -### Pseudocode -also: pseudocode -An algorithm written as text in plain language with fixed words such as IF and WHILE. The indentation shows what belongs together. - -### Statement -also: statement, statements, Statements -A single step in the structure chart, for example a calculation, an input or an output. - -### Sequence -also: sequence, sequences, Sequences -Steps that run one after another from top to bottom, each exactly once. - -### Branch -also: branch, branches, Branches, conditional statement, conditional statements -A block that uses a condition to decide which of two paths runs. It is also called a conditional statement. - -### Path -also: path, paths -One of the two ways through a branch: left for true, right for false. - -### Loop -also: loop, loops, Loops, iteration, repetition -A block that repeats steps as long as a condition holds. - -### Loop body -also: loop body -The inside of a loop, that is, the steps that are repeated. - -### Pass -also: passes -Running the inside of a loop once. - -### Condition -also: condition, conditions, Conditions -A question that can only be answered with yes (true) or no (false), for example age >= 18. - -### Placeholder -also: placeholder, placeholders -An empty box with the sign ø. If you drag an element onto it, the element replaces it. - -### Object Inspector -The area below the diagram. Here you edit the text and settings of the box you just clicked. - -### Simulation -also: simulation -Runs your structure chart in the editor, step by step if you like. That way you see what happens. - -### Variable -also: variable, variables, Variables -A labelled box for a value. It has a name, a data type and a value. - -### camelCase -also: CamelCase -A way of writing names made of several words: written together, every further word starts with a capital, e.g. \`priceWithTax\`. - -### case-sensitive -Java tells upper and lower case apart: \`number\`, \`Number\` and \`NUMBER\` are three different names. \`system\` instead of \`System\` is an error. - -### Constant -also: constant, constants, Constants -A variable whose value stays the same once it is set. You write \`const\` in front of it, e.g. \`const double VAT = 0.19\`. - -### Data type -also: data type, data types, Data types -Says what kind of value fits into a variable: int (whole number), double (decimal number), String (text), boolean (true or false) or char (a single character). - -### Assignment -also: assignment, assignments, Assignments -The sign =. It works out the right-hand side and stores the result in the variable on the left. - -### Temporary variable -also: temporary variable, temporary variables, helper variable -An extra variable that keeps a value for a short time, for example when swapping. - -### IPO model -also: input-process-output -Input, process, output: first ask for values, then calculate, then show the result. - -### Problem analysis -also: problem analysis -You read a task carefully and work out what is given, what you are looking for and how to get from one to the other. - -### Comparison operator -also: comparison operator, comparison operators, Comparison operators -A sign that compares two values, for example == or <. The result is true or false. - -### Switch -also: switch, multiple selection -A block that runs exactly one of several cases, depending on the value of a variable. It is also called multiple selection. - -### Pre-test loop -also: pre-test loop, pre-test loops, head-controlled -The loop checks its condition before every pass. If the condition is false right at the start, the loop does not run even once. - -### Post-test loop -also: post-test loop, post-test loops, foot-controlled -The loop checks its condition only after every pass. So it always runs at least once. - -### Counter variable -also: counter variable, counter variables, counter -A variable that counts along in a loop, usually i. - -### Endless loop -also: endless loop, endless loops, infinite loop, infinite loops -A loop whose condition never becomes false. It never stops by itself. - -### Flag -also: flag, flags -A boolean variable that starts with false and is set to true as soon as something has happened. - -### State machine -also: state machine, state machines, state variable, state variables -A program that is always in exactly one state and changes to the next state by fixed rules, e.g. a traffic light. - -### Array -also: array, arrays, Arrays -A row of slots with one shared name and the same data type. - -### Index -also: index, indices, indexes -The number of a slot in an array. Counting starts at 0. - -### char -The data type for a single character. It goes in single quotation marks, e.g. 'C'. "C" with double quotation marks, on the other hand, is a String. - -### Character code -also: character code, character codes, ASCII code, ASCII table -The number behind a character. In the ASCII table A has the code 65, B 66 and so on. In Java (int) turns a character into its code and (char) turns a code into the character. - -### String -also: strings, Strings -A text, that is, a row of characters. In Java the data type is called String. The characters are counted from 0. - -### 2D array -also: 2D arrays, two-dimensional array, two-dimensional arrays -An array with rows and columns, like a table. A slot needs two indices, e.g. \`seats[1][2]\`. - -### Subprogram -also: subprogram, subprograms, Subprograms, method, methods, Methods, procedure, procedures, function, functions, Functions -A structure chart of its own for part of a task. It runs when it is called. In Java it is called a method; depending on its kind also a procedure or a function. - -### Parameter -also: parameter, parameters, Parameters -A variable in the header line of a subprogram. When it is called, it gets the value from the parentheses. - -### Overloading -also: overloaded, overload -Several methods with the same name but different parameters, e.g. \`mbot.forward(30)\` and \`mbot.forward(2, "rotations")\`. When calling, Java picks the right one by the number and type of the parameters. - -### Spaghetti code -also: spaghetti code -A program that jumps around so wildly that you can hardly follow what happens. Structure charts prevent that. - -### Call by value -also: call by value -A subprogram gets a copy of the value. If it changes its parameter, the caller's variable stays the same. - -### Call by reference -also: call by reference -A subprogram gets a reference to the same data, e.g. to an array. If it changes a slot, the caller sees the change too. - -### Return value -also: return value, return values, Return values -The result that a subprogram hands back to the call with return. - -### Break -A block that leaves the loop it is in straight away. Then the program continues below the loop. - -### Syntax error -also: syntax error, syntax errors, Syntax errors -A mistake in how the code is written, for example a missing \`;\`. The program does not start at all. - -### Runtime error -also: runtime error, runtime errors, Runtime errors -An error that only happens while the program runs, for example dividing by 0. The program stops at that point. - -### Logic error -also: logic error, logic errors, Logic errors -The program runs without any message but gives a wrong result. You find it with a desk check. - -### Desk check -also: desk check, desk checks, Desk checks -You run a structure chart on paper and write down the values of the variables after every step. - -### Linear search -also: linear search -A way of searching that compares all values one after another with the value you are looking for. It also works with unsorted values. - -### Binary search -also: binary search -A way of searching sorted values. It looks at the middle and keeps searching only in the matching half. - -### Bubble sort -also: bubble sort, Bubblesort -A simple way of sorting. It always compares two neighbours and swaps them if they are the wrong way round. - -### Event -also: event, events, Events -Something a person does in a window program, for example clicking a button. The program reacts to it with a listener (ActionListener). - -### Interface -also: Interfaces -A kind of contract in Java: it states which methods a class must have. \`ActionListener\` is an interface with the method \`actionPerformed\`. - -### Exception -also: exception, exceptions, Exceptions -An error that only happens while the program runs, for example an index outside the array. If no \`catch\` catches it, the program stops. - -### Scanner -A ready-made Java building block that reads input from the keyboard, for example a number with \`scanner.nextInt()\`. It needs \`import java.util.Scanner;\` at the very top. - -### comment -auch: comments, Comment, Comments -A note in the code for people. Java skips it when it runs. \`//\` lasts until the end of the line, \`/* … */\` can span several lines. - -### import -A line at the very top of Java code that fetches a ready-made building block from a package, for example \`import java.util.Scanner;\`. Without it, Java doesn't know the name. - -### source code -auch: Source code -The program text that people write and read, for example in a file \`TimesTable.java\`. - -### compiler -auch: compilers, Compiler -A program that translates source code. In Java it is called \`javac\` and turns a \`.java\` file into bytecode in a \`.class\` file. - -### bytecode -auch: Bytecode -The translated form of a Java program in a \`.class\` file. It is read by the JVM, not by people. - -### JVM -auch: Java Virtual Machine, virtual machine -The Java Virtual Machine runs bytecode. It is a program that works like a small computer made of software on Windows, macOS or Linux. That is why Java is platform independent. - -### JRE -Java Runtime Environment: the JVM and ready-made building blocks. You can run Java programs with it, but not compile them. - -### JDK -Java Development Kit: the JRE plus the compiler \`javac\` and other tools. You need it to program. - -### platform independent -A program runs without changes on different operating systems. In Java the JVM makes this possible: “Write once, run anywhere”. - -### machine code -auch: Machine code -Instructions as numbers that the processor runs directly. Every kind of processor has its own machine code. - -### JIT compiler -auch: JIT -A part of the JVM that translates often-used bytecode into machine code while the program runs (“just in time”). This makes Java faster. -`,xy=`## Basics - -### Statement - -A single step. You use it to create variables or to calculate. - -\`\`\` -int number = 5 -double price = 2.5 -String name = "Ada" -number = number + 1 -\`\`\` - -### Data types - -The data type comes before the name of the variable. - -| Data type | Meaning | Example | -|---|---|---| -| \`int\` | whole number | \`int count = 3\` | -| \`double\` | decimal number (with a point) | \`double price = 2.5\` | -| \`String\` | text in double quotation marks | \`String name = "Ada"\` | -| \`boolean\` | truth value | \`boolean done = false\` | -| \`char\` | a single character in single quotation marks | \`char grade = 'C'\` | - -\`'C'\` is a \`char\`, \`"C"\` is a String. You get a character from a text with \`charAt\`: \`char first = name.charAt(0)\`. Every character has a character code: \`(int) 'A'\` is 65, \`(char) 66\` is \`'B'\`. - -### Input - -Asks for a value while the chart runs and stores it in a variable. The text in quotation marks is the question. - -\`\`\` -input: int age "How old are you?" -input: double price "Enter a price" -input: String name "What is your name?" -\`\`\` - -### Output - -Shows a text or a value. Texts go in quotation marks; you join text and variables with \`+\`. - -\`\`\` -output: "Hello" -output: sum -output: "You are " + age + " years old." -\`\`\` - -> In an output, \`+\` always joins the parts together: with 3 and 4, \`output: a + b\` shows 34. So calculate in a variable first, e.g. \`int sum = a + b\`, and then output \`sum\`. - -## Branches - -### Branch - -Checks a condition. If it is true, the left path (true) runs, otherwise the right one (false). - -\`\`\` -age >= 18 -number % 2 == 0 -grade < 1 || grade > 6 -\`\`\` - -### Switch - -Picks one of several cases, depending on the value of a variable. If no case fits, \`default\` applies. You add cases on the right with **Add Case**. - -## Loops - -### While loop - -Repeats its inside **as long as** the condition is true. The condition is checked before every pass. - -\`\`\` -number != 1 -i < 10 -\`\`\` - -### Do-while loop - -Runs its inside **at least once** and checks the condition only afterwards. - -### For loop - -Counts a variable from a start value up to a limit. The three fields are Init, Condition and Step. - -\`\`\` -int i = 0 -i < 5 -i++ -\`\`\` - -### Endless loop - -Repeats its inside without a condition. A **Break** inside it lets you leave it. - -### Break - -Leaves the loop around it (\`break\`). - -## Subprograms - -### Call - -Stands for a subprogram, e.g. \`calculateSum()\`. With parameters and a return value, the subprogram has a header line as its title: - -\`\`\` -int square(int x) header line of the subprogram -return x * x hands back the result -int q = square(5) call, q gets 25 -showSum(3, 4) call of a void subprogram -\`\`\` - -## Calculating and comparing - -### Operators and comparisons - -- \`+ - * /\` the four basic operations -- \`%\` remainder of a division (\`7 % 2\` is 1) -- \`==\` equal, \`!=\` not equal -- \`<\` \`<=\` \`>\` \`>=\` less than, less than or equal, greater than, greater than or equal -- \`&&\` and, \`||\` or - -## Arrays - -### Arrays - -Several values under one name. Counting starts at 0. - -\`\`\` -int[] numbers = {3, 7, 1} -output: numbers[0] -int[] empty = new int[5] -\`\`\` - -A **2D array** is a table with rows and columns: - -\`\`\` -boolean[][] seats = new boolean[3][5] -seats[1][4] = true -output: seats.length + " rows, " + seats[0].length + " seats" -\`\`\` - -## Java - -### From code to program - -The compiler \`javac\` translates \`File.java\` into bytecode (\`File.class\`). The JVM translates the bytecode into machine code while it runs, the same way on Windows, macOS and Linux. C++, on the other hand, becomes machine code directly and has to be compiled again for every system. - -| | contains | for | -|---|---|---| -| JRE | JVM and libraries | running | -| JDK | JRE, compiler \`javac\`, tools | programming | - -### Comments - -Notes in the code. Java skips them, the structure chart stays the same. - -\`\`\`java -/* - * Task: add the numbers from 1 to 10 - * (multi-line comment) - */ -// Process (single-line comment) -int sum = 0; -for (int i = 1; i <= 10; i++) { - sum = sum + i; // comment after the code -} // end for -\`\`\` - -Good for: the task, dividing the code into input, process and output, an explanation, the end of a block after \`}\`, the expected output and notes for next time. -`,vy=`--- -titel: O que é um estrutograma? -bereich: Primeiros passos -kurz: Mostrar e ler algoritmos como uma série de passos claros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o que é um algoritmo -- ler um estrutograma -- reconhecer os três blocos básicos: sequência, decisão e ciclo -::: - -## Um algoritmo é uma instrução exata - -Um **algoritmo** descreve passo a passo como resolver uma tarefa. Cada passo tem de ser tão claro que qualquer um o consiga executar sem perguntar, tanto uma pessoa como um computador. - -Conheces algoritmos do dia a dia: uma receita, o caminho para um sítio ou as instruções para montar um roupeiro. - -::: diagramm l1-tee.visustruct -Fazer chá como estrutograma: cada bloco é um passo. -::: - -::: angeberwissen -Méééé, quem escreveu o primeiro programa? Uma mulher, já em 1843, muito antes do primeiro computador! **Ada Lovelace** descreveu passo a passo como a *Analytical Engine* (Máquina Analítica) de Charles Babbage devia calcular os chamados números de Bernoulli. Era um verdadeiro algoritmo para uma máquina. As instruções deviam ficar guardadas em cartões perfurados (mais sobre isto na lição 3). Mas a máquina nunca chegou a ser construída. - -A Ada teve ainda outra ideia genial: uma máquina destas consegue fazer mais do que contas. Também podia trabalhar com letras, símbolos ou até música. É exatamente isso que os computadores fazem hoje. Em sua honra, há uma linguagem de programação chamada **Ada**. -::: - -::: bild ada-lovelace.jpg -Ada Lovelace (1815–1852), matemática (imagem: aguarela de Alfred Edward Chalon, por volta de 1840, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg), domínio público). -::: - -## Como se lê um estrutograma - -Um estrutograma lê-se **de cima para baixo**. Cada bloco é um passo. Só quando um passo termina é que começa o seguinte. - -Esta forma de desenhar foi inventada por **Isaac Nassi e Ben Shneiderman** (1973). Por isso também se chama diagrama de Nassi-Shneiderman. Na Alemanha está normalizado como DIN 66261. - -::: bild ike-nassi.jpg ben-shneiderman.jpg -À esquerda: Isaac “Ike” Nassi (foto: [Ed Schipul](https://commons.wikimedia.org/wiki/File:Me_with_Ike_Nassi!!!!!_%286893328729%29.jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/), recortada), à direita: Ben Shneiderman (foto: [Robert Kosara](https://commons.wikimedia.org/wiki/File:Ben_Shneiderman_at_UNCC_%283x4_cropped%29.jpg), CC0). -::: - -> Um estrutograma tem sempre exatamente um início (em cima) e um fim (em baixo). Não há setas nem saltos para todo o lado. Programas que saltam para todo o lado chamam-se **código esparguete**, porque o seu fluxo se enrola como massa no prato. Mais sobre isto na próxima lição. - -::: angeberwissen -Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Universidade de Stony Brook, perto de Nova Iorque. Shneiderman tinha uns 25 anos e Nassi uns 23. Ou seja, dois estudantes que escreveram história da informática nas horas vagas. -::: - -## Bloco básico 1: a sequência - -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: **sequência**, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los: as [instruções]{.gelb} são amarelas, as decisões azuis, os ciclos cor-de-rosa. A sequência não tem cor própria, é simplesmente a fila de instruções umas por baixo das outras. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. - -A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. - -É assim que se parece: - -- Cada instrução é um **retângulo simples**. -- Os retângulos ficam **uns por cima dos outros**, sem espaço entre eles. -- São executados de cima para baixo, uma instrução depois da outra. - -::: diagramm l1-sequenz.visustruct -Quatro instruções em sequência. Primeiro levantas-te, depois lavas os dentes, e assim por diante. -::: - -> O exemplo do chá lá em cima também é uma sequência. - -::: angeberwissen -15 minutos! Foi o tempo de que Shneiderman precisou para o primeiro esboço com sequência, decisão e ciclo. Eu preciso de mais tempo do que isso para escolher entre feno e trevo. -::: - -## Bloco básico 2: a decisão - -Muitas vezes o passo seguinte depende de uma **condição**. Uma condição é uma pergunta a que só se pode responder com **sim ou não**, por exemplo *Está a chover?* No VisuStruct, sim é **true** e não é **false**. - -Para decisões destas existe a **decisão**. É assim que se parece: - -- Em cima, a condição fica dentro de um **triângulo**. -- Por baixo, o bloco divide-se em **duas colunas**: à esquerda o ramo para **true**, à direita o ramo para **false**. -- Só é executado **um** dos dois ramos. Depois, os dois ramos continuam juntos por baixo da decisão. - -::: diagramm l1-verzweigung.visustruct -Se estiver a chover, é executado o ramo da esquerda, senão o da direita. Depois, os dois casos continuam com “Sair”. -::: - -> Se num dos casos não deve acontecer nada, esse ramo fica vazio. O sinal **ø** indica isso. - -::: angeberwissen -Alerta de ortografia! Escreve-se Shneiderman, sem c. Quem escrever “Schneiderman” leva um empurrãozinho dos meus chifres. Ele próprio conta que as pessoas estão sempre a meter um c no nome dele. -::: - -## Bloco básico 3: o ciclo - -Se uma coisa deve acontecer **várias vezes**, não a escreves várias vezes. Em vez disso usas um **ciclo**, também chamado repetição. - -É assim que se parece: - -- Em cima está a condição, por exemplo *Prato não vazio*. -- Os passos que se repetem ficam **recuados** por baixo dela. Em cima e à esquerda, o bloco forma um **L invertido** à volta deles. -- Antes de cada iteração, a condição é verificada. Enquanto for **true**, os passos dentro do L invertido são executados mais uma vez. Se for **false**, o programa continua por baixo do ciclo. - -::: diagramm l1-wiederholung.visustruct -Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levantado. -::: - -> Há mais tipos de ciclos. Vais conhecê-los nas próximas lições. - -## Os três juntos - -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma sequência de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são [instruções]{.gelb} simples. As instruções dentro de uma decisão ou de um ciclo também são amarelas. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. - -::: diagramm l1-grundbausteine.visustruct -Reconheces a decisão pelo triângulo e o ciclo pelo L invertido. Tudo junto forma uma sequência. -::: - -Os blocos também podem ser **encaixados** uns dentro dos outros: um ciclo ou um ramo pode voltar a conter sequências, decisões e ciclos. - -::: angeberwissen -Consolo para quem correu mal um teste: a famosa revista *Communications of the ACM* rejeitou o artigo sobre estrutogramas. Segundo Nassi, o revisor até disse que deviam juntar todas as cópias e queimá-las. Ai! O artigo saiu em 1973 numa revista mais pequena e hoje é citado milhares de vezes. Ha! -::: - -## Primeiro a estrutura, depois o código - -Quando programas, acontecem duas coisas ao mesmo tempo: tens de pensar nos passos e prestar atenção à forma como a linguagem de programação se escreve. Um estrutograma permite-te separar as duas coisas. - -1. Primeiro pensas na **lógica**: que passos, que condições, que repetições? -2. Depois traduzes a estrutura pronta para **Java, Python ou JavaScript**. O VisuStruct até consegue gerar o código por ti. - -Com a **simulação** também podes executar o teu estrutograma passo a passo e verificar se ele faz mesmo o que deve. - -## Jogo: Que bloco básico? - -::: spiel frage -titel: Jogo: Que bloco básico? -intro: O Ludwig descreve coisas do seu dia a dia. Que bloco básico se esconde em cada uma? Oito rondas. -antworten: sequência | decisão | ciclo - -runde: -frage: "Pasta na escova, lavar os dentes, bochechar." -richtig: sequência -> Três passos, cada um exatamente uma vez e sempre por esta ordem. - -runde: -frage: "Se chover, levo o guarda-chuva, senão os óculos de sol." -richtig: decisão -> Uma condição decide qual dos dois caminhos é seguido. - -runde: -frage: "Mexer até a massa ficar lisa." -richtig: ciclo -> Mexe-se repetidamente enquanto a massa ainda não estiver lisa. - -runde: -frage: "Correr dez voltas ao campo de desporto." -richtig: ciclo -> A mesma volta é corrida dez vezes. - -runde: -frage: "Calçar os sapatos, vestir o casaco, abrir a porta, e lá vamos." -richtig: sequência -> Um passo a seguir ao outro, nada é saltado nem repetido. - -runde: -frage: "Se o semáforo estiver verde, atravessas a rua." -richtig: decisão -> Mesmo sem "senão" é uma decisão. O ramo senão fica simplesmente vazio. - -runde: -frage: "Lançar o dado até sair um seis." -richtig: ciclo -> Não se sabe antes quantas vezes. Lança-se até a condição se cumprir. - -runde: -frage: "Se alguém disser 'Entra', entras. Senão, esperas à porta." -richtig: decisão -> A resposta decide entre dois caminhos: entrar ou esperar. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o que é um algoritmo. → Um algoritmo é uma instrução exata -- Consigo ler um estrutograma de cima para baixo. → Como se lê um estrutograma -- Consigo nomear os três blocos básicos: sequência, decisão e ciclo. → Bloco básico 1: a sequência -- Consigo reconhecer cada bloco básico num estrutograma pela sua forma. → Os três juntos -::: - -## Teste de conhecimentos - -::: quiz -? Em que direção se lê um estrutograma? -→ Como se lê um estrutograma -- [ ] Da esquerda para a direita -- [x] De cima para baixo -- [ ] De baixo para cima -> Cada bloco é um passo, e os passos seguem-se de cima para baixo. - -? Qual destes NÃO é um dos três blocos básicos? -→ Bloco básico 1: a sequência -- [ ] Sequência -- [ ] Decisão -- [x] Salto -- [ ] Ciclo -> Num estrutograma não há saltos. Sequência, decisão e ciclo chegam para qualquer algoritmo. - -? Como reconheces uma decisão num estrutograma? -→ Os três juntos -- [ ] Por um L invertido -- [x] Por um triângulo com a condição e duas colunas por baixo -- [ ] Por vários retângulos uns por cima dos outros -> O L invertido pertence ao ciclo, e retângulos uns por cima dos outros são uma sequência. - -? Quando é que o interior de um ciclo é executado mais uma vez? -→ Os três juntos -- [x] Enquanto a condição for verdadeira -- [ ] Só se a condição for falsa -- [ ] Sempre exatamente duas vezes -> A condição é verificada antes de cada iteração. Se for falsa, o programa continua por baixo do ciclo. - -? O que é um algoritmo? -→ Um algoritmo é uma instrução exata -- [x] Instruções claras, passo a passo, para resolver uma tarefa -- [ ] Um determinado programa em Java -- [ ] Uma imagem que explica um programa -> Um algoritmo não depende de nenhuma linguagem de programação. Um estrutograma é uma forma de o escrever. -::: -`,wy=`--- -titel: Fluxograma e pseudocódigo -bereich: Primeiros passos -kurz: Representar algoritmos como fluxograma e como pseudocódigo e compará-los com o estrutograma. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ler um fluxograma (em inglês *flowchart*) e construir um sozinho -- explicar porque é que os saltos num fluxograma levam a erros -- ler um algoritmo simples em pseudocódigo -::: - -## Outras formas de desenhar: o fluxograma - -Há mais duas formas de representar um algoritmo: o **fluxograma** e o **pseudocódigo**. Vais conhecer as duas nas aulas. Em inglês, o fluxograma chama-se **flowchart**. Esta palavra aparece muitas vezes, por exemplo em programas e na internet. - -Aqui vês outra vez o nosso estrutograma para beber chá da última lição. A seguir vamos ver o fluxograma, com o mesmo exemplo. - -::: diagramm l1-grundbausteine.visustruct -O exemplo do chá como estrutograma: primeiro a chávena, depois a decisão para o açúcar e depois o ciclo. -::: - -### O mesmo algoritmo como fluxograma - -::: grafik l01-pap.svg -O exemplo do chá como fluxograma. A seta de “Esperar 1 minuto” para cima forma o ciclo. -::: - -### Os símbolos - -Um fluxograma é feito de poucos símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). - -- **Oval:** início ou fim. Cada fluxograma tem exatamente um início e um fim. -- **Retângulo:** uma instrução, por exemplo *Pôr uma chávena na mesa*. -- **Losango:** uma decisão. No losango está uma pergunta, e dele saem duas setas: **sim** e **não**. -- **Paralelogramo:** uma entrada ou saída. No exemplo do chá não aparece. -- **Seta:** mostra qual é o passo seguinte. - -Um ciclo não tem símbolo próprio no fluxograma. Reconheces um ciclo por uma seta que volta **para cima**. - -### As vantagens - -- **Muito fácil de ler**, mesmo para quem nunca viu um fluxograma. Basta seguir as setas com o dedo. -- Os fluxogramas não se usam só na programação, mas em todo o lado onde se explica um processo: em manuais de instruções, na procura de avarias (“A lâmpada acende? Não: a ficha está ligada?”) ou nas empresas para os processos de trabalho. - -## Exercício: Fazer um bolo como fluxograma - -Agora és tu que constróis um fluxograma. O Ludwig faz um bolo assim: - -Põe os ingredientes na tigela e mexe a massa. Se a massa ainda não estiver lisa, continua a mexer. Quando está lisa, deita a massa na forma e coze o bolo durante 30 minutos. Depois testa com um palito: se ainda tiver massa agarrada, coze mais 5 minutos e testa outra vez. Quando o palito sai limpo, tira o bolo e diz: “O bolo está pronto!” - -::: pap -titel: Exercício: Fazer um bolo como fluxograma -auftrag: Os lugares no fluxograma estão vazios. Põe cada elemento no seu lugar. A forma do lugar ajuda-te. -start: Início -anweisung: Pôr os ingredientes na tigela -anweisung: Mexer a massa -frage: Massa lisa? | nein -> Mexer a massa -anweisung: Deitar a massa na forma -anweisung: Cozer 30 minutos -frage: Palito limpo? | nein: Cozer mais 5 minutos -anweisung: Tirar o bolo do forno -ausgabe: “O bolo está pronto!” -ende: Fim -erklärung: Dois ciclos, duas setas para cima: ao mexer, a seta volta a “Mexer a massa”; ao cozer, vai de “Cozer mais 5 minutos” de volta à pergunta. A saída fica no paralelogramo. -legende: ja -::: - -**Desenhar os teus próprios fluxogramas:** Com o **VisuFlow** desenhas o teu fluxograma com toda a facilidade. Os símbolos estão prontos numa barra: tocar num acrescenta o símbolo seguinte e liga-o logo com uma seta. Para começar, podes carregar o exemplo do chá. Guardas o teu fluxograma como ficheiro e exportas como imagem ou PDF, por exemplo para o teu caderno ou uma apresentação. [Abrir o VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Desvantagens do fluxograma: saltos - -Uma seta num fluxograma pode ir de qualquer símbolo para qualquer outro. Parece prático, mas é perigoso. - -Antigamente, os programas escreviam-se exatamente assim. Cada linha tinha um **número**, e o comando **GOTO**, em português “ir para”, saltava para um número de linha. Cada IR PARA é uma seta do fluxograma. O nosso exemplo do chá ficava assim: - -\`\`\` -10 Pôr uma chávena na mesa -20 SE não quer açúcar, IR PARA 40 -30 Juntar açúcar -40 SE chá não demasiado quente, IR PARA 70 -50 Esperar 1 minuto -60 IR PARA 40 -70 Beber o chá -\`\`\` - -### Mais uma linha, e os saltos ficam errados - -Agora melhoras o algoritmo: depois do açúcar, o saquinho de chá deve sair. Acrescentas a nova linha 40, e todas as linhas abaixo avançam um número. Mas os saltos continuam a apontar para os números antigos: - -\`\`\` -10 Pôr uma chávena na mesa -20 SE não quer açúcar, IR PARA 40 -30 Juntar açúcar -40 Tirar o saquinho de chá -50 SE chá não demasiado quente, IR PARA 70 -60 Esperar 1 minuto -70 IR PARA 40 -80 Beber o chá -\`\`\` - -Experimenta: a linha 70 já não te manda para a verificação da linha 50, mas para o saquinho. E quando o chá já está frio o suficiente, a linha 50 salta para a linha 70 em vez de *Beber o chá*. Ou seja, tiras o saquinho vezes sem conta e nunca bebes. A cada alteração tens de verificar todos os IR PARA. Num programa grande, com centenas de saltos, é fácil algo correr mal. - -### Para todo o lado: código esparguete - -Com setas também se pode saltar do meio de um ciclo para fora, ou de fora para o meio de um ciclo. Estes saltos tornam o fluxograma confuso muito depressa. Com muitos saltos, as setas cruzam-se até o fluxograma parecer um prato de esparguete. Por isso chama-se **código esparguete**. Mal se consegue seguir o fluxo, e os erros escondem-se bem. - -Um estrutograma não tem setas. Se acrescentares um bloco, tudo o que está abaixo desce com ele, e nenhum salto pode apontar para o sítio errado. Para sair de um ciclo mais cedo existe lá um bloco próprio e arrumado, a interrupção. Vais conhecê-la na lição 18. - -::: angeberwissen -Em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”, ou seja, “o GOTO é considerado prejudicial”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, \`goto\` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. -::: - -## Pseudocódigo e comparação - -**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. Aqui também não há saltos. Este é o nosso exemplo do chá: - -\`\`\` -Pôr uma chávena na mesa -SE quer açúcar ENTÃO - Juntar açúcar -FIM SE -ENQUANTO chá ainda demasiado quente - Esperar 1 minuto -FIM ENQUANTO -Beber o chá -\`\`\` - -O pseudocódigo **não tem uma forma fixa**. Há quem escreva CASO em vez de SE, quem use uma seta para a atribuição (\`numero ← 5\`) ou quem não escreva as linhas FIM. Tudo isso é permitido. O importante é que qualquer pessoa o perceba sem explicação. Por isso, o pseudocódigo não é mais uma linguagem de programação que tens de aprender. - -::: angeberwissen -O pseudocódigo parece-te familiar? A linguagem de programação Python é muito parecida, e isso é de propósito: o seu criador, Guido van Rossum, queria que os programas se lessem quase como texto normal. O Python também usa a indentação para mostrar o que pertence junto. Mas atenção: o Python é uma linguagem de programação a sério, com regras fixas. Um espaço a mais e o computador reclama. O pseudocódigo é mais descontraído, tal como eu ao pequeno-almoço. -::: - -### Comparação - -- **Estrutograma:** blocos dentro de blocos, o ciclo é um L invertido. Vês a estrutura num relance, e saltos malucos são impossíveis. -- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos, e são possíveis saltos para todo o lado. -- **Pseudocódigo:** texto com indentação, o ciclo fica entre ENQUANTO e FIM ENQUANTO. Rápido de escrever e já perto do código de um programa. - -> Os três descrevem o mesmo algoritmo. Quando sabes ler uma das formas, aprendes as outras depressa. - -::: angeberwissen -Nassi e Shneiderman estavam em guerra com as setas! O artigo deles de 1973 chamava-se “Flowchart Techniques for Structured Programming”. Com setas pode-se saltar para todo o lado até o fluxograma parecer um prato de esparguete. Num estrutograma isso é simplesmente impossível. Mééé, é assim que eu gosto: arrumado, como o meu estábulo. -::: - -## Jogo: Que representação? - -::: spiel frage -titel: Jogo: Que representação? -intro: O Ludwig descreve uma forma de representar um algoritmo sem dizer o nome. É o estrutograma, o fluxograma ou o pseudocódigo? Oito rondas. -antworten: estrutograma | fluxograma | pseudocódigo - -runde: -frage: “Quando algo se repete, uma das minhas setas aponta de volta para cima.” -richtig: fluxograma -> No fluxograma, o ciclo não tem símbolo próprio. Uma seta volta para cima. - -runde: -frage: “O meu ciclo parece um L invertido.” -richtig: estrutograma -> A caixa envolve os passos repetidos em cima e à esquerda. - -runde: -frage: “Sou feito de palavras como SE e ENQUANTO, e a indentação mostra o que pertence a quê.” -richtig: pseudocódigo -> O pseudocódigo é texto em linguagem normal, organizado como um programa. - -runde: -frage: “A minha decisão é um losango com as saídas sim e não.” -richtig: fluxograma -> No estrutograma, a condição fica num triângulo. - -runde: -frage: “As minhas setas podem enrolar-se para todo o lado como esparguete.” -richtig: fluxograma -> Como as setas podem ir para qualquer lado, no fluxograma é possível haver código esparguete. - -runde: -frage: “Não tenho uma forma fixa de escrever. Também podes escrever CASO em vez de SE.” -richtig: pseudocódigo -> O importante é que qualquer pessoa o perceba sem explicação. - -runde: -frage: “A condição fica em cima num triângulo, e por baixo divido-me em duas colunas.” -richtig: estrutograma -> É assim que a decisão aparece no estrutograma: true à esquerda, false à direita. - -runde: -frage: “Se inserires uma caixa, tudo o que está por baixo desce também. Nenhum salto pode falhar.” -richtig: estrutograma -> O estrutograma não tem setas nem saltos, por isso nada pode apontar para o sítio errado. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo nomear os símbolos de um fluxograma e ler um fluxograma simples. → Outras formas de desenhar: o fluxograma -- Consigo construir sozinho um algoritmo simples como fluxograma. → Exercício: Fazer um bolo como fluxograma -- Consigo explicar porque é que os saltos com GOTO levam a erros e a código esparguete. → Desvantagens do fluxograma: saltos -- Consigo ler um algoritmo simples em pseudocódigo. → Pseudocódigo e comparação -::: - -## Teste de conhecimentos - -::: quiz -? Como reconheces um ciclo num fluxograma? -→ Outras formas de desenhar: o fluxograma -- [ ] Por um L invertido -- [x] Por uma seta que volta para cima -- [ ] Pela palavra ENQUANTO -> O L invertido pertence ao estrutograma, e ENQUANTO ao pseudocódigo. - -? Associa cada símbolo do fluxograma ao seu significado. -→ Outras formas de desenhar: o fluxograma -= Oval -> Início ou fim -= Retângulo -> Instrução -= Losango -> Decisão -= Paralelogramo -> Entrada ou saída -> O losango tem duas saídas: sim e não. - -? Como se diz fluxograma em inglês? -→ Outras formas de desenhar: o fluxograma -- [x] Flowchart -- [ ] Structure chart -- [ ] Pseudocode -> Structure chart é o estrutograma. - -? Acrescentas uma nova linha a um programa com GOTO. O que pode acontecer? -→ Desvantagens do fluxograma: saltos -- [x] Os saltos apontam para as linhas erradas, porque os números mudaram -- [ ] Nada, os saltos ajustam-se sozinhos -- [ ] O programa fica automaticamente mais rápido -> Cada IR PARA aponta para um número de linha fixo. Se as linhas descem, o programa salta para o sítio errado. - -? No pseudocódigo, o que mostra que linhas pertencem a um ciclo? -→ Pseudocódigo e comparação -- [ ] A cor -- [x] A indentação e o FIM ENQUANTO -- [ ] Uma seta -> Tudo o que está entre ENQUANTO e FIM ENQUANTO está recuado e é repetido. -::: -`,yy=`--- -titel: O editor -bereich: Primeiros passos -kurz: Inserir elementos, escrever texto, mover e eliminar. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- inserir um elemento da área Elementos e substituir um marcador -- alterar o texto de um bloco e mudar entre Instrução, Entrada e Saída -- mover, copiar e eliminar blocos e anular passos -::: - -## O ecrã - -O VisuStruct tem dois editores: o [editor de estrutogramas](#zeige-editor), de que trata esta lição, e à direita a área [Código](#zeige-codelive) para código Java (a partir da lição 4). Se o editor de estrutogramas estiver recolhido, esta lição abre-o sozinha. As palavras azuis mostram-te as áreas, mesmo que estejam recolhidas: passa o rato por cima de uma, e a área abre-se ao lado da área de aprendizagem e acende-se. Se clicares nela (ou tocares nela), fica aberta. - -O editor de estrutogramas tem várias áreas. Passa o rato por cima de uma palavra azul ou toca nela, e essa área acende-se no editor; as áreas recolhidas, como os Elementos, abrem-se. - -- **Mesmo em cima, a [barra de ferramentas](#zeige-leiste):** Novo, Abrir e Guardar. À direita, a roda dentada das [Definições](#zeige-einstellungen): tamanho do texto e idioma. -- **Por baixo, as [ferramentas](#zeige-werkzeuge)** por cima dos elementos e do estrutograma: Anular, Cortar, Copiar, Colar, Eliminar, Exportar, Código e Simulação. Os botões só mostram ícones. Se puseres o rato por cima de um, aparece o nome. -- **À esquerda, os [Elementos](#zeige-elemente):** Aqui estão todos os blocos que podes arrastar para o estrutograma. Há quem chame a esta área a paleta. -- **Ao meio, o [estrutograma](#zeige-struktogramm):** Um diagrama novo contém apenas um marcador vazio, assinalado com **ø**. -- **Em baixo, o [Inspetor de objetos](#zeige-objektinspektor):** Aqui editas o texto do elemento selecionado. Se for pequeno ou grande demais, arrasta a linha com a pega por cima dele para cima ou para baixo. - -> Podes recolher esta área de aprendizagem a qualquer momento com o [ícone da barra lateral](#zeige-lernen) no topo desta área. Fica só a barra estreita “🎓 Aprender” à esquerda; um clique abre-a de novo. Ela fica aberta ao lado do editor, para poderes experimentar logo o que lês. Da mesma forma, há à esquerda a coluna [📁 Ficheiros](#zeige-dateien) para os teus programas guardados (lição 3) e à direita a área [Código](#zeige-codelive) para Java (a partir da lição 4). - -## Inserir um elemento - -Arrasta um elemento da área **Elementos** para o estrutograma. Enquanto arrastas, uma linha azul mostra onde ele vai ficar: - -- **Sobre o marcador ø:** O elemento substitui o marcador. -- **Sobre a metade de cima de um bloco:** O elemento fica antes dele. -- **Sobre a metade de baixo de um bloco:** O elemento fica depois dele. - -::: grafik l02-einfuegen.svg -O sítio onde largas decide onde fica o novo elemento. -::: - -Também funciona sem arrastar: **clica** num elemento da área Elementos (ou toca nele). Ele é então inserido depois do bloco selecionado. Se o marcador **ø** estiver selecionado, substitui-o. - -Com o teclado, usa a tecla **Tab** para saltar para um elemento e prime **Enter**. O novo elemento também fica depois do bloco selecionado. - -::: angeberwissen -Agarrar blocos e arrastá-los de um lado para o outro, tal como estás a fazer agora, tem um nome pomposo: **manipulação direta**. Foi Ben Shneiderman quem inventou o termo em 1982. Sim, o senhor dos estrutogramas. Aquele homem trabalhava mais do que eu quando estou a pastar. -::: - -## Escrever texto - -Clica num bloco. Ele fica com um contorno azul, e o seu texto aparece no Inspetor de objetos por baixo do diagrama. O que escreveres lá aparece logo no diagrama. - -Mais rápido é fazer **duplo clique** no bloco, ou **toque duplo** no tablet. Assim escreves o texto diretamente no estrutograma. **Enter** aceita, **Esc** cancela. Com o teclado, seleciona o bloco e carrega em **Enter**. - -O bloco da área Elementos chama-se **Instrução**. Em cima, no Inspetor de objetos, escolhes de que tipo deve ser: - -- **Instrução:** calcular ou definir alguma coisa, p. ex. \`int numero = 5\`. Vais aprender como na lição 4. -- **Entrada:** pedir um valor enquanto o estrutograma é executado. Isso vem na lição 6. -- **Saída:** mostrar alguma coisa. No diagrama fica com \`output:\` à frente, p. ex. \`output: "Olá"\`. - -Para começar, só precisas de Saída. Os textos que devem aparecer exatamente como estão ficam entre **aspas**. - -::: diagramm l2-ausgabe.visustruct -Duas saídas, uma a seguir à outra. Abre o diagrama no editor e inicia a [simulação](#zeige-simulation) nas ferramentas para veres a saída. Vais conhecê-la melhor na lição 7. -::: - -## Mover, copiar, eliminar - -- **Mover:** Arrasta um bloco existente com o rato para um novo sítio. -- **Copiar e colar:** Seleciona um bloco e prime Ctrl+C e Ctrl+V (no Mac ⌘C e ⌘V). A cópia fica depois do bloco selecionado. Sem teclado, por exemplo no tablet, toca em **Copiar** e **Colar** nas [ferramentas](#zeige-werkzeuge). -- **Eliminar:** Seleciona um bloco e prime Del, ou clica no [caixote do lixo](#zeige-loeschen) „Eliminar seleção“ nas ferramentas. -- **Anular:** Ctrl+Z anula o último passo, Ctrl+Shift+Z refá-lo (no Mac ⌘Z e ⌘⇧Z). Sem teclado, toca em [Anular](#zeige-rueckgaengig) nas ferramentas. - -## Exercício: Olá Mundo - -::: übung l2-hallo -titel: Olá Mundo -auftrag: Constrói um estrutograma que mostre **Olá Mundo**. -Arrasta uma **Instrução** dos Elementos para o marcador **ø** e clica no bloco. No Inspetor de objetos, por baixo do estrutograma, há três botões em cima: Instrução, Entrada e Saída. Clica em **Saída**. Depois escreve \`"Olá Mundo"\` no campo de texto por baixo, com aspas. -test: - -> Olá Mundo -braucht: anweisung -tipp: Só precisas de um único bloco. O texto que deve aparecer vai para o campo de texto do Inspetor de objetos. -tipp: Atenção às aspas. Sem elas, o VisuStruct procura uma variável chamada Olá. -lösung: l2-hallo-loesung.visustruct -::: - -Clica em **Verificar** quando terminares. O VisuStruct executa o teu estrutograma e compara a saída. - -## Exercício: Duas linhas - -::: übung l2-zwei-zeilen -titel: Duas linhas -auftrag: Mostra primeiro **Olá** e depois **Estou a aprender estrutogramas**, cada um na sua linha. -test: - -> Olá | Estou a aprender estrutogramas -tipp: Duas linhas significa duas saídas. Os blocos ficam uns por cima dos outros e são executados de cima para baixo. -tipp: Cada saída é um bloco próprio. Arrasta a segunda Instrução para a metade de baixo da primeira. -lösung: l2-zwei-zeilen-loesung.visustruct -::: - -## Jogo: Profissional do editor - -::: spiel frage -titel: Jogo: Profissional do editor -intro: O Ludwig testa se dominas o editor. Sete rondas. - -runde: -frage: Arrastas uma instrução para o marcador **ø**. O que acontece? -- [x] A instrução substitui o marcador. -- A instrução fica depois do marcador. -- Nada, não se pode largar nada sobre ø. -> O marcador só guarda o lugar. O novo elemento ocupa-o. - -runde: -frage: Arrastas um elemento para a metade **de cima** de um bloco. Onde fica? -- [x] antes dele -- depois dele -- Substitui o bloco. -> Metade de cima quer dizer antes, metade de baixo quer dizer depois. A linha azul mostra-te enquanto arrastas. - -runde: -frage: Arrastas um elemento para a metade **de baixo** de um bloco. Onde fica? -- antes dele -- [x] depois dele -- no fim do estrutograma -> Metade de baixo quer dizer: logo a seguir a este bloco. - -runde: -frage: Apagaste um bloco sem querer. O que o traz de volta? -- Ctrl+C / ⌘C -- [x] Ctrl+Z / ⌘Z -- Ctrl+V / ⌘V -> Ctrl+Z / ⌘Z anula o último passo. Ctrl+C / ⌘C copia, Ctrl+V / ⌘V cola. - -runde: -frage: Ao executar deve aparecer exatamente **Olá**. O que está no bloco? -- [x] output: "Olá" -- output: Olá -- "Olá" -> Um texto que deve aparecer tal e qual fica entre aspas. O editor põe \`output:\` à frente quando escolhes o tipo Saída. - -runde: -frage: Onde alteras o texto do bloco selecionado? -- na área Elementos -- [x] no Inspetor de objetos -- na barra de ferramentas lá em cima -> O Inspetor de objetos por baixo do diagrama mostra o texto do bloco selecionado. - -runde: -frage: Clicas num elemento da área Elementos, sem arrastar. Onde fica? -- [x] depois do bloco selecionado -- no início -- no fim -> Sem arrastar (clique, ou Tab e Enter), o novo elemento fica depois do bloco que está selecionado nesse momento. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo inserir um elemento da área Elementos e substituir um marcador. → Inserir um elemento -- Consigo alterar o texto de um bloco e mudar entre Instrução, Entrada e Saída. → Escrever texto -- Consigo mover, copiar e eliminar blocos e anular passos. → Mover, copiar, eliminar -::: - -## Teste de conhecimentos - -::: quiz -? O que significa o sinal ø num bloco? -→ Inserir um elemento -- [ ] O bloco contém um erro. -- [x] Aqui ainda há um marcador vazio. -- [ ] O programa termina aqui. -> Um marcador é substituído quando arrastas um elemento para cima dele. - -? Arrastas uma Instrução para a metade de baixo de um bloco. Onde é que ela fica? -→ Inserir um elemento -- [ ] Antes dele -- [x] Depois dele -- [ ] O bloco é substituído. - -? Como mostras o texto Bom dia exatamente como está? -→ Escrever texto -- [ ] output: Bom dia -- [x] output: "Bom dia" -- [ ] input: "Bom dia" -> Sem aspas, Bom dia é entendido como o nome de uma variável. -::: -`,zy=`--- -titel: Guardar, abrir, exportar -bereich: Primeiros passos -kurz: Guardar os teus ficheiros em segurança, usar o teu espaço de trabalho, abrir vários diagramas e partilhá-los como imagem ou PDF. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dar um título a um diagrama -- guardar um diagrama como ficheiro .visustruct e voltar a abri-lo -- exportar um diagrama como imagem (PNG) ou PDF -- abrir um segundo diagrama num novo separador -- criar o meu espaço de trabalho \`VisuStruct-Ficheiros\` -- guardar um programa no meu espaço de trabalho -::: - -## O ficheiro .visustruct - -Os estrutogramas são guardados como ficheiros **.visustruct**. Todas as versões do VisuStruct usam o mesmo formato: no navegador, no Mac, iPad e iPhone, e a app Java no computador. Assim podes começar no navegador na escola e continuar na app em casa. - -::: angeberwissen -Quando Nassi era estudante, não havia ficheiros para guardar. Havia cartões perfurados. Nassi conta que um encontro ao sábado à noite era assim: a futura mulher dele sentava-se com ele no centro de computação e perfurava-lhe os cartões. Romance à moda da informática! -::: - -::: grafik l03-lochkarte.svg l03-lochkarte-beschriftet.svg -Era assim um cartão perfurado. Cada cartão tinha uma linha de programa, aqui \`PRINT *, 'OLA MUNDO'\` na linguagem Fortran. Cada coluna é um carácter, e os furos são o seu código. Um programa inteiro era uma pilha destes cartões. Se caísse ao chão, era preciso voltar a ordenar tudo. -::: - -::: angeberwissen -Um pioneiro da informática da minha região na Alemanha: **Konrad Zuse**. A 12 de maio de 1941 apresentou em Berlim o **Z3**, o primeiro computador digital programável a funcionar no mundo. Já calculava no **sistema binário**, só com 0 e 1, com cerca de 2000 relés (interruptores elétricos). O programa não estava em cartões perfurados, mas sim em furos numa película de cinema usada. Depois, Zuse inventou o **Plankalkül**, uma das primeiras linguagens de programação. Mais tarde viveu em **Hünfeld**, perto de Fulda, até morrer em 1995. O Museu Konrad Zuse de lá mostra réplicas do Z3. A minha dica para uma visita de estudo! O horário está no site da cidade de Hünfeld. -::: - -::: grafik l03-zuse-lochstreifen.svg -Mais ou menos assim era a fita de programa de Zuse: uma película de cinema velha com furos. Cada coluna é uma instrução com 8 posições. Um furo significa 1, sem furo significa 0. A máquina lia a fita instrução a instrução. -::: - -## Guardar e abrir - -- **[Guardar](#zeige-speichern)** (Ctrl+S, no Mac ⌘S): O diagrama é guardado como ficheiro. Se a coluna **Ficheiros** estiver configurada (ver abaixo), fica lá. Caso contrário, o navegador pergunta onde o guardar ou põe o ficheiro na pasta de transferências. -- **[Abrir](#zeige-oeffnen)** (Ctrl+O, no Mac ⌘O): Voltar a carregar um ficheiro guardado. Também podes simplesmente arrastar um ficheiro para a janela do navegador. - -> O navegador memoriza os teus exercícios automaticamente. Mas isso só funciona neste navegador, neste dispositivo. Por isso, guarda sempre também os trabalhos importantes como ficheiro. - -## A coluna Ficheiros - -À esquerda da área de aprendizagem encontras a coluna [📁 Ficheiros](#zeige-dateien). Aí reúnes todos os teus programas num só sítio, o teu **espaço de trabalho**. - -**A tua vez:** Configura já o teu espaço de trabalho, antes de continuares a ler. A partir de hoje guardas lá todos os teus programas. - -1. Cria um espaço de trabalho: abre a coluna e clica em **Escolher pasta**. Na janela, vai aos teus **Documentos**, cria aí com **Nova pasta** uma pasta chamada \`VisuStruct-Ficheiros\` e seleciona-a. Permite que o VisuStruct use a pasta. Isto funciona no Chrome e no Edge. No iPad e noutros navegadores, clica antes em **Guardar no navegador**. -2. Guarda como de costume. No teu espaço de trabalho, o VisuStruct cria automaticamente uma pasta com a data de hoje, por exemplo \`2026-10-23\`, e guarda lá o programa. O nome do ficheiro vem do título. - -O teu espaço de trabalho fica assim: - -\`\`\`text -VisuStruct-Ficheiros ← espaço de trabalho -└── 2026-10-23 ← dia - └── Fatorial.visustruct -\`\`\` - -Um clique num programa da coluna volta a abri-lo. Assim encontras depressa cada aula mais tarde. - -Também o teu **progresso** fica no espaço de trabalho: o ficheiro \`learnProgress.json\` guarda as lições e os exercícios que já concluíste. Se abrires o espaço de trabalho noutro navegador, o teu progresso volta a estar lá. - -> Porquê uma pasta real? O teu progresso e os teus programas ficam lá guardados como ficheiros. Podes levar a pasta contigo, por exemplo numa pen USB ou na tua pasta na nuvem, como o OneDrive. Assim continuas em casa, noutro computador, exatamente onde paraste. Se guardares só no navegador, tudo fica apenas neste navegador, neste dispositivo. Se alguém apagar os dados do navegador, o teu progresso também desaparece. - -## Vários diagramas em separadores - -Por cima do estrutograma vês os [separadores](#zeige-reiter). Com **+** ou [Novo](#zeige-neu) abres mais um diagrama vazio. Um ponto • antes do nome mostra que há alterações não guardadas. - -O [título](#zeige-titel) de um diagrama escreve-se no campo por cima do estrutograma. Também aparece quando exportas e é sugerido como nome do ficheiro. - -## Partilhar: imagem, PDF ou ficheiro - -Com [Exportar](#zeige-exportieren) nas ferramentas (ícone com uma seta para cima) podes partilhar o teu estrutograma: - -- **Imagem (PNG):** para pôr numa ficha de trabalho ou numa apresentação -- **Gráfico vetorial (SVG):** fica nítido em qualquer tamanho -- **PDF (A4):** uma página para entregar ou imprimir -- **Ficheiro VisuStruct (.visustruct):** para passar a alguém que deva abrir e continuar a editar o teu estrutograma no VisuStruct, por exemplo por e-mail ou pela plataforma de aprendizagem -- **Imprimir** (Ctrl+P, no Mac ⌘P): diretamente para a impressora - -Na [roda dentada](#zeige-textgroesse) em cima à direita, em Tamanho do texto, defines o tamanho da letra. O texto maior também se nota quando exportas uma imagem. - -## Experimenta - -Abre um dos teus exercícios da lição 2 e experimenta o seguinte: - -1. Dá um nome ao diagrama no campo [título](#zeige-titel) por cima do estrutograma, por exemplo \`Olá Mundo\`. -2. [Guarda-o](#zeige-speichern) no teu espaço de trabalho. Vê na coluna [📁 Ficheiros](#zeige-dateien): está na pasta de hoje? -3. Abre um segundo separador com **+** e clica lá no teu programa na coluna Ficheiros. Volta a abrir-se. -4. [Exporta-o](#zeige-exportieren) como **imagem (PNG)** e como **PDF (A4)**. Abre os dois ficheiros e compara-os. - -Correu tudo bem? Então sabes onde estão os teus programas e como os partilhar. - -## Jogo: Como o partilhas? - -::: spiel frage -titel: Jogo: Como o partilhas? -intro: O Ludwig quer partilhar o seu estrutograma. Que formato serve melhor? Seis rondas. -frage: Que formato serve? -antworten: .visustruct | PNG | SVG | PDF - -runde: -frage: Amanhã queres continuar a trabalhar no teu estrutograma. -richtig: .visustruct -> Só o ficheiro .visustruct pode voltar a ser aberto e editado no VisuStruct. - -runde: -frage: O estrutograma deve entrar numa apresentação como imagem. -richtig: PNG -> Uma imagem PNG pode ser posta em qualquer apresentação e em qualquer ficha de trabalho. - -runde: -frage: O teu professor quer imprimir o teu trabalho numa página A4. -richtig: PDF -> O PDF é exatamente uma página A4 para entregar ou imprimir. - -runde: -frage: O estrutograma vai para um cartaz e deve ficar nítido mesmo em tamanho enorme. -richtig: SVG -> Um gráfico vetorial fica nítido em qualquer tamanho. Um PNG fica com pixéis quando o aumentas. - -runde: -frage: A tua amiga deve alterar o estrutograma na app VisuStruct do iPad dela. -richtig: .visustruct -> Todas as versões do VisuStruct abrem o mesmo ficheiro .visustruct: no browser, no Mac, no iPad e no iPhone. - -runde: -frage: Queres enviar depressa uma imagem para um chat. -richtig: PNG -> Um PNG pode ser visto logo por qualquer pessoa, sem VisuStruct. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dar um título a um diagrama. → Experimenta -- Consigo guardar um diagrama como ficheiro .visustruct e voltar a abri-lo. → Guardar e abrir -- Consigo exportar um diagrama como imagem (PNG) ou PDF. → Partilhar: imagem, PDF ou ficheiro -- Consigo abrir um segundo diagrama num novo separador. → Vários diagramas em separadores -- Consigo criar o meu espaço de trabalho \`VisuStruct-Ficheiros\`. → A coluna Ficheiros -- Consigo guardar um programa no meu espaço de trabalho. → A coluna Ficheiros -::: - -## Teste de conhecimentos - -::: quiz -? Que ficheiro podes voltar a abrir na app para Mac e na app Java? -→ Guardar e abrir -- [x] O ficheiro .visustruct -- [ ] A imagem PNG exportada -- [ ] O PDF exportado -> As imagens e os PDF servem só para ver. Só o ficheiro .visustruct pode continuar a ser editado. - -? O navegador memoriza os teus exercícios. Porque deves guardar mesmo assim? -→ Guardar e abrir -- [ ] Porque senão os exercícios não são verificados -- [x] Porque o navegador só guarda os dados neste dispositivo e eles podem perder-se -- [ ] Porque não se pode exportar sem guardar - -? Hoje guardas um programa no teu espaço de trabalho. Onde fica? -→ A coluna Ficheiros -- [ ] Na pasta de transferências -- [x] No espaço de trabalho, dentro de uma pasta com a data de hoje -- [ ] Diretamente no espaço de trabalho, sem subpasta -> O VisuStruct cria automaticamente uma pasta com a data de cada dia. Assim os programas ficam ordenados por aula. -::: -`,Iy=`--- -titel: Variáveis e tipos de dados -bereich: Fundamentos -kurz: Guardar valores, conhecer os tipos de dados int, double, String e boolean, e fazer contas. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar uma variável com tipo de dados, nome e valor -- explicar que o Java distingue maiúsculas de minúsculas (\`numero\` não é \`Numero\`) -- distinguir os tipos de dados int, double, String e boolean -- explicar que = é uma atribuição e não uma comparação -- fazer contas com + - * / % e usar a divisão inteira -- criar e mostrar variáveis em Java -::: - -## O que é uma variável? - -Uma **variável** é como uma caixa com etiqueta. Tem um **nome**, um **tipo de dados** e um **valor**. - -\`\`\` -int idade = 14 -\`\`\` - -Aqui a variável chama-se \`idade\`, o seu tipo de dados é \`int\` (número inteiro) e o seu valor é 14. Mais tarde podes voltar a usar o valor através do nome. - -::: grafik l04-variable.svg -A variável como caixa: o nome na etiqueta, o tipo de dados como autocolante, o valor lá dentro. -::: - -> Os nomes de variáveis começam por uma **letra minúscula** e não têm espaços. Bons nomes dizem o que está lá dentro: \`preco\` é melhor do que \`p\`. Evita acentos e cedilhas nos nomes: escreve \`preco\` e não \`preço\`. - -::: angeberwissen -Em setembro de 1999 perdeu-se a sonda Mars Climate Orbiter. Uma equipa calculava a força de impulso em unidades americanas (libras), a outra esperava unidades métricas (newtons). Nos dados só estava o número, não a unidade. A sonda voou demasiado baixo na atmosfera de Marte e ardeu, um prejuízo de cerca de 125 milhões de dólares. Um nome que diz o que guarda, como \`impulsoEmNewtonSegundos\`, teria evitado a confusão. Já agora, eu escrevo sempre \`fenoEmQuilos\` na minha caixa de feno. -::: - -Se um nome tiver várias palavras, escreves-as juntas e começas cada palavra seguinte com maiúscula: \`precoComIva\`, \`numeroDeAlunos\`. Esta forma de escrever chama-se **camelCase**. - -::: angeberwissen -O camelCase tem este nome porque as maiúsculas no meio saem da palavra como as bossas de um camelo: \`precoComIva\` tem duas bossas. Eu, como bode, tenho zero bossas, mas dois chifres. Infelizmente ainda ninguém inventou a escrita BodeCase. -::: - -::: grafik l04-camelcase.svg -As maiúsculas C e I sobressaem como as duas bossas do camelo. -::: - -## Maiúsculas e minúsculas - -O Java distingue **maiúsculas de minúsculas**. Em inglês diz-se **case-sensitive**. Para o Java, \`numero\`, \`Numero\` e \`NUMERO\` são três nomes diferentes, ou seja, três caixas diferentes: - -\`\`\` -int numero = 4 -int Numero = 6 -\`\`\` - -Aqui há duas variáveis. Se mais tarde escreveres \`NUMERO\`, o Java não encontra nenhuma variável com esse nome. O programa não corre e aparece uma mensagem de erro. - -> Isto também vale para as palavras do Java: \`String\` e \`System\` escrevem-se com maiúscula, \`int\` e \`double\` com minúscula. Nos teus programas, nunca cries duas variáveis que só se distinguem por maiúsculas e minúsculas. Isso confunde-te a ti e a quem lê o teu código. - -## Exercício: Três nomes - -::: übung l04-gross-klein -titel: Três nomes -auftrag: O Ludwig criou duas variáveis: \`numero\` com o valor 4 e \`Numero\` com o valor 6. O estrutograma deve multiplicá-las e mostrar **Resultado: 24**. Mas não corre. - Carrega em “Abrir no editor”, depois em Verificar, e lê a mensagem de erro. Corrige a instrução e carrega outra vez em Verificar. -start: l04-gross-klein-start.visustruct -test: - -> Resultado: 24 -braucht: anweisung -tipp: Quantos nomes diferentes há no estrutograma? \`numero\`, \`Numero\` e \`NUMERO\` são três nomes diferentes para o computador. -tipp: \`NUMERO\` não existe. Para 24 precisas de 4 vezes 6, ou seja, \`numero\` vezes \`Numero\`: \`int resultado = numero * Numero\`. Com \`numero * numero\` dá 16. -lösung: l04-gross-klein-loesung.visustruct -::: - -## Os quatro tipos de dados - -O tipo de dados diz que tipo de valor pode ser guardado na variável. - -- **int:** números inteiros, p. ex. \`int quantidade = 3\` ou \`int temperatura = -5\` -- **double:** números decimais, p. ex. \`double preco = 2.5\`. Escreves um **ponto**, nunca uma vírgula. -- **String:** texto, p. ex. \`String nome = "Inês"\`. O texto fica entre aspas. -- **boolean:** valores lógicos, só \`true\` ou \`false\` - -Há mais tipos de dados. Um deles vais precisar em breve: \`char\` para um **único caractere**, p. ex. \`char nota = 'C'\`. Um \`char\` fica entre aspas **simples**. Vais conhecê-lo melhor na lição 17. - -::: diagramm l05-datentypen.visustruct -Três variáveis com tipos de dados diferentes. Abre o diagrama e inicia a [simulação](#zeige-simulation). -::: - -Os valores lógicos aparecem sobretudo em **condições**: \`idade >= 18\` é \`true\` ou \`false\`. É disso que trata a lição 8. Uma variável do tipo \`boolean\` recebe simplesmente \`true\` ou \`false\`: - -\`\`\` -boolean adulto = false -\`\`\` - -::: angeberwissen -A 4 de junho de 1996, o foguetão Ariane 5 explodiu apenas 37 segundos depois da descolagem. A culpa foi de uma única linha: um número decimal para a velocidade foi metido numa variável inteira demasiado pequena para valores tão grandes. O tipo de dados não é um pormenor, pode custar meio milhar de milhões de euros. -::: - -## Atribuição com = - -O sinal \`=\` chama-se **atribuição**. Não quer dizer “é igual a” como na matemática. Quer dizer: calcula o lado direito e guarda o resultado na variável da esquerda. - -\`\`\` -int pontos = 10 -pontos = pontos + 5 -\`\`\` - -Na matemática, a segunda linha estaria errada, porque nenhum número é igual a si próprio mais 5. Na programação lê-se assim: pega no valor antigo 10, soma 5 e guarda 15 em \`pontos\`. O tipo de dados só se escreve da primeira vez, quando a variável é criada. - -::: grafik l04-zuweisung.svg -Primeiro calcula-se o lado direito, depois o resultado vai para a variável da esquerda. -::: - -## Fazer contas - -Podes fazer contas com números: - -- \`+\` mais, \`-\` menos, \`*\` vezes, \`/\` a dividir por -- \`%\` resto de uma divisão (diz-se “módulo”), p. ex. \`17 % 5\` dá 2 - -A **divisão com resto** conheces da escola primária, quando ainda não sabias números decimais: 17 : 5 = 3 e sobram 2. O 5 cabe três vezes no 17, o que dá 15. Até 17 faltam ainda 2: esse é o resto. O computador calcula com números inteiros exatamente assim: \`/\` dá o resultado sem o resto, \`%\` dá só o resto. - -| Escola primária | com \`/\` | com \`%\` | -|---|---|---| -| 17 : 5 = 3, resto 2 | \`17 / 5\` dá 3 | \`17 % 5\` dá 2 | -| 20 : 5 = 4, resto 0 | \`20 / 5\` dá 4 | \`20 % 5\` dá 0 | -| 3 : 5 = 0, resto 3 | \`3 / 5\` dá 0 | \`3 % 5\` dá 3 | - -Se o resto for 0, a divisão é exata. Mais tarde usas isto para ver se um número é par: nos números pares, \`numero % 2\` dá 0. - -**A multiplicação e a divisão vêm antes da adição e da subtração**, e os parênteses calculam-se primeiro: \`2 * (3 + 4)\` dá 14. - -### Mostrar texto e resultado juntos - -Um resultado sozinho diz pouco. Com \`+\` juntas um texto e o valor de uma variável: - -\`\`\` -int idade = 14 -output: "Idade: " + idade -\`\`\` - -Isto mostra **Idade: 14**. O texto entre aspas aparece tal e qual; em vez de \`idade\` o computador põe o valor. O espaço depois dos dois pontos faz parte do texto, senão aparece \`Idade:14\`. - -## Exercício: Retângulo - -::: übung l05-rechteck -titel: Calcular um retângulo -auftrag: Um retângulo tem 7 de comprimento e 4 de largura. Cria as variáveis \`comprimento\` e \`largura\`. Calcula a área e o perímetro em variáveis próprias e mostra os dois assim: -\`Área: 28\` e na linha seguinte \`Perímetro: 22\`. -test: - -> Área: 28 | Perímetro: 22 -braucht: anweisung -tipp: Pensa primeiro de que variáveis precisas: duas para as medidas e duas para os resultados. São todas números inteiros. -tipp: A área é o comprimento vezes a largura, o perímetro é 2 vezes (comprimento mais largura). Para a saída escreves p. ex. \`output: "Área: " + area\`. O \`+\` junta o texto e o valor da variável. -lösung: l05-rechteck-loesung.visustruct -::: - -## Divisão inteira - -Se dividires dois números inteiros e guardares o resultado numa variável \`int\`, tudo o que vem depois da vírgula desaparece. **Não é arredondado.** - -\`\`\` -int x = 7 / 2 dá 3 -int r = 7 % 2 dá 1 (o resto) -double d = 7.0 / 2 dá 3.5 -\`\`\` - -Com \`/\` e \`%\` juntos podes fazer boas conversões, por exemplo de minutos para horas e minutos: - -::: diagramm l05-division.visustruct -135 minutos são 2 horas (135 / 60) e sobram 15 minutos (135 % 60). -::: - -## Exercício: Converter segundos - -::: übung l05-sekunden -titel: Converter segundos -auftrag: 200 segundos devem ser mostrados em minutos e segundos. A primeira e a última instrução já lá estão. Insere entre elas instruções que calculem \`minutos\` e \`resto\`. -start: l05-sekunden-start.visustruct -test: - -> 3 minutos e 20 segundos -braucht: anweisung -tipp: Quantos minutos inteiros cabem em 200 segundos, e quantos segundos sobram? Calcula primeiro de cabeça. -tipp: Um minuto tem 60 segundos. Usa \`/\` para os minutos inteiros e \`%\` para o resto. As duas variáveis são do tipo \`int\`. -lösung: l05-sekunden-loesung.visustruct -::: - -## Exercício: Compras - -::: übung l05-einkauf -titel: Compras -auftrag: Compras 3 cadernos a 2.5 euros cada. Cria \`quantidade\` como \`int\` e \`preco\` como \`double\`, calcula o preço total numa variável \`precoTotal\` e mostra \`Total: 7.5 euros\`. -test: - -> Total: 7.5 euros -braucht: anweisung -tipp: A quantidade vezes o preço dá o preço total. Para cada variável, pensa se é um número inteiro ou um número decimal. -tipp: O preço total é um número decimal, por isso \`precoTotal\` precisa do tipo \`double\`. -lösung: l05-einkauf-loesung.visustruct -::: - -## Agora em Java - -Um estrutograma é um plano. Em **Java** torna-se um programa que o computador executa. As tuas compras do exercício ficam assim: - -\`\`\`java editor -int quantidade = 3; -double preco = 2.5; -double precoTotal = quantidade * preco; -System.out.println("Total: " + precoTotal + " euros"); -\`\`\` - -- Primeiro o tipo de dados, depois o nome, depois o valor, tal como no bloco. -- Cada instrução termina com um **ponto e vírgula** \`;\`. -- Em Java, uma saída escreve-se \`System.out.println(…)\`. - -Como é que o computador entende o teu código Java e porque é que ele corre igual no Windows, no macOS e no Linux, vais ver na lição “Estrutograma e código”. - -::: angeberwissen -O Java chamava-se primeiro **Oak** (carvalho), por causa da árvore em frente à janela do escritório de James Gosling. A partir de 1991, a sua equipa na Sun Microsystems queria programar pequenos aparelhos, como boxes de televisão. Mas o nome Oak já pertencia a outra empresa. Assim, em 1995 passou a chamar-se **Java**, como o café da ilha de Java. -::: - -## Texto em Java - -As variáveis não guardam só números. Para texto existe o tipo de dados \`String\`: - -\`\`\`java editor -String nome = "Inês"; -int idade = 14; -double altura = 1.62; -System.out.println(nome + " tem " + idade + " anos."); -System.out.println("Altura: " + altura + " m"); -\`\`\` - -- O texto fica entre aspas. -- \`String\` escreve-se com maiúscula, \`int\`, \`double\` e \`boolean\` com minúscula. O Java distingue-os. -- Com \`+\` juntas texto e números. - -Escreves Java na área [Código](#zeige-codelive). O estrutograma constrói-se sozinho enquanto escreves. “Abrir no editor” leva o exemplo para a área Código. Clica aí em “Executar”, depois muda o nome, a idade ou a altura e experimenta outra vez. - -::: übung l04-java-steckbrief -titel: Ficha em Java -bereich: beide -code: java -auftrag: Escreve a ficha do Ludwig, o bode. Cria três variáveis: o nome **Ludwig**, a idade **7** e a altura **1.2**. Depois mostra estas duas linhas: - **Ludwig tem 7 anos.** e **Altura: 1.2 m** - “Abrir no editor” abre também a área Código à direita. Escreve lá o teu código; o estrutograma constrói-se sozinho. Depois clica em Verificar. -test: - -> Ludwig tem 7 anos. | Altura: 1.2 m -braucht: anweisung -tipp: Precisas de uma \`String\`, um \`int\` e um \`double\`. Cada linha termina com ponto e vírgula. -tipp: \`String nome = "Ludwig";\`, \`int idade = 7;\` e \`double altura = 1.2;\`. Juntas a saída com \`+\`: \`System.out.println(nome + " tem " + idade + " anos.");\` -lösung: l04-java-steckbrief-loesung.visustruct -::: - -## Preenche os espaços: tipos de dados - -::: lückentext -titel: Ficha em Java -auftrag: Preenche as palavras que faltam. Por fora está a moldura de que qualquer programa Java precisa num ficheiro próprio. As variáveis ficam lá dentro. -\`\`\`java -[[public]] class Ficha { - public static [[void]] main(String[] args) { - [[int]] idade = 14; - [[double]] altura = 1.62; - [[String]] nome = "Mia"; - [[boolean]] temAnimal = true; - System.out.[[println]](nome + " tem " + idade + " anos."); - } -} -\`\`\` -erklärung: Números inteiros são \`int\`, números decimais \`double\`, textos \`String\` (com S maiúsculo) e valores lógicos \`boolean\`. \`public class\` e \`public static void main\` formam a moldura. Na área Código podes deixá-la de fora, há mais sobre isto na lição “Estrutograma e código”. -::: - -## Encontra o erro: segundos - -::: übung l04-java-fehler -titel: Corrigir os segundos -code: java -auftrag: O programa deve converter 200 segundos em minutos e segundos e mostrar **3 min 20 s**. Mas mostra **20 min 3 s**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l04-java-fehler-start.visustruct -test: - -> 3 min 20 s -braucht: anweisung -tipp: \`/\` divide sem resto, \`%\` dá o resto. Qual dos dois precisas para os minutos e qual para os segundos que sobram? -tipp: Os dois operadores estão trocados: \`int minutos = segundos / 60;\` e \`int resto = segundos % 60;\` -lösung: l04-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l04-java-laeuft-nicht -titel: Corrigir a ficha -code: java -auftrag: O programa deve mostrar **Ludwig tem 7 anos.** Mas não corre, porque há duas palavras mal escritas. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l04-java-laeuft-nicht-start.visustruct -test: - -> Ludwig tem 7 anos. -braucht: anweisung -tipp: O Java distingue maiúsculas de minúsculas. Compara cada palavra da saída com o que foi criado em cima. -tipp: \`System\` escreve-se com S maiúsculo. A variável chama-se \`idade\` com i minúsculo: \`System.out.println(nome + " tem " + idade + " anos.");\` -lösung: l04-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que tipo de dados? - -::: spiel frage -titel: Jogo: Que tipo de dados? -intro: O Ludwig juntou valores. Que tipo de dados serve para cada valor? Oito rondas. -antworten: int | double | String | boolean - -runde: -frage: Que tipo de dados serve para \`17\`? -richtig: int -> Um número inteiro sem ponto decimal é um \`int\`. - -runde: -frage: Que tipo de dados serve para \`3.5\`? -richtig: double -> Números com ponto decimal são \`double\`. - -runde: -frage: Que tipo de dados serve para \`"Olá"\`? -richtig: String -> Texto entre aspas é uma \`String\`. - -runde: -frage: Que tipo de dados serve para \`true\`? -richtig: boolean -> \`true\` e \`false\` são os dois valores lógicos, tipo de dados \`boolean\`. - -runde: -frage: Que tipo de dados serve para \`"17"\`? -richtig: String -> Atenção às aspas! Aqui 17 é um texto com o qual não se pode calcular. - -runde: -frage: Que tipo de dados serve para \`-4\`? -richtig: int -> Os números inteiros negativos também são \`int\`. - -runde: -frage: Que tipo de dados serve para \`0.0\`? -richtig: double -> O ponto torna-o um número decimal, mesmo que a seguir só esteja um 0. - -runde: -frage: Que tipo de dados serve para \`"false"\`? -richtig: String -> Entre aspas, false também é só um texto. O valor lógico não tem aspas. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar uma variável com tipo de dados, nome e valor. → O que é uma variável? -- Consigo explicar que o Java distingue maiúsculas de minúsculas (\`numero\` não é \`Numero\`). → Maiúsculas e minúsculas -- Consigo distinguir os tipos de dados int, double, String e boolean. → Os quatro tipos de dados -- Consigo explicar que = é uma atribuição e não uma comparação. → Atribuição com = -- Consigo fazer contas com + - * / % e usar a divisão inteira. → Fazer contas -- Consigo criar e mostrar variáveis em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que tipo de dados serve para o valor 3.75? -→ Os quatro tipos de dados -- [ ] int -- [x] double -- [ ] String -- [ ] boolean -> Os números decimais são do tipo double. No VisuStruct escrevem-se com ponto. - -? Quantas variáveis criam \`int numero = 1\`, \`int Numero = 2\` e \`int NUMERO = 3\`? -→ Maiúsculas e minúsculas -- [ ] uma -- [ ] duas -- [x] três -> O Java distingue maiúsculas de minúsculas. Os três nomes são diferentes, por isso há três variáveis. - -? Que valor tem x depois de \`int x = 17 / 5\`? -→ Fazer contas -- [ ] 3.4 -- [x] 3 -- [ ] 4 -> Com números inteiros, tudo o que vem depois da vírgula desaparece. Não é arredondado. - -? Quanto dá \`17 % 5\`? -→ Fazer contas -- [x] 2 -- [ ] 3 -- [ ] 3.4 -> 17 a dividir por 5 dá 3, resto 2. O operador % dá o resto. - -? No início, \`int pontos = 10\`. O que fica em pontos depois de \`pontos = pontos * 2\`? -→ Atribuição com = -- [ ] 10 -- [ ] 12 -- [x] 20 -> O lado direito é calculado com o valor antigo 10, e o resultado 20 é guardado em pontos. - -? Que linha cria corretamente um número decimal em Java? -→ Agora em Java -- [ ] double preco = 2,5; -- [x] double preco = 2.5; -- [ ] Double preco = 2.5 -> Os números decimais escrevem-se com ponto, e no fim há um ponto e vírgula. -::: -`,ky=`--- -titel: Sequência -bereich: Fundamentos -kurz: Executar passos um a seguir ao outro, prestar atenção à ordem e trocar valores. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que uma sequência é executada de cima para baixo -- explicar porque é que a ordem dos passos conta -- trocar dois valores com uma variável auxiliar -- escrever uma sequência em Java -::: - -## Passo a passo - -Uma **sequência** é uma série de passos que são executados exatamente uma vez e exatamente por esta ordem. No estrutograma, os blocos ficam simplesmente uns por cima dos outros. - -Cada bloco só começa quando o bloco de cima terminou. Nada é saltado e nada é repetido. - -::: diagramm l05-sequenz.visustruct -Uma sequência de quatro blocos: primeiro \`comprimento\` e \`largura\` recebem os seus valores, depois a área é calculada e, no fim, é apresentada. Cada bloco é executado exatamente uma vez, de cima para baixo. Saída: 15. -::: - -> A sequência é o mais simples dos três blocos básicos. Quase todos os estrutogramas são feitos sobretudo de sequências. - -## A ordem conta - -Quando fazes chá, notas logo se a ordem estiver errada. Com contas é igual, só que é mais difícil de ver. - -::: diagramm l04-rechnen.visustruct -Primeiro duplicar, depois somar 1: o resultado é 7. Se trocares os dois blocos do meio, dá 8. -::: - -A instrução \`numero = numero * 2\` quer dizer: pega no valor de \`numero\`, multiplica-o por 2 e volta a guardar o resultado em \`numero\`. Por isso, o que está em \`numero\` depende do que aconteceu antes. - -::: angeberwissen -Os estrutogramas não são só coisa da escola. Segundo Shneiderman, empresas como a IBM e a Siemens também planeavam os seus programas com eles. Ou seja, aqui estás a aprender coisas de profissionais. Mééé-ravilha! -::: - -## Exercício: Pôr por ordem - -::: übung l04-reihenfolge -titel: Pôr por ordem -auftrag: O diagrama inicial tem os blocos certos, mas pela ordem errada. Move-os de modo que no fim seja mostrado **20**. -start: l04-reihenfolge-start.visustruct -test: - -> 20 -braucht: anweisung -tipp: Lê cada bloco e pergunta-te: de que variável precisa, e onde é que essa variável recebe o seu valor? -tipp: Uma variável tem de ser criada antes de fazeres contas com ela. A saída vem mesmo no fim. Confirma de cabeça: (2 + 3) · 4 = 20. -lösung: l04-reihenfolge-loesung.visustruct -::: - -## Trocar dois valores - -Imagina dois copos: um com sumo, outro com água. Se quiseres trocar o que está lá dentro, precisas de um terceiro copo, vazio. - -Com variáveis é exatamente igual. Se escreveres simplesmente \`a = b\` e depois \`b = a\`, o valor antigo de \`a\` já se perdeu. No fim, as duas variáveis têm o mesmo valor. - -A solução é uma **variável auxiliar** que guarda o valor antigo durante pouco tempo: - -::: grafik l05-tauschen.svg -Três passos com um copo vazio: primeiro o sumo para aux, depois a água para a esquerda, depois o sumo de aux para a direita. -::: - -::: diagramm l04-tauschen.visustruct -Primeiro guarda-se a em aux. Depois a recebe o valor de b, e b recebe o valor guardado em aux. -::: - -## Exercício: Trocar copos - -::: übung l04-glaeser-tauschen -titel: Trocar copos -auftrag: O copo da esquerda tem sumo, o da direita tem água. Troca o conteúdo das variáveis \`esquerda\` e \`direita\` antes de serem mostradas. -Não alteres os dois primeiros blocos. Insere novas instruções entre eles. -start: l04-tauschen-start.visustruct -test: - -> Esquerda: água | Direita: sumo -braucht: anweisung -tipp: Como trocas dois copos cheios na vida real? Precisas de um terceiro copo, vazio. -tipp: Cria uma variável auxiliar com \`String aux = esquerda\`. Depois disso precisas de mais duas atribuições. -lösung: l04-tauschen-loesung.visustruct -::: - -## Agora em Java - -Tal como na lição 4, também podes escrever uma sequência diretamente em Java. A troca de cima fica assim: - -\`\`\`java editor -int a = 5; -int b = 9; -int aux = a; -a = b; -b = aux; -System.out.println("a = " + a); -System.out.println("b = " + b); -\`\`\` - -- Cada bloco passa a ser uma linha. As linhas correm de cima para baixo, tal como os blocos. -- No fim de cada instrução há um **ponto e vírgula** \`;\`. -- Uma saída chama-se \`System.out.println(…)\` em Java. Atenção ao S maiúsculo de \`System\`: o Java distingue maiúsculas de minúsculas. - -Escreves Java na área [Código](#zeige-codelive), à direita do estrutograma. Enquanto escreves, o VisuStruct constrói o estrutograma ao mesmo tempo. Assim vês logo que bloco pertence a que linha. - -::: übung l05-java-kino -titel: Bilhetes de cinema em Java -bereich: beide -code: java -auftrag: Um bilhete de cinema custa 9 euros. Escreve um programa em Java que calcula o preço de 3 bilhetes e mostra **Total: 27**. - “Abrir no editor” abre também a área Código à direita. Escreve lá o teu código; o estrutograma constrói-se sozinho. Depois clica em Verificar. -test: - -> Total: 27 -braucht: anweisung -tipp: Precisas de três variáveis: o preço, a quantidade e o resultado. Cada linha termina com ponto e vírgula. -tipp: \`int preco = 9;\` e \`int quantidade = 3;\` criam as variáveis. \`int total = preco * quantidade;\` calcula, e \`System.out.println("Total: " + total);\` mostra o resultado. -lösung: l05-java-kino-loesung.visustruct -::: - -## Preenche os espaços: trocar os copos - -::: lückentext -titel: Trocar dois valores -auftrag: Os valores de \`a\` e \`b\` devem ser trocados. Preenche as palavras que faltam. -\`\`\`java -int a = 3; -int b = 8; -[[int]] aux = [[a]]; -a = [[b]]; -b = [[aux]]; -System.out.println("a = " + a + ", b = " + b); -\`\`\` -erklärung: Primeiro guardas \`a\` na variável auxiliar, depois \`a\` recebe o valor de \`b\` e, por fim, \`b\` recebe o valor guardado. Saída: **a = 8, b = 3** -::: - -## Encontra o erro: saldo - -::: übung l05-java-fehler -titel: Corrigir o saldo -code: java -auftrag: O cartão da cantina tem 20 euros. Uma refeição custa 7 euros. O programa deve mostrar o saldo **depois** de pagar, ou seja, **Resta: 13**. Mas mostra **Resta: 20**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l05-java-fehler-start.visustruct -test: - -> Resta: 13 -braucht: anweisung -tipp: Todas as linhas estão certas, só a ordem não. Quando é mostrado o saldo e quando se paga? -tipp: Troca as duas últimas linhas: primeiro \`saldo = saldo - preco;\`, depois a saída. -lösung: l05-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l05-java-laeuft-nicht -titel: Dividir uma piza -code: java -auftrag: Uma piza tem 8 fatias e 4 amigos dividem-na. O programa deve mostrar **Cada um recebe 2 fatias.** Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l05-java-laeuft-nicht-start.visustruct -test: - -> Cada um recebe 2 fatias. -braucht: anweisung -tipp: Compara o nome na saída, letra a letra, com o nome criado na terceira linha. -tipp: A variável chama-se \`porPessoa\` com P maiúsculo (camelCase). Escreve-a exatamente assim na saída. -lösung: l05-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Ordenar os blocos - -::: spiel reihenfolge -titel: Jogo: Ordenar os blocos -intro: O Ludwig baralhou os blocos. Põe-nos pela ordem certa. Quatro rondas. - -runde: -frage: No fim deve aparecer **7**. -- \`int numero = 3\` -- \`numero = numero * 2\` -- \`numero = numero + 1\` -- \`output: numero\` -> Primeiro duplicar, depois somar 1: 3 · 2 + 1 = 7. Ao contrário dava (3 + 1) · 2 = 8. - -runde: -frage: No fim deve aparecer **8**. -- \`int numero = 3\` -- \`numero = numero + 1\` -- \`numero = numero * 2\` -- \`output: numero\` -> Os mesmos blocos, outra ordem, outro resultado: (3 + 1) · 2 = 8. - -runde: - int a = 3 - int b = 5 -frage: a e b devem trocar os seus valores. -- \`int aux = a\` -- \`a = b\` -- \`b = aux\` -- \`output: a + " " + b\` -> Primeiro guarda-se a em aux. Senão o valor antigo perde-se assim que a recebe o valor de b. - -runde: -frage: O Ludwig faz chá. -- Encher a chaleira com água -- Ligar a chaleira -- Esperar até a água ferver -- Deitar a água sobre o saquinho de chá -- Deixar o chá em infusão -> Cada passo precisa do anterior. Tal como num estrutograma. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que uma sequência é executada de cima para baixo. → Passo a passo -- Consigo explicar porque é que a ordem dos passos conta. → A ordem conta -- Consigo trocar dois valores com uma variável auxiliar. → Trocar dois valores -- Consigo escrever uma sequência em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas vezes é executado cada bloco de uma sequência? -→ Passo a passo -- [ ] Até uma condição ser falsa -- [x] Exatamente uma vez -- [ ] Nenhuma, se estiver vazio -> Numa sequência nada é repetido e nada é saltado. Para repetir existem os ciclos. - -? No início a = 5 e b = 9. Depois é executado \`a = b\` e a seguir \`b = a\`. O que está nas variáveis no fim? -→ Trocar dois valores -- [ ] a = 9 e b = 5 -- [x] a = 9 e b = 9 -- [ ] a = 5 e b = 5 -> Depois de \`a = b\`, o valor antigo 5 perdeu-se. \`b = a\` só copia o 9 de volta. - -? Porque precisas de uma variável auxiliar para trocar valores? -→ Trocar dois valores -- [x] Para um valor não ser escrito por cima antes de ser preciso -- [ ] Para o estrutograma ficar mais comprido -- [ ] Porque senão não se podem mostrar variáveis - -? O que mostra a sequência \`int x = 4\`, \`x = x + 1\`, \`x = x * 3\`, \`output: x\`? -→ A ordem conta -- [ ] 13 -- [x] 15 -- [ ] 4 -> Primeiro x passa a 5, depois a 15. - -? Com que termina cada instrução em Java? -→ Agora em Java -- [ ] Com um ponto . -- [x] Com um ponto e vírgula ; -- [ ] Com dois pontos : -> Se faltar o ponto e vírgula, o VisuStruct mostra uma indicação por baixo do código. -::: -`,Sy=`--- -titel: Entrada e saída -bereich: Fundamentos -kurz: Pedir valores, mostrar resultados e usar o modelo EPS. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o modelo EPS -- escrever uma entrada com tipo de dados, nome e pergunta -- juntar texto e variáveis numa saída com + -- calcular primeiro um resultado e guardá-lo numa variável, depois mostrar essa variável, p. ex. \`int soma = a + b\`, depois \`output: soma\` -- identificar a entrada, o processamento e a saída numa tarefa -- ler números em Java com o scanner -- escrever comentários com \`//\` e \`/* */\` e usá-los para organizar e explicar o meu código -::: - -## O modelo EPS - -Muitos programas funcionam em três partes: - -1. **Entrada:** O programa pede valores, p. ex. dois números. -2. **Processamento:** Faz contas com os valores. -3. **Saída:** Mostra o resultado. - -As primeiras letras dão **EPS**. Até agora, os valores estavam fixos no estrutograma. Com uma entrada, pode ser usado um valor diferente de cada vez que o estrutograma é executado. - -::: diagramm l06-eva.visustruct -Entrada em cima, processamento ao meio, saída em baixo. Inicia a simulação e experimenta números diferentes. -::: - -## Entrada com input: - -Uma entrada pede um valor enquanto o estrutograma é executado e guarda-o numa variável. Escreves o **tipo de dados**, o **nome** e uma **pergunta** entre aspas: - -\`\`\` -input: int idade "Quantos anos tens?" -input: double preco "Preço em euros?" -input: String nome "Como te chamas?" -\`\`\` - -No editor escolhes o tipo **Entrada** em cima, numa Instrução. A palavra \`input:\` já fica à frente, e só escreves \`int idade "Quantos anos tens?"\`. - -> O tipo de dados decide o que pode ser introduzido. Com \`int\`, a simulação dá erro se alguém escrever 2.5 ou Olá. - -## Saída com output: - -Uma saída mostra texto e valores. O texto fica entre aspas, as variáveis não. Com \`+\` **juntas** as partes: - -\`\`\` -output: "Olá " + nome + "!" -output: "Tens " + idade + " anos." -\`\`\` - -Atenção aos espaços dentro das aspas. Sem eles fica tudo colado, e vês \`OláInês!\` em vez de \`Olá Inês!\`. - -## Exercício: Cumprimento - -::: übung l06-begruessung -titel: Cumprimento -auftrag: Pede um nome e cumprimenta a pessoa. Quando se escreve Ada, deve ser mostrado **Olá Ada!**. -test: Ada -> Olá Ada! -test: Rui -> Olá Rui! -braucht: anweisung -tipp: Primeiro vem uma entrada para o nome, depois uma saída que usa o nome. -tipp: O nome é texto, por isso a entrada precisa do tipo \`String\`. Na saída juntas \`"Olá "\`, a variável e \`"!"\` com \`+\`. -lösung: l06-begruessung-loesung.visustruct -::: - -## Cuidado com o + numa saída - -Numa saída, o \`+\` junta **sempre** as partes, mesmo com números. Se \`a\` for 3 e \`b\` for 4, então - -\`\`\` -output: a + b -\`\`\` - -não mostra 7, mas **34**. Por isso calcula primeiro numa variável e depois mostra a variável: - -\`\`\` -int soma = a + b -output: "Soma: " + soma -\`\`\` - -Isso também encaixa no modelo EPS: calculas na parte do processamento, não na saída. - -## Da tarefa ao estrutograma - -Antes de arrastares o primeiro bloco, lê a tarefa com atenção e desmonta-a. A isto chama-se **análise do problema**. Três perguntas ajudam-te: - -1. **O que é dado?** Esses valores tornam-se a **entrada**. Pensa também no tipo de dados. -2. **O que procuras?** Isso torna-se a **saída**. -3. **Como chegas do que é dado ao que procuras?** Isso é o **processamento**, muitas vezes uma fórmula. - -Um exemplo: *Um bilhete de cinema custa 9 euros. O programa pergunta quantos bilhetes alguém compra e mostra o preço total.* - -- Dado: o número de bilhetes → \`input: int quantidade "Quantos bilhetes?"\` -- Procurado: o preço total → \`output: "Preço total: " + total\` -- Caminho: quantidade vezes 9 → \`int total = quantidade * 9\` - -Agora só tens de pôr as três partes umas por cima das outras, pela ordem E, P, S. - -> Procura palavras-sinal na tarefa: *pergunta*, *lê* ou *introduz* apontam para uma entrada. *Mostra*, *escreve* ou *indica* apontam para uma saída. - -## Exercício: Calculadora - -::: übung l06-rechner -titel: Soma e produto -auftrag: Pede dois números inteiros. Depois mostra a soma e o produto deles, cada um na sua linha. -Com 3 e 4 fica assim: \`Soma: 7\` e \`Produto: 12\`. -test: 3, 4 -> Soma: 7 | Produto: 12 -test: 10, -2 -> Soma: 8 | Produto: -20 -test: 0, 5 -> Soma: 5 | Produto: 0 -braucht: anweisung -tipp: Planeia a ordem: primeiro ler os dois números, depois calcular, depois mostrar. -tipp: Precisas de duas entradas, duas instruções para calcular e duas saídas. Calcula a soma numa variável própria, senão o \`+\` junta os números. -lösung: l06-rechner-loesung.visustruct -::: - -## Exercício: Média - -::: übung l06-mittelwert -titel: Média -auftrag: Pede dois números, que também podem ser números decimais. Mostra a média deles, ou seja, para 2 e 3 é \`Média: 2.5\`. -test: 2, 3 -> Média: 2.5 -test: 4, 6 -> Média: 5.0 -test: 1.5, 2 -> Média: 1.75 -braucht: anweisung -tipp: A média de dois números obtém-se somando-os e dividindo o resultado ao meio. -tipp: Para números decimais usas o tipo \`double\`. A média é a soma a dividir por 2. Não te esqueças dos parênteses: \`(x + y) / 2\`. -lösung: l06-mittelwert-loesung.visustruct -::: - -## Agora em Java - -O exemplo EPS do início fica assim em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Primeiro número?"); -int a = scanner.nextInt(); -System.out.println("Segundo número?"); -int b = scanner.nextInt(); -int soma = a + b; -System.out.println("Soma: " + soma); -\`\`\` - -- Para entradas, o Java precisa de um **Scanner**. Escreves as duas primeiras linhas uma vez lá em cima e depois podes ler quantas vezes quiseres. -- \`scanner.nextInt()\` lê um número inteiro, \`scanner.nextDouble()\` um número decimal e \`scanner.next()\` uma palavra. -- A pergunta ao utilizador é uma saída normal logo antes. O VisuStruct junta as duas linhas num bloco de entrada. - -::: angeberwissen -O Java foi pensado para controlar pequenos aparelhos, e ainda o faz: em muitos cartões SIM de telemóvel e cartões bancários corre uma mini versão chamada **Java Card**. É bem possível que tenhas Java no bolso neste momento. -::: - -::: übung l06-java-tage -titel: Idade em dias -code: java -auftrag: Escreve um programa em Java que pergunta a idade em anos e mostra quantos dias são, mais ou menos. Conta 365 dias por ano. Para 2 anos aparece **São cerca de 730 dias.** -test: 2 -> São cerca de 730 dias. -test: 10 -> São cerca de 3650 dias. -test: 1 -> São cerca de 365 dias. -braucht: anweisung -tipp: Primeiro as duas linhas do scanner, depois a pergunta e a entrada, depois o cálculo, depois a saída. -tipp: \`int anos = scanner.nextInt();\` lê. \`int dias = anos * 365;\` calcula, e \`System.out.println("São cerca de " + dias + " dias.");\` mostra. -lösung: l06-java-tage-loesung.visustruct -::: - -## Comentários no código - -Podes escrever notas no teu código. Chamam-se **comentários** (em inglês *comments*). O Java salta-os ao executar, por isso o programa e o estrutograma ficam iguais. Há dois tipos: - -- \`//\` transforma o resto da linha num comentário. É um **comentário de uma linha**. -- \`/*\` começa um **comentário de várias linhas** e \`*/\` termina-o. Tudo o que está entre os dois faz parte do comentário, seja quantas linhas forem. O Java não precisa dos asteriscos no início das linhas do meio, só ficam arrumados. - -Em programas acabados às vezes também vês \`/** … */\` com dois asteriscos no início. É um **comentário Javadoc**, a partir do qual o Java consegue criar uma descrição do programa. Para ti, chegam \`//\` e \`/* */\`. - -O exemplo EPS com comentários fica assim: - -\`\`\`java editor -/* - * Tarefa: O programa pede dois números - * e mostra a sua soma. - */ -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -// Entrada -System.out.println("Primeiro número?"); -int a = scanner.nextInt(); -System.out.println("Segundo número?"); -int b = scanner.nextInt(); - -// Processamento -int soma = a + b; // somar os dois números - -// Saída -System.out.println("Soma: " + soma); // com 3 e 4 espero: Soma: 7 - -// Da próxima vez: permitir também números decimais -\`\`\` - -Para que servem os comentários: - -- **A tarefa:** o comentário de várias linhas lá em cima diz o que o programa deve fazer. -- **Organização:** \`// Entrada\`, \`// Processamento\` e \`// Saída\` dividem o código segundo o modelo EPS. -- **Explicação:** um comentário depois de uma linha diz o que o teu algoritmo faz ali. -- **Expectativa:** escreve que saída esperas. Ao testar, comparas. -- **Associar chavetas:** mais tarde vais ter blocos entre chavetas \`{ }\`. Aí, p. ex. \`} // fim do for\` mostra que chaveta fecha o quê. -- **Guardar ideias:** de que te tens de lembrar quando continuares da próxima vez? - -Clica em **Abrir no editor**, muda um comentário ou acrescenta um novo. O estrutograma fica igual e o VisuStruct guarda os teus comentários. - -> Não escrevas um comentário depois de cada linha. Explica o que o teu algoritmo faz e porquê, não cada carácter. - -::: angeberwissen -Os dois tipos são muito mais antigos do que o Java: \`/* … */\` vem da linguagem PL/I, de 1964, e \`//\` da BCPL, de 1967. O Java herdou-os através do C e do C++. -::: - -## Preenche os espaços: comentários - -::: lückentext -titel: Completar os comentários -auftrag: Completa os caracteres para que lá em cima fique um comentário de várias linhas com a tarefa e as outras duas notas sejam comentários de uma linha. -\`\`\`java -[[/*]] - * Tarefa: O programa converte euros em cêntimos. - [[*/]] -int euros = 3; -[[//]] Processamento -int centimos = euros * 100; -[[//]] Saída, esperado: 300 -System.out.println(centimos); -\`\`\` -erklärung: \`/*\` abre o comentário de várias linhas e \`*/\` fecha-o. \`//\` só vale até ao fim da linha, por isso cada nota precisa do seu próprio \`//\`. -::: - -## Preenche os espaços: entrada - -::: lückentext -titel: Ler um nome e uma idade -auftrag: Preenche as palavras que faltam para que o programa leia um nome e uma idade. -\`\`\`java -import java.util.[[Scanner]]; -Scanner scanner = [[new]] Scanner(System.[[in]]); - -System.out.println("Como te chamas?"); -[[String]] nome = scanner.[[next]](); -System.out.println("Que idade tens?"); -int idade = scanner.[[nextInt]](); -System.out.println("Olá " + nome + ", para o ano vais ter " + [[(idade + 1)]] + " anos."); -\`\`\` -erklärung: \`scanner.next()\` lê uma palavra, \`scanner.nextInt()\` um número inteiro. Os parênteses à volta de \`idade + 1\` são importantes: sem eles, o Java junta primeiro \`idade\` e depois \`1\` ao texto, e 14 passaria a **141**. -::: - -## Encontra o erro: soma - -::: übung l06-java-fehler -titel: Corrigir a soma -code: java -auftrag: O programa lê dois números e deve mostrar a soma. Mas com 3 e 4 aparece **Soma: 34** em vez de **Soma: 7**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l06-java-fehler-start.visustruct -test: 3, 4 -> Soma: 7 -test: 10, 5 -> Soma: 15 -test: 0, 9 -> Soma: 9 -braucht: anweisung -tipp: Lê a saída da esquerda para a direita: o que dá \`"Soma: " + a\`? E o que acontece quando ainda vem \`+ b\` a seguir? -tipp: Põe parênteses para o Java calcular primeiro: \`System.out.println("Soma: " + (a + b));\` -lösung: l06-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l06-java-laeuft-nicht -titel: Idade no próximo ano -code: java -auftrag: O programa pergunta a tua idade e deve dizer quantos anos terás no próximo ano. Com 14, **No próximo ano tens 15**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l06-java-laeuft-nicht-start.visustruct -test: 14 -> No próximo ano tens 15 -test: 9 -> No próximo ano tens 10 -braucht: anweisung -tipp: A entrada fica guardada numa variável. Como se chama exatamente, e como se chama na saída? -tipp: A variável chama-se \`idade\` com i minúsculo: \`System.out.println("No próximo ano tens " + (idade + 1));\` -lösung: l06-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: O que aparece? - -::: spiel frage -titel: Jogo: O que aparece? -intro: O Ludwig construiu entradas e saídas. Diz antes o que acontece. Sete rondas. - -runde: - int a = 3 - int b = 4 - output: a + b -frage: O que aparece? -- 7 -- [x] 34 -- a + b -> Numa saída, o \`+\` junta sempre as partes, mesmo números. - -runde: - int a = 3 - int b = 4 - int soma = a + b - output: "Soma: " + soma -frage: O que aparece? -- [x] Soma: 7 -- Soma: 34 -- Soma: soma -> O cálculo acontece antes, numa variável. A saída só junta o texto e o resultado. - -runde: - input: String nome "Como te chamas?" - output: "Olá" + nome + "!" -frage: Escreves Mia. O que aparece? -- Olá Mia! -- [x] OláMia! -- Olá nome! -> O texto \`"Olá"\` não tem espaço no fim. Por isso fica tudo colado. - -runde: - input: int idade "Quantos anos tens?" -frage: Escreves 2.5. O que acontece? -- idade fica 2. -- idade fica 2.5. -- [x] A simulação mostra um erro. -> O tipo de dados \`int\` só aceita números inteiros. - -runde: - input: double preco "Preço em euros?" -frage: A que parte do modelo EPS pertence este bloco? -- [x] Entrada -- Processamento -- Saída -> \`input:\` pede um valor. Isso é a entrada. - -runde: - double media = (a + b) / 2.0 -frage: A que parte do modelo EPS pertence este bloco? -- Entrada -- [x] Processamento -- Saída -> Aqui calcula-se alguma coisa. Isso é o processamento. - -runde: - output: "Média: " + media -frage: A que parte do modelo EPS pertence este bloco? -- Entrada -- Processamento -- [x] Saída -> \`output:\` mostra o resultado. Isso é a saída. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o modelo EPS. → O modelo EPS -- Consigo escrever uma entrada com tipo de dados, nome e pergunta. → Entrada com input: -- Consigo juntar texto e variáveis numa saída com +. → Cuidado com o + numa saída -- Consigo calcular primeiro um resultado e guardá-lo numa variável, depois mostrar essa variável, p. ex. \`int soma = a + b\`, depois \`output: soma\`. → Cuidado com o + numa saída -- Consigo identificar a entrada, o processamento e a saída numa tarefa. → Da tarefa ao estrutograma -- Consigo ler números em Java com o scanner. → Agora em Java -- Consigo escrever comentários com \`//\` e \`/* */\` e usá-los para organizar e explicar o meu código. → Comentários no código -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer EPS? -→ O modelo EPS -- [x] Entrada, processamento, saída -- [ ] Entrada, programa, sequência -- [ ] Editar, partilhar, sair -> Muitos programas pedem primeiro valores, processam-nos e depois mostram o resultado. - -? As variáveis a e b têm os valores 3 e 4. O que mostra \`output: a + b\`? -→ Cuidado com o + numa saída -- [ ] 7 -- [x] 34 -- [ ] a + b -> Numa saída, o + junta as partes. Calcula primeiro a soma numa variável. - -? Que entrada serve se for introduzido um preço como 4.99? -→ Entrada com input: -- [ ] input: int preco "Preço?" -- [x] input: double preco "Preço?" -- [ ] input: String "Preço?" -> 4.99 é um número decimal, portanto double. Além disso, cada entrada precisa de um nome de variável. - -? O que mostra \`output: "Idade: " + idade\` se idade tiver o valor 12? -→ Cuidado com o + numa saída -- [x] Idade: 12 -- [ ] "Idade: " + 12 -- [ ] Idade: idade - -? Tarefa: *O programa pede o raio de um círculo e mostra o seu perímetro.* Associa cada parte do texto ao seu lugar no modelo EPS. -→ Da tarefa ao estrutograma -= pede o raio -> Entrada -= perímetro = 2 * 3.14 * raio -> Processamento -= mostra o seu perímetro -> Saída -> O raio é dado, o perímetro é o que procuras. A fórmula liga os dois. - -? O que lê \`scanner.nextInt()\`? -→ Agora em Java -- [x] Um número inteiro -- [ ] Um número decimal -- [ ] Uma frase inteira -> Para números decimais há \`scanner.nextDouble()\`, para uma palavra \`scanner.next()\`. - -? O que faz o Java com um comentário? -→ Comentários no código -- [ ] Mostra-o como texto. -- [x] Salta-o. -- [ ] Indica um erro. -> Os comentários são notas para pessoas. O programa corre exatamente igual com ou sem eles. - -? Onde termina um comentário que começa com \`/*\`? -→ Comentários no código -- [x] Em \`*/\` -- [ ] No fim da linha -- [ ] Na próxima linha vazia -> Por isso um comentário com \`/*\` pode ocupar várias linhas. Já um comentário com \`//\` termina no fim da linha. -::: -`,Ty=`--- -titel: Simulação e teste de secretária -bereich: Fundamentos -kurz: Executar um estrutograma passo a passo, segui-lo à mão e encontrar erros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- iniciar a simulação, fazer pausa, executar passos individuais e pará-la -- ler as variáveis, a saída e o último passo durante a simulação -- fazer um teste de secretária à mão, em forma de tabela -- distinguir erros de sintaxe, erros de execução e erros de lógica -- encontrar um erro comparando os valores com o que espero -- acompanhar código Java com Passo a passo e pontos de paragem -::: - -## Iniciar a simulação - -Antes de chegarem as decisões e os ciclos, vais conhecer a tua ferramenta mais importante. A partir de agora podes usar a simulação para verificar sozinho cada exercício. - -Com o botão [▶︎ Iniciar simulação](#zeige-simulation) à direita nas ferramentas, o VisuStruct executa o teu estrutograma. Enquanto a simulação está a correr, não podes editar o diagrama. O mesmo botão chama-se então **■ Terminar simulação** e leva-te de volta à edição. - -À direita aparecem os **Controlos**: - -- **Reproduzir** executa o diagrama automaticamente, passo a passo. Quanto tempo espera entre dois passos defines em **Pausa por passo**. -- **Pausa** para por um momento. Depois continuas com Reproduzir ou Passo. -- **Passo** executa exatamente um passo. Assim podes observar com calma. -- **Parar** cancela e põe tudo de volta ao início. - -Abre o diagrama seguinte no editor e percorre-o com **Passo**: - -::: diagramm sim-tausch.visustruct -Os valores de a e b são trocados. A variável aux guarda um dos valores entretanto. -::: - -## O que a simulação mostra - -- **Destaque:** Um bloco do diagrama fica colorido. Com **Último passo** é o bloco que acabou de ser executado. Com **Próximo passo** é o bloco que vem a seguir. -- **Entrada:** Se o diagrama pedir um valor, escreves aqui e confirmas com **OK**. -- **Último passo:** Aqui vês o que acabou de acontecer, p. ex. \`a = 5 -> 5\` depois do bloco \`a = b\`. À esquerda, as variáveis já foram substituídas pelos seus valores; à direita da seta está o resultado. -- **Variáveis:** Todas as variáveis com os seus valores atuais. -- **Saída:** Tudo o que foi mostrado com \`output:\`. - -Se a área [Código](#zeige-codelive) estiver aberta à direita, a [consola](#zeige-konsole) também acompanha lá. É limpa no início e depois mostra as saídas e entradas tal como apareceriam no programa real. - -No fim aparece **Simulação terminada.** Se algo correr mal, a simulação para no bloco com erro e mostra uma mensagem, p. ex. **Variável desconhecida: total**. - -## O teste de secretária - -Num **teste de secretária** és tu o computador. Percorres o estrutograma com papel e caneta e anotas os valores das variáveis depois de cada passo. O melhor é fazer uma tabela: uma coluna para o passo, uma para cada variável e uma para a saída. - -::: grafik l07-schreibtischtest-pt.svg -Basta uma folha de papel e uma caneta: depois de cada passo escreves os novos valores numa nova linha. -::: - -Para o diagrama de cima, a tabela fica assim: - -| Passo | a | b | aux | Saída | -|---|---|---|---|---| -| \`int a = 3\` | 3 | – | – | | -| \`int b = 5\` | 3 | 5 | – | | -| \`int aux = a\` | 3 | 5 | 3 | | -| \`a = b\` | 5 | 5 | 3 | | -| \`b = aux\` | 5 | 3 | 3 | | -| \`output: "a = " + a\` | 5 | 3 | 3 | a = 5 | -| \`output: "b = " + b\` | 5 | 3 | 3 | b = 3 | - -Depois compara a tua tabela com a simulação. Os valores em **Variáveis** coincidem com a tua linha depois de cada passo? - -> Um teste de secretária é especialmente útil nos testes escritos. Aí não tens computador, mas mesmo assim podes mostrar o que o teu estrutograma faz. - -::: angeberwissen -Antigamente, “computador” era uma profissão: pessoas que faziam contas com lápis, papel e máquina de calcular. Uma das melhores foi a matemática Katherine Johnson, na NASA. Ela calculava trajetórias de cápsulas espaciais e, mais tarde, também do voo da Apollo 11 até à Lua. - -Em 1962, John Glenn ia ser o primeiro americano a dar a volta à Terra em órbita. A trajetória tinha sido calculada por um novo computador da IBM. Glenn não confiava totalmente na máquina e disse: “Chamem a rapariga para verificar os números. Se ela disser que estão certos, eu vou.” Katherine Johnson refez todas as contas à mão, um verdadeiro teste de secretária. Os números estavam certos, e Glenn voou. - -Katherine Johnson era negra e, nessa altura, no estado norte-americano da Virgínia, havia leis que separavam pessoas negras e brancas. No filme “Elementos Secretos” (2016), ela tem de atravessar o recinto todo a correr sempre que precisa de ir à casa de banho. O filme exagera: as casas de banho separadas existiam mesmo, mas Katherine Johnson contou que simplesmente ignorava a placa. - -A sua colega Dorothy Vaughan percebeu cedo que os computadores da IBM iam ficar com o trabalho de cálculo. Aprendeu sozinha a linguagem de programação FORTRAN e ensinou-a a toda a sua equipa. Foi assim que os computadores humanos passaram a ser programadoras. -::: - -::: bild katherine-johnson.jpg -Katherine Johnson (1918–2020), matemática na NASA (foto: [NASA](https://commons.wikimedia.org/wiki/File:Katherine_Johnson_1983.jpg), domínio público). -::: - -## Três tipos de erros - -Os erros fazem parte da programação, até para profissionais. Há três tipos, e cada um encontra-se de outra maneira: - -- **Erro de sintaxe** (syntax error): O texto não cumpre as regras da linguagem, p. ex. falta um \`;\` no fim. O programa nem sequer arranca. -- **Erro de execução** (runtime error): O programa arranca, mas para num certo ponto, p. ex. ao dividir por 0. -- **Erro de lógica** (logic error): O programa corre até ao fim, mas o resultado está errado, p. ex. porque faltam parênteses: \`a + b / 2\` em vez de \`(a + b) / 2\`. - -É assim que o VisuStruct te mostra os erros: - -- **Erro de sintaxe:** No estrutograma acontecem menos, porque os blocos dão a forma. Na área [Código](#zeige-codelive) o sítio fica sublinhado a vermelho, o número da linha fica vermelho e lês, por exemplo, **Linha 2: Ainda falta aqui: ;**. -- **Erro de execução:** A simulação para no bloco e indica, por exemplo, **Divisão por zero.** Na área Código o número da linha fica vermelho e a [consola](#zeige-konsole) diz a linha: **Linha 3: Divisão por zero.** -- **Erro de lógica:** Aqui ninguém avisa nada. O computador não sabe o que querias. Só tu conheces o resultado certo, por isso aqui ajuda o teste de secretária. - -> Um número de linha vermelho mostra um erro. O ponto vermelho redondo antes do número da linha é outra coisa: um ponto de paragem. Vais conhecê-lo mais abaixo em “Agora em Java”. - -## Encontrar erros - -Se um estrutograma mostrar algo errado, é um erro de lógica. Então faz assim: - -1. **Escreve o que esperas:** O que deve sair para uma determinada entrada? -2. **Executa passo a passo:** Inicia a simulação com **Passo** e observa as variáveis. -3. **Encontra o sítio:** Onde é que um valor fica pela primeira vez diferente do que esperavas? É exatamente aí que está o erro. - -Erros frequentes numa sequência são: - -- A **ordem** está errada: uma variável é usada antes de ter um valor. -- Um valor é **escrito por cima** antes de ser preciso. -- Faltam **parênteses**: \`a + b / 2\` não é o mesmo que \`(a + b) / 2\`. -- São divididos dois números inteiros: \`7 / 2\` dá \`3\`, porque com \`int\` tudo o que vem depois da vírgula desaparece. - -> Mais tarde chegam as decisões e os ciclos. Aí a simulação também te mostra que ramo é seguido e quantas vezes um ciclo é executado. - -::: angeberwissen -A 9 de setembro de 1947, a equipa de Grace Hopper encontrou uma traça verdadeira presa entre dois contactos do computador Harvard Mark II. Colaram-na no diário de bordo e escreveram: “Primeiro caso real de um bug encontrado.” Hoje a traça está num museu em Washington. - -Grace Hopper foi uma das primeiras programadoras do mundo. Em 1952 construiu um dos primeiros **compiladores**: um programa que traduz código para código máquina. Achava que devia ser possível dar ordens aos computadores em inglês quase normal. Daí nasceu a linguagem de programação COBOL, que muitos bancos ainda hoje usam. Na Marinha dos EUA chegou mesmo a almirante. -::: - -::: bild grace-hopper.jpg -Grace Hopper (1906–1992), informática e almirante (foto: [U.S. Navy](https://commons.wikimedia.org/wiki/File:Commodore_Grace_M._Hopper,_USN_(covered).jpg), domínio público). -::: - -## Exercício: Corrigir a troca - -::: übung sim-tausch -titel: Corrigir a troca -auftrag: O estrutograma deve ler dois números e mostrá-los trocados. Ou seja, com 3 e 5 deve aparecer primeiro **5** e depois **3**. Mas mostra 5 duas vezes. - Faz um teste de secretária ou usa **Passo** e corrige o erro. -start: sim-tausch-start.visustruct -test: 3, 5 -> 5 | 3 -test: 1, 2 -> 2 | 1 -test: 7, 7 -> 7 | 7 -braucht: anweisung -tipp: Percorre o diagrama com **Passo** e anota os valores de a e b depois de cada passo. Onde é que o 3 desaparece? -tipp: Olha para a depois do passo \`a = b\`. Para onde foi o valor antigo de a? Guarda-o primeiro numa variável auxiliar, como no exemplo de cima. -lösung: sim-tausch-loesung.visustruct -::: - -## Exercício: Corrigir os bilhetes de cinema - -::: übung sim-kino -titel: Corrigir os bilhetes de cinema -auftrag: Um bilhete de cinema custa 8.50 euros. O estrutograma deve pedir o número de bilhetes e mostrar o preço total, ou seja, para 2 bilhetes \`Total: 17.0\`. - Inicia a simulação. Ela para com uma mensagem de erro. Descobre porquê e corrige o estrutograma. -start: sim-kino-start.visustruct -test: 2 -> Total: 17.0 -test: 3 -> Total: 25.5 -test: 0 -> Total: 0.0 -braucht: anweisung -tipp: Lê com atenção a mensagem de erro da simulação. Que variável é que ela ainda não conhece? -tipp: A simulação executa os blocos de cima para baixo. O total já tem um valor quando chega a saída? Podes mover os blocos com o rato. -lösung: sim-kino-loesung.visustruct -::: - -> Se uma simulação nunca mais acabar, clica em **Parar**. Quando **Verificas** um exercício, o VisuStruct para sozinho depois de um número muito grande de passos. - -## Agora em Java - -Também podes executar código Java passo a passo. Na área [Código](#zeige-codelive), a ferramenta para isso chama-se **depurador** (debugger): - -- Clica num número de linha à esquerda. Aparece um ponto vermelho: é um **ponto de paragem**. [▶︎ Executar](#zeige-ausfuehren) para antes dessa linha. -- O botão [Passo a passo](#zeige-einzelschritt) executa exatamente uma linha, como **Passo** na simulação. -- Por baixo do código vês o valor atual de cada variável. É o teu teste de secretária, só que é o computador que escreve. - -::: übung l07-java-pizza -titel: Corrigir a encomenda de pizzas -code: java -auftrag: Uma pizza custa 8 euros, o queijo extra 2 euros. Para 3 pizzas com queijo extra, o programa deve mostrar **Total: 30**. Mas mostra 14. - Percorre o código Java com Passo a passo e observa \`total\`. Encontra o erro e corrige-o no código. -start: l07-java-pizza-start.visustruct -test: - -> Total: 30 -braucht: anweisung -tipp: Que valor está em \`total\` depois da quarta linha? Faz as contas de cabeça: o que é que o Java calcula primeiro? -tipp: Como na matemática, a multiplicação vem antes da soma: \`preco + queijo * quantidade\` é \`8 + 6\`. Põe parênteses: \`(preco + queijo) * quantidade\`. -lösung: l07-java-pizza-loesung.visustruct -::: - -## Preenche os espaços: teste de secretária - -::: lückentext -titel: O que está nas variáveis? -auftrag: Faz um teste de secretária de cabeça. Escreve depois de cada linha o valor que a variável tem a seguir e, na última linha, o que é mostrado. -\`\`\`java -int a = 5; -int b = 2; -a = a + b; // a vale agora [[7]] -b = a * 2; // b vale agora [[14]] -a = b - a; // a vale agora [[7]] -System.out.println(a + b); // saída: [[21]] -\`\`\` -erklärung: Cada linha calcula com os valores que estão nesse momento nas variáveis: a = 5 + 2 = 7, b = 7 · 2 = 14, a = 14 − 7 = 7, saída 7 + 14 = 21. Podes confirmar com Passo a passo na área Código. -::: - -## Encontra o erro: pontuação - -::: übung l07-java-fehler -titel: Corrigir a pontuação -code: java -auftrag: Num jogo, o Ludwig ganha primeiro 10 pontos, depois 5 pontos e depois perde 3 pontos. No fim deve aparecer **Pontos: 12**. Mas aparece **Pontos: 3**. - Percorre o código com Passo a passo e observa \`pontos\`. Corrige a linha errada e carrega em Verificar. -start: l07-java-fehler-start.visustruct -test: - -> Pontos: 12 -braucht: anweisung -tipp: Depois de que linha é que \`pontos\` passa de repente a valer 3? O que devia acontecer nessa linha? -tipp: O Ludwig perde 3 pontos, por isso tira-se 3 ao valor antigo: \`pontos = pontos - 3;\` -lösung: l07-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l07-java-laeuft-nicht -titel: Corrigir o bónus -code: java -auftrag: O Ludwig tem 10 pontos e recebe 5 pontos de bónus. No fim deve aparecer **Pontos: 15**. Mas o código não corre. Percorre-o também com o passo a passo: em que linha para? - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l07-java-laeuft-nicht-start.visustruct -test: - -> Pontos: 15 -braucht: anweisung -tipp: O Java executa o código de cima para baixo. A variável \`bonus\` já existe quando é usada no cálculo? -tipp: Cria \`bonus\` antes do cálculo: primeiro \`int bonus = 5;\`, depois \`pontos = pontos + bonus;\` -lösung: l07-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa tem **exatamente um erro**, e a bomba está a fazer tique-taque. Faz o teste de secretária de cabeça e toca na linha errada antes de o tempo acabar. Os programas estão em Java, mas cada linha é um bloco como no estrutograma. Seis rondas, 30 segundos cada. -zeit: 30 - -runde: - int a = 3; - int b = 5; - int aux = a; - a = b; - b = a; -frage: Deve trocar os valores de a e b. -fehler: 5 -besser: b = aux; -> a já tem o valor de b. O valor antigo de a está em aux. - -runde: - int a = 4; - int b = 6; - double media = a + b / 2; - System.out.println(media); -frage: Deve mostrar a média 5.0. -fehler: 3 -besser: double media = (a + b) / 2.0; -> Sem parênteses, a divisão vem primeiro: 4 + 6 / 2 = 7. - -runde: - int bilhetes = 3; - double preco = 8.5; - double total = bilhetes + preco; - System.out.println("Total: " + total); -frage: Deve mostrar o preço de 3 bilhetes de cinema a 8,50 € cada. -fehler: 3 -besser: double total = bilhetes * preco; -> Para o preço total multiplica-se, não se soma. - -runde: - int minutos = 135; - int horas = minutos / 60; - int resto = minutos / 60; - System.out.println(horas + " h " + resto + " min"); -frage: Deve mostrar 2 h 15 min. -fehler: 3 -besser: int resto = minutos % 60; -> \`%\` dá o resto de uma divisão. Com \`/\`, resto também ficava com 2. - -runde: - String nome = "Ada"; - System.out.println("Olá " + "nome" + "!"); -frage: Deve mostrar "Olá Ada!". -fehler: 2 -besser: System.out.println("Olá " + nome + "!"); -> Entre aspas, nome é só um texto. A variável não tem aspas. - -runde: - double preco = 100; - preco = preco * 0.1; - System.out.println(preco); -frage: Deve aumentar o preço em 10 %, ou seja, mostrar 110.0. -fehler: 2 -besser: preco = preco + preco * 0.1; -> Vezes 0.1 dá só os 10 %, ou seja, 10.0. Isso ainda tem de ser somado ao preço antigo. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo iniciar a simulação, fazer pausa, executar passos individuais e pará-la. → Iniciar a simulação -- Consigo ler as variáveis, a saída e o último passo durante a simulação. → O que a simulação mostra -- Consigo fazer um teste de secretária à mão, em forma de tabela. → O teste de secretária -- Consigo distinguir erros de sintaxe, erros de execução e erros de lógica. → Três tipos de erros -- Consigo encontrar um erro comparando os valores com o que espero. → Encontrar erros -- Consigo acompanhar código Java com Passo a passo e pontos de paragem. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que botão executa exatamente um passo? -→ Iniciar a simulação -- [ ] Reproduzir -- [x] Passo -- [ ] Parar -> Reproduzir continua automaticamente, Passo executa só um passo. - -? O que anotas depois de cada passo num teste de secretária? -→ O teste de secretária -- [ ] Só a saída no fim -- [x] Os valores atuais de todas as variáveis -- [ ] O código Java gerado -> Assim vês exatamente onde um valor é diferente do que esperavas. - -? Primeiro \`int a = 3\`, depois \`int b = 5\`, depois \`a = b\`. Que valores têm a e b a seguir? -→ O teste de secretária -- [ ] a = 5 e b = 3 -- [x] a = 5 e b = 5 -- [ ] a = 3 e b = 5 -> O valor antigo de a foi escrito por cima. É por isso que precisas de uma variável auxiliar para trocar valores. - -? O campo Último passo mostra \`preco = 4 * 2.5 -> 10.0\`. O que quer isso dizer? -→ O que a simulação mostra -- [ ] A variável preco tem agora o valor 4. -- [x] Foi calculado 4 * 2.5 e o resultado 10.0 foi guardado em preco. -- [ ] A simulação encontrou um erro. - -? A simulação indica **Variável desconhecida: soma**. Qual é uma razão provável? -→ Encontrar erros -- [x] soma é usada antes de lhe ter sido dado um valor. -- [ ] soma é demasiado grande. -- [ ] O estrutograma tem demasiados blocos. - -? O que faz um ponto vermelho antes de um número de linha na área Código? -→ Agora em Java -- [ ] Marca um erro. -- [x] O programa para antes dessa linha. -- [ ] A linha é saltada. -> É um ponto de paragem. Continuas com ▶︎ ou com Passo a passo. -? Associa cada erro ao seu tipo. -→ Três tipos de erros -= Falta o ponto e vírgula no fim da linha. -> Erro de sintaxe -= O programa divide por 0 e para. -> Erro de execução -= A média dá demasiado alta porque faltam parênteses. -> Erro de lógica - -? O programa corre até ao fim sem nenhuma mensagem, mas mostra 12 em vez de 21. Que tipo de erro é? -→ Três tipos de erros -- [ ] Erro de sintaxe -- [ ] Erro de execução -- [x] Erro de lógica -> Não há mensagem, mas o resultado está errado. Um erro destes só se encontra com o que esperas e com o teste de secretária. -::: -`,_y=`--- -titel: Decisão -bereich: Fundamentos -kurz: Usar uma condição para decidir qual de dois ramos é executado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que é executado exatamente um ramo de uma decisão -- usar os operadores de comparação == != < <= > >= -- distinguir == de = -- construir uma decisão com um ramo vazio -- escrever uma decisão com if e else em Java -::: - -## Se, então, senão - -Até agora, todos os blocos eram sempre executados. Mas muitas vezes um programa deve **decidir**: se uma condição se verificar, faz uma coisa, senão faz a outra. - -::: diagramm l07-alter-pruefen.visustruct -Consoante a idade introduzida, aparece uma mensagem ou a outra. Experimenta 17 e 18 na simulação. -::: - -É para isso que serve a **decisão**. A condição fica no triângulo em cima. Por baixo, o estrutograma divide-se em dois ramos: - -- **true** (esquerda): é executado se a condição for verdadeira -- **false** (direita): é executado se a condição for falsa - -É sempre executado **exatamente um** dos dois ramos. Depois, o programa continua por baixo da decisão. - -## Inserir uma decisão - -Arrasta a **Decisão** da área Elementos para o estrutograma. Clica no triângulo e escreve a condição no Inspetor de objetos, p. ex. \`idade >= 18\`. A palavra \`if\` já está à frente. - -Cada ramo começa com um marcador ø. Arrasta instruções para lá. Um ramo também pode ter vários blocos uns por cima dos outros. - -## Operadores de comparação - -Uma condição é normalmente uma **comparação**. O seu resultado é sempre \`true\` ou \`false\`. - -- \`==\` igual, p. ex. \`numero == 0\` -- \`!=\` diferente, p. ex. \`resposta != 42\` -- \`<\` menor, \`<=\` menor ou igual -- \`>\` maior, \`>=\` maior ou igual - -> Não confundas \`==\` com \`=\`. Um só \`=\` é uma atribuição e guarda um valor. Para comparar precisas de dois sinais de igual. - -Com \`%\` verificas se um número é divisível por outro: \`numero % 2 == 0\` é verdadeiro se \`numero\` for par. - -## Exercício: Par ou ímpar - -::: übung l07-gerade -titel: Par ou ímpar -auftrag: Pede um número inteiro. Mostra **par** se for par, senão **ímpar**. -test: 4 -> par -test: 7 -> ímpar -test: 0 -> par -braucht: verzweigung -tipp: Aqui há duas possibilidades, por isso precisas de uma decisão. Como reconheces um número par? -tipp: Um número é par se não sobrar resto quando o divides por 2. A condição é \`numero % 2 == 0\`. -lösung: l07-gerade-loesung.visustruct -::: - -## Exercício: O número maior - -::: übung l07-maximum -titel: O número maior -auftrag: Pede dois números inteiros e mostra só o maior. Se os dois forem iguais, mostra esse número. -test: 3, 8 -> 8 -test: 9, 2 -> 9 -test: 5, 5 -> 5 -braucht: verzweigung -tipp: Uma decisão compara os dois números. Cada ramo tem exatamente uma saída. -tipp: Compara com \`a > b\`. No ramo true mostras \`a\`, no ramo false \`b\`. -lösung: l07-maximum-loesung.visustruct -::: - -## Um ramo vazio - -Às vezes uma coisa só deve acontecer se a condição for verdadeira e, caso contrário, não acontece nada. Então o ramo false fica **vazio**. No estrutograma mostra o marcador **ø**. - -::: diagramm l07-rabatt.visustruct -A partir de 50 euros tens 5 euros de desconto. Caso contrário não acontece nada; o ramo false está vazio. A saída em baixo é executada nos dois casos. -::: - -::: angeberwissen -Uma única decisão esquecida deixou meia Internet em alvoroço em 2014: a falha de segurança **Heartbleed** no OpenSSL, um programa que muitos sites usam para a encriptação. Um computador podia dizer ao servidor: “Devolve-me a palavra *pão*, tem 500 letras.” O servidor não verificava se 500 correspondia ao comprimento real de 3 e devolvia simplesmente 500 caracteres da sua memória. Às vezes lá dentro estavam palavras-passe de outras pessoas. Só faltava um if: se o comprimento indicado for maior do que o real, então não devolver nada. Já agora, isto não tinha nada a ver com chavetas. Mééé, verifica as tuas entradas antes de acreditares nelas. -::: - -## Exercício: Valor absoluto - -::: übung l07-betrag -titel: Valor absoluto de um número -auftrag: Pede um número inteiro. Se for negativo, torna-o positivo. Depois mostra o número. Assim, -5 passa a 5, e 7 fica 7. -Usa uma decisão com um ramo vazio e só **uma** saída por baixo da decisão. -test: -5 -> 5 -test: 7 -> 7 -test: 0 -> 0 -test: -12 -> 12 -braucht: verzweigung -tipp: Só os números negativos têm de ser alterados. O que acontece a um número se o multiplicares por -1? -tipp: A condição é \`numero < 0\`. No ramo true trocas o sinal, p. ex. com \`numero = 0 - numero\`. O ramo false fica vazio. -lösung: l07-betrag-loesung.visustruct -::: - -## Agora em Java - -Esta é a verificação da idade do início desta lição em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Quantos anos tens?"); -int idade = scanner.nextInt(); -if (idade >= 18) { - System.out.println("És maior de idade."); -} else { - System.out.println("Ainda não és maior de idade."); -} -\`\`\` - -- A condição fica depois de \`if\`, entre **parênteses curvos** \`( )\`. -- O ramo true fica entre **chavetas** \`{ }\`, o ramo false vem depois de \`else\`, nas suas próprias chavetas. Depois de uma chaveta não há ponto e vírgula. -- Se o ramo false estiver vazio, deixas simplesmente de fora \`else { }\`. -- O teu programa precisa das duas primeiras linhas uma vez, assim que lê alguma coisa. Depois, \`scanner.nextInt()\` lê um número inteiro. A pergunta antes disso é uma saída normal. - -::: angeberwissen -O Java também tem uma mascote: o **Duke**, um bonequinho preto e branco com um grande nariz vermelho. Foi desenhado pela equipa do Java em 1992 e desde então acena em conferências e t-shirts. O Ludwig acha que um bode teria ficado melhor. -::: - -::: übung l08-java-bestanden -titel: Aprovado em Java -code: java -auftrag: Escreve um programa em Java que pergunta pela pontuação. A partir de 50 pontos mostra **aprovado**, senão **reprovado**. - Escreve o código na área Código e depois clica em Verificar. -test: 50 -> aprovado -test: 49 -> reprovado -test: 100 -> aprovado -test: 0 -> reprovado -braucht: verzweigung -tipp: Começa pelas duas linhas do scanner. Depois perguntas pelos pontos, lês o valor e comparas com \`if\`. -tipp: A condição é \`pontos >= 50\`. Num ramo fica \`System.out.println("aprovado");\` e depois de \`else\` vem \`System.out.println("reprovado");\`. -lösung: l08-java-bestanden-loesung.visustruct -::: - -## Preenche os espaços: par ou ímpar - -::: lückentext -titel: Par ou ímpar -auftrag: Preenche as palavras e os sinais que faltam. O programa deve mostrar se um número é par. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que número?"); -int numero = scanner.nextInt(); -[[if]] (numero [[%]] 2 [[==]] 0) [[{]] - System.out.println("par"); -[[}]] [[else]] { - System.out.println("ímpar"); -} -\`\`\` -erklärung: \`numero % 2\` é o resto da divisão por 2. Se for 0, o número é par. Para comparar precisas de \`==\`, um \`=\` sozinho é uma atribuição. Os dois ramos ficam entre chavetas. -::: - -::: angeberwissen -Se um ramo tiver só uma instrução, o Java até deixa tirar as chavetas. Nós nunca fazemos isso, e é por esta razão: - -\`\`\`java -if (idade >= 18) - System.out.println("És maior de idade."); - System.out.println("Podes ver o filme."); -\`\`\` - -Sem chavetas, só a primeira linha pertence ao if. A segunda é sempre executada, até para quem tem doze anos. A indentação engana, porque o Java não liga aos espaços. - -Foi exatamente um erro destes que estava escondido em iPhones e Macs em 2014, conhecido como **“goto fail”**. Na linguagem C, a linha \`goto fail;\` aparecia por engano duas vezes debaixo de um if sem chavetas. A segunda era sempre executada e saltava a verificação dos certificados de segurança. Numa rede Wi-Fi aberta, um atacante podia, por exemplo, fazer-se passar pelo teu banco. Mééé, as chavetas custam dois caracteres, uma falha de segurança custa muito mais. -::: - -## Encontra o erro: entrada - -::: übung l08-java-fehler -titel: Corrigir a entrada -code: java -auftrag: No jardim zoológico, as crianças com **menos** de 6 anos entram de graça, todos os outros pagam 4 euros. Mas o programa também deixa entrar de graça as crianças de seis anos. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l08-java-fehler-start.visustruct -test: 5 -> Entrada gratuita -test: 6 -> 4 euros -test: 10 -> 4 euros -test: 0 -> Entrada gratuita -braucht: verzweigung -tipp: Experimenta o programa com 6. Que operador de comparação ainda deixa passar o 6? -tipp: “Menos de 6” é \`idade < 6\`. \`<=\` significa “menor ou igual”. -lösung: l08-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l08-java-laeuft-nicht -titel: Filme para maiores de 16 -code: java -auftrag: O filme é para maiores de 16. O Ludwig tem 15, por isso o programa deve mostrar **Não pode entrar**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l08-java-laeuft-nicht-start.visustruct -test: - -> Não pode entrar -braucht: verzweigung -tipp: Olha com atenção para a condição entre parênteses depois de \`if\`. Esta variável existe? -tipp: A variável chama-se \`idade\` com i minúsculo: \`if (idade >= 16) {\` -lösung: l08-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que caminho? - -::: spiel frage -titel: Jogo: Que caminho? -intro: O Ludwig escreveu decisões em Java. Avalia a condição de cabeça e diz o que aparece. Sete rondas. - -runde: - int x = 5; - if (x > 5) { - System.out.println("grande"); - } else { - System.out.println("pequeno"); - } -frage: O que aparece? -- grande -- [x] pequeno -- nada -> 5 > 5 é falso, porque 5 não é maior do que 5. Portanto, o ramo falso. - -runde: - int x = 5; - if (x >= 5) { - System.out.println("grande"); - } else { - System.out.println("pequeno"); - } -frage: O que aparece? -- [x] grande -- pequeno -- grande e pequeno -> \`>=\` quer dizer "maior ou igual". 5 >= 5 é verdadeiro. - -runde: - int numero = 7; - if (numero % 2 == 0) { - System.out.println("par"); - } else { - System.out.println("ímpar"); - } -frage: O que aparece? -- par -- [x] ímpar -- 1 -> 7 % 2 dá resto 1, portanto não 0. O número é ímpar. - -runde: - int x = -4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: O que aparece? -- -4 -- [x] 4 -- nada -> -4 < 0 é verdadeiro, por isso o sinal é invertido. - -runde: - int x = 4; - if (x < 0) { - x = -x; - } - System.out.println(x); -frage: O que aparece? -- -4 -- [x] 4 -- nada -> 4 < 0 é falso. O ramo falso está vazio, o programa continua simplesmente por baixo. - -runde: - int nota = 3; - if (nota != 3) { - System.out.println("diferente"); - } else { - System.out.println("três"); - } -frage: O que aparece? -- diferente -- [x] três -- nada -> \`!=\` quer dizer "diferente de". 3 != 3 é falso. - -runde: - int a = 8; - int b = 12; - if (a > b) { - System.out.println(a); - } else { - System.out.println(b); - } -frage: O que aparece? -- 8 -- [x] 12 -- 20 -> O programa mostra o maior dos dois números. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que é executado exatamente um ramo de uma decisão. → Se, então, senão -- Consigo usar os operadores de comparação == != < <= > >=. → Operadores de comparação -- Consigo distinguir == de =. → Operadores de comparação -- Consigo construir uma decisão com um ramo vazio. → Um ramo vazio -- Consigo escrever uma decisão com if e else em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Que ramo é executado se a condição for falsa? -→ Se, então, senão -- [ ] O ramo true -- [x] O ramo false -- [ ] Os dois ramos -- [ ] Nenhum, o programa termina -> Com false, é executado o ramo da direita. Depois, o programa continua por baixo da decisão. - -? Que condição verifica se idade é exatamente 18? -→ Operadores de comparação -- [ ] idade = 18 -- [x] idade == 18 -- [ ] idade >= 18 -> Um só = é uma atribuição. Para comparar precisas de ==. - -? O que significa ø num ramo? -→ Um ramo vazio -- [x] Neste caso não acontece nada. -- [ ] O programa termina aqui. -- [ ] A condição é falsa. - -? A condição é \`pontos >= 50\`. Para que valor é verdadeira? -→ Operadores de comparação -- [ ] 49 -- [x] 50 -- [ ] 0 -> >= quer dizer maior ou igual. Portanto o 50 está incluído. - -? Nos manuais, a decisão tem muitas vezes outro nome. Qual? -→ Se, então, senão -- [ ] Seleção múltipla -- [x] Instrução condicional -- [ ] Iteração -> As instruções de um ramo só são executadas sob uma condição. Por isso também se chama instrução condicional. - -? Onde fica em Java a condição de uma decisão? -→ Agora em Java -- [x] Entre parênteses curvos logo a seguir a if -- [ ] Entre chavetas depois de else -- [ ] Depois de um ponto e vírgula -> \`if (idade >= 18) { … }\`: os parênteses curvos pertencem à condição, as chavetas ao ramo. -::: -`,Ay=`--- -titel: Combinar condições -bereich: Fundamentos -kurz: Juntar várias condições com e, ou e não, e verificar intervalos de valores. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar quando é que uma combinação com && é verdadeira -- explicar quando é que uma combinação com || é verdadeira -- inverter uma condição com ! -- verificar se um valor está num intervalo como de 1 a 5 -- ler a tabela de verdade de &&, || e ! -- guardar o resultado de uma condição numa variável boolean -- avaliar condições compostas com segurança -- ligar condições em Java com && e || -::: - -## E: && - -Às vezes uma só comparação não chega. Por exemplo, só tens direito a um bilhete jovem se tiveres **pelo menos 12 anos e menos de 18**. - -Com \`&&\` (e) juntas duas condições. O resultado só é \`true\` se **as duas** condições forem verdadeiras. - -::: diagramm l08-jugendticket.visustruct -As duas comparações têm de estar certas. Experimenta 11, 12, 17 e 18 na simulação. -::: - -## Ou: || - -Com \`||\` (ou), o resultado é \`true\` se **pelo menos uma** das condições for verdadeira. Também podem ser as duas. - -\`\`\` -dia == 6 || dia == 7 -\`\`\` - -Esta condição é verdadeira se \`dia\` tiver o valor 6 ou o valor 7, ou seja, ao sábado ou ao domingo. - -> Num teclado português, a barra vertical \`|\` escreve-se com Shift e a tecla à esquerda do 1. - -## Exercício: Fim de semana - -::: übung l08-wochenende -titel: Fim de semana -auftrag: Pede um dia da semana como número (1 é segunda-feira, 7 é domingo). Mostra **Fim de semana** se for sábado ou domingo, senão **Dia útil**. -test: 6 -> Fim de semana -test: 7 -> Fim de semana -test: 1 -> Dia útil -test: 5 -> Dia útil -braucht: verzweigung -tipp: É fim de semana se o dia for 6 **ou** 7. Para isso precisas de duas comparações numa só condição. -tipp: Sábado é 6, domingo é 7. Junta as duas comparações com \`||\`. -lösung: l08-wochenende-loesung.visustruct -::: - -## Verificar intervalos de valores - -No ensino básico em Portugal, as notas vão de 1 a 5 (5 é a melhor). Verificas se uma nota está **dentro do intervalo** com duas comparações e \`&&\`: - -\`\`\` -nota >= 1 && nota <= 5 -\`\`\` - -::: grafik l08-zahlenstrahl.svg -O intervalo verde de 1 a 5 é válido; as duas pontas estão incluídas. -::: - -Ao contrário, uma nota está **fora** do intervalo se for demasiado pequena **ou** demasiado grande: - -::: diagramm l08-note.visustruct -Não há notas menores do que 1 nem maiores do que 5. -::: - -> A forma como se escreve na matemática, \`1 <= nota <= 5\`, não funciona. Tens de a dividir em duas comparações e juntá-las com \`&&\`. - -## Exercício: Nota válida - -::: übung l08-note-gueltig -titel: Nota válida -auftrag: Pede uma nota como número inteiro. Mostra **válida** se estiver entre 1 e 5 (1 e 5 incluídos), senão **inválida**. -test: 1 -> válida -test: 5 -> válida -test: 3 -> válida -test: 0 -> inválida -test: 6 -> inválida -braucht: verzweigung -tipp: Uma nota válida tem de cumprir duas coisas ao mesmo tempo: não ser demasiado pequena **e** não ser demasiado grande. -tipp: A nota tem de ser maior ou igual a 1 e, ao mesmo tempo, menor ou igual a 5. -lösung: l08-gueltig-loesung.visustruct -::: - -## Não e parênteses - -Com \`!\` (não) inverte-se uma condição: \`true\` passa a \`false\` e vice-versa. - -\`\`\` -!(nota >= 1 && nota <= 5) -\`\`\` - -Isto é verdadeiro se a nota **não** estiver no intervalo, e quer dizer o mesmo que \`nota < 1 || nota > 5\`. - -Se \`&&\` e \`||\` aparecerem juntos, o \`&&\` é calculado primeiro, tal como a multiplicação antes da adição. É melhor usar **parênteses**; assim fica claro o que pertence ao quê: - -\`\`\` -(idade >= 12 && idade < 18) || estudante == 1 -\`\`\` - -## A tabela de verdade - -Uma **tabela de verdade** mostra de relance o que resulta de \`&&\`, \`||\` e \`!\`. À esquerda estão as quatro possibilidades para duas condições \`a\` e \`b\`, à direita o resultado: - -::: grafik l09-wahrheitstabelle.svg -Verde é true, vermelho é false. Com && só há uma linha verde, com || só uma vermelha. -::: - -Para fixar: - -- \`a && b\` só é verdadeiro se **ambas** forem verdadeiras. -- \`a || b\` só é falso se **ambas** forem falsas. -- \`!a\` inverte o valor. - -::: angeberwissen -O tipo de dados \`boolean\` tem o nome de **George Boole**. Este inglês mostrou já em 1847 que se pode calcular com verdadeiro e falso como com números, quase cem anos antes de existir o primeiro computador. Hoje a sua lógica está em todos os chips. -::: - -## Valores lógicos em variáveis - -O resultado de uma condição é um **valor lógico** do tipo \`boolean\`. Podes guardá-lo numa variável, tal como um número, e usá-lo mais tarde: - -\`\`\` -boolean fimDeSemana = dia == 6 || dia == 7 -\`\`\` - -Na decisão fica então só \`fimDeSemana\`. Lê-se quase como uma frase: "Se for fim de semana, então …". Não escrevas \`fimDeSemana == true\`, porque \`fimDeSemana\` já é true ou false. - -Com \`!fimDeSemana\` perguntas pelo contrário, ou seja, um dia útil. - -::: ludwig -Condições longas ficam mais claras se puseres partes delas em variáveis boolean com nomes claros, por exemplo \`boolean jovem = idade >= 12 && idade < 18\`. -::: - -## Jogo: Verdadeiro ou falso? - -Agora é a tua vez. Calcula cada condição de cabeça. Depois de cada resposta vês como o VisuStruct a avalia passo a passo. - -::: spiel -idade: 8..20 -dia: 1..7 -nota: 0..6 -estudante: boolean -fimDeSemana: boolean -? idade >= 18 -? dia == 6 -? nota != 3 -? idade >= 12 && idade < 18 -? dia == 6 || dia == 7 -? estudante && fimDeSemana -? !estudante -? nota >= 1 && nota <= 5 -? !(idade < 18) -? estudante || idade >= 18 -? (idade >= 12 && idade < 18) || estudante -? !(nota >= 1 && nota <= 5) -? !fimDeSemana && dia != 3 -? idade >= 12 && idade < 18 && !estudante -::: - -## Exercício: Ano bissexto - -::: übung l08-schaltjahr -titel: Ano bissexto -auftrag: Um ano é bissexto se for divisível por 4, mas não por 100. Os anos divisíveis por 400 são bissextos de qualquer forma. -Pede um ano e mostra **Ano bissexto** ou **Não é ano bissexto**. -test: 2024 -> Ano bissexto -test: 2023 -> Não é ano bissexto -test: 1900 -> Não é ano bissexto -test: 2000 -> Ano bissexto -braucht: verzweigung -tipp: Confirma primeiro a regra com exemplos: 2024 é bissexto, 1900 não é, 2000 é. “Divisível” quer dizer que o resto é 0. -tipp: Divisível por 4 é \`ano % 4 == 0\`, não divisível por 100 é \`ano % 100 != 0\`. Junta estas duas com \`&&\`, põe parênteses à volta e acrescenta o caso do 400 com \`||\`. -tipp: Quase a solução: uma única decisão com a condição \`(ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0\`. No ramo true fica \`output: "Ano bissexto"\`, no ramo false \`output: "Não é ano bissexto"\`. -lösung: l08-schaltjahr-loesung.visustruct -::: - -## Agora em Java - -O bilhete jovem do início fica assim em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Quantos anos tens?"); -int idade = scanner.nextInt(); -if (idade >= 12 && idade < 18) { - System.out.println("Bilhete jovem"); -} else { - System.out.println("Sem bilhete jovem"); -} -\`\`\` - -Os sinais \`&&\`, \`||\` e \`!\` são exatamente os que já usas no estrutograma. Vêm do Java. Como sempre, a condição inteira fica entre os parênteses curvos depois de \`if\`. - -::: übung l09-java-schule -titel: Escola ou tempo livre -code: java -auftrag: Escreve um programa em Java que pergunta a hora (0 a 23). Das 8 até às 15, inclusive, mostra **Escola**, senão **Tempo livre**. -test: 8 -> Escola -test: 15 -> Escola -test: 16 -> Tempo livre -test: 7 -> Tempo livre -braucht: verzweigung -tipp: A hora tem de cumprir duas condições ao mesmo tempo. Que operador quer dizer “e”? -tipp: \`if (hora >= 8 && hora <= 15) { … } else { … }\` -lösung: l09-java-schule-loesung.visustruct -::: - -## Preenche os espaços: condições - -::: lückentext -titel: Nota e fim de semana -auftrag: Preenche os operadores e as palavras que faltam. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que nota?"); -int nota = scanner.nextInt(); -if (nota >= 1 [[&&]] nota [[<=]] 5) { - System.out.println("nota válida"); -} else { - System.out.println("nota inválida"); -} -System.out.println("Que dia (1 a 7)?"); -int dia = scanner.nextInt(); -[[boolean]] fimDeSemana = dia == 6 [[||]] dia == 7; -if ([[!]]fimDeSemana) { - System.out.println("dia de escola"); -} -\`\`\` -erklärung: Uma nota é válida quando **as duas** condições são verdadeiras, por isso \`&&\`. É fim de semana quando **uma** das duas é verdadeira, por isso \`||\`. O resultado cabe numa variável \`boolean\`, e \`!\` inverte-o. -::: - -## Encontra o erro: sem escola - -::: übung l09-java-fehler -titel: Corrigir o dia sem escola -code: java -auftrag: O programa deve mostrar **sem escola** para o dia 6 (sábado) e o dia 7 (domingo), e **escola** nos outros dias. Mas mostra sempre **escola**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l09-java-fehler-start.visustruct -test: 6 -> sem escola -test: 7 -> sem escola -test: 3 -> escola -test: 1 -> escola -braucht: verzweigung -tipp: \`dia\` pode ser 6 **e** 7 ao mesmo tempo? -tipp: Basta que uma das duas condições seja verdadeira: \`dia == 6 || dia == 7\`. -lösung: l09-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l09-java-laeuft-nicht -titel: Corrigir o fim de semana -code: java -auftrag: O dia 6 é sábado, o dia 7 é domingo. Hoje é o dia 7, por isso deve aparecer **sem escola**. Mas o programa não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l09-java-laeuft-nicht-start.visustruct -test: - -> sem escola -braucht: verzweigung -tipp: A condição tem duas partes. Compara o nome da variável nas duas partes. -tipp: Também na segunda parte a variável chama-se \`dia\` com d minúsculo: \`if (dia == 6 || dia == 7) {\` -lösung: l09-java-laeuft-nicht-loesung.visustruct -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar quando é que uma combinação com && é verdadeira. → E: && -- Consigo explicar quando é que uma combinação com || é verdadeira. → Ou: || -- Consigo inverter uma condição com !. → Não e parênteses -- Consigo verificar se um valor está num intervalo como de 1 a 5. → Verificar intervalos de valores -- Consigo ler a tabela de verdade de &&, || e !. → A tabela de verdade -- Consigo guardar o resultado de uma condição numa variável boolean. → Valores lógicos em variáveis -- Consigo avaliar condições compostas com segurança (pelo menos 8 de 10 certas no jogo). → Jogo: Verdadeiro ou falso? -- Consigo ligar condições em Java com && e ||. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quando é que \`a && b\` é verdadeiro? -→ E: && -- [ ] Se a ou b for verdadeiro -- [x] Só se a e b forem ambos verdadeiros -- [ ] Se exatamente um deles for verdadeiro -> Com && as duas partes têm de estar certas. Se uma for falsa, o todo é falso. - -? A variável dia tem o valor 6. Quanto dá \`dia == 6 || dia == 7\`? -→ Ou: || -- [x] true -- [ ] false -> Com || basta que um dos lados seja verdadeiro. - -? Que condição verifica se numero está entre 10 e 20 (ambos incluídos)? -→ Verificar intervalos de valores -- [ ] 10 <= numero <= 20 -- [ ] numero >= 10 || numero <= 20 -- [x] numero >= 10 && numero <= 20 -> Com || todos os números seriam permitidos, porque qualquer número é maior do que 10 ou menor do que 20. - -? Quanto dá \`!(5 > 3)\`? -→ Não e parênteses -- [ ] true -- [x] false -> 5 > 3 é verdadeiro, e o ! inverte isso. - -? Como escreves em Java “idade é pelo menos 12 e menor do que 18”? -→ Agora em Java -- [ ] if (12 <= idade < 18) -- [x] if (idade >= 12 && idade < 18) -- [ ] if (idade >= 12 || idade < 18) -> Cada comparação fica sozinha, ligada com \`&&\`. -::: -`,jy=`--- -titel: Seleção -bereich: Fundamentos -kurz: Executar um de vários casos, consoante o valor de uma variável. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- inserir uma seleção, acrescentar casos e alterar os nomes dos casos -- explicar quando é executado o caso default -- decidir se serve melhor uma seleção ou uma decisão -- escrever uma seleção múltipla em Java com switch -::: - -## Muitas possibilidades, uma variável - -Uma máquina de bebidas tem três botões: 1 para água, 2 para sumo, 3 para chocolate quente. Com decisões precisas de três blocos encaixados uns nos outros. Isso fica depressa largo e confuso. - -::: diagramm l09-verschachtelt.visustruct -A máquina com três decisões encaixadas. Cada decisão volta a verificar a mesma variável escolha. -::: - -Sempre que comparas **uma variável** com **vários valores fixos**, há uma forma mais simples: a **seleção**. - -## Como se constrói uma seleção - -Em cima, no bloco, está a variável que decide. Por baixo há uma coluna própria para cada caso. Por cima de cada coluna está o valor a que ela pertence. - -::: diagramm l09-automat.visustruct -A mesma máquina como seleção. Se escolha tiver o valor 2, só é executada a coluna 2. -::: - -- A simulação procura o caso cujo nome corresponde exatamente ao valor. -- Se nenhum caso corresponder, é executado o **default**. Este caso fica sempre na ponta da direita. -- Depois, o programa continua por baixo da seleção. Só é executado **um** caso. - -> Uma seleção nova tem os casos 1, 2 e default. Clica num caso para alterar o seu **Nome do caso** no Inspetor de objetos. Com **Adicionar caso** ganhas uma nova coluna antes do default. - -## Casos com texto - -Os casos não têm de ser números. Também podes escolher pelo conteúdo de uma variável \`String\`. Então escreves o texto entre aspas como nome do caso, por exemplo \`"vermelho"\`. Tal como no código, isto mostra que é um texto. - -::: diagramm l09-ampel.visustruct -Um semáforo: consoante a cor introduzida, aparece uma mensagem diferente. Na simulação, experimenta também uma cor que não existe. -::: - -Maiúsculas e minúsculas contam: \`Vermelho\` não corresponde ao caso \`"vermelho"\`. - -## Exercício: Nota por extenso - -::: übung l09-note -titel: Nota por extenso -auftrag: Pede uma nota como número inteiro e mostra-a por extenso: 1 muito insuficiente, 2 insuficiente, 3 suficiente, 4 bom, 5 muito bom. - Para qualquer outro número deve aparecer **Nota inválida**. -test: 5 -> muito bom -test: 3 -> suficiente -test: 1 -> muito insuficiente -test: 9 -> Nota inválida -braucht: fallauswahl -tipp: Para muitos valores fixos, uma seleção é mais clara do que muitas decisões. Cada nota tem um caso próprio. -tipp: Usa “Adicionar caso” até teres os casos 1 a 5 e default. Em cima, na seleção, escreves \`nota\`. -lösung: l09-note-loesung.visustruct -::: - -## Exercício: Calculadora - -::: übung l09-rechner -titel: Calculadora -auftrag: Pede, um a seguir ao outro, um número inteiro \`a\`, um operador como \`String\` e um segundo número inteiro \`b\`. - Para \`+\`, \`-\` e \`*\` mostras o resultado. Para qualquer outro sinal aparece **Operador desconhecido**. -test: 3, +, 4 -> 7 -test: 10, -, 4 -> 6 -test: 6, *, 7 -> 42 -test: 1, x, 2 -> Operador desconhecido -braucht: fallauswahl -tipp: Primeiro lê os três valores. Depois, uma seleção sobre o operador decide o que é calculado. -tipp: Antes da seleção, cria \`int resultado = 0\`. Em cada caso calculas, por exemplo, \`resultado = a + b\` e depois mostras \`resultado\`. Os nomes dos casos são \`"+"\`, \`"-"\` e \`"*"\` entre aspas, porque o operador é uma \`String\`. -tipp: O esqueleto de cima para baixo: três entradas (\`int a\`, \`String operador\`, \`int b\`), depois \`int resultado = 0\`, depois uma seleção múltipla sobre \`operador\`. No caso \`"+"\` ficam \`resultado = a + b\` e \`output: resultado\`, em \`"-"\` e \`"*"\` igual. No caso senão fica \`output: "Operador desconhecido"\`. -lösung: l09-rechner-loesung.visustruct -::: - -## Seleção ou decisão? - -A seleção só verifica se um valor é **exatamente igual** a um nome de caso. Portanto: - -- **Seleção:** uma variável, vários valores fixos. Exemplos: escolher num menu, dia da semana como número, notas. -- **Decisão:** intervalos e condições combinadas. Exemplos: \`idade >= 18\`, \`temperatura < 0 || temperatura > 30\`. - -Por isso, para “idade 18 ou mais” continuas a precisar da decisão. Não podes criar um caso próprio para cada idade possível. - -## Agora em Java - -A máquina de bebidas fica assim em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("1 água, 2 sumo, 3 chocolate quente"); -int escolha = scanner.nextInt(); -switch (escolha) { - case 1 -> { - System.out.println("Aqui está a tua água."); - } - case 2 -> { - System.out.println("Aqui está o teu sumo."); - } - case 3 -> { - System.out.println("Aqui está o teu chocolate quente."); - } - default -> { - System.out.println("Este botão não existe."); - } -} -\`\`\` - -- Depois de \`switch\`, a variável que é comparada fica entre parênteses curvos. -- Cada caso começa com \`case\`, o valor e uma seta \`->\`. Depois, entre chavetas, fica o que deve acontecer. -- \`default\` é o caso “senão”. Corre quando nenhum valor serve. - -::: angeberwissen -A seta \`case 1 ->\` só existe em Java desde 2020 (Java 14). Antes escrevia-se \`case 1:\` e era preciso terminar cada caso com \`break;\`. Quem se esquecia, continuava simplesmente para o caso seguinte. A seta poupou muitos problemas a muitos programadores. -::: - -::: übung l10-java-wuerfel -titel: Dado por extenso -code: java -auftrag: Escreve um programa em Java com \`switch\` que lê um número. Para 1 mostra **um**, para 2 **dois**, para 3 **três** e senão **não conheço**. -test: 1 -> um -test: 2 -> dois -test: 3 -> três -test: 7 -> não conheço -braucht: fallauswahl -tipp: Precisas de três casos \`case\` e um caso \`default\`. -tipp: \`switch (numero) { case 1 -> { System.out.println("um"); } … default -> { System.out.println("não conheço"); } }\` -lösung: l10-java-wuerfel-loesung.visustruct -::: - -## Preenche os espaços: switch - -::: lückentext -titel: Meses por extenso -auftrag: Preenche as palavras e os sinais que faltam na seleção múltipla. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que mês (1 a 3)?"); -int mes = scanner.nextInt(); -[[switch]] (mes) { - [[case]] 1 -> { - System.out.println("janeiro"); - } - case 2 [[->]] { - System.out.println("fevereiro"); - } - [[case]] 3 -> { - System.out.println("março"); - } - [[default]] -> { - System.out.println("Não conheço"); - } -} -\`\`\` -erklärung: Depois de \`switch\` vem a variável entre parênteses. Cada caso começa com \`case\`, o valor e a seta \`->\`. \`default\` é executado quando nenhum caso serve. -::: - -## Encontra o erro: calculadora - -::: übung l10-java-fehler -titel: Corrigir a calculadora -code: java -auftrag: A calculadora lê dois números e uma opção: 1 mais, 2 menos, 3 vezes. Com 7, 3 e a opção 2 devia dar **4**, mas dá **-4**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l10-java-fehler-start.visustruct -test: 7, 3, 2 -> 4 -test: 7, 3, 1 -> 10 -test: 7, 3, 3 -> 21 -test: 7, 3, 5 -> Não existe -test: 10, 4, 2 -> 6 -braucht: fallauswahl -tipp: Mais e vezes estão certos. Olha com atenção para o \`case 2\`. -tipp: No menos, a ordem conta: \`a - b\` em vez de \`b - a\`. -lösung: l10-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l10-java-laeuft-nicht -titel: Corrigir a nota -code: java -auftrag: O Ludwig teve nota 2. O programa deve mostrar **bom**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l10-java-laeuft-nicht-start.visustruct -test: - -> bom -braucht: fallauswahl -tipp: Que variável verifica a seleção múltipla? Está escrita da mesma forma em cima? -tipp: Entre parênteses depois de \`switch\` tem de estar \`nota\` com n minúsculo: \`switch (nota) {\` -lösung: l10-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que caso? - -::: spiel frage -titel: Jogo: Que caso? -intro: O Ludwig carrega em botões da máquina de bebidas e de outras seleções. O que acontece? Seis rondas. - -runde: - int escolha = 2; - switch (escolha) { - case 1 -> { System.out.println("água"); } - case 2 -> { System.out.println("sumo"); } - case 3 -> { System.out.println("chocolate quente"); } - default -> { System.out.println("Esse botão não existe."); } - } -frage: O que aparece? -- água -- [x] sumo -- Esse botão não existe. -> escolha é 2, por isso corre exatamente o \`case 2\`. - -runde: - int escolha = 4; - switch (escolha) { - case 1 -> { System.out.println("água"); } - case 2 -> { System.out.println("sumo"); } - case 3 -> { System.out.println("chocolate quente"); } - default -> { System.out.println("Esse botão não existe."); } - } -frage: O que aparece? -- chocolate quente -- nada -- [x] Esse botão não existe. -> Nenhum caso serve para 4, por isso corre o \`default\`. - -runde: - String dia = "segunda"; - switch (dia) { - case "Segunda" -> { System.out.println("Matemática"); } - case "Terça" -> { System.out.println("Educação Física"); } - default -> { System.out.println("livre"); } - } -frage: O que aparece? -- Matemática -- Educação Física -- [x] livre -> Nos textos conta cada letra: "segunda" com s minúsculo não é "Segunda". - -runde: - int nota = 0; - switch (nota) { - case 1 -> { System.out.println("muito bom"); } - case 2 -> { System.out.println("bom"); } - case 3 -> { System.out.println("suficiente"); } - } -frage: O que aparece? -- muito bom -- [x] nada -- suficiente -> Nenhum caso serve e não há \`default\`. Então simplesmente não acontece nada. - -runde: -frage: Queres verificar se \`idade >= 18\`. O que serve melhor? -- [x] uma decisão -- uma seleção -> Uma seleção só compara com valores fixos. Para "maior ou igual" precisas de uma decisão. - -runde: -frage: Um dado mostra de 1 a 6, e para cada número deve aparecer uma palavra diferente. O que serve melhor? -- uma decisão -- [x] uma seleção -> Uma variável, seis valores fixos: é exatamente para isso que serve a seleção. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo inserir uma seleção, acrescentar casos e alterar os nomes dos casos. → Como se constrói uma seleção -- Consigo explicar quando é executado o caso default. → Como se constrói uma seleção -- Consigo decidir se serve melhor uma seleção ou uma decisão. → Seleção ou decisão? -- Consigo escrever uma seleção múltipla em Java com switch. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? A variável dia tem o valor 5. Existem os casos 1, 2, 3 e default. O que é executado? -→ Como se constrói uma seleção -- [ ] Nada -- [ ] O caso 3 -- [x] O caso default -> Nenhum nome de caso corresponde a 5, por isso aplica-se o default. - -? Quantos casos são executados de cada vez que a seleção é executada? -→ Como se constrói uma seleção -- [x] Exatamente um -- [ ] Todos os casos a partir do que corresponde -- [ ] Todos os casos -> Depois do caso que corresponde, o programa continua logo por baixo da seleção. - -? Para que é que uma seleção NÃO serve? -→ Seleção ou decisão? -- [ ] Escolher a opção 1, 2 ou 3 de um menu -- [x] Verificar se uma temperatura está acima dos 30 graus -- [ ] Tratar uma cor como vermelho, amarelo ou verde -> “Acima dos 30” é um intervalo. Para isso precisas de uma decisão com uma comparação. - -? No semáforo escreves \`Vermelho\`, e o caso chama-se \`"vermelho"\`. O que acontece? -→ Como se constrói uma seleção -- [ ] É executado o caso \`"vermelho"\`. -- [x] É executado o caso default. -- [ ] A simulação indica um erro. -> Maiúsculas e minúsculas contam. Vermelho e vermelho são textos diferentes. - -? Com que nome também encontras a seleção nos manuais? -→ Como se constrói uma seleção -- [ ] Instrução condicional -- [ ] Sequência -- [x] Seleção múltipla -> É escolhido um de muitos casos. Por isso também se chama seleção múltipla. - -? Como se chama em Java o caso “senão” de um switch? -→ Agora em Java -- [ ] else -- [x] default -- [ ] case 0 -::: -`,Cy=`--- -titel: Ciclo while -bereich: Fundamentos -kurz: Repetir passos enquanto uma condição for verdadeira. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que o ciclo while verifica a sua condição antes de cada iteração -- usar uma variável contadora com valor inicial, condição e alteração -- notar quando um ciclo nunca acaba e corrigir o erro -- seguir um ciclo iteração a iteração num teste de secretária -- escrever um ciclo while em Java -::: - -## Repetir enquanto algo se verificar - -Muitas vezes um programa deve fazer uma coisa várias vezes. Em vez de escreveres o mesmo bloco cinco vezes, usas um **ciclo**. - -O **ciclo while** repete o seu interior **enquanto** a sua condição for verdadeira. A condição fica em cima, na cabeça do bloco. O interior fica recuado por baixo, enquadrado por um parêntese à esquerda. - -::: diagramm l10-countdown.visustruct -Uma contagem decrescente: enquanto numero for maior do que 0, numero é mostrado e diminui 1. Depois aparece Partida! -::: - -## Primeiro a condição - -O ciclo while é um **ciclo pré-teste**. Antes de **cada** iteração, a condição é verificada: - -1. Verificar a condição. -2. Se for verdadeira, executar o interior uma vez e recomeçar no 1. -3. Se for falsa, o programa continua por baixo do ciclo. - -::: grafik l10-kopfgesteuert.svg -Depois de cada iteração volta-se à condição. Só quando ela é falsa é que o programa continua por baixo do ciclo. -::: - -Na contagem decrescente, a condição é verificada quatro vezes: com 3, 2 e 1 é verdadeira, com 0 é falsa. - -> Se a condição já for falsa da primeira vez que é verificada, o interior **não é executado nem uma vez**. Começa a contagem com \`int numero = 0\` e só aparece Partida! - -## Uma variável contadora - -Muitos ciclos vão contando. Para isso precisas de três coisas: - -- **Um valor inicial antes do ciclo**, p. ex. \`int i = 1\` -- **Uma condição na cabeça**, p. ex. \`i <= 5\` -- **Uma alteração no interior**, p. ex. \`i = i + 1\` (abreviado: \`i++\`) - -Se faltar uma destas partes, o ciclo conta mal ou nem sequer conta. - -::: angeberwissen -Os ciclos de contagem são antiquíssimos! No artigo de 1973, Nassi e Shneiderman mostraram a sua ideia, entre outras coisas, com o **fatorial**: 5! = 1 · 2 · 3 · 4 · 5 = 120. Aqui está a minha versão caprina. Experimenta-a com **Passo** na simulação e vê o \`fatorial\` a crescer. Mééé, isto vai depressa! -::: - -::: diagramm l10-fakultaet.visustruct -O fatorial com uma variável contadora \`i\`, reconstruído a partir de um exemplo do artigo de 1973. -::: - -## Exercício: Contar até n - -::: übung l10-bis-n -titel: Contar até n -auftrag: Pede um número inteiro \`n\` e mostra todos os números de 1 a \`n\`, cada um na sua linha. -test: 3 -> 1 | 2 | 3 -test: 5 -> 1 | 2 | 3 | 4 | 5 -test: 1 -> 1 -braucht: whileSchleife -tipp: Precisas de uma variável contadora que começa em 1 e aumenta 1 em cada iteração. -tipp: Antes do ciclo, cria \`int i = 1\`. A condição é \`i <= n\`. No interior mostras \`i\` e depois aumentas \`i\` em 1. -lösung: l10-bis-n-loesung.visustruct -::: - -## Atenção: ciclo infinito - -Se nada no interior do ciclo alterar a condição, ela fica verdadeira para sempre. O ciclo nunca para. A isto chama-se **ciclo infinito**. - -::: diagramm l10-endlos.visustruct -Aqui falta numero = numero - 1. O ciclo mostra 3 uma e outra vez e nunca chega a Partida! -::: - -Pergunta-te em cada ciclo: **O que é que no interior garante que a condição acaba por ficar falsa?** Quando um exercício é verificado, o VisuStruct para depois de um número muito grande de passos e indica um possível ciclo infinito. - -## Exercício: Duplicar até 100 - -::: übung l10-verdoppeln -titel: Duplicar até 100 -auftrag: Pede um número inteiro. Duplica-o até ele ser pelo menos 100. - No fim, mostra **quantas vezes** o duplicaste. -test: 10 -> 4 -test: 30 -> 2 -test: 1 -> 7 -test: 100 -> 0 -braucht: whileSchleife -tipp: O ciclo é executado enquanto o número ainda for demasiado pequeno. Vai contando quantas vezes foi executado. -tipp: Precisas de uma segunda variável \`int passos = 0\`. A condição é \`numero < 100\`. No interior duplicas o número com \`numero = numero * 2\` e aumentas \`passos\` em 1. Se o número já for 100, o ciclo nem chega a ser executado. -lösung: l10-verdoppeln-loesung.visustruct -::: - -## Ciclos num teste de secretária - -Com um ciclo, o **teste de secretária** é especialmente valioso. Vês exatamente quantas vezes o ciclo é executado e com que valor para. Cada verificação da condição tem uma linha própria. - -::: diagramm l16-schreibtisch.visustruct -Um ciclo while soma os números 1, 2 e 3. -::: - -| Passo | soma | i | Saída | -|---|---|---|---| -| \`int soma = 0\` | 0 | – | | -| \`int i = 1\` | 0 | 1 | | -| \`i <= 3\` → true | 0 | 1 | | -| \`soma = soma + i\` | 1 | 1 | | -| \`i = i + 1\` | 1 | 2 | | -| \`i <= 3\` → true | 1 | 2 | | -| \`soma = soma + i\` | 3 | 2 | | -| \`i = i + 1\` | 3 | 3 | | -| \`i <= 3\` → true | 3 | 3 | | -| \`soma = soma + i\` | 6 | 3 | | -| \`i = i + 1\` | 6 | 4 | | -| \`i <= 3\` → false | 6 | 4 | | -| \`output: soma\` | 6 | 4 | 6 | - -Erros frequentes em ciclos são: - -- O ciclo é executado **uma vez a mais ou uma vez a menos**, p. ex. \`<\` em vez de \`<=\`. -- Uma variável **não é alterada** no ciclo, ou é alterada no sentido errado. Então o ciclo nunca acaba. -- Uma variável recebe o seu valor inicial **dentro** do ciclo em vez de antes dele e é reposta em cada iteração. - -## Exercício: Corrigir a contagem decrescente - -::: übung l16-countdown -titel: Corrigir a contagem decrescente -auftrag: A contagem decrescente deve contar para trás a partir do valor inicial e mostrar **Já!** no fim. Ou seja, com 3: 3, 2, 1, Já! - O diagrama inicial tem dois erros. Encontra e corrige os dois. -start: l16-countdown-start.visustruct -test: 3 -> 3 | 2 | 1 | Já! -test: 1 -> 1 | Já! -test: 0 -> Já! -tipp: Há dois erros. Um tem a ver com a contagem, o outro com a saída no fim. -tipp: Inicia a simulação com o valor inicial 3 e observa i em Variáveis. O i diminui? Compara também com atenção a última saída com a tarefa. -lösung: l16-countdown-loesung.visustruct -::: - -## Agora em Java - -A contagem decrescente do início desta lição fica assim em Java: - -\`\`\`java editor -int numero = 3; -while (numero > 0) { - System.out.println(numero); - numero = numero - 1; -} -System.out.println("Partida!"); -\`\`\` - -- Depois de \`while\`, a condição fica entre parênteses curvos, como em \`if\`. -- Tudo o que se repete fica entre chavetas. É o corpo do ciclo. -- O corpo está recuado. Assim vês, como no estrutograma, o que pertence ao ciclo. - -::: übung l11-java-gerade -titel: Números pares em Java -code: java -auftrag: Escreve um programa em Java que lê um número inteiro \`n\` e, com um ciclo while, mostra todos os números pares de 2 até no máximo \`n\`. Para 7, são 2, 4 e 6. -test: 7 -> 2 | 4 | 6 -test: 8 -> 2 | 4 | 6 | 8 -test: 2 -> 2 -braucht: whileSchleife -tipp: Precisas de uma variável contadora que começa em 2. O ciclo corre enquanto ela não for maior do que \`n\`. -tipp: \`int numero = 2;\` antes do ciclo, depois \`while (numero <= n) { … }\`. No corpo mostras \`numero\` e aumentas com \`numero = numero + 2;\`. -lösung: l11-java-gerade-loesung.visustruct -::: - -## Preenche os espaços: while - -::: lückentext -titel: Soma de 1 a 10 -auftrag: O programa deve somar os números de 1 a 10. Preenche as palavras e os sinais que faltam. -\`\`\`java -int soma = 0; -int numero = 1; -[[while]] (numero [[<=]] 10) [[{]] - soma = soma + [[numero]]; - [[numero]] = numero + 1; -} -System.out.println("Soma: " + soma); -\`\`\` -erklärung: O ciclo repete-se enquanto \`numero\` for no máximo 10. Em cada volta, \`numero\` é somado à soma e depois \`numero\` aumenta 1. Sem essa linha seria um ciclo infinito. Saída: **Soma: 55** -::: - -## Encontra o erro: poupar - -::: übung l11-java-fehler -titel: Corrigir o plano de poupança -code: java -auftrag: O Ludwig poupa 5 euros por semana. O programa pergunta o objetivo e deve mostrar ao fim de quantas semanas ele o atinge. Para 50 euros são 10 semanas, mas o programa diz **Semanas: 11**. - Percorre o código com Passo a passo e observa \`dinheiro\` e \`semanas\`. Corrige o erro e carrega em Verificar. -start: l11-java-fehler-start.visustruct -test: 50 -> Semanas: 10 -test: 12 -> Semanas: 3 -test: 5 -> Semanas: 1 -test: 1 -> Semanas: 1 -braucht: whileSchleife -tipp: Quanto dinheiro tem o Ludwig quando o ciclo se repete pela última vez? Precisa mesmo de poupar mais uma semana? -tipp: Só se poupa enquanto o objetivo **ainda não foi atingido**: \`while (dinheiro < objetivo)\`. -lösung: l11-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l11-java-laeuft-nicht -titel: Corrigir a contagem -code: java -auftrag: A contagem decrescente deve mostrar **3**, **2**, **1** e depois **Partida!** Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l11-java-laeuft-nicht-start.visustruct -test: - -> 3 | 2 | 1 | Partida! -braucht: whileSchleife -tipp: O erro está dentro do ciclo. Que variável deve ser mostrada e como se chama de facto? -tipp: Mostra \`numero\` com n minúsculo: \`System.out.println(numero);\` -lösung: l11-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Quantas vezes? - -::: spiel frage -titel: Jogo: Quantas vezes? -intro: O Ludwig escreveu ciclos while. Faz o teste de secretária de cabeça. Seis rondas. - -runde: - int numero = 3; - while (numero > 0) { - System.out.println(numero); - numero = numero - 1; - } - System.out.println("Já!"); -frage: O que aparece? -- [x] 3\\n2\\n1\\nJá! -- 3\\n2\\n1\\n0\\nJá! -- Já! -> Quando numero é 0, \`numero > 0\` é falso, por isso o 0 já não aparece. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: O que aparece? -- [x] nada -- 10 -- de 10 a 4 -> A condição é verificada primeiro. 10 < 5 é falso, o corpo não corre nem uma vez. - -runde: - int i = 1; - while (i <= 3) { - System.out.println(i); - } -frage: O que acontece? -- Aparecem 1, 2 e 3. -- [x] O ciclo nunca para. -- Não aparece nada. -> i nunca aumenta no corpo. A condição fica sempre verdadeira: um ciclo infinito. - -runde: - int numero = 1; - while (numero < 100) { - numero = numero * 2; - } - System.out.println(numero); -frage: O que aparece? -- 64 -- 100 -- [x] 128 -> 1, 2, 4, 8, 16, 32, 64, 128. Só com 128 é que \`numero < 100\` é falso. - -runde: - int i = 0; - while (i < 5) { - i = i + 2; - } - System.out.println(i); -frage: O que aparece? -- 4 -- 5 -- [x] 6 -> i passa por 0, 2, 4, 6. Com 6, \`i < 5\` é falso. O 5 é saltado. - -runde: - int i = 1; - while (i <= 10) { - i = i + 3; - } -frage: Quantas vezes corre o corpo? -- 3 vezes -- [x] 4 vezes -- 10 vezes -> O corpo corre com i = 1, 4, 7 e 10. Depois i fica 13. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que o ciclo while verifica a sua condição antes de cada iteração. → Primeiro a condição -- Consigo usar uma variável contadora com valor inicial, condição e alteração. → Uma variável contadora -- Consigo notar quando um ciclo nunca acaba e corrigir o erro. → Atenção: ciclo infinito -- Consigo seguir um ciclo iteração a iteração num teste de secretária. → Ciclos num teste de secretária -- Consigo escrever um ciclo while em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer ciclo pré-teste? -→ Primeiro a condição -- [x] A condição é verificada antes de cada iteração. -- [ ] A condição é verificada depois de cada iteração. -- [ ] O ciclo é sempre executado exatamente uma vez. -> A cabeça com a condição está em cima e é avaliada primeiro. - -? \`int i = 5\`, depois um ciclo while com a condição \`i < 3\`. Quantas vezes é executado o interior? -→ Primeiro a condição -- [x] Nenhuma -- [ ] Uma vez -- [ ] Três vezes -> Logo da primeira vez que é verificado, 5 < 3 é falso. - -? Porque é que um ciclo com a condição \`numero > 0\` nunca acaba se o interior só tiver \`output: numero\`? -→ Atenção: ciclo infinito -- [ ] Porque a saída aumenta o número -- [x] Porque numero nunca muda e a condição fica sempre verdadeira -- [ ] Porque a condição está mal escrita -> No interior tem de acontecer algo que acabe por tornar a condição falsa. - -? Que outros nomes têm os ciclos nos manuais? -→ Primeiro a condição -- [x] Iteração ou repetição -- [ ] Decisões -- [ ] Subprogramas -> Um ciclo repete instruções. Por isso também se chama iteração ou estrutura de repetição. - -? Um ciclo deve contar de 1 a 5, mas só vai até 4. Qual é o erro provável? -→ Uma variável contadora -- [x] A condição diz i < 5 em vez de i <= 5. -- [ ] O ciclo é um ciclo while. -- [ ] A variável i tem o nome errado. - -? Que linha começa corretamente um ciclo while em Java? -→ Agora em Java -- [ ] while numero > 0 { -- [x] while (numero > 0) { -- [ ] while (numero > 0); -> A condição fica entre parênteses curvos, depois \`{\` abre o corpo. -::: -`,Dy=`--- -titel: Ciclo do-while -bereich: Fundamentos -kurz: Primeiro executar, depois verificar: ciclos com pelo menos uma iteração. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que o ciclo do-while só verifica a sua condição depois do interior -- explicar porque é que o interior é executado pelo menos uma vez -- repetir uma entrada até ela ser válida -- escrever um ciclo do-while em Java -::: - -## Primeiro fazer, depois verificar - -O **ciclo do-while** é um **ciclo pós-teste**. A condição fica em baixo, no pé do bloco. É executado assim: - -1. Executar o interior uma vez. -2. Verificar a condição. -3. Se for verdadeira, recomeçar no 1. Se for falsa, o programa continua por baixo do ciclo. - -::: grafik l11-vergleich.svg -À esquerda, o ciclo while verifica primeiro; à direita, o ciclo do-while executa primeiro. -::: - -Em cima, no bloco, está \`do\`, e a condição fica no pé. Quando clicas no ciclo, a palavra \`while\` está à frente do campo de texto no Inspetor de objetos: a condição quer dizer “repete enquanto …”. - -> Tal como no ciclo while, a condição diz **quando é que o ciclo se repete**. Enquanto for verdadeira, o ciclo continua. - -::: angeberwissen -O Python não tem ciclo do-while. Quem lá quer “primeiro fazer, depois verificar” escreve \`while True:\` e sai do ciclo com \`break\`. Java, C e JavaScript, pelo contrário, têm \`do … while\` há décadas. -::: - -## Pelo menos uma iteração - -Como a condição só é verificada no fim, o interior **é sempre executado pelo menos uma vez**. Essa é a diferença mais importante em relação ao ciclo while. - -::: diagramm l11-einmal.visustruct -i vale 10 e, portanto, não é menor do que 5. Mesmo assim, 10 é mostrado uma vez, porque a verificação só vem depois. -::: - -Com um ciclo while e a mesma condição \`i < 5\`, aqui não seria mostrado nada. - -## Uso típico: repetir uma entrada - -O ciclo do-while serve sempre que alguma coisa tem de acontecer primeiro para a poderes verificar. O melhor exemplo é uma entrada: só depois de alguém ter escrito alguma coisa é que sabes se é válida. - -::: diagramm l11-eingabe-pruefen.visustruct -A pergunta repete-se até ser introduzido um número de 1 a 10. Na simulação, experimenta primeiro 0 e depois 12. -::: - -Aqui a condição descreve a entrada **inválida**: \`numero < 1 || numero > 10\`. Enquanto a entrada for inválida, a pergunta é feita outra vez. - -## Exercício: Nota válida - -::: übung l11-note -titel: Nota válida -auftrag: Pede uma nota. Se não estiver entre 1 e 5, pergunta outra vez. Se for válida, mostra-a, por exemplo **A tua nota: 3**. -test: 3 -> A tua nota: 3 -test: 0, 6, 2 -> A tua nota: 2 -test: 9, 5 -> A tua nota: 5 -test: -1, 1 -> A tua nota: 1 -braucht: doUntilSchleife -tipp: A nota é pedida pelo menos uma vez. Depois, a condição decide se se pergunta outra vez. -tipp: Antes do ciclo, cria \`int nota = 0\`. A entrada \`input: nota "Nota de 1 a 5"\` fica dentro do ciclo. A condição é \`nota < 1 || nota > 5\`. -lösung: l11-note-loesung.visustruct -::: - -## Exercício: Somar até 0 - -::: übung l11-summe -titel: Somar até 0 -auftrag: Pede números até ser introduzido um 0. Depois mostra a soma de todos os números introduzidos. -test: 3, 4, 0 -> 7 -test: 10, 0 -> 10 -test: 5, 5, 5, 0 -> 15 -test: 0 -> 0 -braucht: doUntilSchleife -tipp: Precisas de uma variável para a soma que começa em 0 antes do ciclo. Em cada iteração, o novo número é somado. -tipp: Antes do ciclo, cria \`int soma = 0\` e \`int numero = 0\`. No ciclo pedes \`numero\` e calculas \`soma = soma + numero\`. Somar o 0 não faz mal. O ciclo continua enquanto \`numero != 0\`. -tipp: O esqueleto: \`int soma = 0\` e \`int numero = 0\`, depois um ciclo do-while com a condição \`numero != 0\`. Dentro: a entrada de \`numero\` e \`soma = soma + numero\`. Por baixo do ciclo: \`output: soma\`. -lösung: l11-summe-loesung.visustruct -::: - -## Agora em Java - -O ciclo que corre mesmo assim uma vez fica assim em Java: - -\`\`\`java editor -int i = 10; -do { - System.out.println(i); - i = i + 1; -} while (i < 5); -\`\`\` - -- O corpo fica entre \`do {\` e \`}\`, a condição só vem depois. -- Aqui, depois de \`while (…)\`, há um **ponto e vírgula**. É diferente do ciclo while. - -::: übung l12-java-verdoppeln -titel: Duplicar pelo menos uma vez -code: java -auftrag: Escreve um programa em Java que lê um número inicial. Um ciclo do-while duplica-o e mostra-o enquanto for menor do que 100. Um número a partir de 100 também é duplicado pelo menos uma vez: 200 passa a 400. -test: 30 -> 60 | 120 -test: 200 -> 400 -test: 13 -> 26 | 52 | 104 -braucht: doUntilSchleife -tipp: No corpo duplicas o número e mostras. A condição fica no fim. -tipp: \`do { numero = numero * 2; System.out.println(numero); } while (numero < 100);\` -lösung: l12-java-verdoppeln-loesung.visustruct -::: - -## Preenche os espaços: do-while - -::: lückentext -titel: Triplicar -auftrag: O número é triplicado e mostrado enquanto for menor do que 100. Preenche as palavras e os sinais que faltam. -\`\`\`java -int numero = 1; -[[do]] { - numero = numero * 3; - System.out.println(numero); -} [[while]] (numero [[<]] 100)[[;]] -\`\`\` -erklärung: O corpo fica entre \`do {\` e \`}\`, a condição só vem depois. No ciclo do-while há um ponto e vírgula depois de \`while (…)\`. Saída: 3, 9, 27, 81 e 243. -::: - -## Encontra o erro: dividir ao meio - -::: übung l12-java-fehler -titel: Corrigir a divisão ao meio -code: java -auftrag: O programa lê um número inicial e, com um ciclo do-while, divide-o repetidamente por 2 (divisão inteira). Cada resultado é mostrado até chegar a **0**. Para 10 são 5, 2, 1 e 0. Mas falta o 0. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l12-java-fehler-start.visustruct -test: 10 -> 5 | 2 | 1 | 0 -test: 1 -> 0 -test: 7 -> 3 | 1 | 0 -test: 20 -> 10 | 5 | 2 | 1 | 0 -braucht: doUntilSchleife -tipp: Que valor tem \`numero\` depois de o 1 ser mostrado? O ciclo ainda se repete mais uma vez? -tipp: O ciclo deve continuar enquanto o número for maior do que 0: \`while (numero > 0);\` -lösung: l12-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l12-java-laeuft-nicht -titel: Corrigir a duplicação -code: java -auftrag: A partir de 1, o programa deve duplicar enquanto o número for menor do que 20: **1**, **2**, **4**, **8**, **16**. Só mostra o 1 e depois para. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l12-java-laeuft-nicht-start.visustruct -test: - -> 1 | 2 | 4 | 8 | 16 -braucht: doUntilSchleife -tipp: A primeira volta ainda corre. O erro aparece quando a condição em baixo é verificada pela primeira vez. -tipp: Na condição tem de estar \`limite\` com l minúsculo: \`} while (numero < limite);\` -lösung: l12-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Pelo menos uma vez? - -::: spiel frage -titel: Jogo: Pelo menos uma vez? -intro: While ou do-while? O Ludwig mostra-te ciclos. Diz antes o que acontece. Seis rondas. - -runde: - int i = 10; - do { - System.out.println(i); - i = i + 1; - } while (i < 5); -frage: O que aparece? -- nada -- [x] 10 -- de 10 a 4 -> Primeiro fazer, depois verificar: o corpo corre uma vez, depois 11 < 5 é falso. - -runde: - int i = 10; - while (i < 5) { - System.out.println(i); - i = i + 1; - } -frage: O que aparece? -- [x] nada -- 10 -- 11 -> No ciclo while a condição vem primeiro. 10 < 5 é falso, por isso não corre nada. - -runde: - int numero = 200; - do { - numero = numero * 2; - } while (numero < 100); - System.out.println(numero); -frage: O que aparece? -- 200 -- [x] 400 -- 800 -> Duplica-se uma vez de certeza. Depois 400 < 100 é falso. - -runde: - int numero = 30; - do { - numero = numero * 2; - System.out.println(numero); - } while (numero < 100); -frage: O que aparece? -- 60 -- [x] 60\\n120 -- 60\\n120\\n240 -> Depois de 60, 60 < 100 é verdadeiro, continua. Depois de 120 acaba. - -runde: -frage: Que linha termina corretamente um ciclo do-while em Java? -- [x] \`} while (i < 5);\` -- \`} while (i < 5)\` -- \`while (i < 5) {\` -> Depois do \`while (…)\` do ciclo do-while há um ponto e vírgula. - -runde: -frage: Para que se usa tipicamente um ciclo do-while? -- [x] repetir uma entrada até ser válida -- contar de 1 a 10 -- trocar dois valores -> A pergunta é feita pelo menos uma vez. Só depois se sabe se a entrada era válida. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que o ciclo do-while só verifica a sua condição depois do interior. → Primeiro fazer, depois verificar -- Consigo explicar porque é que o interior é executado pelo menos uma vez. → Pelo menos uma iteração -- Consigo repetir uma entrada até ela ser válida. → Uso típico: repetir uma entrada -- Consigo escrever um ciclo do-while em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que quer dizer ciclo pós-teste? -→ Primeiro fazer, depois verificar -- [ ] A condição é verificada antes de cada iteração. -- [x] A condição é verificada depois de cada iteração. -- [ ] O ciclo não tem condição. -> A condição fica no pé, em baixo, e é avaliada depois do interior. - -? A condição de um ciclo do-while é falsa desde o início. Quantas vezes é executado o interior? -→ Pelo menos uma iteração -- [ ] Nenhuma -- [x] Exatamente uma vez -- [ ] Para sempre -> O interior é executado primeiro. Só depois o ciclo nota que deve parar. - -? Queres pedir um número de 1 a 10. Que condição fica no pé? -→ Uso típico: repetir uma entrada -- [ ] \`numero >= 1 && numero <= 10\` -- [x] \`numero < 1 || numero > 10\` -- [ ] \`numero == 10\` -> O ciclo repete-se enquanto a entrada for inválida, ou seja, menor do que 1 ou maior do que 10. - -? Quando é que um ciclo do-while é melhor do que um ciclo while? -→ Pelo menos uma iteração -- [x] Quando o interior tem de ser executado pelo menos uma vez, p. ex. numa entrada -- [ ] Quando o ciclo talvez nem precise de ser executado -- [ ] Quando queres contar exatamente até 10 - -? O que fica no fim de um ciclo do-while em Java? -→ Agora em Java -- [ ] } while (condicao) { -- [x] } while (condicao); -- [ ] } until (condicao); -> Depois da condição vem um ponto e vírgula. -::: -`,By=`--- -titel: Ciclo for -bereich: Fundamentos -kurz: Contar um número fixo de iterações com Início, Condição e Passo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- nomear as três partes Início, Condição e Passo do ciclo for -- explicar por que ordem são executadas as três partes -- contar para a frente, para trás e em passos maiores com um ciclo for -- escrever um ciclo for em Java e explicar os seus três campos -::: - -## Contar com um plano fixo - -No ciclo while já foste contando: um valor inicial antes do ciclo, uma condição na cabeça, uma alteração no interior. O **ciclo for** junta estas três partes na cabeça. Assim vês num relance como ele conta. - -::: grafik l12-while-zu-for.svg animiert -O ciclo while torna-se um ciclo for: o início, a condição e o passo juntam-se na cabeça. -::: - -Quando clicas num ciclo for, ele tem três campos à direita: - -- **Início:** \`int i = 1\` cria a variável contadora. -- **Condição:** \`i <= 5\` diz até quando se conta. -- **Passo:** \`i++\` aumenta \`i\` em 1 depois de cada iteração. - -::: diagramm l12-eins-bis-fuenf.visustruct -Um ciclo for que mostra os números de 1 a 5. -::: - -::: angeberwissen -Porque é que a variável de contagem se chama quase sempre \`i\`? Na matemática, \`i\` representa há muito tempo um índice. E em FORTRAN, uma das primeiras linguagens de programação, de 1957, todas as variáveis começadas por I a N eram automaticamente números inteiros. Os programadores ainda não perderam o hábito. -::: - -## Por que ordem? - -As três partes são executadas em momentos diferentes: - -1. O **Início** é executado exatamente uma vez, logo no começo. -2. A **Condição** é verificada antes de cada iteração. Se for falsa, o ciclo termina. -3. Depois do interior vem o **Passo**, depois outra vez a condição. - -::: grafik l12-for-ablauf.svg -O Início só é executado uma vez. Depois, a condição, o interior e o passo repetem-se. -::: - -Portanto, o ciclo for é um ciclo pré-teste, como o ciclo while. Percorre o exemplo na simulação com **Passo** e observa como \`i\` muda. - -> Usa o ciclo for quando sabes de antemão quantas vezes uma coisa deve acontecer. Se o fim depender de algo que só acontece durante o ciclo, por exemplo uma entrada, é melhor o ciclo while ou do-while. - -## Exemplo: soma de 1 a n - -Um ciclo for é bom para somar números. Antes do ciclo está \`int soma = 0\`. Em cada iteração soma-se o número atual \`i\`. - -::: diagramm l12-summe.visustruct -Com n = 4, o ciclo calcula 0 + 1 + 2 + 3 + 4. No fim é mostrado 10. -::: - -## Outros passos - -O passo nem sempre tem de ser \`i++\`: - -- \`i--\` conta para trás, por exemplo com Início \`int i = 10\` e Condição \`i >= 1\`. -- \`i = i + 2\` salta de dois em dois, por exemplo 0, 2, 4, 6. - -Garante que o Início, a Condição e o Passo combinam. Com Início \`int i = 1\`, Condição \`i >= 1\` e Passo \`i++\`, a condição nunca fica falsa. - -::: übung l12-countdown -titel: Contagem decrescente -auftrag: Pede um número inteiro \`n\`. Usa um ciclo for para contar para trás de \`n\` até 1 e mostra cada número. Depois mostra **Já!**. -test: 3 -> 3 | 2 | 1 | Já! -test: 5 -> 5 | 4 | 3 | 2 | 1 | Já! -test: 1 -> 1 | Já! -braucht: forSchleife -tipp: Desta vez o ciclo for conta para trás. Pensa onde começa, quando para e como conta. -tipp: O Início é \`int i = n\`, a condição \`i >= 1\` e o passo \`i--\`. A saída Já! fica por baixo do ciclo, não dentro dele. -lösung: l12-countdown-loesung.visustruct -::: - -## Exercício: Tabuada - -::: übung l12-einmaleins -titel: Tabuada -auftrag: Pede um número e mostra a sua tabuada de 1 a 10. Cada linha fica assim: **3 x 1 = 3**, **3 x 2 = 6** e assim por diante. -test: 3 -> 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 | 3 x 6 = 18 | 3 x 7 = 21 | 3 x 8 = 24 | 3 x 9 = 27 | 3 x 10 = 30 -test: 7 -> 7 x 1 = 7 | 7 x 2 = 14 | 7 x 3 = 21 | 7 x 4 = 28 | 7 x 5 = 35 | 7 x 6 = 42 | 7 x 7 = 49 | 7 x 8 = 56 | 7 x 9 = 63 | 7 x 10 = 70 -braucht: forSchleife -tipp: O ciclo conta de 1 a 10. Em cada iteração mostras uma linha da tabuada. -tipp: No interior, calcula primeiro \`int produto = numero * i\`. Depois mostra \`numero + " x " + i + " = " + produto\`. Não te esqueças dos espaços dentro das aspas. -lösung: l12-einmaleins-loesung.visustruct -::: - -## Exercício: Corrigir a soma - -::: übung l16-summe -titel: Corrigir a soma -auftrag: O estrutograma deve somar todos os números de 1 a n. Ou seja, com n = 4 o resultado deve ser 1 + 2 + 3 + 4 = **10**. Mas mostra 6. - Faz um teste de secretária ou usa **Passo** e corrige o erro. -start: l16-summe-start.visustruct -test: 4 -> 10 -test: 1 -> 1 -test: 5 -> 15 -braucht: forSchleife -tipp: Percorre o ciclo com n = 4 de cabeça ou com **Passo**. Que números são realmente somados? -tipp: Olha para o último valor de i com que o ciclo é executado. Com n = 4, também tem de ser somado i = 4. -lösung: l16-summe-loesung.visustruct -::: - -## Agora em Java - -A soma de 1 até n fica assim em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Até que número?"); -int n = scanner.nextInt(); -int soma = 0; -for (int i = 1; i <= n; i++) { - soma = soma + i; -} -System.out.println(soma); -\`\`\` - -Nos parênteses curvos depois de \`for\` estão os três campos do ciclo for, separados por ponto e vírgula: - -| Campo | Em Java | Significado | -|---|---|---| -| Início | \`int i = 1\` | \`i\` começa em 1. | -| Condição | \`i <= n\` | O ciclo corre enquanto isto for verdade. | -| Passo | \`i++\` | Depois de cada iteração, \`i\` aumenta 1. | - -\`i++\` é a forma curta de \`i = i + 1\`. Para contar para trás usas \`i--\`. - -::: übung l13-java-quadrate -titel: Quadrados em Java -code: java -auftrag: Escreve um programa em Java que lê um número inteiro \`n\` e, com um ciclo for, mostra os quadrados de 1 até \`n\`, cada um na sua linha. Para 3, são 1, 4 e 9. -test: 3 -> 1 | 4 | 9 -test: 5 -> 1 | 4 | 9 | 16 | 25 -test: 1 -> 1 -braucht: forSchleife -tipp: O ciclo conta \`i\` de 1 até \`n\`. O quadrado de \`i\` é \`i * i\`. -tipp: \`for (int i = 1; i <= n; i++) { … }\` e no corpo \`System.out.println(i * i);\`. -lösung: l13-java-quadrate-loesung.visustruct -::: - -## Preenche os espaços: for - -::: lückentext -titel: Contar para cima e para baixo -auftrag: O primeiro ciclo soma os números de 1 a 5, o segundo conta de 10 até 0 para trás. Preenche as palavras e os sinais que faltam. -\`\`\`java -int soma = 0; -[[for]] ([[int]] i = 1; i [[<=]] 5; [[i++ | i += 1 | i = i + 1]]) { - soma = soma + i; -} -System.out.println("Soma: " + soma); -for (int i = 10; i [[>=]] 0; [[i-- | i -= 1 | i = i - 1]]) { - System.out.println(i); -} -\`\`\` -erklärung: Entre os parênteses ficam o valor inicial, a condição e o passo, separados por ponto e vírgula. \`i++\` conta para cima, \`i--\` conta para baixo. Ao contar para trás até 0, a condição é \`i >= 0\`. -::: - -## Encontra o erro: tabuada - -::: übung l13-java-fehler -titel: Corrigir a tabuada -code: java -auftrag: O programa pergunta que tabuada queres e deve mostrá-la de 1 vez até 10 vezes, para o 7 são 7, 14, … até 70. Mas falta o 70. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l13-java-fehler-start.visustruct -test: 7 -> 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 -test: 3 -> 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 -braucht: forSchleife -tipp: Quantas vezes se repete o ciclo? Conta os valores que \`i\` toma. -tipp: \`i\` também deve tomar o valor 10: \`i <= 10\` em vez de \`i < 10\`. -lösung: l13-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l13-java-laeuft-nicht -titel: Corrigir a escada -code: java -auftrag: O Ludwig sobe 5 degraus, cada um com 20 cm. O programa deve mostrar **Altura: 100 cm**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l13-java-laeuft-nicht-start.visustruct -test: - -> Altura: 100 cm -braucht: forSchleife -tipp: A variável \`altura\` é usada num cálculo, mas onde é criada? E com que altura começa o Ludwig? -tipp: Cria \`altura\` antes do ciclo: \`int altura = 0;\` -lösung: l13-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa esconde **exatamente um erro**, e a bomba está a fazer tiquetaque. Lê o que o programa deve fazer e toca na linha errada antes de o tempo acabar. Se as partes de uma linha tiverem moldura, toca exatamente na parte errada, por exemplo só em \`i++\`. Oito rondas, 25 segundos cada. -zeit: 25 - -runde: - for (int i = 1; i <= 3; i++) { - System.out.println(i) - } -frage: Deve mostrar 1, 2 e 3. -fehler: 2 -besser: System.out.println(i); -> Falta o ponto e vírgula no fim da instrução. - -runde: - for (int i = 1, i <= 5, i++) { - System.out.println(i); - } -frage: Deve mostrar de 1 a 5. -fehler: 1 -besser: for (int i = 1; i <= 5; i++) { -> Os três campos do ciclo for separam-se com ponto e vírgula, não com vírgulas. - -runde: - for (int i = 10; i >= 1; i++) { - System.out.println(i); - } -frage: Deve contar para trás de 10 até 1. -fehler: 1 -stelle: i++ -besser: for (int i = 10; i >= 1; i--) { -> Com \`i++\`, \`i\` fica sempre maior e a condição \`i >= 1\` continua verdadeira: um ciclo infinito. Para contar para trás usas \`i--\`. - -runde: - int soma = 0; - for (int i = 1; i <= 4; i++) { - soma = i; - } - System.out.println(soma); -frage: Deve mostrar a soma 1 + 2 + 3 + 4 = 10. -fehler: 3 -stelle: i -besser: soma = soma + i; -> \`soma = i\` substitui a soma em cada iteração. No fim fica lá só 4. - -runde: - for (int i = 0; i <= 5; i++) { - System.out.println("Mééé"); - } -frage: Deve mostrar Mééé exatamente cinco vezes. -fehler: 1 -stelle: i <= 5 -besser: for (int i = 0; i < 5; i++) { -> De 0 até 5, inclusive, são seis iterações. Quem começa em 0 usa \`<\`. - -runde: - for (int i = 1; i <= 3; i++) { - system.out.println(i); - } -frage: Deve mostrar 1, 2 e 3. -fehler: 2 -stelle: system.out.println -besser: System.out.println(i); -> O Java distingue maiúsculas de minúsculas: \`System\` escreve-se com S maiúsculo. - -runde: - int numero = 7; - for (int i = 1; i <= 10; i++) { - System.out.println(numero + " x " + i + " = " + numero * numero); - } -frage: Deve mostrar a tabuada do 7: 7 x 1 = 7, 7 x 2 = 14 e assim por diante. -fehler: 3 -stelle: numero * numero -besser: System.out.println(numero + " x " + i + " = " + numero * i); -> \`numero * numero\` dá sempre 49. Tem de ser \`numero * i\`. - -runde: - for (int i = 2; i <= 10; i + 2) { - System.out.println(i); - } -frage: Deve mostrar os números pares 2, 4, 6, 8 e 10. -fehler: 1 -stelle: i + 2 -besser: for (int i = 2; i <= 10; i = i + 2) { -> \`i + 2\` só calcula e não guarda nada. Para \`i\` crescer mesmo, é preciso \`i = i + 2\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo nomear as três partes Início, Condição e Passo do ciclo for. → Contar com um plano fixo -- Consigo explicar por que ordem são executadas as três partes. → Por que ordem? -- Consigo contar para a frente, para trás e em passos maiores com um ciclo for. → Outros passos -- Consigo escrever um ciclo for em Java e explicar os seus três campos. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas vezes é executado o Início de um ciclo for? -→ Por que ordem? -- [x] Exatamente uma vez -- [ ] Antes de cada iteração -- [ ] Depois de cada iteração -> O Início cria a variável contadora uma vez, no começo. - -? Início \`int i = 0\`, Condição \`i < 3\`, Passo \`i++\`. Que valores tem i dentro do ciclo? -→ Contar com um plano fixo -- [ ] 1, 2, 3 -- [x] 0, 1, 2 -- [ ] 0, 1, 2, 3 -> Com i = 3 a condição é falsa, por isso o interior já não é executado. - -? Início \`int i = 2\`, Condição \`i <= 10\`, Passo \`i = i + 2\`. Quantas vezes é executado o interior? -→ Outros passos -- [ ] 4 vezes -- [x] 5 vezes -- [ ] 10 vezes -> i toma os valores 2, 4, 6, 8 e 10. - -? Quando é que um ciclo for serve melhor? -→ Contar com um plano fixo -- [x] Quando sabes de antemão quantas vezes repetir -- [ ] Quando perguntas até uma entrada ser válida -- [ ] Quando só é verificado um único valor - -? O que significa \`i++\` num ciclo for? -→ Contar com um plano fixo -- [ ] i é duplicado. -- [x] i aumenta 1. -- [ ] i é mostrado. -> \`i++\` é a forma curta de \`i = i + 1\`. -::: -`,Py=`--- -titel: Encaixar -bereich: Fundamentos -kurz: Combinar decisões dentro de ciclos e ciclos dentro de ciclos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pôr uma decisão dentro de um ciclo -- pôr um ciclo dentro de outro ciclo -- explicar que o ciclo interior é executado do princípio ao fim em cada iteração do exterior -- escrever ciclos e decisões encaixados em Java -::: - -## Blocos uns dentro dos outros - -Já conheces todos os blocos importantes: sequência, decisão, seleção e três tipos de ciclos. Só juntos é que eles se tornam realmente poderosos. - -Cada ramo e cada corpo do ciclo é, ele próprio, uma sequência. Podes pôr lá qualquer elemento, incluindo mais decisões e ciclos. A isto chama-se **encaixar**. - -> Para isso, basta arrastares um elemento para o marcador ø dentro de um ciclo ou de um ramo. - -## Uma decisão dentro de um ciclo - -O ciclo percorre todos os números, e a decisão decide para cada número se acontece alguma coisa. Assim podes contar, por exemplo, quantos números pares há de 1 a n. - -::: diagramm l13-gerade-zaehlen.visustruct -Em cada iteração, a decisão verifica com i % 2 == 0 se i é par. Só nesse caso quantidade aumenta 1. O ramo false fica vazio. -::: - -Com n = 7 são os números 2, 4 e 6, portanto é mostrado 3. - -## Exercício: Contar entradas pares - -::: übung l13-gerade-eingaben -titel: Contar entradas pares -auftrag: Pede exatamente **cinco** números inteiros, um a seguir ao outro. Depois mostra quantos deles eram pares. -test: 1, 2, 3, 4, 5 -> 2 -test: 2, 4, 6, 8, 10 -> 5 -test: 1, 3, 5, 7, 9 -> 0 -test: 10, 11, 0, 7, 8 -> 3 -braucht: forSchleife, verzweigung -tipp: Fazer a mesma coisa cinco vezes significa: ciclo. Em cada iteração é lido e verificado um número. -tipp: Um ciclo for de 1 a 5. No interior vem primeiro a entrada \`input: int numero "Introduz um número"\`, por baixo uma decisão com \`numero % 2 == 0\`. No ramo true aumentas \`quantidade\` em 1. -lösung: l13-gerade-eingaben-loesung.visustruct -::: - -## Um ciclo dentro de um ciclo - -Se um ciclo estiver dentro de outro, o **ciclo interior é executado do princípio ao fim em cada iteração do exterior**. Com isto podes construir padrões de linhas e colunas. - -::: diagramm l13-dreieck.visustruct -O ciclo exterior conta as linhas. O interior acrescenta ao texto tantas estrelas quantas o número da linha indica. Com n = 3 obténs um triângulo de 1, 2 e 3 estrelas. -::: - -Com \`String texto = ""\` cada linha começa vazia. \`texto = texto + "*"\` acrescenta uma estrela. Só quando a linha está pronta é que é mostrada. - -Programadores experientes dão às variáveis contadoras os nomes curtos \`i\` e \`j\`: \`i\` por fora, \`j\` por dentro. Fica assim, aqui com uma pequena tabuada: - -::: grafik l13-verschachtelt-tabelle.svg animiert -O ciclo exterior conta as linhas com \`i\`, o interior conta os números de uma linha com \`j\`. Em cada nova linha, \`j\` começa outra vez em 1. -::: - -## Exercício: Retângulo - -::: übung l13-rechteck -titel: Retângulo -auftrag: Pede uma largura e uma altura. Mostra um retângulo feito de \`#\`: tantas linhas como a altura, e em cada linha tantos \`#\` como a largura. -test: 3, 2 -> ### | ### -test: 1, 3 -> # | # | # -test: 4, 1 -> #### -test: 2, 2 -> ## | ## -braucht: forSchleife -tipp: Precisas de dois ciclos, um dentro do outro: um para as linhas e, lá dentro, um para os caracteres de uma linha. -tipp: Constrói-o como o triângulo. A diferença: o ciclo interior conta sempre até \`largura\`, não até ao número da linha. O ciclo exterior conta até \`altura\`. -tipp: O esqueleto: entradas \`largura\` e \`altura\`. Ciclo for exterior \`int linha = 1\`, \`linha <= altura\`, \`linha++\`. Dentro, primeiro \`String texto = ""\`, depois o ciclo for interior \`int coluna = 1\`, \`coluna <= largura\`, \`coluna++\` com \`texto = texto + "#"\`, e por baixo do ciclo interior \`output: texto\`. -lösung: l13-rechteck-loesung.visustruct -::: - -## Não perder o fio - -Nos diagramas encaixados, o desenho ajuda-te: o que está mais para dentro fica recuado e rodeado pelo seu ciclo ou ramo. - -- Lê de fora para dentro: o que se repete? O que é decidido em cada iteração? -- Dá nomes com significado às variáveis contadoras, como \`linha\` e \`coluna\`. Dois ciclos não podem alterar a mesma variável contadora. -- Percorre um exemplo na simulação com **Passo** e observa as variáveis. - -::: angeberwissen -Foi exatamente para isto que o estrutograma foi inventado. Shneiderman perguntou-se: se devemos passar sem GOTO, porque não passar também sem as setas do fluxograma? O resultado: nada de esparguete de setas, e cada bloco fica bem arrumado no seu cercado. -::: - -## Agora em Java - -Contar os números pares fica assim em Java: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Até que número?"); -int n = scanner.nextInt(); -int quantidade = 0; -for (int i = 1; i <= n; i++) { - if (i % 2 == 0) { - quantidade++; - } // fim do if -} // fim do for -System.out.println(quantidade); -\`\`\` - -O que no estrutograma está encaixado, em Java está encaixado entre chavetas. Cada nível fica quatro espaços mais para dentro. Se o teu código ficar desarrumado, ajuda o botão **Indentar** em cima na área Código. - -Com muitas chavetas de fecho \`}\` é fácil perder a noção: que chaveta pertence a que bloco? Um comentário a seguir diz-te, p. ex. \`} // fim do if\` e \`} // fim do for\`. Isto também ajuda quando continuares mais tarde. - -\`quantidade++\` é a forma curta de \`quantidade = quantidade + 1\`. - -::: übung l14-java-treppe -titel: Escada de estrelas -code: java -auftrag: Escreve um programa em Java que lê o número de degraus e mostra uma escada de asteriscos. Para 3 degraus são \`*\`, \`**\` e \`***\`, cada degrau na sua linha. -test: 3 -> * | ** | *** -test: 1 -> * -test: 4 -> * | ** | *** | **** -braucht: forSchleife -tipp: Um ciclo exterior conta os degraus. Em cada degrau, um ciclo interior junta um texto de asteriscos. -tipp: No ciclo exterior: \`String linha = "";\`, depois \`for (int j = 1; j <= i; j++) { linha = linha + "*"; }\` e a seguir \`System.out.println(linha);\`. -lösung: l14-java-treppe-loesung.visustruct -::: - -## Preenche os espaços: encaixar - -::: lückentext -titel: Retângulo de estrelas -auftrag: O programa mostra um retângulo de 3 linhas com 4 estrelas cada. Preenche as palavras e os sinais que faltam. -\`\`\`java -for (int linha = 1; linha <= 3; linha++) { - String texto = [[""]]; - [[for]] (int coluna = 1; coluna [[<=]] 4; [[coluna++ | coluna += 1 | coluna = coluna + 1]]) { - texto = texto [[+]] "*"; - } - System.out.[[println]](texto); -[[}]] -\`\`\` -erklärung: O ciclo de dentro constrói uma linha de 4 estrelas, o de fora repete isso três vezes. Cada linha começa com um texto vazio \`""\`. A última chaveta fecha o ciclo de fora. -::: - -## Encontra o erro: divisíveis por 3 - -::: übung l14-java-fehler -titel: Corrigir a contagem -code: java -auftrag: O programa deve contar quantos números de 1 a \`n\` são divisíveis por 3 e mostrar o resultado **uma vez**. Para 10 é só **Quantidade: 3**. Mas mostra linhas a mais. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l14-java-fehler-start.visustruct -test: 10 -> Quantidade: 3 -test: 3 -> Quantidade: 1 -test: 2 -> Quantidade: 0 -braucht: forSchleife, verzweigung -tipp: Repara nas chavetas: a saída está dentro do ciclo ou depois dele? -tipp: Passa a linha \`System.out.println("Quantidade: " + quantidade);\` para depois da chaveta que fecha o ciclo. -lösung: l14-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l14-java-laeuft-nicht -titel: Corrigir os números pares -code: java -auftrag: O programa deve mostrar os números pares de 1 a 10: **2**, **4**, **6**, **8**, **10**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l14-java-laeuft-nicht-start.visustruct -test: - -> 2 | 4 | 6 | 8 | 10 -braucht: forSchleife, verzweigung -tipp: O erro está lá dentro, na saída. Como se chama a variável contadora do ciclo? -tipp: A variável contadora é \`i\` com i minúsculo: \`System.out.println(i);\` -lösung: l14-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Dentro e fora - -::: spiel frage -titel: Jogo: Dentro e fora -intro: O Ludwig encaixou blocos uns nos outros. Lê de fora para dentro e diz antes o que acontece. Seis rondas. - -runde: - for (int i = 1; i <= 3; i++) { - for (int j = 1; j <= 2; j++) { - System.out.println("*"); - } - } -frage: Quantas estrelas aparecem? -- 3 -- 5 -- [x] 6 -> O ciclo interior corre por completo em cada uma das 3 voltas do ciclo exterior: 3 · 2 = 6. - -runde: - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 3; j++) { - System.out.println(i + " " + j); - } - } -frage: Que linha aparece em quarto lugar? -- 1 4 -- [x] 2 1 -- 2 2 -> Primeiro j percorre tudo com i = 1: 1 1, 1 2, 1 3. Depois j recomeça em 1, agora com i = 2. - -runde: - int contagem = 0; - for (int i = 1; i <= 10; i++) { - if (i % 3 == 0) { - contagem++; - } - } - System.out.println(contagem); -frage: O que aparece? -- [x] 3 -- 10 -- 4 -> A decisão só conta o 3, o 6 e o 9. - -runde: - for (int i = 1; i <= 4; i++) { - if (i % 2 == 0) { - System.out.println("par"); - } else { - System.out.println(i); - } - } -frage: O que aparece? -- 1\\n2\\n3\\n4 -- [x] 1\\npar\\n3\\npar -- par\\npar -> Em cada número a decisão volta a decidir: os ímpares aparecem como número, os pares como palavra. - -runde: - for (int i = 1; i <= 3; i++) { - String linha = ""; - for (int j = 1; j <= i; j++) { - linha = linha + "*"; - } - System.out.println(linha); - } -frage: O que aparece? -- ***\\n***\\n*** -- [x] *\\n**\\n*** -- ***\\n**\\n* -> O ciclo interior vai até i. Por isso cada linha fica com mais uma estrela. - -runde: - for (int i = 1; i <= 3; i++) { - for (int i = 1; i <= 3; i++) { - System.out.println(i); - } - } -frage: O que acontece? -- Aparece 1 a 3 três vezes. -- Aparece 1 a 3 uma vez. -- [x] O Java indica um erro. -> Dois ciclos um dentro do outro precisam de duas variáveis de contagem diferentes, por exemplo \`linha\` e \`coluna\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pôr uma decisão dentro de um ciclo. → Uma decisão dentro de um ciclo -- Consigo pôr um ciclo dentro de outro ciclo. → Um ciclo dentro de um ciclo -- Consigo explicar que o ciclo interior é executado do princípio ao fim em cada iteração do exterior. → Um ciclo dentro de um ciclo -- Consigo escrever ciclos e decisões encaixados em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O ciclo exterior é executado 3 vezes, o interior 4 vezes. Quantas vezes é executado ao todo o interior do ciclo interior? -→ Um ciclo dentro de um ciclo -- [ ] 7 vezes -- [x] 12 vezes -- [ ] 4 vezes -> Em cada uma das 3 iterações exteriores, o ciclo interior é executado 4 vezes, portanto 3 · 4 = 12. - -? Como sabes se um número é par? -→ Uma decisão dentro de um ciclo -- [ ] \`numero / 2 == 0\` -- [x] \`numero % 2 == 0\` -- [ ] \`numero == 2\` -> O % dá o resto de uma divisão. Nos números pares, o resto da divisão por 2 é zero. - -? Há uma decisão dentro de um ciclo for. Quantas vezes é verificada a condição da decisão? -→ Uma decisão dentro de um ciclo -- [ ] Uma vez -- [x] Uma vez por iteração do ciclo -- [ ] Só se for verdadeira -> A decisão faz parte do interior e é executada em cada iteração. - -? Como reconheces em Java o que pertence a um ciclo? -→ Agora em Java -- [ ] Pela cor -- [x] Pelas chavetas e pela indentação -- [ ] Pelos pontos e vírgulas -::: -`,Oy=`--- -titel: Arrays -bereich: Fundamentos -kurz: Guardar muitos valores com um só nome, chegar a eles com o índice e percorrê-los com um ciclo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar um array com valores ou com \`new int[5]\` -- explicar que o índice começa em 0 e que o último índice é \`length - 1\` -- percorrer e encher um array com um ciclo for -- calcular a soma e o máximo de um array -- criar um array em Java e percorrê-lo com um ciclo -::: - -## Muitos valores com um só nome - -Imagina que queres guardar os pontos de cinco testes. Com cinco variáveis \`pontos1\` a \`pontos5\` isso fica depressa confuso. Um **array** é uma fila de posições que têm todas o mesmo nome e o mesmo tipo de dados. - -Crias um array com uma instrução. Depois do tipo de dados escreves parênteses retos \`[]\`: - -\`\`\` -int[] numeros = {2, 4, 6, 8, 10} -String[] nomes = {"Ada", "Rui", "Inês"} -\`\`\` - -Os valores entre chavetas vão logo para as posições. Também podes criar um array vazio com um número fixo de posições: - -\`\`\` -int[] pontos = new int[5] -String[] nomes = new String[3] -\`\`\` - -Com \`new int[5]\`, as cinco posições têm zeros no início; com \`new String[3]\`, textos vazios. - -## O índice começa em 0 - -Cada posição tem um número, o **índice**. Começa-se a contar em **0**. Portanto, com \`int[] numeros = {2, 4, 6, 8, 10}\`: - -- \`numeros[0]\` é 2 -- \`numeros[1]\` é 4 -- \`numeros[4]\` é 10 - -::: grafik l14-array.svg -Cinco posições com os índices 0 a 4. O índice está por cima da posição, o valor lá dentro. -::: - -**Porquê começar em 0?** Na informática, o índice não é “que posição”, mas sim a **distância ao início**. A primeira posição está logo no início, portanto a 0 passos. A segunda está a 1 passo, a terceira a 2 passos. Conheces isto do elevador: o rés-do-chão é o **0**, e o primeiro andar fica um nível acima. - -Daqui sai uma regra que vale a pena decorar: com 5 posições, o **último índice é 4**, sempre um a menos do que o número de posições. - -::: angeberwissen -Contar a partir de 0 já é bem antigo. A linguagem de programação C, de 1972, já funciona assim: o computador sabe o endereço da primeira posição e, para \`numeros[i]\`, calcula simplesmente “início mais i posições”. Com i = 0 fica no início, o que poupa uma conta. Java, Python e JavaScript copiaram isto. Já agora, eu também conto os meus chifres a partir de 0: chifre 0 à esquerda, chifre 1 à direita. -::: - -Com o índice lês um valor ou escreves lá um novo: - -\`\`\` -output: numeros[0] -numeros[1] = 99 -\`\`\` - -> Um array com 5 posições tem os índices 0 a 4. \`numeros[5]\` não existe. A simulação indica então uma expressão inválida. - -## O comprimento de um array - -\`numeros.length\` diz-te quantas posições tem um array. Com cinco valores é 5. Por isso, o **último** índice é sempre \`numeros.length - 1\`: - -\`\`\` -output: numeros.length -output: numeros[numeros.length - 1] -\`\`\` - -A segunda linha mostra o último valor, seja qual for o comprimento do array. O VisuStruct também percebe \`numeros.length()\`. - -::: übung l14-erster-letzter -titel: Primeiro e último valor -auftrag: Cria o array \`int[] valores = {4, 8, 15, 16, 23, 42}\`. Depois mostra em três linhas: o primeiro valor, o último valor e o número de valores. - Para o último valor, usa o comprimento e não escrevas simplesmente o índice 5. -test: - -> 4 | 42 | 6 -braucht: anweisung -tipp: Começa-se a contar em 0, por isso a primeira posição tem o índice 0. E qual é o índice da última posição? -tipp: O primeiro valor é \`valores[0]\`. O último é \`valores[valores.length - 1]\`. O número de valores é \`valores.length\`. -lösung: l14-erster-letzter-loesung.visustruct -::: - -## Percorrer um array com um ciclo - -Um array mostra a sua força junto com um **ciclo for**. A variável contadora \`i\` vai de 0 até ao último índice e é usada como índice: - -\`\`\` -int i = 0 -i < numeros.length -i++ -\`\`\` - -Na primeira iteração \`i\` é 0, na última é 4. Como a condição é \`i < numeros.length\`, o ciclo serve para qualquer comprimento. - -::: diagramm l14-array-durchlaufen.visustruct -O ciclo for mostra os cinco valores um a seguir ao outro. Em Variáveis, na simulação, vê o i a contar de 0 a 4. -::: - -É também assim que enches um array vazio com entradas. Como destino da entrada escreves a posição \`nomes[i]\`: - -::: diagramm l14-namen-eingeben.visustruct -São pedidos três nomes, que são escritos nas posições 0, 1 e 2. -::: - -::: übung l14-rueckwaerts -titel: Mostrar ao contrário -auftrag: Cria um array para 4 números inteiros e lê os 4 números com um ciclo. Depois mostra-os pela ordem **inversa**, cada um na sua linha. -test: 1, 2, 3, 4 -> 4 | 3 | 2 | 1 -test: 7, 0, 5, 9 -> 9 | 5 | 0 | 7 -braucht: forSchleife -tipp: Precisas de dois ciclos: um para ler da frente para trás e outro para mostrar de trás para a frente. -tipp: Crias o array com \`int[] numeros = new int[4]\`. A entrada é \`input: numeros[i] "Introduz um número"\`. No segundo ciclo começas em \`int i = numeros.length - 1\`, verificas \`i >= 0\` e contas para trás com \`i--\`. -lösung: l14-rueckwaerts-loesung.visustruct -::: - -::: angeberwissen -**Hedy Lamarr**, nascida em Viena, era uma estrela de cinema famosa de Hollywood nos anos 40. Nos tempos livres gostava de inventar. Em 1942, juntamente com o compositor George Antheil, recebeu uma patente para uma ligação de rádio que o inimigo não conseguisse perturbar: o emissor e o recetor saltam juntos por uma lista de **88 frequências**, tantas como as teclas de um piano. A lista estava perfurada numa fita de papel, como o rolo de um piano automático. Os dois percorrem a mesma lista pela mesma ordem, tal como o teu ciclo percorre um array com \`i\`. Quem escuta ou perturba só uma frequência quase não apanha nada. - -Este método, o **salto de frequência** (em inglês *frequency hopping*), é usado hoje, por exemplo, no Bluetooth. Ela não o inventou sozinha, já havia ideias anteriores. Mas a sua patente é vista como uma precursora importante, e em 1997 recebeu um prémio por isso. -::: - -::: bild hedy-lamarr.jpg -Hedy Lamarr (1914–2000), atriz e inventora, 1944 (foto promocional: [desconhecido](https://commons.wikimedia.org/wiki/File:Hedy_Lamarr_Publicity_Photo_for_The_Heavenly_Body_1944.jpg), domínio público). -::: - -## Soma e máximo - -Há duas tarefas que aparecem sempre com arrays: - -- **Soma:** Começas com \`soma = 0\` e somas cada valor no ciclo. -- **Máximo:** Primeiro guardas o valor da posição 0 como o maior até agora. No ciclo verificas cada valor. Se for maior, passa a ser o novo máximo. - -::: diagramm l14-summe-maximum.visustruct -Soma e máximo numa única passagem. O máximo começa com pontos[0] e não com 0, para também estar certo com números negativos. -::: - -::: übung l14-summe-max -titel: Soma e máximo -auftrag: Lê 5 números inteiros para um array. Depois mostra **Soma: …** e na linha seguinte **Máximo: …**. -test: 3, 9, 2, 9, 1 -> Soma: 24 | Máximo: 9 -test: 10, 20, 30, 40, 50 -> Soma: 150 | Máximo: 50 -test: -5, -2, -9, -1, -3 -> Soma: -20 | Máximo: -1 -braucht: forSchleife, verzweigung -tipp: Percorre o array com um ciclo. Soma cada valor à soma e guarda o maior valor visto até agora. -tipp: Calcula a soma e o máximo em variáveis próprias e só os mostra no fim, p. ex. com \`output: "Soma: " + soma\`. Se o teu máximo começar em 0, o terceiro teste falha. -tipp: O esqueleto: criar o array e lê-lo com um ciclo. Depois \`int soma = 0\` e \`int max = numeros[0]\`. Um segundo ciclo calcula \`soma = soma + numeros[i]\`, e uma decisão \`numeros[i] > max\` põe \`max = numeros[i]\` no ramo true. No fim, as duas saídas. -lösung: l14-summe-max-loesung.visustruct -::: - -## Agora em Java - -Percorrer um array fica assim em Java: - -\`\`\`java editor -int[] numeros = {2, 4, 6, 8, 10}; -for (int i = 0; i < numeros.length; i++) { - System.out.println(numeros[i]); -} -\`\`\` - -- \`int[]\` quer dizer “array de números inteiros”. Os valores ficam entre chavetas. -- Um array vazio com 5 posições cria-se com \`new int[5]\`. -- \`numeros[i]\` é a posição com o índice \`i\`, \`numeros.length\` é o comprimento. - -Se mostrares o array inteiro, ou seja \`System.out.println(numeros);\`, o Java não mostra os números. Só vês um texto como \`[I@1b6d3586\`. É a **referência**, o sítio onde o array está guardado na memória. O conteúdo só aparece com \`Arrays.toString(numeros)\`, que dá \`[2, 4, 6, 8, 10]\`. Para isso escreves \`import java.util.Arrays;\` logo no início. - -::: übung l15-java-noten -titel: Soma das notas em Java -code: java -auftrag: Cria em Java o array \`notas\` com os valores 2, 3, 1 e 4. Soma todas as notas com um ciclo for e mostra **Soma: 10**. -test: - -> Soma: 10 -braucht: forSchleife -tipp: Cria \`int soma = 0;\` antes do ciclo. O ciclo vai de 0 até \`notas.length - 1\`. -tipp: \`int[] notas = {2, 3, 1, 4};\`, depois \`for (int i = 0; i < notas.length; i++) { soma = soma + notas[i]; }\` e no fim \`System.out.println("Soma: " + soma);\`. -lösung: l15-java-noten-loesung.visustruct -::: - -## Preenche os espaços: arrays - -::: lückentext -titel: Procurar o máximo -auftrag: O programa procura o maior valor do array. Preenche as palavras e os sinais que faltam. -\`\`\`java -[[int]][] valores = {3, 7, 1, 9, 4}; -int max = valores[0]; -[[for]] (int i = 1; i < valores.[[length]]; i++) { - if (valores[i] [[>]] max) { - max = valores[i]; - } -} -System.out.println("Máximo: " + max); -\`\`\` -erklärung: \`int[]\` é um array de números inteiros, \`valores.length\` é o seu comprimento. \`max\` começa com o primeiro valor e o ciclo compara todos os outros com ele. Saída: **Máximo: 9** -::: - -## Encontra o erro: temperaturas - -::: übung l15-java-fehler -titel: Corrigir a temperatura mais alta -code: java -auftrag: Em janeiro mediram-se as temperaturas -5, -2, -8 e -3 graus. O programa deve mostrar a mais alta, ou seja, **Temperatura mais alta: -2**. Mas diz 0 graus, embora nunca tenha estado tão quente. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l15-java-fehler-start.visustruct -test: - -> Temperatura mais alta: -2 -braucht: forSchleife, verzweigung -tipp: Com que valor começa \`max\`? Alguma das temperaturas é maior do que esse valor inicial? -tipp: \`max\` tem de começar com um valor do array: \`int max = temperaturas[0];\` -lösung: l15-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l15-java-laeuft-nicht -titel: Somar os pontos -code: java -auftrag: O array \`pontos\` contém 4, 7, 2 e 5. O programa deve somá-los todos e mostrar **Soma: 18**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l15-java-laeuft-nicht-start.visustruct -test: - -> Soma: 18 -braucht: forSchleife -tipp: A área Código sublinha a palavra errada a vermelho. Como se escreve o comprimento de um array? -tipp: \`length\` escreve-se todo em minúsculas: \`i < pontos.length\` -lösung: l15-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Cada programa tem **exatamente um erro** com arrays, e a bomba está a fazer tique-taque. Toca na linha errada antes de o tempo acabar. Se as partes de uma linha tiverem moldura, toca exatamente na parte errada. Seis rondas, 30 segundos cada. -zeit: 30 - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - for (int i = 0; i <= numeros.length; i++) { - System.out.println(numeros[i]); - } -frage: Deve mostrar os cinco valores. -fehler: 2 -stelle: i <= numeros.length -besser: for (int i = 0; i < numeros.length; i++) { -> Com \`<=\`, i vai até 5. A posição \`numeros[5]\` não existe. - -runde: - String[] nomes = {"Ada", "Ben", "Cem"}; - System.out.println(nomes[1]); -frage: Deve mostrar o primeiro nome, ou seja, Ada. -fehler: 2 -stelle: nomes[1] -besser: System.out.println(nomes[0]); -> Conta-se a partir de 0. \`nomes[1]\` já é o Ben. - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - System.out.println(numeros[numeros.length]); -frage: Deve mostrar o último valor, ou seja, 10. -fehler: 2 -stelle: numeros[numeros.length] -besser: System.out.println(numeros[numeros.length - 1]); -> O último índice é sempre um a menos do que o comprimento. - -runde: - int[] pontos = {3, 9, 2}; - int soma = 0; - for (int i = 0; i < pontos.length; i++) { - soma = pontos[i]; - } - System.out.println(soma); -frage: Deve mostrar a soma 14. -fehler: 4 -stelle: pontos[i] -besser: soma = soma + pontos[i]; -> Assim cada valor apaga o anterior, e no fim soma só tem 2. - -runde: - int[] pontos = {-5, -2, -9}; - int max = 0; - for (int i = 0; i < pontos.length; i++) { - if (pontos[i] > max) { - max = pontos[i]; - } - } - System.out.println(max); -frage: Deve mostrar o máximo -2. -fehler: 2 -stelle: 0 -besser: int max = pontos[0]; -> Nenhum dos números é maior do que 0, por isso max ficaria em 0. É por isso que o máximo começa com a primeira posição. - -runde: - int[] numeros = {2, 4, 6, 8, 10}; - for (int i = numeros.length; i >= 0; i--) { - System.out.println(numeros[i]); - } -frage: Deve mostrar os valores de trás para a frente, de 10 a 2. -fehler: 2 -stelle: int i = numeros.length -besser: for (int i = numeros.length - 1; i >= 0; i--) { -> De trás para a frente começa-se no último índice, que é \`numeros.length - 1\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar um array com valores ou com \`new int[5]\`. → Muitos valores com um só nome -- Consigo explicar que o índice começa em 0 e que o último índice é \`length - 1\`. → O índice começa em 0 -- Consigo percorrer e encher um array com um ciclo for. → Percorrer um array com um ciclo -- Consigo calcular a soma e o máximo de um array. → Soma e máximo -- Consigo criar um array em Java e percorrê-lo com um ciclo. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que mostra \`output: numeros[2]\` com \`int[] numeros = {5, 10, 15, 20}\`? -→ O índice começa em 0 -- [ ] 10 -- [x] 15 -- [ ] 20 -> Começa-se a contar em 0: numeros[0] é 5, numeros[1] é 10, numeros[2] é 15. - -? Um array tem 8 posições. Qual é o último índice? -→ O índice começa em 0 -- [ ] 8 -- [x] 7 -- [ ] 9 -> O último índice é sempre length - 1. - -? Que condição serve para um ciclo for que percorre todos os valores de \`numeros\` e começa em \`int i = 0\`? -→ Percorrer um array com um ciclo -- [x] i < numeros.length -- [ ] i <= numeros.length -- [ ] i > numeros.length -> Com <= o ciclo também leria numeros[length], e essa posição não existe. - -? Com que valor deve começar o máximo antes de o ciclo começar? -→ Soma e máximo -- [ ] Sempre com 0 -- [x] Com o primeiro valor do array -- [ ] Com o comprimento do array -> Se começar com 0, então só com números negativos o resultado seria 0, embora o 0 nem esteja no array. - -? O que mostra \`output: numeros.length\` com \`int[] numeros = {5, 10, 15, 20}\`? -→ Muitos valores com um só nome -- [ ] 3 -- [x] 4 -- [ ] 20 -> length é o número de posições, não o último índice nem o último valor. - -? Que linha cria em Java um array com três números? -→ Agora em Java -- [x] int[] numeros = {1, 2, 3}; -- [ ] int numeros = [1, 2, 3]; -- [ ] array numeros = (1, 2, 3); -::: -`,My=`--- -titel: Arrays bidimensionais -bereich: Fundamentos -kurz: Guardar valores em linhas e colunas, como os lugares de um cinema, e percorrê-los com dois ciclos encaixados. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar um array 2D e explicar o que significam os dois números -- ler e escrever uma posição com fila e lugar -- distinguir \`lugares.length\` de \`lugares[0].length\` -- explicar por que ordem dois ciclos encaixados visitam as posições -- criar e percorrer um array bidimensional em Java -::: - -## Um cinema como tabela - -Um cinema tem várias **filas**, e cada fila tem vários **lugares**. Para cada lugar queremos saber se o bilhete já foi vendido. É uma pergunta de sim ou não, por isso serve o tipo de dados \`boolean\`: \`true\` quer dizer vendido, \`false\` quer dizer livre. - -Um array normal é uma só fila de posições. Para o cinema precisamos de uma **tabela** com linhas e colunas. Isso é um **array bidimensional**, abreviado array 2D. Para isso escreves dois pares de parênteses retos: - -\`\`\` -boolean[][] lugares = new boolean[3][5] -\`\`\` - -Isto dá 3 filas com 5 lugares cada, ou seja, 15 posições. No início, todas as posições têm \`false\`: todos os lugares estão livres. - -::: grafik kino-saal.svg -O primeiro índice é a fila, o segundo é o lugar. Os dois contam-se a partir de 0. -::: - -## Chegar a uma posição - -Para uma posição precisas agora de **dois** índices: primeiro a fila, depois o lugar. - -\`\`\` -lugares[1][2] = true -\`\`\` - -Agora o lugar 2 da fila 1 está vendido. Ler funciona da mesma maneira: \`lugares[1][2]\` é agora \`true\`. - -Também podes perguntar o tamanho: - -- \`lugares.length\` é o número de **filas**, aqui 3. -- \`lugares[0].length\` é o número de **lugares** da fila 0, aqui 5. - -::: diagramm kino-verkaufen.visustruct -São vendidos três bilhetes. Depois, o diagrama mostra o tamanho do cinema e se a fila 1, lugar 2, está vendido. Repara em Variáveis, na simulação: lugares é mostrado fila a fila. -::: - -> Tal como num array normal, não existe a posição \`lugares[3][0]\`, porque as filas se chamam 0, 1 e 2. A simulação indica então uma expressão inválida. - -## Dois ciclos um dentro do outro - -Para olhar para **todos** os lugares, precisas de dois ciclos for, um dentro do outro: - -- O **ciclo exterior** conta a fila: \`fila\` vai de 0 a 2. -- O **ciclo interior** conta o lugar: \`lugar\` vai de 0 a 4. - -::: grafik kino-schleifen.svg -Azul é o ciclo exterior, laranja o interior. Os números mostram a ordem pela qual os lugares aparecem. -::: - -Para cada fila, o ciclo interior é executado **do princípio ao fim** uma vez. Só quando \`lugar\` passou pelos cinco lugares é que o ciclo exterior avança \`fila\` em um. Depois, \`lugar\` recomeça em 0. Assim, todos os 3 · 5 = 15 lugares aparecem exatamente uma vez. - -As condições são \`fila < lugares.length\` e \`lugar < lugares[fila].length\`. Assim os ciclos servem para um cinema de qualquer tamanho. - -::: diagramm kino-saalplan.visustruct -A planta da sala: para cada fila é montada e mostrada uma linha de X (vendido) e O (livre). Percorre-a com Passo e vê como lugar recomeça sempre do início, enquanto fila só vai contando devagar. -::: - -::: angeberwissen -Cada foto do telemóvel é um array 2D! Uma foto com 4000 · 3000 píxeis tem 3000 linhas com 4000 posições cada, ou seja, 12 milhões de píxeis. Cada posição guarda a cor de um ponto. Quando pões uma foto mais clara, o telemóvel percorre todos os píxeis com dois ciclos encaixados. A minha foto de perfil, já agora, só tem uma posição: castanho. -::: - -## Exercício: Contar lugares livres - -::: übung kino-frei -titel: Contar lugares livres -auftrag: No diagrama inicial já foram vendidos três bilhetes. Usa dois ciclos encaixados para contar quantos lugares ainda estão **livres** e mostra p. ex. \`Livres: 12\`. -start: kino-frei-start.visustruct -test: - -> Livres: 12 -braucht: forSchleife, verzweigung -tipp: Tal como na planta da sala, percorres todos os lugares com dois ciclos. Em vez de mostrares alguma coisa, contas. -tipp: Antes dos ciclos, cria \`int livres = 0\`. Um lugar está livre se \`lugares[fila][lugar]\` for false. A condição para isso é \`!lugares[fila][lugar]\`. -lösung: kino-frei-loesung.visustruct -::: - -## Exercício: Vender um bilhete - -::: übung kino-karte -titel: Vender um bilhete -auftrag: O diagrama inicial pede uma fila e um lugar. Se o lugar já estiver vendido, mostra \`Já vendido\`. Caso contrário, marca-o como vendido e mostra p. ex. \`Vendido: fila 0, lugar 4\`. -start: kino-karte-start.visustruct -test: 1, 2 -> Já vendido -test: 0, 4 -> Vendido: fila 0, lugar 4 -test: 2, 0 -> Vendido: fila 2, lugar 0 -braucht: verzweigung -tipp: Verifica primeiro se o lugar está vendido. Consoante a resposta, acontece uma coisa diferente. -tipp: Aqui não precisas de ciclo. Basta uma decisão com a condição \`lugares[fila][lugar]\`. No ramo false pões a posição a \`true\`. -lösung: kino-karte-loesung.visustruct -::: - -## Exercício: Tabela da tabuada - -::: übung kino-einmaleins -titel: Tabela da tabuada -auftrag: Cria \`int[][] tabela = new int[10][10]\` e enche-a com a tabuada até 10 usando dois ciclos. Depois pede dois números de 1 a 10 e lê o resultado da tabela, p. ex. \`3 · 4 = 12\`. -test: 3, 4 -> 3 · 4 = 12 -test: 7, 8 -> 7 · 8 = 56 -test: 10, 10 -> 10 · 10 = 100 -braucht: forSchleife -tipp: Primeiro, dois ciclos encaixados enchem a tabela; depois lês só uma única posição. -tipp: Os índices vão de 0 a 9, mas os números de 1 a 10. Por isso, a posição \`tabela[i][j]\` tem o valor \`(i + 1) * (j + 1)\`, e para 3 · 4 lês \`tabela[a - 1][b - 1]\`. -lösung: kino-einmaleins-loesung.visustruct -::: - -## Agora em Java - -A sala de cinema fica assim em Java: - -\`\`\`java editor -boolean[][] lugares = new boolean[3][5]; -lugares[0][2] = true; -lugares[1][1] = true; -lugares[1][2] = true; -System.out.println("Filas: " + lugares.length); -System.out.println("Lugares por fila: " + lugares[0].length); -System.out.println("Fila 1, lugar 2 vendido? " + lugares[1][2]); -\`\`\` - -- Dois pares de parênteses retos \`[][]\` representam uma tabela: primeiro a fila, depois o lugar. -- \`lugares.length\` é o número de filas, \`lugares[0].length\` o número de lugares numa fila. -- Com valores fixos, escreves cada fila nas suas próprias chavetas: \`int[][] t = {{1, 2}, {3, 4}};\` - -::: übung l16-java-punkte -titel: Somar os pontos -code: java -auftrag: Três jogadores jogaram duas rondas cada um. Cria em Java a tabela \`pontos\` com as filas {3, 5}, {4, 1} e {2, 2}. Soma todos os pontos com dois ciclos for encaixados e mostra **Soma: 17**. -test: - -> Soma: 17 -braucht: forSchleife -tipp: O ciclo exterior percorre as filas, o interior os lugares de uma fila. -tipp: \`int[][] pontos = {{3, 5}, {4, 1}, {2, 2}};\` e no ciclo interior \`soma = soma + pontos[i][j];\`. O ciclo interior vai até \`pontos[i].length\`. -lösung: l16-java-punkte-loesung.visustruct -::: - -## Preenche os espaços: tabelas - -::: lückentext -titel: Somar todos os campos -auftrag: O programa soma todos os números da tabela. Preenche as palavras e os sinais que faltam. -\`\`\`java -[[int]][][] campo = {{1, 2, 3}, {4, 5, 6}}; -int soma = 0; -for (int l = 0; l < campo.[[length]]; l++) { - for (int c = 0; c < campo[l].[[length]]; c++) { - soma = soma [[+]] campo[l][c]; - } -} -System.out.println("Soma: " + soma); -\`\`\` -erklärung: \`int[][]\` é uma tabela. \`campo.length\` é o número de linhas (2), \`campo[l].length\` o número de campos na linha \`l\` (3). Saída: **Soma: 21** -::: - -## Encontra o erro: pontos - -::: übung l16-java-fehler -titel: Corrigir o jogador 2 -code: java -auftrag: Na tabela \`pontos\`, cada linha corresponde a um jogador. O programa deve somar os pontos do jogador 2 (linha 1), ou seja, **Jogador 2: 11**. Em vez disso, dá um erro. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l16-java-fehler-start.visustruct -test: - -> Jogador 2: 11 -braucht: forSchleife -tipp: Em \`pontos[a][b]\`, \`a\` é a linha e \`b\` o lugar na linha. Que número corresponde à linha do jogador 2? -tipp: Os índices estão trocados: \`pontos[1][j]\` em vez de \`pontos[j][1]\`. -lösung: l16-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l16-java-laeuft-nicht -titel: Ler a pontuação -code: java -auftrag: Na tabela \`pontos\` cada linha é um jogador e cada coluna uma ronda. O programa deve mostrar os pontos do jogador 2 na ronda 1, ou seja, **Jogador 2, ronda 1: 4**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l16-java-laeuft-nicht-start.visustruct -test: - -> Jogador 2, ronda 1: 4 -braucht: anweisung -tipp: As posições \`[1][0]\` estão certas. Olha para o nome da tabela. -tipp: A tabela chama-se \`pontos\` com p minúsculo: \`pontos[1][0]\` -lösung: l16-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Que lugar? - -::: spiel frage -titel: Jogo: Que lugar? -intro: O Ludwig vende bilhetes de cinema. Primeiro a fila, depois o lugar, ambos a partir de 0. Sete rondas. - -runde: - boolean[][] lugares = new boolean[3][5]; - System.out.println(lugares.length); -frage: O que aparece? -- [x] 3 -- 5 -- 15 -> \`lugares.length\` é o número de filas. - -runde: - boolean[][] lugares = new boolean[3][5]; - System.out.println(lugares[0].length); -frage: O que aparece? -- 3 -- [x] 5 -- 15 -> \`lugares[0]\` é a fila 0. O seu comprimento é o número de lugares nessa fila. - -runde: - int[][] tabela = new int[4][6]; -frage: Quantas posições tem a tabela? -- 10 -- [x] 24 -- 35 -> 4 filas com 6 lugares cada: 4 · 6 = 24. - -runde: - int[][] t = {{1, 2}, {3, 4}}; - System.out.println(t[1][0]); -frage: O que aparece? -- 2 -- [x] 3 -- 4 -> A fila 1 é \`{3, 4}\`, e o lugar 0 dela é o 3. - -runde: - boolean[][] lugares = new boolean[3][5]; - lugares[3][0] = true; -frage: O que acontece? -- O primeiro lugar da fila 3 fica vendido. -- O primeiro lugar da última fila fica vendido. -- [x] Há um erro, porque as filas são 0, 1 e 2. -> Tal como num array normal, o último índice é um a menos do que o comprimento. - -runde: - int[][] t = {{1, 2, 3}, {4, 5, 6}}; - int soma = 0; - for (int fila = 0; fila < t.length; fila++) { - for (int lugar = 0; lugar < t[fila].length; lugar++) { - soma = soma + t[fila][lugar]; - } - } - System.out.println(soma); -frage: O que aparece? -- 6 -- 15 -- [x] 21 -> Os dois ciclos passam pelas seis posições: 1 + 2 + 3 + 4 + 5 + 6 = 21. - -runde: -frage: Dois ciclos percorrem a sala \`new boolean[3][5]\`. Que posição vem logo a seguir a \`lugares[0][4]\`? -- \`lugares[0][5]\` -- [x] \`lugares[1][0]\` -- \`lugares[1][4]\` -> A fila 0 terminou. O ciclo exterior avança, e o lugar recomeça em 0. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar um array 2D e explicar o que significam os dois números. → Um cinema como tabela -- Consigo ler e escrever uma posição com fila e lugar. → Chegar a uma posição -- Consigo distinguir \`lugares.length\` de \`lugares[0].length\`. → Chegar a uma posição -- Consigo explicar por que ordem dois ciclos encaixados visitam as posições. → Dois ciclos um dentro do outro -- Consigo criar e percorrer um array bidimensional em Java. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? Quantas posições tem \`boolean[][] lugares = new boolean[4][6]\`? -→ Um cinema como tabela -- [ ] 10 -- [x] 24 -- [ ] 46 -> 4 filas com 6 lugares cada: 4 · 6 = 24. - -? O que está em todas as posições depois de \`new boolean[3][5]\`? -→ Um cinema como tabela -- [ ] true -- [x] false -- [ ] Nada, as posições estão vazias -> Um array boolean novo é enchido com false. No cinema isso quer dizer: todos os lugares estão livres. - -? Dois ciclos encaixados percorrem 3 filas com 5 lugares. Quantas vezes é executado o interior do ciclo **interior**? -→ Dois ciclos um dentro do outro -- [ ] 3 vezes -- [ ] 8 vezes -- [x] 15 vezes -> Para cada uma das 3 filas, o ciclo interior é executado 5 vezes: 3 · 5 = 15. - -? Associa o que cada expressão significa no cinema. -→ Chegar a uma posição -= lugares.length -> Número de filas -= lugares[0].length -> Número de lugares da fila 0 -= lugares[2][4] -> Fila 2, lugar 4 -= lugares[1][0] = true -> O lugar 0 da fila 1 está vendido - -? O que dá \`lugares.length\` para \`new boolean[3][5]\`? -→ Chegar a uma posição -- [x] 3, o número de filas -- [ ] 5, o número de lugares -- [ ] 15, todos os lugares juntos -::: -`,Zy=`--- -titel: Strings -bereich: Fundamentos -kurz: Trabalhar com texto: ler caracteres, recortar partes, pesquisar, comparar e dividir. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar que os caracteres de uma String também se contam a partir de 0 -- trabalhar com \`length()\` e \`charAt(i)\` -- distinguir um \`char\` de uma String e usar o código de caractere com \`(int)\` e \`(char)\` -- recortar uma parte de um texto com \`substring\` -- usar \`indexOf\`, \`contains\`, \`toUpperCase\` e \`equals\` -- percorrer um texto caractere a caractere com um ciclo -- dividir um texto num array de Strings com \`split\` -- ler um texto em Java e compará-lo com \`equals\` -- usar mais métodos, como \`lastIndexOf\`, \`replace\`, \`compareTo\` e \`Integer.parseInt\` -- dividir o texto de um ficheiro em linhas com \`split("\\n")\` -- consultar um método na API do Java e ler a sua descrição -::: - -## Um texto é uma fila de caracteres - -Já conheces \`String\`: \`String nome = "Ludwig"\`. Na informática, um texto destes chama-se **string** (em inglês, “fio”), porque os caracteres ficam pendurados uns a seguir aos outros como contas num fio. Também se diz **cadeia de caracteres**. Cada caractere tem um lugar com um índice, tal como num array. Também aqui **se começa a contar em 0**: o primeiro caractere está a 0 passos do início. - -::: grafik zk-zeichen.svg -Os dez caracteres de “Passatempo” com os seus índices de 0 a 9. -::: - -Uma String traz consigo **métodos**. Escreves o nome da variável, um ponto e o método: - -- \`palavra.length()\` dá o número de caracteres, aqui 10. -- \`palavra.charAt(0)\` dá o caractere com o índice 0, aqui \`'P'\`. - -> Nas Strings escreves \`length()\` **com** parênteses, nos arrays \`length\` **sem**. Infelizmente, o Java é mesmo assim. - -Tal como num array, o último caractere tem o índice \`length() - 1\`. - -## Um único caractere: char - -Para um único caractere, o Java tem um tipo de dados próprio: **char**, abreviatura do inglês *character* (caractere). Um \`char\` fica entre aspas **simples**, uma String entre aspas duplas: - -- \`'C'\` é um \`char\`: exatamente um caractere. -- \`"C"\` é uma String: um texto que só tem um caractere. -- Um \`char\` tem sempre exatamente um caractere. Não existe um \`char\` vazio como \`''\`, mas uma String vazia \`""\` existe. - -\`charAt\` dá-te um caractere destes a partir de um texto: - -\`\`\` -char primeiro = palavra.charAt(0) -char ultimo = palavra.charAt(palavra.length() - 1) -\`\`\` - -Dois \`char\` comparas com \`==\`: \`palavra.charAt(0) == 'P'\` é \`true\`. - -Por trás de cada caractere há um número, o seu **código de caractere**. Que número pertence a que caractere está na tabela ASCII: \`'A'\` tem o código 65, \`'B'\` 66, \`'C'\` 67 e assim por diante até \`'Z'\` com 90. Com \`(int)\` obténs o código de um caractere, com \`(char)\` um código volta a ser um caractere: - -\`\`\` -int codigo = (int) 'C' -codigo = codigo + 1 -char seguinte = (char) codigo -\`\`\` - -Depois disto, \`codigo\` vale 68 e \`seguinte\` é \`'D'\`. Assim deslocas uma letra no alfabeto, e é exatamente isso que vais precisar mais tarde na cifra de César. - -## Recortar partes - -Com \`substring\` recortas uma parte do texto: - -- \`palavra.substring(0, 5)\` dá os caracteres desde o índice 0 **até mesmo antes** do índice 5, ou seja, \`"Passa"\`. -- \`palavra.substring(5)\` dá tudo desde o índice 5 até ao fim, ou seja, \`"tempo"\`. - -O fim **não** está incluído. Dá jeito: \`substring(0, 5)\` dá exatamente 5 caracteres. - -::: diagramm zk-zeichen.visustruct -Todos os métodos desta lição num exemplo. Percorre-o na simulação e compara cada saída com a imagem. -::: - -## Pesquisar e comparar - -Mais métodos de que precisas muitas vezes: - -| Método | Significado | Exemplo com \`"Passatempo"\` | -|---|---|---| -| \`indexOf("tempo")\` | Onde começa o texto? | 5 | -| \`indexOf("x")\` | não encontrado | -1 | -| \`contains("sat")\` | O texto aparece? | true | -| \`toUpperCase()\` | tudo em maiúsculas | PASSATEMPO | -| \`toLowerCase()\` | tudo em minúsculas | passatempo | -| \`equals("Passatempo")\` | o mesmo texto? | true | - -> Em Java comparas duas Strings com \`equals\`, não com \`==\`. Já dois caracteres (\`char\`) comparas com \`==\`, p. ex. \`palavra.charAt(i) == 'a'\`. - -::: angeberwissen -Experimenta \`"Ludwig".equals("ludwig")\`. A resposta é false! Para um computador, L e l são caracteres completamente diferentes. Lá dentro, cada caractere é guardado como um número: L é 76 e l é 108. Esta numeração chama-se ASCII e é de 1963. Mééé, portanto, para um computador, Ludwig e ludwig são dois bodes diferentes. Eu sou o do L maiúsculo. -::: - -## Caractere a caractere - -Com um ciclo for percorres um texto caractere a caractere. O índice \`i\` vai de 0 a \`palavra.length() - 1\`, tal como num array: - -::: diagramm zk-zaehlen.visustruct -Conta quantas vezes aparece a letra a. Na simulação, experimenta “banana” e observa i e quantidade. -::: - -## Dividir com split - -Muitas vezes há várias informações numa só linha, separadas por um caractere, p. ex. \`"Ludwig;bode;7"\`. Com \`split\` cortas a linha nesse caractere. O resultado é um **array de Strings**: - -\`\`\` -String[] partes = linha.split(";") -\`\`\` - -Depois disso, \`partes[0]\` é \`"Ludwig"\`, \`partes[1]\` é \`"bode"\` e \`partes[2]\` é \`"7"\`. Com \`partes.length\` descobres quantas partes há. - -::: diagramm zk-split.visustruct -A linha é dividida no ponto e vírgula, e cada parte é mostrada com o seu índice. -::: - -> Os ficheiros CSV, que conheces das folhas de cálculo, são feitos da mesma maneira: uma linha por registo, com os valores separados por vírgula ou ponto e vírgula. - -## Exercício: Iniciais - -::: übung zk-initialen -titel: Iniciais -auftrag: Pede um nome próprio e um apelido e mostra as iniciais. Ou seja, para Ludwig Bode fica \`L. B.\` -test: Ludwig, Bode -> L. B. -test: Ada, Lovelace -> A. L. -test: Ben, Shneiderman -> B. S. -braucht: anweisung -tipp: A inicial é a primeira letra de um nome. Que método dá o caractere numa determinada posição? -tipp: \`nome.charAt(0)\` dá a primeira letra. A saída fica então \`nome.charAt(0) + ". " + apelido.charAt(0) + "."\` -lösung: zk-initialen-loesung.visustruct -::: - -## Exercício: Ao contrário - -::: übung zk-rueckwaerts -titel: Ao contrário -auftrag: Pede uma palavra e mostra-a ao contrário. Ludwig passa a \`giwduL\`. -test: Ludwig -> giwduL -test: Ana -> anA -test: a -> a -braucht: forSchleife -tipp: Percorre a palavra caractere a caractere, mas de trás para a frente, e vai construindo um novo texto. -tipp: Cria \`String invertida = ""\`. O ciclo começa no último índice \`palavra.length() - 1\` e conta para trás até 0 com \`i--\`. Em cada iteração acrescentas \`palavra.charAt(i)\` no fim. -tipp: O esqueleto: entrada \`palavra\`, depois \`String invertida = ""\`. Ciclo for com início \`int i = palavra.length() - 1\`, condição \`i >= 0\` e passo \`i--\`. Dentro, \`invertida = invertida + palavra.charAt(i)\`. Por baixo do ciclo, \`output: invertida\`. -lösung: zk-rueckwaerts-loesung.visustruct -::: - -## Exercício: Contar palavras - -::: übung zk-woerter -titel: Contar palavras -auftrag: Pede uma frase e mostra quantas palavras tem, p. ex. \`Palavras: 5\` para “O Ludwig é um bode”. As palavras estão separadas por exatamente um espaço. -test: O Ludwig é um bode -> Palavras: 5 -test: Olá -> Palavras: 1 -test: Eu gosto de cabras -> Palavras: 4 -braucht: anweisung -tipp: Entre as palavras há sempre um espaço. Que método divide um texto num caractere? -tipp: Divide a frase num array de Strings com \`frase.split(" ")\`. O seu comprimento é o número de palavras. -tipp: O programa todo tem três blocos: a entrada \`frase\`, depois \`String[] palavras = frase.split(" ")\` e no fim \`output: "Palavras: " + palavras.length\`. -lösung: zk-woerter-loesung.visustruct -::: - -## Agora em Java - -Os métodos desta lição já são Java. Um programa completo com um texto fica assim: - -\`\`\`java editor -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Como te chamas?"); -String nome = scanner.next(); -System.out.println("Olá " + nome.toUpperCase() + "!"); -System.out.println("O teu nome tem " + nome.length() + " letras."); -\`\`\` - -- \`scanner.next()\` lê uma palavra, ou seja, texto até ao próximo espaço. Para números continuas a usar \`scanner.nextInt()\`. -- O texto fica entre aspas **duplas** \`"Ludwig"\`, um único carácter entre aspas **simples** \`'L'\`. -- Depois de \`length()\`, \`toUpperCase()\` e dos outros métodos há sempre parênteses curvos, mesmo quando não há nada lá dentro. -- Comparas dois textos com \`equals\`. Cada letra conta: \`"Ludwig".equals("ludwig")\` é false. - -::: übung l17-java-passwort -titel: Verificar a palavra-passe -code: java -auftrag: Escreve em Java um programa que pergunta pela palavra-passe. Se for **Ludwig**, mostra **Bem-vindo!**, senão **Palavra-passe errada**. - Atenção às maiúsculas e minúsculas: \`ludwig\` está errado. -test: Ludwig -> Bem-vindo! -test: ludwig -> Palavra-passe errada -test: Geißbock -> Palavra-passe errada -braucht: verzweigung -tipp: Lê a palavra-passe com \`scanner.next()\` para uma variável String. Depois comparas numa decisão. -tipp: A condição é \`entrada.equals("Ludwig")\`. Em Java, \`==\` não compara textos de forma fiável. -lösung: l17-java-passwort-loesung.visustruct -::: - -## Preenche os espaços: textos - -::: lückentext -titel: Analisar uma palavra -auftrag: Preenche os métodos e as palavras que faltam. -\`\`\`java -import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Uma palavra?"); -[[String]] palavra = scanner.next(); -System.out.println("Comprimento: " + palavra.[[length]]()); -System.out.println("Maiúsculas: " + palavra.[[toUpperCase]]()); -System.out.println("Primeira letra: " + palavra.[[charAt]](0)); -if (palavra.[[equals]]("Ludwig")) { - System.out.println("Olá Ludwig!"); -} -\`\`\` -erklärung: \`length()\` conta os carateres, \`toUpperCase()\` põe tudo em maiúsculas, \`charAt(0)\` dá o primeiro caráter. Textos comparas com \`equals\`, não com \`==\`. -::: - -## Encontra o erro: iniciais - -::: übung l17-java-fehler -titel: Corrigir as iniciais -code: java -auftrag: O programa lê o nome próprio e o apelido e deve mostrar as iniciais. Para Ludwig Geißbock é **L. G.** Mas mostra **u. e.** - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l17-java-fehler-start.visustruct -test: Ludwig, Geißbock -> L. G. -test: Mia, Meyer -> M. M. -test: Ada, Lovelace -> A. L. -braucht: anweisung -tipp: Em que índice começa o Java a contar? -tipp: O primeiro caráter tem o índice 0: \`nome.charAt(0)\` e \`apelido.charAt(0)\`. -lösung: l17-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l17-java-laeuft-nicht -titel: Contar as letras -code: java -auftrag: O programa deve mostrar a primeira letra e o comprimento de **Ludwig**, ou seja, **L tem 6 letras**. Mas não corre, porque há dois métodos mal escritos. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l17-java-laeuft-nicht-start.visustruct -test: - -> L tem 6 letras -braucht: anweisung -tipp: Os nomes dos métodos também são camelCase: começam com minúscula e cada palavra seguinte começa com maiúscula. -tipp: O correto é \`nome.charAt(0)\` com A maiúsculo e \`nome.length()\` todo em minúsculas. -lösung: l17-java-laeuft-nicht-loesung.visustruct -::: - -## Ainda mais métodos - -Uma String sabe fazer muito mais. Também vais precisar muitas vezes destes métodos: - -| Método | Significado | Exemplo | Resultado | -|---|---|---|---| -| \`lastIndexOf("a")\` | Onde está o último a? | \`"Passatempo".lastIndexOf("a")\` | 4 | -| \`isEmpty()\` | O texto está vazio? | \`"".isEmpty()\` | true | -| \`equalsIgnoreCase(…)\` | o mesmo texto, sem contar maiúsculas e minúsculas? | \`"Passatempo".equalsIgnoreCase("PASSATEMPO")\` | true | -| \`replace(antigo, novo)\` | substitui todas as ocorrências | \`"Passatempo".replace("tempo", "porte")\` | Passaporte | -| \`repeat(n)\` | o texto n vezes seguidas | \`"Mé".repeat(3)\` | MéMéMé | -| \`concat(…)\` | junta texto no fim, como \`+\` | \`"Passa".concat("tempo")\` | Passatempo | -| \`compareTo(…)\` | Qual vem primeiro no alfabeto? | \`"Anna".compareTo("Ben")\` | -1 | - -\`compareTo\` devolve um número: **negativo** se o texto vem antes no alfabeto, **0** se os dois são iguais e **positivo** se vem depois. Assim podes ordenar nomes. - -Dois métodos não pertencem a um texto, mas a uma classe. Por isso, à frente fica o nome da classe: - -- \`Integer.parseInt("7")\` transforma o texto "7" no número 7. Com ele já podes fazer contas. -- \`String.valueOf(7)\` transforma o número 7 no texto "7". - -::: diagramm zk-mehr.visustruct -Todos os métodos novos num só exemplo. Percorre-o na simulação e compara cada saída com a tabela. -::: - -## Texto de um ficheiro - -Os programas recebem muitas vezes o texto de um **ficheiro**. A Princesa Zora escreveu uma carta ao Ludwig. Ela está pronta no ficheiro \`carta.txt\`: - -::: datei carta.txt -Querido Ludwig, -a raposa fechou-me na sua torre. -A porta tem um cadeado com uma palavra secreta. -Só encontras a palavra com Java. -Ajuda-me, por favor! -A tua Princesa Zora -::: - -Estas linhas leem o ficheiro inteiro para uma String: - -\`\`\` -import java.nio.file.*; - -String carta = Files.readString(Path.of("carta.txt")); -\`\`\` - -Como a leitura funciona ao certo, vais aprender mais tarde, numa lição só sobre ficheiros. Por agora basta: depois disto, a carta inteira está em \`carta\`, com todas as linhas. - -No fim de cada linha há um carácter invisível para a **mudança de linha**. Em Java escreve-se \`"\\n"\`. Por isso, \`carta.split("\\n")\` divide a carta nas suas linhas. - -::: übung l17-java-brief -titel: Onde está a raposa? -code: java -auftrag: O código inicial já lê a carta. Divide-a em linhas e mostra **Linhas:** e o número de linhas. Depois procura a linha onde está **raposa** e mostra **Raposa na linha** e o seu número. A primeira linha tem o número 1. -start: l17-java-brief-start.visustruct -test: - -> Linhas: 6 | Raposa na linha 2 -braucht: forSchleife, verzweigung -tipp: \`String[] linhas = carta.split("\\n");\` divide a carta. Depois, um ciclo for percorre todas as linhas. -tipp: No ciclo verificas \`linhas[i].contains("raposa")\`. O índice começa em 0, por isso mostras \`(i + 1)\`. Os parênteses são precisos para o Java fazer a conta em vez de juntar 1 ao texto. -lösung: l17-java-brief-loesung.visustruct -::: - -## A API do Java - -Ninguém sabe todos os métodos de cor, nem os profissionais. Eles consultam a **API do Java**. API significa Application Programming Interface. É a descrição de tudo o que o Java já traz consigo. - -Todos os métodos de String estão aqui: [String na API do Java](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) - -Desce até à tabela **Method Summary**. Cada linha descreve um método: - -| Coluna | Exemplo | Significado | -|---|---|---| -| Modifier and Type | \`int\` | O que o método devolve | -| Method | \`lastIndexOf(String str)\` | Nome e parâmetros com o seu tipo de dados | -| Description | Returns the index within this string of the last occurrence … | O que o método faz | - -A API está em inglês. O teu browser pode traduzir a página. Os nomes dos métodos ficam em inglês, porque é assim que os escreves em Java. - -::: ludwig -A página é muito comprida. Com Ctrl+F (no Mac ⌘+F) procuras o nome do método e chegas lá logo. -::: - -Consulta estes métodos. Não estão nesta lição: - -::: quiz -? Consulta \`strip()\`. O que faz o método? -- [ ] Remove todos os espaços do texto. -- [x] Remove os espaços no início e no fim. -- [ ] Corta o último carácter. -> Como \`trim()\`. Mas \`strip()\` também conhece espaços especiais de outras escritas. - -? Consulta \`isBlank()\`. O que devolve \`" ".isBlank()\`? -- [x] true -- [ ] false -- [ ] 3 -> isBlank verifica se o texto está vazio ou só tem espaços. Já \`" ".isEmpty()\` seria false. - -? Consulta \`toCharArray()\`. Que tipo de dados devolve o método? -- [ ] String -- [ ] String[] -- [x] char[] -> Um array com todos os caracteres do texto, uma posição para cada carácter. - -? Consulta \`indexOf\` com dois parâmetros. O que devolve \`"Passatempo".indexOf("a", 2)\`? -- [ ] 1 -- [x] 4 -- [ ] -1 -> A pesquisa só começa no índice 2. O primeiro a a partir daí está no índice 4. - -? Consulta \`startsWith\`. Que tipo de dados devolve o método? -- [x] boolean -- [ ] int -- [ ] String -> Na coluna “Modifier and Type” está boolean: a resposta é true ou false. -::: - -## Jogo: Salvar a princesa - -Agora ajudas o Ludwig. A raposa fechou a princesa Zora na sua torre, e o portão só abre com uma palavra secreta. - -::: spiel prinzessin -titel: Jogo: Salvar a princesa -intro: No caminho para a torre, o Ludwig passa por **seis estações**. Em cada uma há um pedaço de código Java, e sai um número. Com \`alphabet.charAt(numero)\` o número transforma-se numa letra, que vai para as **palavras cruzadas**. Resolve-as, e os quadrados amarelos formam a palavra secreta para o portão. - -station: No fosso - String nome = " Zora "; - int numero = nome.trim().length(); -frage: Que número fica em \`numero\`? -zahl: 4 -feld: 5 1 -tipp: \`trim()\` corta os espaços no início e no fim. Depois conta os caracteres. -> Depois do \`trim()\` fica só \`"Zora"\`, que tem 4 caracteres. - -station: Na floresta da raposa - String lugar = "A raposa"; - int numero = lugar.length(); -frage: Que número fica em \`numero\`? -zahl: 8 -feld: 4 4 -tipp: \`length()\` conta todos os caracteres, também o espaço. -> O A, o espaço e r-a-p-o-s-a dão 8 caracteres. - -station: Na rocha das cabras - String texto = "Ludwig o bode"; - int numero = texto.indexOf(" "); -frage: Que número fica em \`numero\`? -zahl: 6 -feld: 4 6 -tipp: \`indexOf\` devolve a posição do primeiro espaço. O L tem o índice 0. -> L u d w i g tem os índices 0 a 5, por isso o primeiro espaço está no índice 6. - -station: Na escada da torre - String palavra = "Princesa"; - int numero = palavra.indexOf("a", 5); -frage: Que número fica em \`numero\`? Procura \`indexOf(String str, int fromIndex)\` na API do Java. -zahl: 7 -feld: 6 6 -tipp: A pesquisa começa no índice 5. Escreve os índices por baixo das letras. -> P r i n c e s a tem os índices 0 a 7. A partir do índice 5, o primeiro “a” está no 7. - -station: Diante da toca da raposa - int numero = "Zora".compareTo("Zoe"); -frage: Que número fica em \`numero\`? -zahl: 13 -feld: 1 9 -tipp: \`compareTo\` procura a primeira posição em que os textos são diferentes e subtrai os códigos dos caracteres. \`'r'\` é 114, \`'e'\` é 101. -> “Zo” é igual, depois vem \`'r'\` contra \`'e'\`: 114 − 101 = 13. - -station: No portão da torre - int numero = Integer.parseInt("1" + "1") / 5; -frage: Que número fica em \`numero\`? -zahl: 2 -feld: 6 5 -tipp: Primeiro os textos são juntados, depois passam a número. Com \`int\`, a divisão deita fora o resto. -> \`"1" + "1"\` é \`"11"\`, o \`parseInt\` faz disso 11, e 11 / 5 dá 2 com números inteiros. - -kreuzwort: As letras azuis já as tens. Preenche os outros quadrados com termos do Java. Clica numa pista para saltar para a palavra. -- → 1 3 BOOLEAN: Tipo de dados para verdadeiro ou falso -- → 4 1 STRING: Tipo de dados para texto -- → 6 5 CHAR: Tipo de dados para um único carácter -- ↓ 1 6 LENGTH: Método que conta os caracteres de uma string -- ↓ 2 1 ELSE: A parte “senão” de uma decisão -- ↓ 3 3 BREAK: Sai imediatamente de um ciclo -lösung: 1 3, 4 3, 2 6, 6 7, 7 3 - -tor: O Ludwig está diante do portão. A fechadura compara a tua palavra com \`equals\`. Escreve a palavra secreta. - String palavra = "___"; - if (palavra.equals(palavraSecreta)) { - portao.abrir(); - } -ende: A Zora está livre, e a raposa fugiu a correr. A palavra secreta era \`BREAK\`: com \`break\` sai-se de qualquer ciclo, e a Zora sai da torre. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar que os caracteres de uma String também se contam a partir de 0. → Um texto é uma fila de caracteres -- Consigo trabalhar com \`length()\` e \`charAt(i)\`. → Um texto é uma fila de caracteres -- Consigo distinguir um \`char\` de uma String e usar o código de caractere com \`(int)\` e \`(char)\`. → Um único caractere: char -- Consigo recortar uma parte de um texto com \`substring\`. → Recortar partes -- Consigo usar \`indexOf\`, \`contains\`, \`toUpperCase\` e \`equals\`. → Pesquisar e comparar -- Consigo percorrer um texto caractere a caractere com um ciclo. → Caractere a caractere -- Consigo dividir um texto num array de Strings com \`split\`. → Dividir com split -- Consigo ler um texto em Java e compará-lo com \`equals\`. → Agora em Java -- Consigo usar mais métodos, como \`lastIndexOf\`, \`replace\`, \`compareTo\` e \`Integer.parseInt\`. → Ainda mais métodos -- Consigo dividir o texto de um ficheiro em linhas com \`split("\\n")\`. → Texto de um ficheiro -- Consigo consultar um método na API do Java e ler a sua descrição. → A API do Java -::: - -## Teste de conhecimentos - -::: quiz -? Quanto dá \`"Ludwig".charAt(1)\`? -→ Um texto é uma fila de caracteres -- [ ] L -- [x] u -- [ ] d -> Começa-se a contar em 0: L tem o índice 0, u o índice 1. - -? O que é \`'C'\`? -→ Um único caractere: char -- [x] um \`char\`, ou seja, exatamente um caractere -- [ ] uma String -- [ ] uma variável chamada C -> Aspas simples indicam um único caractere, um \`char\`. \`"C"\` entre aspas duplas seria uma String. - -? \`'A'\` tem o código de caractere 65. Quanto dá \`(char) 67\`? -→ Um único caractere: char -- [ ] 'B' -- [x] 'C' -- [ ] 67 -> 65 é A, 66 é B, 67 é C. Com \`(char)\` o código volta a ser um caractere. - -? Quanto dá \`"Estrutura".substring(0, 6)\`? -→ Recortar partes -- [x] Estrut -- [ ] Estrutu -- [ ] strutu -> Os caracteres com os índices 0 a 5. O fim 6 não está incluído. - -? Uma palavra tem 7 caracteres. Que índice tem o último caractere? -→ Um texto é uma fila de caracteres -- [ ] 7 -- [x] 6 -- [ ] 8 -> Tal como num array: sempre um a menos do que o comprimento. - -? Como comparas duas Strings quanto ao conteúdo em Java? -→ Pesquisar e comparar -- [ ] a == b -- [x] a.equals(b) -- [ ] a = b - -? Associa cada método ao que dá para \`"Passatempo"\`. -→ Pesquisar e comparar -= length() -> 10 -= charAt(0) -> P -= indexOf("tempo") -> 5 -= substring(5) -> tempo - -? Que condição verifica em Java se \`entrada\` contém o texto Ludwig? -→ Agora em Java -- [ ] entrada = "Ludwig" -- [ ] entrada == 'Ludwig' -- [x] entrada.equals("Ludwig") -> Comparas textos com equals. As aspas simples são só para um único carácter. - -? O que devolve \`Integer.parseInt("12") + 1\`? -→ Ainda mais métodos -- [ ] "121" -- [x] 13 -- [ ] uma mensagem de erro -> parseInt transforma o texto num número. Depois o Java faz a conta normalmente. -::: -`,Ly=`--- -titel: Chamada e interrupção -bereich: Fundamentos -kurz: Dividir tarefas grandes em subprogramas e sair mais cedo dos ciclos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dividir uma tarefa grande em problemas mais pequenos -- inserir uma chamada e construir um subprograma num separador próprio -- passar valores a um subprograma com parâmetros -- devolver um valor de retorno com return e guardá-lo ao chamar -- explicar porque é que um subprograma não consegue alterar um número, mas consegue alterar um array -- explicar o que faz uma Interrupção e porque está numa decisão -- terminar um ciclo com uma Interrupção ou através da sua condição -- reconhecer um método em Java e sair de um ciclo com \`break\` -::: - -## Dividir tarefas grandes - -Os estrutogramas compridos ficam depressa confusos. Por isso divides uma tarefa grande em **problemas mais pequenos**. Cada problema mais pequeno tem um nome próprio e um estrutograma próprio, um **subprograma**. - -Um quiz, por exemplo, tem três partes: dar as boas-vindas, fazer as perguntas, mostrar o resultado. O programa principal só nomeia estas três partes: - -::: diagramm l15-hauptprogramm.visustruct -O programa principal é feito só de três chamadas. O que acontece em cada parte está num estrutograma próprio. -::: - -Assim vês num relance como o programa está construído. Os pormenores estão noutro sítio. - -## A chamada - -Uma **chamada** é um bloco com linhas verticais duplas à esquerda e à direita. Quer dizer: executa aqui o subprograma com este nome e depois continua. - -- Arrastas a **Chamada** da área Elementos e escreves lá o nome, p. ex. \`mostrarBoasVindas()\`. -- Os parênteses curvos no fim mostram que é um subprograma. É assim que também se escreve em Java, Python e JavaScript. -- O subprograma em si constróis como estrutograma próprio num novo separador. Como título escreves o mesmo nome. - -::: diagramm l15-unterprogramm.visustruct -O subprograma mostrarBoasVindas() como estrutograma próprio. -::: - -> **Na simulação:** Quando a simulação chega a uma chamada, procura entre os separadores abertos o estrutograma com este título e executa-o. Depois continua no programa principal. Enquanto o subprograma é executado, o bloco da chamada fica destacado. Um subprograma como este, só com um nome como título, partilha as suas variáveis com o programa principal. Daqui a pouco vais aprender como um subprograma tem variáveis próprias. Se não houver nenhum separador que corresponda, a simulação salta a chamada e mostra um aviso. - -::: angeberwissen -Porque é que o teu professor diz sempre “método” em Java e nunca “função” ou “procedimento”? Porque em Java cada subprograma tem de pertencer a uma classe, e os subprogramas de uma classe chamam-se métodos. Mas a diferença continua a existir: se um método devolve um resultado, na verdade é uma função. Se tiver \`void\` à frente, não devolve nada e na verdade é um procedimento. O Java simplifica e chama métodos aos dois. Eu também: o meu método chama-se Ruminar. -::: - -## Exercício: Acrescentar uma chamada - -::: übung l15-titel -titel: Cumprimento com chamada -auftrag: Imagina que o subprograma \`mostrarTitulo()\` já existe. Constrói o programa principal: primeiro chama \`mostrarTitulo()\`. Depois pede um nome e mostra **Olá** e o nome. - Ou seja, quando se escreve Ada, aparece **Olá Ada**. -test: Ada -> Olá Ada -test: Rui -> Olá Rui -braucht: aufruf -tipp: O programa principal tem três partes: a chamada, a entrada e a saída. -tipp: Arrasta uma Chamada da área Elementos lá para cima e escreve \`mostrarTitulo()\`. Por baixo vêm a entrada \`input: String nome "Como te chamas?"\` e a saída. -lösung: l15-titel-loesung.visustruct -::: - -## Passar valores: parâmetros - -Muitas vezes um subprograma deve trabalhar com valores que só se conhecem quando é chamado. Nesse caso tem uma **linha de cabeçalho** como título: - -\`\`\` -void mostrarSoma(int a, int b) -\`\`\` - -- \`void\` quer dizer: o subprograma não devolve nenhum resultado. -- \`mostrarSoma\` é o nome. -- Entre os parênteses estão os **parâmetros**: variáveis com tipo de dados que recebem os seus valores quando o subprograma é chamado. Vários separam-se com vírgulas. - -::: diagramm l15-zeige-summe.visustruct -O subprograma com a linha de cabeçalho como título. Faz contas com a e b como se fossem variáveis normais. -::: - -No bloco da chamada escreves os valores entre os parênteses, p. ex. \`mostrarSoma(3, 4)\`. O primeiro valor vai para \`a\`, o segundo para \`b\`. Em vez de números também podes usar variáveis e contas, como \`mostrarSoma(x, x + 1)\`. - -::: diagramm l15-zeige-summe-haupt.visustruct -O programa principal chama mostrarSoma duas vezes com valores diferentes. Abre os dois diagramas e inicia aqui a simulação. -::: - -> **Variáveis locais:** Os parâmetros e todas as variáveis criadas no subprograma pertencem só ao subprograma. Ele recebe **cópias** dos valores; mais sobre isso em baixo, em passagem por valor. Durante a chamada, a simulação só mostra as variáveis do subprograma. - -## Devolver um resultado: return - -Um subprograma também pode devolver um resultado, o **valor de retorno**. Nesse caso, a linha de cabeçalho tem o tipo de dados do resultado em vez de \`void\`: - -\`\`\` -int quadrado(int x) -\`\`\` - -A instrução \`return resultado\` devolve o valor e termina logo o subprograma. Quando o chamas, guardas o resultado numa variável: depois de \`int q = quadrado(5)\`, \`q\` tem o valor 25. - -::: diagramm l15-quadrat.visustruct -O subprograma quadrado calcula e devolve o resultado com return. -::: - -::: diagramm l15-quadrat-haupt.visustruct -O programa principal guarda o valor de retorno em q. Abre os dois diagramas e experimenta a simulação. -::: - -> Um subprograma com valor de retorno tem de terminar com \`return\`. Se faltar o return, a simulação indica um erro. - -Na **vista de código**, a linha de cabeçalho passa a ser um método Java (\`public static int quadrado(int x)\`), um \`def\` em Python e uma \`function\` em JavaScript. Se os subprogramas estiverem abertos noutros separadores, aparecem no código juntamente com o programa principal. - -## Exercício: Calcular a área - -::: übung l15-flaeche -titel: Calcular a área -auftrag: Constrói dois diagramas. O subprograma \`int area(int a, int b)\` devolve a área de um retângulo, ou seja, a vezes b. O programa principal pede o comprimento e a largura, chama \`area\` e mostra **Área:** e o resultado. - Com 3 e 4 aparece **Área: 12**. -test: 3, 4 -> Área: 12 -test: 5, 5 -> Área: 25 -test: 7, 0 -> Área: 0 -braucht: aufruf -tipp: Constróis dois diagramas: um subprograma que só calcula e devolve o resultado, e um programa principal para a entrada e a saída. -tipp: Abre um novo separador com **+** e dá-lhe o título \`int area(int a, int b)\`. Lá dentro basta uma instrução: \`return a * b\`. No programa principal escreves \`int f = area(comprimento, largura)\` no bloco da chamada. -lösung: l15-flaeche-loesung.visustruct -unterprogramm: l15-flaeche-unterprogramm-loesung.visustruct -::: - -## Cópia ou original: passagem por valor e passagem por referência - -O que acontece se um subprograma alterar o seu parâmetro? Depende do **que** é passado. - -**Passagem por valor:** Com \`int\`, \`double\`, \`boolean\`, \`char\` e \`String\`, o subprograma recebe uma **cópia** do valor. Se alterar o seu parâmetro, a variável de quem chamou fica como estava. - -**Passagem por referência:** Com um **array**, o subprograma não recebe uma cópia, mas uma referência para o mesmo array. Se alterar uma posição, a posição também fica alterada para quem chamou. A linha de cabeçalho para isso fica assim: - -\`\`\` -void limpar(boolean[] lugares) -\`\`\` - -::: grafik uebergabe.svg -Em cima, duplicar recebe uma cópia de numero. Em baixo, fila e lugares apontam para o mesmo array. -::: - -Experimenta as duas. Abre os três diagramas e inicia a simulação no programa principal: - -::: diagramm uebergabe-verdopple.visustruct -duplicar só altera a sua cópia x. -::: - -::: diagramm uebergabe-leeren.visustruct -limpar põe todos os lugares a false, por exemplo quando uma sessão é cancelada. -::: - -::: diagramm uebergabe-haupt.visustruct -numero continua a ser 5 depois da chamada. Já os lugares em fila ficam livres depois da chamada. -::: - -> Se quiseres receber um número de volta de um subprograma, usa \`return\`, p. ex. \`numero = duplicar(numero)\` com a linha de cabeçalho \`int duplicar(int x)\`. Um array, pelo contrário, pode ser alterado diretamente pelo subprograma. - -::: angeberwissen -Em rigor, o Java só conhece a passagem por valor. Mas, com um array, não é copiado o array inteiro, só o seu **endereço** na memória. Com o endereço copiado, o subprograma encontra o mesmo array. É como se eu te desse uma cópia da chave do meu cacifo: a chave é copiada, mas o feno no cacifo só existe uma vez. -::: - -## Exercício: Pontos de bónus - -::: übung uebergabe-bonus -titel: Pontos de bónus -auftrag: O programa principal chama \`bonus(pontos)\` e depois mostra todos os pontos. Constrói o subprograma \`void bonus(int[] pontos)\`, que aumenta em 1 cada pontuação do array. Em vez de 3, 5 e 8 vês então **4**, **6** e **9**. -start: uebergabe-bonus-start.visustruct -test: - -> 4 | 6 | 9 -braucht: aufruf -tipp: O programa principal já está pronto. Só constróis o subprograma num novo separador. -tipp: Abre um novo separador com **+** e o título \`void bonus(int[] pontos)\`. Lá dentro, um ciclo for percorre todas as posições e calcula \`pontos[i] = pontos[i] + 1\`. Não precisas de return, porque o array é alterado diretamente. -lösung: uebergabe-bonus-loesung.visustruct -unterprogramm: uebergabe-bonus-unterprogramm-loesung.visustruct -::: - -## A interrupção - -Às vezes um ciclo deve terminar **mais cedo**, a meio do seu corpo. É para isso que serve a **Interrupção**. Ela sai imediatamente do ciclo em que está. O programa continua no primeiro bloco depois do ciclo. Em Java, Python e JavaScript chama-se \`break\`. - -Reconheces a Interrupção pela ponta no seu lado esquerdo. Podes escrever um pequeno comentário no bloco, p. ex. \`Sair do ciclo\`. Ele aparece no código como comentário depois de \`break\`. - -Uma Interrupção está quase sempre numa **decisão**: só se sai do ciclo se uma condição se verificar. - -Um caso típico é o **ciclo infinito com Interrupção**. O ciclo em si não tem condição. É executado até se chegar à Interrupção: - -::: diagramm l15-endlos-aussprung.visustruct -O ciclo pede sempre um número. Com 0 salta para fora, senão soma o número à soma. -::: - -Sem Interrupção, um ciclo infinito nunca acabaria mesmo. - -## Interrupção na simulação - -A simulação executa a Interrupção como \`break\`: sai do ciclo mais interior e continua depois dele. Se uma Interrupção estiver fora de qualquer ciclo, o subprograma termina; no programa principal termina o programa todo. O \`return\` faz o mesmo. - -Muitas vezes podes passar completamente sem Interrupção: escreves a condição de paragem diretamente no ciclo. Normalmente até fica mais claro. - -## Exercício: Somar até 0 - -::: übung l15-bis-null -titel: Somar até 0 -auftrag: Reconstrói o programa “Somar até 0” **sem** Interrupção. Ele pede números inteiros até alguém escrever 0. Depois mostra **Soma:** e a soma de todos os números introduzidos. -test: 3, 4, 0 -> Soma: 7 -test: 0 -> Soma: 0 -test: 10, -2, 5, 0 -> Soma: 13 -tipp: Sem Interrupção, é a própria condição do ciclo que tem de verificar se foi escrito 0. -tipp: Pede o primeiro número antes do ciclo. O ciclo while é executado com a condição \`numero != 0\`. No corpo somas o número à soma e depois pedes o número seguinte. Na segunda entrada só escreves \`input: numero "…"\`, porque \`numero\` já existe. -lösung: l15-bis-null-loesung.visustruct -::: - -## Agora em Java - -Em Java, um subprograma chama-se **método**. O quadrado de cima fica assim: - -\`\`\`java -public static int quadrado(int x) { - int resultado = x * x; - return resultado; -} -\`\`\` - -O programa principal chama o método pelo nome e passa-lhe o valor entre parênteses curvos: - -\`\`\`java -int q = quadrado(numero); -System.out.println("O quadrado é " + q); -\`\`\` - -- No cabeçalho, antes do nome, fica o que o método devolve (\`int\`). Se não devolver nada, fica \`void\`. -- Os parâmetros ficam entre parênteses curvos, com o tipo de dados: \`(int x)\`. Separas vários com vírgulas. -- Na área Código escreves cada método no seu próprio separador, tal como cada subprograma tem o seu próprio estrutograma. -- Em Java, a saída chama-se \`break\`. Com \`while (true)\` constróis um ciclo que só termina com \`break\`. - -::: übung l18-java-kasse -titel: Caixa com break -code: java -auftrag: Escreve uma caixa registadora em Java. Pergunta repetidamente por um preço em euros inteiros. Com 0 sai do ciclo com \`break\`. Depois mostra quantos artigos foram e quanto custam ao todo. - Com 3, 4 e depois 0 aparece **Artigos: 2** e **Total: 7**. -test: 3, 4, 0 -> Artigos: 2 | Total: 7 -test: 0 -> Artigos: 0 | Total: 0 -test: 10, 2, 5, 0 -> Artigos: 3 | Total: 17 -braucht: endlosschleife, aussprung -tipp: Precisas de duas variáveis que começam em 0 antes do ciclo: uma para a soma e outra para a quantidade de artigos. -tipp: Dentro de \`while (true) { … }\` lês o preço. Logo a seguir verificas \`if (preco == 0) { break; }\`. Só depois somas o preço e aumentas os artigos em 1. -lösung: l18-java-kasse-loesung.visustruct -::: - -## Preenche os espaços: métodos e break - -::: lückentext -titel: Método e saída -auftrag: Preenche as palavras que faltam. Em cima está o método que calcula um quadrado. Por baixo está o programa principal, que o chama. Na área Código, cada um fica no seu separador. -\`\`\`java -public static [[int]] quadrado(int x) { - [[return]] x * x; -} -\`\`\` -\`\`\`java -int numero = 1; -while ([[true]]) { - int q = [[quadrado]](numero); - if (q > 50) { - [[break]]; - } - System.out.println(q); - numero = numero + 1; -} -\`\`\` -erklärung: \`int\` antes do nome do método quer dizer que o método devolve um número inteiro, com \`return\`. Se um método não devolver nada, aparece \`void\`. \`while (true)\` repete-se sem fim até \`break\` sair do ciclo. Saída: 1, 4, 9, 16, 25, 36 e 49. -::: - -## Encontra o erro: adivinhar - -::: übung l18-java-fehler -titel: Corrigir a contagem de tentativas -code: java -auftrag: Neste jogo de adivinhar, o número secreto é 7. O programa pede um palpite até aparecer o 7 e depois mostra o número de tentativas. Com 3, 5 e 7 foram 3 tentativas, mas o programa diz **Tentativas: 2**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l18-java-fehler-start.visustruct -test: 3, 5, 7 -> Tentativas: 3 -test: 7 -> Tentativas: 1 -test: 1, 2, 3, 7 -> Tentativas: 4 -braucht: endlosschleife, aussprung -tipp: O que acontece com o palpite certo? Ainda é contado antes de \`break\` sair do ciclo? -tipp: Primeiro conta, depois verifica: \`tentativas = tentativas + 1;\` fica antes do \`if\` com o \`break\`. -lösung: l18-java-fehler-loesung.visustruct -::: - -## Jogo: O que é devolvido? - -::: spiel frage -titel: Jogo: O que é devolvido? -intro: O Ludwig chama métodos e sai de ciclos a meio. Diz antes o que aparece. Sete rondas. - -runde: - public static int quadrado(int x) { - return x * x; - } - - int q = quadrado(5); - System.out.println(q); -frage: O que aparece? -- 5 -- 10 -- [x] 25 -> A chamada põe 5 em x, e o return devolve 5 · 5. - -runde: - public static void mostrarSoma(int a, int b) { - System.out.println(a + b); - } - - int x = 2; - mostrarSoma(x, x + 1); -frage: O que aparece? -- [x] 5 -- 23 -- 3 -> O primeiro valor 2 vai para a, o segundo valor 3 para b. Em Java, \`a + b\` calcula com números normalmente. - -runde: -frage: O que devolve um método que tem \`void\` antes do nome? -- um número inteiro -- [x] nada -- sempre 0 -> \`void\` quer dizer: sem valor de retorno. Com \`int\` nesse lugar, é devolvido um número inteiro. - -runde: - public static void duplicar(int x) { - x = x * 2; - } - - int numero = 5; - duplicar(numero); - System.out.println(numero); -frage: O que aparece? -- [x] 5 -- 10 -- 0 -> Passagem por valor (call by value): duplicar recebe uma cópia. numero continua a ser 5. - -runde: - public static void limpar(boolean[] lugares) { - for (int i = 0; i < lugares.length; i++) { - lugares[i] = false; - } - } - - boolean[] fila = {true, true}; - limpar(fila); - System.out.println(fila[0]); -frage: O que aparece? -- true -- [x] false -> Num array, fila e lugares apontam para o mesmo array. Quem chama também vê a alteração. - -runde: - int soma = 0; - for (int i = 1; i <= 10; i++) { - if (i == 4) { - break; - } - soma = soma + i; - } - System.out.println(soma); -frage: O que aparece? -- [x] 6 -- 10 -- 55 -> Com i = 4, o \`break\` sai logo do ciclo. Só foram somados 1 + 2 + 3. - -runde: - int numero = 1; - while (true) { - numero = numero * 3; - if (numero > 20) { - break; - } - } - System.out.println(numero); -frage: O que aparece? -- 9 -- 20 -- [x] 27 -> 3, 9, 27. Só 27 é maior do que 20, e então o ciclo infinito termina com break. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dividir uma tarefa grande em problemas mais pequenos. → Dividir tarefas grandes -- Consigo inserir uma chamada e construir um subprograma num separador próprio. → A chamada -- Consigo passar valores a um subprograma com parâmetros. → Passar valores: parâmetros -- Consigo devolver um valor de retorno com return e guardá-lo ao chamar. → Devolver um resultado: return -- Consigo explicar porque é que um subprograma não consegue alterar um número, mas consegue alterar um array. → Cópia ou original: passagem por valor e passagem por referência -- Consigo explicar o que faz uma Interrupção e porque está numa decisão. → A interrupção -- Consigo terminar um ciclo com uma Interrupção ou através da sua condição. → Interrupção na simulação -- Consigo reconhecer um método em Java e sair de um ciclo com \`break\`. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? O que significa um bloco de chamada com o texto \`mostrarResultado()\`? -→ A chamada -- [ ] O programa termina aqui. -- [x] O subprograma mostrarResultado() é executado aqui, e depois o programa continua. -- [ ] A palavra mostrarResultado() é mostrada aqui. - -? Onde continua o programa depois de uma Interrupção? -→ A interrupção -- [ ] No início do ciclo -- [x] No primeiro bloco depois do ciclo -- [ ] Logo no início do programa -> A Interrupção sai do ciclo em que está. Em Java, Python e JavaScript chama-se break. - -? Porque é que uma Interrupção costuma estar numa decisão? -→ A interrupção -- [x] Para só se sair do ciclo se uma condição se verificar -- [ ] Porque senão uma Interrupção não pode ser guardada -- [ ] Porque uma decisão é ela própria um ciclo -> Sem decisão, sair-se-ia do ciclo logo na primeira iteração. - -? Onde encontra a simulação o subprograma de uma chamada \`mostrarResultado()\`? -→ A chamada -- [ ] Tem de estar no mesmo estrutograma. -- [x] Num separador aberto com o título mostrarResultado() -- [ ] A simulação não consegue executar subprogramas. -> Constrói cada subprograma num separador próprio e dá-lhe como título o nome da chamada. - -? O subprograma tem a linha de cabeçalho \`void mostrarSoma(int a, int b)\`. Que chamada serve? -→ Passar valores: parâmetros -- [ ] mostrarSoma() -- [x] mostrarSoma(3, 4) -- [ ] int s = mostrarSoma(3, 4) -> Dois parâmetros precisam de dois valores. E \`void\` quer dizer que não volta nada que pudesses guardar. - -? Depois de \`int q = quadrado(5)\`, q tem 25. O que está no fim do subprograma quadrado? -→ Devolver um resultado: return -- [ ] output: x * x -- [x] return x * x -- [ ] q = x * x -> Com return, o subprograma devolve o valor à chamada. Uma saída só o mostraria. - -? \`void duplicar(int x)\` calcula \`x = x * 2\`. O programa principal tem \`int numero = 5\` e depois a chamada \`duplicar(numero)\`. Que valor tem numero a seguir? -→ Cópia ou original: passagem por valor e passagem por referência -- [x] 5 -- [ ] 10 -- [ ] 0 -> Passagem por valor: duplicar só alterou uma cópia de numero. - -? \`void limpar(boolean[] lugares)\` põe todas as posições a false. O que é verdade para o array fila no programa principal depois de \`limpar(fila)\`? -→ Cópia ou original: passagem por valor e passagem por referência -- [ ] Não mudou, porque o subprograma recebe uma cópia. -- [x] Todas as posições são false, porque lugares e fila são o mesmo array. -- [ ] O array é apagado. -> Passagem por referência: um array é passado como referência. Quem chamou também vê as alterações nas posições. - -? Como se chama um subprograma em Java? -→ Agora em Java -- [ ] Classe -- [x] Método -- [ ] Ciclo -> Em Java, um subprograma é um método, por exemplo o método \`main\`. Consoante o tipo, também se chama procedimento ou função. - -? Muitos blocos têm um segundo nome nos manuais. Associa cada termo do VisuStruct ao seu outro nome. -→ Agora em Java -= Decisão -> Instrução condicional -= Seleção -> Seleção múltipla -= Ciclo -> Iteração -= Subprograma -> Método -> Os dois nomes querem dizer o mesmo. Se conheces um deles, também percebes o outro. - -? O que fica no cabeçalho de um método Java que não devolve nada? -→ Devolver um resultado: return -- [ ] int -- [x] void -- [ ] return -> void significa “vazio”: o método faz alguma coisa, mas não devolve nenhum valor. -::: -`,Wy=`--- -titel: Pesquisar e ordenar -bereich: Fundamentos -kurz: Perceber com cartas de jogar como funcionam a pesquisa linear, a pesquisa binária e o bubble sort, e porque é que alguns métodos são muito mais rápidos. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar como a pesquisa linear percorre um array -- construir uma pesquisa linear como estrutograma -- explicar porque é que a pesquisa binária só funciona com valores ordenados -- explicar porque é que a pesquisa binária é muito mais rápida com muitos valores -- mostrar uma ronda de bubble sort com cartas de jogar -- percorrer um array em Java e contar resultados -::: - -## Procurar uma carta - -À tua frente está uma fila de cartas de jogar viradas para baixo. Procuras o 9. O que fazes? Viras uma carta a seguir à outra até encontrares o 9 ou teres virado todas as cartas. - -::: grafik ss-lineare-suche.svg -As cartas estão baralhadas. Cada carta que viras é uma comparação: é esta o 9? -::: - -É exatamente assim que funciona a **pesquisa linear**: percorre o array do índice 0 até ao fim e compara cada posição com o valor procurado. Funciona sempre, mesmo que os valores estejam baralhados. - -No array, as nossas cartas são números. Deixamos de fora o valete, a dama e o rei. - -::: diagramm ss-lineare-suche.visustruct -O ciclo é executado até a carta ser encontrada ou já não haver posições. A variável comparacoes conta quantas vezes se comparou. Na simulação, procura o 2, o 27 e o 4. -::: - -> Se a carta não estiver lá, \`posicao\` fica em **-1**. Não existe o índice -1, por isso aqui -1 quer dizer “não encontrado”. - -## Exercício: Encontrar uma carta - -::: übung ss-karte-suchen -titel: Encontrar uma carta -auftrag: Cria o array \`int[] cartas = {8, 4, 11, 4, 6}\` e pede uma carta. Mostra a posição da **primeira** carta que corresponde, p. ex. \`Posição: 1\` para o 4. Se a carta não estiver lá, mostra \`Não encontrado\`. -test: 4 -> Posição: 1 -test: 6 -> Posição: 4 -test: 8 -> Posição: 0 -test: 9 -> Não encontrado -braucht: whileSchleife, verzweigung -tipp: Percorre o array da frente para trás e compara cada carta com a que procuras. -tipp: Reconstrói o exemplo de cima. Aqui não precisas da variável comparacoes. O ciclo tem de parar assim que \`posicao\` deixar de ser -1, senão, para o 4, encontras o segundo em vez do primeiro. -lösung: ss-karte-suchen-loesung.visustruct -::: - -## Pesquisa binária: ordenado é mais rápido - -Agora as cartas estão à tua frente **ordenadas**, da mais pequena para a maior. Procuras o 27. Já não viras a primeira carta da frente, mas a do **meio**: - -- Se for a que procuras, terminaste. -- Se for mais pequena, a carta procurada só pode estar à direita. A metade esquerda inteira fica de fora. -- Se for maior, fica de fora a metade direita. - -Fazes o mesmo outra vez com o resto. Com cada comparação, o monte fica reduzido a metade. - -::: grafik ss-binaere-suche.svg -Três comparações em vez de catorze: com cada meio, metade das cartas que restam fica de fora. -::: - -No estrutograma, duas variáveis guardam a parte em que ainda se procura: \`esquerda\` e \`direita\`. O meio é \`(esquerda + direita) / 2\`. Como é uma divisão inteira, o resultado é sempre um índice inteiro. - -::: diagramm ss-binaere-suche.visustruct -O mesmo array da pesquisa linear. Na simulação, procura outra vez o 27 e compara a saída Comparações com a pesquisa linear. -::: - -> A pesquisa binária **só funciona com valores ordenados**. Com cartas baralhadas, depois de olhares para o meio não sabes em que metade continuar a procurar. - -::: angeberwissen -Penso num número de 1 a 100. Podes adivinhar, e eu só digo “maior” ou “menor”. Com a pesquisa binária precisas no máximo de **7** tentativas. Para um número até um milhão são no máximo 20, para mil milhões 30. Cada duplicação custa só mais uma tentativa. É assim que as bases de dados pesquisam milhões de registos numa fração de segundo. Eu, já agora, pesquiso de forma linear: como o prado da esquerda para a direita. -::: - -## Quão rápido é? - -A qualidade de um método mede-se pelo número de comparações de que precisa **no pior caso**. Na pesquisa linear, é o caso em que a carta está mesmo lá atrás ou não existe. - -::: grafik ss-vergleiche.svg -Com 100 cartas, a pesquisa linear precisa de até 100 comparações, a pesquisa binária no máximo de 7. -::: - -| Número de cartas | Pesquisa linear | Pesquisa binária | -|---|---|---| -| 10 | 10 | 4 | -| 100 | 100 | 7 | -| 1000 | 1000 | 10 | -| 1 000 000 | 1 000 000 | 20 | - -A pesquisa linear cresce ao mesmo ritmo que o número de cartas. Na pesquisa binária, o dobro das cartas acrescenta só **uma** comparação. - -## Ordenar com bubble sort - -Para a pesquisa binária, os valores têm de estar ordenados. Uma das formas mais simples de ordenar é o **bubble sort**. Percorres a fila da esquerda para a direita e comparas sempre **dois vizinhos**. Se a carta maior estiver à esquerda, trocas as duas. - -::: grafik ss-bubblesort.svg -Depois de uma ronda, a carta maior está na ponta da direita. -::: - -Depois da primeira ronda, a carta maior está na ponta da direita, como uma bolha de ar que sobe. Daí vem o nome (*bubble* quer dizer bolha). Depois repetes a ronda para as cartas que restam. Com 5 cartas precisas de 4 rondas. - -O estrutograma tem dois ciclos for, um dentro do outro. O exterior conta as rondas, o interior compara os vizinhos \`cartas[i]\` e \`cartas[i + 1]\`. Já sabes como trocar: precisas de uma **variável auxiliar**. - -::: diagramm ss-bubblesort.visustruct -O ciclo interior fica mais curto em cada ronda, porque as cartas maiores à direita já estão no sítio certo. Percorre-o na simulação com Passo e observa o array em Variáveis. -::: - -O bubble sort é fácil de perceber, mas lento. Com n cartas precisa de até n · (n − 1) / 2 comparações: com 10 cartas 45, com 100 cartas já 4950 e com 1000 cartas quase meio milhão. Mais tarde talvez conheças métodos mais rápidos, como o quicksort. - -## Exercício: Ordenar por ordem decrescente - -::: übung ss-absteigend -titel: Ordenar por ordem decrescente -auftrag: O diagrama inicial lê 5 cartas e ordena-as com bubble sort por ordem **crescente**, ou seja, da mais pequena para a maior. Altera-o de modo que as cartas sejam mostradas por ordem **decrescente**, a maior primeiro. -start: ss-absteigend-start.visustruct -test: 3, 1, 4, 1, 5 -> 5 | 4 | 3 | 1 | 1 -test: 10, 20, 30, 40, 50 -> 50 | 40 | 30 | 20 | 10 -test: 2, 9, 2, 7, 6 -> 9 | 7 | 6 | 2 | 2 -braucht: forSchleife, verzweigung -tipp: Olha para a condição na decisão. É ela que decide quando dois vizinhos são trocados. -tipp: Só precisas de alterar um único caractere. Quando devem ser trocados dois vizinhos, se a carta maior deve ir para a esquerda? -tipp: Na decisão, troca \`cartas[i] > cartas[i + 1]\` por \`cartas[i] < cartas[i + 1]\`. Assim os vizinhos trocam quando a carta maior está à direita, e a carta grande vai para a esquerda. -lösung: ss-absteigend-loesung.visustruct -::: - -## Agora em Java - -A pesquisa linear do exercício fica assim em Java: - -\`\`\`java editor -int[] cartas = {8, 4, 11, 4, 6}; -int procurada = 4; -int posicao = -1; -int i = 0; -while (posicao == -1 && i < cartas.length) { - if (cartas[i] == procurada) { - posicao = i; - } - i = i + 1; -} -System.out.println("Posição: " + posicao); -\`\`\` - -- \`&&\` significa “e”: o ciclo só corre enquanto não se encontrou nada **e** ainda há cartas. -- Se o ramo false estiver vazio, deixas simplesmente de fora \`else\`. -- A troca no bubble sort também precisa de uma variável auxiliar em Java: \`int aux = cartas[i];\` - -::: übung l19-java-zaehlen -titel: Contar cartas -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. Escreve em Java um programa que pergunta por uma carta e conta quantas vezes aparece. Mostra **Quantidade:** e o número. - Com 4 aparece **Quantidade: 2**. -test: 4 -> Quantidade: 2 -test: 8 -> Quantidade: 1 -test: 9 -> Quantidade: 0 -braucht: forSchleife, verzweigung -tipp: Ao contrário da pesquisa, não paras no primeiro resultado. Um ciclo for percorre todas as cartas. -tipp: \`for (int i = 0; i < cartas.length; i++)\` e lá dentro \`if (cartas[i] == procurada) { quantidade = quantidade + 1; }\`. \`quantidade\` começa em 0 antes do ciclo. -lösung: l19-java-zaehlen-loesung.visustruct -::: - -## Preenche os espaços: bubble sort - -::: lückentext -titel: Ordenar cartas -auftrag: O programa ordena as cartas por ordem crescente com o bubble sort. Preenche as palavras e os sinais que faltam. -\`\`\`java -int[] cartas = {5, 2, 8, 1}; -for (int ronda = 0; ronda < cartas.[[length]] - 1; ronda++) { - for (int i = 0; i < cartas.length - 1; i++) { - if (cartas[i] [[>]] cartas[i + 1]) { - [[int]] aux = cartas[i]; - cartas[i] = cartas[i + 1]; - cartas[i + 1] = [[aux]]; - } - } -} -for (int i = 0; i < cartas.length; i++) { - System.out.println(cartas[i]); -} -\`\`\` -erklärung: Se uma carta for maior do que a vizinha da direita, as duas trocam de lugar, com uma variável auxiliar como ao trocar os copos. Depois de \`length - 1\` rondas está tudo ordenado: 1, 2, 5, 8. -::: - -## Encontra o erro: pesquisa - -::: übung l19-java-fehler -titel: Corrigir a pesquisa linear -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. O programa deve mostrar a **primeira** posição da carta procurada, para o 4 é **Posição: 1**. Mas mostra **Posição: 3**. - “Abrir no editor” mostra o código na área Código. Encontra o erro, corrige-o e carrega em Verificar. -start: l19-java-fehler-start.visustruct -test: 4 -> Posição: 1 -test: 6 -> Posição: 4 -test: 9 -> Posição: -1 -test: 8 -> Posição: 0 -braucht: whileSchleife, verzweigung -tipp: O ciclo vai sempre até à última carta. O que acontece quando o 4 aparece uma segunda vez? -tipp: O ciclo deve parar assim que encontrar algo: \`while (posicao == -1 && i < cartas.length)\`. -lösung: l19-java-fehler-loesung.visustruct -::: - -## Porque é que não corre? - -::: übung l19-java-laeuft-nicht -titel: Procurar uma carta -code: java -auftrag: As cartas {8, 4, 11, 4, 6} estão num array. O programa procura o 11 e deve mostrar **Posição: 2**. Mas não corre. - “Abrir no editor” mostra o código na área Código. Clica em “Executar” e lê a mensagem de erro. Corrige o erro e carrega em Verificar. -start: l19-java-laeuft-nicht-start.visustruct -test: - -> Posição: 2 -braucht: forSchleife, verzweigung -tipp: Compara os nomes na condição com os nomes criados em cima. -tipp: A carta procurada está em \`procurada\` com p minúsculo: \`if (cartas[i] == procurada) {\` -lösung: l19-java-laeuft-nicht-loesung.visustruct -::: - -## Jogo: Profissional da pesquisa - -::: spiel frage -titel: Jogo: Profissional da pesquisa -intro: O Ludwig procura e ordena cartas. Quão rápido é, e o que sai? Sete rondas. - -runde: - int[] cartas = {8, 4, 11, 4, 6}; - int procurada = 4; - int posicao = -1; - int i = 0; - while (posicao == -1 && i < cartas.length) { - if (cartas[i] == procurada) { - posicao = i; - } - i = i + 1; - } - System.out.println("Posição: " + posicao); -frage: O que aparece? -- [x] Posição: 1 -- Posição: 3 -- Posição: 2 -> A pesquisa para no primeiro 4. Está na posição 1, contando a partir de 0. - -runde: - int[] cartas = {8, 4, 11, 4, 6}; - int procurada = 7; -frage: Com a mesma pesquisa linear: o que fica em posicao? -- 0 -- 5 -- [x] -1 -> O 7 não está lá. posicao fica em -1, que quer dizer "não encontrado". - -runde: -frage: Com que cartas funciona a pesquisa binária? -- com todas -- [x] só com cartas ordenadas -- só com menos de 100 -> Só com as cartas ordenadas é que, depois de olhares para o meio, sabes em que metade continuar a procurar. - -runde: -frage: De quantas comparações precisa no máximo a pesquisa binária com 100 cartas? -- 50 -- [x] 7 -- 100 -> Cada comparação corta o monte a meio. Cortar 7 vezes chega para até 128 cartas, portanto também para 100. - -runde: -frage: Em vez de 1000 cartas agora são 2000. Quantas comparações a mais precisa no máximo a pesquisa binária? -- [x] uma -- o dobro -- 1000 -> A primeira comparação reduz 2000 a 1000. Depois continua como antes. - -runde: - int[] cartas = {5, 3, 8, 1}; -frage: Uma passagem do bubble sort compara sempre dois vizinhos, da esquerda para a direita. Como ficam as cartas depois? -- 1, 3, 5, 8 -- [x] 3, 5, 1, 8 -- 3, 5, 8, 1 -> 5 e 3 trocam, 5 e 8 ficam, 8 e 1 trocam. A carta maior fica na ponta da direita. - -runde: -frage: O bubble sort troca \`cartas[i]\` e \`cartas[i + 1]\`. De que precisa para isso? -- [x] de uma variável auxiliar -- de um segundo array -- de uma pesquisa binária -> Tal como ao trocar duas variáveis: \`int aux = cartas[i];\`, senão perde-se um valor. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar como a pesquisa linear percorre um array. → Procurar uma carta -- Consigo construir uma pesquisa linear como estrutograma. → Exercício: Encontrar uma carta -- Consigo explicar porque é que a pesquisa binária só funciona com valores ordenados. → Pesquisa binária: ordenado é mais rápido -- Consigo explicar porque é que a pesquisa binária é muito mais rápida com muitos valores. → Quão rápido é? -- Consigo mostrar uma ronda de bubble sort com cartas de jogar. → Ordenar com bubble sort -- Consigo percorrer um array em Java e contar resultados. → Agora em Java -::: - -## Teste de conhecimentos - -::: quiz -? De que precisa a pesquisa binária? -→ Pesquisa binária: ordenado é mais rápido -- [ ] O array tem de ter exatamente 100 posições. -- [x] Os valores têm de estar ordenados. -- [ ] O valor procurado tem de existir. -> Só com valores ordenados é que sabes, depois de olhares para o meio, em que metade continuar a procurar. - -? Um array ordenado tem 1000 valores. De quantas comparações precisa a pesquisa binária no máximo? -→ Quão rápido é? -- [ ] 500 -- [ ] 100 -- [x] 10 -> 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1: depois de cerca de 10 divisões a meio, resta um valor. - -? O que compara o bubble sort em cada passo? -→ Ordenar com bubble sort -- [ ] A primeira e a última carta -- [x] Duas cartas vizinhas -- [ ] Cada carta com a do meio -> Se a carta maior estiver à esquerda, os vizinhos são trocados. - -? Onde está a carta maior depois da primeira ronda do bubble sort? -→ Ordenar com bubble sort -- [ ] Na ponta da esquerda -- [ ] No meio -- [x] Na ponta da direita -> Vai sendo trocada em cada comparação e sobe para a direita como uma bolha. - -? O que quer dizer \`posicao = -1\` na pesquisa linear? -→ Procurar uma carta -- [x] A carta (ainda) não foi encontrada. -- [ ] A carta está mesmo lá atrás. -- [ ] O array está vazio. - -? Associa cada método à descrição certa. -→ Procurar uma carta -= Pesquisa linear -> olhar para uma carta a seguir à outra -= Pesquisa binária -> olhar para o meio e pôr de lado uma metade -= Bubble sort -> comparar vizinhos e trocá-los - -? Porque usas um ciclo for para contar e não uma pesquisa que para no primeiro resultado? -→ Agora em Java -- [ ] Um ciclo for é sempre mais rápido. -- [x] Tens de ver todas as cartas, senão faltam resultados mais à frente. -- [ ] Um ciclo while não consegue percorrer arrays. -> A carta pode aparecer várias vezes. Por isso percorres todas as cartas até ao fim. -::: -`,Ey=`--- -titel: Estrutograma e código -bereich: Do estrutograma ao código -kurz: Todos os elementos em Java num relance, gerar código, escrever Java na área Código, executá-lo e procurar erros. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- abrir a vista de código e escolher Java como linguagem -- reconhecer em Java a saída, a entrada, as decisões e os ciclos -- explicar a diferença entre Excerto e Classe -- explicar como o código Java corre em qualquer sistema operativo com o compilador, o bytecode e a JVM -- distinguir o JDK do JRE -- explicar porque é que um programa em C++ tem de ser compilado de novo para cada sistema operativo e um programa Java não -- reconstruir um programa Java curto como estrutograma -- escrever Java na área Código e ler o estrutograma que é construído -- executar um programa com ▶︎ e usar entradas e saídas na consola -- encontrar um erro de sintaxe ou de execução pelo número de linha vermelho -- pôr pontos de paragem e seguir um programa passo a passo -::: - -## A vista de código - -Nas lições 4 a 19 já escreveste cada elemento em Java. Aqui vês tudo num relance e aprendes como o VisuStruct transforma um estrutograma inteiro num programa Java. - -Um estrutograma descreve um processo. Para um computador o executar, precisas de um programa numa linguagem de programação. O VisuStruct escreve esse código por ti. - -Clica em [Código](#zeige-code) nas ferramentas (ícone com parênteses angulares). À direita aparece o **Gerador de código**: - -- Em cima escolhes a linguagem: **Java**, **Python** ou **JavaScript**. -- Para Java escolhes ainda em **Saída Java** entre **Excerto** (só as instruções) e **Classe** (um ficheiro Java completo). -- **Texto do diagrama como comentários** escreve o texto de cada bloco como comentário por cima do código. -- **Copiar** põe o código na área de transferência, **Guardar Java…** guarda um ficheiro \`.java\`. - -O código muda logo sempre que alteras alguma coisa no estrutograma. - -::: angeberwissen -Mais tarde, Nassi trabalhou na linguagem de programação Ada e foi responsável pelo software na Apple. Portanto, quem inventa estrutogramas não acaba num curral de cabras, acaba na Apple. -::: - -::: diagramm l17-beispiel.visustruct -Um pequeno programa com uma entrada, um ciclo for e uma decisão. Abre-o e olha para o código Java correspondente. -::: - -## O exemplo em Java - -Para o diagrama de cima, o VisuStruct gera este código como **Excerto**: - -\`\`\` -// import java.util.Scanner; -Scanner scanner = new Scanner(System.in); - -System.out.println("Que tabuada?"); -int numero = scanner.nextInt(); -for (int i = 1; i <= 3; i++) { - int resultado = numero * i; - System.out.println(i + " vezes " + numero + " = " + resultado); -} -if (numero > 10) { - System.out.println("Esta foi difícil!"); -} else { - System.out.println("Esta foi fácil."); -} -\`\`\` - -Em Java, cada instrução termina com um **ponto e vírgula** \`;\`. O que está dentro de um bloco fica entre **chavetas** \`{ }\` em Java. A indentação mostra-te o que pertence ao quê. - -## Os elementos em Java - -| Elemento | Java | Lição | -|---|---|---| -| Instrução | \`int soma = 0;\` | 4, 5 | -| Saída | \`System.out.println(soma);\` | 6 | -| Entrada | \`int numero = scanner.nextInt();\` | 6 | -| Decisão | \`if (condição) { … } else { … }\` | 8, 9 | -| Seleção | \`switch (valor) { case 1 -> { … } default -> { … } }\` | 10 | -| Ciclo while | \`while (condição) { … }\` | 11 | -| Ciclo do-while | \`do { … } while (condição);\` | 12 | -| Ciclo for | \`for (int i = 0; i < 5; i++) { … }\` | 13 | -| Ciclo infinito | \`while (true) { … }\` | 11, 18 | -| Interrupção | \`break;\` | 18 | -| Chamada | \`calcular();\` | 18 | -| Array | \`int[] numeros = new int[5];\` | 15, 16 | -| Texto (String) | \`String nome = scanner.next();\` | 17 | - -Para entradas, \`import java.util.Scanner;\` e \`Scanner scanner = new Scanner(System.in);\` são escritos uma vez lá em cima. Antes de cada entrada, o VisuStruct mostra a pergunta com \`System.out.println(…)\`. - -Se o ramo false de uma decisão estiver vazio, o VisuStruct gera mesmo assim uma parte \`else\` que só contém o comentário \`// empty element\`. Se desligares **Gerar ramo else vazio no código**, a parte \`else\` vazia desaparece. - -## Excerto ou Classe - -Podes colar um **Excerto** no método \`main\` de um programa Java que já exista. Com **Classe** obténs um ficheiro completo que podes compilar e executar logo: - -\`\`\` -import java.util.Scanner; - -public class Tabuada { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Que tabuada?"); - int numero = scanner.nextInt(); - ... - } // fim do main -} // fim da classe -\`\`\` - -Os comentários \`// fim do main\` e \`// fim da classe\` depois das duas últimas chavetas não são necessários, mas ajudam muito: vês logo que chaveta fecha o quê e não te esqueces de nenhuma. - -O nome da classe vem do **título** do diagrama. O ficheiro tem de ter exatamente o mesmo nome, aqui \`Tabuada.java\`. O **Guardar Java…** trata disso por ti. - -> O código gerado é um bom começo, mas confirma-o. Se primeiro criares uma variável e mais tarde a voltares a ler com uma entrada, o VisuStruct escreve mesmo assim \`int pin = scanner.nextInt();\`. O Java indica então que \`pin\` já existe. Basta apagares o \`int\` nessa linha. - -## Como o Java corre em qualquer computador - -O teu ficheiro \`Tabuada.java\` é **código-fonte**: texto para pessoas. O processador do teu computador não o entende diretamente. Por isso, o Java corre em dois passos: - -1. O **compilador** \`javac\` traduz o código-fonte em **bytecode**. O resultado é o ficheiro \`Tabuada.class\`. -2. A **JVM** (Java Virtual Machine, máquina virtual Java) lê o bytecode e, ao executá-lo, traduz-o em **código máquina**: instruções para o processador do teu computador. - -::: grafik l20-jvm.svg -Compilar uma vez: o mesmo bytecode corre em qualquer JVM. -::: - -O bytecode existe só uma vez. Já a JVM existe para Windows, macOS, Linux e muitos outros sistemas. Por isso, o mesmo ficheiro \`.class\` corre em qualquer computador que tenha uma JVM instalada. A isto chama-se **independente da plataforma**. O lema é **“Write once, run anywhere”**: escrever uma vez, executar em qualquer lado. - -::: angeberwissen -Um dos primeiros compiladores foi construído em 1952 por **Grace Hopper**, que já conheces da lição 7. Na altura, muitos diziam-lhe que os computadores só sabiam fazer contas e não traduzir programas. Ela fê-lo na mesma. -::: - -Compara com o **C++**: aí o compilador traduz o código-fonte diretamente em código máquina para um só processador e um só sistema operativo. O programa pronto só corre aí. Para Windows, macOS e Linux tens de o compilar de novo de cada vez. - -::: grafik l20-cpp.svg -O C++ é compilado para código máquina em separado para cada sistema. -::: - -| | C++ | Java | -|---|---|---| -| O compilador gera | código máquina | bytecode | -| Quantas vezes compilar? | de novo para cada sistema | uma vez | -| De que precisa o computador para o executar? | de mais nada | de uma JVM | - -Isto torna o Java mais lento? Quase nada. As partes do programa que correm muitas vezes, por exemplo ciclos, são traduzidas de uma vez para código máquina pelo **compilador JIT** da JVM (“just in time”, mesmo a tempo). Depois correm quase tão depressa como em C++. - -> Imagina a JVM como um pequeno computador feito de software, quase como um sistema operativo só para programas Java. Mas, rigorosamente, não é um sistema operativo, é uma **máquina virtual**: um programa que corre ele próprio no Windows, no macOS ou no Linux e que, lá dentro, faz de conta que é um computador. - -Ao instalar o Java, encontras duas siglas: - -| Sigla | O que tem lá dentro? | Para quê? | -|---|---|---| -| **JRE** (Java Runtime Environment) | a JVM e blocos prontos como o \`Scanner\` | executar programas Java | -| **JDK** (Java Development Kit) | o JRE e ainda o compilador \`javac\` e outras ferramentas | escrever e compilar programas Java | - -Para programar precisas, portanto, do JDK. Hoje em dia normalmente só se descarrega o JDK, o JRE vem lá dentro. Para usar o VisuStruct no browser não precisas de instalar nada disto. - -::: angeberwissen -Com um JDK podes fazer tudo isto tu próprio na consola, ou seja, no terminal ou na linha de comandos: - -\`\`\` -java -version -javac Tabuada.java -java Tabuada -\`\`\` - -- \`java -version\` mostra que versão do Java está instalada. Se aparecer uma mensagem de erro, ainda falta o Java. -- \`javac Tabuada.java\` inicia o compilador. Depois tens dois ficheiros na pasta: o \`Tabuada.java\` com o teu código-fonte e o novo \`Tabuada.class\` com o bytecode. -- \`java Tabuada\` inicia a JVM com o teu bytecode. Aqui escreves o nome da classe sem \`.class\`. - -Se \`java -version\` funcionar mas \`javac -version\` não, só tens um JRE instalado. Nesse caso falta-te o JDK. -::: - -::: angeberwissen -Todos os ficheiros Java compilados (\`.class\`) começam com os mesmos quatro bytes, escritos em hexadecimal: \`CA FE BA BE\`. É assim que o computador reconhece que é Java. Foi James Gosling que inventou este “cafe babe”, a condizer com o café do nome. -::: - -## O modo de linguagem Java - -Na [roda dentada](#zeige-einstellungen) em cima à direita podes ativar as **Palavras-chave do código**. Então os blocos da área Elementos têm os mesmos nomes que os comandos em Java: \`if\`, \`switch\`, \`for\`, \`while\`, \`do\`, \`while(true)\`, \`break\` e \`call\`. O resto da interface fica no teu idioma. - -Isto ajuda-te a associar os blocos aos comandos Java. O teu diagrama em si fica igual. - -## Escrever Java diretamente - -Até agora desenhaste primeiro o estrutograma e depois viste o código. Na área [Código](#zeige-codelive) também funciona ao contrário. Clica na barra estreita **Código** à direita. Ao lado do estrutograma aparece uma coluna onde escreves tu mesmo o Java. - -- **Do estrutograma para o código:** Quando alteras alguma coisa no estrutograma, o código Java muda logo. -- **Do código para o estrutograma:** Quando escreves Java, o VisuStruct constrói o estrutograma enquanto escreves. Se ainda faltar alguma coisa, por exemplo uma chaveta de fecho \`}\`, aparece uma indicação por baixo do código. -- **Sugestões:** Enquanto escreves, o VisuStruct sugere modelos, por exemplo para \`if\`, \`for\` ou \`while\`. Com Enter aceitas um modelo. Substitui simplesmente os marcadores cinzentos pelo teu texto. -- **Indentar:** Se o teu código ficou desarrumado, clica no botão **Indentar** em cima na área Código. Cada nível fica então quatro espaços mais para dentro, como no Eclipse ou no IntelliJ. Se tiveres linhas selecionadas, o VisuStruct só indenta essas. - -Assim podes experimentar os dois caminhos. Desenhar primeiro o estrutograma é bom para planear um processo. Escrever o código diretamente é mais rápido quando já sabes o que queres. O estrutograma ajuda-te depois a verificar o teu código. - -## Executar o programa - -Em cima, na área Código, [▶︎ Executar](#zeige-ausfuehren) inicia o teu programa e **■ Parar** termina-o, por exemplo num ciclo infinito. O que o teu programa mostra aparece em baixo na [consola](#zeige-konsole). Se pedir uma entrada, escreve-a lá e carrega em Enter. - -Podes arrastar com o rato a fronteira entre o código e a consola para cima ou para baixo. - -Se algo correr mal, o número da linha fica vermelho. Num erro de sintaxe, o sítio também fica sublinhado a vermelho e por baixo lês, por exemplo, **Linha 2: Ainda falta aqui: ;**. Aí o ▶︎ nem sequer arranca o programa. Se o programa parar enquanto corre, é um erro de execução e a consola diz a linha, por exemplo **Linha 3: Divisão por zero.** Os três tipos de erros já os conheces da lição “Simulação e teste de secretária”. - -Se o VisuStruct souber exatamente o que falta, aparece um 💡 no fim da linha. Passa o rato por cima para veres a sugestão, por exemplo **Sugestão: inserir import java.util.Scanner;**. Um clique aplica-a. Mesmo assim, lê o que foi inserido, para saberes fazê-lo sozinho da próxima vez. - -> A área Código entende os comandos Java que também existem como blocos no estrutograma. Ainda não conhece classes próprias nem objetos. Janelas com Swing funcionam na mesma: liga o **Java verdadeiro (com Swing)** na roda dentada (lição “A tua primeira janela”). - -::: angeberwissen -Os profissionais chamam **IDE** (Integrated Development Environment) a um programa onde se escreve código, se executa e se procuram erros. Com a área Código, o VisuStruct é um pequeno IDE com estrutograma incluído. -::: - -## Encontrar erros com o depurador - -Às vezes um programa corre, mas calcula mal. É um erro de lógica. Aí ajuda o **depurador** (debugger): executa o teu programa devagar e tu vês o que acontece. - -- **Ponto de paragem:** Clica num número de linha à esquerda. Aparece um ponto vermelho. [▶︎ Executar](#zeige-ausfuehren) para antes dessa linha. Outro clique tira o ponto. -- **Linha amarela:** É a próxima a ser executada. No estrutograma, o bloco correspondente fica selecionado. -- **Variáveis:** Por baixo do código vês o valor atual de cada variável. O que mudou desde a última paragem acende-se a amarelo por um momento. -- **Passo a passo:** O botão [Passo a passo](#zeige-einzelschritt) ao lado de ▶︎ executa exatamente uma linha e para outra vez. Sem ponto de paragem, inicia o programa e para antes da primeira linha. -- **Continuar:** ▶︎ corre até ao próximo ponto de paragem ou até ao fim. **■ Parar** termina. - -Experimenta com este programa. Põe um ponto de paragem na linha 3 e carrega várias vezes em ▶︎. Como crescem \`i\` e \`soma\`? - -\`\`\` -int soma = 0; -for (int i = 1; i <= 4; i++) { - soma = soma + i; -} -System.out.println("Soma: " + soma); -\`\`\` - -::: ludwig -É um teste de secretária, só que o computador toma notas por ti. Antes de cada passo, pensa no valor que a variável devia ter a seguir. Quando a tabela não bate com o que esperavas, encontraste o sítio do erro. -::: - -## Exercício: Primeiro o código, depois o estrutograma - -Desta vez não desenhas. Abre a área Código e escreve este código Java: - -\`\`\` -System.out.println("Número inicial?"); -int zahl = scanner.nextInt(); -while (zahl > 0) { - System.out.println(zahl); - zahl = zahl - 1; -} -System.out.println("Start!"); -\`\`\` - -::: übung l20-countdown -titel: Contagem decrescente -bereich: beide -auftrag: Escreve o código Java acima na área Código. Executa-o com ▶︎ e introduz um número inicial na consola. - Depois observa o estrutograma que foi construído e clica em Verificar. -test: 3 -> 3 | 2 | 1 | Start! -test: 1 -> 1 | Start! -test: 0 -> Start! -braucht: whileSchleife -tipp: Abre a área Código com a barra estreita mais à direita e começa simplesmente a escrever. -tipp: Atenção ao ponto e vírgula no fim de cada instrução e às chavetas do ciclo while. Por baixo do código aparece uma indicação quando ainda falta alguma coisa. -lösung: l20-countdown-loesung.visustruct -::: - -## Exercício: Java como estrutograma - -Agora ao contrário: aqui está um pedaço de código Java. Reconstrói-o como estrutograma. - -\`\`\` -System.out.println("Introduz um número"); -int n = scanner.nextInt(); -int fatorial = 1; -for (int i = 1; i <= n; i++) { - fatorial = fatorial * i; -} -System.out.println(fatorial); -\`\`\` - -::: übung l17-fakultaet -titel: Fatorial a partir de Java -bereich: beide -auftrag: Reconstrói o código Java de cima como estrutograma. O programa lê um número n e mostra o produto 1 · 2 · … · n. - No fim, confirma na vista de código se o teu código Java fica igual. -test: 3 -> 6 -test: 5 -> 120 -test: 1 -> 1 -braucht: forSchleife -tipp: Lê o código Java linha a linha e pensa que bloco serve para cada linha. -tipp: As duas primeiras linhas Java juntas são uma única entrada: \`input: int n "Introduz um número"\`. O ciclo for tem os três campos \`int i = 1\`, \`i <= n\` e \`i++\`. -lösung: l17-fakultaet-loesung.visustruct -::: - -## Exercício: else if - -Em Java, vários casos escrevem-se muitas vezes com \`else if\`: - -\`\`\` -if (idade < 6) { - System.out.println("Entrada gratuita"); -} else if (idade < 18) { - System.out.println("Bilhete de criança: 4 euros"); -} else { - System.out.println("Bilhete de adulto: 8 euros"); -} -\`\`\` - -Num estrutograma não existe \`else if\`. Aí, uma segunda decisão fica no ramo false da primeira. Se o ramo false tiver só essa decisão, o VisuStruct volta a transformá-la em \`else if\` quando gera o código, e em \`elif\` em Python. - -::: übung l17-ticket -titel: Preço do bilhete -bereich: beide -auftrag: Pede a idade como número inteiro e reconstrói o código Java de cima como estrutograma. -test: 5 -> Entrada gratuita -test: 6 -> Bilhete de criança: 4 euros -test: 17 -> Bilhete de criança: 4 euros -test: 18 -> Bilhete de adulto: 8 euros -braucht: verzweigung -tipp: No código Java há outro \`if\` dentro de um \`else\`. No estrutograma isso é uma decisão dentro de um ramo. -tipp: Arrasta uma segunda decisão com a condição \`idade < 18\` para o ramo false da primeira decisão. -lösung: l17-ticket-loesung.visustruct -::: - -## Jogo: Que bloco é? - -::: spiel frage -titel: Jogo: Que bloco é? -intro: O Ludwig mostra-te Java. Que bloco do estrutograma está por trás? Oito rondas. -frage: Que bloco é este? - -runde: - do { - numero = numero * 2; - } while (numero < 100); -- Ciclo while -- [x] Ciclo do-while -- Ciclo for -> A condição está em baixo. Por isso o corpo corre pelo menos uma vez. - -runde: - switch (escolha) { - case 1 -> { System.out.println("água"); } - default -> { System.out.println("Esse botão não existe."); } - } -- Decisão -- [x] Seleção -- Chamada -> Uma variável é comparada com valores fixos: isso é a seleção. - -runde: - break; -- Chamada -- Ciclo infinito -- [x] Interrupção -> O \`break\` sai logo do ciclo onde está. - -runde: - calcular(); -- [x] Chamada -- Saída -- Instrução -> Um nome com parênteses: aqui é chamado um subprograma. - -runde: - int numero = scanner.nextInt(); -- Saída -- [x] Entrada -- Chamada -> O scanner lê um valor. Isso é uma entrada. - -runde: - while (true) { - System.out.println("Olá"); - } -- Ciclo while com condição -- [x] Ciclo infinito -- Ciclo do-while -> \`while (true)\` não tem uma condição verdadeira. Só um break o poderia terminar. - -runde: -frage: Queres um ficheiro Java completo que possas compilar e executar logo. O que escolhes na vista de código? -- Excerto -- [x] Classe -> Um excerto são só as instruções para o método \`main\`. Classe cria o ficheiro inteiro. - -runde: -frage: No depurador, uma linha está amarela. O que quer dizer? -- Tem um erro. -- [x] É a próxima a ser executada. -- Tem um ponto de paragem. -> Amarela é a próxima linha. Um ponto de paragem é um ponto vermelho no número da linha. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo abrir a vista de código e escolher Java como linguagem. → A vista de código -- Consigo reconhecer em Java a saída, a entrada, as decisões e os ciclos. → Os elementos em Java -- Consigo explicar a diferença entre Excerto e Classe. → Excerto ou Classe -- Consigo explicar como o código Java corre em qualquer sistema operativo com o compilador, o bytecode e a JVM. → Como o Java corre em qualquer computador -- Consigo distinguir o JDK do JRE. → Como o Java corre em qualquer computador -- Consigo explicar porque é que um programa em C++ tem de ser compilado de novo para cada sistema operativo e um programa Java não. → Como o Java corre em qualquer computador -- Consigo reconstruir um programa Java curto como estrutograma. → Exercício: Java como estrutograma -- Consigo escrever Java na área Código e ler o estrutograma que é construído. → Escrever Java diretamente -- Consigo executar um programa com ▶︎ e usar entradas e saídas na consola. → Executar o programa -- Consigo encontrar um erro de sintaxe ou de execução pelo número de linha vermelho. → Executar o programa -- Consigo pôr pontos de paragem e seguir um programa passo a passo. → Encontrar erros com o depurador -::: - -## Teste de conhecimentos - -::: quiz -? Como fica \`output: "Olá"\` em Java? -→ Os elementos em Java -- [ ] print("Olá") -- [x] System.out.println("Olá"); -- [ ] console.log("Olá"); -> print é Python, console.log é JavaScript. - -? De onde vem o nome da classe em Classe? -→ Excerto ou Classe -- [ ] Chama-se sempre Main. -- [x] Do título do diagrama -- [ ] Do primeiro bloco -> Sem título, a classe chama-se Main. - -? Que código Java pertence a um ciclo do-while? -→ Os elementos em Java -- [ ] while (condição) { … } -- [x] do { … } while (condição); -- [ ] for (;;) { … } -> No do-while a condição está no fim, por isso o corpo é executado pelo menos uma vez. - -? Em que se transforma uma Interrupção no código Java? -→ Os elementos em Java -- [x] break; -- [ ] return; -- [ ] exit(); - -? O que acontece num ponto vermelho antes do número da linha? -→ Encontrar erros com o depurador -- [ ] A linha é ignorada. -- [x] O programa para antes dessa linha. -- [ ] A linha tem um erro. -> É um ponto de paragem. Continua-se com ▶︎ ou com Passo a passo. - -? Porque é que o mesmo ficheiro \`.class\` corre no Windows, no macOS e no Linux? -→ Como o Java corre em qualquer computador -- [ ] O compilador cria um ficheiro diferente para cada sistema operativo. -- [x] Em cada sistema operativo, uma JVM executa o mesmo bytecode. -- [ ] Os programas Java não precisam de sistema operativo. -> O bytecode fica igual. Só a JVM existe em separado para cada sistema. - -? De que precisas para escrever e compilar programas Java? -→ Como o Java corre em qualquer computador -- [ ] só do JRE -- [x] do JDK -- [ ] só da JVM -> O JRE chega para executar. O compilador \`javac\` só vem com o JDK. - -? Queres usar o teu programa no Windows e no Mac. O que é verdade? -→ Como o Java corre em qualquer computador -- [ ] O Java tem de ser compilado de novo para cada sistema, o C++ não. -- [x] O C++ tem de ser compilado de novo para cada sistema, o Java não. -- [ ] Os dois só se compilam uma vez. -> O C++ passa diretamente a código máquina para um sistema. O Java passa a bytecode, e é a JVM que o executa em cada sistema. - -? O número de linha 3 na área Código está vermelho. O que quer isso dizer? -→ Executar o programa -- [ ] Há um ponto de paragem na linha 3. -- [x] Há um erro na linha 3. -- [ ] A linha 3 é a próxima a ser executada. -> Um ponto de paragem é um ponto vermelho redondo, e a próxima linha está a amarelo. Um número de linha vermelho mostra um erro de sintaxe ou de execução. -::: -`,Ny=`--- -titel: Python e JavaScript -bereich: Do estrutograma ao código -kurz: Gerar código Python e JavaScript a partir do estrutograma e executar JavaScript diretamente no navegador. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- escolher e comparar Python e JavaScript na vista de código -- explicar que o Python forma blocos pela indentação e não precisa de tipos de dados -- explicar o que o VisuStruct ajusta ao traduzir para Python -- executar JavaScript com Testar no navegador -::: - -## O mesmo diagrama, três linguagens - -Na vista de código ([Código](#zeige-code) nas ferramentas) escolhes a linguagem em cima. O estrutograma fica igual; só muda a forma de escrever. Assim podes comparar as linguagens facilmente. - -::: diagramm l18-beispiel.visustruct -Um número é diminuído em 3 uma e outra vez até deixar de ser maior do que 0. -::: - -## Python - -Para o diagrama de cima, o VisuStruct gera este código Python: - -\`\`\` -numero = int(input("Valor inicial?")) -while numero > 0: - print(numero) - numero = numero - 3 -print("Fim") -\`\`\` - -O que é diferente em Python em relação ao Java: - -- **Não há ponto e vírgula** nem **chavetas**. O Python reconhece o que pertence a um ciclo ou a uma decisão só pela **indentação**. Depois de \`while\`, \`if\` e \`else\` vêm dois pontos. -- As variáveis **não têm tipo de dados**: \`int numero = 5\` passa a \`numero = 5\`. -- A saída chama-se \`print(…)\`, a entrada \`input(…)\`. Para um número, fica \`int(…)\` à volta. -- Em Python, os arrays chamam-se **listas**: \`int[] numeros = {2, 4, 6}\` passa a \`numeros = [2, 4, 6]\`, e \`numeros.length\` passa a \`len(numeros)\`. -- Um ciclo for simples como \`int i = 0\`, \`i < 5\`, \`i++\` passa a \`for i in range(5):\`. - -## Cuidados com o Python - -Em alguns sítios, o Python é mais rigoroso do que o Java. Por isso, o VisuStruct traduz a forma de escrever do Java quando exporta: - -- **Texto e número com +:** \`"Soma: " + soma\` passa a \`"Soma: " + str(soma)\`. Sem \`str(…)\`, o Python para com um erro. -- **Não existe i++:** passa a \`i += 1\`. -- **&&, || e !** chamam-se \`and\`, \`or\` e \`not\` em Python, e \`true\` e \`false\` passam a \`True\` e \`False\`. -- **Divisão inteira:** Em Python, \`7 / 2\` dá sempre 3.5. Se o estrutograma dividir dois valores \`int\`, o VisuStruct escreve \`7 // 2\`, que dá 3, tal como em Java. -- **Ciclos for:** Os ciclos de contagem passam a \`for … in range(…)\`, também com \`i <= n\`, a contar para trás ou com passos como \`i = i + 2\`. Se um ciclo não encaixar nesse padrão, passa a ciclo \`while\`. -- **Não existe do-while:** passa a \`while True:\` com \`if not (…): break\` no fim. - -Se um diagrama estiver marcado como **pseudocódigo**, só aparece um aviso por cima do código. Nesse caso o texto é um esboço e não um programa executável. - -## JavaScript - -O mesmo diagrama em JavaScript: - -\`\`\` -"use strict"; - -let numero = parseInt((prompt("Valor inicial?") ?? "0"), 10); -while (numero > 0) { - console.log(numero); - numero = numero - 3; -} -console.log("Fim"); -\`\`\` - -O JavaScript parece-se com o Java: chavetas, ponto e vírgula, \`while (…)\` e \`if (…)\`. As diferenças: - -- As variáveis criam-se com \`let\`, sem tipo de dados. As constantes com \`const\`. -- A saída chama-se \`console.log(…)\`, a entrada \`prompt(…)\`. O \`parseInt(…)\` transforma a entrada num número inteiro. -- Os arrays ficam entre parênteses retos: \`let numeros = [2, 4, 6];\`. -- \`"use strict";\` mesmo lá em cima faz o JavaScript queixar-se de erros de escrita nos nomes das variáveis. -- O JavaScript só tem um tipo de número. Se o estrutograma dividir dois valores \`int\`, o VisuStruct escreve \`Math.trunc(a / b)\`. Assim desaparecem os algarismos depois da vírgula, tal como em Java. - -::: angeberwissen -O JavaScript não tem quase nada a ver com o Java. Brendan Eich criou-o em 1995 em apenas dez dias para o navegador Netscape. Primeiro chamava-se Mocha, depois LiveScript. Como toda a gente andava entusiasmada com o Java, pouco antes do lançamento mudaram-lhe o nome para JavaScript, por razões de publicidade. Desde então, as duas linguagens são constantemente confundidas. Os programadores dizem que o Java e o JavaScript têm tanto em comum como um carro e uma carpete. -::: - -## Executar JavaScript no navegador - -O JavaScript é a linguagem dos navegadores. Por isso o VisuStruct consegue **executar o código logo**: - -::: angeberwissen -Já agora, porque é que as ligações no navegador são azuis? Em 1985, a equipa de Ben Shneiderman testou que cor se vê bem mas não atrapalha a leitura. Ganhou o azul-claro. O vermelho destacava-se mais, mas as pessoas lembravam-se pior do texto a seguir. -::: - -1. Escolhe **JavaScript** na vista de código. -2. Clica em **Testar no navegador**. -3. O que o \`console.log\` mostra aparece em **Saída**. Se o programa pedir um valor com \`prompt\`, escreve-o e clica em **OK**. -4. **Parar** cancela o programa. - -O VisuStruct para sozinho um ciclo infinito \`while (true)\` depois de 100 000 iterações e indica **Execução interrompida: possível ciclo infinito.** - -> No código JavaScript, uma **Chamada** precisa de um subprograma com esse nome, senão o JavaScript indica um erro. Ao contrário da simulação, o navegador não procura nos outros separadores. - -## Exercício: Python como estrutograma - -Este programa Python mostra todos os números pares de 0 até um limite: - -\`\`\` -limite = int(input("Até que número?")) -for i in range(0, limite + 1, 2): - print(i) -\`\`\` - -\`range(0, limite + 1, 2)\` quer dizer: começar em 0, parar antes de \`limite + 1\`, contar de dois em dois. - -::: übung l18-python -titel: Números pares -bereich: beide -auftrag: Reconstrói o programa Python de cima como estrutograma com um ciclo for. Com o limite 7, mostra 0, 2, 4 e 6. -test: 7 -> 0 | 2 | 4 | 6 -test: 4 -> 0 | 2 | 4 -test: 0 -> 0 -braucht: forSchleife -tipp: \`range(0, limite + 1, 2)\` conta de 0 até ao limite de dois em dois. Isso é um ciclo for. -tipp: Os três campos do ciclo for são \`int i = 0\`, \`i <= limite\` e \`i = i + 2\`. -lösung: l18-python-loesung.visustruct -::: - -## Exercício: JavaScript como estrutograma - -\`\`\` -let idade = parseInt((prompt("Quantos anos tens?") ?? "0"), 10); -if (idade >= 18) { - console.log("Podes votar."); -} else { - let anos = 18 - idade; - console.log("Espera mais " + anos + " anos."); -} -\`\`\` - -::: übung l18-js -titel: Votar a partir dos 18 -bereich: beide -auftrag: Reconstrói o código JavaScript de cima como estrutograma. Depois testa na vista de código, com **JavaScript** e **Testar no navegador**, se o teu código mostra o mesmo que a simulação. -test: 12 -> Espera mais 6 anos. -test: 18 -> Podes votar. -test: 15 -> Espera mais 3 anos. -test: 40 -> Podes votar. -braucht: verzweigung -tipp: Lê o código linha a linha. \`if\` e \`else\` passam a uma decisão. -tipp: \`prompt\` e \`parseInt\` juntos são uma entrada: \`input: int idade "Quantos anos tens?"\`. O ramo false tem dois blocos: primeiro \`int anos = 18 - idade\`, depois a saída. -lösung: l18-js-loesung.visustruct -::: - -## Jogo: Que linguagem? - -::: spiel frage -titel: Jogo: Que linguagem? -intro: O Ludwig misturou linhas de três linguagens. Reconheces de onde vem cada uma? Oito rondas. -frage: Em que linguagem está isto escrito? -antworten: Java | Python | JavaScript - -runde: - print(numero) -richtig: Python -> Em Python, a saída chama-se \`print(…)\`, sem ponto e vírgula. - -runde: - console.log(numero); -richtig: JavaScript -> \`console.log\` é a saída em JavaScript. - -runde: - System.out.println(numero); -richtig: Java -> A saída comprida com \`System.out\` só existe em Java. - -runde: - let numeros = [2, 4, 6]; -richtig: JavaScript -> \`let\` e parênteses retos: um array em JavaScript. - -runde: - for i in range(5): -richtig: Python -> Dois pontos em vez de chavetas, e \`range\`: típico de Python. - -runde: - int[] numeros = {2, 4, 6}; -richtig: Java -> Só o Java escreve o tipo de dados \`int[]\` à frente. - -runde: - numero = int(input("Valor inicial?")) -richtig: Python -> Sem tipo de dados antes da variável, sem ponto e vírgula, e \`int(…)\` à volta da entrada. - -runde: - let numero = parseInt(prompt("Valor inicial?"), 10); -richtig: JavaScript -> \`prompt\` pede um valor no browser, \`parseInt\` transforma-o num número. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo escolher e comparar Python e JavaScript na vista de código. → O mesmo diagrama, três linguagens -- Consigo explicar que o Python forma blocos pela indentação e não precisa de tipos de dados. → Python -- Consigo explicar o que o VisuStruct ajusta ao traduzir para Python. → Cuidados com o Python -- Consigo executar JavaScript com Testar no navegador. → Executar JavaScript no navegador -::: - -## Teste de conhecimentos - -::: quiz -? Como reconhece o Python que linhas pertencem a um ciclo? -→ Python -- [ ] Pelas chavetas -- [x] Pela indentação -- [ ] Pelo ponto e vírgula no fim da linha - -? Como fica \`output: soma\` em JavaScript? -→ O mesmo diagrama, três linguagens -- [ ] print(soma) -- [ ] System.out.println(soma); -- [x] console.log(soma); - -? Que linguagem consegue o VisuStruct executar diretamente no navegador? -→ Executar JavaScript no navegador -- [ ] Java -- [ ] Python -- [x] JavaScript -> Qualquer navegador consegue executar JavaScript. Para Java e Python precisas de um programa próprio. - -? O que acontece em Python com \`print("Soma: " + soma)\` se soma for o número 7? -→ Cuidados com o Python -- [ ] É mostrado Soma: 7. -- [x] O Python indica um erro, porque texto e número não se podem juntar com +. -- [ ] É mostrado Soma:. -> str(soma) transforma o número em texto. -::: -`,Fy=`--- -titel: Quando o programa falha: try e catch -bereich: Apanhar erros -kurz: Ler mensagens de erro com Java verdadeiro e apanhar falhas com try e catch. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ligar o Java verdadeiro na área Código -- ler numa mensagem de erro a exceção e a linha -- apanhar uma exceção com try e catch -- transformar texto num número com Integer.parseInt e apanhar a NumberFormatException -- escrever um programa que divide em segurança, mesmo por 0 -::: - -## Falhou! - -Este programa deve escrever três notas. Escreve-o na área [Código](#zeige-codelive) e clica em [▶︎ Executar](#zeige-ausfuehren): - -\`\`\`java -int[] notas = {2, 3, 1}; -System.out.println("Primeira nota: " + notas[0]); -System.out.println("Quarta nota: " + notas[3]); -System.out.println("Pronto!"); -\`\`\` - -A primeira nota aparece e depois acabou. O VisuStruct indica “Expressão inválida: notas[3]”, e “Pronto!” nunca chega a aparecer. O array só tem as posições 0, 1 e 2; a posição 3 não existe. - -::: ludwig -Já te aconteceu? Um pequeno erro e o programa inteiro vai-se. A mim aconteceu-me tantas vezes que cheguei a chorar em frente ao ecrã. Mas há uma solução, e chama-se **try** e **catch**. -::: - -::: angeberwissen -Em 1947, a equipa de Grace Hopper encontrou no computador Mark II da Universidade de Harvard uma traça que tinha causado uma avaria. Colaram-na no diário de bordo e escreveram: “First actual case of bug being found”. Desde então, os erros de programa chamam-se **bugs** (inglês para insetos). -::: - -## Ligar o Java verdadeiro - -Normalmente a área Código calcula com a mesma simulação que o estrutograma. Quando há um erro, ela simplesmente para. Para veres o que faz o Java verdadeiro, liga o Java verdadeiro: - -1. Clica na [roda dentada](#zeige-einstellungen) em cima à direita e escolhe Java como **Linguagem de programação**. -2. Na secção Java, marca **Java verdadeiro (com Swing)**. - -Na primeira execução, o VisuStruct descarrega uma única vez cerca de 40 MB. Depois disso, o teu código é compilado e executado como num ambiente de desenvolvimento Java a sério. - -> Com o Java verdadeiro, as entradas pela consola (\`Scanner\`) ainda não funcionam. Por isso os nossos exemplos não precisam de entradas. - -Escreve agora o programa como uma classe completa, para que os números das linhas batam certo, e executa-o: - -\`\`\`java -public class Notas { - public static void main(String[] args) { - int[] notas = {2, 3, 1}; - System.out.println("Primeira nota: " + notas[0]); - System.out.println("Quarta nota: " + notas[3]); - System.out.println("Pronto!"); - } -} -\`\`\` - -Na [consola](#zeige-konsole) aparece agora: - -\`\`\` -Primeira nota: 2 -java.lang.ArrayIndexOutOfBoundsException: 3 - at Notas.main(Notas.java:5) -\`\`\` - -## Ler a mensagem de erro - -Uma mensagem destas assusta à primeira vista. Mas diz-te exatamente o que se passa: - -| Parte | Significado | -|---|---| -| \`ArrayIndexOutOfBoundsException\` | O tipo de erro: o índice está fora do array. | -| \`3\` | O índice errado. | -| \`Notas.java:5\` | A linha onde aconteceu: a linha 5. | - -O Java chama a um erro de execução destes uma **exceção** (em inglês *exception*). Diz-se: o Java *lança* uma exceção. Se ninguém a apanhar, o programa para. É por isso que “Pronto!” não aparece. - -::: ludwig -Lê as mensagens de erro sempre de cima: primeiro o nome da exceção, depois o número da linha. Na área Código, os números das linhas estão à esquerda do código. -::: - -## try e catch - -Com **try** e **catch** apanhas a exceção. Altera a linha com \`notas[3]\` assim: - -\`\`\`java -try { - System.out.println("Quarta nota: " + notas[3]); -} catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Esta nota não existe."); -} -System.out.println("Pronto!"); -\`\`\` - -- \`try\` quer dizer “tenta”. O Java executa o bloco entre chavetas normalmente. -- Se uma linha lá dentro lançar uma exceção, o Java salta logo para o bloco \`catch\`. O resto do bloco \`try\` é saltado. -- Entre parênteses, depois de \`catch\`, está a exceção que é apanhada e um nome para ela, normalmente \`e\`. -- Depois, o programa continua normalmente. Agora também aparece “Pronto!”. - -Se tudo correr bem no bloco \`try\`, o bloco \`catch\` é simplesmente saltado. - -::: ludwig -try e catch são como a rede por baixo do trapézio no circo: enquanto tudo corre bem, nem dás por ela. Se alguém cair, a rede apanha-o e o espetáculo continua. -::: - -> No estrutograma não há nenhuma caixa para try e catch. Por isso o VisuStruct mostra o bloco inteiro como uma instrução. Só o podes executar com o Java verdadeiro. - -::: angeberwissen -Em julho de 1969, a Apollo 11 aterrou na Lua. Pouco antes da aterragem, o computador de bordo mostrou de repente os erros **1202** e **1201**: tinha mais trabalho do que conseguia fazer. Mesmo assim, não falhou. A equipa de **Margaret Hamilton** tinha construído o software de forma a reconhecer esses erros, deixar de lado as tarefas pouco importantes e continuar só com as mais importantes. A aterragem correu bem. - -Margaret Hamilton dirigia no MIT o grupo que escreveu o software das naves Apollo. Ela contava sempre com a possibilidade de algo correr mal, tal como tu fazes com \`try\` e \`catch\`. Para que o software fosse levado tão a sério como o hardware, chamou ao seu trabalho **software engineering** (engenharia de software). Hoje, uma área inteira da informática tem esse nome. -::: - -::: bild margaret-hamilton.jpg -Margaret Hamilton (nascida em 1936) em 1969, ao lado dos programas impressos que a sua equipa escreveu para a Apollo (foto: [Draper Laboratory](https://commons.wikimedia.org/wiki/File:Margaret_Hamilton_-_restoration.jpg), domínio público). -::: - -## Transformar texto num número - -Muitas vezes um número começa por ser texto, por exemplo mais tarde num campo de texto numa janela. \`Integer.parseInt\` transforma texto num número inteiro: - -\`\`\`java -String entrada = "doze"; -try { - int numero = Integer.parseInt(entrada); - System.out.println("Dobro: " + numero * 2); -} catch (NumberFormatException e) { - System.out.println("Isto não é um número: " + entrada); -} -\`\`\` - -O Java não consegue converter “doze” e lança uma \`NumberFormatException\`. O programa escreve “Isto não é um número: doze”. Muda a primeira linha para \`String entrada = "12";\` e executa outra vez: agora aparece “Dobro: 24”. - -## As exceções são objetos - -Isto não está no programa da disciplina, mas é útil saber. - -::: angeberwissen -Cada exceção é um objeto de uma classe própria, por exemplo \`ArithmeticException\` para a divisão por 0. \`e.getMessage()\` dá-te a sua mensagem, por exemplo \`/ by zero\`. - -Depois de um \`try\` podem vir vários blocos \`catch\`, um para cada tipo de erro. \`catch (Exception e)\` apanha todas as exceções, mas diz-te menos sobre o que aconteceu. E um bloco \`finally { … }\` no fim corre sempre, quer tenha havido erro quer não. -::: - -## Jogo: A rede apanha? - -::: spiel frage -titel: Jogo: A rede apanha? -intro: O Ludwig anda no trapézio. O try e o catch apanham-no, ou o programa vai abaixo? Sete rondas. - -runde: - int[] notas = {2, 3, 1}; - System.out.println(notas[3]); - System.out.println("Pronto!"); -frage: O que acontece com Java a sério? -- Aparece 1 e Pronto! -- Só aparece Pronto! -- [x] O programa vai abaixo com uma ArrayIndexOutOfBoundsException. -> A posição 3 não existe. Ninguém apanha a exceção, por isso Pronto! nunca chega a aparecer. - -runde: - int[] notas = {2, 3, 1}; - try { - System.out.println(notas[3]); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Esta nota não existe."); - } - System.out.println("Pronto!"); -frage: O que aparece? -- Pronto! -- [x] Esta nota não existe.\\nPronto! -- Esta nota não existe. -> O bloco catch apanha a exceção, e depois o programa continua normalmente. - -runde: - try { - System.out.println("A"); - System.out.println(10 / 0); - System.out.println("B"); - } catch (ArithmeticException e) { - System.out.println("C"); - } -frage: O que aparece? -- A\\nB\\nC -- [x] A\\nC -- C -> Em 10 / 0, o Java salta logo para o bloco catch. O resto do bloco try, o B, é saltado. - -runde: - String entrada = "12"; - try { - int numero = Integer.parseInt(entrada); - System.out.println("Dobro: " + numero * 2); - } catch (NumberFormatException e) { - System.out.println("Isto não é um número: " + entrada); - } -frage: O que aparece? -- [x] Dobro: 24 -- Isto não é um número: 12 -- Dobro: 1212 -> "12" pode ser convertido. Se tudo correr bem no bloco try, o catch é saltado. - -runde: -frage: Que exceção lança \`Integer.parseInt("2.5")\`? -- ArithmeticException -- [x] NumberFormatException -- nenhuma, o resultado é 2 -> parseInt só converte números inteiros. Com um ponto, o formato não é válido. - -runde: -frage: Que exceção lança \`12 / 0\` com \`int\`? -- [x] ArithmeticException -- NumberFormatException -- ArrayIndexOutOfBoundsException -> Dividir por 0 não funciona com números inteiros. A mensagem é \`/ by zero\`. - -runde: - try { - int fatias = 12 / 0; - } catch (NumberFormatException e) { - System.out.println("Erro!"); - } - System.out.println("Pronto!"); -frage: O que acontece? -- Aparece Erro! e Pronto! -- Só aparece Pronto! -- [x] O programa vai abaixo. -> O catch só apanha a exceção que está entre parênteses. Uma ArithmeticException cai pela rede. -::: - -## Tarefa: dividir em segurança - -Este programa falha: - -\`\`\`java -int bolo = 12; -int pessoas = 0; -System.out.println("Cada um recebe " + bolo / pessoas + " fatias."); -System.out.println("Bom apetite!"); -\`\`\` - -1. Executa-o com o Java verdadeiro e lê a mensagem de erro. Que exceção é? -2. Apanha-a com try e catch. Em vez da falha deve aparecer “Sem pessoas não se pode dividir.”, e “Bom apetite!” deve aparecer na mesma. -3. Põe \`pessoas\` a 4 e verifica que aparece “Cada um recebe 3 fatias.”. - -::: ludwig -A exceção chama-se \`ArithmeticException\`. Põe no bloco \`try\` só a linha que pode falhar. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ligar o Java verdadeiro na área Código. → Ligar o Java verdadeiro -- Consigo ler numa mensagem de erro a exceção e a linha. → Ler a mensagem de erro -- Consigo apanhar uma exceção com try e catch. → try e catch -- Consigo transformar texto num número com Integer.parseInt e apanhar a NumberFormatException. → Transformar texto num número -- Consigo escrever um programa que divide em segurança, mesmo por 0. → Tarefa: dividir em segurança -::: - -## Teste de conhecimentos - -::: quiz -? O que acontece quando uma exceção não é apanhada? -→ Ler a mensagem de erro -- [ ] O Java salta a linha e continua. -- [x] O programa para. -- [ ] O computador reinicia. -> É por isso que no primeiro exemplo “Pronto!” não aparece. - -? O que acontece no bloco try depois da linha que lança uma exceção? -→ try e catch -- [ ] As restantes linhas correm na mesma. -- [x] O resto é saltado e o Java salta para o bloco catch. -- [ ] O Java recomeça o bloco try. - -? Que exceção lança Integer.parseInt("doze")? -→ Transformar texto num número -- [ ] ArithmeticException -- [ ] ArrayIndexOutOfBoundsException -- [x] NumberFormatException -> “doze” não tem um formato de número que o Java entenda. - -? Associa cada exceção à sua causa. -→ Ler a mensagem de erro -= ArrayIndexOutOfBoundsException -> índice fora do array -= ArithmeticException -> divisão por 0 -= NumberFormatException -> o texto não é um número -::: -`,Ry=`--- -titel: Ler e guardar texto -bereich: Ficheiros -kurz: Ler um ficheiro de texto linha a linha com Scanner e guardar um ficheiro com PrintWriter. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar porque é que os programas guardam dados em ficheiros -- ler um ficheiro de texto linha a linha com Scanner, hasNextLine e nextLine -- explicar porque é que o Java exige try e catch ou throws com ficheiros -- escrever um ficheiro com PrintWriter e terminá-lo com close -- ler um ficheiro, completá-lo e voltar a guardá-lo numerado -::: - -## Porquê ficheiros? - -Tudo o que está em variáveis desaparece assim que o programa termina. Se um programa deve lembrar-se de alguma coisa, por exemplo uma pontuação, uma lista ou notas, guarda os dados num **ficheiro**. Na próxima vez que arranca, volta a ler o ficheiro. - -A Zora está livre, e o Ludwig está a preparar uma festa. A lista de compras dele está pronta no ficheiro \`compras.txt\`: - -::: datei compras.txt -Feno -Maçãs -Cenouras -Dentes-de-leão -::: - -Um ficheiro com a extensão \`.txt\` contém só texto, linha a linha. Podes abri-lo com qualquer editor, por exemplo o Bloco de Notas no Windows ou o TextEdit no Mac. - -## Ler um ficheiro com Scanner - -Já conheces o \`Scanner\`: \`new Scanner(System.in)\` lê do teclado. Se lhe deres um ficheiro em vez de \`System.in\`, ele lê do ficheiro: - -\`\`\`java -import java.io.*; -import java.util.Scanner; - -Scanner ficheiro = new Scanner(new File("compras.txt")); -while (ficheiro.hasNextLine()) { - String linha = ficheiro.nextLine(); - System.out.println(linha); -} -ficheiro.close(); -\`\`\` - -| Método | Significado | -|---|---| -| \`new File("compras.txt")\` | o ficheiro com este nome | -| \`hasNextLine()\` | Ainda há mais uma linha? \`true\` ou \`false\` | -| \`nextLine()\` | devolve a linha seguinte e avança uma linha | -| \`close()\` | fecha o ficheiro quando terminas | - -O ciclo repete-se enquanto houver mais uma linha. Em cada volta, \`nextLine()\` vai buscar a linha seguinte. \`File\` pertence ao pacote \`java.io\`, por isso precisas de \`import java.io.*;\`. - -::: diagramm dt-lesen.visustruct -É assim que a leitura fica num estrutograma. Experimenta na simulação. -::: - -::: ludwig -Imagina o Scanner como um dedo a apontar para uma linha. \`nextLine()\` lê a linha debaixo do dedo e desce o dedo uma linha. Quando o dedo já está abaixo da última linha, \`hasNextLine()\` devolve \`false\`. -::: - -## E se o ficheiro não existir? - -Se o ficheiro não existir, o Java não o consegue ler e lança uma \`FileNotFoundException\`. O Java exige que o teu programa conte com isso. Ou apanhas a exceção com try e catch, como na lição 22: - -\`\`\`java -try { - Scanner ficheiro = new Scanner(new File("compras.txt")); - // ... ler ... - ficheiro.close(); -} catch (FileNotFoundException e) { - System.out.println("Falta o ficheiro compras.txt!"); -} -\`\`\` - -Ou escreves \`throws Exception\` a seguir a \`main\`. Isso quer dizer: "Este método pode lançar uma exceção, eu não trato dela." Nesse caso, o programa para se o ficheiro não existir. - -\`\`\`java -public static void main(String[] args) throws Exception { -\`\`\` - -> O VisuStruct escreve \`throws Exception\` a seguir a \`main\` automaticamente assim que o teu programa trabalha com ficheiros. Na simulação, o VisuStruct indica um ficheiro em falta com "Não existe nenhum ficheiro chamado …". - -## Exercício: Numerar a lista de compras - -::: übung l23-java-nummern -titel: Numerar a lista de compras -code: java -auftrag: Lê \`compras.txt\` linha a linha e mostra cada linha com o seu número: **1. Feno**, **2. Maçãs** e assim por diante. -start: l23-java-nummern-start.visustruct -test: - -> 1. Feno | 2. Maçãs | 3. Cenouras | 4. Dentes-de-leão -braucht: whileSchleife -tipp: Antes do ciclo, cria \`int numero = 1;\` e aumenta o número no fim de cada volta. -tipp: A saída é \`System.out.println(numero + ". " + linha);\` -lösung: l23-java-nummern-loesung.visustruct -::: - -## Escrever num ficheiro com PrintWriter - -Para escrever existe o \`PrintWriter\`. Os seus métodos têm os mesmos nomes que os de \`System.out\`: - -\`\`\`java -PrintWriter saida = new PrintWriter("saudacao.txt"); -saida.println("Olá Zora!"); -saida.println("Até amanhã, Ludwig"); -saida.close(); -\`\`\` - -Depois disto, \`saudacao.txt\` contém: - -\`\`\` -Olá Zora! -Até amanhã, Ludwig -\`\`\` - -- \`println\` escreve o texto e começa depois uma nova linha, \`print\` escreve sem nova linha. -- Se o ficheiro já existir, é **substituído**. O conteúdo antigo desaparece. -- Depois da execução, o VisuStruct mostra por baixo da saída o que foi guardado no ficheiro. - -::: ludwig -Não te esqueças do \`close()\`! O PrintWriter junta primeiro o texto numa memória intermédia e só o escreve no ficheiro quando é fechado. Sem \`close()\` o ficheiro fica vazio. Já perdi assim uma história inteira. -::: - -## Exercício: Completar a lista de compras - -::: übung l23-java-ergaenzen -titel: Completar a lista de compras -code: java -auftrag: O Ludwig ainda precisa de bolo. Lê \`compras.txt\` e escreve cada linha no novo ficheiro \`compras-nova.txt\`. Depois acrescenta **Bolo** como última linha. No fim, mostra quantas linhas foram guardadas: **5 linhas guardadas**. -start: l23-java-ergaenzen-start.visustruct -test: - -> 5 linhas guardadas -datei: compras-nova.txt -> Feno | Maçãs | Cenouras | Dentes-de-leão | Bolo -braucht: whileSchleife -tipp: No ciclo, lês uma linha com \`ficheiro.nextLine()\` e escreve-la logo a seguir com \`saida.println(linha)\`. -tipp: Depois do ciclo vem \`saida.println("Bolo");\`. Fecha os dois ficheiros com \`close()\`, senão \`compras-nova.txt\` fica vazio. -lösung: l23-java-ergaenzen-loesung.visustruct -::: - -## Jogo: O que fica no ficheiro? - -::: spiel frage -titel: Jogo: O que fica no ficheiro? -intro: O Ludwig escreve ficheiros com o PrintWriter. Lê o código e prevê o que fica no ficheiro. Seis rondas. -frage: O que fica depois no ficheiro? - -runde: - PrintWriter saida = new PrintWriter("saudacao.txt"); - saida.println("Olá"); - saida.println("Zora"); - saida.close(); -- [x] Olá\\nZora -- OláZora -- Zora -> \`println\` começa uma nova linha depois de cada texto. - -runde: - PrintWriter saida = new PrintWriter("palavra.txt"); - saida.print("Bo"); - saida.print("la"); - saida.println("!"); - saida.close(); -- Bo\\nla\\n! -- [x] Bola! -- Bo la ! -> \`print\` continua a escrever sem nova linha, por isso as partes ficam coladas. - -runde: - PrintWriter saida = new PrintWriter("segredo.txt"); - saida.println("O tesouro está na torre"); -- O tesouro está na torre -- [x] Nada, o ficheiro fica vazio. -- O Java indica um erro. -> Sem \`close()\` o texto nunca chega ao ficheiro. Fica na memória intermédia. - -runde: - // Antes, nota.txt contém: Antigo - PrintWriter saida = new PrintWriter("nota.txt"); - saida.println("Novo"); - saida.close(); -- Antigo\\nNovo -- [x] Novo -- Novo\\nAntigo -> Um novo PrintWriter substitui o ficheiro. O conteúdo antigo desaparece. - -runde: - PrintWriter saida = new PrintWriter("numeros.txt"); - for (int i = 1; i <= 3; i++) { - saida.println(i * 2); - } - saida.close(); -- 1\\n2\\n3 -- 246 -- [x] 2\\n4\\n6 -> O ciclo escreve 2, 4 e 6, cada número na sua linha. - -runde: - // compras.txt contém: Feno, Maçãs (uma por linha) - Scanner ficheiro = new Scanner(new File("compras.txt")); - PrintWriter saida = new PrintWriter("grande.txt"); - while (ficheiro.hasNextLine()) { - saida.println(ficheiro.nextLine().toUpperCase()); - } - ficheiro.close(); - saida.close(); -- Feno\\nMaçãs -- [x] FENO\\nMAÇÃS -- FENOMAÇÃS -> Cada linha é lida, passada para maiúsculas e escrita na sua própria linha. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar porque é que os programas guardam dados em ficheiros. → Porquê ficheiros? -- Consigo ler um ficheiro de texto linha a linha com Scanner, hasNextLine e nextLine. → Ler um ficheiro com Scanner -- Consigo explicar porque é que o Java exige try e catch ou throws com ficheiros. → E se o ficheiro não existir? -- Consigo escrever um ficheiro com PrintWriter e terminá-lo com close(). → Escrever num ficheiro com PrintWriter -- Consigo ler um ficheiro, completá-lo e voltar a guardá-lo numerado. → Exercício: Completar a lista de compras -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve hasNextLine()? -→ Ler um ficheiro com Scanner -- [ ] a linha seguinte -- [x] true se ainda houver uma linha, senão false -- [ ] o número de linhas -> Com hasNextLine() o ciclo verifica se continua. - -? O que acontece se chamares new PrintWriter("lista.txt") para um ficheiro que já existe? -→ Escrever num ficheiro com PrintWriter -- [ ] O texto novo é acrescentado no fim. -- [x] O ficheiro é substituído. -- [ ] O Java indica um erro. - -? Porque é que um ficheiro fica vazio, apesar de println ter sido chamado? -→ Escrever num ficheiro com PrintWriter -- [ ] Porque println só escreve na consola. -- [x] Porque falta o close(). -- [ ] Porque o nome do ficheiro termina em .txt. -> Só o close() escreve a memória intermédia no ficheiro. - -? Liga cada método à sua tarefa. -→ Ler um ficheiro com Scanner -= nextLine() -> lê a linha seguinte -= println(texto) -> escreve uma linha -= close() -> fecha o ficheiro -::: -`,Jy=`--- -titel: Linha a linha com BufferedReader -bereich: Ficheiros -kurz: Ler com BufferedReader e readLine até chegar null, e ler um ficheiro inteiro de uma vez com Files. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ler um ficheiro com BufferedReader e readLine -- reconhecer o fim de um ficheiro, porque readLine aí devolve null -- contar quantas vezes uma palavra aparece num ficheiro -- ler um ficheiro inteiro com Files.readString e dividi-lo em linhas com split -- encontrar a entrada mais longa de um ficheiro -::: - -## O bolo desapareceu! - -Na manhã a seguir à festa, o bolo do Ludwig desapareceu. Felizmente, o castelo tem um diário. Cada linha começa com o dia e a hora: - -::: datei diario.txt -Seg 08:15 Ludwig alimenta as cabras -Seg 12:30 Zora lê na torre -Seg 18:00 Raposa passa às escondidas pelo portão -Ter 09:00 Ludwig faz um bolo -Ter 14:45 Lebre traz cenouras -Ter 16:20 Raposa pergunta pela receita -Ter 23:55 O bolo desapareceu -Qua 07:00 Zora encontra migalhas junto à toca da Raposa -::: - -Já o conseguias ler com o Scanner da lição 23. Mas, para ficheiros, os profissionais usam muitas vezes o **BufferedReader**. - -## Ler com BufferedReader - -\`\`\`java -import java.io.*; - -BufferedReader leitor = new BufferedReader(new FileReader("diario.txt")); -String linha = leitor.readLine(); -while (linha != null) { - System.out.println(linha); - linha = leitor.readLine(); -} -leitor.close(); -\`\`\` - -- \`new FileReader("diario.txt")\` abre o ficheiro, e \`new BufferedReader(…)\` põe-lhe uma memória intermédia à volta. Vai buscar o ficheiro em pedaços grandes e por isso é mais rápido com ficheiros longos. -- \`readLine()\` devolve a linha seguinte. Quando já não há linhas, devolve **null**. -- Por isso, o ciclo repete-se enquanto \`linha != null\`. No fim de cada volta lê a linha seguinte. - -::: diagramm dt-buffered.visustruct -Primeiro ler uma linha, depois verificar, e no fim da volta ler a seguinte. -::: - -**null** quer dizer "nada". Não é o texto vazio \`""\`, mas nenhum texto. Uma variável com \`null\` não tem métodos: \`linha.length()\` para então com uma \`NullPointerException\`. Por isso, verifica sempre primeiro \`linha != null\`. - -| | Scanner | BufferedReader | -|---|---|---| -| Criar | \`new Scanner(new File(…))\` | \`new BufferedReader(new FileReader(…))\` | -| Ainda há mais uma linha? | \`hasNextLine()\` | \`readLine()\` devolve \`null\` | -| Linha seguinte | \`nextLine()\` | \`readLine()\` | -| Ponto forte | também lê números (\`nextInt()\`) | rápido, mesmo com ficheiros grandes | - -::: ludwig -O ciclo é diferente do ciclo com o Scanner: a primeira linha é lida **antes** do ciclo, e cada uma das seguintes **no fim** da volta. Se te esqueceres da leitura no fim, o programa lê sempre a mesma linha e nunca para. -::: - -::: angeberwissen -O fim de uma linha não é igual em todo o lado: o Windows escreve dois carateres invisíveis, “retorno do carro” e “avanço de linha”, o Linux e o macOS só o avanço de linha. Os nomes vêm da máquina de escrever, em que o carro voltava atrás e o papel subia uma linha. O \`readLine()\` funciona com os dois. -::: - -## Exercício: Quantas vezes aparece a Raposa? - -::: übung l24-java-fuchs -titel: Quantas vezes aparece a Raposa? -code: java -auftrag: Lê o diário com o BufferedReader e conta as linhas onde aparece **Raposa**. No fim, mostra **Raposa:** e o número. -start: l24-java-fuchs-start.visustruct -test: - -> Raposa: 3 -braucht: whileSchleife, verzweigung -tipp: Antes do ciclo, cria \`int quantidade = 0;\`. No ciclo verificas \`linha.contains("Raposa")\`. -tipp: O \`linha = leitor.readLine();\` fica no fim do ciclo, depois do if. -lösung: l24-java-fuchs-loesung.visustruct -::: - -## Fechar automaticamente - -Para que o \`close()\` não seja esquecido, mesmo depois de uma exceção, existe uma forma curta do try: o que é criado entre os parênteses a seguir a \`try\` é fechado pelo Java sozinho no fim. - -\`\`\`java -try (BufferedReader leitor = new BufferedReader(new FileReader("diario.txt"))) { - String linha = leitor.readLine(); - while (linha != null) { - System.out.println(linha); - linha = leitor.readLine(); - } -} catch (IOException e) { - System.out.println("Falta o diário."); -} -\`\`\` - -Isto chama-se **try-with-resources**. \`IOException\` apanha todos os erros ao ler e escrever, incluindo um ficheiro em falta. - -> Tal como try e catch, o try-with-resources só funciona com Java verdadeiro (lição 22). Na simulação, escreves tu o \`close()\`. - -## O atalho: Files - -Desde o Java 11 é ainda mais curto. \`Files.readString\` lê o ficheiro inteiro de uma vez, como já conheces da lição 17. Com \`split("\\n")\` divides o texto num array de linhas: - -\`\`\`java -import java.nio.file.*; - -String texto = Files.readString(Path.of("diario.txt")); -String[] linhas = texto.split("\\n"); -for (int i = 0; i < linhas.length; i++) { - System.out.println(linhas[i]); -} -\`\`\` - -Agora todas as linhas estão no array. Podes vê-las pela ordem que quiseres, por exemplo de trás para a frente ou só uma sim, uma não. - -| Forma | Boa para | -|---|---| -| \`Scanner\` | ficheiros pequenos, ler números e palavras | -| \`BufferedReader\` | ficheiros grandes, linha a linha | -| \`Files.readString\` | ficheiros pequenos que cabem inteiros no programa | - -::: ludwig -Um ficheiro com um milhão de linhas é melhor lido linha a linha com o BufferedReader. Com \`Files.readString\`, o ficheiro inteiro teria de ir de uma vez para a memória. -::: - -## Exercício: A entrada mais longa - -::: übung l24-java-laengster -titel: A entrada mais longa -code: java -auftrag: No código inicial, as linhas do diário já estão no array \`linhas\`. Encontra a linha mais longa e mostra-a assim: **Entrada mais longa:** seguido da linha. -start: l24-java-laengster-start.visustruct -test: - -> Entrada mais longa: Qua 07:00 Zora encontra migalhas junto à toca da Raposa -braucht: forSchleife, verzweigung -tipp: Guarda a linha mais longa até agora em \`String maisLonga = linhas[0];\` e percorre as outras linhas com um ciclo for. -tipp: Se \`linhas[i].length() > maisLonga.length()\`, então \`linhas[i]\` passa a ser a mais longa. -lösung: l24-java-laengster-loesung.visustruct -::: - -## Jogo: Detetive de ficheiros - -::: spiel frage -titel: Jogo: Detetive de ficheiros -intro: Quem levou o bolo? Cada programa procura no **diário** a partir do início. Prevê o que mostra e junta as pistas. Cinco rondas. -frage: O que mostra o programa? - -runde: - String linha = leitor.readLine(); - linha = leitor.readLine(); - System.out.println(linha.substring(10)); -- Ludwig alimenta as cabras -- [x] Zora lê na torre -- Seg 12:30 Zora lê na torre -> O segundo \`readLine()\` devolve a segunda linha. O texto depois da hora começa no índice 10. - -runde: - int n = 0; - String linha = leitor.readLine(); - while (linha != null) { - if (linha.startsWith("Ter")) n++; - linha = leitor.readLine(); - } - System.out.println(n); -- 3 -- [x] 4 -- 8 -> Quatro entradas são de terça-feira. - -runde: - String linha = leitor.readLine(); - while (linha != null) { - if (linha.contains("bolo")) { - System.out.println(linha.substring(4, 9)); - } - linha = leitor.readLine(); - } -- [x] 09:00\\n23:55 -- 09:00 -- Ter\\nTer -> Há duas linhas com "bolo". \`substring(4, 9)\` recorta a hora. - -runde: - String linha = leitor.readLine(); - String ultima = ""; - while (linha != null) { - if (linha.contains("Raposa")) ultima = linha; - linha = leitor.readLine(); - } - System.out.println(ultima); -- Ter 16:20 Raposa pergunta pela receita -- [x] Qua 07:00 Zora encontra migalhas junto à toca da Raposa -- Seg 18:00 Raposa passa às escondidas pelo portão -> \`ultima\` é substituída a cada resultado. No fim fica lá o último. "toca da Raposa" também contém "Raposa". - -runde: - String linha = leitor.readLine(); - while (linha != null) { - if (linha.contains("migalhas")) { - int junto = linha.indexOf("junto à "); - System.out.println(linha.substring(junto + 8)); - } - linha = leitor.readLine(); - } -- [x] toca da Raposa -- junto à toca da Raposa -- migalhas -> As migalhas estão junto à toca da Raposa. A Raposa perguntou pela receita, e às 23:55 o bolo tinha desaparecido. Caso resolvido! -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ler um ficheiro com BufferedReader e readLine. → Ler com BufferedReader -- Consigo reconhecer o fim de um ficheiro, porque readLine aí devolve null (linha != null). → Ler com BufferedReader -- Consigo contar quantas vezes uma palavra aparece num ficheiro. → Exercício: Quantas vezes aparece a Raposa? -- Consigo ler um ficheiro inteiro com Files.readString e dividi-lo em linhas com split. → O atalho: Files -- Consigo encontrar a entrada mais longa de um ficheiro. → Exercício: A entrada mais longa -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve readLine() quando o ficheiro chegou ao fim? -→ Ler com BufferedReader -- [ ] "" -- [x] null -- [ ] -1 -> null quer dizer: já não há mais texto. - -? Porque é que no fim do ciclo há outra vez linha = leitor.readLine()? -→ Ler com BufferedReader -- [ ] Para fechar o ficheiro. -- [x] Senão linha fica sempre igual e o ciclo nunca para. -- [ ] Para mostrar a primeira linha duas vezes. - -? O que faz o try-with-resources? -→ Ler com BufferedReader -- [ ] Lê o ficheiro mais depressa. -- [x] Fecha o ficheiro sozinho no fim. -- [ ] Impede qualquer exceção. - -? Liga cada forma àquilo para que é boa. -→ O atalho: Files -= BufferedReader -> ficheiros grandes, linha a linha -= Files.readString -> ficheiros pequenos de uma vez -= Scanner -> ler números e palavras -::: -`,Gy=`--- -titel: Tabelas em CSV -bereich: Ficheiros -kurz: Ler uma tabela num ficheiro CSV, dividir cada linha com split e fazer contas com os números. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar como é feito um ficheiro CSV: cabeçalho, registos, separador -- dividir uma linha com split e fazer dela um número com Integer.parseInt -- saltar o cabeçalho antes de fazer contas -- calcular uma média a partir de uma coluna de um ficheiro CSV -- encontrar o melhor valor numa coluna de um ficheiro CSV -- nomear um ponto forte e um ponto fraco do CSV -::: - -## Uma tabela num ficheiro de texto - -A professora Cabra, da escola do castelo, guardou as notas da turma numa tabela. Como na Alemanha, 1 é a melhor nota e 6 a pior: - -| Nome | Matemática | Alemão | Inglês | -|---|---|---|---| -| Ludwig | 2 | 3 | 1 | -| Zora | 1 | 2 | 2 | -| Raposa | 4 | 3 | 5 | -| Lebre | 2 | 1 | 3 | - -No ficheiro, a tabela fica assim: - -::: datei turma.csv -Nome;Matemática;Alemão;Inglês -Ludwig;2;3;1 -Zora;1;2;2 -Raposa;4;3;5 -Lebre;2;1;3 -::: - -Isto é um **ficheiro CSV**. CSV quer dizer "Comma-Separated Values", ou seja, "valores separados por vírgulas". Cada linha é uma linha da tabela, e as colunas estão separadas por um carácter separador. Em Portugal e na Alemanha usa-se normalmente o **ponto e vírgula** \`;\`, porque a vírgula já aparece em números como \`2,5\`. - -- A primeira linha é o **cabeçalho**. Diz o que está em cada coluna. -- Cada uma das linhas seguintes é um **registo**, aqui um aluno ou uma aluna. -- O Excel, o LibreOffice e o Numbers abrem ficheiros CSV diretamente como tabela. - -## Dividir uma linha com split - -Já conheces o \`split(";")\` da lição 17. Divide um texto em cada ponto e vírgula e devolve um array: - -\`\`\`java -String linha = "Zora;1;2;2"; -String[] partes = linha.split(";"); -// partes[0] é "Zora", partes[1] é "1", partes[2] é "2", partes[3] é "2" -\`\`\` - -Depois disto, as notas ainda são **texto**. Só podes fazer contas com elas depois de as transformares num número com \`Integer.parseInt\`: - -\`\`\`java -int matematica = Integer.parseInt(partes[1]); -\`\`\` - -::: diagramm dt-csv.visustruct -Dividir uma linha CSV e ler a nota de Matemática como número. -::: - -## Ler o ficheiro inteiro - -Para o ficheiro inteiro, combinas o BufferedReader da lição 24 com \`split\`. O cabeçalho não tem notas, por isso lês essa linha antes do ciclo e saltas por cima dela: - -\`\`\`java -BufferedReader leitor = new BufferedReader(new FileReader("turma.csv")); -String linha = leitor.readLine(); // cabeçalho -linha = leitor.readLine(); // primeiro registo -while (linha != null) { - String[] partes = linha.split(";"); - System.out.println(partes[0] + ": Matemática " + partes[1]); - linha = leitor.readLine(); -} -leitor.close(); -\`\`\` - -::: ludwig -Sem o segundo \`readLine()\` antes do ciclo, o cabeçalho vai parar ao ciclo. Aí, \`Integer.parseInt("Matemática")\` tenta fazer um número a partir da palavra, e o Java para com uma \`NumberFormatException\`. -::: - -## Exercício: Média de Matemática - -::: übung l25-java-schnitt -titel: Média de Matemática -code: java -auftrag: Calcula a média das notas de Matemática. Salta o cabeçalho, soma as notas de Matemática (coluna 1) e divide pelo número de registos. Mostra **Média de Matemática:** e a média. -start: l25-java-schnitt-start.visustruct -test: - -> Média de Matemática: 2.25 -braucht: whileSchleife -tipp: Antes do ciclo, cria \`double soma = 0;\` e \`int quantidade = 0;\`. Com \`double\`, nada é cortado na divisão. -tipp: No ciclo: \`String[] partes = linha.split(";");\`, depois \`soma = soma + Integer.parseInt(partes[1]);\` e \`quantidade++;\`. -lösung: l25-java-schnitt-loesung.visustruct -::: - -## Exercício: Melhor nota a Inglês - -::: übung l25-java-beste -titel: Melhor nota a Inglês -code: java -auftrag: Quem tem a melhor nota a Inglês (coluna 3)? Mostra **Melhor nota a Inglês:**, o nome e, entre parênteses, a nota. -start: l25-java-beste-start.visustruct -test: - -> Melhor nota a Inglês: Ludwig (1) -braucht: whileSchleife, verzweigung -tipp: Guarda a melhor nota até agora em \`int melhorNota = 7;\` e o nome em \`String melhorNome = "";\`. Qualquer nota verdadeira é melhor do que 7. -tipp: Se \`nota < melhorNota\`, guardas a nova nota e \`partes[0]\` como nome. -lösung: l25-java-beste-loesung.visustruct -::: - -## Pontos fortes e fracos do CSV - -| Bom | Difícil | -|---|---| -| As tabelas ocupam pouco espaço. | Se o separador aparecer no texto, por exemplo \`Lebre;muito bem; esforçada\`, a linha parte-se em partes a mais. | -| O Excel e outros programas abrem o ficheiro diretamente. | Tudo é uma tabela plana. Se um animal tiver várias comidas preferidas, isso não cabe bem numa célula. | -| Qualquer programa o consegue ler com \`split\`. | O ficheiro não diz se \`1\` é um número ou um texto. | - -::: ludwig -O Excel guarda ficheiros CSV com ponto e vírgula em Portugal e na Alemanha, mas com vírgula em Inglaterra e nos EUA. Por isso, quem abre um ficheiro de outro país às vezes vê tudo numa única coluna. -::: - -## Jogo: Linha estragada - -::: spiel bombe -titel: Jogo: Linha estragada -intro: Em cada ficheiro CSV há **exatamente uma linha estragada**, e a bomba está a contar. Compara cada linha com o cabeçalho e toca na linha estragada antes que o tempo acabe. Cinco rondas, 20 segundos cada. -zeit: 20 -daten: csv - -runde: - Nome;Matemática;Alemão;Inglês - Ludwig;2;3;1 - Zora;1 - Raposa;4;3;5 -frage: Cada linha precisa de quatro colunas. -fehler: 3 -besser: Zora;1;2;2 -> Faltam duas notas à Zora. Então \`partes[3]\` não existe, e o Java para com uma \`ArrayIndexOutOfBoundsException\`. - -runde: - Nome;Nota;Comentário - Ludwig;2;trabalha bem em equipa - Lebre;1;muito bem; esforçada - Zora;1;lê muito -frage: Cada linha precisa de três colunas. -fehler: 3 -besser: Lebre;1;muito bem, esforçada -> O ponto e vírgula no comentário separa uma quarta coluna. O separador não pode aparecer no texto. - -runde: - Nome;Matemática;Alemão;Inglês - Ludwig;2;3;1 - Zora;1;2;2 - Raposa,4,3,5 -frage: O separador é o ponto e vírgula. -fehler: 4 -besser: Raposa;4;3;5 -> Aqui há vírgulas em vez de pontos e vírgulas. \`split(";")\` não encontra nenhum ponto e vírgula e devolve a linha inteira como uma única parte. - -runde: - Nome;Matemática;Alemão;Inglês - Lebre;2;1;3 - Raposa;quatro;3;5 - Ludwig;2;3;1 -frage: As notas são números. -fehler: 3 -besser: Raposa;4;3;5 -> \`Integer.parseInt("quatro")\` não consegue fazer um número a partir da palavra e lança uma \`NumberFormatException\`. - -runde: - Nome;Matemática;Alemão;Inglês - Zora;1;2;2 - Lebre;2;1;3 - Ludwig;2;;1 -frage: Nenhum campo pode estar vazio. -fehler: 4 -besser: Ludwig;2;3;1 -> Entre os dois pontos e vírgulas não há nada. \`Integer.parseInt("")\` lança uma \`NumberFormatException\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar como é feito um ficheiro CSV: cabeçalho, registos, separador. → Uma tabela num ficheiro de texto -- Consigo dividir uma linha com split e fazer dela um número com Integer.parseInt. → Dividir uma linha com split -- Consigo saltar o cabeçalho antes de fazer contas. → Ler o ficheiro inteiro -- Consigo calcular uma média a partir de uma coluna de um ficheiro CSV. → Exercício: Média de Matemática -- Consigo encontrar o melhor valor numa coluna de um ficheiro CSV. → Exercício: Melhor nota a Inglês -- Consigo nomear um ponto forte e um ponto fraco do CSV. → Pontos fortes e fracos do CSV -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve "Lebre;2;1;3".split(";")[2]? -→ Dividir uma linha com split -- [ ] "2" -- [x] "1" -- [ ] 1 -> A contagem começa em 0. E o resultado é um texto, não um número. - -? Porque é que o programa chama readLine() duas vezes antes do ciclo? -→ Ler o ficheiro inteiro -- [ ] Para ler o ficheiro mais depressa. -- [x] A primeira linha é o cabeçalho, sem notas. É saltada. -- [ ] Porque readLine precisa sempre de duas linhas. - -? O que acontece com Integer.parseInt("Matemática")? -→ Dividir uma linha com split -- [ ] Devolve 0. -- [x] O Java lança uma NumberFormatException. -- [ ] Devolve o comprimento da palavra. - -? Liga. -→ Pontos fortes e fracos do CSV -= cabeçalho -> diz o que está nas colunas -= registo -> uma linha com valores -= separador -> separa as colunas, muitas vezes ; -::: -`,Hy=`--- -titel: Dados em JSON -bereich: Ficheiros -kurz: Perceber ficheiros JSON, tirar valores com indexOf e substring e escrever JSON tu mesmo. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- reconhecer objetos, chaves, valores e listas em JSON -- tirar um valor de uma linha JSON com indexOf e substring -- mostrar todos os valores de uma chave de um ficheiro JSON -- construir e guardar uma entrada JSON com + e \\" -- guardar dados num ficheiro JSON -- nomear um ponto forte e um ponto fraco do JSON -::: - -## Dados com nomes - -O zoo do castelo guarda os seus animais num ficheiro \`zoo.json\`: - -::: datei zoo.json -{ - "zoo": "Zoo do Castelo", - "animais": [ - {"nome": "Ludwig", "especie": "bode", "idade": 7}, - {"nome": "Zora", "especie": "cabra", "idade": 6}, - {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4}, - {"nome": "Lebre", "especie": "lebre", "idade": 2} - ] -} -::: - -Isto é **JSON**, a "JavaScript Object Notation". Quase todas as aplicações web e todos os jogos enviam e guardam dados assim. Ao contrário de um ficheiro CSV, antes de cada valor está o seu **nome**, a **chave**. - -| Carácter | Significado | Exemplo | -|---|---|---| -| \`{ … }\` | um **objeto**: pares de chave e valor | \`{"nome": "Zora", "idade": 6}\` | -| \`"chave": valor\` | um par, separado por dois pontos | \`"idade": 6\` | -| \`[ … ]\` | uma **lista** de valores, como um array | \`"animais": [ … ]\` | -| \`,\` | separa os pares e as entradas de uma lista | | -| \`"…"\` | um texto. Números e \`true\`/\`false\` ficam sem aspas. | \`"cabra"\`, \`6\` | - -Objetos e listas podem ser **encaixados** uns nos outros: o objeto do zoo contém a lista \`animais\`, e cada animal é outra vez um objeto. Tal como nos arrays, a lista conta a partir de 0: \`animais[1].nome\` é \`"Zora"\`. - -::: angeberwissen -Foi Douglas Crockford quem tornou o JSON conhecido no início dos anos 2000. Na licença do seu programa de JSON escreveu: “O software deve ser usado para o Bem, não para o Mal.” Por isso, a empresa IBM perguntou se o podia usar na mesma. Ele respondeu que a IBM e os seus clientes também o podiam usar para o Mal. -::: - -## Tirar um valor - -Os profissionais leem JSON com uma biblioteca, por exemplo o **Gson**. Ela não faz parte do Java e tem de ser adicionada primeiro. Para o nosso ficheiro do zoo chegam os métodos de String da lição 17, porque cada animal está na sua própria linha. - -Em Java, escreves umas aspas dentro de um texto como \`\\"\`. Assim, o texto \`"\\"nome\\": \\""\` é \`"nome": "\`, exatamente o que está antes de cada nome. - -\`\`\`java -String linha = "{\\"nome\\": \\"Zora\\", \\"especie\\": \\"cabra\\", \\"idade\\": 6},"; -int inicio = linha.indexOf("\\"nome\\": \\"") + 9; -int fim = linha.indexOf("\\"", inicio); -String nome = linha.substring(inicio, fim); -\`\`\` - -- \`indexOf("\\"nome\\": \\"")\` encontra o início de \`"nome": "\`. São 9 caracteres, por isso o nome começa 9 caracteres mais à frente. -- \`indexOf("\\"", inicio)\` procura as aspas seguintes **a partir de** \`inicio\`. É aí que o nome acaba. -- \`substring(inicio, fim)\` recorta o nome: \`Zora\`. - -::: diagramm dt-json.visustruct -Tirar o nome de uma linha JSON. -::: - -## Exercício: Todos os nomes do zoo - -::: übung l26-java-namen -titel: Todos os nomes do zoo -code: java -auftrag: Lê \`zoo.json\` linha a linha. Em cada linha que contém \`"nome"\`, mostra só o nome. -start: l26-java-namen-start.visustruct -test: - -> Ludwig | Zora | Raposa | Lebre -braucht: whileSchleife, verzweigung -tipp: Verifica com \`linha.contains("\\"nome\\"")\` se há um nome na linha. As outras linhas são saltadas. -tipp: Dentro do if: \`int inicio = linha.indexOf("\\"nome\\": \\"") + 9;\`, depois \`int fim = linha.indexOf("\\"", inicio);\` e \`System.out.println(linha.substring(inicio, fim));\`. -lösung: l26-java-namen-loesung.visustruct -::: - -## Escrever JSON - -Para escrever, juntas o texto com \`+\` e escreves-o no ficheiro com o PrintWriter da lição 23. Os textos em JSON precisam de aspas, portanto \`\\"\` no texto Java, os números não: - -\`\`\`java -String nome = "Zora"; -int pontos = 15; -String entrada = "{\\"nome\\": \\"" + nome + "\\", \\"pontos\\": " + pontos + "}"; -// entrada é {"nome": "Zora", "pontos": 15} -\`\`\` - -Numa lista há uma vírgula entre as entradas, mas **nenhuma** depois da última. Isso verificas com um if. - -::: ludwig -Umas aspas esquecidas ou uma vírgula a mais, e nenhum programa consegue ler o ficheiro. O JSON é rigoroso. Por isso, os profissionais também usam uma biblioteca para escrever. -::: - -## Exercício: Guardar pontos em JSON - -::: übung l26-java-schreiben -titel: Guardar pontos em JSON -code: java -auftrag: Guarda os pontos do torneio de perguntas como lista em \`pontos.json\`. Cada linha contém um objeto com **nome** e **pontos**, e entre os objetos há uma vírgula. No fim, mostra **3 entradas guardadas**. -start: l26-java-schreiben-start.visustruct -test: - -> 3 entradas guardadas -datei: pontos.json -> [ | {"nome": "Ludwig", "pontos": 12}, | {"nome": "Zora", "pontos": 15}, | {"nome": "Raposa", "pontos": 9} | ] -braucht: forSchleife, verzweigung -tipp: Percorre os arrays com \`for (int i = 0; i < nomes.length; i++)\`. Constrói a entrada com \`" {\\"nome\\": \\"" + nomes[i] + "\\", \\"pontos\\": " + pontos[i] + "}"\`. -tipp: Se \`i < nomes.length - 1\`, acrescentas ainda \`","\`. Depois do ciclo, escreve \`"]"\` e fecha o ficheiro. -lösung: l26-java-schreiben-loesung.visustruct -::: - -## Pontos fortes e fracos do JSON - -| Bom | Difícil | -|---|---| -| Cada valor tem um nome. Vê-se logo o que \`6\` quer dizer. | O ficheiro é mais longo do que um CSV, porque as chaves aparecem em todas as linhas. | -| Os dados podem ser encaixados, por exemplo uma lista dentro de um objeto. | O Java não lê JSON sozinho. É precisa uma biblioteca como o Gson. | -| O JSON é o padrão na web. Quase todas as linguagens de programação o conhecem. | Um carácter a mais ou a menos torna o ficheiro inteiro ilegível. | - -## Jogo: Qual é a chave? - -::: spiel frage -titel: Jogo: Qual é a chave? -intro: O Ludwig procura valores em ficheiros JSON. Lê o ficheiro e diz qual é o valor pedido. Cinco rondas. - -runde: - {"nome": "Zora", "especie": "cabra", "idade": 6} -frage: Qual é o valor de **idade**? -- "idade" -- [x] 6 -- "cabra" -> Antes dos dois pontos está a chave, depois está o valor. Os números ficam sem aspas. - -runde: - { - "animais": [ - {"nome": "Ludwig", "idade": 7}, - {"nome": "Zora", "idade": 6}, - {"nome": "Raposa", "idade": 4} - ] - } -frage: O que é **animais[1].nome**? -- Ludwig -- [x] Zora -- Raposa -> A lista conta a partir de 0, como um array. \`animais[1]\` é o segundo animal. - -runde: - { - "zoo": "Zoo do Castelo", - "chefe": {"nome": "Ludwig", "especie": "bode"} - } -frage: Como chegas a **bode**? -- [x] chefe.especie -- especie -- zoo.chefe.especie -> \`especie\` está dentro do objeto \`chefe\`. Por isso o caminho passa por \`chefe\`. - -runde: - { - "nome": "Lebre", - "comidaPreferida": ["cenouras", "trevo", "dentes-de-leão"] - } -frage: O que é **comidaPreferida[2]**? -- trevo -- cenouras -- [x] dentes-de-leão -> O índice 0 é cenouras, o 1 é trevo e o 2 é dentes-de-leão. Algo assim dificilmente cabe numa célula em CSV. - -runde: - {"nome": "Raposa", "idade": 4, "comFome": true} -frage: Que chave tem um valor lógico? -- nome -- idade -- [x] comFome -> \`true\` e \`false\` ficam sem aspas, como os números. Em Java isto seria um \`boolean\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo reconhecer objetos, chaves, valores e listas em JSON. → Dados com nomes -- Consigo tirar um valor de uma linha JSON com indexOf e substring. → Tirar um valor -- Consigo mostrar todos os valores de uma chave de um ficheiro JSON. → Exercício: Todos os nomes do zoo -- Consigo construir e guardar uma entrada JSON com + e \\". → Escrever JSON -- Consigo guardar dados num ficheiro JSON. → Exercício: Guardar pontos em JSON -- Consigo nomear um ponto forte e um ponto fraco do JSON. → Pontos fortes e fracos do JSON -::: - -## Teste de conhecimentos - -::: quiz -? O que está em JSON antes de cada valor? -→ Dados com nomes -- [ ] o número da linha -- [x] a sua chave, por exemplo "nome" -- [ ] um ponto e vírgula -> A chave e o valor estão separados por dois pontos. - -? Como escreves umas aspas dentro de um texto Java? -→ Escrever JSON -- [ ] "" -- [x] \\" -- [ ] '"' - -? Em {"animais": [{"nome": "Ludwig"}, {"nome": "Zora"}]}, qual é o valor de animais[0].nome? -→ Dados com nomes -- [x] Ludwig -- [ ] Zora -- [ ] animais -> A lista conta a partir de 0. - -? Liga. -→ Pontos fortes e fracos do JSON -= { } -> um objeto com chaves e valores -= [ ] -> uma lista -= : -> separa a chave do valor -::: -`,Vy=`--- -titel: Comparar formatos -bereich: Ficheiros -kurz: Comparar os mesmos dados em txt, CSV e JSON, escolher o formato certo e converter um ficheiro noutro formato. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- reconhecer os mesmos dados em txt, CSV e JSON -- comparar pontos fortes e fracos de txt, CSV e JSON -- converter um ficheiro CSV em frases -- converter um ficheiro CSV em JSON -::: - -## Os mesmos animais três vezes - -O Ludwig guardou os animais do castelo em três ficheiros. Todos dizem o mesmo, só que escrito de outra maneira. - -Como texto, tal como se escreveria a uma pessoa: - -::: datei animais.txt -Ludwig (bode) tem 7 anos. -Zora (cabra) tem 6 anos. -Raposa (raposa-vermelha) tem 4 anos. -::: - -Como tabela em CSV: - -::: datei animais.csv -Nome;Espécie;Idade -Ludwig;bode;7 -Zora;cabra;6 -Raposa;raposa-vermelha;4 -::: - -Como JSON: - -::: datei animais.json -[ - {"nome": "Ludwig", "especie": "bode", "idade": 7}, - {"nome": "Zora", "especie": "cabra", "idade": 6}, - {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4} -] -::: - -## O que sabe fazer cada formato? - -| | txt | CSV | JSON | -|---|---|---|---| -| Fácil de ler para pessoas | sim | mais ou menos | mais ou menos | -| Ordem fixa para programas | não | sim, colunas | sim, chaves | -| O que quer dizer um valor? | está na frase | está no cabeçalho | está mesmo antes dele | -| Encaixar (uma lista dentro de uma entrada) | não | difícil | sim | -| Abrir no Excel | não | sim | não | -| Ler em Java | Scanner, BufferedReader | mais \`split\` | métodos de String ou uma biblioteca | -| Tamanho | pequeno | o mais pequeno | o maior | - -Em resumo: - -- **txt** para textos que pessoas leem: cartas, notas, um diário. -- **CSV** para tabelas: notas, medições, uma lista de recordes. Todas as linhas têm as mesmas colunas. -- **JSON** para dados com estrutura: jogos guardados, definições, tudo o que circula entre programas e na web. - -::: ludwig -Quando a tua aplicação de meteorologia vai buscar a temperatura, a resposta chega quase sempre em JSON. E quando um professor exporta as notas do programa da escola, recebe muitas vezes um ficheiro CSV. -::: - -## Exercício: De CSV para frases - -::: übung l27-java-saetze -titel: De CSV para frases -code: java -auftrag: Converte \`animais.csv\` em texto. Para cada animal, escreve uma frase como **Ludwig (bode) tem 7 anos.** no ficheiro \`frases.txt\`. No fim, mostra **3 frases guardadas**. -start: l27-java-saetze-start.visustruct -test: - -> 3 frases guardadas -datei: frases.txt -> Ludwig (bode) tem 7 anos. | Zora (cabra) tem 6 anos. | Raposa (raposa-vermelha) tem 4 anos. -braucht: whileSchleife -tipp: O código inicial já salta o cabeçalho. Divide cada linha com \`String[] partes = linha.split(";");\`. -tipp: A frase é \`partes[0] + " (" + partes[1] + ") tem " + partes[2] + " anos."\`. Conta com \`quantidade++\` e lê a linha seguinte no fim do ciclo. -lösung: l27-java-saetze-loesung.visustruct -::: - -## Exercício: De CSV para JSON - -::: übung l27-java-json -titel: De CSV para JSON -code: java -auftrag: Converte \`animais.csv\` em JSON e guarda-o em \`animais-novos.json\`, exatamente como \`animais.json\` acima. No fim, mostra **3 animais guardados**. -start: l27-java-json-start.visustruct -test: - -> 3 animais guardados -datei: animais-novos.json -> [ | {"nome": "Ludwig", "especie": "bode", "idade": 7}, | {"nome": "Zora", "especie": "cabra", "idade": 6}, | {"nome": "Raposa", "especie": "raposa-vermelha", "idade": 4} | ] -braucht: forSchleife, verzweigung -tipp: \`linhas[0]\` é o cabeçalho. Por isso, começa o ciclo for em \`i = 1\` e divide \`linhas[i]\` com \`split(";")\`. -tipp: Constrói a entrada com \`\\"\`, como na lição 26. A idade é um número e fica sem aspas. Só acrescentas uma vírgula se \`i < linhas.length - 1\`. -lösung: l27-java-json-loesung.visustruct -::: - -## Jogo: Que formato serve? - -::: spiel frage -titel: Jogo: Que formato serve? -intro: O Ludwig quer guardar dados e não sabe que formato usar. Ajuda-o. Seis rondas. -antworten: txt | CSV | JSON - -runde: -frage: As notas da turma inteira devem ser abertas no Excel. -richtig: CSV -> As notas são uma tabela, e o Excel abre ficheiros CSV diretamente. - -runde: -frage: O Ludwig escreve uma carta à Zora. -richtig: txt -> Uma carta é texto para pessoas. Não precisa de colunas nem de chaves. - -runde: -frage: Um jogo guardado com nome, nível e uma lista de todas as chaves apanhadas. -richtig: JSON -> Em JSON, uma lista pode ficar encaixada numa entrada. Em CSV dificilmente cabe numa célula. - -runde: -frage: Um aparelho de medição guarda a hora e a temperatura a cada minuto, durante um ano inteiro. -richtig: CSV -> Muitas linhas iguais com as mesmas colunas: para isto, o CSV é o mais pequeno. O JSON repetiria as chaves em todas as linhas. - -runde: -frage: Uma aplicação de meteorologia vai buscar a previsão a um servidor na internet. -richtig: JSON -> O JSON é o padrão na web. Quase todas as aplicações recebem os dados assim. - -runde: -frage: O diário do castelo, em que cada entrada é uma frase curta. -richtig: txt -> Cada linha é uma frase para pessoas. É lida linha a linha, como na lição 24. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo reconhecer os mesmos dados em txt, CSV e JSON. → Os mesmos animais três vezes -- Consigo comparar pontos fortes e fracos de txt, CSV e JSON. → O que sabe fazer cada formato? -- Consigo converter um ficheiro CSV em frases. → Exercício: De CSV para frases -- Consigo converter um ficheiro CSV em JSON. → Exercício: De CSV para JSON -::: - -## Teste de conhecimentos - -::: quiz -? Que formato o Excel abre diretamente como tabela? -→ O que sabe fazer cada formato? -- [ ] txt -- [x] CSV -- [ ] JSON - -? Porque é que um ficheiro JSON é normalmente maior do que um CSV com os mesmos dados? -→ O que sabe fazer cada formato? -- [ ] Porque o JSON guarda mais números. -- [x] Porque as chaves se repetem em cada entrada. -- [ ] Porque o JSON não usa vírgulas. - -? Em que formato cada valor diz o que significa? -→ O que sabe fazer cada formato? -- [ ] txt -- [ ] CSV -- [x] JSON -> Em JSON a chave está mesmo antes do valor, por exemplo "idade": 7. - -? Liga cada objetivo a um formato. -→ O que sabe fazer cada formato? -= uma carta à Zora -> txt -= a pauta de notas da turma -> CSV -= um jogo guardado com listas -> JSON -::: -`,qy=`--- -titel: A tua primeira janela -bereich: Janelas com Swing -kurz: Abrir uma janela tua com Java e Swing, explicado linha a linha. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- ligar o “Java verdadeiro” na área Código -- abrir uma janela com título e tamanho -- explicar o que faz cada linha do programa com janela -- explicar porque é que setVisible(true) fica no fim -::: - -## Programas com janelas - -Até agora os teus programas escreviam texto na consola. Mas a maioria dos programas que conheces tem **janelas** com botões e campos de texto. A isto chama-se uma interface gráfica. - -O Java traz uma caixa de ferramentas para isso: o **Swing**. No VisuStruct ligas o Swing assim: - -1. Abre à direita a área [Código](#zeige-codelive). -2. Clica na [roda dentada](#zeige-einstellungen) em cima à direita e escolhe Java como **Linguagem de programação**. -3. Por baixo, na secção Java, marca **Java verdadeiro (com Swing)**. - -Na primeira vez que clicas em [▶︎ Executar](#zeige-ausfuehren), o VisuStruct descarrega uma única vez cerca de 40 MB, o que demora um pouco. Depois disso o teu código corre como Java verdadeiro, e as tuas janelas aparecem na área Código na área **Janelas Java**, por cima da consola. - -> Com o “Java verdadeiro”, as entradas pela consola (\`Scanner\`) ainda não funcionam. Para programas com entradas, desliga outra vez a opção. - -::: angeberwissen -O Swing existe desde 1998. Antes disso, o Java só tinha o AWT, mais antigo, com uma classe \`Frame\`. Para ninguém confundir os blocos novos, quase todos os nomes no Swing começam por **J**: \`JFrame\`, \`JButton\`, \`JLabel\`. Pelo J reconheces logo o Swing. -::: - -## O programa completo - -Este é o programa mais pequeno que abre uma janela. Escreve-o na área Código e clica em [▶︎ Executar](#zeige-ausfuehren): - -\`\`\`java -import javax.swing.*; - -public class MinhaJanela { - public static void main(String[] args) { - JFrame janela = new JFrame("A minha primeira janela"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); - } -} -\`\`\` - -Aparece uma janela cinzenta vazia com o título “A minha primeira janela”. Mais nada, mas é a tua própria janela! - -A moldura com \`public class\` e \`main\` já conheces da lição Java. Novas são a primeira linha e as quatro linhas dentro de \`main\`. Vamos vê-las uma a uma. - -::: ludwig -Olha para o estrutograma ao lado do código: cada linha em \`main\` é um bloco, todos uns por baixo dos outros. No início, um programa com janelas é então só uma sequência. -::: - -## Linha a linha - -| Linha | O que faz | -|---|---| -| \`import javax.swing.*;\` | Traz a caixa de ferramentas Swing para o programa. Sem esta linha o Java não conhece \`JFrame\`. | -| \`JFrame janela = new JFrame("A minha primeira janela");\` | Constrói uma janela nova. O texto entre parênteses é o título em cima, na moldura da janela. Depois falas com ela através da variável \`janela\`. | -| \`janela.setSize(300, 200);\` | A janela fica com 300 píxeis de largura e 200 píxeis de altura. | -| \`janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\` | Quando alguém fecha a janela, o programa também termina. | -| \`janela.setVisible(true);\` | Só agora a janela fica visível. | - -O ponto em \`janela.setSize(…)\` quer dizer: “Janela, faz isto!” Antes do ponto está quem deve fazer alguma coisa, depois do ponto o que deve fazer. - -> Sem \`setDefaultCloseOperation\`, o Java só esconde a janela quando ela é fechada. O programa continua a correr sem se ver. - -::: quiz -? O que quer dizer o ponto em \`janela.setSize(300, 200)\`? -- [x] “Janela, faz isto!”: antes do ponto está quem faz, depois o que faz. -- [ ] Separa os dois números. -- [ ] Termina a linha. -> Antes do ponto está o objeto \`janela\`, depois o seu método \`setSize\`. -::: - -## Porque é que setVisible fica no fim - -\`setVisible(true)\` mostra a janela tal como ela está nesse momento. Por isso preparas tudo primeiro: título, tamanho e, mais tarde, também botões. Só mesmo no fim tornas a janela visível. - -O que só pões na janela depois de \`setVisible(true)\` muitas vezes não aparece. É que o Java não volta a desenhar a janela sozinho. Às vezes só aparece quando se muda o tamanho da janela. Erros destes são difíceis de encontrar. - -::: ludwig -Primeiro preparar, depois mostrar. Como no teatro: a cortina só sobe quando o palco está pronto. -::: - -Experimenta: apaga a linha com \`setVisible(true)\` e executa o programa outra vez. O programa corre, mas não vês nenhuma janela. - -## Classes e objetos - -Isto não está no programa da disciplina, mas ajuda-te a perceber o Swing. - -::: angeberwissen -O Java é, na verdade, uma linguagem **orientada a objetos**. \`JFrame\` é uma classe, ou seja, uma planta para janelas. Com \`new JFrame(…)\` o Java constrói, segundo essa planta, uma janela a sério: um **objeto**. Com dois \`new\` podias construir duas janelas, ambas com a mesma planta. - -\`setSize\` e \`setVisible\` são métodos que qualquer objeto janela sabe fazer. Por isso escreves \`janela.setSize(…)\`: o objeto \`janela\` executa o seu método. O teu próprio programa também é uma classe, neste caso \`MinhaJanela\`. -::: - -## Jogo: O que acontece? - -::: spiel frage -titel: Jogo: O que acontece? -intro: O Ludwig andou a mexer no programa da janela. Lê as linhas e prevê o que acontece. Seis rondas. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -frage: O que vês depois de executar? -- uma janela com o título "Olá" -- [x] nenhuma janela -- uma mensagem de erro -> Falta \`setVisible(true)\`. A janela está construída, mas fica invisível. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(200, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); -frage: Como é a janela? -- mais larga do que alta -- [x] mais alta do que larga -- quadrada -> O primeiro número é a largura, o segundo a altura: 200 de largura, 300 de altura. - -runde: - JFrame janela = new JFrame("Olá"); - janela.setSize(300, 200); - janela.setVisible(true); -frage: Fechas a janela. O que acontece ao programa? -- Termina. -- [x] Continua a correr, invisível. -- A janela volta logo a abrir. -> Sem \`setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\`, o Java só esconde a janela. - -runde: - JFrame janela = new JFrame(); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setVisible(true); -frage: O que aparece no topo da moldura da janela? -- janela -- JFrame -- [x] nada, o título está vazio -> Sem texto entre os parênteses, a janela não tem título. O nome da variável \`janela\` nunca aparece na janela. - -runde: - public class Teste { - public static void main(String[] args) { - JFrame janela = new JFrame("Teste"); - janela.setVisible(true); - } - } -frage: O que diz o javac? -- [x] cannot find symbol: class JFrame -- nada, a janela aparece -- missing return statement -> Falta a linha \`import javax.swing.*;\`. Sem ela, o Java não conhece \`JFrame\`. - -runde: - JFrame a = new JFrame("Uma"); - JFrame b = new JFrame("Duas"); - a.setSize(300, 200); - b.setSize(300, 200); - a.setVisible(true); -frage: O que vês? -- [x] uma janela com o título "Uma" -- duas janelas -- uma janela com o título "Duas" -> Duas janelas feitas com a mesma planta, mas só a \`a\` fica visível. -::: - -## Tarefa: a tua própria janela - -Altera o programa de forma que - -- o título diga “Olá” e o teu nome, -- a janela tenha 400 píxeis de largura e 300 píxeis de altura, -- o programa termine quando fechas a janela. - -Executa-o e verifica os três pontos. - -::: ludwig -Não te apetece escrever tanto? Com o “Java verdadeiro” podes escrever na área Código só as quatro linhas de \`main\`. O VisuStruct põe-nas sozinho dentro de uma classe e acrescenta as linhas \`import\`. Num ambiente de desenvolvimento Java a sério precisas, no entanto, do programa completo. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo ligar o “Java verdadeiro” na área Código. → Programas com janelas -- Consigo abrir uma janela com título e tamanho. → O programa completo -- Consigo explicar o que faz cada linha do programa com janela. → Linha a linha -- Consigo explicar porque é que setVisible(true) fica no fim. → Porque é que setVisible fica no fim -::: - -## Teste de conhecimentos - -::: quiz -? Que linha torna a janela visível? -→ Porque é que setVisible fica no fim -- [ ] janela.setSize(300, 200); -- [x] janela.setVisible(true); -- [ ] new JFrame("Olá"); -> Sem setVisible(true) a janela fica invisível. - -? Onde fica melhor janela.setVisible(true)? -→ Porque é que setVisible fica no fim -- [ ] Mesmo no início de main -- [x] No fim, quando a janela já está preparada -- [ ] Tanto faz. -> O que vem depois de setVisible(true) muitas vezes não aparece. - -? O que faz setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)? -→ Linha a linha -- [ ] A janela fecha-se logo. -- [x] Quando se fecha a janela, o programa termina. -- [ ] A janela já não se pode fechar. - -? Como reconheces os blocos do Swing? -→ Linha a linha -- [x] O nome começa por J, p. ex. JFrame. -- [ ] Estão entre chavetas. -- [ ] Terminam em Window. -::: -`,Uy=`--- -titel: Um botão na janela -bereich: Janelas com Swing -kurz: Pôr um botão na janela e arrumá-lo bem com um layout. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir um botão e pô-lo na janela com add -- explicar porque é que o botão entra antes de setVisible -- usar o FlowLayout para o botão ter o tamanho normal -- construir uma janela com um botão em que se pode carregar -::: - -## Construir um botão - -Uma janela vazia é aborrecida. Agora vai lá para dentro um botão. No Swing, um botão chama-se **JButton** (button é inglês para botão). - -Precisas de duas linhas novas: - -\`\`\`java -JButton botao = new JButton("Clica-me"); -janela.add(botao); -\`\`\` - -- \`new JButton("Clica-me")\` constrói um botão. O texto entre parênteses fica escrito no botão. -- \`janela.add(botao)\` põe o botão na janela. Sem \`add\` o botão existe, mas não está em lado nenhum e não o vês. - -::: quiz -? O que está escrito no botão depois de \`new JButton("Iniciar")\`? -- [ ] botao -- [x] Iniciar -- [ ] JButton -> O texto entre parênteses é a legenda. \`botao\` é só o nome da variável. -::: - -## O programa completo - -As duas linhas ficam **antes** de \`setVisible(true)\`, porque a janela deve primeiro ficar pronta e só depois ser mostrada: - -\`\`\`java -import javax.swing.*; - -public class JanelaBotao { - public static void main(String[] args) { - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton botao = new JButton("Clica-me"); - janela.add(botao); - - janela.setVisible(true); - } -} -\`\`\` - -Executa o programa. Surpresa: o botão é enorme e enche a janela toda! - -::: ludwig -A ordem é a mesma da primeira janela: preparar, construir o botão, pô-lo na janela e só no fim mostrar. As linhas em branco no código ajudam-te a ver estas partes. -::: - -## O botão gigante - -A forma como uma janela arruma as suas partes é decidida pelo seu **layout**. Sem mais indicações, um \`JFrame\` põe tudo no meio e torna-o tão grande como a janela inteira. - -Com outro layout o botão fica com o tamanho normal. O **FlowLayout** põe tudo lado a lado, como palavras numa linha, só do tamanho necessário: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class JanelaBotao { - public static void main(String[] args) { - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new FlowLayout()); - - JButton botao = new JButton("Clica-me"); - janela.add(botao); - - janela.setVisible(true); - } -} -\`\`\` - -O \`FlowLayout\` pertence à caixa de ferramentas AWT, mais antiga. Por isso há uma segunda linha em cima: \`import java.awt.*;\`. - -::: angeberwissen -No FlowLayout os blocos correm como texto: se um botão já não cabe na linha, passa para a seguinte. Torna a janela estreita e vê como os botões mudam de linha. Flow é inglês para fluxo. -::: - -## Clicar funciona, mas nada acontece - -Clica no botão. Ele fica um pouco mais escuro enquanto o carregas. O Swing mostra assim que foi carregado. Fora isso, não acontece nada. - -Isto não é um erro: ainda não disseste ao programa **o que** deve acontecer com um clique. Isso aprendes na próxima lição. - -## Jogo: Desativar a bomba - -::: spiel bombe -titel: Jogo: Desativar a bomba -intro: Em cada programa de janela há **exatamente um erro**, e a bomba está a contar. Lê o que o programa deve fazer e toca na linha errada antes de o tempo acabar. Seis rondas, 25 segundos cada. -zeit: 25 - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - JButton botao = new JButton(Clica-me); - janela.add(botao); - janela.setVisible(true); -frage: Deve mostrar um botão "Clica-me". -fehler: 3 -besser: JButton botao = new JButton("Clica-me"); -> A legenda é um texto e precisa de aspas. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - JButton botao = new JButton("OK"); - janela.add(janela); - janela.setVisible(true); -frage: Deve pôr o botão "OK" na janela. -fehler: 4 -besser: janela.add(botao); -> Na janela entra o botão, não a própria janela. - -runde: - import java.swing.*; - import java.awt.*; -frage: Deve trazer o Swing e o FlowLayout para o programa. -fehler: 1 -besser: import javax.swing.*; -> O Swing está em \`javax.swing\`, com x. O FlowLayout vem de \`java.awt\`, sem x. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout); - janela.add(new JButton("OK")); - janela.setVisible(true); -frage: Deve mostrar o botão no tamanho normal. -fehler: 3 -besser: janela.setLayout(new FlowLayout()); -> Depois de \`new\` e do nome vêm sempre parênteses, mesmo que não haja nada lá dentro. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout()); - JButton botao = new Jbutton("OK"); - janela.add(botao); - janela.setVisible(true); -frage: Deve mostrar um botão "OK". -fehler: 4 -besser: JButton botao = new JButton("OK"); -> O Java distingue maiúsculas de minúsculas: \`JButton\` com B maiúsculo. - -runde: - JFrame janela = new JFrame("Botão"); - janela.setSize(300, 200); - janela.setLayout(new FlowLayout()); - janela.add(new JButton("OK")); - janela.setVisible(false); -frage: Deve mostrar a janela com o botão. -fehler: 5 -besser: janela.setVisible(true); -> Com \`false\`, a janela fica invisível. -::: - -## Tarefa: clica-me - -Constrói uma janela com o título “Teste do botão”, com 300 por 200 píxeis e um botão “Clica-me” de tamanho normal. Deve ser possível carregar no botão, mesmo que ainda não aconteça nada. - -Extra: põe um segundo botão “Eu também” ao lado. Por que ordem aparecem os botões? Troca as duas linhas \`add\` e experimenta outra vez. - -**Terminaste quando …** - -- o título da janela diz “Teste do botão”, -- a janela tem 300 píxeis de largura e 200 de altura, -- o botão “Clica-me” só é do tamanho do texto e não enche a janela toda, -- o botão afunda visivelmente quando clicas nele. - -::: ludwig -Cada botão precisa da sua própria variável, por exemplo \`botao\` e \`botao2\`, e do seu próprio \`add\`. O FlowLayout põe os botões pela ordem das linhas \`add\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir um botão e pô-lo na janela com add. → Construir um botão -- Consigo explicar porque é que o botão entra antes de setVisible(true). → O programa completo -- Consigo usar o FlowLayout para o botão ter o tamanho normal. → O botão gigante -- Consigo construir uma janela com um botão em que se pode carregar. → Tarefa: clica-me -::: - -## Teste de conhecimentos - -::: quiz -? O que faz janela.add(botao)? -→ Construir um botão -- [ ] Constrói um botão novo. -- [x] Põe o botão na janela. -- [ ] Torna o botão clicável. -> O botão é construído com new JButton(…). - -? Porque é que, sem FlowLayout, o botão enche a janela toda? -→ O botão gigante -- [ ] Porque o texto é demasiado comprido -- [x] Porque sem layout próprio a janela torna tudo tão grande como ela -- [ ] Porque falta o setSize - -? Que linha import precisas para o FlowLayout? -→ O botão gigante -- [ ] import javax.swing.*; -- [x] import java.awt.*; -- [ ] import java.util.*; -> O FlowLayout vem do AWT, mais antigo. - -? O que acontece nesta lição quando clicas no botão? -→ Tarefa: clica-me -- [ ] O programa termina. -- [x] O botão fica mais escuro por um momento, e mais nada. -- [ ] No botão aparece “Fui clicado”. -> O que deve acontecer com um clique aprendes na próxima lição. -::: -`,Qy=`--- -titel: O botão reage -bereich: Janelas com Swing -kurz: Com um ActionListener decides o que acontece com um clique. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar o que é um evento -- usar addActionListener para decidir o que acontece com um clique -- executar várias instruções com um clique -- construir um botão que muda o seu texto depois do clique -::: - -## Um clique é um evento - -Na lição anterior podias carregar no botão, mas nada acontecia. Num programa com janelas é a pessoa que decide quando acontece alguma coisa: clica, escreve ou fecha uma janela. Cada ação destas chama-se **evento**. - -Por isso o teu programa tem de esperar pelo clique e dar por ele. Para isso registas no botão um ouvinte, um **ActionListener** (inglês para “ouvinte de ações”). A cada clique o botão chama o seu ouvinte, e o ouvinte executa o teu código. - -::: ludwig -Até agora o teu programa corria de cima para baixo, como no estrutograma. O código do ouvinte, pelo contrário, só corre mais tarde, sempre que alguém clica. Quantas vezes isso acontece, ninguém sabe de antemão. -::: - -## A linha com a seta - -É assim que registas o ouvinte: - -\`\`\`java -botao.addActionListener(e -> botao.setText("Fui clicado")); -\`\`\` - -Lido de fora para dentro: - -- \`botao.addActionListener( … )\` regista um ouvinte no botão. -- \`e\` é o evento. Contém, por exemplo, quando foi o clique. Aqui não precisas dele, mas o nome tem de estar lá. -- \`->\` lê-se “então faz”. -- \`botao.setText("Fui clicado")\` é o que acontece com o clique: o botão recebe um texto novo. - -A linha vem depois de \`new JButton(…)\`, porque o botão já tem de existir. E, como tudo o resto, vem antes de \`setVisible(true)\`. - -::: quiz -? O que representa o \`e\` em \`e -> botao.setText(…)\`? -- [x] O evento, ou seja, o clique -- [ ] “Fim” -- [ ] Um erro -> Aqui não precisas de \`e\`, mas o nome tem de estar lá. -::: - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class ClicaMe { - public static void main(String[] args) { - JFrame janela = new JFrame("Clica-me"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new FlowLayout()); - - JButton botao = new JButton("Clica-me"); - botao.addActionListener(e -> botao.setText("Fui clicado")); - janela.add(botao); - - janela.setVisible(true); - } -} -\`\`\` - -Executa-o e clica no botão. Agora diz “Fui clicado”. - -> Se o texto novo for mais comprido do que o antigo, o FlowLayout alarga o botão sozinho. - -## Várias instruções com um clique - -Se com um clique deve acontecer mais do que uma coisa, pões chavetas depois da seta. Lá dentro, cada instrução tem o seu ponto e vírgula, como no corpo de um ciclo: - -\`\`\`java -botao.addActionListener(e -> { - botao.setText("Fui clicado"); - janela.setTitle("Obrigado!"); - System.out.println("Clique!"); -}); -\`\`\` - -\`System.out.println\` escreve na [consola](#zeige-konsole), como de costume. Clica várias vezes: a cada clique aparece uma nova linha “Clique!”. Assim vês que o código do ouvinte corre mesmo a cada clique. - -::: ludwig -Atenção ao fim: primeiro \`}\` fecha o bloco, depois \`)\` fecha o parêntese de \`addActionListener\`, e só então vem o ponto e vírgula. Ou seja, \`});\`. Se faltar alguma coisa, aparece uma indicação por baixo do código. -::: - -## Jogo: Quem está a ouvir? - -::: spiel zuhoerer -titel: Jogo: Quem está a ouvir? -intro: O Ludwig mostra-te código e a janela correspondente. Por baixo vês que botões são clicados, um a seguir ao outro. O que acontece? Depois da tua resposta, o Ludwig reproduz os cliques: vês que ouvinte ouve o evento e que linhas correm a seguir. -frage: O que diz a etiqueta depois dos cliques? - -runde: - JFrame janela = new JFrame("Saudação"); - JLabel texto = new JLabel("Início"); - JButton botao = new JButton("Olá"); - botao.addActionListener(e -> texto.setText("Olá mundo")); -klicks: Olá -- Início -- [x] Olá mundo -- Olá -> O botão tem um ouvinte. Com o clique executa \`texto.setText("Olá mundo")\`, e a etiqueta mostra “Olá mundo”. - -runde: - JFrame janela = new JFrame("Fruta"); - JLabel texto = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> texto.setText("Maçã")); - b.addActionListener(e -> texto.setText("Pera")); -klicks: A, B -- Maçã -- [x] Pera -- Maçã Pera -> Cada botão tem o seu próprio ouvinte. Primeiro o A escreve “Maçã”, depois o B substitui-o por “Pera”. O \`setText\` troca o texto antigo, não acrescenta nada. - -runde: - JFrame janela = new JFrame("Fruta"); - JLabel texto = new JLabel("?"); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - a.addActionListener(e -> texto.setText("Maçã")); -klicks: B -- Maçã -- Pera -- [x] ? -> Ninguém se inscreveu no botão B: não há \`b.addActionListener\`. O clique é um evento, mas ninguém está a ouvir. Por isso o ponto de interrogação fica. - -runde: - JFrame janela = new JFrame("Cores"); - JLabel texto = new JLabel("nenhuma"); - JButton vermelho = new JButton("Vermelho"); - JButton azul = new JButton("Azul"); - vermelho.addActionListener(e -> texto.setText("Azul")); - azul.addActionListener(e -> texto.setText("Vermelho")); -klicks: Vermelho -- Vermelho -- [x] Azul -- nenhuma -> Atenção: o que acontece é decidido pelo código no ouvinte, não pela legenda do botão. O ouvinte do botão “Vermelho” escreve “Azul”. - -runde: - JFrame janela = new JFrame("Botão"); - JLabel texto = new JLabel("Clica, por favor"); - JButton botao = new JButton("Clica-me"); - botao.addActionListener(e -> { - botao.setText("Obrigado!"); - texto.setText("Clicado"); - }); -klicks: Clica-me -frage: O que diz o botão depois do clique? -- Clica-me -- [x] Obrigado! -- Clicado -> O bloco depois da seta tem duas instruções. As duas correm com o clique, uma a seguir à outra: o botão fica com “Obrigado!”, a etiqueta com “Clicado”. - -runde: - JFrame janela = new JFrame("Consola"); - JButton botao = new JButton("Vai"); - botao.addActionListener(e -> System.out.println("Clique!")); -klicks: Vai, Vai, Vai -frage: Quantas linhas “Clique!” há depois na consola? -- 1 -- [x] 3 -- 0 -> O ouvinte corre a **cada** clique, não só no primeiro. Três cliques, três linhas. -::: - -## ActionListener é uma interface - -Isto não está no programa da disciplina. Se quiseres saber o que está por trás da seta, continua a ler. - -::: angeberwissen -\`ActionListener\` é uma **interface**, uma espécie de contrato. Diz: quem quiser ser um ActionListener tem de ter um método \`actionPerformed(ActionEvent e)\`. A cada clique o botão chama exatamente esse método. -::: - -A linha com a seta já conheces do passo 3: - -\`\`\`java -botao.addActionListener(e -> botao.setText("Fui clicado")); -\`\`\` - -Sem a seta escreve-se o ouvinte como uma classe sem nome que cumpre o contrato (uma classe anónima): - -\`\`\`java -botao.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - botao.setText("Fui clicado"); - } -}); -\`\`\` - -Para isso precisas ainda de \`import java.awt.event.*;\` em cima. As duas formas fazem exatamente o mesmo. A seta \`e -> …\` é a forma curta (uma expressão lambda, desde o Java 8): \`e\` é o parâmetro de \`actionPerformed\`, e depois da seta vem o seu corpo. A forma curta funciona porque a interface tem um único método. Assim o Java sabe de que método se trata. - -## Jogo: Contrato cumprido? - -::: spiel vertrag -titel: Jogo: Contrato cumprido? -intro: O contrato \`ActionListener\` exige exatamente um método: \`public void actionPerformed(ActionEvent e)\`. O Ludwig mostra-te código. Cumpre o contrato, de forma a poder ser inscrito num botão? O Ludwig verificou cada resposta com o compilador de Java verdadeiro. -frage: Isto cumpre o contrato ActionListener? -antworten: cumprido | não cumprido - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: cumprido -> Está tudo: \`implements ActionListener\` assina o contrato, e o método chama-se exatamente \`actionPerformed\`, é \`public\`, não devolve nada (\`void\`) e recebe um \`ActionEvent\`. - -runde: - class Saudacao implements ActionListener { - public void actionPerfomed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Olha bem: \`actionPerfomed\` em vez de \`actionPerformed\`, falta um r. Para o Java é um método completamente diferente. O compilador avisa que falta \`actionPerformed\`. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed() { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Falta o parâmetro. O contrato exige \`actionPerformed(ActionEvent e)\`, porque com o clique o botão entrega o evento. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent evento) { - System.out.println("Olá"); - } - } -richtig: cumprido -> O nome do parâmetro escolhe-se livremente. Só conta o tipo \`ActionEvent\`. Em vez de \`e\` também se pode chamar \`evento\`. - -runde: - class Saudacao implements ActionListener { - void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } -richtig: não cumprido -> Falta o \`public\`. Todos os métodos de uma interface são públicos, porque o botão tem de os poder chamar de fora. Sem \`public\` o compilador indica um erro. - -runde: - class Saudacao implements ActionListener { - public int actionPerformed(ActionEvent e) { - return 0; - } - } -richtig: não cumprido -> O contrato diz \`void\`: o método não devolve nada. Com \`int\` como tipo de retorno já não serve. - -runde: - class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - dizOla(); - } - void dizOla() { - System.out.println("Olá"); - } - } -richtig: cumprido -> Métodos a mais são permitidos. O contrato só exige que o \`actionPerformed\` exista, não que não haja mais nada. - -runde: - class Saudacao { - public void actionPerformed(ActionEvent e) { - System.out.println("Olá"); - } - } - botao.addActionListener(new Saudacao()); -richtig: não cumprido -> O método está certo, mas o contrato não foi assinado: falta \`implements ActionListener\`. Num botão, o Java só aceita objetos que cumprem oficialmente o contrato. - -runde: - botao.addActionListener(e -> System.out.println("Olá")); -richtig: cumprido -> A seta é a forma curta. Como o contrato só tem um método, o Java sabe: \`e\` é o parâmetro de \`actionPerformed\`, e depois da seta vem o seu corpo. - -runde: - botao.addActionListener((a, b) -> System.out.println("Olá")); -richtig: não cumprido -> Aqui a seta tem dois parâmetros. Mas o \`actionPerformed\` recebe exatamente um, o evento. Por isso esta forma curta não serve para o contrato. -::: - -## Tarefa: fui clicado - -Agora terminas a tarefa: constrói uma janela com um botão “Clica-me” de tamanho normal. Depois do clique, o botão diz “Fui clicado”. - -Extra: constrói dois botões “Vermelho” e “Azul”. Um clique num botão escreve o seu nome no título da janela, por exemplo “Escolheste Vermelho”. - -**Terminaste quando …** - -- o botão diz “Clica-me” antes do clique, -- depois do clique diz “Fui clicado”, -- o botão não enche a janela toda. - -::: ludwig -Cada botão recebe o seu próprio ouvinte, com o seu próprio \`addActionListener\`. O título mudas com \`janela.setTitle(…)\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar o que é um evento. → Um clique é um evento -- Consigo usar addActionListener para decidir o que acontece com um clique. → A linha com a seta -- Consigo executar várias instruções com um clique. → Várias instruções com um clique -- Consigo construir um botão que muda o seu texto depois do clique. → Tarefa: fui clicado -::: - -## Teste de conhecimentos - -::: quiz -? O que é um ActionListener? -→ Um clique é um evento -- [ ] Um botão com texto -- [x] Um ouvinte que executa o teu código a cada clique -- [ ] Um layout para janelas -> Registas o ouvinte no botão com addActionListener. - -? Quando corre botao.setText("Fui clicado") dentro do ouvinte? -→ A linha com a seta -- [ ] Logo no início do programa -- [x] Sempre que alguém clica no botão -- [ ] Só no primeiro clique -> O código do ouvinte só corre quando o evento acontece. - -? Como termina um ouvinte com chavetas? -→ A linha com a seta -- [ ] };) -- [x] }); -- [ ] );} -> Primeiro fecha o bloco, depois o parêntese de addActionListener, depois o ponto e vírgula. - -? Associa cada parte à sua função. -→ A linha com a seta -= JButton -> um botão -= addActionListener -> registar um ouvinte -= setText -> mudar o texto -= setVisible(true) -> mostrar a janela -::: -`,$y=`--- -titel: Duplicar um número na janela -bereich: Janelas com Swing -kurz: Arrumar uma etiqueta, um campo de texto e um botão com um GridLayout e calcular com o texto do campo de texto. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pôr um JLabel e um JTextField na janela -- explicar porque é que sem layout só se vê a última peça -- arrumar tudo umas por baixo das outras com GridLayout -- calcular com getText, Integer.parseInt e setText -- escrever um programa que não falha com “abc” -::: - -## O objetivo - -Vamos construir uma pequena calculadora com janela: em cima está uma etiqueta, por baixo um campo de texto e um botão **Calcular**. Se escreveres 2 e clicares, o campo de texto mostra 4. Clicas outra vez e passa a 8, depois 16 e assim por diante. - -Para isso precisas de duas peças novas: - -- **JLabel**: uma etiqueta, ou seja, texto simples na janela. -- **JTextField**: um campo de texto onde se pode escrever. - -Como nas últimas lições, marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Três peças na janela - -Pomos as três peças na janela, tal como o botão na lição 29: - -\`\`\`java -import javax.swing.*; - -public class Duplicar { - public static void main(String[] args) { - JFrame janela = new JFrame("Duplicar número"); - janela.setSize(250, 150); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JLabel etiqueta = new JLabel("Escreve um número:"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular"); - janela.add(etiqueta); - janela.add(campo); - janela.add(botao); - - janela.setVisible(true); - } -} -\`\`\` - -Executa o programa. Ups: só se vê o botão gigante. Onde estão a etiqueta e o campo de texto? - -## Porque só se vê o botão - -::: ludwig -Lembras-te do botão gigante? Sem um layout próprio, um \`JFrame\` só tem **um** lugar: o meio. Cada \`add\` põe a peça nova exatamente aí, do tamanho da janela inteira. As três peças ficam por isso umas por cima das outras no mesmo lugar, e a janela só mostra a última que lá puseste: o botão. Assim não consegues usar o programa. -::: - -A solução é outra vez um layout. Desta vez usamos o **GridLayout**. Divide a janela em células do mesmo tamanho, como uma grelha: - -\`\`\`java -janela.setLayout(new GridLayout(0, 1)); -\`\`\` - -Os dois números são linhas e colunas. \`0\` linhas quer dizer “tantas quantas forem precisas”, \`1\` coluna quer dizer: tudo umas por baixo das outras. Para o \`GridLayout\` precisas ainda de \`import java.awt.*;\` lá em cima. - -| Layout | Como arruma | -|---|---| -| sem layout | tudo no meio, umas por cima das outras | -| \`FlowLayout\` | lado a lado como palavras, com mudança de linha quando é preciso | -| \`GridLayout(0, 1)\` | umas por baixo das outras, todas as linhas da mesma altura | - -## A janela com GridLayout - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Duplicar { - public static void main(String[] args) { - JFrame janela = new JFrame("Duplicar número"); - janela.setSize(250, 150); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel etiqueta = new JLabel("Escreve um número:"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular"); - janela.add(etiqueta); - janela.add(campo); - janela.add(botao); - - janela.setVisible(true); - } -} -\`\`\` - -Agora as três estão umas por baixo das outras. Podes escrever no campo de texto e carregar no botão. Mas o programa ainda não calcula nada. - -::: angeberwissen -Com \`new GridLayout(2, 3)\` obténs 2 linhas com 3 colunas cada, ou seja, 6 células do mesmo tamanho. É assim que se constroem, por exemplo, as teclas de uma calculadora. As peças preenchem as células pela ordem das linhas \`add\`, linha a linha da esquerda para a direita. -::: - -## Calcular com o texto do campo de texto - -Com um clique, o programa deve ir buscar o número ao campo de texto, duplicá-lo e voltar a escrevê-lo lá. Isso faz-se com três métodos: - -- \`campo.getText()\` dá-te o texto do campo de texto, por exemplo \`"2"\`. -- \`Integer.parseInt(…)\` transforma-o no número 2. Já conheces isto da lição 22. -- \`campo.setText(…)\` escreve um texto novo no campo de texto. - -Juntamente com o ActionListener da lição 30 fica assim: - -\`\`\`java -botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); -}); -\`\`\` - -\`setText\` precisa de um texto. \`"" + numero * 2\` junta o resultado a um texto vazio e assim transforma o número num texto. - -## Não é um número? Sem falhas! - -Escreve “abc” no campo de texto e clica em Calcular. A janela fica, mas não acontece nada, e na [consola](#zeige-konsole) aparece uma \`NumberFormatException\`. Da lição 22 já sabes o que fazer: - -\`\`\`java -botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } -}); -\`\`\` - -Em vez de um erro na consola, vês agora um aviso na janela. - -::: ludwig -A seta já tem um \`e\` para o evento. Por isso a exceção no \`catch\` precisa de outro nome, aqui \`erro\`. O Java não permite duas variáveis com o mesmo nome. -::: - -::: quiz -? Porque é que a exceção no \`catch\` se chama aqui \`erro\` e não \`e\`? -- [ ] O \`catch\` exige sempre o nome \`erro\`. -- [x] \`e\` já é o evento da seta, e o Java não permite duas variáveis com o mesmo nome. -- [ ] \`e\` só é permitido para números. -> Podes escolher o nome à vontade, só não pode repetir-se. -::: - -## Jogo: O que fica na janela? - -::: spiel frage -titel: Jogo: O que fica na janela? -intro: O Ludwig escreve algo no campo de texto e clica em Calcular. Lê o ouvinte e prevê o que a janela mostra depois. Seis rondas. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - }); -frage: No campo de texto está 21. O que fica lá depois do clique? -- 2121 -- [x] 42 -- 21 -> \`parseInt\` transforma o texto no número 21. O dobro é 42. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - }); -frage: No campo de texto está 21. Clicas duas vezes. O que fica lá depois? -- 42 -- [x] 84 -- 4242 -> Cada clique duplica o que está no campo nesse momento: 21, 42, 84. - -runde: - botao.addActionListener(e -> { - campo.setText(campo.getText() + campo.getText()); - }); -frage: No campo de texto está 21. O que fica lá depois do clique? -- 42 -- [x] 2121 -- 21 -> Sem \`parseInt\` continua a ser texto, e \`+\` junta textos. - -runde: - botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } - }); -frage: No campo de texto está abc. O que acontece com o clique? -- [x] A etiqueta mostra "Escreve um número inteiro!" -- No campo de texto fica abcabc. -- A janela vai abaixo. -> \`parseInt\` lança uma NumberFormatException, e o \`catch\` apanha-a. - -runde: - botao.addActionListener(e -> { - try { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero * 2); - } catch (NumberFormatException erro) { - etiqueta.setText("Escreve um número inteiro!"); - } - }); -frage: No campo de texto está 2.5. O que acontece com o clique? -- No campo de texto fica 5.0. -- No campo de texto fica 5. -- [x] A etiqueta mostra "Escreve um número inteiro!" -> \`Integer.parseInt\` só conhece números inteiros. Para ele, 2.5 não é um número. - -runde: - botao.addActionListener(e -> { - int numero = Integer.parseInt(campo.getText()); - campo.setText("" + numero + numero); - }); -frage: No campo de texto está 5. O que fica lá depois do clique? -- 10 -- [x] 55 -- 5 -> \`"" + numero\` já é um texto, e o segundo \`+\` junta outra vez o 5. Com \`"" + (numero + numero)\` o Java calcula primeiro. -::: - -## Tarefa: duplicar um número - -Junta o programa todo: - -- uma janela com o título “Duplicar número”, com 250 píxeis de largura e 150 píxeis de altura, -- umas por baixo das outras, uma etiqueta, um campo de texto e um botão “Calcular”, -- cada clique duplica o número no campo de texto: 2, 4, 8, 16, … -- com “abc” aparece um aviso na etiqueta em vez de uma falha. - -Extra: um segundo botão “Dividir por 2” divide o número por 2. O que acontece com 5? - -**Terminaste quando …** - -- o título é “Duplicar número” e etiqueta, campo de texto e botão estão uns por baixo dos outros, -- o 2 passa a 4, 8 e 16 com três cliques, -- com “abc” aparece um aviso na etiqueta e o programa continua a funcionar. - -::: ludwig -O botão “Dividir por 2” entra no GridLayout como quarta linha e recebe o seu próprio ActionListener. Com \`int\`, o Java corta as casas decimais ao dividir. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pôr um JLabel e um JTextField na janela. → Três peças na janela -- Consigo explicar porque é que sem layout só se vê a última peça. → Porque só se vê o botão -- Consigo arrumar tudo umas por baixo das outras com GridLayout(0, 1). → A janela com GridLayout -- Consigo calcular com getText, Integer.parseInt e setText. → Calcular com o texto do campo de texto -- Consigo escrever um programa que não falha com “abc”. → Não é um número? Sem falhas! -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que sem layout só se vê o botão? -→ Porque só se vê o botão -- [ ] Porque faltam a etiqueta e o campo de texto -- [x] Porque todas as peças estão no meio umas por cima das outras e a última tapa as outras -- [ ] Porque a janela é demasiado pequena - -? O que significa new GridLayout(0, 1)? -→ A janela com GridLayout -- [ ] Nenhuma linha e uma coluna, por isso a janela fica vazia -- [x] Tantas linhas quantas forem precisas numa coluna, ou seja, tudo umas por baixo das outras -- [ ] Uma linha, tudo lado a lado - -? O que te dá campo.getText()? -→ Calcular com o texto do campo de texto -- [ ] Sempre um número -- [x] O texto do campo de texto -- [ ] O título da janela -> Para um número precisas ainda de Integer.parseInt. - -? Associa cada peça à sua função. -→ Três peças na janela -= JLabel -> etiqueta -= JTextField -> campo de texto para escrever -= JButton -> botão -= GridLayout -> arrumação em grelha -::: -`,Yy=`--- -titel: Contador de cliques com reset -bereich: Janelas com Swing -kurz: Dois botões alteram o mesmo número: criar uma variável para a classe toda. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- explicar porque é que um ouvinte não pode alterar uma variável do main -- criar uma variável static na classe -- fazer com que dois botões alterem o mesmo número -- construir um contador com −1 que nunca fica abaixo de 0 -::: - -## O objetivo - -Uma janela conta cliques: em cima está o número, por baixo dois botões. **+1** soma um, **Reset** volta a pôr o número a 0. - -A novidade desta vez: dois botões trabalham com o **mesmo** número. Para isso precisas de uma variável que os dois ouvintes conheçam. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## A primeira tentativa - -A ideia mais óbvia é criar o número no \`main\`, como de costume, e somá-lo no ouvinte: - -\`\`\`java -int contagem = 0; -botao.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); -}); -\`\`\` - -Se executares isto com o Java verdadeiro, o compilador indica um erro: - -\`\`\` -local variables referenced from a lambda expression must be final or effectively final -\`\`\` - -::: ludwig -O ouvinte só corre mais tarde, a cada clique, muito depois de o \`main\` ter terminado. Por isso pode ler as variáveis do \`main\`, mas não alterá-las. O Java insiste: uma variável do \`main\` que aparece na seta tem de ficar igual. Para um número que muda a cada clique, precisamos de outro lugar. -::: - -## Uma variável para a classe toda - -A solução: a variável **não** vai para o \`main\`, mas diretamente para a classe, por cima do \`main\`. Assim pertence à classe toda, e qualquer ouvinte a pode alterar: - -\`\`\`java -public class Contador { - static int contagem = 0; - - public static void main(String[] args) { - // aqui a janela, como de costume - } -} -\`\`\` - -- \`static\` quer dizer: a variável pertence à própria classe. Como o \`main\` também é \`static\`, aqui é preciso. -- Uma variável destas chama-se **atributo** da classe. Vive tanto tempo como o programa, e não só enquanto o \`main\` corre. - -::: quiz -? Como se chama uma variável que está diretamente na classe e não no \`main\`? -- [ ] Parâmetro -- [x] Atributo -- [ ] Ouvinte -> Um atributo vive tanto tempo como o programa, e não só enquanto o \`main\` corre. -::: - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Contador { - static int contagem = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel numero = new JLabel("0", SwingConstants.CENTER); - JButton mais = new JButton("+1"); - JButton reset = new JButton("Reset"); - - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - reset.addActionListener(e -> { - contagem = 0; - numero.setText("0"); - }); - - janela.add(numero); - janela.add(mais); - janela.add(reset); - janela.setVisible(true); - } -} -\`\`\` - -\`SwingConstants.CENTER\` põe o texto da etiqueta no meio. Clica algumas vezes em +1 e depois em Reset. - -::: angeberwissen -Com \`numero.setFont(new Font("SansSerif", Font.BOLD, 48));\` o número fica grande e a negrito. \`Font\` vem de \`java.awt\`, que já importaste. -::: - -## Jogo: Quem está a contar? - -::: spiel zuhoerer -titel: Jogo: Quem está a contar? -intro: Agora os ouvintes fazem contas com a variável da classe. O Ludwig mostra-te o código, a janela e os cliques. Que número aparece no fim? A seguir o Ludwig reproduz os cliques. -frage: O que diz a etiqueta depois dos cliques? - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); -klicks: +1, +1, +1 -- 1 -- [x] 3 -- 0 -> A variável está na classe e guarda o valor entre os cliques. Cada clique soma um: 1, 2, 3. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - JButton reset = new JButton("Reset"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - reset.addActionListener(e -> { - contagem = 0; - numero.setText("0"); - }); -klicks: +1, +1, Reset, +1 -- 3 -- 0 -- [x] 1 -> Depois de dois cliques aparece 2. O Reset põe a variável a 0, e o último clique volta a contar até 1. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> contagem++); -klicks: +1, +1 -- 2 -- [x] 0 -- 1 -> A variável fica a 2, mas ninguém a escreve na etiqueta. Sem \`numero.setText(…)\` a janela continua a mostrar 0. Calcular e mostrar são duas coisas diferentes. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("Cliques: 0"); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("Cliques: " + contagem + 1); - }); -klicks: +1 -- Cliques: 2 -- Cliques: 1 -- [x] Cliques: 11 -> A armadilha dos parênteses: o Java calcula da esquerda para a direita. \`"Cliques: " + contagem\` dá o texto “Cliques: 1”, e \`+ 1\` junta mais um 1 no fim. - -runde: - static int contagem = 0; - JLabel numero = new JLabel("0"); - JButton um = new JButton("+1"); - JButton dez = new JButton("+10"); - um.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); - dez.addActionListener(e -> { - contagem += 10; - numero.setText("" + contagem); - }); -klicks: +10, +1, +10 -- 12 -- [x] 21 -- 111 -> Os dois ouvintes alteram a mesma variável: 10, depois 11, depois 21. \`contagem += 10\` é a forma curta de \`contagem = contagem + 10\`. -::: - -## Tarefa: contador de cliques - -Reconstrói o contador de cliques e acrescenta: - -- um botão **−1** que subtrai um, -- o número nunca deve ficar abaixo de 0. Se estiver em 0, o −1 não faz nada. - -**Terminaste quando …** - -- **+1** conta mais um e **−1** conta menos um, -- no 0 um clique em **−1** não muda nada, -- **Reset** volta a pôr o número em 0. - -::: ludwig -Para “nunca abaixo de 0”, o ouvinte do −1 precisa de um \`if\`: só se \`contagem > 0\` é que subtrai. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo explicar porque é que um ouvinte não pode alterar uma variável do main. → A primeira tentativa -- Consigo criar uma variável static na classe. → Uma variável para a classe toda -- Consigo fazer com que dois botões alterem o mesmo número. → O programa completo -- Consigo construir um contador com −1 que nunca fica abaixo de 0. → Tarefa: contador de cliques -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que o ouvinte não pode alterar a variável contagem do main? -→ A primeira tentativa -- [ ] Porque no Swing não são permitidos números -- [x] Porque o ouvinte só corre mais tarde e o Java não deixa a seta alterar variáveis do main -- [ ] Porque a contagem fica demasiado grande - -? Onde fica static int contagem = 0;? -→ Uma variável para a classe toda -- [ ] No main, bem em cima -- [x] Na classe, fora do main -- [ ] No ouvinte - -? O que faz SwingConstants.CENTER em new JLabel("0", SwingConstants.CENTER)? -→ O programa completo -- [x] Põe o texto no meio da etiqueta. -- [ ] Põe a janela no meio do ecrã. -- [ ] Aumenta a letra. -::: -`,Ky=`--- -titel: Um semáforo com cores -bereich: Janelas com Swing -kurz: Definir cores de fundo e mudar um semáforo com uma variável de estado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- pintar uma etiqueta com setOpaque e setBackground -- guardar um estado numa variável static -- usar o BorderLayout para pôr algo grande no meio e algo estreito em baixo -- explicar para que servem o FlowLayout, o GridLayout e o BorderLayout -- programar um semáforo com quatro fases -::: - -## O objetivo - -Vamos construir um semáforo: uma área grande acende a vermelho. A cada clique em **Seguinte** muda: vermelho, verde, amarelo e outra vez vermelho. - -As novidades desta vez são as **cores** e um **estado**: o programa tem de se lembrar de que cor está acesa. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Cores no Swing - -As cores estão na classe \`Color\` de \`java.awt\`. Cores já prontas são, por exemplo, \`Color.RED\`, \`Color.GREEN\`, \`Color.YELLOW\`, \`Color.ORANGE\` e \`Color.WHITE\`. - -É assim que pintas uma etiqueta: - -\`\`\`java -JLabel luz = new JLabel("", SwingConstants.CENTER); -luz.setOpaque(true); -luz.setBackground(Color.RED); -\`\`\` - -- \`setBackground(…)\` define a cor de fundo. -- Um \`JLabel\` precisa ainda de \`setOpaque(true)\`. Sem esta linha o fundo é transparente e a cor fica invisível. - -::: ludwig -\`opaque\` é inglês para “opaco”, ou seja, não transparente. Normalmente uma etiqueta é transparente, como letras escritas num vidro. Só com \`setOpaque(true)\` ganha uma área própria que se pode pintar. -::: - -::: quiz -? Que linha pinta de verde o fundo da etiqueta \`luz\`? -- [ ] \`luz.setText(Color.GREEN);\` -- [x] \`luz.setBackground(Color.GREEN);\` -- [ ] \`luz.setColor("verde");\` -> A cor de fundo define-se com \`setBackground\`. Para se ver, um \`JLabel\` precisa antes de \`setOpaque(true)\`. -::: - -## Lembrar a cor - -Para o semáforo saber o que vem a seguir, guarda o seu estado num número: 0 é vermelho, 1 é verde, 2 é amarelo. Tal como no contador de cliques da lição 32, a variável fica na classe, para o ouvinte a poder alterar: - -\`\`\`java -static int fase = 0; -\`\`\` - -A cada clique a fase avança um. Depois do amarelo (2) vem outra vez o vermelho (0): - -\`\`\`java -seguinte.addActionListener(e -> { - fase++; - if (fase > 2) { - fase = 0; - } - if (fase == 0) { - luz.setBackground(Color.RED); - } else if (fase == 1) { - luz.setBackground(Color.GREEN); - } else { - luz.setBackground(Color.YELLOW); - } -}); -\`\`\` - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Semaforo { - static int fase = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Semáforo"); - janela.setSize(200, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new BorderLayout()); - - JLabel luz = new JLabel("", SwingConstants.CENTER); - luz.setOpaque(true); - luz.setBackground(Color.RED); - JButton seguinte = new JButton("Seguinte"); - - seguinte.addActionListener(e -> { - fase++; - if (fase > 2) { - fase = 0; - } - if (fase == 0) { - luz.setBackground(Color.RED); - } else if (fase == 1) { - luz.setBackground(Color.GREEN); - } else { - luz.setBackground(Color.YELLOW); - } - }); - - janela.add(luz, BorderLayout.CENTER); - janela.add(seguinte, BorderLayout.SOUTH); - janela.setVisible(true); - } -} -\`\`\` - -Aqui entra um layout novo, o **BorderLayout**. Tem cinco lugares: \`NORTH\` (em cima), \`SOUTH\` (em baixo), \`WEST\` (à esquerda), \`EAST\` (à direita) e \`CENTER\` (no meio). O meio fica com todo o espaço que sobra. Assim a luz fica grande e o botão fica estreito em baixo. - -::: angeberwissen -O BorderLayout é o layout que um \`JFrame\` usa quando não lhe dás nenhum. Um \`add\` sem indicação de lugar vai para o \`CENTER\`. É por isso que na lição 31 as peças ficaram todas umas por cima das outras. -::: - -::: angeberwissen -Os profissionais avançam a fase numa linha: \`fase = (fase + 1) % 3;\`. O operador de resto \`%\` dá o resto da divisão. 3 % 3 é 0, por isso depois do 2 recomeça no 0. -::: - -## Que layout para quê? - -Já conheces três layouts. Cada um arruma os blocos de outra maneira: - -| Layout | Como arruma | Bom para | -|---|---|---| -| \`FlowLayout\` (lição 29) | lado a lado, como palavras numa linha, cada bloco do tamanho necessário | alguns botões numa fila | -| \`GridLayout\` (lição 31) | uma grelha de células do mesmo tamanho, preenchida linha a linha | formulários, teclados como o da calculadora | -| \`BorderLayout\` (esta lição) | cinco lugares: em cima, em baixo, à esquerda, à direita e o meio, que fica com o resto | algo grande no meio, por exemplo uma imagem ou um mostrador, com botões na margem | - -Sem \`setLayout\`, uma janela usa o BorderLayout. É por isso que, nesse caso, tudo vai para o meio. - -::: ludwig -Ao planear, pergunta-te: todas as partes devem ter o mesmo tamanho? Então GridLayout. Uma parte deve ser grande e o resto estreito na margem? Então BorderLayout. As partes devem simplesmente manter o tamanho normal? Então FlowLayout. -::: - -## Jogo: Onde fica o botão? - -::: spiel layout -titel: Jogo: Onde fica o botão? -intro: Já conheces três layouts e a janela sem layout nenhum. O Ludwig mostra-te código com os botões A, B, C … Como fica a janela? Toca na imagem certa. -frage: Como fica a janela? - -runde: - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- flow: A B C -- grid: A / B / C -- [x] border: C=C -> Sem layout próprio, cada \`add\` vai para o meio, do tamanho da janela. Os três ficam uns por cima dos outros e só se vê o último: C. - -runde: - janela.setLayout(new FlowLayout()); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- [x] flow: A B C -- grid: A B C -- border: C=C -> O FlowLayout põe os botões no tamanho normal lado a lado, como palavras numa linha, e centra-os. - -runde: - janela.setLayout(new GridLayout(0, 1)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- flow: A B C -- [x] grid: A / B / C -- grid: A B C -> Uma coluna e tantas linhas quantas forem precisas: tudo uns por baixo dos outros, cada linha com a mesma altura e tão larga como a janela. - -runde: - janela.setLayout(new GridLayout(0, 2)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); - janela.add(new JButton("D")); -- grid: A C / B D -- [x] grid: A B / C D -- grid: A / B / C / D -> Duas colunas. As células são preenchidas linha a linha, sempre primeiro à esquerda e depois à direita: A B, depois C D. - -runde: - janela.setLayout(new GridLayout(2, 3)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); - janela.add(new JButton("D")); - janela.add(new JButton("E")); - janela.add(new JButton("F")); -- grid: A B / C D / E F -- [x] grid: A B C / D E F -- flow: A B C D E F -> Primeiro vêm as linhas, depois as colunas: 2 linhas com 3 colunas cada. - -runde: - janela.setLayout(new GridLayout(0, 2)); - janela.add(new JButton("A")); - janela.add(new JButton("B")); - janela.add(new JButton("C")); -- [x] grid: A B / C -- grid: A B C -- grid: A / B C -> Duas colunas, três botões: a primeira linha fica cheia, na segunda o C fica à esquerda e a célula da direita fica vazia. - -runde: - janela.setLayout(new BorderLayout()); - janela.add(new JButton("A"), BorderLayout.NORTH); - janela.add(new JButton("B"), BorderLayout.CENTER); - janela.add(new JButton("C"), BorderLayout.SOUTH); -- grid: A / B / C -- [x] border: N=A C=B S=C -- border: N=C C=B S=A -> NORTH é em cima, SOUTH em baixo. O meio fica com todo o espaço que sobra, por isso o B é grande. - -runde: - janela.setLayout(new BorderLayout()); - janela.add(new JButton("A"), BorderLayout.WEST); - janela.add(new JButton("B")); - janela.add(new JButton("C"), BorderLayout.EAST); -- flow: A B C -- border: N=A C=B S=C -- [x] border: W=A C=B E=C -> WEST é à esquerda, EAST à direita. O B não tem lugar indicado e por isso vai para o CENTER. -::: - -## Tarefa: semáforo - -Reconstrói o semáforo e torna-o mais realista. Em alguns países, como a Alemanha, depois do vermelho acendem durante pouco tempo o vermelho e o amarelo juntos. Acrescenta por isso uma quarta fase: - -- 0: vermelho -- 1: vermelho e amarelo (usa \`Color.ORANGE\`) -- 2: verde -- 3: amarelo - -Extra: em cada fase, escreve também com \`luz.setText(…)\` o que o semáforo quer dizer, por exemplo “Parar” ou “Avançar”. - -**Terminaste quando …** - -- cada clique mostra a fase seguinte: vermelho, vermelho-amarelo (laranja), verde, amarelo, -- depois do amarelo volta o vermelho, -- no extra, cada fase mostra o texto certo. - -::: ludwig -Com quatro fases, depois do 3 vem o 0. Ajusta por isso o número em \`if (fase > 2)\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo pintar uma etiqueta com setOpaque e setBackground. → Cores no Swing -- Consigo guardar um estado numa variável static. → Lembrar a cor -- Consigo usar o BorderLayout para pôr algo grande no meio e algo estreito em baixo. → O programa completo -- Consigo explicar para que servem o FlowLayout, o GridLayout e o BorderLayout. → Que layout para quê? -- Consigo programar um semáforo com quatro fases. → Tarefa: semáforo -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que a cor fica invisível sem setOpaque(true)? -→ Cores no Swing -- [ ] Porque Color.RED não existe -- [x] Porque, sem isso, uma etiqueta é transparente -- [ ] Porque a janela é demasiado pequena - -? Que lugar do BorderLayout fica com o espaço que sobra? -→ O programa completo -- [ ] NORTH -- [ ] SOUTH -- [x] CENTER - -? fase é 2 e o ouvinte executa fase++ e depois if (fase > 2) { fase = 0; }. Que valor tem fase a seguir? -→ Lembrar a cor -- [x] 0 -- [ ] 2 -- [ ] 3 -> Depois de fase++ é 3, que é maior do que 2, por isso passa a 0. -::: -`,Xy=`--- -titel: Calculadora de notas na janela -bereich: Janelas com Swing -kurz: Escrever a percentagem, determinar o nível com else if e apanhar entradas erradas. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- transformar uma percentagem num nível com else if -- mostrar o nível na janela -- apanhar e avisar “abc” e valores fora de 0 a 100 -- testar um programa nos limites, por exemplo com 90 e 89 -::: - -## O objetivo - -Uma janela transforma a percentagem de um teste num nível: escreves a percentagem (0 a 100), clicas em **Calcular nível** e em baixo aparece o nível. - -Desta vez não há nenhuma peça nova do Swing. A novidade é que combinas tudo o que já sabes: campo de texto, botão, \`else if\` da lição 20 e try/catch da lição 22. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## A escala de níveis - -Usamos a escala de níveis do ensino básico: - -| Percentagem | Nível | -|---|---| -| 90 a 100 | 5 | -| 70 a 89 | 4 | -| 50 a 69 | 3 | -| 20 a 49 | 2 | -| 0 a 19 | 1 | - -Com \`else if\` verificas de cima para baixo. Ganha a primeira condição verdadeira: - -\`\`\`java -int nivel; -if (percentagem >= 90) { - nivel = 5; -} else if (percentagem >= 70) { - nivel = 4; -} else if (percentagem >= 50) { - nivel = 3; -} else if (percentagem >= 20) { - nivel = 2; -} else { - nivel = 1; -} -\`\`\` - -::: ludwig -Com 75 %, \`percentagem >= 90\` é falso, mas \`percentagem >= 70\` é verdadeiro. Portanto nível 4, e as restantes condições já nem são verificadas. É por isso que basta sempre o limite de baixo. -::: - -Podes experimentar esta parte sem janela na área [Código](#zeige-codelive). Escreve \`int percentagem = 75;\` antes e \`System.out.println("Nível: " + nivel);\` depois. O estrutograma mostra-te as decisões encaixadas. - -::: quiz -? Que nota dá a tabela com 29 pontos? -- [ ] 4 -- [ ] 5 -- [x] 6 -> Todas as condições são falsas, também \`pontos >= 30\`. Então vale o ramo \`else\`. -::: - -## A janela - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class CalculadoraNiveis { - public static void main(String[] args) { - JFrame janela = new JFrame("Calculadora de níveis"); - janela.setSize(260, 180); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel pergunta = new JLabel("Percentagem (0 a 100):"); - JTextField campo = new JTextField(); - JButton botao = new JButton("Calcular nível"); - JLabel resultado = new JLabel("Nível: ?"); - - botao.addActionListener(e -> { - int percentagem = Integer.parseInt(campo.getText()); - int nivel; - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 20) { - nivel = 2; - } else { - nivel = 1; - } - resultado.setText("Nível: " + nivel); - }); - - janela.add(pergunta); - janela.add(campo); - janela.add(botao); - janela.add(resultado); - janela.setVisible(true); - } -} -\`\`\` - -Experimenta 100, 75, 50 e 12. - -## Apanhar entradas erradas - -Ainda há duas coisas que podem correr mal: - -1. Alguém escreve “abc”. Então \`Integer.parseInt\` lança uma \`NumberFormatException\`. -2. Alguém escreve 150 ou −5. É um número, mas não é uma percentagem válida. - -O primeiro caso apanhas com try/catch, o segundo com um \`if\` antes de calcular o nível: - -\`\`\`java -botao.addActionListener(e -> { - try { - int percentagem = Integer.parseInt(campo.getText()); - if (percentagem < 0 || percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - // aqui o cálculo do nível de cima - } - } catch (NumberFormatException erro) { - resultado.setText("Isso não é um número."); - } -}); -\`\`\` - -::: ludwig -\`||\` quer dizer “ou” (lição 9). A condição é verdadeira se a percentagem for demasiado pequena **ou** demasiado grande. -::: - -## Jogo: Que nível? - -::: spiel frage -titel: Jogo: Que nível? -intro: O Ludwig construiu calculadoras de níveis, mas nem todas estão certas. Calcula que nível sai. Seis rondas. - -runde: - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else { - nivel = 2; - } -frage: percentagem é 70. Que nível sai? -- 5 -- [x] 4 -- 3 -> 70 >= 90 é falso, 70 >= 70 é verdadeiro. O limite ainda pertence ao 4. - -runde: - if (percentagem >= 90) { - nivel = 5; - } else if (percentagem >= 70) { - nivel = 4; - } else if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 20) { - nivel = 2; - } else { - nivel = 1; - } -frage: percentagem é 49. Que nível sai? -- 3 -- [x] 2 -- 1 -> 49 >= 50 é falso por pouco, 49 >= 20 é verdadeiro. Portanto nível 2. - -runde: - if (percentagem >= 50) { - nivel = 3; - } else if (percentagem >= 90) { - nivel = 5; - } else { - nivel = 1; - } -frage: percentagem é 95. Que nível sai? -- 5 -- [x] 3 -- 1 -> Ganha a primeira condição verdadeira. 95 >= 50 já é verdadeiro, o 5 nunca é alcançado. Por isso verifica-se das percentagens altas para baixo. - -runde: - nivel = 1; - if (percentagem >= 20) { - nivel = 2; - } - if (percentagem >= 50) { - nivel = 3; - } -frage: percentagem é 80. Que valor tem nivel depois? -- 1 -- 2 -- [x] 3 -> Sem \`else\`, todos os \`if\` são verificados. Os dois são verdadeiros, e o último dá o nível 3. - -runde: - // nivel já está calculado - if (percentagem < 0 || percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - resultado.setText("Nível: " + nivel); - } -frage: No campo de texto está 100. O que mostra a janela? -- [x] Nível: 5 -- Escreve um valor de 0 a 100. -- Isso não é um número. -> 100 > 100 é falso. Portanto 100 é válido e dá o nível 5. - -runde: - // nivel já está calculado - if (percentagem < 0 && percentagem > 100) { - resultado.setText("Escreve um valor de 0 a 100."); - } else { - resultado.setText("Nível: " + nivel); - } -frage: No campo de texto está 150. O que mostra a janela? -- Escreve um valor de 0 a 100. -- [x] um nível, embora 150 não seja válido -- Isso não é um número. -> Com \`&&\`, a percentagem teria de ser ao mesmo tempo menor que 0 e maior que 100. Isso nunca acontece, por isso o programa nunca avisa. O certo é \`||\`. -::: - -## Tarefa: calculadora de níveis - -Junta a calculadora de níveis, com as duas verificações do último passo. Testa com 90, 89, 0, 100, 101 e “dez”. - -Extra: escreve também a menção do nível, por exemplo “Nível: 4 (Bom)”. As menções são Muito bom, Bom, Suficiente, Insuficiente e Fraco. - -**Terminaste quando …** - -- 92 e 100 dão 1, 91 dá 2 e 0 dá 6, -- 101 mostra o aviso para escrever 0 a 100, -- um texto como “dez” mostra um aviso e o programa continua a funcionar. - -::: ludwig -Testa sempre os limites: 90 tem de dar 5, 89 tem de dar 4. É nos limites que se escondem a maioria dos erros, por exemplo \`>\` em vez de \`>=\`. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo transformar uma percentagem num nível com else if. → A escala de níveis -- Consigo mostrar o nível na janela. → A janela -- Consigo apanhar e avisar “abc” e valores fora de 0 a 100. → Apanhar entradas erradas -- Consigo testar um programa nos limites, por exemplo com 90 e 89. → Tarefa: calculadora de níveis -::: - -## Teste de conhecimentos - -::: quiz -? Que nível dá a escala com 70 %? -→ A escala de níveis -- [ ] 3 -- [x] 4 -- [ ] 5 -> 70 é o limite de baixo do nível 4. - -? Porque é que em cada condição basta o limite de baixo? -→ A escala de níveis -- [x] Porque o else if já separou antes os casos mais altos -- [ ] Porque o Java não conhece limites de cima -- [ ] Porque a percentagem é sempre 100 - -? Que condição deteta percentagens inválidas? -→ Apanhar entradas erradas -- [ ] percentagem < 0 && percentagem > 100 -- [x] percentagem < 0 || percentagem > 100 -- [ ] percentagem >= 0 || percentagem <= 100 -> Um número não pode ser ao mesmo tempo menor do que 0 e maior do que 100, por isso é preciso o ou. -::: -`,e9=`--- -titel: Uma calculadora -bereich: Janelas com Swing -kurz: Duas colunas com GridLayout, quatro botões de cálculo e apanhar a divisão por 0. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir duas colunas com GridLayout -- explicar porque é que "" + (a + b) precisa de parênteses -- programar os quatro botões de cálculo -- construir uma calculadora que não falha com 0 nem com “abc” -::: - -## O objetivo - -Vamos construir uma pequena calculadora: dois campos de texto para os números, quatro botões **+**, **-**, **\\*** e **/** e uma linha para o resultado. - -As novidades desta vez são **duas colunas** no GridLayout e **vários botões** que calculam todos com os mesmos campos de texto. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Duas colunas - -Até agora, com \`GridLayout(0, 1)\`, ficava tudo umas por baixo das outras. Com \`GridLayout(0, 2)\` há duas colunas. As peças preenchem as células pela ordem das linhas \`add\`, sempre primeiro à esquerda e depois à direita: - -| esquerda | direita | -|---|---| -| Primeiro número: | campo de texto | -| Segundo número: | campo de texto | -| + | - | -| \\* | / | -| Resultado: | ? | - -As etiquetas da esquerda não vais precisar delas mais tarde. Por isso podes construí-las logo dentro do \`add\`, sem variável: - -\`\`\`java -janela.add(new JLabel("Primeiro número:")); -janela.add(campo1); -\`\`\` - -## A janela com o primeiro botão - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Calculadora { - public static void main(String[] args) { - JFrame janela = new JFrame("Calculadora"); - janela.setSize(280, 220); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 2)); - - JTextField campo1 = new JTextField(); - JTextField campo2 = new JTextField(); - JButton mais = new JButton("+"); - JButton menos = new JButton("-"); - JButton vezes = new JButton("*"); - JButton dividir = new JButton("/"); - JLabel resultado = new JLabel("?"); - - mais.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a + b)); - }); - - janela.add(new JLabel("Primeiro número:")); - janela.add(campo1); - janela.add(new JLabel("Segundo número:")); - janela.add(campo2); - janela.add(mais); - janela.add(menos); - janela.add(vezes); - janela.add(dividir); - janela.add(new JLabel("Resultado:")); - janela.add(resultado); - janela.setVisible(true); - } -} -\`\`\` - -Escreve 3 e 4 e clica em +. Em baixo aparece 7. - -::: ludwig -Atenção aos parênteses em \`"" + (a + b)\`. Sem eles, o Java calcula da esquerda para a direita: \`"" + a\` dá o texto “3”, e \`"3" + b\` junta o 4 no fim. Sai “34” em vez de 7. O parêntese garante que primeiro se faz a conta. -::: - -## Os outros três botões - -Os botões -, \\* e / funcionam da mesma maneira. Só muda o sinal na última linha: - -\`\`\`java -menos.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a - b)); -}); -\`\`\` - -O / tem duas particularidades: - -- Com \`int\`, o Java corta as casas decimais ao dividir. 7 / 2 dá 3. -- Se o segundo número for 0, o Java lança uma \`ArithmeticException\`, como na tarefa “Dividir em segurança” da lição 22. - -## Apanhar a divisão por 0 - -\`\`\`java -dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } -}); -\`\`\` - -::: angeberwissen -Com \`double\` e \`Double.parseDouble(…)\` há casas decimais: 7 / 2 dá 3.5. Em contrapartida, com números decimais o Java não lança nenhuma exceção ao dividir por 0. O resultado é então \`Infinity\`, ou seja, “infinito”. -::: - -::: quiz -? O que mostra a calculadora com 8 a dividir por 0? -- [ ] 0 -- [ ] Infinity -- [x] Não se divide por 0! -> Com \`int\`, \`a / b\` lança uma \`ArithmeticException\`. O \`catch\` apanha-a e mostra o aviso. -::: - -## Um método próprio - -Isto não está no programa da disciplina, mas torna o código mais curto. - -::: angeberwissen -Cada ouvinte lê os mesmos dois campos. Podes passar esta repetição para um método próprio, um subprograma como na lição 18. Fica na classe, ao lado do \`main\`: - -\`static int numero(JTextField campo) { return Integer.parseInt(campo.getText()); }\` - -No ouvinte basta então escrever \`resultado.setText("" + (numero(campo1) + numero(campo2)));\`. -::: - -## Jogo: O que mostra a calculadora? - -::: spiel frage -titel: Jogo: O que mostra a calculadora? -intro: O Ludwig andou a mexer na calculadora. Lê o ouvinte e prevê o que aparece no resultado. Seis rondas. - -runde: - mais.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + a + b); - }); -frage: Escreves 3 e 4 e clicas em +. O que aparece no resultado? -- 7 -- [x] 34 -- 12 -> Sem parênteses, o Java trabalha da esquerda para a direita: \`"" + 3\` é o texto "3", e \`+ 4\` junta o 4 no fim. - -runde: - vezes.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + a * b); - }); -frage: Escreves 3 e 4 e clicas em *. O que aparece no resultado? -- 34 -- [x] 12 -- 7 -> A multiplicação vem antes da soma também aqui: o Java calcula primeiro 3 * 4 e depois junta o 12 ao texto. O mais não tem esta prioridade, por isso precisa dos parênteses. - -runde: - dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - resultado.setText("" + (a / b)); - }); -frage: Escreves 7 e 2 e clicas em /. O que aparece no resultado? -- 3.5 -- [x] 3 -- 4 -> Com \`int\`, o Java corta as casas decimais. Não arredonda. - -runde: - dividir.addActionListener(e -> { - int a = Integer.parseInt(campo1.getText()); - int b = Integer.parseInt(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } - }); -frage: Escreves 8 e 0 e clicas em /. O que aparece no resultado? -- 0 -- [x] Não se divide por 0! -- Infinity -> Com \`int\`, dividir por 0 lança uma ArithmeticException, e o \`catch\` escreve o aviso. - -runde: - dividir.addActionListener(e -> { - double a = Double.parseDouble(campo1.getText()); - double b = Double.parseDouble(campo2.getText()); - resultado.setText("" + (a / b)); - }); -frage: Escreves 7 e 2 e clicas em /. O que aparece no resultado? -- 3 -- [x] 3.5 -- 3.0 -> Com \`double\`, as casas decimais ficam. - -runde: - dividir.addActionListener(e -> { - double a = Double.parseDouble(campo1.getText()); - double b = Double.parseDouble(campo2.getText()); - try { - resultado.setText("" + (a / b)); - } catch (ArithmeticException erro) { - resultado.setText("Não se divide por 0!"); - } - }); -frage: Escreves 8 e 0 e clicas em /. O que aparece no resultado? -- Não se divide por 0! -- [x] Infinity -- 0.0 -> Com \`double\` não há exceção. O resultado é \`Infinity\`, ou seja "infinito", e o \`catch\` nunca chega a entrar. -::: - -## Tarefa: calculadora - -Acaba a calculadora: - -- os quatro botões calculam, -- o / avisa “Não se divide por 0!” em vez de falhar, -- se um campo tiver “abc” ou estiver vazio, aparece “Escreve dois números”. - -Extra: um quinto botão **C** esvazia os dois campos e volta a pôr o resultado em “?”. - -**Terminaste quando …** - -- 7 e 2 dão 9, 5, 14 e 3 em +, −, * e /, -- 7 / 0 mostra a mensagem de não dividir por 0, -- “abc” ou um campo vazio mostra a mensagem para escrever dois números e nada falha. - -::: ludwig -Para o “abc” cada ouvinte precisa de um try/catch com \`NumberFormatException\`. Depois de um \`try\` também podem vir dois \`catch\`, um para \`NumberFormatException\` e outro para \`ArithmeticException\`. Já agora: um campo vazio dá o texto \`""\`, e isso também não é um número. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir duas colunas com GridLayout(0, 2). → Duas colunas -- Consigo explicar porque é que "" + (a + b) precisa de parênteses. → A janela com o primeiro botão -- Consigo programar os quatro botões de cálculo. → Os outros três botões -- Consigo construir uma calculadora que não falha com 0 nem com “abc”. → Tarefa: calculadora -::: - -## Teste de conhecimentos - -::: quiz -? a é 3 e b é 4. Quanto dá "" + a + b? -→ A janela com o primeiro botão -- [ ] 7 -- [x] 34 -- [ ] Um erro -> O Java calcula da esquerda para a direita: primeiro surge o texto "3", depois junta-se o 4. - -? Quanto dá 7 / 2 com int? -→ Os outros três botões -- [ ] 3.5 -- [x] 3 -- [ ] 4 - -? Por que ordem preenche o GridLayout(0, 2) as células? -→ Duas colunas -- [x] Linha a linha, primeiro à esquerda e depois à direita -- [ ] Coluna a coluna, começando de cima para baixo na coluna da esquerda -- [ ] Ao acaso -::: -`,t9=`--- -titel: Adivinha o número -bereich: Janelas com Swing -kurz: Um jogo com número aleatório, contagem de tentativas e um botão que se desliga no fim. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- criar com Math.random um número inteiro aleatório de 1 a 100 -- decidir que variáveis pertencem à classe -- desligar um botão com setEnabled -- construir um jogo de adivinhar com um botão “Novo jogo” -::: - -## O objetivo - -Agora um jogo: o computador pensa num número de 1 a 100. Tu adivinhas, e a janela diz-te “demasiado pequeno” ou “demasiado grande”. Quando o encontrares, diz-te quantas tentativas precisaste. - -As novidades desta vez são os **números aleatórios** e um botão que se **desliga** no fim. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Um número aleatório - -\`Math.random()\` dá um número decimal aleatório de 0 até quase 1, por exemplo 0.4173. Em três passos transforma-se num número inteiro de 1 a 100: - -\`\`\`java -int secreto = (int) (Math.random() * 100) + 1; -\`\`\` - -| Passo | Exemplo | -|---|---| -| \`Math.random()\` | 0.4173 | -| \`* 100\` | 41.73 | -| \`(int)\` corta as casas decimais | 41 | -| \`+ 1\` | 42 | - -Sem o \`+ 1\` sairia de 0 a 99. - -Experimenta na área [Código](#zeige-codelive): \`int secreto = (int) (Math.random() * 100) + 1;\` e \`System.out.println(secreto);\`. Cada execução dá um número diferente. - -::: angeberwissen -Na verdade, os computadores não sabem lançar dados. O \`Math.random()\` calcula com uma fórmula uma longa sequência de números que só **parecem** aleatórios. Chamam-se números pseudoaleatórios. Para jogos chega perfeitamente. -::: - -## O que o jogo guarda - -O jogo tem de se lembrar de duas coisas ao longo de todos os cliques: o número secreto e o número de tentativas. Tal como no contador de cliques da lição 32, as duas ficam na classe: - -\`\`\`java -static int secreto = (int) (Math.random() * 100) + 1; -static int tentativas = 0; -\`\`\` - -::: quiz -? Porque é que \`secreto\` e \`tentativas\` estão na classe e não no \`main\`? -- [ ] Porque \`Math.random()\` só funciona na classe -- [x] Porque têm de durar ao longo de todos os cliques e o ouvinte tem de alterar \`tentativas\` -- [ ] Porque o \`main\` não consegue guardar números -> Como no contador de cliques: o ouvinte não pode alterar variáveis do \`main\`. -::: - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class AdivinhaNumero { - static int secreto = (int) (Math.random() * 100) + 1; - static int tentativas = 0; - - public static void main(String[] args) { - JFrame janela = new JFrame("Adivinha o número"); - janela.setSize(320, 180); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JLabel dica = new JLabel("Estou a pensar num número de 1 a 100."); - JTextField campo = new JTextField(); - JButton botao = new JButton("Adivinhar"); - - botao.addActionListener(e -> { - int palpite = Integer.parseInt(campo.getText()); - tentativas++; - if (palpite < secreto) { - dica.setText(palpite + " é demasiado pequeno."); - } else if (palpite > secreto) { - dica.setText(palpite + " é demasiado grande."); - } else { - dica.setText("Certo! Precisaste de " + tentativas + " tentativas."); - botao.setEnabled(false); - } - campo.setText(""); - }); - - janela.add(dica); - janela.add(campo); - janela.add(botao); - janela.setVisible(true); - } -} -\`\`\` - -- \`campo.setText("")\` esvazia o campo de texto depois de cada palpite, para escreveres logo o seguinte. -- \`botao.setEnabled(false)\` desliga o botão. Fica cinzento e já não se pode clicar. O jogo acabou. - -::: ludwig -Com \`setEnabled(true)\` voltas a ligar um botão. Assim podes, por exemplo, só ativar um botão depois de alguém ter escrito alguma coisa. -::: - -## Ganhar com 7 tentativas - -::: angeberwissen -Quem adivinha com jeito nunca precisa de mais de 7 tentativas. Escolhe sempre o meio do intervalo que ainda resta: primeiro 50, depois 25 ou 75 e assim por diante. Cada palpite corta o intervalo a meio: 100, 50, 25, 13, 7, 4, 2, 1. É a **pesquisa binária** da lição 19. Como 2 elevado a 7 = 128 é maior do que 100, chegam 7 palpites. -::: - -## Tarefa: adivinha o número - -Reconstrói o jogo e melhora-o: - -- Uma entrada como “abc” não conta como tentativa e mostra a dica “Escreve um número”. -- Um segundo botão **Novo jogo** pensa num número novo, põe as tentativas a 0, volta a ligar o botão Adivinhar e repõe a dica. - -Extra: depois de 7 tentativas falhadas o jogo está perdido. A janela revela então o número secreto. - -**Terminaste quando …** - -- cada palpite errado mostra “demasiado pequeno” ou “demasiado grande”, -- “abc” mostra o aviso para escrever um número e as tentativas não mudam, -- **Novo jogo** põe as tentativas a 0, volta a ligar o botão de adivinhar e repõe o aviso. - -::: ludwig -Para “não conta como tentativa”, o \`tentativas++\` tem de vir **depois** de \`Integer.parseInt\`, os dois dentro do bloco \`try\`. Se o \`parseInt\` lançar uma exceção, a linha com \`tentativas++\` é saltada. -::: - -## Jogo: Demasiado pequeno ou demasiado grande? - -::: spiel frage -titel: Jogo: Demasiado pequeno ou demasiado grande? -intro: O Ludwig está a jogar ao adivinha o número. Lê o código e prevê o que acontece. Sete rondas. - -runde: - // secreto é 42 - if (palpite < secreto) { - dica.setText(palpite + " é demasiado pequeno."); - } else if (palpite > secreto) { - dica.setText(palpite + " é demasiado grande."); - } else { - dica.setText("Certo!"); - } -frage: O Ludwig escreve 50. O que diz a dica? -- 50 é demasiado pequeno. -- [x] 50 é demasiado grande. -- Certo! -> 50 é maior do que 42. - -runde: -frage: O número está entre 1 e 100. 50 era demasiado grande, 25 era demasiado pequeno. Que número é que o Ludwig, esperto, tenta a seguir? -- 26 -- [x] 37 -- 49 -> Sobram 26 a 49. O meio é 37 (ou 38). Assim, cada palpite corta o intervalo a meio. - -runde: - int dado = (int) (Math.random() * 6) + 1; -frage: Que números pode ter \`dado\`? -- 0 a 6 -- [x] 1 a 6 -- 1 a 7 -> \`Math.random() * 6\` vai de 0 até um pouco menos de 6. \`(int)\` faz disso 0 a 5, e \`+ 1\` faz 1 a 6. Um dado! - -runde: - int numero = (int) (Math.random() * 10); -frage: Que números pode ter \`numero\`? -- [x] 0 a 9 -- 1 a 10 -- 0 a 10 -> Sem \`+ 1\` começa em 0, e o 10 nunca é alcançado. - -runde: - // secreto é 42 - tentativas++; - if (palpite == secreto) { - dica.setText("Certo! Precisaste de " + tentativas + " tentativas."); - } -frage: O Ludwig escreve 50, depois 25, depois 42. O que diz a dica no fim? -- Certo! Precisaste de 2 tentativas. -- [x] Certo! Precisaste de 3 tentativas. -- Certo! Precisaste de 42 tentativas. -> \`tentativas++\` conta a cada clique, também no acerto. - -runde: - botao.setEnabled(false); -frage: O Ludwig encontrou o número e clica mais uma vez em **Adivinhar**. O que acontece? -- O jogo recomeça. -- Conta mais uma tentativa. -- [x] Nada, o botão fica cinzento e não se pode clicar. -> \`setEnabled(false)\` desliga o botão. - -runde: -frage: Agora o número está entre 1 e 1000. Quantos palpites são precisos, no máximo, com a pesquisa binária? -- 7 -- [x] 10 -- 500 -> 2 elevado a 10 = 1024 é maior do que 1000. Dez divisões a meio chegam. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo criar com Math.random um número inteiro aleatório de 1 a 100. → Um número aleatório -- Consigo decidir que variáveis pertencem à classe. → O que o jogo guarda -- Consigo desligar um botão com setEnabled. → O programa completo -- Consigo construir um jogo de adivinhar com um botão “Novo jogo”. → Tarefa: adivinha o número -::: - -## Teste de conhecimentos - -::: quiz -? Que números dá (int) (Math.random() * 100) + 1? -→ Um número aleatório -- [ ] 0 a 100 -- [x] 1 a 100 -- [ ] 1 a 101 - -? O que faz botao.setEnabled(false)? -→ O programa completo -- [ ] Tira o botão da janela. -- [x] O botão fica cinzento e já não se pode clicar. -- [ ] Muda o texto do botão. - -? Com a pesquisa binária, quantas tentativas precisas no máximo para 1 a 100? -→ Tarefa: adivinha o número -- [ ] 50 -- [ ] 10 -- [x] 7 -> Cada palpite corta o intervalo a meio, e 2 elevado a 7 = 128 é maior do que 100. -::: -`,n9=`--- -titel: Muitos botões, um ouvinte -bereich: Janelas com Swing -kurz: Um ouvinte para muitos botões e descobrir com getActionCommand e getSource qual foi o botão clicado. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- guardar um ouvinte numa variável do tipo ActionListener e registá-lo em vários botões -- explicar o que devolvem getActionCommand e getSource -- pôr botões num JPanel com um ciclo -- construir um cadeado que só abre com o código certo -::: - -## O objetivo - -Desde a história do bolo, o Ludwig quer trancar o seu estábulo. Ele constrói um **cadeado de código**: nove teclas com algarismos, um zero, **C** para apagar e **OK** para verificar. Só quem escrever 1234 recebe "Portão aberto!". - -São doze botões. Até agora, cada botão tinha o seu próprio ouvinte, como na calculadora da lição 35. Hoje aprendes como **um** ouvinte chega para todos os botões. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Nove ouvintes quase iguais - -Com um ouvinte por tecla ficaria assim: - -\`\`\`java -um.addActionListener(e -> visor.setText(visor.getText() + "1")); -dois.addActionListener(e -> visor.setText(visor.getText() + "2")); -tres.addActionListener(e -> visor.setText(visor.getText() + "3")); -// ... e assim por diante até 9 -\`\`\` - -As linhas só se distinguem pelo algarismo. Quem quiser mudar um pormenor tem de o fazer nove vezes e de certeza que se esquece de uma linha. - -## Um ouvinte numa variável - -Um ouvinte também pode ficar numa **variável**. O seu tipo de dados é \`ActionListener\`, o contrato da lição 30. Depois registas o mesmo ouvinte em vários botões: - -\`\`\`java -ActionListener algarismo = e -> visor.setText(visor.getText() + e.getActionCommand()); - -um.addActionListener(algarismo); -dois.addActionListener(algarismo); -tres.addActionListener(algarismo); -\`\`\` - -\`ActionListener\` está no pacote \`java.awt.event\`. Por isso precisas de \`import java.awt.event.*;\` lá em cima. - -Agora o código só existe uma vez. Mas como sabe o ouvinte que algarismo deve acrescentar? - -## Quem clicou? - -O \`e\` antes da seta é o **evento**, um objeto do tipo \`ActionEvent\`. O botão entrega-o a cada clique, e lá dentro está o que aconteceu: - -| Chamada | Devolve | Exemplo | -|---|---|---| -| \`e.getActionCommand()\` | a legenda do botão clicado, como texto | \`"7"\` | -| \`e.getSource()\` | o próprio botão clicado | o botão \`ok\` | - -- \`getActionCommand()\` dá jeito quando a legenda já diz o que fazer, como nos algarismos. -- \`getSource()\` compara-se com um botão usando \`==\`: \`if (e.getSource() == ok)\`. Aqui \`==\` está certo, porque se trata exatamente deste objeto, não de um texto. - -::: ludwig -Textos comparas com \`equals\`, botões com \`==\`. Se quiseres decidir pela legenda, escreves \`e.getActionCommand().equals("OK")\`. Também funciona, mas deixa de funcionar assim que alguém mudar a legenda para "Abrir". \`e.getSource() == ok\` continua certo. -::: - -## Botões num ciclo - -Com um ouvinte partilhado, podes até criar as teclas dos algarismos num ciclo. Para ficarem bem arrumadas numa grelha, vão para um **JPanel**. Um JPanel é uma área na janela com o seu próprio layout: - -\`\`\`java -JPanel teclas = new JPanel(new GridLayout(0, 3)); -for (int i = 1; i <= 9; i++) { - JButton algarismo = new JButton("" + i); - algarismo.addActionListener(tecla); - teclas.add(algarismo); -} -\`\`\` - -- \`"" + i\` transforma o número \`i\` no texto da legenda. -- Em cada volta nasce um botão novo. Todos recebem o mesmo ouvinte \`tecla\`. -- \`janela.add(teclas, BorderLayout.CENTER)\` põe a área inteira, com todas as teclas, na janela. - -::: quiz -? Quantos botões e quantos ouvintes cria este ciclo? -- [ ] 9 botões e 9 ouvintes -- [x] 9 botões e 1 ouvinte -- [ ] 1 botão e 9 ouvintes -> Em cada passagem nasce um botão novo. Todos recebem o mesmo ouvinte \`tecla\`. -::: - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Cadeado { - public static void main(String[] args) { - JFrame janela = new JFrame("Cadeado de código"); - janela.setSize(240, 300); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new BorderLayout()); - - JLabel visor = new JLabel("", SwingConstants.CENTER); - JPanel teclas = new JPanel(new GridLayout(0, 3)); - JButton apagar = new JButton("C"); - JButton ok = new JButton("OK"); - - ActionListener tecla = e -> { - if (e.getSource() == apagar) { - visor.setText(""); - } else if (e.getSource() == ok) { - if (visor.getText().equals("1234")) { - visor.setText("Portão aberto!"); - } else { - visor.setText("Errado"); - } - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - - for (int i = 1; i <= 9; i++) { - JButton algarismo = new JButton("" + i); - algarismo.addActionListener(tecla); - teclas.add(algarismo); - } - JButton zero = new JButton("0"); - zero.addActionListener(tecla); - apagar.addActionListener(tecla); - ok.addActionListener(tecla); - teclas.add(apagar); - teclas.add(zero); - teclas.add(ok); - - janela.add(visor, BorderLayout.NORTH); - janela.add(teclas, BorderLayout.CENTER); - janela.setVisible(true); - } -} -\`\`\` - -- \`apagar\` e \`ok\` são criados **antes** do ouvinte, porque o ouvinte compara com eles. -- O ouvinte verifica primeiro os dois botões especiais. Todos os outros são algarismos e acrescentam a sua legenda. - -::: angeberwissen -O teclado do telefone tem o 1 em cima à esquerda, o da calculadora e do teclado do computador tem o 7 em cima à esquerda. Porquê? Quando chegaram os telefones de teclas, fizeram-se testes com pessoas que tinham de marcar números com eles. Com o 1 em cima eram mais rápidas, e as máquinas de calcular já tinham a sua disposição há muito tempo. O cadeado do Ludwig faz como o telefone. -::: - -## Jogo: Quem clicou? - -::: spiel zuhoerer -titel: Jogo: Quem clicou? -intro: Em cada ronda, **um** ouvinte está registado em vários botões. O Ludwig mostra-te o código, a janela e os cliques. O que fica no visor no fim? Depois o Ludwig reproduz os cliques. -frage: O que fica no visor depois dos cliques? - -runde: - JFrame janela = new JFrame("Letras"); - JLabel visor = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - ActionListener z = e -> visor.setText(visor.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, B, A -- A -- AB -- [x] ABA -> Um ouvinte, dois botões. \`e.getActionCommand()\` devolve de cada vez a legenda do botão clicado, e ela é acrescentada no fim. - -runde: - JFrame janela = new JFrame("Contador"); - static int numero = 0; - JLabel visor = new JLabel("0"); - JButton mais = new JButton("+"); - JButton menos = new JButton("-"); - ActionListener z = e -> { - if (e.getSource() == mais) { - numero++; - } else { - numero--; - } - visor.setText("" + numero); - }; - mais.addActionListener(z); - menos.addActionListener(z); -klicks: +, +, - -- 3 -- [x] 1 -- -1 -> \`e.getSource()\` diz qual foi o botão. Duas vezes mais, uma vez menos: 0 + 1 + 1 - 1 = 1. - -runde: - JFrame janela = new JFrame("Letras"); - JLabel visor = new JLabel(""); - JButton a = new JButton("A"); - JButton b = new JButton("B"); - JButton c = new JButton("C"); - ActionListener z = e -> visor.setText(visor.getText() + e.getActionCommand()); - a.addActionListener(z); - b.addActionListener(z); -klicks: A, C, B -- ACB -- [x] AB -- A -> O ouvinte só está registado em A e B. Quando se clica em C, ninguém está a ouvir. - -runde: - JFrame janela = new JFrame("Teclas"); - JLabel visor = new JLabel(""); - JButton um = new JButton("1"); - JButton dois = new JButton("2"); - JButton apagar = new JButton("C"); - ActionListener z = e -> { - if (e.getActionCommand().equals("C")) { - visor.setText(""); - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - um.addActionListener(z); - dois.addActionListener(z); - apagar.addActionListener(z); -klicks: 1, 2, C, 1 -- 121 -- 12 -- [x] 1 -> Depois de 1 e 2 o visor mostra "12". C apaga tudo, e o último 1 fica sozinho. - -runde: - JFrame janela = new JFrame("Cadeado"); - JLabel visor = new JLabel(""); - JButton quatro = new JButton("4"); - JButton dois = new JButton("2"); - JButton ok = new JButton("OK"); - ActionListener z = e -> { - if (e.getSource() == ok) { - if (visor.getText().equals("42")) { - visor.setText("Portão aberto!"); - } else { - visor.setText("Errado"); - } - } else { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; - quatro.addActionListener(z); - dois.addActionListener(z); - ok.addActionListener(z); -klicks: 2, 4, OK -- Portão aberto! -- [x] Errado -- 24OK -> Foi escrito "24", mas o segredo é "42". A ordem dos cliques conta. -::: - -## Tarefa: Cadeado de código - -Constrói o cadeado de código e experimenta-o. - -Depois melhora-o: - -- Depois de três tentativas erradas, o **OK** desliga-se, como o botão do Adivinha o número na lição 36. Conta as tentativas numa variável \`static int\` na classe. -- Extra: o visor mostra \`*\` em vez dos algarismos. Guarda a entrada verdadeira numa \`static String entrada = "";\` e acrescenta ao visor só uma estrela. - -**Terminaste quando …** - -- o código certo abre o cadeado e um errado não, -- depois de três tentativas erradas o **OK** fica desligado, -- no extra, o visor só mostra estrelas mas o código continua a ser verificado. - -::: ludwig -No ramo do **OK**, conta \`tentativas++\` a cada código errado e depois verifica \`if (tentativas >= 3)\`. Aí \`ok.setEnabled(false)\` desliga o botão, como no Adivinha o número. Para as estrelas: \`entrada = entrada + e.getActionCommand();\` e \`visor.setText(visor.getText() + "*");\`. Depois comparas \`entrada\`, não o texto do visor. -::: - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo guardar um ouvinte numa variável do tipo ActionListener e registá-lo em vários botões. → Um ouvinte numa variável -- Consigo explicar o que devolvem getActionCommand e getSource. → Quem clicou? -- Consigo pôr botões num JPanel com um ciclo. → Botões num ciclo -- Consigo construir um cadeado que só abre com o código certo. → Tarefa: Cadeado de código -::: - -## Teste de conhecimentos - -::: quiz -? O que devolve e.getActionCommand() num clique no botão new JButton("7")? -→ Quem clicou? -- [ ] o número 7 -- [x] o texto "7" -- [ ] o próprio botão - -? Como verificas se foi clicado o botão ok? -→ Quem clicou? -- [x] e.getSource() == ok -- [ ] e.getSource().equals("ok") -- [ ] ok.getActionCommand() -> getSource devolve o próprio botão, e esse comparas com ==. - -? Porque é que um ouvinte fica numa variável? -→ Um ouvinte numa variável -- [ ] Para correr mais depressa. -- [x] Para o poder registar em vários botões e escrever o código só uma vez. -- [ ] Porque senão os lambdas não são permitidos. - -? Liga. -→ Quem clicou? -= ActionListener -> tipo de dados de um ouvinte -= ActionEvent -> o evento e com a informação sobre o clique -= JPanel -> uma área com o seu próprio layout -::: -`,i9=`--- -titel: Classes internas -bereich: Janelas com Swing -kurz: Escrever um ouvinte como classe interna com nome, como classe anónima e como lambda, e saber quem vê o quê. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- escrever um ouvinte como classe interna com nome -- escrever um ouvinte como classe anónima -- explicar o que fica de fora no lambda -- explicar que maneira de escrever vê que variáveis -- construir um contador com três botões escritos de três maneiras -::: - -## O objetivo - -O contador de cliques da lição 32 já conheces. Hoje escreves o seu ouvinte de **três maneiras**, que fazem todas exatamente o mesmo: - -1. como **classe interna com nome**, como se fazia quase sempre antes do Java 8, -2. como **classe anónima**, que conheces da lição 30 (“ActionListener é uma interface”), -3. como **lambda** com a seta, como até agora. - -Em código de outras pessoas, em livros e na internet vais encontrar as três. Depois desta lição vais reconhecê-las. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Lembrete: o contrato - -Um ouvinte é tudo o que cumpre o contrato \`ActionListener\`. Nele está exatamente um método: - -\`\`\` -public void actionPerformed(ActionEvent e) -\`\`\` - -O botão chama-o a cada clique. As três maneiras de escrever são três caminhos para fornecer este único método. - -## 1. A classe interna com nome - -Uma **classe interna** fica dentro de outra classe. Tem um nome, aqui \`Mais\`, e cumpre o contrato com \`implements ActionListener\`: - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - -public class Contador { - static int contagem = 0; - static JLabel numero = new JLabel("0", SwingConstants.CENTER); - - static class Mais implements ActionListener { - public void actionPerformed(ActionEvent e) { - contagem++; - numero.setText("" + contagem); - } - } - - public static void main(String[] args) { - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JButton mais = new JButton("+1"); - JButton outro = new JButton("Também +1"); - mais.addActionListener(new Mais()); - outro.addActionListener(new Mais()); - - janela.add(numero); - janela.add(mais); - janela.add(outro); - janela.setVisible(true); - } -} -\`\`\` - -- \`new Mais()\` cria um objeto da classe \`Mais\`. É esse o ouvinte que o botão recebe. -- Como a classe tem nome, podes usá-la em vários botões, aqui em \`mais\` e \`outro\`. -- A classe está **fora** de \`main\`. Por isso só vê o que está na classe \`Contador\`: \`contagem\` e \`numero\`. É por isso que \`numero\` desta vez é uma variável da classe e não de \`main\`. -- Precisas de \`static class\` porque \`main\` é static. Sem \`static\`, o javac indica "non-static variable this cannot be referenced from a static context". - -## 2. A classe anónima - -Se só precisas do ouvinte num sítio, podes escrever a classe mesmo onde o objeto é preciso. Assim ela não recebe nome: - -\`\`\`java -mais.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - contagem++; - numero.setText("" + contagem); - } -}); -\`\`\` - -- \`new ActionListener() { … }\` quer dizer: "um objeto novo que cumpre o contrato ActionListener, e é assim: …". -- No fim está \`});\`: a chaveta fecha a classe, o parêntese fecha a chamada de \`addActionListener\`. -- A classe anónima está **dentro** de \`main\`. Por isso também vê as variáveis de \`main\`, desde que já não mudem. - -::: quiz -? O que fecha \`});\` no fim da classe anónima? -- [x] \`}\` fecha a classe, \`)\` fecha a chamada de \`addActionListener\`. -- [ ] \`}\` fecha o \`main\`, \`)\` fecha a classe. -- [ ] Os dois fecham o método \`actionPerformed\`. -> O método \`actionPerformed\` já termina uma linha antes com a sua própria \`}\`. -::: - -## 3. O lambda - -O lambda é a forma curta da classe anónima, desde o Java 8: - -\`\`\`java -mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); -}); -\`\`\` - -Fica de fora tudo o que o Java já sabe: \`new ActionListener()\`, o nome \`actionPerformed\`, \`public void\` e o tipo \`ActionEvent\`. Sobram o parâmetro \`e\`, a seta e o corpo. Isto só funciona porque o contrato tem exatamente **um** método. - -## As três comparadas - -| | classe interna com nome | classe anónima | lambda | -|---|---|---|---| -| tem nome | sim, p. ex. \`Mais\` | não | não | -| fica | na classe, fora de \`main\` | mesmo junto ao botão | mesmo junto ao botão | -| para vários botões | sim, \`new Mais()\` | não | sim, numa variável (lição 37) | -| vê variáveis de \`main\` | não | sim, se não mudarem | sim, se não mudarem | -| comprimento | a mais longa | média | a mais curta | - -::: ludwig -Se uma variável de \`main\` tiver de mudar no ouvinte, como \`contagem++\`, tem de ir para a classe, seja qual for a maneira de escrever. Esse era o problema da lição 32. -::: - -::: angeberwissen -Depois de compilar, espreita a pasta com os ficheiros \`.class\`. O javac cria um ficheiro para cada classe: \`Contador.class\`, \`Contador$Mais.class\` para a classe interna e \`Contador$1.class\` para a classe anónima. Como não tem nome, recebe um número. Um lambda não tem ficheiro próprio, o Java só o constrói quando o programa arranca. -::: - -## Jogo: Que maneira de escrever? - -::: spiel frage -titel: Jogo: Que maneira de escrever? -intro: O Ludwig mostra-te ouvintes de programas de outras pessoas. Que maneira de escrever é esta? Seis rondas. -frage: Que maneira de escrever é esta? -antworten: classe interna com nome | classe anónima | lambda - -runde: - botao.addActionListener(e -> texto.setText("Olá")); -richtig: lambda -> A seta \`->\` denuncia o lambda. - -runde: - botao.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - texto.setText("Olá"); - } - }); -richtig: classe anónima -> \`new ActionListener() {\` e a seguir um método inteiro: aqui está a ser escrita uma classe sem nome. - -runde: - static class Saudacao implements ActionListener { - public void actionPerformed(ActionEvent e) { - texto.setText("Olá"); - } - } -richtig: classe interna com nome -> A classe chama-se \`Saudacao\` e cumpre o contrato com \`implements ActionListener\`. - -runde: - botao.addActionListener(new Saudacao()); -richtig: classe interna com nome -> \`new Saudacao()\` cria um objeto da classe \`Saudacao\`. A própria classe está noutro sítio e tem nome. - -runde: - ActionListener tecla = e -> { - visor.setText(visor.getText() + e.getActionCommand()); - }; -richtig: lambda -> Um lambda numa variável, como no cadeado da lição 37. A seta denuncia-o. - -runde: - ActionListener tecla = new ActionListener() { - public void actionPerformed(ActionEvent e) { - visor.setText(visor.getText() + e.getActionCommand()); - } - }; -richtig: classe anónima -> Uma classe anónima também pode ficar numa variável. Assim pode ser registada em vários botões, tal como o lambda. -::: - -## Tarefa: Um contador, três maneiras - -Constrói o contador de cliques com três botões: - -- **+1** recebe a classe interna com nome \`Mais\`. -- **-1** recebe uma classe anónima. -- **Reset** recebe um lambda. - -Experimenta se os três botões contam como esperado. Depois tira o \`static\` da classe \`Mais\` e lê a mensagem de erro do javac. - -**Terminaste quando …** - -- **+1** conta para cima, **-1** para baixo e **Reset** põe 0, -- o código tem exatamente uma classe interna com nome, uma classe anónima e uma lambda, -- leste a mensagem de erro do javac sem \`static\` em \`Plus\` e consegues explicar o que significa. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo escrever um ouvinte como classe interna com nome. → 1. A classe interna com nome -- Consigo escrever um ouvinte como classe anónima. → 2. A classe anónima -- Consigo explicar o que fica de fora no lambda. → 3. O lambda -- Consigo explicar que maneira de escrever vê que variáveis. → As três comparadas -- Consigo construir um contador com três botões escritos de três maneiras. → Tarefa: Um contador, três maneiras -::: - -## Teste de conhecimentos - -::: quiz -? Porque é que a forma curta com a seta funciona com ActionListener? -→ 3. O lambda -- [ ] Porque ActionListener é uma classe. -- [x] Porque o contrato tem exatamente um método. -- [ ] Porque o botão o exige. - -? Que maneira de escrever podes usar com new Mais() em vários botões sem a guardar numa variável? -→ 1. A classe interna com nome -- [x] a classe interna com nome -- [ ] a classe anónima -- [ ] o lambda - -? Porque é que está static antes de class Mais? -→ 1. A classe interna com nome -- [ ] Para a classe ser mais rápida. -- [x] Porque main é static e senão não consegue criar um objeto de Mais. -- [ ] Porque todas as classes têm de ser static. - -? Liga. -→ As três comparadas -= class Mais implements ActionListener -> classe interna com nome -= new ActionListener() { … } -> classe anónima -= a seta depois de e -> lambda -::: -`,a9=`--- -titel: Dois separadores -bereich: Janelas com Swing -kurz: Construir uma janela com dois separadores, levar dados de um separador para o outro e guardar a lista num ficheiro de texto. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- construir uma janela com dois separadores -- acrescentar linhas a uma JTextArea com append -- explicar porque é que um ouvinte pode usar peças dos dois separadores -- guardar um ficheiro dentro de um ouvinte com try e catch -- construir uma lista de compras que conta quantas coisas tem -::: - -## O objetivo - -A lista de compras do Ludwig da lição 23 ganha uma janela. Tem dois **separadores**, como os do browser: - -- No separador **Entrada** escreves o que precisas e clicas em **Adicionar**. -- No separador **Lista** está tudo o que escreveste. Um botão **Guardar** escreve a lista num ficheiro de texto. - -Novos são os separadores (\`JTabbedPane\`), uma área de texto com várias linhas (\`JTextArea\`) e guardar a partir de um ouvinte. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Separadores com JTabbedPane - -Cada separador mostra a sua própria área. As áreas são JPanels, como o teclado do cadeado na lição 37: - -\`\`\`java -JTabbedPane separadores = new JTabbedPane(); -JPanel entrada = new JPanel(new GridLayout(0, 1)); -JPanel lista = new JPanel(new BorderLayout()); - -separadores.addTab("Entrada", entrada); -separadores.addTab("Lista", lista); -janela.add(separadores); -\`\`\` - -| Chamada | Significado | -|---|---| -| \`addTab("Entrada", entrada)\` | um separador novo com a legenda "Entrada", mostra o JPanel \`entrada\` | -| \`setSelectedIndex(1)\` | muda para o segundo separador, conta-se a partir de 0 | -| \`setTitleAt(1, "Lista (3)")\` | muda a legenda do segundo separador | - -No início está aberto o separador que foi adicionado primeiro. - -## Uma área de texto com várias linhas - -Um \`JTextField\` só tem uma linha. Para a lista precisas de uma \`JTextArea\`: - -\`\`\`java -JTextArea area = new JTextArea(); -area.setEditable(false); -area.append("Feno\\n"); -\`\`\` - -- \`append\` acrescenta texto no fim. O \`"\\n"\` começa depois uma nova linha, como ao dividir com \`split("\\n")\` na lição 24. -- \`setEditable(false)\` impede que se escreva diretamente na lista. -- \`getText()\` devolve o texto inteiro com todas as linhas. - -::: quiz -? O que faz \`area.append("Feno\\n")\`? -- [ ] Substitui o texto todo por “Feno”. -- [x] Acrescenta “Feno” no fim e começa depois uma linha nova. -- [ ] Escreve “Feno\\n” tal e qual na lista. -> \`append\` acrescenta no fim, \`"\\n"\` é a mudança de linha. -::: - -## De um separador para o outro - -O botão **Adicionar** está no separador Entrada, a área de texto no separador Lista. Mesmo assim, o ouvinte pode usar os dois. Todas as peças são variáveis em \`main\`, e o lambda vê-as todas, seja qual for o separador em que aparecem depois: - -\`\`\`java -adicionar.addActionListener(e -> { - area.append(campo.getText() + "\\n"); - info.setText(campo.getText() + " está na lista."); - campo.setText(""); -}); -\`\`\` - -::: ludwig -Uma peça só pode estar numa **única** área. Se juntares o mesmo botão primeiro a \`entrada\` e depois a \`lista\`, o Swing tira-o de \`entrada\`. Só aparece no separador Lista. -::: - -## Guardar dentro do ouvinte - -Para guardar usas o \`PrintWriter\` da lição 23. Dentro do ouvinte há um senão: a saída com \`throws Exception\` da lição 23 aqui não existe. O lambda é um método próprio, \`actionPerformed\`, e segundo o contrato não pode passar adiante uma \`FileNotFoundException\`. Por isso, guardar fica dentro de try e catch: - -\`\`\`java -guardar.addActionListener(e -> { - try { - PrintWriter saida = new PrintWriter("listacompras.txt"); - saida.print(area.getText()); - saida.close(); - info.setText("Guardado em listacompras.txt"); - separadores.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Não foi possível guardar."); - } -}); -\`\`\` - -- A exceção chama-se aqui \`ex\`, porque o nome \`e\` já está ocupado pelo evento. -- Depois de guardar, a janela volta com \`setSelectedIndex(0)\` ao separador Entrada, onde está a mensagem. -- O VisuStruct mostra o ficheiro guardado por baixo da consola, assim que clicares em Guardar. - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; -import java.io.*; - -public class ListaCompras { - public static void main(String[] args) { - JFrame janela = new JFrame("Lista de compras"); - janela.setSize(300, 250); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTabbedPane separadores = new JTabbedPane(); - - JPanel entrada = new JPanel(new GridLayout(0, 1)); - JTextField campo = new JTextField(); - JButton adicionar = new JButton("Adicionar"); - JLabel info = new JLabel("Ainda não há nada na lista."); - entrada.add(new JLabel("Do que precisas?")); - entrada.add(campo); - entrada.add(adicionar); - entrada.add(info); - - JPanel lista = new JPanel(new BorderLayout()); - JTextArea area = new JTextArea(); - area.setEditable(false); - JButton guardar = new JButton("Guardar"); - lista.add(area, BorderLayout.CENTER); - lista.add(guardar, BorderLayout.SOUTH); - - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); - - adicionar.addActionListener(e -> { - area.append(campo.getText() + "\\n"); - info.setText(campo.getText() + " está na lista."); - campo.setText(""); - }); - - guardar.addActionListener(e -> { - try { - PrintWriter saida = new PrintWriter("listacompras.txt"); - saida.print(area.getText()); - saida.close(); - info.setText("Guardado em listacompras.txt"); - separadores.setSelectedIndex(0); - } catch (FileNotFoundException ex) { - info.setText("Não foi possível guardar."); - } - }); - - janela.add(separadores); - janela.setVisible(true); - } -} -\`\`\` - -Escreve Feno, clica em Adicionar, depois Maçãs e outra vez Adicionar. Muda para o separador Lista e clica em Guardar. - -## Jogo: Onde vai parar? - -::: spiel frage -titel: Jogo: Onde vai parar? -intro: O Ludwig constrói janelas com separadores. Lê o código e prevê o que vês. Seis rondas. - -runde: - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); -frage: Que separador está aberto no início? -- [x] Entrada -- Lista -- nenhum -> No início está aberto o separador que foi adicionado primeiro. - -runde: - separadores.addTab("Lista", lista); - separadores.addTab("Entrada", entrada); -frage: Que separador está aberto no início? -- Entrada -- [x] Lista -- os dois -> Desta vez a Lista vem primeiro. A ordem dos \`addTab\` decide a ordem dos separadores. - -runde: - separadores.addTab("Entrada", entrada); - separadores.addTab("Lista", lista); - separadores.addTab("Ajuda", ajuda); - separadores.setSelectedIndex(1); -frage: Que separador está aberto? -- Entrada -- [x] Lista -- Ajuda -> Conta-se a partir de 0: 0 é Entrada, 1 é Lista, 2 é Ajuda. - -runde: - adicionar.addActionListener(e -> { - area.append(campo.getText() + "\\n"); - campo.setText(""); - }); - // Escreves Feno, clicas em Adicionar, escreves Maçãs, clicas em Adicionar. -frage: O que está depois no separador Lista? -- Maçãs -- FenoMaçãs -- [x] Feno\\nMaçãs -> \`append\` acrescenta no fim, e cada \`"\\n"\` começa uma nova linha. - -runde: - JButton botao = new JButton("OK"); - entrada.add(botao); - lista.add(botao); -frage: Onde aparece o botão OK? -- nos dois separadores -- só no separador Entrada -- [x] só no separador Lista -> Uma peça só pode estar numa área. No segundo \`add\`, o Swing tira-a de \`entrada\`. - -runde: - guardar.addActionListener(e -> { - area.setText(""); - separadores.setTitleAt(1, "Lista (vazia)"); - separadores.setSelectedIndex(0); - }); - // O botão guardar está no separador Lista. -frage: O que vês depois do clique? -- o separador Lista vazio -- [x] o separador Entrada, e o segundo separador chama-se "Lista (vazia)" -- o separador Entrada, e o segundo separador continua a chamar-se "Lista" -> O ouvinte esvazia a área, muda o nome do separador e muda para o separador 0. Tudo acontece com um clique. -::: - -## Tarefa: Lista de compras com separadores - -Constrói o programa e experimenta-o. - -Depois melhora-o: - -- Entradas vazias não vão para a lista. Verifica antes \`campo.getText().isEmpty()\` (lição 17). -- O separador Lista mostra no título quantas coisas estão na lista: "Lista (3)". Conta numa variável \`static int\` e usa \`setTitleAt\`. -- Extra: um terceiro separador **Ajuda** com um JLabel que explica como funciona o programa. - -**Terminaste quando …** - -- um item escrito aparece no separador da lista depois do clique, -- um campo vazio não acrescenta nada à lista, -- depois de três itens o título do separador mostra o número, p. ex. “Lista (3)”. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo construir uma janela com dois separadores. → Separadores com JTabbedPane -- Consigo acrescentar linhas a uma JTextArea com append. → Uma área de texto com várias linhas -- Consigo explicar porque é que um ouvinte pode usar peças dos dois separadores. → De um separador para o outro -- Consigo guardar um ficheiro dentro de um ouvinte com try e catch. → Guardar dentro do ouvinte -- Consigo construir uma lista de compras que conta quantas coisas tem. → Tarefa: Lista de compras com separadores -::: - -## Teste de conhecimentos - -::: quiz -? Que separador está aberto depois de separadores.setSelectedIndex(0)? -→ Separadores com JTabbedPane -- [x] o primeiro -- [ ] o segundo -- [ ] nenhum - -? Porque é que guardar dentro do ouvinte fica em try e catch? -→ Guardar dentro do ouvinte -- [ ] Porque o PrintWriter só funciona dentro de try. -- [x] Porque actionPerformed não pode passar adiante uma FileNotFoundException. -- [ ] Porque o main não tem throws. - -? Qual é a diferença entre JTextField e JTextArea? -→ Uma área de texto com várias linhas -- [ ] Não há nenhuma. -- [x] A JTextArea pode mostrar várias linhas. -- [ ] Num JTextField não se pode escrever. - -? Liga. -→ Separadores com JTabbedPane -= JTabbedPane -> uma área com separadores -= JPanel -> a área de um separador -= JTextArea -> uma área de texto com várias linhas -::: -`,s9=`--- -titel: Model View Controller -bereich: Janelas com Swing -kurz: Dividir o contador de cliques em model, view e controller e perceber quem fala com quem. ---- - -## Competências que vou adquirir agora - -::: kompetenzen -- dizer o que fazem o model, a view e o controller -- escrever um model sem Swing e testá-lo sem janela -- explicar o que constrói new Contador() e porque é que ali não há static -- nomear as quatro mensagens depois de um clique -- acrescentar uma segunda view sem mudar o model -- construir um contador com −1, Reset e limites no model -::: - -## O objetivo - -Os programas grandes com janelas têm quase sempre a mesma estrutura. Chama-se **Model View Controller**, ou **MVC**, em português modelo, vista e controlador: - -- O **model** guarda os dados e conhece as suas regras. -- A **view** só mostra os dados. -- O **controller** reage aos cliques e dá o recado. - -Aprendes MVC com o contador de cliques da lição 32. Ele é dividido em três partes, passo a passo. No fim mostra a mesma contagem duas vezes: como número e como barra. - -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). - -## Tudo numa classe - -Até agora o contador de cliques era assim, tudo está em \`main\` e numa variável da classe: - -\`\`\`java -static int contagem = 0; - -public static void main(String[] args) { - // ... construir a janela ... - JLabel numero = new JLabel("0", SwingConstants.CENTER); - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - contagem++; - numero.setText("" + contagem); - }); -} -\`\`\` - -Funciona. Mas imagina que a contagem também deve aparecer como barra, mais tarde numa segunda janela e num ficheiro. Então cada ouvinte tem de se lembrar de todos os visores. Contar e mostrar ficam atados num nó, e com cada visor o nó fica maior. - -O MVC desata o nó: cada tarefa recebe a sua própria classe. - -## O model - -O model é o próprio contador, sem nada de Swing: - -\`\`\`java -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} -\`\`\` - -- Desta vez não há \`static\` antes de \`valor\` e dos métodos. Assim pertencem a um **objeto**: \`new Contador()\` constrói um contador com o seu próprio \`valor\`, tal como \`new JButton("+1")\` constrói um botão com a sua própria legenda. -- \`model.aumentar()\` chama o método deste contador, tal como \`botao.setText(…)\`. -- Quem quer saber o valor pergunta com \`getValor()\`. Mudá-lo só é possível através de \`aumentar()\`. - -Como o model não precisa de janela, podes experimentá-lo sem janela nenhuma: - -\`\`\`java -public class ContadorTeste { - public static void main(String[] args) { - Contador model = new Contador(); - model.aumentar(); - model.aumentar(); - System.out.println(model.getValor()); - } -} - -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} -\`\`\` - -A saída é 2. Num ficheiro podem estar várias classes. Só uma delas é \`public\`, e essa tem o \`main\`. - -## A view - -A view mostra o valor e mais nada. Não faz contas e não sabe de onde vem o número: - -\`\`\`java -class VistaNumero { - JLabel numero = new JLabel("0", SwingConstants.CENTER); - - void atualizar(int valor) { - numero.setText("" + valor); - } -} -\`\`\` - -- A view recebe o valor com \`atualizar(int valor)\` e escreve-o no seu JLabel. -- A janela e o botão constróis em \`main\`, como sempre. Com \`janela.add(view.numero)\` o JLabel da view entra na janela. - -## O controller - -O controller é o ouvinte do botão. Liga o model à view: - -\`\`\`java -Contador model = new Contador(); -VistaNumero view = new VistaNumero(); - -mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); -}); -\`\`\` - -- Primeiro muda o model, depois vai buscar o novo valor e entrega-o à view. -- O problema da lição 32 desapareceu: a variável \`model\` nunca muda, aponta sempre para o mesmo contador. Só o \`valor\` lá dentro muda. Por isso o lambda pode usar \`model\`, sem nenhum \`static\`. - -## Quem fala com quem? - -A cada clique correm quatro mensagens, sempre pela mesma ordem: - -::: grafik mvc-klick.svg -As setas acendem-se uma após a outra. O model conta na segunda seta, o visor só na quarta. -::: - -1. O botão comunica o clique ao controller (\`actionPerformed\`). -2. O controller diz ao model: \`aumentar()\`. -3. O controller pergunta ao model o novo valor: \`getValor()\`. -4. O controller entrega o valor à view: \`atualizar(valor)\`. - -O model não fala com ninguém. Espera até lhe perguntarem. - -::: ludwig -Lembra-te: o model não sabe nada de janelas. Em \`Contador\` não há nenhum \`JLabel\` nem nenhum \`import javax.swing\`. Se precisares de Swing ali, o código pertence à view. -::: - -::: quiz -? Com quem fala o model por iniciativa própria? -- [ ] Com a view -- [ ] Com o botão -- [x] Com ninguém -> O model espera até o controller lhe perguntar. -::: - -## A vantagem: uma segunda view - -Agora a contagem também deve aparecer como barra. Para isso junta-se uma segunda view. Uma \`JProgressBar\` é uma barra que se enche, aqui de 0 a 10: - -\`\`\`java -class VistaBarra { - JProgressBar barra = new JProgressBar(0, 10); - - void atualizar(int valor) { - barra.setValue(valor); - } -} -\`\`\` - -O controller ganha mais uma linha. O model fica exatamente como estava: - -\`\`\`java -mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); -}); -\`\`\` - -É exatamente esta a vantagem do MVC: podes acrescentar ou trocar visores sem mexer no model. - -## O programa completo - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -class Contador { - int valor = 0; - - void aumentar() { - valor++; - } - - int getValor() { - return valor; - } -} - -class VistaNumero { - JLabel numero = new JLabel("0", SwingConstants.CENTER); - - void atualizar(int valor) { - numero.setText("" + valor); - } -} - -class VistaBarra { - JProgressBar barra = new JProgressBar(0, 10); - - void atualizar(int valor) { - barra.setValue(valor); - } -} - -public class ContadorCliques { - public static void main(String[] args) { - Contador model = new Contador(); - VistaNumero view = new VistaNumero(); - VistaBarra barra = new VistaBarra(); - - JFrame janela = new JFrame("Contador de cliques"); - janela.setSize(250, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JButton mais = new JButton("+1"); - mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); - }); - - janela.add(view.numero); - janela.add(barra.barra); - janela.add(mais); - janela.setVisible(true); - } -} -\`\`\` - -Clica algumas vezes em +1 e vê o número e a barra a crescer juntos. - -::: angeberwissen -O MVC foi inventado em 1979 pelo norueguês Trygve Reenskaug, no centro de investigação Xerox PARC, na Califórnia. Já nessa altura havia lá computadores com janelas e rato. No mesmo ano, Steve Jobs visitou o laboratório e ficou tão entusiasmado que a Apple passou a construir computadores com janelas e rato. -::: - -## Jogo: Onde pertence o código? - -::: spiel frage -titel: Jogo: Onde pertence o código? -intro: O Ludwig atirou código de um programa MVC para um monte. Arruma cada peça. Oito rondas. -frage: Onde pertence este código? -antworten: Model | View | Controller - -runde: - int valor = 0; -richtig: Model -> A contagem são os dados. Os dados moram no model. - -runde: - numero.setText("" + valor); -richtig: View -> Mostrar algo no ecrã é a tarefa da view. - -runde: - mais.addActionListener(e -> model.aumentar()); -richtig: Controller -> Reagir a um clique e avisar o model: é isso que o controller faz. - -runde: - void aumentar() { - valor++; - } -richtig: Model -> O próprio model sabe como mudar os seus dados. - -runde: - barra.setValue(valor); -richtig: View -> Uma barra que se enche só mostra. Portanto: view. - -runde: - void aumentar() { - if (valor < 10) { - valor++; - } - } -richtig: Model -> "No máximo 10" é uma regra para os dados. As regras pertencem ao model, assim valem para todos os botões e todas as views. - -runde: - view.atualizar(model.getValor()); -richtig: Controller -> Ir buscar o valor ao model e entregá-lo à view: é o controller no meio. - -runde: - JLabel numero = new JLabel("0", SwingConstants.CENTER); -richtig: View -> Um JLabel é uma peça do ecrã. No model não há Swing. -::: - -## Jogo: Quem é o próximo? - -::: spiel reihenfolge -titel: Jogo: Quem é o próximo? -intro: Depois de um clique, o model, a view e o controller falam uns com os outros, mas só funciona por uma ordem. Põe os passos pela ordem certa. Cinco rondas. - -runde: -frage: Clicas em +1 no contador de cliques. O que acontece, um passo após o outro? -- Clicas em +1. -- O controller recebe \`actionPerformed\`. -- O controller chama \`model.aumentar()\`. -- O model aumenta o \`valor\`. -- O controller vai buscar \`model.getValor()\`. -- A view mostra o novo número. -> Clique, controller, mudar o model, ir buscar o valor, mostrar. São as quatro setas da imagem, com a contagem no meio. - -runde: - mais.addActionListener(e -> { - model.aumentar(); - view.atualizar(model.getValor()); - barra.atualizar(model.getValor()); - }); -frage: O que acontece depois de um clique em +1, um passo após o outro? -- O clique em +1 -- \`model.aumentar()\` -- O número mostra o novo valor. -- A barra cresce. -> O ouvinte trata as suas linhas de cima para baixo: primeiro o model, depois o número, depois a barra. - -runde: -frage: Põe o controller pela ordem certa, para que a view mostre o novo número. -- \`mais.addActionListener(e -> {\` -- \`model.aumentar();\` -- \`view.atualizar(model.getValor());\` -- \`});\` -> Primeiro mudar, depois mostrar. Ao contrário, a view ainda mostra o valor antigo. - -runde: - reset.addActionListener(e -> { - model.reiniciar(); - view.atualizar(model.getValor()); - }); -frage: O contador está em 5. Clicas em Reset. O que acontece, um passo após o outro? -- Clicas em Reset. -- O model põe o \`valor\` a 0. -- \`model.getValor()\` devolve 0. -- A view mostra 0. -> Também o Reset passa pelo controller até ao model. A view só sabe do novo valor no fim. - -runde: -frage: Um teste sem janela deve escrever 1. Por que ordem estão as linhas no main? -- \`Contador model = new Contador();\` -- \`model.aumentar();\` -- \`System.out.println(model.getValor());\` -> Primeiro construir o objeto, depois trabalhar com ele e no fim ver o resultado. O model pode ser testado sem janela nenhuma. -::: - -## Tarefa: Um contador com limites - -Constrói o programa completo e experimenta-o. - -Depois melhora-o: - -- Um botão **−1** conta para baixo. O model recebe para isso um método \`diminuir()\`, o controller um segundo ouvinte. -- Um botão **Reset** põe o contador a 0 com \`reiniciar()\`. -- O próprio model trata dos limites: nunca abaixo de 0 e nunca acima de 10, porque aí a barra está cheia. -- Extra: uma terceira view \`VistaConsola\`, cujo \`atualizar\` escreve "Novo valor: 3" com \`System.out.println\`. Uma view não tem de ser uma janela. - -**Terminaste quando …** - -- **+1**, **−1** e **Reset** contam bem, -- o contador nunca fica abaixo de 0 nem acima de 10, por mais que cliques, -- o número e a barra mostram sempre o mesmo valor, -- a classe do modelo não tem \`JButton\`, \`JLabel\` nem outro Swing. - -## Lista de verificação - -Avalia-te com honestidade em cada ponto: ☂️ ainda não, ⛅ em parte, ☀️ consigo com segurança. Com ⛅ e ☂️, **Rever** ajuda-te. Depois vem o teste de conhecimentos. Mostra-te se a tua autoavaliação está certa. - -::: checkliste -- Consigo dizer o que fazem o model, a view e o controller. → O objetivo -- Consigo escrever um model sem Swing e testá-lo sem janela. → O model -- Consigo explicar o que constrói new Contador() e porque é que ali não há static. → O model -- Consigo nomear as quatro mensagens depois de um clique. → Quem fala com quem? -- Consigo acrescentar uma segunda view sem mudar o model. → A vantagem: uma segunda view -- Consigo construir um contador com −1, Reset e limites no model. → Tarefa: Um contador com limites -::: - -## Teste de conhecimentos - -::: quiz -? Onde fica a regra "O contador nunca passa de 10"? -→ O model -- [x] no model -- [ ] na view -- [ ] no controller -> As regras sobre os dados pertencem ao model. Assim valem seja qual for o botão. - -? O que faz a view? -→ O objetivo -- [ ] Calcula o novo valor. -- [x] Mostra o valor que recebe. -- [ ] Ouve os cliques. - -? Porque é que o lambda pode usar model, se model é uma variável do main? -→ Quem fala com quem? -- [ ] Porque Contador é public. -- [x] Porque model aponta sempre para o mesmo contador; só o valor lá dentro muda. -- [ ] Porque os lambdas podem mudar qualquer variável. - -? O que tens de mudar no model quando se junta uma segunda view? -→ A vantagem: uma segunda view -- [x] nada -- [ ] um segundo método aumentar -- [ ] um segundo JLabel - -? Liga. -→ O objetivo -= Contador com valor e aumentar() -> model -= VistaNumero com atualizar(int valor) -> view -= o ouvinte do botão -> controller -::: -`,r9=`Termos técnicos da área de aprendizagem. Quando um termo aparece num passo, fica marcado uma vez e mostra a sua -explicação ao passar o rato ou ao tocar. Se estiver a negrito nesse passo, é explicado ali mesmo e não é marcado. -\`auch:\` indica outras formas que também são reconhecidas. Maiúsculas e minúsculas contam. - -### Algoritmo -auch: algoritmo, algoritmos, Algoritmos -Instruções exatas, passo a passo, para resolver uma tarefa. Cada passo é claro. - -### Estrutograma -auch: estrutograma, estrutogramas, Estrutogramas, diagrama de Nassi-Shneiderman, diagramas de Nassi-Shneiderman, diagrama estruturado -Um algoritmo desenhado como imagem feita de blocos. Lê-se de cima para baixo. Também se chama diagrama de Nassi-Shneiderman. - -### Fluxograma -auch: fluxograma, fluxogramas, Fluxogramas -Um algoritmo desenhado com símbolos ligados por setas (DIN 66001 / ISO 5807). Um losango é uma decisão. - -### Pseudocódigo -auch: pseudocódigo -Um algoritmo escrito como texto em linguagem corrente com palavras fixas como SE e ENQUANTO. A indentação mostra o que pertence ao quê. - -### Instrução -auch: instrução, instruções, Instruções -Um único passo no estrutograma, por exemplo um cálculo, uma entrada ou uma saída. - -### Sequência -auch: sequência, sequências, Sequências -Passos que são executados uns a seguir aos outros, de cima para baixo, cada um exatamente uma vez. - -### Decisão -auch: decisão, decisões, Decisões, instrução condicional, instruções condicionais, estrutura de decisão -Um bloco que usa uma condição para decidir qual de dois ramos é executado. Também se chama instrução condicional. - -### Ramo -auch: ramo, ramos -Um dos dois caminhos de uma decisão: à esquerda para verdadeiro (true), à direita para falso (false). - -### Ciclo -auch: ciclo, ciclos, Ciclos, repetição, estrutura de repetição -Um bloco que repete passos enquanto uma condição se verificar. - -### Corpo do ciclo -auch: corpo do ciclo -O interior de um ciclo, ou seja, os passos que são repetidos. - -### Iteração -auch: iteração, iterações -Executar uma vez o interior de um ciclo. - -### Condição -auch: condição, condições, Condições -Uma pergunta que só pode ter como resposta sim (true) ou não (false), por exemplo idade >= 18. - -### Marcador -auch: marcador, marcadores -Um bloco vazio com o sinal ø. Se arrastares um elemento para cima dele, o elemento substitui-o. - -### Inspetor de objetos -A área por baixo do diagrama. Aqui editas o texto e as definições do bloco em que acabaste de clicar. - -### Simulação -auch: simulação -Executa o teu estrutograma no editor, se quiseres passo a passo. Assim vês o que acontece. - -### Variável -auch: variável, variáveis, Variáveis -Uma caixa com etiqueta para um valor. Tem um nome, um tipo de dados e um valor. - -### camelCase -auch: CamelCase -Forma de escrever nomes com várias palavras: escritas juntas, cada palavra seguinte começa com maiúscula, p. ex. \`precoComIva\`. - -### case-sensitive -O Java distingue maiúsculas de minúsculas: \`numero\`, \`Numero\` e \`NUMERO\` são três nomes diferentes. \`system\` em vez de \`System\` é um erro. - -### Constante -auch: constante, constantes, Constantes -Uma variável cujo valor não muda depois de definido. Escreve-se \`const\` à frente, p. ex. \`const double IVA = 0.23\`. - -### Tipo de dados -auch: tipo de dados, tipos de dados, Tipos de dados -Diz que tipo de valor cabe numa variável: int (número inteiro), double (número decimal), String (texto), boolean (verdadeiro ou falso) ou char (um único caractere). - -### Atribuição -auch: atribuição, atribuições, Atribuições -O sinal =. Calcula o lado direito e guarda o resultado na variável à esquerda. - -### Variável auxiliar -auch: variável auxiliar, variáveis auxiliares -Uma variável extra que guarda um valor durante pouco tempo, por exemplo ao trocar valores. - -### Modelo EPS -auch: entrada-processamento-saída -Entrada, processamento, saída: primeiro pedir os valores, depois calcular, depois mostrar o resultado. - -### Análise do problema -auch: análise do problema -Lês uma tarefa com atenção e descobres o que é dado, o que procuras e como chegar de um ao outro. - -### Operador de comparação -auch: operador de comparação, operadores de comparação, Operadores de comparação -Um sinal que compara dois valores, por exemplo == ou <. O resultado é true ou false. - -### Seleção -auch: seleção, seleção múltipla, escolha múltipla -Um bloco que executa exatamente um de vários casos, consoante o valor de uma variável. Também se chama seleção múltipla. - -### Ciclo pré-teste -auch: ciclo pré-teste, ciclos pré-teste, controlado no início -O ciclo verifica a sua condição antes de cada iteração. Se a condição for falsa logo no início, o ciclo não é executado nem uma vez. - -### Ciclo pós-teste -auch: ciclo pós-teste, ciclos pós-teste, controlado no fim -O ciclo só verifica a sua condição depois de cada iteração. Por isso é sempre executado pelo menos uma vez. - -### Variável contadora -auch: variável contadora, variáveis contadoras, contador -Uma variável que vai contando num ciclo, normalmente i. - -### Ciclo infinito -auch: ciclo infinito, ciclos infinitos, ciclo sem fim -Um ciclo cuja condição nunca se torna falsa. Nunca para sozinho. - -### Array -auch: array, arrays, Arrays, vetor, vetores -Uma fila de posições com um nome comum e o mesmo tipo de dados. - -### Índice -auch: índice, índices -O número de uma posição num array. Começa-se a contar em 0. - -### char -O tipo de dados para um único caractere. Fica entre aspas simples, p. ex. 'C'. Já "C" com aspas duplas é uma String. - -### Código de caractere -auch: código de caractere, códigos de caractere, código ASCII, tabela ASCII -O número que está por trás de um caractere. Na tabela ASCII, o A tem o código 65, o B 66 e assim por diante. Em Java, (int) transforma um caractere no seu código e (char) transforma um código no caractere. - -### String -auch: strings, Strings, cadeia de caracteres, cadeias de caracteres -Um texto, ou seja, uma fila de caracteres. Em Java o tipo de dados chama-se String. Os caracteres contam-se a partir de 0. - -### Array 2D -auch: arrays 2D, array bidimensional, arrays bidimensionais, matriz, matrizes -Um array com linhas e colunas, como uma tabela. Uma posição precisa de dois índices, p. ex. \`lugares[1][2]\`. - -### Subprograma -auch: subprograma, subprogramas, Subprogramas, método, métodos, Métodos, procedimento, procedimentos, função, funções, Funções -Um estrutograma próprio para uma parte da tarefa. É executado quando é chamado. Em Java chama-se método; consoante o tipo, também procedimento ou função. - -### Parâmetro -auch: parâmetro, parâmetros, Parâmetros -Uma variável na linha de cabeçalho de um subprograma. Quando é chamado, recebe o valor que está entre parênteses. - -### Código esparguete -auch: código esparguete -Um programa que salta de um lado para o outro de forma tão confusa que mal se consegue seguir o que acontece. Os estrutogramas evitam isso. - -### Passagem por valor -auch: passagem por valor -Um subprograma recebe uma cópia do valor. Se alterar o seu parâmetro, a variável de quem chamou fica igual. - -### Passagem por referência -auch: passagem por referência -Um subprograma recebe uma referência para os mesmos dados, p. ex. para um array. Se alterar uma posição, quem chamou também vê a alteração. - -### Valor de retorno -auch: valor de retorno, valores de retorno, Valores de retorno -O resultado que um subprograma devolve à chamada com return. - -### Interrupção -Um bloco que sai imediatamente do ciclo em que está. Depois o programa continua por baixo do ciclo. - -### Erro de sintaxe -auch: erro de sintaxe, erros de sintaxe, Erros de sintaxe -Um erro na forma como o código está escrito, por exemplo um \`;\` em falta. O programa nem sequer arranca. Em inglês: syntax error. - -### Erro de execução -auch: erro de execução, erros de execução, Erros de execução -Um erro que só acontece enquanto o programa corre, por exemplo dividir por 0. O programa para nesse ponto. Em inglês: runtime error. - -### Erro de lógica -auch: erro de lógica, erros de lógica, Erros de lógica -O programa corre sem nenhuma mensagem, mas dá um resultado errado. Encontra-se com o teste de secretária. Em inglês: logic error. - -### Teste de secretária -auch: teste de secretária, testes de secretária, Testes de secretária, teste de mesa -Executas um estrutograma no papel e anotas os valores das variáveis depois de cada passo. - -### Pesquisa linear -auch: pesquisa linear -Uma forma de pesquisar que compara todos os valores, um a seguir ao outro, com o valor procurado. Também funciona com valores desordenados. - -### Pesquisa binária -auch: pesquisa binária -Uma forma de pesquisar em valores ordenados. Olha para o meio e continua a pesquisar só na metade certa. - -### Bubble sort -auch: bubble sort, Bubblesort, ordenação por bolha -Uma forma simples de ordenar. Compara sempre dois vizinhos e troca-os se estiverem na ordem errada. - -### Evento -auch: evento, eventos, Eventos -Algo que uma pessoa faz num programa com janelas, por exemplo clicar num botão. O programa reage com um ouvinte (ActionListener). - -### Interface -auch: Interfaces -Uma espécie de contrato em Java: diz que métodos uma classe tem de ter. \`ActionListener\` é uma interface com o método \`actionPerformed\`. - -### Exceção -auch: exceção, exceções, Exceções, Exception, Exceptions -Um erro que só acontece durante a execução, por exemplo um índice fora do array. Se nenhum \`catch\` a apanhar, o programa termina. - -### Atributo -auch: atributo, atributos, Atributos -Uma variável que está diretamente na classe e não dentro de um método. Com \`static\` pertence à própria classe e vive tanto tempo como o programa, por exemplo um contador de cliques que vários ouvintes alteram. - -### Scanner -Um bloco pronto do Java que lê entradas do teclado, por exemplo um número com \`scanner.nextInt()\`. Precisa de \`import java.util.Scanner;\` mesmo no início. - -### Comentário -auch: Comentários, comentário, comentários -Uma nota no código para pessoas. O Java salta-a ao executar. \`//\` vale até ao fim da linha, \`/* … */\` pode ocupar várias linhas. - -### import -Uma linha mesmo no início do código Java que vai buscar um bloco pronto a um pacote, por exemplo \`import java.util.Scanner;\`. Sem ela, o Java não conhece o nome. - -### código-fonte -auch: Código-fonte -O texto do programa que as pessoas escrevem e leem, por exemplo num ficheiro \`Tabuada.java\`. - -### compilador -auch: Compilador, compiladores -Um programa que traduz código-fonte. Em Java chama-se \`javac\` e transforma um ficheiro \`.java\` em bytecode num ficheiro \`.class\`. - -### bytecode -auch: Bytecode -A forma traduzida de um programa Java num ficheiro \`.class\`. Quem o lê é a JVM, não as pessoas. - -### JVM -auch: Java Virtual Machine, máquina virtual -A Java Virtual Machine executa bytecode. É um programa que funciona como um pequeno computador feito de software no Windows, no macOS ou no Linux. Por isso o Java é independente da plataforma. - -### JRE -Java Runtime Environment: a JVM e blocos prontos. Com ele podes executar programas Java, mas não compilá-los. - -### JDK -Java Development Kit: o JRE e ainda o compilador \`javac\` e outras ferramentas. É preciso para programar. - -### independente da plataforma -Um programa corre sem alterações em sistemas operativos diferentes. Em Java é a JVM que o permite: “Write once, run anywhere”. - -### código máquina -auch: Código máquina -Instruções em forma de números que o processador executa diretamente. Cada tipo de processador tem o seu próprio código máquina. - -### compilador JIT -auch: JIT -Uma parte da JVM que, durante a execução (“just in time”), traduz o bytecode muito usado em código máquina. Assim o Java fica mais rápido. -`,o9=`## Elementos básicos - -### Instrução - -Um único passo. Serve para criar variáveis ou para calcular. - -\`\`\` -int numero = 5 -double preco = 2.5 -String nome = "Ada" -numero = numero + 1 -\`\`\` - -### Tipos de dados - -O tipo de dados vem antes do nome da variável. - -| Tipo de dados | Significado | Exemplo | -|---|---|---| -| \`int\` | número inteiro | \`int quantidade = 3\` | -| \`double\` | número decimal (com ponto) | \`double preco = 2.5\` | -| \`String\` | texto entre aspas duplas | \`String nome = "Ada"\` | -| \`boolean\` | valor lógico | \`boolean pronto = false\` | -| \`char\` | um único caractere entre aspas simples | \`char nota = 'C'\` | - -\`'C'\` é um \`char\`, \`"C"\` é uma String. Um caractere de um texto obténs com \`charAt\`: \`char primeiro = nome.charAt(0)\`. Cada caractere tem um código de caractere: \`(int) 'A'\` é 65, \`(char) 66\` é \`'B'\`. - -### Entrada - -Pede um valor enquanto o estrutograma é executado e guarda-o numa variável. O texto entre aspas é a pergunta. - -\`\`\` -input: int idade "Quantos anos tens?" -input: double preco "Introduz um preço" -input: String nome "Como te chamas?" -\`\`\` - -### Saída - -Mostra um texto ou um valor. Os textos ficam entre aspas; juntas texto e variáveis com \`+\`. - -\`\`\` -output: "Olá" -output: soma -output: "Tens " + idade + " anos." -\`\`\` - -> Numa saída, \`+\` junta sempre as partes: com 3 e 4, \`output: a + b\` mostra 34. Por isso calcula primeiro numa variável, p. ex. \`int soma = a + b\`, e depois mostra \`soma\`. - -## Decisões - -### Decisão - -Verifica uma condição. Se for verdadeira, é executado o ramo da esquerda (true), senão o da direita (false). - -\`\`\` -idade >= 18 -numero % 2 == 0 -nota < 1 || nota > 5 -\`\`\` - -### Seleção - -Escolhe um de vários casos, consoante o valor de uma variável. Se nenhum caso servir, aplica-se \`default\`. Acrescentas casos à direita com **Adicionar caso**. - -## Ciclos - -### Ciclo while - -Repete o seu interior **enquanto** a condição for verdadeira. A condição é verificada antes de cada iteração. - -\`\`\` -numero != 1 -i < 10 -\`\`\` - -### Ciclo do-while - -Executa o seu interior **pelo menos uma vez** e só depois verifica a condição. - -### Ciclo for - -Conta uma variável desde um valor inicial até um limite. Os três campos são Início, Condição e Passo. - -\`\`\` -int i = 0 -i < 5 -i++ -\`\`\` - -### Ciclo infinito - -Repete o seu interior sem condição. Uma **Interrupção** lá dentro permite sair dele. - -### Interrupção - -Sai do ciclo que a rodeia (\`break\`). - -## Subprogramas - -### Chamada - -Representa um subprograma, p. ex. \`calcularSoma()\`. Com parâmetros e valor de retorno, o subprograma tem uma linha de cabeçalho como título: - -\`\`\` -int quadrado(int x) linha de cabeçalho do subprograma -return x * x devolve o resultado -int q = quadrado(5) chamada, q fica com 25 -mostrarSoma(3, 4) chamada de um subprograma void -\`\`\` - -## Cálculos e comparações - -### Operadores e comparações - -- \`+ - * /\` as quatro operações básicas -- \`%\` resto de uma divisão (\`7 % 2\` dá 1) -- \`==\` igual, \`!=\` diferente -- \`<\` \`<=\` \`>\` \`>=\` menor, menor ou igual, maior, maior ou igual -- \`&&\` e, \`||\` ou - -## Arrays - -### Arrays - -Vários valores com um só nome. Começa-se a contar em 0. - -\`\`\` -int[] numeros = {3, 7, 1} -output: numeros[0] -int[] vazio = new int[5] -\`\`\` - -Um **array 2D** é uma tabela com linhas e colunas: - -\`\`\` -boolean[][] lugares = new boolean[3][5] -lugares[1][4] = true -output: lugares.length + " filas, " + lugares[0].length + " lugares" -\`\`\` - -## Java - -### Do código ao programa - -O compilador \`javac\` traduz \`Ficheiro.java\` em bytecode (\`Ficheiro.class\`). A JVM traduz o bytecode em código máquina ao executá-lo, da mesma forma no Windows, no macOS e no Linux. Já o C++ passa diretamente a código máquina e tem de ser compilado de novo para cada sistema. - -| | contém | para | -|---|---|---| -| JRE | JVM e bibliotecas | executar | -| JDK | JRE, compilador \`javac\`, ferramentas | programar | - -### Comentários - -Notas no código. O Java salta-as, o estrutograma fica igual. - -\`\`\`java -/* - * Tarefa: somar os números de 1 a 10 - * (comentário de várias linhas) - */ -// Processamento (comentário de uma linha) -int soma = 0; -for (int i = 1; i <= 10; i++) { - soma = soma + i; // comentário depois do código -} // fim do for -\`\`\` - -Serve para: a tarefa, dividir o código em entrada, processamento e saída, uma explicação, o fim de um bloco depois de \`}\`, a saída esperada e notas para a próxima vez. -`,l9=`--- -titel: Alter im Unterprogramm -nach: 18 -stufe: 2 ---- - -Die Altersprüfung aus „Volljährig?“ wird jetzt ein eigenes Unterprogramm. Das Hauptprogramm ruft es nur noch auf. - -::: übung aufgabe-alter-unterprogramm -titel: Alter im Unterprogramm -auftrag: Baue zwei Diagramme. Das Hauptprogramm gibt **Willkommen** aus, ruft dann \`pruefeAlter()\` auf und gibt zum Schluss **Auf Wiedersehen** aus. - Das Unterprogramm \`pruefeAlter\` steht in einem eigenen Reiter: Es fragt nach dem Alter und gibt **volljährig** oder **minderjährig** aus. -test: 20 -> Willkommen | volljährig | Auf Wiedersehen -test: 18 -> Willkommen | volljährig | Auf Wiedersehen -test: 12 -> Willkommen | minderjährig | Auf Wiedersehen -braucht: aufruf -tipp: Das Hauptprogramm hat drei Kästen. Die eigentliche Arbeit macht das Unterprogramm. -tipp: Öffne die Übung im Editor und baue dort das Hauptprogramm mit dem Aufruf \`pruefeAlter()\`. Lege dann mit **+** einen neuen Reiter an und gib ihm den Titel \`pruefeAlter\`. Darin baust du die Eingabe und die Verzweigung. Prüfen findet das Unterprogramm über den Titel des Reiters. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: -`,u9=`--- -titel: Ballwurf auswerten -nach: 25 -stufe: 2 ---- - -Beim Sportfest haben alle ihre Weite beim Ballwurf in eine Tabelle eingetragen: - -::: datei ballwurf.csv -Name;Weite -Ludwig;28 -Zora;42 -Fuchs;35 -Hase;21 -::: - -::: übung aufgabe-ballwurf -titel: Ballwurf auswerten -code: java -auftrag: Lies die Datei ein und überspringe die Kopfzeile. Gib aus, wie viele mitgemacht haben (**Teilnehmer: 4**) und wie weit im Schnitt geworfen wurde (**Schnitt: 31.5 m**). - Speichere den weitesten Wurf in der Datei **sieger.txt**, zum Beispiel **Sieger: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Teilnehmer: 4 | Schnitt: 31.5 m -datei: sieger.txt -> Sieger: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: Du brauchst vier Variablen vor der Schleife: die Anzahl, die Summe als \`double\`, die beste Weite und den besten Namen. -tipp: In der Schleife: \`String[] teile = zeile.split(";");\` und \`int weite = Integer.parseInt(teile[1]);\`. Ist \`weite > besteWeite\`, merkst du dir Weite und Namen. Zum Speichern: \`PrintWriter aus = new PrintWriter("sieger.txt");\`, \`aus.println(…)\` und \`aus.close();\`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: -`,m9=`--- -titel: Bestenliste -nach: 19 -stufe: 2 ---- - -Fünf Ziegen sind beim Hindernislauf gestartet. Jetzt soll die Bestenliste an die Stalltür: die meisten Punkte oben, die wenigsten unten. - -::: übung aufgabe-bestenliste -titel: Bestenliste -auftrag: Lies 5 Punktzahlen in ein Array ein. Sortiere das Array mit Bubblesort **absteigend**, also die größte Zahl zuerst. Gib danach die Liste mit Platz aus, zum Beispiel **1. 9**, in der nächsten Zeile **2. 9** und so weiter. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Bubblesort aus Lektion 19 sortiert aufsteigend. Für absteigend drehst du nur den Vergleich der Nachbarn um. -tipp: Getauscht wird, wenn \`punkte[i] < punkte[i + 1]\` ist, mit einer Hilfsvariablen. Für die Ausgabe rechnest du zuerst \`int platz = i + 1\` aus und gibst dann \`platz + ". " + punkte[i]\` aus. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-bestenliste-java -titel: Bestenliste in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Lies jede Zahl erst in eine Variable ein und schreibe sie dann ins Array: \`int zahl = scanner.nextInt();\` und \`punkte[i] = zahl;\`. -tipp: Der Tausch braucht auch in Java eine Hilfsvariable: \`int hilf = punkte[i]; punkte[i] = punkte[i + 1]; punkte[i + 1] = hilf;\`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: -`,c9=`--- -titel: Binärzahl -nach: 11 -stufe: 3 ---- - -Computer rechnen mit nur zwei Ziffern: 0 und 1. So wandelst du eine Zahl ins **Binärsystem** um: - -1. Teile die Zahl durch 2 und merke dir den Rest (0 oder 1). -2. Rechne mit dem Ergebnis ohne Rest weiter. -3. Wiederhole das, bis die Zahl 0 ist. - -Die Reste von **unten nach oben** gelesen ergeben die Binärzahl. Bei 6 sind die Reste 0, 1, 1, also lautet die Binärzahl 110. - -::: übung aufgabe-binaer -titel: Binärzahl -auftrag: Frage nach einer ganzen Zahl größer als 0 und gib sie als Binärzahl aus. Bei 6 lautet die Ausgabe **110**, bei 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Teile die Zahl immer wieder durch 2 und merke dir jeden Rest. Die Reste rückwärts gelesen ergeben die Binärzahl. -tipp: Sammle die Ziffern in einem Text: \`String binaer = ""\`. In der Schleife berechnest du \`int rest = zahl % 2\` und hängst den Rest **vorne** an: \`binaer = rest + binaer\`. Danach \`zahl = zahl / 2\`. Weil zahl eine ganze Zahl ist, fällt der Rest dabei weg. -lösung: aufgabe-binaer-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-binaer-java -titel: Binärzahl in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Fang mit \`String binaer = "";\` an. Die Schleife läuft mit \`while (zahl > 0)\`. -tipp: Im Rumpf: \`int rest = zahl % 2;\`, dann \`binaer = rest + binaer;\` und \`zahl = zahl / 2;\`. Weil \`binaer\` ein String ist, hängt \`+\` den Rest vorne an. -lösung: aufgabe-binaer-loesung.visustruct -::: -`,d9=`--- -titel: Caesar-Verschlüsselung -nach: 17 -stufe: 3 ---- - -Schon vor über 2000 Jahren schickte der römische Feldherr Julius Caesar geheime Nachrichten an seine Truppen. Sein Trick war einfach: Er ersetzte jeden Buchstaben durch den Buchstaben, der **drei Stellen weiter** im Alphabet steht. Aus A wird D, aus B wird E und so weiter. Die lesbare Nachricht heißt **Klartext**, die verschlüsselte **Geheimtext**. Um wie viele Stellen verschoben wird, ist der **Schlüssel**, oft kurz \`k\` genannt. - -::: grafik caesar-verschiebung.svg -Verschlüsselung mit dem Schlüssel 3: Jeder Buchstabe oben wird zum Buchstaben darunter. Am Ende geht es von vorn weiter, aus X, Y und Z werden A, B und C. -::: - -Aus \`HALLO\` wird so \`KDOOR\`. Wer den Schlüssel kennt, schiebt einfach drei Stellen zurück und kann die Nachricht wieder lesen. - -### Die Chiffrierscheibe - -Damit man nicht jedes Mal abzählen muss, baute man sich eine **Chiffrierscheibe**: zwei Scheiben mit dem Alphabet, eine kleine auf einer großen, in der Mitte drehbar befestigt. Außen steht der Klartext, innen der Geheimtext. Dreht man die innere Scheibe um drei Buchstaben, steht unter jedem Buchstaben außen sein Geheimbuchstabe. Solche Scheiben gibt es seit dem 15. Jahrhundert. Im Amerikanischen Bürgerkrieg (1861–1865) trugen Soldaten kleine Scheiben aus Messing bei sich. - -::: grafik caesar-scheibe.svg -Eine Chiffrierscheibe nach dem Vorbild historischer Messingscheiben. Das blaue Fenster zeigt: Mit dem Schlüssel 3 steht unter A das D. -::: - -::: angeberwissen -Caesar selbst hatte noch gar keine Scheibe! Das wissen wir vom römischen Geschichtsschreiber Sueton: Caesar verschob in seinen Briefen jeden Buchstaben um drei Stellen und zählte das einfach im Kopf ab. Die Scheibe erfand erst Leon Battista Alberti um 1467, also rund 1500 Jahre später. Ich zähle übrigens auch im Kopf, ich habe ja keine Finger, nur Hufe. -::: - -Probiere es selbst aus. Drehe die innere Scheibe, tippe einen Text ein und schau zu, wie der Geheimtext entsteht. Mit **Entschlüsseln** geht es rückwärts. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -Eine echte Scheibe kannst du ganz leicht selbst basteln: zwei Kreise aus Pappe, einer etwas kleiner, je 26 gleich große Felder mit dem Alphabet und in der Mitte eine Musterklammer. Fertig ist dein Geheimdienst-Werkzeug! -::: - -::: quiz -? Was wird mit dem Schlüssel 3 aus dem Buchstaben Y? -- [ ] A -- [x] B -- [ ] C -> Nach Y kommen Z, dann geht es von vorn los mit A und B. Drei Stellen weiter ist also B. - -? Ein Geheimtext wurde mit dem Schlüssel 5 verschlüsselt. Wie entschlüsselst du ihn? -- [ ] Noch einmal 5 Stellen weiter schieben -- [x] 5 Stellen zurück schieben -- [ ] Die Buchstaben rückwärts lesen -> Entschlüsseln ist das Gegenteil vom Verschlüsseln. Fünf Stellen zurück ist übrigens dasselbe wie 21 Stellen weiter, denn 5 + 21 = 26. -::: - -### Das Programm: Es gibt mehr als einen Weg - -Wie bringst du dem Computer bei, einen Buchstaben um \`k\` Stellen zu verschieben? Dafür gibt es nicht *die eine* richtige Lösung. Wir schauen uns zwei Wege an. Beide gehen den Text mit einer For-Schleife Zeichen für Zeichen durch, so wie in der Lektion Zeichenketten. Der Unterschied ist, wie sie einen einzelnen Buchstaben verschieben. - -In beiden Wegen hilft der Rest-Operator \`%\`. Er sorgt dafür, dass es nach Z wieder bei A weitergeht: Die Positionen 0 bis 25 bleiben, wie sie sind, aus 26 wird 0, aus 27 wird 1 und so weiter. - -### Weg 1: Das Alphabet in einem Array - -Du legst das Alphabet in ein Array \`char[] alphabet = {'A', 'B', …, 'Z'}\`. Für jeden Buchstaben des Wortes suchst du im Array seine Position \`pos\`, also seinen Index. Der Geheimbuchstabe steht dann im selben Array an der Stelle \`(pos + k) % 26\`. - -Ein Beispiel mit dem Schlüssel 3: X steht an der Position 23. Dann ist \`(23 + 3) % 26 = 0\`, und an der Position 0 steht A. - -::: übung aufgabe-caesar-array -titel: Caesar mit Array -auftrag: Das Startdiagramm enthält schon das Array \`alphabet\`. Frage nach einem Wort aus Großbuchstaben und nach dem Schlüssel \`k\`. Gib dann das verschlüsselte Wort aus. Bei HALLO und 3 also \`KDOOR\`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Lege einen leeren Text \`String geheim = ""\` an. Gehe das Wort mit einer For-Schleife Zeichen für Zeichen durch. In jedem Durchlauf hängst du einen Geheimbuchstaben hinten an \`geheim\` an. -tipp: Um die Position eines Buchstabens zu finden, brauchst du eine zweite, innere Schleife über das Array: Ist \`alphabet[j] == zeichen\`, merkst du dir \`pos = j\`. -tipp: Nach der inneren Schleife hängst du \`alphabet[(pos + k) % 26]\` an: \`geheim = geheim + alphabet[(pos + k) % 26]\`. Nach der äußeren Schleife gibst du \`geheim\` aus. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Weg 2: Rechnen mit der ASCII-Tabelle - -Für den Computer ist jedes Zeichen eigentlich eine Zahl. Welche Zahl zu welchem Zeichen gehört, steht in der **ASCII-Tabelle**. Dort hat A den Code 65, B den Code 66 und so weiter bis Z mit 90. In Java wandelst du ein Zeichen mit \`(int)\` in seinen Code um und einen Code mit \`(char)\` zurück in ein Zeichen: - -\`\`\` -int code = (int) 'A' -char zeichen = (char) 68 -\`\`\` - -Danach ist \`code\` gleich 65 und \`zeichen\` gleich \`'D'\`. So eine Umwandlung von einem Datentyp in einen anderen heißt **Typumwandlung** (englisch *cast*). - -Jetzt kannst du mit dem Buchstaben rechnen. Damit der Sprung von Z zurück zu A klappt, ziehst du erst 65 ab. Dann hat A die Position 0 und Z die Position 25, genau wie in Weg 1. Du verschiebst mit \`% 26\` und zählst am Ende die 65 wieder dazu: - -::: grafik caesar-ascii.svg -Oben die Großbuchstaben mit ihren ASCII-Codes. Unten der Rechenweg für X mit dem Schlüssel 3: Heraus kommt A. -::: - -::: übung aufgabe-caesar-ascii -titel: Caesar mit ASCII -code: java -auftrag: Schreibe ein Java-Programm, das ein Wort aus Großbuchstaben und den Schlüssel \`k\` einliest und das verschlüsselte Wort ausgibt. Diesmal ohne Array: Rechne mit \`(int)\` und \`(char)\`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Gehe das Wort mit einer For-Schleife durch. Den Code des Zeichens an der Stelle \`i\` bekommst du mit \`int code = (int) wort.charAt(i);\`. -tipp: Rechne \`code = (code - 65 + k) % 26 + 65;\` und hänge das Zeichen an: \`geheim = geheim + (char) code;\`. Vor der Schleife steht \`String geheim = "";\`, nach der Schleife \`System.out.println(geheim);\`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Welcher Weg ist besser? - -**Weg 1: Array.** Die Idee ist, die Position im Array zu suchen. -- Vorteil: leicht zu verstehen, und auch eigene Alphabete gehen, z. B. mit Ä, Ö und Ü. -- Nachteil: Für jeden Buchstaben muss gesucht werden. - -**Weg 2: ASCII.** Die Idee ist, mit dem Zeichencode zu rechnen. -- Vorteil: kurz und ohne Suche, darum schneller. -- Nachteil: Man muss die ASCII-Codes kennen. - -Beide Programme liefern dasselbe Ergebnis. Genau so ist es oft beim Programmieren: Es gibt mehrere richtige Lösungen, und du wählst die, die am besten zu deiner Aufgabe passt. - -::: übung aufgabe-caesar-entschluesseln -titel: Caesar entschlüsseln -code: java -auftrag: Jetzt drehst du den Spieß um. Lies einen Geheimtext aus Großbuchstaben und den Schlüssel \`k\` ein und gib den Klartext aus. Bei KDOOR und 3 also \`HALLO\`. Welchen Weg du nimmst, entscheidest du. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Entschlüsseln heißt: \`k\` Stellen zurück statt vor. Aus dem \`+ k\` wird also ein \`- k\`. -tipp: Vorsicht bei A: \`0 - 3\` ergibt -3, und \`%\` macht daraus in Java keine positive Zahl. Zähle darum noch 26 dazu: \`code = (code - 65 - k + 26) % 26 + 65;\` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Sicher ist Caesar leider nicht. Es gibt nur 25 Schlüssel, die kann man in ein paar Minuten alle ausprobieren. Noch schneller geht es mit einem Trick: Im Deutschen ist E der häufigste Buchstabe. Kommt im Geheimtext H am häufigsten vor, war der Schlüssel wohl 3. Im Internet gibt es übrigens ROT13, das ist Caesar mit dem Schlüssel 13. Zweimal ROT13 ergibt wieder den Klartext, weil 13 + 13 = 26. -::: -`,h9=`--- -titel: Collatz-Folge -nach: 11 -stufe: 2 ---- - -Die Collatz-Folge ist ein berühmtes Rätsel der Mathematik. Du beginnst mit einer Zahl und wendest immer wieder dieselbe Regel an: - -- Ist die Zahl **gerade**, teilst du sie durch 2. -- Ist sie **ungerade**, rechnest du mal 3 plus 1. - -Bisher endet die Folge bei jeder ausprobierten Startzahl irgendwann bei 1. Ob das für alle Zahlen gilt, weiß bis heute niemand. - -::: übung aufgabe-collatz -titel: Collatz-Folge -auftrag: Frage nach einer Startzahl. Wende die Regel so lange an, bis die Zahl 1 ist, und gib nach jedem Schritt die neue Zahl aus. Zähle dabei die Schritte mit und gib am Ende **Schritte:** und die Anzahl aus. - Bei der Startzahl 6 lautet die Folge 3, 10, 5, 16, 8, 4, 2, 1. Das sind 8 Schritte. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 7 -test: 1 -> Schritte: 0 -braucht: whileSchleife, verzweigung -tipp: Du weißt nicht, wie viele Schritte es werden. Darum passt eine While-Schleife besser als eine For-Schleife. -tipp: Die While-Schleife läuft, solange \`zahl != 1\` gilt. Ob eine Zahl gerade ist, prüfst du mit \`zahl % 2 == 0\`. Die Ausgabe und \`schritte++\` kommen nach der Verzweigung, aber noch in die Schleife. -lösung: aufgabe-collatz-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-collatz-java -titel: Collatz-Folge in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Schritte: 7 -test: 1 -> Schritte: 0 -braucht: whileSchleife, verzweigung -tipp: Eine \`while\`-Schleife läuft, solange \`zahl != 1\` ist. Darin entscheidet ein \`if\` mit \`zahl % 2 == 0\`. -tipp: Im Rumpf: halbieren oder \`zahl = zahl * 3 + 1;\`, dann \`System.out.println(zahl);\` und \`schritte++;\`. Nach der Schleife kommt \`"Schritte: " + schritte\`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -Mit dieser Aufgabe kann man reich werden! Der Mathematiker Paul Erdős setzte für einen Beweis 500 Dollar aus. 2021 legte die japanische Firma Bakuage noch einiges drauf: 120 Millionen Yen, damals umgerechnet rund eine Million Dollar, für einen Beweis oder ein Gegenbeispiel. Abgeholt hat das Geld bis heute niemand. Erfunden hat das Rätsel übrigens der deutsche Mathematiker Lothar Collatz im Jahr 1937. Ich rechne gleich mal los, für so viel Geld gibt es eine Menge Heu. -::: -`,g9=`--- -titel: Einheitenrechner -nach: 35 -stufe: 2 ---- - -Baue ein Fenster, das Längen umrechnet. Oben tippst du eine Länge in Metern ein, darunter stehen drei Knöpfe: - -- **in cm** zeigt die Länge in Zentimetern, aus 1.5 wird „150.0 cm“, -- **in mm** zeigt sie in Millimetern, aus 1.5 wird „1500.0 mm“, -- **in km** zeigt sie in Kilometern, aus 1500 wird „1.5 km“. - -Das Ergebnis steht in einem JLabel unter den Knöpfen. Steht im Feld keine Zahl, erscheint dort „Bitte eine Zahl eingeben“, und das Programm stürzt nicht ab. - -So kannst du anfangen: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Einheiten { - public static void main(String[] args) { - JFrame fenster = new JFrame("Einheitenrechner"); - fenster.setSize(300, 200); - fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenster.setLayout(new GridLayout(0, 1)); - - JTextField meter = new JTextField(); - JButton inCm = new JButton("in cm"); - JLabel ergebnis = new JLabel("?", SwingConstants.CENTER); - - inCm.addActionListener(e -> { - double m = Double.parseDouble(meter.getText()); - ergebnis.setText((m * 100) + " cm"); - }); - - fenster.add(meter); - fenster.add(inCm); - fenster.add(ergebnis); - fenster.setVisible(true); - } -} -\`\`\` - -**Du bist fertig, wenn …** - -- 1.5 nach **in cm** „150.0 cm“ zeigt, nach **in mm** „1500.0 mm“, -- 1500 nach **in km** „1.5 km“ zeigt, -- „abc“ im Feld „Bitte eine Zahl eingeben“ zeigt und das Fenster offen bleibt. - -Zusatz: Ein vierter Knopf **in Fuß** rechnet in die englische Einheit um. Ein Fuß sind 0.3048 m. - -::: ludwig -Tick im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** an. Für „abc“ im Feld brauchst du in jedem Zuhörer ein try/catch mit \`NumberFormatException\`, wie beim Taschenrechner. -::: -`,p9=`--- -titel: Fibonacci-Zahlen -nach: 13 -stufe: 2 ---- - -Bei den Fibonacci-Zahlen ist jede Zahl die Summe der beiden Zahlen davor. Die Folge beginnt mit 1 und 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -Diese Zahlen findest du erstaunlich oft in der Natur, zum Beispiel bei der Anordnung von Sonnenblumenkernen. - -::: ludwig -Erinnerst du dich ans **Tauschen** aus Lektion 5? Dort brauchtest du eine Hilfsvariable, weil \`a = b\` den alten Wert von \`a\` überschreibt. Hier ist es genauso: Bevor \`zahl2\` die neue Zahl bekommt, muss ihr alter Wert in \`zahl1\` gerettet sein. Achte also auf die **Reihenfolge**: erst \`zahl1 = zahl2\`, dann \`zahl2 = zahl3\`. Dieses Weiterschieben und Tauschen brauchst du später wieder, zum Beispiel beim Sortieren in Lektion 19. -::: - -::: angeberwissen -Leonardo von Pisa, genannt Fibonacci, stellte 1202 in seinem Rechenbuch eine Aufgabe über Kaninchen: Jedes Kaninchenpaar bekommt ab dem zweiten Monat jeden Monat ein neues Paar. Wie viele Paare gibt es nach einem Jahr? Die Antwort ist diese Zahlenfolge. Ziegen kamen in dem Buch leider nicht vor. -::: - -::: übung aufgabe-fibonacci -titel: Fibonacci-Zahlen -auftrag: Frage, wie viele Fibonacci-Zahlen ausgegeben werden sollen. Gib dann genau so viele aus, jede in einer eigenen Zeile. Du kannst davon ausgehen, dass mindestens 2 eingegeben wird. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Jede neue Zahl ist die Summe der beiden vorherigen. Du musst dir also immer die letzten zwei Zahlen merken. -tipp: Merke dir die beiden letzten Zahlen in \`zahl1\` und \`zahl2\` und gib beide vor der Schleife aus. Die Schleife beginnt bei \`int i = 2\`. Darin berechnest du \`int zahl3 = zahl1 + zahl2\`, gibst sie aus und schiebst dann weiter: \`zahl1 = zahl2\` und \`zahl2 = zahl3\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-fibonacci-java -titel: Fibonacci-Zahlen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Die ersten beiden Zahlen gibst du vor der Schleife aus. Die \`for\`-Schleife beginnt dann bei \`int i = 2\`. -tipp: Im Rumpf: \`int zahl3 = zahl1 + zahl2;\`, ausgeben, dann \`zahl1 = zahl2;\` und \`zahl2 = zahl3;\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Warum muss in der Schleife \`zahl1 = zahl2\` vor \`zahl2 = zahl3\` stehen? -- [ ] Weil Java die Zuweisungen sonst nicht erlaubt -- [x] Weil sonst der alte Wert von zahl2 überschrieben ist, bevor zahl1 ihn bekommt -- [ ] Die Reihenfolge ist egal -> Andersherum hätten zahl1 und zahl2 danach denselben Wert. Wie beim Tauschen gilt: Erst retten, dann überschreiben. -::: -`,f9=`--- -titel: Gerade oder ungerade -nach: 8 -stufe: 1 ---- - -Eine Zahl ist gerade, wenn beim Teilen durch 2 kein Rest bleibt. Den Rest berechnest du mit \`%\`: \`8 % 2\` ist 0, \`7 % 2\` ist 1. - -::: übung aufgabe-gerade -titel: Gerade oder ungerade -auftrag: Frage nach einer ganzen Zahl. Gib aus, ob sie gerade oder ungerade ist. Bei 4 lautet die Ausgabe **4 ist gerade**, bei 7 **7 ist ungerade**. -test: 4 -> 4 ist gerade -test: 7 -> 7 ist ungerade -test: 0 -> 0 ist gerade -test: 15 -> 15 ist ungerade -braucht: verzweigung -tipp: Eine Verzweigung entscheidet zwischen gerade und ungerade. Gerade heißt: durch 2 teilbar ohne Rest. -tipp: Die Bedingung lautet \`zahl % 2 == 0\`. In der Ausgabe verbindest du die Zahl und den Text mit \`+\`, z. B. \`zahl + " ist gerade"\`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-gerade-java -titel: Gerade oder ungerade in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 4 -> 4 ist gerade -test: 7 -> 7 ist ungerade -test: 0 -> 0 ist gerade -test: 15 -> 15 ist ungerade -braucht: verzweigung -tipp: Eine Zahl liest du mit \`int zahl = scanner.nextInt();\` ein. Vorher fragst du mit \`System.out.println(…)\`. -tipp: \`if (zahl % 2 == 0) { … } else { … }\`. Die Ausgabe ist \`System.out.println(zahl + " ist gerade");\`. -lösung: aufgabe-gerade-loesung.visustruct -::: -`,b9=`--- -titel: Mehrwertsteuer -nach: 6 -stufe: 1 ---- - -Auf fast alles, was du kaufst, kommen 19 % **Mehrwertsteuer**. Der Laden rechnet mit dem Nettopreis (ohne Steuer) und schlägt die Steuer drauf. So entsteht der Bruttopreis, den du an der Kasse zahlst. - -Ein Beispiel: Du kaufst ein Falt-Handy, das aufgeklappt zum Tablet wird. Auf dem Preisschild des Händlers stehen 1000 € netto. Dazu kommen 19 %, also 190 €. An der Kasse zahlst du 1190 €. Die 190 € darf der Händler nicht behalten: Er führt sie an das Finanzamt ab. - -::: grafik aufgabe-mehrwertsteuer.svg -Nettopreis plus Mehrwertsteuer ergibt den Bruttopreis. Die Mehrwertsteuer geht an das Finanzamt. -::: - -::: angeberwissen -Mäh, der Händler hat das Handy ja selbst eingekauft: beim Hersteller für 800 € plus 152 € Mehrwertsteuer. Diese 152 € heißen **Vorsteuer**, und die darf er von den 190 € abziehen. Ans Finanzamt überweist er also nur 38 €. Die ganze Steuer zahlt am Ende nur einer: der Kunde an der Kasse. Also du. Ich zahle übrigens gar keine, ich fresse nur Gras. -::: - -Der Steuersatz ändert sich beim Rechnen nie. Darum legst du ihn als **Konstante** an: Das ist eine Variable, deren Wert nach dem Festlegen gleich bleibt. Du schreibst \`const\` davor, zum Beispiel \`const double MWST = 0.19\`. Namen von Konstanten schreibt man in Großbuchstaben, dann erkennt man sie sofort. Im Java-Code wird daraus \`final double MWST = 0.19;\`. - -Wenn sich der Steuersatz einmal ändert, musst du nur diese eine Zeile anpassen. - -::: übung aufgabe-mehrwertsteuer -titel: Mehrwertsteuer -auftrag: Lege die Konstante \`MWST\` mit dem Wert 0.19 an. Frage dann nach dem Nettopreis. Gib zuerst die Steuer und danach den Bruttopreis aus, jeweils nur die Zahl. - Bei einem Nettopreis von 100 lauten die Ausgaben **19** und **119**. -test: 100 -> 19 | 119 -test: 50 -> 9.5 | 59.5 -test: 0 -> 0 | 0 -tipp: Die Steuer ist 19 Prozent vom Nettopreis. Der Bruttopreis ist das, was man am Ende bezahlt. -tipp: Die Steuer ist \`nettopreis * MWST\`. Den Bruttopreis bekommst du, wenn du die Steuer zum Nettopreis addierst. Beide Werte sind Kommazahlen, also \`double\`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Warum legst du den Steuersatz als Konstante an? -- [ ] Weil Konstanten schneller gerechnet werden -- [x] Weil sich sein Wert im Programm nicht ändern soll -- [ ] Weil man Kommazahlen nur als Konstante speichern kann -> Eine Konstante behält ihren Wert. Ändert sich der Steuersatz einmal, passt du nur die eine Zeile mit \`const\` an. -::: -`,x9=`--- -titel: Notendurchschnitt -nach: 13 -stufe: 2 ---- - -Wie gut war die letzte Zeit? Der Durchschnitt ist die Summe aller Noten geteilt durch ihre Anzahl. - -::: übung aufgabe-durchschnitt -titel: Notendurchschnitt -auftrag: Frage zuerst, wie viele Noten eingegeben werden. Lies dann genau so viele Noten ein und gib den Durchschnitt aus, nur die Zahl. - Bei den Noten 1 und 2 ist der Durchschnitt **1.5**. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: Du brauchst die Summe aller Noten und ihre Anzahl. Der Durchschnitt ist die Summe geteilt durch die Anzahl. -tipp: Die For-Schleife läuft von \`int i = 0\` bis \`i < anzahl\`. Darin liest du eine Note ein und zählst sie zur Summe. Den Durchschnitt speicherst du als Kommazahl: \`double schnitt = summe * 1.0 / anzahl\`. Das \`* 1.0\` sorgt dafür, dass auch in Java nicht ganzzahlig geteilt wird. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-durchschnitt-java -titel: Notendurchschnitt in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: \`for (int i = 0; i < anzahl; i++)\` liest genau so viele Noten ein, wie vorher angegeben. -tipp: Teile mit \`double schnitt = summe * 1.0 / anzahl;\`. Ohne \`* 1.0\` teilt Java zwei \`int\` ganzzahlig, und aus 1.5 wird 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: -`,v9=`--- -titel: PIN prüfen -nach: 12 -stufe: 2 ---- - -Am Geldautomaten hast du drei Versuche für deine PIN. Gibst du dreimal eine falsche PIN ein, wird die Karte gesperrt. - -::: angeberwissen -John Shepherd-Barron, der 1967 den ersten Geldautomaten in London aufstellte, wollte eigentlich sechsstellige PINs. Seine Frau sagte aber, sie könne sich höchstens vier Ziffern merken. Deshalb hat deine PIN heute vier Stellen. -::: - -::: übung aufgabe-pin -titel: PIN prüfen -auftrag: Die richtige PIN ist 1234. Frage so lange nach der PIN, bis sie richtig ist oder drei Versuche verbraucht sind. Gib danach **PIN richtig** oder **Karte gesperrt** aus. -test: 1234 -> PIN richtig -test: 1111, 1234 -> PIN richtig -test: 1, 2, 1234 -> PIN richtig -test: 1, 2, 3 -> Karte gesperrt -braucht: doUntilSchleife, verzweigung -tipp: Die Schleife endet in zwei Fällen: wenn die PIN stimmt oder wenn drei Versuche verbraucht sind. Zähle die Versuche mit. -tipp: Die PIN wird mindestens einmal abgefragt, deshalb passt eine Do-while-Schleife. Lege vorher \`int pin = 0\` und \`int versuche = 0\` an. Die Schleife wiederholt sich, solange \`pin != 1234 && versuche < 3\` gilt. Nach der Schleife entscheidet eine Verzweigung, was ausgegeben wird. -lösung: aufgabe-pin-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-pin-java -titel: PIN prüfen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 1234 -> PIN richtig -test: 1111, 1234 -> PIN richtig -test: 1, 2, 1234 -> PIN richtig -test: 1, 2, 3 -> Karte gesperrt -braucht: doUntilSchleife, verzweigung -tipp: \`do { … } while (…);\` fragt mindestens einmal. Hinter \`while (…)\` steht ein Semikolon. -tipp: Lege vorher \`int pin = 0;\` und \`int versuche = 0;\` an. In der Schleife: \`int eingabe = scanner.nextInt();\`, \`pin = eingabe;\` und \`versuche++;\`. Die Bedingung ist \`pin != 1234 && versuche < 3\`. -lösung: aufgabe-pin-java-loesung.visustruct -::: -`,w9=`--- -titel: Schiffe versenken -nach: 16 -stufe: 2 ---- - -Beim Spiel Schiffe versenken ist das Meer ein Gitter. Die Spalten heißen A bis E, die Reihen 1 bis 5. Im Startdiagramm steht das Meer als 2D-Array \`meer\`: \`true\` heißt, auf diesem Feld liegt ein Teil eines Schiffs. - -::: grafik schiffe-versenken.svg -Grau heißt \`true\`: Hier liegt ein Schiff. Die kleinen grauen Zahlen sind die Indizes im Array, sie beginnen bei 0. Im Spiel heißen die Felder dagegen A bis E und 1 bis 5. -::: - -::: übung aufgabe-schiffe -titel: Schiffe versenken -auftrag: Gib alle Felder aus, auf denen ein Schiff liegt, jedes Feld in einer eigenen Zeile, z. B. **B1**. Gehe dafür mit zwei verschachtelten Schleifen Reihe für Reihe durch das Meer. - Für das Startdiagramm erscheinen **B1**, **C1**, **D1**, **E3**, **E4** und **A5**. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Gehe das Meer wie den Kinosaal mit zwei verschachtelten Schleifen durch. Gib nur die Felder aus, auf denen \`true\` steht. -tipp: Die äußere Schleife zählt \`reihe\`, die innere \`spalte\`, beide ab 0. Liegt auf \`meer[reihe][spalte]\` ein Schiff, gibst du den Buchstaben aus \`spalten[spalte]\` und die Reihennummer aus: \`output: spalten[spalte] + (reihe + 1)\`. Das \`+ 1\` braucht es, weil das Spiel bei 1 zu zählen beginnt. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-schiffe-java -titel: Schiffe versenken in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Zwei \`for\`-Schleifen ineinander: außen die Reihe, innen die Spalte, beide bis \`.length\`. -tipp: \`if (meer[reihe][spalte]) { System.out.println(spalten[spalte] + (reihe + 1)); }\`. Die Klammer um \`reihe + 1\` sorgt dafür, dass Java erst rechnet. -lösung: aufgabe-schiffe-loesung.visustruct -::: -`,y9=`--- -titel: Speisekarte -nach: 10 -stufe: 1 ---- - -In der Mensa bestellst du über eine Nummer. Das Programm sagt dir, welches Gericht zu der Nummer gehört. - -::: übung aufgabe-speisekarte -titel: Speisekarte -auftrag: Frage nach einer Nummer. Gib bei 1 **Griechischer Salat**, bei 2 **Reis-Bowl** und bei 3 **Falafel-Wrap** aus. Bei jeder anderen Nummer gib **Bitte eine gültige Nummer wählen** aus. -test: 1 -> Griechischer Salat -test: 2 -> Reis-Bowl -test: 3 -> Falafel-Wrap -test: 7 -> Bitte eine gültige Nummer wählen -braucht: fallauswahl -tipp: Für mehrere feste Nummern passt eine Fallauswahl. Was passiert mit allen anderen Nummern? -tipp: Lies die Nummer mit \`input: int nummer "Welches Gericht?"\` ein. Die Fallauswahl prüft \`nummer\`, die Fälle heißen \`1\`, \`2\` und \`3\`. Alle anderen Nummern landen im Fall \`default\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-speisekarte-java -titel: Speisekarte in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 1 -> Griechischer Salat -test: 2 -> Reis-Bowl -test: 3 -> Falafel-Wrap -test: 7 -> Bitte eine gültige Nummer wählen -braucht: fallauswahl -tipp: In Java ist das eine Fallauswahl mit \`switch (nummer) { … }\`. -tipp: Jeder Fall sieht so aus: \`case 1 -> { System.out.println("…"); }\`. Für alle anderen Nummern gibt es \`default -> { … }\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: -`,z9=`--- -titel: Summe bilden -nach: 2 -stufe: 1 ---- - -Lege zwei Zahlen fest, addiere sie und gib das Ergebnis aus. - -::: übung aufgabe-summe -titel: Summe bilden -auftrag: Lege \`zahl1\` mit dem Wert 4 und \`zahl2\` mit dem Wert 3 fest. Berechne die Summe in einer dritten Variablen und gib nur die Summe aus. -test: - -> 7 -tipp: Du brauchst drei Variablen: zwei für die Zahlen und eine für das Ergebnis. -tipp: Eine Variable legst du mit einer Anweisung wie \`int zahl1 = 4\` fest. Für die Ausgabe schreibst du den Namen der Variablen ohne Anführungszeichen. -lösung: aufgabe-summe-loesung.visustruct -::: -`,I9=`--- -titel: Tafeldienst auslosen -nach: 15 -stufe: 2 ---- - -Wer hat diese Woche Tafeldienst? Fünf Namen kommen in ein Array, dann wird eine Losnummer gezogen. - -::: übung aufgabe-tafeldienst -titel: Tafeldienst auslosen -auftrag: Lies fünf Namen in ein String-Array ein. Frage danach nach einer Losnummer von 1 bis 5 und gib **Tafeldienst:** und den passenden Namen aus. - Die Losnummer 1 gehört zum ersten Namen, die 5 zum letzten. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Tafeldienst: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Tafeldienst: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Tafeldienst: Pia -braucht: forSchleife -tipp: Erst liest eine Schleife die fünf Namen ein. Danach brauchst du keine Schleife mehr, nur noch einen Zugriff auf ein Fach. -tipp: Mit \`String[] namen = new String[5]\` legst du das Array an. Achtung: Die Losnummer beginnt bei 1, der Index bei 0. Der Name steht also in \`namen[nummer - 1]\`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-tafeldienst-java -titel: Tafeldienst auslosen in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Tafeldienst: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Tafeldienst: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Tafeldienst: Pia -braucht: forSchleife -tipp: Ein Array für fünf Namen legst du mit \`String[] namen = new String[5];\` an. -tipp: In der Schleife: \`namen[i] = scanner.next();\`. Die Losnummer 1 gehört zum Fach 0, darum gibst du \`namen[nummer - 1]\` aus. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> Mit \`int nummer = (int) (Math.random() * 5) + 1\` kannst du die Losnummer auch vom Zufall ziehen lassen. Für die automatische Prüfung brauchen wir aber eine feste Eingabe. -`,k9=`--- -titel: Taschenrechner -nach: 10 -stufe: 2 ---- - -Ein kleiner Taschenrechner: zwei Zahlen und ein Rechenzeichen eingeben, das Ergebnis erscheint. - -::: übung aufgabe-rechner -titel: Taschenrechner -auftrag: Frage nach zwei ganzen Zahlen und danach nach einem Rechenzeichen als Text: \`+\`, \`-\` oder \`*\`. Gib das Ergebnis aus. Bei einem anderen Zeichen gib **Unbekanntes Rechenzeichen** aus. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Lies alle drei Werte ein. Eine Fallauswahl über das Rechenzeichen entscheidet dann, was gerechnet wird. -tipp: Das Rechenzeichen liest du mit \`input: String zeichen "Rechenzeichen"\` ein. Die Fallauswahl prüft \`zeichen\`, die Fälle heißen \`"+"\`, \`"-"\` und \`"*"\`, der letzte Fall ist \`default\`. Rechne in jedem Fall erst in einer Variablen und gib sie dann aus, sonst hängt \`+\` die Zahlen nur aneinander. -lösung: aufgabe-rechner-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-rechner-java -titel: Taschenrechner in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unbekanntes Rechenzeichen -braucht: fallauswahl -tipp: Das Rechenzeichen ist ein Text. Du liest es mit \`String zeichen = scanner.next();\` ein. -tipp: \`switch (zeichen) { case "+" -> { … } … default -> { … } }\`. Bei Texten stehen die Fälle in Anführungszeichen. -lösung: aufgabe-rechner-loesung.visustruct -::: -`,S9=`--- -titel: Verleih-Menü -nach: 18 -stufe: 2 ---- - -Am Verleih-Automaten kannst du nacheinander mehrere Fahrzeuge buchen. Das Menü erscheint immer wieder, bis du **0** für Ende wählst. - -::: übung aufgabe-verleih -titel: Verleih-Menü -auftrag: Frage immer wieder nach einer Auswahl: 1 = E-Bike, 2 = E-Scooter, 0 = Ende. Gib bei 1 **E-Bike gebucht** und bei 2 **E-Scooter gebucht** aus, bei jeder anderen Zahl **Ungültige Auswahl**. - Bei 0 gibt das Programm **Tschüss** aus und verlässt die Schleife mit einem Aussprung. -test: 0 -> Tschüss -test: 1, 2, 0 -> E-Bike gebucht | E-Scooter gebucht | Tschüss -test: 2, 5, 1, 0 -> E-Scooter gebucht | Ungültige Auswahl | E-Bike gebucht | Tschüss -braucht: endlosschleife, aussprung -tipp: Das Menü läuft immer wieder, bis jemand 0 wählt. Dafür eignet sich eine Endlosschleife mit einem Aussprung. -tipp: Nimm eine Endlosschleife. Darin steht zuerst die Eingabe \`input: int wahl "1 = E-Bike, 2 = E-Scooter, 0 = Ende"\`, danach eine Fallauswahl über \`wahl\` mit den Fällen \`0\`, \`1\`, \`2\` und \`default\`. Im Fall \`0\` stehen die Ausgabe und darunter der Aussprung. -lösung: aufgabe-verleih-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-verleih-java -titel: Verleih-Menü in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 0 -> Tschüss -test: 1, 2, 0 -> E-Bike gebucht | E-Scooter gebucht | Tschüss -test: 2, 5, 1, 0 -> E-Scooter gebucht | Ungültige Auswahl | E-Bike gebucht | Tschüss -braucht: endlosschleife, aussprung -tipp: \`while (true) { … }\` läuft endlos, bis ein \`break;\` kommt. -tipp: Nimm in Java hier \`if\`/\`else if\` statt \`switch\`: Ein \`break;\` in einem \`switch\` verlässt nur den \`switch\`, nicht die Schleife. \`if (wahl == 0) { System.out.println("Tschüss"); break; } else if (wahl == 1) { … }\`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: -`,T9=`--- -titel: Vokabeltrainer -nach: 27 -stufe: 3 ---- - -Ludwig lernt Englisch. Seine Vokabeln stehen in einer CSV-Datei, links Deutsch, rechts Englisch: - -::: datei vokabeln.csv -Deutsch;Englisch -Ziege;goat -Heu;hay -Wiese;meadow -::: - -Weil nur die Datei die Wörter kennt, kannst du später einfach neue Zeilen anhängen, ohne das Programm zu ändern. - -::: angeberwissen -Die Lernkartei mit mehreren Fächern hat Sebastian Leitner 1972 bekannt gemacht: Gewusste Karten wandern ein Fach weiter und kommen seltener dran, falsche wandern zurück ins erste Fach. Viele Vokabel-Apps arbeiten bis heute nach diesem Prinzip. -::: - -::: übung aufgabe-vokabeln -titel: Vokabeltrainer -code: java -auftrag: Frage jede Vokabel aus der Datei ab: Gib **Was heißt Ziege?** aus und lies die Antwort mit \`scanner.next()\` ein. Ist sie richtig, gib **Richtig!** aus, sonst zum Beispiel **Falsch, richtig ist goat.** - Am Ende steht da, wie viele richtig waren, zum Beispiel **2 von 3 richtig**. -start: aufgabe-vokabeln-start.visustruct -test: goat, hay, meadow -> Was heißt Ziege? | Richtig! | Was heißt Heu? | Richtig! | Was heißt Wiese? | Richtig! | 3 von 3 richtig -test: cow, hay, meadow -> Was heißt Ziege? | Falsch, richtig ist goat. | Was heißt Heu? | Richtig! | Was heißt Wiese? | Richtig! | 2 von 3 richtig -test: goat, heu, wiese -> Was heißt Ziege? | Richtig! | Was heißt Heu? | Falsch, richtig ist hay. | Was heißt Wiese? | Falsch, richtig ist meadow. | 1 von 3 richtig -braucht: whileSchleife, verzweigung -tipp: Überspringe die Kopfzeile. In der Schleife zerlegst du jede Zeile mit \`split(";")\`: \`teile[0]\` ist das deutsche Wort, \`teile[1]\` das englische. -tipp: Texte vergleichst du mit \`antwort.equals(teile[1])\`, nicht mit \`==\`. Zähle vor der Schleife mit \`int richtig = 0;\` und \`int anzahl = 0;\` mit. -lösung: aufgabe-vokabeln-loesung.visustruct -::: -`,_9=`--- -titel: Volljährig? -nach: 8 -stufe: 1 ---- - -Im Kino, beim Führerschein oder bei der Wahl: Oft kommt es darauf an, ob jemand schon 18 ist. - -::: übung aufgabe-volljaehrig -titel: Volljährig? -auftrag: Frage nach dem Alter. Ist die Person 18 oder älter, gib **volljährig** aus, sonst **minderjährig**. -test: 18 -> volljährig -test: 35 -> volljährig -test: 17 -> minderjährig -test: 6 -> minderjährig -braucht: verzweigung -tipp: Es gibt zwei mögliche Ausgaben, also brauchst du eine Verzweigung. -tipp: Lies das Alter mit \`input: int alter "Wie alt bist du?"\` ein. Die Bedingung der Verzweigung lautet \`alter >= 18\`. Achte darauf, dass 18 schon volljährig ist. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -Und jetzt dasselbe in Java: - -::: übung aufgabe-volljaehrig-java -titel: Volljährig? in Java -code: java -auftrag: Löse die Aufgabe von oben jetzt in Java. Die Ausgaben bleiben genau dieselben. -test: 18 -> volljährig -test: 35 -> volljährig -test: 17 -> minderjährig -test: 6 -> minderjährig -braucht: verzweigung -tipp: Lies das Alter mit \`int alter = scanner.nextInt();\` ein. -tipp: \`if (alter >= 18) { … } else { … }\`, in jedem Zweig ein \`System.out.println(…)\`. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: -`,A9=`--- -titel: Würfeln mit MVC -nach: 40 -stufe: 3 ---- - -Baue ein Würfelspiel nach Model View Controller. Ein Knopf **Würfeln** würfelt, und zwei Views zeigen das Ergebnis. - -Das Model ist schon fertig. Es würfelt und zählt mit, wie oft gewürfelt wurde und wie viele Sechsen dabei waren: - -\`\`\`java -class Wuerfel { - int augen = 1; - int wuerfe = 0; - int sechsen = 0; - - void wuerfeln() { - augen = (int) (Math.random() * 6) + 1; - wuerfe++; - if (augen == 6) { - sechsen++; - } - } -} -\`\`\` - -Deine Aufgabe: - -1. Teste das Model zuerst ohne Fenster: Würfle in \`main\` zehnmal und gib danach \`wuerfe\` und \`sechsen\` aus. -2. Schreibe die View \`AugenAnzeige\`. Sie zeigt in einem großen JLabel die gewürfelte Zahl, zum Beispiel „4“. -3. Schreibe die View \`StatistikAnzeige\`. Sie zeigt zum Beispiel „Sechsen: 2 von 10 Würfen“. -4. Der Controller ist der Zuhörer am Knopf: Er lässt das Model würfeln und gibt beiden Views die neuen Werte. - -**Du bist fertig, wenn …** - -- in der Konsole nach zehn Würfen \`wuerfe\` gleich 10 ist und \`sechsen\` zwischen 0 und 10 liegt, -- jeder Klick auf **Würfeln** eine neue Zahl von 1 bis 6 in der \`AugenAnzeige\` zeigt, -- die \`StatistikAnzeige\` nach jedem Klick einen Wurf mehr zählt und Sechsen richtig mitzählt, -- im Model kein \`JLabel\` und in den Views kein \`Math.random\` steht. - -Zusatz: Ein Knopf **Neues Spiel** setzt alles auf Anfang. Die Methode dafür gehört ins Model. - -::: ludwig -Denk an die Regel aus Lektion 40: Im Model steht kein einziges \`JLabel\`. Wenn du beim Würfeln die Schriftgröße änderst, gehört das in die View. -::: -`,j9=`--- -titel: Zahl verdoppeln -nach: 2 -stufe: 1 ---- - -Eine Variable kann ihren Wert ändern. Hier wird eine Zahl verdoppelt. - -::: übung aufgabe-verdoppeln -titel: Zahl verdoppeln -auftrag: Lege die Variable \`zahl\` mit dem Wert 4 fest. Verdopple sie in einer zweiten Anweisung, ohne eine neue Variable anzulegen. Gib danach **Verdoppelte Zahl: 8** aus, wobei die 8 aus der Variablen kommt. -test: - -> Verdoppelte Zahl: 8 -tipp: Verdoppeln heißt: mal 2. Das Ergebnis speicherst du wieder in derselben Variablen. -tipp: \`zahl = zahl * 2\` rechnet mit dem alten Wert und speichert das Ergebnis wieder in \`zahl\`. Text und Variable verbindest du mit \`+\`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: -`,C9=`--- -titel: Age in a subprogram -nach: 18 -stufe: 2 ---- - -The age check from “Adult?” now becomes a subprogram of its own. The main program only calls it. - -::: übung aufgabe-alter-unterprogramm -titel: Age in a subprogram -auftrag: Build two diagrams. The main program outputs **Welcome**, then calls \`checkAge()\` and finally outputs **Goodbye**. - The subprogram \`checkAge\` is in a tab of its own: it asks for the age and outputs **adult** or **minor**. -test: 20 -> Welcome | adult | Goodbye -test: 18 -> Welcome | adult | Goodbye -test: 12 -> Welcome | minor | Goodbye -braucht: aufruf -tipp: The main program has three boxes. The subprogram does the real work. -tipp: Open the exercise in the editor and build the main program there with the call \`checkAge()\`. Then open a new tab with **+** and give it the title \`checkAge\`. Build the input and the branch in it. Check finds the subprogram by the title of the tab. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: -`,D9=`--- -titel: Ball throw results -nach: 25 -stufe: 2 ---- - -At sports day everyone wrote their ball throw distance into a table: - -::: datei throw.csv -Name;Distance -Ludwig;28 -Zora;42 -Fox;35 -Hare;21 -::: - -::: übung aufgabe-ballwurf -titel: Ball throw results -code: java -auftrag: Read the file and skip the header line. Output how many took part (**Participants: 4**) and how far they threw on average (**Average: 31.5 m**). - Save the longest throw in the file **winner.txt**, for example **Winner: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Participants: 4 | Average: 31.5 m -datei: winner.txt -> Winner: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: You need four variables before the loop: the count, the sum as a \`double\`, the best distance and the best name. -tipp: In the loop: \`String[] parts = line.split(";");\` and \`int distance = Integer.parseInt(parts[1]);\`. If \`distance > bestDistance\`, remember the distance and the name. To save: \`PrintWriter out = new PrintWriter("winner.txt");\`, \`out.println(…)\` and \`out.close();\`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: -`,B9=`--- -titel: Leaderboard -nach: 19 -stufe: 2 ---- - -Five goats have run the obstacle race. Now the leaderboard goes on the stable door: most points at the top, fewest at the bottom. - -::: übung aufgabe-bestenliste -titel: Leaderboard -auftrag: Read 5 scores into an array. Sort the array with bubble sort in **descending** order, so the biggest number comes first. Then output the list with places, for example **1. 9**, on the next line **2. 9** and so on. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Bubble sort from lesson 19 sorts in ascending order. For descending order you only turn round the comparison of the neighbours. -tipp: Swap when \`points[i] < points[i + 1]\`, using a temporary variable. For the output, first work out \`int place = i + 1\` and then output \`place + ". " + points[i]\`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-bestenliste-java -titel: Leaderboard in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Read each number into a variable first and then put it into the array: \`int number = scanner.nextInt();\` and \`points[i] = number;\`. -tipp: The swap needs a temporary variable in Java too: \`int temp = points[i]; points[i] = points[i + 1]; points[i + 1] = temp;\`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: -`,P9=`--- -titel: Binary number -nach: 11 -stufe: 3 ---- - -Computers calculate with only two digits: 0 and 1. This is how you convert a number into the **binary system**: - -1. Divide the number by 2 and remember the remainder (0 or 1). -2. Carry on with the result without the remainder. -3. Repeat this until the number is 0. - -The remainders read **from bottom to top** give the binary number. For 6 the remainders are 0, 1, 1, so the binary number is 110. - -::: übung aufgabe-binaer -titel: Binary number -auftrag: Ask for a whole number greater than 0 and output it as a binary number. For 6 the output is **110**, for 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Keep dividing the number by 2 and remember every remainder. The remainders read backwards give the binary number. -tipp: Collect the digits in a text: \`String binary = ""\`. In the loop you calculate \`int remainder = number % 2\` and add the remainder at the **front**: \`binary = remainder + binary\`. After that, \`number = number / 2\`. Because number is a whole number, the remainder is dropped. -lösung: aufgabe-binaer-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-binaer-java -titel: Binary number in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Start with \`String binary = "";\`. The loop runs with \`while (number > 0)\`. -tipp: In the body: \`int remainder = number % 2;\`, then \`binary = remainder + binary;\` and \`number = number / 2;\`. Because \`binary\` is a String, \`+\` puts the remainder at the front. -lösung: aufgabe-binaer-loesung.visustruct -::: -`,O9=`--- -titel: Caesar cipher -nach: 17 -stufe: 3 ---- - -More than 2000 years ago, the Roman general Julius Caesar sent secret messages to his troops. His trick was simple: he replaced every letter with the letter **three places further on** in the alphabet. A becomes D, B becomes E and so on. The readable message is called the **plain text**, the encrypted one the **secret text**. The number of places you shift by is the **key**, often just called \`k\`. - -::: grafik caesar-verschiebung.svg -Encryption with the key 3: each letter at the top becomes the letter below it. At the end you start again from the beginning, so X, Y and Z become A, B and C. -::: - -This turns \`HALLO\` into \`KDOOR\`. Anyone who knows the key simply shifts three places back and can read the message again. - -### The cipher wheel - -To avoid counting every time, people built a **cipher wheel**: two discs with the alphabet, a small one on top of a large one, fixed in the middle so it can turn. The outer ring shows the plain text, the inner ring the secret text. Turn the inner disc by three letters, and below every outer letter you find its secret letter. Wheels like this have existed since the 15th century. In the American Civil War (1861–1865), soldiers carried small brass wheels. - -::: grafik caesar-scheibe.svg -A cipher wheel modelled on historical brass wheels. The blue window shows: with the key 3, D is below A. -::: - -::: angeberwissen -Caesar himself didn’t even have a wheel! We know this from the Roman historian Suetonius: in his letters, Caesar shifted every letter by three places and simply counted it out in his head. The wheel was only invented by Leon Battista Alberti around 1467, about 1500 years later. By the way, I count in my head too. I don’t have fingers, only hooves. -::: - -Try it yourself. Turn the inner wheel, type a text and watch the secret text appear. **Decrypt** goes the other way. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -You can easily make a real wheel yourself: two circles of cardboard, one a bit smaller, each with 26 equal fields for the alphabet, and a paper fastener in the middle. Your secret agent tool is ready! -::: - -::: quiz -? What does the letter Y become with the key 3? -- [ ] A -- [x] B -- [ ] C -> After Y comes Z, then you start again with A and B. Three places further on is therefore B. - -? A secret text was encrypted with the key 5. How do you decrypt it? -- [ ] Shift it 5 places further on again -- [x] Shift it 5 places back -- [ ] Read the letters backwards -> Decrypting is the opposite of encrypting. By the way, 5 places back is the same as 21 places forward, because 5 + 21 = 26. -::: - -### The program: there is more than one way - -How do you teach the computer to shift a letter by \`k\` places? There is no *single* right solution. We look at two ways. Both go through the text character by character with a for loop, just like in the lesson on strings. The difference is how they shift a single letter. - -In both ways the remainder operator \`%\` helps. It makes sure that after Z you continue with A: positions 0 to 25 stay as they are, 26 becomes 0, 27 becomes 1 and so on. - -### Way 1: the alphabet in an array - -You put the alphabet into an array \`char[] alphabet = {'A', 'B', …, 'Z'}\`. For every letter of the word you search the array for its position \`pos\`, that is its index. The secret letter is then in the same array at position \`(pos + k) % 26\`. - -An example with the key 3: X is at position 23. Then \`(23 + 3) % 26 = 0\`, and position 0 holds A. - -::: übung aufgabe-caesar-array -titel: Caesar with an array -auftrag: The start diagram already contains the array \`alphabet\`. Ask for a word in capital letters and for the key \`k\`. Then output the encrypted word. For HALLO and 3 that is \`KDOOR\`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Create an empty text \`String secret = ""\`. Go through the word character by character with a for loop. In every pass you append one secret letter to \`secret\`. -tipp: To find the position of a letter you need a second, inner loop over the array: if \`alphabet[j] == letter\`, remember \`pos = j\`. -tipp: After the inner loop, append \`alphabet[(pos + k) % 26]\`: \`secret = secret + alphabet[(pos + k) % 26]\`. After the outer loop, output \`secret\`. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Way 2: calculating with the ASCII table - -For the computer, every character is really a number. Which number belongs to which character is listed in the **ASCII table**. There A has the code 65, B the code 66 and so on up to Z with 90. In Java you turn a character into its code with \`(int)\` and a code back into a character with \`(char)\`: - -\`\`\` -int code = (int) 'A' -char letter = (char) 68 -\`\`\` - -After that, \`code\` is 65 and \`letter\` is \`'D'\`. Changing a value from one data type into another like this is called a **type cast**. - -Now you can calculate with the letter. So that the jump from Z back to A works, first subtract 65. Then A has position 0 and Z position 25, exactly as in way 1. Shift with \`% 26\` and add the 65 back at the end: - -::: grafik caesar-ascii.svg -At the top the capital letters with their ASCII codes. Below, the calculation for X with the key 3: the result is A. -::: - -::: übung aufgabe-caesar-ascii -titel: Caesar with ASCII -code: java -auftrag: Write a Java program that reads a word in capital letters and the key \`k\` and outputs the encrypted word. This time without an array: calculate with \`(int)\` and \`(char)\`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Go through the word with a for loop. You get the code of the character at position \`i\` with \`int code = (int) word.charAt(i);\`. -tipp: Calculate \`code = (code - 65 + k) % 26 + 65;\` and append the character: \`secret = secret + (char) code;\`. Before the loop write \`String secret = "";\`, after the loop \`System.out.println(secret);\`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Which way is better? - -**Way 1: array.** The idea is to search for the position in the array. -- Advantage: easy to understand, and your own alphabets work too, e.g. with Ä, Ö and Ü. -- Disadvantage: every letter has to be searched for. - -**Way 2: ASCII.** The idea is to calculate with the character code. -- Advantage: short and without searching, therefore faster. -- Disadvantage: you need to know the ASCII codes. - -Both programs give the same result. That is often how programming works: there are several correct solutions, and you choose the one that fits your task best. - -::: übung aufgabe-caesar-entschluesseln -titel: Decrypt Caesar -code: java -auftrag: Now turn the tables. Read a secret text in capital letters and the key \`k\` and output the plain text. For KDOOR and 3 that is \`HALLO\`. You decide which way to use. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Decrypting means shifting \`k\` places back instead of forward. So \`+ k\` becomes \`- k\`. -tipp: Careful with A: \`0 - 3\` gives -3, and in Java \`%\` does not turn that into a positive number. So add another 26: \`code = (code - 65 - k + 26) % 26 + 65;\` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Unfortunately, Caesar is not secure. There are only 25 keys, and you can try them all in a few minutes. It is even quicker with a trick: in English, E is the most common letter. If H is the most common letter in the secret text, the key was probably 3. On the internet there is also ROT13, which is Caesar with the key 13. Applying ROT13 twice gives you the plain text again, because 13 + 13 = 26. -::: -`,M9=`--- -titel: Collatz sequence -nach: 11 -stufe: 2 ---- - -The Collatz sequence is a famous puzzle in mathematics. You start with a number and apply the same rule again and again: - -- If the number is **even**, you divide it by 2. -- If it is **odd**, you multiply it by 3 and add 1. - -So far, for every start number anyone has tried, the sequence ends at 1 at some point. Whether this is true for all numbers, nobody knows to this day. - -::: übung aufgabe-collatz -titel: Collatz sequence -auftrag: Ask for a start number. Apply the rule until the number is 1, and output the new number after every step. Count the steps as you go and output **Steps:** and the count at the end. - With the start number 6 the sequence is 3, 10, 5, 16, 8, 4, 2, 1. That is 8 steps. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 7 -test: 1 -> Steps: 0 -braucht: whileSchleife, verzweigung -tipp: You do not know how many steps there will be. That is why a while loop fits better than a for loop. -tipp: The while loop runs as long as \`number != 1\`. You check whether a number is even with \`number % 2 == 0\`. The output and \`steps++\` come after the branch, but still inside the loop. -lösung: aufgabe-collatz-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-collatz-java -titel: Collatz sequence in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Steps: 7 -test: 1 -> Steps: 0 -braucht: whileSchleife, verzweigung -tipp: A \`while\` loop runs as long as \`number != 1\`. Inside it, an \`if\` with \`number % 2 == 0\` decides. -tipp: In the body: halve it or \`number = number * 3 + 1;\`, then \`System.out.println(number);\` and \`steps++;\`. After the loop comes \`"Steps: " + steps\`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -This task could make you rich! The mathematician Paul Erdős offered 500 dollars for a proof. In 2021 the Japanese company Bakuage added quite a bit more: 120 million yen, about a million dollars at the time, for a proof or a counterexample. Nobody has collected the money yet. By the way, the puzzle was invented by the German mathematician Lothar Collatz in 1937. I am going to start calculating right now; that much money buys a lot of hay. -::: -`,Z9=`--- -titel: Unit converter -nach: 35 -stufe: 2 ---- - -Build a window that converts lengths. At the top you type a length in metres, below it there are three buttons: - -- **in cm** shows the length in centimetres, 1.5 becomes "150.0 cm", -- **in mm** shows it in millimetres, 1.5 becomes "1500.0 mm", -- **in km** shows it in kilometres, 1500 becomes "1.5 km". - -The result is shown in a JLabel below the buttons. If the field doesn't contain a number, it says "Please enter a number", and the program doesn't crash. - -You can start like this: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Units { - public static void main(String[] args) { - JFrame window = new JFrame("Unit converter"); - window.setSize(300, 200); - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setLayout(new GridLayout(0, 1)); - - JTextField metres = new JTextField(); - JButton inCm = new JButton("in cm"); - JLabel result = new JLabel("?", SwingConstants.CENTER); - - inCm.addActionListener(e -> { - double m = Double.parseDouble(metres.getText()); - result.setText((m * 100) + " cm"); - }); - - window.add(metres); - window.add(inCm); - window.add(result); - window.setVisible(true); - } -} -\`\`\` - -**You are done when …** - -- 1.5 shows "150.0 cm" after **in cm** and "1500.0 mm" after **in mm**, -- 1500 shows "1.5 km" after **in km**, -- "abc" in the field shows "Please enter a number" and the window stays open. - -Extra: a fourth button **in feet** converts to the imperial unit. One foot is 0.3048 m. - -::: ludwig -Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). For "abc" in the field, every listener needs a try/catch with \`NumberFormatException\`, just like the calculator. -::: -`,L9=`--- -titel: Fibonacci numbers -nach: 13 -stufe: 2 ---- - -With the Fibonacci numbers, every number is the sum of the two numbers before it. The sequence starts with 1 and 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -You find these numbers surprisingly often in nature, for example in the way sunflower seeds are arranged. - -::: ludwig -Do you remember **swapping** from lesson 5? There you needed a helper variable, because \`a = b\` overwrites the old value of \`a\`. It is the same here: before \`number2\` gets the new number, its old value must be saved in \`number1\`. So watch the **order**: first \`number1 = number2\`, then \`number2 = number3\`. You will need this moving on and swapping again later, for example when sorting in lesson 19. -::: - -::: angeberwissen -In 1202 Leonardo of Pisa, known as Fibonacci, set a puzzle about rabbits in his arithmetic book: from its second month on, every pair of rabbits has a new pair every month. How many pairs are there after a year? The answer is this sequence. Sadly, there were no goats in the book. -::: - -::: übung aufgabe-fibonacci -titel: Fibonacci numbers -auftrag: Ask how many Fibonacci numbers should be output. Then output exactly that many, each on its own line. You can assume that at least 2 is typed in. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Every new number is the sum of the two before it. So you always have to remember the last two numbers. -tipp: Keep the last two numbers in \`number1\` and \`number2\` and output both before the loop. The loop starts at \`int i = 2\`. Inside it you calculate \`int number3 = number1 + number2\`, output it and then move on: \`number1 = number2\` and \`number2 = number3\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-fibonacci-java -titel: Fibonacci numbers in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Output the first two numbers before the loop. The \`for\` loop then starts at \`int i = 2\`. -tipp: In the body: \`int number3 = number1 + number2;\`, output it, then \`number1 = number2;\` and \`number2 = number3;\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Why must \`number1 = number2\` come before \`number2 = number3\` in the loop? -- [ ] Because otherwise Java does not allow the assignments -- [x] Because otherwise the old value of number2 is overwritten before number1 gets it -- [ ] The order does not matter -> The other way round, number1 and number2 would have the same value afterwards. Just like swapping: first save, then overwrite. -::: -`,W9=`--- -titel: Even or odd -nach: 8 -stufe: 1 ---- - -A number is even if there is no remainder when you divide it by 2. You calculate the remainder with \`%\`: \`8 % 2\` is 0, \`7 % 2\` is 1. - -::: übung aufgabe-gerade -titel: Even or odd -auftrag: Ask for a whole number. Output whether it is even or odd. For 4 the output is **4 is even**, for 7 **7 is odd**. -test: 4 -> 4 is even -test: 7 -> 7 is odd -test: 0 -> 0 is even -test: 15 -> 15 is odd -braucht: verzweigung -tipp: A branch decides between even and odd. Even means: can be divided by 2 without a remainder. -tipp: The condition is \`number % 2 == 0\`. In the output you join the number and the text with \`+\`, e.g. \`number + " is even"\`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-gerade-java -titel: Even or odd in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 4 -> 4 is even -test: 7 -> 7 is odd -test: 0 -> 0 is even -test: 15 -> 15 is odd -braucht: verzweigung -tipp: Read a number with \`int number = scanner.nextInt();\`. Ask with \`System.out.println(…)\` before that. -tipp: \`if (number % 2 == 0) { … } else { … }\`. The output is \`System.out.println(number + " is even");\`. -lösung: aufgabe-gerade-loesung.visustruct -::: -`,E9=`--- -titel: Sales tax -nach: 6 -stufe: 1 ---- - -In Germany, 19 % **VAT** (value added tax, a kind of sales tax) is added to almost everything you buy. The shop calculates with the net price (without tax) and adds the tax on top. That gives the gross price you pay at the till. - -An example: you buy a folding phone that opens up into a tablet. The shop's price tag says 1000 euros net. On top of that come 19 %, so 190 euros. At the till you pay 1190 euros. The shop is not allowed to keep the 190 euros: it passes them on to the tax office. - -::: grafik aufgabe-mehrwertsteuer.svg -Net price plus VAT gives the gross price. The VAT goes to the tax office. -::: - -::: angeberwissen -Baah, the shop bought the phone itself, of course: from the manufacturer for 800 euros plus 152 euros VAT. These 152 euros are called **input tax**, and the shop may subtract them from the 190 euros. So it only transfers 38 euros to the tax office. In the end only one person pays the whole tax: the customer at the till. That is you. I pay no tax at all, by the way. I just eat grass. -::: - -The tax rate never changes while you calculate. That is why you create it as a **constant**: a variable whose value stays the same once it is set. You write \`const\` in front of it, for example \`const double VAT = 0.19\`. Names of constants are written in capital letters so you recognise them straight away. In Java code this becomes \`final double VAT = 0.19;\`. - -If the tax rate ever changes, you only have to change this one line. - -::: übung aufgabe-mehrwertsteuer -titel: Sales tax -auftrag: Create the constant \`VAT\` with the value 0.19. Then ask for the net price. First output the tax and then the gross price, only the number each time. - For a net price of 100 the outputs are **19** and **119**. -test: 100 -> 19 | 119 -test: 50 -> 9.5 | 59.5 -test: 0 -> 0 | 0 -tipp: The tax is 19 percent of the net price. The gross price is what you pay in the end. -tipp: The tax is \`netPrice * VAT\`. You get the gross price by adding the tax to the net price. Both values are decimal numbers, so \`double\`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Why do you create the tax rate as a constant? -- [ ] Because constants are calculated faster -- [x] Because its value should not change in the program -- [ ] Because decimal numbers can only be stored as constants -> A constant keeps its value. If the tax rate ever changes, you only change the one line with \`const\`. -::: -`,N9=`--- -titel: Grade average -nach: 13 -stufe: 2 ---- - -How did you do lately? The average is the sum of all grades divided by how many there are. - -::: übung aufgabe-durchschnitt -titel: Grade average -auftrag: First ask how many grades will be typed in. Then read in exactly that many grades and output the average, only the number. - For the grades 1 and 2 the average is **1.5**. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: You need the sum of all grades and how many there are. The average is the sum divided by the count. -tipp: The for loop runs from \`int i = 0\` while \`i < count\`. Inside it you read in a grade and add it to the sum. You store the average as a decimal number: \`double average = sum * 1.0 / count\`. The \`* 1.0\` makes sure that Java does not do whole-number division either. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-durchschnitt-java -titel: Grade average in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 2, 1, 2 -> 1.5 -test: 3, 1, 2, 3 -> 2 -test: 4, 2, 2, 3, 4 -> 2.75 -braucht: forSchleife -tipp: \`for (int i = 0; i < count; i++)\` reads exactly as many grades as were given before. -tipp: Divide with \`double average = sum * 1.0 / count;\`. Without \`* 1.0\`, Java divides two \`int\` values as whole numbers, and 1.5 becomes 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: -`,F9=`--- -titel: Check the PIN -nach: 12 -stufe: 2 ---- - -At a cash machine you have three tries for your PIN. If you type a wrong PIN three times, the card is blocked. - -::: angeberwissen -John Shepherd-Barron, who set up the first cash machine in London in 1967, actually wanted six-digit PINs. But his wife said she could remember four digits at most. That is why your PIN has four digits today. -::: - -::: übung aufgabe-pin -titel: Check the PIN -auftrag: The right PIN is 1234. Keep asking for the PIN until it is right or three tries have been used. Then output **PIN correct** or **Card blocked**. -test: 1234 -> PIN correct -test: 1111, 1234 -> PIN correct -test: 1, 2, 1234 -> PIN correct -test: 1, 2, 3 -> Card blocked -braucht: doUntilSchleife, verzweigung -tipp: The loop ends in two cases: when the PIN is right or when three tries have been used. Count the tries. -tipp: The PIN is asked for at least once, so a do-while loop fits. Create \`int pin = 0\` and \`int attempts = 0\` before it. The loop repeats as long as \`pin != 1234 && attempts < 3\`. After the loop, a branch decides what is output. -lösung: aufgabe-pin-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-pin-java -titel: Check the PIN in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 1234 -> PIN correct -test: 1111, 1234 -> PIN correct -test: 1, 2, 1234 -> PIN correct -test: 1, 2, 3 -> Card blocked -braucht: doUntilSchleife, verzweigung -tipp: \`do { … } while (…);\` asks at least once. There is a semicolon after \`while (…)\`. -tipp: Create \`int pin = 0;\` and \`int attempts = 0;\` first. In the loop: \`int entered = scanner.nextInt();\`, \`pin = entered;\` and \`attempts++;\`. The condition is \`pin != 1234 && attempts < 3\`. -lösung: aufgabe-pin-java-loesung.visustruct -::: -`,R9=`--- -titel: Battleship -nach: 16 -stufe: 2 ---- - -In the game Battleship the sea is a grid. The columns are called A to E, the rows 1 to 5. In the start diagram the sea is the 2D array \`sea\`: \`true\` means that part of a ship is on this square. - -::: grafik schiffe-versenken.svg -Grey means \`true\`: there is a ship here. The small grey numbers are the indices in the array; they start at 0. In the game, on the other hand, the squares are called A to E and 1 to 5. -::: - -::: übung aufgabe-schiffe -titel: Battleship -auftrag: Output all squares that have a ship on them, each square on its own line, e.g. **B1**. Go through the sea row by row with two nested loops. - For the start diagram, **B1**, **C1**, **D1**, **E3**, **E4** and **A5** appear. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Go through the sea with two nested loops, just like the cinema. Only output the squares that hold \`true\`. -tipp: The outer loop counts \`row\`, the inner one \`column\`, both from 0. If there is a ship on \`sea[row][column]\`, you output the letter from \`columns[column]\` and the row number: \`output: columns[column] + (row + 1)\`. You need the \`+ 1\` because the game starts counting at 1. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-schiffe-java -titel: Battleship in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Two \`for\` loops inside each other: the row outside, the column inside, both up to \`.length\`. -tipp: \`if (sea[row][column]) { System.out.println(columns[column] + (row + 1)); }\`. The brackets around \`row + 1\` make Java calculate first. -lösung: aufgabe-schiffe-loesung.visustruct -::: -`,J9=`--- -titel: Menu -nach: 10 -stufe: 1 ---- - -In the school canteen you order by number. The program tells you which dish belongs to the number. - -::: übung aufgabe-speisekarte -titel: Menu -auftrag: Ask for a number. For 1 output **Greek salad**, for 2 **Rice bowl** and for 3 **Falafel wrap**. For any other number output **Please choose a valid number**. -test: 1 -> Greek salad -test: 2 -> Rice bowl -test: 3 -> Falafel wrap -test: 7 -> Please choose a valid number -braucht: fallauswahl -tipp: A switch fits several fixed numbers. What happens with all the other numbers? -tipp: Read in the number with \`input: int pick "Which dish?"\`. The switch checks \`pick\`, and the cases are called \`1\`, \`2\` and \`3\`. All other numbers end up in the case \`default\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-speisekarte-java -titel: Menu in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 1 -> Greek salad -test: 2 -> Rice bowl -test: 3 -> Falafel wrap -test: 7 -> Please choose a valid number -braucht: fallauswahl -tipp: In Java this is a switch: \`switch (pick) { … }\`. -tipp: Every case looks like this: \`case 1 -> { System.out.println("…"); }\`. All other numbers go to \`default -> { … }\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: -`,G9=`--- -titel: Add up -nach: 2 -stufe: 1 ---- - -Set two numbers, add them and output the result. - -::: übung aufgabe-summe -titel: Add up -auftrag: Set \`number1\` to the value 4 and \`number2\` to the value 3. Calculate the sum in a third variable and output only the sum. -test: - -> 7 -tipp: You need three variables: two for the numbers and one for the result. -tipp: You set a variable with a statement such as \`int number1 = 4\`. For the output you write the name of the variable without quotation marks. -lösung: aufgabe-summe-loesung.visustruct -::: -`,H9=`--- -titel: Draw for board duty -nach: 15 -stufe: 2 ---- - -Who is on board duty this week, cleaning the board? Five names go into an array, then a number is drawn. - -::: übung aufgabe-tafeldienst -titel: Draw for board duty -auftrag: Read five names into a String array. Then ask for a draw number from 1 to 5 and output **Board duty:** and the matching name. - Draw number 1 belongs to the first name, 5 to the last one. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Board duty: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Board duty: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Board duty: Pia -braucht: forSchleife -tipp: First a loop reads in the five names. After that you do not need a loop any more, just one look into a slot. -tipp: You create the array with \`String[] names = new String[5]\`. Careful: the draw number starts at 1, the index at 0. So the name is in \`names[pick - 1]\`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-tafeldienst-java -titel: Draw for board duty in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: Ada, Ben, Cem, Dana, Emil, 3 -> Board duty: Cem -test: Ada, Ben, Cem, Dana, Emil, 1 -> Board duty: Ada -test: Lea, Max, Nia, Ole, Pia, 5 -> Board duty: Pia -braucht: forSchleife -tipp: Create an array for five names with \`String[] names = new String[5];\`. -tipp: In the loop: \`names[i] = scanner.next();\`. Ticket number 1 belongs to slot 0, so you output \`names[pick - 1]\`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> With \`int pick = (int) (Math.random() * 5) + 1\` you can also let chance draw the number. But for the automatic check we need a fixed input. -`,V9=`--- -titel: Calculator -nach: 10 -stufe: 2 ---- - -A small calculator: type in two numbers and an operator, and the result appears. - -::: übung aufgabe-rechner -titel: Calculator -auftrag: Ask for two whole numbers and then for an operator as text: \`+\`, \`-\` or \`*\`. Output the result. For any other sign output **Unknown operator**. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unknown operator -braucht: fallauswahl -tipp: Read in all three values. A switch on the operator then decides what is calculated. -tipp: You read in the operator with \`input: String operator "Operator"\`. The switch checks \`operator\`, the cases are called \`"+"\`, \`"-"\` and \`"*"\`, and the last case is \`default\`. In every case, first calculate in a variable and then output it, otherwise \`+\` only joins the numbers together. -lösung: aufgabe-rechner-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-rechner-java -titel: Calculator in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Unknown operator -braucht: fallauswahl -tipp: The operator is a text. Read it with \`String operator = scanner.next();\`. -tipp: \`switch (operator) { case "+" -> { … } … default -> { … } }\`. With texts, the cases are in quotation marks. -lösung: aufgabe-rechner-loesung.visustruct -::: -`,q9=`--- -titel: Rental menu -nach: 18 -stufe: 2 ---- - -At the rental machine you can book several vehicles one after another. The menu keeps coming back until you choose **0** to quit. - -::: übung aufgabe-verleih -titel: Rental menu -auftrag: Keep asking for a choice: 1 = e-bike, 2 = e-scooter, 0 = quit. For 1 output **E-bike booked**, for 2 **E-scooter booked**, and for any other number **Invalid choice**. - For 0 the program outputs **Bye** and leaves the loop with a Break. -test: 0 -> Bye -test: 1, 2, 0 -> E-bike booked | E-scooter booked | Bye -test: 2, 5, 1, 0 -> E-scooter booked | Invalid choice | E-bike booked | Bye -braucht: endlosschleife, aussprung -tipp: The menu runs again and again until someone chooses 0. An endless loop with a Break is good for that. -tipp: Use an endless loop. Inside it, first comes the input \`input: int choice "1 = e-bike, 2 = e-scooter, 0 = quit"\`, then a switch on \`choice\` with the cases \`0\`, \`1\`, \`2\` and \`default\`. The case \`0\` holds the output and, below it, the Break. -lösung: aufgabe-verleih-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-verleih-java -titel: Rental menu in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 0 -> Bye -test: 1, 2, 0 -> E-bike booked | E-scooter booked | Bye -test: 2, 5, 1, 0 -> E-scooter booked | Invalid choice | E-bike booked | Bye -braucht: endlosschleife, aussprung -tipp: \`while (true) { … }\` runs forever until a \`break;\` comes. -tipp: In Java, use \`if\`/\`else if\` here instead of \`switch\`: a \`break;\` inside a \`switch\` only leaves the \`switch\`, not the loop. \`if (choice == 0) { System.out.println("Bye"); break; } else if (choice == 1) { … }\`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: -`,U9=`--- -titel: Vocabulary trainer -nach: 27 -stufe: 3 ---- - -Ludwig is learning German. His words are in a CSV file, English on the left, German on the right: - -::: datei words.csv -English;German -goat;Ziege -hay;Heu -meadow;Wiese -::: - -Because only the file knows the words, you can simply add new lines later without changing the program. - -::: angeberwissen -Sebastian Leitner made the flashcard box with several compartments popular in 1972: cards you know move one compartment further and come up less often, wrong ones go back to the first compartment. Many vocabulary apps still work on this principle today. -::: - -::: übung aufgabe-vokabeln -titel: Vocabulary trainer -code: java -auftrag: Ask for every word in the file: output **What is goat in German?** and read the answer with \`scanner.next()\`. If it is right, output **Right!**, otherwise for example **Wrong, it is Ziege.** - At the end, show how many were right, for example **2 of 3 right**. -start: aufgabe-vokabeln-start.visustruct -test: Ziege, Heu, Wiese -> What is goat in German? | Right! | What is hay in German? | Right! | What is meadow in German? | Right! | 3 of 3 right -test: Kuh, Heu, Wiese -> What is goat in German? | Wrong, it is Ziege. | What is hay in German? | Right! | What is meadow in German? | Right! | 2 of 3 right -test: Ziege, hay, wiese -> What is goat in German? | Right! | What is hay in German? | Wrong, it is Heu. | What is meadow in German? | Wrong, it is Wiese. | 1 of 3 right -braucht: whileSchleife, verzweigung -tipp: Skip the header line. In the loop, split every line with \`split(";")\`: \`parts[0]\` is the English word, \`parts[1]\` the German one. -tipp: Compare texts with \`answer.equals(parts[1])\`, not with \`==\`. Count along with \`int right = 0;\` and \`int count = 0;\` before the loop. -lösung: aufgabe-vokabeln-loesung.visustruct -::: -`,Q9=`--- -titel: Adult? -nach: 8 -stufe: 1 ---- - -At the cinema, for a driving licence or for voting: it often matters whether someone is already 18. - -::: übung aufgabe-volljaehrig -titel: Adult? -auftrag: Ask for the age. If the person is 18 or older, output **adult**, otherwise **minor**. -test: 18 -> adult -test: 35 -> adult -test: 17 -> minor -test: 6 -> minor -braucht: verzweigung -tipp: There are two possible outputs, so you need a branch. -tipp: Read in the age with \`input: int age "How old are you?"\`. The condition of the branch is \`age >= 18\`. Make sure that 18 already counts as adult. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -And now the same in Java: - -::: übung aufgabe-volljaehrig-java -titel: Adult? in Java -code: java -auftrag: Now solve the task above in Java. The outputs stay exactly the same. -test: 18 -> adult -test: 35 -> adult -test: 17 -> minor -test: 6 -> minor -braucht: verzweigung -tipp: Read the age with \`int age = scanner.nextInt();\`. -tipp: \`if (age >= 18) { … } else { … }\`, with a \`System.out.println(…)\` in each branch. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: -`,$9=`--- -titel: Rolling dice with MVC -nach: 40 -stufe: 3 ---- - -Build a dice game with Model View Controller. A button **Roll** rolls the dice, and two views show the result. - -The model is already finished. It rolls and counts how often it was rolled and how many sixes came up: - -\`\`\`java -class Dice { - int pips = 1; - int rolls = 0; - int sixes = 0; - - void roll() { - pips = (int) (Math.random() * 6) + 1; - rolls++; - if (pips == 6) { - sixes++; - } - } -} -\`\`\` - -Your task: - -1. Test the model without a window first: roll ten times in \`main\` and then output \`rolls\` and \`sixes\`. -2. Write the view \`PipsView\`. It shows the number rolled in a big JLabel, for example "4". -3. Write the view \`StatsView\`. It shows for example "Sixes: 2 of 10 rolls". -4. The controller is the listener at the button: it lets the model roll and hands the new values to both views. - -**You are done when …** - -- after ten rolls in the console \`rolls\` is 10 and \`sixes\` is between 0 and 10, -- every click on **Roll** shows a new number from 1 to 6 in the \`PipsView\`, -- the \`StatsView\` counts one more roll after every click and counts the sixes correctly, -- there is no \`JLabel\` in the model and no \`Math.random\` in the views. - -Extra: a button **New game** resets everything. The method for that belongs in the model. - -::: ludwig -Remember the rule from lesson 40: there isn't a single \`JLabel\` in the model. If you change the font size when rolling, that belongs in the view. -::: -`,Y9=`--- -titel: Double a number -nach: 2 -stufe: 1 ---- - -A variable can change its value. Here a number is doubled. - -::: übung aufgabe-verdoppeln -titel: Double a number -auftrag: Set the variable \`number\` to the value 4. Double it in a second statement without creating a new variable. Then output **Doubled number: 8**, where the 8 comes from the variable. -test: - -> Doubled number: 8 -tipp: Doubling means: times 2. You store the result in the same variable again. -tipp: \`number = number * 2\` calculates with the old value and stores the result in \`number\` again. You join text and a variable with \`+\`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: -`,K9=`--- -titel: Idade num subprograma -nach: 18 -stufe: 2 ---- - -A verificação da idade de “Maior de idade?” passa agora a ser um subprograma próprio. O programa principal só o chama. - -::: übung aufgabe-alter-unterprogramm -titel: Idade num subprograma -auftrag: Constrói dois diagramas. O programa principal mostra **Bem-vindo**, depois chama \`verificarIdade()\` e no fim mostra **Adeus**. - O subprograma \`verificarIdade\` fica num separador próprio: pede a idade e mostra **maior de idade** ou **menor de idade**. -test: 20 -> Bem-vindo | maior de idade | Adeus -test: 18 -> Bem-vindo | maior de idade | Adeus -test: 12 -> Bem-vindo | menor de idade | Adeus -braucht: aufruf -tipp: O programa principal tem três blocos. O subprograma faz o trabalho a sério. -tipp: Abre o exercício no editor e constrói lá o programa principal com a chamada \`verificarIdade()\`. Depois abre um novo separador com **+** e dá-lhe o título \`verificarIdade\`. Constrói nele a entrada e a decisão. O Verificar encontra o subprograma pelo título do separador. -lösung: aufgabe-alter-haupt-loesung.visustruct -unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct -::: -`,X9=`--- -titel: Avaliar o lançamento da bola -nach: 25 -stufe: 2 ---- - -No dia do desporto, todos escreveram numa tabela a distância a que lançaram a bola: - -::: datei lancamento.csv -Nome;Distancia -Ludwig;28 -Zora;42 -Raposa;35 -Lebre;21 -::: - -::: übung aufgabe-ballwurf -titel: Avaliar o lançamento da bola -code: java -auftrag: Lê o ficheiro e salta a linha de cabeçalho. Mostra quantos participaram (**Participantes: 4**) e a que distância lançaram em média (**Média: 31.5 m**). - Guarda o lançamento mais longo no ficheiro **vencedor.txt**, por exemplo **Vencedor: Zora (42 m)**. -start: aufgabe-ballwurf-start.visustruct -test: - -> Participantes: 4 | Média: 31.5 m -datei: vencedor.txt -> Vencedor: Zora (42 m) -braucht: whileSchleife, verzweigung -tipp: Precisas de quatro variáveis antes do ciclo: a contagem, a soma como \`double\`, a melhor distância e o melhor nome. -tipp: No ciclo: \`String[] partes = linha.split(";");\` e \`int distancia = Integer.parseInt(partes[1]);\`. Se \`distancia > melhorDistancia\`, guarda a distância e o nome. Para guardar: \`PrintWriter saida = new PrintWriter("vencedor.txt");\`, \`saida.println(…)\` e \`saida.close();\`. -lösung: aufgabe-ballwurf-loesung.visustruct -::: -`,e5=`--- -titel: Classificação -nach: 19 -stufe: 2 ---- - -Cinco cabras fizeram a corrida de obstáculos. Agora a classificação vai para a porta do estábulo: mais pontos em cima, menos pontos em baixo. - -::: übung aufgabe-bestenliste -titel: Classificação -auftrag: Lê 5 pontuações para um array. Ordena o array com o bubble sort por ordem **decrescente**, ou seja, o maior número primeiro. Depois mostra a lista com o lugar, por exemplo **1. 9**, na linha seguinte **2. 9** e assim por diante. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: O bubble sort da lição 19 ordena por ordem crescente. Para decrescente basta inverter a comparação dos vizinhos. -tipp: Troca-se quando \`pontos[i] < pontos[i + 1]\`, com uma variável auxiliar. Para a saída, calcula primeiro \`int lugar = i + 1\` e depois mostra \`lugar + ". " + pontos[i]\`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-bestenliste-java -titel: Classificação em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 3, 9, 2, 9, 1 -> 1. 9 | 2. 9 | 3. 3 | 4. 2 | 5. 1 -test: 10, 20, 30, 40, 50 -> 1. 50 | 2. 40 | 3. 30 | 4. 20 | 5. 10 -test: 5, 4, 3, 2, 1 -> 1. 5 | 2. 4 | 3. 3 | 4. 2 | 5. 1 -braucht: forSchleife, verzweigung -tipp: Lê cada número primeiro para uma variável e depois põe-no no array: \`int numero = scanner.nextInt();\` e \`pontos[i] = numero;\`. -tipp: A troca também precisa de uma variável auxiliar em Java: \`int aux = pontos[i]; pontos[i] = pontos[i + 1]; pontos[i + 1] = aux;\`. -lösung: aufgabe-bestenliste-loesung.visustruct -::: -`,t5=`--- -titel: Número binário -nach: 11 -stufe: 3 ---- - -Os computadores fazem contas só com dois algarismos: 0 e 1. É assim que se converte um número para o **sistema binário**: - -1. Divide o número por 2 e guarda o resto (0 ou 1). -2. Continua com o resultado sem o resto. -3. Repete isto até o número ser 0. - -Os restos lidos **de baixo para cima** dão o número binário. Para 6, os restos são 0, 1, 1, portanto o número binário é 110. - -::: übung aufgabe-binaer -titel: Número binário -auftrag: Pede um número inteiro maior do que 0 e mostra-o como número binário. Para 6 a saída é **110**, para 13 **1101**. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Vai dividindo o número por 2 e guarda cada resto. Os restos lidos ao contrário dão o número binário. -tipp: Junta os algarismos num texto: \`String binario = ""\`. No ciclo calculas \`int resto = numero % 2\` e acrescentas o resto à **frente**: \`binario = resto + binario\`. Depois, \`numero = numero / 2\`. Como numero é um número inteiro, o resto desaparece. -lösung: aufgabe-binaer-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-binaer-java -titel: Número binário em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 6 -> 110 -test: 13 -> 1101 -test: 1 -> 1 -test: 8 -> 1000 -braucht: whileSchleife -tipp: Começa com \`String binario = "";\`. O ciclo corre com \`while (numero > 0)\`. -tipp: No corpo: \`int resto = numero % 2;\`, depois \`binario = resto + binario;\` e \`numero = numero / 2;\`. Como \`binario\` é uma String, o \`+\` põe o resto à frente. -lösung: aufgabe-binaer-loesung.visustruct -::: -`,n5=`--- -titel: Cifra de César -nach: 17 -stufe: 3 ---- - -Há mais de 2000 anos, o general romano Júlio César enviava mensagens secretas às suas tropas. O truque era simples: substituía cada letra pela letra que está **três posições à frente** no alfabeto. O A passa a D, o B passa a E e assim por diante. A mensagem legível chama-se **texto simples**, a cifrada **texto cifrado**. O número de posições que se avança é a **chave**, muitas vezes chamada apenas \`k\`. - -::: grafik caesar-verschiebung.svg -Cifrar com a chave 3: cada letra de cima passa a ser a letra de baixo. No fim recomeça-se do início, por isso X, Y e Z passam a A, B e C. -::: - -Assim, \`HALLO\` passa a \`KDOOR\`. Quem conhece a chave recua simplesmente três posições e consegue voltar a ler a mensagem. - -### O disco de cifra - -Para não ter de contar sempre, construiu-se um **disco de cifra**: dois discos com o alfabeto, um pequeno sobre um grande, presos no meio para poderem rodar. Por fora está o texto simples, por dentro o texto cifrado. Rodando o disco interior três letras, por baixo de cada letra exterior aparece a sua letra cifrada. Discos assim existem desde o século XV. Na Guerra Civil Americana (1861–1865), os soldados levavam pequenos discos de latão. - -::: grafik caesar-scheibe.svg -Um disco de cifra inspirado nos discos históricos de latão. A janela azul mostra: com a chave 3, por baixo do A está o D. -::: - -::: angeberwissen -O próprio César nem sequer tinha um disco! Sabemo-lo pelo historiador romano Suetónio: nas suas cartas, César avançava cada letra três posições e contava isso simplesmente de cabeça. O disco só foi inventado por Leon Battista Alberti por volta de 1467, cerca de 1500 anos mais tarde. Aliás, eu também conto de cabeça. Não tenho dedos, só cascos. -::: - -Experimenta tu. Roda o disco interior, escreve um texto e vê como surge o texto cifrado. Com **Decifrar** faz-se o caminho inverso. - -::: caesar 3 -LUDWIG -::: - -::: ludwig -Um disco verdadeiro é muito fácil de fazer: dois círculos de cartão, um um pouco mais pequeno, cada um com 26 campos iguais para o alfabeto, e um colchete de latão no meio. Está pronta a tua ferramenta de agente secreto! -::: - -::: quiz -? Em que letra se transforma o Y com a chave 3? -- [ ] A -- [x] B -- [ ] C -> A seguir ao Y vem o Z, depois recomeça-se com A e B. Três posições à frente é, portanto, o B. - -? Um texto cifrado foi cifrado com a chave 5. Como o decifras? -- [ ] Avançar mais 5 posições -- [x] Recuar 5 posições -- [ ] Ler as letras de trás para a frente -> Decifrar é o contrário de cifrar. Recuar 5 posições é, aliás, o mesmo que avançar 21, porque 5 + 21 = 26. -::: - -### O programa: há mais do que um caminho - -Como ensinas o computador a avançar uma letra \`k\` posições? Não existe *a* única solução certa. Vamos ver dois caminhos. Ambos percorrem o texto carácter a carácter com um ciclo for, tal como na lição sobre cadeias de caracteres. A diferença está na forma como avançam uma única letra. - -Nos dois caminhos ajuda o operador de resto \`%\`. Ele garante que depois do Z se continua no A: as posições 0 a 25 ficam como estão, 26 passa a 0, 27 passa a 1 e assim por diante. - -### Caminho 1: o alfabeto num array - -Colocas o alfabeto num array \`char[] alfabeto = {'A', 'B', …, 'Z'}\`. Para cada letra da palavra procuras no array a sua posição \`pos\`, ou seja, o seu índice. A letra cifrada está então no mesmo array na posição \`(pos + k) % 26\`. - -Um exemplo com a chave 3: o X está na posição 23. Então \`(23 + 3) % 26 = 0\`, e na posição 0 está o A. - -::: übung aufgabe-caesar-array -titel: César com array -auftrag: O diagrama inicial já contém o array \`alfabeto\`. Pede uma palavra em maiúsculas e a chave \`k\`. Depois mostra a palavra cifrada. Para HALLO e 3, isso dá \`KDOOR\`. -start: aufgabe-caesar-array-start.visustruct -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife, verzweigung -tipp: Cria um texto vazio \`String segredo = ""\`. Percorre a palavra carácter a carácter com um ciclo for. Em cada passagem acrescentas uma letra cifrada ao fim de \`segredo\`. -tipp: Para encontrar a posição de uma letra precisas de um segundo ciclo, interior, sobre o array: se \`alfabeto[j] == letra\`, guardas \`pos = j\`. -tipp: Depois do ciclo interior acrescentas \`alfabeto[(pos + k) % 26]\`: \`segredo = segredo + alfabeto[(pos + k) % 26]\`. Depois do ciclo exterior mostras \`segredo\`. -lösung: aufgabe-caesar-array-loesung.visustruct -::: - -### Caminho 2: calcular com a tabela ASCII - -Para o computador, cada carácter é na verdade um número. Que número pertence a que carácter está na **tabela ASCII**. Aí o A tem o código 65, o B o código 66 e assim por diante até ao Z com 90. Em Java transformas um carácter no seu código com \`(int)\` e um código de volta num carácter com \`(char)\`: - -\`\`\` -int codigo = (int) 'A' -char letra = (char) 68 -\`\`\` - -Depois disso, \`codigo\` vale 65 e \`letra\` vale \`'D'\`. Uma conversão destas de um tipo de dados para outro chama-se **conversão de tipo** (em inglês *cast*). - -Agora já podes fazer contas com a letra. Para que o salto do Z de volta ao A funcione, subtrais primeiro 65. Assim o A fica na posição 0 e o Z na posição 25, tal como no caminho 1. Avanças com \`% 26\` e no fim voltas a somar os 65: - -::: grafik caesar-ascii.svg -Em cima, as letras maiúsculas com os seus códigos ASCII. Em baixo, o cálculo para o X com a chave 3: o resultado é A. -::: - -::: übung aufgabe-caesar-ascii -titel: César com ASCII -code: java -auftrag: Escreve um programa em Java que lê uma palavra em maiúsculas e a chave \`k\` e mostra a palavra cifrada. Desta vez sem array: calcula com \`(int)\` e \`(char)\`. -test: HALLO, 3 -> KDOOR -test: ZEBRA, 1 -> AFCSB -test: LUDWIG, 13 -> YHQJVT -braucht: forSchleife -tipp: Percorre a palavra com um ciclo for. O código do carácter na posição \`i\` obténs com \`int codigo = (int) palavra.charAt(i);\`. -tipp: Calcula \`codigo = (codigo - 65 + k) % 26 + 65;\` e acrescenta o carácter: \`segredo = segredo + (char) codigo;\`. Antes do ciclo escreves \`String segredo = "";\`, depois do ciclo \`System.out.println(segredo);\`. -lösung: aufgabe-caesar-ascii-loesung.visustruct -::: - -### Qual é o melhor caminho? - -**Caminho 1: array.** A ideia é procurar a posição no array. -- Vantagem: fácil de perceber, e também funciona com alfabetos próprios, p. ex. com Ç. -- Desvantagem: é preciso procurar cada letra. - -**Caminho 2: ASCII.** A ideia é calcular com o código do carácter. -- Vantagem: curto e sem procura, por isso mais rápido. -- Desvantagem: é preciso conhecer os códigos ASCII. - -Os dois programas dão o mesmo resultado. Na programação é muitas vezes assim: há várias soluções certas, e escolhes a que melhor se adapta à tua tarefa. - -::: übung aufgabe-caesar-entschluesseln -titel: Decifrar César -code: java -auftrag: Agora inverte o jogo. Lê um texto cifrado em maiúsculas e a chave \`k\` e mostra o texto simples. Para KDOOR e 3, isso dá \`HALLO\`. Escolhes tu o caminho. -test: KDOOR, 3 -> HALLO -test: AFCSB, 1 -> ZEBRA -test: YHQJVT, 13 -> LUDWIG -braucht: forSchleife -tipp: Decifrar significa recuar \`k\` posições em vez de avançar. Assim, o \`+ k\` passa a \`- k\`. -tipp: Cuidado com o A: \`0 - 3\` dá -3, e em Java o \`%\` não transforma isso num número positivo. Por isso soma ainda 26: \`codigo = (codigo - 65 - k + 26) % 26 + 65;\` -lösung: aufgabe-caesar-entschluesseln-loesung.visustruct -::: - -::: angeberwissen -Infelizmente, a cifra de César não é segura. Há apenas 25 chaves, e é possível experimentá-las todas em poucos minutos. Com um truque é ainda mais rápido: em português, as letras mais frequentes são o A e o E. Se no texto cifrado o H aparecer muitas vezes, a chave foi provavelmente 3. Na internet existe ainda o ROT13, que é a cifra de César com a chave 13. Aplicar ROT13 duas vezes devolve o texto simples, porque 13 + 13 = 26. -::: -`,i5=`--- -titel: Sequência de Collatz -nach: 11 -stufe: 2 ---- - -A sequência de Collatz é um enigma famoso da matemática. Começas com um número e aplicas sempre a mesma regra: - -- Se o número for **par**, divides por 2. -- Se for **ímpar**, multiplicas por 3 e somas 1. - -Até agora, para todos os números iniciais que alguém experimentou, a sequência acaba por chegar a 1. Se isto é verdade para todos os números, ninguém sabe até hoje. - -::: übung aufgabe-collatz -titel: Sequência de Collatz -auftrag: Pede um número inicial. Aplica a regra até o número ser 1 e mostra o novo número depois de cada passo. Vai contando os passos e mostra no fim **Passos:** e o número de passos. - Com o número inicial 6, a sequência é 3, 10, 5, 16, 8, 4, 2, 1. São 8 passos. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 7 -test: 1 -> Passos: 0 -braucht: whileSchleife, verzweigung -tipp: Não sabes quantos passos vão ser. Por isso um ciclo while serve melhor do que um ciclo for. -tipp: O ciclo while é executado enquanto \`numero != 1\`. Verificas se um número é par com \`numero % 2 == 0\`. A saída e \`passos++\` vêm depois da decisão, mas ainda dentro do ciclo. -lösung: aufgabe-collatz-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-collatz-java -titel: Sequência de Collatz em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 6 -> 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 8 -test: 3 -> 10 | 5 | 16 | 8 | 4 | 2 | 1 | Passos: 7 -test: 1 -> Passos: 0 -braucht: whileSchleife, verzweigung -tipp: Um ciclo \`while\` corre enquanto \`numero != 1\`. Lá dentro, um \`if\` com \`numero % 2 == 0\` decide. -tipp: No corpo: dividir por 2 ou \`numero = numero * 3 + 1;\`, depois \`System.out.println(numero);\` e \`passos++;\`. Depois do ciclo vem \`"Passos: " + passos\`. -lösung: aufgabe-collatz-loesung.visustruct -::: - -::: angeberwissen -Esta tarefa pode tornar-te rico! O matemático Paul Erdős ofereceu 500 dólares por uma demonstração. Em 2021, a empresa japonesa Bakuage juntou bastante mais: 120 milhões de ienes, na altura cerca de um milhão de dólares, por uma demonstração ou um contraexemplo. Ainda ninguém foi buscar o dinheiro. Já agora, o enigma foi inventado pelo matemático alemão Lothar Collatz em 1937. Vou já começar a fazer contas; com tanto dinheiro compra-se muito feno. -::: -`,a5=`--- -titel: Conversor de unidades -nach: 35 -stufe: 2 ---- - -Constrói uma janela que converte comprimentos. Em cima escreves um comprimento em metros, por baixo há três botões: - -- **em cm** mostra o comprimento em centímetros, 1.5 passa a "150.0 cm", -- **em mm** mostra-o em milímetros, 1.5 passa a "1500.0 mm", -- **em km** mostra-o em quilómetros, 1500 passa a "1.5 km". - -O resultado aparece num JLabel por baixo dos botões. Se no campo não estiver um número, aparece "Escreve um número", e o programa não vai abaixo. - -Podes começar assim: - -\`\`\`java -import javax.swing.*; -import java.awt.*; - -public class Unidades { - public static void main(String[] args) { - JFrame janela = new JFrame("Conversor de unidades"); - janela.setSize(300, 200); - janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - janela.setLayout(new GridLayout(0, 1)); - - JTextField metros = new JTextField(); - JButton emCm = new JButton("em cm"); - JLabel resultado = new JLabel("?", SwingConstants.CENTER); - - emCm.addActionListener(e -> { - double m = Double.parseDouble(metros.getText()); - resultado.setText((m * 100) + " cm"); - }); - - janela.add(metros); - janela.add(emCm); - janela.add(resultado); - janela.setVisible(true); - } -} -\`\`\` - -**Terminaste quando …** - -- 1.5 mostra "150.0 cm" depois de **em cm** e "1500.0 mm" depois de **em mm**, -- 1500 mostra "1.5 km" depois de **em km**, -- "abc" no campo mostra "Escreve um número" e a janela continua aberta. - -Extra: um quarto botão **em pés** converte para a unidade inglesa. Um pé são 0.3048 m. - -::: ludwig -Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). Para "abc" no campo, cada ouvinte precisa de um try/catch com \`NumberFormatException\`, tal como na calculadora. -::: -`,s5=`--- -titel: Números de Fibonacci -nach: 13 -stufe: 2 ---- - -Nos números de Fibonacci, cada número é a soma dos dois anteriores. A sequência começa com 1 e 1: - -1, 1, 2, 3, 5, 8, 13, 21, … - -Encontras estes números surpreendentemente vezes na natureza, por exemplo na forma como as sementes do girassol estão dispostas. - -::: ludwig -Lembras-te da **troca** da lição 5? Aí precisavas de uma variável auxiliar, porque \`a = b\` substitui o valor antigo de \`a\`. Aqui é igual: antes de \`numero2\` receber o número novo, o seu valor antigo tem de estar guardado em \`numero1\`. Atenção à **ordem**: primeiro \`numero1 = numero2\`, depois \`numero2 = numero3\`. Vais precisar outra vez de avançar e trocar valores mais tarde, por exemplo ao ordenar na lição 19. -::: - -::: angeberwissen -Em 1202, Leonardo de Pisa, conhecido como Fibonacci, pôs no seu livro de cálculo um problema sobre coelhos: a partir do segundo mês, cada casal de coelhos tem um novo casal todos os meses. Quantos casais há ao fim de um ano? A resposta é esta sequência. Infelizmente, o livro não tinha cabras. -::: - -::: übung aufgabe-fibonacci -titel: Números de Fibonacci -auftrag: Pergunta quantos números de Fibonacci devem ser mostrados. Depois mostra exatamente esses, cada um na sua linha. Podes partir do princípio de que é introduzido pelo menos 2. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Cada número novo é a soma dos dois anteriores. Por isso tens sempre de guardar os dois últimos números. -tipp: Guarda os dois últimos números em \`numero1\` e \`numero2\` e mostra os dois antes do ciclo. O ciclo começa em \`int i = 2\`. Lá dentro calculas \`int numero3 = numero1 + numero2\`, mostras e depois avanças: \`numero1 = numero2\` e \`numero2 = numero3\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-fibonacci-java -titel: Números de Fibonacci em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 5 -> 1 | 1 | 2 | 3 | 5 -test: 8 -> 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 -test: 2 -> 1 | 1 -braucht: forSchleife -tipp: Os dois primeiros números mostras antes do ciclo. O ciclo \`for\` começa então em \`int i = 2\`. -tipp: No corpo: \`int numero3 = numero1 + numero2;\`, mostrar, depois \`numero1 = numero2;\` e \`numero2 = numero3;\`. -lösung: aufgabe-fibonacci-loesung.visustruct -::: - -::: quiz -? Porque é que no ciclo \`numero1 = numero2\` tem de vir antes de \`numero2 = numero3\`? -- [ ] Porque senão o Java não permite as atribuições -- [x] Porque senão o valor antigo de numero2 é substituído antes de numero1 o receber -- [ ] A ordem não importa -> Ao contrário, numero1 e numero2 ficariam depois com o mesmo valor. Tal como na troca: primeiro guardar, depois substituir. -::: -`,r5=`--- -titel: Par ou ímpar -nach: 8 -stufe: 1 ---- - -Um número é par se não sobrar resto quando o divides por 2. O resto calcula-se com \`%\`: \`8 % 2\` dá 0, \`7 % 2\` dá 1. - -::: übung aufgabe-gerade -titel: Par ou ímpar -auftrag: Pede um número inteiro. Mostra se é par ou ímpar. Para 4 a saída é **4 é par**, para 7 **7 é ímpar**. -test: 4 -> 4 é par -test: 7 -> 7 é ímpar -test: 0 -> 0 é par -test: 15 -> 15 é ímpar -braucht: verzweigung -tipp: Uma decisão escolhe entre par e ímpar. Par quer dizer: divisível por 2 sem resto. -tipp: A condição é \`numero % 2 == 0\`. Na saída juntas o número e o texto com \`+\`, p. ex. \`numero + " é par"\`. -lösung: aufgabe-gerade-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-gerade-java -titel: Par ou ímpar em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 4 -> 4 é par -test: 7 -> 7 é ímpar -test: 0 -> 0 é par -test: 15 -> 15 é ímpar -braucht: verzweigung -tipp: Lês um número com \`int numero = scanner.nextInt();\`. Antes disso perguntas com \`System.out.println(…)\`. -tipp: \`if (numero % 2 == 0) { … } else { … }\`. A saída é \`System.out.println(numero + " é par");\`. -lösung: aufgabe-gerade-loesung.visustruct -::: -`,o5=`--- -titel: IVA -nach: 6 -stufe: 1 ---- - -Em Portugal continental, a quase tudo o que compras é somado 23 % de **IVA** (imposto sobre o valor acrescentado). A loja calcula com o preço sem IVA e soma o imposto por cima. Isso dá o preço com IVA que pagas na caixa. - -Um exemplo: compras um telemóvel dobrável que se abre e fica um tablet. Na etiqueta da loja estão 1000 euros sem IVA. Por cima vêm 23 %, ou seja, 230 euros. Na caixa pagas 1230 euros. A loja não pode ficar com os 230 euros: entrega-os às Finanças. - -::: grafik aufgabe-mehrwertsteuer.svg -Preço sem IVA mais IVA dá o preço com IVA. O IVA vai para as Finanças. -::: - -::: angeberwissen -Mééé, claro que a própria loja comprou o telemóvel: ao fabricante, por 800 euros mais 184 euros de IVA. Estes 184 euros chamam-se **IVA dedutível**, e a loja pode descontá-los dos 230 euros. Por isso só entrega 46 euros às Finanças. No fim, só uma pessoa paga o imposto todo: o cliente na caixa. Ou seja, tu. Eu, já agora, não pago imposto nenhum. Só como erva. -::: - -A taxa do imposto nunca muda enquanto fazes as contas. Por isso crias-a como **constante**: uma variável cujo valor não muda depois de definido. Escreves \`const\` à frente, por exemplo \`const double IVA = 0.23\`. Os nomes das constantes escrevem-se em maiúsculas para as reconheceres logo. No código Java isto passa a \`final double IVA = 0.23;\`. - -Se a taxa alguma vez mudar, só tens de alterar esta linha. - -::: übung aufgabe-mehrwertsteuer -titel: IVA -auftrag: Cria a constante \`IVA\` com o valor 0.23. Depois pede o preço sem IVA. Mostra primeiro o imposto e depois o preço com IVA, de cada vez só o número. - Para um preço sem IVA de 100, as saídas são **23** e **123**. -test: 100 -> 23 | 123 -test: 50 -> 11.5 | 61.5 -test: 0 -> 0 | 0 -tipp: O imposto é 23 por cento do preço sem IVA. O preço com IVA é o que pagas no fim. -tipp: O imposto é \`precoSemIva * IVA\`. O preço com IVA obténs somando o imposto ao preço sem IVA. Os dois valores são números decimais, portanto \`double\`. -lösung: aufgabe-mehrwertsteuer-loesung.visustruct -::: - -::: quiz -? Porque crias a taxa do imposto como constante? -- [ ] Porque as constantes são calculadas mais depressa -- [x] Porque o seu valor não deve mudar no programa -- [ ] Porque os números decimais só podem ser guardados como constantes -> Uma constante mantém o seu valor. Se a taxa alguma vez mudar, só alteras a linha com \`const\`. -::: -`,l5=`--- -titel: Média das notas -nach: 13 -stufe: 2 ---- - -Como te correu ultimamente? A média é a soma de todas as notas a dividir pelo número de notas. - -::: übung aufgabe-durchschnitt -titel: Média das notas -auftrag: Pergunta primeiro quantas notas vão ser introduzidas. Depois lê exatamente essas notas e mostra a média, só o número. - Para as notas 4 e 5, a média é **4.5**. -test: 2, 4, 5 -> 4.5 -test: 3, 3, 4, 5 -> 4 -test: 4, 3, 3, 4, 5 -> 3.75 -braucht: forSchleife -tipp: Precisas da soma de todas as notas e de quantas são. A média é a soma a dividir pela quantidade. -tipp: O ciclo for vai de \`int i = 0\` enquanto \`i < quantidade\`. Lá dentro lês uma nota e somas à soma. Guardas a média como número decimal: \`double media = soma * 1.0 / quantidade\`. O \`* 1.0\` garante que também o Java não faz uma divisão inteira. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-durchschnitt-java -titel: Média das notas em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 2, 4, 5 -> 4.5 -test: 3, 3, 4, 5 -> 4 -test: 4, 3, 3, 4, 5 -> 3.75 -braucht: forSchleife -tipp: \`for (int i = 0; i < quantidade; i++)\` lê exatamente as notas que foram indicadas antes. -tipp: Divide com \`double media = soma * 1.0 / quantidade;\`. Sem \`* 1.0\`, o Java divide dois \`int\` como inteiros, e 1.5 passa a 1. -lösung: aufgabe-durchschnitt-loesung.visustruct -::: -`,u5=`--- -titel: Verificar o PIN -nach: 12 -stufe: 2 ---- - -Numa caixa multibanco tens três tentativas para o teu PIN. Se escreveres um PIN errado três vezes, o cartão fica bloqueado. - -::: angeberwissen -John Shepherd-Barron, que instalou o primeiro multibanco em Londres em 1967, queria PINs de seis algarismos. Mas a mulher dele disse que só conseguia decorar quatro. É por isso que o teu PIN tem hoje quatro algarismos. -::: - -::: übung aufgabe-pin -titel: Verificar o PIN -auftrag: O PIN certo é 1234. Pede o PIN até estar certo ou até se terem gastado três tentativas. Depois mostra **PIN correto** ou **Cartão bloqueado**. -test: 1234 -> PIN correto -test: 1111, 1234 -> PIN correto -test: 1, 2, 1234 -> PIN correto -test: 1, 2, 3 -> Cartão bloqueado -braucht: doUntilSchleife, verzweigung -tipp: O ciclo termina em dois casos: quando o PIN está certo ou quando se gastaram três tentativas. Conta as tentativas. -tipp: O PIN é pedido pelo menos uma vez, por isso serve um ciclo do-while. Antes dele, cria \`int pin = 0\` e \`int tentativas = 0\`. O ciclo repete-se enquanto \`pin != 1234 && tentativas < 3\`. Depois do ciclo, uma decisão decide o que é mostrado. -lösung: aufgabe-pin-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-pin-java -titel: Verificar o PIN em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 1234 -> PIN correto -test: 1111, 1234 -> PIN correto -test: 1, 2, 1234 -> PIN correto -test: 1, 2, 3 -> Cartão bloqueado -braucht: doUntilSchleife, verzweigung -tipp: \`do { … } while (…);\` pergunta pelo menos uma vez. Depois do \`while (…)\` há um ponto e vírgula. -tipp: Cria antes \`int pin = 0;\` e \`int tentativas = 0;\`. No ciclo: \`int entrada = scanner.nextInt();\`, \`pin = entrada;\` e \`tentativas++;\`. A condição é \`pin != 1234 && tentativas < 3\`. -lösung: aufgabe-pin-java-loesung.visustruct -::: -`,m5=`--- -titel: Batalha naval -nach: 16 -stufe: 2 ---- - -No jogo da batalha naval, o mar é uma grelha. As colunas chamam-se A a E, as filas 1 a 5. No diagrama inicial, o mar é o array 2D \`mar\`: \`true\` quer dizer que há parte de um navio nesse quadrado. - -::: grafik schiffe-versenken.svg -Cinzento quer dizer \`true\`: aqui há um navio. Os pequenos números cinzentos são os índices no array; começam em 0. No jogo, pelo contrário, os quadrados chamam-se A a E e 1 a 5. -::: - -::: übung aufgabe-schiffe -titel: Batalha naval -auftrag: Mostra todos os quadrados que têm um navio, cada quadrado na sua linha, p. ex. **B1**. Percorre o mar fila a fila com dois ciclos encaixados. - Para o diagrama inicial aparecem **B1**, **C1**, **D1**, **E3**, **E4** e **A5**. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Percorre o mar com dois ciclos encaixados, tal como no cinema. Só mostras os quadrados que têm \`true\`. -tipp: O ciclo exterior conta \`fila\`, o interior \`coluna\`, os dois a partir de 0. Se houver um navio em \`mar[fila][coluna]\`, mostras a letra de \`colunas[coluna]\` e o número da fila: \`output: colunas[coluna] + (fila + 1)\`. Precisas do \`+ 1\` porque o jogo começa a contar em 1. -lösung: aufgabe-schiffe-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-schiffe-java -titel: Batalha naval em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -start: aufgabe-schiffe-start.visustruct -test: - -> B1 | C1 | D1 | E3 | E4 | A5 -braucht: forSchleife, verzweigung -tipp: Dois ciclos \`for\` um dentro do outro: fora a fila, dentro a coluna, ambos até \`.length\`. -tipp: \`if (mar[fila][coluna]) { System.out.println(colunas[coluna] + (fila + 1)); }\`. Os parênteses à volta de \`fila + 1\` fazem o Java calcular primeiro. -lösung: aufgabe-schiffe-loesung.visustruct -::: -`,c5=`--- -titel: Ementa -nach: 10 -stufe: 1 ---- - -Na cantina da escola pedes por número. O programa diz-te que prato corresponde ao número. - -::: übung aufgabe-speisekarte -titel: Ementa -auftrag: Pede um número. Para 1 mostra **Salada grega**, para 2 **Bacalhau à Brás** e para 3 **Wrap de falafel**. Para qualquer outro número mostra **Escolhe um número válido**. -test: 1 -> Salada grega -test: 2 -> Bacalhau à Brás -test: 3 -> Wrap de falafel -test: 7 -> Escolhe um número válido -braucht: fallauswahl -tipp: Para vários números fixos serve uma seleção. O que acontece com todos os outros números? -tipp: Lê o número com \`input: int prato "Que prato?"\`. A seleção verifica \`prato\`, e os casos chamam-se \`1\`, \`2\` e \`3\`. Todos os outros números vão parar ao caso \`default\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-speisekarte-java -titel: Ementa em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 1 -> Salada grega -test: 2 -> Bacalhau à Brás -test: 3 -> Wrap de falafel -test: 7 -> Escolhe um número válido -braucht: fallauswahl -tipp: Em Java isto é uma seleção com \`switch (prato) { … }\`. -tipp: Cada caso é assim: \`case 1 -> { System.out.println("…"); }\`. Para todos os outros números há \`default -> { … }\`. -lösung: aufgabe-speisekarte-loesung.visustruct -::: -`,d5=`--- -titel: Somar -nach: 2 -stufe: 1 ---- - -Define dois números, soma-os e mostra o resultado. - -::: übung aufgabe-summe -titel: Somar -auftrag: Dá a \`numero1\` o valor 4 e a \`numero2\` o valor 3. Calcula a soma numa terceira variável e mostra só a soma. -test: - -> 7 -tipp: Precisas de três variáveis: duas para os números e uma para o resultado. -tipp: Defines uma variável com uma instrução como \`int numero1 = 4\`. Na saída escreves o nome da variável sem aspas. -lösung: aufgabe-summe-loesung.visustruct -::: -`,h5=`--- -titel: Sortear quem limpa o quadro -nach: 15 -stufe: 2 ---- - -Quem é que limpa o quadro esta semana? Cinco nomes vão para um array, depois é sorteado um número. - -::: übung aufgabe-tafeldienst -titel: Sortear quem limpa o quadro -auftrag: Lê cinco nomes para um array de Strings. Depois pede um número sorteado de 1 a 5 e mostra **Limpa o quadro:** e o nome correspondente. - O número 1 corresponde ao primeiro nome, o 5 ao último. -test: Ada, Rui, Inês, Duarte, Eva, 3 -> Limpa o quadro: Inês -test: Ada, Rui, Inês, Duarte, Eva, 1 -> Limpa o quadro: Ada -test: Lara, Mário, Nuno, Olga, Pedro, 5 -> Limpa o quadro: Pedro -braucht: forSchleife -tipp: Primeiro, um ciclo lê os cinco nomes. Depois já não precisas de ciclo, só de olhar para uma posição. -tipp: Crias o array com \`String[] nomes = new String[5]\`. Atenção: o número sorteado começa em 1, o índice em 0. Por isso o nome está em \`nomes[sorteado - 1]\`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-tafeldienst-java -titel: Sortear quem limpa o quadro em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: Ada, Rui, Inês, Duarte, Eva, 3 -> Limpa o quadro: Inês -test: Ada, Rui, Inês, Duarte, Eva, 1 -> Limpa o quadro: Ada -test: Lara, Mário, Nuno, Olga, Pedro, 5 -> Limpa o quadro: Pedro -braucht: forSchleife -tipp: Um array para cinco nomes crias com \`String[] nomes = new String[5];\`. -tipp: No ciclo: \`nomes[i] = scanner.next();\`. O número 1 corresponde à posição 0, por isso mostras \`nomes[sorteado - 1]\`. -lösung: aufgabe-tafeldienst-loesung.visustruct -::: - -> Com \`int sorteado = (int) (Math.random() * 5) + 1\` também podes deixar o acaso sortear o número. Mas para a verificação automática precisamos de uma entrada fixa. -`,g5=`--- -titel: Calculadora -nach: 10 -stufe: 2 ---- - -Uma pequena calculadora: escreves dois números e um operador, e aparece o resultado. - -::: übung aufgabe-rechner -titel: Calculadora -auftrag: Pede dois números inteiros e depois um operador como texto: \`+\`, \`-\` ou \`*\`. Mostra o resultado. Para qualquer outro sinal mostra **Operador desconhecido**. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Operador desconhecido -braucht: fallauswahl -tipp: Lê os três valores. Depois, uma seleção sobre o operador decide o que é calculado. -tipp: Lês o operador com \`input: String operador "Operador"\`. A seleção verifica \`operador\`, os casos chamam-se \`"+"\`, \`"-"\` e \`"*"\`, e o último caso é \`default\`. Em cada caso, calcula primeiro numa variável e depois mostra-a, senão o \`+\` só junta os números. -lösung: aufgabe-rechner-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-rechner-java -titel: Calculadora em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 3, 4, + -> 7 -test: 10, 4, - -> 6 -test: 6, 7, * -> 42 -test: 1, 2, x -> Operador desconhecido -braucht: fallauswahl -tipp: O operador é um texto. Lês com \`String operador = scanner.next();\`. -tipp: \`switch (operador) { case "+" -> { … } … default -> { … } }\`. Com textos, os casos ficam entre aspas. -lösung: aufgabe-rechner-loesung.visustruct -::: -`,p5=`--- -titel: Menu de aluguer -nach: 18 -stufe: 2 ---- - -Na máquina de aluguer podes reservar vários veículos, um a seguir ao outro. O menu volta sempre até escolheres **0** para sair. - -::: übung aufgabe-verleih -titel: Menu de aluguer -auftrag: Pede sempre uma escolha: 1 = bicicleta elétrica, 2 = trotinete elétrica, 0 = sair. Para 1 mostra **Bicicleta reservada**, para 2 **Trotinete reservada** e para qualquer outro número **Escolha inválida**. - Para 0, o programa mostra **Adeus** e sai do ciclo com uma Interrupção. -test: 0 -> Adeus -test: 1, 2, 0 -> Bicicleta reservada | Trotinete reservada | Adeus -test: 2, 5, 1, 0 -> Trotinete reservada | Escolha inválida | Bicicleta reservada | Adeus -braucht: endlosschleife, aussprung -tipp: O menu é executado uma e outra vez até alguém escolher 0. Para isso serve bem um ciclo infinito com uma Interrupção. -tipp: Usa um ciclo infinito. Lá dentro vem primeiro a entrada \`input: int escolha "1 = bicicleta elétrica, 2 = trotinete elétrica, 0 = sair"\`, depois uma seleção sobre \`escolha\` com os casos \`0\`, \`1\`, \`2\` e \`default\`. O caso \`0\` tem a saída e, por baixo, a Interrupção. -lösung: aufgabe-verleih-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-verleih-java -titel: Menu de aluguer em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 0 -> Adeus -test: 1, 2, 0 -> Bicicleta reservada | Trotinete reservada | Adeus -test: 2, 5, 1, 0 -> Trotinete reservada | Escolha inválida | Bicicleta reservada | Adeus -braucht: endlosschleife, aussprung -tipp: \`while (true) { … }\` corre sem fim até aparecer um \`break;\`. -tipp: Em Java usa aqui \`if\`/\`else if\` em vez de \`switch\`: um \`break;\` dentro de um \`switch\` só sai do \`switch\`, não do ciclo. \`if (escolha == 0) { System.out.println("Adeus"); break; } else if (escolha == 1) { … }\`. -lösung: aufgabe-verleih-java-loesung.visustruct -::: -`,f5=`--- -titel: Treino de vocabulário -nach: 27 -stufe: 3 ---- - -O Ludwig está a aprender inglês. As palavras dele estão num ficheiro CSV, à esquerda em português, à direita em inglês: - -::: datei vocabulario.csv -Português;Inglês -cabra;goat -feno;hay -prado;meadow -::: - -Como só o ficheiro conhece as palavras, mais tarde podes simplesmente acrescentar linhas novas sem alterar o programa. - -::: angeberwissen -Foi Sebastian Leitner quem, em 1972, tornou conhecida a caixa de fichas com várias divisões: as fichas que sabes passam para a divisão seguinte e aparecem menos vezes, as erradas voltam para a primeira. Muitas apps de vocabulário ainda funcionam assim. -::: - -::: übung aufgabe-vokabeln -titel: Treino de vocabulário -code: java -auftrag: Pergunta cada palavra do ficheiro: mostra **Como se diz cabra em inglês?** e lê a resposta com \`scanner.next()\`. Se estiver certa, mostra **Certo!**, senão por exemplo **Errado, é goat.** - No fim aparece quantas estavam certas, por exemplo **2 de 3 certas**. -start: aufgabe-vokabeln-start.visustruct -test: goat, hay, meadow -> Como se diz cabra em inglês? | Certo! | Como se diz feno em inglês? | Certo! | Como se diz prado em inglês? | Certo! | 3 de 3 certas -test: cow, hay, meadow -> Como se diz cabra em inglês? | Errado, é goat. | Como se diz feno em inglês? | Certo! | Como se diz prado em inglês? | Certo! | 2 de 3 certas -test: goat, feno, prado -> Como se diz cabra em inglês? | Certo! | Como se diz feno em inglês? | Errado, é hay. | Como se diz prado em inglês? | Errado, é meadow. | 1 de 3 certas -braucht: whileSchleife, verzweigung -tipp: Salta a linha de cabeçalho. No ciclo, divide cada linha com \`split(";")\`: \`partes[0]\` é a palavra em português, \`partes[1]\` a palavra em inglês. -tipp: Os textos comparam-se com \`resposta.equals(partes[1])\`, não com \`==\`. Conta com \`int certas = 0;\` e \`int contagem = 0;\` antes do ciclo. -lösung: aufgabe-vokabeln-loesung.visustruct -::: -`,b5=`--- -titel: Maior de idade? -nach: 8 -stufe: 1 ---- - -No cinema, na carta de condução ou para votar: muitas vezes interessa saber se alguém já tem 18 anos. - -::: übung aufgabe-volljaehrig -titel: Maior de idade? -auftrag: Pede a idade. Se a pessoa tiver 18 anos ou mais, mostra **maior de idade**, senão **menor de idade**. -test: 18 -> maior de idade -test: 35 -> maior de idade -test: 17 -> menor de idade -test: 6 -> menor de idade -braucht: verzweigung -tipp: Há duas saídas possíveis, por isso precisas de uma decisão. -tipp: Lê a idade com \`input: int idade "Quantos anos tens?"\`. A condição da decisão é \`idade >= 18\`. Garante que 18 já conta como maior de idade. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: - -E agora o mesmo em Java: - -::: übung aufgabe-volljaehrig-java -titel: Maior de idade? em Java -code: java -auftrag: Resolve agora em Java a tarefa de cima. As saídas ficam exatamente iguais. -test: 18 -> maior de idade -test: 35 -> maior de idade -test: 17 -> menor de idade -test: 6 -> menor de idade -braucht: verzweigung -tipp: Lê a idade com \`int idade = scanner.nextInt();\`. -tipp: \`if (idade >= 18) { … } else { … }\`, com um \`System.out.println(…)\` em cada ramo. -lösung: aufgabe-volljaehrig-loesung.visustruct -::: -`,x5=`--- -titel: Lançar o dado com MVC -nach: 40 -stufe: 3 ---- - -Constrói um jogo de dados com Model View Controller. Um botão **Lançar** lança o dado, e duas views mostram o resultado. - -O model já está pronto. Lança o dado e conta quantas vezes foi lançado e quantos seis saíram: - -\`\`\`java -class Dado { - int pontos = 1; - int lancamentos = 0; - int seis = 0; - - void lancar() { - pontos = (int) (Math.random() * 6) + 1; - lancamentos++; - if (pontos == 6) { - seis++; - } - } -} -\`\`\` - -A tua tarefa: - -1. Testa primeiro o model sem janela: lança dez vezes no \`main\` e depois mostra \`lancamentos\` e \`seis\`. -2. Escreve a view \`VistaPontos\`. Mostra o número que saiu num JLabel grande, por exemplo "4". -3. Escreve a view \`VistaEstatistica\`. Mostra por exemplo "Seis: 2 em 10 lançamentos". -4. O controller é o ouvinte do botão: manda o model lançar e passa os valores novos às duas views. - -**Terminaste quando …** - -- na consola, depois de dez lançamentos, \`lancamentos\` é 10 e \`seis\` está entre 0 e 10, -- cada clique em **Lançar** mostra um número novo de 1 a 6 na \`VistaPontos\`, -- a \`VistaEstatistica\` conta mais um lançamento depois de cada clique e conta bem os seis, -- no model não há nenhum \`JLabel\` e nas views não há nenhum \`Math.random\`. - -Extra: um botão **Novo jogo** põe tudo no início. O método para isso pertence ao model. - -::: ludwig -Lembra-te da regra da lição 40: no model não há um único \`JLabel\`. Se mudares o tamanho da letra ao lançar, isso pertence à view. -::: -`,v5=`--- -titel: Duplicar um número -nach: 2 -stufe: 1 ---- - -Uma variável pode mudar de valor. Aqui um número é duplicado. - -::: übung aufgabe-verdoppeln -titel: Duplicar um número -auftrag: Dá à variável \`numero\` o valor 4. Duplica-a numa segunda instrução, sem criar uma variável nova. Depois mostra **Número duplicado: 8**, em que o 8 vem da variável. -test: - -> Número duplicado: 8 -tipp: Duplicar quer dizer: vezes 2. Guardas o resultado outra vez na mesma variável. -tipp: \`numero = numero * 2\` calcula com o valor antigo e volta a guardar o resultado em \`numero\`. Juntas texto e uma variável com \`+\`. -lösung: aufgabe-verdoppeln-loesung.visustruct -::: -`,w5=`--- -titel: Struktogramm und Editor -bereich: Losfahren -kurz: Was ein Struktogramm ist, wie du den Editor bedienst und deine Programme speicherst. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Algorithmus und ein Struktogramm ist -- die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen -- im Editor Elemente einfügen, verschieben und löschen -- ein Struktogramm speichern und wieder öffnen -::: - -## Ein Plan für den Roboter - -Ein Roboter denkt nicht mit. Er tut genau das, was in seinem Programm steht, nicht mehr und nicht weniger. Bevor du ihn programmierst, brauchst du deshalb einen genauen Plan. So eine genaue Schritt-für-Schritt-Anleitung heißt **Algorithmus**. - -Ein **Struktogramm** zeichnet den Plan als Kästen. Du liest es von oben nach unten. Jeder Kasten ist ein Schritt. Erfunden haben es 1973 Isaac Nassi und Ben Shneiderman, deshalb heißt es auch **Nassi-Shneiderman-Diagramm**. - -::: diagramm vb-l00-sequenz-loesung.visustruct -Fahre vor, drehe nach rechts, fahre vor: drei Kästen, von oben nach unten. -::: - -::: angeberwissen -Das erste Programm für eine Maschine schrieb Ada Lovelace schon 1843, für eine Rechenmaschine, die nie fertig gebaut wurde. Sie ahnte damals schon, dass solche Maschinen einmal mehr können als rechnen, zum Beispiel Musik machen. Dein mBot2 kann beides. -::: - -## Drei Bausteine - -Jedes Programm, auch das für einen Roboter, besteht aus nur drei Bausteinen: - -| Baustein | Was er tut | Beispiel mit dem mBot2 | -|---|---|---| -| **Sequenz** | Schritte nacheinander | vorfahren, drehen, vorfahren | -| **Verzweigung** | je nach Bedingung das eine oder das andere | Ist die Wand nah? Dann drehen, sonst vorfahren. | -| **Wiederholung** | Schritte mehrmals | viermal das Gleiche tun | - -Im Struktogramm sieht man die Bausteine sofort: Die Verzweigung hat oben ein Dreieck und zwei Spalten: links **true** (wahr), rechts **false** (falsch). Die Wiederholung (Schleife) umschließt ihre Kästen wie ein gekipptes L. - -::: diagramm vb-l00-bausteine-loesung.visustruct -Alle drei Bausteine: erst ein Kasten, dann eine Schleife, darin eine Verzweigung. -::: - -## Der Editor - -Der [Struktogramm-Editor](#zeige-editor) besteht aus mehreren Bereichen. Fahre mit der Maus über ein blaues Wort oder tippe es an, dann leuchtet der Bereich auf: - -- **Links die [Elemente](#zeige-elemente):** alle Bausteine zum Hineinziehen. In der Gruppe **mBot2-Befehle** liegen die Befehle für den mBot2 wie **fahre vor** und **drehe rechts**. -- **In der Mitte das [Struktogramm](#zeige-struktogramm):** Ein neues Diagramm enthält nur einen leeren Platzhalter, erkennbar an **ø**. -- **Unten der [Objektinspektor](#zeige-objektinspektor):** Hier änderst du den Text des ausgewählten Kastens, zum Beispiel \`mbot.forward(30)\` statt \`mbot.forward()\`. Die Linie mit dem Griff darüber kannst du nach oben oder unten ziehen. -- **Darüber die [Werkzeuge](#zeige-werkzeuge):** Rückgängig, Kopieren, Löschen, Exportieren und rechts die **Simulation**. - -So baust du: - -- **Einfügen:** Zieh ein Element aus den Elementen auf das Struktogramm. Auf den Platzhalter **ø** ersetzt es ihn. Auf die obere Hälfte eines Kastens kommt es davor, auf die untere Hälfte dahinter. Eine blaue Linie zeigt dir, wo es landet. -- **Text ändern:** Doppelklick auf einen Kasten, auf dem Tablet Doppeltipp. Dann tippst du direkt im Struktogramm, **Enter** übernimmt. -- **Verschieben:** einen Kasten an eine andere Stelle ziehen. -- **Löschen:** Kasten anklicken und Entf drücken oder auf den [Mülleimer](#zeige-loeschen) klicken. -- **Rückgängig:** Strg+Z, am Mac ⌘Z. - -> 🧩 **Lieber Blöcke wie in Scratch?** Klicke in den Werkzeugen auf [Blöcke](#zeige-bloecke). Dann siehst du dasselbe Programm als Blöcke, die du zusammensteckst. Zahlen tippst du direkt in die weißen Felder, Sensoren ziehst du hinein. Mit **Struktogramm** kommst du zurück. Es bleibt dasselbe Programm, du kannst jederzeit wechseln. - -::: übung vb-erster-plan -titel: Um die Ecke -auftrag: Baue ein Struktogramm: Der mBot2 fährt vor, dreht nach rechts, fährt vor, dreht nach links und fährt noch einmal vor. Starte danach die Simulation und schau zu. -fahrt: forward, turnRight, forward, turnLeft, forward -braucht: anweisung -tipp: Zieh **fahre vor** auf den Platzhalter ø. Die nächsten Befehle ziehst du jeweils auf die untere Hälfte des letzten Kastens. -tipp: Von oben nach unten: **fahre vor**, **drehe rechts**, **fahre vor**, **drehe links**, **fahre vor**. -lösung: vb-erster-plan-loesung.visustruct -::: - -> Bist du fertig, klickst du in der Übung auf **Prüfen**. VisuStruct lässt dein Struktogramm dann laufen und schaut nach, ob der mBot2 genau so fährt wie verlangt. Später prüft es dein Programm oft in mehreren Welten, zum Beispiel einmal mit Wand und einmal ohne. Klappt es nicht, helfen dir die **Tipps**. - -## Speichern und Öffnen - -- **[Speichern](#zeige-speichern)** (Strg+S, am Mac ⌘S): Das Struktogramm wird als Datei mit der Endung \`.visustruct\` gespeichert. Den Dateinamen schlägt der [Titel](#zeige-titel) über dem Struktogramm vor. -- **[Öffnen](#zeige-oeffnen)** (Strg+O, am Mac ⌘O): eine gespeicherte Datei wieder laden. - -In der Spalte [📁 Dateien](#zeige-dateien) richtest du einmal einen Ordner ein, deinen **Workspace**. Dort landen alle deine Programme und auch dein Lernstand. Den Ordner kannst du mitnehmen und zu Hause weitermachen. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektionen [„Was ist ein Struktogramm?“](?visustruct&lektion=01-was-ist-ein-struktogramm), [„Der Editor“](?visustruct&lektion=02-der-editor) und [„Speichern, Öffnen, Exportieren“](?visustruct&lektion=03-speichern-oeffnen-exportieren). Sie öffnen sich in einem neuen Fenster. - -## Spiel: Welcher Baustein? - -::: spiel frage -titel: Spiel: Welcher Baustein? -intro: Ludwig beschreibt, was sein mBot2 tun soll. Ist das eine Sequenz, eine Verzweigung oder eine Wiederholung? Sechs Runden. -antworten: Sequenz | Verzweigung | Wiederholung - -runde: -frage: Der mBot2 fährt vor, dreht sich nach rechts und fährt wieder vor. -richtig: Sequenz -> Drei Schritte nacheinander, jeder genau einmal. - -runde: -frage: Ist die Wand nah, dreht er sich. Sonst fährt er vor. -richtig: Verzweigung -> Je nach Bedingung passiert das eine oder das andere. - -runde: -frage: Er fährt viermal 10 cm vor. -richtig: Wiederholung -> Derselbe Schritt kommt mehrmals dran. - -runde: -frage: Solange keine Linie kommt, fährt er weiter. -richtig: Wiederholung -> „Solange“ heißt: immer wieder, bis die Bedingung nicht mehr stimmt. - -runde: -frage: Steht er auf Rot, piept er. -richtig: Verzweigung -> Nur wenn die Bedingung stimmt, piept er. - -runde: -frage: Er zeigt „Hallo“ auf dem Bildschirm und spielt danach einen Ton. -richtig: Sequenz -> Zwei Schritte nacheinander, ohne Bedingung und ohne Wiederholung. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Algorithmus und ein Struktogramm ist. → Ein Plan für den Roboter -- Ich kann die drei Grundbausteine Sequenz, Verzweigung und Wiederholung erkennen. → Drei Bausteine -- Ich kann im Editor Elemente einfügen, verschieben und löschen. → Der Editor -- Ich kann ein Struktogramm speichern und wieder öffnen. → Speichern und Öffnen -::: - -## Wissenstest - -::: quiz -? Was ist ein Algorithmus? -→ Ein Plan für den Roboter -- [ ] ein Bauteil des mBot2 -- [x] eine genaue Schritt-für-Schritt-Anleitung -- [ ] eine Programmiersprache -> Ein Algorithmus sagt genau, was in welcher Reihenfolge passiert. Das Struktogramm zeichnet ihn. -? Welcher Baustein entscheidet je nach Bedingung? -→ Drei Bausteine -- [ ] die Sequenz -- [x] die Verzweigung -- [ ] die Wiederholung -> Die Verzweigung hat oben ein Dreieck und zwei Spalten für true und false. -? Du ziehst **fahre vor** auf die untere Hälfte eines Kastens. Wo landet es? -→ Der Editor -- [ ] davor -- [x] dahinter -- [ ] es ersetzt den Kasten -> Obere Hälfte heißt davor, untere Hälfte dahinter. -? Welche Endung hat eine gespeicherte Struktogramm-Datei? -→ Speichern und Öffnen -- [ ] \`.java\` -- [x] \`.visustruct\` -- [ ] \`.png\` -> \`.png\` ist ein Bild zum Weitergeben. Weiterbearbeiten kannst du nur die \`.visustruct\`-Datei. -::: -`,y5=`--- -titel: Der mBot2 -bereich: Losfahren -kurz: Lerne den Roboter kennen, den du gleich programmierst. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Teile des mBot2 benennen -- erklären, wie der mBot2 Abstände misst -- erklären, wie der mBot2 eine Linie erkennt -- erklären, was Sensoren und Aktoren sind -- den mBot2 mit Elementen aus der Gruppe mBot2-Befehle steuern -- den mBot2 im Simulator fahren lassen -- den echten mBot2 per USB-C verbinden und wieder trennen -- prüfen, ob alle Sensoren und Aktoren funktionieren -::: - -## Hallo mBot2 - -::: mbot2 -fokus: -drehen: ja -::: - -Der **mBot2** ist ein kleiner Roboter der Firma Makeblock. In dieser Lektion machst du eine Tour durch alle seine Teile: - -- den [CyberPi]{teil=cyberpi}, den kleinen Computer hinten oben -- das durchsichtige [Shield mit Akku]{teil=shield} in der Mitte -- zwei [Motoren]{teil=motors} mit [Rädern]{teil=wheels} -- den [Ultraschallsensor]{teil=ultrasonic} vorn, der wie zwei Augen aussieht -- den [Liniensensor]{teil=lineSensor} unten an der Nase -- das türkise [Chassis]{teil=chassis}, das alles zusammenhält - -In VisuBot programmierst du ihn mit Struktogrammen. Jedes Programm kannst du zuerst im Simulator ausprobieren, auch ganz ohne echten Roboter. - -> Fahr mit der Maus über ein gelb unterstrichenes Wort, dann leuchtet das Teil im Modell auf. Tippst du darauf, fährt die Kamera hin. Das Modell kannst du mit der Maus oder dem Finger drehen und mit dem Mausrad heranzoomen. - -## Der CyberPi - -::: mbot2 -fokus: cyberpi, screen, joystick, buttons, leds, lightSensor, microphone -ansicht: hinten -::: - -Der [CyberPi]{teil=cyberpi,screen,joystick,buttons,leds,lightSensor,microphone} ist das Gehirn des mBot2: ein **Mikrocontroller**, also ein kleiner Computer ohne Tastatur. Er führt dein Programm aus. Er liegt quer hinten oben auf dem Roboter und lässt sich auch abnehmen. - -Auf ihm ist schon eine Menge eingebaut: - -- ein farbiger [Bildschirm]{teil=screen}, auf dem Text und Bilder erscheinen -- ein [Joystick]{teil=joystick}, den du in vier Richtungen drücken kannst -- zwei [Tasten]{teil=buttons}, eine mit Dreieck und eine mit Quadrat, und an der Seite neben dem USB-Anschluss die Home-Taste -- fünf bunte [LEDs]{teil=leds} als Lichtleiste an der Rückseite -- ein [Lichtsensor]{teil=lightSensor} und ein [Mikrofon]{teil=microphone} - -Dazu kommen ein Lautsprecher und ein Lagesensor, die du von außen nicht siehst. Der Lagesensor merkt, ob der CyberPi gekippt oder gedreht wird. - -> Das Modell ist nach Fotos nachgebaut. Schau dir deinen eigenen mBot2 an und vergleiche. - -## Bildschirm, LEDs und Lautsprecher - -::: mbot2 -fokus: screen, leds -ansicht: hinten -::: - -Mit dem [Bildschirm]{teil=screen} und den fünf [LEDs]{teil=leds} zeigt dir der mBot2, was er gerade tut. Jede LED kann in fast jeder Farbe leuchten, weil sie Rot, Grün und Blau mischt. Darum heißen sie **RGB-LEDs**. - -Später lässt du die LEDs mit \`mbot.setLed(255, 0, 0)\` rot leuchten. Die drei Zahlen sind Rot, Grün und Blau, jeweils von 0 bis 255. - -Im [CyberPi]{teil=cyberpi} steckt außerdem ein kleiner **Lautsprecher**. Mit \`mbot.playTone(440, 300)\` spielt er einen Ton: 440 Schwingungen pro Sekunde (Hertz), 300 Millisekunden lang. - -## Licht und Geräusche messen - -::: mbot2 -fokus: lightSensor, microphone -ansicht: oben -::: - -Der [Lichtsensor]{teil=lightSensor} misst, wie hell es ist. Das [Mikrofon]{teil=microphone} misst, wie laut es ist. So kann der mBot2 zum Beispiel losfahren, wenn du in die Hände klatschst. - -## Tasten und Joystick - -::: mbot2 -fokus: joystick, buttons -ansicht: oben -::: - -Die [Tasten]{teil=buttons} A und B und der [Joystick]{teil=joystick} sind auch Sensoren: Sie merken, ob du sie drückst. Dein Programm kann zum Beispiel warten, bis du A drückst, und erst dann losfahren. Mit dem Joystick lenkst du den mBot2 wie mit einer Fernbedienung. - -## Der Lagesensor - -::: mbot2 -fokus: cyberpi -drehen: ja -::: - -Im [CyberPi]{teil=cyberpi} steckt ein Sensor, den du nicht siehst: der **Lagesensor** (ein Gyroskop mit Beschleunigungssensor). Er merkt, ob der mBot2 nach vorn, nach hinten oder zur Seite geneigt ist, wie weit er sich gedreht hat und ob ihn jemand schüttelt. Dein Handy hat so einen Sensor auch: Darum dreht sich das Bild, wenn du es quer hältst. - -## Strom: das Shield mit Akku - -::: mbot2 -fokus: shield, powerSwitch -ansicht: seite -::: - -Das große durchsichtige Gehäuse ist das [mBot2-Shield]{teil=shield}. Durch den Deckel siehst du den grauen **Akku**, der den Roboter mit Strom versorgt. Hinten am Shield stecken die Kabel der Motoren (M1 und M2) und des Ultraschallsensors. - -Links an der Seite ist der [Ein-Aus-Schalter]{teil=powerSwitch} mit der Aufschrift ON/OFF. Daneben liegen zwei Buchsen S1 und S2 für kleine Servomotoren. Schalte den mBot2 aus, wenn du ihn nicht brauchst, dann hält der Akku länger. Geladen wird er über das USB-Kabel am CyberPi. - -## Motoren und Räder - -::: mbot2 -fokus: motors, wheels -ansicht: seite -::: - -Zwei [Motoren]{teil=motors} treiben die beiden [Räder]{teil=wheels} an, jeder sein eigenes. Du siehst sie von unten: silberne Motoren in hellblauen Getrieben. - -- Drehen sich beide Räder gleich schnell vorwärts, fährt der mBot2 **geradeaus**. -- Dreht sich ein Rad vorwärts und das andere rückwärts, dreht er sich **auf der Stelle**. - -Die Motoren sind **Encoder-Motoren**: Sie zählen mit, wie weit sich das Rad gedreht hat. Darum weiß der mBot2, wann er genau 10 cm gefahren ist oder sich genau um 90° gedreht hat. - -## Der Ultraschallsensor - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Vorn sitzt der schwarze [Ultraschallsensor]{teil=ultrasonic}. Er sieht aus wie zwei Augen, ist aber eher ein Ohr: Der eine Kreis schickt einen sehr hohen Ton los, den wir nicht hören. Der andere wartet auf das Echo. Je länger das Echo braucht, desto weiter ist die Wand weg. - -So misst der mBot2 Abstände in Zentimetern. Die Ringe um die Kreise können außerdem blau leuchten. - -::: angeberwissen -Fledermäuse machen es genau wie der Ultraschallsensor: Sie rufen so hoch, dass wir es nicht hören, und lauschen auf das Echo. Schall ist etwa 343 Meter pro Sekunde schnell. Steht eine Wand einen Meter vor dem mBot2, ist das Echo schon nach knapp 6 Tausendstel Sekunden zurück. -::: - -## Unter dem Roboter - -::: mbot2 -fokus: lineSensor, caster -ansicht: unten -::: - -Jetzt schaust du von unten. Ganz vorn schaut die schwarze Platine des [Liniensensors]{teil=lineSensor} heraus. Er hat **vier** kleine Fühler nebeneinander. Jeder leuchtet den Boden an und misst, wie viel Licht zurückkommt. Auf einer schwarzen Linie kommt wenig zurück, auf hellem Boden viel. So erkennt der mBot2, ob er auf einer Linie fährt. - -Der Sensor heißt **Quad-RGB-Sensor**, weil er noch mehr kann: Er erkennt auch **Farben**, zum Beispiel ein rotes oder grünes Feld auf dem Boden. - -Die [Kugelrolle]{teil=caster} dahinter ist das dritte Bein. Sie hat keinen Motor und rollt einfach in jede Richtung mit. - -## Das Chassis - -::: mbot2 -fokus: chassis -::: - -Das [Chassis]{teil=chassis} ist der türkise Rahmen aus Aluminium. Er hält alle Teile zusammen. Vorn hat er zwei runde „Ohren“, hinten ein großes **M** für Makeblock. Die vielen Löcher sind kein Zufall: Dort kannst du weitere Teile anschrauben. - -## Sensoren und Aktoren - -Ein Roboter hat zwei Arten von Teilen: - -- **Sensoren** messen etwas: den Abstand, eine Linie, eine Farbe, die Helligkeit, die Lautstärke, die Neigung oder ob eine Taste gedrückt ist. -- **Aktoren** tun etwas: Die Motoren bewegen die Räder, die LEDs leuchten, der Bildschirm zeigt etwas an, der Lautsprecher piept. - -Das Wort kommt vom lateinischen *agere*, „handeln“: Aktoren handeln, Sensoren (von *sentire*, „fühlen“) fühlen. - -Dein Programm liest die Sensoren und steuert die Aktoren. Das kennst du schon als Eingabe, Verarbeitung und Ausgabe. - -## Finde die Bauteile - -Jetzt bist du dran: Klicke im Modell auf das gesuchte Teil. Liegst du richtig, kommt die nächste Frage. - -::: mbot2quiz -- ultrasonic: Womit misst der mBot2, wie weit die Wand weg ist? -- screen: Wo erscheint Text, den dein Programm ausgibt? -- wheels: Was bewegt den mBot2 vorwärts? -- lineSensor: Was erkennt eine schwarze Linie auf dem Boden? (Tipp: Dreh das Modell.) -- powerSwitch: Wo schaltest du den mBot2 ein und aus? -- leds: Was leuchtet bei \`mbot.setLed(255, 0, 0)\` rot? -fertig: Super, du kennst dich am mBot2 aus! -::: - -## Befehle für den mBot2 - -Unter den [Elementen](#zeige-elemente) gibt es in VisuBot eine eigene Gruppe **mBot2-Befehle**. Jeder Kasten darin ist eine Anweisung an den Roboter: - -| Element | Text im Kasten | Was passiert | -|---|---|---| -| fahre vor | \`mbot.forward()\` | 10 cm vorwärts | -| fahre zurück | \`mbot.backward()\` | 10 cm rückwärts | -| drehe rechts | \`mbot.turnRight()\` | 90° nach rechts drehen | -| drehe links | \`mbot.turnLeft()\` | 90° nach links drehen | -| LEDs an | \`mbot.setLed(255, 0, 0)\` | die LEDs leuchten rot | - -In die Klammern darfst du auch eine Zahl schreiben: \`mbot.forward(30)\` fährt 30 cm, \`mbot.turnRight(45)\` dreht nur 45°. - -> Die Anweisungen sind echtes Java. \`mbot\` ist der Roboter, hinter dem Punkt steht, was er tun soll. - -## Erste Fahrt - -Starte nach dem Bauen die [Simulation](#zeige-simulation). Rechts erscheint die VisuBot-Welt mit dem mBot2. Das Gitter auf dem Boden hat Kästchen von 10 cm, also genau ein **fahre vor**. - -::: übung vb-gerade -titel: Geradeaus -auftrag: Ziehe fünfmal **fahre vor** in das Struktogramm. Starte dann die Simulation und schau zu, wie der mBot2 50 cm geradeaus fährt. -fahrt: 5 x (forward) -tipp: Die Gruppe mBot2-Befehle findest du unter den normalen Elementen. -tipp: Fünf Kästen \`mbot.forward()\` untereinander. Jeder fährt 10 cm. -lösung: vb-gerade-loesung.visustruct -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - mbot.forward(60); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,0 -> Zwei Felder nach vorn, nach rechts drehen, ein Feld weiter. - -runde: - mbot.forward(30); - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,1 -> Ein Feld nach vorn, dann schaut er nach links und fährt zwei Felder. - -runde: - mbot.turnRight(); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Zweimal rechts drehen heißt: Er schaut nach hinten. Dann fährt er ein Feld zurück, nach unten. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: .... | .... | .^.. -ziel: 2,2 -> Hoch, nach rechts, und nach der zweiten Drehung schaut er nach unten. -::: - -## Den echten mBot2 verbinden - -::: mbot2 -fokus: cyberpi, powerSwitch, joystick, buttons -ansicht: seite -::: - -Alles, was du im Simulator baust, kann auch der echte mBot2 fahren. So verbindest du ihn: - -1. Steck ein **USB-C-Kabel** in deinen Computer (zum Beispiel ein MacBook) und das andere Ende in den USB-C-Anschluss rechts am [CyberPi]{teil=cyberpi}, neben der Home-Taste. -2. Schieb den [Schiebeschalter ON/OFF]{teil=powerSwitch} links am Shield auf ON. Der Bildschirm des CyberPi leuchtet. -3. Auf dem Bildschirm erscheint ein Menü, in dem **neu starten** markiert ist. Drück den [Joystick]{teil=joystick} wie eine Taste nach unten, um das zu bestätigen. -4. Nach dem Neustart steht dort „Press B to start“. Drück **Taste B**, das ist die [Taste mit dem Dreieck]{teil=buttons}. -5. Öffne VisuStruct in **Chrome** oder **Edge**. Safari und das iPad können keine USB-Geräte ansprechen. -6. Sobald der CyberPi hochgefahren ist, klick oben auf **🔌 mBot2** (oder im Zahnrad auf „Mit mBot2 verbinden“). -7. Chrome zeigt eine Liste mit Anschlüssen. Wähle den Eintrag **USB Serial** (zum Beispiel „USB Serial (cu.usbserial-110)“). Er steht oft ganz unten, eventuell musst du nach unten scrollen. Dann klick auf **Verbinden**. -8. Der CyberPi startet kurz neu (⏳). Dann steht „Hallo VisuBot!“ auf seinem Bildschirm und der Knopf zeigt 🟢. - -Jetzt fährt der mBot2 bei jedem Schritt der Simulation mit. Stell ihn auf den Boden und lass ihm Platz! - -> Fertig? Klick noch einmal auf **🟢 mBot2**. Dann hält er an, zeigt „Bis bald!“ und gibt den Anschluss frei. Erst danach das Kabel ziehen. - -> Ganz ohne Kabel fahren? Das lernst du in Lektion 2 bei **Ohne Kabel fahren**. - -## Den mBot2 testen - -Ist der mBot2 verbunden, erscheint unter der Welt **🔧 mBot2 testen**. Klapp es auf: - -- Mit den Knöpfen probierst du jeden Aktor einmal aus: LEDs, Ton, Text auf dem Bildschirm und die Räder. Heb den mBot2 dafür hoch, damit er nicht vom Tisch fährt. -- Darunter stehen alle Sensoren mit ihren Werten, und die laufen live mit. Halte die Hand vor den Ultraschallsensor, drück Taste A, neige ihn, klatsch in die Hände oder stell ihn auf ein rotes Blatt. - -Ändert sich ein Wert nicht, obwohl du etwas tust, stimmt etwas nicht. Dann sag deiner Lehrkraft Bescheid, bevor du programmierst. - -## Spiel: Sensor oder Aktor? - -::: spiel frage -titel: Spiel: Sensor oder Aktor? -intro: Misst das Bauteil etwas, oder tut es etwas? Zehn Runden. -antworten: Sensor | Aktor - -runde: -frage: Der Ultraschallsensor misst, wie weit die Wand weg ist. -richtig: Sensor -> Er misst etwas: den Abstand. - -runde: -frage: Die Motoren drehen die Räder. -richtig: Aktor -> Sie tun etwas: Sie bewegen den mBot2. - -runde: -frage: Die LEDs leuchten rot. -richtig: Aktor -> Leuchten ist etwas tun, nicht messen. - -runde: -frage: Der Liniensensor erkennt das schwarze Klebeband. -richtig: Sensor -> Er misst, wie viel Licht vom Boden zurückkommt. - -runde: -frage: Der Lautsprecher piept. -richtig: Aktor -> Er gibt einen Ton aus. - -runde: -frage: Das Mikrofon hört dein Klatschen. -richtig: Sensor -> Es misst die Lautstärke. - -runde: -frage: Der Bildschirm zeigt „Hallo VisuBot!“. -richtig: Aktor -> Anzeigen ist eine Ausgabe. - -runde: -frage: Taste A merkt, dass du drückst. -richtig: Sensor -> Tasten sind Sensoren: Sie melden, ob sie gedrückt sind. - -runde: -frage: Der Lagesensor merkt, dass der mBot2 schief steht. -richtig: Sensor -> Er misst die Neigung. - -runde: -frage: Die Ringe am Ultraschallsensor leuchten blau. -richtig: Aktor -> Gemein! Das Bauteil ist ein Sensor, aber das Leuchten der Ringe ist eine Ausgabe. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Teile des mBot2 benennen. → Hallo mBot2 -- Ich kann erklären, wie der mBot2 Abstände misst. → Der Ultraschallsensor -- Ich kann erklären, wie der mBot2 eine Linie erkennt. → Unter dem Roboter -- Ich kann erklären, was Sensoren und Aktoren sind. → Sensoren und Aktoren -- Ich kann den mBot2 mit Elementen aus der Gruppe mBot2-Befehle steuern. → Befehle für den mBot2 -- Ich kann den mBot2 im Simulator fahren lassen. → Erste Fahrt -- Ich kann den echten mBot2 per USB-C verbinden und wieder trennen. → Den echten mBot2 verbinden -- Ich kann prüfen, ob alle Sensoren und Aktoren funktionieren. → Den mBot2 testen -::: - -## Wissenstest - -::: quiz -? Ordne jedes Teil seiner Aufgabe zu. -→ Hallo mBot2 -= Ultraschallsensor -> misst den Abstand -= Motoren -> bewegen die Räder -= CyberPi -> führt das Programm aus -= Liniensensor -> erkennt eine dunkle Linie -? Welche Teile sind Aktoren? -→ Sensoren und Aktoren -- [x] Motoren -- [ ] Ultraschallsensor -- [x] LEDs -- [ ] Liniensensor -> Aktoren tun etwas, Sensoren messen etwas. -? Wie misst der Ultraschallsensor den Abstand? -→ Der Ultraschallsensor -- [ ] Er fotografiert die Wand. -- [x] Er schickt einen sehr hohen Ton los und wartet auf das Echo. -- [ ] Er tastet die Wand mit seinen blauen Ringen ab. -> Je länger das Echo braucht, desto weiter ist die Wand weg. -? Woran erkennt der Liniensensor eine schwarze Linie? -→ Unter dem Roboter -- [x] Von der schwarzen Linie kommt wenig Licht zurück. -- [ ] Die Linie ist wärmer als der Boden. -- [ ] Er hört, wie die Räder über die Linie rollen. -> Jeder Fühler leuchtet den Boden an. Heller Boden wirft viel Licht zurück, eine schwarze Linie wenig. -? Was tut \`mbot.turnRight()\`? -→ Befehle für den mBot2 -- [ ] Der mBot2 fährt 10 cm nach rechts. -- [x] Der mBot2 dreht sich um 90° nach rechts. -- [ ] Die rechte LED geht an. -> Ohne Zahl in den Klammern dreht er sich um 90°. \`mbot.turnRight(45)\` dreht nur 45°. -? Im Struktogramm stehen fünf Kästen \`mbot.forward()\` untereinander. Wie weit fährt der mBot2 in der Simulation? -→ Erste Fahrt -- [ ] 5 cm -- [x] 50 cm -- [ ] 10 cm -> Jedes \`mbot.forward()\` fährt 10 cm, also ein Kästchen im Gitter. -? Du bist mit dem echten mBot2 fertig. Was machst du, bevor du das Kabel ziehst? -→ Den echten mBot2 verbinden -- [x] Noch einmal auf **🟢 mBot2** klicken und warten, bis „Bis bald!“ dasteht -- [ ] Den Schiebeschalter auf OFF schieben -- [ ] Nichts, das Kabel darf sofort raus -> Erst nach „Bis bald!“ ist der Anschluss frei. -? Du hältst die Hand vor den Ultraschallsensor, aber unter **🔧 mBot2 testen** ändert sich der Wert nicht. Was tust du? -→ Den mBot2 testen -- [ ] Trotzdem losprogrammieren -- [x] Der Lehrkraft Bescheid sagen, bevor du programmierst -- [ ] Den Wert in der Simulation von Hand ändern -> Ändert sich ein Wert nicht, obwohl du etwas tust, stimmt am Roboter etwas nicht. -::: -`,z5=`--- -titel: Das Quadrat -bereich: Losfahren -kurz: Vom langen Struktogramm zur dreifach verschachtelten Schleife. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen Ablauf erst ohne Schleife bauen -- Wiederholungen erkennen und durch eine For-Schleife ersetzen -- zwei Schleifen ineinander schachteln -- drei Schleifen ineinander schachteln -- mein Programm auf den mBot2 übertragen und ohne Kabel mit Taste A starten -::: - -## Ein Quadrat fahren - -Der mBot2 soll ein Quadrat mit 50 cm Seitenlänge fahren. Eine Seite kennst du schon: fünfmal **fahre vor**. Danach dreht er sich nach rechts, und die nächste Seite beginnt. - -::: übung vb-quadrat -titel: Das Quadrat -auftrag: Baue ein Struktogramm, mit dem der mBot2 ein Quadrat fährt: fünfmal **fahre vor**, dann **drehe rechts**. Und das viermal. -fahrt: 4 x (5 x (forward), turnRight) -tipp: Eine Seite besteht aus fünfmal fahre vor und einmal drehe rechts. -tipp: Insgesamt sind es 24 Kästen: viermal fünf \`mbot.forward()\` und danach jeweils \`mbot.turnRight()\`. -lösung: vb-quadrat-loesung.visustruct -::: - -Ganz schön viele Kästen, oder? Wenn du dich beim Zählen vertust, fährt der mBot2 kein Quadrat mehr. - -## Immer das Gleiche - -Schau dein Struktogramm genau an: Fünfmal **fahre vor** steht viermal da. Wenn sich etwas wiederholt, nimmt man eine **Schleife**. Wir wissen genau, wie oft gefahren wird, nämlich fünfmal. Dafür passt die For-Schleife. - -Ziehe eine For-Schleife ins Struktogramm und gib ihr diese drei Teile: - -- Start: \`int i = 0\` -- Bedingung: \`i < 5\` -- Schritt: \`i++\` - -In den Inhalt der Schleife kommt ein einziges **fahre vor**. Die Schleife zählt \`i\` von 0 bis 4, das sind fünf Durchläufe. - -\`i\` ist ein **Zähler**. Der Computer merkt sich darin, im wievielten Durchlauf er gerade ist. So einen Speicher mit Namen nennt man **Variable**, genauer lernst du sie in Lektion 3 kennen. Die drei Teile bedeuten: - -| Teil | Bedeutung | -|---|---| -| \`int i = 0\` | Der Zähler \`i\` ist eine ganze Zahl (\`int\`) und fängt bei 0 an. | -| \`i < 5\` | Solange \`i\` kleiner als 5 ist, läuft die Schleife noch einmal. | -| \`i++\` | Nach jedem Durchlauf wird \`i\` um 1 größer. | - -So zählt die Schleife: - -| Durchlauf | 1 | 2 | 3 | 4 | 5 | danach | -|---|---|---|---|---|---|---| -| \`i\` | 0 | 1 | 2 | 3 | 4 | 5 | -| \`i < 5\`? | true | true | true | true | true | false, fertig | - -::: übung vb-quadrat-schleife -titel: Seiten mit Schleife -auftrag: Ersetze in deinem Quadrat jede Reihe aus fünf **fahre vor** durch eine For-Schleife, die fünfmal fährt. Der mBot2 fährt danach genau dasselbe Quadrat. -fahrt: 4 x (5 x (forward), turnRight) -braucht: forSchleife -tipp: Start \`int i = 0\`, Bedingung \`i < 5\`, Schritt \`i++\`. Im Inhalt steht nur \`mbot.forward()\`. -tipp: Viermal untereinander: die For-Schleife und danach \`mbot.turnRight()\`. -lösung: vb-quadrat-schleife-loesung.visustruct -::: - -## Schleife in der Schleife - -Jetzt steht viermal dasselbe Paar da: eine For-Schleife und **drehe rechts**. Auch das ist eine Wiederholung! Packe beides in eine zweite For-Schleife, die viermal läuft. Eine Schleife in einer Schleife heißt **verschachtelte Schleife**. - -Jede Schleife braucht ihre eigene Zählvariable, sonst kommen sich die beiden in die Quere. Üblich ist: Die äußere Schleife zählt mit \`i\`, die innere mit \`j\`. Benenne deine innere Schleife also in \`j\` um. - -::: übung vb-quadrat-verschachtelt -titel: Quadrat verschachtelt -auftrag: Baue das Quadrat mit zwei ineinander geschachtelten For-Schleifen. Die äußere läuft viermal, einmal für jede Seite. Die innere läuft fünfmal, einmal für jeden Schritt. -fahrt: 4 x (5 x (forward), turnRight) -schleifentiefe: 2 -tipp: Außen: Start \`int i = 0\`, Bedingung \`i < 4\`, Schritt \`i++\`. Innen: \`int j = 0\`, \`j < 5\`, \`j++\`. -tipp: In die äußere Schleife kommen die innere Schleife mit \`mbot.forward()\` und darunter \`mbot.turnRight()\`. -lösung: vb-quadrat-verschachtelt-loesung.visustruct -::: - -Aus 24 Kästen sind vier geworden. Gehe das Programm in der Simulation mit **Schritt** durch und beobachte die Variablen \`i\` und \`j\`. - -::: quiz -? Wie oft führt der mBot2 im verschachtelten Quadrat \`mbot.forward()\` aus? -- [ ] 9-mal -- [x] 20-mal -- [ ] 5-mal -> Die innere Schleife läuft fünfmal, und das in jedem der vier Durchläufe der äußeren Schleife: 4 · 5 = 20. -::: - -## Vier Quadrate - -Jetzt wird es richtig schön: Der mBot2 soll vier Quadrate fahren. Nach jedem Quadrat dreht er sich einmal nach rechts. So entsteht ein großes Fenster mit Fensterkreuz. - -Du könntest dein Quadrat viermal untereinander kopieren und nach jedem Quadrat ein **drehe rechts** einfügen. Probier es ruhig aus! Merkst du es? Schon wieder steht dasselbe viermal da. - -::: ludwig -Immer wenn du Kästen kopierst, frag dich: Wiederholt sich hier etwas? Dann passt eine Schleife. -::: - -::: übung vb-vier-quadrate -titel: Vier Quadrate -auftrag: Lass den mBot2 vier Quadrate fahren. Nach jedem Quadrat dreht er sich einmal nach rechts. Benutze drei ineinander geschachtelte Schleifen. -fahrt: 4 x (4 x (5 x (forward), turnRight), turnRight) -schleifentiefe: 3 -tipp: Lege um dein verschachteltes Quadrat noch eine dritte For-Schleife, die viermal läuft. -tipp: Ganz außen zählt jetzt \`i\` (\`int i = 0\`, \`i < 4\`, \`i++\`). Die Schleifen darin heißen dann \`j\` und \`k\`. In die äußere Schleife kommen dein Quadrat und danach \`mbot.turnRight()\`. -lösung: vb-vier-quadrate-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektionen [„For-Schleife“](?visustruct&lektion=13-for-schleife) und [„Verschachteln“](?visustruct&lektion=14-verschachteln). Sie öffnen sich in einem neuen Fenster. - -::: quiz -? Wie oft fährt der mBot2 bei den vier Quadraten 10 cm vor? -→ Vier Quadrate -- [ ] 20-mal -- [ ] 60-mal -- [x] 80-mal -> 4 Quadrate · 4 Seiten · 5 Schritte = 80. Ohne Schleifen wären das 80 Kästen. -::: - -## Ohne Kabel fahren - -::: mbot2 -fokus: cyberpi, buttons -ansicht: oben -::: - -Bisher hängt der mBot2 am Kabel, solange er fährt. Du kannst dein Programm aber auch **auf den mBot2 übertragen**. Dann merkt er es sich und fährt ganz allein, zum Beispiel durch ein Labyrinth auf dem Boden. - -1. Schließ den mBot2 mit dem USB-Kabel an und schalte ihn ein, wie in Lektion 1. Das geht nur in **Chrome** oder **Edge**. -2. Öffne dein Programm, zum Beispiel die vier Quadrate. -3. Klick oben auf **⬆ Übertragen** und dann auf **Jetzt übertragen**. Wähle wieder **USB Serial**. -4. Warte, bis „Fertig!“ dasteht. Der mBot2 startet neu und zeigt **A = Start**. -5. Zieh das Kabel ab und setz den mBot2 an den Start. -6. Drück **Taste A**, das ist die [Taste mit dem Quadrat]{teil=buttons}. Jetzt fährt dein Programm los. - -Das Programm bleibt gespeichert, auch wenn du den mBot2 aus- und wieder einschaltest. Erst das nächste Übertragen ersetzt es. - -> Fährt er los, bevor du bereit bist? Keine Sorge: Er wartet immer auf Taste A. Drückst du A noch einmal, während er fährt, passiert nichts. Ist er fertig, startet A das Programm von vorn. - -## Spiel: Wie oft fährt er? - -::: spiel frage -titel: Spiel: Wie oft fährt er? -intro: Zähle mit, ohne die Simulation zu starten. Wie oft fährt oder dreht sich der mBot2? Sechs Runden. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(); - mbot.turnRight(); - } -frage: Wie oft fährt der mBot2 vor? -- 3-mal -- [x] 4-mal -- 5-mal -> \`i\` zählt 0, 1, 2 und 3. Das sind vier Durchläufe. - -runde: - for (int i = 1; i <= 4; i++) { - mbot.forward(); - } -frage: Wie oft fährt der mBot2 vor? -- 3-mal -- [x] 4-mal -- 5-mal -> Diesmal zählt \`i\` von 1 bis 4, wegen \`<=\`. Auch das sind vier Durchläufe. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Wie oft fährt der mBot2 vor? -- 8-mal -- [x] 15-mal -- 5-mal -> Die innere Schleife läuft in jedem der drei äußeren Durchläufe fünfmal: 3 · 5 = 15. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Wie oft dreht sich der mBot2 nach rechts? -- [x] 3-mal -- 15-mal -- 5-mal -> \`mbot.turnRight()\` steht in der äußeren Schleife, nicht in der inneren. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - } - mbot.turnRight(); -frage: Fährt der mBot2 ein Quadrat? -- Ja, mit 50 cm Seitenlänge. -- [x] Nein, er fährt 200 cm geradeaus und dreht sich erst am Ende. -- Ja, aber nur ein halbes. -> \`mbot.turnRight()\` steht unter der Schleife. Es läuft erst, wenn die Schleife fertig ist. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 4; j++) { - mbot.forward(30); - mbot.turnRight(); - } - mbot.turnRight(); - } -frage: Wie viele Quadrate fährt der mBot2? -- [x] 2 -- 4 -- 8 -> Die innere Schleife fährt ein Quadrat. Die äußere wiederholt das zweimal. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 fahren soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(50); - mbot.turnRight(); - } -frage: Soll ein Quadrat mit 50 cm Seitenlänge fahren. -fehler: 1 -besser: for (int i = 0; i < 4; i++) { -> Ein Quadrat hat vier Seiten. Mit \`i < 3\` fährt er nur drei. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(180); - } -frage: Soll ein Quadrat mit 50 cm Seitenlänge fahren. -fehler: 3 -besser: mbot.turnRight(); -> Mit 180° kehrt er um und fährt immer hin und her. Ein Quadrat braucht 90°. - -runde: - for (int i = 0; i < 4; i++) { - for (int i = 0; i < 5; i++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Soll ein Quadrat aus viermal fünf Schritten fahren. -fehler: 2 -besser: for (int j = 0; j < 5; j++) { -> Die innere Schleife braucht ihre eigene Zählvariable \`j\`. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnLeft(45); - } -frage: Soll ein Quadrat mit 30 cm Seitenlänge fahren. -fehler: 3 -besser: mbot.turnLeft(); -> Ein Quadrat braucht rechte Winkel, also 90°. Ohne Zahl dreht er sich 90°. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..... | ..^.. -ziel: 2,0 -> Dreimal ein Feld nach vorn. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 1,2 -> Ein ganzes Quadrat: Er kommt genau dort an, wo er losgefahren ist. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 2,2 -> Nur drei Seiten: Die vierte fehlt, also steht er rechts neben dem Start. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 2; j++) { - mbot.forward(30); - } - mbot.turnRight(); - } -karte: .... | .... | .... | ^... -ziel: 2,1 -> Die innere Schleife fährt zwei Felder, dann dreht er sich. Das Ganze zweimal: zwei Felder hoch, zwei nach rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann einen Ablauf erst ohne Schleife bauen. → Ein Quadrat fahren -- Ich kann Wiederholungen erkennen und durch eine For-Schleife ersetzen. → Immer das Gleiche -- Ich kann zwei Schleifen ineinander schachteln. → Schleife in der Schleife -- Ich kann drei Schleifen ineinander schachteln. → Vier Quadrate -- Ich kann mein Programm auf den mBot2 übertragen und ohne Kabel mit Taste A starten. → Ohne Kabel fahren -::: - -## Wissenstest - -::: quiz -? Der mBot2 soll noch ohne Schleife eine Seite von 50 cm fahren und sich dann drehen. Welche Kästen brauchst du? -→ Ein Quadrat fahren -- [ ] einmal \`mbot.forward()\` und einmal \`mbot.turnRight()\` -- [x] fünfmal \`mbot.forward()\` und einmal \`mbot.turnRight()\` -- [ ] fünfmal \`mbot.turnRight()\` -> Jedes \`mbot.forward()\` fährt 10 cm, fünf davon sind 50 cm. -? Eine For-Schleife hat den Start \`int i = 0\`, die Bedingung \`i < 5\` und den Schritt \`i++\`. Wie oft läuft sie? -→ Immer das Gleiche -- [ ] 4-mal -- [x] 5-mal -- [ ] 6-mal -> \`i\` zählt 0, 1, 2, 3, 4. Das sind fünf Durchläufe. -? Warum heißt die Zählvariable der inneren Schleife \`j\` und nicht auch \`i\`? -→ Schleife in der Schleife -- [ ] In einem Programm darf jeder Buchstabe nur einmal vorkommen. -- [x] Jede Schleife braucht ihre eigene Zählvariable, sonst kommen sich die beiden in die Quere. -- [ ] \`j\` zählt schneller als \`i\`. -> Würden beide mit \`i\` zählen, würde die innere Schleife die äußere durcheinanderbringen. -? Wie oft führt der mBot2 bei den vier Quadraten \`mbot.turnRight()\` aus? -→ Vier Quadrate -- [ ] 4-mal -- [ ] 16-mal -- [x] 20-mal -> In jedem Quadrat dreht er sich viermal, das sind 4 · 4 = 16. Dazu kommt nach jedem Quadrat noch eine Drehung: 16 + 4 = 20. -? Dein Programm ist übertragen und das Kabel ist ab. Wie startest du es? -→ Ohne Kabel fahren -- [ ] mit Taste B -- [x] mit Taste A -- [ ] mit **⬆ Übertragen** -> Nach dem Übertragen zeigt der mBot2 **A = Start** und wartet auf Taste A. -::: -`,I5=`--- -titel: PAP und Pseudocode -bereich: Losfahren -kurz: Den Plan für das Quadrat als Programmablaufplan und als Pseudocode aufschreiben und mit dem Struktogramm vergleichen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- einen PAP (englisch *flowchart*) für den mBot2 lesen und selbst zusammenbauen -- einen Plan als Pseudocode lesen -- Struktogramm, PAP und Pseudocode vergleichen -::: - -## Drei Arten, einen Plan aufzuschreiben - -Den Plan für das Quadrat kennst du als **Struktogramm**: eine Schleife, die viermal läuft, darin eine Seite fahren und rechts drehen. - -Es gibt noch zwei weitere Arten, denselben Plan aufzuschreiben. Beide wirst du im Unterricht und im Internet oft treffen: - -- den **Programmablaufplan**, kurz **PAP**, auf Englisch **flowchart**, auf Deutsch auch Flussdiagramm, -- den **Pseudocode**, einen Plan aus Text in normaler Sprache. - -Den mBot2 kannst du damit nicht direkt steuern. Aber mit allen drei kannst du einen Plan aufschreiben, bevor du ihn als Struktogramm oder in Java baust. - -## Der PAP - -Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind: - -- **Oval:** Start oder Ende. -- **Rechteck:** eine Anweisung, zum Beispiel *50 cm vorwärts fahren*. -- **Raute:** eine Frage mit zwei Ausgängen: **ja** und **nein**. -- **Parallelogramm:** eine Ein- oder Ausgabe, zum Beispiel ein Text auf dem Bildschirm. -- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. - -Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie an einem Pfeil, der **zurück nach oben** führt. So lange die Antwort in der Raute **nein** ist, geht es zurück, und die Schritte laufen noch einmal. - -> Vorsicht: Ein Pfeil darf im PAP überallhin zeigen, auch kreuz und quer. Bei großen Plänen wird das schnell unübersichtlich. Das nennt man **Spaghetticode**. Im Struktogramm kann das nicht passieren, weil es keine Pfeile gibt. - -## Übung: Das Quadrat als PAP - -Der mBot2 fährt eine Seite, dreht sich rechts und zählt die Seite mit. Nach vier Seiten zeigt er auf dem Bildschirm „Quadrat fertig!“. - -::: pap -titel: Übung: Das Quadrat als PAP -auftrag: Die Plätze im Plan sind leer. Lege jedes Element an seinen Platz. Die Form des Platzes hilft dir. -start: Start -anweisung: 50 cm vorwärts fahren -anweisung: rechts drehen -anweisung: Seite mitzählen -frage: 4 Seiten gefahren? | nein -> 50 cm vorwärts fahren -ausgabe: „Quadrat fertig!“ anzeigen -ende: Ende -erklärung: Solange noch keine vier Seiten gefahren sind, führt der Pfeil von der Raute zurück zu „50 cm vorwärts fahren“. Das ist die Schleife. Die Anzeige auf dem Bildschirm ist eine Ausgabe und steht deshalb im Parallelogramm. -legende: ja -::: - -**Eigene PAPs zeichnen:** Mit **VisuFlow** zeichnest du deinen PAP ganz leicht selbst, zum Beispiel für deine nächste Roboterfahrt. Die Symbole liegen fertig in einer Leiste: Antippen hängt das nächste Symbol an und verbindet es gleich mit einem Pfeil. Deinen PAP speicherst du als Datei und exportierst ihn als Bild oder PDF, zum Beispiel für dein Heft oder eine Präsentation. [VisuFlow öffnen](https://visustruct.visucode.de/app/?visuflow) - -## Pseudocode - -**Pseudocode** ist Text, der wie ein Programm aufgebaut ist, aber in normaler Sprache geschrieben wird. Feste Wörter wie WIEDERHOLE, WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Das Quadrat sieht so aus: - -\`\`\` -WIEDERHOLE 4-mal - 50 cm vorwärts fahren - rechts drehen -ENDE WIEDERHOLE -"Quadrat fertig!" anzeigen -\`\`\` - -Und so sieht derselbe Plan in Java aus: - -\`\`\`java -for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(); -} -mbot.showText("Quadrat fertig!"); -\`\`\` - -Pseudocode hat **keine feste Schreibweise**. Manche schreiben FÜR i VON 1 BIS 4, andere WIEDERHOLE 4-mal. Wichtig ist nur, dass jeder Mensch ihn ohne Erklärung versteht. Den Computer kannst du damit nicht steuern, dafür brauchst du Java. - -### Im Vergleich - -- **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen unübersichtlich. -- **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen WIEDERHOLE und ENDE WIEDERHOLE. Schnell geschrieben und schon nah an Java. - -::: angeberwissen -Määäh, wer hat die Ablaufpläne erfunden? Eine Frau und ihr Mann: **Lillian und Frank Gilbreth** stellten 1921 ihre „Process Charts“ vor, lange vor dem ersten Computer. Damit zeichneten sie Arbeitsabläufe in Fabriken auf, um sie einfacher zu machen. Lillian Gilbreth hatte einen Doktortitel in Psychologie und wurde 1965 als erste Frau in die amerikanische Akademie der Ingenieure gewählt. Programmierer haben die Idee später für ihre Pläne übernommen. -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„PAP und Pseudocode“](?visustruct&lektion=01-weitere-darstellungen) mit Kuchenbacken als PAP und dem Befehl GOTO. Sie öffnet sich in einem neuen Fenster. - -## Spiel: Welche Darstellung? - -::: spiel frage -titel: Spiel: Welche Darstellung? -intro: Ludwig beschreibt einen Plan für den mBot2, ohne zu sagen, wie er aufgeschrieben ist. Ist es das Struktogramm, der PAP oder der Pseudocode? Sechs Runden. -antworten: Struktogramm | PAP | Pseudocode - -runde: -frage: „Ein Pfeil führt von der Raute zurück zu ‚50 cm vorwärts fahren‘.“ -richtig: PAP -> Eine Schleife im PAP erkennst du am Pfeil zurück nach oben. - -runde: -frage: „Die Schleife sieht aus wie ein gekipptes L, darin stehen fahre vor und drehe rechts.“ -richtig: Struktogramm -> Das gekippte L ist die Schleife im Struktogramm. - -runde: -frage: „WIEDERHOLE 4-mal, darunter eingerückt zwei Zeilen.“ -richtig: Pseudocode -> Feste Wörter und Einrückung: Das ist Pseudocode. - -runde: -frage: „‚Quadrat fertig!‘ steht in einem schrägen Kasten.“ -richtig: PAP -> Der schräge Kasten ist das Parallelogramm für Ein- und Ausgabe. - -runde: -frage: „Es gibt keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit.“ -richtig: Struktogramm -> Ohne Pfeile kann im Struktogramm kein Sprung auf die falsche Stelle zeigen. - -runde: -frage: „Manche schreiben FÜR i VON 1 BIS 4, andere WIEDERHOLE 4-mal. Beides ist richtig.“ -richtig: Pseudocode -> Pseudocode hat keine feste Schreibweise. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Elemente eines PAP benennen. → Der PAP -- Ich kann das Quadrat selbst als PAP zusammenbauen. → Übung: Das Quadrat als PAP -- Ich kann einen Plan als Pseudocode lesen. → Pseudocode -- Ich kann Struktogramm, PAP und Pseudocode vergleichen. → Drei Arten, einen Plan aufzuschreiben -::: - -## Wissenstest - -::: quiz -? Woran erkennst du im PAP eine Schleife? -→ Der PAP -- [ ] An einem gekippten L -- [x] An einem Pfeil, der zurück nach oben führt -- [ ] Am Wort WIEDERHOLE -> Das gekippte L gehört zum Struktogramm, WIEDERHOLE zum Pseudocode. - -? Ordne jedem Symbol im PAP seine Bedeutung zu. -→ Der PAP -= Oval -> Start oder Ende -= Rechteck -> Anweisung -= Raute -> Frage mit ja und nein -= Parallelogramm -> Ein- oder Ausgabe -> „50 cm vorwärts fahren“ ist eine Anweisung, „Quadrat fertig!“ anzeigen eine Ausgabe. - -? Im Quadrat-PAP steht „4 Seiten gefahren?“ in der Raute. Wohin führt der Pfeil bei **nein**? -→ Übung: Das Quadrat als PAP -- [x] Zurück zu „50 cm vorwärts fahren“ -- [ ] Zum Ende -- [ ] Zu „Quadrat fertig!“ anzeigen -> Bei nein ist das Quadrat noch nicht fertig, also fährt der mBot2 die nächste Seite. - -? Was zeigt im Pseudocode, welche Zeilen zur Schleife gehören? -→ Pseudocode -- [ ] Ein Pfeil -- [x] Die Einrückung und das ENDE WIEDERHOLE -- [ ] Die Farbe -> Alles zwischen WIEDERHOLE und ENDE WIEDERHOLE ist eingerückt und wird wiederholt. - -? Kann der mBot2 Pseudocode direkt ausführen? -→ Drei Arten, einen Plan aufzuschreiben -- [ ] Ja, wie Java -- [x] Nein, Pseudocode ist nur ein Plan für Menschen -> Ausführen kann der mBot2 das Struktogramm oder Java. Pseudocode hilft beim Planen. -::: -`,k5=`--- -titel: Variablen und Ausgabe -bereich: Losfahren -kurz: Werte in Variablen speichern, den mBot2 damit fahren lassen und Ergebnisse auf dem Bildschirm zeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable anlegen und benutzen -- ein kurzes Java-Programm lesen und im Bereich Code tippen -- die Datentypen \`int\`, \`double\`, \`String\` und \`boolean\` unterscheiden -- mit zwei Variablen ein Rechteck in Java fahren -- mit \`mbot.showText\` ein Ergebnis auf dem Bildschirm zeigen -::: - -## Eine Variable für die Seite - -Mit \`mbot.forward(30)\` fährt der mBot2 30 cm am Stück. Fährst du damit ein Quadrat ohne Schleife, steht die 30 aber viermal im Programm. Soll das Quadrat größer werden, musst du sie an vier Stellen ändern. Besser ist es, die Seitenlänge **einmal** zu speichern und dann überall zu benutzen. - -Dafür gibt es **Variablen**. Eine Variable ist ein Kästchen mit einem Namen, in dem ein Wert liegt: - -\`\`\`java -int seite = 30; -mbot.forward(seite); -\`\`\` - -- \`int\` ist der **Datentyp**: eine ganze Zahl. -- \`seite\` ist der **Name**. Du darfst ihn selbst wählen. -- \`30\` ist der **Wert**. Das \`=\` legt ihn in das Kästchen. - -Wo danach \`seite\` steht, setzt der Computer den Wert ein. \`mbot.forward(seite)\` fährt also 30 cm. - -::: übung vb-variable-seite -titel: Quadrat mit Variable -auftrag: Lege in einer Anweisung die Variable \`int seite = 30\` an. Danach fährt der mBot2 ein Quadrat: viermal \`seite\` Zentimeter vor und nach rechts drehen. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: Die erste Anweisung ist \`int seite = 30\`. Darunter kommt eine For-Schleife, die viermal läuft. -tipp: In der Schleife stehen \`mbot.forward(seite)\` und \`mbot.turnRight()\`. -lösung: vb-variable-seite-loesung.visustruct -::: - -> Ändere jetzt nur die 30 in eine 60 und starte die Simulation. Das ganze Quadrat wird doppelt so groß. - -## Welche Datentypen gibt es? - -Jede Variable hat einen Datentyp. Er legt fest, welche Werte hineinpassen: - -| Datentyp | Was passt hinein? | Beispiel | -|---|---|---| -| \`int\` | ganze Zahlen | \`int seite = 30;\` | -| \`double\` | Kommazahlen, mit Punkt geschrieben | \`double radumfang = 20.4;\` | -| \`String\` | Text in Anführungszeichen | \`String name = "Ludwig";\` | -| \`boolean\` | wahr oder falsch | \`boolean wandNah = mbot.getDistance() < 20;\` | - -Ein Rad des mBot2 kommt mit einer Umdrehung etwa 20.4 cm weit, das ist eine Kommazahl. In \`wandNah\` steht \`true\`, wenn die Wand näher als 20 cm ist. Den Abstandssensor lernst du in Lektion 4 kennen. - -Mit Variablen kannst du auch rechnen: \`int strecke = 4 * seite;\` rechnet die ganze Strecke des Quadrats aus. - -## So sieht Java aus - -Bisher hast du Kästen gezogen. Ab jetzt schreibst du manche Programme auch in **Java**. Die Kästen kennst du schon, denn ihr Text ist bereits echtes Java. Rechts neben dem Struktogramm liegt der Bereich [Code](#zeige-codelive). Dort steht dein Struktogramm als Java-Code, und was du dort tippst, wird sofort zum Struktogramm. - -Das Quadrat mit Variable sieht in Java so aus: - -\`\`\`java -int seite = 30; -for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); -} -\`\`\` - -- Jeder Kasten ist eine Zeile. Am Ende jeder Anweisung steht ein **Semikolon** \`;\`. -- Die For-Schleife heißt \`for\`. In den runden Klammern stehen ihre drei Teile Start, Bedingung und Schritt, getrennt durch \`;\`. -- Was in der Schleife wiederholt wird, steht in **geschweiften Klammern** \`{ }\`. Rücke es ein, dann siehst du sofort, was dazugehört. Hinter \`{\` und \`}\` kommt kein Semikolon. -- Groß- und Kleinschreibung zählt: \`mbot.turnRight()\` geht, \`mbot.turnright()\` nicht. - -> So löst du eine Java-Übung: Klicke auf **Im Editor öffnen**. Dann öffnet sich rechts der Bereich Code. Tippe dort dein Programm, sieh in der Simulation zu und klicke zum Schluss auf **Prüfen**. - -## Jetzt in Java: Rechteck - -Ein Rechteck hat zwei verschiedene Seiten. Also brauchst du zwei Variablen. - -::: übung vb-java-rechteck -titel: Rechteck mit Variablen -code: java -auftrag: Schreibe in Java: Lege \`int laenge = 60\` und \`int breite = 30\` an. Der mBot2 fährt ein Rechteck: Länge, rechts drehen, Breite, rechts drehen, und das zweimal. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -braucht: forSchleife -tipp: Zwei Variablen oben: \`int laenge = 60;\` und \`int breite = 30;\`. Darunter eine For-Schleife, die zweimal läuft. -tipp: In der Schleife: \`mbot.forward(laenge);\`, \`mbot.turnRight();\`, \`mbot.forward(breite);\`, \`mbot.turnRight();\` -lösung: vb-java-rechteck-loesung.visustruct -::: - -## Ergebnis auf dem Bildschirm - -Der mBot2 kann nicht nur fahren, er kann dir auch etwas zeigen. Mit \`mbot.showText(…)\` steht ein Text auf dem [Bildschirm]{teil=screen} des CyberPi. Mit \`+\` hängst du Text und Werte aneinander: - -\`\`\`java -int seite = 30; -int strecke = 4 * seite; -mbot.showText("Strecke: " + strecke + " cm"); -\`\`\` - -Der Bildschirm zeigt dann **Strecke: 120 cm**. Den Bildschirm lernst du in Lektion 18 noch genauer kennen. - -::: übung vb-strecke-anzeigen -titel: Wie weit fährt er? -code: java -auftrag: Lege \`int laenge = 60\` und \`int breite = 30\` an und fahre das Rechteck wie eben. Berechne danach in einer Variablen \`strecke\`, wie weit der mBot2 einmal ganz herum gefahren ist, und zeige **Strecke: 180 cm** auf dem Bildschirm. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -befehle: showText "Strecke: 180 cm" -braucht: forSchleife -tipp: Einmal herum sind zweimal die Länge und zweimal die Breite: \`int strecke = 2 * laenge + 2 * breite;\` -tipp: Nach der Schleife: \`mbot.showText("Strecke: " + strecke + " cm");\` -lösung: vb-strecke-anzeigen-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Eingabe und Ausgabe“](?visustruct&lektion=06-eingabe-und-ausgabe). Sie öffnet sich in einem neuen Fenster. Dort gibst du Ergebnisse mit \`System.out.println\` in der Konsole aus. - -## Spiel: Welcher Datentyp? - -::: spiel frage -titel: Spiel: Welcher Datentyp? -intro: Ludwig hat die Datentypen weggewischt. Welcher passt in die Lücke? Sieben Runden. -antworten: int | double | String | boolean - -runde: - ___ seite = 30; -frage: Welcher Datentyp passt? -richtig: int -> 30 ist eine ganze Zahl. - -runde: - ___ radumfang = 20.4; -frage: Welcher Datentyp passt? -richtig: double -> 20.4 ist eine Kommazahl, in Java mit Punkt geschrieben. - -runde: - ___ name = "Ludwig"; -frage: Welcher Datentyp passt? -richtig: String -> Text in Anführungszeichen ist ein \`String\`. - -runde: - ___ wandNah = mbot.getDistance() < 20; -frage: Welcher Datentyp passt? -richtig: boolean -> Ein Vergleich ist wahr oder falsch, also \`boolean\`. - -runde: - ___ abstand = mbot.getDistance(); -frage: Welcher Datentyp passt? -richtig: int -> Der Abstandssensor liefert ganze Zentimeter, zum Beispiel 38. - -runde: - ___ gruss = "Hallo " + "Klasse"; -frage: Welcher Datentyp passt? -richtig: String -> Zwei Texte mit \`+\` ergeben wieder einen Text. - -runde: - ___ mittelwert = 120 / 5.0; -frage: Welcher Datentyp passt? -richtig: double -> Mit \`5.0\` rechnet Java mit Kommazahlen. Das Ergebnis ist 24.0. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Lies das Programm und tippe auf das Feld, auf dem der mBot2 am Ende steht. Achte auf die Werte in den Variablen. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - int seite = 60; - mbot.forward(seite); - mbot.turnRight(); - mbot.forward(seite); -karte: ... | ... | ^.. -ziel: 2,0 -> \`seite\` ist 60, also zwei Felder hoch und zwei nach rechts. - -runde: - int a = 30; - int b = a * 3; - mbot.forward(b); -karte: ... | ... | ... | ^.. -ziel: 0,0 -> \`b\` ist 3 · 30 = 90 cm, also drei Felder. - -runde: - int strecke = 30 * 2; - mbot.backward(strecke); -karte: ..^.. | ..... | ..... -ziel: 2,2 -> \`backward\` fährt rückwärts: Er schaut nach oben, fährt aber 60 cm nach unten. - -runde: - int seite = 30; - for (int i = 0; i < 2; i++) { - mbot.forward(seite); - mbot.turnRight(); - seite = seite + 30; - } -karte: .... | .... | .... | ^... -ziel: 2,2 -> Erst 30 cm hoch, dann wächst \`seite\` auf 60: zwei Felder nach rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable anlegen und benutzen. → Eine Variable für die Seite -- Ich kann ein kurzes Java-Programm lesen und im Bereich Code tippen. → So sieht Java aus -- Ich kann die Datentypen \`int\`, \`double\`, \`String\` und \`boolean\` unterscheiden. → Welche Datentypen gibt es? -- Ich kann mit zwei Variablen ein Rechteck in Java fahren. → Jetzt in Java: Rechteck -- Ich kann mit \`mbot.showText\` ein Ergebnis auf dem Bildschirm zeigen. → Ergebnis auf dem Bildschirm -::: - -## Wissenstest - -::: quiz -? Was fährt \`mbot.forward(seite)\`, wenn vorher \`int seite = 40;\` steht? -→ Eine Variable für die Seite -- [ ] 4 cm -- [x] 40 cm -- [ ] gar nichts, \`seite\` ist kein Befehl -> Wo \`seite\` steht, setzt Java den Wert 40 ein. -? Welcher Datentyp passt zu \`"Ludwig"\`? -→ Welche Datentypen gibt es? -- [ ] \`int\` -- [ ] \`double\` -- [x] \`String\` -> Text in Anführungszeichen ist ein \`String\`. -? Was zeigt \`mbot.showText("Seite: " + 30);\` auf dem Bildschirm? -→ Ergebnis auf dem Bildschirm -- [x] Seite: 30 -- [ ] "Seite: " + 30 -- [ ] 30 -> Das \`+\` hängt den Text und die Zahl aneinander. -::: -`,S5=`--- -titel: Schritt für Schritt testen -bereich: Losfahren -kurz: Mit der Simulation und dem Schreibtischtest herausfinden, was dein Programm wirklich tut. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Simulation mit Start, Schritt und Stopp steuern -- in der Simulation die Variablen beobachten -- einen Schreibtischtest mit einer Tabelle machen -- mit der Simulation einen Fehler finden und reparieren -::: - -## Die Simulation steuern - -Mit dem Knopf [▶︎ Simulation starten](#zeige-simulation) rechts bei den Werkzeugen führt VisuStruct dein Struktogramm aus. In der VisuBot-Welt fährt der mBot2 dabei mit. Rechts erscheint die **Steuerung**: - -- **Start** führt das Programm automatisch Schritt für Schritt aus. Wie schnell, stellst du bei **Pause pro Schritt** ein. -- **Pause** hält an. Danach geht es mit Start oder Schritt weiter. -- **Schritt** führt genau einen Kasten aus. So kannst du in Ruhe zuschauen. -- **Stopp** bricht ab und stellt den mBot2 zurück an den Start. - -Während der Simulation ist ein Kasten farbig markiert. Unter **Letzter Schritt** steht, was gerade passiert ist, unter **Variablen** stehen alle Variablen mit ihren Werten. - -::: diagramm vb-l03-wachsend-loesung.visustruct -Jede Seite wird 10 cm länger. Öffne das Diagramm im Editor und gehe es mit **Schritt** durch. Beobachte dabei \`seite\` und \`i\`. -::: - -## Der Schreibtischtest - -Beim **Schreibtischtest** spielst du selbst den Computer. Du gehst das Struktogramm mit Stift und Papier durch und schreibst nach jedem Schritt die Werte der Variablen auf. Für das Diagramm oben sieht die Tabelle so aus: - -| Schritt | \`i\` | \`seite\` | Der mBot2 … | -|---|---|---|---| -| \`int seite = 20\` | – | 20 | | -| \`mbot.forward(seite)\` | 0 | 20 | fährt 20 cm | -| \`mbot.turnRight()\` | 0 | 20 | dreht rechts | -| \`seite = seite + 10\` | 0 | 30 | | -| \`mbot.forward(seite)\` | 1 | 30 | fährt 30 cm | -| … | … | … | … | - -Vergleiche deine Tabelle danach mit der Simulation. Stimmen die Werte unter **Variablen** nach jedem Schritt? - -::: angeberwissen -Früher war „Computer“ ein Beruf: Menschen, die mit Stift und Papier rechneten. Eine der besten war Katherine Johnson bei der NASA. 1962 wollte der Astronaut John Glenn erst losfliegen, als sie die Flugbahn des neuen IBM-Rechners von Hand nachgerechnet hatte: „Wenn sie sagt, die Zahlen stimmen, fliege ich.“ -::: - -## Fehler finden mit der Simulation - -Ludwig wollte die Spirale von oben bauen: 20 cm, 30 cm, 40 cm. Sein mBot2 fährt aber 30, 40 und 50 cm. Das Programm läuft ohne Fehlermeldung, es tut nur das Falsche. So einen Fehler nennt man **logischen Fehler**. Ihn findest du am besten mit **Schritt** und den Variablen. - -::: übung vb-spirale-falsch -titel: Die Spirale reparieren -auftrag: „Im Editor öffnen“ lädt Ludwigs Struktogramm. Gehe es mit **Schritt** durch und beobachte \`seite\`. Finde heraus, warum die erste Seite 30 cm lang ist, und repariere es. Der mBot2 soll 20, 30 und 40 cm fahren und nach jeder Seite rechts drehen. -start: vb-spirale-falsch-start.visustruct -fahrt: forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -braucht: forSchleife -tipp: Achte darauf, welchen Wert \`seite\` hat, wenn \`mbot.forward(seite)\` drankommt. Ist die Reihenfolge in der Schleife richtig? -tipp: \`seite = seite + 10\` muss **nach** \`mbot.forward(seite)\` und \`mbot.turnRight()\` stehen. Zieh den Kasten ans Ende der Schleife. -lösung: vb-spirale-falsch-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Simulation und Schreibtischtest“](?visustruct&lektion=07-simulation-und-schreibtischtest). Sie öffnet sich in einem neuen Fenster. - -## Spiel: Spiel den Computer - -::: spiel frage -titel: Spiel: Spiel den Computer -intro: Mach in deinem Kopf den Schreibtischtest. Was tut der mBot2, und welche Werte haben die Variablen? Fünf Runden. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite + 10; - } -frage: Welchen Wert hat \`seite\` nach der Schleife? -- 40 -- [x] 50 -- 30 -> 20, dann 30, 40 und nach dem dritten Durchgang 50. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite + 10; - } -frage: Wie weit fährt der mBot2 beim dritten Mal? -- [x] 40 cm -- 50 cm -- 30 cm -> Er fährt 20, 30 und 40 cm. Die 50 steht erst danach in \`seite\`. - -runde: - int seite = 20; - for (int i = 0; i < 3; i++) { - seite = seite + 10; - mbot.forward(seite); - } -frage: Wie weit fährt der mBot2 beim ersten Mal? -- 20 cm -- [x] 30 cm -- 10 cm -> \`seite\` wächst schon vor dem Fahren. Genau das war Ludwigs logischer Fehler. - -runde: - int strecke = 0; - for (int i = 0; i < 4; i++) { - mbot.forward(25); - strecke = strecke + 25; - } - mbot.showText("Strecke: " + strecke); -frage: Was zeigt der Bildschirm am Ende? -- Strecke: 25 -- [x] Strecke: 100 -- Strecke: 0 -> Viermal kommen 25 dazu: 25, 50, 75, 100. - -runde: - int seite = 10; - for (int i = 0; i < 3; i++) { - mbot.forward(seite); - seite = seite * 2; - } -frage: Wie weit fährt der mBot2 insgesamt? -- 60 cm -- [x] 70 cm -- 80 cm -> Er fährt 10, 20 und 40 cm. Zusammen sind das 70 cm. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 8 4 SCHLEIFE: wiederholt Schritte, im Struktogramm wie ein gekipptes L -- ↓ 1 6 ALGORITHMUS: genaue Schritt-für-Schritt-Anleitung -- ↓ 4 8 SEQUENZ: Schritte, die nacheinander kommen -- → 1 1 SIMULATION: führt dein Programm am Bildschirm aus, auch ohne Roboter -- ↓ 8 4 STRUKTOGRAMM: Plan aus Kästen, den du von oben nach unten liest -- → 16 2 VARIABLE: Kästchen mit Namen, in dem ein Wert liegt -- → 13 2 DATENTYP: legt fest, welche Werte in eine Variable passen, z. B. int -- ↓ 4 11 SCHREIBTISCHTEST: du spielst mit Stift und Papier den Computer -lösung: 10 4, 4 6, 16 7, 14 4, 13 4, 13 5, 7 11 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Simulation mit Start, Schritt und Stopp steuern. → Die Simulation steuern -- Ich kann in der Simulation die Variablen beobachten. → Die Simulation steuern -- Ich kann einen Schreibtischtest mit einer Tabelle machen. → Der Schreibtischtest -- Ich kann mit der Simulation einen Fehler finden und reparieren. → Fehler finden mit der Simulation -::: - -## Wissenstest - -::: quiz -? Welcher Knopf führt genau einen Kasten aus? -→ Die Simulation steuern -- [ ] Start -- [x] Schritt -- [ ] Stopp -> Mit Schritt geht es Kasten für Kasten. Start läuft von allein weiter. -? Wie lang fährt der mBot2 im zweiten Durchgang von „Wachsende Seiten“? -→ Der Schreibtischtest -- [ ] 20 cm -- [x] 30 cm -- [ ] 40 cm -> Nach dem ersten Durchgang ist \`seite\` um 10 gewachsen, also 30. -? Das Programm läuft ohne Meldung, der mBot2 fährt aber falsch. Was für ein Fehler ist das? -→ Fehler finden mit der Simulation -- [ ] ein Tippfehler -- [x] ein logischer Fehler -- [ ] ein Fehler im Roboter -> Das Programm tut genau, was dasteht, nur nicht das, was gemeint war. -::: -`,T5=`--- -titel: Sensoren abfragen -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 misst etwas, und dein Programm entscheidet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- den Unterschied zwischen Befehl und Sensor erklären -- einen Sensor in eine Bedingung einbauen -::: - -## Befehle und Sensoren - -Bisher hast du dem mBot2 nur **Befehle** gegeben: fahre vor, drehe rechts. Er hat sie ausgeführt, ohne auf seine Umgebung zu achten. - -Jetzt kommen die **Sensoren** dazu. Unter den [Elementen](#zeige-elemente) gibt es dafür die Gruppe **mBot2-Sensoren**: - -| Sensor | Text | Was du bekommst | -|---|---|---| -| Abstand | \`mbot.getDistance()\` | Abstand bis zur nächsten Wand in cm, z. B. \`38\` | -| Linie | \`mbot.getLine()\` | \`0\`, wenn unter dem Liniensensor alles hell ist, sonst eine Zahl größer als 0 | - -Der mBot2 hat noch mehr Sensoren: Farben, Tasten und Joystick, Licht, Lautstärke und Neigung. Jeden lernst du in den Lektionen 6 bis 13 einzeln kennen, die Motoren in Lektion 20 und Stoppuhr und Akku in Lektion 21. - -Ein Sensor ist **kein eigener Kasten**. Er liefert eine Zahl, und mit der baust du eine **Bedingung**: - -\`\`\`java -mbot.getDistance() < 20 -\`\`\` - -Das heißt: „Ist die Wand näher als 20 cm?“ Die Antwort ist wahr oder falsch. - -> So baust du es: Zieh zuerst eine **Verzweigung** ins Struktogramm. Dann ziehst du den Sensor **Abstand** auf die Verzweigung. In der Bedingung steht jetzt \`mbot.getDistance()\`. Den Vergleich \`< 20\` schreibst du selbst dazu. - -## Wand vorn? - -Der mBot2 soll selbst entscheiden: Ist vorn eine Wand, dreht er sich nach rechts. Ist frei, fährt er ein Stück vor. - -Diese Übung hat **zwei Welten**: In der einen steht die Wand direkt vor ihm, in der anderen ist viel Platz. Dein Programm muss in beiden das Richtige tun. - -::: übung vb-wand-vorn -titel: Wand vorn? -auftrag: Baue eine Verzweigung mit der Bedingung \`mbot.getDistance() < 20\`. Bei **true** dreht sich der mBot2 nach rechts, bei **false** fährt er vor. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und dann den Sensor **Abstand** auf die Verzweigung. Schreib dahinter \`< 20\`. -tipp: Im true-Zweig steht \`mbot.turnRight()\`, im false-Zweig \`mbot.forward()\`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -Im Bereich [Code](#zeige-codelive) siehst du dein Struktogramm auch als Java. Eine Verzweigung heißt dort **if**, der false-Zweig **else**. Die Bedingung steht in runden Klammern, jeder Zweig in geschweiften Klammern: - -\`\`\`java -if (mbot.getDistance() < 20) { - mbot.turnRight(); -} else { - mbot.forward(); -} -\`\`\` - -> Selbst tippen musst du \`if\` noch nicht. Mehr dazu kommt in der Lektion über den Ultraschallsensor. - -## Was liefert der Sensor? - -Ein Sensor liefert einen **Wert**, so wie eine Variable. Fährt der mBot2 weiter, ändert sich der Wert: Der Abstand wird kleiner, je näher die Wand kommt. Erst ein **Vergleich** macht aus dem Wert eine Frage mit der Antwort \`true\` (wahr) oder \`false\` (falsch). - -| Bedingung | Frage | Antwort bei 38 cm Abstand | -|---|---|---| -| \`mbot.getDistance() < 20\` | Ist die Wand näher als 20 cm? | \`false\` | -| \`mbot.getDistance() > 30\` | Ist mehr als 30 cm Platz? | \`true\` | -| \`mbot.getLine() == 0\` | Ist unter dem mBot2 alles hell? | hängt vom Boden ab | - -Vergleichen kannst du mit \`<\` (kleiner), \`>\` (größer), \`<=\` (kleiner oder gleich), \`>=\` (größer oder gleich), \`==\` (gleich) und \`!=\` (ungleich). - -> Für „gleich“ schreibst du **zwei** Gleichheitszeichen: \`==\`. Ein einzelnes \`=\` legt einen Wert in eine Variable, das ist etwas ganz anderes. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Verzweigung“](?visustruct&lektion=08-verzweigung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-04-sensoren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wand vorn?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-04-sensoren-start.visustruct -welt: wand-nah -> turnRight -welt: wand-frei -> forward -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.turnRight()\`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -## Spiel: Befehl oder Sensor? - -::: spiel frage -titel: Spiel: Befehl oder Sensor? -intro: Tut die Zeile etwas, oder liefert sie einen Wert? Acht Runden. -antworten: Befehl | Sensor - -runde: - mbot.forward(30) -frage: Befehl oder Sensor? -richtig: Befehl -> Er fährt 30 cm. Das ist etwas tun. - -runde: - mbot.getDistance() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert den Abstand in cm, zum Beispiel 38. - -runde: - mbot.turnRight() -frage: Befehl oder Sensor? -richtig: Befehl -> Drehen ist etwas tun. - -runde: - mbot.getLine() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert 0 oder eine Zahl größer als 0. - -runde: - mbot.playTone(440, 300) -frage: Befehl oder Sensor? -richtig: Befehl -> Ein Ton ist eine Ausgabe. - -runde: - mbot.isButtonA() -frage: Befehl oder Sensor? -richtig: Sensor -> Er liefert wahr oder falsch: Wird Taste A gedrückt? - -runde: - mbot.showText("Hallo") -frage: Befehl oder Sensor? -richtig: Befehl -> Etwas anzeigen ist etwas tun. - -runde: - mbot.getBrightness() -frage: Befehl oder Sensor? -richtig: Sensor -> Er misst, wie hell es ist, von 0 bis 100. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann den Unterschied zwischen Befehl und Sensor erklären. → Befehle und Sensoren -- Ich kann einen Sensor in eine Bedingung einbauen. → Wand vorn? -::: - -## Wissenstest - -::: quiz -? Die Wand ist 12 cm entfernt. Ist \`mbot.getDistance() < 20\` wahr oder falsch? -→ Wand vorn? -- [x] wahr -- [ ] falsch -> 12 ist kleiner als 20, also ist die Bedingung wahr. -? Der mBot2 steht auf hellem Boden. Was liefert \`mbot.getLine()\`? -→ Befehle und Sensoren -- [x] 0 -- [ ] 15 -- [ ] den Abstand in cm -> 0 heißt: Keiner der vier Fühler sieht etwas Dunkles. -? Warum ist der Sensor kein eigener Kasten im Struktogramm? -→ Wand vorn? -- [x] Er tut nichts, er liefert nur einen Wert. Den braucht man in einer Bedingung. -- [ ] Weil der mBot2 sonst zu langsam wird. -- [ ] Weil Sensoren nur in Java gehen. -> Befehle sind Anweisungen. Sensoren sind Werte, so wie eine Variable. -::: -`,_5=`--- -titel: Bis zur Wand -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 misst den Abstand und hält rechtzeitig an. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit \`mbot.getDistance()\` den Abstand abfragen -- entscheiden, wann ich eine While-Schleife statt einer For-Schleife nehme -- mit dem Liniensensor ein Ziel finden -::: - -## Wie weit ist die Wand? - -Bisher hast du genau gesagt, wie weit der mBot2 fahren soll. Jetzt soll er selbst merken, wann er anhalten muss. - -Dafür gibt es den Ultraschallsensor. \`mbot.getDistance()\` liefert den Abstand bis zur nächsten Wand in Zentimetern, zum Beispiel \`38\`. Du kannst ihn wie eine Zahl benutzen: - -\`\`\`java -mbot.getDistance() > 15 -\`\`\` - -Das ist eine **Bedingung**: Sie ist wahr, solange die Wand mehr als 15 cm entfernt ist. - -> Starte die [Simulation](#zeige-simulation): Unter der Welt steht immer der aktuelle Abstand. Fährt der mBot2 näher an die Wand, wird die Zahl kleiner. - -## Drei Welten, ein Programm - -Diese Übung hat **drei Welten**. In jeder steht die Wand woanders, und der mBot2 soll jedes Mal im Ziel mit der grünen Fahne anhalten, ohne anzustoßen. - -Mit einer festen Anzahl **fahre vor** klappt das nur in einer Welt. Du brauchst eine Schleife, die so lange fährt, wie die Bedingung wahr ist: die **While-Schleife**. - -::: übung vb-bis-wand -titel: Bis zur Wand -auftrag: Der mBot2 soll vorwärts fahren, bis die Wand höchstens 15 cm entfernt ist. Dein Programm muss in allen drei Welten funktionieren. Über der Simulation wählst du, welche Welt du siehst. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Abstand** auf die Schleife. Dann fehlt nur noch der Vergleich. -tipp: Eine While-Schleife mit der Bedingung \`mbot.getDistance() > 15\`, darin ein \`mbot.forward()\`. -lösung: vb-bis-wand-loesung.visustruct -::: - -::: ludwig -Eine Schleife, die eine Bedingung prüft, bevor sie fährt, ist wie ich am Futtertrog: Ich frage zuerst, ob noch etwas drin ist, und erst dann fresse ich weiter. -::: - -## Bis zum Ziel - -Jetzt kommt der zweite Sensor dran. Das Ziel ist ein schwarzes Feld mit grüner Fahne. Fährt der mBot2 darauf, sieht es sein Liniensensor: \`mbot.getLine()\` ist dann nicht mehr \`0\`. - -::: übung vb-bis-ziel -titel: Fahre bis zum Ziel -auftrag: Der mBot2 soll so lange vorwärts fahren, bis er auf dem Ziel steht. Auch hier gibt es zwei Welten. -welt: ziel-kurz, ziel-lang -braucht: whileSchleife -tipp: Die Schleife soll laufen, solange der Liniensensor **nichts** sieht. Zieh den Sensor **Linie** auf die While-Schleife. -tipp: Die Bedingung heißt \`mbot.getLine() == 0\`. In der Schleife steht \`mbot.forward()\`. -lösung: vb-bis-ziel-loesung.visustruct -::: - -## Was prüft die Schleife? - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„While-Schleife“](?visustruct&lektion=11-while-schleife). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-05-bis-zur-wand -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Wand“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-bis-zur-wand-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.forward()\`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Spiel: Wie oft fährt er? - -::: spiel frage -titel: Spiel: Wie oft fährt er? -intro: Jede Fahrt ist 10 cm lang. Rechne aus, wie oft der mBot2 vorfährt, bevor die Schleife aufhört. Sechs Runden. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 40 cm entfernt. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- 4-mal -> 40, 30 und 20 sind größer als 15: drei Fahrten. Bei 10 hört die Schleife auf. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 15 cm entfernt. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- 2-mal -> 15 ist nicht größer als 15. Die Bedingung ist gleich am Anfang falsch. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand ist am Anfang 50 cm entfernt. Wo hält er an? -- 15 cm vor der Wand -- [x] 10 cm vor der Wand -- 0 cm, er stößt an -> 50, 40, 30, 20: viermal vor. Dann ist die Wand 10 cm weg, und die Schleife hört auf. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } -frage: Der mBot2 steht schon auf dem schwarzen Ziel. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- immer weiter -> Auf Schwarz ist \`mbot.getLine()\` nicht 0. Die Bedingung ist sofort falsch. - -runde: -frage: Der mBot2 soll genau fünfmal vorfahren. Welche Schleife passt am besten? -- [x] eine For-Schleife -- eine While-Schleife mit \`mbot.getDistance()\` -- gar keine Schleife -> Die Anzahl steht vorher fest. Dafür ist die For-Schleife da. - -runde: -frage: Der mBot2 soll fahren, bis er die Wand fast berührt. Welche Schleife passt? -- eine For-Schleife, die zehnmal läuft -- [x] eine While-Schleife mit \`mbot.getDistance()\` -- gar keine Schleife -> Wie weit die Wand weg ist, weiß man vorher nicht. Die While-Schleife fragt unterwegs nach. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Grau ist eine Wand. Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß, der Sensor sitzt vorn am mBot2. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, solange vorn mehr als 15 cm frei sind. Direkt vor der Wand hält er an. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,1 -> Egal wie weit die Wand weg ist: Die While-Schleife hält ihn direkt davor an. - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(60); -karte: ##### | ..... | ..... | ..... | ^.... -ziel: 2,2 -> Bei mehr als 45 cm hört er schon ein Feld früher auf, dreht sich und fährt zwei Felder nach rechts. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,0 -> Er fährt, bis sein Liniensensor Schwarz sieht. Dann steht er auf dem schwarzen Feld. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit \`mbot.getDistance()\` den Abstand abfragen. → Wie weit ist die Wand? -- Ich kann entscheiden, wann ich eine While-Schleife statt einer For-Schleife nehme. → Drei Welten, ein Programm -- Ich kann mit dem Liniensensor ein Ziel finden. → Bis zum Ziel -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht 40 cm vor der Wand. Wie oft fährt er mit \`while (mbot.getDistance() > 15) mbot.forward();\` vor, wenn jede Fahrt 10 cm ist? -→ Wie weit ist die Wand? -- [ ] gar nicht -- [ ] einmal -- [x] so oft, bis die Wand höchstens 15 cm weg ist -- [ ] immer genau fünfmal -> Die While-Schleife prüft vor jeder Fahrt die Bedingung. Ist die Wand nah genug, hört sie auf. -? Warum reicht hier keine For-Schleife mit fester Anzahl? -→ Drei Welten, ein Programm -- [x] Weil die Wand in jeder Welt anders weit weg ist. -- [ ] Weil eine For-Schleife keine Anweisungen enthalten darf. -- [ ] Weil der mBot2 For-Schleifen nicht versteht. -> Die For-Schleife weiß vorher, wie oft sie läuft. Die While-Schleife entscheidet unterwegs. -::: -`,A5=`--- -titel: Erst fahren, dann prüfen -bereich: Sensoren und Entscheidungen -kurz: Die Do-while-Schleife fährt immer mindestens einmal und prüft erst danach. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft -- eine While- und eine Do-while-Schleife vergleichen -- eine Do-while-Schleife in Java schreiben -::: - -## Erst fahren, dann prüfen - -Die While-Schleife aus Lektion 5 prüft **zuerst** und fährt dann. Steht die Wand schon direkt vor dem mBot2, fährt er gar nicht los. Sie ist **kopfgesteuert**: Die Bedingung steht oben im Kopf. - -Die **Do-while-Schleife** ist **fußgesteuert**. Die Bedingung steht unten im Fuß des Kastens: - -1. Den Inhalt einmal ausführen. -2. Die Bedingung prüfen. -3. Ist sie wahr, wieder bei 1 anfangen. Ist sie falsch, geht es unter der Schleife weiter. - -Deshalb läuft der Inhalt **immer mindestens einmal**. Wenn du die Schleife anklickst, steht im Objektinspektor vor dem Textfeld \`while\`: Die Bedingung heißt „wiederhole, solange …“. - -| Abstand am Anfang | While-Schleife | Do-while-Schleife | -|---|---|---| -| 50 cm | fährt bis 15 cm | fährt bis 15 cm | -| 10 cm | fährt **gar nicht** | fährt **einmal** 10 cm | - -::: übung vb-do-while -titel: Mindestens ein Schritt -auftrag: Baue ein Struktogramm mit einer Do-while-Schleife: Der mBot2 fährt vor, solange der Abstand größer als 15 cm ist, aber **mindestens einmal**. Danach spielt er einen Ton. -messwerte: getDistance=10 -> forward, tone -welt: wand-kurz -> tone -braucht: doUntilSchleife -tipp: Zieh die **Do-while-Schleife** aus den Elementen ins Struktogramm. In den Kasten kommt **fahre vor**, in den Fuß die Bedingung \`mbot.getDistance() > 15\`. -tipp: Unter die Schleife (nicht hinein) kommt \`mbot.playTone(440, 300)\`. -lösung: vb-do-while-loesung.visustruct -::: - -> Beim Prüfen steht die Wand einmal nur 10 cm vor dem mBot2. Eine While-Schleife würde dann gar nicht fahren. - -## Jetzt in Java: Schritte zählen - -In Java steht \`do\` oben und \`while (…)\` mit Semikolon unten: - -\`\`\`java -do { - mbot.forward(); -} while (mbot.getDistance() > 15); -\`\`\` - -::: übung vb-java-schritte-zaehlen -titel: Schritte zählen -code: java -auftrag: Schreibe in Java: Lege \`int schritte = 0\` an. In einer Do-while-Schleife fährt der mBot2 vor und zählt \`schritte\` um eins hoch, solange der Abstand größer als 15 cm ist. Danach zeigt der Bildschirm zum Beispiel **Schritte: 3**. -welt: wand-kurz -> screen "Schritte: 3" -messwerte: getDistance=10 -> forward, screen "Schritte: 1" -braucht: doUntilSchleife -tipp: \`do { mbot.forward(); schritte = schritte + 1; } while (mbot.getDistance() > 15);\` -tipp: Nach der Schleife \`mbot.showText("Schritte: " + schritte);\`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Do-while-Schleife“](?visustruct&lektion=12-do-while-schleife). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-05-erst-fahren-dann-pruefen -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Schritte zählen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct -welt: wand-kurz -> screen "Schritte: 3" -messwerte: getDistance=10 -> forward, screen "Schritte: 1" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.showText("Schritte: " + schritte)\`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -## Spiel: Kopf oder Fuß? - -::: spiel frage -titel: Spiel: Kopf oder Fuß? -intro: While oder Do-while: Wie oft fährt der mBot2 vor? Jede Fahrt ist 10 cm lang. Sechs Runden. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: Die Wand steht 10 cm vor dem mBot2. Wie oft fährt er vor? -- [x] gar nicht -- 1-mal -- 2-mal -> Die While-Schleife prüft zuerst. 10 ist nicht größer als 15. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Die Wand steht 10 cm vor dem mBot2. Wie oft fährt er vor? -- gar nicht -- [x] 1-mal -- 2-mal -> Die Do-while-Schleife fährt erst und prüft dann. Einmal fährt sie immer. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Die Wand steht 40 cm vor dem mBot2. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- 4-mal -> Nach der ersten Fahrt sind es 30 cm, dann 20, dann 10. Bei 10 ist Schluss. Hier fahren beide Schleifen gleich oft. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte = schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + schritte); -frage: Die Wand steht 10 cm vor dem mBot2. Was zeigt der Bildschirm? -- Schritte: 0 -- [x] Schritte: 1 -- Schritte: 2 -> Der Inhalt läuft einmal, also zählt \`schritte\` einmal hoch. - -runde: -frage: Welche Schleife ist fußgesteuert? -- die While-Schleife -- [x] die Do-while-Schleife -- die For-Schleife -> Ihre Bedingung steht unten im Fuß. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15) -frage: Warum läuft dieser Code nicht? -- \`do\` muss großgeschrieben werden. -- [x] Hinter \`while (…)\` fehlt das Semikolon. -- Die Bedingung muss oben stehen. -> Die Do-while-Schleife endet mit \`} while (Bedingung);\`. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() < 15); -frage: Soll mindestens einmal vorfahren und weiter, solange die Wand mehr als 15 cm weg ist. -fehler: 3 -besser: } while (mbot.getDistance() > 15); -> „Mehr als 15 cm“ heißt \`> 15\`. - -runde: - do - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Soll mindestens einmal vorfahren und weiter, solange die Wand mehr als 15 cm weg ist. -fehler: 1 -besser: do { -> Hinter \`do\` fehlt die öffnende geschweifte Klammer. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + schritte); -frage: Soll die Schritte zählen und am Ende anzeigen. -fehler: 4 -besser: schritte = schritte + 1; -> \`schritte + 1\` rechnet nur, speichert aber nichts. Das Ergebnis muss mit \`=\` zurück in \`schritte\`. - -runde: - int schritte = 0; - do { - mbot.forward(); - schritte = schritte + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Schritte: " + Schritte); -frage: Soll die Schritte zählen und am Ende anzeigen. -fehler: 6 -besser: mbot.showText("Schritte: " + schritte); -> Java unterscheidet Groß- und Kleinschreibung. \`Schritte\` gibt es nicht. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Grau ist eine Wand. While oder Do-while: Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,2 -> Die Wand ist schon nah. Die While-Schleife prüft zuerst und fährt gar nicht los. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 45); -karte: ##### | ..... | ..^.. -ziel: 2,1 -> Die Do-while-Schleife fährt erst einmal und prüft dann. Ein Feld weiter hört sie auf. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); - mbot.turnLeft(); - mbot.forward(30); -karte: ##### | ..... | ..^.. -ziel: 1,1 -> Ein Feld vor, dann ist die Wand direkt davor. Danach links und ein Feld weiter. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> Ist die Wand weit weg, fahren While und Do-while gleich weit: bis direkt vor die Wand. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, dass die Do-while-Schleife ihre Bedingung erst nach dem Inhalt prüft. → Erst fahren, dann prüfen -- Ich kann eine While- und eine Do-while-Schleife vergleichen. → Erst fahren, dann prüfen -- Ich kann eine Do-while-Schleife in Java schreiben. → Jetzt in Java: Schritte zählen -::: - -## Wissenstest - -::: quiz -? Wo steht bei der Do-while-Schleife die Bedingung? -→ Erst fahren, dann prüfen -- [ ] oben im Kopf -- [x] unten im Fuß -- [ ] gar nicht -> Fußgesteuert heißt: erst der Inhalt, dann die Bedingung. -? Die Wand steht 10 cm vor dem mBot2. Wie oft fährt \`do { mbot.forward(); } while (mbot.getDistance() > 15);\`? -→ Erst fahren, dann prüfen -- [ ] gar nicht -- [x] einmal -- [ ] bis er anstößt -> Der Inhalt läuft immer mindestens einmal. Danach ist die Bedingung falsch. -? Was gehört in Java hinter \`while (…)\` am Ende der Do-while-Schleife? -→ Jetzt in Java: Schritte zählen -- [x] ein Semikolon \`;\` -- [ ] eine geschweifte Klammer \`{\` -- [ ] nichts -> \`} while (Bedingung);\` endet mit einem Semikolon. -::: -`,j5=`--- -titel: Zählen und Summieren -bereich: Sensoren und Entscheidungen -kurz: Mit einer Variablen mitzählen und Werte zusammenzählen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Zählvariable anlegen und in einer Schleife hochzählen -- in einer Schleife eine Summe bilden -- das Ergebnis nach der Schleife auf dem Bildschirm zeigen -::: - -## Mitzählen - -Wie viele Schritte fährt der mBot2 bis zur Wand? Das weißt du vorher nicht, die Welt ist jedes Mal anders. Der mBot2 soll deshalb **mitzählen**. Dafür brauchst du drei Kästen: - -1. **Vor** der Schleife: \`int schritte = 0\`. Am Anfang ist noch nichts gezählt. -2. **In** der Schleife: \`schritte = schritte + 1\`. Nach jedem Schritt eins mehr. -3. **Nach** der Schleife: das Ergebnis zeigen, zum Beispiel mit \`mbot.showText("Schritte: " + schritte)\`. - -Lies \`schritte = schritte + 1\` von rechts nach links: Nimm den alten Wert von \`schritte\`, zähle 1 dazu und speichere das Ergebnis wieder in \`schritte\`. So eine Variable heißt **Zählvariable** oder kurz Zähler. - -> Achtung: Steht \`int schritte = 0\` **in** der Schleife, fängt der Zähler bei jedem Durchgang wieder bei 0 an. Am Ende steht dann immer 1 da. - -::: angeberwissen -Dein Handy zählt deine Schritte genau so: Bei jedem Schritt rechnet es \`schritte = schritte + 1\`. Ich zähle lieber meine Grashalme. Ich bin bei 4 Millionen. -::: - -::: übung vb-schritte-welt -titel: Schritte bis zur Wand -auftrag: Baue ein Struktogramm: Der mBot2 fährt vor, solange der Abstand größer als 15 ist. Dabei zählt er seine Schritte mit. Danach zeigt er zum Beispiel **Schritte: 3** auf dem Bildschirm. Es gibt drei Welten. -welt: wand-kurz -> screen "Schritte: 3" -welt: wand-mittel -> screen "Schritte: 7" -welt: wand-lang -> screen "Schritte: 12" -braucht: whileSchleife -tipp: Der erste Kasten ist \`int schritte = 0\`. Danach kommt die While-Schleife mit \`mbot.getDistance() > 15\`. -tipp: In der Schleife stehen **fahre vor** und \`schritte = schritte + 1\`. Nach der Schleife steht \`mbot.showText("Schritte: " + schritte)\`. -lösung: vb-schritte-welt-loesung.visustruct -::: - -## Zusammenzählen - -Ein Zähler wächst immer um 1. Eine **Summe** wächst um verschiedene Werte. Der mBot2 fährt eine Spirale: erst 10 cm, dann 20, dann 30, dann 40. Wie weit ist er insgesamt gefahren? - -| Durchgang | \`seite\` | \`gesamt\` danach | -|---|---|---| -| vorher | 10 | 0 | -| 1 | 10 | 0 + 10 = 10 | -| 2 | 20 | 10 + 20 = 30 | -| 3 | 30 | 30 + 30 = 60 | -| 4 | 40 | 60 + 40 = 100 | - -Das Muster ist dasselbe wie beim Zählen. Nur steht statt der 1 jetzt der Wert, der dazukommt: \`gesamt = gesamt + seite\`. - -## Jetzt in Java: Spirale mit Strecke - -::: übung vb-java-spirale-strecke -titel: Spirale mit Strecke -code: java -auftrag: Schreibe in Java: Lege \`int seite = 10\` und \`int gesamt = 0\` an. Fahre viermal: \`seite\` cm vor, rechts drehen, \`seite\` zu \`gesamt\` dazuzählen, \`seite\` um 10 größer machen. Zeige danach **Strecke: 100 cm** auf dem Bildschirm. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Strecke: 100 cm" -braucht: forSchleife -tipp: In der For-Schleife stehen vier Zeilen: \`mbot.forward(seite);\`, \`mbot.turnRight();\`, \`gesamt = gesamt + seite;\` und \`seite = seite + 10;\`. -tipp: Nach der Schleife steht \`mbot.showText("Strecke: " + gesamt + " cm");\`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -::: übung vb-fehler-05-zaehlen-und-summieren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Spirale mit Strecke“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-05-zaehlen-und-summieren-start.visustruct -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Strecke: 100 cm" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`gesamt = gesamt + seite\`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -## Spiel: Was steht am Ende in der Variablen? - -::: spiel frage -titel: Spiel: Was steht am Ende in der Variablen? -intro: Ludwig hat kleine Programme geschrieben. Rechne im Kopf mit. Fünf Runden. - -runde: -frage: \`int z = 0\`, dann dreimal \`z = z + 1\`. Was ist \`z\`? -- 1 -- [x] 3 -- 0 -> Jeder Durchgang zählt 1 dazu: 1, 2, 3. - -runde: -frage: \`int summe = 0\`, dann \`summe = summe + 5\` und \`summe = summe + 7\`. Was ist \`summe\`? -- 7 -- [x] 12 -- 5 -> 0 + 5 = 5, dann 5 + 7 = 12. - -runde: -frage: Eine Schleife läuft viermal. In ihr stehen \`int z = 0\` und \`z = z + 1\`. Was ist \`z\` am Ende? -- 4 -- [x] 1 -- 0 -> Der Zähler wird in jedem Durchgang wieder auf 0 gesetzt. Er gehört vor die Schleife. - -runde: -frage: \`int gesamt = 0\`. Der mBot2 fährt 20, 20 und 30 cm und zählt jedes Mal dazu. Was ist \`gesamt\`? -- 30 -- 20 -- [x] 70 -> 20 + 20 + 30 = 70. - -runde: -frage: \`int schritte = 10\`, dann zweimal \`schritte = schritte + 1\`. Was ist \`schritte\`? -- 2 -- [x] 12 -- 11 -> Der Zähler fängt hier bei 10 an, nicht bei 0. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Zählvariable anlegen und in einer Schleife hochzählen. → Mitzählen -- Ich kann in einer Schleife eine Summe bilden. → Zusammenzählen -- Ich kann das Ergebnis nach der Schleife auf dem Bildschirm zeigen. → Jetzt in Java: Spirale mit Strecke -::: - -## Wissenstest - -::: quiz -? Wo legst du die Zählvariable \`int schritte = 0\` an? -→ Mitzählen -- [x] Vor der Schleife -- [ ] In der Schleife -- [ ] Nach der Schleife -> In der Schleife würde sie bei jedem Durchgang wieder 0. -? Was macht \`schritte = schritte + 1\`? -→ Mitzählen -- [ ] Es vergleicht schritte mit schritte + 1. -- [x] Es nimmt den alten Wert, zählt 1 dazu und speichert das Ergebnis. -- [ ] Es setzt schritte auf 1. -? Wie zählst du die Seitenlänge \`seite\` zur Summe \`gesamt\` dazu? -→ Zusammenzählen -- [ ] \`gesamt = seite\` -- [ ] \`seite = gesamt + seite\` -- [x] \`gesamt = gesamt + seite\` -::: -`,C5=`--- -titel: Der Ultraschallsensor -bereich: Sensoren und Entscheidungen -kurz: Abstand messen, Abstand halten und das Ganze in Java. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was \`mbot.getDistance()\` misst -- zwei Verzweigungen ineinander bauen -- eine While-Schleife mit dem Abstand in Java schreiben -::: - -## Wie misst der mBot2 den Abstand? - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Der [Ultraschallsensor]{teil=ultrasonic} schickt einen sehr hohen Ton los und wartet auf das Echo. Je länger das Echo braucht, desto weiter ist die Wand weg. \`mbot.getDistance()\` liefert den Abstand in **Zentimetern**, von etwa 3 bis 300. - -| Sensor | Text | Wert | -|---|---|---| -| Abstand | \`mbot.getDistance()\` | ganze Zahl in cm, z. B. \`38\` | - -> In der [Simulation](#zeige-simulation) steht unter der Welt immer der aktuelle Abstand. Mit einem echten mBot2 kannst du die Hand vor den Sensor halten und zusehen, wie sich die Zahl ändert. - -## Abstand halten im Struktogramm - -Der mBot2 soll wie ein Hund an der Leine sein: Ist deine Hand zu nah (unter 10 cm), weicht er zurück. Ist sie zu weit weg (über 20 cm), kommt er näher. Dazwischen bleibt er stehen. - -Dafür brauchst du zwei Verzweigungen ineinander. Die äußere prüft „zu nah?“, die innere im false-Zweig prüft „zu weit?“. - -::: übung vb-abstand-halten -titel: Abstand halten -auftrag: Baue ein Struktogramm: Ist der Abstand kleiner als 10, fährt der mBot2 zurück. Sonst: Ist der Abstand größer als 20, fährt er vor. Sonst tut er nichts. -messwerte: getDistance=5 -> backward -messwerte: getDistance=35 -> forward -messwerte: getDistance=15 -> none -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und den Sensor **Abstand** darauf. Schreib \`< 10\` dahinter. Im true-Zweig steht **fahre zurück**. -tipp: In den false-Zweig kommt eine zweite Verzweigung mit \`mbot.getDistance() > 20\` und **fahre vor** im true-Zweig. Ihr false-Zweig bleibt leer. -lösung: vb-abstand-halten-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand nacheinander auf 5, 35 und 15 cm und schaut, was dein mBot2 tut. - -## Jetzt in Java - -Im Bereich [Code](#zeige-codelive) siehst du dein Struktogramm schon als Java-Code. Eine Verzweigung heißt dort \`if\`, der false-Zweig \`else\`: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.backward(); -} else { - ... -} -\`\`\` - -Den Sensor tippst du wie einen Befehl: \`mbot.\` und dann \`getDistance()\`. Nach dem Punkt schlägt dir der Editor alle Befehle und Sensoren vor. - -::: übung vb-java-wand-piep -titel: Bis zur Wand und piepen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange die Wand mehr als 15 cm entfernt ist. Danach spielt er einen Ton. Es gibt drei Welten. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: Eine While-Schleife heißt in Java \`while (Bedingung) { … }\`. Die Bedingung ist \`mbot.getDistance() > 15\`. -tipp: In der Schleife steht \`mbot.forward();\`, nach der Schleife \`mbot.playTone(440, 300);\`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -::: übung vb-fehler-06-abstand -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Wand und piepen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-abstand-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es \`mbot.playTone(440, 300)\`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Sechs Runden, je 30 Sekunden. -zeit: 30 - -runde: - if (mbot.getDistance() < 10) { - mbot.forward(); - } - if (mbot.getDistance() > 20) { - mbot.forward(); - } -frage: Unter 10 cm soll er zurückfahren, über 20 cm vorfahren. -fehler: 2 -besser: mbot.backward(); -> Ist die Hand zu nah, muss er zurück, nicht vor. - -runde: - while (mbot.getDistance() < 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll vorfahren, solange die Wand mehr als 15 cm weg ist, und dann piepen. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> „Mehr als 15 cm weg“ heißt \`> 15\`. - -runde: - while (mbot.getDistance > 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll bis zur Wand fahren und dann piepen. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> Ein Sensor ist eine Methode. Ohne Klammern findet Java ihn nicht. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } els { - mbot.forward(); - } -frage: Unter 10 cm soll er zurückfahren, sonst vorfahren. -fehler: 3 -besser: } else { -> Der false-Zweig heißt \`else\`. - -runde: - while (mbot.getDistance() > 15) { - mbot.turnRight(); - } - mbot.playTone(440, 300); -frage: Soll bis zur Wand fahren und dann piepen. -fehler: 2 -besser: mbot.forward(); -> Er soll vorfahren, nicht sich drehen. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } else { - if (mbot.getDistance() < 20) { - mbot.forward(); - } - } -frage: Unter 10 cm zurück, über 20 cm vor, dazwischen stehen bleiben. -fehler: 4 -besser: if (mbot.getDistance() > 20) { -> Vorfahren soll er nur, wenn die Hand weiter als 20 cm weg ist. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was \`mbot.getDistance()\` misst. → Wie misst der mBot2 den Abstand? -- Ich kann zwei Verzweigungen ineinander bauen. → Abstand halten im Struktogramm -- Ich kann eine While-Schleife mit dem Abstand in Java schreiben. → Jetzt in Java -::: - -## Wissenstest - -::: quiz -? \`mbot.getDistance()\` liefert \`8\`. Was tut das Programm aus „Abstand halten“? -→ Abstand halten im Struktogramm -- [x] Es fährt zurück. -- [ ] Es fährt vor. -- [ ] Es bleibt stehen. -> 8 ist kleiner als 10, also ist schon die erste Bedingung wahr. -? Wie heißt der false-Zweig einer Verzweigung in Java? -→ Jetzt in Java -- [ ] \`then\` -- [x] \`else\` -- [ ] \`otherwise\` -> \`if\` ist der Anfang, \`else\` der false-Zweig. -::: -`,D5=`--- -titel: Feste Werte mit final -bereich: Sensoren und Entscheidungen -kurz: Eine Konstante anlegen, damit eine wichtige Zahl nur an einer Stelle steht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was eine Konstante ist -- eine Konstante im Struktogramm und in Java anlegen -- eine Konstante in einer Bedingung und in einem Befehl benutzen -::: - -## Eine Zahl an vielen Stellen - -Ludwig hat ein Programm für den Flur geschrieben: Der mBot2 fährt bis 20 cm vor die Wand, dreht sich um und fährt bis 20 cm vor die andere Wand. - -::: diagramm vb-l06k-ohne.visustruct -Hin und zurück. Die Zahl 20 steht an zwei Stellen. -::: - -Jetzt soll der mBot2 schon bei 30 cm anhalten. Ludwig muss jede 20 suchen und ändern. Vergisst er eine, hält der mBot2 einmal bei 30 und einmal bei 20 cm. In langen Programmen passiert so etwas schnell. - -::: angeberwissen -Profis nennen eine Zahl, die einfach so im Programm steht, eine **magische Zahl**. Magisch, weil niemand mehr weiß, was sie bedeutet. Ich mag nur magische Grashalme. -::: - -## Eine Konstante anlegen - -Besser ist eine **Konstante**. Das ist eine Variable, deren Wert nach dem Festlegen gleich bleibt. Du legst sie einmal ganz oben an und benutzt danach nur noch ihren Namen. - -| | Struktogramm | Java | -|---|---|---| -| anlegen | \`const int ABSTAND = 20\` | \`final int ABSTAND = 20;\` | -| benutzen | \`mbot.getDistance() > ABSTAND\` | \`mbot.getDistance() > ABSTAND\` | - -Im Struktogramm schreibst du \`const\` davor, in Java \`final\`. Beides heißt: Dieser Wert ändert sich nicht mehr. Namen von Konstanten schreibt man in **Großbuchstaben**, dann erkennt man sie sofort. - -::: diagramm vb-l06k-mit.visustruct -Dasselbe Programm mit der Konstanten ABSTAND. Für 30 cm änderst du nur die erste Zeile. -::: - -::: übung vb-konstante-wand -titel: Wand mit Konstante -auftrag: Lege die Konstante \`ABSTAND\` mit dem Wert 20 an. Der mBot2 fährt vor, solange der Abstand größer als \`ABSTAND\` ist. Danach spielt er einen Ton. Es gibt drei Welten. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: Der erste Kasten ist eine Anweisung mit \`const int ABSTAND = 20\`. Darunter kommt eine While-Schleife. -tipp: Die Bedingung der Schleife ist \`mbot.getDistance() > ABSTAND\`. In der Schleife steht **fahre vor**, nach der Schleife **spiele Ton**. -lösung: vb-konstante-wand-loesung.visustruct -::: - -## Jetzt in Java: Quadrat mit Konstante - -Eine Konstante passt auch in einen Befehl. Mit \`final int SEITE = 30;\` fährt \`mbot.forward(SEITE);\` genau 30 cm. Soll das Quadrat größer werden, änderst du nur die eine Zeile. - -::: übung vb-java-konstante-seite -titel: Quadrat mit Konstante -code: java -auftrag: Schreibe in Java: Lege die Konstante \`SEITE\` mit dem Wert 30 an. Fahre dann mit einer For-Schleife ein Quadrat mit der Seitenlänge \`SEITE\`. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: Die erste Zeile ist \`final int SEITE = 30;\`. Danach kommt \`for (int i = 0; i < 4; i++) { … }\`. -tipp: In der Schleife stehen \`mbot.forward(SEITE);\` und \`mbot.turnRight();\`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -::: übung vb-fehler-06-konstanten-final -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Quadrat mit Konstante“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-konstanten-final-start.visustruct -fahrt: 4 x (forward 30, turnRight) -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Konstante dort, wo sie angelegt wird? Konstanten schreibt man in Großbuchstaben. -tipp: Richtig heißt es \`mbot.forward(SEITE)\`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -## Spiel: Konstante oder Variable? - -::: spiel frage -titel: Spiel: Konstante oder Variable? -intro: Ludwig sortiert Werte. Bleibt der Wert im ganzen Programm gleich, ist er eine Konstante. Ändert er sich, ist er eine Variable. Sechs Runden. -frage: Konstante oder Variable? -antworten: Konstante | Variable - -runde: -frage: Die Anzahl der Ecken eines Quadrats -richtig: Konstante -> Ein Quadrat hat immer vier Ecken. - -runde: -frage: Der Abstand, den der Ultraschallsensor gerade misst -richtig: Variable -> Fährt der mBot2, ändert sich der Abstand ständig. - -runde: -frage: Der Mindestabstand, bei dem der mBot2 immer anhalten soll -richtig: Konstante -> Du legst ihn einmal fest, zum Beispiel \`final int ABSTAND = 20;\`. - -runde: -frage: Die Zahl der Schritte, die der mBot2 schon gefahren ist -richtig: Variable -> Nach jedem Schritt wird sie um 1 größer. - -runde: -frage: Die Tonhöhe des Warntons, immer 440 Hz -richtig: Konstante -> Der Warnton klingt immer gleich. - -runde: -frage: Der Akkustand in Prozent -richtig: Variable -> Der Akku wird beim Fahren langsam leer. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was eine Konstante ist. → Eine Konstante anlegen -- Ich kann eine Konstante im Struktogramm und in Java anlegen. → Eine Konstante anlegen -- Ich kann eine Konstante in einer Bedingung und in einem Befehl benutzen. → Jetzt in Java: Quadrat mit Konstante -::: - -## Wissenstest - -::: quiz -? Was ist eine Konstante? -→ Eine Konstante anlegen -- [ ] Eine Variable, die sich in jedem Durchgang ändert -- [x] Eine Variable, deren Wert nach dem Festlegen gleich bleibt -- [ ] Ein Sensor, der immer denselben Wert misst -> Eine Konstante legst du einmal fest. Danach benutzt du nur ihren Namen. -? Wie legst du in Java die Konstante \`ABSTAND\` mit dem Wert 20 an? -→ Eine Konstante anlegen -- [ ] \`const ABSTAND = 20;\` -- [x] \`final int ABSTAND = 20;\` -- [ ] \`int final = 20;\` -> In Java steht \`final\` vor dem Datentyp. Im Struktogramm schreibst du \`const\`. -? Warum ist eine Konstante besser als die Zahl 20 an vielen Stellen? -→ Eine Konstante anlegen -- [ ] Weil das Programm dann schneller fährt -- [x] Weil du den Wert nur an einer Stelle ändern musst -- [ ] Weil der Sensor dann genauer misst -::: -`,B5=`--- -titel: Nah, mittel oder weit? -bereich: Sensoren und Entscheidungen -kurz: Eine Verzweigung mit drei Fällen bauen und in Java mit else if schreiben. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Verzweigung mit drei Fällen bauen -- \`else if\` in Java lesen und schreiben -- die Bedingungen in der richtigen Reihenfolge prüfen -::: - -## Drei Fälle statt zwei - -Viele Autos haben eine **Einparkhilfe**. Ist die Wand weit weg, ist alles frei. Kommt sie näher, heißt es: langsam. Ist sie ganz nah: Stopp! - -Eine Verzweigung hat nur zwei Zweige, Ja und Nein. Für drei Fälle setzt du eine zweite Verzweigung in den Nein-Zweig der ersten: - -1. Ist der Abstand kleiner als 10? Dann **Stopp**. -2. Sonst: Ist der Abstand kleiner als 30? Dann **Langsam**. -3. Sonst: **Frei**. - -::: diagramm vb-l06n-einparkhilfe.visustruct -Die Einparkhilfe. Die zweite Frage wird nur gestellt, wenn die Antwort auf die erste Nein war. -::: - -Probiere es in der [Simulation](#zeige-simulation) aus: Öffne das Diagramm im Editor und stelle den Abstand auf 5, 20 und 50 cm. - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Verzweigung“](?visustruct&lektion=08-verzweigung). Sie öffnet sich in einem neuen Fenster. - -## Tempo nach Abstand im Struktogramm - -::: übung vb-tempo-abstand -titel: Tempo nach Abstand -auftrag: Baue ein Struktogramm mit drei Fällen: Ist der Abstand kleiner als 10, fährt der mBot2 5 cm zurück. Sonst: Ist der Abstand kleiner als 30, fährt er 5 cm vor. Sonst fährt er 20 cm vor. -messwerte: getDistance=5 -> backward 5 -messwerte: getDistance=20 -> forward 5 -messwerte: getDistance=50 -> forward 20 -braucht: verzweigung -tipp: Baue es wie die Einparkhilfe: eine Verzweigung mit \`mbot.getDistance() < 10\` und im Nein-Zweig eine zweite mit \`mbot.getDistance() < 30\`. -tipp: Die Befehle sind \`mbot.backward(5)\`, \`mbot.forward(5)\` und \`mbot.forward(20)\`. Der letzte steht im Nein-Zweig der zweiten Verzweigung. -lösung: vb-tempo-abstand-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand nacheinander auf 5, 20 und 50 cm. - -## Jetzt in Java: else if - -Schau in den Bereich [Code](#zeige-codelive). Die Verzweigung im Nein-Zweig sieht so aus: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} else { - if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); - } else { - mbot.showText("Frei"); - } -} -\`\`\` - -In Java darfst du das kürzer schreiben. Das \`if\` rutscht direkt hinter das \`else\`: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} else if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); -} else { - mbot.showText("Frei"); -} -\`\`\` - -Beides bedeutet genau dasselbe. Mit \`else if\` ist es aber besser zu lesen. Die geschweiften Klammern \`{ }\` schreibst du trotzdem immer. - -::: übung vb-java-tageszeit -titel: Tag oder Nacht? -code: java -auftrag: Schreibe in Java mit \`else if\`: Ist die Helligkeit kleiner als 20, zeigt der mBot2 **Nacht**. Sonst: Ist sie kleiner als 60, zeigt er **Dämmerung**. Sonst zeigt er **Tag**. -messwerte: getBrightness=10 -> none, screen "Nacht" -messwerte: getBrightness=40 -> none, screen "Dämmerung" -messwerte: getBrightness=80 -> none, screen "Tag" -braucht: verzweigung -tipp: Die Helligkeit liest du mit \`mbot.getBrightness()\`. Die erste Bedingung ist \`mbot.getBrightness() < 20\`. -tipp: \`if (…) { mbot.showText("Nacht"); } else if (mbot.getBrightness() < 60) { mbot.showText("Dämmerung"); } else { mbot.showText("Tag"); }\` -lösung: vb-java-tageszeit-loesung.visustruct -::: - -::: übung vb-fehler-06-nah-mittel-weit -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Tag oder Nacht?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-06-nah-mittel-weit-start.visustruct -messwerte: getBrightness=10 -> none, screen "Nacht" -messwerte: getBrightness=40 -> none, screen "Dämmerung" -messwerte: getBrightness=80 -> none, screen "Tag" -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es \`mbot.showText("Nacht")\`. -lösung: vb-java-tageszeit-loesung.visustruct -::: - -## Auf die Reihenfolge kommt es an - -Ludwig hat die Einparkhilfe umgebaut und die Fragen getauscht: - -\`\`\`java -if (mbot.getDistance() < 30) { - mbot.showText("Langsam"); -} else if (mbot.getDistance() < 10) { - mbot.showText("Stopp"); -} -\`\`\` - -Bei 5 cm zeigt sein mBot2 **Langsam** statt **Stopp**. Denn 5 ist auch kleiner als 30. Die erste Bedingung ist schon wahr, die zweite wird gar nicht mehr geprüft. **Stopp** erscheint nie. - -> Merke: Bei \`<\` prüfst du zuerst den kleinsten Wert, dann den nächstgrößeren. - -::: spiel frage -titel: Spiel: Was zeigt die Einparkhilfe? -intro: Ludwigs Einparkhilfe von oben: unter 10 cm **Stopp**, unter 30 cm **Langsam**, sonst **Frei**. Was zeigt sie? Sechs Runden. -frage: Was zeigt die Einparkhilfe? -antworten: Stopp | Langsam | Frei - -runde: -frage: Der Abstand ist **5 cm**. -richtig: Stopp -> 5 ist kleiner als 10. Schon die erste Frage ist wahr. - -runde: -frage: Der Abstand ist **25 cm**. -richtig: Langsam -> 25 ist nicht kleiner als 10, aber kleiner als 30. - -runde: -frage: Der Abstand ist **80 cm**. -richtig: Frei -> Beide Fragen sind falsch, also bleibt der letzte Nein-Zweig. - -runde: -frage: Der Abstand ist genau **10 cm**. -richtig: Langsam -> 10 ist nicht kleiner als 10. Die erste Frage ist falsch, die zweite wahr. - -runde: -frage: Der Abstand ist genau **30 cm**. -richtig: Frei -> 30 ist nicht kleiner als 30. Beide Fragen sind falsch. - -runde: -frage: Der Abstand ist **9 cm**. -richtig: Stopp -> 9 ist kleiner als 10. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Verzweigung mit drei Fällen bauen. → Drei Fälle statt zwei -- Ich kann \`else if\` in Java lesen und schreiben. → Jetzt in Java: else if -- Ich kann die Bedingungen in der richtigen Reihenfolge prüfen. → Auf die Reihenfolge kommt es an -::: - -## Wissenstest - -::: quiz -? Wie viele Verzweigungen brauchst du im Struktogramm für drei Fälle? -→ Drei Fälle statt zwei -- [ ] Eine -- [x] Zwei, die zweite im Nein-Zweig der ersten -- [ ] Drei nebeneinander -> Jede Verzweigung teilt in zwei Zweige. Die zweite teilt den Nein-Zweig noch einmal. -? Was bedeutet \`else if\` in Java? -→ Jetzt in Java: else if -- [x] Sonst prüfe noch eine Bedingung -- [ ] Wiederhole die Bedingung -- [ ] Prüfe beide Bedingungen gleichzeitig -> \`else if\` ist die kurze Schreibweise für ein \`if\` im \`else\`-Zweig. -? Ludwig prüft zuerst \`< 30\` und danach \`< 10\`. Was passiert bei 5 cm? -→ Auf die Reihenfolge kommt es an -- [ ] Es erscheint Stopp. -- [x] Es erscheint Langsam. -- [ ] Es erscheint gar nichts. -> 5 ist auch kleiner als 30. Die zweite Bedingung wird nicht mehr geprüft. -::: -`,P5=`--- -titel: Der Liniensensor -bereich: Sensoren und Entscheidungen -kurz: Dunkle Linien auf dem Boden erkennen und nicht vom Tisch fallen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was die Zahl von \`mbot.getLine()\` bedeutet -- bis zu einer Linie fahren -- in Java mit einer Variable Schritte zählen -::: - -## Vier Fühler unter der Nase - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der [Liniensensor]{teil=lineSensor} hat vier Fühler nebeneinander. Jeder leuchtet den Boden an und misst, wie viel Licht zurückkommt. Schwarz schluckt das Licht, Weiß wirft es zurück. - -| Sensor | Text | Wert | -|---|---|---| -| Linie | \`mbot.getLine()\` | \`0\` = alles hell, größer als \`0\` = mindestens ein Fühler sieht Schwarz | - -Für den Anfang reicht dir: **\`mbot.getLine() == 0\` heißt „keine Linie“**, \`mbot.getLine() != 0\` heißt „Linie gefunden“. - -::: angeberwissen -\`mbot.getLine()\` ist eigentlich eine Binärzahl mit vier Stellen, eine für jeden Fühler: \`1111\` (also 15) heißt „alle vier sehen Schwarz“, \`0110\` (6) „nur die mittleren“. Damit kann ein mBot2 sogar einer Linie folgen. -::: - -## Am Rand umkehren im Struktogramm - -Stell dir einen Tisch mit schwarzem Klebeband am Rand vor. Der mBot2 soll vorfahren, bis er das Band sieht, und dann umkehren, damit er nicht herunterfällt. - -::: übung vb-rand -titel: Am Rand umkehren -auftrag: Der mBot2 fährt vor, solange \`mbot.getLine() == 0\` ist. Danach dreht er sich um 180°. Es gibt zwei Welten mit unterschiedlich weitem Weg. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Linie** darauf. Schreib \`== 0\` dahinter. In die Schleife kommt **fahre vor**. -tipp: Nach der Schleife (darunter, nicht darin) steht \`mbot.turnRight(180)\`. -lösung: vb-rand-loesung.visustruct -::: - -## Jetzt in Java: hin und zurück - -Jetzt soll der mBot2 nach dem Umkehren genau bis zum Start zurückfahren. Dafür zählt er mit einer **Variable**, wie oft er vorgefahren ist. - -\`\`\`java -int schritte = 0; -while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; -} -\`\`\` - -::: übung vb-java-rand -titel: Bis zur Linie und zurück -code: java -auftrag: Schreibe in Java: Der mBot2 fährt bis zur Linie und zählt dabei seine Schritte. Dann dreht er sich um 180° und fährt mit einer For-Schleife genauso viele Schritte zurück. -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -braucht: whileSchleife, forSchleife -tipp: Nach der While-Schleife: \`mbot.turnRight(180);\` und dann \`for (int i = 0; i < schritte; i++) { … }\`. -tipp: In der For-Schleife steht nur \`mbot.forward();\`. -lösung: vb-java-rand-loesung.visustruct -::: - -::: übung vb-fehler-07-linie -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis zur Linie und zurück“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-07-linie-start.visustruct -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`schritte = schritte + 1\`. -lösung: vb-java-rand-loesung.visustruct -::: - -## Spiel: Linie oder nicht? - -::: spiel frage -titel: Spiel: Linie oder nicht? -intro: Wo steht der mBot2, und ist die Bedingung wahr oder falsch? Sechs Runden. -antworten: wahr | falsch - -runde: - mbot.getLine() == 0 -frage: Der mBot2 steht auf weißem Papier. Ist die Bedingung wahr? -richtig: wahr -> Kein Fühler sieht Schwarz, also liefert \`mbot.getLine()\` 0. - -runde: - mbot.getLine() == 0 -frage: Die beiden mittleren Fühler stehen auf dem schwarzen Klebeband. Ist die Bedingung wahr? -richtig: falsch -> Zwei Fühler sehen Schwarz, also ist \`mbot.getLine()\` größer als 0. - -runde: - mbot.getLine() != 0 -frage: Nur der äußere linke Fühler sieht Schwarz. Ist die Bedingung wahr? -richtig: wahr -> Ein Fühler reicht schon, dann ist der Wert nicht mehr 0. - -runde: - mbot.getLine() != 0 -frage: Der mBot2 steht auf weißem Boden. Ist die Bedingung wahr? -richtig: falsch -> Auf Weiß ist der Wert 0, und \`0 != 0\` ist falsch. - -runde: - mbot.getLine() == 15 -frage: Eine Querlinie: Alle vier Fühler sehen Schwarz. Ist die Bedingung wahr? -richtig: wahr -> Alle vier Fühler ergeben die Binärzahl \`1111\`, also 15. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; - } -frage: Die Linie ist 30 cm entfernt, jede Fahrt ist 10 cm lang. Ist danach \`schritte == 3\`? -richtig: wahr -> Nach drei Fahrten steht er auf der Linie, und die Schleife hört auf. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getLine() != 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Soll bis zum schwarzen Rand fahren und dann umkehren. -fehler: 1 -besser: while (mbot.getLine() == 0) { -> Er soll fahren, solange **keine** Linie da ist, also \`== 0\`. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(); -frage: Soll bis zum schwarzen Rand fahren und dann umkehren. -fehler: 4 -besser: mbot.turnRight(180); -> Umkehren heißt 180°. Ohne Zahl dreht er sich nur 90°. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte - 1; - } -frage: Soll bis zur Linie fahren und die Schritte zählen. -fehler: 4 -besser: schritte = schritte + 1; -> Zählen heißt eins dazu, nicht eins weg. - -runde: - int schritte = "0"; - while (mbot.getLine() == 0) { - mbot.forward(); - schritte = schritte + 1; - } -frage: Soll bis zur Linie fahren und die Schritte zählen. -fehler: 1 -besser: int schritte = 0; -> In Anführungszeichen ist die 0 ein Text. In ein \`int\` passt nur eine Zahl. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schwarz ist Klebeband. Tippe auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ..=.. | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, bis er auf dem schwarzen Feld steht. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } - mbot.turnRight(180); - mbot.forward(60); -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> Bis zum Rand, umkehren und zwei Felder zurück. - -runde: - int schritte = 0; - while (mbot.getLine() == 0) { - mbot.forward(30); - schritte = schritte + 1; - } - mbot.turnRight(180); - for (int i = 0; i < schritte; i++) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..^.. -ziel: 2,3 -> Er zählt drei Schritte bis zur Linie und fährt genau drei zurück: wieder am Start. - -runde: - mbot.turnRight(); - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ^...= | ..... -ziel: 4,1 -> Erst nach rechts drehen, dann bis zum schwarzen Feld ganz rechts. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was die Zahl von \`mbot.getLine()\` bedeutet. → Vier Fühler unter der Nase -- Ich kann bis zu einer Linie fahren. → Am Rand umkehren im Struktogramm -- Ich kann in Java mit einer Variable Schritte zählen. → Jetzt in Java: hin und zurück -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf weißem Papier. Was liefert \`mbot.getLine()\`? -→ Vier Fühler unter der Nase -- [x] 0 -- [ ] 15 -- [ ] 1 -> Kein Fühler sieht Schwarz, also 0. -? Welche Bedingung heißt „Linie gefunden“? -→ Am Rand umkehren im Struktogramm -- [ ] \`mbot.getLine() == 0\` -- [x] \`mbot.getLine() != 0\` -- [ ] \`mbot.getLine() < 0\` -> \`!=\` heißt „ungleich“. -::: -`,O5=`--- -titel: Und, oder, nicht -bereich: Sensoren und Entscheidungen -kurz: Zwei Sensoren in einer Bedingung prüfen: und, oder, nicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- zwei Bedingungen mit \`&&\` (und) verknüpfen -- zwei Bedingungen mit \`||\` (oder) verknüpfen -- eine Bedingung mit \`!\` (nicht) umdrehen -- eine verknüpfte Bedingung in einer Java-Schleife schreiben -::: - -## Wand und Linie: und - -Der mBot2 soll nur vorfahren, wenn vorn frei ist **und** unter ihm keine Linie ist. Zwei Sensoren, eine Bedingung. In Java heißt **und** \`&&\`: - -\`\`\`java -mbot.getDistance() > 15 && mbot.getLine() == 0 -\`\`\` - -Die ganze Bedingung ist nur wahr, wenn **beide** Teile wahr sind: - -| vorn frei? | keine Linie? | frei \`&&\` keine Linie | -|---|---|---| -| wahr | wahr | **wahr** | -| wahr | falsch | falsch | -| falsch | wahr | falsch | -| falsch | falsch | falsch | - -So eine Tabelle heißt **Wahrheitstabelle** (englisch *truth table*). - -::: übung vb-und -titel: Frei und keine Linie -auftrag: Baue ein Struktogramm mit einer Verzweigung: Ist der Abstand größer als 15 **und** \`mbot.getLine() == 0\`, fährt der mBot2 vor. Sonst tut er nichts. -messwerte: getDistance=50, getLine=0 -> forward -messwerte: getDistance=10, getLine=0 -> none -messwerte: getDistance=50, getLine=6 -> none -braucht: verzweigung -tipp: Zieh den Sensor **Abstand** auf die Verzweigung und schreib \`> 15\` dahinter. Dann tippst du \` && \` und den zweiten Teil \`mbot.getLine() == 0\`. -tipp: Im true-Zweig steht **fahre vor**, der false-Zweig bleibt leer. -lösung: vb-und-loesung.visustruct -::: - -> Beim Prüfen setzt VisuStruct den Abstand und die Linie auf verschiedene Werte. Nur wenn beides passt, darf der mBot2 fahren. - -## Taste A oder Taste B: oder - -Jetzt soll der mBot2 piepen, wenn du Taste A **oder** Taste B drückst. Es reicht, wenn eine der beiden gedrückt ist. In Java heißt **oder** \`||\`. Die beiden Striche findest du auf der Tastatur meist mit **Alt Gr** und **<** (Windows) oder **Option** und **7** (Mac). - -| Taste A? | Taste B? | A oder B | -|---|---|---| -| wahr | wahr | **wahr** | -| wahr | falsch | **wahr** | -| falsch | wahr | **wahr** | -| falsch | falsch | falsch | - -::: übung vb-oder -titel: Taste A oder B -auftrag: Baue ein Struktogramm: Ist Taste A **oder** Taste B gedrückt, spielt der mBot2 einen Ton. Sonst tut er nichts. -messwerte: isButtonA=true, isButtonB=false -> tone -messwerte: isButtonA=false, isButtonB=true -> tone -messwerte: isButtonA=false, isButtonB=false -> noTone -braucht: verzweigung -tipp: Die Bedingung der Verzweigung ist \`mbot.isButtonA() || mbot.isButtonB()\`. -tipp: Im true-Zweig steht \`mbot.playTone(440, 300)\`, der false-Zweig bleibt leer. -lösung: vb-oder-loesung.visustruct -::: - -## Nicht: das Gegenteil - -Manchmal willst du das Gegenteil einer Bedingung. Dafür gibt es \`!\`, gesprochen **nicht**. \`mbot.isButtonA()\` ist wahr, wenn Taste A gedrückt ist. \`!mbot.isButtonA()\` ist wahr, wenn sie **nicht** gedrückt ist. - -\`\`\`java -while (!mbot.isButtonA()) { - mbot.pause(100); -} -mbot.forward(30); -\`\`\` - -Der mBot2 wartet, solange Taste A nicht gedrückt ist. Danach fährt er los. - -## Jetzt in Java: Sicher fahren - -Jetzt kommt alles zusammen. Der mBot2 fährt, solange vorn frei ist **und** keine Linie kommt. Egal, was zuerst kommt, die Wand oder der Rand: Er hält an und piept. - -::: übung vb-java-sicher-fahren -titel: Sicher fahren -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange der Abstand größer als 15 ist **und** \`mbot.getLine() == 0\` ist. Danach spielt er einen Ton. In zwei Welten wartet eine Wand, in zwei Welten ein schwarzer Rand. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -braucht: whileSchleife -tipp: \`while (mbot.getDistance() > 15 && mbot.getLine() == 0) { … }\` -tipp: In der Schleife steht \`mbot.forward();\`, nach der Schleife \`mbot.playTone(440, 300);\`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Bedingungen verknüpfen“](?visustruct&lektion=09-bedingungen-verknuepfen). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-07-und-oder -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Sicher fahren“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-07-und-oder-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.playTone(440, 300)\`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -## Spiel: Wahr oder falsch? - -::: spiel frage -titel: Spiel: Wahr oder falsch? -intro: Ludwig stellt den mBot2 in eine Lage. Ist die Bedingung wahr oder falsch? Acht Runden. -antworten: wahr | falsch - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: Die Wand ist 50 cm weg, unter ihm ist keine Linie. -richtig: wahr -> Beide Teile sind wahr, also ist auch das Ganze wahr. - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: Die Wand ist 10 cm weg, unter ihm ist keine Linie. -richtig: falsch -> Bei \`&&\` müssen beide Teile wahr sein. Der Abstand stimmt nicht. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Nur Taste B ist gedrückt. -richtig: wahr -> Bei \`||\` reicht ein wahrer Teil. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Keine Taste ist gedrückt. -richtig: falsch -> Beide Teile sind falsch, dann ist auch \`||\` falsch. - -runde: - !mbot.isButtonA() -frage: Taste A ist gedrückt. -richtig: falsch -> \`mbot.isButtonA()\` ist wahr, das \`!\` macht daraus falsch. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: Die Wand ist 10 cm weg, und er steht auf einer Linie. -richtig: falsch -> Kein Teil ist wahr, also ist auch \`||\` falsch. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: Die Wand ist 50 cm weg, und er steht auf einer Linie. -richtig: wahr -> Der erste Teil ist wahr, das reicht bei \`||\`. - -runde: - !mbot.isButtonA() && mbot.getDistance() > 15 -frage: Niemand drückt eine Taste, die Wand ist 30 cm weg. -richtig: wahr -> A ist nicht gedrückt, also ist \`!mbot.isButtonA()\` wahr. Der Abstand stimmt auch. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getDistance() > 15 || mbot.getLine() == 0) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Soll fahren, solange vorn frei ist **und** keine Linie kommt. -fehler: 1 -besser: while (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> Mit \`||\` fährt er weiter, wenn nur einer der Teile stimmt, zum Beispiel über den Rand. - -runde: - if (mbot.isButtonA() && mbot.isButtonB()) { - mbot.playTone(440, 300); - } -frage: Soll piepen, wenn Taste A **oder** Taste B gedrückt ist. -fehler: 1 -besser: if (mbot.isButtonA() || mbot.isButtonB()) { -> „Oder“ heißt in Java \`||\`. Mit \`&&\` piept er nur, wenn beide gedrückt sind. - -runde: - while (mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Soll warten, bis Taste A gedrückt wird, und dann losfahren. -fehler: 1 -besser: while (!mbot.isButtonA()) { -> Warten heißt: Schleife, solange A **nicht** gedrückt ist. Das \`!\` fehlt. - -runde: - if (mbot.getDistance() > 15 & mbot.getLine() == 0) { - mbot.forward(); - } -frage: Soll vorfahren, wenn vorn frei ist und keine Linie da ist. -fehler: 1 -besser: if (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> „Und“ schreibt man mit zwei Zeichen: \`&&\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann zwei Bedingungen mit \`&&\` (und) verknüpfen. → Wand und Linie: und -- Ich kann zwei Bedingungen mit \`||\` (oder) verknüpfen. → Taste A oder Taste B: oder -- Ich kann eine Bedingung mit \`!\` (nicht) umdrehen. → Nicht: das Gegenteil -- Ich kann eine verknüpfte Bedingung in einer Java-Schleife schreiben. → Jetzt in Java: Sicher fahren -::: - -## Wissenstest - -::: quiz -? Der Abstand ist 50 und \`mbot.getLine()\` liefert 6. Fährt der mBot2 bei „Frei und keine Linie“? -→ Wand und Linie: und -- [ ] Ja, vorn ist ja frei. -- [x] Nein, denn bei \`&&\` müssen beide Teile wahr sein. -- [ ] Nur halb so weit. -> Er steht auf einer Linie. Damit ist ein Teil falsch, also die ganze Bedingung. -? Nur Taste B ist gedrückt. Ist \`mbot.isButtonA() || mbot.isButtonB()\` wahr? -→ Taste A oder Taste B: oder -- [x] Ja -- [ ] Nein -> Bei \`||\` reicht es, wenn ein Teil wahr ist. -? Taste A ist gedrückt. Was ist \`!mbot.isButtonA()\`? -→ Nicht: das Gegenteil -- [ ] wahr -- [x] falsch -> \`!\` dreht den Wert um: aus wahr wird falsch. -? Welche Bedingung hält den mBot2 an der Wand **und** am Rand an? -→ Jetzt in Java: Sicher fahren -- [x] \`while (mbot.getDistance() > 15 && mbot.getLine() == 0)\` -- [ ] \`while (mbot.getDistance() > 15 || mbot.getLine() == 0)\` -- [ ] \`while (mbot.getDistance() > 15)\` -> Mit \`||\` würde er weiterfahren, solange nur einer der Teile stimmt, also zum Beispiel über den Rand hinaus. -::: -`,M5=`--- -titel: Farben erkennen -bereich: Sensoren und Entscheidungen -kurz: Der Quad-RGB-Sensor sagt, auf welcher Farbe der mBot2 steht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit \`mbot.getColor().equals(…)\` eine Farbe abfragen -- mit \`!\` eine Bedingung umdrehen -- eine Verzweigung in eine Schleife schreiben -::: - -## Ein Sensor, der Farben sieht - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der [Liniensensor]{teil=lineSensor} heißt eigentlich **Quad-RGB-Sensor**. „Quad“ heißt vier (vier Fühler), „RGB“ steht für Rot, Grün und Blau. Er leuchtet den Boden in diesen drei Farben an und misst, welche Farbe zurückkommt. So erkennt er farbige Felder. - -\`mbot.getColor()\` liefert den Namen der Farbe unter dem mBot2, und zwar als **Text**: - -| Boden | \`mbot.getColor()\` | -|---|---| -| rotes Feld | \`"rot"\` | -| grünes Feld | \`"grün"\` | -| blaues Feld | \`"blau"\` | -| gelbes Feld | \`"gelb"\` | -| schwarzes Feld oder Linie | \`"schwarz"\` | -| heller Boden | \`"weiß"\` | - -Ob es eine bestimmte Farbe ist, fragst du mit \`.equals(…)\`: \`mbot.getColor().equals("rot")\` ist **wahr**, wenn der mBot2 auf Rot steht, sonst **falsch**. Das ist also schon eine fertige Bedingung. - -> Texte vergleichst du in Java immer mit \`.equals(…)\`, **nicht** mit \`==\`. Das \`==\` sieht richtig aus, klappt bei Texten aber oft nicht. - -> Mit dem \`!\` davor drehst du eine Bedingung um: \`!mbot.getColor().equals("rot")\` heißt „**nicht** rot“. - -## Fahre bis Rot im Struktogramm - -::: übung vb-bis-rot -titel: Fahre bis Rot -auftrag: Der mBot2 fährt vor, solange er **nicht** auf einem roten Feld steht. In der zweiten Welt liegt vorher ein grünes Feld, das soll ihn nicht stören. -welt: farbe-1 -> forward 20 -welt: farbe-2 -> forward 50 -braucht: whileSchleife -tipp: Zieh eine While-Schleife ins Struktogramm und den Sensor **Farbe ist rot?** darauf. Schreib ein \`!\` vor \`mbot.getColor().equals("rot")\`. -tipp: Die Bedingung heißt \`!mbot.getColor().equals("rot")\`, in der Schleife steht **fahre vor**. -lösung: vb-bis-rot-loesung.visustruct -::: - -## Jetzt in Java: bei Grün piepen - -Jetzt kombinierst du eine Schleife mit einer Verzweigung: Der mBot2 fährt bis Blau. Kommt er unterwegs über ein grünes Feld, piept er. - -::: übung vb-java-blau-gruen -titel: Bis Blau, bei Grün piepen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt vor, solange er nicht auf Blau steht. Nach jedem Schritt prüft er: Steht er auf Grün, spielt er einen Ton. In der zweiten Welt gibt es kein grünes Feld, da darf er nicht piepen. -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -braucht: whileSchleife, verzweigung -tipp: Außen steht \`while (!mbot.getColor().equals("blau")) { … }\`. Darin zuerst \`mbot.forward();\`. -tipp: Danach, noch in der Schleife: \`if (mbot.getColor().equals("grün")) { mbot.playTone(880, 200); }\`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -::: übung vb-fehler-08-farben -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Bis Blau, bei Grün piepen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-08-farben-start.visustruct -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es \`equals("grün")\`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 tun soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Fünf Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (mbot.getColor().equals("rot")) { - mbot.forward(); - } -frage: Soll vorfahren, bis er auf Rot steht. -fehler: 1 -besser: while (!mbot.getColor().equals("rot")) { -> Er soll fahren, solange er **nicht** auf Rot steht. Dafür fehlt das \`!\`. - -runde: - if (mbot.getColor() == "grün") { - mbot.playTone(440, 300); - } -frage: Soll piepen, wenn er auf Grün steht. -fehler: 1 -besser: if (mbot.getColor().equals("grün")) { -> Texte vergleichst du mit \`.equals(…)\`, nicht mit \`==\`. - -runde: - while (!mbot.getColor().equals("blau")) { - mbot.forward(); - if (mbot.getColor().equals("grün")) { - mbot.turnRight(); - } - } -frage: Soll bis Blau fahren und bei Grün piepen. -fehler: 4 -besser: mbot.playTone(440, 300); -> Bei Grün soll er piepen, nicht abbiegen. - -runde: - if (mbot.getColor().equals(rot)) { - mbot.turnRight(); - } -frage: Soll sich auf Rot nach rechts drehen. -fehler: 1 -besser: if (mbot.getColor().equals("rot")) { -> Ohne Anführungszeichen sucht Java eine Variable \`rot\`. Der Farbname ist ein Text. - -runde: - while (!mbot.getColor().equals("rot")) { - mbot.forward(); - } - mbot.playTone(440, 300) -frage: Soll bis Rot fahren und dann piepen. -fehler: 4 -besser: mbot.playTone(440, 300); -> Am Ende der Anweisung fehlt das Semikolon. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit \`mbot.getColor().equals(…)\` eine Farbe abfragen. → Ein Sensor, der Farben sieht -- Ich kann mit \`!\` eine Bedingung umdrehen. → Fahre bis Rot im Struktogramm -- Ich kann eine Verzweigung in eine Schleife schreiben. → Jetzt in Java: bei Grün piepen -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf einem roten Feld. Was ist \`!mbot.getColor().equals("rot")\`? -→ Fahre bis Rot im Struktogramm -- [ ] wahr -- [x] falsch -> \`mbot.getColor().equals("rot")\` ist wahr, das \`!\` macht daraus falsch. Die Schleife hört also auf. -? Womit vergleichst du die Farbe mit \`"grün"\`? -→ Ein Sensor, der Farben sieht -- [x] \`mbot.getColor().equals("grün")\` -- [ ] \`mbot.getColor() == "grün"\` -- [ ] \`mbot.getColor() = "grün"\` -> \`mbot.getColor()\` liefert einen Text, und Texte vergleicht man mit \`.equals(…)\`. Ein einzelnes \`=\` ist eine Zuweisung, gar kein Vergleich. -::: -`,Z5=`--- -titel: Der größte Wert -bereich: Sensoren und Entscheidungen -kurz: Rundum messen und sich den größten Wert merken: Wo ist am meisten Platz? ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit einer Variablen den bisher größten Wert merken -- in einer Schleife jeden neuen Messwert mit dem bisher größten vergleichen -- mit dem mBot2 herausfinden, in welcher Richtung am meisten Platz ist -::: - -## Den Rekord merken - -Beim Weitsprung gibt es eine Tafel mit dem **Rekord**. Nach jedem Sprung schaut die Schiedsrichterin: Ist der neue Sprung weiter als der Rekord? Dann kommt er an die Tafel. Sonst bleibt der alte Rekord stehen. - -Genau so findet ein Programm den größten Wert. Die Tafel ist eine Variable \`max\`: - -1. **Vor** der Schleife: \`int max = 0\`. Noch steht nichts an der Tafel. -2. **In** der Schleife: Ist der neue Wert größer als \`max\`? Dann \`max = wert\`. -3. **Nach** der Schleife steht in \`max\` der größte Wert. - -Der mBot2 dreht sich viermal und misst jedes Mal den Abstand. So sieht das im Schreibtischtest aus: - -| Richtung | gemessen | größer als \`max\`? | \`max\` danach | -|---|---|---|---| -| vorher | | | 0 | -| vorn | 16 | ja | 16 | -| rechts | 36 | ja | 36 | -| hinten | 6 | nein | 36 | -| links | 26 | nein | 36 | - -> Wichtig: Die Verzweigung hat nur einen Ja-Zweig. Ist der Wert nicht größer, passiert nichts. Der alte Rekord bleibt. - -## Wo ist am meisten Platz? - -::: übung vb-meister-platz -titel: Wo ist am meisten Platz? -auftrag: Baue ein Struktogramm: Lege \`int max = 0\` an. Der mBot2 misst viermal den Abstand und dreht sich danach jeweils nach rechts. Ist ein Abstand größer als \`max\`, merkt er ihn sich in \`max\`. Zum Schluss zeigt er zum Beispiel **Am weitesten: 36 cm**. Es gibt zwei Welten. -welt: platz-1 -> screen "Am weitesten: 36 cm" -welt: platz-2 -> screen "Am weitesten: 46 cm" -braucht: forSchleife, verzweigung -tipp: Die For-Schleife läuft viermal. In ihr stehen drei Kästen: \`int abstand = mbot.getDistance()\`, eine Verzweigung und **drehe rechts**. -tipp: Die Verzweigung prüft \`abstand > max\`. Im Ja-Zweig steht \`max = abstand\`, der Nein-Zweig bleibt leer. Nach der Schleife: \`mbot.showText("Am weitesten: " + max + " cm")\`. -lösung: vb-meister-platz-loesung.visustruct -::: - -::: angeberwissen -Viele Saugroboter haben oben einen kleinen Turm mit einem Laser. Er dreht sich und misst ringsum die Abstände. So zeichnet der Roboter eine Karte der Wohnung. Bei mir zu Hause misst niemand. Ich fresse mir einfach den Weg frei. -::: - -## Jetzt in Java: Die Richtung merken - -Jetzt weiß der mBot2, **wie viel** Platz es höchstens gibt. Aber **wo**? Dafür merkt er sich in einer zweiten Variablen auch die Richtung. Die Zählvariable \`i\` sagt dir, die wievielte Messung es war: 0 ist vorn, 1 ist rechts, 2 ist hinten und 3 ist links. - -\`\`\`java -if (abstand > max) { - max = abstand; - richtung = i; -} -\`\`\` - -Beide Zeilen stehen im Ja-Zweig. Nur wenn es einen neuen Rekord gibt, ändert sich auch die Richtung. - -::: übung vb-java-richtung -titel: Die Richtung merken -code: java -auftrag: Schreibe „Wo ist am meisten Platz?“ in Java. Merke dir zusätzlich in \`int richtung = 0\` die Nummer der Messung mit dem größten Abstand. Zeige zum Schluss zum Beispiel **Richtung: 1**. -welt: platz-1 -> screen "Richtung: 1" -welt: platz-2 -> screen "Richtung: 0" -braucht: forSchleife, verzweigung -tipp: Vor der Schleife stehen \`int max = 0;\` und \`int richtung = 0;\`. In der Schleife: \`int abstand = mbot.getDistance();\`, die Verzweigung und \`mbot.turnRight();\`. -tipp: Im Ja-Zweig stehen \`max = abstand;\` und \`richtung = i;\`. Nach der Schleife: \`mbot.showText("Richtung: " + richtung);\` -lösung: vb-java-richtung-loesung.visustruct -::: - -::: übung vb-fehler-08-groesster-wert -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Die Richtung merken“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-08-groesster-wert-start.visustruct -welt: platz-1 -> screen "Richtung: 1" -welt: platz-2 -> screen "Richtung: 0" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`richtung = i\`. -lösung: vb-java-richtung-loesung.visustruct -::: - -## Spiel: Neuer Rekord? - -::: spiel frage -titel: Spiel: Neuer Rekord? -intro: Der mBot2 misst nacheinander mehrere Abstände. Was steht am Ende in \`max\`? Fünf Runden. - -runde: -frage: Gemessen: 20, 50, 30 -- 30 -- [x] 50 -- 100 -> 50 ist der größte Wert. Die 30 danach ist kein neuer Rekord. - -runde: -frage: Gemessen: 10, 20, 30, 40 -- 10 -- [x] 40 -- 100 -> Jeder Wert ist ein neuer Rekord. Am Ende steht der letzte da. - -runde: -frage: Gemessen: 90, 10, 20, 30 -- 30 -- [x] 90 -- 10 -> Der Rekord kommt gleich am Anfang. Danach ist kein Wert größer. - -runde: -frage: Gemessen: 15, 15, 15 -- 45 -- 0 -- [x] 15 -> 15 ist nicht größer als 15. \`max\` bleibt 15. - -runde: -frage: Gemessen: 25, 60, 60, 5. In welcher Richtung (\`i\`) ist der Rekord? -- 0 -- [x] 1 -- 2 -> Bei \`i = 1\` kommt die 60. Die zweite 60 ist nicht **größer**, also bleibt \`richtung\` bei 1. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit einer Variablen den bisher größten Wert merken. → Den Rekord merken -- Ich kann in einer Schleife jeden neuen Messwert mit dem bisher größten vergleichen. → Wo ist am meisten Platz? -- Ich kann mit dem mBot2 herausfinden, in welcher Richtung am meisten Platz ist. → Jetzt in Java: Die Richtung merken -::: - -## Wissenstest - -::: quiz -? Womit fängt \`max\` vor der Schleife an? -→ Den Rekord merken -- [x] Mit 0, weil noch nichts gemessen ist -- [ ] Mit dem größten Wert -- [ ] Mit 100 -> Jeder Abstand ist größer als 0, also wird schon der erste Messwert der Rekord. -? Was steht im Nein-Zweig der Verzweigung \`abstand > max\`? -→ Den Rekord merken -- [ ] \`max = 0\` -- [ ] \`max = abstand\` -- [x] Nichts, der alte Rekord bleibt. -? Wann ändert sich \`richtung\`? -→ Jetzt in Java: Die Richtung merken -- [ ] In jedem Durchgang -- [x] Nur wenn es einen neuen Rekord gibt -- [ ] Nur in der letzten Runde -::: -`,L5=`--- -titel: Fallauswahl mit Farben -bereich: Sensoren und Entscheidungen -kurz: Je nach Farbe oder Linie etwas anderes tun, mit einer Fallauswahl statt vieler Verzweigungen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Fallauswahl mit Texten bauen -- eine Fallauswahl mit Zahlen in Java schreiben -- je nach Zahl einen anderen Text auf dem Bildschirm zeigen -::: - -## Viele Farben, viele Fälle - -Der mBot2 soll auf jede Farbe anders reagieren: bei Rot rechts abbiegen, bei Grün ein Stück vorfahren, bei Blau piepen. Mit Verzweigungen bräuchtest du drei ineinander. Übersichtlicher ist die **Fallauswahl**, in Java \`switch\`: - -\`\`\`java -switch (mbot.getColor()) { - case "rot" -> { - mbot.turnRight(); - } - case "grün" -> { - mbot.forward(20); - } - default -> { - mbot.forward(10); - } -} -\`\`\` - -- Oben in den Klammern steht der Wert, der geprüft wird, hier die Farbe. -- Jeder \`case\` ist ein **Fall**. Passt der Wert, läuft genau dieser Fall. -- \`default\` ist der Fall für **alles andere**. - -Im Struktogramm ist die Fallauswahl ein Kasten mit mehreren Spalten, für jeden Fall eine. - -::: übung vb-farbweiche -titel: Farbweiche -auftrag: Baue eine Fallauswahl über \`mbot.getColor()\`. Bei \`"rot"\` dreht sich der mBot2 nach rechts. Bei \`"grün"\` fährt er 20 cm vor. Bei \`"blau"\` spielt er einen Ton mit 880 Hertz, 200 Millisekunden lang. In allen anderen Fällen fährt er 10 cm vor. -messwerte: getColor=rot -> turnRight -messwerte: getColor=grün -> forward 20 -messwerte: getColor=blau -> none, tone -messwerte: getColor=weiß -> forward 10 -braucht: fallauswahl -tipp: Zieh eine Fallauswahl ins Struktogramm. Oben steht \`mbot.getColor()\`, die Fälle heißen \`"rot"\`, \`"grün"\` und \`"blau"\`, dazu der Fall für alles andere. -tipp: Bei Rot \`mbot.turnRight()\`, bei Grün \`mbot.forward(20)\`, bei Blau \`mbot.playTone(880, 200)\`, sonst \`mbot.forward(10)\`. -lösung: vb-farbweiche-loesung.visustruct -::: - -## Jetzt in Java: Linienmuster - -Auch eine Zahl kann der Wert einer Fallauswahl sein. \`mbot.getLine()\` aus Lektion 7 liefert zum Beispiel: - -| Wert | Bedeutung | -|---|---| -| \`0\` | keine Linie | -| \`6\` | die beiden mittleren Fühler sehen die Linie: Er steht genau drauf | -| \`15\` | alle vier sehen Schwarz: eine Querlinie | - -Bei Zahlen schreibst du den Fall ohne Anführungszeichen: \`case 6 -> { … }\`. - -::: übung vb-linienmuster -titel: Linienmuster -code: java -auftrag: Schreibe in Java eine Fallauswahl über \`mbot.getLine()\`. Bei 6 fährt der mBot2 10 cm vor. Bei 0 dreht er sich nach rechts. Bei 15 zeigt er **Querlinie!** auf dem Bildschirm. In allen anderen Fällen fährt er 5 cm vor. -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Querlinie!" -messwerte: getLine=4 -> forward 5 -braucht: fallauswahl -tipp: \`switch (mbot.getLine()) { case 6 -> { … } case 0 -> { … } case 15 -> { … } default -> { … } }\` -tipp: Bei 6 \`mbot.forward(10);\`, bei 0 \`mbot.turnRight();\`, bei 15 \`mbot.showText("Querlinie!");\`, sonst \`mbot.forward(5);\`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Jetzt in Java: Startsignal - -Vor einem Rennen zeigt der mBot2 nacheinander drei Texte und fährt dann los. Eine For-Schleife zählt die Runden 1, 2 und 3. Die Fallauswahl sucht zu jeder Runde den passenden Text: - -\`\`\`java -for (int runde = 1; runde <= 3; runde++) { - switch (runde) { - case 1 -> { mbot.showText("Auf die Plätze"); } - ... - } - mbot.pause(1000); -} -\`\`\` - -::: übung vb-startsignal -titel: Startsignal -code: java -auftrag: Schreibe in Java: Eine Schleife zählt \`runde\` von 1 bis 3. In Runde 1 zeigt der Bildschirm **Auf die Plätze**, in Runde 2 **Fertig**, sonst **Los!**. Nach jedem Text wartet der mBot2 eine Sekunde. Nach der Schleife fährt er 50 cm vor. -befehle: showText "Auf die Plätze", pause 1000, showText "Fertig", pause 1000, showText "Los!", pause 1000 -fahrt: forward 50 -braucht: fallauswahl -tipp: Die Schleife heißt \`for (int runde = 1; runde <= 3; runde++) { … }\`. Darin steht \`switch (runde) { … }\` und danach \`mbot.pause(1000);\`. -tipp: \`case 1 -> { mbot.showText("Auf die Plätze"); }\`, \`case 2 -> { … }\` und \`default -> { mbot.showText("Los!"); }\`. Nach der Schleife \`mbot.forward(50);\`. -lösung: vb-startsignal-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Fallauswahl“](?visustruct&lektion=10-fallauswahl). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-09-fallauswahl-mbot2 -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Linienmuster“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-09-fallauswahl-mbot2-start.visustruct -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Querlinie!" -messwerte: getLine=4 -> forward 5 -tipp: Lies die Fehlermeldung genau. Ist der Befehl richtig geschrieben? Nach \`mbot.\` schlägt dir der Editor alle Befehle vor. -tipp: Richtig heißt es \`mbot.turnRight()\`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Spiel: Welcher Fall läuft? - -::: spiel frage -titel: Spiel: Welcher Fall läuft? -intro: Lies die Fallauswahl und sag vorher, was der mBot2 tut. Sechs Runden. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Grün. Was tut er? -- Er dreht sich nach rechts. -- [x] Er fährt 20 cm vor. -- Er fährt 10 cm vor. -> Der Fall \`"grün"\` passt, also läuft genau dieser. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Gelb. Was tut er? -- Gar nichts. -- Er piept. -- [x] Er fährt 10 cm vor. -> Für Gelb gibt es keinen Fall, also läuft \`default\`. - -runde: - switch (mbot.getColor()) { - case "rot" -> { mbot.turnRight(); } - case "grün" -> { mbot.forward(20); } - case "blau" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: Der mBot2 steht auf Blau. Was tut er? -- [x] Er piept. -- Er piept und fährt dann 10 cm vor. -- Er dreht sich nach rechts. -> Es läuft nur der passende Fall. \`default\` kommt nur dran, wenn kein anderer Fall passt. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Querlinie!"); } - default -> { mbot.stop(); } - } -frage: Alle vier Fühler sehen Schwarz. Was tut der mBot2? -- Er fährt 10 cm vor. -- [x] Er zeigt **Querlinie!** -- Er hält an. -> Vier Fühler auf Schwarz ergeben 15. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Querlinie!"); } - default -> { mbot.stop(); } - } -frage: Unter dem mBot2 ist alles weiß. Was tut er? -- Er fährt 10 cm vor. -- [x] Er dreht sich nach rechts. -- Er hält an. -> Kein Fühler sieht Schwarz, also liefert \`mbot.getLine()\` 0. - -runde: - for (int runde = 1; runde <= 3; runde++) { - switch (runde) { - case 1 -> { mbot.showText("Auf die Plätze"); } - case 2 -> { mbot.showText("Fertig"); } - default -> { mbot.showText("Los!"); } - } - } -frage: Was zeigt der Bildschirm in Runde 3? -- Fertig -- [x] Los! -- Auf die Plätze -> Für 3 gibt es keinen eigenen Fall, also läuft \`default\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Fallauswahl mit Texten bauen. → Viele Farben, viele Fälle -- Ich kann eine Fallauswahl mit Zahlen in Java schreiben. → Jetzt in Java: Linienmuster -- Ich kann je nach Zahl einen anderen Text auf dem Bildschirm zeigen. → Jetzt in Java: Startsignal -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht auf Gelb. Welcher Fall der Farbweiche läuft? -→ Viele Farben, viele Fälle -- [ ] der Fall \`"rot"\` -- [ ] gar keiner -- [x] \`default\` -> Für Gelb gibt es keinen eigenen Fall. Dann läuft der Fall für alles andere. -? Wie schreibst du den Fall für die Zahl 6? -→ Jetzt in Java: Linienmuster -- [x] \`case 6 -> { … }\` -- [ ] \`case "6" -> { … }\` -- [ ] \`if 6 -> { … }\` -> Zahlen stehen ohne Anführungszeichen, Texte wie \`"rot"\` mit. -::: -`,W5=`--- -titel: Tasten und Joystick -bereich: Sensoren und Entscheidungen -kurz: Der mBot2 wartet auf dich und lässt sich fernsteuern. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Sensoren für Tasten und Joystick abfragen -- auf eine Taste warten -- den mBot2 mit dem Joystick steuern -::: - -## Drücken als Sensor - -::: mbot2 -fokus: joystick, buttons -ansicht: oben -::: - -Auf dem CyberPi sitzen zwei [Tasten]{teil=buttons} (A und B) und ein [Joystick]{teil=joystick}. Für dein Programm sind das Sensoren: Sie liefern **wahr**, solange du drückst. - -| Sensor | Text | -|---|---| -| Taste A / B gedrückt? | \`mbot.isButtonA()\`, \`mbot.isButtonB()\` | -| Joystick nach oben / unten | \`mbot.isJoystickUp()\`, \`mbot.isJoystickDown()\` | -| Joystick nach links / rechts | \`mbot.isJoystickLeft()\`, \`mbot.isJoystickRight()\` | - -> Ohne echten mBot2 klappst du in der [Simulation](#zeige-simulation) unter der Welt **🎛 Sensoren ausprobieren** auf. Dort gibt es die Knöpfe A, B und die Pfeile für den Joystick. Ein Klick hält sie eine Sekunde lang gedrückt. - -## Warten auf Taste A im Struktogramm - -Ein Roboter soll nicht sofort losfahren, wenn das Programm startet. Besser: Er wartet, bis du A drückst. - -Warten heißt: eine Schleife, die so lange läuft, wie A **nicht** gedrückt ist. Damit sie nicht ganz leer ist, wartet der mBot2 darin kurz mit **kurz warten** (\`mbot.pause(100)\`, also 100 Millisekunden). - -::: übung vb-start-a -titel: Start mit Taste A -auftrag: Der mBot2 wartet, bis Taste A gedrückt ist. Dann fährt er 30 cm vor. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: Eine While-Schleife mit der Bedingung \`!mbot.isButtonA()\`. Darin steht **kurz warten**. -tipp: Nach der Schleife steht \`mbot.forward(30)\`. -lösung: vb-start-a-loesung.visustruct -::: - -> Beim Prüfen ist Taste A erst eine Weile nicht gedrückt und dann gedrückt. Fährt dein mBot2 zu früh los, fällt das auf. - -## Jetzt in Java: Fernsteuerung - -Mit dem Joystick lenkst du den mBot2. Das Programm fragt fünfmal nacheinander den Joystick ab: nach oben heißt vorfahren, nach unten zurückfahren. - -::: übung vb-java-joystick -titel: Fernsteuerung -code: java -auftrag: Schreibe in Java eine For-Schleife, die fünfmal läuft. Darin: Ist der Joystick oben, fährt der mBot2 vor. Sonst: Ist er unten, fährt er zurück. -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -braucht: forSchleife, verzweigung -tipp: \`for (int i = 0; i < 5; i++) { … }\` und darin \`if (mbot.isJoystickUp()) { … } else { … }\`. -tipp: Im \`else\` steht noch eine Verzweigung: \`if (mbot.isJoystickDown()) { mbot.backward(); }\`. -lösung: vb-java-joystick-loesung.visustruct -::: - -::: übung vb-fehler-10-tasten-joystick -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Fernsteuerung“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-10-tasten-joystick-start.visustruct -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.backward()\`. -lösung: vb-java-joystick-loesung.visustruct -::: - -## Spiel: Was tut der mBot2? - -::: spiel frage -titel: Spiel: Was tut der mBot2? -intro: Du drückst eine Taste oder den Joystick. Was tut der mBot2? Sechs Runden. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Niemand drückt eine Taste. Was tut der mBot2? -- Er fährt 30 cm vor. -- [x] Er wartet weiter. -- Er piept. -> Solange A nicht gedrückt ist, bleibt er in der Warteschleife. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du drückst Taste B. Was tut der mBot2? -- Er fährt 30 cm vor. -- [x] Er wartet weiter. -- Er fährt 30 cm zurück. -> Die Schleife fragt nur nach Taste A. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du drückst Taste A. Was tut der mBot2? -- [x] Er fährt 30 cm vor. -- Er wartet weiter. -- Er wartet 100 ms und hört dann auf. -> Jetzt ist \`!mbot.isButtonA()\` falsch, die Schleife endet, und er fährt los. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: Du drückst den Joystick nach unten. Was tut der mBot2? -- Er fährt vor. -- [x] Er fährt zurück. -- Gar nichts. -> Die erste Bedingung ist falsch, die zweite wahr. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: Du drückst den Joystick nach links. Was tut der mBot2? -- Er dreht sich nach links. -- Er fährt zurück. -- [x] Gar nichts. -> Für links gibt es keinen Zweig. Beide Bedingungen sind falsch. - -runde: -frage: Du hältst Taste A gedrückt. Was liefert \`mbot.isButtonA()\`? -- [x] true -- false -- 1 -> Tasten liefern wahr oder falsch, und gedrückt heißt wahr. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Sensoren für Tasten und Joystick abfragen. → Drücken als Sensor -- Ich kann auf eine Taste warten. → Warten auf Taste A im Struktogramm -- Ich kann den mBot2 mit dem Joystick steuern. → Jetzt in Java: Fernsteuerung -::: - -## Wissenstest - -::: quiz -? Was liefert \`mbot.isButtonB()\`, wenn niemand drückt? -→ Drücken als Sensor -- [ ] 0 -- [x] false -- [ ] B -> Tasten liefern wahr oder falsch. -? Warum steht in der Warteschleife **kurz warten**? -→ Warten auf Taste A im Struktogramm -- [x] Damit die Schleife nicht leer ist und der CyberPi nicht unnötig schnell im Kreis rennt. -- [ ] Damit die Taste länger leuchtet. -- [ ] Ohne Pause fährt der mBot2 rückwärts. -> Die Schleife fragt alle 100 Millisekunden nach, das reicht völlig. -::: -`,E5=`--- -titel: Notbremse mit break -bereich: Sensoren und Entscheidungen -kurz: Eine Endlosschleife mit Aussprung: Der mBot2 fährt immer weiter, bis die Notbremse greift. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Endlosschleife mit einem Aussprung beenden -- erklären, warum der Aussprung in einer Verzweigung steht -- in Java eine Schleife mit \`while (true)\` und \`break\` schreiben -::: - -## Endlosschleife mit Aussprung - -Viele Roboter-Programme laufen „für immer“: Der mBot2 fährt, misst, fährt, misst … Dafür gibt es die **Endlosschleife**. Sie hat keine Bedingung und hört von selbst nie auf. - -Damit der mBot2 trotzdem anhalten kann, brauchst du eine **Notbremse**: den **Aussprung**. Er verlässt sofort die Schleife, in der er steht. Das Programm macht mit dem ersten Kasten **nach** der Schleife weiter. Du erkennst ihn an der Spitze am linken Rand. In den Kasten schreibst du einen kurzen Kommentar, zum Beispiel \`Schleife verlassen\`. - -Ein Aussprung steht fast immer in einer **Verzweigung**. Sonst würde die Schleife schon beim ersten Durchgang enden. - -::: übung vb-notbremse -titel: Notbremse an der Wand -auftrag: Baue eine Endlosschleife. Darin prüft eine Verzweigung: Ist der Abstand kleiner als 15 cm, kommt ein Aussprung. Danach (unter der Verzweigung, noch in der Schleife) fährt der mBot2 vor. Nach der Schleife spielt er einen Ton. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -braucht: endlosschleife, aussprung -tipp: Zieh die **Endlosschleife** ins Struktogramm. In die Schleife kommt zuerst eine Verzweigung mit \`mbot.getDistance() < 15\`, im true-Zweig der **Aussprung**, der false-Zweig bleibt leer. -tipp: Unter die Verzweigung (in der Schleife) kommt **fahre vor**, unter die Schleife \`mbot.playTone(440, 300)\`. -lösung: vb-notbremse-loesung.visustruct -::: - -## Jetzt in Java: Stopp mit Taste A - -In Java ist die Endlosschleife \`while (true)\`. Der Aussprung heißt \`break\`: - -\`\`\`java -while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); -} -\`\`\` - -::: übung vb-java-taste-stopp -titel: Stopp mit Taste A -code: java -auftrag: Schreibe in Java: Der mBot2 fährt in einer Endlosschleife immer weiter vor. Wird Taste A gedrückt, verlässt er die Schleife mit \`break\`. Danach zeigt der Bildschirm **Gestoppt**. -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -braucht: endlosschleife, aussprung -tipp: \`while (true) { … }\` mit \`if (mbot.isButtonA()) { break; }\` und danach \`mbot.forward();\`. -tipp: Nach der Schleife \`mbot.showText("Gestoppt");\`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Aufruf und Aussprung“](?visustruct&lektion=18-aufruf-und-aussprung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-10-unterbrechen-mit-break -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Stopp mit Taste A“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-10-unterbrechen-mit-break-start.visustruct -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es \`mbot.showText("Gestoppt")\`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -## Spiel: Notbremse - -::: spiel frage -titel: Spiel: Notbremse -intro: Wann greift der Aussprung, und was passiert danach? Jede Fahrt ist 10 cm lang. Fünf Runden. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Die Wand ist am Anfang 40 cm entfernt. Wie oft fährt er vor? -- 2-mal -- [x] 3-mal -- immer weiter -> Bei 40, 30 und 20 fährt er. Bei 10 greift die Notbremse. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Was passiert direkt nach \`break\`? -- Die Schleife beginnt von vorn. -- Er fährt noch einmal vor. -- [x] Er piept. -> \`break\` verlässt die Schleife. Weiter geht es mit dem ersten Befehl danach. - -runde: - while (true) { - mbot.forward(); - break; - } -frage: Wie oft fährt der mBot2 vor? -- [x] 1-mal -- gar nicht -- immer weiter -> Der Aussprung steht nicht in einer Verzweigung. Die Schleife endet schon im ersten Durchgang. - -runde: - while (true) { - mbot.forward(); - } -frage: Wann hört diese Schleife auf? -- nach 10 Fahrten -- an der Wand -- [x] nie -> Ohne \`break\` ist \`while (true)\` wirklich endlos. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Du drückst Taste A, nachdem er zweimal vorgefahren ist. Wie oft ist er vorgefahren? -- [x] 2-mal -- 3-mal -- gar nicht -> Beim nächsten Durchgang merkt er die Taste und springt aus der Schleife. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - while (true) { - if (mbot.getDistance() > 15) { - break; - } - mbot.forward(); - } -frage: Soll vorfahren und an der Wand mit der Notbremse anhalten. -fehler: 2 -besser: if (mbot.getDistance() < 15) { -> Die Notbremse soll greifen, wenn die Wand **nah** ist. - -runde: - while (true) { - if (mbot.isButtonB()) { - break; - } - mbot.forward(); - } - mbot.showText("Gestoppt"); -frage: Soll vorfahren, bis Taste A gedrückt wird, und dann „Gestoppt“ zeigen. -fehler: 2 -besser: if (mbot.isButtonA()) { -> Gebremst werden soll mit Taste A, nicht mit B. - -runde: - while (true) { - if (mbot.isButtonA()) { - brake; - } - mbot.forward(); - } -frage: Soll vorfahren, bis Taste A gedrückt wird. -fehler: 3 -besser: break; -> Der Aussprung heißt \`break\`, nicht \`brake\`. - -runde: - while (false) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Soll in einer Endlosschleife fahren, bis Taste A gedrückt wird. -fehler: 1 -besser: while (true) { -> Die Endlosschleife heißt \`while (true)\`. Mit \`false\` läuft sie kein einziges Mal. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Endlosschleife mit einem Aussprung beenden. → Endlosschleife mit Aussprung -- Ich kann erklären, warum der Aussprung in einer Verzweigung steht. → Endlosschleife mit Aussprung -- Ich kann in Java eine Schleife mit \`while (true)\` und \`break\` schreiben. → Jetzt in Java: Stopp mit Taste A -::: - -## Wissenstest - -::: quiz -? Wo macht das Programm nach einem Aussprung weiter? -→ Endlosschleife mit Aussprung -- [ ] am Anfang der Schleife -- [x] beim ersten Kasten nach der Schleife -- [ ] ganz am Anfang des Programms -> Der Aussprung verlässt die Schleife sofort. -? Warum steht der Aussprung in einer Verzweigung? -→ Endlosschleife mit Aussprung -- [x] Sonst endet die Schleife schon im ersten Durchgang. -- [ ] Sonst fährt der mBot2 rückwärts. -- [ ] Das ist nur schöner. -> Nur wenn die Bedingung zutrifft, soll die Notbremse greifen. -? Wie heißt die Endlosschleife in Java? -→ Jetzt in Java: Stopp mit Taste A -- [ ] \`while (false)\` -- [x] \`while (true)\` -- [ ] \`for (;;) break;\` -> \`true\` ist immer wahr, die Schleife hört nur mit \`break\` auf. -::: -`,N5=`--- -titel: Der Lichtsensor -bereich: Sensoren und Entscheidungen -kurz: Hell oder dunkel? Der mBot2 wird zum Nachtlicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Helligkeit abfragen -- mit einer Verzweigung die LEDs schalten -- mehrere Befehle in einen Zweig schreiben -::: - -## Wie hell ist es? - -::: mbot2 -fokus: lightSensor -ansicht: oben -::: - -Der [Lichtsensor]{teil=lightSensor} sitzt auf dem CyberPi. \`mbot.getBrightness()\` liefert eine Zahl von **0** (stockdunkel) bis **100** (sehr hell). - -| Sensor | Text | Wert | -|---|---|---| -| Helligkeit | \`mbot.getBrightness()\` | 0 bis 100 | - -> In der Simulation stellst du die Helligkeit mit dem Regler unter **🎛 Sensoren ausprobieren** ein. Mit einem echten mBot2 hältst du einfach die Hand über den CyberPi. - -## Nachtlicht im Struktogramm - -::: übung vb-nachtlicht -titel: Nachtlicht -auftrag: Ist die Helligkeit kleiner als 30, leuchten die LEDs weiß (\`mbot.setLed(255, 255, 255)\`). Sonst gehen die LEDs aus (\`mbot.ledOff()\`). -messwerte: getBrightness=10 -> ledOn -messwerte: getBrightness=80 -> ledOff -braucht: verzweigung -tipp: Zieh eine Verzweigung ins Struktogramm und den Sensor **Helligkeit** darauf. Schreib \`< 30\` dahinter. -tipp: Im true-Zweig steht **LEDs an** mit \`mbot.setLed(255, 255, 255)\`, im false-Zweig **LEDs aus**. -lösung: vb-nachtlicht-loesung.visustruct -::: - -::: angeberwissen -Straßenlaternen machen es genauso: Ein Lichtsensor merkt, wann es dämmert, und schaltet sie ein. Darum gehen sie im Winter früher an als im Sommer, ohne dass jemand eine Uhr umstellt. -::: - -## Jetzt in Java: Nachtlicht mit Ton - -::: übung vb-java-nachtlicht-ton -titel: Nachtlicht mit Ton -code: java -auftrag: Schreibe das Nachtlicht in Java, aber mit zwei Änderungen: Im Dunkeln leuchten die LEDs gelb (\`mbot.setLed(255, 200, 0)\`) **und** der mBot2 spielt einen Ton. Im Hellen gehen die LEDs aus, ohne Ton. -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -braucht: verzweigung -tipp: \`if (mbot.getBrightness() < 30) { … } else { … }\` -tipp: Im \`if\`-Teil stehen zwei Zeilen: \`mbot.setLed(255, 200, 0);\` und \`mbot.playTone(440, 300);\`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -::: übung vb-fehler-11-licht -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Nachtlicht mit Ton“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-11-licht-start.visustruct -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es \`mbot.setLed(255, 200, 0)\`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -## Spiel: Licht an oder aus? - -::: spiel frage -titel: Spiel: Licht an oder aus? -intro: Wie hell ist es, und was tun die LEDs? Sechs Runden. -antworten: LEDs an | LEDs aus - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Es ist fast dunkel, die Helligkeit ist 10. -richtig: LEDs an -> 10 ist kleiner als 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist 45. -richtig: LEDs aus -> 45 ist nicht kleiner als 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist genau 30. -richtig: LEDs aus -> 30 ist nicht kleiner als 30. Für „bis einschließlich 30“ bräuchtest du \`<=\`. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: Die Helligkeit ist 29. -richtig: LEDs an -> 29 ist gerade noch kleiner als 30. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: Die Helligkeit ist 50. -richtig: LEDs an -> Achtung, hier ist es umgekehrt: 50 ist nicht größer als 70, also läuft der false-Zweig. Die LEDs leuchten gelb. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: Die Sonne scheint, die Helligkeit ist 100. -richtig: LEDs aus -> 100 ist größer als 70, also läuft der true-Zweig. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Helligkeit abfragen. → Wie hell ist es? -- Ich kann mit einer Verzweigung die LEDs schalten. → Nachtlicht im Struktogramm -- Ich kann mehrere Befehle in einen Zweig schreiben. → Jetzt in Java: Nachtlicht mit Ton -::: - -## Wissenstest - -::: quiz -? \`mbot.getBrightness()\` liefert 45. Was tut das Nachtlicht? -→ Nachtlicht im Struktogramm -- [ ] Die LEDs leuchten. -- [x] Die LEDs gehen aus. -> 45 ist nicht kleiner als 30. -? In welchem Bereich liegen die Werte des Lichtsensors? -→ Wie hell ist es? -- [ ] 0 bis 255 -- [x] 0 bis 100 -- [ ] -100 bis 100 -::: -`,F5=`--- -titel: Ein Merker mit boolean -bereich: Sensoren und Entscheidungen -kurz: Mit einer Variablen vom Typ boolean festhalten, ob etwas passiert ist. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Variable vom Typ \`boolean\` anlegen -- mit einem Merker festhalten, ob etwas passiert ist -- einen Merker nach der Schleife in einer Bedingung abfragen -::: - -## Wahr oder falsch - -Eine Variable vom Typ \`boolean\` kennt nur zwei Werte: \`true\` (wahr) und \`false\` (falsch). Du kennst das schon von den Sensoren: \`mbot.isButtonA()\` liefert \`true\` oder \`false\`. Auch ein Vergleich wie \`mbot.getDistance() < 10\` ist am Ende \`true\` oder \`false\`. - -| Anlegen | Bedeutung | -|---|---| -| \`boolean dunkel = false\` | Es war noch nicht dunkel. | -| \`dunkel = true\` | Jetzt war es dunkel. | -| \`if (dunkel)\` | Ist \`dunkel\` wahr? | - -Bei \`if (dunkel)\` brauchst du kein \`== true\`. Die Variable ist ja selbst schon wahr oder falsch. - -## Der Merker - -Der mBot2 soll drei Sekunden lang Wache halten. Er misst immer wieder die Helligkeit. Danach soll er sagen, ob es **irgendwann** dunkel war. - -Dafür nimmst du einen **Merker**: eine \`boolean\`-Variable, die mit \`false\` anfängt. Wird es dunkel, setzt du sie auf \`true\`. Danach setzt sie niemand mehr zurück. Nach der Schleife weißt du also: War es auch nur ein einziges Mal dunkel? - -::: übung vb-wurde-es-dunkel -titel: Wurde es dunkel? -auftrag: Baue ein Struktogramm: Lege \`boolean dunkel = false\` an. Prüfe in einer For-Schleife 30-mal: Ist die Helligkeit kleiner als 20, wird \`dunkel\` wahr. Warte in jedem Durchgang 100 ms. Zeige danach **Es war dunkel** oder **Immer hell**. -messwerte: getBrightness=80/10/80 -> none, screen "Es war dunkel" -messwerte: getBrightness=80 -> none, screen "Immer hell" -braucht: forSchleife, verzweigung -tipp: In der Schleife steht eine Verzweigung mit \`mbot.getBrightness() < 20\`. Im Ja-Zweig steht \`dunkel = true\`, der Nein-Zweig bleibt leer. Danach kommt \`mbot.pause(100)\`. -tipp: Nach der Schleife kommt eine zweite Verzweigung mit der Bedingung \`dunkel\`. Ja: \`mbot.showText("Es war dunkel")\`, Nein: \`mbot.showText("Immer hell")\`. -lösung: vb-wurde-es-dunkel-loesung.visustruct -::: - -> Beim Prüfen wird es in der Mitte der Wache kurz dunkel und dann wieder hell. Zeigt dein mBot2 trotzdem **Es war dunkel**? - -## Jetzt in Java: Wurde geklatscht? - -In Java sieht der Merker so aus: - -\`\`\`java -boolean laut = false; -for (int i = 0; i < 30; i++) { - if (mbot.getLoudness() > 60) { - laut = true; - } - mbot.pause(100); -} -\`\`\` - -\`true\` und \`false\` schreibst du in Java immer klein. - -::: übung vb-java-klatsch-merker -titel: Wurde geklatscht? -code: java -auftrag: Schreibe in Java: Der mBot2 hört drei Sekunden lang zu (30-mal mit 100 ms Pause). Ist die Lautstärke einmal größer als 60, merkt er sich das in \`boolean laut\`. Danach zeigt er **Geklatscht!** oder **Alles still**. -messwerte: getLoudness=0/90/0 -> none, screen "Geklatscht!" -messwerte: getLoudness=0 -> none, screen "Alles still" -braucht: forSchleife, verzweigung -tipp: Nimm den Code oben und schreibe danach \`if (laut) { … } else { … }\`. -tipp: In die Zweige kommen \`mbot.showText("Geklatscht!");\` und \`mbot.showText("Alles still");\`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -::: übung vb-fehler-11-merker-boolean -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wurde geklatscht?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-11-merker-boolean-start.visustruct -messwerte: getLoudness=0/90/0 -> none, screen "Geklatscht!" -messwerte: getLoudness=0 -> none, screen "Alles still" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie schreibt man wahr und falsch in Java? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`laut = true\`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -## Spiel: true oder false? - -::: spiel frage -titel: Spiel: true oder false? -intro: Ludwig fragt, was in der Bedingung herauskommt. Sechs Runden. -frage: Ist es true oder false? -antworten: true | false - -runde: -frage: \`mbot.getDistance() < 10\`, der Abstand ist 25 cm. -richtig: false -> 25 ist nicht kleiner als 10. - -runde: -frage: \`mbot.isButtonA()\`, und du drückst gerade Taste A. -richtig: true -> Der Sensor meldet: gedrückt. - -runde: -frage: \`boolean dunkel = false\`. In der Schleife wird es nie dunkel. Was ist \`dunkel\` danach? -richtig: false -> Niemand hat den Merker auf \`true\` gesetzt. - -runde: -frage: \`boolean dunkel = false\`. In der Schleife wird es einmal dunkel, danach wieder hell. Was ist \`dunkel\` danach? -richtig: true -> Ein Merker bleibt \`true\`, wenn er einmal gesetzt wurde. - -runde: -frage: \`mbot.getBrightness() > 50\`, die Helligkeit ist 50. -richtig: false -> 50 ist nicht größer als 50. - -runde: -frage: \`!mbot.isButtonA()\`, und du drückst Taste A nicht. -richtig: true -> Taste A ist nicht gedrückt, also \`false\`. Das \`!\` dreht es um: \`true\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Variable vom Typ \`boolean\` anlegen. → Wahr oder falsch -- Ich kann mit einem Merker festhalten, ob etwas passiert ist. → Der Merker -- Ich kann einen Merker nach der Schleife in einer Bedingung abfragen. → Jetzt in Java: Wurde geklatscht? -::: - -## Wissenstest - -::: quiz -? Welche Werte kann eine Variable vom Typ \`boolean\` haben? -→ Wahr oder falsch -- [ ] Jede ganze Zahl -- [x] Nur \`true\` und \`false\` -- [ ] Nur 0 und 1 -? Womit fängt ein Merker an? -→ Der Merker -- [x] Mit \`false\`, weil noch nichts passiert ist -- [ ] Mit \`true\` -- [ ] Mit dem ersten Messwert -> Erst wenn das Ereignis passiert, wird er \`true\`. -? Wie fragst du in Java ab, ob der Merker \`laut\` wahr ist? -→ Jetzt in Java: Wurde geklatscht? -- [x] \`if (laut)\` -- [ ] \`if (laut = true)\` -- [ ] \`if laut\` -> \`laut\` ist selbst schon wahr oder falsch. Ein einzelnes \`=\` wäre eine Zuweisung. -::: -`,R5=`--- -titel: Das Mikrofon -bereich: Sensoren und Entscheidungen -kurz: Klatschen zum Losfahren und eine Lärmampel für das Klassenzimmer. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Lautstärke abfragen -- warten, bis etwas passiert -- eine Lärmampel in Java schreiben -::: - -## Wie laut ist es? - -::: mbot2 -fokus: microphone -ansicht: oben -::: - -Das [Mikrofon]{teil=microphone} des CyberPi misst die Lautstärke. \`mbot.getLoudness()\` liefert **0** (still) bis **100** (sehr laut). Ein Klatschen in der Nähe ergibt ungefähr 60 bis 90. - -| Sensor | Text | Wert | -|---|---|---| -| Lautstärke | \`mbot.getLoudness()\` | 0 bis 100 | - -## Klatschen zum Losfahren im Struktogramm - -Wie beim Warten auf Taste A: Eine Schleife wartet, solange es leise ist. Erst dann fährt der mBot2 los. - -::: übung vb-klatschen -titel: Klatschen zum Losfahren -auftrag: Der mBot2 wartet, solange die Lautstärke kleiner als 50 ist. Danach fährt er 30 cm vor. -messwerte: getLoudness=0/80 -> forward 30 -messwerte: getLoudness=90 -> forward 30 -braucht: whileSchleife -tipp: Eine While-Schleife mit der Bedingung \`mbot.getLoudness() < 50\`, darin **kurz warten**. -tipp: Nach der Schleife: \`mbot.forward(30)\`. -lösung: vb-klatschen-loesung.visustruct -::: - -> In der Simulation schiebst du den Regler **Lautstärke** nach rechts, während das Programm wartet. - -## Jetzt in Java: Lärmampel - -::: übung vb-java-laermampel -titel: Lärmampel -code: java -auftrag: Schreibe in Java: Ist die Lautstärke größer als 60, leuchten die LEDs rot. Sonst sind sie aus. -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -braucht: verzweigung -tipp: \`if (mbot.getLoudness() > 60) { … } else { … }\` -tipp: Rot ist \`mbot.setLed(255, 0, 0);\`, aus ist \`mbot.ledOff();\`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -::: angeberwissen -Lautstärke misst man eigentlich in **Dezibel** (dB). Flüstern hat etwa 30 dB, ein Klassenzimmer 60 bis 70 dB, ein Presslufthammer 100 dB. Der CyberPi rechnet das in eine einfache Zahl von 0 bis 100 um. -::: - -::: übung vb-fehler-12-lautstaerke -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Lärmampel“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-12-lautstaerke-start.visustruct -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.ledOff()\`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -## Spiel: Laut oder leise? - -::: spiel frage -titel: Spiel: Laut oder leise? -intro: Wie laut ist es, und was tut der mBot2? Sechs Runden. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: In der Klasse ist es ruhig, die Lautstärke ist 30. -- [x] Er wartet weiter. -- Er fährt 30 cm vor. -> 30 ist kleiner als 50, die Warteschleife läuft weiter. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: Du klatschst, die Lautstärke ist 70. -- Er wartet weiter. -- [x] Er fährt 30 cm vor. -> 70 ist nicht kleiner als 50. Die Schleife endet, und er fährt los. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: Die Lautstärke ist genau 50. -- Er wartet weiter. -- [x] Er fährt 30 cm vor. -> 50 ist nicht kleiner als 50. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Die Lautstärke ist 65. -- [x] Die LEDs leuchten rot. -- Die LEDs sind aus. -> 65 ist größer als 60: zu laut. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Die Lautstärke ist genau 60. -- Die LEDs leuchten rot. -- [x] Die LEDs sind aus. -> 60 ist nicht größer als 60. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Jemand flüstert, die Lautstärke ist 10. -- Die LEDs leuchten rot. -- [x] Die LEDs sind aus. -> Flüstern ist leise. Die Lärmampel bleibt aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Lautstärke abfragen. → Wie laut ist es? -- Ich kann warten, bis etwas passiert. → Klatschen zum Losfahren im Struktogramm -- Ich kann eine Lärmampel in Java schreiben. → Jetzt in Java: Lärmampel -::: - -## Wissenstest - -::: quiz -? Die Klatsch-Schleife lautet \`while (mbot.getLoudness() < 50)\`. Es ist 30 laut. Was passiert? -→ Klatschen zum Losfahren im Struktogramm -- [x] Der mBot2 wartet weiter. -- [ ] Der mBot2 fährt los. -> 30 ist kleiner als 50, die Bedingung ist wahr, die Schleife läuft weiter. -::: -`,J5=`--- -titel: Der Lagesensor -bereich: Sensoren und Entscheidungen -kurz: Neigung messen und Schütteln erkennen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was der Lagesensor misst -- zwei Bedingungen mit „oder“ verbinden -- mehrere Bedingungen mit „und“ verbinden -::: - -## Schief oder gerade? - -::: mbot2 -fokus: cyberpi -drehen: ja -::: - -Im [CyberPi]{teil=cyberpi} steckt ein **Lagesensor** (Gyroskop). Er misst, wie schief der mBot2 steht, in Grad: - -| Sensor | Text | Wert | -|---|---|---| -| Neigung vorn/hinten | \`mbot.getPitch()\` | Nase nach unten: positiv, nach oben: negativ (−90 bis 90) | -| Neigung seitlich | \`mbot.getRoll()\` | zur einen Seite positiv, zur anderen negativ | -| Geschüttelt? | \`mbot.isShaken()\` | \`true\` oder \`false\` | - -Steht der mBot2 flach auf dem Tisch, sind beide Neigungen ungefähr **0**. - -> In der Simulation gibt es dafür zwei Regler unter **🎛 Sensoren ausprobieren** und den Knopf **schütteln**. Mit einem echten mBot2 kippst du ihn vorsichtig in der Hand. - -## Schräglage-Warnung im Struktogramm - -Fährt der mBot2 eine zu steile Rampe hoch oder runter, soll er warnen. Zu steil heißt: mehr als 20° nach vorn **oder** mehr als 20° nach hinten. - -::: übung vb-schraeglage -titel: Schräglage-Warnung -auftrag: Ist die Neigung vorn/hinten größer als 20 **oder** kleiner als −20, spielt der mBot2 einen Ton. Sonst tut er nichts. -messwerte: getPitch=30 -> tone -messwerte: getPitch=-30 -> tone -messwerte: getPitch=5 -> noTone -braucht: verzweigung -tipp: „oder“ heißt in einer Bedingung \`||\`. Zieh den Sensor **Neigung vorn/hinten** zweimal auf die Verzweigung. -tipp: Die Bedingung heißt \`mbot.getPitch() > 20 || mbot.getPitch() < -20\`, im true-Zweig steht **Ton spielen**. -lösung: vb-schraeglage-loesung.visustruct -::: - -## Jetzt in Java: Wasserwaage - -Eine Wasserwaage zeigt, ob etwas genau gerade ist. Der mBot2 leuchtet grün, wenn beide Neigungen zwischen −5 und 5 liegen. - -::: übung vb-java-wasserwaage -titel: Wasserwaage -code: java -auftrag: Schreibe in Java: Liegen \`mbot.getPitch()\` und \`mbot.getRoll()\` beide zwischen −5 und 5, leuchten die LEDs grün. Sonst sind sie aus. -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -braucht: verzweigung -tipp: „und“ heißt \`&&\`. Du brauchst vier Vergleiche: \`mbot.getPitch() > -5 && mbot.getPitch() < 5 && …\` -tipp: Grün ist \`mbot.setLed(0, 255, 0);\`, im \`else\` steht \`mbot.ledOff();\`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -::: übung vb-fehler-13-neigung -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wasserwaage“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-13-neigung-start.visustruct -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.setLed(0, 255, 0)\`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -## Spiel: Zu schief? - -::: spiel frage -titel: Spiel: Zu schief? -intro: Ludwig kippt den mBot2. Was tut er? Sechs Runden. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Die Nase zeigt 30° nach unten, \`mbot.getPitch()\` liefert 30. -- [x] Er piept. -- Er piept nicht. -> 30 ist größer als 20. Ein wahrer Teil reicht bei \`||\`. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Die Nase zeigt nach oben, \`mbot.getPitch()\` liefert −25. -- [x] Er piept. -- Er piept nicht. -> −25 ist kleiner als −20, also ist der zweite Teil wahr. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: Eine flache Rampe, \`mbot.getPitch()\` liefert 10. -- Er piept. -- [x] Er piept nicht. -> 10 liegt zwischen −20 und 20. Beide Teile sind falsch. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: \`mbot.getPitch()\` liefert genau 20. -- Er piept. -- [x] Er piept nicht. -> 20 ist nicht größer als 20. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: \`mbot.getPitch()\` liefert 0, \`mbot.getRoll()\` liefert 3. -- [x] Die LEDs leuchten grün. -- Die LEDs sind aus. -> Alle vier Teile sind wahr. Der mBot2 liegt fast gerade. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: \`mbot.getPitch()\` liefert 2, \`mbot.getRoll()\` liefert −8. -- Die LEDs leuchten grün. -- [x] Die LEDs sind aus. -> −8 ist nicht größer als −5. Bei \`&&\` macht ein falscher Teil alles falsch. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- ↓ 1 7 JOYSTICK: kleiner Hebel auf dem CyberPi -- → 4 1 FALLAUSWAHL: switch: für jeden Wert ein eigener Fall -- → 2 3 SENSOR: Bauteil, das etwas misst -- → 6 1 VERZWEIGUNG: je nach Bedingung das eine oder das andere -- ↓ 6 9 ULTRASCHALL: damit misst der mBot2 den Abstand: ein sehr hoher Ton und sein Echo -- → 8 3 BREAK: Notbremse: verlässt sofort die Schleife -- ↓ 8 3 BEDINGUNG: ist wahr oder falsch, z. B. mbot.getDistance() < 20 -- ↓ 1 11 HELLIGKEIT: mbot.getBrightness() misst sie -lösung: 4 7, 6 6, 12 3, 2 6, 2 7, 8 4 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was der Lagesensor misst. → Schief oder gerade? -- Ich kann zwei Bedingungen mit „oder“ verbinden. → Schräglage-Warnung im Struktogramm -- Ich kann mehrere Bedingungen mit „und“ verbinden. → Jetzt in Java: Wasserwaage -::: - -## Wissenstest - -::: quiz -? Der mBot2 steht flach auf dem Tisch. Was liefert \`mbot.getPitch()\` ungefähr? -→ Schief oder gerade? -- [x] 0 -- [ ] 90 -- [ ] 100 -? Was macht \`mbot.isShaken()\`? -→ Schief oder gerade? -- [ ] Es schüttelt den mBot2. -- [x] Es meldet, ob jemand den mBot2 schüttelt. -> Sensoren tun nichts, sie messen nur. -::: -`,G5=`--- -titel: Die LEDs -bereich: Licht, Ton und Bildschirm -kurz: Farben mischen, eine Ampel bauen und blinken lassen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- eine Farbe aus Rot, Grün und Blau mischen -- Farben mit Pausen nacheinander zeigen -- die LEDs in Java blinken lassen -::: - -## Rot, Grün und Blau mischen - -::: mbot2 -fokus: leds -ansicht: hinten -::: - -Die fünf [LEDs]{teil=leds} sind ein **Aktor**: Sie tun etwas, sie leuchten. Jede LED mischt ihre Farbe aus Rot, Grün und Blau, jeweils von 0 (aus) bis 255 (ganz hell). - -| Befehl | Kasten | Was passiert | -|---|---|---| -| \`mbot.setLed(255, 0, 0)\` | **LEDs an** | alle LEDs rot | -| \`mbot.ledOff()\` | **LEDs aus** | alle LEDs aus | -| \`mbot.pause(1000)\` | **kurz warten** | 1000 Millisekunden (1 Sekunde) warten | - -| Farbe | Rot | Grün | Blau | -|---|---|---|---| -| Rot | 255 | 0 | 0 | -| Gelb | 255 | 200 | 0 | -| Grün | 0 | 255 | 0 | -| Blau | 0 | 0 | 255 | -| Weiß | 255 | 255 | 255 | -| Lila | 160 | 0 | 255 | - -> Ohne **kurz warten** schaltet der mBot2 die Farben so schnell um, dass du nur die letzte siehst. In der Simulation siehst du die Farbe an den LEDs des 3D-Modells. - -## Ampel im Struktogramm - -::: übung vb-ampel -titel: Ampel -auftrag: Die LEDs zeigen nacheinander Rot, Gelb und Grün wie eine Ampel. Zwischen den Farben wartet der mBot2 jeweils 1000 Millisekunden. Gelb ist \`255, 200, 0\`. -befehle: setLed 255 0 0, pause 1000, setLed 255 200 0, pause 1000, setLed 0 255 0 -tipp: Zieh dreimal **LEDs an** und zweimal **kurz warten** ins Struktogramm, abwechselnd. -tipp: Ändere die Zahlen: \`mbot.setLed(255, 0, 0)\`, \`mbot.pause(1000)\`, \`mbot.setLed(255, 200, 0)\`, \`mbot.pause(1000)\`, \`mbot.setLed(0, 255, 0)\`. -lösung: vb-ampel-loesung.visustruct -::: - -## Jetzt in Java: Blaulicht - -Blinken heißt: an, warten, aus, warten, und das immer wieder. Das „immer wieder“ ist eine Schleife. - -::: übung vb-java-blinken -titel: Blaulicht -code: java -auftrag: Schreibe in Java eine For-Schleife, die dreimal läuft. Darin gehen die LEDs blau an, der mBot2 wartet 500 Millisekunden, die LEDs gehen aus, und er wartet wieder 500 Millisekunden. -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: \`for (int i = 0; i < 3; i++) { … }\` -tipp: In der Schleife: \`mbot.setLed(0, 0, 255);\`, \`mbot.pause(500);\`, \`mbot.ledOff();\`, \`mbot.pause(500);\`. -lösung: vb-java-blinken-loesung.visustruct -::: - -::: übung vb-fehler-14-leds -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Blaulicht“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-14-leds-start.visustruct -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.pause(500)\`. -lösung: vb-java-blinken-loesung.visustruct -::: - -## Spiel: Welche Farbe? - -::: spiel frage -titel: Spiel: Welche Farbe? -intro: Rot, Grün und Blau gemischt: Welche Farbe zeigen die LEDs? Sieben Runden. - -runde: - mbot.setLed(255, 0, 0); -frage: Welche Farbe leuchtet? -- [x] Rot -- Grün -- Blau -> Nur der erste Wert, Rot, ist an. - -runde: - mbot.setLed(0, 0, 255); -frage: Welche Farbe leuchtet? -- Rot -- Grün -- [x] Blau -> Die Reihenfolge ist immer Rot, Grün, Blau. Nur Blau ist an. - -runde: - mbot.setLed(255, 255, 255); -frage: Welche Farbe leuchtet? -- Gelb -- [x] Weiß -- aus -> Alle drei Farben ganz hell ergeben Weiß. - -runde: - mbot.setLed(255, 200, 0); -frage: Welche Farbe leuchtet? -- [x] Gelb -- Lila -- Weiß -> Rot und Grün zusammen ergeben Gelb. - -runde: - mbot.setLed(160, 0, 255); -frage: Welche Farbe leuchtet? -- Gelb -- [x] Lila -- Grün -> Rot und Blau zusammen ergeben Lila. - -runde: - mbot.setLed(0, 0, 0); -frage: Welche Farbe leuchtet? -- Weiß -- Schwarz -- [x] keine, die LEDs sind aus -> Alle drei Werte sind 0. Eine LED kann nicht schwarz leuchten. - -runde: - mbot.setLed(255, 0, 0); - mbot.setLed(0, 255, 0); - mbot.pause(1000); -frage: Welche Farbe siehst du eine Sekunde lang? -- Rot -- [x] Grün -- erst Rot, dann Grün -> Ohne **kurz warten** zwischen den Farben ist Rot sofort wieder weg. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.setLed(255, 0, 0); - mbot.pause(1000); - mbot.setLed(255, 200, 0); - mbot.pause(1000); - mbot.setLed(0, 0, 255); -frage: Soll wie eine Ampel Rot, Gelb und Grün zeigen. -fehler: 5 -besser: mbot.setLed(0, 255, 0); -> Grün ist \`0, 255, 0\`. \`0, 0, 255\` ist Blau. - -runde: - for (int i = 0; i < 3; i++) { - mbot.setLed(0, 0, 255); - mbot.pause(500); - mbot.ledOff; - mbot.pause(500); - } -frage: Soll dreimal blau blinken. -fehler: 4 -besser: mbot.ledOff(); -> Auch ein Befehl ohne Zahl braucht seine Klammern. - -runde: - mbot.setLed(0, 0, 300); - mbot.pause(1000); - mbot.ledOff(); -frage: Soll eine Sekunde ganz hell blau leuchten. -fehler: 1 -besser: mbot.setLed(0, 0, 255); -> Jede Farbe geht nur von 0 bis 255. - -runde: - mbot.setLed(255, 255, 255); - mbot.pause(1000); - mbot.setLed(0, 0, 0, 0); -frage: Soll eine Sekunde weiß leuchten und dann ausgehen. -fehler: 3 -besser: mbot.ledOff(); -> \`setLed\` hat genau drei Zahlen: Rot, Grün, Blau. Zum Ausschalten gibt es \`mbot.ledOff()\`. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann eine Farbe aus Rot, Grün und Blau mischen. → Rot, Grün und Blau mischen -- Ich kann Farben mit Pausen nacheinander zeigen. → Ampel im Struktogramm -- Ich kann die LEDs in Java blinken lassen. → Jetzt in Java: Blaulicht -::: - -## Wissenstest - -::: quiz -? Welche Farbe ergibt \`mbot.setLed(0, 255, 0)\`? -→ Rot, Grün und Blau mischen -- [ ] Rot -- [x] Grün -- [ ] Blau -> Die Zahlen sind Rot, Grün, Blau. Nur Grün ist an. -? Warum braucht das Blaulicht **kurz warten**? -→ Jetzt in Java: Blaulicht -- [x] Sonst wechselt es so schnell, dass man kein Blinken sieht. -- [ ] Sonst gehen die LEDs kaputt. -- [ ] Weil \`ledOff()\` sonst nicht geht. -::: -`,H5=`--- -titel: Einzelne LEDs -bereich: Licht, Ton und Bildschirm -kurz: Jede der fünf LEDs bekommt ihre eigene Farbe, bis zum Lauflicht. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die LEDs über ihre Nummern 0 bis 4 ansprechen -- einzelne LEDs in verschiedenen Farben leuchten lassen -- mit einer Schleife ein Lauflicht bauen -::: - -## Jede LED hat eine Nummer - -::: mbot2 -fokus: leds -ansicht: hinten -::: - -Bisher haben alle fünf [LEDs]{teil=leds} dieselbe Farbe gezeigt. Du kannst aber auch jede LED einzeln ansprechen. Dafür hat jede LED eine **Nummer**. Wie bei Arrays fängt das Zählen bei **0** an: Die fünf LEDs heißen 0, 1, 2, 3 und 4. - -| Befehl | Kasten | Was passiert | -|---|---|---| -| \`mbot.led(0).setColor("grün")\` | **LED-Farbe setzen** | LED 0 leuchtet grün | -| \`mbot.led(3).setColor("aus")\` | **LED-Farbe setzen** | LED 3 geht aus | - -Die Farbe schreibst du als Namen in Anführungszeichen: - -| Farbname | Farbname | Farbname | -|---|---|---| -| \`"rot"\` | \`"orange"\` | \`"gelb"\` | -| \`"grün"\` | \`"türkis"\` | \`"blau"\` | -| \`"lila"\` | \`"pink"\` | \`"weiß"\` | - -Mit \`"aus"\` schaltest du eine LED aus. - -> Die Nummer darf auch eine Variable sein: \`mbot.led(i).setColor("rot")\`. So kann eine Schleife eine LED nach der anderen einschalten. - -## Drei Lichter im Struktogramm - -::: übung vb-drei-lichter -titel: Drei Lichter -auftrag: Schalte LED 0 rot, LED 2 gelb und LED 4 grün. Die LEDs 1 und 3 bleiben aus. -befehle: ledColor 0 "rot", ledColor 2 "gelb", ledColor 4 "grün" -tipp: Zieh dreimal **LED-Farbe setzen** ins Struktogramm. -tipp: Ändere Nummer und Farbe: \`mbot.led(0).setColor("rot")\`, \`mbot.led(2).setColor("gelb")\`, \`mbot.led(4).setColor("grün")\`. -lösung: vb-drei-lichter-loesung.visustruct -::: - -## Jetzt in Java: Lauflicht - -Bei einem Lauflicht wandert ein Licht von einer LED zur nächsten. Die Schleifenvariable \`i\` ist dabei die Nummer der LED. - -::: übung vb-java-lauflicht -titel: Lauflicht -code: java -auftrag: Schreibe in Java eine For-Schleife, in der \`i\` von 0 bis 4 läuft. Darin geht LED \`i\` blau an, der mBot2 wartet 200 Millisekunden, und LED \`i\` geht wieder aus. -befehle: ledColor 0 "blau", pause 200, ledColor 0 "aus", ledColor 1 "blau", pause 200, ledColor 1 "aus", ledColor 2 "blau", pause 200, ledColor 2 "aus", ledColor 3 "blau", pause 200, ledColor 3 "aus", ledColor 4 "blau", pause 200, ledColor 4 "aus" -braucht: forSchleife -tipp: \`for (int i = 0; i < 5; i++) { … }\` -tipp: In der Schleife: \`mbot.led(i).setColor("blau");\`, \`mbot.pause(200);\`, \`mbot.led(i).setColor("aus");\`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -::: übung vb-fehler-15-einzelne-leds -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Lauflicht“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-15-einzelne-leds-start.visustruct -befehle: ledColor 0 "blau", pause 200, ledColor 0 "aus", ledColor 1 "blau", pause 200, ledColor 1 "aus", ledColor 2 "blau", pause 200, ledColor 2 "aus", ledColor 3 "blau", pause 200, ledColor 3 "aus", ledColor 4 "blau", pause 200, ledColor 4 "aus" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.led(i)\`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -## Spiel: Welche LED leuchtet? - -::: spiel frage -titel: Spiel: Welche LED leuchtet? -intro: Fünf LEDs mit den Nummern 0 bis 4. Welche leuchten? Sechs Runden. - -runde: - mbot.led(0).setColor("rot"); -frage: Welche LED leuchtet rot? -- [x] die erste -- die zweite -- alle -> Die Nummern fangen bei 0 an. LED 0 ist die erste. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blau"); - } -frage: Welche LEDs leuchten blau? -- LED 0 bis 3 -- [x] alle fünf -- nur LED 4 -> \`i\` läuft von 0 bis 4, das sind alle fünf. - -runde: - for (int i = 0; i < 5; i = i + 2) { - mbot.led(i).setColor("grün"); - } -frage: Welche LEDs leuchten grün? -- LED 1 und 3 -- [x] LED 0, 2 und 4 -- LED 2 und 4 -> \`i\` springt in Zweierschritten: 0, 2, 4. - -runde: - mbot.led(2).setColor("gelb"); - mbot.led(2).setColor("aus"); -frage: Welche LED leuchtet am Ende? -- LED 2 gelb -- [x] keine -- LED 3 gelb -> LED 2 geht an und gleich wieder aus. - -runde: - for (int i = 4; i >= 0; i--) { - mbot.led(i).setColor("rot"); - mbot.pause(200); - mbot.led(i).setColor("aus"); - } -frage: Bei welcher LED beginnt dieses Lauflicht? -- LED 0 -- [x] LED 4 -- LED 5 -> \`i\` beginnt bei 4 und zählt rückwärts. Das Licht läuft andersherum. - -runde: -frage: Ludwig schreibt \`mbot.led(5).setColor("rot");\`. Welche LED leuchtet? -- die fünfte -- die sechste -- [x] keine, eine LED 5 gibt es nicht -> Die fünf LEDs haben die Nummern 0 bis 4. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.led(1).setColor("rot"); - mbot.led(2).setColor("gelb"); - mbot.led(4).setColor("grün"); -frage: Soll LED 0 rot, LED 2 gelb und LED 4 grün schalten. -fehler: 1 -besser: mbot.led(0).setColor("rot"); -> Die erste LED hat die Nummer 0. - -runde: - for (int i = 1; i <= 5; i++) { - mbot.led(i).setColor("blau"); - } -frage: Soll alle fünf LEDs blau schalten. -fehler: 1 -besser: for (int i = 0; i < 5; i++) { -> Die LEDs haben die Nummern 0 bis 4. Eine LED 5 gibt es nicht. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blau"); - mbot.pause(200); - mbot.led(0).setColor("aus"); - } -frage: Lauflicht: Jede LED geht kurz blau an und wieder aus. -fehler: 4 -besser: mbot.led(i).setColor("aus"); -> Ausgehen soll dieselbe LED \`i\`, nicht immer LED 0. - -runde: - mbot.led(3).setColor(rot); -frage: Soll LED 3 rot schalten. -fehler: 1 -besser: mbot.led(3).setColor("rot"); -> Der Farbname ist ein Text und braucht Anführungszeichen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die LEDs über ihre Nummern 0 bis 4 ansprechen. → Jede LED hat eine Nummer -- Ich kann einzelne LEDs in verschiedenen Farben leuchten lassen. → Drei Lichter im Struktogramm -- Ich kann mit einer Schleife ein Lauflicht bauen. → Jetzt in Java: Lauflicht -::: - -## Wissenstest - -::: quiz -? Welche Nummer hat die erste LED? -→ Jede LED hat eine Nummer -- [x] 0 -- [ ] 1 -- [ ] 5 -> Wie bei Arrays zählt man ab 0. Die fünf LEDs haben die Nummern 0 bis 4. -? Was macht \`mbot.led(4).setColor("aus")\`? -→ Drei Lichter im Struktogramm -- [ ] Alle LEDs gehen aus. -- [x] Nur LED 4 geht aus. -- [ ] Vier LEDs gehen aus. -::: -`,V5=`--- -titel: Der Lautsprecher -bereich: Licht, Ton und Bildschirm -kurz: Töne, eine Tonleiter und eine Sirene. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was die beiden Zahlen bei \`playTone\` bedeuten -- eine Tonfolge bauen -- in Java mit der Zählvariable rechnen -- den mBot2 ein Gefühl zeigen lassen -::: - -## Wie hoch, wie lang? - -::: mbot2 -fokus: cyberpi -ansicht: oben -::: - -Im [CyberPi]{teil=cyberpi} steckt ein kleiner Lautsprecher. \`mbot.playTone(440, 300)\` spielt einen Ton: - -- Die erste Zahl ist die **Tonhöhe** in Hertz (Schwingungen pro Sekunde). Je größer, desto höher. -- Die zweite Zahl ist die **Länge** in Millisekunden. - -| Ton | c | d | e | f | g | a | h | c' | -|---|---|---|---|---|---|---|---|---| -| Hertz | 262 | 294 | 330 | 349 | 392 | 440 | 494 | 523 | - -> In der Simulation hörst du die Töne über die Lautsprecher deines Computers. Dreh ruhig etwas leiser. - -## Tonleiter im Struktogramm - -::: übung vb-tonleiter -titel: Tonleiter -auftrag: Der mBot2 spielt die Töne c, d, e, f, g nacheinander, jeden 300 Millisekunden lang. Die Hertz-Zahlen stehen in der Tabelle. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -tipp: Zieh fünfmal **Ton spielen** ins Struktogramm. -tipp: Die Kästen heißen \`mbot.playTone(262, 300)\`, \`mbot.playTone(294, 300)\` und so weiter. -lösung: vb-tonleiter-loesung.visustruct -::: - -::: angeberwissen -Der Ton a mit 440 Hertz heißt **Kammerton**. Nach ihm stimmen Orchester ihre Instrumente. Eine Oktave höher hat genau doppelt so viele Schwingungen: 880 Hertz. -::: - -## Jetzt in Java: immer höher - -In einer For-Schleife kannst du mit der Zählvariable rechnen. So wird jeder Ton höher als der letzte: - -\`\`\`java -mbot.playTone(i * 200, 200); -\`\`\` - -::: übung vb-java-hoeher -titel: Immer höher -code: java -auftrag: Schreibe in Java eine For-Schleife, in der \`i\` von 1 bis 5 zählt. In jedem Durchgang spielt der mBot2 einen Ton mit \`i * 200\` Hertz, 200 Millisekunden lang. -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -braucht: forSchleife -tipp: \`for (int i = 1; i <= 5; i++) { … }\` -tipp: In der Schleife steht nur \`mbot.playTone(i * 200, 200);\`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Gefühle zeigen - -Der mBot2 kann auch fröhlich, traurig oder müde sein. Mit **Gefühl zeigen** (\`mbot.emotion("smile")\`) spielt er eine kleine Vorführung: Die LEDs leuchten, er macht ein Geräusch und wackelt ein bisschen. - -| Text | Gefühl | -|---|---| -| \`mbot.emotion("smile")\` | lacht | -| \`mbot.emotion("hello")\` | grüßt | -| \`mbot.emotion("sad")\` | ist traurig | -| \`mbot.emotion("angry")\` | ist wütend | -| \`mbot.emotion("dizzy")\` | ist schwindelig | -| \`mbot.emotion("zzz")\` | schläft | - -> Probier es mit dem echten mBot2 aus. Im Simulator siehst du davon nichts, er zeigt nur den Befehl an. Weitere Gefühle stehen unter **Nachschlagen**. - -::: übung vb-fehler-16-lautsprecher -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Immer höher“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-16-lautsprecher-start.visustruct -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es \`mbot.playTone(i * 200, 200)\`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Spiel: Von tief nach hoch - -::: spiel reihenfolge -titel: Spiel: Von tief nach hoch -intro: Tippe die Antworten in der richtigen Reihenfolge an. Ein falscher Tipp beendet die Runde. Fünf Runden. - -runde: -frage: Tippe die Töne von tief nach hoch an. -- \`mbot.playTone(262, 300)\` -- \`mbot.playTone(330, 300)\` -- \`mbot.playTone(440, 300)\` -- \`mbot.playTone(880, 300)\` -> Je mehr Hertz, desto höher der Ton. - -runde: -frage: Tippe die Töne von kurz nach lang an. -- \`mbot.playTone(440, 100)\` -- \`mbot.playTone(440, 300)\` -- \`mbot.playTone(440, 1000)\` -- \`mbot.playTone(440, 2000)\` -> Die zweite Zahl ist die Länge in Millisekunden. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.playTone(i * 200, 200); - } -frage: Tippe die Töne in der Reihenfolge an, in der sie klingen. -- 600 Hertz -- 400 Hertz -- 200 Hertz -> \`i\` zählt rückwärts: 3, 2, 1. Die Töne werden immer tiefer. - -runde: -frage: Tippe die Töne von tief nach hoch an. -- c mit 262 Hertz -- der Kammerton a -- a eine Oktave höher -> Der Kammerton a hat 440 Hertz, eine Oktave höher sind es doppelt so viele: 880 Hertz. - -runde: -frage: Tippe die Zeiten von kurz nach lang an. -- 300 Millisekunden -- 1 Sekunde -- 1500 Millisekunden -- 2 Sekunden -> 1 Sekunde sind 1000 Millisekunden, 2 Sekunden sind 2000. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was die beiden Zahlen bei \`playTone\` bedeuten. → Wie hoch, wie lang? -- Ich kann eine Tonfolge bauen. → Tonleiter im Struktogramm -- Ich kann in Java mit der Zählvariable rechnen. → Jetzt in Java: immer höher -- Ich kann den mBot2 ein Gefühl zeigen lassen. → Gefühle zeigen -::: - -## Wissenstest - -::: quiz -? Welcher Ton ist höher? -→ Wie hoch, wie lang? -- [x] \`mbot.playTone(880, 300)\` -- [ ] \`mbot.playTone(440, 300)\` -> Mehr Hertz heißt höher. -? Wie lange klingt \`mbot.playTone(440, 1000)\`? -→ Wie hoch, wie lang? -- [ ] 440 Sekunden -- [x] 1 Sekunde -- [ ] 1000 Sekunden -> 1000 Millisekunden sind eine Sekunde. -::: -`,q5=`--- -titel: Arrays und Melodien -bereich: Licht, Ton und Bildschirm -kurz: Viele Werte in einem Array speichern und mit einer Schleife abarbeiten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Array anlegen und mit einer Schleife abspielen -- ein Array mit Texten in Java benutzen -- Messwerte in einem Array sammeln und den Mittelwert ausrechnen -::: - -## Eine Melodie als Array - -Eine Melodie ist eine Reihe von Tönen. Statt fünf Variablen \`ton1\`, \`ton2\`, … nimmst du ein **Array**. Ein Array ist eine Reihe von Fächern unter **einem** Namen: - -\`\`\`java -int[] toene = {262, 294, 330, 349, 392}; -\`\`\` - -- \`int[]\` heißt: ein Array aus ganzen Zahlen. -- Die Fächer sind von **0** an nummeriert. \`toene[0]\` ist 262, \`toene[4]\` ist 392. -- \`toene.length\` sagt, wie viele Fächer es gibt, hier 5. - -Eine For-Schleife mit \`i\` von 0 bis \`toene.length - 1\` kommt so an jedes Fach. - -::: übung vb-melodie -titel: Melodie -auftrag: Lege ein Array \`toene\` mit den Tonhöhen 262, 294, 330, 349 und 392 an. Eine For-Schleife spielt sie nacheinander, jeden 300 Millisekunden lang. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -braucht: forSchleife -tipp: \`int[] toene = {262, 294, 330, 349, 392}\` legt das Array an. -tipp: Die Schleife läuft von \`i = 0\` bis \`i < toene.length\`. Darin steht \`mbot.playTone(toene[i], 300)\`. -lösung: vb-melodie-loesung.visustruct -::: - -> Willst du eine andere Melodie, änderst du nur das Array. Die Schleife bleibt gleich. - -## Jetzt in Java: Regenbogen - -Die fünf LEDs haben die Nummern 0 bis 4, genau wie die Fächer eines Arrays mit fünf Werten. Ein Array kann auch Texte enthalten: \`String[] farben = {"rot", "gelb"};\`. LED \`i\` bekommt dann die Farbe aus Fach \`i\`: \`mbot.led(i).setColor(farben[i])\`. - -::: übung vb-farben -titel: Regenbogen -code: java -auftrag: Schreibe in Java: Lege ein Array \`farben\` mit den Texten \`"rot"\`, \`"gelb"\`, \`"grün"\`, \`"blau"\` und \`"lila"\` an. Eine For-Schleife gibt jeder LED \`i\` die Farbe aus \`farben[i]\`. -befehle: ledColor 0 "rot", ledColor 1 "gelb", ledColor 2 "grün", ledColor 3 "blau", ledColor 4 "lila" -braucht: forSchleife -tipp: \`String[] farben = {"rot", "gelb", "grün", "blau", "lila"};\` legt das Array an. -tipp: \`for (int i = 0; i < farben.length; i++) { mbot.led(i).setColor(farben[i]); }\` -lösung: vb-farben-loesung.visustruct -::: - -## Jetzt in Java: Messreihe - -Sensoren messen nie ganz genau. Halte die Hand vor den Ultraschallsensor: Die Zahl springt immer ein bisschen hin und her. Profis messen deshalb mehrmals und rechnen den **Mittelwert** aus. - -Die Messwerte kommen in ein Array. \`new int[5]\` legt ein Array mit fünf leeren Fächern an: - -\`\`\`java -int[] werte = new int[5]; -for (int i = 0; i < werte.length; i++) { - werte[i] = mbot.getDistance(); - mbot.pause(100); -} -\`\`\` - -Danach zählst du alle Werte zusammen. Dafür brauchst du eine Variable, die mit 0 anfängt und in jedem Durchgang wächst: - -\`\`\`java -int summe = 0; -for (int i = 0; i < werte.length; i++) { - summe = summe + werte[i]; -} -\`\`\` - -Der Mittelwert ist die Summe geteilt durch die Anzahl. Schreib \`5.0\` statt \`5\`, dann rechnet Java mit Kommazahlen: \`double mittelwert = summe / 5.0;\` - -::: übung vb-messreihe -titel: Messreihe -code: java -auftrag: Miss den Abstand fünfmal in ein Array \`int[] werte = new int[5]\`, mit 100 ms Pause dazwischen. Zähle danach alle Werte zusammen, rechne den Mittelwert aus und zeige zum Beispiel **Mittelwert: 40.0** auf dem Bildschirm. -messwerte: getDistance=40 -> screen "Mittelwert: 40.0" -messwerte: getDistance=25 -> screen "Mittelwert: 25.0" -braucht: forSchleife -tipp: Zwei For-Schleifen: Die erste füllt das Array mit \`werte[i] = mbot.getDistance();\`, die zweite rechnet \`summe = summe + werte[i];\`. -tipp: Danach \`double mittelwert = summe / 5.0;\` und \`mbot.showText("Mittelwert: " + mittelwert);\`. -lösung: vb-messreihe-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Arrays“](?visustruct&lektion=15-arrays). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-17-arrays-melodie -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Messreihe“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-17-arrays-melodie-start.visustruct -messwerte: getDistance=40 -> screen "Mittelwert: 40.0" -messwerte: getDistance=25 -> screen "Mittelwert: 25.0" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`summe = summe + werte[i]\`. -lösung: vb-messreihe-loesung.visustruct -::: - -## Spiel: Welches Fach? - -::: spiel frage -titel: Spiel: Welches Fach? -intro: Fächer zählen ab 0. Was steht wo im Array? Sechs Runden. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist \`toene[2]\`? -- 294 -- [x] 330 -- 349 -> Fach 0 ist 262, Fach 1 ist 294, Fach 2 ist 330. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist \`toene.length\`? -- 4 -- [x] 5 -- 392 -> \`length\` zählt die Fächer. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was ist \`toene[toene.length - 1]\`? -- 349 -- [x] 392 -- Fehler -> \`toene.length - 1\` ist 4, das letzte Fach. - -runde: - int[] toene = {262, 294, 330, 349, 392}; -frage: Was passiert bei \`mbot.playTone(toene[5], 300)\`? -- Er spielt 392 Hertz. -- Er spielt gar nichts und macht weiter. -- [x] Fehler: Fach 5 gibt es nicht. -> Die Fächer haben die Nummern 0 bis 4. Java meldet \`ArrayIndexOutOfBoundsException\`. - -runde: - String[] farben = {"rot", "gelb", "grün", "blau", "lila"}; - for (int i = 0; i < farben.length; i++) { - mbot.led(i).setColor(farben[i]); - } -frage: Welche Farbe hat LED 3? -- grün -- [x] blau -- lila -> LED 3 bekommt \`farben[3]\`, das vierte Wort. - -runde: - int[] werte = {20, 22, 18, 20, 20}; - int summe = 0; - for (int i = 0; i < werte.length; i++) { - summe = summe + werte[i]; - } - double mittelwert = summe / 5.0; -frage: Welchen Wert hat \`mittelwert\`? -- 18.0 -- [x] 20.0 -- 100.0 -> Die Summe ist 100, und 100 / 5.0 ist 20.0. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - int[] toene = {262, 294, 330, 349, 392}; - for (int i = 0; i <= toene.length; i++) { - mbot.playTone(toene[i], 300); - } -frage: Soll alle fünf Töne spielen. -fehler: 2 -besser: for (int i = 0; i < toene.length; i++) { -> Mit \`<=\` will die Schleife auch \`toene[5]\` spielen. Das Fach gibt es nicht. - -runde: - int[] toene = {262, 294, 330, 349, 392}; - for (int i = 0; i < toene.length; i++) { - mbot.playTone(toene, 300); - } -frage: Soll alle fünf Töne spielen. -fehler: 3 -besser: mbot.playTone(toene[i], 300); -> Gespielt wird ein Fach, \`toene[i]\`, nicht das ganze Array. - -runde: - String[] farben = {"rot", "gelb", "grün", "blau", "lila"}; - for (int i = 0; i < farben.length(); i++) { - mbot.led(i).setColor(farben[i]); - } -frage: Soll jeder LED eine Farbe aus dem Array geben. -fehler: 2 -besser: for (int i = 0; i < farben.length; i++) { -> Bei Arrays steht \`length\` ohne Klammern. Klammern braucht nur \`length()\` bei Strings. - -runde: - int[] werte = new int[5]; - int summe = 0; - for (int i = 0; i < werte.length; i++) { - summe = werte[i]; - } -frage: Soll alle Messwerte zusammenzählen. -fehler: 4 -besser: summe = summe + werte[i]; -> So steht am Ende nur der letzte Wert in \`summe\`. Der neue Wert muss dazukommen. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Array anlegen und mit einer Schleife abspielen. → Eine Melodie als Array -- Ich kann ein Array mit Texten in Java benutzen. → Jetzt in Java: Regenbogen -- Ich kann Messwerte in einem Array sammeln und den Mittelwert ausrechnen. → Jetzt in Java: Messreihe -::: - -## Wissenstest - -::: quiz -? Was ist \`toene[1]\`, wenn \`int[] toene = {262, 294, 330};\`? -→ Eine Melodie als Array -- [ ] 262 -- [x] 294 -- [ ] 1 -> Die Fächer zählen ab 0. Fach 1 ist also das zweite. -? Wie viele Fächer hat \`{262, 294, 330}\`, also was ist \`toene.length\`? -→ Eine Melodie als Array -- [ ] 2 -- [x] 3 -- [ ] 330 -> \`length\` zählt die Fächer, hier drei. Das letzte Fach hat deshalb die Nummer 2. -::: -`,U5=`--- -titel: Der Bildschirm -bereich: Licht, Ton und Bildschirm -kurz: Text, Zahlen und Messwerte auf dem CyberPi anzeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- Text auf dem Bildschirm anzeigen -- mehrere Texte nacheinander zeigen -- Zahlen und Messwerte anzeigen -- einen Countdown in Java schreiben -::: - -## Text anzeigen - -::: mbot2 -fokus: screen -ansicht: hinten -::: - -Der farbige [Bildschirm]{teil=screen} des CyberPi ist auch ein Aktor. Mit **Text anzeigen** schreibst du etwas darauf: - -\`\`\`java -mbot.showText("Hallo!") -\`\`\` - -Der Text steht in Anführungszeichen, wie bei \`System.out.println\`. Ein neuer Text ersetzt den alten. - -> In der Simulation erscheint der Text auf dem Bildschirm des 3D-Modells und unter der Welt hinter 📺. - -## Begrüßung im Struktogramm - -::: übung vb-begruessung -titel: Begrüßung -auftrag: Der mBot2 zeigt zuerst „Hallo!“, wartet 1000 Millisekunden und zeigt dann „Ich bin VisuBot“. -befehle: showText "Hallo!", pause 1000, showText "Ich bin VisuBot" -tipp: Zieh zweimal **Text anzeigen** und einmal **kurz warten** ins Struktogramm. -tipp: \`mbot.showText("Hallo!")\`, \`mbot.pause(1000)\`, \`mbot.showText("Ich bin VisuBot")\`. -lösung: vb-begruessung-loesung.visustruct -::: - -## Zahlen und Messwerte - -Statt Text kannst du auch Zahlen und Variablen anzeigen, und mit \`+\` setzt du alles zusammen: - -\`\`\`java -mbot.showText(i) -mbot.showText("Abstand: " + mbot.getDistance()) -\`\`\` - -So zeigt der mBot2 dir, was seine Sensoren gerade messen. - -## Jetzt in Java: Countdown - -::: übung vb-java-countdown -titel: Countdown -code: java -auftrag: Schreibe in Java einen Countdown: Eine For-Schleife zählt \`i\` von 3 rückwärts bis 1. In jedem Durchgang zeigt der mBot2 \`i\` an und wartet 1000 Millisekunden. Danach zeigt er „Los!“. -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Los!" -braucht: forSchleife -tipp: Rückwärts zählen: \`for (int i = 3; i >= 1; i--) { … }\` -tipp: In der Schleife: \`mbot.showText(i);\` und \`mbot.pause(1000);\`. Nach der Schleife \`mbot.showText("Los!");\`. -lösung: vb-java-countdown-loesung.visustruct -::: - -::: übung vb-fehler-18-bildschirm -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Countdown“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-18-bildschirm-start.visustruct -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Los!" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.showText(i)\`. -lösung: vb-java-countdown-loesung.visustruct -::: - -## Spiel: Was steht auf dem Bildschirm? - -::: spiel frage -titel: Spiel: Was steht auf dem Bildschirm? -intro: Lies den Code und sag vorher, was der Bildschirm am Ende zeigt. Sechs Runden. - -runde: - mbot.showText("Hallo!"); - mbot.pause(1000); - mbot.showText("Ich bin VisuBot"); -frage: Was steht am Ende auf dem Bildschirm? -- Hallo! Ich bin VisuBot -- [x] Ich bin VisuBot -- Hallo! -> Ein neuer Text ersetzt den alten. - -runde: - mbot.showText("Abstand: " + 25); -frage: Was steht auf dem Bildschirm? -- [x] Abstand: 25 -- "Abstand: " + 25 -- Abstand: -> Das \`+\` hängt die Zahl an den Text. - -runde: - int i = 3; - mbot.showText("i"); -frage: Was steht auf dem Bildschirm? -- 3 -- [x] i -- "i" -> In Anführungszeichen ist \`i\` ein Text, keine Variable. Die Anführungszeichen selbst erscheinen nicht. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.showText(i); - mbot.pause(1000); - } - mbot.showText("Start!"); -frage: Welche Zahl steht direkt vor „Start!“ da? -- 0 -- [x] 1 -- 3 -> Der Countdown zeigt 3, 2, 1. Bei 0 ist \`i >= 1\` falsch. - -runde: - mbot.showText("Summe: " + 2 + 3); -frage: Was steht auf dem Bildschirm? -- Summe: 5 -- [x] Summe: 23 -- Summe: 2 + 3 -> Java rechnet von links nach rechts: Erst kommt die 2 an den Text, dann die 3. - -runde: - mbot.showText("Summe: " + (2 + 3)); -frage: Was steht auf dem Bildschirm? -- [x] Summe: 5 -- Summe: 23 -- Summe: (2 + 3) -> Die Klammern rechnet Java zuerst aus. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - mbot.showText("Hallo!"); - mbot.pause(1); - mbot.showText("Ich bin VisuBot"); -frage: Soll „Hallo!“ zeigen, eine Sekunde warten und dann „Ich bin VisuBot“ zeigen. -fehler: 2 -besser: mbot.pause(1000); -> \`pause\` zählt in Millisekunden. Eine Sekunde sind 1000. - -runde: - for (int i = 3; i >= 1; i++) { - mbot.showText(i); - mbot.pause(1000); - } -frage: Countdown: soll 3, 2, 1 zeigen. -fehler: 1 -besser: for (int i = 3; i >= 1; i--) { -> Rückwärts zählen heißt \`i--\`. Mit \`i++\` hört die Schleife nie auf. - -runde: - mbot.showText(Hallo!); -frage: Soll „Hallo!“ zeigen. -fehler: 1 -besser: mbot.showText("Hallo!"); -> Text steht in Anführungszeichen. - -runde: - mbot.showText("Abstand: " - mbot.getDistance()); -frage: Soll zum Beispiel „Abstand: 25“ zeigen. -fehler: 1 -besser: mbot.showText("Abstand: " + mbot.getDistance()); -> Text und Zahl hängst du mit \`+\` aneinander. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann Text auf dem Bildschirm anzeigen. → Text anzeigen -- Ich kann mehrere Texte nacheinander zeigen. → Begrüßung im Struktogramm -- Ich kann Zahlen und Messwerte anzeigen. → Zahlen und Messwerte -- Ich kann einen Countdown in Java schreiben. → Jetzt in Java: Countdown -::: - -## Wissenstest - -::: quiz -? Was zeigt \`mbot.showText("Abstand: " + 25)\`? -→ Zahlen und Messwerte -- [x] Abstand: 25 -- [ ] "Abstand: " + 25 -- [ ] 25 -> Das \`+\` hängt die Zahl an den Text. -? Was passiert mit dem alten Text, wenn du einen neuen anzeigst? -→ Text anzeigen -- [x] Er wird ersetzt. -- [ ] Der neue kommt darunter. -::: -`,Q5=`--- -titel: Zeichenketten -bereich: Licht, Ton und Bildschirm -kurz: Mit Texten rechnen, Buchstaben herausholen und auf dem Bildschirm zeigen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit \`length()\` und \`substring(…)\` arbeiten -- Texte und Zahlen mit \`+\` verbinden -- mit \`charAt(…)\` einzelne Zeichen holen -::: - -## Buchstabe für Buchstabe - -Ein Text heißt in Java **Zeichenkette** oder \`String\`. Er besteht aus einzelnen Zeichen, die wie bei einem Array ab **0** nummeriert sind: - -| Zeichen | V | i | s | u | B | o | t | -|---|---|---|---|---|---|---|---| -| Nummer | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - -- \`wort.length()\` liefert die Anzahl der Zeichen, hier 7. -- \`wort.substring(0, 3)\` liefert die ersten 3 Zeichen: \`"Vis"\`. - -Der mBot2 soll seinen Namen auf dem [Bildschirm]{teil=screen} aufbauen: erst **V**, dann **Vi**, dann **Vis** und so weiter bis **VisuBot**. - -::: übung vb-buchstaben -titel: Name aufbauen -auftrag: Lege \`String wort = "VisuBot"\` an. Eine For-Schleife zählt \`i\` von 1 bis \`wort.length()\`. Darin zeigt der mBot2 \`wort.substring(0, i)\` und wartet 300 Millisekunden. -befehle: showText "V", pause 300, showText "Vi", pause 300, showText "Vis", pause 300, showText "Visu", pause 300, showText "VisuB", pause 300, showText "VisuBo", pause 300, showText "VisuBot", pause 300 -braucht: forSchleife -tipp: Die Schleife beginnt bei \`int i = 1\` und läuft, solange \`i <= wort.length()\`. -tipp: In der Schleife: \`mbot.showText(wort.substring(0, i))\` und \`mbot.pause(300)\`. -lösung: vb-buchstaben-loesung.visustruct -::: - -## Jetzt in Java: Text und Länge - -Mit \`+\` hängst du Texte und Zahlen aneinander. So zeigt der mBot2 einen Text und dahinter seine Länge. - -::: übung vb-java-textlaenge -titel: Wie lang ist der Text? -code: java -auftrag: Schreibe in Java: Lege \`String text = "Hallo Klasse"\` an. Der mBot2 zeigt den Text und in Klammern seine Länge, also **Hallo Klasse (12)**. -befehle: showText "Hallo Klasse (12)" -tipp: Die Länge liefert \`text.length()\`. Auch das Leerzeichen zählt mit. -tipp: \`mbot.showText(text + " (" + text.length() + ")");\` -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Jetzt in Java: Laufschrift - -\`wort.charAt(i)\` liefert das Zeichen mit der Nummer \`i\`. Zeigst du die Zeichen nacheinander mit einer Pause, läuft das Wort Buchstabe für Buchstabe über den Bildschirm: - -\`\`\`java -String wort = "Ludwig"; -for (int i = 0; i < wort.length(); i++) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); -} -\`\`\` - -| Durchgang | \`i\` | Bildschirm | -|---|---|---| -| 1 | 0 | L | -| 2 | 1 | u | -| 3 | 2 | d | - -::: übung vb-laufschrift -titel: Ludwig rückwärts -code: java -auftrag: Lege \`String wort = "Ludwig"\` an. Zeige das Wort **rückwärts** Buchstabe für Buchstabe auf dem Bildschirm, also g, i, w, d, u, L, mit 500 ms Pause nach jedem Buchstaben. -befehle: showText "g", pause 500, showText "i", pause 500, showText "w", pause 500, showText "d", pause 500, showText "u", pause 500, showText "L", pause 500 -braucht: forSchleife -tipp: Das letzte Zeichen hat die Nummer \`wort.length() - 1\`. Die Schleife zählt rückwärts: \`for (int i = wort.length() - 1; i >= 0; i--)\`. -tipp: In der Schleife: \`mbot.showText(wort.charAt(i));\` und \`mbot.pause(500);\`. -lösung: vb-laufschrift-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Zeichenketten“](?visustruct&lektion=17-zeichenketten). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-19-zeichenketten -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Wie lang ist der Text?“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-19-zeichenketten-start.visustruct -befehle: showText "Hallo Klasse (12)" -tipp: Die Fehlermeldung nennt eine unbekannte Variable. Wie heißt die Variable dort, wo sie angelegt wird? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.showText(text +\`. -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Lies, was der mBot2 zeigen soll, und tippe auf die falsche Zeile, bevor die Zeit abläuft. Fünf Runden, je 30 Sekunden. -zeit: 30 - -runde: - String wort = "VisuBot"; - for (int i = 1; i <= wort.length(); i++) { - mbot.showText(wort.substring(1, i)); - mbot.pause(300); - } -frage: Soll V, Vi, Vis und so weiter bis VisuBot zeigen. -fehler: 3 -besser: mbot.showText(wort.substring(0, i)); -> Das erste Zeichen hat die Nummer 0. Mit \`substring(1, i)\` fehlt das V. - -runde: - String text = "Hallo Klasse"; - mbot.showText(text + " (" + text.length + ")"); -frage: Soll **Hallo Klasse (12)** zeigen. -fehler: 2 -besser: mbot.showText(text + " (" + text.length() + ")"); -> Bei einem String ist \`length()\` eine Methode und braucht Klammern. Nur bei Arrays steht \`length\` ohne Klammern. - -runde: - String wort = "Ludwig"; - for (int i = 0; i <= wort.length(); i++) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); - } -frage: Soll L, u, d, w, i, g zeigen. -fehler: 2 -besser: for (int i = 0; i < wort.length(); i++) { -> Das letzte Zeichen hat die Nummer 5. Bei \`i = 6\` gibt es kein Zeichen mehr. - -runde: - String wort = "Ludwig"; - for (int i = wort.length(); i >= 0; i--) { - mbot.showText(wort.charAt(i)); - mbot.pause(500); - } -frage: Soll das Wort rückwärts zeigen: g, i, w, d, u, L. -fehler: 2 -besser: for (int i = wort.length() - 1; i >= 0; i--) { -> Rückwärts beginnt man beim letzten Zeichen, und das hat die Nummer \`wort.length() - 1\`. - -runde: - String name = 'Ludwig'; - mbot.showText("Hallo " + name); -frage: Soll **Hallo Ludwig** zeigen. -fehler: 1 -besser: String name = "Ludwig"; -> Texte stehen in doppelten Anführungszeichen. Einfache gibt es nur für ein einzelnes Zeichen (\`char\`). -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 6 1 LAUFSCHRIFT: ein Wort Buchstabe für Buchstabe über den Bildschirm -- ↓ 4 1 BILDSCHIRM: zeigt mit mbot.showText einen Text -- ↓ 6 7 HERTZ: Einheit der Tonhöhe: Schwingungen pro Sekunde -- ↓ 4 11 AKTOR: Bauteil, das etwas tut, z. B. leuchten -- ↓ 4 3 LAUTSPRECHER: spielt mit mbot.playTone einen Ton -- ↓ 4 9 ZEICHENKETTE: anderes Wort für String -- ↓ 1 5 MILLISEKUNDE: ein Tausendstel einer Sekunde -- → 15 1 ARRAY: Reihe von Fächern unter einem Namen -lösung: 6 2, 8 5, 9 7, 7 11, 10 3 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit \`length()\` und \`substring(…)\` arbeiten. → Buchstabe für Buchstabe -- Ich kann Texte und Zahlen mit \`+\` verbinden. → Jetzt in Java: Text und Länge -- Ich kann mit \`charAt(…)\` einzelne Zeichen holen. → Jetzt in Java: Laufschrift -::: - -## Wissenstest - -::: quiz -? Was liefert \`"VisuBot".substring(0, 4)\`? -→ Buchstabe für Buchstabe -- [ ] \`"VisuB"\` -- [x] \`"Visu"\` -- [ ] \`"uBot"\` -> \`substring(0, 4)\` nimmt die Zeichen 0, 1, 2 und 3, also vier Stück. -? Was liefert \`"Ludwig".charAt(0)\`? -→ Jetzt in Java: Laufschrift -- [x] \`L\` -- [ ] \`u\` -- [ ] \`g\` -> Die Zeichen werden ab 0 gezählt. Zeichen 0 ist das erste. -::: -`,$5=`--- -titel: Motoren und Geschwindigkeit -bereich: Motoren und Methoden -kurz: Gas geben, lenken und einer Linie folgen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- mit Räder einzeln Gas geben und anhalten -- fahren, bis ein Sensor etwas meldet -- einen Linienfolger in Java schreiben -::: - -## Zwei Motoren, zwei Räder - -::: mbot2 -fokus: motors, wheels -ansicht: unten -::: - -Der mBot2 hat zwei [Motoren]{teil=motors}, jeder treibt ein [Rad]{teil=wheels} an. Bisher hast du **fahre vor** und **drehe rechts** benutzt. Diese Befehle fahren eine feste Strecke und warten, bis der mBot2 angekommen ist. - -Mit **Räder einzeln** (\`mbot.drive(links, rechts)\`) gibst du stattdessen Gas: Du sagst, wie stark sich jedes Rad dreht, in Prozent von −100 bis 100. Der mBot2 fährt dann **weiter**, bis du ihm etwas anderes sagst. Mit **anhalten** (\`mbot.stop()\`) bleibt er stehen. - -| Befehl | Was passiert? | -|---|---| -| \`mbot.drive(40, 40)\` | beide Räder gleich schnell: geradeaus | -| \`mbot.drive(-40, -40)\` | rückwärts | -| \`mbot.drive(10, 40)\` | rechts schneller: Kurve nach links | -| \`mbot.drive(40, -40)\` | Räder gegeneinander: dreht auf der Stelle nach rechts | -| \`mbot.stop()\` | anhalten | - -> Im Simulator fährt \`mbot.drive(100, 100)\` 20 cm pro Sekunde. Probier es in der [Simulation](#zeige-simulation) aus. - -## Gas geben bis zur Wand im Struktogramm - -In Lektion 5 ist der mBot2 in 10-cm-Schritten bis zur Wand gefahren. Mit **Räder einzeln** geht das ohne Ruckeln: einmal Gas geben, dann warten, bis die Wand nah ist, dann anhalten. - -::: übung vb-gas-bis-wand -titel: Gas geben bis zur Wand -auftrag: Der mBot2 gibt mit 50 % Gas. Solange die Wand mehr als 15 cm entfernt ist, wartet er kurz. Danach hält er an. Es gibt drei Welten. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Ganz oben steht \`mbot.drive(50, 50)\`. Darunter eine While-Schleife mit der Bedingung \`mbot.getDistance() > 15\`. -tipp: In der Schleife steht nur **kurz warten**. Der mBot2 fährt dabei weiter! Nach der Schleife steht **anhalten**. -lösung: vb-gas-bis-wand-loesung.visustruct -::: - -## Der Linienfolger - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Ein Klassiker: Der mBot2 folgt einer schwarzen Linie auf dem Boden. Dafür schaut er auf die beiden mittleren Fühler des [Liniensensors]{teil=lineSensor}: - -| Sensor | Text | -|---|---| -| linker mittlerer Fühler sieht Schwarz | \`mbot.isLineLeft()\` | -| rechter mittlerer Fühler sieht Schwarz | \`mbot.isLineRight()\` | - -Die Idee: Sehen **beide** die Linie, fährt er geradeaus. Sieht nur der **linke** sie, ist die Linie nach links gewandert: Er lenkt nach links, also dreht sich das rechte Rad schneller. Sieht nur der **rechte** sie, lenkt er nach rechts. - -## Jetzt in Java: Linienfolger - -::: übung vb-java-linienfolger -titel: Linienfolger -code: java -auftrag: Schreibe in Java einen Linienfolger. Solange die Wand mehr als 15 cm entfernt ist, prüft der mBot2 seine beiden Fühler und lenkt. Danach hält er an. In der ersten Welt biegt die Linie nach rechts ab, in der zweiten nach links. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: \`while (mbot.getDistance() > 15) { … }\` und danach \`mbot.stop();\`. -tipp: In der Schleife: \`if (mbot.isLineLeft() && mbot.isLineRight()) { mbot.drive(40, 40); } else if (mbot.isLineLeft()) { mbot.drive(10, 40); } else if (mbot.isLineRight()) { mbot.drive(40, 10); }\` -lösung: vb-java-linienfolger-loesung.visustruct -::: - -> Am echten mBot2 klebst du die Linie mit schwarzem Isolierband auf einen hellen Boden. Fahr anfangs langsam, sonst schießt er in der Kurve über die Linie hinaus. - -::: übung vb-fehler-20-motoren -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Linienfolger“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-20-motoren-start.visustruct -welt: linie-1, linie-2 -tipp: Lies die Fehlermeldung genau. In welchem Kasten bleibt die Simulation stehen? Java unterscheidet Groß- und Kleinschreibung. -tipp: Richtig heißt es \`mbot.stop()\`. -lösung: vb-java-linienfolger-loesung.visustruct -::: - -## Spiel: Wohin fährt er? - -::: spiel frage -titel: Spiel: Wohin fährt er? -intro: Links und rechts Gas in Prozent: Wohin fährt der mBot2? Sieben Runden. -antworten: geradeaus | rückwärts | Kurve nach links | Kurve nach rechts | dreht sich auf der Stelle - -runde: - mbot.drive(40, 40); -frage: Wohin fährt er? -richtig: geradeaus -> Beide Räder drehen sich gleich schnell. - -runde: - mbot.drive(-40, -40); -frage: Wohin fährt er? -richtig: rückwärts -> Minus heißt rückwärts, und beide Räder sind gleich. - -runde: - mbot.drive(10, 40); -frage: Wohin fährt er? -richtig: Kurve nach links -> Das rechte Rad ist schneller, also lenkt er nach links. - -runde: - mbot.drive(40, 10); -frage: Wohin fährt er? -richtig: Kurve nach rechts -> Das linke Rad ist schneller, also lenkt er nach rechts. - -runde: - mbot.drive(40, -40); -frage: Wohin fährt er? -richtig: dreht sich auf der Stelle -> Ein Rad vor, eins zurück: Er dreht sich nach rechts, ohne vom Fleck zu kommen. - -runde: - mbot.drive(-40, 40); -frage: Wohin fährt er? -richtig: dreht sich auf der Stelle -> Diesmal dreht er sich nach links. - -runde: - if (mbot.isLineLeft() && !mbot.isLineRight()) { - ... - } -frage: Linienfolger: Nur der linke Fühler sieht die Linie. Was gehört in die Lücke? -- \`mbot.drive(40, 10);\` -- [x] \`mbot.drive(10, 40);\` -- \`mbot.stop();\` -> Die Linie ist nach links gewandert. Er lenkt nach links, also dreht sich das rechte Rad schneller. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann mit Räder einzeln Gas geben und anhalten. → Zwei Motoren, zwei Räder -- Ich kann fahren, bis ein Sensor etwas meldet. → Gas geben bis zur Wand im Struktogramm -- Ich kann einen Linienfolger in Java schreiben. → Jetzt in Java: Linienfolger -::: - -## Wissenstest - -::: quiz -? Was macht \`mbot.drive(30, 30)\`? -→ Zwei Motoren, zwei Räder -- [ ] Er fährt 30 cm und hält an. -- [x] Er fährt geradeaus und hört nicht auf, bis ein anderer Fahrbefehl kommt. -- [ ] Er dreht sich um 30°. -> **Räder einzeln** gibt nur Gas. Anhalten musst du selbst. -? Der mBot2 soll nach rechts lenken. Welcher Befehl passt? -→ Zwei Motoren, zwei Räder -- [ ] \`mbot.drive(10, 40)\` -- [x] \`mbot.drive(40, 10)\` -- [ ] \`mbot.drive(-40, -40)\` -> Dreht sich das linke Rad schneller, fährt er eine Rechtskurve. -::: -`,Y5=`--- -titel: Stoppuhr und Akku -bereich: Motoren und Methoden -kurz: Zeit messen und den Akku im Blick behalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- die Stoppuhr auf 0 setzen und ablesen -- eine bestimmte Zeit lang fahren -- den Akkustand anzeigen -::: - -## Die Stoppuhr - -::: mbot2 -fokus: cyberpi -ansicht: oben -::: - -Im [CyberPi]{teil=cyberpi} läuft eine Stoppuhr. Sie zählt die Sekunden, seit das Programm läuft. Mit **Stoppuhr auf 0** (\`mbot.resetTimer()\`) fängt sie wieder bei 0 an. - -| Sensor oder Befehl | Text | Wert | -|---|---|---| -| Stoppuhr auf 0 | \`mbot.resetTimer()\` | | -| Stoppuhr | \`mbot.getTimer()\` | Sekunden mit Nachkommastelle, z. B. \`1.5\` | - -So fährst du eine bestimmte Zeit lang: Stoppuhr auf 0, Gas geben, warten, solange die Stoppuhr noch nicht weit genug ist, anhalten. - -## Zwei Sekunden fahren im Struktogramm - -::: übung vb-zwei-sekunden -titel: Zwei Sekunden -auftrag: Der mBot2 setzt die Stoppuhr auf 0 und gibt mit 50 % Gas. Solange die Stoppuhr unter 2 Sekunden ist, wartet er kurz. Danach hält er an. Mit 50 % schafft er 10 cm pro Sekunde, er muss also 20 cm weiter stehen bleiben. -welt: zeit-1 -braucht: whileSchleife -tipp: Oben stehen **Stoppuhr auf 0** und \`mbot.drive(50, 50)\`. Darunter eine While-Schleife mit \`mbot.getTimer() < 2\`. -tipp: In der Schleife steht **kurz warten**, nach der Schleife **anhalten**. -lösung: vb-zwei-sekunden-loesung.visustruct -::: - -## Der Akku - -::: mbot2 -fokus: shield -ansicht: oben -::: - -Unter dem durchsichtigen [Shield]{teil=shield} siehst du den Akku. Wie voll er ist, liefert \`mbot.getBattery()\` in Prozent: \`100\` ist ganz voll. Ist er fast leer, fahren die Motoren schwächer. Dann wird es Zeit zum Laden. - -::: angeberwissen -Auch dein Handy misst seinen Akku nicht direkt in Prozent. Es misst die Spannung: Ein voller Lithium-Akku hat etwas über 4 Volt, ein leerer gut 3. Daraus rechnet es die Prozente aus, genau wie der CyberPi. -::: - -## Jetzt in Java: Akku-Anzeige - -::: übung vb-java-akku -titel: Akku-Anzeige -code: java -auftrag: Schreibe in Java: Der mBot2 zeigt auf dem Bildschirm zum Beispiel **Akku: 80 %**. Ist der Akku unter 20 %, leuchten zusätzlich die LEDs rot. -messwerte: getBattery=80 -> none, ledOff, screen "Akku: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Akku: 15 %" -braucht: verzweigung -tipp: \`mbot.showText("Akku: " + mbot.getBattery() + " %");\` setzt den Text aus drei Teilen zusammen. -tipp: Danach: \`if (mbot.getBattery() < 20) { mbot.setLed(255, 0, 0); }\` -lösung: vb-java-akku-loesung.visustruct -::: - -::: übung vb-fehler-21-stoppuhr-akku -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Akku-Anzeige“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-21-stoppuhr-akku-start.visustruct -messwerte: getBattery=80 -> none, ledOff, screen "Akku: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Akku: 15 %" -tipp: Zähle die Zahlen in der Klammer. Wie viele braucht der Befehl? Das steht unter **Nachschlagen**. -tipp: Richtig heißt es \`mbot.setLed(255, 0, 0)\`. -lösung: vb-java-akku-loesung.visustruct -::: - -## Spiel: Stoppuhr und Akku - -::: spiel frage -titel: Spiel: Stoppuhr und Akku -intro: Lies den Code und sag vorher, was passiert. Fünf Runden. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: Wie lange fährt der mBot2? -- 0,1 Sekunden -- [x] 2 Sekunden -- bis zur Wand -> Er wartet, bis die Stoppuhr 2 Sekunden zeigt, dann hält er an. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: Mit 50 % schafft er 10 cm pro Sekunde. Wie weit fährt er? -- 10 cm -- [x] 20 cm -- 50 cm -> 2 Sekunden mal 10 cm pro Sekunde sind 20 cm. - -runde: - mbot.pause(3000); - mbot.resetTimer(); - mbot.pause(1000); - mbot.showText(mbot.getTimer()); -frage: Welche Zahl zeigt der Bildschirm ungefähr? -- 0 -- [x] 1 -- 4 -> Die Stoppuhr fängt nach \`mbot.resetTimer()\` wieder bei 0 an. Danach vergeht nur noch 1 Sekunde. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Akku: " + mbot.getBattery() + " %"); -frage: Der Akku hat noch 15 %. Was passiert? -- Nur der Bildschirm zeigt **Akku: 15 %**. -- Nur die LEDs leuchten rot. -- [x] Der Bildschirm zeigt **Akku: 15 %**, und die LEDs leuchten rot. -> 15 ist kleiner als 20. Die Anzeige steht unter der Verzweigung und kommt immer. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Akku: " + mbot.getBattery() + " %"); -frage: Der Akku hat 80 %. Was passiert? -- [x] Nur der Bildschirm zeigt **Akku: 80 %**. -- Nur die LEDs leuchten rot. -- Gar nichts. -> 80 ist nicht kleiner als 20, die LEDs bleiben aus. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann die Stoppuhr auf 0 setzen und ablesen. → Die Stoppuhr -- Ich kann eine bestimmte Zeit lang fahren. → Zwei Sekunden fahren im Struktogramm -- Ich kann den Akkustand anzeigen. → Jetzt in Java: Akku-Anzeige -::: - -## Wissenstest - -::: quiz -? Was liefert \`mbot.getTimer()\` direkt nach \`mbot.resetTimer()\`? -→ Die Stoppuhr -- [x] 0 -- [ ] 100 -- [ ] Die Uhrzeit -> Die Stoppuhr fängt wieder bei 0 an. -? Warum wartet der mBot2 in der Schleife nur **kurz** und hält nicht an? -→ Zwei Sekunden fahren im Struktogramm -- [ ] Weil die Schleife sonst nicht startet. -- [x] Weil er weiterfahren soll, bis die Zeit um ist. -- [ ] Weil die Stoppuhr sonst stehen bleibt. -> Gas geben gilt weiter, auch während er wartet. -::: -`,K5=`--- -titel: Zustände: Was mache ich gerade? -bereich: Motoren und Methoden -kurz: Mit einer Zustandsvariablen und einer Fallauswahl eine Robo-Ampel weiterschalten. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- erklären, was ein Zustand ist -- mit einer Fallauswahl je nach Zustand handeln und in den nächsten Zustand wechseln -- Zustände in Java mit Namen und \`.equals\` unterscheiden -::: - -## Was ist ein Zustand? - -Eine Ampel ist immer in genau einem **Zustand**: rot, grün oder gelb. In jedem Zustand weiß sie zwei Dinge: Was zeige ich? Und was kommt danach? - -Unsere Robo-Ampel hat drei Zustände. Jeder bekommt eine Nummer: - -| Zustand | LEDs | danach | -|---|---|---| -| 0 | rot | 1 | -| 1 | grün | 2 | -| 2 | gelb | 0 | - -Den aktuellen Zustand speicherst du in einer Variablen: \`int zustand = 0\`. So eine Variable heißt **Zustandsvariable**. Ein Programm, das so von Zustand zu Zustand springt, heißt **Zustandsautomat**. - -> Eine echte Ampel in Deutschland hat vier Zustände: rot, rot-gelb, grün, gelb. Unsere Robo-Ampel lässt rot-gelb weg. - -::: angeberwissen -Auch ein Saugroboter ist ein Zustandsautomat: saugen, ausweichen, zur Ladestation fahren. Ich habe nur zwei Zustände: fressen und schlafen. -::: - -## Die Robo-Ampel im Struktogramm - -Die Fallauswahl passt perfekt: Für jeden Zustand gibt es einen Fall. In jedem Fall stehen zwei Kästen: Was tue ich? Und welcher Zustand kommt als Nächstes? - -::: übung vb-ampel-zustand -titel: Robo-Ampel -auftrag: Baue ein Struktogramm: Lege \`int zustand = 0\` an. Eine For-Schleife läuft sechsmal. In ihr steht eine Fallauswahl über \`zustand\`. Fall 0: LEDs rot, \`zustand = 1\`. Fall 1: LEDs grün, \`zustand = 2\`. Sonst: LEDs gelb, \`zustand = 0\`. Nach der Fallauswahl wartet der mBot2 eine Sekunde. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, fallauswahl -tipp: Die Fallauswahl findest du bei den Elementen. Schreib \`zustand\` hinein. Die Fälle heißen 0, 1 und sonst (default). -tipp: Die Farben sind \`mbot.setLed(255, 0, 0)\` für rot, \`mbot.setLed(0, 255, 0)\` für grün und \`mbot.setLed(255, 200, 0)\` für gelb. Unter der Fallauswahl, noch in der Schleife, steht \`mbot.pause(1000)\`. -lösung: vb-ampel-zustand-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Fallauswahl“](?visustruct&lektion=10-fallauswahl). Sie öffnet sich in einem neuen Fenster. - -## Jetzt in Java: Zustände mit Namen - -Nummern sind schnell vergessen. Was war noch mal Zustand 2? Lesbarer sind Namen. Dann ist der Zustand ein Text: - -\`\`\`java -String zustand = "rot"; -... -if (zustand.equals("rot")) { - mbot.setLed(255, 0, 0); - zustand = "grün"; -} else if (zustand.equals("grün")) { - ... -\`\`\` - -Texte vergleichst du in Java mit \`.equals("…")\`, nicht mit \`==\`. - -::: übung vb-java-ampel-text -titel: Ampel mit Namen -code: java -auftrag: Schreibe die Robo-Ampel in Java mit \`String zustand = "rot";\`. Prüfe mit \`if\` und \`else if\`, in welchem Zustand die Ampel ist: rot, dann grün, dann gelb, dann wieder rot. Die Schleife läuft sechsmal, nach jedem Durchgang 1 Sekunde Pause. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, verzweigung -tipp: In der Schleife: \`if (zustand.equals("rot")) { … } else if (zustand.equals("grün")) { … } else { … }\` und danach \`mbot.pause(1000);\`. -tipp: Im Fall rot stehen \`mbot.setLed(255, 0, 0);\` und \`zustand = "grün";\`. Grün schaltet auf \`"gelb"\`, gelb wieder auf \`"rot"\`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -::: übung vb-fehler-21-zustaende -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Ampel mit Namen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-21-zustaende-start.visustruct -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es \`zustand = "grün"\`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -## Zustände beim Fahren - -Mit Zuständen kann der mBot2 auch fahren. Im Zustand **fahren** fährt er vor. Sieht er eine Wand, wechselt er in den Zustand **drehen**. Dort dreht er sich einmal und wechselt zurück zu **fahren**. - -::: diagramm vb-l21z-ausweichen.visustruct -Fahren und Ausweichen mit zwei Zuständen. Öffne das Diagramm im Editor und probiere es in einer Welt aus. -::: - -## Spiel: Welcher Zustand kommt jetzt? - -::: spiel frage -titel: Spiel: Welcher Zustand kommt jetzt? -intro: Die Robo-Ampel schaltet: 0 rot → 1 grün → 2 gelb → 0 rot. Welcher Zustand kommt als Nächstes? Fünf Runden. -frage: Welcher Zustand kommt danach? -antworten: 0 | 1 | 2 - -runde: -frage: Die Ampel ist gerade in Zustand **0** (rot). -richtig: 1 -> Nach rot kommt grün. - -runde: -frage: Die Ampel ist gerade in Zustand **2** (gelb). -richtig: 0 -> Nach gelb geht es wieder von vorn los. - -runde: -frage: Die Ampel ist gerade in Zustand **1** (grün). -richtig: 2 -> Nach grün kommt gelb. - -runde: -frage: Die Ampel startet in Zustand 0 und schaltet **zweimal** weiter. -richtig: 2 -> 0 → 1 → 2. - -runde: -frage: Die Ampel startet in Zustand 0 und schaltet **dreimal** weiter. -richtig: 0 -> 0 → 1 → 2 → 0. Nach drei Schritten ist sie wieder am Anfang. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann erklären, was ein Zustand ist. → Was ist ein Zustand? -- Ich kann mit einer Fallauswahl je nach Zustand handeln und in den nächsten Zustand wechseln. → Die Robo-Ampel im Struktogramm -- Ich kann Zustände in Java mit Namen und \`.equals\` unterscheiden. → Jetzt in Java: Zustände mit Namen -::: - -## Wissenstest - -::: quiz -? Was speichert eine Zustandsvariable? -→ Was ist ein Zustand? -- [ ] Wie oft die Schleife gelaufen ist -- [x] Was das Programm gerade macht, zum Beispiel rot oder grün -- [ ] Den größten Messwert -? Was steht in jedem Fall der Fallauswahl? -→ Die Robo-Ampel im Struktogramm -- [x] Was zu tun ist und welcher Zustand als Nächstes kommt -- [ ] Nur eine Pause -- [ ] Eine neue Schleife -? Wie prüfst du in Java, ob \`zustand\` den Text \`"rot"\` enthält? -→ Jetzt in Java: Zustände mit Namen -- [ ] \`zustand == rot\` -- [x] \`zustand.equals("rot")\` -- [ ] \`zustand = "rot"\` -> Texte vergleichst du mit \`.equals\`. Ein einzelnes \`=\` würde \`"rot"\` zuweisen. -::: -`,X5=`--- -titel: Eigene Methoden -bereich: Motoren und Methoden -kurz: Eigene Befehle mit Parametern und Rückgabewert schreiben und aufrufen. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- ein Unterprogramm mit Parameter bauen und aufrufen -- Methoden in Java erkennen -- eine überladene Methode erkennen und aufrufen -- eine Methode mit Rückgabewert schreiben -::: - -## Ein Unterprogramm für das Quadrat - -Ein Quadrat fahren kann der mBot2 schon. Jetzt soll er zwei verschieden große Quadrate fahren. Statt die Schleife zweimal zu bauen, schreibst du ein **Unterprogramm**. In Java heißt es **Methode**. Es ist ein eigener Befehl, den du so oft aufrufen kannst, wie du willst. - -Die Kopfzeile \`void quadrat(int seite)\` sagt: - -- \`void\`: Die Methode liefert kein Ergebnis zurück, sie **tut** nur etwas. -- \`quadrat\`: So heißt dein neuer Befehl. -- \`int seite\`: Beim Aufruf gibst du eine Zahl mit, den **Parameter**. - -::: übung vb-quadrat-methode -titel: Zwei Quadrate -auftrag: Baue ein Unterprogramm \`void quadrat(int seite)\`, das ein Quadrat mit der Seitenlänge \`seite\` fährt. Das Hauptprogramm ruft es zweimal auf: erst mit 30, dann mit 50. -fahrt: 4 x (forward 30, turnRight), 4 x (forward 50, turnRight) -braucht: aufruf -tipp: Lege mit **+** einen neuen Reiter an und gib ihm den Titel \`void quadrat(int seite)\`. Darin steht eine For-Schleife, die viermal \`mbot.forward(seite)\` und \`mbot.turnRight()\` ausführt. -tipp: Im Hauptprogramm stehen zwei Aufruf-Kästen: \`quadrat(30)\` und \`quadrat(50)\`. -lösung: vb-quadrat-methode-loesung.visustruct -unterprogramm: vb-quadrat-unterprogramm-loesung.visustruct -::: - -## Methoden in Java - -In Java steht jede Methode in einer Klasse. Das Programm beginnt immer in der Methode \`main\`. Von dort wird \`quadrat\` aufgerufen: - -\`\`\`java -public class Quadrate { - public static void main(String[] args) { - quadrat(30); - quadrat(50); - } - - static void quadrat(int seite) { - for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); - } - } -} -\`\`\` - -Im Bereich [Code](#zeige-codelive) siehst du jede Methode in ihrem eigenen Reiter, so wie im Struktogramm. - -::: quiz -? Was bedeutet \`void\` in \`void quadrat(int seite)\`? -→ Methoden in Java -- [ ] Die Methode hat keinen Parameter. -- [x] Die Methode liefert kein Ergebnis zurück. -- [ ] Die Methode darf nur einmal aufgerufen werden. -> \`void\` heißt „leer“: Es kommt kein Wert zurück. Der Parameter steht in den Klammern. -? Mit welchem Wert für \`seite\` läuft \`quadrat(50)\`? -→ Ein Unterprogramm für das Quadrat -- [ ] 30 -- [x] 50 -- [ ] mit keinem -> Der Wert in den Klammern des Aufrufs wird zum Parameter \`seite\`. -::: - -## Gleicher Name, andere Parameter: Überladung - -Du kennst \`mbot.forward()\` und \`mbot.forward(30)\`. Das sind **zwei verschiedene Methoden mit demselben Namen**. Java erkennt am Aufruf, welche gemeint ist: an der **Anzahl** und am **Typ** der Parameter. Das nennt man **Überladung** (englisch *overloading*). - -Es gibt noch eine dritte \`forward\`-Methode. Sie hat zwei Parameter: eine Zahl und eine **Einheit** als Text. - -\`\`\`java -mbot.forward(); // 10 cm (Standardwert) -mbot.forward(30); // 30 cm -mbot.forward(30, "cm"); // 30 cm, Einheit ausdrücklich -mbot.forward(2, "Umdrehungen"); // die Räder drehen sich zweimal -\`\`\` - -Eine Radumdrehung ist so weit wie der Umfang des Rads: π · 6,5 cm ≈ 20,4 cm. Zwei Umdrehungen sind also etwa 40,8 cm. Für \`mbot.backward\` gibt es dieselben drei Varianten. - -So sehen die drei Kopfzeilen aus. Der Methodenname ist gleich, die Parameterlisten sind verschieden: - -\`\`\`java -void forward() -void forward(int cm) -void forward(int wert, String einheit) -\`\`\` - -Überladung kennst du schon: \`System.out.println\` gibt es für \`int\`, für \`double\`, für \`String\` und noch mehr. Deshalb kannst du jeden dieser Werte einfach in die Klammern schreiben. - -::: angeberwissen -Stimmen die 20,4 cm bei **deinem** mBot2 wirklich? Profis glauben keiner Zahl, die sie nicht nachgemessen haben. Miss den Raddurchmesser und lass \`mbot.forward(5, "Umdrehungen")\` fahren: Soll sind 102,1 cm. So testet man Softwaresysteme: Jeder **Testfall** hat ein erwartetes Ergebnis (**Soll**) und ein gemessenes (**Ist**). Man testet mehrmals und schreibt alles in ein **Protokoll**. Hier ist dein [Messprotokoll zum Ausdrucken (PDF)](https://visubot.visucode.de/messprotokoll-radumdrehung.pdf). Gib es deiner Lehrkraft, dann sieht sie, ob alle Roboter gleich weit fahren. -::: - -::: übung vb-ueberladung-umdrehung -titel: Quadrat mit Umdrehungen -auftrag: Fahre ein Quadrat, bei dem jede Seite genau **eine Radumdrehung** lang ist. Nimm dafür die überladene Methode \`mbot.forward(1, "Umdrehungen")\`. -fahrt: 4 x (forward 20.42, turnRight) -braucht: forSchleife -tipp: Eine For-Schleife mit \`int i = 0\`, \`i < 4\`, \`i++\`. -tipp: Im Inhalt stehen \`mbot.forward(1, "Umdrehungen")\` und \`mbot.turnRight()\`. -lösung: vb-ueberladung-umdrehung-loesung.visustruct -::: - -::: übung vb-java-rechteck-umdrehungen -titel: Rechteck mit Umdrehungen -code: java -auftrag: Schreibe in Java: Der mBot2 fährt ein Rechteck. Die langen Seiten sind **zwei** Radumdrehungen lang, die kurzen **eine**. Benutze \`mbot.forward(2, "Umdrehungen")\` und \`mbot.forward(1, "Umdrehungen")\`. -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -braucht: forSchleife -tipp: Eine For-Schleife, die zweimal läuft: \`for (int i = 0; i < 2; i++) { … }\`. -tipp: In der Schleife: \`mbot.forward(2, "Umdrehungen");\`, \`mbot.turnRight();\`, \`mbot.forward(1, "Umdrehungen");\`, \`mbot.turnRight();\` -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -::: quiz -? Welche Methode ruft \`mbot.forward(3, "Umdrehungen")\` auf? -→ Gleicher Name, andere Parameter: Überladung -- [ ] \`forward()\` -- [ ] \`forward(int cm)\` -- [x] \`forward(int wert, String einheit)\` -> Java wählt die Variante, deren Parameter passen: zwei Parameter, eine Zahl und ein Text. -::: - -## Methode mit Rückgabe - -Eine Methode kann auch etwas **ausrechnen** und das Ergebnis zurückgeben. Statt \`void\` steht dann der Datentyp des Ergebnisses in der Kopfzeile, und \`return\` gibt den Wert zurück: - -\`\`\`java -static int zentimeter(int umdrehungen) { - return umdrehungen * 20; -} -\`\`\` - -Eine Radumdrehung sind rund 20 cm. Der Aufruf \`int strecke = zentimeter(3);\` legt also 60 in \`strecke\`. - -::: übung vb-zentimeter -titel: Umdrehungen in Zentimeter -auftrag: Baue ein Unterprogramm \`int zentimeter(int umdrehungen)\`, das \`umdrehungen * 20\` zurückgibt. Das Hauptprogramm ruft es mit 3 auf, fährt die Strecke und zeigt **Strecke: 60 cm** auf dem Bildschirm. -fahrt: forward 60 -befehle: showText "Strecke: 60 cm" -braucht: aufruf -tipp: Neuer Reiter mit dem Titel \`int zentimeter(int umdrehungen)\`. Darin reicht eine Anweisung: \`return umdrehungen * 20\`. -tipp: Im Hauptprogramm: Aufruf \`int strecke = zentimeter(3)\`, danach \`mbot.forward(strecke)\` und \`mbot.showText("Strecke: " + strecke + " cm")\`. -lösung: vb-zentimeter-loesung.visustruct -unterprogramm: vb-zentimeter-unterprogramm-loesung.visustruct -::: - -> 📘 **Mehr dazu ohne Roboter:** In VisuStruct gibt es die Lektion [„Aufruf und Aussprung“](?visustruct&lektion=18-aufruf-und-aussprung). Sie öffnet sich in einem neuen Fenster. - -::: übung vb-fehler-22-eigene-methoden -titel: Warum läuft das nicht? -code: java -auftrag: Ludwig hat „Rechteck mit Umdrehungen“ abgetippt, aber das Programm läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-22-eigene-methoden-start.visustruct -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -tipp: Ein Text gehört in Anführungszeichen. Ohne sie sucht Java eine Variable mit diesem Namen. -tipp: Richtig heißt es \`mbot.forward(1, "Umdrehungen")\`. -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -## Spiel: Welche Methode? - -::: spiel frage -titel: Spiel: Welche Methode? -intro: Gleicher Name, andere Parameter: Welche Methode ruft Java auf, und was kommt heraus? Sechs Runden. - -runde: - mbot.forward(30, "cm"); -frage: Welche \`forward\`-Methode läuft? -- \`forward()\` -- \`forward(int cm)\` -- [x] \`forward(int wert, String einheit)\` -> Zwei Parameter, eine Zahl und ein Text: Das passt nur zur dritten. - -runde: - mbot.forward(); -frage: Wie weit fährt der mBot2? -- [x] 10 cm -- gar nicht, die Zahl fehlt -- eine Radumdrehung -> Ohne Parameter fährt \`forward\` 10 cm. Das ist die Variante ohne Parameter. - -runde: - mbot.forward(2, "Umdrehungen"); -frage: Wie weit fährt der mBot2 ungefähr? -- 2 cm -- 20 cm -- [x] 41 cm -> Eine Radumdrehung sind etwa 20,4 cm, zwei also etwa 40,8 cm. - -runde: - static int zentimeter(int umdrehungen) { - return umdrehungen * 20; - } -frage: Was liefert \`zentimeter(4)\`? -- 4 -- 24 -- [x] 80 -> Der Parameter \`umdrehungen\` ist 4, und \`return\` gibt 4 · 20 zurück. - -runde: - public static void main(String[] args) { - quadrat(30); - quadrat(50); - } -frage: Wie viele Quadrate fährt der mBot2, und wie groß ist das zweite? -- eins mit 80 cm -- [x] zwei, das zweite mit 50 cm Seitenlänge -- zwei, beide mit 30 cm Seitenlänge -> Jeder Aufruf fährt ein Quadrat. Der Wert in den Klammern wird zu \`seite\`. - -runde: -frage: Welche Kopfzeile passt zu einer Methode, die eine Zahl zurückgibt? -- \`void zentimeter(int umdrehungen)\` -- [x] \`int zentimeter(int umdrehungen)\` -- \`zentimeter(int umdrehungen)\` -> Vor dem Namen steht der Datentyp des Ergebnisses. \`void\` heißt: kein Ergebnis. -::: - -## Spiel: Bombe entschärfen - -::: spiel bombe -titel: Spiel: Bombe entschärfen -intro: In jedem Programm steckt **genau ein Fehler**, und die Bombe tickt. Tippe auf die falsche Zeile, bevor die Zeit abläuft. Vier Runden, je 30 Sekunden. -zeit: 30 - -runde: - static void quadrat(int seite) { - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } - } -frage: Soll ein Quadrat mit der Seitenlänge \`seite\` fahren. -fehler: 3 -besser: mbot.forward(seite); -> Mit \`30\` ist jedes Quadrat gleich groß, egal was man übergibt. - -runde: - static void zentimeter(int umdrehungen) { - return umdrehungen * 20; - } -frage: Soll die Strecke in cm zurückgeben. -fehler: 1 -besser: static int zentimeter(int umdrehungen) { -> Wer etwas zurückgibt, braucht den Datentyp des Ergebnisses statt \`void\`. - -runde: - static int zentimeter(int umdrehungen) { - int cm = umdrehungen * 20; - } -frage: Soll die Strecke in cm zurückgeben. -fehler: 2 -besser: return umdrehungen * 20; -> Die Methode rechnet, gibt aber nichts zurück. Es fehlt \`return\`. - -runde: - mbot.forward(2, Umdrehungen); -frage: Soll zwei Radumdrehungen weit fahren. -fehler: 1 -besser: mbot.forward(2, "Umdrehungen"); -> Die Einheit ist ein Text und braucht Anführungszeichen. -::: - -## Spiel: Begriffe-Rätsel - -::: spiel kreuzwort -titel: Spiel: Begriffe-Rätsel -intro: Fülle das Rätsel mit den Fachbegriffen aus diesem Teil. Klick auf einen Hinweis, um zum Wort zu springen. Die gelben Felder ergeben das Lösungswort. -- → 5 3 PARAMETER: Wert, den du beim Aufruf in die Klammern schreibst -- ↓ 1 3 STOPPUHR: mbot.getTimer() liest sie ab -- ↓ 5 5 RÜCKGABE: mit return liefert eine Methode ein Ergebnis zurück -- ↓ 3 8 ÜBERLADUNG: gleicher Methodenname, andere Parameter -- → 2 1 METHODE: eigener Befehl mit Namen, z. B. quadrat(30) -- → 10 5 AKKU: mbot.getBattery() sagt, wie voll er ist -- ↓ 2 1 MOTOR: jedes Rad hat einen eigenen -- ↓ 1 10 LINIENFOLGER: fährt einer schwarzen Linie nach -lösung: 5 7, 5 10, 4 1, 7 3, 3 3, 9 8, 5 8 -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann ein Unterprogramm mit Parameter bauen und aufrufen. → Ein Unterprogramm für das Quadrat -- Ich kann Methoden in Java erkennen. → Methoden in Java -- Ich kann eine überladene Methode erkennen und aufrufen. → Gleicher Name, andere Parameter: Überladung -- Ich kann eine Methode mit Rückgabewert schreiben. → Methode mit Rückgabe -::: - -## Wissenstest - -::: quiz -? Das Unterprogramm \`void quadrat(int seite)\` soll ein Quadrat mit 30 cm Seitenlänge fahren. Wie sieht der Aufruf aus? -→ Ein Unterprogramm für das Quadrat -- [ ] \`quadrat()\` -- [x] \`quadrat(30)\` -- [ ] \`int seite = quadrat(30)\` -> Der Wert in den Klammern wird zum Parameter \`seite\`. Weil \`quadrat\` nichts zurückgibt, gibt es keine Zuweisung. -? In welcher Methode beginnt ein Java-Programm? -→ Methoden in Java -- [ ] in der ersten Methode der Klasse -- [x] in der Methode \`main\` -- [ ] in der Methode \`quadrat\` -> Das Programm beginnt immer in \`main\`. Von dort werden die anderen Methoden aufgerufen. -? Woran unterscheidet Java die überladenen Methoden \`forward()\`, \`forward(int cm)\` und \`forward(int wert, String einheit)\`? -→ Gleicher Name, andere Parameter: Überladung -- [ ] am Namen -- [x] an der Anzahl und am Typ der Parameter -- [ ] an der Reihenfolge im Programm -> Der Name ist bei allen gleich. Java wählt die Variante, deren Parameter zum Aufruf passen. -? \`static int zentimeter(int umdrehungen) { return umdrehungen * 20; }\`: Was liegt nach \`int strecke = zentimeter(2);\` in \`strecke\`? -→ Methode mit Rückgabe -- [ ] 2 -- [ ] 20 -- [x] 40 -> \`return\` gibt 2 · 20 = 40 zurück, und dieser Wert landet in \`strecke\`. -? Was steht in der Kopfzeile einer Methode, die eine ganze Zahl zurückgibt, statt \`void\`? -→ Methode mit Rückgabe -- [ ] \`return\` -- [x] \`int\` -- [ ] \`static\` -> Statt \`void\` steht der Datentyp des Ergebnisses in der Kopfzeile. -::: -`,ez=`--- -titel: Wie geht es weiter? -bereich: Ausblick -kurz: Zurückblicken, was du mit dem mBot2 gelernt hast, und sehen, was in VisuStruct noch auf dich wartet. ---- - -## Diese Kompetenzen erwerbe ich jetzt - -::: kompetenzen -- sagen, welche Grundlagen der Programmierung ich mit dem mBot2 gelernt habe -- einen Fehler in einem Roboterprogramm allein finden und reparieren -- die Themen nennen, die in VisuStruct noch auf mich warten -::: - -## Das kannst du jetzt - -Glückwunsch, du hast alle Roboter-Lektionen geschafft! Mit dem mBot2 hast du die **Grundlagen der strukturierten Programmierung** gelernt: - -- ein **Struktogramm** lesen und bauen und es mit dem **Schreibtischtest** prüfen, einen Plan als **PAP** und als **Pseudocode** aufschreiben, -- **Sequenz**, **Verzweigung** und **Fallauswahl**, Bedingungen mit **und**, **oder** und **nicht**, -- die Schleifen **for**, **while** und **do-while**, auch ineinander verschachtelt, und den Aussprung mit **break**, -- **Variablen**, **Datentypen** und **Konstanten** mit \`final\`, Zählen, Summieren und den größten Wert finden, -- **Arrays** und **Zeichenketten**, -- eigene **Methoden** mit Parametern und Rückgabewert. - -Das alles gilt nicht nur für Roboter. Jedes Java-Programm ist aus genau diesen Bausteinen gebaut, auch ein Spiel oder eine App. - -::: angeberwissen -Määäh, weißt du, was du mit dem mBot2 eigentlich gebaut hast? Ein **eingebettetes System**: einen kleinen Computer, der in einem Gerät steckt und mit Sensoren seine Umwelt misst. Solche Systeme stecken in Waschmaschinen, Autos und Herzschrittmachern. In einem modernen Auto sind es über hundert. Und programmiert werden sie mit genau den Bausteinen, die du jetzt kennst. -::: - -## Noch einmal: Warum läuft das nicht? - -Zum Schluss eine letzte Fehlersuche. Diesmal ist es ein Fehler, den auch Profis oft machen. - -::: übung vb-fehler-23-wie-geht-es-weiter -titel: Warum läuft das nicht? -code: java -auftrag: Das Programm soll bis kurz vor die Wand fahren, aber es läuft nicht. „Im Editor öffnen“ zeigt den Code im Bereich Code. Klicke auf „Ausführen“ und lies die Fehlermeldung. Repariere den Fehler und klicke auf Prüfen. -start: vb-fehler-23-wie-geht-es-weiter-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Lies die Fehlermeldung genau. Vergleiche den Sensor mit den anderen Befehlen: Was steht hinter \`mbot.forward\`? -tipp: Hinter einem Befehl stehen immer runde Klammern, auch wenn nichts darin steht. Richtig heißt es \`mbot.getDistance() > 15\`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Was noch fehlt - -Einige Themen der Programmierung haben mit dem Roboter wenig zu tun. Du findest sie in **VisuStruct**, der Welt ohne Roboter. Weil du die Grundlagen schon kennst, kommst du dort schnell voran. Die Links öffnen sich in einem neuen Fenster. - -- **Eingabe mit der Tastatur:** Werte beim Ausführen abfragen, in [„Eingabe und Ausgabe“](?visustruct&lektion=06-eingabe-und-ausgabe). -- **Tabellen im Speicher:** Arrays mit Zeilen und Spalten, zum Beispiel für einen Kinosaal, in [„Zweidimensionale Arrays“](?visustruct&lektion=16-zweidimensionale-arrays). -- **Suchen und Sortieren:** einen Wert schnell finden und eine Liste der Größe nach ordnen, in [„Suchen und Sortieren“](?visustruct&lektion=19-suchen-und-sortieren). -- **Andere Sprachen:** dasselbe Programm in Python und JavaScript, in [„Python und JavaScript“](?visustruct&lektion=21-python-und-javascript). -- **Abstürze abfangen:** was passiert, wenn jemand „abc“ statt einer Zahl eintippt, in [„Wenn das Programm abstürzt: try und catch“](?visustruct&lektion=22-try-und-catch). -- **Dateien:** Text, Tabellen und Daten lesen und speichern, ab [„Text einlesen und speichern“](?visustruct&lektion=23-text-einlesen-und-speichern) über [„Tabellen als CSV“](?visustruct&lektion=25-tabellen-als-csv) bis [„Daten als JSON“](?visustruct&lektion=26-json). -- **Fenster mit Knöpfen:** eigene Programme mit Fenster, Textfeld und Knopf, ab [„Dein erstes Fenster“](?visustruct&lektion=28-erstes-fenster) bis [„Model View Controller“](?visustruct&lektion=40-model-view-controller). - -> Den mBot2 brauchst du dafür nicht. Du kannst aber jederzeit zurückkommen und ihm neue Kunststücke beibringen. - -## Spiel: Welche Welt? - -::: spiel frage -titel: Spiel: Welche Welt? -intro: Ludwig hat Ideen für neue Programme. Lernst du das mit dem mBot2 in VisuBot oder ohne Roboter in VisuStruct? Acht Runden. -antworten: VisuBot | VisuStruct - -runde: -frage: „Fahre bis zur Wand und piepe dann.“ -richtig: VisuBot -> Abstandssensor, Motoren und Lautsprecher: Das ist ein Fall für den mBot2. - -runde: -frage: „Ein Fenster mit einem Knopf, der bis 10 zählt.“ -richtig: VisuStruct -> Fenster mit Knöpfen baust du mit Swing in VisuStruct. - -runde: -frage: „Spiele eine Melodie, die in einem Array steht.“ -richtig: VisuBot -> Arrays und Melodien hast du mit dem Lautsprecher des mBot2 gelernt. - -runde: -frage: „Lies die Noten der Klasse aus einer CSV-Datei.“ -richtig: VisuStruct -> Dateien lesen und speichern lernst du in VisuStruct. - -runde: -frage: „Tippt jemand ‚abc‘ statt einer Zahl ein, soll das Programm nicht abstürzen.“ -richtig: VisuStruct -> Abstürze fängst du mit try und catch ab. Das steht in VisuStruct. - -runde: -frage: „Folge mit dem Liniensensor einer schwarzen Linie.“ -richtig: VisuBot -> Der Liniensensor sitzt unter dem mBot2. - -runde: -frage: „Sortiere zehn Zahlen der Größe nach.“ -richtig: VisuStruct -> Suchen und Sortieren steht in VisuStruct. Den größten Wert finden kannst du aber schon. - -runde: -frage: „Speichere die Bestenliste in einer Datei.“ -richtig: VisuStruct -> Dateien schreiben lernst du in VisuStruct in „Text einlesen und speichern“. -::: - -## Checkliste - -Schätze dich bei jedem Punkt ehrlich ein: ☂️ noch nicht, ⛅ teilweise, ☀️ kann ich sicher. Bei ⛅ und ☂️ hilft dir **Nachlesen**. Danach kommt der Wissenstest. Er zeigt dir, ob deine Einschätzung stimmt. - -::: checkliste -- Ich kann sagen, welche Grundlagen der Programmierung ich mit dem mBot2 gelernt habe. → Das kannst du jetzt -- Ich kann einen Fehler in einem Roboterprogramm allein finden und reparieren. → Noch einmal: Warum läuft das nicht? -- Ich kann die Themen nennen, die in VisuStruct noch auf mich warten. → Was noch fehlt -::: - -## Wissenstest - -::: quiz -? Gelten die Bausteine aus den Roboter-Lektionen auch für Programme ohne Roboter? -→ Das kannst du jetzt -- [x] Ja, jedes Java-Programm ist aus Sequenz, Verzweigung, Schleife, Variablen und Methoden gebaut -- [ ] Nein, ohne Roboter braucht man ganz andere Befehle -- [ ] Nur die Schleifen -> Nur die \`mbot.\`-Befehle gehören zum Roboter. Alles andere ist ganz normales Java. - -? Warum läuft \`mbot.getDistance > 15\` nicht? -→ Noch einmal: Warum läuft das nicht? -- [ ] Weil 15 zu klein ist -- [x] Weil hinter dem Befehl die runden Klammern fehlen -- [ ] Weil man \`<\` schreiben muss -> Ohne Klammern sucht Java eine Variable \`getDistance\` und findet keine. - -? Wo lernst du, wie ein Programm Abstürze mit try und catch abfängt? -→ Was noch fehlt -- [ ] In VisuBot -- [x] In VisuStruct -> Dort steht die Lektion „Wenn das Programm abstürzt: try und catch“. - -? Welche Themen findest du in VisuStruct? Wähle die passende Liste. -→ Was noch fehlt -- [x] Sortieren, Dateien und Fenster mit Knöpfen -- [ ] Liniensensor, LEDs und Motoren -- [ ] Nur die for-Schleife -> Liniensensor, LEDs und Motoren gehören zum mBot2, die for-Schleife kennst du schon. -::: -`,tz=`## 🤖 mBot2-Befehle - -Ein Befehl sagt dem mBot2, was er **tun** soll. Jeder Befehl beginnt mit \`mbot.\` und endet mit Klammern. In die Klammern schreibst du oft eine Zahl. - -### 🚗 Fahren und Drehen {.bot-fahren} - -Der mBot2 fährt geradeaus oder dreht sich auf der Stelle. - -\`\`\` -mbot.forward() fährt 10 cm nach vorn -mbot.forward(30) fährt 30 cm nach vorn -mbot.forward(2, "Umdrehungen") die Räder drehen sich 2-mal (≈ 41 cm) -mbot.backward(1, "Umdrehungen") eine Radumdrehung zurück (≈ 20 cm) -mbot.backward(20) fährt 20 cm zurück -mbot.turnRight() dreht sich nach rechts (90°) -mbot.turnLeft() dreht sich nach links (90°) -mbot.turnLeft(45) dreht sich nur ein bisschen nach links (45°) -mbot.turnRight(180) dreht sich ganz um -\`\`\` - -> \`forward\` und \`backward\` sind **überladen**: gleicher Name, verschiedene Parameter. Als Einheit gehen \`"cm"\` und \`"Umdrehungen"\`. Eine Radumdrehung sind etwa 20,4 cm. - -> Ohne Zahl fährt er 10 cm oder dreht sich 90°. 90° ist ein rechter Winkel, wie die Ecke von einem Blatt Papier. - -> Für ein Vieleck dreht er sich insgesamt einmal ganz herum: Dreieck 3 × 120°, Quadrat 4 × 90°, Sechseck 6 × 60°. - -### ⚙️ Räder einzeln {.bot-fahren} - -Hier gibst du jedem Rad selbst Gas. Die Zahlen sind Prozent: 100 ist volles Gas, 0 ist Stillstand, eine Zahl mit Minus fährt rückwärts. Der mBot2 fährt so lange weiter, bis ein anderer Fahrbefehl kommt. - -\`\`\` -mbot.drive(40, 40) beide Räder gleich: geradeaus -mbot.drive(10, 40) links langsamer: Kurve nach links -mbot.drive(40, -40) ein Rad vor, eins zurück: dreht sich -mbot.stop() hält an -\`\`\` - -### 💡 Licht {.bot-licht} - -Der mBot2 hat fünf LEDs mit den Nummern 0 bis 4. - -\`\`\` -mbot.setLed(255, 0, 0) alle LEDs leuchten rot -mbot.ledOff() alle LEDs aus -mbot.led(0).setColor("grün") nur LED 0 leuchtet grün -mbot.led(0).setColor("aus") nur LED 0 aus -\`\`\` - -Bei \`setLed\` mischst du Rot, Grün und Blau, jedes von 0 (aus) bis 255 (ganz hell). - -### 🔊 Ton {.bot-ton} - -\`\`\` -mbot.playTone(440, 300) spielt einen Ton -\`\`\` - -Die erste Zahl ist die Tonhöhe. Je größer, desto höher. Die zweite Zahl ist die Länge in Millisekunden (1000 Millisekunden sind 1 Sekunde). - -### 🖥️ Bildschirm {.bot-anzeige} - -\`\`\` -mbot.showText("Hallo") zeigt Hallo auf dem Bildschirm -\`\`\` - -Mit \`+\` hängst du Text und Zahlen aneinander: \`mbot.showText("Abstand: " + mbot.getDistance())\`. - -### 😊 Gefühle {.bot-anzeige} - -Der mBot2 zeigt ein Gefühl mit Licht, Ton und Wackeln. Das siehst du nur am echten mBot2. - -\`\`\` -mbot.emotion("smile") lacht -mbot.emotion("sad") ist traurig -mbot.emotion("wow") staunt -\`\`\` - -Weitere Gefühle: hello, yeah, proud, yummy, naughty, uh_oh, hurt, angry, startle, shiver, dizzy, sleepy, zzz, wake_up, blink, yes, no, look_up, look_down, look_left, look_right, look_around - -### ⏱️ Warten und Stoppuhr {.bot-warten} - -\`\`\` -mbot.pause(1000) wartet 1 Sekunde -mbot.resetTimer() stellt die Stoppuhr auf 0 -\`\`\` - -Die Zeit der Stoppuhr liest du mit dem Sensor \`mbot.getTimer()\` (unten bei **Stoppuhr und Akku**). - -## 📡 mBot2-Sensoren - -Ein Sensor **misst** etwas und gibt dir einen Wert zurück. Den Wert benutzt du in einer Bedingung, zum Beispiel in einer Schleife oder Verzweigung. Manche Sensoren liefern eine **Zahl**, manche **wahr oder falsch**, einer einen **Text**. - -### 📏 Abstand {.bot-sensor} - -Der Ultraschallsensor vorn misst, wie weit die nächste Wand weg ist, in Zentimetern. - -\`\`\` -mbot.getDistance() Abstand in cm, z. B. 25 -mbot.getDistance() > 15 ist vorn mehr als 15 cm frei? -int abstand = mbot.getDistance() Abstand in einer Variablen merken -\`\`\` - -### ➖ Linie {.bot-sensor} - -Unter dem mBot2 sitzen vier Fühler. Sie sehen, ob der Boden schwarz ist. - -\`\`\` -mbot.getLine() Zahl: 0 heißt, kein Fühler sieht Schwarz -mbot.getLine() == 0 kein Schwarz, weiterfahren -mbot.getLine() != 0 ein Fühler sieht Schwarz -mbot.isLineLeft() sieht der linke mittlere Fühler Schwarz? -mbot.isLineRight() sieht der rechte mittlere Fühler Schwarz? -\`\`\` - -### 🎨 Farben {.bot-sensor} - -Derselbe Sensor unten erkennt auch Farben. \`mbot.getColor()\` gibt dir den Namen der Farbe als Text: \`"rot"\`, \`"grün"\`, \`"blau"\`, \`"gelb"\`, \`"weiß"\` oder \`"schwarz"\`. - -\`\`\` -mbot.getColor().equals("rot") steht er auf Rot? -!mbot.getColor().equals("rot") steht er nicht auf Rot? -\`\`\` - -> Texte vergleichst du mit \`.equals(…)\`, nicht mit \`==\`. Das \`!\` davor heißt **nicht**. - -### 🕹️ Tasten und Joystick {.bot-sensor} - -Auf dem CyberPi gibt es die Tasten A und B und einen kleinen Joystick. Jeder Sensor sagt **wahr**, solange gedrückt wird. - -\`\`\` -mbot.isButtonA() wird Taste A gedrückt? -mbot.isButtonB() wird Taste B gedrückt? -mbot.isJoystickUp() Joystick nach oben gedrückt? -mbot.isJoystickDown() Joystick nach unten gedrückt? -mbot.isJoystickLeft() Joystick nach links gedrückt? -mbot.isJoystickRight() Joystick nach rechts gedrückt? -\`\`\` - -### 🔆 Licht und Lautstärke {.bot-sensor} - -\`\`\` -mbot.getBrightness() wie hell? 0 ist dunkel, 100 ist hell -mbot.getLoudness() wie laut? 0 ist still, 100 ist laut -\`\`\` - -### 📐 Neigung und Schütteln {.bot-sensor} - -\`\`\` -mbot.getPitch() nach vorn oder hinten gekippt? (in Grad) -mbot.getRoll() zur Seite gekippt? (in Grad) -mbot.isShaken() wird er geschüttelt? -\`\`\` - -> Liegt der mBot2 flach, sind beide Neigungen 0. In der Simulation stellst du diese Werte unter **🎛 Sensoren ausprobieren** ein. - -### 🔋 Stoppuhr und Akku {.bot-sensor} - -\`\`\` -mbot.getTimer() Sekunden seit dem Start oder seit resetTimer() -mbot.getBattery() wie voll ist der Akku? (in Prozent) -\`\`\` - -### Echter mBot2 - -Mit **🔌 mBot2** neben „Simulation starten“ verbindest du den echten Roboter mit dem USB-Kabel. Das geht nur in Chrome oder Edge. Dann fährt er jeden Schritt der Simulation mit, und die Sensoren messen echte Werte. Ein zweiter Klick trennt ihn wieder. - -### Ohne Kabel fahren - -Mit **⬆ Übertragen** speicherst du dein Programm fest auf dem mBot2. Danach Kabel ab, mBot2 an den Start und **Taste A** drücken: Er fährt dein Programm allein. Es bleibt gespeichert, bis du ein neues überträgst. Eingaben mit der Tastatur gehen am mBot2 nicht. -`,nz=`--- -titel: Structure chart and editor -bereich: Getting started -kurz: What a structure chart is, how to use the editor and how to save your programs. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what an algorithm and a structure chart are -- recognise the three building blocks sequence, branch and repetition -- insert, move and delete elements in the editor -- save a structure chart and open it again -::: - -## A plan for the robot - -A robot does not think for itself. It does exactly what is in its program, no more and no less. So before you program it, you need an exact plan. Such an exact step-by-step instruction is called an **algorithm**. - -A **structure chart** draws the plan as boxes. You read it from top to bottom. Each box is one step. It was invented in 1973 by Isaac Nassi and Ben Shneiderman, which is why it is also called a **Nassi-Shneiderman diagram**. - -::: diagramm vb-l00-sequenz-loesung.visustruct -Drive forward, turn right, drive forward: three boxes, from top to bottom. -::: - -::: angeberwissen -Ada Lovelace wrote the first program for a machine back in 1843, for a calculating machine that was never finished. Even then she guessed that such machines would one day do more than calculate, for example make music. Your mBot2 can do both. -::: - -## Three building blocks - -Every program, including one for a robot, is made of only three building blocks: - -| Building block | What it does | Example with the mBot2 | -|---|---|---| -| **Sequence** | steps one after the other | drive forward, turn, drive forward | -| **Branch** | one thing or the other, depending on a condition | Is the wall close? Then turn, otherwise drive forward. | -| **Repetition** | steps several times | do the same thing four times | - -In a structure chart you see the building blocks straight away: the branch has a triangle and two columns: **true** on the left, **false** on the right. The repetition (loop) wraps around its boxes like a tilted L. - -::: diagramm vb-l00-bausteine-loesung.visustruct -All three building blocks: first a box, then a loop, inside it a branch. -::: - -## The editor - -The [structure chart editor](#zeige-editor) has several areas. Move the mouse over a blue word or tap it, and the area lights up: - -- **On the left the [Elements](#zeige-elemente):** all building blocks to drag in. The group **mBot2 commands** has the commands for the mBot2 such as **drive forward** and **turn right**. -- **In the middle the [structure chart](#zeige-struktogramm):** a new diagram only contains an empty placeholder, shown as **ø**. -- **Below it the [Object Inspector](#zeige-objektinspektor):** here you change the text of the selected box, for example \`mbot.forward(30)\` instead of \`mbot.forward()\`. You can drag the line with the grip above it up or down. -- **Above it the [tools](#zeige-werkzeuge):** undo, copy, delete, export and, on the right, the **simulation**. - -This is how you build: - -- **Insert:** drag an element from the Elements onto the structure chart. On the placeholder **ø** it replaces it. On the top half of a box it goes before it, on the bottom half after it. A blue line shows you where it lands. -- **Change text:** double-click a box, or double-tap it on a tablet. Then you type right in the structure chart, **Enter** takes it. -- **Move:** drag a box to another place. -- **Delete:** click the box and press Delete, or click the [trash can](#zeige-loeschen). -- **Undo:** Ctrl+Z, on a Mac ⌘Z. - -> 🧩 **Prefer blocks like in Scratch?** Click [Blocks](#zeige-bloecke) in the tools. Then you see the same program as blocks that snap together. You type numbers right into the white fields and drag sensors in. **Structure chart** takes you back. It stays the same program, so you can switch at any time. - -::: übung vb-erster-plan -titel: Round the corner -auftrag: Build a structure chart: the mBot2 drives forward, turns right, drives forward, turns left and drives forward once more. Then start the simulation and watch. -fahrt: forward, turnRight, forward, turnLeft, forward -braucht: anweisung -tipp: Drag **drive forward** onto the placeholder ø. Drag each next command onto the bottom half of the last box. -tipp: From top to bottom: **drive forward**, **turn right**, **drive forward**, **turn left**, **drive forward**. -lösung: vb-erster-plan-loesung.visustruct -::: - -> When you are done, click **Check** in the exercise. VisuStruct then runs your structure chart and checks whether the mBot2 drives exactly as required. Later it often checks your program in several worlds, for example once with a wall and once without. If it doesn't work, the **hints** help you. - -## Saving and opening - -- **[Save](#zeige-speichern)** (Ctrl+S, on a Mac ⌘S): the structure chart is saved as a file ending in \`.visustruct\`. The [title](#zeige-titel) above the structure chart suggests the file name. -- **[Open](#zeige-oeffnen)** (Ctrl+O, on a Mac ⌘O): load a saved file again. - -In the column [📁 Files](#zeige-dateien) you set up a folder once, your **workspace**. All your programs and your learning progress go there. You can take the folder with you and carry on at home. - -> 📘 **More without the robot:** VisuStruct has the lessons ["What is a structure chart?"](?visustruct&lektion=01-was-ist-ein-struktogramm), ["The editor"](?visustruct&lektion=02-der-editor) and ["Save, open, export"](?visustruct&lektion=03-speichern-oeffnen-exportieren). They open in a new window. - -## Game: Which building block? - -::: spiel frage -titel: Game: Which building block? -intro: Ludwig describes what his mBot2 should do. Is it a sequence, a branch or a loop? Six rounds. -antworten: sequence | branch | loop - -runde: -frage: The mBot2 drives forward, turns right and drives forward again. -richtig: sequence -> Three steps one after another, each exactly once. - -runde: -frage: If the wall is close, it turns. Otherwise it drives forward. -richtig: branch -> Depending on the condition, one thing or the other happens. - -runde: -frage: It drives forward 10 cm four times. -richtig: loop -> The same step happens several times. - -runde: -frage: As long as no line comes, it keeps driving. -richtig: loop -> "As long as" means: again and again until the condition is no longer true. - -runde: -frage: If it is standing on red, it beeps. -richtig: branch -> It only beeps if the condition is true. - -runde: -frage: It shows "Hello" on the screen and then plays a tone. -richtig: sequence -> Two steps one after another, with no condition and no repetition. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what an algorithm and a structure chart are. → A plan for the robot -- I can recognise the three building blocks sequence, branch and repetition. → Three building blocks -- I can insert, move and delete elements in the editor. → The editor -- I can save a structure chart and open it again. → Saving and opening -::: - -## Quiz - -::: quiz -? What is an algorithm? -→ A plan for the robot -- [ ] a part of the mBot2 -- [x] an exact step-by-step instruction -- [ ] a programming language -> An algorithm says exactly what happens in which order. The structure chart draws it. -? Which building block decides depending on a condition? -→ Three building blocks -- [ ] the sequence -- [x] the branch -- [ ] the repetition -> The branch has a triangle and two columns for true and false. -? You drag **drive forward** onto the bottom half of a box. Where does it land? -→ The editor -- [ ] before it -- [x] after it -- [ ] it replaces the box -> Top half means before, bottom half means after. -? Which ending does a saved structure chart file have? -→ Saving and opening -- [ ] \`.java\` -- [x] \`.visustruct\` -- [ ] \`.png\` -> \`.png\` is a picture to pass on. You can only keep editing the \`.visustruct\` file. -::: -`,iz=`--- -titel: The mBot2 -bereich: Getting started -kurz: Get to know the robot you are about to program. ---- - -## Skills I will gain now - -::: kompetenzen -- name the parts of the mBot2 -- explain how the mBot2 measures distances -- explain how the mBot2 detects a line -- explain what sensors and actuators are -- control the mBot2 with elements from the group mBot2 commands -- let the mBot2 drive in the simulator -- connect the real mBot2 with USB-C and disconnect it again -- check that all sensors and actuators work -::: - -## Hello mBot2 - -::: mbot2 -focus: -spin: yes -::: - -The **mBot2** is a small robot made by Makeblock. In this lesson you take a tour through all its parts: - -- the [CyberPi]{part=cyberpi}, the small computer at the back on top -- the see-through [shield with battery]{part=shield} in the middle -- two [motors]{part=motors} with [wheels]{part=wheels} -- the [ultrasonic sensor]{part=ultrasonic} at the front, which looks like two eyes -- the [line sensor]{part=lineSensor} under the nose -- the turquoise [chassis]{part=chassis} that holds everything together - -In VisuBot you program it with structure charts. You can try every program in the simulator first, even without a real robot. - -> Move the mouse over a word underlined in yellow and the part lights up in the model. Tap the word and the camera flies there. You can rotate the model with the mouse or your finger and zoom with the mouse wheel. - -## The CyberPi - -::: mbot2 -focus: cyberpi, screen, joystick, buttons, leds, lightSensor, microphone -view: back -::: - -The [CyberPi]{part=cyberpi,screen,joystick,buttons,leds,lightSensor,microphone} is the brain of the mBot2: a **microcontroller**, a small computer without a keyboard. It runs your program. It lies crosswise at the back on top of the robot and can be taken off. - -A lot is already built in: - -- a colour [screen]{part=screen} that shows text and pictures -- a [joystick]{part=joystick} you can push in four directions -- two [buttons]{part=buttons}, one with a triangle and one with a square, and the Home button on the side next to the USB port -- five colourful [LEDs]{part=leds} as a light bar along the back -- a [light sensor]{part=lightSensor} and a [microphone]{part=microphone} - -There is also a speaker and a motion sensor that you cannot see from outside. The motion sensor notices when the CyberPi is tilted or turned. - -> The model was built from photos. Look at your own mBot2 and compare. - -## Screen, LEDs and speaker - -::: mbot2 -focus: screen, leds -view: back -::: - -With the [screen]{part=screen} and the five [LEDs]{part=leds} the mBot2 shows you what it is doing. Each LED can glow in almost any colour because it mixes red, green and blue. That is why they are called **RGB LEDs**. - -Later you make the LEDs glow red with \`mbot.setLed(255, 0, 0)\`. The three numbers are red, green and blue, each from 0 to 255. - -The [CyberPi]{part=cyberpi} also has a small **speaker**. With \`mbot.playTone(440, 300)\` it plays a tone: 440 vibrations per second (hertz), 300 milliseconds long. - -## Measuring light and sound - -::: mbot2 -focus: lightSensor, microphone -view: top -::: - -The [light sensor]{part=lightSensor} measures how bright it is. The [microphone]{part=microphone} measures how loud it is. For example, the mBot2 can start driving when you clap your hands. - -## Buttons and joystick - -::: mbot2 -focus: joystick, buttons -view: top -::: - -The [buttons]{part=buttons} A and B and the [joystick]{part=joystick} are sensors too: they notice when you press them. Your program can, for example, wait until you press A and only then start driving. With the joystick you steer the mBot2 like with a remote control. - -## The motion sensor - -::: mbot2 -focus: cyberpi -spin: yes -::: - -Inside the [CyberPi]{part=cyberpi} there is a sensor you cannot see: the **motion sensor** (a gyroscope with an accelerometer). It notices whether the mBot2 is tilted forward, backward or to the side, how far it has turned and whether someone shakes it. Your phone has such a sensor too: that is why the picture turns when you hold it sideways. - -## Power: the shield with battery - -::: mbot2 -focus: shield, powerSwitch -view: side -::: - -The big see-through case is the [mBot2 shield]{part=shield}. Through the lid you see the grey **battery** that powers the robot. At the back of the shield the cables of the motors (M1 and M2) and of the ultrasonic sensor are plugged in. - -On the left side is the [power switch]{part=powerSwitch} labelled ON/OFF. Next to it are two sockets S1 and S2 for small servo motors. Switch the mBot2 off when you do not need it, so the battery lasts longer. You charge it with the USB cable on the CyberPi. - -## Motors and wheels - -::: mbot2 -focus: motors, wheels -view: side -::: - -Two [motors]{part=motors} drive the two [wheels]{part=wheels}, each its own. You see them from below: silver motors in light blue gearboxes. - -- If both wheels turn forward at the same speed, the mBot2 drives **straight**. -- If one wheel turns forward and the other backward, it turns **on the spot**. - -The motors are **encoder motors**: they count how far the wheel has turned. That is how the mBot2 knows when it has driven exactly 10 cm or turned exactly 90°. - -## The ultrasonic sensor - -::: mbot2 -focus: ultrasonic -view: front -::: - -At the front sits the black [ultrasonic sensor]{part=ultrasonic}. It looks like two eyes but is more like an ear: one circle sends out a very high sound we cannot hear. The other waits for the echo. The longer the echo takes, the farther away the wall is. - -That is how the mBot2 measures distances in centimetres. The rings around the circles can also glow blue. - -::: angeberwissen -Bats do exactly what the ultrasonic sensor does: they call so high that we cannot hear it and listen for the echo. Sound travels about 343 metres per second. If a wall is one metre in front of the mBot2, the echo is back after just under 6 thousandths of a second. -::: - -## Under the robot - -::: mbot2 -focus: lineSensor, caster -view: bottom -::: - -Now you look from below. Right at the front the black board of the [line sensor]{part=lineSensor} sticks out. It has **four** small probes side by side. Each one shines light on the floor and measures how much comes back. A black line reflects little, a bright floor a lot. That is how the mBot2 knows whether it is on a line. - -The sensor is called a **quad RGB sensor** because it can do even more: it also recognises **colours**, for example a red or green field on the floor. - -The [ball caster]{part=caster} behind it is the third leg. It has no motor and simply rolls along in any direction. - -## The chassis - -::: mbot2 -focus: chassis -::: - -The [chassis]{part=chassis} is the turquoise aluminium frame. It holds all the parts together. At the front it has two round "ears", at the back a big **M** for Makeblock. The many holes are there on purpose: you can screw more parts onto them. - -## Sensors and actuators - -A robot has two kinds of parts: - -- **Sensors** measure something: the distance, a line, a colour, the brightness, the loudness, the tilt or whether a button is pressed. -- **Actuators** do something: the motors turn the wheels, the LEDs light up, the screen shows something, the speaker beeps. - -The word comes from the Latin *agere*, “to act”: actuators act, sensors (from *sentire*, “to feel”) feel. - -Your program reads the sensors and controls the actuators. You already know this as input, processing and output. - -## Find the parts - -Your turn: click the part you are looking for in the model. If you are right, the next question appears. - -::: mbot2quiz -- ultrasonic: What does the mBot2 use to measure how far away the wall is? -- screen: Where does text from your program appear? -- wheels: What moves the mBot2 forward? -- lineSensor: What detects a black line on the floor? (Hint: rotate the model.) -- powerSwitch: Where do you switch the mBot2 on and off? -- leds: What glows red with \`mbot.setLed(255, 0, 0)\`? -done: Great, you know your way around the mBot2! -::: - -## Commands for the mBot2 - -In VisuBot the [Elements](#zeige-elemente) have their own group **mBot2 commands**. Each box in it is a command for the robot: - -| Element | Text in the box | What happens | -|---|---|---| -| move forward | \`mbot.forward()\` | 10 cm forward | -| move back | \`mbot.backward()\` | 10 cm back | -| turn right | \`mbot.turnRight()\` | turn 90° to the right | -| turn left | \`mbot.turnLeft()\` | turn 90° to the left | -| LEDs on | \`mbot.setLed(255, 0, 0)\` | the LEDs light up red | - -You may also put a number in the brackets: \`mbot.forward(30)\` drives 30 cm, \`mbot.turnRight(45)\` turns only 45°. - -> The commands are real Java. \`mbot\` is the robot, and after the dot comes what it should do. - -## First drive - -After building, start the [simulation](#zeige-simulation). The VisuBot world with the mBot2 appears on the right. The grid on the floor has squares of 10 cm, exactly one **move forward**. - -::: übung vb-gerade -titel: Straight ahead -auftrag: Drag **move forward** into the structure chart five times. Then start the simulation and watch the mBot2 drive 50 cm straight ahead. -fahrt: 5 x (forward) -tipp: You find the group mBot2 commands below the normal elements. -tipp: Five boxes \`mbot.forward()\` one below the other. Each drives 10 cm. -lösung: vb-gerade-loesung.visustruct -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Then it drives the route for you. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - mbot.forward(60); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,0 -> Two fields forward, turn right, one more field. - -runde: - mbot.forward(30); - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,1 -> One field forward, then it faces left and drives two fields. - -runde: - mbot.turnRight(); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Turning right twice means it faces backwards. Then it drives one field down. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: .... | .... | .^.. -ziel: 2,2 -> Up, to the right, and after the second turn it faces down. -::: - -## Connecting the real mBot2 - -::: mbot2 -focus: cyberpi, powerSwitch, joystick, buttons -view: side -::: - -Everything you build in the simulator can also be driven by the real mBot2. This is how you connect it: - -1. Plug a **USB-C cable** into your computer (for example a MacBook) and the other end into the USB-C port on the right of the [CyberPi]{part=cyberpi}, next to the Home button. -2. Push the [ON/OFF slide switch]{part=powerSwitch} on the left of the shield to ON. The CyberPi's screen lights up. -3. A menu appears on the screen with **restart** highlighted (on a German CyberPi: „neu starten“). Press the [joystick]{part=joystick} down like a button to confirm it. -4. After the restart it says “Press B to start”. Press **button B**, that is the [button with the triangle]{part=buttons}. -5. Open VisuStruct in **Chrome** or **Edge**. Safari and the iPad cannot talk to USB devices. -6. As soon as the CyberPi has started up, click **🔌 mBot2** at the top (or “Connect mBot2” in the gear menu). -7. Chrome shows a list of ports. Choose the entry **USB Serial** (for example “USB Serial (cu.usbserial-110)”). It is often at the very bottom, so you may have to scroll down. Then click **Connect**. -8. The CyberPi restarts briefly (⏳). Then “Hallo VisuBot!” appears on its screen and the button shows 🟢. - -Now the mBot2 drives along with every step of the simulation. Put it on the floor and give it room! - -> Finished? Click **🟢 mBot2** once more. It stops, shows “Bis bald!” and releases the port. Only then pull out the cable. - -> Want to drive with no cable at all? You learn that in lesson 2 under **Driving without a cable**. - -## Testing the mBot2 - -When the mBot2 is connected, **🔧 Test the mBot2** appears below the world. Open it: - -- With the buttons you try each actuator once: LEDs, tone, text on the screen and the wheels. Lift the mBot2 up for this so it does not drive off the table. -- Below are all sensors with their values, and they update live. Hold your hand in front of the ultrasonic sensor, press button A, tilt it, clap your hands or put it on a red sheet of paper. - -If a value does not change although you do something, something is wrong. Then tell your teacher before you start programming. - -## Game: Sensor or actuator? - -::: spiel frage -titel: Game: sensor or actuator? -intro: Does the part measure something, or does it do something? Ten rounds. -antworten: Sensor | Actuator - -runde: -frage: The ultrasonic sensor measures how far away the wall is. -richtig: Sensor -> It measures something: the distance. - -runde: -frage: The motors turn the wheels. -richtig: Actuator -> They do something: they move the mBot2. - -runde: -frage: The LEDs glow red. -richtig: Actuator -> Glowing is doing something, not measuring. - -runde: -frage: The line sensor recognises the black tape. -richtig: Sensor -> It measures how much light comes back from the floor. - -runde: -frage: The speaker beeps. -richtig: Actuator -> It outputs a sound. - -runde: -frage: The microphone hears you clap. -richtig: Sensor -> It measures the loudness. - -runde: -frage: The screen shows “Hello VisuBot!”. -richtig: Actuator -> Showing something is an output. - -runde: -frage: Button A notices that you press it. -richtig: Sensor -> Buttons are sensors: they report whether they are pressed. - -runde: -frage: The motion sensor notices that the mBot2 is tilted. -richtig: Sensor -> It measures the tilt. - -runde: -frage: The rings on the ultrasonic sensor glow blue. -richtig: Actuator -> Tricky! The part is a sensor, but the glowing rings are an output. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the parts of the mBot2. → Hello mBot2 -- I can explain how the mBot2 measures distances. → The ultrasonic sensor -- I can explain how the mBot2 detects a line. → Under the robot -- I can explain what sensors and actuators are. → Sensors and actuators -- I can control the mBot2 with elements from the group mBot2 commands. → Commands for the mBot2 -- I can let the mBot2 drive in the simulator. → First drive -- I can connect the real mBot2 with USB-C and disconnect it again. → Connecting the real mBot2 -- I can check that all sensors and actuators work. → Testing the mBot2 -::: - -## Quiz - -::: quiz -? Match each part to its job. -→ Hello mBot2 -= Ultrasonic sensor -> measures the distance -= Motors -> move the wheels -= CyberPi -> runs the program -= Line sensor -> detects a dark line -? Which parts are actuators? -→ Sensors and actuators -- [x] Motors -- [ ] Ultrasonic sensor -- [x] LEDs -- [ ] Line sensor -> Actuators do something, sensors measure something. -? How does the ultrasonic sensor measure the distance? -→ The ultrasonic sensor -- [ ] It takes a photo of the wall. -- [x] It sends out a very high sound and waits for the echo. -- [ ] It feels the wall with its blue rings. -> The longer the echo takes, the further away the wall is. -? How does the line sensor detect a black line? -→ Under the robot -- [x] Little light comes back from the black line. -- [ ] The line is warmer than the floor. -- [ ] It hears the wheels rolling over the line. -> Each feeler shines light on the floor. A light floor reflects a lot of light, a black line only a little. -? What does \`mbot.turnRight()\` do? -→ Commands for the mBot2 -- [ ] The mBot2 drives 10 cm to the right. -- [x] The mBot2 turns 90° to the right. -- [ ] The right LED switches on. -> With no number in the brackets it turns 90°. \`mbot.turnRight(45)\` turns only 45°. -? The structure chart has five boxes \`mbot.forward()\` one below the other. How far does the mBot2 drive in the simulation? -→ First drive -- [ ] 5 cm -- [x] 50 cm -- [ ] 10 cm -> Each \`mbot.forward()\` drives 10 cm, which is one square of the grid. -? You have finished with the real mBot2. What do you do before you pull out the cable? -→ Connecting the real mBot2 -- [x] Click **🟢 mBot2** once more and wait until “Bis bald!” appears -- [ ] Push the slide switch to OFF -- [ ] Nothing, the cable can come out right away -> Only after “Bis bald!” is the port free. -? You hold your hand in front of the ultrasonic sensor, but the value under **🔧 Test the mBot2** does not change. What do you do? -→ Testing the mBot2 -- [ ] Start programming anyway -- [x] Tell your teacher before you start programming -- [ ] Change the value in the simulation by hand -> If a value does not change although you do something, something is wrong with the robot. -::: -`,az=`--- -titel: The square -bereich: Getting started -kurz: From a long structure chart to a triple nested loop. ---- - -## Skills I will gain now - -::: kompetenzen -- build a sequence without a loop first -- spot repetitions and replace them with a for loop -- nest two loops -- nest three loops -- upload my program to the mBot2 and start it with button A without a cable -::: - -## Driving a square - -The mBot2 should drive a square with sides of 50 cm. You already know one side: **move forward** five times. Then it turns right, and the next side begins. - -::: übung vb-quadrat -titel: The square -auftrag: Build a structure chart that makes the mBot2 drive a square: **move forward** five times, then **turn right**. And all of that four times. -fahrt: 4 x (5 x (forward), turnRight) -tipp: One side is five times move forward and once turn right. -tipp: That makes 24 boxes: four times five \`mbot.forward()\`, each followed by \`mbot.turnRight()\`. -lösung: vb-quadrat-loesung.visustruct -::: - -Quite a lot of boxes, right? If you miscount, the mBot2 no longer drives a square. - -## Always the same - -Look closely at your structure chart: five times **move forward** appears four times. When something repeats, you use a **loop**. We know exactly how often to drive, five times. The for loop fits that. - -Drag a for loop into the structure chart and give it these three parts: - -- Start: \`int i = 0\` -- Condition: \`i < 5\` -- Step: \`i++\` - -The body of the loop gets a single **move forward**. The loop counts \`i\` from 0 to 4, that is five runs. - -\`i\` is a **counter**. The computer uses it to remember which run it is in. Such a named store is called a **variable**; you will get to know it properly in lesson 3. The three parts mean: - -| Part | Meaning | -|---|---| -| \`int i = 0\` | The counter \`i\` is a whole number (\`int\`) and starts at 0. | -| \`i < 5\` | As long as \`i\` is less than 5, the loop runs once more. | -| \`i++\` | After every run \`i\` gets 1 bigger. | - -This is how the loop counts: - -| Run | 1 | 2 | 3 | 4 | 5 | after that | -|---|---|---|---|---|---|---| -| \`i\` | 0 | 1 | 2 | 3 | 4 | 5 | -| \`i < 5\`? | true | true | true | true | true | false, done | - -::: übung vb-quadrat-schleife -titel: Sides with a loop -auftrag: In your square, replace each row of five **move forward** with a for loop that drives five times. The mBot2 then drives exactly the same square. -fahrt: 4 x (5 x (forward), turnRight) -braucht: forSchleife -tipp: Start \`int i = 0\`, condition \`i < 5\`, step \`i++\`. The body only contains \`mbot.forward()\`. -tipp: Four times one below the other: the for loop and then \`mbot.turnRight()\`. -lösung: vb-quadrat-schleife-loesung.visustruct -::: - -## A loop in a loop - -Now the same pair appears four times: a for loop and **turn right**. That is a repetition too! Put both into a second for loop that runs four times. A loop inside a loop is called a **nested loop**. - -Each loop needs its own counter variable, otherwise the two get in each other's way. The usual way: the outer loop counts with \`i\`, the inner one with \`j\`. So rename your inner loop to \`j\`. - -::: übung vb-quadrat-verschachtelt -titel: Nested square -auftrag: Build the square with two nested for loops. The outer one runs four times, once for each side. The inner one runs five times, once for each step. -fahrt: 4 x (5 x (forward), turnRight) -schleifentiefe: 2 -tipp: Outside: start \`int i = 0\`, condition \`i < 4\`, step \`i++\`. Inside: \`int j = 0\`, \`j < 5\`, \`j++\`. -tipp: The outer loop contains the inner loop with \`mbot.forward()\` and below it \`mbot.turnRight()\`. -lösung: vb-quadrat-verschachtelt-loesung.visustruct -::: - -24 boxes have become four. Step through the program in the simulation with **Step** and watch the variables. - -::: quiz -? How often does the mBot2 run \`mbot.forward()\` in the nested square? -- [ ] 9 times -- [x] 20 times -- [ ] 5 times -> The inner loop runs five times, in each of the four runs of the outer loop: 4 · 5 = 20. -::: - -## Four squares - -Now it gets really nice: the mBot2 should drive four squares. After each square it turns right once. That makes a big window with a cross. - -You could copy your square four times and add a **turn right** after each square. Go ahead and try it! Notice something? Again the same thing appears four times. - -::: ludwig -Whenever you copy boxes, ask yourself: does something repeat here? Then a loop fits. -::: - -::: übung vb-vier-quadrate -titel: Four squares -auftrag: Let the mBot2 drive four squares. After each square it turns right once. Use three nested loops. -fahrt: 4 x (4 x (5 x (forward), turnRight), turnRight) -schleifentiefe: 3 -tipp: Put a third for loop that runs four times around your nested square. -tipp: Now \`i\` counts on the very outside (\`int i = 0\`, \`i < 4\`, \`i++\`). The loops inside are then called \`j\` and \`k\`. Inside the outer loop goes your square and then \`mbot.turnRight()\`. -lösung: vb-vier-quadrate-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lessons ["For loop"](?visustruct&lektion=13-for-schleife) and ["Nesting"](?visustruct&lektion=14-verschachteln). They open in a new window. - -::: quiz -? How often does the mBot2 drive 10 cm forward for the four squares? -→ Four squares -- [ ] 20 times -- [ ] 60 times -- [x] 80 times -> 4 squares · 4 sides · 5 steps = 80. Without loops that would be 80 boxes. -::: - -## Driving without a cable - -::: mbot2 -fokus: cyberpi, buttons -ansicht: oben -::: - -So far the mBot2 hangs on the cable while it drives. But you can also **upload your program to the mBot2**. Then it remembers it and drives all by itself, for example through a maze on the floor. - -1. Connect the mBot2 with the USB cable and switch it on, as in lesson 1. This only works in **Chrome** or **Edge**. -2. Open your program, for example the four squares. -3. Click **⬆ Upload** at the top and then **Upload now**. Choose **USB Serial** again. -4. Wait until it says “Done!”. The mBot2 restarts and shows **A = Start**. -5. Unplug the cable and put the mBot2 at the start. -6. Press **button A**, that is the [button with the square]{teil=buttons}. Now your program starts. - -The program stays saved, even when you switch the mBot2 off and on again. Only the next upload replaces it. - -> Afraid it drives off before you are ready? Don't worry: it always waits for button A. If you press A again while it drives, nothing happens. When it has finished, A starts the program again from the beginning. - -## Game: How often does it drive? - -::: spiel frage -titel: Game: How often does it drive? -intro: Count along without starting the simulation. How often does the mBot2 drive or turn? Six rounds. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(); - mbot.turnRight(); - } -frage: How often does the mBot2 drive forward? -- 3 times -- [x] 4 times -- 5 times -> \`i\` counts 0, 1, 2 and 3. That is four runs. - -runde: - for (int i = 1; i <= 4; i++) { - mbot.forward(); - } -frage: How often does the mBot2 drive forward? -- 3 times -- [x] 4 times -- 5 times -> This time \`i\` counts from 1 to 4 because of \`<=\`. That is four runs too. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: How often does the mBot2 drive forward? -- 8 times -- [x] 15 times -- 5 times -> The inner loop runs five times in each of the three outer runs: 3 · 5 = 15. - -runde: - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: How often does the mBot2 turn right? -- [x] 3 times -- 15 times -- 5 times -> \`mbot.turnRight()\` is in the outer loop, not in the inner one. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - } - mbot.turnRight(); -frage: Does the mBot2 drive a square? -- Yes, with 50 cm sides. -- [x] No, it drives 200 cm straight ahead and only turns at the end. -- Yes, but only half of one. -> \`mbot.turnRight()\` is below the loop. It only runs when the loop has finished. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 4; j++) { - mbot.forward(30); - mbot.turnRight(); - } - mbot.turnRight(); - } -frage: How many squares does the mBot2 drive? -- [x] 2 -- 4 -- 8 -> The inner loop drives one square. The outer loop repeats that twice. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should drive and tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(50); - mbot.turnRight(); - } -frage: Should drive a square with 50 cm sides. -fehler: 1 -besser: for (int i = 0; i < 4; i++) { -> A square has four sides. With \`i < 3\` it only drives three. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(180); - } -frage: Should drive a square with 50 cm sides. -fehler: 3 -besser: mbot.turnRight(); -> With 180° it turns round and just drives back and forth. A square needs 90°. - -runde: - for (int i = 0; i < 4; i++) { - for (int i = 0; i < 5; i++) { - mbot.forward(); - } - mbot.turnRight(); - } -frage: Should drive a square made of four times five steps. -fehler: 2 -besser: for (int j = 0; j < 5; j++) { -> The inner loop needs its own counter \`j\`. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnLeft(45); - } -frage: Should drive a square with 30 cm sides. -fehler: 3 -besser: mbot.turnLeft(); -> A square needs right angles, so 90°. Without a number it turns 90°. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Then it drives the route for you. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..... | ..^.. -ziel: 2,0 -> One field forward, three times. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 1,2 -> A whole square: it arrives exactly where it started. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: .... | .... | .^.. -ziel: 2,2 -> Only three sides: the fourth is missing, so it ends up to the right of the start. - -runde: - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 2; j++) { - mbot.forward(30); - } - mbot.turnRight(); - } -karte: .... | .... | .... | ^... -ziel: 2,1 -> The inner loop drives two fields, then it turns. All that twice: two fields up, two to the right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a sequence without a loop first. → Driving a square -- I can spot repetitions and replace them with a for loop. → Always the same -- I can nest two loops. → A loop in a loop -- I can nest three loops. → Four squares -- I can upload my program to the mBot2 and start it with button A without a cable. → Driving without a cable -::: - -## Quiz - -::: quiz -? Still without a loop, the mBot2 should drive one side of 50 cm and then turn. Which boxes do you need? -→ Driving a square -- [ ] one \`mbot.forward()\` and one \`mbot.turnRight()\` -- [x] five \`mbot.forward()\` and one \`mbot.turnRight()\` -- [ ] five \`mbot.turnRight()\` -> Each \`mbot.forward()\` drives 10 cm, five of them are 50 cm. -? A for loop has the start \`int i = 0\`, the condition \`i < 5\` and the step \`i++\`. How often does it run? -→ Always the same -- [ ] 4 times -- [x] 5 times -- [ ] 6 times -> \`i\` counts 0, 1, 2, 3, 4. That is five runs. -? Why is the counter of the inner loop called \`j\` and not \`i\` as well? -→ A loop in a loop -- [ ] Each letter may only appear once in a program. -- [x] Each loop needs its own counter, otherwise the two get in each other's way. -- [ ] \`j\` counts faster than \`i\`. -> If both counted with \`i\`, the inner loop would mix up the outer one. -? How often does the mBot2 run \`mbot.turnRight()\` for the four squares? -→ Four squares -- [ ] 4 times -- [ ] 16 times -- [x] 20 times -> In each square it turns four times, that is 4 · 4 = 16. After each square there is one more turn: 16 + 4 = 20. -? Your program has been transferred and the cable is out. How do you start it? -→ Driving without a cable -- [ ] with button B -- [x] with button A -- [ ] with **⬆ Transfer** -> After the transfer the mBot2 shows **A = Start** and waits for button A. -::: -`,sz=`--- -titel: Flowcharts and pseudocode -bereich: Getting started -kurz: Write the plan for the square as a flowchart and as pseudocode and compare them with the structure chart. ---- - -## Skills I will gain now - -::: kompetenzen -- read a flowchart for the mBot2 and build one myself -- read a plan written as pseudocode -- compare structure chart, flowchart and pseudocode -::: - -## Three ways to write down a plan - -You know the plan for the square as a **structure chart**: a loop that runs four times, with driving one side and turning right inside it. - -There are two more ways to write down the same plan. You will meet both often, in class and on the internet: - -- the **flowchart**, -- **pseudocode**, a plan made of text in plain language. - -You can't control the mBot2 with them directly. But with all three you can write down a plan before you build it as a structure chart or in Java. - -## The flowchart - -A flowchart is made of a few symbols connected by **arrows**: - -- **Oval:** start or end. -- **Rectangle:** a statement, for example *drive forward 50 cm*. -- **Diamond:** a question with two exits: **yes** and **no**. -- **Parallelogram:** an input or output, for example a text on the screen. -- **Arrow:** shows which step comes next. - -A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. As long as the answer in the diamond is **no**, it goes back and the steps run again. - -> Careful: in a flowchart an arrow may point anywhere, even all over the place. In big charts this quickly becomes confusing. This is called **spaghetti code**. It can't happen in a structure chart, because there are no arrows. - -## Exercise: The square as a flowchart - -The mBot2 drives one side, turns right and counts the side. After four sides it shows "Square done!" on the screen. - -::: pap -titel: Exercise: The square as a flowchart -auftrag: The places in the chart are empty. Put each element in its place. The shape of the place helps you. -start: Start -anweisung: Drive forward 50 cm -anweisung: Turn right -anweisung: Count the side -frage: 4 sides driven? | nein -> Drive forward 50 cm -ausgabe: Show “Square done!” -ende: End -erklärung: As long as four sides have not been driven yet, the arrow leads from the diamond back to “Drive forward 50 cm”. That is the loop. Showing a text on the screen is an output, so it sits in the parallelogram. -legende: ja -::: - -**Draw your own flowcharts:** With **VisuFlow** you can easily draw your own flowchart, for example for your robot's next drive. The symbols are ready in a bar: tapping one adds the next symbol and connects it with an arrow right away. You save your flowchart as a file and export it as an image or PDF, for example for your notebook or a presentation. [Open VisuFlow](https://visustruct.visucode.de/app/?visuflow) - -## Pseudocode - -**Pseudocode** is text that is laid out like a program but written in plain language. Fixed words like REPEAT, IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. The square looks like this: - -\`\`\` -REPEAT 4 times - drive forward 50 cm - turn right -END REPEAT -show "Square done!" -\`\`\` - -And this is the same plan in Java: - -\`\`\`java -for (int i = 0; i < 4; i++) { - mbot.forward(50); - mbot.turnRight(); -} -mbot.showText("Square done!"); -\`\`\` - -Pseudocode has **no fixed way of writing**. Some people write FOR i FROM 1 TO 4, others REPEAT 4 times. All that matters is that anyone can understand it without an explanation. You can't control the computer with it, for that you need Java. - -### Comparison - -- **Structure chart:** boxes inside each other, the loop is an upside-down L. You see the structure at a glance. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very clear, but big charts get confusing. -- **Pseudocode:** text with indentation, the loop sits between REPEAT and END REPEAT. Quick to write and already close to Java. - -::: angeberwissen -Baah, who invented flowcharts? A woman and her husband: **Lillian and Frank Gilbreth** presented their "process charts" in 1921, long before the first computer. They used them to draw work steps in factories so they could make them simpler. Lillian Gilbreth had a doctorate in psychology and in 1965 became the first woman elected to the American National Academy of Engineering. Programmers later took over the idea for their plans. -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Flowcharts and pseudocode"](?visustruct&lektion=01-weitere-darstellungen) with baking a cake as a flowchart and the GOTO command. It opens in a new window. - -## Game: Which way of drawing? - -::: spiel frage -titel: Game: Which way of drawing? -intro: Ludwig describes a plan for the mBot2 without saying how it is written down. Is it the structure chart, the flowchart or pseudocode? Six rounds. -antworten: structure chart | flowchart | pseudocode - -runde: -frage: "An arrow leads from the diamond back to 'Drive forward 50 cm'." -richtig: flowchart -> You recognise a loop in a flowchart by the arrow back up. - -runde: -frage: "The loop looks like an upside-down L, with drive forward and turn right inside." -richtig: structure chart -> The upside-down L is the loop in a structure chart. - -runde: -frage: "REPEAT 4 times, with two indented lines below." -richtig: pseudocode -> Fixed words and indentation: that is pseudocode. - -runde: -frage: "'Square done!' sits in a slanted box." -richtig: flowchart -> The slanted box is the parallelogram for input and output. - -runde: -frage: "There are no arrows. If you insert a box, everything below simply moves down." -richtig: structure chart -> Without arrows, no jump in a structure chart can point to the wrong place. - -runde: -frage: "Some write FOR i FROM 1 TO 4, others REPEAT 4 times. Both are right." -richtig: pseudocode -> Pseudocode has no fixed way of writing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can name the elements of a flowchart. → The flowchart -- I can build the square as a flowchart myself. → Exercise: The square as a flowchart -- I can read a plan written as pseudocode. → Pseudocode -- I can compare structure chart, flowchart and pseudocode. → Three ways to write down a plan -::: - -## Quiz - -::: quiz -? How do you recognise a loop in a flowchart? -→ The flowchart -- [ ] By an upside-down L -- [x] By an arrow that leads back up -- [ ] By the word REPEAT -> The upside-down L belongs to the structure chart, REPEAT to pseudocode. - -? Match each flowchart symbol to its meaning. -→ The flowchart -= Oval -> Start or end -= Rectangle -> Statement -= Diamond -> Question with yes and no -= Parallelogram -> Input or output -> "Drive forward 50 cm" is a statement, showing "Square done!" is an output. - -? In the square flowchart, the diamond says "4 sides driven?". Where does the arrow lead for **no**? -→ Exercise: The square as a flowchart -- [x] Back to "Drive forward 50 cm" -- [ ] To the end -- [ ] To showing "Square done!" -> With no, the square isn't finished yet, so the mBot2 drives the next side. - -? In pseudocode, what shows which lines belong to the loop? -→ Pseudocode -- [ ] An arrow -- [x] The indentation and the END REPEAT -- [ ] The colour -> Everything between REPEAT and END REPEAT is indented and repeated. - -? Can the mBot2 run pseudocode directly? -→ Three ways to write down a plan -- [ ] Yes, like Java -- [x] No, pseudocode is only a plan for people -> The mBot2 can run the structure chart or Java. Pseudocode helps with planning. -::: -`,rz=`--- -titel: Variables and output -bereich: Getting started -kurz: Store values in variables, drive the mBot2 with them and show results on the screen. ---- - -## Skills I will gain now - -::: kompetenzen -- create and use a variable -- read a short Java program and type it in the Code area -- tell the data types \`int\`, \`double\`, \`String\` and \`boolean\` apart -- drive a rectangle in Java with two variables -- show a result on the screen with \`mbot.showText\` -::: - -## A variable for the side - -With \`mbot.forward(30)\` the mBot2 drives 30 cm in one go. If you drive a square with it and no loop, the 30 appears four times in your program. To make the square bigger, you have to change it in four places. It is better to store the side length **once** and then use it everywhere. - -That is what **variables** are for. A variable is a box with a name that holds a value: - -\`\`\`java -int side = 30; -mbot.forward(side); -\`\`\` - -- \`int\` is the **data type**: a whole number. -- \`side\` is the **name**. You may choose it yourself. -- \`30\` is the **value**. The \`=\` puts it into the box. - -Wherever \`side\` appears afterwards, the computer uses its value. So \`mbot.forward(side)\` drives 30 cm. - -::: übung vb-variable-seite -titel: Square with a variable -auftrag: In one statement, create the variable \`int side = 30\`. After that the mBot2 drives a square: four times \`side\` centimetres forward and turn right. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: The first statement is \`int side = 30\`. Below it comes a for loop that runs four times. -tipp: Inside the loop are \`mbot.forward(side)\` and \`mbot.turnRight()\`. -lösung: vb-variable-seite-loesung.visustruct -::: - -> Now change only the 30 to 60 and start the simulation. The whole square becomes twice as big. - -## Which data types are there? - -Every variable has a data type. It decides which values fit inside: - -| Data type | What fits inside? | Example | -|---|---|---| -| \`int\` | whole numbers | \`int side = 30;\` | -| \`double\` | decimal numbers, written with a point | \`double wheelCircumference = 20.4;\` | -| \`String\` | text in quotation marks | \`String name = "Ludwig";\` | -| \`boolean\` | true or false | \`boolean wallNear = mbot.getDistance() < 20;\` | - -One wheel rotation takes the mBot2 about 20.4 cm, which is a decimal number. \`wallNear\` holds \`true\` if the wall is closer than 20 cm. You will meet the distance sensor in Lesson 4. - -You can also calculate with variables: \`int distance = 4 * side;\` works out the whole distance around the square. - -## This is what Java looks like - -So far you have dragged boxes. From now on you will also write some programs in **Java**. You already know the boxes, because their text is real Java already. To the right of the structure chart is the [Code](#zeige-codelive) area. It shows your structure chart as Java code, and whatever you type there turns into the structure chart straight away. - -The square with a variable looks like this in Java: - -\`\`\`java -int seite = 30; -for (int i = 0; i < 4; i++) { - mbot.forward(seite); - mbot.turnRight(); -} -\`\`\` - -- Every box is one line. Every statement ends with a **semicolon** \`;\`. -- The for loop is called \`for\`. Its three parts start, condition and step stand in round brackets, separated by \`;\`. -- Whatever the loop repeats stands in **curly brackets** \`{ }\`. Indent it so you can see at once what belongs to the loop. There is no semicolon after \`{\` and \`}\`. -- Upper and lower case matter: \`mbot.turnRight()\` works, \`mbot.turnright()\` doesn't. - -> How to solve a Java exercise: click **Open in editor**. The Code area opens on the right. Type your program there, watch the simulation and finally click **Check**. - -## Now in Java: rectangle - -A rectangle has two different sides. So you need two variables. - -::: übung vb-java-rechteck -titel: Rectangle with variables -code: java -auftrag: Write in Java: create \`int length = 60\` and \`int width = 30\`. The mBot2 drives a rectangle: length, turn right, width, turn right, and all that twice. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -braucht: forSchleife -tipp: Two variables at the top: \`int length = 60;\` and \`int width = 30;\`. Below them a for loop that runs twice. -tipp: Inside the loop: \`mbot.forward(length);\`, \`mbot.turnRight();\`, \`mbot.forward(width);\`, \`mbot.turnRight();\` -lösung: vb-java-rechteck-loesung.visustruct -::: - -## Result on the screen - -The mBot2 can do more than drive, it can also show you something. With \`mbot.showText(…)\` a text appears on the CyberPi's [screen]{teil=screen}. With \`+\` you join text and values: - -\`\`\`java -int side = 30; -int distance = 4 * side; -mbot.showText("Distance: " + distance + " cm"); -\`\`\` - -The screen then shows **Distance: 120 cm**. You will learn more about the screen in Lesson 18. - -::: übung vb-strecke-anzeigen -titel: How far does it drive? -code: java -auftrag: Create \`int length = 60\` and \`int width = 30\` and drive the rectangle as before. Then work out in a variable \`distance\` how far the mBot2 drove all the way round, and show **Distance: 180 cm** on the screen. -fahrt: 2 x (forward 60, turnRight, forward 30, turnRight) -befehle: showText "Distance: 180 cm" -braucht: forSchleife -tipp: All the way round is twice the length and twice the width: \`int distance = 2 * length + 2 * width;\` -tipp: After the loop: \`mbot.showText("Distance: " + distance + " cm");\` -lösung: vb-strecke-anzeigen-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Input and output"](?visustruct&lektion=06-eingabe-und-ausgabe). It opens in a new window. There you print results to the console with \`System.out.println\`. - -## Game: Which data type? - -::: spiel frage -titel: Game: Which data type? -intro: Ludwig has wiped out the data types. Which one fits the gap? Seven rounds. -antworten: int | double | String | boolean - -runde: - ___ side = 30; -frage: Which data type fits? -richtig: int -> 30 is a whole number. - -runde: - ___ wheelCircumference = 20.4; -frage: Which data type fits? -richtig: double -> 20.4 is a decimal number, written with a point in Java. - -runde: - ___ name = "Ludwig"; -frage: Which data type fits? -richtig: String -> Text in quotation marks is a \`String\`. - -runde: - ___ wallNear = mbot.getDistance() < 20; -frage: Which data type fits? -richtig: boolean -> A comparison is true or false, so \`boolean\`. - -runde: - ___ distance = mbot.getDistance(); -frage: Which data type fits? -richtig: int -> The distance sensor gives whole centimetres, for example 38. - -runde: - ___ greeting = "Hello " + "class"; -frage: Which data type fits? -richtig: String -> Two texts joined with \`+\` give a text again. - -runde: - ___ average = 120 / 5.0; -frage: Which data type fits? -richtig: double -> With \`5.0\`, Java calculates with decimal numbers. The result is 24.0. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Read the program and tap the field where the mBot2 is at the end. Watch the values in the variables. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - int side = 60; - mbot.forward(side); - mbot.turnRight(); - mbot.forward(side); -karte: ... | ... | ^.. -ziel: 2,0 -> \`side\` is 60, so two fields up and two to the right. - -runde: - int a = 30; - int b = a * 3; - mbot.forward(b); -karte: ... | ... | ... | ^.. -ziel: 0,0 -> \`b\` is 3 · 30 = 90 cm, so three fields. - -runde: - int distance = 30 * 2; - mbot.backward(distance); -karte: ..^.. | ..... | ..... -ziel: 2,2 -> \`backward\` drives in reverse: it faces up but drives 60 cm down. - -runde: - int side = 30; - for (int i = 0; i < 2; i++) { - mbot.forward(side); - mbot.turnRight(); - side = side + 30; - } -karte: .... | .... | .... | ^... -ziel: 2,2 -> First 30 cm up, then \`side\` grows to 60: two fields to the right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create and use a variable. → A variable for the side -- I can read a short Java program and type it in the Code area. → This is what Java looks like -- I can tell the data types \`int\`, \`double\`, \`String\` and \`boolean\` apart. → Which data types are there? -- I can drive a rectangle in Java with two variables. → Now in Java: rectangle -- I can show a result on the screen with \`mbot.showText\`. → Result on the screen -::: - -## Quiz - -::: quiz -? What does \`mbot.forward(side)\` drive if \`int side = 40;\` comes first? -→ A variable for the side -- [ ] 4 cm -- [x] 40 cm -- [ ] nothing, \`side\` is not a command -> Wherever \`side\` appears, Java uses the value 40. -? Which data type fits \`"Ludwig"\`? -→ Which data types are there? -- [ ] \`int\` -- [ ] \`double\` -- [x] \`String\` -> Text in quotation marks is a \`String\`. -? What does \`mbot.showText("Side: " + 30);\` show on the screen? -→ Result on the screen -- [x] Side: 30 -- [ ] "Side: " + 30 -- [ ] 30 -> The \`+\` joins the text and the number. -::: -`,oz=`--- -titel: Testing step by step -bereich: Getting started -kurz: Use the simulation and a desk check to find out what your program really does. ---- - -## Skills I will gain now - -::: kompetenzen -- control the simulation with Play, Step and Stop -- watch the variables in the simulation -- do a desk check with a table -- find and fix a mistake with the simulation -::: - -## Controlling the simulation - -With the [▶︎ Start simulation](#zeige-simulation) button on the right of the tools, VisuStruct runs your structogram. In the VisuBot world the mBot2 drives along. On the right, the **Controls** appear: - -- **Play** runs the program automatically, step by step. You set how fast under **Pause per step**. -- **Pause** stops for a moment. Then you carry on with Play or Step. -- **Step** runs exactly one box. That way you can watch calmly. -- **Stop** cancels and puts the mBot2 back at the start. - -During the simulation one box is highlighted. **Last step** shows what has just happened, **Variables** shows all variables with their values. - -::: diagramm vb-l03-wachsend-loesung.visustruct -Each side gets 10 cm longer. Open the diagram in the editor and go through it with **Step**. Watch \`side\` and \`i\`. -::: - -## The desk check - -In a **desk check** you play the computer yourself. You go through the structogram with pen and paper and write down the values of the variables after every step. For the diagram above the table looks like this: - -| Step | \`i\` | \`side\` | The mBot2 … | -|---|---|---|---| -| \`int side = 20\` | – | 20 | | -| \`mbot.forward(side)\` | 0 | 20 | drives 20 cm | -| \`mbot.turnRight()\` | 0 | 20 | turns right | -| \`side = side + 10\` | 0 | 30 | | -| \`mbot.forward(side)\` | 1 | 30 | drives 30 cm | -| … | … | … | … | - -Then compare your table with the simulation. Do the values under **Variables** match after every step? - -::: angeberwissen -"Computer" used to be a job: people who calculated with pen and paper. One of the best was Katherine Johnson at NASA. In 1962 the astronaut John Glenn only wanted to fly once she had checked the new IBM computer's orbit by hand: "If she says they're good, I'm ready to go." -::: - -## Finding mistakes with the simulation - -Ludwig wanted to build the spiral from above: 20 cm, 30 cm, 40 cm. But his mBot2 drives 30, 40 and 50 cm. The program runs without an error message, it just does the wrong thing. This kind of mistake is called a **logic error**. You find it best with **Step** and the variables. - -::: übung vb-spirale-falsch -titel: Fix the spiral -auftrag: "Open in editor" loads Ludwig's structogram. Go through it with **Step** and watch \`side\`. Find out why the first side is 30 cm long and fix it. The mBot2 should drive 20, 30 and 40 cm and turn right after each side. -start: vb-spirale-falsch-start.visustruct -fahrt: forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -braucht: forSchleife -tipp: Look at the value of \`side\` when \`mbot.forward(side)\` comes up. Is the order inside the loop right? -tipp: \`side = side + 10\` must come **after** \`mbot.forward(side)\` and \`mbot.turnRight()\`. Drag the box to the end of the loop. -lösung: vb-spirale-falsch-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Simulation and desk check"](?visustruct&lektion=07-simulation-und-schreibtischtest). It opens in a new window. - -## Game: Be the computer - -::: spiel frage -titel: Game: Be the computer -intro: Do the desk check in your head. What does the mBot2 do, and what values do the variables have? Five rounds. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side + 10; - } -frage: What value does \`side\` have after the loop? -- 40 -- [x] 50 -- 30 -> 20, then 30, 40 and after the third run 50. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side + 10; - } -frage: How far does the mBot2 drive the third time? -- [x] 40 cm -- 50 cm -- 30 cm -> It drives 20, 30 and 40 cm. The 50 only ends up in \`side\` afterwards. - -runde: - int side = 20; - for (int i = 0; i < 3; i++) { - side = side + 10; - mbot.forward(side); - } -frage: How far does the mBot2 drive the first time? -- 20 cm -- [x] 30 cm -- 10 cm -> \`side\` grows before driving. That was exactly Ludwig's logic error. - -runde: - int distance = 0; - for (int i = 0; i < 4; i++) { - mbot.forward(25); - distance = distance + 25; - } - mbot.showText("Distance: " + distance); -frage: What does the screen show at the end? -- Distance: 25 -- [x] Distance: 100 -- Distance: 0 -> 25 is added four times: 25, 50, 75, 100. - -runde: - int side = 10; - for (int i = 0; i < 3; i++) { - mbot.forward(side); - side = side * 2; - } -frage: How far does the mBot2 drive in total? -- 60 cm -- [x] 70 cm -- 80 cm -> It drives 10, 20 and 40 cm. Together that is 70 cm. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 6 1 SIMULATION: runs your program on the screen, even without a robot -- ↓ 1 10 SEQUENCE: steps that come one after another -- ↓ 3 4 STRUCTOGRAM: another name for a Nassi-Shneiderman diagram -- ↓ 3 6 DATATYPE: decides which values fit into a variable, e.g. int -- ↓ 1 8 ALGORITHM: exact step-by-step instructions -- → 9 3 LOOP: repeats steps, looks like a tilted L in the structure chart -- → 12 3 VARIABLE: a little box with a name that holds a value -- ↓ 4 1 DESKCHECK: you play the computer with pen and paper -lösung: 11 4, 9 4, 12 8, 6 9, 7 6 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can control the simulation with Play, Step and Stop. → Controlling the simulation -- I can watch the variables in the simulation. → Controlling the simulation -- I can do a desk check with a table. → The desk check -- I can find and fix a mistake with the simulation. → Finding mistakes with the simulation -::: - -## Quiz - -::: quiz -? Which button runs exactly one box? -→ Controlling the simulation -- [ ] Play -- [x] Step -- [ ] Stop -> With Step you go box by box. Play carries on by itself. -? How far does the mBot2 drive in the second pass of "Growing sides"? -→ The desk check -- [ ] 20 cm -- [x] 30 cm -- [ ] 40 cm -> After the first pass \`side\` has grown by 10, so it is 30. -? The program runs without a message, but the mBot2 drives the wrong way. What kind of mistake is it? -→ Finding mistakes with the simulation -- [ ] a typo -- [x] a logic error -- [ ] a fault in the robot -> The program does exactly what it says, just not what was meant. -::: -`,lz=`--- -titel: Reading sensors -bereich: Sensors and decisions -kurz: The mBot2 measures something, and your program decides. ---- - -## Skills I will gain now - -::: kompetenzen -- explain the difference between a command and a sensor -- build a sensor into a condition -::: - -## Commands and sensors - -So far you have only given the mBot2 **commands**: move forward, turn right. It carried them out without paying attention to its surroundings. - -Now the **sensors** join in. Among the [elements](#zeige-elemente) there is a group **mBot2 sensors** for them: - -| Sensor | Text | What you get | -|---|---|---| -| Distance | \`mbot.getDistance()\` | distance to the next wall in cm, e.g. \`38\` | -| Line | \`mbot.getLine()\` | \`0\` if everything under the line sensor is bright, otherwise a number greater than 0 | - -The mBot2 has even more sensors: colours, buttons and joystick, light, loudness and tilt. You get to know each of them in lessons 6 to 13, the motors in lesson 20 and the stopwatch and battery in lesson 21. - -A sensor is **not a box of its own**. It gives you a number, and with that number you build a **condition**: - -\`\`\`java -mbot.getDistance() < 20 -\`\`\` - -This means: "Is the wall closer than 20 cm?" The answer is true or false. - -> How to build it: first drag a **branch** into the structure chart. Then drag the sensor **Distance** onto the branch. The condition now says \`mbot.getDistance()\`. You add the comparison \`< 20\` yourself. - -## Wall ahead? - -The mBot2 should decide by itself: if there is a wall ahead, it turns right. If the way is free, it drives forward a bit. - -This exercise has **two worlds**: in one the wall is right in front of it, in the other there is plenty of space. Your program must do the right thing in both. - -::: übung vb-wand-vorn -titel: Wall ahead? -auftrag: Build a branch with the condition \`mbot.getDistance() < 20\`. If **true**, the mBot2 turns right; if **false**, it moves forward. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Drag a branch into the structure chart and then the sensor **Distance** onto the branch. Write \`< 20\` after it. -tipp: The true branch contains \`mbot.turnRight()\`, the false branch \`mbot.forward()\`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -In the [Code](#zeige-codelive) area you can also see your structure chart as Java. A branch is called **if** there, and the false branch **else**. The condition goes in round brackets, each branch in curly brackets: - -\`\`\`java -if (mbot.getDistance() < 20) { - mbot.turnRight(); -} else { - mbot.forward(); -} -\`\`\` - -> You don't have to type \`if\` yourself yet. There is more about it in the lesson on the ultrasonic sensor. - -## What does the sensor give you? - -A sensor gives you a **value**, just like a variable. When the mBot2 drives on, the value changes: the distance gets smaller as the wall comes closer. Only a **comparison** turns the value into a question with the answer \`true\` or \`false\`. - -| Condition | Question | Answer at a distance of 38 cm | -|---|---|---| -| \`mbot.getDistance() < 20\` | Is the wall closer than 20 cm? | \`false\` | -| \`mbot.getDistance() > 30\` | Is there more than 30 cm of space? | \`true\` | -| \`mbot.getLine() == 0\` | Is everything bright under the mBot2? | depends on the floor | - -You can compare with \`<\` (less than), \`>\` (greater than), \`<=\` (less than or equal), \`>=\` (greater than or equal), \`==\` (equal) and \`!=\` (not equal). - -> For "equal" you write **two** equals signs: \`==\`. A single \`=\` puts a value into a variable, which is something completely different. - -> 📘 **More without the robot:** VisuStruct has the lesson ["Branch"](?visustruct&lektion=08-verzweigung). It opens in a new window. - -::: übung vb-fehler-04-sensoren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Wall ahead?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-04-sensoren-start.visustruct -welt: wand-nah -> turnRight -welt: wand-frei -> forward -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.turnRight()\`. -lösung: vb-wand-vorn-loesung.visustruct -::: - -## Game: Command or sensor? - -::: spiel frage -titel: Game: Command or sensor? -intro: Does the line do something, or does it give a value? Eight rounds. -antworten: command | sensor - -runde: - mbot.forward(30) -frage: Command or sensor? -richtig: command -> It drives 30 cm. That is doing something. - -runde: - mbot.getDistance() -frage: Command or sensor? -richtig: sensor -> It gives the distance in cm, for example 38. - -runde: - mbot.turnRight() -frage: Command or sensor? -richtig: command -> Turning is doing something. - -runde: - mbot.getLine() -frage: Command or sensor? -richtig: sensor -> It gives 0 or a number greater than 0. - -runde: - mbot.playTone(440, 300) -frage: Command or sensor? -richtig: command -> A tone is an output. - -runde: - mbot.isButtonA() -frage: Command or sensor? -richtig: sensor -> It gives true or false: is button A pressed? - -runde: - mbot.showText("Hello") -frage: Command or sensor? -richtig: command -> Showing something is doing something. - -runde: - mbot.getBrightness() -frage: Command or sensor? -richtig: sensor -> It measures how bright it is, from 0 to 100. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain the difference between a command and a sensor. → Commands and sensors -- I can build a sensor into a condition. → Wall ahead? -::: - -## Quiz - -::: quiz -? The wall is 12 cm away. Is \`mbot.getDistance() < 20\` true or false? -→ Wall ahead? -- [x] true -- [ ] false -> 12 is less than 20, so the condition is true. -? The mBot2 is standing on a bright floor. What does \`mbot.getLine()\` give you? -→ Commands and sensors -- [x] 0 -- [ ] 15 -- [ ] the distance in cm -> 0 means: none of the four probes sees anything dark. -? Why is the sensor not a box of its own in the structure chart? -→ Wall ahead? -- [x] It does nothing, it only gives a value. You need that value in a condition. -- [ ] Because the mBot2 would get too slow otherwise. -- [ ] Because sensors only work in Java. -> Commands are statements. Sensors are values, just like a variable. -::: -`,uz=`--- -titel: Up to the wall -bereich: Sensors and decisions -kurz: The mBot2 measures the distance and stops in time. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the distance with \`mbot.getDistance()\` -- decide when to use a while loop instead of a for loop -- find a goal with the line sensor -::: - -## How far away is the wall? - -So far you told the mBot2 exactly how far to drive. Now it should notice by itself when to stop. - -That is what the ultrasonic sensor is for. \`mbot.getDistance()\` gives the distance to the next wall in centimetres, for example \`38\`. You can use it like a number: - -\`\`\`java -mbot.getDistance() > 15 -\`\`\` - -This is a **condition**: it is true as long as the wall is more than 15 cm away. - -> Start the [simulation](#zeige-simulation): below the world you always see the current distance. When the mBot2 gets closer to the wall, the number gets smaller. - -## Three worlds, one program - -This exercise has **three worlds**. In each one the wall is somewhere else, and the mBot2 should stop at the goal with the green flag every time, without bumping into it. - -A fixed number of **move forward** only works in one world. You need a loop that keeps driving as long as the condition is true: the **while loop**. - -::: übung vb-bis-wand -titel: Up to the wall -auftrag: The mBot2 should drive forward until the wall is at most 15 cm away. Your program must work in all three worlds. Above the simulation you choose which world you see. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Distance** onto the loop. Then only the comparison is missing. -tipp: A while loop with the condition \`mbot.getDistance() > 15\`, with \`mbot.forward()\` inside. -lösung: vb-bis-wand-loesung.visustruct -::: - -::: ludwig -A loop that checks a condition before it drives is like me at the feeding trough: first I check whether there is anything left, and only then do I keep eating. -::: - -## To the goal - -Now it is the second sensor's turn. The goal is a black square with a green flag. When the mBot2 drives onto it, its line sensor sees it: \`mbot.getLine()\` is then no longer \`0\`. - -::: übung vb-bis-ziel -titel: Drive to the goal -auftrag: The mBot2 should keep driving forward until it is on the goal. Again there are two worlds. -welt: ziel-kurz, ziel-lang -braucht: whileSchleife -tipp: The loop should run as long as the line sensor sees **nothing**. Drag the sensor **Line** onto the while loop. -tipp: The condition is \`mbot.getLine() == 0\`. Inside the loop is \`mbot.forward()\`. -lösung: vb-bis-ziel-loesung.visustruct -::: - -## What does the loop check? - -> 📘 **More without the robot:** VisuStruct has the lesson ["While loop"](?visustruct&lektion=11-while-schleife). It opens in a new window. - -::: übung vb-fehler-05-bis-zur-wand -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Up to the wall", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-bis-zur-wand-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.forward()\`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## Game: How often does it drive? - -::: spiel frage -titel: Game: How often does it drive? -intro: Each drive is 10 cm long. Work out how often the mBot2 drives forward before the loop stops. Six rounds. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 40 cm away. How often does it drive forward? -- 2 times -- [x] 3 times -- 4 times -> 40, 30 and 20 are greater than 15: three drives. At 10 the loop stops. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 15 cm away. How often does it drive forward? -- [x] not at all -- once -- 2 times -> 15 is not greater than 15. The condition is false right at the start. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall starts 50 cm away. Where does it stop? -- 15 cm from the wall -- [x] 10 cm from the wall -- 0 cm, it bumps into it -> 50, 40, 30, 20: four drives. Then the wall is 10 cm away and the loop stops. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } -frage: The mBot2 is already standing on the black goal. How often does it drive forward? -- [x] not at all -- once -- forever -> On black, \`mbot.getLine()\` is not 0. The condition is false straight away. - -runde: -frage: The mBot2 should drive forward exactly five times. Which loop fits best? -- [x] a for loop -- a while loop with \`mbot.getDistance()\` -- no loop at all -> The number is known in advance. That is what the for loop is for. - -runde: -frage: The mBot2 should drive until it almost touches the wall. Which loop fits? -- a for loop that runs ten times -- [x] a while loop with \`mbot.getDistance()\` -- no loop at all -> You don't know in advance how far away the wall is. The while loop checks on the way. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Grey is a wall. Tap the field where the mBot2 is at the end. Each field is 30 cm, and the sensor is at the front of the mBot2. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> It drives as long as more than 15 cm ahead are free. It stops right in front of the wall. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,1 -> However far away the wall is, the while loop stops it right in front of it. - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(60); -karte: ##### | ..... | ..... | ..... | ^.... -ziel: 2,2 -> With more than 45 cm it stops one field earlier, turns and drives two fields to the right. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,0 -> It drives until its line sensor sees black. Then it is standing on the black field. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the distance with \`mbot.getDistance()\`. → How far away is the wall? -- I can decide when to use a while loop instead of a for loop. → Three worlds, one program -- I can find a goal with the line sensor. → To the goal -::: - -## Quiz - -::: quiz -? The mBot2 is 40 cm in front of the wall. How often does it drive forward with \`while (mbot.getDistance() > 15) mbot.forward();\` if each move is 10 cm? -→ How far away is the wall? -- [ ] not at all -- [ ] once -- [x] until the wall is at most 15 cm away -- [ ] always exactly five times -> The while loop checks the condition before every move. When the wall is close enough, it stops. -? Why is a for loop with a fixed count not enough here? -→ Three worlds, one program -- [x] Because the wall is at a different distance in every world. -- [ ] Because a for loop must not contain statements. -- [ ] Because the mBot2 does not understand for loops. -> The for loop knows beforehand how often it runs. The while loop decides on the way. -::: -`,mz=`--- -titel: Drive first, then check -bereich: Sensors and decisions -kurz: The do-while loop always drives at least once and only checks afterwards. ---- - -## Skills I will gain now - -::: kompetenzen -- explain that the do-while loop checks its condition only after the body -- compare a while loop and a do-while loop -- write a do-while loop in Java -::: - -## Drive first, then check - -The while loop from Lesson 5 checks **first** and then drives. If the wall is already right in front of the mBot2, it does not drive off at all. It is a **pre-test loop**: the condition is at the top, in the head. - -The **do-while loop** is a **post-test loop**. The condition is at the bottom, in the foot of the box: - -1. Run the body once. -2. Check the condition. -3. If it is true, start again at 1. If it is false, carry on below the loop. - -That is why the body **always runs at least once**. When you click the loop, the word \`while\` is in front of the text field in the Object Inspector: the condition means "repeat as long as …". - -| Distance at the start | While loop | Do-while loop | -|---|---|---| -| 50 cm | drives until 15 cm | drives until 15 cm | -| 10 cm | does **not drive at all** | drives 10 cm **once** | - -::: übung vb-do-while -titel: At least one step -auftrag: Build a structogram with a do-while loop: the mBot2 drives forward as long as the distance is greater than 15 cm, but **at least once**. Then it plays a tone. -messwerte: getDistance=10 -> forward, tone -welt: wand-kurz -> tone -braucht: doUntilSchleife -tipp: Drag the **do-while loop** from the Elements into the structogram. **Drive forward** goes into the box, the condition \`mbot.getDistance() > 15\` into the foot. -tipp: Below the loop (not inside it) goes \`mbot.playTone(440, 300)\`. -lösung: vb-do-while-loesung.visustruct -::: - -> When checking, the wall is once only 10 cm in front of the mBot2. A while loop would not drive at all then. - -## Now in Java: counting steps - -In Java, \`do\` is at the top and \`while (…)\` with a semicolon at the bottom: - -\`\`\`java -do { - mbot.forward(); -} while (mbot.getDistance() > 15); -\`\`\` - -::: übung vb-java-schritte-zaehlen -titel: Count the steps -code: java -auftrag: Write in Java: create \`int steps = 0\`. In a do-while loop the mBot2 drives forward and counts \`steps\` up by one, as long as the distance is greater than 15 cm. Then the screen shows for example **Steps: 3**. -welt: wand-kurz -> screen "Steps: 3" -messwerte: getDistance=10 -> forward, screen "Steps: 1" -braucht: doUntilSchleife -tipp: \`do { mbot.forward(); steps = steps + 1; } while (mbot.getDistance() > 15);\` -tipp: After the loop \`mbot.showText("Steps: " + steps);\`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Do-while loop"](?visustruct&lektion=12-do-while-schleife). It opens in a new window. - -::: übung vb-fehler-05-erst-fahren-dann-pruefen -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Count the steps", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct -welt: wand-kurz -> screen "Steps: 3" -messwerte: getDistance=10 -> forward, screen "Steps: 1" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`mbot.showText("Steps: " + steps)\`. -lösung: vb-java-schritte-zaehlen-loesung.visustruct -::: - -## Game: Head or foot? - -::: spiel frage -titel: Game: Head or foot? -intro: While or do-while: how often does the mBot2 drive forward? Each drive is 10 cm long. Six rounds. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(); - } -frage: The wall is 10 cm in front of the mBot2. How often does it drive forward? -- [x] not at all -- once -- 2 times -> The while loop checks first. 10 is not greater than 15. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: The wall is 10 cm in front of the mBot2. How often does it drive forward? -- not at all -- [x] once -- 2 times -> The do-while loop drives first and checks afterwards. It always drives once. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: The wall is 40 cm in front of the mBot2. How often does it drive forward? -- 2 times -- [x] 3 times -- 4 times -> After the first drive it is 30 cm, then 20, then 10. At 10 it stops. Here both loops drive the same number of times. - -runde: - int steps = 0; - do { - mbot.forward(); - steps = steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + steps); -frage: The wall is 10 cm in front of the mBot2. What does the screen show? -- Steps: 0 -- [x] Steps: 1 -- Steps: 2 -> The body runs once, so \`steps\` counts up once. - -runde: -frage: Which loop is foot-controlled? -- the while loop -- [x] the do-while loop -- the for loop -> Its condition is at the bottom, in the foot. - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() > 15) -frage: Why doesn't this code run? -- \`do\` must be written with a capital letter. -- [x] The semicolon after \`while (…)\` is missing. -- The condition must be at the top. -> The do-while loop ends with \`} while (condition);\`. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - do { - mbot.forward(); - } while (mbot.getDistance() < 15); -frage: Should drive forward at least once, and keep going as long as the wall is more than 15 cm away. -fehler: 3 -besser: } while (mbot.getDistance() > 15); -> "More than 15 cm" means \`> 15\`. - -runde: - do - mbot.forward(); - } while (mbot.getDistance() > 15); -frage: Should drive forward at least once, and keep going as long as the wall is more than 15 cm away. -fehler: 1 -besser: do { -> The opening curly bracket after \`do\` is missing. - -runde: - int steps = 0; - do { - mbot.forward(); - steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + steps); -frage: Should count the steps and show them at the end. -fehler: 4 -besser: steps = steps + 1; -> \`steps + 1\` only calculates, it doesn't store anything. The result has to go back into \`steps\` with \`=\`. - -runde: - int steps = 0; - do { - mbot.forward(); - steps = steps + 1; - } while (mbot.getDistance() > 15); - mbot.showText("Steps: " + Steps); -frage: Should count the steps and show them at the end. -fehler: 6 -besser: mbot.showText("Steps: " + steps); -> Java tells capital and small letters apart. There is no \`Steps\`. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Grey is a wall. While or do-while: tap the field where the mBot2 is at the end. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getDistance() > 45) { - mbot.forward(30); - } -karte: ##### | ..... | ..^.. -ziel: 2,2 -> The wall is already close. The while loop checks first and doesn't set off at all. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 45); -karte: ##### | ..... | ..^.. -ziel: 2,1 -> The do-while loop drives once first and checks afterwards. One field further on it stops. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); - mbot.turnLeft(); - mbot.forward(30); -karte: ##### | ..... | ..^.. -ziel: 1,1 -> One field forward, then the wall is right in front. Then left and one more field. - -runde: - do { - mbot.forward(30); - } while (mbot.getDistance() > 15); -karte: ##### | ..... | ..... | ..... | ..^.. -ziel: 2,1 -> If the wall is far away, while and do-while drive the same distance: right up to the wall. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain that the do-while loop checks its condition only after the body. → Drive first, then check -- I can compare a while loop and a do-while loop. → Drive first, then check -- I can write a do-while loop in Java. → Now in Java: counting steps -::: - -## Quiz - -::: quiz -? Where is the condition of a do-while loop? -→ Drive first, then check -- [ ] at the top, in the head -- [x] at the bottom, in the foot -- [ ] nowhere -> Post-test means: first the body, then the condition. -? The wall is 10 cm in front of the mBot2. How often does \`do { mbot.forward(); } while (mbot.getDistance() > 15);\` drive? -→ Drive first, then check -- [ ] not at all -- [x] once -- [ ] until it bumps -> The body always runs at least once. After that the condition is false. -? What comes after \`while (…)\` at the end of a do-while loop in Java? -→ Now in Java: counting steps -- [x] a semicolon \`;\` -- [ ] a curly bracket \`{\` -- [ ] nothing -> \`} while (condition);\` ends with a semicolon. -::: -`,cz=`--- -titel: Counting and adding up -bereich: Sensors and decisions -kurz: Count along with a variable and add values together. ---- - -## Skills I will gain now - -::: kompetenzen -- create a counter variable and count it up in a loop -- build a sum in a loop -- show the result on the screen after the loop -::: - -## Counting along - -How many steps does the mBot2 drive to the wall? You don't know in advance, the world is different every time. So the mBot2 should **count along**. You need three boxes for that: - -1. **Before** the loop: \`int steps = 0\`. At the start nothing has been counted yet. -2. **Inside** the loop: \`steps = steps + 1\`. One more after every step. -3. **After** the loop: show the result, for example with \`mbot.showText("Steps: " + steps)\`. - -Read \`steps = steps + 1\` from right to left: take the old value of \`steps\`, add 1 and store the result in \`steps\` again. A variable like this is called a **counter variable**, or counter for short. - -> Careful: if \`int steps = 0\` is **inside** the loop, the counter starts again at 0 in every pass. Then the result is always 1. - -::: angeberwissen -Your phone counts your steps exactly like this: with every step it calculates \`steps = steps + 1\`. I prefer counting my blades of grass. I'm at 4 million. -::: - -::: übung vb-schritte-welt -titel: Steps to the wall -auftrag: Build a structure chart: the mBot2 drives forward as long as the distance is greater than 15. It counts its steps along the way. Then it shows, for example, **Steps: 3** on the screen. There are three worlds. -welt: wand-kurz -> screen "Steps: 3" -welt: wand-mittel -> screen "Steps: 7" -welt: wand-lang -> screen "Steps: 12" -braucht: whileSchleife -tipp: The first box is \`int steps = 0\`. Then comes the while loop with \`mbot.getDistance() > 15\`. -tipp: Inside the loop are **drive forward** and \`steps = steps + 1\`. After the loop is \`mbot.showText("Steps: " + steps)\`. -lösung: vb-schritte-welt-loesung.visustruct -::: - -## Adding up - -A counter always grows by 1. A **sum** grows by different values. The mBot2 drives a spiral: first 10 cm, then 20, then 30, then 40. How far has it driven in total? - -| Pass | \`side\` | \`total\` afterwards | -|---|---|---| -| before | 10 | 0 | -| 1 | 10 | 0 + 10 = 10 | -| 2 | 20 | 10 + 20 = 30 | -| 3 | 30 | 30 + 30 = 60 | -| 4 | 40 | 60 + 40 = 100 | - -The pattern is the same as for counting. Only instead of 1 you now add the value that comes in: \`total = total + side\`. - -## Now in Java: spiral with distance - -::: übung vb-java-spirale-strecke -titel: Spiral with distance -code: java -auftrag: Write in Java: create \`int side = 10\` and \`int total = 0\`. Four times: drive \`side\` cm forward, turn right, add \`side\` to \`total\`, make \`side\` 10 bigger. Then show **Distance: 100 cm** on the screen. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Distance: 100 cm" -braucht: forSchleife -tipp: The for loop has four lines: \`mbot.forward(side);\`, \`mbot.turnRight();\`, \`total = total + side;\` and \`side = side + 10;\`. -tipp: After the loop comes \`mbot.showText("Distance: " + total + " cm");\`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -::: übung vb-fehler-05-zaehlen-und-summieren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Spiral with distance", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-05-zaehlen-und-summieren-start.visustruct -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight -befehle: showText "Distance: 100 cm" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`total = total + side\`. -lösung: vb-java-spirale-strecke-loesung.visustruct -::: - -## Game: what is in the variable at the end? - -::: spiel frage -titel: Game: what is in the variable at the end? -intro: Ludwig has written small programs. Work them out in your head. Five rounds. - -runde: -frage: \`int z = 0\`, then three times \`z = z + 1\`. What is \`z\`? -- 1 -- [x] 3 -- 0 -> Each pass adds 1: 1, 2, 3. - -runde: -frage: \`int sum = 0\`, then \`sum = sum + 5\` and \`sum = sum + 7\`. What is \`sum\`? -- 7 -- [x] 12 -- 5 -> 0 + 5 = 5, then 5 + 7 = 12. - -runde: -frage: A loop runs four times. Inside it are \`int z = 0\` and \`z = z + 1\`. What is \`z\` at the end? -- 4 -- [x] 1 -- 0 -> The counter is set back to 0 in every pass. It belongs before the loop. - -runde: -frage: \`int total = 0\`. The mBot2 drives 20, 20 and 30 cm and adds each one. What is \`total\`? -- 30 -- 20 -- [x] 70 -> 20 + 20 + 30 = 70. - -runde: -frage: \`int steps = 10\`, then twice \`steps = steps + 1\`. What is \`steps\`? -- 2 -- [x] 12 -- 11 -> Here the counter starts at 10, not at 0. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a counter variable and count it up in a loop. → Counting along -- I can build a sum in a loop. → Adding up -- I can show the result on the screen after the loop. → Now in Java: spiral with distance -::: - -## Quiz - -::: quiz -? Where do you create the counter variable \`int steps = 0\`? -→ Counting along -- [x] Before the loop -- [ ] Inside the loop -- [ ] After the loop -> Inside the loop it would become 0 again in every pass. -? What does \`steps = steps + 1\` do? -→ Counting along -- [ ] It compares steps with steps + 1. -- [x] It takes the old value, adds 1 and stores the result. -- [ ] It sets steps to 1. -? How do you add the side length \`side\` to the sum \`total\`? -→ Adding up -- [ ] \`total = side\` -- [ ] \`side = total + side\` -- [x] \`total = total + side\` -::: -`,dz=`--- -titel: The ultrasonic sensor -bereich: Sensors and decisions -kurz: Measure the distance, keep your distance, and do it all in Java. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what \`mbot.getDistance()\` measures -- put one branch inside another -- write a while loop with the distance in Java -::: - -## How does the mBot2 measure distance? - -::: mbot2 -focus: ultrasonic -view: front -::: - -The [ultrasonic sensor]{part=ultrasonic} sends out a very high sound and waits for the echo. The longer the echo takes, the further away the wall is. \`mbot.getDistance()\` gives you the distance in **centimetres**, from about 3 to 300. - -| Sensor | Text | Value | -|---|---|---| -| Distance | \`mbot.getDistance()\` | whole number in cm, e.g. \`38\` | - -> In the [simulation](#zeige-simulation) the current distance is always shown below the world. With a real mBot2 you can hold your hand in front of the sensor and watch the number change. - -## Keep your distance in the structure chart - -The mBot2 should behave like a dog on a lead: if your hand is too close (under 10 cm), it backs away. If it is too far away (over 20 cm), it comes closer. In between, it stays where it is. - -For this you need two branches, one inside the other. The outer one checks “too close?”, the inner one in the false branch checks “too far?”. - -::: übung vb-abstand-halten -titel: Keep your distance -auftrag: Build a structure chart: if the distance is less than 10, the mBot2 drives back. Otherwise: if the distance is greater than 20, it drives forward. Otherwise it does nothing. -messwerte: getDistance=5 -> backward -messwerte: getDistance=35 -> forward -messwerte: getDistance=15 -> none -braucht: verzweigung -tipp: Drag a branch into the structure chart and the sensor **Distance** onto it. Write \`< 10\` after it. The true branch gets **move back**. -tipp: The false branch gets a second branch with \`mbot.getDistance() > 20\` and **move forward** in its true branch. Its false branch stays empty. -lösung: vb-abstand-halten-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance to 5, 35 and 15 cm one after the other and looks at what your mBot2 does. - -## Now in Java - -In the [Code](#zeige-codelive) area you already see your structure chart as Java code. A branch is called \`if\` there, the false branch is \`else\`: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.backward(); -} else { - ... -} -\`\`\` - -You type a sensor like a command: \`mbot.\` and then \`getDistance()\`. After the dot the editor suggests all commands and sensors. - -::: übung vb-java-wand-piep -titel: To the wall and beep -code: java -auftrag: Write in Java: the mBot2 drives forward as long as the wall is more than 15 cm away. Then it plays a tone. There are three worlds. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: A while loop in Java is \`while (condition) { … }\`. The condition is \`mbot.getDistance() > 15\`. -tipp: Inside the loop is \`mbot.forward();\`, after the loop \`mbot.playTone(440, 300);\`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -::: übung vb-fehler-06-abstand -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To the wall and beep", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-abstand-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be \`mbot.playTone(440, 300)\`. -lösung: vb-java-wand-piep-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should do and tap the wrong line before time runs out. Six rounds, 30 seconds each. -zeit: 30 - -runde: - if (mbot.getDistance() < 10) { - mbot.forward(); - } - if (mbot.getDistance() > 20) { - mbot.forward(); - } -frage: Under 10 cm it should drive back, over 20 cm forward. -fehler: 2 -besser: mbot.backward(); -> If the hand is too close, it has to go back, not forward. - -runde: - while (mbot.getDistance() < 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive forward as long as the wall is more than 15 cm away, then beep. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> "More than 15 cm away" means \`> 15\`. - -runde: - while (mbot.getDistance > 15) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive to the wall and then beep. -fehler: 1 -besser: while (mbot.getDistance() > 15) { -> A sensor is a method. Without brackets, Java can't find it. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } els { - mbot.forward(); - } -frage: Under 10 cm it should drive back, otherwise forward. -fehler: 3 -besser: } else { -> The false branch is called \`else\`. - -runde: - while (mbot.getDistance() > 15) { - mbot.turnRight(); - } - mbot.playTone(440, 300); -frage: Should drive to the wall and then beep. -fehler: 2 -besser: mbot.forward(); -> It should drive forward, not turn. - -runde: - if (mbot.getDistance() < 10) { - mbot.backward(); - } else { - if (mbot.getDistance() < 20) { - mbot.forward(); - } - } -frage: Under 10 cm back, over 20 cm forward, in between stand still. -fehler: 4 -besser: if (mbot.getDistance() > 20) { -> It should only drive forward if the hand is more than 20 cm away. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what \`mbot.getDistance()\` measures. → How does the mBot2 measure distance? -- I can put one branch inside another. → Keep your distance in the structure chart -- I can write a while loop with the distance in Java. → Now in Java -::: - -## Quiz - -::: quiz -? \`mbot.getDistance()\` gives \`8\`. What does the program from “Keep your distance” do? -→ Keep your distance in the structure chart -- [x] It drives back. -- [ ] It drives forward. -- [ ] It stays where it is. -> 8 is less than 10, so the first condition is already true. -? What is the false branch of a branch called in Java? -→ Now in Java -- [ ] \`then\` -- [x] \`else\` -- [ ] \`otherwise\` -> \`if\` is the start, \`else\` the false branch. -::: -`,hz=`--- -titel: Fixed values with final -bereich: Sensors and decisions -kurz: Create a constant so that an important number appears in only one place. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what a constant is -- create a constant in the structure chart and in Java -- use a constant in a condition and in a command -::: - -## One number in many places - -Ludwig has written a program for the hallway: the mBot2 drives up to 20 cm from the wall, turns around and drives up to 20 cm from the other wall. - -::: diagramm vb-l06k-ohne.visustruct -There and back. The number 20 appears in two places. -::: - -Now the mBot2 should stop at 30 cm instead. Ludwig has to find and change every 20. If he forgets one, the mBot2 stops once at 30 and once at 20 cm. In long programs this happens quickly. - -::: angeberwissen -Professionals call a number that just sits in the program a **magic number**. Magic, because nobody remembers what it means. The only magic I like is magic grass. -::: - -## Creating a constant - -A **constant** is better. It is a variable whose value stays the same once it is set. You create it once at the very top and after that you only use its name. - -| | Structure chart | Java | -|---|---|---| -| create | \`const int DISTANCE = 20\` | \`final int DISTANCE = 20;\` | -| use | \`mbot.getDistance() > DISTANCE\` | \`mbot.getDistance() > DISTANCE\` | - -In the structure chart you write \`const\` in front, in Java \`final\`. Both mean: this value does not change any more. Names of constants are written in **capital letters**, so you can spot them right away. - -::: diagramm vb-l06k-mit.visustruct -The same program with the constant DISTANCE. For 30 cm you only change the first line. -::: - -::: übung vb-konstante-wand -titel: Wall with a constant -auftrag: Create the constant \`DISTANCE\` with the value 20. The mBot2 drives forward as long as the distance is greater than \`DISTANCE\`. Then it plays a tone. There are three worlds. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: wand-lang -> tone -braucht: whileSchleife -tipp: The first box is a statement with \`const int DISTANCE = 20\`. Below it comes a while loop. -tipp: The loop condition is \`mbot.getDistance() > DISTANCE\`. Inside the loop is **drive forward**, after the loop **play tone**. -lösung: vb-konstante-wand-loesung.visustruct -::: - -## Now in Java: square with a constant - -A constant also fits into a command. With \`final int SIDE = 30;\`, \`mbot.forward(SIDE);\` drives exactly 30 cm. If the square should get bigger, you only change that one line. - -::: übung vb-java-konstante-seite -titel: Square with a constant -code: java -auftrag: Write in Java: create the constant \`SIDE\` with the value 30. Then use a for loop to drive a square with side length \`SIDE\`. -fahrt: 4 x (forward 30, turnRight) -braucht: forSchleife -tipp: The first line is \`final int SIDE = 30;\`. Then comes \`for (int i = 0; i < 4; i++) { … }\`. -tipp: Inside the loop are \`mbot.forward(SIDE);\` and \`mbot.turnRight();\`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -::: übung vb-fehler-06-konstanten-final -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Square with a constant", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-konstanten-final-start.visustruct -fahrt: 4 x (forward 30, turnRight) -tipp: The error message names an unknown variable. What is the constant called where it is created? Constants are written in capital letters. -tipp: It should be \`mbot.forward(SIDE)\`. -lösung: vb-java-konstante-seite-loesung.visustruct -::: - -## Game: constant or variable? - -::: spiel frage -titel: Game: constant or variable? -intro: Ludwig is sorting values. If the value stays the same in the whole program, it is a constant. If it changes, it is a variable. Six rounds. -frage: Constant or variable? -antworten: Constant | Variable - -runde: -frage: The number of corners of a square -richtig: Constant -> A square always has four corners. - -runde: -frage: The distance the ultrasonic sensor is measuring right now -richtig: Variable -> When the mBot2 drives, the distance changes all the time. - -runde: -frage: The minimum distance at which the mBot2 should always stop -richtig: Constant -> You set it once, for example \`final int DISTANCE = 20;\`. - -runde: -frage: The number of steps the mBot2 has already driven -richtig: Variable -> It grows by 1 after every step. - -runde: -frage: The pitch of the warning tone, always 440 Hz -richtig: Constant -> The warning tone always sounds the same. - -runde: -frage: The battery level in percent -richtig: Variable -> The battery slowly runs down while driving. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what a constant is. → Creating a constant -- I can create a constant in the structure chart and in Java. → Creating a constant -- I can use a constant in a condition and in a command. → Now in Java: square with a constant -::: - -## Quiz - -::: quiz -? What is a constant? -→ Creating a constant -- [ ] A variable that changes in every pass -- [x] A variable whose value stays the same once it is set -- [ ] A sensor that always measures the same value -> You set a constant once. After that you only use its name. -? How do you create the constant \`DISTANCE\` with the value 20 in Java? -→ Creating a constant -- [ ] \`const DISTANCE = 20;\` -- [x] \`final int DISTANCE = 20;\` -- [ ] \`int final = 20;\` -> In Java, \`final\` comes before the data type. In the structure chart you write \`const\`. -? Why is a constant better than the number 20 in many places? -→ Creating a constant -- [ ] Because the program drives faster -- [x] Because you only have to change the value in one place -- [ ] Because the sensor measures more precisely -::: -`,gz=`--- -titel: Near, medium or far? -bereich: Sensors and decisions -kurz: Build a branch with three cases and write it in Java with else if. ---- - -## Skills I will gain now - -::: kompetenzen -- build a branch with three cases -- read and write \`else if\` in Java -- check the conditions in the right order -::: - -## Three cases instead of two - -Many cars have a **parking aid**. If the wall is far away, everything is free. When it gets closer, it says: slow. When it is very close: stop! - -A branch has only two branches, yes and no. For three cases you put a second branch into the no branch of the first one: - -1. Is the distance less than 10? Then **Stop**. -2. Otherwise: is the distance less than 30? Then **Slow**. -3. Otherwise: **Free**. - -::: diagramm vb-l06n-einparkhilfe.visustruct -The parking aid. The second question is only asked if the answer to the first one was no. -::: - -Try it in the [simulation](#zeige-simulation): open the diagram in the editor and set the distance to 5, 20 and 50 cm. - -> 📘 **More without the robot:** VisuStruct has the lesson ["Branch"](?visustruct&lektion=08-verzweigung). It opens in a new window. - -## Speed by distance in the structure chart - -::: übung vb-tempo-abstand -titel: Speed by distance -auftrag: Build a structure chart with three cases: if the distance is less than 10, the mBot2 drives 5 cm backward. Otherwise: if the distance is less than 30, it drives 5 cm forward. Otherwise it drives 20 cm forward. -messwerte: getDistance=5 -> backward 5 -messwerte: getDistance=20 -> forward 5 -messwerte: getDistance=50 -> forward 20 -braucht: verzweigung -tipp: Build it like the parking aid: a branch with \`mbot.getDistance() < 10\` and in its no branch a second one with \`mbot.getDistance() < 30\`. -tipp: The commands are \`mbot.backward(5)\`, \`mbot.forward(5)\` and \`mbot.forward(20)\`. The last one goes into the no branch of the second branch. -lösung: vb-tempo-abstand-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance to 5, 20 and 50 cm one after the other. - -## Now in Java: else if - -Look at the [Code](#zeige-codelive) area. The branch inside the no branch looks like this: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} else { - if (mbot.getDistance() < 30) { - mbot.showText("Slow"); - } else { - mbot.showText("Free"); - } -} -\`\`\` - -In Java you may write this more briefly. The \`if\` moves right behind the \`else\`: - -\`\`\`java -if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} else if (mbot.getDistance() < 30) { - mbot.showText("Slow"); -} else { - mbot.showText("Free"); -} -\`\`\` - -Both mean exactly the same. With \`else if\` it is easier to read, though. You still always write the curly brackets \`{ }\`. - -::: übung vb-java-tageszeit -titel: Day or night? -code: java -auftrag: Write in Java with \`else if\`: if the brightness is less than 20, the mBot2 shows **Night**. Otherwise: if it is less than 60, it shows **Dusk**. Otherwise it shows **Day**. -messwerte: getBrightness=10 -> none, screen "Night" -messwerte: getBrightness=40 -> none, screen "Dusk" -messwerte: getBrightness=80 -> none, screen "Day" -braucht: verzweigung -tipp: You read the brightness with \`mbot.getBrightness()\`. The first condition is \`mbot.getBrightness() < 20\`. -tipp: \`if (…) { mbot.showText("Night"); } else if (mbot.getBrightness() < 60) { mbot.showText("Dusk"); } else { mbot.showText("Day"); }\` -lösung: vb-java-tageszeit-loesung.visustruct -::: - -::: übung vb-fehler-06-nah-mittel-weit -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Day or night?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-06-nah-mittel-weit-start.visustruct -messwerte: getBrightness=10 -> none, screen "Night" -messwerte: getBrightness=40 -> none, screen "Dusk" -messwerte: getBrightness=80 -> none, screen "Day" -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be \`mbot.showText("Night")\`. -lösung: vb-java-tageszeit-loesung.visustruct -::: - -## The order matters - -Ludwig rebuilt the parking aid and swapped the questions: - -\`\`\`java -if (mbot.getDistance() < 30) { - mbot.showText("Slow"); -} else if (mbot.getDistance() < 10) { - mbot.showText("Stop"); -} -\`\`\` - -At 5 cm his mBot2 shows **Slow** instead of **Stop**. That is because 5 is also less than 30. The first condition is already true, so the second one is never checked. **Stop** never appears. - -> Remember: with \`<\`, check the smallest value first, then the next bigger one. - -::: spiel frage -titel: Game: what does the parking aid show? -intro: Ludwig's parking aid from above: under 10 cm **Stop**, under 30 cm **Slow**, otherwise **Free**. What does it show? Six rounds. -frage: What does the parking aid show? -antworten: Stop | Slow | Free - -runde: -frage: The distance is **5 cm**. -richtig: Stop -> 5 is less than 10. The very first question is true. - -runde: -frage: The distance is **25 cm**. -richtig: Slow -> 25 is not less than 10, but it is less than 30. - -runde: -frage: The distance is **80 cm**. -richtig: Free -> Both questions are false, so the last no branch is left. - -runde: -frage: The distance is exactly **10 cm**. -richtig: Slow -> 10 is not less than 10. The first question is false, the second true. - -runde: -frage: The distance is exactly **30 cm**. -richtig: Free -> 30 is not less than 30. Both questions are false. - -runde: -frage: The distance is **9 cm**. -richtig: Stop -> 9 is less than 10. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a branch with three cases. → Three cases instead of two -- I can read and write \`else if\` in Java. → Now in Java: else if -- I can check the conditions in the right order. → The order matters -::: - -## Quiz - -::: quiz -? How many branches do you need in the structure chart for three cases? -→ Three cases instead of two -- [ ] One -- [x] Two, the second in the no branch of the first -- [ ] Three side by side -> Each branch splits into two. The second one splits the no branch again. -? What does \`else if\` mean in Java? -→ Now in Java: else if -- [x] Otherwise, check another condition -- [ ] Repeat the condition -- [ ] Check both conditions at the same time -> \`else if\` is the short way of writing an \`if\` inside the \`else\` branch. -? Ludwig checks \`< 30\` first and then \`< 10\`. What happens at 5 cm? -→ The order matters -- [ ] Stop appears. -- [x] Slow appears. -- [ ] Nothing appears. -> 5 is also less than 30. The second condition is no longer checked. -::: -`,pz=`--- -titel: The line sensor -bereich: Sensors and decisions -kurz: Detect dark lines on the floor and don't fall off the table. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the number from \`mbot.getLine()\` means -- drive up to a line -- count steps with a variable in Java -::: - -## Four probes under the nose - -::: mbot2 -focus: lineSensor -view: bottom -::: - -The [line sensor]{part=lineSensor} has four probes side by side. Each one shines light on the floor and measures how much comes back. Black swallows the light, white reflects it. - -| Sensor | Text | Value | -|---|---|---| -| Line | \`mbot.getLine()\` | \`0\` = all bright, greater than \`0\` = at least one probe sees black | - -To start with, this is all you need: **\`mbot.getLine() == 0\` means “no line”**, \`mbot.getLine() != 0\` means “line found”. - -::: angeberwissen -\`mbot.getLine()\` is really a binary number with four digits, one for each probe: \`1111\` (that is 15) means “all four see black”, \`0110\` (6) “only the middle two”. With that an mBot2 can even follow a line. -::: - -## Turn round at the edge in the structure chart - -Imagine a table with black tape along the edge. The mBot2 should drive forward until it sees the tape and then turn round so it doesn't fall off. - -::: übung vb-rand -titel: Turn round at the edge -auftrag: The mBot2 drives forward as long as \`mbot.getLine() == 0\`. Then it turns 180°. There are two worlds with different distances. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Line** onto it. Write \`== 0\` after it. **move forward** goes inside the loop. -tipp: After the loop (below it, not inside) is \`mbot.turnRight(180)\`. -lösung: vb-rand-loesung.visustruct -::: - -## Now in Java: there and back - -Now the mBot2 should drive exactly back to the start after turning round. To do that it counts with a **variable** how often it drove forward. - -\`\`\`java -int steps = 0; -while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; -} -\`\`\` - -::: übung vb-java-rand -titel: To the line and back -code: java -auftrag: Write in Java: the mBot2 drives to the line and counts its steps. Then it turns 180° and uses a for loop to drive the same number of steps back. -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -braucht: whileSchleife, forSchleife -tipp: After the while loop: \`mbot.turnRight(180);\` and then \`for (int i = 0; i < steps; i++) { … }\`. -tipp: The for loop only contains \`mbot.forward();\`. -lösung: vb-java-rand-loesung.visustruct -::: - -::: übung vb-fehler-07-linie -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To the line and back", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-07-linie-start.visustruct -welt: rand-1 -> forward 20, turnRight 180, forward 20 -welt: rand-2 -> forward 50, turnRight 180, forward 50 -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`steps = steps + 1\`. -lösung: vb-java-rand-loesung.visustruct -::: - -## Game: Line or no line? - -::: spiel frage -titel: Game: Line or no line? -intro: Where is the mBot2 standing, and is the condition true or false? Six rounds. -antworten: true | false - -runde: - mbot.getLine() == 0 -frage: The mBot2 is standing on white paper. Is the condition true? -richtig: true -> No sensor sees black, so \`mbot.getLine()\` gives 0. - -runde: - mbot.getLine() == 0 -frage: The two middle sensors are on the black tape. Is the condition true? -richtig: false -> Two sensors see black, so \`mbot.getLine()\` is greater than 0. - -runde: - mbot.getLine() != 0 -frage: Only the outer left sensor sees black. Is the condition true? -richtig: true -> One sensor is enough, then the value is no longer 0. - -runde: - mbot.getLine() != 0 -frage: The mBot2 is standing on a white floor. Is the condition true? -richtig: false -> On white the value is 0, and \`0 != 0\` is false. - -runde: - mbot.getLine() == 15 -frage: A cross line: all four sensors see black. Is the condition true? -richtig: true -> All four sensors give the binary number \`1111\`, which is 15. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; - } -frage: The line is 30 cm away, each drive is 10 cm long. Is \`steps == 3\` afterwards? -richtig: true -> After three drives it is on the line, and the loop stops. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getLine() != 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Should drive to the black edge and then turn round. -fehler: 1 -besser: while (mbot.getLine() == 0) { -> It should drive as long as there is **no** line, so \`== 0\`. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(); -frage: Should drive to the black edge and then turn round. -fehler: 4 -besser: mbot.turnRight(180); -> Turning round means 180°. Without a number it only turns 90°. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps - 1; - } -frage: Should drive to the line and count the steps. -fehler: 4 -besser: steps = steps + 1; -> Counting means adding one, not taking one away. - -runde: - int steps = "0"; - while (mbot.getLine() == 0) { - mbot.forward(); - steps = steps + 1; - } -frage: Should drive to the line and count the steps. -fehler: 1 -besser: int steps = 0; -> In quotation marks, the 0 is a text. Only a number fits into an \`int\`. -::: - -## Game: Where does the mBot2 end up? - -::: spiel fahrt -titel: Game: Where does the mBot2 end up? -intro: Black is tape. Tap the field where the mBot2 is at the end. Each field is 30 cm. Four rounds. -frage: On which field is the mBot2 at the end? - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ..=.. | ..... | ..... | ..^.. -ziel: 2,1 -> It drives until it is standing on the black field. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(30); - } - mbot.turnRight(180); - mbot.forward(60); -karte: ..=.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> To the edge, turn round and two fields back. - -runde: - int steps = 0; - while (mbot.getLine() == 0) { - mbot.forward(30); - steps = steps + 1; - } - mbot.turnRight(180); - for (int i = 0; i < steps; i++) { - mbot.forward(30); - } -karte: ..=.. | ..... | ..... | ..^.. -ziel: 2,3 -> It counts three steps to the line and drives exactly three back: at the start again. - -runde: - mbot.turnRight(); - while (mbot.getLine() == 0) { - mbot.forward(30); - } -karte: ..... | ^...= | ..... -ziel: 4,1 -> First turn right, then on to the black field on the far right. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the number from \`mbot.getLine()\` means. → Four probes under the nose -- I can drive up to a line. → Turn round at the edge in the structure chart -- I can count steps with a variable in Java. → Now in Java: there and back -::: - -## Quiz - -::: quiz -? The mBot2 is on white paper. What does \`mbot.getLine()\` give? -→ Four probes under the nose -- [x] 0 -- [ ] 15 -- [ ] 1 -> No probe sees black, so 0. -? Which condition means “line found”? -→ Turn round at the edge in the structure chart -- [ ] \`mbot.getLine() == 0\` -- [x] \`mbot.getLine() != 0\` -- [ ] \`mbot.getLine() < 0\` -> \`!=\` means “not equal”. -::: -`,fz=`--- -titel: And, or, not -bereich: Sensors and decisions -kurz: Check two sensors in one condition: and, or, not. ---- - -## Skills I will gain now - -::: kompetenzen -- combine two conditions with \`&&\` (and) -- combine two conditions with \`||\` (or) -- turn a condition around with \`!\` (not) -- write a combined condition in a Java loop -::: - -## Wall and line: and - -The mBot2 should only drive forward if the way ahead is clear **and** there is no line under it. Two sensors, one condition. In Java, **and** is written \`&&\`: - -\`\`\`java -mbot.getDistance() > 15 && mbot.getLine() == 0 -\`\`\` - -The whole condition is only true if **both** parts are true: - -| clear ahead? | no line? | clear \`&&\` no line | -|---|---|---| -| true | true | **true** | -| true | false | false | -| false | true | false | -| false | false | false | - -A table like this is called a **truth table**. - -::: übung vb-und -titel: Clear and no line -auftrag: Build a structogram with a branch: if the distance is greater than 15 **and** \`mbot.getLine() == 0\`, the mBot2 drives forward. Otherwise it does nothing. -messwerte: getDistance=50, getLine=0 -> forward -messwerte: getDistance=10, getLine=0 -> none -messwerte: getDistance=50, getLine=6 -> none -braucht: verzweigung -tipp: Drag the **distance** sensor onto the branch and write \`> 15\` after it. Then type \` && \` and the second part \`mbot.getLine() == 0\`. -tipp: The true branch contains **drive forward**, the false branch stays empty. -lösung: vb-und-loesung.visustruct -::: - -> When checking, VisuStruct sets the distance and the line to different values. Only if both fit may the mBot2 drive. - -## Button A or button B: or - -Now the mBot2 should beep when you press button A **or** button B. It is enough if one of them is pressed. In Java, **or** is written \`||\`. - -| Button A? | Button B? | A or B | -|---|---|---| -| true | true | **true** | -| true | false | **true** | -| false | true | **true** | -| false | false | false | - -::: übung vb-oder -titel: Button A or B -auftrag: Build a structogram: if button A **or** button B is pressed, the mBot2 plays a tone. Otherwise it does nothing. -messwerte: isButtonA=true, isButtonB=false -> tone -messwerte: isButtonA=false, isButtonB=true -> tone -messwerte: isButtonA=false, isButtonB=false -> noTone -braucht: verzweigung -tipp: The condition of the branch is \`mbot.isButtonA() || mbot.isButtonB()\`. -tipp: The true branch contains \`mbot.playTone(440, 300)\`, the false branch stays empty. -lösung: vb-oder-loesung.visustruct -::: - -## Not: the opposite - -Sometimes you want the opposite of a condition. That is what \`!\` is for, read as **not**. \`mbot.isButtonA()\` is true when button A is pressed. \`!mbot.isButtonA()\` is true when it is **not** pressed. - -\`\`\`java -while (!mbot.isButtonA()) { - mbot.pause(100); -} -mbot.forward(30); -\`\`\` - -The mBot2 waits as long as button A is not pressed. Then it drives off. - -## Now in Java: drive safely - -Now everything comes together. The mBot2 drives as long as the way is clear **and** no line comes. Whatever comes first, the wall or the edge: it stops and beeps. - -::: übung vb-java-sicher-fahren -titel: Drive safely -code: java -auftrag: Write in Java: the mBot2 drives forward as long as the distance is greater than 15 **and** \`mbot.getLine() == 0\`. Then it plays a tone. In two worlds a wall is waiting, in two worlds a black edge. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -braucht: whileSchleife -tipp: \`while (mbot.getDistance() > 15 && mbot.getLine() == 0) { … }\` -tipp: Inside the loop is \`mbot.forward();\`, after the loop \`mbot.playTone(440, 300);\`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Combining conditions"](?visustruct&lektion=09-bedingungen-verknuepfen). It opens in a new window. - -::: übung vb-fehler-07-und-oder -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Drive safely", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-07-und-oder-start.visustruct -welt: wand-kurz -> tone -welt: wand-mittel -> tone -welt: rand-1 -> forward 20, tone -welt: rand-2 -> forward 50, tone -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.playTone(440, 300)\`. -lösung: vb-java-sicher-fahren-loesung.visustruct -::: - -## Game: True or false? - -::: spiel frage -titel: Game: True or false? -intro: Ludwig puts the mBot2 into a situation. Is the condition true or false? Eight rounds. -antworten: true | false - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: The wall is 50 cm away, there is no line underneath. -richtig: true -> Both parts are true, so the whole thing is true. - -runde: - mbot.getDistance() > 15 && mbot.getLine() == 0 -frage: The wall is 10 cm away, there is no line underneath. -richtig: false -> With \`&&\`, both parts must be true. The distance part isn't. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: Only button B is pressed. -richtig: true -> With \`||\`, one true part is enough. - -runde: - mbot.isButtonA() || mbot.isButtonB() -frage: No button is pressed. -richtig: false -> Both parts are false, so \`||\` is false too. - -runde: - !mbot.isButtonA() -frage: Button A is pressed. -richtig: false -> \`mbot.isButtonA()\` is true, and the \`!\` turns it into false. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: The wall is 10 cm away, and it is standing on a line. -richtig: false -> No part is true, so \`||\` is false too. - -runde: - mbot.getDistance() > 15 || mbot.getLine() == 0 -frage: The wall is 50 cm away, and it is standing on a line. -richtig: true -> The first part is true, and that is enough for \`||\`. - -runde: - !mbot.isButtonA() && mbot.getDistance() > 15 -frage: Nobody is pressing a button, the wall is 30 cm away. -richtig: true -> A isn't pressed, so \`!mbot.isButtonA()\` is true. The distance part is true as well. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getDistance() > 15 || mbot.getLine() == 0) { - mbot.forward(); - } - mbot.playTone(440, 300); -frage: Should drive as long as the way ahead is clear **and** no line comes. -fehler: 1 -besser: while (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> With \`||\` it keeps going if only one part is true, for example over the edge. - -runde: - if (mbot.isButtonA() && mbot.isButtonB()) { - mbot.playTone(440, 300); - } -frage: Should beep when button A **or** button B is pressed. -fehler: 1 -besser: if (mbot.isButtonA() || mbot.isButtonB()) { -> "Or" is \`||\` in Java. With \`&&\` it only beeps when both are pressed. - -runde: - while (mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Should wait until button A is pressed and then set off. -fehler: 1 -besser: while (!mbot.isButtonA()) { -> Waiting means: loop as long as A is **not** pressed. The \`!\` is missing. - -runde: - if (mbot.getDistance() > 15 & mbot.getLine() == 0) { - mbot.forward(); - } -frage: Should drive forward if the way ahead is clear and there is no line. -fehler: 1 -besser: if (mbot.getDistance() > 15 && mbot.getLine() == 0) { -> "And" is written with two characters: \`&&\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can combine two conditions with \`&&\` (and). → Wall and line: and -- I can combine two conditions with \`||\` (or). → Button A or button B: or -- I can turn a condition around with \`!\` (not). → Not: the opposite -- I can write a combined condition in a Java loop. → Now in Java: drive safely -::: - -## Quiz - -::: quiz -? The distance is 50 and \`mbot.getLine()\` gives 6. Does the mBot2 drive in "Clear and no line"? -→ Wall and line: and -- [ ] Yes, the way ahead is clear. -- [x] No, because with \`&&\` both parts must be true. -- [ ] Only half as far. -> It is standing on a line. So one part is false, and so is the whole condition. -? Only button B is pressed. Is \`mbot.isButtonA() || mbot.isButtonB()\` true? -→ Button A or button B: or -- [x] Yes -- [ ] No -> With \`||\` it is enough if one part is true. -? Button A is pressed. What is \`!mbot.isButtonA()\`? -→ Not: the opposite -- [ ] true -- [x] false -> \`!\` turns the value around: true becomes false. -? Which condition stops the mBot2 at the wall **and** at the edge? -→ Now in Java: drive safely -- [x] \`while (mbot.getDistance() > 15 && mbot.getLine() == 0)\` -- [ ] \`while (mbot.getDistance() > 15 || mbot.getLine() == 0)\` -- [ ] \`while (mbot.getDistance() > 15)\` -> With \`||\` it would keep driving as long as just one part is true, for example over the edge. -::: -`,bz=`--- -titel: Recognising colours -bereich: Sensors and decisions -kurz: The quad RGB sensor tells you which colour the mBot2 is standing on. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for a colour with \`mbot.getColor().equals(…)\` -- turn a condition round with \`!\` -- put a branch inside a loop -::: - -## A sensor that sees colours - -::: mbot2 -focus: lineSensor -view: bottom -::: - -The [line sensor]{part=lineSensor} is really called a **quad RGB sensor**. “Quad” means four (four probes), “RGB” stands for red, green and blue. It shines these three colours on the floor and measures which colour comes back. That is how it recognises coloured fields. - -\`mbot.getColor()\` gives the name of the colour under the mBot2, as **text**: - -| Floor | \`mbot.getColor()\` | -|---|---| -| red field | \`"red"\` | -| green field | \`"green"\` | -| blue field | \`"blue"\` | -| yellow field | \`"yellow"\` | -| black field or line | \`"black"\` | -| light floor | \`"white"\` | - -You ask whether it is a certain colour with \`.equals(…)\`: \`mbot.getColor().equals("red")\` is **true** when the mBot2 stands on red, otherwise **false**. So it is already a complete condition. - -> In Java you always compare texts with \`.equals(…)\`, **not** with \`==\`. The \`==\` looks right but often doesn't work with texts. - -> With a \`!\` in front you turn a condition round: \`!mbot.getColor().equals("red")\` means “**not** red”. - -## Drive to red in the structure chart - -::: übung vb-bis-rot -titel: Drive to red -auftrag: The mBot2 drives forward as long as it is **not** on a red field. In the second world there is a green field first, which should not bother it. -welt: farbe-1 -> forward 20 -welt: farbe-2 -> forward 50 -braucht: whileSchleife -tipp: Drag a while loop into the structure chart and the sensor **Colour is red?** onto it. Write a \`!\` in front of \`mbot.getColor().equals("red")\`. -tipp: The condition is \`!mbot.getColor().equals("red")\`, inside the loop is **move forward**. -lösung: vb-bis-rot-loesung.visustruct -::: - -## Now in Java: beep on green - -Now you combine a loop with a branch: the mBot2 drives to blue. If it passes over a green field on the way, it beeps. - -::: übung vb-java-blau-gruen -titel: To blue, beep on green -code: java -auftrag: Write in Java: the mBot2 drives forward as long as it is not on blue. After each step it checks: if it is on green, it plays a tone. In the second world there is no green field, so it must not beep there. -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -braucht: whileSchleife, verzweigung -tipp: Outside is \`while (!mbot.getColor().equals("blue")) { … }\`. Inside, first \`mbot.forward();\`. -tipp: After that, still inside the loop: \`if (mbot.getColor().equals("green")) { mbot.playTone(880, 200); }\`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -::: übung vb-fehler-08-farben -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "To blue, beep on green", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-08-farben-start.visustruct -welt: farbe-3 -> forward 30, tone -welt: farbe-4 -> forward 30, noTone -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be \`equals("green")\`. -lösung: vb-java-blau-gruen-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should do and tap the wrong line before time runs out. Five rounds, 30 seconds each. -zeit: 30 - -runde: - while (mbot.getColor().equals("red")) { - mbot.forward(); - } -frage: Should drive forward until it is standing on red. -fehler: 1 -besser: while (!mbot.getColor().equals("red")) { -> It should drive as long as it is **not** on red. The \`!\` is missing. - -runde: - if (mbot.getColor() == "green") { - mbot.playTone(440, 300); - } -frage: Should beep when it is standing on green. -fehler: 1 -besser: if (mbot.getColor().equals("green")) { -> You compare texts with \`.equals(…)\`, not with \`==\`. - -runde: - while (!mbot.getColor().equals("blue")) { - mbot.forward(); - if (mbot.getColor().equals("green")) { - mbot.turnRight(); - } - } -frage: Should drive to blue and beep on green. -fehler: 4 -besser: mbot.playTone(440, 300); -> On green it should beep, not turn. - -runde: - if (mbot.getColor().equals(red)) { - mbot.turnRight(); - } -frage: Should turn right on red. -fehler: 1 -besser: if (mbot.getColor().equals("red")) { -> Without quotation marks, Java looks for a variable called \`red\`. The colour name is a text. - -runde: - while (!mbot.getColor().equals("red")) { - mbot.forward(); - } - mbot.playTone(440, 300) -frage: Should drive to red and then beep. -fehler: 4 -besser: mbot.playTone(440, 300); -> The semicolon at the end of the statement is missing. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for a colour with \`mbot.getColor().equals(…)\`. → A sensor that sees colours -- I can turn a condition round with \`!\`. → Drive to red in the structure chart -- I can put a branch inside a loop. → Now in Java: beep on green -::: - -## Quiz - -::: quiz -? The mBot2 is on a red field. What is \`!mbot.getColor().equals("red")\`? -→ Drive to red in the structure chart -- [ ] true -- [x] false -> \`mbot.getColor().equals("red")\` is true, the \`!\` turns it into false. So the loop stops. -? How do you compare the colour with \`"green"\`? -→ A sensor that sees colours -- [x] \`mbot.getColor().equals("green")\` -- [ ] \`mbot.getColor() == "green"\` -- [ ] \`mbot.getColor() = "green"\` -> \`mbot.getColor()\` gives a text, and texts are compared with \`.equals(…)\`. A single \`=\` is an assignment, not a comparison at all. -::: -`,xz=`--- -titel: The biggest value -bereich: Sensors and decisions -kurz: Measure all around and remember the biggest value: where is the most space? ---- - -## Skills I will gain now - -::: kompetenzen -- remember the biggest value so far in a variable -- compare every new reading with the biggest so far in a loop -- find out with the mBot2 in which direction there is the most space -::: - -## Remembering the record - -In the long jump there is a board showing the **record**. After every jump the referee checks: is the new jump longer than the record? Then it goes on the board. Otherwise the old record stays. - -A program finds the biggest value in exactly the same way. The board is a variable \`max\`: - -1. **Before** the loop: \`int max = 0\`. Nothing is on the board yet. -2. **Inside** the loop: is the new value bigger than \`max\`? Then \`max = value\`. -3. **After** the loop, \`max\` holds the biggest value. - -The mBot2 turns four times and measures the distance each time. This is how it looks in a desk check: - -| Direction | measured | bigger than \`max\`? | \`max\` afterwards | -|---|---|---|---| -| before | | | 0 | -| ahead | 16 | yes | 16 | -| right | 36 | yes | 36 | -| behind | 6 | no | 36 | -| left | 26 | no | 36 | - -> Important: the branch only has a yes branch. If the value is not bigger, nothing happens. The old record stays. - -## Where is the most space? - -::: übung vb-meister-platz -titel: Where is the most space? -auftrag: Build a structure chart: create \`int max = 0\`. The mBot2 measures the distance four times and turns right after each one. If a distance is bigger than \`max\`, it remembers it in \`max\`. At the end it shows, for example, **Farthest: 36 cm**. There are two worlds. -welt: platz-1 -> screen "Farthest: 36 cm" -welt: platz-2 -> screen "Farthest: 46 cm" -braucht: forSchleife, verzweigung -tipp: The for loop runs four times. It contains three boxes: \`int distance = mbot.getDistance()\`, a branch and **turn right**. -tipp: The branch checks \`distance > max\`. The yes branch has \`max = distance\`, the no branch stays empty. After the loop: \`mbot.showText("Farthest: " + max + " cm")\`. -lösung: vb-meister-platz-loesung.visustruct -::: - -::: angeberwissen -Many robot vacuums have a small tower with a laser on top. It spins and measures the distances all around. That way the robot draws a map of the home. Nobody measures anything at my place. I just eat my way through. -::: - -## Now in Java: remembering the direction - -Now the mBot2 knows **how much** space there is at most. But **where**? For that it also remembers the direction in a second variable. The counter variable \`i\` tells you which measurement it was: 0 is ahead, 1 is right, 2 is behind and 3 is left. - -\`\`\`java -if (distance > max) { - max = distance; - direction = i; -} -\`\`\` - -Both lines are in the yes branch. The direction only changes when there is a new record. - -::: übung vb-java-richtung -titel: Remembering the direction -code: java -auftrag: Write "Where is the most space?" in Java. Also remember in \`int direction = 0\` the number of the measurement with the biggest distance. At the end show, for example, **Direction: 1**. -welt: platz-1 -> screen "Direction: 1" -welt: platz-2 -> screen "Direction: 0" -braucht: forSchleife, verzweigung -tipp: Before the loop are \`int max = 0;\` and \`int direction = 0;\`. Inside the loop: \`int distance = mbot.getDistance();\`, the branch and \`mbot.turnRight();\`. -tipp: The yes branch has \`max = distance;\` and \`direction = i;\`. After the loop: \`mbot.showText("Direction: " + direction);\` -lösung: vb-java-richtung-loesung.visustruct -::: - -::: übung vb-fehler-08-groesster-wert -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Remembering the direction", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-08-groesster-wert-start.visustruct -welt: platz-1 -> screen "Direction: 1" -welt: platz-2 -> screen "Direction: 0" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`direction = i\`. -lösung: vb-java-richtung-loesung.visustruct -::: - -## Game: new record? - -::: spiel frage -titel: Game: new record? -intro: The mBot2 measures several distances one after the other. What is in \`max\` at the end? Five rounds. - -runde: -frage: Measured: 20, 50, 30 -- 30 -- [x] 50 -- 100 -> 50 is the biggest value. The 30 after it is not a new record. - -runde: -frage: Measured: 10, 20, 30, 40 -- 10 -- [x] 40 -- 100 -> Every value is a new record. At the end the last one is there. - -runde: -frage: Measured: 90, 10, 20, 30 -- 30 -- [x] 90 -- 10 -> The record comes right at the start. After that no value is bigger. - -runde: -frage: Measured: 15, 15, 15 -- 45 -- 0 -- [x] 15 -> 15 is not bigger than 15. \`max\` stays 15. - -runde: -frage: Measured: 25, 60, 60, 5. In which direction (\`i\`) is the record? -- 0 -- [x] 1 -- 2 -> At \`i = 1\` the 60 comes. The second 60 is not **bigger**, so \`direction\` stays at 1. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can remember the biggest value so far in a variable. → Remembering the record -- I can compare every new reading with the biggest so far in a loop. → Where is the most space? -- I can find out with the mBot2 in which direction there is the most space. → Now in Java: remembering the direction -::: - -## Quiz - -::: quiz -? What does \`max\` start with before the loop? -→ Remembering the record -- [x] With 0, because nothing has been measured yet -- [ ] With the biggest value -- [ ] With 100 -> Every distance is bigger than 0, so the very first reading becomes the record. -? What is in the no branch of the branch \`distance > max\`? -→ Remembering the record -- [ ] \`max = 0\` -- [ ] \`max = distance\` -- [x] Nothing, the old record stays. -? When does \`direction\` change? -→ Now in Java: remembering the direction -- [ ] In every pass -- [x] Only when there is a new record -- [ ] Only in the last round -::: -`,vz=`--- -titel: Case selection with colours -bereich: Sensors and decisions -kurz: Do something different for each colour or line, with one case selection instead of many branches. ---- - -## Skills I will gain now - -::: kompetenzen -- build a case selection with texts -- write a case selection with numbers in Java -- show a different text on the screen depending on a number -::: - -## Many colours, many cases - -The mBot2 should react differently to each colour: turn right on red, drive forward a bit on green, beep on blue. With branches you would need three inside each other. A **case selection** is clearer, in Java \`switch\`: - -\`\`\`java -switch (mbot.getColor()) { - case "red" -> { - mbot.turnRight(); - } - case "green" -> { - mbot.forward(20); - } - default -> { - mbot.forward(10); - } -} -\`\`\` - -- The value being checked goes in the brackets at the top, here the colour. -- Each \`case\` is one **case**. If the value matches, exactly this case runs. -- \`default\` is the case for **everything else**. - -In the structogram the case selection is a box with several columns, one for each case. - -::: übung vb-farbweiche -titel: Colour switch -auftrag: Build a case selection on \`mbot.getColor()\`. For \`"red"\` the mBot2 turns right. For \`"green"\` it drives forward 20 cm. For \`"blue"\` it plays a tone of 880 hertz for 200 milliseconds. In all other cases it drives forward 10 cm. -messwerte: getColor=red -> turnRight -messwerte: getColor=green -> forward 20 -messwerte: getColor=blue -> none, tone -messwerte: getColor=white -> forward 10 -braucht: fallauswahl -tipp: Drag a case selection into the structogram. At the top goes \`mbot.getColor()\`, the cases are \`"red"\`, \`"green"\` and \`"blue"\`, plus the case for everything else. -tipp: For red \`mbot.turnRight()\`, for green \`mbot.forward(20)\`, for blue \`mbot.playTone(880, 200)\`, otherwise \`mbot.forward(10)\`. -lösung: vb-farbweiche-loesung.visustruct -::: - -## Now in Java: line patterns - -A number can also be the value of a case selection. \`mbot.getLine()\` from lesson 7 gives for example: - -| Value | Meaning | -|---|---| -| \`0\` | no line | -| \`6\` | the two middle sensors see the line: it is right on it | -| \`15\` | all four see black: a cross line | - -For numbers you write the case without quotation marks: \`case 6 -> { … }\`. - -::: übung vb-linienmuster -titel: Line patterns -code: java -auftrag: Write a case selection on \`mbot.getLine()\` in Java. For 6 the mBot2 drives forward 10 cm. For 0 it turns right. For 15 it shows **Cross line!** on its screen. In all other cases it drives forward 5 cm. -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Cross line!" -messwerte: getLine=4 -> forward 5 -braucht: fallauswahl -tipp: \`switch (mbot.getLine()) { case 6 -> { … } case 0 -> { … } case 15 -> { … } default -> { … } }\` -tipp: For 6 \`mbot.forward(10);\`, for 0 \`mbot.turnRight();\`, for 15 \`mbot.showText("Cross line!");\`, otherwise \`mbot.forward(5);\`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Now in Java: start signal - -Before a race the mBot2 shows three texts one after the other and then drives off. A for loop counts the rounds 1, 2 and 3. The case selection finds the right text for each round: - -\`\`\`java -for (int round = 1; round <= 3; round++) { - switch (round) { - case 1 -> { mbot.showText("On your marks"); } - ... - } - mbot.pause(1000); -} -\`\`\` - -::: übung vb-startsignal -titel: Start signal -code: java -auftrag: Write in Java: a loop counts \`round\` from 1 to 3. In round 1 the screen shows **On your marks**, in round 2 **Get set**, otherwise **Go!**. After each text the mBot2 waits one second. After the loop it drives 50 cm forward. -befehle: showText "On your marks", pause 1000, showText "Get set", pause 1000, showText "Go!", pause 1000 -fahrt: forward 50 -braucht: fallauswahl -tipp: The loop is \`for (int round = 1; round <= 3; round++) { … }\`. Inside it is \`switch (round) { … }\` and after that \`mbot.pause(1000);\`. -tipp: \`case 1 -> { mbot.showText("On your marks"); }\`, \`case 2 -> { … }\` and \`default -> { mbot.showText("Go!"); }\`. After the loop \`mbot.forward(50);\`. -lösung: vb-startsignal-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Switch"](?visustruct&lektion=10-fallauswahl). It opens in a new window. - -::: übung vb-fehler-09-fallauswahl-mbot2 -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Line patterns", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-09-fallauswahl-mbot2-start.visustruct -messwerte: getLine=6 -> forward 10 -messwerte: getLine=0 -> turnRight -messwerte: getLine=15 -> none, screen "Cross line!" -messwerte: getLine=4 -> forward 5 -tipp: Read the error message carefully. Is the command spelled correctly? After \`mbot.\` the editor suggests all commands. -tipp: It should be \`mbot.turnRight()\`. -lösung: vb-linienmuster-loesung.visustruct -::: - -## Game: Which case runs? - -::: spiel frage -titel: Game: Which case runs? -intro: Read the switch and predict what the mBot2 does. Six rounds. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on green. What does it do? -- It turns right. -- [x] It drives forward 20 cm. -- It drives forward 10 cm. -> The case \`"green"\` matches, so exactly that one runs. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on yellow. What does it do? -- Nothing at all. -- It beeps. -- [x] It drives forward 10 cm. -> There is no case for yellow, so \`default\` runs. - -runde: - switch (mbot.getColor()) { - case "red" -> { mbot.turnRight(); } - case "green" -> { mbot.forward(20); } - case "blue" -> { mbot.playTone(880, 300); } - default -> { mbot.forward(10); } - } -frage: The mBot2 is standing on blue. What does it do? -- [x] It beeps. -- It beeps and then drives forward 10 cm. -- It turns right. -> Only the matching case runs. \`default\` only runs when no other case matches. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Cross line!"); } - default -> { mbot.stop(); } - } -frage: All four sensors see black. What does the mBot2 do? -- It drives forward 10 cm. -- [x] It shows **Cross line!** -- It stops. -> Four sensors on black give 15. - -runde: - switch (mbot.getLine()) { - case 6 -> { mbot.forward(10); } - case 0 -> { mbot.turnRight(); } - case 15 -> { mbot.showText("Cross line!"); } - default -> { mbot.stop(); } - } -frage: Everything under the mBot2 is white. What does it do? -- It drives forward 10 cm. -- [x] It turns right. -- It stops. -> No sensor sees black, so \`mbot.getLine()\` gives 0. - -runde: - for (int round = 1; round <= 3; round++) { - switch (round) { - case 1 -> { mbot.showText("On your marks"); } - case 2 -> { mbot.showText("Get set"); } - default -> { mbot.showText("Go!"); } - } - } -frage: What does the screen show in round 3? -- Get set -- [x] Go! -- On your marks -> There is no case of its own for 3, so \`default\` runs. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build a case selection with texts. → Many colours, many cases -- I can write a case selection with numbers in Java. → Now in Java: line patterns -- I can show a different text on the screen depending on a number. → Now in Java: start signal -::: - -## Quiz - -::: quiz -? The mBot2 is on yellow. Which case of the colour switch runs? -→ Many colours, many cases -- [ ] the case \`"red"\` -- [ ] none at all -- [x] \`default\` -> There is no case of its own for yellow. So the case for everything else runs. -? How do you write the case for the number 6? -→ Now in Java: line patterns -- [x] \`case 6 -> { … }\` -- [ ] \`case "6" -> { … }\` -- [ ] \`if 6 -> { … }\` -> Numbers have no quotation marks, texts like \`"red"\` do. -::: -`,wz=`--- -titel: Buttons and joystick -bereich: Sensors and decisions -kurz: The mBot2 waits for you and can be remote controlled. ---- - -## Skills I will gain now - -::: kompetenzen -- ask the sensors for buttons and joystick -- wait for a button -- steer the mBot2 with the joystick -::: - -## Pressing as a sensor - -::: mbot2 -focus: joystick, buttons -view: top -::: - -On the CyberPi there are two [buttons]{part=buttons} (A and B) and a [joystick]{part=joystick}. For your program these are sensors: they give **true** as long as you press them. - -| Sensor | Text | -|---|---| -| Button A / B pressed? | \`mbot.isButtonA()\`, \`mbot.isButtonB()\` | -| Joystick up / down | \`mbot.isJoystickUp()\`, \`mbot.isJoystickDown()\` | -| Joystick left / right | \`mbot.isJoystickLeft()\`, \`mbot.isJoystickRight()\` | - -> Without a real mBot2, open **🎛 Try the sensors** below the world in the [simulation](#zeige-simulation). There you find the buttons A, B and the arrows for the joystick. A click keeps them pressed for one second. - -## Waiting for button A in the structure chart - -A robot should not drive off as soon as the program starts. Better: it waits until you press A. - -Waiting means: a loop that runs as long as A is **not** pressed. So that it is not completely empty, the mBot2 waits briefly inside with **wait a moment** (\`mbot.pause(100)\`, that is 100 milliseconds). - -::: übung vb-start-a -titel: Start with button A -auftrag: The mBot2 waits until button A is pressed. Then it drives forward 30 cm. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: A while loop with the condition \`!mbot.isButtonA()\`. Inside is **wait a moment**. -tipp: After the loop is \`mbot.forward(30)\`. -lösung: vb-start-a-loesung.visustruct -::: - -> When checking, button A is not pressed for a while and then pressed. If your mBot2 drives off too early, it shows. - -## Now in Java: remote control - -With the joystick you steer the mBot2. The program asks the joystick five times in a row: up means drive forward, down means drive back. - -::: übung vb-java-joystick -titel: Remote control -code: java -auftrag: Write a for loop in Java that runs five times. Inside: if the joystick is up, the mBot2 drives forward. Otherwise: if it is down, it drives back. -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -braucht: forSchleife, verzweigung -tipp: \`for (int i = 0; i < 5; i++) { … }\` and inside \`if (mbot.isJoystickUp()) { … } else { … }\`. -tipp: The \`else\` contains another branch: \`if (mbot.isJoystickDown()) { mbot.backward(); }\`. -lösung: vb-java-joystick-loesung.visustruct -::: - -::: übung vb-fehler-10-tasten-joystick -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Remote control", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-10-tasten-joystick-start.visustruct -messwerte: isJoystickUp=true -> forward 50 -messwerte: isJoystickDown=true -> backward 50 -messwerte: isJoystickUp=false -> none -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.backward()\`. -lösung: vb-java-joystick-loesung.visustruct -::: - -## Game: What does the mBot2 do? - -::: spiel frage -titel: Game: What does the mBot2 do? -intro: You press a button or the joystick. What does the mBot2 do? Six rounds. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: Nobody presses a button. What does the mBot2 do? -- It drives forward 30 cm. -- [x] It keeps waiting. -- It beeps. -> As long as A isn't pressed, it stays in the waiting loop. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: You press button B. What does the mBot2 do? -- It drives forward 30 cm. -- [x] It keeps waiting. -- It drives back 30 cm. -> The loop only asks about button A. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(30); -frage: You press button A. What does the mBot2 do? -- [x] It drives forward 30 cm. -- It keeps waiting. -- It waits 100 ms and then stops. -> Now \`!mbot.isButtonA()\` is false, the loop ends, and it sets off. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: You push the joystick down. What does the mBot2 do? -- It drives forward. -- [x] It drives back. -- Nothing at all. -> The first condition is false, the second is true. - -runde: - if (mbot.isJoystickUp()) { - mbot.forward(); - } else if (mbot.isJoystickDown()) { - mbot.backward(); - } -frage: You push the joystick to the left. What does the mBot2 do? -- It turns left. -- It drives back. -- [x] Nothing at all. -> There is no branch for left. Both conditions are false. - -runde: -frage: You hold button A down. What does \`mbot.isButtonA()\` give? -- [x] true -- false -- 1 -> Buttons give true or false, and pressed means true. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask the sensors for buttons and joystick. → Pressing as a sensor -- I can wait for a button. → Waiting for button A in the structure chart -- I can steer the mBot2 with the joystick. → Now in Java: remote control -::: - -## Quiz - -::: quiz -? What does \`mbot.isButtonB()\` give when nobody presses it? -→ Pressing as a sensor -- [ ] 0 -- [x] false -- [ ] B -> Buttons give true or false. -? Why is there **wait a moment** in the waiting loop? -→ Waiting for button A in the structure chart -- [x] So the loop is not empty and the CyberPi doesn't race round in circles for nothing. -- [ ] So the button glows longer. -- [ ] Without a pause the mBot2 drives backwards. -> The loop checks every 100 milliseconds, that is plenty. -::: -`,yz=`--- -titel: Emergency brake with break -bereich: Sensors and decisions -kurz: An endless loop with a Break: the mBot2 keeps driving until the emergency brake kicks in. ---- - -## Skills I will gain now - -::: kompetenzen -- end an endless loop with a Break -- explain why the Break sits inside a branch -- write a loop with \`while (true)\` and \`break\` in Java -::: - -## Endless loop with a Break - -Many robot programs run "forever": the mBot2 drives, measures, drives, measures … That is what the **endless loop** is for. It has no condition and never stops by itself. - -So that the mBot2 can still stop, you need an **emergency brake**: the **Break**. It leaves the loop it is in straight away. The program carries on with the first box **after** the loop. You recognise it by the point on its left edge. In the box you write a short comment, for example \`leave the loop\`. - -A Break almost always sits inside a **branch**. Otherwise the loop would end in the very first pass. - -::: übung vb-notbremse -titel: Emergency brake at the wall -auftrag: Build an endless loop. Inside it a branch checks: if the distance is less than 15 cm, there is a Break. After that (below the branch, still inside the loop) the mBot2 drives forward. After the loop it plays a tone. -welt: wand-kurz -> tone -welt: wand-mittel -> tone -braucht: endlosschleife, aussprung -tipp: Drag the **endless loop** into the structogram. First a branch with \`mbot.getDistance() < 15\` goes into the loop, the **Break** into its true branch, the false branch stays empty. -tipp: Below the branch (inside the loop) goes **drive forward**, below the loop \`mbot.playTone(440, 300)\`. -lösung: vb-notbremse-loesung.visustruct -::: - -## Now in Java: stop with button A - -In Java the endless loop is \`while (true)\`. The Break is called \`break\`: - -\`\`\`java -while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); -} -\`\`\` - -::: übung vb-java-taste-stopp -titel: Stop with button A -code: java -auftrag: Write in Java: the mBot2 keeps driving forward in an endless loop. When button A is pressed, it leaves the loop with \`break\`. Then the screen shows **Stopped**. -messwerte: isButtonA=true -> none, screen "Stopped" -messwerte: isButtonA=false/true -> drives, screen "Stopped" -braucht: endlosschleife, aussprung -tipp: \`while (true) { … }\` with \`if (mbot.isButtonA()) { break; }\` and then \`mbot.forward();\`. -tipp: After the loop \`mbot.showText("Stopped");\`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Call and break"](?visustruct&lektion=18-aufruf-und-aussprung). It opens in a new window. - -::: übung vb-fehler-10-unterbrechen-mit-break -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Stop with button A", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-10-unterbrechen-mit-break-start.visustruct -messwerte: isButtonA=true -> none, screen "Stopped" -messwerte: isButtonA=false/true -> drives, screen "Stopped" -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be \`mbot.showText("Stopped")\`. -lösung: vb-java-taste-stopp-loesung.visustruct -::: - -## Game: Emergency brake - -::: spiel frage -titel: Game: Emergency brake -intro: When does the break kick in, and what happens afterwards? Each drive is 10 cm long. Five rounds. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: The wall starts 40 cm away. How often does it drive forward? -- 2 times -- [x] 3 times -- forever -> At 40, 30 and 20 it drives. At 10 the emergency brake kicks in. - -runde: - while (true) { - if (mbot.getDistance() < 15) { - break; - } - mbot.forward(); - } - mbot.playTone(440, 300); -frage: What happens straight after \`break\`? -- The loop starts again. -- It drives forward once more. -- [x] It beeps. -> \`break\` leaves the loop. The program carries on with the first command after it. - -runde: - while (true) { - mbot.forward(); - break; - } -frage: How often does the mBot2 drive forward? -- [x] once -- not at all -- forever -> The break isn't inside a branch. The loop ends in its first run. - -runde: - while (true) { - mbot.forward(); - } -frage: When does this loop stop? -- after 10 drives -- at the wall -- [x] never -> Without \`break\`, \`while (true)\` really is endless. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: You press button A after it has driven forward twice. How often has it driven forward? -- [x] 2 times -- 3 times -- not at all -> In the next run it notices the button and jumps out of the loop. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - while (true) { - if (mbot.getDistance() > 15) { - break; - } - mbot.forward(); - } -frage: Should drive forward and stop at the wall with the emergency brake. -fehler: 2 -besser: if (mbot.getDistance() < 15) { -> The emergency brake should kick in when the wall is **close**. - -runde: - while (true) { - if (mbot.isButtonB()) { - break; - } - mbot.forward(); - } - mbot.showText("Stopped"); -frage: Should drive forward until button A is pressed, then show "Stopped". -fehler: 2 -besser: if (mbot.isButtonA()) { -> The brake should be button A, not B. - -runde: - while (true) { - if (mbot.isButtonA()) { - brake; - } - mbot.forward(); - } -frage: Should drive forward until button A is pressed. -fehler: 3 -besser: break; -> The exit is called \`break\`, not \`brake\`. - -runde: - while (false) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } -frage: Should drive in an endless loop until button A is pressed. -fehler: 1 -besser: while (true) { -> The endless loop is \`while (true)\`. With \`false\` it doesn't run even once. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can end an endless loop with a Break. → Endless loop with a Break -- I can explain why the Break sits inside a branch. → Endless loop with a Break -- I can write a loop with \`while (true)\` and \`break\` in Java. → Now in Java: stop with button A -::: - -## Quiz - -::: quiz -? Where does the program carry on after a Break? -→ Endless loop with a Break -- [ ] at the start of the loop -- [x] at the first box after the loop -- [ ] at the very start of the program -> The Break leaves the loop straight away. -? Why does the Break sit inside a branch? -→ Endless loop with a Break -- [x] Otherwise the loop ends in the first pass. -- [ ] Otherwise the mBot2 drives backwards. -- [ ] It just looks nicer. -> The emergency brake should only kick in when the condition is true. -? What is the endless loop called in Java? -→ Now in Java: stop with button A -- [ ] \`while (false)\` -- [x] \`while (true)\` -- [ ] \`for (;;) break;\` -> \`true\` is always true, the loop only stops with \`break\`. -::: -`,zz=`--- -titel: The light sensor -bereich: Sensors and decisions -kurz: Bright or dark? The mBot2 becomes a night light. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the brightness -- switch the LEDs with a branch -- write several commands in one branch -::: - -## How bright is it? - -::: mbot2 -focus: lightSensor -view: top -::: - -The [light sensor]{part=lightSensor} is on the CyberPi. \`mbot.getBrightness()\` gives a number from **0** (pitch dark) to **100** (very bright). - -| Sensor | Text | Value | -|---|---|---| -| Brightness | \`mbot.getBrightness()\` | 0 to 100 | - -> In the simulation you set the brightness with the slider under **🎛 Try the sensors**. With a real mBot2 you simply hold your hand over the CyberPi. - -## Night light in the structure chart - -::: übung vb-nachtlicht -titel: Night light -auftrag: If the brightness is less than 30, the LEDs glow white (\`mbot.setLed(255, 255, 255)\`). Otherwise the LEDs go off (\`mbot.ledOff()\`). -messwerte: getBrightness=10 -> ledOn -messwerte: getBrightness=80 -> ledOff -braucht: verzweigung -tipp: Drag a branch into the structure chart and the sensor **Brightness** onto it. Write \`< 30\` after it. -tipp: The true branch gets **LEDs on** with \`mbot.setLed(255, 255, 255)\`, the false branch **LEDs off**. -lösung: vb-nachtlicht-loesung.visustruct -::: - -::: angeberwissen -Street lights do the same: a light sensor notices when it gets dark and switches them on. That is why they come on earlier in winter than in summer, without anyone changing a clock. -::: - -## Now in Java: night light with sound - -::: übung vb-java-nachtlicht-ton -titel: Night light with sound -code: java -auftrag: Write the night light in Java, but with two changes: in the dark the LEDs glow yellow (\`mbot.setLed(255, 200, 0)\`) **and** the mBot2 plays a tone. In the light the LEDs go off, without a tone. -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -braucht: verzweigung -tipp: \`if (mbot.getBrightness() < 30) { … } else { … }\` -tipp: The \`if\` part has two lines: \`mbot.setLed(255, 200, 0);\` and \`mbot.playTone(440, 300);\`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -::: übung vb-fehler-11-licht -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Night light with sound", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-11-licht-start.visustruct -messwerte: getBrightness=10 -> ledOn, tone -messwerte: getBrightness=80 -> ledOff, noTone -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be \`mbot.setLed(255, 200, 0)\`. -lösung: vb-java-nachtlicht-ton-loesung.visustruct -::: - -## Game: Lights on or off? - -::: spiel frage -titel: Game: Lights on or off? -intro: How bright is it, and what do the LEDs do? Six rounds. -antworten: LEDs on | LEDs off - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: It is almost dark, the brightness is 10. -richtig: LEDs on -> 10 is less than 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is 45. -richtig: LEDs off -> 45 is not less than 30. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is exactly 30. -richtig: LEDs off -> 30 is not less than 30. For "up to and including 30" you would need \`<=\`. - -runde: - if (mbot.getBrightness() < 30) { - mbot.setLed(255, 255, 255); - } else { - mbot.ledOff(); - } -frage: The brightness is 29. -richtig: LEDs on -> 29 is just less than 30. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: The brightness is 50. -richtig: LEDs on -> Careful, it's the other way round here: 50 is not greater than 70, so the false branch runs. The LEDs light up yellow. - -runde: - if (mbot.getBrightness() > 70) { - mbot.ledOff(); - } else { - mbot.setLed(255, 200, 0); - } -frage: The sun is shining, the brightness is 100. -richtig: LEDs off -> 100 is greater than 70, so the true branch runs. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the brightness. → How bright is it? -- I can switch the LEDs with a branch. → Night light in the structure chart -- I can write several commands in one branch. → Now in Java: night light with sound -::: - -## Quiz - -::: quiz -? \`mbot.getBrightness()\` gives 45. What does the night light do? -→ Night light in the structure chart -- [ ] The LEDs glow. -- [x] The LEDs go off. -> 45 is not less than 30. -? What range do the light sensor's values have? -→ How bright is it? -- [ ] 0 to 255 -- [x] 0 to 100 -- [ ] -100 to 100 -::: -`,Iz=`--- -titel: A flag with boolean -bereich: Sensors and decisions -kurz: Use a variable of type boolean to remember whether something happened. ---- - -## Skills I will gain now - -::: kompetenzen -- create a variable of type \`boolean\` -- use a flag to remember whether something happened -- check a flag in a condition after the loop -::: - -## True or false - -A variable of type \`boolean\` knows only two values: \`true\` and \`false\`. You already know this from the sensors: \`mbot.isButtonA()\` gives you \`true\` or \`false\`. A comparison like \`mbot.getDistance() < 10\` is also \`true\` or \`false\` in the end. - -| Code | Meaning | -|---|---| -| \`boolean dark = false\` | It has not been dark yet. | -| \`dark = true\` | Now it has been dark. | -| \`if (dark)\` | Is \`dark\` true? | - -With \`if (dark)\` you don't need \`== true\`. The variable itself is already true or false. - -## The flag - -The mBot2 should keep watch for three seconds. It measures the brightness again and again. Afterwards it should say whether it was dark **at any point**. - -For this you use a **flag**: a \`boolean\` variable that starts with \`false\`. When it gets dark, you set it to \`true\`. After that nobody sets it back. So after the loop you know: was it dark even just once? - -::: übung vb-wurde-es-dunkel -titel: Did it get dark? -auftrag: Build a structure chart: create \`boolean dark = false\`. In a for loop, check 30 times: if the brightness is less than 20, \`dark\` becomes true. Wait 100 ms in every pass. Then show **It was dark** or **Always bright**. -messwerte: getBrightness=80/10/80 -> none, screen "It was dark" -messwerte: getBrightness=80 -> none, screen "Always bright" -braucht: forSchleife, verzweigung -tipp: Inside the loop is a branch with \`mbot.getBrightness() < 20\`. The yes branch has \`dark = true\`, the no branch stays empty. Then comes \`mbot.pause(100)\`. -tipp: After the loop comes a second branch with the condition \`dark\`. Yes: \`mbot.showText("It was dark")\`, no: \`mbot.showText("Always bright")\`. -lösung: vb-wurde-es-dunkel-loesung.visustruct -::: - -> When checking, it gets dark for a moment in the middle of the watch and then bright again. Does your mBot2 still show **It was dark**? - -## Now in Java: was there a clap? - -In Java the flag looks like this: - -\`\`\`java -boolean loud = false; -for (int i = 0; i < 30; i++) { - if (mbot.getLoudness() > 60) { - loud = true; - } - mbot.pause(100); -} -\`\`\` - -In Java you always write \`true\` and \`false\` in lower case. - -::: übung vb-java-klatsch-merker -titel: Was there a clap? -code: java -auftrag: Write in Java: the mBot2 listens for three seconds (30 times with a 100 ms pause). If the loudness is ever greater than 60, it remembers this in \`boolean loud\`. Then it shows **Clap!** or **All quiet**. -messwerte: getLoudness=0/90/0 -> none, screen "Clap!" -messwerte: getLoudness=0 -> none, screen "All quiet" -braucht: forSchleife, verzweigung -tipp: Take the code above and then write \`if (loud) { … } else { … }\`. -tipp: The branches get \`mbot.showText("Clap!");\` and \`mbot.showText("All quiet");\`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -::: übung vb-fehler-11-merker-boolean -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Was there a clap?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-11-merker-boolean-start.visustruct -messwerte: getLoudness=0/90/0 -> none, screen "Clap!" -messwerte: getLoudness=0 -> none, screen "All quiet" -tipp: The error message names an unknown variable. How do you write true and false in Java? Java is case-sensitive. -tipp: It should be \`loud = true\`. -lösung: vb-java-klatsch-merker-loesung.visustruct -::: - -## Game: true or false? - -::: spiel frage -titel: Game: true or false? -intro: Ludwig asks what the condition comes out as. Six rounds. -frage: Is it true or false? -antworten: true | false - -runde: -frage: \`mbot.getDistance() < 10\`, the distance is 25 cm. -richtig: false -> 25 is not less than 10. - -runde: -frage: \`mbot.isButtonA()\`, and you are pressing button A right now. -richtig: true -> The sensor reports: pressed. - -runde: -frage: \`boolean dark = false\`. It never gets dark in the loop. What is \`dark\` afterwards? -richtig: false -> Nobody set the flag to \`true\`. - -runde: -frage: \`boolean dark = false\`. It gets dark once in the loop, then bright again. What is \`dark\` afterwards? -richtig: true -> A flag stays \`true\` once it has been set. - -runde: -frage: \`mbot.getBrightness() > 50\`, the brightness is 50. -richtig: false -> 50 is not greater than 50. - -runde: -frage: \`!mbot.isButtonA()\`, and you are not pressing button A. -richtig: true -> Button A is not pressed, so \`false\`. The \`!\` turns it around: \`true\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create a variable of type \`boolean\`. → True or false -- I can use a flag to remember whether something happened. → The flag -- I can check a flag in a condition after the loop. → Now in Java: was there a clap? -::: - -## Quiz - -::: quiz -? Which values can a variable of type \`boolean\` have? -→ True or false -- [ ] Any whole number -- [x] Only \`true\` and \`false\` -- [ ] Only 0 and 1 -? What does a flag start with? -→ The flag -- [x] With \`false\`, because nothing has happened yet -- [ ] With \`true\` -- [ ] With the first reading -> Only when the event happens does it become \`true\`. -? How do you check in Java whether the flag \`loud\` is true? -→ Now in Java: was there a clap? -- [x] \`if (loud)\` -- [ ] \`if (loud = true)\` -- [ ] \`if loud\` -> \`loud\` itself is already true or false. A single \`=\` would be an assignment. -::: -`,kz=`--- -titel: The microphone -bereich: Sensors and decisions -kurz: Clap to start, and a noise light for the classroom. ---- - -## Skills I will gain now - -::: kompetenzen -- ask for the loudness -- wait until something happens -- write a noise light in Java -::: - -## How loud is it? - -::: mbot2 -focus: microphone -view: top -::: - -The CyberPi's [microphone]{part=microphone} measures the loudness. \`mbot.getLoudness()\` gives **0** (silent) to **100** (very loud). A clap nearby gives about 60 to 90. - -| Sensor | Text | Value | -|---|---|---| -| Loudness | \`mbot.getLoudness()\` | 0 to 100 | - -## Clap to start in the structure chart - -Just like waiting for button A: a loop waits as long as it is quiet. Only then does the mBot2 drive off. - -::: übung vb-klatschen -titel: Clap to start -auftrag: The mBot2 waits as long as the loudness is less than 50. Then it drives forward 30 cm. -messwerte: getLoudness=0/80 -> forward 30 -messwerte: getLoudness=90 -> forward 30 -braucht: whileSchleife -tipp: A while loop with the condition \`mbot.getLoudness() < 50\`, with **wait a moment** inside. -tipp: After the loop: \`mbot.forward(30)\`. -lösung: vb-klatschen-loesung.visustruct -::: - -> In the simulation you push the **Loudness** slider to the right while the program is waiting. - -## Now in Java: noise light - -::: übung vb-java-laermampel -titel: Noise light -code: java -auftrag: Write in Java: if the loudness is greater than 60, the LEDs glow red. Otherwise they are off. -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -braucht: verzweigung -tipp: \`if (mbot.getLoudness() > 60) { … } else { … }\` -tipp: Red is \`mbot.setLed(255, 0, 0);\`, off is \`mbot.ledOff();\`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -::: angeberwissen -Loudness is really measured in **decibels** (dB). Whispering is about 30 dB, a classroom 60 to 70 dB, a pneumatic drill 100 dB. The CyberPi turns that into a simple number from 0 to 100. -::: - -::: übung vb-fehler-12-lautstaerke -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Noise light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-12-lautstaerke-start.visustruct -messwerte: getLoudness=80 -> ledOn -messwerte: getLoudness=20 -> ledOff -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.ledOff()\`. -lösung: vb-java-laermampel-loesung.visustruct -::: - -## Game: Loud or quiet? - -::: spiel frage -titel: Game: Loud or quiet? -intro: How loud is it, and what does the mBot2 do? Six rounds. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: The class is quiet, the loudness is 30. -- [x] It keeps waiting. -- It drives forward 30 cm. -> 30 is less than 50, the waiting loop keeps running. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: You clap, the loudness is 70. -- It keeps waiting. -- [x] It drives forward 30 cm. -> 70 is not less than 50. The loop ends and it sets off. - -runde: - while (mbot.getLoudness() < 50) { - mbot.pause(100); - } - mbot.forward(30); -frage: The loudness is exactly 50. -- It keeps waiting. -- [x] It drives forward 30 cm. -> 50 is not less than 50. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: The loudness is 65. -- [x] The LEDs light up red. -- The LEDs are off. -> 65 is greater than 60: too loud. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: The loudness is exactly 60. -- The LEDs light up red. -- [x] The LEDs are off. -> 60 is not greater than 60. - -runde: - if (mbot.getLoudness() > 60) { - mbot.setLed(255, 0, 0); - } else { - mbot.ledOff(); - } -frage: Someone whispers, the loudness is 10. -- The LEDs light up red. -- [x] The LEDs are off. -> Whispering is quiet. The noise light stays off. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can ask for the loudness. → How loud is it? -- I can wait until something happens. → Clap to start in the structure chart -- I can write a noise light in Java. → Now in Java: noise light -::: - -## Quiz - -::: quiz -? The clap loop is \`while (mbot.getLoudness() < 50)\`. The loudness is 30. What happens? -→ Clap to start in the structure chart -- [x] The mBot2 keeps waiting. -- [ ] The mBot2 drives off. -> 30 is less than 50, the condition is true, the loop keeps running. -::: -`,Sz=`--- -titel: The motion sensor -bereich: Sensors and decisions -kurz: Measure tilt and detect shaking. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the motion sensor measures -- join two conditions with “or” -- join several conditions with “and” -::: - -## Tilted or level? - -::: mbot2 -focus: cyberpi -spin: yes -::: - -Inside the [CyberPi]{part=cyberpi} there is a **motion sensor** (gyroscope). It measures how tilted the mBot2 is, in degrees: - -| Sensor | Text | Value | -|---|---|---| -| Tilt forward/back | \`mbot.getPitch()\` | nose down: positive, nose up: negative (−90 to 90) | -| Tilt sideways | \`mbot.getRoll()\` | positive to one side, negative to the other | -| Shaken? | \`mbot.isShaken()\` | \`true\` or \`false\` | - -When the mBot2 is lying flat on the table, both tilts are about **0**. - -> In the simulation there are two sliders for this under **🎛 Try the sensors** and the button **shake**. With a real mBot2 you tilt it carefully in your hand. - -## Tilt warning in the structure chart - -If the mBot2 drives up or down a ramp that is too steep, it should warn you. Too steep means: more than 20° forward **or** more than 20° back. - -::: übung vb-schraeglage -titel: Tilt warning -auftrag: If the forward/back tilt is greater than 20 **or** less than −20, the mBot2 plays a tone. Otherwise it does nothing. -messwerte: getPitch=30 -> tone -messwerte: getPitch=-30 -> tone -messwerte: getPitch=5 -> noTone -braucht: verzweigung -tipp: “or” in a condition is \`||\`. Drag the sensor **Tilt forward/back** onto the branch twice. -tipp: The condition is \`mbot.getPitch() > 20 || mbot.getPitch() < -20\`, the true branch gets **play a tone**. -lösung: vb-schraeglage-loesung.visustruct -::: - -## Now in Java: spirit level - -A spirit level shows whether something is exactly level. The mBot2 glows green when both tilts are between −5 and 5. - -::: übung vb-java-wasserwaage -titel: Spirit level -code: java -auftrag: Write in Java: if \`mbot.getPitch()\` and \`mbot.getRoll()\` are both between −5 and 5, the LEDs glow green. Otherwise they are off. -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -braucht: verzweigung -tipp: “and” is \`&&\`. You need four comparisons: \`mbot.getPitch() > -5 && mbot.getPitch() < 5 && …\` -tipp: Green is \`mbot.setLed(0, 255, 0);\`, the \`else\` has \`mbot.ledOff();\`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -::: übung vb-fehler-13-neigung -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Spirit level", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-13-neigung-start.visustruct -messwerte: getPitch=0, getRoll=0 -> ledOn -messwerte: getPitch=0, getRoll=20 -> ledOff -messwerte: getPitch=-10, getRoll=0 -> ledOff -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.setLed(0, 255, 0)\`. -lösung: vb-java-wasserwaage-loesung.visustruct -::: - -## Game: Too steep? - -::: spiel frage -titel: Game: Too steep? -intro: Ludwig tilts the mBot2. What does it do? Six rounds. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: The nose points 30° down, \`mbot.getPitch()\` gives 30. -- [x] It beeps. -- It doesn't beep. -> 30 is greater than 20. One true part is enough for \`||\`. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: The nose points up, \`mbot.getPitch()\` gives −25. -- [x] It beeps. -- It doesn't beep. -> −25 is less than −20, so the second part is true. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: A gentle ramp, \`mbot.getPitch()\` gives 10. -- It beeps. -- [x] It doesn't beep. -> 10 is between −20 and 20. Both parts are false. - -runde: - if (mbot.getPitch() > 20 || mbot.getPitch() < -20) { - mbot.playTone(440, 300); - } -frage: \`mbot.getPitch()\` gives exactly 20. -- It beeps. -- [x] It doesn't beep. -> 20 is not greater than 20. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: \`mbot.getPitch()\` gives 0, \`mbot.getRoll()\` gives 3. -- [x] The LEDs light up green. -- The LEDs are off. -> All four parts are true. The mBot2 is almost level. - -runde: - if (mbot.getPitch() > -5 && mbot.getPitch() < 5 && mbot.getRoll() > -5 && mbot.getRoll() < 5) { - mbot.setLed(0, 255, 0); - } else { - mbot.ledOff(); - } -frage: \`mbot.getPitch()\` gives 2, \`mbot.getRoll()\` gives −8. -- The LEDs light up green. -- [x] The LEDs are off. -> −8 is not greater than −5. With \`&&\`, one false part makes everything false. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 6 2 CONDITION: is true or false, e.g. mbot.getDistance() < 20 -- ↓ 4 4 SENSOR: a part that measures something -- ↓ 3 10 BRANCH: does one thing or the other, depending on a condition -- ↓ 4 6 BRIGHTNESS: mbot.getBrightness() measures it -- → 11 4 BREAK: emergency brake: leaves the loop straight away -- → 13 1 ULTRASOUND: how the mBot2 measures distance: a very high sound and its echo -- ↓ 1 8 JOYSTICK: small lever on the CyberPi -- ↓ 2 2 SWITCH: one case of its own for each value -lösung: 7 4, 11 6, 10 6, 4 8, 6 9, 9 4 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the motion sensor measures. → Tilted or level? -- I can join two conditions with “or”. → Tilt warning in the structure chart -- I can join several conditions with “and”. → Now in Java: spirit level -::: - -## Quiz - -::: quiz -? The mBot2 is lying flat on the table. What does \`mbot.getPitch()\` give, roughly? -→ Tilted or level? -- [x] 0 -- [ ] 90 -- [ ] 100 -? What does \`mbot.isShaken()\` do? -→ Tilted or level? -- [ ] It shakes the mBot2. -- [x] It reports whether someone is shaking the mBot2. -> Sensors don't do anything, they only measure. -::: -`,Tz=`--- -titel: The LEDs -bereich: Light, sound and screen -kurz: Mix colours, build a traffic light and make it blink. ---- - -## Skills I will gain now - -::: kompetenzen -- mix a colour from red, green and blue -- show colours one after the other with pauses -- make the LEDs blink in Java -::: - -## Mixing red, green and blue - -::: mbot2 -focus: leds -view: back -::: - -The five [LEDs]{part=leds} are an **actuator**: they do something, they light up. Each LED mixes its colour from red, green and blue, each from 0 (off) to 255 (fully bright). - -| Command | Box | What happens | -|---|---|---| -| \`mbot.setLed(255, 0, 0)\` | **LEDs on** | all LEDs red | -| \`mbot.ledOff()\` | **LEDs off** | all LEDs off | -| \`mbot.pause(1000)\` | **wait a moment** | wait 1000 milliseconds (1 second) | - -| Colour | Red | Green | Blue | -|---|---|---|---| -| Red | 255 | 0 | 0 | -| Yellow | 255 | 200 | 0 | -| Green | 0 | 255 | 0 | -| Blue | 0 | 0 | 255 | -| White | 255 | 255 | 255 | -| Purple | 160 | 0 | 255 | - -> Without **wait a moment** the mBot2 switches the colours so fast that you only see the last one. In the simulation you see the colour on the LEDs of the 3D model. - -## Traffic light in the structure chart - -::: übung vb-ampel -titel: Traffic light -auftrag: The LEDs show red, yellow and green one after the other like a traffic light. Between the colours the mBot2 waits 1000 milliseconds each time. Yellow is \`255, 200, 0\`. -befehle: setLed 255 0 0, pause 1000, setLed 255 200 0, pause 1000, setLed 0 255 0 -tipp: Drag **LEDs on** three times and **wait a moment** twice into the structure chart, taking turns. -tipp: Change the numbers: \`mbot.setLed(255, 0, 0)\`, \`mbot.pause(1000)\`, \`mbot.setLed(255, 200, 0)\`, \`mbot.pause(1000)\`, \`mbot.setLed(0, 255, 0)\`. -lösung: vb-ampel-loesung.visustruct -::: - -## Now in Java: blue light - -Blinking means: on, wait, off, wait, again and again. “Again and again” is a loop. - -::: übung vb-java-blinken -titel: Blue light -code: java -auftrag: Write a for loop in Java that runs three times. Inside, the LEDs go blue, the mBot2 waits 500 milliseconds, the LEDs go off, and it waits 500 milliseconds again. -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: \`for (int i = 0; i < 3; i++) { … }\` -tipp: Inside the loop: \`mbot.setLed(0, 0, 255);\`, \`mbot.pause(500);\`, \`mbot.ledOff();\`, \`mbot.pause(500);\`. -lösung: vb-java-blinken-loesung.visustruct -::: - -::: übung vb-fehler-14-leds -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Blue light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-14-leds-start.visustruct -befehle: 3 x (setLed 0 0 255, pause 500, ledOff, pause 500) -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.pause(500)\`. -lösung: vb-java-blinken-loesung.visustruct -::: - -## Game: Which colour? - -::: spiel frage -titel: Game: Which colour? -intro: Red, green and blue mixed together: which colour do the LEDs show? Seven rounds. - -runde: - mbot.setLed(255, 0, 0); -frage: Which colour lights up? -- [x] red -- green -- blue -> Only the first value, red, is on. - -runde: - mbot.setLed(0, 0, 255); -frage: Which colour lights up? -- red -- green -- [x] blue -> The order is always red, green, blue. Only blue is on. - -runde: - mbot.setLed(255, 255, 255); -frage: Which colour lights up? -- yellow -- [x] white -- off -> All three colours at full brightness make white. - -runde: - mbot.setLed(255, 200, 0); -frage: Which colour lights up? -- [x] yellow -- purple -- white -> Red and green together make yellow. - -runde: - mbot.setLed(160, 0, 255); -frage: Which colour lights up? -- yellow -- [x] purple -- green -> Red and blue together make purple. - -runde: - mbot.setLed(0, 0, 0); -frage: Which colour lights up? -- white -- black -- [x] none, the LEDs are off -> All three values are 0. An LED can't shine black. - -runde: - mbot.setLed(255, 0, 0); - mbot.setLed(0, 255, 0); - mbot.pause(1000); -frage: Which colour do you see for one second? -- red -- [x] green -- first red, then green -> Without **wait a moment** between the colours, red is gone immediately. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.setLed(255, 0, 0); - mbot.pause(1000); - mbot.setLed(255, 200, 0); - mbot.pause(1000); - mbot.setLed(0, 0, 255); -frage: Should show red, yellow and green like a traffic light. -fehler: 5 -besser: mbot.setLed(0, 255, 0); -> Green is \`0, 255, 0\`. \`0, 0, 255\` is blue. - -runde: - for (int i = 0; i < 3; i++) { - mbot.setLed(0, 0, 255); - mbot.pause(500); - mbot.ledOff; - mbot.pause(500); - } -frage: Should flash blue three times. -fehler: 4 -besser: mbot.ledOff(); -> A command without a number still needs its brackets. - -runde: - mbot.setLed(0, 0, 300); - mbot.pause(1000); - mbot.ledOff(); -frage: Should shine bright blue for one second. -fehler: 1 -besser: mbot.setLed(0, 0, 255); -> Each colour only goes from 0 to 255. - -runde: - mbot.setLed(255, 255, 255); - mbot.pause(1000); - mbot.setLed(0, 0, 0, 0); -frage: Should shine white for one second and then go off. -fehler: 3 -besser: mbot.ledOff(); -> \`setLed\` has exactly three numbers: red, green, blue. To switch off there is \`mbot.ledOff()\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can mix a colour from red, green and blue. → Mixing red, green and blue -- I can show colours one after the other with pauses. → Traffic light in the structure chart -- I can make the LEDs blink in Java. → Now in Java: blue light -::: - -## Quiz - -::: quiz -? Which colour does \`mbot.setLed(0, 255, 0)\` give? -→ Mixing red, green and blue -- [ ] Red -- [x] Green -- [ ] Blue -> The numbers are red, green, blue. Only green is on. -? Why does the blue light need **wait a moment**? -→ Now in Java: blue light -- [x] Otherwise it changes so fast that you can't see any blinking. -- [ ] Otherwise the LEDs break. -- [ ] Because \`ledOff()\` doesn't work otherwise. -::: -`,_z=`--- -titel: Single LEDs -bereich: Light, sound and screen -kurz: Each of the five LEDs gets its own colour, all the way to a running light. ---- - -## Skills I will gain now - -::: kompetenzen -- address the LEDs by their numbers 0 to 4 -- make single LEDs light up in different colours -- build a running light with a loop -::: - -## Every LED has a number - -::: mbot2 -focus: leds -view: back -::: - -So far all five [LEDs]{part=leds} showed the same colour. But you can also address each LED on its own. For that, every LED has a **number**. As with arrays, counting starts at **0**: the five LEDs are called 0, 1, 2, 3 and 4. - -| Command | Box | What happens | -|---|---|---| -| \`mbot.led(0).setColor("green")\` | **set LED colour** | LED 0 lights up green | -| \`mbot.led(3).setColor("off")\` | **set LED colour** | LED 3 goes off | - -You write the colour as a name in quotes: - -| Colour name | Colour name | Colour name | -|---|---|---| -| \`"red"\` | \`"orange"\` | \`"yellow"\` | -| \`"green"\` | \`"cyan"\` | \`"blue"\` | -| \`"purple"\` | \`"pink"\` | \`"white"\` | - -With \`"off"\` you switch an LED off. - -> The number can also be a variable: \`mbot.led(i).setColor("red")\`. That way a loop can switch on one LED after the other. - -## Three lights in the structogram - -::: übung vb-drei-lichter -titel: Three lights -auftrag: Switch LED 0 red, LED 2 yellow and LED 4 green. LEDs 1 and 3 stay off. -befehle: ledColor 0 "red", ledColor 2 "yellow", ledColor 4 "green" -tipp: Drag **set LED colour** into the structogram three times. -tipp: Change number and colour: \`mbot.led(0).setColor("red")\`, \`mbot.led(2).setColor("yellow")\`, \`mbot.led(4).setColor("green")\`. -lösung: vb-drei-lichter-loesung.visustruct -::: - -## Now in Java: running light - -In a running light, a light moves from one LED to the next. The loop variable \`i\` is the number of the LED. - -::: übung vb-java-lauflicht -titel: Running light -code: java -auftrag: Write a for loop in Java in which \`i\` runs from 0 to 4. Inside, LED \`i\` turns blue, the mBot2 waits 200 milliseconds, and LED \`i\` goes off again. -befehle: ledColor 0 "blue", pause 200, ledColor 0 "off", ledColor 1 "blue", pause 200, ledColor 1 "off", ledColor 2 "blue", pause 200, ledColor 2 "off", ledColor 3 "blue", pause 200, ledColor 3 "off", ledColor 4 "blue", pause 200, ledColor 4 "off" -braucht: forSchleife -tipp: \`for (int i = 0; i < 5; i++) { … }\` -tipp: Inside the loop: \`mbot.led(i).setColor("blue");\`, \`mbot.pause(200);\`, \`mbot.led(i).setColor("off");\`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -::: übung vb-fehler-15-einzelne-leds -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Running light", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-15-einzelne-leds-start.visustruct -befehle: ledColor 0 "blue", pause 200, ledColor 0 "off", ledColor 1 "blue", pause 200, ledColor 1 "off", ledColor 2 "blue", pause 200, ledColor 2 "off", ledColor 3 "blue", pause 200, ledColor 3 "off", ledColor 4 "blue", pause 200, ledColor 4 "off" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`mbot.led(i)\`. -lösung: vb-java-lauflicht-loesung.visustruct -::: - -## Game: Which LED is on? - -::: spiel frage -titel: Game: Which LED is on? -intro: Five LEDs numbered 0 to 4. Which ones light up? Six rounds. - -runde: - mbot.led(0).setColor("red"); -frage: Which LED lights up red? -- [x] the first one -- the second one -- all of them -> The numbers start at 0. LED 0 is the first one. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blue"); - } -frage: Which LEDs light up blue? -- LEDs 0 to 3 -- [x] all five -- only LED 4 -> \`i\` runs from 0 to 4, that is all five. - -runde: - for (int i = 0; i < 5; i = i + 2) { - mbot.led(i).setColor("green"); - } -frage: Which LEDs light up green? -- LEDs 1 and 3 -- [x] LEDs 0, 2 and 4 -- LEDs 2 and 4 -> \`i\` jumps in steps of two: 0, 2, 4. - -runde: - mbot.led(2).setColor("yellow"); - mbot.led(2).setColor("off"); -frage: Which LED is on at the end? -- LED 2 yellow -- [x] none -- LED 3 yellow -> LED 2 goes on and straight off again. - -runde: - for (int i = 4; i >= 0; i--) { - mbot.led(i).setColor("red"); - mbot.pause(200); - mbot.led(i).setColor("off"); - } -frage: At which LED does this running light start? -- LED 0 -- [x] LED 4 -- LED 5 -> \`i\` starts at 4 and counts down. The light runs the other way round. - -runde: -frage: Ludwig writes \`mbot.led(5).setColor("red");\`. Which LED lights up? -- the fifth one -- the sixth one -- [x] none, there is no LED 5 -> The five LEDs are numbered 0 to 4. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.led(1).setColor("red"); - mbot.led(2).setColor("yellow"); - mbot.led(4).setColor("green"); -frage: Should switch LED 0 red, LED 2 yellow and LED 4 green. -fehler: 1 -besser: mbot.led(0).setColor("red"); -> The first LED has the number 0. - -runde: - for (int i = 1; i <= 5; i++) { - mbot.led(i).setColor("blue"); - } -frage: Should switch all five LEDs blue. -fehler: 1 -besser: for (int i = 0; i < 5; i++) { -> The LEDs are numbered 0 to 4. There is no LED 5. - -runde: - for (int i = 0; i < 5; i++) { - mbot.led(i).setColor("blue"); - mbot.pause(200); - mbot.led(0).setColor("off"); - } -frage: Running light: each LED goes blue for a moment and then off again. -fehler: 4 -besser: mbot.led(i).setColor("off"); -> The same LED \`i\` should go off, not always LED 0. - -runde: - mbot.led(3).setColor(red); -frage: Should switch LED 3 red. -fehler: 1 -besser: mbot.led(3).setColor("red"); -> The colour name is a text and needs quotation marks. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can address the LEDs by their numbers 0 to 4. → Every LED has a number -- I can make single LEDs light up in different colours. → Three lights in the structogram -- I can build a running light with a loop. → Now in Java: running light -::: - -## Quiz - -::: quiz -? Which number does the first LED have? -→ Every LED has a number -- [x] 0 -- [ ] 1 -- [ ] 5 -> As with arrays, you count from 0. The five LEDs have the numbers 0 to 4. -? What does \`mbot.led(4).setColor("off")\` do? -→ Three lights in the structogram -- [ ] All LEDs go off. -- [x] Only LED 4 goes off. -- [ ] Four LEDs go off. -::: -`,Az=`--- -titel: The speaker -bereich: Light, sound and screen -kurz: Tones, a scale and a siren. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what the two numbers in \`playTone\` mean -- build a sequence of tones -- calculate with the counting variable in Java -- make the mBot2 show a feeling -::: - -## How high, how long? - -::: mbot2 -focus: cyberpi -view: top -::: - -The [CyberPi]{part=cyberpi} has a small speaker. \`mbot.playTone(440, 300)\` plays a tone: - -- The first number is the **pitch** in hertz (vibrations per second). The bigger, the higher. -- The second number is the **length** in milliseconds. - -| Note | C | D | E | F | G | A | B | C' | -|---|---|---|---|---|---|---|---|---| -| Hertz | 262 | 294 | 330 | 349 | 392 | 440 | 494 | 523 | - -> In the simulation you hear the tones through your computer's speakers. Feel free to turn it down a bit. - -## Scale in the structure chart - -::: übung vb-tonleiter -titel: Scale -auftrag: The mBot2 plays the notes C, D, E, F, G one after the other, each 300 milliseconds long. The hertz numbers are in the table. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -tipp: Drag **play a tone** into the structure chart five times. -tipp: The boxes are \`mbot.playTone(262, 300)\`, \`mbot.playTone(294, 300)\` and so on. -lösung: vb-tonleiter-loesung.visustruct -::: - -::: angeberwissen -The note A at 440 hertz is called **concert pitch**. Orchestras tune their instruments to it. One octave higher has exactly twice as many vibrations: 880 hertz. -::: - -## Now in Java: higher and higher - -In a for loop you can calculate with the counting variable. That way each tone is higher than the last: - -\`\`\`java -mbot.playTone(i * 200, 200); -\`\`\` - -::: übung vb-java-hoeher -titel: Higher and higher -code: java -auftrag: Write a for loop in Java in which \`i\` counts from 1 to 5. In each round the mBot2 plays a tone with \`i * 200\` hertz, 200 milliseconds long. -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -braucht: forSchleife -tipp: \`for (int i = 1; i <= 5; i++) { … }\` -tipp: The loop only contains \`mbot.playTone(i * 200, 200);\`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Showing feelings - -The mBot2 can also be happy, sad or sleepy. With **show a feeling** (\`mbot.emotion("smile")\`) it plays a little show: the LEDs light up, it makes a sound and wiggles a bit. - -| Text | Feeling | -|---|---| -| \`mbot.emotion("smile")\` | laughs | -| \`mbot.emotion("hello")\` | says hello | -| \`mbot.emotion("sad")\` | is sad | -| \`mbot.emotion("angry")\` | is angry | -| \`mbot.emotion("dizzy")\` | is dizzy | -| \`mbot.emotion("zzz")\` | sleeps | - -> Try it with the real mBot2. The simulator only shows the command. More feelings are listed under **Reference**. - -::: übung vb-fehler-16-lautsprecher -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Higher and higher", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-16-lautsprecher-start.visustruct -befehle: playTone 200 200, playTone 400 200, playTone 600 200, playTone 800 200, playTone 1000 200 -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be \`mbot.playTone(i * 200, 200)\`. -lösung: vb-java-hoeher-loesung.visustruct -::: - -## Game: From low to high - -::: spiel reihenfolge -titel: Game: From low to high -intro: Tap the answers in the right order. One wrong tap ends the round. Five rounds. - -runde: -frage: Tap the tones from low to high. -- \`mbot.playTone(262, 300)\` -- \`mbot.playTone(330, 300)\` -- \`mbot.playTone(440, 300)\` -- \`mbot.playTone(880, 300)\` -> The more hertz, the higher the tone. - -runde: -frage: Tap the tones from short to long. -- \`mbot.playTone(440, 100)\` -- \`mbot.playTone(440, 300)\` -- \`mbot.playTone(440, 1000)\` -- \`mbot.playTone(440, 2000)\` -> The second number is the length in milliseconds. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.playTone(i * 200, 200); - } -frage: Tap the tones in the order in which they sound. -- 600 hertz -- 400 hertz -- 200 hertz -> \`i\` counts down: 3, 2, 1. The tones get lower and lower. - -runde: -frage: Tap the tones from low to high. -- C at 262 hertz -- concert pitch A -- A one octave higher -> Concert pitch A has 440 hertz; one octave higher has twice as many: 880 hertz. - -runde: -frage: Tap the times from short to long. -- 300 milliseconds -- 1 second -- 1500 milliseconds -- 2 seconds -> 1 second is 1000 milliseconds, 2 seconds are 2000. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what the two numbers in \`playTone\` mean. → How high, how long? -- I can build a sequence of tones. → Scale in the structure chart -- I can calculate with the counting variable in Java. → Now in Java: higher and higher -- I can make the mBot2 show a feeling. → Showing feelings -::: - -## Quiz - -::: quiz -? Which tone is higher? -→ How high, how long? -- [x] \`mbot.playTone(880, 300)\` -- [ ] \`mbot.playTone(440, 300)\` -> More hertz means higher. -? How long does \`mbot.playTone(440, 1000)\` sound? -→ How high, how long? -- [ ] 440 seconds -- [x] 1 second -- [ ] 1000 seconds -> 1000 milliseconds are one second. -::: -`,jz=`--- -titel: Arrays and melodies -bereich: Light, sound and screen -kurz: Store many values in one array and work through them with a loop. ---- - -## Skills I will gain now - -::: kompetenzen -- create an array and play it with a loop -- use an array of texts in Java -- collect measurements in an array and work out the average -::: - -## A melody as an array - -A melody is a row of tones. Instead of five variables \`tone1\`, \`tone2\`, … you use an **array**. An array is a row of slots under **one** name: - -\`\`\`java -int[] tones = {262, 294, 330, 349, 392}; -\`\`\` - -- \`int[]\` means: an array of whole numbers. -- The slots are numbered from **0**. \`tones[0]\` is 262, \`tones[4]\` is 392. -- \`tones.length\` tells you how many slots there are, here 5. - -A for loop with \`i\` from 0 to \`tones.length - 1\` reaches every slot. - -::: übung vb-melodie -titel: Melody -auftrag: Create an array \`tones\` with the pitches 262, 294, 330, 349 and 392. A for loop plays them one after the other, each for 300 milliseconds. -befehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300 -braucht: forSchleife -tipp: \`int[] tones = {262, 294, 330, 349, 392}\` creates the array. -tipp: The loop runs from \`i = 0\` while \`i < tones.length\`. Inside is \`mbot.playTone(tones[i], 300)\`. -lösung: vb-melodie-loesung.visustruct -::: - -> If you want a different melody, you only change the array. The loop stays the same. - -## Now in Java: rainbow - -The five LEDs have the numbers 0 to 4, just like the slots of an array with five values. An array can hold texts too: \`String[] colours = {"red", "yellow"};\`. LED \`i\` then gets the colour from slot \`i\`: \`mbot.led(i).setColor(colours[i])\`. - -::: übung vb-farben -titel: Rainbow -code: java -auftrag: Write in Java: create an array \`colours\` with the texts \`"red"\`, \`"yellow"\`, \`"green"\`, \`"blue"\` and \`"purple"\`. A for loop gives every LED \`i\` the colour from \`colours[i]\`. -befehle: ledColor 0 "red", ledColor 1 "yellow", ledColor 2 "green", ledColor 3 "blue", ledColor 4 "purple" -braucht: forSchleife -tipp: \`String[] colours = {"red", "yellow", "green", "blue", "purple"};\` creates the array. -tipp: \`for (int i = 0; i < colours.length; i++) { mbot.led(i).setColor(colours[i]); }\` -lösung: vb-farben-loesung.visustruct -::: - -## Now in Java: measurement series - -Sensors never measure exactly. Hold your hand in front of the ultrasonic sensor: the number always jumps around a little. That is why professionals measure several times and work out the **average**. - -The measurements go into an array. \`new int[5]\` creates an array with five empty slots: - -\`\`\`java -int[] values = new int[5]; -for (int i = 0; i < values.length; i++) { - values[i] = mbot.getDistance(); - mbot.pause(100); -} -\`\`\` - -Then you add up all the values. For that you need a variable that starts at 0 and grows in every pass: - -\`\`\`java -int sum = 0; -for (int i = 0; i < values.length; i++) { - sum = sum + values[i]; -} -\`\`\` - -The average is the sum divided by the number of values. Write \`5.0\` instead of \`5\`, then Java calculates with decimal numbers: \`double average = sum / 5.0;\` - -::: übung vb-messreihe -titel: Measurement series -code: java -auftrag: Measure the distance five times into an array \`int[] values = new int[5]\`, with a 100 ms pause in between. Then add up all values, work out the average and show for example **Average: 40.0** on the screen. -messwerte: getDistance=40 -> screen "Average: 40.0" -messwerte: getDistance=25 -> screen "Average: 25.0" -braucht: forSchleife -tipp: Two for loops: the first fills the array with \`values[i] = mbot.getDistance();\`, the second calculates \`sum = sum + values[i];\`. -tipp: Then \`double average = sum / 5.0;\` and \`mbot.showText("Average: " + average);\`. -lösung: vb-messreihe-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Arrays"](?visustruct&lektion=15-arrays). It opens in a new window. - -::: übung vb-fehler-17-arrays-melodie -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Measurement series", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-17-arrays-melodie-start.visustruct -messwerte: getDistance=40 -> screen "Average: 40.0" -messwerte: getDistance=25 -> screen "Average: 25.0" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`sum = sum + values[i]\`. -lösung: vb-messreihe-loesung.visustruct -::: - -## Game: Which slot? - -::: spiel frage -titel: Game: Which slot? -intro: Slots are counted from 0. What is where in the array? Six rounds. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is \`tones[2]\`? -- 294 -- [x] 330 -- 349 -> Slot 0 is 262, slot 1 is 294, slot 2 is 330. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is \`tones.length\`? -- 4 -- [x] 5 -- 392 -> \`length\` counts the slots. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What is \`tones[tones.length - 1]\`? -- 349 -- [x] 392 -- an error -> \`tones.length - 1\` is 4, the last slot. - -runde: - int[] tones = {262, 294, 330, 349, 392}; -frage: What happens with \`mbot.playTone(tones[5], 300)\`? -- It plays 392 hertz. -- It plays nothing and carries on. -- [x] An error: there is no slot 5. -> The slots are numbered 0 to 4. Java reports an \`ArrayIndexOutOfBoundsException\`. - -runde: - String[] colours = {"red", "yellow", "green", "blue", "purple"}; - for (int i = 0; i < colours.length; i++) { - mbot.led(i).setColor(colours[i]); - } -frage: Which colour does LED 3 have? -- green -- [x] blue -- purple -> LED 3 gets \`colours[3]\`, the fourth word. - -runde: - int[] values = {20, 22, 18, 20, 20}; - int sum = 0; - for (int i = 0; i < values.length; i++) { - sum = sum + values[i]; - } - double average = sum / 5.0; -frage: What value does \`average\` have? -- 18.0 -- [x] 20.0 -- 100.0 -> The sum is 100, and 100 / 5.0 is 20.0. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - int[] tones = {262, 294, 330, 349, 392}; - for (int i = 0; i <= tones.length; i++) { - mbot.playTone(tones[i], 300); - } -frage: Should play all five tones. -fehler: 2 -besser: for (int i = 0; i < tones.length; i++) { -> With \`<=\` the loop also tries to play \`tones[5]\`. That slot doesn't exist. - -runde: - int[] tones = {262, 294, 330, 349, 392}; - for (int i = 0; i < tones.length; i++) { - mbot.playTone(tones, 300); - } -frage: Should play all five tones. -fehler: 3 -besser: mbot.playTone(tones[i], 300); -> One slot is played, \`tones[i]\`, not the whole array. - -runde: - String[] colours = {"red", "yellow", "green", "blue", "purple"}; - for (int i = 0; i < colours.length(); i++) { - mbot.led(i).setColor(colours[i]); - } -frage: Should give each LED a colour from the array. -fehler: 2 -besser: for (int i = 0; i < colours.length; i++) { -> Arrays have \`length\` without brackets. Only \`length()\` for Strings needs brackets. - -runde: - int[] values = new int[5]; - int sum = 0; - for (int i = 0; i < values.length; i++) { - sum = values[i]; - } -frage: Should add up all the measurements. -fehler: 4 -besser: sum = sum + values[i]; -> Like this, only the last value ends up in \`sum\`. The new value has to be added on. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can create an array and play it with a loop. → A melody as an array -- I can use an array of texts in Java. → Now in Java: rainbow -- I can collect measurements in an array and work out the average. → Now in Java: measurement series -::: - -## Quiz - -::: quiz -? What is \`tones[1]\` if \`int[] tones = {262, 294, 330};\`? -→ A melody as an array -- [ ] 262 -- [x] 294 -- [ ] 1 -> The slots count from 0. So slot 1 is the second one. -? How many slots does \`{262, 294, 330}\` have, so what is \`tones.length\`? -→ A melody as an array -- [ ] 2 -- [x] 3 -- [ ] 330 -> \`length\` counts the slots, here three. That is why the last slot has the number 2. -::: -`,Cz=`--- -titel: The screen -bereich: Light, sound and screen -kurz: Show text, numbers and sensor values on the CyberPi. ---- - -## Skills I will gain now - -::: kompetenzen -- show text on the screen -- show several texts one after the other -- show numbers and sensor values -- write a countdown in Java -::: - -## Showing text - -::: mbot2 -focus: screen -view: back -::: - -The CyberPi's colour [screen]{part=screen} is an actuator too. With **show text** you write something on it: - -\`\`\`java -mbot.showText("Hello!") -\`\`\` - -The text is in quotation marks, as with \`System.out.println\`. A new text replaces the old one. - -> In the simulation the text appears on the screen of the 3D model and below the world after 📺. - -## Greeting in the structure chart - -::: übung vb-begruessung -titel: Greeting -auftrag: The mBot2 first shows “Hello!”, waits 1000 milliseconds and then shows “I am VisuBot”. -befehle: showText "Hello!", pause 1000, showText "I am VisuBot" -tipp: Drag **show text** twice and **wait a moment** once into the structure chart. -tipp: \`mbot.showText("Hello!")\`, \`mbot.pause(1000)\`, \`mbot.showText("I am VisuBot")\`. -lösung: vb-begruessung-loesung.visustruct -::: - -## Numbers and sensor values - -Instead of text you can also show numbers and variables, and with \`+\` you join everything together: - -\`\`\`java -mbot.showText(i) -mbot.showText("Distance: " + mbot.getDistance()) -\`\`\` - -That way the mBot2 shows you what its sensors are measuring right now. - -## Now in Java: countdown - -::: übung vb-java-countdown -titel: Countdown -code: java -auftrag: Write a countdown in Java: a for loop counts \`i\` backwards from 3 to 1. In each round the mBot2 shows \`i\` and waits 1000 milliseconds. After that it shows “Go!”. -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Go!" -braucht: forSchleife -tipp: Counting backwards: \`for (int i = 3; i >= 1; i--) { … }\` -tipp: Inside the loop: \`mbot.showText(i);\` and \`mbot.pause(1000);\`. After the loop \`mbot.showText("Go!");\`. -lösung: vb-java-countdown-loesung.visustruct -::: - -::: übung vb-fehler-18-bildschirm -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Countdown", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-18-bildschirm-start.visustruct -befehle: showText "3", pause 1000, showText "2", pause 1000, showText "1", pause 1000, showText "Go!" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`mbot.showText(i)\`. -lösung: vb-java-countdown-loesung.visustruct -::: - -## Game: What's on the screen? - -::: spiel frage -titel: Game: What's on the screen? -intro: Read the code and predict what the screen shows at the end. Six rounds. - -runde: - mbot.showText("Hello!"); - mbot.pause(1000); - mbot.showText("I am VisuBot"); -frage: What is on the screen at the end? -- Hello! I am VisuBot -- [x] I am VisuBot -- Hello! -> A new text replaces the old one. - -runde: - mbot.showText("Distance: " + 25); -frage: What is on the screen? -- [x] Distance: 25 -- "Distance: " + 25 -- Distance: -> The \`+\` attaches the number to the text. - -runde: - int i = 3; - mbot.showText("i"); -frage: What is on the screen? -- 3 -- [x] i -- "i" -> In quotation marks, \`i\` is a text, not a variable. The quotation marks themselves don't appear. - -runde: - for (int i = 3; i >= 1; i--) { - mbot.showText(i); - mbot.pause(1000); - } - mbot.showText("Start!"); -frage: Which number is shown just before "Start!"? -- 0 -- [x] 1 -- 3 -> The countdown shows 3, 2, 1. At 0, \`i >= 1\` is false. - -runde: - mbot.showText("Sum: " + 2 + 3); -frage: What is on the screen? -- Sum: 5 -- [x] Sum: 23 -- Sum: 2 + 3 -> Java works from left to right: first the 2 is attached to the text, then the 3. - -runde: - mbot.showText("Sum: " + (2 + 3)); -frage: What is on the screen? -- [x] Sum: 5 -- Sum: 23 -- Sum: (2 + 3) -> Java works out the brackets first. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - mbot.showText("Hello!"); - mbot.pause(1); - mbot.showText("I am VisuBot"); -frage: Should show "Hello!", wait one second and then show "I am VisuBot". -fehler: 2 -besser: mbot.pause(1000); -> \`pause\` counts in milliseconds. One second is 1000. - -runde: - for (int i = 3; i >= 1; i++) { - mbot.showText(i); - mbot.pause(1000); - } -frage: Countdown: should show 3, 2, 1. -fehler: 1 -besser: for (int i = 3; i >= 1; i--) { -> Counting down means \`i--\`. With \`i++\` the loop never stops. - -runde: - mbot.showText(Hello!); -frage: Should show "Hello!". -fehler: 1 -besser: mbot.showText("Hello!"); -> Text goes in quotation marks. - -runde: - mbot.showText("Distance: " - mbot.getDistance()); -frage: Should show for example "Distance: 25". -fehler: 1 -besser: mbot.showText("Distance: " + mbot.getDistance()); -> You join text and number with \`+\`. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can show text on the screen. → Showing text -- I can show several texts one after the other. → Greeting in the structure chart -- I can show numbers and sensor values. → Numbers and sensor values -- I can write a countdown in Java. → Now in Java: countdown -::: - -## Quiz - -::: quiz -? What does \`mbot.showText("Distance: " + 25)\` show? -→ Numbers and sensor values -- [x] Distance: 25 -- [ ] "Distance: " + 25 -- [ ] 25 -> The \`+\` adds the number to the text. -? What happens to the old text when you show a new one? -→ Showing text -- [x] It is replaced. -- [ ] The new one appears below it. -::: -`,Dz=`--- -titel: Strings -bereich: Light, sound and screen -kurz: Work with texts, pick out letters and show them on the screen. ---- - -## Skills I will gain now - -::: kompetenzen -- work with \`length()\` and \`substring(…)\` -- join texts and numbers with \`+\` -- get single characters with \`charAt(…)\` -::: - -## Letter by letter - -In Java a text is called a **string** or \`String\`. It consists of single characters, numbered from **0** just like an array: - -| Character | V | i | s | u | B | o | t | -|---|---|---|---|---|---|---|---| -| Number | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - -- \`word.length()\` gives the number of characters, here 7. -- \`word.substring(0, 3)\` gives the first 3 characters: \`"Vis"\`. - -The mBot2 should build its name on the [screen]{part=screen}: first **V**, then **Vi**, then **Vis** and so on up to **VisuBot**. - -::: übung vb-buchstaben -titel: Build the name -auftrag: Create \`String word = "VisuBot"\`. A for loop counts \`i\` from 1 to \`word.length()\`. Inside, the mBot2 shows \`word.substring(0, i)\` and waits 300 milliseconds. -befehle: showText "V", pause 300, showText "Vi", pause 300, showText "Vis", pause 300, showText "Visu", pause 300, showText "VisuB", pause 300, showText "VisuBo", pause 300, showText "VisuBot", pause 300 -braucht: forSchleife -tipp: The loop starts at \`int i = 1\` and runs as long as \`i <= word.length()\`. -tipp: Inside the loop: \`mbot.showText(word.substring(0, i))\` and \`mbot.pause(300)\`. -lösung: vb-buchstaben-loesung.visustruct -::: - -## Now in Java: text and length - -With \`+\` you join texts and numbers. This way the mBot2 shows a text followed by its length. - -::: übung vb-java-textlaenge -titel: How long is the text? -code: java -auftrag: Write in Java: create \`String text = "Hello class"\`. The mBot2 shows the text and its length in brackets, so **Hello class (11)**. -befehle: showText "Hello class (11)" -tipp: \`text.length()\` gives the length. The space counts too. -tipp: \`mbot.showText(text + " (" + text.length() + ")");\` -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Now in Java: scrolling text - -\`word.charAt(i)\` gives the character with the number \`i\`. If you show the characters one after the other with a pause, the word runs across the screen letter by letter: - -\`\`\`java -String word = "Ludwig"; -for (int i = 0; i < word.length(); i++) { - mbot.showText(word.charAt(i)); - mbot.pause(500); -} -\`\`\` - -| Pass | \`i\` | Screen | -|---|---|---| -| 1 | 0 | L | -| 2 | 1 | u | -| 3 | 2 | d | - -::: übung vb-laufschrift -titel: Ludwig backwards -code: java -auftrag: Create \`String word = "Ludwig"\`. Show the word **backwards** letter by letter on the screen, so g, i, w, d, u, L, with a 500 ms pause after each letter. -befehle: showText "g", pause 500, showText "i", pause 500, showText "w", pause 500, showText "d", pause 500, showText "u", pause 500, showText "L", pause 500 -braucht: forSchleife -tipp: The last character has the number \`word.length() - 1\`. The loop counts backwards: \`for (int i = word.length() - 1; i >= 0; i--)\`. -tipp: Inside the loop: \`mbot.showText(word.charAt(i));\` and \`mbot.pause(500);\`. -lösung: vb-laufschrift-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Strings"](?visustruct&lektion=17-zeichenketten). It opens in a new window. - -::: übung vb-fehler-19-zeichenketten -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "How long is the text?", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-19-zeichenketten-start.visustruct -befehle: showText "Hello class (11)" -tipp: The error message names an unknown variable. What is the variable called where it is created? Java is case-sensitive. -tipp: It should be \`mbot.showText(text +\`. -lösung: vb-java-textlaenge-loesung.visustruct -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Read what the mBot2 should show and tap the wrong line before time runs out. Five rounds, 30 seconds each. -zeit: 30 - -runde: - String word = "VisuBot"; - for (int i = 1; i <= word.length(); i++) { - mbot.showText(word.substring(1, i)); - mbot.pause(300); - } -frage: Should show V, Vi, Vis and so on up to VisuBot. -fehler: 3 -besser: mbot.showText(word.substring(0, i)); -> The first character has the number 0. With \`substring(1, i)\` the V is missing. - -runde: - String text = "Hello class"; - mbot.showText(text + " (" + text.length + ")"); -frage: Should show **Hello class (11)**. -fehler: 2 -besser: mbot.showText(text + " (" + text.length() + ")"); -> For a String, \`length()\` is a method and needs brackets. Only arrays have \`length\` without brackets. - -runde: - String word = "Ludwig"; - for (int i = 0; i <= word.length(); i++) { - mbot.showText(word.charAt(i)); - mbot.pause(500); - } -frage: Should show L, u, d, w, i, g. -fehler: 2 -besser: for (int i = 0; i < word.length(); i++) { -> The last character has the number 5. At \`i = 6\` there is no character left. - -runde: - String word = "Ludwig"; - for (int i = word.length(); i >= 0; i--) { - mbot.showText(word.charAt(i)); - mbot.pause(500); - } -frage: Should show the word backwards: g, i, w, d, u, L. -fehler: 2 -besser: for (int i = word.length() - 1; i >= 0; i--) { -> Backwards you start at the last character, and that has the number \`word.length() - 1\`. - -runde: - String name = 'Ludwig'; - mbot.showText("Hello " + name); -frage: Should show **Hello Ludwig**. -fehler: 1 -besser: String name = "Ludwig"; -> Texts go in double quotation marks. Single ones are only for a single character (\`char\`). -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 8 6 LED: the mBot2 has five of these little lights -- ↓ 2 7 MILLISECOND: a thousandth of a second -- → 11 2 SCREEN: mbot.showText shows a text on it -- ↓ 4 4 ACTUATOR: a part that does something, e.g. light up -- → 4 1 ARRAY: a row of slots under one name -- → 9 1 HERTZ: unit of pitch: vibrations per second -- ↓ 1 1 SPEAKER: mbot.playTone plays a tone through it -- → 1 1 STRING: a text in Java -lösung: 7 7, 10 7, 7 4, 11 7, 12 7 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can work with \`length()\` and \`substring(…)\`. → Letter by letter -- I can join texts and numbers with \`+\`. → Now in Java: text and length -- I can get single characters with \`charAt(…)\`. → Now in Java: scrolling text -::: - -## Quiz - -::: quiz -? What does \`"VisuBot".substring(0, 4)\` give? -→ Letter by letter -- [ ] \`"VisuB"\` -- [x] \`"Visu"\` -- [ ] \`"uBot"\` -> \`substring(0, 4)\` takes the characters 0, 1, 2 and 3, so four of them. -? What does \`"Ludwig".charAt(0)\` give? -→ Now in Java: scrolling text -- [x] \`L\` -- [ ] \`u\` -- [ ] \`g\` -> Characters are counted from 0. Character 0 is the first one. -::: -`,Bz=`--- -titel: Motors and speed -bereich: Motors and methods -kurz: Step on the gas, steer and follow a line. ---- - -## Skills I will gain now - -::: kompetenzen -- step on the gas with wheels separately and stop -- drive until a sensor reports something -- write a line follower in Java -::: - -## Two motors, two wheels - -::: mbot2 -focus: motors, wheels -view: bottom -::: - -The mBot2 has two [motors]{part=motors}, each drives one [wheel]{part=wheels}. So far you have used **move forward** and **turn right**. These commands drive a fixed distance and wait until the mBot2 has arrived. - -With **wheels separately** (\`mbot.drive(left, right)\`) you step on the gas instead: you say how strongly each wheel turns, in percent from −100 to 100. The mBot2 then **keeps going** until you tell it something else. With **stop** (\`mbot.stop()\`) it stops. - -| Command | What happens? | -|---|---| -| \`mbot.drive(40, 40)\` | both wheels equally fast: straight ahead | -| \`mbot.drive(-40, -40)\` | backwards | -| \`mbot.drive(10, 40)\` | right faster: curve to the left | -| \`mbot.drive(40, -40)\` | wheels against each other: turns right on the spot | -| \`mbot.stop()\` | stop | - -> In the simulator \`mbot.drive(100, 100)\` drives 20 cm per second. Try it in the [simulation](#zeige-simulation). - -## Full speed to the wall in the structure chart - -In lesson 5 the mBot2 drove to the wall in steps of 10 cm. With **wheels separately** it works without jerking: step on the gas once, wait until the wall is close, then stop. - -::: übung vb-gas-bis-wand -titel: Full speed to the wall -auftrag: The mBot2 steps on the gas with 50 %. As long as the wall is more than 15 cm away, it waits a moment. Then it stops. There are three worlds. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: At the top is \`mbot.drive(50, 50)\`. Below it a while loop with the condition \`mbot.getDistance() > 15\`. -tipp: Inside the loop is only **wait a moment**. The mBot2 keeps driving meanwhile! After the loop is **stop**. -lösung: vb-gas-bis-wand-loesung.visustruct -::: - -## The line follower - -::: mbot2 -focus: lineSensor -view: bottom -::: - -A classic: the mBot2 follows a black line on the floor. For this it looks at the two middle probes of the [line sensor]{part=lineSensor}: - -| Sensor | Text | -|---|---| -| left middle probe sees black | \`mbot.isLineLeft()\` | -| right middle probe sees black | \`mbot.isLineRight()\` | - -The idea: if **both** see the line, it drives straight ahead. If only the **left** one sees it, the line has moved to the left: it steers left, so the right wheel turns faster. If only the **right** one sees it, it steers right. - -## Now in Java: line follower - -::: übung vb-java-linienfolger -titel: Line follower -code: java -auftrag: Write a line follower in Java. As long as the wall is more than 15 cm away, the mBot2 checks its two probes and steers. Then it stops. In the first world the line bends to the right, in the second to the left. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: \`while (mbot.getDistance() > 15) { … }\` and after it \`mbot.stop();\`. -tipp: Inside the loop: \`if (mbot.isLineLeft() && mbot.isLineRight()) { mbot.drive(40, 40); } else if (mbot.isLineLeft()) { mbot.drive(10, 40); } else if (mbot.isLineRight()) { mbot.drive(40, 10); }\` -lösung: vb-java-linienfolger-loesung.visustruct -::: - -> For the real mBot2, stick the line with black insulating tape on a light floor. Drive slowly at first, otherwise it shoots past the line in the curve. - -::: übung vb-fehler-20-motoren -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Line follower", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-20-motoren-start.visustruct -welt: linie-1, linie-2 -tipp: Read the error message carefully. In which box does the simulation stop? Java is case-sensitive. -tipp: It should be \`mbot.stop()\`. -lösung: vb-java-linienfolger-loesung.visustruct -::: - -## Game: Where does it go? - -::: spiel frage -titel: Game: Where does it go? -intro: Power for left and right in percent: where does the mBot2 go? Seven rounds. -antworten: straight ahead | backwards | curve to the left | curve to the right | turns on the spot - -runde: - mbot.drive(40, 40); -frage: Where does it go? -richtig: straight ahead -> Both wheels turn at the same speed. - -runde: - mbot.drive(-40, -40); -frage: Where does it go? -richtig: backwards -> Minus means backwards, and both wheels are the same. - -runde: - mbot.drive(10, 40); -frage: Where does it go? -richtig: curve to the left -> The right wheel is faster, so it steers to the left. - -runde: - mbot.drive(40, 10); -frage: Where does it go? -richtig: curve to the right -> The left wheel is faster, so it steers to the right. - -runde: - mbot.drive(40, -40); -frage: Where does it go? -richtig: turns on the spot -> One wheel forward, one back: it turns right without moving from the spot. - -runde: - mbot.drive(-40, 40); -frage: Where does it go? -richtig: turns on the spot -> This time it turns to the left. - -runde: - if (mbot.isLineLeft() && !mbot.isLineRight()) { - ... - } -frage: Line follower: only the left sensor sees the line. What goes in the gap? -- \`mbot.drive(40, 10);\` -- [x] \`mbot.drive(10, 40);\` -- \`mbot.stop();\` -> The line has moved to the left. It steers to the left, so the right wheel turns faster. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can step on the gas with wheels separately and stop. → Two motors, two wheels -- I can drive until a sensor reports something. → Full speed to the wall in the structure chart -- I can write a line follower in Java. → Now in Java: line follower -::: - -## Quiz - -::: quiz -? What does \`mbot.drive(30, 30)\` do? -→ Two motors, two wheels -- [ ] It drives 30 cm and stops. -- [x] It drives straight ahead and does not stop until another driving command comes. -- [ ] It turns by 30°. -> **wheels separately** only steps on the gas. You have to stop it yourself. -? The mBot2 should steer to the right. Which command fits? -→ Two motors, two wheels -- [ ] \`mbot.drive(10, 40)\` -- [x] \`mbot.drive(40, 10)\` -- [ ] \`mbot.drive(-40, -40)\` -> If the left wheel turns faster, it drives a right curve. -::: -`,Pz=`--- -titel: Stopwatch and battery -bereich: Motors and methods -kurz: Measure time and keep an eye on the battery. ---- - -## Skills I will gain now - -::: kompetenzen -- reset the stopwatch and read it -- drive for a certain time -- show the battery level -::: - -## The stopwatch - -::: mbot2 -focus: cyberpi -view: top -::: - -A stopwatch runs inside the [CyberPi]{part=cyberpi}. It counts the seconds since the program started. With **reset stopwatch** (\`mbot.resetTimer()\`) it starts again at 0. - -| Sensor or command | Text | Value | -|---|---|---| -| reset stopwatch | \`mbot.resetTimer()\` | | -| stopwatch | \`mbot.getTimer()\` | seconds with a decimal place, e.g. \`1.5\` | - -This is how you drive for a certain time: reset the stopwatch, step on the gas, wait as long as the stopwatch is not far enough yet, stop. - -## Driving two seconds in the structure chart - -::: übung vb-zwei-sekunden -titel: Two seconds -auftrag: The mBot2 resets the stopwatch and steps on the gas with 50 %. As long as the stopwatch is below 2 seconds, it waits a moment. Then it stops. With 50 % it manages 10 cm per second, so it must stop 20 cm further on. -welt: zeit-1 -braucht: whileSchleife -tipp: At the top are **reset stopwatch** and \`mbot.drive(50, 50)\`. Below it a while loop with \`mbot.getTimer() < 2\`. -tipp: Inside the loop is **wait a moment**, after the loop **stop**. -lösung: vb-zwei-sekunden-loesung.visustruct -::: - -## The battery - -::: mbot2 -focus: shield -view: top -::: - -Under the transparent [shield]{part=shield} you see the battery. How full it is comes from \`mbot.getBattery()\` in percent: \`100\` is completely full. When it is almost empty, the motors get weaker. Then it is time to charge. - -::: angeberwissen -Your phone does not measure its battery directly in percent either. It measures the voltage: a full lithium battery has a little over 4 volts, an empty one just over 3. From that it calculates the percentage, just like the CyberPi. -::: - -## Now in Java: battery display - -::: übung vb-java-akku -titel: Battery display -code: java -auftrag: Write in Java: the mBot2 shows for example **Battery: 80 %** on the screen. If the battery is below 20 %, the LEDs also light up red. -messwerte: getBattery=80 -> none, ledOff, screen "Battery: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Battery: 15 %" -braucht: verzweigung -tipp: \`mbot.showText("Battery: " + mbot.getBattery() + " %");\` puts the text together from three parts. -tipp: After it: \`if (mbot.getBattery() < 20) { mbot.setLed(255, 0, 0); }\` -lösung: vb-java-akku-loesung.visustruct -::: - -::: übung vb-fehler-21-stoppuhr-akku -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Battery display", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-21-stoppuhr-akku-start.visustruct -messwerte: getBattery=80 -> none, ledOff, screen "Battery: 80 %" -messwerte: getBattery=15 -> none, ledOn, screen "Battery: 15 %" -tipp: Count the numbers in the brackets. How many does the command need? You can find it under **Reference**. -tipp: It should be \`mbot.setLed(255, 0, 0)\`. -lösung: vb-java-akku-loesung.visustruct -::: - -## Game: Stopwatch and battery - -::: spiel frage -titel: Game: Stopwatch and battery -intro: Read the code and predict what happens. Five rounds. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: How long does the mBot2 drive? -- 0.1 seconds -- [x] 2 seconds -- until it reaches the wall -> It waits until the stopwatch shows 2 seconds, then it stops. - -runde: - mbot.resetTimer(); - mbot.drive(50, 50); - while (mbot.getTimer() < 2) { - mbot.pause(100); - } - mbot.stop(); -frage: At 50 % it manages 10 cm per second. How far does it drive? -- 10 cm -- [x] 20 cm -- 50 cm -> 2 seconds times 10 cm per second is 20 cm. - -runde: - mbot.pause(3000); - mbot.resetTimer(); - mbot.pause(1000); - mbot.showText(mbot.getTimer()); -frage: Roughly which number does the screen show? -- 0 -- [x] 1 -- 4 -> After \`mbot.resetTimer()\` the stopwatch starts again at 0. After that only 1 second passes. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Battery: " + mbot.getBattery() + " %"); -frage: The battery has 15 % left. What happens? -- Only the screen shows **Battery: 15 %**. -- Only the LEDs light up red. -- [x] The screen shows **Battery: 15 %**, and the LEDs light up red. -> 15 is less than 20. The display is below the branch and always comes. - -runde: - if (mbot.getBattery() < 20) { - mbot.setLed(255, 0, 0); - } - mbot.showText("Battery: " + mbot.getBattery() + " %"); -frage: The battery has 80 %. What happens? -- [x] Only the screen shows **Battery: 80 %**. -- Only the LEDs light up red. -- Nothing at all. -> 80 is not less than 20, so the LEDs stay off. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can reset the stopwatch and read it. → The stopwatch -- I can drive for a certain time. → Driving two seconds in the structure chart -- I can show the battery level. → Now in Java: battery display -::: - -## Quiz - -::: quiz -? What does \`mbot.getTimer()\` give right after \`mbot.resetTimer()\`? -→ The stopwatch -- [x] 0 -- [ ] 100 -- [ ] The time of day -> The stopwatch starts again at 0. -? Why does the mBot2 only wait **a moment** in the loop instead of stopping? -→ Driving two seconds in the structure chart -- [ ] Because otherwise the loop does not start. -- [x] Because it should keep driving until the time is up. -- [ ] Because otherwise the stopwatch stops. -> Stepping on the gas still applies while it waits. -::: -`,Oz=`--- -titel: States: what am I doing right now? -bereich: Motors and methods -kurz: Switch a robo traffic light on with a state variable and a switch. ---- - -## Skills I will gain now - -::: kompetenzen -- explain what a state is -- act depending on the state with a switch and change to the next state -- tell states apart in Java with names and \`.equals\` -::: - -## What is a state? - -A traffic light is always in exactly one **state**: red, green or yellow. In each state it knows two things: what do I show? And what comes next? - -Our robo traffic light has three states. Each gets a number: - -| State | LEDs | next | -|---|---|---| -| 0 | red | 1 | -| 1 | green | 2 | -| 2 | yellow | 0 | - -You store the current state in a variable: \`int state = 0\`. A variable like this is called a **state variable**. A program that jumps from state to state like this is called a **state machine**. - -> A real traffic light in Germany has four states: red, red-yellow, green, yellow. Our robo traffic light leaves out red-yellow. - -::: angeberwissen -A robot vacuum is a state machine too: vacuuming, avoiding, driving back to the charging station. I only have two states: eating and sleeping. -::: - -## The robo traffic light in the structure chart - -The switch fits perfectly: there is one case for each state. Each case has two boxes: what do I do? And which state comes next? - -::: übung vb-ampel-zustand -titel: Robo traffic light -auftrag: Build a structure chart: create \`int state = 0\`. A for loop runs six times. Inside it is a switch on \`state\`. Case 0: LEDs red, \`state = 1\`. Case 1: LEDs green, \`state = 2\`. Otherwise: LEDs yellow, \`state = 0\`. After the switch the mBot2 waits one second. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, fallauswahl -tipp: You will find the switch among the Elements. Write \`state\` into it. The cases are called 0, 1 and default. -tipp: The colours are \`mbot.setLed(255, 0, 0)\` for red, \`mbot.setLed(0, 255, 0)\` for green and \`mbot.setLed(255, 200, 0)\` for yellow. Below the switch, still inside the loop, is \`mbot.pause(1000)\`. -lösung: vb-ampel-zustand-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Switch"](?visustruct&lektion=10-fallauswahl). It opens in a new window. - -## Now in Java: states with names - -Numbers are easy to forget. What was state 2 again? Names are easier to read. Then the state is a text: - -\`\`\`java -String state = "red"; -... -if (state.equals("red")) { - mbot.setLed(255, 0, 0); - state = "green"; -} else if (state.equals("green")) { - ... -\`\`\` - -In Java you compare texts with \`.equals("…")\`, not with \`==\`. - -::: übung vb-java-ampel-text -titel: Traffic light with names -code: java -auftrag: Write the robo traffic light in Java with \`String state = "red";\`. Use \`if\` and \`else if\` to check which state the light is in: red, then green, then yellow, then red again. The loop runs six times, with a 1 second pause after each pass. -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -braucht: forSchleife, verzweigung -tipp: Inside the loop: \`if (state.equals("red")) { … } else if (state.equals("green")) { … } else { … }\` and then \`mbot.pause(1000);\`. -tipp: In the red case are \`mbot.setLed(255, 0, 0);\` and \`state = "green";\`. Green switches to \`"yellow"\`, yellow back to \`"red"\`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -::: übung vb-fehler-21-zustaende -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Traffic light with names", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-21-zustaende-start.visustruct -befehle: 2 x (setLed 255 0 0, pause 1000, setLed 0 255 0, pause 1000, setLed 255 200 0, pause 1000) -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be \`state = "green"\`. -lösung: vb-java-ampel-text-loesung.visustruct -::: - -## States while driving - -The mBot2 can also drive with states. In the state **drive** it drives forward. When it sees a wall, it changes to the state **turn**. There it turns once and changes back to **drive**. - -::: diagramm vb-l21z-ausweichen.visustruct -Driving and avoiding with two states. Open the diagram in the editor and try it out in a world. -::: - -## Game: which state comes now? - -::: spiel frage -titel: Game: which state comes now? -intro: The robo traffic light switches: 0 red → 1 green → 2 yellow → 0 red. Which state comes next? Five rounds. -frage: Which state comes next? -antworten: 0 | 1 | 2 - -runde: -frage: The light is in state **0** (red) right now. -richtig: 1 -> After red comes green. - -runde: -frage: The light is in state **2** (yellow) right now. -richtig: 0 -> After yellow it starts all over again. - -runde: -frage: The light is in state **1** (green) right now. -richtig: 2 -> After green comes yellow. - -runde: -frage: The light starts in state 0 and switches on **twice**. -richtig: 2 -> 0 → 1 → 2. - -runde: -frage: The light starts in state 0 and switches on **three times**. -richtig: 0 -> 0 → 1 → 2 → 0. After three steps it is back at the start. -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can explain what a state is. → What is a state? -- I can act depending on the state with a switch and change to the next state. → The robo traffic light in the structure chart -- I can tell states apart in Java with names and \`.equals\`. → Now in Java: states with names -::: - -## Quiz - -::: quiz -? What does a state variable store? -→ What is a state? -- [ ] How often the loop has run -- [x] What the program is doing right now, for example red or green -- [ ] The biggest reading -? What is in each case of the switch? -→ The robo traffic light in the structure chart -- [x] What to do and which state comes next -- [ ] Only a pause -- [ ] A new loop -? How do you check in Java whether \`state\` contains the text \`"red"\`? -→ Now in Java: states with names -- [ ] \`state == red\` -- [x] \`state.equals("red")\` -- [ ] \`state = "red"\` -> You compare texts with \`.equals\`. A single \`=\` would assign \`"red"\`. -::: -`,Mz=`--- -titel: Your own methods -bereich: Motors and methods -kurz: Write and call your own commands with parameters and return values. ---- - -## Skills I will gain now - -::: kompetenzen -- build and call a subprogram with a parameter -- recognise methods in Java -- recognise and call an overloaded method -- write a method with a return value -::: - -## A subprogram for the square - -The mBot2 can already drive a square. Now it should drive two squares of different sizes. Instead of building the loop twice, you write a **subprogram**. In Java it is called a **method**. It is a command of your own that you can call as often as you like. - -The header \`void square(int side)\` says: - -- \`void\`: the method gives no result back, it only **does** something. -- \`square\`: that is the name of your new command. -- \`int side\`: when you call it, you pass a number, the **parameter**. - -::: übung vb-quadrat-methode -titel: Two squares -auftrag: Build a subprogram \`void square(int side)\` that drives a square with side length \`side\`. The main program calls it twice: first with 30, then with 50. -fahrt: 4 x (forward 30, turnRight), 4 x (forward 50, turnRight) -braucht: aufruf -tipp: Create a new tab with **+** and give it the title \`void square(int side)\`. Inside is a for loop that runs \`mbot.forward(side)\` and \`mbot.turnRight()\` four times. -tipp: The main program contains two call boxes: \`square(30)\` and \`square(50)\`. -lösung: vb-quadrat-methode-loesung.visustruct -unterprogramm: vb-quadrat-unterprogramm-loesung.visustruct -::: - -## Methods in Java - -In Java every method lives in a class. The program always starts in the method \`main\`. From there \`square\` is called: - -\`\`\`java -public class Squares { - public static void main(String[] args) { - square(30); - square(50); - } - - static void square(int side) { - for (int i = 0; i < 4; i++) { - mbot.forward(side); - mbot.turnRight(); - } - } -} -\`\`\` - -In [Code](#zeige-codelive) you see each method in its own tab, just like in the structogram. - -::: quiz -? What does \`void\` mean in \`void square(int side)\`? -→ Methods in Java -- [ ] The method has no parameter. -- [x] The method gives no result back. -- [ ] The method may only be called once. -> \`void\` means "empty": no value comes back. The parameter is in the brackets. -? With which value for \`side\` does \`square(50)\` run? -→ A subprogram for the square -- [ ] 30 -- [x] 50 -- [ ] with none -> The value in the brackets of the call becomes the parameter \`side\`. -::: - -## Same name, different parameters: overloading - -You know \`mbot.forward()\` and \`mbot.forward(30)\`. These are **two different methods with the same name**. Java can tell from the call which one is meant: by the **number** and the **type** of the parameters. This is called **overloading**. - -There is a third \`forward\` method. It has two parameters: a number and a **unit** as text. - -\`\`\`java -mbot.forward(); // 10 cm (default) -mbot.forward(30); // 30 cm -mbot.forward(30, "cm"); // 30 cm, unit written out -mbot.forward(2, "rotations"); // the wheels turn twice -\`\`\` - -One wheel rotation is as far as the wheel's circumference: π · 6.5 cm ≈ 20.4 cm. So two rotations are about 40.8 cm. \`mbot.backward\` has the same three versions. - -These are the three headers. The method name is the same, the parameter lists are different: - -\`\`\`java -void forward() -void forward(int cm) -void forward(int value, String unit) -\`\`\` - -You already know overloading: \`System.out.println\` exists for \`int\`, for \`double\`, for \`String\` and more. That is why you can simply put any of these values in the brackets. - -::: angeberwissen -Are the 20.4 cm really true for **your** mBot2? Professionals don't trust a number they haven't measured. Measure the wheel diameter and run \`mbot.forward(5, "rotations")\`: the expected distance is 102.1 cm. This is how software systems are tested: every **test case** has an expected result and an actual (measured) result. You test several times and write everything into a **test record**. Here is your [test record to print (PDF)](https://visubot.visucode.de/test-record-wheel-rotation.pdf). Give it to your teacher, so they can see whether all robots drive the same distance. -::: - -::: übung vb-ueberladung-umdrehung -titel: Square with rotations -auftrag: Drive a square in which every side is exactly **one wheel rotation** long. Use the overloaded method \`mbot.forward(1, "rotations")\`. -fahrt: 4 x (forward 20.42, turnRight) -braucht: forSchleife -tipp: A for loop with \`int i = 0\`, \`i < 4\`, \`i++\`. -tipp: Inside are \`mbot.forward(1, "rotations")\` and \`mbot.turnRight()\`. -lösung: vb-ueberladung-umdrehung-loesung.visustruct -::: - -::: übung vb-java-rechteck-umdrehungen -titel: Rectangle with rotations -code: java -auftrag: Write in Java: the mBot2 drives a rectangle. The long sides are **two** wheel rotations long, the short ones **one**. Use \`mbot.forward(2, "rotations")\` and \`mbot.forward(1, "rotations")\`. -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -braucht: forSchleife -tipp: A for loop that runs twice: \`for (int i = 0; i < 2; i++) { … }\`. -tipp: Inside the loop: \`mbot.forward(2, "rotations");\`, \`mbot.turnRight();\`, \`mbot.forward(1, "rotations");\`, \`mbot.turnRight();\` -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -::: quiz -? Which method does \`mbot.forward(3, "rotations")\` call? -→ Same name, different parameters: overloading -- [ ] \`forward()\` -- [ ] \`forward(int cm)\` -- [x] \`forward(int value, String unit)\` -> Java picks the version whose parameters fit: two parameters, a number and a text. -::: - -## A method with a return value - -A method can also **work something out** and give the result back. Instead of \`void\`, the header then has the data type of the result, and \`return\` gives the value back: - -\`\`\`java -static int centimetres(int rotations) { - return rotations * 20; -} -\`\`\` - -One wheel rotation is about 20 cm. So the call \`int distance = centimetres(3);\` puts 60 into \`distance\`. - -::: übung vb-zentimeter -titel: Rotations into centimetres -auftrag: Build a subprogram \`int centimetres(int rotations)\` that returns \`rotations * 20\`. The main program calls it with 3, drives the distance and shows **Distance: 60 cm** on the screen. -fahrt: forward 60 -befehle: showText "Distance: 60 cm" -braucht: aufruf -tipp: A new tab with the title \`int centimetres(int rotations)\`. One statement is enough inside: \`return rotations * 20\`. -tipp: In the main program: call \`int distance = centimetres(3)\`, then \`mbot.forward(distance)\` and \`mbot.showText("Distance: " + distance + " cm")\`. -lösung: vb-zentimeter-loesung.visustruct -unterprogramm: vb-zentimeter-unterprogramm-loesung.visustruct -::: - -> 📘 **More without the robot:** VisuStruct has the lesson ["Call and break"](?visustruct&lektion=18-aufruf-und-aussprung). It opens in a new window. - -::: übung vb-fehler-22-eigene-methoden -titel: Why doesn't it run? -code: java -auftrag: Ludwig typed in "Rectangle with rotations", but the program does not run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-22-eigene-methoden-start.visustruct -fahrt: 2 x (forward 40.84, turnRight, forward 20.42, turnRight) -tipp: A text belongs in quotation marks. Without them Java looks for a variable with that name. -tipp: It should be \`mbot.forward(1, "rotations")\`. -lösung: vb-java-rechteck-umdrehungen-loesung.visustruct -::: - -## Game: Which method? - -::: spiel frage -titel: Game: Which method? -intro: Same name, different parameters: which method does Java call, and what comes out? Six rounds. - -runde: - mbot.forward(30, "cm"); -frage: Which \`forward\` method runs? -- \`forward()\` -- \`forward(int cm)\` -- [x] \`forward(int value, String unit)\` -> Two parameters, a number and a text: that only fits the third one. - -runde: - mbot.forward(); -frage: How far does the mBot2 drive? -- [x] 10 cm -- not at all, the number is missing -- one wheel rotation -> Without a parameter, \`forward\` drives 10 cm. That is the version with no parameters. - -runde: - mbot.forward(2, "rotations"); -frage: Roughly how far does the mBot2 drive? -- 2 cm -- 20 cm -- [x] 41 cm -> One wheel rotation is about 20.4 cm, so two are about 40.8 cm. - -runde: - static int centimetres(int rotations) { - return rotations * 20; - } -frage: What does \`centimetres(4)\` give? -- 4 -- 24 -- [x] 80 -> The parameter \`rotations\` is 4, and \`return\` gives back 4 · 20. - -runde: - public static void main(String[] args) { - square(30); - square(50); - } -frage: How many squares does the mBot2 drive, and how big is the second one? -- one with 80 cm -- [x] two, the second with 50 cm sides -- two, both with 30 cm sides -> Each call drives one square. The value in the brackets becomes \`side\`. - -runde: -frage: Which header fits a method that gives back a number? -- \`void centimetres(int rotations)\` -- [x] \`int centimetres(int rotations)\` -- \`centimetres(int rotations)\` -> The data type of the result comes before the name. \`void\` means: no result. -::: - -## Game: Defuse the bomb - -::: spiel bombe -titel: Game: Defuse the bomb -intro: Every program contains **exactly one mistake**, and the bomb is ticking. Tap the wrong line before time runs out. Four rounds, 30 seconds each. -zeit: 30 - -runde: - static void square(int side) { - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } - } -frage: Should drive a square with sides of length \`side\`. -fehler: 3 -besser: mbot.forward(side); -> With \`30\` every square is the same size, whatever you pass in. - -runde: - static void centimetres(int rotations) { - return rotations * 20; - } -frage: Should give back the distance in cm. -fehler: 1 -besser: static int centimetres(int rotations) { -> A method that gives something back needs the data type of the result instead of \`void\`. - -runde: - static int centimetres(int rotations) { - int cm = rotations * 20; - } -frage: Should give back the distance in cm. -fehler: 2 -besser: return rotations * 20; -> The method calculates but gives nothing back. \`return\` is missing. - -runde: - mbot.forward(2, rotations); -frage: Should drive two wheel rotations. -fehler: 1 -besser: mbot.forward(2, "rotations"); -> The unit is a text and needs quotation marks. -::: - -## Game: Terms crossword - -::: spiel kreuzwort -titel: Game: Terms crossword -intro: Fill in the crossword with the technical terms from this part. Click a clue to jump to its word. The yellow fields spell the answer word. -- → 7 1 PARAMETER: value you write in the brackets when you call a method -- ↓ 5 7 METHOD: your own command with a name, e.g. square(30) -- ↓ 1 4 OVERLOADING: same method name, different parameters -- ↓ 2 9 BATTERY: mbot.getBattery() tells you how full it is -- → 2 4 VOID: in the header: the method gives nothing back -- ↓ 2 2 STOPWATCH: mbot.getTimer() reads it -- → 5 7 MOTOR: each wheel has its own -- ↓ 1 11 RETURN: gives a result back from a method -lösung: 7 5, 6 9, 5 9, 10 2, 5 8, 8 4 -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can build and call a subprogram with a parameter. → A subprogram for the square -- I can recognise methods in Java. → Methods in Java -- I can recognise and call an overloaded method. → Same name, different parameters: overloading -- I can write a method with a return value. → A method with a return value -::: - -## Quiz - -::: quiz -? The subprogram \`void quadrat(int seite)\` should drive a square with sides of 30 cm. What does the call look like? -→ A subprogram for the square -- [ ] \`quadrat()\` -- [x] \`quadrat(30)\` -- [ ] \`int seite = quadrat(30)\` -> The value in the brackets becomes the parameter \`seite\`. Because \`quadrat\` returns nothing, there is no assignment. -? In which method does a Java program start? -→ Methods in Java -- [ ] in the first method of the class -- [x] in the method \`main\` -- [ ] in the method \`quadrat\` -> The program always starts in \`main\`. The other methods are called from there. -? How does Java tell the overloaded methods \`forward()\`, \`forward(int cm)\` and \`forward(int wert, String einheit)\` apart? -→ Same name, different parameters: overloading -- [ ] by their name -- [x] by the number and type of the parameters -- [ ] by their order in the program -> The name is the same for all of them. Java chooses the variant whose parameters fit the call. -? \`static int zentimeter(int umdrehungen) { return umdrehungen * 20; }\`: What is in \`strecke\` after \`int strecke = zentimeter(2);\`? -→ A method with a return value -- [ ] 2 -- [ ] 20 -- [x] 40 -> \`return\` gives back 2 · 20 = 40, and this value ends up in \`strecke\`. -? A method returns a whole number. What is written in its header instead of \`void\`? -→ A method with a return value -- [ ] \`return\` -- [x] \`int\` -- [ ] \`static\` -> Instead of \`void\`, the header names the data type of the result. -::: -`,Zz=`--- -titel: What's next? -bereich: Outlook -kurz: Look back at what you learned with the mBot2 and see what is still waiting for you in VisuStruct. ---- - -## Skills I will gain now - -::: kompetenzen -- say which programming basics I learned with the mBot2 -- find and fix a mistake in a robot program on my own -- name the topics that are still waiting for me in VisuStruct -::: - -## What you can do now - -Congratulations, you have finished all the robot lessons! With the mBot2 you learned the **basics of structured programming**: - -- reading and building a **structure chart** and checking it with a **desk check**, writing a plan as a **flowchart** and as **pseudocode**, -- **sequence**, **branch** and **switch**, conditions with **and**, **or** and **not**, -- the loops **for**, **while** and **do-while**, also nested, and leaving a loop with **break**, -- **variables**, **data types** and **constants** with \`final\`, counting, adding up and finding the largest value, -- **arrays** and **strings**, -- your own **methods** with parameters and a return value. - -All of this is not just for robots. Every Java program is built from exactly these building blocks, even a game or an app. - -::: angeberwissen -Baah, do you know what you actually built with the mBot2? An **embedded system**: a small computer inside a device that measures its surroundings with sensors. Such systems are in washing machines, cars and pacemakers. A modern car has more than a hundred of them. And they are programmed with exactly the building blocks you know now. -::: - -## Once more: Why doesn't it run? - -One last bug hunt to finish. This time it is a mistake that even professionals often make. - -::: übung vb-fehler-23-wie-geht-es-weiter -titel: Why doesn't it run? -code: java -auftrag: The program should drive up to just before the wall, but it doesn't run. "Open in editor" shows the code in the Code area. Click "Run" and read the error message. Fix the mistake and click Check. -start: vb-fehler-23-wie-geht-es-weiter-start.visustruct -welt: wand-kurz, wand-mittel, wand-lang -tipp: Read the error message carefully. Compare the sensor with the other commands: what comes after \`mbot.forward\`? -tipp: A command is always followed by round brackets, even if there is nothing inside them. It should be \`mbot.getDistance() > 15\`. -lösung: vb-bis-wand-loesung.visustruct -::: - -## What is still missing - -Some programming topics have little to do with the robot. You will find them in **VisuStruct**, the world without the robot. Because you already know the basics, you will make quick progress there. The links open in a new window. - -- **Keyboard input:** asking for values while the program runs, in ["Input and output"](?visustruct&lektion=06-eingabe-und-ausgabe). -- **Tables in memory:** arrays with rows and columns, for example for a cinema, in ["Two-dimensional arrays"](?visustruct&lektion=16-zweidimensionale-arrays). -- **Searching and sorting:** finding a value quickly and putting a list in order, in ["Searching and sorting"](?visustruct&lektion=19-suchen-und-sortieren). -- **Other languages:** the same program in Python and JavaScript, in ["Python and JavaScript"](?visustruct&lektion=21-python-und-javascript). -- **Catching crashes:** what happens when someone types "abc" instead of a number, in ["When the program crashes: try and catch"](?visustruct&lektion=22-try-und-catch). -- **Files:** reading and saving text, tables and data, from ["Reading and saving text"](?visustruct&lektion=23-text-einlesen-und-speichern) via ["Tables as CSV"](?visustruct&lektion=25-tabellen-als-csv) to ["Data as JSON"](?visustruct&lektion=26-json). -- **Windows with buttons:** your own programs with a window, a text field and a button, from ["Your first window"](?visustruct&lektion=28-erstes-fenster) to ["Model View Controller"](?visustruct&lektion=40-model-view-controller). - -> You don't need the mBot2 for this. But you can come back at any time and teach it new tricks. - -## Game: Which world? - -::: spiel frage -titel: Game: Which world? -intro: Ludwig has ideas for new programs. Do you learn this with the mBot2 in VisuBot or without the robot in VisuStruct? Eight rounds. -antworten: VisuBot | VisuStruct - -runde: -frage: "Drive up to the wall and then beep." -richtig: VisuBot -> Distance sensor, motors and speaker: that is a job for the mBot2. - -runde: -frage: "A window with a button that counts to 10." -richtig: VisuStruct -> You build windows with buttons with Swing in VisuStruct. - -runde: -frage: "Play a melody that is stored in an array." -richtig: VisuBot -> You learned arrays and melodies with the mBot2's speaker. - -runde: -frage: "Read the class's marks from a CSV file." -richtig: VisuStruct -> You learn to read and save files in VisuStruct. - -runde: -frage: "If someone types 'abc' instead of a number, the program should not crash." -richtig: VisuStruct -> You catch crashes with try and catch. That is in VisuStruct. - -runde: -frage: "Follow a black line with the line sensor." -richtig: VisuBot -> The line sensor sits under the mBot2. - -runde: -frage: "Sort ten numbers by size." -richtig: VisuStruct -> Searching and sorting is in VisuStruct. But you can already find the largest value. - -runde: -frage: "Save the high score list in a file." -richtig: VisuStruct -> You learn to write files in VisuStruct in "Reading and saving text". -::: - -## Checklist - -Rate yourself honestly for each point: ☂️ not yet, ⛅ partly, ☀️ I can do this confidently. For ⛅ and ☂️, **Review** helps you. Then comes the quiz. It shows you whether your self-assessment is right. - -::: checkliste -- I can say which programming basics I learned with the mBot2. → What you can do now -- I can find and fix a mistake in a robot program on my own. → Once more: Why doesn't it run? -- I can name the topics that are still waiting for me in VisuStruct. → What is still missing -::: - -## Quiz - -::: quiz -? Do the building blocks from the robot lessons also work for programs without a robot? -→ What you can do now -- [x] Yes, every Java program is built from sequence, branch, loop, variables and methods -- [ ] No, without a robot you need completely different commands -- [ ] Only the loops -> Only the \`mbot.\` commands belong to the robot. Everything else is ordinary Java. - -? Why doesn't \`mbot.getDistance > 15\` run? -→ Once more: Why doesn't it run? -- [ ] Because 15 is too small -- [x] Because the round brackets after the command are missing -- [ ] Because you have to write \`<\` -> Without brackets, Java looks for a variable \`getDistance\` and finds none. - -? Where do you learn how a program catches crashes with try and catch? -→ What is still missing -- [ ] In VisuBot -- [x] In VisuStruct -> That is where the lesson "When the program crashes: try and catch" is. - -? Which topics do you find in VisuStruct? Choose the right list. -→ What is still missing -- [x] Sorting, files and windows with buttons -- [ ] Line sensor, LEDs and motors -- [ ] Only the for loop -> Line sensor, LEDs and motors belong to the mBot2, and you already know the for loop. -::: -`,Lz=`## 🤖 mBot2 commands - -A command tells the mBot2 what to **do**. Every command starts with \`mbot.\` and ends with brackets. Often you write a number in the brackets. - -### 🚗 Driving and turning {.bot-fahren} - -The mBot2 drives straight or turns on the spot. - -\`\`\` -mbot.forward() drives 10 cm forward -mbot.forward(30) drives 30 cm forward -mbot.forward(2, "rotations") the wheels turn twice (≈ 41 cm) -mbot.backward(1, "rotations") one wheel rotation back (≈ 20 cm) -mbot.backward(20) drives 20 cm back -mbot.turnRight() turns to the right (90°) -mbot.turnLeft() turns to the left (90°) -mbot.turnLeft(45) turns just a little to the left (45°) -mbot.turnRight(180) turns all the way round -\`\`\` - -> \`forward\` and \`backward\` are **overloaded**: same name, different parameters. Units are \`"cm"\` and \`"rotations"\`. One wheel rotation is about 20.4 cm. - -> Without a number it drives 10 cm or turns 90°. 90° is a right angle, like the corner of a sheet of paper. - -> For a polygon it turns all the way round once in total: triangle 3 × 120°, square 4 × 90°, hexagon 6 × 60°. - -### ⚙️ Wheels separately {.bot-fahren} - -Here you give each wheel gas yourself. The numbers are percent: 100 is full gas, 0 is standing still, a number with a minus drives backwards. The mBot2 keeps going until another driving command comes. - -\`\`\` -mbot.drive(40, 40) both wheels the same: straight ahead -mbot.drive(10, 40) left slower: curve to the left -mbot.drive(40, -40) one wheel forward, one back: it turns -mbot.stop() stops -\`\`\` - -### 💡 Light {.bot-licht} - -The mBot2 has five LEDs with the numbers 0 to 4. - -\`\`\` -mbot.setLed(255, 0, 0) all LEDs light up red -mbot.ledOff() all LEDs off -mbot.led(0).setColor("green") only LED 0 lights up green -mbot.led(0).setColor("off") only LED 0 off -\`\`\` - -With \`setLed\` you mix red, green and blue, each from 0 (off) to 255 (very bright). - -### 🔊 Sound {.bot-ton} - -\`\`\` -mbot.playTone(440, 300) plays a tone -\`\`\` - -The first number is the pitch. The bigger, the higher. The second number is the length in milliseconds (1000 milliseconds are 1 second). - -### 🖥️ Screen {.bot-anzeige} - -\`\`\` -mbot.showText("Hello") shows Hello on the screen -\`\`\` - -With \`+\` you join text and numbers: \`mbot.showText("Distance: " + mbot.getDistance())\`. - -### 😊 Emotions {.bot-anzeige} - -The mBot2 shows a feeling with light, sound and wiggling. You only see it on the real mBot2. - -\`\`\` -mbot.emotion("smile") laughs -mbot.emotion("sad") is sad -mbot.emotion("wow") is amazed -\`\`\` - -More feelings: hello, yeah, proud, yummy, naughty, uh_oh, hurt, angry, startle, shiver, dizzy, sleepy, zzz, wake_up, blink, yes, no, look_up, look_down, look_left, look_right, look_around - -### ⏱️ Waiting and stopwatch {.bot-warten} - -\`\`\` -mbot.pause(1000) waits 1 second -mbot.resetTimer() sets the stopwatch to 0 -\`\`\` - -You read the stopwatch time with the sensor \`mbot.getTimer()\` (below under **Stopwatch and battery**). - -## 📡 mBot2 sensors - -A sensor **measures** something and gives you a value back. You use the value in a condition, for example in a loop or a branch. Some sensors give a **number**, some **true or false**, one gives a **text**. - -### 📏 Distance {.bot-sensor} - -The ultrasonic sensor at the front measures how far away the next wall is, in centimetres. - -\`\`\` -mbot.getDistance() distance in cm, e.g. 25 -mbot.getDistance() > 15 is there more than 15 cm free ahead? -int distance = mbot.getDistance() remember the distance in a variable -\`\`\` - -### ➖ Line {.bot-sensor} - -Under the mBot2 there are four probes. They see whether the floor is black. - -\`\`\` -mbot.getLine() number: 0 means no probe sees black -mbot.getLine() == 0 no black, keep driving -mbot.getLine() != 0 a probe sees black -mbot.isLineLeft() does the left middle probe see black? -mbot.isLineRight() does the right middle probe see black? -\`\`\` - -### 🎨 Colours {.bot-sensor} - -The same sensor underneath also recognises colours. \`mbot.getColor()\` gives you the name of the colour as text: \`"red"\`, \`"green"\`, \`"blue"\`, \`"yellow"\`, \`"white"\` or \`"black"\`. - -\`\`\` -mbot.getColor().equals("red") is it standing on red? -!mbot.getColor().equals("red") is it not standing on red? -\`\`\` - -> You compare texts with \`.equals(…)\`, not with \`==\`. The \`!\` in front means **not**. - -### 🕹️ Buttons and joystick {.bot-sensor} - -On the CyberPi there are the buttons A and B and a small joystick. Each sensor says **true** while it is being pressed. - -\`\`\` -mbot.isButtonA() is button A pressed? -mbot.isButtonB() is button B pressed? -mbot.isJoystickUp() joystick pushed up? -mbot.isJoystickDown() joystick pushed down? -mbot.isJoystickLeft() joystick pushed left? -mbot.isJoystickRight() joystick pushed right? -\`\`\` - -### 🔆 Light and loudness {.bot-sensor} - -\`\`\` -mbot.getBrightness() how bright? 0 is dark, 100 is bright -mbot.getLoudness() how loud? 0 is silent, 100 is loud -\`\`\` - -### 📐 Tilt and shaking {.bot-sensor} - -\`\`\` -mbot.getPitch() tipped forward or back? (in degrees) -mbot.getRoll() tipped to the side? (in degrees) -mbot.isShaken() is it being shaken? -\`\`\` - -> When the mBot2 lies flat, both tilts are 0. In the simulation you set these values under **🎛 Try the sensors**. - -### 🔋 Stopwatch and battery {.bot-sensor} - -\`\`\` -mbot.getTimer() seconds since the start or since resetTimer() -mbot.getBattery() how full is the battery? (in percent) -\`\`\` - -### Real mBot2 - -With **🔌 mBot2** next to "Start simulation" you connect the real robot with the USB cable. This only works in Chrome or Edge. Then it drives every step of the simulation along, and the sensors measure real values. A second click disconnects it again. - -### Driving without a cable - -With **⬆ Upload** you save your program on the mBot2. Then unplug the cable, put the mBot2 at the start and press **button A**: it drives your program on its own. It stays saved until you upload a new one. Keyboard inputs do not work on the mBot2. -`,Wz=`--- -titel: Losfahren -bereich: Erste Schritte -kurz: Den mBot2 mit Blöcken fahren und drehen lassen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 mit Blöcken fahren lassen -- die Zahl in einem Block ändern -- den mBot2 drehen lassen -::: - -Du baust dein Programm aus **Blöcken**, wie aus Bausteinen. Probier ruhig alles aus. Kaputt machen kannst du nichts. - -## Dein erster Block - -Links unter **Elemente** findest du die Gruppe **🚗 Fahren und Drehen**. Zieh den Block **fahre vor** nach rechts und lass ihn direkt unter **🏁 Wenn das Programm startet** los. - -Im Block steht jetzt \`mbot.forward( )\`. Das ist Englisch: *forward* heißt vorwärts. Ganz rechts unter **mBot2 Live** siehst du sofort, wohin dein mBot2 fährt. - -::: übung vbb-erster-block -titel: Der erste Block -auftrag: Zieh einen Block **fahre vor** unter **🏁 Wenn das Programm startet**. Klick dann auf **Simulation starten** und schau zu. -fahrt: forward -tipp: Die Blöcke liegen links unter **Elemente**, in der Gruppe **🚗 Fahren und Drehen**. -tipp: Lass den Block los, wenn er genau unter dem Block mit der Zielflagge 🏁 hängt. -lösung: vbb-erster-block-loesung.visustruct -::: - -## Weiter fahren - -Ist das weiße Feld im Block leer, fährt der mBot2 nur 10 cm. Das ist eine Kästchenbreite im Gitter. Klick auf das weiße Feld und tipp eine Zahl ein, zum Beispiel **50**. Jetzt fährt er 50 cm. - -::: übung vbb-weiter -titel: 50 cm -auftrag: Lass den mBot2 genau 50 cm vorwärts fahren. Benutze dafür nur **einen** Block. -fahrt: forward 50 -tipp: Klick in das weiße Feld im Block **fahre vor**. -tipp: Tipp **50** ein und drück Enter. Im Block steht dann \`mbot.forward(50)\`. -lösung: vbb-weiter-loesung.visustruct -::: - -Probier aus: Was passiert bei **200**? Und was bei **fahre zurück**? - -## Um die Ecke - -Mit **drehe rechts** dreht sich der mBot2 auf der Stelle. Ist das Feld leer, dreht er sich um 90 Grad, also eine Ecke wie bei einem Blatt Papier. Die Blöcke werden von oben nach unten ausgeführt, einer nach dem anderen. - -::: übung vbb-ecke -titel: Um die Ecke -auftrag: Der mBot2 fährt 50 cm vor, dreht sich nach rechts und fährt dann noch 30 cm. -fahrt: forward 50, turnRight 90, forward 30 -tipp: Du brauchst drei Blöcke: **fahre vor**, **drehe rechts** und noch einmal **fahre vor**. -tipp: Im ersten Block steht 50, im letzten 30. Das Feld von **drehe rechts** bleibt leer. -lösung: vbb-ecke-loesung.visustruct -::: - -Jetzt du: Tipp bei **drehe rechts** mal **180** ein. Wohin schaut der mBot2 danach? - -::: übung vbb-hin-und-zurueck -titel: Hin und zurück -auftrag: Der mBot2 fährt 50 cm vor, dreht sich um und fährt zurück zum Start. -fahrt: forward 50, turnRight 180, forward 50 -tipp: Umdrehen heißt: einmal halb herum, das sind 180 Grad. -tipp: **fahre vor** mit 50, **drehe rechts** mit 180, **fahre vor** mit 50. -lösung: vbb-hin-und-zurueck-loesung.visustruct -::: - -::: ludwig -Zwei Blöcke **drehe rechts** mit leerem Feld hintereinander gehen auch. 90 und 90 sind zusammen 180. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Danach fährt er die Strecke vor. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 2,0 -> 60 cm sind zwei Felder. - -runde: - mbot.forward(30); - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..^.. -ziel: 3,1 -> Ein Feld nach vorn, nach rechts drehen, ein Feld weiter. - -runde: - mbot.turnLeft(); - mbot.forward(60); -karte: ..... | ..... | ..^.. -ziel: 0,2 -> Erst dreht er sich nach links, dann fährt er zwei Felder. - -runde: - mbot.forward(30); - mbot.turnRight(180); - mbot.forward(60); -karte: ..... | ..^.. | ..... -ziel: 2,2 -> Ein Feld vor, umdrehen, und dann zwei Felder zurück. Er landet unter dem Start. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann einen Block ins Programm ziehen und starten. → Dein erster Block -- Ich kann die Zahl in einem Block ändern. → Weiter fahren -- Ich kann den mBot2 um die Ecke fahren lassen. → Um die Ecke -::: -`,Ez=`--- -titel: Immer wieder -bereich: Erste Schritte -kurz: Ein Quadrat fahren und mit „wiederhole“ Blöcke sparen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 ein Quadrat fahren lassen -- mit dem Block „wiederhole“ Blöcke sparen -- eigene Formen ausprobieren -::: - -## Ein Quadrat - -Ein Quadrat hat vier gleich lange Seiten und vier Ecken. Für jede Seite fährt der mBot2 ein Stück vor und dreht sich dann nach rechts. - -::: übung vbb-quadrat -titel: Das Quadrat -auftrag: Lass den mBot2 ein Quadrat mit 50 cm langen Seiten fahren. Am Ende steht er wieder am Start. -fahrt: 4 x (forward 50, turnRight 90) -tipp: Eine Seite sind zwei Blöcke: **fahre vor** mit 50 und **drehe rechts**. -tipp: Diese zwei Blöcke brauchst du viermal untereinander, zusammen also acht Blöcke. -lösung: vbb-quadrat-loesung.visustruct -::: - -Acht Blöcke, und immer wieder dieselben zwei. Das geht auch kürzer! - -## Wiederhole - -In der Gruppe **Steuerung** liegt der Block **wiederhole 10 mal**. Er sieht aus wie ein Maul. Alles, was du hineinlegst, macht der mBot2 so oft, wie die Zahl sagt. So eine Wiederholung heißt beim Programmieren **Schleife**. - -::: übung vbb-quadrat-wiederhole -titel: Quadrat mit wiederhole -auftrag: Baue das Quadrat noch einmal, aber nur mit **wiederhole** und zwei Blöcken darin. -fahrt: 4 x (forward 50, turnRight 90) -braucht: forSchleife -tipp: Zieh **wiederhole 10 mal** unter 🏁. Leg **fahre vor** und **drehe rechts** in das Maul. -tipp: Klick auf die 10 und tipp **4** ein, denn ein Quadrat hat vier Seiten. -lösung: vbb-quadrat-wiederhole-loesung.visustruct -::: - -Aus acht Blöcken sind drei geworden. Starte die Simulation und schau zu, wie der mBot2 viermal dasselbe macht. - -## Neue Formen - -Jetzt bist du dran. Ändere nur die Zahlen in deinem Programm und schau, was passiert. - -::: übung vbb-dreieck -titel: Das Dreieck -auftrag: Lass den mBot2 ein Dreieck mit 50 cm langen Seiten fahren. -fahrt: 3 x (forward 50, turnRight 120) -braucht: forSchleife -tipp: Ein Dreieck hat drei Seiten. Also **wiederhole 3 mal**. -tipp: Bei drei Ecken muss er sich jedes Mal um 120 Grad drehen. Tipp **120** in **drehe rechts**. -lösung: vbb-dreieck-loesung.visustruct -::: - -Noch mehr zum Ausprobieren: - -- **wiederhole 5 mal** und **drehe rechts** mit **72** ergibt ein Fünfeck. -- **wiederhole 6 mal** mit **60** ergibt ein Sechseck. -- Was passiert mit **wiederhole 36 mal**, **fahre vor** mit 10 und **drehe rechts** mit 10? - -::: ludwig -Fällt dir etwas auf? Die Zahl beim Wiederholen mal die Zahl beim Drehen ergibt immer 360. Einmal ganz herum! -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - for (int i = 0; i < 2; i++) { - mbot.forward(30); - } -karte: ..... | ..... | ..^.. -ziel: 2,0 -> Zweimal ein Feld vor, das sind zwei Felder. - -runde: - for (int i = 0; i < 4; i++) { - mbot.forward(30); - mbot.turnRight(); - } -karte: ..... | ..... | ..^.. -ziel: 2,2 -> Das ist ein Quadrat. Am Ende steht er wieder am Start. - -runde: - for (int i = 0; i < 3; i++) { - mbot.forward(30); - } - mbot.turnRight(); - mbot.forward(30); -karte: ..... | ..... | ..... | ..^.. -ziel: 3,0 -> Erst dreimal vor, dann nach rechts drehen und noch ein Feld. Der letzte Block steht nicht mehr im Maul von wiederhole. - -runde: - for (int i = 0; i < 2; i++) { - mbot.forward(30); - mbot.turnLeft(); - } -karte: ..... | ..... | ..^.. -ziel: 1,1 -> Vor, links drehen, vor, links drehen. Er steht links neben dem Feld über dem Start. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 ein Quadrat fahren lassen. → Ein Quadrat -- Ich kann mit „wiederhole“ Blöcke sparen. → Wiederhole -- Ich kann neue Formen ausprobieren. → Neue Formen -::: -`,Nz=`--- -titel: Der mBot2 misst -bereich: Sensoren und Entscheidungen -kurz: Den Abstand zur Wand messen und rechtzeitig anhalten. ---- - -## Das schaffst du heute - -::: kompetenzen -- den Abstand messen und auf dem Bildschirm zeigen -- fahren lassen, solange vorn frei ist -::: - -## Die Augen vorn - -Vorn am mBot2 sitzen zwei runde „Augen“. Das ist der **Ultraschallsensor**. Er schickt ein Geräusch los, das du nicht hören kannst, und wartet auf das Echo. So weiß er, wie weit die nächste Wand weg ist, in Zentimetern. - -::: mbot2 -fokus: ultrasonic -ansicht: vorn -::: - -Links unter **Elemente** findest du weiter unten die **mBot2-Sensoren**. Ein Sensor ist kein eigener Block. Er ist ein runder Baustein, den du in ein weißes Feld legst. - -::: übung vbb-abstand-zeigen -titel: Abstand anzeigen -auftrag: Der mBot2 soll den Abstand zur Wand auf seinem Bildschirm zeigen. Nimm dafür den Block **Text anzeigen** und leg den Sensor **Abstand** in sein weißes Feld. -messwerte: getDistance=35 -> screen "35" -messwerte: getDistance=12 -> screen "12" -tipp: **Text anzeigen** liegt in der Gruppe **🖥️ Bildschirm**, **Abstand** in der Gruppe **📏 Abstand**. -tipp: Zieh **Abstand** genau auf das weiße Feld mit „Hallo“. Dann steht im Block \`mbot.showText(mbot.getDistance())\`. -lösung: vbb-abstand-zeigen-loesung.visustruct -::: - -## Fahren, solange frei ist - -Der mBot2 soll auf eine Wand zufahren und kurz davor anhalten. Wie weit die Wand weg ist, weiß er vorher nicht. Er muss also immer wieder messen. - -Dafür gibt es die **While-Schleife**. Im Block steht oben **solange**. Sie wiederholt ihren Inhalt, solange die Frage oben drin mit **ja** beantwortet wird. So baust du die Frage „Ist mehr als 15 cm frei?“: - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **größer als** auf die Frage hinter **solange**. -3. Leg den Sensor **Abstand** in das linke Feld und tipp rechts **15** ein. -4. Leg **fahre vor** in die Schleife. - -::: übung vbb-bis-wand -titel: Bis zur Wand -auftrag: Der mBot2 fährt vor, solange mehr als 15 cm frei sind. Dein Programm muss in drei Welten klappen, die Wand steht jedes Mal woanders. Über der Simulation kannst du die Welt wechseln. -welt: wand-kurz, wand-mittel, wand-lang -braucht: whileSchleife -tipp: Die Frage der Schleife heißt \`mbot.getDistance() > 15\`. -tipp: In der Schleife liegt nur **fahre vor** mit leerem Feld. So fährt er immer 10 cm und misst dann neu. -lösung: vbb-bis-wand-loesung.visustruct -::: - -Probier aus: Was passiert, wenn du statt 15 eine **5** eintippst? Und was bei **100**? - -::: ludwig -Mit fünfmal **fahre vor** klappt es nur in einer Welt. Mit dem Sensor findet der mBot2 die Wand überall. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..#.. | ..... | ..... | ..^.. -ziel: 2,1 -> Er fährt, solange mehr als 15 cm frei sind. Direkt vor der Wand bleibt er stehen. - -runde: - while (mbot.getDistance() > 40) { - mbot.forward(30); - } -karte: ..#.. | ..... | ..... | ..... | ..^.. -ziel: 2,2 -> Zwei Felder vor der Wand sind schon weniger als 40 cm frei. Dort hält er an. - -runde: - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..... | ..^.# | ..... -ziel: 3,1 -> Erst dreht er sich zur Wand, dann fährt er bis kurz davor. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnLeft(); - mbot.forward(60); -karte: ..#.. | ..... | ..... | ..^.. -ziel: 0,1 -> Bis vor die Wand, dann nach links drehen und zwei Felder weiter. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den Abstand auf dem Bildschirm zeigen. → Die Augen vorn -- Ich kann den mBot2 fahren lassen, solange vorn frei ist. → Fahren, solange frei ist -::: -`,Fz=`--- -titel: Entscheidungen -bereich: Sensoren und Entscheidungen -kurz: Mit „wenn“ und „sonst“ entscheidet der mBot2 selbst, was er tut. ---- - -## Das schaffst du heute - -::: kompetenzen -- mit **wenn** und **sonst** eine Entscheidung bauen -- den mBot2 auf eine Wand reagieren lassen -- den mBot2 auf eine Farbe reagieren lassen -::: - -## Wenn … sonst … - -Du entscheidest jeden Tag: **Wenn** es regnet, nimmst du einen Schirm mit, **sonst** nicht. Der mBot2 kann das auch. - -Zieh eine **Verzweigung** unter 🏁. Oben steht **wenn** und dahinter eine Frage. Darunter kommt alles, was passiert, wenn die Antwort **ja** ist. Bei **sonst** steht, was bei **nein** passiert. Der mBot2 macht immer nur einen der beiden Teile. In Java heißen die beiden übrigens \`if\` und \`else\`. - -::: übung vbb-wand-vorn -titel: Wand vorn? -auftrag: Wenn die Wand näher als 20 cm ist, dreht sich der mBot2 nach rechts. Sonst fährt er vor. Dein Programm wird in zwei Welten geprüft, einmal mit Wand direkt vor ihm und einmal mit viel Platz. -welt: wand-nah -> turnRight -welt: wand-frei -> forward -braucht: verzweigung -tipp: Zieh **kleiner als** aus **Operatoren** auf die Frage bei **wenn**. Leg **Abstand** in das linke Feld und tipp rechts **20** ein. -tipp: Unter **wenn** liegt **drehe rechts**, unter **sonst** liegt **fahre vor**. -lösung: vbb-wand-vorn-loesung.visustruct -::: - -## Rot heißt Stopp - -Unten am mBot2 sitzt ein Farbsensor. Der Baustein **Farbe ist rot?** liefert schon ja oder nein. Du kannst ihn darum direkt auf die Frage bei **wenn** ziehen, ohne **kleiner als**. - -::: übung vbb-ampel -titel: Rote Ampel -auftrag: Steht der mBot2 auf Rot, hält er an. Sonst fährt er ein Stück vor. -messwerte: getColor=rot -> none -messwerte: getColor=grün -> forward -braucht: verzweigung -tipp: **Farbe ist rot?** liegt in der Gruppe **🎨 Farben** bei den Sensoren. -tipp: Unter **wenn** liegt **anhalten**, unter **sonst** liegt **fahre vor**. -lösung: vbb-ampel-loesung.visustruct -::: - -Probier aus: Klick im Block auf „rot“ und tipp **grün** ein. Was macht der mBot2 jetzt? - -::: ludwig -Ich entscheide auch so: Wenn Löwenzahn da ist, fresse ich. Sonst suche ich weiter. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Überleg, ob der mBot2 den wenn-Teil oder den sonst-Teil nimmt, und tipp auf das Feld, auf dem er am Ende steht. Jedes Feld ist 30 cm groß. Vier Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } -karte: ..#.. | ..^.. | ..... -ziel: 2,1 -> Die Wand ist direkt vor ihm. Er nimmt den wenn-Teil, dreht sich nur und bleibt auf seinem Feld. - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } -karte: ..#.. | ..... | ..^.. -ziel: 2,1 -> Die Wand ist noch weit weg. Er nimmt den sonst-Teil und fährt ein Feld vor. - -runde: - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } - mbot.forward(30); -karte: ..#.. | ..^.. | ..... -ziel: 3,1 -> Die Wand ist nah, also dreht er sich nach rechts. Der Block unter der Verzweigung läuft immer, also fährt er danach ein Feld nach rechts. - -runde: - if (mbot.getDistance() > 50) { - mbot.forward(60); - } else { - mbot.turnLeft(); - mbot.forward(30); - } -karte: ..#.. | ..... | ..^.. -ziel: 1,2 -> Bis zur Wand sind es weniger als 50 cm. Also nimmt er den sonst-Teil: links drehen und ein Feld fahren. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann mit wenn und sonst eine Entscheidung bauen. → Wenn … sonst … -- Ich kann den mBot2 auf eine Wand reagieren lassen. → Wenn … sonst … -- Ich kann den mBot2 auf eine Farbe reagieren lassen. → Rot heißt Stopp -::: -`,Rz=`--- -titel: Lichter und Töne -bereich: Licht und Ton -kurz: LEDs in allen Farben leuchten lassen, blinken und Töne spielen. ---- - -## Das schaffst du heute - -::: kompetenzen -- die LEDs in einer Farbe leuchten lassen -- die LEDs blinken lassen -- Töne spielen -::: - -## Licht an - -Hinten auf dem mBot2 sitzt eine Leiste mit fünf bunten **LEDs**. Das sind kleine Lampen. - -::: mbot2 -fokus: leds -ansicht: oben -::: - -Zieh aus der Gruppe **💡 Licht** den Block **LEDs an** unter 🏁. Im Block stehen drei Zahlen: wie viel **Rot**, wie viel **Grün** und wie viel **Blau** die LEDs mischen. Jede Zahl geht von **0** (gar nicht) bis **255** (ganz hell). \`mbot.setLed(255, 0, 0)\` ist also ganz rot. - -::: übung vbb-licht-gruen -titel: Grünes Licht -auftrag: Lass die LEDs grün leuchten. -befehle: setLed 0 255 0 -tipp: Rot und Blau brauchst du nicht, sie bekommen eine 0. -tipp: Im Block steht dann \`mbot.setLed(0, 255, 0)\`. -lösung: vbb-licht-gruen-loesung.visustruct -::: - -Probier aus: Welche Farbe gibt \`255, 255, 0\`? Und \`255, 0, 255\`? Findest du Orange? - -## Blinken - -Ein Blinklicht geht an, wartet, geht aus und wartet wieder. Und das immer wieder. Den Block **kurz warten** findest du in der Gruppe **⏱️ Warten und Stoppuhr**. Die Zahl darin sind **Millisekunden**: 1000 Millisekunden sind eine Sekunde, 500 also eine halbe. - -::: übung vbb-blinken -titel: Blinklicht -auftrag: Die LEDs blinken dreimal rot: eine halbe Sekunde an, eine halbe Sekunde aus. -befehle: 3 x (setLed 255 0 0, pause 500, ledOff, pause 500) -braucht: forSchleife -tipp: Du brauchst **wiederhole 3 mal** und darin vier Blöcke: **LEDs an**, **kurz warten**, **LEDs aus**, **kurz warten**. -tipp: In beiden Blöcken **kurz warten** steht **500**. -lösung: vbb-blinken-loesung.visustruct -::: - -::: ludwig -Ohne **kurz warten** geht das Licht so schnell an und aus, dass du gar nichts siehst. Der mBot2 ist viel schneller als deine Augen! -::: - -## Töne - -Mit **Ton spielen** aus der Gruppe **🔊 Ton** piept der mBot2. Die erste Zahl sagt, wie **hoch** der Ton ist: 200 ist tief, 1000 ist hoch. Die zweite Zahl sagt, wie **lange** er klingt, wieder in Millisekunden. - -::: übung vbb-sirene -titel: Sirene -auftrag: Baue eine Sirene: dreimal hintereinander ein hoher Ton mit 800 und ein tiefer mit 600, jeder 300 Millisekunden lang. -befehle: 3 x (playTone 800 300, playTone 600 300) -braucht: forSchleife -tipp: Leg zwei Blöcke **Ton spielen** in **wiederhole 3 mal**. -tipp: Im ersten steht \`mbot.playTone(800, 300)\`, im zweiten \`mbot.playTone(600, 300)\`. -lösung: vbb-sirene-loesung.visustruct -::: - -Jetzt du: Bau eine **Lichtshow**. Lass die LEDs abwechselnd in verschiedenen Farben leuchten und spiel bei jeder Farbe einen anderen Ton. Je mehr Farben, desto besser! - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Fünf Runden. - -runde: - mbot.setLed(0, 0, 255); -frage: Welche Farbe leuchtet? -- rot -- grün -- [x] blau -> Rot 0, Grün 0, Blau 255: nur Blau leuchtet. - -runde: - mbot.setLed(255, 255, 0); -frage: Welche Farbe leuchtet? -- [x] gelb -- lila -- weiß -> Rot und Grün zusammen ergeben bei Licht Gelb. - -runde: - for (int i = 0; i < 4; i++) { - mbot.playTone(440, 300); - } -frage: Wie oft piept der mBot2? -- 1-mal -- 3-mal -- [x] 4-mal -> Der Block **Ton spielen** liegt in **wiederhole 4 mal**. - -runde: - for (int i = 0; i < 2; i++) { - mbot.setLed(255, 0, 0); - mbot.pause(500); - mbot.ledOff(); - mbot.pause(500); - } -frage: Wie lange dauert das Programm? -- eine Sekunde -- [x] zwei Sekunden -- vier Sekunden -> Jede Runde dauert 500 + 500 Millisekunden, also eine Sekunde. Zwei Runden sind zwei Sekunden. - -runde: - mbot.playTone(1000, 200); - mbot.playTone(200, 200); -frage: Wie klingt das? -- erst tief, dann hoch -- [x] erst hoch, dann tief -- zweimal gleich -> 1000 ist ein hoher Ton, 200 ein tiefer. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann die LEDs in einer Farbe leuchten lassen. → Licht an -- Ich kann die LEDs blinken lassen. → Blinken -- Ich kann Töne spielen. → Töne -::: -`,Jz=`--- -titel: Immer wieder prüfen -bereich: Sensoren und Entscheidungen -kurz: Auf Taste A warten, immer wieder prüfen und Hindernissen ausweichen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 auf Taste A warten lassen -- eine Schleife mit „wiederhole immer“ bauen und wieder verlassen -- den mBot2 Hindernissen ausweichen lassen -::: - -## Start mit Taste A - -Oben auf dem mBot2 sitzt die Taste **A**, das ist die [Taste mit dem Quadrat]{teil=buttons}. Der mBot2 soll erst losfahren, wenn du sie drückst. Bis dahin wartet er. - -Warten heißt: **solange** die Taste **nicht** gedrückt ist, kurz warten. So baust du das: - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **nicht** auf die Frage hinter **solange**. -3. Zieh den Sensor **Taste A gedrückt?** in den Baustein **nicht**. -4. Leg **kurz warten** in die Schleife und **fahre vor** darunter. - -::: übung vbb-start-a -titel: Start mit Taste A -auftrag: Der mBot2 wartet, bis Taste A gedrückt ist. Dann fährt er 30 cm vor. -messwerte: isButtonA=false/true -> forward 30 -messwerte: isButtonA=true -> forward 30 -braucht: whileSchleife -tipp: Im Kopf der Schleife steht **solange nicht** und dann \`mbot.isButtonA()\`. -tipp: In der Schleife liegt **kurz warten**, unter der Schleife **fahre vor** mit 30. -lösung: vbb-start-a-loesung.visustruct -::: - -> Beim Prüfen drückt VisuBot die Taste für dich: erst eine Weile nicht, dann schon. Fährt dein mBot2 zu früh los, fällt das auf. - -## Wiederhole immer - -Manche Programme sollen nie aufhören: Der mBot2 fährt, schaut, fährt, schaut … Dafür gibt es die **Endlosschleife**. Im Block steht **wiederhole immer**. - -Damit du ihn trotzdem anhalten kannst, baust du eine **Notbremse** ein: **Wenn** Taste A gedrückt ist, **verlasse die Schleife**. Den Block dafür findest du unter **Elemente**, er heißt **Aussprung**. Danach macht das Programm unter der Schleife weiter. - -::: übung vbb-notbremse -titel: Notbremse -auftrag: Der mBot2 fährt immer weiter vor. Wird Taste A gedrückt, verlässt er die Schleife und zeigt **Gestoppt** auf dem Bildschirm. -messwerte: isButtonA=true -> none, screen "Gestoppt" -messwerte: isButtonA=false/true -> drives, screen "Gestoppt" -braucht: endlosschleife, aussprung -tipp: In **wiederhole immer** liegt zuerst eine Verzweigung mit **Taste A gedrückt?**. Unter **wenn** kommt der **Aussprung**, **sonst** bleibt leer. -tipp: Unter der Verzweigung, noch in der Schleife, liegt **fahre vor**. Unter der Schleife liegt **Text anzeigen** mit „Gestoppt“. -lösung: vbb-notbremse-loesung.visustruct -::: - -## Ausweichen - -Jetzt wird es spannend! Der mBot2 soll durch einen Raum fahren, ohne irgendwo anzustoßen. Baue dafür: - -- **wiederhole immer** -- darin: **wenn** der Abstand kleiner als 20 ist, **drehe rechts**, **sonst** **fahre vor** - -Starte die Simulation und schau zu, wie er sich seinen Weg sucht. Mit **Simulation beenden** hältst du ihn an. - -Probier aus: - -- Was passiert, wenn du statt **drehe rechts** mal **drehe links** nimmst? -- Was passiert bei **drehe rechts** mit **45**? -- Kannst du ihn bei jeder Drehung piepen lassen? - -::: ludwig -So einen Roboter gibt es wirklich: Viele Staubsauger-Roboter fahren genau so durch die Wohnung. Wand vorn? Drehen! Frei? Weiter! -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Vier Runden. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(50); -frage: Niemand drückt eine Taste. Was tut der mBot2? -- Er fährt 50 cm. -- [x] Er wartet und wartet. -- Er fährt immer weiter. -> Solange Taste A nicht gedrückt ist, wartet er in der Schleife. - -runde: - while (!mbot.isButtonA()) { - mbot.pause(100); - } - mbot.forward(50); -frage: Du drückst Taste A. Was tut der mBot2? -- [x] Er fährt 50 cm und hört dann auf. -- Er fährt immer weiter. -- Er wartet weiter. -> Jetzt ist die Schleife zu Ende, und der Block darunter läuft einmal. - -runde: - while (true) { - mbot.playTone(440, 300); - } -frage: Wie oft piept der mBot2? -- einmal -- zehnmal -- [x] immer weiter, ohne Ende -> **wiederhole immer** hört nie von selbst auf. - -runde: - while (true) { - if (mbot.isButtonA()) { - break; - } - mbot.forward(); - } - mbot.setLed(255, 0, 0); -frage: Wann leuchten die LEDs rot? -- sofort -- [x] wenn jemand Taste A drückt -- nie -> Erst die Notbremse verlässt die Schleife. Dann geht es unter der Schleife weiter. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 auf Taste A warten lassen. → Start mit Taste A -- Ich kann eine Schleife mit „wiederhole immer“ bauen und wieder verlassen. → Wiederhole immer -- Ich kann den mBot2 Hindernissen ausweichen lassen. → Ausweichen -::: -`,Gz=`--- -titel: Der Linie folgen -bereich: Sensoren und Entscheidungen -kurz: Mit dem Liniensensor am Rand umkehren und einer schwarzen Linie folgen. ---- - -## Das schaffst du heute - -::: kompetenzen -- mit dem Liniensensor eine schwarze Linie erkennen -- den mBot2 am Rand umkehren lassen -- den mBot2 einer Linie folgen lassen -::: - -## Augen nach unten - -Unter dem mBot2 sitzt vorn der **Liniensensor**. Er leuchtet auf den Boden und sieht, ob es dort hell oder dunkel ist. - -::: mbot2 -fokus: lineSensor -ansicht: unten -::: - -Der Sensor **Linie** aus der Gruppe **➖ Linie** liefert **0**, wenn unter dem mBot2 alles hell ist. Sieht er etwas Schwarzes, ist die Zahl größer als 0. - -## Am Rand umkehren - -Stell dir einen Tisch vor, um den schwarzes Klebeband klebt. Der mBot2 soll vorfahren, bis er das Band sieht, und dann umkehren. So fällt er nicht herunter. - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh aus **Operatoren** den Baustein **gleich** auf die Frage hinter **solange**. -3. Leg den Sensor **Linie** in das linke Feld und tipp rechts **0** ein. -4. Leg **fahre vor** in die Schleife und **drehe rechts** mit **180** darunter. - -::: übung vbb-rand -titel: Am Rand umkehren -auftrag: Der mBot2 fährt vor, solange er keine Linie sieht. Dann dreht er sich um. Es gibt zwei Welten, der Rand ist mal näher und mal weiter weg. -welt: rand-1 -> forward 20, turnRight 180 -welt: rand-2 -> forward 50, turnRight 180 -braucht: whileSchleife -tipp: Die Frage der Schleife heißt \`mbot.getLine() == 0\`. -tipp: **drehe rechts** mit 180 liegt unter der Schleife, nicht darin. -lösung: vbb-rand-loesung.visustruct -::: - -## Der Linie folgen - -Jetzt kommt ein Klassiker: Der mBot2 fährt eine schwarze Linie entlang, auch durch Kurven. Dafür brauchst du zwei neue Dinge: - -- **Linie links?** aus der Gruppe **➖ Linie** sagt ja, wenn der linke Fühler Schwarz sieht. -- **Räder einzeln** aus der Gruppe **⚙️ Räder einzeln** lässt jedes Rad anders schnell drehen. Die erste Zahl ist das linke Rad, die zweite das rechte. Dreht das rechte schneller, fährt er eine Linkskurve. - -Die Idee ist ganz einfach: **Wenn** links Schwarz ist, lenkt er nach links. **Sonst** lenkt er nach rechts. So wackelt er an der Linie entlang. - -::: übung vbb-linienfolger -titel: Linienfolger -auftrag: Solange die Wand mehr als 15 cm weg ist, folgt der mBot2 der Linie. Danach hält er an. In der einen Welt biegt die Linie nach rechts ab, in der anderen nach links. -welt: linie-1, linie-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit \`mbot.getDistance() > 15\`. Darin eine Verzweigung mit **Linie links?**. Unter der Schleife liegt **anhalten**. -tipp: Unter **wenn** liegt **Räder einzeln** mit \`10, 40\`, unter **sonst** **Räder einzeln** mit \`40, 10\`. -lösung: vbb-linienfolger-loesung.visustruct -::: - -Probier aus: Was passiert mit \`20, 60\` und \`60, 20\`? Wird er schneller oder fliegt er aus der Kurve? - -::: ludwig -Am echten mBot2 klebst du die Linie mit schwarzem Isolierband auf einen hellen Boden. Fang langsam an, sonst schießt er in der Kurve über die Linie hinaus. -::: - -## Spiel: Was passiert? - -::: spiel frage -titel: Spiel: Was passiert? -intro: Schau dir die Blöcke an. Was macht der mBot2? Vier Runden. - -runde: - mbot.drive(40, 40); -frage: Wie fährt der mBot2? -- [x] geradeaus -- Linkskurve -- Rechtskurve -> Beide Räder drehen gleich schnell. - -runde: - mbot.drive(10, 40); -frage: Wie fährt der mBot2? -- geradeaus -- [x] Linkskurve -- Rechtskurve -> Das rechte Rad ist schneller, also schiebt es ihn nach links. - -runde: - if (mbot.isLineLeft()) { - mbot.drive(10, 40); - } else { - mbot.drive(40, 10); - } -frage: Nur der rechte Fühler sieht die Linie. Wie fährt er? -- Linkskurve -- [x] Rechtskurve -- Er hält an. -> Links ist kein Schwarz, also nimmt er den sonst-Teil: das linke Rad ist schneller. - -runde: - while (mbot.getLine() == 0) { - mbot.forward(); - } - mbot.turnRight(180); -frage: Der mBot2 steht schon auf der schwarzen Linie. Was tut er? -- Er fährt erst ein Stück vor. -- [x] Er dreht sich sofort um. -- Er fährt immer weiter. -> Die Frage der Schleife ist gleich am Anfang nein, also läuft sie gar nicht. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann mit dem Liniensensor eine Linie erkennen. → Augen nach unten -- Ich kann den mBot2 am Rand umkehren lassen. → Am Rand umkehren -- Ich kann den mBot2 einer Linie folgen lassen. → Der Linie folgen -::: -`,Hz=`--- -titel: Parcours -bereich: Sensoren und Entscheidungen -kurz: Alles zusammen: der Linie bis Rot folgen, Klötzen ausweichen und einen eigenen Parcours bauen. ---- - -## Das schaffst du heute - -::: kompetenzen -- den mBot2 einer Linie bis zum roten Feld folgen lassen -- den mBot2 vor einem Klotz warnen und ausweichen lassen -- einen eigenen Parcours planen und Stück für Stück bauen -::: - -## Station 1: Bis zum roten Feld - -Ein Parcours besteht aus Stationen. Bei der ersten folgt der mBot2 einer schwarzen Linie. Am Ende der Linie liegt ein rotes Feld, dort soll er anhalten. - -Du kennst schon alles dafür. Den Linienfolger hast du in der letzten Lektion gebaut. Neu ist nur die Frage hinter **solange**: Er fährt, solange er **nicht** auf Rot steht. - -1. Zieh eine **While-Schleife** unter 🏁. -2. Zieh **nicht** aus **Operatoren** auf die Frage und leg **Farbe ist rot?** hinein. -3. Leg in die Schleife eine **Verzweigung** mit **Linie links?**. -4. Unter **wenn** kommt **Räder einzeln** mit \`10, 40\`, unter **sonst** mit \`40, 10\`. -5. Unter die Schleife legst du **anhalten**. - -::: übung vbb-linie-bis-rot -titel: Bis zum roten Feld -auftrag: Der mBot2 folgt der Linie, solange er nicht auf Rot steht. Dann hält er an. In der zweiten Welt schlängelt sich die Linie. -welt: linie-rot-1, linie-rot-2 -braucht: whileSchleife, verzweigung -tipp: Die Frage der Schleife heißt \`!mbot.getColor().equals("rot")\`. Im Block steht dort **nicht Farbe ist rot?**. -tipp: In der Schleife liegt dieselbe Verzweigung wie beim Linienfolger aus Lektion 7. -lösung: vbb-linie-bis-rot-loesung.visustruct -::: - -## Station 2: Achtung, Klotz! - -Bei der zweiten Station stehen Klötze im Weg. Der mBot2 fährt in kleinen Schritten vor. Ist ein Klotz näher als 20 cm, warnt er mit oranger Lampe und Piepton und fährt außen herum. Danach geht die Lampe aus. - -Außen herum heißt: **drehe rechts**, **fahre vor** mit 30, **drehe links**. Dann steht er neben dem Klotz und schaut wieder nach vorn. - -::: übung vbb-klotz -titel: Achtung, Klotz! -auftrag: Solange der mBot2 nicht auf Rot steht: Ist ein Klotz näher als 20 cm, leuchtet er orange, piept und weicht aus. Sonst fährt er ein Stück vor. Es gibt zwei Welten, in der zweiten stehen zwei Klötze. -welt: hindernis-1 -> tone -welt: hindernis-2 -> tone -braucht: whileSchleife, verzweigung -tipp: Außen dieselbe Schleife wie bei Station 1. Darin eine Verzweigung mit **Abstand** **kleiner als** 20. Unter **sonst** liegt **fahre vor**. -tipp: Unter **wenn**: **LEDs an** mit \`255, 128, 0\`, **Ton spielen** mit \`880, 200\`, **drehe rechts**, **fahre vor** mit 30, **drehe links**, **LEDs aus**. -lösung: vbb-klotz-loesung.visustruct -::: - -## Dein eigener Parcours - -Jetzt bist du dran! Bau mit Klebeband und Kartons einen Parcours auf dem Boden. Plane erst, dann programmier Station für Station: - -- **Start:** Der mBot2 wartet, bis du Taste A drückst. -- **Linie:** Er folgt einer schwarzen Linie bis zu einem roten Blatt Papier. -- **Klotz:** Danach weicht er einem Karton aus. -- **Ziel:** Am Ende blinkt er grün und spielt eine Melodie. - -Probier jede Station erst allein aus. Klappt sie, hängst du die nächste unten an. So findest du Fehler viel schneller. - -::: ludwig -Profis machen das genauso: Sie testen jedes kleine Stück, bevor sie alles zusammenstecken. Bei Robotik-Wettbewerben gewinnt oft nicht der schnellste Roboter, sondern der, der zuverlässig ins Ziel kommt. -::: - -## Spiel: Wo landet der mBot2? - -::: spiel fahrt -titel: Spiel: Wo landet der mBot2? -intro: Die grauen Felder sind Wände. Schau dir die Blöcke an und tipp auf das Feld, auf dem der mBot2 am Ende steht. Jedes Feld ist 30 cm groß. Drei Runden. -frage: Auf welchem Feld steht der mBot2 am Ende? - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: #.... | ..... | ^...# -ziel: 4,1 -> Er fährt bis vor die Wand, dreht sich nach rechts und fährt wieder, bis der Rand kommt. - -runde: - for (int i = 0; i < 3; i++) { - if (mbot.getDistance() < 20) { - mbot.turnRight(); - } else { - mbot.forward(30); - } - } -karte: ..#.. | ..... | ..^.. -ziel: 3,1 -> Erst ist frei, er fährt ein Feld. Dann ist die Wand direkt vor ihm, er dreht sich. Beim dritten Mal ist wieder frei, er fährt nach rechts. - -runde: - while (mbot.getDistance() > 15) { - mbot.forward(30); - } - mbot.turnLeft(); - mbot.forward(30); - mbot.turnRight(); - while (mbot.getDistance() > 15) { - mbot.forward(30); - } -karte: ..... | ..#.. | ..... | ..^.. -ziel: 1,0 -> Er fährt bis vor den Klotz, weicht nach links aus und fährt dann geradeaus weiter bis zum Rand. -::: - -## Das hab ich geschafft - -Wie gut klappt es schon? ☂️ noch nicht, ⛅ ein bisschen, ☀️ klappt prima. Bei ☂️ und ⛅ bringt dich **Nachlesen** zum passenden Schritt. - -::: checkliste -- Ich kann den mBot2 einer Linie bis zum roten Feld folgen lassen. → Station 1: Bis zum roten Feld -- Ich kann den mBot2 vor einem Klotz warnen und ausweichen lassen. → Station 2: Achtung, Klotz! -- Ich kann einen eigenen Parcours Station für Station bauen. → Dein eigener Parcours -::: -`,Vz=`--- -titel: Ausgang finden -nach: 8 -stufe: 3 ---- - -Der mBot2 steht unten links und schaut nach rechts. Über ihm liegen Wände. Jede Wand hat genau eine Lücke, und jede Lücke liegt weiter rechts als die darunter. Ganz oben ist das schwarze Ziel. - -Der mBot2 fährt nach rechts und schaut in jedem Feld nach oben. Ist dort eine Lücke, fährt er hindurch in den nächsten Gang. - -::: übung vbb-ausgang -titel: Ausgang finden -auftrag: Der mBot2 fährt in beiden Welten durch alle Lücken bis zum Ziel, ohne anzustoßen. Ein Feld ist 30 cm groß. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit **Linie** **gleich** 0. Darin dreht sich der mBot2 zuerst nach links und schaut: Ist oben frei, misst er mehr als 20 cm. -tipp: **Wenn** frei: 60 vor (durch die Lücke in den nächsten Gang), dann rechts drehen. **Sonst**: rechts drehen und 30 vor. -lösung: vbb-ausgang-loesung.visustruct -::: -`,qz=`--- -titel: Disco -nach: 5 -stufe: 1 ---- - -Der mBot2 macht Party! Seine LEDs wechseln die Farbe: rot, grün, blau, immer wieder. - -::: übung vbb-disco -titel: Disco -auftrag: Die LEDs leuchten nacheinander rot, grün und blau, jede Farbe eine halbe Sekunde lang. Das Ganze dreimal. Danach gehen die LEDs aus. -befehle: 3 x (setLed 255 0 0, pause 500, setLed 0 255 0, pause 500, setLed 0 0 255, pause 500), ledOff -braucht: forSchleife -tipp: In **wiederhole 3 mal** liegen drei Blöcke **LEDs an**, nach jedem ein **kurz warten** mit 500. -tipp: Rot ist \`255, 0, 0\`, grün \`0, 255, 0\`, blau \`0, 0, 255\`. **LEDs aus** liegt unter der Schleife. -lösung: vbb-disco-loesung.visustruct -::: - -Probier aus: Mach eine eigene Farbe, zum Beispiel lila mit \`255, 0, 255\`. -`,Uz=`--- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Vor dem mBot2 stehen vier Pylonen in einer Reihe. Er fährt Slalom: am ersten Pylon oben vorbei, am zweiten unten, dann wieder oben und unten. Hinter dem letzten Pylon ist das Ziel. - -Ein Feld ist 30 cm groß, so breit wie der mBot2. Ein Schritt von Feld zu Feld ist also **fahre vor** mit 30. - -::: übung vbb-slalom -titel: Slalom -auftrag: Fahre den Slalom bis ins Ziel, ohne einen Pylon zu berühren. Benutze **wiederhole**. -welt: slalom -braucht: forSchleife -tipp: Fahr erst nur oben um den ersten Pylon herum: links drehen, ein Feld vor, rechts drehen, zwei Felder vor, rechts drehen, ein Feld vor, links drehen. -tipp: Unten herum geht genauso, nur mit links und rechts vertauscht. „Oben herum, dann unten herum“ kommt in **wiederhole 2 mal**. -lösung: vbb-slalom-loesung.visustruct -::: -`,Qz=`--- -titel: Kleeblatt im Wald -nach: 7 -stufe: 3 ---- - -Ganz hinten im Wald liegt ein Kleeblatt auf einem schwarzen Feld. Auf dem Weg dorthin stehen Bäume, aber nie zwei direkt hintereinander. Steht ein Baum vor dem mBot2, fährt er außen herum und dann weiter geradeaus. - -Ein Feld ist 30 cm groß. Steht ein Baum im nächsten Feld, misst der Abstandssensor weniger als 20 cm. - -::: übung vbb-wald -titel: Kleeblatt im Wald -auftrag: Der mBot2 fährt in beiden Welten bis zum schwarzen Feld und umfährt dabei jeden Baum, ohne anzustoßen. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit **Linie** **gleich** 0, so wie beim Rand in Lektion 7. Darin eine Verzweigung: **wenn** **Abstand** **kleiner als** 20, **sonst** **fahre vor** mit 30. -tipp: Um einen Baum herum: links drehen, 30 vor, rechts drehen, 60 vor, rechts drehen, 30 vor, links drehen. -lösung: vbb-wald-loesung.visustruct -::: -`,$z=`--- -titel: Die Alarmanlage -nach: 16 -stufe: 2 ---- - -Der mBot2 bewacht dein Zimmer. Kommt jemand näher als 20 cm **oder** wird es laut (Lautstärke über 60), schlägt er Alarm: Die LEDs leuchten rot und er piept. Sonst sind die LEDs aus. Mit Taste B schaltest du die Alarmanlage ab. - -::: übung vb-alarmanlage -titel: Die Alarmanlage -auftrag: Solange Taste B nicht gedrückt ist, prüft der mBot2 immer wieder: Ist der Abstand unter 20 cm oder die Lautstärke über 60, leuchten die LEDs rot und er spielt einen Ton. Sonst gehen die LEDs aus. Danach wartet er kurz. -messwerte: getDistance=10, isButtonB=false/true -> none, tone -messwerte: getLoudness=80, isButtonB=false/true -> none, tone -messwerte: getDistance=100, getLoudness=0, isButtonB=false/true -> none, noTone, ledOff -braucht: whileSchleife, verzweigung -tipp: Außen steht eine While-Schleife mit \`!mbot.isButtonB()\`. Darin eine Verzweigung und danach **kurz warten**. -tipp: Die Bedingung der Verzweigung: \`mbot.getDistance() < 20 || mbot.getLoudness() > 60\`. Im true-Zweig \`mbot.setLed(255, 0, 0)\` und \`mbot.playTone(880, 200)\`, im false-Zweig \`mbot.ledOff()\`. -lösung: vb-alarmanlage-loesung.visustruct -::: -`,Yz=`--- -titel: Labyrinth mit Ausgängen -nach: 5 -stufe: 3 ---- - -Der mBot2 steht unten links und schaut nach rechts. Über ihm liegen Wandreihen. Jede hat genau eine Lücke, und jede Lücke liegt weiter rechts als die darunter. Ganz oben ist das Ziel. - -Der mBot2 fährt nach rechts und schaut in jedem Feld nach oben. Ist dort eine Lücke, fährt er hindurch in den nächsten Gang. - -::: übung vb-ausgang -titel: Labyrinth mit Ausgängen -auftrag: Programmiere den mBot2 so, dass er in beiden Welten durch alle Lücken bis zum Ziel fährt, ohne anzustoßen. Ein Feld ist 30 cm groß. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: In jedem Durchlauf dreht sich der mBot2 zuerst nach links und misst. Ist oben frei, sind es mehr als 20 cm. -tipp: Durch die Lücke sind es zwei Felder bis in den nächsten Gang. Danach soll er wieder nach rechts schauen. Ist oben eine Wand, dreht er sich zurück und fährt ein Feld weiter. -lösung: vb-ausgang-loesung.visustruct -::: -`,Kz=`--- -titel: Binär zählen -nach: 15 -stufe: 3 ---- - -Computer rechnen mit nur zwei Ziffern: 0 und 1. Das heißt **binär**. Mit drei LEDs kannst du die Zahlen 0 bis 7 binär zeigen: LED 0 zählt 1, LED 1 zählt 2 und LED 2 zählt 4. Die Zahl 5 ist 4 + 1, also leuchten LED 2 und LED 0. - -| Zahl | LED 2 (4) | LED 1 (2) | LED 0 (1) | -|---|---|---|---| -| 0 | aus | aus | aus | -| 1 | aus | aus | an | -| 2 | aus | an | aus | -| 3 | aus | an | an | -| 5 | an | aus | an | - -::: übung vb-binaer-zaehlen -titel: Binär zählen -auftrag: Eine For-Schleife zählt \`zahl\` von 0 bis 7. Für jede Zahl leuchtet jede der LEDs 0, 1 und 2 grün oder ist aus, genau wie in der Tabelle. Danach wartet der mBot2 1000 Millisekunden. Schalte die LEDs immer in der Reihenfolge 0, 1, 2. -befehle: ledColor 0 "aus", ledColor 1 "aus", ledColor 2 "aus", pause 1000, ledColor 0 "grün", ledColor 1 "aus", ledColor 2 "aus", pause 1000, ledColor 0 "aus", ledColor 1 "grün", ledColor 2 "aus", pause 1000, ledColor 0 "grün", ledColor 1 "grün", ledColor 2 "aus", pause 1000, ledColor 0 "aus", ledColor 1 "aus", ledColor 2 "grün", pause 1000, ledColor 0 "grün", ledColor 1 "aus", ledColor 2 "grün", pause 1000, ledColor 0 "aus", ledColor 1 "grün", ledColor 2 "grün", pause 1000, ledColor 0 "grün", ledColor 1 "grün", ledColor 2 "grün", pause 1000 -braucht: forSchleife, verzweigung -tipp: Ob LED 0 an ist, verrät der Rest beim Teilen durch 2: \`zahl % 2 == 1\`. Für LED 1 teilst du erst durch 2: \`zahl / 2 % 2 == 1\`. Für LED 2 durch 4: \`zahl / 4 % 2 == 1\`. -tipp: In der Schleife stehen drei Verzweigungen und danach **kurz warten**. Im true-Zweig zum Beispiel \`mbot.led(0).setColor("grün")\`, im false-Zweig \`mbot.led(0).setColor("aus")\`. -lösung: vb-binaer-zaehlen-loesung.visustruct -::: -`,Xz=`--- -titel: Das Dreieck -nach: 2 -stufe: 1 ---- - -Beim Quadrat dreht sich der mBot2 viermal um 90°. Zusammen sind das 360°, eine ganze Runde. Bei einem Dreieck dreht er sich auch einmal ganz herum, aber nur in drei Ecken. - -In die Klammer von **drehe rechts** kannst du schreiben, wie weit er sich drehen soll: \`mbot.turnRight(45)\` dreht nur 45°. - -::: übung vb-dreieck -titel: Das Dreieck -auftrag: Lass den mBot2 ein Dreieck mit drei gleich langen Seiten fahren. Jede Seite ist 30 cm lang. Benutze eine Schleife. -fahrt: 3 x (forward 30, turnRight 120) -braucht: forSchleife -tipp: Wie viel Grad muss eine Ecke sein, damit drei Ecken zusammen eine ganze Runde (360°) ergeben? -tipp: In der Schleife fährt der mBot2 eine Seite und dreht sich dann um 120°. -lösung: vb-dreieck-loesung.visustruct -::: - -::: angeberwissen -Die Idee, mit einem fahrenden Roboter Figuren zu zeichnen, ist über 50 Jahre alt: Ende der 1960er-Jahre entstand die Sprache **Logo**. Kinder steuerten damit eine „Schildkröte“, die mit einem Stift über das Papier fuhr. -::: -`,e6=`--- -titel: Rückwärts einparken -nach: 16 -stufe: 2 ---- - -Rechts von der Straße parken Autos (die Klötze). Irgendwo ist eine Lücke, und genau davor klebt eine blaue Markierung auf der Straße. Der mBot2 sucht die Lücke und parkt rückwärts ein, wie ein Auto. - -Hinten hat er keinen Sensor. Er schaut deshalb nach vorn auf die Wand gegenüber: Je weiter er rückwärts in die Lücke fährt, desto größer wird der Abstand dorthin. - -::: übung vb-einparken -titel: Rückwärts einparken -auftrag: Der mBot2 fährt in 10-cm-Schritten vor, bis er auf Blau steht. Dann dreht er sich nach links, sodass sein Heck zur Lücke zeigt. Er fährt rückwärts, solange der Abstand zur Wand vor ihm unter 45 cm ist. Zum Schluss leuchten die LEDs grün und er zeigt **Geparkt!**. Es gibt zwei Straßen mit verschiedenen Lücken. -welt: parken-1 -> ledOn, screen "Geparkt!" -welt: parken-2 -> ledOn, screen "Geparkt!" -braucht: whileSchleife -tipp: Zwei While-Schleifen hintereinander: erst \`!mbot.getColor().equals("blau")\` mit \`mbot.forward()\` darin, dann \`mbot.getDistance() < 45\` mit \`mbot.backward()\` darin. Dazwischen steht \`mbot.turnLeft()\`. -tipp: Am Ende: \`mbot.setLed(0, 255, 0)\` und \`mbot.showText("Geparkt!")\`. -lösung: vb-einparken-loesung.visustruct -::: -`,t6='---\ntitel: Hindernis ausweichen\nnach: 16\nstufe: 2\n---\n\nAuf dem Weg zum roten Feld stehen Klötze im Weg. Der mBot2 fährt in 10-cm-Schritten vor. Taucht ein Klotz auf (näher als 20 cm), warnt er mit Licht und Ton und fährt außen herum: nach rechts drehen, 30 cm vor, nach links drehen. Dann geht es weiter geradeaus.\n\n::: übung vb-hindernis\ntitel: Hindernis ausweichen\nauftrag: Der mBot2 fährt, solange er nicht auf Rot steht. Ist ein Klotz näher als 20 cm, leuchten die LEDs orange (`mbot.setLed(255, 128, 0)`), er piept und weicht aus. Danach gehen die LEDs aus. Sonst fährt er 10 cm vor. Es gibt zwei Welten.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, darin eine Verzweigung mit `mbot.getDistance() < 20`.\ntipp: Im true-Zweig: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. Im false-Zweig: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',n6=`--- -titel: Knight Rider -nach: 15 -stufe: 2 ---- - -In der Fernsehserie „Knight Rider“ hat das sprechende Auto KITT vorn ein rotes Licht, das immer hin und her läuft. Das baust du mit den fünf LEDs nach. - -::: übung vb-knight-rider -titel: Knight Rider -auftrag: Ein rotes Licht läuft von LED 0 bis LED 4 und wieder zurück bis LED 1. Jede LED leuchtet 100 Millisekunden und geht dann aus. Benutze zwei For-Schleifen: eine zählt hoch, eine zählt runter. -befehle: ledColor 0 "rot", pause 100, ledColor 0 "aus", ledColor 1 "rot", pause 100, ledColor 1 "aus", ledColor 2 "rot", pause 100, ledColor 2 "aus", ledColor 3 "rot", pause 100, ledColor 3 "aus", ledColor 4 "rot", pause 100, ledColor 4 "aus", ledColor 3 "rot", pause 100, ledColor 3 "aus", ledColor 2 "rot", pause 100, ledColor 2 "aus", ledColor 1 "rot", pause 100, ledColor 1 "aus" -braucht: forSchleife -tipp: Die erste Schleife zählt \`i\` von 0 bis 4 hoch. Die zweite startet bei 3 und zählt mit \`i--\` runter, solange \`i > 0\`. -tipp: In beiden Schleifen: \`mbot.led(i).setColor("rot")\`, \`mbot.pause(100)\`, \`mbot.led(i).setColor("aus")\`. -lösung: vb-knight-rider-loesung.visustruct -::: -`,i6=`--- -titel: Das Labyrinth -nach: 5 -stufe: 2 ---- - -Der mBot2 steht in einem Labyrinth. Das Ziel ist ein schwarzes Feld mit grüner Fahne. Die Gänge sind 30 cm breit. - -Eine einfache Regel bringt ihn hindurch: **Ist vorn frei, fahr vor. Sonst dreh dich nach rechts. Ist dort auch eine Wand, dreh dich ganz um.** - -Woran merkt der mBot2, dass er im Ziel ist? Der Liniensensor unten sieht das schwarze Feld: \`mbot.getLine()\` ist dann nicht mehr \`0\`. - -::: übung vb-labyrinth -titel: Das Labyrinth -auftrag: Programmiere den mBot2 so, dass er in beiden Labyrinthen ins Ziel findet, ohne anzustoßen. -welt: labyrinth-1, labyrinth-2 -braucht: whileSchleife, verzweigung -tipp: Außen eine While-Schleife mit der Bedingung \`mbot.getLine() == 0\`. Sie läuft, bis der mBot2 auf dem Ziel steht. -tipp: In der Schleife eine Verzweigung \`mbot.getDistance() > 15\`: Ja → \`mbot.forward()\`. Nein → \`mbot.turnRight()\`, danach noch eine Verzweigung \`mbot.getDistance() < 15\` mit \`mbot.turnRight(180)\`. -lösung: vb-labyrinth-loesung.visustruct -::: - -::: angeberwissen -Mit der Regel „Hand immer an der Wand“ findet man aus jedem Labyrinth, dessen Wände alle zusammenhängen. Schon die Griechen erzählten von Theseus, der sich im Labyrinth des Minotaurus mit einem Wollfaden half. -::: -`,a6='---\ntitel: Linienfolger mit Stopp\nnach: 20\nstufe: 3\n---\n\nDer mBot2 folgt einer schwarzen Linie und hält am roten Feld an ihrem Ende an.\n\nDafür gibt er mit **Räder einzeln** Gas: `mbot.drive(40, 40)` lässt beide Räder gleich schnell drehen, er fährt geradeaus weiter, bis ein anderer Fahrbefehl kommt. `mbot.drive(10, 40)` macht eine Linkskurve, `mbot.drive(40, 10)` eine Rechtskurve. `mbot.stop()` hält ihn an.\n\nDie beiden mittleren Fühler des Liniensensors fragst du mit `mbot.isLineLeft()` und `mbot.isLineRight()` ab. Sehen beide die Linie, fährt er geradeaus. Sieht nur der linke sie, lenkt er nach links, sieht nur der rechte sie, nach rechts.\n\n::: übung vb-linienfolger-stopp\ntitel: Linienfolger mit Stopp\nauftrag: Solange der mBot2 nicht auf Rot steht, folgt er der Linie. Danach hält er an. In der zweiten Welt schlängelt sich die Linie.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, danach **anhalten**.\ntipp: In der Schleife: Sind `mbot.isLineLeft() && mbot.isLineRight()`, dann `mbot.drive(40, 40)`. Sonst, wenn `mbot.isLineLeft()`, dann `mbot.drive(10, 40)`. Sonst, wenn `mbot.isLineRight()`, dann `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',s6=`--- -titel: Morsen -nach: 15 -stufe: 2 ---- - -Früher haben Schiffe mit Licht Nachrichten geschickt, im **Morsecode**: Jeder Buchstabe besteht aus kurzen und langen Signalen. Der bekannteste Notruf ist **SOS**: S ist dreimal kurz, O ist dreimal lang. - -::: übung vb-morsen -titel: SOS morsen -auftrag: LED 2 morst SOS in Weiß. Kurz heißt: 200 Millisekunden an, dann 200 aus. Lang heißt: 600 Millisekunden an, dann 200 aus. Zwischen den Buchstaben wartet der mBot2 zusätzlich 400 Millisekunden. Benutze für jeden Buchstaben eine Schleife. -befehle: 3 x (ledColor 2 "weiß", pause 200, ledColor 2 "aus", pause 200), pause 400, 3 x (ledColor 2 "weiß", pause 600, ledColor 2 "aus", pause 200), pause 400, 3 x (ledColor 2 "weiß", pause 200, ledColor 2 "aus", pause 200) -braucht: forSchleife -tipp: Drei For-Schleifen hintereinander, jede läuft dreimal. Dazwischen steht jeweils **kurz warten** mit 400. -tipp: In der ersten und dritten Schleife: \`mbot.led(2).setColor("weiß")\`, \`mbot.pause(200)\`, \`mbot.led(2).setColor("aus")\`, \`mbot.pause(200)\`. In der mittleren wartet er nach dem Einschalten 600. -lösung: vb-morsen-loesung.visustruct -::: -`,r6=`--- -titel: Der Nachtwächter -nach: 18 -stufe: 1 ---- - -Der mBot2 ist ein Nachtwächter. Solange es dunkel ist (Helligkeit unter 20), läuft er Streife: 30 cm vor und dann umdrehen. Sobald es hell wird, ist seine Schicht vorbei: Er zeigt **Zzz** auf dem Bildschirm und schläft. - -::: übung vb-nachtwaechter -titel: Der Nachtwächter -auftrag: Solange die Helligkeit unter 20 ist, fährt der mBot2 30 cm vor und dreht sich um 180°. Danach zeigt er **Zzz** auf dem Bildschirm. -messwerte: getBrightness=5/80 -> drives, screen "Zzz" -messwerte: getBrightness=80 -> none, screen "Zzz" -braucht: whileSchleife -tipp: Eine While-Schleife mit \`mbot.getBrightness() < 20\`. Darin \`mbot.forward(30)\` und \`mbot.turnRight(180)\`. -tipp: Nach der Schleife steht \`mbot.showText("Zzz")\`. -lösung: vb-nachtwaechter-loesung.visustruct -::: -`,o6=`--- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Vor dem mBot2 stehen vier Pylonen in einer Reihe. Er fährt Slalom: am ersten Pylon oben vorbei, am zweiten unten, dann wieder oben und unten. Hinter dem letzten Pylon ist das Ziel. - -In dieser Welt ist ein Feld 30 cm groß, so breit wie der mBot2. Ein Schritt von Feld zu Feld ist also \`mbot.forward(30)\`. - -::: übung vb-slalom -titel: Slalom -auftrag: Fahre den Slalom bis ins Ziel, ohne einen Pylon zu berühren. Benutze eine Schleife. -welt: slalom -braucht: forSchleife -tipp: Überlege zuerst, wie der mBot2 oben um einen einzigen Pylon herumfährt: Er steht danach zwei Felder weiter in derselben Reihe und schaut wieder nach rechts. -tipp: Unten herum geht genauso, nur mit links und rechts vertauscht. „Oben herum, dann unten herum“ wiederholt sich zweimal. -lösung: vb-slalom-loesung.visustruct -::: -`,l6=`--- -titel: Die Spirale -nach: 2 -stufe: 2 ---- - -Der mBot2 soll eine eckige Spirale fahren: Die erste Seite ist 10 cm lang, die zweite 20 cm, die dritte 30 cm und so weiter. Nach jeder Seite dreht er sich nach rechts. - -Die Zählvariable einer For-Schleife kannst du auch in der Schleife benutzen, zum Beispiel in der Klammer von **fahre vor**. Dort darf auch eine Rechnung stehen, etwa \`mbot.forward(i * 5)\`. - -::: übung vb-spirale -titel: Die Spirale -auftrag: Lass den mBot2 eine Spirale mit 8 Seiten fahren: 10 cm, 20 cm, 30 cm … bis 80 cm. Nach jeder Seite dreht er sich nach rechts. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight, forward 50, turnRight, forward 60, turnRight, forward 70, turnRight, forward 80, turnRight -braucht: forSchleife -tipp: Lass die Zählvariable von 1 bis 8 laufen. Wie lang ist dann die Seite in jedem Durchlauf? -tipp: In der Klammer von **fahre vor** steht eine Rechnung mit der Zählvariable. -lösung: vb-spirale-loesung.visustruct -::: -`,u6=`--- -titel: Die Treppe -nach: 2 -stufe: 1 ---- - -Der mBot2 steigt eine Treppe hinauf, von oben gesehen: Jede Stufe ist 20 cm tief und 20 cm breit. - -::: übung vb-treppe -titel: Die Treppe -auftrag: Lass den mBot2 drei Stufen fahren. Eine Stufe: 20 cm vor, nach links drehen, 20 cm vor, nach rechts drehen. Benutze eine Schleife. -fahrt: 3 x (forward 20, turnLeft, forward 20, turnRight) -braucht: forSchleife -tipp: Schreib zuerst eine Stufe auf. Dann packst du sie in eine For-Schleife, die dreimal läuft. -tipp: In der Schleife: \`mbot.forward(20)\`, \`mbot.turnLeft()\`, \`mbot.forward(20)\`, \`mbot.turnRight()\`. -lösung: vb-treppe-loesung.visustruct -::: -`,m6=`--- -titel: Der Tunnelsucher -nach: 5 -stufe: 3 ---- - -Der mBot2 soll im ersten **Tunnelfeld** anhalten: Das ist ein Feld mit einer Wand links **und** einer Wand rechts. Felder mit nur einer Wand zählen nicht. In der Simulation ist das richtige Feld hellgrün, der Liniensensor sieht es aber nicht. - -Der Ultraschallsensor schaut nur nach vorn. Um nach links zu schauen, dreht sich der mBot2 nach links, misst und dreht sich wieder zurück. - -Den Messwert merkst du dir in einer **Variable**, zum Beispiel in einer Anweisung \`links = mbot.getDistance()\`. Am Anfang legst du sie an: \`int links = 99\`. - -::: übung vb-tunnel -titel: Der Tunnelsucher -auftrag: Programmiere den mBot2 so, dass er in beiden Welten im ersten Tunnelfeld anhält. Ein Feld ist 30 cm groß. -welt: tunnel-1, tunnel-2 -braucht: doUntilSchleife -tipp: In jedem Durchlauf fährt der mBot2 ein Feld vor und schaut sich dann nach links und nach rechts um. Merk dir beide Abstände in Variablen. Am Ende schaut er wieder nach vorn. -tipp: Hier passt eine Schleife, die erst fährt und danach prüft. Sie läuft weiter, solange links **oder** rechts mindestens 20 cm frei ist: \`links >= 20 || rechts >= 20\`. -lösung: vb-tunnel-loesung.visustruct -::: -`,c6=`--- -titel: Kleeblatt im Wald -nach: 5 -stufe: 2 ---- - -Das Ziel liegt geradeaus. Auf dem Weg stehen Bäume, aber nie zwei direkt hintereinander. Steht ein Baum vor dem mBot2, fährt er außen herum und dann weiter geradeaus. - -Ein Feld ist 30 cm groß. Steht ein Baum im nächsten Feld, misst der Ultraschallsensor weniger als 20 cm. - -::: übung vb-wald -titel: Kleeblatt im Wald -auftrag: Der mBot2 soll in beiden Welten bis zum Ziel fahren und dabei jeden Baum umfahren, ohne anzustoßen. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: Wie bei „Fahre bis zum Ziel“ läuft außen eine Schleife, bis der Liniensensor das Ziel sieht. In jedem Durchlauf gibt es zwei Möglichkeiten: Baum vorn oder frei. -tipp: Um einen Baum herum: nach links drehen, ein Feld vor, nach rechts drehen, zwei Felder vor, nach rechts drehen, ein Feld vor, nach links drehen. -lösung: vb-wald-loesung.visustruct -::: -`,d6=`--- -titel: The alarm system -nach: 16 -stufe: 2 ---- - -The mBot2 guards your room. If someone comes closer than 20 cm **or** it gets loud (loudness above 60), it raises the alarm: the LEDs light up red and it beeps. Otherwise the LEDs are off. With button B you switch the alarm system off. - -::: übung vb-alarmanlage -titel: The alarm system -auftrag: As long as button B is not pressed, the mBot2 checks again and again: if the distance is below 20 cm or the loudness above 60, the LEDs light up red and it plays a tone. Otherwise the LEDs go off. Then it waits a moment. -messwerte: getDistance=10, isButtonB=false/true -> none, tone -messwerte: getLoudness=80, isButtonB=false/true -> none, tone -messwerte: getDistance=100, getLoudness=0, isButtonB=false/true -> none, noTone, ledOff -braucht: whileSchleife, verzweigung -tipp: On the outside is a while loop with \`!mbot.isButtonB()\`. Inside a branch and after it **wait a moment**. -tipp: The condition of the branch: \`mbot.getDistance() < 20 || mbot.getLoudness() > 60\`. In the true branch \`mbot.setLed(255, 0, 0)\` and \`mbot.playTone(880, 200)\`, in the false branch \`mbot.ledOff()\`. -lösung: vb-alarmanlage-loesung.visustruct -::: -`,h6=`--- -titel: Maze with exits -nach: 5 -stufe: 3 ---- - -The mBot2 stands at the bottom left and faces right. Above it are rows of walls. Each has exactly one gap, and each gap lies further right than the one below. The goal is at the very top. - -The mBot2 drives to the right and looks up in every square. If there is a gap, it drives through into the next corridor. - -::: übung vb-ausgang -titel: Maze with exits -auftrag: Program the mBot2 so that in both worlds it drives through all gaps to the goal without bumping into anything. One square is 30 cm. -welt: ausgang-1, ausgang-2 -braucht: whileSchleife, verzweigung -tipp: In each pass the mBot2 first turns left and measures. If the way up is free, it is more than 20 cm. -tipp: Through the gap it is two squares into the next corridor. Afterwards it should face right again. If there is a wall above, it turns back and drives one square further. -lösung: vb-ausgang-loesung.visustruct -::: -`,g6=`--- -titel: Counting in binary -nach: 15 -stufe: 3 ---- - -Computers calculate with only two digits: 0 and 1. That is called **binary**. With three LEDs you can show the numbers 0 to 7 in binary: LED 0 counts 1, LED 1 counts 2 and LED 2 counts 4. The number 5 is 4 + 1, so LED 2 and LED 0 light up. - -| Number | LED 2 (4) | LED 1 (2) | LED 0 (1) | -|---|---|---|---| -| 0 | off | off | off | -| 1 | off | off | on | -| 2 | off | on | off | -| 3 | off | on | on | -| 5 | on | off | on | - -::: übung vb-binaer-zaehlen -titel: Counting in binary -auftrag: A for loop counts \`number\` from 0 to 7. For each number, each of the LEDs 0, 1 and 2 lights up green or is off, exactly as in the table. Then the mBot2 waits 1000 milliseconds. Always switch the LEDs in the order 0, 1, 2. -befehle: ledColor 0 "off", ledColor 1 "off", ledColor 2 "off", pause 1000, ledColor 0 "green", ledColor 1 "off", ledColor 2 "off", pause 1000, ledColor 0 "off", ledColor 1 "green", ledColor 2 "off", pause 1000, ledColor 0 "green", ledColor 1 "green", ledColor 2 "off", pause 1000, ledColor 0 "off", ledColor 1 "off", ledColor 2 "green", pause 1000, ledColor 0 "green", ledColor 1 "off", ledColor 2 "green", pause 1000, ledColor 0 "off", ledColor 1 "green", ledColor 2 "green", pause 1000, ledColor 0 "green", ledColor 1 "green", ledColor 2 "green", pause 1000 -braucht: forSchleife, verzweigung -tipp: Whether LED 0 is on is given by the remainder when dividing by 2: \`number % 2 == 1\`. For LED 1 you first divide by 2: \`number / 2 % 2 == 1\`. For LED 2 by 4: \`number / 4 % 2 == 1\`. -tipp: The loop contains three branches and then **wait a moment**. In the true branch, for example, \`mbot.led(0).setColor("green")\`, in the false branch \`mbot.led(0).setColor("off")\`. -lösung: vb-binaer-zaehlen-loesung.visustruct -::: -`,p6=`--- -titel: The triangle -nach: 2 -stufe: 1 ---- - -For the square the mBot2 turns four times by 90°. Together that is 360°, one full turn. For a triangle it also turns all the way around once, but in only three corners. - -Inside the brackets of **turn right** you can write how far it should turn: \`mbot.turnRight(45)\` turns only 45°. - -::: übung vb-dreieck -titel: The triangle -auftrag: Let the mBot2 drive a triangle with three sides of equal length. Each side is 30 cm long. Use a loop. -fahrt: 3 x (forward 30, turnRight 120) -braucht: forSchleife -tipp: How many degrees must one corner be so that three corners add up to a full turn (360°)? -tipp: In the loop the mBot2 drives one side and then turns by 120°. -lösung: vb-dreieck-loesung.visustruct -::: - -::: angeberwissen -The idea of drawing shapes with a driving robot is more than 50 years old: the language **Logo** was created in the late 1960s. Children used it to steer a "turtle" that rolled across paper with a pen. -::: -`,f6=`--- -titel: Reverse parking -nach: 16 -stufe: 2 ---- - -To the right of the road there are parked cars (the blocks). Somewhere there is a gap, and right in front of it a blue marking is stuck on the road. The mBot2 looks for the gap and reverses into it, like a car. - -It has no sensor at the back. So it looks forward at the wall opposite: the further it reverses into the gap, the bigger the distance to that wall gets. - -::: übung vb-einparken -titel: Reverse parking -auftrag: The mBot2 drives forward in steps of 10 cm until it is on blue. Then it turns left, so its rear points to the gap. It reverses as long as the distance to the wall in front of it is below 45 cm. Finally the LEDs light up green and it shows **Parked!**. There are two roads with different gaps. -welt: parken-1 -> ledOn, screen "Parked!" -welt: parken-2 -> ledOn, screen "Parked!" -braucht: whileSchleife -tipp: Two while loops one after the other: first \`!mbot.getColor().equals("blue")\` with \`mbot.forward()\` inside, then \`mbot.getDistance() < 45\` with \`mbot.backward()\` inside. In between is \`mbot.turnLeft()\`. -tipp: At the end: \`mbot.setLed(0, 255, 0)\` and \`mbot.showText("Parked!")\`. -lösung: vb-einparken-loesung.visustruct -::: -`,b6='---\ntitel: Avoid obstacles\nnach: 16\nstufe: 2\n---\n\nOn the way to the red field there are blocks in the way. The mBot2 drives forward in steps of 10 cm. If a block shows up (closer than 20 cm), it warns with light and sound and drives around it: turn right, 30 cm forward, turn left. Then it carries on straight ahead.\n\n::: übung vb-hindernis\ntitel: Avoid obstacles\nauftrag: The mBot2 drives as long as it is not on red. If a block is closer than 20 cm, the LEDs light up orange (`mbot.setLed(255, 128, 0)`), it beeps and drives around it. Then the LEDs go off. Otherwise it drives forward 10 cm. There are two worlds.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, inside a branch with `mbot.getDistance() < 20`.\ntipp: In the true branch: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. In the false branch: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',x6=`--- -titel: Knight Rider -nach: 15 -stufe: 2 ---- - -In the TV series “Knight Rider”, the talking car KITT has a red light at the front that keeps running back and forth. You rebuild it with the five LEDs. - -::: übung vb-knight-rider -titel: Knight Rider -auftrag: A red light runs from LED 0 to LED 4 and back to LED 1. Each LED lights up for 100 milliseconds and then goes off. Use two for loops: one counts up, one counts down. -befehle: ledColor 0 "red", pause 100, ledColor 0 "off", ledColor 1 "red", pause 100, ledColor 1 "off", ledColor 2 "red", pause 100, ledColor 2 "off", ledColor 3 "red", pause 100, ledColor 3 "off", ledColor 4 "red", pause 100, ledColor 4 "off", ledColor 3 "red", pause 100, ledColor 3 "off", ledColor 2 "red", pause 100, ledColor 2 "off", ledColor 1 "red", pause 100, ledColor 1 "off" -braucht: forSchleife -tipp: The first loop counts \`i\` up from 0 to 4. The second starts at 3 and counts down with \`i--\` as long as \`i > 0\`. -tipp: In both loops: \`mbot.led(i).setColor("red")\`, \`mbot.pause(100)\`, \`mbot.led(i).setColor("off")\`. -lösung: vb-knight-rider-loesung.visustruct -::: -`,v6=`--- -titel: The maze -nach: 5 -stufe: 2 ---- - -The mBot2 is standing in a maze. The goal is a black square with a green flag. The corridors are 30 cm wide. - -A simple rule gets it through: **If the way ahead is free, drive forward. Otherwise turn right. If there is a wall there too, turn all the way around.** - -How does the mBot2 notice that it has reached the goal? The line sensor underneath sees the black square: \`mbot.getLine()\` is then no longer \`0\`. - -::: übung vb-labyrinth -titel: The maze -auftrag: Program the mBot2 so that it finds the goal in both mazes without bumping into a wall. -welt: labyrinth-1, labyrinth-2 -braucht: whileSchleife, verzweigung -tipp: On the outside a while loop with the condition \`mbot.getLine() == 0\`. It runs until the mBot2 is on the goal. -tipp: Inside the loop a branch \`mbot.getDistance() > 15\`: yes → \`mbot.forward()\`. No → \`mbot.turnRight()\`, then another branch \`mbot.getDistance() < 15\` with \`mbot.turnRight(180)\`. -lösung: vb-labyrinth-loesung.visustruct -::: - -::: angeberwissen -With the rule "always keep one hand on the wall" you get out of any maze whose walls are all connected. The ancient Greeks already told of Theseus, who found his way through the Minotaur's labyrinth with a ball of thread. -::: -`,w6='---\ntitel: Line follower with stop\nnach: 20\nstufe: 3\n---\n\nThe mBot2 follows a black line and stops at the red field at its end.\n\nFor this it steps on the gas with **wheels separately**: `mbot.drive(40, 40)` turns both wheels equally fast, it keeps driving straight ahead until another driving command comes. `mbot.drive(10, 40)` makes a left curve, `mbot.drive(40, 10)` a right curve. `mbot.stop()` stops it.\n\nYou ask the two middle probes of the line sensor with `mbot.isLineLeft()` and `mbot.isLineRight()`. If both see the line, it drives straight ahead. If only the left one sees it, it steers left, if only the right one sees it, right.\n\n::: übung vb-linienfolger-stopp\ntitel: Line follower with stop\nauftrag: As long as the mBot2 is not on red, it follows the line. Then it stops. In the second world the line winds about.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, after it **stop**.\ntipp: Inside the loop: if `mbot.isLineLeft() && mbot.isLineRight()`, then `mbot.drive(40, 40)`. Otherwise, if `mbot.isLineLeft()`, then `mbot.drive(10, 40)`. Otherwise, if `mbot.isLineRight()`, then `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',y6=`--- -titel: Morse code -nach: 15 -stufe: 2 ---- - -Ships used to send messages with light, in **Morse code**: every letter is made of short and long signals. The best-known distress call is **SOS**: S is three short, O is three long. - -::: übung vb-morsen -titel: Morse SOS -auftrag: LED 2 sends SOS in white. Short means: on for 200 milliseconds, then off for 200. Long means: on for 600 milliseconds, then off for 200. Between the letters the mBot2 waits another 400 milliseconds. Use a loop for each letter. -befehle: 3 x (ledColor 2 "white", pause 200, ledColor 2 "off", pause 200), pause 400, 3 x (ledColor 2 "white", pause 600, ledColor 2 "off", pause 200), pause 400, 3 x (ledColor 2 "white", pause 200, ledColor 2 "off", pause 200) -braucht: forSchleife -tipp: Three for loops one after the other, each runs three times. Between them there is **wait a moment** with 400. -tipp: In the first and third loop: \`mbot.led(2).setColor("white")\`, \`mbot.pause(200)\`, \`mbot.led(2).setColor("off")\`, \`mbot.pause(200)\`. In the middle one it waits 600 after switching on. -lösung: vb-morsen-loesung.visustruct -::: -`,z6=`--- -titel: The night watchman -nach: 18 -stufe: 1 ---- - -The mBot2 is a night watchman. As long as it is dark (brightness below 20), it goes on patrol: 30 cm forward and then turn around. As soon as it gets light, its shift is over: it shows **Zzz** on its screen and sleeps. - -::: übung vb-nachtwaechter -titel: The night watchman -auftrag: As long as the brightness is below 20, the mBot2 drives forward 30 cm and turns by 180°. Then it shows **Zzz** on its screen. -messwerte: getBrightness=5/80 -> drives, screen "Zzz" -messwerte: getBrightness=80 -> none, screen "Zzz" -braucht: whileSchleife -tipp: A while loop with \`mbot.getBrightness() < 20\`. Inside \`mbot.forward(30)\` and \`mbot.turnRight(180)\`. -tipp: After the loop is \`mbot.showText("Zzz")\`. -lösung: vb-nachtwaechter-loesung.visustruct -::: -`,I6=`--- -titel: Slalom -nach: 2 -stufe: 2 ---- - -Four cones stand in a row in front of the mBot2. It drives a slalom: past the first cone on the top side, past the second on the bottom side, then top and bottom again. Behind the last cone is the goal. - -In this world one square is 30 cm, as wide as the mBot2. One step from square to square is therefore \`mbot.forward(30)\`. - -::: übung vb-slalom -titel: Slalom -auftrag: Drive the slalom to the goal without touching a cone. Use a loop. -welt: slalom -braucht: forSchleife -tipp: First think about how the mBot2 drives around a single cone on the top side: afterwards it is two squares further along in the same row and faces right again. -tipp: Around the bottom works the same way, only with left and right swapped. "Top, then bottom" repeats twice. -lösung: vb-slalom-loesung.visustruct -::: -`,k6=`--- -titel: The spiral -nach: 2 -stufe: 2 ---- - -The mBot2 should drive a square spiral: the first side is 10 cm long, the second 20 cm, the third 30 cm and so on. After each side it turns right. - -You can also use the counter variable of a for loop inside the loop, for example in the brackets of **drive forward**. A calculation is allowed there too, such as \`mbot.forward(i * 5)\`. - -::: übung vb-spirale -titel: The spiral -auftrag: Let the mBot2 drive a spiral with 8 sides: 10 cm, 20 cm, 30 cm … up to 80 cm. After each side it turns right. -fahrt: forward 10, turnRight, forward 20, turnRight, forward 30, turnRight, forward 40, turnRight, forward 50, turnRight, forward 60, turnRight, forward 70, turnRight, forward 80, turnRight -braucht: forSchleife -tipp: Let the counter variable run from 1 to 8. How long is the side in each pass then? -tipp: The brackets of **drive forward** contain a calculation with the counter variable. -lösung: vb-spirale-loesung.visustruct -::: -`,S6=`--- -titel: The staircase -nach: 2 -stufe: 1 ---- - -The mBot2 climbs a staircase, seen from above: each step is 20 cm deep and 20 cm wide. - -::: übung vb-treppe -titel: The staircase -auftrag: Let the mBot2 drive three steps. One step: 20 cm forward, turn left, 20 cm forward, turn right. Use a loop. -fahrt: 3 x (forward 20, turnLeft, forward 20, turnRight) -braucht: forSchleife -tipp: Write down one step first. Then put it into a for loop that runs three times. -tipp: Inside the loop: \`mbot.forward(20)\`, \`mbot.turnLeft()\`, \`mbot.forward(20)\`, \`mbot.turnRight()\`. -lösung: vb-treppe-loesung.visustruct -::: -`,T6=`--- -titel: The tunnel finder -nach: 5 -stufe: 3 ---- - -The mBot2 should stop in the first **tunnel square**: a square with a wall on the left **and** a wall on the right. Squares with only one wall don't count. In the simulation the right square is light green, but the line sensor can't see it. - -The ultrasonic sensor only looks forward. To look left, the mBot2 turns left, measures and turns back again. - -You remember the measured value in a **variable**, for example with a statement \`left = mbot.getDistance()\`. At the start you create it: \`int left = 99\`. - -::: übung vb-tunnel -titel: The tunnel finder -auftrag: Program the mBot2 so that it stops in the first tunnel square in both worlds. One square is 30 cm. -welt: tunnel-1, tunnel-2 -braucht: doUntilSchleife -tipp: In each pass the mBot2 drives one square forward and then looks left and right. Remember both distances in variables. At the end it faces forward again. -tipp: A loop that drives first and checks afterwards fits here. It keeps going as long as at least 20 cm are free on the left **or** on the right: \`left >= 20 || right >= 20\`. -lösung: vb-tunnel-loesung.visustruct -::: -`,_6=`--- -titel: Clover in the forest -nach: 5 -stufe: 2 ---- - -The goal is straight ahead. There are trees on the way, but never two directly behind each other. If a tree stands in front of the mBot2, it drives around it and then continues straight ahead. - -One square is 30 cm. If there is a tree in the next square, the ultrasonic sensor measures less than 20 cm. - -::: übung vb-wald -titel: Clover in the forest -auftrag: In both worlds the mBot2 should drive to the goal and go around every tree without bumping into it. -welt: wald-1, wald-2 -braucht: whileSchleife, verzweigung -tipp: As in "Drive to the goal", a loop on the outside runs until the line sensor sees the goal. In each pass there are two possibilities: tree ahead or free. -tipp: Around a tree: turn left, one square forward, turn right, two squares forward, turn right, one square forward, turn left. -lösung: vb-wald-loesung.visustruct -::: -`,A6=` - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;34; - - - 112;114;117;101;102;101;65;108;116;101;114;40;41; - - - 111;117;116;112;117;116;58;32;34;65;117;102;32;87;105;101;100;101;114;115;101;104;101;110;34; - - -`,j6=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;118;111;108;108;106;228;104;114;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;100;101;114;106;228;104;114;105;103;34; - - - - -`,C6=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 100;111;117;98;108;101;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;98;101;115;116;101;87;101;105;116;101;32;61;32;48; - - - 83;116;114;105;110;103;32;98;101;115;116;101;114;78;97;109;101;32;61;32;34;34; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;119;101;105;116;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 97;110;122;97;104;108;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;119;101;105;116;101; - - - 119;101;105;116;101;32;62;32;98;101;115;116;101;87;101;105;116;101; - - - 98;101;115;116;101;87;101;105;116;101;32;61;32;119;101;105;116;101; - - - 98;101;115;116;101;114;78;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;115;99;104;110;105;116;116;32;61;32;115;117;109;109;101;32;47;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;84;101;105;108;110;101;104;109;101;114;58;32;34;32;43;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;83;99;104;110;105;116;116;58;32;34;32;43;32;115;99;104;110;105;116;116;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;105;101;103;101;114;46;116;120;116;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;83;105;101;103;101;114;58;32;34;32;43;32;98;101;115;116;101;114;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;101;87;101;105;116;101;32;43;32;34;32;109;41;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - -`,D6=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,B6=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;80;117;110;107;116;101;63;34; - - - 112;117;110;107;116;101;91;105;93;32;61;32;122;97;104;108; - - - - - 105;110;116;32;100;117;114;99;104;103;97;110;103;32;61;32;49; - 100;117;114;99;104;103;97;110;103;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 100;117;114;99;104;103;97;110;103;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104;32;45;32;100;117;114;99;104;103;97;110;103; - 105;43;43; - - - 112;117;110;107;116;101;91;105;93;32;60;32;112;117;110;107;116;101;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;112;117;110;107;116;101;91;105;93; - - - 112;117;110;107;116;101;91;105;93;32;61;32;112;117;110;107;116;101;91;105;32;43;32;49;93; - - - 112;117;110;107;116;101;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;112;108;97;116;122;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;112;108;97;116;122;32;43;32;34;46;32;34;32;43;32;112;117;110;107;116;101;91;105;93; - - - - -`,P6=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;71;97;110;122;101;32;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;32;98;105;110;97;101;114;32;61;32;34;34; - - - 122;97;104;108;32;62;32;48; - - - 105;110;116;32;114;101;115;116;32;61;32;122;97;104;108;32;37;32;50; - - - 98;105;110;97;101;114;32;61;32;114;101;115;116;32;43;32;98;105;110;97;101;114; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;101;114; - - -`,O6=` - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;101;108;99;104;101;115;32;87;111;114;116;32;40;110;117;114;32;71;114;111;223;98;117;99;104;115;116;97;98;101;110;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;103;101;104;101;105;109;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;112;104;97;98;101;116;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;112;104;97;98;101;116;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 103;101;104;101;105;109;32;61;32;103;101;104;101;105;109;32;43;32;97;108;112;104;97;98;101;116;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;103;101;104;101;105;109; - - -`,M6=` - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - -`,Z6=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;101;108;99;104;101;115;32;87;111;114;116;32;40;110;117;114;32;71;114;111;223;98;117;99;104;115;116;97;98;101;110;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;103;101;104;101;105;109;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 103;101;104;101;105;109;32;61;32;103;101;104;101;105;109;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;103;101;104;101;105;109; - - -`,L6=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;103;101;104;101;105;109;32;34;87;101;108;99;104;101;114;32;71;101;104;101;105;109;116;101;120;116;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;85;109;32;119;105;101;32;118;105;101;108;101;32;83;116;101;108;108;101;110;32;118;101;114;115;99;104;105;101;98;101;110;63;34; - - - 83;116;114;105;110;103;32;107;108;97;114;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;103;101;104;101;105;109;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;103;101;104;101;105;109;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 107;108;97;114;116;101;120;116;32;61;32;107;108;97;114;116;101;120;116;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;107;108;97;114;116;101;120;116; - - -`,W6=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 122;97;104;108;32;33;61;32;49; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 115;99;104;114;105;116;116;101;43;43; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101; - - -`,E6=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;78;111;116;101;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;97;110;122;97;104;108; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;32;101;105;110;103;101;98;101;110;34; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;110;111;116;101; - - - - - 100;111;117;98;108;101;32;115;99;104;110;105;116;116;32;61;32;115;117;109;109;101;32;42;32;49;46;48;32;47;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;115;99;104;110;105;116;116; - - -`,N6=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;90;97;104;108;101;110;63;34; - - - 105;110;116;32;122;97;104;108;49;32;61;32;49; - - - 105;110;116;32;122;97;104;108;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;97;110;122;97;104;108; - 105;43;43; - - - 105;110;116;32;122;97;104;108;51;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108;51; - - - 122;97;104;108;49;32;61;32;122;97;104;108;50; - - - 122;97;104;108;50;32;61;32;122;97;104;108;51; - - - - -`,F6=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;105;115;116;32;103;101;114;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;105;115;116;32;117;110;103;101;114;97;100;101;34; - - - - -`,R6=` - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;77;87;83;84;32;61;32;48;46;49;57; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;110;101;116;116;111;112;114;101;105;115;32;34;78;101;116;116;111;112;114;101;105;115;63;34; - - - 100;111;117;98;108;101;32;115;116;101;117;101;114;32;61;32;110;101;116;116;111;112;114;101;105;115;32;42;32;77;87;83;84; - - - 100;111;117;98;108;101;32;98;114;117;116;116;111;112;114;101;105;115;32;61;32;110;101;116;116;111;112;114;101;105;115;32;43;32;115;116;101;117;101;114; - - - 111;117;116;112;117;116;58;32;115;116;101;117;101;114; - - - 111;117;116;112;117;116;58;32;98;114;117;116;116;111;112;114;101;105;115; - - -`,J6=` - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;118;101;114;115;117;99;104;101;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;105;110;103;97;98;101;32;34;80;73;78;32;101;105;110;103;101;98;101;110;34; - - - 112;105;110;32;61;32;101;105;110;103;97;98;101; - - - 118;101;114;115;117;99;104;101;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;114;105;99;104;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;75;97;114;116;101;32;103;101;115;112;101;114;114;116;34; - - - - -`,G6=` - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;118;101;114;115;117;99;104;101;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;80;73;78;32;101;105;110;103;101;98;101;110;34; - - - 118;101;114;115;117;99;104;101;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;114;105;99;104;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;75;97;114;116;101;32;103;101;115;112;101;114;114;116;34; - - - - -`,H6=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;49;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;50;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;122;101;105;99;104;101;110;32;34;82;101;99;104;101;110;122;101;105;99;104;101;110;32;40;43;44;32;45;32;111;100;101;114;32;42;41;34; - - - 122;101;105;99;104;101;110; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;45;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;49;32;42;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 111;117;116;112;117;116;58;32;34;85;110;98;101;107;97;110;110;116;101;115;32;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - - -`,V6=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;101;101;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;115;112;97;108;116;101;110;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;109;101;101;114;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 105;110;116;32;115;112;97;108;116;101;32;61;32;48; - 115;112;97;108;116;101;32;60;32;109;101;101;114;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 115;112;97;108;116;101;43;43; - - - 109;101;101;114;91;114;101;105;104;101;93;91;115;112;97;108;116;101;93; - - - 111;117;116;112;117;116;58;32;115;112;97;108;116;101;110;91;115;112;97;108;116;101;93;32;43;32;40;114;101;105;104;101;32;43;32;49;41; - - - - - 248; - - - - - - - - -`,q6=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;101;101;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;101;101;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;115;112;97;108;116;101;110;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - -`,U6=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;109;101;114;32;34;87;101;108;99;104;101;115;32;71;101;114;105;99;104;116;63;32;40;49;44;32;50;32;111;100;101;114;32;51;41;34; - - - 110;117;109;109;101;114; - - - 111;117;116;112;117;116;58;32;34;71;114;105;101;99;104;105;115;99;104;101;114;32;83;97;108;97;116;34; - - - - - 111;117;116;112;117;116;58;32;34;82;101;105;115;45;66;111;119;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;97;102;101;108;45;87;114;97;112;34; - - - - - 111;117;116;112;117;116;58;32;34;66;105;116;116;101;32;101;105;110;101;32;103;252;108;116;105;103;101;32;78;117;109;109;101;114;32;119;228;104;108;101;110;34; - - - - -`,Q6=` - - - 105;110;116;32;122;97;104;108;49;32;61;32;52; - - - 105;110;116;32;122;97;104;108;50;32;61;32;51; - - - 105;110;116;32;115;117;109;109;101;32;61;32;122;97;104;108;49;32;43;32;122;97;104;108;50; - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,$6=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;110;91;105;93;32;34;78;97;109;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;109;101;114;32;34;76;111;115;110;117;109;109;101;114;32;40;49;32;98;105;115;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;84;97;102;101;108;100;105;101;110;115;116;58;32;34;32;43;32;110;97;109;101;110;91;110;117;109;109;101;114;32;45;32;49;93; - - -`,Y6=` - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;86;101;114;100;111;112;112;101;108;116;101;32;90;97;104;108;58;32;34;32;43;32;122;97;104;108; - - -`,K6=` - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;61;32;69;45;66;105;107;101;44;32;50;32;61;32;69;45;83;99;111;111;116;101;114;44;32;48;32;61;32;69;110;100;101;34; - - - 119;97;104;108;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;84;115;99;104;252;115;115;34; - - - -1; - - - - - 119;97;104;108;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;69;45;66;105;107;101;32;103;101;98;117;99;104;116;34; - - - - - 119;97;104;108;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;69;45;83;99;111;111;116;101;114;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;85;110;103;252;108;116;105;103;101;32;65;117;115;119;97;104;108;34; - - - - - - - - - - -`,X6=` - - - - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;61;32;69;45;66;105;107;101;44;32;50;32;61;32;69;45;83;99;111;111;116;101;114;44;32;48;32;61;32;69;110;100;101;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;34;84;115;99;104;252;115;115;34; - - - 77;101;110;252;32;118;101;114;108;97;115;115;101;110; - - - - - 111;117;116;112;117;116;58;32;34;69;45;66;105;107;101;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;69;45;83;99;111;111;116;101;114;32;103;101;98;117;99;104;116;34; - - - - - 111;117;116;112;117;116;58;32;34;85;110;103;252;108;116;105;103;101;32;65;117;115;119;97;104;108;34; - - - - - - -`,eI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;114;105;99;104;116;105;103;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;87;97;115;32;104;101;105;223;116;32;34;32;43;32;116;101;105;108;101;91;48;93;32;43;32;34;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;110;116;119;111;114;116; - - - 97;110;122;97;104;108;43;43; - - - 97;110;116;119;111;114;116;46;101;113;117;97;108;115;40;116;101;105;108;101;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;82;105;99;104;116;105;103;33;34; - - - 114;105;99;104;116;105;103;43;43; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;115;99;104;44;32;114;105;99;104;116;105;103;32;105;115;116;32;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;46;34; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;114;105;99;104;116;105;103;32;43;32;34;32;118;111;110;32;34;32;43;32;97;110;122;97;104;108;32;43;32;34;32;114;105;99;104;116;105;103;34; - - -`,tI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,nI=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;118;111;108;108;106;228;104;114;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;100;101;114;106;228;104;114;105;103;34; - - - - -`,iI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - -`,aI=` - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - 105;110;116;32;109;97;116;104;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;104;97;116;32;105;110;32;77;97;116;104;101;32;101;105;110;101;32;34;32;43;32;109;97;116;104;101; - - -`,sI=` - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;97;114;116;92;34;58;32;92;34;90;105;101;103;101;92;34;44;32;92;34;97;108;116;101;114;92;34;58;32;54;125;44;34; - - - 105;110;116;32;115;116;97;114;116;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;101;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;122;101;105;108;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;101;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101; - - -`,rI=` - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - -`,oI=` - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;34; - - - 99;104;101;99;107;65;103;101;40;41; - - - 111;117;116;112;117;116;58;32;34;71;111;111;100;98;121;101;34; - - -`,lI=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;97;100;117;108;116;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;111;114;34; - - - - -`,uI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 100;111;117;98;108;101;32;115;117;109;32;61;32;48; - - - 105;110;116;32;98;101;115;116;68;105;115;116;97;110;99;101;32;61;32;48; - - - 83;116;114;105;110;103;32;98;101;115;116;78;97;109;101;32;61;32;34;34; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 99;111;117;110;116;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;100;105;115;116;97;110;99;101; - - - 100;105;115;116;97;110;99;101;32;62;32;98;101;115;116;68;105;115;116;97;110;99;101; - - - 98;101;115;116;68;105;115;116;97;110;99;101;32;61;32;100;105;115;116;97;110;99;101; - - - 98;101;115;116;78;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;99;105;112;97;110;116;115;58;32;34;32;43;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;119;105;110;110;101;114;46;116;120;116;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;87;105;110;110;101;114;58;32;34;32;43;32;98;101;115;116;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;68;105;115;116;97;110;99;101;32;43;32;34;32;109;41;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - -`,mI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,cI=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;80;111;105;110;116;115;63;34; - - - 112;111;105;110;116;115;91;105;93;32;61;32;110;117;109;98;101;114; - - - - - 105;110;116;32;114;117;110;32;61;32;49; - 114;117;110;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 114;117;110;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104;32;45;32;114;117;110; - 105;43;43; - - - 112;111;105;110;116;115;91;105;93;32;60;32;112;111;105;110;116;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;112;111;105;110;116;115;91;105;93; - - - 112;111;105;110;116;115;91;105;93;32;61;32;112;111;105;110;116;115;91;105;32;43;32;49;93; - - - 112;111;105;110;116;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;112;108;97;99;101;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;112;108;97;99;101;32;43;32;34;46;32;34;32;43;32;112;111;105;110;116;115;91;105;93; - - - - -`,dI=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;119;104;111;108;101;32;110;117;109;98;101;114;34; - - - 83;116;114;105;110;103;32;98;105;110;97;114;121;32;61;32;34;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;110;117;109;98;101;114;32;37;32;50; - - - 98;105;110;97;114;121;32;61;32;114;101;109;97;105;110;100;101;114;32;43;32;98;105;110;97;114;121; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;114;121; - - -`,hI=` - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;87;104;105;99;104;32;119;111;114;100;32;40;99;97;112;105;116;97;108;32;108;101;116;116;101;114;115;32;111;110;108;121;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;99;114;101;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;112;104;97;98;101;116;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;112;104;97;98;101;116;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 115;101;99;114;101;116;32;61;32;115;101;99;114;101;116;32;43;32;97;108;112;104;97;98;101;116;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;115;101;99;114;101;116; - - -`,gI=` - - - 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - -`,pI=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;87;104;105;99;104;32;119;111;114;100;32;40;99;97;112;105;116;97;108;32;108;101;116;116;101;114;115;32;111;110;108;121;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;99;114;101;116;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 115;101;99;114;101;116;32;61;32;115;101;99;114;101;116;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;115;101;99;114;101;116; - - -`,fI=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;99;114;101;116;32;34;87;104;105;99;104;32;115;101;99;114;101;116;32;116;101;120;116;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;83;104;105;102;116;32;98;121;32;104;111;119;32;109;97;110;121;32;112;108;97;99;101;115;63;34; - - - 83;116;114;105;110;103;32;112;108;97;105;110;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;99;114;101;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;101;32;61;32;40;105;110;116;41;32;115;101;99;114;101;116;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;101;32;61;32;40;99;111;100;101;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 112;108;97;105;110;32;61;32;112;108;97;105;110;32;43;32;40;99;104;97;114;41;32;99;111;100;101; - - - - - 111;117;116;112;117;116;58;32;112;108;97;105;110; - - -`,bI=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;115;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 110;117;109;98;101;114;32;33;61;32;49; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 115;116;101;112;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115; - - -`,xI=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;103;114;97;100;101;115;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;111;117;110;116; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;69;110;116;101;114;32;97;32;103;114;97;100;101;34; - - - 115;117;109;32;61;32;115;117;109;32;43;32;103;114;97;100;101; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;42;32;49;46;48;32;47;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;97;118;101;114;97;103;101; - - -`,vI=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;110;117;109;98;101;114;115;63;34; - - - 105;110;116;32;110;117;109;98;101;114;49;32;61;32;49; - - - 105;110;116;32;110;117;109;98;101;114;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;99;111;117;110;116; - 105;43;43; - - - 105;110;116;32;110;117;109;98;101;114;51;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;51; - - - 110;117;109;98;101;114;49;32;61;32;110;117;109;98;101;114;50; - - - 110;117;109;98;101;114;50;32;61;32;110;117;109;98;101;114;51; - - - - -`,wI=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;105;115;32;101;118;101;110;34; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;105;115;32;111;100;100;34; - - - - -`,yI=` - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;86;65;84;32;61;32;48;46;49;57; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;110;101;116;80;114;105;99;101;32;34;78;101;116;32;112;114;105;99;101;63;34; - - - 100;111;117;98;108;101;32;116;97;120;32;61;32;110;101;116;80;114;105;99;101;32;42;32;86;65;84; - - - 100;111;117;98;108;101;32;103;114;111;115;115;80;114;105;99;101;32;61;32;110;101;116;80;114;105;99;101;32;43;32;116;97;120; - - - 111;117;116;112;117;116;58;32;116;97;120; - - - 111;117;116;112;117;116;58;32;103;114;111;115;115;80;114;105;99;101; - - -`,zI=` - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;97;116;116;101;109;112;116;115;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;97;116;116;101;109;112;116;115;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;110;116;101;114;101;100;32;34;69;110;116;101;114;32;80;73;78;34; - - - 112;105;110;32;61;32;101;110;116;101;114;101;100; - - - 97;116;116;101;109;112;116;115;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;99;116;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;100;32;98;108;111;99;107;101;100;34; - - - - -`,II=` - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;97;116;116;101;109;112;116;115;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;97;116;116;101;109;112;116;115;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;69;110;116;101;114;32;80;73;78;34; - - - 97;116;116;101;109;112;116;115;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;99;116;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;100;32;98;108;111;99;107;101;100;34; - - - - -`,kI=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;49;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;50;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;116;111;114;32;34;79;112;101;114;97;116;111;114;32;40;43;44;32;45;32;111;114;32;42;41;34; - - - 111;112;101;114;97;116;111;114; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;45;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;49;32;42;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 111;117;116;112;117;116;58;32;34;85;110;107;110;111;119;110;32;111;112;101;114;97;116;111;114;34; - - - - -`,SI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 115;101;97;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 115;101;97;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;109;110;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 105;110;116;32;99;111;108;117;109;110;32;61;32;48; - 99;111;108;117;109;110;32;60;32;115;101;97;91;114;111;119;93;46;108;101;110;103;116;104; - 99;111;108;117;109;110;43;43; - - - 115;101;97;91;114;111;119;93;91;99;111;108;117;109;110;93; - - - 111;117;116;112;117;116;58;32;99;111;108;117;109;110;115;91;99;111;108;117;109;110;93;32;43;32;40;114;111;119;32;43;32;49;41; - - - - - 248; - - - - - - - - -`,TI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 115;101;97;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 115;101;97;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 115;101;97;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;109;110;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - -`,_I=` - - - 105;110;112;117;116;58;32;105;110;116;32;112;105;99;107;32;34;87;104;105;99;104;32;100;105;115;104;63;32;40;49;44;32;50;32;111;114;32;51;41;34; - - - 112;105;99;107; - - - 111;117;116;112;117;116;58;32;34;71;114;101;101;107;32;115;97;108;97;100;34; - - - - - 111;117;116;112;117;116;58;32;34;82;105;99;101;32;98;111;119;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;97;102;101;108;32;119;114;97;112;34; - - - - - 111;117;116;112;117;116;58;32;34;80;108;101;97;115;101;32;99;104;111;111;115;101;32;97;32;118;97;108;105;100;32;110;117;109;98;101;114;34; - - - - -`,AI=` - - - 105;110;116;32;110;117;109;98;101;114;49;32;61;32;52; - - - 105;110;116;32;110;117;109;98;101;114;50;32;61;32;51; - - - 105;110;116;32;115;117;109;32;61;32;110;117;109;98;101;114;49;32;43;32;110;117;109;98;101;114;50; - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,jI=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;97;109;101;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;112;105;99;107;32;34;68;114;97;119;32;110;117;109;98;101;114;32;40;49;32;116;111;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;66;111;97;114;100;32;100;117;116;121;58;32;34;32;43;32;110;97;109;101;115;91;112;105;99;107;32;45;32;49;93; - - -`,CI=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;68;111;117;98;108;101;100;32;110;117;109;98;101;114;58;32;34;32;43;32;110;117;109;98;101;114; - - -`,DI=` - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;61;32;101;45;98;105;107;101;44;32;50;32;61;32;101;45;115;99;111;111;116;101;114;44;32;48;32;61;32;113;117;105;116;34; - - - 99;104;111;105;99;101;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;66;121;101;34; - - - -1; - - - - - 99;104;111;105;99;101;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;69;45;98;105;107;101;32;98;111;111;107;101;100;34; - - - - - 99;104;111;105;99;101;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;69;45;115;99;111;111;116;101;114;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;73;110;118;97;108;105;100;32;99;104;111;105;99;101;34; - - - - - - - - - - -`,BI=` - - - - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;61;32;101;45;98;105;107;101;44;32;50;32;61;32;101;45;115;99;111;111;116;101;114;44;32;48;32;61;32;113;117;105;116;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;34;66;121;101;34; - - - 76;101;97;118;101;32;116;104;101;32;109;101;110;117; - - - - - 111;117;116;112;117;116;58;32;34;69;45;98;105;107;101;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;69;45;115;99;111;111;116;101;114;32;98;111;111;107;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;73;110;118;97;108;105;100;32;99;104;111;105;99;101;34; - - - - - - -`,PI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;114;105;103;104;116;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;87;104;97;116;32;105;115;32;34;32;43;32;112;97;114;116;115;91;48;93;32;43;32;34;32;105;110;32;71;101;114;109;97;110;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;110;115;119;101;114; - - - 99;111;117;110;116;43;43; - - - 97;110;115;119;101;114;46;101;113;117;97;108;115;40;112;97;114;116;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;33;34; - - - 114;105;103;104;116;43;43; - - - - - 111;117;116;112;117;116;58;32;34;87;114;111;110;103;44;32;105;116;32;105;115;32;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;46;34; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;114;105;103;104;116;32;43;32;34;32;111;102;32;34;32;43;32;99;111;117;110;116;32;43;32;34;32;114;105;103;104;116;34; - - -`,OI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,MI=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;97;100;117;108;116;34; - - - - - 111;117;116;112;117;116;58;32;34;109;105;110;111;114;34; - - - - -`,ZI=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - -`,LI=` - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - 105;110;116;32;109;97;116;104;115;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;103;111;116;32;97;32;34;32;43;32;109;97;116;104;115;32;43;32;34;32;105;110;32;109;97;116;104;115;34; - - -`,WI=` - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;115;112;101;99;105;101;115;92;34;58;32;92;34;103;111;97;116;92;34;44;32;92;34;97;103;101;92;34;58;32;54;125;44;34; - - - 105;110;116;32;115;116;97;114;116;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;108;105;110;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101; - - -`,EI=` - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - -`,NI=` - - - 105;110;116;91;93;91;93;32;116;97;98;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;108;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;108;101;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;32;40;49;32;116;111;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;32;40;49;32;116;111;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - -`,FI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;114;101;101;32;61;32;48; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 105;110;116;32;115;101;97;116;32;61;32;48; - 115;101;97;116;32;60;32;115;101;97;116;115;91;114;111;119;93;46;108;101;110;103;116;104; - 115;101;97;116;43;43; - - - 33;115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 102;114;101;101;32;61;32;102;114;101;101;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;58;32;34;32;43;32;102;114;101;101; - - -`,RI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - -`,JI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;82;111;119;34; - - - 105;110;112;117;116;58;32;105;110;116;32;115;101;97;116;32;34;83;101;97;116;34; - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 111;117;116;112;117;116;58;32;34;65;108;114;101;97;100;121;32;115;111;108;100;34; - - - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;83;111;108;100;58;32;114;111;119;32;34;32;43;32;114;111;119;32;43;32;34;44;32;115;101;97;116;32;34;32;43;32;115;101;97;116; - - - - -`,GI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;82;111;119;34; - - - 105;110;112;117;116;58;32;105;110;116;32;115;101;97;116;32;34;83;101;97;116;34; - - -`,HI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;114;111;119;32;61;32;48; - 114;111;119;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 114;111;119;43;43; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;34; - - - 105;110;116;32;115;101;97;116;32;61;32;48; - 115;101;97;116;32;60;32;115;101;97;116;115;91;114;111;119;93;46;108;101;110;103;116;104; - 115;101;97;116;43;43; - - - 115;101;97;116;115;91;114;111;119;93;91;115;101;97;116;93; - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;88;34; - - - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - -`,VI=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;101;97;116;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;101;97;116;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;82;111;119;115;58;32;34;32;43;32;115;101;97;116;115;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;83;101;97;116;115;32;112;101;114;32;114;111;119;58;32;34;32;43;32;115;101;97;116;115;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;82;111;119;32;49;44;32;115;101;97;116;32;50;32;115;111;108;100;63;32;34;32;43;32;115;101;97;116;115;91;49;93;91;50;93; - - -`,qI=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 105;110;116;32;78;117;109;98;101;114;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;78;117;109;98;101;114; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;58;32;34;32;43;32;114;101;115;117;108;116; - - -`,UI=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;52; - - - 105;110;116;32;78;117;109;98;101;114;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;78;85;77;66;69;82; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;58;32;34;32;43;32;114;101;115;117;108;116; - - -`,QI=` - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - -`,$I=` - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - -`,YI=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - -`,KI=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;65;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34;41; - - -`,XI=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;103;101;32;61;32;55; - - - 100;111;117;98;108;101;32;104;101;105;103;104;116;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; - - -`,ek=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - -`,tk=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;51; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;52; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - -`,nk=` - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;52; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;51; - - -`,ik=` - - - 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; - - - 83;116;114;105;110;103;32;114;105;103;104;116;32;61;32;34;119;97;116;101;114;34; - - - 83;116;114;105;110;103;32;116;101;109;112;32;61;32;108;101;102;116; - - - 108;101;102;116;32;61;32;114;105;103;104;116; - - - 114;105;103;104;116;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;108;101;102;116; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; - - -`,ak=` - - - 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; - - - 83;116;114;105;110;103;32;114;105;103;104;116;32;61;32;34;119;97;116;101;114;34; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;108;101;102;116; - - - 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; - - -`,sk=` - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,rk=` - - - 105;110;116;32;97;103;101;32;61;32;49;52; - - - 100;111;117;98;108;101;32;104;101;105;103;104;116;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;77;105;97;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;32;34;32;43;32;97;103;101;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34; - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; - - -`,ok=` - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;49;51;53; - - - 105;110;116;32;104;111;117;114;115;32;61;32;109;105;110;117;116;101;115;32;47;32;54;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;109;105;110;117;116;101;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;104;111;117;114;115;32;43;32;34;32;104;111;117;114;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;109;105;110;117;116;101;115;34; - - -`,lk=` - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;105;99;101;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;116;111;116;97;108;80;114;105;99;101;32;61;32;99;111;117;110;116;32;42;32;112;114;105;99;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108;80;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; - - -`,uk=` - - - 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; - - - 105;110;116;32;112;114;105;99;101;32;61;32;55; - - - 99;114;101;100;105;116;32;61;32;99;114;101;100;105;116;32;45;32;112;114;105;99;101; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;99;114;101;100;105;116; - - -`,mk=` - - - 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; - - - 105;110;116;32;112;114;105;99;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;99;114;101;100;105;116; - - - 99;114;101;100;105;116;32;61;32;99;114;101;100;105;116;32;45;32;112;114;105;99;101; - - -`,ck=` - - - 105;110;116;32;112;114;105;99;101;32;61;32;57; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;105;99;101;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,dk=` - - - 105;110;116;32;115;108;105;99;101;115;32;61;32;56; - - - 105;110;116;32;112;101;111;112;108;101;32;61;32;52; - - - 105;110;116;32;112;101;114;80;101;114;115;111;110;32;61;32;115;108;105;99;101;115;32;47;32;112;101;111;112;108;101; - - - 111;117;116;112;117;116;58;32;34;69;118;101;114;121;111;110;101;32;103;101;116;115;32;34;32;43;32;112;101;114;80;101;114;115;111;110;32;43;32;34;32;115;108;105;99;101;115;46;34; - - -`,hk=` - - - 105;110;116;32;115;108;105;99;101;115;32;61;32;56; - - - 105;110;116;32;112;101;111;112;108;101;32;61;32;52; - - - 105;110;116;32;112;101;114;80;101;114;115;111;110;32;61;32;115;108;105;99;101;115;32;47;32;112;101;111;112;108;101; - - - 111;117;116;112;117;116;58;32;34;69;118;101;114;121;111;110;101;32;103;101;116;115;32;34;32;43;32;112;101;114;112;101;114;115;111;110;32;43;32;34;32;115;108;105;99;101;115;46;34; - - -`,gk=` - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;55; - - - 105;110;116;32;119;105;100;116;104;32;61;32;52; - - - 105;110;116;32;97;114;101;97;32;61;32;108;101;110;103;116;104;32;42;32;119;105;100;116;104; - - - 105;110;116;32;112;101;114;105;109;101;116;101;114;32;61;32;50;32;42;32;40;108;101;110;103;116;104;32;43;32;119;105;100;116;104;41; - - - 111;117;116;112;117;116;58;32;34;65;114;101;97;58;32;34;32;43;32;97;114;101;97; - - - 111;117;116;112;117;116;58;32;34;80;101;114;105;109;101;116;101;114;58;32;34;32;43;32;112;101;114;105;109;101;116;101;114; - - -`,pk=` - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;115;32;61;32;115;101;99;111;110;100;115;32;47;32;54;48; - - - 105;110;116;32;114;101;109;97;105;110;100;101;114;32;61;32;115;101;99;111;110;100;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; - - -`,fk=` - - - 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; - - -`,bk=` - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;53; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51; - - - 105;110;116;32;97;114;101;97;32;61;32;108;101;110;103;116;104;32;42;32;119;105;100;116;104; - - - 111;117;116;112;117;116;58;32;97;114;101;97; - - -`,xk=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;104;97;116;32;105;115;32;121;111;117;114;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; - - -`,vk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,wk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;40;97;32;43;32;98;41; - - -`,yk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;97;32;43;32;98; - - -`,zk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;101;120;116;32;121;101;97;114;32;121;111;117;32;119;105;108;108;32;98;101;32;34;32;43;32;40;97;103;101;32;43;32;49;41; - - -`,Ik=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;101;120;116;32;121;101;97;114;32;121;111;117;32;119;105;108;108;32;98;101;32;34;32;43;32;40;65;103;101;32;43;32;49;41; - - -`,kk=` - - - 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;115;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 105;110;116;32;100;97;121;115;32;61;32;121;101;97;114;115;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;105;115;32;97;98;111;117;116;32;34;32;43;32;100;97;121;115;32;43;32;34;32;100;97;121;115;46;34; - - -`,Sk=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 100;111;117;98;108;101;32;109;101;97;110;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;101;97;110;58;32;34;32;43;32;109;101;97;110; - - -`,Tk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;99;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;99;116;58;32;34;32;43;32;112;114;111;100;117;99;116; - - -`,_k=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;97;114;101;32;97;110;32;97;100;117;108;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;97;114;101;32;110;111;116;32;97;110;32;97;100;117;108;116;32;121;101;116;46;34; - - - - -`,Ak=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;60;32;48; - - - 110;117;109;98;101;114;32;61;32;48;32;45;32;110;117;109;98;101;114; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - -`,jk=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;101;118;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;111;100;100;34; - - - - -`,Ck=` - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;53; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - -`,Dk=` - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;53; - - - 112;111;105;110;116;115;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - -`,Bk=` - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - -`,Pk=` - - - 105;110;116;32;112;111;105;110;116;115;32;61;32;49;48; - - - 112;111;105;110;116;115;32;61;32;112;111;105;110;116;115;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; - - -`,Ok=` - - - 105;110;116;32;112;114;105;99;101;32;61;32;56; - - - 105;110;116;32;99;104;101;101;115;101;32;61;32;50; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;40;112;114;105;99;101;32;43;32;99;104;101;101;115;101;41;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,Mk=` - - - 105;110;116;32;112;114;105;99;101;32;61;32;56; - - - 105;110;116;32;99;104;101;101;115;101;32;61;32;50; - - - 105;110;116;32;99;111;117;110;116;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;105;99;101;32;43;32;99;104;101;101;115;101;32;42;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,Zk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - -`,Lk=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;105;99;101;32;34;80;114;105;99;101;32;105;110;32;101;117;114;111;115;63;34; - - - 112;114;105;99;101;32;62;32;53;48; - - - 112;114;105;99;101;32;61;32;112;114;105;99;101;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;84;111;32;112;97;121;58;32;34;32;43;32;112;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; - - -`,Wk=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; - - - 103;114;97;100;101;32;62;61;32;49;32;38;38;32;103;114;97;100;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;118;97;108;105;100;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;118;97;108;105;100;34; - - - - -`,Ek=` - - - 105;110;112;117;116;58;32;105;110;116;32;112;111;105;110;116;115;32;34;72;111;119;32;109;97;110;121;32;112;111;105;110;116;115;63;34; - - - 112;111;105;110;116;115;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;112;97;115;115;101;100;34; - - - - - 111;117;116;112;117;116;58;32;34;110;111;116;32;112;97;115;115;101;100;34; - - - - -`,Nk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - -`,Fk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - -`,Rk=` - - - 105;110;116;32;97;103;101;32;61;32;49;53; - - - 97;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;101;110;116;114;121;34; - - - - -`,Jk=` - - - 105;110;116;32;97;103;101;32;61;32;49;53; - - - 65;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;101;110;116;114;121;34; - - - - -`,Gk=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;50;32;38;38;32;97;103;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;89;111;117;116;104;32;116;105;99;107;101;116;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;32;121;111;117;116;104;32;116;105;99;107;101;116;34; - - - - -`,Hk=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; - - - 103;114;97;100;101;32;60;32;49;32;124;124;32;103;114;97;100;101;32;62;32;54; - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;103;114;97;100;101;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;71;114;97;100;101;32;34;32;43;32;103;114;97;100;101;32;43;32;34;32;105;115;32;118;97;108;105;100;46;34; - - - - -`,Vk=` - - - 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;32;34;89;101;97;114;63;34; - - - 40;121;101;97;114;32;37;32;52;32;61;61;32;48;32;38;38;32;121;101;97;114;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;121;101;97;114;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;76;101;97;112;32;121;101;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;32;108;101;97;112;32;121;101;97;114;34; - - - - -`,qk=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;68;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;100;97;121;34; - - - - -`,Uk=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;108;111;114;32;34;87;104;97;116;32;99;111;108;111;114;32;105;115;32;116;104;101;32;116;114;97;102;102;105;99;32;108;105;103;104;116;63;34; - - - 99;111;108;111;114; - - - 111;117;116;112;117;116;58;32;34;83;116;111;112;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;105;116;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;108;107;34; - - - - - 111;117;116;112;117;116;58;32;34;73;32;100;111;32;110;111;116;32;107;110;111;119;32;116;104;105;115;32;99;111;108;111;114;46;34; - - - - -`,Qk=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;119;97;116;101;114;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;106;117;105;99;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;99;111;99;111;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;98;117;116;116;111;110;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - -`,$k=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - -`,Yk=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; - - - 100;97;121;32;61;61;32;54;32;38;38;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - -`,Kk=` - - - 105;110;116;32;100;97;121;32;61;32;55; - - - 100;97;121;32;61;61;32;54;32;124;124;32;100;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - -`,Xk=` - - - 105;110;116;32;100;97;121;32;61;32;55; - - - 100;97;121;32;61;61;32;54;32;124;124;32;68;97;121;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;110;111;32;115;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;115;99;104;111;111;108;34; - - - - -`,e7=` - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;117;114;32;34;87;104;97;116;32;116;105;109;101;32;105;115;32;105;116;32;40;106;117;115;116;32;116;104;101;32;104;111;117;114;41;63;34; - - - 104;111;117;114;32;62;61;32;56;32;38;38;32;104;111;117;114;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;83;99;104;111;111;108;34; - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;116;105;109;101;34; - - - - -`,t7=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;87;104;105;99;104;32;103;114;97;100;101;63;34; - - - 103;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;115;97;116;105;115;102;97;99;116;111;114;121;34; - - - - - 111;117;116;112;117;116;58;32;34;115;117;102;102;105;99;105;101;110;116;34; - - - - - 111;117;116;112;117;116;58;32;34;112;111;111;114;34; - - - - - 111;117;116;112;117;116;58;32;34;102;97;105;108;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;32;118;97;108;105;100;32;103;114;97;100;101;34; - - - - -`,n7=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;116;111;114;32;34;79;112;101;114;97;116;111;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;48; - - - 111;112;101;114;97;116;111;114; - - - 114;101;115;117;108;116;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 114;101;115;117;108;116;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 114;101;115;117;108;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116; - - - - - 111;117;116;112;117;116;58;32;34;85;110;107;110;111;119;110;32;111;112;101;114;97;116;111;114;34; - - - - -`,i7=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; - - - 99;104;111;105;99;101;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;119;97;116;101;114;46;34; - - - - - 99;104;111;105;99;101;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;106;117;105;99;101;46;34; - - - - - 99;104;111;105;99;101;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;72;101;114;101;32;105;115;32;121;111;117;114;32;99;111;99;111;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;105;115;32;98;117;116;116;111;110;32;100;111;101;115;32;110;111;116;32;101;120;105;115;116;46;34; - - - - - - - - -`,a7=` - - - 80;117;116;32;97;32;99;117;112;32;111;110;32;116;104;101;32;116;97;98;108;101; - - - 83;117;103;97;114;32;119;97;110;116;101;100;63; - - - 65;100;100;32;115;117;103;97;114; - - - - - 248; - - - - - 84;101;97;32;115;116;105;108;108;32;116;111;111;32;104;111;116; - - - 87;97;105;116;32;49;32;109;105;110;117;116;101; - - - - - 68;114;105;110;107;32;116;104;101;32;116;101;97; - - -`,s7=` - - - 71;101;116;32;117;112; - - - 66;114;117;115;104;32;116;101;101;116;104; - - - 71;101;116;32;100;114;101;115;115;101;100; - - - 72;97;118;101;32;98;114;101;97;107;102;97;115;116; - - -`,r7=` - - - 70;105;108;108;32;116;104;101;32;107;101;116;116;108;101;32;119;105;116;104;32;119;97;116;101;114; - - - 83;119;105;116;99;104;32;111;110;32;116;104;101;32;107;101;116;116;108;101; - - - 80;117;116;32;97;32;116;101;97;32;98;97;103;32;105;110;32;116;104;101;32;99;117;112; - - - 80;111;117;114;32;104;111;116;32;119;97;116;101;114;32;105;110;116;111;32;116;104;101;32;99;117;112; - - - 87;97;105;116;32;51;32;109;105;110;117;116;101;115; - - - 84;97;107;101;32;111;117;116;32;116;104;101;32;116;101;97;32;98;97;103; - - -`,o7=` - - - 73;115;32;105;116;32;114;97;105;110;105;110;103;63; - - - 80;97;99;107;32;97;110;32;117;109;98;114;101;108;108;97; - - - - - 80;97;99;107;32;115;117;110;103;108;97;115;115;101;115; - - - - - 76;101;97;118;101; - - -`,l7=` - - - 80;108;97;116;101;32;110;111;116;32;101;109;112;116;121; - - - 84;97;107;101;32;97;32;98;105;116;101; - - - - - 67;108;101;97;114;32;116;104;101;32;112;108;97;116;101; - - -`,u7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;117;110;116;32;117;112;32;116;111;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,m7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,c7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,d7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;99;116;111;114;105;97;108;32;111;102;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;102;97;99;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;99;116;111;114;105;97;108;32;61;32;102;97;99;116;111;114;105;97;108;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;99;116;111;114;105;97;108; - - -`,h7=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;116;105;109;101;115;63;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;110;32;111;112;116;105;111;110;34; - - - - -`,g7=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;116;105;109;101;115;63;34; - - - 99;104;111;105;99;101; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;97;110;32;111;112;116;105;111;110;34; - - - - -`,p7=` - - - 105;110;116;32;103;114;97;100;101;32;61;32;50; - - - 103;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;101;112;32;112;114;97;99;116;105;115;105;110;103;34; - - - - -`,f7=` - - - 105;110;116;32;103;114;97;100;101;32;61;32;50; - - - 71;114;97;100;101; - - - 111;117;116;112;117;116;58;32;34;118;101;114;121;32;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;103;111;111;100;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;101;112;32;112;114;97;99;116;105;115;105;110;103;34; - - - - -`,b7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114; - - - 111;117;116;112;117;116;58;32;34;111;110;101;34; - - - - - 111;117;116;112;117;116;58;32;34;116;119;111;34; - - - - - 111;117;116;112;117;116;58;32;34;116;104;114;101;101;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;107;110;111;119;110;34; - - - - -`,x7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 110;117;109;98;101;114;32;60;32;49;48;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;116;101;112;115; - - -`,v7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - - - 110;117;109;98;101;114;32;60;32;49;32;124;124;32;110;117;109;98;101;114;32;62;32;49;48; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;32;102;114;111;109;32;49;32;116;111;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;97;110;107;32;121;111;117;33;34; - - -`,w7=` - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,y7=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; - - - 105;110;116;32;109;111;110;101;121;32;61;32;48; - - - 105;110;116;32;119;101;101;107;115;32;61;32;48; - - - 109;111;110;101;121;32;60;32;103;111;97;108; - - - 109;111;110;101;121;32;61;32;109;111;110;101;121;32;43;32;53; - - - 119;101;101;107;115;32;61;32;119;101;101;107;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; - - -`,z7=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; - - - 105;110;116;32;109;111;110;101;121;32;61;32;48; - - - 105;110;116;32;119;101;101;107;115;32;61;32;48; - - - 109;111;110;101;121;32;60;61;32;103;111;97;108; - - - 109;111;110;101;121;32;61;32;109;111;110;101;121;32;43;32;53; - - - 119;101;101;107;115;32;61;32;119;101;101;107;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; - - -`,I7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;101;114;101;63;34; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;50; - - - 110;117;109;98;101;114;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;50; - - - - -`,k7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - -`,S7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;51; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;78;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - -`,T7=` - - - 105;110;116;32;103;114;97;100;101;32;61;32;48; - - - 103;114;97;100;101;32;60;32;49;32;124;124;32;103;114;97;100;101;32;62;32;54; - - - 105;110;112;117;116;58;32;103;114;97;100;101;32;34;71;114;97;100;101;32;102;114;111;109;32;49;32;116;111;32;54;34; - - - - - 111;117;116;112;117;116;58;32;34;89;111;117;114;32;103;114;97;100;101;58;32;34;32;43;32;103;114;97;100;101; - - -`,_7=` - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - - - 110;117;109;98;101;114;32;33;61;32;48; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;32;40;48;32;115;116;111;112;115;41;34; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,A7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - -`,j7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;99;116;32;61;32;110;117;109;98;101;114;32;42;32;105; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;99;116; - - - - -`,C7=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,D7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - -`,B7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;62;32;49; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - -`,P7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;32;61;32;50;48; - - - 110;117;109;98;101;114;32;60;32;108;105;109;105;116; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - - -`,O7=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;32;61;32;50;48; - - - 110;117;109;98;101;114;32;60;32;76;105;109;105;116; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - - -`,M7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; - - - 110;117;109;98;101;114;32;60;32;49;48;48; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;42;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - - -`,Z7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,L7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;108;105;110;101;115;63;34; - - - 105;110;116;32;108;105;110;101;32;61;32;49; - 108;105;110;101;32;60;61;32;110; - 108;105;110;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;116;97;114;32;61;32;49; - 115;116;97;114;32;60;61;32;108;105;110;101; - 115;116;97;114;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - -`,W7=` - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;48; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;99;111;117;110;116; - - -`,E7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;99;111;117;110;116; - - -`,N7=` - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;111;119;32;42;32;105; - - - - -`,F7=` - - - 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;111;119;32;42;32;105; - - - - -`,R7=` - - - 105;110;116;32;104;101;105;103;104;116;32;61;32;48; - - - 105;110;116;32;115;116;101;112;32;61;32;49; - 115;116;101;112;32;60;61;32;53; - 115;116;101;112;43;43; - - - 104;101;105;103;104;116;32;61;32;104;101;105;103;104;116;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;99;109;34; - - -`,J7=` - - - 105;110;116;32;115;116;101;112;32;61;32;49; - 115;116;101;112;32;60;61;32;53; - 115;116;101;112;43;43; - - - 104;101;105;103;104;116;32;61;32;104;101;105;103;104;116;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;99;109;34; - - -`,G7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - -`,H7=` - - - 105;110;112;117;116;58;32;105;110;116;32;119;105;100;116;104;32;34;87;105;100;116;104;34; - - - 105;110;112;117;116;58;32;105;110;116;32;104;101;105;103;104;116;32;34;72;101;105;103;104;116;34; - - - 105;110;116;32;108;105;110;101;32;61;32;49; - 108;105;110;101;32;60;61;32;104;101;105;103;104;116; - 108;105;110;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;99;111;108;117;109;110;32;61;32;49; - 99;111;108;117;109;110;32;60;61;32;119;105;100;116;104; - 99;111;108;117;109;110;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - -`,V7=` - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93; - - - - -`,q7=` - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;91;48;93; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;91;118;97;108;117;101;115;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - - -`,U7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - -`,Q7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - - - -`,$7=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - -`,Y7=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - -`,K7=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;115;116;101;112;115;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 108;105;110;101;32;61;32;108;105;110;101;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;108;105;110;101; - - - - -`,X7=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;97;109;101;34; - - - - - 111;117;116;112;117;116;58;32;34;70;105;114;115;116;32;110;97;109;101;58;32;34;32;43;32;110;97;109;101;115;91;48;93; - - -`,e8=` - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - - - 105;110;116;32;105;32;61;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93; - - - - -`,t8=` - - - 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;115;91;105;93;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;110;117;109;98;101;114;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;98;101;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114;115;91;105;93; - - - 110;117;109;98;101;114;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;110;117;109;98;101;114;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - -`,n8=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;111;105;110;116;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - 112;111;105;110;116;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;111;105;110;116;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - -`,i8=` - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - 110;117;109;98;101;114;32;33;61;32;48; - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - 105;110;112;117;116;58;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,a8=` - - - 105;110;116;32;115;117;109;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;32;40;48;32;61;32;115;116;111;112;41;34; - - - 110;117;109;98;101;114;32;61;61;32;48; - - - 76;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 115;117;109;32;61;32;115;117;109;32;43;32;110;117;109;98;101;114; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,s8=` - - - 105;110;112;117;116;58;32;105;110;116;32;108;101;110;103;116;104;32;34;76;101;110;103;116;104;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;105;100;116;104;32;34;87;105;100;116;104;63;34; - - - 105;110;116;32;102;32;61;32;97;114;101;97;40;108;101;110;103;116;104;44;32;119;105;100;116;104;41; - - - 111;117;116;112;117;116;58;32;34;65;114;101;97;58;32;34;32;43;32;102; - - -`,r8=` - - - 114;101;116;117;114;110;32;97;32;42;32;98; - - -`,o8=` - - - 115;104;111;119;71;114;101;101;116;105;110;103;40;41; - - - 97;115;107;81;117;101;115;116;105;111;110;115;40;41; - - - 115;104;111;119;82;101;115;117;108;116;40;41; - - -`,l8=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; - - -`,u8=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; - - -`,m8=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,c8=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;76;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,d8=` - - - 105;110;116;91;93;32;103;114;97;100;101;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;103;114;97;100;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;103;114;97;100;101;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,h8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;113;32;61;32;115;113;117;97;114;101;40;110;117;109;98;101;114;41; - - - 111;117;116;112;117;116;58;32;34;84;104;101;32;115;113;117;97;114;101;32;105;115;32;34;32;43;32;113; - - -`,g8=` - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;114;101;115;117;108;116; - - -`,p8=` - - - 115;104;111;119;84;105;116;108;101;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;104;97;116;32;105;115;32;121;111;117;114;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101; - - -`,f8=` - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;32;116;111;32;116;104;101;32;113;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;103;101;116;32;116;104;114;101;101;32;113;117;101;115;116;105;111;110;115;46;34; - - -`,b8=` - - - 115;104;111;119;83;117;109;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 115;104;111;119;83;117;109;40;120;44;32;120;32;43;32;49;41; - - -`,x8=` - - - 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109; - - -`,v8=` - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;33;34; - - -`,w8=` - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;71;111;34; - - -`,y8=` - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;112;111;105;110;116;115;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; - - -`,z8=` - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;112;111;105;110;116;115;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; - - -`,I8=` - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;44;32;114;111;117;110;100;32;49;58;32;34;32;43;32;112;111;105;110;116;115;91;49;93;91;48;93; - - -`,k8=` - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;44;32;114;111;117;110;100;32;49;58;32;34;32;43;32;80;111;105;110;116;115;91;49;93;91;48;93; - - -`,S8=` - - - 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;105;110;116;115;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;111;105;110;116;115;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; - - -`,T8=` - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,_8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,A8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109; - - -`,j8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;114;101;115;117;108;116;32;61;32;110;117;109;98;101;114;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;116;105;109;101;115;32;34;32;43;32;110;117;109;98;101;114;32;43;32;34;32;61;32;34;32;43;32;114;101;115;117;108;116; - - - - - 110;117;109;98;101;114;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;119;97;115;32;104;97;114;100;33;34; - - - - - 111;117;116;112;117;116;58;32;34;84;104;97;116;32;119;97;115;32;101;97;115;121;46;34; - - - - -`,C8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; - - - 105;110;116;32;102;97;99;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;99;116;111;114;105;97;108;32;61;32;102;97;99;116;111;114;105;97;108;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;99;116;111;114;105;97;108; - - -`,D8=` - - - 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;108;101;116;116;101;114;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;76;105;110;101;115;58;32;34;32;43;32;108;105;110;101;115;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;101;115;91;105;93;46;99;111;110;116;97;105;110;115;40;34;102;111;120;34;41; - - - 111;117;116;112;117;116;58;32;34;70;111;120;32;105;110;32;108;105;110;101;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - -`,B8=` - - - 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; - - -`,P8=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;32;34;76;97;115;116;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,O8=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;32;34;76;97;115;116;32;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - -`,M8=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;104;97;115;32;34;32;43;32;110;97;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;116;101;114;115;34; - - -`,Z8=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;104;97;115;32;34;32;43;32;110;97;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;116;101;114;115;34; - - -`,L8=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;105;110;112;117;116;32;34;80;97;115;115;119;111;114;100;63;34; - - - 105;110;112;117;116;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;33;34; - - - - - 111;117;116;112;117;116;58;32;34;87;114;111;110;103;32;112;97;115;115;119;111;114;100;34; - - - - -`,W8=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;70;114;101;101;32;101;110;116;114;121;34; - - - - - 97;103;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;67;104;105;108;100;32;116;105;99;107;101;116;58;32;52;32;101;117;114;111;115;34; - - - - - 111;117;116;112;117;116;58;32;34;65;100;117;108;116;32;116;105;99;107;101;116;58;32;56;32;101;117;114;111;115;34; - - - - - - -`,E8=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;118;97;108;117;101;63;34; - - - 110;117;109;98;101;114;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114; - - - 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;69;110;100;34; - - -`,N8=` - - - 105;110;116;32;116;114;105;101;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;103;117;101;115;115;32;34;89;111;117;114;32;103;117;101;115;115;63;34; - - - 116;114;105;101;115;32;61;32;116;114;105;101;115;32;43;32;49; - - - 103;117;101;115;115;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; - - -`,F8=` - - - 105;110;116;32;116;114;105;101;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;103;117;101;115;115;32;34;89;111;117;114;32;103;117;101;115;115;63;34; - - - 103;117;101;115;115;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 116;114;105;101;115;32;61;32;116;114;105;101;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; - - -`,R8=` - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;105;99;101;32;34;80;114;105;99;101;63;32;40;48;32;61;32;101;110;100;41;34; - - - 112;114;105;99;101;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;117;109;32;61;32;115;117;109;32;43;32;112;114;105;99;101; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;73;116;101;109;115;58;32;34;32;43;32;99;111;117;110;116; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;117;109; - - -`,J8=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; - - - 97;103;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;89;111;117;32;109;97;121;32;118;111;116;101;46;34; - - - - - 105;110;116;32;121;101;97;114;115;32;61;32;49;54;32;45;32;97;103;101; - - - 111;117;116;112;117;116;58;32;34;87;97;105;116;32;34;32;43;32;121;101;97;114;115;32;43;32;34;32;109;111;114;101;32;121;101;97;114;115;46;34; - - - - -`,G8=` - - - 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;108;105;109;105;116; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,H8=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,V8=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,q8=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;119;97;110;116;101;100;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,U8=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;119;97;110;116;101;100;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;87;97;110;116;101;100; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,Q8=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;110;116;101;100;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;61;61;32;119;97;110;116;101;100; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; - - -`,$8=` - - - 111;117;116;112;117;116;58;32;34;71;111;111;100;32;109;111;114;110;105;110;103;34; - - - 111;117;116;112;117;116;58;32;34;84;111;100;97;121;32;119;101;32;108;101;97;114;110;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;46;34; - - -`,Y8=` - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;87;111;114;108;100;34; - - -`,K8=` - - - 111;117;116;112;117;116;58;32;34;72;101;108;108;111;34; - - - 111;117;116;112;117;116;58;32;34;73;32;97;109;32;108;101;97;114;110;105;110;103;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;34; - - -`,X8=` - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;104;111;112;112;105;110;103;45;110;101;119;46;116;120;116;34;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;108;105;110;101;41; - - - 99;111;117;110;116;43;43; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;67;97;107;101;34;41; - - - 99;111;117;110;116;43;43; - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;108;105;110;101;115;32;115;97;118;101;100;34; - - -`,eS=` - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;104;111;112;112;105;110;103;45;110;101;119;46;116;120;116;34;41; - - -`,tS=` - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;49; - - - 102;105;108;101;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;102;105;108;101;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;98;101;114;32;43;32;34;46;32;34;32;43;32;108;105;110;101; - - - 110;117;109;98;101;114;43;43; - - - - - 102;105;108;101;46;99;108;111;115;101;40;41; - - -`,nS=` - - - 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; - - -`,iS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 108;105;110;101;46;99;111;110;116;97;105;110;115;40;34;70;111;120;34;41; - - - 99;111;117;110;116;43;43; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;70;111;120;58;32;34;32;43;32;99;111;117;110;116; - - -`,aS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,sS=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;108;111;110;103;101;115;116;32;61;32;108;105;110;101;115;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;101;115;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;108;111;110;103;101;115;116;46;108;101;110;103;116;104;40;41; - - - 108;111;110;103;101;115;116;32;61;32;108;105;110;101;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;76;111;110;103;101;115;116;32;101;110;116;114;121;58;32;34;32;43;32;108;111;110;103;101;115;116; - - -`,rS=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - -`,oS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;98;101;115;116;78;97;109;101;32;61;32;34;34; - - - 105;110;116;32;98;101;115;116;71;114;97;100;101;32;61;32;55; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;103;114;97;100;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;51;93;41; - - - 103;114;97;100;101;32;60;32;98;101;115;116;71;114;97;100;101; - - - 98;101;115;116;71;114;97;100;101;32;61;32;103;114;97;100;101; - - - 98;101;115;116;78;97;109;101;32;61;32;112;97;114;116;115;91;48;93; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;66;101;115;116;32;103;114;97;100;101;32;105;110;32;69;110;103;108;105;115;104;58;32;34;32;43;32;98;101;115;116;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;71;114;97;100;101;32;43;32;34;41;34; - - -`,lS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,uS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;117;109;32;61;32;48; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 115;117;109;32;61;32;115;117;109;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;115;91;49;93;41; - - - 99;111;117;110;116;43;43; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;97;116;104;115;32;97;118;101;114;97;103;101;58;32;34;32;43;32;115;117;109;32;47;32;99;111;117;110;116; - - -`,mS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,cS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 108;105;110;101;46;99;111;110;116;97;105;110;115;40;34;92;34;110;97;109;101;92;34;34;41; - - - 105;110;116;32;115;116;97;114;116;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;32;61;32;108;105;110;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 111;117;116;112;117;116;58;32;108;105;110;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;41; - - - - - 248; - - - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - -`,dS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,hS=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;105;110;116;115;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;110;116;114;121;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;110;97;109;101;115;91;105;93;32;43;32;34;92;34;44;32;92;34;112;111;105;110;116;115;92;34;58;32;34;32;43;32;112;111;105;110;116;115;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;97;109;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;121;32;61;32;101;110;116;114;121;32;43;32;34;44;34; - - - - - 248; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;101;110;116;114;121;41; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;105;101;115;32;115;97;118;101;100;34; - - -`,gS=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;105;110;116;115;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - -`,pS=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;108;115;45;110;101;119;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;115;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;110;116;114;121;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;115;91;48;93;32;43;32;34;92;34;44;32;92;34;115;112;101;99;105;101;115;92;34;58;32;92;34;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;92;34;44;32;92;34;97;103;101;92;34;58;32;34;32;43;32;112;97;114;116;115;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;108;105;110;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;121;32;61;32;101;110;116;114;121;32;43;32;34;44;34; - - - - - 248; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;101;110;116;114;121;41; - - - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;108;105;110;101;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;108;115;32;115;97;118;101;100;34; - - -`,fS=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;108;115;45;110;101;119;46;106;115;111;110;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - -`,bS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;101;110;116;101;110;99;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 108;105;110;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;46;112;114;105;110;116;108;110;40;112;97;114;116;115;91;48;93;32;43;32;34;32;40;34;32;43;32;112;97;114;116;115;91;49;93;32;43;32;34;41;32;105;115;32;34;32;43;32;112;97;114;116;115;91;50;93;32;43;32;34;32;121;101;97;114;115;32;111;108;100;46;34;41; - - - 99;111;117;110;116;43;43; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;115;101;110;116;101;110;99;101;115;32;115;97;118;101;100;34; - - -`,xS=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;101;110;116;101;110;99;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 114;101;97;100;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;46;99;108;111;115;101;40;41; - - -`,vS=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;99;111;117;110;116;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,wS=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;99;111;117;110;116;32;42;32;56;46;53; - - -`,yS=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,zS=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;99;111;110;100;32;110;117;109;98;101;114;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,IS=` - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;116;101;109;112;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;116;101;109;112; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,kS=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;100;115;91;105;93;32;34;69;110;116;101;114;32;97;32;99;97;114;100;34; - - - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;60;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - -`,SS=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;100;115;91;105;93;32;34;69;110;116;101;114;32;97;32;99;97;114;100;34; - - - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;62;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - -`,TS=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;32;97;114;101;32;121;111;117;32;108;111;111;107;105;110;103;32;102;111;114;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;105;115;111;110;115;32;61;32;48; - - - 105;110;116;32;108;101;102;116;32;61;32;48; - - - 105;110;116;32;114;105;103;104;116;32;61;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;105;100;100;108;101;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;108;101;102;116;32;60;61;32;114;105;103;104;116; - - - 109;105;100;100;108;101;32;61;32;40;108;101;102;116;32;43;32;114;105;103;104;116;41;32;47;32;50; - - - 99;111;109;112;97;114;105;115;111;110;115;32;61;32;99;111;109;112;97;114;105;115;111;110;115;32;43;32;49; - - - 99;97;114;100;115;91;109;105;100;100;108;101;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;109;105;100;100;108;101; - - - - - 99;97;114;100;115;91;109;105;100;100;108;101;93;32;60;32;116;97;114;103;101;116; - - - 108;101;102;116;32;61;32;109;105;100;100;108;101;32;43;32;49; - - - - - 114;105;103;104;116;32;61;32;109;105;100;100;108;101;32;45;32;49; - - - - - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;70;111;117;110;100;32;97;116;32;112;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; - - -`,_S=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;111;117;110;100;32;61;32;49; - 114;111;117;110;100;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 114;111;117;110;100;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104;32;45;32;114;111;117;110;100; - 105;43;43; - - - 99;97;114;100;115;91;105;93;32;62;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 105;110;116;32;116;101;109;112;32;61;32;99;97;114;100;115;91;105;93; - - - 99;97;114;100;115;91;105;93;32;61;32;99;97;114;100;115;91;105;32;43;32;49;93; - - - 99;97;114;100;115;91;105;32;43;32;49;93;32;61;32;116;101;109;112; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;100;115;91;105;93; - - - - -`,AS=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;97;114;100;115;91;105;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - -`,jS=` - - - 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;114;103;101;116;32;34;87;104;105;99;104;32;99;97;114;100;32;97;114;101;32;121;111;117;32;108;111;111;107;105;110;103;32;102;111;114;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;105;115;111;110;115;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;100;115;46;108;101;110;103;116;104; - - - 99;111;109;112;97;114;105;115;111;110;115;32;61;32;99;111;109;112;97;114;105;115;111;110;115;32;43;32;49; - - - 99;97;114;100;115;91;105;93;32;61;61;32;116;97;114;103;101;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;70;111;117;110;100;32;97;116;32;112;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;32;102;111;117;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; - - -`,CS=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;105;110;116;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;105;110;116;115;91;105;93; - - - - -`,DS=` - - - 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;105;110;116;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;105;110;116;115;91;105;93; - - - - -`,BS=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;105;110;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 112;111;105;110;116;115;91;105;93;32;61;32;112;111;105;110;116;115;91;105;93;32;43;32;49; - - - - -`,PS=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;53; - - - 100;111;117;98;108;101;73;116;40;110;117;109;98;101;114;41; - - - 111;117;116;112;117;116;58;32;34;73;110;32;116;104;101;32;109;97;105;110;32;112;114;111;103;114;97;109;58;32;110;117;109;98;101;114;32;61;32;34;32;43;32;110;117;109;98;101;114; - - - 98;111;111;108;101;97;110;91;93;32;114;111;119;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;66;101;102;111;114;101;58;32;34;32;43;32;114;111;119;91;48;93;32;43;32;34;44;32;34;32;43;32;114;111;119;91;49;93; - - - 99;108;101;97;114;40;114;111;119;41; - - - 111;117;116;112;117;116;58;32;34;65;102;116;101;114;58;32;34;32;43;32;114;111;119;91;48;93;32;43;32;34;44;32;34;32;43;32;114;111;119;91;49;93; - - -`,OS=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;97;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;101;97;116;115;91;105;93;32;61;32;102;97;108;115;101; - - - - -`,MS=` - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;73;110;32;116;104;101;32;115;117;98;112;114;111;103;114;97;109;58;32;120;32;61;32;34;32;43;32;120; - - -`,ZS=` - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - -`,LS=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - - - -`,WS=` - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - -`,ES=` - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - -`,NS=` - - - 105;110;116;32;115;116;97;116;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;49; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;50; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;48; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,FS=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,RS=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;101;108;108;111;33;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;32;97;109;32;86;105;115;117;66;111;116;34;41; - - -`,JS=` - - - 105;110;116;32;110;117;109;98;101;114;32;61;32;48; - 110;117;109;98;101;114;32;60;32;56; - 110;117;109;98;101;114;43;43; - - - 110;117;109;98;101;114;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 110;117;109;98;101;114;32;47;32;50;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 110;117;109;98;101;114;32;47;32;52;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,GS=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,HS=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,VS=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,qS=` - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;86;105;115;117;66;111;116;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;48;44;32;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;51;48;48;41; - - - - -`,US=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,QS=` - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;121;101;108;108;111;119;34;41; - - - 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; - - -`,$S=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - -`,YS=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;52;53; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;80;97;114;107;101;100;33;34;41; - - -`,KS=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,XS=` - - - 83;116;114;105;110;103;91;93;32;99;111;108;111;117;114;115;32;61;32;123;34;114;101;100;34;44;32;34;121;101;108;108;111;119;34;44;32;34;103;114;101;101;110;34;44;32;34;98;108;117;101;34;44;32;34;112;117;114;112;108;101;34;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;111;108;111;117;114;115;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;99;111;108;111;117;114;115;91;105;93;41; - - - - -`,eT=` - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - -`,tT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;114;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,nT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;70;111;114;119;97;114;100;40;41; - - - - -`,iT=` - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;83;116;101;112;115;41; - - -`,aT=` - - - 105;110;116;32;115;105;100;101;32;61;32;49;48; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 116;111;116;97;108;32;61;32;84;111;116;97;108;32;43;32;115;105;100;101; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;116;111;116;97;108;32;43;32;34;32;99;109;34;41; - - -`,sT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;41; - - -`,rT=` - - - 99;111;110;115;116;32;105;110;116;32;83;73;68;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,oT=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;78;105;103;104;116;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;117;115;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;97;121;34;41; - - - - - - -`,lT=` - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;83;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;116;101;112;115; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,uT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;116;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,mT=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;103;114;101;101;110;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - -`,cT=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;100;105;114;101;99;116;105;111;110;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - 100;105;114;101;99;116;105;111;110;32;61;32;73; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;114;101;99;116;105;111;110;58;32;34;32;43;32;100;105;114;101;99;116;105;111;110;41; - - -`,dT=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;116;104;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;114;111;115;115;32;108;105;110;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - -`,hT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;66;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - -`,gT=` - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;83;116;111;112;112;101;100;41; - - -`,pT=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,fT=` - - - 98;111;111;108;101;97;110;32;108;111;117;100;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;111;117;100;32;61;32;84;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;111;117;100; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;108;97;112;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;32;113;117;105;101;116;34;41; - - - - -`,bT=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;111;102;102;40;41; - - - - -`,xT=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;108;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,vT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;80;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,wT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;73;41;46;115;101;116;67;111;108;111;114;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - -`,yT=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;41; - - - - -`,zT=` - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 118;97;108;117;101;115;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;86;97;108;117;101;115;91;105;93; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;41; - - -`,IT=` - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;73;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - -`,kT=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;101;108;108;111;32;99;108;97;115;115;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;84;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - -`,ST=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;83;116;111;112;40;41; - - -`,TT=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;66;97;116;116;101;114;121;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;41; - - - - - 248; - - - - -`,_T=` - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;114;101;100;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;103;114;101;101;110; - - - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;121;101;108;108;111;119;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;114;101;100;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,AT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;114;111;116;97;116;105;111;110;115;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,jT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,CT=` - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,DT=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,BT=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - -`,PT=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;66;97;116;116;101;114;121;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 248; - - - - -`,OT=` - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;114;101;100;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;103;114;101;101;110;34; - - - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;121;101;108;108;111;119;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 115;116;97;116;101;32;61;32;34;114;101;100;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,MT=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;103;114;101;101;110;34;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - -`,ZT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,LT=` - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;105;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - -`,WT=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;44;32;50;48;48;41; - - - - -`,ET=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - -`,NT=` - - - 98;111;111;108;101;97;110;32;108;111;117;100;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;111;117;100;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;111;117;100; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;108;97;112;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;32;113;117;105;101;116;34;41; - - - - -`,FT=` - - - 99;111;110;115;116;32;105;110;116;32;83;73;68;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;83;73;68;69;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,RT=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,JT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;98;108;117;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - -`,GT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,HT=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,VT=` - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;116;101;112;115; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,qT=` - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;101;110;103;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;119;105;100;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,UT=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,QT=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;100;105;114;101;99;116;105;111;110;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - 100;105;114;101;99;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;114;101;99;116;105;111;110;58;32;34;32;43;32;100;105;114;101;99;116;105;111;110;41; - - -`,$T=` - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115;41; - - -`,YT=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,KT=` - - - 105;110;116;32;115;105;100;101;32;61;32;49;48; - - - 105;110;116;32;116;111;116;97;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 116;111;116;97;108;32;61;32;116;111;116;97;108;32;43;32;115;105;100;101; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;116;111;116;97;108;32;43;32;34;32;99;109;34;41; - - -`,XT=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;78;105;103;104;116;34;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;117;115;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;97;121;34;41; - - - - - - -`,e_=` - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;112;101;100;34;41; - - -`,t_=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;101;108;108;111;32;99;108;97;115;115;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - -`,n_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,i_=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,a_=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,s_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;32;48; - 105;45;45; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - - -`,r_=` - - - 99;111;110;115;116;32;105;110;116;32;68;73;83;84;65;78;67;69;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,o_=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - -`,l_=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,u_=` - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - -`,m_=` - - - 99;111;110;115;116;32;105;110;116;32;68;73;83;84;65;78;67;69;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;68;73;83;84;65;78;67;69; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,c_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,d_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;34;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;108;111;119;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;114;101;101;34;41; - - - - - - -`,h_=` - - - 83;116;114;105;110;103;32;115;116;97;116;101;32;61;32;34;100;114;105;118;101;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50;48; - 105;43;43; - - - 115;116;97;116;101;46;101;113;117;97;108;115;40;34;100;114;105;118;101;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 115;116;97;116;101;32;61;32;34;116;117;114;110;34; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;116;97;116;101;32;61;32;34;100;114;105;118;101;34; - - - - - - -`,g_=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 248; - - - - - - - - -`,p_=` - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;32;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;100;46;99;104;97;114;65;116;40;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,f_=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,b_=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;67;114;111;115;115;32;108;105;110;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - -`,x_=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 100;105;115;116;97;110;99;101;32;62;32;109;97;120; - - - 109;97;120;32;61;32;100;105;115;116;97;110;99;101; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;97;114;116;104;101;115;116;58;32;34;32;43;32;109;97;120;32;43;32;34;32;99;109;34;41; - - -`,v_=` - - - 105;110;116;91;93;32;116;111;110;101;115;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;111;110;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;116;111;110;101;115;91;105;93;44;32;51;48;48;41; - - - - -`,w_=` - - - 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 118;97;108;117;101;115;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;118;97;108;117;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;32;61;32;115;117;109;32;43;32;118;97;108;117;101;115;91;105;93; - - - - - 100;111;117;98;108;101;32;97;118;101;114;97;103;101;32;61;32;115;117;109;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;118;101;114;97;103;101;58;32;34;32;43;32;97;118;101;114;97;103;101;41; - - -`,y_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;54;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;104;105;116;101;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;111;102;102;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - -`,z_=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;53;53;44;32;50;53;53;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,I_=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; - - -`,k_=` - - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 108;101;97;118;101;32;116;104;101;32;108;111;111;112; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,S_=` - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41;32;124;124;32;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 248; - - - - -`,T_=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - -`,__=` - - - 115;113;117;97;114;101;40;51;48;41; - - - 115;113;117;97;114;101;40;53;48;41; - - -`,A_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - -`,j_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,C_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;53; - 106;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,D_=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - -`,B_=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;51;48;48;41; - - - - - 248; - - - - -`,P_=` - - - 105;110;116;32;115;116;101;112;115;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;116;101;112;115;32;61;32;115;116;101;112;115;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115;41; - - -`,O_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,M_=` - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - - -`,Z_=` - - - 105;110;116;32;115;105;100;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 115;105;100;101;32;61;32;115;105;100;101;32;43;32;49;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,L_=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;56; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;105;32;42;32;49;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,W_=` - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,E_=` - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;61;32;51; - 114;117;110;100;101;43;43; - - - 114;117;110;100;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;79;110;32;121;111;117;114;32;109;97;114;107;115;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;116;32;115;101;116;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - -`,N_=` - - - 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; - - - 105;110;116;32;119;105;100;116;104;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;101;110;103;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;119;105;100;116;104;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;50;32;42;32;108;101;110;103;116;104;32;43;32;50;32;42;32;119;105;100;116;104; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - -`,F_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - - -`,R_=` - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;57;52;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;51;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;52;57;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; - - -`,J_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,G_=` - - - 105;110;116;32;108;101;102;116;32;61;32;57;57; - - - 105;110;116;32;114;105;103;104;116;32;61;32;57;57; - - - 108;101;102;116;32;62;61;32;50;48;32;124;124;32;114;105;103;104;116;32;62;61;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 108;101;102;116;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 114;105;103;104;116;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - -`,H_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;114;111;116;97;116;105;111;110;115;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,V_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - -`,q_=` - - - 105;110;116;32;115;105;100;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;105;100;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,U_=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;52; - 106;43;43; - - - 105;110;116;32;107;32;61;32;48; - 107;32;60;32;53; - 107;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,Q_=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,$_=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,Y_=` - - - 98;111;111;108;101;97;110;32;100;97;114;107;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 100;97;114;107;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 100;97;114;107; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;116;32;119;97;115;32;100;97;114;107;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;119;97;121;115;32;98;114;105;103;104;116;34;41; - - - - -`,K_=` - - - 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;99;101;110;116;105;109;101;116;114;101;115;40;51;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;100;105;115;116;97;110;99;101;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; - - -`,X_=` - - - 114;101;116;117;114;110;32;114;111;116;97;116;105;111;110;115;32;42;32;50;48; - - -`,eA=` - - - 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;84;105;109;101;114;40;41;32;60;32;50; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,tA=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;78;97;109;101;32;34;70;105;114;115;116;32;110;97;109;101;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;108;97;115;116;78;97;109;101;32;34;76;97;115;116;32;110;97;109;101;34; - - - 111;117;116;112;117;116;58;32;102;105;114;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,nA=` - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;110;100;101;120;79;102;40;34;108;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;108;97;115;116;73;110;100;101;120;79;102;40;34;108;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;66;73;76;76;89;71;79;65;84;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;114;101;112;108;97;99;101;40;34;66;105;108;108;121;34;44;32;34;78;97;110;110;121;34;41; - - - 111;117;116;112;117;116;58;32;34;66;97;97;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;97;103;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;97;103;101;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;97;103;101;41;32;43;32;34;32;121;101;97;114;115;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - -`,iA=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; - - - 83;116;114;105;110;103;32;98;97;99;107;119;97;114;100;115;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;119;111;114;100;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 98;97;99;107;119;97;114;100;115;32;61;32;98;97;99;107;119;97;114;100;115;32;43;32;119;111;114;100;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;98;97;99;107;119;97;114;100;115; - - -`,aA=` - - - 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;76;117;100;119;105;103;59;98;105;108;108;121;32;103;111;97;116;59;55;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;115;32;61;32;108;105;110;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;114;116;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;112;97;114;116;115;91;105;93; - - - - -`,sA=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;110;116;101;110;99;101;32;34;69;110;116;101;114;32;97;32;115;101;110;116;101;110;99;101;34; - - - 83;116;114;105;110;103;91;93;32;119;111;114;100;115;32;61;32;115;101;110;116;101;110;99;101;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;87;111;114;100;115;58;32;34;32;43;32;119;111;114;100;115;46;108;101;110;103;116;104; - - -`,rA=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; - - - 105;110;116;32;99;111;117;110;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 119;111;114;100;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;101;39; - - - 99;111;117;110;116;32;61;32;99;111;117;110;116;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;78;117;109;98;101;114;32;111;102;32;101;58;32;34;32;43;32;99;111;117;110;116; - - -`,oA=` - - - 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;48;44;32;53;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;115;117;98;115;116;114;105;110;103;40;53;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;105;110;100;101;120;79;102;40;34;103;111;97;116;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;100;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - -`,lA=` - - - 105;110;116;91;93;91;93;32;116;97;98;101;108;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;101;108;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;101;108;108;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;101;108;108;101;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;32;40;49;32;98;105;115;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;32;40;49;32;98;105;115;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - -`,uA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;114;101;105;32;61;32;48; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;115;105;116;122;101;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 105;110;116;32;112;108;97;116;122;32;61;32;48; - 112;108;97;116;122;32;60;32;115;105;116;122;101;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 112;108;97;116;122;43;43; - - - 33;115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 102;114;101;105;32;61;32;102;114;101;105;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;105;58;32;34;32;43;32;102;114;101;105; - - -`,mA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;50;93;91;51;93;32;61;32;116;114;117;101; - - -`,cA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;82;101;105;104;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;112;108;97;116;122;32;34;80;108;97;116;122;34; - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 111;117;116;112;117;116;58;32;34;83;99;104;111;110;32;118;101;114;107;97;117;102;116;34; - - - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;86;101;114;107;97;117;102;116;58;32;82;101;105;104;101;32;34;32;43;32;114;101;105;104;101;32;43;32;34;44;32;80;108;97;116;122;32;34;32;43;32;112;108;97;116;122; - - - - -`,dA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;82;101;105;104;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;112;108;97;116;122;32;34;80;108;97;116;122;34; - - -`,hA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;114;101;105;104;101;32;61;32;48; - 114;101;105;104;101;32;60;32;115;105;116;122;101;46;108;101;110;103;116;104; - 114;101;105;104;101;43;43; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;34; - - - 105;110;116;32;112;108;97;116;122;32;61;32;48; - 112;108;97;116;122;32;60;32;115;105;116;122;101;91;114;101;105;104;101;93;46;108;101;110;103;116;104; - 112;108;97;116;122;43;43; - - - 115;105;116;122;101;91;114;101;105;104;101;93;91;112;108;97;116;122;93; - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;88;34; - - - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - -`,gA=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 115;105;116;122;101;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 115;105;116;122;101;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;82;101;105;104;101;110;58;32;34;32;43;32;115;105;116;122;101;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;80;108;228;116;122;101;32;112;114;111;32;82;101;105;104;101;58;32;34;32;43;32;115;105;116;122;101;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;82;101;105;104;101;32;49;44;32;80;108;97;116;122;32;50;32;118;101;114;107;97;117;102;116;63;32;34;32;43;32;115;105;116;122;101;91;49;93;91;50;93; - - -`,pA=` - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 105;110;116;32;90;97;104;108;32;61;32;54; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;90;97;104;108; - - - 111;117;116;112;117;116;58;32;34;69;114;103;101;98;110;105;115;58;32;34;32;43;32;101;114;103;101;98;110;105;115; - - -`,fA=` - - - 105;110;116;32;122;97;104;108;32;61;32;52; - - - 105;110;116;32;90;97;104;108;32;61;32;54; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;90;65;72;76; - - - 111;117;116;112;117;116;58;32;34;69;114;103;101;98;110;105;115;58;32;34;32;43;32;101;114;103;101;98;110;105;115; - - -`,bA=` - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - -`,xA=` - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; - - -`,vA=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - -`,wA=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;65;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34;41; - - -`,yA=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;97;108;116;101;114;32;61;32;55; - - - 100;111;117;98;108;101;32;103;114;111;101;115;115;101;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - - 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; - - -`,zA=` - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;49; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - -`,IA=` - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;52; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - -`,kA=` - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;52; - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; - - -`,SA=` - - - 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; - - - 83;116;114;105;110;103;32;114;101;99;104;116;115;32;61;32;34;87;97;115;115;101;114;34; - - - 83;116;114;105;110;103;32;104;105;108;102;32;61;32;108;105;110;107;115; - - - 108;105;110;107;115;32;61;32;114;101;99;104;116;115; - - - 114;101;99;104;116;115;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;76;105;110;107;115;58;32;34;32;43;32;108;105;110;107;115; - - - 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; - - -`,TA=` - - - 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; - - - 83;116;114;105;110;103;32;114;101;99;104;116;115;32;61;32;34;87;97;115;115;101;114;34; - - - 111;117;116;112;117;116;58;32;34;76;105;110;107;115;58;32;34;32;43;32;108;105;110;107;115; - - - 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; - - -`,_A=` - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,AA=` - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;52; - - - 100;111;117;98;108;101;32;103;114;111;101;115;115;101;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;77;105;97;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;105;115;116;32;34;32;43;32;97;108;116;101;114;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34; - - - 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; - - -`,jA=` - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;49;51;53; - - - 105;110;116;32;115;116;117;110;100;101;110;32;61;32;109;105;110;117;116;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;109;105;110;117;116;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;115;116;117;110;100;101;110;32;43;32;34;32;83;116;117;110;100;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;77;105;110;117;116;101;110;34; - - -`,CA=` - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;101;105;115;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;80;114;101;105;115;32;61;32;97;110;122;97;104;108;32;42;32;112;114;101;105;115; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116;80;114;101;105;115;32;43;32;34;32;69;117;114;111;34; - - -`,DA=` - - - 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; - - - 105;110;116;32;112;114;101;105;115;32;61;32;55; - - - 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; - - - 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; - - -`,BA=` - - - 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; - - - 105;110;116;32;112;114;101;105;115;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; - - - 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; - - -`,PA=` - - - 105;110;116;32;112;114;101;105;115;32;61;32;57; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;112;114;101;105;115;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - -`,OA=` - - - 105;110;116;32;115;116;117;101;99;107;101;32;61;32;56; - - - 105;110;116;32;112;101;114;115;111;110;101;110;32;61;32;52; - - - 105;110;116;32;112;114;111;80;101;114;115;111;110;32;61;32;115;116;117;101;99;107;101;32;47;32;112;101;114;115;111;110;101;110; - - - 111;117;116;112;117;116;58;32;34;74;101;100;101;114;32;98;101;107;111;109;109;116;32;34;32;43;32;112;114;111;80;101;114;115;111;110;32;43;32;34;32;83;116;252;99;107;101;46;34; - - -`,MA=` - - - 105;110;116;32;115;116;117;101;99;107;101;32;61;32;56; - - - 105;110;116;32;112;101;114;115;111;110;101;110;32;61;32;52; - - - 105;110;116;32;112;114;111;80;101;114;115;111;110;32;61;32;115;116;117;101;99;107;101;32;47;32;112;101;114;115;111;110;101;110; - - - 111;117;116;112;117;116;58;32;34;74;101;100;101;114;32;98;101;107;111;109;109;116;32;34;32;43;32;112;114;111;112;101;114;115;111;110;32;43;32;34;32;83;116;252;99;107;101;46;34; - - -`,ZA=` - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;55; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;52; - - - 105;110;116;32;102;108;97;101;99;104;101;32;61;32;108;97;101;110;103;101;32;42;32;98;114;101;105;116;101; - - - 105;110;116;32;117;109;102;97;110;103;32;61;32;50;32;42;32;40;108;97;101;110;103;101;32;43;32;98;114;101;105;116;101;41; - - - 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102;108;97;101;99;104;101; - - - 111;117;116;112;117;116;58;32;34;85;109;102;97;110;103;58;32;34;32;43;32;117;109;102;97;110;103; - - -`,LA=` - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;101;110;32;61;32;115;101;107;117;110;100;101;110;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;32;61;32;115;101;107;117;110;100;101;110;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; - - -`,WA=` - - - 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; - - -`,EA=` - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;53; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51; - - - 105;110;116;32;102;108;97;101;99;104;101;32;61;32;108;97;101;110;103;101;32;42;32;98;114;101;105;116;101; - - - 111;117;116;112;117;116;58;32;102;108;97;101;99;104;101; - - -`,NA=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; - - -`,FA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,RA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;40;97;32;43;32;98;41; - - -`,JA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;97;32;43;32;98; - - -`,GA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;228;99;104;115;116;101;115;32;74;97;104;114;32;98;105;115;116;32;100;117;32;34;32;43;32;40;97;108;116;101;114;32;43;32;49;41; - - -`,HA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;78;228;99;104;115;116;101;115;32;74;97;104;114;32;98;105;115;116;32;100;117;32;34;32;43;32;40;65;108;116;101;114;32;43;32;49;41; - - -`,VA=` - - - 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;101;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 105;110;116;32;116;97;103;101;32;61;32;106;97;104;114;101;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;115;105;110;100;32;101;116;119;97;32;34;32;43;32;116;97;103;101;32;43;32;34;32;84;97;103;101;46;34; - - -`,qA=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108; - - -`,UA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;107;116;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;107;116;58;32;34;32;43;32;112;114;111;100;117;107;116; - - -`,QA=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;105;115;116;32;118;111;108;108;106;228;104;114;105;103;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;105;115;116;32;110;111;99;104;32;110;105;99;104;116;32;118;111;108;108;106;228;104;114;105;103;46;34; - - - - -`,$A=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; - - - 122;97;104;108;32;60;32;48; - - - 122;97;104;108;32;61;32;48;32;45;32;122;97;104;108; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - -`,YA=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;103;101;114;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;101;114;97;100;101;34; - - - - -`,KA=` - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;53; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - -`,XA=` - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;53; - - - 112;117;110;107;116;101;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - -`,ej=` - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - -`,tj=` - - - 105;110;116;32;112;117;110;107;116;101;32;61;32;49;48; - - - 112;117;110;107;116;101;32;61;32;112;117;110;107;116;101;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; - - -`,nj=` - - - 105;110;116;32;112;114;101;105;115;32;61;32;56; - - - 105;110;116;32;107;97;101;115;101;32;61;32;50; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;40;112;114;101;105;115;32;43;32;107;97;101;115;101;41;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - -`,ij=` - - - 105;110;116;32;112;114;101;105;115;32;61;32;56; - - - 105;110;116;32;107;97;101;115;101;32;61;32;50; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;51; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;112;114;101;105;115;32;43;32;107;97;101;115;101;32;42;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - -`,aj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - -`,sj=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;105;115;32;34;80;114;101;105;115;32;105;110;32;69;117;114;111;63;34; - - - 112;114;101;105;115;32;62;32;53;48; - - - 112;114;101;105;115;32;61;32;112;114;101;105;115;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;90;117;32;122;97;104;108;101;110;58;32;34;32;43;32;112;114;101;105;115;32;43;32;34;32;69;117;114;111;34; - - -`,rj=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; - - - 110;111;116;101;32;62;61;32;49;32;38;38;32;110;111;116;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;103;252;108;116;105;103;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;252;108;116;105;103;34; - - - - -`,oj=` - - - 105;110;112;117;116;58;32;105;110;116;32;112;117;110;107;116;101;32;34;87;105;101;32;118;105;101;108;101;32;80;117;110;107;116;101;63;34; - - - 112;117;110;107;116;101;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;98;101;115;116;97;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;110;105;99;104;116;32;98;101;115;116;97;110;100;101;110;34; - - - - -`,lj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;69;117;114;111;34; - - - - -`,uj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;69;117;114;111;34; - - - - -`,mj=` - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;53; - - - 97;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;108;97;115;115;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;69;105;110;108;97;115;115;34; - - - - -`,cj=` - - - 105;110;116;32;97;108;116;101;114;32;61;32;49;53; - - - 65;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;108;97;115;115;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;69;105;110;108;97;115;115;34; - - - - -`,dj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;50;32;38;38;32;97;108;116;101;114;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;74;117;103;101;110;100;116;105;99;107;101;116;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;32;74;117;103;101;110;100;116;105;99;107;101;116;34; - - - - -`,hj=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; - - - 110;111;116;101;32;60;32;49;32;124;124;32;110;111;116;101;32;62;32;54; - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;78;111;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;101;32;34;32;43;32;110;111;116;101;32;43;32;34;32;105;115;116;32;103;252;108;116;105;103;46;34; - - - - -`,gj=` - - - 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;32;34;74;97;104;114;63;34; - - - 40;106;97;104;114;32;37;32;52;32;61;61;32;48;32;38;38;32;106;97;104;114;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;106;97;104;114;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;83;99;104;97;108;116;106;97;104;114;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;105;110;32;83;99;104;97;108;116;106;97;104;114;34; - - - - -`,pj=` - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;101;110;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;87;101;114;107;116;97;103;34; - - - - -`,fj=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;97;114;98;101;32;34;87;101;108;99;104;101;32;70;97;114;98;101;32;104;97;116;32;100;105;101;32;65;109;112;101;108;63;34; - - - 102;97;114;98;101; - - - 111;117;116;112;117;116;58;32;34;83;116;101;104;101;110;32;98;108;101;105;98;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;87;97;114;116;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;71;101;104;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;70;97;114;98;101;32;107;101;110;110;101;32;105;99;104;32;110;105;99;104;116;46;34; - - - - -`,bj=` - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;87;97;115;115;101;114;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;83;97;102;116;46;34; - - - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;75;97;107;97;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;84;97;115;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - -`,xj=` - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - -`,vj=` - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; - - - 116;97;103;32;61;61;32;54;32;38;38;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - -`,wj=` - - - 105;110;116;32;116;97;103;32;61;32;55; - - - 116;97;103;32;61;61;32;54;32;124;124;32;116;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - -`,yj=` - - - 105;110;116;32;116;97;103;32;61;32;55; - - - 116;97;103;32;61;61;32;54;32;124;124;32;84;97;103;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;99;104;117;108;102;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - -`,zj=` - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;117;110;100;101;32;34;87;105;101;32;115;112;228;116;32;105;115;116;32;101;115;32;40;110;117;114;32;100;105;101;32;83;116;117;110;100;101;41;63;34; - - - 115;116;117;110;100;101;32;62;61;32;56;32;38;38;32;115;116;117;110;100;101;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;83;99;104;117;108;101;34; - - - - - 111;117;116;112;117;116;58;32;34;70;114;101;105;122;101;105;116;34; - - - - -`,Ij=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;87;101;108;99;104;101;32;78;111;116;101;63;34; - - - 110;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;98;101;102;114;105;101;100;105;103;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;97;117;115;114;101;105;99;104;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;109;97;110;103;101;108;104;97;102;116;34; - - - - - 111;117;116;112;117;116;58;32;34;117;110;103;101;110;252;103;101;110;100;34; - - - - - 111;117;116;112;117;116;58;32;34;75;101;105;110;101;32;103;252;108;116;105;103;101;32;78;111;116;101;34; - - - - -`,kj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;122;101;105;99;104;101;110;32;34;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;48; - - - 122;101;105;99;104;101;110; - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 101;114;103;101;98;110;105;115;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;101;114;103;101;98;110;105;115; - - - - - 111;117;116;112;117;116;58;32;34;85;110;98;101;107;97;110;110;116;101;115;32;82;101;99;104;101;110;122;101;105;99;104;101;110;34; - - - - -`,Sj=` - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; - - - 119;97;104;108;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;87;97;115;115;101;114;46;34; - - - - - 119;97;104;108;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;83;97;102;116;46;34; - - - - - 119;97;104;108;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;72;105;101;114;32;105;115;116;32;100;101;105;110;32;75;97;107;97;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;101;115;101;32;84;97;115;116;101;32;103;105;98;116;32;101;115;32;110;105;99;104;116;46;34; - - - - - - - - -`,Tj=` - - - 84;97;115;115;101;32;97;117;102;32;100;101;110;32;84;105;115;99;104;32;115;116;101;108;108;101;110; - - - 90;117;99;107;101;114;32;103;101;119;252;110;115;99;104;116;63; - - - 90;117;99;107;101;114;32;104;105;110;101;105;110;103;101;98;101;110; - - - - - 248; - - - - - 84;101;101;32;110;111;99;104;32;122;117;32;104;101;105;223; - - - 49;32;77;105;110;117;116;101;32;119;97;114;116;101;110; - - - - - 84;101;101;32;116;114;105;110;107;101;110; - - -`,_j=` - - - 65;117;102;115;116;101;104;101;110; - - - 90;228;104;110;101;32;112;117;116;122;101;110; - - - 65;110;122;105;101;104;101;110; - - - 70;114;252;104;115;116;252;99;107;101;110; - - -`,Aj=` - - - 87;97;115;115;101;114;32;105;110;32;100;101;110;32;87;97;115;115;101;114;107;111;99;104;101;114;32;102;252;108;108;101;110; - - - 87;97;115;115;101;114;107;111;99;104;101;114;32;101;105;110;115;99;104;97;108;116;101;110; - - - 84;101;101;98;101;117;116;101;108;32;105;110;32;100;105;101;32;84;97;115;115;101;32;108;101;103;101;110; - - - 72;101;105;223;101;115;32;87;97;115;115;101;114;32;105;110;32;100;105;101;32;84;97;115;115;101;32;103;105;101;223;101;110; - - - 51;32;77;105;110;117;116;101;110;32;119;97;114;116;101;110; - - - 84;101;101;98;101;117;116;101;108;32;104;101;114;97;117;115;110;101;104;109;101;110; - - -`,jj=` - - - 82;101;103;110;101;116;32;101;115;63; - - - 82;101;103;101;110;115;99;104;105;114;109;32;101;105;110;112;97;99;107;101;110; - - - - - 83;111;110;110;101;110;98;114;105;108;108;101;32;101;105;110;112;97;99;107;101;110; - - - - - 76;111;115;103;101;104;101;110; - - -`,Cj=` - - - 84;101;108;108;101;114;32;110;105;99;104;116;32;108;101;101;114; - - - 69;105;110;101;110;32;66;105;115;115;101;110;32;101;115;115;101;110; - - - - - 84;101;108;108;101;114;32;97;98;114;228;117;109;101;110; - - -`,Dj=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;32;122;228;104;108;101;110;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,Bj=` - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,Pj=` - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,Oj=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;107;117;108;116;228;116;32;118;111;110;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;102;97;107;117;108;116;97;101;116;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;107;117;108;116;97;101;116;32;61;32;102;97;107;117;108;116;97;101;116;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;107;117;108;116;97;101;116; - - -`,Mj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;109;97;108;63;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;71;105;98;116;32;101;115;32;110;105;99;104;116;34; - - - - -`,Zj=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;112;108;117;115;44;32;50;32;109;105;110;117;115;44;32;51;32;109;97;108;63;34; - - - 119;97;104;108; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;71;105;98;116;32;101;115;32;110;105;99;104;116;34; - - - - -`,Lj=` - - - 105;110;116;32;110;111;116;101;32;61;32;50; - - - 110;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;119;101;105;116;101;114;32;252;98;101;110;34; - - - - -`,Wj=` - - - 105;110;116;32;110;111;116;101;32;61;32;50; - - - 78;111;116;101; - - - 111;117;116;112;117;116;58;32;34;115;101;104;114;32;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;103;117;116;34; - - - - - 111;117;116;112;117;116;58;32;34;119;101;105;116;101;114;32;252;98;101;110;34; - - - - -`,Ej=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; - - - 122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;101;105;110;115;34; - - - - - 111;117;116;112;117;116;58;32;34;122;119;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;100;114;101;105;34; - - - - - 111;117;116;112;117;116;58;32;34;107;101;110;110;101;32;105;99;104;32;110;105;99;104;116;34; - - - - -`,Nj=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;34; - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 122;97;104;108;32;60;32;49;48;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;99;104;114;105;116;116;101; - - -`,Fj=` - - - 105;110;116;32;122;97;104;108;32;61;32;48; - - - 122;97;104;108;32;60;32;49;32;124;124;32;122;97;104;108;32;62;32;49;48; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;118;111;110;32;49;32;98;105;115;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;68;97;110;107;101;33;34; - - -`,Rj=` - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,Jj=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; - - - 105;110;116;32;103;101;108;100;32;61;32;48; - - - 105;110;116;32;119;111;99;104;101;110;32;61;32;48; - - - 103;101;108;100;32;60;32;122;105;101;108; - - - 103;101;108;100;32;61;32;103;101;108;100;32;43;32;53; - - - 119;111;99;104;101;110;32;61;32;119;111;99;104;101;110;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; - - -`,Gj=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; - - - 105;110;116;32;103;101;108;100;32;61;32;48; - - - 105;110;116;32;119;111;99;104;101;110;32;61;32;48; - - - 103;101;108;100;32;60;61;32;122;105;101;108; - - - 103;101;108;100;32;61;32;103;101;108;100;32;43;32;53; - - - 119;111;99;104;101;110;32;61;32;119;111;99;104;101;110;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; - - -`,Hj=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;122;97;104;108;32;61;32;50; - - - 122;97;104;108;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;43;32;50; - - - - -`,Vj=` - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,qj=` - - - 105;110;116;32;122;97;104;108;32;61;32;51; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;90;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,Uj=` - - - 105;110;116;32;110;111;116;101;32;61;32;48; - - - 110;111;116;101;32;60;32;49;32;124;124;32;110;111;116;101;32;62;32;54; - - - 105;110;112;117;116;58;32;110;111;116;101;32;34;78;111;116;101;32;118;111;110;32;49;32;98;105;115;32;54;34; - - - - - 111;117;116;112;117;116;58;32;34;68;101;105;110;101;32;78;111;116;101;58;32;34;32;43;32;110;111;116;101; - - -`,Qj=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;122;97;104;108;32;61;32;48; - - - 122;97;104;108;32;33;61;32;48; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;40;48;32;98;101;101;110;100;101;116;41;34; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,$j=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;122;97;104;108;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;33;34; - - -`,Yj=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;107;116;32;61;32;122;97;104;108;32;42;32;105; - - - 111;117;116;112;117;116;58;32;122;97;104;108;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;107;116; - - - - -`,Kj=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,Xj=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - -`,eC=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;49; - - - 122;97;104;108;32;61;32;122;97;104;108;32;47;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - -`,tC=` - - - 105;110;116;32;122;97;104;108;32;61;32;49; - - - 105;110;116;32;103;114;101;110;122;101;32;61;32;50;48; - - - 122;97;104;108;32;60;32;103;114;101;110;122;101; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - - -`,nC=` - - - 105;110;116;32;122;97;104;108;32;61;32;49; - - - 105;110;116;32;103;114;101;110;122;101;32;61;32;50;48; - - - 122;97;104;108;32;60;32;71;114;101;110;122;101; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - - -`,iC=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;60;32;49;48;48; - - - 122;97;104;108;32;61;32;122;97;104;108;32;42;32;50; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - - -`,aC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,sC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;90;101;105;108;101;110;63;34; - - - 105;110;116;32;122;101;105;108;101;32;61;32;49; - 122;101;105;108;101;32;60;61;32;110; - 122;101;105;108;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;116;101;114;110;32;61;32;49; - 115;116;101;114;110;32;60;61;32;122;101;105;108;101; - 115;116;101;114;110;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - -`,rC=` - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 122;97;104;108;32;37;32;50;32;61;61;32;48; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108; - - -`,oC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108; - - -`,lC=` - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;101;105;104;101;32;42;32;105; - - - - -`,uC=` - - - 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;114;101;105;104;101;32;42;32;105; - - - - -`,mC=` - - - 105;110;116;32;104;111;101;104;101;32;61;32;48; - - - 105;110;116;32;115;116;117;102;101;32;61;32;49; - 115;116;117;102;101;32;60;61;32;53; - 115;116;117;102;101;43;43; - - - 104;111;101;104;101;32;61;32;104;111;101;104;101;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;246;104;101;58;32;34;32;43;32;104;111;101;104;101;32;43;32;34;32;99;109;34; - - -`,cC=` - - - 105;110;116;32;115;116;117;102;101;32;61;32;49; - 115;116;117;102;101;32;60;61;32;53; - 115;116;117;102;101;43;43; - - - 104;111;101;104;101;32;61;32;104;111;101;104;101;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;72;246;104;101;58;32;34;32;43;32;104;111;101;104;101;32;43;32;34;32;99;109;34; - - -`,dC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - -`,hC=` - - - 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;34; - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;101;104;101;32;34;72;246;104;101;34; - - - 105;110;116;32;122;101;105;108;101;32;61;32;49; - 122;101;105;108;101;32;60;61;32;104;111;101;104;101; - 122;101;105;108;101;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;34; - - - 105;110;116;32;115;112;97;108;116;101;32;61;32;49; - 115;112;97;108;116;101;32;60;61;32;98;114;101;105;116;101; - 115;112;97;108;116;101;43;43; - - - 116;101;120;116;32;61;32;116;101;120;116;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - - - -`,gC=` - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;122;97;104;108;101;110;91;105;93; - - - - -`,pC=` - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;91;48;93; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;91;119;101;114;116;101;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;119;101;114;116;101;46;108;101;110;103;116;104; - - -`,fC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - -`,bC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - - - -`,xC=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - -`,vC=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - -`,wC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;83;116;117;102;101;110;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 122;101;105;108;101;32;61;32;122;101;105;108;101;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;122;101;105;108;101; - - - - -`,yC=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;97;109;101;110;91;105;93;32;34;78;97;109;101;32;101;105;110;103;101;98;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;69;114;115;116;101;114;32;78;97;109;101;58;32;34;32;43;32;110;97;109;101;110;91;48;93; - - -`,zC=` - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;122;97;104;108;101;110;91;105;93;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;105;32;61;32;122;97;104;108;101;110;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;122;97;104;108;101;110;91;105;93; - - - - -`,IC=` - - - 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;122;97;104;108;101;110;91;105;93;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;122;97;104;108;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;97;104;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108;101;110;91;105;93; - - - 122;97;104;108;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;122;97;104;108;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - -`,kC=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;117;110;107;116;101;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - 112;117;110;107;116;101;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;117;110;107;116;101;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - - 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; - - -`,SC=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - 122;97;104;108;32;33;61;32;48; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - 105;110;112;117;116;58;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,TC=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;32;40;48;32;61;32;69;110;100;101;41;34; - - - 122;97;104;108;32;61;61;32;48; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;122;97;104;108; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,_C=` - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;101;110;103;101;32;34;76;228;110;103;101;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;63;34; - - - 105;110;116;32;102;32;61;32;102;108;97;101;99;104;101;40;108;97;101;110;103;101;44;32;98;114;101;105;116;101;41; - - - 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102; - - -`,AC=` - - - 114;101;116;117;114;110;32;97;32;42;32;98; - - -`,jC=` - - - 122;101;105;103;101;66;101;103;114;117;101;115;115;117;110;103;40;41; - - - 115;116;101;108;108;101;70;114;97;103;101;110;40;41; - - - 122;101;105;103;101;69;114;103;101;98;110;105;115;40;41; - - -`,CC=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; - - -`,DC=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;101;110;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; - - -`,BC=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,PC=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;76;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,OC=` - - - 105;110;116;91;93;32;110;111;116;101;110;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;110;111;116;101;110;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,MC=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; - - - 105;110;116;32;113;32;61;32;113;117;97;100;114;97;116;40;122;97;104;108;41; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;81;117;97;100;114;97;116;32;105;115;116;32;34;32;43;32;113; - - -`,ZC=` - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;101;114;103;101;98;110;105;115; - - -`,LC=` - - - 122;101;105;103;101;84;105;116;101;108;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101; - - -`,WC=` - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;32;122;117;109;32;81;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;68;117;32;98;101;107;111;109;109;115;116;32;100;114;101;105;32;70;114;97;103;101;110;46;34; - - -`,EC=` - - - 122;101;105;103;101;83;117;109;109;101;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 122;101;105;103;101;83;117;109;109;101;40;120;44;32;120;32;43;32;49;41; - - -`,NC=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109;109;101; - - -`,FC=` - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;33;34; - - -`,RC=` - - - 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; - - - 105;110;116;32;105;32;61;32;115;116;97;114;116; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;76;111;115;34; - - -`,JC=` - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; - - -`,GC=` - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; - - -`,HC=` - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;44;32;82;117;110;100;101;32;49;58;32;34;32;43;32;112;117;110;107;116;101;91;49;93;91;48;93; - - -`,VC=` - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;44;32;82;117;110;100;101;32;49;58;32;34;32;43;32;80;117;110;107;116;101;91;49;93;91;48;93; - - -`,qC=` - - - 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;117;110;107;116;101;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;117;110;107;116;101;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; - - -`,UC=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,QC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,$C=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;117;109;109;101; - - -`,YC=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;122;97;104;108;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;109;97;108;32;34;32;43;32;122;97;104;108;32;43;32;34;32;61;32;34;32;43;32;101;114;103;101;98;110;105;115; - - - - - 122;97;104;108;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;119;97;114;32;115;99;104;119;101;114;33;34; - - - - - 111;117;116;112;117;116;58;32;34;68;97;115;32;119;97;114;32;108;101;105;99;104;116;46;34; - - - - -`,KC=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;102;97;107;117;108;116;97;101;116;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;107;117;108;116;97;101;116;32;61;32;102;97;107;117;108;116;97;101;116;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;107;117;108;116;97;101;116; - - -`,XC=` - - - 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;98;114;105;101;102;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;90;101;105;108;101;110;58;32;34;32;43;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 122;101;105;108;101;110;91;105;93;46;99;111;110;116;97;105;110;115;40;34;70;117;99;104;115;34;41; - - - 111;117;116;112;117;116;58;32;34;70;117;99;104;115;32;105;110;32;90;101;105;108;101;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - -`,eD=` - - - 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; - - -`,tD=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,nD=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;63;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - -`,iD=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;104;97;116;32;34;32;43;32;110;97;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;66;117;99;104;115;116;97;98;101;110;34; - - -`,aD=` - - - 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;97;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;104;97;116;32;34;32;43;32;110;97;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;66;117;99;104;115;116;97;98;101;110;34; - - -`,sD=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;105;110;103;97;98;101;32;34;80;97;115;115;119;111;114;116;63;34; - - - 101;105;110;103;97;98;101;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;33;34; - - - - - 111;117;116;112;117;116;58;32;34;70;97;108;115;99;104;101;115;32;80;97;115;115;119;111;114;116;34; - - - - -`,rD=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;105;110;116;114;105;116;116;32;102;114;101;105;34; - - - - - 97;108;116;101;114;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;75;105;110;100;101;114;116;105;99;107;101;116;58;32;52;32;69;117;114;111;34; - - - - - 111;117;116;112;117;116;58;32;34;69;114;119;97;99;104;115;101;110;101;110;116;105;99;107;101;116;58;32;56;32;69;117;114;111;34; - - - - - - -`,oD=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;119;101;114;116;63;34; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;69;110;100;101;34; - - -`,lD=` - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;116;105;112;112;32;34;68;101;105;110;32;84;105;112;112;63;34; - - - 118;101;114;115;117;99;104;101;32;61;32;118;101;114;115;117;99;104;101;32;43;32;49; - - - 116;105;112;112;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; - - -`,uD=` - - - 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;116;105;112;112;32;34;68;101;105;110;32;84;105;112;112;63;34; - - - 116;105;112;112;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 118;101;114;115;117;99;104;101;32;61;32;118;101;114;115;117;99;104;101;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; - - -`,mD=` - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;101;105;115;32;34;80;114;101;105;115;63;32;40;48;32;61;32;69;110;100;101;41;34; - - - 112;114;101;105;115;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;112;114;101;105;115; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;65;114;116;105;107;101;108;58;32;34;32;43;32;97;110;122;97;104;108; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;115;117;109;109;101; - - -`,cD=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; - - - 97;108;116;101;114;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;68;117;32;100;97;114;102;115;116;32;119;228;104;108;101;110;46;34; - - - - - 105;110;116;32;106;97;104;114;101;32;61;32;49;54;32;45;32;97;108;116;101;114; - - - 111;117;116;112;117;116;58;32;34;78;111;99;104;32;34;32;43;32;106;97;104;114;101;32;43;32;34;32;74;97;104;114;101;32;119;97;114;116;101;110;46;34; - - - - -`,dD=` - - - 105;110;112;117;116;58;32;105;110;116;32;103;114;101;110;122;101;32;34;66;105;115;32;119;111;104;105;110;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;103;114;101;110;122;101; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,hD=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,gD=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,pD=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;103;101;115;117;99;104;116;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,fD=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;103;101;115;117;99;104;116;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;71;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - -`,bD=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; - - -`,xD=` - - - 111;117;116;112;117;116;58;32;34;71;117;116;101;110;32;77;111;114;103;101;110;34; - - - 111;117;116;112;117;116;58;32;34;72;101;117;116;101;32;108;101;114;110;101;110;32;119;105;114;32;83;116;114;117;107;116;111;103;114;97;109;109;101;46;34; - - -`,vD=` - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;87;101;108;116;34; - - -`,wD=` - - - 111;117;116;112;117;116;58;32;34;72;97;108;108;111;34; - - - 111;117;116;112;117;116;58;32;34;73;99;104;32;108;101;114;110;101;32;83;116;114;117;107;116;111;103;114;97;109;109;101;34; - - -`,yD=` - - - 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; - - - 122;97;104;108;32;62;32;48; - - - 111;117;116;112;117;116;58;32;122;97;104;108; - - - 122;97;104;108;32;61;32;122;97;104;108;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; - - -`,zD=` - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;101;105;110;107;97;117;102;45;110;101;117;46;116;120;116;34;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;122;101;105;108;101;41; - - - 97;110;122;97;104;108;43;43; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;75;117;99;104;101;110;34;41; - - - 97;110;122;97;104;108;43;43; - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;90;101;105;108;101;110;32;103;101;115;112;101;105;99;104;101;114;116;34; - - -`,ID=` - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;101;105;110;107;97;117;102;45;110;101;117;46;116;120;116;34;41; - - -`,kD=` - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;109;101;114;32;61;32;49; - - - 100;97;116;101;105;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;100;97;116;101;105;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;109;101;114;32;43;32;34;46;32;34;32;43;32;122;101;105;108;101; - - - 110;117;109;109;101;114;43;43; - - - - - 100;97;116;101;105;46;99;108;111;115;101;40;41; - - -`,SD=` - - - 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; - - -`,TD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 122;101;105;108;101;46;99;111;110;116;97;105;110;115;40;34;70;117;99;104;115;34;41; - - - 97;110;122;97;104;108;43;43; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;70;117;99;104;115;58;32;34;32;43;32;97;110;122;97;104;108; - - -`,_D=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,AD=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;108;97;101;110;103;115;116;101;114;32;61;32;122;101;105;108;101;110;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 122;101;105;108;101;110;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;108;97;101;110;103;115;116;101;114;46;108;101;110;103;116;104;40;41; - - - 108;97;101;110;103;115;116;101;114;32;61;32;122;101;105;108;101;110;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;76;228;110;103;115;116;101;114;32;69;105;110;116;114;97;103;58;32;34;32;43;32;108;97;101;110;103;115;116;101;114; - - -`,jD=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - -`,CD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;98;101;115;116;101;114;78;97;109;101;32;61;32;34;34; - - - 105;110;116;32;98;101;115;116;101;78;111;116;101;32;61;32;55; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;110;111;116;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;51;93;41; - - - 110;111;116;101;32;60;32;98;101;115;116;101;78;111;116;101; - - - 98;101;115;116;101;78;111;116;101;32;61;32;110;111;116;101; - - - 98;101;115;116;101;114;78;97;109;101;32;61;32;116;101;105;108;101;91;48;93; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;66;101;115;116;101;32;78;111;116;101;32;105;110;32;69;110;103;108;105;115;99;104;58;32;34;32;43;32;98;101;115;116;101;114;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;101;78;111;116;101;32;43;32;34;41;34; - - -`,DD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,BD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;116;101;105;108;101;91;49;93;41; - - - 97;110;122;97;104;108;43;43; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;83;99;104;110;105;116;116;32;77;97;116;104;101;58;32;34;32;43;32;115;117;109;109;101;32;47;32;97;110;122;97;104;108; - - -`,PD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,OD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 122;101;105;108;101;46;99;111;110;116;97;105;110;115;40;34;92;34;110;97;109;101;92;34;34;41; - - - 105;110;116;32;115;116;97;114;116;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;110;97;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;101;110;100;101;32;61;32;122;101;105;108;101;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;115;116;97;114;116;41; - - - 111;117;116;112;117;116;58;32;122;101;105;108;101;46;115;117;98;115;116;114;105;110;103;40;115;116;97;114;116;44;32;101;110;100;101;41; - - - - - 248; - - - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - -`,MD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,ZD=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;117;110;107;116;101;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;105;110;116;114;97;103;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;110;97;109;101;110;91;105;93;32;43;32;34;92;34;44;32;92;34;112;117;110;107;116;101;92;34;58;32;34;32;43;32;112;117;110;107;116;101;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;97;109;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 101;105;110;116;114;97;103;32;61;32;101;105;110;116;114;97;103;32;43;32;34;44;34; - - - - - 248; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;101;105;110;116;114;97;103;41; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;97;109;101;110;46;108;101;110;103;116;104;32;43;32;34;32;69;105;110;116;114;228;103;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - -`,LD=` - - - 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;117;110;107;116;101;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - -`,WD=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;116;105;101;114;101;45;110;101;117;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;110;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;105;110;116;114;97;103;32;61;32;34;32;32;123;92;34;110;97;109;101;92;34;58;32;92;34;34;32;43;32;116;101;105;108;101;91;48;93;32;43;32;34;92;34;44;32;92;34;97;114;116;92;34;58;32;92;34;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;92;34;44;32;92;34;97;108;116;101;114;92;34;58;32;34;32;43;32;116;101;105;108;101;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;122;101;105;108;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 101;105;110;116;114;97;103;32;61;32;101;105;110;116;114;97;103;32;43;32;34;44;34; - - - - - 248; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;101;105;110;116;114;97;103;41; - - - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;122;101;105;108;101;110;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;84;105;101;114;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - -`,ED=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;116;105;101;114;101;45;110;101;117;46;106;115;111;110;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - -`,ND=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;97;101;116;122;101;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 122;101;105;108;101;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 97;117;115;46;112;114;105;110;116;108;110;40;116;101;105;108;101;91;48;93;32;43;32;34;32;40;34;32;43;32;116;101;105;108;101;91;49;93;32;43;32;34;41;32;105;115;116;32;34;32;43;32;116;101;105;108;101;91;50;93;32;43;32;34;32;74;97;104;114;101;32;97;108;116;46;34;41; - - - 97;110;122;97;104;108;43;43; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;83;228;116;122;101;32;103;101;115;112;101;105;99;104;101;114;116;34; - - -`,FD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;97;101;116;122;101;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;101;115;101;114;46;99;108;111;115;101;40;41; - - - 97;117;115;46;99;108;111;115;101;40;41; - - -`,RD=` - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;34; - - - 118;101;114;105;102;105;99;97;114;73;100;97;100;101;40;41; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - -`,JD=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;109;97;105;111;114;32;100;101;32;105;100;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;109;101;110;111;114;32;100;101;32;105;100;97;100;101;34; - - - - -`,GD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;111;110;116;97;103;101;109;32;61;32;48; - - - 100;111;117;98;108;101;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;61;32;48; - - - 83;116;114;105;110;103;32;109;101;108;104;111;114;78;111;109;101;32;61;32;34;34; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;100;105;115;116;97;110;99;105;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 99;111;110;116;97;103;101;109;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;100;105;115;116;97;110;99;105;97; - - - 100;105;115;116;97;110;99;105;97;32;62;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97; - - - 109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;61;32;100;105;115;116;97;110;99;105;97; - - - 109;101;108;104;111;114;78;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;115;111;109;97;32;47;32;99;111;110;116;97;103;101;109; - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;99;105;112;97;110;116;101;115;58;32;34;32;43;32;99;111;110;116;97;103;101;109; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;58;32;34;32;43;32;109;101;100;105;97;32;43;32;34;32;109;34; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;118;101;110;99;101;100;111;114;46;116;120;116;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;86;101;110;99;101;100;111;114;58;32;34;32;43;32;109;101;108;104;111;114;78;111;109;101;32;43;32;34;32;40;34;32;43;32;109;101;108;104;111;114;68;105;115;116;97;110;99;105;97;32;43;32;34;32;109;41;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - -`,HD=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,VD=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;80;111;110;116;111;115;63;34; - - - 112;111;110;116;111;115;91;105;93;32;61;32;110;117;109;101;114;111; - - - - - 105;110;116;32;112;97;115;115;97;103;101;109;32;61;32;49; - 112;97;115;115;97;103;101;109;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 112;97;115;115;97;103;101;109;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104;32;45;32;112;97;115;115;97;103;101;109; - 105;43;43; - - - 112;111;110;116;111;115;91;105;93;32;60;32;112;111;110;116;111;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;112;111;110;116;111;115;91;105;93; - - - 112;111;110;116;111;115;91;105;93;32;61;32;112;111;110;116;111;115;91;105;32;43;32;49;93; - - - 112;111;110;116;111;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;108;117;103;97;114;32;61;32;105;32;43;32;49; - - - 111;117;116;112;117;116;58;32;108;117;103;97;114;32;43;32;34;46;32;34;32;43;32;112;111;110;116;111;115;91;105;93; - - - - -`,qD=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;116;101;105;114;111;34; - - - 83;116;114;105;110;103;32;98;105;110;97;114;105;111;32;61;32;34;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;110;117;109;101;114;111;32;37;32;50; - - - 98;105;110;97;114;105;111;32;61;32;114;101;115;116;111;32;43;32;98;105;110;97;114;105;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - - - 111;117;116;112;117;116;58;32;98;105;110;97;114;105;111; - - -`,UD=` - - - 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;81;117;101;32;112;97;108;97;118;114;97;32;40;115;243;32;109;97;105;250;115;99;117;108;97;115;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 99;104;97;114;32;90;32;61;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - 105;110;116;32;112;111;115;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;97;108;102;97;98;101;116;111;46;108;101;110;103;116;104; - 106;43;43; - - - 97;108;102;97;98;101;116;111;91;106;93;32;61;61;32;90; - - - 112;111;115;32;61;32;106; - - - - - 248; - - - - - - - 115;101;103;114;101;100;111;32;61;32;115;101;103;114;101;100;111;32;43;32;97;108;102;97;98;101;116;111;91;40;112;111;115;32;43;32;75;41;32;37;32;50;54;93; - - - - - 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; - - -`,QD=` - - - 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; - - -`,$D=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;81;117;101;32;112;97;108;97;118;114;97;32;40;115;243;32;109;97;105;250;115;99;117;108;97;115;41;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;105;103;111;32;61;32;40;105;110;116;41;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;105;103;111;32;61;32;40;99;111;100;105;103;111;32;45;32;54;53;32;43;32;75;41;32;37;32;50;54;32;43;32;54;53; - - - 115;101;103;114;101;100;111;32;61;32;115;101;103;114;101;100;111;32;43;32;40;99;104;97;114;41;32;99;111;100;105;103;111; - - - - - 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; - - -`,YD=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;34;81;117;97;108;32;233;32;111;32;116;101;120;116;111;32;99;105;102;114;97;100;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;75;32;34;68;101;115;108;111;99;97;114;32;113;117;97;110;116;97;115;32;112;111;115;105;231;245;101;115;63;34; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;101;103;114;101;100;111;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 105;110;116;32;99;111;100;105;103;111;32;61;32;40;105;110;116;41;32;115;101;103;114;101;100;111;46;99;104;97;114;65;116;40;105;41; - - - 99;111;100;105;103;111;32;61;32;40;99;111;100;105;103;111;32;45;32;54;53;32;45;32;75;32;43;32;50;54;41;32;37;32;50;54;32;43;32;54;53; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;40;99;104;97;114;41;32;99;111;100;105;103;111; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - -`,KD=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;112;97;115;115;111;115;32;61;32;48; - - - 110;117;109;101;114;111;32;33;61;32;49; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;51;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 112;97;115;115;111;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;80;97;115;115;111;115;58;32;34;32;43;32;112;97;115;115;111;115; - - -`,XD=` - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;97;115;32;110;111;116;97;115;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;113;117;97;110;116;105;100;97;100;101; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;110;111;116;97;34; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;111;116;97; - - - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;115;111;109;97;32;42;32;49;46;48;32;47;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;109;101;100;105;97; - - -`,eB=` - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;110;250;109;101;114;111;115;63;34; - - - 105;110;116;32;110;117;109;101;114;111;49;32;61;32;49; - - - 105;110;116;32;110;117;109;101;114;111;50;32;61;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;50; - - - 105;110;116;32;105;32;61;32;50; - 105;32;60;32;113;117;97;110;116;105;100;97;100;101; - 105;43;43; - - - 105;110;116;32;110;117;109;101;114;111;51;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;51; - - - 110;117;109;101;114;111;49;32;61;32;110;117;109;101;114;111;50; - - - 110;117;109;101;114;111;50;32;61;32;110;117;109;101;114;111;51; - - - - -`,tB=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;233;32;112;97;114;34; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;233;32;237;109;112;97;114;34; - - - - -`,nB=` - - - 99;111;110;115;116;32;100;111;117;98;108;101;32;73;86;65;32;61;32;48;46;50;51; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;99;111;83;101;109;73;118;97;32;34;80;114;101;231;111;32;115;101;109;32;73;86;65;63;34; - - - 100;111;117;98;108;101;32;105;109;112;111;115;116;111;32;61;32;112;114;101;99;111;83;101;109;73;118;97;32;42;32;73;86;65; - - - 100;111;117;98;108;101;32;112;114;101;99;111;67;111;109;73;118;97;32;61;32;112;114;101;99;111;83;101;109;73;118;97;32;43;32;105;109;112;111;115;116;111; - - - 111;117;116;112;117;116;58;32;105;109;112;111;115;116;111; - - - 111;117;116;112;117;116;58;32;112;114;101;99;111;67;111;109;73;118;97; - - -`,iB=` - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - 112;105;110;32;33;61;32;49;50;51;52;32;38;38;32;116;101;110;116;97;116;105;118;97;115;32;60;32;51; - - - 105;110;112;117;116;58;32;105;110;116;32;101;110;116;114;97;100;97;32;34;73;110;116;114;111;100;117;122;32;111;32;80;73;78;34; - - - 112;105;110;32;61;32;101;110;116;114;97;100;97; - - - 116;101;110;116;97;116;105;118;97;115;43;43; - - - - - 112;105;110;32;61;61;32;49;50;51;52; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;116;227;111;32;98;108;111;113;117;101;97;100;111;34; - - - - -`,aB=` - - - 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; - - - 105;110;116;32;112;105;110;32;61;32;48; - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - 112;105;110;32;33;61;32;80;73;78;32;38;38;32;116;101;110;116;97;116;105;118;97;115;32;60;32;51; - - - 105;110;112;117;116;58;32;112;105;110;32;34;73;110;116;114;111;100;117;122;32;111;32;80;73;78;34; - - - 116;101;110;116;97;116;105;118;97;115;43;43; - - - - - 112;105;110;32;61;61;32;80;73;78; - - - 111;117;116;112;117;116;58;32;34;80;73;78;32;99;111;114;114;101;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;97;114;116;227;111;32;98;108;111;113;117;101;97;100;111;34; - - - - -`,sB=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;49;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;50;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;100;111;114;32;34;79;112;101;114;97;100;111;114;32;40;43;44;32;45;32;111;117;32;42;41;34; - - - 111;112;101;114;97;100;111;114; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;45;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;49;32;42;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 111;117;116;112;117;116;58;32;34;79;112;101;114;97;100;111;114;32;100;101;115;99;111;110;104;101;99;105;100;111;34; - - - - -`,rB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;97;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;97;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;110;97;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;109;97;114;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 105;110;116;32;99;111;108;117;110;97;32;61;32;48; - 99;111;108;117;110;97;32;60;32;109;97;114;91;102;105;108;97;93;46;108;101;110;103;116;104; - 99;111;108;117;110;97;43;43; - - - 109;97;114;91;102;105;108;97;93;91;99;111;108;117;110;97;93; - - - 111;117;116;112;117;116;58;32;99;111;108;117;110;97;115;91;99;111;108;117;110;97;93;32;43;32;40;102;105;108;97;32;43;32;49;41; - - - - - 248; - - - - - - - - -`,oB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; - - - 109;97;114;91;48;93;91;49;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 109;97;114;91;48;93;91;51;93;32;61;32;116;114;117;101; - - - 109;97;114;91;50;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;51;93;91;52;93;32;61;32;116;114;117;101; - - - 109;97;114;91;52;93;91;48;93;32;61;32;116;114;117;101; - - - 83;116;114;105;110;103;91;93;32;99;111;108;117;110;97;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; - - -`,lB=` - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;97;116;111;32;34;81;117;101;32;112;114;97;116;111;63;32;40;49;44;32;50;32;111;117;32;51;41;34; - - - 112;114;97;116;111; - - - 111;117;116;112;117;116;58;32;34;83;97;108;97;100;97;32;103;114;101;103;97;34; - - - - - 111;117;116;112;117;116;58;32;34;66;97;99;97;108;104;97;117;32;224;32;66;114;225;115;34; - - - - - 111;117;116;112;117;116;58;32;34;87;114;97;112;32;100;101;32;102;97;108;97;102;101;108;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;101;32;117;109;32;110;250;109;101;114;111;32;118;225;108;105;100;111;34; - - - - -`,uB=` - - - 105;110;116;32;110;117;109;101;114;111;49;32;61;32;52; - - - 105;110;116;32;110;117;109;101;114;111;50;32;61;32;51; - - - 105;110;116;32;115;111;109;97;32;61;32;110;117;109;101;114;111;49;32;43;32;110;117;109;101;114;111;50; - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,mB=` - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;111;109;101;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;111;109;101;34; - - - - - 105;110;112;117;116;58;32;105;110;116;32;115;111;114;116;101;97;100;111;32;34;78;250;109;101;114;111;32;115;111;114;116;101;97;100;111;32;40;49;32;97;32;53;41;34; - - - 111;117;116;112;117;116;58;32;34;76;105;109;112;97;32;111;32;113;117;97;100;114;111;58;32;34;32;43;32;110;111;109;101;115;91;115;111;114;116;101;97;100;111;32;45;32;49;93; - - -`,cB=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;117;112;108;105;99;97;100;111;58;32;34;32;43;32;110;117;109;101;114;111; - - -`,dB=` - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;61;32;98;105;99;105;99;108;101;116;97;32;101;108;233;116;114;105;99;97;44;32;50;32;61;32;116;114;111;116;105;110;101;116;101;32;101;108;233;116;114;105;99;97;44;32;48;32;61;32;115;97;105;114;34; - - - 101;115;99;111;108;104;97;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - - -1; - - - - - 101;115;99;111;108;104;97;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;66;105;99;105;99;108;101;116;97;32;114;101;115;101;114;118;97;100;97;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;84;114;111;116;105;110;101;116;101;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;97;32;105;110;118;225;108;105;100;97;34; - - - - - - - - - - -`,hB=` - - - - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;61;32;98;105;99;105;99;108;101;116;97;32;101;108;233;116;114;105;99;97;44;32;50;32;61;32;116;114;111;116;105;110;101;116;101;32;101;108;233;116;114;105;99;97;44;32;48;32;61;32;115;97;105;114;34; - - - 101;115;99;111;108;104;97; - - - 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; - - - 83;97;105;114;32;100;111;32;109;101;110;117; - - - - - 111;117;116;112;117;116;58;32;34;66;105;99;105;99;108;101;116;97;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;84;114;111;116;105;110;101;116;101;32;114;101;115;101;114;118;97;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;104;97;32;105;110;118;225;108;105;100;97;34; - - - - - - -`,gB=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;99;101;114;116;97;115;32;61;32;48; - - - 105;110;116;32;99;111;110;116;97;103;101;109;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 111;117;116;112;117;116;58;32;34;67;111;109;111;32;115;101;32;100;105;122;32;34;32;43;32;112;97;114;116;101;115;91;48;93;32;43;32;34;32;101;109;32;105;110;103;108;234;115;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;114;101;115;112;111;115;116;97; - - - 99;111;110;116;97;103;101;109;43;43; - - - 114;101;115;112;111;115;116;97;46;101;113;117;97;108;115;40;112;97;114;116;101;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;34;67;101;114;116;111;33;34; - - - 99;101;114;116;97;115;43;43; - - - - - 111;117;116;112;117;116;58;32;34;69;114;114;97;100;111;44;32;233;32;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;46;34; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;99;101;114;116;97;115;32;43;32;34;32;100;101;32;34;32;43;32;99;111;110;116;97;103;101;109;32;43;32;34;32;99;101;114;116;97;115;34; - - -`,pB=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,fB=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;109;97;105;111;114;32;100;101;32;105;100;97;100;101;34; - - - - - 111;117;116;112;117;116;58;32;34;109;101;110;111;114;32;100;101;32;105;100;97;100;101;34; - - - - -`,bB=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - -`,xB=` - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - 105;110;116;32;109;97;116;101;109;97;116;105;99;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;109;97;116;101;109;97;116;105;99;97;32;43;32;34;32;97;32;77;97;116;101;109;225;116;105;99;97;34; - - -`,vB=` - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;123;92;34;110;111;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;101;115;112;101;99;105;101;92;34;58;32;92;34;99;97;98;114;97;92;34;44;32;92;34;105;100;97;100;101;92;34;58;32;54;125;44;34; - - - 105;110;116;32;105;110;105;99;105;111;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;110;111;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;102;105;109;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;105;110;105;99;105;111;41; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;108;105;110;104;97;46;115;117;98;115;116;114;105;110;103;40;105;110;105;99;105;111;44;32;102;105;109;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101; - - -`,wB=` - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - -`,yB=` - - - 105;110;116;91;93;91;93;32;116;97;98;101;108;97;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;97;98;101;108;97;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;116;97;98;101;108;97;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 116;97;98;101;108;97;91;105;93;91;106;93;32;61;32;40;105;32;43;32;49;41;32;42;32;40;106;32;43;32;49;41; - - - - - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;32;40;49;32;97;32;49;48;41;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;32;40;49;32;97;32;49;48;41;34; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;97;91;97;32;45;32;49;93;91;98;32;45;32;49;93; - - -`,zB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;116;32;108;105;118;114;101;115;32;61;32;48; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 105;110;116;32;108;117;103;97;114;32;61;32;48; - 108;117;103;97;114;32;60;32;108;117;103;97;114;101;115;91;102;105;108;97;93;46;108;101;110;103;116;104; - 108;117;103;97;114;43;43; - - - 33;108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 108;105;118;114;101;115;32;61;32;108;105;118;114;101;115;32;43;32;49; - - - - - 248; - - - - - - - - - 111;117;116;112;117;116;58;32;34;76;105;118;114;101;115;58;32;34;32;43;32;108;105;118;114;101;115; - - -`,IB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;48;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;50;93;91;51;93;32;61;32;116;114;117;101; - - -`,kB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;102;105;108;97;32;34;70;105;108;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;117;103;97;114;32;34;76;117;103;97;114;34; - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 111;117;116;112;117;116;58;32;34;74;225;32;118;101;110;100;105;100;111;34; - - - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;86;101;110;100;105;100;111;58;32;102;105;108;97;32;34;32;43;32;102;105;108;97;32;43;32;34;44;32;108;117;103;97;114;32;34;32;43;32;108;117;103;97;114; - - - - -`,SB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;51;93;32;61;32;116;114;117;101; - - - 105;110;112;117;116;58;32;105;110;116;32;102;105;108;97;32;34;70;105;108;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;117;103;97;114;32;34;76;117;103;97;114;34; - - -`,TB=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 105;110;116;32;102;105;108;97;32;61;32;48; - 102;105;108;97;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 102;105;108;97;43;43; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;34; - - - 105;110;116;32;108;117;103;97;114;32;61;32;48; - 108;117;103;97;114;32;60;32;108;117;103;97;114;101;115;91;102;105;108;97;93;46;108;101;110;103;116;104; - 108;117;103;97;114;43;43; - - - 108;117;103;97;114;101;115;91;102;105;108;97;93;91;108;117;103;97;114;93; - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;88;34; - - - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;79;34; - - - - - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - -`,_B=` - - - 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; - - - 108;117;103;97;114;101;115;91;48;93;91;50;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;49;93;32;61;32;116;114;117;101; - - - 108;117;103;97;114;101;115;91;49;93;91;50;93;32;61;32;116;114;117;101; - - - 111;117;116;112;117;116;58;32;34;70;105;108;97;115;58;32;34;32;43;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;76;117;103;97;114;101;115;32;112;111;114;32;102;105;108;97;58;32;34;32;43;32;108;117;103;97;114;101;115;91;48;93;46;108;101;110;103;116;104; - - - 111;117;116;112;117;116;58;32;34;70;105;108;97;32;49;44;32;108;117;103;97;114;32;50;32;118;101;110;100;105;100;111;63;32;34;32;43;32;108;117;103;97;114;101;115;91;49;93;91;50;93; - - -`,AB=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 105;110;116;32;78;117;109;101;114;111;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;78;117;109;101;114;111; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;97;100;111;58;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - -`,jB=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;52; - - - 105;110;116;32;78;117;109;101;114;111;32;61;32;54; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;78;85;77;69;82;79; - - - 111;117;116;112;117;116;58;32;34;82;101;115;117;108;116;97;100;111;58;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - -`,CB=` - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; - - -`,DB=` - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; - - -`,BB=` - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - -`,PB=` - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 115;121;115;116;101;109;46;111;117;116;46;112;114;105;110;116;108;110;40;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;73;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34;41; - - -`,OB=` - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;100;97;100;101;32;61;32;55; - - - 100;111;117;98;108;101;32;97;108;116;117;114;97;32;61;32;49;46;50; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; - - -`,MB=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;49; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - -`,ZB=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;51; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;52; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - -`,LB=` - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;52; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;51; - - -`,WB=` - - - 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; - - - 83;116;114;105;110;103;32;100;105;114;101;105;116;97;32;61;32;34;225;103;117;97;34; - - - 83;116;114;105;110;103;32;97;117;120;32;61;32;101;115;113;117;101;114;100;97; - - - 101;115;113;117;101;114;100;97;32;61;32;100;105;114;101;105;116;97; - - - 100;105;114;101;105;116;97;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;69;115;113;117;101;114;100;97;58;32;34;32;43;32;101;115;113;117;101;114;100;97; - - - 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; - - -`,EB=` - - - 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; - - - 83;116;114;105;110;103;32;100;105;114;101;105;116;97;32;61;32;34;225;103;117;97;34; - - - 111;117;116;112;117;116;58;32;34;69;115;113;117;101;114;100;97;58;32;34;32;43;32;101;115;113;117;101;114;100;97; - - - 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; - - -`,NB=` - - - 105;110;116;32;97;32;61;32;53; - - - 105;110;116;32;98;32;61;32;57; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,FB=` - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;52; - - - 100;111;117;98;108;101;32;97;108;116;117;114;97;32;61;32;49;46;54;50; - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;73;110;234;115;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;105;100;97;100;101;32;43;32;34;32;97;110;111;115;46;34; - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; - - -`,RB=` - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;49;51;53; - - - 105;110;116;32;104;111;114;97;115;32;61;32;109;105;110;117;116;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;109;105;110;117;116;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;104;111;114;97;115;32;43;32;34;32;104;111;114;97;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;109;105;110;117;116;111;115;34; - - -`,JB=` - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 100;111;117;98;108;101;32;112;114;101;99;111;32;61;32;50;46;53; - - - 100;111;117;98;108;101;32;112;114;101;99;111;84;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;112;114;101;99;111; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;112;114;101;99;111;84;111;116;97;108;32;43;32;34;32;101;117;114;111;115;34; - - -`,GB=` - - - 105;110;116;32;115;97;108;100;111;32;61;32;50;48; - - - 105;110;116;32;112;114;101;99;111;32;61;32;55; - - - 115;97;108;100;111;32;61;32;115;97;108;100;111;32;45;32;112;114;101;99;111; - - - 111;117;116;112;117;116;58;32;34;82;101;115;116;97;58;32;34;32;43;32;115;97;108;100;111; - - -`,HB=` - - - 105;110;116;32;115;97;108;100;111;32;61;32;50;48; - - - 105;110;116;32;112;114;101;99;111;32;61;32;55; - - - 111;117;116;112;117;116;58;32;34;82;101;115;116;97;58;32;34;32;43;32;115;97;108;100;111; - - - 115;97;108;100;111;32;61;32;115;97;108;100;111;32;45;32;112;114;101;99;111; - - -`,VB=` - - - 105;110;116;32;112;114;101;99;111;32;61;32;57; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;101;99;111;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,qB=` - - - 105;110;116;32;102;97;116;105;97;115;32;61;32;56; - - - 105;110;116;32;112;101;115;115;111;97;115;32;61;32;52; - - - 105;110;116;32;112;111;114;80;101;115;115;111;97;32;61;32;102;97;116;105;97;115;32;47;32;112;101;115;115;111;97;115; - - - 111;117;116;112;117;116;58;32;34;67;97;100;97;32;117;109;32;114;101;99;101;98;101;32;34;32;43;32;112;111;114;80;101;115;115;111;97;32;43;32;34;32;102;97;116;105;97;115;46;34; - - -`,UB=` - - - 105;110;116;32;102;97;116;105;97;115;32;61;32;56; - - - 105;110;116;32;112;101;115;115;111;97;115;32;61;32;52; - - - 105;110;116;32;112;111;114;80;101;115;115;111;97;32;61;32;102;97;116;105;97;115;32;47;32;112;101;115;115;111;97;115; - - - 111;117;116;112;117;116;58;32;34;67;97;100;97;32;117;109;32;114;101;99;101;98;101;32;34;32;43;32;112;111;114;112;101;115;115;111;97;32;43;32;34;32;102;97;116;105;97;115;46;34; - - -`,QB=` - - - 105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;61;32;55; - - - 105;110;116;32;108;97;114;103;117;114;97;32;61;32;52; - - - 105;110;116;32;97;114;101;97;32;61;32;99;111;109;112;114;105;109;101;110;116;111;32;42;32;108;97;114;103;117;114;97; - - - 105;110;116;32;112;101;114;105;109;101;116;114;111;32;61;32;50;32;42;32;40;99;111;109;112;114;105;109;101;110;116;111;32;43;32;108;97;114;103;117;114;97;41; - - - 111;117;116;112;117;116;58;32;34;193;114;101;97;58;32;34;32;43;32;97;114;101;97; - - - 111;117;116;112;117;116;58;32;34;80;101;114;237;109;101;116;114;111;58;32;34;32;43;32;112;101;114;105;109;101;116;114;111; - - -`,$B=` - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 105;110;116;32;109;105;110;117;116;111;115;32;61;32;115;101;103;117;110;100;111;115;32;47;32;54;48; - - - 105;110;116;32;114;101;115;116;111;32;61;32;115;101;103;117;110;100;111;115;32;37;32;54;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; - - -`,YB=` - - - 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; - - - 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; - - -`,KB=` - - - 105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;61;32;53; - - - 105;110;116;32;108;97;114;103;117;114;97;32;61;32;51; - - - 105;110;116;32;97;114;101;97;32;61;32;99;111;109;112;114;105;109;101;110;116;111;32;42;32;108;97;114;103;117;114;97; - - - 111;117;116;112;117;116;58;32;97;114;101;97; - - -`,XB=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;67;111;109;111;32;116;101;32;99;104;97;109;97;115;63;34; - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101;32;43;32;34;33;34; - - -`,eP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,tP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;40;97;32;43;32;98;41; - - -`,nP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;97;32;43;32;98; - - -`,iP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;243;120;105;109;111;32;97;110;111;32;116;101;110;115;32;34;32;43;32;40;105;100;97;100;101;32;43;32;49;41; - - -`,aP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;243;120;105;109;111;32;97;110;111;32;116;101;110;115;32;34;32;43;32;40;73;100;97;100;101;32;43;32;49;41; - - -`,sP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;111;115;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;110;116;32;100;105;97;115;32;61;32;97;110;111;115;32;42;32;51;54;53; - - - 111;117;116;112;117;116;58;32;34;83;227;111;32;99;101;114;99;97;32;100;101;32;34;32;43;32;100;105;97;115;32;43;32;34;32;100;105;97;115;46;34; - - -`,rP=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;121;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 100;111;117;98;108;101;32;109;101;100;105;97;32;61;32;40;120;32;43;32;121;41;32;47;32;50; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;58;32;34;32;43;32;109;101;100;105;97; - - -`,oP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 105;110;116;32;112;114;111;100;117;116;111;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;80;114;111;100;117;116;111;58;32;34;32;43;32;112;114;111;100;117;116;111; - - -`,lP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;201;115;32;109;97;105;111;114;32;100;101;32;105;100;97;100;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;105;110;100;97;32;110;227;111;32;233;115;32;109;97;105;111;114;32;100;101;32;105;100;97;100;101;46;34; - - - - -`,uP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111;32;60;32;48; - - - 110;117;109;101;114;111;32;61;32;48;32;45;32;110;117;109;101;114;111; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - -`,mP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;112;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;237;109;112;97;114;34; - - - - -`,cP=` - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;53; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;45;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - -`,dP=` - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;53; - - - 112;111;110;116;111;115;32;61;32;51; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - -`,hP=` - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;49;48; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;98;111;110;117;115; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - -`,gP=` - - - 105;110;116;32;112;111;110;116;111;115;32;61;32;49;48; - - - 112;111;110;116;111;115;32;61;32;112;111;110;116;111;115;32;43;32;98;111;110;117;115; - - - 105;110;116;32;98;111;110;117;115;32;61;32;53; - - - 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; - - -`,pP=` - - - 105;110;116;32;112;114;101;99;111;32;61;32;56; - - - 105;110;116;32;113;117;101;105;106;111;32;61;32;50; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;40;112;114;101;99;111;32;43;32;113;117;101;105;106;111;41;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,fP=` - - - 105;110;116;32;112;114;101;99;111;32;61;32;56; - - - 105;110;116;32;113;117;101;105;106;111;32;61;32;50; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; - - - 105;110;116;32;116;111;116;97;108;32;61;32;112;114;101;99;111;32;43;32;113;117;101;105;106;111;32;42;32;113;117;97;110;116;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,bP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 97;32;62;32;98; - - - 111;117;116;112;117;116;58;32;97; - - - - - 111;117;116;112;117;116;58;32;98; - - - - -`,xP=` - - - 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;99;111;32;34;80;114;101;231;111;32;101;109;32;101;117;114;111;115;63;34; - - - 112;114;101;99;111;32;62;32;53;48; - - - 112;114;101;99;111;32;61;32;112;114;101;99;111;32;45;32;53; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;65;32;112;97;103;97;114;58;32;34;32;43;32;112;114;101;99;111;32;43;32;34;32;101;117;114;111;115;34; - - -`,vP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; - - - 110;111;116;97;32;62;61;32;49;32;38;38;32;110;111;116;97;32;60;61;32;53; - - - 111;117;116;112;117;116;58;32;34;118;225;108;105;100;97;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;118;225;108;105;100;97;34; - - - - -`,wP=` - - - 105;110;112;117;116;58;32;105;110;116;32;112;111;110;116;111;115;32;34;81;117;97;110;116;111;115;32;112;111;110;116;111;115;63;34; - - - 112;111;110;116;111;115;32;62;61;32;53;48; - - - 111;117;116;112;117;116;58;32;34;97;112;114;111;118;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;114;101;112;114;111;118;97;100;111;34; - - - - -`,yP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - -`,zP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;61;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 111;117;116;112;117;116;58;32;34;52;32;101;117;114;111;115;34; - - - - -`,IP=` - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;53; - - - 105;100;97;100;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;32;101;110;116;114;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;112;111;100;101;32;101;110;116;114;97;114;34; - - - - -`,kP=` - - - 105;110;116;32;105;100;97;100;101;32;61;32;49;53; - - - 73;100;97;100;101;32;62;61;32;49;54; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;32;101;110;116;114;97;114;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;112;111;100;101;32;101;110;116;114;97;114;34; - - - - -`,SP=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;50;32;38;38;32;105;100;97;100;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;106;111;118;101;109;34; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;32;98;105;108;104;101;116;101;32;106;111;118;101;109;34; - - - - -`,TP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; - - - 110;111;116;97;32;60;32;49;32;124;124;32;110;111;116;97;32;62;32;53; - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;110;111;116;97;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;32;110;111;116;97;32;34;32;43;32;110;111;116;97;32;43;32;34;32;233;32;118;225;108;105;100;97;46;34; - - - - -`,_P=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;111;32;34;65;110;111;63;34; - - - 40;97;110;111;32;37;32;52;32;61;61;32;48;32;38;38;32;97;110;111;32;37;32;49;48;48;32;33;61;32;48;41;32;124;124;32;97;110;111;32;37;32;52;48;48;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;34;65;110;111;32;98;105;115;115;101;120;116;111;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;233;32;97;110;111;32;98;105;115;115;101;120;116;111;34; - - - - -`,AP=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;68;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;70;105;109;32;100;101;32;115;101;109;97;110;97;34; - - - - - 111;117;116;112;117;116;58;32;34;68;105;97;32;250;116;105;108;34; - - - - -`,jP=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;114;32;34;68;101;32;113;117;101;32;99;111;114;32;101;115;116;225;32;111;32;115;101;109;225;102;111;114;111;63;34; - - - 99;111;114; - - - 111;117;116;112;117;116;58;32;34;80;97;114;97;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;112;101;114;97;34; - - - - - 111;117;116;112;117;116;58;32;34;65;118;97;110;231;97;34; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;99;111;110;104;101;231;111;32;101;115;116;97;32;99;111;114;46;34; - - - - -`,CP=` - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; - - - 101;115;99;111;108;104;97; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;97;32;116;117;97;32;225;103;117;97;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;115;117;109;111;46;34; - - - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;101;32;98;111;116;227;111;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - -`,DP=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - -`,BP=` - - - 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; - - - 100;105;97;32;61;61;32;54;32;38;38;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - -`,PP=` - - - 105;110;116;32;100;105;97;32;61;32;55; - - - 100;105;97;32;61;61;32;54;32;124;124;32;100;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - -`,OP=` - - - 105;110;116;32;100;105;97;32;61;32;55; - - - 100;105;97;32;61;61;32;54;32;124;124;32;68;105;97;32;61;61;32;55; - - - 111;117;116;112;117;116;58;32;34;115;101;109;32;101;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;101;115;99;111;108;97;34; - - - - -`,MP=` - - - 105;110;112;117;116;58;32;105;110;116;32;104;111;114;97;32;34;81;117;101;32;104;111;114;97;115;32;115;227;111;32;40;115;243;32;97;32;104;111;114;97;41;63;34; - - - 104;111;114;97;32;62;61;32;56;32;38;38;32;104;111;114;97;32;60;61;32;49;53; - - - 111;117;116;112;117;116;58;32;34;69;115;99;111;108;97;34; - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;111;32;108;105;118;114;101;34; - - - - -`,ZP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;81;117;101;32;110;111;116;97;63;34; - - - 110;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;105;110;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;105;110;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;115;117;102;105;99;105;101;110;116;101;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;78;111;116;97;32;105;110;118;225;108;105;100;97;34; - - - - -`,LP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;111;112;101;114;97;100;111;114;32;34;79;112;101;114;97;100;111;114;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;48; - - - 111;112;101;114;97;100;111;114; - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;45;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 114;101;115;117;108;116;97;100;111;32;61;32;97;32;42;32;98; - - - 111;117;116;112;117;116;58;32;114;101;115;117;108;116;97;100;111; - - - - - 111;117;116;112;117;116;58;32;34;79;112;101;114;97;100;111;114;32;100;101;115;99;111;110;104;101;99;105;100;111;34; - - - - -`,WP=` - - - 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; - - - 101;115;99;111;108;104;97;32;61;61;32;49; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;97;32;116;117;97;32;225;103;117;97;46;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;50; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;115;117;109;111;46;34; - - - - - 101;115;99;111;108;104;97;32;61;61;32;51; - - - 111;117;116;112;117;116;58;32;34;65;113;117;105;32;101;115;116;225;32;111;32;116;101;117;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;46;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;101;32;98;111;116;227;111;32;110;227;111;32;101;120;105;115;116;101;46;34; - - - - - - - - -`,EP=` - - - 80;244;114;32;117;109;97;32;99;104;225;118;101;110;97;32;110;97;32;109;101;115;97; - - - 81;117;101;114;32;97;231;250;99;97;114;63; - - - 74;117;110;116;97;114;32;97;231;250;99;97;114; - - - - - 248; - - - - - 67;104;225;32;97;105;110;100;97;32;100;101;109;97;115;105;97;100;111;32;113;117;101;110;116;101; - - - 69;115;112;101;114;97;114;32;49;32;109;105;110;117;116;111; - - - - - 66;101;98;101;114;32;111;32;99;104;225; - - -`,NP=` - - - 76;101;118;97;110;116;97;114; - - - 76;97;118;97;114;32;111;115;32;100;101;110;116;101;115; - - - 86;101;115;116;105;114; - - - 84;111;109;97;114;32;111;32;112;101;113;117;101;110;111;45;97;108;109;111;231;111; - - -`,FP=` - - - 69;110;99;104;101;114;32;97;32;99;104;97;108;101;105;114;97;32;99;111;109;32;225;103;117;97; - - - 76;105;103;97;114;32;97;32;99;104;97;108;101;105;114;97; - - - 80;244;114;32;117;109;97;32;115;97;113;117;101;116;97;32;100;101;32;99;104;225;32;110;97;32;99;104;225;118;101;110;97; - - - 68;101;105;116;97;114;32;225;103;117;97;32;113;117;101;110;116;101;32;110;97;32;99;104;225;118;101;110;97; - - - 69;115;112;101;114;97;114;32;51;32;109;105;110;117;116;111;115; - - - 84;105;114;97;114;32;97;32;115;97;113;117;101;116;97;32;100;101;32;99;104;225; - - -`,RP=` - - - 69;115;116;225;32;97;32;99;104;111;118;101;114;63; - - - 76;101;118;97;114;32;103;117;97;114;100;97;45;99;104;117;118;97; - - - - - 76;101;118;97;114;32;243;99;117;108;111;115;32;100;101;32;115;111;108; - - - - - 83;97;105;114; - - -`,JP=` - - - 80;114;97;116;111;32;110;227;111;32;118;97;122;105;111; - - - 68;97;114;32;117;109;97;32;103;97;114;102;97;100;97; - - - - - 76;101;118;97;110;116;97;114;32;111;32;112;114;97;116;111; - - -`,GP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;110;116;97;114;32;97;116;233;63;34; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,HP=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - -`,VP=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - -`,qP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;116;111;114;105;97;108;32;100;101;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;102;97;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;110; - - - 102;97;116;111;114;105;97;108;32;61;32;102;97;116;111;114;105;97;108;32;42;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;116;111;114;105;97;108; - - -`,UP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;111;112;99;97;111;32;34;49;32;109;97;105;115;44;32;50;32;109;101;110;111;115;44;32;51;32;118;101;122;101;115;63;34; - - - 111;112;99;97;111; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;45;32;98; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;120;105;115;116;101;34; - - - - -`,QP=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;111;112;99;97;111;32;34;49;32;109;97;105;115;44;32;50;32;109;101;110;111;115;44;32;51;32;118;101;122;101;115;63;34; - - - 111;112;99;97;111; - - - 111;117;116;112;117;116;58;32;97;32;43;32;98; - - - - - 111;117;116;112;117;116;58;32;98;32;45;32;97; - - - - - 111;117;116;112;117;116;58;32;97;32;42;32;98; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;120;105;115;116;101;34; - - - - -`,$P=` - - - 105;110;116;32;110;111;116;97;32;61;32;50; - - - 110;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;99;111;110;116;105;110;117;97;32;97;32;112;114;97;116;105;99;97;114;34; - - - - -`,YP=` - - - 105;110;116;32;110;111;116;97;32;61;32;50; - - - 78;111;116;97; - - - 111;117;116;112;117;116;58;32;34;109;117;105;116;111;32;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;98;111;109;34; - - - - - 111;117;116;112;117;116;58;32;34;99;111;110;116;105;110;117;97;32;97;32;112;114;97;116;105;99;97;114;34; - - - - -`,KP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; - - - 110;117;109;101;114;111; - - - 111;117;116;112;117;116;58;32;34;117;109;34; - - - - - 111;117;116;112;117;116;58;32;34;100;111;105;115;34; - - - - - 111;117;116;112;117;116;58;32;34;116;114;234;115;34; - - - - - 111;117;116;112;117;116;58;32;34;110;227;111;32;99;111;110;104;101;231;111;34; - - - - -`,XP=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;112;97;115;115;111;115;32;61;32;48; - - - 110;117;109;101;114;111;32;60;32;49;48;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 112;97;115;115;111;115;32;61;32;112;97;115;115;111;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;112;97;115;115;111;115; - - -`,eO=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;48; - - - 110;117;109;101;114;111;32;60;32;49;32;124;124;32;110;117;109;101;114;111;32;62;32;49;48; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;100;101;32;49;32;97;32;49;48;34; - - - - - 111;117;116;112;117;116;58;32;34;79;98;114;105;103;97;100;111;33;34; - - -`,tO=` - - - 105;110;116;32;105;32;61;32;49;48; - - - 105;32;60;32;53; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - -`,nO=` - - - 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; - - - 105;110;116;32;100;105;110;104;101;105;114;111;32;61;32;48; - - - 105;110;116;32;115;101;109;97;110;97;115;32;61;32;48; - - - 100;105;110;104;101;105;114;111;32;60;32;111;98;106;101;116;105;118;111; - - - 100;105;110;104;101;105;114;111;32;61;32;100;105;110;104;101;105;114;111;32;43;32;53; - - - 115;101;109;97;110;97;115;32;61;32;115;101;109;97;110;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; - - -`,iO=` - - - 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; - - - 105;110;116;32;100;105;110;104;101;105;114;111;32;61;32;48; - - - 105;110;116;32;115;101;109;97;110;97;115;32;61;32;48; - - - 100;105;110;104;101;105;114;111;32;60;61;32;111;98;106;101;116;105;118;111; - - - 100;105;110;104;101;105;114;111;32;61;32;100;105;110;104;101;105;114;111;32;43;32;53; - - - 115;101;109;97;110;97;115;32;61;32;115;101;109;97;110;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; - - -`,aO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;111;110;100;101;63;34; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;50; - - - 110;117;109;101;114;111;32;60;61;32;110; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;50; - - - - -`,sO=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - -`,rO=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;51; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;78;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; - - -`,oO=` - - - 105;110;116;32;110;111;116;97;32;61;32;48; - - - 110;111;116;97;32;60;32;49;32;124;124;32;110;111;116;97;32;62;32;53; - - - 105;110;112;117;116;58;32;110;111;116;97;32;34;78;111;116;97;32;100;101;32;49;32;97;32;53;34; - - - - - 111;117;116;112;117;116;58;32;34;65;32;116;117;97;32;110;111;116;97;58;32;34;32;43;32;110;111;116;97; - - -`,lO=` - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;48; - - - 110;117;109;101;114;111;32;33;61;32;48; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;40;48;32;116;101;114;109;105;110;97;41;34; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,uO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;110; - 105;32;62;61;32;49; - 105;45;45; - - - 111;117;116;112;117;116;58;32;105; - - - - - 111;117;116;112;117;116;58;32;34;74;225;33;34; - - -`,mO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;110;116;32;112;114;111;100;117;116;111;32;61;32;110;117;109;101;114;111;32;42;32;105; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;32;120;32;34;32;43;32;105;32;43;32;34;32;61;32;34;32;43;32;112;114;111;100;117;116;111; - - - - -`,cO=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,dO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - -`,hO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;49; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;47;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - -`,gO=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;101;32;61;32;50;48; - - - 110;117;109;101;114;111;32;60;32;108;105;109;105;116;101; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - - -`,pO=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 105;110;116;32;108;105;109;105;116;101;32;61;32;50;48; - - - 110;117;109;101;114;111;32;60;32;76;105;109;105;116;101; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - - -`,fO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;60;32;49;48;48; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;42;32;50; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - - -`,bO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,xO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;97;115;32;108;105;110;104;97;115;63;34; - - - 105;110;116;32;108;105;110;104;97;32;61;32;49; - 108;105;110;104;97;32;60;61;32;110; - 108;105;110;104;97;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;101;115;116;114;101;108;97;32;61;32;49; - 101;115;116;114;101;108;97;32;60;61;32;108;105;110;104;97; - 101;115;116;114;101;108;97;43;43; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - - - -`,vO=` - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 110;117;109;101;114;111;32;37;32;50;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; - - -`,wO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; - - -`,yO=` - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;116;97;98;117;97;100;97;32;42;32;105; - - - - -`,zO=` - - - 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;49;48; - 105;43;43; - - - 111;117;116;112;117;116;58;32;116;97;98;117;97;100;97;32;42;32;105; - - - - -`,IO=` - - - 105;110;116;32;97;108;116;117;114;97;32;61;32;48; - - - 105;110;116;32;100;101;103;114;97;117;32;61;32;49; - 100;101;103;114;97;117;32;60;61;32;53; - 100;101;103;114;97;117;43;43; - - - 97;108;116;117;114;97;32;61;32;97;108;116;117;114;97;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;99;109;34; - - -`,kO=` - - - 105;110;116;32;100;101;103;114;97;117;32;61;32;49; - 100;101;103;114;97;117;32;60;61;32;53; - 100;101;103;114;97;117;43;43; - - - 97;108;116;117;114;97;32;61;32;97;108;116;117;114;97;32;43;32;50;48; - - - - - 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;99;109;34; - - -`,SO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;42;32;105; - - - - -`,TO=` - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;114;103;117;114;97;32;34;76;97;114;103;117;114;97;34; - - - 105;110;112;117;116;58;32;105;110;116;32;97;108;116;117;114;97;32;34;65;108;116;117;114;97;34; - - - 105;110;116;32;108;105;110;104;97;32;61;32;49; - 108;105;110;104;97;32;60;61;32;97;108;116;117;114;97; - 108;105;110;104;97;43;43; - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;34;34; - - - 105;110;116;32;99;111;108;117;110;97;32;61;32;49; - 99;111;108;117;110;97;32;60;61;32;108;97;114;103;117;114;97; - 99;111;108;117;110;97;43;43; - - - 116;101;120;116;111;32;61;32;116;101;120;116;111;32;43;32;34;35;34; - - - - - 111;117;116;112;117;116;58;32;116;101;120;116;111; - - - - -`,_O=` - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93; - - - - -`,AO=` - - - 105;110;116;91;93;32;118;97;108;111;114;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;91;48;93; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;91;118;97;108;111;114;101;115;46;108;101;110;103;116;104;32;45;32;49;93; - - - 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;46;108;101;110;103;116;104; - - -`,jO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - -`,CO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 105;32;37;32;51;32;61;61;32;48; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - - - -`,DO=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - - - 248; - - - - - - -`,BO=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;49;48; - 105;43;43; - - - 105;32;37;32;50;32;61;61;32;48; - - - 111;117;116;112;117;116;58;32;73; - - - - - 248; - - - - - - -`,PO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;111;115;32;100;101;103;114;97;117;115;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;34; - - - 105;110;116;32;106;32;61;32;49; - 106;32;60;61;32;105; - 106;43;43; - - - 108;105;110;104;97;32;61;32;108;105;110;104;97;32;43;32;34;42;34; - - - - - 111;117;116;112;117;116;58;32;108;105;110;104;97; - - - - -`,OO=` - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;111;109;101;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;111;109;101;34; - - - - - 111;117;116;112;117;116;58;32;34;80;114;105;109;101;105;114;111;32;110;111;109;101;58;32;34;32;43;32;110;111;109;101;115;91;48;93; - - -`,MO=` - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;52;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - - - 105;110;116;32;105;32;61;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93; - - - - -`,ZO=` - - - 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;110;117;109;101;114;111;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;117;109;101;114;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111;115;91;105;93; - - - 110;117;109;101;114;111;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;110;117;109;101;114;111;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; - - -`,LO=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;109;97;120;32;61;32;112;111;110;116;111;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - 112;111;110;116;111;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;112;111;110;116;111;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - - 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; - - -`,WO=` - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - 110;117;109;101;114;111;32;33;61;32;48; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - 105;110;112;117;116;58;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,EO=` - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;40;48;32;61;32;112;97;114;97;114;41;34; - - - 110;117;109;101;114;111;32;61;61;32;48; - - - 83;97;105;114;32;100;111;32;99;105;99;108;111; - - - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;117;109;101;114;111; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,NO=` - - - 105;110;112;117;116;58;32;105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;34;67;111;109;112;114;105;109;101;110;116;111;63;34; - - - 105;110;112;117;116;58;32;105;110;116;32;108;97;114;103;117;114;97;32;34;76;97;114;103;117;114;97;63;34; - - - 105;110;116;32;102;32;61;32;97;114;101;97;40;99;111;109;112;114;105;109;101;110;116;111;44;32;108;97;114;103;117;114;97;41; - - - 111;117;116;112;117;116;58;32;34;193;114;101;97;58;32;34;32;43;32;102; - - -`,FO=` - - - 109;111;115;116;114;97;114;66;111;97;115;86;105;110;100;97;115;40;41; - - - 102;97;122;101;114;80;101;114;103;117;110;116;97;115;40;41; - - - 109;111;115;116;114;97;114;82;101;115;117;108;116;97;100;111;40;41; - - -`,RO=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;48;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;97;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; - - -`,JO=` - - - 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;109;112;101;114;97;116;117;114;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 116;101;109;112;101;114;97;116;117;114;97;115;91;105;93;32;62;32;109;97;120; - - - 109;97;120;32;61;32;116;101;109;112;101;114;97;116;117;114;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; - - -`,GO=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,HO=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;52;44;32;55;44;32;50;44;32;53;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;76;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,VO=` - - - 105;110;116;91;93;32;110;111;116;97;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;110;111;116;97;115;91;105;93; - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,qO=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;113;32;61;32;113;117;97;100;114;97;100;111;40;110;117;109;101;114;111;41; - - - 111;117;116;112;117;116;58;32;34;79;32;113;117;97;100;114;97;100;111;32;233;32;34;32;43;32;113; - - -`,UO=` - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;120;32;42;32;120; - - - 114;101;116;117;114;110;32;114;101;115;117;108;116;97;100;111; - - -`,QO=` - - - 109;111;115;116;114;97;114;84;105;116;117;108;111;40;41; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;67;111;109;111;32;116;101;32;99;104;97;109;97;115;63;34; - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101; - - -`,$O=` - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;32;97;111;32;113;117;105;122;33;34; - - - 111;117;116;112;117;116;58;32;34;86;97;105;115;32;116;101;114;32;116;114;234;115;32;112;101;114;103;117;110;116;97;115;46;34; - - -`,YO=` - - - 109;111;115;116;114;97;114;83;111;109;97;40;51;44;32;52;41; - - - 105;110;116;32;120;32;61;32;49;48; - - - 109;111;115;116;114;97;114;83;111;109;97;40;120;44;32;120;32;43;32;49;41; - - -`,KO=` - - - 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; - - - 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;111;109;97; - - -`,XO=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;105;110;105;99;105;111; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;45;32;49; - - - - - 111;117;116;112;117;116;58;32;34;74;225;33;34; - - -`,eM=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; - - - 105;110;116;32;105;32;61;32;105;110;105;99;105;111; - - - 105;32;62;32;48; - - - 111;117;116;112;117;116;58;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;74;225;34; - - -`,tM=` - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;49;93;91;106;93; - - - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; - - -`,nM=` - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;49;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;106;93;91;49;93; - - - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; - - -`,iM=` - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;44;32;114;111;110;100;97;32;49;58;32;34;32;43;32;112;111;110;116;111;115;91;49;93;91;48;93; - - -`,aM=` - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;50;125;125; - - - 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;44;32;114;111;110;100;97;32;49;58;32;34;32;43;32;80;111;110;116;111;115;91;49;93;91;48;93; - - -`,sM=` - - - 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;112;111;110;116;111;115;91;105;93;46;108;101;110;103;116;104; - 106;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;111;110;116;111;115;91;105;93;91;106;93; - - - - - - - 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; - - -`,rM=` - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - - - 105;32;60;61;32;51; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,oM=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,lM=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;110; - 105;43;43; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;105; - - - - - 111;117;116;112;117;116;58;32;115;111;109;97; - - -`,uM=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;51; - 105;43;43; - - - 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;110;117;109;101;114;111;32;42;32;105; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;32;118;101;122;101;115;32;34;32;43;32;110;117;109;101;114;111;32;43;32;34;32;61;32;34;32;43;32;114;101;115;117;108;116;97;100;111; - - - - - 110;117;109;101;114;111;32;62;32;49;48; - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;102;111;105;32;100;105;102;237;99;105;108;33;34; - - - - - 111;117;116;112;117;116;58;32;34;69;115;116;97;32;102;111;105;32;102;225;99;105;108;46;34; - - - - -`,mM=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; - - - 105;110;116;32;102;97;116;111;114;105;97;108;32;61;32;49; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;110; - 105;43;43; - - - 102;97;116;111;114;105;97;108;32;61;32;102;97;116;111;114;105;97;108;32;42;32;105; - - - - - 111;117;116;112;117;116;58;32;102;97;116;111;114;105;97;108; - - -`,cM=` - - - 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;99;97;114;116;97;46;115;112;108;105;116;40;34;92;110;34;41; - - - 111;117;116;112;117;116;58;32;34;76;105;110;104;97;115;58;32;34;32;43;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;104;97;115;91;105;93;46;99;111;110;116;97;105;110;115;40;34;114;97;112;111;115;97;34;41; - - - 111;117;116;112;117;116;58;32;34;82;97;112;111;115;97;32;110;97;32;108;105;110;104;97;32;34;32;43;32;40;105;32;43;32;49;41; - - - - - 248; - - - - - - -`,dM=` - - - 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; - - -`,hM=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;63;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,gM=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;63;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; - - -`,pM=` - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;32;116;101;109;32;34;32;43;32;110;111;109;101;46;108;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;114;97;115;34; - - -`,fM=` - - - 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;97;116;40;48;41;32;43;32;34;32;116;101;109;32;34;32;43;32;110;111;109;101;46;76;101;110;103;116;104;40;41;32;43;32;34;32;108;101;116;114;97;115;34; - - -`,bM=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;34;80;97;108;97;118;114;97;45;112;97;115;115;101;63;34; - - - 101;110;116;114;97;100;97;46;101;113;117;97;108;115;40;34;76;117;100;119;105;103;34;41; - - - 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;33;34; - - - - - 111;117;116;112;117;116;58;32;34;80;97;108;97;118;114;97;45;112;97;115;115;101;32;101;114;114;97;100;97;34; - - - - -`,xM=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;60;32;54; - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;103;114;97;116;117;105;116;97;34; - - - - - 105;100;97;100;101;32;60;32;49;56; - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;100;101;32;99;114;105;97;110;231;97;58;32;52;32;101;117;114;111;115;34; - - - - - 111;117;116;112;117;116;58;32;34;66;105;108;104;101;116;101;32;100;101;32;97;100;117;108;116;111;58;32;56;32;101;117;114;111;115;34; - - - - - - -`,vM=` - - - 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;63;34; - - - 110;117;109;101;114;111;32;62;32;48; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111; - - - 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;45;32;51; - - - - - 111;117;116;112;117;116;58;32;34;70;105;109;34; - - -`,wM=` - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;97;108;112;105;116;101;32;34;79;32;116;101;117;32;112;97;108;112;105;116;101;63;34; - - - 116;101;110;116;97;116;105;118;97;115;32;61;32;116;101;110;116;97;116;105;118;97;115;32;43;32;49; - - - 112;97;108;112;105;116;101;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; - - -`,yM=` - - - 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;97;108;112;105;116;101;32;34;79;32;116;101;117;32;112;97;108;112;105;116;101;63;34; - - - 112;97;108;112;105;116;101;32;61;61;32;55; - - - -1; - - - - - 248; - - - - - 116;101;110;116;97;116;105;118;97;115;32;61;32;116;101;110;116;97;116;105;118;97;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; - - -`,zM=` - - - 105;110;116;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;97;114;116;105;103;111;115;32;61;32;48; - - - -1; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;101;99;111;32;34;80;114;101;231;111;63;32;40;48;32;61;32;102;105;109;41;34; - - - 112;114;101;99;111;32;61;61;32;48; - - - -1; - - - - - 248; - - - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;112;114;101;99;111; - - - 97;114;116;105;103;111;115;32;61;32;97;114;116;105;103;111;115;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;65;114;116;105;103;111;115;58;32;34;32;43;32;97;114;116;105;103;111;115; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;111;109;97; - - -`,IM=` - - - 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; - - - 105;100;97;100;101;32;62;61;32;49;56; - - - 111;117;116;112;117;116;58;32;34;80;111;100;101;115;32;118;111;116;97;114;46;34; - - - - - 105;110;116;32;97;110;111;115;32;61;32;49;56;32;45;32;105;100;97;100;101; - - - 111;117;116;112;117;116;58;32;34;69;115;112;101;114;97;32;109;97;105;115;32;34;32;43;32;97;110;111;115;32;43;32;34;32;97;110;111;115;46;34; - - - - -`,kM=` - - - 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;101;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;61;32;108;105;109;105;116;101; - 105;32;61;32;105;32;43;32;50; - - - 111;117;116;112;117;116;58;32;105; - - - - -`,SM=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - -`,TM=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - -`,_M=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;112;114;111;99;117;114;97;100;97;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - -`,AM=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;116;32;112;114;111;99;117;114;97;100;97;32;61;32;49;49; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;80;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - -`,jM=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - -`,CM=` - - - 111;117;116;112;117;116;58;32;34;66;111;109;32;100;105;97;34; - - - 111;117;116;112;117;116;58;32;34;72;111;106;101;32;97;112;114;101;110;100;101;109;111;115;32;101;115;116;114;117;116;111;103;114;97;109;97;115;46;34; - - -`,DM=` - - - 111;117;116;112;117;116;58;32;34;79;108;225;32;77;117;110;100;111;34; - - -`,BM=` - - - 111;117;116;112;117;116;58;32;34;79;108;225;34; - - - 111;117;116;112;117;116;58;32;34;69;115;116;111;117;32;97;32;97;112;114;101;110;100;101;114;32;101;115;116;114;117;116;111;103;114;97;109;97;115;34; - - -`,PM=` - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;99;111;109;112;114;97;115;45;110;111;118;97;46;116;120;116;34;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;108;105;110;104;97;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;66;111;108;111;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;108;105;110;104;97;115;32;103;117;97;114;100;97;100;97;115;34; - - -`,OM=` - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;99;111;109;112;114;97;115;45;110;111;118;97;46;116;120;116;34;41; - - -`,MM=` - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;49; - - - 102;105;99;104;101;105;114;111;46;104;97;115;78;101;120;116;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;102;105;99;104;101;105;114;111;46;110;101;120;116;76;105;110;101;40;41; - - - 111;117;116;112;117;116;58;32;110;117;109;101;114;111;32;43;32;34;46;32;34;32;43;32;108;105;110;104;97; - - - 110;117;109;101;114;111;43;43; - - - - - 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; - - -`,ZM=` - - - 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; - - -`,LM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 108;105;110;104;97;46;99;111;110;116;97;105;110;115;40;34;82;97;112;111;115;97;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;82;97;112;111;115;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - -`,WM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,EM=` - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 83;116;114;105;110;103;32;109;97;105;115;76;111;110;103;97;32;61;32;108;105;110;104;97;115;91;48;93; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;105;110;104;97;115;91;105;93;46;108;101;110;103;116;104;40;41;32;62;32;109;97;105;115;76;111;110;103;97;46;108;101;110;103;116;104;40;41; - - - 109;97;105;115;76;111;110;103;97;32;61;32;108;105;110;104;97;115;91;105;93; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;109;97;105;115;32;108;111;110;103;97;58;32;34;32;43;32;109;97;105;115;76;111;110;103;97; - - -`,NM=` - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - -`,FM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 83;116;114;105;110;103;32;109;101;108;104;111;114;78;111;109;101;32;61;32;34;34; - - - 105;110;116;32;109;101;108;104;111;114;78;111;116;97;32;61;32;55; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;110;111;116;97;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;51;93;41; - - - 110;111;116;97;32;60;32;109;101;108;104;111;114;78;111;116;97; - - - 109;101;108;104;111;114;78;111;116;97;32;61;32;110;111;116;97; - - - 109;101;108;104;111;114;78;111;109;101;32;61;32;112;97;114;116;101;115;91;48;93; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;101;108;104;111;114;32;110;111;116;97;32;97;32;73;110;103;108;234;115;58;32;34;32;43;32;109;101;108;104;111;114;78;111;109;101;32;43;32;34;32;40;34;32;43;32;109;101;108;104;111;114;78;111;116;97;32;43;32;34;41;34; - - -`,RM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,JM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 100;111;117;98;108;101;32;115;111;109;97;32;61;32;48; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 115;111;109;97;32;61;32;115;111;109;97;32;43;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;112;97;114;116;101;115;91;49;93;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;34;77;233;100;105;97;32;100;101;32;77;97;116;101;109;225;116;105;99;97;58;32;34;32;43;32;115;111;109;97;32;47;32;113;117;97;110;116;105;100;97;100;101; - - -`,GM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,HM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 108;105;110;104;97;46;99;111;110;116;97;105;110;115;40;34;92;34;110;111;109;101;92;34;34;41; - - - 105;110;116;32;105;110;105;99;105;111;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;110;111;109;101;92;34;58;32;92;34;34;41;32;43;32;57; - - - 105;110;116;32;102;105;109;32;61;32;108;105;110;104;97;46;105;110;100;101;120;79;102;40;34;92;34;34;44;32;105;110;105;99;105;111;41; - - - 111;117;116;112;117;116;58;32;108;105;110;104;97;46;115;117;98;115;116;114;105;110;103;40;105;110;105;99;105;111;44;32;102;105;109;41; - - - - - 248; - - - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - -`,VM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - -`,qM=` - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;110;116;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;61;32;34;32;32;123;92;34;110;111;109;101;92;34;58;32;92;34;34;32;43;32;110;111;109;101;115;91;105;93;32;43;32;34;92;34;44;32;92;34;112;111;110;116;111;115;92;34;58;32;34;32;43;32;112;111;110;116;111;115;91;105;93;32;43;32;34;125;34; - - - 105;32;60;32;110;111;109;101;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;97;100;97;32;61;32;101;110;116;114;97;100;97;32;43;32;34;44;34; - - - - - 248; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;101;110;116;114;97;100;97;41; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;110;111;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;97;100;97;115;32;103;117;97;114;100;97;100;97;115;34; - - -`,UM=` - - - 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;49;53;44;32;57;125; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;112;111;110;116;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - -`,QM=` - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;105;115;45;110;111;118;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;115;91;105;93;46;115;112;108;105;116;40;34;59;34;41; - - - 83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;61;32;34;32;32;123;92;34;110;111;109;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;101;115;91;48;93;32;43;32;34;92;34;44;32;92;34;101;115;112;101;99;105;101;92;34;58;32;92;34;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;92;34;44;32;92;34;105;100;97;100;101;92;34;58;32;34;32;43;32;112;97;114;116;101;115;91;50;93;32;43;32;34;125;34; - - - 105;32;60;32;108;105;110;104;97;115;46;108;101;110;103;116;104;32;45;32;49; - - - 101;110;116;114;97;100;97;32;61;32;101;110;116;114;97;100;97;32;43;32;34;44;34; - - - - - 248; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;101;110;116;114;97;100;97;41; - - - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;40;108;105;110;104;97;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;105;115;32;103;117;97;114;100;97;100;111;115;34; - - -`,$M=` - - - 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;97;110;105;109;97;105;115;45;110;111;118;111;115;46;106;115;111;110;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;91;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;34;93;34;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - -`,YM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;102;114;97;115;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 108;105;110;104;97;32;33;61;32;110;117;108;108; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 115;97;105;100;97;46;112;114;105;110;116;108;110;40;112;97;114;116;101;115;91;48;93;32;43;32;34;32;40;34;32;43;32;112;97;114;116;101;115;91;49;93;32;43;32;34;41;32;116;101;109;32;34;32;43;32;112;97;114;116;101;115;91;50;93;32;43;32;34;32;97;110;111;115;46;34;41; - - - 113;117;97;110;116;105;100;97;100;101;43;43; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - - 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;102;114;97;115;101;115;32;103;117;97;114;100;97;100;97;115;34; - - -`,KM=` - - - 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; - - - 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;102;114;97;115;101;115;46;116;120;116;34;41; - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; - - - 108;101;105;116;111;114;46;99;108;111;115;101;40;41; - - - 115;97;105;100;97;46;99;108;111;115;101;40;41; - - -`,XM=` - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - -`,eZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; - - - 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; - - - 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;56;46;53; - - -`,tZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,nZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;83;101;103;117;110;100;111;32;110;250;109;101;114;111;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,iZ=` - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;97;117;120;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;97;117;120; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,aZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;116;97;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;99;97;114;116;97;34; - - - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;60;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - -`,sZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;99;97;114;116;97;115;91;105;93;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;99;97;114;116;97;34; - - - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;62;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - -`,rZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;32;112;114;111;99;117;114;97;115;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;97;99;111;101;115;32;61;32;48; - - - 105;110;116;32;101;115;113;117;101;114;100;97;32;61;32;48; - - - 105;110;116;32;100;105;114;101;105;116;97;32;61;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;101;105;111;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;101;115;113;117;101;114;100;97;32;60;61;32;100;105;114;101;105;116;97; - - - 109;101;105;111;32;61;32;40;101;115;113;117;101;114;100;97;32;43;32;100;105;114;101;105;116;97;41;32;47;32;50; - - - 99;111;109;112;97;114;97;99;111;101;115;32;61;32;99;111;109;112;97;114;97;99;111;101;115;32;43;32;49; - - - 99;97;114;116;97;115;91;109;101;105;111;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;109;101;105;111; - - - - - 99;97;114;116;97;115;91;109;101;105;111;93;32;60;32;112;114;111;99;117;114;97;100;97; - - - 101;115;113;117;101;114;100;97;32;61;32;109;101;105;111;32;43;32;49; - - - - - 100;105;114;101;105;116;97;32;61;32;109;101;105;111;32;45;32;49; - - - - - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;69;110;99;111;110;116;114;97;100;97;32;110;97;32;112;111;115;105;231;227;111;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; - - -`,oZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;111;110;100;97;32;61;32;49; - 114;111;110;100;97;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 114;111;110;100;97;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104;32;45;32;114;111;110;100;97; - 105;43;43; - - - 99;97;114;116;97;115;91;105;93;32;62;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 105;110;116;32;97;117;120;32;61;32;99;97;114;116;97;115;91;105;93; - - - 99;97;114;116;97;115;91;105;93;32;61;32;99;97;114;116;97;115;91;105;32;43;32;49;93; - - - 99;97;114;116;97;115;91;105;32;43;32;49;93;32;61;32;97;117;120; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;99;97;114;116;97;115;91;105;93; - - - - -`,lZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - -`,uZ=` - - - 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;112;114;111;99;117;114;97;100;97;32;34;81;117;101;32;99;97;114;116;97;32;112;114;111;99;117;114;97;115;63;34; - - - 105;110;116;32;112;111;115;105;99;97;111;32;61;32;45;49; - - - 105;110;116;32;99;111;109;112;97;114;97;99;111;101;115;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;99;97;111;32;61;61;32;45;49;32;38;38;32;105;32;60;32;99;97;114;116;97;115;46;108;101;110;103;116;104; - - - 99;111;109;112;97;114;97;99;111;101;115;32;61;32;99;111;109;112;97;114;97;99;111;101;115;32;43;32;49; - - - 99;97;114;116;97;115;91;105;93;32;61;61;32;112;114;111;99;117;114;97;100;97; - - - 112;111;115;105;99;97;111;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;99;97;111;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;69;110;99;111;110;116;114;97;100;97;32;110;97;32;112;111;115;105;231;227;111;32;34;32;43;32;112;111;115;105;99;97;111; - - - - - 111;117;116;112;117;116;58;32;34;78;227;111;32;101;110;99;111;110;116;114;97;100;111;34; - - - - - 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; - - -`,mZ=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;110;116;111;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;110;116;111;115;91;105;93; - - - - -`,cZ=` - - - 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;111;110;116;111;115;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;111;110;116;111;115;91;105;93; - - - - -`,dZ=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;111;110;116;111;115;46;108;101;110;103;116;104; - 105;43;43; - - - 112;111;110;116;111;115;91;105;93;32;61;32;112;111;110;116;111;115;91;105;93;32;43;32;49; - - - - -`,hZ=` - - - 105;110;116;32;110;117;109;101;114;111;32;61;32;53; - - - 100;117;112;108;105;99;97;114;40;110;117;109;101;114;111;41; - - - 111;117;116;112;117;116;58;32;34;78;111;32;112;114;111;103;114;97;109;97;32;112;114;105;110;99;105;112;97;108;58;32;110;117;109;101;114;111;32;61;32;34;32;43;32;110;117;109;101;114;111; - - - 98;111;111;108;101;97;110;91;93;32;102;105;108;97;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;65;110;116;101;115;58;32;34;32;43;32;102;105;108;97;91;48;93;32;43;32;34;44;32;34;32;43;32;102;105;108;97;91;49;93; - - - 108;105;109;112;97;114;40;102;105;108;97;41; - - - 111;117;116;112;117;116;58;32;34;68;101;112;111;105;115;58;32;34;32;43;32;102;105;108;97;91;48;93;32;43;32;34;44;32;34;32;43;32;102;105;108;97;91;49;93; - - -`,gZ=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;108;117;103;97;114;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 108;117;103;97;114;101;115;91;105;93;32;61;32;102;97;108;115;101; - - - - -`,pZ=` - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;78;111;32;115;117;98;112;114;111;103;114;97;109;97;58;32;120;32;61;32;34;32;43;32;120; - - -`,fZ=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;97;112;101;108;105;100;111;32;34;65;112;101;108;105;100;111;34; - - - 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,bZ=` - - - 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;110;100;101;120;79;102;40;34;97;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;108;97;115;116;73;110;100;101;120;79;102;40;34;97;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;80;65;83;83;65;84;69;77;80;79;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;114;101;112;108;97;99;101;40;34;116;101;109;112;111;34;44;32;34;112;111;114;116;101;34;41; - - - 111;117;116;112;117;116;58;32;34;77;233;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;105;100;97;100;101;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;105;100;97;100;101;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;105;100;97;100;101;41;32;43;32;34;32;97;110;111;115;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - -`,xZ=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; - - - 83;116;114;105;110;103;32;105;110;118;101;114;116;105;100;97;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 105;110;118;101;114;116;105;100;97;32;61;32;105;110;118;101;114;116;105;100;97;32;43;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;105;110;118;101;114;116;105;100;97; - - -`,vZ=` - - - 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;76;117;100;119;105;103;59;98;111;100;101;59;55;34; - - - 83;116;114;105;110;103;91;93;32;112;97;114;116;101;115;32;61;32;108;105;110;104;97;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;114;116;101;115;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;112;97;114;116;101;115;91;105;93; - - - - -`,wZ=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;114;97;115;101;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;102;114;97;115;101;34; - - - 83;116;114;105;110;103;91;93;32;112;97;108;97;118;114;97;115;32;61;32;102;114;97;115;101;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;80;97;108;97;118;114;97;115;58;32;34;32;43;32;112;97;108;97;118;114;97;115;46;108;101;110;103;116;104; - - -`,yZ=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; - - - 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;97;39; - - - 113;117;97;110;116;105;100;97;100;101;32;61;32;113;117;97;110;116;105;100;97;100;101;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;101;32;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; - - -`,zZ=` - - - 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;115;117;98;115;116;114;105;110;103;40;48;44;32;53;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;115;117;98;115;116;114;105;110;103;40;53;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;105;110;100;101;120;79;102;40;34;116;101;109;112;111;34;41; - - - 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - -`,IZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;32;61;32;97;110;122;97;104;108;32;42;32;56;46;53; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - -`,kZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; - - - 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; - - - 100;111;117;98;108;101;32;103;101;115;97;109;116;32;61;32;97;110;122;97;104;108;32;42;32;56;46;53; - - -`,SZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,TZ=` - - - 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; - - - 105;110;112;117;116;58;32;105;110;116;32;98;32;34;90;119;101;105;116;101;32;90;97;104;108;34; - - - 97;32;61;32;98; - - - 98;32;61;32;97; - - - 111;117;116;112;117;116;58;32;97; - - - 111;117;116;112;117;116;58;32;98; - - -`,_Z=` - - - 105;110;116;32;97;32;61;32;51; - - - 105;110;116;32;98;32;61;32;53; - - - 105;110;116;32;104;105;108;102;32;61;32;97; - - - 97;32;61;32;98; - - - 98;32;61;32;104;105;108;102; - - - 111;117;116;112;117;116;58;32;34;97;32;61;32;34;32;43;32;97; - - - 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; - - -`,AZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;107;97;114;116;101;110;91;105;93;32;34;75;97;114;116;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;60;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - -`,jZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 105;110;112;117;116;58;32;107;97;114;116;101;110;91;105;93;32;34;75;97;114;116;101;32;101;105;110;103;101;98;101;110;34; - - - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;62;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - -`,CZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;32;115;117;99;104;115;116;32;100;117;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;118;101;114;103;108;101;105;99;104;101;32;61;32;48; - - - 105;110;116;32;108;105;110;107;115;32;61;32;48; - - - 105;110;116;32;114;101;99;104;116;115;32;61;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;49; - - - 105;110;116;32;109;105;116;116;101;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;108;105;110;107;115;32;60;61;32;114;101;99;104;116;115; - - - 109;105;116;116;101;32;61;32;40;108;105;110;107;115;32;43;32;114;101;99;104;116;115;41;32;47;32;50; - - - 118;101;114;103;108;101;105;99;104;101;32;61;32;118;101;114;103;108;101;105;99;104;101;32;43;32;49; - - - 107;97;114;116;101;110;91;109;105;116;116;101;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;109;105;116;116;101; - - - - - 107;97;114;116;101;110;91;109;105;116;116;101;93;32;60;32;103;101;115;117;99;104;116; - - - 108;105;110;107;115;32;61;32;109;105;116;116;101;32;43;32;49; - - - - - 114;101;99;104;116;115;32;61;32;109;105;116;116;101;32;45;32;49; - - - - - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;71;101;102;117;110;100;101;110;32;97;110;32;80;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; - - -`,DZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 114;117;110;100;101;43;43; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104;32;45;32;114;117;110;100;101; - 105;43;43; - - - 107;97;114;116;101;110;91;105;93;32;62;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 105;110;116;32;104;105;108;102;32;61;32;107;97;114;116;101;110;91;105;93; - - - 107;97;114;116;101;110;91;105;93;32;61;32;107;97;114;116;101;110;91;105;32;43;32;49;93; - - - 107;97;114;116;101;110;91;105;32;43;32;49;93;32;61;32;104;105;108;102; - - - - - 248; - - - - - - - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;107;97;114;116;101;110;91;105;93; - - - - -`,BZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - -`,PZ=` - - - 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; - - - 105;110;112;117;116;58;32;105;110;116;32;103;101;115;117;99;104;116;32;34;87;101;108;99;104;101;32;75;97;114;116;101;32;115;117;99;104;115;116;32;100;117;63;34; - - - 105;110;116;32;112;111;115;105;116;105;111;110;32;61;32;45;49; - - - 105;110;116;32;118;101;114;103;108;101;105;99;104;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - - - 112;111;115;105;116;105;111;110;32;61;61;32;45;49;32;38;38;32;105;32;60;32;107;97;114;116;101;110;46;108;101;110;103;116;104; - - - 118;101;114;103;108;101;105;99;104;101;32;61;32;118;101;114;103;108;101;105;99;104;101;32;43;32;49; - - - 107;97;114;116;101;110;91;105;93;32;61;61;32;103;101;115;117;99;104;116; - - - 112;111;115;105;116;105;111;110;32;61;32;105; - - - - - 248; - - - - - 105;32;61;32;105;32;43;32;49; - - - - - 112;111;115;105;116;105;111;110;32;62;61;32;48; - - - 111;117;116;112;117;116;58;32;34;71;101;102;117;110;100;101;110;32;97;110;32;80;111;115;105;116;105;111;110;32;34;32;43;32;112;111;115;105;116;105;111;110; - - - - - 111;117;116;112;117;116;58;32;34;78;105;99;104;116;32;103;101;102;117;110;100;101;110;34; - - - - - 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; - - -`,OZ=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;117;110;107;116;101;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;117;110;107;116;101;91;105;93; - - - - -`,MZ=` - - - 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; - - - 98;111;110;117;115;40;112;117;110;107;116;101;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;112;117;110;107;116;101;91;105;93; - - - - -`,ZZ=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;117;110;107;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 112;117;110;107;116;101;91;105;93;32;61;32;112;117;110;107;116;101;91;105;93;32;43;32;49; - - - - -`,LZ=` - - - 105;110;116;32;122;97;104;108;32;61;32;53; - - - 118;101;114;100;111;112;112;108;101;40;122;97;104;108;41; - - - 111;117;116;112;117;116;58;32;34;73;109;32;72;97;117;112;116;112;114;111;103;114;97;109;109;58;32;122;97;104;108;32;61;32;34;32;43;32;122;97;104;108; - - - 98;111;111;108;101;97;110;91;93;32;114;101;105;104;101;32;61;32;123;116;114;117;101;44;32;116;114;117;101;44;32;102;97;108;115;101;44;32;116;114;117;101;125; - - - 111;117;116;112;117;116;58;32;34;86;111;114;104;101;114;58;32;34;32;43;32;114;101;105;104;101;91;48;93;32;43;32;34;44;32;34;32;43;32;114;101;105;104;101;91;49;93; - - - 108;101;101;114;101;110;40;114;101;105;104;101;41; - - - 111;117;116;112;117;116;58;32;34;78;97;99;104;104;101;114;58;32;34;32;43;32;114;101;105;104;101;91;48;93;32;43;32;34;44;32;34;32;43;32;114;101;105;104;101;91;49;93; - - -`,WZ=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;112;108;97;101;116;122;101;46;108;101;110;103;116;104; - 105;43;43; - - - 112;108;97;101;116;122;101;91;105;93;32;61;32;102;97;108;115;101; - - - - -`,EZ=` - - - 120;32;61;32;120;32;42;32;50; - - - 111;117;116;112;117;116;58;32;34;73;109;32;85;110;116;101;114;112;114;111;103;114;97;109;109;58;32;120;32;61;32;34;32;43;32;120; - - -`,NZ=` - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;98;115;116;97;110;100;58;32;34;32;43;32;97;98;115;116;97;110;100;32;43;32;34;32;99;109;34;41; - - -`,FZ=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - - - -`,RZ=` - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - -`,JZ=` - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - -`,GZ=` - - - 105;110;116;32;122;117;115;116;97;110;100;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;49; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;50; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;48; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,HZ=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,VZ=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;97;108;108;111;33;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;99;104;32;98;105;110;32;86;105;115;117;66;111;116;34;41; - - -`,qZ=` - - - 105;110;116;32;122;97;104;108;32;61;32;48; - 122;97;104;108;32;60;32;56; - 122;97;104;108;43;43; - - - 122;97;104;108;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 122;97;104;108;32;47;32;50;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;49;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 122;97;104;108;32;47;32;52;32;37;32;50;32;61;61;32;49; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,UZ=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,QZ=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,$Z=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,YZ=` - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;86;105;115;117;66;111;116;34; - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;48;44;32;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;51;48;48;41; - - - - -`,KZ=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,XZ=` - - - 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;103;101;108;98;34;41; - - - 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; - - -`,eL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - -`,tL=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;52;53; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;112;97;114;107;116;33;34;41; - - -`,nL=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,iL=` - - - 83;116;114;105;110;103;91;93;32;102;97;114;98;101;110;32;61;32;123;34;114;111;116;34;44;32;34;103;101;108;98;34;44;32;34;103;114;252;110;34;44;32;34;98;108;97;117;34;44;32;34;108;105;108;97;34;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;102;97;114;98;101;110;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;102;97;114;98;101;110;91;105;93;41; - - - - -`,aL=` - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - -`,sL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;114;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,rL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;70;111;114;119;97;114;100;40;41; - - - - -`,oL=` - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;83;99;104;114;105;116;116;101;41; - - -`,lL=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;49;48; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 103;101;115;97;109;116;32;61;32;71;101;115;97;109;116;32;43;32;115;101;105;116;101; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;103;101;115;97;109;116;32;43;32;34;32;99;109;34;41; - - -`,uL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;41; - - -`,mL=` - - - 99;111;110;115;116;32;105;110;116;32;83;69;73;84;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,cL=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;78;97;99;104;116;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;228;109;109;101;114;117;110;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;84;97;103;34;41; - - - - - - -`,dL=` - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;83;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;99;104;114;105;116;116;101; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,hL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;116;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,gL=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;103;114;252;110;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - -`,pL=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;114;105;99;104;116;117;110;103;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - 114;105;99;104;116;117;110;103;32;61;32;73; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;82;105;99;104;116;117;110;103;58;32;34;32;43;32;114;105;99;104;116;117;110;103;41; - - -`,fL=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;116;104;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;81;117;101;114;108;105;110;105;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - -`,bL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;66;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - -`,xL=` - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;71;101;115;116;111;112;112;116;41; - - -`,vL=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,wL=` - - - 98;111;111;108;101;97;110;32;108;97;117;116;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;97;117;116;32;61;32;84;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;97;117;116; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;107;108;97;116;115;99;104;116;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;101;115;32;115;116;105;108;108;34;41; - - - - -`,yL=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;111;102;102;40;41; - - - - -`,zL=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;108;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,IL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;80;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,kL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;73;41;46;115;101;116;67;111;108;111;114;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - -`,SL=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;41; - - - - -`,TL=` - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 119;101;114;116;101;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;87;101;114;116;101;91;105;93; - - - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;119;101;114;116;32;61;32;115;117;109;109;101;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108;119;101;114;116;41; - - -`,_L=` - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;73;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - -`,AL=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;97;108;108;111;32;75;108;97;115;115;101;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;84;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - -`,jL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;83;116;111;112;40;41; - - -`,CL=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;107;107;117;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;41; - - - - - 248; - - - - -`,DL=` - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;103;114;252;110; - - - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;101;108;98;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,BL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;85;109;100;114;101;104;117;110;103;101;110;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,PL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,OL=` - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,ML=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,ZL=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - -`,LL=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;107;107;117;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; - - - 109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 248; - - - - -`,WL=` - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;54; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;114;252;110;34; - - - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;103;101;108;98;34; - - - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 122;117;115;116;97;110;100;32;61;32;34;114;111;116;34; - - - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - -`,EL=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;103;114;252;110;34;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - - - 248; - - - - - - -`,NL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,FL=` - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;61;32;49; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;105;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - -`,RL=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;53; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;105;32;42;32;50;48;48;44;32;50;48;48;41; - - - - -`,JL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;85;112;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;105;115;74;111;121;115;116;105;99;107;68;111;119;110;40;41; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;41; - - - - - 248; - - - - - - - - -`,GL=` - - - 98;111;111;108;101;97;110;32;108;97;117;116;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 108;97;117;116;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 108;97;117;116; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;107;108;97;116;115;99;104;116;33;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;108;108;101;115;32;115;116;105;108;108;34;41; - - - - -`,HL=` - - - 99;111;110;115;116;32;105;110;116;32;83;69;73;84;69;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;83;69;73;84;69;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,VL=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,qL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;98;108;97;117;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - -`,UL=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,QL=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;48;48;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,$L=` - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;115;99;104;114;105;116;116;101; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,YL=` - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;97;101;110;103;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;98;114;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,KL=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,XL=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;114;105;99;104;116;117;110;103;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - 114;105;99;104;116;117;110;103;32;61;32;105; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;82;105;99;104;116;117;110;103;58;32;34;32;43;32;114;105;99;104;116;117;110;103;41; - - -`,eW=` - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101;41; - - -`,tW=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,nW=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;49;48; - - - 105;110;116;32;103;101;115;97;109;116;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 103;101;115;97;109;116;32;61;32;103;101;115;97;109;116;32;43;32;115;101;105;116;101; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;103;101;115;97;109;116;32;43;32;34;32;99;109;34;41; - - -`,iW=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;78;97;99;104;116;34;41; - - - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;54;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;228;109;109;101;114;117;110;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;84;97;103;34;41; - - - - - - -`,aW=` - - - - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;115;116;111;112;112;116;34;41; - - -`,sW=` - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;97;108;108;111;32;75;108;97;115;115;101;34; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; - - -`,rW=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,oW=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,lW=` - - - 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,uW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - - 105;110;116;32;105;32;61;32;51; - 105;32;62;32;48; - 105;45;45; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - 109;98;111;116;46;108;101;100;40;105;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - - -`,mW=` - - - 99;111;110;115;116;32;105;110;116;32;65;66;83;84;65;78;68;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,cW=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - -`,dW=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,hW=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - -`,gW=` - - - 99;111;110;115;116;32;105;110;116;32;65;66;83;84;65;78;68;32;61;32;50;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;65;66;83;84;65;78;68; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,pW=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,fW=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;111;112;112;34;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;97;110;103;115;97;109;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;114;101;105;34;41; - - - - - - -`,bW=` - - - 83;116;114;105;110;103;32;122;117;115;116;97;110;100;32;61;32;34;102;97;104;114;101;110;34; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50;48; - 105;43;43; - - - 122;117;115;116;97;110;100;46;101;113;117;97;108;115;40;34;102;97;104;114;101;110;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 122;117;115;116;97;110;100;32;61;32;34;100;114;101;104;101;110;34; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 122;117;115;116;97;110;100;32;61;32;34;102;97;104;114;101;110;34; - - - - - - -`,xW=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 248; - - - - - - - - -`,vW=` - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;76;117;100;119;105;103;34; - - - 105;110;116;32;105;32;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;119;111;114;116;46;99;104;97;114;65;116;40;105;41;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,wW=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41;32;38;38;32;109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;105;115;76;105;110;101;82;105;103;104;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - 248; - - - - - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,yW=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;48;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;81;117;101;114;108;105;110;105;101;33;34;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - -`,zW=` - - - 105;110;116;32;109;97;120;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 97;98;115;116;97;110;100;32;62;32;109;97;120; - - - 109;97;120;32;61;32;97;98;115;116;97;110;100; - - - - - 248; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;109;32;119;101;105;116;101;115;116;101;110;58;32;34;32;43;32;109;97;120;32;43;32;34;32;99;109;34;41; - - -`,IW=` - - - 105;110;116;91;93;32;116;111;101;110;101;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;111;101;110;101;46;108;101;110;103;116;104; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;116;111;101;110;101;91;105;93;44;32;51;48;48;41; - - - - -`,kW=` - - - 105;110;116;91;93;32;119;101;114;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 119;101;114;116;101;91;105;93;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 105;110;116;32;115;117;109;109;101;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;101;114;116;101;46;108;101;110;103;116;104; - 105;43;43; - - - 115;117;109;109;101;32;61;32;115;117;109;109;101;32;43;32;119;101;114;116;101;91;105;93; - - - - - 100;111;117;98;108;101;32;109;105;116;116;101;108;119;101;114;116;32;61;32;115;117;109;109;101;32;47;32;53;46;48; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108;119;101;114;116;41; - - -`,SW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;54;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;52;48;48;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;119;101;105;223;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - 109;98;111;116;46;108;101;100;40;50;41;46;115;101;116;67;111;108;111;114;40;34;97;117;115;34;41; - - - 109;98;111;116;46;112;97;117;115;101;40;50;48;48;41; - - - - -`,TW=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;50;53;53;44;32;50;53;53;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - -`,_W=` - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; - - -`,AW=` - - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;53; - - - 83;99;104;108;101;105;102;101;32;118;101;114;108;97;115;115;101;110; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - -`,jW=` - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41;32;124;124;32;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; - - - - - 248; - - - - -`,CW=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - -`,DW=` - - - 113;117;97;100;114;97;116;40;51;48;41; - - - 113;117;97;100;114;97;116;40;53;48;41; - - -`,BW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;53; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - -`,PW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,OW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;53; - 106;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,MW=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - -`,ZW=` - - - 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;51;48;48;41; - - - - - 248; - - - - -`,LW=` - - - 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - 115;99;104;114;105;116;116;101;32;61;32;115;99;104;114;105;116;116;101;32;43;32;49; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101;41; - - -`,WW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,EW=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - - -`,NW=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;50;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 115;101;105;116;101;32;61;32;115;101;105;116;101;32;43;32;49;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,FW=` - - - 105;110;116;32;105;32;61;32;49; - 105;32;60;61;32;56; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;105;32;42;32;49;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,RW=` - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,JW=` - - - 105;110;116;32;114;117;110;100;101;32;61;32;49; - 114;117;110;100;101;32;60;61;32;51; - 114;117;110;100;101;43;43; - - - 114;117;110;100;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;117;102;32;100;105;101;32;80;108;228;116;122;101;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;70;101;114;116;105;103;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - -`,GW=` - - - 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; - - - 105;110;116;32;98;114;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;108;97;101;110;103;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;98;114;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 105;110;116;32;115;116;114;101;99;107;101;32;61;32;50;32;42;32;108;97;101;110;103;101;32;43;32;50;32;42;32;98;114;101;105;116;101; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;115;116;114;101;99;107;101;32;43;32;34;32;99;109;34;41; - - -`,HW=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; - - - 109;98;111;116;46;98;97;99;107;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;51;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - - - - -`,VW=` - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;57;52;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;51;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;52;57;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; - - -`,qW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;50;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,UW=` - - - 105;110;116;32;108;105;110;107;115;32;61;32;57;57; - - - 105;110;116;32;114;101;99;104;116;115;32;61;32;57;57; - - - 108;105;110;107;115;32;62;61;32;50;48;32;124;124;32;114;101;99;104;116;115;32;62;61;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 108;105;110;107;115;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 114;101;99;104;116;115;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - -`,QW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;49;44;32;34;85;109;100;114;101;104;117;110;103;101;110;34;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,$W=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53;32;38;38;32;109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 248; - - - - -`,YW=` - - - 105;110;116;32;115;101;105;116;101;32;61;32;51;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;101;105;116;101;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,KW=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 105;110;116;32;106;32;61;32;48; - 106;32;60;32;52; - 106;43;43; - - - 105;110;116;32;107;32;61;32;48; - 107;32;60;32;53; - 107;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,XW=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,eE=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,tE=` - - - 98;111;111;108;101;97;110;32;100;117;110;107;101;108;32;61;32;102;97;108;115;101; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51;48; - 105;43;43; - - - 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; - - - 100;117;110;107;101;108;32;61;32;116;114;117;101; - - - - - 248; - - - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 100;117;110;107;101;108; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;69;115;32;119;97;114;32;100;117;110;107;101;108;34;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;109;109;101;114;32;104;101;108;108;34;41; - - - - -`,nE=` - - - 105;110;116;32;115;116;114;101;99;107;101;32;61;32;122;101;110;116;105;109;101;116;101;114;40;51;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;115;116;114;101;99;107;101;41; - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;83;116;114;101;99;107;101;58;32;34;32;43;32;115;116;114;101;99;107;101;32;43;32;34;32;99;109;34;41; - - -`,iE=` - - - 114;101;116;117;114;110;32;117;109;100;114;101;104;117;110;103;101;110;32;42;32;50;48; - - -`,aE=` - - - 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; - - - 109;98;111;116;46;103;101;116;84;105;109;101;114;40;41;32;60;32;50; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,sE=` - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;41; - - -`,rE=` - - - 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;115;116;111;112;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,oE=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;50;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,lE=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,uE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - -`,mE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;48;44;32;50;53;53;41; - - - 109;98;111;116;46;112;97;117;115;101;40;53;48;48;41; - - - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - -`,cE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;50;48;41; - - - - -`,dE=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,hE=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - -`,gE=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - -`,pE=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;49;50;56;44;32;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;56;48;44;32;50;48;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;108;101;100;79;102;102;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - - -`,fE=` - - - 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; - - -`,bE=` - - - 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,xE=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; - - - 109;98;111;116;46;105;115;76;105;110;101;76;101;102;116;40;41; - - - 109;98;111;116;46;100;114;105;118;101;40;49;48;44;32;52;48;41; - - - - - 109;98;111;116;46;100;114;105;118;101;40;52;48;44;32;49;48;41; - - - - - - - 109;98;111;116;46;115;116;111;112;40;41; - - -`,vE=` - - - -1; - - - 109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - -1; - - - - - 248; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;115;116;111;112;112;116;34;41; - - -`,wE=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - -`,yE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;52; - 105;43;43; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,zE=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; - - -`,IE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;51; - 105;43;43; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;56;48;48;44;32;51;48;48;41; - - - 109;98;111;116;46;112;108;97;121;84;111;110;101;40;54;48;48;44;32;51;48;48;41; - - - - -`,kE=` - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;50; - 105;43;43; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - -`,SE=` - - - 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; - - - 109;98;111;116;46;112;97;117;115;101;40;49;48;48;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - -`,TE=` - - - 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;54;48;41; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - 109;98;111;116;46;116;117;114;110;76;101;102;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; - - - - - - -`,_E=` - - - 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; - - - 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; - - - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;41; - - - - -`,AE=` - - - 109;98;111;116;46;102;111;114;119;97;114;100;40;53;48;41; - - -`,jE=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;34; - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;99;104;110;97;109;101;32;34;78;97;99;104;110;97;109;101;34; - - - 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; - - -`,CE=` - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;90;105;101;103;101;110;98;111;99;107;34; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;110;100;101;120;79;102;40;34;101;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;108;97;115;116;73;110;100;101;120;79;102;40;34;101;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;115;69;109;112;116;121;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;101;113;117;97;108;115;73;103;110;111;114;101;67;97;115;101;40;34;90;73;69;71;69;78;66;79;67;75;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;114;101;112;108;97;99;101;40;34;98;111;99;107;34;44;32;34;107;228;115;101;34;41; - - - 111;117;116;112;117;116;58;32;34;77;228;104;34;46;114;101;112;101;97;116;40;51;41; - - - 111;117;116;112;117;116;58;32;34;65;110;110;97;34;46;99;111;109;112;97;114;101;84;111;40;34;66;101;110;34;41; - - - 105;110;116;32;97;108;116;101;114;32;61;32;73;110;116;101;103;101;114;46;112;97;114;115;101;73;110;116;40;34;55;34;41; - - - 111;117;116;112;117;116;58;32;97;108;116;101;114;32;43;32;49; - - - 83;116;114;105;110;103;32;116;101;120;116;32;61;32;83;116;114;105;110;103;46;118;97;108;117;101;79;102;40;97;108;116;101;114;41;32;43;32;34;32;74;97;104;114;101;34; - - - 111;117;116;112;117;116;58;32;116;101;120;116; - - -`,DE=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;32;114;117;101;99;107;119;97;101;114;116;115;32;61;32;34;34; - - - 105;110;116;32;105;32;61;32;119;111;114;116;46;108;101;110;103;116;104;40;41;32;45;32;49; - 105;32;62;61;32;48; - 105;45;45; - - - 114;117;101;99;107;119;97;101;114;116;115;32;61;32;114;117;101;99;107;119;97;101;114;116;115;32;43;32;119;111;114;116;46;99;104;97;114;65;116;40;105;41; - - - - - 111;117;116;112;117;116;58;32;114;117;101;99;107;119;97;101;114;116;115; - - -`,BE=` - - - 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;76;117;100;119;105;103;59;71;101;105;223;98;111;99;107;59;55;34; - - - 83;116;114;105;110;103;91;93;32;116;101;105;108;101;32;61;32;122;101;105;108;101;46;115;112;108;105;116;40;34;59;34;41; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;116;101;105;108;101;46;108;101;110;103;116;104; - 105;43;43; - - - 111;117;116;112;117;116;58;32;105;32;43;32;34;58;32;34;32;43;32;116;101;105;108;101;91;105;93; - - - - -`,PE=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;97;116;122;32;34;83;97;116;122;32;101;105;110;103;101;98;101;110;34; - - - 83;116;114;105;110;103;91;93;32;119;111;101;114;116;101;114;32;61;32;115;97;116;122;46;115;112;108;105;116;40;34;32;34;41; - - - 111;117;116;112;117;116;58;32;34;87;246;114;116;101;114;58;32;34;32;43;32;119;111;101;114;116;101;114;46;108;101;110;103;116;104; - - -`,OE=` - - - 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; - - - 105;110;116;32;97;110;122;97;104;108;32;61;32;48; - - - 105;110;116;32;105;32;61;32;48; - 105;32;60;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - 105;43;43; - - - 119;111;114;116;46;99;104;97;114;65;116;40;105;41;32;61;61;32;39;101;39; - - - 97;110;122;97;104;108;32;61;32;97;110;122;97;104;108;32;43;32;49; - - - - - 248; - - - - - - - 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;32;101;58;32;34;32;43;32;97;110;122;97;104;108; - - -`,ME=` - - - 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;71;101;105;223;98;111;99;107;34; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;108;101;110;103;116;104;40;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;99;104;97;114;65;116;40;48;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;48;44;32;52;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;115;117;98;115;116;114;105;110;103;40;52;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;105;110;100;101;120;79;102;40;34;98;111;99;107;34;41; - - - 111;117;116;112;117;116;58;32;119;111;114;116;46;116;111;85;112;112;101;114;67;97;115;101;40;41; - - -`,ZE=`// Labyrinth mit Ausgängen (nach Kara): jede Wandreihe hat genau eine Lücke, immer weiter rechts. Ein Zeichen = 30 cm. -raster: 3 -.......Z -#####.## -........ -##.##### ->....... -`,LE=`// Labyrinth mit Ausgängen, drei Reihen. Ein Zeichen = 30 cm. -raster: 3 -........Z -######.## -......... -####.#### -......... -.######## ->........ -`,WE=`// Um die Ecke (Sequenz im Kurs, Lektion 5): ein Zeichen = 30 cm. -raster: 3 -Z.... -###.. -..... -..### -^.... -`,EE=`// Fahre bis Rot: kurzer Weg -..... -..r.. -..... -..... -..^.. -`,NE=`// Fahre bis Rot: erst kommt ein grünes Feld -..... -..r.. -..... -..... -..g.. -..... -..... -..^.. -`,FE=`// Bis Blau, bei Grün piepen -..... -..b.. -..... -..g.. -..... -..^.. -`,RE=`// Bis Blau, ohne grünes Feld -..... -..b.. -..... -..... -..... -..^.. -`,JE=`// Hindernis ausweichen: ein Klotz im Weg, das rote Feld liegt dahinter. -......... -.....r... -.....o... -.....o... -......... -..#...... -......... -......... -......... -..^...... -`,GE=`// Hindernis ausweichen: zwei Klötze im Weg. -......... -.......r. -.......o. -.......o. -......... -....#.... -......... -......... -......... -.#....... -......... -......... -......... -.^....... -`,HE=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben links. -........... -.Z......... -........... -########... -........... -........... -........... -...######## -........... -.........<. -........... -`,VE=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben rechts. -........... -.........Z. -........... -...######## -........... -........... -........... -########... -........... -.>......... -........... -`,qE=`// Linienfolger: Die Linie biegt nach rechts ab und endet vor der Wand. -######### -......... -......... -....o.... -....o.... -......... -......... -......... -......... -......... -......... -......... -..^...... -linie: 2,12 2,8 4,5 4,0.6 -`,UE=`// Linienfolger: Die Linie biegt nach links ab und endet vor der Wand. -######### -......... -......... -....o.... -....o.... -......... -......... -......... -......... -......... -......... -......... -......^.. -linie: 6,12 6,8 4,5 4,0.6 -`,QE=`// Linienfolger mit Stopp: Am Ende der Linie liegt ein rotes Feld. -......... -.....r... -.....o... -.....o... -......... -......... -......... -......... -......... -......... -......... -..^...... -linie: 2,11 2,8 5,4 5,1.5 -`,$E=`// Linienfolger mit Stopp: Die Linie schlängelt sich zum roten Feld. -........... -...r....... -...o....... -...o....... -........... -........... -........... -........... -........... -........... -........... -........... -........... -.......^... -linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 -`,YE=`// Einparken: rechts parken Autos (Klötze), die blaue Markierung zeigt die Lücke. -#....#### -#....#### -#....#### -#..b....# -#.....o.# -#.......# -#....#### -#....#### -#....#### -#....#### -#....#### -#..^.#### -`,KE=`// Einparken: Die Lücke liegt weiter vorn. -#....#### -#..b....# -#.....o.# -#.......# -#....#### -#....#### -#....#### -#....#### -#....#### -#....#### -#....#### -#..^.#### -`,XE=`// Wo ist am meisten Platz? Rechts ist es am weitesten. -........... -.....#..... -........... -........... -.#...^....# -........... -.....#..... -`,eN=`// Wo ist am meisten Platz? Vorn ist es am weitesten. -.....#..... -........... -........... -........... -........... -........... -....#^.#... -........... -........... -.....#..... -`,tN=`// Bis zur Linie: der schwarze Rand ist nah -..... -===== -..... -..... -..^.. -..... -`,nN=`// Bis zur Linie: der schwarze Rand ist weiter weg -..... -===== -..... -..... -..... -..... -..... -..^.. -..... -`,iN=`// Slalom: ein Zeichen = 30 cm. Vier Pylonen, abwechselnd oben und unten herum, Ziel am Ende. -raster: 3 -......... ->#.#.#.#Z -......... -`,aN=`// Tunnelsucher (nach Kara): Halt im ersten Feld mit Wand links UND rechts (hellgrün). Ein Zeichen = 30 cm. -raster: 3 -..#..###. ->....o... -....##### -`,sN=`// Tunnelsucher, nach oben. Ein Zeichen = 30 cm. -raster: 3 -.#.#. -.#o#. -...#. -.#... -..... -..^.. -`,rN=`// Kleeblatt im Wald (nach Kara): Bäume liegen auf dem Weg zum Ziel, nie zwei nebeneinander. Ein Zeichen = 30 cm. -raster: 3 -.......... ->..#.#..#Z -.......... -`,oN=`// Kleeblatt im Wald, nach oben. Ein Zeichen = 30 cm. -raster: 3 -.Z. -.#. -... -.#. -... -... -.^. -`,lN=`// Wand vorn? Vor dem mBot2 ist viel Platz. -##### -..... -..... -..... -..... -..... -..... -..^.. -..... -`,uN=`// Bis zur Wand: kurzer Weg -##### -..... -..Z.. -..... -..... -..^.. -`,mN=`// Bis zur Wand: langer Weg -##### -..... -..Z.. -..... -..... -..... -..... -..... -..... -..... -..... -..... -..... -..... -..^.. -`,cN=`// Bis zur Wand: mittlerer Weg -##### -..... -..Z.. -..... -..... -..... -..... -..... -..... -..^.. -`,dN=`// Wand vorn? Die Wand steht direkt vor dem mBot2. -##### -..... -..^.. -..... -`,hN=`// Zwei Sekunden mit halber Kraft: Wo bleibt er stehen? -..... -..... -..... -..o.. -..... -..^.. -`,gN=`// Fahre bis zum Ziel: kurzer Weg, keine Wand -..... -..Z.. -..... -..... -..^.. -..... -`,pN=`// Fahre bis zum Ziel: langer Weg, keine Wand -..... -..Z.. -..... -..... -..... -..... -..... -..... -..... -..... -..^.. -..... -`,fN=""+new URL("ada-lovelace-DS_988PF.jpg",import.meta.url).href,bN=""+new URL("aufgabe-mehrwertsteuer-C-TFTrWz.svg",import.meta.url).href,xN=""+new URL("ben-shneiderman-Cev5hrqS.jpg",import.meta.url).href,vN=""+new URL("caesar-ascii-Bix93F5i.svg",import.meta.url).href,wN=""+new URL("caesar-scheibe-CMRPZI6Y.svg",import.meta.url).href,yN=""+new URL("caesar-verschiebung-DIR-lDbs.svg",import.meta.url).href,zN=""+new URL("aufgabe-mehrwertsteuer-CnrZ00ny.svg",import.meta.url).href,IN=""+new URL("kino-saal-C8zaJk4X.svg",import.meta.url).href,kN=""+new URL("kino-schleifen-D7sfo9iK.svg",import.meta.url).href,SN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlB1dCBhIGN1cCBvbiB0aGUgdGFibGU8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjEzMyI+U3VnYXIgd2FudGVkPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5BZGQgc3VnYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+VGVhIHN0aWxsIHRvbyBob3Q/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+V2FpdCAxIG1pbnV0ZTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5EcmluayB0aGUgdGVhPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIzOTUiPkVuZDwvdGV4dD4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCI+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjE2OCIgZmlsbD0iIzI0OGEzZCI+eWVzPC90ZXh0PgogICAgPHRleHQgeD0iMjQyIiB5PSIxMjIiIGZpbGw9IiNkNzAwMTUiPm5vPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPnllczwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMzIwIiBmaWxsPSIjZDcwMDE1Ij5ubzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5TdGFydCBvciBlbmQ8L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ0MyI+U3RhdGVtZW50PC90ZXh0PgogICAgPHRleHQgeD0iODYiIHk9IjQ3MyI+RGVjaXNpb248L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ3MyI+SW5wdXQgb3Igb3V0cHV0PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",TN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V2hlcmUgZG9lcyB0aGUgZWxlbWVudCBsYW5kPzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij50b3AgaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIxMTUiIHk9Ijk3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj5ib3R0b20gaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+aW4gZnJvbnQ8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YWZ0ZXI8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTMyIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjQwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2Ij7DuDwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjE1NyI+4oaSIDx0c3BhbiBmb250LXdlaWdodD0iNjAwIj5yZXBsYWNlczwvdHNwYW4+IGl0PC90ZXh0Pgo8L3N2Zz4K",_N=""+new URL("l03-lochkarte-beschriftet-BjBFZjzb.svg",import.meta.url).href,AN=""+new URL("l03-lochkarte-BB3rWQOm.svg",import.meta.url).href,jN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgMjkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSI+CjxyZWN0IHdpZHRoPSI0NjAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+Cjx0ZXh0IHg9IjUwIiB5PSI0NCIgZm9udC1zaXplPSI0MCIgZmlsbD0iIzZlNmU3MyIgdGV4dExlbmd0aD0iMjg4IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmdBbmRHbHlwaHMiPnByaWNlPHRzcGFuIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPlc8L3RzcGFuPml0aDx0c3BhbiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj5UPC90c3Bhbj5heDwvdGV4dD4KPGxpbmUgeDE9IjE4MiIgeTE9IjU0IiB4Mj0iMTgyIiB5Mj0iODIiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIvPgo8bGluZSB4MT0iMjc4IiB5MT0iNTQiIHgyPSIyNzgiIHkyPSI4MiIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSA0Ii8+CjxwYXRoIGQ9Ik0yMCAyNzIgSDQ0MCIgc3Ryb2tlPSIjZTVkM2IwIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTU2IDE3MiBMMTUwIDIyNiIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTE1MCAyMjYgTDE1NiAyNjIiIHN0cm9rZT0iI2I4OGE1MiIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMTUwIiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIxNjEiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTMyOCAxNzIgTDMzMiAyMjYiIHN0cm9rZT0iI2I4OGE1MiIgc3Ryb2tlLXdpZHRoPSIxMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zMzIgMjI2IEwzMjggMjYyIiBzdHJva2U9IiNiODhhNTIiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxjaXJjbGUgY3g9IjMzMiIgY3k9IjIyNiIgcj0iNiIgZmlsbD0iIzdhNTUzMCIgb3BhY2l0eT0iMC41NSIvPgo8ZWxsaXBzZSBjeD0iMzMzIiBjeT0iMjY3IiByeD0iMTEiIHJ5PSI1IiBmaWxsPSIjN2E1NTMwIi8+CjxwYXRoIGQ9Ik0xMjAgMTQwIEMxMDQgMTUwIDEwNCAxNzYgMTEwIDE5NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8ZWxsaXBzZSBjeD0iMTEwIiBjeT0iMjAwIiByeD0iNSIgcnk9IjkiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTEyMCAxNzIgQzEwOCAxNTIgMTE0IDEyOCAxMzQgMTIyIEMxNDggMTIwIDE1NCA4NCAxODIgODQgQzIxMCA4NCAyMDggMTI2IDIzMCAxMjQgQzI1MiAxMjYgMjUwIDg0IDI3OCA4NCBDMzA2IDg0IDMwOCAxMjIgMzE4IDEyOCBDMzQwIDEzMiAzNDggMTU4IDM2NCAxNTggQzM3NiAxNTggMzc4IDEyNCAzODIgMTEwIEMzODYgOTggNDAwIDk2IDQxMiA5OSBDNDI0IDEwMiA0MzAgMTA4IDQyOCAxMTYgQzQyNiAxMjMgNDE0IDEyNCA0MDQgMTIyIEMzOTYgMTIyIDM5NCAxMjggMzk0IDEzNiBDMzk0IDE2MiAzODggMTg0IDM2NiAxODYgQzM1MCAxODggMzQwIDE4MiAzMzAgMTc4IEMyNjAgMTg4IDIwMCAxODggMTQwIDE4MiBDMTMwIDE4MCAxMjQgMTc3IDEyMCAxNzIgWiIgZmlsbD0iI2QyYTU2YSIgc3Ryb2tlPSIjN2E1NTMwIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTM0IDE3MiBMMTI4IDIyNiIgc3Ryb2tlPSIjZDJhNTZhIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTEyOCAyMjYgTDEzNCAyNjIiIHN0cm9rZT0iI2QyYTU2YSIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMTI4IiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIxMzkiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTMwOCAxNzIgTDMxMiAyMjYiIHN0cm9rZT0iI2QyYTU2YSIgc3Ryb2tlLXdpZHRoPSIxMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zMTIgMjI2IEwzMDggMjYyIiBzdHJva2U9IiNkMmE1NmEiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxjaXJjbGUgY3g9IjMxMiIgY3k9IjIyNiIgcj0iNiIgZmlsbD0iIzdhNTUzMCIgb3BhY2l0eT0iMC41NSIvPgo8ZWxsaXBzZSBjeD0iMzEzIiBjeT0iMjY3IiByeD0iMTEiIHJ5PSI1IiBmaWxsPSIjN2E1NTMwIi8+CjxwYXRoIGQ9Ik0zOTAgMTAzIEwzODYgOTIgTDM5OCAxMDAgWiIgZmlsbD0iI2QyYTU2YSIgc3Ryb2tlPSIjN2E1NTMwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPGNpcmNsZSBjeD0iNDA2IiBjeT0iMTA3IiByPSIzLjIiIGZpbGw9IiMxYzFjMWUiLz4KPHBhdGggZD0iTTQwMSAxMDQgUTQwNiAxMDEgNDExIDEwNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjN2E1NTMwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNNDIyIDEwNyBxNCAxIDUgNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjN2E1NTMwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNNDE2IDExOSBRNDIyIDExOCA0MjcgMTE3IiBmaWxsPSJub25lIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=",CN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWdlID0gMTQ8L3RleHQ+CiAgPHBhdGggZD0iTTEzMCA3MCBMMTcwIDUwIEwzMDAgNTAgTDI2MCA3MCBaIiBmaWxsPSIjYzk4YTNjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE4MCIgeT0iMzQiIHdpZHRoPSI0NCIgaGVpZ2h0PSI1MCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIyMDIiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjIwIiBmb250LXdlaWdodD0iNzAwIj4xNDwvdGV4dD4KICA8cmVjdCB4PSIxMzAiIHk9IjcwIiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5Yjg3MiIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cGF0aCBkPSJNMjYwIDcwIEwzMDAgNTAgTDMwMCAxNTAgTDI2MCAxNzAgWiIgZmlsbD0iI2Q0OWE0YyIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cmVjdCB4PSIxNTAiIHk9IjEwMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjOGE1YTFmIi8+CiAgPHRleHQgeD0iMTk1IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmFnZTwvdGV4dD4KICA8cmVjdCB4PSIxMzgiIHk9IjE0MiIgd2lkdGg9IjM0IiBoZWlnaHQ9IjIwIiByeD0iMTAiIGZpbGw9IiMwMDdhZmYiLz4KICA8dGV4dCB4PSIxNTUiIHk9IjE1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2ZmZmZmZiIgZm9udC13ZWlnaHQ9IjYwMCI+aW50PC90ZXh0PgogIDxnIHN0cm9rZT0iIzZlNmU3MyI+CiAgICA8bGluZSB4MT0iMzEwIiB5MT0iNDgiIHgyPSIyMjYiIHkyPSI1MiIvPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjExNSIgeDI9IjI0MiIgeTI9IjExNSIvPgogICAgPGxpbmUgeDE9IjgwIiB5MT0iMTUyIiB4Mj0iMTM0IiB5Mj0iMTUyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjMxNiIgeT0iNTIiPlZhbHVlPC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0YSB0eXBlPC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMTk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgbmFtZSBnZXRzIHlvdSB0byB0aGUgdmFsdWUuPC90ZXh0Pgo8L3N2Zz4K",DN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9pbnRzPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCB3b3JrIG91dCB0aGUgcmlnaHQ6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIHN0b3JlIHRoZSByZXN1bHQgb24gdGhlIGxlZnQ8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzIGJlZm9yZTogPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj4gICDihpIgICBwb2ludHMgYWZ0ZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",BN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGVmdDwvdGV4dD4KICA8dGV4dCB4PSI3NSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5qdWljZTwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+dGVtcDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+ZW1wdHk8L3RleHQ+CiAgPHRleHQgeD0iMzI1IiB5PSIyMDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnJpZ2h0PC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53YXRlcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxwYXRoIGQ9Ik04OCAxMDQgQzExMCA3MCwgMTYwIDcwLCAxODYgMTA0Ii8+CiAgICA8cGF0aCBkPSJNMzE4IDEwNCBDMjcwIDE1LCAxMzAgMTUsIDgyIDEwNCIvPgogICAgPHBhdGggZD0iTTIxNCAxMDQgQzI0MCA3MCwgMjkwIDcwLCAzMTIgMTA0Ii8+CiAgPC9nPgogIDxnIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPGNpcmNsZSBjeD0iMTM3IiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIxMzciIHk9Ijg1Ij4xPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMzgiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyMDAiIHk9IjQzIj4yPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjYzIiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyNjMiIHk9Ijg1Ij4zPC90ZXh0PgogIDwvZz4KICA8ZyB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMiI+CiAgICA8dGV4dCB4PSI3MCIgeT0iMjQ3Ij4xOiB0ZW1wID0gbGVmdDwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjQ3Ij4yOiBsZWZ0ID0gcmlnaHQ8L3RleHQ+CiAgICA8dGV4dCB4PSIzMzAiIHk9IjI0NyI+MzogcmlnaHQgPSB0ZW1wPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",PN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dmFsaWQ8L3RleHQ+CiAgPHRleHQgeD0iNDAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnZhbGlkPC90ZXh0Pjx0ZXh0IHg9IjM2MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludmFsaWQ8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPmdyYWRlICZndDs9IDEgJmFtcDsmYW1wOyBncmFkZSAmbHQ7PSA2PC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIxNDIiIGZpbGw9IiNiOTFjMWMiPmdyYWRlICZsdDsgMSB8fCBncmFkZSAmZ3Q7IDY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",ON="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Ib3cgdGhlIHdoaWxlIGxvb3AgcnVuczwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjQ0IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI2OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGNoZWNrIHRoZSBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgcnVuIHRoZSBpbnNpZGU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5iYWNrPC90ZXh0PgogIDx0ZXh0IHg9IjM4IiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPnRvIHRoZSB0b3A8L3RleHQ+CiAgPHRleHQgeD0iMzQ4IiB5PSIxMzQiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmZhbHNlPC90ZXh0PgogIDx0ZXh0IHg9IjI3NiIgeT0iMjA1IiB0ZXh0LWFuY2hvcj0iZW5kIj5jb250aW51ZSBiZWxvdyB0aGUgbG9vcDwvdGV4dD4KPC9zdmc+Cg==",MN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHJlLXRlc3QgKHdoaWxlKTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5wb3N0LXRlc3QgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBpbnNpZGU8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY29uZGl0aW9uPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5JZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIGF0IG9uY2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50aGUgaW5zaWRlIHJ1bnMgPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm5ldmVyPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgaW5zaWRlIGFsd2F5cyBydW5zPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj48dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+YXQgbGVhc3Qgb25jZTwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",ZN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4ob25seSBvbmNlKTwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNzYiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSIxNyIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY2hlY2sgdGhlIGNvbmRpdGlvbjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjEzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIxNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoiBydW4gdGhlIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBzdGVwLCBlLmcuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+YmFjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50byDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZG9uZTwvdGV4dD4KPC9zdmc+Cg==",LN=""+new URL("l12-while-zu-for-DddKE_8R.svg",import.meta.url).href,WN=""+new URL("l13-verschachtelt-tabelle-jipYA7Ld.svg",import.meta.url).href,EN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtYmVycyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5JbmRleDwvdGV4dD4KICA8dGV4dCB4PSI5MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjA8L3RleHQ+PHJlY3QgeD0iNjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iOTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj4yPC90ZXh0PgogIDx0ZXh0IHg9IjE1MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjE8L3RleHQ+PHJlY3QgeD0iMTIwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjQ8L3RleHQ+CiAgPHRleHQgeD0iMjEwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MjwvdGV4dD48cmVjdCB4PSIxODAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjEwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NjwvdGV4dD4KICA8dGV4dCB4PSIyNzAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4zPC90ZXh0PjxyZWN0IHg9IjI0MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNzAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj44PC90ZXh0PgogIDx0ZXh0IHg9IjMzMCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjQ8L3RleHQ+PHJlY3QgeD0iMzAwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMzMCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjEwPC90ZXh0PgogIDx0ZXh0IHg9IjIwIiB5PSI5MCIgZmlsbD0iIzZlNmU3MyIgZm9udC1zaXplPSIxMiI+VmFsdWU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+PGxpbmUgeDE9IjkwIiB5MT0iMTQwIiB4Mj0iOTAiIHkyPSIxMTIiLz48bGluZSB4MT0iMzMwIiB5MT0iMTQwIiB4Mj0iMzMwIiB5Mj0iMTEyIi8+PC9nPgogIDxnIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dGV4dCB4PSI5MCIgeT0iMTU2Ij5udW1iZXJzWzBdIGlzIDI8L3RleHQ+PHRleHQgeD0iMzMwIiB5PSIxNTYiPm51bWJlcnNbNF0gaXMgMTA8L3RleHQ+PC9nPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTgyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj41IHNsb3RzLCBjb3VudGluZyBzdGFydHMgYXQgMDogdGhlIGxhc3QgaW5kZXggaXMgNC48L3RleHQ+Cjwvc3ZnPgo=",NN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMjkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPmNhbGN1bGF0b3IuY3BwPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iNTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMzYTNhM2MiPnNvdXJjZSBjb2RlIGluIEMrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSI2MCIgeDI9IjgwIiB5Mj0iOTQiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjEyNiIgeDI9IjgwIiB5Mj0iMTU2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iNjAiIHgyPSIyMjAiIHkyPSI5NCIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjEyNiIgeDI9IjIyMCIgeTI9IjE1NiIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjYwIiB4Mj0iMzYwIiB5Mj0iOTQiLz4KICAgIDxsaW5lIHgxPSIzNjAiIHkxPSIxMjYiIHgyPSIzNjAiIHkyPSIxNTYiLz4KICA8L2c+CiAgPHJlY3QgeD0iMTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSI4MCIgeT0iMTE2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jb21waWxlcjwvdGV4dD4KICA8cmVjdCB4PSIxOCIgeT0iMTU4IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjYjkxYzFjIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSI4MCIgeT0iMTgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5tYWNoaW5lIGNvZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTgiIHk9IjE5NCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iODAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V2luZG93czwvdGV4dD4KICA8cmVjdCB4PSIxNTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIyMjAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Y29tcGlsZXI8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxNTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiNiOTFjMWMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMTgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5tYWNoaW5lIGNvZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxOTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5tYWNPUzwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIzNjAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Y29tcGlsZXI8L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIxNTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiNiOTFjMWMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMTgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5tYWNoaW5lIGNvZGU8L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIxOTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5MaW51eDwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zdHlsZT0iaXRhbGljIj5Db21waWxlIGFnYWluPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMjc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPmZvciBldmVyeSBzeXN0ZW08L3RleHQ+Cjwvc3ZnPgo=",FN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMzMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPlRpbWVzVGFibGUuamF2YTwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjUxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjM2EzYTNjIj5zb3VyY2UgY29kZSwgZm9yIHBlb3BsZTwvdGV4dD4KICA8cmVjdCB4PSIxMTAiIHk9IjEwNCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIxMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXdlaWdodD0iNjAwIj5UaW1lc1RhYmxlLmNsYXNzPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMTQzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjM2EzYTNjIj5ieXRlY29kZTogQ0EgRkUgQkEgQkUg4oCmPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjYwIiB4Mj0iMjIwIiB5Mj0iMTAyIi8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iMTUyIiB4Mj0iODAiIHkyPSIxOTYiLz4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSIxNTIiIHgyPSIyMjAiIHkyPSIxOTYiLz4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSIxNTIiIHgyPSIzNjAiIHkyPSIxOTYiLz4KICA8L2c+CiAgPHRleHQgeD0iMjMwIiB5PSI4NiI+Y29tcGlsZXIgamF2YWM8L3RleHQ+CiAgPHJlY3QgeD0iMTgiIHk9IjE5OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iODAiIHk9IjIyMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+SlZNPC90ZXh0PgogIDxyZWN0IHg9IjE4IiB5PSIyMzQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjgwIiB5PSIyNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiPldpbmRvd3M8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxOTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjIxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5KVk08L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIyMzQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5tYWNPUzwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9IjE5OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzYwIiB5PSIyMjEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPkpWTTwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9IjIzNCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzYwIiB5PSIyNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiPkxpbnV4PC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMjk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPldyaXRlIG9uY2UsPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMzE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPnJ1biBhbnl3aGVyZTwvdGV4dD4KPC9zdmc+Cg==",RN=""+new URL("mvc-klick-BIA_bYzu.svg",import.meta.url).href,JN=""+new URL("ss-binaere-suche-D02W1TH_.svg",import.meta.url).href,GN=""+new URL("ss-bubblesort-CmKEoNfO.svg",import.meta.url).href,HN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Mb29raW5nIGZvciB0aGUgOS4gVGhlIGNhcmRzIGFyZSBtaXhlZCB1cC48L3RleHQ+CjxnPjxyZWN0IHg9IjE0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIzNC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij43PC90ZXh0Pjx0ZXh0IHg9IjM0LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjZGMyNjI2Ij7imaU8L3RleHQ+PC9nPgo8dGV4dCB4PSIzNC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMzQuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4xLjwvdGV4dD4KPGc+PHJlY3QgeD0iNjIiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjgyLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjM8L3RleHQ+PHRleHQgeD0iODIuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZoDwvdGV4dD48L2c+Cjx0ZXh0IHg9IjgyLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSI4Mi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjIuPC90ZXh0Pgo8Zz48cmVjdCB4PSIxMTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjEzMC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij4xMDwvdGV4dD48dGV4dCB4PSIxMzAuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpjwvdGV4dD48L2c+Cjx0ZXh0IHg9IjEzMC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTMwLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+My48L3RleHQ+CjxnPjxyZWN0IHg9IjE1OCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTc4LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjU8L3RleHQ+PHRleHQgeD0iMTc4LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaM8L3RleHQ+PC9nPgo8dGV4dCB4PSIxNzguMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjQuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyMDYiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMyIvPjx0ZXh0IHg9IjIyNi4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj45PC90ZXh0Pjx0ZXh0IHg9IjIyNi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iMjI2LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iIzE1ODAzZCI+4pyTPC90ZXh0Pgo8dGV4dCB4PSIyMjYuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj41LjwvdGV4dD4KPGc+PHJlY3QgeD0iMjU0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIyNTgiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjMwMiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzA2IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8Zz48cmVjdCB4PSIzNTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjM1NCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPHRleHQgeD0iMTQiIHk9IjE2OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+VHVybiB0aGVtIG92ZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0OjwvdGV4dD48dGV4dCB4PSIxNCIgeT0iMTg4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5BZnRlciA1IGNvbXBhcmlzb25zIHRoZSA5IGlzIGZvdW5kLjwvdGV4dD4KPC9zdmc+Cg==",VN=""+new URL("ss-vergleiche-UczNldcC.svg",import.meta.url).href,qN="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPkNhbGwgYnkgdmFsdWU6IGEgY29weTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1iZXI8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZG91YmxlSXQ8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jb3B5PC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTUwIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj54IGJlY29tZXMgMTAsIGJ1dCBudW1iZXIgc3RheXMgNS48L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNjgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPkxpa2UgYSBwaG90b2NvcHk6IHdyaXRpbmcgb24gdGhlIGNvcHk8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPmRvZXMgbm90IGNoYW5nZSB0aGUgb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5DYWxsIGJ5IHJlZmVyZW5jZTogdGhlIHNhbWUgYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+cm93PC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5jbGVhcjwvdGV4dD4KPHRleHQgeD0iMjYwIiB5PSIzMDAiPnNlYXRzPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5UaGVyZSBpcyBvbmx5IG9uZSBhcnJheS4gV2hhdCBjbGVhciBjaGFuZ2VzIHRocm91Z2ggc2VhdHMsPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDM0IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj50aGUgbWFpbiBwcm9ncmFtIHNlZXMgdW5kZXIgcm93LjwvdGV4dD4KPC9zdmc+Cg==",UN=""+new URL("zk-zeichen-CgUEhNoK.svg",import.meta.url).href,QN=""+new URL("grace-hopper-DltOT1I5.jpg",import.meta.url).href,$N=""+new URL("hedy-lamarr-MFZMAlPQ.jpg",import.meta.url).href,YN=""+new URL("ike-nassi-D2w47gvX.jpg",import.meta.url).href,KN=""+new URL("katherine-johnson-k17EjVTs.jpg",import.meta.url).href,XN=""+new URL("kino-saal-CYMOok4_.svg",import.meta.url).href,eF=""+new URL("kino-schleifen-DrTQV7dq.svg",import.meta.url).href,tF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlRhc3NlIGF1ZiBkZW4gVGlzY2ggc3RlbGxlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5adWNrZXIgZ2V3w7xuc2NodD88L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjE5NCI+WnVja2VyIGhpbmVpbmdlYmVuPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIyODUiPlRlZSBub2NoIHp1IGhlacOfPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjMyNy41IiB5PSIyODUiPjEgTWludXRlIHdhcnRlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5UZWUgdHJpbmtlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzk1Ij5FbmRlPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5qYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MiIgeT0iMTIyIiBmaWxsPSIjZDcwMDE1Ij5uZWluPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPmphPC90ZXh0PgogICAgPHRleHQgeD0iMTU2IiB5PSIzMjAiIGZpbGw9IiNkNzAwMTUiPm5laW48L3RleHQ+CiAgPC9nPgogIDwhLS0gTGVnZW5kZSAtLT4KICA8bGluZSB4MT0iMTAiIHkxPSI0MTgiIHgyPSIzOTAiIHkyPSI0MTgiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxnIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgPHJlY3QgeD0iNDAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiByeD0iOSIgZmlsbD0iI2QxZjJkOSIvPgogICAgPHJlY3QgeD0iMjIwIiB5PSI0MzAiIHdpZHRoPSIzNiIgaGVpZ2h0PSIxOCIgZmlsbD0iI2U1ZjBmZiIvPgogICAgPHBhdGggZD0iTTU4IDQ1OCBMNzYgNDY5IEw1OCA0ODAgTDQwIDQ2OSBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8cGF0aCBkPSJNMjI2IDQ2MCBMMjU2IDQ2MCBMMjUwIDQ3OCBMMjIwIDQ3OCBaIiBmaWxsPSIjZjJlNmZmIi8+CiAgPC9nPgogIDxnIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiMzYTNhM2MiPgogICAgPHRleHQgeD0iODYiIHk9IjQ0MyI+U3RhcnQgb2RlciBFbmRlPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NDMiPkFud2Vpc3VuZzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPlZlcnp3ZWlndW5nPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVpbi0gb2RlciBBdXNnYWJlPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",nF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V29oaW4gbGFuZGV0IGRhcyBFbGVtZW50PzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij5vYmVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnVudGVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjIyNCIgeT0iNjIiPuKGkiBrb21tdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGF2b3I8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIga29tbXQgPHRzcGFuIGZvbnQtd2VpZ2h0PSI2MDAiPmRhaGludGVyPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZXJzZXR6dDwvdHNwYW4+IGRlbiBQbGF0emhhbHRlcjwvdGV4dD4KPC9zdmc+Cg==",iF=""+new URL("l03-lochkarte-beschriftet-7hmU_7ct.svg",import.meta.url).href,aF=""+new URL("l03-lochkarte-gzfFEatc.svg",import.meta.url).href,sF=""+new URL("l03-zuse-lochstreifen-B87kqGex.svg",import.meta.url).href,rF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgMjkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSI+CjxyZWN0IHdpZHRoPSI0NjAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+Cjx0ZXh0IHg9IjUwIiB5PSI0NCIgZm9udC1zaXplPSI0MCIgZmlsbD0iIzZlNmU3MyIgdGV4dExlbmd0aD0iMzM2IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmdBbmRHbHlwaHMiPnByZWlzPHRzcGFuIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPk08L3RzcGFuPml0PHRzcGFuIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPlM8L3RzcGFuPnRldWVyPC90ZXh0Pgo8bGluZSB4MT0iMTgyIiB5MT0iNTQiIHgyPSIxODIiIHkyPSI4MiIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSA0Ii8+CjxsaW5lIHgxPSIyNTQiIHkxPSI1NCIgeDI9IjI1NCIgeTI9IjgyIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiLz4KPHBhdGggZD0iTTIwIDI3MiBINDQwIiBzdHJva2U9IiNlNWQzYjAiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0xNTYgMTcyIEwxNTAgMjI2IiBzdHJva2U9IiNiODhhNTIiIHN0cm9rZS13aWR0aD0iMTMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTUwIDIyNiBMMTU2IDI2MiIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyMjYiIHI9IjYiIGZpbGw9IiM3YTU1MzAiIG9wYWNpdHk9IjAuNTUiLz4KPGVsbGlwc2UgY3g9IjE2MSIgY3k9IjI2NyIgcng9IjExIiByeT0iNSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMzA0IDE3MiBMMzA4IDIyNiIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTMwOCAyMjYgTDMwNCAyNjIiIHN0cm9rZT0iI2I4OGE1MiIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMzA4IiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIzMDkiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTEyMCAxNDAgQzEwNCAxNTAgMTA0IDE3NiAxMTAgMTk2IiBmaWxsPSJub25lIiBzdHJva2U9IiNiODhhNTIiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxlbGxpcHNlIGN4PSIxMTAiIGN5PSIyMDAiIHJ4PSI1IiByeT0iOSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMTIwIDE3MiBDMTA4IDE1MiAxMTQgMTI4IDEzNCAxMjIgQzE0OCAxMjAgMTU0IDg0IDE4MiA4NCBDMjEwIDg0IDIwOCAxMjYgMjE4IDEyNCBDMjI4IDEyNiAyMjYgODQgMjU0IDg0IEMyODIgODQgMjg0IDEyMiAyOTQgMTI4IEMzMTYgMTMyIDMyNCAxNTggMzQwIDE1OCBDMzUyIDE1OCAzNTQgMTI0IDM1OCAxMTAgQzM2MiA5OCAzNzYgOTYgMzg4IDk5IEM0MDAgMTAyIDQwNiAxMDggNDA0IDExNiBDNDAyIDEyMyAzOTAgMTI0IDM4MCAxMjIgQzM3MiAxMjIgMzcwIDEyOCAzNzAgMTM2IEMzNzAgMTYyIDM2NCAxODQgMzQyIDE4NiBDMzI2IDE4OCAzMTYgMTgyIDMwNiAxNzggQzI0OCAxODggMTg4IDE4OCAxNDAgMTgyIEMxMzAgMTgwIDEyNCAxNzcgMTIwIDE3MiBaIiBmaWxsPSIjZDJhNTZhIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xMzQgMTcyIEwxMjggMjI2IiBzdHJva2U9IiNkMmE1NmEiIHN0cm9rZS13aWR0aD0iMTMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTI4IDIyNiBMMTM0IDI2MiIgc3Ryb2tlPSIjZDJhNTZhIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIxMjgiIGN5PSIyMjYiIHI9IjYiIGZpbGw9IiM3YTU1MzAiIG9wYWNpdHk9IjAuNTUiLz4KPGVsbGlwc2UgY3g9IjEzOSIgY3k9IjI2NyIgcng9IjExIiByeT0iNSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMjg0IDE3MiBMMjg4IDIyNiIgc3Ryb2tlPSIjZDJhNTZhIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTI4OCAyMjYgTDI4NCAyNjIiIHN0cm9rZT0iI2QyYTU2YSIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMjg4IiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIyODkiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTM2NiAxMDMgTDM2MiA5MiBMMzc0IDEwMCBaIiBmaWxsPSIjZDJhNTZhIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIzODIiIGN5PSIxMDciIHI9IjMuMiIgZmlsbD0iIzFjMWMxZSIvPgo8cGF0aCBkPSJNMzc3IDEwNCBRMzgyIDEwMSAzODcgMTA0IiBmaWxsPSJub25lIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zOTggMTA3IHE0IDEgNSA0IiBmaWxsPSJub25lIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zOTIgMTE5IFEzOTggMTE4IDQwMyAxMTciIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzdhNTUzMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+Cg==",oF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWx0ZXIgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YWx0ZXI8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5XZXJ0PC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0ZW50eXA8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPsOcYmVyIGRlbiBOYW1lbiBrb21tc3QgZHUgYW4gZGVuIFdlcnQuPC90ZXh0Pgo8L3N2Zz4K",lF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cHVua3RlPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cHVua3RlICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCByZWNodHMgYXVzcmVjaG5lbjogMTAgKyA1ID0gMTU8L3RleHQ+CiAgPHBhdGggZD0iTTI1MCA4MiBDMjMwIDMwLCA5MCAzMCwgNjQgODQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICA8dGV4dCB4PSIxNjAiIHk9IjM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIj7ikaEgRXJnZWJuaXMgbGlua3Mgc3BlaWNoZXJuPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxNjQiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3Ii8+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnB1bmt0ZSB2b3JoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xMDwvdHNwYW4+ICAg4oaSICAgcHVua3RlIG5hY2hoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",uF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGlua3M8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+U2FmdDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aGlsZjwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bGVlcjwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cmVjaHRzPC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5XYXNzZXI8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iNzAiIHk9IjI0NyI+MTogaGlsZiA9IGxpbmtzPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNDciPjI6IGxpbmtzID0gcmVjaHRzPC90ZXh0PgogICAgPHRleHQgeD0iMzMwIiB5PSIyNDciPjM6IHJlY2h0cyA9IGhpbGY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",mF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzAwIj4KPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNmZmZmZmYiLz4KPGcgdHJhbnNmb3JtPSJyb3RhdGUoLTMgMjAwIDE1MCkiPgo8cmVjdCB4PSI0NCIgeT0iMjQiIHdpZHRoPSIyOTAiIGhlaWdodD0iMjU2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1IDYpIi8+CjxyZWN0IHg9IjQ0IiB5PSIyNCIgd2lkdGg9IjI5MCIgaGVpZ2h0PSIyNTYiIGZpbGw9IiNmZmZkZjYiIHN0cm9rZT0iI2M5YzJhZCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iNTgiIHgyPSIzMzQiIHkyPSI1OCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iODAiIHgyPSIzMzQiIHkyPSI4MCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTAyIiB4Mj0iMzM0IiB5Mj0iMTAyIiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxMjQiIHgyPSIzMzQiIHkyPSIxMjQiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjE0NiIgeDI9IjMzNCIgeTI9IjE0NiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTY4IiB4Mj0iMzM0IiB5Mj0iMTY4IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxOTAiIHgyPSIzMzQiIHkyPSIxOTAiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjIxMiIgeDI9IjMzNCIgeTI9IjIxMiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMjM0IiB4Mj0iMzM0IiB5Mj0iMjM0IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIyNTYiIHgyPSIzMzQiIHkyPSIyNTYiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI3OCIgeTE9IjI0IiB4Mj0iNzgiIHkyPSIyODAiIHN0cm9rZT0iI2U4YTBhMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGcgZm9udC1mYW1pbHk9IidTZWdvZSBQcmludCcsICdCcmFkbGV5IEhhbmQnLCAnQ2hhbGtib2FyZCBTRScsICdDb21pYyBTYW5zIE1TJywgY3Vyc2l2ZSIgZmlsbD0iIzFmM2E4YSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Cjx0ZXh0IHg9IjEzMCIgeT0iNzUiIGZvbnQtc2l6ZT0iMTkiIGZvbnQtd2VpZ2h0PSJib2xkIj5hPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9Ijc1IiBmb250LXNpemU9IjE5IiBmb250LXdlaWdodD0iYm9sZCI+YjwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSI3NSIgZm9udC1zaXplPSIxOSIgZm9udC13ZWlnaHQ9ImJvbGQiPmhpbGY8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iOTciIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjE5NSIgeT0iOTciIGZvbnQtc2l6ZT0iMTgiPuKAkzwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSI5NyIgZm9udC1zaXplPSIxOCI+4oCTPC90ZXh0Pgo8dGV4dCB4PSIxMzAiIHk9IjExOSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMTk1IiB5PSIxMTkiIGZvbnQtc2l6ZT0iMTgiPjU8L3RleHQ+Cjx0ZXh0IHg9IjI2MiIgeT0iMTE5IiBmb250LXNpemU9IjE4Ij7igJM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTQxIiBmb250LXNpemU9IjE4Ij4zPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE0MSIgZm9udC1zaXplPSIxOCI+NTwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxNDEiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTYzIiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE2MyIgZm9udC1zaXplPSIxOCI+NTwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxNjMiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTg1IiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE4NSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxODUiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+CjwvZz4KPGcgc3Ryb2tlPSIjMWYzYThhIiBzdHJva2Utd2lkdGg9IjEuNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEwMCA4MyBRMTkwIDgxIDMwMCA4NCIvPgo8cGF0aCBkPSJNMTYyIDU2IFExNjAgMTUwIDE2MyAxOTQiLz4KPHBhdGggZD0iTTIyOCA1NiBRMjMwIDE1MCAyMjcgMTk0Ii8+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAgMjMyKSByb3RhdGUoLTM4KSI+CjxyZWN0IHg9IjAiIHk9Ii05IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjE4IiBmaWxsPSIjZjVjMDAwIiBzdHJva2U9IiM4YTZkMDAiIHN0cm9rZS13aWR0aD0iMS4yIi8+CjxsaW5lIHgxPSIwIiB5MT0iLTMiIHgyPSIxMjAiIHkyPSItMyIgc3Ryb2tlPSIjZDlhODAwIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjAiIHkxPSIzIiB4Mj0iMTIwIiB5Mj0iMyIgc3Ryb2tlPSIjZDlhODAwIiBzdHJva2Utd2lkdGg9IjEiLz4KPHJlY3QgeD0iMTIwIiB5PSItOSIgd2lkdGg9IjEyIiBoZWlnaHQ9IjE4IiBmaWxsPSIjYjhiOGI4IiBzdHJva2U9IiM3NzciIHN0cm9rZS13aWR0aD0iMS4yIi8+CjxyZWN0IHg9IjEzMiIgeT0iLTkiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxOCIgcng9IjUiIGZpbGw9IiNmMDhhOWEiIHN0cm9rZT0iI2EyNGE1OCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHBhdGggZD0iTTAgLTkgTC0yNiAwIEwwIDkgWiIgZmlsbD0iI2U5YzlhMCIgc3Ryb2tlPSIjOGE2ZDRhIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8cGF0aCBkPSJNLTE3IC0zIEwtMjYgMCBMLTE3IDMgWiIgZmlsbD0iIzMzMyIvPgo8L2c+Cjwvc3ZnPgo=",cF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzAwIj4KPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNmZmZmZmYiLz4KPGcgdHJhbnNmb3JtPSJyb3RhdGUoLTMgMjAwIDE1MCkiPgo8cmVjdCB4PSI0NCIgeT0iMjQiIHdpZHRoPSIyOTAiIGhlaWdodD0iMjU2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1IDYpIi8+CjxyZWN0IHg9IjQ0IiB5PSIyNCIgd2lkdGg9IjI5MCIgaGVpZ2h0PSIyNTYiIGZpbGw9IiNmZmZkZjYiIHN0cm9rZT0iI2M5YzJhZCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iNTgiIHgyPSIzMzQiIHkyPSI1OCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iODAiIHgyPSIzMzQiIHkyPSI4MCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTAyIiB4Mj0iMzM0IiB5Mj0iMTAyIiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxMjQiIHgyPSIzMzQiIHkyPSIxMjQiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjE0NiIgeDI9IjMzNCIgeTI9IjE0NiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTY4IiB4Mj0iMzM0IiB5Mj0iMTY4IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxOTAiIHgyPSIzMzQiIHkyPSIxOTAiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjIxMiIgeDI9IjMzNCIgeTI9IjIxMiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMjM0IiB4Mj0iMzM0IiB5Mj0iMjM0IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIyNTYiIHgyPSIzMzQiIHkyPSIyNTYiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI3OCIgeTE9IjI0IiB4Mj0iNzgiIHkyPSIyODAiIHN0cm9rZT0iI2U4YTBhMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGcgZm9udC1mYW1pbHk9IidTZWdvZSBQcmludCcsICdCcmFkbGV5IEhhbmQnLCAnQ2hhbGtib2FyZCBTRScsICdDb21pYyBTYW5zIE1TJywgY3Vyc2l2ZSIgZmlsbD0iIzFmM2E4YSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Cjx0ZXh0IHg9IjEzMCIgeT0iNzUiIGZvbnQtc2l6ZT0iMTkiIGZvbnQtd2VpZ2h0PSJib2xkIj5hPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9Ijc1IiBmb250LXNpemU9IjE5IiBmb250LXdlaWdodD0iYm9sZCI+YjwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSI3NSIgZm9udC1zaXplPSIxOSIgZm9udC13ZWlnaHQ9ImJvbGQiPnRlbXA8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iOTciIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjE5NSIgeT0iOTciIGZvbnQtc2l6ZT0iMTgiPuKAkzwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSI5NyIgZm9udC1zaXplPSIxOCI+4oCTPC90ZXh0Pgo8dGV4dCB4PSIxMzAiIHk9IjExOSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMTk1IiB5PSIxMTkiIGZvbnQtc2l6ZT0iMTgiPjU8L3RleHQ+Cjx0ZXh0IHg9IjI2MiIgeT0iMTE5IiBmb250LXNpemU9IjE4Ij7igJM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTQxIiBmb250LXNpemU9IjE4Ij4zPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE0MSIgZm9udC1zaXplPSIxOCI+NTwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxNDEiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTYzIiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE2MyIgZm9udC1zaXplPSIxOCI+NTwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxNjMiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTg1IiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjE4NSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxODUiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+CjwvZz4KPGcgc3Ryb2tlPSIjMWYzYThhIiBzdHJva2Utd2lkdGg9IjEuNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEwMCA4MyBRMTkwIDgxIDMwMCA4NCIvPgo8cGF0aCBkPSJNMTYyIDU2IFExNjAgMTUwIDE2MyAxOTQiLz4KPHBhdGggZD0iTTIyOCA1NiBRMjMwIDE1MCAyMjcgMTk0Ii8+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAgMjMyKSByb3RhdGUoLTM4KSI+CjxyZWN0IHg9IjAiIHk9Ii05IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjE4IiBmaWxsPSIjZjVjMDAwIiBzdHJva2U9IiM4YTZkMDAiIHN0cm9rZS13aWR0aD0iMS4yIi8+CjxsaW5lIHgxPSIwIiB5MT0iLTMiIHgyPSIxMjAiIHkyPSItMyIgc3Ryb2tlPSIjZDlhODAwIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjAiIHkxPSIzIiB4Mj0iMTIwIiB5Mj0iMyIgc3Ryb2tlPSIjZDlhODAwIiBzdHJva2Utd2lkdGg9IjEiLz4KPHJlY3QgeD0iMTIwIiB5PSItOSIgd2lkdGg9IjEyIiBoZWlnaHQ9IjE4IiBmaWxsPSIjYjhiOGI4IiBzdHJva2U9IiM3NzciIHN0cm9rZS13aWR0aD0iMS4yIi8+CjxyZWN0IHg9IjEzMiIgeT0iLTkiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxOCIgcng9IjUiIGZpbGw9IiNmMDhhOWEiIHN0cm9rZT0iI2EyNGE1OCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHBhdGggZD0iTTAgLTkgTC0yNiAwIEwwIDkgWiIgZmlsbD0iI2U5YzlhMCIgc3Ryb2tlPSIjOGE2ZDRhIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8cGF0aCBkPSJNLTE3IC0zIEwtMjYgMCBMLTE3IDMgWiIgZmlsbD0iIzMzMyIvPgo8L2c+Cjwvc3ZnPgo=",dF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzAwIj4KPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNmZmZmZmYiLz4KPGcgdHJhbnNmb3JtPSJyb3RhdGUoLTMgMjAwIDE1MCkiPgo8cmVjdCB4PSI0NCIgeT0iMjQiIHdpZHRoPSIyOTAiIGhlaWdodD0iMjU2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1IDYpIi8+CjxyZWN0IHg9IjQ0IiB5PSIyNCIgd2lkdGg9IjI5MCIgaGVpZ2h0PSIyNTYiIGZpbGw9IiNmZmZkZjYiIHN0cm9rZT0iI2M5YzJhZCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iNTgiIHgyPSIzMzQiIHkyPSI1OCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iODAiIHgyPSIzMzQiIHkyPSI4MCIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTAyIiB4Mj0iMzM0IiB5Mj0iMTAyIiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxMjQiIHgyPSIzMzQiIHkyPSIxMjQiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjE0NiIgeDI9IjMzNCIgeTI9IjE0NiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMTY4IiB4Mj0iMzM0IiB5Mj0iMTY4IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIxOTAiIHgyPSIzMzQiIHkyPSIxOTAiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI0NCIgeTE9IjIxMiIgeDI9IjMzNCIgeTI9IjIxMiIgc3Ryb2tlPSIjYmNkNGVlIiBzdHJva2Utd2lkdGg9IjEiLz4KPGxpbmUgeDE9IjQ0IiB5MT0iMjM0IiB4Mj0iMzM0IiB5Mj0iMjM0IiBzdHJva2U9IiNiY2Q0ZWUiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iNDQiIHkxPSIyNTYiIHgyPSIzMzQiIHkyPSIyNTYiIHN0cm9rZT0iI2JjZDRlZSIgc3Ryb2tlLXdpZHRoPSIxIi8+CjxsaW5lIHgxPSI3OCIgeTE9IjI0IiB4Mj0iNzgiIHkyPSIyODAiIHN0cm9rZT0iI2U4YTBhMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGcgZm9udC1mYW1pbHk9IidTZWdvZSBQcmludCcsICdCcmFkbGV5IEhhbmQnLCAnQ2hhbGtib2FyZCBTRScsICdDb21pYyBTYW5zIE1TJywgY3Vyc2l2ZSIgZmlsbD0iIzFmM2E4YSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Cjx0ZXh0IHg9IjEzMCIgeT0iNzUiIGZvbnQtc2l6ZT0iMTkiIGZvbnQtd2VpZ2h0PSJib2xkIj5hPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9Ijc1IiBmb250LXNpemU9IjE5IiBmb250LXdlaWdodD0iYm9sZCI+YjwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSI3NSIgZm9udC1zaXplPSIxOSIgZm9udC13ZWlnaHQ9ImJvbGQiPmF1eDwvdGV4dD4KPHRleHQgeD0iMTMwIiB5PSI5NyIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMTk1IiB5PSI5NyIgZm9udC1zaXplPSIxOCI+4oCTPC90ZXh0Pgo8dGV4dCB4PSIyNjIiIHk9Ijk3IiBmb250LXNpemU9IjE4Ij7igJM8L3RleHQ+Cjx0ZXh0IHg9IjEzMCIgeT0iMTE5IiBmb250LXNpemU9IjE4Ij4zPC90ZXh0Pgo8dGV4dCB4PSIxOTUiIHk9IjExOSIgZm9udC1zaXplPSIxOCI+NTwvdGV4dD4KPHRleHQgeD0iMjYyIiB5PSIxMTkiIGZvbnQtc2l6ZT0iMTgiPuKAkzwvdGV4dD4KPHRleHQgeD0iMTMwIiB5PSIxNDEiIGZvbnQtc2l6ZT0iMTgiPjM8L3RleHQ+Cjx0ZXh0IHg9IjE5NSIgeT0iMTQxIiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIyNjIiIHk9IjE0MSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMTMwIiB5PSIxNjMiIGZvbnQtc2l6ZT0iMTgiPjU8L3RleHQ+Cjx0ZXh0IHg9IjE5NSIgeT0iMTYzIiBmb250LXNpemU9IjE4Ij41PC90ZXh0Pgo8dGV4dCB4PSIyNjIiIHk9IjE2MyIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPHRleHQgeD0iMTMwIiB5PSIxODUiIGZvbnQtc2l6ZT0iMTgiPjU8L3RleHQ+Cjx0ZXh0IHg9IjE5NSIgeT0iMTg1IiBmb250LXNpemU9IjE4Ij4zPC90ZXh0Pgo8dGV4dCB4PSIyNjIiIHk9IjE4NSIgZm9udC1zaXplPSIxOCI+MzwvdGV4dD4KPC9nPgo8ZyBzdHJva2U9IiMxZjNhOGEiIHN0cm9rZS13aWR0aD0iMS42IiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPgo8cGF0aCBkPSJNMTAwIDgzIFExOTAgODEgMzAwIDg0Ii8+CjxwYXRoIGQ9Ik0xNjIgNTYgUTE2MCAxNTAgMTYzIDE5NCIvPgo8cGF0aCBkPSJNMjI4IDU2IFEyMzAgMTUwIDIyNyAxOTQiLz4KPC9nPgo8L2c+CjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMwMCAyMzIpIHJvdGF0ZSgtMzgpIj4KPHJlY3QgeD0iMCIgeT0iLTkiIHdpZHRoPSIxMjAiIGhlaWdodD0iMTgiIGZpbGw9IiNmNWMwMDAiIHN0cm9rZT0iIzhhNmQwMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPGxpbmUgeDE9IjAiIHkxPSItMyIgeDI9IjEyMCIgeTI9Ii0zIiBzdHJva2U9IiNkOWE4MDAiIHN0cm9rZS13aWR0aD0iMSIvPgo8bGluZSB4MT0iMCIgeTE9IjMiIHgyPSIxMjAiIHkyPSIzIiBzdHJva2U9IiNkOWE4MDAiIHN0cm9rZS13aWR0aD0iMSIvPgo8cmVjdCB4PSIxMjAiIHk9Ii05IiB3aWR0aD0iMTIiIGhlaWdodD0iMTgiIGZpbGw9IiNiOGI4YjgiIHN0cm9rZT0iIzc3NyIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHJlY3QgeD0iMTMyIiB5PSItOSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE4IiByeD0iNSIgZmlsbD0iI2YwOGE5YSIgc3Ryb2tlPSIjYTI0YTU4IiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8cGF0aCBkPSJNMCAtOSBMLTI2IDAgTDAgOSBaIiBmaWxsPSIjZTljOWEwIiBzdHJva2U9IiM4YTZkNGEiIHN0cm9rZS13aWR0aD0iMS4yIi8+CjxwYXRoIGQ9Ik0tMTcgLTMgTC0yNiAwIEwtMTcgMyBaIiBmaWxsPSIjMzMzIi8+CjwvZz4KPC9zdmc+Cg==",hF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+Z8O8bHRpZzwvdGV4dD4KICA8dGV4dCB4PSI0MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPnVuZ8O8bHRpZzwvdGV4dD48dGV4dCB4PSIzNjAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj51bmfDvGx0aWc8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGUgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGUgJmx0Oz0gNjwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RlICZsdDsgMSB8fCBub3RlICZndDsgNjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",gF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMTkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+CiAgPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIxOTAiIGZpbGw9IiNmZmZmZmYiLz4KICA8cmVjdCB4PSIyMCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmE8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmI8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIyMjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmEgJmFtcDsmYW1wOyBiPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNzAwIj5hIHx8IGI8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPiFhPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0NiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSI2MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjE0MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyNjAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIzNDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjM4MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjEwMCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzMDAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjExMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjE4MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTQyIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMjIwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8bGluZSB4MT0iMTgwIiB5MT0iMTQiIHgyPSIxODAiIHkyPSIxNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIzIi8+Cjwvc3ZnPgo=",pF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5BYmxhdWYgZGVyIFdoaWxlLVNjaGxlaWZlPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNDQiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSIyMCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjY5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaAgQmVkaW5ndW5nIHByw7xmZW48L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgSW5oYWx0IGF1c2bDvGhyZW48L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53aWVkZXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bmFjaCBvYmVuPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+d2VpdGVyIHVudGVyIGRlciBTY2hsZWlmZTwvdGV4dD4KPC9zdmc+Cg==",fF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+a29wZmdlc3RldWVydCAoV2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmZ1w59nZXN0ZXVlcnQgKERvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBCZWRpbmd1bmc8L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBJbmhhbHQ8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluaGFsdDwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgQmVkaW5ndW5nPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5Jc3QgZGllIEJlZGluZ3VuZyBnbGVpY2ggZmFsc2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5sw6R1ZnQgZGVyIEluaGFsdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+bmllPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5EZXIgSW5oYWx0IGzDpHVmdCBpbW1lcjwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm1pbmRlc3RlbnMgZWlubWFsPC90c3Bhbj4uPC90ZXh0Pgo8L3N2Zz4K",bF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4obnVyIGVpbm1hbCk8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIEJlZGluZ3VuZyBwcsO8ZmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGiIEluaGFsdCBhdXNmw7xocmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMjAwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjMTU4MDNkIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGjIFNjaHJpdHQsIHouIEIuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+enVyw7xjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj56dSDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZmVydGlnPC90ZXh0Pgo8L3N2Zz4K",xF=""+new URL("l12-while-zu-for-Cu-8sS5S.svg",import.meta.url).href,vF=""+new URL("l13-verschachtelt-tabelle-CmsFvxQ5.svg",import.meta.url).href,wF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gemFobGVuID0gezIsIDQsIDYsIDgsIDEwfTwvdGV4dD4KICA8dGV4dCB4PSIyMCIgeT0iNTQiIGZpbGw9IiM2ZTZlNzMiIGZvbnQtc2l6ZT0iMTIiPkluZGV4PC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5XZXJ0PC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYSkiPjxsaW5lIHgxPSI5MCIgeTE9IjE0MCIgeDI9IjkwIiB5Mj0iMTEyIi8+PGxpbmUgeDE9IjMzMCIgeTE9IjE0MCIgeDI9IjMzMCIgeTI9IjExMiIvPjwvZz4KICA8ZyBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRleHQgeD0iOTAiIHk9IjE1NiI+emFobGVuWzBdIGlzdCAyPC90ZXh0Pjx0ZXh0IHg9IjMzMCIgeT0iMTU2Ij56YWhsZW5bNF0gaXN0IDEwPC90ZXh0PjwvZz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+NSBGw6RjaGVyLCBnZXrDpGhsdCB3aXJkIGFiIDA6IGRlciBsZXR6dGUgSW5kZXggaXN0IDQuPC90ZXh0Pgo8L3N2Zz4K",yF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMjkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPnJlY2huZXIuY3BwPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iNTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMzYTNhM2MiPlF1ZWxsY29kZSBpbiBDKys8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iNjAiIHgyPSI4MCIgeTI9Ijk0Ii8+CiAgICA8bGluZSB4MT0iODAiIHkxPSIxMjYiIHgyPSI4MCIgeTI9IjE1NiIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjYwIiB4Mj0iMjIwIiB5Mj0iOTQiLz4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSIxMjYiIHgyPSIyMjAiIHkyPSIxNTYiLz4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSI2MCIgeDI9IjM2MCIgeTI9Ijk0Ii8+CiAgICA8bGluZSB4MT0iMzYwIiB5MT0iMTI2IiB4Mj0iMzYwIiB5Mj0iMTU2Ii8+CiAgPC9nPgogIDxyZWN0IHg9IjE4IiB5PSI5NiIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzMCIgcng9IjE1IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgPHRleHQgeD0iODAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Q29tcGlsZXI8L3RleHQ+CiAgPHJlY3QgeD0iMTgiIHk9IjE1OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iI2I5MWMxYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iODAiIHk9IjE4MSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+TWFzY2hpbmVuY29kZTwvdGV4dD4KICA8cmVjdCB4PSIxOCIgeT0iMTk0IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSI4MCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5XaW5kb3dzPC90ZXh0PgogIDxyZWN0IHg9IjE1OCIgeT0iOTYiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzAiIHJ4PSIxNSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMTE2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5Db21waWxlcjwvdGV4dD4KICA8cmVjdCB4PSIxNTgiIHk9IjE1OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iI2I5MWMxYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIxODEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPk1hc2NoaW5lbmNvZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxOTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5tYWNPUzwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIzNjAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Q29tcGlsZXI8L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIxNTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiNiOTFjMWMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMTgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5NYXNjaGluZW5jb2RlPC90ZXh0PgogIDxyZWN0IHg9IjI5OCIgeT0iMTk0IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIzNjAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+TGludXg8L3RleHQ+CiAgPHRleHQgeD0iMjIwIiB5PSIyNTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc3R5bGU9Iml0YWxpYyI+RsO8ciBqZWRlcyBTeXN0ZW08L3RleHQ+CiAgPHRleHQgeD0iMjIwIiB5PSIyNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc3R5bGU9Iml0YWxpYyI+bmV1IMO8YmVyc2V0emVuPC90ZXh0Pgo8L3N2Zz4K",zF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMzMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPkVpbm1hbGVpbnMuamF2YTwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjUxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjM2EzYTNjIj5RdWVsbGNvZGUsIGbDvHIgTWVuc2NoZW48L3RleHQ+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMDQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSI2IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMTI0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC13ZWlnaHQ9IjYwMCI+RWlubWFsZWlucy5jbGFzczwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjE0MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzNhM2EzYyI+Qnl0ZWNvZGU6IENBIEZFIEJBIEJFIOKApjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSI2MCIgeDI9IjIyMCIgeTI9IjEwMiIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjE1MiIgeDI9IjgwIiB5Mj0iMTk2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iMTUyIiB4Mj0iMjIwIiB5Mj0iMTk2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iMTUyIiB4Mj0iMzYwIiB5Mj0iMTk2Ii8+CiAgPC9nPgogIDx0ZXh0IHg9IjIzMCIgeT0iODYiPkNvbXBpbGVyIGphdmFjPC90ZXh0PgogIDxyZWN0IHg9IjE4IiB5PSIxOTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjgwIiB5PSIyMjEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPkpWTTwvdGV4dD4KICA8cmVjdCB4PSIxOCIgeT0iMjM0IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSI4MCIgeT0iMjU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5XaW5kb3dzPC90ZXh0PgogIDxyZWN0IHg9IjE1OCIgeT0iMTk4IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjMTU4MDNkIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMjAiIHk9IjIyMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+SlZNPC90ZXh0PgogIDxyZWN0IHg9IjE1OCIgeT0iMjM0IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjM2IiByeD0iNiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMjAiIHk9IjI1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+bWFjT1M8L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIxOTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMjIxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5KVk08L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIyMzQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMjU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5MaW51eDwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zdHlsZT0iaXRhbGljIj5FaW5tYWwgc2NocmVpYmVuLDwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjMxOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zdHlsZT0iaXRhbGljIj7DvGJlcmFsbCBhdXNmw7xocmVuPC90ZXh0Pgo8L3N2Zz4K",IF=""+new URL("margaret-hamilton-pYPKs1sU.jpg",import.meta.url).href,kF=""+new URL("mvc-klick-KmFKqxH-.svg",import.meta.url).href,SF=""+new URL("aufgabe-mehrwertsteuer-KUkerRBd.svg",import.meta.url).href,TF=""+new URL("kino-saal-BOvcmdzb.svg",import.meta.url).href,_F=""+new URL("kino-schleifen-Ci9yPnbo.svg",import.meta.url).href,AF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5JbsOtY2lvPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSI3NiI+UMO0ciB1bWEgY2jDoXZlbmEgbmEgbWVzYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5RdWVyIGHDp8O6Y2FyPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5KdW50YXIgYcOnw7pjYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+Q2jDoSBtdWl0byBxdWVudGU/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+RXNwZXJhciAxIG1pbnV0bzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5CZWJlciBvIGNow6E8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjM5NSI+RmltPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIyNDIiIHk9IjEyMiIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MCIgeT0iMjc0IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjMyMCIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5JbsOtY2lvIG91IGZpbTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI2NiIgeT0iNDQzIj5JbnN0cnXDp8OjbzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPkRlY2lzw6NvPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVudHJhZGEgb3Ugc2HDrWRhPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",jF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+T25kZSBmaWNhIG8gZWxlbWVudG8/PC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RiZWFmZSIvPgogIDxyZWN0IHg9IjIwIiB5PSI3NSIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc1IiB4Mj0iMjEwIiB5Mj0iNzUiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIi8+CiAgPHJlY3QgeD0iMjAiIHk9IjQwIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iNjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxZDRlZDgiPm1ldGFkZSBkZSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPm1ldGFkZSBkZSBiYWl4bzwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YW50ZXM8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGVwb2lzPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+c3Vic3RpdHVpLW88L3RzcGFuPjwvdGV4dD4KPC9zdmc+Cg==",CF=""+new URL("l03-lochkarte-beschriftet-D1QjqGFo.svg",import.meta.url).href,DF=""+new URL("l03-lochkarte-BSn6oWaS.svg",import.meta.url).href,BF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgMjkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSI+CjxyZWN0IHdpZHRoPSI0NjAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+Cjx0ZXh0IHg9IjUwIiB5PSI0NCIgZm9udC1zaXplPSI0MCIgZmlsbD0iIzZlNmU3MyIgdGV4dExlbmd0aD0iMjY0IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmdBbmRHbHlwaHMiPnByZWNvPHRzcGFuIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPkM8L3RzcGFuPm9tPHRzcGFuIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPkk8L3RzcGFuPnZhPC90ZXh0Pgo8bGluZSB4MT0iMTgyIiB5MT0iNTQiIHgyPSIxODIiIHkyPSI4MiIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSA0Ii8+CjxsaW5lIHgxPSIyNTQiIHkxPSI1NCIgeDI9IjI1NCIgeTI9IjgyIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiLz4KPHBhdGggZD0iTTIwIDI3MiBINDQwIiBzdHJva2U9IiNlNWQzYjAiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0xNTYgMTcyIEwxNTAgMjI2IiBzdHJva2U9IiNiODhhNTIiIHN0cm9rZS13aWR0aD0iMTMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTUwIDIyNiBMMTU2IDI2MiIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyMjYiIHI9IjYiIGZpbGw9IiM3YTU1MzAiIG9wYWNpdHk9IjAuNTUiLz4KPGVsbGlwc2UgY3g9IjE2MSIgY3k9IjI2NyIgcng9IjExIiByeT0iNSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMzA0IDE3MiBMMzA4IDIyNiIgc3Ryb2tlPSIjYjg4YTUyIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTMwOCAyMjYgTDMwNCAyNjIiIHN0cm9rZT0iI2I4OGE1MiIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMzA4IiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIzMDkiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTEyMCAxNDAgQzEwNCAxNTAgMTA0IDE3NiAxMTAgMTk2IiBmaWxsPSJub25lIiBzdHJva2U9IiNiODhhNTIiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxlbGxpcHNlIGN4PSIxMTAiIGN5PSIyMDAiIHJ4PSI1IiByeT0iOSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMTIwIDE3MiBDMTA4IDE1MiAxMTQgMTI4IDEzNCAxMjIgQzE0OCAxMjAgMTU0IDg0IDE4MiA4NCBDMjEwIDg0IDIwOCAxMjYgMjE4IDEyNCBDMjI4IDEyNiAyMjYgODQgMjU0IDg0IEMyODIgODQgMjg0IDEyMiAyOTQgMTI4IEMzMTYgMTMyIDMyNCAxNTggMzQwIDE1OCBDMzUyIDE1OCAzNTQgMTI0IDM1OCAxMTAgQzM2MiA5OCAzNzYgOTYgMzg4IDk5IEM0MDAgMTAyIDQwNiAxMDggNDA0IDExNiBDNDAyIDEyMyAzOTAgMTI0IDM4MCAxMjIgQzM3MiAxMjIgMzcwIDEyOCAzNzAgMTM2IEMzNzAgMTYyIDM2NCAxODQgMzQyIDE4NiBDMzI2IDE4OCAzMTYgMTgyIDMwNiAxNzggQzI0OCAxODggMTg4IDE4OCAxNDAgMTgyIEMxMzAgMTgwIDEyNCAxNzcgMTIwIDE3MiBaIiBmaWxsPSIjZDJhNTZhIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xMzQgMTcyIEwxMjggMjI2IiBzdHJva2U9IiNkMmE1NmEiIHN0cm9rZS13aWR0aD0iMTMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTI4IDIyNiBMMTM0IDI2MiIgc3Ryb2tlPSIjZDJhNTZhIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIxMjgiIGN5PSIyMjYiIHI9IjYiIGZpbGw9IiM3YTU1MzAiIG9wYWNpdHk9IjAuNTUiLz4KPGVsbGlwc2UgY3g9IjEzOSIgY3k9IjI2NyIgcng9IjExIiByeT0iNSIgZmlsbD0iIzdhNTUzMCIvPgo8cGF0aCBkPSJNMjg0IDE3MiBMMjg4IDIyNiIgc3Ryb2tlPSIjZDJhNTZhIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTI4OCAyMjYgTDI4NCAyNjIiIHN0cm9rZT0iI2QyYTU2YSIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPGNpcmNsZSBjeD0iMjg4IiBjeT0iMjI2IiByPSI2IiBmaWxsPSIjN2E1NTMwIiBvcGFjaXR5PSIwLjU1Ii8+CjxlbGxpcHNlIGN4PSIyODkiIGN5PSIyNjciIHJ4PSIxMSIgcnk9IjUiIGZpbGw9IiM3YTU1MzAiLz4KPHBhdGggZD0iTTM2NiAxMDMgTDM2MiA5MiBMMzc0IDEwMCBaIiBmaWxsPSIjZDJhNTZhIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8Y2lyY2xlIGN4PSIzODIiIGN5PSIxMDciIHI9IjMuMiIgZmlsbD0iIzFjMWMxZSIvPgo8cGF0aCBkPSJNMzc3IDEwNCBRMzgyIDEwMSAzODcgMTA0IiBmaWxsPSJub25lIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zOTggMTA3IHE0IDEgNSA0IiBmaWxsPSJub25lIiBzdHJva2U9IiM3YTU1MzAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik0zOTIgMTE5IFEzOTggMTE4IDQwMyAxMTciIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzdhNTUzMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+Cg==",PF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgaWRhZGUgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aWRhZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5WYWxvcjwvdGV4dD4KICA8dGV4dCB4PSIzMTYiIHk9IjExOSI+Tm9tZTwvdGV4dD4KICA8dGV4dCB4PSI4IiB5PSIxNTYiPlRpcG8gZGUgZGFkb3M8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPlBlbG8gbm9tZSBjaGVnYXMgYW8gdmFsb3IuPC90ZXh0Pgo8L3N2Zz4K",OF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9udG9zPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCBjYWxjdWxhciBhIGRpcmVpdGE6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIGd1YXJkYXIgbyByZXN1bHRhZG8gw6AgZXNxdWVyZGE8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zIGFudGVzOiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPiAgIOKGkiAgIHBvbnRvcyBkZXBvaXM6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",MF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMzAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMzAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZXNxdWVyZGE8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+c3VtbzwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YXV4PC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52YXppbzwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZGlyZWl0YTwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+w6FndWE8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iMjAwIiB5PSIyNTAiPjE6IGF1eCA9IGVzcXVlcmRhPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNjgiPjI6IGVzcXVlcmRhID0gZGlyZWl0YTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjg2Ij4zOiBkaXJlaXRhID0gYXV4PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",ZF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzAwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iMTAwIiB5PSI1MCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyNCIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc0IiB4Mj0iMzgwIiB5Mj0iNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGxpbmUgeDE9IjUwIiB5MT0iNjgiIHgyPSI1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MDwvdGV4dD4KICA8bGluZSB4MT0iMTAwIiB5MT0iNjgiIHgyPSIxMDAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4xPC90ZXh0PgogIDxsaW5lIHgxPSIxNTAiIHkxPSI2OCIgeDI9IjE1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjI8L3RleHQ+CiAgPGxpbmUgeDE9IjIwMCIgeTE9IjY4IiB4Mj0iMjAwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MzwvdGV4dD4KICA8bGluZSB4MT0iMjUwIiB5MT0iNjgiIHgyPSIyNTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj40PC90ZXh0PgogIDxsaW5lIHgxPSIzMDAiIHkxPSI2OCIgeDI9IjMwMCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMwMCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjU8L3RleHQ+CiAgPGxpbmUgeDE9IjM1MCIgeTE9IjY4IiB4Mj0iMzUwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NjwvdGV4dD4KICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMwMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dsOhbGlkYTwvdGV4dD4KICA8dGV4dCB4PSI1MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludsOhbGlkYTwvdGV4dD48dGV4dCB4PSIzNTAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnbDoWxpZGE8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGEgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGEgJmx0Oz0gNTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RhICZsdDsgMSB8fCBub3RhICZndDsgNTwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",LF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Db21vIGZ1bmNpb25hIG8gY2ljbG8gd2hpbGU8L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSI0NCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0MCIgcng9IjIwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iNjkiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCB2ZXJpZmljYXIgYSBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTI4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE1MyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIGV4ZWN1dGFyIG8gaW50ZXJpb3I8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52b2x0YXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+cGFyYSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+Y29udGludWFyIHBvciBiYWl4byBkbyBjaWNsbzwvdGV4dD4KPC9zdmc+Cg==",WF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHLDqS10ZXN0ZSAod2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnDDs3MtdGVzdGUgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjM1IiB5PSIxMjQiIHdpZHRoPSIxMzAiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgaW50ZXJpb3I8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGludGVyaW9yPC90ZXh0PgogIDxyZWN0IHg9IjIzNSIgeT0iMTI0IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjM2IiByeD0iMTgiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBjb25kacOnw6NvPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5TZSBhIGNvbmRpw6fDo28gZm9yIGxvZ28gZmFsc2EsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5vIGludGVyaW9yIDx0c3BhbiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj5udW5jYTwvdHNwYW4+IMOpIGV4ZWN1dGFkby48L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSIxOTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPk8gaW50ZXJpb3Igw6kgc2VtcHJlIGV4ZWN1dGFkbzwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPnBlbG8gbWVub3MgdW1hIHZlejwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",EF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluw61jaW8gPHRzcGFuIGZpbGw9IiM2ZTZlNzMiPihzw7MgdW1hIHZleik8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIHZlcmlmaWNhciBhIGNvbmRpw6fDo288L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMzgiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaIgZXhlY3V0YXIgbyBpbnRlcmlvcjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBwYXNzbywgcC4gZXguIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+dm9sdGFyPC90ZXh0PgogIDx0ZXh0IHg9IjQ4IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPmFvIOKRoTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9Ijg0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIzMzYiIHk9Ijk4Ij5maW08L3RleHQ+Cjwvc3ZnPgo=",NF=""+new URL("l12-while-zu-for-CM2--y57.svg",import.meta.url).href,FF=""+new URL("l13-verschachtelt-tabelle-CR2WySqU.svg",import.meta.url).href,RF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtZXJvcyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj7DjW5kaWNlPC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5WYWxvcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj48bGluZSB4MT0iOTAiIHkxPSIxNDAiIHgyPSI5MCIgeTI9IjExMiIvPjxsaW5lIHgxPSIzMzAiIHkxPSIxNDAiIHgyPSIzMzAiIHkyPSIxMTIiLz48L2c+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjx0ZXh0IHg9IjkwIiB5PSIxNTYiPm51bWVyb3NbMF0gw6kgMjwvdGV4dD48dGV4dCB4PSIzMzAiIHk9IjE1NiI+bnVtZXJvc1s0XSDDqSAxMDwvdGV4dD48L2c+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPjUgcG9zacOnw7VlcywgY29udGEtc2UgYSBwYXJ0aXIgZGUgMDogbyDDumx0aW1vIMOtbmRpY2Ugw6kgNC48L3RleHQ+Cjwvc3ZnPgo=",JF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMjkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMjkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPmNhbGN1bGFkb3JhLmNwcDwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjUxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjM2EzYTNjIj5jw7NkaWdvLWZvbnRlIGVtIEMrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSI2MCIgeDI9IjgwIiB5Mj0iOTQiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjEyNiIgeDI9IjgwIiB5Mj0iMTU2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iNjAiIHgyPSIyMjAiIHkyPSI5NCIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjEyNiIgeDI9IjIyMCIgeTI9IjE1NiIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjYwIiB4Mj0iMzYwIiB5Mj0iOTQiLz4KICAgIDxsaW5lIHgxPSIzNjAiIHkxPSIxMjYiIHgyPSIzNjAiIHkyPSIxNTYiLz4KICA8L2c+CiAgPHJlY3QgeD0iMTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSI4MCIgeT0iMTE2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jb21waWxhZG9yPC90ZXh0PgogIDxyZWN0IHg9IjE4IiB5PSIxNTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiNiOTFjMWMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjgwIiB5PSIxODEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmPDs2RpZ28gbcOhcXVpbmE8L3RleHQ+CiAgPHJlY3QgeD0iMTgiIHk9IjE5NCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iODAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V2luZG93czwvdGV4dD4KICA8cmVjdCB4PSIxNTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIyMjAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Y29tcGlsYWRvcjwvdGV4dD4KICA8cmVjdCB4PSIxNTgiIHk9IjE1OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iI2I5MWMxYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIxODEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmPDs2RpZ28gbcOhcXVpbmE8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxOTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5tYWNPUzwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9Ijk2IiB3aWR0aD0iMTI0IiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIzNjAiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+Y29tcGlsYWRvcjwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9IjE1OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iI2I5MWMxYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzYwIiB5PSIxODEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmPDs2RpZ28gbcOhcXVpbmE8L3RleHQ+CiAgPHJlY3QgeD0iMjk4IiB5PSIxOTQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjM2MCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5MaW51eDwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zdHlsZT0iaXRhbGljIj5Db21waWxhciBkZSBub3ZvPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMjc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPnBhcmEgY2FkYSBzaXN0ZW1hPC90ZXh0Pgo8L3N2Zz4K",GF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMzMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0NDAiIGhlaWdodD0iMzMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjIwIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtd2VpZ2h0PSI2MDAiPlRhYnVhZGEuamF2YTwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjUxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjM2EzYTNjIj5jw7NkaWdvLWZvbnRlLCBwYXJhIHBlc3NvYXM8L3RleHQ+CiAgPHJlY3QgeD0iMTEwIiB5PSIxMDQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSI2IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMTI0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC13ZWlnaHQ9IjYwMCI+VGFidWFkYS5jbGFzczwvdGV4dD4KICA8dGV4dCB4PSIyMjAiIHk9IjE0MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzNhM2EzYyI+Ynl0ZWNvZGU6IENBIEZFIEJBIEJFIOKApjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMjAiIHkxPSI2MCIgeDI9IjIyMCIgeTI9IjEwMiIvPgogICAgPGxpbmUgeDE9IjIyMCIgeTE9IjE1MiIgeDI9IjgwIiB5Mj0iMTk2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iMTUyIiB4Mj0iMjIwIiB5Mj0iMTk2Ii8+CiAgICA8bGluZSB4MT0iMjIwIiB5MT0iMTUyIiB4Mj0iMzYwIiB5Mj0iMTk2Ii8+CiAgPC9nPgogIDx0ZXh0IHg9IjIzMCIgeT0iODYiPmNvbXBpbGFkb3IgamF2YWM8L3RleHQ+CiAgPHJlY3QgeD0iMTgiIHk9IjE5OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iODAiIHk9IjIyMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+SlZNPC90ZXh0PgogIDxyZWN0IHg9IjE4IiB5PSIyMzQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjgwIiB5PSIyNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiPldpbmRvd3M8L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIxOTgiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjIxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5KVk08L3RleHQ+CiAgPHJlY3QgeD0iMTU4IiB5PSIyMzQiIHdpZHRoPSIxMjQiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIyMCIgeT0iMjU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5tYWNPUzwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9IjE5OCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzYwIiB5PSIyMjEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPkpWTTwvdGV4dD4KICA8cmVjdCB4PSIyOTgiIHk9IjIzNCIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzYwIiB5PSIyNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiPkxpbnV4PC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMjk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPkVzY3JldmVyIHVtYSB2ZXosPC90ZXh0PgogIDx0ZXh0IHg9IjIyMCIgeT0iMzE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXN0eWxlPSJpdGFsaWMiPmV4ZWN1dGFyIGVtIHF1YWxxdWVyIGxhZG88L3RleHQ+Cjwvc3ZnPgo=",HF=""+new URL("mvc-klick-DKonBpbs.svg",import.meta.url).href,VF=""+new URL("schiffe-versenken-iEBDHIxD.svg",import.meta.url).href,qF=""+new URL("ss-binaere-suche-DVVS2SNc.svg",import.meta.url).href,UF=""+new URL("ss-bubblesort-AFDcFDah.svg",import.meta.url).href,QF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Qcm9jdXJhLXNlIG8gOS4gQXMgY2FydGFzIGVzdMOjbyBiYXJhbGhhZGFzLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5WaXJhciBkYSBlc3F1ZXJkYSBwYXJhIGEgZGlyZWl0YTo8L3RleHQ+PHRleHQgeD0iMTQiIHk9IjE4OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+QXDDs3MgNSBjb21wYXJhw6fDtWVzLCBvIDkgw6kgZW5jb250cmFkby48L3RleHQ+Cjwvc3ZnPgo=",$F=""+new URL("ss-vergleiche-DWgkIvLr.svg",import.meta.url).href,YF="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPlBhc3NhZ2VtIHBvciB2YWxvcjogdW1hIGPDs3BpYTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1lcm88L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZHVwbGljYXI8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggcGFzc2EgYSAxMCwgbWFzIG51bWVybyBmaWNhIDUuPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTY4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5Db21vIHVtYSBmb3RvY8OzcGlhOiBlc2NyZXZlciBuYSBjw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPm7Do28gYWx0ZXJhIG8gb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5QYXNzYWdlbSBwb3IgcmVmZXLDqm5jaWE6IG8gbWVzbW8gYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+ZmlsYTwvdGV4dD4KPGNpcmNsZSBjeD0iMTUwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjMWQ0ZWQ4Ii8+CjxyZWN0IHg9IjI1MCIgeT0iMjUyIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjYyIiByeD0iOCIgZmlsbD0iI2ZmZjdlZCIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyNjAiIHk9IjI3MiIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+bGltcGFyPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9IjMwMCI+bHVnYXJlczwvdGV4dD4KPGNpcmNsZSBjeD0iMzkwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjYjQ1MzA5Ii8+CjxwYXRoIGQ9Ik0xNTAgMzAwIEwxNTAgMzQwIEwxNDAgMzUyIiBmaWxsPSJub25lIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI2IpIi8+CjxwYXRoIGQ9Ik0zOTAgMzAwIEwzOTAgMzQwIEwzMjIgMzU0IiBmaWxsPSJub25lIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI28pIi8+CjxyZWN0IHg9IjkwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjE1MCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyMTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMjcwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9IjEyMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTgwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIyNDAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjMwMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQxNiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+U8OzIGjDoSB1bSBhcnJheS4gTyBxdWUgbGltcGFyIGFsdGVyYSBhdHJhdsOpcyBkZSBsdWdhcmVzLDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+byBwcm9ncmFtYSBwcmluY2lwYWwgdsOqIGVtIGZpbGEuPC90ZXh0Pgo8L3N2Zz4K",KF=""+new URL("zk-zeichen-8efNmpGx.svg",import.meta.url).href,XF=""+new URL("schiffe-versenken-CXt1SF0S.svg",import.meta.url).href,eR=""+new URL("ss-binaere-suche-CPsLGldq.svg",import.meta.url).href,tR=""+new URL("ss-bubblesort-Dic2ZfaT.svg",import.meta.url).href,nR="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5HZXN1Y2h0OiBkaWUgOS4gRGllIEthcnRlbiBzaW5kIGdlbWlzY2h0LjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5Wb24gbGlua3MgbmFjaCByZWNodHMgdW1kcmVoZW46PC90ZXh0Pjx0ZXh0IHg9IjE0IiB5PSIxODgiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiM2ZTZlNzMiPk5hY2ggNSBWZXJnbGVpY2hlbiBpc3QgZGllIDkgZ2VmdW5kZW4uPC90ZXh0Pgo8L3N2Zz4K",iR=""+new URL("ss-vergleiche-DRqzU2TZ.svg",import.meta.url).href,aR="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPldlcnTDvGJlcmdhYmU6IGVpbmUgS29waWU8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNlZmY2ZmYiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjAiIHk9IjU4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWQ0ZWQ4Ij5IYXVwdHByb2dyYW1tPC90ZXh0Pgo8dGV4dCB4PSIyMCIgeT0iOTgiPnphaGw8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+dmVyZG9wcGxlPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9Ijk4Ij54PC90ZXh0Pgo8cmVjdCB4PSIyODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMzIwIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRzcGFuIGZpbGw9IiM2ZTZlNzMiIHRleHQtZGVjb3JhdGlvbj0ibGluZS10aHJvdWdoIj41PC90c3Bhbj4gPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj48L3RleHQ+CjxsaW5lIHgxPSIxMjgiIHkxPSI5MyIgeDI9IjI0OCIgeTI9IjkzIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiIG1hcmtlci1lbmQ9InVybCgjaykiLz4KPHRleHQgeD0iMjEwIiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+S29waWU8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggd2lyZCAxMCwgYWJlciB6YWhsIGJsZWlidCA1LjwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE2OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+V2llIGJlaSBlaW5lciBGb3Rva29waWU6IFdlciBhdWYgZGVyIEtvcGllIHNjaHJlaWJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE4NiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+w6RuZGVydCBkYXMgT3JpZ2luYWwgbmljaHQuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5SZWZlcmVuesO8YmVyZ2FiZTogZGFzc2VsYmUgQXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPkhhdXB0cHJvZ3JhbW08L3RleHQ+Cjx0ZXh0IHg9IjIwIiB5PSIzMDAiPnJlaWhlPC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5sZWVyZW48L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iMzAwIj5wbGFldHplPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5FcyBnaWJ0IG51ciBlaW4gQXJyYXkuIFdhcyBsZWVyZW4gw7xiZXIgcGxhZXR6ZSDDpG5kZXJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+c2llaHQgZGFzIEhhdXB0cHJvZ3JhbW0gdW50ZXIgcmVpaGUuPC90ZXh0Pgo8L3N2Zz4K",sR=""+new URL("zk-zeichen-vYvc3iJg.svg",import.meta.url).href;function rR(i){const e=[];for(const t of i.replace(/\r\n/g,` -`).split(` -`)){const n=/^###\s+(.+)$/.exec(t),a=e.at(-1);if(n){const s=n[1].trim();e.push({term:s,forms:[s],text:""})}else a&&/^(auch|also):/i.test(t)?a.forms.push(...t.replace(/^(auch|also):/i,"").split(",").map(s=>s.trim()).filter(Boolean)):a&&t.trim()!==""&&(a.text=(a.text+" "+t.trim()).trim())}return e.filter(t=>t.text!=="")}const oR=i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Lm(i){const e=i.flatMap(t=>t.forms).sort((t,n)=>n.length-t.length);if(e.length!==0)return new RegExp(`(?t.forms.includes(e))}class yl extends Error{}function lR(i){return i==="zuhoerer"||i==="vertrag"||i==="layout"||i==="bombe"||i==="frage"||i==="reihenfolge"}function uR(i,e,t){const n=h=>{throw new yl(`${t}: ${h}`)};let a="",s="",r="",o=[],l,u;const m=[];let c,d=!1;for(const h of e){const g=h.trim();if(c&&d&&(/^ {4}|^\t/.test(h)||g==="")){c.code+=(c.code?` -`:"")+h.replace(/^( {4}|\t)/,"");continue}if(d=!1,!g)continue;const f=/^(titel|intro|antworten|frage|runde|klicks|richtig|zeit|fehler|besser|daten|stelle):\s*(.*)$/.exec(g);if(f){const[,v,w]=f;v==="runde"?(c={code:"",question:r,options:[],explanation:"",clicks:[]},m.push(c),d=!0):c?v==="frage"?c.question=w:v==="fehler"?c.wrongLine=Number(w):v==="besser"?c.fix=w:v==="stelle"?c.wrongPart=w.trim():v==="klicks"?c.clicks=w.split(",").map(z=>z.trim()).filter(Boolean):v==="richtig"?c.rightText=w:n(`„${v}:“ gehört vor die erste Runde.`):v==="titel"?a=w:v==="intro"?s=w:v==="antworten"?o=w.split("|").map(z=>z.trim()):v==="frage"?r=w:v==="zeit"?l=Number(w):v==="daten"?u=w==="csv"?w:n("„daten:“ kennt nur „csv“."):n(`„${v}:“ gehört in eine Runde.`);continue}c||n(`Unbekannte Zeile vor der ersten Runde: „${g}“`);const b=c,x=/^-\s+(\[x\]\s+)?(.+)$/.exec(g);x?b.options.push({text:x[2].trim().replaceAll("\\n",` -`),right:!!x[1]}):g.startsWith(">")?b.explanation+=(b.explanation?" ":"")+g.slice(1).trim():n(`Unbekannte Zeile im Spiel: „${g}“`)}return a||n("Das Spiel braucht eine Zeile „titel:“."),m.length||n("Das Spiel braucht mindestens eine „runde:“."),m.forEach((h,g)=>{if(h.code=h.code.replace(/\n+$/,""),i==="bombe"){const f=h.code.split(` -`),b=h.wrongLine;if((!b||!Number.isInteger(b)||b<1||b>f.length||!f[b-1].trim())&&n(`Runde ${g+1}: „fehler:“ muss eine Zeile des Codes sein.`),h.fix||n(`Runde ${g+1}: „besser:“ fehlt.`),h.options.length&&n(`Runde ${g+1}: Bei „bombe“ gibt es keine Antworten, man tippt auf die Zeile.`),h.question||n(`Runde ${g+1}: keine Frage.`),h.wrongPart!==void 0){u&&n(`Runde ${g+1}: „stelle:“ geht nur bei Java, nicht bei CSV.`);const x=xp(f[b-1]).filter(v=>v.part).map(v=>v.text);x.filter(v=>v===h.wrongPart).length!==1&&n(`Runde ${g+1}: „stelle: ${h.wrongPart}“ ist kein Teil der Zeile ${b}. Teile: ${x.map(v=>`„${v}“`).join(", ")}`)}return}if(i==="reihenfolge"){h.options.length<3&&n(`Runde ${g+1}: „reihenfolge“ braucht mindestens drei Schritte.`),h.options.some(f=>f.right)&&n(`Runde ${g+1}: Bei „reihenfolge“ gibt es kein [x], die Schritte stehen der Reihe nach da.`),new Set(h.options.map(f=>f.text)).size!==h.options.length&&n(`Runde ${g+1}: zwei Schritte sind gleich.`),h.question||n(`Runde ${g+1}: keine Frage.`);return}if(h.options.length||(o.length||n(`Runde ${g+1}: keine Antworten.`),(!h.rightText||!o.includes(h.rightText))&&n(`Runde ${g+1}: „richtig:“ muss eine der Antworten sein.`),h.options=o.map(f=>({text:f,right:f===h.rightText}))),h.options.filter(f=>f.right).length!==1&&n(`Runde ${g+1}: genau eine Antwort muss richtig sein.`),h.question||n(`Runde ${g+1}: keine Frage.`),i==="layout"&&h.options.forEach(f=>vp(f.text,`Runde ${g+1}`,n)),i==="zuhoerer")try{const f=wp(h.code);for(const b of h.clicks)f.buttons.some(x=>x.caption===b)||n(`Runde ${g+1}: Knopf „${b}“ gibt es nicht.`);dR(f,h.clicks)}catch(f){if(f instanceof yl)throw f;n(`Runde ${g+1}: ${f.message}`)}delete h.rightText}),i==="bombe"&&!(l&&l>0)&&n("„bombe“ braucht „zeit:“ mit den Sekunden je Runde."),{kind:i,title:a,intro:s,...i==="bombe"?{seconds:l,...u?{data:u}:{}}:{},rounds:m}}function Da(i,e){const t=[];let n=0,a="";for(let s=0;so&&/\s/.test(i[l-1]);)l--;l>o&&a.push([e+o,e+l]),s=r+n}return a}const mR=(i,e)=>i[e]==="+"&&i[e-1]!=="+"&&i[e+1]!=="+"&&i[e+1]!=="=",cR=(i,e)=>i[e]==="="&&!"=<>!+-*/%".includes(i[e-1]??"")&&i[e+1]!=="=";function xp(i){const e=/^\s*/.exec(i)[0],t=i.slice(e.length).replace(/\s+$/,""),n=(()=>{const o=/^(?:\}\s*)?(?:else\s+)?(for|if|while)\s*\(/.exec(t);if(o){const g=o[0].length-1,f=Em(t,g);if(f<0)return[];const b=t.slice(g+1,f);if(o[1]!=="for")return I1(b,g+1,[],0);const x=Da(b,(v,w)=>v[w]===";");return x.length===2?I1(b,g+1,x,1):[]}if(!t.endsWith(";"))return[];const l=t.slice(0,-1),u=Da(l,cR);if(u.length===1)return I1(l,0,u,1);if(u.length)return[];const m=l.indexOf("(");if(m<=0||Em(l,m)!==l.length-1||/^(new|return)\b/.test(l))return[];const c=I1(l.slice(0,m),0,[],0),d=l.slice(m+1,-1),h=I1(d,m+1,Da(d,(g,f)=>g[f]===","),1).flatMap(([g,f])=>{const b=l.slice(g,f);return I1(b,g,Da(b,mR),1)});return[...c,...h]})(),a=n.length?n:t?[[0,t.length]]:[],s=e?[{text:e,part:!1}]:[];let r=0;for(const[o,l]of a)o>r&&s.push({text:t.slice(r,o),part:!1}),s.push({text:t.slice(o,l),part:!0}),r=l;return r{throw new yl(n)}){const n=/^(grid|flow|border):\s*(.+)$/.exec(i);if(!n)return t(`${e}: Antwort „${i}“ ist kein Fensterbild (grid:, flow: oder border:).`);if(n[1]==="border"){const s={};for(const r of n[2].split(/\s+/)){const o=/^([NSWEC])=(.+)$/.exec(r);o||t(`${e}: „${r}“ im BorderLayout-Bild verstehe ich nicht (z. B. N=A).`),s[o[1]]=o[2]}return{kind:"border",areas:s}}const a=n[2].split("/").map(s=>s.trim().split(/\s+/).filter(Boolean));return{kind:n[1],rows:a}}const gs='"((?:[^"\\\\]|\\\\.)*)"';function wp(i){const e=i.split(` -`),t={title:"",buttons:[],labels:[],ints:{},listeners:[]},n=new Map,a=(r,o,l)=>{if(o.startsWith("{")){let m=r+1;const c=[];for(;m=e.length)throw new Error(`Dem Zuhörer fehlt „${l}“.`);return{from:r,to:m,statements:zl(c.join(" "))}}const u=l==="});"?o.replace(/\)\s*;\s*$/,""):o.replace(/;\s*$/,"");return{from:r,to:r,statements:zl(u)}},s=r=>{if(!t.buttons.some(o=>o.name===r))throw new Error(`Knopf ${r} ist nicht angelegt.`);return r};for(let r=0;r\s*(.*)$/.exec(o)){const u=a(r,l[2],"};");n.set(l[1],u),r=u.to}else if(l=/^(\w+)\.addActionListener\(\s*(\w+)\s*\)\s*;$/.exec(o)){const u=n.get(l[2]);if(!u)throw new Error(`Zuhörer ${l[2]} ist nicht angelegt.`);t.listeners.push({button:s(l[1]),...u})}else if(l=/^(\w+)\.addActionListener\(\s*\w+\s*->\s*(.*)$/.exec(o)){const u=a(r,l[2],"});");t.listeners.push({button:s(l[1]),...u}),r=u.to}}return t}function zl(i){const e=[];let t=0;const n=()=>{for(;t{let u=0,m=!1;const c=t+1;for(;t{let o=0,l=!1;const u=t;for(;t{if(n(),i[t]==="{")return zl(a("{","}"));if(/^if\s*\(/.test(i.slice(t))){t=i.indexOf("(",t);const l=a("(",")").trim(),u=r();n();let m=[];return/^else\b/.test(i.slice(t))&&(t+=4,m=r()),[{condition:l,then:u,otherwise:m}]}const o=s();return o?[o]:[]};for(n();ta.caption===t)??i.buttons.find(a=>e.texts[a.name]===t);if(!n)throw new Error(`Knopf „${t}“ gibt es nicht.`);return Ip(i,e,n.name)}function Ip(i,e,t){const n=i.listeners.find(r=>r.button===t),a=[],s={source:t,command:e.texts[t]};for(const r of(n==null?void 0:n.statements)??[])kp(r,e,a,s);return{button:t,listener:n,texts:{...e.texts},console:a}}function dR(i,e){const t=yp(i);return e.map(n=>zp(i,t,n))}function kp(i,e,t,n){if(typeof i!="string"){for(const s of hR(i.condition,e,n)?i.then:i.otherwise)kp(s,e,t,n);return}let a;if(a=/^(\w+)\.setText\((.*)\)$/.exec(i)){if(!(a[1]in e.texts))throw new Error(`${a[1]} ist keine Beschriftung und kein Knopf.`);e.texts[a[1]]=String(n1(a[2],e,n))}else if(a=/^System\.out\.println\((.*)\)$/.exec(i))t.push(String(n1(a[1],e,n)));else if(a=/^(\w+)\s*(\+\+|--)$/.exec(i))e.ints[Nm(a[1],e)]+=a[2]==="++"?1:-1;else if(a=/^(\w+)\s*([+-]?=)\s*(.+)$/.exec(i)){const s=Nm(a[1],e),r=Number(n1(a[3],e,n));e.ints[s]=a[2]==="="?r:a[2]==="+="?e.ints[s]+r:e.ints[s]-r}else throw new Error(`Diese Anweisung kann das Spiel nicht nachspielen: „${i}“`)}function hR(i,e,t){let n;if(n=/^e\.getSource\(\)\s*(==|!=)\s*(\w+)$/.exec(i)){if(!(n[2]in e.texts))throw new Error(`${n[2]} ist kein Knopf.`);return t.source===n[2]==(n[1]==="==")}if(n=/^(!?)(.+)\.equals\((.+)\)$/.exec(i))return String(n1(n[2],e,t))===String(n1(n[3],e,t))!=(n[1]==="!");if(n=/^(.+?)\s*(==|!=|<=|>=|<|>)\s*(.+)$/.exec(i)){const a=Number(n1(n[1],e,t)),s=Number(n1(n[3],e,t));return{"==":a===s,"!=":a!==s,"<=":a<=s,">=":a>=s,"<":a":a>s}[n[2]]}throw new Error(`Diese Bedingung kann das Spiel nicht nachspielen: „${i}“`)}function Nm(i,e){if(!(i in e.ints))throw new Error(`Variable ${i} ist nicht angelegt.`);return i}function n1(i,e,t){const n=i.match(new RegExp(`${gs}|\\d+|e\\.getActionCommand\\(\\)|\\w+(?:\\.getText\\(\\))?|[-+*/()]`,"g"))??[];let a=0;const s=()=>{const l=n[a++];if(l===void 0)throw new Error(`Unvollständiger Ausdruck „${i}“`);if(l==="("){const u=o();return a++,u}if(l.startsWith('"'))return JSON.parse(l);if(/^\d+$/.test(l))return Number(l);if(l==="e.getActionCommand()"){if(!t)throw new Error("e.getActionCommand() gibt es nur im Zuhörer.");return t.command}if(l.endsWith(".getText()"))return e.texts[l.slice(0,-10)]??"";if(l in e.ints)return e.ints[l];throw new Error(`Unbekannt: „${l}“`)},r=()=>{let l=s();for(;n[a]==="*"||n[a]==="/";){const u=n[a++],m=Number(s());l=u==="*"?Number(l)*m:Math.trunc(Number(l)/m)}return l},o=()=>{let l=r();for(;n[a]==="+"||n[a]==="-";){const u=n[a++],m=r();u==="+"?l=typeof l=="string"||typeof m=="string"?`${l}${m}`:l+m:l=Number(l)-Number(m)}return l};return o()}class Sp extends Error{}const Vs="___";function gR(i){const e=Array.from({length:i.rows},()=>Array(i.cols).fill(""));for(const t of i.words)[...t.word].forEach((n,a)=>e[t.row+(t.across?0:a)][t.col+(t.across?a:0)]=n);return e}function pR(i,e){const t=k=>{throw new Sp(`${e}: ${k}`)},n=(k,C)=>{const P=/^(\d+)\s+(\d+)$/.exec(k.trim());return!P||Number(P[1])<1||Number(P[2])<1?t(`${C}: „${k}“ ist kein Feld (Zeile Spalte, ab 1).`):{row:Number(P[1])-1,col:Number(P[2])-1}};let a="",s="",r="ABCDEFGHIJKLMNOPQRSTUVWXYZ",o="",l="",u="",m="";const c=[],d=[];let h=[],g,f="start";for(const k of i){const C=k.trim();if(g&&(/^( {4}|\t)/.test(k)||C==="")){const D=k.replace(/^( {4}|\t)/,"");if(g==="station"){const B=c[c.length-1];B.code+=(B.code?` -`:"")+D}else u+=(u?` -`:"")+D;continue}if(g=void 0,!C)continue;const P=/^(titel|intro|alphabet|station|frage|zahl|feld|tipp|kreuzwort|lösung|loesung|tor|ende):\s*(.*)$/.exec(C);if(P){const[,D,B]=P;if(D==="station")c.push({name:B,code:"",question:"",hint:"",explanation:""}),f="station",g="station";else if(D==="kreuzwort")o=B,f="crossword";else if(D==="tor")l=B,f="gate",g="gate";else if(D==="titel")a=B;else if(D==="intro")s=B;else if(D==="alphabet")r=B;else if(D==="ende")m=B;else if(D==="lösung"||D==="loesung")f!=="crossword"&&t("„lösung:“ gehört zum Kreuzworträtsel."),h=B.split(",").map(j=>n(j,"lösung"));else{f!=="station"&&t(`„${D}:“ gehört in eine Station.`);const j=c[c.length-1];D==="frage"?j.question=B:D==="tipp"?j.hint=B:D==="zahl"?j.answer=/^-?\d+$/.test(B)?Number(B):t(`Station „${j.name}“: „zahl:“ muss eine ganze Zahl sein.`):Object.assign(j,n(B,`Station „${j.name}“`))}continue}if(f==="crossword"){d.push(Tp(C,t));continue}if(f==="station"&&C.startsWith(">")){const D=c[c.length-1];D.explanation+=(D.explanation?" ":"")+C.slice(1).trim();continue}t(`Unbekannte Zeile im Spiel: „${C}“`)}a||t("Das Spiel braucht eine Zeile „titel:“."),c.length||t("Das Spiel braucht mindestens eine „station:“."),d.length||t("Das Spiel braucht ein „kreuzwort:“ mit Wörtern."),h.length||t("Das Kreuzworträtsel braucht eine Zeile „lösung:“."),u.includes(Vs)||t(`Der Code bei „tor:“ braucht ${Vs} für das Eingabefeld.`),new Set(r).size!==r.length&&t("Im Alphabet kommt ein Zeichen doppelt vor.");const{rows:b,cols:x,words:v,keyword:w,grid:z}=_p(d,h,t),I=(k,C)=>{var P;return((P=z[k])==null?void 0:P[C])??""},T=c.map(k=>{k.code||t(`Station „${k.name}“: Code fehlt.`),k.question||t(`Station „${k.name}“: „frage:“ fehlt.`),k.answer===void 0&&t(`Station „${k.name}“: „zahl:“ fehlt.`),k.row===void 0&&t(`Station „${k.name}“: „feld:“ fehlt.`);const C=r.charAt(k.answer);C||t(`Station „${k.name}“: alphabet.charAt(${k.answer}) gibt es nicht.`);const P=I(k.row,k.col);return P!==C&&t(`Station „${k.name}“: alphabet.charAt(${k.answer}) ist ${C}, im Feld ${k.row+1} ${k.col+1} steht aber „${P}“.`),k.code=k.code.replace(/\n+$/,""),k});return{title:a,intro:s,alphabet:r,stations:T,crosswordText:o,rows:b,cols:x,words:v,solution:h,keyword:w,gateText:l,gateCode:u.replace(/\n+$/,""),end:m}}const fR=/^-\s+([→↓])\s+(\d+)\s+(\d+)\s+([A-ZÄÖÜ]+):\s*(.+)$/u;function Tp(i,e){const t=fR.exec(i);return t||e(`Kreuzworträtsel: „${i}“ verstehe ich nicht (z. B. „- → 1 3 STRING: Hinweis“).`),{across:t[1]==="→",row:Number(t[2])-1,col:Number(t[3])-1,word:t[4],clue:t[5]}}function _p(i,e,t){const n=Math.max(...i.map(m=>m.row+(m.across?1:m.word.length))),a=Math.max(...i.map(m=>m.col+(m.across?m.word.length:1))),s=Array.from({length:n},()=>Array(a).fill(""));for(const m of i)[...m.word].forEach((c,d)=>{const h=m.row+(m.across?0:d),g=m.col+(m.across?d:0);s[h][g]&&s[h][g]!==c&&t(`Kreuzworträtsel: ${m.word} passt in Zeile ${h+1}, Spalte ${g+1} nicht (dort steht ${s[h][g]}).`),s[h][g]=c});const r=[...new Set(i.map(m=>m.row*a+m.col))].sort((m,c)=>m-c),o=i.map(m=>({...m,number:r.indexOf(m.row*a+m.col)+1})),l=(m,c)=>{var d;return((d=s[m])==null?void 0:d[c])??""},u=e.map(({row:m,col:c})=>l(m,c)||t(`lösung: In Zeile ${m+1}, Spalte ${c+1} ist kein Feld.`)).join("");return{rows:n,cols:a,words:o,keyword:u,grid:s}}function bR(i,e){const t=d=>{throw new Sp(`${e}: ${d}`)};let n="",a="",s="",r=[];const o=[];for(const d of i){const h=d.trim();if(!h)continue;const g=/^(titel|intro|lösung|loesung|ende):\s*(.*)$/.exec(h);if(g){const[,f,b]=g;f==="titel"?n=b:f==="intro"?a=b:f==="ende"?s=b:r=b.split(",").map(x=>{const v=/^(\d+)\s+(\d+)$/.exec(x.trim());return!v||Number(v[1])<1||Number(v[2])<1?t(`lösung: „${x.trim()}“ ist kein Feld (Zeile Spalte, ab 1).`):{row:Number(v[1])-1,col:Number(v[2])-1}});continue}h.startsWith("-")?o.push(Tp(h,t)):t(`Unbekannte Zeile im Spiel: „${h}“`)}n||t("Das Spiel braucht eine Zeile „titel:“."),o.length<2&&t("Das Rätsel braucht mindestens zwei Wörter."),r.length||t("Das Rätsel braucht eine Zeile „lösung:“.");const{rows:l,cols:u,words:m,keyword:c}=_p(o,r,t);return{title:n,intro:a,rows:l,cols:u,words:m,solution:r,keyword:c,end:s}}const xR=5e3;function Ap(i,e,t,n={}){const a=new Wi(i,e),s=new Js(t),r=m=>({pose:{...s.pose},trail:s.trail.map(c=>({...c})),leds:[...s.leds],screen:s.screen,tone:m}),o=[r()];let l=0;const u=(m,c)=>({frames:o,stop:m,notice:c,bumps:s.bumps,distance:Math.round(s.trail.slice(1).reduce((d,h,g)=>d+Math.hypot(h.x-s.trail[g].x,h.y-s.trail[g].y),0))});for(let m=0;mh!==0);s.tick(G0),d&&o.push(r())}return u("limit")}class vR extends Error{}function wR(i,e){const t=m=>{throw new vR(`${e}: ${m}`)};let n="",a="",s="",r=30;const o=[];let l,u=!1;for(const m of i){const c=m.trim();if(l&&u&&(/^ {4}|^\t/.test(m)||c==="")){l.code+=(l.code?` -`:"")+m.replace(/^( {4}|\t)/,"");continue}if(u=!1,!c)continue;const d=/^(titel|intro|frage|feld|runde|karte|ziel):\s*(.*)$/.exec(c);if(d){const[,h,g]=d;if(h==="runde")l={code:"",map:[],question:s,explanation:""},o.push(l),u=!0;else if(!l)h==="titel"?n=g:h==="intro"?a=g:h==="frage"?s=g:h==="feld"?r=[10,20,30].includes(Number(g))?Number(g):t("„feld:“ ist 10, 20 oder 30 (Zentimeter)."):t(`„${h}:“ gehört in eine Runde.`);else if(h==="frage")l.question=g;else if(h==="karte")l.map=g.split("|").map(f=>f.trim());else if(h==="ziel"){const f=/^(\d+)\s*,\s*(\d+)$/.exec(g);f||t(`„ziel: ${g}“ muss Spalte,Zeile sein, zum Beispiel „ziel: 2,0“.`),l.target={col:Number(f[1]),row:Number(f[2])}}else t(`„${h}:“ gehört vor die erste Runde.`);continue}l&&c.startsWith(">")?l.explanation+=(l.explanation?" ":"")+c.slice(1).trim():t(`Unbekannte Zeile im Spiel: „${c}“`)}return n||t("Das Spiel braucht eine Zeile „titel:“."),o.length||t("Das Spiel braucht mindestens eine „runde:“."),o.forEach((m,c)=>{m.code=m.code.replace(/\n+$/,""),m.code.trim()||t(`Runde ${c+1}: Code fehlt.`),(!m.map.length||m.map.some(d=>d.length!==m.map[0].length))&&t(`Runde ${c+1}: „karte:“ fehlt oder die Zeilen sind verschieden lang.`),m.map.join("").replace(/[^\^> v <).`),/[^.#=rgby^>=m.map.length||m.target.col>=m.map[0].length)&&t(`Runde ${c+1}: „ziel:“ liegt außerhalb der Karte.`),m.question||t(`Runde ${c+1}: keine Frage.`)}),{title:n,intro:a,field:r,rounds:o}}function jp(i,e){return Xg([`raster: ${e/10}`,...i.map].join(` -`))}function yR(i,e,t){const n=e.map[0].length*t,a=e.map.length*t,s=Math.floor((i.x+n/2)/t),r=Math.floor((a/2-i.y)/t);if(!(s<0||r<0||s>=e.map[0].length||r>=e.map.length))return{col:s,row:r}}const zR={condition:"Bedingung",selector:"Wert",code:"Dein Code",start:"Startwert",step:"Schritt",end:"Ende"};function IR(i,e){const t=Ji(i.code,zR),n=t.problems.map(o=>typeof o=="string"?o:JSON.stringify(o)),a=Gi({caption:"",elements:[]},t),s=Ap(a,void 0,jp(i,e)),r=s.frames[s.frames.length-1].pose;return{run:s,end:r,cell:yR(r,i,e),problems:n}}const kR=/\[\[(.+?)\]\]/g;function SR(i,e){const t={title:"",task:"",blocks:[]},n=[];let a=!1;for(const s of i){if(/^\s*```/.test(s)){a||n.push([]),a=!a;continue}if(a){n[n.length-1].push(s.replace(/\s+$/,""));continue}const r=s.trim();if(!r)continue;const o=/^([a-zäöü]+):\s*(.*)$/i.exec(r);if(!o)throw new Error(`${e}: Unbekannte Zeile im Lückentext: „${r}“.`);const l=o[2].trim();switch(o[1].toLowerCase()){case"titel":t.title=l;break;case"auftrag":t.task=l;break;case"erklärung":case"erklaerung":t.explanation=l;break;default:throw new Error(`${e}: Unbekannter Schlüssel „${o[1]}“ im Lückentext.`)}}if(a)throw new Error(`${e}: Der Codeblock im Lückentext wird nicht mit \`\`\` geschlossen.`);if(!t.title)throw new Error(`${e}: Ein Lückentext braucht einen Titel.`);if(!n.some(s=>s.some(r=>r.trim())))throw new Error(`${e}: Lückentext „${t.title}“ braucht einen Codeblock.`);if(t.blocks=n.map(s=>{const r=Math.min(...s.filter(o=>o.trim()).map(o=>/^ */.exec(o)[0].length));return s.map(o=>TR(o.slice(r),e,t.title))}),!_R(t).length)throw new Error(`${e}: Lückentext „${t.title}“ braucht mindestens eine Lücke [[…]].`);return t}function TR(i,e,t){const n=[];let a=0;for(const s of i.matchAll(kR)){s.index>a&&n.push(i.slice(a,s.index));const r=s[1].split(/\s+\|\s+/).map(o=>o.trim()).filter(Boolean);if(!r.length)throw new Error(`${e}: Leere Lücke im Lückentext „${t}“.`);n.push({answers:r}),a=s.index+s[0].length}if(atypeof s=="string"&&(s.includes("[[")||s.includes("]]"))))throw new Error(`${e}: Unvollständige Lücke im Lückentext „${t}“: „${i}“.`);return n}function _R(i){return i.blocks.flat().flatMap(e=>e.flatMap(t=>typeof t=="string"?[]:[t.answers]))}function AR(i,e){const t=n=>n.replace(/\s+/g,"");return t(e)!==""&&i.some(n=>t(n)===t(e))}const Fm={start:"oval",ende:"oval",anweisung:"rechteck",eingabe:"parallelogramm",ausgabe:"parallelogramm",frage:"raute"};function jR(i,e){const t={title:"",task:"",nodes:[]},n=[];for(const a of i){const s=a.trim();if(!s)continue;const r=/^([a-zäöü]+):\s*(.*)$/i.exec(s);if(!r)throw new Error(`${e}: Unbekannte Zeile im PAP: „${s}“.`);const o=r[1].toLowerCase(),l=r[2].trim();if(o==="titel")t.title=l;else if(o==="auftrag")t.task=l;else if(o==="erklärung"||o==="erklaerung")t.explanation=l;else if(o==="legende")t.legend=/^(ja|yes|true|sim)$/i.test(l);else if(o in Fm){const[u,m]=l.split(/\s+\|\s+/);if(!u)throw new Error(`${e}: Leeres Element im PAP: „${s}“.`);const c={shape:Fm[o],text:u.trim()};if(t.nodes.push(c),o!=="frage"){if(m)throw new Error(`${e}: Nur eine Frage hat einen zweiten Ausgang: „${s}“.`);continue}const d=/^(ja|nein)\s*(->|:)\s*(.+)$/i.exec(m??"");if(!d)throw new Error(`${e}: Eine Frage braucht „| nein -> Text“ oder „| nein: Text“: „${s}“.`);c.sideExit=d[1].toLowerCase(),d[2]===":"?(c.side=t.nodes.length,t.nodes.push({shape:"rechteck",text:d[3].trim(),isSide:!0})):n.push({node:t.nodes.length-1,target:d[3].trim(),line:s})}else throw new Error(`${e}: Unbekannter Schlüssel „${r[1]}“ im PAP.`)}for(const a of n){const s=t.nodes.findIndex((r,o)=>o{if(n.isSide)return;const s=MR(n.shape);(i.nodes.some(r=>r.backTo===a)||n.side!==void 0)&&(t+=12),e[a]={x:DR,y:t+s/2,w:n.shape==="raute"?170:n.shape==="oval"?110:BR,h:s},n.side!==void 0&&(e[n.side]={x:PR,y:t+s/2,w:OR,h:40}),t+=s+Rm}),{boxes:e,height:t-Rm+10}}function Cp(i,e){if((r=>r.length*6.6<=e)(i))return[i];const n=i.split(" ");let a=[i],s=1/0;for(let r=1;ru.length));l|→)\s*/);if(t.length!==2)throw new se(`${e}: Test „${i}“ braucht genau ein „->“.`);const n=(a,s)=>a.trim()===""||a.trim()==="-"?[]:a.split(s).map(r=>r.trim());return{inputs:n(t[0],/\s*,\s*/),expected:n(t[1],/\s*\|\s*/)}}function WR(i){const e=/^(.*?)\s*(?:->|→)\s*(.*)$/.exec(i.trim());if(!e)throw new Error(`„messwerte: ${i}“ braucht ein „->“.`);const t={};for(const n of e[1].split(/\s*,\s*/).filter(Boolean)){const a=/^(\w+)\s*=\s*(.+)$/.exec(n);if(!a||!(a[1]in Bt))throw new Error(`Unbekannter Sensor in „${n}“.`);t[a[1]]=a[2].split("/").map(s=>{const r=s.trim();if(r==="true"||r==="false")return r==="true";if(/^-?\d+(\.\d+)?$/.test(r))return Number(r);if(typeof Bt[a[1]].simulated=="string")return r;throw new Error(`Messwert „${r}“ ist keine Zahl und nicht true/false.`)})}return Pp({inputs:[],expected:[],sensors:t},e[2])}function Pp(i,e){const t=[];e=e.replace(/\bscreen\s+("(?:[^"\\]|\\.)*")/u,(n,a)=>(i.screen=JSON.parse(a),""));for(const n of e.split(/\s*,\s*/).filter(Boolean))n==="ledOn"||n==="ledOff"?i.led=n==="ledOn":n==="tone"||n==="noTone"?i.tone=n==="tone":n==="none"?i.drive=[]:n==="drives"?i.drives=!0:t.push(n);return t.length&&(i.drive=Bs(fg(t.join(", ")))),i}function ER(i,e,t){const n={id:i,title:"",task:"",tests:[],requires:[],hints:[],subprograms:[]};let a;for(const s of e){const r=/^(titel|auftrag|start|test|datei|fahrt|befehle|welt|messwerte|schleifentiefe|braucht|tipp|lösung|loesung|unterprogramm|code|bereich):\s*(.*)$/i.exec(s.trim());if(r){const[,o,l]=r;switch(a=void 0,o.toLowerCase()){case"titel":n.title=l;break;case"auftrag":n.task=l,a="task";break;case"start":n.start=l;break;case"test":n.tests.push(LR(l,t));break;case"datei":{const u=/^([\w.-]+)\s*(?:->|→)\s*(.*)$/.exec(l.trim());if(!u||!n.tests.length)throw new se(`${t}: Übung „${i}“: „datei:“ braucht vorher einen Test und die Form „name.txt -> Zeile | Zeile“.`);const m=n.tests[n.tests.length-1];m.files=[...m.files??[],{name:u[1],lines:u[2].trim()===""?[]:u[2].split(/\s*\|\s*/).map(c=>c.trim())}];break}case"fahrt":try{n.tests.push({inputs:[],expected:[],drive:Bs(fg(l))})}catch(u){throw new se(`${t}: Übung „${i}“: ${u.message}`)}break;case"welt":{const u=/^([\w-]+)\s*(?:->|→)\s*(.+)$/.exec(l.trim());if(u){try{n.tests.push(Pp({inputs:[],expected:[],world:u[1]},u[2]))}catch(m){throw new se(`${t}: Übung „${i}“: ${m.message}`)}break}for(const m of l.split(/\s*,\s*/).filter(Boolean)){if(!/^[\w-]+$/.test(m))throw new se(`${t}: Übung „${i}“: Weltname „${m}“ (nur Buchstaben, Ziffern, -).`);n.tests.push({inputs:[],expected:[],world:m})}break}case"befehle":try{n.tests.push({inputs:[],expected:[],actions:tx(l)})}catch(u){throw new se(`${t}: Übung „${i}“: ${u.message}`)}break;case"messwerte":try{n.tests.push(WR(l))}catch(u){throw new se(`${t}: Übung „${i}“: ${u.message}`)}break;case"schleifentiefe":if(n.loopDepth=Number(l),!Number.isInteger(n.loopDepth)||n.loopDepth<1)throw new se(`${t}: Übung „${i}“: „schleifentiefe:“ braucht eine Zahl ab 1.`);break;case"braucht":n.requires.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"tipp":n.hints.push(l),a="hint";break;case"lösung":case"loesung":n.solution=l;break;case"unterprogramm":n.subprograms.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"code":if(l.trim().toLowerCase()!=="java")throw new se(`${t}: Übung „${i}“: „code:“ kennt nur „java“.`);n.code="java";break;case"bereich":{const u=l.trim().toLowerCase();if(u!=="struktogramm"&&u!=="code"&&u!=="beide")throw new se(`${t}: Übung „${i}“: „bereich:“ kennt nur „struktogramm“, „code“ oder „beide“.`);n.area=u;break}}}else a&&s.trim()!==""?a==="task"?n.task+=` -`+s.trim():n.hints[n.hints.length-1]+=` -`+s.trim():s.trim()===""&&a==="task"&&(n.task+=` -`)}if(!n.title)throw new se(`${t}: Übung „${i}“ hat keinen Titel.`);if(!n.task.trim())throw new se(`${t}: Übung „${i}“ hat keinen Auftrag.`);return n.task=n.task.trim(),n}function NR(i,e){const t=[];for(const n of i){const a=n.trim();if(a.startsWith("?"))t.push({question:a.slice(1).trim(),options:[]});else if(/^- \[[ xX]\]/.test(a)){const s=t.at(-1);if(!s)throw new se(`${e}: Antwort ohne Frage im Quiz.`);s.options.push({text:a.slice(5).trim(),correct:a[3].toLowerCase()==="x"})}else if(a.startsWith("= ")){const s=t.at(-1),r=/^=\s+(.+?)\s+->\s+(.+)$/.exec(a);if(!s||!r)throw new se(`${e}: Zuordnung „${a}“ braucht die Form „= links -> rechts“ nach einer Frage.`);(s.pairs??(s.pairs=[])).push({left:r[1].trim(),right:r[2].trim()})}else if(a.startsWith("→")){const s=t.at(-1);if(!s)throw new se(`${e}: „→ Schritt“ ohne Frage im Quiz.`);s.ref=a.slice(1).trim()}else if(a.startsWith(">")){const s=t.at(-1);s&&(s.explanation=((s.explanation?s.explanation+" ":"")+a.slice(1).trim()).trim())}}for(const n of t){if(n.pairs){const a=new Set(n.pairs.map(s=>s.right));if(n.options.length>0||n.pairs.length<2||a.size!==n.pairs.length)throw new se(`${e}: Zuordnung „${n.question}“ braucht mindestens zwei Paare mit verschiedenen rechten Seiten und keine Antworten.`);continue}if(n.options.length<2||!n.options.some(a=>a.correct))throw new se(`${e}: Quizfrage „${n.question}“ braucht mindestens zwei Antworten, davon eine richtige.`)}return t}function Op(i,e){const t=[],n=i.split(` -`);let a=[];const s=()=>{const r=a.join(` -`).trim();r&&t.push({kind:"markdown",text:r}),a=[]};for(let r=0;r=n.length)throw new se(`${e}: Block „::: ${o[1]}“ wird nicht mit „:::“ geschlossen.`);const m=o[1].toLowerCase(),c=o[2].trim();switch(m){case"diagramm":if(!c)throw new se(`${e}: „::: diagramm“ braucht einen Dateinamen.`);t.push({kind:"diagram",file:c,caption:l.join(" ").trim()});break;case"übung":case"uebung":if(!c)throw new se(`${e}: „::: übung“ braucht eine Kennung.`);t.push({kind:"exercise",exercise:ER(c,l,e)});break;case"checkliste":t.push({kind:"checklist",items:l.map(d=>d.trim()).filter(d=>d.startsWith("- ")).map(d=>FR(d.slice(2).trim()))});break;case"kompetenzen":t.push({kind:"competences",items:l.map(d=>d.trim()).filter(d=>d.startsWith("- ")).map(d=>d.slice(2).trim())});break;case"quiz":t.push({kind:"quiz",questions:NR(l,e)});break;case"bild":if(!c)throw new se(`${e}: „::: bild“ braucht einen Dateinamen.`);t.push({kind:"images",files:c.split(/\s+/),caption:l.join(" ").trim()});break;case"grafik":if(!c)throw new se(`${e}: „::: grafik“ braucht einen Dateinamen.`);{const[d,h]=c.split(/\s+/),g=h==="animiert"?{animated:!0}:h?{labeled:h}:{};t.push({kind:"graphic",file:d,...g,caption:l.join(" ").trim()})}break;case"angeberwissen":t.push({kind:"brag",text:l.join(` -`).trim()});break;case"spiel":try{if(lR(c))t.push({kind:"roundGame",game:uR(c,l,e)});else if(c==="prinzessin")t.push({kind:"rescueGame",game:pR(l,e)});else if(c==="fahrt")t.push({kind:"driveGame",game:wR(l,e)});else if(c==="kreuzwort")t.push({kind:"crosswordGame",game:bR(l,e)});else{if(c)throw new se(`${e}: Unbekanntes Spiel „${c}“ (zuhoerer, vertrag, layout, bombe, frage, reihenfolge, prinzessin, fahrt oder kreuzwort).`);t.push({kind:"game",game:Ov(l,e)})}}catch(d){throw new se(d.message)}break;case"lückentext":case"lueckentext":try{t.push({kind:"cloze",cloze:SR(l,e)})}catch(d){throw new se(d.message)}break;case"pap":try{t.push({kind:"pap",pap:jR(l,e)})}catch(d){throw new se(d.message)}break;case"ludwig":t.push({kind:"brag",text:l.join(` -`).trim(),tip:!0});break;case"caesar":{const d=c?Number(c):3;if(!Number.isInteger(d)||d<0||d>25)throw new se(`${e}: „::: caesar“ braucht einen Schlüssel von 0 bis 25.`);t.push({kind:"caesar",key:d,text:l.join(" ").trim()});break}case"mbot2":{const d={kind:"robotModel",focus:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*(fokus|focus|ansicht|view|drehen|spin):\s*(.*)$/i.exec(h);if(!g)throw new se(`${e}: „::: mbot2“ kennt nur Zeilen „fokus:“, „ansicht:“ und „drehen:“.`);const f=g[1].toLowerCase();f==="fokus"||f==="focus"?d.focus=Jm(g[2],e):f==="ansicht"||f==="view"?d.view=g[2].trim().toLowerCase():d.spin=/^(ja|yes|true|sim)$/i.test(g[2].trim())}t.push(d);break}case"mbot2quiz":{const d={kind:"robotQuiz",tasks:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*-\s*(\w+)\s*:\s*(.+)$/.exec(h),f=/^\s*(fertig|done):\s*(.+)$/i.exec(h);if(g)d.tasks.push({part:Jm(g[1],e)[0],question:g[2].trim()});else if(f)d.done=f[2].trim();else throw new se(`${e}: „::: mbot2quiz“ braucht Zeilen „- teil: Frage“ und optional „fertig: Text“.`)}if(!d.tasks.length)throw new se(`${e}: „::: mbot2quiz“ hat keine Fragen.`);t.push(d);break}case"datei":{if(!/^[\w.-]+\.(txt|csv|json)$/u.test(c))throw new se(`${e}: „::: datei“ braucht einen Dateinamen wie brief.txt, liste.csv oder daten.json.`);for(;l.length&&l[0].trim()==="";)l.shift();for(;l.length&&l[l.length-1].trim()==="";)l.pop();t.push({kind:"textFile",name:c,content:l.join(` -`)});break}default:throw new se(`${e}: Unbekannter Block „::: ${o[1]}“.`)}r=u}return s(),t}function FR(i){const e=/^(.*?)\s+→\s+(.+)$/.exec(i);return e?{text:e[1],ref:e[2].trim()}:{text:i}}function RR(i,e){const t=new Map(i.map((a,s)=>[a.title.toLowerCase(),s]));for(const a of i.flatMap(s=>s.blocks))if(a.kind==="checklist"){for(const s of a.items)if(s.ref!==void 0&&(s.step=t.get(s.ref.toLowerCase()),s.step===void 0))throw new se(`${e}: Checkliste verweist auf unbekannten Schritt „${s.ref}“.`)}const n=new Set(i.flatMap(a=>a.blocks).flatMap(a=>a.kind==="checklist"?a.items.map(s=>s.step):[]));for(const a of i.flatMap(s=>s.blocks))if(a.kind==="quiz"){for(const s of a.questions)if(s.ref!==void 0){if(s.step=t.get(s.ref.toLowerCase()),s.step===void 0)throw new se(`${e}: Quizfrage „${s.question}“ verweist auf unbekannten Schritt „${s.ref}“.`);if(!n.has(s.step))throw new se(`${e}: Zu „${s.ref}“ (Quizfrage „${s.question}“) gibt es keinen Checklistenpunkt.`)}}}function JR(i,e){var c;const{meta:t,body:n}=Bp(i,e),a=e.replace(/^.*\//,"").replace(/\.md$/,""),s=Number((c=/^(\d+)/.exec(a))==null?void 0:c[1]);if(!Number.isFinite(s))throw new se(`${e}: Dateiname muss mit der Nummer beginnen (z. B. 01-…).`);const r=[];let o=[],l;const u=()=>{l&&r.push({title:l.title,blocks:Op(l.lines.join(` -`),e)})};for(const d of n.split(` -`)){const h=/^##\s+(.*)$/.exec(d);h?(u(),l={title:h[1].trim(),lines:[]}):l?l.lines.push(d):o.push(d)}if(u(),r.length===0)throw new se(`${e}: Keine Schritte (## Überschrift) gefunden.`);RR(r,e);const m=t.get("titel");if(!m)throw new se(`${e}: „titel:“ fehlt.`);return{id:a,number:s,title:m,section:t.get("bereich")??"",summary:t.get("kurz")??o.join(" ").trim(),steps:r}}function GR(i,e){const{meta:t,body:n}=Bp(i,e),a=t.get("titel");if(!a)throw new se(`${e}: „titel:“ fehlt.`);const s=t.get("nach");return{id:e.replace(/^.*\//,"").replace(/\.md$/,""),title:a,after:s?Number(s):void 0,level:Number(t.get("stufe")??"1")||1,blocks:Op(n,e)}}function Jm(i,e){const t=i.split(/\s*,\s*/).map(n=>n.trim()).filter(Boolean);for(const n of t)if(!ax(n))throw new se(`${e}: Unbekanntes Teil „${n}“. Bekannt: ${bg.join(", ")}.`);return t}const HR=Object.assign({"../../lessons/de/01-was-ist-ein-struktogramm.md":Fv,"../../lessons/de/01-weitere-darstellungen.md":Rv,"../../lessons/de/02-der-editor.md":Jv,"../../lessons/de/03-speichern-oeffnen-exportieren.md":Gv,"../../lessons/de/04-variablen-und-datentypen.md":Hv,"../../lessons/de/05-sequenz.md":Vv,"../../lessons/de/06-eingabe-und-ausgabe.md":qv,"../../lessons/de/07-simulation-und-schreibtischtest.md":Uv,"../../lessons/de/08-verzweigung.md":Qv,"../../lessons/de/09-bedingungen-verknuepfen.md":$v,"../../lessons/de/10-fallauswahl.md":Yv,"../../lessons/de/11-while-schleife.md":Kv,"../../lessons/de/12-do-while-schleife.md":Xv,"../../lessons/de/13-for-schleife.md":ew,"../../lessons/de/14-verschachteln.md":tw,"../../lessons/de/15-arrays.md":nw,"../../lessons/de/16-zweidimensionale-arrays.md":iw,"../../lessons/de/17-zeichenketten.md":aw,"../../lessons/de/18-aufruf-und-aussprung.md":sw,"../../lessons/de/19-suchen-und-sortieren.md":rw,"../../lessons/de/20-java.md":ow,"../../lessons/de/21-python-und-javascript.md":lw,"../../lessons/de/22-try-und-catch.md":uw,"../../lessons/de/23-text-einlesen-und-speichern.md":mw,"../../lessons/de/24-zeile-fuer-zeile.md":cw,"../../lessons/de/25-tabellen-als-csv.md":dw,"../../lessons/de/26-json.md":hw,"../../lessons/de/27-formate-im-vergleich.md":gw,"../../lessons/de/28-erstes-fenster.md":pw,"../../lessons/de/29-knopf-im-fenster.md":fw,"../../lessons/de/30-der-knopf-reagiert.md":bw,"../../lessons/de/31-zahl-verdoppeln.md":xw,"../../lessons/de/32-klickzaehler.md":vw,"../../lessons/de/33-ampel.md":ww,"../../lessons/de/34-notenrechner.md":yw,"../../lessons/de/35-taschenrechner.md":zw,"../../lessons/de/36-zahlenraten.md":Iw,"../../lessons/de/37-viele-knoepfe-ein-zuhoerer.md":kw,"../../lessons/de/38-innere-klassen.md":Sw,"../../lessons/de/39-zwei-reiter.md":Tw,"../../lessons/de/40-model-view-controller.md":_w,"../../lessons/de/begriffe.md":Aw,"../../lessons/de/nachschlagen.md":jw,"../../lessons/en/01-was-ist-ein-struktogramm.md":Cw,"../../lessons/en/01-weitere-darstellungen.md":Dw,"../../lessons/en/02-der-editor.md":Bw,"../../lessons/en/03-speichern-oeffnen-exportieren.md":Pw,"../../lessons/en/04-variablen-und-datentypen.md":Ow,"../../lessons/en/05-sequenz.md":Mw,"../../lessons/en/06-eingabe-und-ausgabe.md":Zw,"../../lessons/en/07-simulation-und-schreibtischtest.md":Lw,"../../lessons/en/08-verzweigung.md":Ww,"../../lessons/en/09-bedingungen-verknuepfen.md":Ew,"../../lessons/en/10-fallauswahl.md":Nw,"../../lessons/en/11-while-schleife.md":Fw,"../../lessons/en/12-do-while-schleife.md":Rw,"../../lessons/en/13-for-schleife.md":Jw,"../../lessons/en/14-verschachteln.md":Gw,"../../lessons/en/15-arrays.md":Hw,"../../lessons/en/16-zweidimensionale-arrays.md":Vw,"../../lessons/en/17-zeichenketten.md":qw,"../../lessons/en/18-aufruf-und-aussprung.md":Uw,"../../lessons/en/19-suchen-und-sortieren.md":Qw,"../../lessons/en/20-java.md":$w,"../../lessons/en/21-python-und-javascript.md":Yw,"../../lessons/en/22-try-und-catch.md":Kw,"../../lessons/en/23-text-einlesen-und-speichern.md":Xw,"../../lessons/en/24-zeile-fuer-zeile.md":ey,"../../lessons/en/25-tabellen-als-csv.md":ty,"../../lessons/en/26-json.md":ny,"../../lessons/en/27-formate-im-vergleich.md":iy,"../../lessons/en/28-erstes-fenster.md":ay,"../../lessons/en/29-knopf-im-fenster.md":sy,"../../lessons/en/30-der-knopf-reagiert.md":ry,"../../lessons/en/31-zahl-verdoppeln.md":oy,"../../lessons/en/32-klickzaehler.md":ly,"../../lessons/en/33-ampel.md":uy,"../../lessons/en/34-notenrechner.md":my,"../../lessons/en/35-taschenrechner.md":cy,"../../lessons/en/36-zahlenraten.md":dy,"../../lessons/en/37-viele-knoepfe-ein-zuhoerer.md":hy,"../../lessons/en/38-innere-klassen.md":gy,"../../lessons/en/39-zwei-reiter.md":py,"../../lessons/en/40-model-view-controller.md":fy,"../../lessons/en/begriffe.md":by,"../../lessons/en/nachschlagen.md":xy,"../../lessons/pt/01-was-ist-ein-struktogramm.md":vy,"../../lessons/pt/01-weitere-darstellungen.md":wy,"../../lessons/pt/02-der-editor.md":yy,"../../lessons/pt/03-speichern-oeffnen-exportieren.md":zy,"../../lessons/pt/04-variablen-und-datentypen.md":Iy,"../../lessons/pt/05-sequenz.md":ky,"../../lessons/pt/06-eingabe-und-ausgabe.md":Sy,"../../lessons/pt/07-simulation-und-schreibtischtest.md":Ty,"../../lessons/pt/08-verzweigung.md":_y,"../../lessons/pt/09-bedingungen-verknuepfen.md":Ay,"../../lessons/pt/10-fallauswahl.md":jy,"../../lessons/pt/11-while-schleife.md":Cy,"../../lessons/pt/12-do-while-schleife.md":Dy,"../../lessons/pt/13-for-schleife.md":By,"../../lessons/pt/14-verschachteln.md":Py,"../../lessons/pt/15-arrays.md":Oy,"../../lessons/pt/16-zweidimensionale-arrays.md":My,"../../lessons/pt/17-zeichenketten.md":Zy,"../../lessons/pt/18-aufruf-und-aussprung.md":Ly,"../../lessons/pt/19-suchen-und-sortieren.md":Wy,"../../lessons/pt/20-java.md":Ey,"../../lessons/pt/21-python-und-javascript.md":Ny,"../../lessons/pt/22-try-und-catch.md":Fy,"../../lessons/pt/23-text-einlesen-und-speichern.md":Ry,"../../lessons/pt/24-zeile-fuer-zeile.md":Jy,"../../lessons/pt/25-tabellen-als-csv.md":Gy,"../../lessons/pt/26-json.md":Hy,"../../lessons/pt/27-formate-im-vergleich.md":Vy,"../../lessons/pt/28-erstes-fenster.md":qy,"../../lessons/pt/29-knopf-im-fenster.md":Uy,"../../lessons/pt/30-der-knopf-reagiert.md":Qy,"../../lessons/pt/31-zahl-verdoppeln.md":$y,"../../lessons/pt/32-klickzaehler.md":Yy,"../../lessons/pt/33-ampel.md":Ky,"../../lessons/pt/34-notenrechner.md":Xy,"../../lessons/pt/35-taschenrechner.md":e9,"../../lessons/pt/36-zahlenraten.md":t9,"../../lessons/pt/37-viele-knoepfe-ein-zuhoerer.md":n9,"../../lessons/pt/38-innere-klassen.md":i9,"../../lessons/pt/39-zwei-reiter.md":a9,"../../lessons/pt/40-model-view-controller.md":s9,"../../lessons/pt/begriffe.md":r9,"../../lessons/pt/nachschlagen.md":o9}),VR=Object.assign({"../../lessons/de/aufgaben/alter-unterprogramm.md":l9,"../../lessons/de/aufgaben/ballwurf.md":u9,"../../lessons/de/aufgaben/bestenliste.md":m9,"../../lessons/de/aufgaben/binaerzahl.md":c9,"../../lessons/de/aufgaben/caesar.md":d9,"../../lessons/de/aufgaben/collatz.md":h9,"../../lessons/de/aufgaben/einheitenrechner.md":g9,"../../lessons/de/aufgaben/fibonacci.md":p9,"../../lessons/de/aufgaben/gerade-ungerade.md":f9,"../../lessons/de/aufgaben/mehrwertsteuer.md":b9,"../../lessons/de/aufgaben/notendurchschnitt.md":x9,"../../lessons/de/aufgaben/pin-pruefen.md":v9,"../../lessons/de/aufgaben/schiffe-versenken.md":w9,"../../lessons/de/aufgaben/speisekarte.md":y9,"../../lessons/de/aufgaben/summe-bilden.md":z9,"../../lessons/de/aufgaben/tafeldienst.md":I9,"../../lessons/de/aufgaben/taschenrechner.md":k9,"../../lessons/de/aufgaben/verleih-menue.md":S9,"../../lessons/de/aufgaben/vokabeltrainer.md":T9,"../../lessons/de/aufgaben/volljaehrig.md":_9,"../../lessons/de/aufgaben/wuerfel-mvc.md":A9,"../../lessons/de/aufgaben/zahl-verdoppeln.md":j9,"../../lessons/en/aufgaben/alter-unterprogramm.md":C9,"../../lessons/en/aufgaben/ballwurf.md":D9,"../../lessons/en/aufgaben/bestenliste.md":B9,"../../lessons/en/aufgaben/binaerzahl.md":P9,"../../lessons/en/aufgaben/caesar.md":O9,"../../lessons/en/aufgaben/collatz.md":M9,"../../lessons/en/aufgaben/einheitenrechner.md":Z9,"../../lessons/en/aufgaben/fibonacci.md":L9,"../../lessons/en/aufgaben/gerade-ungerade.md":W9,"../../lessons/en/aufgaben/mehrwertsteuer.md":E9,"../../lessons/en/aufgaben/notendurchschnitt.md":N9,"../../lessons/en/aufgaben/pin-pruefen.md":F9,"../../lessons/en/aufgaben/schiffe-versenken.md":R9,"../../lessons/en/aufgaben/speisekarte.md":J9,"../../lessons/en/aufgaben/summe-bilden.md":G9,"../../lessons/en/aufgaben/tafeldienst.md":H9,"../../lessons/en/aufgaben/taschenrechner.md":V9,"../../lessons/en/aufgaben/verleih-menue.md":q9,"../../lessons/en/aufgaben/vokabeltrainer.md":U9,"../../lessons/en/aufgaben/volljaehrig.md":Q9,"../../lessons/en/aufgaben/wuerfel-mvc.md":$9,"../../lessons/en/aufgaben/zahl-verdoppeln.md":Y9,"../../lessons/pt/aufgaben/alter-unterprogramm.md":K9,"../../lessons/pt/aufgaben/ballwurf.md":X9,"../../lessons/pt/aufgaben/bestenliste.md":e5,"../../lessons/pt/aufgaben/binaerzahl.md":t5,"../../lessons/pt/aufgaben/caesar.md":n5,"../../lessons/pt/aufgaben/collatz.md":i5,"../../lessons/pt/aufgaben/einheitenrechner.md":a5,"../../lessons/pt/aufgaben/fibonacci.md":s5,"../../lessons/pt/aufgaben/gerade-ungerade.md":r5,"../../lessons/pt/aufgaben/mehrwertsteuer.md":o5,"../../lessons/pt/aufgaben/notendurchschnitt.md":l5,"../../lessons/pt/aufgaben/pin-pruefen.md":u5,"../../lessons/pt/aufgaben/schiffe-versenken.md":m5,"../../lessons/pt/aufgaben/speisekarte.md":c5,"../../lessons/pt/aufgaben/summe-bilden.md":d5,"../../lessons/pt/aufgaben/tafeldienst.md":h5,"../../lessons/pt/aufgaben/taschenrechner.md":g5,"../../lessons/pt/aufgaben/verleih-menue.md":p5,"../../lessons/pt/aufgaben/vokabeltrainer.md":f5,"../../lessons/pt/aufgaben/volljaehrig.md":b5,"../../lessons/pt/aufgaben/wuerfel-mvc.md":x5,"../../lessons/pt/aufgaben/zahl-verdoppeln.md":v5}),Gm=Object.assign({"../../lessons/de/visubot/00-struktogramm-und-editor.md":w5,"../../lessons/de/visubot/01-der-mbot2.md":y5,"../../lessons/de/visubot/02-das-quadrat.md":z5,"../../lessons/de/visubot/02-quadrat-als-pap.md":I5,"../../lessons/de/visubot/03-variablen-und-ausgabe.md":k5,"../../lessons/de/visubot/03-zeile-fuer-zeile-testen.md":S5,"../../lessons/de/visubot/04-sensoren.md":T5,"../../lessons/de/visubot/05-bis-zur-wand.md":_5,"../../lessons/de/visubot/05-erst-fahren-dann-pruefen.md":A5,"../../lessons/de/visubot/05-zaehlen-und-summieren.md":j5,"../../lessons/de/visubot/06-abstand.md":C5,"../../lessons/de/visubot/06-konstanten-final.md":D5,"../../lessons/de/visubot/06-nah-mittel-weit.md":B5,"../../lessons/de/visubot/07-linie.md":P5,"../../lessons/de/visubot/07-und-oder.md":O5,"../../lessons/de/visubot/08-farben.md":M5,"../../lessons/de/visubot/08-groesster-wert.md":Z5,"../../lessons/de/visubot/09-fallauswahl-mbot2.md":L5,"../../lessons/de/visubot/10-tasten-joystick.md":W5,"../../lessons/de/visubot/10-unterbrechen-mit-break.md":E5,"../../lessons/de/visubot/11-licht.md":N5,"../../lessons/de/visubot/11-merker-boolean.md":F5,"../../lessons/de/visubot/12-lautstaerke.md":R5,"../../lessons/de/visubot/13-neigung.md":J5,"../../lessons/de/visubot/14-leds.md":G5,"../../lessons/de/visubot/15-einzelne-leds.md":H5,"../../lessons/de/visubot/16-lautsprecher.md":V5,"../../lessons/de/visubot/17-arrays-melodie.md":q5,"../../lessons/de/visubot/18-bildschirm.md":U5,"../../lessons/de/visubot/19-zeichenketten.md":Q5,"../../lessons/de/visubot/20-motoren.md":$5,"../../lessons/de/visubot/21-stoppuhr-akku.md":Y5,"../../lessons/de/visubot/21-zustaende.md":K5,"../../lessons/de/visubot/22-eigene-methoden.md":X5,"../../lessons/de/visubot/23-wie-geht-es-weiter.md":ez,"../../lessons/de/visubot/nachschlagen.md":tz,"../../lessons/en/visubot/00-struktogramm-und-editor.md":nz,"../../lessons/en/visubot/01-der-mbot2.md":iz,"../../lessons/en/visubot/02-das-quadrat.md":az,"../../lessons/en/visubot/02-quadrat-als-pap.md":sz,"../../lessons/en/visubot/03-variablen-und-ausgabe.md":rz,"../../lessons/en/visubot/03-zeile-fuer-zeile-testen.md":oz,"../../lessons/en/visubot/04-sensoren.md":lz,"../../lessons/en/visubot/05-bis-zur-wand.md":uz,"../../lessons/en/visubot/05-erst-fahren-dann-pruefen.md":mz,"../../lessons/en/visubot/05-zaehlen-und-summieren.md":cz,"../../lessons/en/visubot/06-abstand.md":dz,"../../lessons/en/visubot/06-konstanten-final.md":hz,"../../lessons/en/visubot/06-nah-mittel-weit.md":gz,"../../lessons/en/visubot/07-linie.md":pz,"../../lessons/en/visubot/07-und-oder.md":fz,"../../lessons/en/visubot/08-farben.md":bz,"../../lessons/en/visubot/08-groesster-wert.md":xz,"../../lessons/en/visubot/09-fallauswahl-mbot2.md":vz,"../../lessons/en/visubot/10-tasten-joystick.md":wz,"../../lessons/en/visubot/10-unterbrechen-mit-break.md":yz,"../../lessons/en/visubot/11-licht.md":zz,"../../lessons/en/visubot/11-merker-boolean.md":Iz,"../../lessons/en/visubot/12-lautstaerke.md":kz,"../../lessons/en/visubot/13-neigung.md":Sz,"../../lessons/en/visubot/14-leds.md":Tz,"../../lessons/en/visubot/15-einzelne-leds.md":_z,"../../lessons/en/visubot/16-lautsprecher.md":Az,"../../lessons/en/visubot/17-arrays-melodie.md":jz,"../../lessons/en/visubot/18-bildschirm.md":Cz,"../../lessons/en/visubot/19-zeichenketten.md":Dz,"../../lessons/en/visubot/20-motoren.md":Bz,"../../lessons/en/visubot/21-stoppuhr-akku.md":Pz,"../../lessons/en/visubot/21-zustaende.md":Oz,"../../lessons/en/visubot/22-eigene-methoden.md":Mz,"../../lessons/en/visubot/23-wie-geht-es-weiter.md":Zz,"../../lessons/en/visubot/nachschlagen.md":Lz}),qR=Object.assign({"../../lessons/de/visubot/bloecke/01-losfahren.md":Wz,"../../lessons/de/visubot/bloecke/02-immer-wieder.md":Ez,"../../lessons/de/visubot/bloecke/03-der-mbot2-misst.md":Nz,"../../lessons/de/visubot/bloecke/04-entscheidungen.md":Fz,"../../lessons/de/visubot/bloecke/05-lichter-und-toene.md":Rz,"../../lessons/de/visubot/bloecke/06-immer-wieder-pruefen.md":Jz,"../../lessons/de/visubot/bloecke/07-der-linie-folgen.md":Gz,"../../lessons/de/visubot/bloecke/08-parcours.md":Hz}),UR=Object.assign({"../../lessons/de/visubot/bloecke/aufgaben/block-ausgang.md":Vz,"../../lessons/de/visubot/bloecke/aufgaben/block-disco.md":qz,"../../lessons/de/visubot/bloecke/aufgaben/block-slalom.md":Uz,"../../lessons/de/visubot/bloecke/aufgaben/block-wald.md":Qz}),QR=Object.assign({"../../lessons/de/visubot/aufgaben/alarmanlage.md":$z,"../../lessons/de/visubot/aufgaben/ausgang.md":Yz,"../../lessons/de/visubot/aufgaben/binaer-zaehlen.md":Kz,"../../lessons/de/visubot/aufgaben/dreieck.md":Xz,"../../lessons/de/visubot/aufgaben/einparken.md":e6,"../../lessons/de/visubot/aufgaben/hindernis.md":t6,"../../lessons/de/visubot/aufgaben/knight-rider.md":n6,"../../lessons/de/visubot/aufgaben/labyrinth.md":i6,"../../lessons/de/visubot/aufgaben/linienfolger-stopp.md":a6,"../../lessons/de/visubot/aufgaben/morsen.md":s6,"../../lessons/de/visubot/aufgaben/nachtwaechter.md":r6,"../../lessons/de/visubot/aufgaben/slalom.md":o6,"../../lessons/de/visubot/aufgaben/spirale.md":l6,"../../lessons/de/visubot/aufgaben/treppe.md":u6,"../../lessons/de/visubot/aufgaben/tunnel.md":m6,"../../lessons/de/visubot/aufgaben/wald.md":c6,"../../lessons/en/visubot/aufgaben/alarmanlage.md":d6,"../../lessons/en/visubot/aufgaben/ausgang.md":h6,"../../lessons/en/visubot/aufgaben/binaer-zaehlen.md":g6,"../../lessons/en/visubot/aufgaben/dreieck.md":p6,"../../lessons/en/visubot/aufgaben/einparken.md":f6,"../../lessons/en/visubot/aufgaben/hindernis.md":b6,"../../lessons/en/visubot/aufgaben/knight-rider.md":x6,"../../lessons/en/visubot/aufgaben/labyrinth.md":v6,"../../lessons/en/visubot/aufgaben/linienfolger-stopp.md":w6,"../../lessons/en/visubot/aufgaben/morsen.md":y6,"../../lessons/en/visubot/aufgaben/nachtwaechter.md":z6,"../../lessons/en/visubot/aufgaben/slalom.md":I6,"../../lessons/en/visubot/aufgaben/spirale.md":k6,"../../lessons/en/visubot/aufgaben/treppe.md":S6,"../../lessons/en/visubot/aufgaben/tunnel.md":T6,"../../lessons/en/visubot/aufgaben/wald.md":_6}),$R=Object.assign({"../../lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct":A6,"../../lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct":j6,"../../lessons/diagramme/aufgabe-ballwurf-loesung.visustruct":C6,"../../lessons/diagramme/aufgabe-ballwurf-start.visustruct":D6,"../../lessons/diagramme/aufgabe-bestenliste-loesung.visustruct":B6,"../../lessons/diagramme/aufgabe-binaer-loesung.visustruct":P6,"../../lessons/diagramme/aufgabe-caesar-array-loesung.visustruct":O6,"../../lessons/diagramme/aufgabe-caesar-array-start.visustruct":M6,"../../lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct":Z6,"../../lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct":L6,"../../lessons/diagramme/aufgabe-collatz-loesung.visustruct":W6,"../../lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct":E6,"../../lessons/diagramme/aufgabe-fibonacci-loesung.visustruct":N6,"../../lessons/diagramme/aufgabe-gerade-loesung.visustruct":F6,"../../lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct":R6,"../../lessons/diagramme/aufgabe-pin-java-loesung.visustruct":J6,"../../lessons/diagramme/aufgabe-pin-loesung.visustruct":G6,"../../lessons/diagramme/aufgabe-rechner-loesung.visustruct":H6,"../../lessons/diagramme/aufgabe-schiffe-loesung.visustruct":V6,"../../lessons/diagramme/aufgabe-schiffe-start.visustruct":q6,"../../lessons/diagramme/aufgabe-speisekarte-loesung.visustruct":U6,"../../lessons/diagramme/aufgabe-summe-loesung.visustruct":Q6,"../../lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct":$6,"../../lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct":Y6,"../../lessons/diagramme/aufgabe-verleih-java-loesung.visustruct":K6,"../../lessons/diagramme/aufgabe-verleih-loesung.visustruct":X6,"../../lessons/diagramme/aufgabe-vokabeln-loesung.visustruct":eI,"../../lessons/diagramme/aufgabe-vokabeln-start.visustruct":tI,"../../lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct":nI,"../../lessons/diagramme/dt-buffered.visustruct":iI,"../../lessons/diagramme/dt-csv.visustruct":aI,"../../lessons/diagramme/dt-json.visustruct":sI,"../../lessons/diagramme/dt-lesen.visustruct":rI,"../../lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct":oI,"../../lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct":lI,"../../lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct":uI,"../../lessons/diagramme/en/aufgabe-ballwurf-start.visustruct":mI,"../../lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct":cI,"../../lessons/diagramme/en/aufgabe-binaer-loesung.visustruct":dI,"../../lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct":hI,"../../lessons/diagramme/en/aufgabe-caesar-array-start.visustruct":gI,"../../lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct":pI,"../../lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct":fI,"../../lessons/diagramme/en/aufgabe-collatz-loesung.visustruct":bI,"../../lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct":xI,"../../lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct":vI,"../../lessons/diagramme/en/aufgabe-gerade-loesung.visustruct":wI,"../../lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct":yI,"../../lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct":zI,"../../lessons/diagramme/en/aufgabe-pin-loesung.visustruct":II,"../../lessons/diagramme/en/aufgabe-rechner-loesung.visustruct":kI,"../../lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct":SI,"../../lessons/diagramme/en/aufgabe-schiffe-start.visustruct":TI,"../../lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct":_I,"../../lessons/diagramme/en/aufgabe-summe-loesung.visustruct":AI,"../../lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct":jI,"../../lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct":CI,"../../lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct":DI,"../../lessons/diagramme/en/aufgabe-verleih-loesung.visustruct":BI,"../../lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct":PI,"../../lessons/diagramme/en/aufgabe-vokabeln-start.visustruct":OI,"../../lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct":MI,"../../lessons/diagramme/en/dt-buffered.visustruct":ZI,"../../lessons/diagramme/en/dt-csv.visustruct":LI,"../../lessons/diagramme/en/dt-json.visustruct":WI,"../../lessons/diagramme/en/dt-lesen.visustruct":EI,"../../lessons/diagramme/en/kino-einmaleins-loesung.visustruct":NI,"../../lessons/diagramme/en/kino-frei-loesung.visustruct":FI,"../../lessons/diagramme/en/kino-frei-start.visustruct":RI,"../../lessons/diagramme/en/kino-karte-loesung.visustruct":JI,"../../lessons/diagramme/en/kino-karte-start.visustruct":GI,"../../lessons/diagramme/en/kino-saalplan.visustruct":HI,"../../lessons/diagramme/en/kino-verkaufen.visustruct":VI,"../../lessons/diagramme/en/l04-gross-klein-loesung.visustruct":qI,"../../lessons/diagramme/en/l04-gross-klein-start.visustruct":UI,"../../lessons/diagramme/en/l04-java-fehler-loesung.visustruct":QI,"../../lessons/diagramme/en/l04-java-fehler-start.visustruct":$I,"../../lessons/diagramme/en/l04-java-laeuft-nicht-loesung.visustruct":YI,"../../lessons/diagramme/en/l04-java-laeuft-nicht-start.visustruct":KI,"../../lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct":XI,"../../lessons/diagramme/en/l04-rechnen.visustruct":ek,"../../lessons/diagramme/en/l04-reihenfolge-loesung.visustruct":tk,"../../lessons/diagramme/en/l04-reihenfolge-start.visustruct":nk,"../../lessons/diagramme/en/l04-tauschen-loesung.visustruct":ik,"../../lessons/diagramme/en/l04-tauschen-start.visustruct":ak,"../../lessons/diagramme/en/l04-tauschen.visustruct":sk,"../../lessons/diagramme/en/l05-datentypen.visustruct":rk,"../../lessons/diagramme/en/l05-division.visustruct":ok,"../../lessons/diagramme/en/l05-einkauf-loesung.visustruct":lk,"../../lessons/diagramme/en/l05-java-fehler-loesung.visustruct":uk,"../../lessons/diagramme/en/l05-java-fehler-start.visustruct":mk,"../../lessons/diagramme/en/l05-java-kino-loesung.visustruct":ck,"../../lessons/diagramme/en/l05-java-laeuft-nicht-loesung.visustruct":dk,"../../lessons/diagramme/en/l05-java-laeuft-nicht-start.visustruct":hk,"../../lessons/diagramme/en/l05-rechteck-loesung.visustruct":gk,"../../lessons/diagramme/en/l05-sekunden-loesung.visustruct":pk,"../../lessons/diagramme/en/l05-sekunden-start.visustruct":fk,"../../lessons/diagramme/en/l05-sequenz.visustruct":bk,"../../lessons/diagramme/en/l06-begruessung-loesung.visustruct":xk,"../../lessons/diagramme/en/l06-eva.visustruct":vk,"../../lessons/diagramme/en/l06-java-fehler-loesung.visustruct":wk,"../../lessons/diagramme/en/l06-java-fehler-start.visustruct":yk,"../../lessons/diagramme/en/l06-java-laeuft-nicht-loesung.visustruct":zk,"../../lessons/diagramme/en/l06-java-laeuft-nicht-start.visustruct":Ik,"../../lessons/diagramme/en/l06-java-tage-loesung.visustruct":kk,"../../lessons/diagramme/en/l06-mittelwert-loesung.visustruct":Sk,"../../lessons/diagramme/en/l06-rechner-loesung.visustruct":Tk,"../../lessons/diagramme/en/l07-alter-pruefen.visustruct":_k,"../../lessons/diagramme/en/l07-betrag-loesung.visustruct":Ak,"../../lessons/diagramme/en/l07-gerade-loesung.visustruct":jk,"../../lessons/diagramme/en/l07-java-fehler-loesung.visustruct":Ck,"../../lessons/diagramme/en/l07-java-fehler-start.visustruct":Dk,"../../lessons/diagramme/en/l07-java-laeuft-nicht-loesung.visustruct":Bk,"../../lessons/diagramme/en/l07-java-laeuft-nicht-start.visustruct":Pk,"../../lessons/diagramme/en/l07-java-pizza-loesung.visustruct":Ok,"../../lessons/diagramme/en/l07-java-pizza-start.visustruct":Mk,"../../lessons/diagramme/en/l07-maximum-loesung.visustruct":Zk,"../../lessons/diagramme/en/l07-rabatt.visustruct":Lk,"../../lessons/diagramme/en/l08-gueltig-loesung.visustruct":Wk,"../../lessons/diagramme/en/l08-java-bestanden-loesung.visustruct":Ek,"../../lessons/diagramme/en/l08-java-fehler-loesung.visustruct":Nk,"../../lessons/diagramme/en/l08-java-fehler-start.visustruct":Fk,"../../lessons/diagramme/en/l08-java-laeuft-nicht-loesung.visustruct":Rk,"../../lessons/diagramme/en/l08-java-laeuft-nicht-start.visustruct":Jk,"../../lessons/diagramme/en/l08-jugendticket.visustruct":Gk,"../../lessons/diagramme/en/l08-note.visustruct":Hk,"../../lessons/diagramme/en/l08-schaltjahr-loesung.visustruct":Vk,"../../lessons/diagramme/en/l08-wochenende-loesung.visustruct":qk,"../../lessons/diagramme/en/l09-ampel.visustruct":Uk,"../../lessons/diagramme/en/l09-automat.visustruct":Qk,"../../lessons/diagramme/en/l09-java-fehler-loesung.visustruct":$k,"../../lessons/diagramme/en/l09-java-fehler-start.visustruct":Yk,"../../lessons/diagramme/en/l09-java-laeuft-nicht-loesung.visustruct":Kk,"../../lessons/diagramme/en/l09-java-laeuft-nicht-start.visustruct":Xk,"../../lessons/diagramme/en/l09-java-schule-loesung.visustruct":e7,"../../lessons/diagramme/en/l09-note-loesung.visustruct":t7,"../../lessons/diagramme/en/l09-rechner-loesung.visustruct":n7,"../../lessons/diagramme/en/l09-verschachtelt.visustruct":i7,"../../lessons/diagramme/en/l1-grundbausteine.visustruct":a7,"../../lessons/diagramme/en/l1-sequenz.visustruct":s7,"../../lessons/diagramme/en/l1-tee.visustruct":r7,"../../lessons/diagramme/en/l1-verzweigung.visustruct":o7,"../../lessons/diagramme/en/l1-wiederholung.visustruct":l7,"../../lessons/diagramme/en/l10-bis-n-loesung.visustruct":u7,"../../lessons/diagramme/en/l10-countdown.visustruct":m7,"../../lessons/diagramme/en/l10-endlos.visustruct":c7,"../../lessons/diagramme/en/l10-fakultaet.visustruct":d7,"../../lessons/diagramme/en/l10-java-fehler-loesung.visustruct":h7,"../../lessons/diagramme/en/l10-java-fehler-start.visustruct":g7,"../../lessons/diagramme/en/l10-java-laeuft-nicht-loesung.visustruct":p7,"../../lessons/diagramme/en/l10-java-laeuft-nicht-start.visustruct":f7,"../../lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct":b7,"../../lessons/diagramme/en/l10-verdoppeln-loesung.visustruct":x7,"../../lessons/diagramme/en/l11-eingabe-pruefen.visustruct":v7,"../../lessons/diagramme/en/l11-einmal.visustruct":w7,"../../lessons/diagramme/en/l11-java-fehler-loesung.visustruct":y7,"../../lessons/diagramme/en/l11-java-fehler-start.visustruct":z7,"../../lessons/diagramme/en/l11-java-gerade-loesung.visustruct":I7,"../../lessons/diagramme/en/l11-java-laeuft-nicht-loesung.visustruct":k7,"../../lessons/diagramme/en/l11-java-laeuft-nicht-start.visustruct":S7,"../../lessons/diagramme/en/l11-note-loesung.visustruct":T7,"../../lessons/diagramme/en/l11-summe-loesung.visustruct":_7,"../../lessons/diagramme/en/l12-countdown-loesung.visustruct":A7,"../../lessons/diagramme/en/l12-einmaleins-loesung.visustruct":j7,"../../lessons/diagramme/en/l12-eins-bis-fuenf.visustruct":C7,"../../lessons/diagramme/en/l12-java-fehler-loesung.visustruct":D7,"../../lessons/diagramme/en/l12-java-fehler-start.visustruct":B7,"../../lessons/diagramme/en/l12-java-laeuft-nicht-loesung.visustruct":P7,"../../lessons/diagramme/en/l12-java-laeuft-nicht-start.visustruct":O7,"../../lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct":M7,"../../lessons/diagramme/en/l12-summe.visustruct":Z7,"../../lessons/diagramme/en/l13-dreieck.visustruct":L7,"../../lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct":W7,"../../lessons/diagramme/en/l13-gerade-zaehlen.visustruct":E7,"../../lessons/diagramme/en/l13-java-fehler-loesung.visustruct":N7,"../../lessons/diagramme/en/l13-java-fehler-start.visustruct":F7,"../../lessons/diagramme/en/l13-java-laeuft-nicht-loesung.visustruct":R7,"../../lessons/diagramme/en/l13-java-laeuft-nicht-start.visustruct":J7,"../../lessons/diagramme/en/l13-java-quadrate-loesung.visustruct":G7,"../../lessons/diagramme/en/l13-rechteck-loesung.visustruct":H7,"../../lessons/diagramme/en/l14-array-durchlaufen.visustruct":V7,"../../lessons/diagramme/en/l14-erster-letzter-loesung.visustruct":q7,"../../lessons/diagramme/en/l14-java-fehler-loesung.visustruct":U7,"../../lessons/diagramme/en/l14-java-fehler-start.visustruct":Q7,"../../lessons/diagramme/en/l14-java-laeuft-nicht-loesung.visustruct":$7,"../../lessons/diagramme/en/l14-java-laeuft-nicht-start.visustruct":Y7,"../../lessons/diagramme/en/l14-java-treppe-loesung.visustruct":K7,"../../lessons/diagramme/en/l14-namen-eingeben.visustruct":X7,"../../lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct":e8,"../../lessons/diagramme/en/l14-summe-max-loesung.visustruct":t8,"../../lessons/diagramme/en/l14-summe-maximum.visustruct":n8,"../../lessons/diagramme/en/l15-bis-null-loesung.visustruct":i8,"../../lessons/diagramme/en/l15-endlos-aussprung.visustruct":a8,"../../lessons/diagramme/en/l15-flaeche-loesung.visustruct":s8,"../../lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct":r8,"../../lessons/diagramme/en/l15-hauptprogramm.visustruct":o8,"../../lessons/diagramme/en/l15-java-fehler-loesung.visustruct":l8,"../../lessons/diagramme/en/l15-java-fehler-start.visustruct":u8,"../../lessons/diagramme/en/l15-java-laeuft-nicht-loesung.visustruct":m8,"../../lessons/diagramme/en/l15-java-laeuft-nicht-start.visustruct":c8,"../../lessons/diagramme/en/l15-java-noten-loesung.visustruct":d8,"../../lessons/diagramme/en/l15-quadrat-haupt.visustruct":h8,"../../lessons/diagramme/en/l15-quadrat.visustruct":g8,"../../lessons/diagramme/en/l15-titel-loesung.visustruct":p8,"../../lessons/diagramme/en/l15-unterprogramm.visustruct":f8,"../../lessons/diagramme/en/l15-zeige-summe-haupt.visustruct":b8,"../../lessons/diagramme/en/l15-zeige-summe.visustruct":x8,"../../lessons/diagramme/en/l16-countdown-loesung.visustruct":v8,"../../lessons/diagramme/en/l16-countdown-start.visustruct":w8,"../../lessons/diagramme/en/l16-java-fehler-loesung.visustruct":y8,"../../lessons/diagramme/en/l16-java-fehler-start.visustruct":z8,"../../lessons/diagramme/en/l16-java-laeuft-nicht-loesung.visustruct":I8,"../../lessons/diagramme/en/l16-java-laeuft-nicht-start.visustruct":k8,"../../lessons/diagramme/en/l16-java-punkte-loesung.visustruct":S8,"../../lessons/diagramme/en/l16-schreibtisch.visustruct":T8,"../../lessons/diagramme/en/l16-summe-loesung.visustruct":_8,"../../lessons/diagramme/en/l16-summe-start.visustruct":A8,"../../lessons/diagramme/en/l17-beispiel.visustruct":j8,"../../lessons/diagramme/en/l17-fakultaet-loesung.visustruct":C8,"../../lessons/diagramme/en/l17-java-brief-loesung.visustruct":D8,"../../lessons/diagramme/en/l17-java-brief-start.visustruct":B8,"../../lessons/diagramme/en/l17-java-fehler-loesung.visustruct":P8,"../../lessons/diagramme/en/l17-java-fehler-start.visustruct":O8,"../../lessons/diagramme/en/l17-java-laeuft-nicht-loesung.visustruct":M8,"../../lessons/diagramme/en/l17-java-laeuft-nicht-start.visustruct":Z8,"../../lessons/diagramme/en/l17-java-passwort-loesung.visustruct":L8,"../../lessons/diagramme/en/l17-ticket-loesung.visustruct":W8,"../../lessons/diagramme/en/l18-beispiel.visustruct":E8,"../../lessons/diagramme/en/l18-java-fehler-loesung.visustruct":N8,"../../lessons/diagramme/en/l18-java-fehler-start.visustruct":F8,"../../lessons/diagramme/en/l18-java-kasse-loesung.visustruct":R8,"../../lessons/diagramme/en/l18-js-loesung.visustruct":J8,"../../lessons/diagramme/en/l18-python-loesung.visustruct":G8,"../../lessons/diagramme/en/l19-java-fehler-loesung.visustruct":H8,"../../lessons/diagramme/en/l19-java-fehler-start.visustruct":V8,"../../lessons/diagramme/en/l19-java-laeuft-nicht-loesung.visustruct":q8,"../../lessons/diagramme/en/l19-java-laeuft-nicht-start.visustruct":U8,"../../lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct":Q8,"../../lessons/diagramme/en/l2-ausgabe.visustruct":$8,"../../lessons/diagramme/en/l2-hallo-loesung.visustruct":Y8,"../../lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct":K8,"../../lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct":X8,"../../lessons/diagramme/en/l23-java-ergaenzen-start.visustruct":eS,"../../lessons/diagramme/en/l23-java-nummern-loesung.visustruct":tS,"../../lessons/diagramme/en/l23-java-nummern-start.visustruct":nS,"../../lessons/diagramme/en/l24-java-fuchs-loesung.visustruct":iS,"../../lessons/diagramme/en/l24-java-fuchs-start.visustruct":aS,"../../lessons/diagramme/en/l24-java-laengster-loesung.visustruct":sS,"../../lessons/diagramme/en/l24-java-laengster-start.visustruct":rS,"../../lessons/diagramme/en/l25-java-beste-loesung.visustruct":oS,"../../lessons/diagramme/en/l25-java-beste-start.visustruct":lS,"../../lessons/diagramme/en/l25-java-schnitt-loesung.visustruct":uS,"../../lessons/diagramme/en/l25-java-schnitt-start.visustruct":mS,"../../lessons/diagramme/en/l26-java-namen-loesung.visustruct":cS,"../../lessons/diagramme/en/l26-java-namen-start.visustruct":dS,"../../lessons/diagramme/en/l26-java-schreiben-loesung.visustruct":hS,"../../lessons/diagramme/en/l26-java-schreiben-start.visustruct":gS,"../../lessons/diagramme/en/l27-java-json-loesung.visustruct":pS,"../../lessons/diagramme/en/l27-java-json-start.visustruct":fS,"../../lessons/diagramme/en/l27-java-saetze-loesung.visustruct":bS,"../../lessons/diagramme/en/l27-java-saetze-start.visustruct":xS,"../../lessons/diagramme/en/sim-kino-loesung.visustruct":vS,"../../lessons/diagramme/en/sim-kino-start.visustruct":wS,"../../lessons/diagramme/en/sim-tausch-loesung.visustruct":yS,"../../lessons/diagramme/en/sim-tausch-start.visustruct":zS,"../../lessons/diagramme/en/sim-tausch.visustruct":IS,"../../lessons/diagramme/en/ss-absteigend-loesung.visustruct":kS,"../../lessons/diagramme/en/ss-absteigend-start.visustruct":SS,"../../lessons/diagramme/en/ss-binaere-suche.visustruct":TS,"../../lessons/diagramme/en/ss-bubblesort.visustruct":_S,"../../lessons/diagramme/en/ss-karte-suchen-loesung.visustruct":AS,"../../lessons/diagramme/en/ss-lineare-suche.visustruct":jS,"../../lessons/diagramme/en/uebergabe-bonus-loesung.visustruct":CS,"../../lessons/diagramme/en/uebergabe-bonus-start.visustruct":DS,"../../lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct":BS,"../../lessons/diagramme/en/uebergabe-haupt.visustruct":PS,"../../lessons/diagramme/en/uebergabe-leeren.visustruct":OS,"../../lessons/diagramme/en/uebergabe-verdopple.visustruct":MS,"../../lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct":ZS,"../../lessons/diagramme/en/vb-abstand-halten-loesung.visustruct":LS,"../../lessons/diagramme/en/vb-alarmanlage-loesung.visustruct":WS,"../../lessons/diagramme/en/vb-ampel-loesung.visustruct":ES,"../../lessons/diagramme/en/vb-ampel-zustand-loesung.visustruct":NS,"../../lessons/diagramme/en/vb-ausgang-loesung.visustruct":FS,"../../lessons/diagramme/en/vb-begruessung-loesung.visustruct":RS,"../../lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct":JS,"../../lessons/diagramme/en/vb-bis-rot-loesung.visustruct":GS,"../../lessons/diagramme/en/vb-bis-wand-loesung.visustruct":HS,"../../lessons/diagramme/en/vb-bis-ziel-loesung.visustruct":VS,"../../lessons/diagramme/en/vb-buchstaben-loesung.visustruct":qS,"../../lessons/diagramme/en/vb-do-while-loesung.visustruct":US,"../../lessons/diagramme/en/vb-drei-lichter-loesung.visustruct":QS,"../../lessons/diagramme/en/vb-dreieck-loesung.visustruct":$S,"../../lessons/diagramme/en/vb-einparken-loesung.visustruct":YS,"../../lessons/diagramme/en/vb-erster-plan-loesung.visustruct":KS,"../../lessons/diagramme/en/vb-farben-loesung.visustruct":XS,"../../lessons/diagramme/en/vb-farbweiche-loesung.visustruct":eT,"../../lessons/diagramme/en/vb-fehler-04-sensoren-start.visustruct":tT,"../../lessons/diagramme/en/vb-fehler-05-bis-zur-wand-start.visustruct":nT,"../../lessons/diagramme/en/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct":iT,"../../lessons/diagramme/en/vb-fehler-05-zaehlen-und-summieren-start.visustruct":aT,"../../lessons/diagramme/en/vb-fehler-06-abstand-start.visustruct":sT,"../../lessons/diagramme/en/vb-fehler-06-konstanten-final-start.visustruct":rT,"../../lessons/diagramme/en/vb-fehler-06-nah-mittel-weit-start.visustruct":oT,"../../lessons/diagramme/en/vb-fehler-07-linie-start.visustruct":lT,"../../lessons/diagramme/en/vb-fehler-07-und-oder-start.visustruct":uT,"../../lessons/diagramme/en/vb-fehler-08-farben-start.visustruct":mT,"../../lessons/diagramme/en/vb-fehler-08-groesster-wert-start.visustruct":cT,"../../lessons/diagramme/en/vb-fehler-09-fallauswahl-mbot2-start.visustruct":dT,"../../lessons/diagramme/en/vb-fehler-10-tasten-joystick-start.visustruct":hT,"../../lessons/diagramme/en/vb-fehler-10-unterbrechen-mit-break-start.visustruct":gT,"../../lessons/diagramme/en/vb-fehler-11-licht-start.visustruct":pT,"../../lessons/diagramme/en/vb-fehler-11-merker-boolean-start.visustruct":fT,"../../lessons/diagramme/en/vb-fehler-12-lautstaerke-start.visustruct":bT,"../../lessons/diagramme/en/vb-fehler-13-neigung-start.visustruct":xT,"../../lessons/diagramme/en/vb-fehler-14-leds-start.visustruct":vT,"../../lessons/diagramme/en/vb-fehler-15-einzelne-leds-start.visustruct":wT,"../../lessons/diagramme/en/vb-fehler-16-lautsprecher-start.visustruct":yT,"../../lessons/diagramme/en/vb-fehler-17-arrays-melodie-start.visustruct":zT,"../../lessons/diagramme/en/vb-fehler-18-bildschirm-start.visustruct":IT,"../../lessons/diagramme/en/vb-fehler-19-zeichenketten-start.visustruct":kT,"../../lessons/diagramme/en/vb-fehler-20-motoren-start.visustruct":ST,"../../lessons/diagramme/en/vb-fehler-21-stoppuhr-akku-start.visustruct":TT,"../../lessons/diagramme/en/vb-fehler-21-zustaende-start.visustruct":_T,"../../lessons/diagramme/en/vb-fehler-22-eigene-methoden-start.visustruct":AT,"../../lessons/diagramme/en/vb-fehler-23-wie-geht-es-weiter-start.visustruct":jT,"../../lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct":CT,"../../lessons/diagramme/en/vb-gerade-loesung.visustruct":DT,"../../lessons/diagramme/en/vb-hindernis-loesung.visustruct":BT,"../../lessons/diagramme/en/vb-java-akku-loesung.visustruct":PT,"../../lessons/diagramme/en/vb-java-ampel-text-loesung.visustruct":OT,"../../lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct":MT,"../../lessons/diagramme/en/vb-java-blinken-loesung.visustruct":ZT,"../../lessons/diagramme/en/vb-java-countdown-loesung.visustruct":LT,"../../lessons/diagramme/en/vb-java-hoeher-loesung.visustruct":WT,"../../lessons/diagramme/en/vb-java-joystick-loesung.visustruct":ET,"../../lessons/diagramme/en/vb-java-klatsch-merker-loesung.visustruct":NT,"../../lessons/diagramme/en/vb-java-konstante-seite-loesung.visustruct":FT,"../../lessons/diagramme/en/vb-java-laermampel-loesung.visustruct":RT,"../../lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct":JT,"../../lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct":GT,"../../lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct":HT,"../../lessons/diagramme/en/vb-java-rand-loesung.visustruct":VT,"../../lessons/diagramme/en/vb-java-rechteck-loesung.visustruct":qT,"../../lessons/diagramme/en/vb-java-rechteck-umdrehungen-loesung.visustruct":UT,"../../lessons/diagramme/en/vb-java-richtung-loesung.visustruct":QT,"../../lessons/diagramme/en/vb-java-schritte-zaehlen-loesung.visustruct":$T,"../../lessons/diagramme/en/vb-java-sicher-fahren-loesung.visustruct":YT,"../../lessons/diagramme/en/vb-java-spirale-strecke-loesung.visustruct":KT,"../../lessons/diagramme/en/vb-java-tageszeit-loesung.visustruct":XT,"../../lessons/diagramme/en/vb-java-taste-stopp-loesung.visustruct":e_,"../../lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct":t_,"../../lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct":n_,"../../lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct":i_,"../../lessons/diagramme/en/vb-klatschen-loesung.visustruct":a_,"../../lessons/diagramme/en/vb-knight-rider-loesung.visustruct":s_,"../../lessons/diagramme/en/vb-konstante-wand-loesung.visustruct":r_,"../../lessons/diagramme/en/vb-l00-bausteine-loesung.visustruct":o_,"../../lessons/diagramme/en/vb-l00-sequenz-loesung.visustruct":l_,"../../lessons/diagramme/en/vb-l03-wachsend-loesung.visustruct":u_,"../../lessons/diagramme/en/vb-l06k-mit.visustruct":m_,"../../lessons/diagramme/en/vb-l06k-ohne.visustruct":c_,"../../lessons/diagramme/en/vb-l06n-einparkhilfe.visustruct":d_,"../../lessons/diagramme/en/vb-l21z-ausweichen.visustruct":h_,"../../lessons/diagramme/en/vb-labyrinth-loesung.visustruct":g_,"../../lessons/diagramme/en/vb-laufschrift-loesung.visustruct":p_,"../../lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct":f_,"../../lessons/diagramme/en/vb-linienmuster-loesung.visustruct":b_,"../../lessons/diagramme/en/vb-meister-platz-loesung.visustruct":x_,"../../lessons/diagramme/en/vb-melodie-loesung.visustruct":v_,"../../lessons/diagramme/en/vb-messreihe-loesung.visustruct":w_,"../../lessons/diagramme/en/vb-morsen-loesung.visustruct":y_,"../../lessons/diagramme/en/vb-nachtlicht-loesung.visustruct":z_,"../../lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct":I_,"../../lessons/diagramme/en/vb-notbremse-loesung.visustruct":k_,"../../lessons/diagramme/en/vb-oder-loesung.visustruct":S_,"../../lessons/diagramme/en/vb-quadrat-loesung.visustruct":T_,"../../lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct":__,"../../lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct":A_,"../../lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct":j_,"../../lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct":C_,"../../lessons/diagramme/en/vb-rand-loesung.visustruct":D_,"../../lessons/diagramme/en/vb-schraeglage-loesung.visustruct":B_,"../../lessons/diagramme/en/vb-schritte-welt-loesung.visustruct":P_,"../../lessons/diagramme/en/vb-slalom-loesung.visustruct":O_,"../../lessons/diagramme/en/vb-spirale-falsch-loesung.visustruct":M_,"../../lessons/diagramme/en/vb-spirale-falsch-start.visustruct":Z_,"../../lessons/diagramme/en/vb-spirale-loesung.visustruct":L_,"../../lessons/diagramme/en/vb-start-a-loesung.visustruct":W_,"../../lessons/diagramme/en/vb-startsignal-loesung.visustruct":E_,"../../lessons/diagramme/en/vb-strecke-anzeigen-loesung.visustruct":N_,"../../lessons/diagramme/en/vb-tempo-abstand-loesung.visustruct":F_,"../../lessons/diagramme/en/vb-tonleiter-loesung.visustruct":R_,"../../lessons/diagramme/en/vb-treppe-loesung.visustruct":J_,"../../lessons/diagramme/en/vb-tunnel-loesung.visustruct":G_,"../../lessons/diagramme/en/vb-ueberladung-umdrehung-loesung.visustruct":H_,"../../lessons/diagramme/en/vb-und-loesung.visustruct":V_,"../../lessons/diagramme/en/vb-variable-seite-loesung.visustruct":q_,"../../lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct":U_,"../../lessons/diagramme/en/vb-wald-loesung.visustruct":Q_,"../../lessons/diagramme/en/vb-wand-vorn-loesung.visustruct":$_,"../../lessons/diagramme/en/vb-wurde-es-dunkel-loesung.visustruct":Y_,"../../lessons/diagramme/en/vb-zentimeter-loesung.visustruct":K_,"../../lessons/diagramme/en/vb-zentimeter-unterprogramm-loesung.visustruct":X_,"../../lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct":eA,"../../lessons/diagramme/en/zk-initialen-loesung.visustruct":tA,"../../lessons/diagramme/en/zk-mehr.visustruct":nA,"../../lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct":iA,"../../lessons/diagramme/en/zk-split.visustruct":aA,"../../lessons/diagramme/en/zk-woerter-loesung.visustruct":sA,"../../lessons/diagramme/en/zk-zaehlen.visustruct":rA,"../../lessons/diagramme/en/zk-zeichen.visustruct":oA,"../../lessons/diagramme/kino-einmaleins-loesung.visustruct":lA,"../../lessons/diagramme/kino-frei-loesung.visustruct":uA,"../../lessons/diagramme/kino-frei-start.visustruct":mA,"../../lessons/diagramme/kino-karte-loesung.visustruct":cA,"../../lessons/diagramme/kino-karte-start.visustruct":dA,"../../lessons/diagramme/kino-saalplan.visustruct":hA,"../../lessons/diagramme/kino-verkaufen.visustruct":gA,"../../lessons/diagramme/l04-gross-klein-loesung.visustruct":pA,"../../lessons/diagramme/l04-gross-klein-start.visustruct":fA,"../../lessons/diagramme/l04-java-fehler-loesung.visustruct":bA,"../../lessons/diagramme/l04-java-fehler-start.visustruct":xA,"../../lessons/diagramme/l04-java-laeuft-nicht-loesung.visustruct":vA,"../../lessons/diagramme/l04-java-laeuft-nicht-start.visustruct":wA,"../../lessons/diagramme/l04-java-steckbrief-loesung.visustruct":yA,"../../lessons/diagramme/l04-rechnen.visustruct":zA,"../../lessons/diagramme/l04-reihenfolge-loesung.visustruct":IA,"../../lessons/diagramme/l04-reihenfolge-start.visustruct":kA,"../../lessons/diagramme/l04-tauschen-loesung.visustruct":SA,"../../lessons/diagramme/l04-tauschen-start.visustruct":TA,"../../lessons/diagramme/l04-tauschen.visustruct":_A,"../../lessons/diagramme/l05-datentypen.visustruct":AA,"../../lessons/diagramme/l05-division.visustruct":jA,"../../lessons/diagramme/l05-einkauf-loesung.visustruct":CA,"../../lessons/diagramme/l05-java-fehler-loesung.visustruct":DA,"../../lessons/diagramme/l05-java-fehler-start.visustruct":BA,"../../lessons/diagramme/l05-java-kino-loesung.visustruct":PA,"../../lessons/diagramme/l05-java-laeuft-nicht-loesung.visustruct":OA,"../../lessons/diagramme/l05-java-laeuft-nicht-start.visustruct":MA,"../../lessons/diagramme/l05-rechteck-loesung.visustruct":ZA,"../../lessons/diagramme/l05-sekunden-loesung.visustruct":LA,"../../lessons/diagramme/l05-sekunden-start.visustruct":WA,"../../lessons/diagramme/l05-sequenz.visustruct":EA,"../../lessons/diagramme/l06-begruessung-loesung.visustruct":NA,"../../lessons/diagramme/l06-eva.visustruct":FA,"../../lessons/diagramme/l06-java-fehler-loesung.visustruct":RA,"../../lessons/diagramme/l06-java-fehler-start.visustruct":JA,"../../lessons/diagramme/l06-java-laeuft-nicht-loesung.visustruct":GA,"../../lessons/diagramme/l06-java-laeuft-nicht-start.visustruct":HA,"../../lessons/diagramme/l06-java-tage-loesung.visustruct":VA,"../../lessons/diagramme/l06-mittelwert-loesung.visustruct":qA,"../../lessons/diagramme/l06-rechner-loesung.visustruct":UA,"../../lessons/diagramme/l07-alter-pruefen.visustruct":QA,"../../lessons/diagramme/l07-betrag-loesung.visustruct":$A,"../../lessons/diagramme/l07-gerade-loesung.visustruct":YA,"../../lessons/diagramme/l07-java-fehler-loesung.visustruct":KA,"../../lessons/diagramme/l07-java-fehler-start.visustruct":XA,"../../lessons/diagramme/l07-java-laeuft-nicht-loesung.visustruct":ej,"../../lessons/diagramme/l07-java-laeuft-nicht-start.visustruct":tj,"../../lessons/diagramme/l07-java-pizza-loesung.visustruct":nj,"../../lessons/diagramme/l07-java-pizza-start.visustruct":ij,"../../lessons/diagramme/l07-maximum-loesung.visustruct":aj,"../../lessons/diagramme/l07-rabatt.visustruct":sj,"../../lessons/diagramme/l08-gueltig-loesung.visustruct":rj,"../../lessons/diagramme/l08-java-bestanden-loesung.visustruct":oj,"../../lessons/diagramme/l08-java-fehler-loesung.visustruct":lj,"../../lessons/diagramme/l08-java-fehler-start.visustruct":uj,"../../lessons/diagramme/l08-java-laeuft-nicht-loesung.visustruct":mj,"../../lessons/diagramme/l08-java-laeuft-nicht-start.visustruct":cj,"../../lessons/diagramme/l08-jugendticket.visustruct":dj,"../../lessons/diagramme/l08-note.visustruct":hj,"../../lessons/diagramme/l08-schaltjahr-loesung.visustruct":gj,"../../lessons/diagramme/l08-wochenende-loesung.visustruct":pj,"../../lessons/diagramme/l09-ampel.visustruct":fj,"../../lessons/diagramme/l09-automat.visustruct":bj,"../../lessons/diagramme/l09-java-fehler-loesung.visustruct":xj,"../../lessons/diagramme/l09-java-fehler-start.visustruct":vj,"../../lessons/diagramme/l09-java-laeuft-nicht-loesung.visustruct":wj,"../../lessons/diagramme/l09-java-laeuft-nicht-start.visustruct":yj,"../../lessons/diagramme/l09-java-schule-loesung.visustruct":zj,"../../lessons/diagramme/l09-note-loesung.visustruct":Ij,"../../lessons/diagramme/l09-rechner-loesung.visustruct":kj,"../../lessons/diagramme/l09-verschachtelt.visustruct":Sj,"../../lessons/diagramme/l1-grundbausteine.visustruct":Tj,"../../lessons/diagramme/l1-sequenz.visustruct":_j,"../../lessons/diagramme/l1-tee.visustruct":Aj,"../../lessons/diagramme/l1-verzweigung.visustruct":jj,"../../lessons/diagramme/l1-wiederholung.visustruct":Cj,"../../lessons/diagramme/l10-bis-n-loesung.visustruct":Dj,"../../lessons/diagramme/l10-countdown.visustruct":Bj,"../../lessons/diagramme/l10-endlos.visustruct":Pj,"../../lessons/diagramme/l10-fakultaet.visustruct":Oj,"../../lessons/diagramme/l10-java-fehler-loesung.visustruct":Mj,"../../lessons/diagramme/l10-java-fehler-start.visustruct":Zj,"../../lessons/diagramme/l10-java-laeuft-nicht-loesung.visustruct":Lj,"../../lessons/diagramme/l10-java-laeuft-nicht-start.visustruct":Wj,"../../lessons/diagramme/l10-java-wuerfel-loesung.visustruct":Ej,"../../lessons/diagramme/l10-verdoppeln-loesung.visustruct":Nj,"../../lessons/diagramme/l11-eingabe-pruefen.visustruct":Fj,"../../lessons/diagramme/l11-einmal.visustruct":Rj,"../../lessons/diagramme/l11-java-fehler-loesung.visustruct":Jj,"../../lessons/diagramme/l11-java-fehler-start.visustruct":Gj,"../../lessons/diagramme/l11-java-gerade-loesung.visustruct":Hj,"../../lessons/diagramme/l11-java-laeuft-nicht-loesung.visustruct":Vj,"../../lessons/diagramme/l11-java-laeuft-nicht-start.visustruct":qj,"../../lessons/diagramme/l11-note-loesung.visustruct":Uj,"../../lessons/diagramme/l11-summe-loesung.visustruct":Qj,"../../lessons/diagramme/l12-countdown-loesung.visustruct":$j,"../../lessons/diagramme/l12-einmaleins-loesung.visustruct":Yj,"../../lessons/diagramme/l12-eins-bis-fuenf.visustruct":Kj,"../../lessons/diagramme/l12-java-fehler-loesung.visustruct":Xj,"../../lessons/diagramme/l12-java-fehler-start.visustruct":eC,"../../lessons/diagramme/l12-java-laeuft-nicht-loesung.visustruct":tC,"../../lessons/diagramme/l12-java-laeuft-nicht-start.visustruct":nC,"../../lessons/diagramme/l12-java-verdoppeln-loesung.visustruct":iC,"../../lessons/diagramme/l12-summe.visustruct":aC,"../../lessons/diagramme/l13-dreieck.visustruct":sC,"../../lessons/diagramme/l13-gerade-eingaben-loesung.visustruct":rC,"../../lessons/diagramme/l13-gerade-zaehlen.visustruct":oC,"../../lessons/diagramme/l13-java-fehler-loesung.visustruct":lC,"../../lessons/diagramme/l13-java-fehler-start.visustruct":uC,"../../lessons/diagramme/l13-java-laeuft-nicht-loesung.visustruct":mC,"../../lessons/diagramme/l13-java-laeuft-nicht-start.visustruct":cC,"../../lessons/diagramme/l13-java-quadrate-loesung.visustruct":dC,"../../lessons/diagramme/l13-rechteck-loesung.visustruct":hC,"../../lessons/diagramme/l14-array-durchlaufen.visustruct":gC,"../../lessons/diagramme/l14-erster-letzter-loesung.visustruct":pC,"../../lessons/diagramme/l14-java-fehler-loesung.visustruct":fC,"../../lessons/diagramme/l14-java-fehler-start.visustruct":bC,"../../lessons/diagramme/l14-java-laeuft-nicht-loesung.visustruct":xC,"../../lessons/diagramme/l14-java-laeuft-nicht-start.visustruct":vC,"../../lessons/diagramme/l14-java-treppe-loesung.visustruct":wC,"../../lessons/diagramme/l14-namen-eingeben.visustruct":yC,"../../lessons/diagramme/l14-rueckwaerts-loesung.visustruct":zC,"../../lessons/diagramme/l14-summe-max-loesung.visustruct":IC,"../../lessons/diagramme/l14-summe-maximum.visustruct":kC,"../../lessons/diagramme/l15-bis-null-loesung.visustruct":SC,"../../lessons/diagramme/l15-endlos-aussprung.visustruct":TC,"../../lessons/diagramme/l15-flaeche-loesung.visustruct":_C,"../../lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct":AC,"../../lessons/diagramme/l15-hauptprogramm.visustruct":jC,"../../lessons/diagramme/l15-java-fehler-loesung.visustruct":CC,"../../lessons/diagramme/l15-java-fehler-start.visustruct":DC,"../../lessons/diagramme/l15-java-laeuft-nicht-loesung.visustruct":BC,"../../lessons/diagramme/l15-java-laeuft-nicht-start.visustruct":PC,"../../lessons/diagramme/l15-java-noten-loesung.visustruct":OC,"../../lessons/diagramme/l15-quadrat-haupt.visustruct":MC,"../../lessons/diagramme/l15-quadrat.visustruct":ZC,"../../lessons/diagramme/l15-titel-loesung.visustruct":LC,"../../lessons/diagramme/l15-unterprogramm.visustruct":WC,"../../lessons/diagramme/l15-zeige-summe-haupt.visustruct":EC,"../../lessons/diagramme/l15-zeige-summe.visustruct":NC,"../../lessons/diagramme/l16-countdown-loesung.visustruct":FC,"../../lessons/diagramme/l16-countdown-start.visustruct":RC,"../../lessons/diagramme/l16-java-fehler-loesung.visustruct":JC,"../../lessons/diagramme/l16-java-fehler-start.visustruct":GC,"../../lessons/diagramme/l16-java-laeuft-nicht-loesung.visustruct":HC,"../../lessons/diagramme/l16-java-laeuft-nicht-start.visustruct":VC,"../../lessons/diagramme/l16-java-punkte-loesung.visustruct":qC,"../../lessons/diagramme/l16-schreibtisch.visustruct":UC,"../../lessons/diagramme/l16-summe-loesung.visustruct":QC,"../../lessons/diagramme/l16-summe-start.visustruct":$C,"../../lessons/diagramme/l17-beispiel.visustruct":YC,"../../lessons/diagramme/l17-fakultaet-loesung.visustruct":KC,"../../lessons/diagramme/l17-java-brief-loesung.visustruct":XC,"../../lessons/diagramme/l17-java-brief-start.visustruct":eD,"../../lessons/diagramme/l17-java-fehler-loesung.visustruct":tD,"../../lessons/diagramme/l17-java-fehler-start.visustruct":nD,"../../lessons/diagramme/l17-java-laeuft-nicht-loesung.visustruct":iD,"../../lessons/diagramme/l17-java-laeuft-nicht-start.visustruct":aD,"../../lessons/diagramme/l17-java-passwort-loesung.visustruct":sD,"../../lessons/diagramme/l17-ticket-loesung.visustruct":rD,"../../lessons/diagramme/l18-beispiel.visustruct":oD,"../../lessons/diagramme/l18-java-fehler-loesung.visustruct":lD,"../../lessons/diagramme/l18-java-fehler-start.visustruct":uD,"../../lessons/diagramme/l18-java-kasse-loesung.visustruct":mD,"../../lessons/diagramme/l18-js-loesung.visustruct":cD,"../../lessons/diagramme/l18-python-loesung.visustruct":dD,"../../lessons/diagramme/l19-java-fehler-loesung.visustruct":hD,"../../lessons/diagramme/l19-java-fehler-start.visustruct":gD,"../../lessons/diagramme/l19-java-laeuft-nicht-loesung.visustruct":pD,"../../lessons/diagramme/l19-java-laeuft-nicht-start.visustruct":fD,"../../lessons/diagramme/l19-java-zaehlen-loesung.visustruct":bD,"../../lessons/diagramme/l2-ausgabe.visustruct":xD,"../../lessons/diagramme/l2-hallo-loesung.visustruct":vD,"../../lessons/diagramme/l2-zwei-zeilen-loesung.visustruct":wD,"../../lessons/diagramme/l20-countdown-loesung.visustruct":yD,"../../lessons/diagramme/l23-java-ergaenzen-loesung.visustruct":zD,"../../lessons/diagramme/l23-java-ergaenzen-start.visustruct":ID,"../../lessons/diagramme/l23-java-nummern-loesung.visustruct":kD,"../../lessons/diagramme/l23-java-nummern-start.visustruct":SD,"../../lessons/diagramme/l24-java-fuchs-loesung.visustruct":TD,"../../lessons/diagramme/l24-java-fuchs-start.visustruct":_D,"../../lessons/diagramme/l24-java-laengster-loesung.visustruct":AD,"../../lessons/diagramme/l24-java-laengster-start.visustruct":jD,"../../lessons/diagramme/l25-java-beste-loesung.visustruct":CD,"../../lessons/diagramme/l25-java-beste-start.visustruct":DD,"../../lessons/diagramme/l25-java-schnitt-loesung.visustruct":BD,"../../lessons/diagramme/l25-java-schnitt-start.visustruct":PD,"../../lessons/diagramme/l26-java-namen-loesung.visustruct":OD,"../../lessons/diagramme/l26-java-namen-start.visustruct":MD,"../../lessons/diagramme/l26-java-schreiben-loesung.visustruct":ZD,"../../lessons/diagramme/l26-java-schreiben-start.visustruct":LD,"../../lessons/diagramme/l27-java-json-loesung.visustruct":WD,"../../lessons/diagramme/l27-java-json-start.visustruct":ED,"../../lessons/diagramme/l27-java-saetze-loesung.visustruct":ND,"../../lessons/diagramme/l27-java-saetze-start.visustruct":FD,"../../lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct":RD,"../../lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct":JD,"../../lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct":GD,"../../lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct":HD,"../../lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct":VD,"../../lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct":qD,"../../lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct":UD,"../../lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct":QD,"../../lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct":$D,"../../lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct":YD,"../../lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct":KD,"../../lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct":XD,"../../lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct":eB,"../../lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct":tB,"../../lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct":nB,"../../lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct":iB,"../../lessons/diagramme/pt/aufgabe-pin-loesung.visustruct":aB,"../../lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct":sB,"../../lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct":rB,"../../lessons/diagramme/pt/aufgabe-schiffe-start.visustruct":oB,"../../lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct":lB,"../../lessons/diagramme/pt/aufgabe-summe-loesung.visustruct":uB,"../../lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct":mB,"../../lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct":cB,"../../lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct":dB,"../../lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct":hB,"../../lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct":gB,"../../lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct":pB,"../../lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct":fB,"../../lessons/diagramme/pt/dt-buffered.visustruct":bB,"../../lessons/diagramme/pt/dt-csv.visustruct":xB,"../../lessons/diagramme/pt/dt-json.visustruct":vB,"../../lessons/diagramme/pt/dt-lesen.visustruct":wB,"../../lessons/diagramme/pt/kino-einmaleins-loesung.visustruct":yB,"../../lessons/diagramme/pt/kino-frei-loesung.visustruct":zB,"../../lessons/diagramme/pt/kino-frei-start.visustruct":IB,"../../lessons/diagramme/pt/kino-karte-loesung.visustruct":kB,"../../lessons/diagramme/pt/kino-karte-start.visustruct":SB,"../../lessons/diagramme/pt/kino-saalplan.visustruct":TB,"../../lessons/diagramme/pt/kino-verkaufen.visustruct":_B,"../../lessons/diagramme/pt/l04-gross-klein-loesung.visustruct":AB,"../../lessons/diagramme/pt/l04-gross-klein-start.visustruct":jB,"../../lessons/diagramme/pt/l04-java-fehler-loesung.visustruct":CB,"../../lessons/diagramme/pt/l04-java-fehler-start.visustruct":DB,"../../lessons/diagramme/pt/l04-java-laeuft-nicht-loesung.visustruct":BB,"../../lessons/diagramme/pt/l04-java-laeuft-nicht-start.visustruct":PB,"../../lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct":OB,"../../lessons/diagramme/pt/l04-rechnen.visustruct":MB,"../../lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct":ZB,"../../lessons/diagramme/pt/l04-reihenfolge-start.visustruct":LB,"../../lessons/diagramme/pt/l04-tauschen-loesung.visustruct":WB,"../../lessons/diagramme/pt/l04-tauschen-start.visustruct":EB,"../../lessons/diagramme/pt/l04-tauschen.visustruct":NB,"../../lessons/diagramme/pt/l05-datentypen.visustruct":FB,"../../lessons/diagramme/pt/l05-division.visustruct":RB,"../../lessons/diagramme/pt/l05-einkauf-loesung.visustruct":JB,"../../lessons/diagramme/pt/l05-java-fehler-loesung.visustruct":GB,"../../lessons/diagramme/pt/l05-java-fehler-start.visustruct":HB,"../../lessons/diagramme/pt/l05-java-kino-loesung.visustruct":VB,"../../lessons/diagramme/pt/l05-java-laeuft-nicht-loesung.visustruct":qB,"../../lessons/diagramme/pt/l05-java-laeuft-nicht-start.visustruct":UB,"../../lessons/diagramme/pt/l05-rechteck-loesung.visustruct":QB,"../../lessons/diagramme/pt/l05-sekunden-loesung.visustruct":$B,"../../lessons/diagramme/pt/l05-sekunden-start.visustruct":YB,"../../lessons/diagramme/pt/l05-sequenz.visustruct":KB,"../../lessons/diagramme/pt/l06-begruessung-loesung.visustruct":XB,"../../lessons/diagramme/pt/l06-eva.visustruct":eP,"../../lessons/diagramme/pt/l06-java-fehler-loesung.visustruct":tP,"../../lessons/diagramme/pt/l06-java-fehler-start.visustruct":nP,"../../lessons/diagramme/pt/l06-java-laeuft-nicht-loesung.visustruct":iP,"../../lessons/diagramme/pt/l06-java-laeuft-nicht-start.visustruct":aP,"../../lessons/diagramme/pt/l06-java-tage-loesung.visustruct":sP,"../../lessons/diagramme/pt/l06-mittelwert-loesung.visustruct":rP,"../../lessons/diagramme/pt/l06-rechner-loesung.visustruct":oP,"../../lessons/diagramme/pt/l07-alter-pruefen.visustruct":lP,"../../lessons/diagramme/pt/l07-betrag-loesung.visustruct":uP,"../../lessons/diagramme/pt/l07-gerade-loesung.visustruct":mP,"../../lessons/diagramme/pt/l07-java-fehler-loesung.visustruct":cP,"../../lessons/diagramme/pt/l07-java-fehler-start.visustruct":dP,"../../lessons/diagramme/pt/l07-java-laeuft-nicht-loesung.visustruct":hP,"../../lessons/diagramme/pt/l07-java-laeuft-nicht-start.visustruct":gP,"../../lessons/diagramme/pt/l07-java-pizza-loesung.visustruct":pP,"../../lessons/diagramme/pt/l07-java-pizza-start.visustruct":fP,"../../lessons/diagramme/pt/l07-maximum-loesung.visustruct":bP,"../../lessons/diagramme/pt/l07-rabatt.visustruct":xP,"../../lessons/diagramme/pt/l08-gueltig-loesung.visustruct":vP,"../../lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct":wP,"../../lessons/diagramme/pt/l08-java-fehler-loesung.visustruct":yP,"../../lessons/diagramme/pt/l08-java-fehler-start.visustruct":zP,"../../lessons/diagramme/pt/l08-java-laeuft-nicht-loesung.visustruct":IP,"../../lessons/diagramme/pt/l08-java-laeuft-nicht-start.visustruct":kP,"../../lessons/diagramme/pt/l08-jugendticket.visustruct":SP,"../../lessons/diagramme/pt/l08-note.visustruct":TP,"../../lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct":_P,"../../lessons/diagramme/pt/l08-wochenende-loesung.visustruct":AP,"../../lessons/diagramme/pt/l09-ampel.visustruct":jP,"../../lessons/diagramme/pt/l09-automat.visustruct":CP,"../../lessons/diagramme/pt/l09-java-fehler-loesung.visustruct":DP,"../../lessons/diagramme/pt/l09-java-fehler-start.visustruct":BP,"../../lessons/diagramme/pt/l09-java-laeuft-nicht-loesung.visustruct":PP,"../../lessons/diagramme/pt/l09-java-laeuft-nicht-start.visustruct":OP,"../../lessons/diagramme/pt/l09-java-schule-loesung.visustruct":MP,"../../lessons/diagramme/pt/l09-note-loesung.visustruct":ZP,"../../lessons/diagramme/pt/l09-rechner-loesung.visustruct":LP,"../../lessons/diagramme/pt/l09-verschachtelt.visustruct":WP,"../../lessons/diagramme/pt/l1-grundbausteine.visustruct":EP,"../../lessons/diagramme/pt/l1-sequenz.visustruct":NP,"../../lessons/diagramme/pt/l1-tee.visustruct":FP,"../../lessons/diagramme/pt/l1-verzweigung.visustruct":RP,"../../lessons/diagramme/pt/l1-wiederholung.visustruct":JP,"../../lessons/diagramme/pt/l10-bis-n-loesung.visustruct":GP,"../../lessons/diagramme/pt/l10-countdown.visustruct":HP,"../../lessons/diagramme/pt/l10-endlos.visustruct":VP,"../../lessons/diagramme/pt/l10-fakultaet.visustruct":qP,"../../lessons/diagramme/pt/l10-java-fehler-loesung.visustruct":UP,"../../lessons/diagramme/pt/l10-java-fehler-start.visustruct":QP,"../../lessons/diagramme/pt/l10-java-laeuft-nicht-loesung.visustruct":$P,"../../lessons/diagramme/pt/l10-java-laeuft-nicht-start.visustruct":YP,"../../lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct":KP,"../../lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct":XP,"../../lessons/diagramme/pt/l11-eingabe-pruefen.visustruct":eO,"../../lessons/diagramme/pt/l11-einmal.visustruct":tO,"../../lessons/diagramme/pt/l11-java-fehler-loesung.visustruct":nO,"../../lessons/diagramme/pt/l11-java-fehler-start.visustruct":iO,"../../lessons/diagramme/pt/l11-java-gerade-loesung.visustruct":aO,"../../lessons/diagramme/pt/l11-java-laeuft-nicht-loesung.visustruct":sO,"../../lessons/diagramme/pt/l11-java-laeuft-nicht-start.visustruct":rO,"../../lessons/diagramme/pt/l11-note-loesung.visustruct":oO,"../../lessons/diagramme/pt/l11-summe-loesung.visustruct":lO,"../../lessons/diagramme/pt/l12-countdown-loesung.visustruct":uO,"../../lessons/diagramme/pt/l12-einmaleins-loesung.visustruct":mO,"../../lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct":cO,"../../lessons/diagramme/pt/l12-java-fehler-loesung.visustruct":dO,"../../lessons/diagramme/pt/l12-java-fehler-start.visustruct":hO,"../../lessons/diagramme/pt/l12-java-laeuft-nicht-loesung.visustruct":gO,"../../lessons/diagramme/pt/l12-java-laeuft-nicht-start.visustruct":pO,"../../lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct":fO,"../../lessons/diagramme/pt/l12-summe.visustruct":bO,"../../lessons/diagramme/pt/l13-dreieck.visustruct":xO,"../../lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct":vO,"../../lessons/diagramme/pt/l13-gerade-zaehlen.visustruct":wO,"../../lessons/diagramme/pt/l13-java-fehler-loesung.visustruct":yO,"../../lessons/diagramme/pt/l13-java-fehler-start.visustruct":zO,"../../lessons/diagramme/pt/l13-java-laeuft-nicht-loesung.visustruct":IO,"../../lessons/diagramme/pt/l13-java-laeuft-nicht-start.visustruct":kO,"../../lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct":SO,"../../lessons/diagramme/pt/l13-rechteck-loesung.visustruct":TO,"../../lessons/diagramme/pt/l14-array-durchlaufen.visustruct":_O,"../../lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct":AO,"../../lessons/diagramme/pt/l14-java-fehler-loesung.visustruct":jO,"../../lessons/diagramme/pt/l14-java-fehler-start.visustruct":CO,"../../lessons/diagramme/pt/l14-java-laeuft-nicht-loesung.visustruct":DO,"../../lessons/diagramme/pt/l14-java-laeuft-nicht-start.visustruct":BO,"../../lessons/diagramme/pt/l14-java-treppe-loesung.visustruct":PO,"../../lessons/diagramme/pt/l14-namen-eingeben.visustruct":OO,"../../lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct":MO,"../../lessons/diagramme/pt/l14-summe-max-loesung.visustruct":ZO,"../../lessons/diagramme/pt/l14-summe-maximum.visustruct":LO,"../../lessons/diagramme/pt/l15-bis-null-loesung.visustruct":WO,"../../lessons/diagramme/pt/l15-endlos-aussprung.visustruct":EO,"../../lessons/diagramme/pt/l15-flaeche-loesung.visustruct":NO,"../../lessons/diagramme/pt/l15-hauptprogramm.visustruct":FO,"../../lessons/diagramme/pt/l15-java-fehler-loesung.visustruct":RO,"../../lessons/diagramme/pt/l15-java-fehler-start.visustruct":JO,"../../lessons/diagramme/pt/l15-java-laeuft-nicht-loesung.visustruct":GO,"../../lessons/diagramme/pt/l15-java-laeuft-nicht-start.visustruct":HO,"../../lessons/diagramme/pt/l15-java-noten-loesung.visustruct":VO,"../../lessons/diagramme/pt/l15-quadrat-haupt.visustruct":qO,"../../lessons/diagramme/pt/l15-quadrat.visustruct":UO,"../../lessons/diagramme/pt/l15-titel-loesung.visustruct":QO,"../../lessons/diagramme/pt/l15-unterprogramm.visustruct":$O,"../../lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct":YO,"../../lessons/diagramme/pt/l15-zeige-summe.visustruct":KO,"../../lessons/diagramme/pt/l16-countdown-loesung.visustruct":XO,"../../lessons/diagramme/pt/l16-countdown-start.visustruct":eM,"../../lessons/diagramme/pt/l16-java-fehler-loesung.visustruct":tM,"../../lessons/diagramme/pt/l16-java-fehler-start.visustruct":nM,"../../lessons/diagramme/pt/l16-java-laeuft-nicht-loesung.visustruct":iM,"../../lessons/diagramme/pt/l16-java-laeuft-nicht-start.visustruct":aM,"../../lessons/diagramme/pt/l16-java-punkte-loesung.visustruct":sM,"../../lessons/diagramme/pt/l16-schreibtisch.visustruct":rM,"../../lessons/diagramme/pt/l16-summe-loesung.visustruct":oM,"../../lessons/diagramme/pt/l16-summe-start.visustruct":lM,"../../lessons/diagramme/pt/l17-beispiel.visustruct":uM,"../../lessons/diagramme/pt/l17-fakultaet-loesung.visustruct":mM,"../../lessons/diagramme/pt/l17-java-brief-loesung.visustruct":cM,"../../lessons/diagramme/pt/l17-java-brief-start.visustruct":dM,"../../lessons/diagramme/pt/l17-java-fehler-loesung.visustruct":hM,"../../lessons/diagramme/pt/l17-java-fehler-start.visustruct":gM,"../../lessons/diagramme/pt/l17-java-laeuft-nicht-loesung.visustruct":pM,"../../lessons/diagramme/pt/l17-java-laeuft-nicht-start.visustruct":fM,"../../lessons/diagramme/pt/l17-java-passwort-loesung.visustruct":bM,"../../lessons/diagramme/pt/l17-ticket-loesung.visustruct":xM,"../../lessons/diagramme/pt/l18-beispiel.visustruct":vM,"../../lessons/diagramme/pt/l18-java-fehler-loesung.visustruct":wM,"../../lessons/diagramme/pt/l18-java-fehler-start.visustruct":yM,"../../lessons/diagramme/pt/l18-java-kasse-loesung.visustruct":zM,"../../lessons/diagramme/pt/l18-js-loesung.visustruct":IM,"../../lessons/diagramme/pt/l18-python-loesung.visustruct":kM,"../../lessons/diagramme/pt/l19-java-fehler-loesung.visustruct":SM,"../../lessons/diagramme/pt/l19-java-fehler-start.visustruct":TM,"../../lessons/diagramme/pt/l19-java-laeuft-nicht-loesung.visustruct":_M,"../../lessons/diagramme/pt/l19-java-laeuft-nicht-start.visustruct":AM,"../../lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct":jM,"../../lessons/diagramme/pt/l2-ausgabe.visustruct":CM,"../../lessons/diagramme/pt/l2-hallo-loesung.visustruct":DM,"../../lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct":BM,"../../lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct":PM,"../../lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct":OM,"../../lessons/diagramme/pt/l23-java-nummern-loesung.visustruct":MM,"../../lessons/diagramme/pt/l23-java-nummern-start.visustruct":ZM,"../../lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct":LM,"../../lessons/diagramme/pt/l24-java-fuchs-start.visustruct":WM,"../../lessons/diagramme/pt/l24-java-laengster-loesung.visustruct":EM,"../../lessons/diagramme/pt/l24-java-laengster-start.visustruct":NM,"../../lessons/diagramme/pt/l25-java-beste-loesung.visustruct":FM,"../../lessons/diagramme/pt/l25-java-beste-start.visustruct":RM,"../../lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct":JM,"../../lessons/diagramme/pt/l25-java-schnitt-start.visustruct":GM,"../../lessons/diagramme/pt/l26-java-namen-loesung.visustruct":HM,"../../lessons/diagramme/pt/l26-java-namen-start.visustruct":VM,"../../lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct":qM,"../../lessons/diagramme/pt/l26-java-schreiben-start.visustruct":UM,"../../lessons/diagramme/pt/l27-java-json-loesung.visustruct":QM,"../../lessons/diagramme/pt/l27-java-json-start.visustruct":$M,"../../lessons/diagramme/pt/l27-java-saetze-loesung.visustruct":YM,"../../lessons/diagramme/pt/l27-java-saetze-start.visustruct":KM,"../../lessons/diagramme/pt/sim-kino-loesung.visustruct":XM,"../../lessons/diagramme/pt/sim-kino-start.visustruct":eZ,"../../lessons/diagramme/pt/sim-tausch-loesung.visustruct":tZ,"../../lessons/diagramme/pt/sim-tausch-start.visustruct":nZ,"../../lessons/diagramme/pt/sim-tausch.visustruct":iZ,"../../lessons/diagramme/pt/ss-absteigend-loesung.visustruct":aZ,"../../lessons/diagramme/pt/ss-absteigend-start.visustruct":sZ,"../../lessons/diagramme/pt/ss-binaere-suche.visustruct":rZ,"../../lessons/diagramme/pt/ss-bubblesort.visustruct":oZ,"../../lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct":lZ,"../../lessons/diagramme/pt/ss-lineare-suche.visustruct":uZ,"../../lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct":mZ,"../../lessons/diagramme/pt/uebergabe-bonus-start.visustruct":cZ,"../../lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct":dZ,"../../lessons/diagramme/pt/uebergabe-haupt.visustruct":hZ,"../../lessons/diagramme/pt/uebergabe-leeren.visustruct":gZ,"../../lessons/diagramme/pt/uebergabe-verdopple.visustruct":pZ,"../../lessons/diagramme/pt/zk-initialen-loesung.visustruct":fZ,"../../lessons/diagramme/pt/zk-mehr.visustruct":bZ,"../../lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct":xZ,"../../lessons/diagramme/pt/zk-split.visustruct":vZ,"../../lessons/diagramme/pt/zk-woerter-loesung.visustruct":wZ,"../../lessons/diagramme/pt/zk-zaehlen.visustruct":yZ,"../../lessons/diagramme/pt/zk-zeichen.visustruct":zZ,"../../lessons/diagramme/sim-kino-loesung.visustruct":IZ,"../../lessons/diagramme/sim-kino-start.visustruct":kZ,"../../lessons/diagramme/sim-tausch-loesung.visustruct":SZ,"../../lessons/diagramme/sim-tausch-start.visustruct":TZ,"../../lessons/diagramme/sim-tausch.visustruct":_Z,"../../lessons/diagramme/ss-absteigend-loesung.visustruct":AZ,"../../lessons/diagramme/ss-absteigend-start.visustruct":jZ,"../../lessons/diagramme/ss-binaere-suche.visustruct":CZ,"../../lessons/diagramme/ss-bubblesort.visustruct":DZ,"../../lessons/diagramme/ss-karte-suchen-loesung.visustruct":BZ,"../../lessons/diagramme/ss-lineare-suche.visustruct":PZ,"../../lessons/diagramme/uebergabe-bonus-loesung.visustruct":OZ,"../../lessons/diagramme/uebergabe-bonus-start.visustruct":MZ,"../../lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct":ZZ,"../../lessons/diagramme/uebergabe-haupt.visustruct":LZ,"../../lessons/diagramme/uebergabe-leeren.visustruct":WZ,"../../lessons/diagramme/uebergabe-verdopple.visustruct":EZ,"../../lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct":NZ,"../../lessons/diagramme/vb-abstand-halten-loesung.visustruct":FZ,"../../lessons/diagramme/vb-alarmanlage-loesung.visustruct":RZ,"../../lessons/diagramme/vb-ampel-loesung.visustruct":JZ,"../../lessons/diagramme/vb-ampel-zustand-loesung.visustruct":GZ,"../../lessons/diagramme/vb-ausgang-loesung.visustruct":HZ,"../../lessons/diagramme/vb-begruessung-loesung.visustruct":VZ,"../../lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct":qZ,"../../lessons/diagramme/vb-bis-rot-loesung.visustruct":UZ,"../../lessons/diagramme/vb-bis-wand-loesung.visustruct":QZ,"../../lessons/diagramme/vb-bis-ziel-loesung.visustruct":$Z,"../../lessons/diagramme/vb-buchstaben-loesung.visustruct":YZ,"../../lessons/diagramme/vb-do-while-loesung.visustruct":KZ,"../../lessons/diagramme/vb-drei-lichter-loesung.visustruct":XZ,"../../lessons/diagramme/vb-dreieck-loesung.visustruct":eL,"../../lessons/diagramme/vb-einparken-loesung.visustruct":tL,"../../lessons/diagramme/vb-erster-plan-loesung.visustruct":nL,"../../lessons/diagramme/vb-farben-loesung.visustruct":iL,"../../lessons/diagramme/vb-farbweiche-loesung.visustruct":aL,"../../lessons/diagramme/vb-fehler-04-sensoren-start.visustruct":sL,"../../lessons/diagramme/vb-fehler-05-bis-zur-wand-start.visustruct":rL,"../../lessons/diagramme/vb-fehler-05-erst-fahren-dann-pruefen-start.visustruct":oL,"../../lessons/diagramme/vb-fehler-05-zaehlen-und-summieren-start.visustruct":lL,"../../lessons/diagramme/vb-fehler-06-abstand-start.visustruct":uL,"../../lessons/diagramme/vb-fehler-06-konstanten-final-start.visustruct":mL,"../../lessons/diagramme/vb-fehler-06-nah-mittel-weit-start.visustruct":cL,"../../lessons/diagramme/vb-fehler-07-linie-start.visustruct":dL,"../../lessons/diagramme/vb-fehler-07-und-oder-start.visustruct":hL,"../../lessons/diagramme/vb-fehler-08-farben-start.visustruct":gL,"../../lessons/diagramme/vb-fehler-08-groesster-wert-start.visustruct":pL,"../../lessons/diagramme/vb-fehler-09-fallauswahl-mbot2-start.visustruct":fL,"../../lessons/diagramme/vb-fehler-10-tasten-joystick-start.visustruct":bL,"../../lessons/diagramme/vb-fehler-10-unterbrechen-mit-break-start.visustruct":xL,"../../lessons/diagramme/vb-fehler-11-licht-start.visustruct":vL,"../../lessons/diagramme/vb-fehler-11-merker-boolean-start.visustruct":wL,"../../lessons/diagramme/vb-fehler-12-lautstaerke-start.visustruct":yL,"../../lessons/diagramme/vb-fehler-13-neigung-start.visustruct":zL,"../../lessons/diagramme/vb-fehler-14-leds-start.visustruct":IL,"../../lessons/diagramme/vb-fehler-15-einzelne-leds-start.visustruct":kL,"../../lessons/diagramme/vb-fehler-16-lautsprecher-start.visustruct":SL,"../../lessons/diagramme/vb-fehler-17-arrays-melodie-start.visustruct":TL,"../../lessons/diagramme/vb-fehler-18-bildschirm-start.visustruct":_L,"../../lessons/diagramme/vb-fehler-19-zeichenketten-start.visustruct":AL,"../../lessons/diagramme/vb-fehler-20-motoren-start.visustruct":jL,"../../lessons/diagramme/vb-fehler-21-stoppuhr-akku-start.visustruct":CL,"../../lessons/diagramme/vb-fehler-21-zustaende-start.visustruct":DL,"../../lessons/diagramme/vb-fehler-22-eigene-methoden-start.visustruct":BL,"../../lessons/diagramme/vb-fehler-23-wie-geht-es-weiter-start.visustruct":PL,"../../lessons/diagramme/vb-gas-bis-wand-loesung.visustruct":OL,"../../lessons/diagramme/vb-gerade-loesung.visustruct":ML,"../../lessons/diagramme/vb-hindernis-loesung.visustruct":ZL,"../../lessons/diagramme/vb-java-akku-loesung.visustruct":LL,"../../lessons/diagramme/vb-java-ampel-text-loesung.visustruct":WL,"../../lessons/diagramme/vb-java-blau-gruen-loesung.visustruct":EL,"../../lessons/diagramme/vb-java-blinken-loesung.visustruct":NL,"../../lessons/diagramme/vb-java-countdown-loesung.visustruct":FL,"../../lessons/diagramme/vb-java-hoeher-loesung.visustruct":RL,"../../lessons/diagramme/vb-java-joystick-loesung.visustruct":JL,"../../lessons/diagramme/vb-java-klatsch-merker-loesung.visustruct":GL,"../../lessons/diagramme/vb-java-konstante-seite-loesung.visustruct":HL,"../../lessons/diagramme/vb-java-laermampel-loesung.visustruct":VL,"../../lessons/diagramme/vb-java-lauflicht-loesung.visustruct":qL,"../../lessons/diagramme/vb-java-linienfolger-loesung.visustruct":UL,"../../lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct":QL,"../../lessons/diagramme/vb-java-rand-loesung.visustruct":$L,"../../lessons/diagramme/vb-java-rechteck-loesung.visustruct":YL,"../../lessons/diagramme/vb-java-rechteck-umdrehungen-loesung.visustruct":KL,"../../lessons/diagramme/vb-java-richtung-loesung.visustruct":XL,"../../lessons/diagramme/vb-java-schritte-zaehlen-loesung.visustruct":eW,"../../lessons/diagramme/vb-java-sicher-fahren-loesung.visustruct":tW,"../../lessons/diagramme/vb-java-spirale-strecke-loesung.visustruct":nW,"../../lessons/diagramme/vb-java-tageszeit-loesung.visustruct":iW,"../../lessons/diagramme/vb-java-taste-stopp-loesung.visustruct":aW,"../../lessons/diagramme/vb-java-textlaenge-loesung.visustruct":sW,"../../lessons/diagramme/vb-java-wand-piep-loesung.visustruct":rW,"../../lessons/diagramme/vb-java-wasserwaage-loesung.visustruct":oW,"../../lessons/diagramme/vb-klatschen-loesung.visustruct":lW,"../../lessons/diagramme/vb-knight-rider-loesung.visustruct":uW,"../../lessons/diagramme/vb-konstante-wand-loesung.visustruct":mW,"../../lessons/diagramme/vb-l00-bausteine-loesung.visustruct":cW,"../../lessons/diagramme/vb-l00-sequenz-loesung.visustruct":dW,"../../lessons/diagramme/vb-l03-wachsend-loesung.visustruct":hW,"../../lessons/diagramme/vb-l06k-mit.visustruct":gW,"../../lessons/diagramme/vb-l06k-ohne.visustruct":pW,"../../lessons/diagramme/vb-l06n-einparkhilfe.visustruct":fW,"../../lessons/diagramme/vb-l21z-ausweichen.visustruct":bW,"../../lessons/diagramme/vb-labyrinth-loesung.visustruct":xW,"../../lessons/diagramme/vb-laufschrift-loesung.visustruct":vW,"../../lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct":wW,"../../lessons/diagramme/vb-linienmuster-loesung.visustruct":yW,"../../lessons/diagramme/vb-meister-platz-loesung.visustruct":zW,"../../lessons/diagramme/vb-melodie-loesung.visustruct":IW,"../../lessons/diagramme/vb-messreihe-loesung.visustruct":kW,"../../lessons/diagramme/vb-morsen-loesung.visustruct":SW,"../../lessons/diagramme/vb-nachtlicht-loesung.visustruct":TW,"../../lessons/diagramme/vb-nachtwaechter-loesung.visustruct":_W,"../../lessons/diagramme/vb-notbremse-loesung.visustruct":AW,"../../lessons/diagramme/vb-oder-loesung.visustruct":jW,"../../lessons/diagramme/vb-quadrat-loesung.visustruct":CW,"../../lessons/diagramme/vb-quadrat-methode-loesung.visustruct":DW,"../../lessons/diagramme/vb-quadrat-schleife-loesung.visustruct":BW,"../../lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct":PW,"../../lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct":OW,"../../lessons/diagramme/vb-rand-loesung.visustruct":MW,"../../lessons/diagramme/vb-schraeglage-loesung.visustruct":ZW,"../../lessons/diagramme/vb-schritte-welt-loesung.visustruct":LW,"../../lessons/diagramme/vb-slalom-loesung.visustruct":WW,"../../lessons/diagramme/vb-spirale-falsch-loesung.visustruct":EW,"../../lessons/diagramme/vb-spirale-falsch-start.visustruct":NW,"../../lessons/diagramme/vb-spirale-loesung.visustruct":FW,"../../lessons/diagramme/vb-start-a-loesung.visustruct":RW,"../../lessons/diagramme/vb-startsignal-loesung.visustruct":JW,"../../lessons/diagramme/vb-strecke-anzeigen-loesung.visustruct":GW,"../../lessons/diagramme/vb-tempo-abstand-loesung.visustruct":HW,"../../lessons/diagramme/vb-tonleiter-loesung.visustruct":VW,"../../lessons/diagramme/vb-treppe-loesung.visustruct":qW,"../../lessons/diagramme/vb-tunnel-loesung.visustruct":UW,"../../lessons/diagramme/vb-ueberladung-umdrehung-loesung.visustruct":QW,"../../lessons/diagramme/vb-und-loesung.visustruct":$W,"../../lessons/diagramme/vb-variable-seite-loesung.visustruct":YW,"../../lessons/diagramme/vb-vier-quadrate-loesung.visustruct":KW,"../../lessons/diagramme/vb-wald-loesung.visustruct":XW,"../../lessons/diagramme/vb-wand-vorn-loesung.visustruct":eE,"../../lessons/diagramme/vb-wurde-es-dunkel-loesung.visustruct":tE,"../../lessons/diagramme/vb-zentimeter-loesung.visustruct":nE,"../../lessons/diagramme/vb-zentimeter-unterprogramm-loesung.visustruct":iE,"../../lessons/diagramme/vb-zwei-sekunden-loesung.visustruct":aE,"../../lessons/diagramme/vbb-abstand-zeigen-loesung.visustruct":sE,"../../lessons/diagramme/vbb-ampel-loesung.visustruct":rE,"../../lessons/diagramme/vbb-ausgang-loesung.visustruct":oE,"../../lessons/diagramme/vbb-bis-wand-loesung.visustruct":lE,"../../lessons/diagramme/vbb-blinken-loesung.visustruct":uE,"../../lessons/diagramme/vbb-disco-loesung.visustruct":mE,"../../lessons/diagramme/vbb-dreieck-loesung.visustruct":cE,"../../lessons/diagramme/vbb-ecke-loesung.visustruct":dE,"../../lessons/diagramme/vbb-erster-block-loesung.visustruct":hE,"../../lessons/diagramme/vbb-hin-und-zurueck-loesung.visustruct":gE,"../../lessons/diagramme/vbb-klotz-loesung.visustruct":pE,"../../lessons/diagramme/vbb-licht-gruen-loesung.visustruct":fE,"../../lessons/diagramme/vbb-linie-bis-rot-loesung.visustruct":bE,"../../lessons/diagramme/vbb-linienfolger-loesung.visustruct":xE,"../../lessons/diagramme/vbb-notbremse-loesung.visustruct":vE,"../../lessons/diagramme/vbb-quadrat-loesung.visustruct":wE,"../../lessons/diagramme/vbb-quadrat-wiederhole-loesung.visustruct":yE,"../../lessons/diagramme/vbb-rand-loesung.visustruct":zE,"../../lessons/diagramme/vbb-sirene-loesung.visustruct":IE,"../../lessons/diagramme/vbb-slalom-loesung.visustruct":kE,"../../lessons/diagramme/vbb-start-a-loesung.visustruct":SE,"../../lessons/diagramme/vbb-wald-loesung.visustruct":TE,"../../lessons/diagramme/vbb-wand-vorn-loesung.visustruct":_E,"../../lessons/diagramme/vbb-weiter-loesung.visustruct":AE,"../../lessons/diagramme/zk-initialen-loesung.visustruct":jE,"../../lessons/diagramme/zk-mehr.visustruct":CE,"../../lessons/diagramme/zk-rueckwaerts-loesung.visustruct":DE,"../../lessons/diagramme/zk-split.visustruct":BE,"../../lessons/diagramme/zk-woerter-loesung.visustruct":PE,"../../lessons/diagramme/zk-zaehlen.visustruct":OE,"../../lessons/diagramme/zk-zeichen.visustruct":ME}),YR=Object.assign({"../../lessons/welten/ausgang-1.txt":ZE,"../../lessons/welten/ausgang-2.txt":LE,"../../lessons/welten/ecke.txt":WE,"../../lessons/welten/farbe-1.txt":EE,"../../lessons/welten/farbe-2.txt":NE,"../../lessons/welten/farbe-3.txt":FE,"../../lessons/welten/farbe-4.txt":RE,"../../lessons/welten/hindernis-1.txt":JE,"../../lessons/welten/hindernis-2.txt":GE,"../../lessons/welten/labyrinth-1.txt":HE,"../../lessons/welten/labyrinth-2.txt":VE,"../../lessons/welten/linie-1.txt":qE,"../../lessons/welten/linie-2.txt":UE,"../../lessons/welten/linie-rot-1.txt":QE,"../../lessons/welten/linie-rot-2.txt":$E,"../../lessons/welten/parken-1.txt":YE,"../../lessons/welten/parken-2.txt":KE,"../../lessons/welten/platz-1.txt":XE,"../../lessons/welten/platz-2.txt":eN,"../../lessons/welten/rand-1.txt":tN,"../../lessons/welten/rand-2.txt":nN,"../../lessons/welten/slalom.txt":iN,"../../lessons/welten/tunnel-1.txt":aN,"../../lessons/welten/tunnel-2.txt":sN,"../../lessons/welten/wald-1.txt":rN,"../../lessons/welten/wald-2.txt":oN,"../../lessons/welten/wand-frei.txt":lN,"../../lessons/welten/wand-kurz.txt":uN,"../../lessons/welten/wand-lang.txt":mN,"../../lessons/welten/wand-mittel.txt":cN,"../../lessons/welten/wand-nah.txt":dN,"../../lessons/welten/zeit-1.txt":hN,"../../lessons/welten/ziel-kurz.txt":gN,"../../lessons/welten/ziel-lang.txt":pN}),KR=Object.assign({"../../lessons/bilder/ada-lovelace.jpg":fN,"../../lessons/bilder/aufgabe-mehrwertsteuer.svg":bN,"../../lessons/bilder/ben-shneiderman.jpg":xN,"../../lessons/bilder/caesar-ascii.svg":vN,"../../lessons/bilder/caesar-scheibe.svg":wN,"../../lessons/bilder/caesar-verschiebung.svg":yN,"../../lessons/bilder/en/aufgabe-mehrwertsteuer.svg":zN,"../../lessons/bilder/en/kino-saal.svg":IN,"../../lessons/bilder/en/kino-schleifen.svg":kN,"../../lessons/bilder/en/l01-pap.svg":SN,"../../lessons/bilder/en/l02-einfuegen.svg":TN,"../../lessons/bilder/en/l03-lochkarte-beschriftet.svg":_N,"../../lessons/bilder/en/l03-lochkarte.svg":AN,"../../lessons/bilder/en/l04-camelcase.svg":jN,"../../lessons/bilder/en/l04-variable.svg":CN,"../../lessons/bilder/en/l04-zuweisung.svg":DN,"../../lessons/bilder/en/l05-tauschen.svg":BN,"../../lessons/bilder/en/l08-zahlenstrahl.svg":PN,"../../lessons/bilder/en/l10-kopfgesteuert.svg":ON,"../../lessons/bilder/en/l11-vergleich.svg":MN,"../../lessons/bilder/en/l12-for-ablauf.svg":ZN,"../../lessons/bilder/en/l12-while-zu-for.svg":LN,"../../lessons/bilder/en/l13-verschachtelt-tabelle.svg":WN,"../../lessons/bilder/en/l14-array.svg":EN,"../../lessons/bilder/en/l20-cpp.svg":NN,"../../lessons/bilder/en/l20-jvm.svg":FN,"../../lessons/bilder/en/mvc-klick.svg":RN,"../../lessons/bilder/en/ss-binaere-suche.svg":JN,"../../lessons/bilder/en/ss-bubblesort.svg":GN,"../../lessons/bilder/en/ss-lineare-suche.svg":HN,"../../lessons/bilder/en/ss-vergleiche.svg":VN,"../../lessons/bilder/en/uebergabe.svg":qN,"../../lessons/bilder/en/zk-zeichen.svg":UN,"../../lessons/bilder/grace-hopper.jpg":QN,"../../lessons/bilder/hedy-lamarr.jpg":$N,"../../lessons/bilder/ike-nassi.jpg":YN,"../../lessons/bilder/katherine-johnson.jpg":KN,"../../lessons/bilder/kino-saal.svg":XN,"../../lessons/bilder/kino-schleifen.svg":eF,"../../lessons/bilder/l01-pap.svg":tF,"../../lessons/bilder/l02-einfuegen.svg":nF,"../../lessons/bilder/l03-lochkarte-beschriftet.svg":iF,"../../lessons/bilder/l03-lochkarte.svg":aF,"../../lessons/bilder/l03-zuse-lochstreifen.svg":sF,"../../lessons/bilder/l04-camelcase.svg":rF,"../../lessons/bilder/l04-variable.svg":oF,"../../lessons/bilder/l04-zuweisung.svg":lF,"../../lessons/bilder/l05-tauschen.svg":uF,"../../lessons/bilder/l07-schreibtischtest-de.svg":mF,"../../lessons/bilder/l07-schreibtischtest-en.svg":cF,"../../lessons/bilder/l07-schreibtischtest-pt.svg":dF,"../../lessons/bilder/l08-zahlenstrahl.svg":hF,"../../lessons/bilder/l09-wahrheitstabelle.svg":gF,"../../lessons/bilder/l10-kopfgesteuert.svg":pF,"../../lessons/bilder/l11-vergleich.svg":fF,"../../lessons/bilder/l12-for-ablauf.svg":bF,"../../lessons/bilder/l12-while-zu-for.svg":xF,"../../lessons/bilder/l13-verschachtelt-tabelle.svg":vF,"../../lessons/bilder/l14-array.svg":wF,"../../lessons/bilder/l20-cpp.svg":yF,"../../lessons/bilder/l20-jvm.svg":zF,"../../lessons/bilder/margaret-hamilton.jpg":IF,"../../lessons/bilder/mvc-klick.svg":kF,"../../lessons/bilder/pt/aufgabe-mehrwertsteuer.svg":SF,"../../lessons/bilder/pt/kino-saal.svg":TF,"../../lessons/bilder/pt/kino-schleifen.svg":_F,"../../lessons/bilder/pt/l01-pap.svg":AF,"../../lessons/bilder/pt/l02-einfuegen.svg":jF,"../../lessons/bilder/pt/l03-lochkarte-beschriftet.svg":CF,"../../lessons/bilder/pt/l03-lochkarte.svg":DF,"../../lessons/bilder/pt/l04-camelcase.svg":BF,"../../lessons/bilder/pt/l04-variable.svg":PF,"../../lessons/bilder/pt/l04-zuweisung.svg":OF,"../../lessons/bilder/pt/l05-tauschen.svg":MF,"../../lessons/bilder/pt/l08-zahlenstrahl.svg":ZF,"../../lessons/bilder/pt/l10-kopfgesteuert.svg":LF,"../../lessons/bilder/pt/l11-vergleich.svg":WF,"../../lessons/bilder/pt/l12-for-ablauf.svg":EF,"../../lessons/bilder/pt/l12-while-zu-for.svg":NF,"../../lessons/bilder/pt/l13-verschachtelt-tabelle.svg":FF,"../../lessons/bilder/pt/l14-array.svg":RF,"../../lessons/bilder/pt/l20-cpp.svg":JF,"../../lessons/bilder/pt/l20-jvm.svg":GF,"../../lessons/bilder/pt/mvc-klick.svg":HF,"../../lessons/bilder/pt/schiffe-versenken.svg":VF,"../../lessons/bilder/pt/ss-binaere-suche.svg":qF,"../../lessons/bilder/pt/ss-bubblesort.svg":UF,"../../lessons/bilder/pt/ss-lineare-suche.svg":QF,"../../lessons/bilder/pt/ss-vergleiche.svg":$F,"../../lessons/bilder/pt/uebergabe.svg":YF,"../../lessons/bilder/pt/zk-zeichen.svg":KF,"../../lessons/bilder/schiffe-versenken.svg":XF,"../../lessons/bilder/ss-binaere-suche.svg":eR,"../../lessons/bilder/ss-bubblesort.svg":tR,"../../lessons/bilder/ss-lineare-suche.svg":nR,"../../lessons/bilder/ss-vergleiche.svg":iR,"../../lessons/bilder/uebergabe.svg":aR,"../../lessons/bilder/zk-zeichen.svg":sR}),Mp=i=>i.replace(/^.*\//,"");function Qn(i,e,t){const n=s=>new Map(Object.entries(i).filter(([r])=>{var o;return((o=e.exec(r))==null?void 0:o[1])===s}).map(([r,o])=>[Mp(r),o]));return[...new Map([...n("en"),...t==="en"?[]:n(t)])]}function Hm(i){return i==="de"?"de":i==="pt-PT"?"pt":"en"}let l1="en",ot=[],bn=[],ps="",fs=[],u1="off",qs=!1;function Vm(i){return i===qs?!1:(qs=i,ot=[],Vi(l1),u1==="on")}const qm=()=>u1==="on"&&qs&&ot.some(i=>i.blocks);function Um(i){i!==u1&&(u1=i,ot=[],Vi(l1))}function Vi(i){var r,o,l;if(Yb(i),i===l1&&ot.length>0)return;l1=i;const e=Qn(HR,/\/lessons\/([^/]+)\/[^/]+\.md$/,i),t=(u,m)=>u.filter(([c])=>/^\d+/.test(c)).map(([c,d])=>JR(Qm(d,m),`${i}/${c}`)).sort((c,d)=>c.number-d.number),n=(u,m,c)=>u.map(([d,h])=>{const g=GR(Qm(h,c),`${i}/${m}${d}`);return c&&g.after!==void 0?{...g,after:c.get(g.after)??g.after}:g}),a=Qn(VR,/\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/,i),s=u1==="on"&&qs?Qn(qR,/\/lessons\/([^/]+)\/visubot\/bloecke\/[^/]+\.md$/,i):[];if(s.some(([u])=>/^\d+/.test(u))){const u=io(s);ot=t(s,u.renumber).map(c=>({...c,number:u.number.get(c.id),robot:!0,blocks:!0})).sort((c,d)=>c.number-d.number);const m=Qn(UR,/\/lessons\/([^/]+)\/visubot\/bloecke\/aufgaben\/[^/]+\.md$/,i);bn=n(m,"visubot/bloecke/aufgaben/",u.renumber).map(c=>({...c,robot:!0}))}else if(u1==="on"){const u=Qn(Gm,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i),m=io(u);ot=t(u,m.renumber).map(d=>({...d,number:m.number.get(d.id),robot:!0})).sort((d,h)=>d.number-h.number);const c=Qn(QR,/\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/,i);bn=n(c,"visubot/aufgaben/",m.renumber).map(d=>({...d,robot:!0}))}else{const u=e.filter(([c])=>/^\d+/.test(c)),m=io(u);ot=t(u,m.renumber).map(c=>({...c,number:m.number.get(c.id)})).sort((c,d)=>c.number-d.number),bn=n(a,"aufgaben/",m.renumber)}bn.sort((u,m)=>(u.after??0)-(m.after??0)||u.level-m.level||u.title.localeCompare(m.title,i));for(const u of[...ot.flatMap(m=>m.steps.flatMap(c=>c.blocks)),...bn.flatMap(m=>m.blocks)])u.kind==="textFile"&&ox(u.name,u.content);if(ps=((r=e.find(([u])=>u==="nachschlagen.md"))==null?void 0:r[1])??"",u1!=="off"){const u=(o=Qn(Gm,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i).find(([m])=>m==="nachschlagen.md"))==null?void 0:o[1];u&&(ps=`${ps.trimEnd()} - -${u}`)}fs=rR(((l=e.find(([u])=>u==="begriffe.md"))==null?void 0:l[1])??"")}function io(i){const e=i.map(([a])=>a).filter(a=>/^\d+/.test(a)).sort((a,s)=>Number(/^\d+/.exec(a)[0])-Number(/^\d+/.exec(s)[0])||a.localeCompare(s)),t=new Map,n=new Map;return e.forEach((a,s)=>{t.set(a.replace(/\.md$/,""),s+1);const r=Number(/^\d+/.exec(a)[0]);n.has(r)||n.set(r,s+1)}),{number:t,renumber:n}}function Qm(i,e){return e?i.replace(/\b(Lektion(?:en)?|Lessons?|Li[cç](?:ão|ões))(\s+\d+(?:\s*(?:,|bis|und|and|to|a|e|–|-)\s*\d+)*)/gi,(t,n,a)=>n+a.replace(/\d+/g,s=>String(e.get(Number(s))??s))):i}Vi("en");function Zp(i,e){return l1==="de"?i.get(e)??i.get(`en/${e}`):(l1==="en"?void 0:i.get(`${l1}/${e}`))??i.get(`en/${e}`)??i.get(e)}const Lp=(i,e)=>i.slice(i.indexOf(e)+e.length),XR=new Map(Object.entries($R).map(([i,e])=>[Lp(i,"/diagramme/"),e]));function bi(i){const e=Zp(XR,i);return e===void 0?void 0:z0(e)}const eJ=new Map(Object.entries(KR).map(([i,e])=>[Lp(i,"/bilder/"),e]));function Ba(i){return Zp(eJ,i)}const tJ=new Map(Object.entries(YR).map(([i,e])=>[Mp(i).replace(/\.txt$/,""),e])),$m=new Map;function bs(i){const e=tJ.get(i);if(e===void 0)return;let t=$m.get(i);return t||$m.set(i,t=Xg(e)),t}const Wp=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function Ae(i){const e=[];let t=Wp(i).replace(/`([^`]+)`/g,(n,a)=>(e.push(a),`\0${e.length-1}\0`));return t=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/(^|[^*])\*([^*\s][^*]*?)\*/g,"$1$2").replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(n,a,s)=>{const r=/^\?(visustruct|visubot)(&lektion=[\w-]+)?$/.test(s),o=r||/^(https?:|mailto:|#|\.{0,2}\/)/.test(s)?s:"#",l=r||/^https?:/.test(o)?' target="_blank" rel="noopener noreferrer"':"";return`${a}`}).replace(/\[([^\]]+)\]\{\.(blau|orange|gruen|gelb|rosa)\}/g,'$1').replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g,'$1'),t.replace(/\u0000(\d+)\u0000/g,(n,a)=>`${e[Number(a)]}`)}function Bn(i){const e=[],t=i.replace(/\r\n/g,` -`).split(` -`);let n=0;for(;n${Wp(c.join(` -`))}`);continue}const s=/^(#{2,4})\s+(.*)$/.exec(a);if(s){const o=s[1].length,l=/\s*\{\.([a-z][a-z-]*)\}$/.exec(s[2]),u=l?s[2].slice(0,l.index):s[2];e.push(`${Ae(u)}`),n++;continue}if(/^\s*([-*]|\d+\.)\s+/.test(a)){const o=/^\s*\d+\./.test(a),l=[];for(;n${Ae(u)}`)}e.push(o?`
      ${l.join("")}
    `:`
      ${l.join("")}
    `);continue}if(a.startsWith("|")&&/^\|?[\s:|-]*-{3,}[\s:|-]*$/.test(t[n+1]??"")){const o=m=>m.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(c=>Ae(c.trim())),l=o(a);n+=2;const u=[];for(;n${l.map(m=>``).join("")}${u.map(m=>`${m.map(c=>``).join("")}`).join("")}
    ${m}
    ${c}
    `);continue}if(a.startsWith(">")){const o=[];for(;n");)o.push(t[n++].replace(/^>\s?/,""));e.push(``);continue}const r=[];for(;n|\||\s*([-*]|\d+\.)\s+)/.test(t[n]);)r.push(t[n++].trim());e.push(`

    ${Ae(r.join(" "))}

    `)}return e.join(` -`)}const k1=""+new URL("ludwig-Cus1i402.webp",import.meta.url).href,Il="f4ecc8e489ae7865308288c7d0fa313333cf2be3ff529b23bc214bee010310e0",Y0="visustruct.learn.teacher";let K0=!1;function Ym(){if(K0)return!0;try{return localStorage.getItem(Y0)===Il}catch{return!1}}async function nJ(i){const e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(i));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}async function iJ(i){let e=!1;try{e=await nJ(i.trim())===Il}catch{return!1}if(e){K0=!0;try{localStorage.setItem(Y0,Il)}catch{}}return e}function aJ(){K0=!1;try{localStorage.removeItem(Y0)}catch{}}function Ep(i,e,t=!1){const n=document.createElement("figure");n.className=t?"learn-file written":"learn-file";const a=document.createElement("figcaption"),s=document.createElement("span");s.className="learn-file-icon",s.setAttribute("aria-hidden","true"),s.textContent="📄",a.append(s,t?p("web_sim_written_file_fmt",i):i);const r=document.createElement("pre");return r.className="learn-file-text",r.dir="ltr",e.replace(/\n$/,"").split(` -`).forEach((l,u)=>{const m=document.createElement("span");m.className="ln",m.textContent=String(u+1),r.append(m,l+` -`)}),n.append(a,r),n}function Np(i){return[...i].map(([e,t])=>Ep(e,t,!0))}function m1(i){switch(i.kind){case"finished":return p("sim_notice_finished");case"infiniteLoopWithoutBody":return p("sim_notice_infinite_loop_empty");case"unsupportedStatement":return p("sim_notice_unsupported_statement_fmt",i.text);case"invalidExpression":return p("sim_notice_invalid_expression_fmt",i.text);case"unknownVariable":return i.similar?p("web_sim_unknown_variable_case_fmt",i.text,i.similar):p("sim_notice_unknown_variable_fmt",i.text);case"divisionByZero":return p("sim_notice_division_by_zero");case"wholeNumberExpected":return p("sim_notice_whole_number_expected");case"numberExpected":return p("sim_notice_number_expected");case"booleanExpected":return p("sim_notice_boolean_expected");case"subprogramNotFound":return p("sim_notice_subprogram_not_found_fmt",i.text);case"callTooDeep":return p("sim_notice_call_too_deep");case"callArguments":return p("web_sim_call_arguments_fmt",i.text);case"missingReturn":return p("web_sim_missing_return_fmt",i.text);case"fileNotFound":return p("web_sim_file_not_found_fmt",i.text);case"endOfFile":return p("web_sim_end_of_file_fmt",i.text);case"nullValue":return p("web_sim_null_value_fmt",i.text);case"other":return i.text}}const Oe=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Km=["0.2","0.5","1.0","1.5","2.0"],sJ=i=>Number(i).toLocaleString(In()==="java"?"en":In(),{minimumFractionDigits:1}),ao="visustruct.simulation.stepDelay",Xm="visustruct.simulation.highlightMode";function so(i){try{return localStorage.getItem(i)}catch{return null}}function ec(i,e){try{localStorage.setItem(i,e)}catch{}}class rJ{constructor(e,t,n=()=>{},a=()=>{},s=()=>{}){y(this,"element");y(this,"engine");y(this,"isPlaying",!1);y(this,"playTimer");y(this,"wasPlayingBeforeInput",!1);y(this,"delay",Km.includes(so(ao)??"")?so(ao):"0.5");y(this,"highlightMode",so(Xm)==="nextToExecute"?"nextToExecute":"lastExecuted");y(this,"buttons");y(this,"inputSection");y(this,"trace");y(this,"variables");y(this,"output");y(this,"transcript",[]);y(this,"printed",0);y(this,"notice");y(this,"editButton");y(this,"robot");y(this,"liveBusy",!1);this.currentDocument=e,this.onHighlight=t,this.findSubprogram=n,this.onEdit=a,this.onTranscript=s,this.engine=new Wi(e(),n),this.element=document.createElement("aside"),this.element.className="simpanel",this.build()}setRobot(e){var t;this.robot!==e&&((t=this.robot)==null||t.element.remove(),this.robot=e,e&&(this.element.querySelector("section").after(e.element),e.onWorldChange=()=>this.restartEngine(),e.reset()))}showRobot(){var e;(e=this.robot)==null||e.show()}begin(){this.pause(),this.restartEngine(),this.showRobot()}end(){this.pause()}step(){var n,a,s;if((n=this.robot)!=null&&n.live){this.stepLive();return}if(!this.engine.canStep){this.pause();return}const e=this.isPlaying,t=this.engine.currentStepPath;(a=this.robot)==null||a.prepare(this.engine),this.engine.step(),(s=this.robot)==null||s.follow(this.engine.state.robotActions,e?Number(this.delay)*850:450),this.afterStep(e,t)}async stepLive(){if(this.liveBusy)return;if(!this.engine.canStep){this.pause();return}this.liveBusy=!0;const e=this.robot,t=this.isPlaying,n=this.engine.currentStepPath;try{await e.prepareLive(this.engine,Xb(JSON.stringify(this.currentDocument()))),this.engine.step(),e.follow(this.engine.state.robotActions,450),await e.drive(this.engine.state.robotActions)}catch(a){e.liveFailed(a),this.isPlaying=!1}finally{this.liveBusy=!1}this.afterStep(t,n)}afterStep(e,t){this.collectOutput(),this.highlightMode==="nextToExecute"&&this.engine.canStep?this.onHighlight(this.engine.currentStepPath):this.onHighlight(t??this.engine.currentStepPath),this.engine.state.inputRequest&&e&&(this.wasPlayingBeforeInput=!0),this.engine.canStep||this.pause(),this.update()}reset(){this.pause(),this.restartEngine()}play(){if(this.isPlaying||!this.engine.canStep)return;this.isPlaying=!0;const e=async()=>{var t;this.playTimer=void 0,this.isPlaying&&((t=this.robot)!=null&&t.live?await this.stepLive():this.step(),this.isPlaying&&this.engine.canStep?this.playTimer=window.setTimeout(()=>void e(),Number(this.delay)*1e3):(this.isPlaying=!1,this.update()))};e()}pause(){this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.isPlaying=!1,this.update()}submitInput(e){var s,r;const t=this.isPlaying||this.wasPlayingBeforeInput;this.pause();const n=((s=this.engine.state.inputRequest)==null?void 0:s.prompt)??"",a=(r=this.engine.state.inputRequest)==null?void 0:r.continuesLine;if(this.engine.provideInput(e.value),!this.engine.state.inputRequest){const o=this.transcript[this.transcript.length-1];a&&o&&o.typed===void 0?o.typed=e.value:this.transcript.push({text:n?`${n} `:"",typed:e.value}),e.value=""}this.onHighlight(this.engine.currentStepPath),t&&this.engine.canStep&&(this.wasPlayingBeforeInput=!1,this.play()),this.update()}restartEngine(){var e;this.engine=new Wi(this.currentDocument(),this.findSubprogram),this.transcript=[],this.printed=0,this.wasPlayingBeforeInput=!1,(e=this.robot)==null||e.reset(),this.onHighlight(this.engine.currentStepPath),this.update()}build(){this.element.innerHTML=` -
    -

    ${Oe(p("simulation_controls"))}

    -
    - - - - -
    - - -
    -

    - -

    ${Oe(p("simulation_input"))}

    -

    ${Oe(p("simulation_trace"))}

    -

    ${Oe(p("simulation_variables"))}

    -

    ${Oe(p("simulation_output"))}

    - `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,ec(Xm,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,ec(ao,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

    ${Oe(p("simulation_variables_placeholder"))}

    `;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(Fp(u)):m.textContent=_e(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

    ${Oe(p("simulation_output_placeholder"))}

    `:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...Np(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

    ${Oe(p("simulation_input_placeholder"))}

    `;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

    `;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?m1(r):"",o.hidden=!r}}function Fp(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const B1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Kn=360/B1.length,oJ="http://www.w3.org/2000/svg";function Ge(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function zt(i,e={},t){const n=document.createElementNS(oJ,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function lJ(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function tc(i,e){const t=zt("g",{class:e}),n=B1.map((a,s)=>{const r=zt("g",{transform:`rotate(${s*Kn})`});return r.append(zt("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function uJ(i,e){let t=i,n=!1,a=-t*Kn;const s=Ge("section",{class:"learn-game learn-caesar"});s.append(Ge("div",{class:"learn-game-head"},Ge("strong",{},p("web_learn_caesar_title")))),s.append(Ge("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=zt("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(zt("circle",{r:196,class:"outer-disc"})),r.append(zt("path",{d:mJ(196,92,Kn/2),class:"window"}));const o=tc(168,"outer-letters");r.append(o.group);for(let j=0;j{o.cells.forEach((Z,F)=>Z.classList.toggle("marked",F===j)),u.cells.forEach((Z,F)=>Z.classList.toggle("marked",j!==void 0&&F===(j+t)%26))},k=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),x.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),b.classList.toggle("active",n),z.textContent=lJ(v.value,n?-t:t)||" ";const j=Array.from(v.value.toUpperCase()).reverse().find(F=>B1.includes(F));if(j===void 0)return T();const Z=B1.indexOf(j);T(n?(Z-t+26)%26:Z)},C=j=>{t=(j%26+26)%26,a=-t*Kn,k()};c.addEventListener("click",()=>C(t-1)),d.addEventListener("click",()=>C(t+1)),f.addEventListener("click",()=>{var j;n&&(v.value=((j=z.textContent)==null?void 0:j.trim())??""),n=!1,k()}),b.addEventListener("click",()=>{var j;n||(v.value=((j=z.textContent)==null?void 0:j.trim())??""),n=!0,k()}),v.addEventListener("input",k),o.cells.forEach((j,Z)=>j.addEventListener("click",()=>T(Z)));let P;const D=j=>{const Z=r.getBoundingClientRect();return Math.atan2(j.clientY-(Z.top+Z.height/2),j.clientX-(Z.left+Z.width/2))*180/Math.PI};l.addEventListener("pointerdown",j=>{const Z=j;P=D(Z)-a,l.classList.add("dragging"),r.setPointerCapture(Z.pointerId),Z.preventDefault()}),r.addEventListener("pointermove",j=>{if(P===void 0)return;a=D(j)-P,l.setAttribute("transform",`rotate(${a})`);const Z=Math.round(-a/Kn);if((Z%26+26)%26!==t){t=(Z%26+26)%26;const F=a;k(),a=F,l.setAttribute("transform",`rotate(${a})`)}});const B=()=>{P!==void 0&&(P=void 0,l.classList.remove("dragging"),C(t))};return r.addEventListener("pointerup",B),r.addEventListener("pointercancel",B),k(),s}function mJ(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const X0=i=>p(`web_visubot_part_${i}`),Rp=new WeakMap;function Jp(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=X0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=ee(async()=>{const{Robot3D:c}=await import("./robot3d-CJE1N58D.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const b=s.getBoundingClientRect();o(f,g.clientX-b.left,g.clientY-b.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const b=s.getBoundingClientRect();o(f,g.clientX-b.left,g.clientY-b.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return Rp.set(a,m),m}function cJ(i,e,t=!1){return Jp(i,e,t).box}function dJ(i){const e=i.querySelector(".visubot-model"),t=e&&Rp.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(X0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function hJ(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=Bn(`**${t+1}/${i.length}** ${i[t].question}`)},r=Jp([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",X0(l));return}t++,a.className="visubot-quiz-feedback right",t{m.forEach(w=>{window.clearTimeout(w),window.clearInterval(w)}),m=[]},d=()=>{s.textContent=`${p("web_game_round_fmt",l+1,o)} · ${p("web_game_score_fmt",u)}`},h=()=>{const w=K("button",{class:"primary"},l+1{l++,l{const w=i.rounds[l],z=i.seconds,I=K("div",{class:"learn-bomb-fuse"},K("span",{})),T=K("span",{class:"learn-bomb-time"}),k=K("div",{class:"learn-bomb","aria-live":"polite"},K("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),T,I),C=K("div",{class:"learn-game-feedback",role:"status"}),P=w.wrongPart!==void 0,D=[],B=w.code.split(` -`).map((ie,ue)=>{if(!P){const _=K("button",{class:"ln",type:"button"},ie||" ");return _.disabled=!ie.trim(),D.push({button:_,line:ue+1,right:ue+1===w.wrongLine}),_}const N=K("div",{class:"ln parts"});ie.trim()||N.append(" ");for(const _ of xp(ie)){if(!_.part){N.append(_.text);continue}const M=K("button",{class:"part",type:"button"},_.text);D.push({button:M,line:ue+1,right:ue+1===w.wrongLine&&_.text===w.wrongPart}),N.append(M)}return N});for(const ie of D)ie.button.addEventListener("click",()=>U(ie.right?"right":ie.line===w.wrongLine?"part":"wrong",ie.button));const j=K("div",{class:`learn-game-code learn-bomb-code mono${P?" by-parts":""}`,dir:"ltr"},...B),Z=Date.now(),F=()=>{if(!n.isConnected&&Date.now()-Z>1e3)return c();const ie=Math.max(0,z-(Date.now()-Z)/1e3);T.textContent=p("web_game_time_fmt",Math.ceil(ie)),I.firstChild.style.width=`${ie/z*100}%`,k.classList.toggle("hurry",ie<=5),ie<=0&&U("time")},U=(ie,ue)=>{c();for(const M of D)M.button.disabled=!0,M.right&&M.button.classList.add("right");P&&B[w.wrongLine-1].classList.add("right"),ue&&ie!=="right"&&ue.classList.add("wrong");const N=ie==="right";N&&u++,d(),k.classList.add(N?"defused":"boom"),k.firstChild.textContent=N?"✂️":"💥",C.className=`learn-game-feedback ${N?"right":"wrong"}`;const _=h();C.replaceChildren(K("p",{},p(N?"web_game_defused":ie==="time"?"web_game_boom_time":ie==="part"?"web_game_boom_part":P?"web_game_boom_wrong_part":"web_game_boom_wrong")),$n("div",{class:"learn-game-explain"},w.explanation),K("p",{class:"learn-bomb-fix"},`${p("web_game_fix")} `,K("code",{},w.fix.trim())),_),_.focus({preventScroll:!0})},ne=$n("p",{class:"learn-game-question"},w.question);P&&ne.append(" ",K("span",{class:"learn-bomb-hint"},p("web_game_bomb_parts_hint"))),r.replaceChildren(k,ne,j,C),F();const ge=window.setInterval(F,200);m.push(ge)},f=()=>{const w=i.rounds[l],z=[];w.code.trim()&&z.push(ic(w.code).element),z.push($n("p",{class:"learn-game-question"},w.question),K("p",{class:"learn-order-hint"},p("web_game_order_hint")));const I=K("div",{class:"learn-game-options learn-order"}),T=K("div",{class:"learn-game-feedback",role:"status"});let k=0;const C=pJ(w.options.length).map(D=>{const B=K("span",{class:"learn-order-badge","aria-hidden":"true"}),j=K("span",{});j.innerHTML=Ae(w.options[D].text);const Z=K("button",{},B,j);return Z.addEventListener("click",()=>{if(D!==k)return Z.classList.add("wrong"),P(!1);Z.classList.add("right"),B.textContent=String(++k),Z.disabled=!0,k===w.options.length&&P(!0)}),I.append(Z),{k:D,b:Z,badge:B}}),P=D=>{for(const{k:j,b:Z,badge:F}of[...C].sort((U,ne)=>U.k-ne.k))Z.disabled=!0,F.textContent=String(j+1),I.append(Z);D&&u++,d(),T.className=`learn-game-feedback ${D?"right":"wrong"}`;const B=h();T.replaceChildren(K("p",{},p(D?"web_game_right":"web_game_wrong_short")),$n("div",{class:"learn-game-explain"},w.explanation),B),B.focus({preventScroll:!0})};r.replaceChildren(...z,I,T)},b=()=>{if(c(),i.kind==="bombe"||i.kind==="reihenfolge"){d(),i.kind==="bombe"?g():f();return}const w=i.rounds[l];d();const z=ic(w.code),I=[];let T;i.kind==="zuhoerer"?(T=fJ(wp(w.code),z),I.push(K("div",{class:"learn-swing-row"},z.element,T.element)),w.clicks.length&&I.push(K("p",{class:"learn-swing-clicks"},`${p("web_game_clicks")} `,...w.clicks.flatMap((B,j)=>[...j?[" → "]:[],K("code",{},B)])))):w.code.trim()&&I.push(t&&i.kind==="frage"&&gp(w.code)||z.element),I.push($n("p",{class:"learn-game-question"},w.question));const k=K("div",{class:`learn-game-options ${i.kind==="layout"?"pictures":""}`}),C=K("div",{class:"learn-game-feedback",role:"status"}),P=w.options.map(B=>{const j=K("button",{});return i.kind==="layout"?j.append(xJ(B.text)):B.text.includes(` -`)?j.append(bJ(B.text)):j.innerHTML=Ae(B.text),j.addEventListener("click",()=>D(B.right,j)),k.append(j),j}),D=(B,j)=>{P.forEach((F,U)=>{F.disabled=!0,w.options[U].right&&F.classList.add("right")}),B||j.classList.add("wrong"),B&&u++,d(),C.className=`learn-game-feedback ${B?"right":"wrong"}`;const Z=h();C.replaceChildren(K("p",{},p(B?"web_game_right":"web_game_wrong_short")),$n("div",{class:"learn-game-explain"},w.explanation)),C.append(Z),T&&(m=T.replay(w.clicks,()=>Z.before(K("p",{class:"learn-swing-try"},p("web_game_try"))))),Z.focus({preventScroll:!0})};r.replaceChildren(...I,k,C)},x=()=>{c(),s.textContent="";const w=K("button",{class:"primary"},p("web_game_again"));w.addEventListener("click",()=>{l=u=0,b()}),r.replaceChildren(K("p",{class:"learn-game-result"},p("web_game_done_fmt",u,o)),K("p",{},p(u===o?"web_game_perfect":u>=o*.7?"web_game_good":"web_game_practice_short")),w)},v=K("button",{class:"primary"},p("web_game_start"));return v.addEventListener("click",b),r.append($n("p",{},i.intro),v),n}function pJ(i){const e=[...Array(i).keys()];for(;e.every((t,n)=>t===n);)for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function ic(i){const e=i.split(` -`).map(n=>K("div",{class:"ln"},n||" "));return{element:K("pre",{class:"learn-game-code mono",dir:"ltr"},...e),highlight(n,a){e.forEach((s,r)=>s.classList.toggle("hit",n!==void 0&&r>=n&&r<=(a??n)))}}}function fJ(i,e){const t=yp(i),n=K("div",{class:"learn-swing-window",dir:"ltr"});n.append(K("div",{class:"learn-swing-title"},i.title||" "));const a=K("div",{class:"learn-swing-body"}),s=new Map;for(const c of i.labels){const d=K("div",{class:"learn-swing-label"},t.texts[c.name]);s.set(c.name,d),a.append(d)}const r=i.buttons.map(c=>{const d=K("button",{class:"learn-swing-button",disabled:""},t.texts[c.name]);return s.set(c.name,d),a.append(d),d}),o=K("p",{class:"learn-swing-event",role:"status"}),l=K("pre",{class:"learn-swing-console mono",hidden:""});n.append(a,o,l);const u=c=>{var h,g;const d=s.get(c.button);d.classList.add("pressed"),window.setTimeout(()=>d.classList.remove("pressed"),350),e.highlight((h=c.listener)==null?void 0:h.from,(g=c.listener)==null?void 0:g.to),o.textContent=c.listener?p("web_game_event_fmt",d.textContent??""):p("web_game_nobody"),o.className=`learn-swing-event ${c.listener?"heard":"nobody"}`;for(const[f,b]of Object.entries(c.texts)){const x=s.get(f);x&&x.textContent!==b&&(x.textContent=b,x.classList.remove("changed"),x.offsetWidth,x.classList.add("changed"))}c.console.length&&(l.hidden=!1,l.textContent+=c.console.map(f=>`${f} -`).join(""))},m=c=>u(zp(i,t,c));return{element:n,replay(c,d){const h=c.map((g,f)=>window.setTimeout(()=>m(g),(f+.3)*nc));return h.push(window.setTimeout(()=>{i.buttons.forEach((g,f)=>{r[f].disabled=!1,r[f].addEventListener("click",()=>u(Ip(i,t,g.name)))}),d()},(c.length+.3)*nc)),h}}}function bJ(i){return K("pre",{class:"learn-game-file mono",dir:"ltr"},i)}function xJ(i){const e=vp(i),t=K("div",{class:"learn-layout-window",dir:"ltr"},K("div",{class:"learn-layout-title"})),n=K("div",{class:`learn-layout-body ${e.kind}`}),a=(s,r)=>K("span",{class:"learn-layout-cell",...r?{style:`grid-area:${r}`}:{}},s);if(e.kind==="border")for(const[s,r]of Object.entries(e.areas))n.append(a(r,s));else if(e.kind==="grid"){const s=Math.max(...e.rows.map(r=>r.length));n.style.gridTemplateColumns=`repeat(${s}, 1fr)`;for(const r of e.rows)for(let o=0;oa(r))));return t.append(n),t}function H(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function an(i,e,t){const n=H(i,e);return n.innerHTML=Ae(t),n}function ac(i){return H("pre",{class:"learn-game-code mono",dir:"ltr"},...i.split(` -`).map(e=>H("div",{class:"ln"},e||" ")))}function vJ(i,e){const t=H("section",{class:"learn-game learn-rescue"}),n=H("div",{class:"learn-game-head"});n.append(H("img",{src:e,alt:"",width:"40",height:"40"}),H("strong",{},i.title));const a=i.stations.length,s=i.stations.map(()=>H("span",{class:"learn-rescue-dot"})),r=H("img",{class:"learn-rescue-ludwig",src:e,alt:"",width:"32",height:"32"}),o=H("span",{class:"learn-rescue-tower","aria-hidden":"true"},"🏰",H("span",{class:"learn-rescue-zora"},"🐐"),H("span",{class:"learn-rescue-fox"},"🦊")),l=H("span",{class:"learn-rescue-free"},"🐐"),u=H("div",{class:"learn-rescue-path","aria-hidden":"true"},r,...s,o),m=H("p",{class:"learn-game-status"}),c=H("div",{class:"learn-game-stage"}),d=Gp(i);t.append(n,u,m,c);let h=0;const g=()=>{s.forEach((I,T)=>I.classList.toggle("done",T{const I=[...i.alphabet].map((T,k)=>H("span",{class:"learn-rescue-letter"},H("b",{},T),H("small",{},String(k))));return{element:H("div",{class:"learn-rescue-alphabet mono",dir:"ltr"},...I),cells:I}},b=I=>{const T=i.stations[I];m.textContent=p("web_learn_rescue_station_fmt",I+1,a,T.name);const k=f(),C=H("input",{type:"text",inputmode:"numeric",autocomplete:"off",class:"learn-rescue-number mono","aria-label":p("web_learn_rescue_number")}),P=H("button",{class:"primary"},p("web_learn_check")),D=H("div",{class:"learn-game-feedback",role:"status"}),B=()=>{const j=C.value.trim();if(!/^-?\d+$/.test(j)){D.className="learn-game-feedback wrong",D.replaceChildren(H("p",{},p("web_learn_rescue_not_number")));return}if(Number(j)!==T.answer){D.className="learn-game-feedback wrong",D.replaceChildren(H("p",{},p("web_learn_rescue_wrong")),...T.hint?[an("div",{class:"learn-game-explain"},`**${p("web_learn_hint")}:** ${T.hint}`)]:[]),C.select();return}C.disabled=P.disabled=!0;const Z=i.alphabet.charAt(T.answer);k.cells[T.answer].classList.add("hit"),d.give(T.row,T.col,Z),h++,g();const F=I+1===a,U=H("button",{class:"primary"},p(F?"web_learn_rescue_to_crossword":"web_game_next"));U.addEventListener("click",()=>F?x():b(I+1)),D.className="learn-game-feedback right",D.replaceChildren(H("p",{},p("web_game_right")),H("p",{class:"learn-rescue-charat mono",dir:"ltr"},`alphabet.charAt(${T.answer})`,H("span",{"aria-hidden":"true"}," → "),H("code",{},`'${Z}'`)),an("div",{class:"learn-game-explain"},T.explanation),H("p",{class:"learn-rescue-moved"},p("web_learn_rescue_letter_moved")),U),U.focus({preventScroll:!0})};P.addEventListener("click",B),C.addEventListener("keydown",j=>{j.key==="Enter"&&B()}),c.replaceChildren(ac(T.code),an("p",{class:"learn-game-question"},T.question),H("div",{class:"learn-rescue-answer"},C,P),D,H("p",{class:"learn-rescue-label"},p("web_learn_rescue_alphabet")),ac(`String alphabet = "${i.alphabet}";`),k.element,d.element),C.focus({preventScroll:!0})},x=()=>{m.textContent=p("web_learn_rescue_crossword");const I=H("div",{class:"learn-game-feedback",role:"status"}),T=H("button",{class:"primary"},p("web_learn_check"));T.addEventListener("click",()=>{if(!d.check()){I.className="learn-game-feedback wrong",I.replaceChildren(H("p",{},p("web_learn_rescue_cw_wrong")));return}T.disabled=!0,d.lock();const k=H("button",{class:"primary"},p("web_learn_rescue_to_gate"));k.addEventListener("click",v),I.className="learn-game-feedback right",I.replaceChildren(H("p",{},p("web_learn_rescue_cw_done")),k),k.focus({preventScroll:!0})}),d.unlock(),c.replaceChildren(an("p",{},i.crosswordText),d.element,T,I),d.focusFirst()},v=()=>{m.textContent=p("web_learn_rescue_gate");const I=H("input",{type:"text",autocomplete:"off",autocapitalize:"off",spellcheck:"false",class:"learn-rescue-word mono",size:String(i.keyword.length+2),"aria-label":p("web_learn_rescue_word")}),T=i.gateCode.split(` -`).map(D=>{const B=D.indexOf(Vs);return B<0?H("div",{class:"ln"},D||" "):H("div",{class:"ln"},D.slice(0,B),I,D.slice(B+Vs.length))}),k=H("button",{class:"primary"},p("web_learn_rescue_open")),C=H("div",{class:"learn-game-feedback",role:"status"}),P=()=>{const D=I.value.trim();if(D!==i.keyword){const j=D.toUpperCase()===i.keyword.toUpperCase();C.className="learn-game-feedback wrong",C.replaceChildren(H("p",{},p(j?"web_learn_rescue_gate_case":"web_learn_rescue_gate_wrong"))),I.select();return}I.disabled=k.disabled=!0,t.classList.add("freed"),r.after(l),m.textContent="";const B=H("button",{},p("web_game_again"));B.addEventListener("click",w),C.className="learn-game-feedback right",C.replaceChildren(H("p",{},p("web_learn_rescue_freed")),an("div",{class:"learn-game-explain"},i.end),B)};k.addEventListener("click",P),I.addEventListener("keydown",D=>{D.key==="Enter"&&P()}),c.replaceChildren(an("p",{},i.gateText),H("div",{class:"learn-game-code mono learn-rescue-gate",dir:"ltr"},...T),k,C),I.focus({preventScroll:!0})},w=()=>{h=0,t.classList.remove("freed"),l.remove(),d.reset(),g(),b(0)},z=H("button",{class:"primary"},p("web_game_start"));return z.addEventListener("click",w),c.append(an("p",{},i.intro),z),t}function wJ(i,e){const t=H("section",{class:"learn-game learn-rescue learn-crossword-game"}),n=H("div",{class:"learn-game-head"});n.append(H("img",{src:e,alt:"",width:"40",height:"40"}),H("strong",{},i.title));const a=Gp(i),s=H("div",{class:"learn-game-feedback",role:"status"}),r=H("button",{class:"primary"},p("web_learn_check"));return r.addEventListener("click",()=>{if(!a.check()){s.className="learn-game-feedback wrong",s.replaceChildren(H("p",{},p("web_learn_rescue_cw_wrong")));return}r.disabled=!0,a.lock();const o=H("button",{},p("web_game_again"));o.addEventListener("click",()=>{a.reset(),a.unlock(),r.disabled=!1,s.className="learn-game-feedback",s.replaceChildren(),a.focusFirst()}),s.className="learn-game-feedback right",s.replaceChildren(H("p",{},p("web_learn_rescue_cw_done")),H("p",{class:"learn-game-result"},H("span",{class:"mono",dir:"ltr"},i.keyword)),...i.end?[an("p",{},i.end)]:[],o)}),a.unlock(),t.append(n,an("p",{},i.intro),a.element,r,s),t}function Gp(i){const e=gR(i),t=new Map(i.solution.map((g,f)=>[`${g.row} ${g.col}`,f])),n=new Map;for(const g of i.words)n.set(`${g.row} ${g.col}`,g.number);const a=new Map,s=H("div",{class:"learn-cw-grid",dir:"ltr"});s.style.gridTemplateColumns=`repeat(${i.cols}, var(--cw-cell))`;let r=!0;const o=(g,f)=>i.words.filter(b=>b.across?b.row===g&&f>=b.col&&f=b.row&&g{var v;const x=r?`${g} ${f+b}`:`${g+b} ${f}`;(v=a.get(x))==null||v.focus()};e.forEach((g,f)=>g.forEach((b,x)=>{if(!b)return s.append(H("span",{class:"learn-cw-empty"}));const v=`${f} ${x}`,w=H("input",{type:"text",maxlength:"1",autocomplete:"off",autocapitalize:"characters",spellcheck:"false","aria-label":p("web_learn_rescue_cell_fmt",f+1,x+1)});w.disabled=!0,w.addEventListener("focus",()=>{const k=o(f,x);k.some(C=>C.across===r)||(r=k[0].across),w.select()}),w.addEventListener("input",()=>{w.value=w.value.slice(-1).toUpperCase(),w.classList.remove("wrong"),c(),w.value&&l(f,x,1)}),w.addEventListener("keydown",k=>{if(k.key==="Backspace"&&!w.value)l(f,x,-1);else if(k.key==="ArrowRight"||k.key==="ArrowLeft")r=!0,l(f,x,k.key==="ArrowRight"?1:-1);else if(k.key==="ArrowDown"||k.key==="ArrowUp")r=!1,l(f,x,k.key==="ArrowDown"?1:-1);else return;k.preventDefault()}),a.set(v,w);const z=t.get(v),I=H("span",{class:`learn-cw-cell${z!==void 0?" key":""}`}),T=n.get(v);T&&I.append(H("small",{class:"learn-cw-number"},String(T))),z!==void 0&&I.append(H("small",{class:"learn-cw-keyindex"},String(z+1))),I.append(w),s.append(I)}));const u=g=>{const f=H("ol",{class:"learn-cw-clues"});for(const b of i.words.filter(x=>x.across===g).sort((x,v)=>x.number-v.number)){const x=an("li",{value:String(b.number)},`${b.clue} (${b.word.length})`);x.addEventListener("click",()=>{var v;r=b.across,(v=a.get(`${b.row} ${b.col}`))==null||v.focus()}),f.append(x)}return H("div",{},H("strong",{},p(g?"web_learn_rescue_across":"web_learn_rescue_down")),f)},m=i.solution.map(()=>H("span",{class:"learn-cw-keybox"})),c=()=>i.solution.forEach((g,f)=>m[f].textContent=a.get(`${g.row} ${g.col}`).value||" "),d=H("div",{class:"learn-cw"},H("div",{class:"learn-cw-board"},s,H("p",{class:"learn-cw-keyword"},`${p("web_learn_rescue_keyword")} `,H("span",{class:"mono",dir:"ltr"},...m))),H("div",{class:"learn-cw-cluebox"},u(!0),u(!1))),h=new Set;return{element:d,give(g,f,b){const x=a.get(`${g} ${f}`);x.value=b,x.parentElement.classList.add("given","arrived"),h.add(`${g} ${f}`),c()},unlock(){for(const[g,f]of a)f.disabled=h.has(g)},lock(){for(const g of a.values())g.disabled=!0},focusFirst(){var g;(g=[...a].find(([f])=>!h.has(f)))==null||g[1].focus({preventScroll:!0})},check(){let g=!0;for(const[f,b]of a){const[x,v]=f.split(" ").map(Number),w=b.value!==e[x][v];b.classList.toggle("wrong",w),w&&(g=!1)}return g},reset(){h.clear();for(const g of a.values())g.value="",g.disabled=!0,g.classList.remove("wrong"),g.parentElement.classList.remove("given","arrived");c()}}}const yJ="http://www.w3.org/2000/svg";function it(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function S1(i,e={}){const t=document.createElementNS(yJ,i);for(const[n,a]of Object.entries(e))t.setAttribute(n,String(a));return t}function ro(i,e,t){const n=it(i,e);return n.innerHTML=Ae(t),n}const zJ={"#":"#6b7280","=":"#111827",r:"#ef4444",g:"#22c55e",b:"#3b82f6",y:"#facc15"},IJ=450;function kJ(i,e,t=!1){const n=it("section",{class:"learn-game learn-round-game learn-drive-game"}),a=it("div",{class:"learn-game-head"});a.append(it("img",{src:e,alt:"",width:"40",height:"40"}),it("strong",{},i.title));const s=it("p",{class:"learn-game-status"}),r=it("div",{class:"learn-game-stage"});n.append(a,s,r);const o=i.rounds.length,l=i.field;let u=0,m=0,c=0;const d=()=>{s.textContent=`${p("web_game_round_fmt",u+1,o)} · ${p("web_game_score_fmt",m)}`},h=()=>{const x=it("button",{class:"primary"},u+1{u++,u{window.clearInterval(c),d();const x=i.rounds[u],v=x.map[0].length,w=x.map.length,z=v*l,I=w*l,T=_=>_+z/2,k=_=>I/2-_,C=jp(x,l),P=IR(x,l),D=S1("svg",{viewBox:`-2 -2 ${z+4} ${I+4}`,class:"learn-drive-map",role:"group","aria-label":x.question}),B=[];x.map.forEach((_,M)=>{B.push([]),Array.from(_).forEach((J,q)=>{const X=S1("rect",{x:q*l,y:M*l,width:l,height:l,class:"cell",fill:zJ[J]??"#ffffff",tabindex:0,role:"button","aria-label":`${q+1}, ${M+1}`}),Y=()=>N(q,M);X.addEventListener("click",Y),X.addEventListener("keydown",ae=>{(ae.key==="Enter"||ae.key===" ")&&(ae.preventDefault(),Y())}),D.append(X),B[M].push(X)})});const j=S1("polyline",{class:"trail",points:"",fill:"none"}),Z=S1("g",{class:"robot"}),F=Math.min(l*.7,20);Z.append(S1("rect",{x:-F/2,y:-F/2,width:F,height:F,rx:F/5,class:"body"}),S1("path",{d:`M ${-F/3} ${F/6} L 0 ${-F/2.4} L ${F/3} ${F/6} Z`,class:"nose"}));let U=C.start.heading;const ne=_=>{U+=((_.heading-U)%360+540)%360-180,Z.style.transform=`translate(${T(_.x)}px, ${k(_.y)}px) rotate(${U}deg)`};ne(C.start),D.append(j,Z);const ge=it("div",{class:"learn-game-feedback",role:"status"}),ie=t&&gp(x.code)||it("pre",{class:"learn-game-code mono",dir:"ltr"},...x.code.split(` -`).map(_=>it("div",{class:"ln"},_||" ")));let ue=!1;const N=(_,M)=>{if(ue)return;ue=!0,D.classList.add("done");const J=_===x.target.col&&M===x.target.row;B[M][_].classList.add(J?"right":"wrong"),J&&m++,d();const q=P.run.frames;let X=0;const Y=[`${T(C.start.x)},${k(C.start.y)}`],ae=()=>{if(X++,X>=q.length){window.clearInterval(c),B[x.target.row][x.target.col].classList.add("right");const xe=h();ge.className=`learn-game-feedback ${J?"right":"wrong"}`,ge.replaceChildren(it("p",{},p(J?"web_game_right":"web_game_wrong_short")),ro("div",{class:"learn-game-explain"},x.explanation),xe),xe.focus({preventScroll:!0});return}const re=q[X].pose;ne(re),Y.push(`${T(re.x)},${k(re.y)}`),j.setAttribute("points",Y.join(" "))};c=window.setInterval(()=>{if(!n.isConnected)return window.clearInterval(c);ae()},IJ)};r.replaceChildren(ie,ro("p",{class:"learn-game-question"},x.question),D,ge)},f=()=>{window.clearInterval(c),s.textContent="";const x=it("button",{class:"primary"},p("web_game_again"));x.addEventListener("click",()=>{u=m=0,g()}),r.replaceChildren(it("p",{class:"learn-game-result"},p("web_game_done_fmt",m,o)),it("p",{},p(m===o?"web_game_perfect":m>=o*.7?"web_game_good":"web_game_practice_short")),x)},b=it("button",{class:"primary"},p("web_game_start"));return b.addEventListener("click",g),r.append(ro("p",{},i.intro),b),n}function jt(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function sc(i,e,t){const n=jt(i,e);return n.innerHTML=Ae(t),n}function SJ(i){const e=jt("section",{class:"learn-cloze"});e.append(jt("strong",{class:"learn-cloze-title"},i.title)),i.task&&e.append(sc("p",{},i.task)),e.append(jt("p",{class:"learn-cloze-hint"},p("web_learn_cloze_hint")));const t=[];for(const m of i.blocks){const c=jt("pre",{class:"learn-cloze-code mono",dir:"ltr"});for(const d of m){const h=jt("div",{class:"ln"});for(const g of d){if(typeof g=="string"){h.append(g);continue}const f=jt("input",{type:"text",class:"learn-cloze-gap mono",autocomplete:"off",autocapitalize:"off",autocorrect:"off",spellcheck:"false",enterkeyhint:"done","aria-label":`${t.length+1}`});f.style.width=`${Math.max(3,...g.answers.map(b=>b.length))+1}ch`,t.push({input:f,answers:g.answers}),h.append(f)}d.length||h.append(` -`),c.append(h)}e.append(c)}const n=jt("p",{class:"learn-cloze-status",role:"status"}),a=i.explanation?sc("p",{class:"learn-explanation"},i.explanation):void 0;a&&(a.hidden=!0);const s=jt("button",{class:"learn-cloze-check"},p("web_learn_check")),r=jt("button",{},p("web_learn_cloze_solution")),o=jt("button",{},p("web_learn_cloze_again"));r.hidden=!0,o.hidden=!0;const l=jt("div",{class:"learn-cloze-actions"},s,r,o);e.append(l,n),a&&e.append(a);const u=()=>{var d;let m=0;for(const h of t){const g=AR(h.answers,h.input.value);h.input.classList.toggle("right",g),h.input.classList.toggle("wrong",!g),g&&m++}const c=m===t.length;n.textContent=c?p("web_learn_cloze_all_right"):p("web_learn_cloze_score_fmt",m,t.length),n.className=`learn-cloze-status ${c?"right":"wrong"}`,a&&(a.hidden=!c),c?(t.forEach(h=>h.input.disabled=!0),s.hidden=!0,o.hidden=!1):(r.hidden=!1,(d=t.find(h=>h.input.classList.contains("wrong")))==null||d.input.focus())};return s.addEventListener("click",u),r.addEventListener("click",()=>{for(const m of t)m.input.value=m.answers[0],m.input.classList.remove("right","wrong"),m.input.classList.add("shown"),m.input.disabled=!0;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!1),s.hidden=!0,r.hidden=!0,o.hidden=!1}),o.addEventListener("click",()=>{var m;for(const c of t)c.input.value="",c.input.classList.remove("right","wrong","shown"),c.input.disabled=!1;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!0),s.hidden=!1,r.hidden=!0,o.hidden=!0,(m=t[0])==null||m.input.focus()}),t.forEach((m,c)=>{m.input.addEventListener("input",()=>m.input.classList.remove("right","wrong")),m.input.addEventListener("keydown",d=>{d.key==="Enter"&&(d.preventDefault(),c1?12:13});return n.forEach((s,r)=>{const o=kt("tspan",{x:e.x,y:e.y+4.5+(r-(n.length-1)/2)*14});o.textContent=s,a.append(o)}),a}function Pa(i,e){return kt("polyline",{points:i.map(t=>t.join(",")).join(" "),fill:"none","marker-end":`url(#${e})`})}function rc(i,e,t,n){const a=kt("text",{x:e,y:t,"font-size":12,"font-weight":600,fill:n?"#248a3d":"#d70015"});return a.textContent=i,a}function AJ(i,e){const t=Cp(e,110),n=Math.max(...t.map(u=>u.length)),a=Math.max(70,n*6.6+(i==="raute"?56:26)),s=i==="raute"?48:t.length>1?40:30,r=kt("svg",{viewBox:`0 0 ${a+4} ${s+4}`,width:a+4,height:s+4,"aria-hidden":"true"}),o={x:(a+4)/2,y:(s+4)/2,w:a,h:s},l=tu(i,o);return l.setAttribute("fill",eu[i]),l.setAttribute("stroke","#1c1c1e"),l.setAttribute("stroke-width","1.5"),r.append(l,Hp(e,{...o,w:t.length>1?124:a},i)),r}function jJ(i){const e=[...Array(i).keys()];for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return i>1&&e.every((t,n)=>t===n)&&e.reverse(),e}function CJ(){const i=Qe("dl",{class:"learn-pap-legend"}),e=[["oval","web_learn_pap_legend_oval"],["rechteck","web_learn_pap_legend_rect"],["raute","web_learn_pap_legend_diamond"],["parallelogramm","web_learn_pap_legend_para"]];for(const[t,n]of e){const a=t==="raute"?44:40,s=kt("svg",{viewBox:`0 0 ${a+4} 28`,width:a+4,height:28,"aria-hidden":"true"}),r=tu(t,{x:(a+4)/2,y:14,w:a,h:t==="raute"?24:18});r.setAttribute("fill",eu[t]),r.setAttribute("stroke","#1c1c1e"),r.setAttribute("stroke-width","1.5"),s.append(r),i.append(Qe("dt",{},s),Qe("dd",{},p(n)))}return i}function DJ(i){const e=Qe("section",{class:"learn-pap"});if(e.append(Qe("strong",{class:"learn-pap-title"},i.title)),i.task){const N=Qe("p");N.innerHTML=Ae(i.task),e.append(N)}e.append(Qe("p",{class:"learn-pap-hint"},p("web_learn_pap_hint")));const{boxes:t,height:n}=ZR(i),a=t.filter(Boolean),s=Math.min(...a.map(N=>N.x-N.w/2))-4,r=i.nodes.some(N=>N.shape==="raute"),o=Math.max(...a.map(N=>N.x+N.w/2),r?Math.max(...a.map(N=>N.x))+85+40:0)+4,l=kt("svg",{viewBox:`${s} 0 ${o-s} ${n}`,class:"learn-pap-plan",role:"group","aria-label":i.title}),u=`pap-arrow-${++_J}`;l.innerHTML=``;const m=kt("g",{stroke:"#1c1c1e","stroke-width":2}),c=kt("g"),d=p("web_learn_pap_yes"),h=p("web_learn_pap_no"),g=N=>t[N].y-t[N].h/2,f=N=>t[N].y+t[N].h/2,b=i.nodes.map((N,_)=>_).filter(N=>!i.nodes[N].isSide);b.forEach((N,_)=>{const M=i.nodes[N],J=t[N],q=b[_+1];if(q!==void 0&&(m.append(Pa([[J.x,f(N)],[J.x,g(q)-2]],u)),M.shape==="raute"&&c.append(rc(M.sideExit==="nein"?d:h,J.x+6,f(N)+13,M.sideExit==="nein"))),M.shape!=="raute")return;const X=J.x+J.w/2;if(c.append(rc(M.sideExit==="ja"?d:h,X+5,J.y-6,M.sideExit==="ja")),M.backTo!==void 0){const Y=g(M.backTo)-14;m.append(Pa([[X,J.y],[X+22,J.y],[X+22,Y],[J.x,Y]],u))}else if(M.side!==void 0){const Y=t[M.side],ae=g(N)-14;m.append(Pa([[X,J.y],[Y.x-Y.w/2-2,J.y]],u)),m.append(Pa([[Y.x,Y.y-Y.h/2],[Y.x,ae],[J.x,ae]],u))}}),l.append(m,c);const x=i.nodes.map(()=>{}),v=[],w=[];let z;const I=Qe("p",{class:"learn-pap-status",role:"status"}),T=i.explanation?Qe("p",{class:"learn-explanation"}):void 0;T&&(T.innerHTML=Ae(i.explanation),T.hidden=!0);let k=!1;const C=()=>{v.forEach(N=>N.classList.remove("right","wrong")),I.textContent="",I.className="learn-pap-status"},P=N=>{const _=v[N];_.replaceChildren();const M=i.nodes[N],J=x[N],q=tu(M.shape,t[N]);if(q.setAttribute("class","learn-pap-shape"),J===void 0)q.setAttribute("fill","#f7f7f9"),q.setAttribute("stroke-dasharray","6 4"),_.append(q),_.setAttribute("aria-label",p("web_learn_pap_empty"));else{const X=i.nodes[J];q.setAttribute("fill",eu[X.shape]),_.append(q,Hp(X.text,t[N],M.shape)),_.setAttribute("aria-label",X.text)}},D=()=>{i.nodes.forEach((N,_)=>P(_)),w.forEach((N,_)=>{N.hidden=x.includes(_),N.classList.toggle("selected",z===_)})},B=(N,_)=>{if(k)return;const M=x.indexOf(_);M>=0&&(x[M]=void 0),x[N]=_,z=void 0,C(),D()};i.nodes.forEach((N,_)=>{const M=kt("g",{class:"learn-pap-slot","data-slot":_,tabindex:0,role:"button"}),J=()=>{k||(z!==void 0?B(_,z):x[_]!==void 0&&(x[_]=void 0,C(),D()))};M.addEventListener("click",J),M.addEventListener("keydown",q=>{q.key!=="Enter"&&q.key!==" "||(q.preventDefault(),J())}),v.push(M),l.append(M)});const j=Qe("div",{class:"learn-pap-tray"});let Z=!1;for(const N of jJ(i.nodes.length)){const _=i.nodes[N],M=Qe("button",{class:"learn-pap-card",type:"button","aria-label":_.text},AJ(_.shape,_.text));w[N]=M,M.addEventListener("click",()=>{Z||k||(z=z===N?void 0:N,D())}),M.addEventListener("pointerdown",J=>{if(k)return;Z=!1;let q;const X=re=>{var xe;!q&&Math.hypot(re.clientX-J.clientX,re.clientY-J.clientY)<6||(q||(Z=!0,q=M.cloneNode(!0),q.classList.add("learn-pap-ghost"),document.body.append(q),M.classList.add("dragging")),q.style.left=`${re.clientX}px`,q.style.top=`${re.clientY}px`,v.forEach(Je=>Je.classList.remove("over")),(xe=Y(re))==null||xe.classList.add("over"))},Y=re=>{var Je;q&&(q.style.display="none");const xe=(Je=document.elementFromPoint(re.clientX,re.clientY))==null?void 0:Je.closest("[data-slot]");return q&&(q.style.display=""),xe&&v.includes(xe)?xe:void 0},ae=re=>{if(M.removeEventListener("pointermove",X),M.removeEventListener("pointerup",ae),M.removeEventListener("pointercancel",ae),v.forEach(Je=>Je.classList.remove("over")),M.classList.remove("dragging"),!q)return;const xe=re.type==="pointerup"?Y(re):void 0;q.remove(),xe&&B(Number(xe.getAttribute("data-slot")),N),setTimeout(()=>Z=!1)};M.setPointerCapture(J.pointerId),M.addEventListener("pointermove",X),M.addEventListener("pointerup",ae),M.addEventListener("pointercancel",ae)}),j.append(M)}const F=Qe("button",{class:"learn-pap-check"},p("web_learn_check")),U=Qe("button",{},p("web_learn_cloze_solution")),ne=Qe("button",{},p("web_learn_cloze_again"));U.hidden=!0,ne.hidden=!0;const ge=()=>{k=!0,F.hidden=!0,U.hidden=!0,ne.hidden=!1,j.hidden=!0,ue.classList.add("done"),T&&(T.hidden=!1)};F.addEventListener("click",()=>{const N=x.filter(J=>J===void 0).length;let _=0;x.forEach((J,q)=>{const X=J!==void 0&&CR(i,q,J);v[q].classList.toggle("right",X),v[q].classList.toggle("wrong",J!==void 0&&!X),X&&_++});const M=_===i.nodes.length;I.textContent=M?p("web_learn_pap_all_right"):N?p("web_learn_pap_missing_fmt",N):p("web_learn_pap_score_fmt",_,i.nodes.length),I.className=`learn-pap-status ${M?"right":"wrong"}`,M?ge():N||(U.hidden=!1)}),U.addEventListener("click",()=>{i.nodes.forEach((N,_)=>x[_]=_),z=void 0,D(),C(),v.forEach(N=>N.classList.add("shown")),ge()}),ne.addEventListener("click",()=>{i.nodes.forEach((N,_)=>x[_]=void 0),k=!1,z=void 0,v.forEach(N=>N.classList.remove("shown")),C(),D(),F.hidden=!1,ne.hidden=!0,j.hidden=!1,ue.classList.remove("done"),T&&(T.hidden=!0)}),D();const ie=Qe("div",{class:"learn-pap-left"});ie.append(l),i.legend&&ie.append(CJ());const ue=Qe("div",{class:"learn-pap-work"},ie,j);return e.append(ue,Qe("div",{class:"learn-pap-actions"},F,U,ne),I),T&&e.append(T),e}const BJ="code, pre, a, button, h1, h2, h3, h4, strong, .term, .ui-pointer";function oc(i,e){var s;const t=[...i.querySelectorAll(".learn-text")],n=new Set;for(const r of t.flatMap(o=>[...o.querySelectorAll("strong")])){const o=Lm(e),l=o==null?void 0:o.exec(r.textContent??""),u=l?Wm(e,l[0]):void 0;u&&n.add(u)}let a=e.filter(r=>!n.has(r));for(const r of t){const o=document.createTreeWalker(r,NodeFilter.SHOW_TEXT),l=[];for(;o.nextNode();){const u=o.currentNode;(s=u.parentElement)!=null&&s.closest(BJ)||l.push(u)}for(let u of l)for(;;){const m=Lm(a),c=m==null?void 0:m.exec(u.data),d=c?Wm(a,c[0]):void 0;if(!c||!d)break;const h=u.splitText(c.index);u=h.splitText(c[0].length);const g=document.createElement("span");g.className="term",g.tabIndex=0,g.setAttribute("role","button"),g.setAttribute("aria-describedby","term-tip"),g.dataset.term=d.term,g.dataset.text=d.text,h.replaceWith(g),g.append(h),a=a.filter(f=>f!==d)}}}function PJ(i){const e=document.createElement("div");e.id="term-tip",e.className="term-tip",e.setAttribute("role","tooltip"),e.hidden=!0,document.body.append(e);let t,n=!1;const a=o=>{t=o,e.replaceChildren();const l=document.createElement("strong");l.textContent=o.dataset.term??"",e.append(l,document.createTextNode(" "+(o.dataset.text??""))),e.hidden=!1;const u=o.getBoundingClientRect(),m=e.offsetWidth,c=e.offsetHeight,d=Math.max(8,Math.min(u.left,window.innerWidth-m-8)),h=u.bottom+6;e.style.left=`${d}px`,e.style.top=`${h+c>window.innerHeight-8?Math.max(8,u.top-c-6):h}px`,o.setAttribute("aria-expanded","true")},s=()=>{t==null||t.setAttribute("aria-expanded","false"),t=void 0,n=!1,e.hidden=!0},r=o=>{var l,u;return((u=(l=o.target)==null?void 0:l.closest)==null?void 0:u.call(l,".term"))??void 0};return i.addEventListener("pointerover",o=>{const l=r(o);l&&o.pointerType==="mouse"&&!n&&a(l)}),i.addEventListener("pointerout",o=>{r(o)&&o.pointerType==="mouse"&&!n&&s()}),i.addEventListener("click",o=>{const l=r(o);if(l){if(n&&t===l)return s();a(l),n=!0}}),i.addEventListener("focusin",o=>{const l=r(o);l&&!n&&a(l)}),i.addEventListener("focusout",o=>{r(o)&&!n&&s()}),i.addEventListener("keydown",o=>{const l=r(o);o.key==="Escape"&&t?s():l&&(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),l.click())}),i.addEventListener("scroll",s,!0),document.addEventListener("pointerdown",o=>{t&&!r(o)&&!e.contains(o.target)&&s()}),{hide:s}}const Vp={leiste:".topbar > .toolbar",editor:".editor-rail, .columns > .app",werkzeuge:".diagram-tools",dateien:".files-rail, .files",codelive:".live-rail, .livecode",ausfuehren:"[data-run=play]",konsole:".livecode .console",einzelschritt:"[data-run=step]",elemente:".palette",struktogramm:".canvas",objektinspektor:".inspector",reiter:".tabs",titel:".caption",neu:"[data-action=new]",oeffnen:"[data-action=open]",speichern:"[data-action=save]",exportieren:"[data-action=export]",rueckgaengig:"[data-action=undo]",loeschen:"[data-action=delete]",textgroesse:"[data-action=settings]",einstellungen:"[data-action=settings]",lernen:".learn .learn-hide",code:"[data-action=code]",simulation:"[data-action=simulate]",bloecke:"[data-action=blocks]"},qp=new Set(["editor","werkzeuge","elemente","struktogramm","objektinspektor","reiter","titel","rueckgaengig","loeschen","exportieren","code","simulation","bloecke"]),Up=new Set(["ausfuehren","konsole","einzelschritt"]);function Cr(i,e){return[...i.querySelectorAll(".ui-pointer")].some(t=>e.has(t.dataset.target??""))}function lc(i){return i==="elemente"?["editor","palette"]:qp.has(i)?["editor"]:i==="codelive"||Up.has(i)?["livecode"]:i==="dateien"?["files"]:[]}function OJ(i){return Cr(i,new Set(["elemente"]))}function MJ(i){return Cr(i,new Set(["dateien"]))}function ZJ(i){return Cr(i,qp)}function LJ(i){return Cr(i,Up)}function uc(i){for(const e of i.querySelectorAll('a[href^="#zeige-"]')){const t=e.getAttribute("href").slice(7);if(!(t in Vp))continue;const n=document.createElement("span");n.className="ui-pointer",n.tabIndex=0,n.setAttribute("role","button"),n.dataset.target=t,n.append(...e.childNodes),e.replaceWith(n)}}function WJ(i,e=()=>()=>{}){let t,n,a,s,r;const o=()=>{t==null||t.classList.remove("ui-spot"),t=void 0,window.clearTimeout(n)},l=(h,g)=>{o();const f=[...document.querySelectorAll(Vp[h.dataset.target??""]??":not(*)")].find(b=>b.getClientRects().length>0);f&&(t=f,f.classList.add("ui-spot"),g&&(n=window.setTimeout(o,2500)))},u=(h,g)=>requestAnimationFrame(()=>{l(h,g),t==null||t.scrollIntoView({block:"nearest",inline:"nearest"})}),m=()=>{window.clearTimeout(s),window.clearTimeout(r),a==null||a(),a=void 0},c=h=>{window.clearTimeout(s),window.clearTimeout(r),a=void 0,e(lc(h.dataset.target??"")),l(h,!0),u(h,!0)},d=h=>{var g,f;return((f=(g=h.target)==null?void 0:g.closest)==null?void 0:f.call(g,".ui-pointer"))??void 0};return i.addEventListener("pointerover",h=>{const g=d(h);!g||h.pointerType!=="mouse"||(window.clearTimeout(r),l(g,!1),window.clearTimeout(s),s=window.setTimeout(()=>{if(a)return;const f=lc(g.dataset.target??"");f.length!==0&&(a=e(f),u(g,!1))},250))}),i.addEventListener("pointerout",h=>{!d(h)||h.pointerType!=="mouse"||(o(),window.clearTimeout(s),window.clearTimeout(r),r=window.setTimeout(m,400))}),i.addEventListener("click",h=>{const g=d(h);g&&c(g)}),i.addEventListener("focusin",h=>{const g=d(h);g&&l(g,!1)}),i.addEventListener("focusout",h=>{d(h)&&o()}),i.addEventListener("keydown",h=>{const g=d(h);g&&(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),c(g))}),{off:()=>{m(),o()}}}const Dt='',EJ=()=>{const i=[];for(const e of ot){const t=i.at(-1);t&&t.name===e.section?t.lessons.push(e):i.push({name:e.section,lessons:[e]})}return i};function A(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function Ue(i,e,t){const n=A(i,e);return n.innerHTML=t,n}const NJ=i=>p(`element_${S[i]}`);function FJ(i){return{caption:i,elements:[je(S.anweisung,{textLines:["ø"]})]}}function mc(i){const e=i.start?bi(i.start):void 0;return e?{...e,caption:e.caption||i.title}:FJ(i.title)}class RJ{constructor(e){y(this,"element");y(this,"tab","lessons");y(this,"returnTo");y(this,"lessonId");y(this,"taskId");y(this,"body");y(this,"tips");y(this,"pointers");this.host=e,this.element=A("aside",{class:"learn","aria-label":p("web_learn_title")}),this.tips=PJ(this.element),this.pointers=WJ(this.element,t=>this.host.reveal(t)),Vi(Hm(In())),this.restore()}restore(){const e=ve.view();e&&(this.tab=["lessons","tasks","reference"].find(t=>t===e.tab)??"lessons",this.lessonId=ot.some(t=>t.id===e.lesson)?e.lesson:void 0,this.taskId=bn.some(t=>t.id===e.task)?e.task:void 0),this.render()}render(){this.tips.hide(),this.pointers.off(),Vi(Hm(In()));const e=A("div",{class:"segmented learn-tabs",role:"tablist"});for(const[a,s]of[["lessons",p("web_learn_lessons")],["tasks",p("web_learn_tasks")],["reference",p("web_learn_reference")]]){const r=A("button",{role:"tab","aria-pressed":String(this.tab===a),"data-learn-tab":a},s);r.addEventListener("click",()=>{this.tab===a&&(a==="lessons"&&(this.lessonId=void 0),a==="tasks"&&(this.taskId=void 0)),this.tab=a,this.persist(),this.render()}),e.append(r)}const t=Ue("button",{class:"learn-hide",title:p("web_learn_hide"),"aria-label":p("web_learn_hide")},Dt);t.addEventListener("click",()=>this.host.collapse());const n=A("div",{class:"learn-head"},e,t);if(this.body=A("div",{class:"learn-body"}),this.element.replaceChildren(n,this.body),this.tab==="lessons"){const a=ot.find(s=>s.id===this.lessonId);a?this.renderLesson(a):this.renderLessonList()}else if(this.tab==="tasks"){const a=bn.find(s=>s.id===this.taskId);a?this.renderTask(a):this.renderTaskList()}else{const a=fs.map(r=>`- **${r.term}:** ${r.text}`).join(` -`),s=Ue("div",{class:"learn-text learn-reference"},Bn(`${ps} - -## ${p("web_learn_terms")} - -${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="visustruct.reference.open";let n=[];try{n=JSON.parse(localStorage.getItem(t)??"[]")}catch{}for(const a of[...e.querySelectorAll("h2")]){const s=a.textContent??"",r=A("details",{class:"reference-group"});r.open=n.includes(s);const o=A("summary",{},s);for(a.replaceWith(r),r.append(o);r.nextSibling&&r.nextSibling.nodeName!=="H2";)r.append(r.nextSibling);r.addEventListener("toggle",()=>{n=r.open?[...new Set([...n,s])]:n.filter(l=>l!==s);try{localStorage.setItem(t,JSON.stringify(n))}catch{}})}}showReference(){this.tab="reference",this.persist(),this.render()}persist(){ve.setView({tab:this.tab,lesson:this.lessonId,task:this.taskId})}showLesson(e){ot.some(t=>t.id===e)&&this.openLesson(e)}openLesson(e){this.tab="lessons",this.lessonId=e,this.returnTo=void 0,this.persist(),this.render(),this.body.scrollTop=0}renderLessonList(){this.body.append(A("p",{class:"hint"},p("web_learn_intro")));for(const e of EJ()){this.body.append(A("h3",{class:"learn-section"},e.name));const t=A("ol",{class:"learn-list"});for(const n of e.lessons){const a=ve.lesson(n.id),s=a.done?"✓":a.step>0?p("web_learn_step_of_fmt",a.step+1,n.steps.length):"",r=A("button",{class:"learn-item"+(a.done?" done":""),"data-lesson":n.id},A("span",{class:"learn-num"},String(n.number)),A("span",{class:"learn-item-text"},A("strong",{},n.robot?`🤖 ${n.title}`:n.title),A("small",{},n.summary)),A("span",{class:"learn-status"},s));r.addEventListener("click",()=>this.openLesson(n.id)),t.append(A("li",{},r))}this.body.append(t)}this.body.append(this.renderTeacherBox())}renderLesson(e){var u;const t=ve.lesson(e.id),n=Math.min(t.step,e.steps.length-1),a=e.steps[n],s=A("button",{class:"learn-back"},`← ${p("web_learn_all_lessons")}`);s.addEventListener("click",()=>this.openLesson(void 0));const r=A("nav",{class:"learn-progress","aria-label":p("web_learn_step_of_fmt",n+1,e.steps.length)});r.append(...e.steps.map((m,c)=>{const d=p("web_learn_step_fmt",c+1,m.title),h=cthis.goToStep(e,c)),g})),this.body.append(A("div",{class:"learn-lesson-head"},A("div",{class:"learn-head-row"},s,this.stepNav(e,n,t.done,"learn-nav learn-nav-top")),A("p",{class:"learn-kicker"},`${p("web_learn_lesson_fmt",e.number)} · ${e.section}${e.robot?" · 🤖 VisuBot":""}`),A("h2",{class:"learn-title"},A("span",{class:"learn-num","aria-hidden":"true"},String(e.number)),e.title),r,A("h3",{class:"learn-step-title"},`${n+1}. ${a.title}`)));const o=((u=this.returnTo)==null?void 0:u.lesson)===e.id&&this.returnTo.step!==n?this.returnTo:void 0,l=()=>{const m=A("button",{class:"learn-return"},`↩ ${p("web_learn_back_to_checklist")}`);return m.addEventListener("click",()=>{this.returnTo=void 0,this.goToStep(e,o.step),this.body.scrollTop=o.scroll}),m};o&&this.body.append(l()),a.blocks.forEach((m,c)=>this.body.append(this.renderBlock(m,`${n}-${c}`,e))),uc(this.body),dJ(this.body),this.openNeededColumns(a.blocks),oc(this.body,fs),this.body.append(this.stepNav(e,n,t.done,"learn-nav")),o&&this.body.append(l())}stepNav(e,t,n,a){const s=A("div",{class:a}),r=A("button",{},`← ${p("web_learn_back")}`);if(r.disabled=t===0,r.addEventListener("click",()=>this.goToStep(e,t-1)),s.append(r),tthis.goToStep(e,t+1)),s.append(o)}else{const o=A("button",{class:"primary"},n?`✓ ${p("web_learn_done")}`:p("web_learn_finish"));o.addEventListener("click",()=>{ve.updateLesson(e.id,{done:!0});const l=ot.find(u=>u.number===e.number+1);this.openLesson(l==null?void 0:l.id)}),s.append(o)}return s}goToStep(e,t){ve.updateLesson(e.id,{step:t}),this.render(),this.body.scrollTop=0}openNeededColumns(e){const t=e.flatMap(n=>n.kind==="exercise"?[n.exercise]:[]);ZJ(this.body)?(this.host.showEditor(),OJ(this.body)&&this.host.reveal(["palette"])):MJ(this.body)?this.host.showFiles():t.some(n=>n.code!=="java")?this.host.showEditor():(t.length>0||this.body.querySelector(".lesson-code[data-lang=java]"))&&this.host.showJava(),LJ(this.body)&&this.host.showLiveCode()}renderTaskList(){this.body.append(A("p",{class:"hint"},p("web_learn_tasks_intro")));const e=A("ul",{class:"learn-list"});for(const t of bn){const n=this.taskExercises(t),a=n.length>0&&n.every(o=>ve.exercise(o.id).done),s=ot.find(o=>o.number===t.after),r=A("button",{class:"learn-item"+(a?" done":""),"data-task":t.id},A("span",{class:"learn-num","aria-label":p("web_learn_level_fmt",t.level)},"★".repeat(t.level)),A("span",{class:"learn-item-text"},A("strong",{},t.title),A("small",{},s?p("web_learn_after_fmt",s.number,s.title):"")),A("span",{class:"learn-status"},a?"✓":""));r.addEventListener("click",()=>{this.taskId=t.id,this.persist(),this.render(),this.body.scrollTop=0}),e.append(A("li",{},r))}this.body.append(e,this.renderTeacherBox())}renderTeacherBox(){const e=A("details",{class:"learn-teacher"},A("summary",{},p("web_learn_teacher")));if(Ym()){e.setAttribute("open","");const s=A("button",{},p("web_learn_teacher_off"));return s.addEventListener("click",()=>{aJ(),this.render()}),e.append(A("p",{},p("web_learn_teacher_on")),s),e}const t=A("input",{type:"password",autocomplete:"off","aria-label":p("web_learn_teacher_code"),placeholder:p("web_learn_teacher_code")}),n=A("p",{class:"learn-result",role:"status"}),a=A("form",{class:"group"},t,A("button",{type:"submit"},p("web_learn_teacher_unlock")));return a.addEventListener("submit",async s=>{s.preventDefault(),await iJ(t.value)?this.render():(n.className="learn-result info",n.textContent=p("web_learn_teacher_wrong"))}),e.append(A("p",{class:"hint"},p("web_learn_teacher_intro")),a,n),e}taskExercises(e){return e.blocks.flatMap(t=>t.kind==="exercise"?[t.exercise]:[])}renderTask(e){const t=A("button",{class:"learn-back"},`← ${p("web_learn_all_tasks")}`);t.addEventListener("click",()=>{this.taskId=void 0,this.persist(),this.render()});const n=ot.find(a=>a.number===e.after);if(this.body.append(t,A("h2",{class:"learn-title"},e.title)),n){const a=A("button",{class:"link-button"},p("web_learn_after_fmt",n.number,n.title));a.addEventListener("click",()=>this.openLesson(n.id)),this.body.append(A("p",{class:"learn-kicker"},a))}e.blocks.forEach((a,s)=>this.body.append(this.renderBlock(a,`task-${s}`))),uc(this.body),this.openNeededColumns(e.blocks),oc(this.body,fs)}renderBlock(e,t,n){switch(e.kind){case"markdown":return this.withOpenButtons(Ue("div",{class:"learn-text"},Bn(e.text)));case"diagram":return this.renderDiagram(e.file,e.caption);case"exercise":return this.renderExercise(e.exercise);case"competences":return this.renderCompetences(e.items);case"checklist":return this.renderChecklist(e.items,t,n);case"quiz":return this.renderQuiz(e.questions,t,n);case"brag":return this.renderBrag(e.text,e.tip);case"images":return this.renderImages(e.files,e.caption);case"graphic":return e.animated?this.renderAnimation(e.file,e.caption):this.renderGraphic(e.file,e.caption,e.labeled);case"game":return this.renderGame(e.game);case"roundGame":return gJ(e.game,k1,qm());case"rescueGame":return vJ(e.game,k1);case"driveGame":return kJ(e.game,k1,qm());case"crosswordGame":return wJ(e.game,k1);case"caesar":return uJ(e.key,e.text);case"cloze":return SJ(e.cloze);case"pap":return DJ(e.pap);case"textFile":return Ep(e.name,e.content);case"robotModel":return cJ(e.focus,e.view,e.spin);case"robotQuiz":return hJ(e.tasks,e.done)}}renderBrag(e,t=!1){const n=A("aside",{class:"learn-brag"});n.append(A("img",{src:k1,alt:"",width:"48",height:"48"}));const a=A("div",{},A("p",{class:"learn-brag-title"},p(t?"web_learn_ludwig_tip":"web_learn_brag")));return a.append(Ue("div",{class:"learn-text"},Bn(e))),n.append(a),n}renderGame(e){const n=A("section",{class:"learn-game"}),a=A("div",{class:"learn-game-head"});a.append(A("img",{src:k1,alt:"",width:"40",height:"40"}),A("strong",{},p("web_game_title")));const s=A("p",{class:"learn-game-status"}),r=A("div",{class:"learn-game-stage"});n.append(a,s,r);let o=0,l=0;const u=()=>{const d=Ev(e,o,10);s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`;const h=A("div",{class:"learn-game-values mono"});for(const[w,z]of Nv(d))h.append(A("code",{},`${w} = ${z}`));const g=A("div",{class:"group learn-game-answers"}),f=A("button",{class:"learn-game-true"},`✓ ${p("web_game_true")}`),b=A("button",{class:"learn-game-false"},`✗ ${p("web_game_false")}`);g.append(f,b);const x=A("div",{class:"learn-game-feedback",role:"status"}),v=w=>{f.disabled=b.disabled=!0;const z=w===d.answer;z&&l++,s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`,x.className=`learn-game-feedback ${z?"right":"wrong"}`;const I=A("div",{class:"learn-game-steps mono"});Lv(d.condition,d.values).forEach((k,C)=>I.append(A("div",{},`${C?"→ ":""}${k}`)));const T=A("button",{class:"primary"},o+1<10?p("web_game_next"):p("web_game_finish"));T.addEventListener("click",()=>{o++,o<10?u():m()}),x.replaceChildren(A("p",{},p(z?"web_game_right":"web_game_wrong")),I,T),T.focus()};f.addEventListener("click",()=>v(!0)),b.addEventListener("click",()=>v(!1)),r.replaceChildren(h,A("div",{class:"learn-game-condition mono"},d.condition),g,x)},m=()=>{s.textContent="";const d=A("button",{class:"primary"},p("web_game_again"));d.addEventListener("click",()=>{o=l=0,u()}),r.replaceChildren(A("p",{class:"learn-game-result"},p("web_game_done_fmt",l,10)),A("p",{},p(l===10?"web_game_perfect":l>=10*.7?"web_game_good":"web_game_practice")),d)},c=A("button",{class:"primary"},p("web_game_start"));return c.addEventListener("click",u),r.append(A("p",{},p("web_game_intro")),c),n}renderImages(e,t){const n=A("figure",{class:"learn-figure"}),a=A("div",{class:"learn-images"});for(const s of e){const r=Ba(s);r&&a.append(A("img",{src:r,alt:"",loading:"lazy"}))}return n.append(a),t&&n.append(Ue("figcaption",{},Ae(t))),n}renderGraphic(e,t,n){const a=A("figure",{class:"learn-figure"}),s=Ba(e),r=n?Ba(n):void 0;if(s&&r){const o=A("img",{class:"learn-graphic",src:s,alt:"",loading:"lazy"}),l=A("button",{class:"learn-graphic-toggle",type:"button",title:p("web_learn_graphic_labels"),"aria-pressed":"false"},o);l.addEventListener("click",()=>{const u=l.getAttribute("aria-pressed")!=="true";l.setAttribute("aria-pressed",String(u)),o.src=u?r:s}),a.append(l,A("p",{class:"learn-graphic-hint"},p("web_learn_graphic_labels")))}else s&&a.append(A("img",{class:"learn-graphic",src:s,alt:"",loading:"lazy"}));return t&&a.append(Ue("figcaption",{},Ae(t))),a}renderAnimation(e,t){const n=A("figure",{class:"learn-figure"}),a=Ba(e);if(!a)return n;const s=A("div",{class:"learn-graphic learn-animation"}),r=A("button",{class:"learn-replay",type:"button"},`↻ ${p("web_learn_replay")}`);let o=()=>{};return fetch(a).then(l=>l.text()).then(l=>{var d,h;s.innerHTML=l;const u=s.querySelector("svg"),m=(h=(d=u==null?void 0:u.getAttribute("class"))==null?void 0:d.match(/(\S+-)svg\b/))==null?void 0:h[1];if(!u||!m)return;if(o=()=>{u.classList.remove(`${m}play`),u.getBoundingClientRect(),u.classList.add(`${m}play`)},typeof IntersectionObserver>"u")return o();const c=new IntersectionObserver(g=>{g.some(f=>f.isIntersecting)&&(c.disconnect(),o())},{threshold:.6});c.observe(s)}).catch(()=>s.append(A("img",{src:a,alt:""}))),r.addEventListener("click",()=>o()),n.append(s,r),t&&n.append(Ue("figcaption",{},Ae(t))),n}withOpenButtons(e){for(const t of e.querySelectorAll("pre.lesson-code[data-open=editor]")){const n=t.textContent??"",a=A("button",{class:"learn-open-code"},p("web_learn_open_in_editor"));a.addEventListener("click",()=>this.host.openJavaCode(n)),t.after(a)}return e}renderDiagram(e,t){const n=bi(e),a=A("figure",{class:"learn-figure"});if(!n)return a;const s=this.host.preview(n);s&&a.append(A("div",{class:"learn-preview",dir:"ltr"},s)),t&&a.append(Ue("figcaption",{},Ae(t)));const r=A("button",{},p("web_learn_open_in_editor"));return r.addEventListener("click",()=>this.host.openDiagram(n,e)),a.append(r),a}renderExercise(e){const t=A("section",{class:"learn-exercise","data-exercise":e.id}),n=()=>ve.exercise(e.id),a=A("span",{class:"learn-badge"},`✓ ${p("web_learn_solved")}`);a.hidden=!n().done,t.append(A("h4",{},`${p("web_learn_exercise")}: ${e.title}`,a),JJ(e),Ue("div",{class:"learn-text"},Bn(e.task)));const s=A("div",{class:"learn-result",role:"status"}),r=A("div",{class:"learn-hints"}),o=A("div",{class:"group"}),l=A("button",{class:"primary"},p("web_learn_open_exercise"));l.addEventListener("click",()=>{const c=n().xml;let d=mc(e);if(c)try{d=z0(c)}catch{}this.host.openExercise(e,d)});const u=A("button",{},p("web_learn_check"));if(u.addEventListener("click",()=>{const c=this.host.exerciseDocument(e.id);if(!c){s.className="learn-result info",s.textContent=p("web_learn_open_first");return}if(c.elements.every(wr)){s.className="learn-result info",s.textContent=p("web_learn_empty");return}this.host.stopSimulation();const d=Bv(c,e.tests,this.host.subprogramsFor(e.id),bs),h=Pv(c),g=e.requires.map(x=>x==="forZaehlSchleife"?"forSchleife":x).filter(x=>x in S&&!h.has(S[x])),f=e.loopDepth!==void 0&&wl(c.elements)x.passed)&&g.length===0&&!f;this.showResult(s,d,g,b,f),b&&(ve.updateExercise(e.id,{done:!0}),a.hidden=!1)}),o.append(l,u),e.hints.length>0){const c=A("button",{},p("web_learn_hint"));c.addEventListener("click",()=>{const d=r.children.length;if(d>=e.hints.length)return;const h=e.hints.length>1?`**${p("web_learn_hint_fmt",d+1,e.hints.length)}:** `:"";r.append(Ue("aside",{class:"lesson-note"},Bn(h+e.hints[d]))),c.textContent=p("web_learn_hint_more"),c.toggleAttribute("disabled",d+1>=e.hints.length)}),o.append(c)}const m=A("button",{class:"danger-text"},p("web_learn_reset"));if(m.addEventListener("click",()=>{if(m.dataset.confirm!=="1"){m.dataset.confirm="1",m.textContent=p("web_learn_reset_confirm"),setTimeout(()=>{m.dataset.confirm="",m.textContent=p("web_learn_reset")},4e3);return}ve.resetExercise(e.id),this.host.resetExercise(e.id,mc(e)),a.hidden=!0,s.replaceChildren(),s.className="learn-result",m.dataset.confirm="",m.textContent=p("web_learn_reset")}),o.append(m),t.append(o,r,s),Ym()&&e.solution){const c=bi(e.solution);if(c){const d=A("details",{class:"learn-solution"},A("summary",{},p("web_learn_solution")));d.addEventListener("toggle",()=>{if(!d.open||d.querySelector(".learn-preview"))return;const h=this.host.preview(c);h&&d.append(A("div",{class:"learn-preview",dir:"ltr"},h));const g=A("button",{},p("web_learn_open_in_editor"));g.addEventListener("click",()=>{this.host.openDiagram(c,e.solution);for(const f of e.subprograms){const b=bi(f);b&&this.host.openDiagram(b,f)}});for(const f of e.subprograms){const b=bi(f),x=b&&this.host.preview(b);x&&d.append(A("div",{class:"learn-preview",dir:"ltr"},x))}d.append(g)}),t.append(d)}}return t}showResult(e,t,n,a,s){var o,l,u,m,c;e.className="learn-result "+(a?"ok":"fail"),e.replaceChildren(A("p",{class:"learn-result-head"},a?`🎉 ${p("web_learn_passed")}`:p("web_learn_failed")));for(const d of n)e.append(A("p",{},`✗ ${p("web_learn_missing_fmt",NJ(S[d]))}`));s&&e.append(A("p",{},`✗ ${p("web_visubot_depth_fmt",s)}`));const r=A("ul",{class:"learn-tests",dir:"auto"});for(const d of t){const h=d.test.world?t.filter(x=>x.test.world).indexOf(d)+1:0,g=d.test.world?`🗺 ${p("web_visubot_world_fmt",h)}`:d.test.actions?`🤖 ${p("web_visubot_actions")}`:d.test.sensors?`🎛 ${Object.entries(d.test.sensors).map(([x,v])=>`mbot.${x}() = ${v.join(" → ")}`).join(", ")}`:d.test.drive?`🤖 ${p("web_visubot_drive")}`:d.test.inputs.length?p("web_learn_input_fmt",d.test.inputs.join(", ")):p("web_learn_no_input"),f=[`${d.passed?"✓":"✗"} ${g}`],b=A("div",{class:"learn-test-detail"});if(d.test.drive&&b.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},pi(d.test.drive)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},pi(d.result.drive??[])||"–"))),d.test.actions&&b.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},pi(d.test.actions)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},pi(d.result.actions??[])||"–"))),d.test.led!==void 0){const x=v=>p(v?"web_visubot_led_on":"web_visubot_led_off");b.append(A("span",{},`💡 ${p("web_learn_expected")}: ${x(d.test.led)} · ${p("web_learn_actual")}: ${x(d.result.led)}`))}if(d.test.tone!==void 0){const x=v=>p(v?"web_visubot_tone_yes":"web_visubot_tone_no");b.append(A("span",{},`🔊 ${p("web_learn_expected")}: ${x(d.test.tone)} · ${p("web_learn_actual")}: ${x(d.result.tone)}`))}d.test.screen!==void 0&&b.append(A("span",{},`📺 ${p("web_learn_expected")}: `,A("code",{},d.test.screen),` · ${p("web_learn_actual")}: `,A("code",{},d.result.screen??"–"))),d.test.world&&(((l=(o=bs(d.test.world))==null?void 0:o.goals)!=null&&l.length||(m=(u=bs(d.test.world))==null?void 0:u.targets)!=null&&m.length)&&b.append(A("span",{},d.result.atGoal?`✓ ${p("web_visubot_goal_reached")}`:`✗ ${p("web_visubot_goal_missed")}`)),d.result.bumps&&b.append(A("span",{class:"learn-error"},`⚠︎ ${p("web_visubot_bumps")}: ${d.result.bumps}`))),(!d.test.drive&&!d.test.world&&!d.test.sensors&&!d.test.actions||d.result.outputs.length)&&b.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},d.test.expected.join(" | ")||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},d.result.outputs.join(" | ")||"–")));for(const x of d.test.files??[])b.append(A("span",{},`📄 ${x.name}, ${p("web_learn_expected")}: `,A("code",{},x.lines.join(" | ")||"–")),A("span",{},`📄 ${x.name}, ${p("web_learn_actual")}: `,A("code",{},bp((c=d.result.files)==null?void 0:c.get(x.name)).join(" | ")||"–")));!d.passed&&!d.result.error&&Dv(d.result.outputs,d.test.expected)&&b.append(A("span",{class:"learn-error"},p("web_learn_missing_line_break"))),d.result.error&&b.append(A("span",{class:"learn-error"},m1(d.result.error))),d.result.missingInput&&b.append(A("span",{class:"learn-error"},p("web_learn_missing_input"))),d.result.tooManySteps&&b.append(A("span",{class:"learn-error"},p("web_learn_too_many_steps"))),!d.passed&&d.result.unusedInputs&&b.append(A("span",{class:"learn-error"},p("web_learn_unused_input"))),r.append(A("li",{class:d.passed?"ok":"fail"},...f,b))}e.append(r)}renderCompetences(e){const t=A("aside",{class:"learn-competences"},A("p",{class:"learn-competences-title"},p("web_learn_competences_intro"))),n=A("ul",{});for(const a of e)n.append(Ue("li",{},Ae(a)));return t.append(n),t}renderChecklist(e,t,n){const a=[{value:"umbrella",icon:"☂️",label:p("web_learn_rating_umbrella")},{value:"cloud",icon:"⛅",label:p("web_learn_rating_cloud")},{value:"sun",icon:"☀️",label:p("web_learn_rating_sun")}],s=A("div",{class:"learn-checklist-wrap"}),r=A("p",{class:"learn-rating-legend"});for(const l of a)r.append(A("span",{},`${l.icon} ${l.label}`));const o=A("ul",{class:"learn-checklist"});return s.append(r,o),e.forEach((l,u)=>{var v;const m=`${t}-${u}`,c=n?(v=ve.lesson(n.id).checks)==null?void 0:v[m]:void 0;let d=c===!0?"sun":c||void 0;const h=Ue("span",{class:"learn-check-text"},Ae(l.text)),g=A("span",{class:"learn-rating",role:"group","aria-label":h.textContent??""}),f=a.map(w=>{const z=A("button",{class:"learn-rating-button",title:w.label,"aria-label":w.label},w.icon);return z.addEventListener("click",()=>{if(d=d===w.value?void 0:w.value,b(),!n)return;const I={...ve.lesson(n.id).checks??{}};d?I[m]=d:delete I[m],ve.updateLesson(n.id,{checks:Object.keys(I).length?I:void 0})}),z}),b=()=>{f.forEach((w,z)=>w.setAttribute("aria-pressed",String(a[z].value===d))),x.dataset.rating=d??""};g.append(...f);const x=A("li",{},h,g);if(n&&l.step!==void 0){const w=l.step,z=p("web_learn_step_fmt",w+1,n.steps[w].title),I=A("button",{class:"link-button learn-check-link",title:z,"aria-label":`${p("web_learn_review")}: ${z}`},p("web_learn_review"));I.addEventListener("click",()=>{this.returnTo={lesson:n.id,step:ve.lesson(n.id).step,scroll:this.body.scrollTop},this.goToStep(n,w)}),x.append(I)}b(),o.append(x)}),s}renderQuiz(e,t,n){const a=A("div",{class:"learn-quiz"}),s=A("p",{class:"learn-score",role:"status"}),r=()=>n?ve.lesson(n.id).quiz??{}:{},o=A("div",{class:"learn-review"}),l=()=>{const u=r(),m=(f,b)=>f.pairs?f.pairs.every((x,v)=>u[`${t}-${b}-${v}`]!==void 0):u[`${t}-${b}`]!==void 0,c=(f,b)=>{var x;return!!(f.pairs?f.pairs.every((v,w)=>cc(f)[u[`${t}-${b}-${w}`]]===f.pairs[w].right):(x=f.options[u[`${t}-${b}`]])!=null&&x.correct)},d=e.filter(m).length,h=e.filter(c).length,g=d===e.length;s.textContent=g?p("web_learn_score_fmt",h,e.length):"",o.replaceChildren(),g&&n&&this.fillChecklistReview(o,n,e,f=>c(e[f],f))};return e.forEach((u,m)=>{const c=`${t}-${m}`,d=A("fieldset",{},Ue("legend",{},Ae(u.question))),h=Ue("p",{class:"learn-explanation"},Ae(u.explanation??""));if(u.pairs){d.append(this.renderMatch(u,c,r,n,h,l),h),a.append(d);return}const g=f=>{d.querySelectorAll("button").forEach((b,x)=>{b.classList.toggle("right",f!==void 0&&u.options[x].correct),b.classList.toggle("wrong",f===x&&!u.options[x].correct),b.setAttribute("aria-pressed",String(f===x))}),h.hidden=f===void 0||!u.explanation};u.options.forEach((f,b)=>{const x=Ue("button",{class:"learn-option"},Ae(f.text));x.addEventListener("click",()=>{n&&ve.updateLesson(n.id,{quiz:{...r(),[c]:b}}),g(b),l()}),d.append(x)}),d.append(h),g(r()[c]),a.append(d)}),a.append(s,o),l(),a}fillChecklistReview(e,t,n,a){const s={sun:"☀️",cloud:"⛅",umbrella:"☂️"},r=ve.lesson(t.id).checks??{},o=[];let l=0;t.steps.forEach((u,m)=>u.blocks.forEach((c,d)=>{c.kind==="checklist"&&c.items.forEach((h,g)=>{const f=r[`${m}-${d}-${g}`],b=f===!0?"sun":f||void 0,x=h.step===void 0?[]:n.map((T,k)=>T.step===h.step?k:-1).filter(T=>T>=0),v=x.filter(T=>!a(T));let w="";b==="sun"&&v.length?w=p("web_learn_review_overrated_fmt",v.map(T=>T+1).join(", ")):b&&b!=="sun"&&x.length&&!v.length&&(w=p("web_learn_review_underrated")),w&&l++;const z=A("li",{class:w?"learn-review-deviation":""}),I=Ue("span",{class:"learn-check-text"},Ae(h.text));if(w&&I.append(A("br",{}),A("em",{},w)),z.append(I,A("span",{class:"learn-review-icon","aria-label":p(b?`web_learn_rating_${b}`:"web_learn_review_unrated")},b?s[b]:"–")),w&&b==="sun"&&h.step!==void 0){const T=h.step,k=A("button",{class:"link-button learn-check-link"},p("web_learn_review"));k.addEventListener("click",()=>{this.returnTo={lesson:t.id,step:ve.lesson(t.id).step,scroll:this.body.scrollTop},this.goToStep(t,T)}),z.append(k)}o.push(z)})})),o.length&&e.append(A("p",{class:"learn-review-title"},`📋 ${p("web_learn_review_title")}`),A("p",{},p(l?"web_learn_review_hint":"web_learn_review_match")),A("ul",{class:"learn-checklist"},...o))}renderMatch(e,t,n,a,s,r){const o=e.pairs,l=cc(e),u=A("div",{class:"learn-match"});let m={};const c=()=>a?n():m,d=b=>a?ve.updateLesson(a.id,{quiz:b}):m=b,h=b=>c()[`${t}-${b}`],g=o.map(b=>{const x=A("select",{class:"learn-match-select"});x.append(A("option",{value:""},"–")),l.forEach((w,z)=>x.append(A("option",{value:String(z)},w)));const v=Ue("label",{class:"learn-match-left"},Ae(b.left));return v.append(x),u.append(v),x}),f=()=>{const b=o.every((x,v)=>h(v)!==void 0);g.forEach((x,v)=>{const w=h(v);x.value=w===void 0?"":String(w),x.classList.toggle("right",b&&l[w]===o[v].right),x.classList.toggle("wrong",b&&l[w]!==o[v].right)}),s.hidden=!b||!e.explanation};return g.forEach((b,x)=>b.addEventListener("change",()=>{const v={...c()};b.value===""?delete v[`${t}-${x}`]:v[`${t}-${x}`]=Number(b.value),d(v),f(),r()})),f(),u}}function cc(i){return(i.pairs??[]).map(e=>e.right).sort((e,t)=>e.localeCompare(t,"de"))}function JJ(i){const e=Dp(i),t=e==="beide"?"web_learn_solve_in_both":e==="code"?"web_learn_solve_in_code":"web_learn_solve_in_editor",n={editor:p("web_editor_title"),code:p("web_live_title")},a=e==="beide"?["editor","code"]:[e==="code"?"code":"editor"],s=A("p",{class:`learn-where learn-where-${e}`});for(const r of p(t,...a).split(/(\u0001(?:editor|code))/))if(r==="editor"||r==="code"){const o=r.slice(1);s.append(A("span",{class:`area-name area-${o}`},n[o]))}else r&&s.append(r);return s}const Oa=()=>typeof window.showDirectoryPicker=="function";class Dr{constructor(e){this.handle=e}get name(){return this.handle.name}async list(){const e=[];for await(const t of this.handle.values())t.name.startsWith(".")||e.push({kind:t.kind,name:t.name});return e}async dir(e,t=!1){return new Dr(await this.handle.getDirectoryHandle(e,{create:t}))}async read(e){return(await(await this.handle.getFileHandle(e)).getFile()).text()}async write(e,t){const a=await(await this.handle.getFileHandle(e,{create:!0})).createWritable();await a.write(t),await a.close()}async has(e){try{return await this.handle.getFileHandle(e),!0}catch{try{return await this.handle.getDirectoryHandle(e),!0}catch{return!1}}}async remove(e){await this.handle.removeEntry(e,{recursive:!0})}}const GJ="visustruct-workspace";function HJ(){return new Promise((i,e)=>{const t=indexedDB.open(GJ,1);t.onupgradeneeded=()=>{t.result.createObjectStore("files"),t.result.createObjectStore("meta")},t.onsuccess=()=>i(t.result),t.onerror=()=>e(t.error)})}async function Ct(i,e,t){const n=await HJ();return new Promise((a,s)=>{const r=t(n.transaction(i,e).objectStore(i));r.onsuccess=()=>a(r.result),r.onerror=()=>s(r.error)})}class nu{constructor(e,t){this.name=e,this.path=t}key(e){return this.path+e}async list(){const e=await Ct("files","readonly",n=>n.getAllKeys()),t=new Map;for(const n of e){if(!n.startsWith(this.path)||n===this.path)continue;const a=n.slice(this.path.length),s=a.indexOf("/"),r=s<0?a:a.slice(0,s);t.has(r)||t.set(r,{kind:s<0?"file":"directory",name:r})}return[...t.values()]}async dir(e,t=!1){const n=this.key(e)+"/";if(!(await Ct("files","readonly",s=>s.count(n))>0)){if(!t)throw new DOMException(e,"NotFoundError");await Ct("files","readwrite",s=>s.put("",n))}return new nu(e,n)}async read(e){const t=await Ct("files","readonly",n=>n.get(this.key(e)));if(typeof t!="string")throw new DOMException(e,"NotFoundError");return t}async write(e,t){await Ct("files","readwrite",n=>n.put(t,this.key(e)))}async has(e){const t=await Ct("files","readonly",a=>a.count(this.key(e))),n=await Ct("files","readonly",a=>a.count(this.key(e)+"/"));return t+n>0}async remove(e){const t=this.key(e);await Ct("files","readwrite",n=>n.delete(t)),await Ct("files","readwrite",n=>n.delete(IDBKeyRange.bound(t+"/",t+"/￿")))}}async function VJ(i,e="folder"){const t=await window.showDirectoryPicker({id:e==="folder"?"visustruct-workspace":e,mode:"readwrite"}),n=i&&t.name!==i?await t.getDirectoryHandle(i,{create:!0}):t;return await Ct("meta","readwrite",a=>a.put(n,e)),{kind:"folder",root:new Dr(n)}}function dc(){return{kind:"browser",root:new nu("VisuStruct","")}}async function qJ(i="folder"){var e;try{const t=await Ct("meta","readonly",a=>a.get(i));if(!t)return;const n=await((e=t.queryPermission)==null?void 0:e.call(t,{mode:"readwrite"}))??"granted";return{handle:t,ready:n==="granted"}}catch{return}}async function hc(i){var t;return(await((t=i.requestPermission)==null?void 0:t.call(i,{mode:"readwrite"}))??"granted")==="granted"?{kind:"folder",root:new Dr(i)}:void 0}async function UJ(i="folder"){try{await Ct("meta","readwrite",e=>e.delete(i))}catch{}}const Ma="learnProgress.json",Za="lernstand.json",La="visustruct.files.mode",gc="visustruct.files.expanded";function QJ(i){try{const e=JSON.parse(Qp(i)??"[]");return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}catch{return[]}}function Qp(i){try{return localStorage.getItem(i)}catch{return null}}function Wa(i,e){try{e===null?localStorage.removeItem(i):localStorage.setItem(i,e)}catch{}}const te=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function pc(i){return new Promise(e=>{const t=document.createElement("div");t.className="confirm";const n=(i.choices??[]).map(o=>``).join("");t.innerHTML=``;const a=t.querySelector("form"),s=a.querySelector("input"),r=o=>{t.remove(),e(o)};a.addEventListener("submit",o=>{if(o.preventDefault(),!s)return r("");s.value.trim()?r(s.value):s.focus()}),t.addEventListener("click",o=>{var m;const l=o.target,u=(m=l.closest("[data-choice]"))==null?void 0:m.dataset.choice;u!==void 0?r(u):(l===t||l.closest("[data-cancel]"))&&r(void 0)}),t.addEventListener("keydown",o=>o.key==="Escape"&&r(void 0)),document.body.append(t),(s??a.querySelector("[data-cancel]")).focus()})}class $J{constructor(e){y(this,"element");y(this,"body");y(this,"workspace");y(this,"pending");y(this,"expanded",new Set(QJ(gc)));y(this,"rendering",0);y(this,"progressWorkspace");y(this,"hadWorkspace",!1);y(this,"progressTimer");this.host=e,this.element=document.createElement("aside"),this.element.className="files",this.build(),ve.onChange(()=>this.progressChanged()),this.restore()}rememberExpanded(){Wa(gc,JSON.stringify([...this.expanded]))}get ready(){return!!this.workspace}build(){this.element.innerHTML=` -
    -

    ${te(p("web_files_title"))}

    - - - -
    -
    - `,this.body=this.element.querySelector(".files-body");const e=(t,n)=>this.element.querySelector(`[data-files=${t}]`).addEventListener("click",n);e("hide",()=>this.host.hide()),e("new-folder",()=>void this.newFolder()),e("switch",()=>void this.switchWorkspace()),this.body.addEventListener("click",t=>void this.onTreeClick(t)),this.render()}async restore(){if(Qp(La)==="browser")this.workspace=dc();else if(Oa()){const e=await qJ();e!=null&&e.ready?this.workspace=await hc(e.handle):this.pending=e==null?void 0:e.handle}await this.render(),this.workspace||this.startDialog()}async startDialog(){var r;const e=p("web_learn_start_folder"),t=(o,l,u=!1,m)=>`${m?`

    ${te(m)}

    `:""}`,n=Oa()?[this.pending?t("reconnect",`${me.open} ${te(p("web_learn_start_continue_fmt",this.pending.name))}`,!0):"",t("pick",`${me.open} ${te(p("web_learn_start_open"))}`,!this.pending),t("create",`${me.newFolder} ${te(p("web_learn_start_create_fmt",e))}`,!1,p("web_learn_start_create_hint"))]:[t("browser",te(p("web_files_browser")),!0,p("web_files_browser_hint"))],a=document.createElement("div");a.className="confirm",a.innerHTML=``;const s=()=>a.remove();a.addEventListener("click",o=>{var m,c;const l=(m=o.target.closest("[data-world]"))==null?void 0:m.dataset.world;if(l){this.host.chooseWorld(l).then(()=>a.querySelector(".start-world").innerHTML=pl());return}const u=(c=o.target.closest("[data-start]"))==null?void 0:c.dataset.start;u&&(s(),u==="reconnect"?this.reconnect():u==="pick"?this.connectFolder():u==="create"?this.connectFolder(e):u==="browser"&&this.useBrowser())}),a.addEventListener("keydown",o=>o.key==="Escape"&&s()),document.body.append(a),(r=a.querySelector(".files-start"))==null||r.focus()}async connectFolder(e){try{this.workspace=await VJ(e),this.pending=void 0,Wa(La,"folder")}catch{}await this.render()}async reconnect(){this.pending&&(this.workspace=await hc(this.pending),this.workspace&&(this.pending=void 0),await this.render())}async useBrowser(){this.workspace=dc(),Wa(La,"browser"),await this.render()}async switchWorkspace(){if(Oa())return this.connectFolder();this.workspace=void 0,Wa(La,null),await UJ(),await this.render()}async syncProgress(e){if(this.progressWorkspace=e,!e)return;const t=!this.hadWorkspace;this.hadWorkspace=!0;try{const n=await e.root.has(Ma)?Ma:await e.root.has(Za)?Za:void 0;(!n||!ve.loadFile(await e.root.read(n),t))&&(t||ve.clear()),this.host.progressLoaded(),await this.writeProgress(e),await e.root.has(Za)&&(await e.root.remove(Za),await this.render())}catch{}}async writeProgress(e){if(e===this.progressWorkspace)try{const t=!await e.root.has(Ma);await e.root.write(Ma,ve.toFile()),t&&await this.render()}catch{}}progressChanged(){const e=this.progressWorkspace;e&&(window.clearTimeout(this.progressTimer),this.progressTimer=window.setTimeout(()=>void this.writeProgress(e),1e3))}async render(){const e=++this.rendering,t=this.workspace;if(t!==this.progressWorkspace&&this.syncProgress(t),this.element.querySelector("[data-files=new-folder]").hidden=!t,this.element.querySelector("[data-files=switch]").hidden=!t,!t){this.body.innerHTML=this.startHTML();return}const n=[],a=async(o,l,u)=>{const m=(await o.list()).sort(zv);for(const c of m){const d=l?`${l}/${c.name}`:c.name;if(c.kind==="directory"){const h=this.expanded.has(d);n.push(`
    - - -
    `),h&&await a(await o.dir(c.name),d,u+1)}else if(/\.(visustruct|java|json)$/i.test(c.name)){if(/\.java$/i.test(c.name)&&m.some(g=>g.name===c.name.replace(/\.java$/i,".visustruct")))continue;const h=/\.(visustruct|java)$/i.test(c.name);n.push(`
    - - ${h?``:""} -
    `)}}};try{await a(t.root,"",0)}catch(o){n.push(`

    ${te(o.message)}

    `)}if(e!==this.rendering)return;const s=t.kind==="folder"?`📁 ${te(t.root.name)}`:te(p("web_files_in_browser")),r=p("web_files_save_hint_fmt",Om());this.body.innerHTML=` -

    ${s}

    -
    ${n.join("")||`

    ${te(p("web_files_empty"))}

    `}
    -

    ${te(r)}

    - `}startHTML(){return this.pending?`

    ${te(p("web_files_reconnect_hint"))}

    - - `:Oa()?`

    ${te(p("web_files_connect_hint"))}

    - `:`

    ${te(p("web_files_browser_hint"))}

    - `}async onTreeClick(e){var r;const t=e.target,n=(r=t.closest("[data-start]"))==null?void 0:r.dataset.start;if(n==="pick")return this.connectFolder();if(n==="reconnect")return this.reconnect();if(n==="browser")return this.useBrowser();const a=t.closest(".files-row");if(!a||!this.workspace)return;const s=a.dataset.path;if(t.closest(".files-delete"))return this.remove(a);if(a.dataset.kind==="dir")return this.expanded.has(s)?this.expanded.delete(s):this.expanded.add(s),this.rememberExpanded(),this.render();if(a.dataset.kind==="program")return this.openProgram(s)}async locate(e){const t=e.split("/");let n=this.workspace.root;for(const a of t.slice(0,-1))n=await n.dir(a);return{dir:n,name:t.at(-1)}}async openProgram(e){try{const{dir:t,name:n}=await this.locate(e),a=n.replace(/\.(visustruct|java)$/i,""),s=await t.has(`${a}.visustruct`)?await t.read(`${a}.visustruct`):void 0,r=await t.has(`${a}.java`)?await t.read(`${a}.java`):void 0;if(s===void 0&&r===void 0)return;const o={dir:t,base:a,path:e.replace(/\.(visustruct|java)$/i,"")};this.host.open(s??"",o,r)}catch(t){this.host.message(t.message)}}async remove(e){const t=e.dataset.path,n=e.dataset.kind==="program",a=n?t.replace(/\.(visustruct|java)$/i,""):t;if(await pc({title:p("web_files_delete_confirm_fmt",a),ok:p("web_files_delete"),danger:!0})!==void 0){try{const{dir:s,name:r}=await this.locate(t);if(n){const o=r.replace(/\.(visustruct|java)$/i,"");for(const l of[".visustruct",".java"])await s.has(o+l)&&await s.remove(o+l)}else await s.remove(r)}catch(s){this.host.message(s.message)}await this.render()}}async newFolder(){if(!this.workspace)return;const e=Sv(await pc({title:p("web_files_folder_prompt"),input:"",ok:p("web_files_create")})??"");if(e){try{await this.workspace.root.dir(e,!0)}catch(t){this.host.message(t.message)}await this.render()}}async save(e,t,n,a){const s=this.workspace;if(!s)return;let r=a;if(!r){const o=Om(),l=await s.root.dir(o,!0),u=kv(Iv(e,p("web_files_default_name")),(await l.list()).map(m=>m.name));r={dir:l,base:u,path:`${o}/${u}`},this.expanded.add(o),this.rememberExpanded()}return await r.dir.write(`${r.base}.visustruct`,t),n!==void 0&&await r.dir.write(`${r.base}.java`,n),await this.render(),r}}let kl=[],$p=[];(()=>{let i="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(i=$p[n])e=n+1;else return!0;if(e==t)return!1}}function fc(i){return i>=127462&&i<=127487}const bc=8205;function KJ(i,e,t=!0,n=!0){return(t?Yp:XJ)(i,e,n)}function Yp(i,e,t){if(e==i.length)return e;e&&Kp(i.charCodeAt(e))&&Xp(i.charCodeAt(e-1))&&e--;let n=oo(i,e);for(e+=xc(n);e=0&&fc(oo(i,r));)s++,r-=2;if(s%2==0)break;e+=2}else break}return e}function XJ(i,e,t){for(;e>1;){let n=Yp(i,e-2,t);if(n=56320&&i<57344}function Xp(i){return i>=55296&&i<56320}function xc(i){return i<65536?1:2}class he{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=G1(this,e,t);let a=[];return this.decompose(0,e,a,2),n.length&&n.decompose(0,n.length,a,3),this.decompose(t,this.length,a,1),rn.from(a,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=G1(this,e,t);let n=[];return this.decompose(e,t,n,0),rn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),a=new Ai(this),s=new Ai(e);for(let r=t,o=t;;){if(a.next(r),s.next(r),r=0,a.lineBreak!=s.lineBreak||a.done!=s.done||a.value!=s.value)return!1;if(o+=a.value.length,a.done||o>=n)return!0}}iter(e=1){return new Ai(this,e)}iterRange(e,t=this.length){return new ef(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t==null&&(t=this.lines+1);let a=this.line(e).from;n=this.iterRange(a,Math.max(a,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new tf(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?he.empty:e.length<=32?new Be(e):rn.from(Be.split(e,[]))}}class Be extends he{constructor(e,t=eG(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.text[s],o=a+r.length;if((t?n:o)>=e)return new tG(a,o,n,r);a=o+1,n++}}decompose(e,t,n,a){let s=e<=0&&t>=this.length?this:new Be(vc(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(a&1){let r=n.pop(),o=xs(s.text,r.text.slice(),0,s.length);if(o.length<=32)n.push(new Be(o,r.length+s.length));else{let l=o.length>>1;n.push(new Be(o.slice(0,l)),new Be(o.slice(l)))}}else n.push(s)}replace(e,t,n){if(!(n instanceof Be))return super.replace(e,t,n);[e,t]=G1(this,e,t);let a=xs(this.text,xs(n.text,vc(this.text,0,e)),t),s=this.length+n.length-(t-e);return a.length<=32?new Be(a,s):rn.from(Be.split(a,[]),s)}sliceString(e,t=this.length,n=` -`){[e,t]=G1(this,e,t);let a="";for(let s=0,r=0;s<=t&&re&&r&&(a+=n),es&&(a+=o.slice(Math.max(0,e-s),t-s)),s=l+1}return a}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let n=[],a=-1;for(let s of e)n.push(s),a+=s.length+1,n.length==32&&(t.push(new Be(n,a)),n=[],a=-1);return a>-1&&t.push(new Be(n,a)),t}}class rn extends he{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let n of e)this.lines+=n.lines}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.children[s],o=a+r.length,l=n+r.lines-1;if((t?l:o)>=e)return r.lineInner(e,t,n,a);a=o+1,n=l+1}}decompose(e,t,n,a){for(let s=0,r=0;r<=t&&s=r){let u=a&((r<=e?1:0)|(l>=t?2:0));r>=e&&l<=t&&!u?n.push(o):o.decompose(e-r,t-r,n,u)}r=l+1}}replace(e,t,n){if([e,t]=G1(this,e,t),n.lines=s&&t<=o){let l=r.replace(e-s,t-s,n),u=this.lines-r.lines+l.lines;if(l.lines>4&&l.lines>u>>6){let m=this.children.slice();return m[a]=l,new rn(m,this.length-(t-e)+n.length)}return super.replace(s,o,l)}s=o+1}return super.replace(e,t,n)}sliceString(e,t=this.length,n=` -`){[e,t]=G1(this,e,t);let a="";for(let s=0,r=0;se&&s&&(a+=n),er&&(a+=o.sliceString(e-r,t-r,n)),r=l+1}return a}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof rn))return 0;let n=0,[a,s,r,o]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;a+=t,s+=t){if(a==r||s==o)return n;let l=this.children[a],u=e.children[s];if(l!=u)return n+l.scanIdentical(u,t);n+=l.length+1}}static from(e,t=e.reduce((n,a)=>n+a.length+1,-1)){let n=0;for(let h of e)n+=h.lines;if(n<32){let h=[];for(let g of e)g.flatten(h);return new Be(h,t)}let a=Math.max(32,n>>5),s=a<<1,r=a>>1,o=[],l=0,u=-1,m=[];function c(h){let g;if(h.lines>s&&h instanceof rn)for(let f of h.children)c(f);else h.lines>r&&(l>r||!l)?(d(),o.push(h)):h instanceof Be&&l&&(g=m[m.length-1])instanceof Be&&h.lines+g.lines<=32?(l+=h.lines,u+=h.length+1,m[m.length-1]=new Be(g.text.concat(h.text),g.length+1+h.length)):(l+h.lines>a&&d(),l+=h.lines,u+=h.length+1,m.push(h))}function d(){l!=0&&(o.push(m.length==1?m[0]:rn.from(m,u)),u=-1,l=m.length=0)}for(let h of e)c(h);return d(),o.length==1?o[0]:new rn(o,t)}}he.empty=new Be([""],0);function eG(i){let e=-1;for(let t of i)e+=t.length+1;return e}function xs(i,e,t=0,n=1e9){for(let a=0,s=0,r=!0;s=t&&(l>n&&(o=o.slice(0,n-a)),a0?1:(e instanceof Be?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,a=this.nodes[n],s=this.offsets[n],r=s>>1,o=a instanceof Be?a.text.length:a.children.length;if(r==(t>0?o:0)){if(n==0)return this.done=!0,this.value="",this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((s&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=` -`,this;e--}else if(a instanceof Be){let l=a.text[r+(t<0?-1:0)];if(this.offsets[n]+=t,l.length>Math.max(0,e))return this.value=e==0?l:t>0?l.slice(e):l.slice(0,l.length-e),this;e-=l.length}else{let l=a.children[r+(t<0?-1:0)];e>l.length?(e-=l.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(l),this.offsets.push(t>0?1:(l instanceof Be?l.text.length:l.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class ef{constructor(e,t,n){this.value="",this.done=!1,this.cursor=new Ai(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:a}=this.cursor.next(e);return this.pos+=(a.length+e)*t,this.value=a.length<=n?a:t<0?a.slice(a.length-n):a.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class tf{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:n,value:a}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):n?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=a,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(he.prototype[Symbol.iterator]=function(){return this.iter()},Ai.prototype[Symbol.iterator]=ef.prototype[Symbol.iterator]=tf.prototype[Symbol.iterator]=function(){return this});class tG{constructor(e,t,n,a){this.from=e,this.to=t,this.number=n,this.text=a}get length(){return this.to-this.from}}function G1(i,e,t){return e=Math.max(0,Math.min(i.length,e)),[e,Math.max(e,Math.min(i.length,t))]}function ut(i,e,t=!0,n=!0){return KJ(i,e,t,n)}function nG(i){return i>=56320&&i<57344}function iG(i){return i>=55296&&i<56320}function Pt(i,e){let t=i.charCodeAt(e);if(!iG(t)||e+1==i.length)return t;let n=i.charCodeAt(e+1);return nG(n)?(t-55296<<10)+(n-56320)+65536:t}function nf(i){return i<=65535?String.fromCharCode(i):(i-=65536,String.fromCharCode((i>>10)+55296,(i&1023)+56320))}function xn(i){return i<65536?1:2}const Sl=/\r\n?|\n/;var lt=(function(i){return i[i.Simple=0]="Simple",i[i.TrackDel=1]="TrackDel",i[i.TrackBefore=2]="TrackBefore",i[i.TrackAfter=3]="TrackAfter",i})(lt||(lt={}));class wn{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-a);s+=o}else{if(n!=lt.Simple&&u>=e&&(n==lt.TrackDel&&ae||n==lt.TrackBefore&&ae))return null;if(u>e||u==e&&t<0&&!o)return e==a||t<0?s:s+l;s+=l}a=u}if(e>a)throw new RangeError(`Position ${e} is out of range for changeset of length ${a}`);return s}touchesRange(e,t=e){for(let n=0,a=0;n=0&&a<=t&&o>=e)return at?"cover":!0;a=o}return!1}toString(){let e="";for(let t=0;t=0?":"+a:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new wn(e)}static create(e){return new wn(e)}}class Le extends wn{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Tl(this,(t,n,a,s,r)=>e=e.replace(a,a+(n-t),r),!1),e}mapDesc(e,t=!1){return _l(this,e,t,!0)}invert(e){let t=this.sections.slice(),n=[];for(let a=0,s=0;a=0){t[a]=o,t[a+1]=r;let l=a>>1;for(;n.length0&&Zn(n,t,s.text),s.forward(m),o+=m}let u=e[r++];for(;o>1].toJSON()))}return e}static of(e,t,n){let a=[],s=[],r=0,o=null;function l(m=!1){if(!m&&!a.length)return;rd||c<0||d>t)throw new RangeError(`Invalid change range ${c} to ${d} (in doc of length ${t})`);let g=h?typeof h=="string"?he.of(h.split(n||Sl)):h:he.empty,f=g.length;if(c==d&&f==0)return;cr&&rt(a,c-r,-1),rt(a,d-c,f),Zn(s,a,g),r=d}}return u(e),l(!o),o}static empty(e){return new Le(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],n=[];for(let a=0;ao&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(s.length==1)t.push(s[0],0);else{for(;n.length=0&&t<=0&&t==i[a+1]?i[a]+=e:a>=0&&e==0&&i[a]==0?i[a+1]+=t:n?(i[a]+=e,i[a+1]+=t):i.push(e,t)}function Zn(i,e,t){if(t.length==0)return;let n=e.length-2>>1;if(n>1])),!(t||r==i.sections.length||i.sections[r+1]<0);)o=i.sections[r++],l=i.sections[r++];e(a,u,s,m,c),a=u,s=m}}}function _l(i,e,t,n=!1){let a=[],s=n?[]:null,r=new qi(i),o=new qi(e);for(let l=-1;;){if(r.done&&o.len||o.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&o.ins==-1){let u=Math.min(r.len,o.len);rt(a,u,-1),r.forward(u),o.forward(u)}else if(o.ins>=0&&(r.ins<0||l==r.i||r.off==0&&(o.len=0&&l=0){let u=0,m=r.len;for(;m;)if(o.ins==-1){let c=Math.min(m,o.len);u+=c,m-=c,o.forward(c)}else if(o.ins==0&&o.lenl||r.ins>=0&&r.len>l)&&(o||n.length>u),s.forward2(l),r.forward(l)}}}}class qi{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?he.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?he.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class Pn{constructor(e,t,n,a){this.from=e,this.to=t,this.flags=n,this.goalColumn=a}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(e,t=-1){let n,a;return this.empty?n=a=e.mapPos(this.from,t):(n=e.mapPos(this.from,1),a=e.mapPos(this.to,-1)),n==this.from&&a==this.to?this:new Pn(n,a,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return O.range(e,t,void 0,void 0,n);let a=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return O.range(this.anchor,a,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return O.range(e.anchor,e.head)}static create(e,t,n,a){return new Pn(e,t,n,a)}}class O{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:O.create(this.ranges.map(n=>n.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;ne.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new O(e.ranges.map(t=>Pn.fromJSON(t)),e.main)}static single(e,t=e){return new O([O.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let n=0,a=0;aa.from-s.from),t=e.indexOf(n);for(let a=1;as.head?O.range(l,o):O.range(o,l))}}return new O(e,t)}}function sf(i,e){for(let t of i.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let iu=0;class Q{constructor(e,t,n,a,s){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=a,this.id=iu++,this.default=e([]),this.extensions=typeof s=="function"?s(this):s}get reader(){return this}static define(e={}){return new Q(e.combine||(t=>t),e.compareInput||((t,n)=>t===n),e.compare||(e.combine?(t,n)=>t===n:au),!!e.static,e.enables)}of(e){return new vs([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new vs(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new vs(e,this,2,t)}from(e,t){return t||(t=n=>n),this.compute([e],n=>t(n.field(e)))}}function au(i,e){return i==e||i.length==e.length&&i.every((t,n)=>t===e[n])}class vs{constructor(e,t,n,a){this.dependencies=e,this.facet=t,this.type=n,this.value=a,this.id=iu++}dynamicSlot(e){var t;let n=this.value,a=this.facet.compareInput,s=this.id,r=e[s]>>1,o=this.type==2,l=!1,u=!1,m=[];for(let c of this.dependencies)c=="doc"?l=!0:c=="selection"?u=!0:(((t=e[c.id])!==null&&t!==void 0?t:1)&1)==0&&m.push(e[c.id]);return{create(c){return c.values[r]=n(c),1},update(c,d){if(l&&d.docChanged||u&&(d.docChanged||d.selection)||Al(c,m)){let h=n(c);if(o?!wc(h,c.values[r],a):!a(h,c.values[r]))return c.values[r]=h,1}return 0},reconfigure:(c,d)=>{let h,g=d.config.address[s];if(g!=null){let f=Qs(d,g);if(this.dependencies.every(b=>b instanceof Q?d.facet(b)===c.facet(b):b instanceof Nt?d.field(b,!1)==c.field(b,!1):!0)||(o?wc(h=n(c),f,a):a(h=n(c),f)))return c.values[r]=f,0}else h=n(c);return c.values[r]=h,1}}}get extension(){return this}}function wc(i,e,t){if(i.length!=e.length)return!1;for(let n=0;ni[l.id]),a=t.map(l=>l.type),s=n.filter(l=>!(l&1)),r=i[e.id]>>1;function o(l){let u=[];for(let m=0;mn===a),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(Ea).find(n=>n.field==this);return((t==null?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:n=>(n.values[t]=this.create(n),1),update:(n,a)=>{let s=n.values[t],r=this.updateF(s,a);return this.compareF(s,r)?0:(n.values[t]=r,1)},reconfigure:(n,a)=>{let s=n.facet(Ea),r=a.facet(Ea),o;return(o=s.find(l=>l.field==this))&&o!=r.find(l=>l.field==this)?(n.values[t]=o.create(n),1):a.config.address[this.id]!=null?(n.values[t]=a.field(this),0):(n.values[t]=this.create(n),1)}}}init(e){return[this,Ea.of({field:this,create:e})]}get extension(){return this}}const e1={lowest:4,low:3,default:2,high:1,highest:0};function li(i){return e=>new rf(e,i)}const f1={highest:li(e1.highest),high:li(e1.high),default:li(e1.default),low:li(e1.low),lowest:li(e1.lowest)};class rf{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}}class ma{of(e){return new jl(this,e)}reconfigure(e){return ma.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class jl{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}}class Us{constructor(e,t,n,a,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=a,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,n){let a=[],s=Object.create(null),r=new Map;for(let d of sG(e,t,r))d instanceof Nt?a.push(d):(s[d.facet.id]||(s[d.facet.id]=[])).push(d);let o=Object.create(null),l=[],u=[];for(let d of a)o[d.id]=u.length<<1,u.push(h=>d.slot(h));let m=n==null?void 0:n.config.facets;for(let d in s){let h=s[d],g=h[0].facet,f=m&&m[d]||[];if(h.every(b=>b.type==0))if(o[g.id]=l.length<<1|1,au(f,h))l.push(n.facet(g));else{let b=g.combine(h.map(x=>x.value));l.push(n&&g.compare(b,n.facet(g))?n.facet(g):b)}else{for(let b of h)b.type==0?(o[b.id]=l.length<<1|1,l.push(b.value)):(o[b.id]=u.length<<1,u.push(x=>b.dynamicSlot(x)));o[g.id]=u.length<<1,u.push(b=>aG(b,g,h))}}let c=u.map(d=>d(o));return new Us(e,r,c,o,l,s)}}function sG(i,e,t){let n=[[],[],[],[],[]],a=new Map;function s(r,o){let l=a.get(r);if(l!=null){if(l<=o)return;let u=n[l].indexOf(r);u>-1&&n[l].splice(u,1),r instanceof jl&&t.delete(r.compartment)}if(a.set(r,o),Array.isArray(r))for(let u of r)s(u,o);else if(r instanceof jl){if(t.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let u=e.get(r.compartment)||r.inner;t.set(r.compartment,u),s(u,o)}else if(r instanceof rf)s(r.inner,r.prec);else if(r instanceof Nt)n[o].push(r),r.provides&&s(r.provides,o);else if(r instanceof vs)n[o].push(r),r.facet.extensions&&s(r.facet.extensions,e1.default);else{let u=r.extension;if(!u)throw new Error(`Unrecognized extension value in extension set (${r}).`);if(u==r)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);s(u,o)}}return s(i,e1.default),n.reduce((r,o)=>r.concat(o))}function ji(i,e){if(e&1)return 2;let t=e>>1,n=i.status[t];if(n==4)throw new Error("Cyclic dependency between fields and/or facets");if(n&2)return n;i.status[t]=4;let a=i.computeSlot(i,i.config.dynamicSlots[t]);return i.status[t]=2|a}function Qs(i,e){return e&1?i.config.staticValues[e>>1]:i.values[e>>1]}const of=Q.define(),Cl=Q.define({combine:i=>i.some(e=>e),static:!0}),lf=Q.define({combine:i=>i.length?i[0]:void 0,static:!0}),uf=Q.define(),mf=Q.define(),cf=Q.define(),df=Q.define({combine:i=>i.length?i[0]:!1});class Vn{constructor(e,t){this.type=e,this.value=t}static define(){return new rG}}class rG{of(e){return new Vn(this,e)}}class oG{constructor(e){this.map=e}of(e){return new pe(this,e)}}class pe{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new pe(this.type,t)}is(e){return this.type==e}static define(e={}){return new oG(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let a of e){let s=a.map(t);s&&n.push(s)}return n}}pe.reconfigure=pe.define();pe.appendConfig=pe.define();class Ke{constructor(e,t,n,a,s,r){this.startState=e,this.changes=t,this.selection=n,this.effects=a,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,n&&sf(n,t.newLength),s.some(o=>o.type==Ke.time)||(this.annotations=s.concat(Ke.time.of(Date.now())))}static create(e,t,n,a,s,r){return new Ke(e,t,n,a,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(Ke.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}Ke.time=Vn.define();Ke.userEvent=Vn.define();Ke.addToHistory=Vn.define();Ke.remote=Vn.define();function lG(i,e){let t=[];for(let n=0,a=0;;){let s,r;if(n=i[n]))s=i[n++],r=i[n++];else if(a=0;a--){let s=n[a](i);s instanceof Ke?i=s:Array.isArray(s)&&s.length==1&&s[0]instanceof Ke?i=s[0]:i=gf(e,W1(s),!1)}return i}function mG(i){let e=i.startState,t=e.facet(cf),n=i;for(let a=t.length-1;a>=0;a--){let s=t[a](i);s&&Object.keys(s).length&&(n=hf(n,Dl(e,s,i.changes.newLength),!0))}return n==i?i:Ke.create(e,i.changes,i.selection,n.effects,n.annotations,n.scrollIntoView)}const cG=[];function W1(i){return i==null?cG:Array.isArray(i)?i:[i]}var Mt=(function(i){return i[i.Word=0]="Word",i[i.Space=1]="Space",i[i.Other=2]="Other",i})(Mt||(Mt={}));const dG=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let Bl;try{Bl=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function hG(i){if(Bl)return Bl.test(i);for(let e=0;e"€"&&(t.toUpperCase()!=t.toLowerCase()||dG.test(t)))return!0}return!1}function gG(i){return e=>{if(!/\S/.test(e))return Mt.Space;if(hG(e))return Mt.Word;for(let t=0;t-1)return Mt.Word;return Mt.Other}}class ce{constructor(e,t,n,a,s,r){this.config=e,this.doc=t,this.selection=n,this.values=a,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let o=0;oa.set(u,l)),t=null),a.set(o.value.compartment,o.value.extension)):o.is(pe.reconfigure)?(t=null,n=o.value):o.is(pe.appendConfig)&&(t=null,n=W1(n).concat(o.value));let s;t?s=e.startState.values.slice():(t=Us.resolve(n,a,this),s=new ce(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,u)=>u.reconfigure(l,this),null).values);let r=e.startState.facet(Cl)?e.newSelection:e.newSelection.asSingle();new ce(t,e.newDoc,r,s,(o,l)=>l.update(o,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:O.cursor(t.from+e.length,-1)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),a=this.changes(n.changes),s=[n.range],r=W1(n.effects);for(let o=1;or.spec.fromJSON(o,l)))}}return ce.create({doc:e.doc,selection:O.fromJSON(e.selection),extensions:t.extensions?a.concat([t.extensions]):a})}static create(e={}){let t=Us.resolve(e.extensions||[],new Map),n=e.doc instanceof he?e.doc:he.of((e.doc||"").split(t.staticFacet(ce.lineSeparator)||Sl)),a=e.selection?e.selection instanceof O?e.selection:O.single(e.selection.anchor,e.selection.head):O.single(0);return sf(a,n.length),t.staticFacet(Cl)||(a=a.asSingle()),new ce(t,n,a,t.dynamicSlots.map(()=>null),(s,r)=>r.create(s),null)}get tabSize(){return this.facet(ce.tabSize)}get lineBreak(){return this.facet(ce.lineSeparator)||` -`}get readOnly(){return this.facet(df)}phrase(e,...t){for(let n of this.facet(ce.phrases))if(Object.prototype.hasOwnProperty.call(n,e)){e=n[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(n,a)=>{if(a=="$")return"$";let s=+(a||1);return!s||s>t.length?n:t[s-1]})),e}languageDataAt(e,t,n=-1){let a=[];for(let s of this.facet(of))for(let r of s(this,t,n))Object.prototype.hasOwnProperty.call(r,e)&&a.push(r[e]);return a}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return gG(t.length?t[0]:"")}wordAt(e){let{text:t,from:n,length:a}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-n,o=e-n;for(;r>0;){let l=ut(t,r,!1);if(s(t.slice(l,r))!=Mt.Word)break;r=l}for(;oi.length?i[0]:4});ce.lineSeparator=lf;ce.readOnly=df;ce.phrases=Q.define({compare(i,e){let t=Object.keys(i),n=Object.keys(e);return t.length==n.length&&t.every(a=>i[a]==e[a])}});ce.languageData=of;ce.changeFilter=uf;ce.transactionFilter=mf;ce.transactionExtender=cf;ma.reconfigure=pe.define();function su(i,e,t={}){let n={};for(let a of i)for(let s of Object.keys(a)){let r=a[s],o=n[s];if(o===void 0)n[s]=r;else if(!(o===r||r===void 0))if(Object.hasOwnProperty.call(t,s))n[s]=t[s](o,r);else throw new Error("Config merge conflict for field "+s)}for(let a in e)n[a]===void 0&&(n[a]=e[a]);return n}class Fn{eq(e){return this==e}range(e,t=e){return Pl.create(e,t,this)}}Fn.prototype.startSide=Fn.prototype.endSide=0;Fn.prototype.point=!1;Fn.prototype.mapMode=lt.TrackDel;function ru(i,e){return i==e||i.constructor==e.constructor&&i.eq(e)}let Pl=class pf{constructor(e,t,n){this.from=e,this.to=t,this.value=n}static create(e,t,n){return new pf(e,t,n)}};function Ol(i,e){return i.from-e.from||i.value.startSide-e.value.startSide}class ou{constructor(e,t,n,a){this.from=e,this.to=t,this.value=n,this.maxPoint=a}get length(){return j1(this.to)}findIndex(e,t,n,a=0){let s=n?this.to:this.from;for(let r=a,o=s.length;;){if(r==o)return r;let l=r+o>>1,u=s[l]-e||(n?this.value[l].endSide:this.value[l].startSide)-t;if(l==r)return u>=0?r:o;u>=0?o=l:r=l+1}}between(e,t,n,a){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(n,1e9,!1,s);sb||f==b&&d.startSide>0&&d.endSide<=0)continue;if(!((b-f||d.endSide-d.startSide)<0))if(u<0&&(u=f),d.point&&(m=Math.max(m,b-f)),(f-n||d.startSide-a)>=0)r.push(d),o.push(f-u),l.push(b-u),n=b,a=d.endSide;else{if(f==b)for(let x=r.length;x>0;x--){if((f-(l[x-1]+u)||d.startSide-r[x-1].endSide)>=0){r.splice(x,0,d),o.splice(x,0,f-u),l.splice(x,0,b-u);continue e}if((f-(o[x-1]+u)||d.endSide-r[x-1].startSide)>0)break}s(f,b,d)}}return{mapped:r.length?new ou(o,l,r,m):null,pos:u}}}class oe{constructor(e,t,n,a){this.chunkPos=e,this.chunk=t,this.nextLayer=n,this.maxPoint=a}static create(e,t,n,a){return new oe(e,t,n,a)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:n=!1,filterFrom:a=0,filterTo:s=this.length}=e,r=e.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(Ol)),this.isEmpty)return t.length?oe.of(t):this;let o=new ff(this,null,-1).goto(0),l=0,u=[],m=new c1;for(;o.value||l=0){let c=t[l++];m.addInner(c.from,c.to,c.value,!1)||u.push(c)}else o.rangeIndex==1&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s{s||(s=new c1),s.addRange(l,u,m,!1)};for(let l=0;l=s&&e<=s+r.length&&r.between(s,e-s,t-s,n)===!1)return}this.nextLayer.between(e,t,n)}}iter(e=0){return Ui.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Ui.from(e).goto(t)}static compare(e,t,n,a,s=-1){let r=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),l=yc(r,o,n),u=new ui(r,l,s),m=new ui(o,l,s);n.iterGaps((c,d,h)=>zc(u,c,m,d,h,a)),n.empty&&n.length==0&&zc(u,0,m,0,0,a)}static eq(e,t,n=0,a){a==null&&(a=999999999);let s=e.filter(m=>!m.isEmpty&&t.indexOf(m)<0),r=t.filter(m=>!m.isEmpty&&e.indexOf(m)<0);if(s.length!=r.length)return!1;if(!s.length)return!0;let o=yc(s,r),l=new ui(s,o,0).goto(n),u=new ui(r,o,0).goto(n);for(;;){if(l.to!=u.to||!Ml(l.active,u.active)||l.point&&(!u.point||!ru(l.point,u.point)))return!1;if(l.to>a)return!0;l.next(),u.next()}}static spans(e,t,n,a,s=-1){let r=new ui(e,null,s).goto(t),o=t,l=r.openStart;for(;;){let u=Math.min(r.to,n);if(r.point){let m=r.activeForPoint(r.to),c=r.pointFromo&&(a.span(o,u,r.active,l),l=r.openEnd(u));if(r.to>n)return l+(r.point&&r.to>n?1:0);o=r.to,r.next()}}static of(e,t=!1){let n=new c1;for(let a of e instanceof Pl?[e]:t?pG(e):e)n.add(a.from,a.to,a.value);return n.finish()}static join(e){if(!e.length)return oe.empty;let t=j1(e);for(let n=e.length-2;n>=0;n--)for(let a=e[n];a!=oe.empty;a=a.nextLayer)t=new oe(a.chunkPos,a.chunk,t,Math.max(a.maxPoint,t.maxPoint));return t}}oe.empty=new oe([],[],null,-1);function j1(i){return i[i.length-1]}function pG(i){if(i.length>1)for(let e=i[0],t=1;t0)return i.slice().sort(Ol);e=n}return i}oe.empty.nextLayer=oe.empty;class c1{finishChunk(e){this.chunks.push(new ou(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,n){this.addRange(e,t,n,!0)}addRange(e,t,n,a){this.addInner(e,t,n,a)||(this.nextLayer||(this.nextLayer=new c1)).addRange(e,t,n,a)}addInner(e,t,n,a){let s=e-this.lastTo||n.startSide-this.last.endSide;if(a&&s<=0&&(e-this.lastFrom||n.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=n,this.lastFrom=e,this.lastTo=t,this.value.push(n),n.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let n=t.value.length-1;return this.last=t.value[n],this.lastFrom=t.from[n]+e,this.lastTo=t.to[n]+e,!0}finish(){return this.finishInner(oe.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=oe.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function yc(i,e,t){let n=new Map;for(let s of i)for(let r=0;r=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=n&&a.push(new ff(r,t,n,s));return a.length==1?a[0]:new Ui(a)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let n of this.heap)n.goto(e,t);for(let n=this.heap.length>>1;n>=0;n--)lo(this.heap,n);return this.next(),this}forward(e,t){for(let n of this.heap)n.forward(e,t);for(let n=this.heap.length>>1;n>=0;n--)lo(this.heap,n);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),lo(this.heap,0)}}}function lo(i,e){for(let t=i[e];;){let n=(e<<1)+1;if(n>=i.length)break;let a=i[n];if(n+1=0&&(a=i[n+1],n++),t.compare(a)<0)break;i[n]=t,i[e]=a,e=n}}class ui{constructor(e,t,n){this.minPoint=n,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ui.from(e,t,n)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){Na(this.active,e),Na(this.activeTo,e),Na(this.activeRank,e),this.minActive=Ic(this.active,this.activeTo)}addActive(e){let t=0,{value:n,to:a,rank:s}=this.cursor;for(;t0;)t++;Fa(this.active,t,n),Fa(this.activeTo,t,a),Fa(this.activeRank,t,s),e&&Fa(e,t,this.cursor.from),this.minActive=Ic(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let n=this.openStart<0?[]:null;for(;;){let a=this.minActive;if(a>-1&&(this.activeTo[a]-this.cursor.from||this.active[a].endSide-this.cursor.startSide)<0){if(this.activeTo[a]>e){this.to=this.activeTo[a],this.endSide=this.active[a].endSide;break}this.removeActive(a),n&&Na(n,a)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let s=this.cursor.value;if(!s.point)this.addActive(n),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&n[a]=0&&!(this.activeRank[n]e||this.activeTo[n]==e&&this.active[n].endSide>=this.point.endSide)&&t.push(this.active[n]);return t.reverse()}openEnd(e){let t=0;for(let n=this.activeTo.length-1;n>=0&&this.activeTo[n]>e;n--)t++;return t}}function zc(i,e,t,n,a,s){i.goto(e),t.goto(n);let r=n+a,o=n,l=n-e,u=!!s.boundChange;for(let m=!1;;){let c=i.to+l-t.to,d=c||i.endSide-t.endSide,h=d<0?i.to+l:t.to,g=Math.min(h,r);if(i.point||t.point?(i.point&&t.point&&ru(i.point,t.point)&&Ml(i.activeForPoint(i.to),t.activeForPoint(t.to))||s.comparePoint(o,g,i.point,t.point),m=!1):(m&&(s.boundChange(o),m=!1),g>o&&!Ml(i.active,t.active)&&s.compareRange(o,g,i.active,t.active),u&&gr)break;o=h,d<=0&&i.next(),d>=0&&t.next()}}function Ml(i,e){if(i.length!=e.length)return!1;for(let t=0;t=e;n--)i[n+1]=i[n];i[e]=t}function Ic(i,e){let t=-1,n=1e9;for(let a=0;a=e)return a;if(a==i.length)break;s+=i.charCodeAt(a)==9?t-s%t:1,a=ut(i,a)}return i.length}const Zl="ͼ",kc=typeof Symbol>"u"?"__"+Zl:Symbol.for(Zl),Ll=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Sc=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};class Rn{constructor(e,t){this.rules=[];let{finish:n}=t||{};function a(r){return/^@/.test(r)?[r]:r.split(/,\s*/)}function s(r,o,l,u){let m=[],c=/^@(\w+)\b/.exec(r[0]),d=c&&c[1]=="keyframes";if(c&&o==null)return l.push(r[0]+";");for(let h in o){let g=o[h];if(/&/.test(h))s(h.split(/,\s*/).map(f=>r.map(b=>f.replace(/&/,b))).reduce((f,b)=>f.concat(b)),g,l);else if(g&&typeof g=="object"){if(!c)throw new RangeError("The value of a property ("+h+") should be a primitive value.");s(a(h),g,m,d)}else g!=null&&m.push(h.replace(/_.*/,"").replace(/[A-Z]/g,f=>"-"+f.toLowerCase())+": "+g+";")}(m.length||d)&&l.push((n&&!c&&!u?r.map(n):r).join(", ")+" {"+m.join(" ")+"}")}for(let r in e)s(a(r),e[r],this.rules)}getRules(){return this.rules.join(` -`)}static newName(){let e=Sc[kc]||1;return Sc[kc]=e+1,Zl+e.toString(36)}static mount(e,t,n){let a=e[Ll],s=n&&n.nonce;a?s&&a.setNonce(s):a=new bG(e,s),a.mount(Array.isArray(t)?t:[t],e)}}let Tc=new Map;class bG{constructor(e,t){let n=e.ownerDocument||e,a=n.defaultView;if(!e.head&&e.adoptedStyleSheets&&a.CSSStyleSheet){let s=Tc.get(n);if(s)return e[Ll]=s;this.sheet=new a.CSSStyleSheet,Tc.set(n,this)}else this.styleTag=n.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[Ll]=this}mount(e,t){let n=this.sheet,a=0,s=0,r=!1;for(let o=0;o-1&&(this.modules.splice(u,1),r=!0,s--,u=-1),u==-1){if(this.modules.splice(s++,0,l),r=!0,n)for(let m=0;m",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},xG=typeof navigator<"u"&&/Mac/.test(navigator.platform),vG=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var Ye=0;Ye<10;Ye++)Jn[48+Ye]=Jn[96+Ye]=String(Ye);for(var Ye=1;Ye<=24;Ye++)Jn[Ye+111]="F"+Ye;for(var Ye=65;Ye<=90;Ye++)Jn[Ye]=String.fromCharCode(Ye+32),Qi[Ye]=String.fromCharCode(Ye);for(var uo in Jn)Qi.hasOwnProperty(uo)||(Qi[uo]=Jn[uo]);function wG(i){var e=xG&&i.metaKey&&i.shiftKey&&!i.ctrlKey&&!i.altKey||vG&&i.shiftKey&&i.key&&i.key.length==1||i.key=="Unidentified",t=!e&&i.key||(i.shiftKey?Qi:Jn)[i.keyCode]||i.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}let dt=typeof navigator<"u"?navigator:{userAgent:"",vendor:"",platform:""},Wl=typeof document<"u"?document:{documentElement:{style:{}}};const El=/Edge\/(\d+)/.exec(dt.userAgent),bf=/MSIE \d/.test(dt.userAgent),Nl=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(dt.userAgent),Br=!!(bf||Nl||El),_c=!Br&&/gecko\/(\d+)/i.test(dt.userAgent),mo=!Br&&/Chrome\/(\d+)/.exec(dt.userAgent),Ac="webkitFontSmoothing"in Wl.documentElement.style,Fl=!Br&&/Apple Computer/.test(dt.vendor),jc=Fl&&(/Mobile\/\w+/.test(dt.userAgent)||dt.maxTouchPoints>2);var V={mac:jc||/Mac/.test(dt.platform),windows:/Win/.test(dt.platform),linux:/Linux|X11/.test(dt.platform),ie:Br,ie_version:bf?Wl.documentMode||6:Nl?+Nl[1]:El?+El[1]:0,gecko:_c,gecko_version:_c?+(/Firefox\/(\d+)/.exec(dt.userAgent)||[0,0])[1]:0,chrome:!!mo,chrome_version:mo?+mo[1]:0,ios:jc,android:/Android\b/.test(dt.userAgent),webkit:Ac,webkit_version:Ac?+(/\bAppleWebKit\/(\d+)/.exec(dt.userAgent)||[0,0])[1]:0,safari:Fl,safari_version:Fl?+(/\bVersion\/(\d+(\.\d+)?)/.exec(dt.userAgent)||[0,0])[1]:0,tabSize:Wl.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function lu(i,e){for(let t in i)t=="class"&&e.class?e.class+=" "+i.class:t=="style"&&e.style?e.style+=";"+i.style:e[t]=i[t];return e}const $s=Object.create(null);function uu(i,e,t){if(i==e)return!0;i||(i=$s),e||(e=$s);let n=Object.keys(i),a=Object.keys(e);if(n.length-0!=a.length-0)return!1;for(let s of n)if(s!=t&&(a.indexOf(s)==-1||i[s]!==e[s]))return!1;return!0}function yG(i,e){for(let t=i.attributes.length-1;t>=0;t--){let n=i.attributes[t].name;e[n]==null&&i.removeAttribute(n)}for(let t in e){let n=e[t];t=="style"?i.style.cssText=n:i.getAttribute(t)!=n&&i.setAttribute(t,n)}}function Cc(i,e,t){let n=!1;if(e)for(let a in e)t&&a in t||(n=!0,a=="style"?i.style.cssText="":i.removeAttribute(a));if(t)for(let a in t)e&&e[a]==t[a]||(n=!0,a=="style"?i.style.cssText=t[a]:i.setAttribute(a,t[a]));return n}function zG(i){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new g1(e,t,t,n,e.widget||null,!1)}static replace(e){let t=!!e.block,n,a;if(e.isBlockGap)n=-5e8,a=4e8;else{let{start:s,end:r}=xf(e,t);n=(s?t?-3e8:-1:5e8)-1,a=(r?t?2e8:1:-6e8)+1}return new g1(e,n,a,t,e.widget||null,!0)}static line(e){return new ha(e)}static set(e,t=!1){return oe.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}}fe.none=oe.empty;class da extends fe{constructor(e){let{start:t,end:n}=xf(e);super(t?-1:5e8,n?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?lu(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||$s}eq(e){return this==e||e instanceof da&&this.tagName==e.tagName&&uu(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}da.prototype.point=!1;class ha extends fe{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof ha&&this.spec.class==e.spec.class&&uu(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}ha.prototype.mapMode=lt.TrackBefore;ha.prototype.point=!0;class g1 extends fe{constructor(e,t,n,a,s,r){super(t,n,s,e),this.block=a,this.isReplace=r,this.mapMode=a?t<=0?lt.TrackBefore:lt.TrackAfter:lt.TrackDel}get type(){return this.startSide!=this.endSide?Xe.WidgetRange:this.startSide<=0?Xe.WidgetBefore:Xe.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof g1&&IG(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}g1.prototype.point=!0;function xf(i,e=!1){let{inclusiveStart:t,inclusiveEnd:n}=i;return t==null&&(t=i.inclusive),n==null&&(n=i.inclusive),{start:t??e,end:n??e}}function IG(i,e){return i==e||!!(i&&e&&i.compare(e))}function E1(i,e,t,n=0){let a=t.length-1;a>=0&&t[a]+n>=i?t[a]=Math.max(t[a],e):t.push(i,e)}class $i extends Fn{constructor(e,t,n){super(),this.tagName=e,this.attributes=t,this.rank=n}eq(e){return e==this||e instanceof $i&&this.tagName==e.tagName&&uu(this.attributes,e.attributes)}static create(e){return new $i(e.tagName,e.attributes||$s,e.rank==null?50:Math.max(0,Math.min(e.rank,100)))}static set(e,t=!1){return oe.of(e,t)}}$i.prototype.startSide=$i.prototype.endSide=-1;const qe=i=>i.nodeType==1,H1=i=>i.nodeType==3;function Yi(i){let e;return i.nodeType==11?e=i.getSelection?i:i.ownerDocument:e=i,e.getSelection()}function Rl(i,e){return e?i==e||i.contains(e.nodeType!=1?e.parentNode:e):!1}function Ci(i,e){if(!e.anchorNode)return!1;try{return Rl(i,e.anchorNode)}catch{return!1}}function ws(i){return H1(i)?Ki(i,0,i.nodeValue.length).getClientRects():qe(i)?i.getClientRects():[]}function Di(i,e,t,n){return t?Dc(i,e,t,n,-1)||Dc(i,e,t,n,1):!1}function Gn(i){for(var e=0;;e++)if(i=i.previousSibling,!i)return e}function Ys(i){return qe(i)&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(i.nodeName)}function Dc(i,e,t,n,a){for(;;){if(i==t&&e==n)return!0;if(e==(a<0?0:Sn(i))){if(i.nodeName=="DIV")return!1;let s=i.parentNode;if(!s||!qe(s))return!1;e=Gn(i)+(a<0?0:1),i=s}else if(qe(i)){if(i=i.childNodes[e+(a<0?-1:0)],qe(i)&&(i.nodeName=="IMG"||i.nodeName=="BR"||i.contentEditable=="false"))return!1;e=a<0?Sn(i):0}else return!1}}function Sn(i){return H1(i)?i.nodeValue.length:i.childNodes.length}function Ks(i,e){let{left:t,right:n}=i;if(t==n)return i;let a=e?t:n;return{left:a,right:a,top:i.top,bottom:i.bottom}}function kG(i){let e=i.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:i.innerWidth,top:0,bottom:i.innerHeight}}function vf(i,e){let t=e.width/i.offsetWidth,n=e.height/i.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-i.offsetWidth)<1)&&(t=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-i.offsetHeight)<1)&&(n=1),{scaleX:t,scaleY:n}}function SG(i,e,t,n,a,s,r,o){let l=i.ownerDocument,u=l.defaultView||window;for(let m=i,c=!1;m&&!c;)if(qe(m)){let d,h=m==l.body,g=1,f=1,b=!0,x=!0;if(h)d=kG(u);else{let z=getComputedStyle(m);if(/^(fixed|sticky)$/.test(z.position)&&(c=!0),(m.scrollHeight<=m.clientHeight||!/auto|scroll/.test(z.overflowY))&&(x=!1),(m.scrollWidth<=m.clientWidth||!/auto|scroll/.test(z.overflowX))&&(b=!1),!b&&!x){m=m.assignedSlot||m.parentNode;continue}let I=m.getBoundingClientRect();({scaleX:g,scaleY:f}=vf(m,I)),d={left:I.left,right:I.left+m.clientWidth*g,top:I.top,bottom:I.top+m.clientHeight*f}}let v=0,w=0;if(x)if(a=="nearest")e.top0&&e.bottom>d.bottom+w&&(w=e.bottom-d.bottom+r)):e.bottom>d.bottom-r&&(w=e.bottom-d.bottom+r,t<0&&e.top-w0&&e.right>d.right+v&&(v=e.right-d.right+s)):e.right>d.right-s&&(v=e.right-d.right+s,t<0&&e.leftd.bottom||e.leftd.right)&&(e={left:Math.max(e.left,d.left),right:Math.min(e.right,d.right),top:Math.max(e.top,d.top),bottom:Math.min(e.bottom,d.bottom)}),m=m.assignedSlot||m.parentNode}else if(m.nodeType==11)m=m.host;else break}function wf(i,e=!0){let t=i.ownerDocument,n=null,a=null;for(let s=i.parentNode;s&&!(s==t.body||(!e||n)&&a);)if(qe(s))!a&&s.scrollHeight>s.clientHeight&&/scroll|auto/.test(getComputedStyle(s).overflowY)&&(a=s),e&&!n&&s.scrollWidth>s.clientWidth&&/scroll|auto/.test(getComputedStyle(s).overflowX)&&(n=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:n,y:a}}class TG{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:n}=e;this.set(t,Math.min(e.anchorOffset,t?Sn(t):0),n,Math.min(e.focusOffset,n?Sn(n):0))}set(e,t,n,a){this.anchorNode=e,this.anchorOffset=t,this.focusNode=n,this.focusOffset=a}}function yf(i){let e=[];for(let t=i;t;t=t.nodeType==11?t.host:t.parentNode)qe(t)&&e.push({node:t,left:t.scrollLeft,top:t.scrollTop});return e}function zf(i,e=!0){for(let{node:t,left:n,top:a}of i)e&&t.scrollTop!=a&&(t.scrollTop=a),t.scrollLeft!=n&&(t.scrollLeft=n)}let Xn=null;V.safari&&V.safari_version>=26&&(Xn=!1);function If(i){if(i.setActive)return i.setActive();if(Xn)return i.focus(Xn);let e=yf(i);i.focus(Xn==null?{get preventScroll(){return Xn={preventScroll:!0},!0}}:void 0),Xn||(Xn=!1,zf(e))}let Bc;function Ki(i,e,t=e){let n=Bc||(Bc=document.createRange());return n.setEnd(i,t),n.setStart(i,e),n}function N1(i,e,t,n){let a={key:e,code:e,keyCode:t,which:t,cancelable:!0};n&&({altKey:a.altKey,ctrlKey:a.ctrlKey,shiftKey:a.shiftKey,metaKey:a.metaKey}=n);let s=new KeyboardEvent("keydown",a);s.synthetic=!0,i.dispatchEvent(s);let r=new KeyboardEvent("keyup",a);return r.synthetic=!0,i.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function _G(i){for(;i;){if(i&&(i.nodeType==9||i.nodeType==11&&i.host))return i;i=i.assignedSlot||i.parentNode}return null}function AG(i,e){let t=e.focusNode,n=e.focusOffset;if(!t||e.anchorNode!=t||e.anchorOffset!=n)return!1;for(n=Math.min(n,Sn(t));;)if(n){if(!qe(t))return!1;let a=t.childNodes[n-1];a.contentEditable=="false"?n--:(t=a,n=Sn(t))}else{if(t==i)return!0;n=Gn(t),t=t.parentNode}}function kf(i){return i instanceof Window?i.pageYOffset>Math.max(0,i.document.documentElement.scrollHeight-i.innerHeight-4):i.scrollTop>Math.max(1,i.scrollHeight-i.clientHeight-4)}function Sf(i,e){for(let t=i,n=e;;){if(H1(t)&&n>0)return{node:t,offset:n};if(qe(t)&&n>0){if(t.contentEditable=="false")return null;t=t.childNodes[n-1],n=Sn(t)}else if(t.parentNode&&!Ys(t))n=Gn(t),t=t.parentNode;else return null}}function Tf(i,e){for(let t=i,n=e;;){if(H1(t)&&n=t){if(o.level==n)return r;(s<0||(a!=0?a<0?o.fromt:e[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function jf(i,e){if(i.length!=e.length)return!1;for(let t=0;t=0;f-=3)if(Kt[f+1]==-h){let b=Kt[f+2],x=b&2?a:b&4?b&1?s:a:0;x&&(we[c]=we[Kt[f]]=x),o=f;break}}else{if(Kt.length==189)break;Kt[o++]=c,Kt[o++]=d,Kt[o++]=l}else if((g=we[c])==2||g==1){let f=g==a;l=f?0:1;for(let b=o-3;b>=0;b-=3){let x=Kt[b+2];if(x&2)break;if(f)Kt[b+2]|=2;else{if(x&4)break;Kt[b+2]|=4}}}}}function OG(i,e,t,n){for(let a=0,s=n;a<=t.length;a++){let r=a?t[a-1].to:i,o=al;)g==b&&(g=t[--f].from,b=f?t[f-1].to:i),we[--g]=h;l=m}else s=u,l++}}}function Gl(i,e,t,n,a,s,r){let o=n%2?2:1;if(n%2==a%2)for(let l=e,u=0;ll&&r.push(new ln(l,f.from,h));let b=f.direction==V1!=!(h%2);Hl(i,b?n+1:n,a,f.inner,f.from,f.to,r),l=f.to}g=f.to}else{if(g==t||(m?we[g]!=o:we[g]==o))break;g++}d?Gl(i,l,g,n+1,a,d,r):le;){let m=!0,c=!1;if(!u||l>s[u-1].to){let f=we[l-1];f!=o&&(m=!1,c=f==16)}let d=!m&&o==1?[]:null,h=m?n:n+1,g=l;e:for(;;)if(u&&g==s[u-1].to){if(c)break e;let f=s[--u];if(!m)for(let b=f.from,x=u;;){if(b==e)break e;if(x&&s[x-1].to==b)b=s[--x].from;else{if(we[b-1]==o)break e;break}}if(d)d.push(f);else{f.towe.length;)we[we.length]=256;let n=[],a=e==V1?0:1;return Hl(i,a,a,t,0,i.length,n),n}function Cf(i){return[new ln(0,i,0)]}let Df="";function ZG(i,e,t,n,a){var s;if(!i.length)return null;let r=n.head-i.from,o;if(n.head==i.from&&n.assoc<0){if(!a)return null;r=e[o=0].side(!1,t)}else if(n.head==i.to&&n.assoc>0){if(a)return null;r=e[o=e.length-1].side(!0,t)}else o=ln.find(e,r,(s=n.bidiLevel)!==null&&s!==void 0?s:-1,n.assoc);let l=e[o],u=l.side(a,t);if(r==u){let d=o+=a?1:-1;if(d<0||d>=e.length)return null;l=e[o=d],r=l.side(!a,t),u=l.side(a,t)}let m=ut(i.text,r,l.forward(a,t));(ml.to)&&(m=u),Df=i.text.slice(Math.min(r,m),Math.max(r,m));let c=o==(a?e.length-1:0)?null:e[o+(a?1:-1)];if(m==u){if(!c)return a?O.cursor(i.to,1):O.cursor(i.from,-1);if(c.level+(a?0:1)i.some(e=>e)}),WG=Q.define({combine:i=>i.some(e=>e)}),Ef=Q.define();class F1{constructor(e,t,n,a,s,r=!1){this.range=e,this.y=t,this.x=n,this.yMargin=a,this.xMargin=s,this.isSnapshot=r}map(e){return e.empty?this:new F1(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new F1(O.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Ra=pe.define({map:(i,e)=>i.map(e)}),Nf=pe.define();function St(i,e,t){let n=i.facet(Mf);n.length?n[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}const vn=Q.define({combine:i=>i.length?i[0]:!0});let EG=0;const P1=Q.define({combine(i){return i.filter((e,t)=>{for(let n=0;n{let l=[];return r&&l.push(Pr.of(u=>{let m=u.plugin(o);return m?r(m):fe.none})),s&&l.push(s(o)),l})}static fromClass(e,t){return Et.define((n,a)=>new e(n,a),t)}}class co{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(n){if(St(t.state,n,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){St(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(n){St(e.state,n,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Ff=Q.define(),hu=Q.define(),Pr=Q.define(),Rf=Q.define(),gu=Q.define(),ga=Q.define(),Jf=Q.define();function Pc(i,e){let t=i.state.facet(Jf);if(!t.length)return t;let n=t.map(s=>s instanceof Function?s(i):s),a=[];return oe.spans(n,e.from,e.to,{point(){},span(s,r,o,l){let u=s-e.from,m=r-e.from,c=a;for(let d=o.length-1;d>=0;d--,l--){let h=o[d].spec.bidiIsolate,g;if(l>0&&c.length&&(g=c[c.length-1]).to==u&&g.direction==h)g.to=m,c=g.inner;else{let f={from:u,to:m,direction:h,inner:[]};c.push(f),c=f.inner}}}}),Gf(e.text,a)}function Gf(i,e){for(let t of e){if(t.direction==null){for(let n=t.from,a=0;n0;t--){let a=e[t-1];if(!(a.fromA>n.toA)){if(a.toAa.push(new Zt(s,r,o,l))),this.changedRanges=a}static create(e,t,n){return new Xs(e,t,n)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}}const NG=[];class De{constructor(e,t,n=0){this.dom=e,this.length=t,this.flags=n,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return NG}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttrs;t&&yG(this.dom,t)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let n=t;for(let a of this.children){if(a==e)return n;n+=a.length+a.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t,n){return null}domPosFor(e,t){let n=Gn(this.dom),a=this.length?e>0:t>0;return new Ht(this.parent.dom,n+(a?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof Mr)return e;return null}static get(e){return e.cmTile}}class Or extends De{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,n=null,a,s=(e==null?void 0:e.node)==t?e:null,r=0;for(let o of this.children){if(o.sync(e),r+=o.length+o.breakAfter,a=n?n.nextSibling:t.firstChild,s&&a!=o.dom&&(s.written=!0),o.dom.parentNode==t)for(;a&&a!=o.dom;)a=Oc(a);else t.insertBefore(o.dom,a);n=o.dom}for(a=n?n.nextSibling:t.firstChild,s&&a&&(s.written=!0);a;)a=Oc(a);this.length=r}}function Oc(i){let e=i.nextSibling;return i.parentNode.removeChild(i),e}class Mr extends Or{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=De.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],n=this,a=0,s=0;;)if(a==n.children.length){if(!t.length)return;n=n.parent,n.breakAfter&&s++,a=t.pop()}else{let r=n.children[a++];if(r instanceof yn)t.push(a),n=r,a=0;else{let o=s+r.length,l=e(r,s);if(l!==void 0)return l;s=o+r.breakAfter}}}resolveBlock(e,t){let n,a=-1,s,r=-1;if(this.blockTiles((o,l)=>{let u=l+o.length;if(e>=l&&e<=u){if(o.isWidget()&&t>=-1&&t<=1){if(o.flags&32)return!0;o.flags&16&&(n=void 0)}(le||e==l&&(t>1?o.length:o.covers(-1)))&&(!s||!o.isWidget()&&s.isWidget())&&(s=o,r=e-l)}}),!n&&!s)throw new Error("No tile at position "+e);return n&&t<0||!s?{tile:n,offset:a}:{tile:s,offset:r}}}class yn extends Or{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,t){let n=new yn(t||document.createElement(e.tagName),e);return t||(n.flags|=4),n}}class q1 extends Or{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,n){let a=new q1(t||document.createElement("div"),e);return(!t||!n)&&(a.flags|=4),a}get domAttrs(){return this.attrs}resolveInline(e,t,n=!1){let a=null,s=-1,r=null,o=-1;function l(m,c){for(let d=0,h=0;d=c&&(g.isComposite()?l(g,c-h):(!r||n&&r.isHidden&&(t>0&&!(r.flags&32)||n&&RG(r,g)))&&(f>c||g.flags&32&&t<=1)?(r=g,o=c-h):(h=-1)&&(a=g,s=c-h)),h=f}}l(this,e);let u=(t<0?a:r)||a||r;return u?{tile:u,offset:u==a?s:o}:null}coordsIn(e,t,n){let a=this.resolveInline(e,t,!0);return a?a.tile.coordsIn(Math.max(0,a.offset),t,n):FG(this)}domIn(e,t){let n=this.resolveInline(e,t);if(n){let{tile:a,offset:s}=n;if(this.dom.contains(a.dom))return a.isText()?new Ht(a.dom,Math.min(a.dom.nodeValue.length,s)):a.domPosFor(s,a.flags&16?1:a.flags&32?-1:t);let r=n.tile.parent,o=!1;for(let l of r.children){if(o)return new Ht(l.dom,0);l==n.tile&&(o=!0)}}return new Ht(this.dom,0)}}function FG(i){let e=i.dom.lastChild;if(!e)return i.dom.getBoundingClientRect();let t=ws(e);return t[t.length-1]||null}function RG(i,e){let t=i.coordsIn(0,1),n=e.coordsIn(0,1);return t&&n&&n.topa&&(e=a);let s=e,r=e,o=0;e==0&&t<0||e==a&&t>=0?V.chrome||V.gecko||(e?(s--,o=1):r=0)?0:l.length-1];return V.safari&&!o&&u.width==0&&(u=Array.prototype.find.call(l,m=>m.width)||u),n==null?u:Ks(u,(o?o>0:t<0)==n)}static of(e,t){let n=new i1(t||document.createTextNode(e),e);return t||(n.flags|=2),n}}class p1 extends De{constructor(e,t,n,a){super(e,t,a),this.widget=n}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,n){let a=this.widget.coordsAt(this.dom,e,t);if(a)return a;if(n)return Ks(this.dom.getBoundingClientRect(),this.length?e==0:t<=0);{let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.flags&16?!0:this.flags&32?!1:e>0;for(let l=o?s.length-1:0;r=s[l],!(e>0?l==0:l==s.length-1||r.top0==n)}}class JG{constructor(e){this.index=0,this.beforeBreak=!1,this.parents=[],this.tile=e}advance(e,t,n){let{tile:a,index:s,beforeBreak:r,parents:o}=this;for(;e||t>0;)if(a.isComposite())if(r){if(!e)break;n&&n.break(),e--,r=!1}else if(s==a.children.length){if(!e&&!o.length)break;n&&n.leave(a),r=!!a.breakAfter,{tile:a,index:s}=o.pop(),s++}else{let l=a.children[s],u=l.breakAfter;(t>0?l.length<=e:l.length=0;o--){let l=t.marks[o],u=a.lastChild;if(u instanceof vt&&u.mark.eq(l.mark))u.dom!=l.dom&&u.setDOM(ho(l.dom)),a=u;else{let{dom:m}=l;this.cache.reused.get(l)&&De.get(l.dom)&&(m=ho(l.dom));let c=vt.of(l.mark,m);a.append(c),a=c}this.cache.reused.set(l,2)}let s=De.get(e.text);s&&this.cache.reused.set(s,2);let r=new i1(e.text,e.text.nodeValue);r.flags|=8,this.pos=e.range.toB,a.append(r)}addInlineWidget(e,t,n){let a=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);a||this.flushBuffer();let s=this.ensureMarks(t,n);!a&&!(e.flags&16)&&s.append(this.getBuffer(1)),s.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,n){this.flushBuffer(),this.ensureMarks(t,n).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,this.pos+=e}addLineStart(e,t){var n;e||(e=Vf);let a=q1.start(e,t||((n=this.cache.find(q1))===null||n===void 0?void 0:n.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=a)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var n;let a=this.curLine;for(let s=e.length-1;s>=0;s--){let r=e[s],o;if(t>0&&(o=a.lastChild)&&o instanceof vt&&o.mark.eq(r))a=o,t--;else{let l=vt.of(r,(n=this.cache.find(vt,u=>u.mark.eq(r)))===null||n===void 0?void 0:n.dom);a.append(l),a=l,t=0}}return a}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!Mc(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(V.ios&&Mc(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(go,0,32)||new p1(go.toDOM(),0,go,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=e.rank*102+e.value.rank,n=new GG(e.from,e.to,e.value,t),a=this.wrappers.length;for(;a>0&&(this.wrappers[a-1].rank-n.rank||this.wrappers[a-1].to-n.to)<0;)a--;this.wrappers.splice(a,0,n)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let n of this.wrappers){let a=t.lastChild;if(n.fromr.wrapper.eq(n.wrapper)))===null||e===void 0?void 0:e.dom);t.append(s),t=s}}return t}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let t=2|(e<0?16:32),n=this.cache.find(er,void 0,1);return n&&(n.flags=t),n||new er(t)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}}class VG{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:a,lineBreak:s,done:r}=this.cursor.next(this.skipCount);if(this.skipCount=0,r)throw new Error("Ran out of text content when drawing inline views");this.text=a;let o=this.textOff=Math.min(e,a.length);return s?null:a.slice(0,o)}let t=Math.min(this.text.length,this.textOff+e),n=this.text.slice(this.textOff,t);return this.textOff=t,n}}const tr=[p1,q1,i1,vt,er,yn,Mr];for(let i=0;i[]),this.index=tr.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,n=this.buckets[t];n.length<6?n.push(e):n[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,n=2){let a=e.bucket,s=this.buckets[a],r=this.index[a];for(let o=0;o{if(this.cache.add(r),r.isComposite())return!1},enter:r=>this.cache.add(r),leave:()=>{},break:()=>{}}}run(e,t){let n=t&&this.getCompositionContext(t.text);for(let a=0,s=0,r=0;;){let o=ra){let u=l-a;this.preserve(u,!r,!o),a=l,s+=u}if(!o)break;t&&o.fromA<=t.range.fromA&&o.toA>=t.range.toA?(this.forward(o.fromA,t.range.fromA,t.range.fromA{if(r.isWidget())if(this.openWidget)this.builder.continueWidget(l-o);else{let u=l>0||o{r.isLine()?this.builder.addLineStart(r.attrs,this.cache.maybeReuse(r)):(this.cache.add(r),r instanceof vt&&a.unshift(r.mark)),this.openWidget=!1},leave:r=>{r.isLine()?a.length&&(a.length=s=0):r instanceof vt&&(a.shift(),s=Math.min(s,a.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let n=null,a=this.builder,s=-1,r=oe.spans(this.decorations,e,t,{point:(o,l,u,m,c,d)=>{if(u instanceof g1){if(this.disallowBlockEffectsFor[d]){if(u.block)throw new RangeError("Block decorations may not be specified via plugins");if(l>this.view.state.doc.lineAt(o).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(s=m.length,c>m.length)a.continueWidget(l-o);else{let h=u.widget||(u.block?U1.block:U1.inline),g=QG(u),f=this.cache.findWidget(h,l-o,g)||p1.of(h,this.view,l-o,g);u.block?(u.startSide>0&&a.addLineStartIfNotCovered(n),a.addBlockWidget(f)):(a.ensureLine(n),a.addInlineWidget(f,m,c))}n=null}else n=$G(n,u);l>o&&this.text.skip(l-o)},span:(o,l,u,m)=>{for(let c=o;c-1&&(this.openWidget=r>s),this.openWidget||a.addLineStartIfNotCovered(n),this.openMarks=r}forward(e,t,n=1){t-e<=10?this.old.advance(t-e,n,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,n,this.reuseWalker))}getCompositionContext(e){let t=[],n=null;for(let a=e.parentNode;;a=a.parentNode){let s=De.get(a);if(a==this.view.contentDOM)break;s instanceof vt?t.push(s):s!=null&&s.isLine()?n=s:s instanceof yn||(a.nodeName=="DIV"&&!n?n=new q1(a,Vf):n||t.push(vt.of(new da({tagName:a.nodeName.toLowerCase(),attributes:zG(a)}),a)))}return n?{line:n,marks:t}:null}}function Mc(i,e){let t=n=>{for(let a of n.children)if((e?a.isText():a.length)||t(a))return!0;return!1};return t(i)}function QG(i){let e=i.isReplace?(i.startSide<0?64:0)|(i.endSide>0?128:0):i.startSide>0?32:16;return i.block&&(e|=256),e}const Vf={class:"cm-line"};function $G(i,e){let t=e.spec.attributes,n=e.spec.class;return!t&&!n||(i||(i={class:"cm-line"}),t&&lu(t,i),n&&(i.class+=" "+n)),i}function YG(i){let e=[];for(let t=i.parents.length;t>1;t--){let n=t==i.parents.length?i.tile:i.parents[t].tile;n instanceof vt&&e.push(n.mark)}return e}function ho(i){let e=De.get(i);return e&&e.setDOM(i.cloneNode()),i}class U1 extends X1{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}U1.inline=new U1("span");U1.block=new U1("div");const go=new class extends X1{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}};class Zc{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=fe.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new Mr(e,e.contentDOM),this.updateInner([new Zt(0,0,0,e.state.doc.length)],null)}update(e){var t;let n=e.changedRanges;this.minWidth>0&&n.length&&(n.every(({fromA:m,toA:c})=>cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let a=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?a=this.domChanged.newSel.head:!rH(e.changes,this.hasComposition)&&!e.selectionSet&&(a=e.state.selection.main.head));let s=a>-1?XG(this.view,e.changes,a):null;if(this.domChanged=null,this.hasComposition){let{from:m,to:c}=this.hasComposition;n=new Zt(m,c,e.changes.mapPos(m,-1),e.changes.mapPos(c,1)).addToSet(n.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(V.ie||V.chrome)&&!s&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=this.decorations,o=this.blockWrappers;this.updateDeco();let l=nH(r,this.decorations,e.changes);l.length&&(n=Zt.extendWithRanges(n,l));let u=aH(o,this.blockWrappers,e.changes);return u.length&&(n=Zt.extendWithRanges(n,u)),s&&!n.some(m=>m.fromA<=s.range.fromA&&m.toA>=s.range.toA)&&(n=s.range.addToSet(n.slice())),this.tile.flags&2&&n.length==0?!1:(this.updateInner(n,s),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:n}=this.view;n.ignore(()=>{if(t||e.length){let r=this.tile,o=new UG(this.view,r,this.blockWrappers,this.decorations,this.dynamicDecorationMap);t&&De.get(t.text)&&o.cache.reused.set(De.get(t.text),2),this.tile=o.run(e,t),ql(r,o.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let s=V.chrome||V.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(s),s&&(s.written||n.selectionRange.focusNode!=s.node||!this.tile.dom.contains(s.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let a=[];if(this.view.viewport.from||this.view.viewport.to-1)&&Ci(n,this.view.observer.selectionRange)&&!(a&&n.contains(a));if(!(s||t||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,u,m;if(l.empty?m=u=this.inlineDOMNearPos(l.anchor,l.assoc||1):(m=this.inlineDOMNearPos(l.head,l.head==l.from?1:-1),u=this.inlineDOMNearPos(l.anchor,l.anchor==l.from?1:-1)),V.gecko&&l.empty&&!this.hasComposition&&KG(u)){let d=document.createTextNode("");this.view.observer.ignore(()=>u.node.insertBefore(d,u.node.childNodes[u.offset]||null)),u=m=new Ht(d,0),o=!0}let c=this.view.observer.selectionRange;(o||!c.focusNode||(!Di(u.node,u.offset,c.anchorNode,c.anchorOffset)||!Di(m.node,m.offset,c.focusNode,c.focusOffset))&&!this.suppressWidgetCursorChange(c,l))&&(this.view.observer.ignore(()=>{V.android&&V.chrome&&n.contains(c.focusNode)&&sH(c.focusNode,n)&&(n.blur(),n.focus({preventScroll:!0}));let d=Yi(this.view.root);if(d)if(l.empty){if(V.gecko){let h=eH(u.node,u.offset);if(h&&h!=3){let g=(h==1?Sf:Tf)(u.node,u.offset);g&&(u=new Ht(g.node,g.offset))}}d.collapse(u.node,u.offset),l.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=l.bidiLevel)}else if(d.extend){d.collapse(u.node,u.offset);try{d.extend(m.node,m.offset)}catch{}}else{let h=document.createRange();l.anchor>l.head&&([u,m]=[m,u]),h.setEnd(m.node,m.offset),h.setStart(u.node,u.offset),d.removeAllRanges(),d.addRange(h)}r&&this.view.root.activeElement==n&&(n.blur(),a&&a.focus())}),this.view.observer.setSelectionRange(u,m)),this.impreciseAnchor=u.precise?null:new Ht(c.anchorNode,c.anchorOffset),this.impreciseHead=m.precise?null:new Ht(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&Di(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,n=Yi(e.root),{anchorNode:a,anchorOffset:s}=e.observer.selectionRange;if(!n||!t.empty||!t.assoc||!n.modify)return;let r=this.lineAt(t.head,t.assoc);if(!r)return;let o=r.posAtStart;if(t.head==o||t.head==o+r.length)return;let l=this.coordsAt(t.head,-1),u=this.coordsAt(t.head,1);if(!l||!u||l.bottom>u.top)return;let m=this.domAtPos(t.head+t.assoc,t.assoc);n.collapse(m.node,m.offset),n.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let c=e.observer.selectionRange;e.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=t.from&&n.collapse(a,s)}posFromDOM(e,t){let n=this.tile.nearest(e);if(!n)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let a=n.posAtStart;if(n.isComposite()){let s;if(e==n.dom)s=n.dom.childNodes[t];else{let r=Sn(e)==0?0:t==0?-1:1;for(;;){let o=e.parentNode;if(o==n.dom)break;r==0&&o.firstChild!=o.lastChild&&(e==o.firstChild?r=-1:r=1),e=o}r<0?s=e:s=e.nextSibling}if(s==n.dom.firstChild)return a;for(;s&&!De.get(s);)s=s.nextSibling;if(!s)return a+n.length;for(let r=0,o=a;;r++){let l=n.children[r];if(l.dom==s)return o;o+=l.length+l.breakAfter}}else return n.isText()?e==n.dom?a+t:a+(t?n.length:0):a}domAtPos(e,t){let{tile:n,offset:a}=this.tile.resolveBlock(e,t);return n.isWidget()?n.domPosFor(a,t):n.domIn(a,t)}inlineDOMNearPos(e,t){let n,a=-1,s=!1,r,o=-1,l=!1;return this.tile.blockTiles((u,m)=>{if(u.isWidget()){if(u.flags&32&&m>=e)return!0;u.flags&16&&(s=!0)}else{let c=m+u.length;if(m<=e&&(n=u,a=e-m,s=c=e&&!r&&(r=u,o=e-m,l=m>e),m>e&&r)return!0}}),!n&&!r?this.domAtPos(e,t):(s&&r?n=null:l&&n&&(r=null),n&&t<0||!r?n.domIn(a,t):r.domIn(o,t))}coordsAt(e,t,n){let{tile:a,offset:s}=this.tile.resolveBlock(e,t);return a.isWidget()?a.widget instanceof po?null:a.coordsInWidget(s,t,!0):a.coordsIn(s,t,n)}lineAt(e,t){let{tile:n}=this.tile.resolveBlock(e,t);return n.isLine()?n:null}coordsForChar(e){let{tile:t,offset:n}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;function a(s,r){if(s.isComposite())for(let o of s.children){if(o.length>=r){let l=a(o,r);if(l)return l}if(r-=o.length,r<0)break}else if(s.isText()&&rMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,l=this.view.textDirection==ze.LTR,u=0,m=(c,d,h)=>{for(let g=0;ga);g++){let f=c.children[g],b=d+f.length,x=f.dom.getBoundingClientRect(),{height:v}=x;if(h&&!g&&(u+=x.top-h.top),f instanceof yn)b>n&&m(f,d,x);else if(d>=n&&(u>0&&t.push(-u),t.push(v+u),u=0,r)){let w=f.dom.lastChild,z=w?ws(w):[];if(z.length){let I=z[z.length-1],T=l?I.right-x.left:x.right-I.left;T>o&&(o=T,this.minWidth=s,this.minWidthFrom=d,this.minWidthTo=b)}}h&&g==c.children.length-1&&(u+=h.bottom-x.bottom),d=b+f.breakAfter}};return m(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getComputedStyle(t.dom).direction=="rtl"?ze.RTL:ze.LTR}measureTextSize(){let e=this.tile.blockTiles(r=>{if(r.isLine()&&r.children.length&&r.length<=20){let o=0,l;for(let u of r.children){if(!u.isText()||/[^ -~]/.test(u.text))return;let m=ws(u.dom);if(m.length!=1)return;o+=m[0].width,l=m[0].height}if(o)return{lineHeight:r.dom.getBoundingClientRect().height,charWidth:o/r.length,textHeight:l}}});if(e)return e;let t=document.createElement("div"),n,a,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(t);let r=ws(t.firstChild)[0];n=t.getBoundingClientRect().height,a=r&&r.width?r.width/27:7,s=r&&r.height?r.height:n,t.remove()}),{lineHeight:n,charWidth:a,textHeight:s}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let n=0,a=0;;a++){let s=a==t.viewports.length?null:t.viewports[a],r=s?s.from-1:this.view.state.doc.length;if(r>n){let o=(t.lineBlockAt(r).bottom-t.lineBlockAt(n).top)/this.view.scaleY;e.push(fe.replace({widget:new po(o),block:!0,inclusive:!0,isBlockGap:!0}).range(n,r))}if(!s)break;n=s.to+1}return fe.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Pr).map(s=>(this.dynamicDecorationMap[e++]=typeof s=="function")?s(this.view):s),n=!1,a=this.view.state.facet(gu).map((s,r)=>{let o=typeof s=="function";return o&&(n=!0),o?s(this.view):s});for(a.length&&(this.dynamicDecorationMap[e++]=n,t.push(oe.join(a))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof s=="function"?s(this.view):s)}scrollIntoView(e){if(e.isSnapshot){let u=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=u.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let u of this.view.state.facet(Ef))try{if(u(this.view,e.range,e))return!0}catch(m){St(this.view.state,m,"scroll handler")}let{range:t}=e,n=this.coordsAt(t.head,t.assoc||(t.head>t.anchor?-1:1)),a;if(!n)return;!t.empty&&(a=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(n={left:Math.min(n.left,a.left),top:Math.min(n.top,a.top),right:Math.max(n.right,a.right),bottom:Math.max(n.bottom,a.bottom)});let s=pu(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:l}=this.view.scrollDOM;if(SG(this.view.scrollDOM,r,t.head1&&(n.top>window.visualViewport.offsetTop+window.visualViewport.height||n.bottomn.isWidget()||n.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){ql(this.tile)}}function ql(i,e){let t=e==null?void 0:e.get(i);if(t!=1){t==null&&i.destroy();for(let n of i.children)ql(n,e)}}function KG(i){return qe(i.node)&&i.node.firstChild&&(i.offset==0||i.node.childNodes[i.offset-1].contentEditable=="false")&&(i.offset==i.node.childNodes.length||i.node.childNodes[i.offset].contentEditable=="false")}function qf(i,e){let t=i.observer.selectionRange;if(!t.focusNode)return null;let n=Sf(t.focusNode,t.focusOffset),a=Tf(t.focusNode,t.focusOffset),s=n||a;if(a&&n&&a.node!=n.node){let o=De.get(a.node);if(!o||o.isText()&&o.text!=a.node.nodeValue)s=a;else if(i.docView.lastCompositionAfterCursor){let l=De.get(n.node);!l||l.isText()&&l.text!=n.node.nodeValue||(s=a)}}if(i.docView.lastCompositionAfterCursor=s!=n,!s)return null;let r=e-s.offset;return{from:r,to:r+s.node.nodeValue.length,node:s.node}}function XG(i,e,t){let n=qf(i,t);if(!n)return null;let{node:a,from:s,to:r}=n,o=a.nodeValue;if(/[\n\r]/.test(o)||i.state.doc.sliceString(n.from,n.to)!=o)return null;let l=e.invertedDesc;return{range:new Zt(l.mapPos(s),l.mapPos(r),s,r),text:a}}function eH(i,e){return qe(i)?(e&&i.childNodes[e-1].contentEditable=="false"?1:0)|(e{ne.from&&(t=!0)}),t}class po extends X1{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}function oH(i,e,t=1){let n=i.charCategorizer(e),a=i.doc.lineAt(e),s=e-a.from;if(a.length==0)return O.cursor(e);s==0?t=1:s==a.length&&(t=-1);let r=s,o=s;t<0?r=ut(a.text,s,!1):o=ut(a.text,s);let l=n(a.text.slice(r,o));for(;r>0;){let u=ut(a.text,r,!1);if(n(a.text.slice(u,r))!=l)break;r=u}for(;oi.defaultLineHeight*1.5){let o=i.viewState.heightOracle.textHeight,l=Math.floor((a-t.top-(i.defaultLineHeight-o)*.5)/o);s+=l*i.viewState.heightOracle.lineLength}let r=i.state.sliceDoc(t.from,t.to);return t.from+fG(r,s,i.state.tabSize)}function Ul(i,e,t){let n=i.lineBlockAt(e);if(Array.isArray(n.type)){let a;for(let s of n.type){if(s.from>e)break;if(!(s.toe)return s;(!a||s.type==Xe.Text&&(a.type!=s.type||(t<0?s.frome)))&&(a=s)}}return a||n}return n}function uH(i,e,t,n){let a=Ul(i,e.head,e.assoc||-1),s=!n||a.type!=Xe.Text||!(i.lineWrapping||a.widgetLineBreaks)?null:i.coordsAtPos(e.assoc<0&&e.head>a.from?e.head-1:e.head);if(s){let r=i.dom.getBoundingClientRect(),o=i.textDirectionAt(a.from),l=i.posAndSideAtCoords({x:t==(o==ze.LTR)?r.right-1:r.left+1,y:(s.top+s.bottom)/2});if(l)return O.cursor(l.pos,l.assoc)}return O.cursor(t?a.to:a.from,t?1:-1)}function Lc(i,e,t,n){let a=i.state.doc.lineAt(e.head),s=i.bidiSpans(a),r=i.textDirectionAt(a.from);for(let o=e,l=null;;){let u=ZG(a,s,r,o,t),m=Df;if(!u){if(a.number==(t?i.state.doc.lines:1))return o;m=` -`,a=i.state.doc.line(a.number+(t?1:-1)),s=i.bidiSpans(a),u=t?O.cursor(a.from,-1):O.cursor(a.to,1)}if(l){if(!l(m))return o}else{if(!n)return u;l=n(m)}o=u}}function mH(i,e,t){let n=i.state.charCategorizer(e),a=n(t);return s=>{let r=n(s);return a==Mt.Space&&(a=r),a==r}}function cH(i,e,t,n){let a=e.head,s=t?1:-1;if(a==(t?i.state.doc.length:0))return O.cursor(a,e.assoc);let r=e.goalColumn,o,l=i.contentDOM.getBoundingClientRect(),u=i.coordsAtPos(a,e.assoc||((e.empty?t:e.head==e.from)?1:-1)),m=i.documentTop;if(u)r==null&&(r=u.left-l.left),o=s<0?u.top:u.bottom;else{let g=i.viewState.lineBlockAt(a);r==null&&(r=Math.min(l.right-l.left,i.defaultCharacterWidth*(a-g.from))),o=(s<0?g.top:g.bottom)+m}let c=l.left+r,d=i.viewState.heightOracle.textHeight>>1,h=n??d;for(let g=0;;g+=d){let f=o+(h+g)*s,b=Ql(i,{x:c,y:f},!1,s);if(t?f>l.bottom:fo:v{if(e>s&&ea(i)),t.from,e.head>t.from?-1:1);return n==t.from?t:O.cursor(n,ni.viewState.docHeight)return new on(i.state.doc.length,-1);if(u=i.elementAtHeight(l),n==null)break;if(u.type==Xe.Text){if(n<0?u.toi.viewport.to)break;let d=i.docView.coordsAt(n<0?u.from:u.to,n>0?-1:1);if(d&&(n<0?d.top<=l+s:d.bottom>=l+s))break}let c=i.viewState.heightOracle.textHeight/2;l=n>0?u.bottom+c:u.top-c}if(i.viewport.from>=u.to||i.viewport.to<=u.from){if(t)return null;if(u.type==Xe.Text){let c=lH(i,a,u,r,o);return new on(c,c==u.from?1:-1)}}if(u.type!=Xe.Text)return l<(u.top+u.bottom)/2?new on(u.from,1):new on(u.to,-1);let m=i.docView.lineAt(u.from,2);return(!m||m.length!=u.length)&&(m=i.docView.lineAt(u.from,-2)),new dH(i,r,o,i.textDirectionAt(u.from)).scanTile(m,u.from)}class dH{constructor(e,t,n,a){this.view=e,this.x=t,this.y=n,this.baseDir=a,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||n.length&&(n[0].level!=this.baseDir||n[0].to+a.from>1;t:if(r.has(f)){for(let v=1;v=s&&(w-=g),!r.has(w)){f=w;break t}}break e}r.add(f);let b=t(f),x=0;if(b)for(let v=0;v1))if(w.bottomthis.y)(!u||u.top>w.top)&&(u=w),x=-1;else{let z=w.left>this.x?this.x-w.left:w.right(g+g+f)/3)return this.y=l.bottom-1,this.scan(e,t,!0);if(u&&u.top<(g+f+f)/3)return this.y=u.top+1,this.scan(e,t,!0)}let h=(o?this.dirAt(e[m],1):this.baseDir)==ze.LTR;return{i:m,after:this.x>(d.left+d.right)/2==h}}scanText(e,t){let n=[];for(let s=0;s{let r=n[s]-t,o=n[s+1]-t;return Ki(e.dom,r,o).getClientRects()});return a.after?new on(n[a.i+1],-1):new on(n[a.i],1)}scanTile(e,t){if(!e.length)return new on(t,1);if(e.children.length==1){let o=e.children[0];if(o.isText())return this.scanText(o,t);if(o.isComposite())return this.scanTile(o,t)}let n=[t];for(let o=0,l=t;o{let l=e.children[o];return l.flags&48?null:(qe(l.dom)?l.dom:Ki(l.dom,0,l.length)).getClientRects()}),s=e.children[a.i],r=n[a.i];return s.isText()?this.scanText(s,r):s.isComposite()?this.scanTile(s,r):a.after?new on(n[a.i+1],-1):new on(r,1)}}const C1="￿";class hH{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(ce.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=C1}readRange(e,t){if(!e)return this;let n=e.parentNode;for(let a=e;;){this.findPointBefore(n,a);let s=this.text.length;this.readNode(a);let r=De.get(a),o=a.nextSibling;if(o==t){r!=null&&r.breakAfter&&!o&&n!=this.view.contentDOM&&this.lineBreak();break}let l=De.get(o);(r&&l?r.breakAfter:(r?r.breakAfter:Ys(a))||Ys(o)&&(a.nodeName!="BR"||r!=null&&r.isWidget())&&this.text.length>s)&&!pH(o,t)&&this.lineBreak(),a=o}return this.findPointBefore(n,t),this}readTextNode(e){let t=e.nodeValue;for(let n of this.points)n.node==e&&(n.pos=this.text.length+Math.min(n.offset,t.length));for(let n=0,a=this.lineSeparator?null:/\r\n?|\n/g;;){let s=-1,r=1,o;if(this.lineSeparator?(s=t.indexOf(this.lineSeparator,n),r=this.lineSeparator.length):(o=a.exec(t))&&(s=o.index,r=o[0].length),this.append(t.slice(n,s<0?t.length:s)),s<0)break;if(this.lineBreak(),r>1)for(let l of this.points)l.node==e&&l.pos>this.text.length&&(l.pos-=r-1);n=s+r}}readNode(e){let t=De.get(e),n=t&&t.overrideDOMText;if(n!=null){this.findPointInside(e,n.length);for(let a=n.iter();!a.next().done;)a.lineBreak?this.lineBreak():this.append(a.value)}else H1(e)?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():qe(e)&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let n of this.points)n.node==e&&e.childNodes[n.offset]==t&&(n.pos=this.text.length)}findPointInside(e,t){for(let n of this.points)(H1(e)?n.node==e:e.contains(n.node))&&(n.pos=this.text.length+(gH(e,n.node,n.offset)?t:0))}}function gH(i,e,t){for(;;){if(!e||t-1;let{impreciseHead:s,impreciseAnchor:r}=e.docView,o=e.state.selection;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=Qf(e.docView.tile,t,n,0))){let l=s||r?[]:xH(e),u=new hH(l,e);u.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=u.text,this.newSel=vH(l,this.bounds.from)}else{let l=e.observer.selectionRange,u=s&&s.node==l.focusNode&&s.offset==l.focusOffset||!Rl(e.contentDOM,l.focusNode)?o.main.head:e.docView.posFromDOM(l.focusNode,l.focusOffset),m=r&&r.node==l.anchorNode&&r.offset==l.anchorOffset||!Rl(e.contentDOM,l.anchorNode)?o.main.anchor:e.docView.posFromDOM(l.anchorNode,l.anchorOffset),c=e.viewport;if((V.ios||V.chrome)&&u!=m&&Math.min(u,m)<=o.main.from&&Math.max(u,m)>=o.main.to&&(c.from>0||c.to-1&&o.ranges.length>1)this.newSel=o.replaceRange(O.range(m,u));else if(e.lineWrapping&&m==u&&!(o.main.empty&&o.main.head==u)&&e.inputState.lastTouchTime>Date.now()-100){let d=e.coordsAtPos(u,-1),h=0;d&&(h=e.inputState.lastTouchY<=d.bottom?-1:1),this.newSel=O.create([O.cursor(u,h)])}else this.newSel=O.single(m,u)}}}function Qf(i,e,t,n){if(i.isComposite()){let a=-1,s=-1,r=-1,o=-1;for(let l=0,u=n,m=n;lt)return Qf(c,e,t,u);if(d>=e&&a==-1&&(a=l,s=u),u>t&&c.dom.parentNode==i.dom){r=l,o=m;break}m=d,u=d+c.breakAfter}return{from:s,to:o<0?n+i.length:o,startDOM:(a?i.children[a-1].dom.nextSibling:null)||i.dom.firstChild,endDOM:r=0?i.children[r].dom:null}}else return i.isText()?{from:n,to:n+i.length,startDOM:i.dom,endDOM:i.dom.nextSibling}:null}function $f(i,e){let t,{newSel:n}=e,{state:a}=i,s=a.selection.main,r=i.inputState.lastKeyTime>Date.now()-100?i.inputState.lastKeyCode:-1;if(e.bounds){let{from:o,to:l}=e.bounds,u=s.from,m=null;(r===8||V.android&&e.text.length=o&&s.to<=l&&(e.typeOver||c!=e.text)&&c.slice(0,s.from-o)==e.text.slice(0,s.from-o)&&c.slice(s.to-o)==e.text.slice(d=e.text.length-(c.length-(s.to-o)))?t={from:s.from,to:s.to,insert:he.of(e.text.slice(s.from-o,d).split(C1))}:(h=Yf(c,e.text,u-o,m))&&(V.chrome&&r==13&&h.toB==h.from+2&&e.text.slice(h.from,h.toB)==C1+C1&&h.toB--,t={from:o+h.from,to:o+h.toA,insert:he.of(e.text.slice(h.from,h.toB).split(C1))})}else n&&(!i.hasFocus&&a.facet(vn)||$l(n,s))&&(n=null);if(!t&&!n)return!1;if((V.mac||V.android)&&t&&t.from==t.to&&t.from==s.head-1&&/^\. ?$/.test(t.insert.toString())&&i.contentDOM.getAttribute("autocorrect")=="off"?(n&&t.insert.length==2&&(n=O.single(n.main.anchor-1,n.main.head-1)),t={from:t.from,to:t.to,insert:he.of([t.insert.toString().replace("."," ")])}):a.doc.lineAt(s.from).toDate.now()-50?t={from:s.from,to:s.to,insert:a.toText(i.inputState.insertingText)}:V.chrome&&t&&t.from==t.to&&t.from==s.head&&t.insert.toString()==` - `&&i.lineWrapping&&(n&&(n=O.single(n.main.anchor-1,n.main.head-1)),t={from:s.from,to:s.to,insert:he.of([" "])}),t)return fu(i,t,n,r);if(n&&!$l(n,s)){let o=!1,l="select";return i.inputState.lastSelectionTime>Date.now()-50&&(i.inputState.lastSelectionOrigin=="select"&&(o=!0),l=i.inputState.lastSelectionOrigin,l=="select.pointer"&&(n=Uf(a.facet(ga).map(u=>u(i)),n))),i.dispatch({selection:n,scrollIntoView:o,userEvent:l}),!0}else return!1}function fu(i,e,t,n=-1){if(V.ios&&i.inputState.flushIOSKey(e))return!0;let a=i.state.selection.main;if(V.android&&(e.to==a.to&&(e.from==a.from||e.from==a.from-1&&i.state.sliceDoc(e.from,a.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&N1(i.contentDOM,"Enter",13)||(e.from==a.from-1&&e.to==a.to&&e.insert.length==0||n==8&&e.insert.lengtha.head)&&N1(i.contentDOM,"Backspace",8)||e.from==a.from&&e.to==a.to+1&&e.insert.length==0&&N1(i.contentDOM,"Delete",46)))return!0;let s=e.insert.toString();i.inputState.composing>=0&&i.inputState.composing++;let r,o=()=>r||(r=bH(i,e,t));return i.state.facet(Zf).some(l=>l(i,e.from,e.to,s,o))||i.dispatch(o()),!0}function bH(i,e,t){let n,a=i.state,s=a.selection.main,r=-1;if(e.from==e.to&&e.froms.to){let l=e.fromc(i)),u,l);e.from==m&&(r=m)}if(r>-1)n={changes:e,selection:O.cursor(e.from+e.insert.length,-1)};else if(e.from>=s.from&&e.to<=s.to&&e.to-e.from>=(s.to-s.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&i.inputState.composing<0){let l=s.frome.to?a.sliceDoc(e.to,s.to):"";n=a.replaceSelection(i.state.toText(l+e.insert.sliceString(0,void 0,i.state.lineBreak)+u))}else{let l=a.changes(e),u=t&&t.main.to<=l.newLength?t.main:void 0;if(a.selection.ranges.length>1&&(i.inputState.composing>=0||i.inputState.compositionPendingChange)&&e.to<=s.to+10&&e.to>=s.to-10){let m=i.state.sliceDoc(e.from,e.to),c,d=t&&qf(i,t.main.head);if(d){let g=e.insert.length-(e.to-e.from);c={from:d.from,to:d.to-g}}else c=i.state.doc.lineAt(s.head);let h=s.to-e.to;n=a.changeByRange(g=>{if(g.from==s.from&&g.to==s.to)return{changes:l,range:u||g.map(l)};let f=g.to-h,b=f-m.length;if(i.state.sliceDoc(b,f)!=m||f>=c.from&&b<=c.to)return{range:g};let x=a.changes({from:b,to:f,insert:e.insert}),v=g.to-s.to;return{changes:x,range:u?O.range(Math.max(0,u.anchor+v),Math.max(0,u.head+v)):g.map(x)}})}else n={changes:l,selection:u&&a.selection.replaceRange(u)}}let o="input.type";return(i.composing||i.inputState.compositionPendingChange&&i.inputState.compositionEndedAt>Date.now()-50)&&(i.inputState.compositionPendingChange=!1,o+=".compose",i.inputState.compositionFirstChange&&(o+=".start",i.inputState.compositionFirstChange=!1)),a.update(n,{userEvent:o,scrollIntoView:!0})}function Yf(i,e,t,n){let a=Math.min(i.length,e.length),s=0;for(;s0&&o>0&&i.charCodeAt(r-1)==e.charCodeAt(o-1);)r--,o--;if(n=="end"){let l=Math.max(0,s-Math.min(r,o));t-=r+l-s}if(r=r?s-t:0;s-=l,o=s+(o-r),r=s}else if(o=o?s-t:0;s-=l,r=s+(r-o),o=s}return{from:s,toA:r,toB:o}}function xH(i){let e=[];if(i.root.activeElement!=i.contentDOM)return e;let{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}=i.observer.selectionRange;return t&&(e.push(new Wc(t,n)),(a!=t||s!=n)&&e.push(new Wc(a,s))),e}function vH(i,e){if(i.length==0)return null;let t=i[0].pos,n=i.length==2?i[1].pos:t;return t<0||n<0?null:t==n?O.create([O.cursor(n+e,-1)]):O.single(t+e,n+e)}function $l(i,e){return e.head==i.main.head&&e.anchor==i.main.anchor}class wH{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.touchActive=!1,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.lastIOSMomentumScroll=0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,V.safari&&e.contentDOM.addEventListener("input",()=>null),V.gecko&&ZH(e.contentDOM.ownerDocument)}handleEvent(e){!jH(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let n=this.handlers[e];if(n){for(let a of n.observers)a(this.view,t);for(let a of n.handlers){if(t.defaultPrevented)break;if(a(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=zH(e),n=this.handlers,a=this.view.contentDOM;for(let s in t)if(s!="scroll"){let r=!t[s].handlers.length,o=n[s];o&&r!=!o.handlers.length&&(a.removeEventListener(s,this.handleEvent),o=null),o||a.addEventListener(s,this.handleEvent,{passive:r})}for(let s in n)s!="scroll"&&!t[s]&&a.removeEventListener(s,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&Xf.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),V.android&&V.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;if(V.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&(Kf.some(t=>t.keyCode==e.keyCode)&&!e.ctrlKey||IH.indexOf(e.key)>-1&&e.ctrlKey)){let t={ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey,shiftKey:e.shiftKey};t.shiftKey&&V.ios&&!/^(off|none)$/.test(this.view.contentDOM.autocapitalize)&&yH(this.view.win)&&(t.shiftKey=!1);let n=this.pendingIOSKey={key:e.key,keyCode:e.keyCode,mods:t};return setTimeout(()=>{this.pendingIOSKey==n&&this.flushIOSKey()},50),!0}return e.keyCode!=229&&this.view.observer.forceFlush(),!1}flushIOSKey(e){let t=this.pendingIOSKey;return!t||this.view.observer.pendingRecords().length||t.key=="Enter"&&e&&e.from0?!0:V.safari&&!V.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function yH(i){return i.visualViewport?i.visualViewport.height*i.visualViewport.scale/i.document.documentElement.clientHeight<.85:!1}function Ec(i,e){return(t,n)=>{try{return e.call(i,n,t)}catch(a){St(t.state,a)}}}function zH(i){let e=Object.create(null);function t(n){return e[n]||(e[n]={observers:[],handlers:[]})}for(let n of i){let a=n.spec,s=a&&a.plugin.domEventHandlers,r=a&&a.plugin.domEventObservers;if(s)for(let o in s){let l=s[o];l&&t(o).handlers.push(Ec(n.value,l))}if(r)for(let o in r){let l=r[o];l&&t(o).observers.push(Ec(n.value,l))}}for(let n in qt)t(n).handlers.push(qt[n]);for(let n in gt)t(n).observers.push(gt[n]);return e}const Kf=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],IH="dthko",Xf=[16,17,18,20,91,92,224,225],Ja=6;function Ga(i){return Math.max(0,i)*.7+8}function kH(i,e){return Math.max(Math.abs(i.clientX-e.clientX),Math.abs(i.clientY-e.clientY))}class SH{constructor(e,t,n,a){this.view=e,this.startEvent=t,this.style=n,this.mustSelect=a,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=wf(e.contentDOM),this.atoms=e.state.facet(ga).map(r=>r(e));let s=e.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(ce.allowMultipleSelections)&&TH(e,t),this.dragging=AH(e,t)&&n2(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&kH(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,n=0,a=0,s=0,r=this.view.win.innerWidth,o=this.view.win.innerHeight;this.scrollParents.x&&({left:a,right:r}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:s,bottom:o}=this.scrollParents.y.getBoundingClientRect());let l=pu(this.view);e.clientX-l.left<=a+Ja?t=-Ga(a-e.clientX):e.clientX+l.right>=r-Ja&&(t=Ga(e.clientX-r)),e.clientY-l.top<=s+Ja?n=-Ga(s-e.clientY):e.clientY+l.bottom>=o-Ja&&(n=Ga(e.clientY-o)),this.setScrollSpeed(t,n)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:t}=this,n=Uf(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!n.eq(t.state.selection,this.dragging===!1))&&this.view.dispatch({selection:n,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}}function TH(i,e){let t=i.state.facet(Bf);return t.length?t[0](e):V.mac?e.metaKey:e.ctrlKey}function _H(i,e){let t=i.state.facet(Pf);return t.length?t[0](e):V.mac?!e.altKey:!e.ctrlKey}function AH(i,e){let{main:t}=i.state.selection;if(t.empty)return!1;let n=Yi(i.root);if(!n||n.rangeCount==0)return!0;let a=n.getRangeAt(0).getClientRects();for(let s=0;s=e.clientX&&r.top<=e.clientY&&r.bottom>=e.clientY)return!0}return!1}function jH(i,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,n;t!=i.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(n=De.get(t))&&n.isWidget()&&!n.isHidden&&n.widget.ignoreEvent(e))return!1;return!0}const qt=Object.create(null),gt=Object.create(null),e2=V.ie&&V.ie_version<15||V.ios&&V.webkit_version<604;function CH(i){let e=i.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{i.focus(),t.remove(),t2(i,t.value)},50)}function Zr(i,e,t){for(let n of i.facet(e))t=n(t,i);return t}function t2(i,e){e=Zr(i.state,cu,e);let{state:t}=i,n,a=1,s=t.toText(e),r=s.lines==t.selection.ranges.length;if(Yl!=null&&t.selection.ranges.every(l=>l.empty)&&Yl==s.toString()){let l=-1;n=t.changeByRange(u=>{let m=t.doc.lineAt(u.from);if(m.from==l)return{range:u};l=m.from;let c=t.toText((r?s.line(a++).text:e)+t.lineBreak);return{changes:{from:m.from,insert:c},range:O.cursor(u.from+c.length,-1)}})}else r?n=t.changeByRange(l=>{let u=s.line(a++);return{changes:{from:l.from,to:l.to,insert:u.text},range:O.cursor(l.from+u.length,-1)}}):n=t.replaceSelection(s);i.dispatch(n,{userEvent:"input.paste",scrollIntoView:!0})}gt.scroll=i=>{let e=i.inputState;e.lastScrollTop=i.scrollDOM.scrollTop,e.lastScrollLeft=i.scrollDOM.scrollLeft,V.ios&&!e.touchActive&&(e.lastIOSMomentumScroll=Date.now())};gt.wheel=gt.mousewheel=i=>{i.inputState.lastWheelEvent=Date.now()};qt.keydown=(i,e)=>(i.inputState.setSelectionOrigin("select"),e.keyCode==27&&i.inputState.tabFocusMode!=0&&(i.inputState.tabFocusMode=Date.now()+2e3),!1);gt.touchstart=(i,e)=>{let t=i.inputState,n=e.targetTouches[0];t.touchActive=!0,t.lastTouchTime=Date.now(),n&&(t.lastTouchX=n.clientX,t.lastTouchY=n.clientY),t.setSelectionOrigin("select.pointer")};gt.touchmove=i=>{i.inputState.setSelectionOrigin("select.pointer")};gt.touchend=(i,e)=>{i.inputState.touchActive=!1};qt.mousedown=(i,e)=>{if(i.observer.flush(),i.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let n of i.state.facet(Of))if(t=n(i,e),t)break;if(!t&&e.button==0&&(t=BH(i,e)),t){let n=!i.hasFocus;i.inputState.startMouseSelection(new SH(i,e,t,n)),n&&i.observer.ignore(()=>{If(i.contentDOM);let s=i.root.activeElement;s&&!s.contains(i.contentDOM)&&s.blur()});let a=i.inputState.mouseSelection;if(a)return a.start(e),a.dragging===!1}else i.inputState.setSelectionOrigin("select.pointer");return!1};function Nc(i,e,t,n){if(n==1)return O.cursor(e,t);if(n==2)return oH(i.state,e,t);{let a=i.docView.lineAt(e,t),s=i.state.doc.lineAt(a?a.posAtEnd:e),r=a?a.posAtStart:s.from,o=a?a.posAtEnd:s.to;return oDate.now()-400&&Math.abs(e.clientX-i.clientX)<2&&Math.abs(e.clientY-i.clientY)<2?(Rc+1)%3:1}function BH(i,e){let t=i.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),n=n2(e),a=i.state.selection;return{update(s){s.docChanged&&(t.pos=s.changes.mapPos(t.pos),a=a.map(s.changes))},get(s,r,o){let l=i.posAndSideAtCoords({x:s.clientX,y:s.clientY},!1),u,m=Nc(i,l.pos,l.assoc,n);if(t.pos!=l.pos&&!r){let c=Nc(i,t.pos,t.assoc,n),d=Math.min(c.from,m.from),h=Math.max(c.to,m.to);m=d1&&(u=PH(a,l.pos))?u:o?a.addRange(m):O.create([m])}}}function PH(i,e){for(let t=0;t=e)return O.create(i.ranges.slice(0,t).concat(i.ranges.slice(t+1)),i.mainIndex==t?0:i.mainIndex-(i.mainIndex>t?1:0))}return null}qt.dragstart=(i,e)=>{let{selection:{main:t}}=i.state;if(e.target.draggable){let a=i.docView.tile.nearest(e.target);if(a&&a.isWidget()){let s=a.posAtStart,r=s+a.length;(s>=t.to||r<=t.from)&&(t=O.undirectionalRange(s,r))}}let{inputState:n}=i;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",Zr(i.state,du,i.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};qt.dragend=i=>(i.inputState.draggedContent=null,!1);function Gc(i,e,t,n){if(t=Zr(i.state,cu,t),!t)return;let a=i.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:s}=i.inputState,r=n&&s&&_H(i,e)?{from:s.from,to:s.to}:null,o={from:a,insert:t},l=i.state.changes(r?[r,o]:o);i.focus(),i.dispatch({changes:l,selection:{anchor:l.mapPos(a,-1),head:l.mapPos(a,1)},userEvent:r?"move.drop":"input.drop"}),i.inputState.draggedContent=null}qt.drop=(i,e)=>{if(!e.dataTransfer)return!1;if(i.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let n=Array(t.length),a=0,s=()=>{++a==t.length&&Gc(i,e,n.filter(r=>r!=null).join(i.state.lineBreak),!1)};for(let r=0;r{/[\x00-\x08\x0e-\x1f]{2}/.test(o.result)||(n[r]=o.result),s()},o.readAsText(t[r])}return!0}else{let n=e.dataTransfer.getData("Text");if(n)return Gc(i,e,n,!0),!0}return!1};qt.paste=(i,e)=>{if(i.state.readOnly)return!0;i.observer.flush();let t=e2?null:e.clipboardData;return t?(t2(i,t.getData("text/plain")||t.getData("text/uri-list")),!0):(CH(i),!1)};function OH(i,e){let t=i.dom.parentNode;if(!t)return;let n=t.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout(()=>{n.remove(),i.focus()},50)}function MH(i){let e=[],t=[],n=!1;for(let a of i.selection.ranges)a.empty||(e.push(i.sliceDoc(a.from,a.to)),t.push(a));if(!e.length){let a=-1;for(let{from:s}of i.selection.ranges){let r=i.doc.lineAt(s);r.number>a&&(e.push(r.text),t.push({from:r.from,to:Math.min(i.doc.length,r.to+1)})),a=r.number}n=!0}return{text:Zr(i,du,e.join(i.lineBreak)),ranges:t,linewise:n}}let Yl=null;qt.copy=qt.cut=(i,e)=>{if(!Ci(i.contentDOM,i.observer.selectionRange))return!1;let{text:t,ranges:n,linewise:a}=MH(i.state);if(!t&&!a)return!1;Yl=a?t:null,e.type=="cut"&&!i.state.readOnly&&i.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let s=e2?null:e.clipboardData;return s?(s.clearData(),s.setData("text/plain",t),!0):(OH(i,t),!1)};const i2=Vn.define();function a2(i,e){let t=[];for(let n of i.facet(Lf)){let a=n(i,e);a&&t.push(a)}return t.length?i.update({effects:t,annotations:i2.of(!0)}):null}function s2(i){setTimeout(()=>{let e=i.hasFocus;if(e!=i.inputState.notifiedFocused){let t=a2(i.state,e);t?i.dispatch(t):i.update([])}},10)}gt.focus=i=>{i.inputState.lastFocusTime=Date.now(),!i.scrollDOM.scrollTop&&(i.inputState.lastScrollTop||i.inputState.lastScrollLeft)&&(i.scrollDOM.scrollTop=i.inputState.lastScrollTop,i.scrollDOM.scrollLeft=i.inputState.lastScrollLeft),s2(i)};gt.blur=i=>{i.observer.clearSelectionRange(),s2(i)};gt.compositionstart=gt.compositionupdate=(i,e)=>{if(!i.observer.editContext&&(i.inputState.compositionFirstChange==null&&(i.inputState.compositionFirstChange=!0),i.inputState.composing<0)){let{main:t}=i.state.selection;!t.empty&&i.lineBlockAt(t.from).from!=i.lineBlockAt(t.to).from&&!i.state.readOnly&&i.dispatch({changes:i.state.selection.ranges.filter(n=>!n.empty).map(n=>({from:n.from,to:n.to})),userEvent:"input"}),i.inputState.composing=0}};gt.compositionend=i=>{i.observer.editContext||(i.inputState.composing=-1,i.inputState.compositionEndedAt=Date.now(),i.inputState.compositionPendingKey=!0,i.inputState.compositionPendingChange=i.observer.pendingRecords().length>0,i.inputState.compositionFirstChange=null,V.chrome&&V.android?i.observer.flushSoon():i.inputState.compositionPendingChange?Promise.resolve().then(()=>i.observer.flush()):setTimeout(()=>{i.inputState.composing<0&&i.docView.hasComposition&&i.update([])},50))};gt.contextmenu=i=>{i.inputState.lastContextMenu=Date.now()};qt.beforeinput=(i,e)=>{var t,n;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(i.inputState.insertingText=e.data,i.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&i.observer.editContext){let s=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),r=e.getTargetRanges();if(s&&r.length){let o=r[0],l=i.posAtDOM(o.startContainer,o.startOffset),u=i.posAtDOM(o.endContainer,o.endOffset);return fu(i,{from:l,to:u,insert:i.state.toText(s)},null),!0}}let a;if(V.chrome&&V.android&&(a=Kf.find(s=>s.inputType==e.inputType))&&(i.observer.delayAndroidKey(a.key,a.keyCode),a.key=="Backspace"||a.key=="Delete")){let s=((n=window.visualViewport)===null||n===void 0?void 0:n.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>s+10&&i.hasFocus&&(i.contentDOM.blur(),i.focus())},100)}return V.ios&&e.inputType=="deleteContentForward"&&i.observer.flushSoon(),V.safari&&e.inputType=="insertText"&&i.inputState.composing>=0&&setTimeout(()=>gt.compositionend(i,e),20),!1};const Hc=new Set;function ZH(i){Hc.has(i)||(Hc.add(i),i.addEventListener("copy",()=>{}),i.addEventListener("cut",()=>{}))}const Vc=["pre-wrap","normal","pre-line","break-spaces"];let Q1=!1;function qc(){Q1=!1}class LH{constructor(e){this.lineWrapping=e,this.doc=he.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let n=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(n+=Math.max(0,Math.ceil((t-e-n*this.lineLength*.5)/this.lineLength))),this.lineHeight*n}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return Vc.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let n=0;n-1,l=Math.abs(t-this.lineHeight)>.3||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=t,this.charWidth=n,this.textHeight=a,this.lineLength=s,l){this.heightSamples={};for(let u=0;u0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>ys&&(Q1=!0),this.height=e)}replace(e,t,n){return ht.of(n)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,n,a){let s=this,r=n.doc;for(let o=a.length-1;o>=0;o--){let{fromA:l,toA:u,fromB:m,toB:c}=a[o],d=s.lineAt(l,ke.ByPosNoHeight,n.setDoc(t),0,0),h=d.to>=u?d:s.lineAt(u,ke.ByPosNoHeight,n,0,0);for(c+=h.to-u,u=h.to;o>0&&d.from<=a[o-1].toA;)l=a[o-1].fromA,m=a[o-1].fromB,o--,ls*2){let o=e[t-1];o.break?e.splice(--t,1,o.left,null,o.right):e.splice(--t,1,o.left,o.right),n+=1+o.break,a-=o.size}else if(s>a*2){let o=e[n];o.break?e.splice(n,1,o.left,null,o.right):e.splice(n,1,o.left,o.right),n+=2+o.break,s-=o.size}else break;else if(a=s&&r(this.lineAt(0,ke.ByPos,n,a,s))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more&&this.setMeasuredHeight(a),this.outdated=!1,this}toString(){return`block(${this.length})`}}class It extends r2{constructor(e,t,n){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=n}mainBlock(e,t){return new Gt(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,n){let a=n[0];return n.length==1&&(a instanceof It||a instanceof $e&&a.flags&4)&&Math.abs(this.length-a.length)<10?(a instanceof $e?a=new It(a.length,this.height,this.spaceAbove):a.height=this.height,this.outdated||(a.outdated=!1),a):ht.of(n)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more?this.setMeasuredHeight(a):(n||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class $e extends ht{constructor(e){super(e,0)}heightMetrics(e,t){let n=e.doc.lineAt(t).number,a=e.doc.lineAt(t+this.length).number,s=a-n+1,r,o=0;if(e.lineWrapping){let l=Math.min(this.height,e.lineHeight*s);r=l/s,this.length>s+1&&(o=(this.height-l)/(this.length-s-1))}else r=this.height/s;return{firstLine:n,lastLine:a,perLine:r,perChar:o}}blockAt(e,t,n,a){let{firstLine:s,lastLine:r,perLine:o,perChar:l}=this.heightMetrics(t,a);if(t.lineWrapping){let u=a+(e0){let s=n[n.length-1];s instanceof $e?n[n.length-1]=new $e(s.length+a):n.push(null,new $e(a-1))}if(e>0){let s=n[0];s instanceof $e?n[0]=new $e(e+s.length):n.unshift(new $e(e-1),null)}return ht.of(n)}decomposeLeft(e,t){t.push(new $e(e-1),null)}decomposeRight(e,t){t.push(null,new $e(this.length-e-1))}updateHeight(e,t=0,n=!1,a){let s=t+this.length;if(a&&a.from<=t+this.length&&a.more){let r=[],o=Math.max(t,a.from),l=-1;for(a.from>t&&r.push(new $e(a.from-t-1).updateHeight(e,t));o<=s&&a.more;){let m=e.doc.lineAt(o).length;r.length&&r.push(null);let c=a.heights[a.index++],d=0;c<0&&(d=-c,c=a.heights[a.index++]),l==-1?l=c:Math.abs(c-l)>=ys&&(l=-2);let h=new It(m,c,d);h.outdated=!1,r.push(h),o+=m+1}o<=s&&r.push(null,new $e(s-o).updateHeight(e,o));let u=ht.of(r);return(l<0||Math.abs(u.height-this.height)>=ys||Math.abs(l-this.heightMetrics(e,t).perLine)>=ys)&&(Q1=!0),nr(this,u)}else(n||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}}class NH extends ht{constructor(e,t,n){super(e.length+(t?1:0)+n.length,e.height+n.height,(t?1:0)|(e.outdated||n.outdated?2:0)),this.left=e,this.right=n,this.size=e.size+n.size}get break(){return this.flags&1}blockAt(e,t,n,a){let s=n+this.left.height;return eo))return u;let m=t==ke.ByPosNoHeight?ke.ByPosNoHeight:ke.ByPos;return l?u.join(this.right.lineAt(o,m,n,r,o)):this.left.lineAt(o,m,n,a,s).join(u)}forEachLine(e,t,n,a,s,r){let o=a+this.left.height,l=s+this.left.length+this.break;if(this.break)e=l&&this.right.forEachLine(e,t,n,o,l,r);else{let u=this.lineAt(l,ke.ByPos,n,a,s);e=e&&u.from<=t&&r(u),t>u.to&&this.right.forEachLine(Math.max(e,u.to+1),t,n,o,l,r)}}replace(e,t,n){let a=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-a,t-a,n));let s=[];e>0&&this.decomposeLeft(e,s);let r=s.length;for(let o of n)s.push(o);if(e>0&&Uc(s,r-1),t=n&&t.push(null)),e>n&&this.right.decomposeLeft(e-n,t)}decomposeRight(e,t){let n=this.left.length,a=n+this.break;if(e>=a)return this.right.decomposeRight(e-a,t);e2*t.size||t.size>2*e.size?ht.of(this.break?[e,null,t]:[e,t]):(this.left=nr(this.left,e),this.right=nr(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,n=!1,a){let{left:s,right:r}=this,o=t+s.length+this.break,l=null;return a&&a.from<=t+s.length&&a.more?l=s=s.updateHeight(e,t,n,a):s.updateHeight(e,t,n),a&&a.from<=o+r.length&&a.more?l=r=r.updateHeight(e,o,n,a):r.updateHeight(e,o,n),l?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function Uc(i,e){let t,n;i[e]==null&&(t=i[e-1])instanceof $e&&(n=i[e+1])instanceof $e&&i.splice(e-1,3,new $e(t.length+1+n.length))}const FH=5;class bu{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let n=Math.min(t,this.lineEnd),a=this.nodes[this.nodes.length-1];a instanceof It?a.length+=n-this.pos:(n>this.pos||!this.isCovered)&&this.nodes.push(new It(n-this.pos,-1,0)),this.writtenTo=n,t>n&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,n){if(e=FH)&&this.addLineDeco(a,s,r)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new It(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let n=new $e(t-e);return this.oracle.doc.lineAt(e).to==t&&(n.flags|=4),n}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof It)return e;let t=new It(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,n){let a=this.ensureLine();a.length+=n,a.collapsed+=n,a.widgetHeight=Math.max(a.widgetHeight,e),a.breaks+=t,this.writtenTo=this.pos=this.pos+n}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof It)&&!this.isCovered?this.nodes.push(new It(0,-1,0)):(this.writtenTou.clientHeight||u.scrollWidth>u.clientWidth)&&m.overflow!="visible"){let c=u.getBoundingClientRect();s=Math.max(s,c.left),r=Math.min(r,c.right),o=Math.max(o,c.top),l=Math.min(u==i.parentNode?a.innerHeight:l,c.bottom)}u=m.position=="absolute"||m.position=="fixed"?u.offsetParent:u.parentNode}else if(u.nodeType==11)u=u.host;else break;return{left:s-t.left,right:Math.max(s,r)-t.left,top:o-(t.top+e),bottom:Math.max(o,l)-(t.top+e)}}function HH(i){let e=i.getBoundingClientRect(),t=i.ownerDocument.defaultView||window;return e.left0&&e.top0}function VH(i,e){let t=i.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}class bo{constructor(e,t,n,a){this.from=e,this.to=t,this.size=n,this.displaySize=a}static same(e,t){if(e.length!=t.length)return!1;for(let n=0;ntypeof a!="function"&&a.class=="cm-lineWrapping");this.heightOracle=new LH(n),this.stateDeco=$c(t),this.heightMap=ht.empty().applyChanges(this.stateDeco,he.empty,this.heightOracle.setDoc(t.doc),[new Zt(0,0,0,t.doc.length)]);for(let a=0;a<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());a++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=fe.set(this.lineGaps.map(a=>a.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let n=0;n<=1;n++){let a=n?t.head:t.anchor;if(!e.some(({from:s,to:r})=>a>=s&&a<=r)){let{from:s,to:r}=this.lineBlockAt(a);e.push(new Ha(s,r))}}return this.viewports=e.sort((n,a)=>n.from-a.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?Kl:ir.get(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(vi(e,this.scaler))})}update(e,t=null){this.state=e.state;let n=this.stateDeco;this.stateDeco=$c(this.state);let a=e.changedRanges,s=Zt.extendWithRanges(a,RH(n,this.stateDeco,e?e.changes:Le.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);qc(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),s),(this.heightMap.height!=r||Q1)&&(e.flags|=2),o?(this.scrollAnchorPos=e.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=r);let l=s.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.headl.to)||!this.viewportIsAppropriate(l))&&(l=this.getViewport(0,t));let u=l.from!=this.viewport.from||l.to!=this.viewport.to;this.viewport=l,e.flags|=this.updateForViewport(),(u||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(WG)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,t=e.contentDOM,n=window.getComputedStyle(t),a=this.heightOracle,s=n.whiteSpace;this.defaultTextDirection=n.direction=="rtl"?ze.RTL:ze.LTR;let r=this.heightOracle.mustRefreshForWrapping(s)||this.mustMeasureContent==="refresh",o=t.getBoundingClientRect(),l=r||this.mustMeasureContent||this.contentDOMHeight!=o.height;this.contentDOMHeight=o.height,this.mustMeasureContent=!1;let u=0,m=0;if(o.width&&o.height){let{scaleX:I,scaleY:T}=vf(t,o);(I>.005&&Math.abs(this.scaleX-I)>.005||T>.005&&Math.abs(this.scaleY-T)>.005)&&(this.scaleX=I,this.scaleY=T,u|=16,r=l=!0)}let c=(parseInt(n.paddingTop)||0)*this.scaleY,d=(parseInt(n.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=d)&&(this.paddingTop=c,this.paddingBottom=d,u|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(a.lineWrapping&&(l=!0),this.editorWidth=e.scrollDOM.clientWidth,u|=16);let h=wf(this.view.contentDOM,!1).y;h!=this.scrollParent&&(this.scrollParent=h,this.scrollAnchorHeight=-1,this.scrollOffset=0);let g=this.getScrollOffset();this.scrollOffset!=g&&(this.scrollAnchorHeight=-1,this.scrollOffset=g),this.scrolledToBottom=kf(this.scrollParent||e.win);let f=(this.printing?VH:GH)(t,this.paddingTop),b=f.top-this.pixelViewport.top,x=f.bottom-this.pixelViewport.bottom;this.pixelViewport=f;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(l=!0)),!this.inView&&!this.scrollTarget&&!HH(e.dom))return 0;let w=o.width;if((this.contentDOMWidth!=w||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=o.width,this.editorHeight=e.scrollDOM.clientHeight,u|=16),l){let I=e.docView.measureVisibleLineHeights(this.viewport);if(a.mustRefreshForHeights(I)&&(r=!0),r||a.lineWrapping&&Math.abs(w-this.contentDOMWidth)>a.charWidth){let{lineHeight:T,charWidth:k,textHeight:C}=e.docView.measureTextSize();r=T>0&&a.refresh(s,T,k,C,Math.max(5,w/k),I),r&&(e.docView.minWidth=0,u|=16)}b>0&&x>0?m=Math.max(b,x):b<0&&x<0&&(m=Math.min(b,x)),qc();for(let T of this.viewports){let k=T.from==this.viewport.from?I:e.docView.measureVisibleLineHeights(T);this.heightMap=(r?ht.empty().applyChanges(this.stateDeco,he.empty,this.heightOracle,[new Zt(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(a,0,r,new WH(T.from,k))}Q1&&(u|=2)}let z=!this.viewportIsAppropriate(this.viewport,m)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return z&&(u&2&&(u|=this.updateScaler()),this.viewport=this.getViewport(m,this.scrollTarget),u|=this.updateForViewport()),(u&2||z)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(r?[]:this.lineGaps,e)),u|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),u}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let n=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),a=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,l=new Ha(a.lineAt(r-n*1e3,ke.ByHeight,s,0,0).from,a.lineAt(o+(1-n)*1e3,ke.ByHeight,s,0,0).to);if(t){let{head:u}=t.range;if(ul.to){let m=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=a.lineAt(u,ke.ByPos,s,0,0),d;t.y=="center"?d=(c.top+c.bottom)/2-m/2:t.y=="start"||t.y=="nearest"&&u=o+Math.max(10,Math.min(n,250)))&&a>r-2*1e3&&s>1,r=a<<1;if(this.defaultTextDirection!=ze.LTR&&!n)return[];let o=[],l=(m,c,d,h)=>{if(c-mm&&xx.from>=d.from&&x.to<=d.to&&Math.abs(x.from-m)x.fromv));if(!b){if(cw.from<=c&&w.to>=c)){let w=t.moveToLineBoundary(O.cursor(c),!1,!0).head;w>m&&(c=w)}let x=this.gapSize(d,m,c,h),v=n||x<2e6?x:2e6;b=new bo(m,c,x,v)}o.push(b)},u=m=>{if(m.length2e6)for(let T of e)T.from>=m.from&&T.fromm.from&&l(m.from,h,m,c),gt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let n=[];oe.spans(t,this.viewport.from,this.viewport.to,{span(s,r){n.push({from:s,to:r})},point(){}},20);let a=0;if(n.length!=this.visibleRanges.length)a=12;else for(let s=0;s=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||vi(this.heightMap.lineAt(e,ke.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||vi(this.heightMap.lineAt(this.scaler.fromDOM(e),ke.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop*this.scaleY:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+12-this.paddingTop);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return vi(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class Ha{constructor(e,t){this.from=e,this.to=t}}function UH(i,e,t){let n=[],a=i,s=0;return oe.spans(t,i,e,{span(){},point(r,o){r>a&&(n.push({from:a,to:r}),s+=r-a),a=o}},20),a=1)return e[e.length-1].to;let n=Math.floor(i*t);for(let a=0;;a++){let{from:s,to:r}=e[a],o=r-s;if(n<=o)return s+n;n-=o}}function qa(i,e){let t=0;for(let{from:n,to:a}of i.ranges){if(e<=a){t+=e-n;break}t+=a-n}return t/i.total}function QH(i,e){for(let t of i)if(e(t))return t}const Kl={toDOM(i){return i},fromDOM(i){return i},scale:1,eq(i){return i==this}};function $c(i){let e=i.facet(Pr).filter(n=>typeof n!="function"),t=i.facet(gu).filter(n=>typeof n!="function");return t.length&&e.push(oe.join(t)),e}class ir{constructor(e,t){this.scale=e,this.viewports=t}static get(e,t,n){let a=0,s=0,r=0,o=n.map(({from:u,to:m})=>{let c=t.lineAt(u,ke.ByPos,e,0,0).top,d=t.lineAt(m,ke.ByPos,e,0,0).bottom;return a+=d-c,{from:u,to:m,top:c,bottom:d,domTop:0,domBottom:0}});if(t.height-a<10)return Kl;let l=(7e6-a)/(t.height-a);for(let u of o)u.domTop=r+(u.top-s)*l,r=u.domBottom=u.domTop+(u.bottom-u.top),s=u.bottom;return new ir(l,o)}toDOM(e){for(let t=0,n=0,a=0;;t++){let s=tt.from==e.viewports[n].from&&t.to==e.viewports[n].to):!1}}function vi(i,e){if(e.scale==1)return i;let t=e.toDOM(i.top),n=e.toDOM(i.bottom);return new Gt(i.from,i.length,t,n-t,Array.isArray(i._content)?i._content.map(a=>vi(a,e)):i._content)}const Ua=Q.define({combine:i=>i.join(" ")}),Xl=Q.define({combine:i=>i.indexOf(!0)>-1}),e0=Rn.newName(),o2=Rn.newName(),l2=Rn.newName(),u2={"&light":"."+o2,"&dark":"."+l2};function t0(i,e,t){return new Rn(e,{finish(n){return/&/.test(n)?n.replace(/&\w*/,a=>{if(a=="&")return i;if(!t||!t[a])throw new RangeError(`Unsupported selector: ${a}`);return t[a]}):i+" "+n}})}const $H=t0("."+e0,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{userSelect:"none",position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},".cm-panels-top":{top:"0"},".cm-panels-bottom":{bottom:"0"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"baseline",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{background:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 0) no-repeat",backgroundSize:".4em",backgroundPosition:"calc(min(50%, 0px)) center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},u2),YH={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},xo=V.ie&&V.ie_version<=11;class KH{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new TG,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let n of t)this.queue.push(n);(V.ie&&V.ie_version<=11||V.ios&&e.composing)&&t.some(n=>n.type=="childList"&&n.removedNodes.length||n.type=="characterData"&&n.oldValue.length>n.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&V.android&&e.constructor.EDIT_CONTEXT!==!1&&!(V.chrome&&V.chrome_version<126)&&(this.editContext=new eV(e),e.state.facet(vn)&&(e.contentDOM.editContext=this.editContext.editContext)),xo&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(this.pendingRecords().length>0),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,n)=>t!=e[n]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:n}=this,a=this.selectionRange;if(n.state.facet(vn)?n.root.activeElement!=this.dom:!Ci(this.dom,a))return;let s=a.anchorNode&&n.docView.tile.nearest(a.anchorNode);if(s&&s.isWidget()&&s.widget.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(V.ie&&V.ie_version<=11||V.android&&V.chrome)&&!n.state.selection.main.empty&&a.focusNode&&Di(a.focusNode,a.focusOffset,a.anchorNode,a.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Yi(e.root);if(!t)return!1;let n=V.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&XH(this.view,t)||t;if(!n||this.selectionRange.eq(n))return!1;let a=Ci(this.dom,n);return a&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let s=this.delayedAndroidKey;s&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=s.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&s.force&&N1(this.dom,s.key,s.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(a)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,n=-1,a=!1;for(let s of e){let r=this.readMutation(s);r&&(r.typeOver&&(a=!0),t==-1?{from:t,to:n}=r:(t=Math.min(r.from,t),n=Math.max(r.to,n)))}return{from:t,to:n,typeOver:a}}readChange(){let{from:e,to:t,typeOver:n}=this.processRecords(),a=this.selectionChanged&&Ci(this.dom,this.selectionRange);if(e<0&&!a)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new fH(this.view,e,t,n);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.selectionChanged,n=this.readChange();if(!n)return this.view.requestMeasure(),!1;let a=this.view.state,s=$f(this.view,n);return this.view.state==a&&(n.domChanged||t)&&this.view.update([]),s}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty(e.type=="attributes"),e.type=="childList"){let n=Yc(t,e.previousSibling||e.target.previousSibling,-1),a=Yc(t,e.nextSibling||e.target.nextSibling,1);return{from:n?t.posAfter(n):t.posAtStart,to:a?t.posBefore(a):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(vn)!=e.state.facet(vn)&&(e.view.contentDOM.editContext=e.state.facet(vn)?this.editContext.editContext:null))}destroy(){var e,t,n;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(n=this.resizeScroll)===null||n===void 0||n.disconnect();for(let a of this.scrollTargets)a.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function Yc(i,e,t){for(;e;){let n=De.get(e);if(n&&n.parent==i)return n;let a=e.parentNode;e=a!=i.dom?a:t>0?e.nextSibling:e.previousSibling}return null}function Kc(i,e){let t=e.startContainer,n=e.startOffset,a=e.endContainer,s=e.endOffset,r=i.docView.domAtPos(i.state.selection.main.anchor,1);return Di(r.node,r.offset,a,s)&&([t,n,a,s]=[a,s,t,n]),{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}}function XH(i,e){if(e.getComposedRanges){let a=e.getComposedRanges(i.root)[0];if(a)return Kc(i,a)}let t=null;function n(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}return i.contentDOM.addEventListener("beforeinput",n,!0),i.dom.ownerDocument.execCommand("indent"),i.contentDOM.removeEventListener("beforeinput",n,!0),t?Kc(i,t):null}class eV{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=n=>{let a=e.state.selection.main,{anchor:s,head:r}=a,o=this.toEditorPos(n.updateRangeStart),l=this.toEditorPos(n.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:n.updateRangeStart,editorBase:o,drifted:!1});let u=l-o>n.text.length;o==this.from&&sthis.to&&(l=s);let m=Yf(e.state.sliceDoc(o,l),n.text,(u?a.from:a.to)-o,u?"end":null);if(!m){let d=O.single(this.toEditorPos(n.selectionStart),this.toEditorPos(n.selectionEnd));$l(d,a)||e.dispatch({selection:d,userEvent:"select"});return}let c={from:m.from+o,to:m.toA+o,insert:he.of(n.text.slice(m.from,m.toB).split(` -`))};if((V.mac||V.android)&&c.from==r-1&&/^\. ?$/.test(n.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(c={from:o,to:l,insert:he.of([n.text.replace("."," ")])}),this.pendingContextChange=c,!e.state.readOnly){let d=this.to-this.from+(c.to-c.from+c.insert.length);fu(e,c,O.single(this.toEditorPos(n.selectionStart,d),this.toEditorPos(n.selectionEnd,d)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),c.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,n.updateRangeStart-1),Math.min(t.text.length,n.updateRangeStart+1)))&&this.handlers.compositionend(n)},this.handlers.characterboundsupdate=n=>{let a=[],s=null;for(let r=this.toEditorPos(n.rangeStart),o=this.toEditorPos(n.rangeEnd);r{let a=[];for(let s of n.getTextFormats()){let r=s.underlineStyle,o=s.underlineThickness;if(!/none/i.test(r)&&!/none/i.test(o)){let l=this.toEditorPos(s.rangeStart),u=this.toEditorPos(s.rangeEnd);if(l{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:n}=this.composing;this.composing=null,n&&this.reset(e.state)}};for(let n in this.handlers)t.addEventListener(n,this.handlers[n]);this.measureReq={read:n=>{let a=Yi(n.root);a&&a.rangeCount&&this.editContext.updateSelectionBounds(a.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,n=!1,a=this.pendingContextChange;return e.changes.iterChanges((s,r,o,l,u)=>{if(n)return;let m=u.length-(r-s);if(a&&r>=a.to)if(a.from==s&&a.to==r&&a.insert.eq(u)){a=this.pendingContextChange=null,t+=m,this.to+=m;return}else a=null,this.revertPending(e.state);if(s+=t,r+=t,r<=this.from)this.from+=m,this.to+=m;else if(sthis.to||this.to-this.from+u.length>3e4){n=!0;return}this.editContext.updateText(this.toContextPos(s),this.toContextPos(r),u.toString()),this.to+=m}t+=m}),a&&!n&&this.revertPending(e.state),!n}update(e){let t=this.pendingContextChange,n=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(n.from,n.to)&&e.transactions.some(a=>!a.isUserEvent("input.type")&&a.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,n=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),a=this.toContextPos(t.head);(this.editContext.selectionStart!=n||this.editContext.selectionEnd!=a)&&this.editContext.updateSelection(n,a)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let n=this.composing;return n&&n.drifted?n.editorBase+(e-n.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}}class ${get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.clearAnnouncement=-1,this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:n}=e;this.dispatchTransactions=e.dispatchTransactions||n&&(a=>a.forEach(s=>n(s,this)))||(a=>this.update(a)),this.dispatch=this.dispatch.bind(this),this._root=e.root||_G(e.parent)||document,this.viewState=new Qc(this,e.state||ce.create(e)),e.scrollTo&&e.scrollTo.is(Ra)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(P1).map(a=>new co(a));for(let a of this.plugins)a.update(this);this.observer=new KH(this),this.inputState=new wH(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Zc(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...e){let t=e.length==1&&e[0]instanceof Ke?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,n=!1,a,s=this.state;for(let d of e){if(d.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=d.state}if(this.destroyed){this.viewState.state=s;return}let r=this.hasFocus,o=0,l=null;e.some(d=>d.annotation(i2))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=a2(s,r),l||(o=1));let u=this.observer.delayedAndroidKey,m=null;if(u?(this.observer.clearDelayedAndroidKey(),m=this.observer.readChange(),(m&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(m=null)):this.observer.clear(),s.facet(ce.phrases)!=this.state.facet(ce.phrases))return this.setState(s);a=Xs.create(this,s,e),a.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let d of e){if(c&&(c=c.map(d.changes)),d.scrollIntoView){let{main:h}=d.state.selection,{x:g,y:f}=this.state.facet($.cursorScrollMargin);c=new F1(h.empty?h:O.cursor(h.head,h.head>h.anchor?-1:1),"nearest","nearest",f,g)}for(let h of d.effects)h.is(Ra)&&(c=h.value.clip(this.state))}this.viewState.update(a,c),this.bidiCache=ar.update(this.bidiCache,a.changes),a.empty||(this.updatePlugins(a),this.inputState.update(a)),t=this.docView.update(a),this.state.facet(xi)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(a.startState.facet(Ua)!=a.state.facet(Ua)&&(this.viewState.mustMeasureContent=!0),(t||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!a.empty)for(let d of this.state.facet(Vl))try{d(a)}catch(h){St(this.state,h,"update listener")}(l||m)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),m&&!$f(this,m)&&u.force&&N1(this.contentDOM,u.key,u.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Qc(this,e),this.plugins=e.facet(P1).map(n=>new co(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new Zc(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(P1),n=e.state.facet(P1);if(t!=n){let a=[];for(let s of n){let r=t.indexOf(s);if(r<0)a.push(new co(s));else{let o=this.plugins[r];o.mustUpdate=e,a.push(o)}}for(let s of this.plugins)s.mustUpdate!=e&&s.destroy(this);this.plugins=a,this.pluginMap.clear()}else for(let a of this.plugins)a.mustUpdate=e;for(let a=0;a-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,n=this.viewState.scrollParent,a=this.viewState.getScrollOffset(),{scrollAnchorPos:s,scrollAnchorHeight:r,scaleY:o}=this.viewState;Math.abs(a-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(r<0){if(kf(n||this.win))s=-1,r=this.viewState.heightMap.height/this.viewState.scaleY;else{let g=this.viewState.scrollAnchorAt(a);s=g.from,r=g.top}o=this.viewState.scaleY}this.updateState=1;let u=this.viewState.measure();if(!u&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let m=[];u&4||([this.measureRequests,m]=[m,this.measureRequests]);let c=m.map(g=>{try{return g.read(this)}catch(f){return St(this.state,f),Xc}}),d=Xs.create(this,this.state,[]),h=!1;d.flags|=u,t?t.flags|=u:t=d,this.updateState=2,d.empty||(this.updatePlugins(d),this.inputState.update(d),this.updateAttrs(),h=this.docView.update(d),h&&this.docViewUpdate());for(let g=0;g1||f<-1)&&!(V.ios&&this.inputState.lastIOSMomentumScroll>Date.now()-100)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){a=a+f,n?s<0?n.scrollTop=n.scrollHeight:n.scrollTop+=f:this.win.scrollBy(0,f),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let l of this.state.facet(Vl))l(t)}get themeClasses(){return e0+" "+(this.state.facet(Xl)?l2:o2)+" "+this.state.facet(Ua)}updateAttrs(){let e=ed(this,Ff,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(vn)?"true":"false",class:"cm-content",style:`${V.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),ed(this,hu,t);let n=this.observer.ignore(()=>{let a=Cc(this.contentDOM,this.contentAttrs,t),s=Cc(this.dom,this.editorAttrs,e);return a||s});return this.editorAttrs=e,this.contentAttrs=t,n}showAnnouncements(e){let t=!0;for(let n of e)for(let a of n.effects)if(a.is($.announce)){t&&(this.announceDOM.textContent="",this.win.clearTimeout(this.clearAnnouncement),this.clearAnnouncement=this.win.setTimeout(()=>{this.announceDOM.textContent=" "},200),t=!1);let s=this.announceDOM.appendChild(document.createElement("div"));s.textContent=a.value}}mountStyles(){this.styleModules=this.state.facet(xi);let e=this.state.facet($.cspNonce);Rn.mount(this.root,this.styleModules.concat($H).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;tn.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,n){return fo(this,e,Lc(this,e,t,n))}moveByGroup(e,t){return fo(this,e,Lc(this,e,t,n=>mH(this,e.head,n)))}visualLineSide(e,t){return t?O.cursor(e.to,1):O.cursor(e.from,-1)}moveToLineBoundary(e,t,n=!0){return uH(this,e,t,n)}moveVertically(e,t,n){return fo(this,e,cH(this,e,t,n))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let n=Ql(this,e,t);return n&&n.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),Ql(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let n=this.state.doc.lineAt(e),a=this.bidiSpans(n),s=a[ln.find(a,e-n.from,-1,t)];return n.length&&(e==n.from&&t<0||e==n.to&&t>0)&&s.dir!=this.textDirectionAt(n.from)&&(e==n.to?(e=n.from+s.from,t=1):(e=n.from+s.to,t=-1)),this.docView.coordsAt(e,t,s.dir==ze.RTL)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Wf)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>tV)return Cf(e.length);let t=this.textDirectionAt(e.from),n;for(let s of this.bidiCache)if(s.from==e.from&&s.dir==t&&(s.fresh||jf(s.isolates,n=Pc(this,e))))return s.order;n||(n=Pc(this,e));let a=MG(e.text,t,n);return this.bidiCache.push(new ar(e.from,e.to,t,n,!0,a)),a}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||V.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{If(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.win.clearTimeout(this.clearAnnouncement),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){var n,a,s,r;return Ra.of(new F1(typeof e=="number"?O.cursor(e):e,(n=t.y)!==null&&n!==void 0?n:"nearest",(a=t.x)!==null&&a!==void 0?a:"nearest",(s=t.yMargin)!==null&&s!==void 0?s:5,(r=t.xMargin)!==null&&r!==void 0?r:5))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,n=this.viewState.scrollAnchorAt(e);return Ra.of(new F1(O.cursor(n.from),"start","start",n.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return Et.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return Et.define(()=>({}),{eventObservers:e})}static theme(e,t){let n=Rn.newName(),a=[Ua.of(n),xi.of(t0(`.${n}`,e))];return t&&t.dark&&a.push(Xl.of(!0)),a}static baseTheme(e){return f1.lowest(xi.of(t0("."+e0,e,u2)))}static findFromDOM(e){var t;let n=e.querySelector(".cm-content"),a=n&&De.get(n)||De.get(e);return((t=a==null?void 0:a.root)===null||t===void 0?void 0:t.view)||null}}$.styleModule=xi;$.inputHandler=Zf;$.clipboardInputFilter=cu;$.clipboardOutputFilter=du;$.scrollHandler=Ef;$.focusChangeEffect=Lf;$.perLineTextDirection=Wf;$.exceptionSink=Mf;$.updateListener=Vl;$.editable=vn;$.mouseSelectionStyle=Of;$.dragMovesSelection=Pf;$.clickAddsSelectionRange=Bf;$.decorations=Pr;$.blockWrappers=Rf;$.outerDecorations=gu;$.atomicRanges=ga;$.bidiIsolatedRanges=Jf;$.cursorScrollMargin=Q.define({combine:i=>{let e=5,t=5;for(let n of i)typeof n=="number"?e=t=n:{x:e,y:t}=n;return{x:e,y:t}}});$.scrollMargins=Hf;$.darkTheme=Xl;$.cspNonce=Q.define({combine:i=>i.length?i[0]:""});$.contentAttributes=hu;$.editorAttributes=Ff;$.lineWrapping=$.contentAttributes.of({class:"cm-lineWrapping"});$.announce=pe.define();const tV=4096,Xc={};class ar{constructor(e,t,n,a,s,r){this.from=e,this.to=t,this.dir=n,this.isolates=a,this.fresh=s,this.order=r}static update(e,t){if(t.empty&&!e.some(s=>s.fresh))return e;let n=[],a=e.length?e[e.length-1].dir:ze.LTR;for(let s=Math.max(0,e.length-10);s=0;a--){let s=n[a],r=typeof s=="function"?s(i):s;r&&lu(r,t)}return t}const nV=V.mac?"mac":V.windows?"win":V.linux?"linux":"key";function iV(i,e){const t=i.split(/-(?!$)/);let n=t[t.length-1];n=="Space"&&(n=" ");let a,s,r,o;for(let l=0;ln.concat(a),[]))),t}let On=null;const rV=4e3;function oV(i,e=nV){let t=Object.create(null),n=Object.create(null),a=(r,o)=>{let l=n[r];if(l==null)n[r]=o;else if(l!=o)throw new Error("Key binding "+r+" is used both as a regular binding and as a multi-stroke prefix")},s=(r,o,l,u,m)=>{var c,d;let h=t[r]||(t[r]=Object.create(null)),g=o.split(/ (?!$)/).map(x=>iV(x,e));for(let x=1;x{let z=On={view:w,prefix:v,scope:r};return setTimeout(()=>{On==z&&(On=null)},rV),!0}]})}let f=g.join(" ");a(f,!1);let b=h[f]||(h[f]={preventDefault:!1,stopPropagation:!1,run:((d=(c=h._any)===null||c===void 0?void 0:c.run)===null||d===void 0?void 0:d.slice())||[]});l&&b.run.push(l),u&&(b.preventDefault=!0),m&&(b.stopPropagation=!0)};for(let r of i){let o=r.scope?r.scope.split(" "):["editor"];if(r.any)for(let u of o){let m=t[u]||(t[u]=Object.create(null));m._any||(m._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:c}=r;for(let d in m)m[d].run.push(h=>c(h,n0))}let l=r[e]||r.key;if(l)for(let u of o)s(u,l,r.run,r.preventDefault,r.stopPropagation),r.shift&&s(u,"Shift-"+l,r.shift,r.preventDefault,r.stopPropagation)}return t}let n0=null;function lV(i,e,t,n){n0=e;let a=wG(e),s=Pt(a,0),r=xn(s)==a.length&&a!=" ",o="",l=!1,u=!1,m=!1;On&&On.view==t&&On.scope==n&&(o=On.prefix+" ",Xf.indexOf(e.keyCode)<0&&(u=!0,On=null));let c=new Set,d=b=>{if(b){for(let x of b.run)if(!c.has(x)&&(c.add(x),x(t)))return b.stopPropagation&&(m=!0),!0;b.preventDefault&&(b.stopPropagation&&(m=!0),u=!0)}return!1},h=i[n],g,f;return h&&(d(h[o+Qa(a,e,!r)])?l=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(V.windows&&e.ctrlKey&&e.altKey)&&!(V.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(g=Jn[e.keyCode])&&g!=a?(d(h[o+Qa(g,e,!0)])||e.shiftKey&&(f=Qi[e.keyCode])!=a&&f!=g&&d(h[o+Qa(f,e,!1)]))&&(l=!0):r&&e.shiftKey&&d(h[o+Qa(a,e,!0)])&&(l=!0),!l&&d(h._any)&&(l=!0)),u&&(l=!0),l&&m&&e.stopPropagation(),n0=null,l}class Lr{constructor(e,t,n,a,s){this.className=e,this.left=t,this.top=n,this.width=a,this.height=s}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,n){if(n.empty){let a=e.coordsAtPos(n.head,n.assoc||1);if(!a)return[];let s=m2(e);return[new Lr(t,a.left-s.left,a.top-s.top,null,a.bottom-a.top)]}else return uV(e,t,n)}}function m2(i){let e=i.scrollDOM.getBoundingClientRect();return{left:(i.textDirection==ze.LTR?e.left:e.right-i.scrollDOM.clientWidth*i.scaleX)-i.scrollDOM.scrollLeft*i.scaleX,top:e.top-i.scrollDOM.scrollTop*i.scaleY}}function nd(i,e,t,n){let a=i.coordsAtPos(e,t*2);if(!a)return n;let s=i.dom.getBoundingClientRect(),r=(a.top+a.bottom)/2,o=i.posAtCoords({x:s.left+1,y:r}),l=i.posAtCoords({x:s.right-1,y:r});return o==null||l==null?n:{from:Math.max(n.from,Math.min(o,l)),to:Math.min(n.to,Math.max(o,l))}}function uV(i,e,t){if(t.to<=i.viewport.from||t.from>=i.viewport.to)return[];let n=Math.max(t.from,i.viewport.from),a=Math.min(t.to,i.viewport.to),s=i.textDirection==ze.LTR,r=i.contentDOM,o=r.getBoundingClientRect(),l=m2(i),u=r.querySelector(".cm-line"),m=u&&window.getComputedStyle(u),c=o.left+(m?parseInt(m.paddingLeft)+Math.min(0,parseInt(m.textIndent)):0),d=o.right-(m?parseInt(m.paddingRight):0),h=Ul(i,n,1),g=Ul(i,a,-1),f=h.type==Xe.Text?h:null,b=g.type==Xe.Text?g:null;if(f&&(i.lineWrapping||h.widgetLineBreaks)&&(f=nd(i,n,1,f)),b&&(i.lineWrapping||g.widgetLineBreaks)&&(b=nd(i,a,-1,b)),f&&b&&f.from==b.from&&f.to==b.to)return v(w(t.from,t.to,f));{let I=f?w(t.from,null,f):z(h,!1),T=b?w(null,t.to,b):z(g,!0),k=[];return(f||h).to<(b||g).from-(f&&b?1:0)||h.widgetLineBreaks>1&&I.bottom+i.defaultLineHeight/2j&&F.from=ne)break;N>U&&B(Math.max(ue,U),I==null&&ue<=j,Math.min(N,ne),T==null&&N>=Z,ie.dir)}if(U=ge.to+1,U>=ne)break}return D.length==0&&B(j,I==null,Z,T==null,i.textDirection),{top:C,bottom:P,horizontal:D}}function z(I,T){let k=o.top+(T?I.top:I.bottom);return{top:k,bottom:k,horizontal:[]}}}function mV(i,e){return i.constructor==e.constructor&&i.eq(e)}class cV{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(zs)!=e.state.facet(zs)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,n=e.facet(zs);for(;t!mV(t,this.drawn[n]))){let t=this.dom.firstChild,n=0;for(let a of e)a.update&&t&&a.constructor&&this.drawn[n].constructor&&a.update(t,this.drawn[n])?(t=t.nextSibling,n++):this.dom.insertBefore(a.draw(),t);for(;t;){let a=t.nextSibling;t.remove(),t=a}this.drawn=e,V.webkit&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const zs=Q.define();function dV(i){return[Et.define(e=>new cV(e,i)),zs.of(i)]}const $a="-10000px";class hV{constructor(e,t,n,a){this.facet=t,this.createTooltipView=n,this.removeTooltipView=a,this.input=e.state.facet(t),this.tooltips=this.input.filter(r=>r);let s=null;this.tooltipViews=this.tooltips.map(r=>s=n(r,s))}update(e,t){var n;let a=e.state.facet(this.facet),s=a.filter(l=>l);if(a===this.input){for(let l of this.tooltipViews)l.update&&l.update(e);return!1}let r=[],o=t?[]:null;for(let l=0;lt[u]=l),t.length=o.length),this.input=a,this.tooltips=s,this.tooltipViews=r,!0}}function c2(i){let e=i.dom.ownerDocument.documentElement,t=e.clientWidth,n=getComputedStyle(e);if(!/stable/.test(n.scrollbarGutter||""))return{left:0,right:t};let a=e.getBoundingClientRect(),s=i.win.scrollX;return{left:Math.max(0,a.left+s-parseFloat(n.marginLeft)),right:Math.min(t,a.right+s+parseFloat(n.marginRight))}}function gV(i){let{left:e,right:t}=c2(i);return{top:0,left:e,right:t,bottom:i.dom.ownerDocument.documentElement.clientHeight}}const vo=Q.define({combine:i=>{var e,t,n;return{position:V.ios?"absolute":((e=i.find(a=>a.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=i.find(a=>a.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((n=i.find(a=>a.tooltipSpace))===null||n===void 0?void 0:n.tooltipSpace)||gV}}}),id=new WeakMap,d2=Et.fromClass(class{constructor(i){this.view=i,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=i.state.facet(vo);this.position=e.position,this.parent=e.parent,this.classes=i.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new hV(i,h2,(t,n)=>this.createTooltip(t,n),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),i.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let i of this.manager.tooltipViews)this.intersectionObserver.observe(i.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(i){i.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(i,this.above);e&&this.observeIntersection();let t=e||i.geometryChanged,n=i.state.facet(vo);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let a of this.manager.tooltipViews)a.dom.style.position=this.position;t=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let a of this.manager.tooltipViews)this.container.appendChild(a.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(i,e){let t=i.create(this.view),n=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),i.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let a=document.createElement("div");a.className="cm-tooltip-arrow",t.dom.appendChild(a)}return t.dom.style.position=this.position,t.dom.style.top=$a,t.dom.style.left="0px",this.container.insertBefore(t.dom,n),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var i,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let n of this.manager.tooltipViews)n.dom.remove(),(i=n.destroy)===null||i===void 0||i.call(n);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let i=1,e=1,t=!1,n=0;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:r}=this.manager.tooltipViews[0];if(V.safari){let o=r.getBoundingClientRect();t=Math.abs(o.top+1e4)>1||Math.abs(o.left)>1}else t=!!r.offsetParent&&r.offsetParent!=this.container.ownerDocument.body}if(t||this.position=="absolute")if(this.parent){let r=this.parent.getBoundingClientRect();r.width&&r.height&&(i=r.width/this.parent.offsetWidth,e=r.height/this.parent.offsetHeight)}else({scaleX:i,scaleY:e}=this.view.viewState);else n=c2(this.view).left;let a=this.view.scrollDOM.getBoundingClientRect(),s=pu(this.view);return{visible:{left:a.left+s.left,top:a.top+s.top,right:a.right-s.right,bottom:a.bottom-s.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((r,o)=>{let l=this.manager.tooltipViews[o];return l.getCoords?l.getCoords(r.pos):this.view.coordsAtPos(r.pos)}),size:this.manager.tooltipViews.map(({dom:r})=>r.getBoundingClientRect()),space:this.view.state.facet(vo).tooltipSpace(this.view),scaleX:i,scaleY:e,makeAbsolute:t,fixedLeft:n}}writeMeasure(i){var e;if(i.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let o of this.manager.tooltipViews)o.dom.style.position="absolute"}let{visible:t,space:n,scaleX:a,scaleY:s}=i,r=[];for(let o=0;o=Math.min(t.bottom,n.bottom)||c.rightMath.min(t.right,n.right)+.1)){m.style.top=$a;continue}let h=l.arrow?u.dom.querySelector(".cm-tooltip-arrow"):null,g=h?7:0,f=d.right-d.left,b=(e=id.get(u))!==null&&e!==void 0?e:d.bottom-d.top,x=u.offset||fV,v=this.view.textDirection==ze.LTR,w=d.width>n.right-n.left?v?n.left:n.right-d.width:v?Math.max(n.left,Math.min(c.left-(h?14:0)+x.x,n.right-f)):Math.min(Math.max(n.left,c.left-f+(h?14:0)-x.x),n.right-f),z=this.above[o];!l.strictSide&&(z?c.top-b-g-x.yn.bottom)&&z==n.bottom-c.bottom>c.top-n.top&&(z=this.above[o]=!z);let I=(z?c.top-n.top:n.bottom-c.bottom)-g;if(Iw&&C.topT&&(T=z?C.top-b-2-g:C.bottom+g+2);if(this.position=="absolute"?(m.style.top=(T-i.parent.top)/s+"px",ad(m,(w-i.parent.left)/a)):(m.style.top=T/s+"px",ad(m,(w-i.fixedLeft)/a)),h){let C=c.left+(v?x.x:-x.x)-(w+14-7);h.style.left=C/a+"px"}u.overlap!==!0&&r.push({left:w,top:T,right:k,bottom:T+b}),m.classList.toggle("cm-tooltip-above",z),m.classList.toggle("cm-tooltip-below",!z),u.positioned&&u.positioned(i.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let i of this.manager.tooltipViews)i.dom.style.top=$a}},{eventObservers:{scroll(){this.maybeMeasure()}}});function ad(i,e){let t=parseInt(i.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(i.style.left=e+"px")}const pV=$.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),fV={x:0,y:0},h2=Q.define({enables:[d2,pV]});function g2(i,e){let t=i.plugin(d2);if(!t)return null;let n=t.manager.tooltips.indexOf(e);return n<0?null:t.manager.tooltipViews[n]}class cn extends Fn{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}cn.prototype.elementClass="";cn.prototype.toDOM=void 0;cn.prototype.mapMode=lt.TrackBefore;cn.prototype.startSide=cn.prototype.endSide=-1;cn.prototype.point=!0;const Pi=Q.define(),bV=Q.define(),xV={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>oe.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Oi=Q.define();function vV(i){return[p2(),Oi.of({...xV,...i})]}const sd=Q.define({combine:i=>i.some(e=>e)});function p2(i){return[wV]}const wV=Et.fromClass(class{constructor(i){this.view=i,this.domAfter=null,this.prevViewport=i.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=i.state.facet(Oi).map(e=>new od(i,e)),this.fixed=!i.state.facet(sd);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),i.scrollDOM.insertBefore(this.dom,i.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(i){if(this.updateGutters(i)){let e=this.prevViewport,t=i.view.viewport,n=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(n<(t.to-t.from)*.8)}if(i.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(sd)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=i.view.viewport}syncGutters(i){let e=this.dom.nextSibling;i&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=oe.iter(this.view.state.facet(Pi),this.view.viewport.from),n=[],a=this.gutters.map(s=>new yV(s,this.view.viewport,-this.view.documentPadding.top));for(let s of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(s.type)){let r=!0;for(let o of s.type)if(o.type==Xe.Text&&r){i0(t,n,o.from);for(let l of a)l.line(this.view,o,n);r=!1}else if(o.widget)for(let l of a)l.widget(this.view,o)}else if(s.type==Xe.Text){i0(t,n,s.from);for(let r of a)r.line(this.view,s,n)}else if(s.widget)for(let r of a)r.widget(this.view,s);for(let s of a)s.finish();i&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(i){let e=i.startState.facet(Oi),t=i.state.facet(Oi),n=i.docChanged||i.heightChanged||i.viewportChanged||!oe.eq(i.startState.facet(Pi),i.state.facet(Pi),i.view.viewport.from,i.view.viewport.to);if(e==t)for(let a of this.gutters)a.update(i)&&(n=!0);else{n=!0;let a=[];for(let s of t){let r=e.indexOf(s);r<0?a.push(new od(this.view,s)):(this.gutters[r].update(i),a.push(this.gutters[r]))}for(let s of this.gutters)s.dom.remove(),a.indexOf(s)<0&&s.destroy();for(let s of a)s.config.side=="after"?this.getDOMAfter().appendChild(s.dom):this.dom.appendChild(s.dom);this.gutters=a}return n}destroy(){for(let i of this.gutters)i.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:i=>$.scrollMargins.of(e=>{let t=e.plugin(i);if(!t||t.gutters.length==0||!t.fixed)return null;let n=t.dom.offsetWidth*e.scaleX,a=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==ze.LTR?{left:n,right:a}:{right:n,left:a}})});function rd(i){return Array.isArray(i)?i:[i]}function i0(i,e,t){for(;i.value&&i.from<=t;)i.from==t&&e.push(i.value),i.next()}class yV{constructor(e,t,n){this.gutter=e,this.height=n,this.i=0,this.cursor=oe.iter(e.markers,t.from)}addElement(e,t,n){let{gutter:a}=this,s=(t.top-this.height)/e.scaleY,r=t.height/e.scaleY;if(this.i==a.elements.length){let o=new f2(e,r,s,n);a.elements.push(o),a.dom.appendChild(o.dom)}else a.elements[this.i].update(e,r,s,n);this.height=t.bottom,this.i++}line(e,t,n){let a=[];i0(this.cursor,a,t.from),n.length&&(a=a.concat(n));let s=this.gutter.config.lineMarker(e,t,a);s&&a.unshift(s);let r=this.gutter;a.length==0&&!r.config.renderEmptyElements||this.addElement(e,t,a)}widget(e,t){let n=this.gutter.config.widgetMarker(e,t.widget,t),a=n?[n]:null;for(let s of e.state.facet(bV)){let r=s(e,t.widget,t);r&&(a||(a=[])).push(r)}a&&this.addElement(e,t,a)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class od{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let n in t.domEventHandlers)this.dom.addEventListener(n,a=>{let s=a.target,r;if(s!=this.dom&&this.dom.contains(s)){for(;s.parentNode!=this.dom;)s=s.parentNode;let l=s.getBoundingClientRect();r=(l.top+l.bottom)/2}else r=a.clientY;let o=e.lineBlockAtHeight(r-e.documentTop);t.domEventHandlers[n](e,o,a)&&a.preventDefault()});this.markers=rd(t.markers(e)),t.initialSpacer&&(this.spacer=new f2(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=rd(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let a=this.config.updateSpacer(this.spacer.markers[0],e);a!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[a])}let n=e.view.viewport;return!oe.eq(this.markers,t,n.from,n.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}}class f2{constructor(e,t,n,a){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,n,a)}update(e,t,n,a){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),zV(this.markers,a)||this.setMarkers(e,a)}setMarkers(e,t){let n="cm-gutterElement",a=this.dom.firstChild;for(let s=0,r=0;;){let o=r,l=ss(o,l,u)||r(o,l,u):r}return n}})}});class wo extends cn{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function yo(i,e){return i.state.facet(O1).formatNumber(e,i.state)}const SV=Oi.compute([O1],i=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(IV)},lineMarker(e,t,n){return n.some(a=>a.toDOM)?null:new wo(yo(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,n)=>{for(let a of e.state.facet(kV)){let s=a(e,t,n);if(s)return s}return null},lineMarkerChange:e=>e.startState.facet(O1)!=e.state.facet(O1),initialSpacer(e){return new wo(yo(e,ld(e.state.doc.lines)))},updateSpacer(e,t){let n=yo(t.view,ld(t.view.state.doc.lines));return n==e.number?e:new wo(n)},domEventHandlers:i.facet(O1).domEventHandlers,side:"before"}));function TV(i={}){return[O1.of(i),p2(),SV]}function ld(i){let e=9;for(;e{let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.head).from;a>t&&(t=a,e.push(_V.range(a)))}return oe.of(e)});function jV(){return AV}const b2=1024;let CV=0;class zo{constructor(e,t){this.from=e,this.to=t}}class le{constructor(e={}){this.id=CV++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=wt.match(e)),t=>{let n=e(t);return n===void 0?null:[this,n]}}}le.closedBy=new le({deserialize:i=>i.split(" ")});le.openedBy=new le({deserialize:i=>i.split(" ")});le.group=new le({deserialize:i=>i.split(" ")});le.isolate=new le({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});le.contextHash=new le({perNode:!0});le.lookAhead=new le({perNode:!0});le.mounted=new le({perNode:!0});class Mi{constructor(e,t,n,a=!1){this.tree=e,this.overlay=t,this.parser=n,this.bracketed=a}static get(e){return e&&e.props&&e.props[le.mounted.id]}}const DV=Object.create(null);class wt{constructor(e,t,n,a=0){this.name=e,this.props=t,this.id=n,this.flags=a}static define(e){let t=e.props&&e.props.length?Object.create(null):DV,n=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),a=new wt(e.name||"",t,e.id,n);if(e.props){for(let s of e.props)if(Array.isArray(s)||(s=s(a)),s){if(s[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[s[0].id]=s[1]}}return a}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(le.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let n in e)for(let a of n.split(" "))t[a]=e[n];return n=>{for(let a=n.prop(le.group),s=-1;s<(a?a.length:0);s++){let r=t[s<0?n.name:a[s]];if(r)return r}}}}wt.none=new wt("",Object.create(null),0,8);class xu{constructor(e){this.types=e;for(let t=0;t0;for(let l=this.cursor(r|Ce.IncludeAnonymous);;){let u=!1;if(l.from<=s&&l.to>=a&&(!o&&l.type.isAnonymous||t(l)!==!1)){if(l.firstChild())continue;u=!0}for(;u&&n&&(o||!l.type.isAnonymous)&&n(l),!l.nextSibling();){if(!l.parent())return;u=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:yu(wt.none,this.children,this.positions,0,this.children.length,0,this.length,(t,n,a)=>new Ee(this.type,t,n,a,this.propValues),e.makeTree||((t,n,a)=>new Ee(wt.none,t,n,a)))}static build(e){return MV(e)}}Ee.empty=new Ee(wt.none,[],[],0);class vu{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new vu(this.buffer,this.index)}}class Hn{constructor(e,t,n){this.buffer=e,this.length=t,this.set=n}get type(){return wt.none}toString(){let e=[];for(let t=0;t0));l=r[l+3]);return o}slice(e,t,n){let a=this.buffer,s=new Uint16Array(t-e),r=0;for(let o=e,l=0;o=e&&te;case 1:return t<=e&&n>e;case 2:return n>e;case 4:return!0}}function ea(i,e,t,n){for(var a;i.from==i.to||(t<1?i.from>=e:i.from>e)||(t>-1?i.to<=e:i.to0?o.length:-1;e!=u;e+=t){let m=o[e],c=l[e]+r.from,d;if(!(!(s&Ce.EnterBracketed&&m instanceof Ee&&(d=Mi.get(m))&&!d.overlay&&d.bracketed&&n>=c&&n<=c+m.length)&&!x2(a,n,c,c+m.length))){if(m instanceof Hn){if(s&Ce.ExcludeBuffers)continue;let h=m.findChild(0,m.buffer.length,t,n-c,a);if(h>-1)return new Ln(new BV(r,m,e,c),null,h)}else if(s&Ce.IncludeAnonymous||!m.type.isAnonymous||wu(m)){let h;if(!(s&Ce.IgnoreMounts)&&(h=Mi.get(m))&&!h.overlay)return new Wt(h.tree,c,e,r);let g=new Wt(m,c,e,r);return s&Ce.IncludeAnonymous||!g.type.isAnonymous?g:g.nextChild(t<0?m.children.length-1:0,t,n,a,s)}}}if(s&Ce.IncludeAnonymous||!r.type.isAnonymous||(r.index>=0?e=r.index+t:e=t<0?-1:r._parent._tree.children.length,r=r._parent,!r))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,n=0){let a;if(!(n&Ce.IgnoreOverlays)&&(a=Mi.get(this._tree))&&a.overlay){let s=e-this.from,r=n&Ce.EnterBracketed&&a.bracketed;for(let{from:o,to:l}of a.overlay)if((t>0||r?o<=s:o=s:l>s))return new Wt(a.tree,a.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,n)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function md(i,e,t,n){let a=i.cursor(),s=[];if(!a.firstChild())return s;if(t!=null){for(let r=!1;!r;)if(r=a.type.is(t),!a.nextSibling())return s}for(;;){if(n!=null&&a.type.is(n))return s;if(a.type.is(e)&&s.push(a.node),!a.nextSibling())return n==null?s:[]}}function a0(i,e,t=e.length-1){for(let n=i;t>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[t]&&e[t]!=n.name)return!1;t--}}return!0}class BV{constructor(e,t,n,a){this.parent=e,this.buffer=t,this.index=n,this.start=a}}class Ln extends v2{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,n){super(),this.context=e,this._parent=t,this.index=n,this.type=e.buffer.set.types[e.buffer.buffer[n]]}child(e,t,n){let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.context.start,n);return s<0?null:new Ln(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,n=0){if(n&Ce.ExcludeBuffers)return null;let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return s<0?null:new Ln(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new Ln(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new Ln(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:n}=this.context,a=this.index+4,s=n.buffer[this.index+3];if(s>a){let r=n.buffer[this.index+1];e.push(n.slice(a,s,r)),t.push(0)}return new Ee(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function w2(i){if(!i.length)return null;let e=0,t=i[0];for(let s=1;st.from||r.to=e){let o=new Wt(r.tree,r.overlay[0].from+s.from,-1,s);(a||(a=[n])).push(ea(o,e,t,!1))}}return a?w2(a):n}class s0{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~Ce.EnterBracketed,e instanceof Wt)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let n=e._parent;n;n=n._parent)this.stack.unshift(n.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:n,buffer:a}=this.buffer;return this.type=t||a.set.types[a.buffer[e]],this.from=n+a.buffer[e+1],this.to=n+a.buffer[e+2],!0}yield(e){return e?e instanceof Wt?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,n){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,n,this.mode));let{buffer:a}=this.buffer,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.buffer.start,n);return s<0?!1:(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,n=this.mode){return this.buffer?n&Ce.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,n))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ce.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ce.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,n=this.stack.length-1;if(e<0){let a=n<0?0:this.stack[n]+4;if(this.index!=a)return this.yieldBuf(t.findChild(a,this.index,-1,0,4))}else{let a=t.buffer[this.index+3];if(a<(n<0?t.buffer.length:t.buffer[this.stack[n]+3]))return this.yieldBuf(a)}return n<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,n,{buffer:a}=this;if(a){if(e>0){if(this.index-1)for(let s=t+e,r=e<0?-1:n._tree.children.length;s!=r;s+=e){let o=n._tree.children[s];if(this.mode&Ce.IncludeAnonymous||o instanceof Hn||!o.type.isAnonymous||wu(o))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==a){if(a==this.index)return r;t=r,n=s+1;break e}a=this.stack[--s]}for(let a=n;a=0;s--){if(s<0)return a0(this._tree,e,a);let r=n[t.buffer[this.stack[s]]];if(!r.isAnonymous){if(e[a]&&e[a]!=r.name)return!1;a--}}return!0}}function wu(i){return i.children.some(e=>e instanceof Hn||!e.type.isAnonymous||wu(e))}function MV(i){var e;let{buffer:t,nodeSet:n,maxBufferLength:a=b2,reused:s=[],minRepeatType:r=n.types.length}=i,o=Array.isArray(t)?new vu(t,t.length):t,l=n.types,u=0,m=0;function c(I,T,k,C,P,D){let{id:B,start:j,end:Z,size:F}=o,U=m,ne=u;if(F<0)if(o.next(),F==-1){let _=s[B];k.push(_),C.push(j-I);return}else if(F==-3){u=B;return}else if(F==-4){m=B;return}else throw new RangeError(`Unrecognized record size: ${F}`);let ge=l[B],ie,ue,N=j-I;if(Z-j<=a&&(ue=b(o.pos-T,P))){let _=new Uint16Array(ue.size-ue.skip),M=o.pos-ue.size,J=_.length;for(;o.pos>M;)J=x(ue.start,_,J);ie=new Hn(_,Z-ue.start,n),N=ue.start-I}else{let _=o.pos-F;o.next();let M=[],J=[],q=B>=r?B:-1,X=0,Y=Z,ae=U;for(;o.pos>_;)q>=0&&o.id==q&&o.size>=0?(o.end<=Y-a&&(g(M,J,j,X,o.end,Y,q,ae,ne),X=M.length,Y=o.end,ae=m),o.next()):D>2500?d(j,_,M,J):c(j,_,M,J,q,D+1);if(q>=0&&X>0&&X-1&&X>0){let re=h(ge,ne);ie=yu(ge,M,J,0,M.length,0,Z-j,re,re)}else ie=f(ge,M,J,Z-j,U-Z,ne)}k.push(ie),C.push(N)}function d(I,T,k,C){let P=[],D=0,B=-1;for(;o.pos>T;){let{id:j,start:Z,end:F,size:U}=o;if(U>4)o.next();else{if(B>-1&&Z=0;F-=3)j[U++]=P[F],j[U++]=P[F+1]-Z,j[U++]=P[F+2]-Z,j[U++]=U;k.push(new Hn(j,P[2]-Z,n)),C.push(Z-I)}}function h(I,T){return(k,C,P)=>{let D=0,B=k.length-1,j,Z;if(B>=0&&(j=k[B])instanceof Ee){if(!B&&j.type==I&&j.length==P)return j;(Z=j.prop(le.lookAhead))&&(D=C[B]+j.length+Z-P)}return f(I,k,C,P,D,T)}}function g(I,T,k,C,P,D,B,j,Z){let F=[],U=[];for(;I.length>C;)F.push(I.pop()),U.push(T.pop()+k-P);I.push(f(n.types[B],F,U,D-P,j-D,Z)),T.push(P-k)}function f(I,T,k,C,P,D,B){if(D){let j=[le.contextHash,D];B=B?[j].concat(B):[j]}if(P>25){let j=[le.lookAhead,P];B=B?[j].concat(B):[j]}return new Ee(I,T,k,C,B)}function b(I,T){let k=o.fork(),C=0,P=0,D=0,B=k.end-a,j={size:0,start:0,skip:0};e:for(let Z=k.pos-I;k.pos>Z;){let F=k.size;if(k.id==T&&F>=0){j.size=C,j.start=P,j.skip=D,D+=4,C+=4,k.next();continue}let U=k.pos-F;if(F<0||U=r?4:0,ge=k.start;for(k.next();k.pos>U;){if(k.size<0)if(k.size==-3||k.size==-4)ne+=4;else break e;else k.id>=r&&(ne+=4);k.next()}P=ge,C+=F,D+=ne}return(T<0||C==I)&&(j.size=C,j.start=P,j.skip=D),j.size>4?j:void 0}function x(I,T,k){let{id:C,start:P,end:D,size:B}=o;if(o.next(),B>=0&&C4){let Z=o.pos-(B-4);for(;o.pos>Z;)k=x(I,T,k)}T[--k]=j,T[--k]=D-I,T[--k]=P-I,T[--k]=C}else B==-3?u=C:B==-4&&(m=C);return k}let v=[],w=[];for(;o.pos>0;)c(i.start||0,i.bufferStart||0,v,w,-1,0);let z=(e=i.length)!==null&&e!==void 0?e:v.length?w[0]+v[0].length:0;return new Ee(l[i.topID],v.reverse(),w.reverse(),z)}const cd=new WeakMap;function Is(i,e){if(!i.isAnonymous||e instanceof Hn||e.type!=i)return 1;let t=cd.get(e);if(t==null){t=1;for(let n of e.children){if(n.type!=i||!(n instanceof Ee)){t=1;break}t+=Is(i,n)}cd.set(e,t)}return t}function yu(i,e,t,n,a,s,r,o,l){let u=0;for(let g=n;g=m)break;T+=k}if(w==z+1){if(T>m){let k=g[z];h(k.children,k.positions,0,k.children.length,f[z]+v);continue}c.push(g[z])}else{let k=f[w-1]+g[w-1].length-I;c.push(yu(i,g,f,z,w,I,k,null,l))}d.push(I+v-s)}}return h(e,t,n,a,0),(o||l)(c,d,r)}class d1{constructor(e,t,n,a,s=!1,r=!1){this.from=e,this.to=t,this.tree=n,this.offset=a,this.open=(s?1:0)|(r?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],n=!1){let a=[new d1(0,e.length,e,0,!1,n)];for(let s of t)s.to>e.length&&a.push(s);return a}static applyChanges(e,t,n=128){if(!t.length)return e;let a=[],s=1,r=e.length?e[0]:null;for(let o=0,l=0,u=0;;o++){let m=o=n)for(;r&&r.from=d.from||c<=d.to||u){let h=Math.max(d.from,l)-u,g=Math.min(d.to,c)-u;d=h>=g?null:new d1(h,g,d.tree,d.offset+u,o>0,!!m)}if(d&&a.push(d),r.to>c)break;r=snew zo(a.from,a.to)):[new zo(0,0)]:[new zo(0,e.length)],this.createParse(e,t||[],n)}parse(e,t,n){let a=this.startParse(e,t,n);for(;;){let s=a.advance();if(s)return s}}}class ZV{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new le({perNode:!0});let LV=0;class Ot{constructor(e,t,n,a){this.name=e,this.set=t,this.base=n,this.modified=a,this.id=LV++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let n=typeof e=="string"?e:"?";if(e instanceof Ot&&(t=e),t!=null&&t.base)throw new Error("Can not derive from a modified tag");let a=new Ot(n,[],null,[]);if(a.set.push(a),t)for(let s of t.set)a.set.push(s);return a}static defineModifier(e){let t=new sr(e);return n=>n.modified.indexOf(t)>-1?n:sr.get(n.base||n,n.modified.concat(t).sort((a,s)=>a.id-s.id))}}let WV=0;class sr{constructor(e){this.name=e,this.instances=[],this.id=WV++}static get(e,t){if(!t.length)return e;let n=t[0].instances.find(o=>o.base==e&&EV(t,o.modified));if(n)return n;let a=[],s=new Ot(e.name,a,e,t);for(let o of t)o.instances.push(s);let r=NV(t);for(let o of e.set)if(!o.modified.length)for(let l of r)a.push(sr.get(o,l));return s}}function EV(i,e){return i.length==e.length&&i.every((t,n)=>t==e[n])}function NV(i){let e=[[]];for(let t=0;tn.length-t.length)}function z2(i){let e=Object.create(null);for(let t in i){let n=i[t];Array.isArray(n)||(n=[n]);for(let a of t.split(" "))if(a){let s=[],r=2,o=a;for(let c=0;;){if(o=="..."&&c>0&&c+3==a.length){r=1;break}let d=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(o);if(!d)throw new RangeError("Invalid path: "+a);if(s.push(d[0]=="*"?"":d[0][0]=='"'?JSON.parse(d[0]):d[0]),c+=d[0].length,c==a.length)break;let h=a[c++];if(c==a.length&&h=="!"){r=0;break}if(h!="/")throw new RangeError("Invalid path: "+a);o=a.slice(c)}let l=s.length-1,u=s[l];if(!u)throw new RangeError("Invalid path: "+a);let m=new ta(n,r,l>0?s.slice(0,l):null);e[u]=m.sort(e[u])}}return I2.add(e)}const I2=new le({combine(i,e){let t,n,a;for(;i||e;){if(!i||e&&i.depth<=e.depth?(a=e,e=e.next):(a=i,i=i.next),t&&t.mode==a.mode&&!a.context&&!t.context)continue;let s=new ta(a.tags,a.mode,a.context);t?t.next=s:n=s,t=s}return n}});class ta{constructor(e,t,n,a){this.tags=e,this.mode=t,this.context=n,this.next=a}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let r=a;for(let o of s)for(let l of o.set){let u=t[l.id];if(u){r=r?r+" "+u:u;break}}return r},scope:n}}function FV(i,e){let t=null;for(let n of i){let a=n.style(e);a&&(t=t?t+" "+a:a)}return t}function RV(i,e,t,n=0,a=i.length){let s=new JV(n,Array.isArray(e)?e:[e],t);s.highlightRange(i.cursor(),n,a,"",s.highlighters),s.flush(a)}class JV{constructor(e,t,n){this.at=e,this.highlighters=t,this.span=n,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,n,a,s){let{type:r,from:o,to:l}=e;if(o>=n||l<=t)return;r.isTop&&(s=this.highlighters.filter(h=>!h.scope||h.scope(r)));let u=a,m=GV(e)||ta.empty,c=FV(s,m.tags);if(c&&(u&&(u+=" "),u+=c,m.mode==1&&(a+=(a?" ":"")+c)),this.startSpan(Math.max(t,o),u),m.opaque)return;let d=e.tree&&e.tree.prop(le.mounted);if(d&&d.overlay){let h=e.node.enter(d.overlay[0].from+o,1),g=this.highlighters.filter(b=>!b.scope||b.scope(d.tree.type)),f=e.firstChild();for(let b=0,x=o;;b++){let v=b=w||!e.nextSibling())););if(!v||w>n)break;x=v.to+o,x>t&&(this.highlightRange(h.cursor(),Math.max(t,v.from+o),Math.min(n,x),"",g),this.startSpan(Math.min(n,x),u))}f&&e.parent()}else if(e.firstChild()){d&&(a="");do if(!(e.to<=t)){if(e.from>=n)break;this.highlightRange(e,t,n,a,s),this.startSpan(Math.min(n,e.to),u)}while(e.nextSibling());e.parent()}}}function GV(i){let e=i.type.prop(I2);for(;e&&e.context&&!i.matchContext(e.context);)e=e.next;return e||null}const R=Ot.define,Ka=R(),Cn=R(),dd=R(Cn),hd=R(Cn),Dn=R(),Xa=R(Dn),Io=R(Dn),tn=R(),Yn=R(tn),Xt=R(),en=R(),r0=R(),mi=R(r0),es=R(),E={comment:Ka,lineComment:R(Ka),blockComment:R(Ka),docComment:R(Ka),name:Cn,variableName:R(Cn),typeName:dd,tagName:R(dd),propertyName:hd,attributeName:R(hd),className:R(Cn),labelName:R(Cn),namespace:R(Cn),macroName:R(Cn),literal:Dn,string:Xa,docString:R(Xa),character:R(Xa),attributeValue:R(Xa),number:Io,integer:R(Io),float:R(Io),bool:R(Dn),regexp:R(Dn),escape:R(Dn),color:R(Dn),url:R(Dn),keyword:Xt,self:R(Xt),null:R(Xt),atom:R(Xt),unit:R(Xt),modifier:R(Xt),operatorKeyword:R(Xt),controlKeyword:R(Xt),definitionKeyword:R(Xt),moduleKeyword:R(Xt),operator:en,derefOperator:R(en),arithmeticOperator:R(en),logicOperator:R(en),bitwiseOperator:R(en),compareOperator:R(en),updateOperator:R(en),definitionOperator:R(en),typeOperator:R(en),controlOperator:R(en),punctuation:r0,separator:R(r0),bracket:mi,angleBracket:R(mi),squareBracket:R(mi),paren:R(mi),brace:R(mi),content:tn,heading:Yn,heading1:R(Yn),heading2:R(Yn),heading3:R(Yn),heading4:R(Yn),heading5:R(Yn),heading6:R(Yn),contentSeparator:R(tn),list:R(tn),quote:R(tn),emphasis:R(tn),strong:R(tn),link:R(tn),monospace:R(tn),strikethrough:R(tn),inserted:R(),deleted:R(),changed:R(),invalid:R(),meta:es,documentMeta:R(es),annotation:R(es),processingInstruction:R(es),definition:Ot.defineModifier("definition"),constant:Ot.defineModifier("constant"),function:Ot.defineModifier("function"),standard:Ot.defineModifier("standard"),local:Ot.defineModifier("local"),special:Ot.defineModifier("special")};for(let i in E){let e=E[i];e instanceof Ot&&(e.name=i)}k2([{tag:E.link,class:"tok-link"},{tag:E.heading,class:"tok-heading"},{tag:E.emphasis,class:"tok-emphasis"},{tag:E.strong,class:"tok-strong"},{tag:E.keyword,class:"tok-keyword"},{tag:E.atom,class:"tok-atom"},{tag:E.bool,class:"tok-bool"},{tag:E.url,class:"tok-url"},{tag:E.labelName,class:"tok-labelName"},{tag:E.inserted,class:"tok-inserted"},{tag:E.deleted,class:"tok-deleted"},{tag:E.literal,class:"tok-literal"},{tag:E.string,class:"tok-string"},{tag:E.number,class:"tok-number"},{tag:[E.regexp,E.escape,E.special(E.string)],class:"tok-string2"},{tag:E.variableName,class:"tok-variableName"},{tag:E.local(E.variableName),class:"tok-variableName tok-local"},{tag:E.definition(E.variableName),class:"tok-variableName tok-definition"},{tag:E.special(E.variableName),class:"tok-variableName2"},{tag:E.definition(E.propertyName),class:"tok-propertyName tok-definition"},{tag:E.typeName,class:"tok-typeName"},{tag:E.namespace,class:"tok-namespace"},{tag:E.className,class:"tok-className"},{tag:E.macroName,class:"tok-macroName"},{tag:E.propertyName,class:"tok-propertyName"},{tag:E.operator,class:"tok-operator"},{tag:E.comment,class:"tok-comment"},{tag:E.meta,class:"tok-meta"},{tag:E.invalid,class:"tok-invalid"},{tag:E.punctuation,class:"tok-punctuation"}]);var ko;const M1=new le;function HV(i){return Q.define({combine:i?e=>e.concat(i):void 0})}const VV=new le;class Vt{constructor(e,t,n=[],a=""){this.data=e,this.name=a,ce.prototype.hasOwnProperty("tree")||Object.defineProperty(ce.prototype,"tree",{get(){return et(this)}}),this.parser=t,this.extension=[Y1.of(this),ce.languageData.of((s,r,o)=>{let l=gd(s,r,o),u=l.type.prop(M1);if(!u)return[];let m=s.facet(u),c=l.type.prop(VV);if(c){let d=l.resolve(r-l.from,o);for(let h of c)if(h.test(d,s)){let g=s.facet(h.facet);return h.type=="replace"?g:g.concat(m)}}return m})].concat(n)}isActiveAt(e,t,n=-1){return gd(e,t,n).type.prop(M1)==this.data}findRegions(e){let t=e.facet(Y1);if((t==null?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],a=(s,r)=>{if(s.prop(M1)==this.data){n.push({from:r,to:r+s.length});return}let o=s.prop(le.mounted);if(o){if(o.tree.prop(M1)==this.data){if(o.overlay)for(let l of o.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+s.length});return}else if(o.overlay){let l=n.length;if(a(o.tree,o.overlay[0].from+r),n.length>l)return}}for(let l=0;ln.isTop?t:void 0)]}),e.name)}configure(e,t){return new rr(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function et(i){let e=i.field(Vt.state,!1);return e?e.tree:Ee.empty}class qV{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let n=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-n,t-n)}}let ci=null;class or{constructor(e,t,n=[],a,s,r,o,l){this.parser=e,this.state=t,this.fragments=n,this.tree=a,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(e,t,n){return new or(e,t,[],Ee.empty,0,n,[],null)}startParse(){return this.parser.startParse(new qV(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=Ee.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var n;if(typeof e=="number"){let a=Date.now()+e;e=()=>Date.now()>a}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(d1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=ci;ci=this;try{return e()}finally{ci=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=pd(e,t.from,t.to);return e}changes(e,t){let{fragments:n,tree:a,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!e.empty){let l=[];if(e.iterChangedRanges((u,m,c,d)=>l.push({fromA:u,toA:m,fromB:c,toB:d})),n=d1.applyChanges(n,l),a=Ee.empty,s=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){o=[];for(let u of this.skipped){let m=e.mapPos(u.from,1),c=e.mapPos(u.to,-1);me.from&&(this.fragments=pd(this.fragments,a,s),this.skipped.splice(n--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends y2{createParse(t,n,a){let s=a[0].from,r=a[a.length-1].to;return{parsedPos:s,advance(){let l=ci;if(l){for(let u of a)l.tempSkipped.push(u);e&&(l.scheduleOn=l.scheduleOn?Promise.all([l.scheduleOn,e]):e)}return this.parsedPos=r,new Ee(wt.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return ci}}function pd(i,e,t){return d1.applyChanges(i,[{fromA:e,toA:t,fromB:e,toB:t}])}class $1{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),n=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,n)||t.takeTree(),new $1(t)}static init(e){let t=Math.min(3e3,e.doc.length),n=or.create(e.facet(Y1).parser,e,{from:0,to:t});return n.work(20,t)||n.takeTree(),new $1(n)}}Vt.state=Nt.define({create:$1.init,update(i,e){for(let t of e.effects)if(t.is(Vt.setState))return t.value;return e.startState.facet(Y1)!=e.state.facet(Y1)?$1.init(e.state):i.apply(e)}});let S2=i=>{let e=setTimeout(()=>i(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(S2=i=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(i,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});const So=typeof navigator<"u"&&(!((ko=navigator.scheduling)===null||ko===void 0)&&ko.isInputPending)?()=>navigator.scheduling.isInputPending():null,UV=Et.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Vt.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Vt.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=S2(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEnda+1e3,l=s.context.work(()=>So&&So()||Date.now()>r,a+(o?0:1e5));this.chunkBudget-=Date.now()-t,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:Vt.setState.of(new $1(s.context))})),this.chunkBudget>0&&!(l&&!o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>St(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Y1=Q.define({combine(i){return i.length?i[0]:null},enables:i=>[Vt.state,UV,$.contentAttributes.compute([i],e=>{let t=e.facet(i);return t&&t.name?{"data-language":t.name}:{}})]});class QV{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const $V=Q.define(),pa=Q.define({combine:i=>{if(!i.length)return" ";let e=i[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(i[0]));return e}});function lr(i){let e=i.facet(pa);return e.charCodeAt(0)==9?i.tabSize*e.length:e.length}function na(i,e){let t="",n=i.tabSize,a=i.facet(pa)[0];if(a==" "){for(;e>=n;)t+=" ",e-=n;a=" "}for(let s=0;s=e?YV(i,t,e):null}class Wr{constructor(e,t={}){this.state=e,this.options=t,this.unit=lr(e)}lineAt(e,t=1){let n=this.state.doc.lineAt(e),{simulateBreak:a,simulateDoubleBreak:s}=this.options;return a!=null&&a>=n.from&&a<=n.to?s&&a==e?{text:"",from:e}:(t<0?a-1&&(s+=r-this.countColumn(n,n.search(/\S|$/))),s}countColumn(e,t=e.length){return ca(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:n,from:a}=this.lineAt(e,t),s=this.options.overrideIndentation;if(s){let r=s(a);if(r>-1)return r}return this.countColumn(n,n.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const T2=new le;function YV(i,e,t){let n=e.resolveStack(t),a=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(a!=n.node){let s=[];for(let r=a;r&&!(r.fromn.node.to||r.from==n.node.from&&r.type==n.node.type);r=r.parent)s.push(r);for(let r=s.length-1;r>=0;r--)n={node:s[r],next:n}}return _2(n,i,t)}function _2(i,e,t){for(let n=i;n;n=n.next){let a=XV(n.node);if(a)return a(Iu.create(e,t,n))}return 0}function KV(i){return i.pos==i.options.simulateBreak&&i.options.simulateDoubleBreak}function XV(i){let e=i.type.prop(T2);if(e)return e;let t=i.firstChild,n;if(t&&(n=t.type.prop(le.closedBy))){let a=i.lastChild,s=a&&n.indexOf(a.name)>-1;return r=>A2(r,!0,1,void 0,s&&!KV(r)?a.from:void 0)}return i.parent==null?eq:null}function eq(){return 0}class Iu extends Wr{constructor(e,t,n){super(e.state,e.options),this.base=e,this.pos=t,this.context=n}get node(){return this.context.node}static create(e,t,n){return new Iu(e,t,n)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let n=e.resolve(t.from);for(;n.parent&&n.parent.from==n.from;)n=n.parent;if(tq(n,e))break;t=this.state.doc.lineAt(n.from)}return this.lineIndent(t.from)}continue(){return _2(this.context.next,this.base,this.pos)}}function tq(i,e){for(let t=e;t;t=t.parent)if(i==t)return!0;return!1}function nq(i){let e=i.node,t=e.childAfter(e.from),n=e.lastChild;if(!t)return null;let a=i.options.simulateBreak,s=i.state.doc.lineAt(t.from),r=a==null||a<=s.from?s.to:Math.min(s.to,a);for(let o=t.to;;){let l=e.childAfter(o);if(!l||l==n)return null;if(!l.type.isSkipped){if(l.from>=r)return null;let u=/^ */.exec(s.text.slice(t.to-s.from))[0].length;return{from:t.from,to:t.to+u}}o=l.to}}function iq({closing:i,align:e=!0,units:t=1}){return n=>A2(n,e,t,i)}function A2(i,e,t,n,a){let s=i.textAfter,r=s.match(/^\s*/)[0].length,o=n&&s.slice(r,r+n.length)==n||a==i.pos+r,l=e?nq(i):null;return l?o?i.column(l.from):i.column(l.to):i.baseIndent+(o?0:i.unit*t)}const aq=i=>i.baseIndent;function To({except:i,units:e=1}={}){return t=>{let n=i&&i.test(t.textAfter);return t.baseIndent+(n?0:e*t.unit)}}const sq=200;function rq(){return ce.transactionFilter.of(i=>{if(!i.docChanged||!i.isUserEvent("input.type")&&!i.isUserEvent("input.complete"))return i;let e=i.startState.languageDataAt("indentOnInput",i.startState.selection.main.head);if(!e.length)return i;let t=i.newDoc,{head:n}=i.newSelection.main,a=t.lineAt(n);if(n>a.from+sq)return i;let s=t.sliceString(a.from,n);if(!e.some(u=>u.test(s)))return i;let{state:r}=i,o=-1,l=[];for(let{head:u}of r.selection.ranges){let m=r.doc.lineAt(u);if(m.from==o)continue;o=m.from;let c=zu(r,m.from);if(c==null)continue;let d=/^\s*/.exec(m.text)[0],h=na(r,c);d!=h&&l.push({from:m.from,to:m.from+d.length,insert:h})}return l.length?[i,{changes:l,sequential:!0}]:i})}const oq=new le;function lq(i){let e=i.firstChild,t=i.lastChild;return e&&e.too.prop(M1)==r.data:r?o=>o==r:void 0,this.style=k2(e.map(o=>({tag:o.tag,class:o.class||a(Object.assign({},o,{tag:null}))})),{all:s}).style,this.module=n?new Rn(n):null,this.themeType=t.themeType}static define(e,t){return new Er(e,t||{})}}const o0=Q.define(),uq=Q.define({combine(i){return i.length?[i[0]]:null}});function _o(i){let e=i.facet(o0);return e.length?e:i.facet(uq)}function mq(i,e){let t=[dq],n;return i instanceof Er&&(i.module&&t.push($.styleModule.of(i.module)),n=i.themeType),n?t.push(o0.computeN([$.darkTheme],a=>a.facet($.darkTheme)==(n=="dark")?[i]:[])):t.push(o0.of(i)),t}class cq{constructor(e){this.markCache=Object.create(null),this.tree=et(e.state),this.decorations=this.buildDeco(e,_o(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=et(e.state),n=_o(e.state),a=n!=_o(e.startState),{viewport:s}=e.view,r=e.changes.mapPos(this.decoratedTo,1);t.length=s.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=r):(t!=this.tree||e.viewportChanged||a)&&(this.tree=t,this.decorations=this.buildDeco(e.view,n),this.decoratedTo=s.to)}buildDeco(e,t){if(!t||!this.tree.length)return fe.none;let n=new c1;for(let{from:a,to:s}of e.visibleRanges)RV(this.tree,t,(r,o,l)=>{n.add(r,o,this.markCache[l]||(this.markCache[l]=fe.mark({class:l})))},a,s);return n.finish()}}const dq=f1.high(Et.fromClass(cq,{decorations:i=>i.decorations})),hq=$.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),j2=1e4,C2="()[]{}",D2=Q.define({combine(i){return su(i,{afterCursor:!0,brackets:C2,maxScanDistance:j2,renderMatch:fq})}}),gq=fe.mark({class:"cm-matchingBracket"}),pq=fe.mark({class:"cm-nonmatchingBracket"});function fq(i){let e=[],t=i.matched?gq:pq;return e.push(t.range(i.start.from,i.start.to)),i.end&&e.push(t.range(i.end.from,i.end.to)),e}function fd(i){let e=[],t=i.facet(D2);for(let n of i.selection.ranges){if(!n.empty)continue;let a=un(i,n.head,-1,t)||n.head>0&&un(i,n.head-1,1,t)||t.afterCursor&&(un(i,n.head,1,t)||n.headi.decorations}),xq=[bq,hq];function vq(i={}){return[D2.of(i),xq]}const wq=new le;function l0(i,e,t){let n=i.prop(e<0?le.openedBy:le.closedBy);if(n)return n;if(i.name.length==1){let a=t.indexOf(i.name);if(a>-1&&a%2==(e<0?1:0))return[t[a+e]]}return null}function u0(i){let e=i.type.prop(wq);return e?e(i.node):i}function un(i,e,t,n={}){let a=n.maxScanDistance||j2,s=n.brackets||C2,r=et(i),o=r.resolveInner(e,t);for(let l=o;l;l=l.parent){let u=l0(l.type,t,s);if(u&&l.from0?e>=m.from&&em.from&&e<=m.to))return yq(i,e,t,l,m,u,s)}}return zq(i,e,t,r,o.type,a,s)}function yq(i,e,t,n,a,s,r){let o=n.parent,l={from:a.from,to:a.to},u=0,m=o==null?void 0:o.cursor();if(m&&(t<0?m.childBefore(n.from):m.childAfter(n.to)))do if(t<0?m.to<=n.from:m.from>=n.to){if(u==0&&s.indexOf(m.type.name)>-1&&m.from0)return null;let u={from:t<0?e-1:e,to:t>0?e+1:e},m=i.doc.iterRange(e,t>0?i.doc.length:0),c=0;for(let d=0;!m.next().done&&d<=s;){let h=m.value;t<0&&(d+=h.length);let g=e+d*t;for(let f=t>0?0:h.length-1,b=t>0?h.length:-1;f!=b;f+=t){let x=r.indexOf(h[f]);if(!(x<0||n.resolveInner(g+f,1).type!=a))if(x%2==0==t>0)c++;else{if(c==1)return{start:u,end:{from:g+f,to:g+f+1},matched:x>>1==l>>1};c--}}t>0&&(d+=h.length)}return m.done?{start:u,matched:!1}:null}const Iq=Object.create(null),bd=[wt.none],xd=[],vd=Object.create(null),kq=Object.create(null);for(let[i,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])kq[i]=Sq(Iq,e);function Ao(i,e){xd.indexOf(i)>-1||(xd.push(i),console.warn(e))}function Sq(i,e){let t=[];for(let o of e.split(" ")){let l=[];for(let u of o.split(".")){let m=i[u]||E[u];m?typeof m=="function"?l.length?l=l.map(m):Ao(u,`Modifier ${u} used at start of tag`):l.length?Ao(u,`Tag ${u} used as modifier`):l=Array.isArray(m)?m:[m]:Ao(u,`Unknown highlighting tag ${u}`)}for(let u of l)t.push(u)}if(!t.length)return 0;let n=e.replace(/ /g,"_"),a=n+" "+t.map(o=>o.id),s=vd[a];if(s)return s.id;let r=vd[a]=wt.define({id:bd.length,name:n,props:[z2({[n]:t})]});return bd.push(r),r.id}ze.RTL,ze.LTR;class B2{constructor(e,t,n,a){this.state=e,this.pos=t,this.explicit=n,this.view=a,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=et(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),n=Math.max(t.from,this.pos-250),a=t.text.slice(n-t.from,this.pos-t.from),s=a.search(P2(e,!1));return s<0?null:{from:n+s,to:this.pos,text:a.slice(s)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,n){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),n&&n.onDocChange&&(this.abortOnDocChange=!0))}}function wd(i){let e=Object.keys(i).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function Tq(i){let e=Object.create(null),t=Object.create(null);for(let{label:a}of i){e[a[0]]=!0;for(let s=1;stypeof a=="string"?{label:a}:a),[t,n]=e.every(a=>/^\w+$/.test(a.label))?[/\w*$/,/\w+$/]:Tq(e);return a=>{let s=a.matchBefore(n);return s||a.explicit?{from:s?s.from:a.pos,options:e,validFor:t}:null}}class yd{constructor(e,t,n,a){this.completion=e,this.source=t,this.match=n,this.score=a}}function h1(i){return i.selection.main.from}function P2(i,e){var t;let{source:n}=i,a=e&&n[0]!="^",s=n[n.length-1]!="$";return!a&&!s?i:new RegExp(`${a?"^":""}(?:${n})${s?"$":""}`,(t=i.flags)!==null&&t!==void 0?t:i.ignoreCase?"i":"")}const ku=Vn.define();function Aq(i,e,t,n){let{main:a}=i.selection,s=t-a.from,r=n-a.from;return{...i.changeByRange(o=>{if(o!=a&&t!=n&&i.sliceDoc(o.from+s,o.from+r)!=i.sliceDoc(t,n))return{range:o};let l=i.toText(e);return{changes:{from:o.from+s,to:n==a.from?o.to:o.from+r,insert:l},range:O.cursor(o.from+s+l.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}const zd=new WeakMap;function jq(i){if(!Array.isArray(i))return i;let e=zd.get(i);return e||zd.set(i,e=_q(i)),e}const ur=pe.define(),ia=pe.define();class Cq{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&I<=57||I>=97&&I<=122?2:I>=65&&I<=90?1:0:(T=nf(I))!=T.toLowerCase()?1:T!=T.toUpperCase()?2:0;(!v||k==1&&b||z==0&&k!=0)&&(t[c]==I||n[c]==I&&(d=!0)?r[c++]=v:r.length&&(x=!1)),z=k,v+=xn(I)}return c==l&&r[0]==0&&x?this.result(-100+(d?-200:0),r,e):h==l&&g==0?this.ret(-200-e.length+(f==e.length?0:-100),[0,f]):o>-1?this.ret(-700-e.length,[o,o+this.pattern.length]):h==l?this.ret(-900-e.length,[g,f]):c==l?this.result(-100+(d?-200:0)+-700+(x?0:-1100),r,e):t.length==2?null:this.result((a[0]?-700:0)+-200+-1100,a,e)}result(e,t,n){let a=[],s=0;for(let r of t){let o=r+(this.astral?xn(Pt(n,r)):1);s&&a[s-1]==r?a[s-1]=o:(a[s++]=r,a[s++]=o)}return this.ret(e-n.length,a)}}class Dq{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:Bq,filterStrict:!1,compareCompletions:(e,t)=>(e.sortText||e.label).localeCompare(t.sortText||t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>n=>Id(e(n),t(n)),optionClass:(e,t)=>n=>Id(e(n),t(n)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function Id(i,e){return i?e?i+" "+e:i:e}function Bq(i,e,t,n,a,s){let r=i.textDirection==ze.RTL,o=r,l=!1,u="top",m,c,d=e.left-a.left,h=a.right-e.right,g=n.right-n.left,f=n.bottom-n.top;if(o&&d=f||v>e.top?m=t.bottom-e.top:(u="bottom",m=e.bottom-t.top)}let b=(e.bottom-e.top)/s.offsetHeight,x=(e.right-e.left)/s.offsetWidth;return{style:`${u}: ${m/b}px; max-width: ${c/x}px`,class:"cm-completionInfo-"+(l?r?"left-narrow":"right-narrow":o?"left":"right")}}const Su=pe.define();function Pq(i){let e=i.addToOptions.slice();return i.icons&&e.push({render(t){let n=document.createElement("div");return n.classList.add("cm-completionIcon"),t.type&&n.classList.add(...t.type.split(/\s+/g).map(a=>"cm-completionIcon-"+a)),n.setAttribute("aria-hidden","true"),n},position:20}),e.push({render(t,n,a,s){let r=document.createElement("span");r.className="cm-completionLabel";let o=t.displayLabel||t.label,l=0;for(let u=0;ul&&r.appendChild(document.createTextNode(o.slice(l,m)));let d=r.appendChild(document.createElement("span"));d.appendChild(document.createTextNode(o.slice(m,c))),d.className="cm-completionMatchedText",l=c}return lt.position-n.position).map(t=>t.render)}function jo(i,e,t){if(i<=t)return{from:0,to:i};if(e<0&&(e=0),e<=i>>1){let a=Math.floor(e/t);return{from:a*t,to:(a+1)*t}}let n=Math.ceil((i-e)/t);return{from:i-n*t,to:i-(n-1)*t}}class Oq{constructor(e,t,n){this.view=e,this.stateField=t,this.applyCompletion=n,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:l=>this.placeInfo(l),key:this},this.space=null,this.currentClass="";let a=e.state.field(t),{options:s,selected:r}=a.open,o=e.state.facet(Ve);this.optionContent=Pq(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=jo(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",l=>{let{options:u}=e.state.field(t).open;for(let m=l.target,c;m&&m!=this.dom;m=m.parentNode)if(m.nodeName=="LI"&&(c=/-(\d+)$/.exec(m.id))&&+c[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;m!=null&&(e.dispatch({effects:Su.of(m)}),l.preventDefault())}}),this.dom.addEventListener("focusout",l=>{let u=e.state.field(this.stateField,!1);u&&u.tooltip&&e.state.facet(Ve).closeOnBlur&&l.relatedTarget!=e.contentDOM&&e.dispatch({effects:ia.of(null)})}),this.showOptions(s,a.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let n=e.state.field(this.stateField),a=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),n!=a){let{options:s,selected:r,disabled:o}=n.open;(!a.open||a.open.options!=s)&&(this.range=jo(s.length,r,e.state.facet(Ve).maxRenderedOptions),this.showOptions(s,n.id)),this.updateSel(),o!=((t=a.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let n of this.currentClass.split(" "))n&&this.dom.classList.remove(n);for(let n of t.split(" "))n&&this.dom.classList.add(n);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.selected>-1&&t.selected=this.range.to)&&(this.range=jo(t.options.length,t.selected,this.view.state.facet(Ve).maxRenderedOptions),this.showOptions(t.options,e.id));let n=this.updateSelectedOption(t.selected);if(n){this.destroyInfo();let{completion:a}=t.options[t.selected],{info:s}=a;if(!s)return;let r=typeof s=="string"?document.createTextNode(s):s(a);if(!r)return;"then"in r?r.then(o=>{o&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(o,a)}).catch(o=>St(this.view.state,o,"completion info")):(this.addInfoPane(r,a),n.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,t){this.destroyInfo();let n=this.info=document.createElement("div");if(n.className="cm-tooltip cm-completionInfo",n.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)n.appendChild(e),this.infoDestroy=null;else{let{dom:a,destroy:s}=e;n.appendChild(a),this.infoDestroy=s||null}this.dom.appendChild(n),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let n=this.list.firstChild,a=this.range.from;n;n=n.nextSibling,a++)n.nodeName!="LI"||!n.id?a--:a==e?n.hasAttribute("aria-selected")||(n.setAttribute("aria-selected","true"),t=n):n.hasAttribute("aria-selected")&&(n.removeAttribute("aria-selected"),n.removeAttribute("aria-describedby"));return t&&Zq(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),n=this.info.getBoundingClientRect(),a=e.getBoundingClientRect(),s=this.space;if(!s){let r=this.dom.ownerDocument.documentElement;s={left:0,top:0,right:r.clientWidth,bottom:r.clientHeight}}return a.top>Math.min(s.bottom,t.bottom)-10||a.bottom{r.target==a&&r.preventDefault()});let s=null;for(let r=n.from;rn.from||n.from==0))if(s=d,typeof u!="string"&&u.header)a.appendChild(u.header(u));else{let h=a.appendChild(document.createElement("completion-section"));h.textContent=d}}const m=a.appendChild(document.createElement("li"));m.id=t+"-"+r,m.setAttribute("role","option");let c=this.optionClass(o);c&&(m.className=c);for(let d of this.optionContent){let h=d(o,this.view.state,this.view,l);h&&m.appendChild(h)}}return n.from&&a.classList.add("cm-completionListIncompleteTop"),n.tonew Oq(t,i,e)}function Zq(i,e){let t=i.getBoundingClientRect(),n=e.getBoundingClientRect(),a=t.height/i.offsetHeight;n.topt.bottom&&(i.scrollTop+=(n.bottom-t.bottom)/a)}function kd(i){return(i.boost||0)*100+(i.apply?10:0)+(i.info?5:0)+(i.type?1:0)}function Lq(i,e){let t=[],n=null,a=null,s=m=>{t.push(m);let{section:c}=m.completion;if(c){n||(n=[]);let d=typeof c=="string"?c:c.name;n.some(h=>h.name==d)||n.push(typeof c=="string"?{name:d}:c)}},r=e.facet(Ve);for(let m of i)if(m.hasResult()){let c=m.result.getMatch;if(m.result.filter===!1)for(let d of m.result.options)s(new yd(d,m.source,c?c(d):[],1e9-t.length));else{let d=e.sliceDoc(m.from,m.to),h,g=r.filterStrict?new Dq(d):new Cq(d);for(let f of m.result.options)if(h=g.match(f.label)){let b=f.displayLabel?c?c(f,h.matched):[]:h.matched,x=h.score+(f.boost||0);if(s(new yd(f,m.source,b,x)),typeof f.section=="object"&&f.section.rank==="dynamic"){let{name:v}=f.section;a||(a=Object.create(null)),a[v]=Math.max(x,a[v]||-1e9)}}}}if(n){let m=Object.create(null),c=0,d=(h,g)=>(h.rank==="dynamic"&&g.rank==="dynamic"?a[g.name]-a[h.name]:0)||(typeof h.rank=="number"?h.rank:1e9)-(typeof g.rank=="number"?g.rank:1e9)||(h.named.score-c.score||u(c.completion,d.completion))){let c=m.completion;!l||l.label!=c.label||l.detail!=c.detail||l.type!=null&&c.type!=null&&l.type!=c.type||l.apply!=c.apply||l.boost!=c.boost?o.push(m):kd(m.completion)>kd(l)&&(o[o.length-1]=m),l=m.completion}return o}class Z1{constructor(e,t,n,a,s,r){this.options=e,this.attrs=t,this.tooltip=n,this.timestamp=a,this.selected=s,this.disabled=r}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new Z1(this.options,Sd(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,n,a,s,r){if(a&&!r&&e.some(u=>u.isPending))return a.setDisabled();let o=Lq(e,t);if(!o.length)return a&&e.some(u=>u.isPending)?a.setDisabled():null;let l=t.facet(Ve).selectOnOpen?0:-1;if(a&&a.selected!=l&&a.selected!=-1){let u=a.options[a.selected].completion;for(let m=0;mm.hasResult()?Math.min(u,m.from):u,1e8),create:Jq,above:s.aboveCursor},a?a.timestamp:Date.now(),l,!1)}map(e){return new Z1(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new Z1(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}}class mr{constructor(e,t,n){this.active=e,this.id=t,this.open=n}static start(){return new mr(Fq,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,n=t.facet(Ve),s=(n.override||t.languageDataAt("autocomplete",h1(t)).map(jq)).map(l=>(this.active.find(m=>m.source==l)||new Lt(l,this.active.some(m=>m.state!=0)?1:0)).update(e,n));s.length==this.active.length&&s.every((l,u)=>l==this.active[u])&&(s=this.active);let r=this.open,o=e.effects.some(l=>l.is(Tu));r&&e.docChanged&&(r=r.map(e.changes)),e.selection||s.some(l=>l.hasResult()&&e.changes.touchesRange(l.from,l.to))||!Wq(s,this.active)||o?r=Z1.build(s,t,this.id,r,n,o):r&&r.disabled&&!s.some(l=>l.isPending)&&(r=null),!r&&s.every(l=>!l.isPending)&&s.some(l=>l.hasResult())&&(s=s.map(l=>l.hasResult()?new Lt(l.source,0):l));for(let l of e.effects)l.is(Su)&&(r=r&&r.setSelected(l.value,this.id));return s==this.active&&r==this.open?this:new mr(s,this.id,r)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?Eq:Nq}}function Wq(i,e){if(i==e)return!0;for(let t=0,n=0;;){for(;t-1&&(t["aria-activedescendant"]=i+"-"+e),t}const Fq=[];function O2(i,e){if(i.isUserEvent("input.complete")){let n=i.annotation(ku);if(n&&e.activateOnCompletion(n))return 12}let t=i.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:i.isUserEvent("delete.backward")?2:i.selection?8:i.docChanged?16:0}class Lt{constructor(e,t,n=!1){this.source=e,this.state=t,this.explicit=n}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let n=O2(e,t),a=this;(n&8||n&16&&this.touches(e))&&(a=new Lt(a.source,0)),n&4&&a.state==0&&(a=new Lt(this.source,1)),a=a.updateFor(e,n);for(let s of e.effects)if(s.is(ur))a=new Lt(a.source,1,s.value);else if(s.is(ia))a=new Lt(a.source,0);else if(s.is(Tu))for(let r of s.value)r.source==a.source&&(a=r);return a}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(h1(e.state))}}class R1 extends Lt{constructor(e,t,n,a,s,r){super(e,3,t),this.limit=n,this.result=a,this.from=s,this.to=r}hasResult(){return!0}updateFor(e,t){var n;if(!(t&3))return this.map(e.changes);let a=this.result;a.map&&!e.changes.empty&&(a=a.map(a,e.changes));let s=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),o=h1(e.state);if(o>r||!a||t&2&&(h1(e.startState)==this.from||ot.map(e))}}),xt=Nt.define({create(){return mr.start()},update(i,e){return i.update(e)},provide:i=>[h2.from(i,e=>e.tooltip),$.contentAttributes.from(i,e=>e.attrs)]});function _u(i,e){const t=e.completion.apply||e.completion.label;let n=i.state.field(xt).active.find(a=>a.source==e.source);return n instanceof R1?(typeof t=="string"?i.dispatch({...Aq(i.state,t,n.from,n.to),annotations:ku.of(e.completion)}):t(i,e.completion,n.from,n.to),!0):!1}const Jq=Mq(xt,_u);function ts(i,e="option"){return t=>{let n=t.state.field(xt,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+a*(i?1:-1):i?0:r-1;return o<0?o=e=="page"?0:r-1:o>=r&&(o=e=="page"?r-1:0),t.dispatch({effects:Su.of(o)}),!0}}const Gq=i=>{let e=i.state.field(xt,!1);return i.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampi.state.field(xt,!1)?(i.dispatch({effects:ur.of(!0)}),!0):!1,Hq=i=>{let e=i.state.field(xt,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(i.dispatch({effects:ia.of(null)}),!0)};class Vq{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const qq=50,Uq=1e3,Qq=Et.fromClass(class{constructor(i){this.view=i,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of i.state.field(xt).active)e.isPending&&this.startQuery(e)}update(i){let e=i.state.field(xt),t=i.state.facet(Ve);if(!i.selectionSet&&!i.docChanged&&i.startState.field(xt)==e)return;let n=i.transactions.some(s=>{let r=O2(s,t);return r&8||(s.selection||s.docChanged)&&!(r&3)});for(let s=0;sqq&&Date.now()-r.time>Uq){for(let o of r.context.abortListeners)try{o()}catch(l){St(this.view.state,l)}r.context.abortListeners=null,this.running.splice(s--,1)}else r.updates.push(...i.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),i.transactions.some(s=>s.effects.some(r=>r.is(ur)))&&(this.pendingStart=!0);let a=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(s=>s.isPending&&!this.running.some(r=>r.active.source==s.source))?setTimeout(()=>this.startUpdate(),a):-1,this.composing!=0)for(let s of i.transactions)s.isUserEvent("input.type")?this.composing=2:this.composing==2&&s.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:i}=this.view,e=i.field(xt);for(let t of e.active)t.isPending&&!this.running.some(n=>n.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Ve).updateSyncTime))}startQuery(i){let{state:e}=this.view,t=h1(e),n=new B2(e,t,i.explicit,this.view),a=new Vq(i,n);this.running.push(a),Promise.resolve(i.source(n)).then(s=>{a.context.aborted||(a.done=s||null,this.scheduleAccept())},s=>{this.view.dispatch({effects:ia.of(null)}),St(this.view.state,s)})}scheduleAccept(){this.running.every(i=>i.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Ve).updateSyncTime))}accept(){var i;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(Ve),n=this.view.state.field(xt);for(let a=0;ao.source==s.active.source);if(r&&r.isPending)if(s.done==null){let o=new Lt(s.active.source,0);for(let l of s.updates)o=o.update(l,t);o.isPending||e.push(o)}else this.startQuery(r)}(e.length||n.open&&n.open.disabled)&&this.view.dispatch({effects:Tu.of(e)})}},{eventHandlers:{blur(i){let e=this.view.state.field(xt,!1);if(e&&e.tooltip&&this.view.state.facet(Ve).closeOnBlur){let t=e.open&&g2(this.view,e.open.tooltip);(!t||!t.dom.contains(i.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:ia.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:ur.of(!1)}),20),this.composing=0}}}),$q=typeof navigator=="object"&&/Win/.test(navigator.platform),Yq=f1.highest($.domEventHandlers({keydown(i,e){let t=e.state.field(xt,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||!i.key||i.key.length>1||i.ctrlKey&&!($q&&i.altKey)||i.metaKey)return!1;let n=t.open.options[t.open.selected],a=t.active.find(r=>r.source==n.source),s=n.completion.commitCharacters||a.result.commitCharacters;return s&&s.indexOf(i.key)>-1&&_u(e,n),!1}})),M2=$.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center",cursor:"pointer"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class Kq{constructor(e,t,n,a){this.field=e,this.line=t,this.from=n,this.to=a}}class Au{constructor(e,t,n){this.field=e,this.from=t,this.to=n}map(e){let t=e.mapPos(this.from,-1,lt.TrackDel),n=e.mapPos(this.to,1,lt.TrackDel);return t==null||n==null?null:new Au(this.field,t,n)}}class ju{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let n=[],a=[t],s=e.doc.lineAt(t),r=/^\s*/.exec(s.text)[0];for(let l of this.lines){if(n.length){let u=r,m=/^\t*/.exec(l)[0].length;for(let c=0;cnew Au(l.field,a[l.line]+l.from,a[l.line]+l.to));return{text:n,ranges:o}}static parse(e){let t=[],n=[],a=[],s;for(let r of e.split(/\r\n?|\n/)){for(;s=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(r);){let o=s[1]?+s[1]:null,l=s[2]||s[3]||"",u=-1;o===0&&(o=1e9);let m=l.replace(/\\[{}]/g,c=>c[1]);for(let c=0;c=u&&d.field++}for(let c of a)if(c.line==n.length&&c.from>s.index){let d=s[2]?3+(s[1]||"").length:2;c.from-=d,c.to-=d}a.push(new Kq(u,n.length,s.index,s.index+m.length)),r=r.slice(0,s.index)+l+r.slice(s.index+s[0].length)}r=r.replace(/\\([{}])/g,(o,l,u)=>{for(let m of a)m.line==n.length&&m.from>u&&(m.from--,m.to--);return l}),n.push(r)}return new ju(n,a)}}let Xq=fe.widget({widget:new class extends X1{toDOM(){let i=document.createElement("span");return i.className="cm-snippetFieldPosition",i}ignoreEvent(){return!1}}}),eU=fe.mark({class:"cm-snippetField"});class ei{constructor(e,t){this.ranges=e,this.active=t,this.deco=fe.set(e.map(n=>(n.from==n.to?Xq:eU).range(n.from,n.to)),!0)}map(e){let t=[];for(let n of this.ranges){let a=n.map(e);if(!a)return null;t.push(a)}return new ei(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(n=>n.field==this.active&&n.from<=t.from&&n.to>=t.to))}}const fa=pe.define({map(i,e){return i&&i.map(e)}}),tU=pe.define(),aa=Nt.define({create(){return null},update(i,e){for(let t of e.effects){if(t.is(fa))return t.value;if(t.is(tU)&&i)return new ei(i.ranges,t.value)}return i&&e.docChanged&&(i=i.map(e.changes)),i&&e.selection&&!i.selectionInsideField(e.selection)&&(i=null),i},provide:i=>$.decorations.from(i,e=>e?e.deco:fe.none)});function Cu(i,e){return O.create(i.filter(t=>t.field==e).map(t=>O.range(t.from,t.to)))}function nU(i){let e=ju.parse(i);return(t,n,a,s)=>{let{text:r,ranges:o}=e.instantiate(t.state,a),{main:l}=t.state.selection,u={changes:{from:a,to:s==l.from?l.to:s,insert:he.of(r)},scrollIntoView:!0,annotations:n?[ku.of(n),Ke.userEvent.of("input.complete")]:void 0};if(o.length&&(u.selection=Cu(o,0)),o.some(m=>m.field>0)){let m=new ei(o,0),c=u.effects=[fa.of(m)];t.state.field(aa,!1)===void 0&&c.push(pe.appendConfig.of([aa,oU,lU,M2]))}t.dispatch(t.state.update(u))}}function Z2(i){return({state:e,dispatch:t})=>{let n=e.field(aa,!1);if(!n||i<0&&n.active==0)return!1;let a=n.active+i,s=i>0&&!n.ranges.some(r=>r.field==a+i);return t(e.update({selection:Cu(n.ranges,a),effects:fa.of(s?null:new ei(n.ranges,a)),scrollIntoView:!0})),!0}}const iU=({state:i,dispatch:e})=>i.field(aa,!1)?(e(i.update({effects:fa.of(null)})),!0):!1,aU=Z2(1),sU=Z2(-1),rU=[{key:"Tab",run:aU,shift:sU},{key:"Escape",run:iU}],Td=Q.define({combine(i){return i.length?i[0]:rU}}),oU=f1.highest(Xi.compute([Td],i=>i.facet(Td)));function Du(i,e){return{...e,apply:nU(i)}}const lU=$.domEventHandlers({mousedown(i,e){let t=e.state.field(aa,!1),n;if(!t||(n=e.posAtCoords({x:i.clientX,y:i.clientY}))==null)return!1;let a=t.ranges.find(s=>s.from<=n&&s.to>=n);return!a||a.field==t.active?!1:(e.dispatch({selection:Cu(t.ranges,a.field),effects:fa.of(t.ranges.some(s=>s.field>a.field)?new ei(t.ranges,a.field):null),scrollIntoView:!0}),!0)}}),sa={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},a1=pe.define({map(i,e){let t=e.mapPos(i,-1,lt.TrackAfter);return t??void 0}}),Bu=new class extends Fn{};Bu.startSide=1;Bu.endSide=-1;const L2=Nt.define({create(){return oe.empty},update(i,e){if(i=i.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);i=i.update({filter:n=>n>=t.from&&n<=t.to})}for(let t of e.effects)t.is(a1)&&(i=i.update({add:[Bu.range(t.value,t.value+1)]}));return i}});function uU(){return[cU,L2]}const Do="()[]{}<>«»»«[]{}";function W2(i){for(let e=0;e{if((mU?i.composing:i.compositionStarted)||i.state.readOnly)return!1;let a=i.state.selection.main;if(n.length>2||n.length==2&&xn(Pt(n,0))==1||e!=a.from||t!=a.to)return!1;let s=gU(i.state,n);return s?(i.dispatch(s),!0):!1}),dU=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let n=E2(i,i.selection.main.head).brackets||sa.brackets,a=null,s=i.changeByRange(r=>{if(r.empty){let o=pU(i.doc,r.head);for(let l of n)if(l==o&&Nr(i.doc,r.head)==W2(Pt(l,0)))return{changes:{from:r.head-l.length,to:r.head+l.length},range:O.cursor(r.head-l.length)}}return{range:a=r}});return a||e(i.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!a},hU=[{key:"Backspace",run:dU}];function gU(i,e){let t=E2(i,i.selection.main.head),n=t.brackets||sa.brackets;for(let a of n){let s=W2(Pt(a,0));if(e==a)return s==a?xU(i,a,n.indexOf(a+a+a)>-1,t):fU(i,a,s,t.before||sa.before);if(e==s&&N2(i,i.selection.main.from))return bU(i,a,s)}return null}function N2(i,e){let t=!1;return i.field(L2).between(0,i.doc.length,n=>{n==e&&(t=!0)}),t}function Nr(i,e){let t=i.sliceString(e,e+2);return t.slice(0,xn(Pt(t,0)))}function pU(i,e){let t=i.sliceString(e-2,e);return xn(Pt(t,0))==t.length?t:t.slice(1)}function fU(i,e,t,n){let a=null,s=i.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:t,from:r.to}],effects:a1.of(r.to+e.length),range:O.range(r.anchor+e.length,r.head+e.length)};let o=Nr(i.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+t,from:r.head},effects:a1.of(r.head+e.length),range:O.cursor(r.head+e.length)}:{range:a=r}});return a?null:i.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function bU(i,e,t){let n=null,a=i.changeByRange(s=>s.empty&&Nr(i.doc,s.head)==t?{changes:{from:s.head,to:s.head+t.length,insert:t},range:O.cursor(s.head+t.length)}:n={range:s});return n?null:i.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function xU(i,e,t,n){let a=n.stringPrefixes||sa.stringPrefixes,s=null,r=i.changeByRange(o=>{if(!o.empty)return{changes:[{insert:e,from:o.from},{insert:e,from:o.to}],effects:a1.of(o.to+e.length),range:O.range(o.anchor+e.length,o.head+e.length)};let l=o.head,u=Nr(i.doc,l),m;if(u==e){if(_d(i,l))return{changes:{insert:e+e,from:l},effects:a1.of(l+e.length),range:O.cursor(l+e.length)};if(N2(i,l)){let d=t&&i.sliceDoc(l,l+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:l,to:l+d.length,insert:d},range:O.cursor(l+d.length)}}}else{if(t&&i.sliceDoc(l-2*e.length,l)==e+e&&(m=Ad(i,l-2*e.length,a))>-1&&_d(i,m))return{changes:{insert:e+e+e+e,from:l},effects:a1.of(l+e.length),range:O.cursor(l+e.length)};if(i.charCategorizer(l)(u)!=Mt.Word&&Ad(i,l,a)>-1&&!vU(i,l,e,a))return{changes:{insert:e+e,from:l},effects:a1.of(l+e.length),range:O.cursor(l+e.length)}}return{range:s=o}});return s?null:i.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function _d(i,e){let t=et(i).resolveInner(e+1);return t.parent&&t.from==e}function vU(i,e,t,n){let a=et(i).resolveInner(e,-1),s=n.reduce((r,o)=>Math.max(r,o.length),0);for(let r=0;r<5;r++){let o=i.sliceDoc(a.from,Math.min(a.to,a.from+t.length+s)),l=o.indexOf(t);if(!l||l>-1&&n.indexOf(o.slice(0,l))>-1){let m=a.firstChild;for(;m&&m.from==a.from&&m.to-m.from>t.length+l;){if(i.sliceDoc(m.to-t.length,m.to)==t)return!1;m=m.firstChild}return!0}let u=a.to==e&&a.parent;if(!u)break;a=u}return!1}function Ad(i,e,t){let n=i.charCategorizer(e);if(n(i.sliceDoc(e-1,e))!=Mt.Word)return e;for(let a of t){let s=e-a.length;if(i.sliceDoc(s,e)==a&&n(i.sliceDoc(s-1,s))!=Mt.Word)return s}return-1}function wU(i={}){return[Yq,xt,Ve.of(i),Qq,yU,M2]}const F2=[{key:"Ctrl-Space",run:Co},{mac:"Alt-`",run:Co},{mac:"Alt-i",run:Co},{key:"Escape",run:Hq},{key:"ArrowDown",run:ts(!0)},{key:"ArrowUp",run:ts(!1)},{key:"PageDown",run:ts(!0,"page")},{key:"PageUp",run:ts(!1,"page")},{key:"Enter",run:Gq}],yU=f1.highest(Xi.computeN([Ve],i=>i.facet(Ve).defaultKeymap?[F2]:[])),zU=i=>{let{state:e}=i,t=e.doc.lineAt(e.selection.main.from),n=Ou(i.state,t.from);return n.line?IU(i):n.block?SU(i):!1};function Pu(i,e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let a=i(e,t);return a?(n(t.update(a)),!0):!1}}const IU=Pu(AU,0),kU=Pu(R2,0),SU=Pu((i,e)=>R2(i,e,_U(e)),0);function Ou(i,e){let t=i.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}const di=50;function TU(i,{open:e,close:t},n,a){let s=i.sliceDoc(n-di,n),r=i.sliceDoc(a,a+di),o=/\s*$/.exec(s)[0].length,l=/^\s*/.exec(r)[0].length,u=s.length-o;if(s.slice(u-e.length,u)==e&&r.slice(l,l+t.length)==t)return{open:{pos:n-o,margin:o&&1},close:{pos:a+l,margin:l&&1}};let m,c;a-n<=2*di?m=c=i.sliceDoc(n,a):(m=i.sliceDoc(n,n+di),c=i.sliceDoc(a-di,a));let d=/^\s*/.exec(m)[0].length,h=/\s*$/.exec(c)[0].length,g=c.length-h-t.length;return m.slice(d,d+e.length)==e&&c.slice(g,g+t.length)==t?{open:{pos:n+d+e.length,margin:/\s/.test(m.charAt(d+e.length))?1:0},close:{pos:a-h-t.length,margin:/\s/.test(c.charAt(g-1))?1:0}}:null}function _U(i){let e=[];for(let t of i.selection.ranges){let n=i.doc.lineAt(t.from),a=t.to<=n.to?n:i.doc.lineAt(t.to);a.from>n.from&&a.from==t.to&&(a=t.to==n.to+1?n:i.doc.lineAt(t.to-1));let s=e.length-1;s>=0&&e[s].to>n.from?e[s].to=a.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:a.to})}return e}function R2(i,e,t=e.selection.ranges){let n=t.map(s=>Ou(e,s.from).block);if(!n.every(s=>s))return null;let a=t.map((s,r)=>TU(e,n[r],s.from,s.to));if(i!=2&&!a.every(s=>s))return{changes:e.changes(t.map((s,r)=>a[r]?[]:[{from:s.from,insert:n[r].open+" "},{from:s.to,insert:" "+n[r].close}]))};if(i!=1&&a.some(s=>s)){let s=[];for(let r=0,o;ra&&(s==r||r>c.from)){a=c.from;let d=/^\s*/.exec(c.text)[0].length,h=d==c.length,g=c.text.slice(d,d+u.length)==u?d:-1;ds.comment<0&&(!s.empty||s.single))){let s=[];for(let{line:o,token:l,indent:u,empty:m,single:c}of n)(c||!m)&&s.push({from:o.from+u,insert:l+" "});let r=e.changes(s);return{changes:r,selection:e.selection.map(r,1)}}else if(i!=1&&n.some(s=>s.comment>=0)){let s=[];for(let{line:r,comment:o,token:l}of n)if(o>=0){let u=r.from+o,m=u+l.length;r.text[m-r.from]==" "&&m++,s.push({from:u,to:m})}return{changes:s}}return null}function ti(i,e){return O.create(i.ranges.map(e),i.mainIndex)}function Qt(i,e){return i.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function $t({state:i,dispatch:e},t){let n=ti(i.selection,t);return n.eq(i.selection,!0)?!1:(e(Qt(i,n)),!0)}function Fr(i,e){return O.cursor(e?i.to:i.from)}function J2(i,e){return $t(i,t=>t.empty?i.moveByChar(t,e):Fr(t,e))}function mt(i){return i.textDirectionAt(i.state.selection.main.head)==ze.LTR}const G2=i=>J2(i,!mt(i)),H2=i=>J2(i,mt(i));function V2(i,e){return $t(i,t=>t.empty?i.moveByGroup(t,e):Fr(t,e))}const jU=i=>V2(i,!mt(i)),CU=i=>V2(i,mt(i));function DU(i,e,t){if(e.type.prop(t))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(i.sliceDoc(e.from,e.to)))||e.firstChild}function Rr(i,e,t){let n=et(i).resolveInner(e.head),a=t?le.closedBy:le.openedBy;for(let l=e.head;;){let u=t?n.childAfter(l):n.childBefore(l);if(!u)break;DU(i,u,a)?n=u:l=t?u.to:u.from}let s=n.type.prop(a),r,o;return s&&(r=t?un(i,n.from,1):un(i,n.to,-1))&&r.matched?o=t?r.end.to:r.end.from:o=t?n.to:n.from,O.cursor(o,t?-1:1)}const BU=i=>$t(i,e=>Rr(i.state,e,!mt(i))),PU=i=>$t(i,e=>Rr(i.state,e,mt(i)));function q2(i,e){return $t(i,t=>{if(!t.empty)return Fr(t,e);let n=i.moveVertically(t,e);return n.head!=t.head?n:i.moveToLineBoundary(t,e)})}const U2=i=>q2(i,!1),Q2=i=>q2(i,!0);function $2(i){let e=i.scrollDOM.clientHeightr.empty?i.moveVertically(r,e,t.height):Fr(r,e));if(a.eq(n.selection))return!1;let s;if(t.selfScroll){let r=i.coordsAtPos(n.selection.main.head),o=i.scrollDOM.getBoundingClientRect(),l=o.top+t.marginTop,u=o.bottom-t.marginBottom;r&&r.top>l&&r.bottomY2(i,!1),m0=i=>Y2(i,!0);function qn(i,e,t){let n=i.lineBlockAt(e.head),a=i.moveToLineBoundary(e,t);if(a.head==e.head&&a.head!=(t?n.to:n.from)&&(a=i.moveToLineBoundary(e,t,!1)),!t&&a.head==n.from&&n.length){let s=/^\s*/.exec(i.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;s&&e.head!=n.from+s&&(a=O.cursor(n.from+s))}return a}const OU=i=>$t(i,e=>qn(i,e,!0)),MU=i=>$t(i,e=>qn(i,e,!1)),ZU=i=>$t(i,e=>qn(i,e,!mt(i))),LU=i=>$t(i,e=>qn(i,e,mt(i))),WU=i=>$t(i,e=>i.moveToLineBoundary(e,!1,!1)),EU=i=>$t(i,e=>i.moveToLineBoundary(e,!0,!1));function NU(i,e,t){let n=!1,a=ti(i.selection,s=>{let r=un(i,s.head,-1)||un(i,s.head,1)||s.head>0&&un(i,s.head-1,1)||s.headNU(i,e);function Ft(i,e,t){let n=ti(i.state.selection,a=>{a.undirectional&&a.head>=a.anchor!=e&&(a=O.range(a.head,a.anchor));let s=t(a);return O.range(a.anchor,s.head,s.goalColumn,s.bidiLevel||void 0,s.assoc)});return n.eq(i.state.selection)?!1:(i.dispatch(Qt(i.state,n)),!0)}function K2(i,e){return Ft(i,e,t=>i.moveByChar(t,e))}const X2=i=>K2(i,!mt(i)),e3=i=>K2(i,mt(i));function t3(i,e){return Ft(i,e,t=>i.moveByGroup(t,e))}const RU=i=>t3(i,!mt(i)),JU=i=>t3(i,mt(i)),GU=i=>{let e=!mt(i);return Ft(i,e,t=>Rr(i.state,t,e))},HU=i=>{let e=mt(i);return Ft(i,e,t=>Rr(i.state,t,e))};function n3(i,e){return Ft(i,e,t=>i.moveVertically(t,e))}const i3=i=>n3(i,!1),a3=i=>n3(i,!0);function s3(i,e){return Ft(i,e,t=>i.moveVertically(t,e,$2(i).height))}const Cd=i=>s3(i,!1),Dd=i=>s3(i,!0),VU=i=>Ft(i,!0,e=>qn(i,e,!0)),qU=i=>Ft(i,!1,e=>qn(i,e,!1)),UU=i=>{let e=!mt(i);return Ft(i,e,t=>qn(i,t,e))},QU=i=>{let e=mt(i);return Ft(i,e,t=>qn(i,t,e))},$U=i=>Ft(i,!1,e=>O.cursor(i.lineBlockAt(e.head).from)),YU=i=>Ft(i,!0,e=>O.cursor(i.lineBlockAt(e.head).to)),Bd=({state:i,dispatch:e})=>(e(Qt(i,{anchor:0})),!0),Pd=({state:i,dispatch:e})=>(e(Qt(i,{anchor:i.doc.length})),!0),Od=({state:i,dispatch:e})=>(e(Qt(i,{anchor:i.selection.main.anchor,head:0})),!0),Md=({state:i,dispatch:e})=>(e(Qt(i,{anchor:i.selection.main.anchor,head:i.doc.length})),!0),KU=({state:i,dispatch:e})=>(e(i.update({selection:{anchor:0,head:i.doc.length},userEvent:"select"})),!0),XU=({state:i,dispatch:e})=>{let t=Jr(i).map(({from:n,to:a})=>O.undirectionalRange(n,Math.min(a+1,i.doc.length)));return e(i.update({selection:O.create(t),userEvent:"select"})),!0},eQ=({state:i,dispatch:e})=>{let t=ti(i.selection,n=>{let a=et(i),s=a.resolveStack(n.from,1);if(n.empty){let r=a.resolveStack(n.from,-1);r.node.from>=s.node.from&&r.node.to<=s.node.to&&(s=r)}for(let r=s;r;r=r.next){let{node:o}=r;if((o.from=n.to||o.to>n.to&&o.from<=n.from)&&r.next)return O.undirectionalRange(o.from,o.to)}return n});return t.eq(i.selection)?!1:(e(Qt(i,t)),!0)};function r3(i,e){let{state:t}=i,n=t.selection,a=t.selection.ranges.slice();for(let s of t.selection.ranges){let r=t.doc.lineAt(s.head);if(e?r.to0)for(let o=s;;){let l=i.moveVertically(o,e);if(l.headr.to){a.some(u=>u.head==l.head)||a.push(l);break}else{if(l.head==o.head)break;o=l}}}return a.length==n.ranges.length?!1:(i.dispatch(Qt(t,O.create(a,a.length-1))),!0)}const tQ=i=>r3(i,!1),nQ=i=>r3(i,!0),iQ=({state:i,dispatch:e})=>{let t=i.selection,n=null;return t.ranges.length>1?n=O.create([t.main]):t.main.empty||(n=O.create([O.cursor(t.main.head)])),n?(e(Qt(i,n)),!0):!1};function ba(i,e){if(i.state.readOnly)return!1;let t="delete.selection",{state:n}=i,a=n.changeByRange(s=>{let{from:r,to:o}=s;if(r==o){let l=e(s);lr&&(t="delete.forward",l=ns(i,l,!0)),r=Math.min(r,l),o=Math.max(o,l)}else r=ns(i,r,!1),o=ns(i,o,!0);return r==o?{range:s}:{changes:{from:r,to:o},range:O.cursor(r,ra(i)))n.between(e,e,(a,s)=>{ae&&(e=t?s:a)});return e}const o3=(i,e,t)=>ba(i,n=>{let a=n.from,{state:s}=i,r=s.doc.lineAt(a),o,l;if(t&&!e&&a>r.from&&ao3(i,!1,!0),l3=i=>o3(i,!0,!1),u3=(i,e)=>ba(i,t=>{let n=t.head,{state:a}=i,s=a.doc.lineAt(n),r=a.charCategorizer(n);for(let o=null;;){if(n==(e?s.to:s.from)){n==t.head&&s.number!=(e?a.doc.lines:1)&&(n+=e?1:-1);break}let l=ut(s.text,n-s.from,e)+s.from,u=s.text.slice(Math.min(n,l)-s.from,Math.max(n,l)-s.from),m=r(u);if(o!=null&&m!=o)break;(u!=" "||n!=t.head)&&(o=m),n=l}return n}),m3=i=>u3(i,!1),aQ=i=>u3(i,!0),sQ=i=>ba(i,e=>{let t=i.lineBlockAt(e.head).to;return e.headba(i,e=>{let t=i.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),oQ=i=>ba(i,e=>{let t=i.moveToLineBoundary(e,!0).head;return e.head{if(i.readOnly)return!1;let t=i.changeByRange(n=>({changes:{from:n.from,to:n.to,insert:he.of(["",""])},range:O.cursor(n.from)}));return e(i.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},uQ=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=i.changeByRange(n=>{if(!n.empty||n.from==0||n.from==i.doc.length)return{range:n};let a=n.from,s=i.doc.lineAt(a),r=a==s.from?a-1:ut(s.text,a-s.from,!1)+s.from,o=a==s.to?a+1:ut(s.text,a-s.from,!0)+s.from;return{changes:{from:r,to:o,insert:i.doc.slice(a,o).append(i.doc.slice(r,a))},range:O.cursor(o)}});return t.changes.empty?!1:(e(i.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function Jr(i){let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.from),s=i.doc.lineAt(n.to);if(!n.empty&&n.to==s.from&&(s=i.doc.lineAt(n.to-1)),t>=a.number){let r=e[e.length-1];r.to=s.to,r.ranges.push(n)}else e.push({from:a.from,to:s.to,ranges:[n]});t=s.number+1}return e}function c3(i,e,t){if(i.readOnly)return!1;let n=[],a=[];for(let s of Jr(i)){if(t?s.to==i.doc.length:s.from==0)continue;let r=i.doc.lineAt(t?s.to+1:s.from-1),o=r.length+1;if(t){n.push({from:s.to,to:r.to},{from:s.from,insert:r.text+i.lineBreak});for(let l of s.ranges)a.push(O.range(Math.min(i.doc.length,l.anchor+o),Math.min(i.doc.length,l.head+o)))}else{n.push({from:r.from,to:s.from},{from:s.to,insert:i.lineBreak+r.text});for(let l of s.ranges)a.push(O.range(l.anchor-o,l.head-o))}}return n.length?(e(i.update({changes:n,scrollIntoView:!0,selection:O.create(a,i.selection.mainIndex),userEvent:"move.line"})),!0):!1}const mQ=({state:i,dispatch:e})=>c3(i,e,!1),cQ=({state:i,dispatch:e})=>c3(i,e,!0);function d3(i,e,t){if(i.readOnly)return!1;let n=[];for(let s of Jr(i))t?n.push({from:s.from,insert:i.doc.slice(s.from,s.to)+i.lineBreak}):n.push({from:s.to,insert:i.lineBreak+i.doc.slice(s.from,s.to)});let a=i.changes(n);return e(i.update({changes:a,selection:i.selection.map(a,t?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}const dQ=({state:i,dispatch:e})=>d3(i,e,!1),hQ=({state:i,dispatch:e})=>d3(i,e,!0),gQ=i=>{if(i.state.readOnly)return!1;let{state:e}=i,t=e.changes(Jr(e).map(({from:a,to:s})=>(a>0?a--:s{let s;if(i.lineWrapping){let r=i.lineBlockAt(a.head),o=i.coordsAtPos(a.head,a.assoc||1);o&&(s=r.bottom+i.documentTop-o.bottom+i.defaultLineHeight/2)}return i.moveVertically(a,!0,s)}).map(t);return i.dispatch({changes:t,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0};function pQ(i,e){if(/\(\)|\[\]|\{\}/.test(i.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=et(i).resolveInner(e),n=t.childBefore(e),a=t.childAfter(e),s;return n&&a&&n.to<=e&&a.from>=e&&(s=n.type.prop(le.closedBy))&&s.indexOf(a.name)>-1&&i.doc.lineAt(n.to).from==i.doc.lineAt(a.from).from&&!/\S/.test(i.sliceDoc(n.to,a.from))?{from:n.to,to:a.from}:null}const Zd=h3(!1),fQ=h3(!0);function h3(i){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(a=>{let{from:s,to:r}=a,o=e.doc.lineAt(s),l=!i&&s==r&&pQ(e,s);i&&(s=r=(r<=o.to?o:e.doc.lineAt(r)).to);let u=new Wr(e,{simulateBreak:s,simulateDoubleBreak:!!l}),m=zu(u,s);for(m==null&&(m=ca(/^\s*/.exec(e.doc.lineAt(s).text)[0],e.tabSize));ro.from&&s{let a=[];for(let r=n.from;r<=n.to;){let o=i.doc.lineAt(r);o.number>t&&(n.empty||n.to>o.from)&&(e(o,a,n),t=o.number),r=o.to+1}let s=i.changes(a);return{changes:a,range:O.range(s.mapPos(n.anchor,1),s.mapPos(n.head,1))}})}const bQ=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=Object.create(null),n=new Wr(i,{overrideIndentation:s=>{let r=t[s];return r??-1}}),a=Mu(i,(s,r,o)=>{let l=zu(n,s.from);if(l==null)return;/\S/.test(s.text)||(l=0);let u=/^\s*/.exec(s.text)[0],m=na(i,l);(u!=m||o.fromi.readOnly?!1:(e(i.update(Mu(i,(t,n)=>{n.push({from:t.from,insert:i.facet(pa)})}),{userEvent:"input.indent"})),!0),p3=({state:i,dispatch:e})=>i.readOnly?!1:(e(i.update(Mu(i,(t,n)=>{let a=/^\s*/.exec(t.text)[0];if(!a)return;let s=ca(a,i.tabSize),r=0,o=na(i,Math.max(0,s-lr(i)));for(;r(i.setTabFocusMode(),!0),vQ=[{key:"Ctrl-b",run:G2,shift:X2,preventDefault:!0},{key:"Ctrl-f",run:H2,shift:e3},{key:"Ctrl-p",run:U2,shift:i3},{key:"Ctrl-n",run:Q2,shift:a3},{key:"Ctrl-a",run:WU,shift:$U},{key:"Ctrl-e",run:EU,shift:YU},{key:"Ctrl-d",run:l3},{key:"Ctrl-h",run:c0},{key:"Ctrl-k",run:sQ},{key:"Ctrl-Alt-h",run:m3},{key:"Ctrl-o",run:lQ},{key:"Ctrl-t",run:uQ},{key:"Ctrl-v",run:m0}],wQ=[{key:"ArrowLeft",run:G2,shift:X2,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:jU,shift:RU,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:ZU,shift:UU,preventDefault:!0},{key:"ArrowRight",run:H2,shift:e3,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:CU,shift:JU,preventDefault:!0},{mac:"Cmd-ArrowRight",run:LU,shift:QU,preventDefault:!0},{key:"ArrowUp",run:U2,shift:i3,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Bd,shift:Od},{mac:"Ctrl-ArrowUp",run:jd,shift:Cd},{key:"ArrowDown",run:Q2,shift:a3,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Pd,shift:Md},{mac:"Ctrl-ArrowDown",run:m0,shift:Dd},{key:"PageUp",run:jd,shift:Cd},{key:"PageDown",run:m0,shift:Dd},{key:"Home",run:MU,shift:qU,preventDefault:!0},{key:"Mod-Home",run:Bd,shift:Od},{key:"End",run:OU,shift:VU,preventDefault:!0},{key:"Mod-End",run:Pd,shift:Md},{key:"Enter",run:Zd,shift:Zd},{key:"Mod-a",run:KU},{key:"Backspace",run:c0,shift:c0,preventDefault:!0},{key:"Delete",run:l3,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:m3,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:aQ,preventDefault:!0},{mac:"Mod-Backspace",run:rQ,preventDefault:!0},{mac:"Mod-Delete",run:oQ,preventDefault:!0}].concat(vQ.map(i=>({mac:i.key,run:i.run,shift:i.shift}))),yQ=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:BU,shift:GU},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:PU,shift:HU},{key:"Alt-ArrowUp",run:mQ},{key:"Shift-Alt-ArrowUp",run:dQ},{key:"Alt-ArrowDown",run:cQ},{key:"Shift-Alt-ArrowDown",run:hQ},{key:"Mod-Alt-ArrowUp",run:tQ},{key:"Mod-Alt-ArrowDown",run:nQ},{key:"Escape",run:iQ},{key:"Mod-Enter",run:fQ},{key:"Alt-l",mac:"Ctrl-l",run:XU},{key:"Mod-i",run:eQ,preventDefault:!0},{key:"Mod-[",run:p3},{key:"Mod-]",run:g3},{key:"Mod-Alt-\\",run:bQ},{key:"Shift-Mod-k",run:gQ},{key:"Shift-Mod-\\",run:FU},{key:"Mod-/",run:zU},{key:"Alt-A",mac:"Ctrl-A",run:kU},{key:"Ctrl-m",mac:"Shift-Alt-m",run:xQ}].concat(wQ),zQ={key:"Tab",run:g3,shift:p3};var Ld={};class cr{constructor(e,t,n,a,s,r,o,l,u,m=0,c){this.p=e,this.stack=t,this.state=n,this.reducePos=a,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=l,this.curContext=u,this.lookAhead=m,this.parent=c}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,n=0){let a=e.parser.context;return new cr(e,[],t,n,n,0,[],0,a?new Wd(a,a.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let n=e>>19,a=e&65535,{parser:s}=this.p,r=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[a])===null||t===void 0)&&t.isAnonymous)&&(u==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=m):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(a,u)}storeNode(e,t,n,a=4,s=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&this.buffer[r-4]==0&&this.buffer[r-1]>-1){if(t==n)return;if(this.buffer[r-2]>=t){this.buffer[r-2]=n;return}}}if(!s||this.pos==n)this.buffer.push(e,t,n,a);else{let r=this.buffer.length;if(r>0&&(this.buffer[r-4]!=0||this.buffer[r-1]<0)){let o=!1;for(let l=r;l>0&&this.buffer[l-2]>n;l-=4)if(this.buffer[l-1]>=0){o=!0;break}if(o)for(;r>0&&this.buffer[r-2]>n;)this.buffer[r]=this.buffer[r-4],this.buffer[r+1]=this.buffer[r-3],this.buffer[r+2]=this.buffer[r-2],this.buffer[r+3]=this.buffer[r-1],r-=4,a>4&&(a-=4)}this.buffer[r]=e,this.buffer[r+1]=t,this.buffer[r+2]=n,this.buffer[r+3]=a}}shift(e,t,n,a){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let s=e,{parser:r}=this.p;this.pos=a;let o=r.stateFlag(s,1);!o&&(a>n||t<=r.maxNode)&&(this.reducePos=a),this.pushState(s,o?n:Math.min(n,this.reducePos)),this.shiftContext(t,n),t<=r.maxNode&&this.buffer.push(t,n,a,4)}else this.pos=a,this.shiftContext(t,n),t<=this.p.parser.maxNode&&this.buffer.push(t,n,a,4)}apply(e,t,n,a){e&65536?this.reduce(e):this.shift(e,t,n,a)}useNode(e,t,n){let a=this.p.reused.length-1;(a<0||this.p.reused[a]!=e)&&(this.p.reused.push(e),a++);let s=this.reducePos=this.pos=n+e.length;this.pushState(t,n),this.buffer.push(a,n,s,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(t&&e.buffer[t-4]==0&&(t-=4);t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let n=e.buffer.slice(t),a=e.bufferBase+t;for(;e&&a==e.bufferBase;)e=e.parent;return new cr(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,n,a,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let n=e<=this.p.parser.maxNode;n&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,n?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new IQ(this);;){let n=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(n==0)return!1;if((n&65536)==0)return!0;t.reduce(n)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let a=[];for(let s=0,r;sl&1&&o==r)||a.push(t[s],r)}t=a}let n=[];for(let a=0;a>19,a=t&65535,s=this.stack.length-n*3;if(s<0||e.getGoto(this.stack[s],a,!1)<0){let r=this.findForcedReduction();if(r==null)return!1;t=r}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],n=(a,s)=>{if(!t.includes(a))return t.push(a),e.allActions(a,r=>{if(!(r&393216))if(r&65536){let o=(r>>19)-s;if(o>1){let l=r&65535,u=this.stack.length-o*3;if(u>=0&&e.getGoto(this.stack[u],l,!1)>=0)return o<<19|65536|l}}else{let o=n(r,s+1);if(o!=null)return o}})};return n(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}}class Wd{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class IQ{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,n=e>>19;n==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(n-1)*3;let a=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=a}}class dr{constructor(e,t,n){this.stack=e,this.pos=t,this.index=n,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new dr(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new dr(this.stack,this.pos,this.index)}}function is(i,e=Uint16Array){if(typeof i!="string")return i;let t=null;for(let n=0,a=0;n=92&&r--,r>=34&&r--;let l=r-32;if(l>=46&&(l-=46,o=!0),s+=l,o)break;s*=46}t?t[a++]=s:t=new e(s)}return t}class ks{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Ed=new ks;class kQ{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Ed,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let n=this.range,a=this.rangeIndex,s=this.pos+e;for(;sn.to:s>=n.to;){if(a==this.ranges.length-1)return null;let r=this.ranges[++a];s+=r.from-n.to,n=r}return s}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,n,a;if(t>=0&&t=this.chunk2Pos&&no.to&&(this.chunk2=this.chunk2.slice(0,o.to-n)),a=this.chunk2.charCodeAt(0)}}return n>=this.token.lookAhead&&(this.token.lookAhead=n+1),a}acceptToken(e,t=0){let n=t?this.resolveOffset(t,-1):this.pos;if(n==null||n=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Ed,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let n="";for(let a of this.ranges){if(a.from>=t)break;a.to>e&&(n+=this.input.read(Math.max(a.from,e),Math.min(a.to,t)))}return n}}class J1{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:n}=t.p;SQ(this.data,e,t,this.id,n.data,n.tokenPrecTable)}}J1.prototype.contextual=J1.prototype.fallback=J1.prototype.extend=!1;J1.prototype.fallback=J1.prototype.extend=!1;function SQ(i,e,t,n,a,s){let r=0,o=1<0){let g=i[h];if(l.allows(g)&&(e.token.value==-1||e.token.value==g||TQ(g,e.token.value,a,s))){e.acceptToken(g);break}}let m=e.next,c=0,d=i[r+2];if(e.next<0&&d>c&&i[u+d*3-3]==65535){r=i[u+d*3-1];continue e}for(;c>1,g=u+h+(h<<1),f=i[g],b=i[g+1]||65536;if(m=b)c=h+1;else{r=i[g+2],e.advance();continue e}}break}}function Nd(i,e,t){for(let n=e,a;(a=i[n])!=65535;n++)if(a==t)return n-e;return-1}function TQ(i,e,t,n){let a=Nd(t,n,e);return a<0||Nd(t,n,i)e)&&!n.type.isError)return t<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(i.length,Math.max(n.from+1,e+25));if(t<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return t<0?0:i.length}}class _Q{constructor(e,t){this.fragments=e,this.minRepeat=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.lastRepeat=null,this.lastRepeatPos=-1,this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?Fd(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?Fd(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(s instanceof Ee){let o=r>this.lastRepeatPos&&s.type.id>=this.minRepeat;if(r==e||o){let l=r+s.length,u;if(r>=this.safeFrom&&l<=this.safeTo&&(!(u=s.prop(le.lookAhead))||l+u=Math.max(this.safeFrom,e)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[t]++,this.nextStart=r+s.length}}}class AQ{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(n=>new ks)}getActions(e){let t=0,n=null,{parser:a}=e.p,{tokenizers:s}=a,r=a.stateSlot(e.state,3),o=e.curContext?e.curContext.hash:0,l=0;for(let u=0;uc.end+25&&(l=Math.max(c.lookAhead,l)),c.value!=0)){let d=t;if(c.extended>-1&&(t=this.addActions(e,c.extended,c.end,t)),t=this.addActions(e,c.value,c.end,t),!m.extend&&(n=c,t>d))break}}for(;this.actions.length>t;)this.actions.pop();return l&&e.setLookAhead(l),!n&&e.pos==this.stream.end&&(n=new ks,n.value=e.p.parser.eofTerm,n.start=n.end=e.pos,t=this.addActions(e,n.value,n.end,t)),this.mainToken=n,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new ks,{pos:n,p:a}=e;return t.start=n,t.end=Math.min(n+1,a.stream.end),t.value=n==a.stream.end?a.parser.eofTerm:0,t}updateCachedToken(e,t,n){let a=this.stream.clipPos(n.pos);if(t.token(this.stream.reset(a,e),n),e.value>-1){let{parser:s}=n.p;for(let r=0;r=0&&n.p.parser.dialect.allows(o>>1)){(o&1)==0?e.value=o>>1:e.extended=o>>1;break}}}else e.value=0,e.end=this.stream.clipPos(a+1)}putAction(e,t,n,a){for(let s=0;se.bufferLength*4?new _Q(n,e.minRepeatTerm):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,n=this.stacks=[],a,s;if(this.bigReductionCount>300&&e.length==1){let[r]=e;for(;r.forceReduce()&&r.stack.length&&r.stack[r.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rt)n.push(o);else{if(this.advanceStack(o,n,e))continue;{a||(a=[],s=[]),a.push(o);let l=this.tokens.getMainToken(o);s.push(l.value,l.end)}}break}}if(!n.length){let r=a&&DQ(a);if(r)return yt&&console.log("Finish with "+this.stackID(r)),this.stackToTree(r);if(this.parser.strict)throw yt&&a&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&a){let r=this.stoppedAt!=null&&a[0].pos>this.stoppedAt?a[0]:this.runRecovery(a,s,n);if(r)return yt&&console.log("Force-finish "+this.stackID(r)),this.stackToTree(r.forceAll())}if(this.recovering){let r=this.recovering==1?1:this.recovering*3;if(n.length>r)for(n.sort((o,l)=>l.score-o.score);n.length>r;)n.pop();n.some(o=>o.reducePos>t)&&this.recovering--}else if(n.length>1){e:for(let r=0;r500&&u.buffer.length>500)if((o.score-u.score||o.buffer.length-u.buffer.length)>0)n.splice(l--,1);else{n.splice(r--,1);continue e}}}n.length>12&&(n.sort((r,o)=>o.score-r.score),n.splice(12,n.length-12))}this.minStackPos=n[0].pos;for(let r=1;r-1&&n.length&&(!s||(n.prop(le.contextHash)||0)==r))return e.useNode(n,o,t),n;if(n.children.length==0||n.positions[0]>0)break;let l=n.children[0];if(l instanceof Ee&&(!a||l.type.id>=this.parser.minRepeatTerm))n=l;else break}return null}advanceStack(e,t,n){let a=e.pos,{parser:s}=this,r=yt?this.stackID(e)+" -> ":"";if(this.stoppedAt!=null&&a>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let u=e.reducePos0)return e.reduce(o),yt&&console.log(r+this.stackID(e)+` (via always-reduce ${s.getName(o&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let l=this.tokens.getActions(e);for(let u=0;ua?t.push(g):n.push(g)}return!1}advanceFully(e,t){let n=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>n)return Rd(e,t),!0}}runRecovery(e,t,n){let a=null,s=!1;for(let r=0;r ":"";if(o.deadEnd&&(s||(s=!0,o.restart(),yt&&console.log(m+this.stackID(o)+" (restarted)"),this.advanceFully(o,n))))continue;let c=o.split(),d=m;for(let h=0;h<10&&c.forceReduce()&&(yt&&console.log(d+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,n));h++)yt&&(d=this.stackID(c)+" -> ");for(let h of o.recoverByInsert(l))yt&&console.log(m+this.stackID(h)+" (via recover-insert)"),this.advanceFully(h,n);this.stream.end>o.pos?(u==o.pos&&(u++,l=0),o.recoverByDelete(l,u),yt&&console.log(m+this.stackID(o)+` (via recover-delete ${this.parser.getName(l)})`),Rd(o,n)):(!a||a.scoree.topRules[o][1]),a=[];for(let o=0;o=0)s(m,l,o[u++]);else{let c=o[u+-m];for(let d=-m;d>0;d--)s(o[u++],l,c);u++}}}this.nodeSet=new xu(t.map((o,l)=>wt.define({name:l>=this.minRepeatTerm?void 0:o,id:l,props:a[l],top:n.indexOf(l)>-1,error:l==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(l)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=b2;let r=is(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let o=0;otypeof o=="number"?new J1(r,o):o),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,n){let a=new jQ(this,e,t,n);for(let s of this.wrappers)a=s(a,e,t,n);return a}getGoto(e,t,n=!1){let a=this.goto;if(t>=a[0])return-1;for(let s=a[t+1];;){let r=a[s++],o=r&1,l=a[s++];if(o&&n)return l;for(let u=s+(r>>1);s0}validAction(e,t){return!!this.allActions(e,n=>n==t?!0:null)}allActions(e,t){let n=this.stateSlot(e,4),a=n?t(n):void 0;for(let s=this.stateSlot(e,1);a==null;s+=3){if(this.data[s]==65535)if(this.data[s+1]==1)s=fn(this.data,s+2);else break;a=t(fn(this.data,s+1))}return a}nextStates(e){let t=[];for(let n=this.stateSlot(e,1);;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=fn(this.data,n+2);else break;if((this.data[n+2]&1)==0){let a=this.data[n+1];t.some((s,r)=>r&1&&s==a)||t.push(this.data[n],a)}}return t}configure(e){let t=Object.assign(Object.create(hr.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let n=this.topRules[e.top];if(!n)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=n}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(n=>{let a=e.tokenizers.find(s=>s.from==n);return a?a.to:n})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((n,a)=>{let s=e.specializers.find(o=>o.from==n.external);if(!s)return n;let r=Object.assign(Object.assign({},n),{external:s.to});return t.specializers[a]=Jd(r),r})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),n=t.map(()=>!1);if(e)for(let s of e.split(" ")){let r=t.indexOf(s);r>=0&&(n[r]=!0)}let a=null;for(let s=0;sn)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scorei.external(t,n)<<1|e}return i.get}const BQ=z2({null:E.null,instanceof:E.operatorKeyword,this:E.self,"new super assert open to with void":E.keyword,"class interface extends implements enum var":E.definitionKeyword,"module package import":E.moduleKeyword,"switch while for if else case default do break continue return try catch finally throw":E.controlKeyword,"requires exports opens uses provides public private protected static transitive abstract final strictfp synchronized native transient volatile throws":E.modifier,IntegerLiteral:E.integer,FloatingPointLiteral:E.float,"StringLiteral TextBlock":E.string,CharacterLiteral:E.character,LineComment:E.lineComment,BlockComment:E.blockComment,BooleanLiteral:E.bool,PrimitiveType:E.standard(E.typeName),TypeName:E.typeName,Identifier:E.variableName,"MethodName/Identifier":E.function(E.variableName),Definition:E.definition(E.variableName),ArithOp:E.arithmeticOperator,LogicOp:E.logicOperator,BitOp:E.bitwiseOperator,CompareOp:E.compareOperator,AssignOp:E.definitionOperator,UpdateOp:E.updateOperator,Asterisk:E.punctuation,Label:E.labelName,"( )":E.paren,"[ ]":E.squareBracket,"{ }":E.brace,".":E.derefOperator,", ;":E.separator}),PQ={__proto__:null,void:34,byte:36,short:36,int:36,long:36,char:36,float:36,double:36,boolean:36,extends:50,super:52,this:64,public:70,protected:72,private:74,abstract:76,static:78,final:80,strictfp:82,default:84,synchronized:86,native:88,transient:90,volatile:92,sealed:95,non:97,instanceof:140,true:158,false:158,null:166,class:170,new:176,throws:196,implements:204,permits:211,record:215,interface:226,enum:236,open:289,module:291,requires:296,transitive:298,exports:300,to:302,opens:304,uses:306,provides:308,with:310,package:314,import:318,if:330,else:332,while:336,for:340,var:347,assert:354,switch:358,case:366,throw:370,do:374,break:378,continue:382,return:386,try:392,catch:396,finally:404},OQ=hr.deserialize({version:14,states:"#5QQ]QPOOQ%QQPOOO(wQQO'#HlO+OQQO'#CbOOQO'#Cb'#CbO+VQPO'#CaOOQO'#Co'#CoO,{QPO'#DOO-iQQO'#HvOOQO'#Hv'#HvO0^QQO'#HqO0eQQO'#HqOOQO'#Hq'#HqOOQO'#Hp'#HpOOQO'#Hz'#HzO0lQPO'#GwO2`QPO'#DOO2gQPO'#CkO4vQPO'#DfO4}QPO'#CiO6ZQQO'#FsO6bQPO'#DyO7rOSO'#EQOOQO'#IW'#IWO+VQPO'#EzO8iQPO'#EzOOQO'#EV'#EVO:QQQO'#ITOnQPO'#HzO>uQPO'#EcO>uQPO'#EjO>uQPO'#EuO>uQPO'#EpO>}QPO'#I[O?cQQO'#FRO+VQPO'#C`O?kQPO'#C`O+VQPO'#FnO?pQPO'#FpO@OQPO'#FvO@OQPO'#FyO>uQPO'#GOO@TQPO'#F{O6bQPO'#GSO6bQPO'#G[O@OQPO'#GUO]QPO'#G^O@YQPO'#G`O@eQPO'#GbO@pQPO'#GdO@wQPO'#GgOAeQQO'#CjOBTQQO'#CjOB_QPO'#I`OCzQPO'#DOODbQPO'#E]OBbQPO'#E^OESQPO'#I`OEeQPO'#E]OEmQPO'#IhOErQPO'#FOOOQO'#I^'#I^OOQO'#G}'#G}Q%QQPOOOGhQPO'#HzOOQO'#Hl'#HlOHZQQO,58{OOQO'#Hj'#HjOOQO'#Hr'#HrOJtQPO,59_OLSQPO,59jOOQO-E:r-E:rO+VQPO,58zOLyQPO,58zO+VQPO,5uQPO,5:}O>uQPO,5;UO>uQPO,5;aO>uQPO,5;[O>uQPO,5gO6bQPO'#EUO@zQPO,5=QO!0rQPO,5:}O!1TQPO,5;UO!1]QPO,5;aO!1eQPO,5;[O!-SQPO,5>vO!1sQPO,5>vO!-SQPO,5>vO!2OQPO,5;mO!2aQQO,58zO!2iQQO,5zOB_QPO,5:vO!;WQPO,5:wOErQPO,5;jO!;`QPO'#E_OBbQPO'#E_O!;kQPO'#IaO!;sQPO,5:xOB_QPO,5>zO!-SQPO,5>zOEmQPO,5?SOOQO,5:w,5:wO!+VQPO'#CkOOQO,5?S,5?SO!?pQPO'#FPOOQO,5;j,5;jO!?wQPO,5;jO!-SQPO'#EaOOQO-E:{-E:{OOQO,5;i,5;iO+VQPO,58}O!?|QPO'#ChOOQO1G.k1G.kO!2aQQO1G.fO+VQPO1G.fO!@WQQO1G1tOOQO,59f,59fO!@`QPO,59fOOQO-E:t-E:tO!@eQPO,5>iO!@|QPO,59zO>uQPO'#HOO!ATQPO,5>yOOQO1G2U1G2UOOQO1G0Y1G0YO!AnQPO'#CsO!B^QPO'#HvO!BkQPO'#CtO!ByQPO'#HuO!CRQPO,59^OOQO1G.v1G.vO!#aQPO1G.vO!CiQPO,59_O!CvQQO'#HlO!DXQQO'#CbO!DjQPO,59yOOQO,59i,59iO>uQPO,59yOOQO,59W,59WO!DuQQO,59WO!DzQPO,59iO!,oQPO'#GyO!E]QPO,5>eOOQO1G.q1G.qO!EeQPO'#C}O!EvQPO1G.qO>uQPO'#GzO!E{QPO,5>mOOQO1G/k1G/kOOQO1G0[1G0[O!-SQPO'#HPO!FTQPO1G1cO6bQPO1G1cOOQO1G/l1G/lO!F]QQO1G.oOOQO1G.o1G.oO!HZQQO1G/mO!IxQQO1G/mO!KgQQO1G/mO!KnQQO1G/mO!KuQQO1G/mO!MdQQO1G/mO!MkQQO1G/mO# YQQO1G/mO# aQQO1G/mO# kQQO1G/mO# rQQO1G/|O!)dQPO'#DOO# yQQO'#HvO!*jQPO'#DuOOQO1G/y1G/yO##`QQO1G1dOOOO-E:y-E:yOOQO1G0W1G0WO##vQPO'#E{OOQO1G1Q1G1QO#$jQPO1G2UO!-{QPO1G1QO!0rQPO1G0iO!1TQPO1G0pO!1]QPO1G0{O!1eQPO1G0vOOQO1G0]1G0]O#$oQQO1G1XO}QPO'#I[OOQO1G1X1G1XO#&iQQO1G1XO#&qQQO1G1YOOQO1G1]1G1]O#&xQPO1G1]O#'TQQO'#I]O#'bQPO,5:sOOQO1G1z1G1zOOQO1G4R1G4ROOQO1G2l1G2lO#'gQPO'#EYO!-SQPO'#EdO!-SQPO'#EeO!-SQPO'#EhOOQO1G0i1G0iO#'nQPO1G0iO#'sQPO1G0iO#'{QPO1G0iO#(WQPO1G0iO#(fQPO'#ElO#(|QPO1G0pO#)UQPO1G0pO#)ZQPO'#EwOOQO1G0{1G0{O#)nQPO1G0{O#)sQPO'#EsO!-SQPO'#ErOOQO1G0v1G0vO#*pQPO1G0vO#*uQPO1G0vO#*}QPO1G0vO!1sQPO1G4bO#+YQPO'#FXO#+aQPO'#FXOOQO'#HX'#HXO#+iQQO1G1^O#-fQQO1G4bO!-SQPO1G4bO|OOQO1G0b1G0bOOQO1G4f1G4fO#DXQPO1G0bOOQO1G0c1G0cOOQO1G1U1G1UO!?wQPO1G1UOOQO,5:y,5:yO!-SQPO'#E`O#D^QPO,5:yOBbQPO'#HQO#DiQPO,5>{OOQO1G0d1G0dOEmQPO'#IbO#DqQPO1G4fOB_QPO1G4fOOQO1G4n1G4nO!)tQPO'#C}O!)dQPO'#DOOOQO,5;k,5;kO#D|QPO,5;kO#ETQPO,5;kO#E[QQO'#ITO#EcQQO'#IVO#EjQQO'#FQO#EuQPO'#FQO#E}QPO'#IcOOQO,5:{,5:{OOQO1G.i1G.iO#F]QQO'#HnO#FmQQO'#FUO#HTQPO'#F`OOQO'#Hn'#HnO#H_QPO'#HnO#H|QPO'#IkO#IUQPO,59SOOQO7+$Q7+$QO!2aQQO7+$QOOQO7+'`7+'`OOQO1G/Q1G/QO#IZQPO'#DdO#IeQQO'#IPOOQO'#IP'#IPOOQO1G/f1G/fOOQO,5=j,5=jOOQO-E:|-E:|O#IuQWO,58{O#I|QPO,59`OOQO,59`,59`O!-SQPO'#HxO!!tQPO'#GuO#J[QPO,5>aOOQO1G.x1G.xOOQO7+$b7+$bOOQO1G.r1G.rO#JdQQO1G.rO>uQPO1G/eOOQO1G/e1G/eO#JiQPO1G.rO#JnQPO1G/eOOQO1G/T1G/TOOQO,5=e,5=eOOQO-E:w-E:wOOQO7+$]7+$]OOQO,5=f,5=fOOQO-E:x-E:xOOQO,5=k,5=kOOQO-E:}-E:}O6bQPO7+&}O#JyQQO7+&}O6bQPO7+%hO#LgQQO,59_OOQO,5:a,5:aOB_QPO,5:aO#MvQPO'#EtO#NUQPO'#EtOOQO'#HW'#HWO#NpQPO,5;gOOQO,5;g,5;gOOQO7+'p7+'pOOQO7+&l7+&lOOQO7+&T7+&TO#'nQPO7+&TO#'sQPO7+&TO#'{QPO7+&TO#(WQPO7+&TO#(|QPO7+&[O#)UQPO7+&[OOQO7+&g7+&gO#)nQPO7+&gOOQO7+&b7+&bO#*pQPO7+&bO#*uQPO7+&bO#*}QPO7+&bOOQO7+&u7+&uOOQO'#FU'#FUOvOvO$ dQPO7+&sO$ rQPO7+&wOOQO7+&t7+&tOOQO7+&w7+&wO6bQPO'#G|O$!QQPO,5>wOOQO1G0_1G0_O$!]QPO,5:tOOQO,5:t,5:tOOQO,5;O,5;OOOQO'#Eg'#EgOOQO,5;P,5;POOQO,5;S,5;SO$!dQPO'#EmO!*jQPO'#EmO$!uQPO'#IdO$!}QPO,5;WO$#SQPO'#EnOOQO7+&[7+&[O$#ZQPO7+&[O$#`QPO'#ExO>uQPO'#ExO$#qQPO'#IfO$#|QPO,5;cOB_QPO'#I`O!-SQPO'#I`O$$UQPO'#E]OOQO'#HU'#HUO$$]QPO,5;_OOQO,5;_,5;_OOQO,5;^,5;^O$%YQQO7+&xO$'VQQO7+)|O$)PQQO,5;sOOQO,5;s,5;sO$)WQPO,5;sOOQO-E;V-E;VOOQO7+&x7+&xOOQO7+)|7+)|O}O$4VQPO,5;{O$4^QPO'#IjO$4fQPO,5;zO+VQPO'#HZO$4kQPO,5?VOOQO1G.n1G.nOOQO<d,5>dOOQO,5=a,5=aOOQO-E:s-E:sO$5QQPO7+$^OOQO7+%P7+%POOQO7+$^7+$^O>uQPO7+%PO$5VQQO<uQPO,5;XOOQO,5;X,5;XO$;zQPO,5;XO!,oQPO'#HSO$<]QPO,5?OOOQO1G0r1G0rODbQPO'#E]O$WQPO'#EyOOQO1G0}1G0}O$>_QPO1G0}OB_QPO,5;`OOQO-E;S-E;SOOQO1G0y1G0yOOQO<dQQO1G1_O$>kQQO<uQPO,5=VO!*jQPO,5=VOOQO1G2o1G2oOOQO<lOOQO1G/j1G/jOOQO<uQPO1G0sOOQO1G0s1G0sO$HSQPO1G0sOOQO,5=n,5=nOOQO-E;Q-E;QO$uQPO1G2qOOQO<uQPO7+&_OOQO1G0u1G0uOOQO7+&j7+&jOOQO7+'V7+'VO+VQPO'#H^O$JtQPO,5?XO$J|QPO7+'VO$KRQQO'#InOOQOAN@yAN@yO$K^QQOAN@yOOQOAN@uAN@uO$KeQPOAN@uO$KjQQO<`!>cP!=^!>{!=^P!=^P!?O!?R!?VP!{#?U#?XP0oP#?]!)]PPP#Ae#Cm#C|#DY#Dr#ET#EW#Ed#El#Eo#EsP#EvP#FU#FX#F[#F`#Ff#FiwuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u)usOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%q%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h)r){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-[-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u/}0T0j0u1S1V1Z1]1^1j2Q2R2X2Z2[2e2i2k2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n$xlOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nv!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rQ$ShS&_#`)dQ'V$UU']$[$n-VQ'd$^W(w%U,n/i1]U)o%p(^,]Q)q%qS*[&W-RU+U'_.W/vQ+]'eQ-s*oQ.T+YQ.X+ZQ0Q-_Q0]-tR0g.Yw!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rT%r!s*R${rOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n$OcObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3n^!lP!h!p'k+a.p0u|#RW!Y#`$T$Z%{&]&`&d(d(u)d*]*o+g,`,m-l-t.a/n1aS#ea3mQ$g|Q$h}Q$i!OQ$j!PW%Y!f%]+r.sS%`!i)]Q%f!jQ'W$VQ'X$WQ'Y$XQ'Z$YQ)[%aS)`%d)bQ*e&fQ*m&|S+n'w.nQ-o*nS.f+k.iQ.m+oQ0i._Q0m.eQ1r0hQ2^1sw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nU%i!l.f0mS)R%Y)`Q)c%fw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3iV#da%h3m'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ&U#YQ*Y&VX/k,s/o1^2R'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/k,s/o1^2R'fZOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/l,s/o1^2RS#XY/kS$m!Q'`S'_$[$nQ'e$^S)l%j)hQ.W+YQ.Y+ZR/v-V%mXOabepy![!]!_!b#W#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|$]$_$b$e$t$u$v$w$x%U%j%m%q%z&j&l'l'm'n'{(R(f(k(m)Z)g)h)r){*U*V*i*k+^+},^,b,c,g,j,n-T-U-Y-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ&S#WR-g*V'c]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n!w#PW!f!v#Q#R#`$O$T%X%Y%]%d%y&Q&W&`&d&|(d(u)R)b)d*l*n*o+g+r,`,m,x-R-t.a.s/m1j2Q2X2[2e2kW#ba#d%h3mR*b&aviOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u[!hP!p'k+a.p0uY#aa#d%h&a3mQ&}#{Q(e$vW(y%U,n/i1]S*p'S*rS+h't.bS+o'w.nS+t'z+vS.e+k.iR/o,sh#TW!Y!f$T$Z%](d*o+r,`-t.sQ*P%{Q*^&]Q-j*]R0X-lU)}%z){0TQ,P(UR.v+y$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3ivwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uQ%V!cQ%g!kQ%o!qS&o#k2wQ'j$fQ)Q%WQ)V%^Q,u)OQ/p,tQ0n.fQ1W/^R1t0m${qOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n!^#od#g$y$z%S&n&p&r&s&t&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lg2y/b3U3V3X3Y3Z3[3]3a3e3f!Y#rd#g$y$z%S&n&r&s&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lc2|/b3U3X3Y3[3]3a3e3fR'O#{%TgOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%ToOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%SoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ$f{Q$t!WQ$u!XQ${!^R,k(oQ$`mS(V$l+XQ+T'^S+z(Q(XS-W)j)kQ.S+VQ.l+nQ.z,RQ/y-XQ0e.VQ0r.mQ1d/wQ1q0fR2V1cQ'o$gY*v'W'p'q'r'sQ,Q(VW-w*w*x*y*zQ.k+nQ.w+zU0^-x-y-zS0q.l.mQ0x.zS1m0_0`Q1u0rR2]1na!nP!p'k+a+k.i.p0u`!nP!p'k+a+k.i.p0uT+u'z+vd!jP!h!p'k+a+k.e.i.p0uQ's$gQ'v$hQ(P$jQ*z'WQ*|'XQ+S'ZV+s'z+t+vQ%b!iR,})]Q)Y%`R,|)[Q%l!mQ)T%[Q)X%_Q-P)aR/s-QvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uS*q'S*rT+u'z+vQ'r$gS*y'W'sR-z*zQ'q$gQ'y$iU*x'W'r'sQ+O'YQ+m'uS-y*y*zQ-|*{Q0`-zR0b-}Q+e'mQ+f'nR+x'{Q'p$gQ'}$jW*w'W'q'r'sU+Q'Z(O(PU-x*x*y*zS.Q+R+SS0_-y-zQ0d.RR1n0`Q'u$hS*{'X'vR-}*|Q+i'tR0k.bQ+l'uS-{*{+mS0a-|-}R1o0bT.g+k.iQ(O$jS+R'Z(PR.R+SQ'|$jW+P'Z'}(O(PU.P+Q+R+SS0c.Q.RR1p0dvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uT+u'z+vQ'x$iS*}'Y'yR.O+OQ+p'wR0s.nR.r+qQ'T$SR*u'VT*q'S*rQ%k!mS)W%_%lR,z)XQ)g%jR-U)h$zoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nX(x%U,n/i1]%SmOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nU'^$[$n-VS+V'_/vQ.V+YR0f.WX(T$l(Q(U+y_)s%q)r-[/}2Z2i2nQ)u%qR0R-_Q([$oQ)w%sR-b)xT,S(Z,TvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR1W/^wwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uvvOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uQ%P!`R%R!aR$w!ZvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR(f$vR$x!ZR(n${T,f(m,gT,e(m,gX({%V(|)Q,vR,t(}Q/n,sR1a/oQ)P%VQ,r(|Q,w)QR/q,vR%W!cQ(z%UV/g,n/i1]QyOQ#jbY$cy#j)h-T/uQ)h%jQ-T)gR/u-UvVOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uv!gP!p#d&a'S'k't'w'z*r+a+k+v,s.b.i.n.p0u|!xV!g#O#Z#_#}$k%a%e&P&V&Z&{(S(W)e*`+W.^0j2R3`!f#OW!f!v#R$O$T%Y%]%d%y&Q&W&|(d(u)R)b*l*n*o+r,`,m,x-R-t.s/m1j2Q2X2[2e2kQ#Z_S#_a3m$`#}ep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%m%q%z&j&l'l'm'n'{(R(f(k)Z)r){*U*i*k+^+},b,c,j-Y-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$k!QS%a!i)]S%e!j+sS&P#W*VQ&V#YU&Z#`&d)dQ&{#{W(S$l(Q(U+yQ(W$mQ)e%hQ*`&`Q+W'`Q.^+gQ0j.aQ2R1^Z3`$v%U,n/i1]Q*W&SR-h*W^#QW#`$O&|(d(u*l!Q%X!f!v$T%]%d&Q&W&`&d)b)d*n*o+g+r,`,m-R-t.a.s/m2Q2e[%x#Q%X%y,x2X2kS%y#R%YQ,x)RQ2X1jR2k2[#Q`OPaby!_!p#d#j#{$b$t$u$v$w$x%U%h%j&a'S'k't'w'z(m)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3m[!wV!g#_&{)e3`T#[`!wQ0U-cR1i0UQ&b#bR*c&bQ&g#eR*f&gQ$QfR'Q$QQ+_'fS.[+_1XR1X/bQ!pPU%n!p+a0uQ+a'kR0u.pQ%|#TR*Q%|Q&k#hU*h&k/r3kQ/r,{R3k3jQ)^%bR-O)^Q-Z)mR/{-ZQ.c+iR0l.cQ.i+kR0o.iQ+v'zR.t+vQ.o+pR0t.oQ*r'SR-u*rQ(U$lQ+y(QT,O(U+yQ0O-]R1g0OQ-`)uR0S-`Q,T(ZR.{,TQ/P,VR0{/PQ1x0|S2`1x2bR2b1zQ,g(mR/`,gQ(|%VS,q(|,vR,v)QQ1_/mR2S1_Q,o(zR/j,odxOby#j%j)g)h-T-U/uQ$|!_Q'h$bQ(b$tQ(c$uQ(h$wQ(i$xS,f(m,gR/V,^)ftOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u0T0j0u1S1V1Z1]1^1j2Q2R2X2[2e2k2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n_)t%q)r-[/}2Z2i2nQ!sTQ$o!SQ$p!UQ$q!VQ%s!yQ%u!{Q(`$rQ(a$sQ)x%tQ*R2rS.},V,XQ/R,WQ/S,YQ0z/PS0|/R1OQ1z1PR2_1w&{SOTabehpy!S!U!V![!]!_!b!y!{#`#j#k#n#o#p#q#r#s#t#u#v#w#x#|$U$[$]$^$_$b$e$n$r$s$t$u$v$w$x%U%j%p%q%t%z&W&l'_'e(R(^(f(k(m)d)g)h)r){*i*k*o+Y+Z+^+},V,W,X,Y,],^,b,c,g,j,n-R-T-U-V-[-_-t.W.Y/P/R/W/Y/^/e/i/u/v/}0T1O1P1S1V1Z1]1w2Z2i2n2r2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ)v%qQ-])rQ/|-[Q1f/}Q2j2ZQ2l2iR2p2nxdOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/^/uU#ga$e3mS#ye3hS$ap3iQ$y![Q$z!]Q%S!bQ&n#kQ&p#nQ&q#oQ&r#pQ&s#qQ&t#rQ&u#sQ&v#tQ&w#uS&x#v3QQ&y#wQ&z#xQ'P#|Q'c$]Y'f$_$v,b/Y1V^)p%q)r-[/}2Z2i2nU)|%z){0TS*j&l3TQ+{(RQ,a(fQ,d(kS-m*i3bQ-n*kQ.Z+^Q.y+}Q/[,cQ/b,jQ1R/WQ1Y/eQ1|1SQ2P1ZQ3U2wQ3V2xQ3W2yQ3X2zQ3Y2{Q3Z2|Q3[2}Q3]3OQ3^3PQ3_3RQ3a3SQ3e3cQ3f3dR3l3nvWOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!fP!p'k+a+k.i.p0uW!vV#}&P3`S#`a3m#|$Oep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%q%z&l(R(f(k)r){*i*k+^+},b,c,j-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$TiS%]!h.eS%d!j+sf&Q#W%m&j'l'm'n'{)Z*U*V-YQ&W#_Q&`#aS&d#d&aQ&|#{Q(d$vW(u%U,n/i1]Q)b%eQ)d%hQ*l&{Q*n&}S*o'S*rS+g't.bS+r'z+vQ,`(eQ,m(yQ-R)eQ-t*pQ.a+hQ.s+tS/m,s/oQ2Q1^R2e2R'b]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ$l!QQ(Q$kS(X$m+WQ+X'`R,R(W'sUOPVabeipy!Q![!]!_!b!h!j!p#W#Y#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&V&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nR&T#W%OnObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ#haQ&S#WQ'O#{W)m%m'm'n'{Q*g&jQ+c'lQ,{)ZQ-f*UQ-g*VQ/z-YR3j3mQ*T&RR-e*SU#ca%h3mR&e#d#c_OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3m#c^OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3ml#SW!Y!f$T$Z%]%{&]*]*o+r-l-t.sU&[#`&d)dQ*a&`Q,_(dQ,l(uQ.`+gQ/X,`Q/f,mQ0i.aQ1`/nR2U1aQ*O%zQ-c){R1h0TR-d){T#fa3m$vkOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%q%z&l(R(f(k(m)g)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nW(v%U,n/i1]T)i%j)h%SjOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nT'[$[-VQ'g$_Q(g$vQ/Z,bQ1T/YR2O1V[!oP!p'k+a.p0uT.g+k.iU#UW!Y(dQ%Z!fU'U$T$Z,`Q)U%]S-r*o+rT0[-t.sd!kP!p'k'z+a+k+v.i.p0uV%^!h+t.eR%c!iW%[!f%]+r.sQ)a%dR-Q)bQ)n%mV+d'm'n'{R+j'tT.h+k.iR+q'w`!mP!p'k+a+k.i.p0uT%_!h.eR-^)rR)v%qT/O,V/PQ0}/RR1y1OR1y1PR/c,j",nodeNames:"⚠ LineComment BlockComment Program ModuleDeclaration MarkerAnnotation Identifier ScopedIdentifier . Annotation ) ( AnnotationArgumentList LambdaExpression Definition FormalParameters ReceiverParameter void PrimitiveType TypeName ScopedTypeName GenericType TypeArguments AnnotatedType Wildcard extends super , ArrayType ] Dimension [ this FormalParameter Modifiers public protected private abstract static final strictfp default synchronized native transient volatile sealed non SpreadParameter VariableDeclarator AssignOp } { ArrayInitializer InferredParameters Block BinaryExpression CompareOp CompareOp CompareOp LogicOp LogicOp BitOp BitOp BitOp ArithOp ArithOp BitOp InstanceofExpression instanceof TypePattern TernaryExpression LogicOp : UpdateExpression UpdateOp IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral TextBlock null ClassLiteral class ParenthesizedExpression ObjectCreationExpression new ArgumentList ClassBody ; FieldDeclaration MethodDeclaration TypeParameters TypeParameter TypeBound Throws throws ClassDeclaration Superclass SuperInterfaces implements InterfaceTypeList Permits permits RecordDeclaration record RecordHeader RecordComponent RecordBody CompactConstructorDeclaration InterfaceDeclaration interface ExtendsInterfaces InterfaceBody ConstantDeclaration EnumDeclaration enum EnumBody EnumConstant EnumBodyDeclarations AnnotationTypeDeclaration AnnotationTypeBody AnnotationTypeElementDeclaration StaticInitializer ConstructorDeclaration ConstructorBody ExplicitConstructorInvocation FieldAccess ArrayAccess MethodInvocation MethodName MethodReference ArrayCreationExpression Dimension UnaryExpression LogicOp BitOp CastExpression AssignmentExpression AssignOp ElementValueArrayInitializer ElementValuePair open module ModuleBody ModuleDirective requires transitive exports to opens uses provides with PackageDeclaration package ImportDeclaration import Asterisk ExpressionStatement LabeledStatement Label IfStatement if else WhileStatement while ForStatement for ForSpec LocalVariableDeclaration var EnhancedForStatement ForSpec AssertStatement assert SwitchStatement switch SwitchBlock SwitchRule SwitchLabel case ThrowStatement throw DoStatement do BreakStatement break ContinueStatement continue ReturnStatement return SynchronizedStatement TryStatement try CatchClause catch CatchFormalParameter CatchType FinallyClause finally TryWithResourcesStatement ResourceSpecification Resource ClassContent",maxTerm:296,nodeProps:[["isolate",-4,1,2,80,81,""],["group",-27,4,56,91,99,106,112,117,122,156,158,161,162,164,167,169,172,174,176,178,184,186,188,190,192,194,195,203,"Statement",-25,6,13,32,57,69,72,75,77,78,79,80,81,82,83,84,86,87,129,130,131,133,134,136,139,140,"Expression",-7,17,18,19,20,21,23,28,"Type"],["openedBy",10,"(",52,"{"],["closedBy",11,")",53,"}"]],propSources:[BQ],skippedNodes:[0,1,2],repeatNodeCount:30,tokenData:"#$g_R!_OX%QXY'fYZ)bZ^'f^p%Qpq'fqr*|rs,^st%Qtu2zuv4avw5qwx7Xxy?pyz@^z{@z{|Ap|}CW}!OCt!O!PEa!P!QNZ!Q!R!+P!R![!.k![!]!;T!]!^!osw<}wx9}x#O<}#O#P&Z#P;'S<};'S;=`?d<%lO<}P>rVOY>oZw>owx?Xx#O>o#P;'S>o;'S;=`?^<%lO>oP?^O!rPP?aP;=`<%l>oT?gP;=`<%l<}T?mP;=`<%l8P_?wVZZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV@eVYR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVATX$fP&}S!eQOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVAwZ!dR&}SOY%QYZ%lZr%Qrs%qs{%Q{|Bj|!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVBqV!nR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVC_VkR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_C}[&pW!dR&}SOY%QYZ%lZr%Qrs%qs}%Q}!OBj!O!_%Q!_!`5T!`!aDs!a;'S%Q;'S;=`&s<%lO%QVDzV&vR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_EhZWY&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PFZ!P!Q%Q!Q![Gi![;'S%Q;'S;=`&s<%lO%QVF`X&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PF{!P;'S%Q;'S;=`&s<%lO%QVGSV&rR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTGpc&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#R%Q#R#SMc#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTISV&}S!pPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTIn]&}SOY%QYZ%lZr%Qrs%qs{%Q{|Jg|}%Q}!OJg!O!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTJlX&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTK`c&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![!f%Q!f!gH{!g!h%Q!h!iH{!i#R%Q#R#SLk#S#W%Q#W#XH{#X#Y%Q#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTLpZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![#R%Q#R#SLk#S;'S%Q;'S;=`&s<%lO%QTMhZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![#R%Q#R#SMc#S;'S%Q;'S;=`&s<%lO%Q_Nb]&}S!eQOY%QYZ%lZr%Qrs%qsz%Qz{! Z{!P%Q!P!Q!'|!Q!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%Q_! `X&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!!QT&}SOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!dTOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!vVOz!!az{!!s{!P!!a!P!Q!#]!Q;'S!!a;'S;=`!#b<%lO!!aZ!#bOQZZ!#eP;=`<%l!!a_!#kXOY!$WYZ! {Zr!$Wrs!&bsz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!$ZXOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!${Z&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!%uV&}SQZOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!&_P;=`<%l! Z_!&eXOY!$WYZ! {Zr!$Wrs!!asz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!'TZOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!'yP;=`<%l!$W_!(TV&}SPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!(oVPZOY!)UYZ%lZr!)Urs!)vs;'S!)U;'S;=`!*y<%lO!)U_!)ZVPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!)sP;=`<%l!'|_!){VPZOY!)UYZ%lZr!)Urs!*bs;'S!)U;'S;=`!*y<%lO!)UZ!*gSPZOY!*bZ;'S!*b;'S;=`!*s<%lO!*bZ!*vP;=`<%l!*b_!*|P;=`<%l!)UT!+Wq&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!d%Q!d!e!1u!e!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o!z%Q!z!{!3s!{#R%Q#R#S!0}#S#U%Q#U#V!1u#V#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a#l%Q#l#m!3s#m;'S%Q;'S;=`&s<%lO%QT!-fa&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QT!.ri&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o#R%Q#R#S!0}#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!0hV&}S!oPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT!1SZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!.k![#R%Q#R#S!0}#S;'S%Q;'S;=`&s<%lO%QT!1zY&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S;'S%Q;'S;=`&s<%lO%QT!2q`&}S!oPOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S!n%Q!n!o!0a!o#R%Q#R#S!1u#S#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!3x_&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!P!4w!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QT!4|]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i#T%Q#T#Z!5u#Z;'S%Q;'S;=`&s<%lO%QT!5zc&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#R%Q#R#S!4w#S#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!7^i&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!8{!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i!n%Q!n!o!0a!o!r%Q!r!sIi!s#R%Q#R#S!:V#S#T%Q#T#Z!7V#Z#`%Q#`#a!0a#a#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!9Qa&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!:[]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QV!;[X!lR&}SOY%QYZ%lZr%Qrs%qs![%Q![!]!;w!];'S%Q;'S;=`&s<%lO%QV!l!`;'S%Q;'S;=`&s<%lO%QU!>PX!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QU!>sV!]Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!?aX!TR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QV!@TY&gR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`!>l!`!a!@s!a;'S%Q;'S;=`&s<%lO%QU!@zY!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`!a!=x!a;'S%Q;'S;=`&s<%lO%Q_!AsV&kX!kQ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!BaX&]Z&}SOY%QYZ%lZr%Qrs%qs#]%Q#]#^!B|#^;'S%Q;'S;=`&s<%lO%QV!CRX&}SOY%QYZ%lZr%Qrs%qs#b%Q#b#c!Cn#c;'S%Q;'S;=`&s<%lO%QV!CsX&}SOY%QYZ%lZr%Qrs%qs#h%Q#h#i!D`#i;'S%Q;'S;=`&s<%lO%QV!DeX&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!EQ#Y;'S%Q;'S;=`&s<%lO%QV!EVX&}SOY%QYZ%lZr%Qrs%qs#f%Q#f#g!Er#g;'S%Q;'S;=`&s<%lO%QV!EwX&}SOY%QYZ%lZr%Qrs%qs#Y%Q#Y#Z!Fd#Z;'S%Q;'S;=`&s<%lO%QV!FiX&}SOY%QYZ%lZr%Qrs%qs#T%Q#T#U!GU#U;'S%Q;'S;=`&s<%lO%QV!GZX&}SOY%QYZ%lZr%Qrs%qs#V%Q#V#W!Gv#W;'S%Q;'S;=`&s<%lO%QV!G{X&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!Hh#Y;'S%Q;'S;=`&s<%lO%QV!HoV'ZR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!I]b&aZ&}SOY%QYZ%lZr%Qrs%qst%Qtu!IUu!Q%Q!Q![!IU![!c%Q!c!}!IU!}#R%Q#R#S!IU#S#T%Q#T#o!IU#o$g%Q$g;'S!IU;'S;=`!Je<%lO!IU_!JhP;=`<%l!IU_!JrVoZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!K`VmR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QU!K|X!cQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QV!LpV!VR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!M`Z'dX!bQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`#p%Q#p#q!NR#q;'S%Q;'S;=`&s<%lO%QU!NYV!`Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!NvV!UR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT# dV$OP&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#!Su&}S&XZ&_ZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qst%Qtu2zu!Q%Q!Q![2z![!c%Q!c!}2z!}#R%Q#R#S2z#S#T%Q#T#o2z#o#y%Q#y#z'f#z$f%Q$f$g'f$g#BY2z#BY#BZ# y#BZ$IS2z$IS$I_# y$I_$I|2z$I|$JO# y$JO$JT2z$JT$JU# y$JU$KV2z$KV$KW# y$KW&FU2z&FU&FV# y&FV;'S2z;'S;=`4Z<%lO2z",tokenizers:[0,1,2,3],topRules:{Program:[0,3],ClassContent:[1,206]},dynamicPrecedences:{21:1,246:-1,252:-1},specialized:[{term:245,get:i=>PQ[i]||-1}],tokenPrec:9164}),MQ=rr.define({name:"java",parser:OQ.configure({props:[T2.add({IfStatement:To({except:/^\s*({|else\b)/}),TryStatement:To({except:/^\s*({|catch|finally)\b/}),LabeledStatement:aq,SwitchBlock:i=>{let e=i.textAfter,t=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return i.baseIndent+(t?0:n?1:2)*i.unit},Block:iq({closing:"}"}),BlockComment:()=>null,Statement:To({except:/^{/})}),oq.add({"Block SwitchBlock ClassBody ElementValueArrayInitializer ModuleBody EnumBody ConstructorBody InterfaceBody ArrayInitializer":lq,BlockComment(i){return{from:i.from+2,to:i.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/}});function ZQ(){return new QV(MQ)}const LQ=" ";function WQ(i,e){let t="",n=e;for(let a=0;a{var b,x;const o=s.trim(),l=a,{chars:u,comment:m}=WQ(s,a);a=m;const c=l?0:((b=/^[}\])\s]*/.exec(o)[0].match(/[}\])]/g))==null?void 0:b.length)??0,d=n.slice(0,Math.max(0,n.length-c));NQ.test(o)&&((x=d.at(-1))!=null&&x.inCase)&&(d.at(-1).inCase=!1);const h=EQ(d);for(const v of u)"{[(".includes(v)?n.push({line:r,char:v}):n.pop();const g=n.at(-1);(g==null?void 0:g.line)===r&&g.char==="{"&&/^switch\b/.test(o)&&(g.char="switch"),(g==null?void 0:g.char)==="switch"&&FQ.test(o)&&(g.inCase=!0);const f=r+1;return ft||l&&!o.startsWith("*")?s:o===""?"":LQ.repeat(h)+(l?" ":"")+o}).join(` -`)}const RQ=[">>>=","<<=",">>=","...","->","::","++","--","&&","||","==","!=","<=",">=","+=","-=","*=","/=","%=","&=","|=","^=","<<"],JQ=new Set(["=","==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>>=","->","&","|","^","<<"]),GQ=new Set(["+","-","*","/","%"]),HQ=new Set(["return","case","throw","new","else","do","yield","assert","instanceof"]),VQ=new Set(["byte","short","int","long","float","double","char","boolean"]),qQ=new Set(["if","for","while","switch","catch","synchronized","try"]),UQ=new Set(["else","catch","finally"]);function QQ(i){const e=[];let t=1,n=0;const a=(s,r)=>{e.push({kind:s,text:i.slice(n,r),from:n,to:r,line:t});for(let o=n;oi.startsWith(l,n));a(o?"op":"other",n+((o==null?void 0:o.length)??1))}}return e}function $Q(i,e){var n,a;const t=i[e];return t?t.kind==="num"||t.kind==="str"?!0:t.kind==="word"?!HQ.has(t.text):t.text==="]"?!0:t.text===")"?!(VQ.has(((n=i[e-1])==null?void 0:n.text)??"")&&((a=i[e-2])==null?void 0:a.text)==="("):!1:!1}const Gd=i=>(i==null?void 0:i.kind)==="word"&&new RegExp("^\\p{Lu}","u").test(i.text);function YQ(i,e=1,t=Number.MAX_SAFE_INTEGER){const n=QQ(i),a=n.length,s=new Array(a).fill(!1),r=new Array(a).fill(!1),o=new Array(a).fill(-1),l=new Array(a).fill(!1),u=new Array(a).fill(!1),m=[{at:-1,block:!0,paren:0}];let c=0,d=0;n.forEach((g,f)=>{var v,w;const b=n[f-1],x=m.at(-1);if(g.kind!=="comment")if(g.text==="(")x.paren++;else if(g.text===")")x.paren=Math.max(0,x.paren-1);else if(g.text==="{"){const z=(b==null?void 0:b.text)??"",I=["=",",","]","("].includes(z)||z==="{"&&!r[f-1];r[f]=!I,l[f]=z==="do",m.push({at:f,block:!I,paren:0})}else if(g.text==="}")if(m.length>1){const z=m.pop();r[f]=z.block,o[f]=z.at,o[z.at]=f,l[f]=l[z.at]}else r[f]=!0;else if(g.text===";")u[f]=x.block&&x.paren===0,d=0;else if(g.text==="?"&&(b==null?void 0:b.text)!=="<"&&![")",";",",",void 0].includes((v=n[f+1])==null?void 0:v.text))s[f]=!0,d++;else if(g.text===":")s[f]=d>0||x.paren>0,d>0&&d--;else if(g.text==="<"){const z=n[f+1];(Gd(b)||(b==null?void 0:b.text)===".")&&(Gd(z)||(z==null?void 0:z.text)===">"||(z==null?void 0:z.text)==="?")?c++:s[f]=!((b==null?void 0:b.text)==="<"||(z==null?void 0:z.text)==="<")}else g.text===">"?c>0?c--:s[f]=!((b==null?void 0:b.text)===">"||((w=n[f+1])==null?void 0:w.text)===">"):JQ.has(g.text)?s[f]=!0:GQ.has(g.text)&&(s[f]=$Q(n,f-1))});const h=[];for(let g=1;gt||f.kind==="comment")continue;let v;b.kind==="comment"?v=void 0:r[g-1]&&f.text==="{"&&o[g-1]!==g||r[g]&&b.text==="}"&&o[g]!==g-1?v=` -`:r[g-1]&&f.text==="}"?UQ.has(b.text)||b.text==="while"&&l[g-1]?v=" ":[")",";",",","."].includes(b.text)||(v=` -`):u[g-1]?v=` -`:b.text===","||b.text===";"?v="":f.text===","?v=" ":f.text===";"?v=b.text===")"?"":" ":f.text==="("||b.text===")"?v="":(b.text==="("&&qQ.has(f.text)||b.text==="{"&&r[g]||s[g-1]||s[g])&&(v=" "),v!==void 0&&v!==x&&h.push({from:f.to,to:b.from,insert:v})}return h}const KQ=[["nextInt","","int","Ganze Zahl einlesen","Read a whole number","Ler um número inteiro"],["nextDouble","","double","Kommazahl einlesen","Read a decimal number","Ler um número decimal"],["nextLine","","String","Ganze Zeile als Text einlesen","Read a whole line as text","Ler uma linha inteira como texto"],["next","","String","Ein Wort einlesen (bis zum Leerzeichen)","Read one word (up to a space)","Ler uma palavra (até ao espaço)"],["nextBoolean","","boolean","true oder false einlesen","Read true or false","Ler true ou false"],["nextLong","","long","Große ganze Zahl einlesen","Read a large whole number","Ler um número inteiro grande"],["hasNextInt","","boolean","Kommt als Nächstes eine ganze Zahl?","Is the next input a whole number?","A próxima entrada é um número inteiro?"],["hasNextDouble","","boolean","Kommt als Nächstes eine Kommazahl?","Is the next input a decimal number?","A próxima entrada é um número decimal?"],["hasNextLine","","boolean","Gibt es noch eine Zeile?","Is there another line?","Existe mais uma linha?"],["hasNext","","boolean","Gibt es noch ein Wort?","Is there another word?","Existe mais uma palavra?"],["close","","void","Eingabe schließen","Close the input","Fechar a entrada"]],XQ=[["length","","int","Anzahl der Zeichen","Number of characters","Número de caracteres"],["charAt","index","char","Zeichen an Stelle index (ab 0)","Character at position index (from 0)","Carácter na posição index (a partir de 0)"],["equals","text","boolean","Gleicher Text? (statt ==)","Same text? (instead of ==)","Mesmo texto? (em vez de ==)"],["equalsIgnoreCase","text","boolean","Gleicher Text, groß/klein egal?","Same text, ignoring case?","Mesmo texto, ignorando maiúsculas?"],["compareTo","text","int","Alphabetisch vergleichen (<0, 0, >0)","Compare alphabetically (<0, 0, >0)","Comparar alfabeticamente (<0, 0, >0)"],["substring","von, bis","String","Teiltext von Stelle von bis vor bis","Part of the text from start up to before end","Parte do texto do início até antes do fim"],["indexOf","text","int","Erste Stelle des Textes (−1 = fehlt)","First position of the text (−1 = missing)","Primeira posição do texto (−1 = não existe)"],["lastIndexOf","text","int","Letzte Stelle des Textes (−1 = fehlt)","Last position of the text (−1 = missing)","Última posição do texto (−1 = não existe)"],["contains","text","boolean","Kommt der Text darin vor?","Does it contain the text?","Contém o texto?"],["startsWith","text","boolean","Fängt damit an?","Starts with it?","Começa com isto?"],["endsWith","text","boolean","Hört damit auf?","Ends with it?","Termina com isto?"],["toUpperCase","","String","In GROSSBUCHSTABEN","In UPPER CASE","Em MAIÚSCULAS"],["toLowerCase","","String","In kleinbuchstaben","In lower case","Em minúsculas"],["trim","","String","Leerzeichen vorn und hinten weg","Remove spaces at both ends","Remover espaços no início e no fim"],["replace","alt, neu","String","Text ersetzen","Replace text","Substituir texto"],["split","trenner","String[]",'In Teile zerlegen, z. B. split(";")','Split into parts, e.g. split(";")','Dividir em partes, p. ex. split(";")'],["isEmpty","","boolean","Leerer Text?","Empty text?","Texto vazio?"],["toCharArray","","char[]","Als Array von Zeichen","As an array of characters","Como array de caracteres"]],b3=[["println","wert","void","Ausgeben, danach neue Zeile","Print, then a new line","Escrever e mudar de linha"],["print","wert","void","Ausgeben ohne neue Zeile","Print without a new line","Escrever sem mudar de linha"],["printf","format, werte","PrintStream",'Formatiert ausgeben, z. B. "%.2f"','Print formatted, e.g. "%.2f"','Escrever formatado, p. ex. "%.2f"']],e$=[...b3,["close","","void","Datei speichern und schließen","Save and close the file","Guardar e fechar o ficheiro"]],t$=[["readLine","","String","Nächste Zeile lesen (null = Ende)","Read the next line (null = end)","Ler a próxima linha (null = fim)"],["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],n$=[["exists","","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"],["getName","","String","Name der Datei","Name of the file","Nome do ficheiro"],["length","","long","Größe in Bytes","Size in bytes","Tamanho em bytes"]],i$=[["getMessage","","String","Fehlermeldung als Text","Error message as text","Mensagem de erro como texto"],["printStackTrace","","void","Fehler mit Zeilen ausgeben","Print the error with its lines","Mostrar o erro com as linhas"]],a$=[["getSource","","Object","Welcher Knopf wurde geklickt?","Which button was clicked?","Que botão foi clicado?"],["getActionCommand","","String","Beschriftung des Knopfs","Label of the button","Texto do botão"]],s$=[["setBackground","farbe","void","Hintergrundfarbe, z. B. Color.RED","Background colour, e.g. Color.RED","Cor de fundo, p. ex. Color.RED"],["setForeground","farbe","void","Schriftfarbe","Text colour","Cor do texto"],["setFont","schrift","void",'Schrift, z. B. new Font("Arial", Font.BOLD, 24)','Font, e.g. new Font("Arial", Font.BOLD, 24)','Letra, p. ex. new Font("Arial", Font.BOLD, 24)'],["setVisible","true","void","Anzeigen (true) oder verstecken (false)","Show (true) or hide (false)","Mostrar (true) ou esconder (false)"],["setEnabled","true","void","Anklickbar (true) oder grau (false)","Clickable (true) or greyed out (false)","Clicável (true) ou cinzento (false)"],["setSize","breite, höhe","void","Größe in Pixeln","Size in pixels","Tamanho em píxeis"]],r$=[["add","baustein","Component","Baustein hinzufügen","Add a component","Adicionar um componente"],["setLayout","layout","void","Anordnung, z. B. new FlowLayout()","Layout, e.g. new FlowLayout()","Disposição, p. ex. new FlowLayout()"],["remove","baustein","void","Baustein entfernen","Remove a component","Remover um componente"]],o$=[["setTitle","text","void","Titel oben im Fenster","Title at the top of the window","Título no topo da janela"],["setDefaultCloseOperation","JFrame.EXIT_ON_CLOSE","void","Was beim Schließen passiert","What happens when closing","O que acontece ao fechar"],["setLocationRelativeTo","null","void","Mit null: Fenster in die Mitte","With null: centre the window","Com null: janela no centro"],["setResizable","false","void","Größe änderbar?","Can the size change?","Pode mudar de tamanho?"],["pack","","void","Größe passend zum Inhalt","Size to fit the content","Tamanho ajustado ao conteúdo"],["getContentPane","","JPanel","Inhaltsfläche des Fensters","Content area of the window","Área de conteúdo da janela"],["dispose","","void","Fenster schließen","Close the window","Fechar a janela"]],l$=[["setText","text","void","Text setzen","Set the text","Definir o texto"],["getText","","String","Text holen","Get the text","Obter o texto"]],u$=[["addActionListener","e -> { }","void","Was beim Klick passiert","What happens on click","O que acontece ao clicar"],["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setBorderPainted","false","void","Rahmen zeichnen?","Draw the border?","Desenhar a borda?"]],m$=[["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setHorizontalAlignment","JLabel.CENTER","void","Text links, mittig oder rechts","Text left, centre or right","Texto à esquerda, centro ou direita"]],c$=[["addActionListener","e -> { }","void","Was bei Enter passiert","What happens on Enter","O que acontece ao carregar em Enter"],["setEditable","false","void","Darf man hineinschreiben?","Can you type into it?","Pode-se escrever?"],["setColumns","anzahl","void","Breite in Zeichen","Width in characters","Largura em caracteres"],["requestFocus","","void","Cursor hineinsetzen","Put the cursor into it","Pôr o cursor no campo"]],d$=[["length",null,"int","Anzahl der Elemente (ohne Klammern)","Number of elements (no brackets)","Número de elementos (sem parênteses)"]],Po=[["add","wert","boolean","Element hinten anhängen","Append an element at the end","Acrescentar um elemento no fim"],["get","index","E","Element an Stelle index holen (ab 0)","Get the element at index (from 0)","Obter o elemento na posição index (a partir de 0)"],["size","","int","Anzahl der Elemente","Number of elements","Número de elementos"],["set","index, wert","E","Element an Stelle index ersetzen","Replace the element at index","Substituir o elemento na posição index"],["remove","index","E","Element an Stelle index entfernen","Remove the element at index","Remover o elemento na posição index"],["contains","wert","boolean","Ist das Element in der Liste?","Is the element in the list?","O elemento está na lista?"],["indexOf","wert","int","Stelle des Elements (-1 = nicht da)","Position of the element (-1 = not found)","Posição do elemento (-1 = não existe)"],["isEmpty","","boolean","Ist die Liste leer?","Is the list empty?","A lista está vazia?"],["clear","","void","Alle Elemente entfernen","Remove all elements","Remover todos os elementos"]],Oo={Scanner:KQ,String:XQ,PrintStream:b3,PrintWriter:e$,BufferedReader:t$,FileReader:[["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],File:n$,Exception:i$,ActionEvent:a$,Component:s$,Container:r$,JFrame:o$,JPanel:[],JButton:u$,JLabel:m$,JTextField:c$,TextHolder:l$,ArrayList:Po,List:Po,LinkedList:Po,LED:[["setColor","farbe","void",'Farbe der LED, z. B. "grün" oder "aus"','Colour of the LED, e.g. "green" or "off"','Cor do LED, p. ex. "green" ou "off"']]},h$={JFrame:["Container","Component"],JPanel:["Container","Component"],JButton:["TextHolder","Component"],JLabel:["TextHolder","Component"],JTextField:["TextHolder","Component"],PrintWriter:[]},x3={mbot:[["forward","cm","void","Geradeaus vorwärts fahren","Drive forward","Andar para a frente"],["forward",'wert, "Umdrehungen"',"void",'Überladen: mit Einheit "cm" oder "Umdrehungen" (1 Umdrehung ≈ 20,4 cm)','Overloaded: with unit "cm" or "rotations" (1 rotation ≈ 20.4 cm)','Sobrecarregado: com unidade "cm" ou "rotações" (1 rotação ≈ 20,4 cm)'],["backward","cm","void","Rückwärts fahren","Drive backward","Andar para trás"],["backward",'wert, "Umdrehungen"',"void",'Überladen: rückwärts mit Einheit "cm" oder "Umdrehungen"','Overloaded: backward with unit "cm" or "rotations"','Sobrecarregado: para trás com unidade "cm" ou "rotações"'],["turnLeft","grad","void","Auf der Stelle nach links drehen","Turn left on the spot","Rodar para a esquerda"],["turnRight","grad","void","Auf der Stelle nach rechts drehen","Turn right on the spot","Rodar para a direita"],["stop","","void","Motoren anhalten","Stop the motors","Parar os motores"],["drive","links, rechts","void","Räder einzeln in Prozent (−100–100), fährt weiter bis stop()","Wheels separately in percent (−100–100), keeps going until stop()","Rodas separadas em percentagem (−100–100), continua até stop()"],["resetTimer","","void","Stoppuhr auf 0 setzen","Reset the stopwatch to 0","Pôr o cronómetro a 0"],["pause","ms","void","Millisekunden warten","Wait milliseconds","Esperar milissegundos"],["setLed","rot, gruen, blau","void","LEDs in einer Farbe (je 0–255)","LEDs in a colour (0–255 each)","LEDs numa cor (0–255 cada)"],["ledOff","","void","LEDs aus","LEDs off","Desligar LEDs"],["led","nr","LED",'Eine LED (0–4), dann .setColor("grün") oder .setColor("aus")','One LED (0–4), then .setColor("green") or .setColor("off")','Um LED (0–4), depois .setColor("green") ou .setColor("off")'],["showText",'"Hallo"',"void","Text auf dem Bildschirm zeigen","Show text on the screen","Mostrar texto no ecrã"],["emotion",'"smile"',"void","Gefühl zeigen: LEDs, Ton, Bewegung (smile, hello, sad …)","Show a feeling: LEDs, sound, motion (smile, hello, sad …)","Mostrar um sentimento: LEDs, som, movimento (smile, hello, sad …)"],["playTone","hz, ms","void","Ton spielen, z. B. playTone(440, 500)","Play a tone, e.g. playTone(440, 500)","Tocar um som, p. ex. playTone(440, 500)"],["getDistance","","int","Abstand vorn in cm (Ultraschall)","Distance ahead in cm (ultrasonic)","Distância à frente em cm (ultrassom)"],["getLine","","int","Liniensensor: 0 = keine Linie, 15 = alle vier auf der Linie","Line sensor: 0 = no line, 15 = all four on the line","Sensor de linha: 0 = sem linha, 15 = os quatro na linha"],["isLineLeft","","boolean","Linie unter dem linken mittleren Fühler","Line under the left middle probe","Linha sob a sonda central esquerda"],["isLineRight","","boolean","Linie unter dem rechten mittleren Fühler","Line under the right middle probe","Linha sob a sonda central direita"],["getBrightness","","int","Helligkeit 0–100","Brightness 0–100","Luminosidade 0–100"],["getLoudness","","int","Lautstärke 0–100","Loudness 0–100","Volume 0–100"],["getColor","","String",'Farbe unter dem mBot2, z. B. "rot"','Colour under the mBot2, e.g. "red"','Cor por baixo do mBot2, p. ex. "red"'],["isButtonA","","boolean","Taste A ist gedrückt","Button A is pressed","O botão A está premido"],["isButtonB","","boolean","Taste B ist gedrückt","Button B is pressed","O botão B está premido"],["isJoystickUp","","boolean","Joystick nach oben gedrückt","Joystick pushed up","Joystick para cima"],["isJoystickDown","","boolean","Joystick nach unten gedrückt","Joystick pushed down","Joystick para baixo"],["isJoystickLeft","","boolean","Joystick nach links gedrückt","Joystick pushed left","Joystick para a esquerda"],["isJoystickRight","","boolean","Joystick nach rechts gedrückt","Joystick pushed right","Joystick para a direita"],["getPitch","","int","Neigung nach vorn (+) oder hinten (−) in Grad","Tilt forward (+) or back (−) in degrees","Inclinação para a frente (+) ou trás (−) em graus"],["getRoll","","int","Neigung zur Seite in Grad","Tilt sideways in degrees","Inclinação lateral em graus"],["isShaken","","boolean","Der mBot2 wird geschüttelt","The mBot2 is being shaken","O mBot2 está a ser abanado"],["getTimer","","double","Stoppuhr in Sekunden","Stopwatch in seconds","Cronómetro em segundos"],["getBattery","","int","Akku in Prozent","Battery in percent","Bateria em percentagem"]],System:[["out",null,"PrintStream","Ausgabe in die Konsole","Output to the console","Saída para a consola"],["in",null,"InputStream","Eingabe von der Tastatur (für Scanner)","Keyboard input (for Scanner)","Entrada do teclado (para Scanner)"],["err",null,"PrintStream","Fehlerausgabe","Error output","Saída de erros"],["currentTimeMillis","","long","Uhrzeit in Millisekunden","Time in milliseconds","Hora em milissegundos"],["exit","0","void","Programm beenden","End the program","Terminar o programa"]],Math:[["random","","double","Zufallszahl von 0 bis unter 1","Random number from 0 to below 1","Número aleatório de 0 até menos de 1"],["abs","zahl","double","Betrag (ohne Minus)","Absolute value (no minus)","Valor absoluto (sem menos)"],["sqrt","zahl","double","Wurzel","Square root","Raiz quadrada"],["pow","basis, exponent","double","Hoch: pow(2, 3) = 8","Power: pow(2, 3) = 8","Potência: pow(2, 3) = 8"],["max","a, b","double","Größere von zwei Zahlen","Larger of two numbers","Maior de dois números"],["min","a, b","double","Kleinere von zwei Zahlen","Smaller of two numbers","Menor de dois números"],["round","zahl","long","Runden","Round","Arredondar"],["floor","zahl","double","Abrunden","Round down","Arredondar para baixo"],["ceil","zahl","double","Aufrunden","Round up","Arredondar para cima"],["PI",null,"double","Kreiszahl π = 3.14159…","Pi π = 3.14159…","Pi π = 3,14159…"]],Integer:[["parseInt","text","int","Text in ganze Zahl umwandeln","Turn text into a whole number","Converter texto em número inteiro"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"],["MAX_VALUE",null,"int","Größte int-Zahl","Largest int value","Maior valor int"],["MIN_VALUE",null,"int","Kleinste int-Zahl","Smallest int value","Menor valor int"]],Double:[["parseDouble","text","double","Text in Kommazahl umwandeln","Turn text into a decimal number","Converter texto em número decimal"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"]],String:[["valueOf","wert","String","Wert in Text umwandeln","Turn a value into text","Converter valor em texto"],["format","format, werte","String",'Formatierter Text, z. B. "%.2f"','Formatted text, e.g. "%.2f"','Texto formatado, p. ex. "%.2f"'],["join","trenner, teile","String","Teile mit Trenner verbinden","Join parts with a separator","Juntar partes com um separador"]],Character:[["isDigit","zeichen","boolean","Ist es eine Ziffer?","Is it a digit?","É um algarismo?"],["isLetter","zeichen","boolean","Ist es ein Buchstabe?","Is it a letter?","É uma letra?"],["isUpperCase","zeichen","boolean","Ist es ein Großbuchstabe?","Is it upper case?","É maiúscula?"],["toUpperCase","zeichen","char","In Großbuchstaben","To upper case","Para maiúscula"],["toLowerCase","zeichen","char","In Kleinbuchstaben","To lower case","Para minúscula"]],Files:[["readString",'Path.of("datei.txt")',"String","Ganze Datei als Text lesen","Read the whole file as text","Ler o ficheiro inteiro como texto"],["writeString","pfad, text","Path","Text in Datei schreiben","Write text to a file","Escrever texto num ficheiro"],["readAllLines","pfad","List","Alle Zeilen lesen","Read all lines","Ler todas as linhas"],["exists","pfad","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"]],Path:[["of",'"datei.txt"',"Path","Pfad zu einer Datei","Path to a file","Caminho para um ficheiro"]],JFrame:[["EXIT_ON_CLOSE",null,"int","Programm endet beim Schließen","Program ends when closed","O programa termina ao fechar"]],JLabel:[["CENTER",null,"int","Mittig","Centred","Ao centro"],["LEFT",null,"int","Links","Left","À esquerda"],["RIGHT",null,"int","Rechts","Right","À direita"]],Font:[["BOLD",null,"int","Fett","Bold","Negrito"],["PLAIN",null,"int","Normal","Plain","Normal"],["ITALIC",null,"int","Kursiv","Italic","Itálico"]],Color:[["RED","Rot","Red","Vermelho"],["GREEN","Grün","Green","Verde"],["BLUE","Blau","Blue","Azul"],["YELLOW","Gelb","Yellow","Amarelo"],["ORANGE","Orange","Orange","Laranja"],["WHITE","Weiß","White","Branco"],["BLACK","Schwarz","Black","Preto"],["GRAY","Grau","Grey","Cinzento"],["LIGHT_GRAY","Hellgrau","Light grey","Cinzento-claro"],["PINK","Rosa","Pink","Rosa"],["CYAN","Türkis","Cyan","Ciano"],["MAGENTA","Magenta","Magenta","Magenta"]].map(([i,e,t,n])=>[i,null,"Color",e,t,n])};function v3(i,e){const[t,n,a,s,r,o]=i;return{name:t,kind:n===null?"field":"method",params:!!n,returns:a,description:e==="de"?s:e==="pt"?o:r}}const d0=i=>i.replace(/<.*>$/,""),w3=i=>{var e;return(e=/<\s*([^<>,]+?)\s*>$/.exec(i))==null?void 0:e[1]};function y3(i){if(/\[\]$/.test(i))return d$;if(i=d0(i),/Exception$|^Throwable$/.test(i))return Oo.Exception;if(!Oo[i])return;const t=new Set,n=[];for(const a of[i,...h$[i]??[]])for(const s of Oo[a]??[])t.has(s[0])||(t.add(s[0]),n.push(s));return n}function YY(i,e="de"){return(y3(i)??[]).map(t=>v3(t,e))}const g$="[A-Z]\\w*|int|long|double|float|boolean|char|byte|short|var";function p$(i,e){var a,s;const t=new RegExp(`(?:^|[^\\w.])(${g$})\\s*(?:<([^<>;]*)>)?((?:\\s*\\[\\s*\\])*)\\s+${e}\\s*(?:\\[\\s*\\])*\\s*(=\\s*([^;]*))?(?=[=;,):]|$)`,"gm");let n;for(const r of i.matchAll(t)){let o=r[1];if(o==="var"){const u=r[5]??"";if(o=((a=/^new\s+([A-Z]\w*)/.exec(u))==null?void 0:a[1])??(/^"/.test(u)?"String":""),!o)continue}if(/^(return|new|else|case|throw)$/.test(o))continue;const l=(s=r[2])==null?void 0:s.replace(/\s+/g,"");n=o+(l?`<${l}>`:"")+(r[3]??"").replace(/\s+/g,"")}return n}function f$(i){let e=0,t;const n=/^"(?:[^"\\]|\\.)*"/.exec(i);if(n)t='"',e=n[0].length;else{const r=/^[A-Za-z_]\w*/.exec(i);if(!r)return;t=r[0],e=r[0].length}const a=[{name:t,call:!1,indices:0}],s=(r,o)=>{let l=0;for(;e0;){const n=i[t-1];if(/[\w.]/.test(n))t--;else if(n===")"||n==="]"){const a=n===")"?"(":"[";let s=0,r=t-1;for(;r>=0;r--)if(i[r]===n)s++;else if(i[r]===a&&--s===0)break;if(r<0)return t;t=r}else if(n==='"'){const a=i.lastIndexOf('"',t-2);if(a<0)return t;t=a}else break}return t}const Hd=(i,e)=>i.slice(0,Math.max(0,i.length-2*e));function z3(i,e,t,n){const a=e?t==null?void 0:t.statics(d0(i)):t==null?void 0:t.members(d0(i));if(a)return a;const s=e?x3[i]:y3(i);return s==null?void 0:s.map(r=>v3(r,n))}function x$(i,e,t,n){var s,r;const a=(r=(s=z3(i,t,n,"en"))==null?void 0:s.find(o=>o.name===e))==null?void 0:r.returns;return a==="E"?w3(i)??"Object":a}function v$(i,e,t){const n=f$(e);if(!n)return;const[a,...s]=n.links;let r,o=!1;if(n.head==='"')r="String";else if(a.name==="this"&&(t!=null&&t.thisType)&&!a.call&&!a.indices)r=t.thisType;else{if(r=p$(i,a.name),!r&&(x3[a.name]||t!=null&&t.statics(a.name))&&!a.call&&(r=a.name,o=!0),!r)return;a.indices&&(r=Hd(r,a.indices))}for(const l of s){const u=x$(r,l.name,o,t);if(!u)return;r=Hd(u,l.indices),o=!1}return{type:r,isStatic:o}}function w$(i,e,t="de",n){const a=i.lastIndexOf(` -`,e-1)+1,s=i.slice(a,e),r=/\.\s*(\w*)$/.exec(s);if(!r)return;const o=r.index,l=s.slice(b$(s,o),o);if(!l||/^\d/.test(l))return;const u=v$(i,l,n);if(!u)return;const m=z3(u.type,u.isStatic,n,t);if(!m)return;const c=w3(u.type)??"Object";return{from:e-r[1].length,members:m.map(d=>d.returns==="E"?{...d,returns:c}:d)}}const Vd=Vn.define(),Zu=pe.define(),y$=fe.mark({class:"cm-ph"}),z$=fe.mark({class:"cm-err"}),qd=fe.line({class:"cm-debug-line"});class I$ extends X1{constructor(e){super(),this.fix=e}eq(e){return JSON.stringify(e.fix)===JSON.stringify(this.fix)}toDOM(e){const t=document.createElement("button");return t.type="button",t.className="cm-quickfix",t.textContent="💡",t.dataset.tip=this.fix.title,t.setAttribute("aria-label",this.fix.title),t.addEventListener("mousedown",n=>n.preventDefault()),t.addEventListener("click",()=>{const{from:n,to:a,insert:s}=this.fix;a>e.state.doc.length||(e.dispatch({changes:{from:n,to:a,insert:s},selection:{anchor:n+s.length},userEvent:"input"}),e.focus())}),t}ignoreEvent(){return!0}}function Ud(i,e){const t=i.doc.length,n=[];e.current!==void 0&&e.currentr===qd;n.sort((r,o)=>r.from-o.from||Number(a(o.deco))-Number(a(r.deco))||r.to-o.to);const s=new c1;for(const r of n)s.add(r.from,r.to,r.deco);return s.finish()}const K1=Nt.define({create:()=>({marks:{placeholders:[],problems:[]},decorations:fe.none}),update(i,e){for(const a of e.effects)if(a.is(Zu))return{marks:a.value,decorations:Ud(e.state,a.value)};if(!e.docChanged)return i;const t=a=>({from:e.changes.mapPos(a.from,1),to:e.changes.mapPos(a.to,-1)}),n={...i.marks,placeholders:i.marks.placeholders.map(t).filter(a=>a.from$.decorations.from(i,e=>e.decorations)});class k$ extends cn{constructor(){super(...arguments);y(this,"elementClass","cm-error-line")}}const S$=new k$,T$=Pi.compute([K1],i=>{const e=[...new Set(i.field(K1).marks.errorLines??[])].filter(t=>tt-n);return oe.of(e.map(t=>S$.range(i.doc.line(t+1).from)))}),Qd={ClassDeclaration:"class",InterfaceDeclaration:"class",EnumDeclaration:"class",MethodDeclaration:"method",ConstructorDeclaration:"method",ForStatement:"loop",EnhancedForStatement:"loop",WhileStatement:"loop",DoStatement:"loop",IfStatement:"if",SwitchStatement:"if",TryStatement:"try"};function _$(i,e){const t=i.lineAt(e);if(!t.text.trimEnd().endsWith("{"))return t.number;let n=0;for(let a=t.number;a<=i.lines;a++)for(const s of i.line(a).text.replace(/"(?:[^"\\]|\\.)*"|\/\/.*$/g,""))if(s==="{")n++;else if(s==="}"&&--n===0)return a;return t.number}function A$(i){const{state:e}=i,t=e.doc,n=i.contentDOM.querySelector(".cm-line");if(!n)return[];const a=getComputedStyle(n),s=i.scrollDOM.getBoundingClientRect(),r=i.contentDOM.getBoundingClientRect(),o=s.left-i.scrollDOM.scrollLeft,l=s.top-i.scrollDOM.scrollTop,u=r.left-o+parseFloat(a.paddingLeft)+parseFloat(a.borderLeftWidth),m=r.right-o-6,c=i.documentTop-l,d=e.tabSize,h=i.defaultCharacterWidth,g=(z,I,T,k)=>{const C=t.line(I),P=ca(/^\s*/.exec(C.text)[0],d),D=u+P*h-7,B=i.lineBlockAt(C.from).top+c+k,j=i.lineBlockAt(t.line(T).from).bottom+c-k;return new Lr(z,D,B,Math.max(m-D,20),Math.max(j-B,4))},f=[],b=et(e).topNode,x=[];for(let z=b.firstChild;z;z=z.nextSibling){if(Qd[z.name]==="class"||z.name==="MethodDeclaration"){x.length=0;break}z.name!=="ImportDeclaration"&&z.name!=="PackageDeclaration"&&!z.name.includes("Comment")&&x.push(z)}x.length&&f.push(g("cm-scope cm-scope-method",t.lineAt(x[0].from).number,t.lineAt(x[x.length-1].to).number,1));const v=[];et(e).iterate({from:i.viewport.from,to:i.viewport.to,enter:z=>{var C;const I=Qd[z.name];if(!I||z.name==="IfStatement"&&((C=z.node.parent)==null?void 0:C.name)==="IfStatement")return;const T=t.lineAt(z.from).number,k=Math.max(t.lineAt(z.to).number,_$(t,z.from));v.push({kind:I,from:T,to:k}),f.push(g(`cm-scope cm-scope-${I}`,T,k,1))}});for(let z=1;z<=t.lines;z++){let I;for(const k of v)k.from<=z&&z<=k.to&&(!I||k.from>=I.from)&&(I=k);if(!I||I.kind!=="loop"&&I.kind!=="if"||z===I.from)continue;const T=t.line(z).text.trim();!T||T.startsWith("}")||T.endsWith("{")||T.startsWith("//")||T.startsWith("case ")||T.startsWith("default")||f.push(g("cm-scope cm-scope-method cm-scope-stmt",z,z,2))}const w=e.field(K1).marks.lines;return w&&w.fromi.docChanged||i.viewportChanged||i.geometryChanged||et(i.state)!==et(i.startState)||i.transactions.some(e=>e.effects.some(t=>t.is(Zu)))});class D$ extends cn{toDOM(){const e=document.createElement("span");return e.className="cm-breakpoint",e}}const h0=new D$,S3=pe.define(),T3=pe.define(),g0=Nt.define({create:()=>oe.empty,update(i,e){i=i.map(e.changes);for(const t of e.effects){if(t.is(T3)&&(i=oe.of(t.value.map(a=>h0.range(a)),!0)),!t.is(S3))continue;let n=!1;i.between(t.value,t.value,()=>{n=!0}),i=n?i.update({filter:a=>a!==t.value}):i.update({add:[h0.range(t.value)]})}return i}});function B$(i){const t={mousedown:(n,a)=>{const s=i.breakpointLine(n.state.doc.lineAt(a.from).number-1);return s===void 0||s>=n.state.doc.lines?!1:(n.dispatch({effects:S3.of(n.state.doc.line(s+1).from)}),queueMicrotask(()=>i.onBreakpoints()),!0)}};return[g0,vV({class:"cm-breakpoint-gutter",markers:n=>n.state.field(g0),initialSpacer:()=>h0,domEventHandlers:t}),TV({domEventHandlers:t})]}function Lu(i,e){return i.field(K1).marks.placeholders.find(t=>e>=t.from&&e<=t.to)}const P$=$.inputHandler.of((i,e,t,n)=>{if(e!==t)return!1;const a=Lu(i.state,e);return a?(i.dispatch({changes:{from:a.from,to:a.to,insert:n},selection:{anchor:a.from+n.length},userEvent:"input.type"}),!0):!1}),O$=ce.transactionFilter.of(i=>{if(!i.docChanged||!(i.isUserEvent("input.paste")||i.isUserEvent("input.drop")))return i;const e=[];if(i.changes.iterChanges((a,s,r,o,l)=>e.push({from:a,to:s,text:l.toString()})),e.length!==1||e[0].from!==e[0].to)return i;const t=Lu(i.startState,e[0].from);if(!t)return i;const{text:n}=e[0];return{changes:{from:t.from,to:t.to,insert:n},selection:{anchor:t.from+n.length},userEvent:"input.paste",scrollIntoView:!0}}),$d=i=>e=>{const t=e.state.selection.main;if(!t.empty)return!1;const n=Lu(e.state,t.head);return!n||(i?t.head>=n.to:t.head<=n.from)?!1:(e.dispatch({changes:{from:n.from,to:n.to},selection:{anchor:n.from},userEvent:"delete"}),!0)},M$=$.updateListener.of(i=>{if(!i.selectionSet||i.docChanged||!i.transactions.some(n=>n.isUserEvent("select.pointer")))return;const e=i.state.selection.main;if(!e.empty)return;const t=i.state.field(K1).marks.placeholders.find(n=>e.head>n.from&&e.headi.view.dispatch({selection:O.range(t.from,t.to)}))}),Z$=Er.define([{tag:[E.keyword,E.controlKeyword,E.definitionKeyword,E.modifier,E.operatorKeyword,E.standard(E.typeName),E.bool,E.null],color:"var(--syn-keyword)",fontWeight:"600"},{tag:[E.string,E.character],color:"var(--syn-string)"},{tag:E.number,color:"var(--syn-number)"},{tag:[E.lineComment,E.blockComment],color:"var(--syn-comment)",fontStyle:"italic"}]);function L$(i){const e=i,t=`\${// ${e.code}}`,n=(a,s,r,o=0)=>Du(s,{label:a,detail:r,type:"keyword",boost:o});return[n("if",`if (\${${e.condition}}) { - ${t} -}`,e.branch,2),n("if … else",`if (\${${e.condition}}) { - ${t} -} else { - \${// ${e.code}} -}`,e.branchElse,1),n("for",`for (int \${i} = \${0}; \${i} < \${10}; \${i}++) { - ${t} -}`,e.forLoop,2),n("while",`while (\${${e.condition}}) { - ${t} -}`,e.whileLoop,2),n("do … while",`do { - ${t} -} while (\${${e.condition}});`,e.doLoop,1),n("switch",`switch (\${${e.selector}}) { - case \${1} -> { - ${t} - } - default -> { - \${// ${e.code}} - } -}`,e.switchCase,1),n("System.out.println","System.out.println(${});",e.output,3),...["syso","sysout","sout"].map(a=>n(a,"System.out.println(${});",`System.out.println · ${e.output}`,2)),...["main","psvm"].map(a=>n(a,`public static void main(String[] args) { - ${t} -}`,"public static void main(String[] args)",2)),E$(e.input),n("scanner.nextInt","int ${zahl} = scanner.nextInt();",e.input,1),n("scanner.next","String ${text} = scanner.next();",e.input),n("scanner.nextDouble","double ${wert} = scanner.nextDouble();",e.input),n("try … catch",`try { - ${t} -} catch (\${Exception} e) { - \${// ${e.code}} -}`,"try … catch",1),n("public class",`public class \${Main} { - ${t} -}`,"public class",-2),...["import java.util.Scanner;","import javax.swing.*;","import java.awt.*;","import java.awt.event.*;"].map((a,s)=>n(a,a,"import",1-s)),...["int","double","String","boolean","char","long","final","break;","continue;","return","true","false","else","null","new","public","private","static","void","class","extends","implements","interface","this"].map(a=>({label:a,type:"keyword",boost:-1})),...["Math","JFrame","JButton","JLabel","JTextField","ActionListener","ActionEvent","Color","FlowLayout","GridLayout","BorderLayout"].map(a=>({label:a,type:"type",boost:-2})),...e.robot?[{label:"mbot",detail:"mBot2",type:"variable",boost:3}]:[],...["Math.random()","Math.abs(","Math.sqrt(","Math.max(","Math.min(",".length()",".equals("].map(a=>({label:a,type:"function",boost:-2}))]}function W$(i){if(/^\s*import\s+java\.util\.(?:Scanner|\*)\s*;/m.test(i))return;const e=/^\s*package\s+[\w.]+\s*;[^\n]*\n?/.exec(i),t=e?e[0].length:0,n=i.slice(t).replace(/^\s*\n/,"");return{from:t,insert:`import java.util.Scanner; -${/^\s*import\b/.test(n)?"":` -`}`}}function E$(i){const e=Du("Scanner ${scanner} = new Scanner(System.in);",{label:"Scanner scanner = new Scanner(System.in);",detail:i,type:"keyword",boost:3}),t=e.apply;return{...e,apply(n,a,s,r){const o=W$(n.state.doc.toString());if(!o)return t(n,a,s,r);const l=n.state.changes(o);n.dispatch({changes:l,userEvent:"input.complete"}),t(n,a,l.mapPos(s),l.mapPos(r,1))}}}function N$(i){const t={label:i.kind==="field"?i.name:`${i.name}(${i.params?"…":""})`,detail:i.returns==="void"||!i.returns?i.description:i.description?`${i.returns} · ${i.description}`:i.returns,type:i.kind==="field"?"property":"method"};return i.kind==="field"?{...t,apply:i.name}:i.params?Du(`${i.name}(\${})`,t):{...t,apply:`${i.name}()`}}function F$(){const i=In();return i==="de"?"de":i==="pt-PT"?"pt":"en"}function R$(i){const e=new Set;for(const t of i.matchAll(/\b(?:int|long|double|float|boolean|char|String|Scanner)(?:\s*\[\s*\])*\s+([A-Za-z_]\w*)/g))e.add(t[1]);return[...e].map(t=>({label:t,type:"variable",boost:1}))}class J${constructor(e,t,n){y(this,"view");y(this,"readOnly",new ma);const a=r=>{var h,g;const o=r.matchBefore(/[\w.]+/);if(!o||o.from===o.to&&!r.explicit)return null;const l=r.state.doc.lineAt(r.pos),u=l.text.slice(0,r.pos-l.from);if(/\/\//.test(u)||(((h=u.match(/"/g))==null?void 0:h.length)??0)%2===1)return null;const m=w$(r.state.doc.toString(),r.pos,F$(),(g=t.ownTypes)==null?void 0:g.call(t,r.pos));if(m)return{from:m.from,options:m.members.map((f,b)=>({...N$(f),boost:50-b})),validFor:/^\w*$/};const c=/\bvoid\s+[\w.]*$/.test(u),d=L$(t.words()).filter(f=>!(c&&(f.label==="main"||f.label==="psvm")));return{from:o.from,options:[...d,...R$(r.state.doc.toString())],validFor:/^\w*$/}},s=[B$(t),jV(),ZQ(),mq(Z$),pa.of(" "),ce.tabSize.of(4),rq(),vq(),uU(),K1,T$,C$,P$,O$,M$,this.readOnly.of(ce.readOnly.of(!1)),wU({override:[a],icons:!1}),f1.highest(Xi.of([{key:"Mod-z",run:()=>(t.onUndo(!1),!0),preventDefault:!0},{key:"Mod-Shift-z",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Mod-y",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Backspace",run:$d(!1)},{key:"Delete",run:$d(!0)},{key:"F2",run:r=>{var o;return((o=t.onRename)==null?void 0:o.call(t,r.state.selection.main.head))??!1},preventDefault:!0}])),Xi.of([...hU,...F2,zQ,...yQ]),$.domEventHandlers({contextmenu:(r,o)=>{var u;const l=o.posAtCoords({x:r.clientX,y:r.clientY});return l===null||!((u=t.onRename)!=null&&u.call(t,l,{x:r.clientX,y:r.clientY}))?!1:(r.preventDefault(),!0)}}),$.contentAttributes.of({"aria-label":n,autocapitalize:"off",autocorrect:"off",spellcheck:"false"}),$.updateListener.of(r=>{r.docChanged&&!r.transactions.some(o=>o.annotation(Vd))?queueMicrotask(()=>t.onChange()):r.selectionSet&&!r.docChanged&&queueMicrotask(()=>t.onCaret())})];this.view=new $({parent:e,state:ce.create({doc:"",extensions:s})})}get text(){return this.view.state.doc.toString()}get caret(){return this.view.state.selection.main.head}get hasFocus(){return this.view.hasFocus}get breakpoints(){const e=new Set,t=this.view.state.doc;return this.view.state.field(g0).between(0,t.length,n=>{e.add(t.lineAt(n).number-1)}),e}setBreakpoints(e){const t=this.view.state.doc,n=[...new Set(e)].filter(a=>a>=0&&at.line(a+1).from);this.view.dispatch({effects:T3.of(n)})}lineAt(e){return this.view.state.doc.lineAt(Math.min(e,this.view.state.doc.length)).number-1}setText(e){const t=Math.min(this.caret,e.length),n=this.text;let a=0;for(;a({from:n.from,to:n.to,insert:t})),userEvent:"input.rename"})}indent(){const e=this.view.state.doc,t=this.view.state.selection.main,n=t.empty?1:e.lineAt(t.from).number,a=t.empty?e.lines:e.lineAt(t.to).number,s=Le.of(YQ(e.toString(),n,a),e.length),r=s.apply(e),o=r.lineAt(s.mapPos(e.line(n).from,-1)).number,l=r.lineAt(s.mapPos(e.line(a).to,1)).number,u=[];f3(r.toString(),o,l).split(` -`).forEach((c,d)=>{const h=r.line(d+1),g=/^\s*/.exec(h.text)[0],f=/^\s*/.exec(c)[0];g!==f&&u.push({from:h.from,to:h.from+g.length,insert:f})});const m=s.compose(Le.of(u,r.length));m.empty||this.view.dispatch({changes:m,userEvent:"input.indent"}),this.view.focus()}setMarks(e,t){const n=[Zu.of(e)];e.current!==void 0&&e.current {}); - } catch (Exception e) { - } - int n = 0; - for (java.awt.Window w : java.awt.Window.getWindows()) if (w.isShowing()) n++; - return n; - } - - public static void run(String dir, String name) { - closeAll(); - try { - java.net.URLClassLoader loader = new java.net.URLClassLoader(new java.net.URL[] { new java.io.File(dir).toURI().toURL() }); - loader.loadClass(name).getMethod("main", String[].class).invoke(null, (Object) new String[0]); - } catch (java.lang.reflect.InvocationTargetException e) { - e.getCause().printStackTrace(); - } catch (NoSuchMethodException e) { - System.err.println("Die Klasse " + name + " hat keine Methode public static void main(String[] args)."); - } catch (Exception e) { - e.printStackTrace(); - } - } -} -`;let mn,pr=0;function V$(i){return new Promise((e,t)=>{const n=document.createElement("script");n.src=i,n.onload=()=>e(),n.onerror=()=>t(new Error(i)),document.head.append(n)})}function q$(i){return mn??(mn=(async()=>{await V$(G$),await cheerpjInit({status:"none"}),cheerpjCreateDisplay(-1,-1,i);const e=await fetch(Yd);if(!e.ok)throw new Error(Yd);if(cheerpOSAddStringFile(gr,new Uint8Array(await e.arrayBuffer())),cheerpOSAddStringFile("/str/VisuStructRunner.java",H$),await cheerpjRunMain("com.sun.tools.javac.Main",gr,"/str/VisuStructRunner.java","-d","/files/")!==0)throw new Error("javac");return await(await cheerpjRunLibrary("/files/")).VisuStructRunner})()),mn.catch(()=>mn=void 0),mn}function U$(i){const e=i.match(/public\s+(?:final\s+)?class\s+(\w+)/)??i.match(/\bclass\s+(\w+)/);return e?e[1]:"Main"}function Q$(i){return/\bFiles\s*\.\s*\w+\s*\(|\bnew\s+(?:File|FileReader|FileWriter|PrintWriter|BufferedReader)\s*\(/.test(i)}function $$(i,e){return i.replace(/"([\w.-]+\.(?:txt|csv|json))"/g,`"${e}$1"`)}function _3(i){i=i.replace(/\bFiles\s*\.\s*readString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g,'new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get($1)), "UTF-8")');const e=/\bFiles\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,/g;let t="",n=0;for(let a=e.exec(i);a;a=e.exec(i)){let s=1,r=a.index+a[0].length,o=!1;for(;r0;r++){const u=i[r];o?u==="\\"?r++:u==='"'&&(o=!1):u==='"'?o=!0:u==="("?s++:u===")"&&s--}if(s>0)break;const l=i.slice(a.index+a[0].length,r-1).trim();t+=i.slice(n,a.index)+`java.nio.file.Files.write(java.nio.file.Paths.get(${a[1]}), (${l}).getBytes("UTF-8"))`,n=r,e.lastIndex=r}return t+i.slice(n)}function Y$(i){if(/\bclass\s+\w+/.test(i))return i;const e=[];i=i.replace(/^[ \t]*import\s+[\w.]+(?:\.\*)?\s*;[ \t]*$/gm,a=>(e.push(a.trim()),""));const t=[...e,"import java.util.*;","import java.awt.*;","import java.awt.event.*;","import javax.swing.*;"].join(` -`)+` - -`;if(/\bstatic\s+void\s+main\s*\(/.test(i))return`${t}public class Main { -${i} -} -`;const n=Q$(i)?" throws Exception":"";return`${t}public class Main { - public static void main(String[] args)${n} { -${i} - } -} -`}async function K$(){mn&&await(await mn).closeAll()}async function A3(i,e,t){const n=new Map;for(const a of(await i.list(e)).split(` -`).filter(Boolean)){const s=await i.read(e+a);t.get(a)!==s&&n.set(a,s)}return n}function X$(i,e){const t=pr,n=`/files/run${t}/data/`,a=new Map([...vg(),...i]);let s=!1;const r=async()=>{if(!(s||pr!==t||!mn)){try{const l=await mn,u=await A3(l,n,a);for(const[m,c]of u)a.set(m,c);if(u.size&&e(u),await l.openWindows()===0)return}catch{return}o=window.setTimeout(r,1500)}};let o=window.setTimeout(r,1500);return()=>{s=!0,window.clearTimeout(o)}}async function eY(i,e){const t=await mn,n=`/files/run${++pr}/`;await t.mkdirs(n);const a=`${n}data/`,s=new Map(vg());await t.mkdirs(a);for(const[u,m]of s)cheerpOSAddStringFile(`/str/${u}`,m),await t.copy(`/str/${u}`,a+u);const r=Y$(_3($$(i,a))),o=U$(r);if(cheerpOSAddStringFile(`/str/${o}.java`,r),await cheerpjRunMain("com.sun.tools.javac.Main",gr,`/str/${o}.java`,"-d",n,"-encoding","UTF-8")!==0)return{result:"compile-error",files:new Map};e(),await t.run(n,o);const l=await A3(t,a,s);return await t.openWindows()>0?{result:"windows",files:l}:(await new Promise(u=>setTimeout(u,500)),{result:await t.openWindows()>0?"windows":"finished",files:l})}async function KY(i,e,t){const n=await mn,a=`/files/run${++pr}/`,s=`${a}src/`,r=[];for(const l of i){const u=`${s}${l.pkg?l.pkg.replace(/\./g,"/")+"/":""}${l.name}.java`;await n.write(u,_3(l.text)),r.push(u)}const o=`${a}classes/`;return await n.mkdirs(o),await cheerpjRunMain("com.sun.tools.javac.Main",gr,...r,"-d",o,"-encoding","UTF-8")!==0?{result:"compile-error",files:new Map}:(t(),await n.run(o,e),await n.openWindows()>0?{result:"windows",files:new Map}:(await new Promise(l=>setTimeout(l,500)),{result:await n.openWindows()>0?"windows":"finished",files:new Map}))}const fr=new Set("abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while true false null var record yield".split(" ")),Kd=/[\p{L}\p{N}_$]/u,tY=/[\p{L}_$]/u;function ni(i){const e=[];let t=0;for(;tt.name===e&&!Wu(i,t.from))}function Wu(i,e){let t=e-1;for(;t>=0&&(i[t]===" "||i[t]===" ");)t--;return i[t]==="."}function nY(i,e){const t=ni(i).find(n=>e>=n.from&&e<=n.to);if(!(!t||fr.has(t.name)||Wu(i,t.from)))return t}function iY(i,e,t){const n=ra(i,e);let a="",s=0;for(const r of n)a+=i.slice(s,r.from)+t,s=r.to;return{text:a+i.slice(s),count:n.length}}function Eu(i){const e=[i.caption],t=n=>{for(const a of n){e.push(a.textLines.join(` -`)),a.loopBody&&t(a.loopBody);for(const s of a.cases??[])e.push(s.name),t(s.elements)}};return t(i.elements),e}function aY(i,e,t){let n=0;const a=o=>{const l=iY(o,e,t);return n+=l.count,l.text},s=o=>o.map(l=>({...l,textLines:a(l.textLines.join(` -`)).split(` -`),...l.loopBody?{loopBody:s(l.loopBody)}:{},...l.cases?{cases:l.cases.map(u=>({name:a(u.name),elements:s(u.elements)}))}:{}}));return{doc:{...i,caption:a(i.caption),elements:s(i.elements)},count:n}}function Nu(i){const e=new Set,t=new Set,n=new Set;for(const a of i){const s=ni(a).filter(r=>!Wu(a,r.from));s.forEach((r,o)=>{if(fr.has(r.name)||r.name==="ø")return;const l=a.slice(r.to),u=s[o+1],m=u?a.slice(r.to,u.from):"",c=u!==void 0&&!fr.has(u.name)&&/^(?:\s*\[\s*\])*[ \t]+$/.test(m);c&&/^\s*(?:[=;,):]|$)/.test(a.slice(u.to))&&n.add(u.name);const d=new RegExp("^\\p{Lu}","u").test(r.name)&&/^\s*\./.test(l);/^\s*\(/.test(l)||d||c?t.add(r.name):e.add(r.name)})}return[...e].filter(a=>!t.has(a)||n.has(a))}function sY(i){return Eu(i).flatMap(e=>ni(e).map(t=>t.name))}function rY(i,e){return Eu(i).reduce((t,n)=>t+ra(n,e).length,0)}function oY(i){return Nu(Eu(i))}function Mo(i){return Nu([i.textLines.join(` -`)])}function Xd(i,e,t){if(e==="")return{ok:!1,reason:"empty"};if(e===i)return{ok:!1,reason:"same"};if(!/^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(e))return{ok:!1,reason:"invalid"};if(fr.has(e))return{ok:!1,reason:"keyword"};for(const n of t)if(n===e)return{ok:!0,warning:"exists"};return{ok:!0}}const dn=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function j3(i){return new Promise(e=>{const t=document.createElement("div");t.className="confirm";const n=i.names.length===1;t.innerHTML=``;const a=t.querySelector("form"),s=t.querySelector("label input, label select"),r=t.querySelector(".rename-new"),o=t.querySelector(".rename-info"),l=t.querySelector("button[type=submit]"),u=()=>{const c=s.value,d=r.value.trim(),h=Xd(c,d,i.existing),g=p("web_rename_count_fmt",i.count(c));o.classList.toggle("rename-warning",h.ok?h.warning==="exists":d!==""&&d!==c),h.ok?o.textContent=h.warning==="exists"?`${g} ${p("web_rename_exists_fmt",d)}`:g:o.textContent=h.reason==="invalid"?p("web_rename_invalid"):h.reason==="keyword"?p("web_rename_keyword_fmt",d):g,l.disabled=!h.ok},m=c=>{t.remove(),e(c)};r.value=s.value,s.addEventListener("change",()=>{r.value=s.value,u()}),r.addEventListener("input",u),a.addEventListener("submit",c=>{c.preventDefault();const d=r.value.trim();Xd(s.value,d,i.existing).ok&&m({from:s.value,to:d})}),t.addEventListener("click",c=>{(c.target===t||c.target.dataset.r==="0")&&m()}),t.addEventListener("keydown",c=>{c.key==="Escape"&&(c.preventDefault(),c.stopPropagation(),m())}),u(),document.body.append(t),r.focus(),r.select()})}function C3(i,e,t,n){var u;(u=document.querySelector(".rename-menu"))==null||u.remove();const a=document.createElement("div");a.className="rename-menu",a.setAttribute("role","menu");const s=document.createElement("button");s.setAttribute("role","menuitem"),s.textContent=t,a.append(s),a.style.left=`${Math.min(i,window.innerWidth-220)}px`,a.style.top=`${Math.min(e,window.innerHeight-50)}px`;const r=()=>{a.remove(),document.removeEventListener("pointerdown",o,!0),document.removeEventListener("keydown",l,!0)},o=m=>{a.contains(m.target)||r()},l=m=>{m.key==="Escape"&&r()};s.addEventListener("click",()=>{r(),n()}),document.addEventListener("pointerdown",o,!0),document.addEventListener("keydown",l,!0),document.body.append(a),s.focus()}const D3="visustruct.live.target",eh="visustruct.live.javaClass",th="visustruct.live.javaMain",nh="visustruct.live.swing",ih="visustruct.console.height",ah=150;function Zo(i){try{return localStorage.getItem(i)==="1"}catch{return!1}}function lY(i){try{return localStorage.getItem(i)}catch{return null}}function uY(i,e){try{localStorage.setItem(i,e)}catch{}}function mY(){try{const i=localStorage.getItem(D3);return i==="javascript"||i==="python"?i:"java"}catch{return"java"}}const Se=i=>i.replace(/&/g,"&").replace(//g,">");function cY(i){let e="",t=i;for(;;){const n=t.indexOf(ua);if(n<0)break;const a=t.indexOf(E0,n);if(a<0)break;e+=Se(t.slice(0,n))+`${Se(t.slice(n+1,a))}`,t=t.slice(a+1)}return e+Se(t)}const hi=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function as(i,e){let t;for(const n of i)en.to||(!t||n.to-n.fromt.path.length)&&(t=n);return t}const dY=900,hY=2e3;class gY{constructor(e,t,n,a){y(this,"element");y(this,"view");y(this,"editor");y(this,"code");y(this,"problemLine");y(this,"hint");y(this,"spans",[]);y(this,"highlighted");y(this,"html","");y(this,"target",mY());y(this,"last");y(this,"textFor",new WeakMap);y(this,"form",{asClass:Zo(eh),withMain:Zo(th)});y(this,"shown",new WeakMap);y(this,"parsed");y(this,"placeholders",[]);y(this,"problems",[]);y(this,"problemTimer");y(this,"showProblems",!0);y(this,"runErrorLine");y(this,"run");y(this,"debugLine");y(this,"breakpoints",new Set);y(this,"swing",Zo(nh));y(this,"swingElement");y(this,"swingDisplay");y(this,"stopWatchingFiles");y(this,"runButton");y(this,"stepButton");y(this,"stopButton");y(this,"indentButton");y(this,"debugPanel");y(this,"debugVars");y(this,"consoleElement");y(this,"consoleResizer");y(this,"consoleLines");y(this,"consoleForm");y(this,"consoleNotice");y(this,"onRobotRun");y(this,"onReference");y(this,"onSwap");y(this,"onRename");this.onHide=e,this.onSelect=t,this.onCode=n,this.onUndo=a,this.element=document.createElement("aside"),this.element.className="livecode",this.consoleElement=document.createElement("section"),this.consoleElement.className="console",this.consoleElement.hidden=!0,this.consoleResizer=this.makeConsoleResizer(),this.swingElement=document.createElement("section"),this.swingElement.className="console livecode-swing",this.swingElement.hidden=!0,this.swingDisplay=document.createElement("div"),this.swingDisplay.className="livecode-swing-display",this.build()}get labels(){return{condition:p("canvas_stub_condition"),selector:p("web_live_ph_selector"),code:p("web_live_ph_code"),start:p("inspector_for_init"),step:p("inspector_for_step"),end:p("web_live_ph_end")}}build(){this.run&&window.clearTimeout(this.run.timer),this.element.innerHTML=` -
    -

    ${Se(p("web_live_title"))}

    - - - - - - - - -
    -

    -
    
    -      
    -

    - - `,this.consoleElement.innerHTML=` -
    -

    ${Se(p("web_console"))}

    - -
    -
    - -

    - `,this.view=this.element.querySelector(".livecode-view"),this.editor=this.element.querySelector(".livecode-editor"),this.problemLine=this.element.querySelector(".livecode-problem"),this.hint=this.element.querySelector(".hint"),this.element.querySelector(".learn-hide").addEventListener("click",()=>this.onHide()),this.element.querySelector(".livecode-reference").addEventListener("click",()=>{var t;return(t=this.onReference)==null?void 0:t.call(this)}),this.element.querySelector(".livecode-swap").addEventListener("click",()=>{var t;return(t=this.onSwap)==null?void 0:t.call(this)}),this.runButton=this.element.querySelector("[data-run=play]"),this.stepButton=this.element.querySelector("[data-run=step]"),this.stopButton=this.element.querySelector("[data-run=stop]"),this.indentButton=this.element.querySelector(".livecode-indent"),this.indentButton.addEventListener("click",()=>this.code.indent()),this.debugPanel=this.element.querySelector(".livecode-debug"),this.debugVars=this.element.querySelector(".livecode-vars"),this.swingElement.innerHTML=` -
    -

    ${Se(p("web_live_swing_windows"))}

    - -
    - `,this.swingElement.append(this.swingDisplay),this.swingElement.querySelector(".console-hide").addEventListener("click",()=>{this.swingElement.hidden=!0,K$()});const e=this.consoleElement;this.consoleResizer.title=p("web_console_resize"),this.element.append(this.swingElement,this.consoleResizer,e),this.consoleLines=e.querySelector(".livecode-console-lines"),this.consoleForm=e.querySelector(".livecode-console-input"),this.consoleNotice=e.querySelector(".livecode-console-notice"),e.querySelector(".console-hide").addEventListener("click",()=>this.hideConsole()),this.runButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.resume():this.startRun(!1)}),this.stepButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.stepOnce():this.startRun(!0)}),this.stopButton.addEventListener("click",()=>this.stopRun(!0)),this.consoleForm.addEventListener("submit",t=>{t.preventDefault(),this.submitInput()}),this.run=void 0,this.view.addEventListener("click",t=>{const n=t.target.closest(".ln");if(!n||!this.view.classList.contains("selectable"))return;const a=as(this.spans,Number(n.dataset.line));a&&this.onSelect(a.path)}),this.code=new J$(this.editor,{onChange:()=>this.codeChanged(),onCaret:()=>this.caretMoved(),onUndo:t=>this.onUndo(t),words:()=>this.snippetWords,breakpointLine:t=>{var n;return(n=as(this.spans,t))==null?void 0:n.from},onBreakpoints:()=>this.breakpoints=this.code.breakpoints,onRename:(t,n)=>this.renameAt(t,n)},p("web_live_edit_label")),this.editor.querySelector(".cm-gutters").title=p("web_debug_gutter_title"),this.breakpoints=new Set,this.debugLine=void 0,this.highlighted=void 0,this.html="",this.parsed=void 0,this.showMode()}javaFor(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t);return a?Bm(a.text,a.doc,e,this.labels,{},this.form):_i(e,this.labels,this.form)}adoptJava(e,t){this.textFor.set(e,t),this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}documentFromJavaText(e){return Gi({caption:"",elements:[]},Ji(e,this.labels))}get javaForm(){return this.form}setJavaForm(e){this.form=e;try{localStorage.setItem(eh,e.asClass?"1":"0"),localStorage.setItem(th,e.withMain?"1":"0")}catch{}this.textFor=new WeakMap,this.shown=new WeakMap,this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}get swingSupport(){return this.swing}setSwingSupport(e){this.swing=e;try{localStorage.setItem(nh,e?"1":"0")}catch{}e||(this.swingElement.hidden=!0)}get language(){return this.target}setTarget(e){this.target=e;try{localStorage.setItem(D3,e)}catch{}this.showMode(),this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}showMode(){const e=this.target==="java";this.view.hidden=e,this.editor.hidden=!e,this.problemLine.hidden=!e,this.indentButton.hidden=!e,this.hint.textContent=p(e?"web_live_hint_edit":"web_live_hint"),this.element.querySelector(".livecode-lang").textContent={java:"Java",javascript:"JavaScript",python:"Python"}[this.target]}refresh(e,t,n){this.last={doc:e,highlight:t,context:n},this.target==="java"?this.refreshEditor(e,t,n):this.refreshView(e,t,n.editable)}refreshView(e,t,n){var l;const a=Ng(e,this.target,this.labels);this.spans=a.spans;const s=t&&a.spans.find(u=>hi(u.path,t));this.view.classList.toggle("selectable",n);const r=a.text.split(` -`).map((u,m)=>`
    ${cY(u)||" "}
    `).join("");r!==this.html&&(this.view.innerHTML=r),this.html=r;const o=s?`${s.from}-${s.to}`:void 0;o&&o!==this.highlighted&&((l=this.view.querySelector(`.ln[data-line="${s.from}"]`))==null||l.scrollIntoView({block:"nearest"})),this.highlighted=o}startRun(e){var a,s;if((a=this.onRobotRun)!=null&&a.call(this,e))return;this.runErrorLine=void 0;const t=["web_parse_missing_import","web_parse_missing_scanner","web_parse_unknown_type","web_parse_wrong_case"],n=this.target==="java"?this.javaProblems.find(r=>t.includes(r.key)):void 0;if(n){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent=p("web_parse_line_fmt",this.code.lineAt(n.from)+1,p(n.key,n.arg??"")),this.consoleNotice.classList.add("error"),this.showProblems=!0,this.drawMarks((s=this.last)==null?void 0:s.highlight);return}if(this.swing&&this.target==="java"&&!e&&this.code.breakpoints.size===0)return void this.startJavaRun();this.last&&(this.stopRun(!1),this.run={engine:new Wi(this.last.doc,this.last.context.resolve),doc:this.last.doc,printed:0,paused:!1,stepping:e,debugged:!1},this.breakpoints=this.code.breakpoints,this.debugPanel.hidden=!0,this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent="",this.consoleNotice.classList.remove("error"),this.setRunning(!0),e?this.pause():this.continueRun(!1))}async startJavaRun(){var e;this.stopRun(!1),(e=this.stopWatchingFiles)==null||e.call(this),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleLines.id="console",this.consoleForm.hidden=!0,this.consoleNotice.classList.remove("error"),this.runButton.disabled=this.stepButton.disabled=!0;try{this.consoleNotice.textContent=p("web_live_swing_loading"),await q$(this.swingDisplay),this.consoleNotice.textContent=p("web_live_swing_compiling");const{result:t,files:n}=await eY(this.code.text,()=>this.swingElement.hidden=!1);this.showWrittenFiles(n),this.consoleNotice.textContent=p({"compile-error":"web_live_swing_compile_failed",windows:"web_live_swing_running",finished:"web_live_run_finished"}[t]),this.consoleNotice.classList.toggle("error",t==="compile-error"),this.swingElement.hidden=t!=="windows",t==="windows"&&(this.stopWatchingFiles=X$(n,a=>this.showWrittenFiles(a)))}catch{this.consoleNotice.textContent=p("web_live_swing_failed"),this.consoleNotice.classList.add("error")}this.runButton.disabled=this.stepButton.disabled=!1}continueRun(e){const t=this.run;if(!t)return;const{engine:n}=t;for(let a=0;athis.continueRun(!1),0))}afterSteps(){const e=this.run,t=e.engine.state;if(this.printNewLines(),t.inputRequest)return this.askInput(),!0;if(t.isHalted||!e.engine.canStep){t.isHalted&&(this.runErrorLine=this.lineOf(e.engine.currentStepPath)),this.showWrittenFiles(t.files);const n=t.isHalted&&t.notice?m1(t.notice):void 0,a=this.runErrorLine;return this.finishRun(n?a!==void 0?p("web_parse_line_fmt",a+1,n):n:p("web_live_run_finished"),t.isHalted),!0}return!1}atBreakpoint(e){if(!e||e.callPath||e.kind==="forLoopIncrement"||e.kind==="forLoopStart"||e.kind==="callEnd")return!1;const t=this.lineOf(e.path);return t!==void 0&&this.breakpoints.has(t)}lineOf(e){var t;return e&&((t=this.spans.find(n=>hi(n.path,e)))==null?void 0:t.from)}pause(){var a,s;const e=this.run;e.paused=!0,e.debugged=!0;const t=e.engine.currentStepPath;this.debugLine=this.lineOf(t),this.consoleNotice.classList.remove("error"),this.consoleNotice.textContent=this.debugLine===void 0?"":p("web_debug_paused_fmt",this.debugLine+1),this.showVariables(),this.setRunning(!0);const n=(a=this.last)==null?void 0:a.highlight;t&&!(n&&hi(n,t))?this.onSelect(t):this.drawMarks((s=this.last)==null?void 0:s.highlight)}resume(){const e=this.run;e!=null&&e.paused&&(e.paused=!1,e.stepping=!1,this.leavePause(),this.continueRun(!0))}stepOnce(){var a,s;const e=this.run;if(!(e!=null&&e.paused))return;e.paused=!1,e.stepping=!0,this.leavePause();const{engine:t}=e,n=(a=t.steps[t.state.stepIndex])==null?void 0:a.kind;t.step(),(n==="forLoopStart"||n==="forLoopIncrement")&&t.canStep&&((s=t.steps[t.state.stepIndex])==null?void 0:s.kind)==="forLoopCondition"&&t.step(),this.afterSteps()||this.pause()}leavePause(){var e;this.debugLine=void 0,this.consoleNotice.textContent="",this.setRunning(!0),this.drawMarks((e=this.last)==null?void 0:e.highlight)}showVariables(){const e=this.run,t=e.engine.state.variables;this.debugPanel.hidden=!1;const n=[...t.keys()].sort((a,s)=>a.localeCompare(s));if(n.length===0)this.debugVars.innerHTML=`

    ${Se(p("simulation_variables_placeholder"))}

    `;else{const a=document.createElement("table");for(const s of n){const r=t.get(s),o=_e(r),l=a.insertRow();l.insertCell().textContent=s;const u=l.insertCell();r.kind==="grid"?u.append(Fp(r)):u.textContent=o,e.values&&e.values.get(s)!==o&&l.classList.add("changed")}this.debugVars.replaceChildren(a)}e.values=new Map(n.map(a=>[a,_e(t.get(a))]))}printNewLines(e){const t=this.run;if(!t)return;const n=t.engine.state.outputLines;for(;t.printeds.focus())}submitInput(){const e=this.run;if(!(e!=null&&e.engine.state.inputRequest))return;const t=this.consoleForm.querySelector("input"),{prompt:n}=e.engine.state.inputRequest;if(e.engine.provideInput(t.value),e.engine.state.inputRequest)return this.askInput();const a=e.heldLine;if(e.heldLine=void 0,this.printNewLines({prompt:n,value:t.value,heldLine:a}),t.value="",this.consoleForm.hidden=!0,!e.stepping)return this.continueRun(!1);this.afterSteps()||this.pause()}stopRun(e){var t;this.run&&(window.clearTimeout(this.run.timer),this.run.heldLine!==void 0&&this.consoleLine(this.run.heldLine),e&&this.finishRun(p("web_live_run_stopped"),!1),this.run=void 0,this.debugLine=void 0,this.debugPanel.hidden=!0,this.setRunning(!1),this.drawMarks((t=this.last)==null?void 0:t.highlight))}finishRun(e,t){var n,a;this.run&&window.clearTimeout(this.run.timer),this.consoleForm.hidden=!0,this.consoleNotice.textContent=e,this.consoleNotice.classList.toggle("error",t),(n=this.run)!=null&&n.debugged?this.showVariables():this.debugPanel.hidden=!0,this.run=void 0,this.debugLine=void 0,this.setRunning(!1),this.drawMarks((a=this.last)==null?void 0:a.highlight)}showTranscript(e){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleForm.hidden=!0,this.consoleLines.replaceChildren();for(const t of e.lines){const n=this.consoleLine(t.text);if(t.typed!==void 0){const a=document.createElement("span");a.className="typed",a.textContent=t.typed,n.append(a)}}e.pending!==void 0&&this.consoleLine(e.pending).classList.add("pending"),this.consoleLines.scrollTop=this.consoleLines.scrollHeight,this.consoleNotice.textContent=e.notice??"",this.consoleNotice.classList.toggle("error",e.error)}hideConsole(){this.stopRun(!1),this.setConsoleVisible(!1)}setConsoleVisible(e){this.consoleElement.hidden!==!e&&(this.consoleElement.hidden=!e,this.consoleResizer.hidden=!e)}makeConsoleResizer(){const e=document.createElement("div");e.className="console-resizer",e.hidden=!0,e.tabIndex=0,e.setAttribute("role","separator"),e.setAttribute("aria-orientation","horizontal");const t=this.consoleElement,n=r=>Math.round(Math.max(ah,Math.min(r,this.element.getBoundingClientRect().height-160))),a=(r,o)=>{t.style.height=r===void 0?"":`${n(r)}px`,o&&uY(ih,r===void 0?"":String(n(r)))},s=Number(lY(ih));return s>0&&(t.style.height=`${Math.max(ah,s)}px`),e.addEventListener("pointerdown",r=>{if(r.button!==0)return;r.preventDefault(),e.setPointerCapture(r.pointerId);const o=r.clientY,l=t.getBoundingClientRect().height;e.classList.add("dragging");const u=c=>a(l-(c.clientY-o),!1),m=c=>{e.removeEventListener("pointermove",u),e.removeEventListener("pointerup",m),e.removeEventListener("pointercancel",m),e.classList.remove("dragging"),a(l-(c.clientY-o),!0)};e.addEventListener("pointermove",u),e.addEventListener("pointerup",m),e.addEventListener("pointercancel",m)}),e.addEventListener("dblclick",()=>a(void 0,!0)),e.addEventListener("keydown",r=>{const o=r.key==="ArrowUp"?20:r.key==="ArrowDown"?-20:0;o&&(r.preventDefault(),a(t.getBoundingClientRect().height+o,!0))}),e}setRunning(e){var a,s;const t=!!((a=this.run)!=null&&a.paused);this.runButton.disabled=e&&!t,this.stepButton.disabled=e&&!t,this.stopButton.disabled=!e,this.indentButton.disabled=e;const n=p(t?"web_debug_continue":"web_live_run_title");this.runButton.dataset.tip=n,this.runButton.setAttribute("aria-label",t?n:p("web_live_run")),this.element.classList.toggle("running",e&&!t),this.element.classList.toggle("debugging",t),this.code.setReadOnly(e||!((s=this.last)!=null&&s.context.editable))}textForDocument(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t.owner);return a?pY(a.text,Bm(a.text,a.doc,e,this.labels,{subprograms:t.subprograms},this.form)):_i(e,this.labels,this.form)}refreshEditor(e,t,n){var r;const a=this.textForDocument(e,n);this.textFor.set(e,a),this.shown.set(n.owner,{doc:e,text:a}),this.run&&this.run.doc!==e&&this.stopRun(!1),this.code.setReadOnly(!n.editable||!!this.run),this.code.text!==a?(this.code.setText(a),this.analyze(a,n)):this.parsed||this.analyze(a,n);const s=cp(e,this.labels,this.form);this.spans=a===s.text?s.spans:((r=this.parsed)==null?void 0:r.spans)??[],this.drawMarks(t)}analyze(e,t){this.parsed=Ji(e,this.labels,{subprograms:t.subprograms}),this.placeholders=this.parsed.placeholders,this.problems=this.parsed.problems}get javaProblems(){var e;return(e=this.last)!=null&&e.doc.pseudocode?[]:this.problems}drawMarks(e){var r;const t=e&&this.spans.find(o=>hi(o.path,e)),n=t?`${t.from}-${t.to}`:void 0,a=((r=this.last)==null?void 0:r.context.editable)===!1&&t?t.from:void 0;this.code.setMarks({placeholders:this.placeholders,problems:this.showProblems?this.javaProblems:[],lines:t&&a===void 0?{from:t.from,to:t.to}:void 0,current:this.debugLine??a,errorLines:this.errorLines(),fixes:this.showProblems?this.quickFixes():[]},n!==void 0&&n!==this.highlighted&&!this.code.hasFocus);const s=this.showProblems?this.javaProblems[0]:void 0;this.problemLine.textContent=s?p("web_parse_line_fmt",this.code.lineAt(s.from)+1,p(s.key,s.arg??"")):"",this.highlighted=n}errorLines(){const e=this.showProblems?this.javaProblems.map(t=>this.code.lineAt(t.from)):[];return this.runErrorLine!==void 0&&e.push(this.runErrorLine),e}quickFixes(){const e=this.code.text,t=[];for(const n of this.javaProblems){const a=e.lastIndexOf(` -`,n.from-1)+1,s=e.indexOf(` -`,n.from)<0?e.length:e.indexOf(` -`,n.from);if(t.some(l=>l.at===s))continue;const r=(l,u,m=u.trim())=>t.push({at:s,title:p("web_quickfix_insert_fmt",m),from:l,to:l,insert:u}),o=n.arg??"";if(n.key==="web_parse_missing_import"){const l=[...e.matchAll(/^import\s[^\n]*\n/gm)],u=l[l.length-1];r(u?u.index+u[0].length:0,`${o} -`)}else if(n.key==="web_parse_missing_scanner"){const l=/^[ \t]*/.exec(e.slice(a))[0];r(a,`${l}${o} -`)}else(n.key==="web_parse_unknown_type"||n.key==="web_parse_wrong_case")&&o?t.push({at:s,title:p("web_quickfix_replace_fmt",o,e.slice(n.from,n.to)),from:n.from,to:n.to,insert:o}):n.key==="web_parse_missing"&&(o===";"||o===")")&&r(n.to,o)}return t}codeChanged(){var u,m,c,d;const e=(u=this.last)==null?void 0:u.context,t=(m=this.last)==null?void 0:m.doc;if(!e||!t)return;const n=this.code.text;this.analyze(n,e);const a=Gi(t,this.parsed),s=JSON.stringify([a.caption,a.elements])===JSON.stringify([t.caption,t.elements]),r=s?t:a;this.textFor.set(r,n),this.shown.set(e.owner,{doc:r,text:n}),this.showProblems=!1,this.runErrorLine=void 0,window.clearTimeout(this.problemTimer),this.problemTimer=window.setTimeout(()=>{var h;this.showProblems=!0,this.drawMarks((h=this.last)==null?void 0:h.highlight)},dY);const o=this.code.lineAt(this.code.caret),l=(c=as(this.parsed.spans,o))==null?void 0:c.path;s?(this.spans=this.parsed.spans,this.drawMarks((d=this.last)==null?void 0:d.highlight),l&&this.onSelect(l)):this.onCode(r,l)}get editableCode(){var e;return this.target==="java"&&((e=this.last)!=null&&e.context.editable)?this.code.text:void 0}renameInCode(e,t){var n;(n=this.onRename)==null||n.call(this),this.code.replaceRanges(ra(this.code.text,e),t)}renameAt(e,t){const n=this.editableCode,a=n!==void 0?nY(n,e):void 0;if(n===void 0||!a)return!1;const s=()=>void j3({names:[a.name],existing:ni(this.code.text).map(r=>r.name),count:r=>ra(this.code.text,r).length}).then(r=>{r&&this.renameInCode(r.from,r.to),this.code.view.focus()});return t?C3(t.x,t.y,p("web_rename_menu"),s):s(),!0}caretMoved(){var n,a;const e=as(this.spans,this.code.lineAt(this.code.caret)),t=(n=this.last)==null?void 0:n.highlight;e&&((a=this.last)!=null&&a.context.editable)&&!(t&&hi(t,e.path))&&this.onSelect(e.path)}get snippetWords(){const e=this.labels;return{condition:e.condition,selector:e.selector,code:e.code,start:e.start,step:e.step,branch:p("element_verzweigung"),branchElse:p("element_verzweigung"),switchCase:p("element_fallauswahl"),forLoop:p("element_forSchleife"),whileLoop:p("element_whileSchleife"),doLoop:p("element_doUntilSchleife"),output:p("inspector_io_mode_output"),input:p("inspector_io_mode_input"),robot:jn()}}}function pY(i,e){const t=i.split(` -`),n=e.split(` -`);let a=0;for(;aa?f3(e,a+1,n.length-s):e}const _n=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Lo=300;class fY{constructor(){y(this,"element");y(this,"rail");y(this,"heightBar");y(this,"onHide",()=>{});y(this,"onToggleStacked",()=>{});y(this,"stage");y(this,"status");y(this,"picker");y(this,"playButton");y(this,"stackButton");y(this,"view");y(this,"loading");y(this,"worlds",[]);y(this,"worldsKey");y(this,"setup",Ni);y(this,"result");y(this,"lastKey");y(this,"pending");y(this,"playTimer");y(this,"input");y(this,"simulation");this.element=document.createElement("aside"),this.element.className="robotpreview",this.element.innerHTML=` - -
    -

    🤖 ${_n(p("web_visubot_preview_title"))}

    - - - -
    -

    ${_n(p("web_visubot_preview_hint"))}

    - -
    -

    `;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${Dt}🤖 ${_n(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=ee(async()=>{const{Robot3D:e}=await import("./robot3d-CJE1N58D.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` -`+JSON.stringify(e);r!==this.lastKey&&(this.lastKey=r,window.clearTimeout(this.pending),this.pending=window.setTimeout(()=>this.recompute(),120))}setWorlds(e){this.worlds=e,this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t)),this.picker.append(a)}),this.useWorld(e[0]??Ni)}useWorld(e){var t;this.worlds.forEach((n,a)=>{var s;return(s=this.picker.children[a])==null?void 0:s.classList.toggle("active",n===e)}),!(e===this.setup&&this.result)&&(this.setup=e,(t=this.view)==null||t.setWorld(e),this.recompute())}recompute(){var e;if(this.pending=void 0,this.stopPlaying(!1),!!this.input){try{this.result=Ap(this.input.doc,this.input.resolve,this.setup)}catch{this.result=void 0}this.showFrame((e=this.result)==null?void 0:e.frames.at(-1)),this.updateStatus()}}showFrame(e,t=0){if(!this.view)return;const n=e??{pose:{...this.setup.start},trail:[{x:this.setup.start.x,y:this.setup.start.y}],leds:Array(5).fill(void 0),screen:void 0};t>0?this.view.moveTo(n.pose,n.trail,t):this.view.place(n.pose,n.trail),this.view.setLeds(n.leds),this.view.setScreen(n.screen)}play(){var a;const e=(a=this.result)==null?void 0:a.frames;if(!e||e.length<2||!this.view)return;this.stopPlaying(!1);let t=0;this.showFrame(e[0]),this.playButton.innerHTML=me.stop,this.playButton.dataset.tip=p("web_visubot_preview_stop"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_stop"));const n=()=>{if(t++,t>=e.length){this.stopPlaying(!1);return}const s=e[t];s.tone&&sp(s.tone[0],s.tone[1]),this.showFrame(s,Lo-30),this.playTimer=window.setTimeout(n,Lo)};this.playTimer=window.setTimeout(n,Lo)}stopPlaying(e){var t;this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.playButton.innerHTML=me.play,this.playButton.dataset.tip=p("web_visubot_preview_play"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_play")),e&&this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}updateStatus(){const e=this.result;if(this.playButton.disabled=!e||e.frames.length<2,!e){this.status.textContent="";return}const t=[p("web_visubot_preview_distance_fmt",e.distance)];e.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${e.bumps}`),e.stop==="input"?t.push(p("web_visubot_preview_input")):e.stop==="limit"?t.push(p("web_visubot_preview_limit")):e.stop==="error"&&e.notice&&t.push(`⚠︎ ${m1(e.notice)}`),this.status.textContent=t.join(" · ")}pause(){window.clearTimeout(this.pending),this.pending=void 0,this.lastKey=void 0,this.stopPlaying(!1)}}const bY={left:12,top:10},xY=8,br=8e3,Zi=16,Wo=12,B3="#fafafa";function P3(i){const e=i.caption.trim();return e===""?p("diagram_title_placeholder"):e}function sh(i){let e=i.trim().replace(/\.visustruct$/i,"");if(e==="")return"";for(e=e.replace(/\s/g,"-").replace(/[/:\\*?"<>|]/g,"-");e.includes("--");)e=e.replace(/--/g,"-");return e=e.replace(/^-+|-+$/g,""),e.length>120&&(e=e.slice(0,120).replace(/^-+|-+$/g,"")),e}function rh(i,e){return sh(i.caption)||sh(e)||"VisuStruct"}function vY(i,e,t){const n=i.split(/\s+/),a=[];let s="";for(const r of n){const o=s?`${s} ${r}`:r;s&&t(o,Zi,"bold")>e?(a.push(s),s=r):s=o}if(s&&a.push(s),a.length>2){let r=a.slice(1).join(" ");for(;r.length>1&&t(r+"…",Zi,"bold")>e;)r=r.slice(0,-1);return[a[0],r+"…"]}return a}function oh(i,e,t,n=320){const a={...i,elements:i.elements.map(_s)},s=new Yh(e,t).layout(a,bY),r=Math.min(br,Math.max(n,s.canvasSize.width)),o=Math.min(br,Math.max(n,s.canvasSize.height));if(r<=2||o<=2)return;const l=vY(P3(i),r-2*Wo,t),u=Math.ceil(Zi*1.2),m=Math.min(56,l.length*u+2),c=m+o,d=new eg(e,t).render(s,{width:r,height:o},void 0,xY);d.setAttribute("y",String(m)),d.removeAttribute("class");const h=Te("svg",{xmlns:"http://www.w3.org/2000/svg",width:r,height:c,viewBox:`0 0 ${r} ${c}`});h.append(Te("rect",{x:0,y:0,width:r,height:c,fill:B3}));const g=Te("text",{x:Wo,y:0,"font-family":la,"font-size":Zi,"font-weight":600,fill:"black"});return l.forEach((f,b)=>{const x=Te("tspan",{x:Wo,y:b*u+Zi});x.textContent=f,g.append(x)}),h.append(g,d),{svg:h,width:r,height:c}}function O3(i){return` -`+new XMLSerializer().serializeToString(i.svg)}async function lh(i,e){const t=Math.max(1,Math.min(e,br/i.width,br/i.height)),n=URL.createObjectURL(new Blob([O3(i)],{type:"image/svg+xml"}));try{const a=new Image;a.src=n,await a.decode();const s=document.createElement("canvas");s.width=Math.round(i.width*t),s.height=Math.round(i.height*t);const r=s.getContext("2d");return r.fillStyle=B3,r.fillRect(0,0,s.width,s.height),r.drawImage(a,0,0,s.width,s.height),s}finally{URL.revokeObjectURL(n)}}function wY(i){return new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new Error("PNG konnte nicht erzeugt werden.")),"image/png"))}function yY(i,e){const a=Math.max(1,i),s=Math.max(1,e),r=f=>{const b=f.width-64,x=f.height-64;return{s:Math.min(b/a,x/s)*.98,cw:b,ch:x}},o={width:595,height:842},l={width:842,height:595},u=r(o),m=r(l),[c,d]=m.s>u.s?[l,m]:[o,u],h=a*d.s,g=s*d.s;return{page:c,draw:{x:32+(d.cw-h)/2,y:32+(d.ch-g)/2,width:h,height:g}}}async function zY(i){const e=new Blob([i]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(e).arrayBuffer())}function uh(i){let e="FEFF";for(let t=0;t`}async function IY(i,e,t,n,a){const{page:s,draw:r}=yY(n.width,n.height),o=await zY(i),l=x=>(Math.round(x*100)/100).toString(),u=`q ${l(r.width)} 0 0 ${l(r.height)} ${l(r.x)} ${l(s.height-r.y-r.height)} cm /Im0 Do Q`,m=new TextEncoder,c=[["<< /Type /Catalog /Pages 2 0 R >>"],["<< /Type /Pages /Kids [3 0 R] /Count 1 >>"],[`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${s.width} ${s.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`],[`<< /Type /XObject /Subtype /Image /Width ${e} /Height ${t} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${o.length} >> -stream -`,o,` -endstream`],[`<< /Length ${u.length} >> -stream -${u} -endstream`],[`<< /Creator ${uh("VisuStruct")} /Title ${uh(a)} >>`]],d=[];let h=0;const g=x=>{const v=typeof x=="string"?m.encode(x):x;d.push(v),h+=v.length};g(`%PDF-1.4 -%âãÏÓ -`);const f=[];c.forEach((x,v)=>{f.push(h),g(`${v+1} 0 obj -`),x.forEach(g),g(` -endobj -`)});const b=h;g(`xref -0 ${c.length+1} -0000000000 65535 f -`);for(const x of f)g(`${String(x).padStart(10,"0")} 00000 n -`);return g(`trailer -<< /Size ${c.length+1} /Root 1 0 R /Info ${c.length} 0 R >> -startxref -${b} -%%EOF -`),new Blob(d,{type:"application/pdf"})}function kY(i){const{data:e}=i.getContext("2d").getImageData(0,0,i.width,i.height),t=new Uint8Array(i.width*i.height*3);for(let n=0,a=0;nObject.entries(Bt).map(([i,e])=>{if(i==="getColor")return` def ${i}(self): - farbe = ${e.python} - return FARBNAMEN.get(farbe, farbe) -`;const t=typeof e.simulated=="boolean"?`bool(${e.python})`:e.python;return` def ${i}(self): - return ${t} -`}).join(` -`);function _Y(i){const e=Object.entries(Cs).map(([n,a])=>` ${JSON.stringify(n)}: (${a.join(", ")}), -`).join(""),t=Object.entries(SY).map(([n,a])=>` ${JSON.stringify(n)}: ${JSON.stringify(i==="de"?a:n)}, -`).join("");return`import event, time, math, cyberpi, mbot2, mbuild - -FARBEN = { -${e}} - -FARBNAMEN = { -${t}} - - -class Led: - def __init__(self, nr): - self.nr = nr - - def setColor(self, farbe): - r, g, b = FARBEN.get(farbe, (0, 0, 0)) - cyberpi.led.on(r, g, b, id=self.nr + 1) - - -def strecke(wert, einheit): - # Überladung forward(2, "Umdrehungen"): eine Radumdrehung ist pi * ${el} cm - if einheit.lower() in ("umdrehung", "umdrehungen", "rotation", "rotations", "rotação", "rotações"): - return wert * math.pi * ${el} - return wert - - -class MBot: - def forward(self, wert=10, einheit="cm"): - mbot2.straight(strecke(wert, einheit)) - - def backward(self, wert=10, einheit="cm"): - mbot2.straight(-strecke(wert, einheit)) - - def turnLeft(self, grad=90): - mbot2.turn(-grad) - - def turnRight(self, grad=90): - mbot2.turn(grad) - - def stop(self): - mbot2.EM_stop("ALL") - - def drive(self, links, rechts): - mbot2.drive_power(links, -rechts) - - def setLed(self, r, g, b): - cyberpi.led.on(r, g, b) - - def ledOff(self): - cyberpi.led.off() - - def led(self, nr): - return Led(nr) - - def playTone(self, hz, ms): - cyberpi.audio.play_tone(hz, ms / 1000) - - def pause(self, ms): - time.sleep(ms / 1000) - - def resetTimer(self): - cyberpi.timer.reset() - - def emotion(self, name): - getattr(cyberpi.emotion, name)() - - def showText(self, text): - cyberpi.display.clear() - cyberpi.display.show_label(str(text), 24, "center") - -${TY()} - -mbot = MBot() -`}const AY=i=>` - -laeuft = False - - -@event.start -def beim_einschalten(): - mbot.showText(${JSON.stringify(i)}) - - -@event.is_press("a") -def taste_a(): - global laeuft - if laeuft: - return - laeuft = True - cyberpi.display.clear() - try: - programm() - finally: - mbot.stop() - laeuft = False -`;function jY(i,e,t,n="A = Start"){const a={pythonWithoutMatch:!0},s=mh(Ws(i,"python",a)),r=e.filter(h=>h!==i&&Tt(h.caption)).map(h=>mh(Ws(h,"python",a))),o=[s,...r].join(` -`);if(/\binput\(/u.test(o))return{error:"input"};if(/\bopen\(|\bos\.path\b/u.test(o))return{error:"files"};const l=new Set,u=h=>h.split(` -`).filter(g=>(/^import \w+$/u.test(g)&&l.add(g),!/^import \w+$/u.test(g))).join(` -`).trim(),m=u(s);if(m===""||/^#[^\n]*$/u.test(m))return{error:"empty"};const c=m.split(` -`).map(h=>h.trim()===""?"":" "+h).join(` -`);return{source:`# VisuStruct VisuBot -${_Y(t)}${[...l].join(` -`)} - -`+r.map(h=>u(h)+` - - -`).join("")+`def programm(): -${c} -`+AY(n)}}function mh(i){return i.split(` -`).map(e=>{const t=/^(\s*)(.*)$/u.exec(e);return t[2].startsWith("#")?e:t[1]+M3(t[2])}).join(` -`)}const CY=/^(==|!=|<=|>=|\+=|-=|\*=|\/=|=|<|>|,|:)/u,DY=/^(and|or|not|in|if|elif|while|return|for|else)\b/u;function M3(i){let e="",t="",n=0;for(let a=0;a0)){if(h==="+"&&e.trim()!==""&&!/[-+*/%(,=<>]\s*$/u.test(e)){t.push(e),e="";continue}e+=h}}if(n>0&&(e+=i.slice(a)),t.push(e),t.length<2)return t[0];const s=/^\s*/u.exec(t[0])[0],r=/\s*$/u.exec(t[t.length-1])[0],o=t.map(d=>d.trim()),l=d=>d.startsWith('"')||d.startsWith("'")||d.startsWith("str("),u=o.findIndex(l);if(u<0)return i;const m=u>0?[`str(${o.slice(0,u).join(" + ")})`]:[],c=o.slice(u).map(d=>l(d)?d:`str(${d})`);return s+[...m,...c].join(" + ")+r}const T1=i=>i.replace(/&/g,"&").replace(//g,">");function BY(i,e){const t=document.createElement("dialog");t.className="about mbot-upload",t.setAttribute("aria-labelledby","mbot-upload-title"),t.innerHTML=` -
    -

    ⬆ ${T1(p("web_visubot_upload_title"))}

    - -
    -
    -
      -
    1. ${T1(p("web_visubot_upload_step1"))}
    2. -
    3. ${T1(p("web_visubot_upload_step2"))}
    4. -
    5. ${T1(p("web_visubot_upload_step3"))}
    6. -
    - -

    - -
    `;const n=t.querySelector(".mbot-upload-status"),a=t.querySelector("progress"),s=t.querySelector("[data-action=upload-start]");let r=!1;const o=()=>!r&&t.close();t.querySelector("[data-action=upload-close]").addEventListener("click",o),t.addEventListener("cancel",u=>r&&u.preventDefault()),t.addEventListener("click",u=>u.target===t&&o()),t.addEventListener("close",()=>t.remove());const l=jY(i,e,Kb(),p("web_visubot_upload_label"));"error"in l&&(n.textContent=`⚠︎ ${p(`web_visubot_upload_error_${l.error}`)}`,s.hidden=!0),s.addEventListener("click",async()=>{if("source"in l){r=!0,s.disabled=!0,a.hidden=!1,a.value=0,n.textContent=p("web_visubot_upload_busy");try{await be.upload(l.source,(u,m)=>a.value=u/m),a.value=1,n.textContent=`✓ ${p("web_visubot_upload_done")}`,n.classList.add("done")}catch(u){const m=u;n.textContent=m.name==="NotFoundError"?"":`⚠︎ ${p("web_visubot_upload_failed")} (${m.message})`,a.hidden=!0,await be.disconnect(m.name==="NotFoundError"?void 0:m.message).catch(()=>{})}finally{r=!1,s.disabled=!1}}}),document.body.append(t),t.showModal()}const ss=[S.verzweigung,S.whileSchleife,S.doUntilSchleife,S.anweisung],dh=()=>[{description:p("web_file_type"),accept:{"application/xml":[".visustruct",".strk"]}}],rs=i=>p(`element_${S[i]}`),PY={[S.verzweigung]:"age >= 18",[S.whileSchleife]:"i < 10",[S.doUntilSchleife]:"again == 1",[S.fallauswahl]:"day"},OY={statement:'int number = 5 | double x = 1.5 | String text = "Your text" | boolean ok = true | const double PI = 3.14',input:'input: int age "Enter age" | input: double price "Enter price" | input: String name "Enter name"',output:'output: number | output: "Your text" | output: "Your age: " + age'};function xr(i){switch(i.type){case S.anweisung:{const e=Ss(i.textLines.join(` -`));return e==="input"?"input:":e==="output"?"output:":void 0}case S.verzweigung:return"if";case S.whileSchleife:case S.doUntilSchleife:return"while";case S.fallauswahl:return"switch";default:return}}function hh(i){const e=xr(i),t=i.textLines.join(` -`),n=e?Vh(e,t):t;return i.type===S.anweisung&&n.trim()==="ø"?"":n}function gh(i,e,t){const n=st(i,e);if(!n)return;const a=xr(n);if(n.type===S.anweisung&&!a&&t.trim()==="")return pn(i,e,["ø"]);const s=a?lb(a,Vh(a,t)):t;return pn(i,e,s.split(` -`))}function ph(i){switch(i.type){case S.anweisung:{const e=Ss(i.textLines.join(` -`));return e==="input"?'int age "Enter age"':e==="output"?'"Your age: " + age':p("inspector_placeholder_statement")}case S.verzweigung:case S.whileSchleife:case S.doUntilSchleife:case S.endlosschleife:return p("inspector_placeholder_condition");case S.fallauswahl:return p("inspector_placeholder_selector");case S.aufruf:return p("inspector_placeholder_call");case S.aussprung:return p("inspector_placeholder_break");default:return""}}function de(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}const MY=760,fh=[{value:1,label:"settings_ui_scale_small"},{value:1.22,label:"settings_ui_scale_medium"},{value:1.5,label:"settings_ui_scale_large"},{value:1.82,label:"settings_ui_scale_extra_large"}],Eo=[{value:14,label:"settings_ui_scale_small"},{value:17,label:"settings_ui_scale_medium"},{value:20,label:"settings_ui_scale_large"},{value:24,label:"settings_ui_scale_extra_large"}];function bh(i){document.documentElement.style.setProperty("--code-size",`${i}px`)}const ZY=/Mac|iPhone|iPad/.test(navigator.platform);function os(i){return $3(jn()?"visubot":"visustruct",In(),i)}function Rt(i,e,t,n){const a=n?`${e} (${n})`:e;return``}function An(i,e=!1){return ZY?`${e?"⇧":""}⌘${i}`:[p("web_key_ctrl"),...e?[p("web_key_shift")]:[],i].join("+")}const W=JY,xh="visustruct.ui.scale.canvas",vh="visustruct.ui.scale.code",wh="visustruct.learn.open",yh="visustruct.files.open",zh="visustruct.files.width",Ih="visustruct.learn.width",kh="visustruct.live.open",LY="visustruct.live.width",Sh="visustruct.robotPreview.open",Th="visustruct.codeMain",No="visustruct.visubot.blocks",_h="visustruct.palette.width",WY="visustruct.editor.width",Ah="visustruct.visubot.collapsedGroups",jh="visustruct.robotPreview.stacked",Ch="visustruct.robotPreview.width",Dh="visustruct.simulation.diagram",Bh="visustruct.inspector.height",Ph="visustruct.robotPreview.height",Oh="visustruct.editor.hidden",Fo="visustruct.palette.compact",Mh="visustruct.palette.hidden",EY='',NY=80;class FY{constructor(e){y(this,"tabs",[]);y(this,"tabIndex",0);y(this,"nextTabSerial",1);y(this,"clipboard");y(this,"zoom",1);y(this,"simulating",!1);y(this,"exportButton");y(this,"closeExport");y(this,"learn");y(this,"shell");y(this,"railButton");y(this,"liveRailButton");y(this,"editorRailButton");y(this,"topbar",de("div",{class:"topbar"}));y(this,"bottombar",de("div",{class:"bottombar"}));y(this,"editorHidden",!1);y(this,"setPaletteHidden");y(this,"files");y(this,"filesRailButton");y(this,"closeSettings");y(this,"escapeSettings");y(this,"exerciseSaveTimer");y(this,"paletteObserver");y(this,"resizeObserver");y(this,"renderedHostSize",{width:-1,height:-1});y(this,"simPath");y(this,"sim");y(this,"simButton");y(this,"pseudocodeBox");y(this,"blockMode",!1);y(this,"varList");y(this,"shownVars","");y(this,"blocks");y(this,"blocksButton");y(this,"coding",!1);y(this,"code");y(this,"codeButton");y(this,"liveCoding",!1);y(this,"codeTyping");y(this,"live");y(this,"preview",new fY);y(this,"previewOpen",!1);y(this,"previewOpenedForSim",!1);y(this,"codeMain",!1);y(this,"previewStacked",!1);y(this,"previewResizer");y(this,"measure",cb());y(this,"metrics",db());y(this,"engine",new Yh(this.metrics,this.measure));y(this,"renderer",new eg(this.metrics,this.measure));y(this,"layout");y(this,"flat",[]);y(this,"canvasHost");y(this,"svg");y(this,"overlay");y(this,"inspector");y(this,"captionInput");y(this,"undoButton");y(this,"redoButton");y(this,"deleteButton");y(this,"statusLine");y(this,"drag");y(this,"inline");y(this,"lastCanvasTap",{spot:"",time:0,x:0,y:0});y(this,"pendingInline");y(this,"downloads",null);y(this,"inViewer","claude"in window);y(this,"visuBot");y(this,"stopLinkListener");y(this,"tabStrip");this.root=e,this.tabs.push(this.makeTab());const t=new URLSearchParams(location.search);t.has("visubot")?Ti("on"):t.has("visustruct")&&Ti("off"),Um(Si()),Vm(Me(No)==="1"),this.learn=new RJ(this.learnHost());const n=t.get("lektion")??void 0;n&&this.learn.showLesson(n),this.shell=document.createElement("div"),this.shell.className="shell",e.replaceWith(this.shell),this.live=new gY(()=>this.setLiveCoding(!1),u=>{this.selected=u,this.render()},(u,m)=>this.commitFromCode(u,m),u=>u?this.redo():this.undo()),this.live.onRobotRun=u=>this.runRobot(u),this.live.onSwap=()=>this.setCodeMain(!this.codeMain),this.live.onRename=()=>this.codeTyping=void 0,this.live.onReference=()=>{this.learn.showReference(),this.setLearning(!0)},this.files=new $J({open:(u,m,c)=>this.openFromWorkspace(u,m,c),hide:()=>this.setFilesOpen(!1),message:u=>this.showMessage(u),progressLoaded:()=>{this.learn.restore(),n&&this.learn.showLesson(n)},chooseWorld:u=>this.chooseWorld(u,!1)});const a=de("div",{class:"columns"});a.append(this.filesRail(),this.files.element,this.panelResizer(this.files.element,"files-resizer",zh,p("web_files_resize"),1),this.learnRail(),this.learn.element,this.learnResizer(),this.editorRail(),e,this.panelResizer(e,"editor-resizer",WY,p("web_editor_resize"),()=>this.codeMain?-1:1,()=>this.live.element),this.liveResizer(),this.live.element,this.liveRail(),this.previewResizer=this.panelResizer(this.preview.element,"preview-resizer",Ch,p("web_visubot_preview_resize"),-1),this.preview.element,this.preview.rail),this.setupPreview(),this.shell.append(this.topbar,a,this.bottombar);const s=Me(wh),r=new URLSearchParams(location.search).has("learn")||n!==void 0;this.showWorldInURL(),this.setLearning(r||(s===null?window.innerWidth>1100:s==="1"),r),this.setFilesOpen(Me(yh)==="1");const o=Number(Me(xh));fh.some(u=>u.value===o)&&(this.zoom=o),this.setLiveCoding(Me(kh)==="1"),this.setEditorHidden(Me(Oh)==="1"),this.buildUI(),this.setCodeMain(Me(Th)==="1"),this.render(),window.addEventListener("pointermove",u=>this.onPointerMove(u)),window.addEventListener("pointerup",u=>this.onPointerUp(u)),window.addEventListener("pointercancel",()=>this.endDrag()),window.addEventListener("keydown",u=>this.onKeyDown(u)),window.addEventListener("beforeunload",u=>{(this.tabs.some(m=>m.dirty&&!m.exerciseId)||!this.files.ready&&ve.hasContent())&&u.preventDefault()}),this.setupFileDrop();const l=window.claude;typeof(l==null?void 0:l.use)=="function"&&l.use("downloads").then(u=>this.downloads=u).catch(()=>{})}get tab(){return this.tabs[this.tabIndex]}get doc(){return this.tab.doc}set doc(e){this.tab.doc=e}get fileName(){return this.tab.fileName??`${hn(this.tab)}.visustruct`}get fileHandle(){return this.tab.fileHandle}set fileHandle(e){this.tab.fileHandle=e}get dirty(){return this.tab.dirty}set dirty(e){this.tab.dirty=e}get undoStack(){return this.tab.undoStack}get redoStack(){return this.tab.redoStack}get selected(){return this.tab.selected}set selected(e){this.tab.selected=e}buildUI(){var ge,ie,ue,N;this.root.className="app",this.root.innerHTML=` -
    - ${jn()?ip:'VisuStruct'} ${W(p("web_brand_suffix"))} -
    - ${Rt("new",p("toolbar_new"),me.newFile)} - ${Rt("open",p("menu_open"),me.open,An("O"))} - ${Rt("save",p("menu_save"),me.save,An("S"))} -
    -
    - - -
    -
    - - - - -
    - - -
    -
    - - - - `,this.topbar.replaceChildren(this.root.querySelector(".toolbar")),this.bottombar.replaceChildren(this.root.querySelector(".statusbar"));const e=_=>this.root.querySelector(_)??this.topbar.querySelector(_)??this.bottombar.querySelector(_);this.canvasHost=e(".canvas"),this.blocks=new up({press:(_,M)=>{if(this.simulating)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const J=this.selected&&Mn(_,this.selected);this.selected=_,this.render(),M.pointerType!=="touch"&&!(gn(this.doc,_)&&!J)?this.beginDrag(M,{kind:"move",path:_}):M.preventDefault()},editValue:(_,M,J)=>{const q=Tm(this.doc,_,M,J);q?this.commit(pn(this.doc,_,q),_):this.render()},labels:hp()}),this.canvasHost.after(this.blocks.element),this.inspector=e(".inspector"),this.captionInput=e(".caption"),this.undoButton=e("[data-action=undo]"),this.redoButton=e("[data-action=redo]"),this.deleteButton=e("[data-action=delete]"),this.statusLine=e(".status"),this.simButton=e("[data-action=simulate]"),this.pseudocodeBox=e("[data-action=pseudocode]"),this.blocksButton=e("[data-action=blocks]"),this.blocksButton.addEventListener("click",()=>this.setBlockMode(!this.blockMode,!0)),this.pseudocodeBox.addEventListener("change",()=>this.commit({...this.doc,pseudocode:this.pseudocodeBox.checked||void 0})),e("[data-action=hide-editor]").addEventListener("click",()=>this.setEditorHidden(!0)),e("[data-action=swap-main]").addEventListener("click",()=>this.setCodeMain(!this.codeMain)),this.labelSwap(),this.sim=new rJ(()=>this.doc,_=>{this.simPath=_,this.simulating&&this.renderDiagramOnly(),this.scrollToSimPath()},_=>this.findSubprogram(_),()=>this.setSimulating(!1),_=>{this.simulating&&this.liveCoding&&this.live.showTranscript(_)}),this.root.append(this.sim.element,this.simResizer(),this.inspectorResizer()),jn()?(this.visuBot??(this.visuBot=new J4),this.sim.setRobot(this.visuBot)):(this.preview.hostSimulation(void 0),(ge=this.visuBot)==null||ge.dispose(),this.visuBot=void 0),this.simButton.addEventListener("click",()=>this.setSimulating(!this.simulating)),this.codeButton=e("[data-action=code]"),this.code=new f4(()=>this.doc,(_,M)=>this.offerDownload(_,new Blob([M],{type:"text/plain"})),()=>this.setCoding(!1),_=>this.commit({...this.doc,pseudocode:_||void 0}),()=>this.tabs.filter(_=>_!==this.tab&&Tt(_.doc.caption)).map(_=>_.doc)),this.root.append(this.code.element),this.codeButton.addEventListener("click",()=>this.setCoding(!this.coding)),(ie=this.paletteObserver)==null||ie.disconnect();const t=()=>Number(Me(_h))||0,n=()=>this.root.classList.toggle("compact-palette",Me(Fo)==="1"||(t()>0?t()<150:this.root.getBoundingClientRect().widthMe(Mh)==="1",s=(_,M)=>{const J=_===void 0?void 0:Math.round(Math.max(80,Math.min(360,_)));a()?this.root.style.setProperty("--palette-width","36px"):J===void 0?this.root.style.removeProperty("--palette-width"):this.root.style.setProperty("--palette-width",`${J}px`),M&&Ze(_h,J===void 0?"":String(J)),n()},r=_=>{Ze(Mh,_?"1":"0"),this.root.classList.toggle("palette-hidden",_),s(t()>0?t():void 0,!1)};r(a()),this.setPaletteHidden=r,e("[data-action=hide-palette]").addEventListener("click",()=>r(!0)),e("[data-action=show-palette]").addEventListener("click",()=>r(!1));const o=e(".palette-resizer"),l=e(".palette"),u=()=>getComputedStyle(this.shell).direction==="rtl"?-1:1;o.addEventListener("pointerdown",_=>{if(_.button!==0)return;_.preventDefault(),o.setPointerCapture(_.pointerId);const M=_.clientX,J=l.getBoundingClientRect().width,q=u();this.shell.classList.add("resizing");const X=ae=>s(J+q*(ae.clientX-M),!1),Y=ae=>{o.removeEventListener("pointermove",X),o.removeEventListener("pointerup",Y),o.removeEventListener("pointercancel",Y),this.shell.classList.remove("resizing");const re=J+q*(ae.clientX-M);re<50?r(!0):s(re,!0)};o.addEventListener("pointermove",X),o.addEventListener("pointerup",Y),o.addEventListener("pointercancel",Y)}),o.addEventListener("dblclick",()=>s(void 0,!0)),o.addEventListener("keydown",_=>{const M=_.key==="ArrowRight"?20:_.key==="ArrowLeft"?-20:0;M&&(_.preventDefault(),s(l.getBoundingClientRect().width+u()*M,!0))}),this.paletteObserver=new ResizeObserver(n),this.paletteObserver.observe(this.root);const m=e("[data-action=compact-palette]");m.checked=Me(Fo)==="1",m.addEventListener("change",()=>{Ze(Fo,m.checked?"1":"0"),n()});const c=(_,M,J,q,X)=>{const Y=document.createElement("li");Y.className="palette-item",Y.dataset.item=X,Y.dataset.scope=Yo(q().type)??"method",Y.append(this.paletteIcon(M),document.createTextNode(J)),Y.addEventListener("pointerdown",ae=>this.beginDrag(ae,{kind:"palette",make:q,label:J})),Y.tabIndex=0,Y.addEventListener("keydown",ae=>{(ae.key==="Enter"||ae.key===" ")&&this.insertNearSelection(q())}),_.append(Y)},d=e(".palette-basic");for(const{item:_}of gb)c(d,_,rs(qr(_).type),()=>qr(_),_);const h=jn();this.blocksButton.hidden=!h,this.setBlockMode(h&&Me(No)==="1",!1),this.root.classList.toggle("visubot-mode",h),this.shell.classList.toggle("robot-world",h),h||this.preview.pause(),document.documentElement.classList.toggle("visubot-theme",h);const g=e(".palette-visubot");if(g.hidden=!h,e(".palette-visubot-title").hidden=!h,h){const _={[S.verzweigung]:"verzweigung",[S.whileSchleife]:"whileSchleife"},M=new Set((Me(Ah)??"").split(",").filter(Boolean)),J=(Y,ae)=>{const re=document.createElement("li");re.className="palette-group",re.dataset.botColor=fl(ae);const xe=document.createElement("button");xe.type="button",xe.textContent=[H0[ae],p(`web_visubot_group_${ae}`)].filter(Boolean).join(" ");const Je=Un=>{xe.setAttribute("aria-expanded",String(Un));for(const b1 of Y.querySelectorAll(`[data-group="${ae}"]`))b1.hidden=!Un};return xe.addEventListener("click",()=>{const Un=xe.getAttribute("aria-expanded")!=="true";Un?M.delete(ae):M.add(ae),Ze(Ah,[...M].join(",")),Je(Un)}),re.append(xe),Y.append(re),()=>Je(!M.has(ae))},q=(Y,ae,re)=>{for(const xe of new Set(ae.map(Je=>Je.group))){const Je=J(Y,xe);for(const Un of ae.filter(b1=>b1.group===xe)){const b1=re(Un);b1.dataset.group=xe,b1.dataset.botColor=fl(xe)}Je()}};q(g,op,Y=>(c(g,_[Y.type]??"anweisung",p(Y.key),Y.make,Y.key),g.lastElementChild));const X=e(".palette-visubot-sensors");X.replaceChildren(),q(X,V0,Y=>{const ae=p(Y.key),re=document.createElement("li");re.className="palette-item palette-sensor",re.dataset.item=Y.key,re.title=Y.text;const xe=document.createElement("code");return xe.textContent=Y.text,/^mbot\.is/.test(Y.text)&&xe.classList.add("sensor-bool"),re.append(document.createTextNode(ae),xe),re.addEventListener("pointerdown",Je=>this.beginDrag(Je,{kind:"sensor",text:Y.text,label:Y.text})),re.tabIndex=0,re.addEventListener("keydown",Je=>{(Je.key==="Enter"||Je.key===" ")&&this.insertSensor(Y.text)}),X.append(re),re})}e(".palette-visubot-sensors").hidden=!h,e(".palette-visubot-sensors-title").hidden=!h;for(const _ of["ops","vars","control"])e(`.palette-visubot-${_}`).hidden=!h,e(`.palette-visubot-${_}-title`).hidden=!h;if(h){const _=In();e(".palette-visubot-ops").replaceChildren(...z4.map(X=>this.expressionItem(I4(X,_),X.java,X.shape==="bool"?"bool":"round","op",X.id==="random"?"🎲 1 … 10":void 0)));const J=e(".palette-visubot-vars");J.replaceChildren();for(const X of A4){const Y=()=>{const ae=ev(this.doc),re=X.id==="declare"?_4(Ri(this.doc)):ae[ae.length-1]??"zahl";return je(S.anweisung,{textLines:[X.java(re)]})};c(J,"anweisung",j4(X,_),Y,`visublocks_var_${X.id}`),J.lastElementChild.dataset.botColor="variable"}this.varList=J,this.shownVars="";const q=e(".palette-visubot-control");q.replaceChildren(),c(q,"forZaehlSchleife",p("web_visubot_el_repeat"),()=>({...qr("forZaehlSchleife"),textLines:y4(10)}),"web_visubot_el_repeat")}this.tabStrip=e(".tabs"),this.exportButton=e("[data-action=export]");const f=e(".export-menu");this.exportButton.setAttribute("aria-haspopup","menu"),this.exportButton.addEventListener("click",()=>{var _;f.hidden=!f.hidden,f.hidden||(_=f.querySelector("button"))==null||_.focus()}),f.addEventListener("click",_=>{var J;const M=(J=_.target.closest("[data-export]"))==null?void 0:J.dataset.export;M&&(f.hidden=!0,this.exportDiagram(M))}),f.addEventListener("keydown",_=>{_.key==="Escape"&&(f.hidden=!0,this.exportButton.focus())}),this.closeExport&&document.removeEventListener("pointerdown",this.closeExport),this.closeExport=_=>{!f.hidden&&!f.parentElement.contains(_.target)&&(f.hidden=!0)},document.addEventListener("pointerdown",this.closeExport);const b=e("[data-action=language]");b.value=In(),b.addEventListener("change",()=>void this.changeLanguage(()=>lg(b.value),"language"));const x=[e("[data-action=mbot-link]"),e("[data-action=mbot-link-settings]")],v=e(".settings-mbot-link small"),w=()=>{const _=be.connected,M=be.connecting?p("web_visubot_connecting"):p(_?"web_visubot_disconnect":"web_visubot_connect");x[0].hidden=!jn()||!$r(),z.hidden=x[0].hidden,x[0].classList.toggle("connected",_);const J=be.connecting?"⏳":_?"🟢":"🔌";x[0].textContent=`${J} mBot2`,x[0].title=M,x[1].textContent=`${J} ${M}`,x[1].disabled=!$r(),x[1].parentElement.hidden=!jn(),v.textContent=$r()?rp():p("web_visubot_no_serial")};for(const _ of x)_.addEventListener("click",()=>void V4());const z=e("[data-action=mbot-upload]");z.addEventListener("click",()=>BY(this.doc,this.tabs.filter(_=>_!==this.tab).map(_=>_.doc))),(ue=this.stopLinkListener)==null||ue.call(this),this.stopLinkListener=be.listen(w),w();for(const _ of this.topbar.querySelectorAll("[data-action=visubot] [data-world]"))_.addEventListener("click",()=>void this.chooseWorld(_.dataset.world,!0));const I=e("[data-action=keywords]");I.checked=jb(),I.addEventListener("change",()=>void this.changeLanguage(()=>og(I.checked),"keywords"));const T=e("[data-action=code-scopes]");T.checked=k3(),T.addEventListener("change",()=>j$(T.checked));const k=e("[data-action=live-language]");k.value=this.live.language;const C=e("[data-action=java-class]"),P=e("[data-action=java-main]"),D=e("[data-action=java-swing]");D.checked=this.live.swingSupport,D.addEventListener("change",()=>this.live.setSwingSupport(D.checked));const B=()=>{C.checked=this.live.javaForm.asClass,P.checked=this.live.javaForm.withMain,e(".settings-menu .java-only").hidden=this.live.language!=="java"};B(),k.addEventListener("change",()=>{this.live.setTarget(k.value),B()});for(const _ of[C,P])_.addEventListener("change",()=>this.live.setJavaForm({asClass:C.checked,withMain:P.checked}));const j=e("[data-action=zoom]");j.value=String(this.zoom),j.addEventListener("change",()=>{this.zoom=Number(j.value),Ze(xh,j.value),this.renderDiagramOnly()});const Z=e("[data-action=code-size]"),F=Number(Me(vh));Z.value=String(Eo.some(_=>_.value===F)?F:Eo[0].value),bh(Number(Z.value)),Z.addEventListener("change",()=>{Ze(vh,Z.value),bh(Number(Z.value))}),this.setupSettingsMenu(e("[data-action=settings]"),e(".settings-menu")),e("[data-action=about]").addEventListener("click",()=>{e(".settings-menu").hidden=!0,this.showAbout()}),e("[data-action=cut]").addEventListener("click",()=>this.cutSelection()),e("[data-action=copy]").addEventListener("click",()=>this.copySelection()),e("[data-action=paste]").addEventListener("click",()=>this.paste());const U=e("input[type=file]");U.addEventListener("change",async()=>{var M;const _=(M=U.files)==null?void 0:M[0];U.value="",_&&this.loadXML(await _.text(),_.name)}),e("[data-action=new]").addEventListener("click",()=>this.addTab()),e("[data-action=open]").addEventListener("click",()=>this.open(U)),e("[data-action=save]").addEventListener("click",()=>this.save()),this.undoButton.addEventListener("click",()=>this.undo()),this.redoButton.addEventListener("click",()=>this.redo()),this.deleteButton.addEventListener("click",()=>this.deleteSelection());let ne;this.captionInput.addEventListener("focus",()=>ne=this.doc),this.captionInput.addEventListener("input",()=>{this.doc={...this.doc,caption:this.captionInput.value},this.dirty=!0,this.updateStatus(),this.refreshLive()}),this.captionInput.addEventListener("change",()=>{ne&&ne.caption!==this.doc.caption&&this.pushUndo(ne),ne=this.doc}),this.canvasHost.addEventListener("pointerdown",_=>this.onCanvasPointerDown(_)),this.canvasHost.addEventListener("contextmenu",_=>this.onCanvasContextMenu(_)),(N=this.resizeObserver)==null||N.disconnect(),this.resizeObserver=new ResizeObserver(()=>{const{clientWidth:_,clientHeight:M}=this.canvasHost;_===this.renderedHostSize.width&&M===this.renderedHostSize.height||this.renderDiagramOnly()}),this.resizeObserver.observe(this.canvasHost)}showWorldInURL(){const e=new URLSearchParams(location.search);for(const a of["learn","lektion","visubot","visustruct","visuobject","visuflow"])e.delete(a);const t=e.toString(),n=Si()==="on"?"visubot":"visustruct";history.replaceState(history.state,"",`${location.pathname}?${n}${t?`&${t}`:""}${location.hash}`)}async chooseWorld(e,t){if(e==="object"){gl(),location.href=`${location.pathname}?visuobject${location.hash}`;return}if(e==="flow"){np(),location.href=`${location.pathname}?visuflow${location.hash}`;return}e===Si()&&N4()||await this.changeLanguage(async()=>{Ti(e),Um(e),this.showWorldInURL()},t?`visubot] [data-world=${e}`:void 0)}async changeLanguage(e,t){var n,a;this.setSimulating(!1),this.setCoding(!1),await e(),L3(),this.sim.end(),this.live.build(),this.preview.relabel(),this.placePreview(),this.files.build(),this.buildUI(),this.render(),this.learn.render(),this.labelLearnRail(),this.labelLiveRail(),this.labelEditorRail(),this.labelFilesRail(),t!==void 0&&((n=this.topbar.querySelector("[data-action=settings]"))==null||n.click(),(a=this.topbar.querySelector(`[data-action=${t}]`))==null||a.focus())}revealAreas(e){var n;const t=[];for(const a of e)a==="editor"&&this.editorHidden?(this.setEditorHidden(!1),t.push(()=>this.setEditorHidden(!0))):a==="palette"&&this.root.classList.contains("palette-hidden")?((n=this.setPaletteHidden)==null||n.call(this,!1),t.push(()=>{var s;return(s=this.setPaletteHidden)==null?void 0:s.call(this,!0)})):a==="livecode"&&!this.liveCoding?(this.setLiveCoding(!0),t.push(()=>this.setLiveCoding(!1))):a==="files"&&!this.shell.classList.contains("files-open")&&(this.setFilesOpen(!0),t.push(()=>this.setFilesOpen(!1)));return()=>t.reverse().forEach(a=>a())}setFilesOpen(e){this.shell.classList.toggle("files-open",e),Ze(yh,e?"1":"0"),this.keepAColumnOpen(),this.canvasHost&&this.renderDiagramOnly()}filesRail(){return this.filesRailButton=de("button",{class:"learn-rail files-rail"}),this.labelFilesRail(),this.filesRailButton.addEventListener("click",()=>this.setFilesOpen(!0)),this.filesRailButton}labelFilesRail(){this.filesRailButton&&(this.filesRailButton.title=p("web_files_show"),this.filesRailButton.innerHTML=`${Dt}📁 ${W(p("web_files_title"))}`)}openFromWorkspace(e,t,n){const a=this.tabs.find(s=>{var r;return((r=s.workspace)==null?void 0:r.dir)===t.dir&&s.workspace.base===t.base});if(a){this.tabIndex=this.tabs.indexOf(a),this.render();return}e?this.loadXML(e,`${t.base}.visustruct`):n!==void 0&&((this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=this.live.documentFromJavaText(n),this.tab.fileName=`${t.base}.visustruct`,this.resetHistory()),this.tab.workspace=t,this.tab.fileHandle=void 0,n!==void 0&&(this.live.adoptJava(this.doc,n),this.setLiveCoding(!0)),this.render()}async saveToWorkspace(){if(!this.files.ready||this.tab.fileHandle&&!this.tab.workspace)return!1;const e=this.doc.caption.trim()||hn(this.tab),t=this.live.language==="java"?this.live.javaFor(this.doc,this.tab):void 0;try{const n=await this.files.save(e,x1(this.doc),t,this.tab.workspace);if(!n)return this.setFilesOpen(!0),!0;this.tab.workspace=n,this.tab.fileName=`${n.base}.visustruct`,this.dirty=!1,this.render(),this.showMessage(p("web_files_saved_fmt",n.path))}catch(n){this.showMessage(n.message)}return!0}setLearning(e,t=!0){this.shell.classList.toggle("learning",e),t&&Ze(wh,e?"1":"0"),this.keepAColumnOpen(),this.canvasHost&&this.renderDiagramOnly()}setEditorHidden(e){this.editorHidden=e,this.shell.classList.toggle("editor-hidden",e),Ze(Oh,e?"1":"0"),e&&!this.liveCoding&&!this.shell.classList.contains("learning")&&this.setLiveCoding(!0),!e&&this.canvasHost&&this.render()}keepAColumnOpen(){this.editorHidden&&!this.liveCoding&&!this.shell.classList.contains("learning")&&!this.shell.classList.contains("files-open")&&this.setEditorHidden(!1)}editorRail(){return this.editorRailButton=de("button",{class:"learn-rail editor-rail"}),this.labelEditorRail(),this.editorRailButton.addEventListener("click",()=>this.setEditorHidden(!1)),this.editorRailButton}labelEditorRail(){this.editorRailButton&&(this.editorRailButton.title=p("web_editor_show"),this.editorRailButton.innerHTML=`${Dt}✎ ${W(p("web_editor_title"))}`)}showAbout(){const e=(n,a,s)=>``,t=de("dialog",{class:"about","aria-labelledby":"about-title"});t.innerHTML=` -
    -

    ${W(p("about_nav_title"))}

    - -
    -
    -
    - -
    -

    VisuStruct ${W(p("web_brand_suffix"))}

    -

    ${W(p("web_about_version_fmt").replace("%@","0.15.29"))}

    -

    Holger Sebastiao

    - ${e("about_web_label","https://visustruct.visucode.de","visustruct.visucode.de")} - ${e("about_developer_label","https://www.sebastiao.org","www.sebastiao.org")} - ${e("about_project_github_label","https://github.com/code4teaching/VisuStruct","code4teaching/VisuStruct")} -
    -
    -

    ${W(p("about_dateiformat_heading"))}

    -

    ${W(p("about_dateiformat_part1"))}.visustruct${W(p("about_dateiformat_part2"))}

    -

    ${W(p("about_dateiformat_strk"))}

    -

    ${W(p("web_about_software"))}

    -

    ${W(p("web_about_software_text"))} ${W(p("web_about_licenses"))}

    -

    ${W(p("about_copyright"))}

    -
    `,t.querySelector("[data-action=about-done]").addEventListener("click",()=>t.close()),t.addEventListener("click",n=>n.target===t&&t.close()),t.addEventListener("close",()=>t.remove()),document.body.append(t),t.showModal()}setupSettingsMenu(e,t){const n=a=>{t.hidden=!a,e.setAttribute("aria-expanded",String(a))};e.addEventListener("click",()=>n(t.hidden)),this.closeSettings&&document.removeEventListener("pointerdown",this.closeSettings),this.escapeSettings&&document.removeEventListener("keydown",this.escapeSettings),this.closeSettings=a=>{!t.hidden&&!e.parentElement.contains(a.target)&&n(!1)},document.addEventListener("pointerdown",this.closeSettings),this.escapeSettings=a=>{a.key!=="Escape"||t.hidden||(n(!1),e.focus())},document.addEventListener("keydown",this.escapeSettings)}learnRail(){return this.railButton=de("button",{class:"learn-rail"}),this.labelLearnRail(),this.railButton.addEventListener("click",()=>this.setLearning(!0)),this.railButton}liveRail(){return this.liveRailButton=de("button",{class:"learn-rail live-rail"}),this.labelLiveRail(),this.liveRailButton.addEventListener("click",()=>this.setLiveCoding(!0)),this.liveRailButton}labelLiveRail(){this.liveRailButton&&(this.liveRailButton.title=p("web_live_show"),this.liveRailButton.innerHTML=`${Dt}</> ${W(p("web_live_title"))}`)}labelLearnRail(){this.railButton&&(this.railButton.title=p("web_learn_show"),this.railButton.innerHTML=`${Dt}🎓 ${W(p("web_learn_title"))}`)}learnHost(){return{collapse:()=>this.setLearning(!1),showEditor:()=>{this.editorHidden&&this.setEditorHidden(!1)},showLiveCode:()=>{this.liveCoding||this.setLiveCoding(!0)},showJava:()=>this.openJavaColumn(),showFiles:()=>{this.shell.classList.contains("files-open")||this.setFilesOpen(!0)},reveal:e=>this.revealAreas(e),openExercise:(e,t)=>{const n=Dp(e);n!=="code"&&this.setEditorHidden(!1),n!=="struktogramm"&&(e.code==="java"?this.openJavaColumn():this.liveCoding||this.setLiveCoding(!0)),this.coding&&this.setCoding(!1),this.shell.classList.contains("files-open")&&this.setFilesOpen(!1),this.previewOpen&&this.setPreviewOpen(!1),n==="struktogramm"&&this.liveCoding&&this.setLiveCoding(!1),n==="code"&&!this.editorHidden&&this.setEditorHidden(!0);const a=this.tabs.findIndex(r=>r.exerciseId===e.id);if(a>=0){this.switchTab(a),this.setSimulating(!1);return}const s=this.makeTab();s.doc=t,s.exerciseId=e.id,s.selected=t.elements.length>0?[0]:void 0,this.isPristine(this.tab)?this.tabs[this.tabIndex]=s:this.tabs.push(s),this.tabIndex=this.tabs.indexOf(s),this.setSimulating(!1),this.render()},openJavaCode:e=>{this.openJavaColumn();const t=this.makeTab();t.doc=this.live.documentFromJavaText(e),this.isPristine(this.tab)?this.tabs[this.tabIndex]=t:this.tabs.push(t),this.tabIndex=this.tabs.indexOf(t),this.setSimulating(!1),this.live.adoptJava(t.doc,e),this.render()},openDiagram:(e,t)=>{this.setEditorHidden(!1),this.loadXML(x1(e),e.caption.trim()?`${e.caption.trim()}.visustruct`:t)},exerciseDocument:e=>{const t=this.tabs.find(a=>a.exerciseId===e);if(t)return t.doc;const n=this.tab;if(!(n.exerciseId||this.isPristine(n)))return n.exerciseId=e,ve.updateExercise(e,{xml:x1(n.doc)}),n.doc},subprogramsFor:e=>{const t=this.tabs.find(n=>n.exerciseId===e);return n=>this.findSubprogram(n,t)},stopSimulation:()=>this.setSimulating(!1),resetExercise:(e,t)=>{const n=this.tabs.find(a=>a.exerciseId===e);n&&(n.undoStack.push(n.doc),n.doc=t,n.redoStack=[],n.selected=[0],n===this.tab&&this.render())},preview:e=>{const t=oh(e,this.metrics,this.measure,0);if(!t)return;const n=t.svg.getAttribute("width");return n&&(t.svg.style.maxWidth=`${n}px`,t.svg.style.minWidth=`${Math.round(Number(n)*.6)}px`),t.svg.removeAttribute("width"),t.svg.removeAttribute("height"),t.svg}}}isPristine(e){return!e.dirty&&!e.fileName&&!e.exerciseId&&e.undoStack.length===0}rememberExercise(){const e=this.tab;e.exerciseId&&(clearTimeout(this.exerciseSaveTimer),this.exerciseSaveTimer=window.setTimeout(()=>{e.exerciseId&&ve.updateExercise(e.exerciseId,{xml:x1(e.doc)})},300))}paletteIcon(e){const t=Te("svg",{viewBox:"0 0 28 20",width:28,height:20,class:"icon"}),n={fill:"none",stroke:"currentColor","stroke-width":1.5};t.append(Te("rect",{x:1,y:1,width:26,height:18,...n}));const a=s=>t.append(Te("path",{d:s,...n}));switch(e){case"verzweigung":a("M1 1 L14 10 L27 1 M14 10 V19");break;case"fallauswahl":a("M1 1 L20 10 L27 1 M1 10 H27 M10 10 V19 M20 10 V19");break;case"forZaehlSchleife":case"whileSchleife":a("M7 7 H27 M7 7 V19");break;case"doUntilSchleife":a("M7 1 V13 H27");break;case"endlosschleife":a("M7 6 H27 M7 6 V14 H27");break;case"aufruf":a("M5 1 V19 M23 1 V19");break;case"aussprung":a("M6 1 L1 10 L6 19");break}return t}render(){var o,l;const e=ov(this.doc);e&&(this.doc=e,this.dirty=!0);const t={...this.doc,elements:this.doc.elements.map(_s)};this.layout=this.engine.layout(t),this.flat=vb(this.layout.elements),this.selected&&!st(this.doc,this.selected)&&(this.selected=void 0);const n=this.zoom,a=this.canvasHost;this.renderedHostSize={width:a.clientWidth,height:a.clientHeight};const s={width:Math.max(320,this.layout.canvasSize.width,Math.floor(a.clientWidth/n)),height:Math.max(240,this.layout.canvasSize.height+60,Math.floor(a.clientHeight/n))};this.pseudocodeBox.checked=!!this.doc.pseudocode,this.renderer.usesSimulationHighlight=this.simulating,this.renderer.fillsSelection=this.liveCoding,this.svg=this.renderer.render(this.layout,s,this.simulating?this.simPath:this.selected),this.svg.setAttribute("width",String(Math.floor(s.width*n))),this.svg.setAttribute("height",String(Math.floor(s.height*n))),this.overlay=Te("g",{class:"drop-overlay"}),this.svg.append(this.overlay);const r=(o=this.inline)!=null&&o.element.isConnected?this.canvasHost.querySelector(":scope > svg"):null;r?r.replaceWith(this.svg):this.canvasHost.replaceChildren(this.svg),this.refreshVarPalette(),this.blockMode&&((l=this.blocks)==null||l.render(this.doc,this.simulating?this.simPath:this.selected,this.simulating,n)),document.activeElement!==this.captionInput&&(this.captionInput.value=this.doc.caption),this.undoButton.disabled=this.simulating||this.undoStack.length===0,this.redoButton.disabled=this.simulating||this.redoStack.length===0,this.deleteButton.disabled=this.simulating||!this.selected||!va(this.doc,this.selected),this.captionInput.readOnly=this.simulating,this.codeButton.disabled=this.simulating,this.exportButton.disabled=this.simulating,this.coding&&this.code.refresh(),this.refreshLive(),this.refreshPreview(),this.renderTabs(),this.renderInspector(),this.updateStatus()}refreshLive(){this.liveCoding&&this.live.refresh(this.doc,this.simulating?this.simPath:this.selected,{owner:this.tab,subprograms:new Set(this.tabs.filter(e=>e!==this.tab).flatMap(e=>{var t;return((t=Tt(e.doc.caption))==null?void 0:t.name)??[]})),editable:!this.simulating,resolve:e=>this.findSubprogram(e)})}updateStatus(){this.rememberExercise(),document.title=`${this.dirty?"• ":""}${this.fileName} – VisuStruct Web`,this.statusLine.textContent=`${this.fileName}${this.dirty?` (${p("web_status_modified")})`:""}`}renderInspector(){const e=this.selected,t=e?st(this.doc,e):void 0,n=this.inspector;if(!e||!t){n.replaceChildren(de("h2",{},p("web_inspector_title")),de("p",{class:"hint"},p("inspector_no_selection")),de("p",{class:"hint"},p("web_inspector_help_drop")),de("p",{class:"hint"},p("web_inspector_help_inline")),de("p",{class:"hint"},p("web_inspector_help_files")));return}if(n.replaceChildren(de("h2",{},`${p("web_inspector_title")} · ${rs(t.type)}`)),t.type===S.anweisung){const a=Ss(t.textLines.join(` -`)),s=de("div",{class:"segmented",role:"group","aria-label":p("inspector_io_mode_title")});for(const[r,o]of[["statement",p("inspector_io_mode_statement")],["input",p("inspector_io_mode_input")],["output",p("inspector_io_mode_output")]]){const l=de("button",{"aria-pressed":String(r===a)},o);l.addEventListener("click",()=>{var c,d;const u=((c=st(this.doc,e))==null?void 0:c.textLines.join(` -`))??"";if(r===Ss(u))return;const m=rb(r,u);this.commit(pn(this.doc,e,m.split(` -`))),(d=this.inspector.querySelector("textarea"))==null||d.focus()}),s.append(l)}n.append(s,de("p",{class:"hint mono-hint"},OY[a]))}if(t.type===S.forSchleife){const a=de("div",{class:"for-fields"}),s=Hr(t.textLines);[[p("inspector_for_init"),p("inspector_for_placeholder_init")],[p("inspector_for_condition"),p("inspector_for_placeholder_condition")],[p("inspector_for_step"),p("inspector_for_placeholder_step")]].forEach(([o,l],u)=>{const m=de("input",{placeholder:l,spellcheck:"false",autocomplete:"off"});m.value=s[u],this.liveEdit(m,c=>{const d=st(this.doc,e);if(!d)return;const h=Hr(d.textLines);return h[u]=Hu(c),pn(this.doc,e,h)}),a.append(de("label",{},o,m))}),n.append(a)}else if(t.type!==S.leerElement){const a=PY[t.type];a&&n.append(de("p",{class:"hint mono-hint"},a));const s=xr(t),r=de("textarea",{rows:"3",spellcheck:"false"});r.value=hh(t),r.placeholder=ph(t),this.liveEdit(r,l=>gh(this.doc,e,l));const o=de("div",{class:"editor-row"});s&&o.append(de("span",{class:"fixed-prefix"},s)),o.append(r),n.append(o)}if(Mo(t).length>0){const a=de("button",{class:"inspector-rename"},p("web_rename_menu"));a.addEventListener("click",()=>this.renameVariable(e)),n.append(a)}this.renderCaseControls(e)}renameVariable(e){const t=st(this.doc,e);if(!t||this.simulating)return;const n=this.liveCoding?this.live.editableCode:void 0,a=Mo(t),s=n!==void 0?Nu([n]):oY(this.doc),r=[...a,...s.filter(l=>!a.includes(l))];if(r.length===0)return;const o=n!==void 0?ni(n).map(l=>l.name):sY(this.doc);j3({names:r,existing:o,count:l=>n!==void 0?ra(n,l).length:rY(this.doc,l)}).then(l=>{if(l)if(n!==void 0)this.live.renameInCode(l.from,l.to);else{const u=aY(this.doc,l.from,l.to);u.count>0&&this.commit(u.doc)}})}onCanvasContextMenu(e){if(this.simulating||this.inline)return;const t=this.svgPoint(e.clientX,e.clientY),n=t&&this.nodeAt(t.x,t.y),a=n&&st(this.doc,n.idPath);!n||!a||Mo(a).length===0||(e.preventDefault(),this.selected=n.idPath,this.render(),C3(e.clientX,e.clientY,p("web_rename_menu"),()=>this.renameVariable(n.idPath)))}renderCaseControls(e){var l;const t=ib(e,this.doc);if(!t)return;const n=((l=st(this.doc,t))==null?void 0:l.cases)??[],a=ab(e,t),s=de("div",{class:"case-controls"});if(a!==void 0&&n[a]){const u=de("input",{placeholder:p("web_case_name_placeholder"),spellcheck:"false",autocomplete:"off"});u.value=n[a].name,this.liveEdit(u,m=>m.trim()===""?void 0:Ru(this.doc,t,a,m)),s.append(de("label",{},p("web_case_name"),u))}const r=de("button",{},`+ ${p("inspector_add_case")}`);r.addEventListener("click",()=>{const u=tb(this.doc,t);this.commit(u.doc,u.path)});const o=de("button",{class:"danger-text"},`- ${p("inspector_remove_case")}`);o.disabled=n.length<=2||a===void 0,o.addEventListener("click",()=>{if(a===void 0)return;const u=nb(this.doc,t,a);this.commit(u.doc,u.path)}),s.append(de("div",{class:"group"},r,o)),this.inspector.append(s)}liveEdit(e,t){let n;e.addEventListener("focus",()=>n=this.doc),e.addEventListener("input",()=>{const a=y0(e.value);if(a!==e.value){const r=e.selectionStart;e.value=a,e.setSelectionRange(r,r)}const s=t(a);s&&(this.doc=s,this.dirty=!0,this.renderDiagramOnly())}),e.addEventListener("blur",()=>{n&&n!==this.doc&&this.pushUndo(n),n=void 0,this.renderDiagramOnly()})}startInlineEdit(e,t){var u,m;if(this.simulating||this.blockMode)return;(u=this.inline)==null||u.finish(!0);const n=this.flat.find(c=>Mn(c.idPath,e)),a=st(this.doc,e);if(!n||!a||a.type===S.leerElement)return;const s=this.metrics.lineHeight,r={host:this.canvasHost,zoom:this.zoom,fontSize:this.metrics.fontSize,lineHeight:s},o=c=>{this.inline=zb({...r,...c,onDone:d=>{var x,v;this.inline=void 0;const h=d&&c.apply(d),g=st(this.doc,e),f=h&&st(h,e);h&&JSON.stringify([g==null?void 0:g.textLines,(x=g==null?void 0:g.cases)==null?void 0:x.map(w=>w.name)])!==JSON.stringify([f==null?void 0:f.textLines,(v=f==null?void 0:f.cases)==null?void 0:v.map(w=>w.name)])?this.commit(h,e):this.render()}})},l=t?wb(n,t.x,t.y,s):void 0;if(l!==void 0&&((m=a.cases)!=null&&m[l]))return o({rect:yb(n,l,s),fields:[{value:a.cases[l].name,placeholder:p("web_case_name_placeholder"),label:p("web_case_name")}],center:!0,apply:([c])=>c.trim()===""?void 0:Ru(this.doc,e,l,c.trim())});if(a.type===S.forSchleife){const c=Hr(a.textLines),d=[[p("inspector_for_init"),p("inspector_for_placeholder_init")],[p("inspector_for_condition"),p("inspector_for_placeholder_condition")],[p("inspector_for_step"),p("inspector_for_placeholder_step")]];return o({rect:Ku(n,s),prefix:"for",fields:d.map(([h,g],f)=>({value:c[f],placeholder:g,label:h})),center:!1,apply:h=>pn(this.doc,e,h.map(g=>Hu(g)))})}o({rect:Ku(n,s),prefix:xr(a),fields:[{value:hh(a),placeholder:ph(a),label:rs(a.type)}],center:a.type===S.anweisung||a.type===S.aufruf||a.type===S.aussprung,apply:([c])=>gh(this.doc,e,c)})}setBlockMode(e,t){var a;this.blockMode=e,t&&Ze(No,e?"1":"0"),Vm(e)&&((a=this.learn)==null||a.render()),this.root.classList.toggle("block-mode",e),this.canvasHost.hidden=e,this.blocks&&(this.blocks.element.hidden=!e);const n=p(e?"web_visubot_blocks_back":"web_visubot_blocks");this.blocksButton.innerHTML=`${W(n)}`,this.blocksButton.setAttribute("aria-pressed",String(e)),this.blocksButton.dataset.tip=p(e?"web_visubot_blocks_back_title":"web_visubot_blocks_title"),t&&this.render()}renderDiagramOnly(){const e=this.selected,t=this.inspector,n=document.createElement("aside");this.inspector=n,this.render(),this.inspector=t,this.selected=e}setSimulating(e){var t;e!==this.simulating&&(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.endDrag(),this.simulating=e,this.root.classList.toggle("simulating",e),e&&requestAnimationFrame(()=>this.fixSimSplit()),this.simButton.setAttribute("aria-pressed",String(e)),this.simButton.innerHTML=`${e?me.stop:me.play}${W(p(e?"web_simulation_end":"web_simulation_start"))}`,this.simButton.dataset.tip=p(e?"web_simulation_end_title":"web_simulation_start_title"),this.simButton.setAttribute("aria-label",p(e?"web_simulation_end":"web_simulation_start")),e?(this.setCoding(!1),this.setEditorHidden(!1),(t=this.visuBot)==null||t.setWorlds(Zh(this.tab.exerciseId)),this.visuBot&&!this.previewOpen&&(this.setPreviewOpen(!0),this.previewOpenedForSim=!0),this.placeSimulationRobot(),this.sim.begin()):(this.sim.end(),this.placeSimulationRobot(),this.previewOpenedForSim&&this.setPreviewOpen(!1),this.simPath=void 0,!this.selected&&this.doc.elements.length>0&&(this.selected=[0])),this.render())}runRobot(e){return!this.visuBot||!/\bmbot\s*\./u.test(JSON.stringify(this.tabs.map(t=>t.doc)))?!1:(this.simulating?this.sim.reset():this.setSimulating(!0),e?this.sim.step():this.sim.play(),!0)}setCoding(e){e!==this.coding&&(e&&(this.setLiveCoding(!1),this.setEditorHidden(!1)),this.coding=e,this.root.classList.toggle("coding",e),this.codeButton.setAttribute("aria-pressed",String(e)),e?this.code.refresh():this.code.close(),this.renderDiagramOnly())}openJavaColumn(){if(this.live.language!=="java"){const e="[data-action=live-language]",t=this.topbar.querySelector(e)??this.root.querySelector(e);t?(t.value="java",t.dispatchEvent(new Event("change"))):this.live.setTarget("java")}this.liveCoding||this.setLiveCoding(!0)}setCodeMain(e){this.codeMain=e,Ze(Th,e?"1":"0"),e&&!this.liveCoding&&this.setLiveCoding(!0),e&&this.editorHidden&&this.setEditorHidden(!1),this.shell.classList.toggle("code-main",e),this.labelSwap(),this.canvasHost&&this.render()}labelSwap(){const e=p(this.codeMain?"web_swap_to_editor":"web_swap_to_code");for(const t of this.shell.querySelectorAll("[data-action=swap-main]"))t.dataset.tip=e,t.setAttribute("aria-label",e),t.setAttribute("aria-pressed",String(this.codeMain))}setupPreview(){const e=o=>{this.previewOpenedForSim=!1,this.setPreviewOpen(o)};this.preview.onHide=()=>e(!1),this.preview.rail.addEventListener("click",()=>e(!0)),this.preview.onToggleStacked=()=>{this.previewStacked=!this.previewStacked,Ze(jh,this.previewStacked?"1":"0"),this.previewStacked&&!this.liveCoding&&this.setLiveCoding(!0),this.placePreview()},this.previewStacked=Me(jh)==="1";const t=Me(Sh);this.previewOpen=t===null||t==="1";const n=this.preview.heightBar,a=this.preview.element,s=(o,l)=>{var c;const u=Math.max(160,(((c=a.parentElement)==null?void 0:c.getBoundingClientRect().height)??600)-120),m=o===void 0?void 0:Math.round(Math.max(160,Math.min(o,u)));a.style.height=m===void 0?"":`${m}px`,l&&Ze(Ph,m===void 0?"":String(m))},r=Number(Me(Ph));r>0&&(a.style.height=`${r}px`),n.addEventListener("pointerdown",o=>{if(o.button!==0)return;o.preventDefault(),n.setPointerCapture(o.pointerId);const l=o.clientY,u=a.getBoundingClientRect().height;this.shell.classList.add("resizing");const m=d=>s(u-(d.clientY-l),!1),c=d=>{n.removeEventListener("pointermove",m),n.removeEventListener("pointerup",c),n.removeEventListener("pointercancel",c),this.shell.classList.remove("resizing"),s(u-(d.clientY-l),!0)};n.addEventListener("pointermove",m),n.addEventListener("pointerup",c),n.addEventListener("pointercancel",c)}),n.addEventListener("dblclick",()=>s(void 0,!0)),n.addEventListener("keydown",o=>{const l=o.key==="ArrowUp"?20:o.key==="ArrowDown"?-20:0;l&&(o.preventDefault(),s(a.getBoundingClientRect().height+l,!0))}),this.placePreview()}setPreviewOpen(e){this.previewOpen=e,Ze(Sh,e?"1":"0"),e||this.preview.pause(),this.placePreview(),this.placeSimulationRobot(),this.canvasHost&&this.render()}placeSimulationRobot(){const e=this.visuBot,t=!!e&&this.simulating&&this.previewOpen;this.preview.hostSimulation(t?e.viewport:void 0),t||e==null||e.restoreViewport()}placePreview(){const e=this.previewStacked&&this.liveCoding;this.preview.setStacked(this.previewStacked),this.shell.classList.toggle("preview",this.previewOpen),this.shell.classList.toggle("preview-stacked",e),e?this.preview.element.parentElement!==this.live.element&&this.live.element.append(this.preview.element):this.preview.element.previousElementSibling!==this.previewResizer&&this.previewResizer.after(this.preview.element)}refreshPreview(){!this.previewOpen||!jn()||this.preview.update(this.doc,e=>this.findSubprogram(e),Zh(this.tab.exerciseId),this.tab.exerciseId??"",this.tabs.map(e=>e.doc))}setLiveCoding(e){e&&this.coding&&this.setCoding(!1),this.liveCoding=e,this.shell.classList.toggle("live",e),this.placePreview(),e||this.live.hideConsole(),Ze(kh,e?"1":"0"),this.keepAColumnOpen(),this.canvasHost&&this.render()}simResizer(){const e=de("div",{class:"sim-resizer",role:"separator","aria-orientation":"vertical",tabindex:"0",title:p("web_visuobject_resize")}),t=this.root,n=o=>{const l=t.getBoundingClientRect().width;return Math.round(Math.max(120,l>0?Math.min(o,l-240):o))},a=(o,l)=>{l&&Ze(Dh,o===void 0?"":String(n(o))),o===void 0?this.fixSimSplit():t.style.setProperty("--sim-work",`${n(o)}px`)},s=()=>t.getBoundingClientRect().width-this.sim.element.getBoundingClientRect().width,r=()=>getComputedStyle(this.shell).direction==="rtl"?-1:1;return e.addEventListener("pointerdown",o=>{if(o.button!==0)return;o.preventDefault(),e.setPointerCapture(o.pointerId);const l=o.clientX,u=s(),m=r();this.shell.classList.add("resizing");const c=h=>a(u+m*(h.clientX-l),!1),d=h=>{e.removeEventListener("pointermove",c),e.removeEventListener("pointerup",d),e.removeEventListener("pointercancel",d),this.shell.classList.remove("resizing"),a(u+m*(h.clientX-l),!0)};e.addEventListener("pointermove",c),e.addEventListener("pointerup",d),e.addEventListener("pointercancel",d)}),e.addEventListener("dblclick",()=>a(void 0,!0)),e.addEventListener("keydown",o=>{const l=o.key==="ArrowRight"?20:o.key==="ArrowLeft"?-20:0;l&&(o.preventDefault(),a(s()+r()*l,!0))}),e}inspectorResizer(){const e=p("web_inspector_resize"),t=de("div",{class:"insp-resizer",role:"separator","aria-orientation":"horizontal",tabindex:"0",title:e,"aria-label":e}),n=this.root,a=l=>{const u=n.getBoundingClientRect().height;return Math.round(Math.max(48,u>0?Math.min(l,u-160):l))},s=(l,u)=>{l===void 0?(n.classList.remove("insp-sized"),n.style.removeProperty("--insp-height")):(n.classList.add("insp-sized"),n.style.setProperty("--insp-height",`${a(l)}px`)),u&&Ze(Bh,l===void 0?"":String(a(l)))},r=()=>this.inspector.getBoundingClientRect().height;t.addEventListener("pointerdown",l=>{if(l.button!==0)return;l.preventDefault(),t.setPointerCapture(l.pointerId);const u=l.clientY,m=r();this.shell.classList.add("resizing");const c=h=>s(m-(h.clientY-u),!1),d=h=>{t.removeEventListener("pointermove",c),t.removeEventListener("pointerup",d),t.removeEventListener("pointercancel",d),this.shell.classList.remove("resizing"),s(m-(h.clientY-u),!0)};t.addEventListener("pointermove",c),t.addEventListener("pointerup",d),t.addEventListener("pointercancel",d)}),t.addEventListener("dblclick",()=>s(void 0,!0)),t.addEventListener("keydown",l=>{const u=l.key==="ArrowUp"?20:l.key==="ArrowDown"?-20:0;u&&(l.preventDefault(),s(r()+u,!0))});const o=Number(Me(Bh));return o>0&&s(o,!1),t}fixSimSplit(){const e=this.root,t=e.getBoundingClientRect().width,n=Number(Me(Dh)),a=e.classList.contains("visubot-mode")?Math.min(440,t*.45):320,s=n>0?n:t-a;e.style.setProperty("--sim-work",`${Math.round(Math.max(120,t>0?Math.min(s,t-240):s))}px`)}learnResizer(){return this.panelResizer(this.learn.element,"learn-resizer",Ih,p("web_learn_resize"),1)}liveResizer(){return this.panelResizer(this.live.element,"live-resizer",LY,p("web_live_resize"),-1,()=>this.root)}yieldingPanels(){return[{panel:this.preview.element,key:Ch},{panel:this.learn.element,key:Ih},{panel:this.files.element,key:zh}].filter(({panel:e})=>e.offsetParent!==null&&e.parentElement===this.live.element.parentElement)}panelResizer(e,t,n,a,s,r){const o=de("div",{class:t,role:"separator","aria-orientation":"vertical",tabindex:"0",title:a}),l=d=>{var b;const h=((b=e.parentElement)==null?void 0:b.getBoundingClientRect().width)??0;if(h===0)return RY(d);const g=[this.files.element,this.learn.element,this.live.element,this.preview.element].filter(x=>x!==e&&x.offsetParent!==null&&getComputedStyle(x).flexGrow==="0").reduce((x,v)=>x+v.getBoundingClientRect().width,0),f=parseFloat(getComputedStyle(e).minWidth)||200;return Math.round(Math.max(f,Math.min(d,h-g-240)))},u=(d,h)=>{e.style.width=d===void 0?"":`${l(d)}px`,h&&Ze(n,d===void 0?"":String(l(d)))},m=Number(Me(n));m>0&&u(m,!1);const c=()=>{const d=typeof s=="function"?s():s;return getComputedStyle(this.shell).direction==="rtl"?-d:d};return o.addEventListener("pointerdown",d=>{if(d.button!==0)return;d.preventDefault(),o.setPointerCapture(d.pointerId);const h=d.clientX,g=e.getBoundingClientRect().width,f=c();this.shell.classList.add("resizing");const b=r?this.pushResize(e,n,r(),g):void 0,x=(z,I)=>(b??u)(g+f*(z.clientX-h),I),v=z=>x(z,!1),w=z=>{o.removeEventListener("pointermove",v),o.removeEventListener("pointerup",w),o.removeEventListener("pointercancel",w),this.shell.classList.remove("resizing"),x(z,!0)};o.addEventListener("pointermove",v),o.addEventListener("pointerup",w),o.addEventListener("pointercancel",w)}),o.addEventListener("dblclick",()=>u(void 0,!0)),o.addEventListener("keydown",d=>{const h=d.key==="ArrowRight"?20:d.key==="ArrowLeft"?-20:0;h&&(d.preventDefault(),u(e.getBoundingClientRect().width+c()*h,!0))}),o}pushResize(e,t,n,a){const s=(m,c)=>Math.max(parseFloat(getComputedStyle(m).minWidth)||0,c),r=s(e,200),o=Math.max(0,n.getBoundingClientRect().width-s(n,240)),l=this.yieldingPanels().map(m=>({...m,start:m.panel.getBoundingClientRect().width,min:s(m.panel,200),changed:!1})),u=l.reduce((m,c)=>m+Math.max(0,c.start-c.min),0);return(m,c)=>{const d=Math.round(Math.max(r,Math.min(m,a+o+u)));let h=Math.max(0,d-a-o,r-m);for(const g of l){const f=Math.min(h,Math.max(0,g.start-g.min));h-=f,g.changed||(g.changed=f>0),g.changed&&(g.panel.style.width=`${Math.round(g.start-f)}px`,c&&Ze(g.key,String(Math.round(g.start-f))))}e.style.width=`${d}px`,c&&Ze(t,String(d))}}findSubprogram(e,t=this.tab){const n=Ro(e);if(n==="")return;const a=this.tabs.find(s=>s!==t&&(Ro(s.doc.caption)===n||Ro(hn(s))===n));return a==null?void 0:a.doc}scrollToSimPath(){var o;const e=this.simPath;if(!this.simulating||!e)return;if(this.blockMode)return(o=this.blocks)==null?void 0:o.scrollTo(e);const t=this.flat.find(l=>Mn(l.idPath,e));if(!t)return;const n=this.canvasHost,a=this.zoom,s={x:t.frame.x*a,y:t.frame.y*a,width:t.frame.width*a,height:t.frame.height*a},r=24;s.yn.scrollTop+n.clientHeight&&(n.scrollTop=s.y-r),(s.xn.scrollLeft+n.clientWidth-r)&&(n.scrollLeft=Math.max(0,s.x-r))}commit(e,t){this.codeTyping=void 0,this.pushUndo(this.doc),this.doc=e,this.dirty=!0,t&&(this.selected=t),this.render()}commitFromCode(e,t){const n=Date.now(),a=this.codeTyping;!a||a.tab!==this.tab||n-a.last>1e3||n-a.start>5e3?(this.pushUndo(this.doc),this.codeTyping={tab:this.tab,start:n,last:n}):a.last=n,this.doc=e,this.dirty=!0,this.selected=Gr(t??this.selected,e),this.render()}pushUndo(e){for(this.undoStack.push(e);this.undoStack.length>NY;)this.undoStack.shift();this.tab.redoStack=[]}undo(){const e=this.undoStack.pop();e&&(this.codeTyping=void 0,this.redoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=Gr(this.selected,this.doc),this.render())}redo(){const e=this.redoStack.pop();e&&(this.codeTyping=void 0,this.undoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=Gr(this.selected,this.doc),this.render())}resetHistory(){this.setSimulating(!1),this.tab.undoStack=[],this.tab.redoStack=[],this.selected=void 0,this.dirty=!1,this.render()}makeTab(){return{doc:Y3(),serial:this.nextTabSerial++,dirty:!1,undoStack:[],redoStack:[],selected:[0]}}addTab(e=this.makeTab()){this.setSimulating(!1),this.tabs.push(e),this.tabIndex=this.tabs.length-1,this.render()}switchTab(e){e===this.tabIndex||!this.tabs[e]||(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.setSimulating(!1),this.tabIndex=e,this.render())}async closeTab(e){if(this.tabs.length<=1)return;const t=this.tabs[e];t.dirty&&!t.exerciseId&&(this.switchTab(e),!await this.confirmDiscard())||(this.setSimulating(!1),this.tabs.splice(e,1),(this.tabIndex>e||this.tabIndex>=this.tabs.length)&&(this.tabIndex=Math.max(0,this.tabIndex-1)),this.render())}renderTabs(){const e=this.tabStrip;e.replaceChildren(),this.tabs.forEach((n,a)=>{const s=document.createElement("div");s.className="tab"+(a===this.tabIndex?" active":""),s.setAttribute("role","tab"),s.setAttribute("aria-selected",String(a===this.tabIndex));const r=document.createElement("button");r.className="tab-label",r.textContent=hn(n),r.title=n.fileName??hn(n),r.addEventListener("click",()=>this.switchTab(a)),s.append(r);const o=n.dirty&&!n.exerciseId;if(this.tabs.length>1){const l=document.createElement("button");l.className="tab-close"+(o?" unsaved":""),l.innerHTML='✕',l.title=p("a11y_close_tab"),l.setAttribute("aria-label",`${p("a11y_close_tab")}: ${hn(n)}`),l.addEventListener("click",()=>this.closeTab(a)),s.append(l)}else o&&s.append(Object.assign(document.createElement("span"),{className:"tab-close unsaved",innerHTML:'●'}));o&&r.setAttribute("aria-label",`${hn(n)} (${p("web_status_modified")})`),e.append(s)});const t=document.createElement("button");t.className="tab-add",t.textContent="+",t.title=p("a11y_new_diagram_tab"),t.setAttribute("aria-label",p("a11y_new_diagram_tab")),t.addEventListener("click",()=>this.addTab()),e.append(t)}copySelection(){const e=this.selected&&st(this.doc,this.selected);return e?(this.clipboard=structuredClone(e),this.showMessage(p("web_copied")),!0):!1}cutSelection(){this.selected&&va(this.doc,this.selected)&&this.copySelection()&&this.deleteSelection()}paste(){this.clipboard&&this.insertNearSelection(structuredClone(this.clipboard))}deleteSelection(){!this.selected||!va(this.doc,this.selected)||(this.commit(L1(this.doc,this.selected)),this.selected=void 0,this.render())}expressionItem(e,t,n,a,s=t){const r=document.createElement("li");r.className=`palette-item palette-sensor palette-expr palette-${a}`,r.dataset.botColor=a==="op"?"operator":"variable",r.title=t;const o=document.createElement("code");return o.textContent=s,n==="bool"&&o.classList.add("sensor-bool"),r.append(document.createTextNode(e),o),r.addEventListener("pointerdown",l=>this.beginDrag(l,{kind:"sensor",text:t,label:s})),r.tabIndex=0,r.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&this.insertSensor(t)}),r}refreshVarPalette(){if(!this.varList)return;const e=Ri(this.doc),t=e.join(",");t!==this.shownVars&&(this.shownVars=t,this.varList.querySelectorAll(".palette-var").forEach(n=>n.remove()),this.varList.append(...e.map(n=>this.expressionItem(n,n,"round","var"))))}dropOnCondition(e,t){const n=bt(this.doc,t);if(n.type===S.anweisung){/^mbot\./.test(e)&&this.insertSensor(e,t);return}const a=n.textLines.join(" ").trim(),s=!a||a==="true"?e:e==="true && true"?`${a} && true`:e==="true || true"?`${a} || true`:e==="!true"?`!(${a})`:e;this.commit(pn(this.doc,t,[s]),t)}insertSensor(e,t=this.selected){if(!t||gn(this.doc,t))return;const n=bt(this.doc,t);if(!ss.includes(n.type))return;const a=(n.textLines??[]).join(" ").trim();this.commit(pn(this.doc,t,[a?`${a} ${e}`:e]),t);const s=this.inspector.querySelector("textarea");s&&(s.focus(),s.setSelectionRange(s.value.length,s.value.length))}insertNearSelection(e){const t=this.selected;if(t&&gn(this.doc,t))return this.commit(Wn(this.doc,t,e),t);if(t){const n=[...t.slice(0,-1),t[t.length-1]+1];return this.commit(Ho(this.doc,e,t),n)}if(this.doc.elements.length===1&&gn(this.doc,[0]))return this.commit(Wn(this.doc,[0],e),[0]);this.commit(wi(this.doc,[],this.doc.elements.length,e),[this.doc.elements.length])}confirmDiscard(){return this.dirty?new Promise(e=>{const t=document.createElement("div");t.className="confirm",t.innerHTML=`
    -

    ${W(p("close_unsaved_title"))}

    -

    ${W(p("web_discard_message_fmt",this.fileName))}

    -
    -
    `,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=z0(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:dh()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([x1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:dh()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=rh(this.doc,hn(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([x1(this.doc)],{type:"application/xml"}))}const t=oh(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=rh(this.doc,hn(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([O3(t)],{type:"image/svg+xml"}));break}case"png":{const s=await lh(t,a);await this.offerDownload(`${n}.png`,await wY(s));break}case"pdf":{const s=await lh(t,Math.max(a,3)),r=await IY(kY(s),s.width,s.height,t,P3(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Enter"&&this.selected&&!this.blockMode&&!t?(e.preventDefault(),this.startInlineEdit(this.selected)):e.key==="F2"&&this.selected?(e.preventDefault(),this.renameVariable(this.selected)):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){var u;if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;(u=this.inline)==null||u.finish(!0),document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&Mn(n.idPath,this.selected),s=n?n.idPath.join(","):"",r=Date.now(),o=this.lastCanvasTap,l=!!n&&e.button===0&&s===o.spot&&r-o.time<500&&Math.hypot(e.clientX-o.x,e.clientY-o.y)<24;if(this.lastCanvasTap={spot:s,time:l?0:r,x:e.clientX,y:e.clientY},this.selected=n==null?void 0:n.idPath,this.render(),l&&n){e.preventDefault(),this.pendingInline={pointerId:e.pointerId,path:n.idPath,point:t};return}n&&e.pointerType!=="touch"&&!(gn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){var n;const t=this.drag;if(!(!t||e.pointerId!==t.pointerId)){if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging"),this.blockMode&&t.source.kind==="move"&&((n=this.blocks)==null||n.setMoving(!0))}if(t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY),this.blockMode)t.target=this.blockDropAt(e.clientX,e.clientY,t.source);else{const a=this.svgPoint(e.clientX,e.clientY);t.target=a?this.dropTargetAt(a.x,a.y,t.source):void 0}this.showDropTarget(t.target)}}onPointerUp(e){const t=this.pendingInline;if(t&&t.pointerId===e.pointerId){this.pendingInline=void 0,this.startInlineEdit(t.path,t.point);return}const n=this.drag;!n||e.pointerId!==n.pointerId||(n.active&&n.target?this.applyDrop(n.source,n.target):!n.active&&n.source.kind==="palette"?this.insertNearSelection(n.source.make()):!n.active&&n.source.kind==="sensor"&&this.insertSensor(n.source.text),this.endDrag())}endDrag(){var e,t,n;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),(n=this.blocks)==null||n.setMoving(!1),this.showDropTarget(void 0)}blockDropAt(e,t,n){var s;const a=(s=this.blocks)==null?void 0:s.dropAt(e,t,{moving:n.kind==="move"?n.path:void 0,sensor:n.kind==="sensor"?r=>{const o=bt(this.doc,r).type;return(/^mbot\./.test(n.text)||o!==S.anweisung)&&ss.includes(o)}:void 0});if(a)return{...a,frame:{x:0,y:0,width:0,height:0}}}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor"){if(t.textContent=e.label,e.kind==="sensor"&&this.blockMode){const n=/^mbot\./.test(e.text),a=n?/^mbot\.is/.test(e.text):k4(e.text);t.classList.add("drag-sensor",...a?["sensor-bool"]:[],...n?[]:[/^[A-Za-z_]\w*$/.test(e.text)?"drag-var":"drag-op"])}e.kind==="palette"&&this.blockMode&&(t.classList.add("drag-block"),t.dataset.scope=Yo(e.make().type)??"method")}else{const n=bt(this.doc,e.path);t.textContent=`${rs(n.type)}: ${vr(n)[0]}`}return t}autoScroll(e,t){const n=this.blockMode&&this.blocks?this.blocks.element:this.canvasHost,a=n.getBoundingClientRect(),s=40,r=12;t>a.bottom-s&&ta.top-s&&(n.scrollTop-=r),e>a.right-s&&ea.left-s&&(n.scrollLeft-=r)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||gn(this.doc,s.idPath)?void 0:ss.includes(bt(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:gn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function Zh(i){if(!i)return[];for(const e of[...ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...bn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?bs(t.world):void 0;return n?[n]:[]});return[]}let Jt,p0,f0;function Lh(i){const e=i.dataset.tip;if(!e)return;Jt??(Jt=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Jt.isConnected||document.body.append(Jt),Jt.textContent=e,Jt.hidden=!1;const t=i.getBoundingClientRect(),n=Jt.offsetWidth,a=Jt.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==f0&&(Jo(),e&&(f0=e,p0=window.setTimeout(()=>Lh(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");Jo(),e!=null&&e.matches(":focus-visible")&&Lh(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,Jo,!0)}const b0="visustruct.reloadedAfterError";function W3(){try{const i=Number(sessionStorage.getItem(b0));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(b0,String(Date.now()))}catch{return!1}return location.reload(),!0}function HY(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{W3()&&i.preventDefault()});const VY=Cb();Promise.all([lg(VY,!1),og(Ab(),!1)]).then(()=>{L3(),GY();const i=new URLSearchParams(location.search),e=["visustruct","visubot","visuobject","visuflow"].some(s=>i.has(s)),t=En();!e&&t&&(t==="visubot"?Ti("on"):t==="visuobject"?gl():Ti("off")),i.has("visuobject")&&gl(),i.has("visuflow")&&np();const n=document.getElementById("app"),a=!i.has("visustruct")&&!i.has("visubot");if(ep()&&a)return ee(async()=>{const{ObjectApp:s}=await import("./objectApp-ClGVaIKp.js").then(r=>r.g);return{ObjectApp:s}},[],import.meta.url).then(({ObjectApp:s})=>void new s(n));if(tp()&&a)return ee(async()=>{const{FlowApp:s}=await import("./flowApp-BYyoSxMn.js");return{FlowApp:s}},[],import.meta.url).then(({FlowApp:s})=>void new s(n));new FY(n)}).then(()=>{try{sessionStorage.removeItem(b0)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&W3()||HY(i)});export{kY as A,t1 as C,J$ as J,P4 as L,ee as _,pl as a,j$ as b,k3 as c,K$ as d,KY as e,np as f,EY as g,Ti as h,me as i,Oa as j,qJ as k,VJ as l,YY as m,$3 as n,In as o,q$ as p,gl as q,hc as r,mv as s,p as t,sh as u,O3 as v,R4 as w,lh as x,wY as y,IY as z}; diff --git a/website/app/assets/index-CLK72BwI.css b/website/app/assets/index-CLK72BwI.css deleted file mode 100644 index 4037d08c..00000000 --- a/website/app/assets/index-CLK72BwI.css +++ /dev/null @@ -1 +0,0 @@ -:root{--bg: #f2f2f7;--panel: #ffffff;--text: #1c1c1e;--muted: #6e6e73;--border: #d1d1d6;--accent: #007aff;--accent-soft: rgba(0, 122, 255, .18);--accent-faint: rgba(0, 122, 255, .08);--accent-glow: rgba(0, 122, 255, .35);--area-editor: #2b8a3e;--area-code: #7c3aed;color-scheme:light}:root.visubot-theme{--bg: #f1f0f8;--text: #2f3454;--muted: #6a6890;--border: #d6d3e8;--accent: #c2410c;--accent-soft: rgba(234, 88, 12, .2);--accent-faint: rgba(234, 88, 12, .08);--accent-glow: rgba(194, 65, 12, .35)}:root.visubot-theme .selection-frame{stroke:#c2410ce6}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font:14px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.app{display:grid;grid-template:"tools tools" auto "pal work" 1fr "pal insp" auto / var(--palette-width, 210px) minmax(0,1fr);height:100%;flex:1;min-width:0}.shell{display:flex;flex-direction:column;height:100vh;height:100dvh}.columns{display:flex;flex:1;min-height:0}.columns>.app{min-width:240px}.toolbar{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;padding:8px 12px;background:var(--panel);border-bottom:1px solid var(--border)}button.icon{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:32px;padding:0 7px}button.icon svg{display:block}.tooltip{position:fixed;z-index:1000;max-width:260px;padding:4px 8px;border-radius:6px;background:#1c1c1e;color:#fff;font-size:12px;line-height:1.35;pointer-events:none;box-shadow:0 2px 8px #0003}.tooltip[hidden]{display:none}.diagram-tools{grid-area:tools;display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:5px 8px;background:var(--panel);border-bottom:1px solid var(--border)}.diagram-tools button.icon{min-width:30px;height:30px;padding:0 5px}.diagram-tools .sim-toggle{margin-inline-start:auto;display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools{container-type:inline-size}@container (max-width: 520px){.diagram-tools .sim-toggle span{display:none}}.diagram-tools .sep{width:1px;height:20px;margin-inline:3px;background:var(--border)}.menu-host{position:relative}.export-menu{position:absolute;top:calc(100% + 4px);inset-inline-end:0;z-index:30;display:grid;min-width:180px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.export-menu[hidden]{display:none}.export-menu button{border:none;background:none;text-align:start;padding:7px 10px;border-radius:6px}.export-menu button:hover,.export-menu button:focus-visible{background:var(--accent-soft)}.settings{position:relative;margin-inline-start:auto}.settings>button{display:inline-flex;align-items:center;padding:6px 8px}.settings-menu{position:absolute;top:calc(100% + 6px);inset-inline-end:0;z-index:30;display:grid;width:290px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 80px);overflow-y:auto;padding:4px 0;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.settings-menu[hidden]{display:none}.settings-menu section,.settings-menu footer{display:grid;gap:10px;padding:10px 14px 12px}.settings-menu section+section,.settings-menu footer{border-top:1px solid var(--border)}.settings-menu footer{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-version{font-size:12px;color:var(--muted)}.settings-menu section[hidden]{display:none}.settings-menu h3{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.settings-menu label{display:grid;gap:4px;font-size:13px;font-weight:600;color:var(--muted)}.settings-menu select{width:100%;max-width:none}.settings-menu label.check{grid-template-columns:auto 1fr;align-items:start;gap:8px;font-weight:500;color:var(--text);cursor:pointer}.settings-menu label.check input{margin:2px 0 0}.settings-menu label small,.settings-menu label.check small{display:block;font-weight:400;color:var(--muted)}.settings-menu .about-button{justify-self:start;padding:6px 10px;font-size:13px}dialog.about{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;color:var(--text);background:var(--panel);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 40px #00000040}dialog.about::backdrop{background:#00000059}dialog.about header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border)}dialog.about h2{margin:0;font-size:16px}.about-body{padding:20px 24px 24px;font-size:14px;line-height:1.5}.about-body p{margin:0 0 8px;color:var(--muted)}.about-head{display:flex;gap:16px;padding-bottom:16px;margin-bottom:8px;border-bottom:1px solid var(--border)}.about-head .logo{flex:none;width:40px;height:40px;color:var(--accent)}.about-head h3{margin:0 0 6px;font-size:20px}.about-head h3 small{font-weight:400;color:var(--muted)}.about-body .about-version{font-variant-numeric:tabular-nums}.about-body .about-author{color:var(--text);font-weight:600}.about-link{margin:0 0 2px}.about-body h4{margin:16px 0 6px;font-size:15px}.about-body code{font-weight:600;color:var(--text)}.about-body .about-copy{margin-top:16px}.brand{font-weight:700;font-size:16px;display:flex;align-items:center;gap:8px}.visubot-logo{width:auto;height:30px;margin:-4px 0}.visubot-bot{color:#c2410c;background:linear-gradient(90deg,#ea580c,#c2410c);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-left:-8px}.brand small{font-weight:500;color:var(--muted);font-size:12px}.logo{width:20px;height:20px;border:2px solid currentColor;background:linear-gradient(to bottom right,transparent 47%,currentColor 47% 53%,transparent 53%) left / 50% 60% no-repeat,linear-gradient(to bottom left,transparent 47%,currentColor 47% 53%,transparent 53%) right / 50% 60% no-repeat}.group{display:flex;flex-wrap:wrap;gap:6px}button,select{font:inherit;padding:6px 12px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);cursor:pointer;min-height:34px}select{max-width:180px}button:hover:not(:disabled),select:hover{border-color:var(--accent)}button:disabled{opacity:.4;cursor:default}.palette,.inspector{background:var(--panel);padding:12px;overflow-y:auto}.palette{grid-area:pal;border-inline-end:1px solid var(--border)}.inspector{grid-area:insp;border-top:1px solid var(--border);max-height:34vh}h2{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:0 0 4px}.hint{color:var(--muted);font-size:12px;margin:0 0 10px}.palette ul{list-style:none;margin:0;padding:0;display:grid;gap:6px}.palette-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;cursor:grab;line-height:1.25;user-select:none;-webkit-user-select:none;touch-action:none}.palette-item:hover,.palette-item:focus-visible{border-color:var(--accent);outline:none}.palette-item .icon{flex:none;color:var(--text)}.workspace{grid-area:work;display:flex;flex-direction:column;min-width:0;min-height:0}.caption{font:600 18px system-ui,-apple-system,sans-serif;border:none;border-bottom:1px solid var(--border);padding:10px 16px;background:var(--panel);outline:none}.canvas{flex:1;overflow:auto;position:relative;touch-action:manipulation;scrollbar-gutter:stable;background:#fafafa}.inline-edit{position:absolute;z-index:5;box-sizing:border-box;display:flex;align-items:center;gap:4px;padding:4px 8px;background:#fff;border:2px solid var(--accent);border-radius:6px;box-shadow:0 4px 14px #0000002e}.inline-edit-center{justify-content:center}.inline-edit-prefix,.inline-edit-sep{font-weight:700;color:#000;flex:none}.inline-edit textarea,.inline-edit input{flex:1 1 auto;min-width:3ch;margin:0;padding:2px 4px;border:1px solid #c8ccd2;border-radius:4px;background:#fff;color:#000;font:inherit;line-height:inherit;resize:none;overflow:hidden;white-space:pre}.inline-edit-center textarea{text-align:center}.inline-edit textarea:focus,.inline-edit input:focus{outline:none;border-color:var(--accent)}.canvas svg{display:block;user-select:none;-webkit-user-select:none}.dragging,.dragging *{cursor:grabbing!important}.drop-line{fill:var(--accent)}.drop-replace{fill:var(--accent-soft);stroke:var(--accent);stroke-width:3}.drag-ghost{position:fixed;left:0;top:0;z-index:10;pointer-events:none;padding:6px 10px;border-radius:8px;background:var(--accent);color:#fff;font-weight:600;box-shadow:0 4px 14px #0003;white-space:nowrap;max-width:260px;overflow:hidden;text-overflow:ellipsis}.inspector label{display:block;font-weight:600;margin:8px 0 4px}.inspector textarea{width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:8px;border:1px solid var(--border);border-radius:8px;resize:vertical}.statusbar{display:flex;flex-wrap:wrap;gap:2px 16px;align-items:baseline;padding:4px 12px;font-size:12px;color:var(--muted);background:var(--panel);border-top:1px solid var(--border)}.status{flex:1 1 auto;min-width:0}.site-links{display:flex;gap:12px;margin-inline-start:auto}.site-links a{color:inherit}.site-links a:hover,.site-links a:focus-visible{color:var(--accent)}a.brand{color:inherit;text-decoration:none}.file-drag .canvas{outline:3px dashed var(--accent);outline-offset:-8px}@media(min-width:821px){.app.compact-palette{--palette-width: 100px}.app.compact-palette .palette{padding:8px 6px}.app.compact-palette .palette h2{font-size:10px;letter-spacing:0;text-align:center}.app.compact-palette .palette .hint{display:none}.app.compact-palette .palette-item{flex-direction:column;gap:3px;padding:6px 2px;font-size:10.5px;line-height:1.15;text-align:center;overflow-wrap:break-word}}@media(max-width:820px){.app{grid-template:"tools" auto "pal" auto "work" 1fr "insp" auto / minmax(0,1fr)}.palette,.inspector{min-width:0}.palette{border-inline-end:none;border-bottom:1px solid var(--border);padding:8px}.palette .hint,.palette h2{display:none}.palette ul{display:flex;overflow-x:auto;overflow-y:hidden}.palette-item{white-space:nowrap}.inspector{max-height:30vh}}.status.message{color:var(--text);font-weight:600}.confirm{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#00000040;padding:16px}.confirm-card{background:var(--panel);border-radius:12px;padding:16px 18px;max-width:360px;box-shadow:0 10px 30px #0003}.confirm-card p{margin:0 0 8px}.confirm-card .group{justify-content:flex-end;margin-top:12px}.rename-card{width:min(380px,100%)}.rename-card label{display:block;margin-top:8px;font-size:13px}.rename-card input,.rename-card select{width:100%;box-sizing:border-box;margin-top:4px;font-size:15px}.rename-card .rename-info{min-height:1.3em;margin-top:8px}.rename-card .rename-warning{color:#c93400}.rename-menu{position:fixed;z-index:30;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 6px 20px #0003}.rename-menu button{display:block;width:100%;text-align:left;border:none;background:none;padding:6px 12px;border-radius:6px}.rename-menu button:hover,.rename-menu button:focus-visible{background:var(--accent-soft)}.inspector-rename{margin-top:8px}.files-ask{width:min(360px,100%)}.files-ask input{width:100%;box-sizing:border-box;margin-top:4px}.files-choices{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 10px}.files-choice{display:inline-flex;align-items:center;gap:6px}.files-choice svg{width:16px;height:16px}button.danger{background:#d70015;border-color:#d70015;color:#fff}.simpanel{display:none;grid-area:insp;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto}.app.simulating{grid-template:"tools tools" auto "work insp" 1fr / minmax(0,var(--sim-work, 1fr)) minmax(240px,1fr)}.sim-resizer{display:none;grid-area:insp;justify-self:start;width:10px;margin-inline-start:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.app.simulating .sim-resizer{display:block}.sim-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.sim-resizer:hover:after,.sim-resizer:focus-visible:after,.shell.resizing .sim-resizer:after{background:var(--accent)}.sim-resizer:focus-visible{outline:none}.insp-resizer{grid-area:insp;align-self:start;height:20px;margin-top:-10px;z-index:5;cursor:row-resize;touch-action:none;position:relative}.insp-resizer:before{content:"";position:absolute;inset-inline:0;top:9px;height:2px;background:transparent;transition:background .15s}.insp-resizer:after{content:"";position:absolute;left:50%;top:7px;width:36px;height:6px;margin-left:-18px;border-radius:3px;background:var(--border);transition:background .15s}.insp-resizer:hover:before,.insp-resizer:focus-visible:before,.shell.resizing .insp-resizer:before,.insp-resizer:hover:after,.insp-resizer:focus-visible:after,.shell.resizing .insp-resizer:after{background:var(--accent)}.insp-resizer:focus-visible{outline:none}.app.insp-sized .inspector,.app.insp-sized.coding .inspector{height:var(--insp-height);max-height:none}.app.simulating .palette,.app.simulating .inspector,.app.simulating .insp-resizer{display:none}.app.simulating .simpanel{display:block}.app.simulating .caption{cursor:default}button.sim-toggle{font-weight:600}button.sim-toggle{background:var(--accent);border-color:var(--accent);color:#fff}.simpanel section{margin-bottom:14px}.sim-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:6px 0 10px}.sim-option{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px;font-size:13px}.mono,.sim-vars td{font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace}.sim-trace,.sim-output,.sim-vars{background:var(--bg);border-radius:8px;padding:8px 10px;overflow-wrap:anywhere}.sim-output{max-height:220px;overflow-y:auto;white-space:pre-wrap}.sim-vars table{border-collapse:collapse;width:100%}.sim-vars td{padding:2px 0;vertical-align:top}.sim-vars td:first-child{color:var(--muted);padding-inline-end:12px;width:1%;white-space:nowrap}.sim-vars table.sim-grid{width:auto}.sim-vars .sim-grid td,.sim-vars .sim-grid td:first-child{border:1px solid var(--border);color:inherit;font-size:11px;padding:0 4px;text-align:center;width:auto}.sim-vars .sim-grid td.sim-grid-true{font-weight:700}.simpanel .placeholder{color:var(--muted);font:13px system-ui,-apple-system,sans-serif;margin:0}.sim-notice{margin:0 0 14px;padding:8px 10px;border-radius:8px;background:#34c75926;font-weight:600}.sim-edit{width:100%;margin:-6px 0 14px}.sim-notice.error{background:#ff3b3026;color:#b0000f}.sim-input.active{padding:8px 10px;margin-left:-10px;margin-right:-10px;border-radius:10px;background:var(--accent-faint);outline:2px solid var(--accent)}.sim-prompt{margin:4px 0 6px;font-weight:600}.sim-input-row{display:flex;gap:6px}.sim-input-row input{flex:1;min-width:0;font:inherit;padding:6px 10px;border:1px solid var(--border);border-radius:8px}.sim-input-error{color:#b0000f;margin:6px 0 0;font-size:13px}@media(max-width:820px){.app.simulating{grid-template:"tools" auto "work" minmax(200px,1fr) "insp" auto / minmax(0,1fr)}.simpanel{border-inline-start:none;border-top:1px solid var(--border);max-height:48vh}.app.simulating .sim-resizer{display:none}}.codepanel{display:none;grid-area:code;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto;min-height:0}.app.coding{grid-template:"tools tools tools" auto "pal work code" 1fr "pal insp code" auto / var(--palette-width, 210px) minmax(0,1fr) 400px}.app.coding .codepanel{display:block}.app.coding .inspector{max-height:34vh}button[data-action=code][aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.code-head,.runner-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.code-close{min-height:28px;padding:2px 10px}.segmented{display:flex;margin-bottom:8px}.segmented button{flex:1;border-radius:0;min-height:30px;padding:4px 8px}.segmented button:first-child{border-radius:8px 0 0 8px}.segmented button:last-child{border-radius:0 8px 8px 0}.segmented button+button{border-inline-start:none}.segmented button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.segmented[hidden]{display:none}.check{display:flex;gap:8px;align-items:center;font-size:13px;margin-bottom:4px}.code-actions{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}.code-actions [hidden]{display:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.code-view,.runner-out{margin:0;padding:10px 12px;border-radius:10px;background:var(--bg);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow:auto;white-space:pre;-moz-tab-size:4;tab-size:4}.runner{margin:12px 0}.runner-out{background:#0b1220;color:#e5e7eb;min-height:3em;max-height:240px;white-space:pre-wrap}.runner-out.error{outline:2px solid #ff453a}.runner-input{margin-top:8px}.runner-input label{display:block;font-weight:600;margin-bottom:4px}@media(max-width:820px){.app.coding{grid-template:"tools" auto "pal" auto "work" minmax(240px,1fr) "insp" auto "code" auto / minmax(0,1fr)}.codepanel{border-inline-start:none;border-top:1px solid var(--border);max-height:50vh}}.tabs{display:flex;align-items:flex-end;gap:2px;padding:6px 8px 0;background:var(--bg);border-bottom:1px solid var(--border);overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.tab{display:flex;align-items:center;max-width:220px;border:1px solid var(--border);border-bottom:none;border-radius:8px 8px 0 0;background:#ffffff80}.tab.active{background:var(--panel);margin-bottom:-1px;padding-bottom:1px}.tab button{border:none;background:none;min-height:30px;border-radius:8px 8px 0 0}.tab-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:4px 6px 4px 12px}.tab.active .tab-label{font-weight:600}.tab-close{padding:2px 8px;color:var(--muted);font-size:11px}.tab-close:hover{color:var(--text)}.tab-dot,.tab-close.unsaved .tab-x{display:none}.tab-close.unsaved .tab-dot{display:inline;color:var(--text);font-size:10px}.tab-close.unsaved:hover .tab-dot{display:none}button.tab-close.unsaved:hover .tab-x{display:inline}span.tab-close{padding:2px 10px 2px 4px}.tab-add{min-height:28px;padding:2px 10px;margin:0 0 3px 4px;border-radius:8px}.inspector .segmented{margin:6px 0 4px;max-width:420px}.mono-hint{font:11px/1.45 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow-wrap:anywhere}.editor-row{display:flex;gap:8px;align-items:flex-start}.editor-row textarea{flex:1;min-width:0}.fixed-prefix{font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;color:var(--muted);padding-top:9px}.inspector input:not([type]){width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:7px 8px;border:1px solid var(--border);border-radius:8px}.for-fields{display:grid;gap:4px}.for-fields label,.case-controls label{margin:4px 0 0;font-size:12px;color:var(--muted);font-weight:600}.case-controls{margin-top:12px;padding-top:10px;border-top:1px solid var(--border)}.case-controls .group{margin-top:8px}button.danger-text:not(:disabled){color:#d70015}.print-sheet{display:none}.files{display:none;flex:0 1 auto;flex-direction:column;width:260px;min-width:200px;min-height:0;background:var(--panel);border-inline-end:1px solid var(--border)}.shell.files-open .files{display:flex}.shell.files-open .files-rail{display:none}.files-head{display:flex;align-items:center;gap:4px;margin:10px 12px 6px}.files-head h2{flex:1;margin:0;font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.files-head button.icon{min-width:30px;height:30px;padding:0 5px}.files-head [hidden]{display:none}.files-body{flex:1;min-height:0;overflow:auto;padding:0 8px 12px;font-size:14px}.files-where{margin:0 4px 6px;font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-hint,.files-empty{margin:8px 4px;font-size:13px;color:var(--muted)}.start-ask .files-start{margin-bottom:2px}.start-ask .hint{font-size:13px;color:var(--muted)}.start-without{display:block;margin:12px auto 0;border:none;background:none;color:var(--accent);text-decoration:underline}.start-without+.hint{text-align:center}.files-start{display:flex;align-items:center;gap:6px;width:100%;margin:8px 0;justify-content:center}.files-row{display:flex;align-items:center;border-radius:6px}.files-row:hover,.files-row:focus-within{background:var(--accent-soft)}.files-row.current>.files-name{font-weight:600}.files-name{flex:1;min-width:0;display:flex;align-items:center;gap:6px;padding:4px 6px 4px calc(6px + var(--depth) * 16px);border:none;background:none;text-align:start;font:inherit;color:var(--text);cursor:pointer}.files-name:disabled{cursor:default;color:var(--muted)}.files-name svg{flex:none;width:16px;height:16px;color:var(--muted)}.files-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-name small{margin-inline-start:auto;padding:0 6px;border-radius:6px;background:var(--accent);color:#fff;font-size:11px;font-weight:600}.files-row .files-delete{visibility:hidden;min-width:26px;height:26px;padding:0 4px;border:none;background:none;color:var(--muted)}.files-row:hover .files-delete,.files-row:focus-within .files-delete{visibility:visible}.files-error{color:#c62828}.files-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.files-open .files-resizer{display:block}.files-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px}.files-resizer:hover:after,.files-resizer:focus-visible:after{background:var(--accent)}.learn{display:none;flex:0 1 auto;width:400px;min-width:280px;flex-direction:column;background:var(--panel);border-inline-end:1px solid var(--border);min-height:0}.shell.learning .learn{display:flex}.learn-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.learning .learn-resizer{display:block}.learn-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.learn-resizer:hover:after,.learn-resizer:focus-visible:after,.shell.resizing .learn-resizer:after{background:var(--accent)}.learn-resizer:focus-visible{outline:none}.shell.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.learn-head{display:flex;align-items:flex-start;gap:6px;margin:10px 12px 0}.learn-tabs{flex:1;min-width:0}.learn-hide{flex:none;min-height:30px;padding:4px 7px;display:inline-flex;align-items:center;color:var(--muted)}.learn-rail{flex:none;display:flex;flex-direction:column;align-items:center;gap:10px;width:36px;padding:10px 0;border:none;border-radius:0;border-inline-end:1px solid var(--border);background:var(--panel);cursor:pointer}.learn-rail:hover{background:var(--accent-soft)}.learn-rail span{writing-mode:vertical-rl;white-space:nowrap}.shell.learning .learn-rail:not(.live-rail):not(.editor-rail):not(.files-rail):not(.robotpreview-rail):not(.palette-rail){display:none}.live-rail{border-inline-end:none;border-inline-start:1px solid var(--border)}.live-rail svg{transform:scaleX(-1)}.shell.live .live-rail{display:none}.editor-rail{display:none;border-inline-start:1px solid var(--border)}.shell.editor-hidden .editor-rail{display:flex}.shell.editor-hidden .app,.shell.editor-hidden .live-resizer,.shell.editor-hidden:not(.live) .learn-resizer{display:none}.shell.editor-hidden .livecode,.shell.editor-hidden:not(.live) .learn{flex:1 1 0;width:auto!important;min-width:0}.learn-body{overflow-y:auto;scrollbar-gutter:stable;padding:4px 16px 24px;flex:1;min-height:0;line-height:1.5}.learn-body h2.learn-title{display:flex;align-items:center;gap:8px;font-size:20px;text-transform:none;letter-spacing:0;color:var(--text);margin:2px 0 10px}.learn-section{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:18px 0 6px}.learn-list{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-item{display:flex;align-items:center;gap:10px;width:100%;text-align:start;padding:8px 10px}.learn-item.done{border-color:#34c759}.learn-num{flex:none;min-width:28px;height:28px;border-radius:14px;background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-weight:700;font-size:12px;padding:0 6px}.learn-item.done .learn-num{background:#34c7592e;color:#248a3d}.learn-item-text{flex:1;display:grid;min-width:0}.learn-item-text small{color:var(--muted)}.learn-status{flex:none;color:var(--muted);font-size:12px}.learn-item.done .learn-status{color:#248a3d;font-weight:700}.learn-back,.link-button{border:none;background:none;padding:6px 0;min-height:0;color:var(--accent)}.link-button{padding:0;text-align:start}.learn-lesson-head{position:sticky;top:-4px;z-index:3;margin:-4px -16px 10px;padding:4px 16px 8px;background:var(--panel);border-bottom:1px solid var(--border)}.learn-lesson-head .learn-progress{margin-bottom:8px}.learn-lesson-head .learn-step-title{margin:0}.learn-head-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.learn-nav.learn-nav-top{margin-top:0;gap:6px}.learn-nav-top button{padding:3px 10px;min-height:0;font-size:13px}.learn-kicker{margin:4px 0 0;color:var(--muted);font-size:12px}.learn-progress{display:flex;gap:4px;margin-bottom:14px}.learn-progress button{flex:1 1 0;min-width:0;padding:3px 0;font-size:13px;font-variant-numeric:tabular-nums;border-radius:6px}.learn-progress button.past{border-color:var(--accent);color:var(--accent)}.learn-progress button.current{border-color:var(--accent);background:var(--accent);color:#fff;font-weight:600}.learn-progress button.robot-step:not(.current){border-color:#0fa3c6;background:#0fa3c61f}.learn-progress button.robot-step.current{border-color:#0fa3c6;background:#0fa3c6}.learn-step-title{font-size:16px;margin:0 0 6px}.learn-text p,.learn-text ul,.learn-text ol{margin:0 0 10px}.learn-text ul,.learn-text ol{padding-inline-start:22px}.learn-text code,.learn-tests code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;background:var(--bg);border-radius:4px;padding:1px 4px}.learn-text h3{font-size:15px;margin:18px 0 4px}.reference-group{border:1px solid var(--border);border-radius:8px;margin:0 0 8px;padding:0 12px}.reference-group summary{cursor:pointer;font-weight:600;padding:9px 0}.reference-group[open] summary{border-bottom:1px solid var(--border)}.reference-group>h3:first-of-type{margin-top:10px}.lesson-code{background:var(--bg);border-radius:8px;padding:8px 10px;margin:0 0 10px;overflow-x:auto;overflow-y:hidden;font-size:12.5px}.learn-open-code{display:block;margin:-4px 0 12px}.lesson-code code{background:none;padding:0}.lesson-note{border-inline-start:3px solid var(--accent);background:var(--accent-soft);border-radius:6px;padding:8px 10px;margin:0 0 10px}.lesson-note p:last-child{margin-bottom:0}.learn-images{display:flex;gap:8px;flex-wrap:wrap}.learn-images img{width:150px;height:200px;object-fit:cover;border-radius:8px}.learn-file{margin:0 0 14px;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--panel)}.learn-file figcaption{display:flex;align-items:center;gap:6px;padding:6px 10px;background:var(--bg);border-bottom:1px solid var(--border);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;font-weight:600}.learn-file-text{margin:0;padding:8px 10px;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;white-space:pre}.learn-file.written{margin:8px 0;border-color:#15803d}.learn-file.written figcaption{background:#dcfce7}.learn-file-text .ln{display:inline-block;min-width:2ch;margin-inline-end:10px;color:var(--muted);text-align:end;-webkit-user-select:none;user-select:none}.learn-brag{display:grid;grid-template-columns:48px minmax(0,1fr);gap:10px;align-items:start;border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:0 0 14px;background:var(--accent-soft)}.learn-brag img{width:48px;height:48px;border-radius:50%}.learn-brag-title{margin:0 0 4px;font-weight:700}.learn-brag .learn-text p:last-child{margin-bottom:0}.learn-game{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-game-head{display:flex;align-items:center;gap:10px;font-size:1.05em}.learn-game-head img{width:40px;height:40px;border-radius:50%}.learn-game-status{margin:6px 0;color:var(--muted);font-size:.9em}.learn-game-values{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.learn-game-values code{background:var(--accent-soft);border-radius:6px;padding:2px 8px}.learn-game-condition{font-size:1.15em;font-weight:600;padding:10px 12px;border-radius:8px;background:var(--bg, #f2f2f7);margin-bottom:10px;overflow-wrap:anywhere}.learn-game-answers button{flex:1;font-weight:600;padding-block:10px}.learn-game-true:not(:disabled){border-color:#15803d;color:#15803d}.learn-game-false:not(:disabled){border-color:#b91c1c;color:#b91c1c}.learn-game-feedback:empty{display:none}.learn-game-feedback{margin-top:10px;padding:10px 12px;border-radius:8px}.learn-game-feedback.right{background:#dcfce7}.learn-game-feedback.wrong{background:#fee2e2}.learn-game-feedback p{margin:0 0 6px;font-weight:700}.learn-game-steps{margin-bottom:10px;line-height:1.6}.learn-game-result{font-size:1.2em;font-weight:700}.learn-game-question{font-weight:600;margin:10px 0 8px}.learn-game-code{margin:0 0 8px;padding:8px 0;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.5;overflow-x:auto}.learn-game-code .ln{padding:0 10px 0 calc(10px + 2ch);text-indent:-2ch;border-inline-start:3px solid transparent;white-space:pre-wrap;overflow-wrap:anywhere;transition:background .2s}.learn-game-code .ln.hit{background:#fef3c7;border-inline-start-color:#d97706}.learn-bomb{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-weight:700}.learn-bomb-icon{font-size:28px;line-height:1}.learn-bomb.hurry .learn-bomb-icon{animation:learn-bomb-shake .25s infinite alternate}.learn-bomb.boom .learn-bomb-icon{animation:learn-bomb-boom .5s ease-out}@keyframes learn-bomb-shake{0%{transform:rotate(-8deg)}to{transform:rotate(8deg)}}@keyframes learn-bomb-boom{0%{transform:scale(.6)}60%{transform:scale(1.5)}to{transform:scale(1)}}.learn-bomb-time{min-width:7ch;font-variant-numeric:tabular-nums}.learn-bomb-fuse{flex:1;height:8px;border-radius:4px;background:#e5e7eb;overflow:hidden}.learn-bomb-fuse span{display:block;height:100%;background:#f59e0b;transition:width .2s linear}.learn-bomb.hurry .learn-bomb-fuse span{background:#dc2626}.learn-bomb.defused .learn-bomb-fuse span{background:#15803d}.learn-bomb-code .ln{display:block;width:100%;margin:0;border-radius:0;border-block:0;border-inline-end:0;background:none;color:inherit;font:inherit;line-height:inherit;min-height:0;height:auto;padding-block:1px;text-align:start;cursor:pointer}.learn-bomb-code .ln:not(:disabled):hover{background:#fef3c7}.learn-bomb-code .ln:disabled{cursor:default;opacity:1}.learn-bomb-code .ln.right,.learn-bomb-code .ln.right:hover{background:#dcfce7;border-inline-start-color:#15803d}.learn-bomb-code .ln.wrong,.learn-bomb-code .ln.wrong:hover{background:#fee2e2;border-inline-start-color:#b91c1c}.learn-bomb-fix code{white-space:pre-wrap}.learn-bomb-code.by-parts .ln.parts{cursor:default;padding-block:3px;line-height:1.9}.learn-bomb-code.by-parts .ln.parts:hover{background:none}.learn-bomb-code.by-parts .ln.parts.right{background:#f0fdf4}.learn-bomb-code .part{display:inline;margin:0;padding:2px 3px;min-height:0;height:auto;border:1px dashed #94a3b8;border-radius:4px;background:none;color:inherit;font:inherit;line-height:inherit;cursor:pointer;-webkit-box-decoration-break:clone;box-decoration-break:clone}.learn-bomb-code .part:not(:disabled):hover{background:#fef3c7;border-color:#d97706}.learn-bomb-code .part:disabled{cursor:default;opacity:1}.learn-bomb-code .part.right{background:#dcfce7;border:2px solid #15803d}.learn-bomb-code .part.wrong{background:#fee2e2;border:2px solid #b91c1c}.learn-bomb-hint{color:var(--muted, #6b7280);font-size:.92em}.learn-game-options{display:grid;gap:6px}.learn-game-options button{text-align:start;padding:8px 12px}.learn-game-options.pictures{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.learn-game-options.pictures button{padding:6px}.learn-game-options button.right{border-color:#15803d;background:#dcfce7;color:inherit;opacity:1}.learn-game-options button.wrong{border-color:#b91c1c;background:#fee2e2;color:inherit;opacity:1}.learn-order-hint{margin:0 0 6px;font-size:13px;opacity:.75}.learn-order button{display:flex;align-items:center;gap:10px}.learn-order-badge{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;border:1.5px solid currentColor;font-size:13px;font-weight:700;opacity:.5}.learn-order button.right .learn-order-badge,.learn-order button:disabled .learn-order-badge:not(:empty){opacity:1}.learn-game-file{margin:0;padding:2px 0;font-size:13px;line-height:1.45;white-space:pre;background:none}.learn-game-explain{margin-bottom:10px}.learn-swing-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;align-items:start}.learn-swing-window{border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-swing-title{padding:3px 8px;font-size:12px;text-align:center;background:#e5e5ea;border-bottom:1px solid #d1d1d6;min-height:1.4em}.learn-swing-body{display:grid;gap:6px;padding:10px}.learn-swing-label{padding:4px 2px;min-height:1.4em}.learn-swing-label.changed,.learn-swing-button.changed{animation:swing-changed 1s ease-out}@keyframes swing-changed{0%{background:#ffd60acc}}.learn-swing-button{padding:6px 10px;background:#fff;color:#1c1c1e;border:1px solid #a1a1aa;border-radius:6px}.learn-swing-button:disabled{opacity:1;cursor:default}.learn-swing-button.pressed{background:var(--accent);border-color:var(--accent);color:#fff;transform:scale(.96)}.learn-swing-event{margin:0;padding:0 10px 8px;font-size:12px;min-height:1.4em}.learn-swing-event.heard{color:#b45309;font-weight:600}.learn-swing-event.nobody{color:#6b7280;font-style:italic}.learn-swing-console{margin:0 10px 10px;padding:6px 8px;border-radius:6px;background:#1c1c1e;color:#f2f2f7;font-size:12px}.learn-swing-console[hidden]{display:none}.learn-swing-clicks{margin:8px 0 0}.learn-swing-try{font-weight:400!important;font-style:italic}.learn-layout-window{width:100%;border:1px solid #a1a1aa;border-radius:6px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-layout-title{height:10px;background:#e5e5ea;border-bottom:1px solid #d1d1d6}.learn-layout-body{height:80px;padding:3px;gap:3px;font-size:12px}.learn-layout-body.grid{display:grid;grid-auto-rows:1fr}.learn-layout-body.flow{display:flex;flex-direction:column;gap:3px}.learn-layout-row{display:flex;justify-content:center;gap:3px}.learn-layout-body.border{display:grid;grid-template:"N N N" auto "W C E" 1fr "S S S" auto / auto 1fr auto}.learn-layout-cell{display:flex;align-items:center;justify-content:center;min-width:22px;padding:2px 6px;border:1px solid #a1a1aa;border-radius:4px;background:#f4f4f5;font-weight:600}.learn-figure{margin:0 0 14px;display:grid;gap:6px;justify-items:start}.learn-preview{width:100%;border:1px solid var(--border);border-radius:8px;overflow-x:auto;overflow-y:hidden;background:#fafafa}.learn-preview>svg{display:block;width:100%;margin:0 auto;height:auto}.learn-figure figcaption{color:var(--muted);font-size:13px}.learn-exercise{border:1px solid var(--accent);border-radius:10px;padding:10px 12px;margin:0 0 14px;display:grid;gap:8px}.learn-exercise h4{margin:0;font-size:15px;display:flex;gap:8px;align-items:center}.learn-badge{font-size:12px;color:#248a3d;background:#34c7592e;border-radius:10px;padding:1px 8px}.learn-where{margin:0;font-size:13px;font-weight:600;color:var(--muted)}.area-name{display:inline-block;color:#fff;border-radius:10px;padding:0 8px}.area-name.area-editor{background:var(--area-editor)}.area-name.area-code{background:var(--area-code)}.columns>.app{border-top:3px solid var(--area-editor)}.livecode{border-top:3px solid var(--area-code)}.diagram-title{margin:0;font-size:16px;color:var(--area-editor)}.livecode-head h2,.live-rail span{color:var(--area-code)}.editor-rail span{color:var(--area-editor)}.live-rail,.editor-rail{font-weight:600}.learn-exercise .learn-text p:last-child{margin-bottom:0}.learn-result:empty{display:none}.learn-result{border-radius:8px;padding:8px 10px}.learn-result.ok{background:#34c75924}.learn-result.fail{background:#ff950024}.learn-result.info{background:var(--bg)}.learn-result-head{margin:0 0 6px;font-weight:600}.learn-tests{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-test-detail{display:grid;padding-inline-start:16px;font-size:13px}.learn-error{color:#c4291c}.learn-solution summary{cursor:pointer;color:var(--accent)}.learn-solution[open]{display:grid;gap:6px;justify-items:start}.learn-checklist{list-style:none;padding:0;margin:0 0 14px;display:grid;gap:6px}.learn-checklist li{display:flex;gap:8px;align-items:baseline;justify-content:space-between}.learn-checklist li{align-items:center;justify-content:flex-start;padding:4px 6px;border-radius:8px}.learn-check-text{flex:1}.learn-checklist li[data-rating=sun]{background:color-mix(in srgb,#f5b800 14%,transparent)}.learn-checklist li[data-rating=cloud]{background:color-mix(in srgb,#8a97a8 14%,transparent)}.learn-checklist li[data-rating=umbrella]{background:color-mix(in srgb,#3b82f6 12%,transparent)}.learn-rating{display:inline-flex;gap:2px;flex:none}.learn-rating-button{min-width:34px;min-height:34px;padding:2px;font-size:1.15em;line-height:1;border-radius:8px;opacity:.45;filter:grayscale(.7)}.learn-rating-button[aria-pressed=true]{opacity:1;filter:none;border-color:var(--accent);background:var(--accent-soft)}.learn-rating-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin:0 0 8px;font-size:.9em;color:var(--muted, inherit)}.learn-review{margin:12px 0 0}.learn-review:empty{display:none}.learn-review-title{margin:0 0 4px;font-weight:700}.learn-review-icon{flex:none;width:1.6em;text-align:center}.learn-checklist li.learn-review-deviation{border:1px solid var(--accent);background:var(--accent-soft)}.learn-competences{border:1px solid var(--accent);border-radius:10px;padding:10px 12px;margin:0 0 14px;background:var(--accent-soft)}.learn-competences-title{margin:0 0 4px;font-weight:700}.learn-competences ul{margin:0;padding-left:1.3em}.learn-return{width:100%;margin:0 0 12px;border-color:var(--accent);background:var(--accent-soft)}.learn-nav+.learn-return{margin:12px 0 0}.learn-check-link{flex:none;font-size:13px}.learn-quiz fieldset{border:1px solid var(--border);border-radius:10px;padding:8px 12px 10px;margin:0 0 10px;display:grid;gap:6px}.learn-quiz legend{font-weight:600;padding:0 4px}.learn-option{text-align:start}.learn-option.right{border-color:#34c759;background:#34c75924}.learn-option.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-match{display:grid;gap:6px}.learn-match-left{display:grid;grid-template-columns:8.5em minmax(0,1fr);align-items:center;gap:8px}.learn-match-select{min-width:0;width:100%;max-width:none}.learn-match-select.right{border-color:#34c759;background:#34c75924}.learn-match-select.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-explanation{margin:0;color:var(--muted);font-size:13px}.learn-score{font-weight:600}.learn-nav{display:flex;justify-content:space-between;gap:8px;margin-top:18px}@media(max-width:1100px){.learn{width:340px}}@media(max-width:900px){.learn{width:300px}}.livecode{display:none;flex:0 1 auto;width:420px;min-width:200px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0}.shell.live .livecode{display:flex}.livecode-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px}.livecode-head h2{margin:0;font-size:16px}.livecode-lang{margin-inline-start:auto;padding:2px 8px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:12px;font-weight:600}.livecode .learn-hide svg{transform:scaleX(-1)}.livecode .hint{margin:0}.livecode-view{flex:1;min-height:0;padding:10px 0;font-size:var(--code-size, 14px)}.livecode-view .ln{padding:0 12px;min-height:1.5em;border-inline-start:3px solid transparent}.livecode-view.selectable .ln{cursor:pointer}.livecode-view .ln.sel{background:var(--accent-soft);border-inline-start-color:var(--accent)}.livecode-view .ph{color:var(--muted);font-style:italic}.livecode-editor{flex:1;min-height:0;padding:0;font-size:var(--code-size, 14px);white-space:normal;overflow:hidden;--syn-keyword: #7f0055;--syn-string: #2a00ff;--syn-number: #986801;--syn-comment: #3f7f5f}.livecode-editor[hidden],.livecode-view[hidden],.livecode-problem[hidden]{display:none}.livecode-editor .cm-editor{height:100%;background:transparent}.livecode-editor .cm-editor.cm-focused{outline:2px solid var(--accent-soft);outline-offset:-2px;border-radius:10px}.livecode-editor .cm-scroller{font:inherit;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.5}.livecode-editor .cm-gutters{background:transparent;border-inline-end:1px solid var(--border);color:var(--muted)}.livecode-editor .cm-lineNumbers .cm-gutterElement{padding:0 8px 0 10px;min-width:2ch}.livecode-editor .cm-activeLineGutter{background:transparent;color:var(--text)}.livecode-editor .cm-content{padding:10px 0;caret-color:var(--text)}.livecode-editor .cm-line{padding:0 12px;border-inline-start:3px solid transparent}.livecode-editor .cm-scopeLayer .cm-scope{border:1px solid color-mix(in srgb,var(--scope) 28%,transparent);border-left:3px solid var(--scope);border-radius:8px;background:color-mix(in srgb,var(--scope) 9%,#fff)}.livecode-editor .cm-scopeLayer .cm-scope-class{--scope: #34c47c}.livecode-editor .cm-scopeLayer .cm-scope-method{--scope: #f2b100}.livecode-editor .cm-scopeLayer .cm-scope-loop{--scope: #ec5fa6}.livecode-editor .cm-scopeLayer .cm-scope-if{--scope: #3b9cf0}.livecode-editor .cm-scopeLayer .cm-scope-try{--scope: #9a7cf0}:root.no-code-scopes .livecode-editor .cm-scopeLayer .cm-scope:not(.cm-scope-sel){display:none}:root:not(.no-code-scopes) .ns-scope-method{fill:color-mix(in srgb,#f2b100 14%,#fff)}:root:not(.no-code-scopes) .ns-scope-loop{fill:color-mix(in srgb,#ec5fa6 14%,#fff)}:root:not(.no-code-scopes) .ns-scope-if{fill:color-mix(in srgb,#3b9cf0 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=method]{background:color-mix(in srgb,#f2b100 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=loop]{background:color-mix(in srgb,#ec5fa6 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=if]{background:color-mix(in srgb,#3b9cf0 14%,#fff)}.livecode-editor .cm-scopeLayer .cm-scope-sel{background:transparent;border:2px solid var(--accent);box-shadow:0 0 0 3px var(--accent-faint)}.livecode-editor .cm-line.cm-debug-line{background:#ffd60a59;border-inline-start-color:#e0a800}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement,.livecode-editor .cm-lineNumbers .cm-gutterElement{cursor:pointer}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement{display:flex;align-items:center;justify-content:center;width:14px;padding-inline-start:4px}.livecode-editor .cm-lineNumbers .cm-gutterElement.cm-error-line{color:#fff;background:#d33;border-radius:4px;font-weight:600}.livecode-editor .cm-breakpoint{display:inline-block;width:10px;height:10px;border-radius:50%;background:#d33}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement:not(:has(.cm-breakpoint)):hover:before{content:"";width:10px;height:10px;border-radius:50%;background:#dd33334d}.livecode-debug{flex:none;max-height:30%;overflow-y:auto}.livecode-debug[hidden]{display:none}.livecode-debug h2{margin:0 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.livecode-vars tr.changed td{animation:var-changed 1.6s ease-out;font-weight:700}@keyframes var-changed{0%{background:#ffd60ab3}to{background:transparent}}.livecode-editor .cm-ph,.livecode-editor .cm-ph *{color:var(--muted)!important;font-style:italic;font-weight:400!important}.livecode-editor .cm-quickfix{margin-inline-start:8px;padding:0 3px;border:1px solid #e0a800;border-radius:4px;background:#ffd60a40;font-size:12px;line-height:1.3;cursor:pointer}.livecode-editor .cm-quickfix:hover{background:#ffd60a8c}.livecode-editor .cm-err{text-decoration:underline wavy #d33;text-decoration-skip-ink:none;text-underline-offset:3px}.livecode-editor .cm-selectionBackground,.livecode-editor .cm-focused .cm-selectionBackground{background:color-mix(in srgb,var(--accent) 25%,transparent)!important}.livecode-editor .cm-matchingBracket{background:color-mix(in srgb,var(--accent) 20%,transparent);outline:1px solid color-mix(in srgb,var(--accent) 50%,transparent)}.cm-tooltip.cm-tooltip-autocomplete{border:1px solid var(--border);border-radius:8px;background:var(--panel);box-shadow:0 4px 16px #0000001f;overflow:hidden}.cm-tooltip.cm-tooltip-autocomplete>ul{font:14px/1.4 ui-monospace,SF Mono,Menlo,Consolas,monospace;max-height:16em}.cm-tooltip.cm-tooltip-autocomplete>ul>li{padding:4px 10px}.cm-tooltip.cm-tooltip-autocomplete>ul>li[aria-selected]{background:var(--accent);color:#fff}.cm-tooltip-autocomplete .cm-completionDetail{margin-inline-start:12px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:normal;color:var(--muted)}.cm-tooltip-autocomplete li[aria-selected] .cm-completionDetail{color:#ffffffd9}.livecode-run{padding:3px 10px;font-size:13px;margin-inline-start:6px}.console{display:flex;flex:none;flex-direction:column;gap:6px;height:180px;min-height:80px;padding:6px 10px 8px;background:var(--bg);border:1px solid var(--border);border-radius:8px}.console[hidden],.console-resizer[hidden]{display:none}.console-head{display:flex;align-items:center;gap:8px}.console-head h2{margin:0;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.console-hide{margin-inline-start:auto;padding:0 8px;font-size:14px}.console-resizer{flex:none;height:10px;margin-block:-5px;cursor:row-resize;touch-action:none;position:relative}.console-resizer:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px}.console-resizer:hover:after,.console-resizer:focus-visible:after,.console-resizer.dragging:after{background:var(--accent)}.console-resizer:focus-visible{outline:none}.livecode-console-lines{flex:1;min-height:0;overflow:auto;font-size:var(--code-size, 14px);white-space:pre-wrap}.livecode-console-lines .typed{color:var(--accent)}.livecode-console-lines .pending:after{content:"▌";color:var(--accent);animation:blink 1s steps(1) infinite}@keyframes blink{50%{opacity:0}}.livecode-console-input{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.livecode-console-input[hidden]{display:none}.livecode-console-input label{display:flex;flex:1;align-items:center;gap:6px;min-width:0;font-size:var(--code-size, 14px)}.livecode-console-input input{flex:1;min-width:60px;padding:4px 8px;font:inherit}.livecode-console-error,.livecode-console-notice{margin:0;font-size:13px;color:var(--muted)}.livecode-console-error{flex-basis:100%;color:#c62828}.livecode-console-notice.error{color:#c62828}.livecode-problem{margin:0;min-height:1.4em;font-size:13px;color:#c62828}.live-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.live .live-resizer{display:block}.live-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.live-resizer:hover:after,.live-resizer:focus-visible:after,.shell.resizing .live-resizer:after{background:var(--accent)}.live-resizer:focus-visible{outline:none}@media(max-width:1100px){.livecode{width:340px}}@media(max-width:700px){.shell.learning .learn-resizer,.shell.live .live-resizer,.shell.files-open .files-resizer{display:none}.shell .files{width:auto!important;max-height:40vh;border-inline-end:none;border-bottom:1px solid var(--border)}.shell .learn,.shell .livecode,.columns>.app{width:auto!important;min-width:0}.livecode{height:40vh;height:40dvh;border-inline-start:none;border-top:1px solid var(--border)}.learn-rail{flex-direction:row;justify-content:center;width:auto;padding:4px 0;border-inline-end:none;border-bottom:1px solid var(--border)}.learn-rail span{writing-mode:horizontal-tb}.live-rail{border-inline-start:none;border-bottom:none;border-top:1px solid var(--border)}.columns{flex-direction:column}.editor-rail{border-inline-start:none;border-bottom:1px solid var(--border)}.learn{width:auto;height:45vh;height:45dvh;border-inline-end:none;border-bottom:1px solid var(--border)}.columns>.app,.shell.editor-hidden .livecode{flex:1;min-height:0;height:auto}}@media print{@page{margin:12mm}body>*:not(.print-sheet){display:none!important}body{background:#fff!important}.print-sheet{display:block}.print-sheet svg{display:block;width:100%;height:auto;max-height:100vh}}.learn .term{text-decoration:underline dotted var(--accent);text-decoration-thickness:2px;text-underline-offset:3px;cursor:help;border-radius:3px}.learn .term:focus-visible,.learn .term[aria-expanded=true]{outline:none;background:var(--accent-soft)}.term-tip{position:fixed;z-index:1000;max-width:min(300px,calc(100vw - 16px));padding:8px 10px;background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px #0000002e;font-size:14px;line-height:1.4}.term-tip[hidden]{display:none}.learn .ui-pointer{color:var(--accent);font-weight:600;border-bottom:2px solid var(--accent-soft);cursor:pointer;border-radius:3px}.learn .ui-pointer:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.ui-spot{outline:3px solid var(--accent)!important;outline-offset:-3px;box-shadow:inset 0 0 0 9999px var(--accent-faint);animation:ui-spot-pulse 1.2s ease-in-out infinite}@keyframes ui-spot-pulse{50%{outline-color:var(--accent-glow)}}@media(prefers-reduced-motion:reduce){.ui-spot{animation:none}}.learn-graphic{display:block;width:100%;max-width:440px;height:auto;margin:0 auto;border-radius:8px;border:1px solid var(--border)}.learn-animation{background:#fff;overflow:hidden}.learn-animation>svg{display:block;width:100%;height:auto}.learn-replay{justify-self:center}.learn-graphic-toggle{display:block;width:100%;padding:0;border:0;background:none;cursor:zoom-in}.learn-graphic-toggle[aria-pressed=true]{cursor:zoom-out}.learn-graphic-hint{margin:4px 0 0;text-align:center;font-size:.85em;color:var(--muted)}.lesson-table{overflow-x:auto;margin:8px 0}.lesson-table table{border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.lesson-table th,.lesson-table td{border:1px solid var(--border);padding:3px 8px;text-align:start;white-space:nowrap}.lesson-table th{background:var(--bg)}.learn-hints .lesson-note{margin-top:8px}.learn-teacher{margin-top:24px;border-top:1px solid var(--border);padding-top:12px}.learn-teacher summary{cursor:pointer;color:var(--muted)}.learn-teacher input{flex:1;min-width:0}.shell.editor-hidden:not(.live):not(.learning) .files{flex:1 1 0;width:auto!important}.livecode-swing{height:380px}.livecode-swing[hidden]{display:none}.livecode-swing-display{position:relative;flex:1;min-height:0;overflow:hidden;border-radius:6px;background:#e9ecf0}.learn-caesar-stage{display:flex;flex-direction:column;align-items:center;gap:8px}.learn-caesar-disc{width:min(100%,320px);touch-action:none;user-select:none;-webkit-user-select:none}.learn-caesar-disc text{font:600 19px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.learn-caesar-disc .outer-disc{fill:#f3e6c8;stroke:#8a6d3b;stroke-width:3}.learn-caesar-disc .outer-letters text{fill:#3d2f14;cursor:pointer}.learn-caesar-disc .inner{cursor:grab;transition:transform .25s ease}.learn-caesar-disc .inner.dragging{cursor:grabbing;transition:none}.learn-caesar-disc .inner-disc{fill:#6b4f2a;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .inner-letters text{fill:#fff8e8}.learn-caesar-disc .tick{stroke:#8a6d3b;stroke-width:1;opacity:.6}.learn-caesar-disc .hub{fill:#f3e6c8;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .window{fill:var(--accent-soft);stroke:var(--accent);stroke-width:2.5}.learn-caesar-disc .marked text{fill:var(--accent);font-size:23px}.learn-caesar-disc .inner-letters .marked text{fill:#ffd54a}.learn-caesar-disc .key{font-size:40px;font-weight:700;fill:#3d2f14}.learn-caesar-disc .key-label{font-size:15px;fill:#6e5a33}.learn-caesar-controls,.learn-caesar-mode{display:flex;justify-content:center;gap:8px}.learn-caesar-controls button{min-width:56px;font-size:1.05em}.learn-caesar-mode{margin:10px 0 6px}.learn-caesar-mode button.active{background:var(--accent);border-color:var(--accent);color:#fff}.learn-caesar-fields{display:grid;gap:8px}.learn-caesar-fields label,.learn-caesar-fields>div{display:grid;gap:3px;color:var(--muted);font-size:.9em}.learn-caesar-fields input,.learn-caesar-output{font:600 1.15em ui-monospace,Menlo,Consolas,monospace;letter-spacing:.08em;padding:6px 8px;border:1px solid var(--border);border-radius:8px;color:var(--text);background:var(--panel);overflow-wrap:anywhere}.learn-caesar-output{background:var(--bg)}.learn-rescue-path{display:flex;align-items:center;gap:6px;margin:8px 0 2px}.learn-rescue-ludwig{width:32px;height:32px;border-radius:50%;flex:none}.learn-rescue-dot{flex:1;height:6px;max-width:48px;border-radius:3px;background:var(--border);transition:background .3s}.learn-rescue-dot.done{background:#15803d}.learn-rescue-tower{position:relative;font-size:34px;line-height:1;margin-inline-start:auto}.learn-rescue-zora,.learn-rescue-fox{position:absolute;font-size:15px}.learn-rescue-zora{top:-4px;left:50%;transform:translate(-50%)}.learn-rescue-fox{bottom:-2px;right:-12px;transition:transform .8s,opacity .8s}.learn-rescue.freed .learn-rescue-fox{transform:translate(60px);opacity:0}.learn-rescue.freed .learn-rescue-zora{display:none}.learn-rescue-free{font-size:24px;line-height:1;animation:learn-rescue-jump .6s ease-out 3}@keyframes learn-rescue-jump{50%{transform:translateY(-12px)}}.learn-rescue-answer{display:flex;gap:8px;align-items:center}.learn-rescue-number{width:6ch;font-size:1.1em;padding:6px 8px;text-align:center}.learn-rescue-label{margin:14px 0 4px;color:var(--muted);font-size:.9em}.learn-rescue-alphabet{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:12px}.learn-rescue-letter{display:inline-flex;flex-direction:column;align-items:center;min-width:22px;padding:2px 0;border-radius:4px;background:var(--bg)}.learn-rescue-letter small{font-size:10px;color:var(--muted)}.learn-rescue-letter.hit{background:#fde68a;outline:2px solid #d97706}.learn-rescue-charat{font-weight:600}.learn-rescue-moved{font-weight:400!important}.learn-rescue-word{font:inherit;padding:1px 4px;border:1px solid var(--accent);border-radius:4px}.learn-rescue-gate{padding:8px 0;margin-bottom:8px}.learn-cw{--cw-cell: 30px;display:flex;flex-wrap:wrap;gap:12px 20px;margin-bottom:10px}.learn-cw-grid{display:grid;gap:2px}.learn-cw-cell{position:relative;width:var(--cw-cell);height:var(--cw-cell)}.learn-cw-cell input{width:100%;height:100%;box-sizing:border-box;padding:0;border:1px solid #6e6e73;border-radius:3px;background:#fff;color:#1c1c1e;text-align:center;font:600 16px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase}.learn-cw-cell input:disabled{opacity:1;-webkit-text-fill-color:#1c1c1e}.learn-cw-cell.key input{background:#fde68a}.learn-cw-cell.given input{color:#1d4ed8;-webkit-text-fill-color:#1d4ed8}.learn-cw-cell.arrived input{animation:learn-cw-arrive .6s ease-out}.learn-cw-cell input.wrong{border-color:#b91c1c;background:#fee2e2}@keyframes learn-cw-arrive{0%{transform:scale(1.6)}}.learn-cw-number,.learn-cw-keyindex{position:absolute;font-size:8px;line-height:1;pointer-events:none;color:#6e6e73;z-index:1}.learn-cw-number{top:2px;left:2px}.learn-cw-keyindex{bottom:2px;right:2px;color:#b45309}.learn-cw-keyword{margin:8px 0 0;font-weight:600}.learn-cw-keybox{display:inline-block;width:22px;height:24px;margin-inline-end:2px;border-bottom:2px solid #d97706;background:#fef3c7;text-align:center;line-height:24px;white-space:pre}.learn-cw-cluebox{flex:1;min-width:200px}.learn-cw-clues{margin:4px 0 10px;padding-inline-start:24px}.learn-cw-clues li{cursor:pointer}@media(max-width:380px){.learn-cw{--cw-cell: 28px}}.learn-cloze{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-cloze-title{display:block;font-size:1.05em;margin-bottom:4px}.learn-cloze p{margin:0 0 8px}.learn-cloze-hint{color:var(--muted);font-size:.9em}.learn-cloze-code{margin:0 0 10px;padding:8px 10px;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.9;overflow-x:auto}.learn-cloze-code .ln{white-space:pre;min-height:1.9em}.learn-cloze-gap{font-size:13px;padding:1px 3px;margin:0 1px;min-width:0;max-width:none;border:1px solid #8e8e93;border-bottom-width:2px;border-radius:4px;background:#fff;color:#1c1c1e;text-align:center}.learn-cloze-gap.right{border-color:#34c759;background:#34c75924}.learn-cloze-gap.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-cloze-gap.shown{border-color:#d97706;background:#fef3c7}.learn-cloze-gap:disabled{opacity:1;-webkit-text-fill-color:currentColor}.learn-cloze-actions{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.learn-cloze-check{font-weight:600}.learn-cloze-status:empty{display:none}.learn-cloze-status{padding:8px 12px;border-radius:8px;font-weight:600}.learn-cloze-status.right{background:#dcfce7}.learn-cloze-status.wrong{background:#fee2e2}.learn-pap{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-pap-title{display:block;font-size:1.05em;margin-bottom:4px}.learn-pap p{margin:0 0 8px}.learn-pap-hint{color:var(--muted);font-size:.9em}.learn-pap-plan{display:block;width:100%;max-width:420px;margin:0 auto 10px;background:#fff;border-radius:8px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:#1c1c1e}.learn-pap-slot{cursor:pointer;outline:none}.learn-pap-slot .learn-pap-shape{stroke:#8e8e93;stroke-width:2}.learn-pap-slot:focus-visible .learn-pap-shape,.learn-pap-slot.over .learn-pap-shape{stroke:var(--accent);stroke-width:3}.learn-pap-slot.right .learn-pap-shape{stroke:#34c759;stroke-width:3}.learn-pap-slot.wrong .learn-pap-shape{stroke:#ff3b30;stroke-width:3}.learn-pap-slot.shown .learn-pap-shape{stroke:#d97706}.learn-pap-legend{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;align-items:center;max-width:420px;margin:0 auto 12px;padding:8px 10px;border-radius:8px;background:var(--bg, #f2f2f7);font-size:.9em}.learn-pap-legend dt{line-height:0}.learn-pap-legend dd{margin:0}.learn-pap-work{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:8px;align-items:start;margin-bottom:10px}.learn-pap-work.done{grid-template-columns:minmax(0,1fr)}.learn-pap-left .learn-pap-plan{margin-bottom:8px}.learn-pap-tray{position:sticky;top:0;display:flex;flex-direction:column;align-items:center;gap:4px;max-height:100vh;overflow-y:auto;padding:6px 2px;border-radius:8px;background:var(--bg, #f2f2f7)}.learn-pap-tray:empty,.learn-pap-tray:not(:has(.learn-pap-card:not([hidden]))){display:none}.learn-pap-card svg{max-width:100%;height:auto}.learn-pap-card{padding:2px;max-width:100%;border:2px solid transparent;border-radius:10px;background:none;line-height:0;touch-action:none;cursor:grab;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:#1c1c1e}.learn-pap-card.selected{border-color:var(--accent);background:var(--accent-soft)}.learn-pap-card.dragging{opacity:.3}.learn-pap-ghost{position:fixed;z-index:1000;pointer-events:none;transform:translate(-50%,-50%);opacity:.9}.learn-pap-actions{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.learn-pap-check{font-weight:600}.learn-pap-status:empty{display:none}.learn-pap-status{padding:8px 12px;border-radius:8px;font-weight:600}.learn-pap-status.right{background:#dcfce7}.learn-pap-status.wrong{background:#fee2e2}.learn-mark{color:inherit;padding:0 3px;border-radius:3px}.learn-mark.blau{background:#e4f1fd}.learn-mark.orange{background:#ffedd5}.learn-mark.gruen{background:#dcfce7}.learn-mark.gelb{background:#fdf4db}.learn-mark.rosa{background:#fce9f2}.startup-error{max-width:520px;margin:15vh auto 0;padding:0 16px;font:16px/1.5 system-ui,-apple-system,sans-serif;color:var(--text)}.startup-error h1{font-size:22px}.startup-error button{font-size:16px;padding:8px 16px}.startup-error pre{margin-top:24px;color:var(--muted);font-size:12px;white-space:pre-wrap}.visubot-stage{position:relative;height:280px;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:linear-gradient(#dfe9f3,#f6f3ec)}.visubot-live{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot-live:empty{display:none}.visubot-live.connected{color:#0f8a5f;font-weight:600}.visubot-worlds{display:flex;gap:6px;margin:0 0 6px}.visubot-worlds button.active{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-canvas{display:block;width:100%;height:100%;touch-action:none}.visubot-status{font-size:12px;color:var(--muted);margin:6px 0 0}.visubot-controls{margin-top:8px;font-size:13px}.visubot-controls summary{cursor:pointer;font-weight:600}.visubot-controls .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-controls label{display:grid;grid-template-columns:9.5em 1fr 2.5em;align-items:center;gap:6px;margin:2px 0}.visubot-controls output{text-align:end;font-variant-numeric:tabular-nums}.visubot-presses{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.visubot-presses button{min-width:2.2em}.visubot-presses button.pressed{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-check{margin-top:8px;font-size:13px}.visubot-check summary{cursor:pointer;font-weight:600}.visubot-check .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-check-sensors{margin-top:8px;border-collapse:collapse;font-variant-numeric:tabular-nums}.visubot-check-sensors th{text-align:start;font-weight:400;padding:1px 12px 1px 0}.palette-visubot-title{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:14px 0 6px}.palette-sensor{display:flex;flex-direction:column;align-items:flex-start;gap:2px;border-style:dashed}.palette-sensor code{font-size:12px;color:var(--muted)}.palette-visubot .palette-item{border-color:#a7a0d3;background:color-mix(in srgb,#a7a0d3 16%,transparent)}.visubot-model{margin:12px 0}.visubot-model .visubot-stage{height:300px}.visubot-model-hint{font-size:13px;margin:4px 0 0}.visubot-part-label{position:absolute;pointer-events:none;padding:2px 8px;border-radius:6px;background:#14181ed9;color:#fff;font-size:13px;white-space:nowrap;z-index:1}.robot-part-link{text-decoration:underline 2px #f2b705;text-underline-offset:3px;cursor:pointer}.robot-part-link:hover,.robot-part-link:focus-visible{background:color-mix(in srgb,#f2b705 25%,transparent);outline:none}.visubot-quiz-question{font-size:15px;margin:12px 0 6px}.visubot-quiz-question.done{color:var(--success, #2f9e44)}.visubot-quiz-feedback{min-height:1.4em;margin:6px 0}.visubot-quiz-feedback.right{color:var(--success, #2f9e44)}.visubot-quiz-feedback.wrong{color:var(--danger, #c92a2a)}.diagram-tools .mbot-link{margin-inline-start:auto;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools .mbot-link:not([hidden])+.sim-toggle,.diagram-tools .mbot-upload:not([hidden])+.sim-toggle{margin-inline-start:6px}.diagram-tools .mbot-upload{margin-inline-start:6px;height:30px;padding:0 10px;white-space:nowrap}.mbot-upload-steps{margin:0 0 12px;padding-inline-start:22px;line-height:1.5}.mbot-upload progress{width:100%;height:10px}.mbot-upload-status.done{color:var(--success, #2f9e44);font-weight:600}.settings-mbot-link{display:grid;gap:4px;margin-top:8px}.settings-mbot-link[hidden]{display:none}.settings-mbot-link small{font-size:12px;color:var(--muted)}.world-chooser{margin-bottom:4px}.segmented.world-chooser{display:grid;grid-template-columns:1fr 1fr}.segmented.world-chooser button{border-radius:0;border-inline-start:1px solid var(--border)}.segmented.world-chooser button:nth-child(2n){border-inline-start:none}.segmented.world-chooser button:nth-child(n+3){border-top:none}.segmented.world-chooser button:first-child{border-start-start-radius:8px}.segmented.world-chooser button:nth-child(2){border-start-end-radius:8px}.segmented.world-chooser button:nth-last-child(2){border-end-start-radius:8px}.segmented.world-chooser button:last-child{border-end-end-radius:8px}.segmented.world-chooser button[aria-pressed=true]{border-color:var(--accent)}.world-hint{display:block;font-size:12px;color:var(--muted);margin-bottom:8px}.start-world{margin-bottom:14px}.start-brand{display:flex;align-items:center;gap:6px;font-size:22px;font-weight:700;margin:0 0 12px}.visustruct-struct{color:#4f46e5;background:linear-gradient(90deg,#2563eb,#7c3aed);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.visucode-more{margin:6px 0 8px}.visucode-more small{display:block;font-size:12px;color:var(--muted)}.visucode-brand{font-weight:800;font-size:16px;letter-spacing:-.01em;color:var(--text);text-decoration:none}.visucode-brand span{color:#7c3aed;background:linear-gradient(90deg,#2563eb,#c026d3,#e11d48,#ea580c,#eab308,#84cc16,#16a34a,#0f766e,#0284c7);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.visucode-more .visucode-credit{margin-top:4px}.visucode-more small a{color:inherit}.visucode-brand:hover{text-decoration:underline}.robotpreview,.robotpreview-rail,.preview-resizer{display:none}.shell.robot-world.preview .robotpreview{display:flex}.shell.robot-world:not(.preview) .robotpreview-rail{display:flex;border-inline-end:none;border-inline-start:1px solid var(--border)}.robotpreview-rail svg{transform:scaleX(-1)}.shell.robot-world.preview:not(.preview-stacked) .preview-resizer{display:block}.robotpreview{flex:0 1 auto;width:360px;min-width:220px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0;overflow-y:auto}.robotpreview .hint{margin:0;font-size:.85em;color:var(--muted, inherit)}.robotpreview .robotpreview-stage{flex:1 1 auto;height:auto;min-height:160px}.robotpreview .robotpreview-status{margin:0;min-height:1.3em}.robotpreview-height{display:none}.robotpreview.simulation>.visubot-worlds,.robotpreview.simulation>.robotpreview-stage,.robotpreview.simulation>.robotpreview-status,.robotpreview.simulation .robotpreview-play{display:none}.robotpreview .visubot-viewport{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.robotpreview .visubot-viewport .visubot-stage{flex:1 1 auto;height:auto;min-height:160px}.visubot-elsewhere{display:none;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot:not(:has(>.visubot-viewport)) .visubot-elsewhere{display:block}.shell.preview-stacked .robotpreview{flex:0 0 auto;width:auto!important;height:320px;min-width:0;margin:4px -12px -12px;padding-top:0;border-inline-start:none;border-top:1px solid var(--border);overflow:visible}.shell.preview-stacked .robotpreview-height{display:block;height:10px;margin:-5px 0 0;cursor:row-resize;touch-action:none;position:relative}.robotpreview-height:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px;background:transparent;transition:background .15s}.robotpreview-height:hover:after,.robotpreview-height:focus-visible:after,.shell.resizing .robotpreview-height:after{background:var(--accent)}.robotpreview-height:focus-visible{outline:none}.preview-resizer{flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.preview-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.preview-resizer:hover:after,.preview-resizer:focus-visible:after,.shell.resizing .preview-resizer:after{background:var(--accent)}.preview-resizer:focus-visible{outline:none}.palette-group{grid-column:1 / -1}.palette-group button{display:flex;align-items:center;gap:6px;width:100%;margin-top:4px;padding:2px 0;border:none;background:none;color:var(--muted);font-size:12px;font-weight:600;text-align:start;cursor:pointer}.palette-group button:before{content:"▾";transition:transform .15s}.palette-group button[aria-expanded=false]:before{transform:rotate(-90deg)}.palette-item[hidden]{display:none}.editor-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.editor-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.editor-resizer:hover:after,.editor-resizer:focus-visible:after,.shell.resizing .editor-resizer:after{background:var(--accent)}.editor-resizer:focus-visible{outline:none}.shell.code-main.live:not(.editor-hidden) .editor-resizer{display:block}.shell.code-main.live:not(.editor-hidden) .live-resizer{display:none}.shell.code-main.live:not(.editor-hidden) .app{flex:0 1 auto;width:460px;min-width:300px}.shell.code-main.live:not(.editor-hidden) .livecode{flex:1 1 0;width:auto!important;min-width:0}.shell.code-main.live:not(.editor-hidden) .livecode{order:1}.shell.code-main.live:not(.editor-hidden) .editor-resizer{order:2}.shell.code-main.live:not(.editor-hidden) .app{order:3;border-inline-start:1px solid var(--border)}.shell.code-main.live:not(.editor-hidden) .live-rail,.shell.code-main.live:not(.editor-hidden) .preview-resizer,.shell.code-main.live:not(.editor-hidden) .robotpreview,.shell.code-main.live:not(.editor-hidden) .robotpreview-rail{order:4}[data-action=swap-main]{font-size:16px;line-height:1}[data-action=swap-main][aria-pressed=true]{color:var(--accent)}.palette-resizer{grid-area:pal;justify-self:end;width:10px;margin-inline-end:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.palette-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.palette-resizer:hover:after,.palette-resizer:focus-visible:after,.shell.resizing .palette-resizer:after{background:var(--accent)}.palette-resizer:focus-visible{outline:none}.app.simulating .palette-resizer{display:none}:root.visuobject-theme{--bg: #edf4f6;--text: #17292e;--muted: #566a70;--border: #cddde1;--accent: #0e7c86;--accent-soft: rgba(14, 124, 134, .2);--accent-faint: rgba(14, 124, 134, .08);--accent-glow: rgba(14, 124, 134, .35)}.visuobject-obj,.visuobject .brand .logo{color:var(--accent)}.shell.visuobject button.text-button{padding:5px 10px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);font:inherit;cursor:pointer}.shell.visuobject button.text-button:hover{border-color:var(--accent);color:var(--accent)}:root.visuobject-theme{--vo-bar: #e3edf0}.vo-columns{display:grid;grid-template-columns:var(--vo-cols, 260px 1px minmax(0, 45fr) 1px minmax(0, 55fr));flex:1;min-height:0;border-top:1px solid var(--border)}.vo-columns.vo-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.vo-pane{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--panel)}.vo-pane.collapsed>:not(.vo-strip){display:none}.vo-strip{display:none;flex:1;align-items:center;justify-content:center;padding:12px 0;border:0;background:var(--vo-bar);color:var(--muted);font:600 14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;writing-mode:vertical-rl;cursor:pointer}.vo-pane.collapsed>.vo-strip{display:flex}.vo-strip:hover,.vo-strip:focus-visible{color:var(--accent);background:var(--accent-faint);outline:none}.vo-splitter{position:relative;z-index:4;background:var(--border);cursor:col-resize;touch-action:none;outline:none}.vo-splitter:after{content:"";position:absolute;top:0;right:-4px;bottom:0;left:-4px}.vo-splitter:hover,.vo-splitter:focus-visible,.vo-resizing .vo-splitter{background:var(--accent)}.vo-splitter.fixed{cursor:default;background:var(--border)}.vo-bar{display:flex;flex-wrap:wrap;align-items:stretch;min-height:40px;background:var(--vo-bar);border-bottom:1px solid var(--border);font-size:14px}.vo-bar-title{display:flex;flex:1;align-items:center;margin:0;text-transform:none;letter-spacing:normal;padding:0 12px;font-size:14px;font-weight:600;color:var(--text)}.vo-bar-actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px;padding:4px 4px 4px 0}.shell.visuobject .vo-bar button.text-button{padding:2px 8px;border-radius:6px}.vo-collapse{padding:0 12px;border:0;background:none;color:var(--muted);font-size:16px;font-weight:700;cursor:pointer}.vo-collapse:hover,.vo-collapse:focus-visible{color:var(--accent)}.vo-tabs{display:flex;flex:1;min-width:0;overflow-x:auto}.vo-tab{display:flex;align-items:stretch;border-right:1px solid var(--border);border-bottom:3px solid transparent}.vo-tab.active{background:var(--panel);border-bottom-color:var(--accent)}.vo-tab [role=tab]{padding:0 4px 0 14px;border:0;background:none;color:var(--text);font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;white-space:nowrap;cursor:pointer}.vo-tab.active [role=tab]{font-weight:700}.vo-tab [role=tab]:hover{color:var(--accent)}.vo-tab-close{padding:0 10px 0 6px;border:0;background:none;color:var(--muted);font-size:15px;cursor:pointer;visibility:hidden}.vo-tab.active .vo-tab-close,.vo-tab:hover .vo-tab-close{visibility:visible}.vo-tab-close:hover{color:var(--accent)}.vo-tab-close .vo-dot,.vo-tab-close.unsaved .vo-x{display:none}.vo-tab-close.unsaved{visibility:visible;color:var(--text)}.vo-tab-close.unsaved .vo-dot{display:inline;font-size:11px}.vo-tab-close.unsaved:hover .vo-dot{display:none}.vo-tab-close.unsaved:hover .vo-x{display:inline}.vo-no-file{display:flex;align-items:center;padding:0 12px;color:var(--muted)}.vo-editor{flex:1;min-height:0;overflow:auto;font-size:14px}.vo-foot{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;padding:6px 12px;border-top:1px solid var(--border);background:var(--vo-bar)}.vo-hint{color:var(--muted);flex:1 1 260px}.vo-canvas{position:relative;flex:1;min-height:0;overflow:auto;background:radial-gradient(circle,var(--border) 1px,transparent 1px) 0 0 / 20px 20px;outline:none}.vo-frames{position:absolute;inset:0 auto auto 0;z-index:0;pointer-events:none;overflow:visible}.vo-package-frame{fill:#0e7c8609;stroke:var(--muted);stroke-width:1.2}.vo-package.current .vo-package-frame{stroke:var(--accent);fill:var(--accent-faint)}.vo-package-name{font:600 12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted)}.vo-package.current .vo-package-name{fill:var(--accent)}.vo-lines{position:absolute;inset:0 auto auto 0;z-index:3;pointer-events:none;overflow:visible}.vo-rel{stroke:var(--text);stroke-width:1.4;fill:none}.vo-rel.ghost{stroke:var(--accent);stroke-dasharray:4 4}.vo-hit{stroke:transparent;stroke-width:12;pointer-events:stroke;cursor:pointer}.vo-relation:hover .vo-rel,.vo-relation:hover .vo-diamond{stroke:var(--accent)}.vo-relation.selected .vo-rel,.vo-relation.selected .vo-diamond{stroke:var(--accent);stroke-width:2.4}.vo-relation.selected .vo-label-svg{fill:var(--accent)}.vo-diamond{fill:var(--panel);stroke:var(--text);stroke-width:1.4}.vo-diamond.filled{fill:var(--text)}.vo-relation.selected .vo-diamond.filled{fill:var(--accent)}.vo-label-svg.name{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:italic;fill:var(--text)}.vo-rel.dashed{stroke-dasharray:6 4}.vo-hollow,.vo-open{fill:none;stroke:var(--text);stroke-width:1.4}.vo-label-svg{font:12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted);paint-order:stroke;stroke:var(--panel);stroke-width:4px}.vo-empty{margin:24px;max-width:40ch;color:var(--muted)}.vo-status{margin:0;color:#b3261e}.vo-status:empty{display:none}.vo-status.hint{color:var(--accent)}.uml-class{position:absolute;left:16px;top:16px;min-width:150px;background:var(--panel);border:1.5px solid var(--text);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.uml-connect{position:absolute;right:-11px;top:50%;width:20px;height:20px;margin-top:-10px;padding:0;border:2px solid var(--panel);border-radius:50%;background:var(--accent);box-shadow:0 1px 4px #00000040;cursor:crosshair;touch-action:none}.uml-connect:after{content:"";position:absolute;top:5px;right:4px;bottom:5px;left:5px;background:#fff;clip-path:polygon(0 35%,55% 35%,55% 0,100% 50%,55% 100%,55% 65%,0 65%)}.uml-class.drop{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.vo-relmenu{position:absolute;z-index:10;display:grid;min-width:220px;padding:6px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0000002e;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-relmenu p{margin:2px 8px 6px;color:var(--muted);font-size:12px}.vo-relmenu button{display:flex;align-items:center;gap:10px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:inherit;text-align:left;cursor:pointer}.vo-relmenu button:hover,.vo-relmenu button:focus-visible{background:var(--accent-faint);color:var(--accent);outline:none}.vo-relicon{flex:none}.vo-palette{display:flex;flex-wrap:wrap;align-items:stretch;gap:2px;padding:4px 6px;border-bottom:1px solid var(--border);background:var(--panel)}.vo-palette-sep{width:1px;margin:4px;background:var(--border)}.vo-tool{display:grid;justify-items:center;gap:1px;min-width:44px;padding:3px 3px 2px;border:1px solid transparent;border-radius:7px;background:none;color:var(--text);font:11px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer;touch-action:none;-webkit-user-select:none;user-select:none}.vo-tool:hover{background:var(--accent-faint);color:var(--accent)}.vo-tool[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.vo-tool[data-tool=class],.vo-tool[data-tool=interface]{cursor:grab}.vo-tool-ghost{position:fixed;z-index:1000;display:grid;justify-items:center;min-width:120px;padding:4px 10px 14px;margin:-14px 0 0 -60px;border:1.5px dashed var(--accent);background:#ffffffe6;font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;pointer-events:none}.vo-tool-ghost small{color:var(--muted);font-size:11px}.vo-canvas:not([data-tool=select])[data-tool]{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class:hover,.uml-class.source{border-color:var(--accent)}.uml-class.source{box-shadow:0 0 0 4px var(--accent-soft)}.vo-stage{position:relative;display:flex;flex:1;min-height:0}.vo-stage .vo-canvas{flex:1}.vo-hsplit{flex:0 0 20px;margin:-10px 0;position:relative;z-index:5;cursor:row-resize;touch-action:none}.vo-hsplit:before{content:"";position:absolute;left:0;right:0;top:9px;height:2px;background:transparent}.vo-hsplit:after{content:"";position:absolute;left:50%;top:7px;width:36px;height:6px;margin-left:-18px;border-radius:3px;background:var(--border)}.vo-hsplit:hover:before,.vo-hsplit:focus-visible:before,.vo-hsplit.dragging:before,.vo-hsplit:hover:after,.vo-hsplit:focus-visible:after,.vo-hsplit.dragging:after{background:var(--accent)}.vo-dock.collapsed+.vo-hsplit:after,.vo-hsplit:has(+.vo-dock.collapsed):after{display:none}.vo-hsplit:focus-visible{outline:none}.vo-dock.collapsed+.vo-hsplit,.vo-hsplit:has(+.vo-dock.collapsed){cursor:default;pointer-events:none}.vo-dock{border-top:1px solid var(--border);background:var(--panel)}.vo-dock-bar{min-height:30px}.vo-dock-bar .vo-bar-title{font-size:13px}.vo-dock.collapsed .vo-inspector{display:none}.vo-inspector{display:grid;align-content:start;gap:8px;height:32vh;overflow:auto;padding:8px 12px 10px;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector-row>label.check,.vo-inspector label.check{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;padding-bottom:6px;color:var(--text);font-size:13px}.vo-inspector input[type=checkbox]{width:auto;margin:0;accent-color:var(--accent)}.vo-inspector fieldset.vo-inspector-ifaces{display:flex;flex-wrap:wrap;gap:4px 14px}.vo-inspector-empty{color:var(--muted)}.vo-inspector-row{display:flex;flex-wrap:wrap;align-items:end;gap:8px 12px}.vo-inspector-row>label{flex:1 1 160px;max-width:260px}.vo-inspector-ends{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.vo-inspector label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-inspector input,.vo-inspector select{box-sizing:border-box;width:100%;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector input:focus,.vo-inspector select:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.vo-inspector fieldset{display:grid;grid-template-columns:minmax(0,1fr) 84px;align-items:start;gap:6px;min-width:0;margin:0;padding:6px 8px 8px;border:1px solid var(--border);border-radius:8px}.vo-inspector fieldset .vo-wide{grid-column:1 / -1}.vo-reading{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;color:var(--muted)}.vo-reading b{color:var(--text)}.shell.visuobject .vo-reading button.text-button{padding:1px 8px;font-size:12px}.vo-inspector legend{padding:0 4px;color:var(--text);font-weight:600}.vo-inspector small{color:var(--muted);font-size:11px}.vo-inspector p{margin:0}.vo-inspector-kind{font-weight:600;padding-top:4px}.shell.visuobject .vo-inspector button.vo-danger{display:inline-flex;align-items:center;justify-self:start;gap:6px;color:#b3261e}.vo-inspector .vo-danger svg{width:15px;height:15px}.vo-insp-head{position:sticky;top:-8px;z-index:1;margin-top:-8px;padding-top:8px;background:var(--panel);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 12px;border-bottom:1px solid var(--border)}.vo-insp-head .vo-inspector-kind{padding:0}.vo-insp-tabs{display:flex;gap:2px}.shell.visuobject .vo-insp-tabs button{margin-bottom:-1px;padding:5px 12px;border:1px solid transparent;border-bottom:none;border-radius:6px 6px 0 0;background:none;color:var(--muted);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-insp-tabs button[aria-selected=true]{border-color:var(--border);background:var(--panel);color:var(--text);font-weight:600}.vo-members{width:100%;border-collapse:collapse}.vo-members th{padding:0 4px 3px;color:var(--muted);font-size:12px;font-weight:500;text-align:left}.vo-members td{padding:2px 4px;vertical-align:middle}.vo-members td.c{width:52px;text-align:center}.vo-members td:first-child{width:112px}.vo-members td:last-child{width:32px}.vo-members .icon svg{width:15px;height:15px}.vo-doc textarea{box-sizing:border-box;width:100%;max-width:780px;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;resize:vertical}.vo-insp-sep{align-self:stretch;width:1px;margin:0 4px;background:var(--border)}.vo-insp-label{align-self:center;color:var(--muted);font-size:12px}.uml-class.selected{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);z-index:2}.uml-head{display:grid;justify-items:center;padding:4px 10px;font-weight:700}.uml-head small{font-weight:400;font-size:11px;color:var(--muted)}.uml-class.abstract .uml-name,.uml-member.abstract{font-style:italic}.uml-member.static{text-decoration:underline}.uml-class ul{list-style:none;margin:0;padding:3px 0;border-top:1.5px solid var(--text);min-height:12px}.uml-class.selected ul{border-top-color:var(--accent)}.uml-class li{padding:0 10px;white-space:nowrap}.uml-member.selected{background:var(--accent-soft)}.uml-add{color:var(--accent);font-style:italic;cursor:pointer;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:12px}.uml-add:hover{text-decoration:underline}.uml-input{font:inherit;padding:0 4px;margin:0 -5px;border:1px solid var(--accent);border-radius:4px;outline:none;max-width:340px}.uml-tools{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;padding:6px 10px;border-top:1px dashed var(--border);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:default}.uml-tools label{display:inline-flex;gap:4px;align-items:center}.uml-tools button.icon svg{width:16px;height:16px}.vo-ws{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 10px 4px;font-size:13px}.vo-ws[hidden]{display:none}.vo-ws.ask{margin:8px 10px 4px;padding:10px;border:1px solid var(--accent);border-radius:8px;background:var(--bg, #fff)}.vo-ws.ask p{flex-basis:100%;margin:0}.vo-ws.ask .hint{color:var(--muted);font-size:12px;margin-bottom:4px}.vo-ws-name{display:inline-flex;align-items:center;gap:6px;margin-right:auto;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shell.visuobject .vo-ws button.text-button{padding:2px 8px;border-radius:6px}.shell.visuobject .vo-ws button.text-button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.vo-lines .vo-end-hit{fill:transparent;pointer-events:all;cursor:context-menu}.vo-lines .vo-label-svg.editable{pointer-events:all;cursor:pointer}.vo-lines .vo-label-svg.editable:hover{fill:var(--accent);text-decoration:underline}.vo-lines .vo-label-svg.placeholder{fill:var(--muted);opacity:.6;font-style:italic}.vo-endpop{position:absolute;z-index:12;display:grid;gap:8px;width:min(330px,calc(100% - 16px));box-sizing:border-box;padding:10px 12px;background:var(--panel);border:1px solid var(--accent);border-radius:10px;box-shadow:0 8px 24px #00000029;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop p{margin:0}.vo-endpop label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-endpop input{box-sizing:border-box;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop-row{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.vo-endpop-row>span{flex-basis:100%;color:var(--muted);font-size:12px}.vo-endpop-row button{padding:2px 8px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.vo-endpop-row button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.vo-endpop-row input{width:64px}.vo-new{position:relative}.vo-new-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:grid;min-width:190px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000024}.vo-new-menu[hidden]{display:none}.vo-new-menu button{display:flex;align-items:center;gap:8px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;text-align:left;cursor:pointer}.vo-new-menu button:hover,.vo-new-menu button:focus-visible{background:var(--accent-soft);outline:none}.vo-badge.folder.source{box-shadow:inset 0 3px #ffffff59,inset -5px -4px #8a6d2b}.confirm-card.vo-wizard{display:grid;gap:10px;width:min(520px,100%);max-width:none;max-height:calc(100vh - 32px);overflow:auto;box-sizing:border-box;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-wizard h2{margin:0;font-size:17px}.vo-wizard .hint{margin:0;color:var(--muted);font-size:13px}.vo-wizard>label{display:grid;grid-template-columns:130px minmax(0,1fr);align-items:center;gap:8px;color:var(--muted);font-size:13px}.vo-wizard input[type=text],.vo-wizard select{box-sizing:border-box;width:100%;min-width:0;padding:5px 7px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:inherit}.vo-wizard fieldset{margin:0;padding:6px 10px 8px;border:1px solid var(--border);border-radius:8px}.vo-wizard legend{padding:0 4px;color:var(--muted);font-size:13px}.vo-wizard-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}.vo-wizard-row select,.vo-wizard-row input[type=text]{width:auto;flex:1 1 160px}.vo-wizard-list{display:grid;gap:4px}.vo-wizard .check{display:inline-flex;align-items:center;gap:6px}.vo-wizard code{font-size:12px}.vo-wizard-error{min-height:1em;margin:0;color:#b3261e;font-size:13px}.vo-wizard .group button.primary{background:var(--accent);border-color:var(--accent);color:#fff}@media(max-width:560px){.vo-wizard>label{grid-template-columns:1fr}}.vo-dirty{color:var(--accent)}.vo-tree-tools{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 4px}.shell.visuobject .vo-tree-tools button.text-button{padding:2px 8px;border-radius:6px}.vo-tree{flex:1;min-height:0;overflow:auto;padding:6px;font:13px/1.3 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-tree ul{list-style:none;margin:0;padding:0}.vo-row{display:flex;align-items:center;gap:6px;min-height:28px;padding:0 6px 0 calc(4px + var(--depth, 0) * 14px);border-radius:7px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;outline:none}.vo-row:hover{background:var(--accent-faint)}.vo-row:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-soft)}.vo-row.active .vo-label{font-weight:600}.vo-row.selected{background:var(--accent-soft);color:var(--text)}.vo-twisty,.vo-twisty-space{flex:none;width:18px;height:18px}.vo-twisty{display:grid;place-items:center;padding:0;border:0;border-radius:4px;background:none;color:var(--muted);cursor:pointer}.vo-twisty svg{transition:transform .15s ease}[aria-expanded=true]>.vo-row .vo-twisty svg{transform:rotate(90deg)}.vo-twisty:hover{color:var(--accent)}.vo-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-type{color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis}.vo-row .uml-input{margin:0;font:inherit}.vo-row-delete{margin-left:auto;visibility:hidden}.vo-tree button.vo-row-delete{width:24px;height:24px}.vo-tree button.vo-row-delete svg{width:14px;height:14px}.vo-row:hover .vo-row-delete,.vo-row.selected .vo-row-delete{visibility:visible}.vo-tree-empty{padding:6px 10px 6px 52px;color:var(--muted);font-size:12px;white-space:normal}.vo-badge{flex:none;display:inline-grid;place-items:center;width:16px;height:16px;border-radius:4px;font:700 10px/1 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#fff}.vo-badge.project{background:var(--accent);border-radius:5px;box-shadow:inset 0 -5px #0000002e}.vo-badge.project.closed{opacity:.55}.vo-badge.folder{width:17px;height:13px;border-radius:2px 4px 3px 3px;background:#e0a63b;box-shadow:inset 0 3px #ffffff59}.vo-badge.package{width:14px;height:14px;border-radius:3px;background:#b07a2a;transform:rotate(45deg) scale(.82)}.vo-badge.package.empty{background:none;border:1.5px solid #b07a2a}.vo-badge.file{background:#e66a2c;border-radius:3px 6px 3px 3px}.vo-badge.type.class{background:#2f7d32;border-radius:50%}.vo-badge.type.class.abstract{background:#6a9c3a;font-style:italic}.vo-badge.type.interface{background:#7b4fb0;border-radius:50%}.vo-badge.field,.vo-badge.method{width:9px;height:9px;margin:0 3px}.vo-badge.field{border-radius:2px}.vo-badge.method{border-radius:50%}.vo-badge.public{background:#2f9e44}.vo-badge.private{background:#d6453d}.vo-badge.protected{background:#e0a63b}.vo-badge.package.field,.vo-badge.package.method{background:#3b82c4;transform:none;border:0}.vo-badge.static{box-shadow:0 0 0 2px var(--panel),0 0 0 3px currentColor;color:var(--muted)}@media(max-width:760px){.vo-columns{grid-template-columns:1fr;grid-auto-rows:auto;overflow:auto}.vo-splitter{display:none}.vo-explorer:not(.collapsed){height:260px}.vo-code:not(.collapsed){height:320px}.vo-diagram:not(.collapsed){min-height:420px}.vo-pane{border-bottom:1px solid var(--border)}.vo-strip{writing-mode:horizontal-tb;padding:10px}}.shell.visuobject .vo-run-group button.vo-run{color:var(--accent);font-weight:600}.vo-console{display:flex;flex-direction:column;height:32vh;min-height:120px;border-top:1px solid var(--border)}.vo-console[hidden],.vo-swing[hidden]{display:none}.vo-console .vo-dock-bar{gap:10px}.vo-console-status{flex:1;color:var(--muted);font-size:12px}.vo-console-status.error{color:#b3261e}.vo-swing{display:flex;height:60%;padding:6px}.vo-console-lines{flex:1;min-height:0;overflow:auto;margin:0;padding:6px 12px;font-size:13px;white-space:pre-wrap}.uml-note{position:absolute;min-width:120px;max-width:260px;padding:8px 22px 8px 10px;background:#fffbe6;border:1.2px solid var(--text);clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,0 100%);font:13px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#17292e;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none;z-index:1}.uml-note:after{content:"";position:absolute;top:0;right:0;width:14px;height:14px;background:linear-gradient(to bottom left,transparent 50%,#e9dfae 50%);border-left:1.2px solid var(--text);border-bottom:1.2px solid var(--text)}.uml-note.selected{outline:3px solid var(--accent-soft);border-color:var(--accent);clip-path:none}.uml-note .uml-connect{z-index:2}.uml-note-text{white-space:pre-wrap;overflow-wrap:anywhere}.uml-note-text.placeholder{color:#8a8a8a;font-style:italic}.uml-note-edit{box-sizing:border-box;width:220px;border:1px solid var(--accent);background:#fffef5;font:inherit;resize:both}.vo-note-link{stroke-dasharray:5 4}.vo-canvas[hidden],.vo-palette[hidden]{display:none}.vo-diagram-switch{display:flex;gap:2px;padding:2px;border:1px solid var(--border);border-radius:8px;background:var(--panel)}.shell.visuobject .vo-diagram-switch button{padding:3px 10px;border:none;border-radius:6px;background:none;color:var(--muted);font:600 13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-diagram-switch button[aria-selected=true]{background:var(--accent);color:#fff}.vo-obj-palette{align-items:center;gap:8px;padding:6px 10px}.vo-obj-new{display:flex;align-items:center;gap:6px;font-size:13px}.vo-obj-new select{padding:3px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.uml-object .uml-objname{text-decoration:underline;font-weight:600}.uml-object.unknown{border-style:dashed}.uml-object .uml-member.changed,.vo-objlink.changed{animation:vo-changed 1.2s ease-out}.uml-object .uml-member.changed{background:#fff3b0}@keyframes vo-changed{0%{background:#ffe066}}.vo-obj-values td:first-child{width:auto;white-space:nowrap}.vo-obj-values td:last-child{width:50%}.vo-dbg-controls{display:inline-flex;gap:2px}.vo-dbg-controls[hidden]{display:none}.vo-console-lines .vo-out-err{color:#b3261e}.vo-console-lines .vo-out-in{color:var(--accent);font-weight:600}.vo-console-input{display:flex;align-items:center;gap:6px;padding:4px 12px 8px;color:var(--accent)}.vo-console-input[hidden]{display:none}.vo-console-input input{flex:1;font-size:13px;padding:4px 6px;border:1px solid var(--accent);border-radius:4px}.vo-dbg{display:grid;grid-template-columns:minmax(160px,1fr) minmax(220px,2fr);gap:12px;padding:8px 12px}.vo-dbg h3{margin:0 0 6px;font-size:12px;font-weight:600;color:var(--muted)}.vo-dbg ol{list-style:none;margin:0;padding:0}.vo-dbg-frame{display:block;width:100%;text-align:start;padding:3px 6px;border:0;border-radius:4px;background:none;color:inherit;font:inherit;cursor:pointer}.vo-dbg-frame.on{background:var(--accent-soft)}.vo-dbg-frame small{color:var(--muted)}.vo-dbg-vars tr.changed td{background:#ffd60a59}@media(max-width:760px){.vo-dbg{grid-template-columns:1fr}}.vo-seqcanvas{overflow:auto}.vo-seqcanvas .vo-empty[hidden]{display:none}.vo-seq{display:block;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}.vo-seq-head rect{fill:var(--panel);stroke:var(--text);stroke-width:1.2}.vo-seq-head text{fill:var(--text);text-decoration:underline}.vo-seq-head.static text{text-decoration:none;font-weight:600}.vo-seq-life{stroke:var(--muted);stroke-dasharray:5 4}.vo-seq-bar{fill:var(--panel);stroke:var(--text);stroke-width:1}.vo-seq-bar.running{fill:var(--accent-soft)}.vo-seq-msg{cursor:pointer}.vo-seq-msg line,.vo-seq-msg path{stroke:var(--text);stroke-width:1.2}.vo-seq-msg .head.filled{fill:var(--text)}.vo-seq-msg text{fill:var(--text)}.vo-seq-msg.return line,.vo-seq-msg.create line{stroke-dasharray:6 4}.vo-seq-msg.exception line,.vo-seq-msg.exception text{stroke:#b3261e;fill:#b3261e}.vo-seq-msg.current line,.vo-seq-msg.current path{stroke:#e0a800;stroke-width:2.4}.vo-seq-msg.current .head.filled{fill:#e0a800}.vo-seq-msg.current text{font-weight:700}.vo-seq-msg:hover text{fill:var(--accent)}.vo-seq-more{fill:var(--muted)}.palette-head{display:flex;align-items:center;gap:4px;margin:0 0 4px}.palette-head h2{flex:1;min-width:0;margin:0}.palette-hide{min-height:26px;padding:2px 5px}.app.compact-palette .palette-head{flex-direction:column;gap:2px}.palette-rail{display:none;grid-area:pal;width:auto}.app.palette-hidden .palette,.app.palette-hidden .palette-resizer{display:none}.app.palette-hidden:not(.simulating) .palette-rail{display:flex}@media(max-width:820px){.palette-head{display:none}.app.palette-hidden .palette{display:block}.app.palette-hidden .palette-rail{display:none!important}}.diagram-tools .pseudocode-toggle{gap:4px;margin:0 4px;white-space:nowrap;cursor:pointer}:root.visuflow-theme{--bg: #f3f0fb;--text: #221a35;--muted: #625a75;--border: #ddd6ee;--accent: #6f42c1;--accent-soft: rgba(111, 66, 193, .2);--accent-faint: rgba(111, 66, 193, .08);--accent-glow: rgba(111, 66, 193, .35)}.visuflow-flow{color:var(--accent)}.vf-logo{width:22px;height:22px;background:no-repeat center / contain url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236f42c1' stroke-width='2'%3E%3Crect x='6' y='1.5' width='12' height='5' rx='2.5'/%3E%3Cpath d='M12 6.5v3M12 9.5l5 4-5 4-5-4z M12 17.5v2'/%3E%3Crect x='7' y='19.5' width='10' height='3' rx='0.5'/%3E%3C/svg%3E")}.shell.visuflow button.text-button{padding:5px 10px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);font:inherit;cursor:pointer}.shell.visuflow button.text-button:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.shell.visuflow button:disabled{opacity:.45;cursor:default}.vf-export{position:relative}.vf-menu{position:absolute;top:calc(100% + 6px);inset-inline-start:0;z-index:30;display:grid;min-width:190px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.vf-menu[hidden]{display:none}.vf-menu button{padding:8px 10px;border:0;border-radius:6px;background:none;color:var(--text);font:inherit;text-align:start;cursor:pointer}.vf-menu button:hover,.vf-menu button:focus-visible{background:var(--accent-faint);color:var(--accent)}.vf-main{display:flex;flex:1;min-height:0;border-top:1px solid var(--border)}.vf-palette{display:flex;flex-direction:column;gap:8px;width:190px;flex-shrink:0;padding:10px;overflow-x:hidden;overflow-y:auto;background:var(--panel);border-inline-end:1px solid var(--border)}.vf-palette h2{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.vf-shapes{display:grid;gap:6px}.vf-shape{display:flex;align-items:center;gap:8px;padding:4px 6px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);font:inherit;font-size:13px;text-align:start;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none}.vf-shape:hover,.vf-shape:focus-visible{border-color:var(--accent);background:var(--accent-faint)}.vf-shape svg{flex-shrink:0;width:48px;height:27px}.vf-hint{margin:4px 0 0;font-size:12px;line-height:1.4;color:var(--muted)}.vf-stage{display:flex;flex-direction:column;flex:1;min-width:0}.vf-titlebar{padding:8px 12px;background:var(--panel);border-bottom:1px solid var(--border)}.vf-title{width:min(420px,100%);padding:6px 8px;border:1px solid var(--border);border-radius:6px;font:inherit;font-weight:600}.vf-scroll{position:relative;flex:1;overflow:auto;background-color:#fff;background-image:radial-gradient(circle,#d9d4e6 1px,transparent 1.2px);background-size:20px 20px;background-attachment:local}.vf-canvas{display:block;touch-action:none;user-select:none;-webkit-user-select:none}.vf-node{cursor:move}.vf-node.selected>:first-child{stroke:var(--accent);stroke-width:3;filter:drop-shadow(0 0 4px var(--accent-glow))}.vf-node.drop-target>:first-child{stroke:var(--accent);stroke-width:3;stroke-dasharray:6 3}.vf-edge{cursor:pointer}.vf-edge.selected .vf-edge-line{stroke:var(--accent);stroke-width:3}.vf-port{cursor:crosshair}.vf-port-dot{fill:#fff;stroke:var(--accent);stroke-width:2}.vf-port.used .vf-port-dot{fill:var(--accent);opacity:.55}.vf-port:hover .vf-port-dot{fill:var(--accent);opacity:1}.vf-drag-line{stroke:var(--accent);stroke-width:2;stroke-dasharray:6 4;pointer-events:none}.vf-editor{position:absolute;z-index:5;box-sizing:border-box;padding:4px 6px;border:2px solid var(--accent);border-radius:6px;background:#fff;color:var(--text);font:14px -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:16px;text-align:center;resize:none;overflow:hidden}.vf-ghost{position:fixed;z-index:100;pointer-events:none;transform:translate(-50%,-50%) scale(1.6);opacity:.85}.vf-status{margin:0;padding:6px 12px;font-size:12px;color:var(--muted);background:var(--panel);border-top:1px solid var(--border)}@media(max-width:700px){.vf-main{flex-direction:column}.vf-palette{flex-direction:row;width:auto;overflow-x:auto;border-inline-end:0;border-bottom:1px solid var(--border)}.vf-palette h2,.vf-hint{display:none}.vf-shapes{display:flex}.vf-shape{flex-direction:column;gap:2px;font-size:11px}}[data-bot-color=fahren],.bot-fahren{--bot: #c2410c}[data-bot-color=licht],.bot-licht{--bot: #84cc16}[data-bot-color=ton],.bot-ton{--bot: #c026d3}[data-bot-color=anzeige],.bot-anzeige{--bot: #4f46e5}[data-bot-color=warten],.bot-warten{--bot: #6b7280}[data-bot-color=sensor],.bot-sensor{--bot: #0891b2}[data-bot-color=operator],.bot-operator{--bot: #16a34a}[data-bot-color=variable],.bot-variable{--bot: #ea580c}:root:not(.no-code-scopes) .palette-item[data-bot-color]{border-left:4px solid var(--bot)}:root:not(.no-code-scopes) .palette-group[data-bot-color] button:after,:root:not(.no-code-scopes) .learn-text h3[class^=bot-]:before{content:"";display:inline-block;width:9px;height:9px;flex-shrink:0;border-radius:50%;background:var(--bot)}:root:not(.no-code-scopes) .palette-group[data-bot-color] button:before{order:-2}:root:not(.no-code-scopes) .palette-group[data-bot-color] button:after{order:-1}:root:not(.no-code-scopes) .learn-text h3[class^=bot-]:before{margin-inline-end:7px;vertical-align:1px}.learn-drive-map{display:block;width:100%;max-width:320px;margin:8px auto;touch-action:manipulation}.learn-drive-map .cell{stroke:#cbd5e1;stroke-width:.6;cursor:pointer}.learn-drive-map:not(.done) .cell:hover,.learn-drive-map .cell:focus-visible{stroke:var(--accent);stroke-width:2;outline:none}.learn-drive-map.done .cell{cursor:default}.learn-drive-map .cell.right{stroke:#16a34a;stroke-width:3}.learn-drive-map .cell.wrong{stroke:#dc2626;stroke-width:3}.learn-drive-map .trail{stroke:var(--accent);stroke-width:2;stroke-dasharray:3 2;pointer-events:none}.learn-drive-map .robot{transition:transform .4s ease-in-out;pointer-events:none}.learn-drive-map .robot .body{fill:#0ea5b7;stroke:#0f172a;stroke-width:1}.learn-drive-map .robot .nose{fill:#fff}@media(prefers-reduced-motion:reduce){.learn-drive-map .robot{transition:none}}.diagram-tools .blocks-toggle{display:inline-flex;align-items:center;gap:5px;height:30px;margin-inline-start:6px;padding:0 10px;white-space:nowrap}.diagram-tools .blocks-toggle[hidden]{display:none}@container (max-width: 520px){.diagram-tools .blocks-toggle span+span{display:none}}.blocks-view{--bk-stmt: #f2b100;--bk-loop: #ec5fa6;--bk-if: #3b9cf0;--bk-plain: #9aa3ae;--bk-bump: 6px;--bk-workspace: #fafafa;flex:1;min-height:0;overflow:auto;scrollbar-gutter:stable;background:var(--bk-workspace);padding:10px 16px 32px;font:500 calc(15px * var(--bk-zoom, 1)) / 1.5 system-ui,-apple-system,sans-serif;user-select:none;-webkit-user-select:none}.blocks-view[hidden]{display:none}.bk-hint{margin:0 0 6px;max-width:44em;color:var(--muted);font-size:13px;line-height:1.4}.bk-stack{padding-top:14px}.bk{--bk-color: var(--bk-stmt);--bk-c: color-mix(in srgb, var(--bk-color) 42%, #fff);--bk-e: color-mix(in srgb, var(--bk-color) 80%, #000);position:relative;width:fit-content;min-width:12em;max-width:100%;border:1px solid var(--bk-e);border-radius:5px;background:var(--bk-c);color:#000;cursor:pointer}.bk-loop{--bk-color: var(--bk-loop)}.bk-if{--bk-color: var(--bk-if)}.bk-hat{--bk-color: var(--bk-stmt);cursor:default}:root.no-code-scopes .bk{--bk-color: var(--bk-plain)}:root:not(.no-code-scopes) .bk[data-bot-color]{border-left:6px solid var(--bot)}.bk+.bk,.bk+.bk-empty,.bk-empty+.bk{margin-top:-1px}.bk-simple:after,.bk-c:after,.bk-hat:after,.bk-c>.bk-head:first-child:after,.bk-clause:after{content:"";position:absolute;z-index:1;left:12px;bottom:calc(-1 * var(--bk-bump) - 1px);width:1.6em;height:var(--bk-bump);background:var(--bk-c);border:1px solid var(--bk-e);border-top:none;border-radius:0 0 6px 6px}.bk-c>.bk-head:first-child:after,.bk-clause:after{left:28px}.bk-head,.bk-foot{position:relative;display:flex;flex-direction:column;padding:calc(var(--bk-bump) - 1px) 10px 4px}.bk-foot{min-height:calc(var(--bk-bump) + 10px);padding-top:var(--bk-bump)}.bk-line{white-space:pre-wrap}.bk-hat{border-top-left-radius:22px;border-top-right-radius:10px}.bk-hat>.bk-head{flex-direction:row;flex-wrap:wrap;column-gap:1em;padding-top:8px;padding-left:14px}.bk-hat:before{content:"";position:absolute;left:-1px;top:-9px;width:7em;height:18px;border:1px solid var(--bk-e);border-bottom:none;border-radius:50% 50% 0 0/100% 100% 0 0;background:var(--bk-c);clip-path:inset(0 0 8px 0)}.bk-body{margin-left:16px;margin-right:-1px;padding-right:2em;min-height:1em;background:var(--bk-workspace);border:1px solid var(--bk-e);border-right:none;border-radius:4px 0 0 4px;color:var(--text)}.bk-body>:first-child{margin-top:-1px}.bk-cap{border-bottom-left-radius:2px;border-bottom-right-radius:10px}.bk-call>.bk-head{margin:0 6px;border-inline:2px solid var(--bk-e)}.bk-empty{width:fit-content;min-width:12em;margin:6px 8px;padding:2px 10px;border:1.5px dashed var(--border);border-radius:6px;color:var(--muted);font-style:italic;font-size:.9em;cursor:pointer}.bk .tk-kw{font-weight:700}.bk .tk-lit,.bk .tk-str{padding:0 6px;border-radius:999px;background:#fff;box-decoration-break:clone;-webkit-box-decoration-break:clone}.bk .tk-lit:empty{display:inline-block;min-width:2.5ch;min-height:1.2em;vertical-align:middle}.bk .tk-var{padding:0 6px;border-radius:999px;background:#fdba74;color:#431407;font-weight:600}.bk .tk-op{padding:1px 6px;border:1px solid #15803d;border-radius:999px;background:#86efac;color:#052e16}.bk .tk-sensor{padding:0 6px;border:1px solid color-mix(in srgb,#0891b2 80%,#000);border-radius:999px;background:color-mix(in srgb,#0891b2 35%,#fff)}:root.no-code-scopes .bk .tk-sensor{border-color:#6b7280;background:#e5e7eb}.bk-sel{outline:3px solid var(--accent);outline-offset:1px;z-index:2}.bk-exec{outline:3px solid var(--text);outline-offset:1px;box-shadow:0 0 12px 4px var(--accent-glow);z-index:2}.blocks-view.bk-simulating .bk,.blocks-view.bk-simulating .bk-empty{cursor:default}.bk-stack{position:relative}.bk-drop-line{position:absolute;z-index:5;height:6px;border-radius:3px;background:var(--accent);box-shadow:0 0 0 2px #fff;pointer-events:none}.bk-drop,.bk-empty.bk-drop{outline:3px dashed var(--accent);outline-offset:1px;z-index:2}.bk-trash{display:none;position:sticky;bottom:0;margin:16px 0 0 auto;width:fit-content;padding:10px 16px;border:2px dashed var(--border);border-radius:12px;background:var(--panel);color:var(--muted);font-size:14px}.blocks-view.bk-moving .bk-trash{display:block}.bk-trash.bk-trash-hot{border-color:#dc2626;background:#fee2e2;color:#991b1b}.blocks-view:not(.bk-simulating) .bk:not(.bk-hat){touch-action:pan-y}.blocks-view:not(.bk-simulating) .bk [data-value]{cursor:text}.blocks-view:not(.bk-simulating) .bk [data-value]:hover{box-shadow:0 0 0 2px var(--accent)}.bk-input{box-sizing:border-box;min-width:2ch;padding:0 6px;border:2px solid var(--accent);border-radius:999px;background:#fff;color:#000;font:inherit;text-align:center;outline:none}.bk .tk-sensor.tk-bool{padding:0 12px;border:none;border-radius:0;clip-path:polygon(8px 0,calc(100% - 8px) 0,100% 50%,calc(100% - 8px) 100%,8px 100%,0 50%)}.bk .tk-sensor.bk-drop,.bk [data-value].bk-drop{outline:3px dashed var(--accent);outline-offset:1px;clip-path:none}.app.block-mode .palette-sensor code{display:inline-block;margin-top:2px;padding:0 8px;border:1px solid color-mix(in srgb,#0891b2 80%,#000);border-radius:999px;background:color-mix(in srgb,#0891b2 35%,#fff);color:#000}.app.block-mode .palette-sensor code.sensor-bool,.drag-ghost.drag-sensor.sensor-bool{padding:0 12px;border:none;border-radius:0;clip-path:polygon(8px 0,calc(100% - 8px) 0,100% 50%,calc(100% - 8px) 100%,8px 100%,0 50%)}.drag-ghost.drag-sensor{border:1px solid color-mix(in srgb,#0891b2 80%,#000);border-radius:999px;background:color-mix(in srgb,#0891b2 35%,#fff);color:#000;font-family:ui-monospace,monospace}.app.block-mode .palette-item:not(.palette-sensor),.drag-ghost.drag-block{--bk-color: #f2b100;--bk-c: color-mix(in srgb, var(--bk-color) 42%, #fff);--bk-e: color-mix(in srgb, var(--bk-color) 80%, #000);border:1px solid var(--bk-e);border-radius:5px;background:var(--bk-c);color:#000;font-weight:600}.app.block-mode .palette-item[data-scope=loop],.drag-ghost.drag-block[data-scope=loop]{--bk-color: #ec5fa6}.app.block-mode .palette-item[data-scope=if],.drag-ghost.drag-block[data-scope=if]{--bk-color: #3b9cf0}:root.no-code-scopes .app.block-mode .palette-item:not(.palette-sensor),:root.no-code-scopes .drag-ghost.drag-block{--bk-color: #9aa3ae}.app.block-mode .palette-item:not(.palette-sensor) .icon{display:none}.app.block-mode .palette-item:not(.palette-sensor):hover,.app.block-mode .palette-item:not(.palette-sensor):focus-visible{border-color:var(--bk-e);box-shadow:0 0 0 2px var(--accent)}.app.block-mode .palette-item:not(.palette-sensor){position:relative;margin-bottom:4px}:root:not(.no-code-scopes) .app.block-mode .palette-item[data-bot-color]{border-left:6px solid var(--bot)}.app.block-mode .palette-item:not(.palette-sensor):after,.drag-ghost.drag-block:after{content:"";position:absolute;z-index:1;left:12px;bottom:-7px;width:1.6em;height:6px;background:var(--bk-c);border:1px solid var(--bk-e);border-top:none;border-radius:0 0 6px 6px}.app.block-mode .palette-item[data-scope=loop],.app.block-mode .palette-item[data-scope=if],.drag-ghost.drag-block[data-scope=loop],.drag-ghost.drag-block[data-scope=if]{padding-bottom:26px}.app.block-mode .palette-item[data-scope=loop]:before,.app.block-mode .palette-item[data-scope=if]:before,.drag-ghost.drag-block[data-scope=loop]:before,.drag-ghost.drag-block[data-scope=if]:before{content:"";position:absolute;left:14px;right:-1px;bottom:8px;height:12px;background:var(--panel);border:1px solid var(--bk-e);border-right:none;border-radius:4px 0 0 4px}.drag-ghost.drag-block{padding:6px 12px;min-width:9em}.app.block-mode .palette-op code,.drag-ghost.drag-sensor.drag-op{border-color:#15803d;background:#86efac}.app.block-mode .palette-var code,.drag-ghost.drag-sensor.drag-var{border-color:#c2410c;background:#fdba74}.blocks-view.bk-picture{flex:none;overflow:visible;padding:4px 8px 10px;border-radius:10px;font-size:14px;margin-bottom:8px}.bk-picture .bk-hint,.bk-picture .bk-trash{display:none}.bk-picture .bk-stack{padding-top:6px} diff --git a/website/app/assets/it-B0g-vqj6.js b/website/app/assets/it-B0g-vqj6.js deleted file mode 100644 index 9a12e06d..00000000 --- a/website/app/assets/it-B0g-vqj6.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Testi presenti solo nella versione web. Tutto il resto proviene dai Localizable.strings dell’app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagramma VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Canc"; -"web_key_shift" = "Maiusc"; -"web_export" = "Esporta…"; -"web_export_title" = "Salva come immagine o PDF, oppure stampa"; -"web_export_png" = "Immagine (PNG)"; -"web_export_svg" = "Grafica vettoriale (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "File VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Esportazione non riuscita: %@"; -"web_print_hint" = "Usa “Esporta… → PDF” per salvare il diagramma e stamparlo da lì."; -"web_delete" = "Elimina"; -"web_language_title" = "Lingua dell’interfaccia"; -"web_simulation_start" = "Avvia simulazione"; -"web_simulation_end" = "Termina simulazione"; -"web_simulation_start_title" = "Esegui il diagramma passo dopo passo"; -"web_simulation_end_title" = "Termina la simulazione e continua a modificare"; -"web_palette_hint" = "Trascina nel diagramma"; -"web_tabs_label" = "Diagrammi"; -"web_status_modified" = "modificato"; -"web_inspector_title" = "Proprietà"; -"web_inspector_resize" = "Cambia l’altezza dell’ispettore oggetti: trascina o scorri la linea su o giù (doppio clic: predefinito)"; -"web_inspector_help_drop" = "Trascina gli elementi dalla tavolozza su un riquadro: in alto = prima, in basso = dopo, su “ø” = sostituisci. Gli elementi esistenti si possono spostare con il mouse."; -"web_inspector_help_inline" = "Doppio clic o doppio tocco su un elemento per modificarne il testo direttamente nel diagramma (Invio applica, Esc annulla). Anche i nomi dei casi."; -"web_inspector_help_files" = "Puoi anche trascinare file nella finestra."; -"web_case_name" = "Nome del caso"; -"web_case_name_placeholder" = "es. 1, ok, default"; -"web_copied" = "Elemento copiato."; -"web_discard_message_fmt" = "Le modifiche a “%@” andranno perse."; -"web_err_unreadable_fmt" = "“%@” non è un file VisuStruct leggibile (%@)."; -"web_saved_fmt" = "“%@” salvato."; -"web_saved_txt_fmt" = "Salvato come “%@”. Rimuovi l’estensione .txt per usarlo."; -"web_drop_impossible" = "Impossibile rilasciare qui"; -"web_sim_delay" = "Pausa per passo"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Linguaggio"; -"web_codegen_comments" = "Testo del diagramma come commenti"; -"web_codegen_empty_else" = "Genera ramo else vuoto nel codice"; -"web_copied_check" = "Copiato ✓"; -"web_copy_manual" = "Selezionato, premi Ctrl+C per copiare"; -"web_run_stopped_loop" = "Esecuzione interrotta: possibile ciclo infinito."; -"web_run_cancelled" = "Esecuzione annullata."; -"web_run_error" = "Errore durante l’esecuzione."; -"web_run_dropped_fmt" = "… %d righe precedenti nascoste"; -"web_sim_call_arguments_fmt" = "La chiamata non corrisponde all’intestazione di %@. Controlla i valori tra parentesi."; -"web_sim_missing_return_fmt" = "%@ è terminato senza restituire un valore con return."; -"web_sim_file_not_found_fmt" = "Non esiste nessun file chiamato %@."; -"web_sim_end_of_file_fmt" = "Il file %@ non ha più righe."; -"web_sim_null_value_fmt" = "%@ è null."; -"web_sim_unknown_variable_case_fmt" = "Variabile sconosciuta: %1$@. Java distingue tra maiuscole e minuscole: intendevi %2$@?"; -"web_sim_written_file_fmt" = "%@ (salvato)"; -"web_site_home" = "Pagina iniziale"; -"web_site_imprint" = "Note legali"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmazione"; -"web_live_hide" = "Nascondi programmazione"; -"web_scale_canvas" = "Dimensione testo: diagramma"; -"web_scale_code" = "Dimensione testo: programmazione"; -"web_live_indent" = "Indenta"; -"web_live_indent_title" = "Indenta il codice: quattro spazi per livello (righe selezionate, altrimenti tutto)"; -"web_live_show" = "Mostra programmazione"; -"web_live_resize" = "Modifica la larghezza dell’area codice (doppio clic: ripristina)"; -"web_live_hint" = "Il codice cresce con il tuo diagramma. Grigio = segnaposto: scrivi nell’ispettore e il tuo testo appare qui. Clicca su una riga per selezionarne l’elemento."; -"web_live_ph_selector" = "variabile"; -"web_live_ph_code" = "Il tuo codice"; -"web_live_ph_end" = "fine"; -"web_live_language" = "Linguaggio di programmazione"; -"web_live_java_class" = "Come classe"; -"web_live_java_class_hint" = "Nome della classe = titolo del diagramma"; -"web_live_java_main" = "Con metodo main"; -"web_settings_display" = "Visualizzazione"; -"web_live_swing" = "Java vero (con Swing)"; -"web_live_swing_hint" = "Java vero con finestre (CheerpJ). Scarica circa 40 MB una sola volta, alla prima esecuzione."; -"web_live_swing_windows" = "Finestre Java"; -"web_live_swing_hide" = "Chiudi finestre Java"; -"web_live_swing_loading" = "Caricamento di Java (circa 40 MB la prima volta) …"; -"web_live_swing_compiling" = "Compilazione …"; -"web_live_swing_running" = "Il programma è in esecuzione."; -"web_live_swing_compile_failed" = "Errore di compilazione, vedi sopra."; -"web_live_swing_failed" = "Impossibile caricare Java. Controlla la connessione a internet."; -"web_live_hint_edit" = "Scrivi qui codice Java e il diagramma si costruisce da solo. Oppure lavora nel diagramma e il codice cresce con lui. Grigio = segnaposto, basta scriverci sopra."; -"web_live_edit_label" = "Codice Java"; -"web_parse_line_fmt" = "Riga %d: %@"; -"web_parse_missing" = "Qui manca ancora: %@"; -"web_parse_extra" = "Di troppo: %@"; -"web_parse_unclosed_string" = "Manca il %@ di chiusura."; -"web_parse_else_without_if" = "Questo «else» non ha un «if»."; -"web_parse_case_outside_switch" = "«case» e «default» vanno dentro uno «switch»."; -"web_parse_missing_do_while" = "Dopo «do { … }» manca ancora «while (condizione);»."; -"web_parse_more_methods" = "Per ora qui conta un solo metodo. Crea gli altri sottoprogrammi in schede separate."; -"web_parse_missing_import" = "Manca %@ in cima. Senza questa riga Java non conosce Scanner."; -"web_parse_missing_scanner" = "Manca prima %@ Senza questa riga lo Scanner non esiste."; -"web_parse_unknown_type" = "Java non conosce questo tipo di dato. Intendevi %@?"; -"web_quickfix_insert_fmt" = "Suggerimento: inserisci %@"; -"web_quickfix_replace_fmt" = "Suggerimento: %1$@ invece di %2$@"; -"web_parse_wrong_case" = "Java distingue tra maiuscole e minuscole. La forma corretta è %@."; -"web_editor_title" = "Diagramma"; -"web_editor_show" = "Mostra diagramma"; -"web_editor_hide" = "Nascondi diagramma"; -"web_keywords_title" = "Parole chiave del codice"; -"web_keywords_hint" = "if, while, for al posto dei nomi degli elementi"; -"web_palette_compact" = "Elementi sempre compatti"; -"web_palette_compact_hint" = "Simbolo con il nome piccolo sotto, altrimenti solo con la colonna stretta"; -"web_about_version_fmt" = "Versione %@"; -"web_about_software" = "Software utilizzato"; -"web_about_software_text" = "L’editor di codice usa CodeMirror e Lezer (licenza MIT). Con il supporto Swing, VisuStruct carica CheerpJ di Leaning Technologies (licenza Community) e javac di OpenJDK."; -"web_about_licenses" = "Testi delle licenze"; -"web_live_run" = "Esegui"; -"web_live_run_title" = "Esegui il programma: output e input compaiono sotto"; -"web_live_run_finished" = "Programma terminato."; -"web_live_run_stopped" = "Fermato."; -"web_console" = "Console"; -"web_console_hide" = "Nascondi console"; -"web_console_resize" = "Ridimensiona la console"; -"web_diagram_tools" = "Strumenti del diagramma"; -"web_files_title" = "File"; -"web_files_show" = "Mostra file"; -"web_files_hide" = "Nascondi file"; -"web_files_resize" = "Ridimensiona file"; -"web_files_new_folder" = "Nuova cartella"; -"web_files_switch" = "Scegli un’altra cartella"; -"web_files_delete" = "Elimina"; -"web_files_in_browser" = "Nella memoria di questo browser"; -"web_files_save_hint_fmt" = "Salvando, il programma va in %@."; -"web_files_empty" = "Ancora niente di salvato. Quando salvi, VisuStruct crea qui una cartella con la data di oggi."; -"web_files_reconnect_hint" = "Dopo il ricaricamento il browser chiede di nuovo se VisuStruct può usare la tua cartella."; -"web_files_reconnect_fmt" = "Apri la cartella «%@»"; -"web_files_connect_hint" = "Scegli una cartella come spazio di lavoro. VisuStruct vi crea una cartella per ogni giorno e salva diagramma e codice."; -"web_files_connect" = "Scegli cartella"; -"web_files_browser_hint" = "Questo browser non può aprire cartelle del dispositivo (per esempio su iPad). I tuoi file restano nella memoria di questo browser."; -"web_files_browser" = "Salva nel browser"; -"web_files_delete_confirm_fmt" = "Eliminare davvero «%@»?"; -"web_files_folder_prompt" = "Nome della nuova cartella:"; -"web_files_default_name" = "Programma"; -"web_files_saved_fmt" = "Salvato: %@"; -"web_files_create" = "Crea"; -"web_learn_ludwig_tip" = "Il consiglio di Ludwig"; -"web_game_title" = "Gioco: Vero o falso?"; -"web_game_intro" = "Ludwig ti mostra dei valori e una condizione. È vera (true) o falsa (false)? Dieci turni, sempre più difficili."; -"web_game_start" = "Inizia il gioco"; -"web_game_round_fmt" = "Turno %@ di %@"; -"web_game_score_fmt" = "Punti: %@"; -"web_game_true" = "vero (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "Giusto!"; -"web_game_wrong" = "Non proprio. Ecco il calcolo:"; -"web_game_next" = "Avanti"; -"web_game_finish" = "Risultato"; -"web_game_done_fmt" = "%@ su %@ giuste."; -"web_game_perfect" = "Tutto giusto – Ludwig è davvero colpito!"; -"web_game_good" = "Ottimo! Riguarda gli errori e riprova."; -"web_game_practice" = "La pratica rende perfetti. Rileggi la tabella di verità e gioca un altro turno."; -"web_game_again" = "Gioca ancora"; -"web_game_wrong_short" = "Peccato, è sbagliato."; -"web_game_practice_short" = "La pratica rende perfetti. Rileggi le spiegazioni e gioca un altro turno."; -"web_game_clicks" = "Clic:"; -"web_game_nobody" = "Nessuno ascolta: non succede nulla."; -"web_game_event_fmt" = "Clic su «%@»: l'ascoltatore lo sente ed esegue il suo codice."; -"web_game_try" = "Ora prova tu i pulsanti della finestra."; -"web_game_time_fmt" = "Ancora %@ s"; -"web_game_defused" = "✂️ Disinnescata! Hai trovato l’errore."; -"web_game_boom_time" = "💥 Bum! Il tempo è scaduto."; -"web_game_boom_wrong" = "💥 Bum! Era la riga sbagliata."; -"web_game_boom_part" = "💥 Bum! La riga è giusta, ma l’errore è in un’altra parte."; -"web_game_boom_wrong_part" = "💥 Bum! L’errore è in un’altra riga."; -"web_game_bomb_parts_hint" = "Tocca esattamente la parte sbagliata."; -"web_game_fix" = "La riga corretta:"; -"web_game_order_hint" = "Tocca i passaggi nell’ordine giusto."; -"web_debug_step" = "Passo singolo"; -"web_debug_step_title" = "Passo singolo: esegui un’istruzione e fermati di nuovo"; -"web_debug_continue" = "Continua fino al prossimo punto di interruzione"; -"web_debug_paused_fmt" = "Fermo prima della riga %d."; -"web_debug_gutter_title" = "Clicca sul numero di riga per mettere o togliere un punto di interruzione"; -"web_swap_to_code" = "Programmazione grande"; -"web_swap_to_editor" = "Diagramma grande"; -"web_editor_resize" = "Modifica la larghezza del diagramma"; -"web_palette_resize" = "Modifica la larghezza degli elementi"; -"web_palette_hide" = "Nascondi elementi"; -"web_palette_show" = "Mostra elementi"; -"web_code_scopes" = "Blocchi di codice colorati"; -"web_code_scopes_hint" = "Classe, metodo, ciclo, selezione in riquadri propri"; -"web_pseudocode" = "Pseudocodice"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Rinomina variabile …"; -"web_rename_title" = "Rinomina variabile"; -"web_rename_old" = "Nome"; -"web_rename_new" = "Nuovo nome"; -"web_rename_hint" = "Cambia ogni punto con esattamente questa scrittura (numero non è Numero), nel codice e nello strutturogramma. Il testo tra \\"…\\" e i commenti restano."; -"web_rename_count_fmt" = "Compare %d volte."; -"web_rename_exists_fmt" = "«%@» esiste già: dopo le due sarebbero una sola variabile."; -"web_rename_invalid" = "Un nome inizia con una lettera e contiene solo lettere, cifre e _."; -"web_rename_keyword_fmt" = "«%@» è una parola chiave di Java."; -"web_rename_apply" = "Rinomina"; -"web_rename_cancel" = "Annulla"; -`;export{e as default}; diff --git a/website/app/assets/ja-BNDo5HzU.js b/website/app/assets/ja-BNDo5HzU.js deleted file mode 100644 index 0ff8b5ac..00000000 --- a/website/app/assets/ja-BNDo5HzU.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Web 版にのみ存在するテキスト。その他はすべてアプリの Localizable.strings から取得されます。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 構造図"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Delete"; -"web_key_shift" = "Shift"; -"web_export" = "エクスポート…"; -"web_export_title" = "画像または PDF として保存、または印刷"; -"web_export_png" = "画像(PNG)"; -"web_export_svg" = "ベクター画像(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct ファイル(.visustruct)"; -"web_export_failed_fmt" = "エクスポートに失敗しました:%@"; -"web_print_hint" = "「エクスポート… → PDF」で図を保存し、そこから印刷してください。"; -"web_delete" = "削除"; -"web_language_title" = "表示言語"; -"web_simulation_start" = "シミュレーション開始"; -"web_simulation_end" = "シミュレーション終了"; -"web_simulation_start_title" = "構造図をステップごとに実行"; -"web_simulation_end_title" = "シミュレーションを終了して編集を続ける"; -"web_palette_hint" = "構造図にドラッグ"; -"web_tabs_label" = "図"; -"web_status_modified" = "変更あり"; -"web_inspector_title" = "プロパティ"; -"web_inspector_resize" = "オブジェクトインスペクターの高さを変更:線を上下にドラッグまたはスワイプ(ダブルクリック:標準)"; -"web_inspector_help_drop" = "パレットの要素をタイルにドラッグ:上 = 前に、下 = 後に、「ø」の上 = 置き換え。既存の要素はマウスで移動できます。"; -"web_inspector_help_inline" = "要素をダブルクリック/ダブルタップすると、図の中で直接テキストを編集できます(Enter で確定、Esc で取消)。case 名も同様です。"; -"web_inspector_help_files" = "ファイルをウインドウにドロップすることもできます。"; -"web_case_name" = "ケース名"; -"web_case_name_placeholder" = "例:1, ok, default"; -"web_copied" = "要素をコピーしました。"; -"web_discard_message_fmt" = "「%@」への変更は失われます。"; -"web_err_unreadable_fmt" = "「%@」は読み込める VisuStruct ファイルではありません(%@)。"; -"web_saved_fmt" = "「%@」を保存しました。"; -"web_saved_txt_fmt" = "「%@」として保存しました。使用するには拡張子 .txt を削除してください。"; -"web_drop_impossible" = "ここにはドロップできません"; -"web_sim_delay" = "ステップごとの待ち時間"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "言語"; -"web_codegen_comments" = "図のテキストをコメントとして出力"; -"web_codegen_empty_else" = "空の else 分岐もコードに出力"; -"web_copied_check" = "コピーしました ✓"; -"web_copy_manual" = "選択済み。Ctrl+C でコピーしてください"; -"web_run_stopped_loop" = "実行を停止しました:無限ループの可能性があります。"; -"web_run_cancelled" = "実行を中止しました。"; -"web_run_error" = "実行中にエラーが発生しました。"; -"web_run_dropped_fmt" = "… 以前の %d 行は非表示"; -"web_sim_call_arguments_fmt" = "呼び出しが %@ の見出しと一致しません。かっこ内の値を確認してください。"; -"web_sim_missing_return_fmt" = "%@ は return で値を返さずに終了しました。"; -"web_sim_file_not_found_fmt" = "%@ という名前のファイルはありません。"; -"web_sim_end_of_file_fmt" = "ファイル %@ にはもう行がありません。"; -"web_sim_null_value_fmt" = "%@ は null です。"; -"web_sim_unknown_variable_case_fmt" = "不明な変数: %1$@。Java は大文字と小文字を区別します。%2$@ のことですか?"; -"web_sim_written_file_fmt" = "%@(保存済み)"; -"web_site_home" = "ホームページ"; -"web_site_imprint" = "運営者情報"; -"web_site_privacy" = "プライバシー"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "プログラミング"; -"web_live_hide" = "プログラミングを隠す"; -"web_scale_canvas" = "文字サイズ: 構造化チャート"; -"web_scale_code" = "文字サイズ: プログラミング"; -"web_live_indent" = "インデント"; -"web_live_indent_title" = "コードをインデント: 1 レベルにつき空白 4 つ(選択した行、なければ全体)"; -"web_live_show" = "プログラミングを表示"; -"web_live_resize" = "コード領域の幅を変更(ダブルクリック:リセット)"; -"web_live_hint" = "コードは図と一緒に育ちます。灰色=プレースホルダー:インスペクタに入力するとここに表示されます。行をクリックすると要素を選択します。"; -"web_live_ph_selector" = "変数"; -"web_live_ph_code" = "ここにコード"; -"web_live_ph_end" = "終了"; -"web_live_language" = "プログラミング言語"; -"web_live_java_class" = "クラスとして"; -"web_live_java_class_hint" = "クラス名 = 図のタイトル"; -"web_live_java_main" = "main メソッド付き"; -"web_settings_display" = "表示"; -"web_live_swing" = "本物の Java(Swing 対応)"; -"web_live_swing_hint" = "ウィンドウ付きの本物の Java(CheerpJ)。初回実行時に一度だけ約 40 MB をダウンロードします。"; -"web_live_swing_windows" = "Java ウィンドウ"; -"web_live_swing_hide" = "Java ウィンドウを閉じる"; -"web_live_swing_loading" = "Java を読み込み中(初回は約 40 MB)…"; -"web_live_swing_compiling" = "コンパイル中…"; -"web_live_swing_running" = "プログラム実行中。"; -"web_live_swing_compile_failed" = "コンパイルエラー。上を見てください。"; -"web_live_swing_failed" = "Java を読み込めませんでした。インターネット接続を確認してください。"; -"web_live_hint_edit" = "ここに Java コードを入力すると、図が一緒にできあがります。図で作業すると、コードも一緒に育ちます。灰色=プレースホルダー、そのまま上書きできます。"; -"web_live_edit_label" = "Java コード"; -"web_parse_line_fmt" = "%d 行目: %@"; -"web_parse_missing" = "ここにまだ足りません: %@"; -"web_parse_extra" = "多すぎます: %@"; -"web_parse_unclosed_string" = "閉じる %@ がありません。"; -"web_parse_else_without_if" = "この「else」に対応する「if」がありません。"; -"web_parse_case_outside_switch" = "「case」と「default」は「switch」の中に書きます。"; -"web_parse_missing_do_while" = "「do { … }」の後に「while (条件);」が必要です。"; -"web_parse_more_methods" = "今はここでメソッドを 1 つだけ使います。ほかのサブプログラムは別のタブに作ってください。"; -"web_parse_missing_import" = "先頭に %@ がありません。この行がないと Java は Scanner を知りません。"; -"web_parse_missing_scanner" = "先に %@ がありません。この行がないと Scanner はありません。"; -"web_parse_unknown_type" = "Java はこのデータ型を知りません。%@ のことですか?"; -"web_quickfix_insert_fmt" = "提案: %@ を挿入"; -"web_quickfix_replace_fmt" = "提案: %2$@ の代わりに %1$@"; -"web_parse_wrong_case" = "Java は大文字と小文字を区別します。正しくは %@ です。"; -"web_editor_title" = "構造図"; -"web_editor_show" = "構造図を表示"; -"web_editor_hide" = "構造図を隠す"; -"web_keywords_title" = "コードのキーワード"; -"web_keywords_hint" = "要素名の代わりに if, while, for"; -"web_palette_compact" = "要素を常にコンパクト表示"; -"web_palette_compact_hint" = "記号の下に小さく名前を表示。オフの場合は列が狭いときのみ"; -"web_about_version_fmt" = "バージョン %@"; -"web_about_software" = "使用しているソフトウェア"; -"web_about_software_text" = "コードエディターは CodeMirror と Lezer(MIT ライセンス)を使用しています。Swing サポートを有効にすると、VisuStruct は Leaning Technologies の CheerpJ(Community ライセンス)と OpenJDK の javac を読み込みます。"; -"web_about_licenses" = "ライセンス文"; -"web_live_run" = "実行"; -"web_live_run_title" = "プログラムを実行:出力と入力は下に表示されます"; -"web_live_run_finished" = "プログラムが終了しました。"; -"web_live_run_stopped" = "停止しました。"; -"web_console" = "コンソール"; -"web_console_hide" = "コンソールを隠す"; -"web_console_resize" = "コンソールの高さを変更"; -"web_diagram_tools" = "図のツール"; -"web_files_title" = "ファイル"; -"web_files_show" = "ファイルを表示"; -"web_files_hide" = "ファイルを隠す"; -"web_files_resize" = "ファイルの幅を変更"; -"web_files_new_folder" = "新しいフォルダ"; -"web_files_switch" = "別のフォルダを選ぶ"; -"web_files_delete" = "削除"; -"web_files_in_browser" = "このブラウザのストレージ"; -"web_files_save_hint_fmt" = "保存すると、プログラムは %@ に入ります。"; -"web_files_empty" = "まだ何も保存されていません。保存すると、VisuStruct がここに今日の日付のフォルダを作ります。"; -"web_files_reconnect_hint" = "再読み込み後、VisuStruct がフォルダを使ってよいか、ブラウザがもう一度たずねます。"; -"web_files_reconnect_fmt" = "フォルダ「%@」を開く"; -"web_files_connect_hint" = "作業フォルダを選んでください。VisuStruct が日付ごとのフォルダを作り、図とコードを保存します。"; -"web_files_connect" = "フォルダを選ぶ"; -"web_files_browser_hint" = "このブラウザは端末のフォルダを開けません(例:iPad)。ファイルはこのブラウザのストレージに残ります。"; -"web_files_browser" = "ブラウザに保存"; -"web_files_delete_confirm_fmt" = "「%@」を削除しますか?"; -"web_files_folder_prompt" = "新しいフォルダの名前:"; -"web_files_default_name" = "プログラム"; -"web_files_saved_fmt" = "保存しました:%@"; -"web_files_create" = "作成"; -"web_learn_ludwig_tip" = "ルートヴィヒのヒント"; -"web_game_title" = "ゲーム:真か偽か?"; -"web_game_intro" = "ルートヴィヒが値と条件を見せます。条件は真(true)?それとも偽(false)?10ラウンド、だんだん難しくなります。"; -"web_game_start" = "ゲームを始める"; -"web_game_round_fmt" = "ラウンド %@ / %@"; -"web_game_score_fmt" = "ポイント:%@"; -"web_game_true" = "真(true)"; -"web_game_false" = "偽(false)"; -"web_game_right" = "正解!"; -"web_game_wrong" = "残念。計算はこうなります:"; -"web_game_next" = "次へ"; -"web_game_finish" = "結果"; -"web_game_done_fmt" = "%@ / %@ 正解。"; -"web_game_perfect" = "全問正解――ルートヴィヒも感心しています!"; -"web_game_good" = "すごい!間違えたところを見直して、もう一度やってみよう。"; -"web_game_practice" = "練習あるのみ。上の真理値表をもう一度読んで、もう一回挑戦しよう。"; -"web_game_again" = "もう一度"; -"web_game_wrong_short" = "残念、不正解です。"; -"web_game_practice_short" = "習うより慣れよ。説明をもう一度読んで、もう一回遊んでみよう。"; -"web_game_clicks" = "クリック:"; -"web_game_nobody" = "だれも聞いていません。何も起こりません。"; -"web_game_event_fmt" = "「%@」をクリック: リスナーが気づいて自分のコードを実行します。"; -"web_game_try" = "ウィンドウのボタンを自分で試してみよう。"; -"web_game_time_fmt" = "残り %@ 秒"; -"web_game_defused" = "✂️ 解除成功!間違いを見つけました。"; -"web_game_boom_time" = "💥 ドカン!時間切れです。"; -"web_game_boom_wrong" = "💥 ドカン!その行ではありません。"; -"web_game_boom_part" = "💥 ドカン!行は合っているけど、間違いは別の部分にあるよ。"; -"web_game_boom_wrong_part" = "💥 ドカン!間違いは別の行にあるよ。"; -"web_game_bomb_parts_hint" = "間違っている部分をぴったりタップしよう。"; -"web_game_fix" = "正しい行:"; -"web_game_order_hint" = "正しい順番でステップをタップしよう。"; -"web_debug_step" = "ステップ実行"; -"web_debug_step_title" = "ステップ実行:命令を1つ実行して再び止まる"; -"web_debug_continue" = "次のブレークポイントまで続行"; -"web_debug_paused_fmt" = "%d 行目の前で一時停止中。"; -"web_debug_gutter_title" = "行番号をクリックするとブレークポイントを設定・解除できます"; -"web_swap_to_code" = "プログラミングを大きく"; -"web_swap_to_editor" = "構造図を大きく"; -"web_editor_resize" = "構造図の幅を変更"; -"web_palette_resize" = "要素の幅を変更"; -"web_palette_hide" = "要素を隠す"; -"web_palette_show" = "要素を表示"; -"web_code_scopes" = "コードブロックを色分け"; -"web_code_scopes_hint" = "クラス、メソッド、ループ、分岐をそれぞれの枠で表示"; -"web_pseudocode" = "疑似コード"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "変数の名前を変更 …"; -"web_rename_title" = "変数の名前を変更"; -"web_rename_old" = "名前"; -"web_rename_new" = "新しい名前"; -"web_rename_hint" = "つづりが完全に同じ箇所をすべて、コードと構造図で変更します(number と Number は別です)。\\"…\\" 内の文字列とコメントは変わりません。"; -"web_rename_count_fmt" = "%d 回使われています。"; -"web_rename_exists_fmt" = "「%@」はすでにあります:変更すると 2 つの変数が 1 つになります。"; -"web_rename_invalid" = "名前は文字で始まり、文字・数字・_ だけを含みます。"; -"web_rename_keyword_fmt" = "「%@」は Java のキーワードです。"; -"web_rename_apply" = "名前を変更"; -"web_rename_cancel" = "キャンセル"; -`;export{e as default}; diff --git a/website/app/assets/katherine-johnson-k17EjVTs.jpg b/website/app/assets/katherine-johnson-k17EjVTs.jpg deleted file mode 100644 index c2df60c5ef351c1f770fa455c5a1c39734441df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41104 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 diff --git a/website/app/assets/kino-saal-BOvcmdzb.svg b/website/app/assets/kino-saal-BOvcmdzb.svg deleted file mode 100644 index 65dc50de..00000000 --- a/website/app/assets/kino-saal-BOvcmdzb.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Ecrã -Lugar (segundo índice) -0 -1 -2 -3 -4 -Fila(primeiroíndice) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Tracejado: lugares[1][2], fila 1, lugar 2 -vendido = truelivre = false - diff --git a/website/app/assets/kino-saal-C8zaJk4X.svg b/website/app/assets/kino-saal-C8zaJk4X.svg deleted file mode 100644 index 4e49fc22..00000000 --- a/website/app/assets/kino-saal-C8zaJk4X.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Screen -Seat (second index) -0 -1 -2 -3 -4 -Row(firstindex) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Dashed: seats[1][2], row 1, seat 2 -sold = truefree = false - diff --git a/website/app/assets/kino-saal-CYMOok4_.svg b/website/app/assets/kino-saal-CYMOok4_.svg deleted file mode 100644 index 18c5a30a..00000000 --- a/website/app/assets/kino-saal-CYMOok4_.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Leinwand -Platz (zweiter Index) -0 -1 -2 -3 -4 -Reihe(ersterIndex) -0 -false -false -true -false -false -1 -false -true -true -false -false -2 -false -false -false -false -false -Gestrichelt: sitze[1][2], Reihe 1, Platz 2 -verkauft = truefrei = false - diff --git a/website/app/assets/kino-schleifen-Ci9yPnbo.svg b/website/app/assets/kino-schleifen-Ci9yPnbo.svg deleted file mode 100644 index c9788f21..00000000 --- a/website/app/assets/kino-schleifen-Ci9yPnbo.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -ciclo exterior: fila = 0, 1, 2 -ciclo interior: lugar = 0 … 4 -lugares[fila][lugar]ver -lugar -0 -1 -2 -3 -4 -fila0 - -1 - -2 - -3 - -4 - -5 - -fila1 - -6 - -7 - -8 - -9 - -10 - -fila2 - -11 - -12 - -13 - -14 - -15 -Lá dentro, lugar percorre tudo; só depois fila avança um. - diff --git a/website/app/assets/kino-schleifen-D7sfo9iK.svg b/website/app/assets/kino-schleifen-D7sfo9iK.svg deleted file mode 100644 index 2698fc0a..00000000 --- a/website/app/assets/kino-schleifen-D7sfo9iK.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -outer loop: row = 0, 1, 2 -inner loop: seat = 0 … 4 -seats[row][seat]look at -seat -0 -1 -2 -3 -4 -row0 - -1 - -2 - -3 - -4 - -5 - -row1 - -6 - -7 - -8 - -9 - -10 - -row2 - -11 - -12 - -13 - -14 - -15 -Inside, seat runs through, only then row moves on by one. - diff --git a/website/app/assets/kino-schleifen-DrTQV7dq.svg b/website/app/assets/kino-schleifen-DrTQV7dq.svg deleted file mode 100644 index 486b7ca5..00000000 --- a/website/app/assets/kino-schleifen-DrTQV7dq.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - -äußere Schleife: reihe = 0, 1, 2 -innere Schleife: platz = 0 … 4 -sitze[reihe][platz]ansehen -platz -0 -1 -2 -3 -4 -reihe0 - -1 - -2 - -3 - -4 - -5 - -reihe1 - -6 - -7 - -8 - -9 - -10 - -reihe2 - -11 - -12 - -13 - -14 - -15 -Innen läuft platz durch, erst dann geht reihe eins weiter. - diff --git a/website/app/assets/ko-D37jf4Vi.js b/website/app/assets/ko-D37jf4Vi.js deleted file mode 100644 index 203c1bf1..00000000 --- a/website/app/assets/ko-D37jf4Vi.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* 웹 버전에만 있는 텍스트입니다. 나머지는 모두 앱의 Localizable.strings에서 가져옵니다. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 구조도"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "내보내기…"; -"web_export_title" = "이미지 또는 PDF로 저장하거나 인쇄"; -"web_export_png" = "이미지(PNG)"; -"web_export_svg" = "벡터 그래픽(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 파일(.visustruct)"; -"web_export_failed_fmt" = "내보내기 실패: %@"; -"web_print_hint" = "“내보내기… → PDF”로 다이어그램을 저장한 뒤 인쇄하세요."; -"web_delete" = "삭제"; -"web_language_title" = "인터페이스 언어"; -"web_simulation_start" = "시뮬레이션 시작"; -"web_simulation_end" = "시뮬레이션 종료"; -"web_simulation_start_title" = "구조도를 단계별로 실행"; -"web_simulation_end_title" = "시뮬레이션을 끝내고 계속 편집"; -"web_palette_hint" = "구조도로 드래그하세요"; -"web_tabs_label" = "다이어그램"; -"web_status_modified" = "수정됨"; -"web_inspector_title" = "속성"; -"web_inspector_resize" = "객체 검사기 높이 변경: 선을 위아래로 드래그하거나 스와이프 (더블 클릭: 기본값)"; -"web_inspector_help_drop" = "팔레트의 요소를 타일로 드래그하세요: 위쪽 = 앞에, 아래쪽 = 뒤에, “ø” 위 = 바꾸기. 기존 요소는 마우스로 옮길 수 있습니다."; -"web_inspector_help_inline" = "요소를 두 번 클릭하거나 두 번 탭하면 다이어그램에서 바로 텍스트를 편집할 수 있습니다(Enter 적용, Esc 취소). case 이름도 마찬가지입니다."; -"web_inspector_help_files" = "파일을 창에 끌어다 놓을 수도 있습니다."; -"web_case_name" = "케이스 이름"; -"web_case_name_placeholder" = "예: 1, ok, default"; -"web_copied" = "요소를 복사했습니다."; -"web_discard_message_fmt" = "“%@”의 변경 사항이 사라집니다."; -"web_err_unreadable_fmt" = "“%@”은(는) 읽을 수 있는 VisuStruct 파일이 아닙니다(%@)."; -"web_saved_fmt" = "“%@” 저장됨."; -"web_saved_txt_fmt" = "“%@”(으)로 저장했습니다. 사용하려면 .txt 확장자를 제거하세요."; -"web_drop_impossible" = "여기에 놓을 수 없음"; -"web_sim_delay" = "단계별 대기 시간"; -"web_sim_delay_value_fmt" = "%@초"; -"web_codegen_language" = "언어"; -"web_codegen_comments" = "다이어그램 텍스트를 주석으로"; -"web_codegen_empty_else" = "빈 else 분기도 코드에 출력"; -"web_copied_check" = "복사됨 ✓"; -"web_copy_manual" = "선택됨, Ctrl+C로 복사하세요"; -"web_run_stopped_loop" = "실행 중지: 무한 반복일 수 있습니다."; -"web_run_cancelled" = "실행이 취소되었습니다."; -"web_run_error" = "실행 중 오류가 발생했습니다."; -"web_run_dropped_fmt" = "… 이전 %d줄 숨김"; -"web_sim_call_arguments_fmt" = "호출이 %@의 머리글과 맞지 않습니다. 괄호 안의 값을 확인하세요."; -"web_sim_missing_return_fmt" = "%@이(가) return으로 값을 반환하지 않고 끝났습니다."; -"web_sim_file_not_found_fmt" = "%@(이)라는 파일이 없습니다."; -"web_sim_end_of_file_fmt" = "파일 %@에 더 이상 줄이 없습니다."; -"web_sim_null_value_fmt" = "%@은(는) null입니다."; -"web_sim_unknown_variable_case_fmt" = "알 수 없는 변수: %1$@. Java는 대문자와 소문자를 구분합니다. %2$@을(를) 뜻했나요?"; -"web_sim_written_file_fmt" = "%@ (저장됨)"; -"web_site_home" = "홈페이지"; -"web_site_imprint" = "사이트 정보"; -"web_site_privacy" = "개인정보"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "프로그래밍"; -"web_live_hide" = "프로그래밍 숨기기"; -"web_scale_canvas" = "글자 크기: 구조도"; -"web_scale_code" = "글자 크기: 프로그래밍"; -"web_live_indent" = "들여쓰기"; -"web_live_indent_title" = "코드 들여쓰기: 단계마다 공백 4칸 (선택한 줄, 없으면 전체)"; -"web_live_show" = "프로그래밍 표시"; -"web_live_resize" = "코드 영역 너비 변경(더블클릭: 초기화)"; -"web_live_hint" = "코드는 다이어그램과 함께 자랍니다. 회색 = 자리 표시자: 속성 창에 입력하면 여기에 표시됩니다. 줄을 클릭하면 해당 요소가 선택됩니다."; -"web_live_ph_selector" = "변수"; -"web_live_ph_code" = "코드 작성"; -"web_live_ph_end" = "끝"; -"web_live_language" = "프로그래밍 언어"; -"web_live_java_class" = "클래스로"; -"web_live_java_class_hint" = "클래스 이름 = 순서도 제목"; -"web_live_java_main" = "main 메서드 포함"; -"web_settings_display" = "표시"; -"web_live_swing" = "실제 Java (Swing 포함)"; -"web_live_swing_hint" = "창이 있는 진짜 Java(CheerpJ). 처음 실행할 때 한 번 약 40MB를 내려받습니다."; -"web_live_swing_windows" = "Java 창"; -"web_live_swing_hide" = "Java 창 닫기"; -"web_live_swing_loading" = "Java 불러오는 중(처음에는 약 40MB) …"; -"web_live_swing_compiling" = "컴파일 중 …"; -"web_live_swing_running" = "프로그램 실행 중."; -"web_live_swing_compile_failed" = "컴파일 오류, 위를 보세요."; -"web_live_swing_failed" = "Java를 불러올 수 없습니다. 인터넷 연결을 확인하세요."; -"web_live_hint_edit" = "여기에 Java 코드를 입력하면 순서도가 함께 만들어집니다. 또는 순서도에서 작업하면 코드가 함께 자랍니다. 회색 = 자리표시자, 그대로 덮어쓰면 됩니다."; -"web_live_edit_label" = "Java 코드"; -"web_parse_line_fmt" = "%d행: %@"; -"web_parse_missing" = "여기에 아직 없음: %@"; -"web_parse_extra" = "하나 더 많음: %@"; -"web_parse_unclosed_string" = "닫는 %@가 없습니다."; -"web_parse_else_without_if" = "이 “else”에 맞는 “if”가 없습니다."; -"web_parse_case_outside_switch" = "“case”와 “default”는 “switch” 안에 있어야 합니다."; -"web_parse_missing_do_while" = "“do { … }” 다음에 “while (조건);”이 필요합니다."; -"web_parse_more_methods" = "지금은 메서드 하나만 사용됩니다. 다른 서브프로그램은 별도 탭으로 만드세요."; -"web_parse_missing_import" = "맨 위에 %@ 이(가) 없습니다. 이 줄이 없으면 Java는 Scanner를 모릅니다."; -"web_parse_missing_scanner" = "먼저 %@ 이(가) 없습니다. 이 줄이 없으면 Scanner가 없습니다."; -"web_parse_unknown_type" = "Java는 이 데이터 형식을 알지 못합니다. %@을(를) 의미했나요?"; -"web_quickfix_insert_fmt" = "제안: %@ 삽입"; -"web_quickfix_replace_fmt" = "제안: %2$@ 대신 %1$@"; -"web_parse_wrong_case" = "Java는 대문자와 소문자를 구분합니다. 올바른 표기는 %@입니다."; -"web_editor_title" = "구조도"; -"web_editor_show" = "구조도 표시"; -"web_editor_hide" = "구조도 숨기기"; -"web_keywords_title" = "코드 키워드"; -"web_keywords_hint" = "요소 이름 대신 if, while, for"; -"web_palette_compact" = "요소 항상 간단히 보기"; -"web_palette_compact_hint" = "기호 아래에 작은 이름 표시, 아니면 열이 좁을 때만"; -"web_about_version_fmt" = "버전 %@"; -"web_about_software" = "사용된 소프트웨어"; -"web_about_software_text" = "코드 편집기는 CodeMirror와 Lezer(MIT 라이선스)를 사용합니다. Swing 지원을 켜면 VisuStruct는 Leaning Technologies의 CheerpJ(Community 라이선스)와 OpenJDK의 javac를 불러옵니다."; -"web_about_licenses" = "라이선스 전문"; -"web_live_run" = "실행"; -"web_live_run_title" = "프로그램 실행: 출력과 입력이 아래에 표시됩니다"; -"web_live_run_finished" = "프로그램이 끝났습니다."; -"web_live_run_stopped" = "중지됨."; -"web_console" = "콘솔"; -"web_console_hide" = "콘솔 숨기기"; -"web_console_resize" = "콘솔 크기 조절"; -"web_diagram_tools" = "다이어그램 도구"; -"web_files_title" = "파일"; -"web_files_show" = "파일 보기"; -"web_files_hide" = "파일 숨기기"; -"web_files_resize" = "파일 너비 조절"; -"web_files_new_folder" = "새 폴더"; -"web_files_switch" = "다른 폴더 선택"; -"web_files_delete" = "삭제"; -"web_files_in_browser" = "이 브라우저 저장소"; -"web_files_save_hint_fmt" = "저장하면 프로그램이 %@에 들어갑니다."; -"web_files_empty" = "아직 저장된 것이 없습니다. 저장하면 VisuStruct가 여기에 오늘 날짜 폴더를 만듭니다."; -"web_files_reconnect_hint" = "새로 고침 후 브라우저가 VisuStruct의 폴더 사용 여부를 다시 묻습니다."; -"web_files_reconnect_fmt" = "“%@” 폴더 열기"; -"web_files_connect_hint" = "작업 공간으로 쓸 폴더를 선택하세요. VisuStruct가 날짜별 폴더를 만들고 다이어그램과 코드를 저장합니다."; -"web_files_connect" = "폴더 선택"; -"web_files_browser_hint" = "이 브라우저는 기기의 폴더를 열 수 없습니다 (예: iPad). 파일은 이 브라우저 저장소에 남습니다."; -"web_files_browser" = "브라우저에 저장"; -"web_files_delete_confirm_fmt" = "“%@”을(를) 삭제할까요?"; -"web_files_folder_prompt" = "새 폴더 이름:"; -"web_files_default_name" = "프로그램"; -"web_files_saved_fmt" = "저장됨: %@"; -"web_files_create" = "만들기"; -"web_learn_ludwig_tip" = "루트비히의 팁"; -"web_game_title" = "게임: 참일까 거짓일까?"; -"web_game_intro" = "루트비히가 값과 조건을 보여 줍니다. 조건이 참(true)일까요, 거짓(false)일까요? 10라운드, 점점 어려워집니다."; -"web_game_start" = "게임 시작"; -"web_game_round_fmt" = "라운드 %@ / %@"; -"web_game_score_fmt" = "점수: %@"; -"web_game_true" = "참 (true)"; -"web_game_false" = "거짓 (false)"; -"web_game_right" = "정답!"; -"web_game_wrong" = "아쉽네요. 이렇게 계산합니다:"; -"web_game_next" = "다음"; -"web_game_finish" = "결과"; -"web_game_done_fmt" = "%@ / %@ 정답."; -"web_game_perfect" = "모두 정답 – 루트비히가 감탄했어요!"; -"web_game_good" = "훌륭해요! 틀린 것을 다시 보고 한 번 더 해 보세요."; -"web_game_practice" = "연습이 실력을 만듭니다. 위의 진리표를 다시 읽고 한 번 더 해 보세요."; -"web_game_again" = "다시 하기"; -"web_game_wrong_short" = "아쉽지만 틀렸어요."; -"web_game_practice_short" = "연습이 완벽을 만듭니다. 설명을 다시 읽고 한 판 더 해 보세요."; -"web_game_clicks" = "클릭:"; -"web_game_nobody" = "아무도 듣지 않아요. 아무 일도 일어나지 않습니다."; -"web_game_event_fmt" = "„%@” 클릭: 리스너가 듣고 자기 코드를 실행합니다."; -"web_game_try" = "이제 창의 버튼을 직접 눌러 보세요."; -"web_game_time_fmt" = "%@초 남음"; -"web_game_defused" = "✂️ 해체 성공! 오류를 찾았어요."; -"web_game_boom_time" = "💥 펑! 시간이 다 됐어요."; -"web_game_boom_wrong" = "💥 펑! 틀린 줄이었어요."; -"web_game_boom_part" = "💥 펑! 줄은 맞지만, 오류는 다른 부분에 있어요."; -"web_game_boom_wrong_part" = "💥 펑! 오류는 다른 줄에 있어요."; -"web_game_bomb_parts_hint" = "틀린 부분을 정확히 눌러 보세요."; -"web_game_fix" = "올바른 줄:"; -"web_game_order_hint" = "올바른 순서대로 단계를 눌러 보세요."; -"web_debug_step" = "한 단계"; -"web_debug_step_title" = "한 단계: 문장 하나를 실행하고 다시 멈춥니다"; -"web_debug_continue" = "다음 중단점까지 계속"; -"web_debug_paused_fmt" = "%d번째 줄 앞에서 멈춤."; -"web_debug_gutter_title" = "줄 번호를 클릭하면 중단점을 설정하거나 지웁니다"; -"web_swap_to_code" = "프로그래밍 크게"; -"web_swap_to_editor" = "구조도 크게"; -"web_editor_resize" = "구조도 너비 변경"; -"web_palette_resize" = "요소 너비 변경"; -"web_palette_hide" = "요소 숨기기"; -"web_palette_show" = "요소 표시"; -"web_code_scopes" = "코드 블록 색상 표시"; -"web_code_scopes_hint" = "클래스, 메서드, 반복, 분기를 각각의 상자로 표시"; -"web_pseudocode" = "의사 코드"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "변수 이름 바꾸기 …"; -"web_rename_title" = "변수 이름 바꾸기"; -"web_rename_old" = "이름"; -"web_rename_new" = "새 이름"; -"web_rename_hint" = "철자가 정확히 같은 모든 곳을 코드와 구조도에서 바꿉니다(number와 Number는 다릅니다). \\"…\\" 안의 텍스트와 주석은 그대로입니다."; -"web_rename_count_fmt" = "%d번 사용됨."; -"web_rename_exists_fmt" = "“%@”이(가) 이미 있습니다: 바꾸면 두 변수가 하나가 됩니다."; -"web_rename_invalid" = "이름은 문자로 시작하고 문자, 숫자, _만 포함합니다."; -"web_rename_keyword_fmt" = "“%@”은(는) Java 키워드입니다."; -"web_rename_apply" = "이름 바꾸기"; -"web_rename_cancel" = "취소"; -`;export{e as default}; diff --git a/website/app/assets/l03-lochkarte-BB3rWQOm.svg b/website/app/assets/l03-lochkarte-BB3rWQOm.svg deleted file mode 100644 index 8eea3c50..00000000 --- a/website/app/assets/l03-lochkarte-BB3rWQOm.svg +++ /dev/null @@ -1,998 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/website/app/assets/l03-lochkarte-BSn6oWaS.svg b/website/app/assets/l03-lochkarte-BSn6oWaS.svg deleted file mode 100644 index 1b08640f..00000000 --- a/website/app/assets/l03-lochkarte-BSn6oWaS.svg +++ /dev/null @@ -1,994 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -M - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -U - -1 -2 -3 - -5 -6 -7 -8 -9 -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/website/app/assets/l03-lochkarte-beschriftet-7hmU_7ct.svg b/website/app/assets/l03-lochkarte-beschriftet-7hmU_7ct.svg deleted file mode 100644 index ac9ff74d..00000000 --- a/website/app/assets/l03-lochkarte-beschriftet-7hmU_7ct.svg +++ /dev/null @@ -1,1016 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Ecke abgeschnitten: -so liegen alle Karten richtig herum - -Aufdruck zum Mitlesen - - - - -Zeilen 12 und 11: Extralöcher für Buchstaben -1 Spalte = 1 Zeichen -hier P: Löcher in 11 und 7 - -gestanztes Loch - - -80 Spalten = höchstens 80 Zeichen pro Zeile - diff --git a/website/app/assets/l03-lochkarte-beschriftet-BjBFZjzb.svg b/website/app/assets/l03-lochkarte-beschriftet-BjBFZjzb.svg deleted file mode 100644 index b5080535..00000000 --- a/website/app/assets/l03-lochkarte-beschriftet-BjBFZjzb.svg +++ /dev/null @@ -1,1019 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Cut corner: -so all cards lie the right way round - -Printed text to read along - - - - -Rows 12 and 11: extra holes for letters -1 column = 1 character -here P: holes in 11 and 7 - -punched hole - - -80 columns = at most 80 characters per line - diff --git a/website/app/assets/l03-lochkarte-beschriftet-D1QjqGFo.svg b/website/app/assets/l03-lochkarte-beschriftet-D1QjqGFo.svg deleted file mode 100644 index 89cefb22..00000000 --- a/website/app/assets/l03-lochkarte-beschriftet-D1QjqGFo.svg +++ /dev/null @@ -1,1015 +0,0 @@ - - - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -M - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -U - -1 -2 -3 - -5 -6 -7 -8 -9 -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -D - -0 -1 -2 -3 - -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - - - -Canto cortado: -assim todos os cartões ficam na posição certa - -Texto impresso para ler - - - - -Linhas 12 e 11: furos extra para letras -1 coluna = 1 carácter -aqui P: furos em 11 e 7 - -furo perfurado - - -80 colunas = no máximo 80 caracteres por linha - diff --git a/website/app/assets/l03-lochkarte-gzfFEatc.svg b/website/app/assets/l03-lochkarte-gzfFEatc.svg deleted file mode 100644 index a5cbccfb..00000000 --- a/website/app/assets/l03-lochkarte-gzfFEatc.svg +++ /dev/null @@ -1,995 +0,0 @@ - - - - -1 -1 -2 -2 -3 -3 -4 -4 -5 -5 -6 -6 -7 -7 -8 -8 -9 -9 -10 -10 -11 -11 -12 -12 -13 -13 -14 -14 -15 -15 -16 -16 -17 -17 -18 -18 -19 -19 -20 -20 -21 -21 -22 -22 -23 -23 -24 -24 -25 -25 -26 -26 -27 -27 -28 -28 -29 -29 -30 -30 -31 -31 -32 -32 -33 -33 -34 -34 -35 -35 -36 -36 -37 -37 -38 -38 -39 -39 -40 -40 -41 -41 -42 -42 -43 -43 -44 -44 -45 -45 -46 -46 -47 -47 -48 -48 -49 -49 -50 -50 -51 -51 -52 -52 -53 -53 -54 -54 -55 -55 -56 -56 -57 -57 -58 -58 -59 -59 -60 -60 -61 -61 -62 -62 -63 -63 -64 -64 -65 -65 -66 -66 -67 -67 -68 -68 -69 -69 -70 -70 -71 -71 -72 -72 -73 -73 -74 -74 -75 -75 -76 -76 -77 -77 -78 -78 -79 -79 -80 -80 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -P - -0 -1 -2 -3 -4 -5 -6 - -8 -9 -R - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -I - -0 -1 -2 -3 -4 -5 -6 -7 -8 - -N - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -* - -0 -1 -2 -3 - -5 -6 -7 - -9 -, - -1 -2 - -4 -5 -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -H - -0 -1 -2 -3 -4 -5 -6 -7 - -9 -A - -0 - -2 -3 -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -O - -0 -1 -2 -3 -4 -5 - -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -W - -1 -2 -3 -4 -5 - -7 -8 -9 -E - -0 -1 -2 -3 -4 - -6 -7 -8 -9 -L - -0 -1 -2 - -4 -5 -6 -7 -8 -9 -T - -1 -2 - -4 -5 -6 -7 -8 -9 -' -0 -1 -2 -3 -4 - -6 -7 - -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 - diff --git a/website/app/assets/l03-zuse-lochstreifen-B87kqGex.svg b/website/app/assets/l03-zuse-lochstreifen-B87kqGex.svg deleted file mode 100644 index d379feb7..00000000 --- a/website/app/assets/l03-zuse-lochstreifen-B87kqGex.svg +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 -0 -1 -1 -0 -0 -1 -0 - - - -= 1 - -= 0 - diff --git a/website/app/assets/l12-while-zu-for-CM2--y57.svg b/website/app/assets/l12-while-zu-for-CM2--y57.svg deleted file mode 100644 index ffba5bc5..00000000 --- a/website/app/assets/l12-while-zu-for-CM2--y57.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Início - Condição - Passo - InícioCondiçãoPasso - diff --git a/website/app/assets/l12-while-zu-for-Cu-8sS5S.svg b/website/app/assets/l12-while-zu-for-Cu-8sS5S.svg deleted file mode 100644 index 8aa5bd82..00000000 --- a/website/app/assets/l12-while-zu-for-Cu-8sS5S.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Start - Bedingung - Schritt - StartBedingungSchritt - diff --git a/website/app/assets/l12-while-zu-for-DddKE_8R.svg b/website/app/assets/l12-while-zu-for-DddKE_8R.svg deleted file mode 100644 index 6b2f4ede..00000000 --- a/website/app/assets/l12-while-zu-for-DddKE_8R.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - while - for - ; - ; - int i = 1 - i <= 5 - i++ - output: i - Init - Condition - Step - InitConditionStep - diff --git a/website/app/assets/l13-verschachtelt-tabelle-CR2WySqU.svg b/website/app/assets/l13-verschachtelt-tabelle-CR2WySqU.svg deleted file mode 100644 index 070abbc1..00000000 --- a/website/app/assets/l13-verschachtelt-tabelle-CR2WySqU.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String texto = "" - for int j = 1; j <= 4; j++ - texto = texto + i * j + " " - output: texto - - VARIÁVEISCONSOLA - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - texto = - "" - texto = - "1 " - texto = - "1 2 " - texto = - "1 2 3 " - texto = - "1 2 3 4 " - texto = - "2 " - texto = - "2 4 " - texto = - "2 4 6 " - texto = - "2 4 6 8 " - texto = - "3 " - texto = - "3 6 " - texto = - "3 6 9 " - texto = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/website/app/assets/l13-verschachtelt-tabelle-CmsFvxQ5.svg b/website/app/assets/l13-verschachtelt-tabelle-CmsFvxQ5.svg deleted file mode 100644 index dd830d43..00000000 --- a/website/app/assets/l13-verschachtelt-tabelle-CmsFvxQ5.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String text = "" - for int j = 1; j <= 4; j++ - text = text + i * j + " " - output: text - - VARIABLENKONSOLE - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - text = - "" - text = - "1 " - text = - "1 2 " - text = - "1 2 3 " - text = - "1 2 3 4 " - text = - "2 " - text = - "2 4 " - text = - "2 4 6 " - text = - "2 4 6 8 " - text = - "3 " - text = - "3 6 " - text = - "3 6 9 " - text = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/website/app/assets/l13-verschachtelt-tabelle-jipYA7Ld.svg b/website/app/assets/l13-verschachtelt-tabelle-jipYA7Ld.svg deleted file mode 100644 index 6065b866..00000000 --- a/website/app/assets/l13-verschachtelt-tabelle-jipYA7Ld.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - for int i = 1; i <= 3; i++ - String text = "" - for int j = 1; j <= 4; j++ - text = text + i * j + " " - output: text - - VARIABLESCONSOLE - i = 1 - i = 2 - i = 3 - i = 4 - j = 1 - j = 2 - j = 3 - j = 4 - j = 5 - text = - "" - text = - "1 " - text = - "1 2 " - text = - "1 2 3 " - text = - "1 2 3 4 " - text = - "2 " - text = - "2 4 " - text = - "2 4 6 " - text = - "2 4 6 8 " - text = - "3 " - text = - "3 6 " - text = - "3 6 9 " - text = - "3 6 9 12 " - 1 2 3 4 - 2 4 6 8 - 3 6 9 12 - diff --git a/website/app/assets/ludwig-Cus1i402.webp b/website/app/assets/ludwig-Cus1i402.webp deleted file mode 100644 index 28cfd94a8ff5b61dd4bb30984d3e0ba6887d31f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14066 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 diff --git a/website/app/assets/margaret-hamilton-pYPKs1sU.jpg b/website/app/assets/margaret-hamilton-pYPKs1sU.jpg deleted file mode 100644 index 9a5ae22de88d9c85636758b399257539db7be976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41701 zcmbUIcT`hP)ISOz2u-Sh^b)0rQl*2GfJm1n(vgUC=^z+tC<+Ln3n*O$5h)SrNR=*9 zr1z3gq$kt>A>4eQ`+J}FpZmvMcjv5}SvfPa&Ys!X?X%}<`f3@tuBWA|1(1*cfDZ8k zT&(~RnlLwK05C8BgaH7c0?0@>0diuC*ac7};ridU7Rem|^gq9o0zj-AK=yz77!vRQ z5plNv8S{VNL4_p$r#Eq)Lel?VZxYc$(Eqkm{u_4H4lq)Yq>zY$NcaF!MiLMs$yFBs zCeB4p@;~%nr~inA6huZ&K}mIunuge+_BudH0s@hefyl|ph_6BtMtlyCF_JUgl2oT) zHnFGV^SvPznfj56|3Os;%j3To0qN&{QP-$h+1NQa1#b)8xhpIqD<`j@cwgh8rk1vj zuAb==Gjj_|D{BWwCubK|w-^2|0|H;cf`X%8zln*BdmEpY{w^ak>-~r9PoIm5zm$9} z{r01}rnauWp|R;#XIFPmZ(slK(XsJ~$*Jj?*%cIeb!~m)-{uzf;PB}9

    *y{vTh& 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 - - - - - - - - View - the display - - Controller - the listener - - Model - Counter - - 0 - 1 - 2 - 3 - - +1 - - value = 0 - value = 1 - value = 2 - value = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 increase() - 2 increase() - - - 3 getValue() - 3 getValue() - - - 4 update(value) - 4 update(value) - - The model knows neither the view nor the controller. - diff --git a/website/app/assets/mvc-klick-DKonBpbs.svg b/website/app/assets/mvc-klick-DKonBpbs.svg deleted file mode 100644 index 08d276a8..00000000 --- a/website/app/assets/mvc-klick-DKonBpbs.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - View - o visor - - Controller - o ouvinte - - Model - Contador - - 0 - 1 - 2 - 3 - - +1 - - valor = 0 - valor = 1 - valor = 2 - valor = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 aumentar() - 2 aumentar() - - - 3 getValor() - 3 getValor() - - - 4 atualizar(valor) - 4 atualizar(valor) - - O model não conhece nem a view nem o controller. - diff --git a/website/app/assets/mvc-klick-KmFKqxH-.svg b/website/app/assets/mvc-klick-KmFKqxH-.svg deleted file mode 100644 index 47aa440e..00000000 --- a/website/app/assets/mvc-klick-KmFKqxH-.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - View - die Anzeige - - Controller - der Zuhörer - - Model - Zaehler - - 0 - 1 - 2 - 3 - - +1 - - wert = 0 - wert = 1 - wert = 2 - wert = 3 - - 1 actionPerformed(e) - 1 actionPerformed(e) - - - 2 erhoehen() - 2 erhoehen() - - - 3 getWert() - 3 getWert() - - - 4 aktualisieren(wert) - 4 aktualisieren(wert) - - Das Model kennt weder die View noch den Controller. - diff --git a/website/app/assets/nb-CsT7SL7q.js b/website/app/assets/nb-CsT7SL7q.js deleted file mode 100644 index e1ac702f..00000000 --- a/website/app/assets/nb-CsT7SL7q.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Tekster som bare finnes i nettversjonen. Alt annet kommer fra appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksporter…"; -"web_export_title" = "Lagre som bilde eller PDF, eller skriv ut"; -"web_export_png" = "Bilde (PNG)"; -"web_export_svg" = "Vektorgrafikk (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Eksporten mislyktes: %@"; -"web_print_hint" = "Bruk «Eksporter… → PDF» for å lagre diagrammet og skrive det ut derfra."; -"web_delete" = "Slett"; -"web_language_title" = "Språk i grensesnittet"; -"web_simulation_start" = "Start simulering"; -"web_simulation_end" = "Avslutt simulering"; -"web_simulation_start_title" = "Kjør struktogrammet trinn for trinn"; -"web_simulation_end_title" = "Avslutt simuleringen og fortsett redigeringen"; -"web_palette_hint" = "Dra inn i struktogrammet"; -"web_tabs_label" = "Diagrammer"; -"web_status_modified" = "endret"; -"web_inspector_title" = "Egenskaper"; -"web_inspector_resize" = "Endre høyden på objektinspektøren: dra eller sveip linjen opp eller ned (dobbeltklikk: standard)"; -"web_inspector_help_drop" = "Dra elementer fra paletten til en rute: øverst = før, nederst = etter, på «ø» = erstatt. Eksisterende elementer kan flyttes med musen."; -"web_inspector_help_inline" = "Dobbeltklikk eller dobbelttrykk på et element for å redigere teksten direkte i diagrammet (Enter bruker, Esc avbryter). Det gjelder også case-navn."; -"web_inspector_help_files" = "Du kan også slippe filer i vinduet."; -"web_case_name" = "Navn på case"; -"web_case_name_placeholder" = "f.eks. 1, ok, default"; -"web_copied" = "Element kopiert."; -"web_discard_message_fmt" = "Endringene i «%@» går tapt."; -"web_err_unreadable_fmt" = "«%@» er ikke en lesbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "«%@» lagret."; -"web_saved_txt_fmt" = "Lagret som «%@». Fjern filendelsen .txt for å bruke den."; -"web_drop_impossible" = "Kan ikke slippes her"; -"web_sim_delay" = "Pause per trinn"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Språk"; -"web_codegen_comments" = "Diagramtekst som kommentarer"; -"web_codegen_empty_else" = "Skriv ut tom else-gren i koden"; -"web_copied_check" = "Kopiert ✓"; -"web_copy_manual" = "Markert, trykk Ctrl+C for å kopiere"; -"web_run_stopped_loop" = "Kjøringen stoppet: mulig uendelig løkke."; -"web_run_cancelled" = "Kjøringen avbrutt."; -"web_run_error" = "Feil under kjøring."; -"web_run_dropped_fmt" = "… %d tidligere linjer skjult"; -"web_sim_call_arguments_fmt" = "Kallet passer ikke til hodet i %@. Sjekk verdiene i parentesene."; -"web_sim_missing_return_fmt" = "%@ ble avsluttet uten å returnere en verdi med return."; -"web_sim_file_not_found_fmt" = "Det finnes ingen fil som heter %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har ikke flere linjer."; -"web_sim_null_value_fmt" = "%@ er null."; -"web_sim_unknown_variable_case_fmt" = "Ukjent variabel: %1$@. Java skiller mellom store og små bokstaver: mente du %2$@?"; -"web_sim_written_file_fmt" = "%@ (lagret)"; -"web_site_home" = "Forside"; -"web_site_imprint" = "Kolofon"; -"web_site_privacy" = "Personvern"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Skjul programmering"; -"web_scale_canvas" = "Tekststørrelse: strukturdiagram"; -"web_scale_code" = "Tekststørrelse: programmering"; -"web_live_indent" = "Rykk inn"; -"web_live_indent_title" = "Rykk inn koden: fire mellomrom per nivå (merkede linjer, ellers alt)"; -"web_live_show" = "Vis programmering"; -"web_live_resize" = "Endre bredden på kodeområdet (dobbeltklikk: tilbakestill)"; -"web_live_hint" = "Koden vokser med diagrammet ditt. Grått = plassholder: skriv i inspektøren, så vises teksten her. Klikk på en linje for å velge elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kode"; -"web_live_ph_end" = "slutt"; -"web_live_language" = "Programmeringsspråk"; -"web_live_java_class" = "Som klasse"; -"web_live_java_class_hint" = "Klassenavn = diagrammets tittel"; -"web_live_java_main" = "Med main-metode"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Ekte Java (med Swing)"; -"web_live_swing_hint" = "Ekte Java med vinduer (CheerpJ). Laster ned ca. 40 MB én gang ved første kjøring."; -"web_live_swing_windows" = "Java-vinduer"; -"web_live_swing_hide" = "Lukk Java-vinduer"; -"web_live_swing_loading" = "Java lastes inn (første gang ca. 40 MB) …"; -"web_live_swing_compiling" = "Kompilerer …"; -"web_live_swing_running" = "Programmet kjører."; -"web_live_swing_compile_failed" = "Kompileringsfeil, se over."; -"web_live_swing_failed" = "Java kunne ikke lastes inn. Sjekk internettforbindelsen."; -"web_live_hint_edit" = "Skriv Java-kode her, så bygger diagrammet seg selv. Eller arbeid i diagrammet, så vokser koden med. Grått = plassholder, bare skriv over."; -"web_live_edit_label" = "Java-kode"; -"web_parse_line_fmt" = "Linje %d: %@"; -"web_parse_missing" = "Her mangler fortsatt: %@"; -"web_parse_extra" = "For mye: %@"; -"web_parse_unclosed_string" = "Det avsluttende %@ mangler."; -"web_parse_else_without_if" = "Denne «else» har ingen «if»."; -"web_parse_case_outside_switch" = "«case» og «default» hører hjemme i en «switch»."; -"web_parse_missing_do_while" = "Etter «do { … }» mangler «while (betingelse);»."; -"web_parse_more_methods" = "Foreløpig teller bare én metode her. Lag andre underprogrammer i egne faner."; -"web_parse_missing_import" = "Øverst mangler %@ Uten denne linjen kjenner ikke Java Scanner."; -"web_parse_missing_scanner" = "Før mangler %@ Uten den linjen finnes ikke Scanneren."; -"web_parse_unknown_type" = "Java kjenner ikke denne datatypen. Mente du %@?"; -"web_quickfix_insert_fmt" = "Forslag: sett inn %@"; -"web_quickfix_replace_fmt" = "Forslag: %1$@ i stedet for %2$@"; -"web_parse_wrong_case" = "Java skiller mellom store og små bokstaver. Riktig er %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Vis strukturdiagram"; -"web_editor_hide" = "Skjul strukturdiagram"; -"web_keywords_title" = "Kode-nøkkelord"; -"web_keywords_hint" = "if, while, for i stedet for elementnavn"; -"web_palette_compact" = "Elementer alltid kompakte"; -"web_palette_compact_hint" = "Symbol med lite navn under, ellers bare når kolonnen er smal"; -"web_about_version_fmt" = "Versjon %@"; -"web_about_software" = "Programvare som brukes"; -"web_about_software_text" = "Kodeeditoren bruker CodeMirror og Lezer (MIT-lisens). Med Swing-støtte laster VisuStruct inn CheerpJ fra Leaning Technologies (Community-lisens) og javac fra OpenJDK."; -"web_about_licenses" = "Lisenstekster"; -"web_live_run" = "Kjør"; -"web_live_run_title" = "Kjør programmet: utdata og inndata vises nedenfor"; -"web_live_run_finished" = "Programmet er ferdig."; -"web_live_run_stopped" = "Stoppet."; -"web_console" = "Konsoll"; -"web_console_hide" = "Skjul konsollen"; -"web_console_resize" = "Endre høyden på konsollen"; -"web_diagram_tools" = "Diagramverktøy"; -"web_files_title" = "Filer"; -"web_files_show" = "Vis filer"; -"web_files_hide" = "Skjul filer"; -"web_files_resize" = "Endre bredden på filer"; -"web_files_new_folder" = "Ny mappe"; -"web_files_switch" = "Velg en annen mappe"; -"web_files_delete" = "Slett"; -"web_files_in_browser" = "I denne nettleserens lagring"; -"web_files_save_hint_fmt" = "Lagring legger programmet i %@."; -"web_files_empty" = "Ingenting lagret ennå. Når du lagrer, lager VisuStruct en mappe med dagens dato her."; -"web_files_reconnect_hint" = "Etter ny innlasting spør nettleseren igjen om VisuStruct kan bruke mappen din."; -"web_files_reconnect_fmt" = "Åpne mappen «%@»"; -"web_files_connect_hint" = "Velg en mappe som arbeidsområde. VisuStruct lager en mappe for hver dag der og lagrer diagram og kode."; -"web_files_connect" = "Velg mappe"; -"web_files_browser_hint" = "Denne nettleseren kan ikke åpne mapper på enheten (f.eks. på iPad). Filene dine blir i nettleserens lagring."; -"web_files_browser" = "Lagre i nettleseren"; -"web_files_delete_confirm_fmt" = "Vil du virkelig slette «%@»?"; -"web_files_folder_prompt" = "Navn på den nye mappen:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Lagret: %@"; -"web_files_create" = "Lag"; -"web_learn_ludwig_tip" = "Ludwigs tips"; -"web_game_title" = "Spill: Sant eller usant?"; -"web_game_intro" = "Ludwig viser deg verdier og en betingelse. Er betingelsen sann (true) eller usann (false)? Ti runder, stadig vanskeligere."; -"web_game_start" = "Start spillet"; -"web_game_round_fmt" = "Runde %@ av %@"; -"web_game_score_fmt" = "Poeng: %@"; -"web_game_true" = "sann (true)"; -"web_game_false" = "usann (false)"; -"web_game_right" = "Riktig!"; -"web_game_wrong" = "Ikke helt. Slik regnes det ut:"; -"web_game_next" = "Neste"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ av %@ riktige."; -"web_game_perfect" = "Alt riktig – Ludwig er imponert!"; -"web_game_good" = "Bra! Se på feilene dine og prøv igjen."; -"web_game_practice" = "Øvelse gjør mester. Les sannhetstabellen igjen og spill en runde til."; -"web_game_again" = "Spill igjen"; -"web_game_wrong_short" = "Dessverre feil."; -"web_game_practice_short" = "Øvelse gjør mester. Les forklaringene igjen og spill en runde til."; -"web_game_clicks" = "Klikk:"; -"web_game_nobody" = "Ingen lytter – ingenting skjer."; -"web_game_event_fmt" = "Klikk på «%@»: lytteren hører det og kjører koden sin."; -"web_game_try" = "Prøv nå knappene i vinduet selv."; -"web_game_time_fmt" = "%@ s igjen"; -"web_game_defused" = "✂️ Desarmert! Du fant feilen."; -"web_game_boom_time" = "💥 Bom! Tiden er ute."; -"web_game_boom_wrong" = "💥 Bom! Det var feil linje."; -"web_game_boom_part" = "💥 Pang! Riktig linje, men feilen er i en annen del."; -"web_game_boom_wrong_part" = "💥 Pang! Feilen er i en annen linje."; -"web_game_bomb_parts_hint" = "Trykk nøyaktig på den feile delen."; -"web_game_fix" = "Riktig linje:"; -"web_game_order_hint" = "Trykk på trinnene i riktig rekkefølge."; -"web_debug_step" = "Steg"; -"web_debug_step_title" = "Steg: kjør én setning og stopp igjen"; -"web_debug_continue" = "Fortsett til neste stoppunkt"; -"web_debug_paused_fmt" = "Stoppet før linje %d."; -"web_debug_gutter_title" = "Klikk på et linjenummer for å sette eller fjerne et stoppunkt"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Endre bredden på struktogrammet"; -"web_palette_resize" = "Endre bredden på elementene"; -"web_palette_hide" = "Skjul elementene"; -"web_palette_show" = "Vis elementene"; -"web_code_scopes" = "Fargede kodeblokker"; -"web_code_scopes_hint" = "Klasse, metode, løkke, forgrening i egne bokser"; -"web_pseudocode" = "Pseudokode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Gi variabelen nytt navn …"; -"web_rename_title" = "Gi variabelen nytt navn"; -"web_rename_old" = "Navn"; -"web_rename_new" = "Nytt navn"; -"web_rename_hint" = "Endrer hvert sted med nøyaktig denne skrivemåten (tall er ikke Tall), i koden og i strukturdiagrammet. Tekst i \\"…\\" og kommentarer blir værende."; -"web_rename_count_fmt" = "Forekommer %d ganger."; -"web_rename_exists_fmt" = "«%@» finnes allerede: etterpå ville begge være én variabel."; -"web_rename_invalid" = "Et navn begynner med en bokstav og inneholder bare bokstaver, sifre og _."; -"web_rename_keyword_fmt" = "«%@» er et nøkkelord i Java."; -"web_rename_apply" = "Gi nytt navn"; -"web_rename_cancel" = "Avbryt"; -`;export{e as default}; diff --git a/website/app/assets/nl-CPGJmQ49.js b/website/app/assets/nl-CPGJmQ49.js deleted file mode 100644 index 3a3986fa..00000000 --- a/website/app/assets/nl-CPGJmQ49.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Teksten die alleen in de webversie bestaan. Al het andere komt uit de Localizable.strings van de app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-structogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exporteren…"; -"web_export_title" = "Opslaan als afbeelding of PDF, of afdrukken"; -"web_export_png" = "Afbeelding (PNG)"; -"web_export_svg" = "Vectorafbeelding (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-bestand (.visustruct)"; -"web_export_failed_fmt" = "Exporteren mislukt: %@"; -"web_print_hint" = "Gebruik “Exporteren… → PDF” om het diagram op te slaan en het daarna af te drukken."; -"web_delete" = "Verwijderen"; -"web_language_title" = "Taal van de interface"; -"web_simulation_start" = "Simulatie starten"; -"web_simulation_end" = "Simulatie beëindigen"; -"web_simulation_start_title" = "Het structogram stap voor stap uitvoeren"; -"web_simulation_end_title" = "Simulatie beëindigen en verder bewerken"; -"web_palette_hint" = "Naar het structogram slepen"; -"web_tabs_label" = "Diagrammen"; -"web_status_modified" = "gewijzigd"; -"web_inspector_title" = "Eigenschappen"; -"web_inspector_resize" = "Hoogte van de objectinspector wijzigen: sleep of veeg de lijn omhoog of omlaag (dubbelklik: standaard)"; -"web_inspector_help_drop" = "Sleep elementen uit het palet op een tegel: boven = ervoor, onder = erna, op “ø” = vervangen. Bestaande elementen kun je met de muis verplaatsen."; -"web_inspector_help_inline" = "Dubbelklik of dubbeltik op een element om de tekst direct in het diagram te bewerken (Enter past toe, Esc annuleert). Ook voor case-namen."; -"web_inspector_help_files" = "Je kunt ook bestanden in het venster neerzetten."; -"web_case_name" = "Naam van de case"; -"web_case_name_placeholder" = "bijv. 1, ok, default"; -"web_copied" = "Element gekopieerd."; -"web_discard_message_fmt" = "De wijzigingen in “%@” gaan verloren."; -"web_err_unreadable_fmt" = "“%@” is geen leesbaar VisuStruct-bestand (%@)."; -"web_saved_fmt" = "“%@” opgeslagen."; -"web_saved_txt_fmt" = "Opgeslagen als “%@”. Verwijder de extensie .txt om het te gebruiken."; -"web_drop_impossible" = "Hier neerzetten is niet mogelijk"; -"web_sim_delay" = "Pauze per stap"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Taal"; -"web_codegen_comments" = "Diagramtekst als commentaar"; -"web_codegen_empty_else" = "Lege else-tak in code genereren"; -"web_copied_check" = "Gekopieerd ✓"; -"web_copy_manual" = "Geselecteerd, druk op Ctrl+C om te kopiëren"; -"web_run_stopped_loop" = "Uitvoering gestopt: mogelijk oneindige lus."; -"web_run_cancelled" = "Uitvoering geannuleerd."; -"web_run_error" = "Fout tijdens het uitvoeren."; -"web_run_dropped_fmt" = "… %d eerdere regels verborgen"; -"web_sim_call_arguments_fmt" = "De aanroep past niet bij de kop van %@. Controleer de waarden tussen de haakjes."; -"web_sim_missing_return_fmt" = "%@ is geëindigd zonder met return een waarde terug te geven."; -"web_sim_file_not_found_fmt" = "Er is geen bestand met de naam %@."; -"web_sim_end_of_file_fmt" = "Het bestand %@ heeft geen regels meer."; -"web_sim_null_value_fmt" = "%@ is null."; -"web_sim_unknown_variable_case_fmt" = "Onbekende variabele: %1$@. Java is hoofdlettergevoelig: bedoelde je %2$@?"; -"web_sim_written_file_fmt" = "%@ (opgeslagen)"; -"web_site_home" = "Startpagina"; -"web_site_imprint" = "Colofon"; -"web_site_privacy" = "Privacy"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmeren"; -"web_live_hide" = "Programmeren verbergen"; -"web_scale_canvas" = "Tekstgrootte: structuurdiagram"; -"web_scale_code" = "Tekstgrootte: programmeren"; -"web_live_indent" = "Inspringen"; -"web_live_indent_title" = "Code laten inspringen: vier spaties per niveau (geselecteerde regels, anders alles)"; -"web_live_show" = "Programmeren tonen"; -"web_live_resize" = "Breedte van het codegebied wijzigen (dubbelklik: herstellen)"; -"web_live_hint" = "De code groeit mee met je diagram. Grijs = plaatshouder: typ in de inspector en je tekst verschijnt hier. Klik op een regel om het element te selecteren."; -"web_live_ph_selector" = "variabele"; -"web_live_ph_code" = "Jouw code"; -"web_live_ph_end" = "einde"; -"web_live_language" = "Programmeertaal"; -"web_live_java_class" = "Als klasse"; -"web_live_java_class_hint" = "Klassenaam = titel van het diagram"; -"web_live_java_main" = "Met main-methode"; -"web_settings_display" = "Weergave"; -"web_live_swing" = "Echte Java (met Swing)"; -"web_live_swing_hint" = "Echt Java met vensters (CheerpJ). Downloadt eenmalig ca. 40 MB bij de eerste keer uitvoeren."; -"web_live_swing_windows" = "Java-vensters"; -"web_live_swing_hide" = "Java-vensters sluiten"; -"web_live_swing_loading" = "Java wordt geladen (de eerste keer ca. 40 MB) …"; -"web_live_swing_compiling" = "Compileren …"; -"web_live_swing_running" = "Programma draait."; -"web_live_swing_compile_failed" = "Compileerfout, zie hierboven."; -"web_live_swing_failed" = "Java kon niet worden geladen. Controleer de internetverbinding."; -"web_live_hint_edit" = "Typ hier Java-code en het diagram bouwt zichzelf op. Of werk in het diagram en de code groeit mee. Grijs = tijdelijke tekst, typ er gewoon overheen."; -"web_live_edit_label" = "Java-code"; -"web_parse_line_fmt" = "Regel %d: %@"; -"web_parse_missing" = "Hier ontbreekt nog: %@"; -"web_parse_extra" = "Te veel: %@"; -"web_parse_unclosed_string" = "De afsluitende %@ ontbreekt."; -"web_parse_else_without_if" = "Bij deze “else” hoort geen “if”."; -"web_parse_case_outside_switch" = "“case” en “default” horen in een “switch”."; -"web_parse_missing_do_while" = "Na “do { … }” ontbreekt nog “while (voorwaarde);”."; -"web_parse_more_methods" = "Voorlopig telt hier maar één methode. Maak andere subprogramma’s in aparte tabbladen."; -"web_parse_missing_import" = "Bovenaan ontbreekt %@ Zonder deze regel kent Java Scanner niet."; -"web_parse_missing_scanner" = "Eerst ontbreekt %@ Zonder deze regel bestaat de Scanner niet."; -"web_parse_unknown_type" = "Java kent dit gegevenstype niet. Bedoelde je %@?"; -"web_quickfix_insert_fmt" = "Suggestie: %@ invoegen"; -"web_quickfix_replace_fmt" = "Suggestie: %1$@ in plaats van %2$@"; -"web_parse_wrong_case" = "Java is hoofdlettergevoelig. Juist is %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Diagram tonen"; -"web_editor_hide" = "Diagram verbergen"; -"web_keywords_title" = "Code-sleutelwoorden"; -"web_keywords_hint" = "if, while, for in plaats van elementnamen"; -"web_palette_compact" = "Elementen altijd compact"; -"web_palette_compact_hint" = "Symbool met kleine naam eronder, anders alleen bij een smalle kolom"; -"web_about_version_fmt" = "Versie %@"; -"web_about_software" = "Gebruikte software"; -"web_about_software_text" = "De code-editor gebruikt CodeMirror en Lezer (MIT-licentie). Met Swing-ondersteuning laadt VisuStruct CheerpJ van Leaning Technologies (Community-licentie) en javac uit OpenJDK."; -"web_about_licenses" = "Licentieteksten"; -"web_live_run" = "Uitvoeren"; -"web_live_run_title" = "Programma uitvoeren: uitvoer en invoer verschijnen eronder"; -"web_live_run_finished" = "Programma klaar."; -"web_live_run_stopped" = "Gestopt."; -"web_console" = "Console"; -"web_console_hide" = "Console verbergen"; -"web_console_resize" = "Hoogte van de console wijzigen"; -"web_diagram_tools" = "Diagramgereedschap"; -"web_files_title" = "Bestanden"; -"web_files_show" = "Bestanden tonen"; -"web_files_hide" = "Bestanden verbergen"; -"web_files_resize" = "Breedte van bestanden wijzigen"; -"web_files_new_folder" = "Nieuwe map"; -"web_files_switch" = "Andere map kiezen"; -"web_files_delete" = "Verwijderen"; -"web_files_in_browser" = "In de opslag van deze browser"; -"web_files_save_hint_fmt" = "Opslaan zet het programma in %@."; -"web_files_empty" = "Nog niets opgeslagen. Bij het opslaan maakt VisuStruct hier een map met de datum van vandaag."; -"web_files_reconnect_hint" = "Na het herladen vraagt de browser nog eens of VisuStruct je map mag gebruiken."; -"web_files_reconnect_fmt" = "Map „%@” openen"; -"web_files_connect_hint" = "Kies een map als werkruimte. VisuStruct maakt daarin een map voor elke dag en slaat diagram en code op."; -"web_files_connect" = "Map kiezen"; -"web_files_browser_hint" = "Deze browser kan geen mappen op het apparaat openen (bijv. op de iPad). Je bestanden blijven in de opslag van deze browser."; -"web_files_browser" = "Opslaan in de browser"; -"web_files_delete_confirm_fmt" = "„%@” echt verwijderen?"; -"web_files_folder_prompt" = "Naam van de nieuwe map:"; -"web_files_default_name" = "Programma"; -"web_files_saved_fmt" = "Opgeslagen: %@"; -"web_files_create" = "Maken"; -"web_learn_ludwig_tip" = "Ludwigs tip"; -"web_game_title" = "Spel: Waar of onwaar?"; -"web_game_intro" = "Ludwig laat je waarden en een voorwaarde zien. Is de voorwaarde waar (true) of onwaar (false)? Tien rondes, steeds lastiger."; -"web_game_start" = "Spel starten"; -"web_game_round_fmt" = "Ronde %@ van %@"; -"web_game_score_fmt" = "Punten: %@"; -"web_game_true" = "waar (true)"; -"web_game_false" = "onwaar (false)"; -"web_game_right" = "Goed!"; -"web_game_wrong" = "Helaas fout. Zo reken je het uit:"; -"web_game_next" = "Verder"; -"web_game_finish" = "Resultaat"; -"web_game_done_fmt" = "%@ van %@ goed."; -"web_game_perfect" = "Alles goed – Ludwig is diep onder de indruk!"; -"web_game_good" = "Sterk! Bekijk je fouten nog eens en probeer het opnieuw."; -"web_game_practice" = "Oefening baart kunst. Lees de waarheidstabel nog eens en speel nog een ronde."; -"web_game_again" = "Nog een keer"; -"web_game_wrong_short" = "Helaas, fout."; -"web_game_practice_short" = "Oefening baart kunst. Lees de uitleg nog eens en speel nog een ronde."; -"web_game_clicks" = "Klikken:"; -"web_game_nobody" = "Niemand luistert – er gebeurt niets."; -"web_game_event_fmt" = "Klik op ‘%@’: de luisteraar hoort het en voert zijn code uit."; -"web_game_try" = "Probeer de knoppen in het venster nu zelf uit."; -"web_game_time_fmt" = "Nog %@ s"; -"web_game_defused" = "✂️ Onschadelijk gemaakt! Je hebt de fout gevonden."; -"web_game_boom_time" = "💥 Boem! De tijd is om."; -"web_game_boom_wrong" = "💥 Boem! Dat was de verkeerde regel."; -"web_game_boom_part" = "💥 Boem! Goede regel, maar de fout zit in een ander deel."; -"web_game_boom_wrong_part" = "💥 Boem! De fout zit in een andere regel."; -"web_game_bomb_parts_hint" = "Tik precies op het foute deel."; -"web_game_fix" = "De juiste regel:"; -"web_game_order_hint" = "Tik de stappen in de juiste volgorde aan."; -"web_debug_step" = "Stap"; -"web_debug_step_title" = "Stap: één opdracht uitvoeren en weer pauzeren"; -"web_debug_continue" = "Doorgaan tot het volgende breekpunt"; -"web_debug_paused_fmt" = "Gepauzeerd vóór regel %d."; -"web_debug_gutter_title" = "Klik op een regelnummer om een breekpunt te plaatsen of te verwijderen"; -"web_swap_to_code" = "Programmeren groot"; -"web_swap_to_editor" = "Structogram groot"; -"web_editor_resize" = "Breedte van het structogram wijzigen"; -"web_palette_resize" = "Breedte van de elementen wijzigen"; -"web_palette_hide" = "Elementen verbergen"; -"web_palette_show" = "Elementen tonen"; -"web_code_scopes" = "Gekleurde codeblokken"; -"web_code_scopes_hint" = "Klasse, methode, lus, keuze in eigen kaders"; -"web_pseudocode" = "Pseudocode"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Variabele hernoemen …"; -"web_rename_title" = "Variabele hernoemen"; -"web_rename_old" = "Naam"; -"web_rename_new" = "Nieuwe naam"; -"web_rename_hint" = "Wijzigt elke plek met precies deze schrijfwijze (getal is niet Getal), in de code en in het structogram. Tekst tussen \\"…\\" en commentaar blijven."; -"web_rename_count_fmt" = "Komt %d keer voor."; -"web_rename_exists_fmt" = "‘%@’ bestaat al: daarna zouden beide één variabele zijn."; -"web_rename_invalid" = "Een naam begint met een letter en bevat alleen letters, cijfers en _."; -"web_rename_keyword_fmt" = "‘%@’ is een Java-sleutelwoord."; -"web_rename_apply" = "Hernoemen"; -"web_rename_cancel" = "Annuleren"; -`;export{e as default}; diff --git a/website/app/assets/objectApp-ClGVaIKp.js b/website/app/assets/objectApp-ClGVaIKp.js deleted file mode 100644 index 288b3056..00000000 --- a/website/app/assets/objectApp-ClGVaIKp.js +++ /dev/null @@ -1,421 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./projectZip-DtugKwEc.js","./index-BqSgHxq8.js","./index-CLK72BwI.css"])))=>i.map(i=>d[i]); -var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,a as Hs,J as Bs,c as Ws,b as zs,d as Ye,p as Vs,e as Us,f as Js,h as Ks,_ as wt,j as $t,k as Xs,r as _t,l as Ys,n as Gs,o as ct}from"./index-BqSgHxq8.js";function Zs(a){const e=[];let t=0;for(;te.text===","?", ":e.text).join("")}function ms(a){const e=[[]];let t=0;for(const s of a)s.text==="<"||s.text==="("||s.text==="["||s.text==="{"?t++:(s.text===">"||s.text===")"||s.text==="]"||s.text==="}")&&t--,s.text===","&&t===0?e.push([]):e[e.length-1].push(s);return e.filter(s=>s.length>0)}function ft(a){var t,s;const e=[];for(let i=0;i{const t=ft(e).filter(i=>i.text!=="final"),s=t[t.length-1];return{name:s!=null&&s.word?s.text:"",type:lt(t.slice(0,-1))}})}function kt(a,e,t,s){var x,L;const i=ft(a),n=new Set;let o=0;for(;o"));const r=i.slice(o);if(r.length===0||a.length===0)return[];const c=a[0].from,l=r.findIndex(S=>S.text==="("),h=r.findIndex(S=>S.text==="="),u=l>0&&(h<0||lS.text==="="),y=_<0?g:g.slice(0,_);let w=y.length-1;for(;w>0&&!y[w].word;)w--;if(w<1)return[];const $=lt(y.slice(0,w)),p=m.length>1,v=[];return m.forEach((S,k)=>{var C;const j=S.findIndex(F=>F.text==="="),M=j<0?S:S.slice(0,j),A=k===0?y[w]:M.find(F=>F.word);if(!A)return;const R=M.filter(F=>F.from>A.from&&F.text==="[").length;v.push({kind:"field",name:A.text,type:$+"[]".repeat(R),params:[],visibility:xt(n,f),isStatic:n.has("static"),isAbstract:!1,from:c,to:s,headerFrom:c,headerTo:k===0?((C=M[M.length-1])==null?void 0:C.to)??A.to:A.to,shared:p,nameFrom:A.from,nameTo:A.to})}),v}function ei(a,e,t){var n;let s=[],i=e;for(;ih.text==="="),c=ye(a,i,"{","}");if(r){s.push(...a.slice(i,c)),i=c;continue}const l=s.map(h=>h.text);l.includes("class")||l.includes("interface")||l.includes("enum")||s.length>0&&t.members.push(...kt(s,t.name,t.kind==="interface",((n=a[c-1])==null?void 0:n.to)??o.to)),s=[],i=c;continue}s.push(o),i++}return t.bodyEnd=a.length>0?a[a.length-1].to:0,i}function oe(a){var n,o,r,c;const e=Zs(a),t=[];let s=[],i=0;for(;iw.text==="class"||w.text==="interface"),f=u>=0?h[u+1]:void 0;if(!(f!=null&&f.word)){i=ye(e,i,"{","}"),s=[];continue}let m=u;for(;m>0&&(fs.has(h[m-1].text)||h[m-1].text==="@");)m--;const g={name:f.text,kind:h[u].text==="interface"?"interface":"class",isAbstract:h.slice(m,u).some(w=>w.text==="abstract"),interfaces:[],members:[],from:((n=s[s.indexOf(h[m])])==null?void 0:n.from)??h[m].from,to:0,headerFrom:((o=s[s.indexOf(h[m])])==null?void 0:o.from)??h[m].from,headerTo:h[h.length-1].to,nameFrom:f.from,nameTo:f.to,bodyEnd:0};let _=u+2;((r=h[_])==null?void 0:r.text)==="<"&&(_=ye(h,_,"<",">"));let y="";for(;_")-1:w.word&&y==="extends"&&g.kind==="class"?g.superclass??(g.superclass=w.text):w.word&&y&&g.interfaces.push(w.text)}i=ei(e,i+1,g),g.to=((c=e[i-1])==null?void 0:c.to)??a.length,t.push(g),s=[]}return t}function Fe(a){const e=/^([\p{L}_$][\p{L}\p{N}_$]*)(\[\])+$/u.exec(a);if(e)return{name:e[1],many:!0};const t=/^(?:ArrayList|LinkedList|List|Set|HashSet|TreeSet|Collection|Queue|Deque|ArrayDeque|Stack|Vector)<([\p{L}_$][\p{L}\p{N}_$]*)>$/u.exec(a);return t?{name:t[1],many:!0}:{name:a,many:!1}}function ti(a){const e=new Set(a.map(s=>s.name)),t=[];for(const s of a){s.superclass&&e.has(s.superclass)&&t.push({kind:"extends",from:s.name,to:s.superclass});for(const i of s.interfaces)e.has(i)&&t.push({kind:s.kind==="interface"?"extends":"implements",from:s.name,to:i});for(const i of s.members){if(i.kind!=="field")continue;const n=Fe(i.type);e.has(n.name)&&t.push({kind:"association",from:s.name,to:n.name,role:i.name,multiplicity:n.many?"0..*":"1"})}}return t}function Ge(a){const e=a.params.map(t=>`${t.name}: ${t.type}`).join(", ");return a.kind==="field"?`${a.visibility} ${a.name}: ${a.type}`:a.kind==="constructor"?`${a.visibility} ${a.name}(${e})`:`${a.visibility} ${a.name}(${e}): ${a.type}`}const si=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;function Ve(a){var c;let e=a.trim().replace(/;$/,"").trim();if(!e)return;let t;/^[+\-#~]/.test(e)&&(t=e[0],e=e.slice(1).trim());let s=!1;const i=e.split(/\s+/);for(;["static","public","private","protected"].includes(i[0]);){const l=i.shift();l==="static"?s=!0:t??(t=l==="public"?"+":l==="private"?"-":"#")}e=i.join(" ");const n=e.indexOf("(");if(n>=0){const l=e.lastIndexOf(")");if(lg.trim()).filter(Boolean).map(g=>{const _=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(g);if(_)return{name:_[1],type:_[2].replace(/\s+/g,"")};const y=/^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(g);return y?{name:y[2],type:y[1].replace(/\s+/g,"")}:{name:g,type:"int"}});return{kind:"method",visibility:t,name:h,type:u==null?void 0:u.replace(/\s+/g,""),params:m,isStatic:s}}const o=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*(?::\s*(.+))?$/u.exec(e);if(o)return{kind:"field",visibility:t,name:o[1],type:(c=o[2])==null?void 0:c.replace(/\s+/g,""),params:[],isStatic:s};const r=/^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(e);if(r)return{kind:"field",visibility:t,name:r[2],type:r[1].replace(/\s+/g,""),params:[],isStatic:s}}const ii={"+":"public ","-":"private ","#":"protected ","~":""};function ni(a){return/^(int|long|short|byte)$/.test(a)?"0":/^(double|float)$/.test(a)?"0.0":a==="boolean"?"false":a==="char"?"' '":"null"}function bs(a,e,t){const s=e.kind==="interface",i=s?"":ii[a.visibility??(a.kind==="field"?"-":"+")],n=a.isStatic?"static ":"";if(a.kind==="field")return`${i}${n}${a.type??"int"} ${a.name}`;const o=a.params.map(r=>`${r.type} ${r.name}`).join(", ");return a.name===e.name?`${i}${a.name}(${o})`:`${i}${n}${t&&!s?"abstract ":""}${a.type??"void"} ${a.name}(${o})`}const Ue=(a,e)=>a.lastIndexOf(` -`,e-1)+1;function mt(a,e,t){const s=Ue(a,e),i=a.slice(s,e);let n=t;for(;na.slice(0,e)+s+a.slice(t);function ai(a,e){const[t,s]=mt(a,e.from,e.to),i=a.slice(0,t).match(/\n\s*\n$/);return Y(a,i?t-i[0].length+1:t,s,"")}function ri(a,e,t){const s=[e,...e.members.filter(i=>i.kind==="constructor")].map(i=>[i.nameFrom,i.nameTo]);for(const[i,n]of s.sort((o,r)=>r[0]-o[0]))a=Y(a,i,n,t);return a}function Ze(a,e,t){const s=a.slice(e.headerFrom,e.headerTo),i=e.nameTo-e.headerFrom,n=s.slice(0,i);let o=s.slice(i).replace(/\s*\bextends\s+[\p{L}_$][\p{L}\p{N}_$<>,\s]*?(?=\s*\bimplements\b|\s*$)/u,"");return t&&(o=` extends ${t}`+o),Y(a,e.headerFrom,e.headerTo,n+o)}function jt(a,e,t){if(e.interfaces.includes(t))return a;const s=a.slice(e.headerFrom,e.headerTo),i=e.kind==="interface"?"extends":"implements",n=new RegExp(`\\b${i}\\s+[\\p{L}_$][\\p{L}\\p{N}_$<>,\\s]*?(?=\\s*$)`,"u"),o=n.test(s)?s.replace(n,r=>`${r.replace(/\s+$/,"")}, ${t}`):`${s.replace(/\s+$/,"")} ${i} ${t}${/\s$/.test(s)?" ":""}`;return Y(a,e.headerFrom,e.headerTo,o)}function St(a,e,t){if(!e.interfaces.includes(t))return a;const s=a.slice(e.headerFrom,e.headerTo),i=e.kind==="interface"?"extends":"implements",n=new RegExp(`\\s*\\b${i}\\s+([\\p{L}_$][\\p{L}\\p{N}_$<>,\\s]*?)(?=\\s*$)`,"u"),o=s.replace(n,(r,c)=>{const l=c.split(",").map(h=>h.trim()).filter(h=>h&&h!==t);return l.length?` ${i} ${l.join(", ")}`:""});return Y(a,e.headerFrom,e.headerTo,o)}function Lt(a,e,t,s){if(e.kind!=="field"||e.shared)return a;const i=a.slice(e.headerFrom,e.headerTo),n=i.lastIndexOf(e.type,e.nameFrom-e.headerFrom);if(n<0)return a;const o=i.slice(0,n)+t+i.slice(n+e.type.length);return Y(a,e.headerFrom,e.to,`${o}${s?` = ${s}`:""};`)}function Et(a,e,t){const s=a.slice(e.headerFrom,e.headerTo),i=t?s.replace(/\bclass\b/,"abstract class"):s.replace(/\babstract\s+/,"");return Y(a,e.headerFrom,e.headerTo,i)}function ci(a,e){const t=a.slice(e.headerFrom,e.nameFrom);return{isPublic:/\bpublic\b/.test(t),isFinal:/\bfinal\b/.test(t)}}function li(a,e,t){const s=a.slice(e.headerFrom,e.headerTo),i=/\bpublic\s+/.test(s.slice(0,e.nameFrom-e.headerFrom)),n=t?i?s:`public ${s}`:s.replace(/\bpublic\s+/,"");return Y(a,e.headerFrom,e.headerTo,n)}function Ne(a,e,t){const s=a.slice(e.headerFrom,e.headerTo),i=t?/\bfinal\b/.test(s)?s:s.replace(/\babstract\s+/,"").replace(/\bclass\b/,"final class"):s.replace(/\bfinal\s+/,"");return Y(a,e.headerFrom,e.headerTo,i)}function Ee(a,e,t){const s=Ve(t);if(!s)return a;const i=oi(a,e),n=bs(s,e,e.kind==="interface");if(s.kind==="field"){const h=[...e.members].reverse().find(m=>m.kind==="field"),u=h?mt(a,h.from,h.to)[1]:hi(a,e),f=a[u-1]===` -`?"":` -`;return Y(a,u,u,`${f}${i}${n}; -`)}let o;if(e.kind==="interface")o=`${i}${n}; -`;else{const h=s.type??"void",f=!(s.name===e.name)&&h!=="void"?`${i} return ${ni(h)}; -`:`${i} // Dein Code -`;o=`${i}${n} { -${f}${i}} -`}const r=Ue(a,e.bodyEnd);if(!/^\s*$/.test(a.slice(r,e.bodyEnd)))return Y(a,e.bodyEnd,e.bodyEnd,` -`+o);const c=a.slice(0,r),l=/\n[ \t]*\n$/.test(c)||/\{[ \t]*\n$/.test(c)?"":` -`;return Y(a,r,r,l+o)}function hi(a,e){const t=a.indexOf("{",e.headerTo)+1,s=/^[ \t]*\n/.exec(a.slice(t));return s?t+s[0].length:t}function Qe(a,e,t,s){const i=Ve(s);if(!i)return a;if(t.kind==="field"!==(i.kind==="field")){const l=xe(a,t),h=oe(l).find(u=>u.name===e.name);return h?Ee(l,h,s):l}if(t.shared)return Y(a,t.nameFrom,t.nameTo,i.name);i.visibility??(i.visibility=t.visibility),(i.kind==="field"||t.kind!=="constructor")&&(i.type??(i.type=t.type));const o=bs(i,e,t.isAbstract),r=a.slice(t.headerFrom,t.headerTo),c=/\bfinal\s+/.test(r)&&!/\bfinal\b/.test(o)?o.replace(/^((?:public|private|protected)\s+)?/,"$1final "):o;return Y(a,t.headerFrom,t.headerTo,c)}function xe(a,e){if(e.shared)return a;const[t,s]=mt(a,e.from,e.to);return Y(a,t,s,"")}const Z="src";function we(a){const e=a.indexOf(":");return e<0?{root:Z,rest:a}:{root:a.slice(0,e),rest:a.slice(e+1)}}const qe=(a,e)=>a===Z?e:`${a}:${e}`,re=(a,e)=>qe(a,e),X=a=>we(a).rest,U=a=>we(a).root,D=a=>{const{root:e,rest:t}=we(a);return qe(e,t.includes("/")?t.slice(0,t.lastIndexOf("/")).replace(/\//g,"."):"")},Q=a=>{const e=we(a).rest;return e.slice(e.lastIndexOf("/")+1)},le=(a,e)=>{const{root:t,rest:s}=we(a);return qe(t,s?`${s.replace(/\./g,"/")}/${e}`:e)},di=a=>{const{root:e,rest:t}=we(a);return`${e}/${t}`},ui=/^[\p{L}\p{N}_$-][\p{L}\p{N}_$.-]*$/u,Je=a=>ui.test(a)&&!a.includes("..");function ue(a){const e=new Set([Z,...a.sourceFolders??[]]);for(const t of a.files)e.add(U(t.path));for(const t of a.packages)e.add(U(t));return[...e].sort((t,s)=>t===Z?-1:s===Z?1:t.localeCompare(s))}const pi=/^[a-z_$][\p{L}\p{N}_$]*(\.[a-z_$][\p{L}\p{N}_$]*)*$/u,Mt=a=>pi.test(a);function ce(a,e){const t=new Set(a.packages);for(const i of a.files)t.add(D(i.path));const s=ue(a);return[...t].filter(i=>X(i)!==""||a.files.some(n=>D(n.path)===i)).filter(i=>e===void 0||U(i)===e).sort((i,n)=>{const o=s.indexOf(U(i))-s.indexOf(U(n));if(o)return o;const[r,c]=[X(i),X(n)];return r===""?1:c===""?-1:r.localeCompare(c)})}function fi(a,e){return a.files.filter(t=>D(t.path)===e).sort((t,s)=>t.path.localeCompare(s.path))}function bt(a,e){const t=X(e),i=/^(\s*(?:\/\/[^\n]*\n|\/\*[\s\S]*?\*\/\s*)*)package\s+[\w.]+\s*;[ \t]*\n?/.exec(a);return i?t?`${i[1]}package ${t}; -`+a.slice(i[0].length):i[1]+a.slice(i[0].length).replace(/^\n/,""):t?`package ${t}; - -${a.replace(/^\n+/,"")}`:a}function mi(a){var e;return((e=/^\s*(?:(?:\/\/[^\n]*|\/\*[\s\S]*?\*\/)\s*)*package\s+([\w.]+)\s*;/.exec(a))==null?void 0:e[1])??""}function Ct(a){return a.files.flatMap(e=>oe(e.text).map(t=>({...t,path:e.path,pkg:X(D(e.path)),root:U(e.path)})))}function $e(a,e,t){return{...a,files:a.files.map(s=>s.path===e?{...s,text:t}:s)}}function et(a,e,t){return{...a,files:[...a.files.filter(s=>s.path!==e),{path:e,text:t}]}}function Tt(a,e){const t=D(e);return{...a,files:a.files.filter(s=>s.path!==e),packages:t&&!a.packages.includes(t)?[...a.packages,t]:a.packages}}function Oe(a,e,t){const s=D(t);return{...a,files:a.files.map(i=>i.path===e?{path:t,text:D(e)===s?i.text:bt(i.text,s)}:i)}}function bi(a,e){return a.packages.includes(e)?a:{...a,packages:[...a.packages,e]}}function vi(a,e,t){const s=i=>i===e?t:i.startsWith(e+".")?t+i.slice(e.length):i;return{...a,packages:[...new Set(a.packages.map(s))],files:a.files.map(i=>{const n=D(i.path),o=s(n);return o===n?i:{path:le(o,Q(i.path)),text:bt(i.text,o)}})}}function gi(a,e){return ue(a).includes(e)?a:{...a,sourceFolders:[...a.sourceFolders??[],e]}}function yi(a,e,t){const s=i=>U(i)===e?qe(t,X(i)):i;return{...a,sourceFolders:(a.sourceFolders??[]).map(i=>i===e?t:i).filter(i=>i!==Z),packages:a.packages.map(s),files:a.files.map(i=>U(i.path)===e?{...i,path:qe(t,we(i.path).rest)}:i)}}function wi(a,e){return e===Z?a:{...a,sourceFolders:(a.sourceFolders??[]).filter(t=>t!==e),packages:a.packages.filter(t=>U(t)!==e),files:a.files.filter(t=>U(t.path)!==e)}}function $i(a,e){return{...a,packages:a.packages.filter(t=>t!==e),files:a.files.filter(t=>D(t.path)!==e)}}function _i(a,e,t){return bt(`public ${t} ${e} { -} -`,a)}function At(a,e){var s,i;const t=[];for(const n of e){const o=n.text.replace(/\r\n/g,` -`),r=mi(o),c=(s=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(o))==null?void 0:s[1],l=/\.java$/i.test(n.name)?Q(n.name):`${c??((i=oe(o)[0])==null?void 0:i.name)??"Main"}.java`;t.push({path:le(r,l),text:o})}return{name:a,files:t,packages:[]}}function Pe(a){return JSON.stringify({format:"visuobject",version:1,...a})}function qt(a){try{const e=JSON.parse(a);if(!Array.isArray(e.files))return;const t=e.files.filter(c=>typeof(c==null?void 0:c.path)=="string"&&typeof(c==null?void 0:c.text)=="string"),s={name:typeof e.name=="string"&&e.name?e.name:"Projekt",files:t,packages:Array.isArray(e.packages)?e.packages.filter(c=>typeof c=="string"):[]},i=Array.isArray(e.sourceFolders)?e.sourceFolders.filter(c=>typeof c=="string"&&Je(c)&&c!==Z):[];i.length&&(s.sourceFolders=i);const n=ys(e.uml);n&&(s.uml=n);const o=vs(e.notes);o&&(s.notes=o);const r=gs(e.objects);return r&&(s.objects=r),s}catch{return}}function vs(a){if(!Array.isArray(a))return;const e=[];for(const t of a){if(!t||typeof t.id!="string"||typeof t.text!="string"||typeof t.x!="number"||typeof t.y!="number")continue;const s=Array.isArray(t.attach)?t.attach.filter(i=>typeof i=="string"):[];e.push({id:t.id,text:t.text,x:t.x,y:t.y,...s.length?{attach:s}:{}})}return e.length?e:void 0}function gs(a){if(!Array.isArray(a))return;const e=[];for(const t of a){if(!t||typeof t.id!="string"||typeof t.name!="string"||typeof t.cls!="string"||typeof t.x!="number"||typeof t.y!="number")continue;const s={};if(t.values&&typeof t.values=="object")for(const[i,n]of Object.entries(t.values))typeof n=="string"&&(s[i]=n);e.push({id:t.id,name:t.name,cls:t.cls,x:t.x,y:t.y,values:s})}return e.length?e:void 0}function ys(a){if(!a||typeof a!="object"||Array.isArray(a))return;const e={};for(const[t,s]of Object.entries(a))s&&typeof s=="object"&&!Array.isArray(s)&&(e[t]=s);return Object.keys(e).length?e:void 0}function Ft(){return{name:"Zoo",packages:[],uml:{"Besitzer.hunde":{kind:"aggregation",name:"führt aus",reading:"forward",sourceMultiplicity:"1"}},files:[{path:"tiere/Tier.java",text:`package tiere; - -public class Tier { - private String name; - private int alter; - - public Tier(String name, int alter) { - this.name = name; - this.alter = alter; - } - - public String getName() { - return name; - } - - public void lautGeben() { - System.out.println("..."); - } -} -`},{path:"tiere/Hund.java",text:`package tiere; - -public class Hund extends Tier { - private String rasse; - - public Hund(String name, int alter, String rasse) { - super(name, alter); - this.rasse = rasse; - } - - public void lautGeben() { - System.out.println("Wuff"); - } -} -`},{path:"personen/Besitzer.java",text:`package personen; - -import java.util.ArrayList; -import tiere.Hund; - -public class Besitzer { - private String name; - private ArrayList hunde = new ArrayList<>(); - - public void gassiGehen() { - for (Hund h : hunde) { - h.lautGeben(); - } - } -} -`}]}}const xi=a=>a.replace(/\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'/g,e=>" ".repeat(e.length));function ki(a,e){const t=a.map(i=>i.name),s=new Map;for(const i of a){const n=e(i);if(!n)continue;const o=xi(n),r=new Set([i.superclass,...i.interfaces,...i.members.filter(c=>c.kind==="field"&&!c.isStatic).map(c=>Fe(c.type).name)]);for(const c of i.members){if(c.kind==="field")continue;const l=o.slice(c.from,c.to);for(const h of t){if(h===i.name||r.has(h)||!new RegExp(`\\b${h}\\b`).test(l))continue;const f=new RegExp(`\\bnew\\s+${h}\\s*[(<\\[{]`).test(l)?"create":"use",m=`${i.name}>${h}`,g=s.get(m)??{from:i.name,to:h,kind:f,methods:[]};f==="create"&&(g.kind="create");const _=c.kind==="constructor"?`${c.name}()`:`${c.name}()`;g.methods.includes(_)||g.methods.push(_),s.set(m,g)}}}return[...s.values()]}const Nt=["1","0..1","0..*","1..*","*"];function Me(a){const e=a.trim().split("..").pop().trim();return e==="*"||e==="n"||/^\d+$/.test(e)&&Number(e)>1}const V=(a,e)=>`${a}.${e}`;function Ot(a){return ti(a).filter(e=>e.kind!=="association")}function Pt(a,e={}){const t=new Set(a.map(c=>c.name)),s=[];for(const c of a)for(const l of c.members){if(l.kind!=="field"||l.isStatic)continue;const h=Fe(l.type);t.has(h.name)&&h.name!==c.name&&s.push({cls:c,field:l,target:h.name,many:h.many})}const i=new Set,n=[],o=(c,l)=>c&&Me(c)===l?c:l?"0..*":"1",r=c=>{const l=e[V(c.cls.name,c.field.name)];return!!l&&(l.kind!==void 0||l.name!==void 0||l.reading!==void 0||l.navigable!==void 0||l.targetEnd!==void 0||l.sourceEnd!==void 0)};for(const c of s){if(i.has(c))continue;i.add(c);const l=s.filter(_=>!i.has(_)&&_.cls.name===c.target&&_.target===c.cls.name);let h=l.length===1&&s.filter(_=>_.cls.name===c.cls.name&&_.target===c.target).length===1?l[0]:void 0;h&&i.add(h);let u=c;h&&!r(c)&&r(h)&&([u,h]=[h,c]);const f=V(u.cls.name,u.field.name),m=e[f]??{},g=h?e[V(h.cls.name,h.field.name)]??{}:{};n.push({key:f,from:u.cls.name,to:u.target,kind:m.kind??"association",name:m.name,reading:m.reading??(m.name?"forward":void 0),navTo:m.targetEnd??(m.navigable===!1?"unspecified":"navigable"),navFrom:h?"navigable":m.sourceEnd??"unspecified",role:u.field.name,multiplicity:o(m.multiplicity,u.many),sourceRole:h?h.field.name:m.sourceRole,sourceMultiplicity:h?o(g.multiplicity,h.many):m.sourceMultiplicity,field:u.field,back:h&&{key:V(h.cls.name,h.field.name),field:h.field}})}return n}function ji(a,e,t){const s=e.charAt(0).toLowerCase()+e.slice(1)+(t?"Liste":"");let i=s;for(let n=2;a.members.some(o=>o.name===i);n++)i=s+n;return i}function It(a,e){return e?{type:`ArrayList<${a}>`,init:"new ArrayList<>()"}:{type:a}}function tt(a,e){if(!e.includes("."))return a;const t=e.replace(/\./g,"\\."),s=e.slice(0,e.lastIndexOf("."));if(new RegExp(`^\\s*import\\s+(${t}|${s.replace(/\./g,"\\.")}\\.\\*)\\s*;`,"m").test(a))return a;const i=[...a.matchAll(/^[ \t]*import\s+[\w.*]+\s*;[ \t]*\n/gm)];if(i.length){const o=i[i.length-1],r=o.index+o[0].length;return a.slice(0,r)+`import ${e}; -`+a.slice(r)}const n=/^\s*package\s+[\w.]+\s*;[ \t]*\n/.exec(a);return n?a.slice(0,n[0].length)+` -import ${e}; -`+a.slice(n[0].length).replace(/^(?!\n)/,` -`):`import ${e}; - -${a}`}function Si(a,e,t){const s={...a[e],...t};for(const n of Object.keys(s))(s[n]===void 0||s[n]==="")&&delete s[n];s.kind==="association"&&delete s.kind,delete s.navigable,s.targetEnd==="navigable"&&delete s.targetEnd,s.sourceEnd==="unspecified"&&delete s.sourceEnd;const i={...a};return Object.keys(s).length?i[e]=s:delete i[e],i}function ke(a,e,t){if(!a[e]||e===t)return a;const s={...a,[t]:a[e]};return delete s[e],s}function Li(a,e){const t=new Map(a.map(o=>[o.name,o])),s=[],i=new Set;for(let o=t.get(e);o&&!i.has(o.name);o=o.superclass?t.get(o.superclass):void 0)i.add(o.name),s.unshift(o);const n=[];for(const o of s)for(const r of o.members){if(r.kind!=="field"||r.isStatic||n.some(l=>l.name===r.name))continue;const c=Fe(r.type);n.push({name:r.name,type:r.type,many:c.many,...t.has(c.name)?{target:c.name}:{}})}return n}function Ei(a){return/^(int|long|short|byte)$/.test(a)?"0":/^(double|float)$/.test(a)?"0.0":a==="boolean"?"false":a==="char"?"''":"null"}function Ce(a){var s;const e=(a??"").trim();return!e||e==="null"?[]:(((s=/^\[(.*)\]$/s.exec(e))==null?void 0:s[1])??e).split(",").map(i=>i.trim()).filter(i=>/^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(i)&&i!=="null")}function Mi(a,e,t){if(!a.many)return t;const s=Ce(e);return`[${(s.includes(t)?s:[...s,t]).join(", ")}]`}function Dt(a,e,t){const s=new Map(a.map(o=>[o.name,o])),i=new Set,n=o=>{if(!o||i.has(o))return!1;if(o===t)return!0;i.add(o);const r=s.get(o);return!!r&&(n(r.superclass)||r.interfaces.some(n))};return n(e)}function Ci(a,e){const t=a.charAt(0).toLowerCase()+a.slice(1);for(let s=1;;s++)if(!e.includes(`${t}${s}`))return`${t}${s}`}const N=a=>a.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]),Ti=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;class Ai{constructor(e){E(this,"selected");E(this,"live");E(this,"suppressClick",!1);E(this,"lastClick",{id:"",time:0});this.host=e,e.canvas.addEventListener("pointerdown",t=>this.onPointerDown(t)),e.canvas.addEventListener("click",t=>this.onClick(t))}get objects(){var e;return((e=this.live)==null?void 0:e.objects)??this.host.objects()}find(e){return e?this.objects.find(t=>t.id===e):void 0}change(e,t){this.host.setObjects(this.host.objects().map(s=>s.id===e?{...s,...t}:s))}fields(e){return Li(this.host.classes(),e.cls)}valueOf(e,t){return e.values[t.name]??Ei(t.type)}render(){const{canvas:e}=this.host;for(const t of e.querySelectorAll(".uml-object, .vo-empty"))t.remove();if(this.objects.length===0){const t=document.createElement("p");t.className="vo-empty",t.textContent=d(this.host.classes().some(s=>s.kind==="class"&&!s.isAbstract)?"web_visuobject_obj_empty":"web_visuobject_obj_no_classes"),e.append(t)}for(const t of this.objects)e.append(this.box(t));this.drawLinks(),this.renderInspector()}box(e){const t=document.createElement("div"),s=this.selected===e.id&&!this.live,i=this.host.classes().some(o=>o.name===e.cls);t.className=`uml-class uml-object${s?" selected":""}${i?"":" unknown"}`,t.dataset.obj=e.id,t.style.left=`${e.x}px`,t.style.top=`${e.y}px`;const n=this.fields(e).map(o=>{var c;return`

  • ${N(o.name)} = ${N(this.valueOf(e,o))}
  • `}).join("");return t.innerHTML=`${s?``:""} -
    ${N(e.name)} : ${N(e.cls)}
    -
      ${n}
    `,t}drawLinks(){var l;const{canvas:e,lines:t}=this.host,s=new Map;for(const h of e.querySelectorAll(".uml-object"))s.set(h.dataset.obj,h);let i=0,n=0;for(const h of s.values())i=Math.max(i,h.offsetLeft+h.offsetWidth+40),n=Math.max(n,h.offsetTop+h.offsetHeight+40);t.setAttribute("width",String(i)),t.setAttribute("height",String(n));const o=h=>({x:h.offsetLeft,y:h.offsetTop,w:h.offsetWidth,h:h.offsetHeight}),r=[],c=new Map;for(const h of this.objects){const u=s.get(h.id);if(u){for(const f of this.fields(h))if(f.target)for(const m of Ce(this.valueOf(h,f))){const g=this.objects.find(W=>W.name===m),_=g&&s.get(g.id);if(!_||_===u)continue;const y=[h.id,g.id].sort().join("|"),w=c.get(y)??0;c.set(y,w+1);const $=o(u),p=o(_),v={x:$.x+$.w/2,y:$.y+$.h/2},x={x:p.x+p.w/2,y:p.y+p.h/2},L=Math.hypot(x.x-v.x,x.y-v.y)||1,S=-(x.y-v.y)/L*w*14,k=(x.x-v.x)/L*w*14,j=Rt($,{x:v.x+S,y:v.y+k},{x:x.x+S,y:x.y+k}),M=Rt(p,{x:x.x+S,y:x.y+k},{x:v.x+S,y:v.y+k}),A=(j.x-M.x)/(Math.hypot(j.x-M.x,j.y-M.y)||1),R=(j.y-M.y)/(Math.hypot(j.x-M.x,j.y-M.y)||1),C={x:M.x+A*22-R*10,y:M.y+R*22+A*10},F=(l=this.live)==null?void 0:l.changed.has(`${h.id}.${f.name}`);r.push(``),r.push(`${N(f.name)}`)}}}t.innerHTML=r.join("")}renderInspector(){const{inspector:e}=this.host;if(this.live)return this.renderDebugger(this.live);const t=this.find(this.selected);if(!t){delete e.dataset.rel,e.innerHTML=`

    ${N(d("web_visuobject_obj_hint"))}

    `;return}e.dataset.rel=`obj:${t.id}`;const s=this.host.classes().filter(r=>r.kind==="class"),i=this.objects.filter(r=>r.id!==t.id),n=r=>{const c=this.valueOf(t,r);if(r.target&&!r.many){const l=i.filter(h=>Dt(this.host.classes(),h.cls,r.target));return``}return``},o=this.fields(t).map(r=>`${N(r.name)} : ${N(r.type)}${n(r)}`).join("");e.innerHTML=` -
    - - -
    - - ${o||``}
    ${N(d("web_visuobject_obj_attribute"))}${N(d("web_visuobject_obj_value"))}
    ${N(d("web_visuobject_insp_no_fields"))}
    -
    `,e.querySelector("[data-field=name]").addEventListener("change",r=>{const c=r.target.value.trim();if(!Ti.test(c))return this.host.message(d("web_visuobject_obj_bad_name",c));if(i.some(h=>h.name===c))return this.host.message(d("web_visuobject_obj_name_taken",c));this.host.message("");const l=t.name;this.host.setObjects(this.host.objects().map(h=>{const u=Object.fromEntries(Object.entries(h.values).map(([f,m])=>[f,Ce(m).includes(l)?m.replace(new RegExp(`(^|[\\s,\\[])${l}(?=$|[\\s,\\]])`,"gu"),`$1${c}`):m]));return h.id===t.id?{...h,name:c,values:u}:{...h,values:u}}))}),e.querySelector("[data-field=cls]").addEventListener("change",r=>this.change(t.id,{cls:r.target.value}));for(const r of e.querySelectorAll("[data-objval]"))r.addEventListener("change",()=>this.change(t.id,{values:{...t.values,[r.dataset.objval]:r.value.trim()}}));e.querySelector("[data-obj-delete]").addEventListener("click",()=>this.remove(t.id))}renderDebugger(e){const{inspector:t}=this.host;delete t.dataset.rel;const s=e.frames[e.frame],i=e.frames.map((o,r)=>`
  • `).join(""),n=((s==null?void 0:s.vars)??[]).map(o=>`${N(o.name)}${N(o.type)}${N(o.value)}`).join("");t.innerHTML=` -
    -

    ${N(d("web_visuobject_dbg_stack"))}

      ${i||`
    1. ${N(d("web_visuobject_obj_live_hint"))}
    2. `}
    -

    ${N(d("web_visuobject_dbg_vars"))}

    - - ${n||``}
    ${N(d("web_visuobject_dbg_var_name"))}${N(d("web_visuobject_dbg_var_type"))}${N(d("web_visuobject_obj_value"))}
    ${N(d("web_visuobject_dbg_no_vars"))}
    -
    -
    `;for(const o of t.querySelectorAll("[data-frame]"))o.addEventListener("click",()=>e.onFrame(Number(o.dataset.frame)))}add(e){const t=this.host.objects(),s=Ci(e,t.map(r=>r.name)),i=[...this.host.canvas.querySelectorAll(".uml-object")].map(r=>({x:r.offsetLeft,y:r.offsetTop,w:r.offsetWidth,h:r.offsetHeight}));let n={x:24,y:24};e:for(let r=24;r<4e3;r+=40)for(let c=24;cc+200+40<=l.x||l.x+l.w+40<=c||r+110+30<=l.y||l.y+l.h+30<=r)){n={x:c,y:r};break e}const o=`o${Date.now().toString(36)}`;this.selected=o,this.host.setObjects([...t,{id:o,name:s,cls:e,x:n.x,y:n.y,values:{}}])}remove(e){const t=this.host.objects().find(s=>s.id===e);t&&(this.selected=void 0,this.host.setObjects(this.host.objects().filter(s=>s.id!==e).map(s=>({...s,values:Object.fromEntries(Object.entries(s.values).map(([i,n])=>{const o=Ce(n);return o.includes(t.name)?[i,/^\[/.test(n.trim())?`[${o.filter(r=>r!==t.name).join(", ")}]`:"null"]:[i,n]}))}))))}onKey(e){return this.live||!this.selected?!1:e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.remove(this.selected),!0):!1}select(e){this.selected=e,this.render(),this.host.canvas.focus({preventScroll:!0})}onPointerDown(e){if(e.button!==0)return;const t=e.target,s=t.closest("[data-obj-connect]"),i=t.closest(".uml-object");if(s&&i&&!this.live)return this.startLink(e,i);i&&this.drag(e,i)}onClick(e){var o;if(this.suppressClick){this.suppressClick=!1;return}if(this.live)return;const t=e.target.closest(".uml-object"),s=t==null?void 0:t.dataset.obj,i=Date.now(),n=!!s&&this.lastClick.id===s&&i-this.lastClick.time<450;this.lastClick={id:s??"",time:n?0:i},this.select(s),n&&((o=this.host.inspector.querySelector("[data-field=name]"))==null||o.select())}drag(e,t){const s=this.find(t.dataset.obj);if(!s)return;const i={x:e.clientX,y:e.clientY};let n=!1,o={x:s.x,y:s.y};const r=l=>{const h=l.clientX-i.x,u=l.clientY-i.y;!n&&Math.hypot(h,u)<4||(n=!0,o={x:Math.max(0,Math.round(s.x+h)),y:Math.max(0,Math.round(s.y+u))},t.style.left=`${o.x}px`,t.style.top=`${o.y}px`,this.drawLinks())},c=()=>{if(window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",c),!!n){if(this.suppressClick=!0,this.live)return Object.assign(s,o),this.live.move(s.id,o);this.selected=s.id,this.change(s.id,o)}};window.addEventListener("pointermove",r),window.addEventListener("pointerup",c)}startLink(e,t){e.preventDefault();const s=this.find(t.dataset.obj);if(!s)return;const{canvas:i,lines:n}=this.host,o=document.createElementNS("http://www.w3.org/2000/svg","line");o.setAttribute("class","vo-rel ghost"),n.append(o);const r={x:t.offsetLeft+t.offsetWidth,y:t.offsetTop+t.offsetHeight/2},c=u=>{var m;const f=(m=document.elementFromPoint(u.clientX,u.clientY))==null?void 0:m.closest(".uml-object");return f&&f!==t?f:void 0},l=u=>{var m;const f=i.getBoundingClientRect();o.setAttribute("x1",String(r.x)),o.setAttribute("y1",String(r.y)),o.setAttribute("x2",String(u.clientX-f.left+i.scrollLeft)),o.setAttribute("y2",String(u.clientY-f.top+i.scrollTop));for(const g of i.querySelectorAll(".uml-object.drop"))g.classList.remove("drop");(m=c(u))==null||m.classList.add("drop")},h=u=>{window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",h),o.remove();const f=c(u);f==null||f.classList.remove("drop"),this.suppressClick=!0;const m=f&&this.find(f.dataset.obj);if(!m)return;const g=this.host.classes(),_=this.fields(s).filter(w=>w.target&&Dt(g,m.cls,w.target)),y=_.find(w=>!w.many&&Ce(this.valueOf(s,w)).length===0)??_.find(w=>w.many)??_[0];if(!y)return this.host.message(d("web_visuobject_obj_no_ref",s.cls,m.cls));this.host.message(""),this.change(s.id,{values:{...s.values,[y.name]:Mi(y,this.valueOf(s,y),m.name)}})};window.addEventListener("pointermove",l),window.addEventListener("pointerup",h)}}function Rt(a,e,t){const s=t.x-e.x,i=t.y-e.y,n=s===0?1/0:a.w/2/Math.abs(s),o=i===0?1/0:a.h/2/Math.abs(i),r=Math.min(n,o,1);return{x:Math.round(e.x+s*r),y:Math.round(e.y+i*r)}}const je=a=>a.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]),Ie=180,Ht=30,De=12,ae=30,Re=34,ee=10,st=a=>a.length*7+16;function qi(a,e){var w;const t=new Map(a.participants.map(($,p)=>[$.key,p])),s=$=>Ht+(t.get($)??0)*Ie+Ie/2,i=new Map,n=[],o=[],r=[],c=[],l=(w=a.participants[0])!=null&&w.isStatic?a.participants[0].key:"",h=$=>c.filter(p=>p.key===$).length+($===l?1:0),u=($,p)=>s($)-ee/2+Math.max(0,p-1)*6;let f=De+ae+24;a.events.forEach(($,p)=>{const v=p===e?" current":"";if($.k==="return"){const C=c.pop();if(!C)return;if($.hidden){o.push(``);return}const F=u(C.key,C.level),W=h(C.caller),G=C.caller===C.key?u(C.caller,W)+ee:W?u(C.caller,W)+(s(C.caller)`),C.caller!==C.key&&n.push(`${zt(G,f,G${je($.label)}`:""}`),f+=Re;return}const x=h($.from),L=$.from===$.to;$.k==="create"&&(f+=ae/2+8,i.set($.to,f));const S=h($.to)+1,k=x?u($.from,x)+(s($.to)>=s($.from)?ee:0):s($.from);if(L){const C=k,F=u($.to,S)+ee;n.push(`${Wt(F,f+4,-1)}${je($.label)}`),c.push({key:$.to,caller:$.from,y:f+4-6,level:S}),f+=Re;return}const j=s($.to)>s($.from),M=$.k==="create"?s($.to)+(j?-st(Bt(a,$.to))/2:st(Bt(a,$.to))/2):u($.to,S)+(j?0:ee),A=$.k==="create"?" create":"",R=$.k==="create"?`«create» ${$.label}`:$.label;n.push(`${$.k==="create"?zt(M,f,j?1:-1):Wt(M,f,j?1:-1)}${$.k==="create"?`${je(R)}`:`${je(R)}`}`),c.push({key:$.to,caller:$.from,y:$.k==="create"?f+ae/2:f,level:S}),f+=$.k==="create"?Re+ae/2:Re});for(const $ of c)o.push(``);const m=f+10,g=a.participants[0];g!=null&&g.isStatic&&o.unshift(``);for(const $ of a.participants){const p=s($.key),v=i.get($.key),x=v!==void 0?v-ae/2:De,L=Math.min(Ie-12,st($.label));r.push(`${je($.label)}`)}const _=Ht*2+a.participants.length*Ie,y=m+20;return{svg:`${r.join("")}${o.join("")}${n.join("")}`,width:_,height:y}}function Bt(a,e){var t;return((t=a.participants.find(s=>s.key===e))==null?void 0:t.label)??""}function Wt(a,e,t){return``}function zt(a,e,t){return``}class Ke extends Error{constructor(e,t){super(e),this.pos=t}}const Fi=[">>>=","<<=",">>=",">>>","...","->","::","++","--","&&","||","==","!=","<=",">=","+=","-=","*=","/=","%=","&=","|=","^=","<<"];function vt(a,e){const t=[];let s=0,i=0;for(;s=a.length)throw new Ke(n==='"'?"string":"char",{file:e,line:i});t.push({t:n==='"'?"str":"char",v:r,line:i}),s=o+1}else{const o=Fi.find(r=>a.startsWith(r,s))??n;t.push({t:"op",v:o,line:i}),s+=o.length}}return t.push({t:"eof",v:"",line:i}),t}const Ni=new Set(["public","private","protected","static","final","abstract","synchronized","transient","volatile","native","strictfp","default"]),Oi=new Set(["int","long","short","byte","double","float","boolean","char","void","var"]),Ae=class Ae{constructor(e,t){E(this,"i",0);this.toks=e,this.file=t}get tok(){return this.toks[this.i]}peek(e=1){return this.toks[Math.min(this.i+e,this.toks.length-1)]}pos(e=this.tok){return{file:this.file,line:e.line}}is(e,t=this.tok){return(t.t==="op"||t.t==="id")&&t.v===e}eat(e){return this.is(e)?(this.i++,!0):!1}expect(e){this.eat(e)||this.fail(`expected:${e}`)}fail(e){throw new Ke(e,this.pos())}ident(){return this.tok.t!=="id"&&this.fail("identifier"),this.toks[this.i++].v}unit(){const e=[];for(this.eat("package")&&this.skipTo(";");this.is("import");)this.skipTo(";");for(;this.tok.t!=="eof";)this.eat(";")||e.push(this.classDecl());return e}skipTo(e){for(;this.tok.t!=="eof"&&!this.is(e);)this.i++;this.expect(e)}mods(){const e=new Set;for(;;)if(this.tok.t==="op"&&this.tok.v==="@")this.i++,this.ident(),this.is("(")&&this.skipParens();else if(this.tok.t==="id"&&Ni.has(this.tok.v)&&!(this.tok.v==="default"&&this.is(":",this.peek())))e.add(this.toks[this.i++].v);else return e}skipParens(){let e=0;do this.is("(")?e++:this.is(")")&&e--,this.i++;while(e>0&&this.tok.t!=="eof")}classDecl(){const e=this.mods(),t=this.pos(),s=this.eat("class")?"class":this.eat("interface")?"interface":this.eat("enum")?"enum":this.fail("class"),i=this.ident();this.is("<")&&this.typeArgs();const n={...t,name:i,kind:s,interfaces:[],isAbstract:e.has("abstract")||s==="interface",fields:[],methods:[],enumConstants:[]};if(this.eat("extends")){const o=[this.type().name];for(;this.eat(",");)o.push(this.type().name);s==="interface"?n.interfaces=o:n.superclass=o[0]}if(this.eat("implements"))for(n.interfaces.push(this.type().name);this.eat(",");)n.interfaces.push(this.type().name);if(this.expect("{"),s==="enum"){for(;this.tok.t==="id"&&(n.enumConstants.push(this.ident()),this.is("(")&&this.skipParens(),!!this.eat(",")););this.eat(";")}for(;!this.eat("}");)this.tok.t==="eof"&&this.fail("expected:}"),!this.eat(";")&&this.member(n);return n}member(e){const t=this.tok,s=this.mods();(this.is("class")||this.is("interface")||this.is("enum"))&&this.fail("innerClass"),this.is("{")&&this.fail("initializer"),this.is("<")&&this.typeArgs();const i=this.pos(t);if(this.tok.t==="id"&&this.tok.v===e.name&&this.is("(",this.peek())){this.i++;const l=this.params();this.eat("throws")&&this.skipThrows();const h=this.block();e.methods.push({...i,name:e.name,params:l,isStatic:!1,isAbstract:!1,isConstructor:!0,body:h,endLine:this.toks[this.i-1].line});return}const n=this.type(),o=this.ident();if(this.is("(")){const l=this.params();for(;this.eat("[");)this.expect("]");this.eat("throws")&&this.skipThrows();const h=s.has("abstract")||e.kind==="interface"&&!this.is("{"),u=this.is("{")?this.block():(this.expect(";"),void 0);e.methods.push({...i,name:o,returns:n,params:l,isStatic:s.has("static"),isAbstract:h,isConstructor:!1,body:u,endLine:this.toks[this.i-1].line});return}let r=!0,c=o;for(;;){r||(c=this.ident()),r=!1;let l=0;for(;this.eat("[");)this.expect("]"),l++;const h=l?{...n,dims:n.dims+l}:n,u=this.eat("=")?this.is("{")?this.arrayInit():this.expr():void 0;if(e.fields.push({...i,name:c,type:h,isStatic:s.has("static")||e.kind==="interface",init:u}),!this.eat(","))break}this.expect(";")}skipThrows(){for(this.type();this.eat(",");)this.type()}params(){this.expect("(");const e=[];if(!this.eat(")")){do{this.mods();let t=this.type();this.eat("...")&&(t={...t,dims:t.dims+1});const s=this.ident();for(;this.eat("[");)this.expect("]"),t={...t,dims:t.dims+1};e.push({name:s,type:t})}while(this.eat(","));this.expect(")")}return e}typeArgs(){this.expect("<");const e=[];if(this.eat(">"))return e;do this.eat("?")?this.eat("extends")||this.eat("super")?e.push(this.type()):e.push({name:"Object",dims:0,args:[]}):e.push(this.type());while(this.eat(","));return this.is(">>")?this.toks[this.i]={...this.tok,v:">"}:this.is(">>>")?this.toks[this.i]={...this.tok,v:">>"}:this.expect(">"),e}type(){let e=this.ident(),t=[];for(this.is("<")&&(t=this.typeArgs());this.is(".")&&this.peek().t==="id";)this.i++,e=this.ident(),this.is("<")&&(t=this.typeArgs());let s=0;for(;this.is("[")&&this.is("]",this.peek());)this.i+=2,s++;return{name:e,dims:s,args:t}}looksLikeDecl(){const e=this.i;try{if(this.mods(),this.tok.t!=="id")return!1;const t=this.tok.v;return["return","new","throw","this","super","true","false","null"].includes(t)?!1:(this.type(),this.tok.t==="id"&&(this.is("=",this.peek())||this.is(";",this.peek())||this.is(",",this.peek())||this.is(":",this.peek())||this.is("[",this.peek())))}catch{return!1}finally{this.i=e}}block(){const e=this.pos();this.expect("{");const t=[];for(;!this.eat("}");)this.tok.t==="eof"&&this.fail("expected:}"),t.push(this.stmt());return{...e,k:"block",body:t}}localDecl(){const e=this.pos();this.mods();const t=this.type(),s=[];do{const i=this.ident();let n=0;for(;this.eat("[");)this.expect("]"),n++;const o=this.eat("=")?this.is("{")?this.arrayInit():this.expr():void 0;s.push({name:i,dims:n,init:o})}while(this.eat(","));return{...e,k:"local",type:t,vars:s}}stmt(){const e=this.pos(),t=this.tok.t==="id"||this.tok.t==="op"?this.tok.v:"";if(t==="{")return this.block();if(this.eat(";"))return{...e,k:"empty"};if(this.eat("if")){this.expect("(");const i=this.expr();this.expect(")");const n=this.stmt();return{...e,k:"if",test:i,then:n,else:this.eat("else")?this.stmt():void 0}}if(this.eat("while")){this.expect("(");const i=this.expr();return this.expect(")"),{...e,k:"while",test:i,body:this.stmt()}}if(this.eat("do")){const i=this.stmt();this.expect("while"),this.expect("(");const n=this.expr();return this.expect(")"),this.expect(";"),{...e,k:"do",body:i,test:n}}if(this.eat("for")){this.expect("(");const i=this.i;try{this.mods();const c=this.type(),l=this.ident();if(this.eat(":")){const h=this.expr();return this.expect(")"),{...e,k:"foreach",type:c,name:l,iter:h,body:this.stmt()}}}catch{}this.i=i;const n=[];if(!this.is(";"))if(this.looksLikeDecl())n.push(this.localDecl());else do{const c=this.pos();n.push({...c,k:"expr",expr:this.expr()})}while(this.eat(","));this.expect(";");const o=this.is(";")?void 0:this.expr();this.expect(";");const r=[];if(!this.is(")"))do r.push(this.expr());while(this.eat(","));return this.expect(")"),{...e,k:"for",init:n,test:o,update:r,body:this.stmt()}}if(this.eat("switch")){this.expect("(");const i=this.expr();this.expect(")"),this.expect("{");const n=[];for(;!this.eat("}");){let o;if(this.eat("default"))o="default";else for(this.expect("case"),o=[this.expr()];this.eat(",");)o.push(this.expr());if(this.eat("->")){const c=this.is("{")?[this.block()]:[this.stmt()];n.push({labels:o,body:c,arrow:!0});continue}this.expect(":");const r=[];for(;!this.is("case")&&!this.is("default")&&!this.is("}");)r.push(this.stmt());n.push({labels:o,body:r,arrow:!1})}return{...e,k:"switch",expr:i,cases:n}}if(this.eat("break"))return this.tok.t==="id"&&this.i++,this.expect(";"),{...e,k:"break"};if(this.eat("continue"))return this.tok.t==="id"&&this.i++,this.expect(";"),{...e,k:"continue"};if(this.eat("return")){const i=this.is(";")?void 0:this.expr();return this.expect(";"),{...e,k:"return",value:i}}if(this.eat("throw")){const i=this.expr();return this.expect(";"),{...e,k:"throw",value:i}}if(this.eat("try")){this.is("(")&&this.fail("tryResources");const i=this.block(),n=[];for(;this.eat("catch");){this.expect("("),this.mods();const r=[this.type()];for(;this.eat("|");)r.push(this.type());const c=this.ident();this.expect(")"),n.push({types:r,name:c,body:this.block()})}const o=this.eat("finally")?this.block():void 0;return{...e,k:"try",body:i,catches:n,finally:o}}if((t==="this"||t==="super")&&this.is("(",this.peek())){this.i++;const i=this.args();return this.expect(";"),{...e,k:"ctorCall",isSuper:t==="super",args:i}}if((t==="class"||t==="interface")&&this.fail("innerClass"),this.looksLikeDecl()){const i=this.localDecl();return this.expect(";"),i}const s=this.expr();return this.expect(";"),{...e,k:"expr",expr:s}}args(){this.expect("(");const e=[];if(!this.eat(")")){do e.push(this.expr());while(this.eat(","));this.expect(")")}return e}arrayInit(){const e=this.pos();this.expect("{");const t=[];for(;!this.eat("}");)if(t.push(this.is("{")?this.arrayInit():this.expr()),!this.eat(",")){this.expect("}");break}return{...e,k:"arrayInit",items:t}}expr(){return this.assign()}assign(){const e=this.cond(),t=this.tok.v;if(this.tok.t==="op"&&["=","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>>="].includes(t)){const s=this.pos();return this.i++,e.k!=="name"&&e.k!=="field"&&e.k!=="index"&&this.fail("assignTarget"),{...s,k:"assign",op:t,target:e,value:this.assign()}}return e}cond(){const e=this.binary(0);if(this.is("?")){const t=this.pos();this.i++;const s=this.assign();return this.expect(":"),{...t,k:"cond",test:e,then:s,else:this.assign()}}return e}binary(e){if(e>=Ae.levels.length)return this.unary();let t=this.binary(e+1);for(;;){const s=this.tok.v;if(!(this.tok.t==="op"||s==="instanceof")||!Ae.levels[e].includes(s))return t;const i=this.pos();if(this.i++,s==="instanceof"){t={...i,k:"instanceof",expr:t,type:this.type()},this.tok.t==="id"&&this.i++;continue}t={...i,k:"binary",op:s,left:t,right:this.binary(e+1)}}}unary(){const e=this.pos();if(this.is("++")||this.is("--")){const t=this.toks[this.i++].v;return{...e,k:"incdec",op:t,prefix:!0,target:this.unary()}}if(this.is("!")||this.is("-")||this.is("+")||this.is("~")){const t=this.toks[this.i++].v;return{...e,k:"unary",op:t,expr:this.unary()}}if(this.is("(")&&this.peek().t==="id"){const t=this.i;this.i++;try{const s=this.type();if(this.eat(")")){const i=Oi.has(s.name),n=this.tok;if((i?!(n.t==="op"&&["+","-","*","/",")",";",",",".","==","<",">"].includes(n.v)&&!["(","-","+","!","~"].includes(n.v))||n.t!=="op"||["(","-","!","~"].includes(n.v):n.t!=="op"||n.v==="(")&&(i||/^[A-Z]/.test(s.name)))return{...e,k:"cast",type:s,expr:this.unary()}}}catch{}this.i=t}return this.postfix(this.primary())}postfix(e){for(;;){const t=this.pos();if(this.eat(".")){this.eat("new")&&this.fail("innerClass");const s=this.ident();this.is("(")?e={...t,k:"call",target:e,name:s,args:this.args(),isSuper:e.k==="super"}:e={...t,k:"field",target:e,name:s}}else if(this.is("[")){this.i++;const s=this.expr();this.expect("]"),e={...t,k:"index",target:e,index:s}}else if(this.is("++")||this.is("--")){const s=this.toks[this.i++].v;e={...t,k:"incdec",op:s,prefix:!1,target:e}}else if(this.is("::")||this.is("->"))this.fail("lambda");else return e}}primary(){const e=this.tok,t=this.pos();if(e.t==="num"){this.i++;const i=e.v.replace(/_/g,"");return/^0[xX]/.test(i)?{...t,k:"lit",value:{t:"int",v:parseInt(i.replace(/[lL]$/,""),16)}}:/[.eEfFdD]/.test(i)&&!/^0[xX]/.test(i)?{...t,k:"lit",value:{t:"double",v:parseFloat(i.replace(/[fFdD]$/,""))}}:{...t,k:"lit",value:{t:"int",v:parseInt(i.replace(/[lL]$/,""),10)}}}if(e.t==="str")return this.i++,{...t,k:"lit",value:{t:"string",v:e.v}};if(e.t==="char")return this.i++,{...t,k:"lit",value:{t:"char",v:e.v.charCodeAt(0)||0}};if(this.eat("(")){const i=this.expr();return this.expect(")"),i}if(e.t!=="id"&&this.fail("expression"),this.eat("true"))return{...t,k:"lit",value:{t:"bool",v:!0}};if(this.eat("false"))return{...t,k:"lit",value:{t:"bool",v:!1}};if(this.eat("null"))return{...t,k:"lit",value:{t:"null",v:null}};if(this.eat("this"))return{...t,k:"this"};if(this.eat("super"))return{...t,k:"super"};if(this.eat("new")){const i=this.ident();let n=[];this.is("<")&&(n=this.typeArgs());const o={name:i,dims:0,args:n};if(this.is("[")){const c=[];let l=0;for(;this.eat("[");){if(this.eat("]")){l++;continue}c.push(this.expr()),this.expect("]"),l++}const h=this.is("{")?this.arrayInit():void 0;return{...t,k:"newArray",type:{...o,dims:l},sizes:c,init:h}}const r=this.args();return this.is("{")&&this.fail("anonymousClass"),{...t,k:"new",type:o,args:r}}const s=this.ident();return this.is("(")?{...t,k:"call",name:s,args:this.args()}:{...t,k:"name",name:s}}};E(Ae,"levels",[["||"],["&&"],["|"],["^"],["&"],["==","!="],["<",">","<=",">=","instanceof"],["<<",">>",">>>"],["+","-"],["*","/","%"]]);let ht=Ae;const Pi=["Scanner","Random","ArrayList","List","LinkedList","HashMap","Map","TreeMap","LinkedHashMap","Collection","Collections","Arrays","Iterator","Objects"];function Ii(a,e,t){var n,o;const s=vt(a,e),i=[];for(let r=0;rl.v).join("")),r=c}for(let r=0;r0&&!i.has(s[n-1].v))continue;const l=Ps(o.v);if(l)return{type:l,pos:{file:e,line:o.line}}}}function Ri(a,e){return new ht(vt(a,e),e).unit()}class O{constructor(e){this.v=e}}class H{constructor(e){this.code=e}}class I{constructor(e,t){E(this,"fields",new Map);E(this,"native",{});this.cls=e,this.id=t}}class B{constructor(e,t,s){this.elem=e,this.items=t,this.id=s}}class K{constructor(e){E(this,"items",[]);this.id=e}}class be{constructor(e){E(this,"entries",new Map);this.id=e}}class de{constructor(e,t){E(this,"buf","");this.kind=e,this.id=t}}class Se{constructor(e){this.name=e}}const Hi={k:"break"},Bi={k:"continue"};class q extends Error{constructor(e,t,s){super(`${e}: ${t}`),this.code=e,this.detail=t,this.pos=s}}class Le extends Error{constructor(e){super(e.cls.name),this.obj=e}}const ve=(a,e=0)=>({name:a,dims:e,args:[]}),ws=new Set(["int","long","short","byte","Integer","Long","Short","Byte"]),$s=new Set(["double","float","Double","Float"]),Vt=new Set(["ArrayList","List","LinkedList","Collection","Iterable"]),Wi=new Set(["HashMap","Map","TreeMap","LinkedHashMap"]),zi=[["Throwable","Object","java.lang"],["Exception","Throwable","java.lang"],["Error","Throwable","java.lang"],["StackOverflowError","Error","java.lang"],["RuntimeException","Exception","java.lang"],["IOException","Exception","java.io"],["InterruptedException","Exception","java.lang"],["ArithmeticException","RuntimeException","java.lang"],["NullPointerException","RuntimeException","java.lang"],["ClassCastException","RuntimeException","java.lang"],["IllegalArgumentException","RuntimeException","java.lang"],["NumberFormatException","IllegalArgumentException","java.lang"],["IllegalStateException","RuntimeException","java.lang"],["UnsupportedOperationException","RuntimeException","java.lang"],["IndexOutOfBoundsException","RuntimeException","java.lang"],["ArrayIndexOutOfBoundsException","IndexOutOfBoundsException","java.lang"],["StringIndexOutOfBoundsException","IndexOutOfBoundsException","java.lang"],["NegativeArraySizeException","RuntimeException","java.lang"],["NoSuchElementException","RuntimeException","java.util"],["InputMismatchException","NoSuchElementException","java.util"],["ConcurrentModificationException","RuntimeException","java.util"]],Vi=new Set(["Math","System","Integer","Double","String","Character","Boolean","Long","Float","Arrays","Collections","Thread","Objects","List"]);function Ut(a){if(Number.isNaN(a))return"NaN";if(!Number.isFinite(a))return a>0?"Infinity":"-Infinity";if(a===0)return Object.is(a,-0)?"-0.0":"0.0";const e=Math.abs(a);if(e>=.001&&e<1e7){const i=String(a);return i.includes(".")||i.includes("e")?i:`${i}.0`}const[t,s]=a.toExponential().split("e");return`${t.includes(".")?t:`${t}.0`}E${Number(s)}`}const _e=a=>(460141958+a*165902235>>>0).toString(16);function Ui(a){let e=0;for(let t=0;ttypeof a=="number"?a:a instanceof O?a.v:a instanceof H?a.code:NaN,ne=a=>typeof a=="number"||a instanceof O||a instanceof H,He=a=>a>=-2147483648&&a<=2147483647;function te(a,e){if(!e||e.dims||a===null||a===void 0)return a;const t=e.name;if($s.has(t))return ne(a)?new O(T(a)):a;if(ws.has(t)){if(a instanceof H)return a.code;if(a instanceof O){if(Number.isNaN(a.v))return 0;const s=Math.trunc(a.v);return t==="int"||t==="Integer"?Math.max(-2147483648,Math.min(2147483647,s)):s}return typeof a=="number"&&(t==="byte"||t==="Byte")?a<<24>>24:typeof a=="number"&&(t==="short"||t==="Short")?a<<16>>16:a}return(t==="char"||t==="Character")&&(typeof a=="number"||a instanceof O)?new H(Math.trunc(T(a))&65535):a}function it(a){return a.dims?null:a.name==="int"||a.name==="long"||a.name==="short"||a.name==="byte"?0:a.name==="double"||a.name==="float"?new O(0):a.name==="boolean"?!1:a.name==="char"?new H(0):null}const dt=a=>`${a.name}${a.args.length?`<${a.args.map(dt).join(", ")}>`:""}${"[]".repeat(a.dims)}`;class Ji{constructor(e,t){E(this,"classes",new Map);E(this,"frames",[]);E(this,"nextId",1);E(this,"quiet",0);E(this,"gen");E(this,"send");E(this,"mode","run");E(this,"startDepth",0);E(this,"prevKey","");E(this,"pauseRequested",!1);E(this,"names",new Map);E(this,"tempNames",new Map);E(this,"seq",[]);E(this,"seqParticipants",new Map);E(this,"seqLimit",3e3);E(this,"stdin",new de("in",0));E(this,"finished",!1);this.io=t;const s={name:"Object",interfaces:[],statics:new Map,staticTypes:new Map,builtin:!0,javaName:"java.lang.Object"};this.classes.set("Object",s);for(const[o,r,c]of zi)this.classes.set(o,{name:o,sup:this.classes.get(r),interfaces:[],statics:new Map,staticTypes:new Map,builtin:!0,javaName:`${c}.${o}`});const i=[];for(const o of e)try{i.push(...Ri(o.source,o.path))}catch(r){throw r instanceof Ke?new q("syntax",r.message,r.pos):r}for(const o of i)this.classes.set(o.name,{name:o.name,decl:o,interfaces:o.interfaces,statics:new Map,staticTypes:new Map});const n=new Set(i.map(o=>o.name));for(const o of e){const r=Ii(o.source,o.path,n);if(r)throw new q("import",r.line,r.pos);const c=Di(o.source,o.path,n);if(c)throw new q("typename",c.type,c.pos)}for(const o of i){const r=this.classes.get(o.name),c=o.superclass??(o.kind==="class"?"Object":void 0);if(c&&(r.sup=this.classes.get(c),!r.sup))throw new q("symbol",c,o)}}start(e){const t=[...this.classes.values()].filter(i=>{var n;return(n=i.decl)==null?void 0:n.methods.some(Kt)}),s=t.find(i=>i.name===e)??t[0];if(!s)throw new q("nomain","");this.gen=this.program(s),this.finished=!1}go(e){this.mode=e,this.startDepth=this.frames.length,this.pauseRequested=!1}pause(){this.pauseRequested=!0}input(e){this.send=e}run(e,t=5e3){var s;if(!this.gen||this.finished)return{k:"done"};for(let i=0;i` at ${s}`)].join(` -`)}stack(){return this.nameObjects(),[...this.frames].reverse().map(e=>{const t=[];e.self&&t.push({name:"this",type:e.self.cls.name,value:this.show(e.self),ref:e.self.id});for(const s of e.scopes)for(const[i,n]of s)t.push({name:i,type:dt(n.type),value:this.show(n.v),...n.v instanceof I?{ref:n.v.id}:{}});return{title:e.title,pos:e.pos,vars:t}})}heap(){return this.nameObjects().map(e=>({id:e.id,name:this.names.get(e.id)??this.tempNames.get(e.id),cls:e.cls.name,fields:[...e.fields].map(([t,s])=>({name:t,type:dt(this.fieldType(e.cls,t)??ve("Object")),value:this.show(s)}))}))}fieldType(e,t){var s;for(let i=e;i;i=i.sup){const n=(s=i.decl)==null?void 0:s.fields.find(o=>o.name===t&&!o.isStatic);if(n)return n.type}}nameObjects(){const e=[],t=new Set,s=new Set(this.names.values());this.tempNames.clear();const i=(r,c,l)=>{if(this.names.has(r.id))return;const h=/^[\p{L}_$][\p{L}\p{N}_$]*$/u.test(c);let u=h?c:r.cls.name.charAt(0).toLowerCase()+r.cls.name.slice(1);if(s.has(u)){let f=2;for(;s.has(`${u}${f}`);)f++;u=`${u}${f}`}s.add(u),(h&&l?this.names:this.tempNames).set(r.id,u)},n=[],o=(r,c,l)=>{if(r instanceof I){if(r.cls.builtin||r.native.enumName!==void 0||t.has(r.id))return;t.add(r.id),i(r,c,l),e.push(r);for(const[h,u]of r.fields)n.push([u,h])}else if(r instanceof B||r instanceof K)for(const h of r.items)h instanceof I&&n.push([h,""]);else if(r instanceof be)for(const[h,u]of r.entries.values())n.push([h,""],[u,""])};for(const r of this.frames){r.self&&n.push([r.self,""]);for(const c of r.scopes)for(const[l,h]of c)n.push([h.v,l,!0])}for(const r of this.classes.values())for(const[c,l]of r.statics)n.push([l,c,!0]);for(let r=0;ru===c&&f!=="")||o(c,l,!!h)}return e.sort((r,c)=>r.id-c.id)}show(e){return e===void 0?"?":e===null?"null":typeof e=="string"?JSON.stringify(e):typeof e=="number"||typeof e=="boolean"?String(e):e instanceof O?Ut(e.v):e instanceof H?e.code?`'${String.fromCharCode(e.code)}'`:"''":e instanceof I?e.native.enumName!==void 0?e.native.enumName:e.cls.builtin?e.cls.name:this.names.get(e.id)??this.tempNames.get(e.id)??`${e.cls.name}@${_e(e.id)}`:e instanceof B||e instanceof K?`[${e.items.slice(0,30).map(s=>this.show(s)).join(", ")}${e.items.length>30?", …":""}]`:e instanceof be?`{${[...e.entries.values()].map(([t,s])=>`${this.show(t)}=${this.show(s)}`).join(", ")}}`:e instanceof de?e.kind==="StringBuilder"?JSON.stringify(e.buf):e.kind:e.name}seqKey(e){return e instanceof I?`o${e.id}`:`c${e.name}`}record(e,t,s){if(this.quiet||this.seq.length>=this.seqLimit)return!1;const i=this.frames.at(-1),n=i?this.seqKey(i.self??i.cls):"",o=this.seqKey(t);return this.seqParticipants.has(o)||this.seqParticipants.set(o,t instanceof I?{key:o,cls:t.cls.name,id:t.id}:{key:o,cls:t.name}),this.nameObjects(),this.seq.push({k:e,from:n,to:o,label:s(),pos:(i==null?void 0:i.pos)??{file:"",line:0}}),!0}recordReturn(e,t,s=!1){var i;this.seq.length>=this.seqLimit+1e3||this.seq.push({k:"return",from:"",to:"",label:t?"⚡":e,pos:((i=this.frames.at(-1))==null?void 0:i.pos)??{file:"",line:0},...s&&!t?{hidden:s}:{}})}sequence(){return this.nameObjects(),{participants:[...this.seqParticipants.values()].map(t=>({key:t.key,cls:t.cls,label:t.id===void 0?t.cls:`${this.names.get(t.id)??this.tempNames.get(t.id)??""} : ${t.cls}`,isStatic:t.id===void 0})),events:[...this.seq],truncated:this.seq.length>=this.seqLimit}}get frame(){return this.frames[this.frames.length-1]}*step(e){const t={file:e.file,line:e.line};this.frames.length&&(this.frame.pos=t),this.quiet||(yield{k:"step",pos:t,depth:this.frames.length})}*program(e){this.quiet++;try{for(const s of this.classes.values())yield*this.initStatics(s)}finally{this.quiet--}const t=e.decl.methods.find(Kt);this.seqParticipants.set(`c${e.name}`,{key:`c${e.name}`,cls:e.name}),yield*this.invoke(t,e,void 0,[new B(ve("String"),[],this.id())])}id(){return this.nextId++}*initStatics(e){const t=e.decl;if(!t)return;t.kind==="enum"&&t.enumConstants.forEach((i,n)=>{const o=new I(e,this.id());o.native={enumName:i,ordinal:n},e.statics.set(i,o),e.staticTypes.set(i,ve(e.name))});for(const i of t.fields)i.isStatic&&(e.statics.set(i.name,it(i.type)),e.staticTypes.set(i.name,i.type));const s={cls:e,scopes:[new Map],pos:t,title:`${e.name} (static)`};this.frames.push(s);try{for(const i of t.fields)i.isStatic&&i.init&&e.statics.set(i.name,te(yield*this.initValue(i.init,i.type),i.type))}finally{this.frames.pop()}}*initValue(e,t){return e.k==="arrayInit"?yield*this.arrayFrom(e,t):yield*this.eval(e)}*arrayFrom(e,t){const s={...t,dims:t.dims-1},i=[];for(const n of e.items)i.push(te(n.k==="arrayInit"?yield*this.arrayFrom(n,s):yield*this.eval(n),s));return new B(s,i,this.id())}*invoke(e,t,s,i){if(!e.body)throw new q("unsupported",`abstract ${e.name}`,e);if(this.frames.length>900)throw new Le(this.exception("StackOverflowError"));const n=new Map;e.params.forEach((l,h)=>n.set(l.name,{v:te(i[h],l.type),type:l.type}));const o=e.isConstructor?`new ${t.name}()`:`${t.name}.${e.name}()`,r=this.frames.length>0&&this.record("call",s||t,()=>`${e.name}(${i.map(l=>this.show(l)).join(", ")})`);this.frames.push({cls:t,method:e,self:s,scopes:[n],pos:e,title:o});let c=!1;try{const l=yield*this.execBody(e.body.body);let h;return(l==null?void 0:l.k)==="return"?h=te(l.v,e.returns):yield*this.step({file:e.file,line:e.endLine}),c=!0,this.frames.pop(),r&&this.recordReturn(e.returns&&e.returns.name!=="void"?this.show(h):"",!1),h}finally{c||(this.frames.pop(),r&&this.recordReturn("",!0))}}*execBody(e){for(const t of e){const s=yield*this.exec(t);if(s)return s}}*construct(e,t,s){var c,l;if((c=e.decl)!=null&&c.isAbstract)throw new q("type",`abstract ${e.name}`,s);const i=new I(e,this.id()),n=[];for(let h=e;h;h=h.sup)n.unshift(h);for(const h of n)for(const u of((l=h.decl)==null?void 0:l.fields)??[])u.isStatic||i.fields.set(u.name,it(u.type));const o=this.record("create",i,()=>`new ${e.name}(${t.map(h=>this.show(h)).join(", ")})`);let r=!1;try{yield*this.runCtor(e,i,t,s),r=!0}finally{o&&this.recordReturn("",!r,!0)}return i}*runCtor(e,t,s,i){if(e.builtin){s.length&&(t.native.message=typeof s[0]=="string"||s[0]===null?s[0]:yield*this.str(s[0])),t.native.trace=this.trace();return}const n=e.decl,o=n.methods.filter(l=>l.isConstructor);if(!o.length){if(s.length)throw new q("symbol",`${e.name}(${s.length})`,i);e.sup&&(yield*this.runCtor(e.sup,t,[],i)),this.frames.push({cls:e,self:t,scopes:[new Map],pos:n,title:`new ${e.name}()`});try{yield*this.fieldInits(e,t)}finally{this.frames.pop()}return}const r=this.pick(o,s);if(!r)throw new q("symbol",`${e.name}(${s.length})`,i);const c=new Map;r.params.forEach((l,h)=>c.set(l.name,{v:te(s[h],l.type),type:l.type})),this.frames.push({cls:e,method:r,self:t,scopes:[c],pos:r,title:`new ${e.name}()`});try{let l=r.body.body;const h=l[0];if((h==null?void 0:h.k)==="ctorCall"){yield*this.step(h);const f=[];for(const m of h.args)f.push(yield*this.eval(m));l=l.slice(1),h.isSuper?(e.sup&&(yield*this.runCtor(e.sup,t,f,h)),yield*this.fieldInits(e,t)):yield*this.runCtor(e,t,f,h)}else e.sup&&(yield*this.runCtor(e.sup,t,[],r)),yield*this.fieldInits(e,t);const u=yield*this.execBody(l);(u==null?void 0:u.k)!=="return"&&(yield*this.step({file:r.file,line:r.endLine}))}finally{this.frames.pop()}}*fieldInits(e,t){var s;for(const i of((s=e.decl)==null?void 0:s.fields)??[])!i.isStatic&&i.init&&(yield*this.step(i),t.fields.set(i.name,te(yield*this.initValue(i.init,i.type),i.type)))}pick(e,t){let s,i=-1;for(const n of e){if(n.params.length!==t.length)continue;let o=0;for(let r=0;r=0;r++){const c=this.fits(t[r],n.params[r].type);o=c<0?-1:o+c}o>i&&(s=n,i=o)}return s}fits(e,t){const s=t.name;return t.dims?e===null?1:e instanceof B?2:-1:ws.has(s)?typeof e=="number"?2:e instanceof H?1:-1:$s.has(s)?e instanceof O?2:ne(e)?1:-1:s==="char"||s==="Character"?e instanceof H?2:-1:s==="boolean"||s==="Boolean"?typeof e=="boolean"?2:-1:s==="String"?typeof e=="string"?2:e===null?1:-1:s==="Object"?0:Vt.has(s)?e instanceof K?2:e===null?1:-1:Wi.has(s)?e instanceof be?2:e===null?1:-1:this.classes.get(s)?e===null?1:e instanceof I&&this.isA(e.cls,s)?e.cls.name===s?2:1:-1:0}isA(e,t){const s=new Set,i=n=>!n||s.has(n.name)?!1:n.name===t?!0:(s.add(n.name),i(n.sup)||n.interfaces.some(o=>i(this.classes.get(o))));return t==="Object"||i(e)}findMethod(e,t,s,i=!0){var r,c;const n=new Set,o=[];for(let l=e;l;l=l.sup){const h=this.pick(((r=l.decl)==null?void 0:r.methods.filter(u=>u.name===t&&!u.isConstructor&&(!i||u.body)))??[],s);if(h)return{m:h,owner:l};for(const u of l.interfaces)o.push(this.classes.get(u))}for(;o.length;){const l=o.shift();if(!l||n.has(l.name))continue;n.add(l.name);const h=this.pick(((c=l.decl)==null?void 0:c.methods.filter(u=>u.name===t&&(!i||u.body)))??[],s);if(h)return{m:h,owner:l};for(const u of l.interfaces)o.push(this.classes.get(u))}}trace(){return[...this.frames].reverse().map(e=>{const t=e.method?e.method.isConstructor?"":e.method.name:"";return`${e.cls.name}.${t}(${e.pos.file.split("/").pop()}:${e.pos.line+1})`})}exception(e,t){const s=new I(this.classes.get(e),this.id());return s.native={message:t??null,trace:this.trace()},s}fail(e,t){throw new Le(this.exception(e,t))}throwableText(e){const t=e.native.message,s=e.cls.javaName??e.cls.name;return t==null?s:`${s}: ${t}`}*exec(e){switch(e.k){case"block":{this.frame.scopes.push(new Map);try{return yield*this.execBody(e.body)}finally{this.frame.scopes.pop()}}case"empty":return;case"local":yield*this.step(e),yield*this.declare(e);return;case"expr":yield*this.step(e),yield*this.eval(e.expr);return;case"if":return yield*this.step(e),(yield*this.test(e.test))?yield*this.exec(e.then):e.else?yield*this.exec(e.else):void 0;case"while":for(;;){if(yield*this.step(e),!(yield*this.test(e.test)))return;const t=yield*this.exec(e.body);if((t==null?void 0:t.k)==="break")return;if((t==null?void 0:t.k)==="return")return t}case"do":for(;;){const t=yield*this.exec(e.body);if((t==null?void 0:t.k)==="break")return;if((t==null?void 0:t.k)==="return")return t;if(yield*this.step(e.test),!(yield*this.test(e.test)))return}case"for":{this.frame.scopes.push(new Map);try{yield*this.step(e);for(const t of e.init)t.k==="local"?yield*this.declare(t):t.k==="expr"&&(yield*this.eval(t.expr));for(;;){if(e.test&&!(yield*this.test(e.test)))return;const t=yield*this.exec(e.body);if((t==null?void 0:t.k)==="break")return;if((t==null?void 0:t.k)==="return")return t;yield*this.step(e);for(const s of e.update)yield*this.eval(s)}}finally{this.frame.scopes.pop()}}case"foreach":{yield*this.step(e);const t=yield*this.eval(e.iter);t===null&&this.fail("NullPointerException");const s=t instanceof B||t instanceof K?[...t.items]:t instanceof be?[...t.entries.values()].map(i=>i[0]):void 0;if(!s)throw new q("type","for-each",e);for(let i=0;i0&&(yield*this.step(e)),t instanceof K&&t.items.length!==s.length&&this.fail("ConcurrentModificationException"),this.frame.scopes.push(new Map([[e.name,{v:te(s[i],e.type),type:e.type}]]));try{const n=yield*this.exec(e.body);if((n==null?void 0:n.k)==="break")return;if((n==null?void 0:n.k)==="return")return n}finally{this.frame.scopes.pop()}}return}case"switch":{yield*this.step(e);const t=yield*this.eval(e.expr);let s=-1;for(let i=0;ii.labels==="default")),s<0)return;this.frame.scopes.push(new Map);try{for(let i=s;in.types.some(o=>this.isA(s.obj.cls,o.name)));if(!i)throw s;this.frame.scopes.push(new Map([[i.name,{v:s.obj,type:i.types[0]}]]));try{t=yield*this.exec(i.body)}finally{this.frame.scopes.pop()}}}finally{if(e.finally){const s=yield*this.exec(e.finally);if(s)return s}}return t}case"ctorCall":throw new q("syntax","ctorCall",e)}}*declare(e){for(const t of e.vars){const s=t.dims?{...e.type,dims:e.type.dims+t.dims}:e.type,i=t.init?te(yield*this.initValue(t.init,s),s):void 0;this.frame.scopes[this.frame.scopes.length-1].set(t.name,{v:i,type:s})}}*test(e){const t=yield*this.eval(e);if(typeof t!="boolean")throw new q("type","boolean",e);return t}lookupVar(e){const t=this.frame.scopes;for(let s=t.length-1;s>=0;s--){const i=t[s].get(e);if(i)return i}}staticOwner(e,t){const s=new Set,i=n=>{if(!(!n||s.has(n.name)))return s.add(n.name),n.statics.has(t)?n:i(n.sup)??n.interfaces.map(o=>i(this.classes.get(o))).find(Boolean)};return i(e)}*place(e){if(e.k==="name"){const s=this.lookupVar(e.name);if(s)return{get:()=>s.v,set:o=>s.v=o,type:s.type};const i=this.frame.self;if(i!=null&&i.fields.has(e.name))return{get:()=>i.fields.get(e.name),set:o=>i.fields.set(e.name,o),type:this.fieldType(i.cls,e.name)};const n=this.staticOwner(this.frame.cls,e.name);if(n)return{get:()=>n.statics.get(e.name),set:o=>n.statics.set(e.name,o),type:n.staticTypes.get(e.name)};if(this.classes.has(e.name)||Vi.has(e.name))return{get:()=>new Se(e.name),set:()=>{}};throw new q("symbol",e.name,e)}if(e.k==="field"){const s=yield*this.eval(e.target);if(s instanceof I&&s.fields.has(e.name))return{get:()=>s.fields.get(e.name),set:o=>s.fields.set(e.name,o),type:this.fieldType(s.cls,e.name)};const i=s instanceof Se?this.staticOwner(this.classes.get(s.name),e.name):s instanceof I?this.staticOwner(s.cls,e.name):void 0;if(i)return{get:()=>i.statics.get(e.name),set:o=>i.statics.set(e.name,o),type:i.staticTypes.get(e.name)};const n=this.builtinField(s,e.name,e);return{get:()=>n,set:()=>{throw new q("type",e.name,e)}}}if(e.k==="index"){const s=yield*this.eval(e.target),i=T(yield*this.eval(e.index));if(s===null&&this.fail("NullPointerException"),!(s instanceof B))throw new q("type","[]",e);return(i<0||i>=s.items.length)&&this.fail("ArrayIndexOutOfBoundsException",`Index ${i} out of bounds for length ${s.items.length}`),{get:()=>s.items[i],set:n=>s.items[i]=n,type:s.elem}}const t=yield*this.eval(e);return{get:()=>t,set:()=>{throw new q("syntax","assignTarget",e)}}}builtinField(e,t,s){if(e===null&&this.fail("NullPointerException",`Cannot read field "${t}" because value is null`),e instanceof B&&t==="length")return e.items.length;if(e instanceof Se)switch(`${e.name}.${t}`){case"System.out":return new de("out",0);case"System.err":return new de("err",0);case"System.in":return this.stdin;case"Math.PI":return new O(Math.PI);case"Math.E":return new O(Math.E);case"Integer.MAX_VALUE":return 2147483647;case"Integer.MIN_VALUE":return-2147483648;case"Long.MAX_VALUE":return Number.MAX_SAFE_INTEGER;case"Double.MAX_VALUE":return new O(Number.MAX_VALUE);case"Double.MIN_VALUE":return new O(Number.MIN_VALUE)}throw new q("symbol",t,s)}*eval(e){switch(e.k){case"lit":{const{t,v:s}=e.value;return t==="double"?new O(s):t==="char"?new H(s):s}case"name":{const t=this.lookupVar(e.name);if(t){if(t.v===void 0)throw new q("type",`uninit:${e.name}`,e);return t.v}return(yield*this.place(e)).get()}case"this":if(!this.frame.self)throw new q("type","static:this",e);return this.frame.self;case"super":if(!this.frame.self)throw new q("type","static:super",e);return this.frame.self;case"field":case"index":return(yield*this.place(e)).get();case"assign":{const t=yield*this.place(e.target);let s;if(e.op==="=")s=e.value.k==="arrayInit"&&t.type?yield*this.arrayFrom(e.value,t.type):yield*this.eval(e.value);else{const i=t.get();s=yield*this.binary(e.op.slice(0,-1),i,yield*this.eval(e.value),e)}return s=te(s,t.type),t.set(s),s}case"incdec":{const t=yield*this.place(e.target),s=t.get();ne(s)||this.fail("NullPointerException");const i=e.op==="++"?1:-1,n=s instanceof O?new O(s.v+i):s instanceof H?new H(s.code+i&65535):He(T(s))?T(s)+i|0:T(s)+i;return t.set(te(n,t.type)),e.prefix?n:s}case"unary":{const t=yield*this.eval(e.expr);return e.op==="!"?!t:e.op==="-"?t instanceof O?new O(-t.v):He(T(t))?-T(t)|0:-T(t):e.op==="~"?~T(t):t instanceof H?t.code:t}case"binary":{if(e.op==="&&")return(yield*this.test(e.left))&&(yield*this.test(e.right));if(e.op==="||")return(yield*this.test(e.left))||(yield*this.test(e.right));const t=yield*this.eval(e.left),s=yield*this.eval(e.right);return yield*this.binary(e.op,t,s,e)}case"cond":return(yield*this.test(e.test))?yield*this.eval(e.then):yield*this.eval(e.else);case"cast":{const t=yield*this.eval(e.expr),s=e.type.name;return t instanceof I&&this.classes.has(s)&&!this.isA(t.cls,s)&&this.fail("ClassCastException",`class ${t.cls.name} cannot be cast to class ${s}`),te(t,e.type)}case"instanceof":{const t=yield*this.eval(e.expr);if(t===null)return!1;const s=e.type.name;return t instanceof I?this.isA(t.cls,s):typeof t=="string"?s==="String"||s==="Object"||s==="CharSequence":t instanceof K&&Vt.has(s)||s==="Object"}case"new":return yield*this.create(e);case"newArray":{if(e.init&&e.init.k==="arrayInit")return yield*this.arrayFrom(e.init,e.type);const t=[];for(const i of e.sizes)t.push(T(yield*this.eval(i)));const s=(i,n)=>{const o=t[i];o<0&&this.fail("NegativeArraySizeException",String(o));const r={...n,dims:n.dims-1},c=Array.from({length:o},()=>i+1":return n>o;case"<=":return n<=o;case">=":return n>=o;case"&":return n&o;case"|":return n|o;case"^":return n^o;case"<<":return n<>":return n>>o;case">>>":return n>>>o}throw new q("unsupported",e,i)}same(e,t){return ne(e)&&ne(t)?T(e)===T(t):e===t}*str(e){if(e==null)return"null";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(e instanceof O)return Ut(e.v);if(e instanceof H)return String.fromCharCode(e.code);if(e instanceof I){const t=this.findMethod(e.cls,"toString",[]);return t?yield*this.str(yield*this.invoke(t.m,t.owner,e,[])):e.native.enumName!==void 0?e.native.enumName:e.cls.builtin?this.throwableText(e):`${e.cls.name}@${_e(e.id)}`}if(e instanceof K){const t=[];for(const s of e.items)t.push(s===e?"(this Collection)":yield*this.str(s));return`[${t.join(", ")}]`}if(e instanceof be){const t=[];for(const[s,i]of e.entries.values())t.push(`${yield*this.str(s)}=${yield*this.str(i)}`);return`{${t.join(", ")}}`}return e instanceof B?`[${e.elem.dims?"[L":{int:"I",double:"D",char:"C",boolean:"Z",long:"J"}[e.elem.name]??`L${e.elem.name};`}@${_e(e.id)}`:e instanceof de?e.kind==="StringBuilder"?e.buf:`java.util.${e.kind}@${_e(e.id)}`:`class ${e.name}`}*equalsVal(e,t){if(e instanceof I&&!e.cls.builtin){const s=this.findMethod(e.cls,"equals",[t]);if(s)return(yield*this.invoke(s.m,s.owner,e,[t]))===!0}return typeof e=="string"||e===null?e===t:this.same(e,t)&&e instanceof O==t instanceof O}*create(e){const t=[];for(const n of e.args)t.push(yield*this.eval(n));const s=e.type.name,i=this.classes.get(s);if(i)return yield*this.construct(i,t,e);if(s==="ArrayList"||s==="LinkedList"){const n=new K(this.id());return t[0]instanceof K&&(n.items=[...t[0].items]),n}if(s==="HashMap"||s==="TreeMap"||s==="LinkedHashMap")return new be(this.id());if(s==="Scanner")return new de("Scanner",this.id());if(s==="Random")return new de("Random",this.id());if(s==="StringBuilder"){const n=new de("StringBuilder",this.id());return typeof t[0]=="string"&&(n.buf=t[0]),n}if(s==="String")return t.length?yield*this.str(t[0]instanceof B?t[0].items.map(n=>n instanceof H?String.fromCharCode(n.code):"").join(""):t[0]):"";if(s==="Object")return new I(this.classes.get("Object"),this.id());throw new q("unsupported",`new ${s}`,e)}*call(e){var n,o;const t=()=>this.evalArgs(e.args);if(!e.target){const r=yield*t(),c=this.frame.self,l=this.findMethod((c==null?void 0:c.cls)??this.frame.cls,e.name,r)??(c?this.findMethod(this.frame.cls,e.name,r):void 0);if(!l)throw new q("symbol",`${e.name}()`,e);if(!l.m.isStatic&&!c)throw new q("type",`static:${e.name}`,e);return yield*this.invoke(l.m,l.owner,l.m.isStatic?void 0:c,r)}if(e.target.k==="super"){const r=yield*t(),c=this.findMethod(this.frame.cls.sup,e.name,r);return c?yield*this.invoke(c.m,c.owner,this.frame.self,r):yield*this.objectMethod(this.frame.self,e.name,r,e,!0)}const s=yield*this.eval(e.target),i=yield*t();if(s==null&&this.fail("NullPointerException",`Cannot invoke "${e.name}()" because value is null`),typeof s=="string")return yield*this.stringMethod(s,e.name,i,e);if(s instanceof I){const r=this.findMethod(s.cls,e.name,i);return r?yield*this.invoke(r.m,r.owner,r.m.isStatic?void 0:s,i):yield*this.objectMethod(s,e.name,i,e)}if(s instanceof K)return yield*this.listMethod(s,e.name,i,e);if(s instanceof be)return yield*this.mapMethod(s,e.name,i,e);if(s instanceof de)return yield*this.nativeMethod(s,e.name,i,e);if(s instanceof Se){const r=this.classes.get(s.name);if(r&&!r.builtin){if(((n=r.decl)==null?void 0:n.kind)==="enum"&&e.name==="values")return new B(ve(r.name),r.decl.enumConstants.map(l=>r.statics.get(l)),this.id());if(((o=r.decl)==null?void 0:o.kind)==="enum"&&e.name==="valueOf"){const l=r.statics.get(String(i[0]));return l instanceof I||this.fail("IllegalArgumentException",`No enum constant ${r.name}.${i[0]}`),l}const c=this.findMethod(r,e.name,i);if(!c)throw new q("symbol",`${s.name}.${e.name}()`,e);return yield*this.invoke(c.m,c.owner,void 0,i)}return yield*this.staticBuiltin(s.name,e.name,i,e)}if(s instanceof B){if(e.name==="clone")return new B(s.elem,[...s.items],this.id());if(e.name==="length")throw new q("symbol","length()",e)}if(ne(s)||typeof s=="boolean"){if(e.name==="equals")return yield*this.equalsVal(s,i[0]);if(e.name==="toString")return yield*this.str(s);if(e.name==="compareTo")return Math.sign(T(s)-T(i[0]));if(e.name==="intValue")return Math.trunc(T(s));if(e.name==="doubleValue")return new O(T(s))}throw new q("symbol",`${e.name}()`,e)}*evalArgs(e){const t=[];for(const s of e)t.push(yield*this.eval(s));return t}*objectMethod(e,t,s,i,n=!1){switch(t){case"toString":return n?e.cls.builtin||this.isA(e.cls,"Throwable")?this.throwableText(e):`${e.cls.name}@${_e(e.id)}`:yield*this.str(e);case"equals":return e===s[0];case"hashCode":return parseInt(_e(e.id),16)|0;case"getClass":return new Se(e.cls.name);case"getMessage":case"getLocalizedMessage":return e.native.message??null;case"printStackTrace":this.io.out(`${this.throwableText(e)} -${(e.native.trace??[]).map(o=>` at ${o} -`).join("")}`,!0);return;case"name":if(e.native.enumName!==void 0)return e.native.enumName;break;case"ordinal":if(e.native.ordinal!==void 0)return e.native.ordinal;break;case"compareTo":if(e.native.ordinal!==void 0&&s[0]instanceof I)return e.native.ordinal-(s[0].native.ordinal??0);break}throw new q("symbol",`${e.cls.name}.${t}()`,i)}index(e,t,s,i=!1){const n=T(e);return n>=0&&(i?n<=t:n{const l=T(r);return l>=0&&(c?l<=e.length:l1?n(s[1],!0):e.length;return c1?T(s[1]):0);case"lastIndexOf":return e.lastIndexOf(o);case"contains":return e.includes(o);case"startsWith":return e.startsWith(o);case"endsWith":return e.endsWith(o);case"isEmpty":return e.length===0;case"isBlank":return e.trim().length===0;case"toUpperCase":return e.toUpperCase();case"toLowerCase":return e.toLowerCase();case"trim":case"strip":return e.trim();case"concat":return e+o;case"replace":{const r=typeof s[1]=="string"?s[1]:s[1]instanceof H?String.fromCharCode(s[1].code):yield*this.str(s[1]);return e.split(o).join(r)}case"replaceAll":return e.replace(new RegExp(o,"g"),String(s[1]));case"matches":return new RegExp(`^(?:${o})$`).test(e);case"split":return new B(ve("String"),(e===""?[""]:e.split(new RegExp(o))).filter((r,c,l)=>r!==""||cnew H(r.charCodeAt(0))),this.id());case"repeat":return e.repeat(T(s[0]));case"hashCode":return Ui(e);case"toString":case"intern":return e}throw new q("unsupported",`String.${t}()`,i)}*listMethod(e,t,s,i){switch(t){case"add":return s.length===2?e.items.splice(this.index(s[0],e.items.length,i,!0),0,s[1]):e.items.push(s[0]),s.length===2?void 0:!0;case"addAll":return s[0]instanceof K&&e.items.push(...s[0].items),!0;case"get":return e.items[this.index(s[0],e.items.length,i)];case"set":{const n=this.index(s[0],e.items.length,i),o=e.items[n];return e.items[n]=s[1],o}case"size":return e.items.length;case"isEmpty":return e.items.length===0;case"clear":e.items=[];return;case"remove":{if(typeof s[0]=="number")return e.items.splice(this.index(s[0],e.items.length,i),1)[0];for(let n=0;nt==="keySet"?h[0]:h[1]),l}case"toString":return yield*this.str(e)}throw new q("unsupported",`HashMap.${t}()`,i)}*nativeMethod(e,t,s,i){if(e.kind==="out"||e.kind==="err"){const n=e.kind==="err";if(t==="println")this.io.out(`${s.length?yield*this.str(s[0]):""} -`,n);else if(t==="print")this.io.out(yield*this.str(s[0]),n);else if(t==="printf"||t==="format")this.io.out(yield*this.format(String(s[0]),s.slice(1)),n);else{if(t==="flush")return;throw new q("unsupported",`System.out.${t}()`,i)}return}if(e.kind==="Scanner")return yield*this.scan(t,i);if(e.kind==="Random"){if(t==="nextInt"){if(!s.length)return Math.random()*4294967296-2147483648|0;const n=s.length>1?T(s[0]):0,o=s.length>1?T(s[1]):T(s[0]);return o<=n&&this.fail("IllegalArgumentException","bound must be positive"),n+Math.floor(Math.random()*(o-n))}if(t==="nextDouble")return new O(Math.random());if(t==="nextBoolean")return Math.random()<.5}if(e.kind==="StringBuilder")switch(t){case"append":return e.buf+=yield*this.str(s[0]),e;case"toString":return e.buf;case"length":return e.buf.length;case"reverse":return e.buf=[...e.buf].reverse().join(""),e;case"charAt":return new H(e.buf.charCodeAt(T(s[0])));case"insert":return e.buf=e.buf.slice(0,T(s[0]))+(yield*this.str(s[1]))+e.buf.slice(T(s[0])),e;case"setLength":e.buf=e.buf.slice(0,T(s[0]));return;case"deleteCharAt":return e.buf=e.buf.slice(0,T(s[0]))+e.buf.slice(T(s[0])+1),e}if(t!=="close")throw new q("unsupported",`${e.kind}.${t}()`,i)}*scan(e,t){const s=this.stdin,i=function*(){const o=yield{k:"input"};return o==null?!1:(s.buf+=`${o} -`,!0)},n=function*(o,r){for(;;){const c=/^\s*(\S+)/.exec(s.buf);if(c&&(c[0].length=t.length&&this.fail("IllegalArgumentException",`Format specifier '${r[0]}'`);const m=t[s++];switch(u.toLowerCase()){case"d":m instanceof O&&this.fail("IllegalArgumentException","d != java.lang.Double"),f=String(Math.trunc(T(m))),c.includes(",")&&(f=f.replace(/\B(?=(\d{3})+(?!\d))/g,"."));break;case"f":if(f=T(m).toFixed(h?Number(h):6),c.includes(",")){const[g,_]=f.split(".");f=g.replace(/\B(?=(\d{3})+(?!\d))/g,".")+(_?`,${_}`:"")}else f=f.replace(".",",");break;case"e":f=T(m).toExponential(h?Number(h):6).replace(".",",");break;case"x":f=(T(m)>>>0).toString(16);break;case"c":f=m instanceof H?String.fromCharCode(m.code):String.fromCharCode(T(m));break;case"b":f=String(m!==null&&m!==!1);break;default:f=yield*this.str(m),h&&(f=f.slice(0,Number(h)))}c.includes("+")&&/^\d/.test(f)&&/[df]/i.test(u)&&(f=`+${f}`),u===u.toUpperCase()&&u!=="%"&&(f=f.toUpperCase())}if(l&&f.length0&&(yield*this.compare(t[i-1],t[i]))>0;i--)[t[i-1],t[i]]=[t[i],t[i-1]];return t}*compare(e,t){if(ne(e)&&ne(t))return T(e)-T(t);if(typeof e=="string"&&typeof t=="string")return et?1:0;if(e instanceof I){const s=this.findMethod(e.cls,"compareTo",[t]);if(s)return T(yield*this.invoke(s.m,s.owner,e,[t]));if(e.native.ordinal!==void 0&&t instanceof I)return e.native.ordinal-(t.native.ordinal??0)}this.fail("ClassCastException","not Comparable")}*staticBuiltin(e,t,s,i){const n=T(s[0]),o=r=>new O(r);switch(`${e}.${t}`){case"Math.abs":return s[0]instanceof O?o(Math.abs(n)):Math.abs(n);case"Math.max":case"Math.min":{const r=t==="max"?Math.max(n,T(s[1])):Math.min(n,T(s[1]));return s[0]instanceof O||s[1]instanceof O?o(r):r}case"Math.pow":return o(Math.pow(n,T(s[1])));case"Math.sqrt":return o(Math.sqrt(n));case"Math.cbrt":return o(Math.cbrt(n));case"Math.random":return o(Math.random());case"Math.round":return Math.floor(n+.5);case"Math.floor":return o(Math.floor(n));case"Math.ceil":return o(Math.ceil(n));case"Math.sin":case"Math.cos":case"Math.tan":case"Math.log":case"Math.log10":case"Math.exp":return o(Math[t](n));case"Math.toRadians":return o(n*Math.PI/180);case"Math.toDegrees":return o(n*180/Math.PI);case"Math.floorMod":return(n%T(s[1])+T(s[1]))%T(s[1]);case"Integer.parseInt":case"Integer.valueOf":case"Long.parseLong":{if(typeof s[0]=="number")return s[0];const r=String(s[0]);return/^[+-]?\d+$/.test(r)||this.fail("NumberFormatException",`For input string: "${r}"`),parseInt(r,10)}case"Double.parseDouble":case"Double.valueOf":{if(ne(s[0]))return o(n);const r=String(s[0]).trim();return/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?[dDfF]?$/.test(r)||this.fail("NumberFormatException",`For input string: "${r}"`),o(parseFloat(r))}case"Boolean.parseBoolean":return String(s[0]).toLowerCase()==="true";case"Integer.toString":case"Double.toString":case"String.valueOf":case"Objects.toString":return s[0]instanceof B&&s[0].elem.name==="char"?s[0].items.map(r=>String.fromCharCode(T(r))).join(""):yield*this.str(s[0]);case"Integer.compare":case"Double.compare":return Math.sign(n-T(s[1]));case"Integer.toBinaryString":return(n>>>0).toString(2);case"Integer.toHexString":return(n>>>0).toString(16);case"Integer.sum":return n+T(s[1])|0;case"Objects.equals":return s[0]===null?s[1]===null:yield*this.equalsVal(s[0],s[1]);case"String.format":return yield*this.format(String(s[0]),s.slice(1));case"String.join":{const r=[],c=s[1]instanceof K||s[1]instanceof B?s[1].items:s.slice(1);for(const l of c)r.push(yield*this.str(l));return r.join(String(s[0]))}case"Character.isDigit":return new RegExp("\\p{Nd}","u").test(String.fromCharCode(n));case"Character.isLetter":return new RegExp("\\p{L}","u").test(String.fromCharCode(n));case"Character.isLetterOrDigit":return/[\p{L}\p{Nd}]/u.test(String.fromCharCode(n));case"Character.isUpperCase":return new RegExp("\\p{Lu}","u").test(String.fromCharCode(n));case"Character.isLowerCase":return new RegExp("\\p{Ll}","u").test(String.fromCharCode(n));case"Character.isWhitespace":return/\s/.test(String.fromCharCode(n));case"Character.toUpperCase":return new H(String.fromCharCode(n).toUpperCase().charCodeAt(0));case"Character.toLowerCase":return new H(String.fromCharCode(n).toLowerCase().charCodeAt(0));case"Character.getNumericValue":return parseInt(String.fromCharCode(n),36);case"Arrays.toString":{if(s[0]===null)return"null";const r=s[0],c=[];for(const l of r.items)c.push(yield*this.str(l));return`[${c.join(", ")}]`}case"Arrays.sort":case"Collections.sort":{const r=s[0];r.items=yield*this.sorted(r.items);return}case"Arrays.fill":s[0].items.fill(te(s[1],s[0].elem));return;case"Arrays.asList":case"List.of":{const r=new K(this.id());return r.items=s.length===1&&s[0]instanceof B?[...s[0].items]:s,r}case"Collections.reverse":s[0].items.reverse();return;case"Collections.shuffle":s[0].items.sort(()=>Math.random()-.5);return;case"Collections.max":case"Collections.min":{const r=s[0].items;r.length||this.fail("NoSuchElementException");const c=yield*this.sorted(r);return t==="max"?c[c.length-1]:c[0]}case"Thread.sleep":yield{k:"sleep",ms:n};return;case"System.currentTimeMillis":return Date.now();case"System.nanoTime":return Math.round(performance.now()*1e6);case"System.exit":throw new Jt}throw new q("unsupported",`${e}.${t}()`,i)}}class Jt extends Error{}function Kt(a){return a.name==="main"&&a.isStatic&&a.params.length===1&&a.params[0].type.name==="String"&&a.params[0].type.dims===1}function Ki(a){return{name:a.name,kind:a.kind==="field"?"field":"method",params:a.params.length>0,returns:a.type,description:a.kind==="field"?"":a.params.map(e=>`${e.name}: ${e.type}`).join(", ")}}function Xi(a,e,t="de"){const s=new Map(a.map(r=>[r.name,r])),i=(r,c)=>{const l=new Set;for(let h=r?s.get(r):void 0;h&&!l.has(h.name);h=h.superclass?s.get(h.superclass):void 0){if(h.name===c)return!0;l.add(h.name)}return!1},n=(r,c,l)=>r.visibility==="+"?!0:r.visibility==="-"?!l&&e.cls===c.name:c.pkg===e.pkg?!0:r.visibility==="#"&&i(e.cls,c.name),o=(r,c)=>{if(!s.get(r))return;const h=[],u=new Set,f=new Set,m=(g,_)=>{if(u.has(g))return;u.add(g);const y=s.get(g);if(!y){if(!c)for(const w of Is(g,t))f.has(w.name)||(f.add(w.name),h.push(w));return}for(const w of y.members){if(w.kind==="constructor"||w.isStatic!==c||!n(w,y,_))continue;const $=`${w.kind}:${w.name}:${w.params.map(p=>p.type).join(",")}`;f.has($)||(f.add($),h.push(Ki(w)))}y.superclass&&m(y.superclass,!0);for(const w of y.interfaces)m(w,!0)};return m(r,!1),h};return{members:r=>o(r,!1),statics:r=>o(r,!0),thisType:e.cls}}const Xt=["fields","refs","ctors","methods"],Yi=[{fields:"Attribute",refs:"Referenzattribute",ctors:"Konstruktor",methods:"Methoden"},{fields:"Attributes",refs:"Reference attributes",ctors:"Constructor",methods:"Methods"},{fields:"Atributos",refs:"Atributos de referência",ctors:"Construtor",methods:"Métodos"}],Te=a=>a.trim().toLowerCase().replace(/[:.]$/,""),Gi=new Set(Yi.flatMap(a=>Object.values(a)).flatMap(a=>[Te(a),Te(a)+"en",Te(a)+"s",Te(a)+"es"])),ut=a=>{const e=/^\s*\/\/\s*(.+?)\s*$/.exec(a);return!!e&&Gi.has(Te(e[1]))};function Zi(a,e){return a.kind==="constructor"?"ctors":a.kind==="method"?"methods":e.has(Fe(a.type).name)?"refs":"fields"}const Be=(a,e)=>a.lastIndexOf(` -`,e-1)+1,Yt=(a,e)=>{const t=a.indexOf(` -`,e);return t<0?a.length:t+1};function _s(a,e){const t=a.indexOf("{",e.headerTo);return a.slice(t+1,e.bodyEnd).split(` -`).some(ut)}function pt(a,e,t,s){if(e.kind!=="class")return a;const i=a.indexOf("{",e.headerTo);if(i<0||i>e.bodyEnd||oe(a).some(_=>_.from>i&&_.fromo||!/^\s*$/.test(a.slice(i+1,n))||!/^\s*$/.test(a.slice(o,e.bodyEnd)))return a;const r=/^[ \t]*/.exec(a.slice(Be(a,e.from)))[0]+" ",c=new Map(Xt.map(_=>[_,[]])),l=[],h=new Set;for(const _ of e.members){if(h.has(_.from))continue;h.add(_.from);let y=Be(a,_.from);if(!/^\s*$/.test(a.slice(y,_.from)))return a;const w=Yt(a,_.to);if(!/^\s*$/.test(a.slice(_.to,w)))return a;for(;!(y<=n);){const $=Be(a,y-1),p=a.slice($,y);if(ut(p)||!/^\s*(\/\/|\/\*|\*|@)/.test(p))break;y=$}l.push([y,w]),c.get(Zi(_,t)).push(a.slice(y,w).replace(/\s+$/,""))}l.sort((_,y)=>_[0]-y[0]);let u="",f=n;for(const[_,y]of[...l,[o,o]])_>f&&(u+=a.slice(f,_)),f=Math.max(f,y);const m=u.split(` -`).filter(_=>!ut(_)).join(` -`).trim(),g=Xt.map(_=>{const y=c.get(_),w=_==="fields"||_==="refs"?` -`:` - -`;return`${r}// ${s[_]}`+(y.length?` -`+y.join(w):"")});return m&&g.push(r+m),a.slice(0,n)+g.join(` - -`)+` -`+a.slice(o)}function Qi(a,e,t,s){const i=oe(a).find(n=>n.name===e);return i&&_s(a,i)?pt(a,i,t,s):a}const Gt="visuobject.layout",en="visuobject.explorer",nt="40px",fe={explorer:260,split:45},xs=(a,e,t,s)=>Number.isFinite(a)?Math.min(t,Math.max(e,Math.round(a))):s,Zt=a=>xs(a,180,480,fe.explorer),Qt=a=>xs(a,20,80,fe.split);class tn{constructor(e,t){E(this,"collapsed",new Set);E(this,"explorer",fe.explorer);E(this,"split",fe.split);this.root=e,this.changed=t;try{const n=JSON.parse(localStorage.getItem(Gt)??"null");if(n){for(const o of n.collapsed??[])(o==="explorer"||o==="code"||o==="diagram")&&this.collapsed.add(o);this.explorer=Zt(Number(n.explorer??fe.explorer)),this.split=Qt(Number(n.split??fe.split))}else localStorage.getItem(en)==="0"&&this.collapsed.add("explorer")}catch{}for(const n of e.querySelectorAll("[data-collapse]"))n.addEventListener("click",()=>this.toggle(n.dataset.collapse,!0));for(const n of e.querySelectorAll("[data-expand]"))n.addEventListener("click",()=>this.toggle(n.dataset.expand,!1));const s=e.querySelector(".vo-splitter[data-split=explorer]"),i=e.querySelector(".vo-splitter[data-split=code]");this.splitter(s,{at:n=>n.clientX-e.getBoundingClientRect().left,get:()=>this.explorer,set:n=>this.explorer=Zt(n),reset:fe.explorer,step:20}),this.splitter(i,{at:n=>{const o=e.querySelector("[data-pane=code]").getBoundingClientRect(),r=e.querySelector("[data-pane=diagram]").getBoundingClientRect();return(n.clientX-o.left)/(r.right-o.left)*100},get:()=>this.split,set:n=>this.split=Qt(n),reset:fe.split,step:5}),this.apply()}isCollapsed(e){return this.collapsed.has(e)}toggle(e,t=!this.collapsed.has(e)){var i,n;if(t&&!this.collapsed.has(e)&&this.collapsed.size>=2)return;t?this.collapsed.add(e):this.collapsed.delete(e),this.apply();const s=this.root.querySelector(`[data-pane=${e}]`);t?(i=s.querySelector(".vo-strip"))==null||i.focus():(n=s.querySelector("[data-collapse]"))==null||n.focus()}apply(){const e=this.collapsed,t=e.has("code")&&e.has("diagram"),s=e.has("explorer")?nt:t?"1fr":`${this.explorer}px`,i=e.has("code")?nt:`minmax(0, ${this.split}fr)`,n=e.has("diagram")?nt:`minmax(0, ${100-this.split}fr)`;this.root.style.setProperty("--vo-cols",`${s} 1px ${i} 1px ${n}`);for(const c of this.root.querySelectorAll("[data-pane]"))c.classList.toggle("collapsed",e.has(c.dataset.pane));const o=this.root.querySelector(".vo-splitter[data-split=explorer]"),r=this.root.querySelector(".vo-splitter[data-split=code]");o.classList.toggle("fixed",e.has("explorer")||t),r.classList.toggle("fixed",e.has("code")||e.has("diagram")),o.setAttribute("aria-valuenow",String(this.explorer)),r.setAttribute("aria-valuenow",String(this.split));try{localStorage.setItem(Gt,JSON.stringify({collapsed:[...e],explorer:this.explorer,split:this.split}))}catch{}this.changed()}splitter(e,t){e.addEventListener("pointerdown",s=>{if(e.classList.contains("fixed"))return;s.preventDefault(),e.setPointerCapture(s.pointerId),this.root.classList.add("vo-resizing");const i=o=>{t.set(t.at(o)),this.apply()},n=()=>{this.root.classList.remove("vo-resizing"),e.removeEventListener("pointermove",i),e.removeEventListener("pointerup",n),e.removeEventListener("pointercancel",n)};e.addEventListener("pointermove",i),e.addEventListener("pointerup",n),e.addEventListener("pointercancel",n)}),e.addEventListener("dblclick",()=>{t.set(t.reset),this.apply()}),e.addEventListener("keydown",s=>{const i=s.key==="ArrowLeft"?-t.step:s.key==="ArrowRight"?t.step:0;i&&(s.preventDefault(),t.set(t.get()+i),this.apply())})}}const sn=a=>a==="boolean"?"false":/^(int|long|short|byte|double|float)$/.test(a)?"0":a==="char"?"'\\0'":"null",es=a=>a.map(e=>`${e.type} ${e.name}`).join(", ");function nn(a){const e=new Map,t=(s,i)=>{for(const n of s.members)if(n.kind==="method"&&!n.isStatic&&(i||n.isAbstract)){const o=`${n.name}(${n.params.map(r=>r.type).join(",")})`;e.has(o)||e.set(o,{name:n.name,type:n.type||"void",params:n.params,visibility:i||n.visibility==="+"?"public":n.visibility==="#"?"protected":""})}};a.superclass&&t(a.superclass,!1);for(const s of a.interfaces)t(s,!0);return[...e.values()]}function on(a){const e=[];a.pkg&&e.push(`package ${a.pkg};`,"");const t=[a.superclass,...a.interfaces].filter(r=>!!r&&!!r.pkg&&r.pkg!==a.pkg).map(r=>`import ${r.pkg}.${r.name};`);t.length&&e.push(...[...new Set(t)].sort(),""),a.comment&&(e.push("/**",` * ${a.name}`," *"),e.push(` * @author ${a.author.trim()||"…"}`," */"));const s=[a.isPublic?"public":"",a.kind==="class"&&a.isAbstract?"abstract":"",a.kind==="class"&&a.isFinal?"final":""].filter(Boolean).join(" "),i=a.interfaces.map(r=>r.name),n=a.kind==="class"?`${s?s+" ":""}class ${a.name}${a.superclass?` extends ${a.superclass.name}`:""}${i.length?` implements ${i.join(", ")}`:""}`:`${s?s+" ":""}interface ${a.name}${i.length?` extends ${i.join(", ")}`:""}`;e.push(`${n} {`);const o=[];if(a.kind==="class"){if(a.constructors&&a.superclass){const r=a.superclass.members.filter(c=>c.kind==="constructor");for(const c of r.length?r:[{params:[]}])o.push([` public ${a.name}(${es(c.params)}) {`,` super(${c.params.map(l=>l.name).join(", ")});`," }"])}else a.constructors&&o.push([` public ${a.name}() {`," }"]);if(a.inherited&&!a.isAbstract)for(const r of nn(a))o.push([" @Override",` ${r.visibility?r.visibility+" ":""}${r.type} ${r.name}(${es(r.params)}) {`,...r.type==="void"?[]:[` return ${sn(r.type)};`]," }"]);a.main&&o.push([" public static void main(String[] args) {"," }"])}return o.length&&e.push("",o.map(r=>r.join(` -`)).join(` - -`)),e.push("}",""),e.join(` -`)}const P=a=>a.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]),ks="visuobject.author";function an(){try{return localStorage.getItem(ks)??""}catch{return""}}function rn(a,e){return new Promise(t=>{const s=document.createElement("div");s.className="confirm vo-wizard-back";const i=a==="class"||a==="interface",n=``,o=``,r=e.classes,c=r.filter(k=>k.kind==="class").map(k=>``).join(""),l=r.filter(k=>k.kind==="interface"),h=l.length?`
    ${P(d(a==="class"?"web_visuobject_new_interfaces":"web_visuobject_new_extends_interfaces"))}${l.map(k=>``).join("")}
    `:"",u=(k,j,M=!1)=>``,f=i?`${n}${o} - -
    ${P(d("web_visuobject_new_modifiers"))} - - ${a==="class"?`${u("abstract","abstract")}${u("final","final")}`:""} -
    - ${a==="class"?``:""} - ${h} - ${a==="class"?`
    ${P(d("web_visuobject_new_stubs"))} - ${u("main","public static void main(String[] args)")} - ${u("constructors",P(d("web_visuobject_new_stub_constructors")))} - ${u("inherited",P(d("web_visuobject_new_stub_inherited")),!0)} -
    `:""} -
    ${P(d("web_visuobject_new_comment_legend"))} - ${u("comment",P(d("web_visuobject_new_comment")))} - -
    `:`${a==="package"?n:""}`;s.innerHTML=``;const m=s.querySelector("form"),g=k=>m.querySelector(`[name="${k}"]`),_=g("name"),y=g("root"),w=g("pkg"),$=m.querySelector(".vo-wizard-error");_.value=e.suggest(a);const p=()=>{if(!w)return;const k=e.packagesIn((y==null?void 0:y.value)??e.root),j=k.includes("")?k:[...k,""],M=w.value||e.pkg;w.innerHTML=j.map(A=>``).join("")};p(),y==null||y.addEventListener("change",p);const v=g("abstract"),x=g("final");v==null||v.addEventListener("change",()=>v.checked&&x&&(x.checked=!1)),x==null||x.addEventListener("change",()=>x.checked&&v&&(v.checked=!1));const L=()=>{const k=e.check(a,_.value.trim(),(y==null?void 0:y.value)??e.root,(w==null?void 0:w.value)??e.pkg);return $.textContent=k??"",!k};_.addEventListener("input",L),w==null||w.addEventListener("change",L);const S=k=>{s.remove(),t(k)};m.addEventListener("submit",k=>{var G;if(k.preventDefault(),!L())return _.focus();const j=_.value.trim(),M=(y==null?void 0:y.value)??e.root,A=(w==null?void 0:w.value)??"";if(!i)return S({kind:a,name:j,root:M,pkg:A});const R=g("author").value;try{localStorage.setItem(ks,R)}catch{}const C=z=>{var he;return!!((he=g(z))!=null&&he.checked)},F=z=>e.classes.find(he=>he.name===z),W=(G=g("superclass"))==null?void 0:G.value;S({kind:a,name:j,root:M,pkg:A,options:{kind:a,pkg:A,name:j,isPublic:g("visibility").value==="public",isAbstract:C("abstract"),isFinal:C("final"),superclass:W?F(W):void 0,interfaces:[...m.querySelectorAll("[name=iface]:checked")].map(z=>F(z.value)).filter(z=>!!z),main:C("main"),constructors:C("constructors"),inherited:C("inherited"),comment:C("comment"),author:R}})}),s.addEventListener("click",k=>{const j=k.target;(j===s||j.closest("[data-cancel]"))&&S(void 0)}),s.addEventListener("keydown",k=>{k.stopPropagation(),k.key==="Escape"&&S(void 0)}),document.body.append(s),_.focus(),_.select()})}const me=(a,e,t,s)=>a.slice(0,e)+s+a.slice(t),js={"+":"public ","-":"private ","#":"protected ","~":""},Ss=(a,e)=>a.lastIndexOf(` -`,e-1)+1;function Ls(a,e){const t=e.members[0];if(t){const s=Ss(a,t.from),i=/^[ \t]*/.exec(a.slice(s))[0];if(s+i.length===t.from)return i}return" "}function Es(a,e,t){return/^(\s*@[\w.]+(\([^)]*\))?\s*)*/.exec(a.slice(e,t))[0]}function Ms(a,e){var n;const t=a.slice(e.headerFrom,e.nameFrom),s=a.slice(e.nameTo,e.to),i=e.shared?"":((n=/^\s*=\s*([\s\S]*?)\s*;?\s*$/.exec(s))==null?void 0:n[1])??"";return{visibility:e.visibility,name:e.name,type:e.type,isStatic:e.isStatic,isFinal:/\bfinal\b/.test(t),init:i}}function cn(a){return`${js[a.visibility]}${a.isStatic?"static ":""}${a.isFinal?"final ":""}${a.type} ${a.name}${a.init.trim()?` = ${a.init.trim()}`:""};`}function ln(a,e,t){if(e.shared)return t.name&&t.name!==e.name?me(a,e.nameFrom,e.nameTo,t.name):a;const s={...Ms(a,e),...t};return me(a,e.from,e.to,Es(a,e.from,e.to)+cn(s))}function hn(a){return{visibility:a.visibility,name:a.name,type:a.type,params:a.params,isStatic:a.isStatic,isAbstract:a.isAbstract}}function dn(a){const e=[];for(const t of a.split(",").map(s=>s.trim()).filter(Boolean)){const s=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(t),i=/^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(t);if(s)e.push({name:s[1],type:s[2].replace(/\s+/g,"")});else if(i)e.push({name:i[2],type:i[1].replace(/\s+/g,"")});else return}return e}const un=a=>a.map(e=>`${e.name}: ${e.type}`).join(", ");function pn(a,e,t,s){const i={...hn(t),...s},n=e.kind==="interface",o=t.kind==="constructor",c=`${n?"":js[i.visibility]}${i.isStatic&&!o?"static ":""}${i.isAbstract&&!n&&!o?"abstract ":""}`,l=i.params.map($=>`${$.type} ${$.name}`).join(", "),h=o?`${c}${t.name}(${l})`:`${c}${i.type||"void"} ${i.name}(${l})`,u=Es(a,t.headerFrom,t.headerTo);let f=me(a,t.headerFrom,t.headerTo,u+h);const m=u.length+h.length-(t.headerTo-t.headerFrom),g=t.headerTo+m,_=t.to+m,y=f.slice(g,_),w=!(i.isAbstract||n&&!i.isStatic);if(!w&&/^\s*(throws[^{;]*)?\{/.test(y))f=me(f,g,_,";");else if(w&&/^\s*;/.test(y)){const $=Ls(a,e),p=i.type&&i.type!=="void"&&!o?`${$} return ${i.type==="boolean"?"false":/^(int|long|short|byte|double|float|char)$/.test(i.type)?"0":"null"}; -`:"";f=me(f,g,_,` { -${p}${$}}`)}return f}function fn(a,e){const t=a.slice(0,e.headerFrom),s=/\/\*\*([\s\S]*?)\*\/\s*$/.exec(t);return s?s[1].split(` -`).map(i=>i.replace(/^\s*\*\s?/,"")).join(` -`).trim():""}function mn(a,e,t){const s=a.slice(0,e.headerFrom),i=/\/\*\*[\s\S]*?\*\/\s*$/.exec(s),n=/[ \t]*$/.exec(s)[0],o=t.trim()?`/** -${t.trim().split(` -`).map(r=>` * ${r}`.trimEnd()).join(` -`)} - */ -${n}`:"";return i?me(a,i.index,e.headerFrom,o):me(a,e.headerFrom,e.headerFrom,o)}function gt(a,e,t){const s=Ls(a,e),i=t.split(` -`).map(h=>h&&s+h).join(` -`),n=Ss(a,e.bodyEnd),o=/^\s*$/.test(a.slice(n,e.bodyEnd)),r=o?n:e.bodyEnd,c=o?"":` -`,l=e.members.length?` -`:"";return me(a,r,r,`${c}${l}${i} -`)}const yt=a=>a.members.filter(e=>e.kind==="field"&&!e.isStatic),ts=a=>a.charAt(0).toUpperCase()+a.slice(1);function bn(a,e){const t=yt(e),s=t.map(n=>`${n.type} ${n.name}`).join(", "),i=t.map(n=>` this.${n.name} = ${n.name};`).join(` -`);return gt(a,e,`public ${e.name}(${s}) { -${i}${i?` -`:""}}`)}function vn(a,e){const t=new Set(e.members.filter(i=>i.kind==="method").map(i=>i.name)),s=[];for(const i of yt(e)){const n=/\bfinal\b/.test(a.slice(i.headerFrom,i.nameFrom)),o=`${i.type==="boolean"?"is":"get"}${ts(i.name)}`,r=`set${ts(i.name)}`;t.has(o)||s.push(`public ${i.type} ${o}() { - return ${i.name}; -}`),!n&&!t.has(r)&&s.push(`public void ${r}(${i.type} ${i.name}) { - this.${i.name} = ${i.name}; -}`)}return s.length?gt(a,e,s.join(` - -`)):a}function gn(a,e){if(e.members.some(i=>i.kind==="method"&&i.name==="toString"&&i.params.length===0))return a;const t=yt(e).map((i,n)=>`"${n?", ":""}${i.name}=" + ${i.name}`),s=t.length?`"${e.name} [" + ${t.join(" + ")} + "]"`:`"${e.name} []"`;return gt(a,e,`@Override -public String toString() { - return ${s}; -}`)}const ss="VisuObject-Workspace",Xe="visuobject.json",ge=a=>a.replace(/[\\/:*?"<>|]/g,"_").trim()||"Projekt";async function yn(a,e){try{return await a.dir(e)}catch{return}}async function is(a){const e=[];for(const t of await a.list()){if(t.kind!=="directory")continue;const s=await a.dir(t.name);(await s.has("src")||await s.has(Xe))&&e.push(t.name)}return e.sort((t,s)=>t.localeCompare(s))}function Cs(a){const e=[...a.matchAll(/]*>/g)].map(t=>t[0]).filter(t=>/\bkind\s*=\s*"src"/.test(t)&&!/\bcombineaccessrules\b/.test(t)).map(t=>{var s;return((s=/\bpath\s*=\s*"([^"]+)"/.exec(t))==null?void 0:s[1])??""}).filter(t=>t&&!t.startsWith("/")&&!t.includes(":")&&t.split("/").every(Je));return e.length?[...new Set(e)]:[Z]}function wn(a,e){const t=e.map(i=>` -`).join("");return a.replace(/[ \t]*]*\bkind\s*=\s*"src"[^>]*\/>[ \t]*\n?/g,i=>/\bcombineaccessrules\b/.test(i)?i:"").replace(/(]*>[ \t]*\n?)/,`$1${t}`)}async function $n(a,e){const t=await a.dir(e),s={name:e,files:[],packages:[]},i=await t.has(".classpath")?Cs(await t.read(".classpath")):[Z],n=async(c,l,h)=>{const u=await c.list(),f=re(l,h);h&&!u.some(m=>m.kind==="file"&&/\.java$/i.test(m.name))&&s.packages.push(f);for(const m of u)m.kind==="directory"?await n(await c.dir(m.name),l,h?`${h}.${m.name}`:m.name):/\.java$/i.test(m.name)&&s.files.push({path:le(f,m.name),text:await c.read(m.name)})};for(const c of i){let l=t;for(const h of c.split("/"))l=l&&await yn(l,h);l&&await n(l,c,"")}const o=i.filter(c=>c!==Z);o.length&&(s.sourceFolders=o),s.packages=s.packages.filter(c=>!s.packages.some(l=>l.startsWith(c+"."))&&!s.files.some(l=>D(l.path).startsWith(c+"."))),s.files.sort((c,l)=>c.path.localeCompare(l.path));let r={};if(await t.has(Xe))try{const c=JSON.parse(await t.read(Xe)),l=ys(c.uml);l&&(s.uml=l);const h=vs(c.notes);h&&(s.notes=h);const u=gs(c.objects);if(u&&(s.objects=u),c.positions&&typeof c.positions=="object")for(const[f,m]of Object.entries(c.positions))typeof(m==null?void 0:m.x)=="number"&&typeof(m==null?void 0:m.y)=="number"&&(r[f]={x:m.x,y:m.y})}catch{r={}}return{project:s,positions:r}}const _n=a=>` - - ${a.replace(/[&<>]/g,e=>({"&":"&","<":"<",">":">"})[e])} - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - -`,xn=` - - - - -`;async function kn(a,e,t,s){var c,l;const i=await a.dir(e,!0),n=ue(t),o=await i.has(".classpath")?await i.read(".classpath"):void 0;for(const h of o?Cs(o):[])!n.includes(h)&&!h.includes("/")&&await i.has(h)&&await i.remove(h);for(const h of n){let u=i;for(const y of h.split("/"))u=await u.dir(y,!0);const f=t.files.filter(y=>U(y.path)===h),m=new Set(f.map(y=>y.path.slice(y.path.indexOf(":")+1))),g=new Set;for(const y of ce(t,h)){const w=y.slice(y.indexOf(":")+1);if(!w)continue;const $=w.split(".");for(let p=1;p<=$.length;p++)g.add($.slice(0,p).join("/"))}const _=async(y,w)=>{for(const $ of await y.list()){const p=w?`${w}/${$.name}`:$.name;$.kind==="directory"?g.has(p)?await _(await y.dir($.name),p):n.some(v=>`${h}/${p}`===v||v.startsWith(`${h}/${p}/`))||await y.remove($.name):/\.java$/i.test($.name)&&!m.has(p)&&await y.remove($.name)}};await _(u,"");for(const y of ce(t,h)){const w=y.slice(y.indexOf(":")+1);let $=u;for(const p of w?w.split("."):[])$=await $.dir(p,!0);for(const p of f.filter(v=>D(v.path)===y)){const v=p.path.slice(p.path.lastIndexOf("/")+1).slice(p.path.includes("/")?0:p.path.indexOf(":")+1);(!await $.has(v)||await $.read(v)!==p.text)&&await $.write(v,p.text)}}}await i.write(Xe,JSON.stringify({format:"visuobject",version:1,uml:t.uml??{},...(c=t.notes)!=null&&c.length?{notes:t.notes}:{},...(l=t.objects)!=null&&l.length?{objects:t.objects}:{},positions:s},null,2)+` -`),await i.has(".project")||await i.write(".project",_n(t.name));const r=wn(o??xn,n);r!==o&&await i.write(".classpath",r)}function ns(a,e){const t=new Set(e.map(i=>i.toLowerCase()));let s=a;for(let i=2;t.has(s.toLowerCase());i++)s=a+i;return s}const os="visuobject.project",jn="visuobject.code",ot="visuobject.active",as="visuobject.positions",rs="visuobject.tree",cs="visuobject.tabs",We="visuobject.wsProject",ls="visuobject.inspector",at="visuobject.inspectorHeight",rt="visuobject.noWorkspace",hs="visuobject.diagram",ds="visuobject.breakpoints",us="visuobject-workspace",Sn=80,b=a=>a.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]),pe=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;function se(a){try{return localStorage.getItem(a)}catch{return null}}function J(a,e){try{localStorage.setItem(a,e)}catch{}}function Ln(){return Gs("visuobject",ct())}function En(a,e,t){const s=URL.createObjectURL(new Blob([e],{type:t})),i=document.createElement("a");i.href=s,i.download=a,i.click(),setTimeout(()=>URL.revokeObjectURL(s),1e3)}const Mn='';class Cn{constructor(e){E(this,"shell");E(this,"editor");E(this,"canvas");E(this,"lines");E(this,"frames");E(this,"status");E(this,"tree");E(this,"tabs");E(this,"openTabs",[]);E(this,"project");E(this,"active");E(this,"currentPackage");E(this,"classes",[]);E(this,"positions",new Map);E(this,"selection");E(this,"relSelection");E(this,"inspector");E(this,"tool","select");E(this,"pendingFrom");E(this,"suppressClick",!1);E(this,"treeSelection");E(this,"open",new Map);E(this,"history",[]);E(this,"future",[]);E(this,"lastTyping",0);E(this,"editing",!1);E(this,"objectDiagram");E(this,"diagramMode",["object","sequence"].find(e=>e===se(hs))??"class");E(this,"sequence");E(this,"noteSelection");E(this,"workspace");E(this,"pendingFolder");E(this,"projects",[]);E(this,"folder");E(this,"saved");E(this,"savedFiles",new Map);E(this,"wsBox");E(this,"breakpoints",new Map);E(this,"dbg");E(this,"renameTimer");E(this,"treeClick",{node:"",time:0});E(this,"drag");E(this,"lastClick",{spot:"",time:0});E(this,"endPop");E(this,"classTab","class");var i;document.documentElement.classList.add("visuobject-theme"),history.replaceState(history.state,"",`${location.pathname}?visuobject${location.hash}`);try{const n=JSON.parse(se(as)??"{}");for(const[c,l]of Object.entries(n))Number.isFinite(l==null?void 0:l.x)&&Number.isFinite(l==null?void 0:l.y)&&this.positions.set(c,l);const o=JSON.parse(se(rs)??"{}");for(const[c,l]of Object.entries(o))this.open.set(c,!!l);const r=JSON.parse(se(ds)??"{}");for(const[c,l]of Object.entries(r))Array.isArray(l)&&this.breakpoints.set(c,new Set(l.filter(Number.isInteger)))}catch{}const t=se(jn);this.project=qt(se(os)??"")??(t!==null?At("Projekt",[{name:"",text:t}]):Ft());const s=se(ot);this.active=this.project.files.some(n=>n.path===s)?s:(i=this.project.files[0])==null?void 0:i.path;try{const n=JSON.parse(se(cs)??"[]");Array.isArray(n)&&(this.openTabs=n.filter(o=>typeof o=="string"&&this.project.files.some(r=>r.path===o)))}catch{}this.shell=document.createElement("div"),this.shell.className="shell visuobject",e.replaceWith(this.shell),this.build(),new tn(this.shell.querySelector(".vo-columns"),()=>this.drawLines()),this.showActive(),this.refresh(),window.addEventListener("keydown",n=>this.onKey(n)),window.addEventListener("resize",()=>this.drawLines()),window.addEventListener("beforeunload",n=>{this.isDirty()&&n.preventDefault()}),this.restoreWorkspace()}build(){const e=(p,v,x,L=v)=>``;this.shell.innerHTML=` -
    - VisuObject ${b(d("web_visuobject_subtitle"))} -
    - ${e("new",d("toolbar_new"),ie.newFile,d("web_visuobject_new_tip"))} - ${e("open",d("menu_open"),ie.open,d("web_visuobject_open_tip"))} - ${e("save",d("menu_save"),ie.save,d("web_visuobject_save_tip"))} - ${e("undo",d("toolbar_undo"),ie.undo)} - ${e("redo",d("toolbar_redo"),ie.redo)} - -
    -
    - - - - -
    -
    - - -
    -
    -
    -
    - -
    -

    ${b(d("web_visuobject_explorer"))}

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

    ${b(d("web_visuobject_inspector"))}

    - -
    -
    -
    -

    ${b(d("web_visuobject_edit_hint"))}
    -
    -
    `,this.canvas=this.shell.querySelector(".vo-canvas:not(.vo-objcanvas):not(.vo-seqcanvas)"),this.shell.querySelector(".vo-seqcanvas").addEventListener("click",p=>{var L,S,k;const v=(L=p.target.closest("[data-ev]"))==null?void 0:L.dataset.ev,x=v!==void 0?(k=(S=this.sequence)==null?void 0:S.events[Number(v)])==null?void 0:k.pos:void 0;x!=null&&x.file&&this.showLine(x.file,x.line)});const t=this.shell.querySelector(".vo-objcanvas");this.objectDiagram=new Ai({canvas:t,lines:t.querySelector(".vo-objlines"),inspector:this.shell.querySelector(".vo-inspector"),classes:()=>this.classes,objects:()=>this.project.objects??[],setObjects:p=>this.setProject({...this.project,objects:p.length?p:void 0}),message:p=>this.message(p)});for(const p of this.shell.querySelectorAll("[data-diagram]"))p.addEventListener("click",()=>this.setDiagramMode(p.dataset.diagram));this.shell.querySelector("[data-obj-add]").addEventListener("click",()=>{const p=this.shell.querySelector("[data-obj-class]").value;p&&this.objectDiagram.add(p)}),this.lines=this.canvas.querySelector(".vo-lines"),this.frames=this.canvas.querySelector(".vo-frames"),this.status=this.shell.querySelector(".vo-status"),this.inspector=this.shell.querySelector(".vo-inspector");const s=this.shell.querySelector(".vo-dock"),i=s.querySelector("[data-inspector=toggle]"),n=(p,v=!0)=>{s.classList.toggle("collapsed",!p),i.textContent=p?"–":"+",i.setAttribute("aria-expanded",String(p));const x=d(p?"web_visuobject_inspector_hide":"web_visuobject_inspector_show");i.setAttribute("aria-label",x),i.dataset.tip=x,J(ls,p?"1":"0"),v&&this.drawLines()};i.addEventListener("click",()=>n(s.classList.contains("collapsed"))),s.querySelector(".vo-dock-bar").addEventListener("dblclick",()=>n(s.classList.contains("collapsed"))),n(se(ls)!=="0",!1);const o=this.shell.querySelector(".vo-hsplit"),r=this.shell.querySelector("[data-pane=diagram]"),c=p=>{if(p===void 0)this.inspector.style.removeProperty("height"),this.inspector.style.removeProperty("max-height"),J(at,"");else{const v=Math.max(120,r.clientHeight-200),x=Math.round(Math.min(v,Math.max(60,p)));this.inspector.style.height=`${x}px`,this.inspector.style.maxHeight="none",J(at,String(x))}this.drawLines()},l=Number(se(at));l>0&&(this.inspector.style.height=`${l}px`,this.inspector.style.maxHeight="none"),o.addEventListener("pointerdown",p=>{if(s.classList.contains("collapsed")||p.button!==0)return;p.preventDefault(),o.setPointerCapture(p.pointerId);const v=p.clientY,x=this.inspector.offsetHeight;o.classList.add("dragging");const L=k=>c(x-(k.clientY-v)),S=()=>{o.classList.remove("dragging"),o.removeEventListener("pointermove",L),o.removeEventListener("pointerup",S),o.removeEventListener("pointercancel",S)};o.addEventListener("pointermove",L),o.addEventListener("pointerup",S),o.addEventListener("pointercancel",S)}),o.addEventListener("dblclick",()=>c(void 0)),o.addEventListener("keydown",p=>{const v=p.key==="ArrowUp"?20:p.key==="ArrowDown"?-20:0;v&&(p.preventDefault(),c(this.inspector.offsetHeight+v))}),this.tree=this.shell.querySelector(".vo-tree"),this.tabs=this.shell.querySelector(".vo-tabs"),this.wsBox=this.shell.querySelector(".vo-ws"),this.wsBox.addEventListener("click",p=>void this.onWorkspaceClick(p)),this.editor=new Bs(this.shell.querySelector(".vo-editor"),{onChange:()=>this.typed(),onCaret:()=>this.caretMoved(),onUndo:p=>this.undo(p),words:()=>({condition:d("canvas_stub_condition"),selector:d("web_live_ph_selector"),code:d("web_live_ph_code"),start:d("inspector_for_init"),step:d("inspector_for_step"),branch:d("element_verzweigung"),branchElse:d("element_verzweigung"),switchCase:d("element_fallauswahl"),forLoop:d("element_forSchleife"),whileLoop:d("element_whileSchleife"),doLoop:d("element_doUntilSchleife"),output:d("inspector_io_mode_output"),input:d("inspector_io_mode_input")}),breakpointLine:p=>p,onBreakpoints:()=>this.saveBreakpoints(),ownTypes:p=>this.ownTypesAt(p)},d("web_visuobject_code"));const h=(p,v)=>this.shell.querySelector(`[data-action=${p}]`).addEventListener("click",v);h("new",()=>void this.newProject({name:d("web_visuobject_project_name"),files:[],packages:[]})),h("example",()=>void this.newProject(Ft(),"tiere/Tier.java")),h("open",()=>this.openFiles()),h("save",()=>void this.save()),h("undo",()=>this.undo(!1)),h("redo",()=>this.undo(!0));const u=this.shell.querySelector("[data-action=new-menu]"),f=this.shell.querySelector(".vo-new-menu"),m=p=>{var v;f.hidden=!p,u.setAttribute("aria-expanded",String(p)),p&&((v=f.querySelector("button"))==null||v.focus())};u.addEventListener("click",()=>m(f.hidden)),f.addEventListener("click",p=>{var x;const v=(x=p.target.closest("[data-new]"))==null?void 0:x.dataset.new;v&&(m(!1),this.newFromWizard(v))}),f.addEventListener("keydown",p=>{var L;const v=[...f.querySelectorAll("button")],x=v.indexOf(document.activeElement);p.key==="Escape"?(m(!1),u.focus()):(p.key==="ArrowDown"||p.key==="ArrowUp")&&(p.preventDefault(),(L=v[(x+(p.key==="ArrowDown"?1:v.length-1))%v.length])==null||L.focus())}),document.addEventListener("pointerdown",p=>{!f.hidden&&!p.target.closest(".vo-new")&&m(!1)}),h("layout",()=>{this.positions.clear(),this.savePositions(),this.render()});const g=this.shell.querySelector("[data-action=settings]"),_=this.shell.querySelector(".settings-menu");g.addEventListener("click",()=>{_.hidden=!_.hidden,g.setAttribute("aria-expanded",String(!_.hidden))}),document.addEventListener("pointerdown",p=>{!_.hidden&&!p.target.closest(".settings")&&(_.hidden=!0)});for(const p of _.querySelectorAll("[data-world]"))p.addEventListener("click",()=>this.chooseWorld(p.dataset.world));const y=_.querySelector("[data-action=code-scopes]");y.checked=Ws(),y.addEventListener("change",()=>zs(y.checked)),this.shell.querySelector("[data-action=run]").addEventListener("click",()=>void this.runProgram()),this.shell.querySelector("[data-action=stop]").addEventListener("click",()=>this.dbg?this.stopDebug("web_visuobject_stopped"):void this.stopProgram()),this.shell.querySelector("[data-action=debug]").addEventListener("click",()=>void this.startDebug());for(const p of this.shell.querySelectorAll("[data-dbg]"))p.addEventListener("click",()=>this.debugCommand(p.dataset.dbg));const w=this.shell.querySelector(".vo-console-input");w.addEventListener("submit",p=>{p.preventDefault();const v=w.querySelector("input");this.debugInput(v.value),v.value=""}),window.addEventListener("keydown",p=>{const v={F5:"into",F6:"over",F7:"out",F8:"continue"}[p.key];!v||!this.dbg||(p.preventDefault(),this.debugCommand(v))});const $=this.shell.querySelector(".vo-console");$.querySelector("[data-console=clear]").addEventListener("click",()=>$.querySelector(".vo-console-lines").replaceChildren()),$.querySelector("[data-console=hide]").addEventListener("click",()=>$.hidden=!0),this.canvas.addEventListener("pointerdown",p=>this.onPointerDown(p)),this.canvas.addEventListener("click",p=>this.onClick(p)),this.canvas.addEventListener("contextmenu",p=>{const v=p.target.closest("[data-end]");v&&(p.preventDefault(),this.relSelection!==v.dataset.rel&&this.selectRelation(v.dataset.rel),this.openEnd(v.dataset.rel,v.dataset.end,p))}),this.tree.addEventListener("click",p=>this.onTreeClick(p)),this.tabs.addEventListener("click",p=>this.onTabClick(p));for(const p of this.shell.querySelectorAll(".vo-tool"))p.addEventListener("pointerdown",v=>this.onToolDown(v,p.dataset.tool));this.tree.addEventListener("keydown",p=>this.onTreeKey(p))}mainClass(){const e=this.classes.filter(s=>s.members.some(i=>i.kind==="method"&&i.name==="main"&&i.isStatic)),t=e.find(s=>s.path===this.active)??e[0];return t&&(t.pkg?`${t.pkg}.${t.name}`:t.name)}async runProgram(){const e=this.shell.querySelector(".vo-console"),t=e.querySelector(".vo-console-lines"),s=e.querySelector(".vo-console-status"),i=e.querySelector(".vo-swing"),n=this.shell.querySelector("[data-action=run]"),o=this.shell.querySelector("[data-action=stop]");e.hidden=!1;const r=(l,h=!1,...u)=>{s.textContent=d(l,...u),s.classList.toggle("error",h)},c=this.mainClass();if(!c)return r("web_visuobject_no_main",!0);this.workspace&&await this.writeCurrent(),await Ye().catch(()=>{}),t.replaceChildren();for(const l of document.querySelectorAll("#console"))l.removeAttribute("id");t.id="console",i.hidden=!0,n.disabled=!0,o.disabled=!1;try{r("web_live_swing_loading"),await Vs(i.querySelector(".livecode-swing-display")),r("web_live_swing_compiling");const l=this.project.files.map(u=>({pkg:X(D(u.path)),name:Q(u.path).replace(/\.java$/i,""),text:u.text})),{result:h}=await Us(l,c,()=>{i.hidden=!1,r("web_visuobject_running_fmt",!1,c)});r({"compile-error":"web_live_swing_compile_failed",windows:"web_live_swing_running",finished:"web_live_run_finished"}[h],h==="compile-error"),i.hidden=h!=="windows",o.disabled=h!=="windows"}catch{r("web_live_swing_failed",!0),o.disabled=!0}n.disabled=!1}async stopProgram(){await Ye().catch(()=>{});const e=this.shell.querySelector(".vo-console");e.querySelector(".vo-swing").hidden=!0;const t=e.querySelector(".vo-console-status");t.textContent=d("web_visuobject_stopped"),t.classList.remove("error"),this.shell.querySelector("[data-action=stop]").disabled=!0}saveBreakpoints(){if(!this.active)return;const e=this.editor.breakpoints;e.size?this.breakpoints.set(this.active,e):this.breakpoints.delete(this.active);const t=new Set(this.project.files.map(s=>s.path));J(ds,JSON.stringify(Object.fromEntries([...this.breakpoints].filter(([s])=>t.has(s)).map(([s,i])=>[s,[...i]]))))}consolePane(){const e=this.shell.querySelector(".vo-console");return{pane:e,lines:e.querySelector(".vo-console-lines"),status:e.querySelector(".vo-console-status"),input:e.querySelector(".vo-console-input")}}debugStatus(e,t=!1){const{status:s}=this.consolePane();s.textContent=e,s.classList.toggle("error",t)}consoleWrite(e,t="out"){const{lines:s}=this.consolePane(),i=s.lastElementChild;if((i==null?void 0:i.dataset.kind)===t)i.textContent+=e;else{const n=document.createElement("span");n.dataset.kind=t,n.className=`vo-out-${t}`,n.textContent=e,s.append(n)}s.scrollTop=s.scrollHeight}async startDebug(){this.dbg&&this.stopDebug();const{pane:e,lines:t,input:s}=this.consolePane();e.hidden=!1,e.querySelector(".vo-swing").hidden=!0,await Ye().catch(()=>{}),this.workspace&&await this.writeCurrent(),t.replaceChildren(),t.removeAttribute("id"),s.hidden=!0;const i=this.mainClass();if(!i)return this.debugStatus(d("web_visuobject_no_main"),!0);let n;try{n=new Ji(this.project.files.map(o=>({path:o.path,source:o.text})),{out:(o,r)=>this.consoleWrite(o,r?"err":"out")}),n.start(i.split(".").pop())}catch(o){if(o instanceof q)return this.debugError(o);throw o}this.dbg={vm:n,state:"running",frames:[],frame:0,places:new Map,values:new Map,vars:new Map},this.shell.querySelector(".vo-dbg-controls").hidden=!1,this.shell.querySelector("[data-action=stop]").disabled=!1,this.shell.querySelector("[data-action=run]").disabled=!0,this.sequence=void 0,this.diagramMode==="class"&&this.setDiagramMode("object"),n.go(this.allBreakpoints().size?"run":"into"),this.debugRun()}allBreakpoints(){const e=new Set;for(const[t,s]of this.breakpoints)for(const i of s)e.add(`${t}:${i}`);return e}debugCommand(e){const t=this.dbg;if(t){if(e==="pause")return t.state!=="running"?void 0:(t.vm.pause(),clearTimeout(t.timer),this.debugRun());t.state==="paused"&&(t.vm.go(e==="continue"?"run":e),this.debugRun())}}debugRun(){const e=this.dbg;if(!e)return;e.state="running",this.showDebugButtons(),this.debugStatus(d("web_visuobject_dbg_running"));const t=this.allBreakpoints(),s=performance.now();for(;;){const i=e.vm.run(t,2e3);if(i.k==="running"){if(performance.now()-s<15)continue;e.timer=window.setTimeout(()=>this.debugRun(),0);return}if(i.k==="sleep"){e.timer=window.setTimeout(()=>this.debugRun(),Math.min(i.ms,1e4));return}if(i.k==="input"){e.state="input",this.showDebugButtons(),this.showDebugState(),this.debugStatus(d("web_visuobject_dbg_waiting"));const{input:n}=this.consolePane();n.hidden=!1,n.querySelector("input").focus();return}if(i.k==="paused"){e.state="paused",e.frame=0,this.showDebugButtons(),this.showDebugState(),this.debugStatus(d("web_visuobject_dbg_paused_fmt",i.pos.file.split("/").pop()??"",String(i.pos.line+1)));return}return i.k==="done"?this.stopDebug("web_live_run_finished"):i.k==="exception"?(this.consoleWrite(`${i.text} -`,"err"),i.pos&&this.showLine(i.pos.file,i.pos.line),this.stopDebug("web_visuobject_dbg_exception",!0)):this.debugError(i.error)}}debugInput(e){const t=this.dbg;!t||t.state!=="input"||(this.consoleWrite(`${e} -`,"in"),this.consolePane().input.hidden=!0,t.vm.input(e),this.debugRun())}debugError(e){var o;const t=e.pos?String(e.pos.line+1):"",s=((o=e.pos)==null?void 0:o.file.split("/").pop())??"",i=e.detail.replace(/^expected:/,""),n={syntax:"web_visuobject_dbg_err_syntax",symbol:"web_visuobject_dbg_err_symbol",unsupported:"web_visuobject_dbg_err_unsupported",nomain:"web_visuobject_no_main",type:"web_visuobject_dbg_err_type",import:"web_visuobject_dbg_err_import",typename:"web_visuobject_dbg_err_typename"}[e.code];e.pos&&this.showLine(e.pos.file,e.pos.line),this.stopDebug(),this.debugStatus(d(n,s,t,i),!0)}showDebugButtons(){const e=this.dbg,t=(e==null?void 0:e.state)==="paused";for(const s of this.shell.querySelectorAll("[data-dbg]"))s.disabled=!e||(s.dataset.dbg==="pause"?e.state!=="running":!t)}showLine(e,t){this.project.files.some(s=>s.path===e)&&e!==this.active&&this.openFile(e),this.editor.setMarks({placeholders:[],problems:[],current:t},!0)}showDebugState(){const e=this.dbg;if(!e)return;e.frames=e.vm.stack();const t=e.vm.heap(),s=e.frames[e.frame];s&&this.showLine(s.pos.file,s.pos.line);const i=e.values.size===0&&e.vars.size===0,n=new Set,o=new Map;for(const h of t)for(const u of h.fields){const f=`dbg${h.id}.${u.name}`;o.set(f,u.value),!i&&e.values.get(f)!==u.value&&n.add(f)}e.values=o;const r=new Set,c=new Map;e.frames.forEach((h,u)=>{for(const f of h.vars){const m=`${e.frames.length-u}|${h.title}|${f.name}`;c.set(m,f.value),!i&&e.vars.get(m)!==f.value&&r.add(`${h.title}|${f.name}`)}}),e.vars=c;const l={objects:this.liveObjects(t),changed:n,frames:e.frames,frame:e.frame,changedVars:r,onFrame:h=>{e.frame=h,l.frame=h;const u=e.frames[h];u&&this.showLine(u.pos.file,u.pos.line),this.objectDiagram.renderInspector()},move:(h,u)=>e.places.set(h,u)};this.objectDiagram.live=l,this.sequence=e.vm.sequence(),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}renderSequence(){var n,o,r;const e=this.shell.querySelector(".vo-seqcanvas"),t=e.querySelector(".vo-seq"),s=e.querySelector(".vo-empty"),i=this.sequence;if(s.hidden=!!i&&i.events.length>0,s.textContent=d(i?"web_visuobject_seq_no_calls":"web_visuobject_seq_empty"),!i||!i.events.length)t.innerHTML="",t.setAttribute("width","0");else{const c=((n=this.dbg)==null?void 0:n.state)==="paused"||((o=this.dbg)==null?void 0:o.state)==="input",{svg:l,width:h,height:u}=qi(i,c?i.events.length-1:void 0);t.innerHTML=l+(i.truncated?`${b(d("web_visuobject_seq_truncated"))}`:""),t.setAttribute("width",String(h)),t.setAttribute("height",String(u)),c&&((r=t.querySelector(".vo-seq-msg.current"))==null||r.scrollIntoView({block:"nearest",inline:"nearest"}))}this.renderSequenceInspector()}renderSequenceInspector(){if(this.objectDiagram.live)return this.objectDiagram.renderInspector();this.inspector.innerHTML=`

    ${b(d("web_visuobject_seq_hint"))}

    `}liveObjects(e){const t=this.dbg,s=this.project.objects??[],i=c=>40+c.fields.length*20,n=[],o=[],r=[];for(const c of e){const l=`dbg${c.id}`,h=t.places.get(l)??s.find(u=>u.name===c.name&&u.cls===c.cls);if(!h){r.push(c);continue}t.places.set(l,{x:h.x,y:h.y}),n.push({x:h.x,y:h.y,w:260,h:i(c)})}for(const c of r){const l=i(c);let h={x:24,y:24};e:for(let u=24;u<6e3;u+=30)for(let f=24;f<=24+3*320;f+=320)if(n.every(m=>f+260+30<=m.x||m.x+m.w+30<=f||u+l+30<=m.y||m.y+m.h+30<=u)){h={x:f,y:u};break e}t.places.set(`dbg${c.id}`,h),n.push({...h,w:260,h:l})}for(const c of e){const l=`dbg${c.id}`;o.push({id:l,name:c.name,cls:c.cls,...t.places.get(l),values:Object.fromEntries(c.fields.map(h=>[h.name,h.value]))})}return o}stopDebug(e,t=!1){const s=this.dbg;s&&clearTimeout(s.timer),this.dbg=void 0,s&&(this.sequence=s.vm.sequence()),this.objectDiagram.live=void 0,this.consolePane().input.hidden=!0,this.shell.querySelector(".vo-dbg-controls").hidden=!0,this.shell.querySelector("[data-action=stop]").disabled=!0,this.shell.querySelector("[data-action=run]").disabled=!1,t||this.editor.setMarks({placeholders:[],problems:[]},!1),e&&this.debugStatus(d(e),t),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}chooseWorld(e){if(e!=="object"){if(e==="flow"){Js(),location.href=`${location.pathname}?visuflow${location.hash}`;return}Ks(e),location.href=`${location.pathname}?${e==="on"?"visubot":"visustruct"}${location.hash}`}}get activeFile(){return this.project.files.find(e=>e.path===this.active)}showActive(){const e=this.activeFile;this.editor.setText((e==null?void 0:e.text)??""),this.editor.setBreakpoints(e?this.breakpoints.get(e.path)??[]:[]),this.editor.setReadOnly(!e),e&&!this.openTabs.includes(e.path)&&this.openTabs.push(e.path),this.renderTabs(),J(ot,this.active??"")}renderTabs(){if(this.openTabs=this.openTabs.filter(e=>this.project.files.some(t=>t.path===e)),J(cs,JSON.stringify(this.openTabs)),this.openTabs.length===0){this.tabs.innerHTML=`${b(d("web_visuobject_no_file"))}`;return}this.tabs.innerHTML=this.openTabs.map(e=>{const t=e===this.active,s=this.isDirty(e);return`
    - - -
    `}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>Sn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Xi([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-DtugKwEc.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-DtugKwEc.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);En(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Xs(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await $n(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await kn(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await rn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(gi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(bi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(on(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} - ${s("zip",d("web_visuobject_ws_zip"),"text-button",d("web_visuobject_ws_zip_tip"))} - ${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):this.pendingFolder?(e.className="vo-ws",e.innerHTML=`${s("reopen",d("web_visuobject_ws_reopen",this.pendingFolder.name),"text-button primary")}${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):se(rt)==="1"?(e.className="vo-ws",e.innerHTML=s("open",d("web_visuobject_ws_choose"),"text-button",d("web_visuobject_ws_hint"))):(e.className="vo-ws ask",e.innerHTML=`

    ${b(d("web_visuobject_ws_question"))}

    -

    ${b(d("web_visuobject_ws_hint"))}

    - ${s("create",d("web_visuobject_ws_create",ss),"text-button primary")} - ${s("open",d("web_visuobject_ws_open"))} - ${s("skip",d("web_visuobject_ws_skip"))}`)}async onWorkspaceClick(e){var s;const t=(s=e.target.closest("[data-ws]"))==null?void 0:s.dataset.ws;if(t){if(t==="zip")return this.downloadZip();if(t==="skip")return J(rt,"1"),this.renderWorkspace();try{if(t==="reopen"&&this.pendingFolder){const n=await _t(this.pendingFolder);n&&await this.useWorkspace(n.root,!0);return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=await Ys(t==="create"?ss:void 0,us);J(We,""),await this.useWorkspace(i.root)}catch(i){(i==null?void 0:i.name)!=="AbortError"&&this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}}}changeFile(e,t,s){const i=this.project.files.find(n=>n.path===e);i&&(s&&(this.selection=s),this.message(""),this.setProject($e(this.project,e,t(i.text)),e))}uniqueClassName(e){let t=e;for(let s=2;this.findClass(t)||this.project.files.some(i=>Q(i.path)===`${t}.java`);s++)t=e+s;return t}newClass(e,t){const s=this.uniqueClassName(d(e==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name"));t&&this.positions.set(s,{x:Math.max(0,Math.round(t.x)),y:Math.max(0,Math.round(t.y))});const i=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??""),n=le(i,`${s}.java`);this.selection={cls:s},this.open.set(`pkg:${i}`,!0),this.setProject(et(this.project,n,this.sectioned(_i(i,s,e),s)),n),this.savePositions();const o=this.findClass(s);o&&this.showInCode(o);const r=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(s)}"]`);r==null||r.scrollIntoView({block:"nearest",inline:"nearest"}),this.startEditing((r==null?void 0:r.querySelector(".uml-name"))??null)}renameClassTo(e,t){if(t===e.name)return;if(!pe.test(t)||this.findClass(t))return this.message(d("web_visuobject_bad_name",t));const s=this.project.files.find(r=>r.path===e.path);let i=$e(this.project,e.path,ri(s.text,e,t)),n=e.path;Q(e.path)===`${e.name}.java`&&(n=le(D(e.path),`${t}.java`),i.files.some(r=>r.path===n)?n=e.path:i=Oe(i,e.path,n));const o=this.positions.get(e.name);o&&this.positions.set(t,o);for(const r of Object.keys(i.uml??{}))r.startsWith(`${e.name}.`)&&(i={...i,uml:ke(i.uml,r,t+r.slice(e.name.length))});this.selection={cls:t},this.message(""),this.setProject(i,n)}deleteClassFromProject(e){const t=this.project.files.find(n=>n.path===e.path),s=ai(t.text,e),i=oe(s).length===0;this.selection=void 0,this.message(""),this.setProject(i?Tt(this.project,e.path):$e(this.project,e.path,s))}commit(e,t){var u,f;const s=t.trim(),i=(u=e.closest("[data-node]"))==null?void 0:u.dataset.node;if(i)return this.commitTree(i,s);const n=e.closest(".uml-class"),o=n&&this.findClass(n.dataset.class);if(!o)return;if(e.classList.contains("uml-name"))return this.renameClassTo(o,s);const r=e.dataset.add;if(r){if(!s)return;const m=Ve(s);if(!m)return this.message(d("web_visuobject_bad_line",s));const g=r==="method"&&m.kind==="field"?`${s}()`:s;this.changeFile(o.path,_=>this.sorted(Ee(_,o,g),o.name),{cls:o.name});return}const c=Number(e.dataset.member),l=o.members[c];if(!l)return;if(!s){this.changeFile(o.path,m=>xe(m,l),{cls:o.name});return}if(s===Ge(l))return;const h=Ve(s);if(!h)return this.message(d("web_visuobject_bad_line",s));if(l.kind==="field"&&h.kind==="field"&&h.name!==l.name&&((f=this.project.uml)!=null&&f[V(o.name,l.name)])){const m=this.project.files.find(g=>g.path===o.path);this.selection={cls:o.name,member:c},this.setProject({...$e(this.project,o.path,Qe(m.text,o,l,s)),uml:ke(this.project.uml,V(o.name,l.name),V(o.name,h.name))},o.path);return}this.changeFile(o.path,m=>Qe(m,o,l,s),{cls:o.name,member:c})}commitTree(e,t){const[s,...i]=e.split(":"),n=i.join(":");if(s==="project"){if(!t||t===this.project.name)return;if(this.projects.some(r=>r!==this.folder&&r.toLowerCase()===ge(t).toLowerCase()))return this.message(d("web_visuobject_ws_taken",t));this.setProject({...this.project,name:t})}else if(s==="root"){if(!t||t===n||n===Z)return;if(!Je(t)||ue(this.project).includes(t))return this.message(d("web_visuobject_bad_folder",t));this.currentPackage&&U(this.currentPackage)===n&&(this.currentPackage=re(t,X(this.currentPackage))),this.treeSelection=`root:${t}`;const o=r=>r&&U(r)===n?`${t}:${r.slice(n.length+1)}`:r;this.openTabs=this.openTabs.map(r=>o(r)),this.setProject(yi(this.project,n,t),o(this.active))}else if(s==="pkg"){const o=re(U(n),t);if(!t||o===n)return;if(!Mt(t)||ce(this.project).includes(o))return this.message(d("web_visuobject_bad_package",t));this.currentPackage===n&&(this.currentPackage=o),this.treeSelection=`pkg:${o}`,this.open.set(`pkg:${o}`,!0),this.setProject(vi(this.project,n,o),this.active&&D(this.active)===n?le(o,Q(this.active)):this.active)}else if(s==="file"){const o=t.replace(/\.java$/i,""),r=this.classes.find(l=>l.path===n&&`${l.name}.java`===Q(n));if(r)return this.renameClassTo(r,o);if(!pe.test(o))return this.message(d("web_visuobject_bad_name",o));const c=le(D(n),`${o}.java`);c!==n&&!this.project.files.some(l=>l.path===c)&&this.setProject(Oe(this.project,n,c),c)}else if(s==="class"){const o=this.findClass(n);o&&this.renameClassTo(o,t)}}startEditing(e){if(!e||this.editing)return;const t=e.classList.contains("uml-name")||e.classList.contains("vo-label"),s=document.createElement("input");s.className="uml-input",s.spellcheck=!1,s.autocapitalize="off",s.setAttribute("autocomplete","off"),s.setAttribute("aria-label",d(t?"web_visuobject_name_label":"web_visuobject_member_label")),e.dataset.add&&(s.placeholder=d(e.dataset.add==="field"?"web_visuobject_field_ph":"web_visuobject_method_ph")),s.value=e.dataset.add?"":e.dataset.value??e.textContent??"",s.size=Math.max(s.value.length,s.placeholder.length,8),e.replaceChildren(s),this.editing=!0;let i=!1;const n=o=>{i||(i=!0,this.editing=!1,o&&this.commit(e,s.value),this.render(),this.renderTree())};s.addEventListener("keydown",o=>{o.stopPropagation(),o.key==="Enter"?n(!0):o.key==="Escape"&&n(!1)}),s.addEventListener("click",o=>o.stopPropagation()),s.addEventListener("input",()=>s.size=Math.max(s.value.length,s.placeholder.length,8)),s.addEventListener("blur",()=>n(!0)),s.focus(),s.select()}onKey(e){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="s"){e.preventDefault(),this.save();return}if(e.key==="Escape"&&this.endPop){this.closeEnd();return}if(e.key==="Escape"&&this.tool!=="select"){this.setTool("select");return}if(this.editing||this.editor.hasFocus)return;const t=e.target;if(this.diagramMode==="object"&&!t.closest("input, select, textarea")&&!(e.metaKey||e.ctrlKey)&&this.objectDiagram.onKey(e)||t.closest("input, select, textarea, .vo-tree"))return;if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="z"){e.preventDefault(),this.undo(e.shiftKey);return}if(!this.canvas.contains(document.activeElement)&&document.activeElement!==document.body)return;if(this.noteSelection&&this.findNote(this.noteSelection)){e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteNote(this.noteSelection)):(e.key==="Enter"||e.key==="F2")&&(e.preventDefault(),this.editNote(this.noteSelection));return}if(this.relSelection&&(e.key==="Delete"||e.key==="Backspace")){e.preventDefault(),this.deleteRelation(this.relSelection);return}const i=this.selection,n=i&&this.findClass(i.cls);if(n){if(e.key==="Delete"||e.key==="Backspace"){e.preventDefault();const o=i.member!==void 0?n.members[i.member]:void 0;o?this.changeFile(n.path,r=>xe(r,o),{cls:n.name}):this.deleteClassFromProject(n)}else if(e.key==="Enter"||e.key==="F2"){e.preventDefault();const o=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n.name)}"]`);this.startEditing((o==null?void 0:o.querySelector(i.member!==void 0?`[data-member="${i.member}"]`:".uml-name"))??null)}}}isOpen(e){if(e.startsWith("wsproject:"))return!1;const t=this.open.get(e);return t!==void 0?t:e.startsWith("file:")?e===`file:${this.active}`:!0}toggle(e){this.open.set(e,!this.isOpen(e)),J(rs,JSON.stringify(Object.fromEntries(this.open))),this.renderTree()}renderTree(){var f,m,g,_;const e=(m=(f=document.activeElement)==null?void 0:f.closest("[data-node]"))==null?void 0:m.dataset.node,t=this.treeSelection??(this.selection?`class:${this.selection.cls}`:this.active?`file:${this.active}`:void 0),s=(y,w,$,p,v={})=>{const x=v.children!==void 0,L=x&&this.isOpen(y),S=y===t;return`
  • -
    - ${x?``:''} - ${$}${b(p)}${v.extra??""} - ${v.action?``:""} -
    - ${L&&v.children?`
      ${v.children}
    `:""} -
  • `},i=(y,w,$,p)=>{const v={"+":"public","-":"private","#":"protected","~":"package"}[w.visibility],x=w.params.map(k=>k.type).join(", "),L=w.kind==="field"?w.name:`${w.name}(${x})`,S=w.kind==="constructor"?"":`: ${b(w.type)}`;return s(`member:${y.name}:${$}`,p,``,L,{extra:S,title:Ge(w)})},n=(y,w)=>{const $=y.kind==="interface"?"I":y.isAbstract?"A":"C",p=y.members.map((v,x)=>i(y,v,x,w+1)).join("");return s(`class:${y.name}`,w,``,y.name,{children:p})},o=(y,w)=>{const $=this.classes.filter(p=>p.path===y);return s(`file:${y}`,w,'',Q(y),{children:$.map(p=>n(p,w+1)).join(""),action:!0})},r=y=>ce(this.project,y).map(w=>{const $=fi(this.project,w).map(x=>o(x.path,3)).join(""),p=X(w),v=p||d("web_visuobject_default_package");return s(`pkg:${w}`,2,``,v,{children:$,value:p,action:!0})}).join(""),c=ue(this.project).map(y=>s(`root:${y}`,1,'',y,{children:r(y)||`
  • ${b(d("web_visuobject_tree_empty"))}
  • `,action:y!==Z})).join(""),l=s("project",0,'',this.project.name,{children:c,extra:this.isDirty()?` ●`:""}),u=[...(this.workspace?this.projects.filter(y=>y!==this.folder):[]).map(y=>({name:y,html:s(`wsproject:${y}`,0,'',y,{children:"",title:d("web_visuobject_ws_open_project",y)})})),{name:this.folder??this.project.name,html:l}];u.sort((y,w)=>y.name.localeCompare(w.name)),this.tree.innerHTML=`
      ${u.map(y=>y.html).join("")}
    `,this.tree.querySelector('[tabindex="0"]')||(g=this.tree.querySelector(".vo-row"))==null||g.setAttribute("tabindex","0"),e&&((_=this.tree.querySelector(`[data-node="${CSS.escape(e)}"] > .vo-row`))==null||_.focus({preventScroll:!0}))}onTreeClick(e){if(this.editing)return;const t=e.target,s=t.closest("[data-node]"),i=s==null?void 0:s.dataset.node;if(!s||!i)return;if(t.closest("[data-toggle]"))return i.startsWith("wsproject:")?void this.switchProject(i.slice(10)):this.toggle(i);if(t.closest("[data-delete]"))return this.deleteNode(i);const n=Date.now(),o=this.treeClick.node===i&&n-this.treeClick.time<450;if(this.treeClick={node:i,time:o?0:n},o&&!i.startsWith("member:")&&!i.startsWith("wsproject:")&&i!==`root:${Z}`){this.startEditing(this.tree.querySelector(`[data-node="${CSS.escape(i)}"] > .vo-row .vo-label`));return}this.selectNode(i)}selectNode(e){const[t,...s]=e.split(":"),i=s.join(":");if(this.treeSelection=void 0,t==="wsproject")return void this.switchProject(i);if(t==="pkg")this.currentPackage=i,this.treeSelection=e;else if(t==="file")this.currentPackage=D(i),this.treeSelection=e,this.openFile(i);else if(t==="class"||t==="member"){const[n,o]=i.split(":"),r=this.findClass(n);if(!r)return;const c=o!==void 0?r.members[Number(o)]:void 0;this.selection={cls:r.name,member:o!==void 0?Number(o):void 0},this.currentPackage=D(r.path),this.showInCode(r,c),o!==void 0&&(this.treeSelection=e)}else this.treeSelection=e;this.render(),this.renderTree()}deleteNode(e){const[t,...s]=e.split(":"),i=s.join(":");this.treeSelection=void 0,t==="file"?this.setProject(Tt(this.project,i)):t==="root"?(this.currentPackage&&U(this.currentPackage)===i&&(this.currentPackage=void 0),this.setProject(wi(this.project,i))):t==="pkg"&&(this.currentPackage===i&&(this.currentPackage=void 0),this.setProject($i(this.project,i)))}onTreeKey(e){var r,c;if(this.editing)return;const t=[...this.tree.querySelectorAll(".vo-row")],s=(r=document.activeElement)==null?void 0:r.closest(".vo-row"),i=s?t.indexOf(s):-1,n=(c=s==null?void 0:s.closest("[data-node]"))==null?void 0:c.dataset.node,o=l=>{const h=t[Math.max(0,Math.min(t.length-1,l))];for(const u of t)u.tabIndex=-1;h.tabIndex=0,h.focus()};if(e.key==="ArrowDown")o(i+1);else if(e.key==="ArrowUp")o(i-1);else if(n&&e.key==="ArrowRight"&&(s!=null&&s.querySelector("[data-toggle]"))&&!this.isOpen(n))this.toggle(n);else if(n&&e.key==="ArrowLeft"&&(s!=null&&s.querySelector("[data-toggle]"))&&this.isOpen(n))this.toggle(n);else if(n&&e.key==="Enter")this.selectNode(n);else if(n&&e.key==="F2")this.startEditing(s.querySelector(".vo-label"));else if(n&&(e.key==="Delete"||e.key==="Backspace")&&(s!=null&&s.querySelector("[data-delete]")))this.deleteNode(n);else return;e.preventDefault()}onPointerDown(e){this.closeEnd();const t=e.target;if(this.tool!=="select"&&e.button===0&&!t.closest(".vo-dock, .vo-relmenu, input, select, button:not(.uml-connect)"))return this.suppressClick=!0,this.useTool(e);const s=t.closest("[data-note-connect]");if(s&&e.button===0)return this.startNoteConnect(e,s.closest(".uml-note").dataset.note);const i=t.closest(".uml-note");if(i&&e.button===0&&!t.closest("textarea"))return this.dragNote(e,i);const n=t.closest("[data-connect]");if(n&&e.button===0)return this.startConnect(e,n.closest(".uml-class").dataset.class);if(t.closest("input, select, button, label"))return;const o=t.closest(".uml-class");if(!o||e.button!==0)return;const r=this.positions.get(o.dataset.class)??{x:o.offsetLeft,y:o.offsetTop};this.drag={name:o.dataset.class,box:o,start:{x:e.clientX,y:e.clientY},origin:r,moved:!1};const c=h=>{const u=this.drag;if(!u)return;const f=h.clientX-u.start.x,m=h.clientY-u.start.y;if(!u.moved&&Math.hypot(f,m)<4)return;u.moved=!0;const g={x:Math.max(0,Math.round(u.origin.x+f)),y:Math.max(0,Math.round(u.origin.y+m))};this.positions.set(u.name,g),u.box.style.left=`${g.x}px`,u.box.style.top=`${g.y}px`,this.drawLines()},l=()=>{var h;window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",l),(h=this.drag)!=null&&h.moved&&this.savePositions(),setTimeout(()=>this.drag=void 0,0)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",l)}onClick(e){var _,y;if(this.suppressClick){this.suppressClick=!1;return}if((_=this.drag)!=null&&_.moved||this.editing)return;const t=e.target;if(t.closest("input, select, label, textarea"))return;const s=t.closest(".uml-note");if(s){const w=s.dataset.note,$=Date.now(),p=this.lastClick.spot===`note|${w}`&&$-this.lastClick.time<450;return this.lastClick={spot:`note|${w}`,time:p?0:$},p?this.editNote(w):this.selectNote(w)}this.noteSelection=void 0;const i=t.closest("[data-class-action]"),n=t.closest(".uml-class"),o=n&&this.findClass(n.dataset.class);if(i&&o){i.dataset.classAction==="delete"&&this.deleteClassFromProject(o);return}const r=t.closest("[data-add]");if(r){this.startEditing(r);return}const c=(y=t.closest("[data-rel]"))==null?void 0:y.dataset.rel,l=t.closest("[data-end]");if(c&&!o&&l&&this.relSelection===c){this.openEnd(c,l.dataset.end,e,l.dataset.part);return}if(c&&!o){this.selectRelation(c);return}if(!o){this.relSelection=void 0,this.selection=void 0,this.render(),this.renderTree();return}const h=t.closest("[data-member]"),u=h?Number(h.dataset.member):void 0,f=`${o.name}|${u??(t.closest(".uml-name")?"name":"")}`,m=Date.now(),g=f===this.lastClick.spot&&m-this.lastClick.time<450&&!f.endsWith("|");if(this.lastClick={spot:f,time:g?0:m},g){const w=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(o.name)}"]`);this.startEditing((w==null?void 0:w.querySelector(u!==void 0?`[data-member="${u}"]`:".uml-name"))??null);return}this.selection={cls:o.name,member:u},this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=D(o.path),this.showInCode(o,u!==void 0?o.members[u]:void 0),this.render(),this.renderTree(),this.canvas.focus({preventScroll:!0})}setDiagramMode(e){this.diagramMode=e,J(hs,e),this.setTool("select"),this.render()}showDiagramMode(){const e=this.diagramMode==="object",t=this.diagramMode==="class";for(const s of this.shell.querySelectorAll("[data-diagram]"))s.setAttribute("aria-selected",String(s.dataset.diagram===this.diagramMode));if(this.shell.querySelector(".vo-palette:not(.vo-obj-palette)").hidden=!t,this.shell.querySelector(".vo-obj-palette").hidden=!e,this.canvas.hidden=!t,this.shell.querySelector(".vo-objcanvas").hidden=!e,this.shell.querySelector(".vo-seqcanvas").hidden=this.diagramMode!=="sequence",this.shell.querySelector("[data-action=layout]").hidden=!t,e){const s=this.shell.querySelector("[data-obj-class]"),i=[...new Set(this.classes.filter(o=>o.kind==="class"&&!o.isAbstract).map(o=>o.name))],n=i.includes(s.value)?s.value:i[0];s.innerHTML=i.map(o=>`${b(o)}`).join(""),this.shell.querySelector("[data-obj-add]").disabled=i.length===0}}savePositions(){const e=new Set(this.classes.map(t=>t.name));J(as,JSON.stringify(Object.fromEntries([...this.positions].filter(([t])=>e.has(t)))))}render(){var t;if(this.showDiagramMode(),this.diagramMode==="object")return this.objectDiagram.render();if(this.diagramMode==="sequence")return this.renderSequence();for(const s of this.canvas.querySelectorAll(".uml-class, .uml-note, .vo-empty"))s.remove();for(const s of this.project.notes??[])this.canvas.append(this.noteBox(s));if(this.classes.length===0){const s=document.createElement("p");s.className="vo-empty",s.textContent=d("web_visuobject_empty"),(t=this.project.notes)!=null&&t.length||this.canvas.append(s),this.drawLines();return}const e=new Map;for(const s of this.classes){if(e.has(s.name))continue;const i=this.classBox(s);e.set(s.name,i),this.canvas.append(i)}this.placeNew(e),this.drawLines()}noteBox(e){const t=document.createElement("div"),s=this.noteSelection===e.id;return t.className=`uml-note${s?" selected":""}`,t.dataset.note=e.id,t.style.left=`${e.x}px`,t.style.top=`${e.y}px`,t.innerHTML=`${s?``:""}
    ${b(e.text||d("web_visuobject_note_ph"))}
    `,t}findNote(e){var t;return e?(t=this.project.notes)==null?void 0:t.find(s=>s.id===e):void 0}setNotes(e){this.setProject({...this.project,notes:e.length?e:void 0})}changeNote(e,t){this.setNotes((this.project.notes??[]).map(s=>s.id===e?{...s,...t}:s))}addNote(e){const t=`n${Date.now().toString(36)}`;this.noteSelection=t,this.selection=void 0,this.relSelection=void 0,this.setNotes([...this.project.notes??[],{id:t,text:"",x:Math.max(0,Math.round(e.x)),y:Math.max(0,Math.round(e.y))}]),this.editNote(t)}deleteNote(e){this.noteSelection=void 0,this.setNotes((this.project.notes??[]).filter(t=>t.id!==e))}selectNote(e){this.noteSelection=e,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.render(),this.renderTree(),this.canvas.focus({preventScroll:!0})}editNote(e){const t=this.findNote(e),s=this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(e)}"]`);if(!t||!s)return;const i=document.createElement("textarea");i.className="uml-note-edit",i.value=t.text,i.placeholder=d("web_visuobject_note_ph"),i.rows=Math.max(3,t.text.split(` -`).length+1),s.querySelector(".uml-note-text").replaceWith(i),this.editing=!0;let n=!1;const o=r=>{n||(n=!0,this.editing=!1,r&&i.value!==t.text?this.changeNote(e,{text:i.value}):this.render())};i.addEventListener("keydown",r=>{r.stopPropagation(),r.key==="Escape"?o(!1):r.key==="Enter"&&(r.metaKey||r.ctrlKey)&&o(!0)}),i.addEventListener("blur",()=>o(!0)),i.focus()}startNoteConnect(e,t){e.preventDefault();const s=this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(t)}"]`),i=document.createElementNS("http://www.w3.org/2000/svg","line");i.setAttribute("class","vo-rel vo-note-link ghost"),this.lines.append(i);const n={x:s.offsetLeft+s.offsetWidth,y:s.offsetTop+s.offsetHeight/2},o=l=>{var h;return((h=document.elementFromPoint(l.clientX,l.clientY))==null?void 0:h.closest(".uml-class"))??void 0},r=l=>{var u;const h=this.canvas.getBoundingClientRect();i.setAttribute("x1",String(n.x)),i.setAttribute("y1",String(n.y)),i.setAttribute("x2",String(l.clientX-h.left+this.canvas.scrollLeft)),i.setAttribute("y2",String(l.clientY-h.top+this.canvas.scrollTop));for(const f of this.canvas.querySelectorAll(".uml-class.drop"))f.classList.remove("drop");(u=o(l))==null||u.classList.add("drop")},c=l=>{var m;window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",c),i.remove();const h=o(l);h==null||h.classList.remove("drop"),this.suppressClick=!0;const u=this.findNote(t),f=h==null?void 0:h.dataset.class;u&&f&&!((m=u.attach)!=null&&m.includes(f))&&this.changeNote(t,{attach:[...u.attach??[],f]})};window.addEventListener("pointermove",r),window.addEventListener("pointerup",c)}dragNote(e,t){const s=this.findNote(t.dataset.note);if(!s)return;const i={x:e.clientX,y:e.clientY};let n=!1,o={x:s.x,y:s.y};const r=l=>{const h=l.clientX-i.x,u=l.clientY-i.y;!n&&Math.hypot(h,u)<4||(n=!0,o={x:Math.max(0,Math.round(s.x+h)),y:Math.max(0,Math.round(s.y+u))},t.style.left=`${o.x}px`,t.style.top=`${o.y}px`,this.drawLines())},c=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",c),n&&(this.suppressClick=!0,this.changeNote(s.id,o))};window.addEventListener("pointermove",r),window.addEventListener("pointerup",c)}noteLinksSVG(e){const t=[];for(const s of this.project.notes??[]){const i=this.canvas.querySelector(`.uml-note[data-note="${CSS.escape(s.id)}"]`);if(i)for(const n of s.attach??[]){const o=e.get(n);if(!o)continue;const r={x:i.offsetLeft,y:i.offsetTop,w:i.offsetWidth,h:i.offsetHeight},c={x:o.offsetLeft,y:o.offsetTop,w:o.offsetWidth,h:o.offsetHeight},l={x:r.x+r.w/2,y:r.y+r.h/2},h={x:c.x+c.w/2,y:c.y+c.h/2},u=ze(r,l,h),f=ze(c,h,l);t.push(``)}}return t.join("")}renderNoteInspector(e){this.inspector.dataset.rel=`note:${e.id}`;const t=[...new Set(this.classes.map(s=>s.name))];this.inspector.innerHTML=` -

    ${b(d("web_visuobject_tool_note"))}

    - - ${t.length?`
    ${b(d("web_visuobject_note_attached"))}${t.map(s=>{var i;return``}).join("")}
    `:""} -
    `,this.inspector.querySelector("[data-field=note-text]").addEventListener("change",s=>this.changeNote(e.id,{text:s.target.value}));for(const s of this.inspector.querySelectorAll("[data-field=note-attach]"))s.addEventListener("change",()=>{const i=[...this.inspector.querySelectorAll("[data-field=note-attach]")].filter(n=>n.checked).map(n=>n.value);this.changeNote(e.id,{attach:i.length?i:void 0})});this.inspector.querySelector("[data-inspector=delete-note]").addEventListener("click",()=>this.deleteNote(e.id))}classBox(e){var l;const t=((l=this.selection)==null?void 0:l.cls)===e.name?this.selection:void 0,s=document.createElement("div");s.className=`uml-class${t?" selected":""}${e.kind==="interface"?" interface":""}${e.isAbstract?" abstract":""}`,s.dataset.class=e.name;const i=this.positions.get(e.name);i&&(s.style.left=`${i.x}px`,s.style.top=`${i.y}px`);const n=(h,u)=>{const f=Ge(h);return`
  • ${b(f)}
  • `},o=e.members.map((h,u)=>h.kind==="field"?n(h,u):"").join(""),r=e.members.map((h,u)=>h.kind!=="field"?n(h,u):"").join(""),c=h=>t?`
  • ${b(d(h==="field"?"web_visuobject_add_field":"web_visuobject_add_method"))}
  • `:"";return s.innerHTML=` - ${t&&t.member===void 0?``:""} -
    ${e.kind==="interface"?"«interface»":e.isAbstract?"{abstract}":""}${b(e.name)}
    - ${e.kind==="interface"&&!o?"":`
      ${o}${c("field")}
    `} -
      ${r}${c("method")}
    `,s}placeNew(e){var f;if(this.classes.every(m=>this.positions.has(m.name)))return;const t=m=>[m.superclass,...m.interfaces].filter(g=>!!g&&e.has(g)),s=new Map,i=(m,g)=>{if(s.has(m.name))return s.get(m.name);if(g.has(m.name))return 0;g.add(m.name);const _=t(m).map(w=>this.findClass(w)).filter(w=>w.pkg===m.pkg).map(w=>i(w,g)),y=_.length?Math.max(..._)+1:0;return s.set(m.name,y),y};for(const m of this.classes)i(m,new Set);const n=48,o=Math.max(this.canvas.clientWidth,400)-24,r=(m,g,_)=>m.x+m.w+_<=g.x||g.x+g.w+_<=m.x||m.y+m.h+_<=g.y||g.y+g.h+_<=m.y,c=m=>({w:e.get(m.name).offsetWidth,h:e.get(m.name).offsetHeight}),l=(m,g,_)=>{this.positions.set(m.name,{x:g,y:_});const y=e.get(m.name);y.style.left=`${g}px`,y.style.top=`${_}px`},h=m=>{const g=this.classes.filter(w=>w.pkg===m&&e.has(w.name)&&this.positions.has(w.name)).map(w=>({...this.positions.get(w.name),...c(w)}));if(g.length===0)return;const _=Math.min(...g.map(w=>w.x))-16,y=Math.min(...g.map(w=>w.y))-40;return{x:_,y,w:Math.max(...g.map(w=>w.x+w.w))+16-_,h:Math.max(...g.map(w=>w.y+w.h))+16-y}},u=this.diagramPackages().filter(m=>this.classes.some(g=>g.pkg===m&&e.has(g.name)));for(const m of u){const g=this.classes.filter(j=>j.pkg===m&&e.has(j.name)&&!this.positions.has(j.name));if(g.length===0)continue;const _=u.filter(j=>j!==m).map(h).filter(j=>!!j),y=h(m);if(y){for(const j of g){const{w:M,h:A}=c(j),R=this.classes.filter(F=>F.pkg===m&&this.positions.has(F.name)&&e.has(F.name)).map(F=>({...this.positions.get(F.name),...c(F)}));let C;for(let F=y.y+40;!C&&Fr(G,he,n))&&_.every(he=>r(z,he,24))){C={x:W,y:F};break}}C??(C={x:y.x+16,y:y.y+y.h+n}),l(j,C.x,C.y)}continue}const w=[];for(const j of g)(w[f=s.get(j.name)]??(w[f]=[])).push(j);const $=new Map;let p=0,v=0;for(const j of w){if(!j)continue;let M=0,A=0;for(const R of j){const{w:C,h:F}=c(R);$.set(R.name,{x:M,y:p}),M+=C+n*3,A=Math.max(A,F)}v=Math.max(v,M-n*3),p+=A+n*1.5}const x=p-n*1.5,L=v+32,S=x+56;let k;for(let j=4;!k&&j<2e4;j+=20)for(let M=16;M===16||M+L<=o;M+=20)if(_.every(A=>r({x:M,y:j,w:L,h:S},A,32))){k={x:M,y:j};break}k??(k={x:16,y:4});for(const j of g)l(j,k.x+16+$.get(j.name).x,k.y+40+$.get(j.name).y)}this.savePositions()}drawLines(){const e=new Map;for(const l of this.canvas.querySelectorAll(".uml-class"))e.set(l.dataset.class,l);let t=0,s=0;for(const l of e.values())t=Math.max(t,l.offsetLeft+l.offsetWidth+40),s=Math.max(s,l.offsetTop+l.offsetHeight+40);for(const l of[this.lines,this.frames])l.setAttribute("width",String(t)),l.setAttribute("height",String(s));this.frames.innerHTML=this.packageFrames(e);const i=[` - - - `],n=Pt(this.classes,this.project.uml),o=Ot(this.classes),r=new Map,c=(l,h)=>{const u=[l,h].sort().join("|"),f=r.get(u)??0;return r.set(u,f+1),f*16};for(const l of o){const h=e.get(l.from),u=e.get(l.to);h&&u&&h!==u&&i.push(this.generalizationSVG(l,h,u,c(l.from,l.to)))}for(const l of this.shownAssociations(n)){const h=e.get(l.from),u=e.get(l.to);h&&u&&h!==u&&i.push(this.associationSVG(l,h,u,c(l.from,l.to)))}for(const l of this.dependencies()){const h=e.get(l.from),u=e.get(l.to);h&&u&&h!==u&&i.push(this.dependencySVG(l,h,u,c(l.from,l.to)))}i.push(this.noteLinksSVG(e)),this.lines.innerHTML=i.join(""),this.renderInspector()}diagramPackages(){return[...new Set(ce(this.project).map(X))]}packageFrames(e){const t=[];for(const s of this.diagramPackages()){if(!s)continue;const i=this.classes.filter(u=>u.pkg===s).map(u=>e.get(u.name)).filter(u=>!!u);if(i.length===0)continue;const n=Math.min(...i.map(u=>u.offsetLeft))-16,o=Math.min(...i.map(u=>u.offsetTop))-16,r=Math.max(...i.map(u=>u.offsetLeft+u.offsetWidth))+16,c=Math.max(...i.map(u=>u.offsetTop+u.offsetHeight))+16,l=Math.max(70,s.length*7.6+20),h=this.currentPackage!==void 0&&X(this.currentPackage)===s?" current":"";t.push(` - - - ${b(s)} - `)}return t.join("")}segment(e,t,s){const i=_=>({x:_.offsetLeft,y:_.offsetTop,w:_.offsetWidth,h:_.offsetHeight}),n=i(e),o=i(t),r={x:n.x+n.w/2,y:n.y+n.h/2},c={x:o.x+o.w/2,y:o.y+o.h/2},l=Math.hypot(c.x-r.x,c.y-r.y)||1,h=-(c.y-r.y)/l*s,u=(c.x-r.x)/l*s,f=ze(n,{x:r.x+h,y:r.y+u},{x:c.x+h,y:c.y+u}),m=ze(o,{x:c.x+h,y:c.y+u},{x:r.x+h,y:r.y+u}),g=Math.hypot(m.x-f.x,m.y-f.y)||1;return{from:f,to:m,length:g,u:{x:(m.x-f.x)/g,y:(m.y-f.y)/g},n:{x:-(m.y-f.y)/g,y:(m.x-f.x)/g}}}hitLine(e,t,s,i){return`${b(i)}`}dependencies(){return ki(this.classes,e=>{var t;return(t=this.project.files.find(s=>s.path===e.path))==null?void 0:t.text})}findDependency(e){return this.dependencies().find(t=>`dep:${t.from}:${t.to}`===e)}dependencySVG(e,t,s,i){const{from:n,to:o,n:r}=this.segment(t,s,i),c=`dep:${e.from}:${e.to}`,l=this.relSelection===c?" selected":"",h={x:(n.x+o.x)/2+r.x*12,y:(n.y+o.y)/2+r.y*12},u=Math.abs(r.x)<.35?"middle":r.x>0?"start":"end",f=d(`web_visuobject_dep_${e.kind}_text`,e.from,e.to,e.methods.join(", "));return` - - «${e.kind}» - ${this.hitLine(c,n,o,f)} - `}generalizationSVG(e,t,s,i){const{from:n,to:o,u:r}=this.segment(t,s,i),c={x:o.x-r.x*12,y:o.y-r.y*12},l=`gen:${e.kind}:${e.from}:${e.to}`,h=this.relSelection===l?" selected":"",u=d(e.kind==="implements"?"web_visuobject_rel_implements_text":"web_visuobject_rel_extends_text",e.from,e.to);return` - - ${this.hitLine(l,n,o,u)} - `}shownAssociations(e){const t=new Map;for(const s of e){const i=[s.from,s.to].sort().join("|");t.set(i,[...t.get(i)??[],s])}return[...t.values()].map(s=>{const i=l=>(l.name?2:0)+(l.kind!=="association"||l.navTo!=="navigable"||l.navFrom!==(l.back?"navigable":"unspecified")?1:0),n=[...s].sort((l,h)=>i(h)-i(l))[0],o=l=>s.filter(h=>h.from===l).length+s.filter(h=>h.back&&h.to===l).length,r=o(n.from)>1||o(n.to)>1,c=s.some(l=>l.from===n.to);return{...n,navFrom:c&&n.navFrom==="unspecified"?"navigable":n.navFrom,several:r}})}associationSVG(e,t,s,i){const{from:n,to:o,length:r,u:c,n:l}=this.segment(t,s,i),h=`assoc:${e.key}`,u=this.relSelection===h?" selected":"",f=e.kind!=="association",m=f?{x:n.x+c.x*20,y:n.y+c.y*20}:n;let g=``;const _=(p,v)=>{const x={x:p.x+v.x*12,y:p.y+v.y*12},L={x:(v.x+l.x)*5,y:(v.y+l.y)*5},S={x:(v.x-l.x)*5,y:(v.y-l.y)*5};return``};if(e.navTo==="non-navigable"&&(g+=_(o,{x:-c.x,y:-c.y})),e.navFrom==="non-navigable"&&(g+=_(m,c)),f){const p=(v,x)=>`${n.x+c.x*v+l.x*x},${n.y+c.y*v+l.y*x}`;g+=``}const y=(p,v,x,L,S,k)=>{const j=Math.abs(l.x)<.35,M=j?{x:p.x+v.x*8,y:p.y+v.y*8}:{x:p.x+v.x*x,y:p.y+v.y*x},A=(F,W,G)=>{const z=!W;if(z&&(!u||G==="role"))return"";const he=M.x+l.x*F,As=M.y+l.y*F,qs=j?v.x>0?"start":"end":l.x*F>0?"start":"end",Fs=z?d(G==="role"?"web_visuobject_rel_role":"web_visuobject_end_mult_ph"):W;return`${b(Fs)}`},R={x:p.x+v.x*16,y:p.y+v.y*16};return`${b(d("web_visuobject_end_tip"))}`+A(12,S,"mult")+A(-12,k,"role")},w=Math.min(30,r/3);if(g+=y(o,{x:-c.x,y:-c.y},w,"b",e.several?void 0:e.multiplicity),g+=y(n,c,f?Math.min(42,r/3):w,"a",e.several?void 0:e.sourceMultiplicity),e.name){const p=e.reading==="backward"?{x:-c.x,y:-c.y}:c,v=e.reading?Math.abs(p.x)>=Math.abs(p.y)?p.x>0?" ▶":"◀ ":p.y>0?" ▼":" ▲":"",x=v==="◀ "?`◀ ${e.name}`:`${e.name}${v}`,L=this.freeMiddle(n,o,[e.from,e.to]),S={x:L.x+l.x*14,y:L.y+l.y*14},k=Math.abs(l.x)<.35?"middle":l.x>0?"start":"end";g+=`${b(x)}`}const $=d(`web_visuobject_rel_${e.kind}`)+`: ${e.from} – ${e.to}`;return`${g}${this.hitLine(h,n,o,$)}`}freeMiddle(e,t,s){const i=[...this.canvas.querySelectorAll(".uml-class")].filter(h=>!s.includes(h.dataset.class)).map(h=>({x:h.offsetLeft-8,y:h.offsetTop-8,w:h.offsetWidth+16,h:h.offsetHeight+16})),n=Math.hypot(t.x-e.x,t.y-e.y);if(n>120){const h=48/n;[e,t]=[{x:e.x+(t.x-e.x)*h,y:e.y+(t.y-e.y)*h},{x:t.x-(t.x-e.x)*h,y:t.y-(t.y-e.y)*h}]}const o=40;let r={start:0,length:0},c=-1;for(let h=0;h<=o;h++){const u=e.x+(t.x-e.x)*h/o,f=e.y+(t.y-e.y)*h/o,m=i.some(g=>u>=g.x&&u<=g.x+g.w&&f>=g.y&&f<=g.y+g.h);if(!m&&c<0&&(c=h),(m||h===o)&&c>=0){const g=m?h-1:h;g-c>r.length&&(r={start:c,length:g-c}),c=-1}}const l=(r.start+r.length/2)/o;return{x:e.x+(t.x-e.x)*l,y:e.y+(t.y-e.y)*l}}findRelation(e){return e.startsWith("assoc:")?Pt(this.classes,this.project.uml).find(t=>{var s;return`assoc:${t.key}`===e||`assoc:${(s=t.back)==null?void 0:s.key}`===e}):Ot(this.classes).find(t=>`gen:${t.kind}:${t.from}:${t.to}`===e)}selectRelation(e){this.noteSelection=void 0,this.relSelection=e,this.selection=void 0,this.treeSelection=void 0,this.message(""),this.render(),this.renderTree(),this.canvas.focus({preventScroll:!0})}editClass(e,t,s){for(const i of e.files){const n=oe(i.text).find(o=>o.name===t);if(n)return $e(e,i.path,this.sorted(s(i.text,n),t))}return e}sectionLabels(){return{fields:d("web_visuobject_section_fields"),refs:d("web_visuobject_section_refs"),ctors:d("web_visuobject_section_ctors"),methods:d("web_visuobject_section_methods")}}sorted(e,t){return Qi(e,t,new Set(this.classes.map(s=>s.name)),this.sectionLabels())}sectioned(e,t){const s=oe(e).find(i=>i.name===t);return s?pt(e,s,new Set([...this.classes.map(i=>i.name),t]),this.sectionLabels()):e}fieldOf(e,t){return e.members.find(s=>s.kind==="field"&&s.name===t)}importFor(e,t,s){const i=this.findClass(t),n=this.findClass(s);return!i||!n||i.pkg===n.pkg||!n.pkg?e:this.editClass(e,t,o=>tt(o,`${n.pkg}.${n.name}`))}addAssociationField(e,t,s,i,n){const o=Ct(e).find(u=>u.name===t),r=n&&pe.test(n)&&!o.members.some(u=>u.name===n)?n:ji(o,s,i),{type:c,init:l}=It(s,i);let h=this.editClass(e,t,(u,f)=>Ee(u,f,`- ${r}: ${c}`));return l&&(h=this.editClass(h,t,(u,f)=>{const m=this.fieldOf(f,r);return m?Lt(u,m,c,l):u}),h=this.editClass(h,t,u=>tt(u,"java.util.ArrayList"))),{project:this.importFor(h,t,s),field:r}}setUml(e,t,s){return{...e,uml:Si(e.uml??{},t,s)}}createRelation(e,t,s){const i=this.findClass(e),n=this.findClass(t);if(!i||!n)return;let o=this.project,r;if(s==="extends"&&i.kind==="class")o=this.importFor(this.editClass(o,e,(c,l)=>Ze(c,l,t)),e,t),r=`gen:extends:${e}:${t}`;else if(s==="extends"||s==="implements")o=this.importFor(this.editClass(o,e,(c,l)=>jt(c,l,t)),e,t),r=`gen:${i.kind==="interface"?"extends":"implements"}:${e}:${t}`;else{const c=this.addAssociationField(o,e,t,!1),l=V(e,c.field);o=s==="association"?c.project:s==="link"?this.setUml(c.project,l,{targetEnd:"unspecified"}):this.setUml(c.project,l,{kind:s}),r=`assoc:${V(e,c.field)}`}this.relSelection=r,this.selection=void 0,this.message(""),this.setProject(o,i.path),this.canvas.focus({preventScroll:!0})}deleteRelation(e){var i;const t=this.findRelation(e);if(!t)return;let s=this.project;if("key"in t){const n=(r,c,l)=>this.editClass(r,c,(h,u)=>{const f=this.fieldOf(u,l);return f?xe(h,f):h});s=n(s,t.from,t.role),t.back&&(s=n(s,t.to,t.back.field.name));const o={...s.uml??{}};delete o[t.key],t.back&&delete o[t.back.key],s={...s,uml:o}}else t.kind==="extends"&&((i=this.findClass(t.from))==null?void 0:i.kind)==="class"?s=this.editClass(s,t.from,(n,o)=>Ze(n,o,void 0)):s=this.editClass(s,t.from,(n,o)=>St(n,o,t.to));this.relSelection=void 0,this.setProject(s)}changeAssoc(e,t,s){let i=this.project,n=e.key;const o=(l,h,u)=>{if(!pe.test(u))return this.message(d("web_visuobject_bad_name",u)),!1;const f=this.findClass(l);return f&&f.members.some(m=>m.name===u)?(this.message(d("web_visuobject_bad_name",u)),!1):(i=this.editClass(i,l,(m,g)=>{const _=this.fieldOf(g,h);return _?Qe(m,g,_,`${_.visibility} ${u}: ${_.type}`):m}),i={...i,uml:ke(i.uml??{},V(l,h),V(l,u))},!0)},r=(l,h,u,f,m)=>{const g=Me(f);i=this.editClass(i,l,(y,w)=>{const $=this.fieldOf(w,h);if(!$||Me(e.key===m?e.multiplicity:e.sourceMultiplicity??"1")===g)return y;const{type:v,init:x}=It(u,g);return Lt(y,$,v,x)}),g&&(i=this.editClass(i,l,y=>tt(y,"java.util.ArrayList")));const _=g?"0..*":"1";i=this.setUml(i,m,{multiplicity:f===_?void 0:f})};switch(t){case"kind":i=this.setUml(i,n,{kind:s});break;case"name":i=this.setUml(i,n,{name:s.trim()||void 0});break;case"reading":i=this.setUml(i,n,{reading:e.reading==="backward"?void 0:"backward"});break;case"targetEnd":i=this.setUml(i,n,{targetEnd:s,navigable:void 0});break;case"sourceEnd":{if(s==="navigable"&&!e.back){const l=this.addAssociationField(i,e.to,e.from,Me(e.sourceMultiplicity??"1"),e.sourceRole);i=this.setUml(l.project,n,{sourceEnd:void 0,sourceRole:void 0,sourceMultiplicity:void 0}),e.sourceMultiplicity&&e.sourceMultiplicity!==(Me(e.sourceMultiplicity)?"0..*":"1")&&(i=this.setUml(i,V(e.to,l.field),{multiplicity:e.sourceMultiplicity}))}else if(s!=="navigable"){if(e.back){const l=e.back;i=this.editClass(i,e.to,(u,f)=>{const m=this.fieldOf(f,l.field.name);return m?xe(u,m):u});const h={...i.uml??{}};delete h[l.key],i={...i,uml:h},i=this.setUml(i,n,{sourceRole:e.sourceRole,sourceMultiplicity:e.sourceMultiplicity})}i=this.setUml(i,n,{sourceEnd:s})}break}case"role":if(s===e.role||!o(e.from,e.role,s))return;n=V(e.from,s);break;case"multiplicity":if(!s.trim())return;r(e.from,e.role,e.to,s.trim(),n);break;case"sourceRole":if(e.back){if(s===e.back.field.name||!o(e.to,e.back.field.name,s))return}else i=this.setUml(i,n,{sourceRole:s.trim()||void 0});break;case"sourceMultiplicity":if(!s.trim())return;e.back?r(e.to,e.back.field.name,e.from,s.trim(),e.back.key):i=this.setUml(i,n,{sourceMultiplicity:s.trim()});break}this.relSelection=`assoc:${n}`,this.message(""),this.setProject(i);const c=this.findRelation(this.relSelection);c&&"key"in c&&`assoc:${c.key}`!==this.relSelection&&(this.relSelection=`assoc:${c.key}`,this.render())}openEnd(e,t,s,i){this.closeEnd();const n=this.findRelation(e);if(!n||!("key"in n))return;const o=t==="a",r=o?{role:"sourceRole",mult:"sourceMultiplicity",nav:"sourceEnd"}:{role:"role",mult:"multiplicity",nav:"targetEnd"},c=(o?n.sourceRole:n.role)??"",l=(o?n.sourceMultiplicity:n.multiplicity)??"",h=o?n.navFrom:n.navTo,u=o?n.from:n.to,f=document.createElement("div");f.className="vo-endpop",f.setAttribute("role","dialog"),f.setAttribute("aria-label",d(o?"web_visuobject_rel_end_a":"web_visuobject_rel_end_b",u)),f.innerHTML=`

    ${b(d(o?"web_visuobject_rel_end_a":"web_visuobject_rel_end_b",u))}

    - -
    ${b(d("web_visuobject_rel_multiplicity"))}${Nt.map(p=>``).join("")}
    -
    ${b(d("web_visuobject_rel_navigable"))}${["navigable","non-navigable","unspecified"].map(p=>``).join("")}
    `;const m=this.shell.querySelector(".vo-stage"),g=m.getBoundingClientRect();m.append(f);const _=Math.min(Math.max(8,s.clientX-g.left+8),g.width-f.offsetWidth-8),y=Math.min(Math.max(8,s.clientY-g.top+8),g.height-f.offsetHeight-8);f.style.left=`${Math.max(8,_)}px`,f.style.top=`${Math.max(8,y)}px`;const w=(p,v)=>{var S,k;const x=this.findRelation(e);x&&"key"in x&&this.changeAssoc(x,p,v);const L=(k=(S=document.activeElement)==null?void 0:S.dataset)==null?void 0:k.endField;this.relSelection&&this.reopenEnd(this.relSelection,t,f,L)};for(const p of f.querySelectorAll("[data-end-field]"))p.addEventListener("change",()=>w(p.dataset.endField==="role"?r.role:r.mult,p.value.trim())),p.addEventListener("keydown",v=>{v.stopPropagation(),v.key==="Enter"&&p.blur(),v.key==="Escape"&&this.closeEnd()});for(const p of f.querySelectorAll("[data-mult]"))p.addEventListener("click",()=>w(r.mult,p.dataset.mult));for(const p of f.querySelectorAll("[data-nav]"))p.addEventListener("click",()=>w(r.nav,p.dataset.nav));f.addEventListener("pointerdown",p=>p.stopPropagation()),f.addEventListener("click",p=>p.stopPropagation()),this.endPop=f;const $=f.querySelector(`[data-end-field="${i==="mult"?"mult":"role"}"]`);$==null||$.focus(),$==null||$.select()}reopenEnd(e,t,s,i){const n=this.shell.querySelector(".vo-stage").getBoundingClientRect(),o={clientX:n.left+parseFloat(s.style.left)-8,clientY:n.top+parseFloat(s.style.top)-8};this.openEnd(e,t,o,i)}closeEnd(){var e;(e=this.endPop)==null||e.remove(),this.endPop=void 0}renderInspector(){var r,c,l;if(this.diagramMode==="object")return this.objectDiagram.renderInspector();if(this.diagramMode==="sequence")return this.renderSequenceInspector();const e=this.findNote(this.noteSelection);if(e)return this.renderNoteInspector(e);const t=(r=this.relSelection)!=null&&r.startsWith("dep:")?this.findDependency(this.relSelection):void 0;if(t)return this.renderDependency(t);const s=this.relSelection?this.findRelation(this.relSelection):void 0;this.endPop&&(!s||!this.endPop.isConnected)&&this.closeEnd();const i=!s&&this.selection?this.findClass(this.selection.cls):void 0;if(i)return this.renderClassInspector(i);if(!s){delete this.inspector.dataset.rel,this.inspector.innerHTML=`

    ${b(d("web_visuobject_inspector_empty"))}

    `;return}const n=this.inspector.contains(document.activeElement)?document.activeElement.dataset.field??document.activeElement.dataset.inspector:void 0;this.inspector.dataset.rel=this.relSelection;const o=``;if("key"in s){const h=($,p,v)=>``,u=["association","aggregation","composition"].map($=>h($,d(`web_visuobject_rel_${$}`).replace(/\s*\(.*\)$/,""),s.kind)).join(""),f=$=>["navigable","non-navigable","unspecified"].map(p=>h(p,d(`web_visuobject_rel_nav_${p}`),$)).join(""),[m,g]=s.reading==="backward"?[s.to,s.from]:[s.from,s.to],_=s.name?`

    ${b(d("web_visuobject_rel_reading"))}: ${b(m)} ▶ ${b(g)}

    `:`

    ${b(d("web_visuobject_rel_reading_auto"))}

    `,y=`${Nt.map($=>``,w=($,p,v,x,L,S,k,j)=>` -
    - ${b($)} - - - - ${b(S)} -
    `;this.inspector.innerHTML=` -
    - - - ${_} - ${o} -
    -
    - ${w(d("web_visuobject_rel_end_a",s.from),"sourceRole",s.sourceRole,"sourceMultiplicity",s.sourceMultiplicity,s.back?d("web_visuobject_rel_role_field",s.to,s.back.field.name):d("web_visuobject_rel_role_only_uml"),"sourceEnd",s.navFrom)} - ${w(d("web_visuobject_rel_end_b",s.to),"role",s.role,"multiplicity",s.multiplicity,d("web_visuobject_rel_role_field",s.from,s.role),"targetEnd",s.navTo)} -
    - ${y}`}else{const h=d(s.kind==="implements"?"web_visuobject_rel_implements_text":"web_visuobject_rel_extends_text",s.from,s.to);this.inspector.innerHTML=`

    ${b(d(s.kind==="implements"?"web_visuobject_rel_implements":"web_visuobject_rel_extends"))}

    ${b(h)}

    ${o}
    `}for(const h of this.inspector.querySelectorAll("[data-field]"))h.addEventListener("change",()=>{const u=this.relSelection&&this.findRelation(this.relSelection);u&&"key"in u&&this.changeAssoc(u,h.dataset.field,h.value)}),h instanceof HTMLInputElement&&h.addEventListener("keydown",u=>u.key==="Enter"&&h.blur());this.inspector.querySelector("[data-inspector=delete]").addEventListener("click",()=>this.deleteRelation(this.relSelection)),n&&((c=this.inspector.querySelector(`[data-field="${n}"], [data-inspector="${n}"]`))==null||c.focus({preventScroll:!0})),(l=this.inspector.querySelector("[data-inspector=flip]"))==null||l.addEventListener("click",()=>{const h=this.relSelection&&this.findRelation(this.relSelection);h&&"key"in h&&this.changeAssoc(h,"reading","")})}renderClassInspector(e){var w,$;const t=document.activeElement,s=this.inspector.contains(t)&&t!=null&&t.dataset.field?`${t.dataset.row??""}|${t.dataset.field}`:void 0,i=((w=this.project.files.find(p=>p.path===e.path))==null?void 0:w.text)??"",n=ci(i,e),o=e.kind==="class",r=(p,v,x)=>``,c=(p,v=!0)=>["+","-","#","~"].filter(x=>v||x!=="~").map(x=>r(x,`${x} ${{"+":"public","-":"private","#":"protected","~":"package"}[x]}`,x===p)).join(""),l=e.members.map((p,v)=>({m:p,i:v})).filter(p=>p.m.kind==="field"),h=e.members.map((p,v)=>({m:p,i:v})).filter(p=>p.m.kind!=="field"),u=(p,v)=>``,f=`${["int","double","boolean","char","long","String",...this.classes.map(p=>p.name),...this.classes.map(p=>`ArrayList<${p.name}>`)].map(p=>``;let m="";if(this.classTab==="class"){const p=this.classes.filter(S=>S.kind==="class"&&S.name!==e.name),v=this.classes.filter(S=>S.kind==="interface"&&S.name!==e.name),x=D(e.path),L=ue(this.project).flatMap(S=>{const k=ce(this.project,S);return k.includes(re(S,""))?k:[...k,re(S,"")]});m=` -
    - - - - ${o?``:""} -
    -
    - ${o?``:""} - ${v.length?`
    ${b(d(o?"web_visuobject_new_interfaces":"web_visuobject_new_extends_interfaces"))}${v.map(S=>``).join("")}
    `:""} -
    - -
    ${o?``:""}
    `}else if(this.classTab==="fields"){const p=l.map(({m:v,i:x})=>{const L=Ms(i,v);return` - - - - - - - - `}).join("");m=`${p||``}
    ${b(d("web_visuobject_insp_visibility"))}${b(d("web_visuobject_new_name"))}${b(d("web_visuobject_insp_type"))}staticfinal${b(d("web_visuobject_insp_init"))}
    ${b(d("web_visuobject_insp_no_fields"))}
    -
    `}else{const p=o,v=h.map(({m:x,i:L})=>{const S=x.kind==="constructor";return` - - - - - - - - `}).join("");m=`${v||``}
    ${b(d("web_visuobject_insp_visibility"))}${b(d("web_visuobject_new_name"))}${b(d("web_visuobject_insp_params"))}${b(d("web_visuobject_insp_return"))}staticabstract
    ${b(d("web_visuobject_insp_no_methods"))}
    -
    - - ${o?`${b(d("web_visuobject_insp_generate"))} - - - `:""} -
    `}this.inspector.dataset.rel=`class:${e.name}`,this.inspector.innerHTML=` -
    -

    ${b(d(o?"web_visuobject_new_class":"web_visuobject_new_interface"))} ${b(e.name)}

    -
    ${u("class",d(o?"web_visuobject_new_class":"web_visuobject_new_interface"))}${u("fields",`${d("web_visuobject_insp_fields")} (${l.length})`)}${u("methods",`${d("web_visuobject_insp_methods")} (${h.length})`)}
    -
    - ${m}${f}`;const g=(p,v)=>{this.message("");let x=this.editClass(this.project,e.name,p);v&&(x=v(x)),this.setProject(x,e.path)},_=(p,v)=>p.members[Number(v.dataset.row)];for(const p of this.inspector.querySelectorAll("[data-class-tab]"))p.addEventListener("click",()=>{this.classTab=p.dataset.classTab,this.renderInspector()});for(const p of this.inspector.querySelectorAll("[data-field]"))p.addEventListener("change",()=>{var S;const v=p.dataset.field,x=p instanceof HTMLInputElement&&p.checked,L=p.value.trim();if(v==="name")L&&L!==e.name&&this.renameClassTo(e,L);else if(v==="package"){const k=le(p.value,Q(e.path));if(k===e.path)return;if(this.project.files.some(j=>j.path===k))return this.message(d("web_visuobject_new_exists",Q(k)));this.openTabs=this.openTabs.map(j=>j===e.path?k:j),this.currentPackage=p.value,this.setProject(Oe(this.project,e.path,k),k)}else if(v==="visibility")g((k,j)=>li(k,j,p.value==="public"));else if(v==="abstract")g((k,j)=>{const M=x?Ne(k,j,!1):k;return Et(M,oe(M).find(A=>A.name===j.name)??j,x)});else if(v==="final")g((k,j)=>Ne(k,j,x));else if(v==="superclass"){const k=p.value||void 0;g((j,M)=>Ze(j,M,k),j=>k?this.importFor(j,e.name,k):j)}else if(v==="iface"){const k=p.value;g((j,M)=>x?jt(j,M,k):St(j,M,k),j=>x?this.importFor(j,e.name,k):j)}else if(v==="doc")g((k,j)=>mn(k,j,p.value));else if(v.startsWith("f-")){if(v==="f-name"&&!pe.test(L)||v==="f-type"&&!L)return this.message(d("web_visuobject_bad_name",L));const k=v==="f-vis"?{visibility:p.value}:v==="f-name"?{name:L}:v==="f-type"?{type:L}:v==="f-static"?{isStatic:x}:v==="f-final"?{isFinal:x}:{init:p.value},j=(S=e.members[Number(p.dataset.row)])==null?void 0:S.name;g((M,A)=>ln(M,_(A,p),k),M=>{var A;return v==="f-name"&&j&&((A=M.uml)!=null&&A[V(e.name,j)])?{...M,uml:ke(M.uml,V(e.name,j),V(e.name,L))}:M})}else if(v.startsWith("m-")){let k;if(v==="m-params"){const j=dn(p.value);if(!j)return this.message(d("web_visuobject_insp_bad_params",p.value));k={params:j}}else if(v==="m-name"){if(!pe.test(L))return this.message(d("web_visuobject_bad_name",L));k={name:L}}else k=v==="m-vis"?{visibility:p.value}:v==="m-type"?{type:L||"void"}:v==="m-static"?{isStatic:x}:{isAbstract:x};g((j,M)=>{const A=pn(j,M,_(M,p),k);if(v==="m-abstract"&&x&&!M.isAbstract){const R=oe(A).find(C=>C.name===M.name);return R?Et(Ne(A,R,!1),oe(Ne(A,R,!1)).find(C=>C.name===M.name),!0):A}return A})}}),p instanceof HTMLInputElement&&p.type==="text"&&p.addEventListener("keydown",v=>v.key==="Enter"&&p.blur());const y=(p,v)=>{for(const x of this.inspector.querySelectorAll(`[data-inspector="${p}"]`))x.addEventListener("click",()=>v(x))};if(y("delete-class",()=>this.deleteClassFromProject(e)),y("sections",()=>g((p,v)=>pt(p,v,new Set(this.classes.map(x=>x.name)),this.sectionLabels()))),y("delete-member",p=>g((v,x)=>xe(v,_(x,p)))),y("add-field",()=>g((p,v)=>Ee(p,v,`- ${this.freeMember(e,"attribut")}: int`))),y("add-method",()=>g((p,v)=>Ee(p,v,`+ ${this.freeMember(e,"methode")}(): void`))),y("gen-constructor",()=>g((p,v)=>bn(p,v))),y("gen-accessors",()=>g((p,v)=>vn(p,v))),y("gen-tostring",()=>g((p,v)=>gn(p,v))),s){const[p,v]=s.split("|");($=this.inspector.querySelector(p?`[data-row="${p}"][data-field="${v}"]`:`[data-field="${v}"]`))==null||$.focus({preventScroll:!0})}}freeMember(e,t){let s=t;for(let i=2;e.members.some(n=>n.name===s);i++)s=t+i;return s}renderDependency(e){this.closeEnd(),this.inspector.dataset.rel=this.relSelection,this.inspector.innerHTML=`
    -

    ${b(d("web_visuobject_dep_title",e.kind))}

    -

    ${b(d(`web_visuobject_dep_${e.kind}_text`,e.from,e.to,e.methods.join(", ")))}

    -
    -

    ${b(d("web_visuobject_dep_hint",e.from,e.to))}

    -
    `,this.inspector.querySelector("[data-inspector=to-assoc]").addEventListener("click",()=>{var s;const t=this.addAssociationField(this.project,e.from,e.to,!1);this.relSelection=`assoc:${V(e.from,t.field)}`,this.setProject(t.project,(s=this.findClass(e.from))==null?void 0:s.path)})}setTool(e){this.tool=e,this.pendingFrom=void 0;for(const t of this.canvas.querySelectorAll(".uml-class.source"))t.classList.remove("source");for(const t of this.shell.querySelectorAll(".vo-tool"))t.setAttribute("aria-pressed",String(t.dataset.tool===e));this.canvas.dataset.tool=e,this.message(e==="select"?"":d(`web_visuobject_tool_${e}_tip`),!0)}onToolDown(e,t){if(e.button!==0)return;if(t!=="class"&&t!=="interface")return this.setTool(this.tool===t?"select":t);e.preventDefault();const s={x:e.clientX,y:e.clientY};let i;const n=r=>{!i&&Math.hypot(r.clientX-s.x,r.clientY-s.y)<6||(i||(i=document.createElement("div"),i.className=`vo-tool-ghost${t==="interface"?" interface":""}`,i.innerHTML=`${t==="interface"?"«interface»":""}${b(d(t==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name"))}`,document.body.append(i)),i.style.left=`${r.clientX}px`,i.style.top=`${r.clientY}px`)},o=r=>{if(window.removeEventListener("pointermove",n),window.removeEventListener("pointerup",o),!i)return this.setTool(this.tool===t?"select":t);i.remove();const c=this.canvas.getBoundingClientRect();r.clientXc.right||r.clientYc.bottom||(this.setTool("select"),this.newClass(t,{x:r.clientX-c.left+this.canvas.scrollLeft-60,y:r.clientY-c.top+this.canvas.scrollTop-14}))};window.addEventListener("pointermove",n),window.addEventListener("pointerup",o)}useTool(e){e.preventDefault();const t=this.tool,s=this.canvas.getBoundingClientRect(),i={x:e.clientX-s.left+this.canvas.scrollLeft,y:e.clientY-s.top+this.canvas.scrollTop};if(t==="class"||t==="interface"){this.setTool("select"),this.newClass(t,{x:i.x-60,y:i.y-14});return}if(t==="note"){this.setTool("select"),this.addNote({x:i.x-20,y:i.y-14});return}const n=e.target.closest(".uml-class");if(!n){this.pendingFrom&&this.setTool(t);return}const o=n.dataset.class;if(this.pendingFrom&&this.pendingFrom!==o){const r=this.pendingFrom;this.connectWith(r,o,t);return}this.startConnect(e,o,t)}connectWith(e,t,s){const i=this.findClass(e),n=this.findClass(t);if(this.setTool("select"),!(!i||!n)){if(!ps(i,n).includes(s))return this.message(d(`web_visuobject_tool_not_${s}`,e,t));this.createRelation(e,t,s)}}startConnect(e,t,s){e.preventDefault();const i=document.createElementNS("http://www.w3.org/2000/svg","line");i.setAttribute("class","vo-rel ghost"),this.lines.append(i);const n=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(t)}"]`),o=u=>{const f=this.canvas.getBoundingClientRect();return{x:u.clientX-f.left+this.canvas.scrollLeft,y:u.clientY-f.top+this.canvas.scrollTop}},r={x:n.offsetLeft+n.offsetWidth,y:n.offsetTop+n.offsetHeight/2},c=u=>{var m;const f=(m=document.elementFromPoint(u.clientX,u.clientY))==null?void 0:m.closest(".uml-class");return f&&f.dataset.class!==t?f:void 0},l=u=>{var m;const f=o(u);i.setAttribute("x1",String(r.x)),i.setAttribute("y1",String(r.y)),i.setAttribute("x2",String(f.x)),i.setAttribute("y2",String(f.y));for(const g of this.canvas.querySelectorAll(".uml-class.drop"))g.classList.remove("drop");(m=c(u))==null||m.classList.add("drop")},h=u=>{var m;window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",h),i.remove();const f=c(u);f==null||f.classList.remove("drop"),f&&s?this.connectWith(t,f.dataset.class,s):f?this.showRelationMenu(t,f.dataset.class,o(u)):s&&(this.pendingFrom=t,(m=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(t)}"]`))==null||m.classList.add("source"),this.message(d("web_visuobject_tool_pick_second",t),!0))};l(e),window.addEventListener("pointermove",l),window.addEventListener("pointerup",h)}showRelationMenu(e,t,s){var u;const i=this.findClass(e),n=this.findClass(t);if(!i||!n)return;const o=ps(i,n).map(f=>[f,f==="association"?"web_visuobject_rel_directed":`web_visuobject_rel_${f}`]);if(o.length===0)return this.message(d("web_visuobject_rel_impossible",e,t));const r=document.createElement("div");r.className="vo-relmenu",r.setAttribute("role","menu"),r.style.left=`${s.x}px`,r.style.top=`${s.y}px`,r.innerHTML=`

    ${b(d("web_visuobject_rel_menu",e,t))}

    `+o.map(([f,m])=>``).join(""),this.canvas.append(r);const c=()=>{r.remove(),document.removeEventListener("pointerdown",l,!0),document.removeEventListener("keydown",h,!0)},l=f=>{r.contains(f.target)||c()},h=f=>{f.key==="Escape"&&(f.stopPropagation(),c())};r.addEventListener("click",f=>{var g;const m=(g=f.target.closest("[data-kind]"))==null?void 0:g.dataset.kind;m&&(c(),this.createRelation(e,t,m))}),document.addEventListener("pointerdown",l,!0),document.addEventListener("keydown",h,!0),(u=r.querySelector("button"))==null||u.focus()}}const Tn=["select","class","interface","note","link","association","aggregation","composition","extends","implements"];function ps(a,e){const t=[];return a.kind==="class"&&t.push("link","association","aggregation","composition"),a.kind===e.kind&&(a.kind==="class"?a.superclass!==e.name:!a.interfaces.includes(e.name))&&t.push("extends"),a.kind==="class"&&e.kind==="interface"&&!a.interfaces.includes(e.name)&&t.push("implements"),t}function An(a){return a==="select"?'':a==="class"||a==="interface"?``:a==="note"?'':Ts(a)}function Ts(a){const e=(s,i,n=!1)=>``;return``}function ze(a,e,t){const s=t.x-e.x,i=t.y-e.y,n=s===0?1/0:a.w/2/Math.abs(s),o=i===0?1/0:a.h/2/Math.abs(i),r=Math.min(n,o,1);return{x:Math.round(e.x+s*r),y:Math.round(e.y+i*r)}}const Nn=Object.freeze(Object.defineProperty({__proto__:null,ObjectApp:Cn},Symbol.toStringTag,{value:"Module"}));export{Z as a,le as b,re as c,mi as d,di as e,X as f,Nn as g,Je as i,vs as n,gs as o,At as p,U as r,ue as s,ys as u}; diff --git a/website/app/assets/pl-DDkdCN00.js b/website/app/assets/pl-DDkdCN00.js deleted file mode 100644 index 3b614668..00000000 --- a/website/app/assets/pl-DDkdCN00.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Teksty dostępne tylko w wersji webowej. Wszystko inne pochodzi z plików Localizable.strings aplikacji. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagram VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Eksportuj…"; -"web_export_title" = "Zapisz jako obraz lub PDF albo wydrukuj"; -"web_export_png" = "Obraz (PNG)"; -"web_export_svg" = "Grafika wektorowa (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Plik VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Eksport nie powiódł się: %@"; -"web_print_hint" = "Użyj „Eksportuj… → PDF“, aby zapisać diagram i wydrukować go z pliku."; -"web_delete" = "Usuń"; -"web_language_title" = "Język interfejsu"; -"web_simulation_start" = "Uruchom symulację"; -"web_simulation_end" = "Zakończ symulację"; -"web_simulation_start_title" = "Uruchom diagram krok po kroku"; -"web_simulation_end_title" = "Zakończ symulację i wróć do edycji"; -"web_palette_hint" = "Przeciągnij do diagramu"; -"web_tabs_label" = "Diagramy"; -"web_status_modified" = "zmieniony"; -"web_inspector_title" = "Właściwości"; -"web_inspector_resize" = "Zmień wysokość inspektora obiektów: przeciągnij lub przesuń linię w górę lub w dół (dwuklik: domyślnie)"; -"web_inspector_help_drop" = "Przeciągnij elementy z palety na kafelek: góra = przed, dół = za, na „ø“ = zastąp. Istniejące elementy można przesuwać myszą."; -"web_inspector_help_inline" = "Kliknij dwukrotnie lub stuknij dwa razy element, aby edytować tekst bezpośrednio w diagramie (Enter zatwierdza, Esc anuluje). Dotyczy też nazw przypadków."; -"web_inspector_help_files" = "Pliki można też upuścić w oknie."; -"web_case_name" = "Nazwa przypadku"; -"web_case_name_placeholder" = "np. 1, ok, default"; -"web_copied" = "Skopiowano element."; -"web_discard_message_fmt" = "Zmiany w „%@“ zostaną utracone."; -"web_err_unreadable_fmt" = "„%@“ nie jest czytelnym plikiem VisuStruct (%@)."; -"web_saved_fmt" = "Zapisano „%@“."; -"web_saved_txt_fmt" = "Zapisano jako „%@“. Usuń rozszerzenie .txt, aby go użyć."; -"web_drop_impossible" = "Nie można tu upuścić"; -"web_sim_delay" = "Pauza na krok"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Język"; -"web_codegen_comments" = "Tekst diagramu jako komentarze"; -"web_codegen_empty_else" = "Generuj pustą gałąź else w kodzie"; -"web_copied_check" = "Skopiowano ✓"; -"web_copy_manual" = "Zaznaczono, naciśnij Ctrl+C, aby skopiować"; -"web_run_stopped_loop" = "Wykonanie zatrzymane: możliwa pętla nieskończona."; -"web_run_cancelled" = "Wykonanie anulowane."; -"web_run_error" = "Błąd podczas wykonywania."; -"web_run_dropped_fmt" = "… ukryto wcześniejsze wiersze: %d"; -"web_sim_call_arguments_fmt" = "Wywołanie nie pasuje do nagłówka %@. Sprawdź wartości w nawiasach."; -"web_sim_missing_return_fmt" = "%@ zakończył się bez zwrócenia wartości przez return."; -"web_sim_file_not_found_fmt" = "Nie ma pliku o nazwie %@."; -"web_sim_end_of_file_fmt" = "Plik %@ nie ma już więcej wierszy."; -"web_sim_null_value_fmt" = "%@ ma wartość null."; -"web_sim_unknown_variable_case_fmt" = "Nieznana zmienna: %1$@. Java rozróżnia wielkość liter: czy chodziło o %2$@?"; -"web_sim_written_file_fmt" = "%@ (zapisano)"; -"web_site_home" = "Strona główna"; -"web_site_imprint" = "Nota prawna"; -"web_site_privacy" = "Prywatność"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programowanie"; -"web_live_hide" = "Ukryj programowanie"; -"web_scale_canvas" = "Rozmiar tekstu: diagram"; -"web_scale_code" = "Rozmiar tekstu: programowanie"; -"web_live_indent" = "Wcięcia"; -"web_live_indent_title" = "Popraw wcięcia kodu: cztery spacje na poziom (zaznaczone wiersze, w przeciwnym razie wszystko)"; -"web_live_show" = "Pokaż programowanie"; -"web_live_resize" = "Zmień szerokość obszaru kodu (dwuklik: resetuj)"; -"web_live_hint" = "Kod rośnie razem z diagramem. Szary = symbol zastępczy: wpisz tekst w inspektorze, a pojawi się tutaj. Kliknij wiersz, aby zaznaczyć jego element."; -"web_live_ph_selector" = "zmienna"; -"web_live_ph_code" = "Twój kod"; -"web_live_ph_end" = "koniec"; -"web_live_language" = "Język programowania"; -"web_live_java_class" = "Jako klasa"; -"web_live_java_class_hint" = "Nazwa klasy = tytuł diagramu"; -"web_live_java_main" = "Z metodą main"; -"web_settings_display" = "Wygląd"; -"web_live_swing" = "Prawdziwa Java (ze Swing)"; -"web_live_swing_hint" = "Prawdziwa Java z oknami (CheerpJ). Przy pierwszym uruchomieniu jednorazowo pobiera ok. 40 MB."; -"web_live_swing_windows" = "Okna Java"; -"web_live_swing_hide" = "Zamknij okna Java"; -"web_live_swing_loading" = "Ładowanie Javy (za pierwszym razem ok. 40 MB) …"; -"web_live_swing_compiling" = "Kompilowanie …"; -"web_live_swing_running" = "Program działa."; -"web_live_swing_compile_failed" = "Błąd kompilacji, zobacz powyżej."; -"web_live_swing_failed" = "Nie udało się załadować Javy. Sprawdź połączenie z internetem."; -"web_live_hint_edit" = "Wpisz tu kod Java, a diagram zbuduje się sam. Albo pracuj w diagramie, a kod będzie rósł razem z nim. Szary = symbol zastępczy, po prostu pisz."; -"web_live_edit_label" = "Kod Java"; -"web_parse_line_fmt" = "Wiersz %d: %@"; -"web_parse_missing" = "Tu jeszcze brakuje: %@"; -"web_parse_extra" = "Za dużo: %@"; -"web_parse_unclosed_string" = "Brakuje zamykającego %@."; -"web_parse_else_without_if" = "Ten „else” nie ma pasującego „if”."; -"web_parse_case_outside_switch" = "„case” i „default” należą do „switch”."; -"web_parse_missing_do_while" = "Po „do { … }” brakuje jeszcze „while (warunek);”."; -"web_parse_more_methods" = "Na razie liczy się tu tylko jedna metoda. Utwórz kolejne podprogramy w osobnych kartach."; -"web_parse_missing_import" = "Na samej górze brakuje %@ Bez tej linii Java nie zna klasy Scanner."; -"web_parse_missing_scanner" = "Wcześniej brakuje %@ Bez tej linii Scanner nie istnieje."; -"web_parse_unknown_type" = "Java nie zna tego typu danych. Czy chodziło ci o %@?"; -"web_quickfix_insert_fmt" = "Propozycja: wstaw %@"; -"web_quickfix_replace_fmt" = "Propozycja: %1$@ zamiast %2$@"; -"web_parse_wrong_case" = "Java rozróżnia wielkość liter. Poprawnie: %@."; -"web_editor_title" = "Diagram"; -"web_editor_show" = "Pokaż diagram"; -"web_editor_hide" = "Ukryj diagram"; -"web_keywords_title" = "Słowa kluczowe kodu"; -"web_keywords_hint" = "if, while, for zamiast nazw elementów"; -"web_palette_compact" = "Elementy zawsze kompaktowe"; -"web_palette_compact_hint" = "Symbol z małą nazwą pod spodem, w przeciwnym razie tylko przy wąskiej kolumnie"; -"web_about_version_fmt" = "Wersja %@"; -"web_about_software" = "Używane oprogramowanie"; -"web_about_software_text" = "Edytor kodu korzysta z CodeMirror i Lezer (licencja MIT). Z obsługą Swing VisuStruct wczytuje CheerpJ firmy Leaning Technologies (licencja Community) oraz javac z OpenJDK."; -"web_about_licenses" = "Teksty licencji"; -"web_live_run" = "Uruchom"; -"web_live_run_title" = "Uruchom program: wyjście i wejście pojawią się poniżej"; -"web_live_run_finished" = "Program zakończony."; -"web_live_run_stopped" = "Zatrzymano."; -"web_console" = "Konsola"; -"web_console_hide" = "Ukryj konsolę"; -"web_console_resize" = "Zmień wysokość konsoli"; -"web_diagram_tools" = "Narzędzia diagramu"; -"web_files_title" = "Pliki"; -"web_files_show" = "Pokaż pliki"; -"web_files_hide" = "Ukryj pliki"; -"web_files_resize" = "Zmień szerokość plików"; -"web_files_new_folder" = "Nowy folder"; -"web_files_switch" = "Wybierz inny folder"; -"web_files_delete" = "Usuń"; -"web_files_in_browser" = "W pamięci tej przeglądarki"; -"web_files_save_hint_fmt" = "Zapis umieszcza program w %@."; -"web_files_empty" = "Nic jeszcze nie zapisano. Przy zapisie VisuStruct tworzy tu folder z dzisiejszą datą."; -"web_files_reconnect_hint" = "Po przeładowaniu przeglądarka ponownie pyta, czy VisuStruct może używać twojego folderu."; -"web_files_reconnect_fmt" = "Otwórz folder „%@”"; -"web_files_connect_hint" = "Wybierz folder jako obszar roboczy. VisuStruct tworzy w nim folder na każdy dzień oraz zapisuje diagram i kod."; -"web_files_connect" = "Wybierz folder"; -"web_files_browser_hint" = "Ta przeglądarka nie może otwierać folderów na urządzeniu (np. na iPadzie). Twoje pliki pozostają w pamięci tej przeglądarki."; -"web_files_browser" = "Zapisz w przeglądarce"; -"web_files_delete_confirm_fmt" = "Na pewno usunąć „%@”?"; -"web_files_folder_prompt" = "Nazwa nowego folderu:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Zapisano: %@"; -"web_files_create" = "Utwórz"; -"web_learn_ludwig_tip" = "Wskazówka Ludwiga"; -"web_game_title" = "Gra: Prawda czy fałsz?"; -"web_game_intro" = "Ludwig pokazuje wartości i warunek. Czy warunek jest prawdziwy (true), czy fałszywy (false)? Dziesięć rund, coraz trudniejszych."; -"web_game_start" = "Zacznij grę"; -"web_game_round_fmt" = "Runda %@ z %@"; -"web_game_score_fmt" = "Punkty: %@"; -"web_game_true" = "prawda (true)"; -"web_game_false" = "fałsz (false)"; -"web_game_right" = "Dobrze!"; -"web_game_wrong" = "Niestety źle. Tak to się liczy:"; -"web_game_next" = "Dalej"; -"web_game_finish" = "Wynik"; -"web_game_done_fmt" = "%@ z %@ dobrze."; -"web_game_perfect" = "Wszystko dobrze – Ludwig jest pod wrażeniem!"; -"web_game_good" = "Świetnie! Przejrzyj błędy i spróbuj jeszcze raz."; -"web_game_practice" = "Trening czyni mistrza. Przeczytaj jeszcze raz tabelę prawdy i zagraj ponownie."; -"web_game_again" = "Zagraj ponownie"; -"web_game_wrong_short" = "Niestety źle."; -"web_game_practice_short" = "Praktyka czyni mistrza. Przeczytaj jeszcze raz wyjaśnienia i zagraj kolejną rundę."; -"web_game_clicks" = "Kliknięcia:"; -"web_game_nobody" = "Nikt nie słucha – nic się nie dzieje."; -"web_game_event_fmt" = "Kliknięcie „%@”: słuchacz to słyszy i wykonuje swój kod."; -"web_game_try" = "Teraz sam wypróbuj przyciski w oknie."; -"web_game_time_fmt" = "Zostało %@ s"; -"web_game_defused" = "✂️ Rozbrojona! Znalazłeś błąd."; -"web_game_boom_time" = "💥 Bum! Czas minął."; -"web_game_boom_wrong" = "💥 Bum! To była zła linia."; -"web_game_boom_part" = "💥 Bum! Dobra linia, ale błąd jest w innej części."; -"web_game_boom_wrong_part" = "💥 Bum! Błąd jest w innej linii."; -"web_game_bomb_parts_hint" = "Stuknij dokładnie w błędną część."; -"web_game_fix" = "Poprawna linia:"; -"web_game_order_hint" = "Stuknij kroki we właściwej kolejności."; -"web_debug_step" = "Krok"; -"web_debug_step_title" = "Krok: wykonaj jedną instrukcję i zatrzymaj się ponownie"; -"web_debug_continue" = "Dalej do następnego punktu przerwania"; -"web_debug_paused_fmt" = "Zatrzymano przed wierszem %d."; -"web_debug_gutter_title" = "Kliknij numer wiersza, aby ustawić lub usunąć punkt przerwania"; -"web_swap_to_code" = "Programowanie duże"; -"web_swap_to_editor" = "Diagram duży"; -"web_editor_resize" = "Zmień szerokość diagramu"; -"web_palette_resize" = "Zmień szerokość elementów"; -"web_palette_hide" = "Ukryj elementy"; -"web_palette_show" = "Pokaż elementy"; -"web_code_scopes" = "Kolorowe bloki kodu"; -"web_code_scopes_hint" = "Klasa, metoda, pętla, rozgałęzienie we własnych ramkach"; -"web_pseudocode" = "Pseudokod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Zmień nazwę zmiennej …"; -"web_rename_title" = "Zmień nazwę zmiennej"; -"web_rename_old" = "Nazwa"; -"web_rename_new" = "Nowa nazwa"; -"web_rename_hint" = "Zmienia każde miejsce o dokładnie tej pisowni (liczba to nie Liczba), w kodzie i w strukturogramie. Tekst w \\"…\\" i komentarze zostają."; -"web_rename_count_fmt" = "Występuje %d razy."; -"web_rename_exists_fmt" = "„%@” już istnieje: potem obie byłyby jedną zmienną."; -"web_rename_invalid" = "Nazwa zaczyna się od litery i zawiera tylko litery, cyfry i _."; -"web_rename_keyword_fmt" = "„%@” to słowo kluczowe Javy."; -"web_rename_apply" = "Zmień nazwę"; -"web_rename_cancel" = "Anuluj"; -`;export{e as default}; diff --git a/website/app/assets/projectZip-DtugKwEc.js b/website/app/assets/projectZip-DtugKwEc.js deleted file mode 100644 index 8df1ebd5..00000000 --- a/website/app/assets/projectZip-DtugKwEc.js +++ /dev/null @@ -1 +0,0 @@ -import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-ClGVaIKp.js";import"./index-BqSgHxq8.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; diff --git a/website/app/assets/pt-PT-aHTlqnII.js b/website/app/assets/pt-PT-aHTlqnII.js deleted file mode 100644 index 39a9874e..00000000 --- a/website/app/assets/pt-PT-aHTlqnII.js +++ /dev/null @@ -1,799 +0,0 @@ -const e=`/* Textos que só existem na versão web. Tudo o resto vem dos Localizable.strings da app. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Diagrama estruturado VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exportar…"; -"web_export_title" = "Guardar como imagem ou PDF, ou imprimir"; -"web_export_png" = "Imagem (PNG)"; -"web_export_svg" = "Gráfico vetorial (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Ficheiro VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Falha na exportação: %@"; -"web_print_hint" = "Use “Exportar… → PDF” para guardar o diagrama e imprimi-lo a partir daí."; -"web_delete" = "Eliminar"; -"web_language_title" = "Idioma da interface"; -"web_simulation_start" = "Iniciar simulação"; -"web_simulation_end" = "Terminar simulação"; -"web_simulation_start_title" = "Executar o diagrama passo a passo"; -"web_simulation_end_title" = "Terminar a simulação e continuar a editar"; -"web_palette_hint" = "Arrastar para o diagrama"; -"web_tabs_label" = "Diagramas"; -"web_status_modified" = "alterado"; -"web_inspector_title" = "Inspetor de objetos"; -"web_inspector_help_drop" = "Arraste elementos da paleta para um bloco: em cima = antes, em baixo = depois, sobre “ø” = substituir. Os elementos existentes podem ser movidos com o rato."; -"web_inspector_help_inline" = "Faça duplo clique ou toque duplo num elemento para editar o texto diretamente no diagrama (Enter aplica, Esc cancela). Os nomes dos casos também."; -"web_inspector_help_files" = "Também pode largar ficheiros na janela."; -"web_case_name" = "Nome do caso"; -"web_case_name_placeholder" = "p. ex. 1, ok, default"; -"web_copied" = "Elemento copiado."; -"web_discard_message_fmt" = "As alterações a “%@” serão perdidas."; -"web_err_unreadable_fmt" = "“%@” não é um ficheiro VisuStruct legível (%@)."; -"web_saved_fmt" = "“%@” guardado."; -"web_saved_txt_fmt" = "Guardado como “%@”. Remova a extensão .txt para o utilizar."; -"web_drop_impossible" = "Não é possível largar aqui"; -"web_sim_delay" = "Pausa por passo"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Linguagem"; -"web_codegen_comments" = "Texto do diagrama como comentários"; -"web_codegen_empty_else" = "Gerar ramo else vazio no código"; -"web_copied_check" = "Copiado ✓"; -"web_copy_manual" = "Selecionado, prima Ctrl+C para copiar"; -"web_run_stopped_loop" = "Execução interrompida: possível ciclo infinito."; -"web_run_cancelled" = "Execução cancelada."; -"web_run_error" = "Erro durante a execução."; -"web_run_dropped_fmt" = "… %d linhas anteriores ocultas"; -"web_learn_title" = "Aprender"; -"web_learn_hide" = "Recolher a área de aprendizagem"; -"web_learn_show" = "Expandir a área de aprendizagem: lições, exercícios e consulta"; -"web_learn_lessons" = "Lições"; -"web_learn_tasks" = "Exercícios"; -"web_learn_reference" = "Consulta"; -"web_learn_intro" = "Aprende passo a passo, com exercícios. O teu progresso fica guardado neste navegador."; -"web_learn_tasks_intro" = "Pequenos projetos sem instruções. Cada um indica a lição que deves terminar primeiro."; -"web_learn_step_of_fmt" = "Passo %d de %d"; -"web_learn_lesson_fmt" = "Lição %d"; -"web_learn_all_lessons" = "Todas as lições"; -"web_learn_all_tasks" = "Todos os exercícios"; -"web_learn_back" = "Voltar"; -"web_learn_next" = "Seguinte"; -"web_learn_finish" = "Terminar a lição"; -"web_learn_done" = "Concluída"; -"web_learn_after_fmt" = "Depois da lição %d: %@"; -"web_learn_level_fmt" = "Dificuldade %d de 3"; -"web_learn_exercise" = "Exercício"; -"web_learn_brag" = "Curiosidades com o Ludwig"; -"web_learn_solved" = "resolvido"; -"web_learn_open_exercise" = "Abrir no editor"; -"web_learn_solve_in_editor" = "Resolve este exercício na área %@."; -"web_learn_solve_in_code" = "Resolve este exercício na área %@."; -"web_learn_solve_in_both" = "Resolve este exercício nas áreas %1$@ e %2$@."; -"web_learn_open_in_editor" = "Abrir no editor"; -"web_learn_replay" = "Repetir animação"; -"web_learn_graphic_labels" = "👆 Clica na imagem para mostrar ou esconder as legendas"; -"web_learn_check" = "Verificar"; -"web_learn_hint" = "Dica"; -"web_learn_reset" = "Recomeçar"; -"web_learn_reset_confirm" = "Queres mesmo recomeçar?"; -"web_learn_solution" = "Mostrar a solução"; -"web_learn_hint_more" = "Outra dica"; -"web_learn_hint_fmt" = "Dica %d de %d"; -"web_learn_teacher" = "Para professores"; -"web_learn_teacher_intro" = "O código de professor mostra as soluções de todos os exercícios. O navegador memoriza-o."; -"web_learn_teacher_code" = "Código de professor"; -"web_learn_teacher_unlock" = "Desbloquear"; -"web_learn_teacher_wrong" = "O código não está correto."; -"web_learn_teacher_on" = "O modo de professor está ativo: as soluções de todos os exercícios estão visíveis."; -"web_learn_teacher_off" = "Sair do modo de professor"; -"web_learn_open_first" = "Abre primeiro o exercício no editor e constrói lá o teu estrutograma."; -"web_learn_empty" = "O teu estrutograma ainda está vazio. Arrasta primeiro elementos da área «Elementos» para ele."; -"web_learn_passed" = "Muito bem! O teu estrutograma faz exatamente o que deve."; -"web_learn_failed" = "Ainda não está bem. Compara a saída esperada com a tua:"; -"web_learn_missing_fmt" = "O teu estrutograma ainda precisa de: %@"; -"web_learn_input_fmt" = "Entrada: %@"; -"web_learn_no_input" = "Sem entrada"; -"web_learn_expected" = "Esperado"; -"web_learn_actual" = "A tua saída"; -"web_learn_missing_input" = "O teu estrutograma pede mais entradas do que o previsto."; -"web_learn_unused_input" = "O teu estrutograma não pede todas as entradas."; -"web_learn_missing_line_break" = "Quase! Só falta uma quebra de linha. System.out.print continua a escrever na mesma linha, System.out.println começa depois uma linha nova."; -"web_learn_too_many_steps" = "Parado após 100 000 passos. Há um ciclo que nunca termina?"; -"web_learn_score_fmt" = "%d de %d certas"; -"web_learn_cloze_hint" = "Escreve as palavras que faltam nos espaços e carrega em “Verificar”."; -"web_learn_cloze_score_fmt" = "%d de %d espaços certos"; -"web_learn_cloze_all_right" = "Todos os espaços certos!"; -"web_learn_cloze_solution" = "Mostrar solução"; -"web_learn_cloze_again" = "De novo"; -"web_learn_pap_hint" = "Toca num elemento à direita e depois no seu lugar no fluxograma. Também o podes arrastar. Tocar num lugar ocupado devolve o elemento."; -"web_learn_pap_score_fmt" = "%d de %d elementos certos"; -"web_learn_pap_all_right" = "Tudo certo! O teu fluxograma está pronto."; -"web_learn_pap_missing_fmt" = "Ainda faltam %d elementos."; -"web_learn_pap_empty" = "Lugar vazio"; -"web_learn_pap_yes" = "sim"; -"web_learn_pap_no" = "não"; -"web_learn_pap_legend_oval" = "Início ou fim"; -"web_learn_pap_legend_rect" = "Instrução"; -"web_learn_pap_legend_diamond" = "Decisão: pergunta com sim e não"; -"web_learn_pap_legend_para" = "Entrada ou saída"; -"web_learn_review" = "Rever"; -"web_learn_terms" = "Termos técnicos"; -"web_inspector_resize" = "Alterar a altura do inspetor de objetos: arrastar ou deslizar a linha para cima ou para baixo (duplo clique: padrão)"; -"web_learn_resize" = "Alterar a largura da área de aprendizagem (duplo clique: repor)"; -"web_learn_competences_intro" = "No fim desta lição consigo …"; -"web_learn_rating_sun" = "consigo com segurança"; -"web_learn_rating_cloud" = "em parte"; -"web_learn_rating_umbrella" = "ainda não"; -"web_learn_review_title" = "A tua lista de verificação em comparação"; -"web_learn_review_hint" = "Aqui a tua autoavaliação e o teste não coincidem. Lê o passo outra vez e volta a avaliar-te na lista de verificação."; -"web_learn_review_match" = "A tua autoavaliação corresponde ao teu teste. Muito bem!"; -"web_learn_review_overrated_fmt" = "Escolheste ☀️, mas a pergunta %@ estava errada."; -"web_learn_review_underrated" = "Todas as perguntas sobre isto estavam certas. Sabes mais do que pensas!"; -"web_learn_review_unrated" = "ainda não avaliado"; -"web_learn_back_to_checklist" = "Voltar à lista de verificação"; -"web_learn_step_fmt" = "Passo %d: %@"; -"web_sim_call_arguments_fmt" = "A chamada não corresponde ao cabeçalho de %@. Verifica os valores entre parênteses."; -"web_sim_missing_return_fmt" = "%@ terminou sem devolver um valor com return."; -"web_sim_file_not_found_fmt" = "Não existe nenhum ficheiro chamado %@."; -"web_sim_end_of_file_fmt" = "O ficheiro %@ não tem mais linhas."; -"web_sim_null_value_fmt" = "%@ é null."; -"web_sim_unknown_variable_case_fmt" = "Variável desconhecida: %1$@. O Java distingue maiúsculas de minúsculas: querias dizer %2$@?"; -"web_sim_written_file_fmt" = "%@ (guardado)"; -"web_site_home" = "Página inicial"; -"web_site_imprint" = "Contacto"; -"web_site_privacy" = "Privacidade"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Código"; -"web_live_hide" = "Ocultar código"; -"web_scale_canvas" = "Tamanho do texto: estrutograma"; -"web_scale_code" = "Tamanho do texto: Código"; -"web_live_indent" = "Indentar"; -"web_live_indent_title" = "Indentar e formatar o código: cada } na sua própria linha, espaços à volta dos operadores, quatro espaços por nível (linhas selecionadas, senão tudo)"; -"web_live_show" = "Mostrar código"; -"web_live_resize" = "Alterar a largura da área de código (duplo clique: repor)"; -"web_live_hint" = "O código cresce com o teu diagrama. Cinzento = marcador: escreve no inspetor de objetos e o teu texto aparece aí. Clica numa linha para selecionar o elemento."; -"web_live_ph_selector" = "variável"; -"web_live_ph_code" = "O teu código"; -"web_live_ph_end" = "fim"; -"web_live_language" = "Linguagem de programação"; -"web_live_java_class" = "Como classe"; -"web_live_java_class_hint" = "Nome da classe = título do diagrama"; -"web_live_java_main" = "Com método main"; -"web_settings_display" = "Apresentação"; -"web_live_swing" = "Java verdadeiro (com Swing)"; -"web_live_swing_hint" = "Java verdadeiro com janelas (CheerpJ). Descarrega cerca de 40 MB uma vez, na primeira execução."; -"web_live_swing_windows" = "Janelas Java"; -"web_live_swing_hide" = "Fechar janelas Java"; -"web_live_swing_loading" = "A carregar o Java (cerca de 40 MB na primeira vez) …"; -"web_live_swing_compiling" = "A compilar …"; -"web_live_swing_running" = "O programa está a correr."; -"web_live_swing_compile_failed" = "Erro de compilação, vê acima."; -"web_live_swing_failed" = "Não foi possível carregar o Java. Verifica a ligação à internet."; -"web_live_hint_edit" = "Escreve aqui código Java e o diagrama constrói-se sozinho. Ou trabalha no diagrama e o código cresce com ele. Cinzento = marcador, basta escrever por cima."; -"web_live_edit_label" = "Código Java"; -"web_parse_line_fmt" = "Linha %d: %@"; -"web_parse_missing" = "Ainda falta aqui: %@"; -"web_parse_extra" = "Está a mais: %@"; -"web_parse_unclosed_string" = "Falta aqui o %@ de fecho."; -"web_parse_else_without_if" = "Este “else” não tem um “if” correspondente."; -"web_parse_case_outside_switch" = "“case” e “default” pertencem a um “switch”."; -"web_parse_missing_do_while" = "Depois de “do { … }” ainda falta “while (condição);”."; -"web_parse_more_methods" = "Por agora só conta um método aqui. Cria outros subprogramas em separadores próprios."; -"web_parse_missing_import" = "Falta %@ mesmo no início. Sem esta linha, o Java não conhece o Scanner."; -"web_parse_missing_scanner" = "Falta antes %@ Sem esta linha, o Scanner não existe."; -"web_parse_unknown_type" = "O Java não conhece este tipo de dados. Querias dizer %@?"; -"web_quickfix_insert_fmt" = "Sugestão: inserir %@"; -"web_quickfix_replace_fmt" = "Sugestão: %1$@ em vez de %2$@"; -"web_parse_wrong_case" = "O Java distingue maiúsculas de minúsculas. O correto é %@."; -"web_editor_title" = "Diagrama"; -"web_editor_show" = "Mostrar diagrama"; -"web_editor_hide" = "Ocultar diagrama"; -"web_keywords_title" = "Palavras-chave do código"; -"web_keywords_hint" = "if, while, for em vez de Decisão, Ciclo …"; -"web_palette_compact" = "Elementos sempre compactos"; -"web_palette_compact_hint" = "Símbolo com o nome pequeno por baixo; caso contrário, só com a coluna estreita"; -"web_about_version_fmt" = "Versão %@"; -"web_about_software" = "Software utilizado"; -"web_about_software_text" = "O editor de código usa o CodeMirror e o Lezer (licença MIT). Com o suporte para Swing, o VisuStruct carrega o CheerpJ da Leaning Technologies (licença Community) e o javac do OpenJDK."; -"web_about_licenses" = "Textos das licenças"; -"web_live_run" = "Executar"; -"web_live_run_title" = "Executar o programa: as saídas e entradas aparecem em baixo"; -"web_live_run_finished" = "Programa terminado."; -"web_live_run_stopped" = "Parado."; -"web_console" = "Consola"; -"web_console_hide" = "Ocultar consola"; -"web_console_resize" = "Alterar a altura da consola"; -"web_diagram_tools" = "Ferramentas do diagrama"; -"web_files_title" = "Ficheiros"; -"web_files_show" = "Mostrar ficheiros"; -"web_files_hide" = "Ocultar ficheiros"; -"web_files_resize" = "Alterar a largura dos ficheiros"; -"web_files_new_folder" = "Nova pasta"; -"web_files_switch" = "Escolher outra pasta"; -"web_files_delete" = "Eliminar"; -"web_files_in_browser" = "No armazenamento deste navegador"; -"web_files_save_hint_fmt" = "Guardar coloca o programa em %@."; -"web_files_empty" = "Ainda nada guardado. Ao guardar, o VisuStruct cria aqui uma pasta com a data de hoje."; -"web_files_reconnect_hint" = "Depois de recarregar, o navegador pergunta outra vez se o VisuStruct pode usar a tua pasta."; -"web_files_reconnect_fmt" = "Abrir a pasta “%@”"; -"web_files_connect_hint" = "Escolhe uma pasta como área de trabalho, de preferência uma pasta nova “VisuStruct-Ficheiros” nos teus Documentos. O VisuStruct cria lá uma pasta para cada dia e guarda o diagrama e o código."; -"web_files_connect" = "Escolher pasta"; -"web_files_browser_hint" = "Este navegador não consegue abrir pastas no dispositivo (por exemplo no iPad). Os teus ficheiros ficam no armazenamento deste navegador."; -"web_files_browser" = "Guardar no navegador"; -"web_files_delete_confirm_fmt" = "Eliminar mesmo “%@”?"; -"web_files_folder_prompt" = "Nome da nova pasta:"; -"web_files_default_name" = "Programa"; -"web_files_saved_fmt" = "Guardado: %@"; -"web_files_create" = "Criar"; -"web_learn_ludwig_tip" = "Dica do Ludwig"; -"web_game_title" = "Jogo: Verdadeiro ou falso?"; -"web_game_intro" = "O Ludwig mostra-te valores e uma condição. A condição é verdadeira (true) ou falsa (false)? Dez rondas, cada vez mais difíceis."; -"web_game_start" = "Começar o jogo"; -"web_game_round_fmt" = "Ronda %@ de %@"; -"web_game_score_fmt" = "Pontos: %@"; -"web_game_true" = "verdadeiro (true)"; -"web_game_false" = "falso (false)"; -"web_game_right" = "Certo!"; -"web_game_wrong" = "Não exatamente. É assim que se calcula:"; -"web_game_next" = "Seguinte"; -"web_game_finish" = "Resultado"; -"web_game_done_fmt" = "%@ de %@ certas."; -"web_game_perfect" = "Tudo certo – o Ludwig está mesmo impressionado!"; -"web_game_good" = "Muito bem! Revê os teus erros e tenta outra vez."; -"web_game_practice" = "A prática faz o mestre. Lê outra vez a tabela de verdade acima e joga mais uma ronda."; -"web_game_again" = "Jogar outra vez"; -"web_game_wrong_short" = "Infelizmente errado."; -"web_game_practice_short" = "A prática leva à perfeição. Lê outra vez as explicações e joga mais uma ronda."; -"web_game_clicks" = "Cliques:"; -"web_game_nobody" = "Ninguém está a ouvir – não acontece nada."; -"web_game_event_fmt" = "Clique em “%@”: o ouvinte ouve e executa o seu código."; -"web_game_try" = "Agora experimenta tu os botões da janela."; -"web_game_time_fmt" = "Faltam %@ s"; -"web_game_defused" = "✂️ Desativada! Encontraste o erro."; -"web_game_boom_time" = "💥 Bum! O tempo acabou."; -"web_game_boom_wrong" = "💥 Bum! Era a linha errada."; -"web_game_boom_part" = "💥 Bum! A linha está certa, mas o erro está noutra parte dela."; -"web_game_boom_wrong_part" = "💥 Bum! O erro está noutra linha."; -"web_game_bomb_parts_hint" = "Toca exatamente na parte errada."; -"web_game_fix" = "A linha correta:"; -"web_game_order_hint" = "Toca nos passos pela ordem certa."; -"web_debug_step" = "Passo a passo"; -"web_debug_step_title" = "Passo a passo: executar uma instrução e parar outra vez"; -"web_debug_continue" = "Continuar até ao próximo ponto de paragem"; -"web_debug_paused_fmt" = "Parado antes da linha %d."; -"web_debug_gutter_title" = "Clica num número de linha para pôr ou tirar um ponto de paragem"; - -/* Lernbereich: Caesar-Scheibe */ -"web_learn_caesar_title" = "Disco de César"; -"web_learn_caesar_hint" = "Roda o disco interior ou toca em −1 e +1. Por fora está o texto simples, por dentro o texto cifrado."; -"web_learn_caesar_key_fmt" = "Chave %d"; -"web_learn_caesar_plain" = "Texto simples"; -"web_learn_caesar_secret" = "Texto cifrado"; -"web_learn_caesar_encrypt" = "Cifrar"; -"web_learn_caesar_decrypt" = "Decifrar"; -"web_learn_caesar_back" = "Rodar o disco uma letra para trás"; -"web_learn_caesar_forward" = "Rodar o disco uma letra para a frente"; -"web_learn_rescue_station_fmt" = "Estação %@ de %@: %@"; -"web_learn_rescue_number" = "O teu número"; -"web_learn_rescue_not_number" = "Escreve um número inteiro."; -"web_learn_rescue_wrong" = "Ainda não. Lê o código outra vez, carácter a carácter."; -"web_learn_rescue_letter_moved" = "A letra vai para as palavras cruzadas."; -"web_learn_rescue_alphabet" = "O teu número transforma-se numa letra:"; -"web_learn_rescue_to_crossword" = "Para as palavras cruzadas"; -"web_learn_rescue_crossword" = "As palavras cruzadas"; -"web_learn_rescue_across" = "→ Horizontais"; -"web_learn_rescue_down" = "↓ Verticais"; -"web_learn_rescue_cell_fmt" = "Quadrado linha %@, coluna %@"; -"web_learn_rescue_keyword" = "Palavra secreta:"; -"web_learn_rescue_cw_wrong" = "Os quadrados marcados a vermelho ainda não estão certos."; -"web_learn_rescue_cw_done" = "Resolvido! Os quadrados amarelos formam a palavra secreta."; -"web_learn_rescue_to_gate" = "Para o portão"; -"web_learn_rescue_gate" = "O portão"; -"web_learn_rescue_word" = "Palavra secreta"; -"web_learn_rescue_open" = "Abrir o portão"; -"web_learn_rescue_gate_case" = "Quase! O equals distingue maiúsculas de minúsculas. Escreve a palavra exatamente como nas palavras cruzadas."; -"web_learn_rescue_gate_wrong" = "O portão continua fechado. Olha outra vez para os quadrados amarelos."; -"web_learn_rescue_freed" = "🎉 O portão está aberto!"; - -/* VisuBot (mBot2-Modus), nur de/en/pt */ -"web_visubot_world_title" = "Com o que queres trabalhar?"; -"web_visubot_world_visustruct_hint" = "VisuStruct: estrutogramas e Java com o curso completo. Podes mudar a qualquer momento na roda dentada."; -"web_visubot_world_visubot_hint" = "VisuBot: programar o robô mBot2, com lições e tarefas próprias. Podes mudar a qualquer momento na roda dentada."; -"web_visubot_connect" = "Ligar o mBot2 real"; -"web_visubot_upload_button" = "Transferir"; -"web_visubot_blocks" = "Blocos"; -"web_visubot_blocks_title" = "Mostrar o diagrama como blocos"; -"web_visubot_blocks_back" = "Diagrama"; -"web_visubot_blocks_back_title" = "Voltar ao diagrama"; -"web_visubot_blocks_start" = "Quando o programa começa"; -"web_visubot_blocks_empty" = "Aqui vai um bloco"; -"web_visubot_blocks_hint" = "O mesmo programa em blocos. Arrasta blocos de “Elementos”, muda-os de lugar ou deita-os no lixo. Clica num número ou texto nos campos brancos para o alterar no próprio bloco; o resto altera-se em baixo, no Inspetor de objetos. Arrasta os sensores para uma condição ou mesmo para o campo que devem substituir. Arrasta operadores e variáveis da mesma forma para um campo ou uma condição."; -"web_visubot_blocks_trash" = "Lixo"; -"web_visubot_blocks_count" = "contar com"; -"web_visubot_blocks_count_from" = "de"; -"web_visubot_blocks_count_below" = "até abaixo de"; -"web_visubot_blocks_count_to" = "até"; -"web_visubot_blocks_count_above" = "até acima de"; -"web_visubot_blocks_count_step" = "em passos de"; -"web_visubot_blocks_repeat" = "repetir"; -"web_visubot_blocks_if" = "se"; -"web_visubot_blocks_else" = "senão"; -"web_visubot_blocks_while" = "enquanto"; -"web_visubot_blocks_endless" = "repetir sempre"; -"web_visubot_blocks_do" = "faz"; -"web_visubot_blocks_not" = "não"; -"web_visubot_blocks_and" = "e"; -"web_visubot_blocks_or" = "ou"; -"web_visubot_blocks_break" = "sair do ciclo"; -"web_visubot_blocks_repeat_times" = "vezes"; -"web_visubot_blocks_random_from" = "número aleatório de"; -"web_visubot_blocks_random_to" = "a"; -"web_visubot_operators" = "Operadores"; -"web_visubot_variables" = "Variáveis"; -"web_visubot_control" = "Controlo"; -"web_visubot_el_repeat" = "repetir 10 vezes"; -"web_visubot_upload_title" = "Transferir o programa para o mBot2"; -"web_visubot_upload_step1" = "Liga o mBot2 com o cabo USB e acende-o. Só funciona no Chrome ou no Edge."; -"web_visubot_upload_step2" = "Clica em “Transferir agora” e escolhe “USB Serial”. O mBot2 guarda o teu programa e reinicia."; -"web_visubot_upload_step3" = "Desliga o cabo e põe o mBot2 na partida. Quando carregas no botão A, o programa arranca. Fica guardado, mesmo depois de desligar."; -"web_visubot_upload_start" = "Transferir agora"; -"web_visubot_upload_busy" = "A transferir … não desligues o cabo."; -"web_visubot_upload_done" = "Pronto! Desliga o cabo, põe o mBot2 na partida e carrega no botão A."; -"web_visubot_upload_failed" = "A transferência não funcionou. Reinicia o mBot2 e tenta outra vez."; -"web_visubot_upload_label" = "A = Início"; -"web_visubot_upload_error_input" = "O teu programa pede uma entrada. O mBot2 não tem teclado, por isso não funciona."; -"web_visubot_upload_error_files" = "O teu programa trabalha com ficheiros. Isso não funciona no mBot2."; -"web_visubot_upload_error_empty" = "O teu programa ainda está vazio."; -"web_visubot_disconnect" = "Desligar"; -"web_visubot_connecting" = "A ligar … (o CyberPi reinicia brevemente)"; -"web_visubot_connected" = "O mBot2 real conduz também"; -"web_visubot_no_serial" = "mBot2 real: só no Chrome ou Edge num computador."; -"web_visubot_link_error" = "Ligação perdida"; -"web_visubot_world" = "Mundo VisuBot"; -"web_visubot_no_3d" = "A vista 3D não consegue arrancar neste navegador."; -"web_visubot_distance" = "Distância"; -"web_visubot_line" = "Linha"; -"web_visubot_bumps" = "bateu na parede"; -"web_visubot_el_forward" = "andar para a frente"; -"web_visubot_el_backward" = "andar para trás"; -"web_visubot_el_right" = "rodar à direita"; -"web_visubot_el_left" = "rodar à esquerda"; -"web_visubot_el_led" = "LEDs ligados"; -"web_visubot_el_tone" = "tocar um som"; -"web_visubot_drive" = "Percurso"; -"web_visubot_depth_fmt" = "Os ciclos têm de estar encaixados %d vezes."; -"web_visubot_tap_part" = "Roda o mBot2 com o rato ou o dedo. Toca numa peça para ver o nome."; -"web_visubot_quiz_right" = "Certo!"; -"web_visubot_quiz_wrong_fmt" = "Isso é: %@. Tenta outra vez."; -"web_visubot_part_cyberpi" = "CyberPi"; -"web_visubot_part_screen" = "Ecrã"; -"web_visubot_part_joystick" = "Joystick"; -"web_visubot_part_buttons" = "Botões A, B e Home"; -"web_visubot_part_leds" = "LEDs RGB"; -"web_visubot_part_lightSensor" = "Sensor de luz"; -"web_visubot_part_microphone" = "Microfone"; -"web_visubot_part_shield" = "Shield do mBot2 com bateria"; -"web_visubot_part_powerSwitch" = "Interruptor"; -"web_visubot_part_motors" = "Motores com encoder"; -"web_visubot_part_wheels" = "Rodas"; -"web_visubot_part_ultrasonic" = "Sensor ultrassónico"; -"web_visubot_part_lineSensor" = "Sensor de linha (quad RGB)"; -"web_visubot_part_caster" = "Roda livre"; -"web_visubot_part_chassis" = "Chassi"; -"web_visubot_world_fmt" = "Mundo %d"; -"web_visubot_goal_reached" = "Objetivo alcançado"; -"web_visubot_goal_missed" = "Objetivo não alcançado"; -"web_visubot_commands" = "Comandos do mBot2"; -"web_visubot_sensors" = "Sensores do mBot2"; -"web_visubot_sensor_distance" = "Distância"; -"web_visubot_sensor_line" = "Linha"; -"web_visubot_el_led_off" = "LEDs desligados"; -"web_visubot_el_led_color" = "cor do LED"; -"web_visubot_el_wait" = "esperar um pouco"; -"web_visubot_el_emotion" = "mostrar um sentimento"; -"web_visubot_el_text" = "mostrar texto"; -"web_visubot_sensor_color" = "A cor é vermelha?"; -"web_visubot_sensor_button_a" = "Botão A premido?"; -"web_visubot_sensor_button_b" = "Botão B premido?"; -"web_visubot_sensor_joy_up" = "Joystick para cima?"; -"web_visubot_sensor_joy_down" = "Joystick para baixo?"; -"web_visubot_sensor_joy_left" = "Joystick para a esquerda?"; -"web_visubot_sensor_joy_right" = "Joystick para a direita?"; -"web_visubot_sensor_brightness" = "Luminosidade"; -"web_visubot_sensor_loudness" = "Volume do som"; -"web_visubot_sensor_pitch" = "Inclinação frente/trás"; -"web_visubot_sensor_roll" = "Inclinação lateral"; -"web_visubot_sensor_shake" = "Abanado?"; -"web_visubot_el_drive" = "rodas separadas"; -"web_visubot_el_stop" = "parar"; -"web_visubot_el_timer" = "cronómetro a 0"; -"web_visubot_sensor_line_left" = "Linha à esquerda?"; -"web_visubot_sensor_line_right" = "Linha à direita?"; -"web_visubot_sensor_timer" = "Cronómetro (s)"; -"web_visubot_sensor_battery" = "Bateria (%)"; -"web_visubot_actions" = "Comandos"; -"web_visubot_led_on" = "LEDs ligados"; -"web_visubot_led_off" = "LEDs desligados"; -"web_visubot_tone_yes" = "som"; -"web_visubot_tone_no" = "sem som"; -"web_visubot_controls" = "Experimentar os sensores"; -"web_visubot_controls_hint" = "Sem um mBot2 real: define aqui o que os sensores medem. Botões, joystick e abanar duram um segundo."; -"web_visubot_shake" = "abanar"; -"web_visubot_check" = "Testar o mBot2"; -"web_visubot_check_hint" = "Experimenta cada atuador uma vez. Os valores dos sensores atualizam-se em direto: põe a mão à frente do sensor ultrassónico, carrega nos botões, inclina ou abana o mBot2. Levanta-o para testar as rodas."; -"web_visubot_check_forward" = "Rodas 1 s para a frente"; -"web_visubot_check_spin" = "Rodar no lugar 1 s"; - -/* Start: Ordner für Lernstand und Programme */ -"web_learn_start_title" = "Onde guardas o teu trabalho?"; -"web_learn_start_hint" = "O teu progresso e os teus programas ficam numa pasta no teu dispositivo. O progresso fica no ficheiro learnProgress.json."; -"web_learn_start_continue_fmt" = "Continuar com “%@”"; -"web_learn_start_open" = "Abrir pasta existente"; -"web_learn_start_create_fmt" = "Criar nova pasta “%@”"; -"web_learn_start_create_hint" = "Depois escolhes onde fica, por exemplo em “Documentos”."; -"web_learn_start_folder" = "VisuStruct-Ficheiros"; -"web_learn_start_without" = "Continuar sem pasta"; -"web_learn_start_without_hint" = "Assim o teu progresso perde-se ao fechar a página."; -"web_visubot_preview_title" = "mBot2 ao vivo"; -"web_visubot_preview_hint" = "Mostra logo para onde o teu programa leva o mBot2."; -"web_visubot_preview_sim_title" = "Simulação"; -"web_visubot_preview_sim_hint" = "O mBot2 anda aqui enquanto a simulação corre."; -"web_visubot_world_in_preview" = "O mBot2 anda na janela «Simulação»."; -"web_visubot_preview_play" = "Reproduzir o percurso"; -"web_visubot_preview_stop" = "Parar"; -"web_visubot_preview_hide" = "Recolher mBot2 ao vivo"; -"web_visubot_preview_show" = "Mostrar mBot2 ao vivo"; -"web_visubot_preview_resize" = "Alterar o tamanho de mBot2 ao vivo"; -"web_visubot_preview_stack" = "Por baixo do código na área Código"; -"web_visubot_preview_side" = "Como coluna própria"; -"web_visubot_preview_distance_fmt" = "Percurso: %d cm"; -"web_visubot_preview_input" = "precisa de uma entrada, inicia a simulação para isso"; -"web_visubot_preview_limit" = "demora muito (ciclo infinito?), mostra-se o início"; -"web_visubot_group_drive" = "Andar e rodar"; -"web_visubot_group_wheels" = "Rodas separadas"; -"web_visubot_group_leds" = "Luz"; -"web_visubot_group_sound" = "Som"; -"web_visubot_group_screen" = "Ecrã"; -"web_visubot_group_emotion" = "Emoções"; -"web_visubot_group_wait" = "Esperar e cronómetro"; -"web_visubot_group_distance" = "Distância"; -"web_visubot_group_line" = "Linha"; -"web_visubot_group_color" = "Cores"; -"web_visubot_group_buttons" = "Botões e joystick"; -"web_visubot_group_light" = "Luz e volume"; -"web_visubot_group_tilt" = "Inclinação e abanar"; -"web_visubot_group_timer" = "Cronómetro e bateria"; -"web_swap_to_code" = "Código grande, diagrama estreito"; -"web_swap_to_editor" = "Diagrama grande, código estreito"; -"web_editor_resize" = "Alterar a largura do diagrama"; -"web_palette_resize" = "Alterar a largura dos elementos (duplo clique: repor)"; -"web_palette_hide" = "Ocultar elementos"; -"web_palette_show" = "Mostrar elementos"; - -/* VisuObject */ -"web_visuobject_world_hint" = "VisuObject: programar classes em Java e vê-las ou desenhá-las como diagrama de classes (a partir do 12.º ano). Podes mudar a qualquer momento na roda dentada."; -"web_visuobject_subtitle" = "Diagrama de classes"; -"web_visuobject_code" = "Código Java"; -"web_visuobject_diagram" = "Diagrama de classes"; -"web_visuobject_add_interface" = "Interface"; -"web_visuobject_add_interface_tip" = "Nova interface no diagrama e no código"; -"web_visuobject_layout" = "Reorganizar"; -"web_visuobject_layout_tip" = "Organizar todas as classes automaticamente: superclasses em cima"; -"web_visuobject_add_field" = "novo atributo …"; -"web_visuobject_add_method" = "novo método …"; -"web_visuobject_delete_class" = "Apagar classe"; -"web_visuobject_new_class_name" = "NovaClasse"; -"web_visuobject_new_interface_name" = "NovaInterface"; -"web_visuobject_example" = "Exemplo"; -"web_visuobject_example_tip" = "Carregar o projeto de exemplo Zoo: Tier e Hund no package tiere, Besitzer em personen"; -"web_visuobject_new_tip" = "Novo: projeto vazio (Anular recupera o anterior)"; -"web_visuobject_empty" = "Ainda não há nenhuma classe. Clica em «+ Classe» à esquerda ou escreve, por exemplo, «public class Cao { }» num ficheiro."; -"web_visuobject_edit_hint" = "Duplo clique para alterar. Escreve como em UML: «- nome: String» ou «+ ladrar(): void». Deixar vazio apaga."; -"web_visuobject_member_label" = "Atributo ou método em notação UML"; -"web_visuobject_name_label" = "Nome da classe"; -"web_visuobject_bad_name" = "«%@» não é um nome válido ou já existe."; -"web_visuobject_bad_line" = "Não percebo «%@». Exemplo: - nome: String ou + ladrar(): void"; -"web_visuobject_open_failed" = "Não foi possível ler o ficheiro."; -"web_visuobject_field_ph" = "- nome: String"; -"web_visuobject_seq_diagram" = "Diagrama de sequência"; -"web_visuobject_seq_empty" = "O diagrama de sequência surge ao depurar: clica em “Depurar” em cima e percorre o programa passo a passo."; -"web_visuobject_seq_no_calls" = "Ainda não há chamadas dos teus métodos."; -"web_visuobject_seq_truncated" = "… encurtado: a partir daqui há chamadas demais."; -"web_visuobject_seq_hint" = "Cada seta é uma chamada de um dos teus métodos; a seta tracejada traz o valor de retorno. Clica numa seta para ver a linha no código."; -"web_visuobject_dbg" = "Depurar"; -"web_visuobject_dbg_tip" = "Executar o programa passo a passo. Ponto de paragem: clica no número da linha. O diagrama de objetos mostra os objetos na memória."; -"web_visuobject_dbg_continue" = "Continuar"; -"web_visuobject_dbg_continue_tip" = "Continuar até ao próximo ponto de paragem (F8)"; -"web_visuobject_dbg_pause" = "Pausa"; -"web_visuobject_dbg_pause_tip" = "Pausar o programa"; -"web_visuobject_dbg_over" = "Passo"; -"web_visuobject_dbg_over_tip" = "Próxima linha; os métodos correm até ao fim (F6)"; -"web_visuobject_dbg_into" = "Entrar"; -"web_visuobject_dbg_into_tip" = "Entrar no método chamado (F5)"; -"web_visuobject_dbg_out" = "Sair"; -"web_visuobject_dbg_out_tip" = "Terminar o método e voltar a quem o chamou (F7)"; -"web_visuobject_dbg_input" = "Entrada para o Scanner, depois Enter"; -"web_visuobject_dbg_running" = "Depurador: o programa está a correr …"; -"web_visuobject_dbg_waiting" = "Depurador: o programa espera pela tua entrada."; -"web_visuobject_dbg_paused_fmt" = "Depurador: parado em %1$@, linha %2$@"; -"web_visuobject_dbg_exception" = "O programa terminou com uma exceção."; -"web_visuobject_dbg_code_changed" = "Código alterado: depurador terminado."; -"web_visuobject_dbg_line_fmt" = "%1$@:%2$@"; -"web_visuobject_dbg_stack" = "Pilha de chamadas"; -"web_visuobject_dbg_vars" = "Variáveis"; -"web_visuobject_dbg_var_name" = "Nome"; -"web_visuobject_dbg_var_type" = "Tipo"; -"web_visuobject_dbg_no_vars" = "Sem variáveis"; -"web_visuobject_dbg_err_syntax" = "%1$@, linha %2$@: o depurador não entende isto (%3$@). ▶ Executar mostra a mensagem do Java."; -"web_visuobject_dbg_err_symbol" = "%1$@, linha %2$@: %3$@ é desconhecido."; -"web_visuobject_dbg_err_import" = "%1$@, linha %2$@: falta %3$@ mesmo no início. Sem esta linha, o Java não conhece a classe."; -"web_visuobject_dbg_err_typename" = "%1$@, linha %2$@: o Java não conhece este tipo de dados. Querias dizer %3$@?"; -"web_visuobject_dbg_err_unsupported" = "%1$@, linha %2$@: o depurador ainda não consegue %3$@. ▶ Executar corre o programa em Java real."; -"web_visuobject_dbg_err_type" = "%1$@, linha %2$@: algo não encaixa aqui (%3$@)."; -"web_visuobject_obj_diagram" = "Diagrama de objetos"; -"web_visuobject_obj_new" = "Novo objeto da classe"; -"web_visuobject_obj_add" = "Objeto"; -"web_visuobject_obj_empty" = "Ainda sem objetos. Escolhe uma classe em cima e clica em “+ Objeto”."; -"web_visuobject_obj_no_classes" = "Cria primeiro uma classe (não abstrata) no diagrama de classes."; -"web_visuobject_obj_hint" = "Clica num objeto para mudar aqui o nome, a classe e os valores. Arrasta a pega até outro objeto para os ligar através de um atributo de referência."; -"web_visuobject_obj_live_hint" = "Ao vivo do depurador: é assim que os objetos estão agora na memória."; -"web_visuobject_obj_link" = "Arrastar até outro objeto: definir referência"; -"web_visuobject_obj_name" = "Nome"; -"web_visuobject_obj_class" = "Classe"; -"web_visuobject_obj_attribute" = "Atributo"; -"web_visuobject_obj_value" = "Valor"; -"web_visuobject_obj_delete" = "Apagar objeto"; -"web_visuobject_obj_bad_name" = "“%@” não é um nome válido para um objeto."; -"web_visuobject_obj_name_taken" = "Já existe um objeto “%@”."; -"web_visuobject_obj_no_ref" = "%1$@ não tem nenhum atributo que possa apontar para %2$@."; -"web_visuobject_tool_note" = "Nota"; -"web_visuobject_tool_note_tip" = "Nota: clica no diagrama de classes e escreve o texto. Arrasta a pega até uma classe para uma linha tracejada."; -"web_visuobject_note_ph" = "Nota …"; -"web_visuobject_note_text" = "Texto"; -"web_visuobject_note_attached" = "Ligada a"; -"web_visuobject_note_attach" = "Arrastar até uma classe: linha tracejada"; -"web_visuobject_note_delete" = "Apagar nota"; -"web_visuobject_run" = "Executar"; -"web_visuobject_run_tip" = "Executar o programa com Java verdadeiro: todas as classes são compiladas, é iniciada a classe com main (de preferência a aberta)."; -"web_visuobject_stop" = "Parar"; -"web_visuobject_stop_tip" = "Terminar o programa e fechar as suas janelas"; -"web_visuobject_stopped" = "Programa terminado."; -"web_visuobject_no_main" = "Nenhuma classe com public static void main(String[] args) encontrada."; -"web_visuobject_running_fmt" = "%@ está a correr …"; -"web_visuobject_console_clear" = "Limpar"; -"web_visuobject_section_fields" = "Atributos"; -"web_visuobject_section_refs" = "Atributos de referência"; -"web_visuobject_section_ctors" = "Construtor"; -"web_visuobject_section_methods" = "Métodos"; -"web_visuobject_insp_sections" = "Inserir comentários de secção"; -"web_visuobject_insp_sort" = "Ordenar por secções"; -"web_visuobject_insp_sections_tip" = "Escreve // Atributos, // Atributos de referência, // Construtor e // Métodos na classe e ordena tudo por baixo. O que for criado no diagrama de classes vai logo para o sítio certo."; -"web_visuobject_insp_doc" = "Descrição (Javadoc)"; -"web_visuobject_insp_doc_ph" = "Para que serve a classe? Fica no código como comentário Javadoc por cima da classe."; -"web_visuobject_insp_visibility" = "Visibilidade"; -"web_visuobject_insp_type" = "Tipo"; -"web_visuobject_insp_init" = "Valor inicial"; -"web_visuobject_insp_no_fields" = "Ainda sem atributos."; -"web_visuobject_insp_add_field" = "Atributo"; -"web_visuobject_insp_params" = "Parâmetros"; -"web_visuobject_insp_return" = "Tipo de retorno"; -"web_visuobject_insp_constructor" = "Construtor"; -"web_visuobject_insp_no_methods" = "Ainda sem métodos."; -"web_visuobject_insp_add_method" = "Método"; -"web_visuobject_insp_generate" = "Gerar:"; -"web_visuobject_insp_gen_constructor" = "Construtor a partir dos atributos"; -"web_visuobject_insp_gen_constructor_tip" = "Como no Eclipse “Generate Constructor using Fields”: um construtor que define todos os atributos (exceto static)."; -"web_visuobject_insp_gen_accessors" = "Getters e setters"; -"web_visuobject_insp_gen_accessors_tip" = "Como no Eclipse “Generate Getters and Setters”: get…/set… para cada atributo (atributos final só com getter)."; -"web_visuobject_insp_bad_params" = "Escreve os parâmetros assim: nome: Tipo, segundo: int (lido “%@”)."; -"web_visuobject_insp_fields" = "Atributos"; -"web_visuobject_insp_methods" = "Métodos"; -"web_visuobject_inspector_resize" = "Redimensionar: arrasta a fronteira entre o diagrama de classes e o inspetor para cima ou para baixo (duplo clique = padrão)"; -"web_visuobject_dep_title" = "Dependência «%@»"; -"web_visuobject_dep_create_text" = "%1$@ cria um objeto da classe %2$@ em %3$@ (new)."; -"web_visuobject_dep_use_text" = "%1$@ usa a classe %2$@ em %3$@."; -"web_visuobject_dep_hint" = "Isto não é uma associação: %@ não guarda o objeto %@ num atributo, ele só existe dentro do método. Por isso a linha é tracejada."; -"web_visuobject_dep_to_assoc" = "Guardar como atributo (associação a %@)"; -"web_visuobject_end_mult_ph" = "mult."; -"web_visuobject_end_tip" = "Clique (linha selecionada) ou clique direito: papel, multiplicidade e navegabilidade nesta extremidade"; -"web_visuobject_end_role_ph" = "p. ex. osMeusGatos"; -"web_visuobject_new_menu" = "Novo"; -"web_visuobject_new_menu_tip" = "Criar um novo projeto, source folder, package, classe ou interface"; -"web_visuobject_new_project" = "Projeto Java"; -"web_visuobject_new_folder" = "Source folder"; -"web_visuobject_new_package" = "Package"; -"web_visuobject_new_class" = "Classe"; -"web_visuobject_new_interface" = "Interface"; -"web_visuobject_new_project_title" = "Novo projeto Java"; -"web_visuobject_new_project_hint" = "No workspace cada projeto tem uma pasta própria com src."; -"web_visuobject_new_folder_title" = "Novo source folder"; -"web_visuobject_new_folder_hint" = "Outra pasta para código ao lado de src, por exemplo test para classes de teste."; -"web_visuobject_new_package_title" = "Novo package"; -"web_visuobject_new_package_hint" = "Os nomes de package escrevem-se em minúsculas, partes com ponto: animais ou escola.secretaria."; -"web_visuobject_new_class_title" = "Nova classe Java"; -"web_visuobject_new_class_hint" = "Os nomes de classe começam com maiúscula, por exemplo Cao ou ContaBancaria."; -"web_visuobject_new_interface_title" = "Nova interface Java"; -"web_visuobject_new_interface_hint" = "Uma interface define métodos que as classes implementam depois."; -"web_visuobject_new_root" = "Source folder"; -"web_visuobject_new_name" = "Nome"; -"web_visuobject_new_modifiers" = "Modificadores"; -"web_visuobject_new_package_private" = "package (sem modificador)"; -"web_visuobject_new_superclass" = "Superclasse"; -"web_visuobject_new_interfaces" = "Interfaces (implements)"; -"web_visuobject_new_extends_interfaces" = "Estende interfaces (extends)"; -"web_visuobject_new_stubs" = "Que esqueletos de métodos criar?"; -"web_visuobject_new_stub_constructors" = "Construtores da superclasse"; -"web_visuobject_new_stub_inherited" = "Métodos abstratos herdados"; -"web_visuobject_new_comment_legend" = "Comentário"; -"web_visuobject_new_comment" = "Comentário Javadoc com @author"; -"web_visuobject_new_author" = "O teu nome"; -"web_visuobject_new_finish" = "Concluir"; -"web_visuobject_new_name_missing" = "Escreve um nome."; -"web_visuobject_new_exists" = "“%@” já existe no projeto."; -"web_visuobject_new_upper" = "Em Java, os nomes de classe começam com maiúscula."; -"web_visuobject_bad_folder" = "“%@” não é um nome de pasta válido ou já existe."; -"web_visuobject_inspector_hide" = "Recolher o inspetor de objetos"; -"web_visuobject_inspector_show" = "Expandir o inspetor de objetos"; -"web_visuobject_inspector_empty" = "Clica numa relação (linha) no diagrama para a editares aqui."; -"web_visuobject_rel_end_a" = "Extremidade A: %@ (a linha começa aqui)"; -"web_visuobject_rel_end_b" = "Extremidade B: %@ (a linha acaba aqui)"; -"web_visuobject_ws_title" = "Pasta do workspace no teu computador"; -"web_visuobject_ws_question" = "Onde guardas os teus projetos?"; -"web_visuobject_ws_hint" = "Como no Eclipse: uma pasta de workspace no teu computador, com uma pasta por projeto com src e os ficheiros .java."; -"web_visuobject_ws_create" = "Criar a pasta “%@”"; -"web_visuobject_ws_open" = "Abrir um workspace existente"; -"web_visuobject_ws_skip" = "Sem pasta (só no browser)"; -"web_visuobject_ws_choose" = "Escolher workspace"; -"web_visuobject_ws_reopen" = "Abrir o workspace “%@”"; -"web_visuobject_ws_switch" = "Mudar"; -"web_visuobject_ws_zip" = "ZIP"; -"web_visuobject_ws_zip_tip" = "Descarregar o projeto como .zip, por exemplo para o entregar"; -"web_visuobject_ws_saved" = "Guardado em %@/%@"; -"web_visuobject_ws_created" = "Novo projeto “%@” no workspace"; -"web_visuobject_ws_failed" = "Não foi possível guardar no workspace: %@"; -"web_visuobject_ws_taken" = "O workspace já tem um projeto “%@”."; -"web_visuobject_ws_open_project" = "Abrir o projeto %@"; -"web_visuobject_save_ws_tip" = "Guardar no workspace (Ctrl+S)"; -"web_visuobject_unsaved" = "não guardado"; -"web_visuobject_rel_nav_navigable" = "navegável (seta)"; -"web_visuobject_rel_nav_non-navigable" = "não navegável (cruz ×)"; -"web_visuobject_rel_nav_unspecified" = "não especificado (aberto)"; -"web_visuobject_rel_reading_flip" = "inverter"; -"web_visuobject_rel_reading_auto" = "Com um nome, a relação lê-se no sentido em que arrastaste."; -"web_visuobject_tools" = "Ferramentas"; -"web_visuobject_tool_select" = "Seleção"; -"web_visuobject_tool_select_tip" = "Selecionar e mover"; -"web_visuobject_tool_class" = "Classe"; -"web_visuobject_tool_class_tip" = "Classe: arrasta para a área ou escolhe e clica na área"; -"web_visuobject_tool_interface" = "Interface"; -"web_visuobject_tool_interface_tip" = "Interface: arrasta para a área ou escolhe e clica na área"; -"web_visuobject_tool_link" = "Associação"; -"web_visuobject_tool_link_tip" = "Associação sem navegação: desenha uma linha simples entre duas classes"; -"web_visuobject_rel_link" = "Associação (sem navegação)"; -"web_visuobject_tool_not_link" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_association" = "Dirigida"; -"web_visuobject_tool_association_tip" = "Associação dirigida: arrasta da classe que conhece a outra para a outra (seta)"; -"web_visuobject_tool_aggregation" = "Agregação"; -"web_visuobject_tool_aggregation_tip" = "Agregação: arrasta do todo para a parte (tem, as partes continuam a existir)"; -"web_visuobject_tool_composition" = "Composição"; -"web_visuobject_tool_composition_tip" = "Composição: arrasta do todo para a parte (é composto por, as partes pertencem-lhe)"; -"web_visuobject_tool_extends" = "Herança"; -"web_visuobject_tool_extends_tip" = "Herança: arrasta da subclasse para a superclasse (extends)"; -"web_visuobject_tool_implements" = "Realização"; -"web_visuobject_tool_implements_tip" = "Realização: arrasta da classe para a interface (implements)"; -"web_visuobject_tool_pick_second" = "Agora clica na segunda classe (a partir de %@). Esc cancela."; -"web_visuobject_tool_not_association" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_aggregation" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_composition" = "%@ é uma interface e não pode ter atributos. Arrasta a relação a partir de uma classe."; -"web_visuobject_tool_not_extends" = "%@ não pode herdar de %@: classes herdam de classes, interfaces de interfaces. Para uma interface usa a realização."; -"web_visuobject_tool_not_implements" = "%@ não pode implementar %@: só uma classe implementa uma interface."; -"web_visuobject_inspector" = "Inspetor de objetos"; -"web_visuobject_connect" = "Arrastar: relação com outra classe"; -"web_visuobject_rel_association" = "Associação"; -"web_visuobject_rel_directed" = "Associação dirigida"; -"web_visuobject_rel_aggregation" = "Agregação (tem, as partes continuam a existir)"; -"web_visuobject_rel_composition" = "Composição (é composto por, as partes pertencem-lhe)"; -"web_visuobject_rel_extends" = "Herança (extends)"; -"web_visuobject_rel_implements" = "Realização (implements)"; -"web_visuobject_rel_extends_text" = "%@ herda de %@ (extends no código)."; -"web_visuobject_rel_implements_text" = "%@ implementa a interface %@ (implements no código)."; -"web_visuobject_rel_kind" = "Tipo"; -"web_visuobject_rel_name" = "Nome da relação"; -"web_visuobject_rel_name_ph" = "por exemplo, possui"; -"web_visuobject_rel_reading" = "Sentido de leitura"; -"web_visuobject_rel_navigable" = "Navegabilidade"; -"web_visuobject_rel_role" = "Papel"; -"web_visuobject_rel_multiplicity" = "Multiplicidade"; -"web_visuobject_rel_role_field" = "= atributo %@.%@ no código"; -"web_visuobject_rel_role_only_uml" = "só no diagrama (sem atributo enquanto a seta só aponta num sentido)"; -"web_visuobject_rel_delete" = "Eliminar a relação"; -"web_visuobject_rel_impossible" = "Não há uma relação adequada de %@ para %@."; -"web_visuobject_rel_menu" = "%@ → %@"; -"web_visuobject_resize" = "Arrastar para mudar a largura (duplo clique: padrão)"; -"web_visuobject_pane_show" = "Expandir a área"; -"web_visuobject_pane_hide" = "Recolher a área"; -"web_visuobject_close_tab" = "Fechar %@"; -"web_visuobject_collapse" = "Recolher"; -"web_visuobject_expand" = "Expandir"; -"web_visuobject_tree_empty" = "Ainda vazio. Cria um package ou uma classe com «+ Novo»."; -"web_visuobject_delete" = "Eliminar"; -"web_visuobject_default_package" = "(package predefinido)"; -"web_visuobject_bad_package" = "«%@» não é um nome de package válido ou já existe. Os nomes de package escrevem-se em minúsculas, por exemplo animais."; -"web_visuobject_new_package_name" = "novopackage"; -"web_visuobject_no_file" = "Nenhum ficheiro aberto"; -"web_visuobject_project_name" = "MeuProjeto"; -"web_visuobject_explorer_show" = "Mostrar o Package Explorer"; -"web_visuobject_explorer_hide" = "Recolher o Package Explorer"; -"web_visuobject_explorer" = "Package Explorer"; -"web_visuobject_save_tip" = "Guardar o projeto como .zip: NomeDoProjeto/src/package/Classe.java"; -"web_visuobject_open_tip" = "Abrir um projeto (.zip como do Eclipse ou BlueJ) ou juntar ficheiros .java ao projeto"; -"web_visuobject_method_ph" = "+ ladrar(): void"; -"web_code_scopes" = "Blocos coloridos"; -"web_code_scopes_hint" = "Código e diagrama: ciclo rosa, decisão azul, método amarelo, classe verde"; -"web_pseudocode" = "Pseudocódigo"; - -/* VisuFlow (desenhar fluxogramas) */ -"web_visuflow_subtitle" = "Desenhar fluxogramas"; -"web_visuflow_world_hint" = "VisuFlow: desenhar livremente um fluxograma e exportá-lo como imagem ou PDF. Podes mudar a qualquer momento na roda dentada."; -"web_visuflow_palette" = "Símbolos"; -"web_visuflow_palette_hint" = "Toca num símbolo para o juntar abaixo do selecionado, ligado por uma seta. Também o podes arrastar para a área."; -"web_visuflow_shape_start" = "Início"; -"web_visuflow_shape_ende" = "Fim"; -"web_visuflow_shape_anweisung" = "Instrução"; -"web_visuflow_shape_ein" = "Entrada/Saída"; -"web_visuflow_shape_verzweigung" = "Decisão"; -"web_visuflow_shape_unterprogramm" = "Subprograma"; -"web_visuflow_shape_start_tip" = "Oval: aqui começa o fluxo"; -"web_visuflow_shape_ende_tip" = "Oval: aqui termina o fluxo"; -"web_visuflow_shape_anweisung_tip" = "Retângulo: uma instrução, por exemplo «Ferver água»"; -"web_visuflow_shape_ein_tip" = "Paralelogramo: entrada ou saída, por exemplo «Entrada: número»"; -"web_visuflow_shape_verzweigung_tip" = "Losango: uma pergunta com as saídas sim e não"; -"web_visuflow_shape_unterprogramm_tip" = "Retângulo com duas barras: chama um subprograma"; -"web_visuflow_text_start" = "Início"; -"web_visuflow_text_ende" = "Fim"; -"web_visuflow_text_anweisung" = "Instrução"; -"web_visuflow_text_ein" = "Entrada: número"; -"web_visuflow_text_verzweigung" = "Condição?"; -"web_visuflow_text_unterprogramm" = "Subprograma"; -"web_visuflow_new_tip" = "Novo: fluxograma vazio com Início (Anular recupera o anterior)"; -"web_visuflow_open_tip" = "Abrir um ficheiro de fluxograma (.visuflow)"; -"web_visuflow_save_tip" = "Guardar o fluxograma como ficheiro (.visuflow)"; -"web_visuflow_delete" = "Apagar"; -"web_visuflow_delete_tip" = "Apagar o símbolo ou a seta selecionada (Del)"; -"web_visuflow_swap" = "trocar sim/não"; -"web_visuflow_swap_tip" = "Losango: «sim» e «não» trocam de lado"; -"web_visuflow_example" = "Exemplo"; -"web_visuflow_example_tip" = "Carregar o exemplo «Fazer chá» da lição 1 (Anular recupera o fluxograma anterior)"; -"web_visuflow_example_title" = "Fazer chá"; -"web_visuflow_example_water" = "Ferver água"; -"web_visuflow_example_bag" = "Saqueta de chá na chávena"; -"web_visuflow_example_hot" = "O chá ainda está quente demais?"; -"web_visuflow_example_wait" = "Esperar"; -"web_visuflow_example_drink" = "Beber o chá"; -"web_visuflow_title_label" = "Título do fluxograma"; -"web_visuflow_title_ph" = "Título do fluxograma"; -"web_visuflow_canvas_label" = "Área do fluxograma"; -"web_visuflow_open_error" = "Este ficheiro não é um fluxograma VisuFlow."; -"web_visuflow_saved" = "Guardado como %@"; -"web_visuflow_status_empty" = "Arrasta um símbolo da barra para a área ou toca nele."; -"web_visuflow_status_idle" = "Toca num símbolo para o selecionar. Arrasta a partir do ponto na saída para desenhar uma seta até ao próximo símbolo."; -"web_visuflow_status_node" = "Arrasta para mover o símbolo, toca outra vez para mudar o texto. Arrasta uma seta a partir do ponto na saída."; -"web_visuflow_status_edge" = "Seta selecionada. Apagar remove-a."; -"web_visuflow_status_connect" = "Larga sobre o símbolo para onde a seta vai."; -"web_visuflow_edit_label" = "Texto no símbolo"; -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Mudar o nome da variável …"; -"web_rename_title" = "Mudar o nome da variável"; -"web_rename_old" = "Nome"; -"web_rename_new" = "Novo nome"; -"web_rename_hint" = "Altera todos os sítios com exatamente esta escrita (numero não é Numero), no código e no estruturograma. Texto entre \\"…\\" e comentários ficam iguais."; -"web_rename_count_fmt" = "Aparece %d vezes."; -"web_rename_exists_fmt" = "“%@” já existe: depois as duas seriam uma só variável."; -"web_rename_invalid" = "Um nome começa com uma letra e só contém letras, algarismos e _."; -"web_rename_keyword_fmt" = "“%@” é uma palavra-chave de Java."; -"web_rename_apply" = "Mudar o nome"; -"web_rename_cancel" = "Cancelar"; -"web_visubot_world_visucode_hint" = "Outros programas como %1$@ ou %2$@ estão em visucode.de."; -`;export{e as default}; diff --git a/website/app/assets/robot3d-CJE1N58D.js b/website/app/assets/robot3d-CJE1N58D.js deleted file mode 100644 index 18d4e9d7..00000000 --- a/website/app/assets/robot3d-CJE1N58D.js +++ /dev/null @@ -1,3955 +0,0 @@ -var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-BqSgHxq8.js";/** - * @license - * Copyright 2010-2025 Three.js Authors - * SPDX-License-Identifier: MIT - */const Na="181",yi={ROTATE:0,DOLLY:1,PAN:2},vi={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},vl=0,co=1,Ml=2,bc=1,Ec=2,_n=3,Fn=0,Le=1,Mn=2,yn=0,bi=1,lo=2,ho=3,uo=4,Sl=5,Yn=100,yl=101,bl=102,El=103,Tl=104,Al=200,wl=201,Rl=202,Cl=203,Gr=204,kr=205,Pl=206,Dl=207,Ll=208,Il=209,Ul=210,Nl=211,Fl=212,Ol=213,Bl=214,Hr=0,Wr=1,Xr=2,Ti=3,qr=4,Yr=5,Zr=6,Kr=7,Fa=0,zl=1,Vl=2,Un=0,Gl=1,kl=2,Hl=3,Tc=4,Wl=5,Xl=6,ql=7,Ac=300,Ai=301,wi=302,jr=303,Jr=304,Js=306,$r=1e3,Sn=1001,Qr=1002,He=1003,Yl=1004,us=1005,Ye=1006,ir=1007,Kn=1008,hn=1009,wc=1010,Rc=1011,Qi=1012,Oa=1013,jn=1014,on=1015,Di=1016,Ba=1017,za=1018,ts=1020,Cc=35902,Pc=35899,Dc=1021,Lc=1022,tn=1023,es=1026,ns=1027,Va=1028,Ga=1029,ka=1030,Ha=1031,Wa=1033,Bs=33776,zs=33777,Vs=33778,Gs=33779,ta=35840,ea=35841,na=35842,ia=35843,sa=36196,ra=37492,aa=37496,oa=37808,ca=37809,la=37810,ha=37811,ua=37812,fa=37813,da=37814,pa=37815,ma=37816,xa=37817,ga=37818,_a=37819,va=37820,Ma=37821,Sa=36492,ya=36494,ba=36495,Ea=36283,Ta=36284,Aa=36285,wa=36286,Zl=3200,Kl=3201,Xa=0,jl=1,Ln="",De="srgb",Ri="srgb-linear",Ws="linear",ne="srgb",ii=7680,fo=519,Jl=512,$l=513,Ql=514,Ic=515,th=516,eh=517,nh=518,ih=519,po=35044,mo="300 es",cn=2e3,Xs=2001;function Uc(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function qs(i){return document.createElementNS("http://www.w3.org/1999/xhtml",i)}function sh(){const i=qs("canvas");return i.style.display="block",i}const xo={};function go(...i){const t="THREE."+i.shift();console.log(t,...i)}function Bt(...i){const t="THREE."+i.shift();console.warn(t,...i)}function de(...i){const t="THREE."+i.shift();console.error(t,...i)}function is(...i){const t=i.join(" ");t in xo||(xo[t]=!0,Bt(...i))}function rh(i,t,e){return new Promise(function(n,s){function r(){switch(i.clientWaitSync(t,i.SYNC_FLUSH_COMMANDS_BIT,0)){case i.WAIT_FAILED:s();break;case i.TIMEOUT_EXPIRED:setTimeout(r,e);break;default:n()}}setTimeout(r,e)})}class ti{addEventListener(t,e){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[t]===void 0&&(n[t]=[]),n[t].indexOf(e)===-1&&n[t].push(e)}hasEventListener(t,e){const n=this._listeners;return n===void 0?!1:n[t]!==void 0&&n[t].indexOf(e)!==-1}removeEventListener(t,e){const n=this._listeners;if(n===void 0)return;const s=n[t];if(s!==void 0){const r=s.indexOf(e);r!==-1&&s.splice(r,1)}}dispatchEvent(t){const e=this._listeners;if(e===void 0)return;const n=e[t.type];if(n!==void 0){t.target=this;const s=n.slice(0);for(let r=0,a=s.length;r>8&255]+Ae[i>>16&255]+Ae[i>>24&255]+"-"+Ae[t&255]+Ae[t>>8&255]+"-"+Ae[t>>16&15|64]+Ae[t>>24&255]+"-"+Ae[e&63|128]+Ae[e>>8&255]+"-"+Ae[e>>16&255]+Ae[e>>24&255]+Ae[n&255]+Ae[n>>8&255]+Ae[n>>16&255]+Ae[n>>24&255]).toLowerCase()}function Xt(i,t,e){return Math.max(t,Math.min(e,i))}function ah(i,t){return(i%t+t)%t}function sr(i,t,e){return(1-e)*i+e*t}function Fi(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error("Invalid component type.")}}function Fe(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error("Invalid component type.")}}const oh={DEG2RAD:ks};class at{constructor(t=0,e=0){at.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Xt(this.x,t.x,e.x),this.y=Xt(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Xt(this.x,t,e),this.y=Xt(this.y,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Xt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Xt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*s+t.x,this.y=r*s+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Jn{constructor(t=0,e=0,n=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=n,this._w=s}static slerpFlat(t,e,n,s,r,a,o){let l=n[s+0],c=n[s+1],h=n[s+2],u=n[s+3],d=r[a+0],p=r[a+1],x=r[a+2],_=r[a+3];if(o<=0){t[e+0]=l,t[e+1]=c,t[e+2]=h,t[e+3]=u;return}if(o>=1){t[e+0]=d,t[e+1]=p,t[e+2]=x,t[e+3]=_;return}if(u!==_||l!==d||c!==p||h!==x){let m=l*d+c*p+h*x+u*_;m<0&&(d=-d,p=-p,x=-x,_=-_,m=-m);let f=1-o;if(m<.9995){const b=Math.acos(m),S=Math.sin(b);f=Math.sin(f*b)/S,o=Math.sin(o*b)/S,l=l*f+d*o,c=c*f+p*o,h=h*f+x*o,u=u*f+_*o}else{l=l*f+d*o,c=c*f+p*o,h=h*f+x*o,u=u*f+_*o;const b=1/Math.sqrt(l*l+c*c+h*h+u*u);l*=b,c*=b,h*=b,u*=b}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=u}static multiplyQuaternionsFlat(t,e,n,s,r,a){const o=n[s],l=n[s+1],c=n[s+2],h=n[s+3],u=r[a],d=r[a+1],p=r[a+2],x=r[a+3];return t[e]=o*x+h*u+l*p-c*d,t[e+1]=l*x+h*d+c*u-o*p,t[e+2]=c*x+h*p+o*d-l*u,t[e+3]=h*x-o*u-l*d-c*p,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const n=t._x,s=t._y,r=t._z,a=t._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(s/2),u=o(r/2),d=l(n/2),p=l(s/2),x=l(r/2);switch(a){case"XYZ":this._x=d*h*u+c*p*x,this._y=c*p*u-d*h*x,this._z=c*h*x+d*p*u,this._w=c*h*u-d*p*x;break;case"YXZ":this._x=d*h*u+c*p*x,this._y=c*p*u-d*h*x,this._z=c*h*x-d*p*u,this._w=c*h*u+d*p*x;break;case"ZXY":this._x=d*h*u-c*p*x,this._y=c*p*u+d*h*x,this._z=c*h*x+d*p*u,this._w=c*h*u-d*p*x;break;case"ZYX":this._x=d*h*u-c*p*x,this._y=c*p*u+d*h*x,this._z=c*h*x-d*p*u,this._w=c*h*u+d*p*x;break;case"YZX":this._x=d*h*u+c*p*x,this._y=c*p*u+d*h*x,this._z=c*h*x-d*p*u,this._w=c*h*u-d*p*x;break;case"XZY":this._x=d*h*u-c*p*x,this._y=c*p*u-d*h*x,this._z=c*h*x+d*p*u,this._w=c*h*u+d*p*x;break;default:Bt("Quaternion: .setFromEuler() encountered an unknown order: "+a)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],s=e[4],r=e[8],a=e[1],o=e[5],l=e[9],c=e[2],h=e[6],u=e[10],d=n+o+u;if(d>0){const p=.5/Math.sqrt(d+1);this._w=.25/p,this._x=(h-l)*p,this._y=(r-c)*p,this._z=(a-s)*p}else if(n>o&&n>u){const p=2*Math.sqrt(1+n-o-u);this._w=(h-l)/p,this._x=.25*p,this._y=(s+a)/p,this._z=(r+c)/p}else if(o>u){const p=2*Math.sqrt(1+o-n-u);this._w=(r-c)/p,this._x=(s+a)/p,this._y=.25*p,this._z=(l+h)/p}else{const p=2*Math.sqrt(1+u-n-o);this._w=(a-s)/p,this._x=(r+c)/p,this._y=(l+h)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return n<1e-8?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Xt(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(n===0)return this;const s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,a=t._w,o=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+a*o+s*c-r*l,this._y=s*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-s*o,this._w=a*h-n*o-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e<=0)return this;if(e>=1)return this.copy(t);let n=t._x,s=t._y,r=t._z,a=t._w,o=this.dot(t);o<0&&(n=-n,s=-s,r=-r,a=-a,o=-o);let l=1-e;if(o<.9995){const c=Math.acos(o),h=Math.sin(c);l=Math.sin(l*c)/h,e=Math.sin(e*c)/h,this._x=this._x*l+n*e,this._y=this._y*l+s*e,this._z=this._z*l+r*e,this._w=this._w*l+a*e,this._onChangeCallback()}else this._x=this._x*l+n*e,this._y=this._y*l+s*e,this._z=this._z*l+r*e,this._w=this._w*l+a*e,this.normalize();return this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class D{constructor(t=0,e=0,n=0){D.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(_o.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(_o.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,s=this.z,r=t.x,a=t.y,o=t.z,l=t.w,c=2*(a*s-o*n),h=2*(o*e-r*s),u=2*(r*n-a*e);return this.x=e+l*c+a*u-o*h,this.y=n+l*h+o*c-r*u,this.z=s+l*u+r*h-a*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Xt(this.x,t.x,e.x),this.y=Xt(this.y,t.y,e.y),this.z=Xt(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Xt(this.x,t,e),this.y=Xt(this.y,t,e),this.z=Xt(this.z,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Xt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,s=t.y,r=t.z,a=e.x,o=e.y,l=e.z;return this.x=s*l-r*o,this.y=r*a-n*l,this.z=n*o-s*a,this}projectOnVector(t){const e=t.lengthSq();if(e===0)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return rr.copy(this).projectOnVector(t),this.sub(rr)}reflect(t){return this.sub(rr.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Xt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=Math.random()*2-1,n=Math.sqrt(1-e*e);return this.x=n*Math.cos(t),this.y=e,this.z=n*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const rr=new D,_o=new Jn;class Ht{constructor(t,e,n,s,r,a,o,l,c){Ht.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c)}set(t,e,n,s,r,a,o,l,c){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],u=n[7],d=n[2],p=n[5],x=n[8],_=s[0],m=s[3],f=s[6],b=s[1],S=s[4],T=s[7],R=s[2],w=s[5],L=s[8];return r[0]=a*_+o*b+l*R,r[3]=a*m+o*S+l*w,r[6]=a*f+o*T+l*L,r[1]=c*_+h*b+u*R,r[4]=c*m+h*S+u*w,r[7]=c*f+h*T+u*L,r[2]=d*_+p*b+x*R,r[5]=d*m+p*S+x*w,r[8]=d*f+p*T+x*L,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8];return e*a*h-e*o*c-n*r*h+n*o*l+s*r*c-s*a*l}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],u=h*a-o*c,d=o*l-h*r,p=c*r-a*l,x=e*u+n*d+s*p;if(x===0)return this.set(0,0,0,0,0,0,0,0,0);const _=1/x;return t[0]=u*_,t[1]=(s*c-h*n)*_,t[2]=(o*n-s*a)*_,t[3]=d*_,t[4]=(h*e-s*l)*_,t[5]=(s*r-o*e)*_,t[6]=p*_,t[7]=(n*l-c*e)*_,t[8]=(a*e-n*r)*_,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+t,-s*c,s*l,-s*(-c*a+l*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(ar.makeScale(t,e)),this}rotate(t){return this.premultiply(ar.makeRotation(-t)),this}translate(t,e){return this.premultiply(ar.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}}const ar=new Ht,vo=new Ht().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Mo=new Ht().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function ch(){const i={enabled:!0,workingColorSpace:Ri,spaces:{},convert:function(s,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===ne&&(s.r=bn(s.r),s.g=bn(s.g),s.b=bn(s.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===ne&&(s.r=Ei(s.r),s.g=Ei(s.g),s.b=Ei(s.b))),s},workingToColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},colorSpaceToWorking:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===Ln?Ws:this.spaces[s].transfer},getToneMappingMode:function(s){return this.spaces[s].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,a){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(s,r){return is("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),i.workingToColorSpace(s,r)},toWorkingColorSpace:function(s,r){return is("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),i.colorSpaceToWorking(s,r)}},t=[.64,.33,.3,.6,.15,.06],e=[.2126,.7152,.0722],n=[.3127,.329];return i.define({[Ri]:{primaries:t,whitePoint:n,transfer:Ws,toXYZ:vo,fromXYZ:Mo,luminanceCoefficients:e,workingColorSpaceConfig:{unpackColorSpace:De},outputColorSpaceConfig:{drawingBufferColorSpace:De}},[De]:{primaries:t,whitePoint:n,transfer:ne,toXYZ:vo,fromXYZ:Mo,luminanceCoefficients:e,outputColorSpaceConfig:{drawingBufferColorSpace:De}}}),i}const $t=ch();function bn(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function Ei(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}let si;class lh{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>"u")return t.src;let n;if(t instanceof HTMLCanvasElement)n=t;else{si===void 0&&(si=qs("canvas")),si.width=t.width,si.height=t.height;const s=si.getContext("2d");t instanceof ImageData?s.putImageData(t,0,0):s.drawImage(t,0,0,t.width,t.height),n=si}return n.toDataURL(e)}static sRGBToLinear(t){if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap){const e=qs("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let a=0;a1),this.pmremVersion=0}get width(){return this.source.getSize(cr).x}get height(){return this.source.getSize(cr).y}get depth(){return this.source.getSize(cr).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const n=t[e];if(n===void 0){Bt(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){Bt(`Texture.setValues(): property '${e}' does not exist.`);continue}s&&n&&s.isVector2&&n.isVector2||s&&n&&s.isVector3&&n.isVector3||s&&n&&s.isMatrix3&&n.isMatrix3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";if(!e&&t.textures[this.uuid]!==void 0)return t.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==Ac)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case $r:t.x=t.x-Math.floor(t.x);break;case Sn:t.x=t.x<0?0:1;break;case Qr:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case $r:t.y=t.y-Math.floor(t.y);break;case Sn:t.y=t.y<0?0:1;break;case Qr:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){t===!0&&this.pmremVersion++}}Re.DEFAULT_IMAGE=null;Re.DEFAULT_MAPPING=Ac;Re.DEFAULT_ANISOTROPY=1;class se{constructor(t=0,e=0,n=0,s=1){se.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*s+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*s+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*s+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*s+a[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r;const l=t.elements,c=l[0],h=l[4],u=l[8],d=l[1],p=l[5],x=l[9],_=l[2],m=l[6],f=l[10];if(Math.abs(h-d)<.01&&Math.abs(u-_)<.01&&Math.abs(x-m)<.01){if(Math.abs(h+d)<.1&&Math.abs(u+_)<.1&&Math.abs(x+m)<.1&&Math.abs(c+p+f-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;const S=(c+1)/2,T=(p+1)/2,R=(f+1)/2,w=(h+d)/4,L=(u+_)/4,F=(x+m)/4;return S>T&&S>R?S<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(S),s=w/n,r=L/n):T>R?T<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(T),n=w/s,r=F/s):R<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(R),n=L/r,s=F/r),this.set(n,s,r,e),this}let b=Math.sqrt((m-x)*(m-x)+(u-_)*(u-_)+(d-h)*(d-h));return Math.abs(b)<.001&&(b=1),this.x=(m-x)/b,this.y=(u-_)/b,this.z=(d-h)/b,this.w=Math.acos((c+p+f-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Xt(this.x,t.x,e.x),this.y=Xt(this.y,t.y,e.y),this.z=Xt(this.z,t.z,e.z),this.w=Xt(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=Xt(this.x,t,e),this.y=Xt(this.y,t,e),this.z=Xt(this.z,t,e),this.w=Xt(this.w,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Xt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class fh extends ti{constructor(t=1,e=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Ye,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=n.depth,this.scissor=new se(0,0,t,e),this.scissorTest=!1,this.viewport=new se(0,0,t,e);const s={width:t,height:e,depth:n.depth},r=new Re(s);this.textures=[];const a=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return new this.constructor().copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,n=t.textures.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Ke),Ke.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Oi),ds.subVectors(this.max,Oi),ri.subVectors(t.a,Oi),ai.subVectors(t.b,Oi),oi.subVectors(t.c,Oi),Tn.subVectors(ai,ri),An.subVectors(oi,ai),Vn.subVectors(ri,oi);let e=[0,-Tn.z,Tn.y,0,-An.z,An.y,0,-Vn.z,Vn.y,Tn.z,0,-Tn.x,An.z,0,-An.x,Vn.z,0,-Vn.x,-Tn.y,Tn.x,0,-An.y,An.x,0,-Vn.y,Vn.x,0];return!lr(e,ri,ai,oi,ds)||(e=[1,0,0,0,1,0,0,0,1],!lr(e,ri,ai,oi,ds))?!1:(ps.crossVectors(Tn,An),e=[ps.x,ps.y,ps.z],lr(e,ri,ai,oi,ds))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ke).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(Ke).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(fn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),fn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),fn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),fn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),fn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),fn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),fn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),fn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(fn),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const fn=[new D,new D,new D,new D,new D,new D,new D,new D],Ke=new D,fs=new On,ri=new D,ai=new D,oi=new D,Tn=new D,An=new D,Vn=new D,Oi=new D,ds=new D,ps=new D,Gn=new D;function lr(i,t,e,n,s){for(let r=0,a=i.length-3;r<=a;r+=3){Gn.fromArray(i,r);const o=s.x*Math.abs(Gn.x)+s.y*Math.abs(Gn.y)+s.z*Math.abs(Gn.z),l=t.dot(Gn),c=e.dot(Gn),h=n.dot(Gn);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const ph=new On,Bi=new D,hr=new D;class Ii{constructor(t=new D,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;e!==void 0?n.copy(e):ph.setFromPoints(t).getCenter(n);let s=0;for(let r=0,a=t.length;rthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Bi.subVectors(t,this.center);const e=Bi.lengthSq();if(e>this.radius*this.radius){const n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(Bi,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(hr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Bi.copy(t.center).add(hr)),this.expandByPoint(Bi.copy(t.center).sub(hr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}const dn=new D,ur=new D,ms=new D,wn=new D,fr=new D,xs=new D,dr=new D;class $s{constructor(t=new D,e=new D(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,dn)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=dn.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(dn.copy(this.origin).addScaledVector(this.direction,e),dn.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){ur.copy(t).add(e).multiplyScalar(.5),ms.copy(e).sub(t).normalize(),wn.copy(this.origin).sub(ur);const r=t.distanceTo(e)*.5,a=-this.direction.dot(ms),o=wn.dot(this.direction),l=-wn.dot(ms),c=wn.lengthSq(),h=Math.abs(1-a*a);let u,d,p,x;if(h>0)if(u=a*l-o,d=a*o-l,x=r*h,u>=0)if(d>=-x)if(d<=x){const _=1/h;u*=_,d*=_,p=u*(u+a*d+2*o)+d*(a*u+d+2*l)+c}else d=r,u=Math.max(0,-(a*d+o)),p=-u*u+d*(d+2*l)+c;else d=-r,u=Math.max(0,-(a*d+o)),p=-u*u+d*(d+2*l)+c;else d<=-x?(u=Math.max(0,-(-a*r+o)),d=u>0?-r:Math.min(Math.max(-r,-l),r),p=-u*u+d*(d+2*l)+c):d<=x?(u=0,d=Math.min(Math.max(-r,-l),r),p=d*(d+2*l)+c):(u=Math.max(0,-(a*r+o)),d=u>0?r:Math.min(Math.max(-r,-l),r),p=-u*u+d*(d+2*l)+c);else d=a>0?-r:r,u=Math.max(0,-(a*d+o)),p=-u*u+d*(d+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),s&&s.copy(ur).addScaledVector(ms,d),p}intersectSphere(t,e){dn.subVectors(t.center,this.origin);const n=dn.dot(this.direction),s=dn.dot(dn)-n*n,r=t.radius*t.radius;if(s>r)return null;const a=Math.sqrt(r-s),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,e):this.at(o,e)}intersectsSphere(t){return t.radius<0?!1:this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(t.min.x-d.x)*c,s=(t.max.x-d.x)*c):(n=(t.max.x-d.x)*c,s=(t.min.x-d.x)*c),h>=0?(r=(t.min.y-d.y)*h,a=(t.max.y-d.y)*h):(r=(t.max.y-d.y)*h,a=(t.min.y-d.y)*h),n>a||r>s||((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-d.z)*u,l=(t.max.z-d.z)*u):(o=(t.max.z-d.z)*u,l=(t.min.z-d.z)*u),n>l||o>s)||((o>n||n!==n)&&(n=o),(l=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,dn)!==null}intersectTriangle(t,e,n,s,r){fr.subVectors(e,t),xs.subVectors(n,t),dr.crossVectors(fr,xs);let a=this.direction.dot(dr),o;if(a>0){if(s)return null;o=1}else if(a<0)o=-1,a=-a;else return null;wn.subVectors(this.origin,t);const l=o*this.direction.dot(xs.crossVectors(wn,xs));if(l<0)return null;const c=o*this.direction.dot(fr.cross(wn));if(c<0||l+c>a)return null;const h=-o*wn.dot(dr);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class re{constructor(t,e,n,s,r,a,o,l,c,h,u,d,p,x,_,m){re.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c,h,u,d,p,x,_,m)}set(t,e,n,s,r,a,o,l,c,h,u,d,p,x,_,m){const f=this.elements;return f[0]=t,f[4]=e,f[8]=n,f[12]=s,f[1]=r,f[5]=a,f[9]=o,f[13]=l,f[2]=c,f[6]=h,f[10]=u,f[14]=d,f[3]=p,f[7]=x,f[11]=_,f[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new re().fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,s=1/ci.setFromMatrixColumn(t,0).length(),r=1/ci.setFromMatrixColumn(t,1).length(),a=1/ci.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,s=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),u=Math.sin(r);if(t.order==="XYZ"){const d=a*h,p=a*u,x=o*h,_=o*u;e[0]=l*h,e[4]=-l*u,e[8]=c,e[1]=p+x*c,e[5]=d-_*c,e[9]=-o*l,e[2]=_-d*c,e[6]=x+p*c,e[10]=a*l}else if(t.order==="YXZ"){const d=l*h,p=l*u,x=c*h,_=c*u;e[0]=d+_*o,e[4]=x*o-p,e[8]=a*c,e[1]=a*u,e[5]=a*h,e[9]=-o,e[2]=p*o-x,e[6]=_+d*o,e[10]=a*l}else if(t.order==="ZXY"){const d=l*h,p=l*u,x=c*h,_=c*u;e[0]=d-_*o,e[4]=-a*u,e[8]=x+p*o,e[1]=p+x*o,e[5]=a*h,e[9]=_-d*o,e[2]=-a*c,e[6]=o,e[10]=a*l}else if(t.order==="ZYX"){const d=a*h,p=a*u,x=o*h,_=o*u;e[0]=l*h,e[4]=x*c-p,e[8]=d*c+_,e[1]=l*u,e[5]=_*c+d,e[9]=p*c-x,e[2]=-c,e[6]=o*l,e[10]=a*l}else if(t.order==="YZX"){const d=a*l,p=a*c,x=o*l,_=o*c;e[0]=l*h,e[4]=_-d*u,e[8]=x*u+p,e[1]=u,e[5]=a*h,e[9]=-o*h,e[2]=-c*h,e[6]=p*u+x,e[10]=d-_*u}else if(t.order==="XZY"){const d=a*l,p=a*c,x=o*l,_=o*c;e[0]=l*h,e[4]=-u,e[8]=c*h,e[1]=d*u+_,e[5]=a*h,e[9]=p*u-x,e[2]=x*u-p,e[6]=o*h,e[10]=_*u+d}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(mh,t,xh)}lookAt(t,e,n){const s=this.elements;return Ve.subVectors(t,e),Ve.lengthSq()===0&&(Ve.z=1),Ve.normalize(),Rn.crossVectors(n,Ve),Rn.lengthSq()===0&&(Math.abs(n.z)===1?Ve.x+=1e-4:Ve.z+=1e-4,Ve.normalize(),Rn.crossVectors(n,Ve)),Rn.normalize(),gs.crossVectors(Ve,Rn),s[0]=Rn.x,s[4]=gs.x,s[8]=Ve.x,s[1]=Rn.y,s[5]=gs.y,s[9]=Ve.y,s[2]=Rn.z,s[6]=gs.z,s[10]=Ve.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],u=n[5],d=n[9],p=n[13],x=n[2],_=n[6],m=n[10],f=n[14],b=n[3],S=n[7],T=n[11],R=n[15],w=s[0],L=s[4],F=s[8],E=s[12],M=s[1],P=s[5],O=s[9],z=s[13],k=s[2],W=s[6],Y=s[10],nt=s[14],X=s[3],rt=s[7],st=s[11],St=s[15];return r[0]=a*w+o*M+l*k+c*X,r[4]=a*L+o*P+l*W+c*rt,r[8]=a*F+o*O+l*Y+c*st,r[12]=a*E+o*z+l*nt+c*St,r[1]=h*w+u*M+d*k+p*X,r[5]=h*L+u*P+d*W+p*rt,r[9]=h*F+u*O+d*Y+p*st,r[13]=h*E+u*z+d*nt+p*St,r[2]=x*w+_*M+m*k+f*X,r[6]=x*L+_*P+m*W+f*rt,r[10]=x*F+_*O+m*Y+f*st,r[14]=x*E+_*z+m*nt+f*St,r[3]=b*w+S*M+T*k+R*X,r[7]=b*L+S*P+T*W+R*rt,r[11]=b*F+S*O+T*Y+R*st,r[15]=b*E+S*z+T*nt+R*St,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],a=t[1],o=t[5],l=t[9],c=t[13],h=t[2],u=t[6],d=t[10],p=t[14],x=t[3],_=t[7],m=t[11],f=t[15];return x*(+r*l*u-s*c*u-r*o*d+n*c*d+s*o*p-n*l*p)+_*(+e*l*p-e*c*d+r*a*d-s*a*p+s*c*h-r*l*h)+m*(+e*c*u-e*o*p-r*a*u+n*a*p+r*o*h-n*c*h)+f*(-s*o*h-e*l*u+e*o*d+s*a*u-n*a*d+n*l*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],u=t[9],d=t[10],p=t[11],x=t[12],_=t[13],m=t[14],f=t[15],b=u*m*c-_*d*c+_*l*p-o*m*p-u*l*f+o*d*f,S=x*d*c-h*m*c-x*l*p+a*m*p+h*l*f-a*d*f,T=h*_*c-x*u*c+x*o*p-a*_*p-h*o*f+a*u*f,R=x*u*l-h*_*l-x*o*d+a*_*d+h*o*m-a*u*m,w=e*b+n*S+s*T+r*R;if(w===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const L=1/w;return t[0]=b*L,t[1]=(_*d*r-u*m*r-_*s*p+n*m*p+u*s*f-n*d*f)*L,t[2]=(o*m*r-_*l*r+_*s*c-n*m*c-o*s*f+n*l*f)*L,t[3]=(u*l*r-o*d*r-u*s*c+n*d*c+o*s*p-n*l*p)*L,t[4]=S*L,t[5]=(h*m*r-x*d*r+x*s*p-e*m*p-h*s*f+e*d*f)*L,t[6]=(x*l*r-a*m*r-x*s*c+e*m*c+a*s*f-e*l*f)*L,t[7]=(a*d*r-h*l*r+h*s*c-e*d*c-a*s*p+e*l*p)*L,t[8]=T*L,t[9]=(x*u*r-h*_*r-x*n*p+e*_*p+h*n*f-e*u*f)*L,t[10]=(a*_*r-x*o*r+x*n*c-e*_*c-a*n*f+e*o*f)*L,t[11]=(h*o*r-a*u*r-h*n*c+e*u*c+a*n*p-e*o*p)*L,t[12]=R*L,t[13]=(h*_*s-x*u*s+x*n*d-e*_*d-h*n*m+e*u*m)*L,t[14]=(x*o*s-a*_*s-x*n*l+e*_*l+a*n*m-e*o*m)*L,t[15]=(a*u*s-h*o*s+h*n*l-e*u*l-a*n*d+e*o*d)*L,this}scale(t){const e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),s=Math.sin(e),r=1-n,a=t.x,o=t.y,l=t.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-s*l,c*l+s*o,0,c*o+s*l,h*o+n,h*l-s*a,0,c*l-s*o,h*l+s*a,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,a){return this.set(1,n,r,0,t,1,a,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){const s=this.elements,r=e._x,a=e._y,o=e._z,l=e._w,c=r+r,h=a+a,u=o+o,d=r*c,p=r*h,x=r*u,_=a*h,m=a*u,f=o*u,b=l*c,S=l*h,T=l*u,R=n.x,w=n.y,L=n.z;return s[0]=(1-(_+f))*R,s[1]=(p+T)*R,s[2]=(x-S)*R,s[3]=0,s[4]=(p-T)*w,s[5]=(1-(d+f))*w,s[6]=(m+b)*w,s[7]=0,s[8]=(x+S)*L,s[9]=(m-b)*L,s[10]=(1-(d+_))*L,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){const s=this.elements;let r=ci.set(s[0],s[1],s[2]).length();const a=ci.set(s[4],s[5],s[6]).length(),o=ci.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],je.copy(this);const c=1/r,h=1/a,u=1/o;return je.elements[0]*=c,je.elements[1]*=c,je.elements[2]*=c,je.elements[4]*=h,je.elements[5]*=h,je.elements[6]*=h,je.elements[8]*=u,je.elements[9]*=u,je.elements[10]*=u,e.setFromRotationMatrix(je),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,s,r,a,o=cn,l=!1){const c=this.elements,h=2*r/(e-t),u=2*r/(n-s),d=(e+t)/(e-t),p=(n+s)/(n-s);let x,_;if(l)x=r/(a-r),_=a*r/(a-r);else if(o===cn)x=-(a+r)/(a-r),_=-2*a*r/(a-r);else if(o===Xs)x=-a/(a-r),_=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=d,c[12]=0,c[1]=0,c[5]=u,c[9]=p,c[13]=0,c[2]=0,c[6]=0,c[10]=x,c[14]=_,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(t,e,n,s,r,a,o=cn,l=!1){const c=this.elements,h=2/(e-t),u=2/(n-s),d=-(e+t)/(e-t),p=-(n+s)/(n-s);let x,_;if(l)x=1/(a-r),_=a/(a-r);else if(o===cn)x=-2/(a-r),_=-(a+r)/(a-r);else if(o===Xs)x=-1/(a-r),_=-r/(a-r);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=0,c[12]=d,c[1]=0,c[5]=u,c[9]=0,c[13]=p,c[2]=0,c[6]=0,c[10]=x,c[14]=_,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const ci=new D,je=new re,mh=new D(0,0,0),xh=new D(1,1,1),Rn=new D,gs=new D,Ve=new D,So=new re,yo=new Jn;class nn{constructor(t=0,e=0,n=0,s=nn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const s=t.elements,r=s[0],a=s[4],o=s[8],l=s[1],c=s[5],h=s[9],u=s[2],d=s[6],p=s[10];switch(e){case"XYZ":this._y=Math.asin(Xt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,p),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Xt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,p),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(Xt(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,p),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-Xt(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(Xt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(o,p));break;case"XZY":this._z=Math.asin(-Xt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,p),this._y=0);break;default:Bt("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return So.makeRotationFromQuaternion(t),this.setFromRotationMatrix(So,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yo.setFromEuler(this),this.setFromQuaternion(yo,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}nn.DEFAULT_ORDER="XYZ";class Ya{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let e=0;e1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(o=>({...o})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(t)),this.boundingSphere!==null&&(s.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(s.boundingBox=this.boundingBox.toJSON()));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),u.length>0&&(n.shapes=u),d.length>0&&(n.skeletons=d),p.length>0&&(n.animations=p),x.length>0&&(n.nodes=x)}return n.object=s,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){Je.subVectors(s,e),mn.subVectors(n,e),mr.subVectors(t,e);const a=Je.dot(Je),o=Je.dot(mn),l=Je.dot(mr),c=mn.dot(mn),h=mn.dot(mr),u=a*c-o*o;if(u===0)return r.set(0,0,0),null;const d=1/u,p=(c*l-o*h)*d,x=(a*h-o*l)*d;return r.set(1-p-x,x,p)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,xn)===null?!1:xn.x>=0&&xn.y>=0&&xn.x+xn.y<=1}static getInterpolation(t,e,n,s,r,a,o,l){return this.getBarycoord(t,e,n,s,xn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,xn.x),l.addScaledVector(a,xn.y),l.addScaledVector(o,xn.z),l)}static getInterpolatedAttribute(t,e,n,s,r,a){return vr.setScalar(0),Mr.setScalar(0),Sr.setScalar(0),vr.fromBufferAttribute(t,e),Mr.fromBufferAttribute(t,n),Sr.fromBufferAttribute(t,s),a.setScalar(0),a.addScaledVector(vr,r.x),a.addScaledVector(Mr,r.y),a.addScaledVector(Sr,r.z),a}static isFrontFacing(t,e,n,s){return Je.subVectors(n,e),mn.subVectors(t,e),Je.cross(mn).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Je.subVectors(this.c,this.b),mn.subVectors(this.a,this.b),Je.cross(mn).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Qe.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Qe.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,n,s,r){return Qe.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return Qe.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Qe.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,s=this.b,r=this.c;let a,o;ui.subVectors(s,n),fi.subVectors(r,n),xr.subVectors(t,n);const l=ui.dot(xr),c=fi.dot(xr);if(l<=0&&c<=0)return e.copy(n);gr.subVectors(t,s);const h=ui.dot(gr),u=fi.dot(gr);if(h>=0&&u<=h)return e.copy(s);const d=l*u-h*c;if(d<=0&&l>=0&&h<=0)return a=l/(l-h),e.copy(n).addScaledVector(ui,a);_r.subVectors(t,r);const p=ui.dot(_r),x=fi.dot(_r);if(x>=0&&p<=x)return e.copy(r);const _=p*c-l*x;if(_<=0&&c>=0&&x<=0)return o=c/(c-x),e.copy(n).addScaledVector(fi,o);const m=h*x-p*u;if(m<=0&&u-h>=0&&p-x>=0)return Ro.subVectors(r,s),o=(u-h)/(u-h+(p-x)),e.copy(s).addScaledVector(Ro,o);const f=1/(m+_+d);return a=_*f,o=d*f,e.copy(n).addScaledVector(ui,a).addScaledVector(fi,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Fc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Cn={h:0,s:0,l:0},vs={h:0,s:0,l:0};function yr(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}class Yt{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){const s=t;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=De){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,$t.colorSpaceToWorking(this,e),this}setRGB(t,e,n,s=$t.workingColorSpace){return this.r=t,this.g=e,this.b=n,$t.colorSpaceToWorking(this,s),this}setHSL(t,e,n,s=$t.workingColorSpace){if(t=ah(t,1),e=Xt(e,0,1),n=Xt(n,0,1),e===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+e):n+e-n*e,a=2*n-r;this.r=yr(a,r,t+1/3),this.g=yr(a,r,t),this.b=yr(a,r,t-1/3)}return $t.colorSpaceToWorking(this,s),this}setStyle(t,e=De){function n(r){r!==void 0&&parseFloat(r)<1&&Bt("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const a=s[1],o=s[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:Bt("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const r=s[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(a===6)return this.setHex(parseInt(r,16),e);Bt("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=De){const n=Fc[t.toLowerCase()];return n!==void 0?this.setHex(n,e):Bt("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=bn(t.r),this.g=bn(t.g),this.b=bn(t.b),this}copyLinearToSRGB(t){return this.r=Ei(t.r),this.g=Ei(t.g),this.b=Ei(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=De){return $t.workingToColorSpace(we.copy(this),t),Math.round(Xt(we.r*255,0,255))*65536+Math.round(Xt(we.g*255,0,255))*256+Math.round(Xt(we.b*255,0,255))}getHexString(t=De){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=$t.workingColorSpace){$t.workingToColorSpace(we.copy(this),e);const n=we.r,s=we.g,r=we.b,a=Math.max(n,s,r),o=Math.min(n,s,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const u=a-o;switch(c=h<=.5?u/(a+o):u/(2-a-o),a){case n:l=(s-r)/u+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(const e in t){const n=t[e];if(n===void 0){Bt(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){Bt(`Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";e&&(t={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==bi&&(n.blending=this.blending),this.side!==Fn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Gr&&(n.blendSrc=this.blendSrc),this.blendDst!==kr&&(n.blendDst=this.blendDst),this.blendEquation!==Yn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Ti&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==fo&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==ii&&(n.stencilFail=this.stencilFail),this.stencilZFail!==ii&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==ii&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(e){const r=s(t.textures),a=s(t.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(e!==null){const s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){t===!0&&this.version++}}class Ys extends ei{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Yt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new nn,this.combine=Fa,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const ge=new D,Ms=new at;let yh=0;class en{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:yh++}),this.name="",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=po,this.updateRanges=[],this.gpuType=on,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&Bt("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new On);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){de("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new D(-1/0,-1/0,-1/0),new D(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n0&&(t.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};const e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const l in n){const c=n[l];t.data.attributes[l]=c.toJSON(t.data)}const s={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let u=0,d=c.length;u0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(t.data.boundingSphere=o.toJSON()),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;n!==null&&this.setIndex(n.clone());const s=t.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(e))}const r=t.morphAttributes;for(const c in r){const h=[],u=r[c];for(let d=0,p=u.length;d0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;r(t.far-t.near)**2))&&(Co.copy(r).invert(),kn.copy(t.ray).applyMatrix4(Co),!(n.boundingBox!==null&&kn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,kn)))}_computeIntersections(t,e,n){let s;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,u=r.attributes.normal,d=r.groups,p=r.drawRange;if(o!==null)if(Array.isArray(a))for(let x=0,_=d.length;x<_;x++){const m=d[x],f=a[m.materialIndex],b=Math.max(m.start,p.start),S=Math.min(o.count,Math.min(m.start+m.count,p.start+p.count));for(let T=b,R=S;Te.far?null:{distance:c,point:As.clone(),object:i}}function ws(i,t,e,n,s,r,a,o,l,c){i.getVertexPosition(o,ys),i.getVertexPosition(l,bs),i.getVertexPosition(c,Es);const h=Eh(i,t,e,n,ys,bs,Es,Do);if(h){const u=new D;Qe.getBarycoord(Do,ys,bs,Es,u),s&&(h.uv=Qe.getInterpolatedAttribute(s,o,l,c,u,new at)),r&&(h.uv1=Qe.getInterpolatedAttribute(r,o,l,c,u,new at)),a&&(h.normal=Qe.getInterpolatedAttribute(a,o,l,c,u,new D),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const d={a:o,b:l,c,normal:new D,materialIndex:0};Qe.getNormal(ys,bs,Es,d.normal),h.face=d,h.barycoord=u}return h}class oe extends Ie{constructor(t=1,e=1,n=1,s=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:a};const o=this;s=Math.floor(s),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],u=[];let d=0,p=0;x("z","y","x",-1,-1,n,e,t,a,r,0),x("z","y","x",1,-1,n,e,-t,a,r,1),x("x","z","y",1,1,t,n,e,s,a,2),x("x","z","y",1,-1,t,n,-e,s,a,3),x("x","y","z",1,-1,t,e,n,s,r,4),x("x","y","z",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute("position",new he(c,3)),this.setAttribute("normal",new he(h,3)),this.setAttribute("uv",new he(u,2));function x(_,m,f,b,S,T,R,w,L,F,E){const M=T/L,P=R/F,O=T/2,z=R/2,k=w/2,W=L+1,Y=F+1;let nt=0,X=0;const rt=new D;for(let st=0;st0?1:-1,h.push(rt.x,rt.y,rt.z),u.push(Gt/L),u.push(1-st/F),nt+=1}}for(let st=0;st0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class Vc extends Me{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new re,this.projectionMatrix=new re,this.projectionMatrixInverse=new re,this.coordinateSystem=cn,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Pn=new D,Lo=new at,Io=new at;class ke extends Vc{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=Ra*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(ks*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return Ra*2*Math.atan(Math.tan(ks*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,n){Pn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Pn.x,Pn.y).multiplyScalar(-t/Pn.z),Pn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Pn.x,Pn.y).multiplyScalar(-t/Pn.z)}getViewSize(t,e){return this.getViewBounds(t,Lo,Io),e.subVectors(Io,Lo)}setViewOffset(t,e,n,s,r,a){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(ks*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*s/l,e-=a.offsetY*n/c,s*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const pi=-90,mi=1;class Ch extends Me{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new ke(pi,mi,t,e);s.layers=this.layers,this.add(s);const r=new ke(pi,mi,t,e);r.layers=this.layers,this.add(r);const a=new ke(pi,mi,t,e);a.layers=this.layers,this.add(a);const o=new ke(pi,mi,t,e);o.layers=this.layers,this.add(o);const l=new ke(pi,mi,t,e);l.layers=this.layers,this.add(l);const c=new ke(pi,mi,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[n,s,r,a,o,l]=e;for(const c of e)this.remove(c);if(t===cn)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===Xs)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);for(const c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,u=t.getRenderTarget(),d=t.getActiveCubeFace(),p=t.getActiveMipmapLevel(),x=t.xr.enabled;t.xr.enabled=!1;const _=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,a),t.setRenderTarget(n,2,s),t.render(e,o),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=_,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(u,d,p),t.xr.enabled=x,n.texture.needsPMREMUpdate=!0}}class Gc extends Re{constructor(t=[],e=Ai,n,s,r,a,o,l,c,h){super(t,e,n,s,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Ph extends $n{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];this.texture=new Gc(s),this._setTextureOptions(e),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` - - varying vec3 vWorldDirection; - - vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - - } - - void main() { - - vWorldDirection = transformDirection( position, modelMatrix ); - - #include - #include - - } - `,fragmentShader:` - - uniform sampler2D tEquirect; - - varying vec3 vWorldDirection; - - #include - - void main() { - - vec3 direction = normalize( vWorldDirection ); - - vec2 sampleUV = equirectUv( direction ); - - gl_FragColor = texture2D( tEquirect, sampleUV ); - - } - `},s=new oe(5,5,5),r=new En({name:"CubemapFromEquirect",uniforms:Ci(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:Le,blending:yn});r.uniforms.tEquirect.value=e;const a=new Vt(s,r),o=e.minFilter;return e.minFilter===Kn&&(e.minFilter=Ye),new Ch(1,10,this).update(t,a),e.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(t,e=!0,n=!0,s=!0){const r=t.getRenderTarget();for(let a=0;a<6;a++)t.setRenderTarget(this,a),t.clear(e,n,s);t.setRenderTarget(r)}}class ln extends Me{constructor(){super(),this.isGroup=!0,this.type="Group"}}const Dh={type:"move"};class Tr{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new ln,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new ln,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new D,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new D),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new ln,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new D,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new D),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!=="visible-blurred"){if(c&&t.hand){a=!0;for(const _ of t.hand.values()){const m=e.getJointPose(_,n),f=this._getHandJoint(c,_);m!==null&&(f.matrix.fromArray(m.transform.matrix),f.matrix.decompose(f.position,f.rotation,f.scale),f.matrixWorldNeedsUpdate=!0,f.jointRadius=m.radius),f.visible=m!==null}const h=c.joints["index-finger-tip"],u=c.joints["thumb-tip"],d=h.position.distanceTo(u.position),p=.02,x=.005;c.inputState.pinching&&d>p+x?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&d<=p-x&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Dh)))}return o!==null&&(o.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){const n=new ln;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}class kc extends Me{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new nn,this.environmentIntensity=1,this.environmentRotation=new nn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),t.background!==null&&(this.background=t.background.clone()),t.environment!==null&&(this.environment=t.environment.clone()),t.fog!==null&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),t.overrideMaterial!==null&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return this.fog!==null&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Hc extends Re{constructor(t=null,e=1,n=1,s,r,a,o,l,c=He,h=He,u,d){super(null,a,o,l,c,h,s,r,u,d),this.isDataTexture=!0,this.image={data:t,width:e,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Uo extends en{constructor(t,e,n,s=1){super(t,e,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}const xi=new re,No=new re,Rs=[],Fo=new On,Lh=new re,Gi=new Vt,ki=new Ii;class Ih extends Vt{constructor(t,e,n){super(t,e),this.isInstancedMesh=!0,this.instanceMatrix=new Uo(new Float32Array(n*16),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Nh.getNormalMatrix(t),s=this.coplanarPoint(Ar).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Hn=new Ii,Fh=new at(.5,.5),Cs=new D;class Za{constructor(t=new Dn,e=new Dn,n=new Dn,s=new Dn,r=new Dn,a=new Dn){this.planes=[t,e,n,s,r,a]}set(t,e,n,s,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=cn,n=!1){const s=this.planes,r=t.elements,a=r[0],o=r[1],l=r[2],c=r[3],h=r[4],u=r[5],d=r[6],p=r[7],x=r[8],_=r[9],m=r[10],f=r[11],b=r[12],S=r[13],T=r[14],R=r[15];if(s[0].setComponents(c-a,p-h,f-x,R-b).normalize(),s[1].setComponents(c+a,p+h,f+x,R+b).normalize(),s[2].setComponents(c+o,p+u,f+_,R+S).normalize(),s[3].setComponents(c-o,p-u,f-_,R-S).normalize(),n)s[4].setComponents(l,d,m,T).normalize(),s[5].setComponents(c-l,p-d,f-m,R-T).normalize();else if(s[4].setComponents(c-l,p-d,f-m,R-T).normalize(),e===cn)s[5].setComponents(c+l,p+d,f+m,R+T).normalize();else if(e===Xs)s[5].setComponents(l,d,m,T).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Hn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Hn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Hn)}intersectsSprite(t){Hn.center.set(0,0,0);const e=Fh.distanceTo(t.center);return Hn.radius=.7071067811865476+e,Hn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Hn)}intersectsSphere(t){const e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)0?t.max.x:t.min.x,Cs.y=s.normal.y>0?t.max.y:t.min.y,Cs.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Cs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class Wc extends ei{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Yt(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const Zs=new D,Ks=new D,Oo=new re,Hi=new $s,Ps=new Ii,wr=new D,Bo=new D;class Oh extends Me{constructor(t=new Ie,e=new Wc){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[0];for(let s=1,r=e.count;s0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rn)return;wr.applyMatrix4(i.matrixWorld);const c=t.ray.origin.distanceTo(wr);if(!(ct.far))return{distance:c,point:Bo.clone().applyMatrix4(i.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:i}}const zo=new D,Vo=new D;class Bh extends Oh{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[];for(let s=0,r=e.count;s0&&S(!0),e>0&&S(!1)),this.setIndex(h),this.setAttribute("position",new he(u,3)),this.setAttribute("normal",new he(d,3)),this.setAttribute("uv",new he(p,2));function b(){const T=new D,R=new D;let w=0;const L=(e-t)/n;for(let F=0;F<=r;F++){const E=[],M=F/r,P=M*(e-t)+t;for(let O=0;O<=s;O++){const z=O/s,k=z*l+o,W=Math.sin(k),Y=Math.cos(k);R.x=P*W,R.y=-M*n+m,R.z=P*Y,u.push(R.x,R.y,R.z),T.set(W,L,Y).normalize(),d.push(T.x,T.y,T.z),p.push(z,1-M),E.push(x++)}_.push(E)}for(let F=0;F0||E!==0)&&(h.push(M,P,z),w+=3),(e>0||E!==r-1)&&(h.push(P,O,z),w+=3)}c.addGroup(f,w,0),f+=w}function S(T){const R=x,w=new at,L=new D;let F=0;const E=T===!0?t:e,M=T===!0?1:-1;for(let O=1;O<=s;O++)u.push(0,m*M,0),d.push(0,M,0),p.push(.5,.5),x++;const P=x;for(let O=0;O<=s;O++){const k=O/s*l+o,W=Math.cos(k),Y=Math.sin(k);L.x=E*Y,L.y=m*M,L.z=E*W,u.push(L.x,L.y,L.z),d.push(0,M,0),w.x=W*.5+.5,w.y=Y*.5*M+.5,p.push(w.x,w.y),x++}for(let O=0;O0)l=s-1;else{l=s;break}if(s=l,n[s]===a)return s/(r-1);const h=n[s],d=n[s+1]-h,p=(a-h)/d;return(s+p)/(r-1)}getTangent(t,e){let s=t-1e-4,r=t+1e-4;s<0&&(s=0),r>1&&(r=1);const a=this.getPoint(s),o=this.getPoint(r),l=e||(a.isVector2?new at:new D);return l.copy(o).sub(a).normalize(),l}getTangentAt(t,e){const n=this.getUtoTmapping(t);return this.getTangent(n,e)}computeFrenetFrames(t,e=!1){const n=new D,s=[],r=[],a=[],o=new D,l=new re;for(let p=0;p<=t;p++){const x=p/t;s[p]=this.getTangentAt(x,new D)}r[0]=new D,a[0]=new D;let c=Number.MAX_VALUE;const h=Math.abs(s[0].x),u=Math.abs(s[0].y),d=Math.abs(s[0].z);h<=c&&(c=h,n.set(1,0,0)),u<=c&&(c=u,n.set(0,1,0)),d<=c&&n.set(0,0,1),o.crossVectors(s[0],n).normalize(),r[0].crossVectors(s[0],o),a[0].crossVectors(s[0],r[0]);for(let p=1;p<=t;p++){if(r[p]=r[p-1].clone(),a[p]=a[p-1].clone(),o.crossVectors(s[p-1],s[p]),o.length()>Number.EPSILON){o.normalize();const x=Math.acos(Xt(s[p-1].dot(s[p]),-1,1));r[p].applyMatrix4(l.makeRotationAxis(o,x))}a[p].crossVectors(s[p],r[p])}if(e===!0){let p=Math.acos(Xt(r[0].dot(r[t]),-1,1));p/=t,s[0].dot(o.crossVectors(r[0],r[t]))>0&&(p=-p);for(let x=1;x<=t;x++)r[x].applyMatrix4(l.makeRotationAxis(s[x],p*x)),a[x].crossVectors(s[x],r[x])}return{tangents:s,normals:r,binormals:a}}clone(){return new this.constructor().copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class ja extends un{constructor(t=0,e=0,n=1,s=1,r=0,a=Math.PI*2,o=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=n,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(t,e=new at){const n=e,s=Math.PI*2;let r=this.aEndAngle-this.aStartAngle;const a=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(o)/r)+1)*r:l===0&&o===r-1&&(o=r-2,l=1);let c,h;this.closed||o>0?c=s[(o-1)%r]:(Ls.subVectors(s[0],s[1]).add(s[0]),c=Ls);const u=s[o%r],d=s[(o+1)%r];if(this.closed||o+2s.length-2?s.length-1:a+1],u=s[a>s.length-3?s.length-1:a+2];return n.set(Go(o,l.x,c.x,h.x,u.x),Go(o,l.y,c.y,h.y,u.y)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e=n){const a=s[r]-n,o=this.curves[r],l=o.getLength(),c=l===0?0:1-a/l;return o.getPointAt(c,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let n=0,s=this.curves.length;n1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,n=t.curves.length;e0){const u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class js extends rs{constructor(t){super(t),this.uuid=Li(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let n=0,s=this.holes.length;n80*e){o=i[0],l=i[1];let h=o,u=l;for(let d=e;dh&&(h=p),x>u&&(u=x)}c=Math.max(h-o,u-l),c=c!==0?32767/c:0}return as(r,a,e,o,l,c,0),a}function Jc(i,t,e,n,s){let r;if(s===pu(i,t,e,n)>0)for(let a=t;a=t;a-=n)r=ko(a/n|0,i[a],i[a+1],r);return r&&Pi(r,r.next)&&(cs(r),r=r.next),r}function Qn(i,t){if(!i)return i;t||(t=i);let e=i,n;do if(n=!1,!e.steiner&&(Pi(e,e.next)||pe(e.prev,e,e.next)===0)){if(cs(e),e=t=e.prev,e===e.next)break;n=!0}else e=e.next;while(n||e!==t);return t}function as(i,t,e,n,s,r,a){if(!i)return;!a&&r&&cu(i,n,s,r);let o=i;for(;i.prev!==i.next;){const l=i.prev,c=i.next;if(r?tu(i,n,s,r):Qh(i)){t.push(l.i,i.i,c.i),cs(i),i=c.next,o=c.next;continue}if(i=c,i===o){a?a===1?(i=eu(Qn(i),t),as(i,t,e,n,s,r,2)):a===2&&nu(i,t,e,n,s,r):as(Qn(i),t,e,n,s,r,1);break}}}function Qh(i){const t=i.prev,e=i,n=i.next;if(pe(t,e,n)>=0)return!1;const s=t.x,r=e.x,a=n.x,o=t.y,l=e.y,c=n.y,h=Math.min(s,r,a),u=Math.min(o,l,c),d=Math.max(s,r,a),p=Math.max(o,l,c);let x=n.next;for(;x!==t;){if(x.x>=h&&x.x<=d&&x.y>=u&&x.y<=p&&Yi(s,o,r,l,a,c,x.x,x.y)&&pe(x.prev,x,x.next)>=0)return!1;x=x.next}return!0}function tu(i,t,e,n){const s=i.prev,r=i,a=i.next;if(pe(s,r,a)>=0)return!1;const o=s.x,l=r.x,c=a.x,h=s.y,u=r.y,d=a.y,p=Math.min(o,l,c),x=Math.min(h,u,d),_=Math.max(o,l,c),m=Math.max(h,u,d),f=Pa(p,x,t,e,n),b=Pa(_,m,t,e,n);let S=i.prevZ,T=i.nextZ;for(;S&&S.z>=f&&T&&T.z<=b;){if(S.x>=p&&S.x<=_&&S.y>=x&&S.y<=m&&S!==s&&S!==a&&Yi(o,h,l,u,c,d,S.x,S.y)&&pe(S.prev,S,S.next)>=0||(S=S.prevZ,T.x>=p&&T.x<=_&&T.y>=x&&T.y<=m&&T!==s&&T!==a&&Yi(o,h,l,u,c,d,T.x,T.y)&&pe(T.prev,T,T.next)>=0))return!1;T=T.nextZ}for(;S&&S.z>=f;){if(S.x>=p&&S.x<=_&&S.y>=x&&S.y<=m&&S!==s&&S!==a&&Yi(o,h,l,u,c,d,S.x,S.y)&&pe(S.prev,S,S.next)>=0)return!1;S=S.prevZ}for(;T&&T.z<=b;){if(T.x>=p&&T.x<=_&&T.y>=x&&T.y<=m&&T!==s&&T!==a&&Yi(o,h,l,u,c,d,T.x,T.y)&&pe(T.prev,T,T.next)>=0)return!1;T=T.nextZ}return!0}function eu(i,t){let e=i;do{const n=e.prev,s=e.next.next;!Pi(n,s)&&Qc(n,e,e.next,s)&&os(n,s)&&os(s,n)&&(t.push(n.i,e.i,s.i),cs(e),cs(e.next),e=i=s),e=e.next}while(e!==i);return Qn(e)}function nu(i,t,e,n,s,r){let a=i;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&uu(a,o)){let l=tl(a,o);a=Qn(a,a.next),l=Qn(l,l.next),as(a,t,e,n,s,r,0),as(l,t,e,n,s,r,0);return}o=o.next}a=a.next}while(a!==i)}function iu(i,t,e,n){const s=[];for(let r=0,a=t.length;r=e.next.y&&e.next.y!==e.y){const u=e.x+(s-e.y)*(e.next.x-e.x)/(e.next.y-e.y);if(u<=n&&u>r&&(r=u,a=e.x=e.x&&e.x>=l&&n!==e.x&&$c(sa.x||e.x===a.x&&ou(a,e)))&&(a=e,h=u)}e=e.next}while(e!==o);return a}function ou(i,t){return pe(i.prev,i,t.prev)<0&&pe(t.next,i,i.next)<0}function cu(i,t,e,n){let s=i;do s.z===0&&(s.z=Pa(s.x,s.y,t,e,n)),s.prevZ=s.prev,s.nextZ=s.next,s=s.next;while(s!==i);s.prevZ.nextZ=null,s.prevZ=null,lu(s)}function lu(i){let t,e=1;do{let n=i,s;i=null;let r=null;for(t=0;n;){t++;let a=n,o=0;for(let c=0;c0||l>0&&a;)o!==0&&(l===0||!a||n.z<=a.z)?(s=n,n=n.nextZ,o--):(s=a,a=a.nextZ,l--),r?r.nextZ=s:i=s,s.prevZ=r,r=s;n=a}r.nextZ=null,e*=2}while(t>1);return i}function Pa(i,t,e,n,s){return i=(i-e)*s|0,t=(t-n)*s|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,i|t<<1}function hu(i){let t=i,e=i;do(t.x=(i-a)*(r-o)&&(i-a)*(n-o)>=(e-a)*(t-o)&&(e-a)*(r-o)>=(s-a)*(n-o)}function Yi(i,t,e,n,s,r,a,o){return!(i===a&&t===o)&&$c(i,t,e,n,s,r,a,o)}function uu(i,t){return i.next.i!==t.i&&i.prev.i!==t.i&&!fu(i,t)&&(os(i,t)&&os(t,i)&&du(i,t)&&(pe(i.prev,i,t.prev)||pe(i,t.prev,t))||Pi(i,t)&&pe(i.prev,i,i.next)>0&&pe(t.prev,t,t.next)>0)}function pe(i,t,e){return(t.y-i.y)*(e.x-t.x)-(t.x-i.x)*(e.y-t.y)}function Pi(i,t){return i.x===t.x&&i.y===t.y}function Qc(i,t,e,n){const s=Us(pe(i,t,e)),r=Us(pe(i,t,n)),a=Us(pe(e,n,i)),o=Us(pe(e,n,t));return!!(s!==r&&a!==o||s===0&&Is(i,e,t)||r===0&&Is(i,n,t)||a===0&&Is(e,i,n)||o===0&&Is(e,t,n))}function Is(i,t,e){return t.x<=Math.max(i.x,e.x)&&t.x>=Math.min(i.x,e.x)&&t.y<=Math.max(i.y,e.y)&&t.y>=Math.min(i.y,e.y)}function Us(i){return i>0?1:i<0?-1:0}function fu(i,t){let e=i;do{if(e.i!==i.i&&e.next.i!==i.i&&e.i!==t.i&&e.next.i!==t.i&&Qc(e,e.next,i,t))return!0;e=e.next}while(e!==i);return!1}function os(i,t){return pe(i.prev,i,i.next)<0?pe(i,t,i.next)>=0&&pe(i,i.prev,t)>=0:pe(i,t,i.prev)<0||pe(i,i.next,t)<0}function du(i,t){let e=i,n=!1;const s=(i.x+t.x)/2,r=(i.y+t.y)/2;do e.y>r!=e.next.y>r&&e.next.y!==e.y&&s<(e.next.x-e.x)*(r-e.y)/(e.next.y-e.y)+e.x&&(n=!n),e=e.next;while(e!==i);return n}function tl(i,t){const e=Da(i.i,i.x,i.y),n=Da(t.i,t.x,t.y),s=i.next,r=t.prev;return i.next=t,t.prev=i,e.next=s,s.prev=e,n.next=e,e.prev=n,r.next=n,n.prev=r,n}function ko(i,t,e,n){const s=Da(i,t,e);return n?(s.next=n.next,s.prev=n,n.next.prev=s,n.next=s):(s.prev=s,s.next=s),s}function cs(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function Da(i,t,e){return{i,x:t,y:e,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function pu(i,t,e,n){let s=0;for(let r=t,a=e-n;r2&&i[t-1].equals(i[0])&&i.pop()}function Wo(i,t){for(let e=0;eNumber.EPSILON){const q=Math.sqrt(g),$=Math.sqrt(Mt*Mt+A*A),H=y.x-ft/q,wt=y.y+vt/q,dt=Z.x-A/$,Pt=Z.y+Mt/$,At=((dt-H)*A-(Pt-wt)*Mt)/(vt*A-ft*Mt);Q=H+vt*At-B.x,ot=wt+ft*At-B.y;const tt=Q*Q+ot*ot;if(tt<=2)return new at(Q,ot);et=Math.sqrt(tt/2)}else{let q=!1;vt>Number.EPSILON?Mt>Number.EPSILON&&(q=!0):vt<-Number.EPSILON?Mt<-Number.EPSILON&&(q=!0):Math.sign(ft)===Math.sign(A)&&(q=!0),q?(Q=-ft,ot=vt,et=Math.sqrt(g)):(Q=vt,ot=ft,et=Math.sqrt(g/2))}return new at(Q/et,ot/et)}const rt=[];for(let B=0,y=W.length,Z=y-1,Q=B+1;B=0;B--){const y=B/m,Z=p*Math.cos(y*Math.PI/2),Q=x*Math.sin(y*Math.PI/2)+_;for(let ot=0,et=W.length;ot=0;){const Q=Z;let ot=Z-1;ot<0&&(ot=B.length-1);for(let et=0,vt=h+m*2;et0)&&p.push(S,T,w),(f!==n-1||l0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class vu extends ei{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Yt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Yt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Xa,this.normalScale=new at(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new nn,this.combine=Fa,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Mu extends ei{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=Zl,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Su extends ei{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class $a extends Me{constructor(t,e=1){super(),this.isLight=!0,this.type="Light",this.color=new Yt(t),this.intensity=e}dispose(){}copy(t,e){return super.copy(t,e),this.color.copy(t.color),this.intensity=t.intensity,this}toJSON(t){const e=super.toJSON(t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,this.groundColor!==void 0&&(e.object.groundColor=this.groundColor.getHex()),this.distance!==void 0&&(e.object.distance=this.distance),this.angle!==void 0&&(e.object.angle=this.angle),this.decay!==void 0&&(e.object.decay=this.decay),this.penumbra!==void 0&&(e.object.penumbra=this.penumbra),this.shadow!==void 0&&(e.object.shadow=this.shadow.toJSON()),this.target!==void 0&&(e.object.target=this.target.uuid),e}}class yu extends $a{constructor(t,e,n){super(t,n),this.isHemisphereLight=!0,this.type="HemisphereLight",this.position.copy(Me.DEFAULT_UP),this.updateMatrix(),this.groundColor=new Yt(e)}copy(t,e){return super.copy(t,e),this.groundColor.copy(t.groundColor),this}}const Dr=new re,Xo=new D,qo=new D;class el{constructor(t){this.camera=t,this.intensity=1,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new at(512,512),this.mapType=hn,this.map=null,this.mapPass=null,this.matrix=new re,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Za,this._frameExtents=new at(1,1),this._viewportCount=1,this._viewports=[new se(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(t){const e=this.camera,n=this.matrix;Xo.setFromMatrixPosition(t.matrixWorld),e.position.copy(Xo),qo.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(qo),e.updateMatrixWorld(),Dr.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Dr,e.coordinateSystem,e.reversedDepth),e.reversedDepth?n.set(.5,0,0,.5,0,.5,0,.5,0,0,1,0,0,0,0,1):n.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),n.multiply(Dr)}getViewport(t){return this._viewports[t]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(t){return this.camera=t.camera.clone(),this.intensity=t.intensity,this.bias=t.bias,this.radius=t.radius,this.autoUpdate=t.autoUpdate,this.needsUpdate=t.needsUpdate,this.normalBias=t.normalBias,this.blurSamples=t.blurSamples,this.mapSize.copy(t.mapSize),this}clone(){return new this.constructor().copy(this)}toJSON(){const t={};return this.intensity!==1&&(t.intensity=this.intensity),this.bias!==0&&(t.bias=this.bias),this.normalBias!==0&&(t.normalBias=this.normalBias),this.radius!==1&&(t.radius=this.radius),(this.mapSize.x!==512||this.mapSize.y!==512)&&(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}const Yo=new re,Wi=new D,Lr=new D;class bu extends el{constructor(){super(new ke(90,1,.5,500)),this.isPointLightShadow=!0,this._frameExtents=new at(4,2),this._viewportCount=6,this._viewports=[new se(2,1,1,1),new se(0,1,1,1),new se(3,1,1,1),new se(1,1,1,1),new se(3,0,1,1),new se(1,0,1,1)],this._cubeDirections=[new D(1,0,0),new D(-1,0,0),new D(0,0,1),new D(0,0,-1),new D(0,1,0),new D(0,-1,0)],this._cubeUps=[new D(0,1,0),new D(0,1,0),new D(0,1,0),new D(0,1,0),new D(0,0,1),new D(0,0,-1)]}updateMatrices(t,e=0){const n=this.camera,s=this.matrix,r=t.distance||n.far;r!==n.far&&(n.far=r,n.updateProjectionMatrix()),Wi.setFromMatrixPosition(t.matrixWorld),n.position.copy(Wi),Lr.copy(n.position),Lr.add(this._cubeDirections[e]),n.up.copy(this._cubeUps[e]),n.lookAt(Lr),n.updateMatrixWorld(),s.makeTranslation(-Wi.x,-Wi.y,-Wi.z),Yo.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Yo,n.coordinateSystem,n.reversedDepth)}}class Eu extends $a{constructor(t,e,n=0,s=2){super(t,e),this.isPointLight=!0,this.type="PointLight",this.distance=n,this.decay=s,this.shadow=new bu}get power(){return this.intensity*4*Math.PI}set power(t){this.intensity=t/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}class nl extends Vc{constructor(t=-1,e=1,n=1,s=-1,r=.1,a=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=s,this.near=r,this.far=a,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=t.view===null?null:Object.assign({},t.view),this}setViewOffset(t,e,n,s,r,a){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,s=(this.top+this.bottom)/2;let r=n-t,a=n+t,o=s+e,l=s-e;if(this.view!==null&&this.view.enabled){const c=(this.right-this.left)/this.view.fullWidth/this.zoom,h=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=c*this.view.offsetX,a=r+c*this.view.width,o-=h*this.view.offsetY,l=o-h*this.view.height}this.projectionMatrix.makeOrthographic(r,a,o,l,this.near,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,this.view!==null&&(e.object.view=Object.assign({},this.view)),e}}class Tu extends el{constructor(){super(new nl(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class Au extends $a{constructor(t,e){super(t,e),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(Me.DEFAULT_UP),this.updateMatrix(),this.target=new Me,this.shadow=new Tu}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}class wu extends ke{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}const Zo=new re;class Ru{constructor(t,e,n=0,s=1/0){this.ray=new $s(t,e),this.near=n,this.far=s,this.camera=null,this.layers=new Ya,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(t,e){this.ray.set(t,e)}setFromCamera(t,e){e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize(),this.camera=e):e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld),this.camera=e):de("Raycaster: Unsupported camera type: "+e.type)}setFromXRController(t){return Zo.identity().extractRotation(t.matrixWorld),this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(0,0,-1).applyMatrix4(Zo),this}intersectObject(t,e=!0,n=[]){return La(t,this,n,e),n.sort(Ko),n}intersectObjects(t,e=!0,n=[]){for(let s=0,r=t.length;sp.start-x.start);let d=0;for(let p=1;p 0 - vec4 plane; - #ifdef ALPHA_TO_COVERAGE - float distanceToPlane, distanceGradient; - float clipOpacity = 1.0; - #pragma unroll_loop_start - for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; - distanceGradient = fwidth( distanceToPlane ) / 2.0; - clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); - if ( clipOpacity == 0.0 ) discard; - } - #pragma unroll_loop_end - #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES - float unionClipOpacity = 1.0; - #pragma unroll_loop_start - for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; - distanceGradient = fwidth( distanceToPlane ) / 2.0; - unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); - } - #pragma unroll_loop_end - clipOpacity *= 1.0 - unionClipOpacity; - #endif - diffuseColor.a *= clipOpacity; - if ( diffuseColor.a == 0.0 ) discard; - #else - #pragma unroll_loop_start - for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard; - } - #pragma unroll_loop_end - #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES - bool clipped = true; - #pragma unroll_loop_start - for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped; - } - #pragma unroll_loop_end - if ( clipped ) discard; - #endif - #endif -#endif`,Zu=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; - uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; -#endif`,Ku=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; -#endif`,ju=`#if NUM_CLIPPING_PLANES > 0 - vClipPosition = - mvPosition.xyz; -#endif`,Ju=`#if defined( USE_COLOR_ALPHA ) - diffuseColor *= vColor; -#elif defined( USE_COLOR ) - diffuseColor.rgb *= vColor; -#endif`,$u=`#if defined( USE_COLOR_ALPHA ) - varying vec4 vColor; -#elif defined( USE_COLOR ) - varying vec3 vColor; -#endif`,Qu=`#if defined( USE_COLOR_ALPHA ) - varying vec4 vColor; -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - varying vec3 vColor; -#endif`,tf=`#if defined( USE_COLOR_ALPHA ) - vColor = vec4( 1.0 ); -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - vColor = vec3( 1.0 ); -#endif -#ifdef USE_COLOR - vColor *= color; -#endif -#ifdef USE_INSTANCING_COLOR - vColor.xyz *= instanceColor.xyz; -#endif -#ifdef USE_BATCHING_COLOR - vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); - vColor.xyz *= batchingColor.xyz; -#endif`,ef=`#define PI 3.141592653589793 -#define PI2 6.283185307179586 -#define PI_HALF 1.5707963267948966 -#define RECIPROCAL_PI 0.3183098861837907 -#define RECIPROCAL_PI2 0.15915494309189535 -#define EPSILON 1e-6 -#ifndef saturate -#define saturate( a ) clamp( a, 0.0, 1.0 ) -#endif -#define whiteComplement( a ) ( 1.0 - saturate( a ) ) -float pow2( const in float x ) { return x*x; } -vec3 pow2( const in vec3 x ) { return x*x; } -float pow3( const in float x ) { return x*x*x; } -float pow4( const in float x ) { float x2 = x*x; return x2*x2; } -float max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); } -float average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); } -highp float rand( const in vec2 uv ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract( sin( sn ) * c ); -} -#ifdef HIGH_PRECISION - float precisionSafeLength( vec3 v ) { return length( v ); } -#else - float precisionSafeLength( vec3 v ) { - float maxComponent = max3( abs( v ) ); - return length( v / maxComponent ) * maxComponent; - } -#endif -struct IncidentLight { - vec3 color; - vec3 direction; - bool visible; -}; -struct ReflectedLight { - vec3 directDiffuse; - vec3 directSpecular; - vec3 indirectDiffuse; - vec3 indirectSpecular; -}; -#ifdef USE_ALPHAHASH - varying vec3 vPosition; -#endif -vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); -} -vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { - return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); -} -bool isPerspectiveMatrix( mat4 m ) { - return m[ 2 ][ 3 ] == - 1.0; -} -vec2 equirectUv( in vec3 dir ) { - float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; - float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - return vec2( u, v ); -} -vec3 BRDF_Lambert( const in vec3 diffuseColor ) { - return RECIPROCAL_PI * diffuseColor; -} -vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { - float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); - return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} -float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { - float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); - return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`,nf=`#ifdef ENVMAP_TYPE_CUBE_UV - #define cubeUV_minMipLevel 4.0 - #define cubeUV_minTileSize 16.0 - float getFace( vec3 direction ) { - vec3 absDirection = abs( direction ); - float face = - 1.0; - if ( absDirection.x > absDirection.z ) { - if ( absDirection.x > absDirection.y ) - face = direction.x > 0.0 ? 0.0 : 3.0; - else - face = direction.y > 0.0 ? 1.0 : 4.0; - } else { - if ( absDirection.z > absDirection.y ) - face = direction.z > 0.0 ? 2.0 : 5.0; - else - face = direction.y > 0.0 ? 1.0 : 4.0; - } - return face; - } - vec2 getUV( vec3 direction, float face ) { - vec2 uv; - if ( face == 0.0 ) { - uv = vec2( direction.z, direction.y ) / abs( direction.x ); - } else if ( face == 1.0 ) { - uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); - } else if ( face == 2.0 ) { - uv = vec2( - direction.x, direction.y ) / abs( direction.z ); - } else if ( face == 3.0 ) { - uv = vec2( - direction.z, direction.y ) / abs( direction.x ); - } else if ( face == 4.0 ) { - uv = vec2( - direction.x, direction.z ) / abs( direction.y ); - } else { - uv = vec2( direction.x, direction.y ) / abs( direction.z ); - } - return 0.5 * ( uv + 1.0 ); - } - vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) { - float face = getFace( direction ); - float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 ); - mipInt = max( mipInt, cubeUV_minMipLevel ); - float faceSize = exp2( mipInt ); - highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0; - if ( face > 2.0 ) { - uv.y += faceSize; - face -= 3.0; - } - uv.x += face * faceSize; - uv.x += filterInt * 3.0 * cubeUV_minTileSize; - uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize ); - uv.x *= CUBEUV_TEXEL_WIDTH; - uv.y *= CUBEUV_TEXEL_HEIGHT; - #ifdef texture2DGradEXT - return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb; - #else - return texture2D( envMap, uv ).rgb; - #endif - } - #define cubeUV_r0 1.0 - #define cubeUV_m0 - 2.0 - #define cubeUV_r1 0.8 - #define cubeUV_m1 - 1.0 - #define cubeUV_r4 0.4 - #define cubeUV_m4 2.0 - #define cubeUV_r5 0.305 - #define cubeUV_m5 3.0 - #define cubeUV_r6 0.21 - #define cubeUV_m6 4.0 - float roughnessToMip( float roughness ) { - float mip = 0.0; - if ( roughness >= cubeUV_r1 ) { - mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0; - } else if ( roughness >= cubeUV_r4 ) { - mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1; - } else if ( roughness >= cubeUV_r5 ) { - mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4; - } else if ( roughness >= cubeUV_r6 ) { - mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5; - } else { - mip = - 2.0 * log2( 1.16 * roughness ); } - return mip; - } - vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) { - float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP ); - float mipF = fract( mip ); - float mipInt = floor( mip ); - vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt ); - if ( mipF == 0.0 ) { - return vec4( color0, 1.0 ); - } else { - vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 ); - return vec4( mix( color0, color1, mipF ), 1.0 ); - } - } -#endif`,sf=`vec3 transformedNormal = objectNormal; -#ifdef USE_TANGENT - vec3 transformedTangent = objectTangent; -#endif -#ifdef USE_BATCHING - mat3 bm = mat3( batchingMatrix ); - transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) ); - transformedNormal = bm * transformedNormal; - #ifdef USE_TANGENT - transformedTangent = bm * transformedTangent; - #endif -#endif -#ifdef USE_INSTANCING - mat3 im = mat3( instanceMatrix ); - transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) ); - transformedNormal = im * transformedNormal; - #ifdef USE_TANGENT - transformedTangent = im * transformedTangent; - #endif -#endif -transformedNormal = normalMatrix * transformedNormal; -#ifdef FLIP_SIDED - transformedNormal = - transformedNormal; -#endif -#ifdef USE_TANGENT - transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz; - #ifdef FLIP_SIDED - transformedTangent = - transformedTangent; - #endif -#endif`,rf=`#ifdef USE_DISPLACEMENTMAP - uniform sampler2D displacementMap; - uniform float displacementScale; - uniform float displacementBias; -#endif`,af=`#ifdef USE_DISPLACEMENTMAP - transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`,of=`#ifdef USE_EMISSIVEMAP - vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); - #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE - emissiveColor = sRGBTransferEOTF( emissiveColor ); - #endif - totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,cf=`#ifdef USE_EMISSIVEMAP - uniform sampler2D emissiveMap; -#endif`,lf="gl_FragColor = linearToOutputTexel( gl_FragColor );",hf=`vec4 LinearTransferOETF( in vec4 value ) { - return value; -} -vec4 sRGBTransferEOTF( in vec4 value ) { - return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a ); -} -vec4 sRGBTransferOETF( in vec4 value ) { - return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,uf=`#ifdef USE_ENVMAP - #ifdef ENV_WORLDPOS - vec3 cameraToFrag; - if ( isOrthographic ) { - cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); - } else { - cameraToFrag = normalize( vWorldPosition - cameraPosition ); - } - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - #ifdef ENVMAP_MODE_REFLECTION - vec3 reflectVec = reflect( cameraToFrag, worldNormal ); - #else - vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio ); - #endif - #else - vec3 reflectVec = vReflect; - #endif - #ifdef ENVMAP_TYPE_CUBE - vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); - #else - vec4 envColor = vec4( 0.0 ); - #endif - #ifdef ENVMAP_BLENDING_MULTIPLY - outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); - #elif defined( ENVMAP_BLENDING_MIX ) - outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); - #elif defined( ENVMAP_BLENDING_ADD ) - outgoingLight += envColor.xyz * specularStrength * reflectivity; - #endif -#endif`,ff=`#ifdef USE_ENVMAP - uniform float envMapIntensity; - uniform float flipEnvMap; - uniform mat3 envMapRotation; - #ifdef ENVMAP_TYPE_CUBE - uniform samplerCube envMap; - #else - uniform sampler2D envMap; - #endif -#endif`,df=`#ifdef USE_ENVMAP - uniform float reflectivity; - #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) - #define ENV_WORLDPOS - #endif - #ifdef ENV_WORLDPOS - varying vec3 vWorldPosition; - uniform float refractionRatio; - #else - varying vec3 vReflect; - #endif -#endif`,pf=`#ifdef USE_ENVMAP - #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) - #define ENV_WORLDPOS - #endif - #ifdef ENV_WORLDPOS - - varying vec3 vWorldPosition; - #else - varying vec3 vReflect; - uniform float refractionRatio; - #endif -#endif`,mf=`#ifdef USE_ENVMAP - #ifdef ENV_WORLDPOS - vWorldPosition = worldPosition.xyz; - #else - vec3 cameraToVertex; - if ( isOrthographic ) { - cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); - } else { - cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); - } - vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); - #ifdef ENVMAP_MODE_REFLECTION - vReflect = reflect( cameraToVertex, worldNormal ); - #else - vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); - #endif - #endif -#endif`,xf=`#ifdef USE_FOG - vFogDepth = - mvPosition.z; -#endif`,gf=`#ifdef USE_FOG - varying float vFogDepth; -#endif`,_f=`#ifdef USE_FOG - #ifdef FOG_EXP2 - float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); - #else - float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); - #endif - gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,vf=`#ifdef USE_FOG - uniform vec3 fogColor; - varying float vFogDepth; - #ifdef FOG_EXP2 - uniform float fogDensity; - #else - uniform float fogNear; - uniform float fogFar; - #endif -#endif`,Mf=`#ifdef USE_GRADIENTMAP - uniform sampler2D gradientMap; -#endif -vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { - float dotNL = dot( normal, lightDirection ); - vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); - #ifdef USE_GRADIENTMAP - return vec3( texture2D( gradientMap, coord ).r ); - #else - vec2 fw = fwidth( coord ) * 0.5; - return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); - #endif -}`,Sf=`#ifdef USE_LIGHTMAP - uniform sampler2D lightMap; - uniform float lightMapIntensity; -#endif`,yf=`LambertMaterial material; -material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`,bf=`varying vec3 vViewPosition; -struct LambertMaterial { - vec3 diffuseColor; - float specularStrength; -}; -void RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,Ef=`uniform bool receiveShadow; -uniform vec3 ambientLightColor; -#if defined( USE_LIGHT_PROBES ) - uniform vec3 lightProbe[ 9 ]; -#endif -vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) { - float x = normal.x, y = normal.y, z = normal.z; - vec3 result = shCoefficients[ 0 ] * 0.886227; - result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y; - result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z; - result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x; - result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y; - result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z; - result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 ); - result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z; - result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y ); - return result; -} -vec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) { - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe ); - return irradiance; -} -vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { - vec3 irradiance = ambientLightColor; - return irradiance; -} -float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { - float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); - if ( cutoffDistance > 0.0 ) { - distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); - } - return distanceFalloff; -} -float getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) { - return smoothstep( coneCosine, penumbraCosine, angleCosine ); -} -#if NUM_DIR_LIGHTS > 0 - struct DirectionalLight { - vec3 direction; - vec3 color; - }; - uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; - void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) { - light.color = directionalLight.color; - light.direction = directionalLight.direction; - light.visible = true; - } -#endif -#if NUM_POINT_LIGHTS > 0 - struct PointLight { - vec3 position; - vec3 color; - float distance; - float decay; - }; - uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; - void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) { - vec3 lVector = pointLight.position - geometryPosition; - light.direction = normalize( lVector ); - float lightDistance = length( lVector ); - light.color = pointLight.color; - light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay ); - light.visible = ( light.color != vec3( 0.0 ) ); - } -#endif -#if NUM_SPOT_LIGHTS > 0 - struct SpotLight { - vec3 position; - vec3 direction; - vec3 color; - float distance; - float decay; - float coneCos; - float penumbraCos; - }; - uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; - void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) { - vec3 lVector = spotLight.position - geometryPosition; - light.direction = normalize( lVector ); - float angleCos = dot( light.direction, spotLight.direction ); - float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos ); - if ( spotAttenuation > 0.0 ) { - float lightDistance = length( lVector ); - light.color = spotLight.color * spotAttenuation; - light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay ); - light.visible = ( light.color != vec3( 0.0 ) ); - } else { - light.color = vec3( 0.0 ); - light.visible = false; - } - } -#endif -#if NUM_RECT_AREA_LIGHTS > 0 - struct RectAreaLight { - vec3 color; - vec3 position; - vec3 halfWidth; - vec3 halfHeight; - }; - uniform sampler2D ltc_1; uniform sampler2D ltc_2; - uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; -#endif -#if NUM_HEMI_LIGHTS > 0 - struct HemisphereLight { - vec3 direction; - vec3 skyColor; - vec3 groundColor; - }; - uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; - vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) { - float dotNL = dot( normal, hemiLight.direction ); - float hemiDiffuseWeight = 0.5 * dotNL + 0.5; - vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); - return irradiance; - } -#endif`,Tf=`#ifdef USE_ENVMAP - vec3 getIBLIrradiance( const in vec3 normal ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 ); - return PI * envMapColor.rgb * envMapIntensity; - #else - return vec3( 0.0 ); - #endif - } - vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 reflectVec = reflect( - viewDir, normal ); - reflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) ); - reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); - vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness ); - return envMapColor.rgb * envMapIntensity; - #else - return vec3( 0.0 ); - #endif - } - #ifdef USE_ANISOTROPY - vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 bentNormal = cross( bitangent, viewDir ); - bentNormal = normalize( cross( bentNormal, bitangent ) ); - bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) ); - return getIBLRadiance( viewDir, bentNormal, roughness ); - #else - return vec3( 0.0 ); - #endif - } - #endif -#endif`,Af=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,wf=`varying vec3 vViewPosition; -struct ToonMaterial { - vec3 diffuseColor; -}; -void RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { - vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Rf=`BlinnPhongMaterial material; -material.diffuseColor = diffuseColor.rgb; -material.specularColor = specular; -material.specularShininess = shininess; -material.specularStrength = specularStrength;`,Cf=`varying vec3 vViewPosition; -struct BlinnPhongMaterial { - vec3 diffuseColor; - vec3 specularColor; - float specularShininess; - float specularStrength; -}; -void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength; -} -void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,Pf=`PhysicalMaterial material; -material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); -vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); -float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); -material.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness; -material.roughness = min( material.roughness, 1.0 ); -#ifdef IOR - material.ior = ior; - #ifdef USE_SPECULAR - float specularIntensityFactor = specularIntensity; - vec3 specularColorFactor = specularColor; - #ifdef USE_SPECULAR_COLORMAP - specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb; - #endif - #ifdef USE_SPECULAR_INTENSITYMAP - specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a; - #endif - material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor ); - #else - float specularIntensityFactor = 1.0; - vec3 specularColorFactor = vec3( 1.0 ); - material.specularF90 = 1.0; - #endif - material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor ); -#else - material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor ); - material.specularF90 = 1.0; -#endif -#ifdef USE_CLEARCOAT - material.clearcoat = clearcoat; - material.clearcoatRoughness = clearcoatRoughness; - material.clearcoatF0 = vec3( 0.04 ); - material.clearcoatF90 = 1.0; - #ifdef USE_CLEARCOATMAP - material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x; - #endif - #ifdef USE_CLEARCOAT_ROUGHNESSMAP - material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y; - #endif - material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 ); - material.clearcoatRoughness += geometryRoughness; - material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 ); -#endif -#ifdef USE_DISPERSION - material.dispersion = dispersion; -#endif -#ifdef USE_IRIDESCENCE - material.iridescence = iridescence; - material.iridescenceIOR = iridescenceIOR; - #ifdef USE_IRIDESCENCEMAP - material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r; - #endif - #ifdef USE_IRIDESCENCE_THICKNESSMAP - material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum; - #else - material.iridescenceThickness = iridescenceThicknessMaximum; - #endif -#endif -#ifdef USE_SHEEN - material.sheenColor = sheenColor; - #ifdef USE_SHEEN_COLORMAP - material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb; - #endif - material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 ); - #ifdef USE_SHEEN_ROUGHNESSMAP - material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a; - #endif -#endif -#ifdef USE_ANISOTROPY - #ifdef USE_ANISOTROPYMAP - mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x ); - vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb; - vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b; - #else - vec2 anisotropyV = anisotropyVector; - #endif - material.anisotropy = length( anisotropyV ); - if( material.anisotropy == 0.0 ) { - anisotropyV = vec2( 1.0, 0.0 ); - } else { - anisotropyV /= material.anisotropy; - material.anisotropy = saturate( material.anisotropy ); - } - material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); - material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; - material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`,Df=`uniform sampler2D dfgLUT; -struct PhysicalMaterial { - vec3 diffuseColor; - float roughness; - vec3 specularColor; - float specularF90; - float dispersion; - #ifdef USE_CLEARCOAT - float clearcoat; - float clearcoatRoughness; - vec3 clearcoatF0; - float clearcoatF90; - #endif - #ifdef USE_IRIDESCENCE - float iridescence; - float iridescenceIOR; - float iridescenceThickness; - vec3 iridescenceFresnel; - vec3 iridescenceF0; - #endif - #ifdef USE_SHEEN - vec3 sheenColor; - float sheenRoughness; - #endif - #ifdef IOR - float ior; - #endif - #ifdef USE_TRANSMISSION - float transmission; - float transmissionAlpha; - float thickness; - float attenuationDistance; - vec3 attenuationColor; - #endif - #ifdef USE_ANISOTROPY - float anisotropy; - float alphaT; - vec3 anisotropyT; - vec3 anisotropyB; - #endif -}; -vec3 clearcoatSpecularDirect = vec3( 0.0 ); -vec3 clearcoatSpecularIndirect = vec3( 0.0 ); -vec3 sheenSpecularDirect = vec3( 0.0 ); -vec3 sheenSpecularIndirect = vec3(0.0 ); -vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) { - float x = clamp( 1.0 - dotVH, 0.0, 1.0 ); - float x2 = x * x; - float x5 = clamp( x * x2 * x2, 0.0, 0.9999 ); - return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 ); -} -float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) { - float a2 = pow2( alpha ); - float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); - float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); - return 0.5 / max( gv + gl, EPSILON ); -} -float D_GGX( const in float alpha, const in float dotNH ) { - float a2 = pow2( alpha ); - float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; - return RECIPROCAL_PI * a2 / pow2( denom ); -} -#ifdef USE_ANISOTROPY - float V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) { - float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) ); - float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) ); - float v = 0.5 / ( gv + gl ); - return saturate(v); - } - float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) { - float a2 = alphaT * alphaB; - highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH ); - highp float v2 = dot( v, v ); - float w2 = a2 / v2; - return RECIPROCAL_PI * a2 * pow2 ( w2 ); - } -#endif -#ifdef USE_CLEARCOAT - vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) { - vec3 f0 = material.clearcoatF0; - float f90 = material.clearcoatF90; - float roughness = material.clearcoatRoughness; - float alpha = pow2( roughness ); - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float dotVH = saturate( dot( viewDir, halfDir ) ); - vec3 F = F_Schlick( f0, f90, dotVH ); - float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - float D = D_GGX( alpha, dotNH ); - return F * ( V * D ); - } -#endif -vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { - vec3 f0 = material.specularColor; - float f90 = material.specularF90; - float roughness = material.roughness; - float alpha = pow2( roughness ); - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float dotVH = saturate( dot( viewDir, halfDir ) ); - vec3 F = F_Schlick( f0, f90, dotVH ); - #ifdef USE_IRIDESCENCE - F = mix( F, material.iridescenceFresnel, material.iridescence ); - #endif - #ifdef USE_ANISOTROPY - float dotTL = dot( material.anisotropyT, lightDir ); - float dotTV = dot( material.anisotropyT, viewDir ); - float dotTH = dot( material.anisotropyT, halfDir ); - float dotBL = dot( material.anisotropyB, lightDir ); - float dotBV = dot( material.anisotropyB, viewDir ); - float dotBH = dot( material.anisotropyB, halfDir ); - float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL ); - float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH ); - #else - float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - float D = D_GGX( alpha, dotNH ); - #endif - return F * ( V * D ); -} -vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) { - const float LUT_SIZE = 64.0; - const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; - const float LUT_BIAS = 0.5 / LUT_SIZE; - float dotNV = saturate( dot( N, V ) ); - vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) ); - uv = uv * LUT_SCALE + LUT_BIAS; - return uv; -} -float LTC_ClippedSphereFormFactor( const in vec3 f ) { - float l = length( f ); - return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 ); -} -vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) { - float x = dot( v1, v2 ); - float y = abs( x ); - float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y; - float b = 3.4175940 + ( 4.1616724 + y ) * y; - float v = a / b; - float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v; - return cross( v1, v2 ) * theta_sintheta; -} -vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) { - vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ]; - vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ]; - vec3 lightNormal = cross( v1, v2 ); - if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 ); - vec3 T1, T2; - T1 = normalize( V - N * dot( V, N ) ); - T2 = - cross( N, T1 ); - mat3 mat = mInv * transpose( mat3( T1, T2, N ) ); - vec3 coords[ 4 ]; - coords[ 0 ] = mat * ( rectCoords[ 0 ] - P ); - coords[ 1 ] = mat * ( rectCoords[ 1 ] - P ); - coords[ 2 ] = mat * ( rectCoords[ 2 ] - P ); - coords[ 3 ] = mat * ( rectCoords[ 3 ] - P ); - coords[ 0 ] = normalize( coords[ 0 ] ); - coords[ 1 ] = normalize( coords[ 1 ] ); - coords[ 2 ] = normalize( coords[ 2 ] ); - coords[ 3 ] = normalize( coords[ 3 ] ); - vec3 vectorFormFactor = vec3( 0.0 ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] ); - float result = LTC_ClippedSphereFormFactor( vectorFormFactor ); - return vec3( result ); -} -#if defined( USE_SHEEN ) -float D_Charlie( float roughness, float dotNH ) { - float alpha = pow2( roughness ); - float invAlpha = 1.0 / alpha; - float cos2h = dotNH * dotNH; - float sin2h = max( 1.0 - cos2h, 0.0078125 ); - return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI ); -} -float V_Neubelt( float dotNV, float dotNL ) { - return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); -} -vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) { - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float D = D_Charlie( sheenRoughness, dotNH ); - float V = V_Neubelt( dotNV, dotNL ); - return sheenColor * ( D * V ); -} -#endif -float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { - float dotNV = saturate( dot( normal, viewDir ) ); - float r2 = roughness * roughness; - float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; - float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; - float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); -} -vec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { - float dotNV = saturate( dot( normal, viewDir ) ); - vec2 uv = vec2( roughness, dotNV ); - return texture2D( dfgLUT, uv ).rg; -} -vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) { - vec2 fab = DFGApprox( normal, viewDir, roughness ); - return specularColor * fab.x + specularF90 * fab.y; -} -#ifdef USE_IRIDESCENCE -void computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { -#else -void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { -#endif - vec2 fab = DFGApprox( normal, viewDir, roughness ); - #ifdef USE_IRIDESCENCE - vec3 Fr = mix( specularColor, iridescenceF0, iridescence ); - #else - vec3 Fr = specularColor; - #endif - vec3 FssEss = Fr * fab.x + specularF90 * fab.y; - float Ess = fab.x + fab.y; - float Ems = 1.0 - Ess; - vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg ); - singleScatter += FssEss; - multiScatter += Fms * Ems; -} -vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { - vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - vec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness ); - vec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness ); - vec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y; - vec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y; - float Ess_V = dfgV.x + dfgV.y; - float Ess_L = dfgL.x + dfgL.y; - float Ems_V = 1.0 - Ess_V; - float Ems_L = 1.0 - Ess_L; - vec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619; - vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON ); - float compensationFactor = Ems_V * Ems_L; - vec3 multiScatter = Fms * compensationFactor; - return singleScatter + multiScatter; -} -#if NUM_RECT_AREA_LIGHTS > 0 - void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - vec3 normal = geometryNormal; - vec3 viewDir = geometryViewDir; - vec3 position = geometryPosition; - vec3 lightPos = rectAreaLight.position; - vec3 halfWidth = rectAreaLight.halfWidth; - vec3 halfHeight = rectAreaLight.halfHeight; - vec3 lightColor = rectAreaLight.color; - float roughness = material.roughness; - vec3 rectCoords[ 4 ]; - rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight; - rectCoords[ 2 ] = lightPos - halfWidth + halfHeight; - rectCoords[ 3 ] = lightPos + halfWidth + halfHeight; - vec2 uv = LTC_Uv( normal, viewDir, roughness ); - vec4 t1 = texture2D( ltc_1, uv ); - vec4 t2 = texture2D( ltc_2, uv ); - mat3 mInv = mat3( - vec3( t1.x, 0, t1.y ), - vec3( 0, 1, 0 ), - vec3( t1.z, 0, t1.w ) - ); - vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y ); - reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); - reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); - } -#endif -void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - #ifdef USE_CLEARCOAT - float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) ); - vec3 ccIrradiance = dotNLcc * directLight.color; - clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material ); - #endif - #ifdef USE_SHEEN - sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness ); - #endif - reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material ); - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) { - #ifdef USE_CLEARCOAT - clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); - #endif - #ifdef USE_SHEEN - sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ); - #endif - vec3 singleScattering = vec3( 0.0 ); - vec3 multiScattering = vec3( 0.0 ); - vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI; - #ifdef USE_IRIDESCENCE - computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering ); - #else - computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering ); - #endif - vec3 totalScattering = singleScattering + multiScattering; - vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) ); - reflectedLight.indirectSpecular += radiance * singleScattering; - reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance; - reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance; -} -#define RE_Direct RE_Direct_Physical -#define RE_Direct_RectArea RE_Direct_RectArea_Physical -#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical -#define RE_IndirectSpecular RE_IndirectSpecular_Physical -float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { - return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,Lf=` -vec3 geometryPosition = - vViewPosition; -vec3 geometryNormal = normal; -vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); -vec3 geometryClearcoatNormal = vec3( 0.0 ); -#ifdef USE_CLEARCOAT - geometryClearcoatNormal = clearcoatNormal; -#endif -#ifdef USE_IRIDESCENCE - float dotNVi = saturate( dot( normal, geometryViewDir ) ); - if ( material.iridescenceThickness == 0.0 ) { - material.iridescence = 0.0; - } else { - material.iridescence = saturate( material.iridescence ); - } - if ( material.iridescence > 0.0 ) { - material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor ); - material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi ); - } -#endif -IncidentLight directLight; -#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) - PointLight pointLight; - #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0 - PointLightShadow pointLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { - pointLight = pointLights[ i ]; - getPointLightInfo( pointLight, geometryPosition, directLight ); - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) - pointLightShadow = pointLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) - SpotLight spotLight; - vec4 spotColor; - vec3 spotLightCoord; - bool inSpotLightMap; - #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0 - SpotLightShadow spotLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { - spotLight = spotLights[ i ]; - getSpotLightInfo( spotLight, geometryPosition, directLight ); - #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) - #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX - #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS - #else - #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) - #endif - #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS ) - spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w; - inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) ); - spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy ); - directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color; - #endif - #undef SPOT_LIGHT_MAP_INDEX - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - spotLightShadow = spotLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) - DirectionalLight directionalLight; - #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0 - DirectionalLightShadow directionalLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { - directionalLight = directionalLights[ i ]; - getDirectionalLightInfo( directionalLight, directLight ); - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) - directionalLightShadow = directionalLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) - RectAreaLight rectAreaLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { - rectAreaLight = rectAreaLights[ i ]; - RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if defined( RE_IndirectDiffuse ) - vec3 iblIrradiance = vec3( 0.0 ); - vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); - #if defined( USE_LIGHT_PROBES ) - irradiance += getLightProbeIrradiance( lightProbe, geometryNormal ); - #endif - #if ( NUM_HEMI_LIGHTS > 0 ) - #pragma unroll_loop_start - for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { - irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal ); - } - #pragma unroll_loop_end - #endif -#endif -#if defined( RE_IndirectSpecular ) - vec3 radiance = vec3( 0.0 ); - vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,If=`#if defined( RE_IndirectDiffuse ) - #ifdef USE_LIGHTMAP - vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); - vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; - irradiance += lightMapIrradiance; - #endif - #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV ) - iblIrradiance += getIBLIrradiance( geometryNormal ); - #endif -#endif -#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) - #ifdef USE_ANISOTROPY - radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy ); - #else - radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness ); - #endif - #ifdef USE_CLEARCOAT - clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); - #endif -#endif`,Uf=`#if defined( RE_IndirectDiffuse ) - RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif -#if defined( RE_IndirectSpecular ) - RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`,Nf=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) - gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`,Ff=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) - uniform float logDepthBufFC; - varying float vFragDepth; - varying float vIsPerspective; -#endif`,Of=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER - varying float vFragDepth; - varying float vIsPerspective; -#endif`,Bf=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER - vFragDepth = 1.0 + gl_Position.w; - vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`,zf=`#ifdef USE_MAP - vec4 sampledDiffuseColor = texture2D( map, vMapUv ); - #ifdef DECODE_VIDEO_TEXTURE - sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); - #endif - diffuseColor *= sampledDiffuseColor; -#endif`,Vf=`#ifdef USE_MAP - uniform sampler2D map; -#endif`,Gf=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) - #if defined( USE_POINTS_UV ) - vec2 uv = vUv; - #else - vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; - #endif -#endif -#ifdef USE_MAP - diffuseColor *= texture2D( map, uv ); -#endif -#ifdef USE_ALPHAMAP - diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,kf=`#if defined( USE_POINTS_UV ) - varying vec2 vUv; -#else - #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) - uniform mat3 uvTransform; - #endif -#endif -#ifdef USE_MAP - uniform sampler2D map; -#endif -#ifdef USE_ALPHAMAP - uniform sampler2D alphaMap; -#endif`,Hf=`float metalnessFactor = metalness; -#ifdef USE_METALNESSMAP - vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); - metalnessFactor *= texelMetalness.b; -#endif`,Wf=`#ifdef USE_METALNESSMAP - uniform sampler2D metalnessMap; -#endif`,Xf=`#ifdef USE_INSTANCING_MORPH - float morphTargetInfluences[ MORPHTARGETS_COUNT ]; - float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; - } -#endif`,qf=`#if defined( USE_MORPHCOLORS ) - vColor *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - #if defined( USE_COLOR_ALPHA ) - if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ]; - #elif defined( USE_COLOR ) - if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; - #endif - } -#endif`,Yf=`#ifdef USE_MORPHNORMALS - objectNormal *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; - } -#endif`,Zf=`#ifdef USE_MORPHTARGETS - #ifndef USE_INSTANCING_MORPH - uniform float morphTargetBaseInfluence; - uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; - #endif - uniform sampler2DArray morphTargetsTexture; - uniform ivec2 morphTargetsTextureSize; - vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) { - int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset; - int y = texelIndex / morphTargetsTextureSize.x; - int x = texelIndex - y * morphTargetsTextureSize.x; - ivec3 morphUV = ivec3( x, y, morphTargetIndex ); - return texelFetch( morphTargetsTexture, morphUV, 0 ); - } -#endif`,Kf=`#ifdef USE_MORPHTARGETS - transformed *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; - } -#endif`,jf=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; -#ifdef FLAT_SHADED - vec3 fdx = dFdx( vViewPosition ); - vec3 fdy = dFdy( vViewPosition ); - vec3 normal = normalize( cross( fdx, fdy ) ); -#else - vec3 normal = normalize( vNormal ); - #ifdef DOUBLE_SIDED - normal *= faceDirection; - #endif -#endif -#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) - #ifdef USE_TANGENT - mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - #else - mat3 tbn = getTangentFrame( - vViewPosition, normal, - #if defined( USE_NORMALMAP ) - vNormalMapUv - #elif defined( USE_CLEARCOAT_NORMALMAP ) - vClearcoatNormalMapUv - #else - vUv - #endif - ); - #endif - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - tbn[0] *= faceDirection; - tbn[1] *= faceDirection; - #endif -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - #ifdef USE_TANGENT - mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - #else - mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv ); - #endif - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - tbn2[0] *= faceDirection; - tbn2[1] *= faceDirection; - #endif -#endif -vec3 nonPerturbedNormal = normal;`,Jf=`#ifdef USE_NORMALMAP_OBJECTSPACE - normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; - #ifdef FLIP_SIDED - normal = - normal; - #endif - #ifdef DOUBLE_SIDED - normal = normal * faceDirection; - #endif - normal = normalize( normalMatrix * normal ); -#elif defined( USE_NORMALMAP_TANGENTSPACE ) - vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; - mapN.xy *= normalScale; - normal = normalize( tbn * mapN ); -#elif defined( USE_BUMPMAP ) - normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`,$f=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`,Qf=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`,td=`#ifndef FLAT_SHADED - vNormal = normalize( transformedNormal ); - #ifdef USE_TANGENT - vTangent = normalize( transformedTangent ); - vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); - #endif -#endif`,ed=`#ifdef USE_NORMALMAP - uniform sampler2D normalMap; - uniform vec2 normalScale; -#endif -#ifdef USE_NORMALMAP_OBJECTSPACE - uniform mat3 normalMatrix; -#endif -#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) ) - mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) { - vec3 q0 = dFdx( eye_pos.xyz ); - vec3 q1 = dFdy( eye_pos.xyz ); - vec2 st0 = dFdx( uv.st ); - vec2 st1 = dFdy( uv.st ); - vec3 N = surf_norm; - vec3 q1perp = cross( q1, N ); - vec3 q0perp = cross( N, q0 ); - vec3 T = q1perp * st0.x + q0perp * st1.x; - vec3 B = q1perp * st0.y + q0perp * st1.y; - float det = max( dot( T, T ), dot( B, B ) ); - float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); - return mat3( T * scale, B * scale, N ); - } -#endif`,nd=`#ifdef USE_CLEARCOAT - vec3 clearcoatNormal = nonPerturbedNormal; -#endif`,id=`#ifdef USE_CLEARCOAT_NORMALMAP - vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; - clearcoatMapN.xy *= clearcoatNormalScale; - clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`,sd=`#ifdef USE_CLEARCOATMAP - uniform sampler2D clearcoatMap; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - uniform sampler2D clearcoatNormalMap; - uniform vec2 clearcoatNormalScale; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - uniform sampler2D clearcoatRoughnessMap; -#endif`,rd=`#ifdef USE_IRIDESCENCEMAP - uniform sampler2D iridescenceMap; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - uniform sampler2D iridescenceThicknessMap; -#endif`,ad=`#ifdef OPAQUE -diffuseColor.a = 1.0; -#endif -#ifdef USE_TRANSMISSION -diffuseColor.a *= material.transmissionAlpha; -#endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,od=`vec3 packNormalToRGB( const in vec3 normal ) { - return normalize( normal ) * 0.5 + 0.5; -} -vec3 unpackRGBToNormal( const in vec3 rgb ) { - return 2.0 * rgb.xyz - 1.0; -} -const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.; -const float Inv255 = 1. / 255.; -const vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 ); -const vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g ); -const vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b ); -const vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a ); -vec4 packDepthToRGBA( const in float v ) { - if( v <= 0.0 ) - return vec4( 0., 0., 0., 0. ); - if( v >= 1.0 ) - return vec4( 1., 1., 1., 1. ); - float vuf; - float af = modf( v * PackFactors.a, vuf ); - float bf = modf( vuf * ShiftRight8, vuf ); - float gf = modf( vuf * ShiftRight8, vuf ); - return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af ); -} -vec3 packDepthToRGB( const in float v ) { - if( v <= 0.0 ) - return vec3( 0., 0., 0. ); - if( v >= 1.0 ) - return vec3( 1., 1., 1. ); - float vuf; - float bf = modf( v * PackFactors.b, vuf ); - float gf = modf( vuf * ShiftRight8, vuf ); - return vec3( vuf * Inv255, gf * PackUpscale, bf ); -} -vec2 packDepthToRG( const in float v ) { - if( v <= 0.0 ) - return vec2( 0., 0. ); - if( v >= 1.0 ) - return vec2( 1., 1. ); - float vuf; - float gf = modf( v * 256., vuf ); - return vec2( vuf * Inv255, gf ); -} -float unpackRGBAToDepth( const in vec4 v ) { - return dot( v, UnpackFactors4 ); -} -float unpackRGBToDepth( const in vec3 v ) { - return dot( v, UnpackFactors3 ); -} -float unpackRGToDepth( const in vec2 v ) { - return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g; -} -vec4 pack2HalfToRGBA( const in vec2 v ) { - vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) ); - return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w ); -} -vec2 unpackRGBATo2Half( const in vec4 v ) { - return vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) ); -} -float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { - return ( viewZ + near ) / ( near - far ); -} -float orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) { - return depth * ( near - far ) - near; -} -float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { - return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ ); -} -float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { - return ( near * far ) / ( ( far - near ) * depth - far ); -}`,cd=`#ifdef PREMULTIPLIED_ALPHA - gl_FragColor.rgb *= gl_FragColor.a; -#endif`,ld=`vec4 mvPosition = vec4( transformed, 1.0 ); -#ifdef USE_BATCHING - mvPosition = batchingMatrix * mvPosition; -#endif -#ifdef USE_INSTANCING - mvPosition = instanceMatrix * mvPosition; -#endif -mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,hd=`#ifdef DITHERING - gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,ud=`#ifdef DITHERING - vec3 dithering( vec3 color ) { - float grid_position = rand( gl_FragCoord.xy ); - vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); - dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); - return color + dither_shift_RGB; - } -#endif`,fd=`float roughnessFactor = roughness; -#ifdef USE_ROUGHNESSMAP - vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); - roughnessFactor *= texelRoughness.g; -#endif`,dd=`#ifdef USE_ROUGHNESSMAP - uniform sampler2D roughnessMap; -#endif`,pd=`#if NUM_SPOT_LIGHT_COORDS > 0 - varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; -#endif -#if NUM_SPOT_LIGHT_MAPS > 0 - uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ]; -#endif -#ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; - varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; - struct DirectionalLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ]; - struct SpotLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ]; - varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; - struct PointLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - float shadowCameraNear; - float shadowCameraFar; - }; - uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; - #endif - float texture2DCompare( sampler2D depths, vec2 uv, float compare ) { - float depth = unpackRGBAToDepth( texture2D( depths, uv ) ); - #ifdef USE_REVERSED_DEPTH_BUFFER - return step( depth, compare ); - #else - return step( compare, depth ); - #endif - } - vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) { - return unpackRGBATo2Half( texture2D( shadow, uv ) ); - } - float VSMShadow( sampler2D shadow, vec2 uv, float compare ) { - float occlusion = 1.0; - vec2 distribution = texture2DDistribution( shadow, uv ); - #ifdef USE_REVERSED_DEPTH_BUFFER - float hard_shadow = step( distribution.x, compare ); - #else - float hard_shadow = step( compare, distribution.x ); - #endif - if ( hard_shadow != 1.0 ) { - float distance = compare - distribution.x; - float variance = max( 0.00000, distribution.y * distribution.y ); - float softness_probability = variance / (variance + distance * distance ); softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 ); - } - return occlusion; - } - float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) { - float shadow = 1.0; - shadowCoord.xyz /= shadowCoord.w; - shadowCoord.z += shadowBias; - bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; - bool frustumTest = inFrustum && shadowCoord.z <= 1.0; - if ( frustumTest ) { - #if defined( SHADOWMAP_TYPE_PCF ) - vec2 texelSize = vec2( 1.0 ) / shadowMapSize; - float dx0 = - texelSize.x * shadowRadius; - float dy0 = - texelSize.y * shadowRadius; - float dx1 = + texelSize.x * shadowRadius; - float dy1 = + texelSize.y * shadowRadius; - float dx2 = dx0 / 2.0; - float dy2 = dy0 / 2.0; - float dx3 = dx1 / 2.0; - float dy3 = dy1 / 2.0; - shadow = ( - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) - ) * ( 1.0 / 17.0 ); - #elif defined( SHADOWMAP_TYPE_PCF_SOFT ) - vec2 texelSize = vec2( 1.0 ) / shadowMapSize; - float dx = texelSize.x; - float dy = texelSize.y; - vec2 uv = shadowCoord.xy; - vec2 f = fract( uv * shadowMapSize + 0.5 ); - uv -= f * texelSize; - shadow = ( - texture2DCompare( shadowMap, uv, shadowCoord.z ) + - texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) + - texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) + - mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ), - f.x ) + - mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ), - f.x ) + - mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ), - f.y ) + - mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ), - f.y ) + - mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ), - f.x ), - mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ), - f.x ), - f.y ) - ) * ( 1.0 / 9.0 ); - #elif defined( SHADOWMAP_TYPE_VSM ) - shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z ); - #else - shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ); - #endif - } - return mix( 1.0, shadow, shadowIntensity ); - } - vec2 cubeToUV( vec3 v, float texelSizeY ) { - vec3 absV = abs( v ); - float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) ); - absV *= scaleToCube; - v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY ); - vec2 planar = v.xy; - float almostATexel = 1.5 * texelSizeY; - float almostOne = 1.0 - almostATexel; - if ( absV.z >= almostOne ) { - if ( v.z > 0.0 ) - planar.x = 4.0 - v.x; - } else if ( absV.x >= almostOne ) { - float signX = sign( v.x ); - planar.x = v.z * signX + 2.0 * signX; - } else if ( absV.y >= almostOne ) { - float signY = sign( v.y ); - planar.x = v.x + 2.0 * signY + 2.0; - planar.y = v.z * signY - 2.0; - } - return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 ); - } - float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { - float shadow = 1.0; - vec3 lightToPosition = shadowCoord.xyz; - - float lightToPositionLength = length( lightToPosition ); - if ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) { - float dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); dp += shadowBias; - vec3 bd3D = normalize( lightToPosition ); - vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) ); - #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM ) - vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y; - shadow = ( - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp ) - ) * ( 1.0 / 9.0 ); - #else - shadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); - #endif - } - return mix( 1.0, shadow, shadowIntensity ); - } -#endif`,md=`#if NUM_SPOT_LIGHT_COORDS > 0 - uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; - varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; -#endif -#ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ]; - varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; - struct DirectionalLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - struct SpotLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ]; - varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; - struct PointLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - float shadowCameraNear; - float shadowCameraFar; - }; - uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; - #endif -#endif`,xd=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) - vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); - vec4 shadowWorldPosition; -#endif -#if defined( USE_SHADOWMAP ) - #if NUM_DIR_LIGHT_SHADOWS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { - shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 ); - vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { - shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 ); - vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end - #endif -#endif -#if NUM_SPOT_LIGHT_COORDS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) { - shadowWorldPosition = worldPosition; - #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias; - #endif - vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end -#endif`,gd=`float getShadowMask() { - float shadow = 1.0; - #ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - DirectionalLightShadow directionalLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { - directionalLight = directionalLightShadows[ i ]; - shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - } - #pragma unroll_loop_end - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - SpotLightShadow spotLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) { - spotLight = spotLightShadows[ i ]; - shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - } - #pragma unroll_loop_end - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - PointLightShadow pointLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { - pointLight = pointLightShadows[ i ]; - shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; - } - #pragma unroll_loop_end - #endif - #endif - return shadow; -}`,_d=`#ifdef USE_SKINNING - mat4 boneMatX = getBoneMatrix( skinIndex.x ); - mat4 boneMatY = getBoneMatrix( skinIndex.y ); - mat4 boneMatZ = getBoneMatrix( skinIndex.z ); - mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,vd=`#ifdef USE_SKINNING - uniform mat4 bindMatrix; - uniform mat4 bindMatrixInverse; - uniform highp sampler2D boneTexture; - mat4 getBoneMatrix( const in float i ) { - int size = textureSize( boneTexture, 0 ).x; - int j = int( i ) * 4; - int x = j % size; - int y = j / size; - vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 ); - vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 ); - vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 ); - vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); - return mat4( v1, v2, v3, v4 ); - } -#endif`,Md=`#ifdef USE_SKINNING - vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); - vec4 skinned = vec4( 0.0 ); - skinned += boneMatX * skinVertex * skinWeight.x; - skinned += boneMatY * skinVertex * skinWeight.y; - skinned += boneMatZ * skinVertex * skinWeight.z; - skinned += boneMatW * skinVertex * skinWeight.w; - transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,Sd=`#ifdef USE_SKINNING - mat4 skinMatrix = mat4( 0.0 ); - skinMatrix += skinWeight.x * boneMatX; - skinMatrix += skinWeight.y * boneMatY; - skinMatrix += skinWeight.z * boneMatZ; - skinMatrix += skinWeight.w * boneMatW; - skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; - objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; - #ifdef USE_TANGENT - objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; - #endif -#endif`,yd=`float specularStrength; -#ifdef USE_SPECULARMAP - vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); - specularStrength = texelSpecular.r; -#else - specularStrength = 1.0; -#endif`,bd=`#ifdef USE_SPECULARMAP - uniform sampler2D specularMap; -#endif`,Ed=`#if defined( TONE_MAPPING ) - gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,Td=`#ifndef saturate -#define saturate( a ) clamp( a, 0.0, 1.0 ) -#endif -uniform float toneMappingExposure; -vec3 LinearToneMapping( vec3 color ) { - return saturate( toneMappingExposure * color ); -} -vec3 ReinhardToneMapping( vec3 color ) { - color *= toneMappingExposure; - return saturate( color / ( vec3( 1.0 ) + color ) ); -} -vec3 CineonToneMapping( vec3 color ) { - color *= toneMappingExposure; - color = max( vec3( 0.0 ), color - 0.004 ); - return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) ); -} -vec3 RRTAndODTFit( vec3 v ) { - vec3 a = v * ( v + 0.0245786 ) - 0.000090537; - vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081; - return a / b; -} -vec3 ACESFilmicToneMapping( vec3 color ) { - const mat3 ACESInputMat = mat3( - vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ), - vec3( 0.04823, 0.01566, 0.83777 ) - ); - const mat3 ACESOutputMat = mat3( - vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ), - vec3( -0.07367, -0.00605, 1.07602 ) - ); - color *= toneMappingExposure / 0.6; - color = ACESInputMat * color; - color = RRTAndODTFit( color ); - color = ACESOutputMat * color; - return saturate( color ); -} -const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( - vec3( 1.6605, - 0.1246, - 0.0182 ), - vec3( - 0.5876, 1.1329, - 0.1006 ), - vec3( - 0.0728, - 0.0083, 1.1187 ) -); -const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( - vec3( 0.6274, 0.0691, 0.0164 ), - vec3( 0.3293, 0.9195, 0.0880 ), - vec3( 0.0433, 0.0113, 0.8956 ) -); -vec3 agxDefaultContrastApprox( vec3 x ) { - vec3 x2 = x * x; - vec3 x4 = x2 * x2; - return + 15.5 * x4 * x2 - - 40.14 * x4 * x - + 31.96 * x4 - - 6.868 * x2 * x - + 0.4298 * x2 - + 0.1191 * x - - 0.00232; -} -vec3 AgXToneMapping( vec3 color ) { - const mat3 AgXInsetMatrix = mat3( - vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), - vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), - vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) - ); - const mat3 AgXOutsetMatrix = mat3( - vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), - vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), - vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) - ); - const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069; - color *= toneMappingExposure; - color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; - color = AgXInsetMatrix * color; - color = max( color, 1e-10 ); color = log2( color ); - color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); - color = clamp( color, 0.0, 1.0 ); - color = agxDefaultContrastApprox( color ); - color = AgXOutsetMatrix * color; - color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) ); - color = LINEAR_REC2020_TO_LINEAR_SRGB * color; - color = clamp( color, 0.0, 1.0 ); - return color; -} -vec3 NeutralToneMapping( vec3 color ) { - const float StartCompression = 0.8 - 0.04; - const float Desaturation = 0.15; - color *= toneMappingExposure; - float x = min( color.r, min( color.g, color.b ) ); - float offset = x < 0.08 ? x - 6.25 * x * x : 0.04; - color -= offset; - float peak = max( color.r, max( color.g, color.b ) ); - if ( peak < StartCompression ) return color; - float d = 1. - StartCompression; - float newPeak = 1. - d * d / ( peak + d - StartCompression ); - color *= newPeak / peak; - float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); - return mix( color, vec3( newPeak ), g ); -} -vec3 CustomToneMapping( vec3 color ) { return color; }`,Ad=`#ifdef USE_TRANSMISSION - material.transmission = transmission; - material.transmissionAlpha = 1.0; - material.thickness = thickness; - material.attenuationDistance = attenuationDistance; - material.attenuationColor = attenuationColor; - #ifdef USE_TRANSMISSIONMAP - material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; - #endif - #ifdef USE_THICKNESSMAP - material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; - #endif - vec3 pos = vWorldPosition; - vec3 v = normalize( cameraPosition - pos ); - vec3 n = inverseTransformDirection( normal, viewMatrix ); - vec4 transmitted = getIBLVolumeRefraction( - n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness, - material.attenuationColor, material.attenuationDistance ); - material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); - totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,wd=`#ifdef USE_TRANSMISSION - uniform float transmission; - uniform float thickness; - uniform float attenuationDistance; - uniform vec3 attenuationColor; - #ifdef USE_TRANSMISSIONMAP - uniform sampler2D transmissionMap; - #endif - #ifdef USE_THICKNESSMAP - uniform sampler2D thicknessMap; - #endif - uniform vec2 transmissionSamplerSize; - uniform sampler2D transmissionSamplerMap; - uniform mat4 modelMatrix; - uniform mat4 projectionMatrix; - varying vec3 vWorldPosition; - float w0( float a ) { - return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); - } - float w1( float a ) { - return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); - } - float w2( float a ){ - return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); - } - float w3( float a ) { - return ( 1.0 / 6.0 ) * ( a * a * a ); - } - float g0( float a ) { - return w0( a ) + w1( a ); - } - float g1( float a ) { - return w2( a ) + w3( a ); - } - float h0( float a ) { - return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); - } - float h1( float a ) { - return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); - } - vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) { - uv = uv * texelSize.zw + 0.5; - vec2 iuv = floor( uv ); - vec2 fuv = fract( uv ); - float g0x = g0( fuv.x ); - float g1x = g1( fuv.x ); - float h0x = h0( fuv.x ); - float h1x = h1( fuv.x ); - float h0y = h0( fuv.y ); - float h1y = h1( fuv.y ); - vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + - g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); - } - vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { - vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); - vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); - vec2 fLodSizeInv = 1.0 / fLodSize; - vec2 cLodSizeInv = 1.0 / cLodSize; - vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) ); - vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) ); - return mix( fSample, cSample, fract( lod ) ); - } - vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { - vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); - vec3 modelScale; - modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); - modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); - modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); - return normalize( refractionVector ) * thickness * modelScale; - } - float applyIorToRoughness( const in float roughness, const in float ior ) { - return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); - } - vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { - float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); - return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); - } - vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { - if ( isinf( attenuationDistance ) ) { - return vec3( 1.0 ); - } else { - vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; - vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance; - } - } - vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, - const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, - const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness, - const in vec3 attenuationColor, const in float attenuationDistance ) { - vec4 transmittedLight; - vec3 transmittance; - #ifdef USE_DISPERSION - float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion; - vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread ); - for ( int i = 0; i < 3; i ++ ) { - vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix ); - vec3 refractedRayExit = position + transmissionRay; - vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - vec2 refractionCoords = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] ); - transmittedLight[ i ] = transmissionSample[ i ]; - transmittedLight.a += transmissionSample.a; - transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ]; - } - transmittedLight.a /= 3.0; - #else - vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); - vec3 refractedRayExit = position + transmissionRay; - vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - vec2 refractionCoords = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); - transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ); - #endif - vec3 attenuatedColor = transmittance * transmittedLight.rgb; - vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); - float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; - return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); - } -#endif`,Rd=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - varying vec2 vUv; -#endif -#ifdef USE_MAP - varying vec2 vMapUv; -#endif -#ifdef USE_ALPHAMAP - varying vec2 vAlphaMapUv; -#endif -#ifdef USE_LIGHTMAP - varying vec2 vLightMapUv; -#endif -#ifdef USE_AOMAP - varying vec2 vAoMapUv; -#endif -#ifdef USE_BUMPMAP - varying vec2 vBumpMapUv; -#endif -#ifdef USE_NORMALMAP - varying vec2 vNormalMapUv; -#endif -#ifdef USE_EMISSIVEMAP - varying vec2 vEmissiveMapUv; -#endif -#ifdef USE_METALNESSMAP - varying vec2 vMetalnessMapUv; -#endif -#ifdef USE_ROUGHNESSMAP - varying vec2 vRoughnessMapUv; -#endif -#ifdef USE_ANISOTROPYMAP - varying vec2 vAnisotropyMapUv; -#endif -#ifdef USE_CLEARCOATMAP - varying vec2 vClearcoatMapUv; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - varying vec2 vClearcoatNormalMapUv; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - varying vec2 vClearcoatRoughnessMapUv; -#endif -#ifdef USE_IRIDESCENCEMAP - varying vec2 vIridescenceMapUv; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - varying vec2 vIridescenceThicknessMapUv; -#endif -#ifdef USE_SHEEN_COLORMAP - varying vec2 vSheenColorMapUv; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - varying vec2 vSheenRoughnessMapUv; -#endif -#ifdef USE_SPECULARMAP - varying vec2 vSpecularMapUv; -#endif -#ifdef USE_SPECULAR_COLORMAP - varying vec2 vSpecularColorMapUv; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - varying vec2 vSpecularIntensityMapUv; -#endif -#ifdef USE_TRANSMISSIONMAP - uniform mat3 transmissionMapTransform; - varying vec2 vTransmissionMapUv; -#endif -#ifdef USE_THICKNESSMAP - uniform mat3 thicknessMapTransform; - varying vec2 vThicknessMapUv; -#endif`,Cd=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - varying vec2 vUv; -#endif -#ifdef USE_MAP - uniform mat3 mapTransform; - varying vec2 vMapUv; -#endif -#ifdef USE_ALPHAMAP - uniform mat3 alphaMapTransform; - varying vec2 vAlphaMapUv; -#endif -#ifdef USE_LIGHTMAP - uniform mat3 lightMapTransform; - varying vec2 vLightMapUv; -#endif -#ifdef USE_AOMAP - uniform mat3 aoMapTransform; - varying vec2 vAoMapUv; -#endif -#ifdef USE_BUMPMAP - uniform mat3 bumpMapTransform; - varying vec2 vBumpMapUv; -#endif -#ifdef USE_NORMALMAP - uniform mat3 normalMapTransform; - varying vec2 vNormalMapUv; -#endif -#ifdef USE_DISPLACEMENTMAP - uniform mat3 displacementMapTransform; - varying vec2 vDisplacementMapUv; -#endif -#ifdef USE_EMISSIVEMAP - uniform mat3 emissiveMapTransform; - varying vec2 vEmissiveMapUv; -#endif -#ifdef USE_METALNESSMAP - uniform mat3 metalnessMapTransform; - varying vec2 vMetalnessMapUv; -#endif -#ifdef USE_ROUGHNESSMAP - uniform mat3 roughnessMapTransform; - varying vec2 vRoughnessMapUv; -#endif -#ifdef USE_ANISOTROPYMAP - uniform mat3 anisotropyMapTransform; - varying vec2 vAnisotropyMapUv; -#endif -#ifdef USE_CLEARCOATMAP - uniform mat3 clearcoatMapTransform; - varying vec2 vClearcoatMapUv; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - uniform mat3 clearcoatNormalMapTransform; - varying vec2 vClearcoatNormalMapUv; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - uniform mat3 clearcoatRoughnessMapTransform; - varying vec2 vClearcoatRoughnessMapUv; -#endif -#ifdef USE_SHEEN_COLORMAP - uniform mat3 sheenColorMapTransform; - varying vec2 vSheenColorMapUv; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - uniform mat3 sheenRoughnessMapTransform; - varying vec2 vSheenRoughnessMapUv; -#endif -#ifdef USE_IRIDESCENCEMAP - uniform mat3 iridescenceMapTransform; - varying vec2 vIridescenceMapUv; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - uniform mat3 iridescenceThicknessMapTransform; - varying vec2 vIridescenceThicknessMapUv; -#endif -#ifdef USE_SPECULARMAP - uniform mat3 specularMapTransform; - varying vec2 vSpecularMapUv; -#endif -#ifdef USE_SPECULAR_COLORMAP - uniform mat3 specularColorMapTransform; - varying vec2 vSpecularColorMapUv; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - uniform mat3 specularIntensityMapTransform; - varying vec2 vSpecularIntensityMapUv; -#endif -#ifdef USE_TRANSMISSIONMAP - uniform mat3 transmissionMapTransform; - varying vec2 vTransmissionMapUv; -#endif -#ifdef USE_THICKNESSMAP - uniform mat3 thicknessMapTransform; - varying vec2 vThicknessMapUv; -#endif`,Pd=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - vUv = vec3( uv, 1 ).xy; -#endif -#ifdef USE_MAP - vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ALPHAMAP - vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_LIGHTMAP - vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_AOMAP - vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_BUMPMAP - vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_NORMALMAP - vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_DISPLACEMENTMAP - vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_EMISSIVEMAP - vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_METALNESSMAP - vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ROUGHNESSMAP - vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ANISOTROPYMAP - vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOATMAP - vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_IRIDESCENCEMAP - vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SHEEN_COLORMAP - vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULARMAP - vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULAR_COLORMAP - vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_TRANSMISSIONMAP - vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_THICKNESSMAP - vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,Dd=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 - vec4 worldPosition = vec4( transformed, 1.0 ); - #ifdef USE_BATCHING - worldPosition = batchingMatrix * worldPosition; - #endif - #ifdef USE_INSTANCING - worldPosition = instanceMatrix * worldPosition; - #endif - worldPosition = modelMatrix * worldPosition; -#endif`;const Ld=`varying vec2 vUv; -uniform mat3 uvTransform; -void main() { - vUv = ( uvTransform * vec3( uv, 1 ) ).xy; - gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`,Id=`uniform sampler2D t2D; -uniform float backgroundIntensity; -varying vec2 vUv; -void main() { - vec4 texColor = texture2D( t2D, vUv ); - #ifdef DECODE_VIDEO_TEXTURE - texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w ); - #endif - texColor.rgb *= backgroundIntensity; - gl_FragColor = texColor; - #include - #include -}`,Ud=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include - gl_Position.z = gl_Position.w; -}`,Nd=`#ifdef ENVMAP_TYPE_CUBE - uniform samplerCube envMap; -#elif defined( ENVMAP_TYPE_CUBE_UV ) - uniform sampler2D envMap; -#endif -uniform float flipEnvMap; -uniform float backgroundBlurriness; -uniform float backgroundIntensity; -uniform mat3 backgroundRotation; -varying vec3 vWorldDirection; -#include -void main() { - #ifdef ENVMAP_TYPE_CUBE - vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) ); - #elif defined( ENVMAP_TYPE_CUBE_UV ) - vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness ); - #else - vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - #endif - texColor.rgb *= backgroundIntensity; - gl_FragColor = texColor; - #include - #include -}`,Fd=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include - gl_Position.z = gl_Position.w; -}`,Od=`uniform samplerCube tCube; -uniform float tFlip; -uniform float opacity; -varying vec3 vWorldDirection; -void main() { - vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); - gl_FragColor = texColor; - gl_FragColor.a *= opacity; - #include - #include -}`,Bd=`#include -#include -#include -#include -#include -#include -#include -#include -varying vec2 vHighPrecisionZW; -void main() { - #include - #include - #include - #include - #ifdef USE_DISPLACEMENTMAP - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - vHighPrecisionZW = gl_Position.zw; -}`,zd=`#if DEPTH_PACKING == 3200 - uniform float opacity; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -varying vec2 vHighPrecisionZW; -void main() { - vec4 diffuseColor = vec4( 1.0 ); - #include - #if DEPTH_PACKING == 3200 - diffuseColor.a = opacity; - #endif - #include - #include - #include - #include - #include - #ifdef USE_REVERSED_DEPTH_BUFFER - float fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ]; - #else - float fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5; - #endif - #if DEPTH_PACKING == 3200 - gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity ); - #elif DEPTH_PACKING == 3201 - gl_FragColor = packDepthToRGBA( fragCoordZ ); - #elif DEPTH_PACKING == 3202 - gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 ); - #elif DEPTH_PACKING == 3203 - gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); - #endif -}`,Vd=`#define DISTANCE -varying vec3 vWorldPosition; -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #ifdef USE_DISPLACEMENTMAP - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - vWorldPosition = worldPosition.xyz; -}`,Gd=`#define DISTANCE -uniform vec3 referencePosition; -uniform float nearDistance; -uniform float farDistance; -varying vec3 vWorldPosition; -#include -#include -#include -#include -#include -#include -#include -#include -void main () { - vec4 diffuseColor = vec4( 1.0 ); - #include - #include - #include - #include - #include - float dist = length( vWorldPosition - referencePosition ); - dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); - dist = saturate( dist ); - gl_FragColor = packDepthToRGBA( dist ); -}`,kd=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include -}`,Hd=`uniform sampler2D tEquirect; -varying vec3 vWorldDirection; -#include -void main() { - vec3 direction = normalize( vWorldDirection ); - vec2 sampleUV = equirectUv( direction ); - gl_FragColor = texture2D( tEquirect, sampleUV ); - #include - #include -}`,Wd=`uniform float scale; -attribute float lineDistance; -varying float vLineDistance; -#include -#include -#include -#include -#include -#include -#include -void main() { - vLineDistance = scale * lineDistance; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,Xd=`uniform vec3 diffuse; -uniform float opacity; -uniform float dashSize; -uniform float totalSize; -varying float vLineDistance; -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - if ( mod( vLineDistance, totalSize ) > dashSize ) { - discard; - } - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include - #include -}`,qd=`#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING ) - #include - #include - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,Yd=`uniform vec3 diffuse; -uniform float opacity; -#ifndef FLAT_SHADED - varying vec3 vNormal; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - #include - #include - #include - #include - #include - #include - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - #ifdef USE_LIGHTMAP - vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); - reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI; - #else - reflectedLight.indirectDiffuse += vec3( 1.0 ); - #endif - #include - reflectedLight.indirectDiffuse *= diffuseColor.rgb; - vec3 outgoingLight = reflectedLight.indirectDiffuse; - #include - #include - #include - #include - #include - #include - #include -}`,Zd=`#define LAMBERT -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include - #include -}`,Kd=`#define LAMBERT -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include - #include -}`,jd=`#define MATCAP -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; -}`,Jd=`#define MATCAP -uniform vec3 diffuse; -uniform float opacity; -uniform sampler2D matcap; -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 viewDir = normalize( vViewPosition ); - vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) ); - vec3 y = cross( viewDir, x ); - vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; - #ifdef USE_MATCAP - vec4 matcapColor = texture2D( matcap, uv ); - #else - vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); - #endif - vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; - #include - #include - #include - #include - #include - #include -}`,$d=`#define NORMAL -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - varying vec3 vViewPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - vViewPosition = - mvPosition.xyz; -#endif -}`,Qd=`#define NORMAL -uniform float opacity; -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - varying vec3 vViewPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity ); - #include - #include - #include - #include - gl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a ); - #ifdef OPAQUE - gl_FragColor.a = 1.0; - #endif -}`,tp=`#define PHONG -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include - #include -}`,ep=`#define PHONG -uniform vec3 diffuse; -uniform vec3 emissive; -uniform vec3 specular; -uniform float shininess; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include - #include -}`,np=`#define STANDARD -varying vec3 vViewPosition; -#ifdef USE_TRANSMISSION - varying vec3 vWorldPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include -#ifdef USE_TRANSMISSION - vWorldPosition = worldPosition.xyz; -#endif -}`,ip=`#define STANDARD -#ifdef PHYSICAL - #define IOR - #define USE_SPECULAR -#endif -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float roughness; -uniform float metalness; -uniform float opacity; -#ifdef IOR - uniform float ior; -#endif -#ifdef USE_SPECULAR - uniform float specularIntensity; - uniform vec3 specularColor; - #ifdef USE_SPECULAR_COLORMAP - uniform sampler2D specularColorMap; - #endif - #ifdef USE_SPECULAR_INTENSITYMAP - uniform sampler2D specularIntensityMap; - #endif -#endif -#ifdef USE_CLEARCOAT - uniform float clearcoat; - uniform float clearcoatRoughness; -#endif -#ifdef USE_DISPERSION - uniform float dispersion; -#endif -#ifdef USE_IRIDESCENCE - uniform float iridescence; - uniform float iridescenceIOR; - uniform float iridescenceThicknessMinimum; - uniform float iridescenceThicknessMaximum; -#endif -#ifdef USE_SHEEN - uniform vec3 sheenColor; - uniform float sheenRoughness; - #ifdef USE_SHEEN_COLORMAP - uniform sampler2D sheenColorMap; - #endif - #ifdef USE_SHEEN_ROUGHNESSMAP - uniform sampler2D sheenRoughnessMap; - #endif -#endif -#ifdef USE_ANISOTROPY - uniform vec2 anisotropyVector; - #ifdef USE_ANISOTROPYMAP - uniform sampler2D anisotropyMap; - #endif -#endif -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; - vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular; - #include - vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance; - #ifdef USE_SHEEN - float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor ); - outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect; - #endif - #ifdef USE_CLEARCOAT - float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) ); - vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc ); - outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat; - #endif - #include - #include - #include - #include - #include - #include -}`,sp=`#define TOON -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include -}`,rp=`#define TOON -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include -}`,ap=`uniform float size; -uniform float scale; -#include -#include -#include -#include -#include -#include -#ifdef USE_POINTS_UV - varying vec2 vUv; - uniform mat3 uvTransform; -#endif -void main() { - #ifdef USE_POINTS_UV - vUv = ( uvTransform * vec3( uv, 1 ) ).xy; - #endif - #include - #include - #include - #include - #include - #include - gl_PointSize = size; - #ifdef USE_SIZEATTENUATION - bool isPerspective = isPerspectiveMatrix( projectionMatrix ); - if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); - #endif - #include - #include - #include - #include -}`,op=`uniform vec3 diffuse; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include - #include -}`,cp=`#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,lp=`uniform vec3 color; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); - #include - #include - #include -}`,hp=`uniform float rotation; -uniform vec2 center; -#include -#include -#include -#include -#include -void main() { - #include - vec4 mvPosition = modelViewMatrix[ 3 ]; - vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) ); - #ifndef USE_SIZEATTENUATION - bool isPerspective = isPerspectiveMatrix( projectionMatrix ); - if ( isPerspective ) scale *= - mvPosition.z; - #endif - vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale; - vec2 rotatedPosition; - rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; - rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; - mvPosition.xy += rotatedPosition; - gl_Position = projectionMatrix * mvPosition; - #include - #include - #include -}`,up=`uniform vec3 diffuse; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include -}`,Wt={alphahash_fragment:Lu,alphahash_pars_fragment:Iu,alphamap_fragment:Uu,alphamap_pars_fragment:Nu,alphatest_fragment:Fu,alphatest_pars_fragment:Ou,aomap_fragment:Bu,aomap_pars_fragment:zu,batching_pars_vertex:Vu,batching_vertex:Gu,begin_vertex:ku,beginnormal_vertex:Hu,bsdfs:Wu,iridescence_fragment:Xu,bumpmap_pars_fragment:qu,clipping_planes_fragment:Yu,clipping_planes_pars_fragment:Zu,clipping_planes_pars_vertex:Ku,clipping_planes_vertex:ju,color_fragment:Ju,color_pars_fragment:$u,color_pars_vertex:Qu,color_vertex:tf,common:ef,cube_uv_reflection_fragment:nf,defaultnormal_vertex:sf,displacementmap_pars_vertex:rf,displacementmap_vertex:af,emissivemap_fragment:of,emissivemap_pars_fragment:cf,colorspace_fragment:lf,colorspace_pars_fragment:hf,envmap_fragment:uf,envmap_common_pars_fragment:ff,envmap_pars_fragment:df,envmap_pars_vertex:pf,envmap_physical_pars_fragment:Tf,envmap_vertex:mf,fog_vertex:xf,fog_pars_vertex:gf,fog_fragment:_f,fog_pars_fragment:vf,gradientmap_pars_fragment:Mf,lightmap_pars_fragment:Sf,lights_lambert_fragment:yf,lights_lambert_pars_fragment:bf,lights_pars_begin:Ef,lights_toon_fragment:Af,lights_toon_pars_fragment:wf,lights_phong_fragment:Rf,lights_phong_pars_fragment:Cf,lights_physical_fragment:Pf,lights_physical_pars_fragment:Df,lights_fragment_begin:Lf,lights_fragment_maps:If,lights_fragment_end:Uf,logdepthbuf_fragment:Nf,logdepthbuf_pars_fragment:Ff,logdepthbuf_pars_vertex:Of,logdepthbuf_vertex:Bf,map_fragment:zf,map_pars_fragment:Vf,map_particle_fragment:Gf,map_particle_pars_fragment:kf,metalnessmap_fragment:Hf,metalnessmap_pars_fragment:Wf,morphinstance_vertex:Xf,morphcolor_vertex:qf,morphnormal_vertex:Yf,morphtarget_pars_vertex:Zf,morphtarget_vertex:Kf,normal_fragment_begin:jf,normal_fragment_maps:Jf,normal_pars_fragment:$f,normal_pars_vertex:Qf,normal_vertex:td,normalmap_pars_fragment:ed,clearcoat_normal_fragment_begin:nd,clearcoat_normal_fragment_maps:id,clearcoat_pars_fragment:sd,iridescence_pars_fragment:rd,opaque_fragment:ad,packing:od,premultiplied_alpha_fragment:cd,project_vertex:ld,dithering_fragment:hd,dithering_pars_fragment:ud,roughnessmap_fragment:fd,roughnessmap_pars_fragment:dd,shadowmap_pars_fragment:pd,shadowmap_pars_vertex:md,shadowmap_vertex:xd,shadowmask_pars_fragment:gd,skinbase_vertex:_d,skinning_pars_vertex:vd,skinning_vertex:Md,skinnormal_vertex:Sd,specularmap_fragment:yd,specularmap_pars_fragment:bd,tonemapping_fragment:Ed,tonemapping_pars_fragment:Td,transmission_fragment:Ad,transmission_pars_fragment:wd,uv_pars_fragment:Rd,uv_pars_vertex:Cd,uv_vertex:Pd,worldpos_vertex:Dd,background_vert:Ld,background_frag:Id,backgroundCube_vert:Ud,backgroundCube_frag:Nd,cube_vert:Fd,cube_frag:Od,depth_vert:Bd,depth_frag:zd,distanceRGBA_vert:Vd,distanceRGBA_frag:Gd,equirect_vert:kd,equirect_frag:Hd,linedashed_vert:Wd,linedashed_frag:Xd,meshbasic_vert:qd,meshbasic_frag:Yd,meshlambert_vert:Zd,meshlambert_frag:Kd,meshmatcap_vert:jd,meshmatcap_frag:Jd,meshnormal_vert:$d,meshnormal_frag:Qd,meshphong_vert:tp,meshphong_frag:ep,meshphysical_vert:np,meshphysical_frag:ip,meshtoon_vert:sp,meshtoon_frag:rp,points_vert:ap,points_frag:op,shadow_vert:cp,shadow_frag:lp,sprite_vert:hp,sprite_frag:up},pt={common:{diffuse:{value:new Yt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ht}},envmap:{envMap:{value:null},envMapRotation:{value:new Ht},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ht}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ht}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ht},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ht},normalScale:{value:new at(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ht},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ht}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ht}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ht}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Yt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Yt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0},uvTransform:{value:new Ht}},sprite:{diffuse:{value:new Yt(16777215)},opacity:{value:1},center:{value:new at(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}}},an={basic:{uniforms:Pe([pt.common,pt.specularmap,pt.envmap,pt.aomap,pt.lightmap,pt.fog]),vertexShader:Wt.meshbasic_vert,fragmentShader:Wt.meshbasic_frag},lambert:{uniforms:Pe([pt.common,pt.specularmap,pt.envmap,pt.aomap,pt.lightmap,pt.emissivemap,pt.bumpmap,pt.normalmap,pt.displacementmap,pt.fog,pt.lights,{emissive:{value:new Yt(0)}}]),vertexShader:Wt.meshlambert_vert,fragmentShader:Wt.meshlambert_frag},phong:{uniforms:Pe([pt.common,pt.specularmap,pt.envmap,pt.aomap,pt.lightmap,pt.emissivemap,pt.bumpmap,pt.normalmap,pt.displacementmap,pt.fog,pt.lights,{emissive:{value:new Yt(0)},specular:{value:new Yt(1118481)},shininess:{value:30}}]),vertexShader:Wt.meshphong_vert,fragmentShader:Wt.meshphong_frag},standard:{uniforms:Pe([pt.common,pt.envmap,pt.aomap,pt.lightmap,pt.emissivemap,pt.bumpmap,pt.normalmap,pt.displacementmap,pt.roughnessmap,pt.metalnessmap,pt.fog,pt.lights,{emissive:{value:new Yt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Wt.meshphysical_vert,fragmentShader:Wt.meshphysical_frag},toon:{uniforms:Pe([pt.common,pt.aomap,pt.lightmap,pt.emissivemap,pt.bumpmap,pt.normalmap,pt.displacementmap,pt.gradientmap,pt.fog,pt.lights,{emissive:{value:new Yt(0)}}]),vertexShader:Wt.meshtoon_vert,fragmentShader:Wt.meshtoon_frag},matcap:{uniforms:Pe([pt.common,pt.bumpmap,pt.normalmap,pt.displacementmap,pt.fog,{matcap:{value:null}}]),vertexShader:Wt.meshmatcap_vert,fragmentShader:Wt.meshmatcap_frag},points:{uniforms:Pe([pt.points,pt.fog]),vertexShader:Wt.points_vert,fragmentShader:Wt.points_frag},dashed:{uniforms:Pe([pt.common,pt.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Wt.linedashed_vert,fragmentShader:Wt.linedashed_frag},depth:{uniforms:Pe([pt.common,pt.displacementmap]),vertexShader:Wt.depth_vert,fragmentShader:Wt.depth_frag},normal:{uniforms:Pe([pt.common,pt.bumpmap,pt.normalmap,pt.displacementmap,{opacity:{value:1}}]),vertexShader:Wt.meshnormal_vert,fragmentShader:Wt.meshnormal_frag},sprite:{uniforms:Pe([pt.sprite,pt.fog]),vertexShader:Wt.sprite_vert,fragmentShader:Wt.sprite_frag},background:{uniforms:{uvTransform:{value:new Ht},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Wt.background_vert,fragmentShader:Wt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ht}},vertexShader:Wt.backgroundCube_vert,fragmentShader:Wt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Wt.cube_vert,fragmentShader:Wt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Wt.equirect_vert,fragmentShader:Wt.equirect_frag},distanceRGBA:{uniforms:Pe([pt.common,pt.displacementmap,{referencePosition:{value:new D},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Wt.distanceRGBA_vert,fragmentShader:Wt.distanceRGBA_frag},shadow:{uniforms:Pe([pt.lights,pt.fog,{color:{value:new Yt(0)},opacity:{value:1}}]),vertexShader:Wt.shadow_vert,fragmentShader:Wt.shadow_frag}};an.physical={uniforms:Pe([an.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ht},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ht},clearcoatNormalScale:{value:new at(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ht},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ht},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ht},sheen:{value:0},sheenColor:{value:new Yt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ht},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ht},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ht},transmissionSamplerSize:{value:new at},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ht},attenuationDistance:{value:0},attenuationColor:{value:new Yt(0)},specularColor:{value:new Yt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ht},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ht},anisotropyVector:{value:new at},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ht}}]),vertexShader:Wt.meshphysical_vert,fragmentShader:Wt.meshphysical_frag};const Ns={r:0,b:0,g:0},Wn=new nn,fp=new re;function dp(i,t,e,n,s,r,a){const o=new Yt(0);let l=r===!0?0:1,c,h,u=null,d=0,p=null;function x(S){let T=S.isScene===!0?S.background:null;return T&&T.isTexture&&(T=(S.backgroundBlurriness>0?e:t).get(T)),T}function _(S){let T=!1;const R=x(S);R===null?f(o,l):R&&R.isColor&&(f(R,1),T=!0);const w=i.xr.getEnvironmentBlendMode();w==="additive"?n.buffers.color.setClear(0,0,0,1,a):w==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(i.autoClear||T)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil))}function m(S,T){const R=x(T);R&&(R.isCubeTexture||R.mapping===Js)?(h===void 0&&(h=new Vt(new oe(1,1,1),new En({name:"BackgroundCubeMaterial",uniforms:Ci(an.backgroundCube.uniforms),vertexShader:an.backgroundCube.vertexShader,fragmentShader:an.backgroundCube.fragmentShader,side:Le,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(w,L,F){this.matrixWorld.copyPosition(F.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),Wn.copy(T.backgroundRotation),Wn.x*=-1,Wn.y*=-1,Wn.z*=-1,R.isCubeTexture&&R.isRenderTargetTexture===!1&&(Wn.y*=-1,Wn.z*=-1),h.material.uniforms.envMap.value=R,h.material.uniforms.flipEnvMap.value=R.isCubeTexture&&R.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=T.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=T.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(fp.makeRotationFromEuler(Wn)),h.material.toneMapped=$t.getTransfer(R.colorSpace)!==ne,(u!==R||d!==R.version||p!==i.toneMapping)&&(h.material.needsUpdate=!0,u=R,d=R.version,p=i.toneMapping),h.layers.enableAll(),S.unshift(h,h.geometry,h.material,0,0,null)):R&&R.isTexture&&(c===void 0&&(c=new Vt(new Nn(2,2),new En({name:"BackgroundMaterial",uniforms:Ci(an.background.uniforms),vertexShader:an.background.vertexShader,fragmentShader:an.background.fragmentShader,side:Fn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=R,c.material.uniforms.backgroundIntensity.value=T.backgroundIntensity,c.material.toneMapped=$t.getTransfer(R.colorSpace)!==ne,R.matrixAutoUpdate===!0&&R.updateMatrix(),c.material.uniforms.uvTransform.value.copy(R.matrix),(u!==R||d!==R.version||p!==i.toneMapping)&&(c.material.needsUpdate=!0,u=R,d=R.version,p=i.toneMapping),c.layers.enableAll(),S.unshift(c,c.geometry,c.material,0,0,null))}function f(S,T){S.getRGB(Ns,zc(i)),n.buffers.color.setClear(Ns.r,Ns.g,Ns.b,T,a)}function b(){h!==void 0&&(h.geometry.dispose(),h.material.dispose(),h=void 0),c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0)}return{getClearColor:function(){return o},setClearColor:function(S,T=1){o.set(S),l=T,f(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(S){l=S,f(o,l)},render:_,addToRenderList:m,dispose:b}}function pp(i,t){const e=i.getParameter(i.MAX_VERTEX_ATTRIBS),n={},s=d(null);let r=s,a=!1;function o(M,P,O,z,k){let W=!1;const Y=u(z,O,P);r!==Y&&(r=Y,c(r.object)),W=p(M,z,O,k),W&&x(M,z,O,k),k!==null&&t.update(k,i.ELEMENT_ARRAY_BUFFER),(W||a)&&(a=!1,T(M,P,O,z),k!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.get(k).buffer))}function l(){return i.createVertexArray()}function c(M){return i.bindVertexArray(M)}function h(M){return i.deleteVertexArray(M)}function u(M,P,O){const z=O.wireframe===!0;let k=n[M.id];k===void 0&&(k={},n[M.id]=k);let W=k[P.id];W===void 0&&(W={},k[P.id]=W);let Y=W[z];return Y===void 0&&(Y=d(l()),W[z]=Y),Y}function d(M){const P=[],O=[],z=[];for(let k=0;k=0){const st=k[X];let St=W[X];if(St===void 0&&(X==="instanceMatrix"&&M.instanceMatrix&&(St=M.instanceMatrix),X==="instanceColor"&&M.instanceColor&&(St=M.instanceColor)),st===void 0||st.attribute!==St||St&&st.data!==St.data)return!0;Y++}return r.attributesNum!==Y||r.index!==z}function x(M,P,O,z){const k={},W=P.attributes;let Y=0;const nt=O.getAttributes();for(const X in nt)if(nt[X].location>=0){let st=W[X];st===void 0&&(X==="instanceMatrix"&&M.instanceMatrix&&(st=M.instanceMatrix),X==="instanceColor"&&M.instanceColor&&(st=M.instanceColor));const St={};St.attribute=st,st&&st.data&&(St.data=st.data),k[X]=St,Y++}r.attributes=k,r.attributesNum=Y,r.index=z}function _(){const M=r.newAttributes;for(let P=0,O=M.length;P=0){let rt=k[nt];if(rt===void 0&&(nt==="instanceMatrix"&&M.instanceMatrix&&(rt=M.instanceMatrix),nt==="instanceColor"&&M.instanceColor&&(rt=M.instanceColor)),rt!==void 0){const st=rt.normalized,St=rt.itemSize,Gt=t.get(rt);if(Gt===void 0)continue;const qt=Gt.buffer,jt=Gt.type,Kt=Gt.bytesPerElement,K=jt===i.INT||jt===i.UNSIGNED_INT||rt.gpuType===Oa;if(rt.isInterleavedBufferAttribute){const J=rt.data,xt=J.stride,Rt=rt.offset;if(J.isInstancedInterleavedBuffer){for(let Tt=0;Tt0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return"highp";L="mediump"}return L==="mediump"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=e.precision!==void 0?e.precision:"highp";const h=l(c);h!==c&&(Bt("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const u=e.logarithmicDepthBuffer===!0,d=e.reversedDepthBuffer===!0&&t.has("EXT_clip_control"),p=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),x=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),_=i.getParameter(i.MAX_TEXTURE_SIZE),m=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),f=i.getParameter(i.MAX_VERTEX_ATTRIBS),b=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),S=i.getParameter(i.MAX_VARYING_VECTORS),T=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),R=x>0,w=i.getParameter(i.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:u,reversedDepthBuffer:d,maxTextures:p,maxVertexTextures:x,maxTextureSize:_,maxCubemapSize:m,maxAttributes:f,maxVertexUniforms:b,maxVaryings:S,maxFragmentUniforms:T,vertexTextures:R,maxSamples:w}}function gp(i){const t=this;let e=null,n=0,s=!1,r=!1;const a=new Dn,o=new Ht,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(u,d){const p=u.length!==0||d||n!==0||s;return s=d,n=u.length,p},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(u,d){e=h(u,d,0)},this.setState=function(u,d,p){const x=u.clippingPlanes,_=u.clipIntersection,m=u.clipShadows,f=i.get(u);if(!s||x===null||x.length===0||r&&!m)r?h(null):c();else{const b=r?0:n,S=b*4;let T=f.clippingState||null;l.value=T,T=h(x,d,S,p);for(let R=0;R!==S;++R)T[R]=e[R];f.clippingState=T,this.numIntersection=_?this.numPlanes:0,this.numPlanes+=b}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(u,d,p,x){const _=u!==null?u.length:0;let m=null;if(_!==0){if(m=l.value,x!==!0||m===null){const f=p+_*4,b=d.matrixWorldInverse;o.getNormalMatrix(b),(m===null||m.length0){const c=new Ph(l.height);return c.fromEquirectangularTexture(i,a),t.set(a,c),a.addEventListener("dispose",s),e(c.texture,a.mapping)}else return null}}return a}function s(a){const o=a.target;o.removeEventListener("dispose",s);const l=t.get(o);l!==void 0&&(t.delete(o),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}const In=4,$o=[.125,.215,.35,.446,.526,.582],Zn=20,vp=256,Xi=new nl,Qo=new Yt;let Ir=null,Ur=0,Nr=0,Fr=!1;const Mp=new D;class Ia{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(t,e=0,n=.1,s=100,r={}){const{size:a=256,position:o=Mp}=r;Ir=this._renderer.getRenderTarget(),Ur=this._renderer.getActiveCubeFace(),Nr=this._renderer.getActiveMipmapLevel(),Fr=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const l=this._allocateTargets();return l.depthBuffer=!0,this._sceneToCubeUV(t,n,s,l,o),e>0&&this._blur(l,0,0,e),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=nc(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=ec(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t2?R:0,R,R),u.setRenderTarget(s),f&&u.render(_,l),u.render(t,l)}u.toneMapping=p,u.autoClear=d,t.background=b}_textureToCubeUV(t,e){const n=this._renderer,s=t.mapping===Ai||t.mapping===wi;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=nc()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=ec());const r=s?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;const o=r.uniforms;o.envMap.value=t;const l=this._cubeSize;gi(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(a,Xi)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;const s=this._lodMeshes.length;for(let r=1;rx-In?n-x+In:0),f=4*(this._cubeSize-_);l.envMap.value=t.texture,l.roughness.value=p,l.mipInt.value=x-e,gi(r,m,f,3*_,2*_),s.setRenderTarget(r),s.render(o,Xi),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=x-n,gi(t,m,f,3*_,2*_),s.setRenderTarget(t),s.render(o,Xi)}_blur(t,e,n,s,r){const a=this._pingPongRenderTarget;this._halfBlur(t,a,e,n,s,"latitudinal",r),this._halfBlur(a,t,n,n,s,"longitudinal",r)}_halfBlur(t,e,n,s,r,a,o){const l=this._renderer,c=this._blurMaterial;a!=="latitudinal"&&a!=="longitudinal"&&de("blur direction must be either latitudinal or longitudinal!");const h=3,u=this._lodMeshes[s];u.material=c;const d=c.uniforms,p=this._sizeLods[n]-1,x=isFinite(r)?Math.PI/(2*p):2*Math.PI/(2*Zn-1),_=r/x,m=isFinite(r)?1+Math.floor(h*_):Zn;m>Zn&&Bt(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${Zn}`);const f=[];let b=0;for(let L=0;LS-In?s-S+In:0),w=4*(this._cubeSize-T);gi(e,R,w,3*T,2*T),l.setRenderTarget(e),l.render(u,Xi)}}function Sp(i){const t=[],e=[],n=[];let s=i;const r=i-In+1+$o.length;for(let a=0;ai-In?l=$o[a-i+In-1]:a===0&&(l=0),e.push(l);const c=1/(o-2),h=-c,u=1+c,d=[h,h,u,h,u,u,h,h,u,u,h,u],p=6,x=6,_=3,m=2,f=1,b=new Float32Array(_*x*p),S=new Float32Array(m*x*p),T=new Float32Array(f*x*p);for(let w=0;w2?0:-1,E=[L,F,0,L+2/3,F,0,L+2/3,F+1,0,L,F,0,L+2/3,F+1,0,L,F+1,0];b.set(E,_*x*w),S.set(d,m*x*w);const M=[w,w,w,w,w,w];T.set(M,f*x*w)}const R=new Ie;R.setAttribute("position",new en(b,_)),R.setAttribute("uv",new en(S,m)),R.setAttribute("faceIndex",new en(T,f)),n.push(new Vt(R,null)),s>In&&s--}return{lodMeshes:n,sizeLods:t,sigmas:e}}function tc(i,t,e){const n=new $n(i,t,e);return n.texture.mapping=Js,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function gi(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function yp(i,t,e){return new En({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:vp,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Qs(),fragmentShader:` - - precision highp float; - precision highp int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - uniform float roughness; - uniform float mipInt; - - #define ENVMAP_TYPE_CUBE_UV - #include - - #define PI 3.14159265359 - - // Van der Corput radical inverse - float radicalInverse_VdC(uint bits) { - bits = (bits << 16u) | (bits >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - return float(bits) * 2.3283064365386963e-10; // / 0x100000000 - } - - // Hammersley sequence - vec2 hammersley(uint i, uint N) { - return vec2(float(i) / float(N), radicalInverse_VdC(i)); - } - - // GGX VNDF importance sampling (Eric Heitz 2018) - // "Sampling the GGX Distribution of Visible Normals" - // https://jcgt.org/published/0007/04/01/ - vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) { - float alpha = roughness * roughness; - - // Section 3.2: Transform view direction to hemisphere configuration - vec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z)); - - // Section 4.1: Orthonormal basis - float lensq = Vh.x * Vh.x + Vh.y * Vh.y; - vec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0); - vec3 T2 = cross(Vh, T1); - - // Section 4.2: Parameterization of projected area - float r = sqrt(Xi.x); - float phi = 2.0 * PI * Xi.y; - float t1 = r * cos(phi); - float t2 = r * sin(phi); - float s = 0.5 * (1.0 + Vh.z); - t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2; - - // Section 4.3: Reprojection onto hemisphere - vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh; - - // Section 3.4: Transform back to ellipsoid configuration - return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z))); - } - - void main() { - vec3 N = normalize(vOutputDirection); - vec3 V = N; // Assume view direction equals normal for pre-filtering - - vec3 prefilteredColor = vec3(0.0); - float totalWeight = 0.0; - - // For very low roughness, just sample the environment directly - if (roughness < 0.001) { - gl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0); - return; - } - - // Tangent space basis for VNDF sampling - vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); - vec3 tangent = normalize(cross(up, N)); - vec3 bitangent = cross(N, tangent); - - for(uint i = 0u; i < uint(GGX_SAMPLES); i++) { - vec2 Xi = hammersley(i, uint(GGX_SAMPLES)); - - // For PMREM, V = N, so in tangent space V is always (0, 0, 1) - vec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness); - - // Transform H back to world space - vec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z); - vec3 L = normalize(2.0 * dot(V, H) * H - V); - - float NdotL = max(dot(N, L), 0.0); - - if(NdotL > 0.0) { - // Sample environment at fixed mip level - // VNDF importance sampling handles the distribution filtering - vec3 sampleColor = bilinearCubeUV(envMap, L, mipInt); - - // Weight by NdotL for the split-sum approximation - // VNDF PDF naturally accounts for the visible microfacet distribution - prefilteredColor += sampleColor * NdotL; - totalWeight += NdotL; - } - } - - if (totalWeight > 0.0) { - prefilteredColor = prefilteredColor / totalWeight; - } - - gl_FragColor = vec4(prefilteredColor, 1.0); - } - `,blending:yn,depthTest:!1,depthWrite:!1})}function bp(i,t,e){const n=new Float32Array(Zn),s=new D(0,1,0);return new En({name:"SphericalGaussianBlur",defines:{n:Zn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:Qs(),fragmentShader:` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - uniform int samples; - uniform float weights[ n ]; - uniform bool latitudinal; - uniform float dTheta; - uniform float mipInt; - uniform vec3 poleAxis; - - #define ENVMAP_TYPE_CUBE_UV - #include - - vec3 getSample( float theta, vec3 axis ) { - - float cosTheta = cos( theta ); - // Rodrigues' axis-angle rotation - vec3 sampleDirection = vOutputDirection * cosTheta - + cross( axis, vOutputDirection ) * sin( theta ) - + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); - - return bilinearCubeUV( envMap, sampleDirection, mipInt ); - - } - - void main() { - - vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); - - if ( all( equal( axis, vec3( 0.0 ) ) ) ) { - - axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); - - } - - axis = normalize( axis ); - - gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); - - for ( int i = 1; i < n; i++ ) { - - if ( i >= samples ) { - - break; - - } - - float theta = dTheta * float( i ); - gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); - gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); - - } - - } - `,blending:yn,depthTest:!1,depthWrite:!1})}function ec(){return new En({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Qs(),fragmentShader:` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - - #include - - void main() { - - vec3 outputDirection = normalize( vOutputDirection ); - vec2 uv = equirectUv( outputDirection ); - - gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); - - } - `,blending:yn,depthTest:!1,depthWrite:!1})}function nc(){return new En({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Qs(),fragmentShader:` - - precision mediump float; - precision mediump int; - - uniform float flipEnvMap; - - varying vec3 vOutputDirection; - - uniform samplerCube envMap; - - void main() { - - gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); - - } - `,blending:yn,depthTest:!1,depthWrite:!1})}function Qs(){return` - - precision mediump float; - precision mediump int; - - attribute float faceIndex; - - varying vec3 vOutputDirection; - - // RH coordinate system; PMREM face-indexing convention - vec3 getDirection( vec2 uv, float face ) { - - uv = 2.0 * uv - 1.0; - - vec3 direction = vec3( uv, 1.0 ); - - if ( face == 0.0 ) { - - direction = direction.zyx; // ( 1, v, u ) pos x - - } else if ( face == 1.0 ) { - - direction = direction.xzy; - direction.xz *= -1.0; // ( -u, 1, -v ) pos y - - } else if ( face == 2.0 ) { - - direction.x *= -1.0; // ( -u, v, 1 ) pos z - - } else if ( face == 3.0 ) { - - direction = direction.zyx; - direction.xz *= -1.0; // ( -1, v, -u ) neg x - - } else if ( face == 4.0 ) { - - direction = direction.xzy; - direction.xy *= -1.0; // ( -u, -1, v ) neg y - - } else if ( face == 5.0 ) { - - direction.z *= -1.0; // ( u, v, -1 ) neg z - - } - - return direction; - - } - - void main() { - - vOutputDirection = getDirection( uv, faceIndex ); - gl_Position = vec4( position, 1.0 ); - - } - `}function Ep(i){let t=new WeakMap,e=null;function n(o){if(o&&o.isTexture){const l=o.mapping,c=l===jr||l===Jr,h=l===Ai||l===wi;if(c||h){let u=t.get(o);const d=u!==void 0?u.texture.pmremVersion:0;if(o.isRenderTargetTexture&&o.pmremVersion!==d)return e===null&&(e=new Ia(i)),u=c?e.fromEquirectangular(o,u):e.fromCubemap(o,u),u.texture.pmremVersion=o.pmremVersion,t.set(o,u),u.texture;if(u!==void 0)return u.texture;{const p=o.image;return c&&p&&p.height>0||h&&p&&s(p)?(e===null&&(e=new Ia(i)),u=c?e.fromEquirectangular(o):e.fromCubemap(o),u.texture.pmremVersion=o.pmremVersion,t.set(o,u),o.addEventListener("dispose",r),u.texture):null}}}return o}function s(o){let l=0;const c=6;for(let h=0;ht.maxTextureSize&&(R=Math.ceil(T/t.maxTextureSize),T=t.maxTextureSize);const w=new Float32Array(T*R*4*u),L=new Nc(w,T,R,u);L.type=on,L.needsUpdate=!0;const F=S*4;for(let M=0;M0)return i;const s=t*e;let r=sc[s];if(r===void 0&&(r=new Float32Array(s),sc[s]=r),t!==0){n.toArray(r,0);for(let a=1,o=0;a!==t;++a)o+=e,i[a].toArray(r,o)}return r}function Se(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e":" "} ${o}: ${e[a]}`)}return n.join(` -`)}const uc=new Ht;function E0(i){$t._getMatrix(uc,$t.workingColorSpace,i);const t=`mat3( ${uc.elements.map(e=>e.toFixed(4))} )`;switch($t.getTransfer(i)){case Ws:return[t,"LinearTransferOETF"];case ne:return[t,"sRGBTransferOETF"];default:return Bt("WebGLProgram: Unsupported color space: ",i),[t,"LinearTransferOETF"]}}function fc(i,t,e){const n=i.getShaderParameter(t,i.COMPILE_STATUS),r=(i.getShaderInfoLog(t)||"").trim();if(n&&r==="")return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const o=parseInt(a[1]);return e.toUpperCase()+` - -`+r+` - -`+b0(i.getShaderSource(t),o)}else return r}function T0(i,t){const e=E0(t);return[`vec4 ${i}( vec4 value ) {`,` return ${e[1]}( vec4( value.rgb * ${e[0]}, value.a ) );`,"}"].join(` -`)}function A0(i,t){let e;switch(t){case Gl:e="Linear";break;case kl:e="Reinhard";break;case Hl:e="Cineon";break;case Tc:e="ACESFilmic";break;case Xl:e="AgX";break;case ql:e="Neutral";break;case Wl:e="Custom";break;default:Bt("WebGLProgram: Unsupported toneMapping:",t),e="Linear"}return"vec3 "+i+"( vec3 color ) { return "+e+"ToneMapping( color ); }"}const Fs=new D;function w0(){$t.getLuminanceCoefficients(Fs);const i=Fs.x.toFixed(4),t=Fs.y.toFixed(4),e=Fs.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${i}, ${t}, ${e} );`," return dot( weights, rgb );","}"].join(` -`)}function R0(i){return[i.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",i.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(Zi).join(` -`)}function C0(i){const t=[];for(const e in i){const n=i[e];n!==!1&&t.push("#define "+e+" "+n)}return t.join(` -`)}function P0(i,t){const e={},n=i.getProgramParameter(t,i.ACTIVE_ATTRIBUTES);for(let s=0;s/gm;function Ua(i){return i.replace(D0,I0)}const L0=new Map;function I0(i,t){let e=Wt[t];if(e===void 0){const n=L0.get(t);if(n!==void 0)e=Wt[n],Bt('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,n);else throw new Error("Can not resolve #include <"+t+">")}return Ua(e)}const U0=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function mc(i){return i.replace(U0,N0)}function N0(i,t,e,n){let s="";for(let r=parseInt(t);r0&&(m+=` -`),f=["#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,x].filter(Zi).join(` -`),f.length>0&&(f+=` -`)):(m=[xc(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,x,e.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",e.batching?"#define USE_BATCHING":"",e.batchingColor?"#define USE_BATCHING_COLOR":"",e.instancing?"#define USE_INSTANCING":"",e.instancingColor?"#define USE_INSTANCING_COLOR":"",e.instancingMorph?"#define USE_INSTANCING_MORPH":"",e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+h:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.displacementMap?"#define USE_DISPLACEMENTMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.mapUv?"#define MAP_UV "+e.mapUv:"",e.alphaMapUv?"#define ALPHAMAP_UV "+e.alphaMapUv:"",e.lightMapUv?"#define LIGHTMAP_UV "+e.lightMapUv:"",e.aoMapUv?"#define AOMAP_UV "+e.aoMapUv:"",e.emissiveMapUv?"#define EMISSIVEMAP_UV "+e.emissiveMapUv:"",e.bumpMapUv?"#define BUMPMAP_UV "+e.bumpMapUv:"",e.normalMapUv?"#define NORMALMAP_UV "+e.normalMapUv:"",e.displacementMapUv?"#define DISPLACEMENTMAP_UV "+e.displacementMapUv:"",e.metalnessMapUv?"#define METALNESSMAP_UV "+e.metalnessMapUv:"",e.roughnessMapUv?"#define ROUGHNESSMAP_UV "+e.roughnessMapUv:"",e.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+e.anisotropyMapUv:"",e.clearcoatMapUv?"#define CLEARCOATMAP_UV "+e.clearcoatMapUv:"",e.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+e.clearcoatNormalMapUv:"",e.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+e.clearcoatRoughnessMapUv:"",e.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+e.iridescenceMapUv:"",e.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+e.iridescenceThicknessMapUv:"",e.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+e.sheenColorMapUv:"",e.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+e.sheenRoughnessMapUv:"",e.specularMapUv?"#define SPECULARMAP_UV "+e.specularMapUv:"",e.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+e.specularColorMapUv:"",e.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+e.specularIntensityMapUv:"",e.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+e.transmissionMapUv:"",e.thicknessMapUv?"#define THICKNESSMAP_UV "+e.thicknessMapUv:"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.flatShading?"#define FLAT_SHADED":"",e.skinning?"#define USE_SKINNING":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals&&e.flatShading===!1?"#define USE_MORPHNORMALS":"",e.morphColors?"#define USE_MORPHCOLORS":"",e.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+e.morphTextureStride:"",e.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+e.morphTargetsCount:"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",e.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` -`].filter(Zi).join(` -`),f=[xc(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,x,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",e.map?"#define USE_MAP":"",e.matcap?"#define USE_MATCAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+c:"",e.envMap?"#define "+h:"",e.envMap?"#define "+u:"",d?"#define CUBEUV_TEXEL_WIDTH "+d.texelWidth:"",d?"#define CUBEUV_TEXEL_HEIGHT "+d.texelHeight:"",d?"#define CUBEUV_MAX_MIP "+d.maxMip+".0":"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoat?"#define USE_CLEARCOAT":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.dispersion?"#define USE_DISPERSION":"",e.iridescence?"#define USE_IRIDESCENCE":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaTest?"#define USE_ALPHATEST":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.sheen?"#define USE_SHEEN":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors||e.instancingColor||e.batchingColor?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",e.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",e.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",e.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",e.toneMapping!==Un?"#define TONE_MAPPING":"",e.toneMapping!==Un?Wt.tonemapping_pars_fragment:"",e.toneMapping!==Un?A0("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.opaque?"#define OPAQUE":"",Wt.colorspace_pars_fragment,T0("linearToOutputTexel",e.outputColorSpace),w0(),e.useDepthPacking?"#define DEPTH_PACKING "+e.depthPacking:"",` -`].filter(Zi).join(` -`)),a=Ua(a),a=dc(a,e),a=pc(a,e),o=Ua(o),o=dc(o,e),o=pc(o,e),a=mc(a),o=mc(o),e.isRawShaderMaterial!==!0&&(b=`#version 300 es -`,m=[p,"#define attribute in","#define varying out","#define texture2D texture"].join(` -`)+` -`+m,f=["#define varying in",e.glslVersion===mo?"":"layout(location = 0) out highp vec4 pc_fragColor;",e.glslVersion===mo?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` -`)+` -`+f);const S=b+m+a,T=b+f+o,R=hc(s,s.VERTEX_SHADER,S),w=hc(s,s.FRAGMENT_SHADER,T);s.attachShader(_,R),s.attachShader(_,w),e.index0AttributeName!==void 0?s.bindAttribLocation(_,0,e.index0AttributeName):e.morphTargets===!0&&s.bindAttribLocation(_,0,"position"),s.linkProgram(_);function L(P){if(i.debug.checkShaderErrors){const O=s.getProgramInfoLog(_)||"",z=s.getShaderInfoLog(R)||"",k=s.getShaderInfoLog(w)||"",W=O.trim(),Y=z.trim(),nt=k.trim();let X=!0,rt=!0;if(s.getProgramParameter(_,s.LINK_STATUS)===!1)if(X=!1,typeof i.debug.onShaderError=="function")i.debug.onShaderError(s,_,R,w);else{const st=fc(s,R,"vertex"),St=fc(s,w,"fragment");de("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(_,s.VALIDATE_STATUS)+` - -Material Name: `+P.name+` -Material Type: `+P.type+` - -Program Info Log: `+W+` -`+st+` -`+St)}else W!==""?Bt("WebGLProgram: Program Info Log:",W):(Y===""||nt==="")&&(rt=!1);rt&&(P.diagnostics={runnable:X,programLog:W,vertexShader:{log:Y,prefix:m},fragmentShader:{log:nt,prefix:f}})}s.deleteShader(R),s.deleteShader(w),F=new Hs(s,_),E=P0(s,_)}let F;this.getUniforms=function(){return F===void 0&&L(this),F};let E;this.getAttributes=function(){return E===void 0&&L(this),E};let M=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return M===!1&&(M=s.getProgramParameter(_,S0)),M},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(_),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=y0++,this.cacheKey=t,this.usedTimes=1,this.program=_,this.vertexShader=R,this.fragmentShader=w,this}let k0=0;class H0{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(t);return a.has(s)===!1&&(a.add(s),s.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;let n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){const e=this.shaderCache;let n=e.get(t);return n===void 0&&(n=new W0(t),e.set(t,n)),n}}class W0{constructor(t){this.id=k0++,this.code=t,this.usedTimes=0}}function X0(i,t,e,n,s,r,a){const o=new Ya,l=new H0,c=new Set,h=[],u=s.logarithmicDepthBuffer,d=s.vertexTextures;let p=s.precision;const x={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function _(E){return c.add(E),E===0?"uv":`uv${E}`}function m(E,M,P,O,z){const k=O.fog,W=z.geometry,Y=E.isMeshStandardMaterial?O.environment:null,nt=(E.isMeshStandardMaterial?e:t).get(E.envMap||Y),X=nt&&nt.mapping===Js?nt.image.height:null,rt=x[E.type];E.precision!==null&&(p=s.getMaxPrecision(E.precision),p!==E.precision&&Bt("WebGLProgram.getParameters:",E.precision,"not supported, using",p,"instead."));const st=W.morphAttributes.position||W.morphAttributes.normal||W.morphAttributes.color,St=st!==void 0?st.length:0;let Gt=0;W.morphAttributes.position!==void 0&&(Gt=1),W.morphAttributes.normal!==void 0&&(Gt=2),W.morphAttributes.color!==void 0&&(Gt=3);let qt,jt,Kt,K;if(rt){const te=an[rt];qt=te.vertexShader,jt=te.fragmentShader}else qt=E.vertexShader,jt=E.fragmentShader,l.update(E),Kt=l.getVertexShaderID(E),K=l.getFragmentShaderID(E);const J=i.getRenderTarget(),xt=i.state.buffers.depth.getReversed(),Rt=z.isInstancedMesh===!0,Tt=z.isBatchedMesh===!0,kt=!!E.map,Qt=!!E.matcap,Ct=!!nt,B=!!E.aoMap,y=!!E.lightMap,Z=!!E.bumpMap,Q=!!E.normalMap,ot=!!E.displacementMap,et=!!E.emissiveMap,vt=!!E.metalnessMap,ft=!!E.roughnessMap,Mt=E.anisotropy>0,A=E.clearcoat>0,g=E.dispersion>0,N=E.iridescence>0,q=E.sheen>0,$=E.transmission>0,H=Mt&&!!E.anisotropyMap,wt=A&&!!E.clearcoatMap,dt=A&&!!E.clearcoatNormalMap,Pt=A&&!!E.clearcoatRoughnessMap,At=N&&!!E.iridescenceMap,tt=N&&!!E.iridescenceThicknessMap,lt=q&&!!E.sheenColorMap,Nt=q&&!!E.sheenRoughnessMap,It=!!E.specularMap,_t=!!E.specularColorMap,Ot=!!E.specularIntensityMap,C=$&&!!E.transmissionMap,mt=$&&!!E.thicknessMap,ht=!!E.gradientMap,ut=!!E.alphaMap,it=E.alphaTest>0,j=!!E.alphaHash,bt=!!E.extensions;let zt=Un;E.toneMapped&&(J===null||J.isXRRenderTarget===!0)&&(zt=i.toneMapping);const ce={shaderID:rt,shaderType:E.type,shaderName:E.name,vertexShader:qt,fragmentShader:jt,defines:E.defines,customVertexShaderID:Kt,customFragmentShaderID:K,isRawShaderMaterial:E.isRawShaderMaterial===!0,glslVersion:E.glslVersion,precision:p,batching:Tt,batchingColor:Tt&&z._colorsTexture!==null,instancing:Rt,instancingColor:Rt&&z.instanceColor!==null,instancingMorph:Rt&&z.morphTexture!==null,supportsVertexTextures:d,outputColorSpace:J===null?i.outputColorSpace:J.isXRRenderTarget===!0?J.texture.colorSpace:Ri,alphaToCoverage:!!E.alphaToCoverage,map:kt,matcap:Qt,envMap:Ct,envMapMode:Ct&&nt.mapping,envMapCubeUVHeight:X,aoMap:B,lightMap:y,bumpMap:Z,normalMap:Q,displacementMap:d&&ot,emissiveMap:et,normalMapObjectSpace:Q&&E.normalMapType===jl,normalMapTangentSpace:Q&&E.normalMapType===Xa,metalnessMap:vt,roughnessMap:ft,anisotropy:Mt,anisotropyMap:H,clearcoat:A,clearcoatMap:wt,clearcoatNormalMap:dt,clearcoatRoughnessMap:Pt,dispersion:g,iridescence:N,iridescenceMap:At,iridescenceThicknessMap:tt,sheen:q,sheenColorMap:lt,sheenRoughnessMap:Nt,specularMap:It,specularColorMap:_t,specularIntensityMap:Ot,transmission:$,transmissionMap:C,thicknessMap:mt,gradientMap:ht,opaque:E.transparent===!1&&E.blending===bi&&E.alphaToCoverage===!1,alphaMap:ut,alphaTest:it,alphaHash:j,combine:E.combine,mapUv:kt&&_(E.map.channel),aoMapUv:B&&_(E.aoMap.channel),lightMapUv:y&&_(E.lightMap.channel),bumpMapUv:Z&&_(E.bumpMap.channel),normalMapUv:Q&&_(E.normalMap.channel),displacementMapUv:ot&&_(E.displacementMap.channel),emissiveMapUv:et&&_(E.emissiveMap.channel),metalnessMapUv:vt&&_(E.metalnessMap.channel),roughnessMapUv:ft&&_(E.roughnessMap.channel),anisotropyMapUv:H&&_(E.anisotropyMap.channel),clearcoatMapUv:wt&&_(E.clearcoatMap.channel),clearcoatNormalMapUv:dt&&_(E.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Pt&&_(E.clearcoatRoughnessMap.channel),iridescenceMapUv:At&&_(E.iridescenceMap.channel),iridescenceThicknessMapUv:tt&&_(E.iridescenceThicknessMap.channel),sheenColorMapUv:lt&&_(E.sheenColorMap.channel),sheenRoughnessMapUv:Nt&&_(E.sheenRoughnessMap.channel),specularMapUv:It&&_(E.specularMap.channel),specularColorMapUv:_t&&_(E.specularColorMap.channel),specularIntensityMapUv:Ot&&_(E.specularIntensityMap.channel),transmissionMapUv:C&&_(E.transmissionMap.channel),thicknessMapUv:mt&&_(E.thicknessMap.channel),alphaMapUv:ut&&_(E.alphaMap.channel),vertexTangents:!!W.attributes.tangent&&(Q||Mt),vertexColors:E.vertexColors,vertexAlphas:E.vertexColors===!0&&!!W.attributes.color&&W.attributes.color.itemSize===4,pointsUvs:z.isPoints===!0&&!!W.attributes.uv&&(kt||ut),fog:!!k,useFog:E.fog===!0,fogExp2:!!k&&k.isFogExp2,flatShading:E.flatShading===!0&&E.wireframe===!1,sizeAttenuation:E.sizeAttenuation===!0,logarithmicDepthBuffer:u,reversedDepthBuffer:xt,skinning:z.isSkinnedMesh===!0,morphTargets:W.morphAttributes.position!==void 0,morphNormals:W.morphAttributes.normal!==void 0,morphColors:W.morphAttributes.color!==void 0,morphTargetsCount:St,morphTextureStride:Gt,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:E.dithering,shadowMapEnabled:i.shadowMap.enabled&&P.length>0,shadowMapType:i.shadowMap.type,toneMapping:zt,decodeVideoTexture:kt&&E.map.isVideoTexture===!0&&$t.getTransfer(E.map.colorSpace)===ne,decodeVideoTextureEmissive:et&&E.emissiveMap.isVideoTexture===!0&&$t.getTransfer(E.emissiveMap.colorSpace)===ne,premultipliedAlpha:E.premultipliedAlpha,doubleSided:E.side===Mn,flipSided:E.side===Le,useDepthPacking:E.depthPacking>=0,depthPacking:E.depthPacking||0,index0AttributeName:E.index0AttributeName,extensionClipCullDistance:bt&&E.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(bt&&E.extensions.multiDraw===!0||Tt)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:E.customProgramCacheKey()};return ce.vertexUv1s=c.has(1),ce.vertexUv2s=c.has(2),ce.vertexUv3s=c.has(3),c.clear(),ce}function f(E){const M=[];if(E.shaderID?M.push(E.shaderID):(M.push(E.customVertexShaderID),M.push(E.customFragmentShaderID)),E.defines!==void 0)for(const P in E.defines)M.push(P),M.push(E.defines[P]);return E.isRawShaderMaterial===!1&&(b(M,E),S(M,E),M.push(i.outputColorSpace)),M.push(E.customProgramCacheKey),M.join()}function b(E,M){E.push(M.precision),E.push(M.outputColorSpace),E.push(M.envMapMode),E.push(M.envMapCubeUVHeight),E.push(M.mapUv),E.push(M.alphaMapUv),E.push(M.lightMapUv),E.push(M.aoMapUv),E.push(M.bumpMapUv),E.push(M.normalMapUv),E.push(M.displacementMapUv),E.push(M.emissiveMapUv),E.push(M.metalnessMapUv),E.push(M.roughnessMapUv),E.push(M.anisotropyMapUv),E.push(M.clearcoatMapUv),E.push(M.clearcoatNormalMapUv),E.push(M.clearcoatRoughnessMapUv),E.push(M.iridescenceMapUv),E.push(M.iridescenceThicknessMapUv),E.push(M.sheenColorMapUv),E.push(M.sheenRoughnessMapUv),E.push(M.specularMapUv),E.push(M.specularColorMapUv),E.push(M.specularIntensityMapUv),E.push(M.transmissionMapUv),E.push(M.thicknessMapUv),E.push(M.combine),E.push(M.fogExp2),E.push(M.sizeAttenuation),E.push(M.morphTargetsCount),E.push(M.morphAttributeCount),E.push(M.numDirLights),E.push(M.numPointLights),E.push(M.numSpotLights),E.push(M.numSpotLightMaps),E.push(M.numHemiLights),E.push(M.numRectAreaLights),E.push(M.numDirLightShadows),E.push(M.numPointLightShadows),E.push(M.numSpotLightShadows),E.push(M.numSpotLightShadowsWithMaps),E.push(M.numLightProbes),E.push(M.shadowMapType),E.push(M.toneMapping),E.push(M.numClippingPlanes),E.push(M.numClipIntersection),E.push(M.depthPacking)}function S(E,M){o.disableAll(),M.supportsVertexTextures&&o.enable(0),M.instancing&&o.enable(1),M.instancingColor&&o.enable(2),M.instancingMorph&&o.enable(3),M.matcap&&o.enable(4),M.envMap&&o.enable(5),M.normalMapObjectSpace&&o.enable(6),M.normalMapTangentSpace&&o.enable(7),M.clearcoat&&o.enable(8),M.iridescence&&o.enable(9),M.alphaTest&&o.enable(10),M.vertexColors&&o.enable(11),M.vertexAlphas&&o.enable(12),M.vertexUv1s&&o.enable(13),M.vertexUv2s&&o.enable(14),M.vertexUv3s&&o.enable(15),M.vertexTangents&&o.enable(16),M.anisotropy&&o.enable(17),M.alphaHash&&o.enable(18),M.batching&&o.enable(19),M.dispersion&&o.enable(20),M.batchingColor&&o.enable(21),M.gradientMap&&o.enable(22),E.push(o.mask),o.disableAll(),M.fog&&o.enable(0),M.useFog&&o.enable(1),M.flatShading&&o.enable(2),M.logarithmicDepthBuffer&&o.enable(3),M.reversedDepthBuffer&&o.enable(4),M.skinning&&o.enable(5),M.morphTargets&&o.enable(6),M.morphNormals&&o.enable(7),M.morphColors&&o.enable(8),M.premultipliedAlpha&&o.enable(9),M.shadowMapEnabled&&o.enable(10),M.doubleSided&&o.enable(11),M.flipSided&&o.enable(12),M.useDepthPacking&&o.enable(13),M.dithering&&o.enable(14),M.transmission&&o.enable(15),M.sheen&&o.enable(16),M.opaque&&o.enable(17),M.pointsUvs&&o.enable(18),M.decodeVideoTexture&&o.enable(19),M.decodeVideoTextureEmissive&&o.enable(20),M.alphaToCoverage&&o.enable(21),E.push(o.mask)}function T(E){const M=x[E.type];let P;if(M){const O=an[M];P=Ah.clone(O.uniforms)}else P=E.uniforms;return P}function R(E,M){let P;for(let O=0,z=h.length;O0?n.push(f):p.transparent===!0?s.push(f):e.push(f)}function l(u,d,p,x,_,m){const f=a(u,d,p,x,_,m);p.transmission>0?n.unshift(f):p.transparent===!0?s.unshift(f):e.unshift(f)}function c(u,d){e.length>1&&e.sort(u||Y0),n.length>1&&n.sort(d||gc),s.length>1&&s.sort(d||gc)}function h(){for(let u=t,d=i.length;u=r.length?(a=new _c,r.push(a)):a=r[s],a}function e(){i=new WeakMap}return{get:t,dispose:e}}function K0(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={direction:new D,color:new Yt};break;case"SpotLight":e={position:new D,direction:new D,color:new Yt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":e={position:new D,color:new Yt,distance:0,decay:0};break;case"HemisphereLight":e={direction:new D,skyColor:new Yt,groundColor:new Yt};break;case"RectAreaLight":e={color:new Yt,position:new D,halfWidth:new D,halfHeight:new D};break}return i[t.id]=e,e}}}function j0(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new at};break;case"SpotLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new at};break;case"PointLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new at,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}let J0=0;function $0(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function Q0(i){const t=new K0,e=j0(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new D);const s=new D,r=new re,a=new re;function o(c){let h=0,u=0,d=0;for(let E=0;E<9;E++)n.probe[E].set(0,0,0);let p=0,x=0,_=0,m=0,f=0,b=0,S=0,T=0,R=0,w=0,L=0;c.sort($0);for(let E=0,M=c.length;E0&&(i.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=pt.LTC_FLOAT_1,n.rectAreaLTC2=pt.LTC_FLOAT_2):(n.rectAreaLTC1=pt.LTC_HALF_1,n.rectAreaLTC2=pt.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=u,n.ambient[2]=d;const F=n.hash;(F.directionalLength!==p||F.pointLength!==x||F.spotLength!==_||F.rectAreaLength!==m||F.hemiLength!==f||F.numDirectionalShadows!==b||F.numPointShadows!==S||F.numSpotShadows!==T||F.numSpotMaps!==R||F.numLightProbes!==L)&&(n.directional.length=p,n.spot.length=_,n.rectArea.length=m,n.point.length=x,n.hemi.length=f,n.directionalShadow.length=b,n.directionalShadowMap.length=b,n.pointShadow.length=S,n.pointShadowMap.length=S,n.spotShadow.length=T,n.spotShadowMap.length=T,n.directionalShadowMatrix.length=b,n.pointShadowMatrix.length=S,n.spotLightMatrix.length=T+R-w,n.spotLightMap.length=R,n.numSpotLightShadowsWithMaps=w,n.numLightProbes=L,F.directionalLength=p,F.pointLength=x,F.spotLength=_,F.rectAreaLength=m,F.hemiLength=f,F.numDirectionalShadows=b,F.numPointShadows=S,F.numSpotShadows=T,F.numSpotMaps=R,F.numLightProbes=L,n.version=J0++)}function l(c,h){let u=0,d=0,p=0,x=0,_=0;const m=h.matrixWorldInverse;for(let f=0,b=c.length;f=a.length?(o=new vc(i),a.push(o)):o=a[r],o}function n(){t=new WeakMap}return{get:e,dispose:n}}const em=`void main() { - gl_Position = vec4( position, 1.0 ); -}`,nm=`uniform sampler2D shadow_pass; -uniform vec2 resolution; -uniform float radius; -#include -void main() { - const float samples = float( VSM_SAMPLES ); - float mean = 0.0; - float squared_mean = 0.0; - float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 ); - float uvStart = samples <= 1.0 ? 0.0 : - 1.0; - for ( float i = 0.0; i < samples; i ++ ) { - float uvOffset = uvStart + i * uvStride; - #ifdef HORIZONTAL_PASS - vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) ); - mean += distribution.x; - squared_mean += distribution.y * distribution.y + distribution.x * distribution.x; - #else - float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) ); - mean += depth; - squared_mean += depth * depth; - #endif - } - mean = mean / samples; - squared_mean = squared_mean / samples; - float std_dev = sqrt( squared_mean - mean * mean ); - gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function im(i,t,e){let n=new Za;const s=new at,r=new at,a=new se,o=new Mu({depthPacking:Kl}),l=new Su,c={},h=e.maxTextureSize,u={[Fn]:Le,[Le]:Fn,[Mn]:Mn},d=new En({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new at},radius:{value:4}},vertexShader:em,fragmentShader:nm}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const x=new Ie;x.setAttribute("position",new en(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const _=new Vt(x,d),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=bc;let f=this.type;this.render=function(w,L,F){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||w.length===0)return;const E=i.getRenderTarget(),M=i.getActiveCubeFace(),P=i.getActiveMipmapLevel(),O=i.state;O.setBlending(yn),O.buffers.depth.getReversed()===!0?O.buffers.color.setClear(0,0,0,0):O.buffers.color.setClear(1,1,1,1),O.buffers.depth.setTest(!0),O.setScissorTest(!1);const z=f!==_n&&this.type===_n,k=f===_n&&this.type!==_n;for(let W=0,Y=w.length;Wh||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/rt.x),s.x=r.x*rt.x,X.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/rt.y),s.y=r.y*rt.y,X.mapSize.y=r.y)),X.map===null||z===!0||k===!0){const St=this.type!==_n?{minFilter:He,magFilter:He}:{};X.map!==null&&X.map.dispose(),X.map=new $n(s.x,s.y,St),X.map.texture.name=nt.name+".shadowMap",X.camera.updateProjectionMatrix()}i.setRenderTarget(X.map),i.clear();const st=X.getViewportCount();for(let St=0;St0||L.map&&L.alphaTest>0||L.alphaToCoverage===!0){const O=M.uuid,z=L.uuid;let k=c[O];k===void 0&&(k={},c[O]=k);let W=k[z];W===void 0&&(W=M.clone(),k[z]=W,L.addEventListener("dispose",R)),M=W}if(M.visible=L.visible,M.wireframe=L.wireframe,E===_n?M.side=L.shadowSide!==null?L.shadowSide:L.side:M.side=L.shadowSide!==null?L.shadowSide:u[L.side],M.alphaMap=L.alphaMap,M.alphaTest=L.alphaToCoverage===!0?.5:L.alphaTest,M.map=L.map,M.clipShadows=L.clipShadows,M.clippingPlanes=L.clippingPlanes,M.clipIntersection=L.clipIntersection,M.displacementMap=L.displacementMap,M.displacementScale=L.displacementScale,M.displacementBias=L.displacementBias,M.wireframeLinewidth=L.wireframeLinewidth,M.linewidth=L.linewidth,F.isPointLight===!0&&M.isMeshDistanceMaterial===!0){const O=i.properties.get(M);O.light=F}return M}function T(w,L,F,E,M){if(w.visible===!1)return;if(w.layers.test(L.layers)&&(w.isMesh||w.isLine||w.isPoints)&&(w.castShadow||w.receiveShadow&&M===_n)&&(!w.frustumCulled||n.intersectsObject(w))){w.modelViewMatrix.multiplyMatrices(F.matrixWorldInverse,w.matrixWorld);const z=t.update(w),k=w.material;if(Array.isArray(k)){const W=z.groups;for(let Y=0,nt=W.length;Y=1):X.indexOf("OpenGL ES")!==-1&&(nt=parseFloat(/^OpenGL ES (\d)/.exec(X)[1]),Y=nt>=2);let rt=null,st={};const St=i.getParameter(i.SCISSOR_BOX),Gt=i.getParameter(i.VIEWPORT),qt=new se().fromArray(St),jt=new se().fromArray(Gt);function Kt(C,mt,ht,ut){const it=new Uint8Array(4),j=i.createTexture();i.bindTexture(C,j),i.texParameteri(C,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(C,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let bt=0;bt"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new at,h=new WeakMap;let u;const d=new WeakMap;let p=!1;try{p=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function x(A,g){return p?new OffscreenCanvas(A,g):qs("canvas")}function _(A,g,N){let q=1;const $=Mt(A);if(($.width>N||$.height>N)&&(q=N/Math.max($.width,$.height)),q<1)if(typeof HTMLImageElement<"u"&&A instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&A instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&A instanceof ImageBitmap||typeof VideoFrame<"u"&&A instanceof VideoFrame){const H=Math.floor(q*$.width),wt=Math.floor(q*$.height);u===void 0&&(u=x(H,wt));const dt=g?x(H,wt):u;return dt.width=H,dt.height=wt,dt.getContext("2d").drawImage(A,0,0,H,wt),Bt("WebGLRenderer: Texture has been resized from ("+$.width+"x"+$.height+") to ("+H+"x"+wt+")."),dt}else return"data"in A&&Bt("WebGLRenderer: Image in DataTexture is too big ("+$.width+"x"+$.height+")."),A;return A}function m(A){return A.generateMipmaps}function f(A){i.generateMipmap(A)}function b(A){return A.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:A.isWebGL3DRenderTarget?i.TEXTURE_3D:A.isWebGLArrayRenderTarget||A.isCompressedArrayTexture?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D}function S(A,g,N,q,$=!1){if(A!==null){if(i[A]!==void 0)return i[A];Bt("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+A+"'")}let H=g;if(g===i.RED&&(N===i.FLOAT&&(H=i.R32F),N===i.HALF_FLOAT&&(H=i.R16F),N===i.UNSIGNED_BYTE&&(H=i.R8)),g===i.RED_INTEGER&&(N===i.UNSIGNED_BYTE&&(H=i.R8UI),N===i.UNSIGNED_SHORT&&(H=i.R16UI),N===i.UNSIGNED_INT&&(H=i.R32UI),N===i.BYTE&&(H=i.R8I),N===i.SHORT&&(H=i.R16I),N===i.INT&&(H=i.R32I)),g===i.RG&&(N===i.FLOAT&&(H=i.RG32F),N===i.HALF_FLOAT&&(H=i.RG16F),N===i.UNSIGNED_BYTE&&(H=i.RG8)),g===i.RG_INTEGER&&(N===i.UNSIGNED_BYTE&&(H=i.RG8UI),N===i.UNSIGNED_SHORT&&(H=i.RG16UI),N===i.UNSIGNED_INT&&(H=i.RG32UI),N===i.BYTE&&(H=i.RG8I),N===i.SHORT&&(H=i.RG16I),N===i.INT&&(H=i.RG32I)),g===i.RGB_INTEGER&&(N===i.UNSIGNED_BYTE&&(H=i.RGB8UI),N===i.UNSIGNED_SHORT&&(H=i.RGB16UI),N===i.UNSIGNED_INT&&(H=i.RGB32UI),N===i.BYTE&&(H=i.RGB8I),N===i.SHORT&&(H=i.RGB16I),N===i.INT&&(H=i.RGB32I)),g===i.RGBA_INTEGER&&(N===i.UNSIGNED_BYTE&&(H=i.RGBA8UI),N===i.UNSIGNED_SHORT&&(H=i.RGBA16UI),N===i.UNSIGNED_INT&&(H=i.RGBA32UI),N===i.BYTE&&(H=i.RGBA8I),N===i.SHORT&&(H=i.RGBA16I),N===i.INT&&(H=i.RGBA32I)),g===i.RGB&&(N===i.UNSIGNED_INT_5_9_9_9_REV&&(H=i.RGB9_E5),N===i.UNSIGNED_INT_10F_11F_11F_REV&&(H=i.R11F_G11F_B10F)),g===i.RGBA){const wt=$?Ws:$t.getTransfer(q);N===i.FLOAT&&(H=i.RGBA32F),N===i.HALF_FLOAT&&(H=i.RGBA16F),N===i.UNSIGNED_BYTE&&(H=wt===ne?i.SRGB8_ALPHA8:i.RGBA8),N===i.UNSIGNED_SHORT_4_4_4_4&&(H=i.RGBA4),N===i.UNSIGNED_SHORT_5_5_5_1&&(H=i.RGB5_A1)}return(H===i.R16F||H===i.R32F||H===i.RG16F||H===i.RG32F||H===i.RGBA16F||H===i.RGBA32F)&&t.get("EXT_color_buffer_float"),H}function T(A,g){let N;return A?g===null||g===jn||g===ts?N=i.DEPTH24_STENCIL8:g===on?N=i.DEPTH32F_STENCIL8:g===Qi&&(N=i.DEPTH24_STENCIL8,Bt("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):g===null||g===jn||g===ts?N=i.DEPTH_COMPONENT24:g===on?N=i.DEPTH_COMPONENT32F:g===Qi&&(N=i.DEPTH_COMPONENT16),N}function R(A,g){return m(A)===!0||A.isFramebufferTexture&&A.minFilter!==He&&A.minFilter!==Ye?Math.log2(Math.max(g.width,g.height))+1:A.mipmaps!==void 0&&A.mipmaps.length>0?A.mipmaps.length:A.isCompressedTexture&&Array.isArray(A.image)?g.mipmaps.length:1}function w(A){const g=A.target;g.removeEventListener("dispose",w),F(g),g.isVideoTexture&&h.delete(g)}function L(A){const g=A.target;g.removeEventListener("dispose",L),M(g)}function F(A){const g=n.get(A);if(g.__webglInit===void 0)return;const N=A.source,q=d.get(N);if(q){const $=q[g.__cacheKey];$.usedTimes--,$.usedTimes===0&&E(A),Object.keys(q).length===0&&d.delete(N)}n.remove(A)}function E(A){const g=n.get(A);i.deleteTexture(g.__webglTexture);const N=A.source,q=d.get(N);delete q[g.__cacheKey],a.memory.textures--}function M(A){const g=n.get(A);if(A.depthTexture&&(A.depthTexture.dispose(),n.remove(A.depthTexture)),A.isWebGLCubeRenderTarget)for(let q=0;q<6;q++){if(Array.isArray(g.__webglFramebuffer[q]))for(let $=0;$=s.maxTextures&&Bt("WebGLTextures: Trying to use "+A+" texture units while this GPU supports only "+s.maxTextures),P+=1,A}function k(A){const g=[];return g.push(A.wrapS),g.push(A.wrapT),g.push(A.wrapR||0),g.push(A.magFilter),g.push(A.minFilter),g.push(A.anisotropy),g.push(A.internalFormat),g.push(A.format),g.push(A.type),g.push(A.generateMipmaps),g.push(A.premultiplyAlpha),g.push(A.flipY),g.push(A.unpackAlignment),g.push(A.colorSpace),g.join()}function W(A,g){const N=n.get(A);if(A.isVideoTexture&&vt(A),A.isRenderTargetTexture===!1&&A.isExternalTexture!==!0&&A.version>0&&N.__version!==A.version){const q=A.image;if(q===null)Bt("WebGLRenderer: Texture marked for update but no image data found.");else if(q.complete===!1)Bt("WebGLRenderer: Texture marked for update but image is incomplete");else{K(N,A,g);return}}else A.isExternalTexture&&(N.__webglTexture=A.sourceTexture?A.sourceTexture:null);e.bindTexture(i.TEXTURE_2D,N.__webglTexture,i.TEXTURE0+g)}function Y(A,g){const N=n.get(A);if(A.isRenderTargetTexture===!1&&A.version>0&&N.__version!==A.version){K(N,A,g);return}else A.isExternalTexture&&(N.__webglTexture=A.sourceTexture?A.sourceTexture:null);e.bindTexture(i.TEXTURE_2D_ARRAY,N.__webglTexture,i.TEXTURE0+g)}function nt(A,g){const N=n.get(A);if(A.isRenderTargetTexture===!1&&A.version>0&&N.__version!==A.version){K(N,A,g);return}e.bindTexture(i.TEXTURE_3D,N.__webglTexture,i.TEXTURE0+g)}function X(A,g){const N=n.get(A);if(A.version>0&&N.__version!==A.version){J(N,A,g);return}e.bindTexture(i.TEXTURE_CUBE_MAP,N.__webglTexture,i.TEXTURE0+g)}const rt={[$r]:i.REPEAT,[Sn]:i.CLAMP_TO_EDGE,[Qr]:i.MIRRORED_REPEAT},st={[He]:i.NEAREST,[Yl]:i.NEAREST_MIPMAP_NEAREST,[us]:i.NEAREST_MIPMAP_LINEAR,[Ye]:i.LINEAR,[ir]:i.LINEAR_MIPMAP_NEAREST,[Kn]:i.LINEAR_MIPMAP_LINEAR},St={[Jl]:i.NEVER,[ih]:i.ALWAYS,[$l]:i.LESS,[Ic]:i.LEQUAL,[Ql]:i.EQUAL,[nh]:i.GEQUAL,[th]:i.GREATER,[eh]:i.NOTEQUAL};function Gt(A,g){if(g.type===on&&t.has("OES_texture_float_linear")===!1&&(g.magFilter===Ye||g.magFilter===ir||g.magFilter===us||g.magFilter===Kn||g.minFilter===Ye||g.minFilter===ir||g.minFilter===us||g.minFilter===Kn)&&Bt("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),i.texParameteri(A,i.TEXTURE_WRAP_S,rt[g.wrapS]),i.texParameteri(A,i.TEXTURE_WRAP_T,rt[g.wrapT]),(A===i.TEXTURE_3D||A===i.TEXTURE_2D_ARRAY)&&i.texParameteri(A,i.TEXTURE_WRAP_R,rt[g.wrapR]),i.texParameteri(A,i.TEXTURE_MAG_FILTER,st[g.magFilter]),i.texParameteri(A,i.TEXTURE_MIN_FILTER,st[g.minFilter]),g.compareFunction&&(i.texParameteri(A,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(A,i.TEXTURE_COMPARE_FUNC,St[g.compareFunction])),t.has("EXT_texture_filter_anisotropic")===!0){if(g.magFilter===He||g.minFilter!==us&&g.minFilter!==Kn||g.type===on&&t.has("OES_texture_float_linear")===!1)return;if(g.anisotropy>1||n.get(g).__currentAnisotropy){const N=t.get("EXT_texture_filter_anisotropic");i.texParameterf(A,N.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,s.getMaxAnisotropy())),n.get(g).__currentAnisotropy=g.anisotropy}}}function qt(A,g){let N=!1;A.__webglInit===void 0&&(A.__webglInit=!0,g.addEventListener("dispose",w));const q=g.source;let $=d.get(q);$===void 0&&($={},d.set(q,$));const H=k(g);if(H!==A.__cacheKey){$[H]===void 0&&($[H]={texture:i.createTexture(),usedTimes:0},a.memory.textures++,N=!0),$[H].usedTimes++;const wt=$[A.__cacheKey];wt!==void 0&&($[A.__cacheKey].usedTimes--,wt.usedTimes===0&&E(g)),A.__cacheKey=H,A.__webglTexture=$[H].texture}return N}function jt(A,g,N){return Math.floor(Math.floor(A/N)/g)}function Kt(A,g,N,q){const H=A.updateRanges;if(H.length===0)e.texSubImage2D(i.TEXTURE_2D,0,0,0,g.width,g.height,N,q,g.data);else{H.sort((tt,lt)=>tt.start-lt.start);let wt=0;for(let tt=1;tt0){C&&mt&&e.texStorage2D(i.TEXTURE_2D,ut,It,Ot[0].width,Ot[0].height);for(let it=0,j=Ot.length;it0){const bt=Jo(_t.width,_t.height,g.format,g.type);for(const zt of g.layerUpdates){const ce=_t.data.subarray(zt*bt/_t.data.BYTES_PER_ELEMENT,(zt+1)*bt/_t.data.BYTES_PER_ELEMENT);e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,it,0,0,zt,_t.width,_t.height,1,lt,ce)}g.clearLayerUpdates()}else e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,it,0,0,0,_t.width,_t.height,tt.depth,lt,_t.data)}else e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,it,It,_t.width,_t.height,tt.depth,0,_t.data,0,0);else Bt("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else C?ht&&e.texSubImage3D(i.TEXTURE_2D_ARRAY,it,0,0,0,_t.width,_t.height,tt.depth,lt,Nt,_t.data):e.texImage3D(i.TEXTURE_2D_ARRAY,it,It,_t.width,_t.height,tt.depth,0,lt,Nt,_t.data)}else{C&&mt&&e.texStorage2D(i.TEXTURE_2D,ut,It,Ot[0].width,Ot[0].height);for(let it=0,j=Ot.length;it0){const it=Jo(tt.width,tt.height,g.format,g.type);for(const j of g.layerUpdates){const bt=tt.data.subarray(j*it/tt.data.BYTES_PER_ELEMENT,(j+1)*it/tt.data.BYTES_PER_ELEMENT);e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,j,tt.width,tt.height,1,lt,Nt,bt)}g.clearLayerUpdates()}else e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,tt.width,tt.height,tt.depth,lt,Nt,tt.data)}else e.texImage3D(i.TEXTURE_2D_ARRAY,0,It,tt.width,tt.height,tt.depth,0,lt,Nt,tt.data);else if(g.isData3DTexture)C?(mt&&e.texStorage3D(i.TEXTURE_3D,ut,It,tt.width,tt.height,tt.depth),ht&&e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,tt.width,tt.height,tt.depth,lt,Nt,tt.data)):e.texImage3D(i.TEXTURE_3D,0,It,tt.width,tt.height,tt.depth,0,lt,Nt,tt.data);else if(g.isFramebufferTexture){if(mt)if(C)e.texStorage2D(i.TEXTURE_2D,ut,It,tt.width,tt.height);else{let it=tt.width,j=tt.height;for(let bt=0;bt>=1,j>>=1}}else if(Ot.length>0){if(C&&mt){const it=Mt(Ot[0]);e.texStorage2D(i.TEXTURE_2D,ut,It,it.width,it.height)}for(let it=0,j=Ot.length;it0&&ut++;const j=Mt(lt[0]);e.texStorage2D(i.TEXTURE_CUBE_MAP,ut,Ot,j.width,j.height)}for(let j=0;j<6;j++)if(tt){C?ht&&e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,0,0,lt[j].width,lt[j].height,It,_t,lt[j].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,Ot,lt[j].width,lt[j].height,0,It,_t,lt[j].data);for(let bt=0;bt>H),Nt=Math.max(1,g.height>>H);$===i.TEXTURE_3D||$===i.TEXTURE_2D_ARRAY?e.texImage3D($,H,Pt,lt,Nt,g.depth,0,wt,dt,null):e.texImage2D($,H,Pt,lt,Nt,0,wt,dt,null)}e.bindFramebuffer(i.FRAMEBUFFER,A),et(g)?o.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,q,$,tt.__webglTexture,0,ot(g)):($===i.TEXTURE_2D||$>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&$<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,q,$,tt.__webglTexture,H),e.bindFramebuffer(i.FRAMEBUFFER,null)}function Rt(A,g,N){if(i.bindRenderbuffer(i.RENDERBUFFER,A),g.depthBuffer){const q=g.depthTexture,$=q&&q.isDepthTexture?q.type:null,H=T(g.stencilBuffer,$),wt=g.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,dt=ot(g);et(g)?o.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,dt,H,g.width,g.height):N?i.renderbufferStorageMultisample(i.RENDERBUFFER,dt,H,g.width,g.height):i.renderbufferStorage(i.RENDERBUFFER,H,g.width,g.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,wt,i.RENDERBUFFER,A)}else{const q=g.textures;for(let $=0;${delete g.__boundDepthTexture,delete g.__depthDisposeCallback,q.removeEventListener("dispose",$)};q.addEventListener("dispose",$),g.__depthDisposeCallback=$}g.__boundDepthTexture=q}if(A.depthTexture&&!g.__autoAllocateDepthBuffer){if(N)throw new Error("target.depthTexture not supported in Cube render targets");const q=A.texture.mipmaps;q&&q.length>0?Tt(g.__webglFramebuffer[0],A):Tt(g.__webglFramebuffer,A)}else if(N){g.__webglDepthbuffer=[];for(let q=0;q<6;q++)if(e.bindFramebuffer(i.FRAMEBUFFER,g.__webglFramebuffer[q]),g.__webglDepthbuffer[q]===void 0)g.__webglDepthbuffer[q]=i.createRenderbuffer(),Rt(g.__webglDepthbuffer[q],A,!1);else{const $=A.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,H=g.__webglDepthbuffer[q];i.bindRenderbuffer(i.RENDERBUFFER,H),i.framebufferRenderbuffer(i.FRAMEBUFFER,$,i.RENDERBUFFER,H)}}else{const q=A.texture.mipmaps;if(q&&q.length>0?e.bindFramebuffer(i.FRAMEBUFFER,g.__webglFramebuffer[0]):e.bindFramebuffer(i.FRAMEBUFFER,g.__webglFramebuffer),g.__webglDepthbuffer===void 0)g.__webglDepthbuffer=i.createRenderbuffer(),Rt(g.__webglDepthbuffer,A,!1);else{const $=A.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,H=g.__webglDepthbuffer;i.bindRenderbuffer(i.RENDERBUFFER,H),i.framebufferRenderbuffer(i.FRAMEBUFFER,$,i.RENDERBUFFER,H)}}e.bindFramebuffer(i.FRAMEBUFFER,null)}function Qt(A,g,N){const q=n.get(A);g!==void 0&&xt(q.__webglFramebuffer,A,A.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),N!==void 0&&kt(A)}function Ct(A){const g=A.texture,N=n.get(A),q=n.get(g);A.addEventListener("dispose",L);const $=A.textures,H=A.isWebGLCubeRenderTarget===!0,wt=$.length>1;if(wt||(q.__webglTexture===void 0&&(q.__webglTexture=i.createTexture()),q.__version=g.version,a.memory.textures++),H){N.__webglFramebuffer=[];for(let dt=0;dt<6;dt++)if(g.mipmaps&&g.mipmaps.length>0){N.__webglFramebuffer[dt]=[];for(let Pt=0;Pt0){N.__webglFramebuffer=[];for(let dt=0;dt0&&et(A)===!1){N.__webglMultisampledFramebuffer=i.createFramebuffer(),N.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,N.__webglMultisampledFramebuffer);for(let dt=0;dt<$.length;dt++){const Pt=$[dt];N.__webglColorRenderbuffer[dt]=i.createRenderbuffer(),i.bindRenderbuffer(i.RENDERBUFFER,N.__webglColorRenderbuffer[dt]);const At=r.convert(Pt.format,Pt.colorSpace),tt=r.convert(Pt.type),lt=S(Pt.internalFormat,At,tt,Pt.colorSpace,A.isXRRenderTarget===!0),Nt=ot(A);i.renderbufferStorageMultisample(i.RENDERBUFFER,Nt,lt,A.width,A.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,N.__webglColorRenderbuffer[dt])}i.bindRenderbuffer(i.RENDERBUFFER,null),A.depthBuffer&&(N.__webglDepthRenderbuffer=i.createRenderbuffer(),Rt(N.__webglDepthRenderbuffer,A,!0)),e.bindFramebuffer(i.FRAMEBUFFER,null)}}if(H){e.bindTexture(i.TEXTURE_CUBE_MAP,q.__webglTexture),Gt(i.TEXTURE_CUBE_MAP,g);for(let dt=0;dt<6;dt++)if(g.mipmaps&&g.mipmaps.length>0)for(let Pt=0;Pt0)for(let Pt=0;Pt0){if(et(A)===!1){const g=A.textures,N=A.width,q=A.height;let $=i.COLOR_BUFFER_BIT;const H=A.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,wt=n.get(A),dt=g.length>1;if(dt)for(let At=0;At0?e.bindFramebuffer(i.DRAW_FRAMEBUFFER,wt.__webglFramebuffer[0]):e.bindFramebuffer(i.DRAW_FRAMEBUFFER,wt.__webglFramebuffer);for(let At=0;At0&&t.has("WEBGL_multisampled_render_to_texture")===!0&&g.__useRenderToTexture!==!1}function vt(A){const g=a.render.frame;h.get(A)!==g&&(h.set(A,g),A.update())}function ft(A,g){const N=A.colorSpace,q=A.format,$=A.type;return A.isCompressedTexture===!0||A.isVideoTexture===!0||N!==Ri&&N!==Ln&&($t.getTransfer(N)===ne?(q!==tn||$!==hn)&&Bt("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):de("WebGLTextures: Unsupported texture color space:",N)),g}function Mt(A){return typeof HTMLImageElement<"u"&&A instanceof HTMLImageElement?(c.width=A.naturalWidth||A.width,c.height=A.naturalHeight||A.height):typeof VideoFrame<"u"&&A instanceof VideoFrame?(c.width=A.displayWidth,c.height=A.displayHeight):(c.width=A.width,c.height=A.height),c}this.allocateTextureUnit=z,this.resetTextureUnits=O,this.setTexture2D=W,this.setTexture2DArray=Y,this.setTexture3D=nt,this.setTextureCube=X,this.rebindTextures=Qt,this.setupRenderTarget=Ct,this.updateRenderTargetMipmap=B,this.updateMultisampleRenderTarget=Q,this.setupDepthRenderbuffer=kt,this.setupFrameBufferTexture=xt,this.useMultisampledRTT=et}function om(i,t){function e(n,s=Ln){let r;const a=$t.getTransfer(s);if(n===hn)return i.UNSIGNED_BYTE;if(n===Ba)return i.UNSIGNED_SHORT_4_4_4_4;if(n===za)return i.UNSIGNED_SHORT_5_5_5_1;if(n===Cc)return i.UNSIGNED_INT_5_9_9_9_REV;if(n===Pc)return i.UNSIGNED_INT_10F_11F_11F_REV;if(n===wc)return i.BYTE;if(n===Rc)return i.SHORT;if(n===Qi)return i.UNSIGNED_SHORT;if(n===Oa)return i.INT;if(n===jn)return i.UNSIGNED_INT;if(n===on)return i.FLOAT;if(n===Di)return i.HALF_FLOAT;if(n===Dc)return i.ALPHA;if(n===Lc)return i.RGB;if(n===tn)return i.RGBA;if(n===es)return i.DEPTH_COMPONENT;if(n===ns)return i.DEPTH_STENCIL;if(n===Va)return i.RED;if(n===Ga)return i.RED_INTEGER;if(n===ka)return i.RG;if(n===Ha)return i.RG_INTEGER;if(n===Wa)return i.RGBA_INTEGER;if(n===Bs||n===zs||n===Vs||n===Gs)if(a===ne)if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Bs)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===zs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Vs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Gs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=t.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Bs)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===zs)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Vs)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Gs)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===ta||n===ea||n===na||n===ia)if(r=t.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===ta)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===ea)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===na)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===ia)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===sa||n===ra||n===aa)if(r=t.get("WEBGL_compressed_texture_etc"),r!==null){if(n===sa||n===ra)return a===ne?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===aa)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===oa||n===ca||n===la||n===ha||n===ua||n===fa||n===da||n===pa||n===ma||n===xa||n===ga||n===_a||n===va||n===Ma)if(r=t.get("WEBGL_compressed_texture_astc"),r!==null){if(n===oa)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===ca)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===la)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===ha)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===ua)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===fa)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===da)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===pa)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===ma)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===xa)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===ga)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===_a)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===va)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Ma)return a===ne?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Sa||n===ya||n===ba)if(r=t.get("EXT_texture_compression_bptc"),r!==null){if(n===Sa)return a===ne?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===ya)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===ba)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Ea||n===Ta||n===Aa||n===wa)if(r=t.get("EXT_texture_compression_rgtc"),r!==null){if(n===Ea)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Ta)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Aa)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===wa)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===ts?i.UNSIGNED_INT_24_8:i[n]!==void 0?i[n]:null}return{convert:e}}const cm=` -void main() { - - gl_Position = vec4( position, 1.0 ); - -}`,lm=` -uniform sampler2DArray depthColor; -uniform float depthWidth; -uniform float depthHeight; - -void main() { - - vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); - - if ( coord.x >= 1.0 ) { - - gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; - - } else { - - gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; - - } - -}`;class hm{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(t,e){if(this.texture===null){const n=new qc(t.texture);(t.depthNear!==e.depthNear||t.depthFar!==e.depthFar)&&(this.depthNear=t.depthNear,this.depthFar=t.depthFar),this.texture=n}}getMesh(t){if(this.texture!==null&&this.mesh===null){const e=t.cameras[0].viewport,n=new En({vertexShader:cm,fragmentShader:lm,uniforms:{depthColor:{value:this.texture},depthWidth:{value:e.z},depthHeight:{value:e.w}}});this.mesh=new Vt(new Nn(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class um extends ti{constructor(t,e){super();const n=this;let s=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,u=null,d=null,p=null,x=null;const _=typeof XRWebGLBinding<"u",m=new hm,f={},b=e.getContextAttributes();let S=null,T=null;const R=[],w=[],L=new at;let F=null;const E=new ke;E.viewport=new se;const M=new ke;M.viewport=new se;const P=[E,M],O=new wu;let z=null,k=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(K){let J=R[K];return J===void 0&&(J=new Tr,R[K]=J),J.getTargetRaySpace()},this.getControllerGrip=function(K){let J=R[K];return J===void 0&&(J=new Tr,R[K]=J),J.getGripSpace()},this.getHand=function(K){let J=R[K];return J===void 0&&(J=new Tr,R[K]=J),J.getHandSpace()};function W(K){const J=w.indexOf(K.inputSource);if(J===-1)return;const xt=R[J];xt!==void 0&&(xt.update(K.inputSource,K.frame,c||a),xt.dispatchEvent({type:K.type,data:K.inputSource}))}function Y(){s.removeEventListener("select",W),s.removeEventListener("selectstart",W),s.removeEventListener("selectend",W),s.removeEventListener("squeeze",W),s.removeEventListener("squeezestart",W),s.removeEventListener("squeezeend",W),s.removeEventListener("end",Y),s.removeEventListener("inputsourceschange",nt);for(let K=0;K=0&&(w[Rt]=null,R[Rt].disconnect(xt))}for(let J=0;J=w.length){w.push(xt),Rt=kt;break}else if(w[kt]===null){w[kt]=xt,Rt=kt;break}if(Rt===-1)break}const Tt=R[Rt];Tt&&Tt.connect(xt)}}const X=new D,rt=new D;function st(K,J,xt){X.setFromMatrixPosition(J.matrixWorld),rt.setFromMatrixPosition(xt.matrixWorld);const Rt=X.distanceTo(rt),Tt=J.projectionMatrix.elements,kt=xt.projectionMatrix.elements,Qt=Tt[14]/(Tt[10]-1),Ct=Tt[14]/(Tt[10]+1),B=(Tt[9]+1)/Tt[5],y=(Tt[9]-1)/Tt[5],Z=(Tt[8]-1)/Tt[0],Q=(kt[8]+1)/kt[0],ot=Qt*Z,et=Qt*Q,vt=Rt/(-Z+Q),ft=vt*-Z;if(J.matrixWorld.decompose(K.position,K.quaternion,K.scale),K.translateX(ft),K.translateZ(vt),K.matrixWorld.compose(K.position,K.quaternion,K.scale),K.matrixWorldInverse.copy(K.matrixWorld).invert(),Tt[10]===-1)K.projectionMatrix.copy(J.projectionMatrix),K.projectionMatrixInverse.copy(J.projectionMatrixInverse);else{const Mt=Qt+vt,A=Ct+vt,g=ot-ft,N=et+(Rt-ft),q=B*Ct/A*Mt,$=y*Ct/A*Mt;K.projectionMatrix.makePerspective(g,N,q,$,Mt,A),K.projectionMatrixInverse.copy(K.projectionMatrix).invert()}}function St(K,J){J===null?K.matrixWorld.copy(K.matrix):K.matrixWorld.multiplyMatrices(J.matrixWorld,K.matrix),K.matrixWorldInverse.copy(K.matrixWorld).invert()}this.updateCamera=function(K){if(s===null)return;let J=K.near,xt=K.far;m.texture!==null&&(m.depthNear>0&&(J=m.depthNear),m.depthFar>0&&(xt=m.depthFar)),O.near=M.near=E.near=J,O.far=M.far=E.far=xt,(z!==O.near||k!==O.far)&&(s.updateRenderState({depthNear:O.near,depthFar:O.far}),z=O.near,k=O.far),O.layers.mask=K.layers.mask|6,E.layers.mask=O.layers.mask&3,M.layers.mask=O.layers.mask&5;const Rt=K.parent,Tt=O.cameras;St(O,Rt);for(let kt=0;kt0&&(m.alphaTest.value=f.alphaTest);const b=t.get(f),S=b.envMap,T=b.envMapRotation;S&&(m.envMap.value=S,Xn.copy(T),Xn.x*=-1,Xn.y*=-1,Xn.z*=-1,S.isCubeTexture&&S.isRenderTargetTexture===!1&&(Xn.y*=-1,Xn.z*=-1),m.envMapRotation.value.setFromMatrix4(fm.makeRotationFromEuler(Xn)),m.flipEnvMap.value=S.isCubeTexture&&S.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=f.reflectivity,m.ior.value=f.ior,m.refractionRatio.value=f.refractionRatio),f.lightMap&&(m.lightMap.value=f.lightMap,m.lightMapIntensity.value=f.lightMapIntensity,e(f.lightMap,m.lightMapTransform)),f.aoMap&&(m.aoMap.value=f.aoMap,m.aoMapIntensity.value=f.aoMapIntensity,e(f.aoMap,m.aoMapTransform))}function a(m,f){m.diffuse.value.copy(f.color),m.opacity.value=f.opacity,f.map&&(m.map.value=f.map,e(f.map,m.mapTransform))}function o(m,f){m.dashSize.value=f.dashSize,m.totalSize.value=f.dashSize+f.gapSize,m.scale.value=f.scale}function l(m,f,b,S){m.diffuse.value.copy(f.color),m.opacity.value=f.opacity,m.size.value=f.size*b,m.scale.value=S*.5,f.map&&(m.map.value=f.map,e(f.map,m.uvTransform)),f.alphaMap&&(m.alphaMap.value=f.alphaMap,e(f.alphaMap,m.alphaMapTransform)),f.alphaTest>0&&(m.alphaTest.value=f.alphaTest)}function c(m,f){m.diffuse.value.copy(f.color),m.opacity.value=f.opacity,m.rotation.value=f.rotation,f.map&&(m.map.value=f.map,e(f.map,m.mapTransform)),f.alphaMap&&(m.alphaMap.value=f.alphaMap,e(f.alphaMap,m.alphaMapTransform)),f.alphaTest>0&&(m.alphaTest.value=f.alphaTest)}function h(m,f){m.specular.value.copy(f.specular),m.shininess.value=Math.max(f.shininess,1e-4)}function u(m,f){f.gradientMap&&(m.gradientMap.value=f.gradientMap)}function d(m,f){m.metalness.value=f.metalness,f.metalnessMap&&(m.metalnessMap.value=f.metalnessMap,e(f.metalnessMap,m.metalnessMapTransform)),m.roughness.value=f.roughness,f.roughnessMap&&(m.roughnessMap.value=f.roughnessMap,e(f.roughnessMap,m.roughnessMapTransform)),f.envMap&&(m.envMapIntensity.value=f.envMapIntensity)}function p(m,f,b){m.ior.value=f.ior,f.sheen>0&&(m.sheenColor.value.copy(f.sheenColor).multiplyScalar(f.sheen),m.sheenRoughness.value=f.sheenRoughness,f.sheenColorMap&&(m.sheenColorMap.value=f.sheenColorMap,e(f.sheenColorMap,m.sheenColorMapTransform)),f.sheenRoughnessMap&&(m.sheenRoughnessMap.value=f.sheenRoughnessMap,e(f.sheenRoughnessMap,m.sheenRoughnessMapTransform))),f.clearcoat>0&&(m.clearcoat.value=f.clearcoat,m.clearcoatRoughness.value=f.clearcoatRoughness,f.clearcoatMap&&(m.clearcoatMap.value=f.clearcoatMap,e(f.clearcoatMap,m.clearcoatMapTransform)),f.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=f.clearcoatRoughnessMap,e(f.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),f.clearcoatNormalMap&&(m.clearcoatNormalMap.value=f.clearcoatNormalMap,e(f.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(f.clearcoatNormalScale),f.side===Le&&m.clearcoatNormalScale.value.negate())),f.dispersion>0&&(m.dispersion.value=f.dispersion),f.iridescence>0&&(m.iridescence.value=f.iridescence,m.iridescenceIOR.value=f.iridescenceIOR,m.iridescenceThicknessMinimum.value=f.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=f.iridescenceThicknessRange[1],f.iridescenceMap&&(m.iridescenceMap.value=f.iridescenceMap,e(f.iridescenceMap,m.iridescenceMapTransform)),f.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=f.iridescenceThicknessMap,e(f.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),f.transmission>0&&(m.transmission.value=f.transmission,m.transmissionSamplerMap.value=b.texture,m.transmissionSamplerSize.value.set(b.width,b.height),f.transmissionMap&&(m.transmissionMap.value=f.transmissionMap,e(f.transmissionMap,m.transmissionMapTransform)),m.thickness.value=f.thickness,f.thicknessMap&&(m.thicknessMap.value=f.thicknessMap,e(f.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=f.attenuationDistance,m.attenuationColor.value.copy(f.attenuationColor)),f.anisotropy>0&&(m.anisotropyVector.value.set(f.anisotropy*Math.cos(f.anisotropyRotation),f.anisotropy*Math.sin(f.anisotropyRotation)),f.anisotropyMap&&(m.anisotropyMap.value=f.anisotropyMap,e(f.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=f.specularIntensity,m.specularColor.value.copy(f.specularColor),f.specularColorMap&&(m.specularColorMap.value=f.specularColorMap,e(f.specularColorMap,m.specularColorMapTransform)),f.specularIntensityMap&&(m.specularIntensityMap.value=f.specularIntensityMap,e(f.specularIntensityMap,m.specularIntensityMapTransform))}function x(m,f){f.matcap&&(m.matcap.value=f.matcap)}function _(m,f){const b=t.get(f).light;m.referencePosition.value.setFromMatrixPosition(b.matrixWorld),m.nearDistance.value=b.shadow.camera.near,m.farDistance.value=b.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function pm(i,t,e,n){let s={},r={},a=[];const o=i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS);function l(b,S){const T=S.program;n.uniformBlockBinding(b,T)}function c(b,S){let T=s[b.id];T===void 0&&(x(b),T=h(b),s[b.id]=T,b.addEventListener("dispose",m));const R=S.program;n.updateUBOMapping(b,R);const w=t.render.frame;r[b.id]!==w&&(d(b),r[b.id]=w)}function h(b){const S=u();b.__bindingPointIndex=S;const T=i.createBuffer(),R=b.__size,w=b.usage;return i.bindBuffer(i.UNIFORM_BUFFER,T),i.bufferData(i.UNIFORM_BUFFER,R,w),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,S,T),T}function u(){for(let b=0;b0&&(T+=R-w),b.__size=T,b.__cache={},this}function _(b){const S={boundary:0,storage:0};return typeof b=="number"||typeof b=="boolean"?(S.boundary=4,S.storage=4):b.isVector2?(S.boundary=8,S.storage=8):b.isVector3||b.isColor?(S.boundary=16,S.storage=12):b.isVector4?(S.boundary=16,S.storage=16):b.isMatrix3?(S.boundary=48,S.storage=48):b.isMatrix4?(S.boundary=64,S.storage=64):b.isTexture?Bt("WebGLRenderer: Texture samplers can not be part of an uniforms group."):Bt("WebGLRenderer: Unsupported uniform value type.",b),S}function m(b){const S=b.target;S.removeEventListener("dispose",m);const T=a.indexOf(S.__bindingPointIndex);a.splice(T,1),i.deleteBuffer(s[S.id]),delete s[S.id],delete r[S.id]}function f(){for(const b in s)i.deleteBuffer(s[b]);a=[],s={},r={}}return{bind:l,update:c,dispose:f}}const mm=new Uint16Array([11481,15204,11534,15171,11808,15015,12385,14843,12894,14716,13396,14600,13693,14483,13976,14366,14237,14171,14405,13961,14511,13770,14605,13598,14687,13444,14760,13305,14822,13066,14876,12857,14923,12675,14963,12517,14997,12379,15025,12230,15049,12023,15070,11843,15086,11687,15100,11551,15111,11433,15120,11330,15127,11217,15132,11060,15135,10922,15138,10801,15139,10695,15139,10600,13012,14923,13020,14917,13064,14886,13176,14800,13349,14666,13513,14526,13724,14398,13960,14230,14200,14020,14383,13827,14488,13651,14583,13491,14667,13348,14740,13132,14803,12908,14856,12713,14901,12542,14938,12394,14968,12241,14992,12017,15010,11822,15024,11654,15034,11507,15041,11380,15044,11269,15044,11081,15042,10913,15037,10764,15031,10635,15023,10520,15014,10419,15003,10330,13657,14676,13658,14673,13670,14660,13698,14622,13750,14547,13834,14442,13956,14317,14112,14093,14291,13889,14407,13704,14499,13538,14586,13389,14664,13201,14733,12966,14792,12758,14842,12577,14882,12418,14915,12272,14940,12033,14959,11826,14972,11646,14980,11490,14983,11355,14983,11212,14979,11008,14971,10830,14961,10675,14950,10540,14936,10420,14923,10315,14909,10204,14894,10041,14089,14460,14090,14459,14096,14452,14112,14431,14141,14388,14186,14305,14252,14130,14341,13941,14399,13756,14467,13585,14539,13430,14610,13272,14677,13026,14737,12808,14790,12617,14833,12449,14869,12303,14896,12065,14916,11845,14929,11655,14937,11490,14939,11347,14936,11184,14930,10970,14921,10783,14912,10621,14900,10480,14885,10356,14867,10247,14848,10062,14827,9894,14805,9745,14400,14208,14400,14206,14402,14198,14406,14174,14415,14122,14427,14035,14444,13913,14469,13767,14504,13613,14548,13463,14598,13324,14651,13082,14704,12858,14752,12658,14795,12483,14831,12330,14860,12106,14881,11875,14895,11675,14903,11501,14905,11351,14903,11178,14900,10953,14892,10757,14880,10589,14865,10442,14847,10313,14827,10162,14805,9965,14782,9792,14757,9642,14731,9507,14562,13883,14562,13883,14563,13877,14566,13862,14570,13830,14576,13773,14584,13689,14595,13582,14613,13461,14637,13336,14668,13120,14704,12897,14741,12695,14776,12516,14808,12358,14835,12150,14856,11910,14870,11701,14878,11519,14882,11361,14884,11187,14880,10951,14871,10748,14858,10572,14842,10418,14823,10286,14801,10099,14777,9897,14751,9722,14725,9567,14696,9430,14666,9309,14702,13604,14702,13604,14702,13600,14703,13591,14705,13570,14707,13533,14709,13477,14712,13400,14718,13305,14727,13106,14743,12907,14762,12716,14784,12539,14807,12380,14827,12190,14844,11943,14855,11727,14863,11539,14870,11376,14871,11204,14868,10960,14858,10748,14845,10565,14829,10406,14809,10269,14786,10058,14761,9852,14734,9671,14705,9512,14674,9374,14641,9253,14608,9076,14821,13366,14821,13365,14821,13364,14821,13358,14821,13344,14821,13320,14819,13252,14817,13145,14815,13011,14814,12858,14817,12698,14823,12539,14832,12389,14841,12214,14850,11968,14856,11750,14861,11558,14866,11390,14867,11226,14862,10972,14853,10754,14840,10565,14823,10401,14803,10259,14780,10032,14754,9820,14725,9635,14694,9473,14661,9333,14627,9203,14593,8988,14557,8798,14923,13014,14922,13014,14922,13012,14922,13004,14920,12987,14919,12957,14915,12907,14909,12834,14902,12738,14894,12623,14888,12498,14883,12370,14880,12203,14878,11970,14875,11759,14873,11569,14874,11401,14872,11243,14865,10986,14855,10762,14842,10568,14825,10401,14804,10255,14781,10017,14754,9799,14725,9611,14692,9445,14658,9301,14623,9139,14587,8920,14548,8729,14509,8562,15008,12672,15008,12672,15008,12671,15007,12667,15005,12656,15001,12637,14997,12605,14989,12556,14978,12490,14966,12407,14953,12313,14940,12136,14927,11934,14914,11742,14903,11563,14896,11401,14889,11247,14879,10992,14866,10767,14851,10570,14833,10400,14812,10252,14789,10007,14761,9784,14731,9592,14698,9424,14663,9279,14627,9088,14588,8868,14548,8676,14508,8508,14467,8360,15080,12386,15080,12386,15079,12385,15078,12383,15076,12378,15072,12367,15066,12347,15057,12315,15045,12253,15030,12138,15012,11998,14993,11845,14972,11685,14951,11530,14935,11383,14920,11228,14904,10981,14887,10762,14870,10567,14850,10397,14827,10248,14803,9997,14774,9771,14743,9578,14710,9407,14674,9259,14637,9048,14596,8826,14555,8632,14514,8464,14471,8317,14427,8182,15139,12008,15139,12008,15138,12008,15137,12007,15135,12003,15130,11990,15124,11969,15115,11929,15102,11872,15086,11794,15064,11693,15041,11581,15013,11459,14987,11336,14966,11170,14944,10944,14921,10738,14898,10552,14875,10387,14850,10239,14824,9983,14794,9758,14762,9563,14728,9392,14692,9244,14653,9014,14611,8791,14569,8597,14526,8427,14481,8281,14436,8110,14391,7885,15188,11617,15188,11617,15187,11617,15186,11618,15183,11617,15179,11612,15173,11601,15163,11581,15150,11546,15133,11495,15110,11427,15083,11346,15051,11246,15024,11057,14996,10868,14967,10687,14938,10517,14911,10362,14882,10206,14853,9956,14821,9737,14787,9543,14752,9375,14715,9228,14675,8980,14632,8760,14589,8565,14544,8395,14498,8248,14451,8049,14404,7824,14357,7630,15228,11298,15228,11298,15227,11299,15226,11301,15223,11303,15219,11302,15213,11299,15204,11290,15191,11271,15174,11217,15150,11129,15119,11015,15087,10886,15057,10744,15024,10599,14990,10455,14957,10318,14924,10143,14891,9911,14856,9701,14820,9516,14782,9352,14744,9200,14703,8946,14659,8725,14615,8533,14568,8366,14521,8220,14472,7992,14423,7770,14374,7578,14315,7408,15260,10819,15260,10819,15259,10822,15258,10826,15256,10832,15251,10836,15246,10841,15237,10838,15225,10821,15207,10788,15183,10734,15151,10660,15120,10571,15087,10469,15049,10359,15012,10249,14974,10041,14937,9837,14900,9647,14860,9475,14820,9320,14779,9147,14736,8902,14691,8688,14646,8499,14598,8335,14549,8189,14499,7940,14448,7720,14397,7529,14347,7363,14256,7218,15285,10410,15285,10411,15285,10413,15284,10418,15282,10425,15278,10434,15272,10442,15264,10449,15252,10445,15235,10433,15210,10403,15179,10358,15149,10301,15113,10218,15073,10059,15033,9894,14991,9726,14951,9565,14909,9413,14865,9273,14822,9073,14777,8845,14730,8641,14682,8459,14633,8300,14583,8129,14531,7883,14479,7670,14426,7482,14373,7321,14305,7176,14201,6939,15305,9939,15305,9940,15305,9945,15304,9955,15302,9967,15298,9989,15293,10010,15286,10033,15274,10044,15258,10045,15233,10022,15205,9975,15174,9903,15136,9808,15095,9697,15053,9578,15009,9451,14965,9327,14918,9198,14871,8973,14825,8766,14775,8579,14725,8408,14675,8259,14622,8058,14569,7821,14515,7615,14460,7435,14405,7276,14350,7108,14256,6866,14149,6653,15321,9444,15321,9445,15321,9448,15320,9458,15317,9470,15314,9490,15310,9515,15302,9540,15292,9562,15276,9579,15251,9577,15226,9559,15195,9519,15156,9463,15116,9389,15071,9304,15025,9208,14978,9023,14927,8838,14878,8661,14827,8496,14774,8344,14722,8206,14667,7973,14612,7749,14556,7555,14499,7382,14443,7229,14385,7025,14322,6791,14210,6588,14100,6409,15333,8920,15333,8921,15332,8927,15332,8943,15329,8965,15326,9002,15322,9048,15316,9106,15307,9162,15291,9204,15267,9221,15244,9221,15212,9196,15175,9134,15133,9043,15088,8930,15040,8801,14990,8665,14938,8526,14886,8391,14830,8261,14775,8087,14719,7866,14661,7664,14603,7482,14544,7322,14485,7178,14426,6936,14367,6713,14281,6517,14166,6348,14054,6198,15341,8360,15341,8361,15341,8366,15341,8379,15339,8399,15336,8431,15332,8473,15326,8527,15318,8585,15302,8632,15281,8670,15258,8690,15227,8690,15191,8664,15149,8612,15104,8543,15055,8456,15001,8360,14948,8259,14892,8122,14834,7923,14776,7734,14716,7558,14656,7397,14595,7250,14534,7070,14472,6835,14410,6628,14350,6443,14243,6283,14125,6135,14010,5889,15348,7715,15348,7717,15348,7725,15347,7745,15345,7780,15343,7836,15339,7905,15334,8e3,15326,8103,15310,8193,15293,8239,15270,8270,15240,8287,15204,8283,15163,8260,15118,8223,15067,8143,15014,8014,14958,7873,14899,7723,14839,7573,14778,7430,14715,7293,14652,7164,14588,6931,14524,6720,14460,6531,14396,6362,14330,6210,14207,6015,14086,5781,13969,5576,15352,7114,15352,7116,15352,7128,15352,7159,15350,7195,15348,7237,15345,7299,15340,7374,15332,7457,15317,7544,15301,7633,15280,7703,15251,7754,15216,7775,15176,7767,15131,7733,15079,7670,15026,7588,14967,7492,14906,7387,14844,7278,14779,7171,14714,6965,14648,6770,14581,6587,14515,6420,14448,6269,14382,6123,14299,5881,14172,5665,14049,5477,13929,5310,15355,6329,15355,6330,15355,6339,15355,6362,15353,6410,15351,6472,15349,6572,15344,6688,15337,6835,15323,6985,15309,7142,15287,7220,15260,7277,15226,7310,15188,7326,15142,7318,15090,7285,15036,7239,14976,7177,14914,7045,14849,6892,14782,6736,14714,6581,14645,6433,14576,6293,14506,6164,14438,5946,14369,5733,14270,5540,14140,5369,14014,5216,13892,5043,15357,5483,15357,5484,15357,5496,15357,5528,15356,5597,15354,5692,15351,5835,15347,6011,15339,6195,15328,6317,15314,6446,15293,6566,15268,6668,15235,6746,15197,6796,15152,6811,15101,6790,15046,6748,14985,6673,14921,6583,14854,6479,14785,6371,14714,6259,14643,6149,14571,5946,14499,5750,14428,5567,14358,5401,14242,5250,14109,5111,13980,4870,13856,4657,15359,4555,15359,4557,15358,4573,15358,4633,15357,4715,15355,4841,15353,5061,15349,5216,15342,5391,15331,5577,15318,5770,15299,5967,15274,6150,15243,6223,15206,6280,15161,6310,15111,6317,15055,6300,14994,6262,14928,6208,14860,6141,14788,5994,14715,5838,14641,5684,14566,5529,14492,5384,14418,5247,14346,5121,14216,4892,14079,4682,13948,4496,13822,4330,15359,3498,15359,3501,15359,3520,15359,3598,15358,3719,15356,3860,15355,4137,15351,4305,15344,4563,15334,4809,15321,5116,15303,5273,15280,5418,15250,5547,15214,5653,15170,5722,15120,5761,15064,5763,15002,5733,14935,5673,14865,5597,14792,5504,14716,5400,14640,5294,14563,5185,14486,5041,14410,4841,14335,4655,14191,4482,14051,4325,13918,4183,13790,4012,15360,2282,15360,2285,15360,2306,15360,2401,15359,2547,15357,2748,15355,3103,15352,3349,15345,3675,15336,4020,15324,4272,15307,4496,15285,4716,15255,4908,15220,5086,15178,5170,15128,5214,15072,5234,15010,5231,14943,5206,14871,5166,14796,5102,14718,4971,14639,4833,14559,4687,14480,4541,14402,4401,14315,4268,14167,4142,14025,3958,13888,3747,13759,3556,15360,923,15360,925,15360,946,15360,1052,15359,1214,15357,1494,15356,1892,15352,2274,15346,2663,15338,3099,15326,3393,15309,3679,15288,3980,15260,4183,15226,4325,15185,4437,15136,4517,15080,4570,15018,4591,14950,4581,14877,4545,14800,4485,14720,4411,14638,4325,14556,4231,14475,4136,14395,3988,14297,3803,14145,3628,13999,3465,13861,3314,13729,3177,15360,263,15360,264,15360,272,15360,325,15359,407,15358,548,15356,780,15352,1144,15347,1580,15339,2099,15328,2425,15312,2795,15292,3133,15264,3329,15232,3517,15191,3689,15143,3819,15088,3923,15025,3978,14956,3999,14882,3979,14804,3931,14722,3855,14639,3756,14554,3645,14470,3529,14388,3409,14279,3289,14124,3173,13975,3055,13834,2848,13701,2658,15360,49,15360,49,15360,52,15360,75,15359,111,15358,201,15356,283,15353,519,15348,726,15340,1045,15329,1415,15314,1795,15295,2173,15269,2410,15237,2649,15197,2866,15150,3054,15095,3140,15032,3196,14963,3228,14888,3236,14808,3224,14725,3191,14639,3146,14553,3088,14466,2976,14382,2836,14262,2692,14103,2549,13952,2409,13808,2278,13674,2154,15360,4,15360,4,15360,4,15360,13,15359,33,15358,59,15357,112,15353,199,15348,302,15341,456,15331,628,15316,827,15297,1082,15272,1332,15241,1601,15202,1851,15156,2069,15101,2172,15039,2256,14970,2314,14894,2348,14813,2358,14728,2344,14640,2311,14551,2263,14463,2203,14376,2133,14247,2059,14084,1915,13930,1761,13784,1609,13648,1464,15360,0,15360,0,15360,0,15360,3,15359,18,15358,26,15357,53,15354,80,15348,97,15341,165,15332,238,15318,326,15299,427,15275,529,15245,654,15207,771,15161,885,15108,994,15046,1089,14976,1170,14900,1229,14817,1266,14731,1284,14641,1282,14550,1260,14460,1223,14370,1174,14232,1116,14066,1050,13909,981,13761,910,13623,839]);let gn=null;function xm(){return gn===null&&(gn=new Hc(mm,32,32,ka,Di),gn.minFilter=Ye,gn.magFilter=Ye,gn.wrapS=Sn,gn.wrapT=Sn,gn.generateMipmaps=!1,gn.needsUpdate=!0),gn}class gm{constructor(t={}){const{canvas:e=sh(),context:n=null,depth:s=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:u=!1,reversedDepthBuffer:d=!1}=t;this.isWebGLRenderer=!0;let p;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");p=n.getContextAttributes().alpha}else p=a;const x=new Set([Wa,Ha,Ga]),_=new Set([hn,jn,Qi,ts,Ba,za]),m=new Uint32Array(4),f=new Int32Array(4);let b=null,S=null;const T=[],R=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=Un,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const w=this;let L=!1;this._outputColorSpace=De;let F=0,E=0,M=null,P=-1,O=null;const z=new se,k=new se;let W=null;const Y=new Yt(0);let nt=0,X=e.width,rt=e.height,st=1,St=null,Gt=null;const qt=new se(0,0,X,rt),jt=new se(0,0,X,rt);let Kt=!1;const K=new Za;let J=!1,xt=!1;const Rt=new re,Tt=new D,kt=new se,Qt={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let Ct=!1;function B(){return M===null?st:1}let y=n;function Z(v,I){return e.getContext(v,I)}try{const v={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:u};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Na}`),e.addEventListener("webglcontextlost",it,!1),e.addEventListener("webglcontextrestored",j,!1),e.addEventListener("webglcontextcreationerror",bt,!1),y===null){const I="webgl2";if(y=Z(I,v),y===null)throw Z(I)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(v){throw v("WebGLRenderer: "+v.message),v}let Q,ot,et,vt,ft,Mt,A,g,N,q,$,H,wt,dt,Pt,At,tt,lt,Nt,It,_t,Ot,C,mt;function ht(){Q=new Tp(y),Q.init(),Ot=new om(y,Q),ot=new xp(y,Q,t,Ot),et=new rm(y,Q),ot.reversedDepthBuffer&&d&&et.buffers.depth.setReversed(!0),vt=new Rp(y),ft=new q0,Mt=new am(y,Q,et,ft,ot,Ot,vt),A=new _p(w),g=new Ep(w),N=new Du(y),C=new pp(y,N),q=new Ap(y,N,vt,C),$=new Pp(y,q,N,vt),Nt=new Cp(y,ot,Mt),At=new gp(ft),H=new X0(w,A,g,Q,ot,C,At),wt=new dm(w,ft),dt=new Z0,Pt=new tm(Q),lt=new dp(w,A,g,et,$,p,l),tt=new im(w,$,ot),mt=new pm(y,vt,ot,et),It=new mp(y,Q,vt),_t=new wp(y,Q,vt),vt.programs=H.programs,w.capabilities=ot,w.extensions=Q,w.properties=ft,w.renderLists=dt,w.shadowMap=tt,w.state=et,w.info=vt}ht();const ut=new um(w,y);this.xr=ut,this.getContext=function(){return y},this.getContextAttributes=function(){return y.getContextAttributes()},this.forceContextLoss=function(){const v=Q.get("WEBGL_lose_context");v&&v.loseContext()},this.forceContextRestore=function(){const v=Q.get("WEBGL_lose_context");v&&v.restoreContext()},this.getPixelRatio=function(){return st},this.setPixelRatio=function(v){v!==void 0&&(st=v,this.setSize(X,rt,!1))},this.getSize=function(v){return v.set(X,rt)},this.setSize=function(v,I,V=!0){if(ut.isPresenting){Bt("WebGLRenderer: Can't change size while VR device is presenting.");return}X=v,rt=I,e.width=Math.floor(v*st),e.height=Math.floor(I*st),V===!0&&(e.style.width=v+"px",e.style.height=I+"px"),this.setViewport(0,0,v,I)},this.getDrawingBufferSize=function(v){return v.set(X*st,rt*st).floor()},this.setDrawingBufferSize=function(v,I,V){X=v,rt=I,st=V,e.width=Math.floor(v*V),e.height=Math.floor(I*V),this.setViewport(0,0,v,I)},this.getCurrentViewport=function(v){return v.copy(z)},this.getViewport=function(v){return v.copy(qt)},this.setViewport=function(v,I,V,G){v.isVector4?qt.set(v.x,v.y,v.z,v.w):qt.set(v,I,V,G),et.viewport(z.copy(qt).multiplyScalar(st).round())},this.getScissor=function(v){return v.copy(jt)},this.setScissor=function(v,I,V,G){v.isVector4?jt.set(v.x,v.y,v.z,v.w):jt.set(v,I,V,G),et.scissor(k.copy(jt).multiplyScalar(st).round())},this.getScissorTest=function(){return Kt},this.setScissorTest=function(v){et.setScissorTest(Kt=v)},this.setOpaqueSort=function(v){St=v},this.setTransparentSort=function(v){Gt=v},this.getClearColor=function(v){return v.copy(lt.getClearColor())},this.setClearColor=function(){lt.setClearColor(...arguments)},this.getClearAlpha=function(){return lt.getClearAlpha()},this.setClearAlpha=function(){lt.setClearAlpha(...arguments)},this.clear=function(v=!0,I=!0,V=!0){let G=0;if(v){let U=!1;if(M!==null){const ct=M.texture.format;U=x.has(ct)}if(U){const ct=M.texture.type,gt=_.has(ct),Et=lt.getClearColor(),yt=lt.getClearAlpha(),Ut=Et.r,Ft=Et.g,Dt=Et.b;gt?(m[0]=Ut,m[1]=Ft,m[2]=Dt,m[3]=yt,y.clearBufferuiv(y.COLOR,0,m)):(f[0]=Ut,f[1]=Ft,f[2]=Dt,f[3]=yt,y.clearBufferiv(y.COLOR,0,f))}else G|=y.COLOR_BUFFER_BIT}I&&(G|=y.DEPTH_BUFFER_BIT),V&&(G|=y.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),y.clear(G)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",it,!1),e.removeEventListener("webglcontextrestored",j,!1),e.removeEventListener("webglcontextcreationerror",bt,!1),lt.dispose(),dt.dispose(),Pt.dispose(),ft.dispose(),A.dispose(),g.dispose(),$.dispose(),C.dispose(),mt.dispose(),H.dispose(),ut.dispose(),ut.removeEventListener("sessionstart",to),ut.removeEventListener("sessionend",eo),Bn.stop()};function it(v){v.preventDefault(),go("WebGLRenderer: Context Lost."),L=!0}function j(){go("WebGLRenderer: Context Restored."),L=!1;const v=vt.autoReset,I=tt.enabled,V=tt.autoUpdate,G=tt.needsUpdate,U=tt.type;ht(),vt.autoReset=v,tt.enabled=I,tt.autoUpdate=V,tt.needsUpdate=G,tt.type=U}function bt(v){de("WebGLRenderer: A WebGL context could not be created. Reason: ",v.statusMessage)}function zt(v){const I=v.target;I.removeEventListener("dispose",zt),ce(I)}function ce(v){te(v),ft.remove(v)}function te(v){const I=ft.get(v).programs;I!==void 0&&(I.forEach(function(V){H.releaseProgram(V)}),v.isShaderMaterial&&H.releaseShaderCache(v))}this.renderBufferDirect=function(v,I,V,G,U,ct){I===null&&(I=Qt);const gt=U.isMesh&&U.matrixWorld.determinant()<0,Et=ul(v,I,V,G,U);et.setMaterial(G,gt);let yt=V.index,Ut=1;if(G.wireframe===!0){if(yt=q.getWireframeAttribute(V),yt===void 0)return;Ut=2}const Ft=V.drawRange,Dt=V.attributes.position;let Zt=Ft.start*Ut,ee=(Ft.start+Ft.count)*Ut;ct!==null&&(Zt=Math.max(Zt,ct.start*Ut),ee=Math.min(ee,(ct.start+ct.count)*Ut)),yt!==null?(Zt=Math.max(Zt,0),ee=Math.min(ee,yt.count)):Dt!=null&&(Zt=Math.max(Zt,0),ee=Math.min(ee,Dt.count));const me=ee-Zt;if(me<0||me===1/0)return;C.setup(U,G,Et,V,yt);let xe,ae=It;if(yt!==null&&(xe=N.get(yt),ae=_t,ae.setIndex(xe)),U.isMesh)G.wireframe===!0?(et.setLineWidth(G.wireframeLinewidth*B()),ae.setMode(y.LINES)):ae.setMode(y.TRIANGLES);else if(U.isLine){let Lt=G.linewidth;Lt===void 0&&(Lt=1),et.setLineWidth(Lt*B()),U.isLineSegments?ae.setMode(y.LINES):U.isLineLoop?ae.setMode(y.LINE_LOOP):ae.setMode(y.LINE_STRIP)}else U.isPoints?ae.setMode(y.POINTS):U.isSprite&&ae.setMode(y.TRIANGLES);if(U.isBatchedMesh)if(U._multiDrawInstances!==null)is("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),ae.renderMultiDrawInstances(U._multiDrawStarts,U._multiDrawCounts,U._multiDrawCount,U._multiDrawInstances);else if(Q.get("WEBGL_multi_draw"))ae.renderMultiDraw(U._multiDrawStarts,U._multiDrawCounts,U._multiDrawCount);else{const Lt=U._multiDrawStarts,ue=U._multiDrawCounts,Jt=U._multiDrawCount,Be=yt?N.get(yt).bytesPerElement:1,ni=ft.get(G).currentProgram.getUniforms();for(let ze=0;ze{function ct(){if(G.forEach(function(gt){ft.get(gt).currentProgram.isReady()&&G.delete(gt)}),G.size===0){U(v);return}setTimeout(ct,10)}Q.get("KHR_parallel_shader_compile")!==null?ct():setTimeout(ct,10)})};let Ze=null;function hl(v){Ze&&Ze(v)}function to(){Bn.stop()}function eo(){Bn.start()}const Bn=new il;Bn.setAnimationLoop(hl),typeof self<"u"&&Bn.setContext(self),this.setAnimationLoop=function(v){Ze=v,ut.setAnimationLoop(v),v===null?Bn.stop():Bn.start()},ut.addEventListener("sessionstart",to),ut.addEventListener("sessionend",eo),this.render=function(v,I){if(I!==void 0&&I.isCamera!==!0){de("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(L===!0)return;if(v.matrixWorldAutoUpdate===!0&&v.updateMatrixWorld(),I.parent===null&&I.matrixWorldAutoUpdate===!0&&I.updateMatrixWorld(),ut.enabled===!0&&ut.isPresenting===!0&&(ut.cameraAutoUpdate===!0&&ut.updateCamera(I),I=ut.getCamera()),v.isScene===!0&&v.onBeforeRender(w,v,I,M),S=Pt.get(v,R.length),S.init(I),R.push(S),Rt.multiplyMatrices(I.projectionMatrix,I.matrixWorldInverse),K.setFromProjectionMatrix(Rt,cn,I.reversedDepth),xt=this.localClippingEnabled,J=At.init(this.clippingPlanes,xt),b=dt.get(v,T.length),b.init(),T.push(b),ut.enabled===!0&&ut.isPresenting===!0){const ct=w.xr.getDepthSensingMesh();ct!==null&&er(ct,I,-1/0,w.sortObjects)}er(v,I,0,w.sortObjects),b.finish(),w.sortObjects===!0&&b.sort(St,Gt),Ct=ut.enabled===!1||ut.isPresenting===!1||ut.hasDepthSensing()===!1,Ct&<.addToRenderList(b,v),this.info.render.frame++,J===!0&&At.beginShadows();const V=S.state.shadowsArray;tt.render(V,v,I),J===!0&&At.endShadows(),this.info.autoReset===!0&&this.info.reset();const G=b.opaque,U=b.transmissive;if(S.setupLights(),I.isArrayCamera){const ct=I.cameras;if(U.length>0)for(let gt=0,Et=ct.length;gt0&&io(G,U,v,I),Ct&<.render(v),no(b,v,I);M!==null&&E===0&&(Mt.updateMultisampleRenderTarget(M),Mt.updateRenderTargetMipmap(M)),v.isScene===!0&&v.onAfterRender(w,v,I),C.resetDefaultState(),P=-1,O=null,R.pop(),R.length>0?(S=R[R.length-1],J===!0&&At.setGlobalState(w.clippingPlanes,S.state.camera)):S=null,T.pop(),T.length>0?b=T[T.length-1]:b=null};function er(v,I,V,G){if(v.visible===!1)return;if(v.layers.test(I.layers)){if(v.isGroup)V=v.renderOrder;else if(v.isLOD)v.autoUpdate===!0&&v.update(I);else if(v.isLight)S.pushLight(v),v.castShadow&&S.pushShadow(v);else if(v.isSprite){if(!v.frustumCulled||K.intersectsSprite(v)){G&&kt.setFromMatrixPosition(v.matrixWorld).applyMatrix4(Rt);const gt=$.update(v),Et=v.material;Et.visible&&b.push(v,gt,Et,V,kt.z,null)}}else if((v.isMesh||v.isLine||v.isPoints)&&(!v.frustumCulled||K.intersectsObject(v))){const gt=$.update(v),Et=v.material;if(G&&(v.boundingSphere!==void 0?(v.boundingSphere===null&&v.computeBoundingSphere(),kt.copy(v.boundingSphere.center)):(gt.boundingSphere===null&>.computeBoundingSphere(),kt.copy(gt.boundingSphere.center)),kt.applyMatrix4(v.matrixWorld).applyMatrix4(Rt)),Array.isArray(Et)){const yt=gt.groups;for(let Ut=0,Ft=yt.length;Ut0&&ls(U,I,V),ct.length>0&&ls(ct,I,V),gt.length>0&&ls(gt,I,V),et.buffers.depth.setTest(!0),et.buffers.depth.setMask(!0),et.buffers.color.setMask(!0),et.setPolygonOffset(!1)}function io(v,I,V,G){if((V.isScene===!0?V.overrideMaterial:null)!==null)return;S.state.transmissionRenderTarget[G.id]===void 0&&(S.state.transmissionRenderTarget[G.id]=new $n(1,1,{generateMipmaps:!0,type:Q.has("EXT_color_buffer_half_float")||Q.has("EXT_color_buffer_float")?Di:hn,minFilter:Kn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:$t.workingColorSpace}));const ct=S.state.transmissionRenderTarget[G.id],gt=G.viewport||z;ct.setSize(gt.z*w.transmissionResolutionScale,gt.w*w.transmissionResolutionScale);const Et=w.getRenderTarget(),yt=w.getActiveCubeFace(),Ut=w.getActiveMipmapLevel();w.setRenderTarget(ct),w.getClearColor(Y),nt=w.getClearAlpha(),nt<1&&w.setClearColor(16777215,.5),w.clear(),Ct&<.render(V);const Ft=w.toneMapping;w.toneMapping=Un;const Dt=G.viewport;if(G.viewport!==void 0&&(G.viewport=void 0),S.setupLightsView(G),J===!0&&At.setGlobalState(w.clippingPlanes,G),ls(v,V,G),Mt.updateMultisampleRenderTarget(ct),Mt.updateRenderTargetMipmap(ct),Q.has("WEBGL_multisampled_render_to_texture")===!1){let Zt=!1;for(let ee=0,me=I.length;ee0),Dt=!!V.morphAttributes.position,Zt=!!V.morphAttributes.normal,ee=!!V.morphAttributes.color;let me=Un;G.toneMapped&&(M===null||M.isXRRenderTarget===!0)&&(me=w.toneMapping);const xe=V.morphAttributes.position||V.morphAttributes.normal||V.morphAttributes.color,ae=xe!==void 0?xe.length:0,Lt=ft.get(G),ue=S.state.lights;if(J===!0&&(xt===!0||v!==O)){const Ce=v===O&&G.id===P;At.setState(G,v,Ce)}let Jt=!1;G.version===Lt.__version?(Lt.needsLights&&Lt.lightsStateVersion!==ue.state.version||Lt.outputColorSpace!==Et||U.isBatchedMesh&&Lt.batching===!1||!U.isBatchedMesh&&Lt.batching===!0||U.isBatchedMesh&&Lt.batchingColor===!0&&U.colorTexture===null||U.isBatchedMesh&&Lt.batchingColor===!1&&U.colorTexture!==null||U.isInstancedMesh&&Lt.instancing===!1||!U.isInstancedMesh&&Lt.instancing===!0||U.isSkinnedMesh&&Lt.skinning===!1||!U.isSkinnedMesh&&Lt.skinning===!0||U.isInstancedMesh&&Lt.instancingColor===!0&&U.instanceColor===null||U.isInstancedMesh&&Lt.instancingColor===!1&&U.instanceColor!==null||U.isInstancedMesh&&Lt.instancingMorph===!0&&U.morphTexture===null||U.isInstancedMesh&&Lt.instancingMorph===!1&&U.morphTexture!==null||Lt.envMap!==yt||G.fog===!0&&Lt.fog!==ct||Lt.numClippingPlanes!==void 0&&(Lt.numClippingPlanes!==At.numPlanes||Lt.numIntersection!==At.numIntersection)||Lt.vertexAlphas!==Ut||Lt.vertexTangents!==Ft||Lt.morphTargets!==Dt||Lt.morphNormals!==Zt||Lt.morphColors!==ee||Lt.toneMapping!==me||Lt.morphTargetsCount!==ae)&&(Jt=!0):(Jt=!0,Lt.__version=G.version);let Be=Lt.currentProgram;Jt===!0&&(Be=hs(G,I,U));let ni=!1,ze=!1,Ni=!1;const fe=Be.getUniforms(),Ue=Lt.uniforms;if(et.useProgram(Be.program)&&(ni=!0,ze=!0,Ni=!0),G.id!==P&&(P=G.id,ze=!0),ni||O!==v){et.buffers.depth.getReversed()&&v.reversedDepth!==!0&&(v._reversedDepth=!0,v.updateProjectionMatrix()),fe.setValue(y,"projectionMatrix",v.projectionMatrix),fe.setValue(y,"viewMatrix",v.matrixWorldInverse);const Ne=fe.map.cameraPosition;Ne!==void 0&&Ne.setValue(y,Tt.setFromMatrixPosition(v.matrixWorld)),ot.logarithmicDepthBuffer&&fe.setValue(y,"logDepthBufFC",2/(Math.log(v.far+1)/Math.LN2)),(G.isMeshPhongMaterial||G.isMeshToonMaterial||G.isMeshLambertMaterial||G.isMeshBasicMaterial||G.isMeshStandardMaterial||G.isShaderMaterial)&&fe.setValue(y,"isOrthographic",v.isOrthographicCamera===!0),O!==v&&(O=v,ze=!0,Ni=!0)}if(U.isSkinnedMesh){fe.setOptional(y,U,"bindMatrix"),fe.setOptional(y,U,"bindMatrixInverse");const Ce=U.skeleton;Ce&&(Ce.boneTexture===null&&Ce.computeBoneTexture(),fe.setValue(y,"boneTexture",Ce.boneTexture,Mt))}U.isBatchedMesh&&(fe.setOptional(y,U,"batchingTexture"),fe.setValue(y,"batchingTexture",U._matricesTexture,Mt),fe.setOptional(y,U,"batchingIdTexture"),fe.setValue(y,"batchingIdTexture",U._indirectTexture,Mt),fe.setOptional(y,U,"batchingColorTexture"),U._colorsTexture!==null&&fe.setValue(y,"batchingColorTexture",U._colorsTexture,Mt));const We=V.morphAttributes;if((We.position!==void 0||We.normal!==void 0||We.color!==void 0)&&Nt.update(U,V,Be),(ze||Lt.receiveShadow!==U.receiveShadow)&&(Lt.receiveShadow=U.receiveShadow,fe.setValue(y,"receiveShadow",U.receiveShadow)),G.isMeshGouraudMaterial&&G.envMap!==null&&(Ue.envMap.value=yt,Ue.flipEnvMap.value=yt.isCubeTexture&&yt.isRenderTargetTexture===!1?-1:1),G.isMeshStandardMaterial&&G.envMap===null&&I.environment!==null&&(Ue.envMapIntensity.value=I.environmentIntensity),Ue.dfgLUT!==void 0&&(Ue.dfgLUT.value=xm()),ze&&(fe.setValue(y,"toneMappingExposure",w.toneMappingExposure),Lt.needsLights&&fl(Ue,Ni),ct&&G.fog===!0&&wt.refreshFogUniforms(Ue,ct),wt.refreshMaterialUniforms(Ue,G,st,rt,S.state.transmissionRenderTarget[v.id]),Hs.upload(y,ro(Lt),Ue,Mt)),G.isShaderMaterial&&G.uniformsNeedUpdate===!0&&(Hs.upload(y,ro(Lt),Ue,Mt),G.uniformsNeedUpdate=!1),G.isSpriteMaterial&&fe.setValue(y,"center",U.center),fe.setValue(y,"modelViewMatrix",U.modelViewMatrix),fe.setValue(y,"normalMatrix",U.normalMatrix),fe.setValue(y,"modelMatrix",U.matrixWorld),G.isShaderMaterial||G.isRawShaderMaterial){const Ce=G.uniformsGroups;for(let Ne=0,nr=Ce.length;Ne0&&Mt.useMultisampledRTT(v)===!1?U=ft.get(v).__webglMultisampledFramebuffer:Array.isArray(Ft)?U=Ft[V]:U=Ft,z.copy(v.viewport),k.copy(v.scissor),W=v.scissorTest}else z.copy(qt).multiplyScalar(st).floor(),k.copy(jt).multiplyScalar(st).floor(),W=Kt;if(V!==0&&(U=pl),et.bindFramebuffer(y.FRAMEBUFFER,U)&&G&&et.drawBuffers(v,U),et.viewport(z),et.scissor(k),et.setScissorTest(W),ct){const yt=ft.get(v.texture);y.framebufferTexture2D(y.FRAMEBUFFER,y.COLOR_ATTACHMENT0,y.TEXTURE_CUBE_MAP_POSITIVE_X+I,yt.__webglTexture,V)}else if(gt){const yt=I;for(let Ut=0;Ut=0&&I<=v.width-G&&V>=0&&V<=v.height-U&&(v.textures.length>1&&y.readBuffer(y.COLOR_ATTACHMENT0+Et),y.readPixels(I,V,G,U,Ot.convert(Ft),Ot.convert(Dt),ct))}finally{const Ut=M!==null?ft.get(M).__webglFramebuffer:null;et.bindFramebuffer(y.FRAMEBUFFER,Ut)}}},this.readRenderTargetPixelsAsync=async function(v,I,V,G,U,ct,gt,Et=0){if(!(v&&v.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let yt=ft.get(v).__webglFramebuffer;if(v.isWebGLCubeRenderTarget&>!==void 0&&(yt=yt[gt]),yt)if(I>=0&&I<=v.width-G&&V>=0&&V<=v.height-U){et.bindFramebuffer(y.FRAMEBUFFER,yt);const Ut=v.textures[Et],Ft=Ut.format,Dt=Ut.type;if(!ot.textureFormatReadable(Ft))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ot.textureTypeReadable(Dt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const Zt=y.createBuffer();y.bindBuffer(y.PIXEL_PACK_BUFFER,Zt),y.bufferData(y.PIXEL_PACK_BUFFER,ct.byteLength,y.STREAM_READ),v.textures.length>1&&y.readBuffer(y.COLOR_ATTACHMENT0+Et),y.readPixels(I,V,G,U,Ot.convert(Ft),Ot.convert(Dt),0);const ee=M!==null?ft.get(M).__webglFramebuffer:null;et.bindFramebuffer(y.FRAMEBUFFER,ee);const me=y.fenceSync(y.SYNC_GPU_COMMANDS_COMPLETE,0);return y.flush(),await rh(y,me,4),y.bindBuffer(y.PIXEL_PACK_BUFFER,Zt),y.getBufferSubData(y.PIXEL_PACK_BUFFER,0,ct),y.deleteBuffer(Zt),y.deleteSync(me),ct}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(v,I=null,V=0){const G=Math.pow(2,-V),U=Math.floor(v.image.width*G),ct=Math.floor(v.image.height*G),gt=I!==null?I.x:0,Et=I!==null?I.y:0;Mt.setTexture2D(v,0),y.copyTexSubImage2D(y.TEXTURE_2D,V,0,0,gt,Et,U,ct),et.unbindTexture()};const ml=y.createFramebuffer(),xl=y.createFramebuffer();this.copyTextureToTexture=function(v,I,V=null,G=null,U=0,ct=null){ct===null&&(U!==0?(is("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),ct=U,U=0):ct=0);let gt,Et,yt,Ut,Ft,Dt,Zt,ee,me;const xe=v.isCompressedTexture?v.mipmaps[ct]:v.image;if(V!==null)gt=V.max.x-V.min.x,Et=V.max.y-V.min.y,yt=V.isBox3?V.max.z-V.min.z:1,Ut=V.min.x,Ft=V.min.y,Dt=V.isBox3?V.min.z:0;else{const We=Math.pow(2,-U);gt=Math.floor(xe.width*We),Et=Math.floor(xe.height*We),v.isDataArrayTexture?yt=xe.depth:v.isData3DTexture?yt=Math.floor(xe.depth*We):yt=1,Ut=0,Ft=0,Dt=0}G!==null?(Zt=G.x,ee=G.y,me=G.z):(Zt=0,ee=0,me=0);const ae=Ot.convert(I.format),Lt=Ot.convert(I.type);let ue;I.isData3DTexture?(Mt.setTexture3D(I,0),ue=y.TEXTURE_3D):I.isDataArrayTexture||I.isCompressedArrayTexture?(Mt.setTexture2DArray(I,0),ue=y.TEXTURE_2D_ARRAY):(Mt.setTexture2D(I,0),ue=y.TEXTURE_2D),y.pixelStorei(y.UNPACK_FLIP_Y_WEBGL,I.flipY),y.pixelStorei(y.UNPACK_PREMULTIPLY_ALPHA_WEBGL,I.premultiplyAlpha),y.pixelStorei(y.UNPACK_ALIGNMENT,I.unpackAlignment);const Jt=y.getParameter(y.UNPACK_ROW_LENGTH),Be=y.getParameter(y.UNPACK_IMAGE_HEIGHT),ni=y.getParameter(y.UNPACK_SKIP_PIXELS),ze=y.getParameter(y.UNPACK_SKIP_ROWS),Ni=y.getParameter(y.UNPACK_SKIP_IMAGES);y.pixelStorei(y.UNPACK_ROW_LENGTH,xe.width),y.pixelStorei(y.UNPACK_IMAGE_HEIGHT,xe.height),y.pixelStorei(y.UNPACK_SKIP_PIXELS,Ut),y.pixelStorei(y.UNPACK_SKIP_ROWS,Ft),y.pixelStorei(y.UNPACK_SKIP_IMAGES,Dt);const fe=v.isDataArrayTexture||v.isData3DTexture,Ue=I.isDataArrayTexture||I.isData3DTexture;if(v.isDepthTexture){const We=ft.get(v),Ce=ft.get(I),Ne=ft.get(We.__renderTarget),nr=ft.get(Ce.__renderTarget);et.bindFramebuffer(y.READ_FRAMEBUFFER,Ne.__webglFramebuffer),et.bindFramebuffer(y.DRAW_FRAMEBUFFER,nr.__webglFramebuffer);for(let zn=0;znMath.PI&&(n-=Oe),s<-Math.PI?s+=Oe:s>Math.PI&&(s-=Oe),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(_e.setFromSpherical(this._spherical),_e.applyQuaternion(this._quatInverse),e.copy(this.target).add(_e),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=_e.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new D(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new D(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=_e.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Os.origin.copy(this.object.position),Os.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Os.direction))<_m?this.object.lookAt(this.target):(Sc.setFromNormalAndCoplanarPoint(this.object.up,this.target),Os.intersectPlane(Sc,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),r=!0)}return this._scale=1,this._performCursorZoom=!1,r||this._lastPosition.distanceToSquared(this.object.position)>Br||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Br||this._lastTargetPosition.distanceToSquared(this.target)>Br?(this.dispatchEvent(Mc),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?Oe/60*this.autoRotateSpeed*t:Oe/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){_e.setFromMatrixColumn(e,0),_e.multiplyScalar(-t),this._panOffset.add(_e)}_panUp(t,e){this.screenSpacePanning===!0?_e.setFromMatrixColumn(e,1):(_e.setFromMatrixColumn(e,0),_e.crossVectors(this.object.up,_e)),_e.multiplyScalar(t),this._panOffset.add(_e)}_pan(t,e){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;_e.copy(s).sub(this.target);let r=_e.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*r/n.clientHeight,this.object.matrix),this._panUp(2*e*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=t-n.left,r=e-n.top,a=n.width,o=n.height;this._mouse.x=s/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(n,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const n=this._getSecondPointerPosition(t),s=.5*(t.pageX+n.x),r=.5*(t.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,o=(t.pageY+e.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e{e.isMesh&&(t.add(e.geometry),t.add(e.material))});for(const e of t)e.dispose()}}function _i(i){return new vu({color:0,emissive:16777215,emissiveIntensity:i})}const qi=new D;function qe(i,t,e,n,s,r){const a=2*Math.PI*s/4,o=Math.max(r-2*s,0),l=Math.PI/4;qi.copy(t),qi[n]=0,qi.normalize();const c=.5*a/(a+o),h=1-qi.angleTo(i)/l;return Math.sign(qi[e])===1?h*c:o/(a+o)+c+c*(1-h)}class vn extends oe{constructor(t=1,e=1,n=1,s=2,r=.1){const a=s*2+1;if(r=Math.min(t/2,e/2,n/2,r),super(1,1,1,a,a,a),this.type="RoundedBoxGeometry",this.parameters={width:t,height:e,depth:n,segments:s,radius:r},a===1)return;const o=this.toNonIndexed();this.index=null,this.attributes.position=o.attributes.position,this.attributes.normal=o.attributes.normal,this.attributes.uv=o.attributes.uv;const l=new D,c=new D,h=new D(t,e,n).divideScalar(2).subScalar(r),u=this.attributes.position.array,d=this.attributes.normal.array,p=this.attributes.uv.array,x=u.length/6,_=new D,m=.5/a;for(let f=0,b=0;fe.fillText(c,n/2,n/2+(h-(o.length-1)/2)*l,n*.94));return}e.fillStyle="#5ee7ff";for(const r of[.33,.67])e.beginPath(),e.ellipse(n*r,n*.4,n*.08,n*.12,0,0,Math.PI*2),e.fill();e.strokeStyle="#5ee7ff",e.lineWidth=n*.045,e.lineCap="round",e.beginPath(),e.arc(n/2,n*.55,n*.18,Math.PI*.2,Math.PI*.8),e.stroke(),e.fillStyle="#ffffff",e.font=`bold ${Math.round(n*.11)}px system-ui, sans-serif`,e.textAlign="center",e.fillText("VisuBot",n/2,n*.9)}function zr(i,t,e,n,s){const r=document.createElement("canvas");r.width=t,r.height=e;const a=r.getContext("2d");a&&(s&&(a.fillStyle=s,a.fillRect(0,0,t,e)),a.fillStyle=n,a.textAlign="center",a.textBaseline="middle",i.forEach((l,c)=>{a.font=`${l.bold?"bold ":""}${l.size}px system-ui, sans-serif`,a.fillText(l.text,t/2,e*(c+.5)/i.length)}));const o=new Ka(r);return o.colorSpace=De,o}function Um(){const i=document.createElement("canvas");i.width=i.height=256;const t=i.getContext("2d");if(t){t.fillStyle="#16181b",t.fillRect(0,0,256,256),t.strokeStyle="#2c3036",t.lineWidth=9;for(let n=0;n<6;n++)for(let s=0;s<6;s++){const r=38+n*36,a=38+s*36;t.beginPath(),(n+s)%2?t.arc(r,a,12,0,Math.PI*2):t.rect(r-11,a-11,22,22),t.stroke()}}const e=new Ka(i);return e.colorSpace=De,e}function Nm(){const i=new js;i.moveTo(-7.2,1.4),i.lineTo(4.8,1.4),i.lineTo(9.6,4.6),i.lineTo(8.8,5.9),i.lineTo(4.6,3.6),i.lineTo(4.6,4.7),i.lineTo(-6.6,4.7),i.absarc(-8.4,3.1,1.9,Math.PI*.35,Math.PI*1.55,!1),i.lineTo(-7.2,1.4);const t=(e,n,s)=>{const r=new rs;r.absarc(e,n,s,0,Math.PI*2,!0),i.holes.push(r)};t(-8.4,3.1,.55);for(let e=0;e<8;e++){const n=e/8*Math.PI*2;Math.cos(n)>.6||t(-8.4+Math.cos(n)*1.25,3.1+Math.sin(n)*1.25,.22)}for(let e=0;e<4;e++)for(let n=0;n<3;n++)t(-5.6+e*.95,2.1+n*.95,.25);for(let e=0;e<3;e++)t(6+e*1.05,4+e*.7,.22);return i}function Fm(){const i=new ln,t=new Map,e={},n=(B,y=i)=>{const Z=new ln;return Z.name=B,e[B]=Z,t.set(Z,B),y.add(Z),Z},s=(B,y,Z,Q,ot,et)=>{const vt=new Vt(B,y);return vt.position.set(Z,Q,ot),et.add(vt),vt},r=ve(Im,{metalness:.7,roughness:.3}),a=ve(1776929,{roughness:.6}),o=ve(2764341,{roughness:.45}),l=ve(13225686,{metalness:.9,roughness:.25}),c=ve(1315860,{roughness:.9}),h=ve(10133671,{roughness:.55}),u=ve(15921906,{roughness:.5}),d=ve(1909286,{roughness:.7}),p=new _u({color:2501681,transparent:!0,opacity:.55,roughness:.12,metalness:.1,clearcoat:1,depthWrite:!1}),x=n("chassis"),_=new js;_.moveTo(-4.9,-7.2),_.lineTo(4.9,-7.2),_.lineTo(4.9,4.8),_.lineTo(-4.9,4.8);const m=new rs;m.moveTo(-3.6,-3.4),m.lineTo(-3.6,2.8),m.lineTo(3.6,2.8),m.lineTo(3.6,-3.4),_.holes.push(m);const f=new Ji(_,{depth:.22,bevelEnabled:!1});f.rotateX(Math.PI/2),s(f,r,0,1.62,0,x);const b=new Ji(Nm(),{depth:.22,bevelEnabled:!1,curveSegments:16});b.rotateY(-Math.PI/2);for(const B of[-1,1])s(b,r,B*4.9+(B>0?.22:0),0,0,x);s(new oe(9.8,3.3,.22),r,0,3.05,-7.2,x);const S=new Vt(new Si(1.1,.16,6,20,Math.PI*.8),a);S.rotation.z=Math.PI*1.1,S.position.set(0,2.9,-7.33),x.add(S);const T=new js;T.moveTo(-4.9,0),T.lineTo(4.9,0),T.lineTo(4.9,3.4),T.lineTo(-4.9,3.4);const R=new rs;R.moveTo(-1.1,.6),R.lineTo(-1.1,2.6),R.lineTo(-.5,2.6),R.lineTo(0,1.9),R.lineTo(.5,2.6),R.lineTo(1.1,2.6),R.lineTo(1.1,.6),R.lineTo(.6,.6),R.lineTo(.6,1.8),R.lineTo(0,1.1),R.lineTo(-.6,1.8),R.lineTo(-.6,.6),T.holes.push(R);const w=new Vt(new Ji(T,{depth:.22,bevelEnabled:!1}),r);w.rotation.x=-.35,w.position.set(0,1.5,4.8),x.add(w);const L=n("motors"),F=ve(9225450,{roughness:.55});for(const B of[-1,1]){s(new vn(2,2.8,3,2,.2),F,B*3.7,3.3,0,L);const y=s(new Ee(.75,.75,2.8,20),l,B*1.55,3,B*.8,L);y.rotation.z=Math.PI/2;const Z=s(new Ee(.8,.8,.5,20),F,B*2.6,3,B*.8,L);Z.rotation.z=Math.PI/2}const E=n("wheels"),M=ve(16777215,{map:Um(),roughness:.6});for(const B of[-1,1]){const y=new ln,Z=new Vt(new Ee(3.3,3.3,2.2,44),c);Z.rotation.z=Math.PI/2,y.add(Z);const Q=new Vt(new Si(2.75,.32,10,44),c);Q.rotation.y=Math.PI/2,Q.position.x=B*1.1,y.add(Q);const ot=new Vt(new ss(2.6,40),M);ot.rotation.y=B*Math.PI/2,ot.position.x=B*1,y.add(ot);const et=new Vt(new Ee(.3,.3,.3,12),l);et.rotation.z=Math.PI/2,et.position.x=B*1.05,y.add(et),y.position.set(B*6.45,3.3,0),y.name=B<0?"wheelLeft":"wheelRight",E.add(y)}const P=n("caster");s(new $i(1.3,20,10,0,Math.PI*2,0,Math.PI/2),a,0,.75,-4.6,P).scale.set(1.3,.7,1),s(new $i(.75,20,14),a,0,.75,-4.6,P);for(const B of[-.9,.9])s(new Ee(.25,.25,.2,12),l,B,1.28,-5.6,P);const z=n("lineSensor");s(new vn(8,.3,2.4,2,.1),d,0,1.25,-8,z);for(let B=0;B<4;B++){const y=-3.3+B*2.2;s(new oe(.6,.12,.6),ve(16119285,{emissive:16777215,emissiveIntensity:.5}),y,1.06,-8.3,z),s(new $i(.13,8,6),ve(16728128,{emissive:16722474,emissiveIntensity:1.4}),y,1.06,-7.6,z)}const k=n("shield"),W=new Vt(new vn(9.4,3.4,11.2,3,.5),p);W.position.set(0,6.5,-1.4),W.renderOrder=1,k.add(W),s(new oe(9,.16,10.8),d,0,5.1,-1.4,k);for(const[B,y]of[[-2,-4],[1.5,-3.6],[-1.6,-2.2],[1.8,-2.4]])s(new Ee(.45,.45,.4,14),a,B,5.35,y,k);const Y=zr([{text:"makeblock",size:56,bold:!0},{text:"mBot2 One Robot Per Child",size:30}],512,160,"#e9edf0","#777d84"),nt=new Vt(new Ee(1.05,1.05,7,28),new Te({map:Y,roughness:.4,metalness:.3}));nt.rotation.z=Math.PI/2,nt.rotation.x=-Math.PI/2,nt.position.set(0,6.3,.6),k.add(nt);for(const B of[-3.2,-2.3])s(new oe(.6,.5,.3),u,B,5.6,4.25,k);for(const B of[.4,2.2]){s(new oe(1.5,.45,.35),u,B,5.6,4.25,k);const y=s(new Si(.7,.12,6,12,Math.PI),a,B,5,4.5,k);y.rotation.y=Math.PI/2}const X=n("powerSwitch");s(new oe(.2,.5,1.2),o,-4.72,5.8,-3.4,X),s(new oe(.3,.38,.45),u,-4.8,5.8,-3.6,X);const rt=new Vt(new Nn(1.4,.4),new Ys({map:zr([{text:"ON/OFF",size:44,bold:!0}],256,72,"#e9edf0",void 0),transparent:!0}));rt.rotation.y=-Math.PI/2,rt.position.set(-4.76,5.25,-3.4),X.add(rt);for(const B of[-1.9,-.9])s(new oe(.3,.45,.7),u,-4.6,5.8,B,k);const st=new ln;i.add(st);const St=n("cyberpi",st),Gt=new Vt(new vn(7.9,1,3.1,3,.25),p);Gt.renderOrder=1,St.add(Gt),s(new oe(7.6,.12,2.9),d,0,-.1,0,St);const qt=new Vt(new Nn(1.6,.4),new Ys({map:zr([{text:"CyberPi",size:44}],256,64,"#c9d1d8",void 0),transparent:!0}));qt.position.set(-2.6,0,1.56),St.add(qt),s(new oe(.12,.3,.9),a,3.98,.05,-.7,St);const jt=n("screen",st),Kt=document.createElement("canvas");Kt.width=Kt.height=256,ll(Kt);const K=new Ka(Kt);K.colorSpace=De,s(new oe(3,.08,2.6),ve(14672870),.1,.47,0,jt);const J=new Vt(new Nn(2.7,2.3),new Te({map:K,emissive:16777215,emissiveMap:K,emissiveIntensity:.9,roughness:.15}));J.rotation.x=-Math.PI/2,J.position.set(.1,.52,0),jt.add(J);const xt=n("joystick",st);s(new Ee(.75,.75,.12,24),ve(9080982),-2.75,.52,0,xt),s(new Ee(.22,.22,.5,12),ve(7107192),-2.75,.75,0,xt),s(new Ee(.55,.6,.32,24),h,-2.75,1.05,0,xt);const Rt=n("buttons",st);s(new vn(.85,.3,.85,2,.15),h,2.6,.58,-.62,Rt);const Tt=s(new Ee(.55,.55,.3,3),h,2.6,.58,.68,Rt);Tt.rotation.y=Math.PI/2,s(new Ee(.24,.24,.22,14).rotateZ(Math.PI/2),h,3.98,.05,.5,Rt);const kt=n("leds",st);s(new oe(6.6,.3,.06),ve(15658734,{transparent:!0,opacity:.3,roughness:.2}),0,-.12,1.68,kt);const Qt=[];for(let B=0;B<5;B++){const y=new Te({color:14540253,emissiveIntensity:1,roughness:.3,toneMapped:!1});Qt.push(y),s(new oe(.7,.22,.08),y,-2.8+B*1.4,-.12,1.63,kt)}for(const[B,y]of[[-1.75,"lightSensor"],[-1.75,"microphone"]]){const Z=y==="lightSensor"?-1.05:1.05;s(new Ee(.14,.14,.08,10),ve(657930,{roughness:.2}),B,.52,Z,n(y,st))}st.position.set(0,8.55,3.15);const Ct=n("ultrasonic");s(new vn(6.4,2.8,1.3,3,.4),a,0,0,0,Ct);for(const B of[-1,1]){const y=s(new Ee(1.2,1.2,1.3,32),a,B*1.6,0,-1.1,Ct);y.rotation.x=Math.PI/2;const Z=s(new Si(.98,.17,10,32),ve(10396842,{metalness:.5,roughness:.35}),B*1.6,0,-1.76,Ct);Z.name="sonarRing";const Q=s(new ss(.85,28),ve(3817285,{roughness:.9}),B*1.6,0,-1.7,Ct);Q.rotation.y=Math.PI}s(new vn(2.6,1.5,.3,2,.12),a,0,-1.6,-.3,Ct);for(const B of[-.7,.7])s(new Ee(.28,.28,.2,12).rotateX(Math.PI/2),l,B,-1.75,-.5,Ct);return Ct.position.set(0,6.4,-8),i.traverse(B=>{const y=B;if(!y.isMesh)return;const Z=y.material.transparent;y.castShadow=!Z,y.receiveShadow=!0;const Q=y.material;Qt.includes(Q)||(y.material=Q.clone())}),{group:i,parts:t,partGroups:e,leds:Qt,screen:{canvas:Kt,texture:K}}}const $e=(i,t=0)=>new D(i.x,t,-i.y),Vr=i=>i*Math.PI/180,qn={floor:16052714,grid:14078148,wall:13214827,tape:2236962,trail:15227148},Om=12.9,yc=3.3;class Vm{constructor(t){le(this,"canvas");le(this,"renderer");le(this,"scene",new kc);le(this,"camera",new ke(45,1,1,2e3));le(this,"controls");le(this,"model");le(this,"robot");le(this,"trailGroup",new ln);le(this,"trailPiece",new oe(1,.15,1.4));le(this,"trailMaterial",new Te({color:qn.trail}));le(this,"liveSegment");le(this,"worldGroup",new ln);le(this,"frame");le(this,"sun");le(this,"resize");le(this,"shown",{x:0,y:0,heading:0});le(this,"anim");le(this,"trail",[]);le(this,"wasShown",!1);le(this,"wheelPose");le(this,"flight");le(this,"shownScreen");le(this,"loop",()=>{if(this.canvas.isConnected)this.wasShown=!0;else if(this.wasShown)return this.dispose();this.frame=requestAnimationFrame(this.loop);let t=this.shown;if(this.anim){const n=Math.min(1,(performance.now()-this.anim.start)/this.anim.ms),s=n<.5?2*n*n:1-(-2*n+2)**2/2,{from:r,to:a}=this.anim;t={x:r.x+(a.x-r.x)*s,y:r.y+(a.y-r.y)*s,heading:r.heading+(a.heading-r.heading)*s},n>=1&&(this.shown={...a},this.anim=void 0)}this.applyPose(t);const e=!!this.flight;if(this.flight){const n=Math.min(1,(performance.now()-this.flight.start)/this.flight.ms),s=n<.5?4*n*n*n:1-(-2*n+2)**3/2,{from:r,to:a}=this.flight;this.controls.target.lerpVectors(r.target,a.target,s);const o=r.pos.clone().sub(r.target),l=a.pos.clone().sub(a.target),c=o.clone().normalize().lerp(l.clone().normalize(),s);c.lengthSq()<1e-4&&c.set(-1,0,0),c.normalize();const h=o.length()+(l.length()-o.length())*s;this.camera.position.copy(this.controls.target).addScaledVector(c,h),n>=1&&(this.flight=void 0)}(e||this.controls.autoRotate)&&this.controls.update(),this.renderer.render(this.scene,this.camera)});this.host=t,this.canvas=document.createElement("canvas"),this.canvas.className="visubot-canvas",t.append(this.canvas),this.renderer=new gm({canvas:this.canvas,antialias:!0,alpha:!0}),this.renderer.setPixelRatio(Math.min(2,window.devicePixelRatio)),this.renderer.toneMapping=Tc,this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=Ec;const e=new Ia(this.renderer);this.scene.environment=e.fromScene(new Lm,.04).texture,this.scene.environmentIntensity=.7,e.dispose(),this.scene.add(new yu(16777215,9077104,.9));const n=new Au(16777215,1.8);n.position.set(-40,90,50),n.castShadow=!0,n.shadow.mapSize.set(1024,1024),n.shadow.camera.left=n.shadow.camera.bottom=-30,n.shadow.camera.right=n.shadow.camera.top=30,n.shadow.camera.far=300,n.shadow.bias=-5e-4,this.sun=n,this.scene.add(n,n.target),this.scene.add(this.worldGroup),this.model=Fm(),this.robot=this.model.group,this.scene.add(this.robot),this.scene.add(this.trailGroup),this.liveSegment=new Vt(this.trailPiece,this.trailMaterial),this.scene.add(this.liveSegment),this.camera.position.set(0,75,95),this.controls=new vm(this.camera,this.canvas),this.controls.target.set(0,0,-15),this.controls.maxPolarAngle=Math.PI-.05,this.controls.minDistance=12,this.controls.maxDistance=600,this.controls.update(),this.controls.addEventListener("start",()=>{this.flight=void 0,this.controls.autoRotate=!1}),this.resize=new ResizeObserver(()=>this.fit()),this.resize.observe(t),this.fit(),this.loop()}dispose(){this.frame!==void 0&&cancelAnimationFrame(this.frame),this.resize.disconnect(),this.controls.dispose(),this.renderer.dispose(),this.renderer.forceContextLoss(),this.canvas.remove()}setWorld(t){this.worldGroup.clear();const e=Math.max(t.width,t.depth,80);this.flight=void 0,this.controls.autoRotate=!1,this.controls.target.set(0,0,0),this.camera.position.set(0,e*.95,e*.5),this.controls.update();const n=new Vt(new Nn(t.width,t.depth),new Te({color:qn.floor,roughness:.9}));n.rotation.x=-Math.PI/2,n.receiveShadow=!0,this.worldGroup.add(n);const s=[];for(let b=-t.width/2;b<=t.width/2+1e-6;b+=10)s.push(b,.05,-t.depth/2,b,.05,t.depth/2);for(let b=-t.depth/2;b<=t.depth/2+1e-6;b+=10)s.push(-t.width/2,.05,b,t.width/2,.05,b);const r=new Ie;r.setAttribute("position",new he(s,3)),this.worldGroup.add(new Bh(r,new Wc({color:qn.grid})));const a=[{from:{x:-t.width/2,y:-t.depth/2},to:{x:t.width/2,y:-t.depth/2}},{from:{x:t.width/2,y:-t.depth/2},to:{x:t.width/2,y:t.depth/2}},{from:{x:t.width/2,y:t.depth/2},to:{x:-t.width/2,y:t.depth/2}},{from:{x:-t.width/2,y:t.depth/2},to:{x:-t.width/2,y:-t.depth/2}}],o=new Te({color:qn.wall});for(const b of[...a.map(S=>({...S,low:!0})),...t.walls.map(S=>({...S,low:!1}))]){const S=Math.hypot(b.to.x-b.from.x,b.to.y-b.from.y),T=b.low?4:15,R=new Vt(new oe(S,T,2),o);R.position.copy($e({x:(b.from.x+b.to.x)/2,y:(b.from.y+b.to.y)/2},T/2)),R.rotation.y=Math.atan2(b.to.y-b.from.y,b.to.x-b.from.x),this.worldGroup.add(R)}const l=new oe(rn,12,rn);for(const b of t.blocks??[]){const S=new Vt(l,o);S.position.copy($e(b,6)),S.castShadow=S.receiveShadow=!0,this.worldGroup.add(S)}const c=new oe(rn,.1,rn),h=new Te({color:qn.tape});for(const b of t.marks??[]){const S=new Vt(c,h);S.position.copy($e(b,.1)),this.worldGroup.add(S)}const u=new Te({color:qn.tape}),d=new Te({color:3126084,emissive:1800748,emissiveIntensity:.4}),p=t.goals??[],x=(b,S)=>p.some(T=>Math.abs(T.x-b)<1e-6&&Math.abs(T.y-S)<1e-6);for(const b of p){const S=new Vt(c,u);if(S.position.copy($e(b,.1)),this.worldGroup.add(S),x(b.x+rn,b.y)||x(b.x,b.y+rn))continue;const T=new Vt(new Ee(.25,.25,9,8),new Te({color:14540253}));T.position.copy($e({x:b.x+rn/2-1,y:b.y+rn/2-1},4.5));const R=new Vt(new oe(4,2.6,.2),d);R.position.copy($e({x:b.x+rn/2-3,y:b.y+rn/2-1},7.6)),this.worldGroup.add(T,R)}const _={red:14692657,green:3126084,blue:1867478,yellow:16429061};for(const b of t.colors??[]){const S=new Vt(c,new Te({color:_[b.color]}));S.position.copy($e(b.at,.1)),this.worldGroup.add(S)}const m=new Te({color:3126084,transparent:!0,opacity:.3,depthWrite:!1});for(const b of t.targets??[]){const S=new Vt(c,m);S.position.copy($e(b,.12)),this.worldGroup.add(S)}const f=new Te({color:qn.tape});for(const b of t.lines)for(let S=0;S+1({...n})),this.trailGroup.clear(),this.applyPose(this.shown)}moveTo(t,e,n){this.anim&&(this.shown={...this.anim.to}),this.trail=e.map(a=>({...a}));let s={...t};const r=s.heading-this.shown.heading;r>180?s={...s,heading:s.heading-360}:r<-180&&(s={...s,heading:s.heading+360}),this.anim={from:{...this.shown},to:s,start:performance.now(),ms:Math.max(1,n)}}showcase(){this.worldGroup.clear();const t=new Vt(new ss(16,48),new Te({color:15328474,roughness:.95}));t.rotation.x=-Math.PI/2,t.receiveShadow=!0,this.worldGroup.add(t),this.place({x:0,y:0,heading:0},[{x:0,y:0}]),this.controls.target.set(0,5,-2),this.camera.position.set(-20,18,-24),this.controls.update()}highlight(t){const e=new Set(t===void 0?[]:Array.isArray(t)?t:[t]);for(const[n,s]of Object.entries(this.model.partGroups))s.traverse(r=>{var c;const a=r;if(!a.isMesh)return;const o=a.material;if(!o.emissive)return;(c=o.userData).baseEmissive??(c.baseEmissive={color:o.emissive.getHex(),intensity:o.emissiveIntensity});const l=o.userData.baseEmissive;e.has(n)?(o.emissive.setHex(16756736),o.emissiveIntensity=Math.max(l.intensity,.22)):(o.emissive.setHex(l.color),o.emissiveIntensity=l.intensity)})}focusOn(t,e="",n=!1,s=900){const r=new On;this.robot.updateMatrixWorld(!0);for(const u of t)r.expandByObject(this.model.partGroups[u]);r.isEmpty()&&r.setFromObject(this.robot);const a=r.getCenter(new D),o=r.getSize(new D).length(),l=new D(...{vorn:[0,.35,-1],front:[0,.35,-1],hinten:[0,.55,1],back:[0,.55,1],oben:[0,1,.12],top:[0,1,.12],unten:[.05,-1,-.3],bottom:[.05,-1,-.3],seite:[-1,.5,.15],side:[-1,.5,.15]}[e]??[-.75,.6,-.85]).normalize(),c=Math.max(14,o*(t.length?1.8:1.35)+6),h=a.clone().addScaledVector(l,c);this.flight={from:{pos:this.camera.position.clone(),target:this.controls.target.clone()},to:{pos:h,target:a},start:performance.now(),ms:s},this.controls.autoRotate=n,this.controls.autoRotateSpeed=1.2}setScreen(t){t!==this.shownScreen&&(this.shownScreen=t,ll(this.model.screen.canvas,t),this.model.screen.texture.needsUpdate=!0)}setLed(t){this.setLeds(this.model.leds.map(()=>t))}setLeds(t){for(const[e,n]of this.model.leds.entries()){const s=t[e];s?(n.emissive.setRGB(s[0]/255,s[1]/255,s[2]/255),n.color.setRGB(s[0]/255,s[1]/255,s[2]/255)):(n.emissive.setRGB(0,0,0),n.color.set(14540253))}}partAt(t,e){const n=this.canvas.getBoundingClientRect(),s=new Ru;s.setFromCamera(new at((t-n.left)/n.width*2-1,-((e-n.top)/n.height)*2+1),this.camera);for(const r of s.intersectObject(this.robot,!0))for(let a=r.object;a;a=a.parent){const o=this.model.parts.get(a);if(o)return o}}fit(){const t=Math.max(1,this.host.clientWidth),e=Math.max(1,this.host.clientHeight);this.renderer.setSize(t,e,!1),this.camera.aspect=t/e,this.camera.updateProjectionMatrix()}applyPose(t){this.turnWheels(t),this.robot.position.copy($e(t)),this.robot.rotation.y=-Vr(t.heading),this.sun.target.position.copy(this.robot.position),this.sun.position.copy(this.robot.position).add(new D(-40,90,50));const e=this.anim?this.trail.length-2:this.trail.length-1;for(;this.trailGroup.children.length>Math.max(0,e);)this.trailGroup.remove(this.trailGroup.children[this.trailGroup.children.length-1]);for(let s=this.trailGroup.children.length;s.01,t.scale.set(s+1.4,1,1),t.position.copy($e({x:(e.x+n.x)/2,y:(e.y+n.y)/2},.2)),t.rotation.y=Math.atan2(n.y-e.y,n.x-e.x)}}export{Vm as Robot3D}; diff --git a/website/app/assets/ru-bst4sg1r.js b/website/app/assets/ru-bst4sg1r.js deleted file mode 100644 index 05968349..00000000 --- a/website/app/assets/ru-bst4sg1r.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Тексты, которые есть только в веб-версии. Все остальные берутся из Localizable.strings приложения. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Структурная схема VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Экспорт…"; -"web_export_title" = "Сохранить как изображение или PDF либо распечатать"; -"web_export_png" = "Изображение (PNG)"; -"web_export_svg" = "Векторная графика (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Файл VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Ошибка экспорта: %@"; -"web_print_hint" = "Через «Экспорт… → PDF» можно сохранить схему и затем распечатать её."; -"web_delete" = "Удалить"; -"web_language_title" = "Язык интерфейса"; -"web_simulation_start" = "Запустить симуляцию"; -"web_simulation_end" = "Завершить симуляцию"; -"web_simulation_start_title" = "Выполнить схему шаг за шагом"; -"web_simulation_end_title" = "Завершить симуляцию и продолжить редактирование"; -"web_palette_hint" = "Перетащите в схему"; -"web_tabs_label" = "Схемы"; -"web_status_modified" = "изменено"; -"web_inspector_title" = "Свойства"; -"web_inspector_resize" = "Изменить высоту инспектора объектов: перетащите линию вверх или вниз (двойной щелчок: по умолчанию)"; -"web_inspector_help_drop" = "Перетаскивайте элементы из палитры на плитку: сверху = перед, снизу = после, на «ø» = заменить. Существующие элементы можно перемещать мышью."; -"web_inspector_help_inline" = "Дважды щёлкните или коснитесь элемента, чтобы изменить текст прямо в диаграмме (Enter — применить, Esc — отмена). Так же меняются имена вариантов."; -"web_inspector_help_files" = "Файлы также можно перетащить в окно."; -"web_case_name" = "Имя варианта"; -"web_case_name_placeholder" = "напр. 1, ok, default"; -"web_copied" = "Элемент скопирован."; -"web_discard_message_fmt" = "Изменения в «%@» будут потеряны."; -"web_err_unreadable_fmt" = "«%@» не является читаемым файлом VisuStruct (%@)."; -"web_saved_fmt" = "«%@» сохранён."; -"web_saved_txt_fmt" = "Сохранено как «%@». Удалите расширение .txt, чтобы использовать файл."; -"web_drop_impossible" = "Сюда нельзя поместить"; -"web_sim_delay" = "Пауза на шаг"; -"web_sim_delay_value_fmt" = "%@ с"; -"web_codegen_language" = "Язык"; -"web_codegen_comments" = "Текст схемы как комментарии"; -"web_codegen_empty_else" = "Выводить пустую ветку else в коде"; -"web_copied_check" = "Скопировано ✓"; -"web_copy_manual" = "Выделено, нажмите Ctrl+C для копирования"; -"web_run_stopped_loop" = "Выполнение остановлено: возможен бесконечный цикл."; -"web_run_cancelled" = "Выполнение отменено."; -"web_run_error" = "Ошибка при выполнении."; -"web_run_dropped_fmt" = "… скрыто более ранних строк: %d"; -"web_sim_call_arguments_fmt" = "Вызов не соответствует заголовку %@. Проверь значения в скобках."; -"web_sim_missing_return_fmt" = "%@ завершилась, не вернув значение через return."; -"web_sim_file_not_found_fmt" = "Файла с именем %@ нет."; -"web_sim_end_of_file_fmt" = "В файле %@ больше нет строк."; -"web_sim_null_value_fmt" = "%@ равно null."; -"web_sim_unknown_variable_case_fmt" = "Неизвестная переменная: %1$@. Java различает заглавные и строчные буквы: может быть, %2$@?"; -"web_sim_written_file_fmt" = "%@ (сохранён)"; -"web_site_home" = "Главная страница"; -"web_site_imprint" = "Выходные данные"; -"web_site_privacy" = "Конфиденциальность"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Программирование"; -"web_live_hide" = "Скрыть программирование"; -"web_scale_canvas" = "Размер текста: структурная схема"; -"web_scale_code" = "Размер текста: программирование"; -"web_live_indent" = "Отступы"; -"web_live_indent_title" = "Расставить отступы: четыре пробела на уровень (выделенные строки, иначе всё)"; -"web_live_show" = "Показать программирование"; -"web_live_resize" = "Изменить ширину области кода (двойной щелчок: сбросить)"; -"web_live_hint" = "Код растёт вместе с диаграммой. Серый = заполнитель: пиши в инспекторе, и текст появится здесь. Щёлкни строку, чтобы выбрать элемент."; -"web_live_ph_selector" = "переменная"; -"web_live_ph_code" = "Твой код"; -"web_live_ph_end" = "конец"; -"web_live_language" = "Язык программирования"; -"web_live_java_class" = "Как класс"; -"web_live_java_class_hint" = "Имя класса = заголовок диаграммы"; -"web_live_java_main" = "С методом main"; -"web_settings_display" = "Отображение"; -"web_live_swing" = "Настоящая Java (со Swing)"; -"web_live_swing_hint" = "Настоящая Java с окнами (CheerpJ). При первом запуске однократно загружает около 40 МБ."; -"web_live_swing_windows" = "Окна Java"; -"web_live_swing_hide" = "Закрыть окна Java"; -"web_live_swing_loading" = "Загрузка Java (в первый раз около 40 МБ) …"; -"web_live_swing_compiling" = "Компиляция …"; -"web_live_swing_running" = "Программа выполняется."; -"web_live_swing_compile_failed" = "Ошибка компиляции, см. выше."; -"web_live_swing_failed" = "Не удалось загрузить Java. Проверь подключение к интернету."; -"web_live_hint_edit" = "Набери здесь код Java, и диаграмма построится сама. Или работай в диаграмме, и код будет расти вместе с ней. Серый = заполнитель, просто пиши поверх."; -"web_live_edit_label" = "Код Java"; -"web_parse_line_fmt" = "Строка %d: %@"; -"web_parse_missing" = "Здесь ещё не хватает: %@"; -"web_parse_extra" = "Лишнее: %@"; -"web_parse_unclosed_string" = "Не хватает закрывающей %@."; -"web_parse_else_without_if" = "У этого «else» нет «if»."; -"web_parse_case_outside_switch" = "«case» и «default» должны быть внутри «switch»."; -"web_parse_missing_do_while" = "После «do { … }» не хватает «while (условие);»."; -"web_parse_more_methods" = "Пока здесь учитывается только один метод. Создай другие подпрограммы в отдельных вкладках."; -"web_parse_missing_import" = "В самом начале не хватает %@ Без этой строки Java не знает Scanner."; -"web_parse_missing_scanner" = "Сначала не хватает %@ Без этой строки Scanner не существует."; -"web_parse_unknown_type" = "Java не знает такого типа данных. Может быть, %@?"; -"web_quickfix_insert_fmt" = "Предложение: вставить %@"; -"web_quickfix_replace_fmt" = "Предложение: %1$@ вместо %2$@"; -"web_parse_wrong_case" = "Java различает заглавные и строчные буквы. Правильно: %@."; -"web_editor_title" = "Диаграмма"; -"web_editor_show" = "Показать диаграмму"; -"web_editor_hide" = "Скрыть диаграмму"; -"web_keywords_title" = "Ключевые слова кода"; -"web_keywords_hint" = "if, while, for вместо названий элементов"; -"web_palette_compact" = "Элементы всегда компактно"; -"web_palette_compact_hint" = "Значок с маленьким названием под ним, иначе только при узкой колонке"; -"web_about_version_fmt" = "Версия %@"; -"web_about_software" = "Используемое ПО"; -"web_about_software_text" = "Редактор кода использует CodeMirror и Lezer (лицензия MIT). С поддержкой Swing VisuStruct загружает CheerpJ от Leaning Technologies (лицензия Community) и javac из OpenJDK."; -"web_about_licenses" = "Тексты лицензий"; -"web_live_run" = "Запустить"; -"web_live_run_title" = "Запустить программу: вывод и ввод появятся ниже"; -"web_live_run_finished" = "Программа завершена."; -"web_live_run_stopped" = "Остановлено."; -"web_console" = "Консоль"; -"web_console_hide" = "Скрыть консоль"; -"web_console_resize" = "Изменить высоту консоли"; -"web_diagram_tools" = "Инструменты диаграммы"; -"web_files_title" = "Файлы"; -"web_files_show" = "Показать файлы"; -"web_files_hide" = "Скрыть файлы"; -"web_files_resize" = "Изменить ширину файлов"; -"web_files_new_folder" = "Новая папка"; -"web_files_switch" = "Выбрать другую папку"; -"web_files_delete" = "Удалить"; -"web_files_in_browser" = "В хранилище этого браузера"; -"web_files_save_hint_fmt" = "При сохранении программа попадает в %@."; -"web_files_empty" = "Пока ничего не сохранено. При сохранении VisuStruct создаёт здесь папку с сегодняшней датой."; -"web_files_reconnect_hint" = "После перезагрузки браузер ещё раз спросит, может ли VisuStruct использовать твою папку."; -"web_files_reconnect_fmt" = "Открыть папку «%@»"; -"web_files_connect_hint" = "Выбери папку как рабочее пространство. VisuStruct создаёт в ней папку для каждого дня и сохраняет диаграмму и код."; -"web_files_connect" = "Выбрать папку"; -"web_files_browser_hint" = "Этот браузер не может открывать папки на устройстве (напр. на iPad). Твои файлы остаются в хранилище этого браузера."; -"web_files_browser" = "Сохранять в браузере"; -"web_files_delete_confirm_fmt" = "Действительно удалить «%@»?"; -"web_files_folder_prompt" = "Имя новой папки:"; -"web_files_default_name" = "Программа"; -"web_files_saved_fmt" = "Сохранено: %@"; -"web_files_create" = "Создать"; -"web_learn_ludwig_tip" = "Совет Людвига"; -"web_game_title" = "Игра: Истина или ложь?"; -"web_game_intro" = "Людвиг показывает значения и условие. Условие истинно (true) или ложно (false)? Десять раундов, всё сложнее."; -"web_game_start" = "Начать игру"; -"web_game_round_fmt" = "Раунд %@ из %@"; -"web_game_score_fmt" = "Очки: %@"; -"web_game_true" = "истина (true)"; -"web_game_false" = "ложь (false)"; -"web_game_right" = "Верно!"; -"web_game_wrong" = "Не совсем. Вот как это вычисляется:"; -"web_game_next" = "Дальше"; -"web_game_finish" = "Результат"; -"web_game_done_fmt" = "%@ из %@ верно."; -"web_game_perfect" = "Всё верно – Людвиг впечатлён!"; -"web_game_good" = "Отлично! Посмотри на ошибки и попробуй ещё раз."; -"web_game_practice" = "Повторение – мать учения. Перечитай таблицу истинности и сыграй ещё раз."; -"web_game_again" = "Играть снова"; -"web_game_wrong_short" = "К сожалению, неверно."; -"web_game_practice_short" = "Повторение — мать учения. Перечитай объяснения и сыграй ещё раунд."; -"web_game_clicks" = "Клики:"; -"web_game_nobody" = "Никто не слушает — ничего не происходит."; -"web_game_event_fmt" = "Клик по «%@»: слушатель слышит это и выполняет свой код."; -"web_game_try" = "Теперь попробуй кнопки в окне сам."; -"web_game_time_fmt" = "Осталось %@ с"; -"web_game_defused" = "✂️ Обезврежено! Ты нашёл ошибку."; -"web_game_boom_time" = "💥 Бум! Время вышло."; -"web_game_boom_wrong" = "💥 Бум! Это была не та строка."; -"web_game_boom_part" = "💥 Бум! Строка верная, но ошибка в другой её части."; -"web_game_boom_wrong_part" = "💥 Бум! Ошибка в другой строке."; -"web_game_bomb_parts_hint" = "Нажми точно на неправильную часть."; -"web_game_fix" = "Правильная строка:"; -"web_game_order_hint" = "Нажимай на шаги в правильном порядке."; -"web_debug_step" = "Шаг"; -"web_debug_step_title" = "Шаг: выполнить одну инструкцию и снова остановиться"; -"web_debug_continue" = "Продолжить до следующей точки останова"; -"web_debug_paused_fmt" = "Остановлено перед строкой %d."; -"web_debug_gutter_title" = "Нажми на номер строки, чтобы поставить или убрать точку останова"; -"web_swap_to_code" = "Программирование крупно"; -"web_swap_to_editor" = "Структограмма крупно"; -"web_editor_resize" = "Изменить ширину структограммы"; -"web_palette_resize" = "Изменить ширину элементов"; -"web_palette_hide" = "Скрыть элементы"; -"web_palette_show" = "Показать элементы"; -"web_code_scopes" = "Цветные блоки кода"; -"web_code_scopes_hint" = "Класс, метод, цикл, ветвление в отдельных рамках"; -"web_pseudocode" = "Псевдокод"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Переименовать переменную …"; -"web_rename_title" = "Переименовать переменную"; -"web_rename_old" = "Имя"; -"web_rename_new" = "Новое имя"; -"web_rename_hint" = "Меняет каждое место с точно таким написанием (number — не Number), в коде и на структурограмме. Текст в \\"…\\" и комментарии остаются."; -"web_rename_count_fmt" = "Встречается %d раз(а)."; -"web_rename_exists_fmt" = "«%@» уже есть: после этого обе станут одной переменной."; -"web_rename_invalid" = "Имя начинается с буквы и содержит только буквы, цифры и _."; -"web_rename_keyword_fmt" = "«%@» — ключевое слово Java."; -"web_rename_apply" = "Переименовать"; -"web_rename_cancel" = "Отмена"; -`;export{e as default}; diff --git a/website/app/assets/schiffe-versenken-CXt1SF0S.svg b/website/app/assets/schiffe-versenken-CXt1SF0S.svg deleted file mode 100644 index 289e2fd5..00000000 --- a/website/app/assets/schiffe-versenken-CXt1SF0S.svg +++ /dev/null @@ -1,55 +0,0 @@ - - -A -0 -B -1 -C -2 -D -3 -E -4 -1 -0 - - - - - -2 -1 - - - - - -3 -2 - - - - - -4 -3 - - - - - -5 -4 - - - - - - - - - - - -Index - diff --git a/website/app/assets/schiffe-versenken-iEBDHIxD.svg b/website/app/assets/schiffe-versenken-iEBDHIxD.svg deleted file mode 100644 index 8aeefaab..00000000 --- a/website/app/assets/schiffe-versenken-iEBDHIxD.svg +++ /dev/null @@ -1,55 +0,0 @@ - - -A -0 -B -1 -C -2 -D -3 -E -4 -1 -0 - - - - - -2 -1 - - - - - -3 -2 - - - - - -4 -3 - - - - - -5 -4 - - - - - - - - - - - -Índice - diff --git a/website/app/assets/ss-binaere-suche-CPsLGldq.svg b/website/app/assets/ss-binaere-suche-CPsLGldq.svg deleted file mode 100644 index c05c4a47..00000000 --- a/website/app/assets/ss-binaere-suche-CPsLGldq.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Gesucht: die 27. Die Karten sind sortiert. -1. Mitte: 13 < 27, links fällt weg -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2. Mitte: 21 < 27, links fällt weg -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3. Mitte: gefunden nach 3 Vergleichen -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/website/app/assets/ss-binaere-suche-D02W1TH_.svg b/website/app/assets/ss-binaere-suche-D02W1TH_.svg deleted file mode 100644 index e5250f36..00000000 --- a/website/app/assets/ss-binaere-suche-D02W1TH_.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Looking for the 27. The cards are sorted. -1st middle: 13 < 27, drop the left -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2nd middle: 21 < 27, drop the left -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3rd middle: found after 3 comparisons -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/website/app/assets/ss-binaere-suche-DVVS2SNc.svg b/website/app/assets/ss-binaere-suche-DVVS2SNc.svg deleted file mode 100644 index 8caadd8c..00000000 --- a/website/app/assets/ss-binaere-suche-DVVS2SNc.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Procura-se o 27. As cartas estão ordenadas. -1.º meio: 13 < 27, a esquerda sai -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -2.º meio: 21 < 27, a esquerda sai -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ -3.º meio: encontrado após 3 comparações -2♦ -3♣ -5♠ -7♣ -8♥ -10♦ -12♥ -13♠ -15♣ -18♦ -20♥ -21♠ -24♥ -27♣ -30♦ - diff --git a/website/app/assets/ss-bubblesort-AFDcFDah.svg b/website/app/assets/ss-bubblesort-AFDcFDah.svg deleted file mode 100644 index 9b13f206..00000000 --- a/website/app/assets/ss-bubblesort-AFDcFDah.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -Uma ronda: comparar vizinhos -7♥ -3♠ -10♦ -5♣ -2♥ -Início -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: trocar -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: certo -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: trocar -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: trocar -A carta maior sobe para a direita como uma bolha. - diff --git a/website/app/assets/ss-bubblesort-CmKEoNfO.svg b/website/app/assets/ss-bubblesort-CmKEoNfO.svg deleted file mode 100644 index a584b009..00000000 --- a/website/app/assets/ss-bubblesort-CmKEoNfO.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -One round: compare neighbours -7♥ -3♠ -10♦ -5♣ -2♥ -Start -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: swap -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: fine -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: swap -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: swap -The largest card rises to the right like a bubble. - diff --git a/website/app/assets/ss-bubblesort-Dic2ZfaT.svg b/website/app/assets/ss-bubblesort-Dic2ZfaT.svg deleted file mode 100644 index 6c47eef5..00000000 --- a/website/app/assets/ss-bubblesort-Dic2ZfaT.svg +++ /dev/null @@ -1,35 +0,0 @@ - - -Ein Durchgang: Nachbarn vergleichen -7♥ -3♠ -10♦ -5♣ -2♥ -Start -3♠ -7♥ -10♦ -5♣ -2♥ -7 > 3: tauschen -3♠ -7♥ -10♦ -5♣ -2♥ -7 < 10: passt -3♠ -7♥ -5♣ -10♦ -2♥ -10 > 5: tauschen -3♠ -7♥ -5♣ -2♥ -10♦ -10 > 2: tauschen -Die größte Karte steigt wie eine Blase nach rechts. - diff --git a/website/app/assets/ss-vergleiche-DRqzU2TZ.svg b/website/app/assets/ss-vergleiche-DRqzU2TZ.svg deleted file mode 100644 index 1cf631a0..00000000 --- a/website/app/assets/ss-vergleiche-DRqzU2TZ.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Vergleiche im schlimmsten Fall -Lineare SucheBinäre Suche -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Anzahl der Karten -Vergleiche - - -100 Vergleiche -7 Vergleiche - diff --git a/website/app/assets/ss-vergleiche-DWgkIvLr.svg b/website/app/assets/ss-vergleiche-DWgkIvLr.svg deleted file mode 100644 index 672279b3..00000000 --- a/website/app/assets/ss-vergleiche-DWgkIvLr.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Comparações no pior caso -Pesquisa linearPesquisa binária -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Número de cartas -Comparações - - -100comparações -7 comparações - diff --git a/website/app/assets/ss-vergleiche-UczNldcC.svg b/website/app/assets/ss-vergleiche-UczNldcC.svg deleted file mode 100644 index 57a87c8a..00000000 --- a/website/app/assets/ss-vergleiche-UczNldcC.svg +++ /dev/null @@ -1,22 +0,0 @@ - - -Comparisons in the worst case -Linear searchBinary search -0 -25 -50 -75 -100 -0 -25 -50 -75 -100 - -Number of cards -Comparisons - - -100 comparisons -7 comparisons - diff --git a/website/app/assets/sv-BZ9E37oq.js b/website/app/assets/sv-BZ9E37oq.js deleted file mode 100644 index 75b56fbe..00000000 --- a/website/app/assets/sv-BZ9E37oq.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Texter som bara finns i webbversionen. Allt annat kommer från appens Localizable.strings. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct-struktogram"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Exportera…"; -"web_export_title" = "Spara som bild eller PDF, eller skriv ut"; -"web_export_png" = "Bild (PNG)"; -"web_export_svg" = "Vektorgrafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct-fil (.visustruct)"; -"web_export_failed_fmt" = "Exporten misslyckades: %@"; -"web_print_hint" = "Använd ”Exportera… → PDF” för att spara diagrammet och skriva ut det därifrån."; -"web_delete" = "Radera"; -"web_language_title" = "Gränssnittets språk"; -"web_simulation_start" = "Starta simulering"; -"web_simulation_end" = "Avsluta simulering"; -"web_simulation_start_title" = "Kör struktogrammet steg för steg"; -"web_simulation_end_title" = "Avsluta simuleringen och fortsätt redigera"; -"web_palette_hint" = "Dra in i struktogrammet"; -"web_tabs_label" = "Diagram"; -"web_status_modified" = "ändrad"; -"web_inspector_title" = "Egenskaper"; -"web_inspector_resize" = "Ändra objektinspektörens höjd: dra eller svep linjen uppåt eller nedåt (dubbelklick: standard)"; -"web_inspector_help_drop" = "Dra element från paletten till en ruta: överst = före, nederst = efter, på ”ø” = ersätt. Befintliga element kan flyttas med musen."; -"web_inspector_help_inline" = "Dubbelklicka eller dubbeltryck på ett element för att redigera texten direkt i diagrammet (Enter verkställer, Esc avbryter). Gäller även case-namn."; -"web_inspector_help_files" = "Du kan också släppa filer i fönstret."; -"web_case_name" = "Namn på case"; -"web_case_name_placeholder" = "t.ex. 1, ok, default"; -"web_copied" = "Elementet kopierat."; -"web_discard_message_fmt" = "Ändringarna i ”%@” går förlorade."; -"web_err_unreadable_fmt" = "”%@” är inte en läsbar VisuStruct-fil (%@)."; -"web_saved_fmt" = "”%@” sparad."; -"web_saved_txt_fmt" = "Sparad som ”%@”. Ta bort filändelsen .txt för att använda den."; -"web_drop_impossible" = "Kan inte släppas här"; -"web_sim_delay" = "Paus per steg"; -"web_sim_delay_value_fmt" = "%@ s"; -"web_codegen_language" = "Språk"; -"web_codegen_comments" = "Diagramtext som kommentarer"; -"web_codegen_empty_else" = "Skriv ut tom else-gren i koden"; -"web_copied_check" = "Kopierat ✓"; -"web_copy_manual" = "Markerat, tryck Ctrl+C för att kopiera"; -"web_run_stopped_loop" = "Körningen stoppades: möjlig oändlig loop."; -"web_run_cancelled" = "Körningen avbröts."; -"web_run_error" = "Fel vid körning."; -"web_run_dropped_fmt" = "… %d tidigare rader dolda"; -"web_sim_call_arguments_fmt" = "Anropet passar inte till huvudet i %@. Kontrollera värdena inom parentes."; -"web_sim_missing_return_fmt" = "%@ avslutades utan att returnera ett värde med return."; -"web_sim_file_not_found_fmt" = "Det finns ingen fil som heter %@."; -"web_sim_end_of_file_fmt" = "Filen %@ har inga fler rader."; -"web_sim_null_value_fmt" = "%@ är null."; -"web_sim_unknown_variable_case_fmt" = "Okänd variabel: %1$@. Java skiljer på stora och små bokstäver: menade du %2$@?"; -"web_sim_written_file_fmt" = "%@ (sparad)"; -"web_site_home" = "Startsida"; -"web_site_imprint" = "Kontaktuppgifter"; -"web_site_privacy" = "Integritet"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programmering"; -"web_live_hide" = "Dölj programmering"; -"web_scale_canvas" = "Textstorlek: strukturdiagram"; -"web_scale_code" = "Textstorlek: programmering"; -"web_live_indent" = "Indrag"; -"web_live_indent_title" = "Gör indrag i koden: fyra blanksteg per nivå (markerade rader, annars allt)"; -"web_live_show" = "Visa programmering"; -"web_live_resize" = "Ändra kodområdets bredd (dubbelklick: återställ)"; -"web_live_hint" = "Koden växer med ditt diagram. Grått = platshållare: skriv i inspektören så visas texten här. Klicka på en rad för att markera elementet."; -"web_live_ph_selector" = "variabel"; -"web_live_ph_code" = "Din kod"; -"web_live_ph_end" = "slut"; -"web_live_language" = "Programmeringsspråk"; -"web_live_java_class" = "Som klass"; -"web_live_java_class_hint" = "Klassnamn = diagrammets titel"; -"web_live_java_main" = "Med main-metod"; -"web_settings_display" = "Visning"; -"web_live_swing" = "Riktig Java (med Swing)"; -"web_live_swing_hint" = "Riktig Java med fönster (CheerpJ). Laddar ner ca 40 MB en gång vid första körningen."; -"web_live_swing_windows" = "Java-fönster"; -"web_live_swing_hide" = "Stäng Java-fönster"; -"web_live_swing_loading" = "Java laddas (första gången ca 40 MB) …"; -"web_live_swing_compiling" = "Kompilerar …"; -"web_live_swing_running" = "Programmet körs."; -"web_live_swing_compile_failed" = "Kompileringsfel, se ovan."; -"web_live_swing_failed" = "Java kunde inte laddas. Kontrollera internetanslutningen."; -"web_live_hint_edit" = "Skriv Java-kod här så bygger diagrammet sig självt. Eller arbeta i diagrammet så växer koden med. Grått = platshållare, skriv bara över."; -"web_live_edit_label" = "Java-kod"; -"web_parse_line_fmt" = "Rad %d: %@"; -"web_parse_missing" = "Här saknas ännu: %@"; -"web_parse_extra" = "För mycket: %@"; -"web_parse_unclosed_string" = "Det avslutande %@ saknas."; -"web_parse_else_without_if" = "Denna ”else” har ingen ”if”."; -"web_parse_case_outside_switch" = "”case” och ”default” hör hemma i en ”switch”."; -"web_parse_missing_do_while" = "Efter ”do { … }” saknas ”while (villkor);”."; -"web_parse_more_methods" = "För tillfället räknas bara en metod här. Skapa andra underprogram i egna flikar."; -"web_parse_missing_import" = "Högst upp saknas %@ Utan den raden känner Java inte till Scanner."; -"web_parse_missing_scanner" = "Innan saknas %@ Utan den raden finns ingen Scanner."; -"web_parse_unknown_type" = "Java känner inte till den här datatypen. Menade du %@?"; -"web_quickfix_insert_fmt" = "Förslag: infoga %@"; -"web_quickfix_replace_fmt" = "Förslag: %1$@ i stället för %2$@"; -"web_parse_wrong_case" = "Java skiljer på stora och små bokstäver. Rätt är %@."; -"web_editor_title" = "Strukturdiagram"; -"web_editor_show" = "Visa strukturdiagram"; -"web_editor_hide" = "Dölj strukturdiagram"; -"web_keywords_title" = "Kodnyckelord"; -"web_keywords_hint" = "if, while, for i stället för elementnamn"; -"web_palette_compact" = "Element alltid kompakta"; -"web_palette_compact_hint" = "Symbol med litet namn under, annars bara när kolumnen är smal"; -"web_about_version_fmt" = "Version %@"; -"web_about_software" = "Programvara som används"; -"web_about_software_text" = "Kodredigeraren använder CodeMirror och Lezer (MIT-licens). Med Swing-stöd laddar VisuStruct CheerpJ från Leaning Technologies (Community-licens) och javac från OpenJDK."; -"web_about_licenses" = "Licenstexter"; -"web_live_run" = "Kör"; -"web_live_run_title" = "Kör programmet: utdata och indata visas nedanför"; -"web_live_run_finished" = "Programmet är klart."; -"web_live_run_stopped" = "Stoppat."; -"web_console" = "Konsol"; -"web_console_hide" = "Dölj konsolen"; -"web_console_resize" = "Ändra konsolens höjd"; -"web_diagram_tools" = "Diagramverktyg"; -"web_files_title" = "Filer"; -"web_files_show" = "Visa filer"; -"web_files_hide" = "Dölj filer"; -"web_files_resize" = "Ändra bredd på filer"; -"web_files_new_folder" = "Ny mapp"; -"web_files_switch" = "Välj en annan mapp"; -"web_files_delete" = "Ta bort"; -"web_files_in_browser" = "I den här webbläsarens lagring"; -"web_files_save_hint_fmt" = "Sparandet lägger programmet i %@."; -"web_files_empty" = "Inget sparat ännu. När du sparar skapar VisuStruct en mapp med dagens datum här."; -"web_files_reconnect_hint" = "Efter omladdning frågar webbläsaren igen om VisuStruct får använda din mapp."; -"web_files_reconnect_fmt" = "Öppna mappen ”%@”"; -"web_files_connect_hint" = "Välj en mapp som arbetsyta. VisuStruct skapar en mapp för varje dag där och sparar diagram och kod."; -"web_files_connect" = "Välj mapp"; -"web_files_browser_hint" = "Den här webbläsaren kan inte öppna mappar på enheten (t.ex. på iPad). Dina filer stannar i webbläsarens lagring."; -"web_files_browser" = "Spara i webbläsaren"; -"web_files_delete_confirm_fmt" = "Vill du verkligen ta bort ”%@”?"; -"web_files_folder_prompt" = "Namn på den nya mappen:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Sparat: %@"; -"web_files_create" = "Skapa"; -"web_learn_ludwig_tip" = "Ludwigs tips"; -"web_game_title" = "Spel: Sant eller falskt?"; -"web_game_intro" = "Ludwig visar värden och ett villkor. Är villkoret sant (true) eller falskt (false)? Tio rundor, allt svårare."; -"web_game_start" = "Starta spelet"; -"web_game_round_fmt" = "Runda %@ av %@"; -"web_game_score_fmt" = "Poäng: %@"; -"web_game_true" = "sant (true)"; -"web_game_false" = "falskt (false)"; -"web_game_right" = "Rätt!"; -"web_game_wrong" = "Inte riktigt. Så räknar man:"; -"web_game_next" = "Nästa"; -"web_game_finish" = "Resultat"; -"web_game_done_fmt" = "%@ av %@ rätt."; -"web_game_perfect" = "Allt rätt – Ludwig är imponerad!"; -"web_game_good" = "Snyggt! Titta på dina misstag och försök igen."; -"web_game_practice" = "Övning ger färdighet. Läs sanningstabellen igen och spela en runda till."; -"web_game_again" = "Spela igen"; -"web_game_wrong_short" = "Tyvärr fel."; -"web_game_practice_short" = "Övning ger färdighet. Läs förklaringarna igen och spela en runda till."; -"web_game_clicks" = "Klick:"; -"web_game_nobody" = "Ingen lyssnar – ingenting händer."; -"web_game_event_fmt" = "Klick på ”%@”: lyssnaren hör det och kör sin kod."; -"web_game_try" = "Prova nu själv knapparna i fönstret."; -"web_game_time_fmt" = "%@ s kvar"; -"web_game_defused" = "✂️ Desarmerad! Du hittade felet."; -"web_game_boom_time" = "💥 Pang! Tiden är ute."; -"web_game_boom_wrong" = "💥 Pang! Det var fel rad."; -"web_game_boom_part" = "💥 Pang! Rätt rad, men felet sitter i en annan del."; -"web_game_boom_wrong_part" = "💥 Pang! Felet sitter på en annan rad."; -"web_game_bomb_parts_hint" = "Tryck exakt på den felaktiga delen."; -"web_game_fix" = "Rätt rad:"; -"web_game_order_hint" = "Tryck på stegen i rätt ordning."; -"web_debug_step" = "Steg"; -"web_debug_step_title" = "Steg: kör en sats och pausa igen"; -"web_debug_continue" = "Fortsätt till nästa brytpunkt"; -"web_debug_paused_fmt" = "Pausad före rad %d."; -"web_debug_gutter_title" = "Klicka på ett radnummer för att sätta eller ta bort en brytpunkt"; -"web_swap_to_code" = "Programmering stor"; -"web_swap_to_editor" = "Struktogram stort"; -"web_editor_resize" = "Ändra bredd på struktogrammet"; -"web_palette_resize" = "Ändra bredd på elementen"; -"web_palette_hide" = "Dölj elementen"; -"web_palette_show" = "Visa elementen"; -"web_code_scopes" = "Färgade kodblock"; -"web_code_scopes_hint" = "Klass, metod, loop, förgrening i egna rutor"; -"web_pseudocode" = "Pseudokod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Byt namn på variabel …"; -"web_rename_title" = "Byt namn på variabel"; -"web_rename_old" = "Namn"; -"web_rename_new" = "Nytt namn"; -"web_rename_hint" = "Ändrar varje ställe med exakt denna stavning (tal är inte Tal), i koden och i strukturdiagrammet. Text inom \\"…\\" och kommentarer blir kvar."; -"web_rename_count_fmt" = "Förekommer %d gånger."; -"web_rename_exists_fmt" = "”%@” finns redan: efteråt skulle båda vara en variabel."; -"web_rename_invalid" = "Ett namn börjar med en bokstav och innehåller bara bokstäver, siffror och _."; -"web_rename_keyword_fmt" = "”%@” är ett nyckelord i Java."; -"web_rename_apply" = "Byt namn"; -"web_rename_cancel" = "Avbryt"; -`;export{e as default}; diff --git a/website/app/assets/tr-C3W_u6Ol.js b/website/app/assets/tr-C3W_u6Ol.js deleted file mode 100644 index 487f537f..00000000 --- a/website/app/assets/tr-C3W_u6Ol.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Yalnızca web sürümünde bulunan metinler. Geri kalan her şey uygulamanın Localizable.strings dosyalarından gelir. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct yapı şeması"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Dışa aktar…"; -"web_export_title" = "Görsel veya PDF olarak kaydet ya da yazdır"; -"web_export_png" = "Görsel (PNG)"; -"web_export_svg" = "Vektör grafik (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "VisuStruct dosyası (.visustruct)"; -"web_export_failed_fmt" = "Dışa aktarma başarısız: %@"; -"web_print_hint" = "Diyagramı kaydetmek için “Dışa aktar… → PDF” seçeneğini kullanın ve oradan yazdırın."; -"web_delete" = "Sil"; -"web_language_title" = "Arayüz dili"; -"web_simulation_start" = "Simülasyonu başlat"; -"web_simulation_end" = "Simülasyonu bitir"; -"web_simulation_start_title" = "Yapı şemasını adım adım çalıştır"; -"web_simulation_end_title" = "Simülasyonu bitir ve düzenlemeye devam et"; -"web_palette_hint" = "Yapı şemasına sürükleyin"; -"web_tabs_label" = "Diyagramlar"; -"web_status_modified" = "değiştirildi"; -"web_inspector_title" = "Özellikler"; -"web_inspector_resize" = "Nesne denetçisinin yüksekliğini değiştir: çizgiyi yukarı veya aşağı sürükle ya da kaydır (çift tıklama: varsayılan)"; -"web_inspector_help_drop" = "Paletteki öğeleri bir kutucuğa sürükleyin: üst = önce, alt = sonra, “ø” üzerine = değiştir. Mevcut öğeler fareyle taşınabilir."; -"web_inspector_help_inline" = "Metni doğrudan diyagramda düzenlemek için bir öğeye çift tıklayın veya çift dokunun (Enter uygular, Esc iptal eder). Durum adları da böyle değişir."; -"web_inspector_help_files" = "Dosyaları pencereye de bırakabilirsiniz."; -"web_case_name" = "Durum adı"; -"web_case_name_placeholder" = "ör. 1, ok, default"; -"web_copied" = "Öğe kopyalandı."; -"web_discard_message_fmt" = "“%@” üzerindeki değişiklikler kaybolacak."; -"web_err_unreadable_fmt" = "“%@” okunabilir bir VisuStruct dosyası değil (%@)."; -"web_saved_fmt" = "“%@” kaydedildi."; -"web_saved_txt_fmt" = "“%@” olarak kaydedildi. Kullanmak için .txt uzantısını kaldırın."; -"web_drop_impossible" = "Buraya bırakılamaz"; -"web_sim_delay" = "Adım başına duraklama"; -"web_sim_delay_value_fmt" = "%@ sn"; -"web_codegen_language" = "Dil"; -"web_codegen_comments" = "Diyagram metni yorum olarak"; -"web_codegen_empty_else" = "Kodda boş else dalı oluştur"; -"web_copied_check" = "Kopyalandı ✓"; -"web_copy_manual" = "Seçildi, kopyalamak için Ctrl+C tuşlarına basın"; -"web_run_stopped_loop" = "Çalıştırma durduruldu: olası sonsuz döngü."; -"web_run_cancelled" = "Çalıştırma iptal edildi."; -"web_run_error" = "Çalıştırma sırasında hata."; -"web_run_dropped_fmt" = "… önceki %d satır gizlendi"; -"web_sim_call_arguments_fmt" = "Çağrı %@ başlığıyla eşleşmiyor. Parantez içindeki değerleri kontrol et."; -"web_sim_missing_return_fmt" = "%@ return ile bir değer döndürmeden bitti."; -"web_sim_file_not_found_fmt" = "%@ adında bir dosya yok."; -"web_sim_end_of_file_fmt" = "%@ dosyasında başka satır yok."; -"web_sim_null_value_fmt" = "%@ null."; -"web_sim_unknown_variable_case_fmt" = "Bilinmeyen değişken: %1$@. Java büyük ve küçük harfleri ayırt eder: %2$@ mı demek istedin?"; -"web_sim_written_file_fmt" = "%@ (kaydedildi)"; -"web_site_home" = "Ana sayfa"; -"web_site_imprint" = "Künye"; -"web_site_privacy" = "Gizlilik"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Programlama"; -"web_live_hide" = "Programlamayı gizle"; -"web_scale_canvas" = "Yazı boyutu: yapı diyagramı"; -"web_scale_code" = "Yazı boyutu: programlama"; -"web_live_indent" = "Girinti"; -"web_live_indent_title" = "Kodu girintile: her seviye için dört boşluk (seçili satırlar, yoksa tümü)"; -"web_live_show" = "Programlamayı göster"; -"web_live_resize" = "Kod alanının genişliğini değiştir (çift tıklama: sıfırla)"; -"web_live_hint" = "Kod diyagramınla birlikte büyür. Gri = yer tutucu: denetçiye yaz, metnin burada görünür. Öğesini seçmek için bir satıra tıkla."; -"web_live_ph_selector" = "değişken"; -"web_live_ph_code" = "Kodun"; -"web_live_ph_end" = "bitiş"; -"web_live_language" = "Programlama dili"; -"web_live_java_class" = "Sınıf olarak"; -"web_live_java_class_hint" = "Sınıf adı = diyagram başlığı"; -"web_live_java_main" = "main metoduyla"; -"web_settings_display" = "Görünüm"; -"web_live_swing" = "Gerçek Java (Swing ile)"; -"web_live_swing_hint" = "Pencereli gerçek Java (CheerpJ). İlk çalıştırmada bir kez yaklaşık 40 MB indirir."; -"web_live_swing_windows" = "Java pencereleri"; -"web_live_swing_hide" = "Java pencerelerini kapat"; -"web_live_swing_loading" = "Java yükleniyor (ilk seferde yaklaşık 40 MB) …"; -"web_live_swing_compiling" = "Derleniyor …"; -"web_live_swing_running" = "Program çalışıyor."; -"web_live_swing_compile_failed" = "Derleme hatası, yukarıya bak."; -"web_live_swing_failed" = "Java yüklenemedi. İnternet bağlantını kontrol et."; -"web_live_hint_edit" = "Buraya Java kodu yaz, diyagram kendiliğinden oluşsun. Ya da diyagramda çalış, kod onunla büyüsün. Gri = yer tutucu, üzerine yazman yeterli."; -"web_live_edit_label" = "Java kodu"; -"web_parse_line_fmt" = "Satır %d: %@"; -"web_parse_missing" = "Burada hâlâ eksik: %@"; -"web_parse_extra" = "Fazla: %@"; -"web_parse_unclosed_string" = "Kapanış %@ eksik."; -"web_parse_else_without_if" = "Bu “else” için bir “if” yok."; -"web_parse_case_outside_switch" = "“case” ve “default” bir “switch” içinde olmalı."; -"web_parse_missing_do_while" = "“do { … }” sonrasında “while (koşul);” eksik."; -"web_parse_more_methods" = "Şimdilik burada yalnızca bir metot sayılır. Diğer alt programları ayrı sekmelerde oluştur."; -"web_parse_missing_import" = "En üstte %@ eksik. Bu satır olmadan Java Scanner’ı tanımaz."; -"web_parse_missing_scanner" = "Önce %@ eksik. Bu satır olmadan Scanner yoktur."; -"web_parse_unknown_type" = "Java bu veri türünü tanımıyor. %@ mı demek istedin?"; -"web_quickfix_insert_fmt" = "Öneri: %@ ekle"; -"web_quickfix_replace_fmt" = "Öneri: %2$@ yerine %1$@"; -"web_parse_wrong_case" = "Java büyük ve küçük harfleri ayırt eder. Doğrusu %@."; -"web_editor_title" = "Diyagram"; -"web_editor_show" = "Diyagramı göster"; -"web_editor_hide" = "Diyagramı gizle"; -"web_keywords_title" = "Kod anahtar sözcükleri"; -"web_keywords_hint" = "Öğe adları yerine if, while, for"; -"web_palette_compact" = "Öğeler her zaman kompakt"; -"web_palette_compact_hint" = "Simgenin altında küçük ad; aksi halde yalnızca sütun dar olduğunda"; -"web_about_version_fmt" = "Sürüm %@"; -"web_about_software" = "Kullanılan yazılımlar"; -"web_about_software_text" = "Kod düzenleyici CodeMirror ve Lezer kullanır (MIT lisansı). Swing desteğiyle VisuStruct, Leaning Technologies’in CheerpJ’sini (Community lisansı) ve OpenJDK’dan javac’ı yükler."; -"web_about_licenses" = "Lisans metinleri"; -"web_live_run" = "Çalıştır"; -"web_live_run_title" = "Programı çalıştır: çıktı ve girdi aşağıda görünür"; -"web_live_run_finished" = "Program bitti."; -"web_live_run_stopped" = "Durduruldu."; -"web_console" = "Konsol"; -"web_console_hide" = "Konsolu gizle"; -"web_console_resize" = "Konsolu yeniden boyutlandır"; -"web_diagram_tools" = "Diyagram araçları"; -"web_files_title" = "Dosyalar"; -"web_files_show" = "Dosyaları göster"; -"web_files_hide" = "Dosyaları gizle"; -"web_files_resize" = "Dosyaların genişliğini değiştir"; -"web_files_new_folder" = "Yeni klasör"; -"web_files_switch" = "Başka bir klasör seç"; -"web_files_delete" = "Sil"; -"web_files_in_browser" = "Bu tarayıcının belleğinde"; -"web_files_save_hint_fmt" = "Kaydetme programı %@ içine koyar."; -"web_files_empty" = "Henüz bir şey kaydedilmedi. Kaydettiğinde VisuStruct burada bugünün tarihiyle bir klasör oluşturur."; -"web_files_reconnect_hint" = "Yeniden yüklemeden sonra tarayıcı, VisuStruct’ın klasörünü kullanıp kullanamayacağını bir kez daha sorar."; -"web_files_reconnect_fmt" = "“%@” klasörünü aç"; -"web_files_connect_hint" = "Çalışma alanı olarak bir klasör seç. VisuStruct içinde her gün için bir klasör oluşturur, diyagramı ve kodu kaydeder."; -"web_files_connect" = "Klasör seç"; -"web_files_browser_hint" = "Bu tarayıcı cihazdaki klasörleri açamaz (ör. iPad’de). Dosyaların bu tarayıcının belleğinde kalır."; -"web_files_browser" = "Tarayıcıya kaydet"; -"web_files_delete_confirm_fmt" = "“%@” gerçekten silinsin mi?"; -"web_files_folder_prompt" = "Yeni klasörün adı:"; -"web_files_default_name" = "Program"; -"web_files_saved_fmt" = "Kaydedildi: %@"; -"web_files_create" = "Oluştur"; -"web_learn_ludwig_tip" = "Ludwig’in ipucu"; -"web_game_title" = "Oyun: Doğru mu yanlış mı?"; -"web_game_intro" = "Ludwig sana değerler ve bir koşul gösterir. Koşul doğru (true) mu yanlış (false) mı? On tur, giderek zorlaşır."; -"web_game_start" = "Oyunu başlat"; -"web_game_round_fmt" = "Tur %@ / %@"; -"web_game_score_fmt" = "Puan: %@"; -"web_game_true" = "doğru (true)"; -"web_game_false" = "yanlış (false)"; -"web_game_right" = "Doğru!"; -"web_game_wrong" = "Maalesef yanlış. Şöyle hesaplanır:"; -"web_game_next" = "İleri"; -"web_game_finish" = "Sonuç"; -"web_game_done_fmt" = "%@ / %@ doğru."; -"web_game_perfect" = "Hepsi doğru – Ludwig çok etkilendi!"; -"web_game_good" = "Harika! Hatalarına bir daha bak ve yeniden dene."; -"web_game_practice" = "Pratik mükemmelleştirir. Yukarıdaki doğruluk tablosunu tekrar oku ve bir tur daha oyna."; -"web_game_again" = "Tekrar oyna"; -"web_game_wrong_short" = "Maalesef yanlış."; -"web_game_practice_short" = "Pratik mükemmelleştirir. Açıklamaları tekrar oku ve bir tur daha oyna."; -"web_game_clicks" = "Tıklamalar:"; -"web_game_nobody" = "Kimse dinlemiyor – hiçbir şey olmuyor."; -"web_game_event_fmt" = "“%@” tıklandı: dinleyici bunu duyar ve kodunu çalıştırır."; -"web_game_try" = "Şimdi penceredeki düğmeleri kendin dene."; -"web_game_time_fmt" = "%@ sn kaldı"; -"web_game_defused" = "✂️ Etkisiz hâle getirildi! Hatayı buldun."; -"web_game_boom_time" = "💥 Bum! Süre doldu."; -"web_game_boom_wrong" = "💥 Bum! Yanlış satırdı."; -"web_game_boom_part" = "💥 Bum! Satır doğru, ama hata başka bir parçada."; -"web_game_boom_wrong_part" = "💥 Bum! Hata başka bir satırda."; -"web_game_bomb_parts_hint" = "Tam olarak yanlış parçaya dokun."; -"web_game_fix" = "Doğru satır:"; -"web_game_order_hint" = "Adımlara doğru sırayla dokun."; -"web_debug_step" = "Adım"; -"web_debug_step_title" = "Adım: bir komutu çalıştır ve yeniden dur"; -"web_debug_continue" = "Bir sonraki kesme noktasına kadar devam et"; -"web_debug_paused_fmt" = "%d. satırdan önce duraklatıldı."; -"web_debug_gutter_title" = "Kesme noktası koymak veya kaldırmak için satır numarasına tıkla"; -"web_swap_to_code" = "Programlama büyük"; -"web_swap_to_editor" = "Yapı diyagramı büyük"; -"web_editor_resize" = "Diyagram genişliğini değiştir"; -"web_palette_resize" = "Öğelerin genişliğini değiştir"; -"web_palette_hide" = "Öğeleri gizle"; -"web_palette_show" = "Öğeleri göster"; -"web_code_scopes" = "Renkli kod blokları"; -"web_code_scopes_hint" = "Sınıf, metot, döngü, dallanma kendi kutularında"; -"web_pseudocode" = "Sözde kod"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Değişkeni yeniden adlandır …"; -"web_rename_title" = "Değişkeni yeniden adlandır"; -"web_rename_old" = "Ad"; -"web_rename_new" = "Yeni ad"; -"web_rename_hint" = "Tam olarak bu yazılışa sahip her yeri değiştirir (sayi, Sayi değildir), kodda ve yapı diyagramında. \\"…\\" içindeki metin ve yorumlar kalır."; -"web_rename_count_fmt" = "%d kez geçiyor."; -"web_rename_exists_fmt" = "“%@” zaten var: sonra ikisi tek bir değişken olur."; -"web_rename_invalid" = "Bir ad harfle başlar ve yalnızca harf, rakam ve _ içerir."; -"web_rename_keyword_fmt" = "“%@” bir Java anahtar sözcüğüdür."; -"web_rename_apply" = "Yeniden adlandır"; -"web_rename_cancel" = "İptal"; -`;export{e as default}; diff --git a/website/app/assets/uk-D0HDyCtp.js b/website/app/assets/uk-D0HDyCtp.js deleted file mode 100644 index 99eb78b5..00000000 --- a/website/app/assets/uk-D0HDyCtp.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* Тексти, які є лише у веб-версії. Усі інші беруться з Localizable.strings застосунку. */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "Структурна схема VisuStruct"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "Експорт…"; -"web_export_title" = "Зберегти як зображення або PDF чи надрукувати"; -"web_export_png" = "Зображення (PNG)"; -"web_export_svg" = "Векторна графіка (SVG)"; -"web_export_pdf" = "PDF (A4)"; -"web_export_visustruct" = "Файл VisuStruct (.visustruct)"; -"web_export_failed_fmt" = "Помилка експорту: %@"; -"web_print_hint" = "Через «Експорт… → PDF» можна зберегти схему, а потім надрукувати її."; -"web_delete" = "Видалити"; -"web_language_title" = "Мова інтерфейсу"; -"web_simulation_start" = "Запустити симуляцію"; -"web_simulation_end" = "Завершити симуляцію"; -"web_simulation_start_title" = "Виконати схему крок за кроком"; -"web_simulation_end_title" = "Завершити симуляцію та продовжити редагування"; -"web_palette_hint" = "Перетягніть у схему"; -"web_tabs_label" = "Схеми"; -"web_status_modified" = "змінено"; -"web_inspector_title" = "Властивості"; -"web_inspector_resize" = "Змінити висоту інспектора об’єктів: перетягніть лінію вгору або вниз (подвійне клацання: типово)"; -"web_inspector_help_drop" = "Перетягуйте елементи з палітри на плитку: зверху = перед, знизу = після, на «ø» = замінити. Наявні елементи можна переміщувати мишею."; -"web_inspector_help_inline" = "Двічі клацніть або торкніться елемента, щоб змінити текст прямо в діаграмі (Enter — застосувати, Esc — скасувати). Так само змінюються назви варіантів."; -"web_inspector_help_files" = "Файли також можна перетягнути у вікно."; -"web_case_name" = "Назва випадку"; -"web_case_name_placeholder" = "напр. 1, ok, default"; -"web_copied" = "Елемент скопійовано."; -"web_discard_message_fmt" = "Зміни в «%@» буде втрачено."; -"web_err_unreadable_fmt" = "«%@» не є придатним для читання файлом VisuStruct (%@)."; -"web_saved_fmt" = "«%@» збережено."; -"web_saved_txt_fmt" = "Збережено як «%@». Видаліть розширення .txt, щоб використати файл."; -"web_drop_impossible" = "Сюди не можна помістити"; -"web_sim_delay" = "Пауза на крок"; -"web_sim_delay_value_fmt" = "%@ с"; -"web_codegen_language" = "Мова"; -"web_codegen_comments" = "Текст схеми як коментарі"; -"web_codegen_empty_else" = "Виводити порожню гілку else в коді"; -"web_copied_check" = "Скопійовано ✓"; -"web_copy_manual" = "Виділено, натисніть Ctrl+C, щоб скопіювати"; -"web_run_stopped_loop" = "Виконання зупинено: можливий нескінченний цикл."; -"web_run_cancelled" = "Виконання скасовано."; -"web_run_error" = "Помилка під час виконання."; -"web_run_dropped_fmt" = "… приховано попередніх рядків: %d"; -"web_sim_call_arguments_fmt" = "Виклик не відповідає заголовку %@. Перевір значення в дужках."; -"web_sim_missing_return_fmt" = "%@ завершилася, не повернувши значення через return."; -"web_sim_file_not_found_fmt" = "Файлу з назвою %@ немає."; -"web_sim_end_of_file_fmt" = "У файлі %@ більше немає рядків."; -"web_sim_null_value_fmt" = "%@ дорівнює null."; -"web_sim_unknown_variable_case_fmt" = "Невідома змінна: %1$@. Java розрізняє великі й малі літери: можливо, %2$@?"; -"web_sim_written_file_fmt" = "%@ (збережено)"; -"web_site_home" = "Головна сторінка"; -"web_site_imprint" = "Вихідні дані"; -"web_site_privacy" = "Конфіденційність"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "Програмування"; -"web_live_hide" = "Сховати програмування"; -"web_scale_canvas" = "Розмір тексту: структурна схема"; -"web_scale_code" = "Розмір тексту: програмування"; -"web_live_indent" = "Відступи"; -"web_live_indent_title" = "Розставити відступи: чотири пробіли на рівень (виділені рядки, інакше все)"; -"web_live_show" = "Показати програмування"; -"web_live_resize" = "Змінити ширину області коду (подвійний клік: скинути)"; -"web_live_hint" = "Код росте разом із діаграмою. Сірий = заповнювач: пиши в інспекторі, і текст з’явиться тут. Клацни рядок, щоб вибрати елемент."; -"web_live_ph_selector" = "змінна"; -"web_live_ph_code" = "Твій код"; -"web_live_ph_end" = "кінець"; -"web_live_language" = "Мова програмування"; -"web_live_java_class" = "Як клас"; -"web_live_java_class_hint" = "Назва класу = заголовок діаграми"; -"web_live_java_main" = "З методом main"; -"web_settings_display" = "Вигляд"; -"web_live_swing" = "Справжня Java (зі Swing)"; -"web_live_swing_hint" = "Справжня Java з вікнами (CheerpJ). Під час першого запуску одноразово завантажує близько 40 МБ."; -"web_live_swing_windows" = "Вікна Java"; -"web_live_swing_hide" = "Закрити вікна Java"; -"web_live_swing_loading" = "Завантаження Java (уперше близько 40 МБ) …"; -"web_live_swing_compiling" = "Компіляція …"; -"web_live_swing_running" = "Програма виконується."; -"web_live_swing_compile_failed" = "Помилка компіляції, див. вище."; -"web_live_swing_failed" = "Не вдалося завантажити Java. Перевір підключення до інтернету."; -"web_live_hint_edit" = "Набери тут код Java, і діаграма будується сама. Або працюй у діаграмі, і код росте разом із нею. Сірий = заповнювач, просто пиши поверх."; -"web_live_edit_label" = "Код Java"; -"web_parse_line_fmt" = "Рядок %d: %@"; -"web_parse_missing" = "Тут ще бракує: %@"; -"web_parse_extra" = "Зайве: %@"; -"web_parse_unclosed_string" = "Бракує закривного %@."; -"web_parse_else_without_if" = "Цей «else» не має «if»."; -"web_parse_case_outside_switch" = "«case» і «default» мають бути всередині «switch»."; -"web_parse_missing_do_while" = "Після «do { … }» бракує «while (умова);»."; -"web_parse_more_methods" = "Поки що тут враховується лише один метод. Інші підпрограми створи в окремих вкладках."; -"web_parse_missing_import" = "На самому початку бракує %@ Без цього рядка Java не знає Scanner."; -"web_parse_missing_scanner" = "Спочатку бракує %@ Без цього рядка Scanner не існує."; -"web_parse_unknown_type" = "Java не знає такого типу даних. Можливо, %@?"; -"web_quickfix_insert_fmt" = "Пропозиція: вставити %@"; -"web_quickfix_replace_fmt" = "Пропозиція: %1$@ замість %2$@"; -"web_parse_wrong_case" = "Java розрізняє великі й малі літери. Правильно: %@."; -"web_editor_title" = "Діаграма"; -"web_editor_show" = "Показати діаграму"; -"web_editor_hide" = "Сховати діаграму"; -"web_keywords_title" = "Ключові слова коду"; -"web_keywords_hint" = "if, while, for замість назв елементів"; -"web_palette_compact" = "Елементи завжди компактно"; -"web_palette_compact_hint" = "Значок із маленькою назвою під ним, інакше лише за вузької колонки"; -"web_about_version_fmt" = "Версія %@"; -"web_about_software" = "Використане програмне забезпечення"; -"web_about_software_text" = "Редактор коду використовує CodeMirror і Lezer (ліцензія MIT). З підтримкою Swing VisuStruct завантажує CheerpJ від Leaning Technologies (ліцензія Community) і javac з OpenJDK."; -"web_about_licenses" = "Тексти ліцензій"; -"web_live_run" = "Запустити"; -"web_live_run_title" = "Запустити програму: виведення і введення з’являться нижче"; -"web_live_run_finished" = "Програму завершено."; -"web_live_run_stopped" = "Зупинено."; -"web_console" = "Консоль"; -"web_console_hide" = "Сховати консоль"; -"web_console_resize" = "Змінити висоту консолі"; -"web_diagram_tools" = "Інструменти діаграми"; -"web_files_title" = "Файли"; -"web_files_show" = "Показати файли"; -"web_files_hide" = "Сховати файли"; -"web_files_resize" = "Змінити ширину файлів"; -"web_files_new_folder" = "Нова тека"; -"web_files_switch" = "Вибрати іншу теку"; -"web_files_delete" = "Видалити"; -"web_files_in_browser" = "У сховищі цього браузера"; -"web_files_save_hint_fmt" = "Під час збереження програма потрапляє в %@."; -"web_files_empty" = "Ще нічого не збережено. Під час збереження VisuStruct створює тут теку з сьогоднішньою датою."; -"web_files_reconnect_hint" = "Після перезавантаження браузер ще раз запитає, чи може VisuStruct використовувати твою теку."; -"web_files_reconnect_fmt" = "Відкрити теку «%@»"; -"web_files_connect_hint" = "Вибери теку як робочий простір. VisuStruct створює в ній теку для кожного дня і зберігає діаграму та код."; -"web_files_connect" = "Вибрати теку"; -"web_files_browser_hint" = "Цей браузер не може відкривати теки на пристрої (напр. на iPad). Твої файли залишаються у сховищі цього браузера."; -"web_files_browser" = "Зберегти в браузері"; -"web_files_delete_confirm_fmt" = "Справді видалити «%@»?"; -"web_files_folder_prompt" = "Назва нової теки:"; -"web_files_default_name" = "Програма"; -"web_files_saved_fmt" = "Збережено: %@"; -"web_files_create" = "Створити"; -"web_learn_ludwig_tip" = "Порада Людвіга"; -"web_game_title" = "Гра: Істина чи хиба?"; -"web_game_intro" = "Людвіг показує значення й умову. Умова істинна (true) чи хибна (false)? Десять раундів, щоразу складніше."; -"web_game_start" = "Почати гру"; -"web_game_round_fmt" = "Раунд %@ з %@"; -"web_game_score_fmt" = "Бали: %@"; -"web_game_true" = "істина (true)"; -"web_game_false" = "хиба (false)"; -"web_game_right" = "Правильно!"; -"web_game_wrong" = "Не зовсім. Ось як це обчислюється:"; -"web_game_next" = "Далі"; -"web_game_finish" = "Результат"; -"web_game_done_fmt" = "%@ з %@ правильно."; -"web_game_perfect" = "Усе правильно – Людвіг вражений!"; -"web_game_good" = "Чудово! Переглянь помилки й спробуй ще раз."; -"web_game_practice" = "Практика робить майстра. Перечитай таблицю істинності й зіграй ще раз."; -"web_game_again" = "Грати ще"; -"web_game_wrong_short" = "На жаль, неправильно."; -"web_game_practice_short" = "Повторення — мати навчання. Перечитай пояснення і зіграй ще раунд."; -"web_game_clicks" = "Кліки:"; -"web_game_nobody" = "Ніхто не слухає — нічого не відбувається."; -"web_game_event_fmt" = "Клік по «%@»: слухач чує це і виконує свій код."; -"web_game_try" = "Тепер спробуй кнопки у вікні сам."; -"web_game_time_fmt" = "Залишилось %@ с"; -"web_game_defused" = "✂️ Знешкоджено! Ти знайшов помилку."; -"web_game_boom_time" = "💥 Бум! Час вийшов."; -"web_game_boom_wrong" = "💥 Бум! Це був не той рядок."; -"web_game_boom_part" = "💥 Бум! Рядок правильний, але помилка в іншій його частині."; -"web_game_boom_wrong_part" = "💥 Бум! Помилка в іншому рядку."; -"web_game_bomb_parts_hint" = "Натисни точно на неправильну частину."; -"web_game_fix" = "Правильний рядок:"; -"web_game_order_hint" = "Натискай на кроки в правильному порядку."; -"web_debug_step" = "Крок"; -"web_debug_step_title" = "Крок: виконати одну інструкцію й знову зупинитися"; -"web_debug_continue" = "Далі до наступної точки зупинки"; -"web_debug_paused_fmt" = "Зупинено перед рядком %d."; -"web_debug_gutter_title" = "Клацни номер рядка, щоб поставити або прибрати точку зупинки"; -"web_swap_to_code" = "Програмування великим"; -"web_swap_to_editor" = "Структурограма великою"; -"web_editor_resize" = "Змінити ширину структурограми"; -"web_palette_resize" = "Змінити ширину елементів"; -"web_palette_hide" = "Сховати елементи"; -"web_palette_show" = "Показати елементи"; -"web_code_scopes" = "Кольорові блоки коду"; -"web_code_scopes_hint" = "Клас, метод, цикл, розгалуження в окремих рамках"; -"web_pseudocode" = "Псевдокод"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "Перейменувати змінну …"; -"web_rename_title" = "Перейменувати змінну"; -"web_rename_old" = "Назва"; -"web_rename_new" = "Нова назва"; -"web_rename_hint" = "Змінює кожне місце з точно таким написанням (number — це не Number), у коді та на структурограмі. Текст у \\"…\\" і коментарі лишаються."; -"web_rename_count_fmt" = "Трапляється %d раз(и)."; -"web_rename_exists_fmt" = "«%@» уже існує: після цього обидві стануть однією змінною."; -"web_rename_invalid" = "Назва починається з літери й містить лише літери, цифри та _."; -"web_rename_keyword_fmt" = "«%@» — ключове слово Java."; -"web_rename_apply" = "Перейменувати"; -"web_rename_cancel" = "Скасувати"; -`;export{e as default}; diff --git a/website/app/assets/visubot-CyGFOI9V.webp b/website/app/assets/visubot-CyGFOI9V.webp deleted file mode 100644 index 7dc5b040a8fa4d79dade3909766fb21dcb77d090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 E04ZhEH2?qr diff --git a/website/app/assets/zh-Hans-R_GuNvYU.js b/website/app/assets/zh-Hans-R_GuNvYU.js deleted file mode 100644 index 99dd5e31..00000000 --- a/website/app/assets/zh-Hans-R_GuNvYU.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* 仅存在于网页版中的文本。其他所有文本均来自应用的 Localizable.strings。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 结构图"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "导出…"; -"web_export_title" = "保存为图片或 PDF,或打印"; -"web_export_png" = "图片(PNG)"; -"web_export_svg" = "矢量图(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 文件(.visustruct)"; -"web_export_failed_fmt" = "导出失败:%@"; -"web_print_hint" = "请通过“导出… → PDF”保存图表,然后从那里打印。"; -"web_delete" = "删除"; -"web_language_title" = "界面语言"; -"web_simulation_start" = "开始模拟"; -"web_simulation_end" = "结束模拟"; -"web_simulation_start_title" = "逐步运行结构图"; -"web_simulation_end_title" = "结束模拟并继续编辑"; -"web_palette_hint" = "拖入结构图"; -"web_tabs_label" = "图表"; -"web_status_modified" = "已修改"; -"web_inspector_title" = "属性"; -"web_inspector_resize" = "更改对象检查器的高度:上下拖动或滑动分隔线(双击:默认)"; -"web_inspector_help_drop" = "将元素从面板拖到块上:上部 = 插入到前面,下部 = 插入到后面,拖到“ø”上 = 替换。已有元素可用鼠标移动。"; -"web_inspector_help_inline" = "双击或双点元素即可直接在图中编辑文字(Enter 确认,Esc 取消)。case 名称也一样。"; -"web_inspector_help_files" = "也可以直接将文件拖入窗口。"; -"web_case_name" = "分支名称"; -"web_case_name_placeholder" = "例如 1, ok, default"; -"web_copied" = "已复制元素。"; -"web_discard_message_fmt" = "对“%@”的更改将会丢失。"; -"web_err_unreadable_fmt" = "“%@”不是可读取的 VisuStruct 文件(%@)。"; -"web_saved_fmt" = "已保存“%@”。"; -"web_saved_txt_fmt" = "已另存为“%@”。去掉 .txt 扩展名后即可使用。"; -"web_drop_impossible" = "无法放置在此处"; -"web_sim_delay" = "每步暂停"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "语言"; -"web_codegen_comments" = "将图表文字作为注释"; -"web_codegen_empty_else" = "在代码中输出空的 else 分支"; -"web_copied_check" = "已复制 ✓"; -"web_copy_manual" = "已选中,按 Ctrl+C 复制"; -"web_run_stopped_loop" = "执行已停止:可能存在无限循环。"; -"web_run_cancelled" = "执行已取消。"; -"web_run_error" = "运行时出错。"; -"web_run_dropped_fmt" = "… 已隐藏之前的 %d 行"; -"web_sim_call_arguments_fmt" = "调用与 %@ 的首行不匹配。请检查括号中的值。"; -"web_sim_missing_return_fmt" = "%@ 结束时没有用 return 返回值。"; -"web_sim_file_not_found_fmt" = "没有名为 %@ 的文件。"; -"web_sim_end_of_file_fmt" = "文件 %@ 没有更多行了。"; -"web_sim_null_value_fmt" = "%@ 是 null。"; -"web_sim_unknown_variable_case_fmt" = "未知变量:%1$@。Java 区分大小写:你是指 %2$@ 吗?"; -"web_sim_written_file_fmt" = "%@(已保存)"; -"web_site_home" = "主页"; -"web_site_imprint" = "版权信息"; -"web_site_privacy" = "隐私"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "编程"; -"web_live_hide" = "隐藏编程"; -"web_scale_canvas" = "文字大小:结构图"; -"web_scale_code" = "文字大小:编程"; -"web_live_indent" = "缩进"; -"web_live_indent_title" = "缩进代码:每层四个空格(选中的行,否则全部)"; -"web_live_show" = "显示编程"; -"web_live_resize" = "更改代码区宽度(双击:重置)"; -"web_live_hint" = "代码随图一起生成。灰色 = 占位符:在检查器中输入,文字就会出现在这里。点击某行可选中对应元素。"; -"web_live_ph_selector" = "变量"; -"web_live_ph_code" = "你的代码"; -"web_live_ph_end" = "结束"; -"web_live_language" = "编程语言"; -"web_live_java_class" = "作为类"; -"web_live_java_class_hint" = "类名 = 结构图标题"; -"web_live_java_main" = "包含 main 方法"; -"web_settings_display" = "显示"; -"web_live_swing" = "真正的 Java(含 Swing)"; -"web_live_swing_hint" = "带窗口的真正 Java(CheerpJ)。首次运行时一次性下载约 40 MB。"; -"web_live_swing_windows" = "Java 窗口"; -"web_live_swing_hide" = "关闭 Java 窗口"; -"web_live_swing_loading" = "正在加载 Java(首次约 40 MB)…"; -"web_live_swing_compiling" = "正在编译…"; -"web_live_swing_running" = "程序正在运行。"; -"web_live_swing_compile_failed" = "编译错误,见上方。"; -"web_live_swing_failed" = "无法加载 Java。请检查网络连接。"; -"web_live_hint_edit" = "在这里输入 Java 代码,结构图会随之生成。或者在结构图中操作,代码也会一起增长。灰色 = 占位符,直接覆盖输入即可。"; -"web_live_edit_label" = "Java 代码"; -"web_parse_line_fmt" = "第 %d 行:%@"; -"web_parse_missing" = "这里还缺少:%@"; -"web_parse_extra" = "多余:%@"; -"web_parse_unclosed_string" = "这里缺少结尾的 %@。"; -"web_parse_else_without_if" = "这个“else”没有对应的“if”。"; -"web_parse_case_outside_switch" = "“case”和“default”应写在“switch”里面。"; -"web_parse_missing_do_while" = "“do { … }”之后还缺少“while (条件);”。"; -"web_parse_more_methods" = "目前这里只计入一个方法。请在单独的标签页中创建其他子程序。"; -"web_parse_missing_import" = "最上面缺少 %@ 没有这一行,Java 不认识 Scanner。"; -"web_parse_missing_scanner" = "前面缺少 %@ 没有这一行就没有 Scanner。"; -"web_parse_unknown_type" = "Java 不认识这个数据类型。你是想写 %@ 吗?"; -"web_quickfix_insert_fmt" = "建议:插入 %@"; -"web_quickfix_replace_fmt" = "建议:用 %1$@ 代替 %2$@"; -"web_parse_wrong_case" = "Java 区分大小写。正确写法是 %@。"; -"web_editor_title" = "结构图"; -"web_editor_show" = "显示结构图"; -"web_editor_hide" = "隐藏结构图"; -"web_keywords_title" = "代码关键字"; -"web_keywords_hint" = "用 if、while、for 代替元素名称"; -"web_palette_compact" = "元素始终紧凑显示"; -"web_palette_compact_hint" = "图标下方显示小字名称;否则仅在栏较窄时"; -"web_about_version_fmt" = "版本 %@"; -"web_about_software" = "使用的软件"; -"web_about_software_text" = "代码编辑器使用 CodeMirror 和 Lezer(MIT 许可证)。启用 Swing 支持后,VisuStruct 会加载 Leaning Technologies 的 CheerpJ(Community 许可证)和 OpenJDK 的 javac。"; -"web_about_licenses" = "许可证文本"; -"web_live_run" = "运行"; -"web_live_run_title" = "运行程序:输出和输入显示在下方"; -"web_live_run_finished" = "程序已结束。"; -"web_live_run_stopped" = "已停止。"; -"web_console" = "控制台"; -"web_console_hide" = "隐藏控制台"; -"web_console_resize" = "调整控制台高度"; -"web_diagram_tools" = "图表工具"; -"web_files_title" = "文件"; -"web_files_show" = "显示文件"; -"web_files_hide" = "隐藏文件"; -"web_files_resize" = "调整文件栏宽度"; -"web_files_new_folder" = "新建文件夹"; -"web_files_switch" = "选择其他文件夹"; -"web_files_delete" = "删除"; -"web_files_in_browser" = "在此浏览器的存储中"; -"web_files_save_hint_fmt" = "保存时程序将放入 %@。"; -"web_files_empty" = "还没有保存任何内容。保存时,VisuStruct 会在这里创建一个以今天日期命名的文件夹。"; -"web_files_reconnect_hint" = "重新加载后,浏览器会再次询问 VisuStruct 是否可以使用你的文件夹。"; -"web_files_reconnect_fmt" = "打开文件夹“%@”"; -"web_files_connect_hint" = "选择一个文件夹作为工作区。VisuStruct 会在其中为每一天创建文件夹,并保存图和代码。"; -"web_files_connect" = "选择文件夹"; -"web_files_browser_hint" = "此浏览器无法打开设备上的文件夹(例如 iPad)。你的文件会保留在此浏览器的存储中。"; -"web_files_browser" = "保存在浏览器中"; -"web_files_delete_confirm_fmt" = "确定删除“%@”?"; -"web_files_folder_prompt" = "新文件夹名称:"; -"web_files_default_name" = "程序"; -"web_files_saved_fmt" = "已保存:%@"; -"web_files_create" = "新建"; -"web_learn_ludwig_tip" = "路德维希的提示"; -"web_game_title" = "游戏:真还是假?"; -"web_game_intro" = "路德维希给你看一些值和一个条件。这个条件是真(true)还是假(false)?共十轮,越来越难。"; -"web_game_start" = "开始游戏"; -"web_game_round_fmt" = "第 %@ 轮,共 %@ 轮"; -"web_game_score_fmt" = "得分:%@"; -"web_game_true" = "真 (true)"; -"web_game_false" = "假 (false)"; -"web_game_right" = "答对了!"; -"web_game_wrong" = "不太对。是这样计算的:"; -"web_game_next" = "下一轮"; -"web_game_finish" = "结果"; -"web_game_done_fmt" = "答对 %@ / %@。"; -"web_game_perfect" = "全部正确——路德维希被你折服了!"; -"web_game_good" = "很棒!再看看错题,然后再试一次。"; -"web_game_practice" = "熟能生巧。再读一遍上面的真值表,再玩一轮吧。"; -"web_game_again" = "再玩一次"; -"web_game_wrong_short" = "很遗憾,答错了。"; -"web_game_practice_short" = "熟能生巧。再读一遍解释,再玩一轮吧。"; -"web_game_clicks" = "点击:"; -"web_game_nobody" = "没有人在监听——什么也不会发生。"; -"web_game_event_fmt" = "点击“%@”:监听器听到后执行它的代码。"; -"web_game_try" = "现在自己试试窗口里的按钮吧。"; -"web_game_time_fmt" = "还剩 %@ 秒"; -"web_game_defused" = "✂️ 拆除成功!你找到了错误。"; -"web_game_boom_time" = "💥 嘭!时间到了。"; -"web_game_boom_wrong" = "💥 嘭!这不是出错的那一行。"; -"web_game_boom_part" = "💥 砰!这一行对了,但错误在另一部分。"; -"web_game_boom_wrong_part" = "💥 砰!错误在另一行。"; -"web_game_bomb_parts_hint" = "准确点击出错的部分。"; -"web_game_fix" = "正确的写法:"; -"web_game_order_hint" = "按正确的顺序点击各个步骤。"; -"web_debug_step" = "单步"; -"web_debug_step_title" = "单步:执行一条语句后再次暂停"; -"web_debug_continue" = "继续运行到下一个断点"; -"web_debug_paused_fmt" = "在第 %d 行之前暂停。"; -"web_debug_gutter_title" = "点击行号可设置或删除断点"; -"web_swap_to_code" = "编程放大"; -"web_swap_to_editor" = "结构图放大"; -"web_editor_resize" = "调整结构图宽度"; -"web_palette_resize" = "调整元素宽度"; -"web_palette_hide" = "隐藏元素"; -"web_palette_show" = "显示元素"; -"web_code_scopes" = "代码块彩色显示"; -"web_code_scopes_hint" = "类、方法、循环、分支各有自己的框"; -"web_pseudocode" = "伪代码"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "重命名变量 …"; -"web_rename_title" = "重命名变量"; -"web_rename_old" = "名称"; -"web_rename_new" = "新名称"; -"web_rename_hint" = "在代码和结构图中更改所有拼写完全相同的地方(number 不是 Number)。\\"…\\" 中的文本和注释保持不变。"; -"web_rename_count_fmt" = "出现 %d 次。"; -"web_rename_exists_fmt" = "“%@”已存在:之后两者会成为同一个变量。"; -"web_rename_invalid" = "名称以字母开头,只包含字母、数字和 _。"; -"web_rename_keyword_fmt" = "“%@”是 Java 关键字。"; -"web_rename_apply" = "重命名"; -"web_rename_cancel" = "取消"; -`;export{e as default}; diff --git a/website/app/assets/zh-Hant-DoE9BrE1.js b/website/app/assets/zh-Hant-DoE9BrE1.js deleted file mode 100644 index a9730929..00000000 --- a/website/app/assets/zh-Hant-DoE9BrE1.js +++ /dev/null @@ -1,202 +0,0 @@ -const e=`/* 僅存在於網頁版的文字。其他所有文字皆來自 App 的 Localizable.strings。 */ - -"web_brand_suffix" = "Web"; -"web_file_type" = "VisuStruct 結構圖"; -"web_key_ctrl" = "Ctrl"; -"web_key_delete" = "Del"; -"web_key_shift" = "Shift"; -"web_export" = "匯出…"; -"web_export_title" = "儲存為圖片或 PDF,或列印"; -"web_export_png" = "圖片(PNG)"; -"web_export_svg" = "向量圖形(SVG)"; -"web_export_pdf" = "PDF(A4)"; -"web_export_visustruct" = "VisuStruct 檔案(.visustruct)"; -"web_export_failed_fmt" = "匯出失敗:%@"; -"web_print_hint" = "請透過「匯出… → PDF」儲存圖表,再從那裡列印。"; -"web_delete" = "刪除"; -"web_language_title" = "介面語言"; -"web_simulation_start" = "開始模擬"; -"web_simulation_end" = "結束模擬"; -"web_simulation_start_title" = "逐步執行結構圖"; -"web_simulation_end_title" = "結束模擬並繼續編輯"; -"web_palette_hint" = "拖曳到結構圖中"; -"web_tabs_label" = "圖表"; -"web_status_modified" = "已修改"; -"web_inspector_title" = "屬性"; -"web_inspector_resize" = "變更物件檢閱器的高度:上下拖曳或滑動分隔線(按兩下:預設)"; -"web_inspector_help_drop" = "將元素從面板拖曳到區塊上:上方 = 插入在前,下方 = 插入在後,拖到「ø」上 = 取代。現有元素可用滑鼠移動。"; -"web_inspector_help_inline" = "雙擊或雙點元素即可直接在圖中編輯文字(Enter 確認,Esc 取消)。case 名稱也一樣。"; -"web_inspector_help_files" = "也可以直接將檔案拖曳到視窗中。"; -"web_case_name" = "分支名稱"; -"web_case_name_placeholder" = "例如 1, ok, default"; -"web_copied" = "已複製元素。"; -"web_discard_message_fmt" = "對「%@」所做的變更將會遺失。"; -"web_err_unreadable_fmt" = "「%@」不是可讀取的 VisuStruct 檔案(%@)。"; -"web_saved_fmt" = "已儲存「%@」。"; -"web_saved_txt_fmt" = "已儲存為「%@」。移除 .txt 副檔名後即可使用。"; -"web_drop_impossible" = "無法放置在此處"; -"web_sim_delay" = "每步暫停"; -"web_sim_delay_value_fmt" = "%@ 秒"; -"web_codegen_language" = "語言"; -"web_codegen_comments" = "將圖表文字作為註解"; -"web_codegen_empty_else" = "在程式碼中輸出空的 else 分支"; -"web_copied_check" = "已複製 ✓"; -"web_copy_manual" = "已選取,按 Ctrl+C 複製"; -"web_run_stopped_loop" = "執行已停止:可能是無限迴圈。"; -"web_run_cancelled" = "執行已取消。"; -"web_run_error" = "執行時發生錯誤。"; -"web_run_dropped_fmt" = "… 已隱藏先前的 %d 行"; -"web_sim_call_arguments_fmt" = "呼叫與 %@ 的首行不相符。請檢查括號中的值。"; -"web_sim_missing_return_fmt" = "%@ 結束時沒有用 return 傳回值。"; -"web_sim_file_not_found_fmt" = "沒有名為 %@ 的檔案。"; -"web_sim_end_of_file_fmt" = "檔案 %@ 沒有更多行了。"; -"web_sim_null_value_fmt" = "%@ 是 null。"; -"web_sim_unknown_variable_case_fmt" = "未知變數:%1$@。Java 區分大小寫:你是指 %2$@ 嗎?"; -"web_sim_written_file_fmt" = "%@(已儲存)"; -"web_site_home" = "首頁"; -"web_site_imprint" = "版權資訊"; -"web_site_privacy" = "隱私"; - -/* Programmieren (früher „Code live“) */ -"web_live_title" = "程式設計"; -"web_live_hide" = "隱藏程式設計"; -"web_scale_canvas" = "文字大小:結構圖"; -"web_scale_code" = "文字大小:程式設計"; -"web_live_indent" = "縮排"; -"web_live_indent_title" = "縮排程式碼:每層四個空格(選取的行,否則全部)"; -"web_live_show" = "顯示程式設計"; -"web_live_resize" = "變更程式碼區寬度(按兩下:重設)"; -"web_live_hint" = "程式碼會隨圖一起產生。灰色 = 預留位置:在檢閱器中輸入,文字就會出現在這裡。點一下某行可選取對應元素。"; -"web_live_ph_selector" = "變數"; -"web_live_ph_code" = "你的程式碼"; -"web_live_ph_end" = "結束"; -"web_live_language" = "程式語言"; -"web_live_java_class" = "作為類別"; -"web_live_java_class_hint" = "類別名稱 = 結構圖標題"; -"web_live_java_main" = "包含 main 方法"; -"web_settings_display" = "顯示"; -"web_live_swing" = "真正的 Java(含 Swing)"; -"web_live_swing_hint" = "帶視窗的真正 Java(CheerpJ)。首次執行時一次性下載約 40 MB。"; -"web_live_swing_windows" = "Java 視窗"; -"web_live_swing_hide" = "關閉 Java 視窗"; -"web_live_swing_loading" = "正在載入 Java(首次約 40 MB)…"; -"web_live_swing_compiling" = "正在編譯…"; -"web_live_swing_running" = "程式執行中。"; -"web_live_swing_compile_failed" = "編譯錯誤,見上方。"; -"web_live_swing_failed" = "無法載入 Java。請檢查網路連線。"; -"web_live_hint_edit" = "在這裡輸入 Java 程式碼,結構圖會隨之產生。或者在結構圖中操作,程式碼也會一起成長。灰色 = 預留位置,直接覆寫輸入即可。"; -"web_live_edit_label" = "Java 程式碼"; -"web_parse_line_fmt" = "第 %d 行:%@"; -"web_parse_missing" = "這裡還缺少:%@"; -"web_parse_extra" = "多餘:%@"; -"web_parse_unclosed_string" = "這裡缺少結尾的 %@。"; -"web_parse_else_without_if" = "這個「else」沒有對應的「if」。"; -"web_parse_case_outside_switch" = "「case」和「default」應寫在「switch」裡面。"; -"web_parse_missing_do_while" = "「do { … }」之後還缺少「while (條件);」。"; -"web_parse_more_methods" = "目前這裡只計入一個方法。請在單獨的分頁中建立其他子程式。"; -"web_parse_missing_import" = "最上面缺少 %@ 沒有這一行,Java 不認識 Scanner。"; -"web_parse_missing_scanner" = "前面缺少 %@ 沒有這一行就沒有 Scanner。"; -"web_parse_unknown_type" = "Java 不認識這個資料型別。你是想寫 %@ 嗎?"; -"web_quickfix_insert_fmt" = "建議:插入 %@"; -"web_quickfix_replace_fmt" = "建議:用 %1$@ 代替 %2$@"; -"web_parse_wrong_case" = "Java 區分大小寫。正確寫法是 %@。"; -"web_editor_title" = "結構圖"; -"web_editor_show" = "顯示結構圖"; -"web_editor_hide" = "隱藏結構圖"; -"web_keywords_title" = "程式碼關鍵字"; -"web_keywords_hint" = "用 if、while、for 取代元素名稱"; -"web_palette_compact" = "元素一律精簡顯示"; -"web_palette_compact_hint" = "圖示下方顯示小字名稱;否則僅在欄位較窄時"; -"web_about_version_fmt" = "版本 %@"; -"web_about_software" = "使用的軟體"; -"web_about_software_text" = "程式碼編輯器使用 CodeMirror 與 Lezer(MIT 授權)。啟用 Swing 支援後,VisuStruct 會載入 Leaning Technologies 的 CheerpJ(Community 授權)與 OpenJDK 的 javac。"; -"web_about_licenses" = "授權條款全文"; -"web_live_run" = "執行"; -"web_live_run_title" = "執行程式:輸出與輸入顯示在下方"; -"web_live_run_finished" = "程式已結束。"; -"web_live_run_stopped" = "已停止。"; -"web_console" = "主控台"; -"web_console_hide" = "隱藏主控台"; -"web_console_resize" = "調整主控台高度"; -"web_diagram_tools" = "圖表工具"; -"web_files_title" = "檔案"; -"web_files_show" = "顯示檔案"; -"web_files_hide" = "隱藏檔案"; -"web_files_resize" = "調整檔案欄寬度"; -"web_files_new_folder" = "新增資料夾"; -"web_files_switch" = "選擇其他資料夾"; -"web_files_delete" = "刪除"; -"web_files_in_browser" = "在此瀏覽器的儲存空間中"; -"web_files_save_hint_fmt" = "儲存時程式會放入 %@。"; -"web_files_empty" = "還沒有儲存任何內容。儲存時,VisuStruct 會在這裡建立一個以今天日期命名的資料夾。"; -"web_files_reconnect_hint" = "重新載入後,瀏覽器會再次詢問 VisuStruct 是否可以使用你的資料夾。"; -"web_files_reconnect_fmt" = "開啟資料夾「%@」"; -"web_files_connect_hint" = "選擇一個資料夾作為工作區。VisuStruct 會在其中為每一天建立資料夾,並儲存圖與程式碼。"; -"web_files_connect" = "選擇資料夾"; -"web_files_browser_hint" = "此瀏覽器無法開啟裝置上的資料夾(例如 iPad)。你的檔案會保留在此瀏覽器的儲存空間中。"; -"web_files_browser" = "儲存在瀏覽器中"; -"web_files_delete_confirm_fmt" = "確定刪除「%@」?"; -"web_files_folder_prompt" = "新資料夾名稱:"; -"web_files_default_name" = "程式"; -"web_files_saved_fmt" = "已儲存:%@"; -"web_files_create" = "新增"; -"web_learn_ludwig_tip" = "路德維希的提示"; -"web_game_title" = "遊戲:真還是假?"; -"web_game_intro" = "路德維希給你看一些值和一個條件。這個條件是真(true)還是假(false)?共十輪,越來越難。"; -"web_game_start" = "開始遊戲"; -"web_game_round_fmt" = "第 %@ 輪,共 %@ 輪"; -"web_game_score_fmt" = "得分:%@"; -"web_game_true" = "真 (true)"; -"web_game_false" = "假 (false)"; -"web_game_right" = "答對了!"; -"web_game_wrong" = "不太對。是這樣計算的:"; -"web_game_next" = "下一輪"; -"web_game_finish" = "結果"; -"web_game_done_fmt" = "答對 %@ / %@。"; -"web_game_perfect" = "全部正確——路德維希被你折服了!"; -"web_game_good" = "很棒!再看看錯題,然後再試一次。"; -"web_game_practice" = "熟能生巧。再讀一遍上面的真值表,再玩一輪吧。"; -"web_game_again" = "再玩一次"; -"web_game_wrong_short" = "很可惜,答錯了。"; -"web_game_practice_short" = "熟能生巧。再讀一遍說明,再玩一輪吧。"; -"web_game_clicks" = "點擊:"; -"web_game_nobody" = "沒有人在監聽——什麼也不會發生。"; -"web_game_event_fmt" = "點擊「%@」:監聽器聽到後執行它的程式碼。"; -"web_game_try" = "現在自己試試視窗裡的按鈕吧。"; -"web_game_time_fmt" = "還剩 %@ 秒"; -"web_game_defused" = "✂️ 拆除成功!你找到了錯誤。"; -"web_game_boom_time" = "💥 砰!時間到了。"; -"web_game_boom_wrong" = "💥 砰!這不是出錯的那一行。"; -"web_game_boom_part" = "💥 砰!這一行對了,但錯誤在另一部分。"; -"web_game_boom_wrong_part" = "💥 砰!錯誤在另一行。"; -"web_game_bomb_parts_hint" = "準確點擊出錯的部分。"; -"web_game_fix" = "正確的寫法:"; -"web_game_order_hint" = "按正確的順序點擊各個步驟。"; -"web_debug_step" = "單步"; -"web_debug_step_title" = "單步:執行一條敘述後再次暫停"; -"web_debug_continue" = "繼續執行到下一個中斷點"; -"web_debug_paused_fmt" = "在第 %d 行之前暫停。"; -"web_debug_gutter_title" = "點擊行號可設定或刪除中斷點"; -"web_swap_to_code" = "程式設計放大"; -"web_swap_to_editor" = "結構圖放大"; -"web_editor_resize" = "調整結構圖寬度"; -"web_palette_resize" = "調整元素寬度"; -"web_palette_hide" = "隱藏元素"; -"web_palette_show" = "顯示元素"; -"web_code_scopes" = "程式碼區塊彩色顯示"; -"web_code_scopes_hint" = "類別、方法、迴圈、分支各有自己的框"; -"web_pseudocode" = "虛擬碼"; - -/* Variable umbenennen (Refactoring) */ -"web_rename_menu" = "重新命名變數 …"; -"web_rename_title" = "重新命名變數"; -"web_rename_old" = "名稱"; -"web_rename_new" = "新名稱"; -"web_rename_hint" = "在程式碼和結構圖中更改所有拼寫完全相同的地方(number 不是 Number)。\\"…\\" 中的文字和註解保持不變。"; -"web_rename_count_fmt" = "出現 %d 次。"; -"web_rename_exists_fmt" = "「%@」已存在:之後兩者會成為同一個變數。"; -"web_rename_invalid" = "名稱以字母開頭,只包含字母、數字和 _。"; -"web_rename_keyword_fmt" = "「%@」是 Java 關鍵字。"; -"web_rename_apply" = "重新命名"; -"web_rename_cancel" = "取消"; -`;export{e as default}; diff --git a/website/app/assets/zk-zeichen-8efNmpGx.svg b/website/app/assets/zk-zeichen-8efNmpGx.svg deleted file mode 100644 index eac69023..00000000 --- a/website/app/assets/zk-zeichen-8efNmpGx.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -String palavra = "Passatempo" -0 -P -1 -a -2 -s -3 -s -4 -a -5 -t -6 -e -7 -m -8 -p -9 -o -substring(0, 5) -→ "Passa" -substring(5) -→ "tempo" -charAt(0) → 'P'length() → 10 -indexOf("tempo") → 5 -O fim de substring não está incluído. - diff --git a/website/app/assets/zk-zeichen-CgUEhNoK.svg b/website/app/assets/zk-zeichen-CgUEhNoK.svg deleted file mode 100644 index 0eb01ebf..00000000 --- a/website/app/assets/zk-zeichen-CgUEhNoK.svg +++ /dev/null @@ -1,29 +0,0 @@ - - -String word = "Billygoat" -0 -B -1 -i -2 -l -3 -l -4 -y -5 -g -6 -o -7 -a -8 -t -substring(0, 5) -→ "Billy" -substring(5) -→ "goat" -charAt(0) → 'B'length() → 9 -indexOf("goat") → 5 -The end of substring is not included. - diff --git a/website/app/assets/zk-zeichen-vYvc3iJg.svg b/website/app/assets/zk-zeichen-vYvc3iJg.svg deleted file mode 100644 index 030e9d81..00000000 --- a/website/app/assets/zk-zeichen-vYvc3iJg.svg +++ /dev/null @@ -1,27 +0,0 @@ - - -String wort = "Geißbock" -0 -G -1 -e -2 -i -3 -ß -4 -b -5 -o -6 -c -7 -k -substring(0, 4) -→ "Geiß" -substring(4) -→ "bock" -charAt(0) → 'G'length() → 8 -indexOf("bock") → 4 -Das Ende von substring gehört nicht dazu. - diff --git a/website/app/index.html b/website/app/index.html deleted file mode 100644 index a6b85f9b..00000000 --- a/website/app/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - VisuStruct Web - - - - - - -
    - - diff --git a/website/app/licenses.txt b/website/app/licenses.txt deleted file mode 100644 index aca41c2a..00000000 --- a/website/app/licenses.txt +++ /dev/null @@ -1,494 +0,0 @@ -VisuStruct Web – verwendete Software / Third-party software - -VisuStruct: MIT License, Copyright (c) 2026 Holger Sebastiao, https://github.com/code4teaching/VisuStruct-SwiftUI - -Nur mit „Swing-Unterstützung“ wird zur Laufzeit geladen / Loaded at run time only with “Swing support”: -- CheerpJ by Leaning Technologies, https://cheerpj.com (CheerpJ Community License, from the CheerpJ CDN) -- javac from OpenJDK 8 (tools.jar from https://github.com/leaningtech/javafiddle, Apache License 2.0; OpenJDK: GPLv2 with Classpath Exception) - -Übertragen auf den mBot2 / Upload to the mBot2: Ablauf nach / protocol after cyberpi-uploader, https://github.com/weare2plus3/cyberpi-uploader -MIT License - -Copyright (c) 2026 TWO PLUS THREE LIMITED - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Mitgelieferte Pakete / Bundled packages: - -======================================================================== -@codemirror/autocomplete 6.20.4 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/commands 6.11.1 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/lang-java 6.0.2 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/language 6.13.1 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/state 6.7.6 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/streamparser 6.0.0 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@codemirror/view 6.43.15 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018-2021 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@lezer/common 1.5.4 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@lezer/highlight 1.2.5 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@lezer/java 1.1.5 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2020 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@lezer/lr 1.4.11 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2018 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -@marijn/find-cluster-break 1.0.4 (MIT) -======================================================================== - -MIT License - -Copyright (C) 2024 by Marijn Haverbeke - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -crelt 1.0.7 (MIT) -======================================================================== - -Copyright (C) 2020 by Marijn Haverbeke - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -fflate 0.8.2 (MIT) -======================================================================== - -MIT License - -Copyright (c) 2023 Arjun Barrett - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -======================================================================== -style-mod 4.1.4 (MIT) -======================================================================== - -Copyright (C) 2018 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -three 0.181.2 (MIT) -======================================================================== - -The MIT License - -Copyright © 2010-2025 three.js authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -======================================================================== -visublocks 0.1.0 (MIT) -======================================================================== - -MIT License - -Copyright (c) 2026 Christian Klein, Holger Sebastiao - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -======================================================================== -w3c-keyname 2.2.8 (MIT) -======================================================================== - -Copyright (C) 2016 by Marijn Haverbeke and others - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/website/assets/Download-on-the-App-Store/DE/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_DE_RGB_wht_092917.svg b/website/assets/Download-on-the-App-Store/DE/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_DE_RGB_wht_092917.svg deleted file mode 100755 index 0d545d2a..00000000 --- a/website/assets/Download-on-the-App-Store/DE/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_DE_RGB_wht_092917.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Download_on_the_App_Store_Badge_DE_RGB_wht_092917 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/Download-on-the-App-Store/ES/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_ES_RGB_wht_100217.svg b/website/assets/Download-on-the-App-Store/ES/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_ES_RGB_wht_100217.svg deleted file mode 100755 index 85dc0c46..00000000 --- a/website/assets/Download-on-the-App-Store/ES/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_ES_RGB_wht_100217.svg +++ /dev/null @@ -1,47 +0,0 @@ - - Download_on_the_App_Store_Badge_ES_RGB_wht_100217 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/Download-on-the-App-Store/FR/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_FR_RGB_wht_100217.svg b/website/assets/Download-on-the-App-Store/FR/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_FR_RGB_wht_100217.svg deleted file mode 100755 index 8da6feed..00000000 --- a/website/assets/Download-on-the-App-Store/FR/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_FR_RGB_wht_100217.svg +++ /dev/null @@ -1,50 +0,0 @@ - - Download_on_the_App_Store_Badge_FR_RGB_wht_100217 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/Download-on-the-App-Store/PTPT/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_PTPT_RGB_wht_100317.svg b/website/assets/Download-on-the-App-Store/PTPT/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_PTPT_RGB_wht_100317.svg deleted file mode 100755 index 5ea0cc90..00000000 --- a/website/assets/Download-on-the-App-Store/PTPT/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_PTPT_RGB_wht_100317.svg +++ /dev/null @@ -1,46 +0,0 @@ - - Download_on_the_App_Store_Badge_PTPT_RGB_wht_4SVG_source_092917 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/Download-on-the-App-Store/US/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917.svg b/website/assets/Download-on-the-App-Store/US/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917.svg deleted file mode 100755 index 16c0496c..00000000 --- a/website/assets/Download-on-the-App-Store/US/Download_on_App_Store/White_lockup/SVG/Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917.svg +++ /dev/null @@ -1,46 +0,0 @@ - - Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/javaApp/visustruct-app-java-deutsch-switchCase.png b/website/assets/javaApp/visustruct-app-java-deutsch-switchCase.png deleted file mode 100644 index 9fb096f76c2196f08b8488c5bf3f027b365b2b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57906 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̥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%0AZdta&rFPc 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%0D>;(dYv^#qvG)gT1{u-5%Bidg^W*# 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 z z8%cU+(R%*kG`3hD1>u^^Jq`<}6Y8f|0%?R?jEpK+%8^s0#mVrS30H+P|Wlem}kg#G?9YKtllC#Ag36dFunnKP6>2=>!9ftsOPhukO zJlf!L_=X>@g$iwXb6z@sZlXneqUd2WAFUHAUC2Hd(W56h{t;afpa^lXF^&|jqqlWC zL^|l3b4D^2Z5;R0`f_vj?<0BZw_l{7jF#+RkFBzy!h~>3;vT*vxEm-uds_9oo|yVr zaqbR6ud=IaP#Yw#kD~S;=~`9G;LX+|r~Lmo9l|%Pc0Dy8>2v8~GMf$ce$|m)<$&bHLQn$>N)N(~E z`#jvX;`y+m7Kdg9afVu0u)%v@DNiD}?cN^_JIjiqpqVklp{W>YOMx-&MBAM9-yDW= zeIqQ3HB|SLN9Sq_bUS59o1|cxIKW94Un+ z*2HWwe4G#V8K-51O#o(ys$)u^gC@SisaOQ5MyFsc1_%WrLuQgyKo!cVcrfj}8pHA|+%gPCBR(oeaARFH>M?oEP*`#Te}%blo> zJdGT=2~Xo=Hl~EunIEWsN_HQq#D$;b#~J!i1>5)Bpk^!@f8$aa^>>RLzIiVU?&Z=(F{4C2^RNZj=4P3#qiBnBh4oh8*MtMx zK((CTq?>a)MoznPQ1y*v{{>uyV|yuz%N6v{gl8(iGIOuE1p)v@{>}(})6v;p8RN}t z$k5uTKav;De&sf%^#mm7(H~<~LcZp0cKuvn6=CzhL7S@=Q5}bN=yix5)y+1Uub|Tf zS|FAW4^mRndI)9fZuV=L2*oX-oBZ=E#-&eySOHf`9fox z`E7JBn$@huGqHCi*rH`JJQ4_;h_D=du5&8JuOluD`p4f-AF7ZP)EvAku@2 zgw&Zy5fpY@1!GVbVQ^Ce-5v;bSgV;1&y%CszcY(m1?tpcB0rqbkDK#McD@_@s@B;k zk0bfeG3@`nF&q#I0aP=<0DsdP1?Ylf=D$JrR&J22OGRngT7UPZ0GPQ38&`Bv;cgFK zx(6o8qHT+pRL*TTLg8ROnU?pUQYKle_8vv(+HqT`6061Rd(DhA` zC;%AGkRRs5tT!VLfPy#3MAHK;w-K#rsdiFX8aOEXC|Z_7ku%I+xZ*r&Z$ zi$0y%%${&77X)1lRgeW-hHGit=dd^$7i=qYoZySxRjMiM(ix~OV$@=Y*4KMcXBEQm z=^LMtuygNl%$za1Z@8P?LSh$peh)qgl+#hAE?-+zVW&dBJ-D=ibq^gj+d&I~`h9bu zGhYz*ke5}?d-J|5BVh!P?MdmUPOUM-QrdNjENQ%3%($}E^(tWuXI|Up{$T<3bp`JM z7cna{6{5^s*gUAe*!1sLG>jYg8TYJkK>(v#Z0�Vtl1uvt-GsIu+Xt50vB}U!xp0 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 Qq5s~0FL7_vuaBPkF9Jc0<^TWy diff --git a/website/assets/javaApp/visustruct-app-java-englisch-java_like.png b/website/assets/javaApp/visustruct-app-java-englisch-java_like.png deleted file mode 100644 index 0bd1173b1badb7302853d708acd0610442caf572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451726 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≧^^{&5ozcQjA2Aseu^N@fkL(k|6WD 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 z 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�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

    Oj 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%0A?9-%KdJg|5#ipaytruChU$;hHtb<)xv=jxWET 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

    #DAzJo1iiD&VHMI}W@+KsaM-9}Nr9us_ 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

    JhauqEP8Exx>q%!K)NwYyc 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≠25AD=F1)-j30g0y9Gxh3K5oHaRBHw9!pxdJ*fHk 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ℜ4`xpkc}j@P?`>ONJiPXKU?2HzL=kac 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 diff --git a/website/assets/javaApp/visustruct-app-java-generateCodeJS.png b/website/assets/javaApp/visustruct-app-java-generateCodeJS.png deleted file mode 100644 index 882a16dfe9dfba4b1df3f50766bf984539ca9c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321043 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

    p*4Q_sJ!Hh^a8UIE8uYl(bXR+&!4oRD~{~HeYtC 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 z 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

    &w5{FoBp1a#%C}C0ZvDRzL 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 diff --git a/website/assets/javaApp/visustruct-app-java-portugues.png b/website/assets/javaApp/visustruct-app-java-portugues.png deleted file mode 100644 index 15d249e9c2cc811f08ffc0e78a71e2b5c2fb81ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455373 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

    Ze6XP!e?O} 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�!!B}Y=dIHyO#BdlVG3EGuc-u%S`NA04h=ESA4-h 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%0AAQKJjD;bOeVmUL7FZ^1#qW(ODMPw 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

    q4}8 z$ZJJc;a|Sg{LO!ox#xVaI=)ht)G`MJ`X0B15brVx>J<+eq|0n-9(2z}5@N$W-ki5Z zL>taN(X`rVl5?p*3F3Qsd2Dy&Hr7o=LQocVt3P^!DKRl^lN+4rMgf5{>q7k0J#X`r zBIkyJLA)65TvOIim$C(37yv^A^*}XU$Nlo~oTms#q{XNdFy1ti4ad17>0q`^mb zAN>agNT;_x!W)_#;^!U)*MR;qrfqMVx;5fFU>q#b4o3*AmN?kQ<=}DH&{sqF2qs&sZ z$SF(v8%0^+W+Kb62cmW6!C60cSZY_phItns5bzYc2f=LpI(}J??M$Qo-PBP5@!_G>PJ9a zJtA`V{HdQcy%W?(?L^K-9=VF*$Oz@^YV`IJdLWY26-CJCwp5K!wQ>QY#d4CZ_2hDV zr&v_4I*&T=xP6FzZm{A|94EUj+pae48!9Hd&~VAgURvz{ppsnf+$Vk8GxvT$XPf7k_ykQe?e2_vE*|W6aX_+$HL&@n;rMp)1z^F0H=n`D#Q;2gYHbIH^y%AI0f^l25?8iTpQpT zK$KKmf^@DR6s3E5B(Y=8ed4&Ctin0T59rwiDv^e8Z#zKUY#3yfaxEQmLaXImb2_OU zI!<+KZ{nk4=BwNSEAw}-`vLq{f9KhMV7PYu5b){e>s5UjZA@9Upy}kx$x*ttqQ|{H z*qJ{&B!UEK_|a^LG}=za%dLlAchdJYR;Lysj}yVN#rfU*JAGYNaih~4Evz2r3D$|2 z7Ue$SEs#h(`QqX65ZF{`Y=yErC{I}*dtVkp?=nw?@}rA8{&Tl0ROiT`R_mX-E;wPGz#omt7sys6GH%3t_s=_xmO;a310vT zPCTcf#3S~;ot?D03|M9NdZ5$jxSNDQK?P09ZqE+c(lJh+BSd1wj=#eVs`ISxnFaKE#a>83&_7FLGMkR={5 z{jNQFR3sG>+s$rewBh^_NpS4IhzPG%XYrZ1l00|oK%F>k2;{cEd1GSk*CHRvu%^db68={=GtNLY?8trDr=C4$-%I!W2VvQImo9 zuyuG|o#hq`-N7#~#6S1S)0Sn|UaIG=bqkDxR@IZn z0rH?^#M*~{dE_MV1D>XG+6c*`t9Z>_wmX|>XJ~oBDtmfEp-h{2<9@{L^@RFG0?oHH)ipop${*i)g)#O#5*8mgX zk06<2!xx_$Mjh%)vW7^LR?_}xy!sZqsU=74+ZwUQlwxsnfRiV_4N}j+G5uS|*Y=hb zy7%meOZ0yf49fl~vcT0ABI^t)tWP+XPH`uuCd^*f50498HfJ;3b5^%bZd$ICWp0p& zK2K5nUkBf9*PN#VergNv#viVi-uomj5F3SC1GS&M+TtJfV*Zn?)cUDKdM8fxYU8%4 z;4{HP#-13>D2KD-ua0qIh6NXScfII_IU=atHFLJ6vxFy*$hFI{y|fMBtS9YLOPw{wlH*ew~lfyzARtx-&jMsjvFT;kAU zKm^wXw*fL>HsrZ*=sD)H`(41;6McX0PUL~4+!Js{xk}(y0u0$!y8v>K7V6$S2zcrh zC6#+2KfDzV0NdhuL-sm0@8fWclI<*l0B!}V57qw(#`VDkrG&f6l{LTdmU*cFJ0USM z(8=aw1?5VAh2#HW?@hp(Jk$N*nQ1H2aiJ~KqO5itrE{pD0|C3co2vus5Ngk#Xxwbegs<{l+BYOt(C*NH_%hi$c?tl@LSl1&XR$y6ri)Yoq@2 zJM)o~0jN0|ru@#HWL>W(NMLd`Av!`3f+V3zg$X$^`aUR8J<#X(W#KLiV8a``!7fEQ zCXwv_`qLESOiG{p5u)Q$zd%CYq}+d{b2kVL8Nr5 zsY55-)^6XEKvrrlNQH|D=1{Wiew^xXS(_*%ym z-^rLX(%Qhxq=FW2jtW!d=ho9A(*Hzn10^Zp5Fw|@UK`?vyN@%612L23Kt{Rc?%n@| z1^jdNmJj$hx)mX_fg^Cez|>7@#PYyE$UQO*Cj}=VgQ&q|AAj;d4Hi+C^FHK#ov?H% zswEoIwikxcyb;pBOVci{ImrEeaTF^OV815X4bCPLi7A;pPO-IPcnb%%3u($>}FYbMDM5%AbTw%>{^7KweP=R zVe*Ll&D3_5>N`X%Y1UpW~?* zqeWavR>CC<+urv!^V7Zi%|egn7-R}|sqwrjT{q2nc+m62?o`NUX^>y#_rG%Y<1h(m zxmkDrRLk!}yig!721GjF;8>&DW-hQ^Z7jOSyHPd(irwE1&coDBUd~CL7$vLpWYyHY z@Df}2?-c(TG`PPC1z_;2txmG@xz-O^EZEep#!gDFknjaDZR&_BR(C(M-a21e+^(61 z1&r`PgqWO|WyAaLTYYAU@8pPwtGhNpX%zhMto#p*@Cw|1g5hH{KX*_TzV-4qNq-!F zmaqTZZ$$X9CilmCHt}ptgRj0JnR@VMGm3(^`Vse(r)}v|cQF#*p`s;Yvit;daq zJ8JGW2!ql`1_)c^HKil%H*IaTgZ;eED*TYpBx&A9A;^30ASwuFSNq~*@@=yNe9qI{ z)VU*{|8cdn{F;!~p2FUqlC~Hyk}Lp;4f6@&l`drUiExW-#>PL_`*SMPf`cLG_(00RlMcK zpUZ0h_%{HFLo`oHZ9-4GfycD~Y2-GT;!?Q65j(&keyu{T*4M8mv7a@Fvqo3?-On^e zqu{-=sp8M1XTn`DDPz*oUU5Yp40)|T=TrCn>M`#U^EmoSZ`?9pRh9%Hh?Qj}6a34s z<-f)I?M_-ZCX@)Pj$%b@kG+m90xE8Xg-SrOhi$Y4U+sOmvHuSOYa@)L%l6d=9+kTh z9@dKQmxG#h=R?pCF3#-3vOgsnVOFMH!)0-|$os$luN<#)znS_q#(AJ(&2*f2raRi%islSuy2PTP#F z_cQaru8>J^!&bgeMcEPavqasr7vxo^jgQDl7jcd-0D&QTzu#JQ>R<=$-d+{0jSC6K z5mp#6a#R$O)x4{QkIdpgXvYyK#s$INWZ4Zgan7~IHSj!9?o3&CrpUzAQNrgxx0E`* z@^y`@c&M8SnpQl!dTMR5qo`w(iVXyNIrH6|i8EKqkM$ zf4~o>q7_sFXsY;$m1uO)P6qpop?9o0EVRf`KReQ_5Fg&bSQr2#*(C^!qzpS!XB=2c zs$=fuHr?twQG=!fpjI8Fl61-HR@b)UCS}vVs=x9W+3Ed}C2n9ni5$HWmrnnhMluPy zeO6iY_QrwFE0T5q*!aTSKCi%%U{pt<>3(Ka%O-8g0U!d(Ahh%Gb#q>$jGqC~1&N0cY>lhm&{sTZ}4R4{5pMyp$1vvM(y7#y4jVLERoU(Cnt3Yi;w z$vy*LJU6a?WIUkzp~x);I^WOQwg|8LM_UV ziY5b5^}}E6V1Q9E!bG}(?@L+=XC~y%T(ql^WB_HQUE0(zGvfJgo9GzyHRs{_SN7i! zEdS&^7xIT615uWBPy4!xqyr!<>?4KJ1WNstUrP{FO;=#T7w!}v3^{a51K_<~U4Lz> zLN@$)UFzUx(Tvj-H(fXo0CMmh95lt6b*Z|!{=$Ap6AwGd{jhxuYj_zD3@F1I1;Tb@_K5fvGylfGh18M_87;q}(NJ=+ znHKRgIpoFRz0aKwd5EQP!ubEQpq0UV)hE7P^QCRuPiVUi zO+ilg11PlEffw~bus^9iO5;qN+t*@L70uP~3XXobLw8iZtyxzVSXIA8aT2rmNhpvd zO(TU*&;m)Cf!MOp^CQo>H30~qoS^E9+m5?mm9K=P=x(4}AoO!t|uX3!bXuBL?9Y$D(fTQ^u5UVb{ZQ#3bQo7vL zmWS?oo~!_f-RVdh8P0XAz@@D)nrn-(lqPX!F)zAC<<|V!&34+C^ofDkJq*7-*N|db zze@wA?(=G-WY>5Jo{)SV4MvQOc}t>b`A1F&sC9t4<#>bp-o^-%UKU<>wdqU?gGQbJ zvT^EgdeH;XBd+kUpya)Q1&&E4JIM$wY~CeO`~(@eBS+k7;j9;;JFQ5H4#}!Rj2Wa* z+d382ZhKs4Kk@O;yiefwUIkn%c^l=+pnrnRDB1qCwk6F{0<)`Oc2CMC3WPm@g|0)= z5S03Q*wnj?oj{!?A6zW^-X3Z%HAkx}=aqF&aKl+6?ZCN3pK}i(Jh}vT)Js2WUMj}; zaLSqq?=cQSfs7^4R>l#qN-DRx&X~dk-PqIg<8``^RzJF(NX;p3dN#cihLm+x1F%$Z zPe7hc;u8ga%zMe699%7qM49;vQ{6&|F2WhZqr#*EvE9qeql|=r)V`X7jJDd+FulQ~ z9^yfD4JBkXfU{ym7;hkq#zv&jhW+i&vJ74v-o2Kmwl{!ej%>pnhnZGL(m%`Sa=ZK^ zfMsWsv24pMn{pGT1`$u`=xxh!^0dABQ*-$%tyEoT8jx#$rOop(_PFr<5l$%pmunuQ z2C#%S-PQgxK;4)_3Q$topCjF&SQ)JV^YGDmT7aUVZ|77|_Frl}U%N-;+#NF3`*F>;8Z1z^=6 zEZphX>u5QR-~%lug!Iq{86*6lcpzK8s| z%gJCL?<7_q7B`0`9V z#(=H$l%uzlse*!SrBY^2f!TT_Uy-ZRSSswALh1KgxeyW2yY>koRE%@jAHV;CU;Uft zJNN^<*?p8#XqaiOAXeJIxedF1td?;oAoHO@(>hPanZ(Jy3Bq~-uU5y)K`--LBm)`t zC6N#gvszX}LW*@hwDhX%HkDoX@?E}y-NZ}LE!nU9L@|GA_T_40 zx!Ojlg)gLI~q1+-bw!t7WO|_>Wo*62#z5i4&xd|Db`W05Wrzm!yN20BB8Hs6HH14wK5JF z&2Y+B>lA>A+jVlF8O0j7DcY<9Cm;AV0?in<*-Zo(n|2d>%4U

    ^R$jIW({g({hHz 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 W@qm+Y@Bae-Y}u5#vEl7qAOAP#WO1JW diff --git a/website/assets/logo-mark.svg b/website/assets/logo-mark.svg deleted file mode 100644 index b9756f49..00000000 --- a/website/assets/logo-mark.svg +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/website/assets/swiftApp/visustruct-app-swift-deutsch-switchCase.png b/website/assets/swiftApp/visustruct-app-swift-deutsch-switchCase.png deleted file mode 100755 index bc9bd4395a653308877e4d9b0a0c7da97685baa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79972 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 diff --git a/website/assets/swiftApp/visustruct-app-swift-german.png b/website/assets/swiftApp/visustruct-app-swift-german.png deleted file mode 100644 index ccee1d2fe7b0a5158185cb6b63183dbad010b145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72779 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 -m6t9B2UYM*G1FgIA*p;^~%w8 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%0AU}PQems=g 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 XKyWUtb^=bWl1{qEzWp69`qL zH#`*Q_?6FpMo2%@(=3MK#<_^=>)nq%tcjCZ- z18k2T-ZwmO;3)RMfx{1v9R|)U_TUtNg9G~7#u`i}b9WcmcXt`PjJ=(~*xB9LVeIVe z(CPH;?VauI?X9h?&CM+ujkdnNv9`9py1GiGu2BDM{`vD~okICT+5AJH{UOsR6dDCc z$r}_3g-rfKUfx(<0(Qz0X@x}kLn5v(F0L*vt}GIPbdk6~U6`lN&;MBfwz<{$xz)Kj z5@Ghw9Dy)9yF3eQ)0CNM>dX{%W`;O3Nu8cvm;yFDc@j^YoLHWiSis})6F3qUi<=my zOpKFp<7Djk-1y#(!;KNg#t36$WB8G&(UGOm(TU%`@xO;iBO}wpL$gCelY>K(!^6Xa z1Ji>)=LZIc2KpC%^%H*qY2U)nU%3AM@%}#Cj~@g5{r!Ew)-&1NGuqShtGm0K(1Gge z{N33()X_QI0i+%M?JYCy?S1XvW?I{Rw6+Xjlnd2 zLl4!XC+blXb=A1qDr{{fwx$wS1Edw$nwkc5btkH(1BGs{Mz^C-?bX$dm6bJBrDLUE zn@UP+N=r*i3cCslzZT~W7i0~7$?E;`r7-W)Kz1%FJE!n-=GV`kKc^$h($c@Crhm=I z_%t7mT>Z?*r8DgTFuA2MYJ_3IV$Zyab1U!C)tsxAsnfFJHcNc7FNHKEU4I z0c7iM_0-SG#_yT!a~m5QGfN*32xMt#X=v(h_Qb-})Kt&V(ZIk!OYfzgp59|!7hPRl zO)aNKkM-3x?H_1r-PN$WqhY6}{_Kvr@x6QZl+-|X?%YvRQ&Uj2R#jD%SGJT86aaq>QnQjEt0&l%%AjgoK2+xVWgOsECNjrAwFo`R5-YA)yNw zF7Wd5^6>C*adDkFbB2S1gN=>t#EBEfjvZrVWo2PuIdbI4;lqay9XfRI;6Y$4xVa4! z9XQ~f{pkK(<5y$L44Ag@eC8&z-?4#UtZ}EgKg07aBy5;p?lr#JE$6JI>!n*CjI&fU zvJxRB6PwmEuXlChg7)zibrvi;F9W4%b0j}55l|G)je>4B)0%2LtYhxa&QqZH6)j7vsf18`GJ?zp2oB_wB^;V%{#7VMZEd+r7UPPPD!n zQ2-Z@3W#}ecuh+NhqmdLV)84N1K9n+?8&sjBHE$GNKR==#S=O8`*s~0%Vo9?9D2pi zQ*NMSZQZV(!-YBZtbH{4q38T4m2FD2drp7wb`&vv?N4mGn|~NYX^__yLgC&tUbs}g z_y&_IbvnwT-}gBSLMl*}9{-ts?;ZL6^InA_gSO8XPu_x^F2uF|tRpFOo;qXh>4s_j zrTSg)e!vq3Pd$QmZ`UWZ!w=T0#T)DvaI%awZp5cv)raW9xf|2&aQ1_@eGoA*x9A6H zT|9wzR$^$qE3Vq1>n(F8<+;{#Yn^XiS|!MZb%VmuR7JFPfmmidN~vTr`pOZq>3Hfz zKL$DHl?r;|Y(Jl7exTAD%zE{!QYn`8KvMI%!zU1vF#hkYbo$zMjHb)Q>~t!xY)(kwcKznTwbC7JkeNDI2rr zK=RDq!TetR2<3vG#o7pvJWV{NcTa_8$A2{C9qT?;Jb%e`ZJa zP67M>%ys`B{wMo?El%|v1bI$-?bm3K5;_QzFh!Q+toQP47Qh1g@xA2#mbc#`qhijm z<+DIop%9cUR&phPpRKt2KTX_k)&Feie_H-uP2KN}|Fi4b_AzbD{^tTI$PpxH99C=?g?DLa#o zxV;s0(r>qc6mpk831|q1Oe%pYa^i%Ck#HUdaV{>Yy`4UOikMq%*%(c|aOK9;V){0C zH)}n@6Tj-6EQ}7KKXvC&%ST|Xeed@pKTa)qf<*NWLm@&>C8&73^9RB(-8)0wFLD=; zuQ5VS35a1aFQA;}gq{o)VgFSjLr~ zN3qRt$WeRir0nUPw19@0Q{>6rUuY!;r^9%e#psXfIPNy4nh=1A*q2EUd;}WKKq_ z9aSJT31DsbXvyP}k=5O1Azt*Fd%e{I8*pn!gXjMKJ8N#jUf^{RE${PVanimnMD+pT zB%~~t_~QIxPS=oyZsV-v^X;m6ThGSP_0{OvXpfwCHzBOFX77b?W6tFPIt>^xtkQoZ zUfG_Lf<27+d9gtwks?G~Wp1gA@bU2_dbQwGQRaz4Z*>HJ`BX(bwj^u_+V?EbxAUj# zA5ClR-ZT72cr)2>_o;8E&|a@xF?pCEvJ z!6`SU200k}6b4lN4MocvJ`*L+ZZ>FEWU@-}v5h%tdz{LXk_k`UJssQ*spymyuC$j~xEte8EdFD1@Jgok%YBCl+B> z{mmdkcIc3yuvEFXicTVI)Bwv==Zp--0USSBP9h^?L%jlS2#FI{D;$#^L9A42 zc9w#x1QJ3MkSLa;q%AHd`eI~s3jYqj!ish$?+ObM^k&aedP-NpMhXE zevZqRuLwLL{5%Sc(fJv|u30K0ytFYjuQXCiRQ3U`Z6-^k@o=Sk-F~*bAd0*FHG-0JY?op~XO2xnA_Hs+;PG-7S4`FClfd*K68jqld%hgNtC zr@337tT4$e=jG%IHmSC~(^5~qva*xIuN7BHt`T<>;_c`Fj3NB}*42lJFZz$0wRm>9 zMAR5_agsyu-nqm>KG-5thaPmiXIhQtVs)-`veYaZwhkCuo34;76i(I2}AyIW&FZ_lY z^WNyr@`NU#x;dC*NT9NQ+Rd|8BawtPVtI|3ceb}1P2W)eU3&85_^;J?rWe67RiGIj z7=vvA5QGSqoH3)VEnnxwk2Jpg+|5~(xq@Rr?2A75#=GORaL+u^zPSr32*VGXk3TAA z@}PML{9TPoDahS76$62xaV*64iuQ`=dF%Y*>yQ5|%TUR+Sw$1?9Wv}v()Go;MZz$k zR8!|K*ZY_oP6&e>UM$NZbqOA0Nl~%qm*fHW7J^BxKi^mbzWJ`}E z!3)HV-=ybTTm1qPud${jiBi3rbGFRZfzLR6W~f=vj|qo?AT5i*8&#&Q+9X%Ee1k;f z%ap;R(8fru>$r(quWa;7yfQh-)6Vt0qcZ~F>n4+@j?%)SFyl&h@7}fTW4vC$S9RS{ z{H!gNrZraPF~NGqm)mgtnGGjdmRpUWQM9r((+3t?WYg%zYNKr=C3hXy`t;-_eki~b z?Y>B=2~Lr=+jX2<-;If36#ILQTqsUhfu=av*LjGN^jwWt*VIHMFNQ#itWL+jr^Oi~ zs|_5#$bLlTq5T+lowJnZQHIfBMdO@ zh8A~{Mj0eS^FVhQO6}rfxK85Aq0jWi_{-cH=P9=1?m@<%`>@y0TI=@k8}+PEvGl}z zzm1;TU2d@5rBP`O{nSa;2fE|hnsQbC#U&2zT-^q6w9N~|nAiGZx`R7wR9IJ( zu%vYfXLn1XgiVA0b2P+8L}D5Jf)TqCWMvZaBg2-_A8|5{HI)9mT_tCl@z9b~FWp=( zS%XX~tb2e1WiJQ93Z4Xy@)aEgJU$4U&T~W~BsH-CEm&|X9xO8hs&lPIKgo+w6=P)g zl^(-(4>+Vc*aWU17`I$f+{?1u>=JD^qWdBw4u`w2nYX#4_3q^uU;czlG8N{%)H6=6 z`>l_x`uP^7vnJ#{sX7dy^*4CsKNc{FAJ+7y8Zx4sT7I z=Hv|rr!ffy_G3_`{`2df2IgbH=}$)51#MDQ8n3Ha_89B%V5Pqg&~_po?Y-IvOq^SE zOpGte@ty`;=Y3x&Y`JqQ*JSaog5f%cheWU4ffA-SMto-iK&q?=UYw?L$)4)I|Z6hOch1 z!%Fl9#l~2%cjT*BBwjM|6kC+}1S{D?D^pPqTw&r*)%tT9BJ_}&zL6(tFV;0-7H}d- zy4YhpYw3+n_x%ECqyCR>_G|U$2N|}7J67okVkE4mm}g~GX;-`ZH61eJmJvZaz9~NK z6lKgLHuAccD!c6tcZugKsx`fZHQ49aTKF=|g-*^-;UBFZPtWU~f1B!)saS)saQmWr z1|N0X{^PKG$?H>%65Jx^-Aff@vGeCyXl8Hdr@SX8R_eQA)vFc1G*XuJ^h)aRZ#K%P`x0_Gp8zbnNqUA(@$&?y#s89w*Y;zY`X>Y=0(q|8hPYS^Dj zeXQ;tm{WP_(PN8Y!ey2%*&*N6cq&ur=lZWLrvV5v?=UFQ#s7(cjqmSDi>v)S*!F{D z{z2YNOIRe{0+hp!vwPW#rumcGCD5rHSAMaGCCTSTo+jH?`L@(X^C&yv-!5lr;7~(K zWW7=rTE%GtF&`B*T~jtnEtkhTq&iJH6PQmoijymn;D~FaqT0dw>fs*;q1`q1{(fyL zl-j`@37BzunqgOVrjDR(P0nTeeDz)RRznSa`lDI1b0fpK#3uNKsf?oNel49r=l(Bw zor=%EZHzvI4ijxTha8a=ZP|_daG?gOZ1DPb#TK?S#(Xuyory#5-tw)`vI%+8d&4Oa znRH$ceDl3GS-{<9H`tpYAit$-kVB`gw07V zItL-KJ*P6pNf-5vI1}0f1~X<^@&xT4{I~?0uRXZE~ki-su>VT{gG-% ziz6l@bxdVkAbrlD8LmgfNibHtM@aq`&#ic+5pGkT@bXIX$&mRPBMWKYmj(tbYd%b< zwB+FYt90D@ZkC-S%kZH!k&LS9+t+sns=9a4O|pJB(T*lNe!GY9YCd1aj|+GoZ(Ubg zPOe}6Vw`H5R<5v_ZamtMX3e7y3=_LPxbhUDR+_x%sM{egpvg;nQ{+kGbad2nV~)+) z7K)qsvI|0^dNXG!{ND@uhcS6G3_ptnRe4L_scW)&e}a^vSjgASvcun+TutCaTsT4w ziO9)}a)X1NG&77nJ7|+z+u_!22{Kb#hE;^LBf6_TCR+CR*YsE4tb@N0leb{hZ_jI9 z)N)U|jb|(Wz;2YPv{FqRt=_%HtcXiKZW#Qd%}~yhrgmfW{3tw{8rHo%H%%`I#;oAa zkH47`H2>st*Y|`VNOo7Lb?p)tcxS~h%OmDWTY$*kQqQa%ulBeV)Hhe5%I*;IV)J^w za;N{CjR@YAACA$Ytj6%EgY+%zdpqsh#1QZ8zo;~J`nQ@mSN-aQ>}gJ3f!M{9y~>VQ z9vd5v^Y&PjAm(>YpbE~-Pko8iRn4qPkZPB$%YT*}NZXW#wmP?fWOm;#O{`-&bv!t% zJHZK)JJG~t}d*zQOv!1hmW;B=ua8$S6bZS-JyT12CqywbXsZ4p=b#Y*Wd9QhU}-QL{-+j5P>j zbg#@fmHX*;l?C+WgyqGCD`m%47NCaauYJD?W=KA2{kbS%f{VWJsNf;w5RLj4lUJ*p zd+}!n{FNU*Hr6~T_}*=^YGrWBy3k*hLGOI=NO9*bhvRwGCz1(fX7j!a;ylKo zoZp2un;ad-d6uwFO9!wSl`C~3*+n1>y`u-_12o5x(b4< z;rdV4)h4*rlv~B!bbD}qS7?mh4U@c&$hMQ;L1&@v!^Ig6-)#=j9)13{T5!J1&E6pQ z)vKIto%TGp(3qH*wF}B*zNlf9+gV;(_>s*y@lAnG^-w9`jt(9}@0dq;;;V<4KPx<;&KvQ3* zO3J8W#`Et5C%|XB&kJ2v`sje2PwZH!5Lya(2V;7-F-Q;0-6qrk)DONnP*W21Fmz)5 z-RgVQQRn41LC2N+S)tXS`GhG}PWB@`K72o$7zvXlW#)*?ob-+PBsqRF&&JE-k8CE3 zN{4FPHz6b1E8Peu#3xs8s&o&`s2=RCeA?x$JI}mlW7)FpJuk}~(Ox)&BBII9FF)qj}w?#LyZ zf5?@^&&Yp(hPj`@Joo>?ma@B%m>`Ad!n}Q_lJyn_z#s`El>^vfB?#&Pw%uh?^)XuM z75%zzwIt)mSnqm_vd7Z>7dMaumb4Bsy*?o#ip)Tg}RVEDD1YW7#l=9AGxMmJN}A(VcL z87a-xI&NE=9{F^|ittz>4$#TtSQ}olN~VHyK{{@*bL<(zyfRLNV^t+wsj951g0l0_ zl{0~M!Lc%H^`r%;pib-9aP*d%%pUrOJdKVaE=6~)P{Oh*%O;WbTda*`%vL zz^iYCSkfpfr@cCjCph_YT)YvXz z`HB7Mu59{bE;a$BR7PQ(+=F2;>vAroAm)`-sh}6ZD{0Ht9e8#C^R;x>CC#jrA<-8% z{xPj#6{Yy7`b>jaffrWn3v$T4G&Di`2X-1`l<)?IEgIPzKM26LV!AFU6;mPpl@PVp z8wcn?D{otaZ#!@8UvnX^2OI3M8`1`_Plsu6KlswO>pO(kKn1)xaCvV-KhskeR6jZN z86r!rpW1KV7z_qZQ%n&WQd2+yMjbhL9<&#G9StqwO>C#fKZ7l~NxlS-X)FtpUXq$rgr zjv0rl~UTsi>8+@-b_&B;=zESpGHV&dMtaFUY07| zV8_-=iprgvjw)(zdvLv6(%Ub+k!?>psit`M@^dg(9my`M;nddib@AOxK$oW<+lTv) zVZ-+R0@iXr4cq%0wm-)A&;KU@&H#U#(nJ66Pj(bQ)UI--9D-f~N)`F<1OWJf<3qFz zNF(E<&Vt|@rJv~UjFTCQVFFqg|6Az)ki17&{2!HSw;vl>N^`ie<_9CvIUAt(4U5~| zon+Y?0o(xBqFN1e4X+<4q8(P>AV-7`>22C(Z7j1L_YX*nW5ffhegJr@x0D=48pxB} zoAbAgDZgwE<2_zkcW>@@?lrQJ=~8r5>xNrvYa7{G1pxBXo8a2N+?Z~m?h;q!UVu9` zn$}%R_5KVOabN|@M>f;GYXsL(ny~xIRs*ux?6jFVVv9iq)NSKX__Uc^&ySNttNFUE zVN9XgScB4IWoddfOlOL6Wbcic`hYH$i7vm6 ziZo#vcdxXO#qW);p6}6Jjk=9x>zD0=`^5>2FPmzH)okdU`}PXlyLG>(zP+T{u~BqS z?^6^~xDS<|o~?@uyrbn~l54~LVtn^rju5Ag zd7W7qoOVL~07VH!Q|H3bBB+~(j^sq-sWl}z?n$8FEwf`ucR z#SU22_hodL0l*2LX8k*uy9QpUg`dS7FM~g=E!EE`{t~0mzbDL+o*jupCX_AsY~--7 zeKH}yb*;DxaeLCbQp*)h0n@o@;|_aW&u}C}_3@eZ>=_ypnxvxrq~Lm|HVgT1ufom8 zLa6>_?_Hlgs}WuSlLY8x*ewSR+XabpJjIjxSAq7R<{U%~HI81|_-DIi&*XfMY82Qz zJyCh`sIk@=*v%X4KS@~=4)yz$0+%-CjgSsI9^82Pk^76Xb76|t9yvwoCE{Cuap>~M zp=XR+4`to?OKKImJ_`jgne`zfL1{^&g@A!S^4C&Nm?n?yo&!9CJc_gq!|!W7YAkWr zq?F@AvEBkCqvGlJRfu4)(DOdOdIa7OaEFJWg*s{1?HNwXdh4SbNa2Y#->foC?H~*J(yW~Mv1`v_}A@h->%=S|7jtpKDgz$%$x~{Z_)6 z{2j%8makq4TagKke#ok~Z-W6YQH9td{~%k>bKf)&ho*L$JFxVt`;FLV@ct)_7qE^V z7e5ZfGliW3N%=mMM=tWz^*wVE>a-;ZErFFDHy#ZkSTgdW`f@8Lno}KL?=g|+Mhh&? z?gT|SY5b#`AphBi)izwi*3n4S%SY@UgRR5;!(tXa{%}NWZIhBEcjy7;9-%u8C6^tx zf1n5gbs}@5&5lV8MkAkVM{!|S+CFhOxhv`p?eYIKVSzA}x*U^e<$tvswG(o$5*8$` zR=RRwaaD0tt>(`hBQcSVlDNFR4kdW!bj7@K?bb&T1kEAK!}W9RY$i3g5ONHwn#nS8 zH5|Z|1AH$aSI_O%n1q_*t?cm-MiF+y*9mDMeuABS0-Mfcv#p5wtnP2IObcLktoS={lutZGHD_cNm{hOTxw)t*N6a(lCohhH#-15@bQ2nEx@7WF z?Q3L#=?y@0Fu11$bJ?*-Q|`2f>q5WuUf{<2LUz*Z=`*CnB+vTNhu&wWe~C z%L=I4_Np+;=OJ1T$5%J%=49!u4Zqf{hu9qV2qAXc zl^ll|(QBG(C)pU}Th+(=#1|0Gk>%HG$Q>-O-piEa?*8XBw;KA*E-$Z4PS)`4^Tsr@ zP*|JMt)Kcg%lq$u(T(>%n{>fJa=i#}{gv*1FuidJuFJ0Co<%gJMYLvXtABAfGNR$* z2|PzVi>VxJ`(1)F%x$XQdcxC(O_KaLvHBF-3{JOeG~)NkKuEuQzy+m8I+*V=Twnu9 zRM+yI+v^0f#|tNNzfL(;01C(oLAoFm=gx(iC9v%&0Xx|=0@f4UokVFkJs`!FBxxh@ z`(@prv?^+LEULhTM`{eJMy|=Wnp)wBV@N#?C{Y^N0-e>8wCRJGQ79{fU)oW_N?V3Q z{UZ_%Mbalciq<@WULCCQ+gc$?aNMG=5Mn=nShC5)5^@NMNf+#IGnPK83&}$snIc{b z*K?qkXd(_WLHv(Lf~uT=V z-Leslzs;yCCeGp73&=dJ#d;${VZyI178e&EUkW)64LL>lU`4tqFJ;zTbA90U!-g#E z^s_I$cihdKnASNA#NA|QHhInbpJceeu&2*CVdWTylJYD!8BUNLqu zE>VuQcB#mlG!TX{F=N^xh_ULKi4`j{2aPA@V?h7!MPmKuJJ?L;nCT2mo@2=h1v8P6 z;VA%cbT!k0l0L~r?#3Oi3dOt98t~5W6vdlZYugePL;MSDFG$|buu;SS5}6N^P`mL* z+L~JM>H)cCuLeqJOHQ&;o({6)@tD8u_8O5rPIltxBG+TjjTK&rXYxZz43%;LsC~yr zeoo%FF#ypYukXn3`ZU^h1!cY^I2?)1?o7|dwMj}#OVb{7pCo8J|FGqH*RAk;&G=tkwVXHX zcsaxKVX@|zg%sAca_o`TcRrr2&ZDV5Skku(FGa@3)`MY2CGN5JFeVqwpMOjhyg)we z)OnO3c(QI>GTF4?8f@s8&z$;}K`#CE99Gz53~Aa5(_IGtP*qs!j1$pAcDq8O(Uvkc zYZX$n9Cm&C@4c80Iq4m-yWJ3h!vHjvi_ZL8Vl2LprZP-<4TEH1i%WGR#c8$hd4p5?YD@n!(@^y|J*4bH zg6BPJdb(>fBbokXGGoWnI;qb~CA8Bh?eOHi5Up1Bp}ZuPD2&5{9g`W`l#o1ioCwDx zr)I8*yl4Dj!4mIXzG1?G~6?QezZGbYAtK<^JK{% zH&xo5Zo(_(F74%Z#MW-1CF?s3lcSCEn#{Er6!jeypX*%uLu|Ful*-xX=r1G8P{M9}V z5@NUJZhE|PSGwFOH08|rrYb`3ckHtkoP%EatJZ7U(UICUUzBU*x=-}=9tGxBVbSW% z*1jxqUN%uqV$oFzLZB|)$jJWNa4lcZ$Npp%@~x4Af)ZDjy&)`i9^H5d*UnDn3%NgY zeY{s?3sK{69s*@rV@GiOIn(%>&gzSsj(vfJFa{?|-0fr!%Ik#KL!*d~y<^JCPc#7SXt_$)sDe#4Fbx)HsMCXbLbB98vTC8Wz zCyqb$|ANvxfL_ishRCE=oP6bps9gJo(Tm#7rQ>>L|8{2=LYqNW6S;=8&nLve~a! zmepFYu&z{=fV~bweyX*UC9BxWL&F-8sF|;-$1RkgG@^BX^_9L2Z)y(NyX_K_5RnVD znk2*T`Wsj4^rI#H!gNLfN+R4b4<*>#l^Tb^=?$cc59=!KIUM?{5qQs(>I+;fLB#Rh zma6EJ3i(H1V?)cH_h*u^j-WxSu+OGkq3;9kh4DxmjyZWyzUK00pwr+)I_vwA(p9 zf2>(0+8DFZuwK)`TPVreH2bTYptvWdt1Y$9CQOHFkfnCio)r6qw1ghhhOSkt*bg zmPmR403HAZ?Ctvnolj0I`zsgf^92a;2Be;$#ecFF{#Bx!c(0r*c0WXR%lVP8q2C$S zTi(3eo~Jp1yJ7@^xY<0R$+g2r0IWCd_Nl+6C=ew7)-47+4geSe*r;M1CE4jKMQKgw z)myM5;ZxM9aH_E zj;Z{wj#>U2OsvZ8`k#(*`nO|Zo-%3NqyGxYl7a|X|3|b8M9BU>|BqAzX#7WP2M10Q z_n*SdaZGx^E^KX2E{z&Y&&{s$bo4wcXCYQcd7F2?)WgFAA+k-e+0y>R8L}TZ%pm|x z*ZfYMCdC@33l6SwD}Sr_#c=}`T-|?M&BTZNsWi^)TjzA$LPH6WKRttcYCp7`ovgbW zxKfz&ab>z3thzur5ptzvRHyVb6saD2IS1^u(wiSIx;r`|tJagBuv>Ft5Bm_nrkm!N zXeBrfoQ)k;v=k#B?<&+Av&e&%i!OHm0xs|II|q)Y13^ZU zxq&PL|sqPd`)v4f|`S#Ri$tt>4U z(`9E={{ZaM3_>s0{Tw>x0=agyaJYm~Dy8l^HdZCX(jyI8sGDqYotjcog$#JN;e4BO z)2Eco%t0*Y{J+XIsn0L*b0MDQq*5=LA$2g{pvBA15Jp>hmB7g-SKX$U_`mw3gxJ4; z4~>~rwBlez+c%rqJAEhGtf#tM!dJ_y4mQl;4)&?KsO>amwX7uTC_!DvZ|jX5Cikr# z8umf&>G~ns@gNMTT%AZ%NLYVYK_n8L7o~tO(K8{xV&>-qQavE;{?@G6q~-0aVj^lH zgu(-HNq3JELz3X9GvX7FLJfE7C)z?A9SMZ_93d=mz!ksL6+{%!ia2-j+`LA1wkG{! zX}R=u#*fEl7kvyZy856#h`5X-8kAsvQBmc}*vqx0KWmjo2FkT@fjZ2D_=Gs9vdXhm zusqhWfipcZqtZogZ@|&tw&3iHK0MFgel0bYUNN)49kfj-9ok}@_-PK|(7SCZCQ))- zcYN)g-%QYac6dJrcbFC@SH8FEl)3%-wCMVfNERHkC>Ss4U8E>^CvvDlG^eg=uJAIq zmIm@ftNb~B#N)8r`B-xuAZ%Hgm^U*AKcsp+@%p8C`!kwikugB!renE_d zp!w8d4<;A6M8*#d4vK~X9~llBzZJ`x)xi%vemC}!G~&V~7t!D$JA;rYd{}R+pCR~3 zdJ2@H?{->VWnm^emD9k=28;&5t+7)HPDqK0&AYx;iScZv^F@pNv^wSd>gwDTCkk5f z;k9!dJGHgV)9PTaZ`SgXwNIqd!hZlpgcGf&j7^7s%gSOJJiF=7UtIaC(|L&cI6rsc z&znyI$G2GWH;}2?=#eCo_<4;0KCTZ&Hy#nD`mSPKB3^WP#IipCr_IYSSEntA?R9@R zg1!v|#Gle&#hk*aJ?xNzR$A3?cw6K`u`Z&BqP|CuLMKL*$j9f|)<~W1lQWkR??rF2n~WS)RmF6js(PgQ*iCn}MeLNU0>-ot znz~#eU1+MvNRc&hM!HcRYmG`Ty2YglUQ1b?suG

    mR}?mIsJ;zeIDec{QC!+^2nJPlnn>=;wO`sQ$K`R-PN`%q8dpRVnd%hF`S zVaG*%?2VoH%K~_ZZ#aF234ujUYipYw=*-qhtHZw#vEgU^MzMjRnI9LyQF&!V0cifx z*R7XwDl@7g%i+cj{$ctOI*K-FoRbc1*7H;w$3mBei1Xjkz|_RDo6J z<6Wml2E67zz}61U`!w%2kp(W<>}cfppgj3FckG&7P0ov;HC%N@;{0W< zp%I6pH5(By*8sGL@nc7hwc8$&q6KG+?knzDGbluUp#BEQ-&~{Ww#=8>O%Zh^vLn5P zA(F49F{ScSY}(khcT{iw_IeC`3IS0wzMg)9a)!o7E$|}zPy%K(0O9L4F`i=fY;)a@ zI+~V6d~{r+DyXUcp46%#DB{d6rq#F&7Jm(eauCwMgG^dA!r{k<{3`m79 zsuH=^6MPG?fBl{HY3r+xSam?8L!yhU(e&z>*!Y#tN5@COXm2IS*`+^XEb6*>G5#x$ z=#Lcn-9Wi#5& zsI{pM-1mJa^{wrU-On4F8+qFm7;&W+tKl(BV${X}2b!#CZew$X!Txt9rlb&zj6>*1 z33@G_K@8tKwr31Vfgl9uK^*Ch!B$PSMCxd~iM5UU57g>$M^&-77rMKTUd~48t%?RL zpMjQTRb6!~Ev^@+*P5zY!dlKTTB z)nxZ4`5swPjJL5?3U%hSUjR{Ed?)0`O?_{SZ_z4bb3LQIH#@Q~6RexJfKM`w)bK5% z^RoaaT({7V5_s4pCRwn+OZ(&B`Nz(5ty)bZFHPCZ!B4zTtO6mklN@(?w&I_EreD<< zXOMG9uT*I!A@MGAAsAq0yf;qt?)w&h-W(6OoK4_1OS0zu&Tb-tGHDMeD!s0n;j;kI zExXKZ8GTRoB)l9X#f9vW&qF*3i5vJl?U%o?glgAI97^jFUF4%c6KrYy)-sZ!|T0~C5ltU)hy+-`#%)V#fRldULC*i)q5Trh|jS z!`C9W=ZuZ>3eh4aW*L=}4TZI1w+UzA<+U$I>e!)cea&%dfHNL8w&@I8s1}o+!Yt~V zB$I#4-vQYJ(VXQoO1R8^Q=}0z4e>=eQ`cyt`)r@6nc*?~Y~qjICte2wBultBsul76 zb5pO2x)x;yY_(!OWp*ukvI0v0z}H_T3yPT)OGyfk5a)`qJ~wYH|0v;@tJy9&p>Ouj zqW_^oi793Ri*wg(zMLGJmpu7IHgCrLUf)Sm76IinpKHoZP!KBkJxJ`ZVpW${NZ+dJ z?{fn6!c8=`bdQj3J2B!2*CI)LV=c7#;1Qkm++A}>@&3QB4Z^SIc6Akg zu7^DJe!#au%xoLImMCuTm5~ zz%KnV$aGA9>VJeVoYo|O3w&UveEtt z=ckjHI^!z)Q8>oF2Kbn*xNtALX7PvL`;+jx_`GFdVCe-4SN5FK-WZ(XL-qF}KB;o_ zmkWTXVCAi~6zR_8K}VVHl`6KbMrHo7=L(i5$)-a9ONj^;v*M5#$pPX=05XRL>N1u? zIO?Arhxz&SRV`C3eW<;Q1OMP70)`r?v8Lv`%_}BfR|>(sUR+FZrw;_Y<77y+=LQj<8vGbr~V zr~=db#C4(GH>74+mw(As_-{yzvD?q{*qMqtLYOT*=Lc_`z*5l(8UZgBQv><14NfiW zx8M4B18r%f#Vi_OmH6MId*ECU6eqrx-;TSH8jW_LVGTfDhB}`dl@kb810bl}i3xxh z{%Ym$-q&@6L~A$-;4df8AX1MkINf8X~RU=?~+5xPf+#OyZcLZfmoleXF&Tgh^ruu z+>}DQ_3fAoP4Iiu4GIdv!fhJTjEG2V;L>J|ZJ@0mWTh-{VDwhEs}fN9@$TE!5b-M> zowMwykuh-8BNfy4sVQ~s1NRM{ym;{0BSP~iFR!NJVW!4|2W=Wth?13<^U#^#jAvmf zHAh7ZXM*xjjkmKMp1;-gKBnR^?L}rOrhSNvs18T={dBOl^||}TU9_XkQ_rJ%WkADk%jS@EIU37`*)K%#s4pu`s=~Lz zYR{GZAn1O6WVHThwYzS3^M1`{YgTHWa8%Gtpy{ZUkwacodZLn-iTL#qZCpSt`E%_O z17xysZWR+8J74bqO=; z%=9KL&+-Pf;v~w*DTLU$Sjm@)lNr=cI;Z*b%`ZKmU&(d%%KbeltjP&{&A<`c%GJFR zNS7RwhuuOSCfgLI>boP)d1keGrRU|OYK^-iKU}=SR;6sHN3iS_0qW&(B66UeMM_dS z**xVA0jK*Zx-mU0f*uvC=}O}>#tU7}mFq0#pya;jOUI)RZ+>f+F4!x?gkjG3jcAtJ@=iFzX?s z(YF}a1)X*7PlOC9Kd_3?NHhk|OWpq2pxTyux2E-fwfEgoO>A$wDhD|##RdonQBjdD zUHVZ(RGLVW8l@vOAOr{j1(6O)M@po3A~m6eUZe}56S@Iu0RkaF2;2eB_q%u9yS{b* zy8m4kYbG<9y=U^yuJ8Li&$a{_1kXf+5FJ?jqn!q$e0tn`ZT1FA3k|Bt%{Mh#DM5tZZzaj|2kL^bSjO+2Bq^FTLR|yb1yyzRSWP_?{ejLA0XB zuyJfka&oOk#$<+EDWz>B81J?mZF60RViJX~TyIsMTMseFy7DE>sQGfM)=MZikmjvz z4cxE_gpaxt&`DLO_q-)?S7F|;i(5p|ya`^mi(xI-l(Kyu1FJKqBk08p`@jkn+$o^L zQ{yzNOr2L)P?OKPrh8jjF-0Pt#oHfR;eFgGK- z&8m%6AHl0M?Lp#Lx%v|^Im&(4+@9(ZD{SaGDX2Y6^GZ;x>YD+59@U}cdGdGAU`ahK zv`Sic6Kp4?I~MV1t<2cX*RGc65eq#hHB{hGl`)!<_qR>7CrZ~b461(^R-xS*LW(oy z5F?ZtU(2qgNfcKX)9s$C-IX4IM?H~sa1EAuXx=2hU0I3=+o65b2Icpeanw~J2Wai1 z;h~8MY&N0wVOSMGiy4J4ka$=Zu3B4+6>|PXXmslw-AhM6EZ*?56qd7i89Dd4i!ezKvTa^=qqBF6_FjKk zaPZjP_iY$aXfFF&hF$z$?H28tQl`_|a)nWBEI3uF`V+5^s`xgGc}KIgg`~a-$n;hN zajM}}7!ebgcJi8K{J#z1nYo&AFfZ6YC9e{oonV zg!dC|sORxW%@5k$PWQZ2)HCg)-L@aREiZCE^dQ%+PJ!HAGgz6To+b|MswVAF}#N~dyx27`>q$yu$ zp$=h0F$s6MXoJxog7K%xHy0}akq%1#BaH*uixZ25T2sHhJNomka6qwx)x?0(*d*1k zqe{$epXW|u1oADx`5X)7?nSd&uEMaIr13sv#nW83Hp?0G1PfoLp66Ev)H&^P474Q- z77U{lN$T?&b-pM@>w2E<*mjD;V>`1BJB17IuST>R)C_qRp!t#s5GP~n@%QQ*R}6eU z+nyFf_xn+PJ>D!G?kBpLDLRRwjr5U4k(aH%rvwmauAxHbe`QLQi$d8OyYbp(<)I{Oi}*4~J)a9jM%5^}3%trfC~TNmtS$;}~^ zYI>*La8xjT#^JqcIPb60qd6E5DL?CoJoI?8_A*urOI{FAHj4D@KfC69ZNq| zAC?RD*VVgdWy5e{TwgVRh~CFhk#1a7!djYn3K%-vkbhX}_5KiAiA1b~(A+8h@M#81 zZr--_z)5k=UxvB~m-gKH&=YQKRdzxZpq8t9nO)^!p*UOLGiW1K?Wu8&f{}JdaASI+ zX{2gOnHemGczG8;QRw#<`Si@xn_hTmLY!8RL~j)eF{1@rE!kV}Pjq!sba}dZ!-4<% z(mCkFRm)eV_oX(Wd#zl`wHz)JJLFA#>M+1gCFx59~4K3LNTEIElF*nFDS-TwTzQLt~urU@)& zZTw72%Ee2T=~6g{N3mb_*Hr{A2w>JLk*-X37kToQzGI#aR~b1}uRVfN!3u`IWuo20 zQY;ZmGS<}ixv}6$g=he?47x~AA6xKbGlIOb4SgjqT{Px$FZbRqYnMRRsgWvcxtD*D zP&i1~qkX4M`FR5P)|1Kj@i5hORNZIL9mEUA%99w+c=^H2KZNTC*O_Ty_eBWltoZIb!GFv1fW`RtI?G zKT)=1upcrd)7;|BKen8E<(L@RkLuI8?ZB8c$O&BwyA!%vAwN^MD1{HD$L83L21P5@ z-7^^xBVbDr9g!M39l~MOk8NU-E->GAO0xPX7ONl3ho$My4|Vivn$%wXP8Dps4S3Qt z$01?#*%(JQp80=qLbOH>&)rtQRX$ zDETrG#OrN^F?T3t}QGsVQ%6p ziR+YX*V9PtL8mITWfkJo_~yr^-^~emlaP@XoafEnozmWkNnxGjauli5>$R;W+6j}5 zvn<#vucgG2=`~|nS=0kjr&yI(rAPZr;`eibVtROIt~;8Qyi3`0kl)#`RW%A^T6ux1 zpRA*C>-xd@?L48miL&B!mLS>t&x^o0Gx8ea_MErqjDj-`EbenuTaorFaNsPYvWT*o z-MYl#7|fQ`rb?T$(vmm@vP^g~fOQJO)=mpiZ)zor&ajfsxvrlk=Z%q>Un7oO7FzC< z#P5s=VhLkh&QQf7A@jcbJ{mv7Nvm7o3z#Zb;oyvy9Ool%FPhpp>}N^g)^>u5YHe!w zl{!*#T!z9KL1nD_Ne>vZOmcY13^R^B7()32XL4Qc=&K;9QZ5dTtRHnT9q!JctAsw^ zb9Iwe`}7%$42cWOLY2NX*uy;)Vg@!FTWgnnmqYQ}lEDWe-$jAU`1#34uPt+q``% zJ6D>w?4lbdmtBph&wfnZ^B8G=0%s$3EE^mszo&eIAYFDR7)a&`rgF9H)4j!TizPUB zyo0*inAL=YVfz(^xw5rX@Jn>E&!f`^WDiQJ^N5GlNTNdS`WUq%o?J7i|}jWn#C0DI8S#ZZXW)28p)2ZvLE5fLIxE5o;~^MniD#=+xA=RtU3gHphpz z|J~F1UiK0?@(dwujFxt6p={!Jn0U+<#&?6&bA?skw4XmO zy6Cjx}o!yL9d8;&|aZFJ18hbnyho49@48OZtN3?KaD`EJP;@*PiYVV}c zCRXBWm=Sb6l}lRxn3T~77Y`(;K2lPmX1^6b1j3hLH~{>9eE#~`Khj(pj{&#ypAB#W z;NyR`0P+Jk_>1uPWOL%-ef*y-@ZtF2-;^hL{3qd`O#W}ln`3q)WOEEIV5Us>4?nI? zqA)DIE~PN_E-)?N`ixvNO)^^-U!gX9#!%ADNLT7cbKx+hGt&sXg(6En2id6YW^subobQlbS@ zs-!ChmwEZ2tl%>{pD}HVw}tqA!RZ#Pjx+5h?F+a)x-0Z{eWyW!p9LoP4lAv`@y_uA zh6VZR3L5Sd<6%`tZ@eqx%LAB8q4H~~GpsPdca&q7P?)GOn3h;J#h~LE$>8aF-k10I zinwfx?Aj_L&Prb*O9DAY|C@}*H1)37`pI`~YwOCvp7^y3Z)#Bs_N=h4=F`?=C*+C5 z)u}7<1Gyw8(VJMxukI#^IokW~635U7$}2V$jHXF`i(0<>~gF4?BkndNshqWzmYK+5JVn zN%|Un4ef;J$n1U(&39x~g6e-F=wW(O+O!H?L30goNU~`?*`%AxL$x)Seaakwy!=HN z#??FOpCx<5;yb<=Gllk}5{Q zg5}TYonc4FEdex_v1zC3+!X30G*DETOO*e;vwHW(jg=LeWmMyVKzvUEPs58}ZaCUEQorL%{tE z_*xqHgWhQM)q*k zYyni9!0BVmf-{H?4YL{<8nPTUoE2`;k`vWd1Y_RK*>$PD=oZB9@k7>E+8Alw+;sD3 z#(U!?97>Y~e6||N00%(pUm)ua1Wd#bU-hbS(pNW%h={Cs-E#i4+e@5n>c{)xO5)lE zkep%D(!?4f$zi?DQI7gmK#FyH+vkSB-McQX?W!(GR|gjJh2I5q{-iej(V-&;2T_QA zpFVvWOug$eoT673Z7(K@?jn}SvSEkTKMn=AuZrHrar)TUpcBVt&(s?UTS)6ua~#yl z1g1m&{4PWg8c6{>O2MgrPruCf<}rT-sn_54&;1qQ(V04}uCtC4soMzjD~b;MNO^}3 zNXwg-x(w=cG0NT71bhXZMH*^=4$X;qzqC@{en*VQ?M6u|lM6Tooz#tfEso`^(X>x4 zP;vlYw(a2*r5p&rA09W@z`sH%IzGXwp+b9vIpl-)@+l{|*EniyW3} z%oKY|ZP$%Xj?EKy@-i>-89n1}Z2BAoMfCKG zuS>Rnx$Fs(xytXMJiOPZFrh0lj&@rN^U$v`>sR-AS#bwcQ>9OPHKFHYLbY|@M{^J) z^lY!sAt!x*elGH+x}|v0v~#1@6>EJL2Yej*(01`b(;XG~PDQE^Fu1U1cd%O}Up;g` zn)Od&3l*PIyf+<$vTL6d$ef+p;=tmeDo)Ap4u?2Ag|OhTAL_v3 zb^PN1NW26ghuNXeW)7sFT{*IoIS4jS^3JJHx5re7pt%V`iR2cyU#vysI>LQ-4F~Ui zWBB(z#FVN|j^nUICDOF2GHV{t?eosjY1sQG4#6enJF*_-0;#N?xlanlxsPnV3I#mK zt$eY+C}ycJRg=*DhE)0PlyPnXJNe9q6pzs^<|@1nH^GqHWJOYW3o~S$*UviO9-H!` z;KJ^bHtRk1w^%mQ@ndh+dL-QTryd@p3u~4gv?O-M>o)!=DteKWfCQGU=bLBZTiRH& zg~!=hE9OlTHox_Fd#XOKS&JMOV5zLgWaK6=h-kKw#vzeMJqHcH0uzC0pi4R(E_Tzq zVDFQ#V+*tmv+=ZS57vh)TDe3PG}FbO>oV@ktmh@W^ISfON=+_9gl%JtmY2DL)u%f3 ze%MvJwdcYg$`YVX{093xk-T0emf)oNZl z{_`9;zlMnYgji?yEnH>mG~tU>-%CrKyb@`u#%XKT!rryJ6D#$mQ*|)o@kxDy7PM2B z$}R_#Ect3*h3)6!O+VE<5hH*6yitOog<4)mEXhAJ2N~Y^)CkRHhYB5L8z0`7(C*e< z4B?R5mgH6V&Y2IN5vugz9nhPfb7;ckRcr<&3`Kh8Mj_WuLz5Una1M8bQXtd9TnEj@ ziX1(IGoY~fcNYi_eP30ZS7YeBwKja(!I%*tSsm@z@cIp>>Dg-KFsj(G-~$leE8>J! z>0~tuY5g3rxD9!kc1p64licPpKV~Vn(lS_6&GOTv+YhHH(euh8M9aIl=lks8{pK_I z4JLK07Q5lp zXYw;bz4AY2CJ(uHgTq-oj?tVzsh1@P1MOT=Yr^)p9(L9L+D#rqXD4Zq=64s|ejDEs zpY&FZGZO4p$Lt$l8nr|_JIP~xV9aFm?C5jopyr_EN<(L1lf_#^9KjQ0UnO6i}(?>!A$890NlW@naCw=;%`Z1PO z&3~}!%%Iu@0%|A8Nu+8yKr{lu*IP!c#cs-(q3l(=ooAqwF4v*!$NoQ zG4>}2@8g?0eLXDVG6cV7Pt&X$IY)k}*rhIt;M*?7+Tg?l`JWHsK)mL^aI;O+5_4-D zM|S}e4{g`NNDP68u_ozFGQCqfHOzz81|?lr!c7niSm@$Zjp@>?0dz+;4dbKfWG#X~ zve*99mvIPk+jisFZ@Q%9Nr!)x6kAz#2eySrBpb{933LJ-fZ~q642l)6zz%ix6Q91 z2;=c#%U`KYpk`>TweOHLU92GKr?sBkcyp zH^HktVwhgqSI-H#(*q8{jW1BTP>L7JJVYUOPM4M;q0nyjR9mXBBvN(*zW2DvS9EX0yNGU0&)*-75aA z)C8B%Y1w2Ck8^Y)00hdPvfD`YDcxJ;>sr5;J*`t$dMQWKH{q=*ucL7am)td+6Xr7* zC&~%V)NLPBYBw=Q@JDFMTTRfCmCY{a{q(jzoO@c(IGc*gt*!sPVLLtd0y#{tp$Mpj z0buPjWb3S?@Vc>-i-D&t3(9`oDLuf6QdWVOs%V3L-VW=_1w*SP&Rfy-_dV+jW>Rer zH9Ev-Hy;BkOpBGZ*9nqF%mH9P$*^(q$w4Z+dX76;cJl=RMCRxWjlpw#y)U8)!tS-a zVX7PckDc+^O+9C9+6Q4FvrI#Y?vxgl(u3cW*QXJZ+flcOuJbOjc(X4S!Jd*nZ6y78v>rfFY297DTI=r$`M`M z7eL~QYpi73PNyA%Sk#_u>RhplV9r6s6-1dnnf7EbLGfsy?llLh>n4KRbBwQ6Cf(I5 z_X+5WeMksjP5Ai(CnK^^_qw*kYjrt8H81!}(_51HGJ9C`tZVDkk3iPQ+fUA`P+NIv zQl;XqCO?2@EV)mr&N*fjzo};%qlLDcclvv8{?;3+;D9E9z-X*6VfjDVp-}|mJasSQltw5;bl;`d4`ZuCZE}3Y^ z7Ury5Z}va9Hje?eaEIEB+CB0oP>U{4%KcRFZ+lv<6B#%$;ozD!5qx3-7z#9Z;b6j* zuA7AcU#Lh|#C8DMCzNmJzQ{yNVnUp7ut?N2iZVnU;S5vn$uh!AyEfwCpA zF>K0b`)H_WVKO3>CyYnK_eSq}?5$o}oP`W_IQ`5#lu+P0pL%CuVybJq4{m^SIB2yM zI;L)C5mttYeuo>e8` zkSlpzn#E7tAEbm$RVDE~-wrw4h*Xa!eyS%Qh!c zXCqFKtPs4~_hrde3(&3gd}n3(ryC5!r3)HWCghbeg9SuI(oAx^(~1{Tmr<5oR!%*G z%5M^LE{N{zj=5d0)NmnB`~G^>Sn}(>Z#!fB1lm66nFg+GOnK9Eh4bsRRmZ&uiWOcK zY=7Tm!g7zbqeG-ob(Q&L>sejmBHz(C?#-Pn$|pgi;lw`IZx#A=HN6i$ls?|eL0AfA zKUqN=7=NQLU5n#CO0cWC0BHWI9@LuHtLK28UTxlZ)~PFLWO}WfdCy>GPg1Qa{m0O|LWxrIJ%ILcaZI>|a3Biz2SM^n@I@k82wwAjFj^!c*4Y=1h%SopN z5G>rLpe^jZtYl$Uz2N9i9et{-4EqYJy)mYBwYnJw?-q!7v9yexpMT0z9?D))Ujl_} z^*!8OKD+kH^Y@>wY0%D)e5GEh0-*b+R){NBCzjZBkN%n5XuvI3KnNqZ8p3koYC@Iy z66DWd91D;yjxz!P?h2szA_PkDJT*S`LX!Yv1y8~LDS;_{=^?6 znVu!@$zn?{D_oz6omA-Rlqq+=N=;$?66f|4&|*6_AKjSjw9eDLnzJ5wDaPjm(AkV2 zKvFLt230cATJ2faO}K=Jh0eS%;_3;(@)zoEHfEfVo55Ge{?iF^nUBz%4su7uS% zPPG9viV;I0$s+r`*G9V^9J;LBrxSWT@#CjJJUqw>*=GNRYr?KOW9XHCcE>$UB&N~a z-tBi0zAJt;k)@3rmR#8v6zQMme-60}@HL!2Y(_~J#5k?f8`1*a%^8I>2-K7#CFan< z$7i_l6!-$+VIY=~a@ITcow#EAg9qU6y!+02ral^m+mgr#bbT53O?j27-FnGh+j`Y$ z&U3aZTU(KUPEm%P6mI(IQ_b_x$!wf}@G}AX!77LSzRbepgWBznoC>{h1wD)pHlUC` zgFtt|mG_jp2$R5=(5=Hum%b6}_}36TNL9Qiz}R@Wta;^PN?bG&w+do8Iw@;BHwat> zFFWa@av$*i@S`-kDD6ckDU$$}%{PtFk2&#q`l31uA1S{D&?+jwhC)K^keN=RD}+h` znIj%jXGN>6o%}l!XR_)YL&2&_m@kTOXmZxT)tW+f2()o>Cp5O`w7qc1v?{Oqx-FJUBxj7^}nat1lwly z8QF7QpNVRb&t5x!Uh&<)3ox}$eG-BcC@z*xbiX&-aE1r9u~qTX^04t6XTJd;tg!oD zi@b5bjt{uWYi9k>BzfLE4~J~vx)nfUg0a}~1XK&vTje(0rv-Xp&U<-;k=l&ZaM_t*Xw&D-&K{65ez!f6*p zda3NEDTQMg@s+9New~PnEWlw}{EoOyv27HhxdmP`aLt9ikEUut3S+M%tq@~g)sI;mDo7|D)yxf*TW6xn-+B*dam zk-A5_TpB`$J0+Z;;36!#zOt<@Hkd4~*#%qW6C2FgeXt}~%E!97y}D|qE7Z-tZmaVu)} zIi-T1exT!Tp2(nEdH2!~SSBFq*xq)qy#F<1PFp3qX|eA_CJB*?&e7%QoQRLv<$4QV zJS?DvB5d;P@E4M05k_r(HBNdce(RnU8ghE^hyv@{uS+HZ%*sr((3JMx^7NHXJ1ynS zs`+!Li-92oKo7b?j(Mx3?28tD;f$0+OqXQ9XB~4N3@vq@gU_47im??~cXo*4gR3|I zV<*L>)~5(IE=88TlVoR2bp55Y)UV&nlZ@RkGj%si@})uj zOPvMAuy*Q83)Oa3i5&=*vT^M9|Vvmp-*3yxgn=#Qe zttRp@%UjzZhJmraPaZJ1>MBt-Z{aik1tPo^fJ78ukOA90{VIPS=XTEW<=SE~O)FeG zPA8?Va3UvtVFavb+c??WZv7LzVjR!8TzMX#8w0_x^qE832#W_*9WB3Q`z1&~HmODe z)5MbNTNzgrz(4s38nRn=czbGD2G;zW`|TFDKTrRrO04)hG6dLueY zC%JOoe{9`8?7^YAfhJZ|Lk3xh$SmF72v^vG`=@K_arBZu)NBa>+9Y?@=snCE^HX>M z1^&W1XZ_#B2NiPsUeU;Q*(An=YcV6V5BEFEK`V9m??xaXqvWU5Yd9syJ};TLQpQdT7)jdXQiaAdB02NTN@~4^>S5AV4sr$#p2-ph z2$ze;p(jlpoC*9Ek$*^2vhy5xh@Y_K$H)Nd%;N354Bw7}>CS&U8U3E{EoiLA+ z0=TuOpDl)ia<;J@N~g0m@z|b;1dIIy%v^cj!peTjB>#TqMJj?L<(*^aytt3mH0i+K zyPNCyM#ea12gOi@WRip7yU+0xof|<8%Q|gzvzIQJav~*oUh6*^@6WKEzNdfx>ryS> zEwdcYsb84D;Usl04L!q0yLXYrpih~u6uDd8+Bv$R1@2sG9i7hOQ zNOjG*N9xMPGH~e==9REA-jV9Fmk^2ZKOfMphWt$yAp{NWIfg21M>f~Az&?7Omd%JR zjmQCo91g}a{WyEvw1m}Mgy6F^^?Ozp<*ESsuAko-?{_pZDaA>B<9(7vhW8t^*OwQN z}Q~FE=61J3??_EOde5Ha~Z~0@;)T zM#1^!u>>k;iA0&Ag$mpRwB}gWhgMLqM$!y%ym-WSZwFX-tt9cWg~{0K>Z|}@eYGj_ zjF)q8e9Py61JcDWLkm~$xigd+TRHRJ)CW{LKWLns-Px~!glMm7apKGpBe(a_%*d?~ zrN??n?r&mDL8aHe(_trWdckAj|$73)*KJkE`DLQMv3cz zSc!MdnC4nUJ6F;U;j+i;#)ZIoY>}exj&_-RPpzHa35-nNhJbs$0b#&fr3=}GFFp}q zi_XOFr$LS7vKpWoKLC+o03GKA^Svs9Dw975`VSTXachdHHI(m?fiz)UB1BIsR2nw= z-i5TUnym0PoCO#BW88K3wjPLl1nXn2qI*plP~=~Ct(4u+S9(0G=nlSiIVW-g<2SEE z>Dj|fLd+ojN3+L^>(!4;PZj9@@QO@KJY-adOWg)^5Nl%mwS#Tc#4Yp8^l$|7Y8 zNSzLf9D{mL7;`hdBzlrvSr9&WeqoYgvk(IBjLrl%f0Vrx9&1|08aUYA`bog@Z8nNG zvGrz&8LqDFLvwtP&FXK$cQd3YU-%@73V*ULUlir(L;<%94#gL69tPC2++tT16I&-l zFxRd#7|*tDV9HjVivJdumrj29DX7g*d+K~}h&Js+-2$*)YO+|Uzn)uh*#aPM3A3wQ zXD)A74iHFfnm%_a9Fvzg1ZyoXeQi%ZMqk9$$u}BRo2k$2Olkorjh(Kc)#rE8MH1aR z+1(!g?I!$|dR0UEpU37`$w%#u3j+E($ezM!uI0g=HlYU;sQ`EF3fMt&#lh`7h!Xbut^{+6J}Ru zXVwU_Gcz+Q!2g-))#<7A>B;r!>AC5N^{L7EN#Gh^8XsR6ADbT=n;#z^AHyx+aN}d6 zt7D@?{3sDON*F!7@%WL&k&)Svk&$ui3)!?C+b! z09VgK-{C#q*FE3ci|^?f{nI`D=TBcxPfs^+bxw424tI9`>FDT~{axAqd#J5#@b}?8 z@Vm9AwQ;(&wX5~lbaP8@b0em)vA3b2_t&rHpFf)$>IduV>+5O;(CGSKsDWD4SZ(DP zx&mKaj;k)iRh8kZfU*=PdFd@ znoy9CkPs7_@+C4UA|fgzEG;-RH8}KJaLBjN(6Hd(Pk|p}KLmdEfB)Iv-`^JzgFqm> zeWSd5zCe8n zlB&(q=a$OK%JPbDo;(9?i^tC_o<38PQ+O@&82sdkqMV$ZB*+v50zHy3ekf@uEiEnj zNdJMj-u;KV;^LC`#dL(lbi~BOL_|b{g@uKLgaiZx?%lh`$H#Z$#*OROuXA&AU%PgV zjg5_!mG$!F%NH+RWMX1EckUbm1H(W6{6j}acjnBQQ>RXyJbCiOi4(_<9|vUN!$k(4 zW5+xNm7hM*@fumd!_{=5Y4cP#Nigf>se4{Q@85@dsj_gK!nBwxY3DiKQcOFeIiP3% zD8k}`l9&8Hn${^ULT;BouSK3KxHY(58Qx`8dr;o34i~bmfI6&o=S|QZI5h+e!uK)k_e})3J?-s`0$*;)u@Qc^j z$OkoqXNqSK>kxhdx-MtV^vP3ZY2!Jv{kxk7SDB+ef41>jQB`~X{3F@o%~}FksG>&V zqs>(KFh16og)QpCq9zM7TMaI3UHYQB+K6NFIOSf8*egKHhKr{)i@c>hn|{l^E(J@W^1<>254U%&;1pmEFq`C-q18*Squ_-V_n+bZMCbqT@5r(%;n z_THgMmYN?;HXGC=D#2)4UP#AMI69=GzPh@)s>>Il{vEf>+miod4le(cnSZV)W98ir zNfvJg8$gPTb!}2vB1uhO%e!l|KiZtw&ZMwDP!9Yqmv6dEPdNF|ZGEJO`JD2D22n$C zg{RD|o|O})BptvHm|KuBXmKyi$Iu%I_iHC>^g>mbZ_FLAHzM)%eiv@AcKgom3D;PB zw7Kye0SmxIv3G`cx+QGJ;EJkS;vb4W6}wmh=9%NDOV}=2qb6m1ahoyk{qQh9o+pj| zPh!VG^qc2rX+K$Nk!fyec>#SjY6Iqc@T{^X*>_!)Ny#q$yGARUpgE7Wpy2R zz^@765I~LiuPF3Wslbfs8{C_D75On=no@M>tTGtw z_G0lf7TsZ(KT+vDcj1dJ6Ao_?dG-Myvz>o56@Qoq@!WlVUIBWegfM2tL(1%KSbm-F z8K<;aIC)F->6@-9rQ2+t`Hz=hZ{^J*#ID|$TN~rKv9uCaWqz4`A7svyRn>4t;n%)| z8AT$Z>(-5>_A?m4+VZAX&&_i>@5d<=DvMmztJxl@_r5)R(NI6?K0b1k^^8KN>rUo* zNZexN)%CgVq6SXYe{cmAB>A&}zsX**HDhr_>`FQBr2Wy`;&LxTpUnN*Uh~o1uif0H zn+WGUMbsPRlRg{RV;zQ_l;if3B6vr%(oXg~1i+d*w_Z8{&2#h)ZMg5mU0=2)w-fF? z3U8fcjjuA9s5^x#KS*K_x>&m(?oZKf6Ri^FE@~F3m(C6KJ}`L5)nR#s<19V@Pg6?I zLcYq@2Kp3Hlb3b73woS1IlJfI@ELUm*O2@ZZ%4r$Bi=M%l+^bd;X=I!=BYbP^A|-i zL90T&hCy^tXFg{-5*LnN;~Hm_M#{;TkKi5zHHvg^ukAq|WhjjPJQ{kkO08LQF zY((0R&FP44okY>vptq|KsveN8IOI9|#K`J7lrs78dBZ;K2hzLE^cix2Hd$M;*o=^k4uI z9X%%L13U%{02KdK^ZjieJ~+Jpec^v>0^K+MKK&nl`F{s=1Q@z)#$E1a-A@<>xa#Qy zt$l)6=RTL}rm|VJuPZ#aZhhKer0nN8T)}B*VubejD=aK;o@%o7b~(z0Ypz$a^{TIk zXEu3X!v*qsq#1ennQbSS?8=4MeEm#$^9+=~0q&!+5T>EK zQVnmmf7;V~&>zOpDiJ=Pn$8a~+pu$vM>{xK3oto113>)x~< zb27NHt<1#jyO^JxxK_#4*Weo6&fJD1EnP#Tx zya{v~EBnKVYmg=GF{iKCZGUuHBr|X#`iyxKnSX;9G zU9bKUyvBX2R)Ld&=zpo>CE{?}LS-+8syo?m4W?z)BaiGfBR+DmDf&cgO-(Pn*TlA# ze+pV#m8&EoO--(?ij_!0gH9A{dE@k=*^#MX6A&dPp+YQZT`WuP084iG%$e#hQ62OF zt>E>K(lW|X$`!VZugG8clsTFN{Z!bjcB8*Bgt@Vtkee|mq(En#hJ`ZlYOeIQ1(6D zUh4Ym*9q3MQ=rC;Q%yzpjb*0JcHFGqSHuON>QEuWgwg5_K3=EeM7<9%gQyx?`>*MK zeg7Pkmd8)cZeRO`3_y2@2@3~(83x_WHr3@GcviFYO4`y)F%fl8>i0fx1X`lp_A8?8kc=Lq!`t{=kmYAhVNASbOt@i<=7NksGNX2Jr zqWWm1pquA53$(c71Ddp#JpO&fP>vB-Ku`LZH}Vq?QA0#nPts0E#&$UNA;a1=WW6+X zrM1EC*)n&3O!!b%3VQa*m6bZ%vdDG!@CC)HaQmLbR|Am&`ZkUVr-mm;iF8m$I0z=w*p0^%zJQp7Fn0V97 zq$?NALi3o^?r3ABmF6#ZK6@squchbdipG6L?Y6YrBXf3X=$YX{f@z^8pE(xp_I*lC zmmmdRUq1hg4Kcx?tEXq>I&3+4alO34!w|Lfhh#Z*u_u~SMcnc86<>YV8{U&+%$C;o zHp=SxV>37fnMovtwv?C&Cv_A!N}^yHE$!O3HQ;Y{GD2g8`tFJ>1ec3}!O6udLsMM4 zk9DOPI)CpCgwQ=&S(hi-pw|uTtt)-z;!(oY8wR>=m>>~XKwV1gXe6aw8%y-ixLBSf zSLSDG)b@;A-e(ZIZ;bivr8^SL*fkPxj)i={qign~Qt_@TFwsZ{h=q@e!Whq})zLrTssb9-ZNSu9N zC`WKi{8XC!^c71zn-xu6*ev0dwvlq9B?cZ##XtH1-h*4Ho4E#fl?BRI@fsjKT6VXD z_21lnkM@}0a^Im*H5|!G`mIz72@@74)f`vh`Ozs^o%8^VS+HK;q{L{~i1-obZNi8h z%XkVYu`GnV5)1=TkE*as{9+_X?y$xt@+D-jRK#a zjvZ4F1G}{Y2=g*()|PAdpj^J{0>6+aIL3{b6=F%2^d`TG&3?{}u27g`TQA`ga}ZO8ZBM<5ZQ-K?WR%;M zeDh?~gcA!2QlJgXnsh47u9=JEf1Md@kp(VmON=1NMWThK_i!C?OuE}GPGsFJ_2a}v z?>H_F2;MM%J=U*i?mW`y(^sD7w5oAG+^+qiHePv^ge%HkoZd4-yfuldf9sN32XD%; zpaz70Hh%xZx+{||25J}4uUknm%%e_^=xjFxDr-&>D~rUa_^hHuZGl4fA56pz%UX8X z2~J4%W#>SD3V#SCo?&u6-_j+B!>I0HQjONFX-&7>UY}j&TlzThlxE=zBNY*alQr08 zKd6RnH+YV)JY{N-cTF7m=W=P2T?A7NYpCsh#(=E$tin zcl*NWJ=DHv-toDL8cncWmEojydc%rJ%@cJezAc5I>rHn3aE!PH>M)8wpv872nfKF% zHtou^TFBK&g00(iO}ev?+zK&vZ>dt}<=879rRUM}xKIk-CGRHeBpkOg(UJgeUX zb#afXx3*ZSWNL_83z&uU0E(Tr?W*ol#uTe$-nrD;rf+8Omk!cTagND1?#+(h#G6)z z)5*fxY90ND6ity?2nHybBir@uwt*!*c!+Q;r>@-Z4+Y*5(~XK=hXd4mbzBC%3}?{ltt zU|nH5L!0g%&ZOtWW>_29iOlLRxkbm;@1sFIQPsroo{4Pce^C) zCY0yZTrC=kWM?5Y*QPHK>z=u0q~R#LyV2{v)2vrsa9$5u#5@{fby$u`O!s|t^2 z*I!7K!B2r)12fV6w$D+cux5L@WKbPqWn%Hk&hE(5eFrIRc`%OD7PsoMd+UfgX5}5v zkwv@JHwML?aOGXKF1O~kaS$jKfbBmIMRu6aN^K@>cJZp>%Pk2(!s4ucw?5!wi|)YW z9ty+3dVPOB&+Rzi(ivh}@;$7YSh;c^5(NQG7lbvw(huX#we3E5VMcxK*1V%27t{Qy z)#P@COi%?!>(UsbiHQKoG;!w(Jt?JBgOFTr(!04&GC2dy`)Mj#M6zQ;UtS3(vKFO$ zC$-fUbQN9xorwN^%~jnzKcW3V2{SxT}ZPMC1Yz-i(x&H2$iK716yW>@aG;X~c{(oo|s zWpBswwylLtSrZI1O*&0%nreAlF}^eXUs?ih#=ifKgATq$drX0JrPFdYqgx^^3dOVQ zS1cQ-ZQIeu!#lkhNG~yw7x;1}!lEDilGQDAW%6AtlwxfQ`Z@#l-t_Sw|KnUQtVAZ| zY9mWO^?|6dUYR4@58y7yNSB;)p|OicssjN@U`N)fYH1|69E8x5{xG-4i)nUjOC;Oq zlqnNE=!CFbkw1O1lJzxg5`$3O(Jh^CRF&+a8<$eTU?Y+lR>_ucch=9$Ar4k?LrdEVw}9QL^P44RSXkxJFhFYH8GZC$+bsG z(eab{vqT^54eY$tu#oKuA>ZDMxqbZ*9 zPFj}fwFJcMpw&m5$dva!rSyUp_w6&gByCO)sxvFcQ@K`}^;5u0!F_`$U9W#HQn1lw zPM3U6CAQ+bY(d5BuT@-<=@l+Vn{LW;ju51NiVBCD93v?qHkYdjAFF#cYaaOv-(2~F zY?3k*>zkD{D#D+;wh?dXM1%>6>pO^_ABJOFtyp5)%C`m2g~_5M5?r9BdTBbA+cN%+ zd_VD0E}8=^b1}CUw_3|FZ#doWPy5}JC;8$8H+%9%n|>h14Z?8}G9LO7tmj1RLHCLE zSFv)LbQ&DX7x*L6&TqSrZ{Q!Jm~-HeIOM%lVozt%Hlvx()poM)1o`qNKU!_vgWw}{Bpo)+2C3JIc6DSxzE zJk^C2n`Z}_B$O;YRSiIQlnBiJ(txbj6XH3>XI6#z;}U1n^^&u%{zH0OhjROnTR!FY z!uY3+WZ#|X*!?=+Pi!Q9j=;C*+4lnbkkAXzh;y$sS!Oo3Jf?UDYFSII$F&Dw@4FJ2 zLSde@o+A@<`lXe1lum_jw-Nj)2VFL!7bnfW?c|MY@pG>pq_fJjU%~NRBWm$Qe}edg z;WmZtDH@zCxy*~G-OPer&iLa+*QTptVdbzY&w5_ORqg;2z|~~Rs&hxz_T(fNf6C8l zXx}}%4O0^wNvz+>?-p@JKHsH+mKdoxyHUmLZChNtq`-9U14W6qy{aY!HtKpASHMiV z;phmfc=p1v3s!rYl=;)8K{joJpgoW!15b9Y`kX})Xl z9WOEnn}JBAv+G8)I5-v}mznV>&J8PFr1%EE3SML#r`?1|4?nt21sbZj4)vc!|=~ z+t!#bu~Duo)3FL&)`ONQXfFepqEli=bb`VXPLL#fjOY|_u8XhBI{!_1==N0Mlm5E# z{nF^cI1yKF2BPQ6RPdE8-&Nj-A}J936e>jD+sw{(>E_C2Qh1i{AfiuNo{PmpT)OeA zjC5l%oQ=)JQ=t(K{i0XwMNdq5=;sKcz-!h=`@~%$W;40fkCU*BP*Q#Z;gdQ+`>h}j zV{RyTS3hy?=}MJ@ROG-en~%4#z^H#$Vr&=tDUu*vbjv~MnCp+otM9puBrXuU+pO7D zB30QL%crCIq6yji1h-J8EmH&R^pGi4lyqAE6Mc{j922ae}@ zUSlT`SVv_GmJA0GTc{UG&Vgrx`r8zb|-dn{DcVe^ZgwQ=*m|D7TrRL^F zouS-6M8+L)GZ3q_jC+5x#NyQKh#Kj*3zIDFWumr=+4P8P#gjGxt$U$!Vs1<t(6-i@AEAU?|VacICEN)9oONOAEf&eoULZr7x|I zn-;!uab<=cFa6Fz=_6Xhdb%7vk+7q6O^!5bpXA34aC@gS7@1{K_>j}F3{>>2>Y9DU zgKul*1HH_GbDfQlIS-|Tm~^e%_N4whbE0$&c*$HfEm{?3AbX46+lg)NxJw+&sl!e+ zQr(RpX!)?6e)>w2hh?zq~f&0=BY}vy^GUAX7)w+XIQSY?(JZ}hI!D0*Ulc^X!IXC zwmP1{S)j|#WDqX1p$@{DXuCaF)fOd=N!traM9(gp%%SgzubPA`_=flVf-gvPwKtdK zzZehDlC(Uh;yCil-{k<=7N%m+kvg6zE*usn$hr}V?3)w0S)Vy;V%A?W?xaDJV=3=C zIYs1x$yfObSzEtdCCoJH>hexFC8MP6IxM;RZTohSeX&(ob!`28B6^nT%%jmg#tG1~ zSHp0(%JoFs(<`}q&TE?HK3qiCEv^(;d8r(cb~mRs(v4V&(bm4{06317jzi}xVf;qX z+^P&roCOz7vF`Z3O@Tc&R8`#!xDyiNq>AY-6HAfy-u*Kf>GsK0Y!G@MhbX<5MR2tk z2v!K-%S{l*zA1!qT!peqHbL4%x~T$cP8X(kWeLa?nGu{T@#*Wy-jamC#*;l&(uln< z6nsE=eZRx5u1ES5aWELI{!P4N%&=0JmpA=oqMhH@8y8_uaI=P$XA&+Vj^p?oV^XlI zu}gXc%Z@DQo+xHL$N%o#yS-+Ot)^KRO{Nk3s@H2kazLpO0sqhXD~^>zltR(=k6kAv zr2BtN7x5IIXL*)_`SENIbu?XY*q~M4sdkuY?fuyMzf~w#|%q zx)Ooj%#`uplxR6Eyy`$+FLCt>vAnCkoXV}ny&oNyBzK=Ebi7T;u8hxP@&yjO(E#kk zSm|X9C~SUmWpL2AMLUU=G7r8+>X~V~ZOr&myHV*JwAP}5xtMLQ>d{SE($)%}>j2tz zf*6e-88NE1xrI_4Lz3d3!(Ev2E;GfpS6Tj~vQ-6Lxnh;D^SN%5^6OXqLAU#_!mcS- zO#Y`3>-lj;)%JVs8rPnmpLbhI_6{J!HJ6q+V>}E@%4ck7V}d8IR)Y$D+|QkBG?WYN zk~Dg$rR92yZ*ZS2m!EW*(CRltYSg!2WGt;nlq-5z^ut-R2YhO5RJ0uSD5*l|G47>w zOgw~;`fFxP0kK*?vtRl>fB9+m&anBCHp=Y^%9xudRok=P3dfp4{?IJ^p5XXc+t^Yl zl};=X>_n-=XU!wm`tYMG5oH6B8kuZRrq{FSu0dZWY5RLqDSer_oEM`22O&5=Bel3q z8r#M7>mmNi$2`RXckU5tHQiHQJ|#gn4zj2l<&F+c;paE3i;E!}3oF{G94$J_I z5W(cR^M{7&cQ1@$1-5E~Eb6mw6=7V&YUL2u)dZvsRJ&bgb4&+mU(3|QZh;de(r=vz zx<3c=fnD!vG{6PgN!eTI3RCr+s- z!1g9+eSlk2Edpe3gvD!-3dnEwS)1{L_0Pv_p-brWAar-j-TeMt9ph3ervSg@eiN9! z;NtWLnE#Ls%kJ6Z(53S@usE?udjh0^lHL=z#GRZ1yMGh(r^8jmIMI8< z2oyzE9n|I*a-|DnmCQL?F3>&_yt?0MF`$g0LbH~4kl460eBPKZNIEUZT(Oo62ELw` z>_f!f&Np@l%w)O`x)L$FHg#}YdzShY(V8Q_PTck5yZK}Lf_?&s{xJAK&6osTPl&ob zI;vSQ5V5$LR$0zD3yX%@Sy-?BA;pit`Q_q` zFUb_kiMZElpLT0I)<@1~s;B)e<+oAPDIf}Xb*t`gU=Ti}UYlOA%8}LDx4QH~*wOd2 znV2)T7XPKQfxJ%6vYi2&A?E@=umCe@?9QvDD(*g#jWuQ8Y6^z&)^!=7o>Uv1c4 zODG+DwL9(mZ@1I;h6^Ixg+W*f&l!aolYe`yel%Pty$1A7U473p1Ymv`&MXDkSXD4ssl!E!%sLz-*5FK;ss$IAe6@9sMh^0J8%6Xi}OjyErO!Dvv zUV$W0o=SnugT9*p;qN&9-E&7FHK&zY)_9xe1|dX+5_oq#@6}5;$EQtC0zp;1aSnd- zvwn8f^d)nL_)gpOp3mBOX<8dG!AB^m+-d7*#X>Ywr4TLviOyL)WwLkLlTLK{A z@3sbU&m~2fOMK7Q$l2@X&TU*+XXjPyhKGggLfq0$`O%88uC9FS1$wMGvo^@sd6@fP2r`v+S(=1 z1GFYlweFMhwWPL(kIF`*ktW2Z!z}geDb6mag#2#5)0uMhb32 zufXgTXy4Ci=jaF1OW(kDms@&EAEGlf=AKe7?y96FFaJ)wV?QA-`i|Mht2`86>+bQx zs5Uc*Gz$)R+H(J$rpiaM)J)#2sJGHvAS8Skmpv?jC@xR{jl+`pr~o3gz@Pv9q5ok7 z8E6ANN5%j0mtS-z>%hDsr-5)K5MllA1rS09+NS_((yunfY>DVE-OC>gdnCNQ#Hq>? z46Io4$Nwt+ISR1;r##d+{{Y+_d{}_nwje{&JxQXZ_sz(f9YNYFVp4qf4rJb2AHasv zL=3CEmSpW$B7Whl~Hj1!1rJM*c(viT?o)k1N?2&=vswB0Ynec^=RwSU&i|(_oLyH=rd{ zns<#%e15)Ze`%v_w6p7Q{0|+T-K+?e{#Q(9Xy0|ZRqyJmNA-j%ly@DeVQLmhr_}OW z-%4o>SLua3nr^$F)AM(Vl#%9?!tQ>4{hns~hhxn0W0iBsCk_X-RUs5G-H7^N_5j>P zx9RV55W;Cb8h2T8JSB(i5RXR{qrwqi_z&LAiP#_p*Qm9xs>H=!SDmEj0!jt`tFtZt zf-`S({@3Zn6Vp9k5zuXuVuhOL^!#H4>Jj{=9Ws!E^WitIXe#{vm~7l{{G|sW@z6tF zqwh7|ym>CL>36eQn+(Lx%H?@l!-cA^4@D1YblhiJ_KDuhnGJ9{$<5>7mPp&@s~cR> zhoj>6VA78oK3^`yaiWpP(W$Rb736=9{uT3f%o4Wg_p|FmATfO0M}2;RTes+;ZWsjJ zwKxd6r67Nw@-oQhPwuWX--Ez`Lxyphtu2>n_*`Z|tDoArKzZzRR{w|jnL|}qjc_3= zr122=2P>K2=7f-|3RCAv65gu-SE&nJR z>c>lZ9EAF-8<*7Ol;oR#!VS8Z9$YmCy{bJ6u)Q&)A|&c;V7cgV*rP5J`}?;9D}f+3 zpL69%(m~g&=LQYlbb-*M#f?+N&)ko)4k|~i0Ydy%`~Lb+DVQXyI(nu*F#D`d9M}6N~%H24|13E^iaf$iG@d&8ah{ zS#%mpz+`r^3-4bwk9~V6lE#jQ8=8x>^-!jQT)4OG@oAUOi+rvUhshfL=z)scy|1oT zGA-=lwJbX+t-0$z;s0)rz;t|EB(9#_H2n$xniZG?pmikU#tGQ7$&r_8J;pXG75z`Edkkv>h9WQ*@NJ^TFtp4#FXEok z%$M;TrCgsb#I2{A5Z!@R53`$aQ%9>Tmvt7fId^Ld;ui{0E>8U@XK1!|bwpJ-5diF5*G?X1E=fp>IZ=qtzbvuMo78 zvyBywoRb}k7hD!o7IN}9n|mm;jYS=;pSUJ1PG7-^$n{5o!y(BsyX8ww1P$4L4vnP= z+9emHA3k5tzWt-0^ub2!RE7Wha4YSlrKJ!GY=bClUh3Qi`A}r%1&^~^aKW_9tqFh+ z_P$*lF&kb=?eE4I(^ak;1m$`*9}-d;RsR&%SmsY@tWJB+M!UJUa=SGStDnULGDY%p zP3;{^`L2&eQU|Tx6y+j{y$Gff9U-6Ejgi@l>3vW-BwQsYUoKgSN~Rn?Gc>3sDdY%| zGyQS!YQ4u?d(cp9SK!497gKnz`@h8a2-`a;iTC6E-PYpwVM*`Wex;LpU&KG8HjYX^ zTe%V?k9JgEE>ruooLka{i%EHz#I&S@LG8n}Dp;uFyONMSFuO39ilYjX`ycg-IWU@mzV!*1o9-G-=3%hmieR^B4Pe#Bkq42NJ?D=q8M=C0RRv_IW+xL;m! zigfww)me!FD>WDB@A(%4;Fs4rEtZ^gYmw{bP)W)BZ*``+lxgC6sn_0VLfka|MwKo- zkXZz9L8TE6%8CTRH-nR6ZDrwm?qBEyilX0bEUIn~G*f&Ai=Re+;!iqXXERWVt{vu9?O7ci|UKA)MrqTnolsddgbw>*>XPwPBU9ZC)3O@dRCeY{0Fmjr@$-KP+4dK+nT4h zaxP-QbUmE|zM3&noEuBAL7e``p*!Lz3rDM>z41}L zrfxr^g?B157c?YM)iZvkAoH{+*Lu}m>SdDD?Lw{n{1{1Xnu)J=dTn0y!M(V)%`1XN zZ;Fi$D(PykbRuGtIR+7Ofxe~`F0s!qp;Vv6pRE_agRA}El}Gt(?osB~Qg2D9J4;CzsXx&xaa=ToPiseAlg zSZ)OzUsk2;ONzk4&Qbu(#h&Em0+HH5p{a{qlmuedOhLp$(=STLJj|+GGh}?CouN3s z6lIU1M&uaFqe^RzxpBxxW8Aq?wtGa4_1SuxvT-4XO>d(2+1t;6$Y`RI(X^YI%mANy z#i7`rCk}pqwJ&65iZ5(W8>_3UH$RawZPE>clrIr#oiM3LPgxWcq=yWmM8P=gmq+Jk znGJ41dbxOTiNsmm>veSt)3dXak5o|g{HyCaMQ!YSPn_n8xr_#O+W_yRkMFkZie^}1 zRbG~c4^jDY(o~U*9`_Y;e4&?K-Hl3_zgiN=Xlc{VRO`L9^5{;TYuNz#vaR+V&MI!r zmTlc%uj6bey0I)PabwGI zj+2$-(%uMZyVe)gxTr%|y8Im3rVWix$p^l^qTK+8(YOS#XI zc1}#+3h+ypDfulXAuEFm`V1~cwcbFQq4XIn^U8&@EXQ?MEj79Ok|<7LJ3$`nW>H89 zo62*DwTXttRy$IdJ5vZ@bFuleT&Uzx<}z?sl-RVQVCwmt6VPg5epeB$(5H)1Pw zPoqNyl*b`Nd=eKb9SmVT4T^wL%YOX$G5^j!89%kSu%plA!zRw7Wtq ziCm1EKRAE!g{vt$GQTI~O^W}8#eACd&F37nBXxUtKgCcmMXq=V&{B5gJ|@CR z_T|8!>PVb*<6p5*;)brcDGrQYBn;C#9xUSF(_yf^fhA2{+$v7QbqFR=ZtXN%c~2=GyJh=-Evv@7a7`sm5(o#+1vB=G!=Hr5zjtz{7_#CmmjQy54K(1k&jSI zjf-X8b7=ML?Shf-YOscAt)H^;AVpi1r(egjC!Lsi4%%(_H6q56{ZwSoP8}Qj!Xb-G zOWMhb@6cYSPf!pBLCG?MdbP$0iR_$6m*oU6Q>pO8?l~^7DHu%UJ;JTwCzW>|B# z%w*Rbb|U&OL@fg-E!6*}RD0)$`1Lzu)zu*w4L#r45zh5!G(!0yQdf2_*DK#ID}?O^ z@gza}JN&J({%8!x$kHDzE~{Vb-*%%W!@(-Ef&D5rjz&VBJ)aSYVRKov*vScE(4#z~%hGcBDJS?`aXZ!VVU%yyEiJvhhvr&8>8{*ezCU z@Q=_Za?F+VNV|k~PX^VlZuN0$2L8@eVd*+U&z*ZhLVLyrMFrs&{>LO>?ekNG7?@*N zkI+3(ot!MLXb!rD;-%TF9U0$P9cW$){M)iDpbN;4!WKimRg%`eZfp%#ESjB#x)f>8 zkrCn$mDSTkP;;&i-5|FxmZZ%O~lZlIVjd zC=YcmAF+1Q-5z5T?7@YbD`(eQYZOVvFNrye$E^8B`Gkmm^uF%^+qy+5yY4c+foiBN zpA65WC}sV)eVkZxTv(43v04aD1h z?I{+z@Rt%JZkQZWKe7=i)zLXGQ124Dv&Qxhsp7KIp~DVUzft|3^4Rfrch``VM#OAf zV&X+{5MxhP7Qw1j6I&l0cNtK8<#I^MBLL>nM-@fi4iCJC!!RuVKj;FvCmn2_rWCFB z{d>Apy1&L1K>N2*aE#P;@UWW71RT@>zCe&slu!}k!M|{UQI3XWer42h{O{RxIF;eB z4J4*!eew1_h|cogtI06Ps_ z#+lptKYyQf^HToL07FdpR{Y;7J98W34>s#*Zu^c$A07Y#@Zb;^5^E0(rlGMB0`KgT zZj+2J{!2usXM$8kt@8nOLpzfnT_=wL6F%_X_d3r+B zbAM+3C>jaw08KbheRp zQ_|gk*3Z-$GQykEnR+t5&DaXP(+GdE061-|=+C7L0m&_!f*ZN*CKC2= zt7qx^)y2+P-Y6LhDmX&?cSm$!6l_pc&9txk?zvc`v~Xw5x1`T`JwOtCy#7F%>GpnV zGUJ(FwfDt$Y)U=DS`?(=T?p3v9)VsiU6Vby>sw_gDd6A>q`H!u5z5}R+JGM*C6;tN z3|InOU`I=O+(nZ=#}VaKocb)M%>;=Zx>N6@C&Z1nV%II|EYdY%4~-L_bBtA(&%UW* zq4CxmS6i4r>6)_NEnOwQ=Bs5=x?VC-x7q}xU)7Yv28N8l?<%E*hN6Y;T#ooA>ol#Y zqF&PL8y68NT=rGS(KcsfVX2P;%DS3t?Ps?;CnZ5R^d52I=$feeUqa}nDjdhPdvUHe zigx6?3k65(C0(>6k=D_qNc!+Wed?c{`+ z)kI;5nP&w?^`dh%eO@AVdI(%zu8`h$MO(Y{xgm^|r9*X6#T6Lq^q&_F4&Ioiu+!BBKIw%7YI*`0ShSaBd3GFEbC>-zn6cX9F5 z1f`3$#9Qg=S>9`(ytCd+_!Sr!ITTZBimy4@*B(96sA{@5IcB1bf~TTKm&cvD^Ivwq zv3tL!%g53DNbV=_)i?|GeDMyux*s{cRM8d;hApP0?vLwdj0Ve3|ciV~E^Bgc*a*^baklZvd&sntZ7Gbv1V#FhLaT3D6mXo-;llqwkv zw#~A=N=*}kB_vWD87dV0% zS?!s26X=$T&GU-q()~~pGt|NTl`)Zw8+xO1OBD{7mzV&?4f_~h+z6!8g?J|{`kHnZpeOP{gGfjP0A%opv}Hdae838fOVU3rv3 zTk#e8eAj6l$zj0 z!M2YCTG#W=1G#TA0;mo!@Xm_i9mO^2yy(bBV7CsD7{bk^y-BALQ5#eXklJXE{Pl?o@3!%L)`~f zFp(`I0uOx5Vz4h0xhHP0Rw1?b21|`f=t%o!bFpm>Hie%tOGJLr2)(2{$9-ij_Pl%S zVJPc?ifC^pcc=JRMVIE-lKQ%nf31L6i1mz^ zJw~KXTDVM1&o}N0YqjmHQe8Z&nj3L0nme}ooS17-8)H}g3-%2OZ@~Bi_HD{>>^*iDq3Wa8acYLYJb;^xJI%bv zcHlciBkUqcmZhDX@;=(c8io2ghtu?(sk>LIXxny;Ttx?HOCa#&hLcmFDNC~14|}uu z$V@b}{sOnCm`d6N-7$%1{h?X5m!1><|;>!fFBBLUM2O~mGcGJlD z$D`6@R!v7wwaRT_(%0c&*l zS|^cROye--MhucSs}{2YudQ5*?slq|bFY%D2a-q`J$1{)xWbO2H*_QbHyP=&{Hjy| zQTKRKUv_8Ix!T)Zru8{CcXAxbS+l#k#&eShTuNU{y?apRVe88MAxbQip-*t3_9LM2j*S%nPr%JF$ z(N@y?x}&BQExx7Ylh`;-T8C*)KS?^eNlPydx=(#RCIij=ePXK%ohv+$=T*8*p6MbqntBg%5s|Tp6M>gvBDmKV`_>AEiP;{e^SE?)7MyNn%wu3 z!ZeqhjF(GrhVF##S;wq1e>1Y{*a*$KF;9H}14yq$UQg6C1R=w#ecJ}q7W0c5%HYH)P-%M_~zn2i^MFDN) z<&ue4mha`UK=s_*<7UfVIT>$s|E9~9P1qkT6D=oaW{5f=+j~CRIoM=Nm0`AqabrPt zJzq7=7p_6eDt6T7rTwYv>V3LJ7qHNu&k{fjgkTd%v~r{r@xe^Gw=I6&#SQLntH&? zL-ip8)N174zB^^o#28vRyDF3qs<=ot%+{+b&T|{6C)HTS+Fk2{-(Gl9wEG?i7Zw7o zK;7$WjTXhHsajIj;a-eq#f_h>TNAfs(}NZ_mR3dPnLatrJ|8wZ@++)BUTYKXphBG+ z0tsjU9Ro}8xOS=FkG)HbOf`6L>OJL#u14GxZ=TuGEtk?PZC*~zs;f|l$ zT?LOAE_Z%11hMU}qOJJpM~^hZ;AjyDUGEUR6KK5l3Fe9B=H|l@N6w-VLt%&o^oTcg zBhf5`HCD>k%lQR!>T{+~x?LjJO3=tDP-S5b*8V^Qm$WX*1F8 z^vZD55*fX4(f#!s!&gUFk=&pPk|?n-m;1trSAQpTa+d8$GfcC9TafZEMzeOKFaC{L zD8}~H&uzNp4I`v-fTPwXt;b!9;0gfz6s6}pj+-s-5F_-4lFIl)50pguBdslPGPsxRgv&gi?n1bQ@hk-rAy&D zc-}g2d7^t{q-=KeE{RMlz!!!7&U*?>v)nX+JW<(WH)Ld{|Z75r`weSO9bdM?Ex%%io0I9j#9 zdDZKS>fFBiv>}V?OlzfEQ;!C~ZX>M18sdrBI=&9k{Q27%k$O|<46OwvvguGyaF&5C zI#Aj$<-YqVC8>UqVez#={OCdWcs^cn*Z!@i6=*@73=T2^VYr;jWS?l6k71hON>Og* z04E}o#00G+rZ>OugDsrqrVkHxwO!J@1c1BdV|9Yh!?+k}1b$}C4_jvBgzxEFo4h0i z>KI7aVJw(6KgG2&V?NLw>M>fNKIGn4vk)*pI638>F}m6YyRYq!HjpJUNz{aYf_(XqJON%riZHW4jyO5NiLtiLCkKlnZE&^o21rvh!C?K zbRINH;Rp4$b13J~Rwg|zfZ&M>_#{H0?7B;{jfxA{k5P+5+gz<9AoD>h?4Bw?nlpi9 zb!Hme8YqPxm-(CDhp2d9yk@LCvQKX-M;&cJ@HW3g%u9QCj+zmfXc?VhB>2EvW{033)m=)Ef=Npd*%f? z7`(HKKHzq7z!J3{zOAMlt|o<68d5VgK#zrhhbsR_t7`gzUGOvErbk3|(zNkg0x4#m z5d#2cd89}G+9j=?(8Z5RHrrogZ!)FHD#fyN_~_WNsm~NchKXAV)th(G$@cxqT#K__$cz31eh-QgSrm1T={~sxx4uFPoFQU(^nqn zfBp;?jng|n@cHv+rSLvxOTgqpaDUv-53eHwp7;Yg6UXUr5ud@itgNi!Vd}*ud5oKC z&JT*@XvDL#rmXlpXQqUIY+MS=jQZI7d&^H#|G2^KXUFMGWlXWCo`C^x;sy{`V{Obg z43Z>Rc`A(dO+g;|^W|}Dj$_Sza~b;PD>Yzh1cU;RzB@mQgAR{sE}Bmr*5mXYULpG< zJsIwLD8jw$6h7HZS^!i*pRZYq?87-F>;mO7yH;pEMbeh?;Y9L`m$N<*gap7PeWr{r08% zK~k*?R?R^8+o}`XJ)p=j@G1&J^1SVgO&o!yKtIw7z2)gMB5GAzrG~1;uh3KXzW&+1 z&Ui3nJ7tVoiXN)orJB_1zl*);4E`XZ_CZ&R$P@KT> zH)$Z%1lSrxss_{ay+yyFk^Xnyop+$2DBu-K3fWoxADu>0>nbdDKA2@7+G+5uID#?I z{4Y4_E#uI7?Z5r=%EcckbdUt|>3XWAQpx?E(G*V&1?-#|Eb9v^saGBJOxQuT2(D>e zvleCjVPK($w*9$GPtwC@y@8!IQ)05&OF$Gc{75e_*zN9Ob~OR)-^Qoz}9%jA83@++y)}* z*bq|etA?WgA4Ksl$4c_+2C3o7gH}OX7ii@Wu3V!-Q?r!#RV$`>6{(uA^pDlX&A;hf zxw9d$SypY}Ml7_hpJmf>&rr)g7*lbA1SXu}yf5c+YmKqOWdP=heWtVZjdp@8Ke2O` zh$&trHf8tRm`E@oR|O!=Ag=`Ok0&d66V3IA@&Sf{lj3;G2dZv=5Z9i-N<<1%uDU;@ zevF7+@bMP;wh`KDu!A%UEbjC^JwRa{q|lR!q=y%)2~(jCK)qGpuw_Kwqp?Z>$mFys_R?Y%dLNsAn0+0jJNjB&@2rF7$NGe zbUNT*7`=Uudnao=0EB7q_Ww8DJ?4+PZtpnL@1TL(MLw-et!w~Az&5!E2Rq?!>tjS! z6{O|Cv@(r9iG^RP$kBiazkEpcNne+IwBDNask64%E(Njw%saKn+u0F6FxJrJTz9vAyEe3u3|~!prT!@J*l;c5 zO%_0a@V7IbnGa?T3H8rgSBsl-_GTpUJ?+R|&8#nf@5e`1v})F2C)Qc;J=!8JTFi;a z0KO7Nv)r;0TIdLUI7zRhm-KeERl$pBZJ{(^?rW}uSFjNeOB6r=PJqvJAc4lCM;L$?9&bg|kumD;1 z2ejus{L2UVf}Yut&pip75ht2Ho6I_$V^_fgpow^_WEJ6L-ssLDQD{}mPV?q?CLKT} z;~rh-=|#-pHX<}GU(y{TD0_Xffr_4?M;A-=r?k`=B-p;3KKiKWy#~kFc`KdKlSTfg zNgQytX`MgU)}PSm4Ga211!T>uH>og`aW#OX$eva=W(XIUWMsP7t|?Yf(ElvgP@B8> ztil2Yc=}u-+>d-C>CsEr{#Ez&qX)PHpt~D>x zIZhU>B;u5wW%-ZfRePb`EsXS1MB>kB;p?Nn|xspA)7d4Xm8{zKZ#0F%c~Ni&TlkX(w{A zc>+q(Nbo^1_VEBmJrYKD`*V@9Md8q!fsASs^pBezsV7mADkG5@OZ^g~BXeU@T^dsH z+FvU9va|V3;S~gp<8anrn^%lRdlC}I{c?ualru0gi;n(hbXn>q^ymA$233^XbX3yI zmoJ+xnHuSymc1MK7O5T!bgL9ml)wRIC?a3=QHEVtrhG9QLTVYPOtOlDa>HkLSl-gX zWD(x5!hhbzL8OKMf~Ohvk=#3JqF^JqpBR0MlV)=Bg4o($Bgkf$A(>>55RIC@@&?66 zuW_O(NfTK1%%vU?V#UFns1yd?&{b5#eC!2gXb!iX|F%uw-p~6-*ShHf)2r zzborXb8~BMHr6p;54Xr-b85GY+0?1U5{To4UZeXGSBs^jbz`hJc9G4^xmnTRim`Ka zsmA=dWZ%gVARep$O632-OrMKO-zTcRAe7Bf`_||j2KfY!;7^CLO z*B;uds5i-q2rnI{trXW@!J@Z}2dKd(O}v*5PjN}h-i_Txa}5k%W`5kfdu)$oz;lW@ zd1I4OQX;FCeni`YQT4>-?e2|~Y#HCAxjB1fVa6qH@s!(iLc7Kl*WmGKeq;dT$)pg{ zH65WK6kT5e-3`k4Fn3vlfEm2mfvUQ{%?k}IfZT%u>TV0)*h4#W(RCm5+%OeyG&|Jf z!pD`(q7MOl2jC^2Q2Qx#o^s$;sQhNZ*{0}`qigj5ccB5fT^fcf$|E$cDuXxNmY#YD zlyMx`lYwJ;cDd}nNg)_#{qSZLk!t;27p)KPA6PnD!wLxrX=m5$Ebq3`J@>D}=H(=Y z0bZbn|CTJV=NB9$=J7ce%*SyuSZS_mafOX@8R;mHXsfH6%vPfbX%}|K0V*M zu)8+OT=e(Y=T4-(^>^{q(f`G~5VLEy((l>dpGmsiFC(q@I*juu;Ad`LCe-q}3?B)- zd&VZVDe0{d*};7;1SW1>DPM8)eN$4~gshp=dkuJ0O2mpwdc;_2^-5yF#)X^L@8Pc7 z6sOsCvJUMPH}mK|YWQ}AJH{sP`oPfpfEi`4CCfL=mv5QmssF{kVBUE*UBZrFHUxf{ z4La{*6doA;e$R=Tp+i}3mV-fV`Ef;RNa7z?XWyFSN%+M9X%G4;kSNw%;2(YTy`xc2 zm*vS=J00CeQF}2C^@lAquiYd&o$Y{-?BlPvOA$V^;W~1D<8q>;R(|H{iAF|L?UU9c z0law}%#)5R$ZPB4rQd|>IXq@zxrjDa!Fxe-U<{FVRML#=aul!o4|Xjvp;N>2g=4A7 zUMNVs{v`tXB30LcsD7H1c!Ea2Ym$)bB&3RL;R5DOKHq(<|F|=Oj0t7 z@K_FN6Y;(Ahxu;8<7OHwi;E_{1v>IZ64hS(MwgmtFrU9UUkB z?Zv{Rg1IX|NZa>>b*3!jhb0F-KZyfo~T|aiS}@P4BZoCz+Q4hZ;Z^1iCoiAe{nT@=I%D!?ok( z7^3+t6wX5{GiNUTI!ar)6#N8t9L?<|Jx|E*B8_J$wb{QOR&Ft0OcWMJLm2s7O5xj(76pVfR$o?1bCi35G zu`gF`0Ce4uX0{g*?X!?LuxBuU5Bu`WNs+p~Cxi6vx>_7=)F^x9YEE&ne&0T*16_9j ztx~|n&CRU(`VIA$)h<-;c0M*hO)ENbD+7N|Uu4zBQ`65cX}5Q$f!jA{o>x1~J)knr zH=gy&?+l!dm;tcS_8DosJDNA!9Uby;HLH)q?Rm;s$$sn(wIi6XwtexEK7yJ7sV4xm zp8|NNlY?YDRB5`8D+*>cwUQWdelo4%+#IA2Xf%50;K`dl`5WzypF=3+Pb=VQZt)UP zEg6}+7jSiS`R{MCP4k_#`~E?3zie&RLXEKAz3{!gg&BQCM+?;O<9`8TQNo_P=$wiQ z1=|l{sY9(zM#gR}N8li&_eIPM&um7UeRAe2 z{D83o%s1gAb7*FYkAvevpyrp2cHF~e_AnJzD71VT5jcRJf$H9ZK+5}k@1l)P3cXq< zYiz6+<@ts>*~}j-er+Y33b1{Eapt1iMj+OPwJe2}BhQol+R!W;UbvNAa#u#`=oi3SwYNwJ z6UC3v6%BWG3==FI>rUJ@Sz|*9tiy%r>VI@a1w9X1-;%2*4PS)XW~3!nstX0K;_JcN zHx?_2q+1iq>+LIwhXR1tul4+ej5ml5>7^?uMYiAvZp_ELw2?j5HE{jHGfZ}2l{<|v za)@sn=QVe)$hx7>1`MUFlQ2pVT?@wy&_<({!~kXwt%j(DbsH`w!zde_JDK3^>5U7X4e>Va6?FMsZ%7RKre+FT#|=AVmhBZ; zj6-HCm@fxtVV)0+7mec(tb5dqwS$x*X6&xmkZ9+ewG>@y=*H;qt-Ggp16lMmN!Bbi zu%nrKiiUu~N5Lb$bB0#PbyXTfttnbGZ$6f5bMZ}?>|x=&fU(Byq@88C2;~24ob8=4 zN=+Olx{2bWk+Vt|`9l6NpAbzRsszHG17#lV3pqwL?q62Vs5q9Z1s14{v~qiVaW+xP z9}6%mHudnJt{5*Rc8xPfGAgIV9sP%Rig zr(_Ai4wFq?2AEOHqFbw{S8UrTNrN@#_HRyjek=B7(Lk+n?Xv*qF`fY>lG_U4NbNxn zxZ!H$Nf*E^Soeq!QkvlB*8uN9(;q8BGzn7FkXv(KuSXkc-28(cP&Y5Law6kKGqah! zF|ORDfw0B~{6kb~1I2Sld#S}vHDgJy0mBPSg{lBz=h$FRRu*FUeDTb&<&r<&}?jee*T#Hz}oxpVhqfDI}@}$ zJyAP15j6L1l!IBemgbB=4uEO>LRK72Bt0v&6$=}paI_E&=LJ@8Eh|Jqi!r(Cu7!0@ z+ZC|vaGE9zn6n<)1r5ZA|06#u`g1(h>T6C0a=r%Ml z8gj-hJ7w1P8y1^S^MILY>=fO@1^q#EI}k!7%?xZ!?Ko~uGx(%R`wY0QDn$)Qqv0C! zHvvym`cH{=)(I31k}>)*`Mk(>7z)otIN>vuH?sa~Vh=}Q0xUl_>{tP!;W173o4LF2 z^{)|D;Y*9xAqKE{u*$sw&7K#;o@?EY>^dI?KJU(%41#AIHVwlBsN4}!GYUt`hRzMJ zCX1?=vi(`Et4L_ZrQI~ToscMuywsx(Xpd#rmWyu0b-0-|W&R0GoD+FQt2j7hr2Z^s zAAAgWlqfq*<#Vfgx5Ns`&ytaEFHV~tr>AjbC%b>O+WBDZyfvc$qLp4#+FZ0f|8uqP z8{l2X(-erz6t0WOGTawyO8Z{0s6zvH2e8||dW9JR87OXg&{L~HkP}(7rXp9Cu4KTY zU$c=Rt;xor7iP?gaua7DFdpM=!F~83@c)CX#$EKCAv1I5Z+BNt1kv!bR^Nx!PEt17 zmD5P>A2++xR|*#S;6s8MmT0)^;93J#{+qXCsGq-KiG~%_L(Rw9)EZ?qX6vl%X~0d- zh4p&)zl)u&X%Qi2n5G!{Qe{1$y}26n*vyh4#=7cz>au9|vfi%=6wr@GL3w=N9) zMOrr#B}(#JxW8jR=*3w6%y6@K_>_2-$YVSGqVF3UXJSLN>dxmDKb$-3rn}1%N+LR@ zaxxmgbVDrJ)=SsQgQybGov6~D9q4L_BBteKDEpUC)M=?4{~2k7i6}AcND~`vJAN{t zTy25XX59*x17IWTuEQT<-A*B2=JU7cC74l=jP{UZ15UoNNb}PKT zgz&DiY@;<`4TF4*i^ZY#NobdgOtLulaA#Qh7WCK3X8s3LTuaU6PxfItcRxoxwpR^;u7*+^t5`>f6$s1ouuwX=T|5^c<^x7)3n%c_m6s z;mH#09zE;J+dk%(DF`5TW;Amj$&I{i9vX%r+O1`H6$47{d!4d#bpkS4CU6bXQ?32O z8!}oN6D^%Mw!M9qc2!u6-lA5L+&Uxsl687hijg^{`UXRkgMOZC*B(DBLvL-WEWiM^}t$rUDR)E?!k_$B%;6Zm&b39t&m|DOvohdH!!m z<6bZbX^P!)BAQGaw~-P~JXpt0PT_2bQ;869k=b)%`>hIr)}^_tV>%p_GO1H4LjGH; z7{S^2sg@zCRcJ7)LVP~fMXYHJlMT%f7mo?=hR@1Im!A=#=ekWX zA|M&-!dKvZbO1=a-)P;5ot*2vKT_DY{RJKrDeB2^qO9H1kq~ccn81Wf_?Di;ajCM^ zs6OhX7``qJ?U;fx-qbml?p$k=@uG*nk>p^TqDr&vH9?QHp|TYRa!G71GAJXOb=kj0 zr!zRT-C}D4C(eb5{q*~phZkx-7LAg4?%RRB%vqP;U9OTz1|-n3Ut9{@DltC4Y)kq0 zLDc0(a&&J-GJ-t}8nD}Nc6#rC@EJgtB(OcFfh1)MbMDmwde4>HSI0I@H2mB4KDgBN7tS z>`Yo#7%$dl$yTln8;3zG&|gTxCcv(>U)P`WF?Ho}ZxYO0L`?|JshlWt`kPwBRrc63 zYEGT1eLbae`BQMKOodI|@(c9XGnenh_cTH<13^odGKd&6b0pQFl|3bdZw9A~JIV6m zA6gx~K}Gv1noGBKZnb5YZT)_2Nk&u5@++T~=#aApHs1I9F7>ZO*;sbYfW(Dwq~G{JfoLegMv9lya4|9&N#$ZZIqDfVUzFO(tm8ok=I z>}e2`FtYk{zEw?oH-q$yO#9)}>o>Kka`Ke6zs!X1z^!Mqyn-m0)!52B$Q?&3blrUc z2*|Y9qz{)W;AH8_LK&+saz6XKEL|Q z0u>*ka|nMkZ0E_%=kB@3RQ}W&r+{;z_s_DCxeDGYG^`mDzFigP+QLve!fW^)1c1buMub-mL!1lH)0 z?%SDv%u=Y&J#%v>pJ%xk?MkVtDaf?pZ@;}N`rzU&cnS2lI6h9~xsYOkV#eG*jB`PN z6#MfF=_9YS5-O6Eu>*Bz0BllcZl%331#U6dv4CwM`$n>PV@cfj_LYCJ`U8EWkjGb_ z$lB?b1MlNAA?rcy8vX$n&SDJQ3 z$CcfU_Dya>T6(;}W3V>fa=Vq8e{hXwCimAA8;~C`(%8^L%-L439y+#Sfk$!!fw5n9 z+Nor5+vM1Mk()qNQ}gU` zGVeyli>zlB=BIEl#Nez&Pfz-B^TU1^<+?I&FVjJ>@#n*>QYZe}cwlX0jY`?@9qtF^ z*LM42&@zvz)UJAyJglt)%?mA+Kl9VcQ(F%^$#M`pVx~roS9c^GlyA26yH9?O;*=!o zEUKZGBqd!^s>MI0 zq*NEnAz~Iau5sj@y!>Yew*&(I)cBE0j`nWX-L5+nM;LT=$VzpMRJaaT78FbyNuv>= zVx6LPbjvT#>m=m!f4+d>u1QMD1C*$}kq=E25KdvuR`uZ86*~H^tl&QxUg2#w9*y68 zqw8P_X|&gp;Dq{;eRXof$I?x{kmg&r)5u2nY=mg_qm(i#=8Tq;RBY#WZb@BYC?Iy@ zw%NML=U4@oeAXaG$=f-QGtz)XmAXk~Dah|L*dwDv5I}I5L)p!fHfV970 z^+jZ*fQz=UbAO;kd-@*-9bn|x`!G-hm4l!AKal6+6+r|gi#HwB2ix1* z7aUH!V!fB=H?pJMkJ@_Bh*jKeEiFhJ`_$iI85hB!PK!n~R?Bzv6=2)HBB8t2%I-yu zc)ioCY7)-Py#hd>LU>MuuHSWwR)OBOKJQ!U*EQ|2oEMj;y40iyxR3y67VGEoD)`LM z2h+vPpN-sVV2(!Y*9$J49U;d9NeVCeX96b4Fd3II?Q}YBp|t0U!shYmt@bbN_PQ3!p`tQLhkv=? zWJ^!O{wBICOC5anoHY}H;B&T-{f;o)bV~HlAjW(7|5+!Oq1^HklkX8^;58yMP&6bx zWr%=!-2CeQ%5!S=ftQ!ozsG-5AzBYIW7WEj5rsO3Q`SG-69&a$JGUr77xLz6ABzzk zw~O?1Z~csN@_fTm0%4)W9XH%aHV5N(n$6omi(2+_ z!x_`^y7yrj5z^?y=4AZQRO^q{oN2%7PkD~$DJ7$Kld5}b1=O_xy2n~0_AEgc0sCU+iHR#Tv>qv9c-xKlX1Rc9@r`QXVohAq-k_d?sbEQ)Jt)Sn`gQUqFmIzU; zD#N_T@yvUlHT6JGZ%=rdPfq36OC8?j{du)Ve*b4lB59a#)p0!u2LUkFes@(+HDlk@ z94+th!yV_QPkmX}Sv+9wxR+GJz8l}5R&M95apBnB9AqneBiWCr1z5iwY{Ofx6gy3_u@idQzXM(Qe=eS9AZnGxP7(bLb zfYshbIlij-eXo~@ld4i(6GX#fBwqV&W>|nmm2^8px^hra%JiO;(mWYOMI|N0)cX)- zst>)V2NUItzud|H+mNWq%3sWT5VY9$kv8R$I8MJBCklrz*(Ea)&kqq}~xNj+C6*^l(v2oV|n8WqvLV>Z6)TN{~&$9(D54(ipIh%xO2MGpuw2BXJK z&%XnAXDXt)*86+YP!`WrwK5|Z4zw^NAai2~tS1)*Yj<1V)cz6o*_iEYJtQfuRSb?- zcMMToO^xpL0@jI|l5q}bFzd>s;VSGPQ?32c5c7k-=Y4DO`G&ac{=j61MImMdzf9T{6xWm7I-h&#dJT!0@1KM^^5Z|aJQA@26hPfbc2wtLiicm553|45hIVTJ57uT5)0Vm z4Q81Xp49DzzfY*n(6XrnO#@)j`_sV6V^7&>hTe0dw(g9&oWLowe^nCx1_Yn<0O>ql z`N;skZtEx4nxy`OOPvRT6?}|qfQZ!dg~^%fmdD?}3J|}(1VR)kqE6Qi;X{CEhtl`Q z8(YDIoo-wCu(q1g25&vDJ3xN7W&p`NEhcBj#SpnrI+{x800$TOsTIV(?F8aNKzcsJ z>o(^yaO#!Rr_u92haVRK^+>F3$ArEvP-LejUD9j|tQRp9eJQ{x=e4$1IDkc%xU1Q9 z2H3kN@%LDXta8_`c?55C?b55-(C>{mzeau+5ko%3BY;Z)G_{M(z3dem_ObHN@5RGS z0;lSHk-0ob*^GE0^ zt|Mu>cg>UvTf?hzs&H~|qihr!LjpF~zdf=L|%drGE{0S(K zy>8oTrF-2ubs{WAFX#;k-|6!;F!v6b1!xcghsxOJ`p>mJUECphvZmf10${f|X@=m1 zO%5s>bT`c>AyY(0RnM;5hh%J_Z@0x*NtI%Y*;=A>Y36@3$nAAk-9&D z%#WUP4&<#NLxAbfNB;kQ6`NW>VDzI|D8xL|Wz!J|8w wSC0>$wyDVY3rK|e|9}2p_Q09iUD1xncy@_N&?z8)>>u~F4DS}*dHmvk03|cC^#A|> diff --git a/website/assets/visubot/steps/step-build-pt.png b/website/assets/visubot/steps/step-build-pt.png deleted file mode 100644 index 82204417227d2fbdcf27af70d69aad06dc05f6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33673 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 diff --git a/website/assets/visubot/steps/step-drive.jpg b/website/assets/visubot/steps/step-drive.jpg deleted file mode 100644 index 7bd86567fa8768a818f78a830c1f59a4d9558c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52706 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 z zZ{+;4BmzN#CgQNVEq@^3ZYkB7aj)m$nlSao(G zOPxNeDwhZ*7!#*_wb{ul?X^}N$7E80xwO=d#2)?#mTcLV{c{FqY8)k&kDm%N9wnq& zvmjF=Cb9ju;&mEU3>Lk2&t5yPntKuFk#cAMEeV5)6Tus9*KI`o{%#3MirV2vtxJ==)|M`rRG5AUCbBl^-QcOKfYJ_ zsrV{@fdRk#O83>r2KCM-f8LN{bP;;fYMA$io;0d;;{=IGV(E+bebSOO=C0>8{;7jZSCI9Yc;iO{Ittn=!$jJ~j|+s@S9 zc}1814%D$~E9b6rWUv8h=2)+&JL`-dd$R8Fw#Inh^jh?R9$slo$W$VyRh&;lL;$zX zO{kGGe1g^HSH3~b*+!NRKYn%W7tla4oYM8*GofOaBSRwE-romaz8R0^we_1@doCk! zudC%f)!*8|-@5DHqQt*phayU(qWxP|^tbHrJr!-mzcou7Z`CjSOLKUUB0M^Y>Uw`^ zjr!tm5u+$YTmD;)NExRXMXV`OpzpW7$>+nv-+=jl*&hAi3T(UTMubw`%?_oy$Va*D z()=b$jt@SLK~{QVq`@(=&Pqy?j6)om=felkTsMtuxXWQqgF|Dh#5U)y?NmdJO>;|v zt^*3 zr(s)8lG-gHmGw+|vNX6jU7uSXBKJbbQd`+E29b$86=LD};L;Sms+{;8KP$^p+#u;v znnS&Y786E-sryZdDE%9Wp$kC%^6IQW_)LoO7l!wpsoBG6l-wwrHg~8n16R4lsh0kw zcX_h57N~N9zzaO)_Co^Vqh1i6AA<)J0HirBvKxJD+3@PWu$U)D{ zz5E86D(fFC@=Z0Z^jm@*?I9Bkl>_z}>05pR;p2CG=A7e%7Ezw-8Xf+Tr7O=BSD60> zoHDx@EHYT_aK-$w&$pOEjF#Ezj1ma&xfSoax6d@xV(^wcASDtkWYGtqkX0+w zAlAcRzVhN|{x>^TQkPT7D4YqndO;ZF5$BS(z7#U^38*HD;OYq;kQa}Qb4v=i?i_5u z1GS{zil(=~bQ)_p+2n}od{^lT`GYE^7`&1R<50Zm0BX)W$yS@_<#~ zCd9c{%*b?~f>z=%&`yKq&AJuP-Z(S|B(q~Rt}|jU4YewdO^`Skb9+irOjv6Ne>DCo zn|ou`C>Wu|t;CxC7)#)H&KNvmO*EC2XQs19_AOB3zvi#uq%q>=eY~;w^>8(%JiP%{$AQ*!)K#3}Mh#G_#{gK1 zZkyQL7=|B}V;gxvlib0c^U1g2QD_4#XSp-cZ`*G-gM#q2-uvvPYGScWJS9x4=l;UZ z`swb5l^d2Fip)~S?|5(M15(gU1#U% HiO9#`1=UX69JGg8RU7$J)Aq-)2okbX{5_U0d_ObSpn zajIE0Qv=aWN^6`FO%%U@-Kny%(!+I@jr`#=d3%9i7E#vk!-awjW_@+CgJ0)X|Q?xDB-UJ8-2uq6} zP)@8`qSvfLW^R1X2Z`NgfA$gpO6W3DMX`Z&k<}oe7ZVeeowb}%_O?i1`qKqVm><)& zh&XZ(vA_%!A@?uuyiY^a6SxD>_ftOLf5l4)&_Bkc1W_`yTDg{i(sNBbiM9Evq8QUB zV_OnpS#YHfd2Cu|A&a$qcoJgC8ZL9Fp3i1f6>rMXdZm1ND1{W;HwhX5`v@oa{|sNI zhA+lmzXh1XR3zlM3%OX8#zcdAL|EIw7!LV()#K>X7||}WUVki4&s#<&vPDDXEy*cDoT&>hW?k?7{(>uJQbsMkohDQ1-o*pp zV~mOB>(0>1&#Wo$nYKSgiLU4ZomIrikQRulLQg6UFykn|ikM5I5tmyL zcDGq_Mo_iy1VqUPVEY7#9h_|V4O}z|DfcaNga^g9^5f%5S5Ri=R0G5Za{R!Sp`XI_ zM`mYx+!gzPh^!= zSb)~tt0oj-m{DXXfj>uQZ@X=5-6WEr4)_Ie`~r;)T1!CMKyli1g4ra2z4-e)$=sf! z=eT!iv+Tz@4cGh0hFXgehT?^&CDjZ{Sf&W$Tk-u}Cknu}-UTyUcMhrKTr9Ln=x`~6 z$vCJcKGL98JG_s4vZIk(ZU}KosBbePL#lI*2(*_Ci3Ax_c+7*1k(aM=l&6i67>o&V zeT;o9@JJn}-UQ;mw#wW5)U9zo_7u1G~~pedSdtK*>{sqVzJP zmX8zgw3Ff6UN_E2HUEM80b3y-)bAGv{N-b?oEEMBieVSUL>HQ)kzsLE(qv7r<0=6; z`gvOAxNNv|kj?02ns*}QzEzAOHr#0iqWa5^(p|$wPZit7#@I|+bNUErCCu{e#~h}p z{M#|p1E@7z3;$rSR^fe8on;u&rNa;}zHaEhNzl6@qr`4KiHv`_=v0gN8m{G1n{>vd zRd_ad{*!9C#^IlkmH5XkR9wz?Wv)D`i|_wA@c*ZO*@Bvr>yns|%CieGKmWbZ?JwPD zRY-aQ8+^E)0t8MO@wr-l2@B!7ieKvr^7B^Vu^>k$|9Xyxc4ykMwKG-aXrJ50QC6!r z4Gp7nO$I>XW|#F|hKvhM>kf2D^s z{xLaKTV6NvOwdKquHr}KpxuU$Frq_3XrW=;M17#?P58xHb!=N1{|6_?6MM_A^HqTI zZHZq)gPBKvI2vW?plwNsUi&gKV4a^E1;TT13BF#Y$of{jOx#eS-phs`yeb6&0PrW# zF@DVbtHDymfuh~fwONC4+0nF*r?{_Pdt;B=TYR@X-J;(q&EgLJ5>!-1G;A?&3nNLG zD~8}&dByB;E|dvm>N&w%;Ww!1lu2SH8o12MjQk@>yj#T~cdpi(wG`{-vu2n?=My}# zv_XPH^r}wi4v&lb8U_Qa>?*9%?Obmsn0zz zSNgMbfo)~wLe?2l+68opPKfLlcgcM_Yp--!--pwZ zMnn6C^m}8-K)ZFNVAO)RZl~$0D<3iP^Oh|cxo_&+jhP-BDui{!+j9rYDp>7;ZwBYv zN^G!m-j^Mla^*@=i(IHp;xoTvH9XLeF^`F*+2?5)Zix)7mSIk!;eQVK7`!EL;d5KG z_$f`qLj#xi5(9jkyt__8oOA$=)BtC}q#T zt9$8Ne`)trJ{*uFiK{K%k>edTK{NmY++_>*JbZNE;ZhJRrV;SwhuF88zKJ%IA;AI5d? z+ykzAHTTk>wmzcqzPdZj%|jZMyZLZ!7|+i5wgq&X-jRVW7*q4CIs=+v0Or;p-XN=h zR02f6*oPuGdVU7!An>Js!R|fgK@sF((^ljLPz*{ z;Z5hpc`L&|8)CR22|JH5ZOnhU$=WhY+<56^jfym(?M!72=?9q}=hY#y!Q{%c z-1~cHV`w{#1pb6K1FGkQ)rL)5y(uL~h6=@PhJQQg@$xn36vzh&(3ZZx{OUi0pvA?E zmZ6K05Q%$DEs<1!|2+8r@$Am%_0YJ7m&AnC|NXH{S?7X^VNtp^B!QwBMMd+t?D&$bwdp1?=z z))|u2^ao~{CI-!hRprai40e?)PbxD6a&H7x3p+&lDXI<0i8!{9rm)cnCmcJ)pr;VA zvgcvg23KBbsS13PTv|p|M&HAX>H3*y1+bMV-?*(grOI}rC{s7n z@QR=lCQ3+0y*!RNG!gyv6X2tAPgULRHc#oj3vx_ zV}t5@2uQ#H)W%c?p;5A*0fb+zWCMG?^Gj#-=PY!#2k<$QySKhXF= z;jxxGz*&oK=%YEhw(mro$}!_Bx|~-gkAnw(UcMLf$c2mM4=S1u*Z<(Yr>uhD?yhFw ze8Zl7z=j_i6x`b0N^c_Dx~%AZzDF`x^u9epTu1(C*dXyZ5v(QkQBzPc<0G~_`=&A9zHFN2Hm5=~(u)Mq+%cOkkoI9$~TlL^$uBY~r_8{Vy%Ta4B zda+BG=&igVzab~Gd@{t>5ZgT2ncgYy?dTTZ?VANItt^xQr~Qa!aH6P_$a0kbT)H8H zj`YLK9hV(LQE_`K%&Ryi!+=nKV z4W?k`-vVt68lVFF;QbY+UKB~eLw@REC~4fXKwjj9nXAcg>}9WqkDa3@O+9Bt(;Gq3 zD#0FEm#ab65Gs=-Q&sU*i!@hJ^PZgW@F&7${7Qm-`eTYE15M#xre3O20qXhg{V(GAPlsYy)r+HF1mt2LJE%w+u3GFLJ zW$O7?VmA02Ib^u5tq#?w!2FpoeeF@T;E&Jo!Kg!a{~9UQ z^_8KFY1ik1AWbsCL^}yvV>rZ>4vOzeP&8QA!N(R%LW_Px!uvfiBXF<8+g$UtiyUGj zURVcGJly}R;%v5D$abP9>2qT7IscN3G)^1hiAnIo3N0)ou+f5Y^KD}eplK7iT51t{ z{dYliGI6EI!(W2eGvhrxdLizhOoXcXf!%;)K}3<9Y`TPMLUn>RIK_BJo)b8PAY)Q4 zHiknz5+{b{Nt+p7vEzH%Y{%}rq)w%2j)e|4!kf)_6|BCWboUZ*>xh?OkQ|<~iN8{g zM<=MT4$u0qhaCCCijotuC&q}UE><&tQGKc>b*|+!Qr$H$^qpT5;hT7lUuoBf4WrFG z@SFWrC4el~At4;OXMFHpg%*{0L!jZP?D(h-v`^>F&e1A;LfFEXF2$>Q7}zetnDQ6Z zwN65TMFMz!1VZj)ZXi$PW9@?zhgqyUy$c#L6ADaq6OHveCiF62{xQ^3<;NpoP#ULe zo24vp+jv|UtWP7~^Xu(_yK_aZYQDwF81J@JC*N(wsi9$?X__N8dN#$-&z!QDjKoS{ zf#z`(ay>t_G(TM#?od8o0>~BI6ih9)FVZfJL#=$<6OOV++YkfHex84=W8yGatqEB- zahfVA?q=@ZR{MYr^axyAOEDZXc9(dZGip8SV1V!n82^|BECEE<`rM4CqZ`&u0ZsSa zG=$d%q6ByZC1ve9_emZi%2h+etPP{AMdH>N0{Z_xZUNZ1D7y zF9r&xx;U})iD6wzS*M*@EKCFPg-z!9;fHiR%KJ+v!qYZX*m2RYq67!hp(ZT9m32PT z+k0G+oW@w!Jxq=_tz&up71`^lwxH_+j}{Ut0ulgh`V` zyBbyo}&8KVQkYRueF4H8ED{O4IY%PJ|U=m&wkN`el4b$75|o&nd)@$*Ez5 zm^5uUxVw{Jmtm$Cm0nhvtD5Lx3zFWk7SCc44awXpc42`9Ox2ju2|b)<47q7~55rq0>U02Jr(f%2g$)TgY=94`FX3F${T7SkD%j*?of-Y6+ zjTM<0)uAJ-y=C+zFFn2lZwOUo9+(va$n-;eG7yJP$P@+{jytO?Sd`JLd{ zMI)TN8u5BAP zai2^=z;euk8d+=K?L`UwPk{XAkr}{$CCJL$_I;b=&%dv4|8w-8{fo~Z0xnRDGv5C; zz)-*V-*p4q-(ia>Alx_g?5ZKve{6RzRI^GhPelwA%qb^xf7x~xaf_--#p7wp06-Wb zJ1<3G;vmA+pJq2d)=@aJoxFEWw{Uh4P8+v+W-498gixw9*|hb|5$Kf4{8Q()PmcI0 zEj8IV9}XjTWK3D|#uzDv-v*EhQD(_b6?*g2wL5I?)?@jlLHUr{iWqu^jM(JcFCWxA z-jDAcYW*TO+s@26p|I(_adr)_pftI;S}8tLjDb7#-bzIvGN++gmcoErJ5dXfjX0j7 z*pJb~)sZ03fMaWx-pzh|wUXJzXZQH$MnXPnimwY)vBJzL+${H8_&TR^(S~~L;EBH6DypXv!jR`8}CRuyG<@-iEK(2x!*1aSzA3z z!712lgtH|zmFGZ$Peqy|-kPG?={hW<4YcKfJC+qg7uRxTTJ!a0E#nCT+fRf=?&*AE zlG;xdmUUj??6qG%n_6_-vgcdbH>%dEj(>2}LZU%#KNbK&aL=6z!GALH?@Pk}qWU}x zk%Vu~UOe)u-sf7lVK6AApWmd%|EoDZf;r)d>&q$6b z<28315|)BRe(b%a-hNu_9N#T7{AtEO7{ylah~JlGBu?M>9EI%W?GxBb*YuIxM(yaD znKzw%KT#g!TOY5X3GmxFFLvCR>*Zy19oJr-baN}MavH|sv8>SSqqOyK>pcK8;Jh#) z6y&oY0-kF|_6CYt=5so2D-@2ZmX%Y=Wle!M)}ng5j<2ECs@N`Kiq_EN+fgs8@>UHSA1`w+$&LoOj0g9^-#5yCAx!ia-EtBm81i2`We$a$G**e-K%^X}WcLu~j(OZms0eh*>E^dE!N zzdQ~@eV`bH3TcqH`~D=TeFXH+*Z8X(?q;bGc;hnW9{R4S_X|5${N>iR#< zs4h!B;D4u?_vrmi{Qvrc6np2-#u;0&aA1d9Xu*r;V}?nc*{Qm^DVKU=W`>ZHPwzBu z(&df$g~!SHtkWJ_n})^N^DK{-F?08qbRzPamBci(&oj&NjE(hBJj9TO#BDG@qv|Z)+t8JfJxaXyP*(bjC@2j#Q9NQeD`MDcF1pV<>gq zv<0~BVZrHVOa;~^SqE_Nw50Cq@y`>n=SazR?!kI4Gj z9j`i6m7^+U`%wq-`8LPPGZuIJVwTP5W$n0o(&Uhgs;*Bz#bc`@Z}mkoqPF%+#=%L} zAl^lUo9QpAYG5mGFVxNi+vw$J*A z(F@Y*$G{}u9^3o=mU7)x!*elZDvzR@_y*MnZY!_>D3UdY= z%RaUkl6^Vymd6#z859@T7vs6S4Ec*5dk|PJA$!{A}`ZvvB56sz9YM3uWD437@s~g zyM#$H7Lwb4@Hw{@@D~*gT227PK0FqC8KD;6=s|Y>;WANS?zT;PBjp$!+ML|sw*ncp zzKJ4pvm<2`9_O2GU>56CEaplpQ<46LQ=xqI+)Z1qCCwlR+83f`B+UQ&CCHw2Kgtx& zvY2Pfy{mXo@vFPl(Rnk(bUI!dma=erbR>|VqI4I6Vv(dM~a!8 zFR%Ct{U}=((oW)U@nO8vfN>@sbD+p>2~pa)SyK)jN&3SM|V1%qb^oxJ?@$! z*9J>&)O7l8#@F!om7+UBsvX=C+)JtyXvSod({CT-J>_fB;4P$B%Hh)i$dC7e5u7FH zYwl%wQk-Qc@V!al&X?&dlH%rcG1BE=F{m-NnKuT;#24)%Hg|)Mkchco>2JI330hN$E_iZAG=@Hd+l_b46xS8 z(^@CT5I+p?&#gFiUg(utusVO_ND0sVpzz2Zn>nVxNfZiye8K%|?$_cBSksmH_TLwH zu1r17JC2FseaQQGJmP+=XxKwQyIZ0|ap$XWx=4{ak%y0jErG8;tN+GgIxVNCxgvq8 z#+6KZB7qcVpJBzkF%;S4Am3Vtc`pCTIo}W)dwVM2Bo_4f@kCO$VoLQ_B?E8f!Mb$G z+p*7iinQdFAbq#k`v^(NlY=Wz{m69MqUy)*slNXc>HnjDQ9$!Mrt@ADO+EE|l;(e2 z{@*(nzh2t7&dvtpT%%MWqUfSxs4kGGs1#@9Wy2|6a};HNHpgqK+xk>g+f>&CY41>G zG-jWK|Dd}5?z#n)W%>L6;7KS8)5a;}OZfWtNCiG(0;gbD?im0h#DALiE@zVqcNaWAZPPg=+JT zFa6L;(I!#sS>tJRdmc{5%isPiy*d!S3KZE^{Bx~UJusFaWYa7NbllmO@5zrxd?{5d z%s3Ni3OTJkQ44N8a#`Wah-`QnYpFpSfp#@8?8CwBX#`}fJL@#!zJ_)#rr1t;jvK7R zY#GnO%D#+5D*6|dM-N>AYurlGL3z~-Z%j%oCSsA)Zw2bbVoTB|j2hVa1yl5XHowy+ zmHJta$VgYnWKs%FoDWJyH-m(v+Y4Vf+vh_Nst$;w_&b$}M~CIR{w}ieidk(GE#`tz z>*%n8_HZOR$(UcB^Xe}zgrqR^sdl+` zY!?;9DuXHXq?hX%ep$~kvPG6djL2!QaBQ}6;_iS@>a3T83})FE^ehZGhFXoq#?^CZ zxFryBkaEiId;B;k!Q|fJk)K*O82vfX;>QS2xT5L&!@!^m&^_y7H%K9@3S69P6jX1i z*3K?#S6YBI(j3mu0{H-(LoCijAEt=>5WfWpj@B@YJhWzKx9+M*x2ap(Sgb0|I-8aW zspgRME=_StTY-I!LIW3AmFy&;xrkvY%mB<7+j4650^B4o>1wnsBx4aW|2p)s244~1 zuBgMSx%uZoj>AfvOr2Hwj!!vW<>1aa&EFwYiGLb-T)@C+TRGy?(M_bgg;_{a`V02@uLD9fWK0Dhm~PZuYGnT>;)E_ck$7zwNWycHnQfDWLm zqY>bXCPrd(;nfJi;v1nE=CF#ca{lHH)30p)XpU#2&)ZFPX?>6ZC42?`c@{^9=ERVEfwVPn;HEA2hZ+^^k-xb21xG(HvrNO zjoJfnWQ@zPowLs=gZ4VVSX5(oXFR5{st4au=%_t)+m#EW+lhRT%3Y5T_Rm8|p!_Jl zTF`RD5exs&j)JkVe&I&dyiASlk(J|ijqj+QUJ0e_MlmT$LP~;ep`9_~Nd6lHg=-hg z&YW&r)2a;@{#L!=)7f67H}rTxc}%8bHPF*aJKWcn{j6}Jyi(NcBZAS>>Pb9?iujqH08gM@x?N7lSS7rv%%z+$!^abCbgV{TWQeY zljj5ZD|sCfbjP0Z$p%;AIAAAC>#gp!I9u({Su}Ss9^36sm-fIdx1*!+9QuQl$Km4P zGG(v*UpCAZG?-emNU#fVDdt*G=Cf;pRR03u-}p)q=TklbW{I>vPTo^epe{8z{iLE0 z)z>DjeR-w$^8y#`ANQyp{ufKjUbvYW#q*py`#qKF`+v+~C@_NW8?OF5Z(ZWG6<+*{ z%70RupeDsqu5~C#aj!FQBW#a+G&84|R~t-Hwq|05vGF^toxJ%2xJgf+X|jABJD_zM z`NZc*@Q%tD2okBQRW^ebNK=q1LS?Br+1WZ*7{iGyPUvmLFT(20!0I!OlZXC3=g8oYp&rSAKDTu&PRQ7ot;$&FgftVH&?n# zdpPu`<0U+xrJ){L;>3y+xs9-)eP6Fn*v$=bi;ADS_AB1;;8=H9=5a}C%ZlvTC~xN^ znIng1aC>`oZdH_ArGEY;5G#=hb52aQC~9YYBpQ{Nn6Wb*bgj(rpr!Qa#+VQSuUdMA zco|Mlb^SfngB2S}38`tZ!T?NG(&lELm-Dmd-`rUrH z?mZ}Y#8c=C3)EgoJa1+b*Er>c5$@j zDl8%1tor@2IT9Y-^T`s93<$9D7OwEB%4i)j%UMbH3l1y2O!w}5AO{IQ z4U9XkH4mPLeV}h=q!YEo^519iv^>;xdc2-<2dESjVVF?Yyz`U;!c%3R@H7P+oJ#C1 zCBIg~r67qni(i+31-k!$>73~M^l>OJD}2##SPzzsrY3H(dYMQ3M4mh_9;dg+=}W{F zd{dkB4IDSrd80qL$q5OjCd}KHFnC^RdvJB&1Hz#;Pift&ASxYMH z*;`^I$%ifqGcCwjF*=D^eGo6DMOYzIT5@l|#1wq<0 z)Qa>W=BaTdy0c3!}ai6=`Z#g7Y(lH>q1wW-+07<019_`3~y>2!;4d8 zOjLyv;bwPpCX6~k<1QJS!kjeUC}w}VJ-h4XkYPLItCE71QK>Mx|sMhP&Io)mW3meBT!G(-Lgua~z`O1VryL>ef)i=bvC0?Fgo}E!O z(|5=3q!Ax$2s@{%aoxQ{k?E)=-&APk!Vdq7p9Ijx=LNpXAfSutqTd=gg8dQ9^DTGo zYOt)`cwKeMLGbOTIzu!AB%eywaGO|H8&rI6^=u%xzCPJC%yMd`Wp}uUePMTh-P70v zj^phC+n;LiV>-0j>m)^eFg**$7}a#pjwo1EMK2O03VQwfxAwDq(Tq-tr%aSuis%r~ zO0%Ma&YARfo5Hxq#q=E-SBFRo;zK|CG4Y)}yZ4p*0?)Yp`uJq0?*lm&A6Lust60Hm z&Q&w(^)D~9`#JNC`?VL#8o$h-@8V<8c0EmH>_bIZcTch(f9t3dr&O zyvfLlkUUXK6sWI<#k=fOrqB4YcTd?e>@gZfsh^pz-G6@macx{RVKaB*o^TodU@&13QFk4!(D~%dSBx^W}xm>esESkiAg0jHO%ojuHX# zyq~(Wgk?HBfOVJkGcCs`KB$E>bg!4d_SBC+daNE>q|O8$q?*eH{Q01rP_!>$9R(l@ z(@joz;9BJ=k&bz1?o7~>l);$Q+KJBv}SASYw42+Y&N#DF|5Rh;70Cx9Hw8xpW- zeWJBLZ!T#|5u|7oHO$V>kC)KNhtN+L8xED{Kk&2;)O!7$XjCb6TOJc{RQjy)BgL59 zyM4>3KgqyT#iI7x*SI9*K2hO!1%lJJyu`9Z_yw6ryhxjGN$ONL-&0)?{TSJ3V2XVv zzzfXPZpj7lQ%aHH))o3UzyY%1;(t-8szpeAa?T`IKgmK#7qFg--0xg+s8!#jY|hST z^LwZdoqN|)AO~J8JAaP*<3X%?e}HNgnHyup7PL-AuNIX`u;dI3V7&!T#XinQY#zJS z81?`g(vzfXU{EE{W1XytO87#*yAa*_h7A!@r`F6=Iov!*@K6LeppFXEnk(TII2-zO@Bj(RQwP_w zIH-wTzXT3mJ0$720NMFz%6tc zmgK%z!P#1bk+o-!{K16o#3Z?3Fxtcky;qP5b3!VrjgI&JcpwC#$3E~-!5=lq_a>G} zy{Rk>2M~lF@oJ02GJ>1p9gKm3OA)9M%o2+WByoN#Qgr>GrNq&7!*4|oE!}&ge$yoJ zfST7dpu1ZJRLC17@>w(9bEAE&_tk_RU5*(zNx*usG6nWdyET8$+ZHC|LFXyeR8i6= z+0vbwX$a60=PzSNGpkW_o_x=h6QOS_x!zi42Pz~5JfIl9yrCN)N5tGxttrndT~9Bs z&Q7PFB^eH*WIwk@maj@xlOL7jn%Gsza`!DqQY{LDRN|zR^(5xyw$x3uL z5{U(Xf+l2sEkhDa``#dMWO6r7S7Q|OqG(emQEaqlI3KI=_&ZvQ2%&n%A3eXZ5Kh{r`^I2{BG`t;ax>~kS{ z*Q2yRMKw_>FMdOTf0uXCGZ%8WX0&fROE96NQe=wL<=o$6GK! zO7?%D+bi048=k?O0EKI%ze{&&K-O~Vyo+`Qt>-1sN0pbHOuG4GZH^&9daKsN|pXQ@D-^t$pyw;NDjr=n8$Y9IKSTlS6q9tK5 zFqlQowwpd|DNr-ai5rc}Z9f)$*LY^yi(w*xSPq8o3F4SqH|3ydGV%;Aq>)twZINCq z!&={&da3mU*3qichGRtq1;rcnZmRQawbkk3f{yxx#1a&tYKijJmLq`N?7K>&`-u}%>b~{arvN_UCnJG8b zpTTR-<;yiSHCIRXSNnTAIQVCNq2Hz7O3ypofpKW>T28`SNY(mZ3zcz;4VwZVKGk^j zy`1t3gwXPKG;7jiN@qxKHx1@Kn8wNJ?;Uf#u$p&-T1Wyz`+~Qk?G$t|7mOsO^NaVQ zt>e?j(e+WF0f-?l-N0J5#~%>Cwj{!ETJZG@ruP zEP>2DmV$-8`C0I${Oz5eAkN4}-95vNnTM&KoJfd{Z{$jE?5z*|j-4T(Ul?CqJHJ~? z5X51pW8>_QS?&I6gSkDK5jtTh^R=*D)zRL!a7Vx>uq za;4R}s+{+wU7z`s(;r*W!Nl?$8oj1~FlrH4Q`P-@P3=DXW?v$9}kQ zq&BzctyVtva++SyV(mbPDA#0~X|Rcy=QKHoRw(9r)UttUR=ZV2yf?0)GvBQnPHdD) z_rW`xgzw+kdEx2qvT3tz?-zh5@15W8cIH6)!fWj$^;!KVH+(Z{Vyi#z)Tz{|dRiUY zDP5TRFxMsfbZcqJv&8};>x@xbXs6LJ(mWmF&90t#ey0qlRW4?9$`4keRnsoMN?PJd z*y1ZjGr2!{_0SyeDib8FTD#|pkSSKMG zjc7X(%~EXPsF{7L6P|TETcgBy!;`Ak&r<~%io#C$_M4~`JeYmw38&Z2Er5|~W1;Co z3<;y$a`Ra`fw5Z0`kHG^&nK2SV7KqDh^@)QjTICsva<9!Lg=wX-qEQ04VJ7y02IgV zcf${H?uZQE;K_P-S^FLscZ2Bb7Fnwdl-Oav^yYGT5Wf?RuJr44*1S$~ zzB8LqiuMz4cJ$Y1UYdt^c)O@adZ!Ny8@IE=z*hru|kO`htd9**6@w4ntPCn zLZ0yJ{8X{j>t3yaCE7;a7hL=!+@HMJmn0Tbg-E4+UX>mOBmMH`d?*}0h1DmiKbKKAwMFSg?ZV@F68cN0I^HLug zXRe+{dFL^xO2;PQ+(Dw$HbfHy01(|>>Y&#{6@3SFISO&xCRiHk5P3~>9%aCKxRS%8 zAH6@u9x23Zz89`9rhrJW0x)?oK!ILx`0dIPN_We;M%N2Qqowt7DF?uZfC}yW4AteD zTq?a$z{r8-D~1aNAgaHc!v5jqd1d7!Nb&UE0!G)NiQ14)SfG; z4z$5WirY|f=Ot*p$|#eBeD`-Mmo4ykC%5LcxVIPNqgPvu)*mgURL=7i2R|{0E%)}e zN|jhHh76mpqqLwpF>byJwQs2l(Z<~fw>o?b((&x@hczD&wG?8@skB4)l!s$ta$531;7@He}aYwD?W>Q%;=kMqGyo7d1=9mUZuSqS6Wtl>kjRp zB%)Q;4|XG)x9DWQ41EMCRHG{Ba-`kxwAJK%6l>9%=f}*5v{=sZ-3hxX=-VhWTnU{G z$!B@+iBoYzCf~C8*Q-0-JOZ7|#}z-!IVXRDEcL%+u*{fA>3*64c9*WMWbmj}k6^B2 z(5hmqT|Ur!H<$qUv8Io)UFe%7>mk{uma$*PZn`*@=zRS8jS4az$|y~Yk76+RPHpAw z6_)*=*w}E~nGYc&YGOiZJQQwar0uraxs?RhwH};`K3`pqj&`e!N;#RY+Q8USLZ(@AOAYV8|^z>rH zYIsI*F$&lDZf#)Dx!8tsZVNOjAt5u+l|HuM7O`QcZ&`==5+9Xy;k%p5FLH9Z^^ek$ zFGYW0S5(Y#t!sF7KfnW9{}T6l%dc*+FTD{or%@cFWnsJ-M` z882NZ%-?}n3eU1`k z)=LAI(mY%7V8%~!ce6I_N9FnW9l62eH|r@~&c&;(x*iA3{Jq`m%|AiZ)s{Ced2Y1* z*`j$*`Vd3myTPoOAe(q3X6{w)O^!6= z`qI5#I&-kNT1HGia2G`8GPXcjMfz21kh_t09ou&dJBAA90*iy!i-NiRYoysZrId`iZV#{MzaHg`L@(n$&slda8iJ-sb?D5dEHUgNxI z+MI>xPT!<|74L(LM2xSi+9TbD*l)3H2GW6(oA@ec+sgNi%hR*G^=KlygBDZA5a-U} zAc@|qy5QD*+WDMt{_`JxwOI0N=Kspkr$=h6=_THar+PznP3gB-Tp=Ku(||F(lfws; z*C^XwU4z^N@G$@367GL?`rf_YFRPSm=YW{!UOAa*mQ>Fgb3F!~8~!c7Kio4KHew+K zwUBV1B)oA;XwCE*gZ<5K#anm?0p%dc_nqgF*V5ErV~JB_GxP`ETN#_li7?X2id!N& z@sVPzxSSxJlSHTJ^%7^Q<6XSV8qCKoZZHJ>`(*OG=hd=cz7llQDrh=G(Z!$|tABSe zbwegi&~|o9c%Nwd6Qq*qr%%~SgN#I%(|Ye8-{uy&y3Ed@_`E~5`SwayXJ%Y5Tz3txx&V4j{vEDN8 z+EN>4(HXzuJ{@e35!z{Y_DMtLv^QGg@NuD@hEDveg|sZE@nL5h1FT6lPx=A7g<|9b z!-I;$Kt<&>?Be{7*toCT-@-~(Wio(c*`kjVlBCNy@A-UrKT%|)A2kOx=a-8`jCuC? zAG!uOhy-2u>T)nXU_L!qvMJMjr>C=Nv5N)JmU%LK8NhUsXBY}0I!r&AP%l=^@Y>d& zvuYd6EifTPu{v~ZLN&QL!M3&)3YL9N3Mi70c!pNKI%xXwZ-4A5CQ;0~R5ESkmCA{T z*Gsmc)y0ZjP9^r*wH@*OO_Pzm@$I~cYKm8Nui#HxR}aqBl?Q9Y@6$LBcP14YZ$-A> zq>77q>;Apws7$Y1rZpUU;|hv$o&TBXD_(I*@MXQH?;xRST2ho^rdYZKc!!O2tT;5AshioGETUY}-h^D^|tI&&g?U9d4-ifai$ssdvBsyUe=6De^9 zrZ-=uL?hBGe0r|Pj4^A8SaaRU%c-2ana;!d8rI4wviMZbSItomJ1!F=H(!x3zKL}+ z`J{q+5@v4H7pq`~pw^e&m@4}Tf)8wLRZOqe4gtM>?b%#{xfTVZg3jUn*>n7_7|GLV zKa`&)Q-{1(Z(}GmaG*778ek9%uC{4xeN7QM&f-YX^F3N)ExP$pCnFPu3V(|BNhOjO zbPGJ~4xeM#_b~ufh!pe7q((2XpoE=p#sw-u5*s=?`y6+UguE188*Az0QCpD)^rOf~ z$C6~lW6)vMWO-##U={}Axu)VjvtxzyH645P1>8Vur5r7z4O6`W<1!U_0pk7b-}*N$ zdEGYT)g77Siy~1MXh8qT_0KcQH#=|R&U>PS|2N+}=S%_3Q8LisD@d|2d{eXdUK^@W z<46B4ZS4&R)bV>p=dgP7^CaEH9#BB?bZg}|_(0*z7dGmmy@*KYdnxt(kEm%BX|%b} zInWW6zFL#^AwW_0+Y%1^B*7fd(IhK6Jq-x7FRHdjrMGGb&-otY>In2>4$$b5*JxF| zt|OuZQqq<0pXE5)E0Yv0Q#dVG?%UT6j(kgWe;QI@;4{czcn&L%dqB@^)ekPFkJii{+v8g4QLVAz5cSo6 z`-xPB-M3B+j%@o7S?vVTJ~8gCmi?%}JZ?InUm-Z{FqqmTppK{VeJmV0H&yG$=4+74 z!0)y7(y@e)GLpKFW8xesCG3yqubSV|(@H|!BnT$s*M>bGSZ7NPC4lRQee&OZe}c4% zjT&Oi1yrGd!Fy_jKa5hnc0KrT22MWPB4v%Y@r;s;+tTNo6N;xlHs(s_eZQc%Yhvh} zQF@o@z}F+@JydJ8!N4(~wKlkyR9`wlaxydS*}!j&NI`J>!R7FUU4g48kL4+?bw@UVmQCIxQO6xpwJVY`RhYDMk}k4V=fQ!Y49%0z<*2 zq2gkhn#47o(z8_9>8P9u)!4-598ya0PLnu6xXW2Kskt+XiJGGJDpV!?@`z_A?uFoo zhc!>z7zA6Z1!sap)~R)Q8%@VfF?mYLJTOyfYpBw2s`hK1vDfVRB|*jwC&?rLbF*gh zdu;ouwXrfH&1;%&V`H#8;@%5#l7)+m3hq_uV3SvJzX?^zM`K>@4&-MjUx`|vm=$YyvpHl- z-I+8ng8n3v(Mp}|Ru`YToc!pJLzBh;L`M71N1ng)B@C(atPvKW>yUA&Xt=6P(3{fgih!Ls}5Qsx1dBt$Uf#i#*|s{u`y zv|@>+T1;{s%k@7&`I|N~``gos&bgy{$d#8j-BCfyQJc&FAosS6jQ%PK)(-oavOc$H zHNcYBBAVPb)LHA~@Do(@;wH7-3I7RBI-?(*S5}0J4fV8xQ}qre(bMV-O&KOuE?OHl zdXAc1sf(p8LbB%D^)ve)Qg7t# zr*-olFg*|7grdxMo~LTEPsO@x+%!Me@>IR>O5ot=!_zN_T-aN@(d|m$D+LzO)`e11 zCHo?ycW6=r&yjNM&^HN?FSOP8DTMCD%T{^cl^}s;=v1nzF2U zM5fqEJi`g>Cyy?|qNR(SR%WZQ(N7Zd%sw#)*H+^o3Bg5`nBAK0ac_Ma78$_~{)oGW z&X&8*Hr1sIlI&ZnWp42+9@3^$meFb{{_?VUOUo#3EB&Lo*?~rOlt-?Av9f4k)N6J% z!e}lcRB8-Q!KfCm*;XpxadyadD1h{(spV^UM^_i#Rti;Di}wWN|6Lka;bKFHjaIw* zwG&{^q7_QrdUUTg#X zxqjl!AL-J2F+b&ak&Y1ohH~G1VdAnw9^s2zgcIEvE22a`#j;6+OxzoMnRQ_#jCU@X zSM#Agb;CUNs~~zjOdM{RYw*Cs@yBXGUpj~0VAV`@V*`56_0eV<>yNF1oIgbWS?G=mg8zt3hPDz;Gxn8 zElQ!QpJHvb?8;Y}tM}+X)WkpLU}JVS(ppX_-*wsbDlL1bJ@IXdCc1={-mm==KM(<$M{`&S*jf9PrDACl95f>5(WMB7^~CWcDgB;;+=slb1N^34cvE00 z?wQC~xYXTFqq1vbm7Bt3ULM~gG55~>o{FrDBqqz|HHa%+KR1rk zvCNOfHtOu&&i0j!Jg!HI5#uiF(T7OqL?^YON5T}mmeA_+g$ z+fX$0w(T0(iw-rBS0$w{=vWSgx(dw)I8L=z!k1$WmXDk?o2x8n?YG^<>1`c0Gz@PR zRneP^$t1-VuNQ~wv{aWW>-cnz1PvKR0Ty;rZE7hl7cxik9cY= zPc9;N^S)H!*-iEOjPups$!cEgQ*Gfi`4EKpCh4)(UZR)HH73_KSUJu=3D*$8_)7S_ z3o5kVOzv9(IHr6)%=>7Wtf~>RoR{zP%4n^0=MuIhU4YLC$2$)13ftxz&49O9GufTQ z8{H-}!nH1eMSP3}Rcp+t4b3?p9O^Fkyb7eZzkOce{(M6=yl0=q<*w6I=zOk;WgV}n zZHD?r>xDF~vE>HFNN;Ho%XGgfBv;fN<2UHbsc_?`Hn_}C^=OG*N)0+>2Y=S3t8?EK z&fJ*w_>2%l3en)`E;rB^-=_&b|BTax?#2})SM3Fp=~(Za#fDTtMf3DBI!Jg)6H8hI zbRHp;BcMHM$=nO9VVcj2XJGh}n#YWHr@J<}zV~LplrKV~Z~`|P3<%}?%F*Yf2Qgf6 z;Th77EE%`SmT`B%Nt3JoS1Sc?yZ4HJ37%Q^Th^2_53`v33A>!vz<^q_(i=vewSM zMp+pHiH%%Us+$knVfVJAGgSGHg#C|Ns&G3@EtPIoI=hY%q{*sj1KRb{7YPxaxMim{ zIaw4&Hu>#nBJMsR`VQ!nUxA?6<2dmrF9Uj}>?+x!4@-S(?O1%> z11G3Wg4+&<={OQhx+?>_s+=5jTVED3s?5Q7`sW;`d(!}jilDp4(L|4nk_L|flsM&D z8b|SKDIccyCS@^S_}-Zt*@iBuU>j5v0f4vfOD>mve1do?cf&p(*L%VJqEUluGwus{ zmGN>BUj|F7-#O@FdD!9N!v(L(Z(rhb6W)CCU=A!bmsEt39F%KAnMx5>oG}C@6)PU` znchpeJwX|0wP$RyMAKwl=F;T=xJD_@@XY!^aq*YNLoYwi4AeLeR}0-3kxFbvVcV=3 zZ)c^d?>I20%0p@nKjM4G--oes&C6v)h_U)+ro9!aDt*#jRZIK^aV;(C;Q@oOS(^$m zI2bUJSVEtsnF*k$JX?~{2+~w)C^K4B*j&}rL@O5&0H3PDC_+5}m3OctyV_2GrkcBa)wD zD=tiIWe)!(7J{K=ingK0YhE*=Kt`%u`z^sKV?aCtl6zl`=-T~i@0Eb}#vl?q6U@F_ zZF0_Mj?1Tr4q?ouoOrc;3&JcI&)I)dnB*~$!mBw=o=!I zfo2R1-qnuYwFjTY8zcFI!Uq-LscmjnJrCR)5a~?&`&AQFg5K1#(`GndxPZ72yXxyf z`R`+9S9(@QqU=jN?JRP1uzdBc9H-W#NX@HPgPjLtG6jr;d^+YOrd2GtOcHCGZ3P;v z$BJP{bjQNBtQL*r7uN5)-_bLwx$PYrl2>9cxGoy1EXLAy^UIa4UHC@C z(o0fZ&ZdINybguxj1LHWr4EL?PNQNLH8)dN2Ne>TGNNP~?E1X5?Kz{;D}sMeUtjII z*k|gQQoZl~VZlN{JzwfwU*`0Y*S4#9`xGh7Nh@tbZG?rRl3%`Q)oe!GU{#=+gtXHq zc&TO(3RK1TZjEnd$^d)b-&?XDR84DLK59uGuGq{Gv5lTSeik1AbJL9HI@KR|`Ojtr zC8lUDEoiegSi^uF0yM}L*z7ap6u|*x< zd;pNW!r2x1_;vYuz=E~fDlOlh(9PaKgb*LzC~n43wf!%fUw>0OAiA~}Wo+ac zFF{Iw>-%q>De67>_)~zT$gfKo0X=x~8#LMD^WSbnUikY|WPH_1qzpva-`Gyl6W3(c zuY8FE4|3;t^mlAIjTvH@qY;_;Ytb_@t1g6u)j^{CGaL5ZZHylFy|j$`Ylb%mw^7qm zuZc~?%0Ea1285|}I!bHNNua;OLob>w^JQ9>)~3YHr}mtF6a*UbE0c4&%O;01Y+em2 zvuA$2<4vnAzsbfV%GJAifg!5ePbHm|_m-T8+Ns)A@54}W@blb}8+Ax?wQ<)4o!X^l zgQF&W@SPioj=rZF!e4MtKlG>%J5Cjkt-TVftU_Y?hUCl0RVB-+aB4r13aE zi>fEm(qB^>HtM@0BWq%>8&+6!*Id$gV_|6Kp}#Y8R+aMSqaMp{X-SElafnWYQ9E?- zvTm>Xd4GqbG($J6x>DcC?2qEACDXh15zJUpvk{k^ziNmo?c|+CVwZSg)DK0gW_v#G z6w!Y9#;if`71)5gsTn5p<)52rZiZ%!iMl%%`NTFxeg0G_v}&)q4NRDTy)tFi{3as|I66Rja9ll-@`W`ng3Z4 z{?Tks7u1-C3ei*4y?WEijHctw(>o1*sPsqZe{?sERi5;cC)ZE{q(lD!0h=o1DLaD6 zs9r&e-`3`}d>^RZ#S07;nVoklSkyjUFQN2L@;M(@FeVrxk}H=uCwdW<^BMAs-l|<& z6>qf-ANTEt_wJK_UbV``?gk7W z-Nr$Nap(P)l9_O!@m=u_-#=B4FX)4L`lpnE(-{m{&zT&5IVViq$-c)&Zw!0jI$+XZ zt8T`0^;=`Z2-b!jF6uwcJXUz7VL~_5Iw4@-VLYHGMy>?9_#_L%ya_S7s2OgI! zXNe7dC2yY0VOKNh+jJGg9H+?>@O%1riK>{WwE?GuTO)X`fvBZdXNK^3UgHO`+}p_l zeTIdO9-kqv0b9VPeoRRy+(l*nh9xj@e0u%Bu+X5{*i~9Vvxf=g6jM^%8!)ydwfQ~a zsASzXMx1|hA){X{<$En9Us_l2O!kz?dBn6tHIWzZ8XMuWDYN+UCE4~wbGbYzdDgPy zu6Tsi39Cx|hur4(=0L|Q`N1rjv9kpb#lTx6#{tFxQ{87N&=SUdqTSPZ#V z1%6^7FjQcKJlXfnR~1+5?*(8)E(`uO=l^*x618uosuzCfb4nB&VFMTGcMvm=8YAy4 ztk$-*RIim$zu=)*}; z0w1_#;hh6r!cUNOs$@cW(RwYj+nn=^Rgc|%YNV)mK(2EzqQUea#kVJKLZYUMAmm^& zJ4M1v$;ovstQl96Ocj`)q8swq2Kw~!eaGf$rS+y zk0*KZC*pb|>JaiD0gJU`xeVU$0UTos&-V*#>x^G6-Xh`InO!ybgf0lsjG;61dm@BY z{42FKiZUELbMUZbaEDp$-r1&_PRLy)JZhh1p|4gX%I&#SO;Jq5bhE zXtZ0g?{fpgoo{az)iybf3u_)v(3WfLyb8oSq^_&tyaBbv%@p>x>*)lGw-$^I>oSg|gE8 z(RBV#ce*ii@KD8NBb8fNawR}(+zn{toxeA78c=NA(TT%#@hN~>1OR@J1EF_9K)_V+ zk3@Edq+_&pMhX(&!3PNeW#7$>e{n`^^?-iLegN2h6l?3GSVe9LHekrq!TC)mT)`PC zEDQNF3!qoqz{p~#(wX`GlB75X%nfH@1GqYZmxj^^Cly{vgXf0B>weCDAq%&$}GE=2tDCSF0 zW^z-TJ*@$O7U`sbE_w3) z4$%tNi|a&v9qrT=Ki7EcwdnptyBq4pNTDa%5$RvNjwgE9_@eajBrRzPgPlZ(cGy}8 zgB_G7bog*zsPuAj&y{dB zUAmM-R9v0UTDCwBAJPNux_gsjk9Q=r84!We0U}V?y;er)t5m)soEO-yuFLacx%f1!Pow|9@@y zq!ExK`>vIx_MK~JIMLYr&xwkMHD~16h^^*@moM{vW7j#)J)?k9?$b7)_ZdL+N4P~< z+@dK+yAbz5FaA!*X^99Mu}GSNw{!^m%2}m<{1UnDE3c~p--O1(t_i87QcF`>(om!z zdu+8`MX78q{PN`dSRTsp&y@t3Qz@0_hdJaGtOa*!j|56KGZPi8@ zzTdyxac2GK5WA)mkIzJQbFL?-)zy?`)eC}^zeFS%a{IADJ?nOf2Vr63hw{>I_blkc zI(gaq8vUu8E3ieYu`Q2Q5&YS0Lsjb?2q%%TA{!2s*u+RKr<$PPEZkPz?s_x0KL^p< zQFXD~*MRb^UZ}L<>xtVVUgh_;GE^+|iZa9wM!O}fghZ*O-c9zsUS(~$vsV55M}V9& zY`B~d8R3Dk*Kl%X>gHS#41GJ$lFZC773p68-E7)4ZWYB&8k0C~$hL9HruaylQ5D>g zLm29|Sez_Np=pQS49r&C&H!jP6(2I1SM_oXC*9+?I4W}+ZT!PEBe~j9Dk-jiVJqVw zEB=4;A@fRY=Y7~GbWcMabmN~#ZaDEC2Aw-GVs8&To>BralarmeAP^Nqpd|6xAt0Lo zKe?s%XL_=WAF5=YLx-}Xbqi?gCEolQ@aF^1#eJF=??Y(gbKWa2+9zk94#}b2FaypX zpTxLclC-1+9zG*bSZyL|>V`_>YU`#zKKet30|K2#*5Y_lbR&Z>47YSmfN2O2vkP(Q zQ7v4kJQu|p^;GwjaLg5>zc5cHIsg9>_?ao5<1!@5B_ib4S_%O=@tKfcb5jB_D4jb! ze8T%=)q&2w4eY*o>N9{$#|{c?a|eF;$7dj)OLfZtViapzVE5Zgb!2-0dfvx4Ks6pD zz34;MPsPK|W$btc=9H&-TJV360&rY@681 zc<($UHU*gz`Qf}qg!$U_m z<{NMa=+`c3cPz;0}kai9RLZp`_|*s}n37HfA1Ya0j@81~K` zsHqe1zLVEWb!H&4p=+RXKy}H1fSP&+Qf~t$`zsHXK&q5LQEvhl88Fk{R0qa1z&QiF zgKpmm5&lS@0!!dsV%##a(fga4E5T}HYKC0!)!7oP6SKV+Lwkmu>5R!kYk;rRwwB?I zSt7f~1c^}5NZmTce$!2;JypelkLI-HUk2LSK7xb!pdwv$f=r7_z2?(AN=zkC4pZbN zIp^6MJ7^p+Myj(G61_wIIX@?o+V~n!C@^ANA^6U2Y+269pTv{KYbk?#T5sgukZK_Jf4A-~>%$A3#?cjmALzzOOL3`Ms)EA>HS zO8+)GX!ewkAi{?nqDAp!i>2?{uaQq05g9Vl=FR9f`Dmog3UV8&N=f&NMudveui^hK zhg*2wQlRoXXZyn|F;}!t|GUipWPkqIw*?Vd&p@aZ5WtW9JK{}iw-v}VBD;Ljqfe;l m=7WZUgAj_Y(-9lL`TY0XBqNZ;Cbgo8*WjvbCY%CV1~5ssBrWR$(L zBAcvI>UW>s-_PUsdh}1PbKkG~zOQ{fuj>}3uctwGj^i8z0-@8=gd-u4(^C-0Nloe# z;0+R6Zw{e?K(yd@jBpd{$18q3S{~ng(^51bS5tb5S5X78kNT9Pw&)rTpPb*d&-9dz zTdf)zUad~-v5RYGoO^iViV{T9M~o`y)Su?kzV1@AgjW8$w%*x?rEW6~EbEEn>`5Nxl>42Nfn`D%>lVr+`jiH_%9TfYONDh~|&7xtOx^w}Au9VY+ zmUdz1rG@9NN?PRM?rAj@c>bW%pkDG+c~qBZtEX7q)=^-BXNsOf<+v7x;~8D{*)%*M z?pMMQ-%wEIid&>+hVm(PMxPK@3c(w;(nBD#VMvt0bPg>o zb*{=y(Y)~oM9~_=w zsQEzo1#*y-IKt$~T_N8ZJZ+Ot`|q7bc*%)hY6fR0{|VwTBD1BCLdawdx#w?eFWP&% zI%YS`Fsq{&C+TbUS>QHwU_0!5AFqfn2f3a~O-Uh@UOHxUA*FfdkbonF!2`xUQ0PAIp4WY!oEhJT;%3T8c*j_AQeJG54 zD+-aj2X^{O@S~s2u(cJ;SF+}cCro(A4jd@+X}yc>^cl|6;gbFzUh+I-Zb)$jk_v&y zX;Tg-*RUuij4}4%r-(5m$X3+=J*q^kC6h-!zVDH1IyKvZJ-FQRv~Hh;gYG7T^V^ZD zXFqHF)I$TpxJk?VBW)L9NeI28_bz^((O|8w`{8X!=!4{*Rqti58I_R}vk#VJnTC5W zzF)5aq&)b|@qik_`O;6JlEt2Ie~gM#r~6IHr>W^S)emOn`?PmP?;1a&o6MZYm_$+g zU?hKix_$~0R6)B{fiJ*lhfz^sAuHkd0)A9c099Mpz4GIh`|mA_CHTh%F6LuyT(pO^ zKX(mMe6Pn&ISNi8>`g(6DH7$=?Bz(`LPZoj$@%8KTS5Mif(D;duO^{;RMT_()LxD}jg^>5l>$oyN~y9fh*nXmrDa6gBRq1lV;$ zp;=WwJ4S4ETiwDX(f>#dnHt-ZjM=8P&+pj;^zltqGM8TZJ~IM;aBa@m_F4pWqnHz3&WW$HyifAZ;2k~5H`ny=QEv=o-+%{jwFieVyKk@Btr`EliKYy*_Pk#9 z$HG1U4}VdK`1hJqz`J{0Z^&DcQB^bq^M9foN$lB#2a^$aQi=>oeH8WoKj2jRNXxF) zD>9C@<`Q=8{Fqw1j-1F@AVe+&;drt}Fcu+E!{sI$DnF$vGh(fIqQYyPFzy=1nMRYi zix|7p@PbTcg&N49n9<;)K?1L?xQRKHsIg-t$NYNeew`7?K{NCvuhXir&thK;z3K5w z{JIYay}dYSi$WR77({JnUE?e7c*$gdk}^mbBb*4Uzs#+5lHPcFRbi^R)a=zZ?Rf~K zCH`)l+lVVS_eJ~i{g>nbqphu z-s4-RfKu6c3YH~a4&CPeK*ia8@$Jw3k-^IldQs<}zjMw)`h5cpWpqix&`tXQ=j+~2 zi9OMSi4(bqgpWxO&Y4rP=GWh!Iy;N4WI;j0Uc*k#e#(=TD(Y|$Z_+ZaI0c{$K(=vvgmLQu7<3a_(eyPs z{WMuKVU%^E0^2V3OqX}aNLN0XcJ@=Tn~<@ASVYG|SgA3DMs~Iw$c#lROs8PXD{dXy z(a7L8HVqd*`gcgM;Kr)FUOhM;HfMrjrn&rwdjVgf=k8^&Y{v6)`C83wHJ#x#Q~ARJ zx|`HDT;xp>s1xwiDE7>9pC_d652twa!DiCGbl>|{7j#)IBb1B?mPDPv-S9Ml`h>j^ zBR|G$u$Ic-x75Pn3ku8(x-gt{ovK_(vW45MlF?0-4LbJr0|j;3Wi$BC=O7D)G;~^) zNK4IICcPL~*wc3-Dq`k{iZ|gCuBtsfsI6@yRQymlV@8aM0Xiw>H`WI#VTj16MIa~9EO=CwOjF$t+|#` zHd^qno^EMso7r2^hnU3rPNc06dm(jAl7PQZ(O0{`;k|hNe&kJSo$_iWnRdipMhV$9 zr&L$h)=I29SuOQw{k~Hk@gfUXbj75F$NJo6N6(N*u6n{-%L~!Id85p%aP)cwj;?BALp71@wfw|ib}Bz;(MLX^{R{4>h@u( zgI@^9-g`l3zn=M?;FUr~eCfiBOY08mq;>^cw$bAB@HXPR^PxzMr4yciovN{o@iLJ7M+YkL~nSC^1q~ zR9Wit9MzqC`J7<9^hVM%O`bS%Xhd-7mJMuiyS(81h4HD1KPgw=P>ZU0np_JKst`RN zgI9>D=hMGs=oh`c*rq!sOhO-2=VNl5(jTu4CY1{D3m5Wr1+axnwm_{nsAt2(Irz+X zRZQFl_pLUL&RSRmI?3RQBI=NSovMSjy`^d}Sase?rMn&D{zOQc#_Dpv0+p3s41%7< zz|gr#+RGHTPWd3wz_uMkzz_(KBLdR`YoDC>({-0!^FGH#3%4;x6gw}Y>_>?Og+O1 z$TqveZ&K?3ZA%va8QH?8v`H+{KME^xv3_rvxPpm2Vpiu>-v=^h1t`>9a;XkW55|u; z+n73md0H47qH2V8W+H@MQhs}T9>yV~%69GDKI~X!7un!&sqZ;3X7nC2bUrcEC>iIT z$ZQV?D)t;R1@jDxa)vZPx~6%s%lp(+Rd0C zLH)DbG_$Ys(>hi< zrVx6srb~a?#6;I&Q>%I@Id5-#j%m7BOmo(`In+^GD6%!tGlBXL=^>;xY$O9?^LCNH za}ejb!`ODpbkLSae?LP0a6Xr?KBsD!jSPo+)VlF9i<%-vki|15)R42uun4}(Nc(U} zIehTwG(reEh2CY*-BeV!{v~0CsfVfN#U)t3KTy$wDTOa1!~NaG`Id|GjB%T`2&JhA zvV-_ILI^`rZhQ8t-%1Tp#+R04ee-0{^X&R2d_n@dH>(%%hTp3$2JtwP8FB5mJprtp z&wp{JHd#rWo3yZ|cSxE-=*Bp0J{1j}>ittZZ`rEsEY4V8vJu|W3pdf;u@-m$FMq*& zxY*H98FxQ34nluJcIm{K^_%N(-B2mdh0CcC_-)Q2gq3At7wVRUy3NKRgRXl`(iXpM zEW-|#ZWtSK`98f|A-e~Nzh3y)hJP=Ws$unbd&Kraqkt^Pba}JRk(M<&`y}N05z~lt zN^qo~jhKpdVxZVDOnccfz52^@X;($-i{3AbYW@3cmby|2sd=vKY%b!9O6DG6)YaEx z38^(s!*YvZC8wvcfm$#)uujOq90D8rlv@{DDZh|RVw^DDbt(wk!VXFJ{#X|3)gVg; zZ=C61O>BXv65P}8=$XNou#XSmpmN8k9>1$1$Q>eSYuG$;AJrp=kw!=z{=t>?b`UxS ziwf1P_J-qcxK7r%4(bPV1}v8q=Q<@05;*ciKwK)#jFLgPD#ot#==J4rcLm@(al4NN zv^?MiKu%1x6M<}aJ&UA9NlC@>!V=?BQur7-U9|2YMM-8`$xYddo-)Li4zl!96DZz6_7)%{)9DYWTVkapv$Cx^) zD04U>_`FHD(#2eG4DevD%pv_OEF67ueTD8AEIl0)0_KN4V7k^+sI$b13L+=G7D4xZ zLZi$er#Pp$UFyQ<*=#{DB>Fi5u37%@6oiwHsbWW1a^G#v?C<=_k^V*d8u8Ujk1WO8 zt(D5-3&>iEs}}1J?359_O(ciLNyV!&`PAkgmxM`jsogiN-j)Yz2C~2NYiNwn;!1Mq zM&VilNVZ6U7sQ@}=TMDd&rn-D&FzoH}O<%qnb0O49 zc52J}x4aA-5__n5T_hGqMqkuwz~MQ05>g~doTH}wTG^wYvc2cSdT>gYK_nE*#Msir#3`>cQUEss5`#Cdhun1R-jlaOzc=ApXUx{6w1 z)zUR@GtVDN!ZZAXtKzld&7?-Wa4#ElMxRu?GM3n?)+hL?;9jmjG-jTj($O(EL#D3Z zcf-p_vf^}X^o5u8om!)=Y329rwQYjRo5M0E71byx!Q!a7jh|$=pzQ!N4MGOP1avuDN|WySXN7N+Mx;rasYf zS6eCKN6AQHEfW}uH=sH6>xoJ1S6Tw}&0zS+_C zKBGyc5$_Pz+VBH%(H^K%P?kICOk|LC8_h&zDq= zb?i`VT?xC2niTW7-~%;4pr@d~MuF!H(Cllisx}rY=qgGa0#VEtPOQqnNI@^{w@0$> zSbo%2y5RG0;ie#y%a^0@dr*U#Zptu-w+<@J_-@}LZ_g$tRT+tmXWMk)!p2ct*@j^mpUwG>hGdzi$!X@OKB2aRM6 zmp3;Q%D6vQ(#{FaP}!FgnySN*==(0J4OcMqVb6$PAZ|j!%_^MeYcG8iAo#xnd9S{* zJ5p&n*6{u5e2>NJe*_#3su} zk!aJh>a0&eX6|1IcMxhMWO_Frf)r@dS9@B*aF^+;hYjSc;+LQGXL_A>J%4jEsuVWQHP^>12f_Nw z3;JdiA$rf#gi9XY29VYDk!;-HSo&uOHhF}J^DEo>^;NiTZx3&4qntm(_6O!PjV=Sf z!}&Sejid9ipRi%XJH1DNg58i%0@DTFXO$jfJ`*aZPRP~zx=K~P&`)|tZ+q8Bci5(J zjAx-^0eObzLO+-N-tBV~v|@_+tvJ2Ya%bV$u*DV|PMwRv_ ziYkn$9jvKo3uGp2m>=FTK$ET6H|Mw+6Ne(#G|S`5$?}JNqU&H7#JfdCyo5Xw$Q{cb zP0kjq{Q7%LxmEV9pd^g)YtZr60_e>>0ge(Lw_v!VsaB@*N_&QTlOo6QL;3m8zfE5% zuKXJpuvoB}#n)=nem~AgrFFOxK6jAoZ@u-8?GTNunb3?%^5D@|tq1u%EJP*ZOwht6 zNf?b$cfLTG-qPd@Dbc&TznJhL*U?((AUZ?xJ|mP1N4ihP;`{Dcx3u;_kAs&%=|4{GO3lF}70DX{uI7@QQsM1*2>VUIkmRV~# z@VC+MTj$equ_E&dhrNXh*~`A%X=EfPH6XXfg*?SC+6SpJF)|WKoL0c?$OUow9qZlK zkA6p;YV6?Pccd*KfN|=1%&kKFWVqA>gp2ZEIg4Yx`3I#a3HYhZmJ7k$|6b3^B_qx` z!6RMw@7`%+_-`a_E6*E^twK0lKVe)kT=M=LN{B?nkcO^Oan7qM6Z>#;VlZ?bx+>`m z_LC7xGzIU66ME5i1ksOwAbNhSR9c+(T${TOr`3cR30cNhDm%85-r2|VlDnmppZpFh zbxOt&a#j~LWHbzyflUD=C0ov&7B$)#3+rj;&|+e5{OGn)^~%|_(2!6E=sDSk)EUP8 zI;9w?9J7sot$fRy!;2AyLDx4Oo(Bozn7!qtf{+*brIBW_vRtm_pz3$X2*kd!6u6-ivy;DB1 zjJHsyznyWRf^u$4oApgGA}I_6dB<({dv%=ZK$&8DebkGnE%|gurMq26B#fPWHuD4^ zE|hU|ZgcG+wq3#d=BUR70MS8$F6XyyBHs`!TgS(|Sb-sA3gZT5m)NZqHg*zaa5<3s zfWoMCekQSur5AgiJ33aY6)j3xY$+FzmO&a%W47Phk;aKa<#FAx-LhKds;vuwgj{k{PQHRCZZcQ+m6KD6P^k+A!3>AU@Uf z2prt|y1%4}4QoiRDI0~E2$@ok9y?xf&|zL8CA=yrs&G-W^WgNkt!5e z(s^Na6=*Bf*Lt%rxOhDFaP|Q;SEl^XuUMFQtI(@;c7TTl@sIjF4wLc(p9@v1-fUro zHU>PV!QsB^w?~8yM*H;tf0_|%59j1t*`ou9`8_y;%iL+b!Hgu5@s@?ndmuV3)&&S9 zrdaHSL+Y3Zp~689vMDJ#dUoFY(<;dKxOJ#nO6)K(GPr=0+s?z$0@d+%_hdd|qx-r5&gMKK z_;^a>ljz=hN$yg~Ey9|vo2QbiO99m4r_LjNO@j93$^-W#&td`6_j3a0GnUJ1-ifqGvG5Ub8=?QOIQ z23DD8(E8SD?@d(asSDBk2E#*+Qn5q$XcHFv%K^Y&%L3K|#+lQAn);HqK8N-9?}(-p z3{0OSpKH2*0SA0_hRDPaCVr)t3pJbdnU}~vXsE0_+EthXz2B=Y%BlTHf2mZkJ2Ex7 zedG8XM&0f7y26p&x3zbOOF+`}B^^te&2&Xq=d9}s<|QQfNCP@K%CTse0;cV|;A*3v z_E*;-{v9+D^-jna+0TuDc&H zQq~f$;H_kxZ+mgc!yUUOESzMM20nZ3e*`4w3Y@dd*^JMEJ--}k`Gdh< zdmZ?DPCa^24}YG(;N&!=N}GWqdr8fohl@DZ`l9F_R8qfgd z!pnL(g=ZF$Y#MM}SX}nr&DG5!hW-gFr&}g|-H++iQe5E&x}QEfF}K|5_mSP5xxOH= zMg=Kn7UtA_&obgMH#go0$3>!)K2z@#kIjF*AVgRtf7=6%(aQ?1T z3ekH`A`y$(z*aJQk$rsT#7OclVR-mrf?vMnn9#2MMf*A zJX#$Bap4oNWUBL3JT+#pRI?d1+b1R(nWTxs(TGFeiE8=#IZ2&rvBvrw!eDvom6Ynx z$;!Y5SHbR~;8g2(*)FB+eO!Im^|SAj)Xy#Xk;Wq61$>5Pziq@lF#$H7kAMrB{WP^c zaH7+Of5XUO+2gxPDonvRMZC&xqpZ3)aiHSlGDVOsKH4AQJA8RvN`}e4=)?g-SenKS zTR?9t+fDO{)A#MJ8@r^`7%IyTcAWoQ=XgucMGeooQOYM?^{9O<$v}=x{8H&7(h6A<5DG#`X(kXwg4{MW>C zn-kyIRQ8wzQq#V}VGL6y@Cf;~V2coo4F_J*zd-S+A#-Cj^(ihUgzmKsor#ot91@|! z*j|L_wcPxkQJ}P<65eG=;xFjm4##rZ`c$xT5rI^w$2$RfxAnYMgAePd$+YsM6KT2F z4Y`-%RFIKA+%@3^!RiL$jB4XTyJ|oL5mD2P1pIXbn#a5JOcSRsD2YS>0W{3M3hLF^ z*X&iPsisKgvMm}z!nuMO=)gYxZEe>m=F{z z6*f!EInEN4vQdA$D_bK>AspK!w`S|TxZ80<+8DJc5${{Ks6rlyNbLP&KI)?U4#`xI z(PBzT?_M-Qw$T?iIZ_hTT3_krQl5kL(Au$K*lUD4H?5LK|K1)_4R5B&-iH}nW6|uc_w$$fNL8@F6&XJ z4ch&?u2pnlzus`}h(nx6!K3;O?`x>}C$N zyA&ixW^`k^Cd8}AgocX_HNT}naCpu&1kwV<`-%F)T^_F3>2KF2pW7*(iEv=wdDut2 z1IrCGV|{qsZfo3+M)MP)&`k-Qkd{r4$olcC4c=9}zqgZLPJFkwG^lzsAwJ|kXE)@4 zeM|${9&_;-TuOJ9#67xRmzZ#HzAFRHz9mH_=ZH@wAKH29{1IEWY^RsK!nQf}7#o{ZWNYE>6gp z(C{1*>g96*qzsiB24`>w>^i|o$W_DCfOC+{fL5rOfsxJ7iU^z-h(3^k;5wypMxxC8 zq~225<}l3}c;LLnvyG3GoSVysbC>vHX8QrhmoPC5ZI(;=0Ou&op8{4|F0$Qr-9?pe zgzl%W`AOW&;6lCh$;c$bS{zriPo3XL!>3K{kJ^qAf7pRA_Cz^vwM-a24PzvSH<(Q| zO@DqqMsa1>S1u#A)5?DBckk!ynI+CE`?K8)CHCO&tZ(v#AgtN%t&9Cw{UZ3DB1br+ z(K8RAdWvkKqFfKvBD2cQDpF7+;FVc{&fLdSJ0$)0UlR}++72=KRIGe+FXB-BFU1Gt zX*2et?E2t{Q@T*^@C?Zq`dKzVSQtKq#7;#^nTWe-S^^B6t?W_9WdJ0d+T`Mb*$Abi zeEP~t`FY#LV`6(o*`Hc1#UlIhb(qE9)9ZTh+N60tSV*H;`&F=yr)W+R2@RXKR7ww^ zW8*8%aoS&e(brd%(T!UPPP9CF;k_j-&UbF~dH^GUKZ2!Su&?Xmaq!xRaQe{-rXa9L zXo_M{N?{m@d{&J;GNCok810~-oZzj1zABl+UXPt-loD300F>B)k`k`VgMN~rlX|aA zx2zR?gGrHBEF`8jg8TmmAALp|4CW0F;d3Q!xz*xWwmO_u*-28bC=djAf^2h18}NS1 zm99D+wC!e+P@}i!{l?*j*&hST0MTu@_iFj#gfB#{G;FJJJjQ?uYa|p|P(bRgue)?? zOr^BI-iws3bj-8aNEU?>3(Bgj3J!%Y+TR2q{^Y6y~z7?5yQh@Da>uTxAcSYW|lQI*QG|r%}rIaxE{t7nxO3D zKfo<28|k8qbcHle%CV3zXd#t{ZkJ94EqAw7`bP`uEhJsG&F_(`>#ARWtEKfpr+lHO z7LRuiIpv=M2_26~r48bdbcr&aFt%B)$j6|GtDpds&d^@qtgz0hXx~ZmgjPKHFd{CgH;$lY)=-3?~ z^TcyfqO7FD^tWWna`qTs?EC=;nuJQvbemecNQy+x*x&5bJAglOAM9uRa^L%1;5n1n zwP@7z^Q`aB`|`d*3f|h6N_`8ba}PXsdT>vI77#qaW1psV)uOIxQuqq#4^5Re)GA4D zAar$&DcY;><~&MGnqMdUJXPZr$!PCBxJn5f0W=6liG=YPOzIh5f@M|RKDy}re<(ol z%`pxsKV5zmCB#aOotGHxFNXi=XJRb?r;*z4cXDI?&vQcVGjPwPvex_Mr>Hjr*+LW8 zcDEUzh6@LLlvP@GKe{S6z*nXtLNy|BbAGkK&Mv7H^JkRpxh`99Z*tASvhvVVO~KQr zX0B(@iRLBLQZhakzcsfsd+v{SB417>3XXTQrGB1w3W)IE*hiq2R4>}AcSZ9k!3#b- z7>yNRWUMIdVt5SJdar^~tIC6U$$Utj{Y(>rM-aICXCKZ@17JI<3p)0>*i<`=8dXgg ziVR}{@rz&_y%Zvfqz)JA5QzVljM+4V9hJqCn zg*lLle&u(mihpCNwI1SXLstrPLDN$uK~I~-r}O8@b%L+ahmpo-B$7G`sO7BVz+CTl z@f=Iek3XT1{#$LAA9m2k7$ADHat9lR2DC2zH$~@zdN7$x3d56x_A!8!ZTTd0YHREC zwDJ_6ga{;49zcMNvbyldn!D;#)mGnDGZyP`{nwua5qsF~82eNR%dkV74m+yCk^klIJBkZ&e$%F@An>&K~ftfN_EMHk&82014k^Ri# z{p(-^e7dvDhGJvMSw!I)Cz;DGw_60=?W1Z8GcvRlW1(rDaLpAypc#9FpKKs?WM6LI zQyjAU|iNQ`s2V$|b7LGRxux;SXDnk9lv!7|(- zk$CL1R&q8%e}BEBUvzBQI;rZOE!o-vY$uv0yyGyy1h1SXo|EW>IZYBPL*0xa}#*_Z3(tPmXXpjZ~ut!a|7^KBQ zT|a)laHfx9a%&Vu|Lx=thDPIibM~LW#Oq0i7<4R$O=|mkuq`W%c4==6H)#* zzvIpSCKWu)@=y`|r?0QkIqhSiSRX@XR3-ceh!i=s{updMVg6k2YZhF2l}%MKen=DP zd#u7({p|AGkADVANdTC8(&}7C9qtsa^FO?$r80}O20Co;WX~Py%;yaKNWUGu*72$8 zJO4Sg%y_ee!uLtMHQu2T*NN1kjY}_pnG|VFpcLIGJA^!lkT&0Ktw-E%92}@LL}%AE zHQ8O{g5~sEZ2m%eyfsUVi|3PKN-eRGrD8Miu=22iH(nI)=)vD!mpp~&$|WGf@yVur zbz7G>^cD<0%50Uq(s(-%*Bj7|pyO#*))oqAHWOP?D{bhamE+pIco2u^>#%^w?dR@| z`1Cv-v!GV5O-lC^8lN^PQWG+b@|oKC;ox4gX_lDbohxL`h*{`y;hxX*Y+f~vc<64S z9iHdVqLyPSwiMag_KZZB&#fiHaYExaL_a;ftQ>*pgUyq234Zm-L{Ln74w`sdv$M%HK9<28A|FpE!KNA)r^<{!7JJ@ZPwli_Zo$Uj@q(npN)FGf-n9&b zdKM8c-7&ACbSWraBC|u@YZpB%6HqaaS@`-EYN@n5#y*TXg^IE+Ct{I*Y7#%bNbB?E*tM+|N8T-nCsgRIvUPwbDM zYoOcTzM+MBu^L*_x9cT6lR3oS`+GODm5r~;oTmXdglLpjk1m=sxUy!%F_50o2$;iy znD+R*Z?PDtpzOpSZx?3$PAvbU`FBj6KB_X$iK9|ldT!Y_G6VkL%VEG~10l~fZOBX; zofmwCtIdCHa1k?-qwY1en@mbXV))|=U!^CEM>y)SxhVRU?ME7h?z8TT+fE<JtsZFp2DiHmGG&1iMoHSt?a_61l-3R8oNbz~1OSX-qD+1Frh+==>)tPq0YCiS5{%w5bHa)aF?UhRjOS$Sxdw0aO}h2QN+yL zz133q28Ub8Es=C00mh9n?r$741MTC$DE=O_2;6y(zTYPSZg8`sx=C_u}doVRGn zl-2bYRRVEx_ba_<|KV;B1}GGjk^Zf#t~)n8V)64$&sun60dH`or1ScJ&8U!lu}kr2 z;-H~xzKv7E-OKZ)+WGb<@t11<*GCR1E~I}FC8+Wd6Ts)4Csz4xCpYv(d^`4q$%bFw zF#;5!JNRis$9R5IXejAv%xnJHuUz5uiTR@b=AK!>14C zO;w;49h%b)-L&LYK^bc6JRXw(tvI0agSsUA9DGQwblnscpP~giv?})@*%xVa@&$k^ z&6hr!?!rl(x}aYq3C#l0fkI?}`fDM35E%yX*$=A6C3NJJfXk zH+4{U2E9}Ih1r5a?V)OJTdLXHOELz`0O*WM-H8!b!#ix0R)aE)``LKl!ya7K!qsZx z3)q=K^dZk2@}qYnZJqrT*4*^thOZl9OWk^Af*D79`e5WjFF6#VFcDEY;HpVg8L)%5VP1(1~;$2V)sYG zG`cx*h?=>3oMQWf&MNEi5G{L~`gGZtAn)Ve&`#Q^=(ef$$TtTc^L=W|6WwggU4%7XA+?bUo3huTL#t?;}8mk#Rb{%68 z+}o6h1Ol-|H_r1ZX{?0m9?^Cs0#fTgE)~CJltAc-B>dAEte||ECXTS4shl3(!(u@2 z#RmD&ntV$6^cjTPAnDX}a>LgKhn{M*swn_jSlDv}<#mv%VUYyEwk9$|@-VDRrqBdh z^hV>qlZv3e(40Vm@C2LW+?Zf;yW2L99H0mrs#H(J zhL}<~qF)J6=dNq+L&nBs84|YUse@#`QEGN=Morba)nh5mS#c}E9?Wl(lshU zI7cu3m~q1(c=%Ny@6#U?FN4lg_aC8=pxx$Xqn7qW)qoDK&bh&f8tmhhz;Qg;-#x6r zWM;elG&Xo@x)B~sGJTUq{~UsSBotw)jp2ai)>blKX_?c(=EXB92iQB5@m3cf)Br4| zG57;^IGvu4U4`ivbsKdUL)Zj!2KT$o>`%&YII5TNf)hj|?M*?r*|f4KG|;(>wwx?? z@pFNH^%OgOq+DBA^=HsHRVX8Q4<{Jt2_j8qS?@u2aNrmS-LS(<-xw64EW-8?XSX``$o#*c|!EyX`fTO|a& z{O`xvz&fwb15V9D17GS*4%h(IO{VZbyg?7yw|}5kkiQ|#K5=FZd+lI{DCl{Cdv0!% zj~6K^^?zs(geye7`HEsPD>Q&@6M5dtkX@P%YGT zZF)woOjU$tSn9LuB0SB3>?dYTbtAYoVZ=OiXCyFi*hM3dlIeh6v@1T(=_50PG`r@; z+iVy6FLBQ?iZQ;QG6s3fcEeITo*Igh$wdOB3R39v@*98uX?5M(yi;w?9Fp_PUP6sa z3Ant^;z16-e%pi3LheE7n=t|BW4PZ*&6@6-o3Kvw%S3}KOQ7&G-P^$8E;S8QGw9Jh zuY1?jIe(spL9j7hQsDr8^%TtrzOt*YPpFH>^ zJ-!o=&1g_@uKTk3_0AI%J23nqCzq|Klb3-I8SM^VCa0m!#Ddgr}ba|77>Hy zZ_N~47v%^QkO@sH&tSOk_A+|ou^B{85WVye#<&S>y9BNgsuPJqJ#ep{`~rs+)(H!3 zOU)k=w_Xc9npQq(`pSxto33-F^^>gy!JtTr2f{gJe)!o<{bxD|{Wx9viZOZoFfZ9_ zQe2r-{i$F!#**vj1_GGyqLqN@YOS>A3c+cHd<^U_=^bY0-0Y|MjBN^!BlD$;@dE%I)*zG_Z> zPsZTvcJG{yMG`UP82kw03Iu?j@?L-3^1fdD@5L++#wI?wDZI-!hyAkXThMoq0jF(L zg2|=-(+#;Z!imHbbx>V)nJd@CA0icm8gcS{+&j^r{%OFu`Q@9q*MiT*zhi;rSWoyjWY%4!l~26H-@%tVGsg2GID?EiOa(~uz|jHU zgHZ!Pu6@{b14D$C{4izh+3^7^O%hglgh%Ki>n7`U5+-p3^i+{q49d_ky~FEp7#K9t zdlMtBqkfX7GeHZ}!BHU{csIrG+JSx&Xm2g+%nmPPKeV=W!&Ewz&DBP$szAYKlReSn z4fYLnDZ%x$>K~t`8S6F2#wQJAy3EndF>LXP=k6f~(-(lNu-@e=7r!F{s5*O)`bnfP z1z$_PvJ-vMg}XMcN(x|tzB|`aGGe~0$*O$pu6OSJn7tu1$bhC$W81tEjY7#(BV+2x zQv7UDDPy2U)$@dVtFK*0y#Xeq(gFI|md%VgzRDGa{VzzSWXe8FZ&s3XNodYXRM_G{ z>#1}T6TeFo>c!kPSSr=R`v;HScOy)KJ6MMVHcAr}rt>jHdzBc}QpomK8Rz&~oiCO6 zF-t%=mm}HcIwCX+Qgiq6%o5+S#Tds>I5)mq!?_Rh3e zm;Q!P5X11ILTarY$FUtMC9+Yn9UHjYciT&@!?X-0wqKyQ@T?KOP_EZdZGNh==Z-nX zpc4^k9uWP~FXmT;akUWe{*GdVZR!iL1$6m^cTYmfzv$dUsj1yi{?zrNqU`n%2cGL) z!q}KLKTJ&Zag^L=HM~z;5>i2a^?RQ;0TXYc(rb8BNkK3G@eSDvz$Ytu6T z`OIv=iay7XU*yBaA`To^R}?_GD6yjxVS#eZ)2jDr+cd&mW>}M?F8i-v4O~dOXx{`I zF{+v&x1;}+##^9YJ1{o7(uO;MQ+Gu&s~^p$WJ><9d97J|sm>topKxBi=L&Qwp0 zOu4AxxFRiHRs4<8+76!W*dcZQ)j<>PB5D)%qM-TIq#D2cWIKu%|7f15<}d(cm%wkQ1%YY2`=Xz9Vi% zHlDT#cta{ALGfU%G5y#qn!G7<-79J-igvA=&{7Nu2llkp@D<$SQ^ z?M!Y9EdcUB^+0ut1uUn`&Q;nz!p+Xl+WBYxlUh5#{cclM6$LpDKglKj-H)I6f_se4 zYJ)5@T=ed&00E*&;)$^QKX_+$cc6Vz>Qw;KMxmqB_nlbkE`)`}>S_i-uQdkaC^;;aKL-hZNO_>~nFI{vNBcT8q}E|xbYA0L zEELd)?j?So&eJ843cKe?^sgPI|Ay`qQ-Np{-}o}x8;}9xmcDm7$e(}8OksmHm398> z82WPvSaWJQ%hWI?4hF8gWzvAd(_NBn$mgv!)C;<@~Qr~yKjz1 zU%;zh>AEOg)Sltj6tlMTP=nz-*Emycq1-*YX7R(hF%O}y-s3CTTcVG519GbhrE~4p zE?(A%&npPWw7)zv+9U~w9K=a}tcNM-G{v&9M4HGacdwiG1qww-nequKpohg(lt(R_ z8NZILhJltu2LiPeH7y@*?{{j-PIE}{`2S0m9ApfOHxvmdF+9z zYG+z%Kv0r0j%^^cJz_KY4aVnA8$FxQbE~s_=fIZ~RxWz4Lx2v2~E>YyefaZH5N9O(C7f0P@ngWlP zLazkkj*ogh>Wn_G{e0Y%Y-MEu7PlB3KKBBj9FFfiqDmFf%^O^KG$36a*Bb>@l4hZ(mfifLEN#E7nwO}HJRQyRaF>tuuf z;pU`Uv$C>sO4UYJ*Ls?pWuxEERd7~T@xDCpXB(tDU4hEYvH%l*zvbuBv$j;)%9pKy zu!=t<)eC3BgCR9iqj0=t-%r4$vM0YL_xB%H+!IUu*!*YT?bhGlyLWFjHZ?S?|FT3G zTYT}F##Eb$u>{;ocbXWwbR)nK+}6u;b@u#H<0>$?;&MY#SzcaIQTfTv{NDQB`oG7d z`FDp~;Llz+%ZzUx<7hVwyI+G=)x)1FzyA0&;Tl(;)F(Fs5{o}Mo{YKm2j}kY?&Vc& zRstig9SviKy{6}nw~7K&dwt%n+=)k~_M)o;+~Wr(-?9Rd^2c}83-0#11@5L<{XH^i z{@GjBe0-1w$gg`VWBRY-*5S@k*cZ^4wQ|G=wY}A+68(JyT#K}_XvGElyO)?Wa~uNO zO8=vRb+gI5BoOR^ycKu|c)+?PRwh>VXD|O&qwlVFo%v7^0q!MdykeQg`dAErXQ)vx z3jq?hH3pODqAzZn+LH&w_wV~Bf4BaQ{@v;S)BnWbCuZOk4c0-@yxi_pP4%UU>EA$Ie(r0POu$nr3CuaJFs~g z^Cuwl@7!|7t0#|l2V-s>|32FPeKav0>SJky+TUDzXI3qg>+(md&sRz;abS2DHM+kg zCjO-%V0Uwx{NyPA@4?}dzdm0AcYC|KXx^QH;JoYHgW=HrEIuRk>CdYf2j@4ISHF&l z(Psk47()2AVv2hYV}M@`MOxL?Ot{;ZMz9+Ut6i23{D?UP@dt4EmX)v3lU z1s{`Y*WaH5zAUHz{k{Bqb7Sq+-_gBZ*`G(Oo6T{5y-Qb&E-?js^L;fDQB-R#y8G(O zezU*lv76hI|HsmGhqLv*{ph5nMr}&Ps=cXN9Z`GlT`OwWj7`5ai>g(d))sq@5Y*na zYZo3U5XttnF3k%OfmtrHDM3d@D87|e8(?QoAwF1T zA7=IJPLBa9t>AK8vQMR(DFYNJGwdZd4p>->GX{S3+y;CYi>zDMU8Hh1I~u_^m_sD? z0I`BwZNEWP2IEi;)6F#GPh8s6g?AUMy4Gg^53AYiNG1OY@>`Q;nuJ<5#6>UN6*|MF zMtb$eQGU~ECm7k^j;+S0w4?FoIybm5i}Ktda`FX4Wy?&nJC|8wOSXkYE8#N${D5gcx3I! z1M~$drL?e0u{6Ky3_YTA>ew!v3Yg*!I3%9N;2>~iWGgxte}D+aHU{G{hc}oUU^W3u zoVkU?tU3>r18NfZ2;jX7Fg2!En6^z>U#?Qq&l>pPb{7rKLT>LdxfNFTc)c%j?L+vh zH<U*>+@$-|6N^hJ-5~pLo9D zijx_p)@iwWV(=m|JlyVt9x zYI9BakZATpl)KY{4S*QVa@3*CD3mp1_hcB^e?}BYtrEVI9@;orLJTnnU+-AlY*^s8 z@K+Y?cpQd?hQ@5xxutAxkLQ>ScDd8yIVY3L!vfwC!EG3w?sh{*aL5E?w-?Rfw;Qa) zO{H8i9#eF}T#22Xm4{4u%fx-t=I7_HsH|LW^M|<|1B34dw}Q_~6H^n(QfJQb3p|V4 zy-SVq=XKc?wlLl9{iVhETGzA97W!LUM3gl0;wbzBNMlG-kHkUP$GlZ>r>8cO*#u$n z55)y&38qze2~?>poFHbSC@1LZ1}hhUS%S4=mkxt2RwFJ0f)F12BjDhO+EH#SX-bbx zvaY%bmbpD9_#4zasQrt03J-n=ak2%wK{TFkUH;7#$jVThGf806{ybYT5PWlL5rjeD z$>KT0fL)`K$&AG~6d~>i3fyHZJdOSISHh54#n;=} zstxPf`tuf!FtI7yFGK*{?yIVcJ~2`mn9_{}v@_MMz^aT{3C82Evd(AK|ZB>)EtYTzr9+_gjun7=3KKH;j zfnH8aLh1|lptu~vaQ3l{4Pd04%mNG5ikZ1NpFyeipxx{-EY1JGqTwP{ffulx2di9R z6K`g>M(~D9Sdmf0#WDQ)#_MKM{&I)Af?D#h>32T!@*i4?f}|d+o5?Xb+(J7Zdl_9D zd=b&!j&nKpzx#z0@p|#5n%LiJroDG_{jFS8RmsWX4YH2OZGtrDw{&Vqpxtl=haRKF z&zb*tC)nn71}6QwRt-s2iD<^w+8)FP5r8_}inHFQ3<38$4NN3={+^tl;j5Nhn=C_& zawDfbHM}Qn?Nxf`(ejtaHTcUKQ}Yztts6F^)IhVTnOQI%SdMQFZw^Kl8Vi!7FbqNM z6dnk0ZQ^_1V56YgulGQVcd4|ZH`zD@a^>PD4pEv%AOFe!JA~ZhkcS4P8)!7zs(Kr{ z{N}u77UzL=m9`njj?LbzN2{9ZiX@*+m5<6`hQlaQ!O-&CGxaa|x8j zm%ge+lVeO)Ez?}k=U>SV>kpR-G9IgH$BDVwiGvuasKlz@@<#DstKR}d;lrUX8R$oS z1q6R|=$tHjb7iA6THwVT()L5d7l$Qxngzw-&zvau9QK3jsDTYc;w6BjU8$ zX=N6%$eb}?F*6l)o)jI~&mA5a+Q)e)Gx7U#_XQl)lgx@(K4!XFeKziVAIM;U>AMOs z;yVpZ#G6!_LZcanmN?#O26}gruZr>NPOB#M+z+vaOgOSD+ z{c08o50vsOyLhKn4$a7+=_2?;R#I%gFzCrK0&%*w`Y+tkNXaN_Yn@L2vv7`ud#FFx zn{6ZQf_mmAe4D9#kE6 zDHSk*o$Y;e--vyIrDIHlT$VGJ8v-Fnw{moPP-miOb?>E(OG^w#X~b3`aEe7))oi@1jAEs73troaruH+e6f5oPPsp%J;y z8i6tW#c|6&?kl(PzAu$AT*t|sK1L|5t&=|KeWfS+yt_M{rXwrOC=@l4EyY3R#Lg2n zzYzmsAd*iTyR&d~FL|iY>z0gd)t0J#eTSyHue`9fv(B-^nAZ(AvzjHlagZa|64MY>*p+1dU+wm zfcd|JAI9M8yz)E=o}#PH3|6TOzUR!8LM~LcF7t)O@N|xP!Ft*kb|sPNH+5g}m$R}3 z8*Rvy;7dn*qa&$U?P^?cJHyR0#GGf7EHnK9KX>Dpf9}Gb6(u*6Kxfkw13+_ znEu0sGEmh40vWlRV-5Uq4*oJi?t0eZ=42M=eBD>tf!4RRRak@^s~h!dCL*;psS;x~ zmx*rXawtOyGY95vG+>>*v1=6KIM|_4;1sV7k`FIQTU6o75w$ph^MfmoE#p}j@_5L z25OO0Is7F4f*Ft7+jA1nnE&8M{|^t9*8{xHJ@j1fUOy0Hr##P zjt_u$1C$xT*I3v};J^Lhyen>Yc9tSug{xqyoDpUy(8DVC?)2kf`3dqjH>xFNS_*%B z6%<{&Hx8)!C*x+4a&89OPo{gbdbhgdP&2UeRs5_MZb9PTONM*93;Scw*MNeo0yW=& zLstf)_ZwF-v$H8$0Ov47jl<6UBzAbrra9K?_4}Q=Gx`mmd&#-OO9nvOC*8R9+i!iK zrw0K%@HjlWPY!6?E>l+UTNt^Uv&jJ2Lu~7^AegJ5=vwsP%~il*a$a%3=7Jyhg2re6 z9ciEe5ojK!Iqh*Tfe&p=3`1+@5^>GlevGaagI7&uJ>txu=WJdX!*h)kZM=Bi*~xNg z^PlpjUrHM3fmN@}TB4{kY{&)B%AQ&3D-THGFV^G!^?8?-`18Y+KukLxcu>IisyhA* zwi%NMOqb(;1;c!s4f*v;li?*hLn&MT+TEP@rb{n|drk;JUpC3%3G|Y_?DQuG$)bWapo<^cUITq?Wn{@b`$&CS~0 zO}wGfL>)`b{-eIKIqiY|$CDazxTCJP<|IGg)6HApales2cAM0Nna=7b8NFRyiV>cr z2WZr+9PSK&7jW0-`wKJz=BgZtoWGA@KEg}E9+IwZ1Pl6&m(dQ9P1wRpN!CwA_;*Pk z_}Y@p0W_IB%H-iAsL-CvlbT==7*ME|9(PG#W3H&w0q{eX0Snh#xCs|c zj;wM430<+>6_i_T1quL>E{-FZ@h2(m*XNDxxXlb#07sa_*323>ls{CFz-X0QE4fZ* zisMyXXmUX@8uDr*5P9%omj7Z^7Mrc2UU(G)doOq@`fu}QSW-4XK}g46@-NDObw_y9 z=pGt@NDU>O#cjJcVLm@MPcMO%?gG1l|6xB5AVNh3Np$?e?Q@(SQpMt1HR20Wt`(H` ztGo)WxJnE|leBGcy-cj1#tmrlf|ZY*mg+Gcd_45HTRyKvvWZ=JxDWYmHPOH<%3A=` z>oQ;&)3z8$VOcR(s;%6(OC2r0f9K4i}AXMYW*avp)J#+fQFr za<&WOPw;_>9Li4Wl25FNU1}0Wlqo=uJiS-|iq_1d7|s#?S8Lk>yTk4TQH-2<#8hTZ z02(`w+BDZM<;Tn|(S5Z`SR$2=zHJ!X-GUwNY`j-2lRh(~XzmCE-h9-;o0wQ=hXpZu z4+gm7b`O})7wnvZ1b=V}f=ov?MC9$$L-MnYnywVh&Nn+KULlu+Ys`%*t{5B=$bmuJ z*gM@40ZY4pZJLe_$B&zLWb@z=Eks6oY9qW+iZU)70JZSp_rsqi`@6k2!wM2%+DVtg zyKJToj(Pyg0&0ZzMXr9}?3+HUMt)tZ-uB2@>XEM#%3^aIrms!P?s&;vpW228$u@(g zf9nPKU2yv!GBLsD*`(~X6IJ`JM9#j(g^|LBGXUpZ_tiWE^n5CLq>7E0u69QO7Zcy( zs6hw3KG4zfry3VFUUJKH)kJQ)cZc~t!-yLM^YYEcQouN7U~k&#WPyfrC0ngsGObO~ zA7Q8b8$?R24#z*pAU~#44xS$D{QX zivRVk6BlW#v?1n|5j?K1k!HvxVefEEgFacwT7YApI!OI+;}kW6Mv1dGM#9sh2un`P zx37LafEi4q3pQ%jPcP>Jm$zo4r!h3MEA7oK2dAP1!B?ASjax+mh5Nb_#j8e~WVoN- zU~OVA?+_iO&avlvKVN%78N+P-L#d3!(b|wKXtlWjbJ+^y`q>s_&vD)U!}Yg=oLp8k z_t%dua!1`gDZ$xT4#m`iLDrTvIez`%rcAuFMV9D*D*pJIZEGzL`S8p<*B>R^nPDz| zC?c}Kd8vEC34{Q7`qLpk<*1z-o?R~00HEdx78X5JA!o0%P$_*>)z^l8jwhejIB%$u>PsMRay zWyoex#HUnHZ>r&NI$>O7f=6NkTLo`#(<|V{swY!g{Mg-CPNrLkkpNoJH)K$f@feV6 zO~qsp{f4Q!EN@iM)II*%aq3?~8CQyIHAlChe$@Uq?j*y4UUxc8nwALQBXp zKL0%qo@Gmbu*NS{UImPA<+>-UY?*_lUn{`lx;N!=OjjcwAwt7pT`oDEx$VRtX)bPf z?)mnBq%6iXiI6DeNKK{nHj~=Feg_g=w({Br(De9xM_zbYEPMHy4|3;5Z-Y;^bSC>` zkq(d3yp-EzzhG~am4OISWi=q^%;(VZF!~XYjFBn!dNFXDpt{s!ikyO}z{jGMbmz4` z`9sVQa@ZrtDBZg(y1KnakTfde)U;lStDY9*lc1}eS6`$mYU~%K1?UmuCzRUBG9v5m z<9WXWEk=DO#~(w0ZDqRRHKGolMav0beWT2$6Pt~GKc~W*WN?XdezOYP6_PcSb-sxu z)T%d5vS0XS-j3ZkAW!h9NGWilZyh>f`a2UW%Cwv^ftK{A)RW+GP)U(63z|)KEnH6B zhw|xae4PzT`TTj=JeB~IO{|kOeD>GWKtQaW+TzQ#dZOLP!+m~swOq0B+m*(eNtaU; zm`@LRfd^DvaiM3y-_lC#rZOQqA!=nm%zKJMBrUn}&;NF6D3<@OmP1GP;?;b)cYA&t z*2t@@va@Dh$F|A6lIg{QlKf8@_hUVNBen#kMCk%^v@lkWzjV#cc~4e4{MnOxA%E_K zaQ5V<4FYjIMF|OKtYZ`O@FvhXB9`I9>bAV+fFNqfgBZO-N8R zPE&*E8Yecy`&sN1b2;%fw+6q)ZZhgLMfh{E1Dsq|dUzy4CuwdW!TR?CrP(YxFvp{U z=c~5K&6WSccW?4yHP*?JViiZ>G{wYjCk)AE1btqO0Uap&!-Q$;8GoQCe<%H#8vxMy ziII`Ra|_{sVi5nnjK_VQU+|BlHo1-x)H#tO@vlRnyXkwAgIP4>`V_je3Nj%J02SI9&6QTCLD{WOVFyneGH^#FW4Uo@?5 z(>ZY>e>%xCl;aC2UWl|)x~$6z=Y9(${c$TLIw_K3)nq$?hMye(kauR|Uen{4Y&lFB zSln+5Wq16y#JV;^ej7BV!gpdaDY~C;Z;bp>Wvd}%Lup{%pMV^ zCyzQ>ldn~dM5O#k9`HyveN@7)6Kuo2g+zIb_C#Z^8p?cJOZ&I)mr9T(fhVHNAm9RT za3W=*4Inw6V_LUb+BTeBX?xI@8e*LzeBAxh!GE^gf4pX*_3K3J;_C|~AT3#Xhe)71 znudx>t2TcMXt)*ihCL_p6TRK(#l`p>DzWb4*opPiO1xAu)N1?jI%;1y=Nj+&ZNm$u zTG77gR0!lf%Zx{)Xe)CyW3*i!9TMYG^m;4$1CAKEa#hBg)5S*yL~T=yY7z(X)u1hv z%x+a8ls?_jnJgV5TW#kaCT14{0_=mG!H9oUZpIFxQNxtFa zurLfHR3UncUVsw67GSzWYBN1%z2eIHT^+pDCPmdeu(j-yMw6|nszG!kD;j47L!xu8 z>hmdy-ZS}iMW1TX^o3tFlL?pOKnLo2BMI_Nh{_B^t;M}D?nrh3Ri9xk?kD`0KhQ9! zyI@nx(Uw`)o|>FAICZ9%pdP zRe3eQvDW~VVfx>_wzz2N*z0l*6so0%59?~sOF2&P8r7;xEamB2ejC~dsNQa=Kw%S3 ziyVaAq)K3M0*o#@EeGg~MgU42V}A`%b8Xou&nS#PIS`Q*f8ylTRAAZ-WcQ%1P?u{X z8I1)OHWRY$(+sN=xrG8_V;0D>9Z!IY=NlE^zM9KO}K{7TlpDFDp;gh~5AV%9A9fRvvdpyv3#4augE zX^9!Fyk~6;qPc#FIr&f93{xwXtjS<*Nv$Y|OhqHhfm&@~@B^<)<@#e5X0Hx{4-p130*p>+>_9IU&#v!& zTshHR@a&WpaJD9UDndfF(+NW2wDVcQrZlGLk2Vyd`;H9W=SP=a~ct1*KyZGiNGG zjrXRiR`1i3gNLSf*OqK^hNjWd&OskAqa(U{Bcjrf?u6zDc$8w>B;W&!7I1Ig8}#bu zHsXX+v^hq7ST4E+3K&ip9_`T`tgjQ%vQ}jJ1k@y`&1VM(@*~6AZ4s%K1R<-TpX{bB z{r>(Q!Z8bh!RGh}QRtEa3D@NtfI39Yy7B|s0dq5SU?n_J$q~v`fc`;!S@mq)LL+ra zW#OEw0O+BB>oUL%!Sq2VZcah#Z66-SbnLvnB&XbWb=@`QI{Em$M|pGi&?#`G0K7Xu z%mTbT5Ylv*Qw|4$mWw8lht$y^v!i!yHNZjb%eHc?cA?bit^bJ3d=HQxtfDNJp zkf>;YUb)=LSuq{kGFyp`oIe_UsXXB1A$E*qu;E3f<5R2-#+~X$u*^+2bU`}`B^X}Q zMTF0XcEO2wxs^{hHpyDZ%_gp)et(&a0{eNmeR_lQaKiFV9R3JjBA+&pANxThI&uS$ zJji5_1BEL+1IKX zPl4t~l~z%4s-Bxh8`LqfNZXj6Ap8`@AX;LO0L7Rts>G8Gn7adhq!;zFz?(n@V*g1_ z;3!Cbmg?|S_^Y5PoozRhcb;}{>gwZ|xK?kDG`?VQLlzfD3$rfH2fyfVm@-(W8yW5g zZl3OJAq4>^6JS^K2dYXGZo8i7y>dxyuX|>(D%+F_`96C~!e{^T#XUUx*eJn2FLwOdDR+FAd9AMGwDNRA_y^LUn%wcV+c z$p%Vm9Bd8(se}Ci=>Pzbl(XdmUMhQC6p}546noKIt}kq1Q3%WofD4x0lEnnBtc-$Z z+t(iz%JAE*7xJ$oOOR#yX1G#&V?7c7%1>*74ZJ0h!!*&R$}5Xt`R11r~98 zyNjz$TBP5Y{#2$+NpMOl|7Q$RhBbZ^SK;yn40TH~&v9X#@dAA#D0{59afK7>0W)f%?iBz~9pvnworWiYGe{m6Y;!a}ByaOol$RNEuPj>V!kS1|+WtDt zWN<}a;r=l9l^2d$^Sa8S@hzCZ2Gdp|B|s1~5h)6OoXqyhTIP?hte37B3Ds}y?MGqd zvOUrfG+NB)2ZgKTO(mR6K6iAIe8->&d*^op3r~C=h?s?{@_LjlKUusWCGot@dH%`;BuDedXxvMxx~ZO(^tV2|W;sb}6TzyL@A={^>G%_~ z{Ac0Aa`kWq;h9ErK@K0QI73TkV(Iq#<#T090-XDE-m(3bZFRX5p_4zMrs3R~X z`s%n_QSY8fM*ggcPalc!|Es1Qp3B&N;f2pEV0R@|8`yy+qW(Fx5ZpGP`=2*&3N3(1HDTF#4dSWTedO-U3z9$YueOI>cKf)nJ>J0gw?zzv_3oXMVT zj&)8NeM$xNQ_c&8qCrJwZMeGlBU(REj%lUDGUvj?&DQ!7`8;fUNYrN*!L|8>Wn$V( zH!CI1BEYlUN;$INOBgzJsujTiOdr_{LJ`|lBEB&KX_LYUxVox3@2F}*8YgO)`Uib3 zd85G-)PJf0yI1WINl@K-`}8F3g$A|6;i;^&4Wdd{J(O|&O+U1DNBpxe^9Q2XuaUhr zGxy!glSrgBTeI&?YowKn??odPU;aGSY@Qa zg`WO)6rF+bznKo_nJ19$x~mcy8eXiP4&BTJn$v=L(G+?^0raw`aN&R9r0`qN+Qv z5wdl4ttF;YYq%mbWJR$+D54abpATJo;f`keCj>P;QKnCxV%mMCoz$Fl8*pMa!QmXW z`4-5#w|~353`h9;1b&Be**`vFv>4=1kgxqLHo_(fY4g!)qjr=(JZD30T^4AlQBCfg zU0(x8B~U%IjCt^1J7q&3B?J0t$+VF|XGH0=9kEoG9$OS!a(+EyUMu2}H0m<{oHCIN z&~GJeUwu5jtu_U5erV*OcyVR5=lV1KHveE1-QO9FKr?xy(L};6>o{^cmNj%5+$xmy zNHzKEsI`&RPW9()Y30y#aW!RoPV7@4?b>+(kX=U8Z0+0R_DQvO$W z*x0!``jbqpotjo)g~x1-5E{X`jQvt~Iz$GNXCL;Dc&ivwTb(^kOad}`6VpT!%lDv1 zxdjGeVtg-jfw&Ao(&am}4A)0CYt{TAM2dgtke}t16%VU<-OScr`12ny<@!yC&*Vdw z-io=H?=c7bXUT`tvI^L$d-M^iMBLazEw2Glpn`s-Z;g!nwH$c08|6 zHURyDUE+X^fAHRYAqp0G8!a%VK&@FvEXtLh#9!cKceXj`^*$TIdPw-F$-pmbwWRl* ziO@IttZX3UxFyQ7B~0!qn<-fIkuQovJ}s{1&xkr5H329@frp$2gJL|au|OC6&8#Wi zzN|}bAX2%Uq)N+h&cGn=Ve`hoU@o!Afqa0e$;$FFD}onHUH$SeMROi+FSw}4#TKP* zl)?*b5|#Xef^J46Dgkw>P?kDON8n*RIN^(4x6abwf4R$8uy10nH!1Ca?&36 zg3@-zKLb4{hC9TnYS_Ai?S+GAY5-1ojAElIZW0)7=*Mx-%)zG9yzI5z%XdH>tWsG88l}h|PXFb6iy@iG>^&;T1vjhGK?24ylc?A=alMaxZ9cQY% zHxEtiuH?;%8liXA^C~VS&ZEZ6y_MCq@mw-^ae%(PUPlR%US*rlJ9BBvz+R9ZeAoff zseawO;1GD^Lkmd9tLV$J22ek{evgxY8toLL2;Im_oqwgV9;O~s$5mW_Q%aG4Wi`5r zVhehA6E`=x_tHZLKX9I7bJo|#t}aE-b(l-w&Xf5zfK1pPIJ^sx3s)O@n{AozzHq?Z zo(}w?--PxUP(kxj!Q^LKb_dR^v`YO+j+GZpWA2Uav zfWExXT1SVBU!c_EHOGv<8NVR%8)Ve#?IiFAUGT;c!j!C_jmu(vG!DdTEbL(avKj&R z9e1u(J8nr;S?R$a677%tAG|eLPc4b$sBW;IZ%9++sGX}rwIIjDBBs0^1Rz}dD-?K4 zTYsOFdvV*cn|tQV8%`luCb~K8Y_HVvqux(o@uC}fIWuOmC#UiemK_;|HxTHgvw6!| zGrfX!dOD!%P!{v&?NJ--KFf`FO=weP85!YE!+vA%+;$Lx%>2;j(d|)XRfQ~mY9Y?v zeN6OQ{ZU)ig*FjjC};o7;2%d+D(}=dCKU{} z&g!=M1lZ#O@B~PeAG`&k8EQq7Q3zLkZ3%X|wjGjYl)PC}((&)RFn#!hKtzv2hxjX z$AUfCc|wN22_je!0$BIv-4$L$c%q^Y(`Ni}hFn}|oY2U?VNtX+Y94(3B1I)GAzB%co=-uJqHgc{ zv?JTdDRc65y+uxNzceIb1O|1eCtF`#&4hP}XT!N?`hS(g4qSbFHrU#p0N)D9qI-zl zIsn4HUU(k9Qw-U$1vSLei3UE^_KsepIk|)T8zktT>I)Ay?$8dzROFTcwNB zFB4zH+wQKobZPH8h)tltuWhWiE`*g05{Oz^)G3R;ygCr2IVQ7!{W$+$TSjHkoKpM> z;oGbb`va{KghTkB34cKc&yKu5IEUh@B<#!{7;hyXhg$4)^>-H{2Z^Hs`)mSn-Ts6s zF;}gQg(qtU)fZvIV^)DGE2+`X=%6z#`Y(Rxs*a|;r-=VB2Gkyl(UH^w#x;e8ccr+nwLRB?H$D;~FeOyhXr! zuLh`){Q8SO3iGUt{=M~Ywh5U5 z)|>)??loaiE#eudwlj9j#s|*n&672fYBn^EA#M?dezkkRNY@#3+r75oF*&Nt%BD); zfPKqUIm(4<^~E`sC8C*wy4n2F-Kd2>McY9(oz+|biyRx-s0a2G^xBo*xK|*=u!aM0 ziKM2@kEkiaOzBAO>$>dUX*SS$dyed5eO<7vT%HMM6Pk_pej8dG8P&KfAv>=I9OPBvf9VpD8`gdHn}s%XCE?28&xGAOHKjIwzawB6{M_F75Ik?>W zQ|&XQ0wpy@m(^TJDSsucx4T;L+RCFWLTRdYoOWt!4%~aO5dar~Man8?OaTV~)$wJh zS1Xt`8h>u`Ur<+9AJcYFGpeen!I}^U4(eiA^ zZ>L`;43*~&N6hUhEcu{kKE^K$R0b7l9u53A!0CS-bRpCzf)Y6UemP|;V{wxp?u&ru zOPONxTAH_5#IeFNftGUU!|lznUl+qK0}psw6_lPLg$XU_ipz&jxC@AjQlzEBV}-|y zGZ25ZuS{ER%ABF-Y;Qds$9br57T{UZfbMsD;@)nXt&{{DZjXP+IG6DroC-FpccCps zVL5Skh=~Mj`F9V1F_4w1&MC6_a!+doCW(>6fUUj(XD=-@EPo}5G1Y03b)GLz`k}|3 zrdFgQC7JQ>$tjIgr!ZO74t}UaSo0PnQLuiJ(H1aInEMr>Jp%lnUYz4yT$xSzNJH6M zo31ZE5z^M$CoMZ0-pV^n>~;g}R2Z~{mZ@GY={VW6rq1Npz8L;lZQx;kw|=y6qa24z zU`HR`J;0RY(n0GjM1K7-^L0t3@(T7vIG!$tAy?!2v`f z>i*^}jz8qOjx1Gdaql?+TRbms^XDxJNre^v6_rWFtM6Rng|7zll&MH@Em47g;stKd z4#L~tqROF@YwWGC*k91@s0A^Bdc;H!OHe;%4#+)db1FVe){5^;RGf3@y9R=EerOUh zPCb+cgFh=A)AIi+U)nQOnQX#>xG$6ad%z-Bcxk*E;p-oM1+^TvxF=$>S!zEz73suvDNF)bN5vvsj4K z`oVKv5j=9*ubI;2Dw(Vym z?GNbQ@;WV;I`0A2vANEKo%@lPmXDDD9c^rT_R&O7UQC{@GsUlw40c9N@4%J?t3_t#?$z|Z^! zOdbdC?H)xwWYjl=6Gv?3QbrYdTIIL{%zs8-RFqge$B(q0pSJ-r`@NV7B|*pjWqhM_ zulgtX*R6^N1(a?U%qD(^$ai|lI*}~o*JruD*9v`CzW}4eP8AS^;=R`CM*>1ht60S_8bTJuFxpom%b|uV zGQ;t~d)yBqxp zQ^X~GNbvn%jEUI`|M7%rdZjKOw&`A7)x@_D8yL-g^wvV7&AN-~$gr-M^rDJ#6y~yO z#o$`ad?=dEBvw>R=&_jAlS?-SK;*Mj@10_)q`UElzrfZKx2&x;OACa^GP*8>zS3PA zP)+EN!~5{$!%K=THTxa&O|%G8$K!G%wh7}lY(Bp&0tKUlm+Jl z1go1r;>~DymCpcR-z^a|c+SnG6NghI@`?+Od-%Y~=CO$7vtM^NS}l9K72 zsBGj^5Qi@VXR7H>_Rsy64at^8!&Ro6BrMWBRi1Ib_mY0_-AGBIibaej%_jRtxBP66z;l`vaG-kn$)n+0=iqOv=hl{SK%q zwya6~LJjNP0h#v;ML#gH_zZVP70~eO4 zH7m94v{VWh37)f-s53auzfGiyXB&@HWqUqE^1sj1-C6J?04-=?`s=uL;=c+eCppbG z%;#HCOMk4Y>?bCVx0x>#wbxdnhsP==q(-uFhk-(*WYl#3eZe<5@SEM$uO3!J>tyRY)wns?cpd-68r^VCHN2=sEBrPWRFi8 zeE%r{n<8<12rfPLRwo2X%ya+^ZnP}t^Tz(JR3jMMrdhB#rS4$B7*mDFzoCqc;mxH7 z46+1!Y5aNOnk4JwYHAB%;!KH7gzGR6IdyQD@4d*l)}Z3T{jx2w*lg0rwk?-R5P34P z_(;_xA#)$;LZ^EW6A_a2YVI%laFZ=K6)>o^L&Stt zY{qhLjeop#uS2%JNi)%!c>R9%O+&SlGRe#6eo>~Z0MPO$&Zg(LQedy(73)?=ouF(l!4#cTCb ze7y|wV=T`;Y?AA#4S0rzQuA8Vx^^=o@d^M4hU?gD??a9`5_t^8JdOB6P8LsqxM~-W z+<3IQnf6aJR6{P*C$p#e7shxX}?eTJKgIqB~7l_7yBQxym73KDnu1l&oYGJG|oOY{1O@DZX0 z>A;kE{QB+JTLeBKjGcMu>}T(94qISWwBg6pnGSdLd?2qEtpX%^KmGH`jS_pF9KzkGIL=*_ow&5D(w5$*U)cf zUnq4c@4T#IzIP<++5Hv-0lN=$*idivc)uj+@{!Vyt5Vjr((`L2GP&DaC^#$l$-sDf z7Hs>CKpzM{%qVfB4R;HKQ`+09Kp?L(xL^@f|Gj7Z2`BvXN<@=X88mD1u97OXy6*lu z(Vb5&9p&LqIH2G z4a}UUt)srvEdtIW5hUxjoVB)TD}49rEL%HLb@iy!AKi=3n<`ui-x!Un14Y8&2@dx( zL;QZFQoQ{ZchO7LlgtpfkTIX|UV0*nJ%srC%QM0l`j@v~YNozTQ?Sp!Z=}{Daht+b zHAj36c*`o{aSiqvaT1r7Tg)E^9ha(wwR#1wHg8<+ePA&ra>ygSEn@#5(w;SyH)=;p z^}&5EidP<*w@BdR`ckqS9rR<8^s{e15wX0XeQHBU@cq`ykY_LAv};0Xrfd?Z^UmMV z_QuJan1Kusr0gb=cc zp~umtI`&A-O9La${PzB7OysCmwq2(bc$d5X9f}O|H)=)7?l*KWV$noialev^fH10G z^5+bNFiW?f`D9DtPn+T;wBzHKythVtKHJh#wP_b_Q(lhCuu*=b4Pp37xNWW@{L#xo zo18#%uWD;x`(tyfR`5KvT9*%r?1$YKnJ39)B8L%O;H0!ubuua~5RoR?boS*Tab)AHgfb1?=WWUs*40+hJdWe~3mk+zh%M-Wx*!QI#Hqxu_-t@co_dV75{(wos z_$^haP!cWA1}NJ+vFf5%K5dFTLysU{T$rEa-;9c{`%f1o@$BBqIKq(T)Ag7^Fl?C! z#7cOJ)lbD%I6LU&gOI1f;HSc`DQrzQJLA({{adXtAt1$65;vbnzc31dbOm#ys8y=9 z;Zup-li9im+pwTl^$%$qKg0ihG|~6xV!eqrNGtNY7RxQ+hG4Rnox;?yoU{QFK~D)2 zUPH-PUuqJfCwFb=}3reH^)=s;{T2rIW!FnjmhuKgZO!DptRwZ z0gXnt6;r7+iCK6;7S{z#2g!IM#Xk7hmMrUU8_3hfM>0y)gahbMu&mnB?`YWT`eN|3oSrun>Br07#&SbeBkfizL zO8;RM+g>m?L0&!SaH&FFs*_}+6Owxhe0c|}o41ivCJKbnFisJX0xU1t9K z1Mb|PpaDBp)B`AO<>LX zZx5j&dgRmkF|TTPtY|CyJDu9e$H^pXBFos)>iwAf)(x`hTdkGny&u4Egc8B;YfhGl zhwIzzExruji?h5wy8aSL2)BQ0pr=`X?X#}5=|rWepKS2W?CfvqGi%zw%wJE@?NzkE z)>9tW%w1cxJ>g^|yG!UyGq5q)KErX;e0?(QR`KL`{}DFUqPIZ!Q{;{TvuxVj9;S@d z9j9+TxoSRDCvMg&7(@nPgWMtm4q+06&H0?5yEpeEEOY;j8%ycD@?35(qmlI#Z4#@Z z9oY5T*WDaI)*yPYcfIh$U)7?FO+PrRE_VDIcUrxL#Qh&;++99*Nu|jt2tGwVHP(+h zw&8gQ{(3uyz&EG?Mts3wCil&p; zAxoh4U>&-9c$MWj<@o9ZnuB&%y%oak-c1`qCo*YCyzV7A7#X=Qy~rUz*PBQz1_IME zb#`(V2Ssp4^zsi@q&~a-j^W>&le*aSCJAEHS|v-bnc7J<&kmbQqOQ%YP#$g~!Stx# zDE?H<=nqw*_Z7CkSGnSB#`o3F|K{^@OIhLL@A*TZH4K~O+*khwH?IEp*J{$OC~t;; zf54N%JHE7Sw_~d=?yE-k!RFA@#`*s?UCX~EoF(# z^qEWe-*1EccV`at`F8*PmvQAH&%O(W-|c?z+)!n27W#xokr#0-LT4UI^5gF}f30}S0MjdVzgFf>Smgn-0Q z(hULpC;%?6db;Yp-o9x%5qgxo0SxbPTNaP=MQ@gqVF<+vC2H`tJSmauFG3cfLq#|DY+%Uj z#?KPolFn!qsZ9^02V_WuADnkxxV$~Ty*e}uA>r(8EcfZk;5P>%8kur1ch9E=*-Axn zARc#d(|r52gR}CX*Hc%L>R$qe5LM^8{Y^Wc_9N2A->rv5VDAO6dy>DWX`6u^#aN!Q zW>4cRaT$ijeRf4b2j?yQ{>vsa>;B9c{1Fgfs_j$Hixs@D5|peHI2rmQ6eWR;hC{DF zWpPKn%@Pze=^uBW$xVbC=NW?|gN9JUT1Rla-sJ;2a3@AQ;cg@w)pt|+u?hktLueCc zK0U3(cFAQGSeoCegD?XTx@aUm&!KLY&ez<>;j>41wj!_PRppt`%d5;C)F`fZ7#_P| z%m@B`4shp7e;rgl5<8gj`dE7ubUe;cEa)TaS!4j^eh(yH`8BR%nR*$-5|-FM$Y5rx z9s=!q-CuNEWpwMAd_LhWhmK~F-HAELm!vgRc$yWN4?-%F`%OHi0vWR(?wxlzxZ^`C zX*`Gz5$JM0)gXKg9*8xG!7ytQWAjz`C<6kJ&*F^C%oO-cQ{nQ*0 z?%6Ge<>ai76JSI=2YtHqteSvCOiT;A79SnBzug?3%D})_dq;v<-E;n@HyXsD+`ZrE z1mPP3(ZpENj4ntEkrnxD`At0rUCOl3%1y;rghBf0%AQgx`;KZP*Og(7G~89!{P_co zc7%2{2hZrLZ>N%rr3WU(Bx;^FVZ1W87okCDez0YTdoH}y#FaK+MRq+h7G>WK|He(e zN{)vEA<;6GkyOpX(Pay6J0R(lJ)Ofj%6<@j2F|`wA}4UrijY6BA8M zXYQ0=b<`zCBK#WVC>xatuNMR_-7Z2^Mx0JK+B=3cw1BI7e|xUl7KnH^eP$>iV-h~+ zWvNSP**{P&P7}@j`12tasvhhc>j#6uK{yi-DEh98!%kOv&E7@^)tT?dB!O*tNE}kV z?08~^!jI>D`I4xraNoR4*81X1CUD5OX*!OTNX}lz&qNC?5m7o-!-2oytsa#n)>b%V zKVy0&iYIIA@pv*X*pm&pgs@FGHAXMQsqtXP@y#9Bqhd~QObg}|;Qv@F%HbD5py$Eb zz8}Y{usTRf=(1_3Qmh=QEB~-^LNc){i((fxRs^PIvdpt<|BjaE|IVD(8@{jC1mJjZ z5{`Qz747?;E(0My82|d^qLrzQeoo8&Zjhq$%arenOKFF6nGEPS^Gt?kH}euJtgZ@j zJ&TX{<$(I3>)#hF#GDkaD%|7^Nr(&-2^!tisRn9FU@cMBmFimSy7_j>zjkdKkonUz zrN|oeA3JvXa!i@p>K33t*2lt5zblvW?uMT4icI8cCEa1A>o@uW|JwRehaLy>s8Qo$ z+AbFp&$X13V^axkt{OnVsQWnG%s~++p znCo!HlZVc5AV!k|o5#=ajo!CCtLdMR;)@-c7bUSoCYgT<-KBaNBPTg5EnbnoZ54?{ ztdeDj0f}K&F@H2yp<6R^j|LvUbYUXf`W3PHYpli&9jMUGql(o}t=q}d(A*rP;&eh& zM9UC}$y>gAPTHop+12gQFYMP+(D&ViX6X-D7^Pil614a5+XO7y|mm8Q`m; zHMVYC=~v4z->#N6bO5I$HPxmht~o4xKX4>B%6=^VLpB=C6V^l=gl28)@`suM79 zdV6a=xkZ!Nj4lmMd(=` zJ2)ojfB!WN?yi;K6*G35zyqLq%NaD4d5ZS(|v7MV3!nJD~t-MJ}scvloR zG6Gq;vuSkLe)@;WI(ZUJmvNW_`^A6}Y$>3%0A*J(3NqqSYz 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 JNj$?d{svbr!`A=+ diff --git a/website/assets/visubot/visubot-app-de.png b/website/assets/visubot/visubot-app-de.png deleted file mode 100644 index f9c585e985be16fc299ae10bd54c15234ac6097f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271721 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≀X{Z5i&iCB6VA=Zp%BjM1bzlnhD8{SrTazUfrM$T49rBk#22gO#hYDENl9h& zEcGoZPxZTOD-7!DxnYrirS6h}kky~p({PSMQFN($FhypYJ!a~$w|kBOnWA17$A}D9 z%!@0X`R=^<>CWRh2sZg3>4`Z^e4Wovkeidq{p7o*uWuvRt9);nT*&|Ol1=AB=JD+cZuf;u<%_1qkodc$lt+Qj;@ICTp-CzeSlqMcM^9Fg zE%J+o_!~HS1kIWgbFW8D`B;7`HEQ}*p*D1OOa<5YUaIWdih+_DV{9#&@@B-p!-AW% zM8n%nA-$NvDC_-r>+j#a;)*hI2rP^v3s`(+kuE*+u54KK)rHUcf+CLH;CH*@*9`}L za~$Ho!8SJZikEY6J6O%Tp<0Ao^vqP9tCy69v~+;8t?R?$nK6=Y%Jx;`n07BYIF`UG zD?%9035M@2i$;Pr$Tm+bAZN0Of_9Cy?cq!tijF}9k%C}%!L*4K%N`K`#`%;o}A5C|C7 zT)cwj6^yliv47mM{Otrv;7aLX<=p3*bye6T!A2fgvr`ZFqQ0rAhex>OJ(nE&I3b36 zALPfmVN-$V9lzu~4_E2Z1+7I~ihB=IGe%yZHjQ8+o=Bje)aKS3y*Z990nLcGRgtc8pR+%?b(k7Q9`)omF(N##M{9odU466Mc|ifXb^>EALXc;1 zJMA1u%Y?7Ah(8#-X7pX0Yq*~BHoa`u4~i+?nCwU=10HGGRz+KN4L#fI?v^dt!1-wO z_)yXQD3_%}Fly`_Zft433&FkDhr38_&W3J4TxKUO)LdUm z`lMqf6$huIxPB~_+W+Ki1%VViYZaALK5x8eUFA%C_;-odZI~w`f{b&$j~;c5a=zh% zx4Zv=fw=TcVmifD=irtiHa8hIs0uf(EQy1SgwJ*kA7}XCQ*0zA+Eearb!S!G#eg`Q zM^JE?FCU9sSk(v^cx?HLz4vR2GGi@J+}0LOf0?b3%bc_`^I)?ThS${6A!2 z@f`=z8|^jz38rmZxufod30rW9*2>sABl4q2wHuRf zMf+p&#Kgws;t&lHA6#K zpky{?Uzk1m1Gss9TzYsU=Fai%e#6zrRN78pf}Fh;Op3*GVZO6b*X_Cz)$>YO}+RXb zXG)w0A3JXx^5es?fs#bk84;rE0inp`^RM_Z5*zYohQ61N#_P){E$j0){-l z3(3Bcuh%2-IM{zrJxiR!4!4Dz#AA<{5Dn#o&%@qj$YYUkF&lS3x6ocI=9}4nY;>rq zFc>;!V>$42=~CIsK$xEZWl~8?O9^AlLR?zHLptk#qlF!N?KROKVSMrX??KWJRXR$- z?a%ZxO}bHP02K~U^U3xITeE}~>lZCgxQ;{-MihG4EncGBQz%+CF*<=d|$< zdYI89!RTbK6uj%V^zq_QchD!C8{$4jHr&y@KGvZ>{*bPUNa66>rJ!!Yw>Uq9TYe^6 zrZ=ZgPbo7?zvu^>h_dtE23mCXtN($m&vA1roytodFo`u7el!bi;tmWk(+W0{AygFG z4^&WAKYp`ka84Ddk>&C9j{Z}z9lzbA$)WX6w2#I2{KiB#A8jXkTXAl_j!J2m?mj)` zCqCZTWYjg4#YO4Ho72z^ppOK9@B zoGQ4Q1-31rMhlUs_aMEzMZ3UIw`IlQ4Q{ZYDZ8Nazj`o?U^UX??9ivY-&0=Pa7gIA zc@)arQ4cTDj22|TOeZb?rNHajdJfu5xw*@({g*Sb&5q;{TKi2e{SOSULaN7^`4~U$ zAG6ec$0b!j|IA9SCldegYD>2vkl=VJREekGLosC1%o-iy>2IS^;pAiB-FH|*;2ZkZ zqx83%qwqaZ$;Ls9ROX^juabV3cVT+`yhYTHB^l%ClyR}p+bD@wHXR2Z5@EIM3L-Fr zjJAG{Jit;F&r6%rib8q@J63Uj${gq{54!InAAo4dWuKlB`xN#^ze%B|W)U{AIFvtf zxKI1^4LnxQ!N}Hyllrkv6t-vcS)gkN6(1v=dmHS`JQ8bDXDX`XW)gmQUo%11n)POb zyYnqB?!N+?At~_(2A#Qm)%$jL=$Ug&;+Q7eB(uoh@66p!Zw^VMqYdw=F@WJgPSt2$ z)yto**C>UoOd7By1o=3D7lV-;2#zMDpQ2BsMb} z)k=7*6nKm2O_JoQ#Y%`F^XPabLiAxg*(oTg^fp6Q?7}#S3ZI}RjrkuIPTp-#BZyM} zK0uYQ(`PZL^(kArXVH`$dj{XUbVAG)0z&K6Gz|VEy=k`Z62i)`b7cDfWj28|^e%F) zP*L`ey0Z3kE>D+}j+LKi3~AQQAfSLt>cHfeRj-nr0&2{fx~EPf^~U++{FNo{M$Il9 z3JQo`9w_3>!!TnA?n;xa<6s1vMtDtq{l(gP@I&Zhy2_fyg|N@Wc1sN=%MANx78-U-zU_Yi&lGJr+=?Ld2;;G zYyv>&0V=4Lo5GoOA55yaq@N5DL&xr;OZyfB`%aWx$b=`QN(9MCU`6MSMAogG-JuBK z>AE?~?ACu7>9I{Z!}uZUU_h{JE3VJq5>X)70J$;*UC%Vm5a5gu))ZW0_MK-HQ6*!Y z8Zs)jM9Kt&wlTFK`BWYM-h9zAl3%s95Dc+iz71}5^6<<>H_Py-Hi0HPE=c zLTwC7sPRr?Hw*}3SO?ZUo6_m;-}}cqL1|@(T>0RWL#~AJN<__q8aCI2CBW zz-WL<=%a=w=v!lgvg+amP$(#B#zfWCr?_3>z%zOgF~JqRz$=+RDCvgib)=w|$!3;u zFGhX2)TPD+2ba^-i2aW7l)K3ErIC%jOfeA{x2DF({~>##OCUL*YoGa9f*(AJzc9%y zEVDJvZR_IZXHeR}ttc-i<1(WAMnzV}&mhX1J6dIE?mNV#ZEpvCWVK7luO6J=GadWk z5%6S)Dy9BW&hW@kP(2F(mOmls6d}0(tu1PRPH%a-Hl3sv09{;KcA!Act!}3Ol=&p! zpC70SolLb6FUU{iX{j|yo5*SHe*ZH|a68I`V;^k9^p7tTSf(Esi2Y;E_N{Xx*tSBO zC6<;f;#r!4|7)_hooo|(TnI7m*s4)4X5F18!~w!@j?6EanjP)@96ey z_ODcoqlTW&Kj}5bd%XGqGKVtzR5Htvn3GN>^wYuN&LHH8CM=iP&4bOi^j5@z&y9=tf#z!FYDi(Qi%%VjP-T@tw#?aPqkK%tbPxb?<*tp?(Ok zjO*$cvE*LI!*|;0esOc4gJN8N`Eu-*DCV8#)F2X4+z3cBv7DSYpt4~6fe88T-JVAc zHZ`69-lSUko2YTzcH8Em=6wj#_h6xiq4Pt1Ol?kF6@W=Ec0#H!`)^fn<^|x&0 z(6yV~Fd;dr9SL`?gqO4wb-aimtuqK+-COV)h!(OfkN1vVQDnwq1pYOusXLWN-~Rf- zk1i+$_rGC88PtnYiC~9+TzM>x3)e+|BCd3=9{c~;`T(*pmFF_qnVe4umT34l_|qOq zig$_S4|K;$Gj1iSUVS-^vTaz72rxgSQmdS`ycb}l=(<>est6GJe;;&6V%f(Ml+4kiaKkWq7`qHs;eqdZz~+)%U;`wD>suxg*MD z&Uc1c#JTo#976ElO*kNjQXhjE0At-=+WMNeNSi%#C(}zMr&vVzXk(A+>A#yLj8c)c zOhV(l8{nPR77qir@hs@8j^H<#xBGZ>lVjx_(WSWEY z7dO!l_Z5kF!30%M7?gFTvqpALTG1~a-Ejj{#0$x7o!ANJ@cQLzwizJU~v6$ zhoR#(4?*Gjd=t57=26`5--IpK{d3%D(%UZw?LWluv#vP&z4mA5L*F@ylI`Mk!xQJj z%*>GyaDz_)PJ8pQ`=rvvUhvillO$Lv%yDZ8i^>Q+%Zw^gk0ZoyjL4!$toGxqR2DTA z5k3w*q7mV>p-JJ7qLj)Qn? z&@;Wj>s@NuzpGxD&EWoa!c1`SbnUU@Fb%_E(^TCAeJ%SXEnG^$hd?^cJ z>f~~kznT?O$i`Pf+oX%0h$j^PtEN!sz5!XpLVJ&@^6cF$g7lHj@*L>H4#%xg;ov%x zA-OKFAD-m%|IUYE^;EWyHZ<_BubjiDM zAJs8hfL{-tdZsK_^fb6lcW$RY%xORH#hsj4f?|*c6zye8r$=ha>f*nfuPIlLnt@bC zIrg#c?f1nQ7TUQI7}ZG=UeVwDxj^W27U;JHk^4p%QOo#EjCyu^!DnU33?5(Q$gJyN z%l{r{=a_@+;L~k!KBxuyTnJpZ^zP}nczB*?<XU!(A<7Wmt4aPACiK7-J9YI3LayOT_x_tppg$}tPDPf~o%M$@q46h_>4##yOyzG1 z!<6E1oHu!0_T8TT-zX^Icb3zxD8-jvNPyIFfaU?V`$PJhsIIe0dhx=%@iPc^|NAfm zL2~|d4kzQ2j6nYH1Sngejp0unYrsR$Dv9dn zWEY5BHv0X&AROcKWGxjGptryJr7ps%AHsXHD2PU?J+KlD2Tv^eDFmf$!Sg*-O?mQ? zJM?Ci2uP8A^JbIh?ZNLpPJL~Uvj{pSjY}Ey-J?AR$IE*&S1*=-VA$K^1l^8+)f2!N z$^-@+u%g5r?kQKdc}f7PyU5JSrl+y~clC(sNzV!0h z39faXjmfI>*_03Mc;doWF5{`5-H)wq2D{+>O^)}FAFMP5XbX}&)2Tnz=Cb;T_B z-okd5_7$$6L|S|Qf!^%YN~SoR7@s#`^GYkRVVrB-0UmUoJ!w`U5gt zQQF&J3}pal(;@1y-8b$N0_{DkaHK29{h?t>lPV;S!RzI~6P9f^-q>Ik9_+jfdlGbV z>UCW20>0_hO#X;kspkkr7^(YoV?y3*@n*7EL>@im+_~A z#!MTqP1>a!ta&y`?U%RV#Ll9nT_4ANeX;nwm|^Xx`N($W@jmGBtP;O_yd`kd9J2kl zt4sfUy&5o&Dh5aoVTNA& z5oKA7tZasQTTCGRgX-)#(-iew0LCj~N( zBaZH~icY7bI7xfMn+}4TI(ycD;*sNdl&`Zzl#9X~@6qnoamh^W{+wOfS<|q|tbk$l z>W+`;rq1#7!1Be%AQjD%s~GsV_CI9%ZK+3_$y46$))FK)GjkHZ<$HVsU%b&**=bAd zSDF*f~6GV98w8{qudyYsVykK^$^=g(lGXXYqijIa|$KQD3+QYsk(j?0YslUyb z&KyISN>cgL`!gMJJF;eRQ3AaA0QBxyF`GTW_CKH+{qs6Vv@sw+T@)7S+!XAG{#dk! z!24N+U1jsnmHtn-%4!?jW4>heox~-lQ9p1M4`@&Z8TcuY^RBwy`N%U@VS#~!c(cPp zSR(=6|G~;Xw@7Vehrm9#;-3<0U=vh$tM6o}(x<(e`fOi|($g6{!g{pi$#}J$}mTT2?J~mz%y!dLV{OXZh15J+zAbtir;KDu@Wv2t#utWYV~9SM#MAgsBVG ze9dKX6}H559WmzL_;83##9_x2Fl-o@HrLkMXV?N55U}xyGjZ{sF6b4_GQAXD?@Kl0rH1%_(;Ix&4nFR2*$*TLHD6s3Pk;WGr-QP7 z?!H*b0a(h^De-#GjiZEi4<=0DUn}1Btzj7YPx#M{QZ)sq1MW}urQeSCg8!+lE(YeC zlroo#9Lb=VO@X5x!&)ma^#~^d2`U0U;J4ybv#`RHDylrJZ;R3KSJye{-)t=dOaiT!I%G&P6y@+OVV$k;8rz2t z7s$V4W5qH}8>x*wx>x!;n`=L}qjawZa$;r!pzsg-=8>^x0J~pUwR2qyssc>1@dz~~ z;njX@=ufe$_&QZX`7^ifYJZW_0>k6i+e3L+e(N7Y8eHv$${`Tb(|#GT_pFyse8Ck1 zoygSnjMKC})6Yb84Y#e<&Y6)Cd~S>7{JRL)so8q!DU(L&^np0+H72VD6YZ07w-R8Y zVF;Q4emehr+q*sC-;%j{iKcM>+`>z{M(j+S<7vtLC!{2lq}T@>ti!PD?AsKLF8Z zVu6nrJ5gz+$KK=$UZs-zKRZ>4!+cBk>FB_@z(gcSwX6|HT_P*iXc#hQ;~km9RZN3B zfJ2p;>3ZT4Er3XQV;8@y6z7$}cgsVdsF|iZF@~i_^U^2xw6{mDSv}@XiS+ZE{+Mo7 zH6BeVk{@r_OCjK=P=r=~{UbDxPJlqN$>&t|&wKojVScGX?x%mo z&4fl(R5^k4S$E}0UjdYiI0Nv~Z7J9RP1@2`3To=E*FV2lAoLYvIxPq4cj>8*aWEe3 z93OjD7=kUT=Dd#yRX=@e(PsgJmPjb+{T1x-#mc<}!Z{wkYT8FehFlOjXLPEqAjx~Ee&(vH?tT9NJPn{`3&CDpU-y31w+=e| zuU0;cJeXUX22K=x8Hlm+O~XwirOcVsqzo$)ao|@W(x*X5P(I7jhr3lvPki zeNB#y6+`DBIbb{95(Ztk%-&q_#ZZ@x#QjQfif3PpPQH(%`;`}Q%f&8s4iLe#s${%Z zwzoOW=D%yOkiWx0Yv#F%7gjW=_b~(SoMeXX>>DHVKL+Myqd?=coLcL*P|DVhxZZ7W zg#5e%ydkdp!=sxx3u?Hn+o1A>iu%R5tC3PIA=}O43#(}1sD=c&GOBRHCb#e-_Lna$ z_kxV%$zI1#nvKUyYn};?Z68uS$lo6K-KpTHNRx~-Tsdrx7V&v?F2IJ^YdbkjsWI4u zo6E1uXY45hfx~Z(3RXk7IJ&3x4l$UU6Fe+WgD8ZZmRq9pb8;;ni)$tL9wpgj_zWtZ zOSvy^n3ZR{Y>hgBs2P_10&9P=0>^((Swu6cvhtufS|n|&SZk{IT@xd|2>K&9zs*Hg z{Gj_x28p+D6s|EhdA`Eg_uc_H^wrtp_T$yd6OhT6JW8!S-r@$kCjbq&782h~8{|E< zN+RW!U-+koe3sVaJEGF8r=X7^i_N|r=nz=r#Ue(@U|2firFkx5!h%!k5?&@1``=IeASb2sjU=aSP~PUK&eA8HAzkG=68O{ zW{=||HX$MX{rW50vSqF}*d=&|f|vWLpy^V1XUI{>#aj0<(e=&*5XSIloOi<}8XNzB zNprRuf)PnBDW87!q0M-}yyxrTK(b+VB-QC~>1Ox{bH;e4-(t!KVK&|%=Ow5-74j#KR`WG)MfpYF+!X(^eM)M0%)9`U&&pHxzZf0InN(sEnwhxlR zB}YzsiZiYzE4_h0&du)JZ*?Aa;nNiC!``=rYd@@w)dIRD-%bX71k2D%VDa(5B2CzN zbt(&gYrWqMF(U^|*2p-mX7}R#?Iz%wDFS9^IM-W3{QgH4AtoA^ji$y#=(=DU@=fJZ=jf;arLtQxK*;Y63579Pw`{ZJkllb_;8?37^ zo(t{*s7qn2Z(dY3EJ;tDn(+r~=kEijs@V#>d4 zIy?tfac9OCfhjD4Cc}!>{!`pui@MhvCvzE;A}1c+@T=vOIBUXo49I{5GwJcEfFxo! z8^rL&D}=s?56>1j%7N>M5k=0Q9 zVzc(%b;*j?wf>hpA43R_dE+Y>JT)X=n2|$MeV5K*RU#xcA(<~!QuutU|sluVLSgjdgfwo!jW>@N(_B> z_h=$S9aL#Q^5*<_W|}66ly4y4 zM{VN=NFwI3Q7`uqmx>du2aMD#sRB~u3l~%KhU&5)SY?V`N(UQJ)xs`AS`3QtN!NVr zKA^e=!zVfrH`~dr)S$t?+LxvClFFgWAbuNE8@F^fHHhpFen?MWURn9ni65*iOYB=S zd^&k{NP{VKtmfD`zZE@QG=M?Qv)NAtJQ%h`9I{6r7dsM`7{)NB#?A;C=bg-Th5_z-!DX?pNaCU)q(yU?`x!n`BrEvG4E|yf`$D z4%sHUwt7MKEP}fKyBMV*HB6XIsIQ{q)y(xtk@FpyxP1Am?|x0=Sy^J#zB|bZ^t?4H zfh7~yz##2cfg+kqZBbpHrR79k=O_ZTEj{|&dEZX__j1X#0o=!IzBX%f{3S;c7S7}d zymxj><<&S;vIS!ySa5G=>cMONj`ZmD-N{~gT{lItYrh6=`LOCP;I(FH;6HPk;qbQ?nxO#k#?J#ZQ{Vcxc}qA0F?(c4J5LfYNWoL+%zZ zgG3wJ1!jJs!{B1IlTl~DQ>l`3Z~)4f&kqM(()ql{fCRXzSvx_f*8KrQf~og2$kZ+* zHo)tBHTwMvZfx2YabQCWgY}2mt((v6&GAf_UmUj7TEKj6au+ebIb&Ao~e5&T=UgNOr z_Vj4`fqKV3Rh7>mw3QmYpmiUU#dA))v6unm@qu!vs3%lHZh4kXk2YVPm@g}`B#-3B z{Y`4l1{{cdiiDxaLr=JJOMN+WMtG!v%gI3w;|#!1O9@9oD&W+^rfay#Qw|iGROd5I z<90;r8+CG@KWBAB>D!kiCh~D{aq`jWcYBQ#;;$9w{@C{ces-EtS?NOFotYz319er- zvgd9+fn8ld>is&zR!?s#7Vth6W=Pg#p6c0T%+=AX zrC;`%;n{IU=ol)ZZz6qVJyX(cqw!0R~8) z&8pleFU)aof+yetfFuZ@ZO~fR&oR)nfTQE%XF;uPbPrC>EmfyUCmXiA6+xdO+v$|H z{v3F!Ab%9`+F*v{IDRVtzE>6{M%W$Bf162zvv@SHfLQ*-bdhJO-p!}9Ru(!t_R+q|o8wJz&&WaXs64WSe3)d4OnguVM81)*SK2Ms^i=;HIkQa{=*pZ|u9( zv7i``4YRps|G-t`p4@^UBd!>hL^^r|DJUzhbtvI{DZEQWBWZ$nnc2kan5c>e6i zr3r3UW}?FS8Gv^!fp6nFw0Sf^L%E z>A-k2oQ$w&MeyTBZy;_z+*UOm2{1WO7ICNOlXGpza>@!P=n3}AMoA@^nl2JtINpQM zvVT8eHYl@@ovSF`;qx2tbN6F&-F&+6P5-_g-w!*%TBxVO@LPiHwR6Kz1TaYuq8;pR z!Jj!b%x8E>-<^;gi(InBf^B}de`{_cda4A?{_$Y)rkl6NI!H-;vN1vitd{PzMGqjR z3wi$Im3GDQjzk<^&w6543LL~gO>M34ymeXEh$Q|?K2RzT_6r}jpFCW(;MAK8V(#9? zx#oZJ`2~}zde8;BFTnb z%kIDqJo__8h8|*^IQ^N}#!k6;aDcfj?9n-yN;d1}X%yONyIC*Ia3XdP08;BeM=5Fe+I3x93L{CFckt<&G%`M00gC{ zZ+^F6DK6b|_W9$o-Aoyb0>YBxS#hT9+9GEVyf7L?sRIDVtCce6@kEZ~N0d4g!d}a* zouh!rSn#~kNLJRMd;I|yk6^`pPW)HTGSMKYSAMqSKTPKpxQcSzeN#3;x$S>)2tcCl zGEAUk1{toS@MQg^NU%{Qn~vSU9gU$=w6A15m{HJeYTU)2m^Rqa!9RbXjqHWl;r3=a zJ}F1sKJUM`vN1rrWrhK^YKhm~-c&t$5443C`kI(F*R(h8?cvL(3_J7Y2whX@G&^c) zY4z?mQ9*(vB!V0$&Iig5)2Wtwb>25$mzhkRQL>i$0Gv;=czh6~Y=woS;NN&_ua1~x zH|{kskcJMWz)8-JgxqUF$NYVEqnl4Xyt!>~WzapBmgqsl%-&pwY6y-u3wy8odiC`) z#q+t%_iSQd3ifJ=bvJ`gzU|nGK86z4qRJoGCdyJl>q5 zZqn?QBjWo1V`^Dz%O-R+b!-g;74@#0F>$HF0QClU$W3+_EjU;=n1DrnG!8Nxsi^cS z^ENdRk?nd{aZT71*b6!@gnG?qRb?I&oNF$D)wCUDMZ-40ch69fgb0t~yKl!dh&S$Q z4qRhoWMtClW95f4U;se-fJYTV6&&j6e=-7UT8^hrO>gf}pMr?0@eIkBON7P?G7aFM zZnz2HOdUir>v6R$aNq{DXOes{*d;qd(ADSw>AW^lbUFI%7*Bkw8RqMvb`k_@KHOpF zvc|jI_J0kCItFwf?N>TV2I)(o7So|oQ8&%(u_;r9ufjpQgAQ{wsIG~=j_#!-$z4wX z$+|9LMwYWHYtRyaZF@*U^5zRGF=Q0WF}0xfuNpC5LqFrCwH|8U7rvmK>fXJJ;j8LR zfCJKHFeN~`@V?Z> zsR+fLU)Vf7U8w>1I5I;h1RZiSn(jMthVnX#U0owr^^v&cUYiL+)-}BJ@G%%N^A3Vo z#|hlogv}9-aPsr+7Z6&26f=Gi?nRXcr7ZK;{V_CZ#nqwnd%&(M(;rN}v&MrUCTx;} zVNC9Zh49_|DyweL!GXE#qXEaG2#VSHJ_~>j3SJK<;P}a-y9_+~no0JLYB4YYbYCD} zm+!m|*>2Qx>HKLA6hi&rk-htAN|HCTE~M89^z8>;Q;VV0jibnKiXtg|z(KNRdc*ai z^>i1XI5MO5w+;6rvK^ppW#=B$$l>L;gn2gQ6?@NJvmnFsd)-(zlVb$mg%6(0yx3gYFUn0z3+K z->#jT%knWIxs?;q2(RUr9GP2mAs3c?h3%+r^E-fmX6xVSg1SkR0Bc!Peewm zT6S;@M$D(W?))R`XN4JZ<5YYS?i5gcwMJG=q!0e-+0xeJQ=n9Q*US5<=u>hQ@Hg-5 zTwT;LniO{iR-URV{olSl4V(6a-5uME8r|Q0e+RA;x)=!TIU8e>6D`252<5W@N}7wh z#l)<%9^RfoAt3~f#FLveGERCvPUhy-H8uGa#cpNHL=(B)n#CHr9v;$loC`s?+RBe8 z`OVl@QeH-}x=~k@JLBW2tPNu`aTNhesQ8@9#W<`eGu>)SrGhsdJ#SJkrlOinxJ$uy zG%vs&9$?pX&^IQz&6^Lk5;ukpSy_YY7-gxaQsG%0(^a;5sYf5y-zFFO>h8wr=A|XD>}d}3>}9NBB?I$G)LS{N#n%_ zu^9lx8e2G0=x(8Ue3fTO<|+8|_TgQ?6j5!8Ke$&hHd-ljP-6cXSqu2u`0oL*=tNkw zTnJZp`JBiqR_3R4a?N*K7v%sjp6U)m^j z9CGG@rIyf{b={RmAhFv$;GeQeG)X!Zm^0y`)h>7#0IyZs=Y}4Es$=%M&cfj}d^Y;8bY&%y+(PYPh z6yQ2p$K0IUN%sF+rOI_duL_mjbklbEUB`DcTCobL5^QR89Jv*vISAZ90N7F$DLi;X zEI%lB{xd)TMH<$^vSj7$1;0=wAamzXjg9*xZHS{tc{dx#ZB6lj+_q!n>t{Rp2t;SM zYmlS|&8=_~#Y_UYE39**-^+9nWaHh?P*`RKt2nR%EzSoq(U-DI3)U}FT!A*9;JEnaJ18|`K*y?_KhWSw zgW8{&3o+osXD<6#jf}*A`GIu>U%kk% zr0yPQSPRR3X-D9yOa2P|9kAl1Lz`PH#3Tw=KTk0m`~E!>aIU&~7663xR8BBX?obyZtTjM7FN&`4En!JSY82OsaX;qj3F-J-SRB zYQD>{(J_!z|78Reg0Ik=?}#__ja{xT)0}m*3fq&R6k0|p6FNE-Hc<4RtRw;7UJVv9 zsd~5Z1oD3pVULPiiJ=`ZX=XH2n#z9qG?aas|33vAKXy%^u}5tb)I3H%$?r+A>0hY74S?w$%JIRE z0$zNk9oon$O0{jH;N4x)#C+J?*5K6%`#LiCnP$3i3d0iQUcb9z!#>phSAd+oq(o2m znE*Y)s-j~M66iipZ?L(o@=yJh{sk8-NGW>>(CgkLq z<>i?V7imspvOU9es~{m7*PGy$e<-vI0t{3Z_Yf6s7kQBL3z@aJvq+|rm0 zH$PL;B(MR{(%J#d(xCn=e0zV7B=18tMRTt*D7%<>e+hTh$%%Q4B-cyZM2$)EP! zrn42rpW0Ryh(aQvlW=1bE$SRNJ}->s$!CWfJPm6KuJUc{(5VJi~NU5WJ%IpD{b35NEAgQ0;;CV?H zCDzG)yOIPz!@xeDJ~<5!d|bzqs1q*SmN#+%tGsi#+n=ZP|3mi=hnH^p$a;CX&5Vc) zSuuh%Tb@j$a`fVzmDMsRJo?H(6F$ICGI;$yRmX#J5x_=1M?4u=)Eq1V^wGHe|C0s~ zmPV9;P(__kI#F%}zpi37(DT_Vx|C`XsI5r|FetMc0E!}Onos{9Hol4uko$1O?G6yd zD4l0p{~yNQ0;;O6?HWc!0Yzy6K^i0_ljT@2 z8cXv`7&y;fQc0jEl-y#6L;4L&|5W^p>q@V-)Ah+- zkZr94PeMV0sC@Fwe zs>xluUI->=EJwHglQb-jE)>t0=EPw#`ca#EVk`3A#|}V=;`d2&20z-*(aqp>bsw9_ zNb9e6qq*gr@-wDY{;8P+CHzWI0D6EV$920Au7W}(kd){EF@^i4?+H<)I>-^{-L{gz zS%jKoppeE;`PLZ1u9>qR-40y$i7p_l!k4=bpmjMN-xpRxXFDrQ839>{|0c0vtN#-O za!ma87{nrBEiYXcT5z;?S}ccRcS^Nru5%NBF427Nd4YX4H4OO#zrsi3pr;xXS*EJI z_mWo>fq{jW;{Xign(ZAt91|_KRBCi{P-G`9QE$jm42sWDaZhit8wGMTDd0A_SSQzF ze((o=ezmZ9@}2}AZL4u?) zsxv(k#fE=Dq*<%7YG+1Wo6E-RsR zc7@NMz5>`Uc=FiuiPgtWgR^2kC+_QwM{2Z3Z$~++pA9bqlxwG0T&HxLA(7joV^Qa*tY;Cg@h z*r)Ww?YtWa;EjNmC6mrUKX2gt`n?6J)NJb9R|2+gw(soxT3Y)57ckkf{dMXS-P*)m zpo;}a|5y8kBV$fJ*!;{*iNv_m$Q3&JYO z9fBG!9J<49IkIPADgab(X5$!%L&l~E*{|$ocao8|?<{s{4*2v4Crz0<>pAH%pz{`Z z9*$t0l%B3zS{pIXU^Wwzy|Jxm~A52dY5zd3$M zSDhxucl`r*3D(*EYCIB|(}#?Wlz9bkYEVf3MXdLZWY94+=+?RhE1*FUwttR8xYE$o z8^#(R()DLVc>)oihMDQ=0F8d*pG?vsZpb;eSYSv@+4S|4=emM{&fL+aei~OMG^?Jc zfBZ4ZJ9?&I4qDpA2`*?mmoI6$g2&FRbxA1?%ZU34ld6H*#;TBi>3p`Fl#N9YI_a;T zVQJ*<{+4D-V9z-!!j=R0cfLC_{Cc}EK+pmjIJmEW(S=SOT{omYN$KkVgvT)p)>tdx zZv=3Zv%{rpAizbVUnY~{5_M*<-GyPx6?EAEmYGl&nX;vZDoLzNP5bqr~LM;rTUNl1Evh=cA=;D@{0I!criYb-x| zAAwfF`JDhjU6WZ|-9fy$1s)`!ipY%Mw6`ms#V(G3W(N{+XjYl(Nk)s#q5z%mH^`^L zoNuN^(_7C>tta8b!xgE%j_gH2nd}nXyvHq`RI=ALR~=~&<~OUr$)^+Lg3KNO&|i{d zXtY73QDO95OqXQcC2TaQS@*QPmy^F#^X4R%!4pVOU9?%EcosY>I1fDXV9hOqj1FYLOdB44sc=_i8N z9pultjQfMp&K4yPVy8BsGfS(Q%Rzltxufk0jmJtxE<4#hL>gX^!g1$JFZ{3kY#-Jhtu zKt2Cpdn^R{$H2=5<5n2rWwa&P8Q+xv~?6N#dI6tm*fz|tsKFxiP*#q`Uo zN8vWJkiDPohCsdTCsXfvL<8TIm6$p^2KMsKy8hJBI9kn|M)u$?h*DE(Hr)$v9KpBs z>k03vT?Jo$;&|hr=J7lb1@|;L++w62i_;cWxT$a$j2F<$05os^$KYrE5s**6)K*b} zey!1|ZRefx-CYLH9WX&ND@{kU%*p2m9KVd&ARBRABqStsAq9muPoBy5|Ngyqa#Ea+ zHy7%;V>A5Cegsq(kVyfxAmH;zW$zTmc*M8{x5w{ zNWyyMTeI81dZp`od@TAE@J;R_V2e9SDPTgFzllHeEEdm;WB?q*&hbtuf`Vf2B>7!9 zQcB;S%ZqHeTuREksGG%Eq;1R6ak#=T3$c%tAKk1*5kSDytG(K$ALwpguQg3AtmLJ8 zpRf_yUI%<$k$QzgxQgofDQHMVU}5mUiG5&g=Ve2jebvgv>>1b#-UmH24}%gFFVS+|wB+ zl)~DN`?rO`9ym|G3KEt%B9`k+B<@Ij)`7S_=k1Y=b{O&1d>hEc8ZLozpp7mf!0)%4 z8u~V>G@lW1i6WbiRqD)g=@WbL7z36Jkc*sw<#bk+kAv!dz-NE)g)!?J&Ko`e;gO@c zUV{&^Y%8lGrmP(*ZYOr`>}R!5gRRWXR&6?Zh`D$P{XSCt^!WUx`qkPLPyfy(Oz#7` zz&_}{F)o|f9nvhIzJl-I0g)?J9iRKHch3$&&3SE>H>xNJgg1S>0J0(ZRDoIr5G*=h zQS>J_G=dtRNenaS3-G@&5)BCkCaTAI#_*_&;J)5o^~)t-0I);dsRB@>YET&`@9e#V z?+R;oBDT^pz?LKyhwEblgVaYtaF~(f}#Y;OF?fcD>gM z5X_4;=l42XKfFbsP2htaL)+7?^d>jJ`Fe-LHeI&;A0I$#(BY|XYn zpe706L(?*5Il!uO98mM+&j9&J{ml;)n7&rNfwX)^6prVcTHklLg zDK$0X83{x;+ZRs5eE` zz(6oebagfwAP;CLb1yG%Va+&0VE`-=1B5q|SbB&kSvoLeDG(9qB4MY|qw&J~$@5|& zw!=98;r|!^Lw3!m($aCyoyN<)-W)*boCaZ*E0C220*$($8{ue*0fZ8__T_Mtwp3>n zuSQ-N^zyc^VY}`IM+mteY?>E#^OkKW03%=C<_$VWBb)}HQchS)Jz+v6=vwI{hA;l! z=CRYgz|HV=>Xw7YUsgsgO^6fModDCntyAvY8E-DDH9By!xB2Zh>AcfHCZ8eX$d7j} zDJFJoYG~@q=2AUqhWBQ_7^JD1*2nwpyUzhRf2|0W2ybEfyI@)kQqvm!IMZ4&u9ZtC zh~_Ls13uordft21tL~ruz8AD-CB?<1#Km!gxalD~Gk`>as4-*aQ?4{7!>P_Doy!Hl z!;Zh=_`@bj!t}#+uSQok>9`HBMssEM4i2g(36HYKA3sk_=kQtM7H-z~ZpKQw{3VF% z#Iv{)Jg1fwe8jwNyA4Z~Z>T9a7P8TFUDIW9TrA~nnAqSuc{(|5B%cK?I+XeS6 z?nDDaPdaYC(_$D9az_Fv){v|@xirK(eBYJirnQ@jSW$8Y(i#@uIeq%An&*C zSEUtgKmE0|wm^&2mW%i>)!-vx<3_)nzs1Z_)rN^_`0O@byhL-m#~&g8ngnq-w_p`W z7UoPdG6hwxj)Y{fG942S{V8DXc(J)0`*UW@I$KkFcbAtt8X7Kv#R9Bruf=PglhOUo z6wX6^5WmNuC+^ZhuO zgF%{=KVe;d@pdknQRCp{2h#L4afEz%ClHy#tB+;-kKkS|xeRnY8*p8GVgevvEmfyL zM?Yk}Bu(SYVRh!tdGABj%$eIeIjQ~K!!dZowpYuqe?)s2YptJ%4t_~U+1lFbe6l^= zHIphGzY89MFDfn-@r}9|}dOQH&-?b97&W3{65`0ZhX$UTW z1QmSQ4xa;qLJ2jR9<6#WN*0!pqs=#@-vGh<_vSFzu)!BMP8-V}Q;No0+xOiBP2L!Q z_2EE-2U^g5&CEX6Bm{-^A06#k%$KOwHB{}!g)K?yXg*{~iHP$G_^1d*yruYpZuQ6B z0crdYTt_U?_`SP~1g2fr2^^I|UIT#^14U$O-`FC-MM(GAK|8 z6g1dULGhQ3rwC_kb`EEgo@OBL&h`W#^wrs!d&}|f;RD=~WL6jq7{QAP+#c`iRAxEF z?6x&E1mK})X_=VS$~LshG|D)l_AoI_A(25SQ#e_VjgJ;h`Q}_(7)p+kypg)Yyj3$< z570y@r?0T_l4c3d>WZc)r+2-$2nQ|uFP_{|(CsWi05XKaQ|Ce)?M!ezcd+y4v0DXo zcQC{4VQbMOC1hn+x8@(mi3GJr!{>xu3n)TWq)PglI&l>x4;(6x?cslxA&}J-hdjYpE z*88`zCazE*nRxVHP9UJ~{rT-E{Cz0_OIk@_<^u${s(vv6dEy4mw!3+K_v?HNBXvx~ zn&t{(;8fHV{c&0!FCKFvux{3$BV83RMMh^|1m1b2ur&ySK5@|TjrO;O;wMC*?gZ0p z66^yFv=E3*;&d_Q9Y5jsF)Vi$Xk6@f=D`0Et;r8nQf_D33jN6xu0s4Mv-ap6W=%N7 zZKwbHNw&*6_?gblh2hn_ThQP5#k@qNM(;CQF#-^k@J~lathm3+m6p|Y>ZW$@%QB*5 z0fcsY3@GpcwJ3$0Z$^YXZVo_lJBxaY-%cpSZS%AaC?;_xoGoP2!1_C}gh1DH)79K* znOli^ z$_<=kINe{#rMbR#Je-*H3X4EzG5>u6m<6Y{<3l^RKFrSNQRVd9gp04TO&U**dyq~_ z){&bc2NH z_4QNwh;TEkDkcfo@+-Czl6d-i%E=`5lPYk5hBg05S8f0NXuQ=dWDvxCw;Vt~39K|5 z(*rfxsl&fbG(+nFnAHxd4Xa>3pbBUlfct6?T>>`m+1c2iHl3rRqYY5!0gUai$lIy! z2Z_X_mDuLLpZr_3P!pl{3#~ntP;oMw;GHl^H#8%PAC~}hmF93BsBT`Le4gE&I3AzF zj3<6$q37W-<~^(93))h_zCjj{*wKt= z^l)X%)4-wmx@74`TWHyXdR0>>q@ZBhD(FM+d8Ax!lg4!T^6qIvsC^TOOYPiA&v`fb z-FV42VwH3xGhJ5C_ z^93m6JHe;Q2FBde(Ho1;5BTxTz{k5&&-uICr+L;y=Rauiw|N1_viN%kNEksa zHTaJ$Kstbrx9gZqGY*(-V7r@|pZB@x0gV$T(pR-!g_4rJlmR1;4`|t-M=#F*xIOqU z0^zwI!~b6bVa>j#dHA^L418iZUxXZ+p+QYAJiIBlpW^o;I@az5;fiyv}RA zqcItg9tG_;E3jg|ey&4caP3%JIsfhmM(Vl8iYcF%V^Kf7q)1cnP%IO!#a1?A=Q( zB*fo3RdKJuoerCQsbTQQ2Uu<&VvK7VvTcGIlBEnDqM@b&n9{c8rpl^45ZEt#y~hZA z7s?z;CF7OH#qWe$5oV~$=~4WN?DNsHgs~BMKVmz5^6Fi74y9LwESfmiM1siE%lAJVUiPNcMKOJug?q zk$MqlrBoST7ykZ8IK<7pG#V$N#j~W}P}jrxYGC%ooe0LVP4UJ^rtzoJ;WjIe_4aMX zrirUDRpS~7zGku1yM-M@Y?}5wr3xUb>$I=2r8Ab9QwkFKMmhf_V}}XvA(~v1PXCkp zL7N9py?dGcf2n5XnRdgzwpd~%{%>VQ+BGmM3vF|LCJR!{d|@fdcn~N zBF4;~OZneQH4Db*Yb?IDQr9YDD4hINHqQ2Yf445x`YYgsytHdTgQE(gP*y&!RHUnQ z^sG_nSSj?nKV_3(EOB(m^0hXA4iFQq#(=9QMW)Hqne~{H&FW2laV(*HEAh9XO{t2L zq?8%Gr)R7+7749gQqj>FFag{;YPzjSs+;`WRM`4l|P)Rgj|c8 zj;kap58|EaZj@LB<)$Y0mh#-1!ef}ea^|hhEJ{AjAFj0YakzV-s8EhoZOp4uUiPg{ zT;#}Bh0=A15$|=w%0mD4Fooa(56=O;S zMEF&!iF`0U@(A~SO^_|2hg_yX8E}6)ws-W#bcb(gDZixULx#C#j`EJSLyYGa&(@CG z56pO|0nfQ8NCjwpkqan3d`7xYdJj{G1Tpx-`-rD(cvdqJo;5}i)kP*p_0A^S-a17X zp@k}AB`)9QPqJ|vD&DwmrzdImr8jwQpCslze8^t!mNc=u`qD$w`qYVvIP90iPRFoj{*|M+``|H+@tAv-BJPPD{iKk@yMZ8P_eNRZYo@K zdxN1)U*2bfdEr{FteiBxesJb=L$VkAZe;xKN|1N6G}=%D&~p(5mw$1h!Mk}V)&CHw zet#u}dU!^_eJ`R8iE)9IJUH5K9x7Zqpb0^o>}5q08dOfL49xyBSyk(%snysAANA6i zg$%2-8wj7G(xnmfnfI z48_(D_E{Rr^&O=MOnIm}J^jWp{u7IwSLJF=g@o z95o8L;<~rxR3Fl1Q{!U1vKn9Q40lc4%fuhc87>=0 zeZ%_a_#}n@`m7FXfceP{Niz8qTeCpDoWyTcOr(ZmMsg^+`Q1>h6~2{Gj@`|u`eX^| zN4`Qt){Ulr18uV?|8=hDywXWI-8|1OilRZRyM7Z-&l@|7%=Ony@;0E1VUq@IqhqWVH=0y4TgPwTRs&Pw z$mTOI3u|pd%@nLxZx1KOH@`3<#`Ll1nRH@GZNEMF5Ea~&+_I4J$$j`}Y{NE?Uy4fc zTn)ZU_btEj#(k+mB=k8FhWewvFG~)=U0jFd(5+N!VMnNvBlIm93k>@Gnf63GR5PeI zBKf2+u_xn){hc-+$O*pgk3+Uovo@Wt>=7%+;TH~9&&ZNFvwv7@tp+azcEm>y?KjSZ z2L#~VM2ChZgNdT$ys{a2pH5W#w`^*D%jOXNwKy6feL9oRFV*Q|<_^Ym&JV$3#q-SG z8x!BYaon6&IY;PPPxISCW4qpQW7N&g6;B_Jjk8}6%gD(A^^f35uMMxN`jXQ5+To?W z^J&Djm>DEhbXfcc+y=B#3NlVM%}C;b^OZNbmCW(?-pHvqJ{NI3#vZ>$yGl_D>WymI zQ)VXn5*)k^O}i<$=`X(KA{cz)L#IJF>Ps8kaJ+Mk==9Tihso6YtRD;7kV(?ryz$_R zVoRIy$sUrm_PW<}AWS5T{JgxgcB6yij%<&B%nRi-)mK74-h4^fkw|aY!Q!_aLn*54 z9lri2=5))I(L6&=yT&JoBJ@peRE0~;+^3R?((0{>>0)wm)Xj61@Vy5}Qu{&69UWq# zVpILxdhScB+B#9T=apr9_RO*go^2gzAU;p!wKRbF;)Mgsz)7ukdeWOt&En^c9bZd_ zGz&*JnpS7buN%hn6R^Hq?9wWVeXw3LzWx;77zSpA;vpwS_ud0c8{c_PC*gzN^JX%} zUt+d{lP{iBRp+l%%sbmu@4ME4ahR?{>~v>;n-hg4jnPL(w5Pna<#D5_!vDH!HQ&8u zF}cS0Xo=(N-E2qKm_cX#%J~IyUc|=z3@?CG5S;_|3nRqus1&ghVgVjYGuL_p!|ZCG zs-18+btsSX{+eTr4}WE6egrskT=Zx{i+U-mnhw32Tm&OxuIlqOeqlD80~yW|tnnBn|H}72Qpm za~^}A#j8aUbL9;2f)yc-Cz(+p)D}>3E$7kZ@&Heb;C%O$(v{koF7uQ0Xg|K$Gj=2J zaGRVFKYe%bTlbBtRPTx}2~?Bs=E1W&Q4@rKXRkUEDMErpqC{iu1qFCK1NqAcu9LLY z<#~v3m$;s(|Hy>f%Bf+Cl7)tUPt)o7xzotG0-gc#_D&?!uJEWR6sMgs=E&D2lS4yP z5(eVV&&c-2)3+O;C9^@G!QgeBTULt^lED1xYps`@SA6i#btO$Z>ie%9wsgfrwuOnY zh8aG>+4E;PKHr>k+^0DlCn3KIhHA2=1taj6^PXY4Nkwk^|iN@00Z8flrYwRA-4Yx}8ec z%L4=B?-_8W>{e5p&c72CJFqjxTZP+Y^DY*X zuw;p;89ob$q_va`Rysy>pS()IH#OCoH(~YU;p<5B?K)nUrZPS*3IXbBTeGUzSX*mi zEH8hk)voRlOIi+*>c0T6}w4iFcPc16Fn-k6w3%m+x>=qS6h zcU$i2SQh!+REdb-x{?nY6%k=5-nwppK*q*c)3aH_Mx{lHi|3_9)zr^qWNE3US~*Mk z zF*@P;P^l3f+p{~2ZgK9ncjM}f5`i_sOm1yrjO+4o&yPt{v)G${RsVZdc*yX99!wi= zabEj{U%IBG7k4tH2$`LnSfZ`yS0dU^kmdYI>{xzK1o#W2{w&PCs?@5dmr%@$3<(Q+ zO~bIWNL3GQKDWr|rg%l!0WQSl`ry?ktVKf#iJ9uFA72*B4ULs8n`ca_(&04>Dq)usrz)@SJu*G60X zx8k9aj=ksRKWpa08&=)9tRs<&_wc~BK5u}}!}#@S1C+(h=4bIvJ}Z(O58zb4up|8Y z)coRrB|~UKX)Zk>=U!A;lAi=PqK!YTdz`}Njnw~yGxLU1NyT35NRUe?zKYsDKQFf4 zvfg@4HdSkWLW2f4ge(jUKw}B0c`X)NUz}_LV+eb-YlNCkMR|G0NVZq9cy;!}CBi{b znDQPTL!VnYQ);%iMmF=o##cQ5eb|?sm$yJ~b6}Vt1jIS1Oa?%O4iwdhxJ{_%o_$3- zh_f|?J{lx~y}m3OK0-N&wfX+6X+*KH+AwKON#$ZF>y!WpN^W;&5o#=z)%)uD{&q7Z zvzXrt^qz^ZAHR;^V7ze`8fV|+5{zx?WE*dCII1&c{AagESn~{+OEcIXxK0*43yB^{ zn^&n#<&!n4NjX2paA@FtT{DhhuIS-WK2@z!+D(zfz@qaA-C!%_dhWC}s&?b?dAf+Y z#0%O^6RhExPZ^lQ{>}QI?G&Q-6^Z%q7EfT8em`CS*(erJBg2sPLm zYESIX^PJH*b()*pcC7Nmie|=PLpWrliWzA?vA&7Z8J~xx5X{QRlqA;bUCC+>kJKka zVk?W7qL>UloLBZL!&7(p@o9Uaa=#geW?`>h6_wCSy_1YHrtG~?SJWoLO2E7RI1h(I zwp@ZnP0$W}*w{vr`<{CSkiP@AUlgBXqsK;%zj&d#suZ?cQ~~+z*?PCZk&PycqqzZV zzB5swcGXO?&zCU|~VQADGrEsTwC784NFgTlqpT>DqTg^@w7{)nNF7`2jfn)XcCO2D+ zjY^_ttGYuWSP^}FTi4UVfkv2Lrnl(mxChICPKCMo-t!*(+fW9eQ%MYY*h30w z&v3{&cDr=I=VLrUblI`c){rUTy+ho2l$h%~j|Sc!Cd{yBFQr9P995C%y{e7|_M@s# zZRgz%C>3*2;cjbnEj|+y10MUwPtefim6fk_uP?7@7?xLaW*p#+r>FUmls$YihwZQi zrK4pYZ94wR__#Qyao&XXUm}=;`^G6J+YG#hrc`qH9>aZ(!TDunTa5k9x|+iydjp5~ zuPgqZF2Az`QD}Rg(mG(FXJL$dIH+!+z%16w(K@!{JKTymBv1_4rlFm0b zXfQG#ru$9%i&Y{R;}}7H!STU%@MyVFFUZsxw{NK&WtK}q-T`++R+q`jCDv=(S%-Y` zd)|j@A(5L0>n6|_)@*bTNb#A0tGUDxL20Sa0+Q+l@wwCJu`*o^hP;7-w2zO8qTUcczedCLqvhKBB9ArJscW|ktDQ_)>v;%ZKlsjF-9Y~w@3%;Ui9~pa# zLtJ2GWfc|?K|$tg!NJU2UtN86cm#to1cz2*$%_OyPX?t#Vk@5~aHpl?^wgjae*ZH$ zf404nMU5%H_vLrq&7rKfch3}S1B@||$>*ou&F{|0^xYlf2=JIU~D7nPFy1ohvp=M@2UtXt`5*exEW4*mNfzKS%)Bc0>hP^Onsq#%LGQRAwnJ5zL2Z9x9z1!v*fM!+&-}I41<(Um9j|1{2pG`y z{ph$F4=lR)gl#cI24h)fRI89O*EXCJH`sC_ zP(TOJ){OgUcivh#rO2{barq! zFXOs5_}%zXrf>xWjEA@L=}-^V_Pp!J(q4D@TRnlP+z2Gu`HQ>^8}<~Oyx|J{tLBl) z(}tFcftJQq5iAT*5j8B#Ebh{bgoJueReMo)ZPoPTtgdTLv@6=*a5kF>IT6LYr=5Ri zaqII&`pgnb6-|)|Q>iOq)K9zp@fOK)%t@3I&u-k2AAS !usF-))0Kp*7!?x7$y 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 diff --git a/website/assets/visubot/visubot-app-en.png b/website/assets/visubot/visubot-app-en.png deleted file mode 100644 index 3283a3366f74b7838282332855050dc8279ec90d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262117 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 z 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 diff --git a/website/assets/visubot/visubot-app-pt.png b/website/assets/visubot/visubot-app-pt.png deleted file mode 100644 index 0ea3d143b0aab645ca715594cebd958cf1602793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269868 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

    seyZ_csJQ`Bi(jt}q%~phgcg1wa$2 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

    {R}rke4IQ(5fQc~EG>~dB%vr?!f90t``k&k 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 D{-gE27f>%bB4VGEPwd&w8~DooHi zcun6jWmHt&hkn6)h>y43Lg>SYCv&)=TDrV{d&?jG?)#4)re6*bD=Q82>FKlS=}mjB zd_o(O=KYcXUVUW2`-1hK%P+cLF}VM8g)#Bu zVJ6V@f4?#{Utv7^=K=$xM&dj37v>f3*L-?T+`5Vksf*pqAD*W{;^82dhTchou1cIf z%zwUK@JyIv-F#PZ@{xmpI^(adN8i41-HTVxq>}MS>K0ES#P`{`R5*)mI4xb2N}$T>U6OoAk%}4s!E-GhS)*VS_=zeEuLQ*B^cF{ zw*9>WLY}CdiZw)KrHebJjii-Fz%#HsFqYUm-Z`;6;6(YiZS0!9{-)cf4$Vz9KP356p{aFJjZa;)LgRS(xhj| zdwGVn#I9{`84IV2m6a_1^^VSRpx8LNU%MpjsncA6bep(hsx&7~H+8)c(N=gMrsdtQ zIqS+x+X(&a_(|smrVzmz&Ah4Jo&WQo{XpPBFa9(pzRN7p1iPq;i#z)T1Z8NZG6{?_ zME8bE!L&_l<`q4@);-PhXeHb42qjH;H!Ew^d%YU)lsPJhO;7r4f4Y5oI-StuqyznU z_~~|GApU4ZO>~2QCUPSz*|sLG!QmoFmu;HkBlyxZFILwBJxud|ds`Cp??zCKFfn1~ z57YHoghR`MyCvh};&`owJS`uv5Wpe!Pm)z(8rbNj3$McF<^=;`{dij|C02wset!i; z2hxLi41tXa4(Up|e|-BRUT45L9F|&{a56kNg>3$FP*}9<;))~8Q4fBz3;#bu9b8Mn zObv_x-Y1h*rPvcj1aXS&XUAHJ5=}p@!zy_ab|PYO-5N&*{4nhVdylUsIs~Lm5qv43 zp<(Xcmx8_(tsk}2_0{!1s&8#>a((vFO4bkMRk=$J*Cd(NrRddTCfwK{zYTE7)i*5t zDx;$u`QHdju@$P`_;`si-SRNgp{r}9QOq1uz=o>hNi!BA#o+1F(}yn;FiO*|5^i2I zV_?8Qn5@7X_w=8@`lwh#IpyAqI%SK|T?@7q0xq9I`P6rVQQI#rF$6JaX{Krcf2iejh#G`LB%QJsD)?|qeMqFhxe-NPgv}~FL7kaJV zQ#?MIBL9rn`x`4xJwtCZ zO;CriI9{va5t8r+bvXe}1g1hNgbs;D0*oteIg|i9}vsH`m!O z5)f07j~9moF12p_DMx2oUAuGPJ~%bprmgA|@(Qoxqmt6? zZ>MF#5Zm10yIEIf7QeZIaUy*D9%n)*h3!ET$gPoEAe&zlQJhh*lf>I`<*OCyoARxifnFg7frtuOXAgG#y=;!SQuKAj*aEg zylrM;<~+?lhn|1(EcA0ery{do=H(VpalKWD>9S0G^bKy_>ap+h>0?J{=l4C%J^yAU za)#jf*0HN{IN4D*Z0(?dsyNY~7kX8@&PJBQ74_-XfGR_?X*FN5gL?mLD0MjD zTEb=DXACl01{I<{pG!6Jwi z9v3r8OGuc^Q(RNdg_@#C4FjQE8Q@zR&y_Iu$2i^?po6!y0ZP(Q;Mi!Y`dw4=7-l5}S3PCj7{1TNaW@;+o zb8aIG(uD2rUhaa=9LWd?Kcj=fNE{p|i%iBXYlPl_oGV_lPTZkB9yU2CU+f{fIFyo) z2b(=@d9i%gX9S`lXtPCO{2u)1K}+zyzfmjt_L>u(rXHFbCT4?2{4qefNFDC`S@4!}^({BAtUCYXa{p(#k%x4IR#z$IwRg%+~I`Vm;>6rqN`_uVrDK+!YDFhuj^~}fg zI`9r>J<}lC3H!4xZ1{?I>l^S`sVlViBuJ7uF6vqw^o?n`-mKENj|+NH#CgveELEJT zjQD`PumJ%rgv`JqF-~jh<5KxJ!==J#F(|2_#Qq}tA&lw$i*H}Q&K7^LJm*-Si`fy@)Q!(eqs3F-}&{6k3^?4VK=T` z<>#Av#^CRP3C~glHhJY06!hx+5Y?UxQwkyR%09OXT|m6Y#Kw2c*t>*uiZxGmJ|2#+ z?xPZEJdYX=31l!lSpR%B7eDf2qzW-SaJ!T0=iAiag~@flZYy}B)X{Os)(RK*aO6j3 zIo@5Vh|m?*#pC-Id`E1u7VxNF$$Y)=XvGFQ9-n%wNq3d7}O>0Zfagf+~_p(A^ z!~-D9R(g-iv`+YWdDXk^&V@oiG@}c%PN*%Rm4R87NALfc)b}?g+$nK#-iC(aN~P@Y zS8`e2q;NTHeEpCQDNqaEEK?+djTTVc;|P?n*^4fEggeBqj&qA$lQ=*aYY!{RIf(84mONlq49-QS9%c?--^kycp5fQ!r3^HAjA(fj;7%dQ?qLX}~veF~e^Qu+*GccwQZ!4P(X z*5iTBb43PMZR;=U%(tts4KY@z1A#E`9p=2edQh>0dfesO_FPuiCqqqUpFit| zSR;mF{aO!P8qCi)z{SLRQ5l1F%_|9yv5gu(2bfsjrqxk8Q3lXX+lNFlyngh%@l2@7 z_2e*)Re(MKqIuKoJy77s+CTLtnimIG_xdK-^IAUyR2SU)pQ7ycgPs5KJF_WV4TUOL@)^QAqGdcLK@DerZyWe>F56@rhziCnS!St{=l zZz_baIWFNX?vNt=Fz1-lF0T(d$eBXgd~2>``s+;-?%_NciRW3amf^ujW5voJ*63Qy z?9ghfgQ_Q*(PPra+D-K7bTpdGRtK-I6+j?gu;+#IMt2KZnP2ev;eu}*1Vk|nlb)X^ zysL1ogPS{25Vo3bTY;)ScLl+mACr*@tUSBVqLHLwbghO>LlEB3%x*Y#ZQocHExkE8e5yLD~@7jY=A=1lPqv? zaYLIz0sLn-Yh}5HEin^0veu>&mWic`4!mfT10$4dxlRX(1&V`exn2ATT%m2kQ^}TU zSB~751hth3mAm%9=N`RJtk~-jBMq_~^eU-+I@f^S%I6|pHW~V>&F9pzOOlt3r!bf?jq2v$;cq zk^Uoz+im6%EP{=hTa5E_XSA6#4i;s{lPC1ZGd^Tm*la> zl4T7yZiTx8El=`=9lX+fDH*ZB%ox$0C*~{YI9DB&*Mb(a;y^d@?9SIXu^gT}W=VKL z_vqMPrnr-z&*WjM2=cy_m3D*Js0bE-^|mk8`XVf=HULPMF39b9N_RN&Gug~If>WIt z6ThpA{<_u?ysP=n3`(kA^StU?%c=VJ+SK`CKgzCW(nkU$`^otbnI*e>uxGCwAjO08 z-3A;w?4>d1hT6FuArKr$TL!r&k50CRkC&jd6z0KFTx^;XN{wrRG)SN3&Ct6_s05_+;7Oz{sTucGs<-x zIFr@$St>8*Ks5OH?{H`nX@YHi1;1sXy$lo^ z@$6}WK?gP1Za^UyEdu)VKYOyn3VSDuwsirO}foP>Xo;^NeulhM^?a}-; zl@;d$K}bD{{CGW448RVq%^61v!LQr>+RBpEd)Q(^;hNrGEg#oO3(tP_*7dWc$xgwI&orlNXcU;jMPADr&ZeL#R<= z-T@WU=@YQ6L|-}d?1e8evHoqcSJ>H=)DT;DMH=5`B>^K1!9X2WfF;p^hG4?cCo%EN z@%*x9RAXNu)w=Qd`N(M6MBTbbIvPgCz`Cg2yog}wi0y-wp9VE9RtgHA#w|@iFJ6Lc zz)_Z%m{*HUO2OZ+%30OG5f@FDhk1Ec{&k;t@D(#olYj-ZA8%2i{Vm|LUR`M6tHI$m z$5y)(uoW^>F0lJeq-ZjWmGmz9<|bYqi}Q1gwHpov_0`Q+;BQAR(VmW|WoegnZeAIk;W;c&3| z4j6ei=kv!>f*HS|Nq|trM+y~@%JetNOJ{YpwLj+*TsFhs>;*6}rWGwUnQCBdl!AupfQ}(Hx-6*56+IXN65@xik!zS0)V-CzwEF zV9r;k*(Cir&aSQ=Q$^3P%+9ih)!`V`#(eVjHjW9Mc~l+-KbK~^`t5695YG)r(SGQh z4NbK^&4>|hia%Uv7#|F`k0h*fBA=72)|5(pI0eGAv}?=^xv)P@i^5d0ttAavsdPoM zX~IA>?~-wd!z3AE-?2)AP`_XFFI^Uc!KJ%k%vxi!N?9ZGDqXVJ(Ox7?(AoxPg??87 zk7-HRX=ye$_61my8>iLfZ1ZPFen`PIW%u$cnrO&;E3)?|trY+d(?m!-FZ-U+?EEdt zYV4`HoQoHSaKU>uneU+!)vP_eRCjYrs@g|gZNFEG!Gz8;#;bH=nq|pRN__j^e)77= zJxlPWEKQ92?Vctl;$xHOAO$*?&8E(F{do+(#wUIbMem%`d6n#@DDsA!eD) zy<)11^MHS_ItE6$<^EK32l^q_RnkDh>FM5|S4KT9ut|^2g~_enkGZO%*Q16o|9RA@ z+6S0XT7gSpCq+K7j6J8ecKgsHidpYK(9n~(_*6zj&bMEjIFG+&s=tB0Jg@(S

    *m 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�e|pGD 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 kjg0hvUr+!0LcHk`Y52pu5DfA&{OWwKUdo6R2 - VisuBot - VisuBot logo: a friendly robot in navy, white and orange measuring the distance to a lilac cube with ultrasonic waves, next to the word VisuBot and the claim Struktogramme - Robotik - Code. - - VisuBot - Struktogramme - Robotik - Code - diff --git a/website/assets/visubot/visubot-mark.webp b/website/assets/visubot/visubot-mark.webp deleted file mode 100644 index 7dc5b040a8fa4d79dade3909766fb21dcb77d090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 E04ZhEH2?qr diff --git a/website/assets/visubot/visubot-pt.png b/website/assets/visubot/visubot-pt.png deleted file mode 100644 index c5a0e45c02873387fb8e5ff1529cf0246d5b08bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204781 zcmcG#WmH^QyEVFT2$m2mc!1y*G`IzKcXubaL(t&CEx5Z&;ZAUe;O+=bS54URDhC4c;3708k~wzbXO%f*%0D`XNF?-ie_aKmnitK;o;Q zvfJYEimN)N7(Q_3>RO3&8nx;P&ic`IOTq8nfb8F&vBbgk6aDvRW*C@&$p0P#@@SEc zK7jYHVFTq`*7dQnObu`wn#A*GaqBe6Y>YL3!t{NFgN~B_U0oIXll=P*=|6+a5NQ%G zGF!;_h3jizkHcE#IOJ0>7IqJbcJDdDLZgL9)swu>{XS5*Ptl{GZhB~5{22>REY z>dV=YY*OkdI%i9Ox-R_@Mykk`6sJ#I6;)MVHFS$h6k(*6{tS6uN1&iw)l^qAsr@Eb ze3t+#q5F&Bklk{cP_JpE@^1CtSNogm%x%ON$gcF_oo^<5l}b*YISzKJE4FT^j*G z85NqW&mENkE<0pDIXVk?nOz+emO(oDru~$MD8$nhJ6z4b!OILkQ;`l|=q{?FaQ->R zY*owoiA0H7Xl?ofsPuFlB2O}5DiQ+1GLzldk&$IATA#UM2{bW49}}t90hE#!2Wl(t zotqn4UKFw}$Z8S_+y03u@eV~;IKO0Mb~JIgkNPb!Y7m?Xrii+F*b?C{tNNeN!9(z!Fjg>wC?t@zlx?t7};`BI+`4mdd%K>7LkJ0+5Bg2NN6fFP7e zEVEaFJjQnoj+Cx3KwNY>5kMd|+MeuE+VJq@ExzkpSd!n1ONI_?i{ zed8lDS@dSb?5Iv!L?oysWT`oldpKUF{qC40Qk5(Q5y`)#q>S|5%b$cQ3|jxhx~zcb zF`_csQN*3ohDkrbjeJ5hxF>&+(HAW#ClV#`f2@&>qYlfF?d8(M3Rv&k8<0+A$_v$E zxSGcwR)g~25;h?KGgFVva^2j7$g_V$t1 z_oHk;_*dY#w{U)FTzy`gABZ$rnB{*ypJ@`r6lt(|M~@^B9@yF?3^S&){>fPDLOg7W z1=BapgBM$_d!}#|2F-a*Bepdm*AswHSxq1{%>f z%{?Kv40roIudrDkV35hJij;{xMYfldP<`UIC6+3E5_S??!KQ(*k7sV$);8tm^EYIA zKDF(;7>RKHew&*$dcIFTdMuLoUOBd6IbPf4ipyYuupHAi=3=WRUr*v<$^4Y3<<|@3 zFb!-#-Jisgh#Bx?KRiTV^TnNHd#eTak2@R&I$VbF-5>AO)s=D9W>!~M%NMhThcx=w>l$AZv`ySukUaDW5Tg|ENmNQoD#B^n>@YXOJH`*E>MzThm)N8J+v{2ht z@O}7j@cekqRuV30=f(Cr$@2`Y_Y-+wh=>D-hau#*L}UUMd3Yab=pX%)ZOIsvbbOg) z&e}sEq201b-H-NfD30Ngo-?Kiyu&FQ$h`HSa~1?|<7Y-p^ePeja59NkI_$oVsyOcX z7AsnH3wf_4v+M-Gt?5NYd2WCdz+;(nn;uNd_rk8v1BZ>UYF{}4^v_s;kg(UUbZaR6Ar`V#y()k5!AY`5-KeNXkNf@| zy|(FxO-)?vnIqItSH+H3ALoa*IzDf)riDlB?LC4o_7^LzLUk%C9+9Fds(IA%7fslh zG2o*;t>Q`OpF>j)Z5d4B8Pvj@*j7Xhy0XyFs+cN%8wIXT0%wXY=K=lgGd@7ymH`GxDN{)= zOBu4}y501}Hu*K7r$tThM8>REJ^|4~9yUl^jaA`k9HH}yH+ zS>)KIe>B($vB3{$cls37lYMinJ(x`eFyTeoz1rP(N2|?BQY8FfFMA#to(7>tE7QGO zT+-sF>T+Fcee7>FsT_UYESwD|ZH8Uv!26e>^F*)``f{6GO!w%fK|ZQ9kU&iv@bW?S z=GnC{8gEjK^c|@Ak8i`(yw75y%MHNPenjK0s}xZ3j4^#YY`fLV@7 zLzSq2y#0nMVwdYmS3-9UF?tLuqpNkM^V_VNZ@_JQ#&1 zv%woeu@!B?ir(eayW=HK*D}i<3{-d+y-pU9Oenve4Z7FE^t8rUs{(~m)=Wk%$EV&t zb`$|MVroGFl?0Felo) z_xyMv*+AGc1v`Te9|quU3Hfb|0o+;M2XD80cz$q7f9S>qsHhcA7hE4?4e@%Ibh@7h zq6w+6k)ia*+m#;CGwSQB?>47F1zr&M&T0C}X|SB7K=!!G7`<(;4IY0t7++|S%V$he zQ{oz2J~XL&pGqwQ9VVv%ht%wgsQtN=n%&tK9#|P=3!VwsMDj$+Hfaml+S|i;pKi{C z3(}S~G)&CwaO^&bD3Of(N+T^hlt@cHH|GHS;KIl8J<5<~IGyL8nLPJVg@<{5Onjf8 zpYYLu$omoARa&W`vG#PSC0w!`3P3g$cJ~0$PfVTH&w}#K^wHuih`ajC{^bpZptneU6Y0~#e(k!ODrq!Wu zh<=Yj8^MpSt$QtlLxmzP8CsV#Mj&_cO_0B8;-4AdDm^eygJo~3E=D*O8~aUUiNpLx zoRVG!r`H(|t>^9gP+w(SW%%@$kW8NsJm%{xKI8bacmbkv-@a%Pa$2wdJY!gi$m82^ z@t4%OnB_?0C{uC*FBqLZfp!(qZ9BkS>V{O2xn7x{)CoUsLy2I(4!$wT6ByZ-Qco;j z>S|Ch$Zlt6$A*LZ1PSG7&=Z`TLB+)y0F#?Mx>73SjOQyTo0|W?2y~~{9n|v8SvqGB zjd}6irh(bZmzs{|iTQ7C90o^en_YOj`uf_rE}OIl-S7J#b~2~LB!%zD00j)#BwIkG zHvsfb6fP-F^K}m=_Jt z?u%I*Xm|vxyQqz-U%qU};t6(^U=b&;roxNaE@8;X_?s-Gx5!~)CGk>esJie0*3Vn( zj^j}z5;dsNGXqP`CybdqXO4XvGpI5D>d&s;p8Rq4T9`jFPjz>>K%8zGFZF#g0>4bR zc?Lsuu09vud#(E4>V0#r&g8N9;~%a1jmmP;Ut?d`rxP5gf$=Gw#Re7_PCD6Z=HKm9n!;1g_D*yr)$HwkpyA&SVz3&)KZ~U z@-V*OWwX6?2?b2Q=2yRudpWW?Jf5VSoCl+gyEli}Wqhw}Vyi(v?E?4pkW&GRy?W^2^tsyGDOZSFld zK$XSiYTowM)03ecV-f|Hsl3YbDl(uhgOn@16Eu!>^D>ga{GKTQ2dl%t@fq0(-- zW-OXg!uuLyzh7DNT8+iOP+P(yn8|pzg2Vc=?JJFwQ=O#bh=X(e=qUBg^*713w7B@> z4;Y&4-p#%8@hnJs;2w7*Hhl$GeE*Lane^T4Cv2~IZ{UHSw#a* z^!UC@!f(&6YZ{kYvfdXm__kZil`y8gz_{Gi1Ug%B=LT0NIEi)yZ_;%1y#j zJ3*Tp03N+ns~t8Ah0_O&VguI)Shj}}tEFnm7W$Ez~NjwoCQKA6dnW5f-{3 z8i^I0SlQ>R3IRrT730&==QhpjTmWLo)7POD!Bd7GPXdk?GS4UF-Ps-NNA_ONzm$|5 zV&iIz9jfaiyT{jd?y5@<4(?e;VeeYv6IGc}9FO;Bl?n}^vhtez$M;g%A*aUNc6RB? z>Au;lT8e|{b~5t=QWH8}gh@&!0B;>n8UoT)U@ouggNuF7!M;R?YaE-9plC(1Q>Vrk zJDg`j-UB|;75X({nJj9 zw&e37ybKFXLU55C$?~qHBEUsWJv!7qT12Vr5t$Xs;xh6lz2zlVoZO*}uhH-2IXazv zj@_1seXUaaVs436xr8Q0UO#Vv8SUGb$bp?W5=^cpb6gnnIy|z`*2l4>7#;tIYht%Y zS!)BImjxvSVKEe=YZ{6hPv;9Pi?#c}UVP;b#t$Z<*0L#Zf>NFWj}J|pTz`!BFtuBq za;=(PA?*~vbd`C|VVS~av{|k-_<7#e_k2eaSif}VB^Bn=WE$=kTFvWrGp%vo0XpMX zW_9m+?f1~HzvGM?w@l|t6kNwI_gwkcoxuQ1B_B*^?#H_+2%|DD7g#tH6&>2z2xaUV zt@$$CD0>DMG^sZ6E%1PhjODeJo{G6(yvVUDp~BhsuxD<|H&(rlyFM{7F;*VDm$P!q zD+I1KdXusyA0kH}S;@-hq3JtosKh~Jfklcpf-K|xQ<8_8_r;_YBqnv*vHq*MD{f_Z z&A$hG@t!1zeC%4qpZ5`sHE#UT`HV0=#cITa8=cenj4W$|U6*6C?=AaVrHlh3%hNSWRn=5*BjD?s%ZiGQ=k?~s+@JF&n27c4jInB>*Hkc>#PX|B3y2cxMw0h2q-U=?&qK;0WCQw}HX&p}`fv z02H0zgsUr)3fB5HD{U2-<{}IpAR2vmJDhrg!?+f4jNQwG5|RTy%kcsaAi_Se@iVrk z#k#+AU&j?zF3XDZzQ-cNMsB}zswk#qwaF`eUpljhkRVRe`nAW0zT*;s$wPREZ;1JK z-LJ{`pFGq+Rr6zjU>s?wDPeeHBiXQ!_3=vemIsudHbZr_f_8KKM0px9Af8Xk?HLZq zM|_XV0#;V{bM%yu(q5>C2a1G(!eTwE>cU~RIIjAX=!RUPPLJ%xeYX2oYfh%`3OwLw z%D<&=HtS<@aP7gN7GnEO5H;_9t1Z?haqJnZMkZ=p4mT9t*AD1 zAH)9Xta3nBTk~PIIbwtd@&z1vzOscZzrMJqIa*^rz4P$gARYNEM%4c9UvxV81$FA~j3*hgh3^r2H!CWk zssxTcURHfJB|D?L*JXUi^LeZ-wNyz`ubIn%+Y3faNAlm^l|3d&g=t>zkuEET0So*#nHo=ORiKT`&lmd0p;XFN9?d8G9%h2BeCvZF z{q=|Jxw;yme5S_PgDWg7(R5K^K)%1^ZOTxvnk0U5yZ7VrFk=pt?YMlj&o4sgKjX2Q zRP!G$)KkDXR%%{DieBluFt94hiUl0FZaf*PrE^Eu(BJ(?sDUinnrk!F7**cl7vco` z6;=&RmHbJ4k~%!p9(%;FcW;`6kPIlchDPrrqo$6JjgOAD5|f?4-F@l+?uFku2jJI} z9hKhXv@sRA-EsgySis~3P@U`FSD>=2n)pRxSVyJ3c5T#f9)B$hP5&l(UC`B2cp3HW z-po@$oOh&?=YgC{^RQIC*%}8q7*nIX(^1Ib?QR-Y&K_J|ge_|m zN)MyLZ$&oc0sQFI>R&9nf7ljF53G(mJTy9 z{tY$Xa4f{2hr>iR)e3pXnIrsE4lpD{_a*J=P=r3%Y$-~(6|+XDDpACw9$b}NJz@Bh zKnwtv+&I$w)5q#PxtI4;lh;QkeSIQA*+0e3sbb+U{K(CDvx}#Mk&IdJ!UnGPt)}lAFK!Q?{`QDJ_Fay z#FE%IdKHVj87e!I?rQt~NAXIfIr-!gU%2O44v0g9K~0NwdZqPDN%?uEldMK>>>nRN zYLz(_6rb3pyR}yvKDED&UH$$+64YI`Vay=wf_`|p%517wT_PEmruE0ZW_ektUeaiF zPV8T7hCD4N_kvDn)Z;}Os^@LyoOvB%2dmF2{y0qM^1YsJvqRkYUL-!t`r`Ex1A~i= zqIMkg1P?S7@{;zDov-5Ha9o~8c_JJYqgpIx{;b7!#*XAqb@Ji8C{p+f{{Ex^UHTLF zek|cVK&c55S+OGC5DoKq1~;$MIun9eR~MNl3hR$Po`5caZ(m5Oo0{ojdti!rhimdB zO?+%WNfe2r4ez{L<*VRaaEA~0Zh#wXV4h0x9wUWcQWbHS;Ljmey9KsVaF^kkab>vHZH)k)On9;z^_&y8nnqKlX7Mf~wL zysAbqg5Z{GxCVHOckWaUOE=8$=<%GiX1y-249+mPiwyn;SLaGVU-L9MFXSiW^RVr& zE7aCGS@V8fIyXX)?Cq9Pv#roP7Zf#JeL!t#Bv>o>6PaDDrYaUxV{?OQd*%n!XW_c`A z%=bbWqJ?d4=iN6azL!nVe3^NXS7+~f2DyYSAV~lP=wcR_X5D9Vas7%1&E{Fpg@g#B)&(KQJt6MrSRkBu5Q**J(z(js`f+9p(7NjJZ}v!{qTU_SE( zHs@@j{Y_AATyBVvL0o!*mZ~ZRhIppu%e|z`Cn&F2a*es7*^-hH<(-62sbM9k9nYBf zo=Uc+22AD>ioF&){dO%z@+i|~T%W0i4hATA{SXY52nQrW`IA5%27 zb%kyVrsFkF(!fWFWcFthkTylqFi#sH{#e(_iu2*)%oPyh;o|c^c~$D!W}vu&ySo`95I~mKEvv!&`=}{ zKm7<%7{Mx7L1wxtI$VoXQ*$8E02g3rD2y^N_$1q|WNu4sTlj>0S?UE-Ml1?S@cGXE z|1qLT>P{ug&=>=+H;;sh$Q0{a*x%a@<*I#5bP_d~63|_NuJ!0>^#c^MpNA4s!yMA% z!dpij$D|qKXah}||6)xOvf~Hg2=#1x{ugDZ2chgVpen}j{osLMgCWUT2;JDYbtx5o zJ=Z{rqXtSy_)4=Sl@A?DUiI0T+$5!-M(Aie$GnH9mU(Ez7&=A!&&CeT=r*)Q0CDX9 z2l;zA17$w55KmhV;@p{I$KcB(du#uN9&dPAKMPWV>6+1vR65wlvh5VcQkHA~E6HmX z%Lr*vlq1<20C;TZ!&QBKG?9y0vv?L{)BXfs2oy=y5x;6n(S8omi^Q-s!C!|9J0Hg2dhFzp3TsM)Q zplz!9-wCA?`{@05l-U0~7n6-n;1BcP??9$2-|~Nb^LHroe{C2859pbdX|6sQrgO!U@?H(&QVU^kCx@*Wm@ITIEGbzi-U>k|)sl?hPll zDn=}MMv)@dV5pG>6+_9CWdvSiwgv(%rURT%MSemuN!Fz@_1_Ein5sKgynHwHP--Yz z$-v+IHO--4-acej#W3w45V1YpYK!sgn3DLMx@&_!l&!PIdLVu#Mv0a*P~Ov5@55D{ zWIhfeh#-udI_CiA4NA`xtJHLasud;@ClB9VcG6VQ|JF9JeG~rQ+6KOl`A)I#)f6g5 zhl{If63_0GrO;IE=;-7ZxRX-`VbR+p|MugF_eFh4snI`Gb+Ob$UR7&Ou=FGTXcD2q znsA!re%b63`*byFIuQBSu3DbnCg_UcN7Sj0SeXcx(C{XSox9Bl)8#7+Dax26j16k6 z4z2til9wF4a|k-CX3UTK)#Q-hP@=fEPHwehYiyP%HR^`mjCPt#Bl5S^$z?S(&v*s0 z-j=AlKZS=WtyL{LSkp(p6(Wg4)gZ^evxTwX+Wjycg)+POmH_eN3=cf74HIr(EW4Yf zDBXsN$^lfC?ayi>Neg9=qLN0jqk~0&6(1#zyQ=61!MDty_0J4{O(D#|MkRl)s~8n+ zZc-yLA)6dA$CiITs#x)FJGp|j?2#H36R)iZE6w3Z$b75mx!DBz3N zPyk*>@m2>YsK{hInPQFl*m^v9lRWUR3DG39%XEiRU?9nrGXszIk`}lD|8$fI=6G#lv~9 zAqCgl=WBIy*k(Cnji~pE3S@6Zg2p&H`@0qCVlL9yj!{CSB=Wo*rK;`xWJEx+8U+VD zA?)YHDKYPHfe+q%2Jy zza&g)$Z8uT)R)&qqR)vcYM0g2VYu2S{H?>urkr^1Bl9P|bo1i{=F@X=v%fv6qyZiMFCn-|4l8d~?a}^CxVea7dDkQ18EXA8Cf@ zuiY=u#yV0Q^LtnMi`c{?;pWt$=$#+C^V2P=d2Lf%T=?eL2{a1}-((J-yK_(XYgY~3 zTQ;&@)Q}+j=IrOKO5q(Wl}xXz#dX0LjA}&S0oBKStZZ;xmPmotBtg=9b2~wf@A06r zBf6FSF=cK(#sb$lf{*M97gB4ecfXf%b8s}Ub#d3U3=PPQcwHw+x5x>d^WAf3iVu|f z9&cw$JvJm?LsvKWWXd}F6LYd(XpyY5QdeWZh2yl zlasSe>+AaOjW)YgNq9eiKN=xF{)Y$zSo`C9CT+OcHa8Ekrl<*{(4LR!I#?+OCOeYl z^)}CXz9+1cU-8H6`kAfq(e@35V!xKZYv(G67o8L>Fj*PLw}jU&nMv35;MhMr%uu6V-An) zXRT>xeAjwc=cG(^cyb&_#^SAjq;m?K#Ke-5<5A0UOK>O!m#Gg+uz_v=rxp+=1ZzPn zRmrcp&=r*x|LF>|;=FVQ6w2z^bAOz@VrS}fybNYMOnjWb=}{~;p83H?PrKvbv|On7 zbdgnWmSfmpt-Yu!RtN4(Asb*=2E{>8gO2?kjoIN2^=8xQ#5OfU+v^`FJ|3I$-?LB| z%ve}1PffOGH1~H8_m7R2&WZbzOV5cJ?_)?1weZ7#RD8cX`A^OzQh-2ebi)t#_eikN zWs%KpXxW<;N(mwSrq?R!`01)`gs%`tB0X@VwG|^b##UboEu^Nl@$AxZS53e0cAl1J|Fd2N)b z`+oPMxWOQ|ds730;a8h|j?dIpBb9I59rHwzFh*@#>1e#64gA32eVjld!wmW}RpvLJB4Lc6XOK zcK?U$0|Z6yV82C9G|@=(wmHS&FW1GK{FG%A&J<}zn(zZp-T&`GNdCy(&5fLrl9HVK z?(q>B7CK#aUbQV70!XPmvq)!_m*>YBA#+DT*gY)lL=R7pJqX>v+Nxd4uJ+~f(>un* zV>cb|+#n7m0x7vDP#PacR58u|{lqO9u&^!AxLx5gkKSvcB^{pXPdW+ zKWeqVp25zZ2)x|~SNkZn-1^P!^=+w93Pp2d|47PI8|NuG;hp^IId0d_G!hif5f(Q5 zaD|pMoKL8c?*P)sT;13k(}OhGqLmrhCwKv4qx8^z3oMjMn4FIZh4VIl65_OQ709~g z_|g9IGf*Y}?Nx8~Ni|FWf=gqaa-E8;*;xP850v}+5Rn2sEwlCqiP3r~{xog}x6Fk~ zUyt*tQEY^)TE{mPU)M@NUyIAioIh(Sd%Ye~)@aFxGg_uG>@J?nuRgU(C3nd8Qu@i4 z)>pROyD#-;AtOuaWn3#n|NfbpKBQK*OhEX)!(g;v>2vLbA59oD=XXX ze3Tdv&{H6jCL|;z8i_ai@T)_!eWQQW_tCle%M$(Tp$?TLb&q_;1s)G$`5%~wBO+o0mR(vnq zQ9I9*xK6hWn6IBl)qe@u!(L1d@7F|x)vj?^>A9g9Z2l;2o~b?5@=T4*051lB7j=G4 zcU(i6FRY`J$4n#pd?=9Ny2)bA`6=PmsH>7RkAJZRC4k8q6{{X6Br+hjDwi3iQd-a0 z`h}csS&3vFs?!tv!e!}n>+>vp7^rkrJ+IVY%jt6?y}bW7+&qcnq1cGA%k8hGRj%} zAUVNUhp$(psF6E}=H+JPbVV4JCnG4RtSwE_aH~)#{0ohmU74E-uU-DMw^^42P z+8i7l{v_*}xL4m{5ZJB%=$n{0-(T$f{P|W)Y+w$D)#k9Nan%b7sMB2e#lf!!@;E}L zg%HT?Sy@h_&4jhODaOs8w61%=>~q*1FL$3a$61_V58iz+G%}jp!0LxcK;J?~x1%A) zCW!IV^ItnFHDAS&BA4Pcye05iXuplSxgu-p8UfCC}TOJkQ_~jS4!y6no z?qjgPeiu~0^`Ol$WNl;fvh={H3$Y=i|48PG5*!>I!^6Wh5}jRLIaXAaFrByhQPX9U zl9CElOJ&s7(PPtJ1GZg9o*rDP?s_%9Ih{J=(6iarrV`A+10HzcrknhGXIt82|Hi&}UIHUY}zD zzDxw*oeuQK2>G}3L1AkTCv%f`y&W7Am^i?84`1v}vPRvth>oUmPuj(b$2(}2*;#t5 z!VW0lx|}ycS4N_Y%2Dme!WRaZ?;p2)NtoibJ37@_=L{Sa^OBS(|8Ao4t%X+B8x9b9 zRk$!9R?}T2xx(wLwlDpmNl$$94)`HVd8tEssdn=;o^e5L>b-{Pc4JnDwODtVu;&Zg zPjy8|LEKy=d8+QdLAmf#B&YLppYJH^5r3xHk>0mc1juA+K86RrX+I^|V8u}L}Uy*(8Uzl3B7w?DUyk(M1fX?T(hv!eVFLsVL z&(60D@tJou2f1E6KP1bYzg2@==-n?1i~uGBLo&G?h%C|A#Kjy~9G%U!N&@^z2#(9} zWEb23NT~CGbOX^3IPV3|%L>2@t2`oDk2pRujld`q%N|{E{aIzX9)yXn7yCwCtkF@n zLbO2td$#Z8bLpVwIQY)3g#n_+3(jnk8~^QnS#AO$MUYU>-I>$$_IwX}uj(Oi?MH0n zbOIZz=Yp)seM!k-xs2wi7Bfh>(wYE=g_We!giDK!d~#AA*!>z|)nD^7A-z)3LR)9) zJU}>hdlyxTQ9DAWCFx{iBR)>)ZinMYW4gzjmc8w1>Q2=6-ugRz2Qd|c!q_jqn7kK9 ztmHVQCP;lG@jlqi6XbMZDjiEMqTmq_W3m7tY;nvW`hm8IBUFO0!{mJy;O-GL|4bd; zv*FdAhw8ItN%COr|M@=v%?!oz%F2geYHDgI0397YUAEEfd^0u{BhlpY@^Z)Fp0VSp z#&{5eq4CAm1~2k-@j4LPzV>w0`>_$6H=5o-$J#sJ(_?XnY~=H_Q<<|_<8H^Jx96ke zdVH7v)7N&ycd5p1dbh1oI#b`^<67J8cJZ{@%ko762sAQ3K>wM#4U+t8Yw4d{t(PIN zx`_!E(WxwY#{(77C)Yaftq7W%$|;>oT$RZHjHv`TfaHybB*A&?;X|gtk&J&Dd z*Mi>@5RHTIt!7rn6B#!+U0D)MW@*MO7uRyK&ikjFL{;ceaC=;jQflimije0SlC2JG zJ#6?466(g&$^@m7_7HgqmiFq-mi}`|eGsaM(#V^71W-v#_rm-`1#|25Lv8kVuB+jMIJ~uo(qCZ}}0sHww zgxPY$TCYv2xd-=zsivEDg-=&Udc+KxAm`~C_^Gw_bVFN)QqHKuxPnW5XK28-0u3W{ zfBF6hQc7P(`Nbs1`+VA+oA}7v^eZviv3wpsC)W<5y`G6|Ozj60O6$EJoh-ng1*pP~ zmkOoU_;jT0Bx2PcX1Rc5NI7p+$+txGX*I0lap($ZT&~#cZ6k}Bk?ped@e`Ceuzude zmEK;X=zYCtR?A zdY=dy2taTq=5n~n?%5NKJbs*M>hiov&)_|>K)cS2`3UKiUit1SjcCOBS*st> zkT8JWkMBhUx5C+FXO=m&UuDd96NZWsrughM`5FfeH!XGgv1YINODn9ihM6yX3AUe1 zK-ufEt6}26`eFzbI^$eH`uqyF++aE(ju~QWNN0@P=~}hr@TJgv%>^oWlXZ4>bTOW# zV8^R*b+c+vdr3gp$4ljk!u!SF}1QG0fhav3| z@-9u9*P12#%jpfL&ZtIKb;kx>r)z62v>fYW5)#ItwQdpmL%5;YBw~fKA!=b})QII} zF4i7-<>!vLILw8!TIY0x=z&Rmlrjs%4>y@Zh8k_Fom(#Q09QxWpD9I!BgMNlkAjq( zO+_vI;W^BY31Ml;WjQr(z^VUfrLEjNJan7vH=_ApCJvkcd1d9iNpk{1LN>fe(Oha8 z8cR1vtJ236im#*w*U}fvDS0&)YlsEuJW2{U)+8V=>P6O1%h)hRkhF{e~c@1NT?gK5+JHuwLWWX57c;cJ<>M>Jqk?# zAhs&M=agZDLn1yK*a7cLC_A13`=b;DF$n!%>hxs=7+-qfF ztB3$kA;a!_RhAM`qd{JYZIth3ugjGIP+6;9M15e7SaLBm@a2m?7O!VuD(wj0%hf=3 zfG5qi>CTSIdy4VfTW4R(<<3BEi)k}@-OK3#!SA{SA=-S}S8bV@A%!6 z!XR0%;YLm6+=|qA3X4?@b;_hUte@VTEx*_H69Ra2-QkNK{o2or3>NSx4pF>sO3mg@ z3b9NolQE?HFtj7*yPZOKbg8JR`sup+1{O$HMF;H0v=Yvy7`TF%OV7=Vx`W&poQXp4V6A%95{Iq;; zRp5@H2sR<+{T2%RIL3BjKU{>U$8L_*Eo@A56%^RqhgvoaeBSq?)6mhRKR*3XaKW$1f3od#k3aoe+2#G>z%aKu0%Y&g$agf++&!r&(?rM+&(?RoY{D-l(LT ze6x{`9s>!~Aqlv07ynf^*4XopHb_3+6KQ z-8TRbxDq8ngy1`Mg9Gj^g0OPhHC7B09*`C-_zAX|lo)V}+Bi((R-S)_1w>VP&Eo+Q z;^qnU45cR9GHN+dwNLmr)zkng(0nD;rv>Q;4La42)NT|V%rsLp?D*2xhGskL7F*}9 z7KaqicW~^W1UlMv5Ks?aAgzISs}2&0^xAO8t9$3b(k$jV0Z$e8aE;YGSi61`X1am6 z{Z%sh_gmmc6v+8{@nkE+hm9pJ`C{31UAkOo%dRkjXra*#%m7p!U%DGs7kz)4o_3tI zJZa_7&7xw?vC3*`$(3G}2ni}C^6yz1?ps}@;o4O-yl8uFQIqN=1?*iNpVmUwWYV}! z@2PVkO{^=%v^3UZmT>`(Smg2LuGRQoX7g+^dQ;EOh=z6n50Oxl!lQZbxCmMLb%Y$0 zy3XHVkxPtuZUucLGwWLwCt%OpgW!yR7Bo`Fr~!M>GQ>wjHRcJOi)meN84&wSGGrqO@d@XQqt}HUM8bvT~T@1 z<&DF}c@xMz$lzl;-7p2kDg^vuEpJZ$$?Rd=;nDcuK6=ykC~K$wXhG@mHEnJh>s}@$ zP@c~+#rg~Z5@w5dUdbR*$SqX3P_M>}_~l7;2lVwdrc!c4nzzO;=+CJ4jS?{+jWrPJ zp7c!Qcr1Y;6(j$>^T8Mg6{vPa3n$-uk0#oC^;k8#97y~Wbn(bxh?af5oX+X8!Rf59 zwyaTSfdM4Tsl%PE0Z!>F(|i51BawT!vWO!nAJi5fwKX({TH6SrI_DaM?XnJogNWTq zmjbKo$y{3r!tf>-4Fx)W3|yCnS>X%V!-k#Ho)TArXvf(Bz)53%|3VvrMI1TWSxz%3 z>#RUWyaQN62Sz+P`fJKQGU~=TMW~vlFi+;|m5eFHIZ5+fuqYaL6-fbE9@6MGhZ?{- z)h`PZ)3$pjA4tC=D|^fBJTyW+JIwFq`VcsH$*9wQKa5WN4MYHlx2F|PANW2vr%?;a z$_hfz!^5kWcA^3t30D@cR-Mt8K^m%wQrr2(_O_O%1{319frTNCU+018${_TiwdtP0 zu{j5bD(lH>MOfGi;RZZsaOuIeQZVXSx^>qjxT;5=F8B89)Cvk;bff!`&$L6jY^ADI zsTob_oPEt<*Jo)tnDh=@&lkfoi%@ksY3XLOHv(c#sH`gC;^g*@&QuHxEGiam$-d5l z1)o*$coPT@40xTVps&#c1*WCl-Sb=0gsmLd)qdAFzQGMHo~@FIJ^rgX*A4|abANQ6 ziwKRQKzqJOyQY*AxqUQa+Q-Sj@2eSUT(jGipP`+mtSi6_>b4&4&yQZvBOr<{Ety&d zcj~T0r;}WH7=@&_YcA%sc+jKvW_^D6Pds1zQqr^I^KeiI0)ZfRjK!jf%G(tTaSO7t zI;W--EA385S|PWnAosRqDjT1C{KmIjP;WU{;vzoGf+07r7~Fgd@`JpV*2FH5B{T3i zAX(9R1d4>RaKb6G{k)OaYVPE2-IqmDGXB#iNua8_+R3HH+gwEy9}sZAs=ZLs<1h&{ zoUJc6^X5oH@Kpy$fsN@r_@Qb_}zvClnM6Kq9>xi<{ciYHkTj*y$0ilwUrW& zV=!U2ojOG{(15~(TP}0y=GDdF4s^5+du95BnP^hx13Yf(`dLazx2UJteBYr;|7MGJ z3(4?aBhw*%BtB&_muU_{waEXb)A8F@@1f}$~*0kogF$?s3NYYK@vcx zGS;^Dn((4`GnJda^}bl}Q{WTv14~KHg;6Hng>9%mr8s37X_Nod$|dc1IcbxSlG}ri z)GQU0A9F1WT-NvdJvHd*S^yRaxZa(Fy4L?rvBZfPjd!bV+yTA_Sxaq`SMN8{Wx|`?;Uz|L#v7 z9=KU^UGtiAjB)`7v2dI&=I*YQi~2+MyG?>XS}r-{%GemKJ3e~SZwyGpp&&{)^j z>MgI?=yI%?FW!^Q%N?z~n>t&Rp0b`sL#?ERkp56#vl}^5U8yWHEuANRBUzHs)(IAj zHkKW1FK>2!gyJ$izop-B5EjqxuT`nr^4&9C30K0)i0KYs;)+>|A-_!A8#Lf@e#k1R zvCUP-cqr;&sn(yj5m-L5j9+eoaN-=KyBy<(JQKEJGtA$6E& z@sH^*!gup|rxF{p1DjintE_zV+k~*YmAogArOMMIu#`%{=WPPd;*CshLxm>ZRaCPT zB(A!cB8C9@URI7lloU1CJL223 zcZqdBgYILVrd4z|x|i2hyah<-{F=-_tJ%4ek^Z0kJfpE40&Y_gq;q!6!$qeIBX8TI z%pUH!#M_l1wb+hO!r#1GJ2U4)S^XD0Kx)v=DNe|T>t-Yg?a&RWzrz~VR*L|wy+!gLC#i<}S%ze6c(t_Wn~2vFdyVeZ4oY@7M0%;#{4;`Elf&xMGaPY9D65Nzx8tB9(hjMb3XmS zYDub#x*6=!F;$6&QMo`V_^S-khHR+JCMjv|_}=9>I-JA1y}?vVysuwvmJ_makOyIs}e#ExB;pMQ>M zGW}*4OMcsMuvn~bWj6!IfRwK~DlRAJ*`1ou3p|u>XE~zRmVI%%E3v+RAH68B`kYm; zYltASP*)ZAtbd~Y;!oOo0=Mc*F+m~)Z%Que72Cc$Wpu6MunS$pY3IH8PncA-`rM=% zVP*I3j`?A>W=x8qB13tB(S(%Na;$X<^~Q^ytK8^&!dQcuM&B6@v~}$mdm!lY)OM3S zBLoHu;xu2+6N_L$@B@Xtszc_k`!Mat<#A@@6y#Mk2UlU7m*Qg@AWk=ul{M|H$+kH9 z%&zjHLrH(K(#Kz)If>QdCfO$&Qq?6-@AHlKhw?KPnqDuZFXIyd;K?3`4)70`irG0(>9(hh7=SO%)xF2g@xzL zIg0da9XAFucU1HXyVm$=6bAQ$+2`oOynk%c>wUY|LvUcHCH0Xwwcf3P<}R%>?W$-4OZ#)ahf zrnVUHnNfO|A^t9VhGE&*`%P)x>5W`fZ<+grnZ;Z!C@F=o%m|W0!__CU^-XX1_kg>Y zP0lCX%%C|8=y7%|!%t?n8%ZQ6;5~o4o)I)Ogu-uB4gT$UP9~HZG^gik|GL#n^{-5k z+_(7Lb*DcB-k=}jebX~Nmcot2SmM5rzt?bUGsb+w+~;b<>|@m;l|O1bjs}4$=-w!P z*|I$kL(}D}zJ!#WX&*%B;t2hA;S$HHUDXWEwo#sGb+XNm1qsa-8L=ecKsen^T4BmC zSXg#;!`p7})g!crIKW6I^4sap!^jk`)3YwQm-mmg&u35o#c>V-cZB9?{i^M94;QbV zc*}wTW9ZLK{m`86UV@e>%Y6vwrklUAi9ZP;`ISfRtjWy+i8v3K&ScO!9(;eD)$%&Q zoqlR0<7_xc{`tmKHfhu8jx`gpP})u)RaY-@jA0Eyf-B2ZYiq9A>2FUdUD!r@sg3qJ zSoqdM!bfflap!vtKhbNQU)@R%B_=W*E@He*XVy=-Jc-5n9xf~X^8Ts$wTiY5J=L25 zQ2t|?{H|J>8J+%CaqffVBS`u^D)!0l@?6|s5E&|`f5zQ^Z4uva>nb*f3dLSDd9@*-gtMLPkc_0Uf#K*<90kP3Rm+;o(vb=66@e zFN~qD33@q<#RvPYg_kuxa1J6HOWmsce4oNkhPX;53=D^&oZhc)Gg|}G&3efUu7|t+ zL#S+RoO)7nne4=W$mnn;f5BGPPE-2MxLY-Jx?v|{s`4*{RdCkT^02bZXFc;b2QG|% zMYQ|^{Y(G`xJIA%mL^kCxLUv$t(;LP%*yn63+`C>T*Y7Ceokbo)elLl`84r<<%E2~ z${u+Z_UZ>R->>_8wIqZ&YRx1idYb4CiZ_YZ9rbNEoSfIgkJm#aUuz+-n z+0j2HQJhR|ApSmkD7IcIMNF92*p!7+*J*yOMx$`cFnbpLK;pMEabSQ&d@kwa)>qX$ z!F6t>cYYZoMASB(6WJp~_YnJ*bnh5vZ-fzM6ozG2?|*sVzZg!jct?$2mB(Xd`ai+% zUz)f->TUI(UXNA^^t)aUzV>1Bq+Ko?VKG#}QkVj9P3Kb?Hl8*?o;EoAHkkV+v+J2f z{DR|DS>$sC_DV_jb$}+1ybx{{Qp|LY!KGQ;ICh@$wZ`(iNc$JS{~ziVu^)jz&}(=f zjxypc7x6LagN|mvV3)+~^K-MTSYDp4%_OdZC6_uBgL}zHC1?~!?n9QChzO_e@Ck8_ zi`|#zRK$uDt*p1ubK!6AzI(=kHqa1aQ%~%Ft`RdD(NP(t=(xyO*d}2ED~Z;`$@mXe zFUZVE{!F2kJ_g4K6WL#3MMbhRkg2Fr`Z+!TV+ON%|^kJV$kni>gTmjc7y0Rlx#PqH~P>ew-4UO5)=i=#IyhQ6v%d z1B-Ii^w8Upbj=!Uk-1ThNBO%A0kQJ@j{ObNYDW&V<26BQ;cgv0kY1EyG#Z!vdfX%I3qfj#XviY$CsMJP=wwEJ^2acxwDBbkS(vO|Jqq{=;Sm+_BlF29HB1 zvxuT~x?hqbl#IV3qeiACzbLKgal)~^0$8@MLn$!dEBvbsrtLHDKW#8`(ALTNM7i&h zEq0(MIHZ}ztGW=(b^F(&zUTBck1+OZcB3{HVAV6pQGoyV#7dwrVoZx^(C@dc=EjcY zJ)x360YTn^PiR9nwRk}LL_{a+Au2DPgeu;|k;fWAK&C}NmQLZ%r%w)vP+45%=|UqI zJ|c_Wxgy$7E*$bAB4lrrs}N&WXj%<#eFj?vTe0lEV#_~^c0_m}zPN*!A4AS)psu_z zPgTr)F&(ZE{8u$RS){NQbVXFG=4o>oKa*O}z3NcMOcmrq1(k+R_3{=}4`sAn%39Du zf_u1bssiubsf*|m<@K|;j8mO^R6lNB`z>PtdtC$RMt(8U=RoH zijuHE1}#e`r*1uu@PYWIMFqhzM(`6E;aL_jCh-?Kl+y1Pzmfz$K&@4nOa=WI&Md&S zQ#(_ISoZ{}ATzp#?(a7>0vClb3NL?{9-dVT&Ixq?#OGghheZEfw*XW9-MVk`zHx3w zO9>5RC9*Bk%-bU-;XY$snmEH~xZf@5t-IGrj3ZJ0LmwzIKq4KnEcExkN~+G{s=rT! zCQ@F(d}8);^4+DK3_6eZ`&LYn_k9(sFWNRE`=MSF9HE+>HOHJ1MP0d*~&(M7v4GPk5u(Dyv>^sluD9HBG1nB@aiN7^?j?_XTxBubk6M( z^xqk|xI%V+^1kO3)40m9RCtN8#0ulOmncx!h~(a}%Jk$4@G3n}YP zh0fjrgn!2bf44s!jnmRIPnB-9{UXFwu*-(?xPo$7chuwF?(h3Ds4}(p=2#*Y2}NR& zzUsgz-UqJzudXRF;x!h1a_+3A>e!GC8}YGbV3cE2L%`zqaNBPj3NE+us1*8__>#&vr^kkjX$We?QOh+EMb67qEOKV*u@2C6E68 z;k)%2*Ad3b4>{YHa0jOA#%W}{wEv16Xe~fYf<*M}$lYR5y#%!~nt%TuwxVOfe>@pU zpVG)p*uMw;_~0RTE;-Z%pg4!125&!EUfGx~D45@V~tG9*C_w`~jTs zTgl^)T33F)i&0=)1l)6sf&BI4;W!gTj#-#8gPg=rxg`gLg@x538uyMB^W(E-m!IYT z^FY92!%*J&&1Gx3rx-3k%DTF~8?yS&zY2l5MI*rSfDuW(1Tq%!AUor5^?)}KhDany z>L=LTBV>EhcjU;3N~r~Y5eTC5T_XSWxY9ZRc4Q4O{0zw>1iz!t(>+>?MdBSG_D#n^ z{EaO7hziG@?CBq*MhyFHKfKqWe^>th{@#D%0u*c(&|ni?tqI>6OQDK!GAbkP*F|Fg z{anP>g^5x=KJaU^ygT>#kl=kesvCrqZ&?R9dWB4-q*Rb&Uxw?eGA{0)DO~R-ydLjH zFC362KI+ZK4W_6O2yRUSor{Qpc>gpMr(GoSxOjA#36l$+uX}Hu_{i2_ged%a;~Gvb2jm#)#&Oj0Kt- z(I%D*#Aqojc&I!i%p*sOpYQADb8fo)oKAG~7o&P~SQ7V7U!O7)puBHgcIKvTgbohm zmJpt9UR7>yzmLuSV&#cFUQY;qZgU&cvyQdty(xhki=3QQsrC=AtMquH%W!E^5H>C|ju>0-?dEYA!(zfk{7ZHg6c2Ee$IFjI#g^fI;kB5--aRWe53%Kf|S zx>fl34?DdR3l~pFyUAf}7{3GbD`(k#`Kzfgr(7)`OF*cjU7=+`;32Grmt?SA;TfL8 zh-E9%mUt#N!Dq#yU@p3W35~Qd;t_%m{}>*p@p+zNIypIwmma!uo$lM?XGf{uWm&g2 zJ+nrmH-b(VRB6h;3vBqkpo_o}ui)Tr@&R1nKvn586(?n47ZMzWA*7wHYQf+C?5gp& zZB`I}Qef)adRyog&X|6gTfaYL;9IgwyI@bH7h*YwYPrXzYzw%9r?tsFJ zaAjdq%4QcRh&O23EeQ-XxJ5`~nrbMMjf_;g`t6nxwCuR?DLg!DgHhNUwlnR4yS>dc zx%oi%Ion_ui}@v8nwXfN+nx~YX1Z|J=RNe4lk;@AYrI{~&~v+q&NBJU$KRA6N7*Uv zopuShhJVxBDRrQ_YT$Y2r>67wGrRk+c^x$5y#OX7!OpHF=Cb&}yl^v8+@I9c zx8hhQbw6RYXsSdmV`E*fa&WLaL+VYpECbSqY0pzM3K>KwBC31?$svfFJy%T}7PKP};Rq>aD#>C>N$!I65+DhKYNBBLffRaGHl^Rf9? zr{i00PENrSH!u)nYwL=1KcIW1(koFyqP@LihQ0bLHVK}s4O4#)Q&5N;F_!?a ztT~jkYs>iH7R>bWe;zbK1we1A|xF=?(>{h$<1pQ`J3jfr!QvDVz4PgI> z&Fvx8cC*rt(a(`k{CWBH5?n!6F!SRFCRAi32gnuMT~`MO3leOXjW_Sbp2e}2D!KH5 zC-UdWvBs5?SGbs}tlmhw1|J%>43wnwS+kcAbe^eMuy@#pNuEeI#ok`-(TIsnqhO=o`fLULc+aM%=ad`QIjOt5 zY>fp87fc#x=WNfmHl?OouLP4~wh|rv1gUiOmFusmj;`q++n0N;QPCrfGJQQvydDRh zW2h;?=p(0dJFh^KGqW&oNVBlnK92hM@pJru*@u=I&kZKtT{ZDq0GpymV z5?-hJtf9^J2W`g&{QZQOk`Rw4k7WJ;@zGE4NQo@R8HDw7fe$3o&tf-kw`roo`A=Fas0Z2zVps zp6;$BxLOYdP$CMA{ah7p4NDFQ*1Oz72>(R>VEv?HkH&6Vx^M~`cH=MyuV_eyBOdd$ z9u!x{QIKAq8hqySVyF0_l|NFb<21iH@?AHR)ALh={L&A@Jq(@mlU}o7D|( zyFxMTM`g2SR>s)Nk9`x(D-jjpx%G)zI@qz6hl@P=!C4NN|Ms+74(Sz2*@k7LFM4|? z$g<97#~c1gC{+%BFYJkJ z=P$;Rimxv)4}V3y1K%K|tdYsp2!o)Nu3Doh%G@w*7KQ$yZKVdT)y5ETOnc zkl*B~M0hL<_0jr*5j$KpchK^<(ivn>S*ro8kr;iT2PSHG-*&qVGiu_#slL5*X;K+zf z*}#FAi@3lBwt5m3X<%$;x3IUjxVQIceoyRyIJ`G?SH?Q^nSzJyZ~PRy6-Qonv#@m9 z2$O~1Eev}w9zdmlCZqsfSE|(&LQ1lV+Ul^OLl*3!`UbONk)bruFS8_791!3+Y#q39 zdH~uzgpK$OS_gHZhE1rD^JRglp);)-cC6Lc(qv-SRSWa)vKUXwxN%+aX%_nvP0$LJOgGVS|I zW40aH`Rck1R<#y|(a{ZjAlP}7+j;au{`sio4SSZcdCpqscvOFkH8!SW$mgT-5{`V0 z9Nmn3X7%i$wY69s-A+_QeFGbL46v^jZL>xu^}y323qyjC5txgr&OI^_5Q;`e55~vw zlyEL9DyAo#eh$mqnNV-dw%#Tb-yH0_prajQVjNmW&g48H+4iM*);g%Vx@k&GupaMD z6Zu-l4aY0(tCmJ?t{d*Y@LTatlQ)GY!qJ+Bh7vC)hFJGuJ2E zLbvUMT13*OvKF2y`s%yO#y(BrrKx(~?RtUFA!D3j- zxfLVAZr4-#m;Rm0i(6w6<>evu5*HJbH`xhSr5RdQK3@)`_=7%tY?1t7?qVO4TrnS@d@f0mfBA$bU!F}B0-_L z9cyFBRI+N6>fcA!<&h3f)*suStBR?-){*`sHKUO1<@Mg3!X+rY1SCH*0hBFnjLbtF7GD|CUvra5~x+ui^`_60Gy1#eu_v+b-*5 z2mdP7m=o<|!=`PMORd*9lm3yngg@V|=_dD_wcb^i+%XptWIj(dO8o?5#B%1E^ueFc zl9R7eYxU7V5RjzYi2?;vSX}td*$3Eqzfule^$pm(Q2Z#;JY?>|iOYbenyW58B=0gX z!pkway(Ksc0#6VLc7vPIX>~OVOUks5Y-W1&OT3~+=8I5E)h)H>ks)v2sudf_xjK~Q zKK2vxp|468GuT@8bRRb}e)6p>Li(dYoqIySX5-^n&7@nP6r#O1cXlcj|6Ogz3aP8- zgpma~I9F_fhn}je<0g#Y*S`iF{nniW?3yMFo$3ZatP)B#gw(&6Vctia68BTH?)Ei) z$ZEfr!=f4>VRN+a0QlD`7G@YCu`w}Chc^e~#6eJr)g`(ccLx{C;^Z+hFy=1R{=|g* z&nd!ZSl$tJW!|#ww%VkA?Yept^yJCGm+7}KSZq)1BM{pmJQWm#Ed@|AVo+y3Mz0m8 zT|{a=wsO<^YBSwi(HdBUirkR;l-tUx9bO>-rP7LJ3?TW{Cm0wST5KQJL#ZlTqlLWY zMC}C77xH=#*+id!&{C*Tv9b(!zCC)W9P4C>j;Y&)Zs7RkRRo;{N9Hi*|J9V6M|6Ctmi&%|w z(>Y)$`|b6W0o2^p#kb%ZkZa4%jzQeJcC1`%ntDkz0jYU*20t&)Qn+`1*Var{ zz+RaELPn`in3Z%syypjkE=R}U%M+}dg=`NamJ}NkYGH5Mx>4Hm^@kLZGGKVb27r1` zw;$?es@~b)13Og2J3Y)uuSuu$3a(gLtwDc0)DKVa=5B4DD7u#Q@R=P1jZ))W|6D{l zwQq`ka{noQxBH#5vI^y>K3t`^TZG+=BgM04*GX4C4&9p7kJwHRK5tqF1sj&Z$5&2kwodwQOv8t=bA2L^+ z%;WqgSho-h)48&ev$~SAcnWhfSv5{mBBZZx z!#0Rfb?xH$lY!Ez=yAxsEI~%PA_%J0S9J;mWe8|~-dyIv(M5g)p*;DmJ5|g#uvW z)o)crL!FJ}*HnC&IMEN>^FR~W>Xiv_IKOw_y-24T1S+NO1NkQ1-FA&LsL)ae*7j7r zTra#ZPgPGZ4tCmm+h|ltO^FM`{I^)tXR?||ja6`MwKdi#6dG0_QewSS4)6a4ui5?4 zY1_h{CCF*JI1SENj#MM@jJW9_mOmI37Wp5{bUOR!o$V_qWEN8rv=tN;OA`{3EPk!T zboDSjl=}$IAr$J)eik)asx0gvkSgNL8eO(3ImyW}Sj1PAMF^YcZx>Mb*Qzro~+4ZnFy?5J={nQ4GURW`ots~ z)bw3K;OT*3V~xkT^u{GYR88>>5*YLm98Jh(Xou4p5D#5f@+iO zJ_La)X*%(Z9zVuV4scyn*{TuvV(}>g>5>JENKx|g&{m80fp_GO5rcp?DXCB4DUV9KG~|6*_APR!@WnrF}*cPMkMfEZg?WW6Yg*vW*0#<@n;q3 z{>QBE%f=>;;Ww-9?CkqxEWY4lU)V1=jbs|}kl%t_4IG8Orrmy<{sUT%U{lUfRA~5G zdRq9zJ4ucnCe)A1% z$MZ*&nPkK5?on}!-I>$WYi=!+Ao1mG>(j1u-lde}*hn=3f_V#8g2;%W%j2E8gQ-(6 zzvu$nbE18s@6~svUnbRydy4U_%Y)GgRa`NDk8f$ZI#W5dZQ*Pz#-x&Pq}{x}$MA)$ zNqg@B$?>SX+U9a+DTc*q8N#d9pEGYIPpivR|9CVIvIvhX;=cRm3=a#(kTbji!uISt>Dd z@@!30tJ8iGXB<^49xYraCyQ3S5lrgX7)>%EXX+cxNsyHa(!#|lz^*Es4t@W=>~$+8 z->P%xN(7h8X!AQ<JPl_@m68y4Q&BXxuUfvDek5{bs z1Ksr-qrOH(`CMNZKc=}MP`0W(h>op!%8_CAA8 zKKth{P;gRues%ASRd2Z&-G-UO@!I*SFjND}AO+GK1_q6C&?enQb$uxbHMg0~H9DVX z?Wepu=;_G^<8J6;W#+zBI|C3Yh1u5!h>t`)0qQDmHYQZKbsbrd1%!@6IF&!-PFH-iW!^RKxr*lBYZTHr@s4D)IC3 zP6ppceN!}Z1E?|HsU^seswx}8ygywAZ7}lFloU3$RZH()ER>@yQ%}&g7l^(4 z5O{fall#uqUW%J!2AfQjm7xoTVcfAoj&XQUVxqNz9YXWW%tI(IZNy`U_#G1jt8HiM zU72cwHewlX3UhLu>%@cg)pN;#YY{1BD zj2S^Gl=x_B)F*4jGV}=~o_>k{AnWM?tf^oZXIo8K`CuDkPa}8OpdML(-{Y+Ia12=e zTqhJY?gyei{p0+P&-QQ1?x9v*mL?u{hPjEZCs3c!=M~3V>=T8}mlNNiqwi*O7O(EY zw*6y=_94Fqo@~*v`QQT3zOJ&HdsVx5W6u8Kg$yC#y{xgc*U2M3Q=s;&D)^}!<`@%zo%pZe-l&%r`r;&y?uZo~Nkx1-pg z))58z)tkuz7x?v4@}1eq!%THe(9X{FVfO2{MBj5+5{U>oA>Yu}^Zpbs&{2NJ=F)*6 z1^88C-p{Z&2g963i{|#PH-RFZDH%WOHvj8`>3;IV@RgFORVJ^SAx(Pjx-9KAh#VM_}mB>5do7luL>xKYqfu{*7We7q>@cV=klD zG4}Qdf61uWd%u09W3m@)Y%Im%RLgog45%b@3o4-a0wyV8M^F_O{!(zdUspFiW}CvI zR72*qb~&QQi^u6ZEg}_o8CeVrE{ZQ*x?<-F=Kf6C0!MVWwWcG`{(Kz6=KkvRVXG&( zkmn6Bj1QlAe;@mkfXjuf6xnl$hd`5AP_;=YY!Okz^M(G+9>~0f_CVWZa*{xLE%Bqu z=g;$EWi!t&rb2;VHWwUBRno6`r3rkWd+9g+;uNrw=|3v31cPd6hCzpY_psXb7)d%svABW&x_iZun&Hg`-4RZ27^8zD<&{2i0E=S0Re#w$k1cvE_%Lm zERWFc<80ofk`yqKPbxF%GiQzwrWGRn_Dl+&8inWmW2U=4;IiW>c5DR<-e|rboHu|0 zctZv9L^vY(Ba=B!W7xar11&8Vzr&rxp53;uN#Z|=A>(u0b-)s_n{+q+Gtc}*(Pl1l z>rWa37uPCyq4Q$f#AzfY+Toy9lVz5!vgLd3aeL+Vd_-Sc{k#7D&KG}jIEclG#<}QT zY_0YVcl952^y7e*2i@(Rf<|4w+o|XTVWTR^G*%3ZdA z`Z-NDfv^C0N}HVKua;Bag(ty;(cUZ5iUW>Hk=bSxgP$EP|N0q){R8KJDy5!KkT!?0 zegB8R3}EUraa0Jt%c*hgVDa}$G%Ol8J8453ZhL~fZ?yMLgs77GfN5H0{kW--rg6X<9OU|^(`-dWU4-d zz?c~_!AEMEx`YJFqxDJ;WFFP>w(ICf$eL()UkMr+t?kZS-_H65JpI&3c9WJymX)4Q zKjP(T)Y;Dvw7rY}#J8#S-~))aRkJczdXu4yxQG))&W<mrl4r2^Ro!u7d_1ws zYL=qi_Gm9nLx>yDK6gzgQ(G3Gua4X_G}$#qw+|p`=}uOn4Ulhx(IB9XXOUZL$~I80 zb{`#C0FsvNuCo_P&WbaHBVHrv%Xf4xD918Cr^Smv!@Zmjd;*MoLxS1_Dv2iP?S+GA$@wUGxsH;k}a|tvT*Vgo98@_s;-*#sDfbRYguHY>`|mb^@A|c6`%oy)8 z329t{T7%UZFO-uv%y{cboYEhX5rhOO=EeQ`FYyclUcti?H4Bs! zJb0D9GtblvNCh7u{WEY8l;$5&QrdN78`V58%5Q6!j)}AvKTob})2nybN?(vCnC`5x57*1nD%{ z@NKS}uk7s9m>ibYBv@p#GK) z1nb?h1~R3airxsZfdgj$3Z+ttiVJQG+`t|&1P8xxx^c-|x}?A61yX$U%gE=?5)XcT z0zH-XJc%Hb78Fbr6ilM5Lw5f4kPY*2u&33=<}o7%kg*LKmZ_bb=)g;;E-pobO*;A* zx;Vi&IdpS4Edc`NMZ&lwz(-liKwe5h80KVmKP?}&#a}``gl4DLl4l;C?zEk zMYO-sw3cOw#`Oc*%jAi!P8XD_l=4b#6%k?YY#<-Jwm99vt(k_fw*rALGruoKMQg+d znC=d?UuO6dv$11*maMC&SPZ%C1@tQ8^db05VjgXfD0S}oW>Lz@c5e<0HF-w=m!g#? ziv`L1W;JOu{yA_I5I)tEk-2x9;vf(u8?Bj-gT2qn9Sg4AZ+w)u)v^;~a|HcM4nOMM zVHaI?XlNVEeOx2Qm=Fvk$w%X4AO}YDtBm$;4QPd5B7@R6DA;U0*@y-EaBVNbp1*ah z|9lqSpk+ji0oB%01C0cfxn`!fo%xU;5?&HPQ+cJKXUcdU%=FAWZKP0xPhv96fz{U; zyoZ%&;hz99%+Ou=ct!U^a+XEa#*`{v%ZiFV^W7y7&i(JLUR184HFrI)hvSz0`$5W& z^fE9_xAt~^!llVu)#~d)fJ6MZK92j&w~Y@;y}u%heoIdWP7NFicGLFb6%G2i={JOF zVib=N{46Ftu>+AI>{vD;3ow5%S6Zg)+V$KO(6`~t4Ee}Vkh=TrSuLId`>B!BuH8Kd zsFGRuyJW6YRY|r_85kI9EebwIM4(qnY9)#MrEEP!=Hbzfpt9h5VurtUA6t{Lwn@vB z%|X%Cp>^a~=^*i(fpri;YHF743SKpxZ?b^Oz*pt|64rj*Dew$H-!}9V)!w19 zx1Yhqp(?k?45DSGcXKJNHNx3-U6GAeG(*L9ZHoN*+Jer>r5u#@6dEGCN($-&;kixY zpTcKccR-o5JIN0kGlU}{q!tt$9OaIO-~%tlVs^_4KDB_Vs@1arV2nLn6^qVR`(W$e zv}SU;Bjx4{bj!SzI^~9g={YQo4fA15*mwS1fY$>#K=itvoY1Yu?JhZO@HFhtHn6(# zJjP7mcr7hOR%qb~zbg##vN>ja6!RS`nqB&Nda<|IAjv&!zKbG1Vo93PZzHQI_H1rc za=))W(y9n36>D#-4SFV-M*?It9KQ~SyR?b*oPd__Te;s!rJ5iH%z$O5-kPDwaZ5=BM-sc4t?i_} zF%Xmx5$vYV41I5y&qTqp|5Z5G!y}E9^))idco*k_rq8@*#|Myrr<1iNsIei~eBbaV zF9swaUu`_EE^=N*IQ+i~fN6%_`DOiG9U#RB9Refah`C8#C!ARC zZVYjo$G_G&Szj<`Vd=;+UfDH`jnyLZx@LyVhwEIdu<3j9rl+?Zor2YNSD|LO*Eu*j znTimC(>aKIGP=+)q7%4Dksvo5ejr*8*H_B@`oGeK74@GJSAZJa%{Sn2pD!y;VZSqk zRekprOzt#PE~yu%r;-L$Zc2_}T%acZUo8NdU)u6MQ?Ag=NAb(asTs<)9i|68cr=`x z_`+TP^KGHJh@saKww6dpm~i4h!NUW6S@F?IOM<}4RJNNT?}_gp^uX2$kcyl+Ab}Ce z?eg@zF00)jfFkwyHDvaAeE)O;DEzDh<_uO7IWK02XWE3DO_p{qhE+UZ`sx=JoK+WyxrYGj1|CRX>6ZUYc7 z1;6z7_o_Vm^YW#j@3jd`yJl^DK#<6i@PAj~P5TMe7~WNf0h&q6^~R?PC^Q>g*M)^E zS)!Tw0A;$4O*w_%HgS3jDbX%A?f-NiI%pQDCN6bjV*CX)kBx0;>c{(M5`vMruWgu& zF3$J3s)83655g%a72<&QW81Yjhm4p!Al>h7Vq7>=EE~@fNZJHRwGS?H9oI<=HbKFm)84W#(*akJ1WeI9=e4T2;#2 z@;658dp@lh@LKY-$IkVw0=YoR*<(H)-Ed>}ECL|QN=U4H`4YoP^W0Ka^ZeWd-M@{)J}^kKkbybZ-mz@6iHJ^~}<6$Y-INvFZ1(aA~g0hIEKla0ZGGNL^M8;fVa`S+^MR!T+1!a~PG zJhu5)!4)~|#tO_K#mRJCc9e1AeuirASY^AbiHJ~a+gU@WqtU;rr9ivLA5_3s7DM$Y zO?>e8XZbIo60L;=%f0mB9ZNNJlcNTo2F#Ae!HMnUT!Cz~KEW_QWp^Xw$YZ*k(>a~E zSWp0ZzD;y>X91olE5~rUD`cdrX<=*2wXxBtnu`iK^R>RajtxeS26Pc3f)d5!QSav> z`2)Ely3nT(Ib8H}t+x>X#cOQr0|48`@y|$_w=R6Gjc|Og6ZDdbsLZTY$)wucA>w+M zL$tj`1E*6UnPveTFs1R~YMty}iTqg)DSqpj9|M!461X z0N3K^J=%P{POj|b?U7jqhTpAEPd`HO>e2h8UBx;Qs?Jp$581(*=1*;j)>ccytZURT{VsLR#c89>BI{Q<_qo-KvQ>Xs_D#tpGWt&%Cl~+p(ZLEA)jT{3$i{S~mF!AD<3NV9nkc z|0YnlIS)a!xnxhP#jPhNM+lWL61#BOo_#{amMAoGTfa&EzZ~9S3eDR)?DM~IH6D^O z(~Zh6NBZjeKp3`Y9UmX|Iz2#`Ul0HGR_YB1{f;*upB*ZBm9t^k*z{(aQdn8lMwVBK z+6j14Wz~UO;tlZd&MM%t6I$K2X5z%9rZ&B<+Q`Ysh_0?)is|jRgLh)oT>cbVIo3k+gi%&9hc1XMXqj!NM92H7vVH zd-3MA$#GiCT>>tPfA4Hm2sMIACgSzC=Y2(57}<0|z_sc2=5T7W8W=v>4kiD{lLDoM z0vkMP>c^)|hP8i_X|&L{n{H`h;(MZC`lO&EPe4}O(b3gn`TmH%f)TU(RUrMb1h zbBMEOJ_W@M{E&NwhF{j!X6fm2X&Lev8S*)>FlRDDPNguojZL2nd#665sqdVf{V_M! zJ~v0*Jm=rBG|C7c4IgbUvp-Wlx+E8{GP6T~K<>gaucOzK`422tH_Cd%iA6eDd6xof z*S=Z%_CnC>=;#hI0V%}2z#1(Ye*DL4tF~rDyA$mrtFGR47PWD4<{<8YL?V`B=Dr~K z!Th%P_Y}FfWAjG%Kr8~j0w731e@+}cZ`xb33iI4Br`Z1?z|v^cCgIyapsWB6oV39g z3v0sMHnVa=n0Lb$?~(r^;j57j0eGLnZtlYP1Wrd0bk(_pnG zybDlaz(NgAVp^v2QyGyrm6kD+viH(#!;YI zcN=O*nwp|=b&fVqve3#Q4e^=Mb^j`TbPN?5Sux?<&VOQK@~As*Y$1IOyk!pDYE9>+ zQ;SN5mQT3>QxwkyH#H}M{t7pUF*#!81kG`Q;r|nPwd8nTwL+iIh_irP1XK%|KGI|s z$#(J#eg)C>FP#kOh;dMu(amg^4EZOILLGU8pVF{YyeAzY;CnDg?39H`Jc$8n( zZ-Vz8sF7M~Lh)_r5~yjKZ*+iIJaw|R(Z(Ow8YnfatEZ9s9Q8-H?0smgc!o1Hc6nn( zSzp~35Yn=lp+SoBO8s`4L3k1y&YoagTl3V^K8V-@UITspT@R@2f251jqb!xofGKP4 zf|(>9nV_VO=qFjISG}5AR*+}<9+X!Ak7Z3-C&im~(0jckj8yKT^hfJ;{*v$?o-QSDI%?;7)T?Fo?F=-**x6rk$(+D)a79 zE-~lW#d)nhJl>dym+!@k@;Yue0}~UCD%Vvi8G_Iwz#QP@=%v5g{0|LD=H;0r+PsF~ zXJ`lVDP*ESjU&K0_4?&bQ= z_D|i?XdglD0(}*+fqPS4uh+ihfHWO!-Clb2*UXirFO2@Q)X6BF5_8sFf;iCY7G`zk zovhpjTMFH;d=wbqd3DiqQ)1sgkg-MhU54Uu-~U6ZM8u<6?=bq#c`gEO6xau_{vH_} zO?*ARIcT-Q-@4z ztLvWN1od>v|Hs&0Kt=WaVdLnSNJuIjN_U4e%1DRQ&>+$+4MQqYA|NUt!T{1C-7%n2 z(%mK9&Cqc-!uR*ScisEH>+Z#JjWcKF?7h!E`+VYgo=@}aO$j5TWuP`Vi4f1#uEeux zqvx=x1#B%)mCgMe_Zh-4&exC&>vMd(t-1N*&mlQPFjzL&8kbS;H(jBw2RW3VD((R5 zM=1B#ub!1UWMbT7@j8X?ANz&fdE1I&V*~j4G2ZwM^^(3UF2Vpt88u#AV{_&ZS!n2& zfm@P8sv2obOj)m8%PcGI0*6Z@id4W&H@T57z?bfS9iJhsMHeM=K_Tz3+`J`nbNC@H#2=^~{fQw?c#BCLIL#m%$Yn^7+t^&vdxo7v@Vaqk& ze4G4;n(+~1u>R>7-V5~yxMVVDcpoP{H`!=uKPtgDP1VXa#W)Ce8+h^Wecd_naW52h z+C&I1D$%dCObFvp1l4a}9E^5L(XiuYMjx{sU)3b@^r^Ix9CdXC^JF3anqMFmdG~Br>68Hu zQeQ=TK$JEKUcFozRBc?WBYBe)@>l#P=ic<1Lk#Zo^L0*oxiWwkw5LiG3g0Q*hM(niVEyM3xVz zwv}xB>CmfKlRn%EMk6C}3j+Bm`hbXNbGT5FIZEj(=lAd27y)mCQ&pLM-}(3DZm}Qw zf^`dH?_0B5^1Y`QR=R&keFT;CAQm};xw=F|MAFdwy7Q`t2xXLOF6^X{$Pl+jo&)&+ ztnqQP0V@}PeZ&K0PzqS(p(-jWva+(!y#@khEp6=qHe52YYM(PW_3?Hy6&L$eSJyv5 zSxLoyOo2t3NIsdrT>9i5InYPcEjMn)Mko!b=01G*FxLPHN39HiSLtj|pFTA(Fc5|B z6#(p5`Soy}ZzJK(ltLA5#n~_K@`A6AHE}9fS}qqFH%o<+AAQ6&GBV;aZo+zZH9<*| zEnOT2)kbblpSI+DmU6kj&%vZ3lQv^6ec$eSl1enN>Ty*vln|hR1BYHkcd@y$uI^YM z#^S=l#&~5hsQ#GJ^JjjCQWTCw!kubY=(N~5QRC6K2cK;UV{PmF#>c|Ow%+|+63S~m z_ydmFZ`*9aODW{cC?o^|j6fmt?wvbfBs@~I_(uI#V;H@Soa97>2~Ha1LHEwrsFW%7 zACeND&5uu&*&X))ed^`)m+06Kh+kQ&1uuT&3&ypny1HL4hs$hrCF%P5`g||W4)*r; zva^{HN}5_)?t4o;-Y5G5Y}#5{Ul9mfI3hMS_S-i(s0N7VW@V)hp$Icq!F3e!J@*1! zD1c%Mst@__;S`7xM#<4h-T&9AB*i~%9L$W2N7L0fKH57WpFi7bxvvq_AG@xu)PdSV zW~KhO|IK!Kk44~pvZmQ>Zf8IRkXCU)YZRev7Z0+$1&?l5H;^4cXK=F?d|nP!+BNn z-yGGFM6}Ig9GXENbhofP<_Zf=AfFVc4hBq4F&>_nV8>mI=g*!NkNzU<21nS&F{O>w`Ce>oZGHIg z;q2r<8QfN8Z-C!PjgJukD$NX#-MV$l$;k=m;!{b*C`e=B;6y}32-xF~Tlom_fq$_UNkf)|Xm)KPLMPI&Twm9_1(W97!i25JKc#DL~EnB`k%cXr~!gQOJ6 zj8R~YJ(-UKy7?Vex6v&ieuRLJjfu&uA(tzc*0+jvPo}xS6cFKA9u&d&@v(zE_9zO< z%c-8c{yS1^9ziAExwxD2xs9KnAF6I(kk@0;-rlZ2rs$NYSgjLZS_(D-c)kHrAyg6U zIiN}C@>(|?qS^mD6PgAryS+tqcvzM-7kcwX+fGHWY;$VgiUu=6Dpx+Z1MnzY=YC61 z1u-PJQ-eh%C>UFRbkQtQQCYct%NaL9q> zauc8X($`8nA_lXvJ=?6DD2Dj@_0RNc3=E8Zt5QAo&8a%y2`L~URH2s#WWS2d!U6&s zKalWz(|!5(=NrvDJtjuR!|5QZw{PESMFUc^M$W+b`FVxXRp&|)QU z3B$anLl(SWJSV>a+0fO_Dyq?2pP`p#Od=!_@Q~6$ujd3M6Y;1<$HuCyhw||7@c0C< zDTKgglOX0TBq};l(l{{SGSd*EXD3RqU#Yh-Txfi-HlhX!v*_r2i;Ei@zj^b`%fTPo zU@LKh!3GC%G(%))@kMvrdB7@bEWLUxb;JHW9(2Q`PL_$pJv}RVb0RN%pY_xel0^+= zIqjO=OL#)*x(e$pFq-hMhR2qT*TlLXtGgd;)Ph*YMD?PomDR?FSP;tQp??2C2K+H| zS^53~}28cNZ53?I)dgHWp24V`Iwu zK7OBQZ{IMR(_rrCq4^#gd&f(xtF6sp>!Tf(B(%h#e*5k3UY)Zac2tnjAo|ICth>g~ zY{VACB#nnuofCW+bkosSpH4N~x11ymScSfS4=z_)T3ThL$7}!!?hS)Q_gFYPIAm2O zN%vvmMn3z_$i##f+6aTeuV~rur54WnicbVv&|*Ogtay% zoVGu4W((c$K2lY8RPE$RImTCknf*e%Q$QLhLxtVq#hs4ROH14Jn1x(<_kIVACHiuy z&=UYCCIiF#7fnXRf%|tQ9aY1ZOXad;m0AHoZ;&69L~aGf<5UIS#eBRhR9#iI)}$x= z(S|=&*h_oIw}Lu#bXwyyax@r{Zrz#)c;=&L zQzezc!(+@xs_&&22&LWwip3L$y^UksmF|;6pGg8iMV0-TfHBJ~5B;~In;yYQ>LQ?)p3Q88YPQhl#p?yK-wIU&-Tb@XoH> zLf6>R?CR+;8I8mI4QDOpw837vcTXf}4sVuKWMTjX<;&(*mTBGPP+ImxXtXnqCr3N1 zWaTz*Q2jgSgGy(v%jw9UJdebag(Dx+He_sQy64)?c~myWa6I?)5Z>RI$a33M>JWON zprE5|35sWzR#v{q8K9#z5vm^ETbnmussFl2Rqe{R4>Q>*n4WMLxgo(9CC7mKlFr-W zgT&8lb)kl9OKmiHz_&g3sH`U0s-sGu+j6&dVQf^50SP}btRj9$5;>exevzvy3++#d zF`Rg%mM&Il*AdAUr;Hb=&J3`yV+6|k7IG&s>{9ww#LuBO-;Bs}+&3dm&y;xzCMwY=~9wDi&)*=o1O!I#Ul&-`VfU)m%vE_7_Vp>gaNFJI3UX?>A=T z3(TfCu!zgr+cU%}kQ2oi@sb)R_n9~r#>5y;yi!scH1t8qsjIiH|Cw7IGCo*Gn%J`4 zU*7O^bF0VEStFn0a+lErWKsLBv^4Sc!O#L@0N~>b1r~&@jY-7j(WF$6Yeiq)U@8BIt72yMG$O$V`sGu+B-F9e!$m(vvU_dc`@ z0PVoe$o^o*K9B)Fvb>xI@6PQC^xI|(%I_?Bg~Srwwtw4Fuk-TG+#Vy6^-WGu4t4Gm{4Qg@f`d+#o^vH*z_qFn_S4;+IXZ|^99X-(=G;p4Ds!vfX3EhkDJfHH-xe{>T4*^ z2J-r>7s#QhALe)W`jo}?&)%AWfDN8B#BbkZyH~taXCi?@eAoSlQpU;Ol;@bfdMAC! z7kE9>DMUAgJopp*I@?$P5O0yJui5cDv@_qJoQ3fZ8ZfK=HNU|})Xvf<>y#d14;CY^ zOQ1DlOQf=x$8s1(FpPx0}*j~lyGdP10(wDBUh<$X?N*m*eE zST1ZwqWep13T2+mq8#4bFwo4CI^Q{=r-sjV9Qohf^K$8Bq!#ixURmZDijvbvocz@l zPRaT=4zI_v*w@`dy;vPaT&UC?80xbY_>e~3OJ%iw^9UCb1qn85_T zc{2&3@@C(Hy?6Eoy2(@`#0S0m7W_f!pOGGas!b|YJ-z+9E}vd27xA;2o}uRTvHYpV z7gt6mq=XWy-ueDM8E?U2lOh^nyKnXKL&0DQh=k|N;;if6?n+>R_2~j~8%cfyO>$DF z7jh_$__QvK%toBv6?Zxi)_Bye$nV$PlLi>@remOa!c)3#* z_LD=tpnS@Giry1|lc(~o8Sb}%nv8!+yuezU1CU2Gd7sHA2dnduZK+E}O@?%_H-d1h`_ z!xcX7n3Ju}0<$$dYaVBRS_|d1c-i$>Ss@}^76WUGI=QC{i&Q980I#uu9#Mx|=6Rw@ zy|ee4k_!$@liJUp*EfAnMXj4c^A$-Xq4j}#9;Pdc!fuIQPg^ahTiZBsXIc zuUwGsyx~!;^W(mZ7N%Iu{D~^~`XI2P#ZKIhol?+-n41>kP|E}JYe(IOhw8aXL_~@B z#7p`)3UH}#om^1ob)m6MKvB2hm64v;d!`$<#dDf!8Zki zF?)y@)cNSgxvlk;w0&a21P5I^z^=-JBg!JM)@Q)CJn{16GPYK7}d%iXER$ zu;Z6UM7PQl#d(lOJVO0)J~shrYSJyOgH9KE=_!JG&W#Nv0|Rz7LvO;_>-(x(?1}IQ zLd*%Njcy_G4i}Pi1`?1OFqk)=@5m9R5ouT%D4#eMkRv*dP#7^6)@@r`yQwB?&4T&d z17t1>XJhQ78e$E`Mznz?3KPTA){>DH=UHm2tedzO!9|RP?$&$vz9$<)c|i!m!*qrx zXK+o#{V-lGH!E8e$$9QS%aG4&(AYVcT@`da?yV^dB%a3ZRFrij+4<<^>gwPRsq6b; z_CV07&ft6_2vgA>O=R$_c~guN>EqJ7wCSrw(Cc|x))8vpv%I`2VCS|j7#@6#S|81~ z*Hk0%6kZjWa(7r+b*gef8Sd0eUsmM~qT=`_X3UOu3se%5isHzk+$2~?Qr@;YlY z4`ZAc7`Zok(bI!url+Hd?%TX>}ow?Ai1Pjm9d@&|k z)Zio(O5kb|cQGY}@EEu3I`P>8+Q( zu^cOF0QOC%=;lU^o83>BO5jm)89hrg#=8`VRMl7rmn8;BnThtbLg$vJ$G;4cQ`k~a z*ly-CIL21$nT6wBn>j8rt7o9V3lvZu}h4h>nD{ z;?hKIkI5wx;HzeI#Sc*{Ha2G*9#_qBU#}29=@d^HiHR`Ejc_c<#}h&$TDrVxkuZcG zKPeMKPP=$Fw*P$yJ-gjb#gbQ6fAm-WZe4LhH)^Y_w0&>yiL-xk$IGAclQtdvuzi31 z7`~yaXp;&Y5)h}bSub>Cgq()vA^_dKcN8{$Tz$N~mPO2QeR7MG==^b*TS`PZz*T$4 zP0HjbN#tZZ6T+T-;Dz*?G%ZFyV9}LSu3(kU7?>^0?7o)^>nbAuKSupO-&+X5E+o{_ z(-UZl#+P&1b69o>_RV&`yMDfS_q5Vf$K>G2s>`%85|Z`m%m|5})F4K8*}4gH|AkR^ zc3MXgSxLZ+ZN}G|ongA{a#w-vwx5m`rDi@)Nnpag0Ff}AAiOtH7X3nRaQ`zGEO6R8 z8gEgq)*8)DnhpFucnduK&rxAd#Pe@D_({zz!nDTZaM7;LWI?6cS413W345r}b`w&e zOpZPKm$pL&fZRUQkiO7_TZMcM{ZU!>HSSM)I~JZ@yj055>s^x)+7X0HdcUb4j;n`D zc2(22@5&;n@a3-Twn+U@f=?uX3B6_2D#H@latAEA?^kE^mC5iFOKZ1i$iI zBtkP$xW7*>gGg z^+Uk@?%)7?IkB_l3j=GI^*Z|vTi#FHiC?r+^LKMikni`Hd!yAfupK&N<`izmEu??P zp%gQ8T3@#U^%|x?a#tWyUA zJa66q=Z&I$t~XthMu2*(EPMbdzrv@UpwLQ=FHA6% zy)1nX9o^mdSc_UtMn>3Etbe4%uAwi2ATljrO(nsiJnvl8)0sZS;o_Imm2J9kWY}Sq zdOFX7=W8$g+p#kJ_TF;w5Rq41>qN(PUqptf*#g_C!+QKtTb0YYiM4eI73cNDLj1y6 znFO8Y)FKE}fN3{ouauc^w6eH*J~Pa~VSurjiEiP77sc?oP*6U94D_zC(FbfCrMd&lMC>|1UST2!?8%0tzb?!L!$EvQA4!8@{?` zb1`sg3KY=O*FmkT-KijuY;hLSm+%`(MW+dP_Ukz8LL~dNd>nDxD2ohu5$B;PClH} zzE%5o&k0ms6NyvzuHMgAIAdiO8z?zwuk7{@>I9iwSsk5d%aNtE__wXhba-c56KLXI z2TxsSfZq)@v88KPCi-tU5@e>k#VC}B7O?(`aryedixNVZ<(3A>|z1I zwD>)Nb^CZKK2Oo{CaNA9mfJD-DudmpvT}HGQiz46PFm(sJ*Q|DTEY{Tw3^ckwK=yT zKYAgToS#I@47nOw8rp zMk<~TFG?ElDE$8w_D2)YxVn@UpG8FDBPjG77`Tui_qJgmFYi&TV|{|Ylr7S$Q7R!^ z#hl$r6FK2u-cZDf=kSC)x_M;}?%$KCo*kT-3dJL&G-mD-rIlch8O&`v{ao;J>4JyI zg{OYNTB2@iynrDww$fxdF(r{iT}9$(|^0vhw6zZrJ>{ zs9gkNZ7b!@>#0_`C_!xuGU1T4D49nuwJC|XmcKe*KW@+qkFb?gWAzTHT+>evz4Q$f zgv0r*iC&&J=;^s!jR@yfMDtzn^ootJw-v^h64fv*)3Vlxr7fXPpXZTg@7#yZEi6>H z&U;a-GBRUe$m!{=QPr3R)`JiV!oW~VYi54_8Pp9FFsoMR%R?gdaxgVHNbGn?>*5bi zKtWhg+CbpPQBzM3p}0EaAh$$I+u-{?PJ^L?A9(oxp8X^^)vFU93A5t;G(IEV_H=dU zRd3#gWpj_~sz1w>6_Lc|rDZoZq4_ZK>6m-u`(U7nATQ-_@OMyu)cTq6^ZPog4JDU(}tG%kOqI<4TlhgPv^BPXG;WIw>rLBPAKkn3WN-ey^Scp^6iE;Ag zaFSZP`bkjPL7tWxyZ*Fv{$nhOeeb)-y{?ia?-S+FcW*Tr!j4@=q5&|6Ao2z6S03Nk ztPX}i6q)#j?5PZdSN{Kd1_E*&!STb+31dhqoe$gOs4l79J7o^!Fsd+XZIFjQPiQPS zAj?V0d1Q5TyCjxmGh%A7=H%CJ1Yli7%Fw!BAY=~^-t@`iHNVGeo>4nG7kHe;KINHm zj|>JrB1=q%$AN!vPjx#W)rMDgz5mCTR`R zAS!j)ELezV#oM?=YzkF85JF?6ucLa2dl^Ybvoz<-&$mTboSeOEZ*h&shvi%E5+KZM zOxg6wY`PWXc7jk$6BfJ+a}OTGFap2Nqb4Zocxc%<%W^~r@vE)xXqw{A-#QnngU>-d zK0XF_V%oH{L%FECKPJDG^Z#XG%wXB7vAAwNvKQUa-hP<_;Z;wX%im6?doq3^X3yiI zS&eS_>$osW(-kjLH<61l-=@0m@4p^{$NQxt!B?uPMyC8?Wgu)#-F%YT-(XGr9Tx#! zWJO;=@2PP1-fLMJ^d(QWrR_(=fk3;+dl-|wm{r$l!W`o6t}d6G7IhC;nOk>k98@08 zT>UPDf-u9@&2VaXj$YqG49}s%R>9tbPzjpK(pI^7_XfmDHOu+tjaqX^7_f??5wroj?O~kXUQDLHcW_0*<)xUqCP%lyg9Y%VpH6tmE)^y0sg^95DCm9hn8dOA^SEH{6LRx^KOzbset4n&8|+Wu7vkL zuiaz`-JT|bZgK+}bc|Ult(dtr=g@0B<$BmjY?ia=7BJ}Od#U}g@G~yAwz0HDO#(b=6QhF} z<%ao*l&2tXO8o#s$Yn>BX@H3-_R?WpGQT?^O>=^iaAveEq)R3bo_BBjA~OH$AXzWy zpqISrf`BWWu(Q*Cqn9w97$wA`o9}6o7!qtBW_=T)^HGLzxMF{dPTc;~>b&T4M!t{e z0b6BzO^AzpTWj67I#3U^0DU&`d<&^L^&ajO;f@;IcTa>#X(A45g%~QCW#Ga#J(W2`)wk?Cxd7VLaD}6AO?|M|`B2XYC?8!YPPL6y=W+A*=*XBCJ#bNZ6Bp5;Ipw`$pFMeKt0y!e)sD<|B;LX~JWSBJ> zv)8N?5CRnVR#a$EZqJaBDl&em($N_&PBb!uzLcK$tgpV8ROD~B$lrh)wkn$jPd!~v z$6Ka$a}R1yj>jG{Yxu7Y<*2XZ*XeH$dQRPO*&ivMU7SR|{pONHMVRjiT>o_6l%|?p zz}KIYRq)Nsa6Mi_fur9%z6x|f{HjKMZho`(*p%&7{PjM>e&owrvO%i#De>3)(i~y} z3x(xV9-TeE9H%Db)Ad2kj6L{i*5_$Dx_PL&j!q5<2KFu#V6GRCdR!rP2E$`SRbReoImZQN+dN;%FDk=c>}sl%EZ0J8B};cIDjs+ z%0;7y9$lR*Zr7;`{bfu7d#IGwy3zUzL(B$)R7g+a4SI`)yGop?yS{;^ONkzP2Kf z(b3XSqRy$~`9*!^sK8*?&01VT8bRIipp$(ARpx=nNZBc$;+8KH*f{cs>qDYI`w4uY zv)z2ILvi9%Ul_%L{Y`FRF^2u{I6pOYZFs34iZxspt7xZcWW6x=^=rpfTc zcVlo~z6Zz0C|<>-AU0WD`@7Em$s|I! zGge2;d21z{ViCl3<>Wf^>(=-mYJpKAt2s!+n(E5q4Uju8rKFx3*tNJ}^2f0=TjUjX z;Y^j87FI&{M#&7%s%%0*4rZ};;B4n)0T|s}F~P2O`a8eB8sYe`g6cp!@-*2)&04ju zRzYIk_sF)dgv1H>M!_J1KU;sn_Kn|oBgV;>gON2$d#$T(UpbD;?bkt$0-d54nbD0=CwG6y(3e8o=d?dd4d5qsXCuTn zMoTgOgY6NN>BqnOnrfi#x_GY3d0;ieyK-8C4{(7I&2-7&CYF*C!{Y)71tRwGva(2J zU+>#^&!MywLe8j(gM`fof1_hGPv_J`b97%jmFHACtWKE&L74UVc?;g&ndf76@0w6+ z^M?9g9|s02k>i9`#P0oCD+KJSw0?DsEJGiU%<*UV;{(&ZZc($wTGC+c`PeYmvHHHxVEIWfnk^dFbnd0J5e&CK#44#QXZi)*tg@+#Z06 z#-XSX+Kw`UHV|!z9lj>7@21Po^!DWN2I7ujL1*h0+5I361oU2@@I2Vjp_JA;UK=Ii zbNY8}E!kSrxc1yE`$YqlV0KqcrSJYmUr67Q;iKEniZvO;@rFkb!GHq^g{o#i1gN=Z z9n9Ow8#$d96rk5zl;*^F|9wv<4lL?d+IC=L5=kjGr(Q9@2b7uUZ=sVO_E>lU1`+ad zRdMIAoKm%P5xUQzA(^@Yn+C`;Tbntllpz&xw*QK>O@2EQ` z!5npb7{c=Fmrr`REK}?WcEUsSJGapGa6{iMc1|6h<`{~DM<|--YP~dvlILs=QrH*d zA;6K%N(M&3@B<7XH?g&?9!yWS^Hk8y7cKMw^*{icQpXT>7hl?EDy|aoA>WZ*EGMnz6{H zU4sbTgG(Ac9TC-KVPX;>4Fd!XXana1^0lb1U-fyqENEw=+IoNzwjsw?X56o5eQ34g z&z?cU!(r)s1igK`)y|c|{=%Hy-nlccP1CZi1vYP;(v zWsl)XGgx1y&S0?K_i|~;KLAn%0D*c-G{0wpVdq5ol@-@jJIhK*od-uE74s#ZdGVin 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%0Dv8oBtU~F;41W^p}+3 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 diff --git a/website/assets/visuobject/inspektor-de.png b/website/assets/visuobject/inspektor-de.png deleted file mode 100644 index c6117790a467c631e17a8184897432c050c2ce2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152876 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ºjt(%HcTIIa{#Kv<@_m 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 m$#uL3B&Ngr;p)`+*8J>5ePX9t8>j&s+vb?n%d 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%0At*x7o9^MQzW6Dd}BQQGhH;jrTozU1niG^wq#@Y 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 diff --git a/website/assets/visuobject/step-debug.png b/website/assets/visuobject/step-debug.png deleted file mode 100644 index bd8bc9fae3456200245168cab2c4739772a133de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132310 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

    vq=S<47 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 Res(?uG*onz%M~9#`!6G*)d~Or diff --git a/website/assets/visuobject/step-draw.png b/website/assets/visuobject/step-draw.png deleted file mode 100644 index cbd27a1178b91d8b8e04493d4ca73c90307968cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177657 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 z%0A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%0D;PD8Pf;Aw{-aB@r$N;(3-CC<^r#e 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%0AtzFv$b7u6>5(A(^4NS;&@4>xaPmDd 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 E03WlXuK)l5 diff --git a/website/assets/visuobject/step-objects.png b/website/assets/visuobject/step-objects.png deleted file mode 100644 index 1f23cf48cbb62d8347b914323ceb8c3282388115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122625 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 z

    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 diff --git a/website/assets/visuobject/visuobject-app-de.png b/website/assets/visuobject/visuobject-app-de.png deleted file mode 100644 index b6249b13abc3003ccc771b12038a2196effa6fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201055 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 - - - - - - diff --git a/website/assets/visustruct-app-java-deutsch-switchCase.png b/website/assets/visustruct-app-java-deutsch-switchCase.png deleted file mode 100644 index 9fb096f76c2196f08b8488c5bf3f027b365b2b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57906 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̥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%0AZdta&rFPc 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%0D>;(dYv^#qvG)gT1{u-5%Bidg^W*# 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 z z8%cU+(R%*kG`3hD1>u^^Jq`<}6Y8f|0%?R?jEpK+%8^s0#mVrS30H+P|Wlem}kg#G?9YKtllC#Ag36dFunnKP6>2=>!9ftsOPhukO zJlf!L_=X>@g$iwXb6z@sZlXneqUd2WAFUHAUC2Hd(W56h{t;afpa^lXF^&|jqqlWC zL^|l3b4D^2Z5;R0`f_vj?<0BZw_l{7jF#+RkFBzy!h~>3;vT*vxEm-uds_9oo|yVr zaqbR6ud=IaP#Yw#kD~S;=~`9G;LX+|r~Lmo9l|%Pc0Dy8>2v8~GMf$ce$|m)<$&bHLQn$>N)N(~E z`#jvX;`y+m7Kdg9afVu0u)%v@DNiD}?cN^_JIjiqpqVklp{W>YOMx-&MBAM9-yDW= zeIqQ3HB|SLN9Sq_bUS59o1|cxIKW94Un+ z*2HWwe4G#V8K-51O#o(ys$)u^gC@SisaOQ5MyFsc1_%WrLuQgyKo!cVcrfj}8pHA|+%gPCBR(oeaARFH>M?oEP*`#Te}%blo> zJdGT=2~Xo=Hl~EunIEWsN_HQq#D$;b#~J!i1>5)Bpk^!@f8$aa^>>RLzIiVU?&Z=(F{4C2^RNZj=4P3#qiBnBh4oh8*MtMx zK((CTq?>a)MoznPQ1y*v{{>uyV|yuz%N6v{gl8(iGIOuE1p)v@{>}(})6v;p8RN}t z$k5uTKav;De&sf%^#mm7(H~<~LcZp0cKuvn6=CzhL7S@=Q5}bN=yix5)y+1Uub|Tf zS|FAW4^mRndI)9fZuV=L2*oX-oBZ=E#-&eySOHf`9fox z`E7JBn$@huGqHCi*rH`JJQ4_;h_D=du5&8JuOluD`p4f-AF7ZP)EvAku@2 zgw&Zy5fpY@1!GVbVQ^Ce-5v;bSgV;1&y%CszcY(m1?tpcB0rqbkDK#McD@_@s@B;k zk0bfeG3@`nF&q#I0aP=<0DsdP1?Ylf=D$JrR&J22OGRngT7UPZ0GPQ38&`Bv;cgFK zx(6o8qHT+pRL*TTLg8ROnU?pUQYKle_8vv(+HqT`6061Rd(DhA` zC;%AGkRRs5tT!VLfPy#3MAHK;w-K#rsdiFX8aOEXC|Z_7ku%I+xZ*r&Z$ zi$0y%%${&77X)1lRgeW-hHGit=dd^$7i=qYoZySxRjMiM(ix~OV$@=Y*4KMcXBEQm z=^LMtuygNl%$za1Z@8P?LSh$peh)qgl+#hAE?-+zVW&dBJ-D=ibq^gj+d&I~`h9bu zGhYz*ke5}?d-J|5BVh!P?MdmUPOUM-QrdNjENQ%3%($}E^(tWuXI|Up{$T<3bp`JM z7cna{6{5^s*gUAe*!1sLG>jYg8TYJkK>(v#Z0�Vtl1uvt-GsIu+Xt50vB}U!xp0 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 Qq5s~0FL7_vuaBPkF9Jc0<^TWy diff --git a/website/assets/visustruct-app-java-englisch-java_like.png b/website/assets/visustruct-app-java-englisch-java_like.png deleted file mode 100644 index 0bd1173b1badb7302853d708acd0610442caf572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451726 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≧^^{&5ozcQjA2Aseu^N@fkL(k|6WD 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 z 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�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

    Oj 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 diff --git a/website/assets/visustruct-app-swift-java_like.png b/website/assets/visustruct-app-swift-java_like.png deleted file mode 100755 index 7bcba0723641e669f4f9ca84330bbc3e37aa84b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563798 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� 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

    Tfq4_qiwnNj0yr-1WD_W6bG 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

    @gT;XWC7}1_mXlLpD;dx_(d!Qx}E$$Te%m+z8 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 diff --git a/website/assets/visustruct-app-swift-portuguese.png b/website/assets/visustruct-app-swift-portuguese.png deleted file mode 100755 index a2f6003c104ed5105edbc6eb3e6dfb4adef36afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600700 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

    R#-sRrvU=U zDV=iD;g=#_%<0{!{LWMlaXx#Z+>f%nzEgTZIF=$_9I&?y?3>c=3{|WZ^6Z%ieNC5M zSo74_Y!0(^TujXm$S21;CoMZ+Y3sb{iLNym;u)`!j-Cnj4{*?^FFEgMC|>Ib%laHf z`OA*DsbP1f!g{0$CMCMsb(lQiFF+{y6cLos)-(6s~* z0bXXeSjEL%c)&evlbf&Uh0!u|L%gfSpWE~Gx|H)(rBq($$kN`f$xZq%?=uz%G0Q8n zV+DL(O<%W#p*V$9+}HIQotq|lOj28<`bp?iDen^xu9#;nCO8UJz44rDvfxkQE?8Q( zZg;p;YzdcNN-4TJNCqW1UNdWi-V#I6Qc=xfl{loGc7mUXbdlECl|3;<5DkK%K0a1c>culfLHU-vh{E z$>r~@3}R*hF5`Q=)K&@T^-DZ$4B;6f`%p3P4q6Y`!GDSFA@_fmQHvwHRT zrxnMkI)i{5ks_&bd|zi5;3q?KU5|@{G}|vd9lyi6Z{|FTm9AckaJ|pw(~9hIJ=}Ip z2k2wnJGCByt8@3;%?~^fnLjbq&a9XoXv#(yz@)kRaH!1L_y7b>;@O`^YXf`KxDbRF z)a;Mnfz+-}ChSA;)-GAG#dKpx7tIqxw0ZpFSDPqC} zM=-s&5G?JJn;dp(YAcuo#%`v_lUuXwPq+-Nih_h9_lo$|B;ss%TXn&O(L;4Wwhqgk ze%1H9L^_2AwTCzwd^;w1`&9FnqV^2c&qK@Lb#GQG-|g+P;3(od9sj%%hQ$fPm^o*K ztqYIjA*1KxRUdvpZ>_nj3! zgtYCwWH))2LYv7<1E{&W@BrJwT_2_4fMqCJLOJER9>#d~rmK&ZFQIbGXrWJqRoT

    W; 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

    ^e8SqwU`J{UIkD&q*Vfh*j-qlCq9fB%#-jxqRk7 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

    =4$97v~XOxi|Vt2EQV1Vwa* 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 z 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

  • Sr*_^I0BLe=BR1EI~w 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 diff --git a/website/assets/visustruct-movies/VisuStruct-Simulator.mp4 b/website/assets/visustruct-movies/VisuStruct-Simulator.mp4 deleted file mode 100644 index f47f178a18c114ba135635b8ba2fb7b69e1b93af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402201 zcmYJZ19WCh6E6D3w*6*eOl;e>ZQC{`wlOg#wr$(ClSwl1&G(;s?pz)^Rzu_O5ed3) z1ih?+sQ6D7prD%YH`K)RzX4%;2TvPQGZ!Ee0|WC5Ecivt%uy}P?RotveJ zslAP%9i6?CIsJdr&{??H+I(Z|9b7E!?VP!Q#)d|Q#=ML`CsQ+CCZLI_k&V5vH7_F< z0~Z6((9Y1t)7g}l!Q;E{!N|x6v^C|mF!caByBd8_@9NolcAltDK8@%(AdJs-quk6+msRL;$&)LW9j@Yad>c;7`yN?0F51O zzgrViLlZB1J5ydJM%wQg%?zDg^c|e7Egin0|1W`~gTB3)nX{=2?@uP6i-ps-#WxWX z(8k{0+R);=r~iMIOh9KFOXF{6{;z@oXy^35NsKLR4PE|o#L~{i)XB#18}zL=vT=1X z^wc-Dw{h9!u=2HWXx;qWCpY~`cCYB zVSRUanV9GpfR6tK!^=R&_ANU6NBqCDp$9J;=eNSy#nge91?Xnvrf+NL;q+fhzDw!b zlm9eEu4c}bUf&wl|1{r>|6#tVzLRKZqi^xO=62r;1vIm?u`&HGtCkMmYyDkU-=*;F zv7zI48U0rjfB*oX@6a?N1R&nkR=7vxktqL;$tzMd5wQJX(F=iVX=b3TT$Ky00r%2Q zZnoyZR(Q19Ex4P(wtk{=I=Iql@Xx>USJLoAuY>wWt-GFj(4|}?PQ~OaQR8)GXUWrG z3(ZwP!29%A5-C|V-7_tdn`RZQhpT&r*JXm`S}{zF4ezAJxGm#(jF8v3Y4q`l>0ph( z<2-ev?FCTS%|xmk2b4P#bjXkYiV`3Pd-KW{$M~-ssK4r)kHK_XK6(By+n;MD(DD!;rn}1E9I>5j->usor66PHeImD z(MB7z@ZcW<70D#tkKHRR0~J{+u@-gXZ>HdaUNJjz23b4-;4V65u3N9^{yS0D`Q$|Fj|p>tmm)W^0_4| zO{^~NH@P-R{D7U*bMZUL93KObd}pcPCmq{14=MbG%{(X1t69I^?X&aT%WfAg`DaNe zvVym@JRWjm$HcR452Yz{=$RPhU{oZ{egaQ^KP^{`pOax{-_EV}DuB=1oqgeA@Gk$T zlufDfYL7{Z_>q?_5j?DmJ1r5Ju@hdy;4XKJgTL=R39?3`m8klf>TWNRVPcPw@-fxg zZek=MEiAmMPZY8)n)0LDFu2v%bruL*!(6FoW70v6c9LcXJz*e|JkKEl!4fOLqV-#5 z%}t)`gh!C6b+Lj)xcMdg$$g7x{>2~Owh1w$-25gX3HVT^E9Slc!Ox0Ra`i(CcbLzf z0c;o+CpPKHhS$zNtIbeWnuEY8l8bF=yua<#b{x9w7C*D#BfV+dffP-BwQkX15s0+R zH&2b`{{5n4rFz8?5e0fSn1pF?s{MwSAYuz~#@V!#d?ZWR2dxPF0EL^Wy z-kC@vigU7V6X7I5e@Kb$*lLg6uTm;_uAK)>g=YK8Ovsl()FoyeBmoy*@)0humY6;d z5Y@+{#jgP$a)#SS&*`KYh2J|*iUV%WBPDM9<`q3qDmLWW2~wMi2pYr`R>5V|H;THC zq80I_p{bBmfWI5FAL$E8%mV$9J#R(XkAG)qjw6?PU|>Eh&MITpERJJI$UTFgl(t0n zW#1H@3$l2nt6jjqXWYFtu6kn}rlB6*^}&QgNi)^8viJmdLv~!J1XCNO!-6*ZTw8 zV;F|(7=~*kfr_Mov1j!fI^mVwmjIe9mN%aDND^6H<|!kF{|}a3^jyd=Dx(`1{~zzA zv6E50#iSG8y9vhESwxDR4A!=^I$l=Jt-UmjVoTl7Yvlvma3fvzv#h0HRi>XA-KoQTqL!1+b`xPai5>r!8e$+1F?QrT)XUTGS2`$qK$ zyO*nVr99EcZ>&dDKm=xO%g zO|e7QU0VWk4r{FzZY9*~a5|lj%gKTV$EZ@f5HEvK6L*LI?JH=mv6qs;MPKO;XW_1X zRL$wMj$ntI4I#+0@+6`Ix}T}RFH#lHNiU?1+6GGbtXiI{a?mL%bO*DJ@f^#fwZ%}4 zzg)LnR94`YXgz1XE<~?bD9PX8NFP^!k69ah^d&Z3LVMiwr;^{5>184iz;YqhtS0-uVI*^is94E8O=-U4H6aXNmVC{gW z6McyA6(k+A`0gk!_EHgKjF@j>g6%rbjpVh5=Oq!ZkT4&l1vY5&mG>R3M zj{6gLQ7=N$YTqXXOT8mg|LER$v17N?usFv&D%-ry*dL$l@L9=g2QfyU8#|J@ZUr&h zur0j^2l7^HFq}b~#8kQei*XZ#c$+&MF{tLBFj{cEJel{AFnpa)D23f&C}PZUm`G9L zKF<{YP|i0IfBn%%mFY9$B2j75$*?O}^Do~IUC4O?6p1Mxfc6Bf767|z-Sz_*j}q83 zj$YyA3q3yCUL1BrvcP;?0)iO;kv%eWU%ahVspyQFJO0;lg1B&;Uepa2;js_^ z{=k?j@kl4(AbOdx3edBLg_lpbl1xqZs|y#>dlxn-;?rJ;EEcsfJa|^hc*@`6U-BGh z>kiy}lu+v}DXJ<38CMxwTM%(84>fPHKiDR$FR{Ko@&x_9= za4t=!d?^NQW3w~Dz}RP^<9&Ii24bvn;UpOZoBM+u z1qQ{J%S^7U;N9_SwEnaUL?nz-aPh8!-~g$HH=adSrJoU^m*$8g)a0{&!EX(mB0 zxXmYxK`2Aif9_{^&G6A2yIux|`qK8p4}7jTIqA21|D4*8nAMBH+#fKztkQxACxuAu z$u!Mrn$s`~9KA84VjJQrw40{#h>|V2{pB{dc!LJbjd-ab073t~^=pj}QxC#sjAoKS zRXxP$p-f+hoy)X`1po&XC|T&5&UT?=vRR?GX?wO(1QH>H z^)HQzBOutHkXV)Em1D(PQn z?%LVEJ+L`y7&7%gG5s%iF%r}0*`6GFR~^63OqY@gymqJbhk>wG(cuk!pLv zwCxzdp9mOdE8CbDXlx876RQ2%Sye@yZVptiDp6_48LrCK0qS@#yXhRiPgGYZD1!b8r<+*qhDCOCTgUC7m|0DhWlbF_90oi_w4ZYDjgT1<(h;#BL9AP13h09A z_XL9*4Dj7|VxL#j?*r4C@p^h>$W0wMds;;c<%nAI9{Ka~BT*n^7p*fjvpn*qsP@DK zSi7N7e@l`~V+Q}S<@ZF6AzXZy;wJC~LL$+u0RV8ZCd|~w5nHFR$&;mDqReU@twIX? zN4H79n)v`I3(CNIIXwk%FIAe_UmfuVsYdJ$(*fqAIJGq<&6{c+K(!dKcLPkN9kaYe z!*UE7$6ontr>#C#pU86%iIjwVsw-DQekWk(D@7E{o9DWtB4#|9eGLMnz!hT4GnLi^ zNUV`$6%<@%F%h1TRiq_B3%D@kv=#1W-I9_~!|336en{UC@{|oKOeSGu13nb$uaP{u zYr=Zq?%hF&s?0nlzgv*#>mRzo!#3}txuPqWIE-e*ZYwgQd=+jqEzVmVM5a9RZRJ5z zYm34j4#>*;`U!+KcZlv9_0)b^s?{cJ6)Sc34nABAyU2UQjOt9=V2 zKQCdfJSY%;y`o)$UwsByoGRqa&B%5;3JLz&?@A#$Z!{o4`Yrl^zJ83G()P-i4o3uW zZLeY$k+vQrOQhONw+0C_vB-+2V;~zSv|wfd`od&rYO%?js@>e?k990d+yxCIy@=^Y zK@f!=m%(gzgoYl5gGezxdQc+pI&}PdUK5OnCewEIv8nGwlgVYdq3xvnuNr>&xiN8| zn|*x$wfV-4&h9DD%QMHvw!WNvzH8mX?Zp7Q1@{#^iOC_$32<2y34knev^MPTIo%D4 zRjqr~J{%n|x*4+hfRws(9CS!@(aR&WVl%dj$_X&X1AEo!g-m=mfzGYe4e0~lGT~bm zV=n=d#v1G%d1$LC>mDqZEZ&X9RDbG9MTLSWwMCA9OW{fb=iS~Ri)+cF-vDzg$#P=QfxWj zwP+U3NmbqOl42;tV~Ss?4+}>g=(o|s&VQRom=J~A>~^hfGjnnau33<+RKruzk*(0~ zZ>((p{orho-hex@iR^xG>b(V8E~7G1fi~ARRXD(%jXfW{IGX+-GqaK?^L$p9+FUsu zB}~0N{v?j8(btdAbzatO&4g{awwe#J4_s)8PAjwY&d|M<%v%os;69LB@Kakr&Q zEDl5nvPq&(cZ#NfzkO|=&KjUtYHaZ2QY=!76Dk?{pxB$fp)K0jp|h|ddgFke{e=ad zznJay2vSpX8>hwWl@V_<){{F?D>%~zaD)%%#_0t>ja7wP04dvXnqe=&sp-yfZ-OqB z;Zvcly-i%|knj=eUObDYYqy()=gz z6bT&YgVlrunl2a!p@_`5pLkY5N4kpqIFJm$ol_xzf;h=DtdUkv=im*oRgob2;1o^t zx?aXkyccc;v`c2HYhHi6JSPNbmG@76wcC%$%%w0jA6zx3%AKel45|Pc{U=2GhrB|0 zymyVjbM6?pNa_J<2C`-ZwubhNUIl7;Q%Sv#Ttn`7&bL#h5}1fnwS+(`&K5bf=+6W6 zpy9h^BbK~VgUx1@!I{ln>3=@$PQExgNtQQy+c9kk>x_(jdAGQcFcwF=5Boj0dSssi z9;Xc`LqlT41!2+`^Rx*PZSevG$Ihx5#R%I3)c5DcbfQ+Pv9(S#YuPg9!bfy}osz_Q z=YLhdGgt1Vw)f2xfy=)4-DuiXw9allB~S?EBP1hPATa_ZTm^+!m;}I?ngJF_Iy_9P zc!m%$)F6D};MG7G(m5#3SC~ZiJXR-DQfU}wf#A#KE&+HI2i-wBoI(a0CC)ER?Ts6L zmyG=Z@00+Vruw=eBE=elBzuB&Y=BtEv}zBeBFs)&`Thqz+rVtJibFU!ixodzAZaHEtr*34EG4tbzw4MDg!#R(UL~4o@G#14XSMbL*d=)t~Z|rd7jlC zc)wPK=a%;7b6{X_#(|k13uzpSwFH{@DbHdDYAuV!WvIcH7~fOAzzn~pfKea%th|HW zNm2k%8wS+7-F9HVq)a(Yg*#Kp=%0LXz;U=IFu>bqRm=ir;4ijZ8a~__ce)fNv8tiE z1Ut{TUcvjp+%YIFI{hS{Bz!1=OkSUS|9cxVD#9p^2M=UZ-kL^IY@)PC0~+0^E}G;! zp>FI+)*_9fIx(g<=Y6!iua5*T$L3;8aq^sctdG}|=Fc^;o_Z^|(_QxV=+EMRWrw7o zRKp6S>?Hqm>khz)Bgo0zT*=xM$q>_|fkPfJ$TsrkTB_0Dx7@>3Q^$V^%;2B{P8u3p zj-ry%bWBJ>MjctVgL^a}+qSPzdad&|;z@?rSHO4kkN#x&EW=ppx9Y&Dwuy5ASgh%; zi;!-vud1ww3@Ee97!q#RVzxnBmKi;~2<7!f_`5KFtw(@kC*M%x%AT+o30PiA@z8=w zJIE1`klk8c_4nMAhIUp!L1}mx<)Cp|AoU$J>wCQF9o={neCDtRtpuciG~B$P$5Q}X*@|xxcTAuDKi+#FAZ;;__4(czR6w6@8O!5@MQFu9KDkO z_JcEqTLivOQulOT3&r*Hk+)~^@(IS}&^oK(^Y-z0uA!UE_~n60$Ty^1eM2ROZ^TEK za0wXuK5_cuow#}r5}>h!{iJ(+qgqe3ylTL_DKLm!uz4#f`k7E0YW74sDGQp-eSPf{ zk{!VsY2^P^It(4@ZA0MQ)0I~+_qjc4#9~nJNAkJ%U&MK4b|UqrJC4D1q~k%`=Z&Cf z^H%7~83P*%Pmht)lf2j?YL5lm&o(NG3+YLh`5g{+0V9;VaRZgvu0mgD4L`6{i?YpY-Do&m%X*)U9Bf$Ds>ktCB?`2KXO{*wdUe;(EOSCKu)|2-dBMp$?2FcwcBkgRJs|156Z%y$RTlnWWM<)bz;m5~G)yGB%v5F^4e5kgSbu5G^ z@+`(uBzG6MGM0RxqQIM~(yTc3i?+Byt-fyptX0Q`M~@STUl0136DT>@Il@gX-Ku=` z(DX>(1V)HeTO^n0Yd&*;H;0jE^Z-_X-cNG7AZYVpwRf7T&~B zSCS4v`1r!7Uqx-})iOxAmM6}4fEp5bLnQ4j#;_UcOMt!rnjiq~O}se04mzE@jwvdX zK7H0SR2`lbA`RI(RJ9jprBnTq;zm{}9FRYDjzqHVCXbu%5 zL4u18`Q*#-CoU~hjp0hmv4)fxLBGI>%IV1@FiviJv`8H{xjFC>^mRP9dLoz~OvV+M zcTU;8U)@?0-~j8^HwKg3(#hKSlcCSM`97%w`_=d{}1dMc}WA zN7B6B)CXDGU##qn;C?UUucfu!eje%F%n)IRC9@sd*Y-P!5wYCGd)c^);ZpeiA8j@NdZIS}{_KT}`>~LX zZ~tg>W)e>4lV4s&E6!ohbnKUA%;i&z>%VnvpMCX=KyRr=aYR?+p&mN0d5d1lb0RT+ z#+Q38jDq%{z*9&afConihcvZ!(iW2^)U*==RiqE*sYHsXB-fHK zWDw1M-i_Ax18+MpO2kVi(bDu-GZqnl*D6AIdD23N1@<>ngp*q1&`dY;qu^1jhJIlUit73o|#*pO?8k^D2v4 z^&6A4+R(L0W`t73&}|Th1cXt3I0CKKTaF<((qDEduQ~tZIIqZ@4Ut+&W?*kFyFQL? zsoP)YUcT^_jyygKF*|%9+anw|9sae8eTMv2xjIK0x3uWY{NKI^|TlWgwlC_2F>7yjUpNMdtE-{(pu=v$D!y3G4@ z3}H_@uu*F6sIp=id?1RVd+MrRBbfPgQ4iC95Lh!ZO(54`=nZf^lyR1Rk0BwUg>#01 zA0_^1-+!L>AJagwBc4S<^z_in;32QTI|CbOoauudD^{4Hv>zw`-+@;sIYHa4S#1e2K zAx}6p*V$=;9;>&74MU6YvpO=MaYp|TCA4tUGL#6i-5!4st%Z{je@CfqhJ<@Ah)y}c8rBa3U~+D!vdH4`AYV&6lBoVGSsH;Mu^RBBaM zhZx~m`Y`f2Skw07efq{C9Ab>g<=qBU?^`u>u*TYH+r)y`pZzUbiuLn;B@#GG1nfGJ z_5p8_6BC7-t`G(zrKh-++z)L&4){V%Q+K|=!JZ$gj~4o@fbl;n=39TRpU(;dux?W6-;DKP?ysSu~V>z=u^?_i|#Tqz5)Oc zm9!e`fQg=ucKw}G!RN0PQmd`PSgvXzd+PhUQK^18Z$qN>IeJVwRtB*_#G*eLZvw@t zkF4t}?bP()rR8&YBd$>hEQ*pilX2)L=DC}4iPVQ;5%3}-H za^|VMB@>0*zPcm|Lby_fd_S@XMNJ_tGX3EDInxoNaH)p6995}I87i6xv3aE%o!2rQ zoZm2rnx$2uOD_4DH1T(@Jr0pwsIDJz-VPC06A}ej-mvbCT@)nDl%X%U!<(apKsPaS zJaVcY=4ulmsoo_=%=Cu5i?r#s>V1@jFO@fG z8HBlxHKMloz>VilVhPedw~{k?s*tN4f?y9E1?m2gKDTpLC}jz%%SQl^=IxFc%XNm| zl5oYqgV7!0+G1L=Ix_R?74Hv^;bwp*vyy_*t6gw&+=^(VCU$Ndo%5otN=YB9A%B)F zCCisTjO`H|?=P3|s6yOgwLJdiKb5SZoknik5FzIu;;M&OS3_qzsADXYU`AG2M^VAL zd`7A5O#TbE!rCNB7^w!g=L4VpyN07sUrEUki=XP7MB$20){R+0*6R+HWzX2SAXEQ* z3-@+mSx4??D23|Ag{UUFeAy$OU;(i^GuP2#G^1VpWDz`Luh-Ps*Sn}l&=XZhjfGf; zqwl3>&<6+{-2}&&EJLu+wLY8LrbTA;$aFASlKg39?57le z1kpOZ`+yMX&s_Ck1Z<@;f~a^=p5OSneoCB>%}EZcPKsiAZfGB8%w@&f_Hu?EGmDih zi<{4uVq%caFTFao&oRu`_e$_-L_VMf6>jFOvq6PI=pI*z_CN6x5R~wjs^B!Z`HY<+&0JS{`Yw6SqC1e#eY={BRJ_* zWtD`!ep*9_P93aBMD4lz6$-VZBe&bPBY9$oH#x3gphaxju#3$^K2PIv=g~Onp~Ah4 z4h+n+FZgw`WK9D`p^^LG*y&Q#SleN2E9!c+6`60&B~;gzfEh=`B+TVK?s_V#jIAOo z7PsW{5cg+{P?xcU(sNq*U>8mqa7xub@PfYbiHl@NQ29vZ#c!J^*w54hEnn49HN;!^ zk*Q(@x?ty!F>U#(Dcoefq`!@R96@fT@Z^Gv|~}&;O0Nx86w=7x5@B z#;?m9Mr&h%d&wK#_B2DF8Ggg9!?$E$+oOi@@DO0K`8#!;=xF}1w;uSy@S#uo>ND*Z zw$4rbM~czL-36(_LGQ$>KQQoZ{9k`mh_zc9^~uA#5xYM;Lk%>>Nd=tf(hk^3wd$Xw zyR%7IyF$%>;M8N~F6U7H2 zM#&YgZUi(Oihy6kunxXhAo2(pRaouAPAmTDMxU;E(UlADHktB+yY*F*NWN1u_u$(6 zk2HZ#$QL|}mV>Rfb%q^<{E;Gp=1A9gwFccp)o4jt4aff=Ul(EKcW?kFI^h z18INmjm^gKaDC;azfY3$_z&}46kS-PTTyH5S-v%Mq#P;{2myLl2>6kZkO>Reg9$mi z^2S`caEYiQ_qiz(9`zTtwko=WWz6sj%2<`0$Cm8JF46Ly$m>72N=u|eKPob#j`nxS zUc@u>3BGx>5pK_o2~ojkMBWWj{fBio_gyF-x<3df1ZC2mHyL7J@_- zaY(lc*(iKwf5^>wUOfM!g%4!q)ygQjd3h4%5`P*fY1nIf1A%xS1=Us;*FvsQu(=Gi z4qbaD669+fJ1(2M_J65ifm^ZQE{Yv%q!)~JPC;rv%%yc35RES&evB2ntK4JG1l+2*oce$0<63oT`OX>c~*pa7_(H zxGfL9N+A%%#b`>}O;^-Xg1A@1)?aGo!t_t|Eqqc#dE0-$lTM?GsFBr<6UT?rc?FSb zf>~Qwz^HC?f-q5rNe~rOrUx8`_c-@#ppM?YB}HLe(t1DB5rk{4!*gpM zLcY&72hRPdRD!9v-vHBk!2wjuXQtx1`OJ&i*7$*Ejk|$!uoP{+}&*Ne}de4&w1Iy-UD)`Dkqy}-f~`)Owcyjht$o>^ci5|<<1y*3l}Xn z)dUbOvvvz3vO)+w{N?)xL!3fy&tIJ4{b=xrxfK7JS}lGUU(wt9qOg-@kXt*&*=;Vj z3V1HDWthzqcCX?Wb^iz7ItzP<+`Zg;%USY`ek4ZfA8I~H8S%B!w7Ep0ngV6CNUMX$ z{r%|jDw!xXJQlf8Ts71|+Gmj8Z{{2HcvtnX@%9I@iOsX<^aXY$NnFlB*ZNO%b14>{ z!GhJNxCijR7ux&$*FCsXMu4XMQjA*{vv4aIFBF?`1g?zIE&~g$PfPoHOOQ_Sq6spK zwbC%N>fE-@Kz^r+xH`PQ?iG6E|H=`68?<_?dc$a(8s)8ZV&KZXf8|AC@7QbR4bW?vvKWkb^1OV#tWJ%@EAFSA| zKI@3LD~Iyfoj8>+zQAXS_q<BBWY%%gd=IHpTmue2ftPYSR+MGrSIVR*Mq$NK$V98n zxSXY?*s6KBd%H!d-(So^k&gk5NyeQP-B^AQ zWZ%{b?f~%Ua}MD(2a5&x zrVWljB)THP7*Jzbmm)M+Ix{vM?j4fsZmCW8W5_&3ALPVHHg849uBuCERtFNAl-guz z9F5PVGe!_+d$qj2LiV)}NJOT-e7qEe#b2(YWtx5tn6l|7anWz?OPfk{sGM3TMRA>r z_(yJwAeqSpVZZLXrChBQ9*u8$F1)XCj9*Fi7Zq+(ui<4j^PNh`r9YOvS3I2t>Q3ef z2R{Ok!{Fndyg>IH^WE|Fdcf>SOS)lD3Zqq**$Z3^6>LO7{kh}@8egF60stK4^Ndpk z251`I=zMHdrz%#8n;Raj^b$HBSQPv?KiK@H*m+18>#b0mxPkIRjd~((*B`0aeAhSD z@A|c|RFlo|mn&q{V(`A`byBgOhmGLL6pdi38QlG|{qk*8*4Z^@ zjQfhJc40?^$26v0>cj&RWa89a>RVs1Aw2|Os$DV7TJ)!fNds_MmhrO(151!}!#-(k zoj3MhQodSNV6ypouzc%UYW4GFfIxi9AmIegn!nQ)k#L^oj6^6$xaebNmGBAu1!1v&#Qb%2n#M1Na^2-v@4jxmo2z1A zA|x`D@<)(Q{HNM>t4Cv~&j$p&K-ao%PPq?s&hH+)!`ZSiEOAREEMc&~FTTMns`7<3 zN#u?$w<1cuZ3^v`uN?-a_5K$GbMwe~i8O@Lr??A-ewxN`uC(GRF~F2)iH3>0If#wH z-L-gU8OaF`GqMg3&vZkV%3=VI9Gn!E`ne}}H9m#fIjY!nr|CTVbh9O_ENRX3N{{4D z9%LbryBGadF&o@vfT3{EsylUv2aiF0z;Dp={4t};E#bBAYG->D7hdK-)B0%I5m*QXom?FZ*pr1>SJ-jDs2kv8 zt35GNWJL}qB)h-1nT-=RJkMR5l6HC6y7G#3uYfrXTRXofOS!L_(%-Ttv0;eDby0J- z8+7$#XnH$GGqwf0hFQKi4Pv^p-6y>(e-u!yU`SH8a zmAQkDYLnwx`mC*$0S}w)NB%5*`pwgb_FJ`+vM~^8_~%lvN;+6f<20-M_PCjW=0f3rml z)>T^8yWzQzTufW<5SRP`B!))GGD9D(#sw9_UaWmQ4Y_a*?Q$XSBXAp(Qw++N1{hgr zf$lVwKHjxJtckR4$wR7E`W^r#80=keBLP{(NaY2cY^um#hQ{6mfnT$uQdOGKlYM@- z@ll(mwA%Ysxuk?&f2*5a8(OBjuD0ZaHEAtLy~qD2w7e?&hsOqx709jMM4A~uBFhV3 z9H$9!n{V~*$v*6*ZtPY|v*xY}I97LKI{=Aw_(AcEJ^O3L}!-#qdVM^>!#Ef-y(pFF4@#eKq%&p#fmv@ zG>|Rb?qR1Ztuw^@rjnmaFK%^G8q+)4p5sq{K}pB;S9Dxtvthb8%u}z&-=9rjY&Zq% z8+$?Rk94e$kQxkp2w<9D9Rr32sjWmm=rYb9=LW^Lw+E9ZoYv z2Y-OfGvFe};>*Xqjd*;~Yk3>4FEL2d%B5WQM~|c-WvBKuKDZZ@sEb{F>Z%Kl>-?=J z;=XpfO~no%Ao6sK>5T!+LfnB*Mla82V*l}3wW#_TE|!}rx0=V^Xrj=`q)2|ZVS|?D zNN#N|&`$ks@^&mgvC+;X;W2O#^YynfuF)8hu2RuD{$iRH$vlU58$E0M|?4htDUIkl35} z!-Nk(t?!gLao%MOZSc}!3Hz3BiYgvz^N>(p6j7PF@f;)%Juua!hp8l1$A1n$IUV>_ ziq@51ky=9kMs8CGQ{Tt88^F;_-7n~^KMP&wH^}2?`Ggtk{C(jiH7x1#zcK`9hNxwM zvYwSlIWO4Z)fp%5Nf-~8Pa5B>^R8ItkfRKryVh_XL_10P$*#OXJr8|At_gXCwNAz6 zs7nODvLRjz%7HbKxEG?0zk*(1!vq_ul%(rpVkN36En2`np*2(Vw!ZG^(6Q9A(D-U00c?D!qkzVv$ zgergN(k$8$QLtcz>9QX@QkwOKHzDWuAtxjfyu=Jq|5PGs$`3k(r!}%Hn#!-we?W4h zzO73Pqnb6=h4Ry}c+$-m4(mP5Gmm?<%_K#xl(`r&nNZN|Zii1({B+mV>ha884oLQs zZl6oI++YSb&mA{zhCt20M~P5h4J_OLw2S^Kc%vn0_{Z6jm!Fr)&C6= zQQJb%4@_VwzN!biKmTl%xQZE1aqz4W?;-Z|wYbl#0i+@_WCx{YsyKU9J#kfQTUYLs zuHm(pS}!Cv7em2y>(5vQJH`$MCpc^|XAvQ@WtTY1~2}0d9khAUp z?k8^%Y`VAtnaQ*1&%cA&OMJ1xRg6i~LCRW{a~^-to)9Am%ND`l{o_be+){Dh&90OA z#JwiOt=ru+ZzJqCVVBQ@4oMwrPSwcs22#3fuSmGojn^L6X4U2OcV&v;Ro(w12(otX z#;(9^Nyhp)sW`x**^%{ZT4IkYK2}AxypQoHSDY*NS|t}28!I}W_{W2h%v>M|Z|TZ+ zj7@wxq%QiMf{&yvDaPhOn^LXwZgYm1{MYRnrT;6y|J4nfu-66(hFp*-p7aetPfF-* zzuNsu1Hjg_Y)-@A4hc}&?Z?jIhIg;5eMM5#)i$pbc=A^q-1wZ<7~j|(CfpbOqVWqu znCUgU5|BwwSG%sv9&#sXm7wq9UnZK;P!w4Zr$vsN=S?Up+pXCYB$Ijo1vgWzD88kX|-6X9& zHkNUX1sq8!*LDr>x z%#u?7c(1GfaAB8rX8PrldhZY5Ls`fpdLr3ozHS79=javbg#Xqt7SaJ)r?m@bm_a~vX zEbE3J0B1|`>V=<8J$7fASoR9JZ`VXts!y#YBIe_4!6D3mWqO%~vdXk6Zp2$EFD^80 z^b-ka@wv$YgjXFR_m?-g~QEbSER`x)9TThtWd9|4COf~ila5yI``x5+( z8n>L^U}Dh=L5;NK>^bM+KF)s^#hOSSFFRuW555BQ6B^SUi;+0rwRzZC?IB-C9mIxj zdVZf=dg)b&W|rhpz*OpJ+Tu5Va4yLv;6I_RbCP5kf4#V*6MXIl0UCu~;TI-W^S9nK zEA=GaDMs)aL*ayo8TkSnm~HO~VTU&bJQ>&N|Iu(NK_!UFE(Au&^Sd)Qj#D(_R-73Z8 z8@m9rb$NZjnVU8j5uxPs2D?K)_a zWGGGgO;Qq*^83F@@Mk8hh$O+8;N5$08YlmDm>$`SW#5eo&B9=WKcfN=XALT&13U;8 zwY3W!=~>9k9%PlZ)rB=8|A~_)V;er$$d&El^sHmWIbeLu^U48oea6{rxQdR>+ypo3 z2;QrRYuS&jNp<28Pc2dr?ZB&sdnrX4y(%_Y{jHxED|fb$$q18bMVN+kY80U8WPMeDIl2>ClH#!wmF59n_K(b)|RipO{f1g2R&1RAlha(^K@=R3yH;;H;nYAm)B&CaCtGdbjm zk~cI_VmU-!JKc}^V84hb-A?D_hC<&4WKhk*C{$|lcZHr9XYdntN6A2Ba2{Ojuu zxCTpGM@%~7DC<~fx7+iwi_!cf5p8kez^5tXWtUr{0#J{ZAXS5Uyl>K_bAy(#XBDi# zqg(cO36uWj60z1lL~i+U_#Wo5kWrF!-CJ34=tev{paY z9CG8wGyZxqHCt{#hmd2}Ta>>d2a@Ev=5|8yunD*q8|e2eRDQpBIG4#hJveyE{nK>s^)4>H`T&8;Z1>5#qImi}15? zHmUOPct(v56MN?bay|?vc=4Eicfs*(*p8yH)jE+F#IIU@za{cH{B>N{pC2m&PLUZw zux@0Zg#z@GFqCK(`Cr->2&zcfF4N$+PBOb`x2T>MR@0cV)$BRqS*&TpaU^Z&M_N^_ ze$5y7z(0>{4_%X-`*r<&7@PLRB_AtaaBEQPn~Mn%%pGOD2dYWehS>RE#`J2zN9*MI zi25APXN5acr;A*Cq(I*8HRnPFv$*&vo#e?g>m9J>_FHPd{mOg&21>2+Nny^1{b(p&@+=)S@iSpzNRM`A9b#P^g} zF?{L_;*|G_9D{szmB>k280ZOEgN_QC(7`))ungm3Q^-@a`4jbEoac@r?D+a)GuV`v za%d?1O?Ey93F>`c&H-I*@DknMKe?|8p;02GkZp#Y%hyc^ym-B8ID-dZgL0lwQ_z&3 zaQ3nCg}gpi{Jb?HaJ-!;PXqrU!?NO4jvCQdQH2oja~yGC4}pzfLj-oUruwg5&RCv6 zWR#<9IRk2}1J>oq<brzwCT{NGGa?e7`6nW0l^1f_6~}Wcl}^>qLB9SmhY~FqmR?? z_I^+PIe9F_xl(*OxmVZ#rd|vTzs^9d=YeG$>Q5Lh`jIF4nK$B3q)!k}e&`gKFy$N-8FL4s4suV#YjmgV{-s07gCU1*&2G3BScD<1K0+I#Ctyg$?So1adq%e1NzB$|+@7zu? zt536paIDtP#KtNuwW0F06%p~_xbfM-bjDn>?>A2JBS^aAilj_elcqmFuXsxpH>1oE zb%#vFl*=v61GZE-(mTNLHDT8mgG}+rmcV$qNK%0-KK07d%gC3cTc1r*vHQOJNRAt4 zZ@;z8I*tKTs0R%?bNG(iNYcLjSsg=_NLWcoI?l+Etk-0c#l4zBd_2=DvV}#$Z!tc(*g5J>P{E~COt`SSWv@Yz?ZtE?9 z8VqMy^2L~p0JOgah1;PTtvp?<((tGC^A#~5t*x^4gL6=aCjZ_>1*k0IxC&c=Jer69 zzF=-$Am_NNf7Cmq^Uc~{VSG9QX(sk#oA0Ct^6u5O%;5c3+Er$%z!Z%}eu4N=@Ng19 zCayY@1Qaix9V6BAVW}ok(TMhyeGajN(pU(yc=y+dMh{Lk7qAv7z2t&O=U02x+pa)a zBOB~G(_QDAPK3`o4Sog8M%?*%I?>O9D7X(%X&5)E_)b(F4KRgqha>pb(% zahb4cLLdlN zPU=~|Gqs%Mr`mkHFc4RPch#3B^Zi5iL^?8uRX!dR1yFLuh6PK<+BDFIKR9y4`D>Zp zRry=URw|a`cI7ttt$x8#7#Il&sh?g*((YO?ctsh`qWb4LL#iwNP762%LgCrgb%hvc z_X2K>6}>d2^m?ZLj&0?s)>52moNrJmYHUU-2&jm4J~%zlxjmJ^Oo!GF-URl-uAS^XmXi}&z>HtPK-E zHQ^ayQ16C?v?0K}6n8fj^`0{$9#GZ`R2vVep2F>tmraT+)))DTXH=)W z3=|wAFy~i77lU6%&ClEo6^yuKb5*DQFLZk%2;?@c9gJmxM9^EOa@{s&;}c?PN#=6z zS4R(xs-f9U?^Cd}-~u^Bm000*+LdL=OZ75>hwz;K8&atM)H{S2&EBVR+?Ch0Y4F=e2h0h6Nk2T{I zoiiM`D}8tjHHLx?a@r;YG=7_?)z`Ju`Axx$#Dxct2Vh|=$MU(_Pzn7x+4wkfuzDP8 zU6vip!sL%|y>5E*p5`B#t?yah#hb0%+yrP+MDuE>7;_mX6~3}J`ZZuQgp3Nir)o`! zOkk~~sb~4w@euO)F|OkTMN-aZW@BGg|Jfh-2LC(`@@7Kc#|Y0)8O@S0F`gCVheV5i z*>cdJ^;(rM?&Bns(7}{A?~WjiNYPffEs)LDH%@cXI&QG|X!vs;j|;kd(2tEn`#!aI zwlP~v4}Eob{C<0t<1HT@JKVWQ`c5W}{~Jx0Lstpr0?5r|_E=|1^ph7xEwgxY!rIS$ z@4DduTDGyp*nic)$fp&sjIBAZVUAq>b~$T`%(KmS9!KjWJRPqT)&u;J;ev|{{zdQR zzR_A$wcj5uW`AGaBB>E-8H(zzBJh%k#M(U*ur1ZV3zkIC+;vPUdXc&>sjxId2?H3r zeO4esx(?|9Ehkp2{0jwy@<9wJ`s%W@>qY-{VsglS;yt6+e<%@$bg};M74&txlsJ|v z`OZdv_zUt)j!$*#H@O-tDQzlhCHeYs{KI^|4r>Cbfe2K_f82AcNqKf9z163j1=L^o z4#1Av8Hw@Pq>{4?wRNVsJsbKU1{DE65Bv3JQa=@*&8eeHOAqhDU=X*_} zzh#o~%bhI8iXdLC;*(@k{qJs+k;=QLN18!7kHNzf(M(7zDVDIWHG7gW z{H%Z_?ritm$3W#~Myw`bwd2=p`80T^ewY)PWYWzW>jVkh@B zk4IZkA!4+!4{wt)vK$rebV<;%9_X!6!3w)$LaBMBPCRC4N#jBM$L5o3%e_ zVh~?9sCiP^T`g$pZRESaB^Kb3ouKCR!jt1Q``;_mDo^)*?UfU4!xHo>%`gs4a~c_T zFiefU@eff*+B>r5;Yiwq8hrGE-28@<%S(Fz6iL%lGlyj+aoj}J<*mG{^8@Wr74zE{ z50Pv@Qr#qqA%aXt9?)Quvp(ngpS`AD?Bdn3Uh^$DW-Lv(>C9lHZWRYt*!fYpy3|VB zsvH`q(&T5p!I$@xUs!j1zM zkk+9*g&ZArtuT11VN(@vSq6jfBI2XPV1~%B4IP`yoWh0|2&I)zpa`=NwxYP7|4hN*CQ>-8(mQqy~D~ow=xXpxP5m#c+ zE4wKbs=UOBZk5F1)m$L#GVdu1HsO~fiznLc-R{q@k~0WY4U6hNUprmp7D|Q$xHgvs zGJ30p99K&t#6zZ%E-Y=dgoijF00094x;F-zVTAa6WN%XGo*6N`nhVwruD0^o;&^hV zH=j-!cwXDm<_d6+sA(1|M)=KRRY!0KLi{J_f^cOUsQ@Sg!(h#0)5B-TBT)DCI`K(= zSuiuIjj+b9`6o&{D8nVx1EAVZNy9$L=7G-?mI;DoR?zT8jv1#s=s*Yk+nXB z8Tm2MTE=F9lQU3GA+3)VuF+6I*88>Fw0qR4jE!~0PxRi2kSN;BJ@)t_73rXt!M*uz zDD4RIK(GB*U9+q2Hh~5Xc{?Vi8@O;eFKPW|Hpd-o;qqR60e4F|x8L%w|HnUMBfr$| zu!m}~ZoB*NU_of6Nd9*O$img9e~gjqRp`g~0!ob>_J}-mdvD^`W!Ua;j|FCN9o==UTRm9#u_VXLUD9 zxEeB8C;z)xz0sXd^h5enHwmW523zgq(#-u(Pb!ck3E=bn?DDx{t&wF7v%*2~rQWmQ zV5?@`0$G6jrXc7vPv06C!%~HGR*V^uINwGJ11$h=9`SOi9~$spXfOa1>Do}6snw{D zi0%Esrv2QmCG&==8fiQr&bf5TY@)B!J>j@wzWbOq&!dA3ID0c)_20>nf`Tp7p{2M- zqD+aCAH2_e3V8t1luX!DeQF8wYRzA<{8WcU9gnBt*Skqpr>|7|yolM$*3dH7pz}EeTbUDo?6Nq7yNJG?zCYMjctufNwRMZkLspr4IY7-&c z7jODd$FikF&sDo3>Hf)>p307kxnq3qm)w^G^z#BrxtmN8auD8I*~Vj;LE*qjApotS*1din350l1cn;V*;0~sucB8F0W3#q=vFw;9| zAXy~De*bP6XTbp^alcR0W9rv*U#rso75$|%nGuor?!rzQzg~60HXj0GCX>AET#$1U zl8A4-TdBgUktG;Jr%IJ@PizYGyFDV1-%VD%E>=FTQRr)0 zRx~DN0_D!nO)mok{wecW0?8$I4^$28$}?Ev3kmy)~z={__Vfd zm~4aquV=@ueZ<&(XMh1IGxCqVW4 z-TIVGl-kdg+Yg&ndy~3$^N2w?4(F>u$2qc%TmYZbZvJ7yfb6Nlv0}7A#Qo<@BA_Rs zR0ZaHYEm+05p+x5V2mWzTCT`c`b+AO@-4p|$>ABoBaz`n#;?)+22&mRv}4WtTf-A2 zXQi7Ii1(Da5|HJNn^+9|0%qT{v`vr_c3~uCj7yx3YR3EZs>ilYl0*X=2|KIZSSC8V z2?C&?FQ4Cf`=D|ap;iJH;LYLU5#%OTjn0ksgVg%na3U922MNwgy>}DShzXgZ&gl= zLh8&~t+%L-v~_Dcq}BNQK^FJWXsuG*lRU#_-?VcAl%g=8=wkgJrY(4mSd0EyHW8Tj zF)5I(jn=gqmyqfPm* zXd-U#iWvs$5Z|8f#=|8Z3O|@%Gb=J4J(K`Wrz<$JIq}QX8%K&rn4E=bd=$AYak=sY z*)s6QH_zQu@k;us?Q+nF8=hNwZIpbG9iw19Z;O8HGyPde62Thx-e0^gV@b9ONSUcDC_Sx;A4SPHg`G$& zb1_l+MCaL;7*R!(D^YB&SImkFBo9Z2zfD;}AJrYE;fBV_Q02K#j$GruqanH6N(?M! znvs9%>(ksCb^i;oADUI$=3g$?-ejv|T}I2FF=O07pREa*)}Z*~jcq*idYtJzn8*3R z`H-?vq5}hF_gQID^Ri^VaiY3>DbOk1hKEkVB7Tb|XsCGu8x~%&5!6;ig@MhcQ#6Oo zD>>5mEe2y-Hu@yvmd6pR!a%&;=o_)x0V)SEw*fshepQ*On~U&B5yFG=K!$g3|E7lj zgx}EI5x+Qq)wx7N{XlMEl<(mCR+ zPEvpMO@Y9%&3~nT?U*ufvx^ANEdrEjOfai-g81t=uFs*36Vj#!NX_qwlV ziS9fZ>aTHtb%&?YRi8ZsSDvGD>K_)3){R69JZ_ zRpEUF!+-y;Yo*&KlIEwVT!`*WAPeVJdfv;GI`t0s5fqgE9n20X=DW;})w6OB6!ST} zU0kvVT7}s_`E~##^iKUC**QHYw)EZ!VemZ9-9t<-)KDW-ME3J}+wJa{D1jHKEirFW zJ%TDVz!Ai;7yaeqJHjBrjwgW*;Gx{N#KpA2A&pZJVhg#Gh8cyJgiRnf{c`B`P@yj5 zhZz0Of*xsVieDHeO8-y)fYkAucZICs@^nSYQtd_Mf5m`EHV0N)BEs;T;q-@2&#WWw z%(9C>e|f3f0c2r(fP~WnI|odPkAa{i@-oC+qJ#bg=32OIP5Qg*^(DHX(JvJFXqx$Y zsT5Q%>1SVa^1`2HT#()3&R)&(bZ20umcVhjsnUQ(Q!84@^qU|xMRUx^bC2c$=258GaOT*kA~}cM4CxPoE!Vo&hnt#>BM9@h3o{DFk=A79uaR4Lm#_= zMHqVsukCK!EG{&h5z|kf>|fJL(6lYptGIp^>Ot(6foh68EfK?B{1U~LSKHPcQXJve z8@g>U+1^CU(2hCcoYHkf6S=uk!pQgL+<7&g$4?6Lw+zPgo5h9!h|bDuZ*uXjMKBT& z1mJ^qtE{JF)Kmu z4c|^et6@pX!RFKzvJdKaovmlM?q0sHrnb5wqU)Ar2OpM$)X(^ zubJ<UcdA55 zMPBJZM^^RMZ??rQh4jiPbR)gr!D4~63{{0s17g|bRQUT-+MdS^uqG1obbhx;Ax`as zYNdjlCZ2gr$&KZjd@KIPI%gA~gMSZ1D7Nlx(Hcz6#pcRKGon~y%}t=bQqp&G7i_kg zsT&f-;4iMKYXadQ#O-_6QFcs z+u(FDJ4PYx_7D;jH{AcU|M_Hzyby6V_Vc^9Em)rTb$ea&W8Tnvf6+Pi?{{Gc&LEwWF$)_)-0@qh<%4%`DI1l9Y8c2MIq3-LOAN4! z@U!92QDU77mTBxUnn06=D>E<*Gn6)2A1&6^d^00fd9U?2pOOgqJ!*08wd(94qYT59 zQ4wgvZmH-2{n$>R8^5D}M#_8EY7sx$M{1~*;HIPaD2b2#!0pHkJqy-@5o;o= zS}@`;_phe}?QOy@!X*rO+^G-bEJPuyZy1u-s;mA_qA1)341HaC_gt*8ceN$c?9d@2 z-|E03?v{v)uvp=Xijw}~VCJhVmFB_u>wcsM`%9R923IkxH|L$qR!9eXggUvySjD!B z!nmsm%D|%7UFmvp8v-Jpl?_L@|BtSP#E#b@=Mg769P)T)8?svvho=HIIJhaZYUXOY zgqv+R@?)-j_ajdN6K~Pl;0%a#6)VZj=SbZU@L4> zfi}%Z^SJZlLa|%DHJ3cBf&>1#A^&AmYc8%)5!J=F^I3y zHhxE1^;1_}kmrF2H3r1o)4WleLa)NCf+7NYY0DzEkNH}Iy|$9yiq|?*hQR(i!{bjx z^%@zmP=t|Jc=eH)PJk$wv5D+y*NXFg80fz?_Ge!r22A$FHUrWHlU_D-Ki5= zxq;eO8Dv`(PQ*d+jGL0Y+zxE>?aAG!d$UHqL)bkI5rvrHnL+fc_NO6jSP3uQqZnbZ z{4J^5v+1{KJcbkcZ@N!Q_6Xr;2AtAOS*w7to-HbSu)F4;SD)ze_vVv__uOLReX@qN z@?e~izI;U6N=2^nLL@{i`0vso;<8yhYT+{ay8R)+qSnNLSEY$fU+j%{sv5Vl?YMYc z^r$&a+VPgY+U;eyq6z9AwkxW85B1l#uW+@U{O{<$?i1>*?*G+Ai|cSvM?UoYort3{tR30Rx)tE;%yvmOAqQz_nH%vkR8U*PdJ^dlSEfnCI zi4fa*5x^?}&BLQDK>q^tLH8yC*oeI!{0U-H_@br&pF0@Rg+nf?fmX2Qn_!?cOf>is zsq@*LiX9RZIFA6@?q(EEe8|QHNA2I^mB<8CFisETKSWcsWugy}|Dt@6I?jk{yaykb z#R5SBsIEhG-vl;{k`C!Bb^W;=@A?!QTcK40JR`-6AUHvUeUKK~QKvQG$*(WTf<9MV z2H#BF;s#XAwproRmNDI!ac!@`$)1K?`62zQ7?%*OT2Qy;qsd?(=whXZI}MFhHrE&J zMT3PyIP+o$zBZ>0s4*db_s|+xsuA4cYc%?0wMb3G)bbzciW3!=bKPC`6<4k1#!%RO zp7WXeF`gT^c8XFBbXc8#nq=2sf;=47CUN{!VEbG6LaPiJbE86G>acu;3)W|5G+c-lQ8#Ca!dyJMsD%az$2 z-x%NVqvQWEiBuiW8eWg+-e9_)iOpGIJUB(^Cp)h7#no$sa-Y`kR#lQyAkEe1M{Eks znmR(UA`V@ac%kMY!##xjzc+G(9Q`s71ZgL+`f)s230D|PcLqC-LFvD2Hl9i`~ddD*fDK;4rVds~zOelq+ zPh3XK0^gWP3dnalu>MhOS^~fS!?f?kBrsC~2d=Inj+S;P*b_lqD}%^MN$(l6H;bXd zv(oGeICB(*xzB@V@GVB3o=D%l4{1Thqyz3&(JJx2;Y}8-oL63!8?q`N5qVrSI@qh( z!;oZGt3Sjep+<#HSrSUU1dB4+uYvLrDJ*+F0^%0Up}?0lnnT_Cs)-~{BjnRvom_dC z7E%m?4!S=<)U^V%bT@C#vL~q-j4}i2klSzLIc#vL9WY33Xczn<>Z~IxP82xMS!y4k z;NtWu72;L88%mV(oH1zWjDcaty9y}lvtJT)sSAfUEJ(x|9heQyj1W2^ea@c@z;b|W zY9V7+t|3AiJ0yUg>#c^`6d2tiN8HPDw=D#dN^% zFdgUXGcAC~Wn)U;C}sB$H#5h0PhLO#60kFT)W1Fj{QyVx=x_z5**r6-be?G?s1SBI zK=R0pTi3Hm_xlO6+v)^CGlVUOrTO?@Va%i`4!``_*0nq(w}!4Y?a400K^^+w?l zndbl%OvpaYy!qFy^3-F%>{|<7!Ev1bTrL)I$BhOGR*M@{s2}r8eg9Vq+nBn9Q*1y3 z-yGH0*q7yj_ne#@i@XdAFIEks648f2{g;i6oo~1ciA>!S`lWWyBf{JXQf#_w0drE} z)NSZX5XL(Ny!W@dE9_Qmgq}FddOHm5ixuHrc_nh*e&3sFZ4xO>y4+N%tL!u}pNnrC zP46GQ6=bFV>#~!~?-3jQ37^YU2pZSp$v*mTL3-t;?JG^u+c=Bx1_?7-8bI+BdEwp1 ztC{JQ?^}di5~DUK!9(cGbR4u zV&SO?6T4wQR`n+V6Amw$g5gfn)3ZTHDHoV-`L4*!hL#wn=SNh~p zb~hNs7KkEXkR(|`M>IT6|NWq%GvLS?SU3q3@bY~RbW*}!v03>xFzAH|~x-mO1j*6F-2x)9|L(A-t9_!+{1 z{B|`vGF|PJM(V|}IvdUoV~k_D_0XrEXiWjGgfiKw1|^~*0*mm=%1Ho>y@h$_2UQXpM=0Ok)i^h=YY=gdEQlZ570qgSVpdoig%4Ia#C%(7!tQh-BKaD=O&;!s!06 z%^jjF$m>kmY`pMf3mioK!U330qJCqn-s$smHBi9UrexmgSuA%O*9DJW_(|N$)N8ii zoiAh^G8tSj*GEZ=51KtF(mV&j)zU@2lt9J$Vo^FCK1+esG1c*YH$)J$n zko=}3`Q}jTQhQb->!koBzhw=KP7WJ9YSvi?>4GE>yKVdUmDQU#=mrB&V>TJ!Zcy#e z_eD3}>3~%Z7mxQkwi%R@I=%#i>zvRi`k4jU<-qH$PAcB=u86^RJ9ZxNNiq;M1+)OZ zlGZ*T=4P^ln9PTD27&hhH61wBe!_=kcP%v0J)Q~aVDKj6-mb#|*K9g>?A!bHeeFi&}MwxBIjPRA)=QSJKR5AE++aa{)E zzio&7OAmAr=4*$p361q?R_=*_f4jgE1eeAx>B1C{U=8lziCC+h5ojk{t>OjdyoMtr!?1xoG{#dQ&ik-D9&%HjMO7l#H}slVY$F= zIav7E;P|k>LX$_YyNZc?@5|6S2uX88zT@HtLK#dR(NBFqMS)GdE?g6sVEcfS&ERg` zbL={453%lX0)GVSUtZ?3UnG<*p+J&y!X(ZZ@v#g{m%2(&?A{U?Eo-GRvCfO8aw}fh(1@I;*V(|IE^OE=;S^|HL~p@Xft+pJLUDs@=CK5C1FOzf(zyswP!kU zqiWbcK|ZqRs}$5~ahRp{F|RQ&n!rH7yzckbCU<;5kA_)kgiD`doK&zI4A?%+J?Ww8 zsIrxu=Ksq`q@EFE8KN4fx%LU=c*wIXS9Q1X5|97;aW1#R*D;%4G2C!l0xA8HzmWeM zF@nbj*ycldO9y&sN#~s<$h+wO6YHsw;idVKHxc|=5GV#3kU@UK^Ney?v$szZHdVz8 z+!fO2pZy|QDx#NB3?$M}ZN1LUoT3(v{stL+g-3W1uI_!H@LfvN`V#axaiqN&VO_zn z9&$9{B&kuK*(Gr~=)Qkh{bz!9bOY(@hdG%(KsI9IPws$-Uhcd$%sM+aPi`R$Fl~6- zO0pI&4~BgDTI>YgCHgouBA0EjVVx;rl*VthtQrORH>gt)E);uUt^l*Rd&1X&E$pp1 zow~DDnfFdcOqd1|l1^ae4!Csv|AKq5oP>Yj=Suvafa^ncSFfml(%8-LwY{r@NB}L1 zcqGJxjOcw+h$lEVAw5rg$LM5RE|*wrNC(ksk-E~F-UCdQ<9}O=882F$qQMID=DcOi z|AkA5x@8^zR->2@iC(4fHNL) zdXJn^@SX*Q2p2T~*Z1VVoKz6YQWuOjpU5T{o@=z-yOO1;UDIWqBkC3alj{XsFN5*BGlDf@R*j5 zHJs)HOxlQrA9Av@!xf3_T-Lqp`6cqw8debO1Zsc6rr-2u8% zGBV#HYQ>NvR&n`pacU)@3q77ZoAsznl=K7^ru1z-1#sznfJI<*saGYu4bbZdln=lH zUsN}JT+JE443h`91=(HiV26}ntb$RY-zpkuGr1fPq^-*s8deR=iI!s8>_gUz03;#- zFPW)1c;Q)Km;y!m?Emm!_%(KzZ=G?W^E ztl%2%4zpGP45;Q)5fv;%weMWK+2`mDm6v)oe83btz1mjqHtp2bH=f8M)ncK%Zbc6Y z!7}crp&yzIhrg`7YyDH1Eep-NXW#%i4TL(AzXD0`7OUr?j!a{mFQ!Q7G(`);xZS8~D8v2lVp;OOM%(O7x~L&ai}Q0Zd{v+L`x1wpJ{6-1 z*X(mhS8veL37l>mr30ouYdyB0gBBKr`>G1%>i@vfSp@;~EWjpP*VnqfOM3YYF1dWL zVyY=hh?sd^4U^G-XjeRC%}Ao?5XlPl0RuT>av?591oOPCVc46mSpdr>w;Y^w7+wL-Z`Qkl`v|H9jK-zCD zbc&fbjEVa+LT=MAS<5YmTMnG-IQF`twvipmukF=<<(uoV&l4gMGJ$e}&ijIBMF=z2 z={azQWg+3^4ESr?6cxbw?DnQq0YK$l&gRK8e-<_}s+bV=4K64__o~Z~A_gd}FgEWA zJNMbsvyx`>QF7Y~yTJ%q*X28S5D@&*t})^o*Tv;GPqr7cL7r_S zRj#3LkQ3hM<=*RIioDq4uLTqR`e3{aC(qE^Ni~1gE>z7SsO-Ld%K9dwRN5K*Ba@#h z>(Xn!H^(09G`WVokxexL|4jz5*=>Ji#-Hh#SoAt0plkHWXk9E)QDsL9n1Gf1x=)7p z1s+G<1`hWRq361|{fh`i`4Oo}823!dcAj|P@qk%o3ZK$63Pbe~B;Q7IIfI`-+(E+B z{f?o$LB$d=&3-J<_n1cA{ih^N&`R)LfUF2zvyFtOA(uvIaOS)%Tzreg3YlGP91)h7 zG%(=6W{gaphUk5RfLIH}{Gehl{E*N|IL(DyWZ9Y$b$q1c_nfn?4f$H6HStRnf?(JQ z5}{P{#MX#XRU|wRJy|6KiuxH^aey#q2iU3Jb_tIrMv%e0>zTGtrMv{KpegU@Ls9qw zy-9-=LlOD!oj5TXk6})})j<0@g7SoM#O*0cGQc5!eSn*S=(1X-m-Rsw$`>aa?;L&% z;hUEiouaayUB^4^rzY}NbNkIQ!?8k)z;v~GZ4TGNK4ANuTYQkw3$@elaO|R{uf9VO z5Mhm^RSmd`^jZ%XtI!|W;hq{T7sfEX{x?;g*Ik2pSVJLGo?`7{=(e?Q(v5n;T8`BnN$D!iU{sqT3=m$d?T@u_ETr|4S)tCYH; z?JfvxmoH+FY4^+k+cOUjYWUjYA>8JMh>}W!Voqw5k;e>_V`!w;3^S+qSY{#Nv=g$mPmlOql@1Iy6Wk!A;w8?9d?bV`|m z%4mTez2qH~c9KN`OAr z=s=Z()Vu0B5NiZeZ(F;)Xr`v@`UVO zdDOx|_`P3Iu5(|+PNYBgh=deUqb>e68|x4JLA1gnOj8|uACA*`nGKpp{+6T5r*#p0d1~V}^tngJ$2Z}O z&!jR}*#BM`YOl?KKzQ?Z|)+DJT8H15{eIx6XEp*e>ZIj0yE_);oXdm-KTgo zP;aZuF@LqqSx_D94{^0R>mc00@}h^&<`|xqvAG^)zv8XK{jdQtV0JwJD0`{###qCp zm#94&Ftiu@RGa*|Zk4{Hg#E3XI%KBNPdBb2-vZBAte^Ooo?+)JQ@~D??Md%=37B1V zIU?uYuQr^mkXm~oQ?+1G5@v@CnHq7{eO$v%q1_FpMk7RT*Xe4fVFiU0pZ>#PPjgIl zE{;=iWCZhsA>2Rk!zx8RAG?EJzt{4YQgJDMT08;qDSvS+B=am0wlO^w0`vGj zyOk0h*64h{CeU~wfoQsRgdV0;5;ys5{U-X-<>4Hk%HOX!$ZyI)gGo7A=keSAN|}&k z4M`q&pPHzQ-hnvxg(M3)#YO-Bt*61d713a!nF#uqi`2>i;r6#y5Z>K)vgCBV?HN?4YttVa0lirc%yA1eu&IHIV}+3s?AU;GTws6 z6&>o|Tk;LGF!kq)4$nfG{7Q+G>_g0+bzTMBeSIKaacU1=U!U3EF)mdx<`H%|NEkey zX?VD6|EBWJQKjX%aN=Z=&jN=fF0!MSb`d7f#O@J=6qxTbVnx*g-v~T)3Xc91A?Q;u zB=ffaT0XGLVq}JCIjlrjZ=11(cDbD2fZdkA?l(MJ#z{2P?u2atCR3yK9Dxj1kj%Io z03|1IiG%%uycbKB=*8K`iKygq1Ke`(5(R*Q%RBVw2gK0vW|Ll*i7`>Qhw4$)rAh~H zDr+b#sqKX7XrSuqron;djyC5IQY#} zF#IZMv?vcvSAYNl%rtnIsC+6v6nXrc(r&RyKw>djv2893EM9&aERZL+TuZ^b-`?v` zc|@yg6-()}kU7*xg(Z2zET>fB^Zuj!n?09OQakEJzI2vZ@`U&(M7EG(CTqAfR39^S z6JlyT*Z~*VT!3ZHTxnJ5Z1#9yeG-rxO;@RcZD>OV8pFoO&r;bMCIQEl z@*`2zF1&syOC$gnM7#j_sk+;!tUoLnFxrVSC6vXh8?M;>!#}s98=#{`l3iaEc|Z2< zY_rYf&|vNKY(sRg0ZBlyf)M!B5aTq&u2f$-dslywM54E|QNh1;!t@Lnw<6Wxsmf!P zO9Q5Nt6Y#^e^{ls5X9Fx;t(PKdAKa}Xa5-Y%fEGs4Vsp7LW~dmXDK~CAA#WdOoA^O zyj5qb>J~bVJ=ib+NY4sT8GBgc#+&&K?(?QUypd?pS+~l}e{yyzpA8`luf&Q5W%gkb z58xG5Ez@Y;lRWxyX7Sy&R6hVq1l zKN#qS=$Mi;L8vbAb<=7zHw=i_Bjt2XAILbfhzjYp9W*tar(N@x9ZHh2*gvH0($>BF z54UqB7_`cw#O`e*!?8RmuJ23notbuU*`y>la77uz4)y=%dbPP-gyXO52OrKcCffCh zprUqWIR^8t0I#>;)a=1K6_958{P$6AGYamZ-OqFl+Iaz4B``03;)_bI1DRQ{j8h`i z(~+)!=*DvLg~~o)AL#Wp?Wacbr~*p%p39AQa>VF*lsXWrHmI)!u~O6FLIRy%v_3$h zqciH~sy{6~tb4L(-1e(RVS!h&vwC6n`5g^}Vvc|>p@Fnz0_r~}oU=ZLWM!%a;$B)C z;%(6hUH^ItHuRI!_-TTcmnI2RVq4MrMSxQ;%xcRTj+>Fh!`oBiXaE#uuoHU2r#VEk zUb@fPU5&g{JvLa07@Nh0%s#a`9?tSXF4AoZWrvenbPgjA9B{~t=7IKd;F;slg|5SL zL>>Yt7AYPp^c%`Uy#Sn~4XL206Tb@~<60%k`3BeIb@KBT=T}$>@5lKQ%qH0{<=|iF zM>p6#PnLe!zN66Il(=v*Q7(0evaic`jc@`QzPj)}5{S7|IZvJT@yb5(b}qN+tdyRr z(9Y&B2|cE8zQ)BH!9SS$bix-JK)f_%+f0NjEnzCKAANtTq3=G69+5tHGsaV%ReQAe z+Pr-8HC8W!b*Yt<^}_t>dVHsEr3s4|T04*_AeS%1f~>Dz{oOE#xr()O{Dye0+v+Q^ zoFhXFifmd>;1Dq>E+ghSxnh+{*R;MS#R{w`))k~<`9W|heTJ4(eD##lW6@xjy(Zgx%>h*2;u0 z13(?wS%K}CV_##j75S?Z9~_GR{WQ!*Kh|1G8qu@3QZrzaq<@T)ijc6rKW6@lKG|aE@8534Xrei{5x!hyL4aE03ZQQiYwv(Q&^3f4R>9LK#l| zk(4lHPT+|xX@y6JKG0sH9MJdXPjZa?xb2Lp1RrBwDVToP-!h#?M%z5izr`ckr3@udf;8(=wdVZwE3BKk z_CXGM?g%}*ZIf$CzfaT+9GOU)BqQ_TVju8eYJpu}4)_2EkSIUziH9O|7-E6VP0x0Y zzWwRn;8yK>gg$4B#gYTcWpLXALRs@vDFR3{^C~#=I?L70yqBxmZV^&xDbG&#peo7f z%Tzi!etF;r;aZ50m`OlEaCQx@CA8)&q!xduYc}j|CIE}bgg{^xq5K@D5U8A>?tdv+ zb()JylqY0^oNzEyZ$a$09+wiwD16zdFJk^CV`HD2^Ph0mY%9oKatVjQsSyfCJ(s6A5P|11KXj%NhXv)n zqpF7z8te>+M@4YvmPaZEd;snuwPHR0;MmHI#>V-`pG3j1W9qeqIvo{+^O9rX#os20 zsP2n!ocf_qon?rt7CLpfTa?eze2=5*UiCAc&sD z=1wFPH-=Z7iJTDpTaGD?O);wT!M|6#3#P|1c)=&-fN*>Hs+$kv0<4q!Rc^X~)MRl; zY5FaJNe|)b7*oO=u8YG^cfR}Jvzu%#6<+=(G&e5dqTsZk7glCZ&SsBq1@xNS8T*LK zsklXJNZEj^D@!wazqTe`kzgc>A6At`LcV1x6~J5a09@XKi&deR))AO4oWpt|44vN>1F7qz4pmxa)-ev%$aVbMR* z&EYMqbs`gG9`GFQRigSm!G<$;8uEz_VE^UMWIcBt-Z#wW>>b|4*FwUqGk5)#IXXakQ_1Gk3ZN&_m6PxQ~#^zUs zSnGmX#y|X`sY0210i8d6jW8gQV_W~G8K(s+Vb~tI=pp``N~HNn;@2iH;o-P2?l8?< zWys&4aiX?s)7=K!BKPhWVmdty)KbifmivfAl7$~osR!@J9RDf^8Q^fG_M z*d5S>N3TxiDO9ax()FVu;-?k&+46y+X$=A3XVlk6_5J(<85G-9C6aU=n^aa_`dIcx zvBEqGgHNX|d2zD*vGSs7MU9%AHeid3|8#9*4*qk~r2wzO2niC9I#GY?ieA?W*;fVY zY3IT#dZ%N`_Sgj#T zud{kD-3Fai4gX%0+fPvhiGX}Vi0IO+-qqe(+uhM}m~EJw(nxWB2*l5Tm?``^(FC+q z;Iq39)$f*mA&D>q8h))HoN*4@3nz50FKf$eO^wky#&WNQrS?lb#Fes%wic%u+kAFu}Z}IBr>GrQ3f`R{by-G;WqbZnvVw2yb6%w zEs5@>Xf5oN1RTYkJyttNd+dHsSX%OBy5DFbOnrb}J`64ta7R+N-`UnTp-V#piAY{y z2Fh>4vYPaL+p4xcbEt>>G~#5eH1Y$`5lbl{00@r$Dv z(b`}MS*PtkE}!i{x6S6u)(-j%4WFj*GBRK>y2Th`TD#k?>sh_jU0J!fsaeAQKyem4 zrhQQH?7MYaNiYnDgb(nubXZ4QTRK!kzxLe3T1obbk3BiWf!291_?j_jJM)GVmwP0& ziQjQR#EUEek)Wf6e%4h@jJMIKk=r^>EygMvsBvcNY)RnmIX8N9qq&&sT;RUBF6QR(J<4-|V%@Bhw6>>4T1SsutFV)XI?g1-kb ztu^aXRZn6svy8&T^X)=^tj!9=qMp+ ze0-s_c4WK6l)a4%fa-|py_(MT#P{!J{mT{1K-rKuLgie7P)hb8V;S*r#!uhImd!_i^UW1-yB;6%gsEM2r{X?6VMsM#6jG6F&5)#(mi zKp`58`H#f`(9JPFX^7=|yREZ#vF}>V=>TPo5-06{+d6vlcKdTZ6cd|MXh+D}h{$Ck zaC^g`T2+Z+GM9y)5V&o}z+Zn7oAnl{O$%5nc#5!|LqHrkRIxSSRxkne>g$KncNYN0 z&{rm;R2mCdm~EYvZu0CJLCcKRR)SPr?}$+7c7W472OgKMa@S)0erUFCl-werl|QVM zXT|&6vl%X^@>zHlFAO*80HuItvKiGWhCe}05n-#tv4KuoTD3qI-BOvm$%bS4sXQKw z+g*^%Ro~Qsq5v7(h!op(JAd7ABhM6s=CvnVy^&wMEGU zJ8c;g`XE+o;uMx~^4wzc&+!a@Wx(@fAA`~yT_>!I!IW)c)mVsKza?qs?f^P>IloR= zcjXOwRJ}BUkp84NyaNQ^fJ>7?3%{Q*Vr-={(jHOKYqI+?X~M{Jj6hmxm2=<2 z1}BrhkMyuJ$`W}q!ouJGfJjAqryNqw1cd{Ss~Qgt`hd)6q0$iplJ&a2L)!n{hD%!j&q?QR(xeoj*$qV z1#!9V94Th%zBH%7Ss_N-*laWyu~)4OY1H!e`D@0!6z zYPeL0l*pV)p>!Y3wd;!nZ)lF!*hsWeH714T3T_(q6LqXWXC=P}oVkt|Wl0KP*nm{r z8<17Uc&`j1HgPb@V2gF(uHL=l0jhrRxnjgkQjZCkBNj;&ZM^K?vLkx_+6_$@??wOm zr{t{J7QxO4rrrTVJn9&lT&mZ57pc-bQTAR4PwF@wbjw7%6GATZ-Ys9lSKgprV=JM^ zV&66)wPj^IDuuaUsSj>|cR1g3ISs!G(MV54&h?g}Vuo$BiOqk7qVsYe^H_&Z;&hx; zGV6uU6j#z5ByfavmBHo`O274YwptGewbb*JY?3~F^~v27119Fj<$lvArO_I21fI0*G!$Oz1ObgVKmhV~;U;u!| zlTP)BBBb+o~jPqBnyt5!jA-NWx7!d z#FW)6Q04xj3+m-FgtB2k-ZmIr&UgfMY(#)fj%2Aa!>{@l+v+vxhaJj!*E-+_P746; zDFh1xiwl%Jxu`*;%7~CyD??O9uKy}+-g>`~_|V=5IboW;cI%EL4E1go855DeZ6Ux| zk@BO-8m!QdwGkTwnveJ(t@rEVMRxsH!D4VX?$cnjbQ-6r^_7l&_vg|!JH@JgybFC? z2hHq%s&#?sy#J}|>7a?I>H&xC2u6*%QQ3|Jqc~IeZEkzQt-*f!-{0H?pv01`!E0jW zZ1x=EvW_z|vC>SR9OYgkhadN@@6;8e^Ks5!0+**8WXtM-w3Prkf+z7$`` z&rLc6nSPISKESQZ6`3n;npg*Ip^0~D$Mc`a8plD8hJ<*UGuGE0&6lqt=Q#s|SU`k1 z|A33bjokUlCcDGGfX$Of!Hu1qk;q@F9b|e63do0lD|rz_8B&t~(p-wk{!Jg*f)C%>v@s7+KxHaSoH?VrHpNo8x;=7@y(;A%t~QL=hc5GPJ^N>c3|u^nx0pT` z#o{D9i8+w5uUwX$YG~?P6*9Yz>}cg%lN@c`f4kN7_WP*9q<9E^n|8JNwD3Jf;c6Cn z1F7Bj-U?*gGt9;aw>yA_hOy=e<|#r{+eRC&y;PbYvR4P;|@iPk|9>rIJfBcRTBk` z6!z{xW_#v;&Rc%k(C-7an?!aF1(VS~6kEg#K7YVsoCrkb9$aUukz!({pdSW0S4N6G zNR-FF`TJGAxvhvDl!Cd}*mpusDE<{aEoLLbV<*3>OG6qZ-qoear}PV@aOUav(w(a1 zO4iw+6T%H=L}>8U?#%APaEmXFPjE#{W_%MVZ3T@U%{x=H#(>hnfx8|_?2L6mui^Hq z+W+9mM&2IC(|6@YVPm*^4mW7Jy9*z?kt7@*XV?)Im*Tj&Ua$C@{z93{LgW6g&~&d= zYq~r5p0B}>06rAffE_&m)f1>Ta^&mG))8_V0|7Sp9;0c!I*#yjPaPuzZk-y_jw=hV zN*+&86WD8LMBW^?W9l~WWc+F}a$bBhVC)Yr7Ue?wedEhBQ?rQflnk~9)qsCE=<8dS zqy0p5Sy3@|KML>TcJ_`-x*87-OrJ#C%!IJYGQw@@JV_^ANd&{Bum`XC2nLFtL7+>O zOJ+h#TDmT&u0_0kzyYp=(3SBV#8hE2^}EW5)`bwtGpKGx@TA+^xu~Zuy2onY3meU; zY%1ojB{o^}Bl|q^`u;qp9tA#aL2QTOsvT`!pk>88CxMKAC}Fd%prTaSleIYQ^)C$i zwvjq&fD|=v_A!D=R1?_6?&T{ifv!NGH^JCOi7BL7kQ1On0g}m@sZI{kH5)X7SVKVZ zuZELIzofO0BxY$!ILD$h5(_tmF_#{ST6UQnSe923$d8CeExso?0&~;VIJW+_E=%-xp~g9F=!W z3rb9_zsjK;f6exGelMc3V3@=7N10P?At0tS>|#?)1!559XEaw6F+rP_1L1cz!gUi- zlQciTJEQ({k{5yq)25Z>6`$O@-TYNB-{f1^GMa5r!}=JS(A-?1-MxyP3aS=C#9=>J z)W!e+C6?cQB@v8#qZhhR3+iG6cq&ZV7=$+i-e12`2Y=Yeiko^}zxG>o6;wUT8{|2} zcXNojUwPK%dNLqK1;oy;N0+%6GiYEXmQZ`<$W?|~k)%VkVv!Qd{ya|=B@dd<&(N2D zXiUG?`5^6x9B%Kv)r*ai?$4^?mr*s@Y8AWjyT+p-igN2ChS@(Ci z*k$tyvE>Kuq;yOFkn`#$Scs;{#(f^o<8Oj)99q@gM@TQYFZ`4_!s zZ`i<&TPRkz7!BDeZ^d7;#;0;qBACqiib4T|OQynkX&ZshPGygSt9mb?IG_MWd$mPH(+!a8 z2!Q)WZ_+)D!mg{xyWP7q7TPK?BluwqE91xF4p6O+4)*=huE5_rwOQmG*71sA>1>8P zotCfp)rB`yv-hV|T_VimeIvQB5F0Mt!knq&5V`ULcOETQGOq7>oZTtszO^@VAP$SR zmLBDqOyD%(maQCu^k4Q;OyOR|iLSh5Xji55)*T(bAYY5Y*kQO)dt(PnzT$B8hAqvR zo)@XS>Z~v=&3w^z*9&sP)feMP7G6>~O7O1$00RIY!ShN0hFeZq-VZsFZ_~@?t)D^$3WwP0&m(o*oIYwOyU*F?T;DU@ z!(y!5w4NO>794rtZR7wQ%cJVLt=+Neb4^H1{7H#3aGY=56o7mOwSf%0L8yB*?S2Jj z@fH^o4eP`36k#{eJDB$(41WF^GZTxJz$RlG^l0-1=!LZ|z>{CW%zClz{O{{8c)V!P zZu^n*u7CgJ3_ht(j{ORe*^w zK>&L!nHt&nBT<4Oc-|g++D&?Qz5>ziYTmwrHpVI!nADgsvQFV+WBLnA)&MLrj@ znn=q`i1eC5uBOT@JIJY8Mw&J6NI>(j-}E1{?hTywuR&iGsoswTX9dZ4PG!Wz9MHu5e;6t}LMgG8SxUq+X|Q-&W>g ztQMXQ-N&>7UKK)zjJACJ6|}iBiQSNqFKfOVPhf37xea$4qe2-67yjqq2E&_vKDXF(g+#s?nSmuU6GYP2B;746`Jh z#EidoZEF+IM2ygNEUi$wcv+fk9utKx^xGhrN z%N!|fum8`GpR93rZt^`b#Hj5njOy$DXlP;w#sN+`mi;ODiMW05?Jl57yv3)kWEl5@ zzZDpXBz_Q-yZUlZX5{Isj=TQGk*HW-^fK6NKmY_vRYtl5X6*5K z`YgP&&=83~I-MX&1gyYhvAj9X@AvAM$_$W}n98gSfE>G`Fv?&X$GqKg2gC-J-@hpB z`~?NVbJ!+{jwp&hIXX+vEi^P)*Qfvh?uqRBwys8+33cACzewGh0?SV76R42fvB3h1 z;zf2M130iT3i=txLr_gRldC^F55H!xmwcwce3ltzO(9jbPxZY9$o_#_Z#>b)CDb`cbY3NKyiV-eYJB$+*r;FLr~ z>`yaI{@Qj~WtR8r?(-`72_bm-e6)tp@0?P}H^up=aDb~Dg6J9O@3<|C!oAU^DhhDp zHD9Dh623hBS0C|hYw$wIP4JQ=D}?A+rTMH1(jh;xuPyK=Mmu*cSQ$R zV~2e+p6j^nVF$2TLOD`Iut~;InvS(e9UK+r%@b$t5X_>o*}aL}Mraja>xKhwIL@jB zV<90#b?wO3Aeh$jJ5GbcvxeSwE`1-#HCY6VCU!Upz)sXxCl9T42Q{{$m!$YOaYcNn zrl6hCdSmJ~nBTP4T8Zd++_hW(y1;!gb4BVo?Jp=uGpsfThdeS;2hD-kXbB>Yz6ZRP z(He<+2OMtLG=d2nL3gw8imB0kd1f(YC1^~i^r$Q$CbVh~F}xb!ECqigmrF7N12n@^ zw|Fnk^DapZ^lM1&T;U8LUih4zOwfsWc9~2mIw6?RX45`(T&&)>bJQ^Wlwa)_Gfyc4 z+C5qi-x9SLj=z&J6nZq7m`>zI!!YuE+Q#H#U8{rmot zCl{2E*8xkUU{}~|h8G!N#mAUTZr0&l)gpU zJG!3eMu)QZ7&61SOs=bXAP=qO{45HT9dk9|5lfp2x-z5?86X@H9?n0<@XB}C&bluM zzg7SP5a%%zK0Q1sYV}}ZvV=kd9wz8m<)8tn0gt-pB6tCb8hjVoL&Gwhmlcql<7GiA zphOGvNGQtX)J=jGJ9|#6N(s^^WlJnlIoi~plVorGJfk_20?)+b?J!|*^d?A;$i zNK$a)`Y5wk)oCYwWDkmhv}*c>KI~j~^t->8?O-5{OW3P7;&;4XY5|&tVN;OkB5**i zP}AeXG5OqfR*<^Z3x&8-_bvrf!8$i2K~7@k=74B)RKzGX zc`X*3xf&Y|OSVtq$5TTj1<}zRBCE1r_Eu3w)I6`Di}t9g5|97@0{{(i3@=w78>RrQ z=V#C%911ulIDw#}%U?bip9xAl@%|A3&Fc3lO+oZ>`5O~MIf%HENI4UUi+f?b($5y5 zVh5jtw5t9@vPDi^QolM;kcwGr@(~ENvVP7(Y`3-V*uv~O6~w(9Pao!<;e~y-21A}@ z#ty9&Adj&e7?Y#Pl}(>*Dequfeefkm5Cuc7Bt7hs|3aYN1EaLG`_EOA!1L@}3i%tM zyK}xB-3rXs>!O_l1(Rs7HoI|mJZ01Y;yj5MqjWhH@) zr?@RUd!#*j(5=nu)&C>D-fPJMkT3EFth*G^I$tmw<7+BStTjh5Xpl(Q!mwWmzL^^| z#oIml|7bS5>eaY^DMLvzLYYVLUgm2X9uDmdfO z9ti$Kq1Y!X1_TE+$N0vK zM3&Y?FMQEHbFvmGUp=bt-NUGey81sCUsSmtR?a51CMHWrGF9hr(NYg0D^F-_-!+ZG ze$2?YAO)nCT*HAsq09r6Q!?0bBy?OQ=5F)@X=$iY214I&ns#gYmT{A_O!v@Busmfy=tt4ncIGz^DBpeyb23m69OwJr{uVCW ztltOTs?^aG`F9TX0iEI=9pF@ylT_|2!{(BbR74`k+(laz!Ih?x+Y3?mwDv?BHnwxq&E`i>^n8U2nI#p>AKEzT zV#umILrzr~td%6l_i-niZGP_oe;AR{BTTP+^orry3O%#^oIyVbZIPsqNf%Y#e%jaT z515LZK18%W)AsRl7u}7pS26r?3#0R58wY&@F-7amTCp$nDX^`Q`(mooy{bZ3BXW%a zxn}D|;QEH*FkXW&>J1z83%%o$D5tI(cbw5-M|og*1B#r;Rp8$X6`AAWgR#yTEdhB zjC9GclV8^HkP!(eseuerBZ-?5u~;s*i4Ygblmx4{eddthy;o=Ln4d_-`ny%|bc8Ht zrk!oyJRT%S3hkj}JDFpLB)sMSxplq_gR>0cK#pBJD{KT@d$`8R5aY-ui7<$;(yPT{ zbtZ{BzbgN5F%H^Kd}az67O;zLyUTI(VW6~XEol;IS5q11)dgr?Q50HGe`N<`jm05* z@#4zmO2m7AePeSc?}Dmb1%6h*fFhO-YQBU$ zsQ>J+3^niG%IINOFJnpX(?E_SPxW5gZI|r_v@9~9Iz>$Gulm~=qE$VgL&!_@TM6JB zy-BLqhExZkvn(R(i#gaN`WR=Nx)$v|1Ld8P%)LwXO{ht(m62@gFZvj9$dm7i>bU!` zk*zmLq?1%`q>Vf%-#tXD=%0;@`UQ)#et}7BGGGI(r|kXQ%Z1N0 zTAYPU7`T*?BcomR!^bWFk`Y??5TxNE$_R?5p#Vi(sBGoaEe4Ev<*%t**;34fIE1V|_Sg_5VbvWAa?Y}0T&S?-w3@B}A3 z0zVZ>cD|C8)d8~0W!Vt@1(T?*a`)?veD3qX+(L)bK6&l5b<)=~1_1~2Db zTw;s03$>nV!KYKckHz%M$LjAOa4mZ|6ZUpiIc#LN4@+y)ZjIg5UIZP!JMOT(lthcz zdz!E2mvqF?ej?2Ruip~m6n^lbnD2A%}9IGAYX0CYM* z1tj0H+^U{3HXRlTSLku*Q`UmF7@uTVog9AQ9d9O~TY+7vEBRi)%TWmdpM1bD%$h>P zd6p`Q3R}U&`-5%hGbFGO(0?Xu`l$z7jEkYZ5Y3H^u6jJjU3yUg0#6|u=={4Oj6~KkWZ0e_OqX?^nHsN?4bCe4%)7%Hq-DK z*hR$)r|coNg4OA!Qq7ONgaMPdsaml}M#cGk@%=SDc5QJvPLR<$`4wndDhNbM`Q9KD z*?7q8Z}F_Ld0i}R0khbGbw|g){B@9iTw_EtCZb}v6!fH?aYPq=R8KlhkaT2yBz~Dr zRMld%P0d=WNg77?jda~&D(2D1?z?pRdTzZRQtyADUR$z$R2bs4dG%Btp+Oze2J_!sV1ypar<4kClL1E;9U<#;MAl|PRkhyQDd?-jTdClK>VhWop2k)XG zjMdGI&(ZP)=*cG7Ia24J*FawVT5>rbwM}oYj>=UTIjR2wHAWFF0(7*q0DxGmd}m!< z$RyBSn!F&mLshs~e8#Q|>^^J7Zx;=ti;%y4Hx{yg>-6y;P+5`@uFAE(E&X@*fd`?Y zF86ob5G0vV+~4M9@Wl_gL6sr=6i08};lwVispNs@OebSQ9Uy$g!tLR2y@nqw(JeJ~ znn8UjbKLX|{PZ1U^|Robk}gcjBr)Heymoi ztqTPa%3t0Nu~Q1XOx}uAA=amCW+)`Z=-ATK1`Z4P$x9xbP?N7TL?ySS?CVSSj%=rP zJG_^Uxt?gt*y>9VHJGnpUrEVeEdU=ZK?XZVu&Z~oE_B9Ig+1k#6?_(N>&bR|rQ_(#@l*EI=1MVktb$pz=v$+W9 z8+-`nD}fD#bGhEy?piKfk}mD()g~M9uGT#pxrKgy5%~p$=D*V$6EZ?JVr@{{0XYlE zovSId`}>I|3!wHYLl1e?PQ0GxYz7YJxw=~Ta08w`)1fSr`}R|4fk`sIKBbUzo19@z zaFxQ#`FnRl{lD?K?H2I&vU2OV_`c2KSjV#mT%wRK|)78|1S?e^<^M6-w-EglgD z5*ibH=pBUe_XX=2#hnpgLbG!CK1kSc34Fmm{@_p`01AQc*)pHBk##92c%HJC2UK## zxL;g%2@uB)vb#^NoYVkmUlXd5=Wb2Wz#E<%tJn^D<4x9Md}zb@cO69|e=<1+cVwA* zC}zzMdA=LWdkY|P;a`_+h@jmu8iZHizU&Q^wp5JYmu)YM#YUAfcRI2v?%w4-1JTBB zI|**HA{94ESRIpVCCDK#iTvm^*(+*ii{s_ySuGL4JqQaT$}#4WcWm?i_@28amxa`gENDgEMZl3Guo<9#-lg$0Yie1DU@yYabP{*FhW|1&*%v3LbVyRov@y-5>uHb1)KU?}! z^B#G*y}m~XYhdiN=01|M!L8=cF9L6gk}7!BG3J+z9?U^SxmiJF@tQ2+{zCaTb~pAx zx#$WZGUU2P2wmzuVF@{>Tv@ca-TGN+_d+YSF0fS69nmG_t!_zQdC38Ir|5T*AS30~ zcd$@r@6XLx1QfoUrQm$0({C%-O&6HB-^5aVmnMFyA+~GAR1z-1@kJ&OtCR@Li}oIP zmphP2*Q9H%+rwBp@)w7%V3-O)6&_$Dv}UbzX6Q3kd5kQ3uFY9sWIx)gbl(-n{lDN+ zA}*wpWX9wE-z1>L2zdq+ay{Ot+2$EASt?kp+&WFME#T4TRuDBLoh=se$bTYZyY#(U0PYJ0r%~};Oy&7_;(Rdp^?<`&vmO;@Q(RTPO_R9N%h4F zv~$j$%%nd}vcgsfGmJC@B!*6Gp8o1NPj|B?s4|U-PA(ViKaCh=mreWV>rU$(8YFYc z;gGjhjGV*g?<@7lp+=C+uk!rF- z6*6!1Y?xhDoc(D(6})KvMh3jfCGNn3#zj@1%%P!gK z;wGg&3ZwX$4H-Q4-c&a2HZ+yKbj7pq;?I~G`>&Wl*E@QH*e;WLz@Vz7#dSvKE;IBa z4W&^my7Mym0Pfj4twg81UA#0vd>~8E25}h#>$m*cS@`~Mkz6Og7_FFOecZ#?EnTU{ zvc2KJPUnlq0+njrp-Q&l%ZqjQ4QBITa0-?>5`#sX4QQ?LN1Br;-ZJ*?0q)4^f(n!i z+{$VZh`*oEZ;>GT)TK>x1IQl{vA;*Xiw9>)Wq``3$xk~GunI_5*VM^KCi&0s(zV1- zH~%|l9+C1#pauFfGlkPnp6{T3`t>&mhV@7xtQuWAZv?gWCqK;LkF9o=M}8T7Rq^hSHI%^p8PaA#Cs`pteezcSqZLc(RC@z*ToT|~N@4+GdpEfnixW7g z##N$4MqMy^ka<1~3B&Hr(MVN2K6FUc*<3H$n)xMrPEFtTGF6PA~Ms4JC0X4`BzJ~!CA2A?5q8xLEfc8koLJP|&*K8x*dSuh=fqk$yM_$bZR#smICo@xy_147uPZFXb_1 zPOdVfz*_(Ty?#I$7D8wCwO9@VLti&KI`(few_#t@sp{akVy+)Ba>leGrdVt|Uowc~ zshAaLs=6=H-!;XWhkBnXx7dv&XkZvBjCHP#BnZ;}gNe6p47<2Ndn4B^F{R?qj$b*v z*IjF&zy06MXJygzUGR1Jn76ZCYhX}usdEw@x+GAZi`eHzU= zBL28LY?)nLxs@#!1y_6*_dph;X9 z>eV-*l^4Fa`XlCNEvNtirI7e_%!S@Pgt8GRBi3oAfA`*m(tU%$(R%;@0|2oy(=lO* zM#OGGM;BhYvr(|abFiY5uhk^Ostc!)DO;CT#dt|vOE02Lz$9RI&E0W|suCaZ2A>-i ze%$^?Bm=T)k-!ZPTdt8>)>vo#?wwxE%qTwPur=SQYOFVAA$!PK$W-x~tR<$iTC$yK!fLF93oY2ky56Dd ztbyf7>o9MqPcwr=1wE`*d+Mn;r^4>^O}gzF0ZrD&s@z_>aJV=6iYIMspwWeEz_2iA z>TGNimYy6!Bp6;;4DY?ETppRp{iySRr~^_6X2p*wukG#frT4U29)}0%C9bseo#G;Z z00G$F;;$n+-!!#b2M>9$1h9IyzQ0MirS-pHK6#1~d+OebP9Ge-BuNwkij}RirOhny zE2tex+3tMzNgf2)O4qb8&A<>fmb;12#qJkPWL+{!DgY_%{z7e98(Y|bPZd;pu^);qtgC=Ee?tO5{>^7@c_&{@- za7wL5ccI3;2D2LXvY-2xu*Q15R-rc6hz`>vM;ZbMdAIEFMP&SGBqC8vq53=-&mO)L{K+S000931BiZe^n(meU~8$Z zy?=!l2%y;uke!pe?waVG*!Z}L!GFr3Rb!HA9o=LC^swDyvJWx7M;uL#YDNqf;La3N z@r1YcJfkUGWv@b+ffR2E$IyUm9Dv7f(5?V~x=5l~Lp*I^l1Znh13@ za6AgEdN<)KC7Qti`{x%Anv=2!LPT_*^u<7KdCA)vBE1otVkq|C(j_kf`;!F%{gTA0 zT(n)D0P`V#4z#}A>s$brTDx(6&7r^Ithxmr5qpt(xQT*e$-hgkTHks`Ml%&F0zgt7 z*Q8B0+)syI*F8iMe7W90nm~^E%4=)u)4^k|e=g-UcL=FCfEW6D4zzidVONzb{zX@T zX-28qxK|IeEz-*fm;q`z@aH0UP90n11 z@l(ll3H|iZHj(218e?EZHh?)(3+8jx`?0MWLDX-t(fiNUUr~y3frLcd(PX?13`65# zy-)nh-1kWa2yb4@rqC!~V%A~50w|tlzBxFfKh9!7vTa7%x1>52bpm$=+-5ItLwlRr z@kouv4*o?R%_VHipx^=t5Z~#`YTYb#IKrBk8+F91$ACOY7DNbHO^`lhtx3vxolpax zLYBU*Q#-qIg#~#LWuBRD&<-?B)CWXHudVhx15FECSka5P9@XjbB^vIt{*@gZKt_0a z*%k6vI?210{IjK?RiGl>PEMu(dlbzR-gkO5xwzVV%k+?h`}81_BKF{cWa z>;yTvomJjIhInZnGS(eYMoNL&zi{nt0$ic08Ux)@#;xlP11~O-Shgj5J$9yru;>K7 z?#RdEzy^Lnb`cduGvJ-PQ%KoQ=jKGrU6EyUVZCKc+ST=u6=*Es3Z3cWl1nU&{Qv*U z-l{;ex2Q5MLssi7b12kBae-zPg;vgMjb~_Il_-cpdj4b|pWoAk?*>KENkli%Z@zM-<9nMR^wCkzOlppjQ$6Md(OO8v#3QRcUOG5aMQ6i( zvVL~gJ!nRwtG%AkD7m?`|3JK;*(rT<9$Y22^S!^NGy&X;Av*u?KqFOEYz|PA+Pqj1 z3jc_XzxoJX0O?_3l$sxfmOmYEcj<(_Os8NxiNlyKPy(c4}Z7_Rxgn zdy7%n{0mz5f7xNf?v~C*nnpe=EqO zR&ZfUw^-uXufby2A>lQ?nMLN)1MZ;Jm8wdahZpRjaRUS@M1v#TYWj|%GshuO|`l-14*}G zipEbgYd{1)?Bh^XyU5wDBHMApf4(tn3ac;Wrhrzv@OiiyBKeNa;&6*G*A|4NnMjiv z$^&Ab)^`yDp}}leS~Q_IdZ^m8jiK@<&75&|$!G2|#;>+T;}rX-U6xR(@L&S%SEamR z6|G?niX3kN&Gvn)obqNv<+l&jE-ti;J`{bXkJ>!$Jb0g7JnKHeyF+pkiawxCR`B50 z05w8NEV4cB!}BZDYl0-y{5;Yc@19QgPRQa zA8Z64u?9VxQ2pDR*!{<=@Fn3ZoZDl-QVe0>qtLd>6wJu%KZZXz918FDqGQr1%;*`I zTe$hHZlS~jSaetydLm4Di4uycf$f%cN4j)NQ60<)SfH-7e>FiRFVNy!Bufjyf2 zk7g*bTqW&ro`bbhD{e%K7x#96GXNtQ_uE&X)1u)KOtHv88E*ig3g(N6TrqFxWzlV5-iF5asfP@s8xMqTMW?yQLKAR=CHNXy1zI*BRYtIe@ z`aRIy&di88jm%NYM77<%%CYIv?YII?A7@3PPkVpkh`E(Su0{$8^IWFU#v?O!g}M~~ z64jh%`EI6ffcS!!sP8QhnclY-=^>d3tglY|Wi?PJ`R-1ywM$*Bic16iDLnbpc+pKPagj_Or2~^= z(NW>wBxo6=s}jqP^(MR>!F4Sd+tdKU`FlTy7e-DiYr6i|cn^2}u zQaW(ZG8I^Zm&)>Tb8hxPajD zge@Z`-ebm!FQEkuwZzlGhntTh@(b{IhuipOSotSu&e!WyyzP1mT%(t>MlSmzy1UiQ z5*IUVb}e8%A1<7KXdU%+q$8QBZB76xUb9{L~-4D;cqF_aO!X zU-ppQX&nOwXYtlWA&X~5->pZdcl*msu^>U)1s2f#CV@nz+>6@q>kZ(t{kC*%r1ewL z9*Zz^XoxZ)5_FPJ@gx}84jmz{tHu*WZ;?_OAJr$@zo&=J>~rInKw;%=M|{3ncUIR@ zFcyMY=0ZI51Zb4ZsDlz!N_?X{wk55c$C_6M6F1saKG4r}DT7SCgQbi-lKFm^*z`)a zr2(b07fyS~rUYdFXW*@o9JD`z3tNtNWOB*&yi@?-6Ak(bPqCtL<3K+kGxu1+obRc4 z5k4lV3Dfu_(K}fDRl59}`2fP3HH8%n3q6H-4tq<9-ANG|_`-!O^=a=Scd-=5*T=&< zytvZjz8pmb6Rjj^E|E(Mhn(mf#f2nP2iDKE7;PQ);U9XwEVJi};Z$d8v0}R;uRivr z+kHSCAFD|6{K4_AJ|3VE^1s#!t2PhCYD^*a-7T^7iQrH#bNXLEJAZLONpQiAYoMdk znK{QRs~m9oq&!lQS(KEBYOR(KziU{fr>|@pK1RR;t4~TFZZZzTK!dnI61zhtR=OGH zqTfsvFC>hRXe=WZXaZ-NXlCC3w4d*Q&gbO@03|fTvU^gD&`PPd7OeEFWdB3_+^LlB zd-~bPxXJK3+u$Ogo*QXB3AtLR>R%3mpoIM^YmvR(x&r^uc-Y!;N%F)*5e)AH@1kw+ z%HN=w!dzX^_o3DZx9-p0@Sts`7-ygt_2d@o44F98ry%3f!djiqiU*qd5nE(SzBbmv z6-6+rnh=ObBlyW^ac4L+SW3nEc_ZJRLWQT%z;XiWrbZ794r{*LhGD%28Y&d{LZVS; zSTIbq*vws$umm!vA0h?6oEt~Q9=)nbsOvI6U=v3f zt+(_^zhJV)o&;~p5lFcAzmNb7rv8CXKxAmh-5`7>Tx|U#;K5O;mp)%eGDvWpsvfgZ zxE`-C1Q-H=A3zSKpmckc>P8#Jt9UmekVYE0CrYNIE;vpmV;lSudf0_f#3W*j`MCgR%;$qT+qHXXA_~V1B00NcyyL7S{LY=z=V4mu)se3`&=o`uB3}{#@p7Y0-%pz;iSM zqxTF>FwCVz5#pgWaAN;oQmAazmp?lY+g!D)~kqsrBc zXJxxGOyy{exr5W0C_H%aXGYYd5BKX0PFBx0x3lSxo~mmyL-cJkv+4Ws!1x9?*PyS+ z79F5~o#CXpuhruw@MC)Kz{$Eg-JQGOy+Zh%zE4=7_zmOX81qmg^I_U3-#LQP-%Lm_ zH)0=41ruhJB25 zMq|FR+(Li$=w;Ndo2Jku1(|EWBjU5S{@Gq}q5xqo1D-pd!(YROtR<~ckei?+bj%<- ztg;t~lB~x$f*{_uBH%o#Zh`=(RsNza?LgJXwcT}Z=9P>c6VlVP;NVt|K%#p5_9|Hh$dh+ z@;GaWNN}p5bhm|wMI>VrV$rj3wLnIp>Q-%mwLXdlsmT4&H0vQ6ymHjuVpcT%=QSXz zoT~fAuPy0cmYA>!rI4v}EofkMQG6`l$;ip$ZFhT!-}{KG z(tcafs)s9XHzWS2t2a{midGX2qAk>EtI-y|b>!&9-kz{kv9rU4U}Q4zFv^3^ZK3~Z zTFfX6?x;y)h&?IU@A-N&z>j-qam83WHloWi%j>>h;SRWx}h_BS_0Ou`RLwlF2!fq)`e42LUO5K#_pcM38Q52Ab3kK!F_rFLV-MEc;_l5l!65mFd8%_$B3dgDD0#VTr@_g| zX;tu*xtuhPWBeUOZDVz3Wb$cZ{e0&8FAEtl!mg&DN@VwDKh~H|9ZpZr*|VI_f3Jk6 zfMfg=Gh5D?f}J^_mWj46=V2WWakfeW02t2UwM+v9IXtX|uwyC}vR+P90#kUx9tKm$ z1t?*bJcn+rjcwjez28-&@(9x>O#1r|9^XiQ&QmT~u1}B1d7i#?eFo|wBFs3Wn?OWi zk4G}|3UY=MOU0>=`jLtwi7XlcJ>MZiRb7R`Lid2h=AuvBZJxwQ2z8BVsWF?=M>%G_ z?=FRTuYj3**7VD3@|_uW0w&cplrRB+pN=R-+CQQ}y?+5S*P$!>V*=hU3?R8&4z~7z zAlacqb!cApYsolw)J#Emlow3+8fXcctI98$JA&_mLa1PuokWm$eoi?8K9?b8En$o zldr7!Ol$P_ZM(zNIy!Se!S*0J2~GE}tNDHE3{3oETXj)Zl5yjE)MN+vMY7!dfMHT3 z@SMtrLf=JRhsXA=>TeL~IzI=7w=(U#hr{1qA1-hER zzkfigJxT7AYkCQ7H)E3E#i_UQd=OcU)V(vkn7?uA?#vZgA-HJsg2;i^o7wb+-IVUX zvWB{|%{Xj8J;J+tN%-v+JHOyhIw=R-ownwv3?V=w+{bMQ*h7#U=?vMQ8Vqq?=bX8{ zbIy-MB@?uL_O+MHl#QZ^G(OTSD4ToFs*rFoecY+^=?;I??!(AOL(S2#KZ@26F6Eoy-{qA?h776I;V(^#3&2yr%G z$3}G{E*iF1CaNysC>idWr~M6-M=i?htx;xyVtH7v7~2RDu~3G?PyUHh9ZY;N1E2^Z zPZtFeE-19FrQ(3}h?MOLXr)%r4Z9xHTIul@7{Y(JmZU`Q zolD8C_?MOhi(R~=)S(2Mm3qEDN|qXB@bTknBf9HLTw9#o1k};=1P@4#FvR30e3fh1 zo9A$-5cn|j5SJ@wA=B1WM5SzEyTT=ZBZ@Ir9qO@eX!`ikFCv@5b$51r*c#FB9+Z`y z-vq%sR6VMputN)2aU%akj)(h}B#VB+kk)kj+(keVOdF$hIWdNAnozmHkh|wnp&HH@ z#w46Ptspj*7nf~7%v1IA*F|>8!_!INxsqz5LoaAkX3ke5V9l(2GwcP_(m z2tPKrA?DklAGbB^UN%^C=2vOGPYAQn>#{)tk6uGEZ&XZ$cnlVxqwmt2%9Dv&M_pqy zg3;mD!tCDlstOnGPk#G9k#8pg$s-UH^eJOg?F}0c@8#XnAm9L-`hwyLjy^3wsV?b; z@A(Q8ZGmOAC%smTc>ca1DdKK0@^znN;mh{QZiJbv>?QwjJ4D6>g9s|^4azGYPZru) z)T#!K9c?hTO3DcTo$INyQO6a5!v}`x8~JIvJq>Ryu`>XXXDAh&Ikt`dtLUst7}hPY zgs>dHq-N}OMF`qQqCm`{9r^q2TzKa`%dc_6jcZ!PCiL*uZC=ytsqh@+KSjna8+U4y zb1+H{C5;Z@?Xhfd{FW%ZQ*2X^=AFTpWO?LSE-c9ON z)rmpCOr>HvdIvigHB9jhI&3IKLJ03!U zF-Ikva5l6^?nwEbj?33X%@l zU~DF3$rW$fY6%N-sC(WkWso%ZJBC+E9;j$Hp}A!c-64Fmeb)?;7}<0;W1|wlfJfpH zAS1?<`LMH+1+B#JcT~grQAG4SZXBZ7bgNX0M`KtnZtm-Ju%5?Z-=8dukKp# zOEX3OB5DMT(X$$4&N@o~=diNUP@Kw?KX=C&=-es#LBl{zj#MJ=EBgh6NC^K)7jGlY zAkE@Su}XN}Jz`qc)bD-17N9SD5oen*kpd`Lt_7d3fkS=(8eOB6yzqSFNk9y_o6DG` z=0s8!%G(c;9uw+b1lUzmXnly4(SgUJSc_HGpz8PG2}B77vCTebIuwsN96qUmA%FCM z;I&l_Zkh)dtMHH|+y}IK2~Gd^&qUWn%GSJB;1zbIY^nnq7$C3f~)PNrtP`lEA%}3{oGx4g>EnW@vx^HjnVE z<-dm*u)4>g)t8pxCW8j2n&s@k5j4s}04If{8>1tH4Png5$VbFgReR2;oKaKRih1|$ zL@eZ6t(ZeX#ZE$w|3gBq+wRFf3fyJ>m(SvYE9m%o$@|65!FQ@?(ii1!itU)AKJ6DC zjU2NzJLU0#3!s3_-)o(4WB%NEQ4N-uY*I_n-gJ_$i`2q%lHBg4gg|vRRz--gv$J|1 z-B?kDMYkk*-+cU=?k{M*9hbWAKr<*o_3c5#gj$b$sRyq`($H;Ts)ghy;5WsVq|W^Cyc%DK`EInueTPmH z_%#(n4GgGM;W))eSAU(fEJKi``PB}GbT$8*ufpU|Aj-SiVvdYqLfD8q*^0#C0|EtCHUb?`E1wb! z^s^nD)OY<#H07pu__&(-~k}L(tQDi5&X6Z(r zSN@dV#ZNRxy}gungERFD2)MK+l$BU`lQ1PIc7b$M+Cjp9)*23;?0l)PQ4;jGF%ymA zrP^@|6Ry&`2q?36@JW&kupGV8ws+WMVJ)(Px}v^GWN#=4>|+poZN%=GzQwm6Ml z6X6$jGYt9)pH)6Pm?C3dW(ZxW1Pav|{`Q@NG~quv7j|Gc!OwxPhZ7^ei?v?arD2Pm=k19Azo&Ed!cP*En7=HAnXE=? z?K^ExL~j3f2s#=V6*)`ABUV;e;2G@JF>xYI86Y0fA+cWy3~*$#!P*S8 z{K^YTh_GH}g-uC^mqqOOf->b^vWjvUsa;Jc3AAg0MQ&(hg8f9$`)41!ODklAM`CCq z_$Vc;3zG$^S4sQGQp{II&!S4R{J!en;TH~)DKaux{b67%n?4iez{blAm!n6<2;Wp zB~HY4GlAAs+_iOK5o1j}qe7{~fuPR^p8EsJB^FMNR<}0MVL3w)3B;ms-9^5dEE^P? zzU$wh{MY$Go`*hf+~m*G&2So#3EREf%AyX4z8|s?-%ao;cz=j4=d{n1BY-OZQfid| z9lhSPK|U?*G5#*;GDetbyv8i>#BM(Ga;lBoKJs7&C3cNW~y2-w*8xHI*ug_?WL$16cTd^2@CtfPCj5u0d!V(057Mo#~A zF;L7~uK%+Kh`S>f!x@cA(uwk^U7Pr~6qNQm4SO@eCU`936`2_;&EAcloNlcLjd z9KI=7ri3M4tnwQ603Aa0ElG^xgbgH$V$t`HfJV+l9uUV*(^f1+X7=a<$re~DT&1#g zvW_qazK2b=xrAr%D*`YwtTmdxn?kR#M3U1u9d}f7MP`gC&OILtA8O*Da-133V94D7tKWxF_g zHK)$fCkaj&)v{QiE#H@YQaCP+s%WL5ms9)(Yg*D38QNsC(QwbVPkZMYZf3 z-H!N1Gq2+?F0_${9Q-h1F2uKKCivf;iYAW;){WyRvFOjc&N%5t=Jk!R7?y*Ax_Q6W zt7NjW_Nex;4C2V37jG-{m?m!1plQ>o=e-V9A2O_EYnRn}O zPfpy`WW=xwZubeY`njui7Js=-9Z7&|=}JwmPO8%}z2=kJTu5Pn9Eb*e%LWhDy)#vW zqUNQiF8o1d7-w>d#fHS3SJ?4sNJs!}M*@S=xZdsT!p=Jnq^pM3Nxj#NPp*lpWMXg4 zW9+aT4bhpdmV;Zdu0MPCip(Er=Mecj{pdri|Hr|fl^2;qyA%-$1@oAxPvTUlF?rc( zKG#$Ybz_;tC1;oL<_@zYPO+#_{G8WhP)n5zXTP;O!eOm>>d#OVEeN5Lnhb|37W>ot zut2iiOdvJA1=e&e`r;7~%LG#GFpl32x<>ncs#ir8W;VZ1zWlEzgh`1_*j^$;8=!Yt za9POqahL@gqX}#jH^(0ceL%@6@;NRtn_+`S!mHi)UnSSmt&Iddwlv+mwR7r0%l7@s z#f+fm1lfZD20i)0_^5u3h|V{!sN?{hdU#xuym3EaRp+9WfJi||lu$6^UO!(0Q_2!V zY^=jfZ};gfh_vav?VwC7+K1JjuJ|zdb^_1jol(7WWJN~@USpfIUHoH@)pd97NbaA- zBbZXGpxa|Rqv9%Y)xJ}G^3F4Ujy0*+3Xh}&msM6Znsm_|nApxl=>|Bl93$u2`QM(z z9L@9wvcy%n9W-ZZiCEG}hX5EP^05p^{*&Kz2`t>@^dkV^yOV3wGMq8r0U#Zq5V<7w zHdq2h1Gip008|Y4B#js0c?lZ5XVv?>TH?6$CzU4Q0lwfZ5F`ai z|B4+o)0$p3tqpTOpI>e;E|cmyT>PQ_V2dfj-8T6s*BeQaY3{ZEK&lb2i}xv-=4d>k#IRoI~&{K(K|7X zrTgUYUMrR(I=;Be+t%mT;oAhg;?(tX6LvZ>ebZ@HO|aOm*oH^uHjdsCM|Nh1dQrw@ zR`xCnNXZ?%P{FK6BuXebcutXV-Ea=io_2j|W2oEaFcrJLtSq!9!&Q9B6*e;WFA`yB zJ}Y0G_^0DNZ?mLmXar#O&0?OHCeUwdJhGhvSTNpbI#_c}3#k^x?iqf%3m@lO3yyxQ zn3%OvqdZaIoQMTJCICMKh%(D6&hYpzO=)v5 zJ*Of|i)TO0o6ir%lT$YG;G`_G?5xm<-V79>GE<53QhX*3X6KEv$IUg7Cu2CxL>IC& zRKYIpJYEM^)FxMXbu?8T$UY*k-QYsFk6j2qxGg&XFp7gD``q@gn%3s~P-`trT?9NL zso4{Pejh=f&r)6iKB^ZV2Y2Pk3xmX)W&Es$`VnKj4+`%er43Ek)wkod;7&r$W5*5iGoj52s33 z)R%!TTYM@5yJ8$k#W_y1`nRJDOp(7&aJ2*nMgHoUS+SvHEsE?LVJqz3orzd zYTU4-mT)ai@7ITX{8hDhYAs1f_aEbG^2L-|Y!cL~zLcsSUA|D_u!#c>Mu5q#dMS}t zU?79T_gBnp&KwW3L1RI>*QN7LfP7~Kr*tgOG%M7fQ0A`{a?&>7vk0_FYPo2qmtK!NzS{Itw&k@@Q>6w7Ttqb%l1$0Y8Qr5vw@q z%W{{Y?n;2(%}&Qz=8%m0H9#!(l#Hdj`xR}uY(B#J zMnjRjVFB1gHfA55b&Qo9f()v`B4U`ionbYY8f#(Gxti-s`@*4M!NeZ(2Z*z)n?qmD zAq5G}gihlV^Q_x8hS$AhAe3^$ygu`_B=G(xjISje+*fV3n!zD-uqH-J*#dCV-6otk zPp>kj$~)og&9f?r)iuY5?o{dYbPWP{{6`bwV1l}F?jx!??sgUH({D-KF7WC7V8OGk zQ~#k6E2`_XiWeNnmGyec2y0xs3@7C!04Cp`BmwmCSoEk6<3*qGco|k%$D`l+F{#hn9&oq7ymrAmk}v#)B`3aH0QD)JgVbE|l+ixnWz z5uJ7$Ooi29xNl4n40aW2pS<9P^?Ok6m7dbzHr4r4(`u)pQV6{*M@HdO9X_{}cX2?{ ztf@qN?|>Ycz6)fXLUdWPs|H8MYI;&&JGs4kSA&nFsONtF`GiE6?a+v!Ea$7)wOn&> zG(9DZ1U8!TO;&COppx1IH%1X+>&2_KYT7>CoTZ6znT-Q$*(W8;40eu(vT31L)O?Vc zK>D#B@Apm&RIVStnlnBpn9qFkv%7Jj$W6CtrZI&{>Gow)b)f=cpJA3ffB^|}yXJ&B zQ8*?CyKU=F5qfzZPPE>2M1F4{A1A}uzVL%)1t3tg02u04K9oFGH;aH>P zx;3KckM?%Q6RP8goNJRu2}Ivz$wErK)JZx%R=JvU3>PLz#hb2<))UI|%e zgQTud6mA(RWXR%i$HV>75Ok zayvGz|B2{e5CNihXRbuezX&0<&ga?+J}$;C~xi?kYwL}fn;I2AoJ*G|KEWn(T{&Ucu9?rBb!O}m?y zV|9Ral;CEvmANnmI#)1~h4San8O>ONmg#ZmeQ49V(#12W;%lumeajE_Q3J;97hbc#__mh?93N(65?7il8|!df zg|A3?nO5BGE?OFgz-6JPA8otl2WO)_tj?G}3qg+$;N!*{gi z>(}D40HzbWOYOT1eUzn{M=Y7Fl_m$5=fkF_<%7y-%&d%~$PORsJ3^=3g*BOd%jtSK zNeIjy#FW7~z@}<9Z~k+)P?Y>`%gU)X?V}&dyanu3kshP{ogLARhW(Stn$WpyUpC?%Y|h0eWXR-8w24y(~Br8 z4J(b7+wUuq#a7$FL>isGaa`N%FsewS@4nl)UT?^-WD!NDmkD6dNfXYkeLJDh>1_|x z7m5>u>mv+ELAMf(*1S#-!mdhRu-d=qFg@pgva?r{-(*<~+Cd{GmE4`xEmb4Qq)yI? zfB~-E&IZvojg+bYb08?W#^Yw;mr^}FstoK(%gYV1BF2rOt$l_7}EA~ zl|$2)^W;5TWKZf#Az^YP<0zaCn z2dU?nd%n$*7L7dWft1A{cv2$>owd7iGI7lZt;cWrNY^Xp*$s3<&R69Ya>uA>DN9D* z+%*Gg^8-S#z;p~VQDT@b0(9JwDyG^hquH|)Dd*wgHUCdhXTD)XwEBB4+Dr%V&K}nW z5gKkTWF)ID6kMS~$Q|rytYlrz zZ>BmxWv9Lr%O~U)Z)HCABl|Rs>K{;R<@Hw=q9{ zvGznpjnzj?0A(ST4zQ<*)L~-*Y`4_{$<-CyQ!S@SIlN0h-52XGMw_UAdU(^eDBjJq zzuYN@U{98Y%XF2Aww6H;PeF}TN;}f;Fu&1=d_`%UMY+JXe4#IUy${PHDkjFFy=#J4 z4i`G{wAGJEdircl*j5UFHbli;qXWa5j*0}Df>%Gj=`UBuKx|M1!I*7;HqPoP4^AtB zH)RwS!S?o+2!>s0YYa|vlm~(BBs7BT-&~>AhvhmyY@t+VI?w=%VvQT0c14RLMaN&l zt+f&0pclSu;yGYi~0kv3u%q1Ra3&1cx$ph#i?7GUoHQDvFLF*PKw1; zInWgiG{h7y-2F0A?CG({7J0OCV(jCBIp>QeLc}K^Mf1?V;+Xe#$$x!*6nWL+ULTIF zV%Z6@R?m1dD&c0+{OeN|Sdgm`8A#9(Fmjnti)03&v7Mn}nRN**pa%D6I3~J==kXD$O2Pi5~y}M2K>_rc85jMItj2 z2e5;H|IwG+Pl--Bu$X3i$78l=Hox`5uRoPxls&gbC>7M6l;@&_PF~gJ^cX4s_EK(AanU#mr_cvo!sxKD~|Xxy)f)X9W%*Y zOQI+}FLu2H;RcRzl{~89007wW$iNbB8U3s|BV{4Sbyl*%h6nIRU`&{B*#)pm2RZ7X zOcmP>@wzmPyd)z?YYnYW7{mXj;&GznqU1P@gr8Z!KtFnwHy4K4o}q+PpmA*dnyh+z z=tK`NP%VY)sGd`LXy=NN_GbRXfYowJReFWeu1U|q%gF44G7U5{?n(nun?WQt6jXbXyA)|B!sdMQnjXVL-K zUw9F@IlaB4ct%E2lH08J=)bm4{A&{hOfP?$FeVWnvPl6DWeVf8@=*EF0MkWIGtX#M z3N|)*U5BEN-j=ZMt9YKl&EvVP|E}Rv7NvXhmlh>zubHOjPOK?vI2RogOTnHoSoJ4L zh0y>xXYnce>8oIvAfrosE4kHaC3obVxFJ(401=#8r0&KL%_F_bTC4qWQCT=Zl; zK6kI*ZRsVacJk6rA;{n1ZPL^7S7OfUsx_tBOSxPj{D=D&`hKtcE|GX+0mlJx0X*-m z1Bv8T69pbRf%V@6f>oLZyGNV_ zm`!q3?YLT&pCqnpw_o=93$!1~t@GUdSx3ll_AIl5k@O7B>aCj z6*G+K2z-9Ni`4@vOmM$^ANOuvVpnZX;l0W3lX#sFEen5%y5-!7tQ{{5QTpSm!wW@R z6oeI+d*WbcPx$bV`dlSN_s?`XUVHq{j^_f}rP^E)-35BY#r{kPKQEyDpZpQZMphKisixHC+t`wL|SnQ(^ z_5wKqm$mjSNzB&!iMlh_+`<}ux_syEQO4chGBcj}BDQ)4drxeH<%)CZjHbFLJhtAp1=$_rQZoaX0lP*j;+g)IADF$N;Me_;;aA?;Q_(p zWGJLR0l^FEa3ZECsS6?tqE9|Ub%_6dQ?Sg|@UoS}KFWY|tc19IKa-2< zJ9gQFRZe28oUny8N0!SWk9A=OR{71GbfEj&Jp#@M2SbQaH!SKFOQC(r^U;yP@_Phn zXI*?H45jiG>FYNTu4N_Gi6v8Ga6&M#Nl9}>mMf!JdN{K|gdwGONK3!Bidn1UZ0bN{ zjWN-HQ0UDNd>U#a^Og1&ellpO-L;I;xkE=1YcP;*-Au^=ixfJf2ggz)8B)X~pAFD>~(y6zcl)VrdOtZE<~p z$I;D!f_@50H36!J&xEupO}1FY zX$7dI&)?yOxnf|}Tr>jnH&*#xCDog#_vpqn4VO5S!1337Eh1H8GHD?>}ZL>Z=sA+~nk;AC&Do`B^gXz(Cz?NiphNq!#CAYi89BXc~CUD8H zT!KJqS7N@PAGtG?bzhx5gGKAHYKq6$Rz71-_tmOa`ECkHNE~} zwwtEN!qWcuP%|zgAqGt%n$-y?ICp7jibf2rjH!MDwASt(^q1|JofG624Iezsl;-H} z@P03MNA-Y}^5QOk!tSv~5H#}*q^$2JDyq??wN2_0#uKLOJ$|u-)#kLz@Z0niUOVg4 zCG-SG`|kLq7YXUsQZm_4C!;Xr)s3nUlw5lGrG*o!jTAt!-S7CS7dN0-QKeCTyvVJNnzr9az}-0#Mb zIb`B>V`6+<<=#j++e}Di1mO^o+T`@u?6-#uNO^Wyry3z%FOh#@hBvlmNfsg+#2FJF zX+lVgs|&uaw)jT^z+pk$%ZfGt0w=Nb#Kh0gpLtObAZX~+jXrLSwR*vC;`I<1F}Y=D zi3juNrEQ*ZAvy2h-*tqwmnl80re?a805vER5koD!Uh2nVwEFaDP*Er9(9%}#`@Eg? zvedbOL?=*y;FAj#_w*k;!iJS1ctXQ6AkkI#pYI7Edk?+rEn7da5uO7K+nM->syk)r zhb~_SU1}V+h1_bv<(i>Hi&*-IU~rYSO`d;&E$y%2k^HV@Ki;X&x+106Eh-{2#0I*) zWPz4f#;MFX71nzxG{V{K1(`7@qTW0j-VP6xJW#6ulyL;jW+G7+6g$WF$yIn?ipPxK z#F}a{%B+lbymPsNxV|B(wm1|RFmPjk(Z2g1+UC#U}vadv1U!)s1pG_dc_QOzr~VZYFnkhi1UP0EA)UWb?jc2s{rfjc&Fy zmmFr=#48AUBAIfHzGt{IgPQ>^IGaPZ0>trlal9C9&x*gkre*iOzso|lp*hO}^!cUy z6dIoG*V7mgpY+cM#E-KM`+l6XMLW~?7^V#%@1IRDREJ`;yue8-Td{GcRnfzXqF!<3 z(#~pCqNwJ^R%6&h!vLkYKP~89k$R!roecWbKbe}=Ed`jq%Ukr z+GQRJ6mua+TTm9)W6Ao0z_LQLwM`)>Ml{mhN3UkytyPK747wWd4_w4dk!X3 z+oFG%K|Xe&6XH`}QUEWr01IP$4FnU6$KK+t=rw<4;HBsjz~v@WiNxln5<@qrb&|Co zS3_EJ67cm+M-+^CWB@0Y;tS@#vZ^<%b{2dpJYz6h7fUbKJkF&t$_TI0HQgtdaUmji zQ=8H$mft6IQV#iK^HI@_z~DJcNdT{vBOf4|VEPrx zLZa6G$j02<#m2E$aIzFkh~To(sYNgB7$oojN>ZSXAzkb}DNDz4{CEhbk-yEaGNXQD zZG1D_zDD`Ixw~M2buPq6^bpLFnlDL%m9o8-XHsZ}5pP&W2Pz|#4RE<}AUtPeA>gb& z578F3rJ_L_vdqMC=AIf#^X+VU#8*eeKtDVRg9G2huYgr(mh4*vPl5?JNU*1(mnUDD z_xJfj?@4^UhU?-I6J@)sohJ!CkPe%Fy~+b7`Lhg!xoN+OPv!txe%LfF^+;hSjh4nT zOqp5$S98cSLTsJ|5!jA1OZ&P#M)HI079WbpGlt1LyseAQy$}zN2p46>9zeL=B)9Q? zbv!A(q%X(LsmTD_HvYn0 zE2P*D04ySaAs$JLH}ZiFJpsis5lQ4vg~mhbTo;v6Gz@`BbJQ!Nn1rY=JYHmo}C z5oF~7_!YSAcakPiWsHDg54Z5%pikIF&h++dM(zdi#GOXG&R!(>pK4*AXGLlNl&V#Q z7=Ve@-Mo0imcE<%^2Q1t)rbN$h+n&I!pJY5B0Kf(h~*1_$r4rhXUzLAy8k*Dsiu0Q{gVUy zKU)D>z5nVe2t0pUD04wC(iZ@LuHWC9f@}7;1aYATFh@Cq+QMX!!H zgz&IKQJ)YMyZ%FA zFUQW_LOU}ag;~FS=gDBU8Aw*%GxnmM6gzCef+2g`A{xH)G*^uCK;9(7i9Mox%P z9dWlh_9t{8{a(fA%~)o^>Rqqx0I4VOtk2}BVwpT^yP*~cv8Z>jc`(AZ#%+_E{h;Qr z8eLS79iVs~sPECRUd=ni#b0qJ1by2wYue>}DNL55Vc-$rsI&s`qQ)7t8d!@HbHg{U z#@iBWm8e&SS0)8pnz4`4HtSEIJQ4a&?dV%PzutI96?NZ%GrM@icaHN=$;5OgAI3r^k_ES`x%lx&dc_a zKq1so%FEg;`IWvb*Q`VnU6JpV1<2M>ch9*D`8PBFcJ4e7KJ+viwi!0eYNb(#Vgh8= zMn*t<8{)f`fZY(kS1J^zGU&Rp^#L5=`OjM{NztD}GJQ9Bk~1uowNZ62#rD)l>p(fv zdb)UZS51CP-Nh=^0zcJZB$zkkMDt3MBo9qJtrwWUa5LW_v~9=sG9c*SiNBVhLW*WP z@Qp2~foPGQy(T|;p;_}p@W%1UOKG<_G_(pFB=pS^MtN}6s%E-2A zMXsndk*c@Dr&xEb{^ebNIp@%y zK=OBzzb;1iWwM4eX!!S2Xht44e-nZkC~M>|5C4A z{HKE>L}&LAPO$lOh9qkD0C+CM^~L5=lM{3SK$rCbf;3w}%--Kh?u(4h;X>fnzVx@P z=-Ybs2c-9GdWi7Ze}I-2-VKr$DHj@_^TLyDaBg1GHjSzXL&>qteIHv+dE+F~jBw*O zK%g3-jRWPg1gp?=MMxg%60@ws0m}hD-4LPMu$BM5aB5MW{V=DNm-PIDgw53p#q`rl zlKnh+LIcV-X#YWS8meqIRkg0j@gr)X6OmVH%0c8^3tO>GY7;{(W%EABXdHx`?$H+*63dH@j^AQZs;uKkHl=?JrBgT45Q1l^6Rv zT!dBZZm)woe{YsDS6ZC){a=V@L;qzqI4K1)e`lZ$JJM8&^FVFt>E{mWi( z*3NbRPKRs4PJgNJ_f`Oc`hQ9Qgw3Ch^xsx9CnZ6_t!Yg31F9-M3ZBAOB<0r~E-T4t zZ%OLiq#6|C_90~und5=Mt(Au`7YiE>pEX)}HpcIOn|;CefJ$MkYX+d6yGePk7Jw4n ztfp708WIB~0RZfXo<F!BTqeh7GMUR?AaMb3Z)zcLxg>w@Ro$5=wMCAP7wJYlg@wY`c>Hbe@@Z6>U6^%Go_4F72moWnH>Hj9d5r4Y! zKLMX0XaksMQzv)>L9uOB5(W*4I-Uao=N#88+8(n&{W|P3hd;l)wUfO?CXR@9sUcW4 zmAm%`iZrFeE2*LY!}zUp?$#X@V-iV~o_rCB*)J;nSz2+$GoNoD9;kUkr{pqJA+!C215Nf*3xfj*Khx3rX3t!)z|z{Tv6d#j==qK5be8G3E}OPL*VNE+VV#lUAP#?7*$= zHt_uut1rmC8+gOk{|z1sf40Lv!80BEhcN#myn-}Y{;CuT`8#evx&O@$lpXgEz*^}v z{*i*~e{ci;RGq_xN%=cBfLHf#I%fpRPWTHq;1>ge|D*;juNfZY`6Ks#K6QW*{w+W~ ze|qXa@tV3Zc@U3h2V6cf8jX%Ia-;smmTQW}F*G%&p~`>ass3t>lbcV|UAEzIRnKzO zYFNu9`m9K03DSKeWG??hd8FyS`r=RE^%sJg;9%4hrR$+D%Tnz@(s(4@oIE06H&%~n zVW*{__ft79wmCCkhA@Z)85Ur`O5yRUWd%iBrHm{(v~pk$k+J%;YqiZmPU}C$18TA2 zqaoW4;JfPiOB{%s3WL8#IadDc=6^r{Wb1_b532v!U3zK;_iddYe^&wQ%fD5?1eCq> zfA??&{^!W$e_mqc|L)NW)$(sc-b`MQb1h|<9qsTo|1m3nBXsR1Pvev zaU@mqf3hb3^SvJc0Q@oCxBt?cjR(npU-`e32a3KqrS<=Ay8jlQ2`CHu|C{puNbraG z+yAB7TL0_L|GGaFAAcIqKa|&Uv9|@EXWEHzEj*L&F*pL)>h3!2oRki8-)P}-xq!@D zjNF58qv%Y^o0SLWwwDSa>?0HDYXOixo%zY2NE%|##m$O5un&8P58#L6?6Dz7q#(fO zqHDx?3lA+vp?gDjoe4o15A(S&M*L<>bSN6C3uBp%LpCl{Wzb0K))z#fzu`S`yAYu& zg?b!!M8}&igI42@AoSR1qa}3`GVP~X1C21uj2)--lgtYZdPBEvE3mPQp`m(+%9@x^ zz!Y`6?+0^&BXtM$QQO49#oEjRC@Ir>!UokZER^4*&lv^I1oFStl@_9ps&U%xkt8-GapW{9}JOjA*RC*a8Kd9%sOoT4xay@7(ERwcdn4zg9|ir(v{Kx|u!q>Y<3jw&o_m(OulVXV(erlDaijYlCC zAxXTaP8(*fDz&=4TqwIfTlg>i8>~~pb=;Ryp7+<9^3LLgZjn@=X@im9v=|7)$k@$Z zH?)$cJzL6YWW$oXpM{U~YSbPwxo^Y-FyMM!@+I$bV~r zxotLT;qxAOXiFdPX&_IX@_!{ZT5Kt3L_i_;4Btx`B8&F-|3n}-Q;_8dvHHiFKX`C#T{1PMQ# zz&E_5WxF?dN%v4)tjX5?$$b6zQ+Bo=5QevvUZ%o0w(YQ7xdw}q+)!pFXCvS!C^7x% z{&2-_J_97eNWCN>OoX}A_l}qiNbk*Ekqwe@G7wC!)(<8YmnLPzPNAM}QBMy^K08E? z4@FQ|VV@D@u?)WuqEWgBn?OjP74Vl#PPVi2ZS9Fr|i38iAw7scX?Z|_LTy#s5_10>f!>T^Y z!o?TCpU?)QY~Gl){^ht*AEUbALc#rW=8l6b6bKmE77CLiP+G2XW=TdD!A z+)CclcXGd9JwRoD)&{iChu0k8Qj9}9HJzvL=~>03yI|9&Tto8!_jZn8qUhV#zhl-j zdjsS=idg4TQf7)i8A0%N(p4Jo+0xM$*nOQ#UDlz;3^}=&4R;`L!@~%LWDt|Se=X_L zMu-rte&D}x*{WNY4{Vmq`B(oA`zZ%z8-LiR3pN>wehPX@D}s@j4CmdgX8^QYP8gz; z*Ux9Lx*^igi$5mcI6_a{qz;GxB38MHwvjKC3Oba@NK?$}D5N%Hhm+TU3w(MA6)KK8 z5P`n)Ib_DK;0?B4VU9_ZNccZwoda~FOSktsww+8gnQ&s;wryi#+cqY)ZQGdGwmGr! z<(%`*`R={%TD`JrRcimAs@>K7?5AtjudW}ysBUC&3$^Ed^Arxr?DlSQAeL^%_C}~} zH=l&Cg_?FGED~+AGR@SfP26t9>LyJW#$d0MyVR{Og5XP2D<$m~f0jVUevRRytj4V2 zw|AZqDKpRAFem%z35S#-#uV!SpT6x zFt0g4=fcpcCrYwWgmd`YU1rYw|>M0341n1^e`+cpeW><_NR%^^st;8rqjFmAS92zB2?GyYCc71RS!93CFF_Jq@ZLVuV)5HmkH1udX ze_;?=gPoFyh><*RQz=7k*NVpp&940b!=~Fhfw;ww97472x^}-NRSF>+`<+ex4erl1eoOYgcLf$MD>#9KGA(YX~M_xvM16mHvMFl4hKQKw}hfGY@E30#xva# zy!VN7U=0&`&*SnCd+FPOlKZ@gkOgzs&Xth6)e$7&S*tp53g&t2u1z1$282d=(a-Sl zZ(@;V=BM`G3eLT@06+7*fv2H|ny5-{D_Hxp+1Hp-r8pjt(pC=2vPNgK8@TJ0UJz~| zHibXGSYq{;$qQI4t$&BRA|s7cBNJ1LdgfDzWdJMQv~oNBlDP-H1WI+KNm&VOOtAiN@p8p4fSed9(K)|PMz(fj%^86YZT-p`FhCV{qY|B@wUx} znF=!tBI;nnKe7OK6p0#~RtqIgo#~^*WV>!>{9Y4wJOBHq*_3b&brjjDo3P5(jh!MW z+)=sfEWW90JGaIMA@QPR#v+I~d`Y9@1^zFhXSi3SiD`m6;L%!d#H(p#%9+cy0j`}O zgQLsTvE$jo&cZ%lXDOSVrEvk1X>EmeU1)TS=1UBAcmiHEoWj~b+urFhQUrc&MPO(D zUaV>is=eX6dyGfs!3aIuIaDzqNh2Ni^C_G{H}+Vwt$gm@|CG+1Fk`Ae$rd#EfOkw^=XR*5$&X46iod zckg6@;&LIAdb>~B)|O^}_R@R>P3+o#C6hXcZN;A=*eA_@J_v6?O{QLY&m)nB0I8d( z`TcyG?I+I%=g$#U&9jYf9YQ%13xcr{ql?u)0h%=vj7^;rpM6>mh8y~3evC^Gvs=GF zzivR)E{08xlcX>}XciTt4$)vq?UHHqKN5EN`|5!{~Qw3R^LmAWV(lF`bVL zu-S(}A|EX;;MG8~!KT$%4DBu(q;hxN5413eBsd+-yN6rcw&*iO@Gw!DO(0;LML*4Z z>5#Z5ReS?sWcO|OPvgqTgFcGGDd=ng_>l8lsdQInxVH&6?I`LpMs1g+A2`;>hC%)s6 zC7*mQcuct~K;Wn*s^o>sG!e5+MteVIoCAT}D>D6#n;9A)YjN3=Z0TWeMhHYGHd+r! zO*l`zKPv>a%lVb36ehEYxbqNFCYrBBh&c%H%7r*M@{80@FQX;PD``M5LCQe7%n0S; zMQ5iIaaOjTbCA1pXL zezs}=nAL&RqiKK@w@+EMBjlGlSnZ^KXJSRVXsN6o7Fgq{_QkjZfj$!cV`cwia8$aV z{Ed=E8O0+d%=Iqy)<%H__BIL4Tttomlv16|;@6jzOY&;V)J`rG9WpxAd~gGv3~x2j zW?w_QX?3lgqD`@~dB#e}c+UKD)KmvB5}apfapOa)NY3tnFfDeaDTybR7N9_iYAcEf zD^o$(@XrL@b6_!>AQXL+m51)Hdmu%zrnBLjZgh)rA}Rd(efPwLBaM`sIvr6_csp3x;oD14LLQ`cRxE5Ley5IXE`mfi%KT zx6G|dBm5JRue8ChlCNNM%D7QA!FV%3-A09n%GJou*X1`L;gLk!1{unn32q}lPjO9c zBLR9EzWvbaVoDdw#pE|?QD;vjUQUz#2nQ)Ku+}_`V@*S0I^e#%3SG59tncLstM#nu zj2)i=0c^?#>pd9}8H6w18f7DH68i@AJR4J9^*0z}{{BQ1@)kvAsYM?E(+fWdyeL>q zmLLji6GI+YQfgVtz?p26fQsbS@E)}xXCrc91m}Y0F63R$=zV_8BX7iIs zeKLfl`wM`61-kc<$FtgOw~QUqi!`;&D9E6GZn}kueUH`33baEQLcDD`@(nQNKNq+5vQEwdJrha{%$Wk(^V_gJiQd6=c+TIw8{=eY^lqk?pNW}9cJWD=;F&qWn8{``Tx&sm|w^U{b*uyo7vrGmW$`qN; zWa078GZ9ia!R=0YpF`!f*E)^Zx6H4#Q(v=(R_HC8*Y86(O2;cqOK^dIo^_QNZf|U> zDu4%npXi`U7uch}IumVnL^do(O+)8+9FjvXflpzh;0>#fmnJz7o`kiW_kvsJWF#Gz zN7HZTY*2HN;+8ac4o{%GkUU4tP0&LvlkN>t2I{9m;0P2dXS1Efvzn^!O>?=qQ#Hu8 zT0l2<)EM#k;hDm!JlY9#cy(_7d@=v_^0T(|%L@gauegmBcSB#fQoq^7iEV8*mEJ^< ziQ=5Pa@zN|)e>el{UmPdvWf~0Iq*BM%Zu!66<5Ek7YmUV`jz|8t#4uLJxlbz7qh*{ zkqGbF(1G24WXz;kafSU}Q-vs-2X%FF{KhaKe(l8Mj6wQpWJprye-#qjHP*SP!V^_B z*a}_S29p32pf9%+aTHZ4Lw{zN;~rc~&>oK+C_JO~>-VJsW#wr}3;su~LeCEYPwzP6 ztjK}%SE~*ArdKN=4d%*kuJ4yMFA|jnC>meeEx*m-SJo?#4ve(>Y#iCLzyp%Lgg;uy z%|_Yozo_#N)i?2GSc!#D^QD-ROn~fUO9o3?o1EXMG5?;<0eSdhVlHnk9o3IfMg;4X z9D#$qNDrxKrzB;O0M=2b2t>$36KqW;Qu9;w6Jzz0Ro(sOwU%g}L4NomVZ~s2|HZ%g z(^G3O2ap;ZvEkyUs_+H{-Xr5;boUUXT!qNfu z{X#$9_2bo#Nll1Iede3(^L}R$m8kFUd5>FqDae|6#E#oy7e^!4&=4bC&p6PVpXzgn z7+1T)n1T;STi?J~QnKi?zLH+XTPJsk7wZXNCa=1M!H++9rSo(4UwU3QzwF8ayWFQ8 zq;AsZ!qXx*FmgJ^rd*q}|AsKbuPGwXXFRn`BJK=`Bg63zMFg)Y`f6|LMKj0f$wJm= zvVzAlUx&U<7p2h;@eWtUdn^t%A-Q!-=Z-NGW#$)@UmMVhTMa>!oZJIEGA_u$E1`T_ z$A|IctVUD>T-zIV^t#}C=v)Fsiq;ARriK{QS$q{!{3I6A?JLBR`2rsU91WAnL=oH` zR9YjpJ`r*AVy&H(r+~88rx95YQ1?ZVw}Qk5Y_X4sTy6EroJ71I=e-Vfrs?>+PX(jp znz!1XMm;3L=R+}?GbTzjcsj;HkpAG?vY+`7&#nX(6`|Phvef2MUYYWRZq1A_HCn7H zizi{$JWeb4JQ=pT{?8N>ee@GfLbmIIutUPp)NS-O?QfK11m>8U4$o_ppy!QyjH)P1 z?;nKeg%JcX-vJf)x`L2d25HYUeyDLhT}9I{Fw=HUUZ;rErpW&L&kRrTOZhXkk&-hwH75E*T zt`9v6da4Y%QuIa9^&FHzLi`U)r6!su8rvbM*rt@p=%~;~zqK6CZ(y*$$I3}zs`b)2 z4jW@boH7pM$FD>jq=T-?XD0q`j~`xrZIV_=mwUc6d{Bw}8DLu$G`GL<%XUA8=obWD z#)|{A37al+J~ns1SI%8$wD?!?qNIKR(qkO2n$Cw+ZS8o)0q+;0&Ln0fq)shTpaEJ+ zK=&RAV?*Q#Ta;>mA4_TG89sd-2@IO-BqGasx8Zwr>0tbWqbf_pJ$PO`C2M{9r^qCiO^0jU?s_htDL za_zwv?=l2ZN5cSs!L1p0>Y55@LcHEN!Ju`uydB1a(BrwH?kG7C0&ktyQGwB*#+pXmi+|$^_Wo%I-V|M>=d@2iPj6 z4;!E2Ys9I&=h*6^ty=1>g+8baTfp86>o+b1+8e)Q(^-?TY(_vwBj^r)ADzD0?UGQi zC2GQdRn@la(s3I~ohl4(o{sDWIVvR+67_aD97{jt%TND~&FWfy97~Cdx#A0I9w(0c zn?n}~CRMID<6&3Rgo|oY)cq$)1@MuQ$&W~&v+UGcuwD6a8ebTOer^J%q#t((7iK zLU_Pa!cVDQtqHt}d89H=P5nZkbT5@h?j*8)usd-;b6Xe}WI>D+GTa%BMK$hexq>OJ2PFebeq*vu?~kCShiky> zQePPmqTj>*-Z8V0bU_}d7;WVtTg$dnD~D%|$dM#mkm9Zn% zx3om575?yVB!-IKIT}1H-~}M$0z#0onp$@Q{b%@ z$`g)Kdn76cl2S?IPUIQvohvQCbr`R(_4r6JyVw{Y3*5uyR?yhRcf%gRVomg4i*uX@n+`bGRB9&fXyS)ul%}@@LZa4GeCIQZs%B+Pb7masXCm8jqRT%4xq z5`-8Ov4@N^NUqbuGI~pn;t`qZ_hy^;L$%1&1!$S*P-B}jnu`m!^2+B!R!AE~*nOs| zrU1o9t7VV-LRICX`C#+6%XdsEt})+Pjr;eH0fg(E+U)AqNczZlP)}=dZgw#8`7VHj zn#7_&aq^uZt$+pzb%SI)MK40ft}dm0@(?LYYI5;1#19+kF+?G6Zid|Wc|+RZLmh5q ztDcm7k+Rpdg{X2_K4oCN;mH=G;VB44R;!G}U-_;zzO>O!qEq zHyRaIMsph0*d`azMrhn!`8O-wLFci8p*l`7903dC+cO>%C2e)uVggR@cT97|%#+`h zUy0_?<1H0QZo58&{680*h?tn#u3J4dsHs?QR^7U)r5Dfqr-*@*0)5bxd3`v;uuLtx z?H|pRoT4A&Y~bPWxy~nBpocHdm!iH$fWe*_d@jVr57p@tt&4e{la0i^0r*rQ&ATY53>ToB0t39=I|VT;p&iQ)-`g~ zj6N#D^9ho-4fN{7NprZlaIN~G3wyAQxrrk+eP#;DHix2ASrg1M!MxuzJSaK$ZdU0e z@*3gk)HT#Fn?IAUM!#5pd;B#W*X`#x_~la>d7FMkwL*yK8$PI|Uv7`daoAg$xQm%g zfG7oLNYktg>&{I+m$_@oeB!WJ81ERFSW@QGZ{iB)nmx?8LWNV+adBH6Nj|jNMoq~H zY=dWkNIVo_>QUOH{vOarQymh7QUT$DoIu**R~;aYS)ej;L=CY zO}qJCP$rF|Y%OOxql)6$@EGReHmJW;oZP9g1 zc1ONE4C$yVS;UYhPo5^JPVUW95?(=RFBLN&?`^$sZcwUgWL}+$Ozv7ngOG0cfri<| z-Dj6$aRqg0mGKzoHuku()&0lr1vCiP%{+$5SDPmvHmAI06g-`|i5E7D4R#yAO`>vx zA8&+;`}ZGe1u?}ZCv1hp;{zE6vIJ-DRB#+kdG?m`3VB}sJAsL}GIJM>?{Y;r?Ay`&QrwDI8~}YYytakz6nH}d{1|tEbxc()eK@JpV!a2@&CER7lkqNURhuYs$<7LbQ?cYNg!0732e_7E_lg81x;KS55|^D3F}B8 zy=S9Y2xedv&Qq&2Kwb&~3#0|Ix!K~R$JOwjwmI33re8BBo+|CP5J>p5ddiH@Gfrh+ zQneVP`ulIM6%gYRw_0x=k&}aPUgK0g6Mx4DD+Jo>5*7+LhT#fom60hXc~= z+zGnG?Dl&n(~U!R-F$%FSq19dH;kZQUIFE_>suI*8-g%6s^-jNf7#jWkVlJ#(GTj< zZ9C=w0$-6;THVcVH&BdezINUjkezCLqqm%iUBeBG3lKpg9ak5aE?{6?PZKKA*qLX9 zMxYR;Rf(}0%BvsPC=7fXNL;g<&Kvh%IYh1#_HxfW3lu5rL#~IlS~M-xmak@0(Tc1y zB<4mMp&cHS-lK8Pt4qmH)LHPg94(CB0a_&*`)3cxcRe@JUUbu8$n-|&R&BGUrUzH* zn_k}?%H?_(=)W@c%!s%i(0-s)ol6w#mV`!%52AsPrz0dbzZt>5;veFkzz;ndC&$Is z{SxVoy2Dsd>AWwpfHq^~>wV+pFCYGuIs?+nEj!d6KqId=tO)fQ-D8Y|nugqFOOyj{ z1ovCPc+%>zY8sPUlvQQQXUwEF&EW?l7VaeUn#>Ewm&7ab*Y7%&vOjJihRYGU-yuE1 zilGsmWF-KgoT1@ozK!A^0S`BVqb}onh)pQIJ7Gan?%D4UWEI#pE942;fY*@BS zATW5mg1dn{Q{ejo-Ztp#=1!J58HL6==ri|WC%&nVXIpYnpG$r@W_+t77>jEKyY51x zVAKG%5cNt0i0BD4;VR@`R148!{W57i-+<+NL?AXxNHKEBIWeB}L%{nM28)3s?$XH% zP}g7#FzE!6O~xYHd$(Ki9)4vi+Jf*l5{NRj-Afmz*VyP&2B_V?pDrjKrMMr&UI^PC zA;k1`+r0i({(@oIouFfxR#31;9)x@)@lne4hPA>yc8ld_V4rX$9;c*_M6Bmm&udqdfQQ&u7VXJ1(NAJ5L%9mY&ALHlheg!3v4g0ILME!+< zSoOztfu3QSVOIt_udNn2@`bmvQhdzXMyxREm0$%N&QHaune;v(Xo2VeV6c|vbSAdc zyi<%vz!&AIfjKwj1^(`$be!!74O#JeLUJ;c!|{UtU(gzOo-p!}*&(V-t88j~eKGNy z7IJq$_O_FoXac?j>eC|@`aG>5DLSga_Qy#F6Xzo)WU2b2zZne)S zON&fvlpKuwsfZF|TA-)IlXZKR=sL|l&2eq$n3C48!alL^+Fq)jiqnLUvyjewR^ybP zWk8rRHQmN@!J(>AcO5SDs}PeqL1Cs*?p!GWI-Xd12cK`bm(oq(?u+!sWNa{1p;qSt z+Ri0%M#&i5CwGa1LKmg_{ujMVGU1didr=H|OrR!B}cay9FEWnZt{p(8Kqwh?>YZr7^0u z+(~b?v`WjDB(f*Dzj$#_c2uFBFAd@b9?Uytt~LwG>?J%|g9|Dse|q68@OsAY6O`=; z+c|Z~OC3%wmG;z86P{%@IrTW6bG9}d0m$sx8x`NU_KnCP4RZH8={356sQ2X1d{lD% zUMkpIlk&x?aOK??rr0?r!UvjA*~~mxP1uXIxcZT*Mg9O|M2|k*)^q4G2t}^oSXT(w zhuHhcMLGIV%2`GQ8aRL>NS?S24x;PcUGrpK`8{DzI<)QU8KpzyTkI?Un03RMF$l1D>cXQjTb8c z!H%5<&P|RXgs`tPWY?19I1y+6Cfp%&Zoz6Vq84RLm18FBqWsMJs-#_Ru;6|`^5C;c zY_7}faGyU5zKz{*!4FBB7tNDBQ}wND^L9S?fve75tg9x80|x0_drDvI!@yd_U{<=bik*#)rU)tmpXn;X7O7Z)5u{K>wXqmS`kZaC z?;I!{T?+c9BI}41UIY}szk1VbchSd^kTF;d_tJH8DXP3kdq36w+n>Pu^x-vuHXh-& zo!ujMPwTZ*nqSAit)0!YVmdcO+-3@R^A;`a66+!eZDppS!


    -G) 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 diff --git a/website/assets/webApp/steps/step-build-de.png b/website/assets/webApp/steps/step-build-de.png deleted file mode 100644 index ed47c4c871c366248ed7e1f1262a7143069982d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43593 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

    9-Hg#ZyY(-Fts-L< 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 Ge$wt5 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⪙mGiP+LKFbkOM|V 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 K>J{uebouWG?e_5i diff --git a/website/assets/webApp/steps/step-build-fr.png b/website/assets/webApp/steps/step-build-fr.png deleted file mode 100644 index 45fd8fda10fa75a30da21ea7012e8d70f07972a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68091 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 _w`hQ$TU$kC31}hMRNgqHWtY#!jf89p-s520 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 P0-Kvy9e8T=)0KY$QLH&A diff --git a/website/assets/webApp/steps/step-build-pt.png b/website/assets/webApp/steps/step-build-pt.png deleted file mode 100644 index e851751481361c8fbc125a6f142a0e26e9735631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67408 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

    $%RYz-$OFznitVVx5$e)@ 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 diff --git a/website/assets/webApp/steps/step-code-de.png b/website/assets/webApp/steps/step-code-de.png deleted file mode 100644 index 509f2cd1b8a9e69eeb35edbd7c6a0e0f5e899495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64486 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 E@6~${NB{r; diff --git a/website/assets/webApp/steps/step-code-es.png b/website/assets/webApp/steps/step-code-es.png deleted file mode 100644 index 76c015e97a08acc82d02495b09d1e575cd3ff7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65161 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 E@6~${NB{r; diff --git a/website/assets/webApp/steps/step-code-fr.png b/website/assets/webApp/steps/step-code-fr.png deleted file mode 100644 index 76c015e97a08acc82d02495b09d1e575cd3ff7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65161 zcmb^ZWmr~S*98opH0nvHh=8Dgq*5Z?As`?rQX(Y{(%k}r0t%AS-CY9GBGS^*-QCjg zPOkg7uRngzcf8MYy!_gpc<#N{+H=i0<``q~L0(n@=PJon1OkC0`Sgh*0)e)KK%lZ< zqrxZAqrb%vh;w<#C&EgOBWvS!t^|XGSX+;anYMk zp48toNp*W>V`BqF*9W_2py#0Zozp0lPdDM!;L)He=ojIeS!zUBmTa? zbhsP?{OYd@mWuoT`PJVS4P^fruFroj{u=lHX#)QpuE<{(e~`{J(&{5|e}Kl$%^|2yt~FaCN1e+SIJpZs^Y|Bn0Li~r38 z{u=lHpN0RQC-B#}|4)(gKTqKA_5Syh|IGyc7YqM?n!x{N;s56e{JYG5U;KYEfhECr zZg*~`(fOaYvmo$s)3p^N5p!CXnZj);v)oFa7M`>xQ2$THna8!rX?hi*fA3yG zTlm9(#F&_@IQ1cJ@_;F=&`-V%?;HERoFx}1Ie*@;(jgL&SVQg?qaD}#1>Onlded4dI^ujOyaH5gWP?8a(9K;=4Vsj{qW> z&P)2^KVSMgGXDMKe+-c%Jd%LR3N^tmi5ZQGs35~T*=$T7#XlzvS*!n0VQxKJ6cK^J zyZ?MWlZm41W-NpBba(#66#}uxNJebbe1DB^ZuAlQY$SPpe#2%Q#%w0Yje8ude>i0N z?j4UW>#IfRADz{`%%JnvOSSRU5!kc)bbc*sysfdTS$moLy&G;KW+KYg>lhcjEpo4f zgmSIKVJdkB&GldFE$jJjI9`f~C^mS#b$r^E_cCe`!>{rB?MVFFkxTRQ8;gt5eHIQc zUt4+v5cxXw$$3&q5{T7UT#ri5JaEkrHD_4)_FdAe*^Szn`Cwn@xh3ay=Ul&lAQYu~ z5}_~@y?TQojhg8Oz5eA+9{zm)3uJWq%xr>-W5slK%l?(~qusf~!zTevBt%~}^EhhY zDK8g?Ntj#Yl_SC6{B;8ca=1 z-K@LN{AY*VX3|h45ZkGtzIbqu?{LOWLqo&I$7eB7O+i7i<^NlEa4c3oWhdvZt=p3$ z_TA7|hR>Wvx|2ll?($W8K#zakUG`YtxHZl?oRC_>+wMo1w{ap)|1x8Ye`NO>ZiR0tI-#vrjx z97;^5LCG+>FuvI5ur=wBCl3xE>lx`^B@ol!_#{fG6}8J?82*gAgh2({_~#HLAWsxD z*u?#LFUyBZ41h$otq{tI}cR_sfLz zu4ZLrnVXw4w14}W`|yGl`MOM<-oJNsUoHMmbr1Iq#OYQe9)iWVH&r1;{ByJEVE%Zm z+X==sLL@Qk+*z)G$b}l`jP?;m;sCjhi3E1iSooP9F_G^T?5%(gP7BM+`2!~B+YSwc z2j$jn7zn^HC1V|=$~BSw7U?&_!9pAEsf|J$=yHiuH9BIH?MKro~fv)fFb?Pe^muTye}SD zsLDV^xXX9ZBXO_HbdZUWQO4=$!%bTCG81;UV_ViNczl`J@Xq1(EF`!$6V*=ZBV|}f zBK+I8B^3H|)k;===e?}5Ux!D%s&Nk2;34n(tgn{Q_h$TCnXose-Ae!RaLHmkzsu7K z6~z+>Sn)ujo|^LECj)6+D%$nQf}+H^Rtrz^=TOV7jBz{sRnN`g;G@pFLD@8XmaM<++2UZ zQg27lJ?XvpAve5uTC}`>N>C+p6&k|P`P*ZpXvmNt?#r=BLdlRn>!S|yZQ&5=s6y7( zJLxhpQjtt<%e`r5CkHOh&NS52Fs=Qb6bV0EGE`6LNG7o-Pvi;q*M>{_`}lqwh0gmpM-U0&`oqh%4+@-554Ryx z5&ItPv@@ejLH&i*(sBv&mg`lZDlDXhjm3?anb&bmbq1b1gFI5hkU*C-WnW%A@n3xa{5P*U4 zT29r&6c)P@x{7l<4Mt0iZ#J?-GHca3ZYP(QmpAFQ7Jf5|{uC5s(Vh5q+`Ow=0HUhM zWFVWN>gS*3K8d4YBR16fpC9jF2)85%)@5WYo(#tjo*AxJ;t_C^-}jNvH{iI_*UL~_ zD?l_RNR_JbBux|z8mIUcYeIummznL&#_RyJwhVrZro$T zUrRkHg6D^`Su12P`|IVk+EAVx>RJ=HmPe z!d|o1)d^6J+sU7Bst*M9Yop~BP%>ckWMyQ|<|DOgFV0V3YrOOIU1$w$p0-4i@$A83 zdSl_;0 z8A|i{8aDB_R^?226io%}AG>@}{Sa&$lXV`O6E$hlkXA#fzO&S&L1aiG^;J1avjdE?4sHkph2{OppPl?SKFjCw4@W$JOU zvBw{e>du{E;*b|s_MH{E@_US0 zG6U2|$&A(UeRP}rJHI^gM&G{Yacb2S&kq&ry}v(Y=q+>#(E|CML`6H%Zy&#!4Hvtg z9pn0?Ky;Gv+Vi>mF-sBu2unL_$>mQ#-wXTnp-MiVshn32QPtfoZ)PsB8S})HNrUdgnsp&> zs~_{Ok+u|bE~mdKv8LC_^ue3B+1qVdGZM(BT<)#&P9?avYwcc7T8fm$9b z;C2jiLRikX-9i+OuBS)@(P-UJi%1akVDg_?A1%ia?lxj0ZH{`D&gZlftYcZs_u8H( z4r+h{Pn?ufjdl8Ue0=##`J}a&_dh?8jl$c7oIc+k3B}@gW4sD-RMW4lr5ehX%Jn~) z1VV|oTUei@&n%o3T9F={9@&ITiT$a65Z-3S@o+Y9p3hp}k)~_+!-o%0*3@vHdQPAy z5Zt_R!Y#;G2mygoqGFmhHX32#86ukuZtIWP&WxvMBtr6TDbgzUV1~QGt?%Rf`a{>3xu(tyj zy^<3FzppFa72TLV<~00}s#!IjADHp0*i2WKQcQs+^a|qXy>8g@Oj@;L)0V-ma(!%0 zNe$Xi^@kJoLxz8^?n4QdmX)>VzmsIFPS6A!QtwD4qc18x{ufK2pC4AUmEOQRA0IZ8 z{-y2NW|e%6D>yhW@*j}}n6Bk#@Q?~vXsqyUBSiH!ei8*2GD!joIU+X9Ge-p1#WR@yDkeEIhSTEg&!`2|%*mqH zE>Wy$;mg;&p7tq4>;~%ugnqnB`1^y-(APIF8{5wU+v4{UuVUBfPtExh@uQVp+rIZx(LFFrh1#)-CsvMa0R;>5Z7grIMb1k0%9zCoY zxh&De8d-|e2s)K~QkgzZ^D!2Zk9Y6h{U@fNHaqRiy;Yf%dmw6gu(P9H?YM24u<*?g zK9vk0WHgF~{OyyFkWei6&E+7UN^&m1AKy8L3&k<=^DE=4=ywokB#cj4w>S`lbhlb| z0>quwj(1gmu(nVlFbK{lf7dxy;y$^8e#i4F9U*UBtsT|fGLwOw*&r8sJo~kwB%8(j zzKkx_B3-8lEE?*r&qHqlCC-5|yJF-eZ>*z~JE*^s9 zW4i0nj$Aw+F(Aeu!SkiX#d3fgfa@O0wOCUYxcLz90v!0Nl%=Tm{!7$jLrCL2&CPzc z2uAf%BM6qkTs1%{3Cy*Jlyr1-0s`k%o3*0=UB5hfP4n!Fkh)q}+2=DS5n08mV#6!A zxExW>R0=f7p!&VPem_wBwVBx(y!#+BUcmLk5Kt{_TzDc&37;^wE-W&TA&56^q5;YB zzwS9+|HS93e|u`%2I1-aPFwqys@pC53Cw7e57o-P_hLje9|sB`tXj$Yx{D}%2;cQO z)i*RwTdLY$PY%(1;<5K9n6Rz1l#MkEwULED4C1N+FvsGrI5{~vk3S6N3ms9g!A*Np zi+c5B75e>eJv1Nxc6N3!`DU!b_+Vq4C(eBKr%WW%t855SRaIKa5HW@RW!rM|allDO zv&}&t#a{y+xWjI;G;;Okty^c%WKLE)1!`dWDs1D;N6d_(ShY=!`7#Vtt~CsCBu0-jhK+FyO(Vdg+@IyTU%R? zUe{XL*gPj0Nl8vN_!aviO)4DrY-rBI7>+jrb}LGHdSMwE5&$>gp#{o0TDY&sbXcR{ zmo)9god)+?Yn^txA&~}Kv4?4t+ARJO^}}uc@#9P90tvf`?Q*YL!C)vS^~-9*uDjO= z834Ix)VaF>LbLwb?Kb zUhCRT)yiUMzwEA5^2aU#762dUpaH|*Z=8Q%oztJ1N;SwSB`dq&GyyrfpaFsmmz2vA zx)8|RsGdPVT~IRs$LDC=Z{JEsXqTy%xKgpRhd+BPAP~QJ^cD^46Y=AP-7Z0uEG0lI z@J=_zDgk`Y`MB)NwJInmUXB_`6!z{CI0>w_(9j^Qy6F0YrT#*A{F27w7IW zB%3B~kS;|7W?Z{aFxFZ%1}g>QgPKJf`Lo@?oWPJHmTuhA9NM36>H#|0$&!D3m zLV}G5SyTk^7?5Jj!^pV5JxdE8dPSn$h4xSvO26JvDKI9RqYm1QzWWdk6toE7`Je?I zgnbX)z#A5#2&PwGU61_Jq;LEAa@?02D%Q`Tk_5=XZ8h^mTU+~CM<3*Qi6>7wVmKqm z((aVF{K89zx}Q@Z&Zt?<1+)mXVpRZxH|s38ocD&Roovd~ahk23XUJwjV+M6BtfJ24 zARZD*u4WA;qPMqK;uGo7YQaNb0Uju(E;R*2Lig0w_eBzvLh&UhB3Tx!%492~s6$b9-|bOl;yMhz~lJmrAo3b&I_nVFdo z>||V)-Hna+`T21WcLk7I)s6~&xa*RZli%!O`j%aHsB{4#K?eTx>62!i``P&!7VOjM z`T6h&gAecD6QIAHtyo$j+R5@2oZKVx=CxKUVHkzX2U!&p0|Uh~Az|{imTQu24(+`S z$R&8htf|n4&4m)+;}^OdY-o9$?e}LrzvQxteWdC4A(amWQ;4>O(Wk6wqL4E%yaL^ykS^GXE*Q&K$=kH3+l_3@9}97qOW0w4g}=QK&&raQkYm#4H+7<(X2mVE zQp_jB(YH|$UmOTy3F)4rV=BMh?di558*{-Ws2|+dQGC9niJN{G-52G$%HAm6h8{kK z^^+;CjkfTdqus?mlQL-5`Ca~~maUY-l7=&=g%C(?j#n`=GG3CDY%)Q_kH5Wc{_`SR zX?3)`tNEVC+P4$|2tU}J(5GKPz_iy!%0{8!!V&{0Y0^EK31EKxIsvkOiT%1dVr#B7 zG)Q3OXgMQ+jISbrR1^*M^k7p^zRVOv8AuFtz$tJzkq=drLsFrGKHqNsQ}ntHNCzt;qY`MK z{d|0aXXw&c-Jv#x(q8Zxbtkrl(wdf$NQNwQ#&DVqZ9yO6zTIRgjDLEz8!PCcS-`3B z&6a|NCAgznIftF3lj>VbaV%}nWP`U~b#*liQdoetJ%aIMt)z=qHkR%6&r%2-Hq+m! z;vb`(b`C9uiZQdv-D3I_~+^J7~(8xry8TbCM8(i4j6m;HO z>bS=o(gU3qKO_$1&E>v~AnR56kfhbYf&zkyoB0JM(B6Xf(AqWEw|RWp5hPEL7M68% zbd;x7A|4fHE$kVqojI@qM8LP-rSutJ4N9Eg3l_7cq7x&NlODh#5TEs56Mpyv`dC*Wujeo z=CTspqo<&OZMRlc%{bbEGJlf76?~{b!w*^8S5EUH3y4fFH9!4U*e2gg;c_aX)>(WBpNl zJWYBLXxOn@w-_Z(Vx%u*f4LZr*G>Lf0Q43Y3~;Z|_ovIOPSgm}ps8bf6`BlKH2L33 zV4XMYt^LK)0m$a;bSDgU<&Qf#1BCeaEN?~#92^|xnPlfg(+K3Z`Iy^xetekq_VQ{m z)&rsgc2*(eIp(@kN{b1Eb(1GDL1u)y$mT&C?vW#XITj@~Y5tjU3pr!k(!)99{CD0_ zp>)fpo9YkcCf?}~QHzEKafvBN9hmIARX*0Js?A~@HoL1p=;Ml_8qqm6pU{!l`!JRv zw^vj{&9#{0eETu=U{#j>()uU-V+m0dfc70O9Id}6tVw|r=Dg!k6z#%*c&ldJRp1YEY zodG-h{QMl)Ns7&OD^~!akioOu!}PfUi!ii@gvf?X_w$@s1Ssd=T)84CEnVet;VvSg z`{c3g}6hxSfReaV53_gnRqylurL`6l#&3!c8xCMpe z{rmT5Sh(3r4+5H!eegLs%eQAeNVy6xphbs3b6*?U{(Qe~q}r){q^xefGX@g!I@AjQ zg!lEgsf;s~vZ3{tdYwj&t*NOA9+Ww>VEqfu_{H7%cCBx=#y1qug;R|)RSG7OL?!MD zx`%OEcHRjOD1dU0a z-57&-Ghd0YWxB?nb=lN09o4HZ4NDF$%9 z)r8-kd^8A8C0>mW7DqeN4pT`E zi4cg8HKMj@6`{{-yToNZ*8;%f zMS2=Fg4Hye?8zdJx`Yq=bo@ZmgctiNkJLkQ6X$+0S6lw_xG}`-s;m3B`70M z>DI?8bL0{xlIc!CvW6D+foAm=DoLd1=sK{}hGs*B!UWX9_^4>`vuj$WJ}4a9Y6~xG z5TG}_%kpb{a*?L)n))ut4&JY@o}Ey6W26?r&o`!lnM|?& z*oo`c=h#@&uBAfB9sY5b^D~3xatHpUGM7bCT{J zq3rGtz|GPNmhi`%O0v-ZGJ%@QhaAUDGZ2lxmo$oLxg``@Mc*n^w6#i&@U*8ETEtzK z{yv~uL2{*(1Rd8`*-uhtx)KM|!uLiA`IN*`4F>v^Ez>h|`y|q4NWpe}={Nw+&(99* zW`CZk<|ua}ML9X%jQnVC2ma&@ff)33MIfw%KX`$Th(7Ndx3rGW{wR*twF^2#+Z4{+ zN`8~>Bci<_{7@S`j9*_Kl?c7{f*$Zb+G1$N8P#D{a4@eiK{x`tSKiNBmOkC$1wP5 zb&2RbKzNqlEoHzSqTe6)71Te)2^rAXba_>%E&q{ZfJvjm5t`ULoaVMG{R;FwN^@H` z9y+}Mk|Iua5mYwgXd2O?&$wZqKYxZE#P!8Go%1d426Ajy6O#vO2?SzkX=&Sh5-aUu z3VhacM(?i9M>4)tEYRdH8Ac-DI~*~c`%*3^f8MA?jMrV%Pd7^JIinG0e9~8oUj!ys zIYoRQyL7{qDh$fc*_d|4`at2JwcxV=~ddVK{>P^olhEjzMW-8P`5wKY}y>aW7jAndv zG*s~?DLq7lgyQiR*=>qz?O|%L`}|SnP6Hr0&ODzmaS@e=p2eCs%vV1!oDZy z{!HYJh{$)JD>qwZil_9Ol;q{*OAKUGa#gL4_o9^Z)Iod+4en$KjEo#CF|>O0NUpUV zAhS$7Uy~7ANI@nTC!(GKri)=W7TK+G9PW-QKDMwOJmFN!i%9T@pRweEc}k^?fH()$?h-9wdSfC&Tf@G5 z5n{sDzO;!XU0emH$J>@gmUZ;NJUkWO`sJrvkA<%@S0rFx>#8N%(I0=Y^zu4~?YmdE z$cItGuX_5TDERQD-xga5L57jokNIxi5h|f9oTqsrh$V$XfI8is)6g)Qy^=56 z9VL1M5`%63;vZJlscPJ$WVjgb03i<{>EUq!GN|q51S1ud&ku$We=o1AN_pz~zjM_< za4pcPn*fC_PWG3sWXb4yeqWI)190$jhR~%0CG57R5CrIdpg=29M+s^=4xR^_-AWiJ zN+EBtKuHe?4SnSuNsdiVFFD+`?y=DkovyEzuTizzrDi&uJj{SK3Eb)Y7DT=3af-RI!= z^E)pF8eeH#|(*m%cZKl zE$dcv{?!9moy?pX}`)CCSX1e{E7BB;n8#nk&e?J3K zjai}@4S$C;Ixybx2Mcmp#XGWWYiM^0t-Uu!wu?m*|^?B zVKnO3pypFCGR7%Q1xt*LjeT>tct19K<(lz1!J4YU&p=}^AWQ%g1Dd3(t1Eno)p3iQ z)hB?VJx{$%{hMu1vHn9SFZca*gYModdoyaVHna&sJPs4t05o2}sglRZsw9ax4gNfY zJZ42&2Td=O!Yf`}+Cp`(qdZR59p>Cwiy2N14|BEZF7^Nm6WpTU?6SZ!mqob>f3A8Zlfc}YYw((Nq(9+U9p*3~$h#N$~N7 z?p{alF=G1_chU~bE)crn3bxQ>*PZUPL;j&pF+!4Z$>aL~na~6XCpP#_ZJx#K_qS4M zH_#z;3@-f(qwB+a3_x+^3@B$QUK#@cEC=}ee=i^vQTytXrIZbPN@vt#ECj5<^IX+O zpuf!P>k8xB^1L!KS_1W1Qj#*i{=g`KccD=W9Wi{R-b?seHFhkH5C*{s<%{P8EwTu9 zA|>*+sX`PMgdR3YoOBL1hBg*H3L7H(LQqyy)>x>^i|%bBZasnvWl6B^R5V4`Q_g$e zEzyP;pGsTs^!Sr(-1qN|_u{y1)Ke5L&=!4|(Y`TA7c=y+q1`(qV`}ZlNKFOJ@6}hc z4<4q%EqR@fbLSW?jyY-L=YLZf>gV6@sWe*>v^n z2!uKsDyx4ynGY$&RV-XQ6PF&z#n7A`6VT%oeOEX13Pl#Dl__ ztsQ!YPw5UyTghG$URryTI6Kg9$Rh}LXBGpo?14o0gWHC#6`uL zMTM}};5`qsi{%VSx%ek+Z$?UiA5qgRrR7vmG`Bd)9{r-{_(al?nDQhi{^F|z-cHi< z8|yj0?R|9yA7|_$9b8;fA|EE8%p0psoQpZhF4P$uxrXe78;_WA!YW6*Cgmn^NXGTG%MEmuzT5%UtG?CF>)qtjJm z(TQNsYuZ;env_*m#Z3JCF_}W*pcY|OZ|qb2q?SbQJ=>nJDJkl$tKa7(>WzedM1vi* zP3-9vH8Znn&4T+ig<|7Hh}LEEAo{P%#Wo@cCSVUSA2i$E;pEK-q-#nDk&tg(beGC(^_-xQqCSC_c>? z#k+KV3f<=wQ&?V(c>mr=Q1D*KFje~&hqG6;1mlLWu`&30esl)Oa}0h^2?ehKOQ;H zEk&~W*>2&=>oRYDh<188*AVNy{VDzMB1uN>`3-x$)*96aNSnY^x#mnZd~BU4m?pO> z<@G84v0E*bHp7LhB4+-*o4lPI?MqpAC0l-whI=t40%49YzgxkI-5dML_i+lMYzmI zd=U?_yALn@(*Hk>addm2|Gtc27jQ@_gi%RGP!Vs6`{9dhGWsVQMJF5k>rCudT)#A# zFKN+W-{=ZRrVFWHnmuHNn68y@*zu?bqj6K=ril;AKXGm$ZvW}#6NM0cdG$ARS1k{( z``|lYw6bnh(_vFKcAK!D;Lh;=^T4`@5i(p&{M1ODODKWmyH@k+VDa)fbmh}dJ?4vg z#G5VN_#%}Qwe7`bfsGXJXI`2)G+$15GmOEzv0=92 z5jI8GorA67#)i5YGQP`g@0{VNi7$5Lp&l5!50dEc#g^A^b!cDS%t0bTKmIm-;5vNA zw1l^5cjo1{T>pQv4w*t2^_76juW*Kf_4m=`5@FpNqt>_rtLWl_+^`_Crx68zIUKUt zvsho>{*~n+H8)HUFBS5nkL@V(R4V>LXCOO-+U;Ud4IJPhbpFZ4Bsp&t%)RVj>HfKe zhqP=mg-o9pc_Bm2Y4pp;JvXkhL}PWe#T=F`uVz|t;_l&!+oYmZlQVClQr&PG0vhgE^~Kskrlw^ioo(1NMI?$a7$ z>n|+=F=6~IDs+myKXcy|iEmK9Leu{f1b$xS9D09UEik?jh=GIG=XIVk$P2CkO}cC( zD4yxYV0Y4-iB4)Q@FIVooY`YEH84+^|G1F_DcMEbrc&JTBP!DC*;}92JKhZKda|Ur ze#$v^9}o2;!_{7B&hR9p&c~dt*z&NG;54%2%UQm1xjajdmy5MyZT+>cKuZvMphvHN zD&?wveukns9v4}?TZnJTZN zQaNY5%v1#cM>MB}fbNg?V0nGGEBT4Dr>Ey8%`?!_MdNtvKu@;==MXg$EiEnh<_||L z>OOw_7ze5_^nxmR>S-NGrcbnqF7;X1zbg=S;5Kb(6uNkicKCu9^Ue>0lhlPOr?&lQ~xGTy;zK@RBt-wSmTJ`rv2XTLBd!}U|o`x$pj zWa&){KjQ|~bynm}GO`-ormF~Gi#1_W>Zxf0$pKzA6ml-E3a~IB3c*GNV(TpgI4)Db zn-i95{0;suul*YNO+MSDZV+1FpLqi&Z#YK5g^ZF2Jx_wid8MhIiqvyx(K%pW=)2?I z6Q~C53-ooRY$bXd-ffV(!PZ6ZKLfq-rFIh%bFe;YSf<__NQ?$9%uBb_^z<||=hv=Y zrED$%AKJz7Y5|Pxc&|^+I2u&QrR*0upbdZzAtWRO1aAm-p-;rnan}H`0_q~9S10Ir zKoB8DV$PT9fGGu{la1sfX*1a1Jm4e)ycW~nxx{L3Va?aOlNw=6u$hO=1VAZ-n}gqm z#d*&tIz3N$6}l%hR8)v|>y>``GWGFP$(t=~sWgo&Im&q>;4kvRxb_<;3z$0)JZ?wx zkP z)NG9um?*v{Fu(bHbGEd!U$aIaTfJ-qgdR8(glwEU9Sy7G3reR)wC#_L?vu5i1}_^r zGRpMj+emBPxpfOXbhyK~B{7vrRJ&T?A0B2M=a~}}$EX+UO~ahP0Pws}d#l8-=+fae zQhF3f{MgOa)iK^7PHs&v2>%#s%P za}lsHOv*=FypP6eJ}jTgQ}g6|+<$z%5`39rUGV1mt7zt0L+_;0J@MZ2au>bW)Fz zMvi>HN!cpjKd$QoFvEjP2sjxsIVKhs$bL3(2k5__J$uFnu8OBmTP_t+Qtlb&destx z&SbFws27l%IKh_=?mf_Lz;OATK)*~K@+6?ib%-Q!5OjY0AO&JZtJYNz&Q-uITIv0v znFj*F#AF2seQ1^+J8o$^s=3Uzfoj?kOaXCxS=%9jRD%r!asn{_8zA1Pea+!_J0?Kv zEOeT(Mzs`0kvc#CGPJW+x_kNY?D3D6g`i+DlA#^$4_+$PWjh|S;mGJ`&WZt|pG0pe#`KOq)n==892v#kAQ0Q-o6LR@!}#(XTqwQq{8gZUf(( z;3~e2o&?82K}FKd(8Q1EO8oIoi9YgnX~yVKs%=hX+t zbD?sWNFwrfYdA>&A$OTnAZ}wID~u@w;3)-KE~~3;XUt;UxZK z4@OM{Pz?TBDwnZREY$=y8b(S=kvwqku1rl$f&C=(r3-)&#jLyhSAzlrbCt4oLTQ7* zsU+QJ+ZkQv<>dv?LOl=co4*?U@G#yQ643|qW6A;M6v~vqWWqc#i*uO&uyo_MG0KnPG(gAFgu5NO`ZDxgh4W~Ti zlW$fXGbpCe);-4LPbr2X^Y}1J z{PK9|XELxFuI__~UjgD4tO_I;_w!RHwTL@xMwS2=K)xNXap9zu-yoCq>0i)PbCs|U4dq}(E5 zdP?|QsYq9hwJSBjv?p2Y{{8zmZ{D0V%DU7dl2k&dYBc2(z+;$k7}8@Drax?6UR9ea z7C_k61M(%CQTG&pH%^O*HKTT+qz(pt64qys=NG)El zVv#+!1I9am`TJ1C5tq^gpv4Z;@Vyl3v#S~^x1Az87>}{fB)qEB^LVW1wjvl~22A$B z4n!++d{ojUP^M~@`UCv&e09ICvhW`W1ymT-d?1>CzclDSU3GoHuJWVx3b z)MxOiZH)5@UhqXNIz{Ny$i{}z%H54$EHRFvp~cj4eZJq&03fr49 zyhE|4g|{I^Xx5Y51e7hnBZvtm&FZHLN|4t;E#3qa0w_H!j6iX3xYYPL*qnQe(1lru zkb05PM<#1Isp;tf{7D^V9HQx0l`JeQ5Ko^yqiRQGUR4I|8WW*MQ}mSJY_OZ{ zO*ya2{>pfc$|jr;q>&*pIM)P03}EO(6(&a2!b~{zeQ7|P3l)B-a?Ydk-7#li0-gho znbfp2@I-tA2Nck>a=1=T5plhGbFz2RLrsxPcTJudsSu?_xqadC_!NKv>Up2mRIU%7O;lL%)6;WP&a|e>+;MYr1M%W2lc-sik}ZIYh0Z%5QTgHA`IKOC z*)a=Z9Dvd3`0x;1BBW5X8oaTJ86fw82iyn{2OOfKWvl>y9KA+Gp=qkJ$aIXjXvy$1 z+%!Pcr*IA&4vROk0CLDv23rCu#?|`v>vu|Gb-;kkET7>DEA;+S zGBR+qKP(~S>lOeaxhPg@=p>ZdLY||t$|JeOS_OncsYif+1pEbY1T>**3}khE)q#9~ zL7;Oc06GI_AAsHv3RYrYiuFC%SU;vdoyX{@aS$QZ^Jv)F+1rbTjHAD*Gr~K_dyx}8 z&QxkPd_1V763g%6o2<$9psF$pIQskPF`YF2il414Y?Ifq9w4Aq1 zTlQzasM4xC=VL}kKXlz6Sc3Cnn?przb1lqHn#c2z!?m^Up!Di;tWsYA;|2izemEKT z{{0uw53i!i{T6a|c0N1CsXa1a>yi$k!azsgs;;+k<#0jzdjaBXX?c&l#ZDjwOI=#3 z6rIkxhxV)b3!97$DZH^kFtGM7@731U0_eYY=T zI6FE*f(Oem4z$ak0s^ifkw{!z1GV4UEC4k8`k!$cb$cSq&N(M#Bjzc^{K3p3At3>s zW~i4V0!*BMFhM7~f<&HPqeX+GRoX01LkMo&dQoYuACe8nHs#LuIGIb}j87^+QY!Ro zUY5|RszpeL(V-ybCbzaMJ^uOGagARL4GC#+c3CeDZUyF~>9&@SpP%2mcQ|0V1z(`-Q)x2yT@9MdvDEnAH0>g!72g_2n2tK-n zMZ))Y0bA92<)d~yaX~?wur1?c4e!9CTiFa>;S@TpZoNss$+{}s*`Z1k9S&+?E1>a14ibt)uV$m>> zB&>S!5pq*pt-4kQS|PH3UYV2~XC%-FdYtpo&^XVxY1N&W=MJwaLrwB)6!vYfc`Fv z)`dXR6fSxm6>&E2NIT{^ZsLvKsmeK6I3#AXKT z2vFh$IBOtJ;`+UYTn|v|7tnY{MwwKSm(zGzz5)CE@-`eFutX95A8?_3IDEgF4n&*4mM z&cMt_L6|ovJu+t10X}A>>0x7`~lW5%aaE$z8mCt(arWMOA#X))87lu ze6d+ffWamqM`bc1$>st5!|!oKBG}$8Kkt(w!1fh~G{;8hB@%)BTWLKHz54s)rOi#P zBoT}>#3Qg2;QPSgi8KnIS+3rsKHZ{Vq7_Rn1UW!Pz3v}Bo(SW&6d+i@7zSU2ooom@ z{0@g1IbQa_3jOnR2%W}#bWgC0dy(rA(Nj}Xi{YcQR`@ftdt>4Nm2i#tw=Z&PtCcnZ zq+aIj?QK0`M#2DcY%q&Qd9B{pQ){`e$Bz&a5%D6&<_CIW^lM&F5Zm)7pQ0xCz#X7-&%-2-7n%F5e-5dc7A^w6rhteygyPe0Bm8_$B*fT|tSp zW)_qfNF@n_1|{$Zs#LB5p+?cXlFI<#tM#; zwO;M!{NmMV@I0D|N>WN%dUtCpk#3~3Qzj%86mw{B9MghuhI77j8l;J9Mdj6DIu&gQB4p+-x}a3r1*uOKmL^ z6aV2g8f-7?5|fYO)a}~kyjy+mA)9WDl!~GW0eK)1NVGlIdUGCE7|{)INpq2mq(nqRK=COM0EKfE0nPKNI^aSCOVl&q5dwmOnBmOa zaK`HXF`x%H$mj~d6k-rsaNs+@yqODBxv#x$@l9sM)TgSdMD*kekYvDkTb)`e{?EkU z0L28P6a3)>u-Su`L+vxA*v!n#_`ZAhS>kC5ms2XVbaRYA zir*k3I~!2ZdI8POpS59l?28=b%cBMmO0DE9Ayi;Y*?I8Za7Q2{Ep zFvdQkxy;l3ChWxMG^-@Q0ld5cyWR zpYgQ!BEn=dDxLSu0UJPH$4(NFo;A}X4SxjX@Z{t%vU4}JH9|)TWJ%s}S z;acNkV;Ua&+uOj)X|a;sX1_dE&*#X}wVNG@7O0=UL0+PgAxlPG_Ry~!DCeqQcb1=z zLWUpQ{^fCT<}l9(6WT9dII^v6f8_!YFKeBYGLV9ioEq5|h zX}K>fI$-}Ij`$qNE@{paqqFe1{b>D_Mg~p0HDvauVpXQ2MCtZE4RHj^J#3<0RjZQB z?Zx>)6~9Y**ch?BA|qc;e;1RD=d;^gr~%-4!M#(v!S(qCHN}yXfAZ4m>PR~n@`XX$4Hb4trotZ};CHn2$Wyo50nU`^qoUGJ_TbPL5Bzl@^+8JzJb#l*_Wz;l zy~DBY-}vFHLQ7Ifh*0*3WY1L8MTn#>iRdDvLb68^LS)O98ImF)vn1JBNfKpekI4SL zuKWA@<9VLrc0mx8YXGh>Jk8FuH_-MWu&iQt(mpx^0qOFH|4eN)bcP z@vMa$seuPXLtDH?Mwqew1?f0IsHn(Dbh+Q8dR@0*Op;JkG^BUjOO5szHo7e>@5T*N zDJD0j8Pfp9Mprkt4$H=7C9NEtw7Q$V0vUW~&z^-3;9~i+2OQwmuH-Nh=&62^#TLh; z`cOS#+yI<(|9&anT*R@+)yQnB9JS-&`WUu$16s{uEpMTEKfmp%^xBbWBO}joL})w} zb;rPsP9OE>Zo|_%^-;Ok@@33pUS7&wheB5A)^{Y-NbMKYlNS^Fv%coy=}8UotH#1t z25QZWwWT?#gyCLsTDf>l-&0LPFy0VMSF%s7sp0>aUm1?m((?8wb{s!*8UCgr< zKFXDGn!Y`^JIDUgR&D-C#lrdUy+XZSGVPO6fz4*_Jhi=eBG;F*zNv|o*}e^KEH#zk zB{hjgC(ZJ9c3orQxx4svoLxITC3RY;yE>x0I5_i{{9MdZO-RICmeZ+`3a@0ojIiB1 zcCg6K9}i_fXUDNElxs%bsL0wlVc6*qdWowqF3(g}as>5T#0)vP<6*p@qZ95-EB1;A z@B*IF)xP&zT1$9PQFB?+Ki#8|4#Er?R7=*OdAwuWw#)DANdLh|3C5QbD9F+QrptXW zH-b;a>$>^=r@&aBhYWAKmr!6akxENTf4e=5rUhoD110hJtwAR>MTsQ#G`ToAfm_Jh zv0orPEe%#y&*3Hbf?)7qEE#+yezlT#kCeGpsfmoScd@^nes*@ES`317a{M>Fsm2Dgrr_0g6liW2%@*db zG=@Ju?wI^pb~C?A_THc0LuO~S3XQK*og5K4bl|6ITKxY<%ys&*Hba5_Eig$?2?xWI z|NJ@M53X&ds(*4R9mb6&RzlI;VNGa-VULOQ_4t1%xxn)U#*Zk3B&?gc?IRL>^y$tea!9W%#js$Z|VO$SZ%HN}pqX!G-LB(h}gCTiLXOlj72>s-hY*AO)2mFx~! zvXPCqFFD&rtD?;q5NJRQGnL`4R`Z`nC!_h6PdPG~ujFc-=pAv5jEpP9v7)M(-}dw` zMes$Eu}`bGm$%mD#YL)`Jx=HAlh!O|emhGQp~kjvUv}ph&F=M&ot=W*)&8A(_xu+R z$=7MND1~|WqWJ2~U1iZ)1hIzQ%$YO>YK2!XNM!zLnw}&@PMaQ|tMkfzci`idKlkQT z1$pQGr17aSIPKp31RhR{g75QoTXA;$FM)ByjjO&=RH#17z}Fx8hzgqeacBdc6~^=o z(t0%@T<*W{yAijC{YrBpTbW zltP8VsdY(WamgL?CMAMQG~KmJ`v3c$&gx7)lvqD1ZpSizwX{f6{;DqzK|B--26JqC zz){-qD3gL~Io|M!xxkR7lWCi0`*YX;aNXYY<2}1~>IxL_?MUX^h%Xf;?p0|Ksz1-b z?f=`i~vureNuFHGTIY#ZNrLG>urJXCaS`a&a_~FlGMfOXZ5PX<)T3eh+923-^AH{7T zIK){rB89v1gz|-8{iymN3m5;1+QosvUNg6Ic1gEZRc}3g>qXrNS7}nS++Q~d2P-n4?pgXgHp()sp?_ODC$2?ePWJ=P@ zj)t;Z+^oSoUUROqsfdf%YS{t)m065z9l-buja^_sz@^M-y<8l*6s?O-%fv;S3riQA zo%QYP7@Fq@c@Vd7nL7FjRXF~zERc@Z>`dMn8+cISPwd^{qtM0HRaM2OXIc$$)%y+4 zUpv(%8SD1@qYb>X_|<}|ekJkgZx14q@}ie6&$xl$!BMn3|T5MO}hDa(OYSdj; zE$yV1=X^V;lpqeqFJ|g$W?YDtD$v(x6R)wsozu09N$2x7A^G>8P8j~{%%yagT>+)uD}F0Xbq!H_&{%xQzme;?Wo1sj=;f{dTNZM)bOrXi{Q5xc{{XWhS+f?{ zz;CB=&3Kkn=F4e1-o9s86`Xa`bl|o+A}Wf|1RaJi;`tMGJl{_>l8Vs?}2E_^U)Ax7dB?2O_ro-(N$TpJ~@Ysh8bW zZ^caOz_V=KJxR)u^nZZY5%6RVNI%5B1p4~}*9a*o@ohbt+hK{!FWd2NdqhO00NXe^ zI+n{z1zW^?wUpSiCj`VTx?f?;b~C@Z31pxSZLydZw?BYTy94PE@DyEOxQcfIQWVqt zc5(~CMA#T~D?2;YLn}>Qht%9HZ8gsb>wRN!YP8k#o&DNp6PuWG%bcftpf#F)qVyIw z=n|dpN63D@LFT`*zA}Z>L)slXY|Ea9?i1HQ2xv*q!b!63PI(oII@X~ zz7DJop)#~>gMk=oC)*JtQ4z1?aeM6RgrZ_O>u@-ipRu`*v5NLc+i*WrCBSJ{88Bud+a-VBpe(MH5!a++Sc z#rI#YDC}mne;Q0JAX7Ox*Tb}Y=-Ag)n%bVJrUV8B$=)5Z%Qa*VdqLC=7pjNj>*&#P zm&K!Kw@|pu;JVP)*GDMLW9EF2COnOR#icl0py}Qc>6s z9fG7q3V{U_f=6;86PY%+*dQSP&Rd*=37b*GPz{!(6jI^szu;Fic>19{T3cHiZZ@K* zNPMf_i@p%52d5q*@046imW+N3+tKaLmus+vHJYVxJR%RCi<#foJO|Bl{ITm5p5Iz8s&?c!Sf&t0P0A>Fh8{Q@f~44{1nig@=)Ef1q!LtJBADqc!3Q%I$Pf z_s*f_bKvZ0p{3b^WKlZ*WU5U-MUW|#j!>Gx#xW7%i}y)yyBvLtF~`m0>cG*nnNTHa zV?*J%r5q+#53B6JE9^M(MGFZE#{jiugx!@bW)#+k99mpLBIn*1qnfExljb3E81cA8 zs}`Q&crjCF%$kI2fQMk)qlXE)<;+zGNOE%sA*RvB&rwrx-(Db-f|=zaQ2Xd}-Gv*+ zT>nKu&3^9eBfK^gx*H}EOyD6t5avw8oF-b(FCiVN+bWXX!(e1`@@LMKC{VHxCEWvo zy^rT{Kwuz}?>IEt>`VHQcM8X2=J{tjWb#0zryGPlW$tTJv{fv$5J-5iD=cS2`u9#f z3b~dD!Lj)q>}Xm>ukup&+|%hc zpIsHeIV|zO!VojnnszgcN29D%-h##IZD)AOE1~$%&~a<&wbfN7n!|?^9D(UOIu@0< zfK^M+KolbP0R>0H`Gp0#?b~I*IV35&_0F%J4?P`|POW^6v|rK*1JT;mLhTlDfFzTU z$F(MVbu$faPUaJ%y}LAPYOvp<&Xo{Kb?)dbb{r23X$S$7i*Lf;#a&W7dUW#J>lCPf zgfELu1GAo-JOs3!Q~9gOYuH9HBFEU5e0g`Tq}Tn*y`cu?z5KOjJy-&LOfM3`b-2R9 zdNTF0@rW$=@2~fvTYICGcqlaju@#DP*4H-hRN#FJor~HHZd>hYwhPTU}e5>Tv;H>a~|!ZTv@ZrPtuRM?He1#}f6w3S-kE$&OE>#(8X+!>#k z*w4yJOL)KmWaj|CPWUi4!p@Ly;_8Yt!AZOFM-izWT>M4OUUP>@U(H9L0^0Tg-HiMs-;kK3KnT_F2b)0Fhw1SR0yV5mSztFW)Q> za}vs`5eg`rW-_dF#Lyo-jheg%*x2^7v0Y3$K|e|m*mm;7eGe2eA;t`jZSq>1PH3vB zSxFuwAQb`+74#7NVzZ<8e*lu-InI25;s8-NQY-3=BEET>B2CZngmqczsSWV|*>F(j zt~VEBhV~;gtc{kYY;0F-UT>n1LD5KiW*8cY9XrR6b+jcTtV)L&Q$oc}WP(EL$>ru{ zeeg*5%4Y(@iO`GkiyxWwb#@a%Y3(L=OyO!gxF!}&ku1;rrY89Ss|0nihTepg7tdeD z3D3>Y7IA7p{UWe`=LxlN3$gRa{8d}5V_ooTh-0~+gA}PB;Fj?Vn34|f15em2@}$vh zW_Gqglu(}y(mtsFw07N_ryTVVUKusXXtd!V&Hd97vNT~BIf97G@gbl?$tz>Ml(0EiJwhN15Ho}BdFE+FtwSD>ro>v8 zrcN%Wa@CY)7DX%p4L-Y9l=DCD~1QhuUz8zA> zm%nUBPV;yux4Ql055JpL9W{deH}1{e);l?6oK$UaN%Dw)vR-}o(W}cS!niX5j~}lN zgi%66a6YK2soA0zAWqaNy@_%O8IMqx9k`UzlGu z;^$h*%SuZjDyj}$Pd~mQ##`|``k6)DZHLlPzXZ62i{p~X%6)8fC5XR9>aFvvd@n*b zj$VCNL@O*(F9u<9i1rbqg%s|43$q8)>;qM+Y<|Gai5fz=u#nyXUV$Yo*ZD6CenrV{ z!Pr9Lt+HCOUS|9D?K62okSLjp$3P2<0&$<<;iY`1P|iGtr-#5whuqv4!#mavQmGl; zcZ;-vcMruLgCyrE-hGGOKz`_vL9pDCJSh3@2nxFq-ck4vDHWXs0ij@IGu95AiY}N> zD%h^Fs(WSYQ0?%0wY+n~$#?JhCv$Db4ICOAEHi7oLtFLcX6Fzt=GfO9sMm5XzZR?U z(-#g48!dWUbmO)g+V!3uuXN^;9!+hADp7F__0W%Vw!r?8E3cp9G)HqeN7Kg`0nX;; zgtJ->1Eto2T&eULZF}}0!z*iE^=4&H54ySRj+5F9^?AvBsCi}D&O_3ZaE(G3nRl5S znTAGm&{~=p5fT;U0NOiIF%UfPt8VH%v&)fYOt181I){cU^pfA&^!pgON6(FDI|8j7 zZn`S#FsbwE+ADp4Rwoy@Ra56HprE1N>4WIYYfHE(r)?P%;lK6 zP(2PzO0S?_@aK**;~DMnCr@s`{(3-IAF9b5bWFd4s3}h-)Z}+ByZU``2^w~S0RE3@ zNWB9q7ir;G>yv#;P3rxTi}U<{G8jz>GEw4Xc%H1MapK%_aOi#YYY{+eY@-hzV(1w@ zUK0%$xadFZloR>PB1YGSPlU{*${(G?m&6xi%rwhUpC`U6wVQi;I)jQ|GTIQscXrX> zXx>@_MY7=PjTg5xnwNzIi8MHckB!E)*=h`)kVF+10hfIUeBy z?Aoydwax@)Oi!>DnJ%lk;&s2V?ae~qo!v^%q=cXK+O(e5A=UXuiL3ikLiDwYiPXd zII6T>cE`Zg&vh;-%{&^%p|`^K!C85|#{Cj}uk7p&zNZE#!E9f|Bi5!B$tgv}%%C!) zoaa07AVaiK*zxCbspB)QS~fW!nfSvb3kn9owtxR$fD3oZnOA(IG^t6EGMWfF%Zvs(i4Xm*&_*7FfBd@h!kH`UVpW@h z>kH(=m^kaNiT-$Z?}&haZRLGsHrY3KrQ>qh=t9L0Vd%8@lGFk%mr$hAe%rI5;lcFi zPK}!6rQ@55ill@3%~{6nT>yeYen)}K0n*e|D`XoK+v2n|F)=xt`u1`wG^ja^*fHuTZrmxtxJfDJ7@X(Zuuw$y|DjTx^(DJg1+$e{26|JJsroesw>Z1#c#cq zrUXvmz1efbM}(Ber_eLI>hwF6sD#%^yy|M?!embv1b?{TVXudKM~&j9KZ*RRSWhGk}g(sM1DWqfNefH`_AF)^;y}d)os<$D*5-X(G~`K0vXx z1ofkdQqi_{I`Gncjpj<>y3N>E;p~n-qoc$>s?tG%=Q+$9WA3527P+tKTUuI9{dB{@ zXqcrtYNht(c%qXIgWdQyi_Vv9xb@~gONna!5yni~44~rB9$&!t7Szw|V8MAQvh05ARv(!INWi$T8!&i}2d1urEZ=88c;5xN zj>%Avlt;!bw}^3<`IanhJ8%iXArEHb60K08hKAPj{NkI84IKj8^Mpq2d;q?EPbIb? z_kt<#)0ZzpU}J`)Gg>)4ji0^|uZN5RKt3ydU+k|^z8m>F0F$J&Y}?!{`bI4+)Rehj z?&Q=c=hQ7%nTrAu9NWMKbm!mL-6d20CpwuALp#bpod2A_BfznG%;gZ-%R!T%I~KrT zu9c`*&FB!mGgv43|Lxm;ed$Nu9x7!3G_Yi0`YsxzVEotR8Dvr&kw zlC$~hVwJh(CbeueO$P@asH- zN|)8f##sI7+tk6tGdjxjp<(ePP03RSMJXe4k7b0|YQ!4_!H7d}M9Kg2;byM1`Hkr) z2Ih*>r|qn*m378Bi8?;j|FI3vh3J^w#3VXuVa3>9W0RVOhbFs2)t%;kID;TX;hY*0 zEAQDKXJ3L{GHv`Jg&bpb_Y@FF7iz+-as(mQkFWOYdjXcAzAtr4Z0oLhrzS;&~`G%6vn?~bB8?Ma9tBj7H zKG%9-F1HMcn;Rknmk2n_`~Lx~+?cJGCq%zVzfmk5edDr|1NV=TChMUz`}ha5cO~Z% ze+hBVHEa~9tZ!}p5w2Otd??D46gsfyNV!gShYUNl*xY=)<_+Xw%M^ha0-I^3-zp<&}7L-L1DDNN_Xb&HYsU z_ou3AFgfy*7TtfVmqxBqe=Uq6DLuMPOg)L9vJQ{cnKLN)@Y?a?e0lDyWoIxyZjqIw zt$k<8e;f6+)>fINz1xzAyo{x+boNVs8_vw!@U`kDNhVyQDjekF>$b6(_zJ{-oonM4T$MVR~`D!ajS zUnn-8TC7`KBaB@vaZ9jNovm?1w}arFXAKo&iDDuxkWWe7`mT!}7jPHfRO}!raLl00 z(pzvUfS2GAR+3=9?M+PDPfPwVzQOtE2Yg#j+?R7vN*H@54@95r*FJBva6>It>mG2LF2t=+tdGf@8?VnK9T?4O7u~7Y?)7kQ8Z}%PE_5pgj zO&t9EwSOhKxxU_L%gW&zzofuf@8IB;H?~i#xnk^y+9N3@ipNGghBoDM@ylkR;XfAz zS#RE1&pfNK?vlIAAx+(NRZGdKDT?KQMA6HoDA7AVe%@*Sao;F-(Y}rBba^Qjo>*ai za>Kt085^;W10}1g!7jb!9ePZiKD@ZT!`~HzszhPd0K-$}w(^$GAG|Z)mA5YtaNMP$ zFBFOS25k@EY0%H{^8a9lfxb(d0Xc^Ik$yHmqKzTsc1oFPJtH#aKoY~C#p1+Y&p|A|`hU$=q~@>m!r0qBnvw>V7P>$HSk2?V|#lr~W7 z&3?t~1SihjyLYpZhpm?8Jl*#mhXrbkZqf-)pxAI>6rw8t6rXIdjOPG-L@C6k(2BzJ z2^#S;nVYzm%JWCA1HR3kJ$vwJ@%4)f3wm@i13goK3?P324vq{->}o&=PTIW|Vxzx)6#w@e^rrQVBzZV6QUb<2;+#c8E0`9kIs>t{J(X&f4qMrlDD+CO`kWqxLY*_#JDR+ux2A3VIpq$CaZDI#ME=^M^7I+K+A5w@bin|W?3sNxEbWyNEcp@>fi9$pv z-wKZhl$&5w)7~H9=g&lk4FMLX*0$~2Nr*QDZt)pZ=pk58F-3$I@7TUQTHaJ! zyov_|bpMGo{EAJs_->ZZrs(>)rX~Zgo5!uU`9>21%X6MveBt;9sNLJOeLLjfieS@BOltM#RxxSj@oHK_m*6m0i~Ev$?n!?Wyz>oy>4QT>Y4In6cVM ztq{U!VDJNIAR!5kU{niG!F&XG+}r@#5RejW4bKd1;VxdRUV~7M^6Vhi1A#BM|0iw- zui*-?L{Rs6QfbId<(<*Sa6Q>Ok&jWvY8Dn}in#7ZGt$J(fXMs@uiS>M5;}U&QL}jB zsy=*x3;X3cirEx6B1#-k1NgSqf%GXYkEFoti*f7%g9LnO$f2j+y7dWYLW~8V&zZ5E z0|Da@hT~~Ir6;Y?h6nEy9wAKA!^6YA7dLr?RUEAUGOc&>2RHLxVHpjArB9x9s88B* zrlbw<6z^4@-16$Z5h!5|IINhl2-E9Dv_tA5&BVTIf(4Ub8hm7({!IF zu1H@Wz0S|+tnHch_GX}o~Gb%Fpb_IVKvYh2)c#!UOZ~6Ewdae&5Ax1$`wY$ zN{}YwD#h+1n*gMfEC~%yvv(DV5r7-3rGelCr$X_>;iUo{V&t&W&01EH_c%4Zo!puz z=YVA*!k8MQSOOn#{N~&Oq29&M1)t&PfPiyTC0=HCv z=}f=6cz_%Q?eh*sAP5I0RZ3`ss9- zG|BE<#6OUlIUSf^oLFhtxK*L@?v#MkF*SOl3&E$fPh8No^FJ?pqRir2!s?+HLKUP7 zYaWplQ(?9KuM1VlRjFyQ5ObD^ zV}ew)IM|5GMb_)JVK;U#Y{Ow9lRKbi??bN0X(0Lx2Rm>HdKxozT5?l>qUpK0o4w^J zusZvUKYuKnB$PDP5XMwzLs?k>MKV|iJDpi&Rk>H)Y(Sve%tt^oz>KSgm>flJ?Q|{8 z>CdY-F3*WKUe0-oDfvgT%A8t6U0O!B!6h@v{H>&pX}&98@15|bjWv|%3;iUd%>ezf zP@cn@xoO3$1w<42p@uJ9W71_b$2)U-VaG#pkVG(EIK$1zjIEcqJ`pYQ2>u+^`^y?f z+0*3bD44rg#2<}ofNOq@^ANERV7uZNK9$;ACi4j_$=%(E#RfP=ew~k_cFs;tyVzvI z+dmoLxJ4PwRVWBHjqaBoe0n;F3@0p53sh5}L8%k+bCZ4sw0{>CfU%Zw5tI3{bhGd< zguJtN43p!&n4=%j;G>qdV+SNl{%-=Hc`49mV`Ac~x3#s+8&f}f9Oi7~1E3Fv0U2R$ zbOfN^u$#9dF#tAA&;@zYz$9;w7NFlwJ#&B*jlbls?pFFmY4w(KPyB_AiYF=jhM^O2 zZ<4Yd+CqKg%~Zq5G`^kzJ_)9IWF+PRS{m_)^V`2(IYW7cJ(H6Ve?BYw+qhdY(aL=z_&wgzIK^%*yBL zIv@&1C-dw@i07cjN`@#2;UPFQG;6YSU+}5b8H&3Mu%rmp54inx7A9O4lI&bts&}w^ z+DJp9Dd`#2zm(HC#_R*|XBIFr8{N->Pgf(AbM(S?`m*f0RbV^dpI!BfqZv_5NJ7aI zA}z7(Y80ipzme-o0oR@JKlVA%!$v7BYN5|{Uej*T%ZAWFE%c+!#+`@*DlI)dukMXC zJ%9cgkdm2nW1G47z@>tiI(Zic70{*H3=x|J@?@lgjtsj{R4dgs57esFLL2hJtKQ@A zvsKKz#^htL{aExHJ;7mTB36p!cb!0Pxs7vKWHN_>LO{fnwe*i4pLxGnNRBxfLJ`EE z0{-_t0UKUptx&V?^p^94`3-y1*3iYIBg=&_FulbOUcbeFs$YQPgZ~ScR!s?ccomVH zIL+W8^7f^K5`_8q(oP(UzF_O)ke-pl&L<(?Us#i zZ_NShAgOI(@R)vcgJ#$;3Lu@vpaIbyw_Ej=0p6xViJc*{;tWXYmCYXuQ zlP)6)22yMho*_zMFpnv7T{^6Sq5O`Js* zwd&)4G2&74e>zHFL;>smmp<4@MA-j#Lv$NaW)O>E5AEB>Mo<4GxA%T<@U^sLpLC0$ zec(7ohlekvsO}1={`Gw%A7L;-cg3x~nNNK0Kwco|O1D*;L}(k3OA9UKI0;l^0J3Cz z5WwkM1!X6^!!zA?vX>XxFTXMWg##0#e|uZo80c*5%NzajtPQ^@qF39YcEFPm+;)}} zNz%JFJ21Lm(0xBuxn;*6Xrfyz?~zx<38GB%m}k0RqoYWDR#yQ|P(;9?uPEJ8I~vt) z_f$ID9jL%>E`JBAgVSZ)%nSov*L1G@eg2Jh?7=@^yKoHb?#fj_-Kfdsi^vO{)2*y+3>(J%`&0FJjv|& zQ-)_+8g~opK3P&1BvXldpL$!-)uhJozOhk=*b3Jk;)mu2W+F{r>Bln$c$<Roh;WuE%QVWIhEXfr5#vl?;I}N(bCR2GI0_SI2zw+PG?J(V?!TC4hxcG9H*|KPjz$LlzLfPAm(9?yJ*&AM8uQ402$QxCV?3$tB;w zZYXu~6IlW$Q82-nPtVRSuPtiOcyaP3?xJ9Rhzxhbfr2E9s;VjoKu`;-MWL;300(Ox za}?VvYsq-yxC~H+B=o`HN0Hc0B3{US^IZ?QV+8dryq`meA2R;-nBAMDA!u(N_gy|vPLhmGfwmM* zC@?MS6WvnKYy-v0BG>9nPMT$RfU>V4ZrSRdhX4({4v_*Eu_`V;2;yO1)s#P9Cyqp# zLNSC9IOK>g0=}@}d#6{AOsi3NhX9Q=C-xfAa}1}6ndM_&)8{CW4dhroR&|4n)0gfR@~O_F z@TNV~%4oYO9)rQ_T!MU>N&t`iZpm0-ZtgA<8$#umXNeXC4bM*1&>fObY8bA+yJdQ2 z#t#BqEZu`GjEM%5J$5|z;N)8P+j%53OnBn^y^&V#hT8|=NY=(Kf!Z*S!xH=h^ZZpg z^LbVtVC1ka`a_&d1)TrX1VlC~!pVnvhu2A3qC@Ry*r!jQAR{;b9Q-W0`5E?^_y11V z#UyI|@lo@pYmG6zXd_&J{UE0Zqi+fT4y^Ch(M zXu8}W3ofzGp+MoOXGJaSkiAAKcQu_G3fy#UY4##2rq$0<6*Mgc`qFkIpCPuzcFuY1 zlfpsI22es&~Jm6rW^?^VD zLy2U40rYLqSO!N%F7FQd@Nm6;`usvrZ0_j@wGM3UBZlf+xB&3N2|WQt(u|NjyyBr; z_eQ>Wnv&Sr*|E7sv;iNHu zx0|DnBRwNf^#VpZ!Zuo3uC;sMVr4+o!_Nw~b_V80uEsDDw`mH43eIGHF)`TrHlMJv zvI6R0+4-^z3-tcYT|Ij>>R4=vT*!=sl^+55o?EVOo zupQ3XU;qA%?Wn!-seQdr)6dk$81KsrvbNAIuVObEl0n|y8;is|ilRYasIdXLoprUO z39U{-!sM6HHx?Fefh04cqe7b0=%{2&x|O7yil>lz@;2Hk^Mc0+oT()r&X}aECF&+o*Yz%Rl)Ixi%S?#==-kJbp(aRZ+CfbNEG_J^5?V># zr|q-z$;-|~MBl(-8`F!`BohxhEbE;lj`MFGZ|83yxAJmvxj043-P?f^rU?mZZ}bCg z&kQ4l0`&x_1s8WUg4mdS@aDKh?__(xflvzCx$Oi7YStPjM@QFr?cLhp!i+ay<^)WJ z_0I~kR6+eO^fDUFxHq+rhQH7|NLrHFK`(Av*o{4nu%L9m5tpl}1?IXnDLFZrPp$ah zc0>)rtbTju86RRx6A}zj4f6D5vLgVOBy?H%KXPoC6H{p+50*4N9;+L6YHDn3G#B6U znI({iqtYk`HV2mcE`?*q_7M2|-|FX}Nkz)0CG&jE`+*UMKE5sPhPWMo7VL&pF)yV0!EvH)OU>aRGVbk!7mm485h zx`sx*wa`AQXD2+90RAAKeK$O-D*?mXj009y963O1;D$gIAPYq|AWytr*{i^cvM{T2 zE2KeHOHov7GaxMp#aEs%0we-Y>H9Q>R1onvp7Qk}w*Csq5Z=1ip-&(H{EI;Wq-jRo zN95sLL>Fy)Cml}0I5~$PT8=FQbRIX`(i^dVk#pN-i%}817f&lHJnZb|arY=c3)KxS zY+(6gK%WTMaHfRd4O1s+E|-g)XU@t5=MC@LxpM`Y8syzwz$b-53K0JrwBxEN#}pK< zGMgMe<L0pEbK!6=WZ43-IM z0@#2}|2AHeB4=*Pv)js1Q8TD0Xbz|kcf6R2;;jq}At&*loA9_9^`Ahbd8FmKFYVGe z1WdRyJ!sMqo&+8i4w;jG z;WjN_Z1ls7@?o&YMRL=K8lVG`+~a2T(%#k>|_zCbMoX#M?;>K8$QN67-`?x^uMb% znVAlyzt%!pLb-v`Z--lNm z2AmYpkf-K~`aNX{l!Va4kj{2COH)H;_5QX8=P_BEzT)tDj~%}H`dK$GJc2o%@G|9~ zphy%Kzt$n8l$Nv0>P)n%kr&~T9!}*zvuVr}lTP3Z^w zhoBHd)af9tDQGG6_`WU$H>9zmXGg{(pcQPBLn;3+Izgx#l^)6KrZkq;#tFK5rC;QwvqhcWplGUbthU=g{6*bqFB8MK_QZ# zcBAtD!y5{ypcC9BT(X#FL!^HK$ORyem^$pjnSgBoZ}&yWaX<(6=9#M7uJVjY-fh{l zd|p&MRgRp&p<&fuaPNEqLCR+zdE96D3E3g2A3s+$#RA(u<7AF|tlSE0F*hi&-zC%G zAnOe*7uW%^y>=0hHE9@=j%s3B7(mI}8V089x|9oZOP|v)GTTb-jfr8I1eSORT(qYi z8PH1QBr$jw72UvE7%YWBf}w1D6E-ALNG84RsE%(QJHBu+yqiq>+{g8D>MVRX7gEa> zHrTm*U~?m+Hpz{VR(58GoStatxoFBvNimlgSZ^XQFsJ$Uvrf+rnWp-tm6XUav$PC4 zf4*7R6VR`z=eFEyHI%>dXU(bMe#4w8CBZmOn4AFXORdu`;?Oe&gF?m9QscS$?R8`W zmciL=Rj&pPbq|F5^-CA%LtM^w@V|fd?}sE6tcp?US#4#4PQY#s2&g6}kJk4&rw=$U z^KQezhAEybMlRp!$>(ojF-khBc+z9jr*My7e0=qJg@ucVPLqdPA0R1VdU26AYEOiX z_G8t4idK-8IW#Vgm6g>>l<715=yYCke7Xg)wc%Fz`00~=&R0yH7UC>v1y@2-(Q}|N zP!tfTYim1>A^GLXGB{w+SE%?=>7&8H^ghPr>&s)X6m1TEU3DUI5OWX0sl?Fkkj0!_ zT=ryA?IN?9GQ-&zJ197#1xt(E~T&_6Xd2~TTBn!r#l$<5W+)8 zK%5=2+48Dso44LalTUd+2KLOx;blYw^%;vNONijWJTE7frH>~V0m`tCT3f#wTMjoZ z#=rqW)dej0#`luue|%YQclF))zR)wD@FnyMXZsfy;>kUG!n1T3bQ$(LGN`y&J-WO{ z_w;F9s#L%Gy8DCA1phoXZ@8JWmZv+ToIR+agol%cnxSZ&eYM)u!G2+Ua$Mp@Q}Gin zBKU87OfGYYKu}4US!#t({5A@|Ir!5DnaXdHkceULIQGK9t2eub$?@aDSX)n}O&o;F zLI?KyWo1d;Hc*n0k&#*qtsj(#)lf{tX#5e!*zF(xD#Cc1aSpt}_LlA2ZJbpO5JM5h z#qRF-ElJty?p+a$nE9V)*xexN?8bq4n10(A|MB_Cvn!?h2N#n&v$Bx93Ps(!du@tq z^B0IZ584jq@Q~IgjeV=?^0?^Fk3M%;HZaTQKYaKPd~HH2D{ow&HoiM&CFyeZ?DMR> z@LD>p`X@in(z8DUA~q}Qi`q!_@649ZmMqVjLkUi*twHg6_7T)u#%Ed-`&sqwwC3#w|oz4oI82GKO29#WE7p1Ra_i3N~SqURnd!c==$}3>7Zk=!gOaI2?-uI zbNw?{Yo{A=XvR%Z>4074%g3GdqL2A#;+h^{YVbXxn`_GKYSM50bUWvvCy$IL@AtXy zyy2kHhVBdh%zNp+zIO~N@^j}>qhsk7X(t(5pE%$yzTXsn$jzKH<`v~1(b<}lg3DjQ zFTUKk^SVyJZg-$+ilJKQ?bE%9*<~+HT+Tiry}u+s8hQQt_0afAC#$P(! z*~`Z-CBBcAu+w5^!| zsz54PsELbH-@d&?F;QrneDl6Utw_^o`s+@H)N9LHiR)b`?_23gD~MsLhqUh7hx_>W z=wf#5|77&zw!_&+@%^8pkIUe&s6f-jLi<4ICKh^-#gMq_)Bg?CK$!zuxApTbYfzq~ zEW_MRONq0go=0W(gn!?KK8p0l+}P5xV`a*N!*M{NX2#pw8=Uf3YubggkGzbZ;-SY} zhaNKEcjCYueTKyTh6mFw6GB)rC~hlsGh@)CZtiGymZc~Y1@xQSd5)*)T2i3MRpzQj z`jg2i*DpsZc&x{9yxOyeP6hWrH%`gkKN&e8yxiQB5bVKRkRC*gK~7tOD}_b^hGKm@I^t+uJ@Cwj8aAzD~iYke7crbv-uzj1>-NBcS|%CqHl5O=~O7+UcxMeZO!0 zPVJ<#D{oq$Q2W&RPow3AhVfK6@6KqASmgQ%)zACp4>;4mw^-MbdTGQiWWRY@s`<)G z8&T8ZcQjr%sQ0^EeZ&7CkwsywaCIht+fX~7>6`DLZp9)I9X)X$&dp*ge|Ju*rXZB= z{cs|CH%@0{oMCx-p3oesBpc#3A}$#Y7WHoRURi^&bPbjeB>7#!DSZd%Tg{Qysgy1& z$O6{UYPu|zOL1~)w}m$=C2E81e`S3Ad&;>B1y#nkT9P|DjhfZ4Eeo2cNK?=cCX%rd z8cqWtHRT)bUDLmID=q$*gBcjN6>GXnfhKK>pSfTh;7UhJAe zGAqxU1>}lxaxS2#(;Zqx;z+aN^2qhP7o}?pA6Hi?AzsH=cHusnRHtH|LQ+Q(KzjUr zyjbiqwhxEBl{8Q2V(bB`cjbwHTMlh3Z*yR#u*{^@p8)S4oD5HqzMZerfD^(TAj zCI7>i2(aw>1r{kFUGl}1#W@h!7`CB;^6wlgv3=OCw$R?%mbLRh6GSOr&GHW^x<2YJ z!bl^_iU*395?Upz)~3c^e9$%E=b5&bSA8M30H9I|j^tr58Z#MIPXELEPM+2V!UnO& zC_dMK^!s10;Kc@-Ym`_*%5%4w7WO>BAt{+o3`?(Ae@A2(3~gBuD5-g5Lit1VPXM4X z#$0iA9oJII=`M4D!;Cw7d(?6vYJ1A)N565jnzzwjDkg4JY`AID|3l6x?Wo+Joy#gDb zaz{Bk2fa7qg*Pr}?UG95P5R_JJ;xrD$-w!X<(Eupe&qZSU9v%HlW$K0(FGlWHeR61GrpU-?kXxe-A6aqT5x(h|ntmee1`;>9^=D-%=L$*+#y3!@c-iQrV1h#0@Va&9i48HJXV?#`W~iI81z>_}kg* zxH93Vv^JlT%;#R=(VEJS8Fq1Lb4)sx0cxkL&&{_T*}BX5gmySENUYviZdDf<$yftO zP-X(g!N_%{0!lw7S-V$UL6h+l-iBYTr5nJQu^%^U2O9y?#2Rt{{`la=A zyoZZ<6CANo^i-9P!bedwlIgpZHDSjn?o3?$MO~B`wIjIF$kq8DKAem+1;ED4!s0V&Uqp9i=-{!MXwCJ{4Gmyn(wc__uYX8P z=Hm(DS5R<6ZX#A3f(2NL)za|oMF_twa9St<5&v3|QqHy9`o+$GN3pkX7iF1><7_Q2 zG?C{hbswARojK_F{w8}0)tlwZ2nvFsxG3M;cJf{!cVep3X3NyT3%V0}q}?5Zv%UI( z4S6q;`4kfoiFzI1;W?C2fEG@jI<@BRF&)Co^-wvdx&?ick;qWG{WI7=%kK0}Q` za$#bbS{Qeg=d7d~C%7s;(@`(wW(`gkx z%P*WskyRh8rpo0kW(Rg7mznY4!9x290K5AkGrR$kk*1yf=IhH3jOdoi;*v+^mgXJQ z62mPduRK=W!uhy!>>`8r+udcc-4kY{$fnrVgHUnHw)>WgNFKbky5ZsQSoJywebPN` z^Ny=-H(6_98X4E@K1|rho`XpxbuplAtcIC69`$){C^ok(OmnWg!l0vWVK*n%osv#n?u}*=yNZ zSy+AC*a)F-mDg@Mr-iO#-rfm)MyNwUf}JgfDvc8n^6%Ga79r!qsY_g_%@ z=jVO=Pm)Prd4FFKVk|q!o^x2m_x+b++ut9HqRBInYJD`cxB|D9;H8((El!7$6Ppj{ zhK6pZ+KeXwDCGHzzZX|zf&v~r;v@Y~px?$sOM?s6JS$|cf718afrI?-MQPpqpFVx$ zGBt5(8@}v)hQji7^+<~hwk7eut-&v({zQysvE+>GT}^${sq~N0$9Uw5>cK=R;nO+2 zp5@ldxmn8_+z$S?0{e@QnCtc>{U->s!O@H}PuNx())tkJ&;NUFt^9#R&$a2Mhu&)& zRiwy0)v%O|e9bw?`EhEuDDA#Idx)`zi%9bmqO{o_v`ju}>|2PTaHlnko@Ow`FErm` zT52d#V}r1O93v%-i+)_S?<4w0$9Lv;>Ez9fR>YiJZHP|1%c_L5;6yEfJ#`X3lo)nR zP0h)c{@WEsA7-fNe|Uz=htt2{rgG4H(Z22EiiUL7mlv$^+YOt;p&o{&O~ifOsjPbf z!6Z*PUfDI)_X(d3O?|Rf^xay*IVIuq#^v+gc<6mH`rdmE)IG9Xd%Zjm7s|W){ce$^ z(qulG&1qUI&-xX(h$c)YFHs8=+t`}Ytg;8VZamvHT99k90ije)|5tI1NQ)_nOL=ZD z7aq?KM#-A#SKO_=B#h+=yBd}5xULEF{pB9HW%%i(7;XPwf6VSIQj;o)&FrPyv}=0= z7p%)>{%Xa$`}PedyBLmNr+2;aq~^+>SaqW)L*p`Xe;eb`f*F}0L4jEmx0N1;Sg2(V zWb>ZN)?#FIhEi~4esmu*^N{Vc5;poDzy8$Ryf3#&XQfg8RX8o;O8%{tBMi1ZCw8H7 zix*Ccp}))OhKqt5KSHy6a@yJW7J^MYr()=ym`)kj{@&#AYx;^^iS1 zn9qwWofOx&PP&c!Bma{>ZnNviaTIMKR4O@q{g~%@AAM>HDZf1ZNcAYkzBlKbtXYTu z(uf_;2N3Z$&MOOkp7n#=mk;4iZzA*=JqWr^cjzD8pz;|%s?OJC z6V3CJl?S{%>DwU9gWF(TxN=lj8 z$x7K7kzLu@qYyGnMRsmG$9EiMywCI8&wXFld7Yz* z3DIO{d6D9hJ==4fYsP_VO*Vj_k-5R5z^uGgsuXvjuP9oY;AWxRLkD8>neHdhbjld zoM=g^${hleV0pa%<@=$F$D8d2PeW`J;${p>{tt!5IdBWos!J(nA58Y%rU6r3D_B3uQdoaO7 zJNnv0oVt2yG3g8p4i`^Yz6}zcXwmxDZ`Idw@IEFh-Ug-2`uhyM4U}!{+cwF!^ds*v zh7uP2IRiiEE7}m~?lQUxsm(JPYs;!{&&u|-*0u>W-{u<`(WU1fkw5}#v<|#fra*e< zYI^BvwkhSEd+bvjeczJQk%8MJ4=Wq)K?L%3q3k$Sm>dnMgt~h9;0qINWIhIlbDb5q zzkg@T0^G1OGUi2E7DVdKg{RDlq;qB*fA{F&S6kiVR3&yo*T`69+0rdIBm)}0e9-k2 zV%MQWd!nI!^3g-%;uzy7XOV%SrzqNvlX+Ic%bHqp!?Vrwygc>Xx`$Wq2e+d0!*>7n zA0yubS7-HeQO=bHtkQ%_17qvkV;7>3vOK}Ia?}r5&G}qS`Cs|6YK)-WjyS@w<`REM zhDdaIK_ip4tf`K9oekrhtBim3--QOWLc9j*>ZSdS`CrDKXK5T}{W7{HMR>;r*T0>Q z9@ZF*xcpiQ)X0=qe}aa`R&>yzn45NTeMUuDQSpVz>U8N0HL28Fm3rIQ<7Clk^5MRr z`yL7lmfYfsK$A8k>i3htg=h^F4zSQA$=)HjBx;IW*I{tPpPsh`$#m{q{c$aB2a zA8<7z87cW5V)74Mle;pz%YhotI+tCH868Uy+?eq?2By=iSX~!zFk$OVMoBsN&QJ>V z6JlakHkX?&T5Y6aeveTLyKiE7w)ZFATkkC!!fSk=qC)NWa8l{rr{tCkKFIuNCL*Jp zK!`>Q<~ZZ&v3n=I@uUziyDAg}t6Lh%oD2bCcC>0OL`wFOjZ#nJWPBr9b)e+zp z7TabX5T-KZ!ra3&6nbEKk&lU*njeERythA{r$3DSgM!QPVT^2tK0t;ab-V`F3gcYAt)AlQ9Slei61!q%|=O&BO6b^IliX^0rpL2dJk zaF|2Mb!L4g66A3gk!cLYJKx>}aY!dHNsFs%_krJZw6vYsF&fvO60>`lF3tW_;005d zTJ#k@fS35HF;TLM2k{Y@GysXq7VUdcs?0iX_)6%-VRZ`cGLr^nFH|HqFK(A2RC zef|9KJJ_hG6eyV58tf)4ZgdDljDngfeU`1{z)lq6eo^Pe0g{-3xrkW>EJ*86g(FR* z5V&y?XJh_6niDATDVWw?XJmMP0_^RA##J`?EkZZYWtDGlxq)Pq0rJ*Z0xu8^86zWa zc-mEN!Lf@t*)-8UAEgNF!4;TwQj*b$6Q9LbZnxu{tXTP#84zG2AKq-b0039S@be1Z z8+cI=C-2yaf31$yh0xFWc29O<=?*C;h%NP)bsX3~54xB&|Iz2qZ+dR6nnjF4ErCS! zgG^RA7U*>^(g$k_OI@d_vAjSOp|#2RWBGw7gr@PuR>iJQanyZF$!9pKK21r4vrAC* zSqVn(wBnah1=x77^10>z8f!x;9j0RwIrq0LfL~cSd&uNs3{)fL zhuD3p%nN#ILp`>pOG}p~I;_z|z*pCywErMO3RcH)?rd5nYJ0#bE(^3N>4L2S^J|lY zQ%ccbdDH=JIUR_RS39Mcv)8XLPS6Q(GzBKrgAwA2W*eg_yGxQX=U!XDu>x^OT>53^ z?I{gMk1|QC9w6Nb%I>UdP3D6)0RQr|20Yze2%i&9a-2MZi zCL^AbS3yF7>KmCy_^M{p>aJ|zQpaZ9LURf9w-dQ4aP055s-!mF*Rp^{+_WHy>hnTb zvnh+vVj|`kNO5z7wg4&`pbl28ueXRci;m5+>qqdikJLXSsO(%$~`has&Y}t83 zz0;yYOkPC=u4(jjhty4o&T%SX-x~jbrVFR?6T5bZ_rna!eYUC!PYX|g9PIL#7cbOg z!}zQD^0_eff2g5H9-2#D9gu|ZI3@WTTZ?qkL{pZo%59S5w(DBsxCU3il4!ps58k-v za$2cl@z%I*UrNe;UvuEtcn%tw&BoM<9QOM9VywO|17Km>WGRT zaHt8KkqdT4)Py@sz@9x*Z4ndhx;?aW$IG#X+2JrAgRM>IGcz<*981+D$?9yuXq;|8 zdAI(l1W#l_XlYQGN=a|0->=h;#=e^Fs-{w6BbVCnl%YwTTq=c+=^!u2)~j(&0|;e! zrjx8_7%W*ze18VcRS`ILW z`Rhj2XuZ8*BBN^YDl{MKfd^CQb(Uy^wyu}`&r|$Oz7&bi1+udp$bk?v%yTix8s z%F2PhH_6#Uwt$bEEzr*0eFNb6n=|MW#~t=wvDu4)OSuELy=sZkXTfzfjhbH|^&ENf zc6OLD$~NTZ9f~5Ro1T&9ucpfFPS40-e}bApgXS@nU&Q^Rcs1+mIkmUSAI1%6P^9OUsYOLvz}huHC2~@} z{Km7Jcp|KrF-0qiWPj$ah4N(p$7lT9ruBq=@ zWt^D%r%1@KKx~qA-}+-1a;Ax&^$TIHK3{i>q?S)nU!S>uXH&jsr8sn)+6BMKtI>iT zCHE^VbnQs_u#ec%0g}lujaQ3fe4dweXrGG*#ircQa+1LmrJ@% zwJcEhM^XKn3n=6etG}#8!1KJTG0c4u$`5*@ko%!qaakm5&rkW`k zpzj|hMGD8U`Go}t1Plf2lCFZ04jLSM3+)JmWOp%bD(CpI4bM^QF6P&FCjH5e_98UH z&v5$(L0L`R{?cEQulKnrwIi4)pk%3UYC0@)fs5+Fk1ALOdwvf3{(uigB@l1@>I?eL&O7SW3jPzu#PYI zI9Zj%Ms(u^5G9hIC2Q`3@QXn^v>-4^dh#p0vB>;lV-Ez;c{MG#x5O_?%gQEYz|9VA z;D*e}0-e^c3YX8E$#0-!`wr9wp3@)9 zSls@$1<~0XxJ`9}rvof`{LLKd)O#>Q3=sWDV@Gnz~cY zwi!nsJ4X|qak{k^0 ziGDqKcM_)h*W+Ppwz07@GV={^GpN497uP>X%ogZA=a2YP#y`HHLR$I8sQ4Y%*wQsh z5k7MOhzLHbH5WL^!GYA172kc<D&0hBB(}W~WJ`z#;m#VBVAE)0Q`6la@8$p!cAX+26>n-5=}E5ML}9ql?=;x9 z|5fFt(LdI)C29jlZ4KZ#e@SjIXJv41(HfWb_Ln%&p%yJ5DcPbc!UYJE(a;O}F-udN{D|ZTaw| z@T0B!_itnk%`NqEWfQiLzzH+OD5~(dI6W-QE61<@xmgci`j~?Je6(*h3uObvd$;#s z4bZMba+==JU>ghBjb;YtM_nF}moCOkr0Y@n5(TCGA5Q|7G-=Ynya@Z?u+6Lp3mK`q zSVFTY!DWD8+mw%p*rbe%CUs*z`exIDBu?e@^8x~j>Myr9t)-4rp}e!u)n!zgS`;?P zdleL@+tbqnnl6ShZ;(t1shXxx_)$L`AIxEOR>er%I^W%IOkX>>v}flI|LR1qqy1LJ zX%>Z!!f`vnM?gRL$LvB3Gtz9MBO-`dRH`%`Ya1Cr36So^_wXWQx#haC`+>e2FC}I3iIBknSeVu%_vRLGWm-hn7$wfUNaAE=?K*nC!g=JGA^f;JFn^0vrd*CRJ3_M2 z^kXV*vO;OGWRO8TcKi`%QSzjLbKqma16Jo9MD{gnjWnu#uCKr9QOn9IO;hvZ#}6=T z-kzCT-xO(qTU`hLFi2xYd9C@=j-@`oJ^c(nSFfF7fr&?o*afY z9^(b=2-2P5oWvhm_(Hg40ku=$i4HDUEsiUoC+|KMyTvVUmn;i4Nt#0VpXGJ=>)Z^v z-A%T-XwD|PRc@-EXxh)s_;x1oI9bg=ZcGFG7vC{&1f^BpL~Y>S4!4Et7ZEm(ODgL{#ikZ(51_qt2C>z1G<`ceLdLI`- z`N7-}P3Q8<&-Y1+`CQvLO31I~P52bv(xj1bmBmpmHuQ+6R(cy~*y$;JfjvVWmL=bb1TMN3E14_Qw7v)d?vlt zH!E(G?lJelJRtMJw}gno%0zD!3vY40wQtxz!Lx^j*N=PeuN;3EN{R94B;&V5pU{kq zMLvd&V>d1L849^eR^G}BdHVVr!6?~i{2vr>|GpenL4|E%Y&CCi10Eqpx>p%aHMj=3VMeh@!fn}3z=D$WTv2)to^ns!uS zOYa|3V}(xYVETses!CCd!QEK#`)|bWC)`T1y%ziL4Odg>F+t^s3jhwkQ-C!i6)I8V z?QFw;cB$m%A64N?i<8MmmWJrv4cl(>wa(#s|3n@Nnv$C3UbBDs@lLm>+@IV~tIN)m zP5OV?oCUA-i;Al66)f`H#w*k-DwW$GDRPu-;P&i4pPB1_;tkv)V;b}Sg5U;x4!rT7 zkoW?z0RK>TVK>RjO`gce+thSeClAssbd;4tIf>{}3Y!+PH{l2P7%88kMy?|9xMDwF zUv!J(!%IYYQP?RlF{H+v4zxqmb|?Y+4;d>6%7~K%$lbw0bkB$|fs8wAOik#=GsiPf zn8K68_wi#i`{VsB?B)&+V8#JzCXEa#g>!YbuC9)#?so6SDSI(y3L<&*q2{1+wwZHX ztoL;kiCmk{?K-BXrUokqB+r=pR}VXuV(M0%e-9FUi%-|0o@=UJ$if(d^5)C<^LsB+S?%&{VnDk5_KNLw(S`^vZeXS3*gqG9f3)O zzMc90avC>~lYznj3a+cI{nLz$2Pgx`_efzw?T1wS%t>~3-N{eK)~2_?+vJJ73yl$w zw=DHcTBiCS>w_d$dZ>DK>_8x1dM-HN>=SCl z?(4q2xeQu4CeM*RQnPGfBJD88$B9EFiDC}i7{1$|9zrz+YW`aZpFO~R7?706E^l4F zq=8l(w*u6ke)JM$Wo1Lv#IgtzNRR?BXMo*$2Xq|x<~GKx1m;DYp@6vI(t~3#6M=fL z<5^^ifwBRw0z4x&0TRJk3pz_tLBYruZ)Ow}!e3?>lc)Odnl(qijE}E?dL7;uD5pR| z%*W_dTU#5w)FLZRDX`7)(azu?Xpx0hqX*YOr|YRuq(ju75BVI13bzb>5m{kprxVt z`sy43;(d&-UYNK*y+SmNXz|)Yj=17lI8m&i!j&9&K@DUBuWrTpRDEY8IhtZ(_0-2xm_@8cra9zh7bg-|)%3zvA1huFEv z*J_Vh2O~yUK)?a84vs_=lbgabW%jV=0iUz2vut5uVSBl9dlR9s@H4)d(~t-ZZ=eCp6byE-8D+s5-|Z*1#HlNZt*Db=-Y;LNbbc6IO$+z43R;wS;u4DQSQPN0Irf-?80pUa=O z=|HZr#NzRC0UJ|NSAX6>qR#Q;qlBzj<2`}mY#4Oc+akkDqHvN@j5WoB$F zfZ6_!dpndmjJ4CUA6f7JZ$P(QZElj89`AZaK;Q*W#9TdF7_qj%@^f`9?cM)lZ5xSj zHkVwNroA$6mJT%reFiYYovoxoA}l3?c-MD^n4FFzJ-_9FM6RLaz#b6&-*py z$!`CQy1KgO?Q7u^SJ#ND6pIeOfA-+eZv%3=jJPZ-E1rYXCx51B6|~Ns!fXNT@5v>c zeh`7&#RiLqO`Xil!gN+%Taf#HY-boUHg z*Ex^&DRi~(z9nx6z0)ipC{j{TNEW7LX3o*f zLXtZXgzLwdheywO;g*($>aQTeiC1QS$2>$>SXwrX_J)mue% zz-0^}7q#Pe1I(jkPaRG+C+{0!qpY&KM*_fOmTtpBb$Cd9vvDi&U=D?LZNK@O&IEiM z7~3FqTRz^I|J?MwtOq z-=G?!;-9eYW;KS1Q>v`ujZoKH4lkOpwxNzhV&Z^y4&AE+L2G^NC_y2oPM-=TsHq>3 zdDc}la*0P=JmJO6&YI37@s{k~|dVH%r==lMCv0C;=#u1910H z0;vSt(wA_^Z7E+(h5tmUMF&Ux7%@n~5g~O+oKS^>q7!bS&G2^YYt-S5r$m!1A4)Ns z54xj0V$C~1022@p;J+#@O}c5FceJ?M#<6|@%rCAcoVduD^{EnmPEl;HCA-p$2irC?)*jH!&7JZhg6haZlM zL=+a=t1WNL;#b2mP897T=}T-Sc;3GhntX@b`zBM%g6k;<=wV=hgr2(x+-q2i5v|Vf z9I*I>upDika?^S%l%FgKiyd2CSy_ShloDkcu?lFksTEoYUPjvQMs3)yjKvc^PDN%V`0?40UwJS0;*)XuW$-(phjtT*M|Cmw`*+3KpG*{w zkRpNi8khuu-3U%KB)sQ-gzV3_9?=pnaDu@gOqm8XlS8>-?)vp5BbI#+D;Koe1wzIi z<7K0g1humU_ZR8eWsXxi%wcrT6L*kM^(AtlvPO2;V}DNhaAR#$+P+lU5y{EPh$z8M z^%Q(}(d9mS-=}B}au6FUEF422rmC(UooJiO$lb7K{LY%-!%e6U|qp+SBnt>e%paL7E z`;x_f=bW!yq+!y|$@p`=MWg^l1?p1|82l|RzDA{t5B8w6e{qW^QX#^`Bh>n6@rt`x zulavgj}t(6m@Zhp*b0Zs-YU?u_P6Ea)kvB`5AP0=Vdd7^*>WlPl)x`5;n_0@C&h?S zZ*T8Pmvbrfy$m4id#$?eyaG#GXfP$Era)sNZdKSQFNf+5QgRd7CWB(;mAS{s2Hh7z zeomzk>Mb;#;7A5jGZt!U$s8KlvYCqY3`|TRMT=>Mm!;@O)3G~Yq8i0kdXji2zN{@x zy2N*9`hkOso&Y9xrG*n7DDCOi_OhlRCmTg*7&afBqBDBM>Jg);0b$gnp3wX@!xCEp zbY7)cpZGfHsbKA$ih>_FMl~PqI(S;QfK$mw5&D-NXyta1d95tYim;A6+RKb5BXi>h z_5BmQ6sR!mOZ!n(zg~vV^k-BZ$Wp$EekeM+7d1z2H}U6#3+n3MZQ!-}A(^~^olW#KCUJWa5OQg$M9?MLf0GBJGgo9#-LqTU9YAzuhzhL2ES&H4=c8q+ZU`$ zc;qbOy9JUgqM?L2lMMga=~ii1wvYG6zt?{K`W0HcHTMesTG_LK0M*eTpxcjl^~xDl zdgbbO2S1{h2;w*Cj~#PE4;CX%U#R6WW3=r?c(42CuwI?nw(wS=>9>QfJmrqYc`E(f zf}t|R8Erh)3d*~~lKBM%D2bWLNUwR=o4|0P8T}0EhF>mXD?1Nu5OjIA4c4c@89>aG z$lR9zta6+WW$#+;v+3$cNQO-Fe=2o*#EjckUUc{?H@hhPk^1`VFX6(0r1;|#+wFg- z7F8YCs(SMN-tta3Q9`Yo*D9OI((d*rGwIKATT`*YGNVEMZoCWqCp`woMSWP*vz|2C z2MtKCDV%lm+H_fxO?K+|scld*vG#lASfO@F_1iOvnHR=J^?tj2vvMNc=_zo41t0&G%E>DpI?*tsDB+J8pTOdcRe4 z@iZYJ$IXXiqnYw0yZnR6G;{`D7{Wu&!NGy?evBa>)d7+r3U41Vl26%(`mk+)1l|ee z0gCvCXzTRDX}-QDAt_0IUB^T+G#JXGi;8&_i>L^d)ZRg2wS!zLRyn=;5R4vkI4x(XQTIO_q97sJ z{GjpUktOEfn{t~H8Ye%QrUm>w#v||+ki@Yq$m%fX!EJM{gizlk%UJ4 z&z9b$P!>_w;Nw)10d;J|6X<{6@}gyI!C6hI<5H*;x|9EAZ(gVU46iHhAtAZ0j{m~S zpq-uhW2>pYG-D0o6XvbkH6|t{2Wi%C6Ul7e>*7xg=_58vHAztKv-;}atgSIAxevR8 zO~OI^JK6L$eQy}Cpa9)vV^irIx&5y%2pobZ6`T!1n4L-vwo?8BBth>dQAuRU;Rh~rfi{HJY%C>T!V!gu@DHz1%!(fd7`${$SmnN&Ol+o>KOSGYKCeqb0 z^MAjX3+&&CgJtXU`VGsAojAo@O8Zm9A9tVK8l{H$7=m>K=EV%=LRuTn6GM2x34)dI zF<3AXP53d03H(*`zTh|+SJSm{wS3#fQzrDaxB2Sx8Oz*=)cnJB=a|DN%`!+v3_1zQ zVY>Kq*TUK5sYtaW+Gw1NExRF4;=G0(41j6A)>rIOzU5J`%;u+)wF(g@ z)JT0q740Y8+3gCAIKBe(*=<}x~m5)>FH!t6w3lC<4W ze;LmM2`$=AO!D)LQqk%Ry|uKDmmHg=AW5JLlVxJtU33ceMfm|1Rd`T*#;(l2F}B)DAbOIcqegc4yNh+IlNoE-{7p?HK!TN z7Pq2E*=-H=2S}+Vx&<)J*ebQ;3|9VSBJ+Gu!;dkk_a`e5Mtck2S``NoR)#`el%p9A zmNkSi`}QX6uvOw|NaF`!@S(0AB6|lJ!_flr%g$vG>om+P8{B`b(6g>WmTWPIBO?RtKtBv+Arb>k#Ihqz1{fPUdcYYd zTAeGk4!oHAzNj9|vh9jr4?Gb509&}~dlw1lyup3#-|z$swGRFeOl3@;H(Z@bwqU5s zv$f3wCIGwBDURoPBXyKR%04e|?jYGJdaH+VHAbM&Wf`KPm?>Y@#}&jWkKyD8;fE)1 zM^KFE(0~6ApU0UWNDb9)9`o@gFgR>(*Lb#=pW?#4nmOj{I)EC18HNZpQ3# z=z#%_&7Yv7ehx5tNZNcnX&IpdhV;F|_ldj*jJ!9}qXUy>MR>`)i4xb2xNc#G!15~* zCi{@Cm~7&uuCARwax1-HwoOj1)w5^54jR;aE_=pPWR(W?oDpFY9^knHU8}DWZJyuJ+>NNuDAGYG5K?T7Bm*JfoB7$sg3l?*V3Wr@tUjQ3aSBB ze_w?zI4ez-BViZdu@?PVa_lLq4_+HF$G`R{+n<@ZG)H#=66HE`29?-zlPJ$xdT?!( zGBN^^=r;y-3l4Se8K2yiP7qzmBX;3iXf_3`2R6{UuT7WMM9W^=RBQ{|TU)j3zgh9~ zs{VVwVHod^_1hdL47(OZ)$h*n7SK8UoJx#K3uoWG6OSnA6tfZ=SJUdIm{6bh@200z zcRfAZfPy&3t6aTW*y9}8Bv*_^hF+FU8l3&>>YX5}^jk?#DROu?6oJ!lDHP1#2rA&2 zNl9Q-H05)#f-D9)>Ep-B+7XyB()-~HYVW-V64U0ep3eK+@Kx*e%#I0BfN%KYT+&ZC zwA9BdkI4`?Qd_*$e4dpFd(0zDPRcK?!d+A+`=YwKC^Kb9H+%+vya~?SM+(`ntjy!f zantZe0R|o2%#piH$(FI{S(%Z6j!C2iF2sRUY4F9vXn1UX-Gezy1HNzIJP2^^74I5b zK;Y@oqc^S(i6I`-*;(4$ob&!sr4CFL+v?8|vrt)^@|#8ROd)Xc{Km2}-BtSD`6eKnf_iA+1 zV={}~#L_Y&?HPcg2osC0#JF*^4UCuVq|qoEI2-D!KEubAp!xky#-S>PdOslw-2Z%yF9zEV(g{i=PGF*`*Tp`c+6J$ zFOF0h|&1AN$S8PjPhbkE~gg^^_V3hJ3*nOdeA~oCT+j zER}^N^mAig9T*veG6}nshkHI_6%oe$VfRA30Qf^sFHu%AWl~8z?%kpTd80*7)x!MJ;a9;)5$>Do0Di{`uL}(g^S5JoevCuo9BuzTdwkLAz@fpTY;GZiz zP-mhpOf~^=Lu^pXsGYyR|6K-Eb-YBtUjF9Q`3YLZiow-SMip}qK?HDKw*P&>s_(k$ z3w*0f`2fH&guu;5nbkUsw@!d&={1oW347k_m7e|i2FI)UM0iD(`<@@5{mOFjp7Z9~ zK`>*9Y)tGc^93!YRFYZ|A3zmGc+k=}w+IseFSZalsH-1&j9zth*x&y=`FTjcbGro{ z#;cJ|y7LiUlqbIu!hm?&4S#+-Q)v+K{CP+Dx}LoJ5n8TSu+f)-)CFvZqB=tAm@+B@ zA-8{D5&wMiW~SJxF&y1oW^cdmmoG|(aNV4!Rj)1ub|M}!ucr1b@#SjjJy;QNmc;i(MC)KHN4mt>#)KAWGws?5 zuKI7^JQtexVMOOP-;j=tW_2RH1JRsyVP2cp(o1V?`%n=9fY++@^a-z4$Ka>&4=7*k zr_ngU(G3ZiX99u4g7ttn$Qn3w`1vAay1le|>GVO`pw;9sF;~!$P$*P@gaq?tfWT`* zKD+3+v}m9gBMUGI(?ckI_zRGB`N@Y}U0VgCo*Ls2t@^ z)#Z^!XN+g<^*vW*B20k&qm2C66;<^=x)>A0IdcI(@-ZEaJx3_O@&$k6Jp`pVZ9(<~ z`5`cgZ0Gh67&HuvLw*OvvCv>fl5}DQXaUBf9f?wVBb(?LEVYZL)7O@c0liT4W6f7| zjxXuop{`EvcZ8Jn>{$h>fEpuAJfZ+wPyWaY;X3RG4YvxFZ(m;%c)E7*-v8ZVaK&F0 zTT(GbqhQk)Xcx$mSHI(meA#KTGV7n5dw&0oov!Uta`4Do;mIUY~!4%)8n2z<_syagvk|jm%rEyc^BY z>gq2sEBOUr-g9$0wfc3_<=Z}n0tG!>WPWnYE)Jg_R`@;*4*p8P)C=1ae~dya!ztAL zt8GEjI>Z+5ObF4O*kuw$LraT70f}_T){Z~b)3djrfRZLCgIo&Y(Ut|syA@QduaNDd zq(mCQES&Nng$j|i$51Xrwu><5x!hljvD-Bj>(`vp9RV$4ye-=P4aO9t8-QkF`A4NB zj$<_o+y45Jp?kNapsT8CXl$I)R=>XK8A_PgcyzW#{xJ#zmAEyKYvQ1wYMn=)F)*nFMKnIRkr)U_(sBnn900rJ7Ps_%g&rR0m)*s>tH1x5-5 zKuS2Be%Y;F4!xsYYgu$AQ1WbZOf!cJ4F4o`c{KAZqEj81=Dz-JMx}(B)-UPJ>gr?9 z%03)X5hehYGB^uM0yXjjgFJ)SO_Z%;Yy4Gb)M{CL2QvcPm>>x!|laS&~G z-}DvF3P_iW?{<3v>;&q*_Rv~8f{|h!dyI$Jhu5E`99+xvS+aHBSVT9CMwq+|_2Jz* z+>~!soCyU4%zYY~&Qi<06hj^`R7#7)t0Y!GE}-J z929ErM^Xj7-|!`f1SP19wcAfsws$=>c|zq!<@fXkgIq#phWG`r{}sVj z`@M^uS=z#<#y+DB)yp{{NfyU{?8uR3+e*!Iken$hX8oKBH;IbBY#v?9=WEgfwLdhw ze?Ek4rJQW~O&Uj-L(4!Yi{F}fHfYQb2vDvgfJ;HMv}_kD>}@USw7nHZCIvYMbXZwS zPH0`85I>(PYv!s~G?MhN`(xmPhLF93-a#og$8OT3zW&sle-AN>n4@H<$ydx&3}7#k zDs|-Uw|Ys%&BliOT=}yaTq^QM&v|W?;YbV*r=GYb8qSW%+gx)0^dFz3aWvnrLJPbPf6&3BGG)9jj3a`hPq zIcj7z#@)1PSFap>TOJ&}>`Pj?Cj|T67oTbBsik5N^~}h+zmHx2+p3<`{Xs<7pq7a~ zEo;f>s9&1^H3I{R*hcLUx$SxxY2RDfT^k!B2`V>ePF}ujQX6bB=w4tm)tfMGjo~f1 zr=#oDZh_AWlCxpnU@Tf#I1To980Bp|&fs-e$IJSZ%D>H=^Jw!#)}Hy6?3e?%ohC9P z$0D!iUdZi8NPuk;juJQo5Y>F*o_$k}P@n#sa`ZTO=wmf7o1XXgW9kUVrk8|W3!*{j z`)qH-pK5Gw7R6{6>>qRlO3teITG>06{-KnuhhLjYI(fzhli9^#7JYfi_}ly6#)s#gkzPh3mf zv8BHSEm^uBe!(fdq2ctJjp3T8i8dUFKgyzS&A0~V_oIF=oskb?*4wq?@z`bclZ{a{XySq*Ij16V7WWjUXPhDi*$Y@!Rbo8kqte?&!3J zd}*iPu_$bDk%~?N{Oyvz3y)R&2%R`^Y;(>r#N;w8{qX0-3wHT%b_*yNE=DPWS2=oG zCbvC&Ni!nrMh@rLqpJzFO?+I{??AJx_%k%5Kz1&sIU^&VOKP%od*X3`_%y5hwQFb2 zoN*}CW0Y&Om+_9Dsi~`j#?}OI55{I7Ls}L8oT2lMuzzFs%4 zb8k@pRTDF_T%db+K!xU!6~_k?c(yeE)lLk?T)eLXZWPFz&P5LnD{LMe00kLsYrONX zCs&Tof}0^|(QXWy%~}h4Q$A>R_wXZd?y-2T41;v>2V=muXqAYV*F^hCkEM!mH}&}^ z*v-2^@&Y~LPcfn-vtee4sm}vQ^MDrOG?7Urrx>(x1H55QgT=Plp>p@&9x1I?+-J^w zH#!922eE3$*JYkbH2h{Rfbb*&o*B{Y1T;91mui7w{Do}GP^m+aLz$+?*LR%ZLI&NW z`%4q#;GCnHg%fx%p`^b4Y3uc~al)|lB!D~yCHcIoO!6}}U$ULHr5<3V@OH&el|59p zq1(m1X$vP(0CL#y*H`B5?5UpFObbte;4QD`9>f6(WQUoUEcxC+j3p4I2)0d<>IEJi z{f_ULQa9iG&Bi7LN4>bXO}OQ@%X$1K>O|f=0Jq-@E->0iOwEHsAgMu$FEPtozj8W6(^G_tYHcoy@!D*km;a4ylK!ifL#g08c3 zNzG?}|DQ`|<{g|BZEo;7qRWuS+jX4klFPhr)h9XWOOldYReR6Lu%dnk3?bq${Mg&>($&Ck@NhNF!aSlnk-B_up& zKdX$+LlFX(5XH^8uKF9joFa-5x40AmQaue{SQhkiF+e~-^x zYvNy+DH`;DToT)`fsmaiGD!K}OZJ8duGi&Dpf8Qu?Kb0;rv?x#(XG(#Q^6UC(@M%; zY!RdVb@vLO5*zbPwLJxup0iaF=s4${-DQ*WT$e0S7rKnTjI_7oK_QNlK!lzBJFzGf z3za!Snu7$R0yD4v^pkn~0)^Fdcu z?zaSSgKV9~v4j?f4}pFZ9#^THJ<^hKw3ODN|@8_IS2tv#{@aBV|piScu>FKpUc<&H0`DM3v*~Rsz3@-Zo=kp zX`RTtBu|aH*^@AGLe?8&v{)vj)7jca4%y zJJcb%iCDu44!YmLln}IlIp;Fe3HFy5VapRy1XtBl@${?X$zh8#gT*Qd>$sQaJk|=4 zcm!K1BABXgBQXTZB{8H8!)jO}d`Pnk2~4`g*k$0^Gvru`3@d8^JN;bhvTHQe@50$< zdW#6~2_{DP^nuyc)RyLTObTV_8mBIAiA`gl*#WJ3!Ac+8zaTumIY+wq>UJP zvR{GZ^{ELMMg&NR4AAN2U)h>^iQ{*f6ApWJZuO} z<7ISKdQMAE**&g!%La56-CYJ#1krRIx2e?Br#jNN3tB==v^7}vLrGF~`<2LQHMV9U zXFfMfL_o>(?Q6*ot|I{M5V9WdE*^-!1aL=2m5cT+$`0J-)AIN(a1TrXx+c8=TNh7S zh>=1@6+?9isq}&2`}|QDVP8q&*$C%BkqHJf7X4P#>fjd5*4RYmlIPPl+; zAs(2^Lh}jrLW$gyoRxS2b;VY8=Ty!4tgzs(>+$Dtyi(EG#MsYN~26&EUS);nZu$ z&rr!K?qP(C5WElrkX^q_Ii{zk?#|U`Z@K{|vBil5qQekQHT*X04+Jf34TMhsz5zuv zl@s&Pz@#*=tpEOKxOZ`qfPv2bgGK-Tbh=^4i^(Kz<7n`==rl`)g~qeFCr_n+jo(~C zi%tfi?vdKC1WeZ0a=TT?>;Wjf%>b?I`+rmhaEAVUKER9HFHgNxtfl&0Hl%&mjy9{} zNV7%N1}3<_sjI1}A?RZELCV?61G+dOJUt~q=eT+Exrf-Hg}9-Aj#A&0cK^R13XnNtp_M33AmqV@)5U%1{)eXdN${IFY2~n9lnL0DLBPDo~qo(*DdfsI;zF{f&V(aos<~ zr-fZZC0Gn_?0*s(+Ew@I9hWfnUa*=9L2tpymR5NVlsEkL$=u2TB)YMt;O}9$TLy-n z06eT8kFDZehX!5BssBMY+|Z>}q5n&OF+XquY+4r($e7uwQwf92$*wk!ie}T(Z3hkj zKta~Q*Z+LdgyLMa=D!hRZGLBEL0zEHR?}jevc7EdVWT@j8$CyC%?T>WZwW0AK49)f zeg9%|_t}ZF(){Fi_~@lo5ht&1Y551_XXd`)42$S~D+IVRtT{+Zmem-g6*crv zU&$Nfh2>S)Cap~K%(m2Nhs@3|`Cn!q zH*S(9bG548haDYoY;1s=wHvJy*HK#stzJfq#L?1F+$*wxWACx!Ln;!v2OK7xL;-)b4(FQb|Q1Z?mh{)I?B zCYt~c2el2r-icki9(_WiO+`m1N7+LpC}X)`WSEU`p4MYQCPqShU{{QLbuc?g)?-3G zP8JItj>r25VmAfmW;K>JT@&oLpKZOt$h8hEwd1}isi}EfrBI3hx+RkGh_o^{$rchH z%0`V$^$vkvK^4KrQWyKI;?9ykGwGS2fe!KDK_DhnGHnx!^%KH?O3BK}1sQ#s zP@A9tyIA2Nh6fm|QVc9OmpN?M+K|}`iKY}hzqI2Rb^!)qr9nag5^>v8|?M!U!^WM+9mYaN!eej{Irk3{4Pc!YVvFAtqvcVnZ40NdaKD17A#HC(6 zZKhOr;Kq98wfB@CZuC8`h&eg=Y<<&mmPc>1Ke32T8zRC$&&tpFv7Tonk0t)#b5f-t z5ZExpg8nQC&OZ^A9dQHcZ|W7u7dD$N=Y6N&)ZyXloa z-My)w^Z#NH2RTrC>2kSPf?Ad~u_hQ*it&_J$n;w77uCxl@!UD|-v8`1K}M$Ip1;04 z0q~7u3jVC+2janyWk!C?DgvS5 zstj`;Ay8T)uD_Nu-dql&YR9+$j44nUy{Yn1vg|v|LArhR(^Po>(NKc<1>4F&l{-;l z++Qp&e2o(>MPX)LcFq$V2<%9U&VhAwYvmY!izS57a#Z%F(D7W&;~sC*?bx~=8ZmwB z!wvsi39&l-l5NcqYu~w=+8zXqKMfP_GTYeR?B2^55#2IArRhc+VY1YJfFm$zaK;Sd zYPH_7lf1?+?>)VdAfVOo@AN;bh_;nfefa|)cjcbC<7ap&l=qHZMg`<$m0sIB;C{15 z^tVBWMEH9b_&Ih{T}v}l>e%q~I?BTRQPYdHXnpe$22V-}TOS&Xc`kqTBTnUE6(jiI zkATF`g@YY8hX469FUK6}(~cl|HCr5diSrfRb0C#nx1JMmO9Au&;c+aVq2#@LT-=Tt zSxE=VpQSCJo+qZTVX%d`W3YSCE%`p(*l_>&Ti4xPB;+sA^28C({v3G$x@owmCJ-)p z5UR>`3wP;xJ#HXx+_xh#wQJ*2#WwM`V*RXH0}b3Y#X>rkF^kS9{X?O`s7}0l3&E$AYNeH#k&% zsn(JeS}ezh0V=(RoNsYL$Z0y5@>t)$eHF&md0d&G!;b$f_Cgs4s;6x7hwtCMPv(pC z9MmIZ{S7f#POspnkSm|55JSO}T(D|A(?VHii}2QzNd4^_O0xfcd+`YGmC! z{*OE&*{KYL#@S@mp4U25(E}WXZ0X<62#^#D>g46Y_ZbWQI?b=;y*Y1<_nJq8YU~tY z;x4uw2h&ph8G~CTYb+zcM8(d%PEO}Lb!7TQwOI6!Y_fmMmE%N`hdD|chlacA>K2={ zN*!Q1yzy@vq7JFy>D^->$?eh;$#YH48iACB8Np4X`?pxrkC2;ZFAvr2F(7bwmGLN+ z3Yn)>{#hM-IV!nWp2TJeVH>^QW#`$~o@)1d@<(9`RB2QbhzbpnBKtKmJ538Frr5|N zXa5X39GZtJq?f-if+Ei9mR)gENyI^$TP%iGVKRGW-c>|DYk7-qWz#dP&TTAqqCaq5 z_h0&&UycG9RJe7ijtqvF5fG_2l@PBhA2HG<8k#MNL9XL!oL;S9zIRtsK1Mv6Kl9n; ztKt^%e+yM~)YWsl6;$^8brcqrZ!P6n^o2%Mtv1Rp{`=+7!=#TWg37u&UZO*>jK1jh z@19P%es~JZv#$^F=_bpQ00!BF zgj@kn;;49PqHU0NOZCO}#+Wz=dMI_lplba|Bmt%Dx;I|*7ASe^FplBy!BUS&O>_Do2Z=m5WgTyBX;9g5bt>ZcwcisKmZ_?zP>(U zAPl@0@s{AeCDvHN+tn=>+PDi!3#;ywVk@_SG5S$3Wmxn=0s=oHW+tXh#2#T=5p|YH z;cqR#Wd%TGk4U+d$8`EcaP#4gU66YQ1_lzPcgSVR>;yqni=h$LbOMMNMazWkU=f14 zE&*ba4)jA$LPFqpwmuQ{2{^4jARxe4IGkGB76N8)M{LHfgsq2I8%1;qaN`DJOGh7| zuKob!9xwdPfbSmlLp`^RV_0#f2P0mbf@g^=S>h{$4G}*|T24+O{6#{7%8We}gitgG zCY7L7K{aUASMrQUH^V{)2QYS~O$aK0Ci@raY@h?j#tG?Bngvni2(&Ya6GP=StTmX7 zfE~I!q2-i3wO;70jzWKC*MQKmRp?gyC|RcMKH$Z5U*TgN!D=czP`ME|El~P@?VW2- z6IT?+H-Hh40#Y=HVws6bq(L4AgSKcb52Xr%6~xAdXA~8}L!?GK6=Ez(iHe3tP*eni zN>Nm5QmiFWlnz(~0c`{{9iaw<3LU5pmZbls(hjZDp%pTu5^%(+uJ5zK=B)yb-5lGK6E1vT@0bU9b_B3~A|?)W0=&S&+OlY%zGm z73x?-pd^8CxLRBe@VKX^2T>m$1@&9HbrYYn?JN^6n-Hl*!(k#!agz4nU~KA~&o<8%VC{~Z6O6?l?qF`E)^D1s;N}yUGAY`I2qeA2 zIKN~>Q7{%{2b?jG35?NuUgZF12Yf;{1TRW2GCBBL0Ox2aM(n|AAHn(2hC_Hm=KoMHv!;w5O%oqv0$~RXW4*vntV2E}WEngL1Xi+TJ^0-1oqSo)|(H&`jFtl%3pWpH`lf%MzXPRmI4_LMhsR}whLJnE4 zETa+%r^XXE64|pV>=pX?{loDO($;rXIfz2b?t&@)?omJFF2s_kuC6Le+PSD}jK?dk zryKF3sD{pUj`yLRn<5slBM+JhU&JLDgu6*+?(A_b=B9Ec)Lft%(u^6;FB%YS8(3l+ zaoZc+{ACGM{tboQX4k{}*h(i=jJ37TVcrxq=!}#Pdf&ZmE50V)X=-Nstz93fx4QZr zrBijZRcMZi8BCU+!c-V9M?5e zLUUZ@lBs4U%%EqOh8W-)w^{t;OW)|ymKi8UEN0&-H=E~2wkjY<#lFO?*q^L}3`#B$AJ$iMc*xb_`SrK7ct z-FIB4|1S+3d-_*b`s&ixP5I-mF}4R^_saj-D>|OeA~xcd)jYmr5Mu-3=M&(4?)`A# E@6~${NB{r; diff --git a/website/assets/webApp/steps/step-code-pt.png b/website/assets/webApp/steps/step-code-pt.png deleted file mode 100644 index 76c015e97a08acc82d02495b09d1e575cd3ff7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65161 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 E@6~${NB{r; diff --git a/website/assets/webApp/steps/step-test-de.png b/website/assets/webApp/steps/step-test-de.png deleted file mode 100644 index e86a2417284d9d94a04a942c4c9d968acd5aa4ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55454 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 diff --git a/website/assets/webApp/steps/step-test-en.png b/website/assets/webApp/steps/step-test-en.png deleted file mode 100644 index 9dfd8c4ebaf22a2fa5655abb7b7e9c9e31b58d48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52585 zcmeFZc{J4h|39p#h$4yXlq_Y5>}x3sAlI1}g(zzgGIp{KNz#NE``CAl zeVgpt{haIbz0db|zUThqKKK3K@BHRm=eU|QGw;{?xjdea$KyE>k2LO|JIi#IgoNar z%7c5_BqXGBBqS$qlAnZUl85`1NJ!dms@%Jy>oc@8>g}V8I8s=1cS=cDS*`E%r(nG! z9r=AoW`Hv2X;i+WtAN8D@4ib6N_R?&ubkx#IrZj>9M{J%t}q(%`M|xAt^Mg=2iEa4 zC+r%x7uVN0Z+SbVY<;zn$FraorBA@yk^Dno4%Z?656M3h=l}glzVg5R`2X_|L=S%4OhP#jh`2%WW2!4Y*A_u!mze~C?F6MBT=*%hTrXcv|qgP3AdP^ zpI?YVb&0CS{YXfd>Fj)@YG>x2oKx{dl1^#fM?EbPo2H<>&u0+B??SS#5#oC^Yug)zdp0a+_R>?wYW$ zYwza^hkKi)g9XVst}OZn26bkQ-)|@Oc_Mo}6g^b=Fs@-Vs(It9v9YoKOQllES(84E z`aNF`4&)S$>#{$8Hqg>d$Lk`*-aiaIL(L-RXX)rjQ6}dT5C~i> z^iEDrR??z+b+cfxmV;c*f9tZ8n=P&gDXcZfb3t*Ex@K$fN9$Amd) zp0=}5o6jyi4=rfMtLU{lW^80c&tyMdYGLE&*ZNMFVZN4) zl~pR}pc!*T#8gWQq3!l4@lt-Dh>KZp;ywa#?%cU2tiHw-i1Ot>v&%gUee#fBt-XqoHQG(wORWXrmd62$#&QTcLPg)jTY|t-U?T$}sV; z-f#0&L`1*nTkQoxi?FcpGxd^c=L)0p@-vK7FK*}9Y;$vQk-eRwK_Ha0SR_k=ZEZiJ zu180=`){w@Vv4RU3O?Mluk>HSovtH4K|)M-4F&ZcH#awR?s&{JqnzJNV`%pM7?#4k zJUO=+TW#%-96SDMcNTpe9er)L*J3`V0qgJ71mFKwo@?!3JD3d5SQIEAnS~IU+{oNiv{$+M^=FcB7F)_@KdnpfpQd|_YzUore`u_WOb2x*b zw@MVZ3SF>4zeV(0ivXNR|L-BMIk9C-P9=5KW5FFg^TwQubyRetp*4dcg+XV}Y^*e+gVrKOE~ z_l|@7yYonD(Z!f)BO{})$4B?$TRx$#Q?4cFJP!{)$0$<0+&Xw!?Ab6i8~?1Nh8A5) zd#m5<$^R6wd3}9-NIVtt3uJlrxLx%BJTOI8`LOZ4=5dU~!bHsynKN`qxq4napN4n;NQ zzg{nmzk6%Qcv#x)k*2MIxP(9$3*6<)1afcKOE|d=&-{!)UU! zq+KR%D=8@@2^#WOmxsU1lyn?;eRQ}lE-v2R-@iJnUt)m~L~e&af4(wq`o(GV1+=}y zw;>rtUfaKazkfH52VEVSB8e~mpk+?d2I1= zhD}#P6{BAtZ2A4`LBm|;8}9gs)SRPg5)$&2TtzK9Ejo#(Ltlap{bHs=c>a+5Gk(d7 zQNf`fz!fh7A)_TPGq&@B-+N^gU7VK};kho#6#Yz7N;LvypPa)O{j;ua6u@GcQDNBY zxuGNz*nmG^}tO z-1zgyI;CAaaL=lxB_gOHW7;RaMbz@w#PVdx?QFVe}y`x8)-gNbu z!xYtHI=^&(lyTN`E+$y*p6LKPV0tH_)pizzPnwsZ4G4xzajYY3JN+}%gTKG zW`4bSO*7n;b!l*r6z#R#+CSLYxkJDj8<5sCo1dpBO-oFxGT;YL4T+x6t)3DT6MIbR zK)1br2tAoi&dBcO8LE65j$2fF_$tY&rmW0EjV)}!S+nuz~p&LI$oK?v9KBE@A&|>O3blDf%Uou{vU4tHS8q0-3*;hFsdDNLS$)!9#7ZeqZIf@fx$E%!I z_4@v?F3+>Ut}No5MczNGso7034a#dYgUCr2Uyg$gKY%CLC0Cj^|VN6U+WNfTM#c3@%Xj~1)L1~RhkLx zmHTOPd*?_dzI?FR4UN^dzj--8e%ztBUfh4nv1&N*ih}R{VNg`_#)vz%JxwNQS~99R zWa9kV{zuexECHG`n|wfZi{*xo?C$Pvz5lj#D390LZNo%Bn+LmuRk*IL7WYJjbxXso z-2;rnKYt|0EJXmNZ?ICn8Zf*c~u>?Ah;4JEo})2AsDL`dXWM}>9Q%g-Kt z$RDYAkNEhp?&c+vu^-au@(q7khOp(ka-=3c( z05RmD$NI%RBcc(}vGIpEN(0vY?;phR4<7&Zx2J+f`e&Q;j~q}dx}k0=p>&-lu_WbwE0NK(tf zUvpG9?Y^uKh0tj@+!_wyfV(FL_;KmyMNY=Jleft5nEN5bwAc=uuO?2EGLJXK6vmX&qn#(GyCKA z#nL7lRXTL=7qJRQJ8$l@LB*yT5o~kQ`1fIGIJj8cFxF`J@2PrA2A3vo?5{Q`T)PG_ z!l#pCoBT6*m~>FE)A{XT9_l*A^_f3kHau!-YAPx!%J|E9kMonxE*DiI$^*|#mMtTn z8Hacam1rOkhV1QLRo7H#u>>zPk|ykSxJG4oZBf;}MM%-2NcXMZR8J2^?Yh=h)%-rc@xX1Q|8m8fH*e5zZtKkq!3XOYiSYpUfs!W@ zV?I}-c6`?15IL&v;_vd+A8fP@xBqxnd!b=`)eGHjUCyOam{~LE2-x4cywuU}N@2~j zK0jHu3@nCif7n6y5A-xl1PcZm@H z+#mK*Uduz9>lk*mIFC_J+~(3?Jk56};r9>AZLs~K%RQP3?O1Fv3KjY4RozDG4WXJD z+Qdi1gCW+NrWfaubNc%G<&O^toSdAbr>Wk_2m0lcw;jO{$*xyy^0a*LPe&RI*0tu% zks~7`fcbv>_yI`J6#)|#lxepGXYT1*%XFlXs_nx=7J3e8$e=QP&|9~?AP5tDL{kt_V-&`TX!Ujk{0GZb<3)z$+l-@W_gwp(CWe$qy}=gZE{jv%tOx3^bRT--jHoBVsrmck2y zNSOnW8YrXAVMd!%BohIYE7F|zv_vyv*JN!(&*D`Sq{+55SVjmN8zuqkN{SC)(lvC! zwzmgDT;5ew+}m8-UdS&#`rD)VEIeSNg@=+sux>slg`D$-UV+c-Tm6CM&CN}?!0Vhd z)WJJVf9HD)nO*WHj;3Q3zW(i26Hj@1u(R$x=8GSz_a~(c*c!B94_IqV;L{oS_B=W| z+A)cime#<9x;IV8uxutbBWPi;+{VQv`1o*JM@MIWYgxvwo69h9PXrXCr=$FbOVp& z54VSaRiKuSC*ZLS%az0FehYbPYcBLF!8?=T@VlnK)%^95J>J16JQif&VV)qY^-dw#efB3gYJf-mIlJ$LIAVc$Xa!;ol>MdL) z4{4i~4%jIvT3pg6PiXZx`c3R@Z@ zGZn$J_jmpx0|O@W`i%;k&FhWdzkk1{MMX_b9fQl{^^;9M12?L2*aglrYY3Ou4_OOAm_xn9rg#qRDd`#et%&`l~(wfSC={(?Yg^m7(@mNRhoU}fW?FQM3kz(1b01^n_deIv1;8o3fBzo( z6WcB8S51=xaQ*-?uExsJUc7km!TV*W2U-chseJwnzg(A)Ko>L37PK?T>{R^(Y8k*P zxUUox6#S3NUJq3^<>PeX6L83v9=!b8h$F{wKO+YzYo=T zZ);hN{JpTn3l4I%B*FHU7NBXD`||ZUe!(m}w7gZ^aFmRwdkj3CPR_%c=@=Qfhztnx zHbL~O=(t^=O!$o}Uuo~HHBldL76(@l$2KU5BAlF)gEkq5b6K%P4M%$r?5DRDzC9zg zz{DV{U7pz6+kYT9=6BOqm4s?T%OzG7(E%k98~tZ~{c2yQ=n(9XxU zS$NYMf`We}SGIh@;E%GY|#YXd{2txfwNb;+c^IsS`;p2bbQx^)OYD@)6gYZqy0kM?j4 zG3*Lsc*5JHq>K&ul!rO!mD(unR@FO#=p~V;<|(%ti0~e$WM^enEf{GZtzA z^aDMHOWxyw68RDObkDV=?Ycjy3D(TCON@^+1Rv+9rwsV+z#z$+4K*QP@;SrF*a`!F zP1*GyfFpvTr$jSLoM)95b)hZLTg*86n+w^fmo@hV*z3XS)LbPKld-sKYA1uoJaI@+ z13q=x-gEcQJ^HZiXC?cLgoJ?v$zxLND58Q#S)Xn^R0JNT%XVq7oJVcOvHB8vG(9=l z$iQG=V8Ex9l|_JFZTxGX;RW&R1nuOvZ<}3HbL*-@m?5M0EY1wO2Gao_eE$B2KtU5p3 zffuaG74t%V!WWk+uGP`QgVQ6@{rlc_oAvCn<@`vqy+gyv{4-_0)ip ztJS9eklne-6fH^)X)BnUOEWUK!Gd}JkbAEIxNFSx?(+V~$~}$7td6RuZr0mFP|BKV zFR!HarE+m`y=%8F#u)=VCU=!&F)2=>DRTr;sx7es4Y!KLMLKP11+BRjQSB5V^JVTQ)I$_HtwIah_?T&4P+QUokd00j$6h+Y-#c&?UT=hbn*^ z|Fx2~MnJ|}ow7J_g5>c{-fLwAFRuuZ<0qII8xOztivLMZG>W=t`t*#uK-wwgtT)$u z`eoU9udD*iRPv-!q2zpNQ$qV!`f%^T!NR9{OD=yF0b^{vc z`)A!s2j6H|6p94M^wt5*kkB>=@3m6+Yh-)Tby zN;^GXotWa1lJXs^^ED~1T5ghx(V@F`<3`leL!Sy!z`ihlnU~(Xe_uzH)LoG;GA=Ex zz39gE>(|LoC(b+SB6JYv3YQ^#jU00u0={P)nxM#68VLGq=jh(2Cepk1zxk4#JqvYX zNt1qr^6XjQ^n$rVV1{Fsa7vYQy)sOXUWEMF-VLxW_g$N4)iW|jSYY?I+6ifuiw3UC*}Spb?8V(HBf$>h&~VWhAW>^LfH%pikYr-8f|S2d!>9; z3f*Az&6%g|y2eQu-u5|z&xgnac^w~?4KLRgomprYX6;0s4;$v!aFCmV3d&#_@Nv=4&u{OuR+hp39uxJzux`|PF8ckQds1Pfusai99^ChdH?qYND1c(%&iMHQ_U3b0&xdF7 z%4fu$>)*u&AL-yW;qssblXDl9sH5)DEb%XB#59|sQj+3t}rm%Lg)9r@JYAHf7&;t#`l&>1?Ra1 z+D%halg;mUZ<3Pmgk2{9tN>I%dJ;0OB*iIR`&hjQZYvlZJC{# zJjP1>W=l^^WnpBLf@+xJ{Iv$U+wAOY6ukf{FK^QKNGN!hG6nkpx0zp5YrnfO3&nnt zQmC#3NHmprZY5=9`b(GUp^`gQ!CW(TxW8?qK7o-Lxb>H6p;jIUMfm+Egg@;<^?$oT zQ-h*0J~9$8@$DJBr(V|aH&SXUCQ=UcA75_Xd{*%nAOF%*j6u}&;&A%`U!h6p zFJ{}&0x<4EEfaWlDl;n!@ah=gS<#!1xjnAT#e;HA?MvpplilwN6AXY~kU62`Syshf z77iKhZU_!eq#TU9aNz=0;Wz+^9Q|-7bU?t-@~-=(L^Lkl@U zdfG=e9n{Qb45s`V1!vWm-y&qZu~?Cgs%h|{XVvg%t|ogW*RYPj6Hwx;xdB zVTc5&s@eR>x%#!?VmeZ(BM-!jFEaf;=u46|ie`78R{gTpIZJhsF`&Yw-)r@rhEYDJ zQ^)StH0lABfjVEp+GNweT4)OvyE=-l!r~WqT2&LR$_HhGj}D;pWdv@dwrk3UH$`C? zp{PSIlWjA;7v<0MQ<;h@jO=>Dpg_SR8OhF)2qi;dKaNvnOmW|sq<^iT;L%zebXq8D zQ97T8!bE@>snsJ|snIWyfcI6>GLSvT_2-+tF|w|uY{Xt)M&6)OQAumyu7S{S<&&he z#BX;8ewRI!@Td!w%NkIzSQlOUaVmyE$n!re&`1dWuH2Zwv)@B2Ld?&4hh1-3=G!tK zta(XbUWiyOQaM&VC6ODmA0F*9l`{YZQ@|gy+|!5|cH)*FGf8`H6QB0woBOk0=WULa z9`N;vE^q6kU6Smcn17G0a@8ljJ05qOR(uZ62s~L(ZpV)^bA!i^j)yTY`U3`Qs$eLyxtZ$zN(=4!o*4;EHd*K;UxB=Y6Ld7WPD0m z-yZLqUQu46eLE&AGV{njkNICA@3xHotK^*e^`F5|nfAlk_NIIDE~ca)8NBdkRr4^@ zuF|Z6N$8@YubERYE<%KWA_=mx7kU(bHz$EhrRPgx;-ADs`tYVal)ac{Nwd9 z&ih+W-@Zj8=Rl#N1bh_>K}7c?DcZvL(IeCy$oqOW^HfB*gs3**YbqV4-|P^<-^e=Qa&K@}(L&bSY(2$Fwa=o|l?wr}g_ zrw9D{@>VBIKTOd-%U#?wrgg5WOaU1(9<(0~JTvEwd^IB@rfkc@J)*eyw+OxBgHO8_ zdivY~KaTU?1MAc$8)QL_hrm;vHxhhA%lupd|-Jiy=kI|w-s7E z45vLaGYJI+zadkdfe5jYo+#_88gN*xa*hJW#4c$2TkDvN7&bX^LBY5}H^7cw=)-o2 z<8s@sVL89QW|!{xOp_9QF&^9r+Dcj=V=j3}i-?F6>N(tL{2CVr&XT=NW*T;O>=3u% z1{A;I&yq~^^lZTCCd3DXpMR^}3ggY1?CPdpEQ^%m&C8DB!yr9OPfx?V$)lp}>Z%nK zWU{>?SL?O>XM3O27l{jIRIT{%;lrny+W=JHZ|-U7(n-;j8Jga`Lo?#!?d0U-yZa^~ zp_fgrHszr;G|mN=IumD=mJ{WJsmaOKH!p9k3XN1b#|}EK^yGRwI);n~XQ~(SXxF-H zkM>v@&Ua@sbN*P}788{mv{F-4Jb1+zY=GVhUs$jYZ|bpEtSx`o^95)!D;w(9R#zfz z0z@RYG9h<7Bw18cR6;mPgzXJK$%L5ioSl?_j|LqlOuHKEM` z=Y`J*+H1)OGU8E*%gKw(l;54vxn(of+dCuu=8Yz)`X(!X&qCRxemNR5&E4=S@x~)n zshDZWD=M@p$*=LJ)Z?+sYKlEya=4RFC@=ITf87CZ_WAJX4jE^>QPb+B> zQG+#d&rkBG<`rGc?NN_8=c>kspli1jF)XYEP2Icpj@y5nYsWmiRl|k6Ls3ErjQOq+v|l3wP4md`Q!l(0Sb6VMldkArhfC; z837wz!_Gowg9Q>JE?G^JsS3w^Fz;)oN=B%k$XUEc6Shmh-@ku<+#MST6P1kj3SbWG zDta{?U<29)Ya*DWM&qO20~AFIAgZ}h^!AU4cnb>)Rn_xB`^yW!Y_(_S*(oQK0 zbWzH~7khiPVPRo7lYLF__;Feu>_lvjxZ^?WFxK;u6cLGhj;nO%I+JPA`5-2NhL(Y0 zyIbw}ivd;GYYbb8`|#7?z^RA^QE_RA_eVy4B`DN&PR_1nF9DL`v~+V}BmlcATM zkN7SAo}2q@lkU3#T1Q7~Yi0s)h;2zk7TQ~|b}kcVV*EOpX>}8&d{x17A$xnw9|wG) zi0=lSiU^r%q9?Ly_%4A!fTIASPt@!-dxqw%%hhn=<)x)viwMn7)*slJnX$uNpS>e;VZEGzJHO_9b9})n92iK5VUay;xK|6$z-)W4^o3b_OYU%(t!C zDcWu;s*C6oGW}XtTDlGdbm^d@t;d;v`&)rz42Xq57~WM?RkX;ui&Fs`-9+P{!r@;F z@QFa(=963B(nl@&DJq6w@e=RJ^80>5i=@lICV_cl=0Oc+dUDq^Go@+rvV>E>@lic9 za~jx$UJP+-rtg755xhIg0LWh5&(B_6eRN~i6y)U*@A1RDymfVT!F2qn)Al>zCTIqg z9`iO(w4s{_R9hP2Jk#+`HM5CetnBR*i^`l^pJTx&-M~+sP&?>kO zcLE*knY>m;N?|~Nl=bQ_NCAOO-gl!H3>G#v)D-8==^$n;V-q}W>B%O6e}^};>H#WC z*y1$CwQ&~luOqC}?vbjfx&%}7{JdQpSM?|hXKf<~ka&s@U}T7>;$>G;yB9~rf^lVW zzImDaV;mPn2-Mv!TQ~Hme1_2LWUv;fs|&w>#TI*)hRm=ZLK1pWt?RU3ET)O@skHRt z2Qv`6^kb&avkQ8o1NnV?WsAUZ8`WIqy_ycQHkoOdPyHBVDco|u`bgf$C7zQ=oThA1 z9tv3MHJ~1KRHdEf z=oo^d74VZcp{qaW7xB41V(=0Z*_n6b$3gS$yh z)m~(W8g#U-*JWmACg*gj%KiE^okql_<0=d0%uoa0EDMn)00>z4y$FTU%NLWDHqtr@ zzID)Y+Atj-DuFACFRV7R*nz_G`<-w!&6T#9jW!!N1@|O=Umg*WOw9}l1B#=FSpO#1 z)TT*bvW|z*-q6!?65OSYxi!Delw#OG6UGNj(5d%0icg1}I^Nxxrj`<1i~Hc*P+tws zKc_05wI5olWOqP8pa1L1lJxrZqsNZ}<~ljc2Oon0Oh+g1?6qyj?tIW8U{)>Zvi1A( z-sTL|a~c>AA~xhok*)ymGyH|ms_gBk$Mxc&WCL;4z0Cz{)!9ew1Vku29H;X zo0M!sPWwJn-}L)_K@TVT_S{LvU;S*cLf5ZLU%4`}yd^3jk)dmDqc0?G{A;Rt)s4jp ztpd)p_SNl--meuy*olbJkYm~BrUI!NM9$zi_;}l_b1wpmCz_@TG{pn_0RuvB4LDdo zldoT#$i*inwmIZbj6T?4ym~*z61%Fx8k5OuUA{Zf80WuIlb@6Grv`7b)5Lz%+5P<| z-4$M^|6Km-(jOM(hG3Gjvbu&@hoP*Dh1Oi&WA1g^tU2etCFvFB5B1g61G5`isxVTw zTZ8Rm4DGE6);;Ac6|KLWot-e#2kg#nfHYEsyp^WGK~wQqEfcAwxnQVkYvw&ZK#Iy@U$2m^{i><~;rtg<1f`^TqS$d8nYX zxm}B!m4RP1b_Wd8|5V?OxR7!)NoM_x=&`rv%kkCi{oz45ue3jIH2}V*y~mNM@#R;q zX0>G}X)p_$&&;&M_jJbv$P3&|-j8tB>d^(6e(upcj9>_;6k~Nsz@zzvH!<(5&qy3A zll{9%g7>8tS*?;P}r@Xk{6@#VohxeWDrIA1@5;vzRA)#(iE{N^6F zMry#}rbIosU;yVQnfMt#d|1%b6_=6WJ@?4&$&*PKR9}P*1aG=%B=Wa4NDD7e=ph}F ze-c8PCf`Y{f>pn)JRBy%-NUigRuriDGk;bhV`6IeSNtDxFG?**=PlOqMqavfAG)ld z3awO(kbs~Vr ziHXILDpSWew)?tDXxPCoZ;dtD- zJiD~C6iPT&PNG=9*hC{Y{L*d8khLEdHLb0z>es##z`qZ+0mt*Wot-d{`>uM0;VdQ&lq^unY(d_t2q zTRy`X-?4l;6bPuSF58=z&x2W4Pp^MugoS~@yNon6{hOWEve*8vH&?}?CDR0vJS>>Q z#2Smiz7PCu*5!k%+s?z4Z^^`VbyQ*9qG$dG#|jD0dZl#RtW|<`XyXK7*96Ql-~vF8 zu3X%G1PeX%QL{BL1%t!m;5>n!J2^W=t(s9lIl8(&6SqtIm_RpSWn^rL3tTImtL;eVt|Z07QWhlY_VTd*#J3ZwcA%(( zq5SIAtLILK^0(nz*jmeegS%KX`t8T^g{=wsid+W&)4}@{dTVO>T6C%u*(}+AgM$g2 znY>rP7GzbUpkP}R+5H>ud= z13>L_RK1GC3D8rv%{elHg?v$3%_4;3K^&byM57t`*y~2K551p>9wG47u!!20|)&;7UnSF*MyUA#1=6dr9ye3#P^f3QS)r7u9^)?8 zA*}n_jq8v61CN$weEqkArWYAWg6=ntu5LGg2H~?o5|qKo#`AIXa-c@P?}-DF5b1Ly za}R|t=K|?TLNalH+cg?7%uW6M`=P8aNy81cSUg0mEjw7ozz}m6fynOz3HBuq^@O(- zEG9s81yC)^NHk`_VjZru@#5Odi35$2Nsg4{WS8s2XX`JnNLW8Oy)$YSznVHc=mO7m zNO@=wO=$n_LJ)s~YyTet{b|@C`xY(>yCb)GzD*J?k&v)&5NX7;$y==Tb|*;IIAdX= zbQ!y-q=9o~A|VmHU8`|#o#m4)@t@x!thc(dgp0ucQf^#KcVmH<`Sv_S+x#ZEw9)7Z z5<&jjB4(=ZQjGr)orx0fGz8 zRNNOiCf>s$0_9-Z^yl&7UuBVuh!Z5z#`ZX+H%VNRER_{R!+)wA(LJBZdsaT9z|Phm zNJ!T&Mg?8#Z*(46_mOqeSd$u@71kl@ELVjmOMWQE9OF=_V| z60Q(mYI&73Jy%v};^JjkKRPR&OWYp*w~7*f61Q>w`v`Bq@DC6osv&X0X-=XV}b#)R;fP z{#hlQq=Mh+VER4mJ(S6u{pI6FP97f2;^x_qP7on>c6`9fOPQ3I2--tsZLLwN3bTT`PvtGNS7H(MdGKg+Tne zPbHvMaJ_(*{p;7S3s;pNCX4ccPQt?$1Z#ccG6FB`DbEki~*$cpnC2R&@Pn zIEys6s|#LfFKqgO$xAt!=~~+c)W#$sQw{R>qITWj5fH4KfU$#v93&!ugl!a@4!9y% z{8*BDSVi2TQze(0)oFKq45kJ^m;2zMI^&e85FDhc+Di0}1nzkt5JGkM3-DoRMzEz5 z-yLG6hsMTGp5iVt`wAFWsHj8_@<0>msHUNm|5_!O%Dh{yC4qso2v`@G%AQbChJ5Q6 zikw>a5-KUYSkOYj&tCVUa{pp=)l*83{I_4wM*SY6Tc0Y>h2J{Puyu43irMIfX{7q) zK1?4fjJ>Be`C3~mEiRr2laUCPfH5u$bq9-pCwNln=;>({PoHOb7Z=w(Fi;J%GaRE~ zxiv^hF^soP4-$>Nu(Vn}jZi;WST3Y}nlFl7Ir~WhNVLT#Po881AMJu8=^YewHa50Y za}|F%Rs`bdTiA&`?EA!Ahc7G>%U_qQXrli5oRvZ5%QxZ5A-&-lCdqG=YL)(v_{+|S z--9(zD3ue}hFAKE<)=aZjN@-Bw{9mk9rWT7$#4b`A*;`yKhNat04B8~RSMKylj3ba zkpXib!y!0`Mm3XqKUieSvOfKv&zrlq=aU}51+?`Us_tvpzeR0aAz04Fv&U?jM3z!rI?W){z>v1_A@?ImjV2Pltkq66}?&t*xMAgA#t4-a_WFsp+bR z^iy$TuvxpbI)c(_Z$ITL4<9RzOYwobyF0u-2RU35tPMy=td7*&5*M!oY1uK21!I?- z7$2{rrS%4|DoiF`#mWP5(8+mt?)Q9wjg$Mz%51A=!Iuou3n&q|zP{{FpZ>yM^oeNX zmRDBxo82tIugrC2Nl8g9{jRE4eX_`Z{kl<&8)$$xcr;Rdz(%;eG)N#bz0O|&Bzv)8 z`3r4nkRm}71zw}Atjo3zjDV3*QTX;0qB#&ey1qkS>>@MCPmVdkNv|=_*)VYaFuO^k z2&hC1i9-q|9g|6>X&`YKfm?=(U|<2GA=NU`SC9mb1;E^?sdaWe+(;Y@Kt+o}4F@7< z=p8HIVy`%|PliR8zhF#-TLQ^HSNruz(`ot~aG8PW6Sisr=N4C2OQJ_%tIZwq7hIo< zwMD#Vm4$y9yO00d&>A1YrmQ`hQMbA`etT!w)AcJMF2RXy}f_oRbXQ@EG+Ctb2Hd7 zLknR!*HlwYt$cV{JOv_Y1q^4P1Uw_`!t>=#BjA_7nFgn&r#qDof?=trySu1%0R^Uy z3DPGvW?(OeS^%H1bQs_zr-;Z#x0(=Kki*0SPvkMY7s$OJVW-E(6LJ*}`Q+tc4Uc&6 zOJtS)iNqYajnIDh@b@T8ce=WC0p|z%ht1Dy>@60TFXUWPO9UjQ0R(zv=F)gW269Gr zYrx_e!>jYTVfFV6g-*t|+#?6o)<)9-!_K<&_5jA?Q}VtpA}3%UMDgOp@fS^MCQ&f+ zrH+0Rqz-gc^wLYheJpQi;{b;dAAnBeS@p54hvN z+c%H}^58fyS>Uz=-j7RKI$0p#@0^yN__T{;OqE4~c6gKPVqq1`wW2#)5KeFh{UJ2K zj)HJ>Tw1>_%yJ$Bh7NL0ux0oi?cymo&w|jA1#ke*nJ6l^`A)#%*daz=ElEM(JoP|OGg9}|w$;fC3Ov=E|%fkk- zC=+2d5-tTj|ENYs`K(%z``S&4tWXlDp(v5`FfySk)7?YavGHe zVH2G0iZ4fo`QKP6dWHa6T~@5_5-1l)_|9j6QYj(jxtfV2$i zL+H0>C_W)S`=O7704=LE=cW9|6;< zq;&4`O*8lvNH6cR<2T94z%M?cr-!$kU-u#Bg#BPx>6(&^sVFQm zZAiaX0(A}S1*&<2j_LA&(iGQiyrt7%0xZHUvWnV1f|_|x%aYm@t`E53=I=L#!RlkK z#DN*U2D_*`)3HLx+Jw!3G;o51oT6k4Si6&W1aIYwVfEe#knguDPvdzvZScG$Qz;6L zVhg-P;NhKwxdzPMSqVXZyY3rTI#MiAFB-NDMTACV{_+xY`DaNNHs%W-*KEMSI1v|# zoX3G;S0wiZn&$|Ny(VB>Id$q3^n7A9($k~ooC&3t=M@k*C&+L?X}wS1bh#@F10iIr zrA4HT!GC&(CM+{E6FhNc-1h%+zQBe)GBjjlWrcCt87eFk9VnC5VD5uEM|4H2sj8mj zd97_^VsZoq6%)W1#P|gV57E!#Rnxtq^oD~R(lkXO_^1epPWS!u9=zWEvgr_tTMK=Q zkfNid7U5XDL)G{2r=^gAG_=r5*xAQXJpXjrK2%fd@jQeY4t`;>TcX6xnvi|F#w$r( zwnWd^zB^FZ@CbW-7pV56B=`=4pklZStj3Z;La~T)5O7N^FmWF^Pr)=f=y(K8gYNR|=k&?BV;MBU9ju%tk2R{z6#*KiD2dXqtL~$xL;LRq6 z7`!@`uq-Z6e#I@kN!Vkq6OIln#8NUc`@k3aL)IDA-@kL`&f53o6-{(ixv+~9tmND% zs#e5pf-`{V%({LZRa7J>BI4GSN%S5i=RkR!25o^Sj72`+UGoTudQV(@ynfMRsVCoo z{Tc#_fLeaX4E#c2ui;!d;o8!$;QY@0^y!DKC>Y(Nsz$w1##ed5UV)kJ=wR0iU0+h- z0%)?)f7V5k`2J8%EW1CcfF)=NHuZKZ2H$ufVL3d}XG3b#XwX_=d8qy~!e!!C5 z!r~%dcER;}AS=Fp{aRV+1)Y|-OW`>RTPZ{1UZFDC37%1@kbGEzdjd|MXh1mAJto0R}d!IiZlH4w^!abYxI z7En(Sb4cWkgaCpYYY`PlXqO0k4bsC1gm4&5`QY!!x8YQbZi7}yTB=o!gS4ryl(eAc zFq59z<8gbOpsn5$AfM50jRyJ5uundpy4aRz(d*cYwfU1Iux9KIoheRZ1#g7%+_ z;Y{28TKus2cjE@p5|z*mUlag<4&06ExJ@8FmG0f+huT?M>IyEkuC6XPI5X-x=-)q_POfL}MSxY(v%T=VHC#dLhT^)2Sx+&B5TjhXi&{z3SclTuLi zvlYO`%F^7x5N|f539v%&04H!5P1SI_>M-Q`K&pCUmN8^Xk|)7aI?eHcx+0imp1hUi zk?ak0=@jAmlwkqs9>)Bh0rwFGL$0XRz z4FcE#?l0k}@6alt#}C%|-r|G}Myu~(6zstVrI=~pdo-c64v5HNHQ$S5BW_z>S`Ojh zjr^|dm_PYbb4^hZ=c#AWUi*1vs3L##8Z#49$X$1IzWrNs?2mxkxv!64kBPJ~Eh0MF zYICl@)cJ#qBWx%|Ub-=aR6!zZg}%3kzkxB^20R0x0QeFbc=;!d>l&w=%0h&4S< zyS26nwk}Et*xHQKLa-WTX!pp{^3$NBd9L!Nfx$cAl-kQ8)i>7I1`eQf%p7SLp3s?&ydI|wauU!L~ zsEi-Jt_CQ_G$Rq9QjK6ZgxUq5=q?NcPhi=GxH-mm&c%a zz`7nO15kVLO#%Q)wN-VrwT-O&;M!o`?Rh;)!3oc5sH(#1iVF;T!1|DL!kvR0{giN? zMe=oYFfH%#J84hYn6ok0@J}=aBcr9m@#0`RL$#|XOVQ7uxq&OH}mE`y^zU6 za`>(UW-|l=t+5t={1C@*~4;cl8(&A!H5bTqMy@n=L<|_@~UU83a6wLk*n2p`cZN4_< zpA;%PmX<*N|49e{k5zv0SElMJ&_al74A9qaVP%_)qJk~ZupArt^5ul2ppX!J^M*c{ zHkI8 zd&g7#_ka8?qD2uZBas~?A(SYJLgXk}*?VOZGKvUgW<<#-GkdQTB7|g*64Eh~k@^loXe094H?+Y#r2+7B@pnS22gS( zC7$>eBry#uUqbaq9GGXk_+CI!RF3d6ydC-pbGQOR+2hzY{Oqo{x)QlIpj*b$(Sg9MbsjR7351!|k>xN2d0Z7T&`-M(`X&9QfIMyQy&ZX4m=J5qZ;w)Vz#qqdq(C+2d%|{ z9uLUGn8d;ztSd$%HR$+m+2CWAT%S>}|lUg8TEMYzhVHZUemszw`f_m46gqe4XT^@bx0 zU%h0p&Z*v`07u9rMa6x@=oQFhNm^O2QA^=I#CWK)9DH`*r!(b(vj{o8uO{9I{@lvL zV*}_4>$0iB;^Jb+xsgRjpEj;s`ITPd^UeO=Gfrp9Z%eDBH(Ir^kPVBSe^AhZD=C3I z?u)#U{xp2G)1dKP#uz%U4JuU?)TVR8S{R=uX?Y==Os+S*Gc z+OeG>Sx8(wR-ykD(N$0HJ0z~^kBwxeesr_HK_+x?hu4D2UV|FP8@JQRdIvqqKXi-! z)InT|K$HP*>k2>yxN+7Yt0;#;%cJ0Tna^~D*JgTJ%(G|9*c*Ef3;CZ}ys4^cU~HU? zPX!;ocD9IUmm{7AgNlO|3p!_rsAzufyvF?;^(sW)omimNQl>G&(5WwwGRpOZm=t)z z#(w;OoDq4*8e$$zoY5cj{&xDDV}?G!Zuw1tf8KtJjkyp{K3Fhe;qj=d%E-t-XoIE! z?t@i$0T3B?3pyLGpLdY>c=&I@qizp}n8L!q^XH$CO>@D=5A-@RoFW@)(D=j_VIxgk-VS;dENs%DwZ8)?pvNr2UEs z8oWaBl$~32g8XaUd^x*Z#^-m$h1|fcZ~}Vk&+1vMFdq6ICfK;7ACxnEAaB2z( z<@>N6JtU*N<{_CJ9-*_-GY1O!uR(&dv~LMGY=l3m!k&8V+MY5&c!4HM^be^<8mgV8 zDSj~LS^)u*H+BCbVVk;bem%eFBAw6|4@KA-AK!92*M}-#{SDDoT^+7{WI~EpuK43j z(V*mG6zx`Xb4UqOze7Y`0J{pp5A-547x#MXcC;-(K?ON+>@|*%`mltAAzX`)8qU!) z^9;c_NOE)LDa8+IB#HZFSLfwT>?`zkV%ehUe4WQm)2qLKSFFS9fikdPqOWll3!`|L zl{yfV`$?X=pvU5sY>?O+YYySKdu7Bum4_+&8~D$X?>$Ug{;1H8k#WhVK+Cwym~WYm z`!&~6J-2W1noeM@J2k0NhOb>ETNy&?JNofVe5N zKBUzJpGM!5u4EJLRmyEF{dd~>`!h@rvxZYcxfCROv5!8YY1C2d`Bddn?YrALeZKYFTm6yKcTvpbl&O`K>C#GoN@7|}vk|;_nS*+`{x65935gW_EHx_XgYfg>#i>k3 z9OpGmE!tvx?kSTE-F;XY=DmBU^-mYG#%8uvPUj&}?TNM$cgNcg9M~TYl>i%q%)ZA& z2tD5Bc=uMoIr=ujg*-Q60Y3R6lzBBO0|!-~QC{wwr!MhBZ*@D6GO2b^w%S=0jgQ4z zGe~;ymGLfrDD+sbgOwmO$cuJ)U8=(#H<-!w&6gMRI@(n}=0vlUYtMuppPA{oaYyhF zr&9b$hhIO2we)y5CsKpprOLswm${Fc3xNAIzU(={x?;RtW67 z_x>+?dVHFVXf$pSI+L$PtuK$b;`qI{`~;ScF{Ei*_t!xn~&IwYt7$X^G$|1GgnL5qFod zb)K=cX#QL4e0dj9-2U|^GemPnW#@cVR5Uf;)j63Bz$c7D8=r&R_gm{FM`w-lN=i#t z)|Vu2=ZyjTvB{EKbLZ{tOc11;C5;^4_Udnvbrlo&3IuNdnFdZsT|wal@8-O7`Myc=`CSf-M4c?q=jjNP33A`&uOl zLmfBwQ$}Lc$A1VMlx>7vk!6tkynOq%I5$`9%$ewdYdZ_yF=Mf#T8Ne>C_8H&C5ef^ zbA^JKme9HiNpy0mv9IqfpD1gMz;|jI>go=|7anm1cppXSLyG#}wo5xeGtxJZ#m9>b z?(>VSYUwf^`7trQh%G6-?-ccUu9()oklG#=dSJVcLXPP(rKH+)K3=*&!|MAU!m$K` zXNd)LNyG*FsTi5yh15-4w}|;zn3(}uxW9EBxwLb9YwM7frse@UxP2^t>T zWklLK;9b76)s&Sj?Xf_%IX*w#cT-63{gYub(D<6o8lm!vdB&g=+)QIn zlMEx@^>CGg`-TK5IoVI;Mp)lseR4Pm56sNMSnE%yW7E?9)vA|JojDz=fbT;s=HkOW z8=V!$eZwP|5S^njtyOA3P*wff)rBh#2sU<(x}qb+Jr?96^*W44j?}u2&kShHZmhDX zG>Sh*7bXn}{|$;}5?kqEpa65&6Y3$W$&_%{ipu`}0lL7>Z#LJSi+rk3Mm5~%$z6np2-&Fn`2==3i--DmGfFB73$sc~BdHUK z?B~uwVo5F=9%@*Ul!QGazW{}}!^~jkcvz6EzP5H{-xO<=a6fCkEjk09n;sJr+}hbU zX_KKBvM*1tc)%Qjl&1ou!I>qeshG|@W09{yI-2+H6DAm~%X&|7guT(JI*)*=G%N3X zfpKt_xkuF}9Jrm`-M1op56WOGjnoCf2mXeJGZ-D}E3-Bg=qob)w`>(UGSsfZX*@sg zbY#!N_V$bW{AvNaIRE1B-?Edh`7Aege}`t)*k7%}nl@K{+`s1Q001nWM0cseBf=JZ*Qs{K;buU@es z7S|JwMQxUznK?c@+(hW`zibH!lQY@2|G0p@c=d*cD^X1!Y&8`X2YB#Tyeij~Xpw`a za|*Gv&4fYFz(!X$r_=0BS{hsvIxsffjN*^}_DvU(RlHwcYK4xo`?1Sh@<#=~g?vM~Yc5=7Qo@x#q~{X$ z8aE_2r;tn?61KP^y{#8*chV`NxP@pC9Uot4+zL%dnoqwJ=#6PU8KS*hT4NeQ^jP z(+d1>OfIp0q-0~oobA{!3B$lP4bAWPzG3Y7)CBDbXE9x%iHj z%yz1mf1(sP+1YIvmAG-)*_LRM`+)V9va(W#nqZ;0OUENlXNBE6oDN7FYtHHU{vKB= z1il}e`p`pB)fvL7mLahh)GJo{0D(jxzJ2w~cEjoaK5Qo4pl0+uhVo7Aw6rQv#VK>z ze63sy_Skd9sG6fPmwds=BNw?!e=wqWz$(2Hd`vTQB1ky$6mPPvDR%EhZWA7A+2@#) zoLtDmXdE;o92@cAw$!kp`l(n2Qt*I^g(7aMJeqEp7}H*Zb|Y@(~__}*Wa)2+SxdI&3P zA-Kh?Cl8+L%Q{N&^yz*tnkFljlP{nFItMieNvAVCP^4d<1?*7SfVQ@W{b(a0&v+;Z z=B0lMw`}9{Q z$9zp<3b8V?%){?yHeNw9i{lyt{Qd7Y)XRnRdl0YiDbYyl>FXapd>DDR8$f5K9b-r?5s(UNeCdmS zt+t!O`$>2>1I4r@c5WI^dis8uQ_yzdKfJtl-`~&ac$D02inI)6C*4n9zQFeVs*Pz2 z|C7a|{|L;PH?!l7^5h7eaA;$tcXf$Ci6N)Ax#8}kZ?3Q3f%dOUd>5d~Kn7u%U>moY z(8_qJG?ECzpPKq;Bpw|olQ67_e;08tGJ)9;tGg}==7-SpI*4e zJC*fyd_J%9m#cV(?C6glkR$TWkF68Ik63VZC+XL6)6(bykBhrK`JiXCdP8UEf=6wG zFk~eM^GQMyDZYqBV%PZUOc$WfeziI7tKh663<6sB4nKj8AN4l%_xZOz!87*w(IXYw z2$gpvim6tCnFE1Pkhb!Betva<_$uwT%~9hB9$)HUwD#?PBW#647Nz9#&a*GDtC_5q zZbh`TJTJQ?zi)4WQj8EQAD^nSs^JrpWk&$kW|Na3IYB-3Z?d^JbJ;6n7$j?zMjtpn~;j)1$FtPVc z*m&P&{*=i_<tO1(duk&CGs?PB#hMjErC^ynRADduF%>+=tpku9bV0{93uk zjvc$sx&41O%^uVcHxQ+{{`_ahlNv{(|v{{;A?S_i!Ae9U030z}FXm)gTof3hAShD)MOcBO1lw zZ>Zi=>ArLKw3is2aQnSs!K25HNpNtK!dQoY@MQEgul`Sk>84_>yXgWM%F_c9bH9ym zH}*L*xKr&2#dL1Qjt~K~3YL2EX4c1I&ybO=S_<=~FVOE`<={Zea%20>MJn`t&8fEV zzqSs`>o@fKzx2Zs0pGLFH_j|+@I{WtyID>5moV0Y4uKLVNd`!h;p~c95W4vy|3^~# z(fuF9o`jBqxT=S6z+IRU) z+OMT1#>;0Epv;`isy@6!>W)tV=!=9-uH)f%$$jk0sdN`#S3{iLm@9oHeO}Hbe#9mI zoIp+HKrUZ;T4Qj<)QU^I@eo;B8g~Gr=+#U$MSte*DYOs4V*#s$uL(jA(hX+#xqsgl zdWL@|+wq#IM$6|7nlhGArbi5XI^KSKzxnI1q9rK|DxEb+CYaF4%w38xb;iF{`zS$0 z_V0^E3#;iMMM za{#y{KYt(G_cbY%xB{FYcmXeoV$u@TCGJ;M zKTFQ&g7zdV@1@%E;>I18u2O)+Al81RELuchFu8(%GEYdsschW~n|#ajr-`qvigY?! z4BgpCfB#Stv9yafp^pkJ9?=s*3QMk|cHMouNVmbBF~mG*=k~lAWk?SO78!(uJmzsqJ^}>XUVqQ zSDa%FiN5ho)udP8W^{Oa-q)q+IEz0SQuKAZ=PUsx{f~Pg+9evi`rP8rHJywb@^ING zDh4CW_*e0Jm%bZ|0IMvYn}_FaiKg!pe4*_{ccJws9pEvDiX7l2Ifv#WAQ#@nx4N9; z1x}oRR>R2DbOPD?25P_GJ4r%a@NCRu7MqG?!rRfc<)hB?EGiYTp${C3Nl})Ewp081 z^$Qe-Aclti0f}{+iA90U9T&&l^|qPs+;<+?n-!pYlMF2!Qol*0B|&l%GX1j!-iHdu zXoe~ZH7F+??<8oPctaEuzgn|1nWbZK?S?#=)KTAAiJ`er%Y=gJZ~0{gvo+*&Mj9j~ z#11D>B{nx3%^S4f6%W7elA_pG$@?}QIi)f!C8;$MuCh2&NK_`AaW2c;n7s2U^O!&~ zW*(qw1P8NB&h1P~JD#S-s>7o`9m3|bRtGCR9hQ0rneXiumo2=Fm9?L)LSA~7n< z>|Neb7H%>%bTY2?*v2dIbeA*4+i4iTu$PLe=ys+=D?Mm&k&%dtA)TF-Xx+wt zwGLMlf;|Jl0x<~s(qFzr;sp}mqPS1TgoTO86L#)n$E0aL;BTQi2w~B}&o-aTfXve( zB1;gepk;uv75mhJER|3nZe=KmAWOtg#5`jrPrW0xL;cpRTUuJrpFH`Do@@2tZb5hw zDl4^>!+`|~`}kx2ugAt;V{oqTRNt?DQ&)y&<%`n~#Nxbn4+8HaX3+2iZxlX1ec;P* z6QMe?4ByF>>z(x^7#(!P@O#2MASNl9@W4p=ilyZg#%G*`s*yw_gy_Zh395rb2%UPX zJS8>$k~CB3-lA86kpqr1P`O_YI()`$aq{8Ahv2=Ebjj!tbwUSp(&Y0CxZtB7$Q1r2 zkyP*}c$FAo%iGW(oK@@n=2(`h_}sNkhCT>Vz`5@q!rPHVYN7oCeBDkGoD;qAVl?r# zQ9%Q`0;m><#}|T6OVE_%ynLw(;RasrHh_TGkifm!;)O^c)SFN;;$I@w;%pf;UZ$AZ zjkhoXrvM<@b_a2bmBS zQp)m>hUxfz{_atuLWodV`Gl@9m~(s|PeDnJy>nCBW%Mc%1;_zOmTFj%xOjQ>cY~>O z;q49DQONHmQ3d3YzJg_kF3by;K8RzAKQR-uw3_K!8XAfL^&^pcsvVK0k`!130txY$ z8$lBJL6EUtOI#rLo5V+5_zs$A=?0Wo(3{Ghh5`%gQ558!PICgED z1QO8JgYoy1QC^BEy168=58C8~Hs9X;lMB|`Fcv|Pj{p7pA8$CX2R>1>ys;@rVlC&n z?-)lQOCT&hM)wcW2J8}h5Qfsya((t{Zr_q$QE6GEbD6W()B7o5>#+Ajx~1J=iCj?0 zLnfqjZh`jd6tV~sfRe-ndh(=NWq?HVBcT)>0%>=6jfg7K_DF6c>V6pI6F{0P-GDYJ zsf7!jf8hm);GuRB#CCf2j6vGJ=FXkna3-!}Sxt6j4?!>ogSG(_1(gacnBIfqBqxXj zvyrH`MTwN~GLSSohx__D68=gPYt%wln!-H45+8E+hmR03Lt^sLdj=xcdj8wJ=T7iF zebziC6G-gc;Zt*g+wk(bBz>9pXS0N!6Uf%!i|@d8 zfNm7ByqV&Weex5KJj@OIP$@n;`4a390M;RWHeNVQ`jD_T(tYQk+r`mN>a60pfHa*1 zfZ!e0bpYwXW_Wh($T4cNdfwaqP}%-8cFJ)=R$?^aDSn3 zf9T|$YElarxhhVW9d|2Q1 zepdn0zIw>i)boQvLN+1fMdSY>1uR?7PwH;tC2ZnH;JEe-Le(=0`p?DtPLvy2=1*pU zPKHKv*5NZ|sxB^PS(C6op}AK{&x9r4MwA5eMV~46@p)*ytJbHiGp@KptN{rLRmNFo zi)ghYd;1rlHC9tqC807iJptyz+R!@s0{sR_TxtKD+t6?5C?s1IiKEqo2an3y+PQc2zII?HKdD3piS1P@_;DA;HeW3W;pBEU;D1yggAMa{KVJKqmE@hJ{c*d zYUu!vuJg9eTfD+sy^PzSTMe*eo7~GuX=Y&l4l6}9C3Edc_XDmL1x=Eu1X{BSEO)3< z_e*zoO0Q-+2ebKV;%vrEJb6KtFf~-Q3FIOLE9tV-Hh16IO{N6y^)N$E&(E)!@aK4L zZg{o4h)MZSSBFlk^cAGn=?i8S0PP*71x&dq$O-V#`|O5MFxp(6$R040WD+IFc6tiHZ}et9$>zG6&^ z`r3lCMCzIXa1XcC_lqC#lIq!R{5YtPpJE%Yp{d&gY~1_R6cLl#*q}PVQG;G9XzTW3 z&yjeda?s)6j^iBx1YtHyMc(f2U3)D7RJdp#1nqvmFH&Z6xAma9=oHYAv}pJ#wke{B z-f0FfVh~obK28<|g}utkr_gUKU$aqB`Go_0V{N=jJ~WAI*MC*@7AMf!qQ-AglgP#| z47TUw?b<6vU9K&#dnr}x)-8tg{hamWp~mXbj7RhYXUDBUt}qw1c2I7cyQpZ;uy~_b zd*#Gcpm7WBPUlSTz~zG}GTP= zE87lyY08`0mZ@D=uhB}$7%c0d@i7vOm})dAiV?1U^V@W8lX-TNRSq_$IFFS(&(4fQ?I za22`G?$61oj2SNRORk*=4x!JZI&>&{@&&C-$?wJq{-}9CBAdXDv<1=-YLLfCJCIV@ zZ0PCuLiLLkgXa(bFpOqUOFrr%8V(g?H1^Ld#WowMeSTLb^UWom5SG_#E9~A5IZ5AC z{^8|mgQ52|x=;7!yfZQcgal1;WDzf3+@Fdaurk)?!)5vvoihad0Ac!k15W|I;X;RB zUhdQ~PY?F&jQl1VZ241&gOkn)&;jT8D8uLi;*mY%UwMbG35`HBl>1{pg*NgIH1fjR zfBrNn8&IT>Q&IxZwo?fG8js0HM**){{-5PfVJ)SnowPPH`#I!!e`rR4iwnJl{W7fQ z&XMAAFKUaES1t#K(;qyDgB|xS+2ATJ2oaH}kz(AFdFrK$(*x!w8TOE0l#=oqK)>M* z)bF2KhuoKK)bHLUnX(?sUi@74cvj-3mR6PfY73f1Xc7XIl9a@*W=L-m0yl+X>Z|g# zpI}%a|4~+M`v?LwH@5{{-f-)&sHOsh$7KT~p(m#1pj(4?b>=X}QGLXy7nsBcGCaLm z>~s0hlgSCAd*2lt@=r1Yao;$E1R%KP;(O2Xqb=?@1Z<(v(;<1};hNVFf4u8z)F>91SN!Dc%~`oo9ixzYCp%Kvh;&@JKO&ZXJlrQ`n*5M&efg5FTU&>~)U4r&#p3BG zc1o;GSTTBV8^LC{En6eC17n;8pFBKrL+lB;C2vYB-ujH%fjRq&V+lDHlld73hg0C=p5kcX?bRA zdLt}-K%HLk`mhi0au=sGMRHtP8u@k)_id!o!;DW^A{X{8Db%}2b&j1v8s(D5hfc%5 z!qM~_uR>5)$DD|ITap^pz<`|2C>1;}%BsNOj$h+~b_mSK#pG2H0Q*!Hhd3rFpq%9i>6J#-cfI=Nf%2 z1(PJ^@B+~7m$jL!ZLH2f32Q2Es;Q~@f;a`DsoTP@0_Y*|kTHk>8v{rWSP>wtj3see zQ%s@XK77QIMvPnjO`8ccJ+Z=;hXvWoa3xC!U{;|OqK&Cu7R*qBuJ}43V()9coLjdE zvN_Sawq<)Rrq+Hd9*aq@t!0D62v0M^LiM zDx0QTb>I{sE@a)xImXTHfbl`*tb-o8C4)23vtQA}!szjbrkXnQq^^)NAUD78P4 zGzo2=F{Sx+j4Tod`k9Vj^9ltwjD}rR8wYP)h#Zx~zQ-CTBX*b;^^sB`4AOgcuJHA1 z|GmcnPga6*HD{Q)|EmX18Az4AslVHcMe)I58GTY$`eTVeud)1sEG&NAM5Lo9o64k|G249VA?9Y%FjMUU=3gSXp1DrO8wK z0=Q-b^{i#Ok>}NMRmY}J(Wh~9h-0~eBoIH2%|>)AbBXsvh(nqf_WLp-MHs?B*!+bM z6Co@V4j7M0&hr!jSqu4li5@NQ`KjJA9303SA(01)j`1>jR!~i$!-yom=Yz1Rwft6& z&lF6~L$EFHJ0$qtgcfxOr^)V9cP?zACs(Q&@9VomIN7JiBGNEg1v;seWiEk(rS%Vf>?jnHDI-%7M z^;-HC`W=cjWRLb<#sCUZ4FzZTTZr)aLULysCMPEk@~VNPPh+v7R5*(W0^XXLgEEHLUD|O-Tpfo$$B{YR>2Pdqt0tZdg3QT^Rm;*op zau+fSH#TD&ND0aYco>fQnwtGcdr31Js-K8@UB@^Z3{myeKLLsGp~C_MROeAv)^98**`R%D znR9E~nd$mI>bT7r3@PY>eIc*s``xol`%;^Y0z*O|w*vi+w)8fhY)E~RD=;lkl$C2& zwT|cA;1(y_8P2wvyjoWeB*E*NL$HA;5fKIA)9C?#ZAMUD{baOV zBeP>7I4B6o-|XKt0--b08%G_cv_NT37ufU7rZIO2@Rs$Bj=q<14o%90DU#<8ZgrFg zgJ6hVGeutW+*7r=JjB>atI0kgIFpc z5v)bF&nj1f_xhvdh!RFHNy84ZGYa6ype?`H21%y!~rx6Y@Sj3P4Pp+0(9?&y4v9j8iAzU0c2C{)hxwGvZUuQM$KFlOSS~osE zF8;g)5fD7t!hGkBOnfj9%&8y5ipBHL^P>?}MlOp*fszUJ4q=uhlm~&}A;Ic&cS!i&_W(Dw%ML{D;j=&e&BUtWUX+9!t9H%)TdnXfI^KCvs+n!$-)M@b)4DgB&jj+ld+qg zC;5wB&K^t(CZupqEexZQe~0PR_CSY|s)5Z$MAX0Lgqv6LWMyP>yv(=p?iu7-JuM+| z57pQjDk_8TYNEk`xc(nKGIekR4GLd2vXX<^>X{&G?|K~H^J@~sr?2msyLIEoH8Syp z3Xd;@w>yR;PSyIjE#-DUk0X8c&vi7~Y8n}F5H#<|tX+alN9qY4#!Y7b%_^VyI1EVlj58TJ||9Y76N4 zh^7n72K34Jh(E0_!y?^mM7pLxnB_!ac@Zo}9OUB9tKRhSk~)=fK9kIGU$%=lKC$vS zz5eLa>vkTxw~Lv>`%`>wcA7oNbe!4Ix4%zoIq9p7it$X6V#9=cWpGi+$ccw(TdvbC zi2TrRG_s~pT(pqi89(0h;5FB8j04Ind_=4AIGQ8)KH3@ac`}i53z2!c6?+0bpY!Mn~#$WA1A1c|r zy7H?^13Ve!13RP$5yPdlsMj62EbAm1SGsYv>0B%;=76CSlYu!notzJyG*^L=_#Avkt4A( zZ7)n?*ymvUfofb%4tiv%$b*0dMn6Ak9tWk`MLW=Cq}_`o#w(#nhdkcfr%e>Fb}!Ku7m*c%RL# zZO4r*t@q?-H03hV(C9dA1FQi*n>Bwl{8Q%qRY@yMy8lgp0TM#$Zz=ud~QZPhb5zt^j*Hlx#H@ zhjv)c{Yi05@65LyNkKUDy0CCs$?=GWA_6KU zLZAeLi~TzauX3+7q|_xYz@Eex4Lq)ZEFx#h12n zwV*W71UU!jbGsh5y(cNIVkKNckIo|Ahe(DaYz|uw<7C|+n}Re(_i6W~aNc-SLnn=^T{dyz?=e6 zm=TaqpfU)T1nmx1ta!X6FK?5D@Xqr)yZ2%0H4@mxe9xnA*%})f;si(AXJ==tAJcf* z$x%R4b-_-YqzzqL{qfc)5?aTXn!FCs%D?F%Ha9fUtvgB5)D{3lf%FAGjp6@NvPpot~la(|@8+8^z8QosM- zFaLm!B#SRp6#sv}J6m;fYscni$~FgSuFKq)xl)OjIv%CaB#!iNi8~#m_XP@AzWFZJdZmh_w)!TM-*$PTMAC~vqiYQC zE`Xy~o?7>VlGP(YmizY7mX<>b9oIN2-?A=OnC?^J&?QfT{04tbE0HnkMq1`M#)z|q zSszUT{cm{yOASoJ5y_pp0upI#qA2UU*=ciaHwwR6h5I zH{95HFSWfkIe9}{==S@#{&OVtO;hq2R*v-N2aYj_$|MK4R&MT-;a?GVJ|+e*A?Cea*V)DK8ZQf#ycX4k?w- zM&vfZ6W-NL+D@ZwzZJs=$N-QLs}Vq-+@@XUs@Q&+9ZU1SxZCm@UO)S@{DflnFV(Fr z6Ay$~9r&}BudKJR`H8n#ffF$wm+}&V)?w+|dB$Xl>G4BVIxYTR9va&6$YyO3^`m?i zy71uF;DHjm3M%g7I-U5` z#0K77he@b4Mzr$QO8&}A+iVsD@<`hYcZqF@t1Z$^tyqp?mm(M{bbOu$8hoNE#QvS_ zmpjxgotMQPitpGW>f;=LI{K14ch)8@N^$u|AK7jD&o;IGlgUVw#WuH}JtPYAyrPE5 zShwHblC{6II_%KeaFzvzz8`@&%3e0~eQfjhv)0~HK_sQn1@1Epm*ftVYs+Aic_ZI1 zP#jvisHSwzm%7BCKKx)lDd7M~#iJfH!x8qHh#>)lPW$I~;weC*o6U<+fd=vD?09Fx zwtsJ6lh+HAt^!`iZQXJ|?Ec~ZtM|HZM;6h8U1EI5tpBBZINLTQ3f2H`FM*cogQqV$ zJGv4Q&7WHUu`wcQc2Y%)^AcyNqUu3`1Na-LDP7L_{qyPXz2;R1cjz`WoH9N1Q9Ijl z-#BI2lb@yh6sUFD_oXDj%foz1?Dz?pNC#K#h1-(nWt8{GdX0a~Vk&vy=G5fjY2v)> ze+r$cjI>_UU=jhYhKZlL{KDdo>3jBzmcCEOW(20%PWMd7+DKZ~Xodf5$vm>@Ji{m5 z;2C)@vh&=B@eb$s8Cr3c1IL7f^Y6WNo=X>y=xP6QiQCuAZ+dXDNvS4?ERQ9Sk1(gpe;{vE~kSxAoM5&`732wnZ$&~iRAp} zVP7{UlEd3O>|MDBa!rZpt(zl$oxGH+y8HK^P*70Qp!gsI`4sRdGh16X54h1j0Mf`- zHI%Dg^xT+i+?{c8tmkH#_{Ux#QLW3NL1?Y?l(V|{~Qkb z^CxcbMOV8(>P^<%dx!ZwERQK@e~_u%P}d+RTM5Q?oGyEI4J%8+X}qwZ;q~OxSI)r= zxmJarW75X@nflDk(^T3|KMZ2b;<`kTOaFX@@{ICrO|247rOKgkVo#B${B6O&hnZK% z)69Q-uF3WJu$rFE({Z|V57U`AmG6>~hTO*&3Kj?vml4tG$=|;6I-k>NGrpfm?#;x- zhg4C9nF9~M=`dCNa8~#-`AO)jNJJFVf#avnu<^2AO3Sv(>icbH=^$fq?|Vbe2w8lC z;LC7)s=M=(mhU%xqsZ|~F-juaCX}4?GVA5{pSsH7p(-7pjKZ?QR(e+&f7cqNpWr^z zX-2b;mU-}b8Jn0`*5(u4#0#_!@B?Rk%`smc>;07$p8uGY?ebg2xJ;+epGIEHX&K!` zoHvz!Se;u*GESaw6;Hhx&ebM2QFAeQ=dN_#U?cm9_;VHv^)v}eso}X@DhdvkmW1O1 z0Ta<$k2yRx2iO0e6>mRX_UB0WdY^d6UBMUTMGKIp^FTuJZ8?qmaRJ)!;n={!?m;rsWNP z?`?37^;cPTtUQWpan{|?Kjt}J+-A75~#V5LiUSo_kHaBr@_ z-~Xh{*KH%dze+g*+7q45d)O~dF&D*-h^C)Nx;eC=RPo0(WN^T}{`OM`EfI!^m6@({ z^W%P0%v^WNG)WV$SN1WiRqHD~j+KzZCF+o?nP|;TUm+T!vakt7|WLsnKX| z>ezXMyq+QTm4)ib%JVGhfB$j{tgYuTSFBd7eO=wH?XeMdJW!QzD!RF1W#95rVu(t6 z=*C=ERpokbl?1a0>wAkFO^J#2@y&H3|ADMGt^kcx2U=H@{IK>cADXbg9-OCcS+PR3 zwp!lhx-ju=VWVnsT3jNH$8-DgQoo>+{0ciO>sINV6aKVY_usOa+MsRno=yua<+&wA zrhC)yrjx_XNn&Gf4%_QHHv?43-l#-8p{6)~F50!}Y?b7`Pjx~8(nrf#T<(QNix

  • Gv^DuI+9<$nUEbxXvr6W&7e76rQf``Z{2 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�?Ml+!h>`?M_XH+>SKh|Kp;LlhA+LZBp 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%0A?9-%KdJg|5#ipaytruChU$;hHtb<)xv=jxWET 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

    #DAzJo1iiD&VHMI}W@+KsaM-9}Nr9us_ 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

    JhauqEP8Exx>q%!K)NwYyc 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≠25AD=F1)-j30g0y9Gxh3K5oHaRBHw9!pxdJ*fHk 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ℜ4`xpkc}j@P?`>ONJiPXKU?2HzL=kac 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 diff --git a/website/assets/visustruct-app-java-generateCodeJS.png b/website/assets/visustruct-app-java-generateCodeJS.png deleted file mode 100644 index 882a16dfe9dfba4b1df3f50766bf984539ca9c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321043 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

    p*4Q_sJ!Hh^a8UIE8uYl(bXR+&!4oRD~{~HeYtC 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 z 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

    &w5{FoBp1a#%C}C0ZvDRzL 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 diff --git a/website/assets/visustruct-app-java-portugues.png b/website/assets/visustruct-app-java-portugues.png deleted file mode 100644 index 15d249e9c2cc811f08ffc0e78a71e2b5c2fb81ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455373 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

    Ze6XP!e?O} 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�!!B}Y=dIHyO#BdlVG3EGuc-u%S`NA04h=ESA4-h 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%0AAQKJjD;bOeVmUL7FZ^1#qW(ODMPw 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

    q4}8 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

    ^R$jIW({g({hHz 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 W@qm+Y@Bae-Y}u5#vEl7qAOAP#WO1JW diff --git a/website/assets/visustruct-app-java.png b/website/assets/visustruct-app-java.png deleted file mode 100644 index 9fb096f76c2196f08b8488c5bf3f027b365b2b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57906 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 z 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 Z z=Cse&5WSTaF?H356z3JM7)1;-w{k>St-`@^qSmzWrTI*S}*Qa(> z;#N6JaED1 zN%Jxg=XAZau92}4d9QiuR?m=Cnvl>3!$IXWNZ&YLL;+VHAI}Xrtl-VHYV-F6vV6)r zoFLLW(HTWikw%}{&VkrgLbpv95GeWyZ}vopOzk+XI@g>``ol(wD?!CP86`Vin+@9! z8ncF@LqmiZAswrO`(h7hYj;N6tgWPRf!NK0BtIpc}Z zTbe#9Ej7M8ov449$IYh%}&^&kPrgAVG$3L@CV3@0MGn5_K zQ!}KTr_eswE4Vp*0=c^}Ql!3up7)eJYuOuA%if78OR{#QY~JkWp_F8W zcb+I`+MT{|yeXvso(~<$;FlNl(sak_2yJ{o_p%y^D8C>1c9-nxAf7_QmS19+$Wp0I zV-KTM-0FhfFtaaL;-1MeqhlG}vG#;0^gQ)SKp_Tu1#F69$p{2t5m#zUmzH+e@{nYRh$b)idcKf}W~a7kJ$fY~*ow_l;ubIbEc`f`4#M!LNGjzI%m_ z$`p|0DDePMqI73(i+97_N6~P!^1Frdj!aFISGn>^Te6k^zNnZOtE$yVH55a4xY`z+eeC|d{3N<65Q#S=>^^>%^LkH zVEYdoQvQxYQ-F6vfEN(B`Fp%4wEuWKLB{M%HeN-eRV7&1bCe$$(;}GPh|3z6PVrZq zH(RA%K|;6XZ@XB%DVLoG0v=0QYBcO|e=r6ch$aL0Te;1Q%LCG+Id8Y%1zy}u9n7WJ z@*v+(_2SjZV<&bCEOb#VNwdrFzM`X)V*k$R&`(?ru?onFPj0CLuY*RbUJecEb-J-X zHjHR(sG6+&cuq(d=&-7wRsd!4RJDMF@#;DL(5_OEV{cWdf(da5kT{pY?S5~?P61`e zsGU1`{qtX1082G_!zI&C4r+PsoLW08+{>lfyGyW*&8bnMMyLFa`*i8W|FWFLf~=b| z)oUqKS9!#jjj(Bko6OJTAAj>#vVUiI%gVP~j2@*epKoaprcc2~;jUywd9Y1dO)t}-HCeAVaEH@_6eepuA`AW)}HMsUeAo}N**x&_}{rKeD{zUtsO7#dvLe=vW%72ZG( z;&vg`hM*z71Fj1`A~h=w5+Vq9)ADT(kz&-~(*dh5nv!Zy^{lBLu2>wW&SoP$C*a=^ zu`%fUMbC^P?V^um{|JID2(tQn7C>`?H}Z;vlnb>W0Sec1x#sF*Zl~=gmx_&7zSi4jenw=+raX=yFsbUEZmmLF185B$a=d#XU9?l8Yq8SH z1w16?j?mZ`dMq)0R-uf7A#iwrz`;symZTE?$)y!T*^BqoFI%NPs44V{p$*MbuM#C# zGb)skN(+-TRZ{D3%^MuMU#pOrDE^tRsz@bJPgh+9F>p;Srr-k%GVm6SsJK|&%gSX3 z-%!lgQaUjM8m#8{bct3~V`H1f?}$m_b6E=Jv`JIxU$uv)f`_{C5S#OR$__FM#sP&f zDrEu@hz$EMDk-VR6{Ayo|Cpy-lEIHYR8BZlPuK_3dzQS^yU*J9cKQ%CNV>#Q_r0X2 zMe*ry6Oir~EN-vuElPBOpar$1ZM7X;i&hDnXAD1XUKLT;-g+O?koJ$;e2(S#*B@+s ztiutu;mNgo>gQr9#XFy+c!jiYmFZcE1hpZdyL_;y!qwHi{9bt zGGmpb<}g%LM{MzceB$O`C9J=pqtq`yxDnVJ6p27c`Wm|=?2ZvAIx6`ftp=^{j?GkX z)xi2iEfoc2_Z!`cVc}s^?Vq4M1=)5^3%iJVe-rqkC(O_AuQ|ozG1L>eHf5`Xbzk9s z_}K3~8@G^sp=XTJ3OiR_MMx$#g7L&bhCZu@wYTv&NI#Eeqk=^8CYba3tY|6{O=?oE zysZw~;ePL{DuFv+S_G>ZAho8r}aR$7XvPH zY0mBoN#92Lm&9d6yZ7e%_x-p7B-+D33-E{f%ASgn9>{Xo$pwHwg8mr$wjtE5{6I+v z4@gx!rvg${ccFl+72x9!8g)7W|7J{S`aTSR+ED-{bd?dsSdExIGic^P#`Elw-Z1;)L?gEFlDuu& zX&VhgQL)O!F`AY$F8daNZFdaaPq>^-{ZVj6iA>eG^`T20>r%MdNas`?wz62hOfRkBh)Wyn`_js#sRGMoDY(@r z{V5FkCjcRJl4Yc0dicQUzvyr&oR&i9sHQL$9LqDz)9{bCrV|tK@dmQ>WogwUB3F=@ zGq|?_P(@Pm6&fnVhra4lM|NPyOjN^50@23EoQWsM19<-J>>u3qxcfaoA&ahKh zIgqo1Qewe{u8>cJ(pnmW_I^;Kfn-A?yQ=V-;tFzXzTcq@eqJosluZkItL?||dX^8Q zmm#12_kGe(s!W-=Kw&CC`5=_EHJ<_@YaryEC9J~v_&hetaLQCtGtOSqoqHxFw37vE zW3^8dqbIpN(6ZylCRdi;o=?&uHCu?))~B>kt^^=_G1V341$blyS}V74BKkk20Ik~v(I<`>7dXZy6YE9@^kZn zDLx>*r_m;b9UNprNy*=*S}~*{e$O{@NOYJP%`Aieg+CQDCs|ojq3RWLe%zQ+3|CAv zTbvz)h%WlE?|ne;_qqq3?Oa;8KhDRGiohp!ja6l+C>h*BLGLJ;Z2?DNNeb2EP?Xl*C?RLWvC&z3Nr z{C$=;$?TzPM%@N-w27-x-sW2eCq6Z`GvnX}Z@S4|%-ywpA@#_ptj8I?1>%m2iV9Oz zrvMJz88fAk9O>Ce%^H=pui}Pk=XZC;hb>HQu)Q(Qh*&?6p=RhZ1zrlz^JL(9Q_scz zg+>1d%S5OdxE#&H5!rjBju(0WPC2H^Oxix}gn0)qmy!1zd=d>JGs#V=u4#cg%p^z= zy*A5aTU-X~!iV(5)R34DQQBjHzBBEPLBQ>>ehdOXwoN^i7mYqb@sOXlbHFPf(o16d z*pxUI262V|qL(=2E1gpYqa1E|un9pYoreD6m&C&xGQa$OGF5$h5llU=I{zy1=>b&j z-{Uf|!Q8I|6Rqe4kF!^RkLul}R^bnM3va8hV%DC>23z=!Cx|>0JPaL%eqbG%tX^)I zP9&3_^okqgZ&4m!)Dj>^uEs;`?s~b##7;wBCd#nC1XkW5@U8~{u; z3DME2J|I&Kr0S4zz8KwSXZ|MSL2s*J+uH|S5FSRe@twvS1FO|&`!vns&hk8Qji1mr zLm@9V8<-fHX)wDn8(#=9QiBtcefhQ}MnTdPB}oiT&9DoQ{^myz6e* z9`s$@xvH@_x#8bDoBkL&!xg@{+!4lJ)usT~517D*v5HE;?WLm7nZ6{K)Ksy}r((_r zjp}a=da9zz>8OV<4j*=doz<+$DJ$c@cEt}4l=m$B|wNym>If=?-XNV{?Q{kO7RXlPFldC5NeNiII2BWP{#URn{ z`BAO5Tw&$s*wF2&x5r@Jc+fquMomhrv8!$Q=rONTdGm3Gyu3AoP=)8MXZW&VGXb#L z>dD`aCjW?h7lErTsPP6KNNpjm@O1 zpwq%y1g@+)Ge#RD&6buiT+&H>xC6Pc%p8=z1$$f2Uv-?n!2%(tShOb+ zm1a+GF=;86*vewq?{dX!rV_b@pIz`}EEqub42!Gf4`q0s*@DDZAtMNo|q|YJC6hEXI z+!>j&S|i*P1S>q6auxHD%m{r91@v$d#m;-@D#-}7JH5$XhDMg&8UDdu;aMyS=op5~ zxr-3yn{gkH_m+Beni^;-Y#Fm;M5JXMw6QA!a-T9nhU#6L0vlQ1^aKv17*+bH(2Q-X zxeQ1%){ZX8NsehHfI_D)*WRk6(nsQTFz@Seg`H1ZK;^pLPmA&1qdcMl?FtEbt4Cgi|?mrFV< z+{ne7LCVA_-Ci7Fq{y}ZL*08vHJP?;zvD2~scwjQS^>jW7~_0oIN~rw~7Q4p$RAE&%1#T?r|}Y)az4w2%JtCgnsCuVBr|-g#WR z&s1J4x;KluUXHskfz;4oks{OOnByiGq~DgUcS8%!ZwU{DE|Naj8B*}dk7cd}y>`V1u%ry_^ za|*4UT%OJyDp-5I{B<-N;O$eq0m7+vLFica1L1)HkyO=j0W;MCn@~@heqgBldJJ@y$!vS}R0xj*F!mof8jBO!o z`U5ZYAg+F2TP9~Xg!fVFH}-b=J<9Yy7prFio8oMnh@<`R(~P(VlGDy5!%BP`Th5bZ zTo46f-LdLhtJv9-HM~=JY|!j(t-d0-#6T5bG*X`;>|YZ@H@ZWGrPqE`Z-Qd zp7L}f5J!0DwHEH88#4iHiZL461<5eE|iuQ1lv4oz05%mK6FdQBAjaIF zF0eMM@lV9z3cAryNN$yK1$`qo^nh&0mkr!=43Zs(>;2bfuTVE<`|t-L*QqB5FKZk# z{Tj5@Sdmtp>^QL6zW(d8FH_97Dfy9@?>u0t zg2s-+81&STE7?ymHSI03!ndfksgNrluCV!^o}KVmA9*nGKnCGnUkZZL(mj8f8GH^o zaW)wXQC;uBzcc!e;Yk!tu=s!5^kjOp$^T}0@-692(S4<~MU!)@6er!*YW>07kT8wT z)jAQWGCl=TAjkvKKv-7cJikfk51YY3c@Yw_8h%`+Y;8pl$KBCR2993fqYDJHR<)HS z(G~3vuOflVS9ezt>am8s6JxzwLoQiOoh?fR`Vff9u;0KsH)wl z@|7n%f?3M^2pA0cGHrmVeBM`c@42)k6x|t@C6nN?xhz=qkCnAk7EWtjgn*c+!xr0>yk_t^@5|1*T(}1i2Yp%F8FEe zUiR8_vEbB@`q6ZMl)~4>_6%=ptJ4~!gV|n^exGrUc&V*X_WJr8r(~^0lk_0oQ|b1U z^#fS*TG01HrX!#1(mk6lEBs{LzIQ`ZxuRC^QDyyO(SbS=DOlaDUMZJK60&lsn|~owIL#piHHQef`IDF(Ge@ z&~_^6TorH(3vmyuO|eOG+^u}i7|&hP#3jZz@yBd}NKUZ`Ze;rm0B6cm)WQ=NB4W6` z6WZY||Lwdi{0)cXoiZuCWfdK=9MIK96LEa5H<^dtx^}KDuR&juLywI?bFQF_Q@|%G z*6&NQ?d%>|OynL|I)GR>Gg&b1J~ZsUar>+e=&iW(!HATELW>tS49CFj`Yfz}XgpxI z%Nf%BEVb1aZ@uJ{i#234MZ_3gv}OS+h3CpNB7a10)=8dm(R0mPN$vK=RH73xJ{-Sm26+SIludc@>yM2-ltbwuz^dZ1T{g$gPw0fxABL^iADHux1G zD!rdKkPAmRQCk+TZ-(#tWH@nD>X8LtJooLVdWW&?%n^FFVnwdDsyVP4(*?x* z$tab-3e^y{MTLWR#}QwrjzNTvu0Mb~$^y5h$LDtXgZad-%e%vj_I|N!`vBj|-1NMF zg{t31Hs8I!L%$2S*ZtH?OIja<@_6-bsI5ZKxivZDm^w9%b2Fiq#0#U8l@XI82&-4i zX4b>Dqy3$FKh4jZphM` zmeZ$i{RS&$>27gB)n}kA&;VQR=^Q}LXvN5u=ooOB~?|i0G*qeKuguCJxJd>0S zma35IIAj%?K@f7^n6hF{DNPMqKQm8?@EK!JgHie*1R$0TJg;4Y_LS~1^|%Z)OU)?= z!;SuBu_d6*SxcWa>A%2?JvNVMWZF&WK&@I02P@;0WG0E5lbSk%Qqw?s7_9#dBVc5U zaemAdCd=u)7&;K#KJA9INe7DNF5mFa7>&v=L(}W`THEL1pblC-_3v&Bvd7Z5XVMuV zzlVOTQ5^D|JotDi@a%OZYDuMlg|kBs1g!WUeH}=hU7rfyp7KxN%>Ky1XqyTzVY-(5 zmz^O#(Uqqdtfcm*$|0ZCQ%Mg|#Z7!Wmw3I|FTOIT7fN9*XC-|`)<`45V)2bBeEeRwk-z*^t&b*)4a3`f^7d} z?Y7n9CVYiWbw^*Y^AU)hfo!u4@W|=B!bYXF_u%IUL3>{n-#*cMcgXcGIBcPEcRaQx zWaO@3ceFEKkHpKr2>B$D-c*o_G?ocj0nrNVQ?teuYrK1aG}X4I!M)dgoy)W2I8O3@ z6o7G%0AuBFW?5El*cvCT8@c2`-OWx@@r-!Oh3ZzgTW!S&2>YPtll8;+s|n(Va^UO= zxrO@oXIdDt+#VF_80F(x7k8CpYqj;bubChho}E+`@$eZFd3UX;=gOJ7%a3UHj(eZt z{n7lZlg^!W*+nbpei_pf# zE34G0mlA0J$hZo}Z8xk{|Biq6?U^DJjIv%~0^=}<#MY9qQ4y6>3I~DnD)lxFhPydzBL#`AxuGQSB#W52M0bb_yq#_l3J&fV**L9sn@1Vh=8U}EP#p@I>I17K4PGn>`X-&$krFW6E|fyjF1#d})>QXgY_z5p=?f+jTKjRru2Yc8 zMF53xO~oU5kx&<+hC7vZT6%ng)ibg6UROhc95N30{%z0~>bR7KTPm8`x>au&J5xKG z=`5g&eFkxKDTs6q%5qA00sjyVMnzA`eQ9Sw(xXD(E;T$C9xney6WjgYT#k6-!c~RG zv7xTKOIK^Z9g{~3P~5$CaWP9IIV?3=4?;nx9}IbuS9u?^q;29Dt78aR!R z)!T9_h=JVqmZxRpH(~{<4<60O_rG>_Iw&S~RB-d@GzPCdEV3Uye`;yQYPNuDTxHN0 zxO9!%+ogYtq)(@4o@AXfyj@jsig$XciBJhXv6{2a`}WHd8@O!stu{BrQ0Sm2kc26C zTm@Nr#**+3GzwX5;#i8^WZ(N@KEeD|%-nDlZrInyxJ_N32J4ZwyKRR%k47olf<>%z z;Yf^m^8EFrEC66U(6SXkj}GceNP|(8E9WcOE$@!$3W`@{gi$C<0LL*zFb za*OVqd2Oay@gvkoSM|8k!b5=f8D6layxtKdL)7I?*e?Vl`d`N2{%AzST9qL72fa(r z4{>-qbb?WLUE@*N4V#;r#fBTjEI{@2Y^A8RWVJ4lRUBp1Ag#~M@jEN&+m=;60jU0H z8!D;so8GaM@)Q2*UjF1ysak3Dhatd?-U{rX8#1#te&bY-X7%E@t17#<0PPpj{t1)i zAU(0kplP^|1EN1Oj`N^ruj}}%aL5|VFJl4Ox7NT8%?*Eq-Y5^RQa@)APdKgX;H@4C zoDH^}Lj;wyBna-lN51{zPJ|e?cGbP$OuH)19Pm&WBtD%tcyPm@a*15p*KRfJJ>Cxq zJJc^eQXPcqpZGxqlC6Od6khr^)!|t_bZN9l5Yyt(Zz9rtjPs417Kd?Tt0Xl zsKq|d7k>8WHO=)P-lscA3=QRF>&NN6KX&xIpB?17g9fTpD(z} zs&>71mAlaA3tQ{|{O=~H>(W|&-%KlcO8)+%icxc@+ZJJY3{gS90#m{mGJ1f)t}apC zC_!hFiORN~O(O}SCxXMeJluKNpwIZ!gMfYpXM#bXVF+~VTG*Ku8vq&8X5x0$ z1v7?pJ;b+e2zBAbSgA!B*(qhH0Ksk#s)=7N zns#Zv2E8e0A2y!r3$JRh<>2HoQ#2R~K+z($=L2fLrWh=}PO84|b}8K8i}QgOO{dWZ zC^pANwuVNAHVbxmwJoG?Qag)MNfP_flXI?*?^!08#o*7aPMfCR(%5P;*^78O7{0T* zYDJ+Xnu~z1rmcKdE9K8Zss+OfVfO(3hnUk~_EVzuKQ>mf4TsXgmR}0B`MDmZUDbno z`@|5i7jvl#p;p{RH7H&^1$nwSpoVSlIcKP&vfd$z12PhuCuPT%2u{?KW(Fsdsm+rU z!knxNK&YhMKwNeh!@O|k>lk5FmN7WJF|M*>&3#*5ojJ572n-3Tsyz*z7Xvk0THRb& z?iLYy@_l2WwqSC5oP*k)_dmMaQPzig4^R+g%MgQ#mT6)dv{m4TONT-Q4`!y`SSm9# zouqr)73dBvqg&;T z(qfuHi|?$)zsdchsCEjxky4! zhIzG|drs0%N27wzQk1yH*BzmoeW?5kjy+MnI3q()4SaoI?ZW+2F>wPod*GKij5dT~ zZz18;0nWOcfg)mX9e2V6cb89Rr!cDL{R-@OC#A^db2Hh7)hWDht`zH^#v$Ve zwPAnE0k=^N+Y;ok=;*U0XhGsyHNXp8l|1w=x${I?@NKXYT^Bbjd4!P!lZl z2wQ%ud9J7_V9f?{BMjFfD5^lHRHiK`iJSkR>dpXZz^aON4?Rhl>B`8b7CEH0bCB5;P?mS>3ntS+u-j+{q-g?%ufYW5C)9ILRN5^v(y-8;%%i(7HHqq znrSWXRH@vhYj`|5MY{W9meu_vqwAl@&!+uud6YUT%?#=;{flYHL<0ZcOhd=Z{atgh z>CQqr&6HA6!;9{HCrw*_KtzWEU!J?p9dxP3{O`Zi?tgG;wmf`e=WG&VS(ePcB$xE8 zYG+&YJwT-vxHe=M{iAue!flP*UU++;nKfL+9tp z4K<*Elr{T}Iz5&&pgxK}&}efJ29A=DoZnf_)U?0tgAExBI3x)>f(hGirW|-QElyUZ zckM23EJ~#_&ET4O96r(_4Tw*Eg@N`zm-1&Fhat^`=2<&qeby4hj+t8&;Jk_*<1Je~z|Hs`h)OJ1 z?3tQTrf;U$r zNDpIz=BV%+x{;-ehHUORmfd66oZm2a*VM;loo1;B{b)=OC4{(Z{~XqD+7y~eVftA? z?SBu$;VJ| znD|&b|A2wjz^QorKIlL2)@8iNJxbBnI;8BoR?DZn zEdQA?^H_+D;=aJt#`c6SQvEaNe^{yXTf<^8ei=1s*rq1s@3+{jJYec=pKQoq;~C0G z*4_A~7*lFXxeRRX>6)z$!n1$}s-TA`sqmr!|Bt$bzVAI^>8OiTBdrqR9+HQxZyIK= zeK7^b=-^1^tK#Lny|N)kh$2djR1uX`K={ksIn>-=rK};D_p4wN;70)X+a%RNV2QSKWA4&lnA>>h)1;5Z9Rlp&J*IoKEv*BkvPO}c+_ zfoq(CQn=#+fN6YFKwxOqhQsQa2JG0XO=)U2eRM|cW^s}s)E;Y_xAJ#5dV*QPxGc5;vRpB}e; zq@D?*3MLOarQpwpnzXE0^tX++y#cPDohku#XNi_HkNVvlY>E~n?Sv8T&~kOgZF+UH zgp_eu8f&?=_8#~UUEOJ1IH+@rHoAZWV~NunUhN+U2pyJ|f#SQxg&PD)xAhS9h7 zn}?N-MmuDO%sJdnIZ(Pl95Rq`@z^Mu2^(@!%TlnH1bfl-$Ij~udu<`^>ctsaV_${9CtyCJgG?`gXv~0OX-@D@g)GP5DdI zkG{fueI+HQ>A_6{N#F(m2_dJfca9~uioc55xY{F!2MkmOPxovaXiU(F_&C9K$xGOM zORQb&RaTKcL;c+Lo3w9ub5^<9x$D+HZ%W|=VYLz=mUc9+#A{pV*CUi>Rv$;o9eq% zh)p@$w4hy!(6TBn-Boxe$Eg^#YVA6S?9lhQ#j!#v1Q-4=h_zc4v|>HbZ+A`nXz{b{ z)w^YZ;1#9){4Nmy`*HFeP#4fgk{2Xeu|C=A>Lp8YQ1sUY92`T}GjS~Up_P8l>yGsF z%a1NkvUUtFu{m?i2UH$7&gnIV`)vY+WuvtxogGXvc5DQQQ)>?~TpK)Ps+$;APOFJY3?q!a4DP&16&cU`3M4SFZ6;byy%g155Dd z&YhE3{+X)Smdy;5wx;}0%Si5>7?GcI+xRhjxmn6n=K#7gr5-t(lU;`Bh1~+{P!0G3 zPG+g{J+O@RrlaS4Vthp0bE|5mV;SF7;KHq!+V%v-b*8|EOVWn7zIl|nx7x&8z^m2fXclgFYi-C8=uktu~VJj>I9C#0%`WRC( zFrdh{P=czN}`p64LDI3)moo9rJF`2yLMYx|0Ndg@rN*| zW-?aQQIm8V+d7Z$EPK>_fHTR6?&t>@Dl<*)Gvi}O+* zm5!i^_Uf63k$_v(L4yK3U?RPZlSmfh7eYTyK72VDDGC8EQ)1Yt#CyWVjlEkLEQ|`#<)9*aajaNQZBGYCu{@sC6Z!Ditfxh zjzxj|ytWvb{UXI9utf&7%uBF|$m%DqyaChRjzPQiCZRtZI;Z z3|jBy8Hb&UAD0m&txq^jvrA@b*CS^m`Vau-RRI#{#P1Y(raf=<@iM$8gNFKB4pfPE z<{yezuD-Rr@B6X!fG}D>qVbxTM#TpL>%BYU`PN1@SjI$6>E{XcL|VC0lAVfLk##QEu|3&#t96c1uTW^!bz>;O7Y@)C}*=8%9WZRWvGLf$7x0 z1c2hFi8I{c8hTGzX?iAKFXB-u!+%5`6#z8dvj}y-ui^&Z|$ZIlJFDz?gv?-UUcQZkMR@b`KY>qF~d8-PL3I;%%mb@N`i=SI2rN zw+qe?!ftlyBX5=HiW0l)XBT!OT#729_rjB4{)Jqf#zQu&{JVBG2Fy>I)cR-Kr|p6F z4cu_ru?Mj6H{>~Oym#K2>&#f~bY5rEksxtF9cjJKf2UrbN4(yKh<~UhInwh*+8knc zVjn{;Ie9Rdk>z0ab4R>|%Iw5fDLIAhkLX2yoHZs8)o9y?U0PQ)B$>eG5Z}G>r)ehD zQe4%H5#6on*3FEOQ;~XQEk8C_JTWZG;|!>%CxI`rbF&loQ_+BZc9MTx9_K9{-&Ac1 zq#9ESfJAH=LfSq@>MRY9Gpehny*c;Hxj(jjVEe|l>JNK+qZEm7)+0g~_g zaw0F!HQ`S!_vs~f$EsYx*2vBlO9#l>elP5*cmQ8`eoj-zYyHiSFsrX&4X1FY`rKNw z82qpieqvmnu(KD$uNo=6gK5nV1Ev?ffXOAp-xSUQ2|Jbyt+X^4IFRl!1~p!6IY}89 zUhONog#y|(k&j@=JbuAYeDe@m~sRfU>!Z_YBz=YqU(_m zaQp$mN2#zvK{s$~ea(&vUyFJV=sKqrZ&?6!80P8x$WEHyb$5fq!x^EP7ot=KXaBvy z{q@uLPrW$qle{WDuhhrHO55t~!wNjz?2^j!jPFw-7e!L&A9(?wu&vPs>8>`60@7*D%$>aCf@&u zyH;s^q+;~^quBE5$+HwdVM@#lDQWv^x%SxT{+64ECho2fc#Zp-U-_3}1E63xIf|xz7d7nI_R)nG`6ibMEY4lSsaYg>$m?D7u;y>U^LYF zF79k-55mX4O)G6FmL<$RhJ;MjEQH+%2_mRn&_pj`aKPzyYG7)5P$;)z&C+D6N3-8k za5^`Xtgas1?l7g|nl1UD#br~3-DHRAZd)Le-N z>$}1hu$~mUH><2tv2i)+FvXy=Q|H%@~!7kA53v5AT)t=#OBC_d-7W( z8YXF$HHXp0LOR9=m0!i$KpG!^Z+>r}2Z@Ul@Qx~V-T=_ul%q1Ihu2Fr?$xfJCjbEA zw|h(WVP@=dq61xHyCWyY>eqkl@V=g|%*JJq1{w_MkkA&MMxaj_423SzxAKz zm?0l2hHoxWf~K}$A?-Nn0jbD-NLbYB8ZbE|9>$rsXJKG~8JzlwkJ)vt2;k9q#wNf0GUniB|EZRM=A+@U` zzguC7U#BhpsaAq;s>z3NN+=W{Z*QPg-qJ(-JpD}&#oeLX>rPGKAUu0Rjqs-IdWGW9 zR|lRM2jz2nBRB-rIy4~%tP7P#8^JbJ1m48z`Da7#47)pXPKbp3BI2=s;WW8ub$m4J zg;rpoAsd`2kZb>6@p#&P7&*N)Hrg`nXSCQxyT3vGkk>obTLC z7ZD@$obnTj@sO^uZs`3F0z-p^peUeC*Rt&WRk11o85xP z;}(}&HNCfoYB$O`E*m_`8HXj!fw)L+%eU=`ktMhD7Vze9Ac8VcXApj(pegG=SO8c9 ze+GeiI7tI;8Sy^lsqgg1C<}wyx8uX0fI+0`5^_NaT*5?2Nv4|1DKB1I=-!;~_WEOx z<~1>BTNtI}ZynNK+;Ht@Y6lRMYZkKePV{|pdJ3KJS-#*j_$~8;cc^~0u(v9-6O<#W z74Lw}gusC=HDH*Nq)3II^>Uz+t||6B6J5v47$6^A(144o6}#1Ik*WJ+QOnYp6jsgn z%qF+p8$FxtU=5A~dOQ3?_}XfDt^NGgPd6HUbM&Z%v)la^+x8?PDouQDUVIVSRBHgH z0a-w`&o8D_EfBL)%&mqO82q21ms_K`eT=^nK$Gq}dv8FZ{CozhFvW5NZ$?*$U848x zhe7$%fbLSW;@tJ`UF{*DIzIVKL3L5CJ$_%sN|T$$n-G!%mB2nM#K2Y&0;`gDs`?I}Im6b_*JFsFa z(MoWM@ngz3JwhYk_b2GFf07+neM=y`AEpjd|=I9x8#a zG#oSh?MLKj_+C#Xdz@S-gQ?Fbj3{6~l>M4}Z}v&zM-_Sgff5nl_+0KoY3Z#t_mDWX z+6KDqtj;}qdGrp>(;GB5X}6i3yfY+j#ahF2sxX zq~ojm05V(1MG;;t#+V8JqBC4W3t8-M$^!F2#=)oW&LohSX}bSrB|(o8b`>Z zhpJWfOkAr7Hr#V*@2`tSu3fE1qMzuT`tT(7$De;Xy8p=j@0SmrfAulyapeMfI4tci zzv1Gq7OCBc*?Hb}CDnGpcBizjYUghDUu=8CLY!ifH?*Q+ACpZ01ZRWvpJZtcWO9&D z|2++;(J-Q5lzBM1U<%N9d7%ekFhHuF5~|9d0Rb2(U`1fuj}X&@$}#t<50c{-nj+My z698G6Jc*Oi$bY&PEYzdh)#{r{X-i0<0&ej_8vB3hmnvFCjJ`M*nysiKvo1Ga>*WK^=Lro^*MV>V{9>9y@kh z9C;x+XobvRG`7D?xDa^7<(Mopz7S!yMxz#u96B7K^X%$~ILrQi+EcMo@bHyK6Z)J- zH{8>NxhuUu)(z(U?s-($o9HWlz&s@6#7!1C3RRN#vNh8?o`4F|N{LVjHQ|QT@{3k; z<3t$x&{FB_>!Zq)-}#{%&J+_b0NCdE;K{yg10wC9rXSMfVJ)xCjJ>=^RPN1Ac|x6A zTYulG{4$lF59GiiOH+QeBA=b8b}%w1zvo#ng%M)K?$~dc9c63xplCM-*aDX^pkZ*= zYUlR%UiLp%jy*wfr z=ZN!*b_O7cF$S}3@<`yXphwR;gp$LIJPm)n-gvm+cvPjIz5_eL+1j)k%+gU&-qF>!4;P*6n9i5L_lL@{W*r4*y#{CD={W1DE6OgV7-qJGNARgvh<2h{?$b}xFW`+lm& z`{LB(J24}2vhJ~BF>+zoxXG%FUik1~(X6sw6sR;6BE@CXEK-bca_L8o8v)oCNsII~ zT`Zc@5?$`_hN-(X(IXs`^v;O6wZkL_rN>h?KB-$;C66mYD(bgflkA6mG?SlOt3dqc z2YbP8(EiPFL-dEBfq`N0mn}eQFCuIVEp!fYyaL?8o{XO5qAbGX+q08d4;;5jR9^xr_NLcy2f#EaCoxH%uTEKqVa5Eg>Hbo*U`(d0stNG znf?$%uZ-8_Amf$cJc$Vp#Nx`?NGBi(WieV+HX z7gkE+AE|8exZYkC#lpPXluqSfvB~muTI1MXb;fNS-5hTkQAlCtG{OO-UA$K;>bQFc046ui6|^0i8kJ-H z{@xDO_OnbC6o3%sCZBSzMIG18glu@MzwbY+|AXlX#p90-$xge(YJoNWu#3eaN$(Q~ zOQa_{*n`(SgdC1)Ler^cM>s_VG)?76w*u(WuF1!q{{(S7#;?cW`*OXHMbxdD-|ta) zm7I9QbFnapcr%H}tbnvWqm)Gf?RN=tTyZ5vk;B%8w zry_6+qiijN@08`BLW43U&wG^*u{H*;IsHc4o!+fm)~XB9Mi}M~)|02Zq;|N}@E*7{ zViD37J~!Yh!E%mSYQ41CUJDU<+}u-wWk4JtCJClmJN-OWEj&0T1-CYMk8YKl-vHatT{XlbyG*-`;7Y(^1}oh%}3}`je+?yOdo_mwHrwEx~yz`k875 z23cx|s@Z7mqO%fPey7Dc8gL3;-s`fh0=F#ZNAHYsor|>UweR8l935##C>XfrsbAu`p2$DGnDi5Vta$le@|l0e4*U~{{Lg>r zI&xq5Uk%*&>07szrf#V@#1h`%2}TZ6q-d>S#w}Zn^>|4PW{K4(i<~|XW$5ybjYZOx zm>DD5y>cv;v@}*FJoSb?Q8yM__G#cs@>ufummQz4i2e4IcLIojtJj;Yrc+dC_j9`{ zZ>{!rd8g`@1Bg2yz9u3Lh_CsSpn7c!Bs0Xbw#2>Gg;S#14}>vZq^z{PzKZOAt=aHr zaX`hO6fOHc_uM}zhjlIYpYUgZ=+c6kpZXbzgu0;o7OBCYNW|YUrvLqxqjr9j=6r(u z1nRX@HO!tL5K+TI+B_XXmTR&&qMuWAc;25+o*59Sk&Qt-I(oB)5MF9VdyjW_Hr`VL9Q4h*q!D zMR$SCb$^O?JQ*qTw1b2oDDM*oMs28OC2^Z|)Z&1Xp@|$^;nkfZh|KY~%l&^})xd`R zyDvCE<8?9csO~0i#Sh<6G4_j$quq3=rWLUX;b!ej0IqkoB=+G_>2rq--$}dBtjI%e z*>bX#^NZ2DFTC--z@TWY_pW{O(+skKhetfaE5-jr;Nz_;0Q*hZ&qZ$3ga>j#Y~@$agQeI9yabKkDAre#Mi)o1s#}kx$ahEOG=JD6lFNu)-;1b zKi*{Ylu9>rj8H1mg=smn>&Jj7N<~GGj){Hjc@m~cW=nen57kwso6O|7+X~Zi8sRq{ zCVS9*eurQX?7loRpPaIo95biCO%Qdzid+b&uwnqX5xT=Y)Xt&S))zIG2VS_U%a#p_ zUtixTNsPC&8|wLyMuZ7u(sP`jPwJ7L=U>$SwEMyYmOEB`-Wc_vO}=z4cc?wskr6bwbJC#- z&v-eD-1$3%hkL4XH-slR#WXh)7r&;|=^bkg1b&b#)Tb8Bph)WTpM2ky4GhiuPagEt83{!} zaEPN^ME*amlme}~{zQPCWmfFm5Ls4_>e!Ta{W~=9zg;OW#nshBGFH<|i@}d0H@dEI zQUfY>D2nO2TL1_EtBjv@iM_=59aMl{YkU45={((p^8h1sN96j@jt}M9Iq|7duTtM1*! zYBeBYJ0G&S*zkU9Re?VevsZ%{m5Ez*w$B@q+G|Z*TlF%>KQ^7LC+(HX&P#)rOG2akN_vr09)I#nnBTlEmNr@pMx#c_%3+-< zY}4zoY{INQ={5FaZCSfuPA0!zH;R4Ezc*=2E$*w4RE<4g_bzw$s^RsqfWiN(A+=GQ z%+3gJZ%>c2BE2?$<2&kpP|=DX3*mT{b3Al2UbCo-Qg@sxR{ztLSEr{)zuyn?dKF{w z?;uoH_Q}NV;b&c?m+#C${WlL|yizK4mp`zvl>%Uh?XD&%M+KAy-A5r-KR3Kbc6&j40!*G#SkMm`qgbP zq6`STF*5OJEWFja?LW9cEBGm5*mG7ARho6aL<^L~6%ThoB%fiHoUZRxLs^gLUqc-u z$3^CtHvK^Z+#m0+~K9niiavdIenM^GBwo8ScMlu z2|ai%ETIroGL9=DS}&7Rrg_!c6untpkrGuKoYYoG>1P|%=u=TJn^xcrAV{)SHNShi zm3j2vPOWcne7DehVWR$oFvh9yzBqmEqtih5Y4ephg{lqCqC-lO>%dm_F~cJN^oF+o zY8?BU`s5_uSdeq!kHPSJw*N?pJGk1ov7$$^o)h=|BHQrBye1woEGy0C3n;Rarxg7o z*)Ozvm&j{$)J+{C72(Bclcy%q+dek-T_kA-iXXwpyp*~9%o2;9BYngwkj}96Np4op z7P?g(!VWek)I~$=6a3Rpede)s@!#dz^(EO4r4=}gx}Mc(EwaN|fjg4Qnwf7cu7Txy zlH=_LYBd(NzoketuO(Z&`}LUn>}T+`oLKra*`Yn|Rv&t5J(1y_<7l(-PK$Z?9j)S_ z5u(w0i2)}@pLuF&7#njtTxo=yh$NjVrQHU?KQGb>dX!HPD@<6O1veDX`%otO%B*pp zH6&FT~90>A)qr?Pc1cR1L>?`j76o_pq?URJ^fdU-?_M_YrTn-AEW#| z+dNqx;55_gJ@5DutDT<8GdeC`k1=X6iUg5r!^={{5pP@_;c@h7c)^h+`#wDa$Z za`n`prYj#W(!9f_*5DEx5s2O2@kp1xedxjarF29aAuiACd58&etHI2pU(jUmrBc^( zrMF1EU2;GkZIr!Z+@Xxv(oVSaRTb;y83a@gfE?GBDeL~`dK-4A>{#~T&QsI>K(yX> zQWWuIhmXdqw26%So=TBPG*6p!g1Y}7L1h2>`K}|LXi}hyAF8A%g9Tj|bQHBuk|JW3 zKqgAHg4j3+yjl-!+UU})24>MlWL1X)@pPr}bK?MUkm7EUX?-7tXj1`+3~Ali7kS{C zy853J8NXb1jLln8ejV3VtFVL^V%TuhFuqlD)*T9;LKD1KfyW$lqKEaHE#cAjBPr+K5+VFt#P zB03{IQ4z3FA`l2A=%Ap2prQg&C1Su3AcQIeRAwmBEGS4oR0LFNq<4^zASI#qnm{O_ z8X$De6L;TtXU}oJosV##7bO2Y&#&G$mGN`&AvyS7Zm)sjQC6g1tAv*ltM#DQ0?aNm ze2z~VQ0|47?n4$^LzCWSDcglk-urm6Mm2K&Zu`XglaZ%=dJhH1j zCTE4omLe1Rs_;O$*J8T;A-Gk32=UBNcc~jFpm0L3uU@pUJ|#KPvwRz^X@0L84Lp0m zJric`;~F?4?9xXdJ%~X>#jH4ibtP+CWK;>PtNNf9E84fn)l4xq+jHuox;o_&Y zs)Us^qk<@%9?u^<`TzOKKM{;X*>`N`!RBsg`@|%a_;*|YFBiHayfues&%uK~VVc!> zaCY5byq300OaO6@Sdz(ybjY-t-@(LKV4U^8?ThFT^J3nu$Nh&rr^G^~XIio~2LKWA z_F}=!0h9k+gkknAokY<-{9pE*>+?@!ZYIK2I1oR6dilr3>VI7$x{n{OGx0IE0+irC zP9iP-!N2-Vy6Q|BH?kw!b3UPDyLbodvg9vFG2m@j6lCw0MowH<77tcr^f|ve$=k6= zLh1i-$0CvbUIF|NXJt#TWQUiBD>6s$B3r`s)ub z$u*UcqKV=iX^#CoXR*^9x_Z^_uNsww4g2iDfd(xRZvq)necMMIz-S%Hm!ocUAreor z*J;f{v~|j%l&YMaLlp7uiGcTs?`!nk?fww!EE=hNG$PS(3vHsrnMNZ&A;sAzNp-h% zISKR<3noSzAF}NV*ZFS1DTQ6&98WRTL3+L~MJ}#43>f81C0>4%jA?Q~w10=9{`357 zml&zl`fot|M-uVaonFH9{U9w`oqIgXjN4LY+TZ=!gAsvnaH-gFtvrTu**pR9!jK0F z^jMxrECa1~!X|=&6Vn$qDe+?3`sIP3OVc`J`Nj0>o;2rAH3!u{UdzQV_N9;olpHz= zh*Zr@3Qnl3PsD_X$VI$szIF8zv9|b_Y??@Dvw#Jx&q2wPb9|ZFnUn#)0FcH=L?Rr-;D27f;a9X+hc znxuWV$*^Gp_hkeE89=gRY<%OVe;G?w-1+;S-!vbnr;q;5jU9XRgVU&|TOw?ud3iez z$t}R>4b-^}&s1qgI=Yqv032>L$uJUk307~>u5}@R5f-sV?i6>2g&oio`&+id zN@V33NBI49sa@K4wSyJ-I|axN(|?E_@FImeSt z(KqK@25mk;owbSiQn%&Cl7A!*Wx2o<0{3$>dtM!QeURwT4aP~ z?h3TYjO*xt#GfPLR@0)iTGi0n;SY~`LY_;R^(S^elkUk^Ma$5vyePX-wQgILK(z;E z7CYp-)@e_(<-VD9gBnrofaol%EwqE57P|JdRpj+sI~l|W)hUD4_nOZp{`bgV;phJ* z__|`$vI+IS-~0Q!VR46leI;3ODo~yCf$Eo^QO4Enp}v0Ht#@xnMo)xE226@T(yI7+ zX|MavpdXogTUNM&GHG54cZ@ zLw0imd>Uw(lS4X}7zDD#(*HeV7hTe$C4gLXh?GJkFI`h+I4#}DGrVQ?!+_!MmqadI zwR$_xzx~PRPyu|4_7qvIJ*h38(GjXvITYmMN~^R0%@>xwPt*lUv9yEMozNQ!RV32E zZ5-Yq@)wM-XXs*A&IDsgJNYmgv(WUblhAJwF-YV563tZ5ObE#SrOYA~_PhyY3#uBh zv89JL(EVkcn@RAKK~;s1$|WIe~o_scM$its|4Kd|nShF6n+YJ`=g%O~thR&>2EbyxvDq~N^_7}9a(AtDPhFi3!50&j1IwdfXIdt&CaWLY{qI}gZ@=(= ze$!u-Z$_6ptA~lW2BFNF1*5~xo_2u1lF~PhBl}uV)`|XIF>6tLZh_pLnhrm*>~fuT z-vZE#hgo3B3+@jVA0{nNY9MI^$D394XUcucZ(euz0mQ2i4>l8F&;vk)>s!swKOwWyDow{g$GpS6p3 zmo&jer%7Uk;XP+4hnV_RB!+`vspk8|I?ZK1A|k)`6=}U$84QoOWt&Rion(cR0P=SV zO1_hq=BV&rE~~%45!Ke>@pr(*HF>Ml^s+9eqo7Xw=*>0I0Xwo(UdvFf-w&xXoAE>3{QTY<{54*iL z`)(Bo0!ezJ2i@Ypik1MLe=#z?-4BUIxRaZzO?n^6rr|Lp^A zWW$9riYAwoK3ly{USF;GwhxmDUj#NH>?H#2$Bu=dTfX)meiI8*dm8bRq?ecj=SW%` z8p6yk6P_VcMM-@m#5-5yQGL5a?o^jTn%mZDxN7qL0BL*1dd=+&j6)2f0~4_Kq`p6S ziWt|F=fgU0#s9q?0Bq_H1!umQ`AT#lKdmTjV{#+exA;$d{$bUxy20_#oL&l*;N*3a zuF<=Sy_pPWO^Yfk^;J8^;3k1j;4Hwy&~(@0Lp4crJM0+0YG=dKi5URjRjbJ{DC?O# z;6_l%z9C(ZnI7$V&Zhqih0KS#a%#Wv`OdkYU|n@}=j=L|U&u!`X2^AiA;fi;<+{gG zFGNfjk`9RlvFlG*>TrkrhZzU~g@ewJTv{v1P`dDMxEqzde9x0=4(NSCU(^)fPWE9d z>W(8qJO5k5MqH((Xs0PK-@jv(;H1!_ivfj9_M%lzeEi-_?X}xd2u6kt zD$>y=iGd#4-8UzqNM!AM(%vN2{*0uO<(8C+=o&ro41qo;IeGrhxRyuuGLT=9sCU1G zM&fAAUk5Zj4Vt2&lMTN&7Ip9;;&O$O7@)QG$xgN~$oF|Ug;A|K&Dsy;you;^i!4aE zF)Q456g_VIIIrc>OKtBNC-0f!tdiM6nPys&cE8~Ux24RxP~>KmZLG(yA5t`WUrroT zuxYbF9D1J+DaUtqr z?w_8Sl1C~tsIyrwCVNC}JN$6Gl^{B(|3{kb& zu7567-+Uh)LR;>(8~(1vy2}i748{$XdO5Z~WqzT!n_U}ByNL^dj)_wq&~ql(8|HrX(QRAprcgKZeN zbhzNWbtR2bMH`9Y%0Lq(O7IHkOG912K$OL!nM3WZz??Rj`7*XY18xTiP%M~X<&+nL6P!&(GQChC;T zPo!1$+nkqUhi+O@5k9(2&9G0%KmtW7r2|RIzdb^kAU|vr1k7e)UsN5YA+-nY($mt@ zgR_LhagGfRL=}Eun;Y15ET7y6=n2_=W!m1NA)&+wRep8bajSu*S~|DsUVHx@>*~Fn z)Ii52!~QGK3U3F68X=h6k(Z}R104m#ZF~ZYB^(7X$*wK9X{{M2spt%s+pHM5JS8iR3z55qnH2!B8_CH@$L+W=C#pW)S#YHu<9zW9u zlY|s71FM=_f_P`koL*;SVG`FOHL?pq{SRO~khzQjb`0Dz)GwZBWCvW4ZIYn)(<;U> zuyJ{sr|x^CXROEJ53#fgx7#dHK%(24zJPhm3IC0$wS+OhSLBNAj*%GzCC82#6QNhz zN5~4cRd5h%l(5}}k<;raTP&<7(1ioRF@45WuG5jLL}a5vMYEIU#6;`7kF<7?tNz*f@lzcf?TjejceFEi=iV<28+J(DU( zuDI(Z7aBQ-^tpT%t6@_1Ow*IgtqHGVg_XkHNu%#%Bsi)95m|0woyuM6qRfQYzDRWg z?bE_QN1jf&J`|=Oqsi(rOolt491>)We~sQ_ZLO$ZZ@-%|txEB;c7k^C3FHW8M}w=j zD&E4(#*Qoz5vi#O%HMUzP~~eVrKN;92WeBB^*>R!xK0Yu<%~qbaLCq}ha!WaIdaRV9U6onenI+aFH#-ICr_Yf);q{x}7lZ6mQr zibgCNYU3zjXCJo;M2k*{hALCeC95x=48I+JKwCfD2I@W0R~=qA9~OurpH3E4b*|M< zjDqaVKKJ!jujbg0$Uuko&L07CNTct6X^)u1i0YlKb-sr2({9D1At9=Y_@<PW6+Yq#83tK_L}SLwi|up5A|(8mARFRBi$8_S4&;n46DoYvy>dmpYXn=52}lgcn+<9rO_GTR-S*LlDilY}^!@ zJ-p7FsNFXqeO$DUe2kRB30otnM#cob&et?VpSx&nR~dHvtQoGa;J8ATGOf7c8bGru zHUk1Bkx$sdPH9iRIphxH`u8-${}`W|f@VbM#<$He1&xDAd5Y!?i)n+$LB_Dxd$&)H z1j$fj+lfD{8o0r7$w7&9vFlau*Uxuup(k{9Phaq2#*VZ|sHf!#Z!LO&1q4J-{PU8v z78wUXeGr8%Bbz>~i%Q|2#fU=)waZIu1tn?sO+a_8*F0UKd*pESUmZ2Au1_VIIt~Sg z!}FM38q_Yah^X5(j_9P=CCNsXJ)6p)c4*@WeViVO=qN z98uXPVxafzq1w$}bd07K2ceJ+DWD^sjY?h()0uX3?fDiF+Fd~lj<`r=c8=*DiYBQQZA%c1nTt4B zl|mCEIIR4m1V2IhY+285X`6t}@x8=31fF4gWk>tjz5*e%wd-&o`!ROm)Ut$*TIF=! zD+6^8gI>cb>(4c+3B;uz9NxKTAUQn;*<2hMs8Uv{C*|!(bKhK+ob7ueDg~Rd%Bzy$ zZY-ayc~eG>f`odzP|j6(zb`prLfoHt`J?!OEu2sfT1pg3qA;LwRna*Ul&+PtS)ed4 z{vIM`uz&9d!*JK32#7|JeKF1JW7nuO9o830OSBtMbAE;5-*t1k z)Yu=Gf-TW^u*jwP8_zc8+k6^Q$NmML#>Zss$y% zMDQV+a&Y`H(sDGY(-hU1TCF~^K^a`7KzF?f_VoQLlCjN5co$Vdr)aPcf0aH27Vr8CHN@;T zw^ndCJW!hyMWxQprh0Y30WruOKSQFbE4=n~a8@JTjw5;>&?W5QO;ZsfcPHq8i2m68 z)01m?sXB^_&pn$sYKL8nLp*;NdLQNEpzOn|tf;zoD}}Z5F(_A60huzS!#i5JTW*Xi z=R#FUJQE*%$4NguByi#a^@Do6QR1~S94kh><`MI)j7%mjODnz`v50slGFTGG)}}%+ zPSAQVVMf@q{#bB7e`<6V^G^e5E!j&VXRMmc*fySAv+}~QEP}m5(xgWAOG;R$o9@i| zy-ab(%qR%)!g}>HQ#}qsWJr4DPlNMClse1;Poua7AX+^D4~u99!^2e?U?mvKW2|~u zYSJJMdC%nO>&xtfU=d_-37CKF*BRYo>SUrdHRd6U^GoC$c=FGR(u||vLSQ}kXpG}M z1y3yok)N;pyNvy}^S>f;_liN>LYdq~Gtz$lAi;?>hodTQgRY=duwt~PLi$?d`CH}} z%kM|VSg5R%k2L30DI1h8I*_y}w<&eYb;Rz(OQiZ@TD+bE|GJA1iq)ciImH1AO?K2FU#(UN6fd^PUhoc3>2ei5gVXr1YCD_juqQz5etP(M14A~;g zKJAPp!Ppl=Z|qZ^7)_rVlj;rJn6*Cr}U`h!DB;B9>*bH`a=UG59 za*F$8#CAV`P~E`S{3527yw-$nV4ChMnG(USXu3LY;hM-}?yCi^MlAm`$DL^uT(xa} z6&Fa!yaTqkBB5y~{jy35fA}KZu@4tt$T;1mi+-;KXa_98EsC~z7fjuxY9&6etIh#^ zB{-BsP>;I0U(Aaoh<`&glpug zaU(p74uQ!ozo^_(gz2UgmZ*BH;k_5S#}iXI;K}*GV-oiPs;-|LHShH@@w-s%pP*Zo zOHc0G#EM!=9jhW&XV=O#7VA?+wks0Q3Dn*E8i_>UK&ZkZch=|{bYF^U0uRAZQY$mp zvfa6k#oLdxUh9g&l@KMXZqK6v=o zW(s%EBHQlU+827!Smo}t6$DibRmYfkTXjRAw&&s78{d(RiH1a9SeJ+G{y(K@80Wco zWry`|qeZVv+X6sWp$M@Azx2%l&d)!UGwcx`jmAr8`>R0x4r-wiT(C_OjhF5>5J`mO?%xL76+%JBCYjS zYeW)?s_F$)En#bJ}^f+_$}r-skk-unQVLy%To(;aQpKz9@vuLL5pHRtvvNcNy&un zd?%o_(2sN5dy8?*ks0EgG97(X+@&RpH#r6<&cwLNrPT329W`GbnpBOq3CnqGzDe)$ zxkSX=R_dnU^LDl~8v8;|eoJk$90^sQANXoyzi?Xo3-?SElNI@~QMsx-;DHRj3D&$@ zKw72ssr$}%uKIwXGca{D16bh@NLotL+isZKSk4GQe6Qd)`k@6*(CGd`tQ&o$^mB#a zNTJ7CWlFTxy>|r)$0T~B#7DT@^tg&qUvIAXL9Xgc?&f+GUs)L=()7o3UHo?NL6^w3 z=8JO3syC%RF(QMS$2#vy!%=nTq1&3|N4L+NLQbsLMVv21vOAwyz*wppi<5I4HkB5J zhp}R|!y*D)&jHlDwz;E)i833-eyVLhFMPph)wnWP6=W^r_^? zq?X_tj;H50$D6B(1TF*%#N8$u1xlX4bZ29E^o;zdNBv?+MipCMlgkU&pgT-%qvOy) zh6h$-(9?{E`FZKT3pf16)l*pnF60cC@oYKU48XY)tUnK!I02ac2mVg$Xtxql;(4#d zIx!8AfDyiiYe4vK-0o$}{7w7J3J&2JUU#Hgfpk z9@OdQ+_fVngTI_05%nX-w7X*}vJVhO*gaaIzB7cQ33k?rDcUi9q~3jP&{WV+|AsPm zz=u)Ay2G+fPl-b~k|)=cvz%w#?>5YB|DuNW3K)}xIs;Rph&tHht{~>o?&I(j33O~Z zQ}T$rtX}5f?Aps^yc^B0X0L4vkLh|3e1?=?7*%ai+;s8=sAyZ$3%@c>y#!%Ix>{;9 zNbx=H?hDAYZMM|SXs}cSfz^c)wE@$u4gwEvd|U`!)`aF$jkWQ<;VPoHnY$twuRoCw zd2O2DT2wYTn_%Ty;`caWt{XL2x?ESev%R6LWtfQbB#VY>sAce0&LsH;{U;i9rU$oz zAFfHiNS5Vq-f*Q;MQ~m1oA=j2FFKY~`4Ux<{{)YvCI1r+W1n_SesCh;x9-mrvCEa6RJRp^76@KZOLfZGeSIx8lX;yb z{3ADUilj>5S9gmYad2Iv1UnYLnv^DL!6Jdq#ovZrJQ?9TgA<2huR_K8o4Q6MexEtA z$O*$Q7yl~uom2LSD$ZOwylg17CcYX;;&0Q-C}NtUUQutKD%7$|Bo>Ldxh%cKXwYMw zk0y^aJ+!4tREgC`zwRAsqR1RW&j)OClHHK2H9;;s#J4&R`yw@0qJJPA;zDub#m=i# zy`l28X19CDjb6G*u(aQpD3)*B5gToHjO#sm+9fl}D3xc6Id=JAf{r!+OstuS;)?Sg zmga5UF?1Gq3%2@=A}c)HCE#-$k3p|)H8o%4+E-I}5HRvw@1i-@Z+Gvkr`&B%n|p@! zy6E9?b5GkQ#4swUvAnT+SsfcF#QfM>aouOO&obJ15@T2Gs94)moNeV+QEhP=nE>lXdd}o` z{VHc;{ABs<5)A>XRD1?kEPQ8x69aR|KmIjEDUFt8SB76~Dma`n81EDzzDWZ#vG21X zm<95oXQdW12XkOFS)@bfvg$-lcIw`4w9*#E!4NHO29~TNDxD6P^*flT;3j4H2NB|4 zgdXwb0nHg;%QYp6zb_P*+Bz_``H0Sp3wSqB256hOO1A8rq2Bscj`GeoMZEQXl8IY#*>zKKsn zCwHVrdg7TqZ|{0|$Y-4JPer}e@cPXX>4AXxIwnlk`O1^fyDu>5w>`+BhHyiO-*sns zFzg?y9<+iE>U!<9RIzf+6YBC^#mjHz68$s+RldrY*8r+qzps8BR}H_Xt^OrNLbD_? zxBp_YuH<2D9xS#Htj9_1RY)8kTi3QN(f~Yyn8veno)5#azF5FU^iu;$x*=ZiNFtdmaeJscbtnbb9JQ!51 zPX|fm2YJXxmVn;s+1f>jch6{Z(p-K?Ie*EYc4IGfcy>!a&$uY-xCeMcwce1g%eDz%7!;L;J+;{k1{AP z7BeqrvLhG4mW3}1j*lIY1;bJ21xvkiryC{>#SU;j#c*B$m~;H7o%{2Oj2yZj&Uh== zApdtlA-}1hr|1Q-g9oO&<>fDZt4p*`5lR|8z?8PK+a67x430-k-#V24O6sF4Kc;T8 zhav4EgAT|i8bPlS3!btJPlF`uZL%MEGWo(cRyAw>L)2LKvs0&?4#R&{u2^a-bjF+D zcQ*9i`1RC6;7(7L6qB00=i2e1+5>O>z=1TpIY8G9sHXEl79Owwjmv^V4ceS$0gFl! zwsJ##fJ@n(OoU_aL3UOZ3ekHBZ$NsAY#*3F>UEYXXv@~>G_00;qO(@7`-H6y$OJ6Z z@N%|Q@7l_;-v&WwT-WB(2ecBFdKe(8mKy-B!gKqBFs+4x7(txf&)5v24CS`{y9X&@yyik`^Vs}BJjvnGb=*~fw+AMW{HkV+Etw4ODKl3ssF8h zY5%*g(Fe-DI-K{auJ_Q)Ny{S_a zoUlMtl1wvCMa06o`D5@yeiJVyo`gW@hno#(r?fdus#0@}=WM#p@J)ih*bSj%o5Q;y zE*;<;NM0r9m-6D#{?e*mY5y6S{%7rWm|FGsF9nS$yK*X4%Ly2&{d<|mIL0N?;2iU>P*LaWOo>3ul{1GcP%MOg?PTlVe9@-DcElf>yByO{t4b~ ze>t`CDxPh@7ci_+NwE^MoNy;N)MLumawPzALO^!zsBq-jk9-@fK8C{|kKc9ub9`&6 zdu~8MO1e<%X1QOiJ;7e}pf0PLc7<{uEPKKV>42Oj&X31;A{N5M^aW9cexZ^aRaYHD zf^q$`GH)LnmrMdv%1)VGIlML3{rV}cr5-h6yiZaTEV)k^VG zKMkZ$qzA2|FX@jB;OUs`@^6O0mje@aWpaN}UQO}uf1Ar$3toeo3F&)cLL~tKo0{IUX#UMwQ>$l9?g4 z-OhR;0Npzl%rzQ8T<#LEdd8OZ1BU@|QyAq(^lA4nuV>lUhTeqAyTdcitd>S4V)06m8Aa*~>JO)4 za=XDu9)9x=_P-|bjv$s~B5xQ}E#ma|RpId~bqQ4Irj$9!r;#`wuT40^!~}&3++?!I z;(NQKCxw|=cJ#U_AEdsp&wg~Vf#fN9`@$oP7cdj4XQ2Y@y=SUm1dhe9v^ve#QHF2G zLS;Io>u_4O8NKdm4m};3+*}w|N3(|d@_R$;ay7QyRRgoB6qXh`!+q_vr1HkR-nt`A zLdx96%dz*@iBrEh^v2`gL<>rje9sGZsCDwAdg1~ZMcgdPO7_# z!%UdY*yN?r{gelm{RzAv7=s7Yt(WpY#igYvQEM!rz>PN?s|p7i4Zwp1j{@%&YFK>0 zjC{hY*fayycCtn~u$%i=C2t5RMZwc1s|$D|8+#NIuh6vCwzR45#9#MOE&BSp_?X$~5u6M%GMC`YBVo9C6y6Z7? zNlW!APr|m6nQZ=o(h4XX(D4~rNeOKIIX>w%#PcbjU^wS5lCqOivNb#30>tEWmq1V( zA*nTJmVFlx`40oRbR(zLcr9wBEuiDo9df~yhz;%5GXb?yLsyg{Rxnj7`K-9Wsklpu zlBVC85ane;il%z{DYPUf#5AS47(P2D^ z6z8Lr{0A3~&qfa(U272_ylB6%2@8ceyrRY*j4EMsix(nPg~8B$ zb-23e(t+Bz5z1WNB)flE#I_$n%GK6B z*b86pok7kOYr{jKfxgNb3v~pC>L*2IJB=zLlITTg!jg<+0^b12aog?7;5bK<9h^WY zaB$RQoO%L6$`39xW@Q-P%o9<;yeh|dWD?I6*sKp-&ojFmdt+9vBwBH^u^}@2a+^;XP;w=e9V@!-s0Awr}qE3!0U3%I#pd$rhqlBVb!mW`{ zHpVv_auO{i^~a8`fRIu#$1=eydA%b&VTTj6{gDt2?R(wnwZRZG4CWzq138UVn~mdM zUtkbWxto;~R^)!VPxl`(d#z2olG3VCMY$s);oLVNK52{h@4C$)HVCl)h?ygN@P}GV z4!lzS(F~;hJo>@>ivYSUpvaa1i(XV<|F33I?4q--x7w#X}t`>uOZD~=gDU*f{c+f#b{eeDbhn@Z)94sn;NnL*3T($4X5JFTLl>d z?P<0MYgZ7Us~rIoDmPWiYL!W9`<*(j_zdjYdlxKf&Qf&Z#`>*$bMHl8*BHCVzKHA zN+V{r_z9q)x!#_!A##RlX%_vLh0-iMK&VAU`xC)Nr&vuPr*fS-JN}FEJv*aXqw<;? z0HUQNxSBvTY8rYxPB`{oCWLbZU?WJ+;b+WkpQ49i8bcxXlY&bMSI=8Y6?DAlDl#Fz z;r60jnNhOJA{v&c^7vz|GT9d|W)?U=u#6{*XOXZ1GF7FJC=~P0gT1F*xV=V9)Fy=3Q8W>oFSW?z$MjZib$LvYkk;MTCzVtSwb^hD zwg%lr>Mxg7e9rFCxTm)&`Q%ZZgD(f5DNuRLQ16@e(7X@S#m7ai*@2Wyk zv8lJ!%73==Suwk4z4c~oJZCRmoq9<&l)sIK?_+_qot?UOk<|z_f#`0kLhMp>o|}<69m{3{_3J?`6yCt6qr)C>Pj8>-aqwE9;{X zg=hbO1R$F-GMQvcf$(OXJ}?;BeA1*hu820J(^X3$b@&q_E?RZXTP2XAXe)QP(B<$}>WLQ_eUzH@r<#o32NRzyL4I^ubq@C^`R;D1Z)$?R z`DuP4-*7XDmmktl9d9fbQ=m3iB~8h>Ch&FVV=ZGmq>!`V()cd=s}oWhuE(PIlrDB9 zJf=w~s~xC*viIw0CtH`{K)iEiuKbL()@*vNI=WD|bWRPiL%df1UNw@P-X*Tql zF8IWlTF$ldYk(6m3LPS(_^vIk&f&InNv_F&)|XO6<}X9 zd&9r%GzP6H%btLbKXV+w{MGCsDK%)Oz90D%^(hp#zfnpT9hVri-Q6J9rl~*1L+oGP zD=DVt=A;7{WXlx@C**)fV>9-^=*za>elj%+-Pi+)3_$}FVfyOSeoy7IzGE)?6AouS zWPRaD^EN?E!rz(UGF1Mtq`2ag1lJF+@bC!#vHW%uEboYUsTyFxk&D~RweE|Or!VkD z#BnEEtIkRV-3ZH?AgmRe($?FI-}-Ud;LX?J2?yEjw2+M@`RG}=Hk6y zgtYG#a5+{0(xi+AjPq)SP7}p(%87R6fDRqH4otV2UhuBY;IvkiPlOi*v8`tq`!UvO zA_2O-HeV2!$5OOOAdHL}hg?@n8N&-Q?d@)jSFa-y&{Xa9_cHClbO)^4szHHbLyy zqdA;My+($Hy)JHdK~=}R#8{lz4bS!oEiY^khTk_BVb6h~LxEL{Cj_+?I5_0^SP!KDn z-PF|CIl{buoccC3DB!L2<49I3s35IhS9ST+cAf9h#3KVM-BO`GSKTg(ykU<;6=(Hi zKB(89)tYPeTpbOK>;Bmb%;3CVY04C!`DTy)nHN#NC;D#7YEAFW%cBLgStqP-vD=K4 zPoh-@$CZ3uJ!SEdviXOej(##8yr)h2ii%pb=7FegF)qS^c3)gtAuf;k*|$E+%IDzD z!m73)*O=jwU2k}?rLykH^9{w;eYy+PQAvm(c|MNA18&IN)@|F-2x;;>%T>f<;b4Ab zEw@q~b2E-B6*NrB5ZNKt{!zx2BZ!KDhGw0*pWt9ZT8=U!EywvS4!iPuouyBJ4l3n! z28~+Ux{lMQ9m#%!mR9y#6_jB~#W3rJad6@8tw%FTuIrdT)rIYb^>q%wqxVXp0S} zr&PLE5odx|d(ZqOZPd7HfVwl^*{MKqm9M)zKJm--AWjtClmA*$39c{RhiL8_>WgbN zh+Gj5rKzC7WP*Ve*|I%=66O=6x1J?((?6DEY7a?;dC4#_Wy>U>1S6{?`s9r+b|aR> z0DD0}Nt6Gc`8D!iVG(;DSB9zEW`0%1suGqX%_&-o#qVSW*C)LK zJz&*um}2wg>Oz~0+-CoUy-2FvH^1%#e|w+Rvb@T66YVUQdqFFC$ryV1T8^V?aukjR z2c_Vkvhs_SD+M{n(R%J(wP60bEnqQXrxg$*w^9Dk=O+_@@njirTsNP1n}L50*W@rj zalza9A2?Gf$&+~+eCw8r@lVxKHjn(?>HunTdx^lD?bXaH0vA5@pt25&_>*xF;r_ zKgWEedZTz)2u;@kslBq@P}6x;mMriNCpz=l4e(LGeA%xK)QggT@FwTVLQuCLrH#3Z z*D3+4awsJ0#N}t&LyM~($*+}xVthRC^qAgqM|*=-RwowjMZIidz=bBfGufI9Tpl}g zKX*~wgOzi${dLl3*IjZNTp_LXNmO5B|JDb9e$vawAPTIrjrUo5d!y>d^upFy0kM zX=gPP8!JNU-P{Ae=lvQgzR4VGUr`n*7&+j+@kd0tA~{pIp>uw-iIf-#1@l6 z##*rf1q~g$#9)0-Nw2P=z;^i-xn$}u$Sh2L-6hsOf`rRrg`ajPph~YcXX&wij_agjx88Q>`!bJoXg%53+4%@0aD-g17-(?WP>i$xFu` zvmSPcIUXhF5Sn78jiz~WVc&9Uw9fgjI_~>JT4e1@4MjmDr02AAP*2ZfKv{#t$wcgV z)Ho2;Uq^7pr%Zzk5M>b|2ZYLaU4&+yt1?721+u+h*i`R4XW|`!y1WR{$&69;`0$HH zV$D)l(e`ByyJ~yM34tv=a9MXtci;^fCxw=n58e>DO{tNyslCte!kNW)Bn!@xc`$$z!w z0;AyUp!C=30Ex*!g$b#OZ_HK2n0bpvl7l8IvmSH}E3t<*h98exTgx$re_3L|KJpc6Xt!NitR>&|y9njh|8IKa zTs1kqPZ-Xsrn?g^gd$mdgzT!#kqJrWPY12$=1RjRww0}q%m7dEjk55qQ5MkuDib$X zdo(9zUJh^14l5A{gVy5QTzQjoZLz>BYTHB6O-uBH^=tJwG26^}4FND5!Wfp6JjH9& zQxeBv68J&+DO#KK+i;)(*{-WUBPmz4Y_(&`;TdOLI?C=wKUH-C!s(CA(49qSTu2Le z&fl(lcH%nk{DiV`KH&~OfX>qay^fPYDnwb?h$x)Qbgt>~Ul#Z9f!Rnm?*R+ied?P9Z{O~I zZE^InP{J)STi@IL^?qiYG>r-pPcd*+61JJzur?7?U_B%(oct{|J(j=aDBAHUQPm>^ zGkAlx3)n$|tU1kYfq82gKr~d?MNHs5sLc}S#8!A;wv$rnWZ5jIB|j%gppeeY5gW=p zulj6ap=`L~L*msXAiVmhYc;JjD{+BZkW*s%o2@2hA`ZN=L__4atK-EZ{K8|Q6sb6O ze_#}D2l@QTzV2Mk{HI8woEfj%wL;xrNtXhi3oed*WFN?}n}U%M#o`(N4IBDFQlAXT zUVNxATq7ZiPFx&W*?$M>%mcZP3;rsp;hOl|A3RL6uXO0g<*F-I>y(|98&^iciP~eU zV2HF8)bi$Ci3bJLd8(g!r&!*ct%PqM@VtQmM8=;XZ4zjm57xIL z{0qs=eqGfeTfFwMho1^f5;&xgSLR|+m1ZW0R6mw#a;FZMeGymVUur(@QJi>~*L6v; zeivn-6f7oXFrfS>L?pPe_`A2eBr%b02sXJjLx2sZQYXLDqY-FS2&nQL;bed5dBDZ) z3)tu%me8S6KmZ<j){=AW;1W8tX-Qwt^0-NN zP9OBTrKnlHvjzP=?{)$m-x|3NrmM^#KPUS#lKLsl94T7U=xKL&v2jzvoJZUNt4h#k z;evLX9!9y@+YvYH*{;|ewBc6OuCp~|svPGQkppG&s2A0n;tP6XoCt`_xWD+XfmJbD z)Ab(w;|o5?^yE4G9afM=X}l|zpotZoxV3axq9b0~yt+cq0f|}Ktw1fvkCpc+D}`Sz zq76kVx~qxR{^|>flIjv?M0SSW@uW94EiW@eFx|tBQ_&fX8WpTfT()yzfGTdWCxk5( zgHIYvt1)(MZkLgzVk$@RT1~BQ+1=%Vc%g1YKP3+;=c=zR(C%*7JUTw?a|c`4 zO@Cjkq`V;_X1$R0(fKVA` zE>Q|ELqY)Y6*5u(fr+N69JH|_-;3D(@PC+l&#=F3@+*d517xB|npRCjOqMOTz#K$9@1mMvgtUMAw+OhF?c%xRN3s@M zT~)}pkzg>V#KqOH1F9N^ZJA-_=6M6QK@k7%-BR*$b0tS`KYI)q93 zvJ6-fG0Wv3TS@AnsUC^Z6T7K%gBc#I+bPD zpB->B*FUKbzV~G~Jz}dQeH;sd>=IWW=ZVbtihikIA9L=_1N6=dth!DSA4^oKNBtr!Pd*o&OPqV6u~PoIHs8BNVSHSX@*Agk z$45XKyYzZ;g(BE?R$NvB+~V4g@T_>=_ab=Wb80HjbwFQ(WKlMTZ znwjur_RQ}7lUtep1;pO)lx<0g3|N!htbF(bbNBm3FCEMRmNIZk<#~IgPGosEuEnTM zveT0b7`Vx~@7W6Y|F%6T`F=QIStG;c?NuUyB!V}yv{Jzi5k))YE|fb&v8}dy+227X za@%s)x5juTup^WJdQG^8+xl)kVo-#G%_GRCo#5?*?(_g)L7^{^E+?Kx_+TCmE}Fdq zbjwOJhMar>j6hFPzLS~t&me_pO+Pbz#E8D_;>YDd zcG(J1u;rrD`(qJ7V?uV5#RIp4y5_9xHlkaui&5S) z6pGR-9G6Is3L-sxMjfZim*h^GD!VXuCKBOL?gl6|-X0W4uTlfykTve0Eh>|v| z^7cF#>d}c|??jh{>vNzTbaxGH^@*MD&w-OH+Jr47yJ~` z$vbA%)R{#$D-~<5s^`?oi+^C6+L>@9a@UhFBnVN4N)0iC0Ec;FZpeU+jr0JB{#9<( zP$hZ&p0@~x(sYa=7)1<;2(^xsIwyC@$+?W}T;NeqZWm|{kV@C*6s&<&z&icz03w2# z?kFxx@oUqQmj@p3rePRlY-P7?9TK&S8%6mfI_hMirH>8C;usdS_gQUe?>}$bjsnSf zCEM`6`Jz&Td0Q)NaqP3}PjTJd=?;R{J#6yVoi7~!5v!upb2$+GOV-&y5*st+Y})yd z^O(RpJ`F9g1Yy)qo1C9#q+8UmyyDf*ju|xpCE2{QuEzC9@2AkA7*~9UGzzU zIWp^?)B;vH>yOJe;Pld7AQZuJxAG^L`Ri|cwWFnl0csHc>k^dg074X#I{jT2GHo*s@n_SuF% ze|OuAgnHscJ2;-QTDY4ADnl*bC9N;q@HngRO6V(a@e|8%z~PTl#Vl#=uLv+B;r+XI zgN-((gs){*WXhNOnxq|d$r!C%L0%)|T~z;Xvm~Z(A4$c?x%KrIb%o+QRin2ekKp7& z(%LtCznY*r0&QoOPEANI%L>MG&7EB9m`QHM@^dF@p1yMAD(<+x)#&cEV*S}THQ#pR zUHbi<+2$K-iD&B9MR@`%rQRa%B31ZMTm32`9I;On?Gwwl1xT^Vb=`UPZI-JRH6N+w zLDN2ogXvF2UP^m;z+%KKAC3ZC5Sxlh#b{mMF5kTZrERhyeOC*eKI&^hiM`hMYE_9XT|W;8 zFgTXbBlZ^}X`BzOm6FT+w8;BwDNO!0Z_9rz+#l=semLMe$YRdcxh-#A2Rn;h9qeP} zknr9-@1zN)24waH-plsUP<_ODCQ~R!$ix@d+JcbHMH-JXyBSU(4Zbi3VhG%<<6^|# z4A#e%3#nv=DHKkCdeN74=mb{OVoZ4>H%rX##&=JNnuroIlph%5_&F0jT<6pBlI6^; zFoEJ~IUK`Ygbe@EmWVUEwqXc_B2r^5{2HvKdj}BGqEJ4K<2Ikc00KX8`_*W@(g+#o zLBUdbS#rHmGr!^8@#00f`p z^#g$Oki*gria=V)vsB7GAQu{TQVqJy#(&$mKKJ5L_YsqDqhG!!ZPZx0emO3BUAA`q zimqhh=jW%c&72zuSid;P0Ux-8Dy5@UI5Iji2}V1_;_cmzU;cg+|Lw^%^%jaL>kL7C zCC=*@8CJ5c30nCS9ak+J{bcBe3w`}O(2^oxPbq6*7j(PFW63u2RYV$dm0mhF5rXvt zTio9Zc`3_r8VnG#eV7YW%)>UEG&&vSosrZS82GZU^Pb}y{xrd2>W9rrQom>#ZAG<3 zs<5;-vgN1%@)lx=*ryTkvi(Gxf|`1@cX9RcbnpWO_!65Fhnw@>q+bYux3#;Vu2=Yl zzjxGQvUz$%DRB${i@78x04<564j@h4uRUPdJr)MAXhH{Yy6t$NofbJOe9?4+J~CqD zHTAN?623C*p*y!2w^6^p`>{>7ioky0T3y+ZCcKtK2F_~x>ft6OPd^{dFQVr&-EMeH zE;V7T97DX4$?eiz;%g-a^0chABpUDF*|>;Awx4ZP-W1%Q2{e=7#(nJ1ax@6KPMfdHhRn!J*Skdcm3C^#@w7VB_5Se5sy5^AJxh}=dPdAJlM;isB7dG6M9wsi%)pID2%BIo6m(%i-Zbe+v%#sHJ zaUhXTK z^L;n`t5lj$FVxE|!}W;eI2TKp}JY)4Tf^GW*QK36v3@afrLour@CFxHw>RO$zE z;V$lGnzD-^`JO10+8>a;W?1gMzeSUEJTY{-^%y5$+x^()On8u=ezAdT&+S25pm^Mt z;q+=?Y3(DdgzS!1drs`J3lWq5S_~>j(L4%Zp9}X{F7>%4T^vllShBP-EdK*ZtYKjA z+14m`;(vQ=ZnDauo%uc+O0(gg4iW>tS6U@Uc#t&F>_>4xas5M%iO{Eb`8uo8dloam z02NjhuWp8UiP7Y1)nV1aMCF(Nd<1TIn09ht-a|fvecSndol^MTkP|5;dK%yO zk@M_Qfr`lXw5e;;J!GnK3DD0Z3 zz`qT9iH9L~LWZZ6R-S4=0zyMyp7gu_+$y|IX8d>v#3OyER0Hq{OdaP>t@p}i*w`fe zjuc$Q^Kv6W;2aa9bYl9@`NBM{Ftqr7w?8vQ?$iQ#azTja1c3IT%GfP0knc)+9)?c2 zR|-!0-pTNtC8gQrXx8Ps?+vzdI^WD*bH;oxQAA&)tZvEv&y?!m(HHLt@VY1vDXX}y zf8h~RJd=eXZ=i*Xy{Gu~?X*<+-e@bqqG4A(r6s$V5v8)5&I z$*29xrDY%iDCI-k)!cT;iaNy!$LEu9HN8${h}W6+OEH2Uj@~B3R%pv+zXD0)Ut0DR zzeo&>N&+~cfrJ8zL}n~x(mtyH>n26+or+$v{2PVzB5dn)qSe-X~ns_ENN6=rHH zpSFB6mg*OC;8i^9b_?pwG^{f0Hy{5qQT)IH2#H)3P#hh>v}8m+++o^1ZhyERle#UQ zyt-zpoBT3Q>_5NzP#*^l88bRM+-GU6M|Iit9^iL3PGHSjV|u)8JnPGYg{(ddQWJt> z;?xp1W3&~@iIMq^la6c)t!A%D-C8?e0|B2KzScBhqU|o!n|Q1%{p@MpC^f!X=qj6e zwvRniW!vsvFxJc4oRsGIL3c6ys2?WVzfV1}_ycZv+4?IphQ)a1wGgBpRs`Wy6uD2Q zh@i!_{X~w*S+g~3E+aDc0OX;4*R*_9<#MaoNQqa0u_d+r-Jctk1=d}wylB5@>0t)g z+5Ql193WW3dKqmz^sd~Z=Rfo3$q&?L8WBB#HZJn9^FlGDdwF`OrFniC4}_GC_Y%Zn zhCz_v?AJ^Dq;H;8v5zk_Bx_4|KUVCER2w`bcm7cW z9Dz9jbPO3iBWKmaoDCQTPM;fmYaOpf+sa!L!<`#sCOG|P4pB72;npIx_KEZ+>S;wK ztVlz-XHNAb;^zV-m3|H5YPA93!TPlb58n@tIIG-j{gpe7PjrJ?)xmCDgJG)gZ33_1 z#L@yi9S8-IpdipHGdvhps?i_FRoE%lIzr(Zxju5n{p5_k&MJ^m+%F=?@~{PQ32@Pe z-li;5gdo_ekX~)WbY>h_z$*xnDn4-zpIn+HlH}TyxgM@hH%m9o?}RURo? zcZK8@GDm)*=K4f9oSow|@Ums#n4BIiE|z><=z7a=X0B1S{?YJkthq*0BTI7i&=B1Er<)@39x$IvT zLcT`%oa6DwUr1nho=~?R&{-)HbRL=xDF=Sr%T- z1fDJaK*elcGlu2eFMR%=o%$@;We{y#!B-=#!u=wCOX@pOyeWNY3R7<=XHyasS2!Ee z#G_uST8BTYO?|1q!x!a*pSUVmW}q@tXd4OeHzMj@K>Nut;{gWB{5bei7OTq=4@f7f z(9Xwyo3JE-FYa9f59>2;_HSW7YSk8p0!=*J0ONHU)`K+FCiT8pfo`S6g+MZk@Ym}> zD`Mf&=uycm2>IP(S6l=`1?uG_W$Fg?O1?Thllbg(Ed+N`j5;y8WIbd7u1!*U`j#_F)GA z$$a6Gr*=jqXd)okl)EH}W78Pj<0^d{p(lHKkm-&H*}5_BrIIp8K6YoLIbY?LVokgv zlj5kzC=*tIs$nF%h+c@j>7spXG1pqIx9cqwPR$nwG7P)AjMFK|W)Kv*=L02{xkMcA z&O%_ef$Ekg2$kB$1Wue012W(&*Hb+d7HnO4=sn4YoT_tbq240-E9wYu2F~oV=ly6E zI63acAR z(d~Zai%W~mtm8{*s|~p|xkH6N^fZ$jSK3kE1-D|YMF&)Ag?>@X-+3JFE9G`C4hRO5 zjhhoZ`CYB(@sT6eU@~K3)r2kIF-d;$v_ffyW(&QPb7j-fM>1$YwkyFiOz3fM2FZgM z?7bsf%d0|*x9n7C=E%41buM8x6dU#yL=~&ymuEVUwV>oZKC{@u)ku7E$tKwf@L_aQ>1md_~-Dx4D5BY*)%Mg_<@)f>BVLToRn0B1O>DVk30v8(9cM< z8->@@0V(9T-1bB6?c<%GC4dRkTYcH`Ltuo9cR4arzT7B>{;5quto|(4HFBpBx{;uL zcsl4ivZ{gQ(ZzGiF?I_HUem|Tk)|C8XtW$k`Oe&lZ;fwiV`eLfU1{IN8oD1_^oJ#O z4SwIkAhelY-F46mMj87s*Dj&|Q$?J^j|BziTBA07B72?I65gd@tIT^+7`%;|E1^Iz zbPWgosJP78teWh-`LD}m>OeF!dK)~Q3V>a@H^V10wt)CZBc=h7P@+}EnP4f5w%Sp3 z>h%L+qdWZ|3i8gTR8XWjm9Oueuds##SE|+zB4GHkj?rptFqq$;YxH_DaK+g7Ao{6# zUzT9DH*rSP|LhQ_4O}Tu0s=ZIRq-@0iaZsJNBkt)Aqrd>6b6F1bLDF%=wDg@_k_d3 z;VVljq;Q2p>+#R%SF+ldiUjL{9EoK^-*G(F@e&-)Tdk8K`Rn~AX=iJ{UF1Qbc=5Dn} zAmw*EpVgcy>m6|~ax>)JU}Srs=BX2d7UFbfYOp0mcjYVai1dYKyF)I;$dyj96tbzA z2*A{?(t^iR980sgSswDDTE;^}yiOtNy|usC$L%dO0WPJVB7*BL%?bYqb;b8Fd(nBPNrkg0lV$v!BiR|T z?wDp4JwzR!Ko3MBSUmKxZ zy)-Wta$Rp4Xxct(c_+Q>V|5~*Q!Y)=`{u72{cHJ-w%lz2mnBV)!3Mug+48Z8P(|uW zJRoZOr}tb}2ebWGFT$G?0l~t^J*_XKmS+QyJZ(0)6+X^H^u1uTZ9D8uq0shI_u`oR zpSEL(JmxzQDajsdt?=Q=?*6*z2$7>Smc+Ux$T6Rw>tq!~3$_mBLHfN>>Q%(UmWE3v zY;cT$OK@xbKgzqjQkGs0uSf1YS1hv%Z0^Q)<+xak{%4wOY9K^;&p&)xf2QKe4wWUm zS%2W}wax<1XCm5z8CQzuGR1JuA+`sc*Rt1`7Z1ARe|8~F{aFWUy^A&K zOIzpu`J>zs z(IaYbo{xo_FxJZEB56?xd{fKN5}Wff7q%mYm{zX{0#CMcI@W;HYhkuh!lhl>f_rOH zJU-44E%3PD^k*rRiICvw@*hPHw&fq+iKT`m%D)lcG9REgtrwcufpo!o@W|Gd{MG;e zSD(h+&6KYNihos*_PxFMiO}TP631NwK?W*?*&8IFbd(~;t+QWe6L&kK(_mM~Vd>thojUCe{} zkkGo3&6MgY73Yyt>F56r8?45x(=FfqqT~`i)7!QVoKC|a z1ew;+YHT&kx*ej(v2j+9;5{8$m>lw1q4(3>Vg)lnIwS+e7@@pk7k&=M&$9J6m8M9IUe0@(1;v4 z%Xt7P=*pf^C%=Thsyrkg@b`z8%YsSmklY9?ANxybRWBV9hzO01he#sd?Ok;CKep#z zw-K7jGFIGi9`HAfS7^7|bnYRyD~lQ2Wc8cg9spGI$`r3K2!$DwxG>!T-Y_l1Q?;w= z^&Es<8HaQtBNT0#D!2hQgG=GVi)T{sN9G>3Qb95t)##yiE_bGtibY?HR`vcO@O6cL zK7B$J+kV09l$SZGZ+;PHtK{K+)$kZ>?e%wA$K2y6A(q$xWfA-XiJ*0Ddae*^mDf@8 zD`7B!n!;?^O7jGXF{#Kst6s-*RlDqdDN^%q|Gt~-i_gFx1x&~vmJ`C=UiF^V;k7J* z7G=DR&-gFl^Cs*2@~1I+Y%$$a?m2@s4zwc~w63)WWx1?#Dv8@{W+{p`f}8L}^bp^@ z_tDb`Yz$aIU)XHzq3F0Ap+GA~laDHhaa1hU5uWbb*a8d`1I$8041BLiEBW(3XO8NEM@w|VDXdW)YBh*<>+ zi{hWQx{Y>LNhNP&Y?xW0RyuqvDJe4cFb7NHm@eO5Ur1@)mPM`fYIht|=yQog z`&{jOE$H!tU&%P1kCi5nbsO-KSH=&s?mB}-w%Xc^@4ma|br>q{M0sX?Ky+g}4*USiSstb95f2wZFj$#LKuNG}{QFOaP&%>_| zFX^|29uyOX#=+(4!UqLLd6%7goaSP4H}lb83jKBPK75fJK-SqgdU}9udEa1eB68^;@PA7PH*}rZLe+gTP5HTYF2i_2g z``2TwS-Y>(B*@`Dei59Dls09t40()XL@|c*45uVdQi?Xt?R|hhss!}2w*KD@Dvluz zagwwnALRW+1C!RcEd3NW>tV``P(OUuT#~cr35P2d4{w`&e7HKZ9_Bu!hbxxRh$ZRN#KF*oF>z8R{d4E5;O$wgsv=k5RL>7in_gTaupZeD=|>hA0Hs zG&P)afh#TI%@paR7~HH;Rq2|C`&SGl&6w?)3h}lGUjmjGgvpnz)2Dx(?rz>?U2|vO zj1hp@gIMkYli?w1d9%Q$#@;zW_az?gwF}`(5v5i-^u;1UD>!7SFRR6GAGJL;I5}Nua^_*_#eFtAiOqwf)!y(bg5k(26}4w zjJCM8oay$suAJrnnx^pyncikp0U|IGS2?iXirY3BZ99-4OO2Us4)J9pj)<|q+`*XF z{ohu;P)w{w?3K=a-dW=!p6XLZuF!X!0rvWDp(0uaK&1!F zn&K>)bDdk=P1bNxtW7$i^wN=in?mbbX2@46CY7M|eFF42uPdbxd+j>lmQy3Qo6#H| zb6ak8EsLfbDMw2L8fYa>_$1c3n$>f9eFnOHs%(Dk0?x~(AXG)?wY|^yE9$3VL2H0@ zn>@Saf&t@vryvsqhOuW(TsOkq{gP6so~S23ofj>*JhbhSv)IIEIFjzgWyyiUa3%)z zI`T`HU7G41OzX@QbRJN!jx@8J!YFZede5sAWR+xOg@ZO@WT$5urI=2M<~xoNx{;UN z*l4{2(XRZRLnYIy3G%BDxEsG#y>&%M>7d~I%gq5CPqkEQ`_jn;o5J%j%z$dFyur|tKzaFCB$d!F!j%MD%Wx=mEmk^{m z;scvpsY|lsM#vQ?dpc6-ZN>S)ynNS}sh0@w}kvK0qr4G zAS?*aohfL)#Ac0PTOiLj&4W?H`ds0)!bF=pYL5n4f|IbLV*?eqozK@4^nb*X1XMW#*fh^hcH%$1G%{C2ci$hPuGiiec2p9BYT{0b-4lZ{x^(lpI z?|WW8Pwx$wIIuT=AOM@Ste=87fx=>i*KVamGTh*eo5GRLEq? zCI1c?NHMN`Q0r}5>#@3o*A05pD{VuSn=T8)f{=0Q@z*xL+G3sin}>*mcT>^sv$r1z zBC>YxD;*OF%CsaXO?qX3dCxsi5F$r}DA_{pg;`G~GfntN1%BET~LF z!G1#)NY5dEy%uzT+hK}IoZb;ZTspM}w0>C9i-2EqTTTj7CBeWCX&M>F%iKfGb<*OTXFclwcJ~=YmTzkOVNX}_*=n3;2n}$IGVC%J)H0E zxsnp@ZH8vxPv#an8<)stGCq`bq5Frb;4owy08M5I2BmE5w4bK=zZMd%#$QAWCe{HV)%#ilOk`UnO>n<+6zK zR0F!vT;Zd0X^Ri2@#O+ax{cO_KW& zHyBL^4Y5Yh9VY`vPyMS(F~3phx>wb z6vRe=0a_D$r6iMEF2JHtLDW<5@e<}r%gdK>3{R7U9{a?(Q;v_@pZ~mk>0jLtl@yi| z|KqYu{iKMo+bvavN7@u7&znR7tq%&#?6QN9Og!=+-E)Q0KE#iQr>y0t>5)MPnRP-J zjB;3}&?xWZgMhqRZmxu*>aZYz`Itu@Hur#8Pe5L zO;vBc*RU`uhrCN0xzt!o)5k-M^D*Xb#JY;7ogm(ew7aPj(@gd-g1a9+C^Wv{XA518hwS6dZwstlfS$9tM5|Y9(m5t#Jf%yx7y6a;x zx1P`|kb1woczt}f_tT)Y7zCf;s_Hm2awucC;OvKh50_p|p99k=Yk|qo)#w4|)rXQt zCtB2Nc24pq|75n^9c^Tq4j`Wz0-rpKy$;wq4Q1)EW(=suLyi%QM~@0Wn9%8NyoOC# z(KI@|^Ft9Fd6p$+?$U<%#@n^l(z&9n#JS!o*~Uj3c9t{$IN=XZgoc!%BkzCa-A>_a zks!55o{*Fk4vRnxCs+!(O2|9=^%(bFdgQbn9M+GIpcI3*_i9IMXXZ-;M9K1-0u$@&TyzfM;J@O#L4QTbwgT2OAW&U<1s3{TdnF|;9PHnS;Slj!|1L6D#W4d34JrdDebaLTVuqs zfa8j<1*=*gk?^!juA_?9k;R)fH(X%eweZtw_kzI&KZVTEh3raFI#ihl;PqS`02Hqu z!1NP3AT5H%ZVVaj>d)CV`>eE_#T&G)D&`ySe;l@d9iI<98r<`@TxTHdJ4%LStTZ`W zKa;AX{SITX+2>l0rtjuzn7cM*4}y?Z*ga~4Tv3U^mu^`+W^b9GY!-3ki~z}YafNGw zS3ntmz5RN9r|)R8J{$7RK_WH4M^bO+Q3mF-A41b9?2!e+#BLgQ_GVT%oVcdPQ;6ZL z^1JV20s9b~*JR;`xrQ?>E4YS&JXOU3%Q-+Lt5tY&9>(pN_p>R3=Qy-WtE zh81?-m(=Edyx`~s2;)AD_4iu|S5$+F>r-4wHvv=Z=pM4SGn@+_;ez2^n{n-1i=b7@ zf1o*u7$lU#ERsj{NEeLqjO*c5KX(!%cxOS5M#^ytfOeUPGU?3XZXu^Ts;oQyHj`Lb zaJwGPZ@X9$FFQ^3yElF%QooL)${X`^egv49sA0bJMgMrlOfhQg)71y z#bb(UpH{91Rak#=C3wCWoqep)h``}!bVbfPyY96a5(i4O zXqd1TP=sVR-#Kn9`Y5wbvKG>e^O{V2QCzD1rNwI*=zAK;J~oT2+r%@(<3KI?l)e_P zAwD83dpoxPuWlf0gRWVlpLh2stj&v9obP&m)969W&!Z<??v?6s<|?|m;cY+ECh#;@jEjsMQRTAXte(* zq%;mU9I#en(hhxHwcZ{JC7n1X!Yfs#37i9G!V`nn-;eP#9j-jSL|u9U(vYX(!XeQv z$4{DF9_$-}nBZ2Mn;hWY*^E@hE9H<#1WDNv~O{GwviFXu1+Lei9lnIUfRD<(#`jSN{n8b6jKL{!DUhEV{L+?c;F8 z1A%D#%&FK3K+35N-vvl+I^EbcH62I@CT?M3S6}+RL0c_YS2%Dw#47jbQ)sx-Qs$WB>-F-7Is(ORF>l@z^P&q}AV zb=|4!XcT7k2=YeOfLLo|C?exyKiUJ>cV&kxkP7B>%pUnhurVSFy1K06eAUp)N{~ye zP-)?b*Hx}H-W>_>-wgJ*5?+24{MKY=Y+~1V1>giPy`r2@Uf%))o%;7C=W1NMO*lPl zeR2)Qa^y)EX^zmOnG63mLBx1|Fcftia~y>l6YJDsY#n+PJai0|x>r?CUV%QnQuE1n zV`y^CcKG>VfeFGK`MfY#UkVe_oRMc-qi=;kuR`iUBtF9g+76K*ohpv6AP74XBrX91 ze8m`h0Mx+A;ePVzFI0gtO@lD)ReC%q!j!_|9unMY8%X7L=gLHsw$W_StCM{AkWYTW zptUR1(0Oj#1gk+_8}tIu*>GqNX@YMIsNl13y4sDCv^e znDzx^Ud9g2a|QOw;=P^4Lv^yft>pbm`RR~z2$HPFudZkCs0Q@@hJU?xhpmZp|Kh_! zpN9@hcj-F(|5!%33Wbx=T%OQgcVX~CUQghlZ}fn@Quhny^ZV*0Q`>f?!)Kk(sw=Ni zF%jc2%lK0OjBW;orl%Q;*Rdh_s(T~Jrx`LCoVIsY!XfpaM&-sxi*)r;*Am!Ds z-OmWalc@5LD9<17ui{Ut>vu=$ji(Q!a22y;y<#p{%7SeI+n5Y^)28e`dE)wkI&<5Ge&<4{fN^G$ z4>e^VF2V8dvgIIo>Ira=HeEJP&n(L}5m^}E$n;LP7ZQq@1GybvtI+BQAP@MgpiSZ} zD{lGXnySC0ah7r-Xof=rL{D5>33NOftgN1=s%-a~m82u73Z{Q0Vy>Ra70SuaFzf!` z4QexI1IS&2wG3Kq?COD>HZP>WmiHv~N;J!-^^QDfZtLL;JJ^I(&NjH^Vzd!4!L8@E zxyqg?{flC9{E8{>yxxW?Si7D_{FG|4IZkRos>-q}i453}I38(f-a>7!zw=dmvVkc& z6tn$F$akT5R)$CVnPmwJ^#|>{JE79n-74tczf7uMP_)F!@9(U%c}CKV7kyq1?BTF* zg4R{LTSZ#{P*U9?_NxlqZ3r~l6b5s23KX!LGObvh0(kz9I*pRtJfa|eiLawNt{ro4 z8C5mdP0{-9k0bw#%CSA!xm!*-?#@&sfRDj@nYI}7dp1gdY|otv-kQmy9h|$}oL9x% z{>140SvWcAxHZT~&nreP`+kJuzDj#7;LoYZOFgZXFOc70P|laH6OOrO=?1OOQ}wwV zuR`kAv!or;C(Y~_%s_K5(`<~EFj#H%VQ^h15F1n#nR2Vxs;}BB_7=d|=TiRrf?}#T zIK1e0d*<%|hmlFiWY1BehO{(fVC6pu&sPJ6BLEbg*H}oh6;E%X3D_@DBT5i5#mSSH zBZ%#Je;pm3(-nd(T-K;rK*`HkwJap^Nb4qJ=@-C#sWSv6Ji2V z2g2BG9~%@w7A(`){Y`9q7ka(Ke1+r<$nL%e!$%9lO5Vkch{746WIzoKF^qYVMmv!7 znTkEZ?DF4RnZ0HQaAwBh0m|D{bNLx@DZ45iN!0mE*DTdhK=|{QZ@YNov%b^n79ic= zR+-#!)xkNO49NC)t~l<~>+Q7^=%rT$+mm;PlizJQ;o0PpSgA-3qhIWMj`iukx_I2~ z4hm3ymmoN}r3qZUViWXl5D2FtcT;bTmo!DV+)&a>7C(4Rh+_BZ(KF^=;IhQ*@Ry!V zKf&=4AiH~!6%^k8vxvGh)X93LYUXd|cYks|>rXEmEDb-S{vOe<^;5>VKa(SmGM0p^ z4d*ui2eRQLcd4q+tpz+~rY;<2mv--WXbPxQ7Zn=yYVIfG(-N;Q@_%NFmDU1Gu%h4T z0AlgA|)URsHE1axf1Nqge$Yh`nV%w7UO5wkTh5RQJ$FrFHmvLhQ8H$jJC3eH%YO zPG-dESX7`91`sIkXIDDNNm8?QzCTtWnBuuFOl*_Zha?zx|`$+4O#Z=e3-2nN86H-$_qo#dmf z1g>#G9ILexeY7VMqlp^CSZEE1|1D@<$2W^?f_l zY=eaqi{u7g^D}!(nCI-ek-^m)C;VCzahuC7kJLCmxarYwKW_Kbsv1a^+$i^lIOFHJ3NmJq~=gA zy!9^}?#6#&ZAuOs%B?upknvS==ZoaqlBYxZ0Id!&ai~H!%(hhw-Y#~rV7JWO`IfwM zdnFi15IX=By3RMNnvOoY-b$Y+%5FukS6+xJrff;>&(^;!36s;91+?Og<)g@+{u`e0 zytNcn!xTAWghq68m5dLcH1x*wq{&0fK0|p=eI;E~DLWzY#oaN$t&^1>nh)yo87PSZ z@_FG|HVbIj(9g_fAk7cj!m|r+uL4px#R&&;oOPvkul(jU5WfmsI~00K-V9B)8b45i zH6HkGi`XU(7${jLd0VUi`bL!r@0!$z8Yatcg6f>XS37OYNWoJ<$1Q(`P`Uue1=1;3 zVl7vtXpe5v^4n=?8mFZcfi?n^BDyIKHb!#|Q%f#WK=`;q#w= z)Wf{YDmbAh*{@XxiVv-xKZP9dBK=;bZeut1;wq65vGr;#!15N5Sf6dvAVB^F*MwJ= z2tM`SpjQ{{zU|7*84hd=MHg3)4EE2aGnkoeIMtM_P#y#u%i#HWD%Duxl*rz zxWQUxkr)kNVAo_WU_4na;RzZ8;&fDHawvGD?Qd-naN_x9T)s3b0BS zuW&w<^%~N5N>iPH^Ut--eluZ&>Ahv=EW&!>MEE;D0Fs(3t>)iWvGDeDtxE%v`MYx5 zAsufIv=U<+T%zKyA6T)p4J#xVG!4T{(2<%vP;1aAV(vh4)~`MAxwKuy+xS3fv!PdJ zQ7<)e#`Xb&hD*>KLA#%oCXaAlo<2~EBU{K;8w}r?&J&b~@C5wuP8%k$3fS3QXXhJb z4RJnDWov_;3f?~HTn^@31WZ?lrNZL%RHl^y`!z8s385B2KFdV+NAmH(9aRVBd6eZp z;O&3a2rAhuzUyuiv}kF|=wG9`uciq)2|4W!^Zt09IuoluLkq2PPE)?lF;Gt^-V+XX zF#;E&ngv+omx1Pda@;_1njrF466mY*t?gGk%ySxgX8%Td&mx^vm)&M4PLd_yp6B?z!uHxTd$ zf_J|>#yY}iK&6}&b0dCs+~EBMaL^tF+<3ME$v`rvxAL5K=l%+KugTv^A2W6Bocy0X zM$^6{aBZLiI_R*3ar>5^!D62q4fPtYm>6s3MU0vxEripjx6dO^%t;2bpJ+MI#0%1} zFLrK3*$5s;tnqjL?mW8u{_|UaB?t)WmcW)2fDH1p-6%_ov_<*bGfg$IB_yDVb=|U) z1#irGF9m{)BmgBSPr2=vU1+M?3Wrd%n}~8?i4W$uw)pb1%oYq_;YFCeD{HsuEPq`J zv$$QiD7G^9201kCCm$88DF#)q*x`%6hykeb^0RjQv`YhkeM0xA#=u=iz+g4*pf39e zmFU7x_PE$-0k*!$zg~kI*>pCdJd*&Uf%p7bFB>oRRfrM*;YeK{iE`{IthaMAc#cOF zZJQ(y0ZSk(9cdMme6WCk6Ci9X-DW;KBtFe10&R(rjMr1%a8=gxk-1_bq&)j?t#DQq zRzSFG^q{dUKEb)+-z=zjweEBOL?Sr?B4_X;t7pSvZ=jIJF$|5M7N(xeumUT^O93oK zNS_8$&{;=q^+;wOdrm#08)&Q|+|54VpAAMvdQ-wX&I#KkE8)A<#a&kCNsTU2)@Z-! zn0Lx%@doP4#Xkro{&39$azD)VrVe9>GiA+mF>AT@S@nml`;=I0c ztWGC#Lm2~$HASJloQWb-!2Lq2loZ$wkf=r`|LEh$HN-vJCQ5thPwKD44-YNqXDI^x zx7M<;E*MR_HMJGc=vi2gPWf!@e4@->9Q_B&chZ#d!(y*d>+*qKZDvX3VniGK#+0jD zk7eJ5-D^pX@c2zwQ6AthQ@uD=X5Y^Eh4jC8d+(qo*3JcL(pcrQ($(uwcISG($53bBHRw&30Jh8B z8);N&9PI{!yo)l#v~)J`VCK~0nd|0Ud2Ok+Ed>2EAq3+-<6WIWo@E`YKY86tH5s8_ zozo{&h^v51N;?+WQAagm^QBV9PL{sziz0i7we^0;*_sc~Lo%F2n9j7DjQsEz%}MRe zEqfpxxlpRVwxBa<;2gtgWR+aj+&;-oLA7BJ5Xu`YB)tweLwb2Pl`Oh~_Dy*=j(vBI z;gFw`?RAUvI~wPhRSKb3Y(}{R0GDhQd{lzgkiC6GF zS2_&wL7CkF&LC2H>RE~}H?$7L24CpVBBOF$p(x<&M0O6K=0aK&-xHNxJ9sd%T0l?3 zHlK4FClvO;*+5WvnmA!edlM_jC6?8%e-^Lb6fBpk$WgW%CZd*0KcDH>-b$k z&{o2RlJu{U+@_8i&B`Wo=Mq5yf9wO#M?sAJUrnn^CBZ<_?~YAPF?b@q35a7=^}W8i zAV)brc;S6AFZauL=sN6^1EE?3@ZU5yxPEOX%cjr%VA9aDez(KxooI=*MB0LS;ETZ* ztm0D|&&|0n!+7nq#V2x_p=LkKcT3k>mM5r^SvF79uQv2!d8K{{7j#}Htq<_-5}GWe zb^_FAn~QV4V4Xcgi&+40he|!fdrGnjr1;P~n1w-k+PVWHpz4d4eAq%NqgQrbBS{pD zg5SloiD)5DQh{Uyvf3~pg?{!bP+_z~{QfFn(9Bs`(b8rHn9ZfAZL?>SCGq1OKHz~N zXv4gqim=Hy^EUJgJQ#MU7IPC+kG+%sDnrm_T9HQQ9h4*$c>B(#m;Hw1;)nl@A0(|J z^}&s#*@Cvbv6E!xf&EcC>5H2VqGBF2i9(J^<6kUQ!~{rR|1RF#%u+(uJ}r0{0PGKB zk%CV|BE8B!mO`XOe;s;T6cVHb=P!<)SVTIGPIxScwvT?Qhrx&AO|7%BQ`~v`TjtK1_r?=q9*&*wI|I4wX49nwA{>8DE(Vtk%4zD+80U=; zQH!>n?{462I_;;OYm4a=Z6|aAH|Bn#PztdV{tX#Q-BBGkr0Ftc3Rn8if=IS~AY{w# zti@w&{41rP(q${9I9d<41Wf|6ZiErXepk%!%${;@c`!%0OH(l8*lKSLKQx>z&39#m z3DGYq;CFN7Dq$db#s`S!U=LLW!WkQTA;fMKIj81P48Y&5xnJZx<9!SViq)%YAoS^> zt;AcJ1%CRrvnvaZ^T!5{G94yj2kvu~brE)o$e#NIr)5M%Qd#}LZ{Y%8NqkJemV6Xo zH}r-MYP^V{@(v8=HKnR7;h|!%+imwi88yU1sTy)J2UaDnPVr7F(|=l~^?VTsMgcRS z{qHU22Y~HRgOh$srp49$q{MDS&d;{G4DOO6`2!$B?#(_Pc)@Ty-JFn1AnC-9!P>`E z!wfGVmvclC8eEHR0kqTUo=eP()QIoZYTvr;338bJj|uQU4Z9TTI;`XrY;j&=c=YWs zwA<784SESWa(#jw`q0+wQG|f5UxfAOE`yJ9CN8QyORa2;$|zHO!%D)Ie=9Tmaw8~k zazQRQ;vpNMZM&5mBX_r>Mw1I5iSZFE+=%bYUt}r>6*oTrNs>zSjKVBk%Uo*m1&V}x z!C>D|2iR07c16;xg=O*JWM*p?vLTL}@o;WNk(G~KkFz2@+sF7j&T*2)X<>j&o?2Zo zLz*%=aG~>SiRLbeVx5JTuTt+q7ceM9`~yattd=p++W`gE#u&LJ&xG8;5#(Y z-tAhE2+#vy$`sxLnd|HNruZaHC5yZ5_>Y4_~4u6R7nTQ(F=R#9}(ER0L&fNC&WSZU$9JEmJMcy=C zA8{Zzl#dKZ_pK687h+!HwD;`wh`u0~Xg9cD0fJWDKwWj62UkWyea=d*4x8c-5qS4Z zk1vZ1A`$p0=KF6(0G70xM*~rId{?IuSF3xToDr#wK*}QLacfH#;)(TIfi_wkI6!w6M98ghT%3C8iVwY<9=|{K3f4g(I zWf07`S8sb4c9HD=deG$ThQ3XD4v|FwCrBJJ=oY z`6&G}@u(2LG9#cci|_^ZrL8gY;vejNFJ^4=jVE|cv~q2HO`kJ=1Jh-=0 z%H{YG6UA0l``citLqvZ+z|cUBO^=?3Y-_Dc)`yva_tV!J{wAqUpA{)jpJ*+$b?5bk z_coPwV;3l!^1!q!-A;=O50!;rjml^F%ZR9s2M&`u4fD7??_<3w@tX0o`DJJ>S0?Gy*H?k$11Hs5?5vmGE+&E#~5s0Kf6*d(w08>)3$F~Hl< z+E=6;cQmIZS%QoT|(B zR7ber6lj^xew@;xPh^o|Uf59mX$JwaBvrqQ3BQ^1jgm{NvWoRimNlpU#*_(-irjCi zM~J#NRjf}y+*RLs1-tn3n-dZR7f(@kTuPwEItb)#3oRE5h?k$LK?*j;WJKei_bPV&Jga>k!yrFAx+o!#&2{H6Y=pxsX>P_v*+!+O|UheukA9lZbW6C zZ<6`vjg>LnfelCF4G6uiTh4=|;)>@EiRRHh&mF0&fZ1dK)$#pm5&+0U{#od+1o^H7 z!7DEsIp9Cz{{`a-Hq0L`b3767qdLD!dHD|@1KhWZbyoeNL~@rIA*Ff~)4+jat#^eJ zw3&HsKfO~|F6FvNi}uiIREQ4E9oBuxJYojy3f2#PIVy6`IL7EccjbIhPmsA~Zp|T4 ztIzF5UK?80f4n`kI_;z6jt=Vj6@v)p_o-6XflTLIU>O;JhHn7St|kJU1=C> z+8s(5h?2zcVC!Sb%e0)G>4Km0$wp*M1FS!3)wDyrsRU9kr~J8wRjy8U;k<;kl6>p}K3YR9+U1 z0$pPK>jb9T2Pg)`B!!?={UBdgl7jt}1r$wQE{7vP{I_z#W8=b=_N&8>^p2wfgFT~3&`T*a37 znC=6CYmJSdX>&6>niFA%X~(WuM!R;8CCP#1=5$A~74AsOSpeD<0C^*O;YjAm6WA_o z6P6a?J-eT}!VUyhPEyOD>^<6OBWBQq;Iw@JzqO^^PLO6?u)aG53`CnN$M$fB=UbuGg79hs4Bdm{h2VIRlzd(i=5bB3WVz~&NdRYOEhCXnyJ zh3A`V&QAh&l>R3O@gJ(5E)iH?ytjHWD_gR`A7giCZxFM2hzbM*-wn#3H3}vHRtFOHWo8m(tXR5M z`LydnnGsVF;GE^~(fDZnFMkCfELFZ+^Elg-W66e|iCA==gruue|KKI%!ymaBncyp&;w63$-20oAS@N!cEqK3@?8P2}vXjGG2rwNk+0`4@5uR6DxC&RRa2w ziX+8>O-DbL>+D@d$`PDyhxU3Mp^G0R#U42XowU#LP+S3=9GCp}lu_f!L2gIrN-3k4@?U$!ssuW4^_lFhB`v8K97UH0Do6OFNw#CVp61w$%XZHla^sn?(DO3cR<%`w4Lb^tF=XR z#vRFee+s)*5Qy!JbPi5*yw^zzC1?||gp^VVx;$5@-y9!eoRtfgp|I9_j$K>}MX#!# zwKpuZ#NT6p(4$FGP=F*trO_jgdFAtj+$I$q$K0z>-9e4t7YpNJ#VpFJ33lE%sP29q z5F*U1KlSTuZ!?#~hHecJsYgBQ750UTbZaBCMC5smmvOF2Bvb4wZf(!b^OXlgqz20C|q?8%o}1=UuK7mG@+zu`)jaz|FijL6YN%N5zsOX73q= zTKrk%gxm2Q8X9T|Uj(k${o=DXbqv~;GF-e2aR|7w=Q|BB_?Go{l8W2>aO@oE)jJw? zT92EWJqlY{2CYJS)G4p@uMVNVk|^x&Rp}1}PD;p{lh+E}G_BYIu)LC~lP09ywu_+D zH~|j0zw;vSgrwkf*AqK2Lu1EHva4Ms1iK#gZhP7FOLN~9Bw~^A>Ll>H$mRD*Vju)Y zd|Yh#g^HbErQLV~Zmh&^_8>=)AGqV4gqNItKfyB}0(f8=4r-zFEDC=d^V)6h=gzgA zDWYz<;c@Tr{!~6RpqMlD-JwSBuaebVd5UVx5^eI@QCM_8p-lA?4|3yK^Yo#Y@r+LO z;g3MD_%^(cq{*GB2$+ojBiE-rg*OMWZf=ST*W3hro+j5ajz@6%XL6oeThfl>1Su5u z4|EEzUug-L6_qSMt0jq9Ds2`_}P)Bku# z_P^-`Lu(>d4b00H%TM=g29gt(-TYUXVR{>D(rG0bH3GgDtx{@iJ3}thYeQ<#;6e#s z$Nj)cC*$C#g|7HV)e$TLA3X@UjSw=_F5Koz*bp9HZZ(7)wGG`$BsRXO{8O4{c@5q= zh>hZdO2ju5$)7MpILXD|FW=Qmh+WBzeoqDxVCKG%GkQY;8|QoqGIR8h^v-Ufo!9+NlSH#c5$PCK*NCy?09TLChX zw9l+JL3}_*MD#8Uh$DADx>~>u+1h$@f-M0(O=$or-FPEp=SeG#j{CuS?Ky6R)BF^y zch2j6IwSO#374=_Xzdy8ORn4ilq>Ay0y=Td|#PQ2YoyAz7DoehO^N*Gb zTSGWY?waeYXE&fGq&8`+kTh2Re>?(}*4#+~k-Ls!X-Ch?Dl0r~c*L)zoHYu4Acm!!XWdam;c+>y0S zZF1mBX*HD$Zn-cu(_ILkEpPd2PIipL`nkdyu%5zrOUhvfsE(6-Pk529^J?OOPU^RY zE1;OBXC+TndUHBvw%v}MEUCFn0~w+5-T(`aYS{Q(Vs(jSyehM~3BFjDP%AF5SAGt) zo?qz(T@v$Z2c+l{R6C$ z;)MsNKw!=%D;)3>{oubH0qyq>H{OjBtqY>5Uii$P`Mxa1(07E_-fOGTa1FAd#C9bP&1-u<*RCr^-6avN$Uv^@+SnK*FK9~zg7239_-+@5T ziupbUfs~qTk}AA`U-JU}+!gvbpd+iW-Ug<&NORP0MZ7CWI&TrS)(%3f+<4A41)pw9LP zaq&@V(1LM)9mnK z`)6it?(*iq^Mh62ZBGPVt#Q=%Sb(?q#qp5mas5?QW9nu8GPx+bX1-#Wfbrh&+SbRwRtt9a-K^7W{VO%d>QuR<)GmSfD2_|pzWCIc%wGDjTV0vpZ2{}y!ZKDBJrnohv9v1;i24}mj@i{<+fW`Dix%24&L zDH*Vf3WwScsK|F)QphhS*}V!0ugJp_L z=MQL|wPN@dmNLSE*ZG)rQy2?R4+|{A@)0#BK!|U6h(RcKUW*kCgh`F=sGB)-gko!V za;&ES7@!+t>Y5C~>9_V!Ou(>02Yx*+rx(VD3zebVa&0p9br2g=TF@TRXox48lHy;{ zwONo3L!_husvx_a+P$iyJ(FYI(+ejHp`^QbxsNwGNu6H>vJsPnM-UnXg&2;OTtHB} z?Vwm*s~TZm^L$A>dijXKYg`iuLYXSP-qH9~{OZ*2#S3NOW!5dQ^ER)WWgX8Tv0^(lKh!(VEEtN(TI{}$S` zops!1@!M;hdfx8Mr581Z7Kki@hz?_7L~M;F;AkQe|JXb|g)J?JC;>)gMbj4YIhSst z$ym`5*f?{%0B>NQ77H!EozF_q7-!;wKVWCvpTOcw7Oj{gvOp37+#g;02ed||7lWOH zab_qM6fsT8n9MuLdyY3IsWHAilrm>>g-%LY;1%u&w-=XtM(MczANpqxLtAvH;M_T7 z8DX&Vjf@9DeXmlhl&3Djv3-pC7UNaRZ4!;4liF|wv**QKu3LX(#1$tob1-i4iwdt+ z(^`$`RTyV7eR=m2BBU(ut zKas=tEFMI41JI5O^{v`&b9g2{7PjUMusps?WRlxgvV)E0#}G(7z4RMhw8)t;$$uC1 z{HJ`DUD8Em*T&s9c5u=>Z_<<`s%UxA0V^rsO(op1!-zlq=vJ+vDltmV`Xp|19zu7nKEsIn`hq9 zS^&&lQF|!tx?(mLYskZr7>g0cKU_xPLCW>D2Oq{&l6m+#r6`y`2iY`Oj7XpsJAYjA zca(rq%YNfzs8ftBd>wHldT;kgyuyU720mC|(R=c*S#NhQ#1@(?K&?IxDSouu5 zu&1ArIwkY|@3cvw#T@%xI-{UrcAw;X=455_ZhhQc2eoksE}N55VJO}`ebSTY+z08I zJ@#g87I3`V@}Bv5d*2|ay?}ehn;#{w&t?_rn1DMWZU6*s9nIdyf-o#%FZGAfnR&~a zHQtc6_Z2ba1uNE-zMw0rY;*Om&dfyP@?y8<%gLq@3Tw#{F%n9^kmqvmy#()arE7`4 zz>6Ulp*;RD51|A4Lsv$}l-~p#l!7?Jk?e-?GK`*L1QcAcIei$h$d^-dtqOVTh%yMr*sLcE9SmdIUe)xt;@^uA{}8MSX3`4mFx z#ro6X>!eN|yB)vJ_J%*WRy{>6b-Zn9<+W1GrAICjl8S#Iq%~%uC7XRJ`-g!B8@1D> z2xlzgX2tH#4+$3L4ixt%S|xaNM*am2jPiOol>S5sZzz2<2GUmOA4#}3;7nW~ur;cc zST_{5#=tmi?VeteSAN+~PeV^DxxY!2^+}RAsmeuyforRhl&fU@K~#_o;;jwQEve(` zBreA11ynY-9gg7t78rm-dJF+L6M*oc69k9^^HkwuB>SjbLc8ekw0&&FyBaiN?S;M# zVY|!aAPy5t6-%~Y7qf)hLO!RAQz$K)=k=8xHna`fgq!xkfP^}M+%(@LH`QfA?!E}m zG_HJpM+thadvZ#LllAWUwZt>ku*0GYe%&UzQ3k(r$1P2vE&)6)PkVkw2%w4*SLfrt zAL^r=ZPpvX1Ouj#G_$Xwpb;mgMYwb2jJDARClhzNijdS zw*Y428Z5GN3xz0uWK8=E)%W%E^jqRx@w*(TfUn-H+!MZ&lhl>E*U-Ap|BcsF6c&qO z^ZiD9g(2)(C6%U23lE|nhdf@8yWY9!kWv&nv%GOW9*`xlD)a}cCq!n=I4@fz<5*@M z^j&-mOdwZMuNStFG+U8TGbEPNRp8hLtU5$2V%;KW)9jCI4*d9QtC1B$XUM?`V|+t# zR$;Vvr333<@w+e?C^z3cNfUjgZ|-BiC~E9p`4H#Q$2|iHt!=%NrY=gqym_S@kbU)K z^oxfBwZ0_Xw^wxme;<$$Dc3g$<&oL!acZBZuTkM%cTh;5$q|pby5QA9KZAaRR-s5` zMSoo%Q%B`S3VANRSX7Th+63|!_OMOz(P;uYTcv^)@g8TtVd=T+iICz=C~-2|lLi56S$fvo&OF2au(__KOr zu*iNSA0E|2Da54c?BWU4mL#%_&00`}QR-_nK!CmF39prGs_-BwdV@s6 zt1Iv!^p`QIU_COQr8C^lWwD&Q4Ul{_k%s=nDl)(<0B_On2tfWdq8GQ_xeSxS&PoB> zXRm3^RrZksK)55I=o#%dr68S>^P`vZt)`o^`Zm~$0rLDyaJ znwSS@_MmobqvLHi?!JCj6Ns371Cg7AGL>G)&an+4c8*xh(^hu?42fxr?r=KX^>hR}&p`n}E0vcxLj|A^7;BP6b`OUA#SU zq1Tk)EnYHPdz|gP@yT_p$a`bl7e=e!b)AcHeVx7U=x9Av( zt+zaDH(-Q+eA!Rn+=Z7GlWg>qCIyE^!r1Ra*lXa)lFrttlGxvBu~}-*tXbK)_r)_m zeE&oD*NWIkKkDA$%qpdvzdWwyV{_v{o6{rnXoWE_y#Q zioPP#<2z(RJn#beLE2!ygQVgM+jOE&%Xz=!*9GZ}VvIU#V||n6^|CY`UCg$g8eMH2 z#~Z~Nt&}{iGr!Zef4?94h}S5Ss$;TC!D+g}1rg`NL20t(H*e2d2rn;M5&wf0x!7~N zJ|jC3>}Jbyx-IkMytB@{ghU}Z+vXa*$(P(v!lQCMLS5yz60;zfLnT4P?>|NFHybV{ z*(w8cS$;ncnPS zu3O%{9~QfB)RPQi!D&4A_cQV#Hu=OUb=9{>?$hfbk61z>_AyR61M-|t$78;(8TgE_ z`nD=DHOoW^{-WN!!i(QADC;YWI|MV=+U7>Z1-h5*OEba@Q)phAS2av*j1|}>R0HFA ztC$qGxHq63N#N9}8T3$^e$jE4tmyX}PGKjYQ!=?nK^MoSc$ui{)FW8oJOBnUmeQut zPR0(TA`@o3Hj9wJGU1kvn~odGGFS5ki^g%TW$lsG?~TI{_B%PF|_ja>zj`9u+Ps1VimU}B| zoyid9qzL{~vx@A}geNjjWYRTnQoXh6Wc1Z*I#U;TJ?7muccY(QrN?&LHHKB`?=qc- z#&nf!y>3?27xnsi%Pm(%VLuWQ@x9E~{HFmV8#yV^TIEOvgaF{Insr3&@k$`-3sK*0 zdQVxKSrdI*x%gqdPVmX#`OdM%FQC26e600iQ?;r0cl>AO_eUC^`MvaC;=ex>|2Rg0 z15=n@6l{OkQ80yUxYy3g{XxBM>dGwi8v}1Z@(Wcixa6{5>nBngS1*C`imPEFXniw| z?`0&1Me9KY47h2nZ+XX9WzGYx8+0RP*U}be?!w{1qO;FK?$cqD-bATpej{qkEI-I* zE=*|)gfE;P8ACQ?L|_+8FdOgbx5`_+Aao9V5{vr_@{Ii)xs|cG^`7V%8?lnWw~WWH zD{e+UYG|9ij!uWCM*1oc5z<7#9BkxZ!CYZJACSETI)u*mui2}LhZGasQadY4HEGdH zt0SspPBa1Q@|hUbt@d=<`PaT(7M)r!8t;$b*#%ZUuEbTgeVFQxXT8}gr1<7s08bwi zbzRrbrlke3wm!z10@1{H{Pfgh4JcIqWW^;fgdMsash@|ha` z1<{b?I}bhXJlP3ZCHrok28m;Fi|4L&Tx2~Hr*?sTmQArwD$;Lif%`NOF_6X5?eFf& zBL|j7Q-hE^f4<0bVCnycJY*xbd05oHM|FnbeW^0JW9@3@9zo69S&-xOL-K#Qni(Ek z$ISsTovnJxjhn?X<9@k*#Cd7TO}O*`(mqnLU4IO2)BZ2)Y_e?rtbL2nvL+RP5}j3| zRy|&ckFVA6Wp-g-utPUL%O3BQGmbve<=c3-@;;DDPp=S&X1mcj6e~uqUzOLUN>3at zn{d>wPS3G>8B7?*sj}~~-UG8&b(*}dEB=;@8a}K}kCF0ytL)knTwI6x&`4VSZub%O zbF1ur2jyT_WAM6%Fx_JU4%K!sF zgbMs(nyny@ap&dfHRLzUGRRNnXhXe;wJBc>`owxlqd498hFLSmGaW7M*QvkZyNfME zP;&sovM&b!ed8lYLcS{7Dlc@q+iV~;7Jah16cRmQj^`HH?Y#{eQFfbE@V6G%oQ^O^ zq_v*2a+TXw9R^6m>Yu&3+^?YKHCvU>xwA5Iorvz|8NaCLPJ^Jjk5L-(crij$+#5(1 zOi1y&JUw-fwj0m`LdcgZY*&!c_JCDp}dk>>`~a;t4Un?Y4a?Z=_k{m-c1*JOBL(9Y}X|E zKSy2@%D%OXd=4orEty1wyYbv-%f}TTPNSiQtiSEQS-%9)|9r$W-v)V1A9p!jY8ara zt@*?GaHA5LqeQ!v_-FrV=VS-rgrk|UksNI~M@diU9gbf4Od>^|v?Ve?`f@E^%+m;_ zRHiBC)qQyRe^r!k!>(OyiEh`7#MR{57uk~sQ5Lkq`3_PNAWaVQ+@}hqyoG*!3Lo5O zPbYMIZD*@jzQ1e?(&M^&&{npYK|4S{tM{^+@j6(cvIH4L$mTCV{C-@B&lMaJJ$=8O zM~{)ZWXJVWAjo_8P@oY8-@T$Jj%qkyxu-j*n3JFv1;fB|N=;g3RqWBd zpWsF0V&tEsTL(?)w1^j^pb=fs$9yHsu!GOghK)7J(3Yt^b^e}v3hHjaP4q+1>Zz49 zU!*A`W~wWKsD!!B0>+j2O3bF0h&DYE)XDSeBUaD*vzz_<`sQ1Xonh2Sc{VUlT2J|? zoz^9j{4}Zf$$jk`VYF1PSZPIShr2Gy*WuGT@{h_mQ2Dvy0>;#(Ls`f4ztWzMFjO6* z{rnUpPj=vc1z^2#(r17OH2&hGO9BqK&sZgueMQtduObCK0pM2nl*cKuJgE^q@IsZ< zyo=5`j3tEXjWuPwr!+@Aefza!WhInG>D(@Hng+!dpmnMwAtX#&S-tG{IXBx z%13PJeq01CG{p)2LSX7g`+WlFosTy^-Xx^_@+ED1F6=-7bL8roeCJuvCyLkx4)~=C(J3&zDuzI9M>#2hfb%@Dek~e1Z__K5k-OHrWWs3bs8p0evwg>p$45s;OFc21Pus=I z`ES@{l~gz8t0V~^2)8X1>bl=wb%1=MzyQ9S0F{;@7Bn2S!*t}dM3e90O!6ZpUTO9EOnG54q3+SFv5-(Ew>!Th z5qjw3vRG%)TAoqopqSeq5RZAvwp$)<5gkRc)SxuX%AWN^A<2PsE^RitJ8!8;`w z4}FNHmjN2KHk;}bz*cXt6AI03(7r(lBIlXTtGm^pD`q|3hXI6et}sQU6cX?y`Ql@l zfH;-xkN+Z-{%Y>^6d$dF$31GsRt-fVj$fL80$I$wu44oVbW?8NPCC=a`VuPo!YpJ2 z2ud2CeYDAap1){1DlU#l97C~{gxdO>dQ$x&D5YeB3E2%A-|h-w!5j&y2_6aBF^{R< zJUY0&JF4S$NMli?g168!T~$rg+un^j(T;vos6nX6emj@n;IHX1#GmagP?h z#4o?pxQsdbU3_ss@1c49EK3&asF@O3uSn6DBD&MFydM1>N~1v)zm4SHd3Is76`0bZ<}l&~jApvXO`n8g^2?y7@9oy7sf^ zuBn{J+-|Ana*v%2ndbUEh4Jd0-nB=-;6iq{>;XU3{u@fW_G1@#cLB+Ue~Bt9He;^& z_!{H;`q|WK0$m{)*m zG?a6aMbe#RUQjcTEvQMi7OJLc?WhQeCodAWa`*m0QP{hj8B?FdZM?Yg;zo+>lk@(! z(J}EmqwjVO;o$UA0&Gzg1g)iCf~pP)T%Z-f1ssoff8Y|=%W^l3OEXaYh^~HP!!Ir8 zxPpUOj+l8Hb93COMv+Sm{^2oHi`+1{F3%J#k7ND0)}HWUNWxwi+qfEKxfsire!3~dI$sklRG1&+oZUYTvlPT3j?~9!PRpe8kHZwqaHSS+m-I+*ZADJS0Z}V7G1Y*KA|s_+%t&n zAW-NUX-Ga0(>GoJ16k`PD4*YaNfa_zWdc?rQftr{=xrTgJ&lh{n>=t5@PFE3ra_4@ ztdZn%2CTmc-|VHkT||(>wwwU`0=egc2ad~uM&@4ZGnEwPkXJ@b&B6#-wvd|)0k#*u zsgdz>ta7S1wchv>Q5H{~s+8Ji%x}GMzoJO3b_QF@RmoI*#|#byjfMNWx5;KCfuE9V zM{{8nX~?-a^ts))pSo`GEIQBB9mZWV8XpKGq21R^*CMw|VsRI+MHwkP`Ns0%g!Mhc zj2K_?)L&`=#UKx0?&H$Oxz--4{=9y0t&<$$LlDd|@39|k`Z4yr#omkrJ0l*gks{Wh z4Q%QCFLRzGTE?F;a=cK}wkLVY{z}1Z0DPPnX_&uOS||pQ!-ZCuAxdFPA@q7wG#nP^ ziZ%4!*nNdV&n$X&c{jn3YbxFTejh264wx9o-p#k%&flF|I=oSdJ*hP@)$XA)ca8ro0-2c3lx$<5!ano(e47Z@yYAb}F5g zQ$GuAy$B?7?I+j<8?HDCNyI;RvuD0OY|5(O9==2OH0$>qtK#k6hzMH2{_{4%ri_at zTI-7U88Ls~{RBp_|9TBxJ(y$3Bx2Br2GpK2?&ugc&vBFjxM5n_FJ@=K|J3XS?VS{4 zh54ZY-5*@Tu=40Gr@zB&KoP|hcdUt=-A$o|WJ#OLHB|}~dCGy~yxsyPM*nk)85|ToRs@VBEK@a#Cn3cI7Fxt$yux>7Hc3S1?5X+xAGXQ zGDu<}+TlyTK^(dpSaHdR^up`i0(=1*9U8xkbkvG9yw~!Gzn1!nqg4$5SXF-!D#fndvNP`6 z$nkz@e!GfI%+6J*7}1?94sEj|7cTB=lIS2L_&ha!UE0qg4I-;qZobg|iaj_%>RGVY zki?G*rNc*G{`<9XdywtCSAV;Yg0s#&-LJZ8kLi9z^{s{)XFyKBf({TLG;@ulR$Z3Q z@fKoGX&4L??L+LLyD^+dnHXYSLLLe9H<>DZz;8G1}03a-|E$+ z%4xbFsh@mS{-mhPjG7T0@w|!IZMzS82+?R(dE`CF6`25jKQT@a3-qWN}ETcc-J|v06A|;8& z5*DP=sHGYzYrPI>v?(H3=HFiKiaynBw+|HQVP49pz@rqoJ9KMj-=2NYC3tWhO~vYxF+UWEiIPb8Xs`_P+jW%&$k@;IoG zx1=BHyNt1@=<=23;!i1JpRq>bgBsGJ`@m<`KrXw?;lj_*o438(SO{NGHD{J*>gtH$ z#QwgQ!t*4hMp4%*b=5LD#B!FEhoN0MsC=V4kAs2lNwET1on&1qTcSyGrl;-zniEbe zTgrEb;Mw#W`J+!{r*>tbmTdTW`{PZw(A%%xBjz0a23YeNO^4NsS>K6>61VZ!%w(pa zTl&9E{`K--Yu;tZZ?*q&^WIdl@Zp^&Fl^gLhi4E0J7PxE7;y$7Nl@MF*a9hplYBSo z&>y%w*E;NQlj<^&-+E8;O+k76Hk14#a+zedzH3Za5yRGRK9J)O;netnPc+uNU)Ri| zZW>*<LHE#8%&Gy8MjH&aC92@D2gaQCGm&O9#Zf3W+>~%=GpYJ7@~`1SBCh-}ImP z`|3au@eC8a-JWP;i2kutIlGRU^4^@;kx10Ocsk>RDer$?_V|Cx%hL8p>6aP(w(X4r z$6p+lxKFv$YHC4!sX-(a=QM|SLLx@wY!&UDYS>%SlhXy8vFl>`+xF9Nt0L0ANwc<4 z0%7w^@0h6>ySu7jQ;WgAWT!+Pvprb$;LvhSYmU0(NA4wz=`LPd3s%eCIUSA?b7gV< z7Io|d;{b!CHC;?TQylrgqp@zE?K)$?ubhU5-Wg01wv$!`D+*Zp9inB zi5Eh-s3R*MWw`g1vliYV1_&d9&zwRP|WD!8c8=?>ET^7#6#BMvgB@&GcjJ{xu@a zZ$qyg-$%Te^P1_O+ug+!*rj~fyo{hP^Wle?yJb~uZ9zeTlaYIbcUcxM*dM)Xmy+`j z@~i5JVH-ml`TO4-tg_W6;jJg4kxwR}70^htScZ=gRD2bnO4&BLRQ)SX9zcACk#4Nh zVXAxP2i)Q<$$}GW8;)l=Zc&m;KJ$2cGn~4jgyhpF=(i*b-{?XbK|7n2Cezzk&&Ly{ z%s?UN^#IkA<<`M?m+tKT#Im$vgO5FWn_-J;_U}Dv+Tmi$9AK| zC(>Vx85in&f`Ot|2TF1}PZt|>qf5Nq_4NM8q8Eo;TG;YL97sPEd@%SfsWN~VwEs$4 z4#H>V3excigKS1!>J~s}X(|hjg6=I+4hS-=8M9K&-XXrji@R z=_e3Erj~$pV+qY>_SG4XArWir*0+Fz(w{I65`251kj68&Y1K9I_0yIgGIV*2OQ`DU z)w2MZ^!PZSjp2D6t4oYu`1;^QL zJro;|o2Zu475R0&q@d2`y}Bk9jihds5$*0X5VebcW*zqruFg)XmaCKd-1aHO`c1Qh zq~7()>$gciIe`Hp?um>66;t}}yqYV;M82|}m|d7NhEWaPzhW6T7}CZlLDzBKGA1q9 zveP!VMbiIzn2Yj@+Uor~G=#)&|DNnW-duYrEUigvA2zIFlz%_&n|7mD5les@<~HM= zjCmJn)lZIS5}Vh?0uQvO8C=h=^G?b65OTJLrEf$#_>cv+kk*wXL)R>`Qd%Sn;(OeH zy9e1VE<7_wB2zdj`|mtKrDZh#n|U*WV^M4P*;wU__fZX=mlJ$c_L262A+-F`(l77^ z^e}(Q2_=Y=u~CTQKtT2DJM{80BxEG+zHbVK-8WX0AjmkNj%WZh0y|(~hoHre7VGRs@R+shU16#4(1||} zdhU6Hhnj6BjTUcS3r(XW`LO|mAcL2)L3Eo>K)NQM?3RK|769mP>BrG627l5da&Gw#Z8_baW{Rnya1`v;1b*|+hRi^L6L@``VxM_W_n z>m#{Sd&)ERzw0S3Akj`Gj9R5TQ<%NkrK+*VRE5ifEKUQ?0sQd?v~MI=-xN5P1e0+- z`(PE$+x^P-yvAm{FrhN6q4QL3&kUH2POJLk{HDrHLrL^r`M1#Qz1y`x{YB!md0u;a z? z7WY=%X(L>sWUANcU*`bj{$YFU%>l^7YV?v#vpNR)8F6O0K1_r5lA3Fz!GDphLT&9MV5wj7#7nP6! zf6mHYqT&c%g2@wSA6ZEjoaK*sT|pZyb5Sczz7tZ)&Ie5+iDDM$!*xX#FtlDQ$ibIV zx{*MZ7*T`_)J|F$mb>d5*3-o^SBx4y7|Qnor&he)cLRORqshWI;As(m{<&~v(NlE< zU0j4@OM$du;sn(eUOJJ>?$!N+vk=7$985%dhx_-3@_K!C$e`T{1Sw6UF>!_4ZsNkf zk-#8kS9PCQxX`HQ!*^We{U=6qaC&5GAg9#-jF(NSGW2!ngD@2)SNVpx0Q2*2v7iHv z%39AXe0SHMYw5niRij=d)7-li_4?^lGTx)4*H0_6F$o(X#NyWM(l66(*Wes=S|soQ z6OEy%3M&qxuij)XFQi%6alVr{CVFXxtgh_V+I@m_5H&neF%FJgozo(XG9_@rdMp1f zl1`%841BaHKK=AaV9XkPw^iGE3-anaCJs!E_J!K|7k|DR!1$K)uxj%JOXdq6lgL9Z(K`U7sfA z7(a0CR@AtmXH1!b7rM-_@W*Hmg4r9?vaW_urPh7q7dz5ov$0b+657c3%9F(NPU zEeBj1?^k`TCAXtE*ek6@qXWyuZL37DU|m0{XNMq(;kGnua>bxM;ctxb3689-`b=M1 zn=t7rO;lt3u(7bo$q8{sWmNiE?)bnMh7uiF`jz2d_e;}8T@?T9k4q5X_RTEfdCeWt z;c&&D;_P-pcDr{vl=fZ(cx~Fwi1=VzyMkfR##g>=ujPv(iXB6b600t1Z6>5Yc|Do#R45z>Q7b7 z6soy+Ew(31JLIB|_zioE3Z|1^$rJtOGikyonaRkmSu2+L#nIKJlg6i%Ow;X4pf~! zl={5C7U}PLw4UbI zBVIk)o=$#%8)CnSYHNG8`WS#F@=y&gVotL_geXd#mG>R}-@fSsu z=JR3Fmzz(DWPFKhA((EL&Qs+-Dj(w@`G*fz36MMuR}ILGhYpRVZ~+W{_EY{(OPD(7w#OS@HZFt; zbi`vu+SQ*lXhSE;v&mUL{CjbmGHCtO3pC6X6FK{7JuD!V7QjnX3&vd`t$QJ?y^Jgj$OiEe|R0&JsGK5(sf>^F!G=a?_V)&XaOrLnKSUsLBDY5 zJxZ&Qee>}q!`{wYP|S%c6NW*hdX%%M-j1SdH+<4XS5Exfk0O*h2!mF!WAwQ+h>6Pb z#705(5LU3jgF}nc`*y6^VMrvKM|87|4;}lN-xuF(#uS{D+ZEAcGk#_Q)K0teIi{XX zcTr+4dyD~$BxtX9Qe(OWnAx>=il^kTdgN4!iZj9K_=MZCWq~LFj#tFLb)(&Z%HCCXxuGsRk zGMYYETWaw>ZIMc3kOz$ACPbFdwI3&$>?C0+k1Rv3NcRJ}Bxo!uJ zBCawdzL_C?x+9=7XB4?(4L^#1zves$=0umC0gchK5~NU8or1?SxstPUh-o2sgfiNsMo=SLcX@p%cPwLeX zq#|0Z0<32tEP2OEpj(%@3!Mi$*veUu+cUM20%Q^?ts6~VO1Dd!8?=2`#P*qeZ-IP74*!9(cSgjTlI_w1ac z0aQK(4>VB_G&|u6m&0Mif>zp@3spwV&t09P5M$VBhSTld5i-*vv5#cmU<%HsNL3AX`c?9A z?$8l`dgUy1UxPw@GgLPHz}atw83Z6&8~V{a^r>G+Z#+{H)lv~GG~J^Lr#sD>>4;-d zlsh_-2#!xqsCVJ_A-BM515tn)MtcvS5w_N9&{kkdaVV61UL3;thSA{_V(!V{5n?2< z&^{J#xCuZ%=VjR$^(m0qEIga-lU2*7y`#?yyn0H#tkJtvgTU@%j_(4&LKZaA$x{AN zku2^1L1x9HeD`n@>*?SLCRNk1HUe+Pyc=pB?0k3zFP`F9WBD^Ao3$+j+ym>wC>5(d zhQ7eEF`fiOpB$i0s=B)FUW9!gA;YgSNG}{}HuzL0(Pvo}9zLDM;#rv*8k1zCp*r~z zddeeaeL&L%WM#M-VhQm^x*+>9xlNMJdBs(3-t>@2#Qp4pId23rFKVqhMD!DWo&*1D zxibDgE*Ddk!)ktnc6~V6eCDkCx}J-j`S}a|Hf*rHb=Bq0m*9c!Zz`E^8n*?%^Fu4% z8qz-RFqxzD5iS$Q=Yt%zcKR#{o>XX2p+2^eI&7YOfHd?{)PnVGb{q~+$P~b^4mq^E z59MKmA5=aIk4Dg)qMVBT)7)Oix7EyPc6-d^(F`{uIK%*jXNcUae_}#JC%1t!mqQCe z`xOb;Dq%sYB(^y$wvHaO8gcw}E1j@^%TsK#=c)6iBFG&{B-_EFQrE9#P|3^~ajm6+ zs>g+lwabz1A4}r!ucmH4^wfc!x;#_VfNth-3{SVvTy;$&G6U|Yn16k0XwYgfeeLs{ zZzLvv4B-Bmc{lQgXd@9jV0A*i@=d;DCS=qs4Ti-uzU8@N++EPN_4!>!B1w+Qv6Kw0~y3yY6nDSXXY27{4|#U*TGs1C1! z?Y0U1AWyUBYQtSn>A(3URXVhJA=Ijwos2shWOZnB=UUK-tmd?7wU*pFTJ6^~Fv{R3 zBy3gs^lvBJjlq+0-nZ;ON#U9WvsPEd^M|06bP?;PL;31ftlgO>TN65;vE8u}DlWNXsUR%qnh?+hRFA~-QhHl(qT=|APuj6*Iaq%-@hdI}SEYFyt&JmLSUbPMl>%q|> z4Aagd^zRpq-y&Uro~ia)Oa6p^Jrn?t--vy7$+W63QEoV2g`5pJyfdPZdMq=VIl{m-a}uiZYIX$-$+w=t?C2=yw%xd6Vls`LmJ$9W7$p zIA*9kV0p>9yBQ$tQw7SHsONE}jCS(Gu=3yI<831dUV*g{zl#`|qRw_zcQf#;BWXl9 zRj%HY+o2!8dAjLgFDH$DP|jJHDF{}|&SS974Ytf~J@`~T5N=yFonRQxH)1m%+^gR` zyAw8PzXKe}JFmH3Q*Ku7wL*$lc3otwt5K!XJ1)%R%#r1X>6g^K#h>V|??|=X`cv^* zFso7Pb^IPMYq8C*r3yR0=C_;Ez2wwqB&!~*uq2yxS)r^Ld+1@_Fj`!!^t*gnXM<`3 zc~4}=f(2CHH z>jXlQk(jf+y5On(XUS7+1HId`0U8F$>&-B|x@nEx0oZ5Ire{h5aI2`3658RGHPsz( zqlDP`3om?}qvbbMame?ig-BL+VL>a@m{`1u6^&&O`zD0oj!8*P!ErUc8`Z=}*_~E0 zm5UJ~QnAJVyssYliHG_MugtmxH_v|9pAGwEUdPYi9R%r~8LC8#-%yMB3b5 zZ;?p8KIHNbhAfsdQ7bmuOg6#nt*|O9G|XezB+u|;VEp1YPyvh05hWxB0eeMTG_5;o zDty&a)*Sjir7A_6R9S%*t2-|a7l6zFo{QYBdeU_j0sK$~OUO8t}2OYnv(N9vZ()Dy``?+l?_z60ozaG;9`4?H9J0;!AD+ z(9tQo(@_IiHLlkm@4a{rCZi?)3!dnBEo{ulA}e9K1=zpo<~1nwmK_-^-h2R%lXzXC zZ&C+=GC8{+htMp9hu=r7E}@u{O#d^;eR%4OkN-OkL;Pzcc>YK_GU~H$1GBE+ z{671@PVapfdJ;sQmI5fzD8!v_rdRk*UB{?3<#BlM&x@D=3{%_e+v9ghkhRK=_8CU8XQ%C`=Nuq^KeO zg)uWgCa%co708p&z$S#ngRxdW3XzyognB+9Suvq6UG$@if+B%?IItc@O***M;gGL5 zJ^=xx^mP5e6&v?on~tkXOlU~-2gfL#rHLZYG_)0Hx?hvAU&f0W2oIsnds|OeDM|{e3(D zqnUJFW;X|+v&R6^NrD299e*(^`m(KPq z?ENhcc73R19*DyYN7j$??MwxJ=@3jJetF_Z$`?}&UQG>Ow=x-0{^$1K%3$CASkn~j zbKZNTol5YV96Fjh7Y~Hz?Dd-UCB2p2tLmw=ncfi*o~g2}J6Maj#5;Y!zbmwOKUmNG zrFq?~`8Sn$36YBp#%=vkyGtIPE1XX|Z4*uedrX$~W1AL7CV@j)sv1Rp9t{85 ztzWSty0G7aIOM)w;-zT_d_}9pb6~MMuP_o1{kv4p(U~-oj9TFk$3KM#T;NnYsHfwf zi+@^50uPuroJS2uWc}2snrxz!Ma`w!odsx%i-JpLsG4wd?%)A7jl#ah@O@3Hh-Hr+ zS!44nH#3&V-Z)7Tn{figF{6hPoe{`E3-*Vduun|>#Q%(|U$Nt(n-Vnjlf^a_RPvvR zULpqvZ0k?Pw^7q}gPe8yFLg$??_5A$aX%S;vjnd8()GYOJh^llpzb$H>Fq8m#-#XV z3JQPh8!5#+=C?~)*UUk*G{GfF-|EMab8;)GKNw6_+csz!{(7Xeg)Smng-~iBa z0wI#(`a-5$e5W5=KD;{uBN>_^s45u@B_r+b*~~XE(&?I*C{*hq z;T$?g1Ukk2Btll(BG~Z)wlnV)ZesSI2&u(qA?w`3@up($wZMyfyoCg>D8xMCH>KBW zCF_3lThp7d9w^ZhOYZ-BWdg9dq>pmwt}U3UC-hwP_+58(YX@$Clr}XKP-rE33AFU2 zi2;dM13*^x`eXeZwjSyChC!PgRWtCx5%(cDWiG8gm%h9eVSRy%W)et z>+KRv&OmnRYxXDTq2iunbuhuAwA#l(l&+Mwgfuo^M~A{!kW#v8{&G~0VL~oT1T};n zj`N#!p2dFXz}d83=?_9qo1VgGxLJQLG2E20Vh>WUwEd-31M~2E2si~Awlx{&6&*g+ zox<#<8pBwM_+AjJCF=}kqa+uD)P?;S3Um5`W~nKtYPG|#W#gu|(oUkMRhj2#yy?t4 zs9C$8fC;13f;v6JxcPBEW!`6{{K-RkGTacbM^@!QX1G6XUC`Of;h;nXzJD)O)-=)3 zPrk-vRCUgb)uj{2qwe7>zBeKfK=Fq_MD%{d#F8fieMzN_L?>yIfjo-!KlN%kZ)sKK zZwhs)=7@zwTmtN{V%Z-kZ)+hkgy*=hj&Y=UMad z)_;CK*Ps=!ZPazy>%nC-!#*I|jVH{Phzf-<46&kD%{YWJI{==P+wB->{L+=(VxMa( zotrJ7*07frcuxW7smqxduZ}68*FU#&u)I-hn+P&Os| zt#mhBwL6v5eSJVYbPCHWQVp2kdZv#z3W&sz$kYZbx1S$!b|oRz;sfXk34R`Hdq+Yf zl79f!K>_6TOE5uJft5&S+|H0R!N9UdK>OP|4I3tJ5hCnCk#unu`#1Ruz3P^%cs7{T zSQE5~8I{GQR+I-UzQmlA>p@`cl{QUn2Sc0v_XFXNFNf}JerC3cxXLtbqLd?3;xR<3 zQm_jRhM#wZ5MVWpJm$>y6iNW@Hpj*x?)m;`V*r4HRHxCu4{Xu8(y-5Ld2i(q*_2<2 z1^&1r_PALBx5I2@LDr#I<4+qpEj7utC3iYcntmR}s_|fHBV)x6KV2^2FfxjDdt_{f zt*<`c`Wgrh*>TS>O)(a;|Kz9o>&HvuyA%DN&o&m({;BBvTh3`CPBsC)FUI#Ob~q(5 zCO)TMA)nmwh)uNAXnM;5j~`$?M*`kC=6CmbLpmMoaWfFyTft}=8-T9)eS-=TsC#k=G?l9Jk}Mzgf(P$HvXi!Nujg;IKZo=H#zD0>7PO<8b#Vbt zpb*T2=i>DCX8yJp2uPWjWRJg75HnDD1J>6}ARE`NY`&VDDdKi#{)S_@mX}r@JJ!ue z0?w(Iat+isLAK zxFv=dKefI|PUbc5Fe_9}1G@L=@&vxqjyb z1#l+*M@3^5&Gp}h`^JSAiBzy@JZ@*yToMIcDm*q9v#hsW)P$7prDNVSkB(j!d1{0G zIhUus>kObqrq2p!dT3t-KcyKYqhZ(4SLQQXiH|=N&e-$voqJFR-1s=J%upuR)ts|Q z`X39l0d>-kZJO2)N>!vu&+B&~oFc#P14g9m0;Q6k3>Auy^P%73mG6U;XQw}7h2R%k zU&7iOsuYBZ*1y6Dw-ltDxEel^G}`pt7yTDceP?@Zk`ME(VQKL{5t~%d``p~Yz4;w` z+nvY|tG_Lj#F}mD61ZI;Q)dmaF6Doh#Gc`leb$)n%i?0QP_$*J%kANPFb#+ySuu(y z<;b+L9`DuKm5wEp$hpjW$*tpLlqN6{@R?miP?Xtae0`wUa0Mw|I^& zO@r3Yem++04e9njKU$xTNV(fR{ky-`GjQJ!uLH$WNz7{J9Iu1XF5Phb{2a|@xXLYsw*N^O2!lY8E$=tYk+&)Qg6yVHSAfp)X27|aWx?=htw zNPjQ$yVa~)di<@Wfm;!WUO@?lBe)nq(kHPKN0j5!CRG;2*>JWLv2#~cg90pu;+`!e z8LA3U8B4qZrU{&)!?UEbQe+GHd9=rF>bygR$)Yj@E9rFrjR67dp5U@mJ zjYvtPiTapDLxqnSx zBs7Ur!j>sk-e2jwWm#;c8$Bs6&u#ULeTUQ{g{aK|kUm))u7oBui)^~-mN9y%KKG=) z1T19I$iJeO@7&8!tR#vS0bL-Yeqvf^@Kj&kt)!0}V~PoKrVKv?>HXo}*TD>P>&tQn zwq9cWdB0sH+U;G+8xkl}l^rIGlbG0ewd%rQh$0l10!;Se=G|XO zR76Y73^pgyfI*iO1h>LS=|_Kp)*3-?Hg+}PbDhW`;);YMLaf=nIvpI!RgA-4#lnol z8^*huBwzpz;|theNuRpmi)@#mZ5G0CElrCV1XZ6g%8f+40`8X_J?1#Gu?FD+1Wa44 zFVeggJSbrs%ZIrWQGILuBEM01H3JpZJF+J{;$Nm;M_po-)g-;`aL0>D8+NzEJS|QT z^Ckge!~*+w89q+153l#(E0oTi?qAvppajGJF9_p;i0W9}7vUlfN{7E*dD_Txo)ZQ` zY8onijmntd@51DSkvtwt1^A?Hwb_1<-ceCK55(SdJT?ETM1m3NAjGjc$TNlxrl!Y} z4cIl`7vE7RGFV}hKX}tfjAyk}g!Q9%7PvipE#{PU@nMUNE5KC1O+YapwXO*67>O-B zvm~f-D=jn)@S2Vn8Ww|7qh68q+t*6moGs~@u&e(U&{+1rfJXbnd!(+s!ZuHwq-KtE z<$}l`T>u3FaG;72+yjhDEj?5vG!)ZH2~Nu8!lxe&YH2cf8iQS+bex`lk)+m&=vmt; zq_|7!y4O0CReUhnuPl@K10a-&5hl|z3tpWASY#_+cP(ONUjGG~sd6EMr?w^;OjA7j z=~*-wI~GFKF*64?!Bs1X(5%r6#9TTKKjwuW0{d3EchcL7jzoib>Ow z;<&1oEf+3^vm}|q*N+VVnfTH+;iJEK8(WaPeY6EC!I?7cKM#|{y=waTjku_W466sY zRd~@(!AwdtPr&&!@aK$ZImz76iJ;X*c}{NLKnl*3^p?VO&H6v;NMMUXE}ssq^{4Kn zG>v?mFz~5=AqfkBtYG#%xVUp+*8`c*q}^P-vfjY9ER` zNSB{#&}Q06SD0v11O=}pydaKR;Uij^rLQcCiG{j~MR?*p@ix=PAZ=-l& zNk@XCfJ#4q@d?H;+kH9${Kn?IjF22`vUYa3Rp+T0N^2_0^oiul*kt829rh=hm_Mh+ zPU^K&Wn4gtY@_=1dyBL|wk(7L;aTC4`29{JK>Gy)VU$eu(;w8K$Jvz1^ujOEnka*V zvL8O~#*<=aq+0Uy8aB-o2C%uJs?8I1)P+8&=aRzsG+Cp(+~G(fyOR`evYCg>1%fTL z1vo$@>b<~f&w;oHc~v|d>BLVK+#w)6VOqtx(YmO!5ly|r{2UApEIY+AtC-lj5+{h} z$t10_TShVet0OH`bA#8m+rDsi_}W%BPHSr=G{*X)XaHHrh&Xfef3Q{WNJ*bL0g+uS zC$T&WjnnSw@l|n#y0?uPXT^ zQ`jWv;`!w7H@F+zF_^5ccj+~s;`bF9d9Lwhew?SQSxd2EUpxlNqMBh!Z7Fsae27lx zR}=VVhYO5+1njQQRbdex6t`bl0Mq&d#eBdY!wLknw7bx(rpTw_9`j1W+D@;|gUy1e z9YUDh%=+?Fyu0-y08koF$ZQvT?qa;^!{NIV*=p_Dez(YNXMg?5Sq~uzYppqw?SM8_ z^NUrT*DxYeb-Q_XS+STZUdbNLW%P_B zL~XMUFHJu~fJIVdmUp^H`G)Jo&V1bfZaSQ__p+wPup+wB$v=0W?gP*G=Zvy$x3)V4n!M$-Fsc zp{j-~_(c=(s{S6}KH^ss0)}}*QyE{h=}*fYQ>2~)FM_3(rgCR_6mPf~EdVp|`3v^C zQsB(+pz8Ylf_l4mjz5%P#gQm(_yo&9{y1j;?MQI$Vpi;#(Jz(;#pWh{oUF5-4oDyh z=-v0`M>-8&3Jym`!l@pmX zV3%Q6e6KIV=(#WfR7GB~_#88OO7pOD%jsPPzs-l6S~@#%E)!Kr^n8k}9Mg&V(>W^z z%lbErVi#{e1EWa(B=Ht`%%et*%v|Z0!KOrIK~A_@`f*w%vF{D4_a~tp18-{e&yT)B zOr)PRxwklYSIxTU%I{iTJ26} zGnyM1qoCZz9tWu7k+*d$&B{kIAv2d@fv2He?0i>jh-hU`$>4?y5lcDEbs6>V{=xqF z4y?}4(PxFgSUVBQSY}gP`g)j)D+R0aq!|+l>`?xL`bsCN;UP3rMQ4>byzV@Xv3}pO zFCGz)>FFaL8Pr07SVACVaDoa6$2%B)9$5n06hV)gs4{pDr=6?<*Hp30FLaY8;RzYF_wMNoDE}`q z_9?oD8wcZb=$lNZHjz*D95l3U+9H{&U`%$`7OZ_K({a{YAde>H0E^kan>lfk^7eyf z#;ZZ@PU^V7Ln~+X0=j4K2~fvjz4}w#>8?h_3`iYNwE00iKI+qFLW_a)4K{_FEi(3S z@1t!3bx>kYzu#%-nrKPUin?)4JN=OXevlx1QF|A?SL6XEID&Bb5A`X@5>`iOLy_+9 zoDoKLD@hu>Zf0n+0)wV0kKA;+Gn*lMV&|1%;m6DJ$Fq$9J;e!y!p z^}ZE%KZ;hY=h)pbLrVS6f}3HTEr|GuOqLAh)aJt{54nkM> zBsga}e>VIg?0WoDn&79;%#HYhhAu8`L=Rbc(?1~TY{eBw;LAr%0;%^dGQn=m54X>b zu7BL6{U8BM$Q^76X~+ynQ>okX08-HEpvOQGE!*YAM5DerkS1K*r!02zzE(dx^ah9) zjob!Wa7s;6HViKsirxFIEH4@}=JkK2P}``0>74rZv~e!j(9;B@-E{eO-w^WQ?|}C+ z_8>8M0%5-D<2cMzztv?8pcSh-AwY7^yYGek#=nyA=cfq`P*6RH)3Yi|P{X!7h@GxI zZg!Fuh(LlD+RZ2a-K(^Zj2SJt)PLMqZxdE^HRFmZx2m8%cWk-4pd`W z7q#*cgAn|?#fSO5DL`|}D;U^F`h)dK+=kS#6gk19m4FvsmNf6Ii9ozz5i@q`7P4wt z@s8u)5Tv20Tvnf$!^)1)495nP0IS1xibpcjcz5PkCFu>o4%*OJn{h1#kSLe

    cF) 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

    |-!IviBEp5-0b z`qHZ?B3M#lAJ|z-u>l*uUK@U|?m-rx{!|-FYkmc$+8Fcw9`9(eys_$p2HlR5#wQLI zm@!Y7@aG^$hpqWbZV?_UrzJMq1^+$Zm5)ovMw&-bl~HUyt^MaV&DqE3uj%!=X+h)s z?%#>4y&FH>iN15tMcrdlp8YZy(Yv7SEI#%LF?;5+m^U)HK9RjAyT^J=(hN5IBF9}) z?WS%MarZ@|O09f^+5QpHEdVg;pGQp0OU59Nje5y`glo9WsT#emVJ+*z1D=xH)8YT< zvrt`Vdw=IYnAdL7B3Js0hSgn&zz~yD(XtgSZ01|W5O>+Y!@~PGEnz)h>~@EG_JiRf zE$h7S-gZXV$?|M`(SkIPvR+A6BmEA0dbt~{7YsfRdEZgfTtGUJquf#R{;I&cp!sB> zbjB-VdtnT8=zhk-y@DG6EqYtq)Gux?ZjUo0gMa%elFd%GE$uv?^M>b!o)yTlXyY#|zbuO;VInU$pfWVE~PXp7;GQMZC|G*U)@SIIt2^hs4MSp9p8 z@O(VPu@L3P+oTPO&|g0;`)IBf!D+iX8+`N!{?k^4F)DO2veq$OVoTWAHHb06@b|0c z5&aF_J#=FL0z>+jfN8%4A)+f)RqI%-6Eop>bJR2Rse=^>S(EMNiGN~MSo zTH@!a41DWvlPpw?%A?)ICcgWwl)t?Y!4q^q#T9=1aZv;4$a)0#Zc`OzCQsvj|B^Wk zl<6_TzNa=~x|xJu=^X<}hZW~}{K)SO%lJ%>k}JP2#PgcHOFH&YY<2Qk(mDU2vxsV0 zW8gyj43&CBju9PfDRleD-|(OxV1hHwp|#1Ee!M62dVQ{cN65F}t9}+5U^9j+CX@!J zexzY4C7?!w)f8?wajoYWP6m(EP6vR42w$dHR`pthl8V<=jNRUG`I+4PYT9Jm+{U6_K%YTog^4FjF2mDuRum9smn?~3Flji}j z9vJaj12rAhK1AT=e>;%hYMU0<%RdWUecfw&z;W(-vv>2l6v$C7lqZKi)V9mq1&sAP zTinYZydOu5WFOs1!T*!_#a!=`-w2czJ=v%`Ez`^+TQYt84?ml{U$bU3ipj?te!g!8Lg~I zJc~LbR+9}*3(Mr0n!YyOk{#E#z_jKd*H8$zkg#?0hH694qL0inmn0QpO(GA>o#`I- zmp?yP5qTx~!CyG){=w)g29M*fuWHG*?mtN%d|{$Rw!r3nAB57Jq2Gb`aVyd7P=k+c z=|$Y4v4KOnzFjq}*uR8xJf$X$4acuybE>X^s5lEB{AhX`{t%UssowvQm@kPB;HxJ} zjg)g&xB7S-R6MgeY+_qWiE$z&u__ITj|*GSRg{5S9*T(`r@QoVBDATSdlXLreaM?zAOArI%jeO> z9d-Zef%Yo7RxhII<^+Bd-&**S;GhGDIl#1D0}Z|dvTzT6y#aSgi}sB_17B?^QNce8 zpLqgNEVWX*RbyN;*a5hYa4RCRR6@^rC8gLCC|LNo@PSgM{E~qnZ7BIP-O2U8R$n%) zcM9S$^$grCf<3d_;~kIePGeSIMFrJ%k$hox4Ktd1a&b@#WbA<=<0zkQSzxikwx90_ z5!{zN`B>j?GFsqVa|cHA5Kz1LrlY95*U{Tv4?qk~vTl_r^F>)?k*)-6LT6gwS^g1? z{NU@k69d8CyZa`QS}}#;R#gffoh(d(6p&1Q7svgYn;PD2{3A};NqnMYE66&q8*?Lk zk$U0D<}F#fO?|}J!rCi2_%C|JQsnv_JvUMryhI;+KXE$u#;Ik5IlLK$iJcz3ARdf7`?xjIK_3Nr@bN5eGI{ocRma?C6b$+Wb z<9EUWzr76V-)TA(Zz{hj0J69UfMl-z?p-@dFVb>LTDJmYWA!-nIuQX8L!OhBMBO?wh&gBUx*!#FnrDn7piv6I`z3d7lTm10`VJ=>J7e}px;#UfdmJc~>l&forq2(6(f@J*n7QQD^2 z`L*MqQfw}^``m&lNfE&JK0wmJ! zU7VQaM$SpAu&)|lu3G!1nKXR!&M15D9!+WzYhb)yRYbMfI~k)c#c4F4v~pXb?s9h% z$8Yts!a#_y*=HP_{X{h69dld9Q_h$i0@*}W;kJ%!u$5mZKc2w-Qy5N6L0-D&`(t37 z%~N_Z)G6c7;3oG1O$p?*V=}I{Gd!Ct$t2gJAffipN}MC??x}7G)q4Z1Zl2UmQ6C&Hx7cU> zfw4*oIWcg)cMV7h8}q;mSN z_LW;#=w-R}o-6`eJDZ~4uS59GzfN*%~ zA@Y+tPN3_EwBybC9LpYpoWBrG{5%{#pd>YhKt$4-xa5V$@?F!!k8hUfzvEnmA4L1z z*<~^7JD{LBWN5w3W%)9Q%Y%Hu9NeN_rq@P@?4M^2$HVS;u+*3XCJ_g`2W=M- z>&;WdL?3<+;sf3L(3vvVCdBwxy@WC&onxoZ4In9Y=>`{E@xbN(vG;(l!&mV%Z(DX(V=ctvoJ zI9#ZGh<-&?O!(U``d`Byg-N>>q;zflDO*GznSdAZX6@f3GmFoplu^^|-d}69Mg6%J zo?1Wns;sHkDDb-{n}Kp@yzA5QSo%rT!uxQJq0Uoz@cHoNBdLbf7p&`BciGAj7R|i- z@jkRqIjmO8R}v|Vze5T5i3|20LC{eXl&5!6Vr}VAWmC1QtL0yIfw%egUueqmz9s&1soO4$k+fm@M@dU1r9pZ&##>^0Is@K z@%~e<#lkD=t_N}iA8@O1ucpyYh2dkBUx`A{Tr70gnJK&zIC=u%Gg4%WE6=X<3s?+f zhy9c%SxTH=R!jYkSDa5S7Jqk~(|0|VcW+|`tH6o;>8_D#r)qiAn{lZO6O>;HAb}6k zM$#6t63aSWTC~=ZE2Q~Ylmj0JFq`nU$&^iBm2)C87*Inr_A zP5%<}uA3b{o=$DUL@^e_{l~0JIh6zD9*rhCe@AbIWJ$ygmx?@(U*fK5U7;%NvB3AI z8&txRBADJbjcg|pU2z`E#nQxibVmXh#))Lq&l5X9MTtK2_{qh488%PgX`tLC>MuKb zJKk?lMXV<(m{HK`1-dY{f4tSux;B#ha+1FOopEKjM-L^aAig71Qx*`j2fJ_iRDw*# z0T5VrxZ;GYb`I^_T_wa#lDQg_8JLQ2Mt^YzU(oW?qHRIkSq7}~Uc{DSgdQv9Sz3cxeKPy-OeLKS=Juu)G6^@7K1O@U^;$IN&M=%2VIA-w#6JY?6gGuE zI{P(?qqC2R0-4;mW1e(1`k{=Twd=q|Y->4M(4g7#HT=2Hla7S8KWn^{UQPJ}DGMu!TTc!4SC820;TG~1 zUrCvH*&lKyz$-iG&k}z`P@1WJI*1o@QI&3-!O0NV9{j@0hLbdH`6Q;cAt{!?<1i&o zuB66{3OA-nRRDkH)ipqdB3gp8q}lvQC~)kX6{Gxm1=%uxD*{`E14)n8Nw^LsJe^WJsx<9oPI!oxOuG}HO zO-;3a#;s=;+xAolTk?`~Tg^((ru+#$4K)Q9>f?CuuKf<7z_+VZnX3*A!gLyDBHXN) zk^6%(elZ!hHGDLf=^JmxWp)pTl5FG>&J`JRrhMzNM+GY_Lltlzbgb0Tx zrUBOkC|*a#ZjYC;F=n(DPd4c&&PM3_lOA7&N=Jy5X-DFKWStK4WUg$yHR zd}(|Qs~_s?C^XyuLnD;Uh|H*%SEbrtL{hDCpVQ!zymW05AfqVznSg^!(=GWY%O{di zXgm;%Q!{qENpA!i{oU|YFs3|QmT!szWA*y+l%F~7*;bzM!Jtg|$D{rx!Wnf2G3N-` z#kb5vpWpfjHbiazPB*Uka=?C5V+F>baa)4EEa{+Z@n><~&j1n$F0Ot(*#C`y;`SbV zKT?oB9FNZCsZnPy&Z}ODbk+hS3Z2*5T((|KGg#IucLpg9Z`=ZIR{jAhzG$YiUV5NP z&)yi#OLi$hhj;7l!_(^za?d9Un=W&gEEc4m_|QPH)9N}lf+(_ns{)^WJPE5dV24Ps zRJ|V`K>txc>9U-3XcugLH05HxKvwKO*~UI5Z^`auS+2f>uj#qKi!Ik7alcX_O^o3}phqUsv14M+`A_d$AA?|xs6woa_W7u?M$1rJHm4ju`(KlFS<_8YWFRmNvR!lF zH_eALSnc4V)bYf}1IZSX71QIMZDn2!6aN%Q>TM=3G!}E1(Y@+#y;OmZ9^KMLZSHnk zW}^c*)E6XOD^oa>n^yCac2mbxi zlMd+?Limg;Fh?LM%~)a@0f@6#eI^Jlsi(?u*bRv}V&b-0!#%192z=O@MK04AL9>fB zaJDCiBo%4d^Djc*k%G6PE!IEP1K%^pl#^Lb<8jx-IK+9_WyDb&akIrA5EfDs)MQ}| z{J+B)y#AE`ZdILJrN*>7UMZP<6+fPJ9O$;>YOx^1qr?=o{d^Q@VYDQ%M6M@P|C-W2 zeAlS-2j6KIdEs6D8!NZhZZOZf-)~IbQjZ{lcpt}}_T|;Mb!NJBd)+cZJ>wg^B8w7A03&%fCXJ@VykmHQ z+Vn0l>jVct#?^c`XXH|7R!KVF?-3s`kx1$>cb7kSg7%+KB8Xot$B+cwbEja)QVZDR zw8GmF99G?@NQt%^gCTn)iL)6O3j2p{l-(8@Tnn228R$D0w3=sTyvu#;`_`A~r;zK1 zTWQFxD(e50hL}cHRej^JlMm(ZuUye7-7fRY(O{XERMp77)7W?DAn3_fP-VfioMwk$wJj>$mZ}fuHi{*P3L)zQmUuL9n*2%R_s0=Q65jAFzOzK zRhK{ijt<}G6PZ)uJ|*K{sISG{gdRa8c27U}l-odT{_}$Lm>r2>mSLU}p(%9ISF;_v<=C)s7<(W&4ph9@LHMmGvWe zhDW5DB^7!%UC4utcRA0#d26{TlWhNa5&MbwT3KMI^!}FR*E_P*Qm29>f7YJH1doIL zGyVM-KCs265m@0xq6UP`U#5*y?OJ4^ghbW|*`(8qABuAwlb-Zgc;B~{#zX=F2Va zamZtGRMp`#x*(h%ffvSlt4m(z)R$Ex(tZ=T1bbWT&8Zr$fo`NtS>1wW^wcaqk_rIz8m#w1qCgZO~*GX;Y@>0(VEKge^YFH_MGTkm2K0pv@e7yEWaxkeBxy}tu`4QGu zvG{70L5W@F%73w(Dy;@gAB5{t6J1PTXp0}|LxF2d?|mBNz<$6##iEy4PROtcU8Obp zb$@MgX!0B2u?4X5hmU@&ylpO0wPJ|rmgxQRY_PWnH1G0D2VVMj{BsRlZF7jLJ3!Ph z&$HT2Qu~j+&R)|YZ*Xam#Vyk)JzL4J{X7LDC;~KSyRy_W-_&m6YE|;~{5^PbOTCK} zrM{+p`>PvhWpn*XsxOWe-u4MOPLIg!a#;&=i3TAFc9|nwueB7JoO8DX`8D#58a(>3 zI**j-4*CFB27gCDB*@>tL}zXch_t@xTC^J>dI8a-66|o4^Kg~Sup=j5rJ-V}7r!qS z(buQ&rn6UPB}?7o$xHd5CM%C$D)^vStM#_KeTvBvh?iXozy19sgvk370{;oL#C0ET zj8BxfYkF4xO|3GSWj$L?rr-GgYVZu&79kyjEov}ZdAHa6?-ixu@uyR)k+5OJ0b3F> zB{*IT(orNUHc4Vi>6mzF10gqC;0xbiP*7t#VTKGHJ5>U?5=+2Rw^MrCvz3sYp^}2< zm6SHBlZWolWZG+YI4O(Fw8Jg7)}+uV@r*R)Pvo>dIB+lverG0oj8{1mKL6Hg#GliR zN;l`5zrKWVZy9(WhnH37}w)6`q&=b z-T8vPBaMQ#Sd2NM*Bgrro!rk|*+u ze}}#pT`oh+M#0QZOSOJNSzTbZ?@80^vobh~4a@W*ZNI7W4p(-J3i0``6skXdZmrd` z))W6B26pyv3sf^7?wuREk@ub2Jngc0riwm-5hs9;VUGiU!G{WQ&*gz-8{ZJgIhoA4j5o=J z~$!?$0oiu>WiIM zU~YSAVzbJhLCp93U+6hiq^)zb>GyQGHx`7xwmTw3LoWyVB!=R&Jae4Y@pncqGQAjG zt}w%-GDVZQ%tP@JG#;}Q&^6h*%Z|@Rn%1OoEFXgk%UMWh^ zy~_5hY8cPciG+-PoQ+NKaGXR$tth6@oA}sGmGo2d5;a|$&pXTyix%DPD+5s3n!jf? zaSUbA^y9jYPsA~rAVyvIP5JYnfu=Wn{4o%QcB6hL5>w*i9KwceM{jdB=rxZMdUPSv*3y021ztAPlDTj5sLu}&d696+7 zkRt}4N8Rq@D1VikZ<^ohTpCdVn?SF&HTL4xt+Kvm_%rYKB_OPVa#X`B-6;J*4)Xds z>9u{}eLv7W0@LK986O)#jUtv9oX+SJum7FO5Fe=>3YWx zx~-2q=gj8xT0PRAR$;aZQxJl5CS-ea^ro#Zw!V_ccw@xA8ga-;JuTwEVdG-01)lzJx^fIS+&?gQd@7EqG-)9 z75<1;v+6GmBw}__nSTt>p^i*+FrAb!B~QF2(m8AS4FJSmB9{|EmEoGH&P zU%vHVK)AOr?l;+A&rHq#s)il@4XZgB7+3y`tq~*LH2Nc2%U`?y`@28|_uw3U2Wn5X z@ZD)POH{nPEe{$(WGF@zT;hYKTZ>6Ja|hpR?>g@n^7IcuU5Zvunj>*j#SHTDtIVx- z%E^us^0BO~$6w>6sx+8BaFt3s^(io%G98&lZ+{~a%2_I_P$VM`4hRb2BBh3NrJZLv z(m6)4VtCFbEV!V#m>RX=Cyc)hz*bg0_*#<{QXDDbgdj~l{e1l7ODr?KNSv^L%tA_X zI1M(Bcah?NO8zijf?TMnx~oHQww_{XnT-aryP`-Tz}ose&|K=#cm&~hbD;8#WK1ys zQ~AezHV*$SkBk(j^11z|=GpelncNWVtV;i7_QcXC9mjk$B$T3iuFzyR^QfD9ao$#N zc;M%>!j|#i4zBb#Donub2k{mDkJ*Y3i|8HQUsKh;u<$F=_=cdIT8jrNP(EjE4TO#Q z&)=qXdHcLBgCuN!Q=^_o!aqvj<}zvTJTB!s993<{FAw*|i>Xmv!cIz1S~hV;kWP1h z;$DPu`iDv^D1toX&jF^=r}SRr63D358Fpwwx)>77_QI=^R3+($ML<38J~Xn4Wc#AR~dj{>0dOl@;enxKgmxO3E$OCaC?#L*(UW$XfY~ORv;RO zU==jGNs^8qbMm-l_UM$Z8HP@msXu zdR`>Dk5}^znU*+|{9>7Q1rqFAHp!8z;_$NW*P7pX4wIjvjC!;-E?qC@$?2RH5Jgj#5VZ7)+MVc|(wU zgHuVs={v-hV8`ql8ej!-T4wxYN5Z+L-CTBD@>r|!I@gzgh$`-ssE}HDC9`@mnKG&Z8T*qJLM;f!N+kcpG3wU zt~@5^avsN6HBA0@%D~-7_ZQ85QSU4+|exw^;m#Ngyb_lBd4x7T~FQzg<+?U!!_L)IQAJz@`&doho}GX*!E z*D0iHvtcZZer!TECF}Xva8VF!Pm=>Zw`XejyQ~FBgC82QA&AgUq{6*jVZAkJdz{f& zwYnCgF}S$nhf?lxSs}fA+V)A%Eo!D@dNR?v8U_DRo8OUXw3ZWzHIPH0|5Fr_#rlPz z3zRb&R?G3Mjd~J9oMa(-R%Zt&U*u;-`%3hyBN~Edz}{9R#FrQk*f#iBXmH%|^y*gO z+oT;P)q1O>QjNzS0(J)uxk#}cfBePn)P1}LOgS$cD)tb@JwT?U-At?b>*O6F-YbFtXY)(_DMR<5MYJS zhm@ue$y{s#0_FP`+XMK|8Rm)DGvj2-zL5+I_VHPsGLcX&*jslU$4}_p`fXK81+b~- zR$5UnPI&^=0E6x!hWc^wyFoKIfQYitb8eL>A&>+O_C+#@H@Vw=wAY9!W+jsu0jbni zsKu_jqjJ&>CUdow04ty!5$1vVu6kGCR*7B29?+VK`eW6OU%ZK})(EuwihncZdo?8~ zV4fM{*C1yc8Q0D+DC$AH@6==<`R`T+QJT57-UW!NCTLOW-S+tMVNks-LoR_w_Y>cC zfsM)!p5yu>E`Qb^T(sU?G;?hg#yp3BphPj4kW0*T`PCOcF^BH*Bge6jX2MavyEjfZ9>MY0ZT4t<18?rEj)?78F*u6 ze;$LxMf@>)80tb)a9|q1MMxpzw19`1@0 z*p)-NXv2G`e4JcwJUI{y?)Q4U7yXJ~KRwv$hEI zA(h3GDw)9~=8yXl#CpbJg_eI2Sb59nX_$$hQCh0(t_M*$J3gl)J+Nv%0F(CpV>f{Dqaq10qzE-mj?XmP4tFi49&qu{fvCd0t zuW(WVZ4Mc3)dNRFzmeV$U|-}Fa}%z{k6gZ6c)NWhN#Oy|-2AN}{>?rtUzq0r1DffD ze|f`_eSa$k{~yB6JF3ZT>Hm5-f=3ioRH~qI1RG5Zy{HJNGzBTrA|O&iC_*R_Ktw^h z3IbA9lpaD$=m`jf-XtUtdanUONPs}d@4<7=J@0$pyVmb77p$<%v!B_sXV1*{GiF-q zO!J*yJ8QMJ@na?7A_)oW4O{8M`t-|M&RUf{3M6poLTwML5^ODB9ILP7POP`&tu?4kV z&VJ+re2Z2|fhNdVTS_vG*;KNEGio_T$iP_Sdszb+4y# z%BAP<%UuP3*|?Xm*+K58lt!oP;bF=5#sW1As3$rR_5Q*+QC-=6F3(vDP#wYj)^ z7`l@Jog8GEbDVzrS>9?FWRvoZ$3R8K;3)=ZS6hTuH{KDi=NT=S8&Y^EW`1JTc)Zwp zZFVMhCP_P{oC0*H?3nB~FOGf)UlozA7sP^$+K%sj(US_KL{iVV{r>g9Z)XeUZS3#H zhoj{-?If&{^iP&OzEpcWQ(auqq<~%g0P#~%mtXK!63 z8JT2{T@dkO9K+aXh62i+;qwOW>XdMUj)TJXUyQ=W0xvIRcCowWgP1Jv+ z)pNFh6B$9GK#Q^=^a}NEyP#kE8`m{0p&2pN_XcTM^XJuLv_~H5TjCD}STRNv0tPmr z7>PeZj&o46R1}2on@O&8zALdJ?bAg5VuyH(b4w4l%b!YpdC4u_PI0!R0R9L;9HXlaS2E_c5Iw|&+3F(%_$M@Tl_ild9yRNWk?M0 z32wS**N&l8;DqB&aWvKxWH$IFZK!NdWA*C8HGa}TJ0{I%iL9GD(x3e5Wlzw6BS1Qc zwXslWEk7?Ps%6)MWN8Ut=iatJQJuai;>Irr}!-J1am_^Zo`D~LG zGwHGe%&7*v6~G0j}%L;(}2Er1y$kF0x{ zNFK@JR{_*HYKhp@+p6%4i-8=!Tk_~mMwUw6&%d%q$y+2O?pdIGX!+kz) z-{?jClqKyi_cr{7lb4eZ#dxMd=hjq%- zBe#?a^e6N*C$+U79q4E?C~xbV{iqL}Di10~C{d;?@`kL}>CWW5vZ3aL{GV-I;H6A7-tjFAG%`wF5N%yBYKe;vU?2e0gdol-Udi! z@mMFE$`n9F+bO&5uPc~bYufG>7jDMfqXp!K0MELE&OtWl1-*;b*UUD~d!)+$G+-re-SOa!S*ZcgZ-jG1PnpYV>IMN8L;z^36SjS(1XpSexs`fx1U(@lDTDA3dAl za5JFZ@^}fI^u5KQ5?ASx^5>ewk@Jh9H;?)UT}VAbif|Shd;Ma1`C72x$h;OC z&*Vk$wdNOJUDr9cy&nx-FmmP|jTI$d3V2v1@sHGhVoJ!t{`Tt@UTB2x7LXy=w2E6R zo(!47pGiucAhLf&tO39PK$Z;v0~lZ9V`p0SwbgJB*oT^|%#BtJQi2rerRB9)C6o8u ziZ26kbk`FXz-5;wCxB1#!t{Rd&S)*z>Ds5%-8)AzC!M0{h9DjM1w3~&0t13V0>3ni zU-;G=^ALXP8;s?YFGaek`WM=DpK@^JUzCHtiu4iyu;3;9v55mvvV(4YC4Yxs(*}g% z=$W_-uXs$0L%I?>vc^y=JB}c0ZlP_J$DtrxjE!fIgpp{tGEMo(^Ces=#=d3z(op@k z@DTCIOa7dfxN~28ZWr+wKj;K=dZ3>QUr)XtOKZOxQ&OK$vR87{Exc4WZTDK-Z!#an zCtD%Nn(+g${_hMooX>`bg^o6*7Kl)_;!TdgBn~m!LvgYy@0A0Q# z*!J8d45oRu?U|-B>!zELdP!T#*B>>s0qdnOjw0dhriZiQXLmomg#gj88+SFBf5fB{;!<;%c3zQ8S(ZoX^)n2{TRjBq^Rqk z8ydyjkZixZjRNEpu9`z?y5KWrS?c=|dfETY4@Jwx!|fki=+p$?Mq5W*J*I;xDF9Uc zlkMCJYBU90a>9|U2a@}e{fCq7C2)JCC?ufrH;kP@!`Hhn>}&Z60HorV#{b`1{uvv& zYafyEQtdhjpQPOzYu^#}gG#@I`?2BV(N3!>>;xEDkTnY!Ug?Hc(LU7F{C|I`{|oT- zDsf<6&STRE;51KH3J8{zhjCv62eoDmIaNSBN7c~xsw#Ya#G{99K9z`Dk28he22K8p zF|AKs`>i-|VeQ6DeYp0Sw>6+FR(S#Ek@XWfA{fJ1IF9Yz32osAK~6?`19xj@g4+TaNf4qwi+h z?vH*Zn#`I6w?=$-x}{XpQ{`pP<2>&M22^djW}Ekm%gGvgaCqXx&KN6jPwns!!_uo) z)35!O8hf|kUaVh--8vmw>TD6Grw8j)2FG=l{^-n<8ZZw>d|r8;SUtTOdR!${Zmq6F zj@wANn+)KH`km^WWk)+QyT1mJNWAvX(g2BH4YiYG@R0Q@cUY`f+EtEnQrr5O)aQ9u z;Qi07(hi<)mGtd3&F&MN*P&#Ka|#-FEK+9E+(ISIKfm}QwFp^V>?apiKRjQx^~Y6@ zQ8S;!^;ClTnf7IFr4t`lYu>k`noC08Cx_ir^oaii=ABODu2C?gJd9EK+*S3664pEw|0y#DQ_?+nC6#Em)L4`H?(0Qz6RX#8c>Y~Upc$eoKn z@)vJ8`oHp)-B^L2!I{tP1(w3e5x(mL0}MV^|A6p%&rEsh1Jx?{_zUTURxsD7swU7v z|F2L4Q1pcgzujz^&OULDed^j2lcvVY zOIE~H=!4eMosVRmDdD7)`Egg@20@eT)aUoTJGSRCGO+DGXZ0uq z{tjswKH#IJu`j!TXj#c&&TiwTc>s}VlV;9b`ytZH15)vPY@vt zpu%%B7o{QZ_gU=>xe%hauG84-e>7g<<%jjF{%7Ft#ZUVm58=OPfY-EE`hm9@Jf*U2 zhP}adaqZ5an6*9rbbAZi;yL4T0Pj^Z{{3Ohale^xr+ekPM>2AiQrrQV$w6Vhu*=Jr z@9_f^;FbE;$a5Vi++IN7gBcmDAn!neg0f73R2ERqhp!A_eSSS2N00L|c zK!D8>w|-Ga{v8gQ46u#9OMG^XcHU_sM4+4_GVD94bSoLs`mr!5moB9hXf~GghzLL> z6mnZ0?4jj4mB)J6yIxAKVjLl3M=ksOPcFuqMj0vRfdU#^oQFslL%3*k#&wUsqLbx> z_lrPua(_W^u;nt3XGUSWK( z>l)yR!nO>t2h%Y?OU#9lGg1F$$;w2 zks19*C0|~x^5(h$D%k=4vvS%^X4E^e^QK5wkh+=Dg|5qA+aXS^#E*&HY(hM-OV{y> z<4(r$O`m*jMh6Q!wKYBRo3>pGt$Yq^vCG^2|A1nhunfKL(O28$-^FmQ-4ShRzTcu_ znrrXKE*BriF6Bo_xYsX*yj&)CF39NLnAkEa0iZz#_ejy>eTGWa{eTl;LZ8#`=3i!F z*x${_K6S}X(#s&6@P}VUpgBM zm85A7*{PBA0#8Y-?}@E7$>HD|8gr$$-0rA1?VdBmW>~pX@|@ez$HHr<#bU=wASO`c z=w`pfA2XTym(R8xZIc*SFT$LJ*W*7q%#H9u$tjhYw-5a)1@(OU*RMEZ@=PiC!#Ig@ zP_&&{2S;xzz$X`JGW}`m7a!v{7m03$m!-hJHSJ!)d^ppd=>^o%%2a1FN2Wz3X0<6F z%gn6HU7@7kDlyXZ^4l>&Q&b9nR_8_k8eEJWFZF<^D^E}Hq@z%~jEEmV{0>pZ+dSsq zUeq6csu>V=Sfr%wG4|v`>$IK=KzkF1>bhZqFwk4Eu3aVfQ6;`#+`vVB!!TpF=fWis z4@Gr=tAEkm2X&rN<+^U5&*W?EsMvh zH91PMzNgxgzZAsS&@>XWYOZHZ_BDO6sPFUCO8g&huAXh-EcwBe63)V$Lji@6IPG`&cv{&<0}2BE~Exl)M+_!rCsysyM+OtKt^U`NJN0u#(5&GE0ysP<$A>>_dotaFakDVUy&NIr$FX6Jo zpP^pj>0E@Vkf<(pzE^nrz-f4lFH3z z;52OQkXIG343fIIlaIvL#$SPeIhn%RPT=*^5m%r z>Bn7_ug8@hHC)?Ln8A%ep6a}SkHAW)gMTtTVpZvf^L>`7%GF*=jh=O7s3*-8{(hf@ zf1f({cn$!y{&ZH3%vESR!6AIWfdd3y|43_ht8L3Q@SC|`W52LyB)J%3sy4?Ejj8zz zKzu)#OcpfYmA-P>i%Kj;`}zGEqVUO>OY#a{nxYq)t8MM4D>|Z*3u~JTj@MTH7Ab$) zt@fg|lJELrsqX!>!ko*r7OAs)Et&dD@1ODSB_#^eA|k84hqU)#Pn_sWMbAJIR*L?o zL)^GogYO#M%Yr~v!=*c`ocdl31&3d)0Fc{xo?YAhjn8#X1B_-p7yxsf8#9E#el^c_ z#Bvl4V^E}usffkuAy;EWs~tXOvE-~^A6qv)P1Hou^|2gELb+YlOG>n%>k&Y6IF!;f zIt}Fk*U`34-8iQ5^-NUL#aMfzL;KT%bSlroflp?RcX^3ph&UT~iH>~q;%|l7Qa@Wc z(uH#yj{)<8^6yqT0rwh>trzpwTJ>oQ`fy})!`4$^en9^rO9Sw?IBpeH!*D?p;ZW1} zUVT6xW7rz4r#9-9a$nk(wO|;fRdVD;9%n^5=B~Jiui?T^vVYdS)G~>uRaWNyO^eP` zc~|>5a*QfNy4b3VIVzAG72U2cg!zdZ=Fj{xQgDMCDf;3q)ltVe45?X3w*m(=9K%iZ zYc9WNQO0s-)QrDQ;^hDzt#~UQ&A8maS@_5FM@gjI`Aog6$#`Qep!T;wIIjn|=Y4K- zrVDeLY#T305Q zA(b6AZJh9kIW20%zjm_#i$A*rbaY9KB$f~VnqRWt&AcxRyg3m}-)ypcHYdn{QqI^u z_wTJ|8=nXh5qMqOf53R|lg0v3eCg-5Wc6}{bGPc|-6OSDB@(5%rtKVkZ^(S#EF$2O zx}wlBvf5K3x06Sc9wMI(V|Cgvt%XDGZLfLcYAoIBmp`WFb+Ca{5l2dK=fh>|rFA>U zdZ_8IM9%J2^pwNSf<_q(=2!5lBW56o07m(sXo*YtoZc>czK0hf;&YYiZ>`Ln+shw3 z_fGm1s4T0LJ)r)Iu{kZ|ly!fF(7^EZ9KRmk#N`Tefsmh;R=275()Bp3jL(+IKsl<7 z+y^Rnn`O<0)<4n}MiUqpL{#dEmL~KUC1JjWqW%cLJ0 zt6rx1R9dyOjfNd76?mZ)K;hO4YG~L;*k#}w5@cOGbuw^`@ z?l#+3{q5xGnTydS#XzdyvNqqdSemm%{HIG}&yFYEwP_yyCpS2YXH(g|c3P~`RsV-_ zt`!sQ%XvLF)Jvn(83t>;h%FRm^h~`fDi=Q3pJb&p<~NsSy3eRlMoC$LGe5PzN-ZQq zMKD>N<<|<=9Syc`d66)V`AF*HF}CmBT~&_SG!YSO34^s<>mP-3dOW)mn7zk15KvOB zC^{#7>F~pzr^hvUWUD$a9fwIXVk26UmV48dJ+$wfQoO{&9U>|?GWEJqX7@|D{;&)8 z;5pX^;?hUizTR>2dT=W^G;2Y0gn5>}<3Gkgz=%exN{<4J^YbvPRdJ}5KG@hM)!G?AbN zLbf}9fP>7!{2B8Tx8tVEro|-TikBc9Th)>%POmsoEqUO2 zF32|Rdm(KK`I?F;)QnmxChXzrKQ+i9qvgPmw+3w`Z0V%BTe!t{FDA&xJqel7#s$o` zpL`NP3_^IHHc@TM7LQvan|cy}fu&`Ok;vq#+`!WfF0Yd)=O3&P(xeLGS4M}MxVKkQ zvM(Hc9V~sE{l`r{g#+xnFpb)s6T4IW7H+lQ{kJCeGSWp}4ZAlS3zOS9E-5eCPFZ#ZZsZaK_GosVb zK`i{$LI{V&&diR>iSk`=J%!>hy}H;pS52Mk;ttEYE_{|<(t*9OYO&)YI9**Marn|P zdPiO8CUnj~dUsJK0{eV{r(X*aYv84JDHhfE?u@L~oB@n>AS`(?1XT{B_aT$c=oC)o zTP;OPC4-Am;xN2>%1NT^M|l&6J`Hd+J*N^%O*p%DpsW@BRcxiHjE||QnnP{mbXnp_ z$-5Y;V5+KBzIo8XA8)=k8K1lCd zzbU);Mndb#wd11yUiAUny6lNso|0u`HmUFlw>}PhNRoDlH%uk$B1e0-jg|3iXt4AF zHV1~OUMyxbQIeynwTc<5wDNiD)1v<`^D`oPKPZL~z3?6!P2G>iGCP~LxC(P&;%C@@ z9KdD}$9m=AMen3;Hr!;I-^dN|T8bQCyjVhIuM9i9%|A z@tl5MY_tM3eVjUgavfrmX*K?-=8OCxF0yZohuLh-9WCgttH)fLJj4f~n7*SCPe1+Z z*MA!<@R`r{PvFe!t{O4^p%NGNviR0e)924_xPLO*>BejcVeg^i&SRR!{V#=BQBmyG zv(7$CJp{Z8nnDWUvrSX9O;y*OiO#JzoI4hDzm6y%LjV#CR}*|`xzGT}kix(%;N9ad zkgKHa9HGfdr>f~lkLULhpinv2v{G7HewNlzxkK&C{yyfA8&=8;$pp(@dbzeNfVD!i48XgWjCEZU+b z4A=Xl36fIowsTqDP~RF-d0@KJ7+hOdxu9`fx3x}U=Sw8L2>RG0-!<(I!nEry&8`~N{PZ?A$nk$xJL%bzL7NV*rtg~as;fUuQWpRBQygb6^kQEZ zn4J&ca8dVCUZYiRMrjQv3fFqXrUbZBjrjcW0#H~JJ`mT7Tf$Vy`Dwb)ARTHTFn8?R zA#QSKg)9ZtWMFfq=}bS7rZ}`WpZjTpbUvTU_gc}HJM&sN{e>};b<^}1?E z@F675N&~@*M1%9mMliC*@Sd$R_fBSXWIic1*%C#I&JA}Nk>&%3TPv+Cc{_4%=6tUDp!Nt|lQLm@R7 zv)wDRpG=|BxW=W-N|Y@odUgLvt~vjhTBVGEQjM8Gq3hEKT&RGmY{bVg^l}Ub<%I z=xWesUL>fR?1MZRbO&8AfHgQZQ^Guy-KMM=5QrjfetJD%b4m;x75*jRl@Y@n)VcT zi-_;G|9;%RpA4|XWjG>^S1_@G2#Y1wje3p*(NhjWE%iDos#bz{H0n}BezQ<3j*uZb zdvqCx;6oElsDxLy8jqJ-tC-6m<+!wJWOn9Pd$>m4UkXP5 zfdRN6(!4g18f#rty}O+rt`{ny<{?w7$m3ah(`}$Z%?LK$sf_I^3JZXA@zLlxGLX&* zgL|Ek4@2Z*#a5z+)1S_p+HY$yHrkl& z3<+G^4X*OudnDpMG`%6`RxI1!5o}bMt3O_!S3kfeD5L&@szULOLE(l-=rG^OcV+>$ zbQ$Xamw=+f3bq@!J4_L(7jXVdc#wFyrBx<)BjQj4^myPrHAZOgE!V&Hc@g&Lno#wM z)Bwj0yaRb;uc}TP6fG%odT^1>$ILXsgd)aGNR@hEl0aqK|&rj=7bYfFpB>9P089R5ES3! z5gEu^<7(S7axPX6sWe_Z@WxDKCIrEGIv;J?#7Dh=N3o~)rtsKVLWT4?LQc+^jC3JU zq{)Rh^Rc4}8r5Cqugk5W5`q558lyr=aifjwgJf>?tr3F4Ri%HwBeSl$`n`!mVS3qB zfHt&fr^8`ozAHl=OH=p5f%&(##n;R?|L&>4_jQ_r%vx&ZJ7*|aNW!QNly-` zqf|!|D_mS7m5-$MgCt5OT+$n6A$nfo1%ZB^Ol3P*kGYzY7;Xl z-a742C^>BAq`LIb4vLfu1J9)(WgLv5X-lWvY9TcD`x!NKAguC0Az>g>N@M;@Z~{1C z$pmm*SG?a(R~m!;o!`$EJTxtkGoundX#jt`c32Uz96Wn~ozlo%ZA-~F(GGR&ufX-`@Rb;4 zwV{CZI93HLsR7kFX5Scj@Tp2&y@02kFH&Jt0`DVWF16&dP_a#F1_zw!91(OCmtxZp zoQ(p{;FiqyP|2*e@+0y^y<<>zQ^kBp!I)=tB@R|;#@o!0YkH&3Go>4tm5pU@h(Key ze+<^)?hdY%h^0n9y|%a4x;eO|TFR6OHB+FdXtKLTpsGB1VY(&nGe9;fe{-DXHhmP;T88 zvq&on0_-upF(mLjV(BJPm1Qo9OG*|d*)B(lJsYjS_`>bx1+SO*I}e#{MU8bp$@SNnWjtfk#1OiW-6UbC9KVe5LZ{ zDJqi%qzp4!Jqp(NPN1Ba#J?J?C$e*r6Vx=%$t&r_tqw2r9}niJ0wjDn z7lVX6RkP5+b=7a$UEP37X5#OVGSudqD{&kS~#iR8?K|A8*nWI4C}SSGfxjJ zOsi6K9o2*cxl>`J)p<`bHcv7s{B*--8&!%}KDSBU##<6|peFw)k_a^-R22Hx5F zX^Z+9Y9o|HONZ`sav_GXd^~?l_G4|P^Nw$IF750ob(O3%MbE10?b(!2WOr7fxaWVa zbj5Q%KK0*{YeQOWuGcMLLta2Dr>hom^K`wo?Z6u|k5CSLRL99A~3t2p_6aQ_aIU?O@>j0yj!m+TsMGu?J|jKH=#deIlbZk1ZYT{(kj> zL$qMS8$MTFS4(KRA4;Bg<-87gaFU!U2S(M_iaiGzK-0q9j>#E9XyjldLM(KAD4%>w zzlP8G-Q}RWYiw8-S^onxpQXu0k&B)6T|j1HY$RZlw+d)qte2%q-6y`7UxL42D6 zRjp|Fp7ZkZ+TZd3qG#OmEl2ehFK|C+b+>CY1T(g&yrB(mv{fdnRv1engX**Cs&Yhm z>%QX0D?i?>tN0E<%e`WQcBew;Ze~oOS(8|%>6>JWr?T!33vt;VcbJxLK>>rKZo4%5 z7{LOBQ8}4e&bt4|v%iozZ|vDWde-#?83jfqc3MRX@(rL@&|oWNW@v=_nJ&ian}v*> z+>8)-21?y@dvLgOvwJIvuj|L)hMj&O@m(SVUb`zJp8BRVx4A!LYs7~Ym^~AlD{6X; zP0evzFQQNedN|KpCy7IzkeR=BOec!Dd4&-OjF6Eb(d&?MAcUJ<{t(OC;opC-JLZ+zxVvY5=vz~w5)e&oOycAZkl=1y*Jp^^bVmmB1?xlbAm4T;b<#T--?Mq|KfqeCD7uVfQXb#E28Od6qA1^oCQ3Y(ArY z4n9EQl^&_oYvtJqY6#{EvQe{c-bJoZhImD_=kAw$*pEHxdhP4x4x6@Mt`|r0N*!H| zpLS<*f-9=4S$jJ>KJVf8d`4hI;n=wkJSrdcTbG@@u2jyMwNIrBg5Ic&r78Oqwl*I7 zkMsWA(Pa^~W~Xj704J%pjy zB-;Xl08a>-1MO#P8HSoZMR}6FjtT?WQXrl2#}b%<$m z7ECi1ZhCm3MHMfEkBY3ls-WW3vx{PFc&F!OOG=Hn<9;tQ_sTnrt{Puylt^IbLb=Q& zDy9bGZJ{B2-kPX4EU<3eArbM|)PWxY$&<1!SUPCeF=*S_uco}*R6Q+PCKvY(9nN`f zsv_3t5T8Kij{dnQ8>`MgT`j=;U6EWi5(2B;fzpPFPPDEAK#j9gQF6<6ngs z$T%-u$s()_(t8?0(pBY256-U+?+?yZ-bHP}h*m@v@K1ww3Dgme``1~}P-kqK#?J*) zaAX0WlZSgfV^bu#`eltU8uL+vY90%LV`t5S5NPK4-WL_0|L+n2LA=m8wiOM7=$xIg znh1oNFL)5Gx)vRN(5-+3(i&DgU3$sdKjdL*Y~c^B1%F zr;kIl-2$Zog`KWR75w4m>GY%XJmZyfOp=02abr>beEyJ9F+E33&I8gzdp2tBfnv81 zA~DWaz_dGraT6WpR61|w8TpwMBcd=ar(srW)DH;HGDg#c!m!e_nJ>41?Bep;O4>uo zg%Tfa!=Arx9YrAr_gJ4+hbyUF-L%z3KSz$)9QHGT=0k0VcJS3F`Tmtn`scv>^=CS^ zPa1a6OUvrj=Z6*n?4ueP650E6(k#~7>a+v* z8Y0?F)$co92JA1ugVjKK)@kqvRvr%!AT*)XR)0P$$mRUgfkkSr5@3sT6M=uD=c5A> zCz`qJx|Q0Km12`Hesh@+-JmOS#&)abL|lRBDBWsHM&{I6Q@^!(j_T^wz1u8n9>`5NDTVxR~ zP0z0_>!lx@%Z^8>nhW_YwJ2ud3S`270pT)LFl^Vs*h4@i?P5%~CjR^YgTPlh%IP*W z9S!)r#wgR;kE6w6lTdE>>lfeXc#)G#D+@@vFM@Y9c@2V)jm|_Mi3XO%rU(>n8{{yO z9=OF#IcSGovBxnt)q7Y*tDMYy0JWQNHieEmsfIEs+uyMwQhK`9255uXI@gll^8IKcDJwpY2XT|X@-%d8D? z2*$YwI|^1_`rPk*Uf3FMGP`V-=0Uub%D8eGU`rZ8cfOqP?9V7kGw8%KT8$jkL0eaz zEHdg(KpajYRm&{k+=7k1O`oc-(cWFFM_6KE zZ+T7arf@$F2r}@(r`3VW}Xhg&l3Tk;NOQPY@G{9FdN%mBag+rx8hl~&VWCUWYpgS z@>HG)Bq0)pU=k(cE-^RW_?66NB9h|UbYiH~W$TnLaY-d;5016jT63?6(<`y+OMLaq zu0#1M6#P?X?Le`4mZ_=%E6?80a{c9DqVyc~?v=d=!xR6-O{dt7zoTnp(=!HRy<7Jl-QQGQk}gI(6y!nMSY0YsI+g0@;%N+t)Vzu}$u*lq$;)js4xJ9sBE8rZ z$fr7|n(x?MHKLl*yh54%s6=M(WO0+NDB)2@Ql;*S9|t#!II*$NCs=(!Sb>?p1QWSq zkglS*JENp@a{oChPV$daKKNLuZS*wwGb(!Y+|loS*5WxIZz_I^Z#??Xrv1lVN!vYX z2)fZCOf6wLP)|?o-GI1m=G6Pif@SD3p>piP=Lxe-_^kt@RkABCly99jJk9cgy(zmA?)O`urW(syYWn>>n$!5J29;5LmR}Bz;_jM};oD*R+ zfYMa`y|=Ie14nk(9{Nq=Vmqi7#&`DPP}A#dDr%IZ+6nMYVisI#b$mgDPQRx8F-#Tw z;7G$iOY?V%dHnga&m(p?`K-?Tr>=~(htSRa=x0D@1>6)8YOXVH_)J%JLL z+_uSlZBAi&P#KJXuOJ$9fQXPBvndd|!J0-tEY%X3qZi$ub$Zn{9Azfe6^M!nWGpJ# zeUeDWkl~9R`BtX1`hIiI#(Xmi6byGoIK>)@70Bc&Ht3B0w9Wj=@7Z`V^4L!1E-#K( zGD`4`xc=Ry50Qgmr^5JGUl6OSM0V>RgrLhVg45H$S_e z>I#&%SGZYg+&in$h5nRC>=%DRX*$S-w9W$Uw>o?83!16`S=_x5pTIevV;uTBGCp&s z#Q~$N^RRo_oJ*aP+KBzs44rxG_V?ZYe&oA*ms))goHJorhrzH&5vT3jrb+;F*=VyVFV2%HvnY3 zoi%u^Kzc4Kw$4YZ>2=!91@z1?X5#`;NbYO;;;m6dBZVc1MD`!Ht>w0b{TrW6MhFYl z!f^j<$p)jTG(t`^65;3m#Aq+at%J%XymuirBvkKkkl!8+%%Y97ThmKc0OhK|CV(oh z+F8g5gl+<)U`K_+7C53r`SA6%*5pmkS~y~*c5`&%tfrg)&=AAtkC9Q;-L?T`FL3O)^6d4!yo#-^=Vg5NoVrVp-!`2zCreRwgZtR#q|ne+;fkO)5)WeE+`| z`L7=o2uF)}{q7EhtQw?Eu5GlvttZTdpw1I>k}h$<8}?f(G-sABw}#$*$6T8Rm$gA z9EX7f@W653K8W2YqI{H8J8?|CFQ7plZnwE_d?T@}t*g~OHB)Cf{XR5M=bH68nQFrm zBT8601WO3mDG##P1oXQ8BOGdL!RbsMX7e|z{s3Sk-}2sa_g>k~r;P1SD`7!fVGbf! z%SE_%g}g7*l6Tv8Dd+M7hazHt1n2mD`Dg*Is-ZuC;de_OyC?2DYXP*CI# z>oWcU9747*iyQ4%<~yW<{yx`#0JTruU!)Ho7_yovIqa^gfE;O=+u3)Mh1s!9SCXTU1AQjdlR9mT? zcHCv?u}8KD%^{KMS;YAm{5Et|N!y~sOchBS`#2ig@Y3qo@S&~ACWa>}@`uiAHAZjj zO5nP9PzlRnf}2Z3o6e(7;n8Sz+r_yJdpNHIH}6q>zg7eD=aoiL)O;-C>Ig8)uwo@2 zv$#FNy<2xR)Mrt86=?UJAKe+<^hWxR82A8vgJ5rUnvr@xb3S&@kyY$0wX&sv(&52$ zp3za=cpPebPJrj)*xZg`sQKjdT2;$(NG=F}zEC>~ zLmjG6jq1yc9&AwHYf9bIl~NurekdVl0_v31Zf;YYP*UI+w+&wtYNahdR375ecp^^K*PB~76L*jnkquqQ5C z!7dfI_lTYQirW=nl9$z{8;i^u6-kGGQ&-t;UFrDL*T9<2y-_CuQGrE>WWHxH&16?U z`>}S$#%h^lmX8mUM)U!MyhLyHby4*aScPn$%h}RxGxR<#U_^@fGo>nsksY)M_|L#< ze_#NDS|bT5L2P0*k6V0*#R#hJb-9gg8$a|}JSBo^EFa(X|J^6BsC0CbR0Amh)>zVq zeKwZ6dF#H9+Mg@iwxs59Rr&ii|Ha!{zCXHF^<16KPyEwu_;Bj#$Lef#SFsqqx^pWA z`O&e19_qt<=Ba*VelFD0`JM14Gu4~t|D$Onzf0XR7DboWm+~B#MfJ`?j#2IndOUdW z0ClTY;hd4i+kOFef}TWtjp0&3u?R+nGM{TkHj+6FQQsk^Hk>%Mh@-h@rkUR{t zr!b?2S(Gp3Y7q;Qk86ak9ehPwxv!wh*Tw5?j0$?fr6Igo(M)5x&5psOeCs)@_R~Sk zW)#zxh4mX9;hqT6i^6B9C<=Q;iS!a2=uTl&V0iSxnCiypgy`jgCAy@R=7@G~vwZPmbrm+vv3OMCdOMfdY#Ikd}s!6CU1jj|I)#GQH_T9)~*>P(7 z3G2z9-=Y47RuPtI8^xZW>u>+-P6+EdAQfI&Dbo3>XehC*@m&N@rdTX+n?6mYi|Q9J za6R|aARUTEw9{jB^k@Z*F-?{@1GQFtbI?J3*`(kLhdi7@2k9exm(P|gpH+DY9X>7c5s!b zb)6as6eLWqet$IU$Ud;&>sRmq&@l!_sOg&@<3y@)0^RAVLjmpOyHd577h7hPkiyDm z3J1P+pY<8;#d6M*NA|G*EA%1tDmw}F4GndC?c{0o0adb-0fgZ%5jX^uI*au2zh=E3 zyvebpx{1u%(XY^VGPjN21#~tXifz#T6cYUX|zc9`V(yPbyZQrC9Hz}t#sQETdx4nb{;e6;?UQUD}s$%uGA zrB7RwF+eXzs#SivraYe8`Rq`WyW=0nve-OGUqBA5yzQ(aB<0J3iIknA+ibpfp}@7t zU4lp{RYif@t`6u!StG+eouvuk2*sV`d|wx=Q|nbIHkqe1L5(X#Ka9!SQ)3j$YNZ0R z%nQ{A{Ggj0L2Lda`+$uVV3fLEGi#b(aaxq5z#78FI_~`7#q?mOW>rT@0YUBxfchR? zd+!8y8M-hrqO~7Vgx!Dy%kOb>uadUkfVZ|+NDw3$!yE$t44|1}KLg2UsRgy&32q-C zWE7#TPH!_OUe0R=P6sWyR!oE5PL)1x2co$5-d22iLZ7Wb=&(~b zatKnlsfFK1%)ENG_`RG#$M(igu^6!b35}>Y3m=RbgP1;m7z;DGZ{ZN^aRWkqwpY@- zdvPo9F!yV?E#sq7aBKS1f? zSIdeHIXC@N#J5@FD~E7J(7X?j7uc7Qx0weWkXzeMW-N5~# zthAc@&cF+N(!fTQBy)Q_M<$8(A6cY*w^1j?KOW1@J%O?x`DowJ$8k=i~d2u(lhM8ymS~RAjP{}9-j&Q*ELYZh06pCBzg1%mdurp9y zT7KF5s%pIIrP71y*<5htOT>8~->g>HR3We%Z$%+3IbsgqB`+jL?Yz0Ij79K77Sgti zQ|)wJq6OLdaF8zHX6qf(?!{WmQ~)wZ5&?vKV9VdGXQBCy%2jypM|s|8f~_eNUd z0{{rqvKlb+Y-4qDJ9mH8mmO4Y2)!*}Ax6Cm_nIcsQI&;Z3ISrnM7Zz;qCGFCq4R@hHVrcr`iRUWI(; z*LCA#ece`ZvT%$D3NpG;H5;3$9UWfqPYcfBf9}9_TvA5OSHEbu@?W zUbYb#X%MB-e~4$tYDL+|Hq@w@KQ3eU4>uAl@7jZjnYj-~*@d7A-dAUZ=DlYN9e zJS9w`s=9E6VRvWies-(urN24GtjfjCX>k}T{Pe!OWami+1|mGzbldA>k*r|-#tqd* zZ=+Y|7lKai_>A;q#NJT$aoyc2?aMYew(8D5R)0NxFgP=m<>3ir?!7lhe89~%++i2? zxjWVVtF`5;Z0NvTsW+#_V0fQp;#_rz_YkGyQ+`#m`W~f$ROzZ#5{()S*i>bLhKB++ zGRu87$AVbyH#G~}u8i*3YyL{*#vPre*nCL%{lDCjf$V=ousRBJ`)Nvuct#7*f_c)J-Cl5+HG=R}zvGi&5C^TmcFp@?zn&hHLpLdF4o;lc5)u zh6-xxST^QR`R(jCF;`DpM3ShhUjHPdfRI#f4X#lGHJazv;?fu=&Ratf0komOt!d{` zeq0_}y{aqQ;G?})dTW&nT;m!th8})o4xUr#^=PSAe%zI=s$4z09U@9p z7k=KVIin?{$mQOZs;DY-%Hz_jA{+!+TevgHE0TIv;MT(T!ZeL6LAM&4B#((7O)G`f zE4JoALnFjU*l-YwZG^QYBEq*vU-v_u8;lG+ZUaxV5T0Xla z<>yRHS5#6LlMi~mjeFxH?Var}kzQQ_E&#%c@mga1tVtZlq){<`8OXKYt zSzq%Uqe0j^vsFf01PO|3OVVr8>FCbJ;8CNiaZ$P7E|eq8Z|LR~DHojtGL>ys!aJD> zohRK&maVp*#U*Yeco>X7(pJw&_jFFY61F-C$2h+q?q1@asVdqUQ%ZS!bmlKF7@KT* zI^O@cn74JzQGyrwj8JFJ5=oF$v^}nabUPaE1M=2xqmYS1k5|M041tMivbOFNd|yiG zA%NMU;{}njEBlS8CQ3DM4MusKk?e^pbhjyoA=-UjEQe5n(DBnhViF8rsi4!!B6Y=K zDNma2H68a_^_@taJ>9l=IvEd&`$>2WdV4z!H0QqoMucx%gVxsqcsjgYFX=&!sE^Jk zN!J;cb->hNl%_M)QWUZ;KT-qTZ-RDQZ;O*Y5d-#DjF!c}^feTMAGP|r(~BbGTE##! z(=yVjSi&n_>Gq3oh; ztQ43_V8tX|tB&9Qc(aPRcntg@I3U2))^a0=Os39bE9DtHnd#G=A2aOPboAP1wtX=9 zaP@OK4)T1~qO-0bamGi_$l;89zWO<&$!P$9-cDOPuO(oU*)R(nnGgaXgwf&)UIl71 z7s8&gy3}eBNBqW!TFziNK0J<4e(x@@>%XhD12F);wDKDSNWIx`{`NF1>`!g8$;w-{ zg>K?OD-wA?ZK3<;?#$7sxr8(b>G4sQIeF+L=6Hb)Hgh+|B zl#Cji%k+5Q4jKhai|mpjXPTu#+?*7k6`6sG*M@r~v4E{UBq*wEo7b08T}7{RiZ>4V zXhH&;_{7H#J3|MnpYSzA0E z-vZK zLvK*A={Yo5gjq?ej0Rtz#}Ybbb|hi%5WlwC#-_daAt0092v3~2sA%)7j<8HZAm2(y0@jxT9{LJpTo_Dr}^w z$2yMht_oVP&vR;-?rH+;r`CCzz*RJnZS&jOOhL2PG))Z6ela)sZce!@_6Cz4+e5z! zG$e+rk&HE)CEx|%A~$Z&vg#f;NL8PE`T+*pxY}@JPC7gHAy=+vJ;1%)Xf%H4FVJbKsYgdFTc!) zo>b1?`oHAl4`bv!!|_?Kk@#Z2F3G!cka&QE!J(K)NUNC1uBxeHHbYVh43lJS-SJq; zv%wgH(HWNoQFWPX0FPC$d>+~3P-OiZomw(26IcMujk3qfeH98{xHuU_Rl`F??I*gk zM=c$ii(r@qB9X6MZ2IHHl00;Vla`y-fiJUET6PF7AhJ^yM$LgFq3c9{tK0(Z2yU9W zkqHjeJfT6^`aT{heXqa%Wc?>1Ju)a>%xc>3HXH#QFz1pwHE0*;#+tD+W4YI}Z@@+) z(e%i0>!mPjx@6;4qa~pIz@mm;deR{8PB~~QL@jGs)Qw5|X00VpE}2BQ?dsD(Q%A$#mSi+|dC^di=t{5h2|=^lj&*LASA0+U#?OxEDlT zo?wQs%s1`z?oo^(c73RqeSms7Ld#BJ)$jMrLm5*kopGA1w_E+3KhuhU{A3yOlQ#`b zOk^801HxK6|KjRts>?$&g|MrmZJ9Y`n&lG0ka|hJ^>+ayg9K;W3MTdO!ts?fd>uf3 zes_NiE>?0%aj~gl?kYt(NRTmuTe8WANbG%D0UnQ?2`&36dCK>(Mhp_GP=y2M_(L`C zn$}H6#9;<^JLvxszerJKhSPp%7Qzt=EX4P|ph6?jUZQTf+;=E=b;1K_#?)^&IyI#0 zJs;AV*BaUD>V{Wia<&ymPpG~ArtaIl73bC1ct&GMuaq|(4bIVzCDvLnB z{8F<1az#Ar7ccT_+L+YmMFJ(C;@tR_C4!fjFp@2OyWWQ$%0&;&v~z*h<<})(A1eyi zlc$`LvZKTtYbhrSs96AS^l%eEeRFNST~3NxdhQ^F)eNVPJkKffMNePK^2!cyHNHy* zV#)Y3tu;~Cd-e7GgHuCxS_a59sG-4UVu|SYEut~wpJuJ;%Ds-p_%t%kG%S39GX3TZ znd!M}PX4N!8;o1=$bo-wRO-D`v1~E*ieut{D~!a72Iy>LB^(r;c>(2uted{(cNU-i zV=rcv8NTz->q4XHv_Y)V-<-o$?a8VT*?bull9Kfd@Lxa=;)z~DzQxTtBDXq|<)>GB z%OP0Q9>}X|J8)zUTAsYEpz$Y#$PXok5EpN=)R!#{UwUi{sfbtZ>5T;Luj(z_WQNOkl&CKW1rez}RTW8g+5$ zPHyw%W;KW?J@tmj(j1huE3W;#R9gl?n_dpR_|kR_h}YONvc_vK zr?4lfTV7({ezQrE{%7T=a691wDsYk>y}k7i*1ba9dt>-*m6*X8Wm+0R@eqR!ELtzg zU8skpU65bckCpLQT0>;2z~HO?=~qw%CRlyVF_lINrW~K9jq?JN+)5Y^s{mf!@gw1Q zlEx@>QLhzB=;4HMZjo*l)Z|7ZQeir@TH{uLCklfyo%vrsN;8933p@M^bdqXY0dNL^ zpysL6;$7VYxi@>Xg%xr&iS@6t(KE0SgqOHqvi^9be?q4lC|69b_Qp#Ey7a?Vw>)RY z2E$stzEP|aw>_xDHda^%uS{fMDA1jIzDQn3UWjUm@d+bcYEJaCf?WJeXt|LfRQ2u+8Jg%e zPX_d)%JizLz~xI#oGb2an&XV?!{22&tCvw!jL-2FdMs*IHMx&5by%9S6PTTmdX^qb z9%yCyPcOQ$JSWM^r@SX`xt3c0NSrM^3rlR-pnaPErw6l3Kp~&!A6JoagE3OPRM1dI z33^I?W#9c)>X)$YQGew7lp1(EbWn~?+i3$I_JsL1n{WeaC4DIkeFaksdXzQn5$kc( zn)cXWVaxTd$oZ&yDE^Z;jk)0ojl;O;9z3Vw%`m}{L8mLG@5?sw=GY@J_DF&rdSb)Be~D^ycI%bMfU*+uDrsCp~#)!NZG zQdK3GZRkQU9NBHZLYap8$`CV*ozT<#OGVL~)i^xBj6jfCw%cjyU<4ka$WCdb0(=-8 z!7*C=xa0d}5gc_(Nk2*L^6%CU{umaI2M??>R|m>-I=9?S-g)}a6|ZvvXIiHq@vnhu zVUAzCkl_~*1bA~cZe+;LD=R->Q@qf^p;@ZM+)Pwi=J4#x>k&sLijD!KMrFlIyDxk~n#YnvqEYsP%r4F4!H7)%%PxvwolvpV0)oLvIt~fS z@w=-a)w_5_W2@|L-rTFo(T~=0R#qxSPzV zs{u2erv0d>f0dnQ^1Gn}wUd~(Co4$7^4KtIhw~EF%Je*HWYumW%1OS?PGdgU|9#Kc zT2JTE9z)>aOa%K45{j+kvEtnI_pGGsP*le@PlJF!`xdd!g_6k+ok3SYLVD+fp_YcK zs_OX4?>5DyYnBDL3!hp2jf8`;({Z&AtCy;7Ii-YsO}( zoy7x|M$5yb^5-5Ap&LZ?#dnT5TFMbSlwa;0?lBn~MsFmE;K!u(%6pCw$n8$h=o`UC zPavY^U%C9?!%=uyutkB>TWHoI1S4~o2-vW23*eR5pEdaGK_RM`KBWIXYg^;wxm1~o zQn?=y)W~MyN>D=wABjpSp0v6s4nZNKHG-9Fd8`>*P;WF@ndkOh4VHSCMmz7->`a%T z*fR|L?pM&DoPsbHDruIrs31)+gzf2Mb?*% z!NoSk8)R$s^(g>yE9ur&G>V?0h8Ex1s2$z|u<99wC~9%b>id>w9-gYby3tG2L#MX= zmuLBZ+Hqfb&{M<L=Hn&iH6 zG%XEj$sN?bYHE^{=1QCzYV>%-q5LSl0D?)5zak{;TtH24V1tXa|*gQH8Yz` zk_|jUr>osu+&gPi$3(*qy|ChMO~YS2knilKtBKSM(4$?5P46(V-XH|lqWM=K%oPRRcd0{27?JqH+`Chq--idIoW9&U#|sFZ@&R89M|+69Lwa!ng3 z&9auStuWtyX8FP!Z>JYpj+3{hyv^*F{HUwAqFg~x$u-#uj~VHhEjmmbO(amO5yA7M(P_-@GMsWiCm6QXrh_-*E?Tr ziHjv04Z8Z7wQ;Lh1W}P?)1hJS4g%eC1YlecG~_JTZbtoA8w-H_%KDyfXWQ1L($Z&* zvw&>|>9*CYx7G$o4oM?Hgqq$Jdb0l<^A52^ZoG>i5r8(8Dw4x2oJ;I~&ePM=Z5H*JhIkRm?bVnVqJ~ z`$amkCkj#T35qJH#`U09(H6hqIDp@s5-!px6_^pQ>>`J50y9yKSKIe1A+zTy(sJAG zPVGHM@+f^welX{|yvhiVJmsUMGoX;apcB8u_9y|IZ5+}Ik(mfi z8VOafKftu|7UEN#K=_xQfWl&WqYzic3V{0;RgINa5DWafo}wd@Uw+6mw%4~vufKhI zbD_vW(K0w5K;W}y0E}x@2T$}#H_eEgKj7vN`kA-9Lv}Z~9Wm#VY{+YE^7C+a=^Bt4 zTHt5THU%9F?DHgudEvt$Xu3_X9i7rrYT;ylww@^Ug}=Sg~`m z@d?dxBY+;*xDzs}9!ZQ6r|z*DZ0m8GT8oi-w-{o8Nf9m@iE@Swhto$Xr0&Ic_Xv!< z{d>9BjvH%0-aW;l0sJ~bSXNEC%S_HAI2wcLsUA1$1*tq3tET9<0-#r9Au>}1J1{hF zx+x=~74K>*?{#lz?Ula85MjI?t`PlUz=myVHHdXrUmqyQ4&+d{?B_YUVi~mg__fc}Z^_t6!=3qjv-n=!thj#AUwJo2q|< z7z-MXz3_5sR?`H>z!(3?yzp zq7NMnd)&z%ZV2n#F7Cc(I07^wN19Q|4Yzv^x6}7D2mK*9^KW=MAZ?3RP7r*QRyd>? zwvc(hp2hTj4%qZhhy4T`Z86(p9#4%(~?Bay;hN?+Z z_?VT{1_A=7TvFSQe*Fs_a#|qlo2Of`SENxPd31We1;`i!oqo)@h>5or*cPRS)9XqK ztELIF`B~>C5rA;u<-BN*Z}sjU&mt+i&FC z$BtSmz6tg-n|uE6k=h3Bn#&PB6v<-CMsN`ifsE?n)W#f0$LGehx>!UE)}1I6Qn5^z z0aw2>?wC5=hO|zs>HA&jL9Kv3jzn)pz`@HRB}ZIIEX%>NVLy!ysL+`A%eQ-69Xx_> zNG}J^FlDsL@yu*Zky4pg7$YU7LN0ph%tRHA0IEvaGnUqHu|Lr@+^uX50Qd3!R?%TJ zw^HM{<5#5mignwR12-h2)@$KriZP)1pHd6+=pPRCuARl__5>{?X ztAWernd8{NKR(#Xt$^Ir!9}5$!?EG)S5W1Ns)qBRnu|TbkbrYfFEB*4B@*89!tFRF6(`2?Kl4R+ARw+_o zgOqQhr09^6Mv|d*^%1R6Q$$Er9o38?>|yoB^5rfTq9jI17>3-KCzqLLI6!?2slqfc z>zGivjmGvm(!R?0>Lp6qZeJ}tAPK}}Mm#cYy9G#pqJaS#70KbI!dMPkJ!i(w_KS7~ zX~vQn{bt<74kuPDA5kSTb_f8($n=%d6X78u$cubC+rW|d#hg&RM-Dg zPX7JN_*;W^#Eb2k?+03Zkwy=_n|ep?41D13DX=8yU});TL1S60X1$6nUApX@YM1IP zfO;qyVNW5uT@e|jm3fg#W}NiZi=YVdgoPHWpsL2gJ_I?=cJ)wi`U278QmU^I|IO)9 zHRKvGYjyu5+1bI94f*HVD4ei?_=50$=7H`wYlB{-^3=RA2W~TUW@5E-^rEy7*h$Y`kO8uq(`; z-?;9{8Td`#z70N;U*=Sl>LCFpW&&26qZJtSIe)#* zk+nY%{TCOrGrg_UcckaXkfHDIOuyZ%3A>WFlyqhHrq#UO{Nx`g)|4%OfEjO0eUIO{ z^w%JzYbJJGy`<1oK*8u_d*GSSs-viDP%p&up>1y3duh&tG*d?}4?IJ-CUXWQoyZ^b z-XWnyPzToT2M-o)%YQm}pMMPG3}y_Lm4zRwrBwg!>X#`2#6-3ZWOzwhxwCkvP4pv; z>*m!A8FZ9%mwPx0`NFuPDG>=hlOzJ$;H- za9i5qX1#h?oxN`>&0_B9X7ym8i#@`3+FoGV9h>=@kateNWVd^>>X?89>HUl4!a~@9IoN*+;pE;! zh+cJg)1i%Z8&=Wa5UA1EIzaWEjsfO+@X;uXG3HT#X6ZuQk(^L&lWO7IBuv#2)oG4s zJ~}g~CNq~AcY*Y0L#iR*EI@8HB0Z-AiU?=xo7%q3qWj6M=#*630$prg7cQJz`e~0R zC8XDsvG?vY`AjwXw0$S+TIAdTi$a&B5eSc+|FVP`@2jPzO;20io!C1hv(lJ-aI`+Z zm2siU#?48(N{y?r?Wcn_E`Vr$soKuX7nLPd%>TSUP^K>_@2kN6$}2Dhlx;UF}2 zaranV_z#(-MVX^H^D?bnTJIq}r_XMNQN5c9iLr4WqSMmfp9W$7EgTANFbuwh)5{I6 z`(U+m`jgepNbe(Cy>P1rrVOg$5w+w+o#DLlL}5@S;<$bc?AIck2i;CzTx)E_jw!@B zU}@~R9m%sN@3uckGQy511V~;-6kKVEIa?HR#Cd_qMUJjgl&`E*Q(M_Zm3wj9DdzlX zCB$DnD2P#D2GiK;rN(PTGzzk?`5N38ZdQ!$m9)_eF;3l-EQ)U9LsZ0dI~(1F*~0Lf0HIiC_^Y*0L5p>a1h7`f(bj6_g(F~Wjsn7j0qK9$ArfL+C~i0p%#*HA)r9Urda)) zfKp-XP{p)aplO7J-KZM-HOO(Yn^iMiz9y1YJ~+19^Xp1KLN+fwm}_X#>0xzx~O6O!J6TX9v?ELVBY&MeKO#~>F( zhp|DBR&@2wP~rTuy!>VfLhC&h9F!Rn`w*jE+Aj=84@4ux1NTI%M@|~^Uq#^IatGCZ zQ@(8Hah1RAV#Y$n^LtJOUPfc1v{WbcAcCY)Rwv68GLsmjfCM2yXY{xOla-jDGj`2I z4hKF};Gn}Y(qnPYUOrp?Tnv2#Oh|aYE)@+L&;gvKu)9&w9?M0zA7~`Iz}&~w#Lfs1 zf3?aeIjBf7;9cQ?NTC->$h9%>B(RaB8Zkz6C~A_Y)3!^W$Y>_ZTs;bhDio(3bUn#; z5kqy5`hX6}c$tZ#l0>pu<`Sk%lTfdfo1#N`w3?X`@&{4P5-NF%TsQJR_RWD!44 zm)!SKp1Soh{%^p}lO9i+IC`Hx+7t@{V*+Y>(pX0gdU-f(J$g`6*bJ>5?hRb3t5lR7 ziyUNhx}vXUo=vQ6q>$**+~2X=h3h_f*dLQgP zfK|X)g@loIq6r~@OI=y0(TU6`Bzgn7Q(Y?98q2?e&ZOtHyjr|&h;l8}mmT@FC@8DZ ze4BbX({dpVXGoXU6Lj8>w-Y`Z90lA+P^u{#%*^1u@A|G_!t8&XbUr{X-d-xswd(<4 zOBKSAQc7gD8fJT|sLI#~AVbsC`jsoQX+#`e&7|(JR>*(ccg56#QDy+e#qh8j-U5os{&oD*`@ zE#1NWOc0eceBhP3sJi#OMwEbxGn~0JmT!3C-*|s+o6!yO~X=_%e7 zq=>2@6I)wS9R_J@11mD&{IzncapH4xfGiS)CoqmO@PN-P%rTmk?EdCv@!&P zqzcnc&$kf@Q9SZcXN&;puF&IzL2hTpP3J2)D5ztQ_RVIJPy5{adV*d2FD%lx-~O*H z)`t@SjE^d%{=pYUwR!BAwF-&fQaMZVZaV!^v!u2!Ww{)U3?;}#1)pqMw>nWbMt9}? ze4eFhG|ELdg$~bTUaar{PYMZr`~ZWrWnx*LTAlBsJ$}3W<nzw)iohv=b@x2*lZT&atZe94Var~L zRiA?B=KBZ+shWO?)8(}iQOs~o^w6mA2lo+xK@F9hBY^2pJ92|Dc(TgG2^}Ij?8K`k z6NphfJuJ7X(zLqRItAJ51Gh#E zPkegRgMh1`mz&1Za_!``)jY1d^7xQ63g9To- z>-NP3;p`&Y;b!O14Rmv^jpwxX9g$t_mJv-rIMzk2#S{$?sjT)ISkeuDG zHqby2P1GI~Hdr>QNy|6E&fR3yV0Hy*83{+>2P60spztEy-IxJaC_h&G7}KfD5`C}h znGs$Y8}c!dK5f?qkLyn+AF+aMmPntr&ZY4@!{8L0-cWo*klOB%CSzYuE&lfArwxe& zc$oh`z&U~z5%G)8%a{~ZAYd0rX*8F~+?4_6Z8S|rnvfcV4&e$T-vaoQ#W$;8bWS6` zafBVRM`90U6(Y0`T}1Yn$MF#!m3m3VqbUV8O7yuNBy_uLc|_*H=`9p1;VR(eg)>49 zH-3sjeAsXvqFO7a!X6~VFw*PmnSS5Q z$uAt-8@E|A8@$@+V{o!|@4pzfSvy@RQ=eb^InA=2Vem<du`Q@<$+%so=~nIx8whr6kJ6#Wbh~+> zVQ}%xD}c8RmyxTrYtOTBE0wk0m3#g@w$qBV1NFG;ZF32_Z> zp0IxH<+nbBetWUWp@+#gY|1)llR<#?k(lNS{sM0|JeKVy-?~!1!qt1kM>z2Mu&1lg zBxbK^s}TB%kiEj}cg76)e)PA<9|RI~Q1%ajb{>C*gc7pDjbwL^SuLOBJ0XKdWyfhA zWR;*Pi&Cmmzvw@S&W17lHRM_&5i#4)wUCF;uA$L{9ru|CldnGUlAK@sTvjsQSA(X&4I0&8)HJ_vB5j;mM}adiO0RS1QFjE?OsMUmx)SFjCLxqExE_(+{(~bP+&^X!1r!s?Da709U%Dcd z*%QZ+K2$53YNQ6K9Cr>+0cK=GEj6%{WFKo~;0&h3GF;@Ci2L#pRttoW*t@{AX(BIG zAI)$oY=H3AZY~s;pZ+L6w7K+sd|}8>wSN8|5Bnx2>Rk$SGp)#xcnVhhiW&UdQsY7o zK|D6OV}T9NC=9vEzXXciCEh8cLxrp`4geRms#h5#y)4EVg^A=iV~Z0XzqEnh_sIrfhoJv<3VqtX zDi3wgBJJ_y<^`lgjOg8Up5b|DpyhbmC4*!750jd9D>R#Gck>Y zA;(-#x4dSjq!V(TIm^^e>;f@q?F_Rs$>jksth=O6yZLRUO~<`1Vo>6fLrfPAZ;qps6Re4cjp8pj_%XaZP(xY=HQf#vLwn?FSXy!OO&C?%DJ%KS zu;WZ_KPs6Z9~F9pL!N)8J817P97nWnpJP4gY7ST*iY3=uZ{Jq~nLe1*zG(_U9E1|r zk!V(L{ql4=22!*&%d{0A(HdRNP8k%)aYSEKUK9ET{K`rMMICPv8SnLdL^m71w;u}* zPm~bXd5xkY zkBsYxq7Eqk`WKrS8008x9{|}Ew5&WSbBPyPpCqHb*KYHVo9hHhByXI2EvkE&0vM6d z{4Nq$Lo~;-?G(Va!3|LO5kgRd^+clqon=P^7Qdzb=HTA3Us*3L7h*_t``)SAP<_A5y^>EO zr|jYWEa18#0n1kP1JU5+$$4_rQ(J|dL2b|9_kYjGr|Y0F?e2_09E+*Bb__ z%#EAP7Wzp3Ph9=`7hop;+fqJZ@YXetrD{Dea@d>$hgbKM5_nP+q5Nq3LG!N167si* zpvmdAG>oA~P9wXv?<6_nc63#dB5j360QRt-7hKn8CwSKkGyq<6k)EHn%eIxd%(QbDdk520(X=mZPW;d#IoUNa>veABPMi!;CTR_AGCrMbcE;-pUpb5R(rTrs0zKT z#A1->XTQxJpH}t~QtOPX}!k@}wq03Scu% z!;0sO?6(Wqi}`0#wnS&EySDb?Nm}sYj~yBc@bV@B zvu>TKr~x<(dN z7Xl~4=57I^mTStpEOumc(mJj?Rk=+nMP>nmYh=J#ErBD136k6rsm=5J<_DW0&y;Wt zqeYl(Q|G{4r9oJSxwo)`X8##e56}H^WgF-81AX%5S2m{pEH#C3?)rT`^hAvjXAPT{ z+?W0u>Dv2fpqXfDzz|`K89wO87vK=U=)zu}xx(D#6oxF8Iz|Vl@OGP=m=dpHd!q;G z#1jXJtGnC)Yk#9a{-1#L^>3GRkjLE=qJxaQ5Y=v8Rg%818X;%yRTyz+)=OGU5}pVv zW-S0IQY3D7@Pev(Z~kZJ!J`4n``!TnHUDf8WqL zSAw2KjWMlSt!NSImJKH@9J*Cp3n&U{MdB$_vpsY*8$gkY7iu`!WvT>_7CM}5hesJM z8HqjUj>VQRO;$7Ktz){17AmJrv;k9Ss6+19zRzC2Jz(nj?!QX_eyI3*XRp78M}52N zAh4!SpKq)X_$_JxJU*8rt_`%fA{iq1uUti|jR}`VXAxE5kOIw?$%W@{G#NHV(QEf( zt!1S@7ING;?tM85k0uugg64NVC8HGE!fXyN=Otm;jdZl`$8+B2IzjYVxf#hoL=J#c zocoAVh$*^%;}pPxfSxg&IiyQFU9uDtI;=uKTTZQxzES@4kPQs#q$S%>HgfCQv+;N5 zdQyyj{XdWYtf_&RcLFwza04p`*mVA2f9~zWqpML~xxD9Z zwh?IyVTYF9AyE(bmkz+hAeHycw+c=EAVfolG8d9^qKIXAWJzVMuva*KJ40K4)RY;8rSA^X2MqQ(EID=UT$AjK^5-n;CG9y=E(V;H zy%^4U8;ma23U6JtiasMozV0`U`j3SRLB>w)dxvNFmhXm@t5i5HIfgi6Yh*0SP1h6I zOc(X4Wtg%Ts}%vxZAfj1K}()vPA{<)Y_t#;3*GZ+@4o_9({-a(*LRF%Z-10^Jv9B_ zJL)G{&Evpmv9zP*ULB7LKf$M$gi&1@6zmU8g#idg*CzyHZ4<$GQiMpE0uYSF7=L*{ zu5f9p6~0AUQv zG%XogO#u)_(rV^T4*tXC09~WLV<0t4W?mG5!^=Ii`8v`Pw#bTN5`DC!HnHOsdguRr zv^Vw^NJ$23?ci2AD;EN3@*1OBsl)|Nvk@S#@-JxVD{b?0l1mxm2m19|ilZiq8pRaUO7R!Zpb z@WVLL&S00feO)teOveo=A!1=XN0sMHdDTpM(Bs2uJQ&loU9%mnR8Zik?xaZWF>^5> zt%5^G-LuY??NGMqj$@#Q5rn-Q!EkqFSZ_dqts9QYDd^?o*v|NQ%$7q=WZ~Hv2}8G+ zd+tjcqikz;{dWoD|MBzgvi_}ZqO*j+`g#9_&%c8+m%U49fi5U2uUA@;VT|4D>s~}} zOVu9l$^H^yh0g%f5g}QXvbo}KO>z+_K84}HOzxLvD{uhr;1p(SVv2TPOH?h?6A8+Q zf{FUZ9%x)W{lnJPy~_%JcF$@2-i6H5mmc4H zo8b3kuk+`YRGqpdexjS#tNL^7PhI8&v-xN{b+0Xn_1M3y|GO@z!xlqgQ4Fmj*lL4G zIIW^Xd)WrsVun7VfBCWTRI*6xam}cv4f+}Kj*D^BPk*|My*edau#@?*>+6bBK7WH6 z#Ye1Ex}20=vQOLlyRM0<$$F>=af_*Oh zGp~INtpEJ59ecRCi%0CIm3WlR(#vY}Wj$xg4mz=uX#^lWG!VVw>%3?Ue@K5NY9tnh z7=horJX?4YN%gaUJ*Lx7B-T+{Njn#~nLBMmV?n39_UPU;zPH=rvEATxAz8gQA5@>w zXB?=-d*;>!nOU_og^9j@G?@qU!5|fRPpEm?Ah4G=S>*SP<{rz8IYp=$q^NfJ zX|7%hZ19FoYQ#SSY7EVn;LOzUSafaJ^R-1z;!8mX0JeRAHCCQjn@@d!HKIXl_sBVx zhRWYnZ${auyN7p}>=_Z?Avz^9oT=Fgf;68tei@iXfHnbOqqk`$J0&`+o)%c9zGD?I_P$dO z`ZcLvSpfhws^${Lrk*&oK&p&_+{d=n`FZJ$TEVB$Z(L`FJ3|JdE%E+)=-=|X>av;U zv3Rs%D4XnT(xdFuxcS|GlBKCIcuJPyMJ={4?jLp4r&m=7*m-cYwm*^1FpmT@Mj*SJ zt(eMDH_>v4LBP3ti8r?@0#y*QA)(d*Qz<8iJZ;|$5RC9H2&tLA7GY&XyH1cJLR&aX zt)_xix5e7+#Rs?U^sZi0dpeny<5=)AM`y}CCH;b%VS0(!mCnn!U#8FIz9I=bhkvB~ z`Fp?=_YNY_e z(Kb4=WKberL<}_m2*=cGF{LkBJ{INehqtA|rWTUtNuil4(;$m360@KXA7FuHYQo`F zjs>g-Bj*`+oVUpv&41bal>syQ94&3G%R2x()1CTK@)&Po{DZv(=lM{7ES4_I*;dGb zvGkX~f!$^dMaX&GtX0pMUWhBqSR7a+dAC2fa*Xj*&^`za@Us+#^8OMeDe>&nmc zHy%Xv+VFZQPyR^e)5<$^ps!BO>i8C_#_uYDF&Ykui&yb&;p64W zJpAt&MkluGZ_UtWcXu@lhfE$3dv`;SiMl4i*IK_;3G+t`j3=}2{5l%VNLGO=3QZgP zdRzUypjGcscXV^TB+Kak!W&xL)k6I3LUmh;SJ;L{_~E^DD<~^SK}aWO=RMtwoTjQO z^Sbjo^%vu5R@Yze-}kw2^ph;ps%j)~$<4rwj_Dhk8aYf~YB$*{+l&vGQVHpLo_A_t zSUrQi{I*$I()IeHTe|ThUr^Tzf#F_-BCo}7`w^ij1XvKKayj#)U-Tu9sGQSEo(d22 zf0{~3?c9A@-XguV5vPR6o`EUV$rgEWF}rdR)#Upat*!Ld9W}`zrZu!?3HdR3`wDlU zAsIYf9eq2}QqZvXbw4>s;egc@2i*Q&KJEE`b#edAcI{t3Yd^s2#o8<}!{PpT2Z!4# z2=aqeVK}>w+aZE_P?l6;1vWrslh=xaU~Db)@uHmwYtAwa2(?z+Fb7zJZw}<8tfF1O zF>dHugB!S(`n%pAef2yyGu}U!WRRJF zUM_kq#e+zZGQhEOQ*pADpSea6@YcKdn}?s$P7?W|jlk zHS@ar5^=tMk-nW;X9u*-%_!6j5K5W)7<+xxv zWIP#4yKVafhk4YR3(y3rn@O&SGtKDG(L83M6%$e2CLukDPBpYTUw~JY+pU_GX}B<$ zK$j_+_)nj4=((S3_`eJ{Kf`nnb(wRhiKarA!!%Ry9+t>Phx^3(vW1nAjX>7{pjVC8 zTzf8%v#rv~iJHAX!jUolmZRzy_|Q*ctB*B~G46A+-`rop!zzzU@LicN;GbqK7iTE16jJM7W(+Z~W%Yqa# zo&Cl_uEGl4a~HB4x*Ps0vms_;c*9YUJbAfO_itYTVMY`K3%?8-qADq+Yo|vdKYJa|MWUrx;KOUi2*jG`3J3){N6`J0$V#jQK&e0l-1Hso%a# zyl$9{JcK~v{ckc4sGhc5qUJcz((X(tSy1xpgs_(yJ2OGO5<}cFM3kISR!* z?X?{{cM6-$(uZZ1191c%_SZi$9?bjo*Tu{m?^5>HZLaE{Rh0LbYM!WRy0%%_K=07J zM9r`jjHI^-Rrj)%U8>6L3!23{8;qwq@^~E4ix4E@vF&^^w-BZ?u6D5?Rv)b|APJ<& zAq3dF(w4Y@sf-f?u%ODI*c|G1lRdOT%Ty_Qb<4h;HdI&GDtn%NuU z0q!)&(3xB2_O(9q3n_MS^E0_w~RdGCr{Lcm?85Z#j1Fi}kr4=>o}zT4!Ns+|Sk7QQq5J<~>L_Q!@)m-Jv~ z*mTHM4uT>iJjmd%y3Da-Dk~YgY?^aZ8?LBZ%5$&ztCy>8AR%{P=nW*q#W8p4E`Wpt z(rjS&A`5{*P(4x2U9%)=xA=0VU0YSplxslOaXqG}nij`?WtPjaAg;)@CdN-%%zACz zOyljTq@R)B7M+~)^*FtG#ucR*A-~`p_3TF6+J^&wvcm zN8qmNAk8iiIN%pRe4Kd);nn>H@+DNXLra z5r-28z;Z`|uyiiDl+bZUInhDEE5jldfKItxeVI5)n8Op2;ANiVuvPZG4clc9%>PCd zwvW0TP|%Cc>~nCl3$SIIB=aK@A_uD5Kd$6dNBfL*jKl?X?$tSEm(Qh=;9*q;hrn9f zh9l-9I)PNO5+kk;rwk5w7uX`Egi8UAiPs8hvu}&j_t4s&y;(3c&VE-opjwuB;;=7p zm7I{17#_=uDMIDf=o1nTr{>8=95yDn;KJ-EX*wmy*br{0Wb+cmnZ=ZuN{IkyV-uN2r2%XaVndp`RiBKbnE zmEZ`^4V5lz{d~I=FZ8Z9Y^;n37ci6wI(mt26ayf=WC)!Pj0xx+%r8??heL_QuF z_KgvDoX^O#$*;G;ysGN;o^9UP^kRG?x;M-+BRR^U_rpp_$CV)Lho8;W7@p)!)`||Y zrMlisu6Dz{fAf2vc+cfo=>Ys*9*(?>e-*<7EEKKgCg zKigG6Uv4`4da|KQEv`KD8_xysqq77g=#*0I6*)MV%c$oMogA_OY!zcBm4Fi7y$*hn z)63C~)4v*o7ovNCuZEvTAb8g$EdQ*CmA_7^zGc|FKw%Es)w8P!?*LWpPm>)EJGGUH zHY*2KN8a;fA)0|?U0B{~q0yH<-gNrX@Sphk_5zW3r>7&YBLHuNc-?%^b=?0MVW~P_ z|N4B^n`;jN>7bD@?NeI$zXi!J3Jy{tQDb&6Rrwze^}nB(uXWN(g#xZscl7!v8jDI*OGa>_|dPk5|B)% z2$+?CBL&9*QPbtFJ7`A*coIE@s%)P_SBu?@r<1KOzZ@!r`Tf5bSr{ZAx3Yvze11Me zil&7*Jle3?Vf*)s#*$UKrFn_Db`yVJ<+<-FFMjg|#F!`mZOHohPgUovD_0ED=wk{A zvsk(fSK(mC(;Yz2ap76Ld08HzSKsRV$ybNJR#%RN{+^Cm9G-T=wMis;+*vlbOsYrg z&mPmXQM_v2Kc~l*fUWA5+{wM(C`ux*wJm#6-(ILS&dYRwc*EH%L@g__9axsdm+>4y za>^}mO%i_P&0XH2(an$r71r`ZnCxSmX}u)n;&b#cQj>vC{0w!t z+>|n!03Em$Zgf7spQT-t*kN z>F;aw!UYSD1@hTAwof8@b zuZS8GE_d>*va7;v_YNr(TMb?ay;B)6=~0BW!Q3?o6Pz;79cTU>lS~x@G06$Lz)_~* zB65w>FM+ZnEd5>l;r^oSV3D{xabN4J!(bCzg`k$WdO6z<(}0(?#T4aw8W=SjBgz_5 z^okr?f$W3Wjk|e8_&2M-w`WJxu`@J@PgIo5RJ~fgazE&s*VJ{Zw)r9^e6f2~HeKHM zm|h=pi2Y`1M9;#eh83FpBP`dyq@uTwMYm(v`S$It%IHbPjGFL9v4>~#Y+}U*8qGj1 z*$7p5_lY(FLBth)l|W{n=*IY6VkqWr2K}KyPrH4VhqVc1`($T!g5fdTkKEN{@SJ{3 zOMJaN5soiM8nMM%d4OgM_xB$HtR6LgTRn{MBi$X&3kGY(cw*Eh2`<%PE?mIdp!JE1 zhAjy5El^T`=)SaXFFm}GL)3keER4}BT)!bU{o~RD1Q4s&YW#*u zhq8y!t?O81;2r+NWDJBxd76Z^p)OZc=hjpEdg%agZ)nt0buW{6E53I$=wwwo)$+v) zqu4p7q>~ew&gZ*+9aC)G`eDnfOz^^~i2mPV=qxS0nWWD=?}m0>a>B`opoy0Qbf?!z z&KxAh4jS=tT-(af^rbKaP|Tb@luJIF39H~}%u;mdtsSJi&Lz6PFV z?O93B)7$n%a5yl?G+9%$LJ}<4zH9m z>U)KDMk09^Prj!B}=Nc2J3rGr;=lD&oIrF+U zzQ8=}Av~-*yrjbBg~fTJ3V09<92t4Wnf+s<>C!Yz9HYOW!)cVSwhFVa0pZSpK)7=a z{F7$OCq=ahQf5!jtDLfQHWzEE4V7zyqkzxiY)00uVCPxLT)l6eFd>rrkr>j@Q&Qo@ z6ZY_gUkxhel0idbnm2;lb|3ppg@uR;ZNdR1ML;Wos*ZC(X`tAB0g))Ogr<`*qLlD_e_p%Xt`zJO1z zx+DNsIX7iw{QsW^X%T*FPz2^d2}g)e=`&^RT!!OC%VT^0#p|3Ysn0x+pbygtDJGUz zTtmf7s3%`M$XR-Fe#J}9BBRJ%C3h&va1UhgwmBdN6B%Kz$;}b+7IInj7HxXl_{VzZHRy0 zScVT&7LX0eLy%v_-#ohdKL@>=0rtCpvjF~Y;~Ayvo03ae>F$R4n(77G^=|F;E2l6N zSI??HDFiJN)YQUbn>D7PKpVOAGgC4TOv!V7$$?@+HyR?m`xWJ-;EIL(%CMS8#F)iv z3x;C@M}v7jcy!`Psw&dDNNwt%2Xo6`nM@azmY9=8@y;H-r^ko4xsYFFs@@GvL5$Ld zN)0!;Wd~+R%j;cd6;1o|TSzo$wU;QT$#T7I?#c_=3hf5}I9>Q<6zM&2IFO zaCp9O;nI;M+E~1bz;S5z--JlnzX_3`ZJK$kW-HJ$O3!tJzp6$yh3tgv@`LDKc`sKo zeIEO9?R`L*K$$=le4g`xt5G{3MQ3xt_4Ug1;waCicvA6@*_>$Yu>=)Kl&4Ef>xnms zVl|TNRMVlz!*Mm8G0hk8#LLe=#n8f%c1BjvL=QZ+RC?rU_<1^}kOE>qvqBYS`>4u# zcZShdp0{8^j!=^1UO@>jo#ywWWLS67%Eymli*;F_80UAM8HAcc$-1iS2R$B&2O=7V zZvLXU_h1{nrx}qa$UOSspJK#6Zl|pfV0O;COxacBO=X8*iOm@yrnQ#a`AL_XVUJ}D zed_`nbWD^`td!LVe(rg)NO$+JuJKrINI>t`@!Ak@^$^P71Nr2=I~(c@+cIx@QjToY;{&hQrd)gOw6qZB7ibXm#muy~-pe`eNz3YcJN7pGoxXHq z^pX60zoaf&J~Ktub|&K4Z|-YRh`RQJ!?;!8MDGtVtuvYL=XQQlBO|X@`h}%jmB%!F zp8FWfa|stI`x39QGz>Y+-5qw?P0AlY0C?I$QetiSYUPhv|Mzb{-YY)2~DVx9d&oyN4s`^WHKf zzpZI5=n6hZBEhYoAV1@IJ~tT_pQ`)Ew$t<8>;pAHqB&u*{^9eC9a^jK_#uy*2NW?m zsmX6m;>z|8h%Aus*!AshR?4I)3iD+_7f-*~D39T9}ao!FiwxV0sAuE=V#29F?` z!!kk;hSSYld^lPA?0}o!$#G^g0xevjegH?hV=k*C$g_8i$;gVA8H%3fPhaKjnVWEO zb>>)~XF5VG&hxO1;G~Cyd^-@-J&NO3fCTS-kvoOEP*Yf<=x3DO0EQl$_XF6tAYOLn zVZE+;aFBQlwQZPv{*R5%jOSuMBOk-!KQknQ9V zQ>mwIMMEjJgL+D@h5gRUVcGhCpkU+DEBUmoS;H_SrP>MP@loG`$ZH=8+@QHJtCFLM z#oI(V^32#yor+?;-oBOCB)l$mA9!mE)rBJ#QXH*81zSe~us4Cj<@R!dpKqgHGE zs!oFmh#TxJr?~pAWPXEoH)>ghR9U<&DPHY|y9A{;Tk4gUe$H=L5IwzQ zXXzss!9&l&pbc*HpB7Q*u(kA`=I1{*rd)XW@Ftx?sn%IB5c)`CuqsVo*u>bG1U-Dw zL%kgf&!B(O-M_ix@vGHB=!FXmBh^TWQo3|Cm@@U~wP^8Q4Xvm3hUt2C4Lfab7!T3D zCUs8&N!^%-Xj|mqkY7P~d6zbVN`8riz+!^nhpw%*z%3S`-rZkl2Tcqs?sUa-&U!9P z9x=IP7#2Lnh1R?Xn%e@Ry;dIw;FK=%(uyz3us&L0OCMuWo%UXydD+N6$W5gak(6W2 zsiNxtPe}JHd{SslMa^j3Nv)z;hXzV8&&AgBL6JP#tDFMrQ*jpO+IcMMp`Ywf&8hYK zSyUsi^D%79#M$fg;}5mS$8$Fp7?i$>z6^7kIo&`~*+BU8nlYwfa&-M#Ho`MPcWs2A zAC|uADK(yWps~+rr6Wc*DlsD}SpJYqJf6%1A0DjMJs10q0 zVSkR>5}4SB%aT4H#LTMCBj^Lgo&zVuwW_W`@a({Zk2FW$B8q8#+t1L1wK1bqdw*(? z33vT_E8aw57%~sY)KFP)fueKc{I8C`m1aJv0yv7n0T}h5f-AuGR>yHto_`ce$AcX0 zjNpWcvI~-spDQl_!Q8-(fHhX1QTG{_Y$RJ6OsRFIq&>OYcyMkOsfz01^cQ9U@B zYwfW1-g&`oAs3ZivVF~4TYLOPIM5DZS;U3=L+is)zM)m#y2KBM~envZu_RcAe#$#$N zmi7C**bZ?mHewom0^7}&9@N4?nSu(Zzqv{(mS9Q*?s#9F;!6otsLJAY z#4ES7@)Wg2zlqsA?oSr>;gL&^TK>920s86>8{LkE8`VyaPH*JNM_%}R{HH4PpZS}~ zcM9_P$4T+W*Ym$zSGA|rJv`GO+y4dubFx?Nav*y@?S4A{eZjI$30!S0;_QHIXz2~! zON`8o7*KFN(MvxF7^W)doPkz}sLt; z6HrM@cKnZM)%fuCP|ru{g~`}4E!(SK!^7i=f8oA{hu;Km3;)1rWAs)g&$u}&NSs-W zBnW}U_J|Nn70?OuDSc1}QQa~DweY=@O8bl6L!VuipT&!N)kyKx=ymY}u`oVbPHU}W z;Uv$beJ?)LtqK<1@_7s|c0;)E9X{4K!lUJ1I8mN$TzShO(C$E4j8RGI_XUUWE)*16ZC%#n9bD!wn`{NTpwh&X0w*U#WZWrb(u zl<39dJRQ4uH6wpK6<^WH@jNnR5Bdl(g!ykw6?%5dirC~n1tFw)UeqOk1qH%$Gu;b} zej?!-#mzf$IaiY+-Z%4Vy99ZNpE7eQke>K(I)?eYW#zWCPiDhc+%dd5TF5s-gFsYh zF8{V&wFp)puNt{s|JQ1iMgxL7`)|pcd4jyS%AXdsEcWUI4AKaEQ^VeAzY;Fc|aMnl5 zqOLU1k}xIbh@`0&=CtGGAJvU4NYE#rbc?Q{f)fG<&!7}Xq7#p2CnZD|kEeJ78G`gQ z==Tze=piI=AVxN!<>gx1h0~qq+d{x$7TEAoihm7j2R)YU^m)5(V>mQBa4t)V{$)%e z`N1LrYk=|7StL0g2rPg^LU3*$y#Uc9d&4YZy$=4m=F_cS#juFfDVr=ZfuNbI%e*^# z$=o5#e$xrV3D|n3SGZJO$XS1h#VSvrQ4dj{4f1Qv0m*MOw zh~%}aX>z4bO?yq@)XLzchoEHY+_WbAE9zB+yZd8!*EK#u=+Ogr7g-PitneY$%6_`@?-FFG=(^l)`Q7yWQTpd1t~zB=P31`VQrnO9J!Ow!FX}Ze6ys29vEto#fQzM4{e>#t~9Pp?NL86 zOrZ`$k!w+7DdCQ``@%f3hNI9|pQD{DQ>;CdrpY<VoH`9bS2h(3HcSsYNkU)+3C+)7R& z2lpRyC2H?nr^^;!jf^C^uzKfvtkl-dLbr-U)qNWCv|L(+d|l#YfdTbWDG`5F)D5>d zfYP7}Jf+rDRoqB|p9WXnIr3N*7X@Zi%FjgXJj#+xy}Ncm@I-rw9z^`G{yPg3J#Bpj z-)~~5AnY5__*_+Ph+1gx%i2Vcm6Zu%2KFYI)(<3leN(Bpu%SId8{88yVyH@A%;on@M$c!Wg+?7oNg;R(LJJ6oz&eQ?jl> zE@Xonypcq@W)foyj@7+sb+5;t@l=(MkKA}!7u>h+!chzpR2IcgdRfmH5RVpMEjoFP zM71jK0v1b_wq@lkwNU$1{VVC-5lOEq%+T8`UvEDkmyoIL(DL{oZNl`U<=w|#1m`~* z(F%=Nj6TD~#gn?!&%ZTE2B0UMpi*O;x}Hg^O!z>2AwpZuW)?tGQ>p`Wihgp5`KfHR zg^XHpi$25^DGyVvuR~p?-jBR&{31jO`0ZUvQ1y+>yBnU>n~>)t_R60ZpOP(g0CySezxt|A7}?1{(Z zJa?GSI%{b~^&D`HwXej4>~wcHN4ZjxOWVI|YZ+EY(ja@$b&L4^kiph5k|-fd;8&%K zyxF>|tVFf8mg75z@gvC@GR_}o>Mn7jji=YUu)5?fM8g!DXR4v#5*xM<3DxLlI7_ zr`b~WKP{Y3k*>rj5u{urcSuKQI7(z>0 z?>Ir7AC*PFlRp)x4=ebxZ;R}w zRDMt}9XPoy#tBsV{?xB8M@ZNV68Q3Y0& zmpaw?UOqzLhPSctiLqdh4xi^4Qp?*-a_t}u)qO!f(qmA$o1geZAF>z?QXKhhLi0i? z^KAkeb zJc)ZsHe}awL>;fbn6lP61<(_uh&NmrCpIBvZ{+58g3;+D80#;A(Z*PxSlB3MIdEd5 zoHbd+Oeck(SPF=k3_phakBAPGCsyo}!98KMxAaLe1e6^A;zLSK4=9oYbla~J4r$u% z%vH=y+3O))0}KdR)w`%kD|ht@V4N$jKIsy?WbX{U z-=7<$YA?D3*adn?P}jsE_aYxe(W8ReD3yg^nmeOmeE@H1>>RQ7w&+~>MR#Of133Ki zc73|Nw5ZA_Vq;B>GZYn9g#qb|Avs}9;w(2H#56QFcffpnc~&Ym^9%~jb&i5W9wzkN z0ZR`nCAnk&lp?E%oZ8rUT$eJecH&%h-=Y!cYUePNlS)Yf#W!NIV6YiCm`kXY;f1C0 z__5xz9HPTd^pb=gq$bnPc?Uf>Gla|fxyX^8yB>MS%G`n~7dN6=YP5>Z?!Gi;Bl=%d z`4Pt`u9a1;vusT&?xFi@!_VJ!-UHf4+PJAKco9F=laiJ5gNJg!#)B#G)2^Y|jPF!` zB%u7DAMPMIUPD8(!w8RJ=y5~m?da}DVQi1 zS<-Vt%!^aFPht}zKKRQAZ^q^mPAl)E+a|(Uzsxa;Fb&pFjdY%NMbtuh%i(<NRMO}ROOsVjzpbLo-ER`g@*;~AgHcY zhE&z17!V$CuF?zA=*{hKZ>i#k>#t-h%EMTOa{{5`?nt5d{)oz|NT~CUK-BxxZw`&{ zNAL2`Mz0(w6OL72Jbugx2?)wc9n~pZ{-GzfQ4mv0e|G1a4I!n?%6ej(vhoR2vo8aM z+7JtYe|KC$Y%0KSzwSuISrWRw5OG)_RFc$l2%oC~XCEou$9GXn#pFkzV0 zYUmBSBUPqioTeWg*ef%Re@WEn*60&I9bD>*m5-kD+Oj9A8O_Rf9s>|4=i`pL9{<=LGqHH5vT3R$X;s^i4 zF>X)x=@>zm4x%RAeGBMEl4j`%J7V2>Pc+;gbTn|iu7WeBMc5_tceLg{vAfn$3lCh) zrY!du&?f$%$NATP7+a`rMEgfXpd3Nl0b6gcybt zk1_5RG8cb$3^9rC-6n8jAx;p7$;&b9{mLf9z#RbW%GToq8Vr(FW}Q730VSTcWjxN@ z>qUFvnF7u9BL?W|rIhOXMoMU}_JJ0*SHfMW2#@{fT_8S5m%!s_rds4kFz(bq+|MSo z^`STejJvUiK~GMg(~C8Yywu|<6Ky8@Ql5HrmsOR0bDL=&pubN%RcyAz zB27C^mF05x48`A2gn`xe${1mZVQEJfSGeseqvY(fS(j$*YJ~MhSt`pu+D884Zu+dy zvI>GT0*;)1GLo2#c1JqZjJ|&Ls9Ynu=Dgi0Ba^6J2vI4)>vIM#YtJwYSxzvZ#aB|e zQ)@MXl|eA6o{UN(Pw6Mz9BV$<3qH*$oJ6X@MR&*U&C9O)6dYIf;{Ry_JMSOlwLWIu z#|T8IJL%6kASKJ-JAHP>Ebe8I&hMp1RvtSaz%?Ng9CLZHs!YE-pPCpD zYDG1B)O=pX4)e=C8awF@DE9bPQK)QY-hqYFFWOtOZ`eSwNX0W#`;AuQo>*U$mO^WX zhwC<=ODYY4EK#OnT^tLha3k-)+vs@-cCjvVs^}2xst)|dl4FH5gl7JJbmmZ2#e6O} z#SE0Ul?KdFn(9+TNp1|E>eFr0oRlC=&VwpyJdbuuNfaaMG;~?*9=U4&VE$co>eZx$ zI>$G-oKA$3qt^5jJ4#-wL-hBzSTTc(`bIZ%{>6UBVcYkfG#3 zza3n`E+(Fd7)0=!+_!xPy56ggc<0*Bp!|>#p7yYhhssd_y_@@SY@`la%fH>&W3UI- z?HV#BGQm6lHTGlvwKJ9ygIm6s$NW(QB9{PKLsCC$wT4Cg7 z%f@)JNElDmr_N$fm<-2tdo)EBkTaKo&@@HFzo4QUG3Kxetun(e7gdT8jD&1MSfu9c zhhLswYw6`o^4}vOXtX)mfX1dY_rT`l8$%*?#slnjl@&x`ay9D0+OKeJ<}lne@eEkz z&5Zkmozel+tSqe}r<5<7v2U&j)F3s3V=L=Zu}ITyWC!OHBB{c}Ig(G<6WIwmWX*+a z4=LeDs{F!Qx6>I!+sOIlQxSiV$BsDa1*2lp{o*N~m`~$hCIUm*hsFpNZ+)8Xx`~b> zii20l!Ke3;9BQXeV9p-S?y|lgZ%#k-c_@;Hw;3jFH#rxH$thX)ITjHefR>_UTEb`@ zNzF*x%1Td}V3?EOjGY{~&EOA+I6L+k>`t z!O@G?ZMR>fw!Rbdg1oh@G|FH@MaUQ}xKMIw`e3$DEi-|SRDSKeJ{coR63!aU^;2sv zlguJFiSOI(iAkJ2kKMMeV8!B(wG7Vb!kfK`36GWnq8^=z*jBx(eQy^<=!hQ<1dliF zDJn8QGWyu(cJVzIU?jor%T%|1yLu`D8lbJ`cp@lF&>%bSMqfx6(g1O9QLHcF;^(-Z z?xb_Bf6j0(%;Jb)dP(5$*vVBQSOEtYDM#h>6vv8qzZhIRaF}Lb0STT#ejpZJORn|j3p={)OF21N(x#Jn7SA`XJv{1= z58EyxuO>oCZ6T&4bh%5e*5*#kp5Y9=zcg~^5NzbuqWE#VP^LYi-*t`JK8d)6g1Yoe zJ`jvZ4T&f46)C^8Zmt>I9THloq+io6A&*N_us`Jv%cYh9Hu5~94MJZa_nob}tUs&Q&9q{98R}>ch zlo_E;J0?v6lELY0Cl+6$_Il}vtv#0>oImz`q>`fZ(2rp2^{ zT)w#Euc-`40S5YSlN4SDUJkAu8v!vg@VW#ohXavu)EDnZt>(QPLl9S$YgEa`wT({9 z9a_DFbWVbe8X4X_wvsv}J}XptC>Tre_yxTnI#AMM;PG9+wqb`G_@(^hson?TQKpwG z!8-{Nab3Prwlyd6Zh`0ba*5rjXyW&1n?XDC2V-hfN7CZ*gILPZ<8R=@DGU={_7hnkx%`}l%Yq2& z*1o-KCE{!z`b$jJSTAJ66oZ!`+CuJzY<&0Q$X=b6IQ2ulTb^~Xi4LWrZro!* z06yRffd=15{7gKVB2#r^sL8wE3W7+|&?XaZWm~5UVp}Htm<3kFn7|6y`>|OId*RVl z19a7*Bt3Nvd5~F~OfT9o928(!MtADRq4A5~++nz#3cJuY^?(dgF~fyW@ujr@&MC*DyuPAH2B+CbA`~$_m8-nhA~q@qrCkgo}V# z1ETLXkd;x7x4YUq6>nR=Sb8EU+3bKIWIW~&L?L|Tlr81>Q(H1mP;6USr^ohj z%T;SGf=0Nu2v(=Wamk{0(=APVK-af}cBU*BpAeX&$dAd2t$f4HVsnsfBN)z)#Z zLOxV2TtL|RqcJaoBZ7AB=e;&~OH$W8j?rjyBahNX_7TMtR{Y%<{j22w@Ic0EM!rj+ z5eTp;d%zUt0?UpO+J3Y?LAt~GklDA7>5|jqaJYViRZs}K-4(SvLCDR#Y&F*i#G(IB zzDnV}G0E3>73#v`+9Y?`Xzo& zU^cOndGOFo89O$(DslCQthf<9T7md|(ugz@n$)L}&wL&cMp<6pViLy&U8CoQ%eh@# zW>(d);rizs*FOi$ERv{4WMf6=ne!>XfKITlb~@j7#}=TV&jVt|{2fdp4~wI*j&Ihv zAH|hb<#iwJ&UMu02gPw4&et0f~VZ1^Ml!XmhzEcUB(~Eb2X}GcQFjT%6Mgg9(H2hh$W}W8;RU zd5z}`i#(Pldjjxd`P}f-dMheE_0YsV__FI7c0!hf)5ACE-TFWKG5+Ytw z>cy}iAFq2JALXoH6h}|)IKuLcHcxC22XW3PMrG&hvP;~D36uwE=?6MzHpK3D?h&K7 zGB&s&%eyCtf&TtqOn6P*e`cAglvIGI-=D;&yR9|?om+L~e42)X@BZ(9z9&Fj%7)1U znh{rlmCRcscQR}&hJemrI}A4D3)3&AG{Xw5A+MsS7en+(99Yy>I0-h}9S-1H^c*fC zi4C-wtR5f~0%hn{SP2hI%fd;%8HbV$Zsj*N4hrJRnKrF5tg%$SpAo z_HQ{|6}0*T^up4v+i}>@w$tJ^Xcwt+L>%8nw*l^kmyo6g&G?5N(P-4^tHTKUS+Rr8KXe!oK#gC=PpFy)fJgt42KH zsm?3ULB9-BUAr72v-@p+TA}us2|RN19L6QhQgPZau+^kQDsqrX3kTyBA}ZP$rt#vw zjkSJCEX~LeZcDwzOpgkH8#P`|SVE+gncy`DjajOH4bv*b9$DdIOW`(Kqr( z5)3;b^&F0B_G>0Y3t5eFW^OYoO^H8o+wXIQt#8rro1b&*R)g{l~l<^1gFgUR!CV$YMq}TM=!*+cm(}mBRat(cJFi zmVUs`xU{=IiLH=u{=!y^gLACuL;bL=wBU=A(r#yvCFfsPI}gKlM%7$Oa^@wR;#TAJ z|I48%>-|ny$2`nZM-a%%eA5g&iKl4VUU@mJS&+2N*i&_RWKx|^&9dZ|9Wur`QQskQ zRshTQ7eOjM93V8#9(JT3W&KzuzKQ!0{M)!t*65Udc7Qf}Q9m2%krJS0x}}mAaX%~P zvil}&C`o7J*j}jqXxkSFBakez6CbKlEHzVvn@LTfnVGiv;V4+=E@Elplf>$2|01-N zm`p!-1%lzTV%$efb}FEL_GTDXAm;m*rMtv$uQlHSo6R+e6^2b4La6L@Ci__zFET6S zDcLoHZkccrB}wRbSiRGz)Se^&E0=^Y?Lb*mxw$!*`3w!svWs|#ubr*KP`9MxrINMp zpSc5iKL%M~axwv;TsqSl&@60O&HZ!P%&XOhqjwP&R&P;aeIoW5U~)8Yt&4-So?P3$ zrx?}iCdIZ!PF~FY)d?|-w#Mw#4}24n;8c^n$BSlL4<<{;@+xcyT=HaM{M@BV2ugN2e^!&^?VnB)H5)2I2pAc2i{Jv&Lq}66wi)KCSL2- z@Yqguat4V4HDI*VXMLT!kv@1WlT?ztrZA~HJ;!2dDSqff7S3)Mm$-^ba&<)hqFnko zaC!Eo_?d{ubby-Uvm_g-6PT5Rb|ytV<>LcoKip|b2vAfEj_wf#;u5H+q=e?U2=jkg z+?Fh+LrWI2ggWcDR+ilfyI(rVpTO_yyVW)>$GM~_OKJAvPt`;uPksQA)G)n$lP`iIc_J^_!TRU`8wEw zAQ*}E$t?Ua2?cr6BQre8aA&VB^LT)_`1V_V3O*7KX|_+a6U}x^*25W48b+#Ox1f zbBWbBCr9GVap====nVc;{Ji=&+p(Ji95tOh*6wV(L)y>gFIOaHe<6AJ-NOEX<#;rP zx6B34CR(a|0amx!Eo!kZ^R?NHfO#Dm^qS~axjCx0krBAkTwVF&R5Rxu&pyVSwJcRv z%9^bAfJ#@}rQc_HXSsIk8M$%zE8-LUx!+*tS!Bfr00YX-y<>l2NwwADsfbgv`3t93 zWZrjjd(sA=7x6b2KHaHhAENn`3eJf3Ym8;xl+(zs?v2n#b`Uf2tQAT_Fp>++4k2?B zu`$USmkg8h-a@QBoDH^rp6K_eoO#^c#6_&>#P2rQB??(vp@(vux5t*mE&mrwTJWWv z7W~Ph2DXliRWxY(!(q*I@llVWnGw7;)XaBwpL!7aaex~@gn_HU>l(3qfXrN?URVF+ zNj&um(-Z$Da1{&D?W4t_WMA_93Iyl3-j4>~jcT zANTooDyOTBDrsn0lM+4|osa0AUJ1N%?ZCGgIEK6acG0df02l2Iz(qU%LM67Br#p*P zjtcL-33-LPKtvLFYeM zpfCQvvp`#n5l=EHWMeG53N=tS1-EG6o=UTIu157s51j@%ekC9c1CAYQkq#CXj4 zCx1qLqK4TXgKSD#?BS(8AA(#BawM2sJ#H2KLFb*bsK$vOOfPRNUidlggxP-q0d4(B zArBzLWyRtuJvmM5V@z~T{rcXMxq*u-lQC+uPaZk0pCTD4q-^UIRv;>;n=O@l{SAYP zunCFoHJ!V9X@J*s%6HA|pg;V}QpI`Vd>-c{!akrIVQk(zcJOXK5WNDN13`WR3H;J88qivc-qW!v- z;*Pzgxvtq4t#JwHx_dmB3cO0c>u=-jb~iOnZ@aza$PmAz)=mwv3eDy_VAj8qokCu= zf7t1#>-M-xz%TE#i`X6h!B5CtrNU*)%O}igeCY{6Hfl3oeDzH>K%1den?)%} zyFciBUq)+VP4~;CLVvYex_o2~C_&~^l*COGuq_HZMan4=^t_lf+4uZUCoJC7QBGMAy4MjM|jdbK}nEDk$zc5*K^1dWc^pdt?|gW{0j2z^fAg!?te$f)N&03yffHqX8G5VzFpM zd@il;yaxZK{=KAZV{6o>$TSnRFPA>n%_)I`QK9ikw>#x+N$TQ*&Rg)ZD}LcQ=zx}9 zn94FiZ6*7;8nkR!F{-?ss|>TUQkb+iL`~a(r!YC zKdKSE0oaY?YUK^j-AOkFj|M@Q8-inACrx~@TGU}MM=yR9|Du2AVaHlG@DIIxShOtp0)RT> z3Txea9-s6xYsjQ*%@|kvy`0W3sjtu&&%G<+#$?;yY}AHk?`p_Rsu;S2!WAW418l*f zQ2xgyP-XA`gUq`BA1Aqi<*Ag(*9tX1`F_)AUt`(EKnAA73UuK90)`Dq+Pn^j_jZ-k z>%c09p$1;67%arsVfg2+#%O?iudl0K<*C99?@9=7-wDm|voNeE^a26_#tP9(gixhV z_l~8Kwvf{HjJ(6%=n zX-q4(Nq62228_33j*l8GVyvBZCYm&!9#}o|@0Scf4ZGjG;;8wVCyDbQCO;m(rt{At z??08FiM7J|@7Q6ywGlZz24Ddy;D_skJ1jH!40blt51#B_Z{=!4Bc#jwz%TGgXG1D< z^{+ec9s+VzL`QCgA(KNlQtkNytHE^EUI3Gp{{5q6)#5*l#t;1(gMIwyj|Sn)|VB@;~`<*nj8C5$`&SIzBSe{JiV_x_RK0>HlFNMjy1g zld^ufiFaWLUx5yge)FAB+DbA~uK?`2vl9NmsMg!dOi#aG$Wgw-fhX>DImN(R*CSiY zk!JD-5e|xAP8f8u_73OrJeD3yJylheqZpNg&NOEC=ow=sSM2VQe)sqZe$edyV(vSm zn%cT{RTLCZMCmOmDj-S`qzD8(2&iQmflne=RGZC5yar<0$c7;nRKeuYeR0PX`VV;K?_gNx>?>buh;gSPDgy?cYz0V0DD zY;F(FlJH+f>Z-&$w|)+mbW?`ioF}q3SKa~rp!nt&X}8L?geWm{!?`{$yGC6mn6wlZ z{n1#r#iXu-H@k<@X2`U8ov;Z={du#trxO+qbMhnmN>Bxy*}8f@DQDK7b~*6T;C`z3*?C1soz`x|JQY5cKv}ytV*53Z`3kEiLpKpSAd_k zXkxxw$0U%`CdC&ksI8f@-PU-CT*nrGXR(rUJ85IFHu@tym2x|GMHco(FKzLGCT_Y_ zrep4^d)^?YHj%r%sRH^j@{5_hxcI{~rUYi|UThtCl4$}qZ0&_i&Jja~x}TPL@4UMf zR8(;F^~^-x#$D|?E~j@F1C!slKURoSACvu%Vqr1+mq4DTC-yy9E!RptWVuXa83$MP zuZ~_v91bLn&}g*#i&3oy+$oFSu&r-9{9LJLW?wrsK1%RXfwsv<$$38M=A}!(N=)M; zNN^;B7}8yNF%G-t(R*d&1@4S}q}+Z6zkZ4h^0<8u3K8(O%WKSS(y^*R247aMZ-&Hz zepDt@rEhs@nyyV=?J-ZL8hb>^7T_%Ah-MYMK0Jj*J!F>+wh{bRD0S_Mn*)t+&`_cB zffr{E*f1HdwF3NDF=4GO<@JiQ6nH`bv+GMs2mT8$k1`fD)ayDhiOEH>FZvDwKNjn= ztM$m4rH)7R?P+@`2?Txt{>$sOK1tVduOw+7j~_M|`RV`L5=-}dPNJZ_Ac+Y`xVekk z;s=?*UT7e9{%l!=o6_y@6}+4GhrzxTJiNd-V8(vJ?@3OD*a|q|03d&lO4y%QRPtB0 z@v1l8@`F9A$B`U?u(^Wm-ixMEP2PKT<0e8#ohVL83)m4)@MQFkQho;|{r0w#M3~K@ z#dyrZ-Gb+PlJRhxiJlIyo0*+Us`|R~X#i~hiv<8kg8e)i+)K<0vAsXUuV0sj(2hx9 z>2=s_L=Uas*(`jEnd8>qYqGZ-?iqfKML?U4_9w+uFpu6OU4|`Sr2>2KJ|Z=|75WNQWf0ty-jm3Jp2iE>cetV z$&O_F%_4Ar! z!)RpUqevR+&Z_fygIGg0$>tc!7S(TL-OVJxj1z!F23HN z)r%45@&&W!x#UXrI{chA{eW>~6D8zGJ8a0`-0O-w-1m8fOH@iljT%`N9;C?UdXazH zZ)hI5ocDD*Fs~-yHNP$HqgC`!$k2&A@m7N-B>DD>q*}j z+D@<^fBcx^1l!mNwzE%c)$iVkx2mcAdbsG5*YHEX67qbcTY5^VMP3)auC%DII88Em zPO1x_PFGsq6mNXN+6pe$Sz3N0`RY#AReiBO7u*Xke1`E}RP`yW;_{yK zyZcD;EkJ&2RApVW{aL}tjQRF@-G$r_t)INoM9n0p{Q6Tw#pwBcEZ#lVwEkAz$6okh zy>6+OoijK}LHz!;tCCBTi;PB^J{H~yaZIyW&-<{T{Rf+oNMue)Nr@Rb8Xi^d=4jB^ zPnCkQt7H;X^31i<a|ICxtr3wupUS5U~ZH z4H<$pwr7`w#PuzH{Jw{I^FUjQY$F^QzKOBPe*C zb=?hy2~OCdK@_A-IKg^e-9{gmIOY5~(ibu@aQMTEQLsP`xmD7ChW=%cV>Zo{BA ze-60!({xATEbtM-T?|RkXM3)Q$PO%d^!=myPfJn)&)Prt_Sbune|jhI?2-?uyD66b zN#O9BXKuN64=OIF?zk13=ye`bZXrbzL~)jIFJ6NgPRVOaz}a-xb>{k_7OvzIPv*f& z2aW0^9MaSgY5Fpt!9jt{MwN3{2JU?q`k3Z2W}gssPZIHx9E)4jORfycDpK5GP3xvb7I=8RKx`_qPAD`#(Q+ZraswX5YrMh`())r>PU6MyH8*y4-+9vB zU(Q@rroL&{U*cu|WR%h6&(r+<$bX$JQj6X=#~|81ic5GTt;?}pTw!I{KGvVlIJ0wj zZ`A1Y(_hVMPD+svKU7r=BB`dJE1hhsaVwB{x{L)GTD5588k31vGS zlHcls9XBl+$&}z0!>G4Yi@LR~yw}551%z-n9oeD6J74NGPaWg?Es^;V%;Z0!+)1Le z{Fz&x(i42{C6Ff3H=F+|kYm<&R8!^akUJ}VsDs<6@o%#uHOpN_g@JgLSDd{Qn;lVm z^0o{cs+8g&R&8e@n1ze*or(pzbl{Y4Z{}hvT~oNQSiib9YRPK>pbQv!E*X;ol%Chd}h#N^V_bsKQb*tb zC4}knhdjmQLjz+W<%iw=sNpZ=Za2)(~BD7yt0#y5iTik%C)A^sEm z%vhWX!ZSES-1OrJ_MEtg$7qOwn3Y{l(UwC%0CzB2)UG6b<=N>puCjB~x7ORiFJsaw zU>12duA2Z{-$=~5*I?TQPS@(&eQq7x1kHC^JD)fh|2R_FTstzIHULf_W`yM2xbAvS z(!Bc1<@9JBs})8hhLgxx>?`&j?m1}B)G ziFa(9**`J1Np(7SfuQ7^R6Zv}XilYjmdgT(N(LVOAU+$oDM}Sh_TO?_NlY|7z);QPAP55KIo=1DD_G zK)^lQ)p^s45~v3F0OqPku!uI{#X<4V&CXo29~!};UUQ;ror@)<5B8HwAF!C^>*=Y7 z2wXYM|9j#21I#<3^E;w6F7B@VT2DW`q2nQb?k|)0PqECld$HdkUzM|3DCu+cK18Ox z{ICG5i(7vMjhlO`&ztju6+FD()NV8$*EKO@$h>v(;H!LqDLu5<2``@2eMK1x`T5S= z#3mOxygN9Y-2cYAR<>F^0J(Q6fG;H~?Vg_p;l-XBmn3Ti$Hxv&qlLiZ*RL zs2OkUu0*3N5`zQZiLXf0fqrlNznvHh_YA_*Z$mv{+mkvaodD3&ZA^euD*}VIKfioq z{c86^X+a4f|K{u)t^zr7F6XTJ-@pc3S6YpbqBbG#QyPfEQ7Z|j(OAad`q+ksWkyBj z?4$h;FZbL*g`^{WO_y7cTF|1m+g?QQoOI!cflWt|2P{poH1EdgUL8O-FA+YL$?!Nxa5xl}#uvmZpl z{<~TH^P8d!*9_uOk$lbE*IoMp{eT;MgWstY<2$>}SD&Qry0^`$THUkh%$AHDK?;I^ zp4?}hf~HVtL;Irh@zGcn@hJZDaW7`qUdKr)dJ(qv?mvuOhYIWjz3A1dsc z4Wo)mzJ-aF_lcwt-xocivf`T(Bi>(ok_(T(GKS(RmzjjpNP}(SN#mvGgWGZI<>;3N zZW~6XVC43e0E7Atdq#!C0NBFVWg0?U!!lr*Owkq9{zQt$X2{Lz8W+;4eY^r#FF zam7I>Y#O^74d?O@xk}T>jAZ>tab}YeFvy0|fSuizoX(LXBwVG}(_Vce4W$(4iSx=? zZE4g&B%23{!t_?}_(xSzPfKHu{1s9l8R-y7QSN=;EWI{I45g&E{}0v=#Pxx&--%f1 zD^)q=dT(W5ptQ37{0eSo>y!|BHLOKv!e)p=P11o~H`b_x92;J7JgK`a4R~Yeuvvxxf%%KN_Cid^aXQ_lnoY78;ReW9}eDQqL zZ^LG3$hBnD{`Q7K*&l(-|A-s^Rw)TCx_n$OaeVF5N}oyXaLp~w%v(;5W1S6XU**)* z(OBHXceQ;FyAe5qEdj`aVclw&5eV(c6dn($VWiWhI3#@L^4$C^UPtWI&fi1{bv!;H z(0K6j)&;K9GAB9e?g4$@qqm~OG-XgO2gG(rT*gi`i%3yWgK}`+ejJ@Lbfe782Qk`2 zBy#N%q)3^HVVKZwBjHtc90$)n1cTVR6h}_}is}E{&(nybkoK)LL`WKeZ}jJ9NG}^J z$G_RTO|GXec1;hW53l#njC?HLi-_mHQJXz~;Kao6x&mnwP@~vc#5eF=@=d|HNTmB$ zS{7t`XmVa%aCDbwli)!VL8j?w&o`VD)qlH-APoA3E%)oQ`*zMN1r0Y9C6F8~T~J*O z#hpO$+fFj;nxRZ&0XaEyTa`;%+{%sw2Z^Jt?}y?hN-lP$ldmz$jKKvkczpqv=B`3x z*c%!O&UavUj@>_AM7Z(yAvAt%dm+Bp-B`ZNNxJ^i21fr>K;&Ot)IwsA-!t(i<%ed4 zfdPrH#3grfm1amQqs?7nTH50lY@vq9q``Q8=FebPOh;%BD0kt2$JAuY5~c_hM<}`* z@gYEv1rmI&tHD|$z$ZVKQ4xF}2#dzPImH+U5A0Fu`O{jlov-7~J$Ovvk)m1=5-8S4 z7B!F2xTFfsu_kJrW#{CyjwvEC16=ZEbDMSQt9QbGvZ{^VlTs!--(hb(qM&9U15d^IKpspiJ(Jl%6nc@K3-J%#%W9|iOd&;SxUriT6 zip%~s%{;y2LGVUo57Nv+VD%Yb$Ytf!LnT`_QV?~;||6S_rKamhSdO|I@ z&OP(MiYG5(Ad)|%9^kSeR|r%EF2d)6KNzcvoi(j&8Ny?2;tyn;E+r6Sp}TPq6R0wf z^Wm`>1#+}$b>>HHxwt*;D3OEa=jA8Yc*4|%?nytmyMOx8c$XXq*#{}MzSTgYDB79I z_jg`Q!p4Io$bJ`rxPOFbv%SVQNqK1w)(qRI3Sa|M;s#f)1?s$9`r9@)dP;l)B8S`^ zb=I!fa(#(JLSTgWARFCZA^hKu0`3^iZCtqDPe5NTP|9E}(5MVpyX7`qO(<#>4n^vj zj@!V%WBsN3&!3lXX}sEnyXy;VkT8O)ouR`T(8vc6*V#OY1DAuj1DbRNF(a?-^2p_n zg^d|UuEe$#28C>m@3RFDUk-`W;u@=O6GEeCc3}4rK3Lu6K&O!tVQYM`sgTx8=Icbp zo68juV%iobeso=ptmgwwG~Vn|zD%ELbmXr9Rz2h>S|3}8g|jL!k7R=k|_Q4GNV5(ykUH*}_(m0rfx@Gt*ysO1xleh~*!S z^nmMwb&fXrT`|MIWxU7f%6b~T1102AAlv+GLa>lw>bAG@cYve5tZUa5$DjhKb&6Ff z`H@i{$(8wi`f43W2La0hLE_F9@sWo(;~O|B9UBvtw&yK?p_q^6#n)n}fPtf4vGPRd z;;>>M=smdO7(rjLrgPD?^<+^6wG(OnQVR+^+< zhz0PN8_G~5$!6}KfzMs8H`aX@uAjL2JF)-ElmiE1d4|i9)cY9o@vaYvIjl@$wem1O zZ^WdWYLby%bjt}fJ_FarT~$Mr_lL!4!L5eWf&8r0uNHPdv{G;MyQuD{FBVBRZ6obg zeJEZFq}yZP>RzdKElz|bW#(MlJR%k&Tn!s2)i4?(4B9qXiefhrl)6Z{Q&6j75zyK| zp|e2*cE7qqe9enmL36-p>~9fBc)WV7jt4kr+|`y>G}*;6UV}^zdF@Ul@Cd&AON9J7 zUMPR=sa&)zB^2$+f4s-c^KaHb0?G9urlqW8fg-+6ksB^!MsBMHCDRatzzc|kr7wUDObaQ3#~sQE=Pkgy z3j-6d2rzb2RY^5Khs(JL3(QnuE3pe}idhbXSmr6-YQOkyNyLKIM zob+O`I<8xSu%Q|ma9RsCer2O`u^f2?-CB8z9z2#+GD~`iOz;dqy9Y3D{m6@?FXAF# zqE3pVT}D~m-AyNrqVbwaS|^-!uf%Z}!)NVCJRmv1PC^NKd4f)H^T7h;m294ZTdw2&j$*_IHl($4IpCUZ1L~`bAmg{=4v~cN zae*9TX@mtiq~s~bM#~I#(>PMk$=Y_?ch#bCW~6K1L5F=piL;RT5gH;9OzofmBL#;q zYw%G@IxN_O3mEm;@egz(+TLAF3sWsMARG&YT#9f3vdSx|U<9T=r=Y>QM6fi$H7yvb zGx-U(6FkSIc=`9DjqSLWeC|zTcn6he?CD*S8TdCj zsguO_@AC0j1x3YV0pFP*Z_<>{FX;TcOT|y~aCkxa@Izi#RJ79TFT>^HeO#>n4zVaO zch8O&K)m*x$4gf#MmY8FF*aP|s~FG*&?#1s4g?XoydQxy=c&U|D&`blSFBnN#qS}; zo5^)fIs|>Nv>Zm4DY`GQ`UYTL-nQwY^KwKt$#=AltuYwgq`=cEii!KlsF_nHLJT(VMWe?flOqiAwv2Rq*it|XG4-0 z`VY9>&hACCj{B9IBr8TEPO04f4vcc!t~z^+gp`YAa#`P>UpyA-6U{0gwo)SH-eZ{ zeBE`WydtRSVJ^8KXr(&W=hg&pdlg<^8eW`c{w$eQB9baIx6gx}82>U|)M+$#ORT0l zopMS=4I>JY!T9m+6>3iQ_-H9b-YkYdVpdN<`L*t4d(M?=boKdyWjPB!hxa|1i&Hm2 z6vdg2yz1KrX883RF}t>6zZUWB48^y-{$^BolL0&%a*;mwN2O91`4)#ke01@P|9JQO zdFCaf6{3Y2MYQTR5`lhbl<~B;Q<<#1{jo0-k5mSm!*_=q%X(xq*q(a}-eH~Tmg>{Y zN%nkLv)RlvsDPvNqNbn|S!x;4LU;RT1~kOAgi^d8@$mC&X~bWD0Pqn`49;P~?emYc z@HHIn7Ug*LDaqb2F23Me+(f^u6Z zvcLpHjCbC}RlXJ34-V1D+z>8WKWA?W?AbSTNs+G)x>>s`0mac*g zp1xFvLdKl#2{)@FANfS6d>a3?0R)kMm^_!&#kCoBA_I!{JEacR~&Z>AM4t)ZP~EhW*e_>ts4GbtzGu9xIt}t0i1w#3UxU z)rd?zYdKxLxjmS6C|we>p!{=Nc@XHk2PS?Rc>O#e3BgFy0q)cucSOt?h1FuS3yB?b zT?LiXiHj66Rv9d*4BdRzax=!JdtcVuzL6dx$Xw9eNSghD>{L?D^51EhfRW@Jp5<*bP-x zCYqThx6pM2Xl1*@$O)ujy49QuM4Tb)+J3g20_fws@E*uW2t*EJ72^xQByrgNx9NQv za*nWzf4j+V2|;s4PLYuGkOKErnz!zU>Vv(BL2moxXaNLy7S=l69KtlXkNbIu8nFl< z*soin52-7ImFR=D9ZFvy7}TdGxkL~T^c#0a9}uG<^Xa;o_`xcZusd~C++S`#j5JrC zsZRfq+Q(to#7UbsWIgn+-|P0lxHr+@x{5^Q9sA)RDFn)?MyB$}qyJmI|RcOz^>VRpiVvd-? z;su7LPs+@OzQyDbup{>8+S>o4C=aTTBKHGS$P#{JDX3C@V2knRYP+ zM(m)xk?~YslA?lKkc$cje9n{9z+;0h;PR#m5POdDLvR@or1{&$0BP_op_VPK)f+&72Tl^0ercrT#7J|9RcT zo;M{JRw`oLUtIk%IF3RM@3Ln+ciCls0FklU>{ytXe$5Y)k6LYhNUAMK0QFFn#`}U{ z0{ROgThklc?G|$#;;h-1mDE?%^w;8 z3a-2Tm%g~17tO~CbD+ayOZ$sD@gAKbS_0#PRq7P{~Ly)E2u%)zCqIkhq_O zPPLN^#)Q55%l8@BS$4cvKZkjjp5D8mAbMmo{PEn++0_Z!4;cp|fB3?#w(d@Wa53;s z2>cvVjjNt->oT}9utPa5RkZbn`S%(Fq83|Wt-UELg|%XwTB)SE#a%Ye`*(w8Uowf^ z=i64@vcmHFXzKVjpZAQOyH(_;B?i;I7wvF3|8r^skq~|_;(6`6a$t}gW6puE*%!M zq636m>qzw*TD7aC8erlo;1RX=q{Jv6M=pl)y`QEIS887)Zn}%6dhIlj>cu&$s}RJS z;BEXzxljRr2mcNYi}#eXX)}lG8;4?`IQ6@)Nvps%Ji*tH$5=po}& z&dxXctM2Z6X!LFt?x{%ea?3Qh(uJf2nMK9rI?WbKO%FvY>J; z*0&(?d3k;OxP~*)f$_RSeg2qDhIpFy+oq^b9ig!@ZXeh;;H7br%>XP!NN9^9zl;Xy zyGpcvQ)d&Os?Z({*)}eRYXdkK(KmnGVYbU-OY8kIbo1=YdCFUnCys;1H>Dg6SlWYi z#0ha?_*Z4`3N7^oxZ%m}qD9XJ4E(y1f9!7+d)%UMu#x~n+SYCNB<+oI@~`VJVu#RCB z^T`jdFJ&NmYXgNl?^ji%9jw|f#}&cs#Mtz{rGL2^1hC0jkytTT!(^zH!@(@z4?YS_ z{3p1f9ML+>y+WP{N*APeWIGxOyG(j(v&gPcB7EVZnN)4myB=Ab;tKhHLhyMUbdwt7 zfUGA~x2L4N@a>5WROXZfJ_VWbl3>=t?`yo@PB9lyhJ~>GK1-mxURhB@Hg6sk>^ue>}ag z{pCgaA7>>;*-WiVy0Vj>{#Z!RGV$G2imzxJshS>U$uo2K`6!>1AOkQ#aY1~0vO2F` z_h`OR4E13^a-2PKp#d_~mW{S0i0h~r3eXF$Ci^@WH1{@_nmW8A6)C$WUcGkyk93BP z6`x^&lIGs{3XYxc{GkJbYj(S-|7EEJVwh1ro0A_oCskkk3@vrvcJ}*RjGv&v)(-BP z?0J1UK-kGLp=}N}a1V^NGVSXMJv!;DeM`tc(^=rc@ZCH}Pp!RNP56|2A7Zbp%mU@0 zH||!uMl5k=^G4C#>kwI;1OmBbVwZRy<|1^m*d~DhI|&y4YUAPo=NUjO{d-c;Ye%Nl0JW+2?Q z*?pmKv6)F+voG*)+l%j~%$Q4A&%m$n8;0V==1bDsu&Ugh$AfA!U-Bg`w5O`fo^a z$2dbiPx;`KIOBaQSh2ZV4P~N>WIVEOgHBZ%I!7Zw4(-IgZ;n}pvTk5`r#D}t`oR11 z$N2m1f4+0ijZq!&gKi5UE7_JiEucdQexFH?kH4zZ+sZ$^#G>@>S>FZn;@_3 zYQ){N3YrsMpEpvtqP3#_JR~HkSQ9m`??!bB9x&#C$YA=7Ca_kZ``Hss8JPo@hccy~ zoX&h33#9>-mcAeeJN@dRH9&OfE;_-Z4h3l>B`hpX@TAE_78$#c-=6Q?-_&S~m7|`N z&bDD5&zHX5p9d%G^3O!xmi)!J#W_=89~7 zXH9uKZ$70qo9f@*Z+l7&4K-bUrvj9}|C zeZUQy7AgBtgBESxD4q#GrnaM>vOPWnCeL_(yUReBi#aR~HowRwU*%yL%Gey)dOnTZ z3VY0DvpI)5!v+$5wHd(!o#Jy+j|O_+K-l`A3fqCQ) zD<|~9o(7iBOOqsQGWW~!Ey(L$02niFZ({jU_fR>6ln0>0&CqQ=5zP|8FJ5MM#lRlj z{M(=3?PZC>MK+FI;@n~z9<5jL2zRzcFbMcsE`(M$F^vRmP8X{%D33(G7G+f1)Km<) zoGN&H5y*E`#HhNy&FWSWpSiF-9@4z{(0>AGe|oycub3l0dqux^-C55Wh=O*un^bOjtS zv3TJIlrwC#GjHqd-S6(CtA*%pk-*`>0y6c~{++Qb?tAB1dv)6P6%DtV9~u$fonG^B z+LwG70SmS?xR=YLvo(O=3pAhBHpLH$ZO1SjRpCW%{z%GQ;XGq%L|kKB#wVbj8;%;u()iSuKYiShN zq)Qq3hWS@f!IEJ6A}xY_;E8w9=BRRZeR&R^UumsLSLtHcRQkKS{jZO87&Q>%V0D}w z71RDJbxVPLN~Fscs|{8pERbaG&}dvx0vX@(Mz24#;xO`4pwzoGE@;w)=0|3YSm*xF zs`61>QPwsiXZ&L6w6=~#Yq>5opW%*rEGUb)nCjK?oNQ0`OFER%3!^s3o)bJ#auYr{ zxL4B~vu?VJses^@LmX3L-k1n9wxoi!QdSM{LZ3i&{HM(zUVCsbFsyzUEpwMuu2&7@oX z(BU5~_soKo2#tR-hrfYXgh> zogrG#mnC`Pktr3{-_`SU|CqoUTE*#9!_s{3$$#s-k=%ERqZS4r1o;vc2?)R!WyY0t zUWFtUHqsSCn%&MhJG@Mcm}6TJx|oC{d4w5gQ^SmyeF@R@_;4YxJ$KP$^Zgif>oqhM zuviEH!*Vwrm%k-TNZ6}>Me=iC5=C1}8}?layJL_DI#Y5%7t`HowI5R;IOQ2As^r#V z;=c@5S?(}hu`y8kX*DtIHCB+Zyr*0~@IH%x{c`(i{-1VJF`MhtA8u&goP;LC>!;uE zP_jWDXOFADP+ED?*Qwwv7q$8ehyl_V3+f>Woz~)~#)M&j);xQ~gMGP`%(+&>ZObgd zCM?`qoEI|3pzwP1K}&dwJlo~RE=Lqn$Vu$u^MbN}SiR<#<}wix22$la0&i+-QF|?+ylKp@Q-1gG% zUdvA)s*Q1aH+B>y*@1LSi_U34j3dLv+%M-5jWE$VpJB}p@Citny_;yp+gUg~EP1s# z;|juT?5p=j6*y+l$khK)>Rm=fgQij13jHJc4H~kfF^jF2^0FW^>hdd>*nCzuZ1+s&rB06RDj~*!z={EhNDfgPxsy_&hOzAW_ zS_}YXS`@ar<0 zVHaKVBFlG)C1Lkv5ICWz2IRKu2Hgqdg(y)aKnKppgr44s~z=MKF4_yOmp< zE=Oq`h&P9$h)kl9?q^vWoM3Z=gyCCcu$;0Fr8qz@eS;2qY zChPvWq5K-=O?`I)CnFCnBP|3Wec~*%a`O*>p!s?tnwp1xxZyuiOO$lr(}J#7FJ}KT zs7fbNb4M@8o=A|bU)JJQ+p_MuQK`wm_w3HJU$c~*uy^wF;V1f8%PTgAW=xp#uW0)l z=)hETp;pr>wEvd=s@`3-!`vP36Rd(Y43U(i76c>2ywj9`0fFq|63s%--# zW<24>n2rTWCs83dGNY#}9BZ9`!y3%iL%h!QEft16yj4*PsNtnQ-Q@j&?&o}{=F{gtmYBkx)1zHxk22nG@c%eu-?GGLcXC12_6 zcZbo4agt$iN;}sY8$T%Bo+;%`TsEp4-DaiV(Zi6k{_P%yH_iRWG^)1a%TaxMYoRs?exLtr*#I2-9m>jc zLhWtFQ>&M&0TkcM`O#_Nd#m$ZdxCsZ1*w6;g z4x@4D*QmBldA1cexX7I;Y1jLN0E?lg3poAi)qtVaSaoBo%zB6`s*O$CJyRkvlm=7` z3OzJxX`_y!KxL+F{x+tO@NY7{O{gre?LpPRzjBN_=faOAj5@c1MVQvg;|prH(kabZkvkXqVk*w$l(V*k zJ`XCFe-E(q%Q~|R4cy){KYWp5yuGY3j!BW+j!uBFy%%U7$~5uE^zNc6*?qhD{xq14 zHlaaa)i)i-nfC@gDiD>Aj?a83ZedYY)QPiSea1E+R=YZIQc)zqP$l!24G8MVUs zbMzktf&Zwq<&ae)j-|WVV2shq=zDzI-J~RI;MilKR<;Qo@k#f`Ub*6oUpk1pSD2oM zG>theG~#2>52Xuf^H~M*tQqnTy0VQi?NNJ|&~5K@_7HwbQ5D$!5i%;k_T4e$)r`!C zS8Gu^`KP)TZ8Vap&C~{>r9N-+_-L1$3qo;L$#6>`6!JNlOxYA>FaexF@tVbc9x(xd zIk|!r_uBXP&XFC_$0T>S0D19El!eau$?n1~Lu95BhwR{^{a{?Un@hIyx>I(FOm0q& zi>Z#v-f{=%LvM~~pz!Uq3#RB5s)Jy~UYv5um37uG_@O(`@@s(oFQ(#4PL7FNl>G!e zS_yPPy>K4FvnMsiA+e1awSL;pc=JfYGm}ak^+j?fdpCJ0bbA(5{`IPVx{|sIjtzO( zF4!4w@X!l&DP7dmPcTK6rml~p|xP+%oTAcn1O zZ#0uzUu`|F^JldRToZY$BRy1LT&eAJH;;3E^iTe~g_v;891v}WVL4X^?$q1l;m&3V zgf6vp!J*BVNZIKRKzy|FIw>lzu;v=_u440Kae&yciE}~4U_+_OVriF{22j0mY%BJ% zPkBE4AYi@PUd+T}XIuwCjPaiIz-EoqE!^T(5t{=5oA@i5BjV% zfEdIAyWm>daaBIDEo*Q?O{+GvH6;y~=sX@j6-5K0JsnPSZ$0o;mWZhN80CM31j+j^ zp42hAz4!CLhkr5uQBiqdU_AES{=oDE@7xea?_%rgG_E;EygFN`x#VaUSVlPt1o6e3 z)Bvhzccrt5j$#O!Olg9sOK0vDyJ)RvySApIXo=-zVlHk7XyuW9!4lu&{645DTQ*o` z4i{TtcMNEgjbo|>sml`*=yNJ0958dFOV?#)?Eo~~X6qt2=b6D)^JjSe22)1zPW?_2 zvTbOxMzV|A!-9BXQxmL;*Ry(YtXItN*(^p@J5N3pu^sw!+;!W;e@!ZMTXsZ~nKt9_ z&}V8;6J36+PoHCC5VtNngbcFd^H?7E?myG?Hbe;?`mT**+Nt7=gJ@va2XF2fD4RCE zIs6emzf6D4Va7Tt0P9#ROO*$$YKtW{4t zdhqb+<%7f&#cMdjio-Nj|C>(hH)v<^w3!*fz|J7sJiSxO&8jgk7j$RZLrydP!PnmgI~#VrTPK8hCrV*`^h%`7kT3mN)l2}?R)DYCfVygfd=0;m z094wW5NC81iq*X!znmE}AeFimQD+k(ujewWs&`T$MDQR$4Vzxl5+ZpEOqbWUJCN;Q zK(KdX3v0g^lmk?BWb1)4#(gsdGpPirK1HdfTPHXcv}Qy8=>FxFy#dW69P56xU;l>u z^8G>{ZQ$Bt$EeZ_r9d+w)tU?>_%>%s0~sUUrY)dji2C0>rooG&fjYOC5?ZuM(R#y) z2#e3F5lB!!6@^-Lbyq+F64-$KvbG)T+Lj>9xiXgsl1Ve&3cG8Q^bi(N%%d@mm1?MT z7Hf6@Hw&XzXXZ0*pvN63aOS;-AD!$*gudM=rQD^3Bm}qT_@Z0{@?fL$BgSER5Rc|u zk?L%Qv2Zjn@i;8>TeE(51At-vfs{Hnevr| z`;Ri-)L1QFV9w9mZhB(fxB0}n{3zqYmU`q9V@XEWqxl|(eFLKjI;d?z{+H$`mfkR_ z+%bseM3~vb6=kuZ)%zbWMlp=rr#&{cUt{Mjdy~D?Pa7&497X>${i`OGBxo{25}|_nNuR?=@8VfU1GCN3J9Mk6f|*kER4N!Nh@t%<*AU_Wb-ioM7>v zc0BvYz)I4Jqa*oNk#;%7VkW)ap2Z*Zvzv2GQDq{ocnko*zJtU$KXIMUK1r;otiQ40Lh1Esi1CTkwXI&SSs7qAGK*$nXZu5VUAOqt zi_Kr?^BPbcnR^BSnJNG*^lV~K z#)g!Xy*{QJ*LdPYn93RX%OFAQI>&LAd)VZPySG~GlOwRrf9#(P2} zOn&wL=aVgN+)xS024(F6C)!|{vj2`33*}SqKvgT_+gYI9!Tk$B2f!LvWhn7CRyYM4q@_FtjrJ;sqPcd2P%e-y4w?Nm3t z6oFcGK$6z3X`;83h8Hh`Bl3j77^Sg5y4L~FG z)u_2sJR1a{(-0iLmZ}Lo2N;kfS%d&%-vN#TO}W^+MLSoK+#dVEBH9;VSovqEKju zqC+4vEM{$W42t(R$K@%5Lwn_@TZ$_05c7mgRCM2F z{B+yWk%>+AeW&nOH}>-gZCgTF<6;xWyY0{)y7PC9QKhPKrYE{^r|~NVF;0M|J>gCZ zmEJ++^o|y$(z@JRp^UE1fvOF&RKF58wZd3?>VRym{}?DU z3$N#2Sj^KVN6@6XK16wzAZ8lvj+Dj(FV4Z%z0x!S4;KSdg#l*0^qEiQ7ucQ)YwI%m z;dyZ%{tP0E$drCW!J6;!mfl$0!MabiLvx8En@&4$``46^BJ&F{1;3A+qxVo$51qQK z1DiWPNLfrv+p-k7PLUK=g9FVW4}U@XgGd1WH~Vt2D9RCE+N8YvK&Mmne4(lwluMEY z+PT`WzfN(GfpRY6q+2~w*dm3GxB^^`)f?EH9_`D8(Q;8i+laPBhg*eoM_a@|r$R0> zTJZ&A-BR7*E2h=$<%D?Cg=)RYAk(N=JWo5&)$sEC8V|8HDi&1VM9(|#JOd92z~BX6 z&vAxS00p!goQbw1IhTKQV*IX76Qvr_+tmplu2`MAKgVD<#oHuaTf9RsGL=JFkiSgJzUlYMSjsS zrNkM*Vdi?4BQreUkM49IuW8c(UU@-S0y{GLw(kR~E+f->u>Ne5qLWH>-F)4upRiKfPj+o3@o`&+)m zEBIw8Wyj1M7k! zrh&wYC$IU0%)j4@DhguOqNx0BD0(e?(YoSM`o%((~KKUF4DW) z^`On`4=g#a2H|Sg-n~AgoycwY$j|#U?UpIO=8XW0Ke`U*YCG0rRuIm1`U(Q}K=Ceto39efxF(XrXszw>oMJ3b^Q)ur~;@RO3vdlTB3Z90L8YCl)d z`YXc|121i&v|IZ8hr<^6FSo!+IawfT+IKm8=$`FbR&K+HfaB7PeO3*-m{W!5S4wTt z1a{!y8?9nDZ;#AB&`bhF|EOKReSc3xl1;xYO5tK;;7o9Zpi?Dk+y^bSh*$gC$5WtWr8oj3O5F-dHx_x-v%#%X}gV{le4?#KIU>2WI``_}JT|oIcRi zx(dT|&*oA|FF~*C*d7U=-MW-ocZg%%`Coi}XIRr+wy%nUO0&^RR8&No2!tL~1QY}W zlw#Z6k2VR=gX#f*Xm^4QZUxAQ7jY=8aPH;_;T26-ghJF78zHaNOt>;>UV zUH1PLiik2XOeDM>l9rrQRY{g!V()QDRf9%5lR9_?i!shR7Es5@U%q5y#a^WdqKb7` z+TukchSE5t%O^tTEn0iLiP|vP*D5iQ=|1UD{gVoWKLUDv`BfTtGcThlD#eKj@rl7G z<$d_t0T5*EQ2A+&=0u2pKEB>r8t72nlmRrLA{_%g3S!clu^(9D1g5_cn6-m4;$h=* zgH;A-k^3+i&q2|H{ZPO>WAL+7MphL$mN9%1CvKHDz``TN!amF=-3&{L1)9wWldm`okUlu2w*>g(dudW0)6M#FQA)8fN)_^)Sf|9OXvO;N*nKvU`Q7 zxhq030@uQD<9)~ibM#&&KvjwPZ$<_v~}w$D1Y%r!_@66 zv?SrZ`hhRiLMGOw)xW{TN-JO#GuL|c-fh>9W^etrxo2X`dm<&(M!s>kN&DSUmJ3sT znEzeK`r;?v_GdBJ2M3T=O`C~GP+O>Xa8q|k%A=iu^~A;(LF+z{{gK%LBn5VhAJs0TMYkZx3z?$A@r$p; zmF|@|VpxBAL#35&Ikd3`h9^NU4#pNaTLh^)O?moEIU0hiZV&s6kHf^PxpV>;sN2Qm z1NCH7dnw0Md8WO<=RkK&ec6NV-8io1yY#Y6p`=?vuP4P-tAr`KXlI1u)kC}`T&}G7 zmaLl$h+IZ+<{Ou2PV;%{4gQ{bBQX2|_*WIjbf7s@ZOs@)l?nD!PcJHYhP&t}AVF?Q zHZUn~BJRN&C&~;4K}@eRrorh#?THqot)a#RBm4tzXQwGY`=Dkvh^$1*L^|^;@QBN` zL~|X5-gKRz#(mBx)E=g^$WBvA=Ta0DC-q!MG`xDX2|JbW0Y!9n#uvQOY!EN@o#CM1 zU2Du8fY=?u(WArh!&#)?a2ZLsiKC6ABA8WfSNG6}m65_ZquEu_WkxHtHH$nQa^-wp zLta7Y1H#h;$erWo`y6tY3Aaa|IxnKN&m<)Es+u=HprlA>QvSW(va&k5_e~X-lFLI? zn(noECTI#9Uv^gi1cdFMU58R%*f2j;2*cdr^4%<=1L4^^sfR1sH$i1C4hx$=H{;aJ z1E~)}VWi}cxgUK-jZ_E8nGE=b+S2e zk^F7gAefVdpRLp3Ojv>65!PU<%pxu{@NHPfmS~w41aSPw$;=B0-xQY)uKUf#7Qp#n zGWHF4y{4@9Lz3&RBNIvnMVXf0sgl|KK=5!EiFd|AGv7RngHQm|iJ|PulUI1hD0PHF|{NmzMFw#wED!oJV@62BchhHhk4;iNLk3#Sq}l#B1{3u@b)`GoFB z$l1^fQsh$irbLD5wHQknarDTzLRuI=~cV`C|xLzymxmJ z;57@#IU#eq*Ws0{rld(Ol=-IVV1CTAiI1PT0qkhZ0eAI=Xod}37f=Qaion>!>zQO& z9u;!Wa!887I-e&N%oWakF;>X^pnl*-Jro>-?pcbH9(uH~i?Meeu+G3isCMG1_xi47 z8=aEk!AV%WEE7Pov5Ky#@@w4nD;I6K3kuuJw&m(|-p|?CM^P)DKqN63U^&aCn$^s! zld0~ECIM#9F<8SG{_s~VO&t|9G5%Q1`{0_Z|L>8Un?oSVeHn5%@Epx-M(T2d?**4) zTU8rLr!&lgF+#Xc;v=4cobkyIoe*G2R(wdI$fGJ!=1h-hX?YZ{v!;myVW4|p`S@T| z=7>;fP(O>>U1bYsW{KJ@QCfW(qZcd@6V#U;0a3btWBCZ~u)cw0&TBqyrl)<^9upG2R}=X|USWL- zOx+(1P-%e8I8O)wbcgHifXZHOy#VAnqy{VQGp6rsj)=JPpG%f z;>T?}_=z=9lBjN{s2&5j8zB(hpaJ@|zBMmg4b>~RXWKUir(u7#cT|B%oG+=8Ysl*v zO_<&EoUpI+t>7SlWKEi>v1N+Jv~|W?H~d!UrmQG~8NHLrARe&V|D6nSPWR9)tOPq| zG;JzY3%>vTP@R!cq>H7# zROxo9r$YUoFX-Prl?`uqnbp$1pHp?W6}#$Y_?LK|ct-c$FeTZNN7K^1>f)b@v^0U> zB+dN~BHqK?6;GV$o!ol}fX^K>o`eHK@;}9-EGcwl+t1JMumm`$d`eghwjj3A`fZrg zLTWpLDCWKwof+8b6gWF99QFuxPa~)*@CC4=d+ER_J4urFPeNJOR4n%l@m^3o`$ws( z(w!&rA0ZDyCxOjI50H7Tnn+}`_@Cmoy})NCE&P?Tez27>MPE+P-7BGE9hLR)y)xji z-ie!*8s^$xKflcb%jEi25KHUcJbat)J-Fs^u}x6S3iEpM6S~>g%n9di<}Lb-1+ddE zQ?;}T8%k1niaUP+Vo7TmqEO`w2nVW92}-Nt`$u$vt^DpAO=uvVuz1vNZw?=RShVus4~OBL9% zO9GA>M)PJF(vzZCs;dT%CZw&#b!KPBBA`W`A8yvJ4 z)0A-}4jqegfn>-7-DDxL%*`&T&}!SD=@g?AJW9LqC~4wSf%V#OEyrSL#uf>ttHkL# zab7LPEl4ys2KY(8GZwzUT$|VR)xd{fn=ehBV$q-T8&J~df}&jhi|0QTXbA8 z=oT-VLTC;2B_)%cmkCCi{7B}#0~25H&+oAus31@%q$<+2ZT>&N!`Pa3k>A7ll!U?ACb+7DZV;PK|d+j zAvza-g9Y&hjd#mTvvHY$K&@vjoaJ1rMV|^o~-txz1 z&|eCD>y52X)5+%gE~8egZbFRu5<5*gzSc5dsS0nqGwJXIerYSQFpwgfjvMG&I-q%o zh8?y)?|ROq{m;7<<;G}JW&i)n5`|^U1v*gV$KvEaog#t3OH%AUk)A86s>)+u4}=ELgo)*^A&gOOY#eqYFLm*~ZQvYrj10H!`_SgaqqUdu*}=Q;i)S|(^fA2hj# zay$?6GUBCEgbksd0i0|Q+v_er(+ESimVaR~W=)>;gZftw!wcXt2eY?6J zGP^(7O|Aa`l{iaV2eTSU9A++Y(pfYG% z#A0pXjlW6f8s6TNDcg@Bo7CUqirXx`n(^IX>vv{cP0M60(q1LiTi40mC5@cOW4T96 zYN+Qh4&9wrWhK{GrgNRC5ai+0j$xK4KQ-b;HmR&0ysMc(2P3%U;;+#M+f(>F-e&pr z>KPI+_W83dl&HgEp~IwyO7+p~`bVOdqIbn|(CopV5s!ps^XE(D zB~NP9b#UemMa0QL7bSvhP^7D37U3EoGHRX_+}<)-VZ{`+=5F8wWi(wx9)l zmgJ2_J-_ZiD-KEVVgMcCEBL(YWR@$+_vO)9*2gXUSHORa0VSxp_mcmjVV4Rm&ov({ z5=j0@yLJnPf1wzNg2mSQPh(QVS*^5l}i ztxUgPy5huAQ@rqfOv!j&d};Y=DzoCG-g~$ei;^9tVYnpo6#L05p@KjqVEUGHcB}AE z?1S#ht74&gNf~GSMHS}@2b*9r+)}8^p{LF=&ns8jQD#CKIs_I9H;PkRswOYiOvY~_ zO<>!m#`i87{haf=yQ&mQ7)(yEOm{*JLMVT!lzi&ljT(7^7Nre)V9|Gv(F-k4O9I4# zzv^avrKRqI^Xq?d+F)X3gFS+#IHV6hars0kng442;5hGxg#vaoE_TCC>#y@XS|L5( zN9>JxIv(}I$fQpL0P@+YO6=1TZAm@lws6RRpdU_pVBnbgO+X5!ggSVU(%_& z^Jzw;-cMetMn<)B@RbA4=)Lph4_T)hkElb+Ygx}LZSZ&3K5$_D+aoR14pdZFY2%fo z#JT{eCbrDex;(0L`uT3O5Pn12>&HoRPuDToQ7%a>StSF6`}mo5dxckmQhl`bvD67{ zmq(}|8Z7v~B?f%a(;eA%kU_0h7xdom5exw(Kv)Do6NoTO4YUw7A`lo5x5L(oCN;L39j7!v z=6q7NshBRwXc_Jvb{$>ojSt1|Sjta+u;~@bzKlU`8{I9Y^a&p4X}K8b~fDDlWYTz$)AIL9NGSbTM;%;dT3 zV`yd1W}I7_q`$S(OJt#K$9Wi!ELIs4dCn-&Z$h!ay)~l179uG>*R<~-z4u^4N>U{BGiJK{`Gz${L-<;b7&;6*p8bM~o?N^=|*smd}%L7f17{$0Lsq zUN$)7d~v79=q4LmPEMIa&SZ}K1y*~0FKP0Zs2VQ*XefeWj>sM_%&}2CQ+(eGbVVGW z)Mo$9P8nGgYR~uL2~=kb+5&f)fPB!ZEl)F59{p~((v>=ls+zP><|?=XV>Na4b&Qed zIrII}C0gC9Zxk1nyBwf_Gyprpw}5NNN>l=3`Jc8~fA6jTO9y|7eKWF?laEN$e`L>* z+wl9b$M{fQ8K2Aka%F(}LrV~y|1Dwx9PjVC867AHUX+B)8-r{vE*Pw$s-ecwfdj3N zMe{uhR3~>rE`P0tcZf>948rlYoDXXe4Y}fbLeyHWk5|iLVN1SR_JJd*>l#a4qYjj` zAU~xU$P>kSQI{9Y5z!@?x;AK(;d`1N=y7c`pajO(e^e;%xOQ1EBSVO;0cUCxeZ^t> zMlMYN2+_VZ65-c2?$_qrNI{-VSA5dY>c+gb=q7_x^4?|<1gX2+pA84b`US|uIyjd! zhl+>eTo_F`ss-4TgN0R9JJK-&6}6m7Ai;8*6K4d$9|1K><@09qgsck^pU;0G*ZvwU zO1pcz@moCWr?kCSqkm&JmF0X`$~deb`3M_h^<8$!286<(>oPi|^U@qZ|2 z4~b_Pq^vp?xOWva@<4BFS+6>5rnss&j4lI8pDz}#fL&v=_$rM3TU}Ai3w{MVy*@eU z4_vuOY#^}OwNXUYtzJQu+2Lm_q9*&-NLOH9SaG=B1kkNkO4g6@;^@z!?))BRUFeZA z;`Vqc;D%@SO|MvoZdDJl&}__re8;_mRCBKE9#qi$etekYs=9+=8|ab{GJ1AfCYPozEX0jfs6gc4w{kktpl%S2mn^DWW2yOG_Xx3kGS348U@Ur5oCp4d0RZGjE;c5nfe?=X8Omjiou zb(6&Zc+b9jyWjEVt3qx6P7zPl0z|)b`v64lZ8ewE*jVhk9_WaPVE-wskLNV4$7FQg zimvh)+~b}e;T9aku1R%?$6#wZ|4K9g4X0CV%J)&2?43YQh(MFpvD*Q=duROalC(wa>6$Qt(ibbar|^vkL?i+R+a{asv4;_&gF7wPh&4D z0mp|mMdipJUwl3}62^t|^hJ|2h0gGt!_IW74sQ!p5@yu;?|{;WgiUHjk*@beSX83Z z4hLzcm*)jdHXO}un2*JN=m{I$cEGi*g7?N_Il+{&ahu>CPBIuc%Ns8p42|kBr12b> zzWsT}Tp_nx8~Fn^KQv+@G%R9w^<`hphBJv`4LS?su={PS+81ks_viDh4V+2b`_6IQ zg>A=sv|H2NdiB<+smUjw1;~=oZLU|(1A!xb%;^cARN`$Po-lbW*CMb~ow;8UUOn;f znl&r_9Hh)TApI#k1v;=CjNb|&`BpE!Xz5bthGoyoCBI8~0zDubz}K4Sqx^ixBwa`S z@>zKKoO+MPliGPRjw)hr#}y9At6UO$Q_{n*DG|#Wn;#1uP{Jj1d!G@i(GMZJpRGW> z=e&T5hy9ElQjS{pzSyx{$#+@0xNlu!oS0%d18%jC%(_4TmR!ZG7H|5gTXlBZzsdUC zv7SV_ICb15^*}1VH!)hp&qk#nOFE2Y9k}BcO!58SQt$s#e0z4@w^&PT;(IRc;KeDs z`Ng=}TP|i-Qa@MusP`q%y6*+>ufVc#ZTa2^etzqvyDb~(tVuiP`-<;+n&d*d{C-e* zNK+^|3R9y(S2!h=Z=>=ebvn9UxaI6n&m2T;#qU8gp2lyx=hFGn0WEXN8bNM@fg2(k zo)2q`74U9}hk``Uej_m`opA+U_<|)2?}Bg@qI#Gi={&^Ad=NRkcJ*Ch#dd$l9QA#e zA1BYuxB_X$aqQv7r2sp&))ZZ2Xth&%u8_5OlA!-wc7H|dNAe8vn{}b`Ez0=t*2fZe zyra!zvL>vzFX5$sj>@xud$dZNZtR99wp+7mcmymroUxr_w*Gy5HL|KyB>|IuV1VyU zSJ_$&ei{KOWBeHSC5h!A>G#8?_aFR4$DRcim|lcX>aac7;JAR-to;O= z+R3&&Q}ATueP_O4BbIAHv-l|+B@?4EE&6;JOA`^ZaqlHjjNO?Ov(yTk&b}k;W1%t? zFAtY59p{B*&nvQz#ap5rZHxPGC4gnO0#Rb%lH_ZpZ*b;w2!tMzI60$nn}ef# z5`4T3kEFIg#96}k16wTlN5%QMW9Sj48CJGe6i9bK63@6!Q!bAS;es_4Cv_aW+N$TL z`xRJr2RzT%{ZW8mHJehh*$@tWvr z`8dNh`i#Z5&TrouTfXfPBD>I5hA@A8%dSk)7ufR`F+lr zh;wC!jXvwB-~T#9>G2+BaF;SF?krA;iF!{_>4_Zle4G7MX4$Hly_xQok6 z$-`;znR+Pgl0Rva6Pp5xJUwF4wPS7ZcEry>A|s zRKQy^)?icL->8=8m%;yQN_0wsCS#Xx4DG)jfH1;hPA%HADfrenYBB=J3L1`T1ZWdx zT*?D&&UwJ{nig0p=Du{fpY?JMZLn!;zwGo*=p#4!LES2k&T{*(QeHR-fxbE{EwK~( zFM-g%Yve+t?uG@+FB?lcc*>F2z7Oxon?G0OH<{&FL%!G;>*7YVX|h?bi{uA3OY#Go z!XLcP7B?H`)IbU@!6Uci%U_Ew6`ZoZ%x%VCUBBtRR|b*mUnuORDugSs|;?(g>{_%?WShJ9sCwdg|Z z2Cau5I%U)3xAQrU+kV#Mv$Fgsmi}>2napAB8xKGZR&E=$WS_%qAE zuA8kH{5u^n7&M|I*|#%dHhA7Lg-?$apR`ppMEO&PI>@Cx6yQ{XqgP8z}1s%%*^Fa|zI$+<9}qyAula(UnrJR|OFRY|WlNt(dLgbhMsA2gn2!(0PtOMsTBfd;KI+uIAB(IN4lkF)TlmVHc|`8x&|4 zWbu)?dlzY_rwy@G2FW(>dLMkl3r_~8Cq|hYa*7_xK!tU4xr>E+&r9!gL>WNWCJl+{ z0Rxm8Js_y`&$$J^XOL-m5!tfZJ9HjY;tHvCz~te*gx%u`ubrF0QrvEXqFMi6h%+8o=@3%U!xDs2}xUd7Cwu_`YSMcp`x5mD?jGCr4+Vm+BRfzg8A6FTOJue_`!lY}nY$XX0!b7Q8EC zRr&h_-z}p`Ew=nhah^&7QgJP4s@5vwLV8)7$cwYh6Q>9F6Jyi*>6i)kVA9$jF?2YxF#lIamJmM+XIZz#ICt(mA=R>Do zoACNm2Zi%&)IVqDlhSyZl%-`|kWCxa@dE>zU-L4TKuW{ovaP*{%3fUpCc}ZN^2YGq zgb*wF0Wwo4iKXH7S&xKYQm@tiDi;seHGxNKgUfNpDN#CVdZ_H#=$yY`!Hvr;pOU%E zZIt9#8n9El6N$ZB)}({nUTJT6+;1E~7&nHtfsUFF^cjJ3ads&StsU#ymZ=&gbVo^{ zW(`%!wBzzu@IYVeZs1k?$w9hnicHYNxdM6%fAgZfnKUL}N5sgC8|O1UBu_g)PwqI9 zRHqVn6D+=lT5fnKdALqKmoAkzD7N+#Jf=wP$CQ>J?RforD-EG-thfRwX*OR~T(;Px zUw&tMh%#V2@SUSB^oTSQ?Wl5C&e7QWH0E-%O=?VTW(d2kn%-E60A9qdN`tHxuj(T3 zaLY3|JtcW5!!6J}868_;^Myn6cKA9=hS_~&nr6>nvzumGN&HOhltLtHX=t?Yc{Toc z;4TtEI$N)rTdxB6ZmXFuOQ!N#9&2drP1zr=P6XLq_)r}?#3}K#x<{_&I)2Rn=i4UZ zKXjZoo6sUQ3`Dl}_bSyyy|&s~`T_bwWf`kxAy+u_9&K^uAcYXRJMfO7AYl$$t5aa#v zh%{9R>f#sMHJht~msXgU(8X;-)<%JIpWeQ@%JZ1<-(S8+-96I#ExI**MzSoiDN;it z&AUE)2chh&DY(rp*b&QQD|X|pkR`o2@yaOrk6g}zdoyO`8ix&56lOP1pVSjP@z0P&PiD&@Do9CtDMl(lg4s2 z4iHT?B69jD}eEo>}2XGL!W4a82AGqlb1pP5y@$_E>G&S5{!wx4M%q7&n>O)QY!NMjF z=av#;RQE5Ne{yIO$^YEbviG}!yf0b&Bz>!EqU^{nDZ~LyON-K0r~r*FB&K}U(F<@I ze?8hD7O6U9wbzq3eN^H>1{}FB>=afIXvapSw3I<2TRz`cgUjMdE#~pIfe(isowp@O zs%E+1*J(Z~NkHZ82ezIa-lh*y z8y>0WdId4*<#^G~34hi(u8Aco1V4ub?HAwM`;=hJCRwIzUPfwc1TBU7jVAH|Xoj`~ zNRYqvZPGiOZEys@<+w9oLR_rack<+S9TX+)YiH@Fi)- zHQ=r zVA#1kRvPpY)<`qonJ8YucBp?pb?dVcD>fA1s94TgVxDL&5-u$=tqW;N`m5USy3&HlOUvM9&N=&H>w~fHGlTLda3Gi1rqZziv1nRXxADdhRLc5z8ecp zK{^y=t48@^)*8#B2K4~1hTdLwPIcgNv#jbcEMq>b6UrB|QS}E~at*T=`>~9SlojHA zCocRDx?gXX})QNb(K?^s6}Aw>9aC@HxH9ADZMghZW{a!UA1NI}_{t!PVsB zmp-(>gXCQ*`@KA)?oj8xp(@(9!o}jQ9i$^&vc)gSanMbd*FT3;6w41 zlIbZ6RPbuB6S`>XCCjH8ev^^ux!Q_9NQ4N{%`?UQliG1T-eFLZW-~eI`N&7RHqChW z1{z(jQh3W$jJR?r2ig=Sx_-Xgh2jmy829qVB#Ge#T#X6oW%E3A3`Z-nwyWZ91@Pd;&n44k4LK{d&RH&#oi!xie7#E|e2GeURB|hHjg2y>D&pyF zKQwWCP-7s`Pz-7>pu?ya4c!nm8$o-be8Gnp?E<-R?Ua@oxssIn+!D}W_BBCJ`fj^^XL7nf-6HG}pCbxU6je5jxKM&2iw ze3JQsSRGfW10+my zncLvj|2PK!_fU{hSc;Ei7amzO&b)dO7iDE}WqUbmh|}E)aO%z2m5JNXVAGq9M z8uC8qUa3E-)N9Ej6`Q6^2ejvTw5g4L@syl0J(|fVC6Clt9!aMVH9mVUG_H}wuztkq z1;((DqWWa*y7|qtg%`&lIpeh645yZ zK2f!N02P_YTq<>Mx~E}kF82M4f|?ij1%r5XCCPmYokADBNt`Q=ykrw*Z1DmXR7M?n zHC|6G&avf4?>9UUOCg?XepeCy$aqo&75nJI(uvMyu>%1H<6&&<+K_nw->;88AC|ln zdOCJix9$&d%WOK~PMe-(I2AxUz!_lkb#$`4DZ$nqM@vfSx4%YZaErzKYe4*GcnsiS z7#)$#cV0;zUiY3~)*%1~qFO8o-CoeEsn1tn=P2-p3lxhB|hinHS%qvj4dr zs)(#3q1e6P&C4QVx8a}UOPV|UBLMFGk|WuY-sgkF^Q52pRknbpL6cdpD~nezy}zX7 zglDs80(ChssrBbYb9+I9(+mm18az^HSa2(F{6BOGP{BSX zP2zlIVh0KgK`$lTl3gC&u$R8W%)!B&@sm07<%Tpj&vA%)`zw|IkeksHwq?i<=PnTb z&PwgfLdT|%q~sf@@o?+F4aGN}>Fl%*c?C%%1|#?adPP3PkUrW8rS9k8nVux;iy z>DaDiE+U#EpA>~hR|y=bVa#x~Hrq&mJ2}zjn0i%64;`*Zix#z0zsHqk^a!79h9CHL$&YvoQ>DiH)geNgx*FV!lt% zbX~oqFfkC*YR7a49A#mz3GV*%*H!$(JLD~OpQj}T0=GM*k?|Aa%lB$%_uz#B+FtxW ze?y5eZ&f}nyZ0nTfk(EX(pFwoO?OA~*q#pc?`D~@49JglXbSj8qV%1S8H(;UUvQ9P zo8f-o_`vQo>L*GOzunml{B$Wd@q7NNZ%0-(xAPEh)7~FWQsoWb(|cz;-nd^KIk=V2 zc1q;d-5XaL>e-%6_v!Z$%N_xURU+;zP^I3sW*ZiG!~HF{G5bFNOWK$B<*ur|qenlV zku)0>ag9~k*oqA4AD*6%TYnE%E^IoFl}Ia!kCk}--uaHe_1!8 z87rWiU}^Z^MU(BI4fu7B)8F~Y0S`kDT~UQrsdV|M5{`6wm?(AI`9Ge~&L8)9W>i^A ztv`izgU=_lm*RaQ_vOedbGenkk-ClQnE9JV@E1EPSprX8z{Zyb6-~5AmP(1uii$fF zgX^#yo|YQ8^-on!D$^+XqCMyYz7l)tPj&!sKzU_g7c4xpgmh!px8_vMc5xxv$jq|L;*>hHd~SMnD+>{4MM8exoq*~ zE>I%zLo47=>=^88H1Tkzm?XvM`@DUJO=1D(Ki}dp+q)SPO`1J{8YJdN=sRgEcLjT>Ze8jal~f)GAypCRmM{HpZ6&#(@iB4f9#0eC%u^-zPa)`hw~$NE6T5jOwkrIP|@` zKR)DFL#s6dlI(=kloU~XjaymG!bHFLbtS=t)inj7|B!-|yWN|ies|6#5-Wq`T*jUO zhwWM2CTfv=Qf_fM5K_LZdr%k$7v8np~w zcgMaH`Is^#sG6$qm?z+1xQz?pZG`BElpWE{MXD>a`DO4r^=eF5@X%nMm5&SB0Bs`R zd(#m;nEqrQYusW z<&f6Sg?zWF4#nCKC#}64zEaT^|CKzCp=&RZub%u>ty`(uTP+Kf(L&7`S=Fv3T(mhX zvNqL?`gy~nls-(!V`tddCqh8-^yhE1BTJHktD|wOI3an1!ip4?heI0OB?&mK*YQEq z?Y_<*qCBgPH&`&$j`DCJSCUF;$>|y+v%6jL&6z<2{tkq_e5p>`A3k@;nmhDnZ6@-v zEE+6omYPlbw)8Tvp2xrlstTAcdrKVoa&he9j|L2nu z4zB2Xv2Nd|~j{ogRNv+jq_dqooS|JjE zeQlN!Iw&`Xp8D$psX>IDqHBz5 zAFq-=r144Z#@UsJq(hv@xpZ+b>T?L2;`gY_QbjL(q9512ENOmdCgEmo_k7Y~6aAiz zn{4qyGkB%>r5F^s8|CGASt(aCC}aApioaaCeC~#e5T0_&>xV`_`_7*ZA@N;Ez++y% zfasEzt^O%KdmLN(wI!4q)8!oss$Kr9JKH@J9)#=|7+ob=rlPn*6#Wkn(3MyW_p(iY zX|DK#EhVOmDV0u+8rXKn~8MW^{d-7!S%TZ zsodx(T%WoUv`b80YKGjcI8f2>x;=t+K^2vT@o;Z=#LRc~ zhJ9t4sz=1UYM;C2=~85A-D2{pKeOL*W*Dr&f5uB(OF7iJ&+kJvq+cAnDWQ=9>@Cby@MQj&9kP60Y!Skv+ z#6JyQQg**Uo?m{}@Bj*tMrLLJ%ZG;X8j9zTS}v7WHsCZunfV`n8$L7s2H-YwnJ+hJ z<$Agz66dQQ2I!FQ2UbK+hf%qO@`gqzbe9o_0p*Cd1Y&6l!A+iw^)`54b@RW5hT9~3}AhDm5h>I&}hDMS9 z`g?PoJS>;+q7ZQpX9GVQ5@a-S0fh|~_fjJ~aC7I^+R@hl7qeUUVI%okclXOaxH>2= zi^r-J(9`s&oog&qQ+Ks7&~bGiYYbCUhx_eeO&%x`^!|aWsOwq$QVVB&=Ek=gdA3~Y z?QHRpu)E9l9jw*|hocYWWCXW4F`3T+wpAU}3yiel+G{Qu$1j&d(IHcF@}F0-=@&Af z^;-sq+D3_QuGK4G`GE$5(l3x%23?s zpH3XR9_!z3jWEICvH|{46bGND;-RRG_V#^<8zBP28Fi#TI;?X;OzOAjS%+si0(ai- zoIxnke!j%jF2?{cIb{Pu*(9QN1Fane=aJTWjSMbFatmv%w1*o6Z0D}}k_^)>(eIP6 zo=eab#k#N~3RlcEzP~d${mX-z|L_9%D-E{jelz`zoX*X*f7WXMog9`M-<{d{{K;ADld_p7vS^7( zmGZ!cl|Bb_lDTxLk@Di6`AYmq3*n3G4yAS4h6TcBtaK0Ok}X|#*&7L{&)Ji>832)r3y<;Bn)cF(Kc0O0=6=_ve>@WgEg6y!bQBPS zNmU{HIU%9UeCmz6aj?Tu5V}1Q)I7u^IS0wmM<9F;^uuz#AwVNSppj}!?Mk@4c|@tG z=sv+R0zu1t`j0;Kt_b6toP9CIZB{W;J&(TG&Rx#92)x$nax1+~T29WGO=13Hh2PfV zcQd;V#;m_ut{kst6)z$@jzSn~&Rs>e zdHPiRhb8{VQY^?|HZ4G(A~PxNTgwTKI+khSgr7#wy_8w$|3Eh2G5cz!6L3agv?U_j z!qOXwtvwRlq0E#a$hQkLm5??WLl7mK63h|a7Y_A8-(Zx~wmcqdzdd{r!!31d*Q83_ z+&I52)5cz&?}UJNZZj?>UvgX$Dn0@e6$0%-em|i_Jy_wR<8CgR{HW#2(A@&_2=u4G0Tt;?fzV8uspl1JfBJ}U*g^3DdZ8N^yT5Zov&~+HS^~|`Tcrlol#ByArdSZV9f#lIc1ZhwY=+N>BHyZL|96L(MQWx7ihwIvmR@e%el!Iy ztg9nWvRxBAO!}Ag|8IEauiKh88gE+$J7rgWG&pm@u#!H6j)zn)JKGp-ROpOH62~(9 zz0e3n;;*qX|ARkU2nrB&w6aqZGdX4xhx-EOevQta;)I9)j6(Sm3NgmYJ2!0&-Z8Cz ztQ2^MtTZj35vQ_N_u~2}^Z3qVTyRwj$vrB+n=rBRCvT$Tc zNpeDaKNsHzl;k02S25sDdF-iA5^HDVqTog$wx*zAB@(- z$6r#0uB*pZznwI$8kbUBfr5)S;;y_pB=$}55L4VgkHI7KBOh$ihhCuyz*WQ$!GNJC z+0Y|6x7P}U-)0QRrnvE#yey7$)ND!O@-;haW9{J0^^M=7>mMJ&N)qzM?U{CQ5plkr zI$8f%%Cl_^mn87@slZ=`yV!V{@#p zX|77@Z;1imDb-LoSY@pAsn+@86S4r4CFl~(oEIZN9;(J8pn)PQnkBP)BYHXhIdGwb7l*G+qS&)+S;c<-<3{;W zDD|vGBCPpC0!^phDI`_o?i1mbHkximr__VL|EKsQgRzBS*Pevrng6-3X%Qz&+iDpJ z3$o)*zp-Oo!^@C|zcY92OH&EMmBhjK9<-*C8qk;s`cH!vf)>SrAZX*%)gfj~E|bcg&CatOL1iH3UY4+SQAv0-{_$2d(GDKe=bu% znaJhBg; z&%I+M0?mL1&`p2u=@!*M19PeJoL=Y%n*JzzK-H|8Bh3X-tPOwJPH8#S?s3b|>B2flP^(JenOVfSMYPrXaesMqY zCKL5{$GOg!Jb}ch-Zr||zWvY0y35b70S-j#7w`HI9hk7uAx}*H4qeW_PGsl-lmqPR z4t757bWLb)$?~hg{`Ic?;dJlEj-ccv_o} zMOk7@LXxeilWmwO5+W)UWuGZaj5T8&Dp{sslorYsie#NEBimSJ2_f0Wj9s$LU@&5A z&+VM=>73v7T-S3w|GKET=l(43_v`&yFiEllPr{|sF;d{ZUPZ#o=K#6^5`2H&i-yRI z)xbOvx|**8na(0-+vV28iF5I?Je<|xq8C)`De5_|PzWT7^K_bGn0pDU+Jnlo%yj75 z$`4;3?K#2xa<=5x#Tk;a{c`!oG|^q$ZWnR^W$XJbp5F(rx?I!0+HI7iWAsS3-#d?_ z#L|EN3Rv64a7bO{hu+ZU?$<+iX>*c9(%|#6Vg>MCbg5)R-W`t)87|_fsyUcj&V}G> zr=Q|2083Bq=`<0ud?WBuhjS>TfHh-~nh@B9?AI`71&9=KXBfZ{g%mlRC*9Na z2*f$oH1!)b6XZ`2f>Cjpt3P)O!I_Xf+;R}7BPuPkP<`-s$aG7kh_2z*6?Y#SDG}YP zse$h{0@ydVCMmBbA=dw%O`sZ5;7EJ)Z zLwGd}sG36f`38gXxz#oQCitI2CCkS0g4P+YI zqdEqs6H65p0;3+Dtf0GjWc5a+A#8H(lQ%!ZY`R9|1}jlxS;RM%b4|a&s9o^stTt<7 zMExrWm!P_*?E0o{@vPs5;R-UNOe3sduNlBKc@hvM$=xs z{O^AJb+O)o6u;~Za(`v^L0+%`-V*QLU2d0^&3zA%jnzYpu! z2W4i*A`dJ)Q?r+@T8_O|bUw#^s{JhL(Vn7I4MS)G;>#6xPL(y};$?_hFsg&!jy#pq z74BR)!=W+tm&tE>9dy5C+U3f`2KrM8HRl;qA_kXB&$%*h-uLg8_2{BCk#!{O zV@>ova^J<-n-!=XL;-UTNR$t6z0RGuMURHWN};CbH7|5c<;9^LuxQA|dB)R8jMLu( zfxk!eC8vfp?+U}hILk>t|9C-kWh(C}X^x>H$X|NmSdfcvsVSac;C=mUjI@8;} zu;~AS|K&&k_CcJK=1ahdu}0eWv+Ou0K0I{Wz%f8+FwOgzHWx@FBHD&>C{_2W&bPTB zLT7A-PNc7XacQm^=lhT*94r`5+XwH6<9|;+I8%zfW6S7?=J6x9F5V;1qX|z?@L?`6BHJh<25Wc8yz|FAp;}%@ z4)o}H+Ea$@b%x&gZ#`N^{2_Sf0$uQ_^Mg_cb|sWWxi)f5yJFWoRK(}fe^fhU~mIGP}o}D1FZi^A3+TIo>*v*q>TfMAOoR$*cd(RrBzHS zjh5vZSYUZik5zjKa%)etp`wQc3oV9@lq$s?;(u!%erG8IUt5N~Qgki;JZjL-qKf3diwfz z#g+p`(j5wSonHwPv)6!BtXp9}1Hy?+U~~kbJ%{#>2#sIRth}xZnZ;UtGE#UCXv0x#9u=@C)oufHe`#Oy>o)p~kFgKy4!ZD55Jn{uH9X z2)t1$TV@2}9H%c4gx@OjNuOjNu<6D5DcQBmZ89ar_9E!2Cz=-^v4~xxDHjRr)CqJbX%0ZBnO?M)sCG3+Kj@=57pcPFV&(z zigNR|9jq_IEyusAi2mSC?tqHzn|tEQzy+@J_7{AzJwE^=?+;nNw6-Eb-}*e|{G6GM z(K8SXtJgLOZ>4DXI~1hOBXW~ZX2^_P5G<$TD<;JulSm)w&lNww81j2d5n5%EMmd^W zPU*Z69UF|vR6`Uq@e)fYDLb!MFNd+_yZnnM+0_&}ekG=?FjYf6L0-r$uQTN~oEPav8GWDE8<^?f>;3}z))%BSm!kw46*Ln@_zgeJ6)Y8sws>ud4}xHzna)qHz;C+<#4NTnPz56R7CHgxrG@QoN5A5^w zj!<*f)gVX0PfogZf+v1!&&sd}qQb~$HXe+>bRr+!vp5GWnu=gH__V;a96fm7<}P{q zKC`#4tZygzr0KEUERWS$;roIs8qsyN-7YChe@64 zYY#&QRGr34`XOZCtIyy!w|%hls@W(nWtX%dXPSVmuusSG0VeCuqfg1&;XvA}Z#LvY zIBz|DYc+kLg|yz1$|Hu&5S!cA0Y(-Qy2dJj4ooKDi$*_vEcE-T1tNRJ42< zOBx;RE(zur6V(zrWCIqm%cB{A{4Xx$6b!(S%-i^@;TxIpVF%>QQzh<{8kxnqgRtrB za!(Z&;&Wsv#!WQ76!3NBS_aIYH{y?C31klpBQoXfWA|!IzqiyqS>C~=1WX7n*M3{x zeIb?bv?tEV0RpR}?_u($z+CFLsB11m#$$3yj0**XR5aPu;iYX8W#prdvG+e0WU>0m zVa)mtH z<%N3ah=AR1+krc5vA1(!KdS-+Sg{Y!@4+>B1vW}mMy?O7#0>#P^uwqnhf{7kw5N-e7ybQ>)w0VCjeYqKcEj4pf5Ew=m@k3VVYi-(@+gI7NrHE;h5vpv`4pIawQEMJcg zB+FI4-GN&s6eqPu439+YUfj<8wex*6Aif>K+R`YqT&!mD-AitLI|r=9rn(kL{=Jnp z|48xqcG)wY=df{?)>^bVUGy?q_q(j}E!X(5TP7f(K@L9P-dGhtouz}|f#0=NW8>fc zPCJzLDK07U)3$}R@^(l^rJbU*72@XmXGeI+q}AkEx_50q+cRKB?-aKcV`AUSw3Inic_*E7CTIPh#=rT%Of#n)C&i>Y`pF*vq6vFuucr^bV<0a+aA>BSDEzX z%(3rD%6oM;m$fuF)|Vb@-yZ7^9~DivP6KZ1#0mJ;s&a64{8$LUU1g?j#m2pLQn9W6 zdy4x%@X|5d*-Jbm`p25dShlrd3hJFs*imXa7C@mto#Y%90tK>BRj(^W zxCe?rsjIv1;djCxCsb~BDG^ZcE1LSMVVd?hqQh;eMh;dsbCYV2SHYn}i=^eDrEE=q z0WOfjvb8ZcC-(N{E*GOcCJDVYv;G4O8UmdvN5^RT+U=W1cIuzXQdOD$Slq^bO>aUt zxsbOn!vO3-ba!#y13Nxe_7SCfR7sb6XipzXrml%R+UAM;5gB3zA~u|t6VA|cOxx{0 zVVs)OzxmkZelfCfw{wDqyq-1r$Ah2pp-V^@`Ns{bbRaLhQu~z5=u@+m?R!-1=7>Ht zteRf12vkVbW3y{RTVX*RIQwgW#d?Kjv`Etjw@8r2(z&hb_m=N10kG50Hv3R0Y-_bW zF|meq2PkcWF0Rf;!~1LKug-nkDTUSeVc77Hoai@d?Hy7OGPE{04&==85(+kco|rmZfmJTVM>xbS;4F0kUm z#Cuo$ROoDOgLrK*G|YQubpdM;nh7oZyM_jO5knKLw(BA)(q5u3Q@|<7@*g*+(l>KM zf1FOA@(hVe+cdsBA5iz{Qs(2ur)1FH%WVfjLA?#%4I)=VfmNuij+rv8dbGburY-1? zP;Vhf`*vlK{`yHqdPx76%y@M8N;EWWMJgt;*7ylW^Gk&m-aC4z@OgRqO(aAn!CKl~ zBwT(x>2&b)XHO6A(z5=(o8AAf)4cBOP`0w5c3$#K`{v4dKtC`_36>fn$8CPLUMY+5 zyhr%6oW9)qb`wdia2EWNfVW`Egs2vljXh>d$n{{)LSMS3zYE`>OoP`H!Obe!1uco-i z!O*}CaRo$2XHQgWrtnAQ68m}Vn7+y{1l~K<=}6cj&BS6w$M*KEu9%%-y)KVb(YG$( zioALQ#l^1kuM_;FP6T8<`R-`6t7!*1WFF1|;@J8Z@?G@uObg${QzDt~v&?Pn<>m8@ z^q|HunCaY{mpL$Q?m)wzRe^!Wp;$@JMY2AW_zv-NKXC)WPl2yD!tW9D5kH&uDyDo@ zP>Hc{a(X==tHRj&9KUWH1jI)=c>3UM?p0l)t1cLYFB#c2M4cCG`i#1maz+!#aNy_kH%_)W1?l>TU> zA+LN;>Bmq^Q=qfS!bxiK0LvN3f*g0KCT|_6iRn%Hcs?@)26Kvzb#kO_Pag zXONA93VL_|=qGPI&;KqFBA~|`E@{g1k!P#?pO(i$kkvewJH9aNRWZ&h*x#;BT=vx{ zA5(`e4Yb!}t0QBsQ?)AI|NmqD<97akF#jd(I%12>vbmz}`Sfhhby#1tq08UQe~1i9 zAehs(H~BB-KekgiRbjdgd&azU%pf^YOQHNfAGla#&x!_$g(YvS5US(G-t zpVvX^d+7dke8VRB#ZOud_hJui8g24{SLzys4vCypIZ7KXeD=NscF!pyO<`Q2jk zt#tT0XW+M!!s&_~^%37qE&I~ZFPF`39IKHe^LM6AZ` zbUToU9cGuhNk4Z^ANT3WwTw2@nDOEDdhq%=;{G|pDhIs9QIpww1bxiAN(-%6?1+*b zSx_b|D36<11YeDQXJLOpPU9ll_@>$HSG+&lSOnFge>6VP)9{mA*WPF$7A%=$p;zgnP#*d$T9uW(T z?ba7uk@q?KTf+H7+6%ioto?|bebCwp)j=N`s8>P%t53+8HYvQa2)s>U-T2WH37w6l z&K9?v)E@S9rUfsncnufit*rAb_)D^c!EULP1nbdH`qE?Do0uh%EuU0zN2cnv8AFgV z)#+#dB;~dWOJ>aWw&tPm68ZPTLGPMUYd3FXF6vriy?DRiW?-2WlTHqMeJ@KACXoOK z-c{{5HCNhRY4y7u$+4I38r<^At+xmvlLJ@IC$n!v!+1_afT&n+ehy5Fvj?*Xu2SEo z#MiF&^2p_Z1U!GN4#1>WrQW=n4m4l&tT+2ccYHN6OD{s-PI+Wy zJ9C<&spfx?89syD;u-4dFv%j@*z#dF0Q&$Fy5in-1th)`uc(qf&iCunuKmWx)@1q8 zbjLIaLq*Nw=+pb!dH3uz=bGQbihUsWZxd;`IcW^l^(xc*JLH|{HFbpoX(bJXk0hRb zzu*xcTmUz3h`bO|Uq7lR(4os0IUveA<5Df0oLSoG0E`jdRf$hoTzL8s&&&{Gf4 zuyD-Bi0IuR-c$-TQ>T3=Vgj%zv8S^UvKi!uy2KN5SaLtzUq8GJ3*mT3q=}LX+J^7j zNfMs??r3ztmJE~2E@~_ITJa*0c6RTLHtA@cv`?o@>*H_l((PYN`^lOWyJ1-s!xAO*AMT3QUtwtW2Ta2G;u@DsB4t>-d_WozW{Al z3G3Op5-LXFQeklPV=MB-UM_beTEU-5#p*!lN82i|I?SWsbl&Kj8D;AE1<^y28ysws zhB+>NS;7c|Q>-;KQ!blvw~<`CLNqovo!?PzsmScb^TluhgX0|@$~L5O5)2M$j)ACs zqoY98T1YxIs;~x@fs!6O!NDp}^}zu59ulR4aYg3P;r{+z{~4Lo?dMx-(mXap@V7(% zXlOWz-I1WAQb%oQP!VX}ZYvY-VKt^zbS$dgyCT0i8(pq`AxijKQfz)S`utAZd`F@V zF~*N0nO>_u`cTW~fYi_o5G*n&Oh|8(gJl`qDVUh zf<@vuk~$3Mr)}vVZ`R?g_sJBJaN}yzV)2tNSco4~AN_LUXZThC&^e@avdjI)qO_}7bq5O)&5oIp+>#<{osQ|i`-X(0al!ZDV8h-48-Aqow3##R` z5z~hTyOkobL@ig-Ky)d^0W&BE4~J0E8;BVM`2u+DKrdctxk&ib!tL1i zo$VEf|A>g{d?n_Y0ot$-*_U9Tv0X27QtUg6c&93V%6NaV)~xWBgx7IxN0x>RN-XAP zj3QQ40LG)h0KLej0qzUSOt$IkM0=q~f-p;3w!RTB#M_1xsz8eUqqqV1vp?GT8`2*| zMh4YcnjLXvS|$Wtu}+F_I!=qgC+a@#6$)34E~R{uqH2VZM{P$Aap|$|&WoFpaaU*r zg!om5%s*82%Aj{%2}~1d0xij()5>vJ{+Q@rM0c>6s2DX!H@278k~Y8%iK5z0rwJbt zAl~?1?%$8cyPSXe_MtEpeoYH4?+4&K0jdv+Be1DwrH#_C2L-Sn%I93uuO(WXT$q}C z{%pPT<$w4{b+yeqNSJlZr^9|H%Si+VENV%a(z>=PiWd+9R13%pM#+iXTXtV>#*3t| zWgS=$`-#g#h#`REMlHjak~cfF(d=V3j7_G-$_*FhCQ44}%42Ns^rRBPsNfw2dqCau zTwB8M0oGZR9LP~R#@~Zis`LBXq`D`UL%aO%^L`9>SUgsekz8|U;`i2IBsCGaHqt;* zv23kaj!~|+7M}@ag9Ud(bvVCFHkT8G+BVvWqfqzu7ne zN(5AR_L3acsN0P3Li)@ums~-aChBPhwBveYtac(`*hLtru(^AQZm4 zr!wEz!W`6&8pA^iO{+s!TO8E3k(x?7J^8?>KOl6U)PLwdH=M*f4A^Wf~BNX#jJq7=GUhq(|vv^EZX%@ z`EGzIeUoWE@56MrAvB3zUMQdKU;La-LZ8I=1BCQ<=UK+5!@SlS9)_zd2^Yr6wT140 z0cch15Z>)Jh>23)W|!`{KFZo5oxc-goJT8c1@=Y44(N)Pm4*B5sg4f70Nb6qvR#O(r_GF7%s8*otCy$AHzck;=*Y~Vv zqiF5KnI{F5+1>2QDCQyY8+O-F(PG@Np8)TKno%gM^GEyJE4@JXU|d?9oarULt5#Pu zN0mHsht=aL1;uetq{%JdSR?+t;Y*hg9#hb+#{=k0?BX`u<=IMI45z>Qx@=L^O(7fS zL#a3A+c!sEorcIhZ~*g9Rz%8-;RNP7d2Tci2eT;Be%d2{#vpm%Px))o2D*FLx=Xku zjqIf3l+S$7j}^ObCimAx!`h*9)tp?qB+`aYw2rUY$pcc#T~z3cmic`mLpf zp8tph4yntr{*W$DF@m`#MaEmg3|;>Z*UT{-Q8#qC9~*hohHimthKq8a5A@HHNY*k|9gDQ$O~`W|18n zkhwUCnPp*W1wF<|n(26)r<47(JP0V|AjV_m`)xy{W9V8(__3-8u6P~`mmwtS(}M)7 zUSO(NfA++M73|7U`z7MoJb1E;fFs&n7eM<=zO-9^QU~ct1RV$c8gyf@J4qIzdZ+u99*6<>b$@n1zhHcNT zZ`0StP0AyTPtNB{{5XtjKY^{hIlYZAwrm4;H{S>((e!40OvMJpV;2tvJ`t!me1d)y zzTzza{lk{v9`y(d86I6;QN$c;+vX9-65ZJhUz*KO$91hG^5^1ny zLTa*3Tf}w_)4<|Ax*f$+<&Uu=CIAXqowbdMveAxD>BZqc8nizzCYdF8+h2|u@a>fB zS&4)AhI|qZ9pw~>MSV1^Ld8Nf%$#E-s2IgYv!dW}ev#B0BNv z!OV+GU0g!kZNcfRqRN;vX#|9nG)2M~iNitaGkY&UU&b5~z2i=d+m-XDbGo?=FjLv7 zbMSCdi<16{cdIX-jVT!F=_~!b~+;0co zDDN+fBV>7B?RF&P>NYMkyK`PKJ#-<#yTpF-e)4W9h{^(dt*?F7Q<0lQ({&!Xsjc#m zG-;@QVrXmgXA1ytTs8*~=*U!|ZH&2Dz<&Or?=~6^xc-uk16VJqPxbj}3r`M3?eT=( zT+qPmn{5bCT{vt$0y?B1YLh)GD;#7@v}v$2_mO#&$%Z(o$RD}!+U&8xX=h;4((bvx z`K78&<@Zj}^cC`KpXQRqw~0$$!JQ4BuY|0J=G|$9m$bWbmfaGN%l#8DqNz$6n&D=b z9y^5uuUQjk9-SAaJs)eg4$SV_hPW4q;cLWk18&cqlz4fXu8YapT3`?~DRMkTN*+5Y z_tFmJ7h9H~vp6h$tiEy4H)$vfK;~z49cN?XLGJ4t1Sq?lSc8()HbMNpHh62H;kK9F zDec04ZwmT=VE&Ie6Qpv$Pdfi7#}aQkY|TgyfMoEQS0%P}q*oS+ncC!U9A$zlF`Tva z7#B#ImI4~p)j{N3nk-$8!G%o&f)av*KjveclTA3I=Y{F$mxSRdzYF3}R$k{#(^$T* zL+7X(NpzQdq6QPlrp(#rp)v``!+t4B)Oa5Z9=eM{F~RpBQ5!n2w}w*eNF87)snz); z9pcycg^Lvro!n0{>21+|n+23@4EX!t`!}{n#LSpsXn?mQEOLP@z8VK;9mqt-?iu3yj2O#(|}45kyh8zcL7{ z`hdMh5_DIBn3@Rzv$hD2CCwJCoK~b2+k5qEG_15r6^zZ_9tzlf}RxuEC1MZ@y{PcS2FJkTA?50S;`L(+Nn_$-3p0%obH`3t7bN!`BfDQR$DV`?LORyWFoK7KnKPxgcEZHvP1LYMwg+kKcbA2DFlD)lZm=5Nm8HAs(OEzxyOC9XPyt?t>X5p%;<^T zNpfNeF}=ne9RQs5_cz%(a`~LsHBAqv)`K?!ulU!cGVxDW91jf5ZT)UY%iILGA752d z)|mGxq3FsdUxR=S=_ZijUZhgNsoswcdvZKzV8*_8K*kh4%1PPpxkb^h4o=A}(L&{; zGY&&dB&qsG8#o`fz9rUP^YqWN@y9AA9N3PC6sMjaM-!{;g1$XVyY?5zD0|>RnzcM8 zCV)4UlNdl+8+b3?+*4o!P2Zkl&Uv;|C5~T2N94c#l8}GX#5UBd&en%=NI;ij{pC>F zD?asjK4N+Z^>o^m`4A>^ut#BLX^jA0BP=ZCz-xd2;UXn(kf@Dx9xxQ>w0o#PZA_%I z9v#gUiBI-<3Ui2_XeEz51`{L4v~{HAJU=Z5g#QfaC`$>R&K=(lH4Xv>iWMi1Q5#V! z#=&0|t8C}v#%BXaA+k#3Hkp%YUfwiqG$8gfT9L{1Ybg`2osS$CI#87}xc);^U6Kam z7?NhI!&Vx>gKH@n3POB;@DNsgt)A$T$VI0eIwh}>?Vrey?dR(!>{wn3=jP`+7 zAtsLhj61iDP(sA{Hq-2IS5~26s=N;vLA&P4O_qAqzk(Sv+O}YZzf)|j!3yq=$Ra@q zhSJ=aMj1kBnGt+RjMFijbW0F5hQ%(@2C1U)s$v^ig?UnrSf{g2Z;n5p?%h|RCRk1x zGu3aDplaYzxAT!XmpT$FD`T#Uvk9JCpT*pzBxhD4h}Kq*7~GZK(Mf}3?xiwc z-x}i$DYaWn;Uv1uhm!k^l(3<#9q*p~f<@~#>*}ss+1b?ssB+hq8*KALf&0_4*xD#0 zsJps6FLwIujAw-5?b!Rsfr{3}vtn?$sMJ4jDHBr2beMZOevXAxtE^D7_L}qT``+M> z8xQY(*6%bJ8=bn7bstOGYaQrfB$O~Q`{egiGMn46kyW5wDlyM0J~dtP{HD6!uSyxf zkRIv@&{%-Ce>%l)l;GW7h%K-os*#cX_Q4^80ioR1i}aW8hHhgj<$z&r&Y z3GMam2N7sulK7Jv^Gq$vax{Hxt!qu%Q#&K>Xx@x{jYvBwToi!m## zKM+=5PypF$umT0o>vI-LX-`T15=m0tbk;8SZk<^fi=SJGO;HOlTdF7gkdO|Z%orH@ z=8G&1Y*T6zAN?qYM~1V@LE|#vH@vc}wgg7*_%AXQ!~E>}v|xJ7{e9;D$VavbF6jWl zg}LrIuJd5%dDVgx%5`C>-pkj%%c^SLrf_*tpe$Xzr?;GkNF9)W?HW_&W#+uk zk|7jaN(nQ*w_n7cT9^Kfae?tv#sOJMm$0%)ZwmxW9l9h9KoVl|EK;1R3?^Tgk`^8J z$Q<{aFRm8fEg5ZIKy}fmx3c=Bi_1N;!AN{#;racGN+yM`0H`=nO+xu zQJ)^lT`Pv>vYUUXMsM$9QQgoTKIc;Rrr~Eo{~{e9k)+2Xx1f^=o&pYJM-IjY@Fd6}#L<2qP^Z(<8@y+%RROkS^gC|Cyd%W`bS6s#(dAxdu!+ zKW_4vZe5u;*jA;u&a8fr+8{1irEScZuiB}rjPiCft1wP%i zgTGgWC29etW$&^OJh}2fjzbAWIE=DIQx-eRa}ujUk|UIyEGrFE2@hreW&&>k#gB*&$`9E z!MlM07STgi>uTQvIJcg!?rLxEt*yQ00F0UR=d%W_3eY<8I;?~20uQ!h7G4Lw`E=!K zDUs_+qt(`xao>yL@Ca#4X(w96_%RT4w4|oSvuG^eERTCfLS}$wMqfmfyAfSapZwM& zDQI#9e=941|AQ*8T#Jc7GPNf2BTDeKTm$hnQ80mLB#p*F2vvvQ#&c}@_UEZzRpGk! z^6M!q3#(CQ^Kers5hV713h%G9vp?fndR zh>WLo?-I~Kp6IygjCC=?WJ-^I?Cun%Fqs{*QWmkQ$I`N%QBSGb$JX5NpEw)-1*5%~ z?jO5U?;em?^R#_Hj~1Kw53aL~{olSnlbQO<9!2MYVH@?n9)S|L*8{|#Owz4a~%GoQO>Zd~33hFhq%{ZOCF_Ska zF^$}szLk%mtN@}((7K4hb#fiboBwS(dTdHSiE%5Red9tXiSZtorBVs!D?uR5LrkrD%eBR63&0vze}~l0zB4nLs6zL2j_G27$VMPT|(5( z-HSOIm&?NCT$)NkFawQg@dJP&z^4DQAj?u9e7I#rF8#3j&VO3BI#}b`^*wRiaWltv zVJ%b09W&vFlb0gG>&|rl^(*-&_`?1?VO3TlxJ~5$^;cnE>JAq%7Z&3ZXF5)r)@xhf*vZt{zhe+##&Zl$C%c?-m%$9J(x3v!Mm?H}*I1Dg8-tMUk^g{ob&9@_PW; z*zhd}_GIqjV+khXLy(CyhH%Aot-&iJp99{|C*AxtzgXV8&5V_v&-Ch~ICLE-e>=FM zN+?P|9Gd-DdQq;m7#<1o84avFJ8~)i z!?sYY1db7FGTED^v2v8gsGC)0up~g-a@C#{<3B!L%3fOiP~x>wb!5>C@uZskA)Y;1 zWCw0=iVwbb5IH#%eJ%$^?EokHe8pN7scSq&Pj`5Ymh07_Mj8>q7{^kBCiFk$RWT1h zPrIzWg7L>l!&0ARP?aIk=e~!}(zBwELM?#XENUkVUXx@%ZSUOky7k{i5)cx(?dd^W z@>k_aX#Kt(yO@(Q({3-57hgDPBZ%@9rpHC32XZf>jB#Pc8>LF!5gGLC!gP&$oSeI* zV@6l5(q?f0r+&k*DvX|M!&o8g%SO#Gr{j8`R)2Lp(a{tvouu>DU!ShTO*;EH*yH77 zo=~nme61Wsx)@5n3`}$+Hoi(F2dhliQ!5-9^bT{ostr0dF*B^|aG2M|`42`6%~QV` zNkEAD8(-CeLUL2$b*&?kr~W;}e_>KJ_aAgu51uafjmv?SZnAEbHu_**m(R=r6VHxb zQxu|9VL4uv`etxKbZxGLi1{kh&_{yd4^3^|`Q~858Uo(paP&0&IG(nNLgH#m6Awb| z5WhdpxPQf~hFy$`F2;S}0dY`Wa`lgig#*JVn~f*Wg#o*w!LS$ff{2dxV2>KZRibzNE%Jhx zJ5=#?Ya%6cx|tfaS8FzxU8I@A?`NX*7{!*i;7qxhtLZ&zp64!3KFrKr+DAV32Wa|j zH!-XOY?D%4y9`D_%xyG}eUq3zT3+^`z6~b=46eKIYCX`2Rm~;Fm zGG*uJgKm2|2{23;33+h}f| zTNw9AoCMaNwcVZ-4;@FO5_95R`t>}f`-SaQ`p?32WJ`G4`Kt!oj?L)xrq%dfptjgd zSC<-`!)1Wj9bjDr1VWc<%SBGPOIN&Xz+;nnGE*x{-4|@&V@mbp;H7h56ji*lxfa%?gf-HmqQ=N! ziX*p3g?3x<-Hrsm9YV&~wzkn7V~%yDl%x(#1jBk+^HDq}Uo^fFR*E$^B_O#rX;;yB z=pQctoR>5QV(#xSZv`H6%5jw{yD&F>D-@70FyMnc{L#3<4%JDQjjZ%T;?U;cUx!Wm z>Eih~?KQLYt3nRM)7nML0VuWCZTBQZo&!(l{-rJ|n7a_mpRa5IEql&Ke6A1u&mNZN zTNCB8pHZ^%^8`dvuTKgWz3p3VQ1Erw*~#z#HXVYn_{}~~z;I}{VZnJ2>>#oaufsvG zTF~N0$i)K}k+i@Aoz%wcLax6ck16wbfWfsn`j_IXG$Izof8J=iTe7|B!8wW08IIpMp490u#ZV<0JU1vQS*b&s139q!yL1l!`6Xqn;8RR2l)<@HVU(Ouo z>*qb(qSVx;fvW$J!)z zwqrqpT4y1*xc$`2n?77?pBJp_rxP^X`(C;lDejTn$dAa8$WoVCuGN~9gHba*!K#Jb z$oLI+O?wX;T6E-6GpRt1BG`OhwG}7OGY_Grx>MjN(T&}2twb5t7OYw zF&{+cF7b&SFfm5qqLgKb2M)W*c(DT5#dsXNQ%d9g-d)}P@nHX+43x{I3QzBjV>kA~ z7`ajolFvW~aCQk_jfNPki!8wVYAQ$dB8Cl?3VaNC?pV4#xLnDC;U%TZU5#7_TQOK` zHZ@iY`9)=w&!HZ?`h_D}5h9_r2DmXA)t=rtWh~`Two_I!~uJ8^&ClPkU<_Lj|*gZk4Uh z|7@rKdc@WpK3UA@4K;Tv;1NhcO)u0G>^UDSi!Rlm0$T2m{c#J5!d2EPdz@tC;;=f? z)r^(WOJBRDAJ$L~x6mDxrYTv;QEr&*R&X_^)#s~)3ZtWsv~j*alc%ybP2!}ERDWA$ zLDB4v7ml&AY1UUBtZ-Gb_e2b4IRXWfYNIiBiy-KK7`~>bjLHQAd!c1f5?8 z1YSO|U1eDQ#ysWqj)|?&7jYPykAVT3@1QMASXs^bT4H&kY2jd>g0IlPwPx%YH$USS z{4$rDvw6KCt!3|QZ#ux=11!kz?Y((J(QSQK1{bE-;|Br;FUxqZ?Hm8f$Fy`A`k`o) zzI{N}J(h?8M-m2iNxcf*5jwW~Uh3zWRkdZf&-l-N;*oH zUn$=(a+pCNm^ukCm17~Uc|BU-BCZzaUw*+PKr@eUc3{uJ#E!& zM5?Y?U*(@@*7m2h?c}O2eV-{({#i-k`Hr^sB#Pqg9Xx#><a)MTzA$QCf>+z-YFurM z(HstrTI0AEocUxxT1|)cyxw4`|6MjYIyk+l=@~HC5(sw4P^P{5`)VpS+ryZ9b*Hj@ zS5Ewy^-bRmZF}vX-A3XqS^i$rwMmwxlomH6E$HVI@O8v->CwFRr#+t!BRn{~h<6oy zv}I#xFfCdH)1Be9hJ%zE>cR*y*h=g4?>5*0Z&n#7O0BP`Ptw7^>vb1(+g{If>@t2yn930-Q2M!PxzY5$+H#e9)CXSNd)<`yqWI;n zI;^f)(wlHeQZCmo!%Px#^H;Uve8=$&$tboU#ow%IFD>#^V#7i8*U03`B3PA)$U0Jw zdPYX#B4Ayj!8{OAt4gn@p4pm=h|4sW^hf9nuP0ZU1bQ%@VqjOqA@@X?!?A}jb^Bgs z07yx;Umh;i$SfcFCZ^0&mr-q;pyiFCek)WDo<4|S=%6+-Rj0|Nl@g+6DvbFIPpMdc z)Z}rL4S6IJMu2ln|{WFm7i z#B${PpnZTW`~9I!7v7*oZ4EXrgW!?3jw+%B80ZBo-`Lb@YtecUo&B13+i_elpR<=9 z);n8BdaxpxRv!Q2*|W5Ns@uBS)*VAwPMK5VWTp$Cy1KLYqm>(s3~`wV)>2EN@M>Gn z;$i<=vEj)3b7gubuzZV;*s1TAAJTRR2^B}2y*u~t3(3t&@z}*tO42s0L-9xk z3~J&a-@}QnV`9>=b6j8@Xw$GqOpi})nZT0eQcEO8b@i|4sc@r{< z`RYc}rMcDX8_Z_KHs(#Qwep(&;ji3r&+DYuk%W!m52@qLJk}e7>BVp%`0-6`753`K zyo;-eI$K+-Kk&XYuakls^rB%eU-D-24sYHss?L6%M+A~5Pw|6`J+sMz#QCbx*VA@e zplg`&uCc9+<{=xHw$|+?I^MzzsA_bOQ^fP;HYRcP-ZFQgpA|q~lo=07`Mfqtjjq;tJKCn=AvU40(UegrrrDFM%;@ycxs-U$?L%bn02jC@<8KxF$J#KdcgVdg28* zPx)sV=gqU;M8&}Xr1rw_NUhq+X4}HnUH$LOA@%Vz#RBz!Pn4+o?{y}cHyzS8@4wz1 zI8^RS{RC~vgI5>yPsX&~amN(4-#z$aG4l2Mpw{S#=J0MCirx}=-*|2gN+r7ceEa23 z(~Q({`1a+v`3^K*pP2Z1SWqm9t{CD>eOh<`#2#kd{f*@^M6&4VJj>9#-nFWCokU~ zk=_`dASV9oMe=gzx+V;|nZllVlIe}p6?370HD~%*&x`1-uTI<=y^Rr<8jeI`wD{|m@!8A;85D@Y{ih^ov#XOb}hlTBECqp1XuAS z2wf;50l~CZEvGDvbWwcX;EL4RRGL8dOGYc-td>s;7Vi(^(TFeHr`6IzdUkIr_PbkN zn)MD`6R0|3trcD`$-UuuXkp5WeOx{Cd*w%N6zAYgR){_j(jYoplNb+bgz0e z$_qXj|K4w7WR?;9XQBHvJ}n^B$z_!VSd3X{-LVY%3Yyt^lL9_TOw%bj_WRH>_LHyS zz^i+=Fxg#vbESy`mfm}OSF6I1ml$DeW(!o^`S;W(c20GoaT2G)zM4H!J*9RxpBI4I zfP?Is=9d2F4FbG-?}0n_=kx)rou0bLEefyc2V`G%=bH&M8JpVWvLb&I8PC28PC3Hr zEn&6R6MtI%&tro18(-+eJcb}PB+3SL7eG?oxuJmEU;ir`x4e{uFNrTCS~_RONjYGaZn? z4+R<8E*V-}aZzDXOZ4>PhbYRlm-%cz z;po?*^_jEB*Y&~5mj#rWoM-8UTTOx!)Q>WzVwR`vv%5+#L~(s==-F>e?9Z&OmeF^s zKQ7T=gafcdBSMSbz)JX`L*Kix+N($stLxxQ(1i|d3UYR`A0g1tKDA1Y@AtJ{(S51 z;lhj=+=$TpOI#tguSw-z;Z4vW_+TPSkJu}XjJ*kh8q~`$cHUQP#4XkJsU6{Mi+ncz zy&9%&Qki=DI*&}4Ozo_wtTnGB++EM{HBdbIso7@!bxHF8tfC@O`hQK|p!XK>{nvXu zjrF!DPQ|9)*DnV}j${-_4qH9vZz)Ug*s@Dsu8Gws!=o*-Pom|ap?~P|$DKGs?1B%N z$~zbm4JuYXD0w{DniltPzjvcH!MVWlOyb3vo!hUhrf(b(jSlIWtHn?&q zuxh>Xlt)z1B=aQI8rtYCkjel(|AcG^!vF@MfXNAy%BEv6x8y$cma|&D)BN`0YX;!F zQkZ18sxn=KD&Kw|lbC)J{8w}JkcThFHb#kDVrE|H8v8bNt?caeT@zo;RDJI9*{}Y1 z+N$=;sT;mbw9^n;gmWdjhPkp4d&+OS?{ZDJG1>OprN`8}PE{%UtEdt8&dm8>jF9lA znr0~|l=Ms3(w4(sQjKLnI&Y*iXMM1lf8ap;c|4(#YwAkp7I}I>ys1x#^-iq#{k$Qb z21DD;!)X-{aeS({J4(ZHD9o}QUY@;en6`dZjXs3`ZMx+0$zhHYfBD9jy;n_%yycrP z1be;8=lR%EtUW`+H00h3dcTE({EnK>JqfopB%YO#qv<`9a``|_$iEIj9} zve`1EnT~+Kp9Z-~>6=n_dLvYqTe386@Q_~n>unX@PiyKSRIeD&#Onv(f&lnS`k+)q zl~qSwsLCNSSmsYRb-7N~R(#7*mtgV3BN3RNv5uCHKHY~sV!7H-uZak3J6KzpE6Wk% zKmPnew4(!^G76<0JY@m~i4pmT?PIe83|Ms0yma8klY|K~R1v)+th!Z4vRGAHI^8O& zy`l5Ro!Zm{oz0pwYl2;Akf^h{YJo6JLUmSPNTpD9Ey{nM#iQUZTxZB(9b7k9e<)Xh z&pbKKYe$~LF@a7CZq~_sdshmTb zO<1-W^VKFAHUaQy%eGdHn@ZiI=q)|U&gf@4QMJa?ZmePaw-tOB-N>t0BJ9g+&L$Hm z9?iz;rQSO8S_r7HS@;H1qAhw&Xh8gQ2FkK#-u=4V8W!>>3M8F<4N?6Xm=($Sk)Hdj zJ6KKvBF_o;GJpEq_5IFc%4mfIDTRgaH0%e#04}Yfsi5um^=v`?`_%C(-Y}Wu%d(IM zQ$IwVA`jqm)E19>rh>)xGMucWXd1(bToR}|agM6w@#3s3p<&ail;Qy^?DzIT*Km=o zudM=TAJa=gY+Sx{G+#js?}#m*zv1eePl)E-OHCgLT7v5V-eV!d@K{Ltlqcqu)t3}C zCql(~3$Ohv(aAR}FvDyn3ya1tzi{>zvBmP!gGIN25upN!U31Y9iGR++Cu+(YA8ku%xhEf;PRgO=L%($I5{=8n1Mg-y z_3TX%4n2q`SUI270kKrA*3ddnUf4QXe(0a`5PprCj4JRrZXX#ZqjKVVM7tb!MOf^J zaf0^h?DBzeNH*3u(WAP$X$X*cRua~DsFR=}V9g#uZoI6USm;L@lDMg30H3m*O+9*! zbI>v?E0zk%t3UwDs{P9r3N8E7d>nbvVxVp6yIi1UYJFuiI*BJ;i3v3{ayTG72rPY$ z$ynC}Y?c~dxYp~1l<8YenEe_4p&b?a1Op7YK6{&R9jKHBSs3HDRw}g~679V>JCAaI z#F&0~J$&WkJ*%j=I8EUX{&YgY86#x|(^E1w1{I0l9)hi-nMWmFTF}vma-9&Bma=-MH^OZ*uLFFq=XHO`s12U7R*C6i ze5+i%uiwSdd0FOgB{GwEiJXE#%maOkmLHZV;q?`%Hf2lAX!9z9tMg%&4S;pQ=TM66 z;j=zt5dV?cl_qVbY<#nT32dayo!lmC7Whm*_?l#&E8hsAhn3M z4?B61?eX|cRESi)D@EU_vi0T%>IFXDOe5v8z;v2ZLvGAy}I!F54%hDidBc!Dx*&3 zj5!Kdf)6CG0cfcfr;si+7lB%-QrXeHU4x`1+4n6X1ZkcU`-sD4j8e={HG|uWxCs`e zZ4EKWz?J`T$0o1D--5+X z$2u_rf7D8U<}D3D-q*(&1zf*h@6ok#0YEvKGjXS+6j>DSxx2M$n6NzUGE#- zXNUc>i~^!4E}Cc}M!Ag|$vRD#lb`iqd;2m#(zSuX)~hTzqF$no!O1}7E4)WFqHxup z-}~X2f_0b8@M2&7aCS6gxpLS{=+<<{JPYj!QK|}vML$3NfV#x{RCxdXL}0Sp)$$d! zQ{=LpqX?UUgH#vujemRzBTf4Z)8e5?)Ol;xN7+TGnb3S2;CVoM!41aMmQ>|Tx#@QB zq5JPvkX+EwD>qM}>W8%!*-6pT|GFXuGRF|u01$SgtMLVLEj-hYw~LxUPUoisi8F zbOZrwo&H0!j9kANp}~OC=O;f_p05_p)algs>%jQwej-fQH86!!qx!ckbJc_Fj+Rbs zvIRmWCV)b{QD-Mje$UG!8w(NASYbs2RsUF;EF&qLm<@eQA;-a2R&ih{Z6#nar1H zHXcs3YQEXj*Lpr=9|3vG@!zq{%%)rqc$erLY5}LM9M)zr8j*Xq+oHNJKla>x8SO5> z5@okQ+q#V$p@^40$O1IB_M9JfF19D%tY=ss=zvspNqdTS`OCizzQDbV3OS0cY~sMD zM-#dF?%PiS)9<=$DmC7|>dWebL!4_zOU?FO}llBKT*jY!c7n$B=LMVE4Zt?8MEgh zqjj95M~ta9^l5BM>mbe)=adylZ3!s7P_a(~Hy)2C^USz-lfMbJ3`EBQtedQgTF+|r zRW@Dq+{+EPHp|11sp8<$+zjoJl->hG-qE--x_JJ46M33sjbrg6yWOQ16Hntr+x_sU zFm=v7gkinT2U1K#M$Oi1dpLc*XS7T&2EoCzIqC(wgYH#Ee-!CPo5(LO zi&Cz3tz$ABLsPz0Ug(8sKGP+MzW$~@Jm?KHNPY=|Yg66ca}zGeBA=oq?bIo!m>1_&cK zaNu%9P&Ws93DY6sW^xP}_siGSHW?{jR&|*cCv>&&XRi|Ia&b6B+dRW*^5^>CYtWpo z7Kz6^zDZmKVg;Tn0@032?;L-_&#seec6m|06}s5j6>4K=Q*QUdam$_JGf+Fo@HHw* z+Rg*lsE&)t_I{0tyt7Hs(!sT{Km5@R+}-VT3ZbXna%~(TR&wRtxA1L&EFBp0Nw+^04p*lU^(p_O!Eol?4zF^AXiSXz=X?mO;wRVlIojty5X4L5C zp66J{DXmOs$J?RH6PGC}a4;1=G z%r`3g2?ICaxI%*A=U#ZE?SH4_o;uC(m3x=LV^!CVRi^yg`4FovuiP660gICU`)Qq| zMv@*os75)bA0OSn8Th{pTIUo`{bKu&?cdmio3Bf)#{NxIW}dT5*B9r+A+mSshsbTi z>Tf|LDjWn=DnJmt2TKuh+Wu*!2JqGS$NpnR*(b}jRq#Q6?LQ%e^WG_fc3#uiVW{ii znpUB^X-Y312dh3G{6(lY2r+bBpM_hE`R9RUf($I!KCahRk(E0L0|3v2U^+w3okbv< zWd+=WUmY_rg)3|0d`~G81kA)O4+^*Xh0N2(4^GN-Va~c7Ol#-7)~co%Vu?WRm=g__ zd*pNd_6%_nE|4uRsXwCGW*r*b{0-?Y_#=E8)k9Zd+|w?-_Av~s$bQ##{`Yk z`rhE2vLr>hQJ$Vd((*bh-`=SR?FVp6pI#+r0$d2cXyotumE$-Mh+kx=zt>#%4cN0g zUtX@;Jgi=0JHGEU8&)w4k5T{0F7~yF98#+H(lEZO1_?XYeC1G*LwrE$HUF0HIN(3I# zBPp)ke<4uJ$Ygh^jIHXH!8e$~^j=gr_gM2%WKe4SqoOMr4cXD#DRD!8GCQw+5xeW+ zcUo758=z&W&+C%*ha_D;6ovAx!k%2bbCcuLt<-<8km|iBo-_X{fX`codVN4o0K9(j zezVJN_8bE@Wc;~c?66nRt9toRAO{ilcpp9TyZlk;YQ??_???8xUa>zv@07k0sIUGo8UNc_Z8q6ay`#Ob$1`j8<8PJ*=lxy3 z-B@(y!<{(3PuD_XLL`NQ00|Xz3JC2as(ynRQJ%0XAFNw=Zp&dH2Yxhv*QD?U#WZ6!4ey6 zuM?vDi`v$+C4{w}h?=bf+QP0u^#nof9>CUyr3QLkuSBOmn%xXTt41Jnv_mz#K(_@g z8lr{~gz0$o2bC3v-r;|?>mlPr=-JZIVjYrvzNUG?UadpW^XNtD3@3wZ^ZAOG-FV#* zd?3G9_r{z>*tY6SHo+Ce#6l0R475>(&)Ze(SqoToXXX|XFUSoVm|7x`oCIDNhS!A& zZ`K?0q^x7tz+kz$cnrD5n@kxCyQ{!=61qUF?AiC}&XtAG&?J>(-H4r)J%6zXW$77vs;wpFjsso4o51w|m_q z#RqN;@*DKZXgYEV9W8*Kf4R1s*1-1eq~65^0zPJ%_5UlMTrW%ZVwzH$gU@NZG{^?9%7>G ze@H7vJTlL!k=OSXbc@DEm6VAXl-}@kf7YMraMibFVYC|X(+_3XMQ8`K+(_~9}_ed=_{eWaPHjXpdbusppHOW`;g ze;n~c3M4T%^@?kkIl)87JLuBs#hqq;EK_sdF2x0N*B-?{s2wil4u=~1(eH)R2k?A= zCe6n3=3(WVus*_N4e& z+W6%DfF6u^iZ_9}+6ysexLv#YkAVjI@_$mNzo{3-Eg<$9n&JYcdg`y_>XZ9==P zOl3{vnMsrbI0&Q9wa|&47s3j6LiOIiIQB8L6}UMx6Mi(Fd2G0@4aqznOHBl*S($*K z;8wJz55aL3F)cJo?YvST%r*SeB^Vtm2kXtq9fJ9hz7VyaB#FWFt@h`K4jlRyYWKPe zrFy!i!ausYy>sAYTzv1KuF3LMGDKRlfQk86PF(dL?(y|*ARy!1c>`L8RGrB0luuf# zp(TUKwO?2y5G^J84bAhHOh?d4V*GenA7S75U3>C)?7mFK48V(oc-k#On1}L{@2I zG#W2X)ayM^v0}F!1ZsmXLkvP#*1uK2o&{n6i4Z4Z=hvCAj`G3zNZQP}A^2)*@AkP_ zt54x}&J~*52dd?dRB~gh%nH@ci^;h(isr1gYa_%H>xf}}yt;P;T@CtGHdLa{+<1$o|*17@<@8F4>qr{FwR95 z@^B`{|A2zG6@SuYaDwdgO5UrcZ(d(fbLQoU#!9pLzP@;lsWqY!)J?fs(wX)j8b>DK zO<3LvN!#osECIV>lE85m>( z;zOF`!h@6EQ>Cn>v)6xRN<1m0BgWkMHU0h2W1>))i{LPe7gR*%DOmyQ(lVL~rwS`> zE+(h&yrU9lQ{D$OikRg3RQD)}Bmz0O1*%P!$ML1`4K14(Er!yChRz24keQ#ViLdy% z($RS*%V6^ZhppN9$lyWaAhq9k~hIouoAy1CrFH~!<>g1Wb-~L)h z9@z4%v$3&}|MYS%O1@IvO1tOtP-= zPWMBCwnP3K#|4Wi+W^bSpW+-33|cBC(sBe_?l|v9>IS|BD^aC3w{ue52e6z=W&-LO zK6eBYd;rkf91*--PWLjuk3}9tvtC*TA3Yr3%-VW35qaknIK=xjEQTyukmM?TN_woi zuKPe3r!(IZ{hMwpV3tP=IAUvkt6`&Sf|Hn&B^FrmXH)Ppb(O~uwBhvIU9L&;9C&Tj zFL-N{Opl!$Ie$jaI^J^Xqj*N&G!;@~y+=ARFe{UmN6al(zF#H^LZ$zzA^U)p7-~^& z-#o=edv^47Hu?Fxt*AG%J$IGd2jhHdO5^y5P!^BP2xdUXx{28n&_)VUC*6~1*v`=4E zhL!b6tKO=XH0Gv7vR9J`OH8$YWlB&(I{ai`kTh0WKoMMVxSxiGux+6w#XGDA3-&@v z)HVwOlYl8|n;Fd$z!?+8wU=IGu<_5Fr3D-lA%m??R55|$ql;$631>CpnL2~*lE_q; zdq`>P(F`v1RrW~oP@c|ac^bpu^PrZ%@tet7m>^e(mFr!zmrf&S!eT}QyqW4aHlL&y zxcE`=B}uWJ4sG|0J^wLgD%}xQ4D*<&YWqyjVlnA13B9k0H|ugZa@pFH$brU~@u;uOtW-LG{sn7Q+^Hzjn*SqF|IT5|~ zL$6<@2$dN2r%Pw5jciA@x1M6XrpoD?$1|biD`Sr5^Lz6~69)Iu4yLim(5F9Jit>X{ zb76nV6sM1FlGW@q^T^rEw2by}cqmF+y?i}l&v?`d?~`^o%FCrtts4U=u$?Ls&pL+9 zB7b~AD7%Y8!)ARs@t59Ol-Ej*MN)7LREVIe+v^9LDL(}yo%ndxb3>p36Mq`nRht_) zmwtb#@#7#TO{9F9UD=%ylFhU+6GhAK#C%25YGFQF6jb7f*Aah&HQ6a&O~$8rYRoIs z(lo99HhtdX+4zH5wG}_Af1fqH%Z0B?eWc{smpVt(v5BKaReYhaDxP?_fXL_mk3q8- zpz#*D&z&Fb6_yr(X?b+RZ=SvbskFwj$LZx=SZA zgO$<*w-yA^8$!l^i8>@gO@fhfY%icGyLL&2LfInA!&(HKc~r{JQ&xU-GJZfrJa!c4I7#Ax)dxqf@0hY^13jRy z;?UEs0X=k1sP?}8Q4=gBjL5HZZiN)tSQ>R$K=H@ruK0{R%AZVsk+!6yy z5{B!b>#MRe1Y?NhFsXe$mBtV=;Dyx!UJ|}X!l~HUBS9u+72?~yI5xVTwjMFDy#^3J zwDg<9`S0oK0#DI}=VCf-$Z-!BEved0PvB_er#9W6YBEL!Q8@0+2H{D+Y2LGH*0*Xw zkUV9E)=9dKYs|;i<`JW}O%IOC49wrzyv^&K;%V~*e&YJL&y$`i^_r87mzK&Qb#Eh4 zX~%RufqAcCApx)8WF@<f))ri-shqZ~L-$WX7eOGBc*K#$k!PlxE z7SS^}DSPx{tvkQ;z9T0dnn5oqhUdK!5T zjHYUD!oS|O@nyvKCTU#Gj*TnuQxiZj7VGl0g}$I52XHlEy+;%5v}IF*9oNaBsLY=s z-Z^K|tIz28mEQZL;{Z{qtX`#2RZ7C%olSlfFIaiwbd3Z@Wpwtj+9#2 zbt*;uYLP_mNFGtqgr9hYld(T-5l&c!TzuKx`@3!d7Oo?q> z*?)Dg1qBVf zz504DA|ooBf&xaZ=H^@=Ox~H%g5RE`b8w|oOy@b?tkb)tzoXj3HJ#@~_tutnBaZFG z!1gBO?5P7Cmz;Tc;SYLVWfuYIM}S7#oN9jGSHcbjnKbV4cc_!7$fA-Jn#X4~9C!+Q z3^Y(4w)b;s> zb~WyI_p2)6Uch-0`QG3PS!Q?e)*Cg-j7cYJknHWqmW_K+(OVi~zxx-j^+Q?GRsz#O z=_|MG(??p4GSRZOZ`xTt-fX(2A+Wp@GwjiYkN3HRgs{bKx4I032H7g_a&5SSzc8~s zwnV9zQ7N-Yz;pFJJBiNOm0N?S?G%b7HSigzq9JVY}lp0R}-!i`Sy9 z9*pGR_y13)$jPI*)73-E?NnR$d#ba}vkTd7M9r~XoA`BF<>Je*lO=Mn{jDWzb|b+79~t%OIQvlaq&k5GVS#ULh0z=EA;3W~WU!?Dv8QWK7jwdc^5qE&Z2Z*6jls zk(3GaPsC;{8S^uARPezoElcd?*4StG83b0XYw)}MytG`ky$ap%IUzV@um7#nqduj< ztvc}#Z1s787FWt~nUMs{Z{|gAkcuIGX1c7Evv6d*ROe-h#68(Nxuz3t&!HuqTBYxp3%mHzfhps53JlKYKLu{y5J% zRoRkqR6&x-rU`L2IPFDs3USw5T)wGyV?p8Ttm80`@-F2(ZO%i_I~%wG6RZW564Ya- zM*iMwHBiIM{Q*`*E~O7wh=2y}V1HXJW)5DWluO`PC{^5IV{!SvZ4wORslA2CKnBS%- zT7}RPa}V6;S9xdMu2Er%8b07hgK>MYI#`7qux&J4fY0*wSvWJD- z()z?o87KXqXyQ)0#mJ)dl}VfqQ$O#`1fue^*SaLPOZ^KA{49&yG_{x45L7#r#V$!) z89Ku!bCsSoC+j|(%sMD{TC(^Rva6qBO7^9ZV$^*pK zDL-CqK#6qrvQsqMEV=qM1dp?ZkJNiB^2r%iV7Z|0;8g3e`+MS7$d>FY4A% zjH}?IsqAgof=grO)XIB0hV%E=SWsop%iYHcwAtvlwZge4k)r~0;1GQ~?|=D(;;61o z)n6ww%GMU(q~ky3iXq5D$**at1$R|2rg#sGA;#w6t3@ojszrP)5Uq-JN8rYjeU#ReA%mwkAi|6AX9VqJG=WbWL~*$;`F3AjuHn1W zJR4i4AKdR|_(u%t(|oeH-^N+l<=wC8jC!(5_pa-*-^C5GBkRwIA)i_xN$%^yg{V@TZ> zC|nnm_PQYSSIU=f9?6$0@2n8-XLr-&pl?ya&kqFW?s$U{?U7;wJz|_x9jw!KtFC0b zJwy$$jKrh~P1V^TK5~r)HlqlFuM*gT+*4%9S zfSX9?!i^;uKo%zA<-!cRoA++Wyob$>yIdUWL^XDO#BX`9{+iPkjH0EKf;gEHRL@V) z^pu+)aFdtg<>D`wvc`|U828<-jGyl16G*AO!N8Evb&}&>caV;lKgY@NYWxlxkGnBSlA0}Me z%6=@C^HT0{Hk%4_%IR`Ag2SC^#Foh~VuXpj(G%*RVEk*sIJ4xT%zsCT1kE2%vaTw& zU0!eVn`2Se}Xdm?qXQF7JH9^3{U;6viWy9VdL$4}ADd#}pG_8zw>(i8 z1F!H-iG_T}{vTNm6=#f4p%5Sr$YE8(T|lmykYbbn>C@>>>}OwE#2T2KF6s)OM8 z%wxLq$Ef#c=VH6|BATb@7r&`SY;|(tSE!pvLt^hFd>dAXT&L(bmGG$H>Ap|~@&{V$ z^?|FbPx_q%bA0)ZkeQ~OR$QpUGqb8OdN8+g4OseJ6V&QpYJJCUAo(1=Uk#6(P5lsl`Jbr6;wjC> zjC5Co0R;zIH9JT{Q?lFDXymH{DyH8MWGrKs9R$mpD$0}a`n}fFC#Ys)5)4+Wa1&D@ zeC}9fPjwg3)m9Q?li&A1l~yXvR+PuPW&{B}Pz3@Pm~v9f{i=FH%ZI;}_Czb+CSxY} z2rk7|Ma;u@UGA!G33wso)&N2IL8rwG*!7Si-1y}D^n2n||myor{lrg)6EGTXkjXuJ4Mw<{#sjPp~#?KZ~)7bhlfhIB57a(&DR+eaGf zcc0Y1bf(tBT0`$Gb~!G+um@N34=m5Tzk>h%i?J)53s1=&8&Et$!+rKm`6Xk6%hxci zq;&;c-%?n*dtK-)p)s#lLnj!ROV~AX`>?l%7h|!eCvG88@!yYcIYU2|P+wS@$f8te z9K83qf$o-3+W5qU1^0_1i#8AS#|Qz+n@=omZHLf^>h)qxiQnbKG$OA+96kryEd+?U zHUK}7E~jx%2;=z2OC2$5DxvM3Dj?W8`L>$heQ99xyXo|<^ci&(roGF{^4#4e$s6Xq zYg4-&?IPwy+ZRi7R*#BUGqm{ghkrVD?VR7`*s0Xba%V;5k4B3Tk3C4)O~XB=-`siX zLY$V^y%ihFy@{d6MM9@Sb=Ek3&8SSdA92@f@f_>?3P)cqpOU}T2J%hcC!gNu7P!gC zwmft1DIT`Pz9TVr(UTnV$AuE57S79rrwF>rkWBpf2DXyV0;B~$;j<%otv6;^*K zv!n|Pf|pgWKNSD}{0${#9WN687;bYr0r=I0}%zH!oF>P`eT@>vz{a-JD1~qWOZ+J)Pud46w zu>JEB?uRuFlLUhw*X_FAt*cN$*5VvcPq=z{sqlo)ToKeO_Xq~TXucWgkKI>-p&@)! zaMm9--tRSH4r3ImI%pT`g=zl2~P}r`|jR`llR(qGC_WZccs7eDNczJY!`2 zG=JW=`6t#ON5Q2HzugyNlJI1?NOY&^i{*5& zJEF3sCG9nI^FeuqmFo*t-Q0|zs(X;qam+-lSv1AJdmbLkNOt+GKUFo3BYoM2Yd+?X1%#a56iH#64O~k0KD*?B%XlYel8PlT8OL))#j zVvwQ51w8K>uh zCYz@j`c@ZcP3iQ8`J z4tOU|siNZ;vb!W3aUX~25t&{XINHJ|vyzcJz`AQx3xhdz( z3i$8(d3mkbUvNXKuU~_(XOLe%G7c{mj46vxG}jM9M)M9^Y&?!BDfa;YAXB z*6cX{-Fc$=8_C8Xw@J5JRLbUe6EfO^!YT8wV6DXaZM~J4HQlo;M=u#K_PBsgBj0tYpT*{(o+UQb;UjJ( z3KEpYp`7^^kb@2@SQt8HJj&}Aj77h0{=_6~+=P@;+>}vTrCK1Vf>9X^U4Jy3q=p<*?aJBXo{Pm|qZk@dPTSSLtnHe<$(WApFmQi6=bOH;Cl}gO z3v#aieXsg#YKsWs^#A++wZ|})T$neP7r`36ZkH?@|Igm9lTm>a_B?B}LMvyQ#5G;P zxIU*Qhr#PTuIw|4GOFM5q3(c-wR_u`YtmJH}58nfq4>tu^~+u)wrY z*a-&6t-aH37-9$nZ4N?%2LXv#Kz>IsX#xv0^qgn-Y91)%BuSiaRJW<(-{m7gEJg_HxhwZ zmw90fJH``H4G8)m9QN+({}0y8%Ul#bWh*mrWLy$WEC zwLzP=d;eZOi;pxL+CfE+t=I9GOti$=e+)2rcvp+YC$g}lfMABVfKHUdY=%h$U@p~p zeI$40lai8BoL0MYUbfqf4ywOvO{DlfImZl<0pvUGmm5!ky*kJFtfiYk(ZZ0;x{612 zg>zd3)%Hri_PIl2{CTfY<_W)bl*4>yAbh-KNLcs4_=7N)SGAI3N_kqvRNYrWlx$MF zVeYdcCEbZbrQ#o3h-yDU`@zN3RZOWIRwWTcz)4RU8S>1lPS`3V^G@)pz2(BDLV02# zmPADLUS7~`lK7SB7bJ#V>rzidtFXWG?qXd0gW(C(O|_J+vdJU(w^gcBA@}U|a*&jy=1FQ%ChkuWl$cV|IJi{aJTIXTJv-%WT*}UP<;9QTH zWXTYubFP5OWZ@RrDhku?pJ^$ws&%rR2jV^&?)f@evEObHTrJ71OK|SERSFymu~c;| zmeWlMF3%m(eW{q&aXHXOPn5z)n7u@2rX-hMC!&zs@#<|54Jv=T^lh9K8cd zEOXMv`rN9Gh`7tuL~0qk5S0JBkMEK!^^8I)(;}Nc6Ra;hjI)B)zyRO=gp|Dhh%SAWIW?GzBqS=P*KSoLs` zn1(AuvzzdcU1fIloPHP~DUZ7mIjharpO=?SS8=hH88 zl>|0Rj(j##i-Vlf@Xvs6gh9*7Ux1+AR;pEk)h=NS??b?alu0a%B})=)wf6-xtf5!a zo@)6_t|_O-0=Wpr7pq{*c?TEB0bv+Y5{A~vlP0VW-&Wq^*p72RJ}w-&I7?18BHws$ zu^NBR{y}%>?yl2mxLfviw+U)Tal5#lMYqx85u-CPv?s+QUDr#$**tPN4CB6CFXKV# zS=m%D>S;Y~^Cc2m7cAiiusi$vkmoQ_9;NMkH`Bi#x-)s>MQ&ex^M^;{{|Yta;jwh# zk9++Rcn1#mtM3i`ay7b@Aq{R8M&7M%xAXn;WAH6tcz8G+f9R|5ETFcVXPx=47_BRt zJlyxlAQQfWp)*ZQ6fNyhTCedq9BC~>%Z;avziy4cWP>`_{>aS+5>(nT;2OBvYCO!qJs958k$ zjWOhq%!mthKxRK&1&Np}_8b->42dztO*)v4%9G-p-X{7+LHq1px&9?0NjR?Ab;T_yaM%WiK@8Yz- z>hZ0=my+AgFZR9W@oGJ04`{v%|S5EEqtOHJUg2L zykJkv7?i6HLlHtx!njSMLl9}tZ21BW9SYQWWVVTK~fN8BL-;s>-;~P2C(Gmn{hl&Xr zfH>!=x8VB9@%sMHta@o^`;>boWZ3IgZmSL}H2#eON9f7Vub`s1G2CN>KL*UHiUQ|% z64eR@wC*&IM1+$8s~I^hpl_X3c+4FvFp^pQM|c zF9JT6wEbL4IH3N^HusAj+Pul*3o2c^R{1B#tZbyk-LbUfsI~Pm3A@0n>&2B1%*rG( zhh7E`X{YJRd&Eleq(PJ$1vBD;lQT*sGSBMuGf^%gnRp=VSWMe$r0FkOfO7<>vBQfL`{)imYRIqvKvxg;LrNrv zv|S-QU;yEOShDN!{fpOx$dtypi;|E0}XZHn#9VmqyOl}*pmtDyWRYE zQ6TUY{qz`xtpC=7RGOL0`}56B7J9FKc!}xb>|XVeQlsL!1@belpEIRuobV?G3I_cD zTzEF>BvhitxX2;F^Ga#VcY;GoS5Pr}9kkZpDHW>~GGWBAxlSmkI-b`W`a;5980}Ix z3hssJMaB*Bz}B%MMSATG1v%|6Lk00laMGUux2I6%bvW*iOHbMe;yos2VyM=2F^>H~ zR!Q2b$Fb2qjio?zss4ghRg(_tREbn=K$=6|(Jml9SeS~guk_7NII$Cf2aczQVRsyr z!qDK9`1MCB|6R^Blo-Z+;5MLT1*)&Iqcjh%H?pps~XmL+V4m^#mAldfuDrgc7(x31>dwjd|NLR|u>8wFN zmo#0vYhB^$T=nayXa9>${s$jPMlQs7XW1jyOex;wo4!`}OA_v>FgFU{yXn@D?s9QX zoE#l}W(F0XZ+x$p_V20@A1!jK=*l`*5?mH;A@foKMFm%K8W~_oNU+B+!N}SNJp^+^ zQI%gy^ho~755&Q%2#4cdWm_KY)-$QX9FoPkYLe)3$r(ef1F}i&x&x)sF!UhHR?8{{ z75FN9g#*~*;LN6=dJG}^bkKAtDv-3x9;9NJ7~wGY@?Bz*q$Q@1e?hb(9-T61Mh&0|SZ2Wj9N6lyEgfO;j)W6K?ab=+#!aB=M70h&wm{f2Jq7;~jR;p$ zc)mAr=f?l=!;SD(o&wNas{-}!F8?yIq>MTy@<)^bREg+@HdU*Jn2eh{7ad=J8E|>l zJRksVIFfRF1I@c%sLXllhJE}&HQVA_ta5(5VzyuO`Ez$xR+jtfK=MqT`xmXmk>k~8 zw=`g}8%{AsSN<}vMNU3%`U}&pPNJ(pc44&7f>0iSDpJ5`6Fb14+^?x5D#Bk{Y54kW zN`q+i#4WWQ^AMk$|3}w%Mm2#&-6|rWQbnbMfQm>5=@4X45D}uF(uvYr=q-?dfKsGM z?+J>4^xh$WbO}{@=v5%Jgg^-GWoFcQ-&^1N$y#A0_ug|)*=L`93wnx)(Z&YZF0=cv zE~U-J$OAs48}7+O`JT&mjz*)>c}}?-&d*qrMEG?LFL3vd^(du_!yV3%NKRZ!VbC); zY4Lj`^U&rYp<$Vk7_9x>#G)naC+*eSviO%dilJZ*dmPk;4{on5zn#+Srt?tgHwQv^GbsM?{P#QYv#^^v>hV z{3oIKJ23A>K5*|MC{@b>GF3k@f8dC#pK3Ch-7KNi+$3c7`KF6&g8nT#GEcV z{nd4M_|=*}zJ+FTwCq#(ElBQ2W#R5uuC+WNwyO5bNZQ@6IdxC44;OOx_6vLf;Ne&4 z;9WNk>s57^c$3jAlWjlWH8CGPagw4ibHp!5Nt&Ci5%BuGdisZ5`|Gdq@#zG~@eiR= zoKq!o|5jO~&;6t$^X}IK*LFtwA>Go%*(A2(rg7bof;B3z$-cVlM?2J?T}CdHd(jry zRcZEDTA*42DXo+_DV*Fyze<>Q(PxIA=c4eAYuCYF`!|RA+lg;er3HFw99+XlnRJti zgsSfb$MBW2kxQ_jk53*4-?otZDq`HNm%Vh9h!oKull}T7YFG&}qvbO3IJ*j3A_R9E z(soIR8ALkd@dc_yjwCyVty0dBp57RfeNg%Gd*Y;Ar~$bD0QSA_;FBD9IBIW64KRKK z=rNQP8Ss1|H%<`^@t(=C*ZTluJKSlgQ2O4G23V&Z{n_(rlx_~C5B=j<9j}t_J?NF6 z7A_Nxcu{|^U{pKZ-;T>s674r!z@Z$QyNIHgAA=*NSZkv9rWj9aCQQby_unUe7!3tI zKzQl4sM2gsWH)J>BnI-Kw9dzd6T-qCDi_Kvf0Vq?BxYq}g!z2K;@~QvuhUM~4%PC{ ztjZkp0cqCbGdCl;z`{Jx9d27e+h&t(;y1KKxL&UAYLrJCmm{)Sv3n(~%JWf}WQ~4I zK9jb$zXas-aX%j@4$6tdywFwyw8e62bn7UQOp>5m6zebdP1Ho45NmPLF`R zWu=a+)(!7II5!S(qWI6R()G zhT+69v-G-L5EkcE=Ts5Rfgc7HF)`gPvO6ZzK?8k4Gh__6zKh_D1K1enMeubKk%x6^S#{7hUNt2jy*^z>~EMom^iAzZ@;-u6D9i-_DHr2c_NUODQ=uEOMp zuiN0SeA>oxL$PV#m@ys0vZtRCqj)YTR8k~Ojt=Prvwq=yW6z39>pu-AI9Vh$ybdOZwI^MJL^c?)`wqQ!{8)~34K9UF(jYvo7U~^B#u^4>RBJ%HT#Zt<>PN^X#a^|WU6oduQ6;uPqmUn zTV53z*=QsPb|+}p?*|8sznty7J)W{tX)>hbz8{*}FfvipI3T zEd^dfs=_mT*Pmq;LcR!H+4(4KH!3I(C6v&xNfngcVoS8p2$c7=ziqYqYod~#YB;J{ z)+;h@_H7;c!~1iXcy*dM?{hsJiFvN4#_lP$0Jy?c*w;Sox?v4B$gjWZt4!EVfwIZ+GZ)L<>fupKpV_8xyE^x|HE%X?byxj^$dPxi}Uq z0>lycVJ#TrxtOK01MvFFZdR;pvs#`Sk{Dfd?B#1KqBN|zX%1uqB{szsvpr@qkQy30 z{1I7at07X!h#>w(e@I6*z(@x3vfWp%%;D@0Enta#4lI(A56w7N{^Ie*L2_f=2k+gN%2|?2nv7el#@(+=i4u(OB&ge#;YR#1U-5pOID_Eo}(ceYp zW%JI_3D%gSS8`G?J5d#rU7H<<*BiyVN73Bno&I%QWt`$JYN ze+ZZ4WR2X-Idt}Ap0u!s?yx_sc$o^o z5wjg`blpR{&mFtgbr}tvZYH{7i-#|ull>~1s$1-toKh6NV>%uA$H(VKkhvtO-N^1B zjqGkZ*v>I_r(5)G+J40{8II8MXzPOu7xAE%3yK&$7alT(P zO!88zvJ7?C{N9dQ(ErOZ8HqWtV9&3MKAH&^Y928$3n zC7*f;kJd2|V$Q&r-HsnQi>MC$O?~lcdpe9s&`IRUZ8yHxCzWigJWc_pKW?h+UkJ99 zxi3W_ozSw1G<(E0q+QZ8?@C3~3SA}5fml*TGJ)GZ1{h1lFKSlifhn59gEN)8P=m6i zXRjW1cr7smtEZ27Bo$6QuW0Q=QAje`4>6aguJGVG4;RKgUaQxP)bHqemZXa3y$%ya z?j6(JEZMtSVme?w)D;l%@Wvofk?K2GeR0bxcLsAy%<(m4Fw&*7L zF4n2?obz6KT?FB@vzQI zFbjeG(yuMIP+C}5jl=&%SKMM!Y-r4pcVV`6{l2#O2lur+Va5LbMTjg|eMvnL3_2)- zuO|V1{xy6(%01@5aN)&Kf@3_%lY5=+C1aNb@Y_c~i?ZkZ2-~rjSW=z%U{TH5*y+9Y zzZG%wqsX_M3ot;hFWY`?P94oF2QhSSR!0eSuh12gDsKi>Jm4ZV7V}^(_&g_&ddI%~ zs)OIL^&oBY7GJT-99avziSUXv5RoiR!OME(GT_=~rY95T0}H`<$@dex>e~eoq<)3w z4zB8O>L}+mf=H2|pt6(65zR;;m*g*wUHg18#c{EoqvuQXYN%$LQrq9&%(a4zANXwL}#mkN>*2QRc&0`4rOULz{du z$ot5LrG<&&Jw0P)eSk^DLK=rN`$H`<0~6um%4BQqxHe zuyAA*MS7}Da)MncdP3yht+2tW>OFMtO8P{E*+myW-zbYbe zGC*@{qthNTKU9puI|C;4`w&Zf3gA6XjSh-*|0=@F@X4~UzeMcKTDw@*&KIb zQcV1~xfMv9k>22sLJs+MX@q)wd69Uck-)zM^-66xb$wdqtKC$Vg)~R{%>sou+Aovn z?)N0&6+%dnu*-M7vWs0aSPNFm`)C_b)gutw;;L#!Ai$!h%G`vcWRVN7fGBJW;B%xz z9>WW_MT&)e;_FK6!*c3GMiSky#6(|{CfLfFMgWMO$S`Te_vR0TX!L+8&V@_nwW3FU z;Mj$l@43(O4NHSg^ewmL4ZiQq@%Jg;>4lnyO^G(Wek@w5l7oW#ahwmme}`NEuvgqJSl+R%(fq^qy<*fV1A)*s z_F8tG9HR*;E29dX6jC>QHmDspaZk&TGS2+{BoH?oE11ahFqh zaR#+Kef<#Xk=b|>GEuA$at>veRh`b$;WlDleqizvi<=TIFK&2IkVYvHfsAPG8}si} zo;$knbB1nuzH6@5o{UVsIl^pV$WaHP*iwH{xyW+-;x8EH1;apFVuCeENJC#vNJvOu zweKUhiv7=lPw{5sC2!*8ECMO%`X-I~3Lg?O1JJvqj#{)(OD>#HBjaB2+OVmofD0-c zSmOw^v$MM~w|oA}Q|8|ifuxZ)o(!ugo4VYwwBo-MY#BhnTe|!vw)s_iKXnvFZ8}wM zC6AFhw^_uvM9wZ_SnT!*1d-QMJZYoO#e?q=A7PAwis%?B6st9{S9{rOfJmd>xBRBf z8yoMGNdVoxoPV5vJ=WYR^#CXR9tN<*2 z=uN7-33Ei?ZS|^q?LF_7>G0evU<*v$c0t*_02yjl=az*QY!^MO?&_2@hXyDWsizVYYF;s{kIlV$9hZo2Qf^e&*hjyBInsp@rR!qgPwBJ z&Lbg~N?s&x?S&3%1(KawBVgxG%%=QyH$NLoC8 zWJDa7YRSjg4{7@z)_noA<2nhS%Gl{R?!Lhn%>8~5{#aktI#sWyFXCm=7kZGu=5#F4oaCiG&h5>2@6DGiUXb9b;!duNUEUW|s=sAw26^TXdl%edE*wHF zKF-^azm_ZYMBO~*sf9Un_l(X*#rh;>M1p7xOB%)n40i(C-?VTsDzvGf+I% z;pNrCQ}mU6SR(IDiX+JZ*c-F%lrf820Y*)3KyEaf^)1X9_LBMW&5!%zW!lZw^ryq? zN;4s@4?Ji)MafnbIaVbi{n^85b_G&pzS*;SDKL{?{-rF@rS^8a?(#Z8kaMfB^(kq5 zI)}0xb{Ab!dVDd`aq0bm)WksO=BWPz`Ev2YaIii9hYa%HnAXfsd(50vDTdSRU038Q^Gx=DmRmH zmk7CV=QX5mCeqBDs|mwW&5l{{B~J>%&P@919v{Duj@JR! zA%z|@0^&B*%J1e07x#AZN18AD6d!+mYeE^hL652hGYroMS5bSEq=`>r0;O*n zQZ!A{W)?@ti}|nYeB63U&NJixG?jtMcHq^1AVVAhNUDsucgELxip^pQj>816Q2U=z zSVYPsdu&@=L`M}QwUj{ESsqXI1V0>^?s^Nc)y?&7B@>Jfaz$O~GpA65mYmra49r7n zeta+JLcc?$yHkDNNt^Y}vY5C}{fvQ+6LZ8DZP9A6qWbBy5I+(-pFoE~9#So-ISaFi zZGq0JKcC>Rn6h#7O7gVp?ZjRonwX1G)H-o$ZEDF816K|d>_mltWPiY%@+s1Mpw;6ei9WO)5KVxm{8q-|6C{K47IeR$&Qv@S9~NNSuDc#vW)QcY z2Z~4f;q%2S@i4C=1ps6QXprdWh|cjorrKmQ`t+;$`7OZ= zdJ|qw9Vdu3_&zZ2)x>rF2E~g#oQp!4^-P!`T%~fJXSNglQ z%1-aBE%pg_RT7gwO50ou;F9PynF=aM8te64sEVNpyc1Q#Z>g_zG3_kuE8#3=f6p4D9a=9? z>Rh=pBiEK~;{JW#@!q79xl?3nP_X_X+H3iHyp+R~%*M~3U1VxVMrk7(HiVo&CSc6I0)P7aVq&hvOXQroa#OLyk7p09FBt2x6G>B}m zjWz+gZ>ya2+=(Yi^1;%vL&a71o{_4elLqaR=h8rg!rFj|d;C(j)JQK*4HlEwowyob zQMVpCmJSljT1|HQN{IM z`HPZ9(Cem*qtdCVABG>Qu4t4w+tj44GGT5d^gzrd6CMWkqD3UxBARtGy1d^9Xn6R5S8+9?BdqAsBPmC_Cezdh{=u$XCMMhuc-iuN7aatLz) z3jkWvxby9b$F#eioDZ@7BBU%&L+-3vm4Quuf2^BJnA5d?n(UZ{dx4vM8ciT0-)@-A1X~st6)W8L9ksvk1p$HT8)b9f z=`9cALhGnMik8H(-Sv<4Fvp~QVXxD)#?c|xTrlMOlQya)G!t6<&mAR3Kgqx9aH0-So;5J6*jT+@_TXhZ zaN;AF(@0L_S2KmwcH6tpubMpbo@H)O+ktwgq<68K4^biOx-yPRmJmqao@qpn7U;)r zj!Brdg$O=qyU9RD;qAR%zHsZ_Z$SS62h~s6mm2X{Z@4^u{S(5#k#oV-*QEIE!r}aL zRgP%KBe`XJA1=l2tj-wkTcacUFmK^d?<=cj89$wgplPHk%#cm~+|?UWfFnB0VQKKZ#~iMWhEQ|K6?0no#B84QcY0QC;Uz&o;~m60Y&-Y8$=~IxXYzk6XbtyOfHaA!^e^K6FS=<3#gmakiEpV)ZgHlR$Gb4O2GIPYbSk*|4=uBxMmVZxG*FjjomTVPqu z8~f?>Hq&gPuTj}S)&aM?h?U}Uz9w4Xj5A6BvfiYdPLe)x`AJD)Xe0ajNJ4zN^pBwH zxE;B;<>&*=+G=%+TwrBm1c{%%9@wA|!=b@39IFT+6&o>=r^n@Er!h4vIhZfaRhav< zBAE*Rchm5}xhth^(L~C;V$bJt{cO~%nAS3jo{u9#k@uq}y6zp$8(x;8YxyWB)5_Rt zgF_ka*f~yp4Jh>cY>j?hZkuZ1-Ah&R@$2{Ip0N6oYm@!~y~@wpc{?)N?qOzIv)XI= zQC^s=){LmfBN4%2`auI6VY^ov*^fWb!U`vBNH59&zm?hj=!hp{rzSq@aGk#ieRe6W zK#`iL+xOR7+bd;J^tTSTd60q0 zmVNKgGq9_$f3v3DmDPWFyyiuEh{ov2bahx2#rYx|Dtj2!(Uw9@fpt$b1n=2z+O0so zd_%K$Hkgvf?z)x>^DpJEW*go)zCPxqc`g7^>8<%QtDU))iBElBTih+{1V?!}$8b{B0FX3;~{A<%V*ad#JE*1oNV8hEy; zSVP$FUbpVqLU+!SiM%gxj9w1h9P?xB{d=$BeqQ{t1xcd|bWj&BM>)XOEr$R344jas zqxwYtDSCKU%4F*#3pyFymDu?G>9f<1MkIcq267CJljNED zUu<=13RPNg!xD0z$|)vXI9?uD)ccG1mw8fAQ<2#$HM{3g=9`V^ZdSj6ZTb8#6*a|~ zU~&TsZU}o;U7HXrXGof-lcxZ^5P$Hzt-mMBwf7EBjp*g`DZwAlx57-_F7G``RitV@ zUatO7#g!~)FM$g_YHcVR#PrjLWNb2HL>hm_6tz%YRE^}8Ty|_StiV$leYEZe39zqj zD;ZRTqNvF>Ry0`RKC6ain1(1VU&TALA>}g}e#)Ld^E-PwSjF>EoW?(0Bl`W9n=gx; z6;a|;7DS|x}&mwn1g?f8>QuqBkj_iLi%&H$*v5z%-368c|2^gK_- zNWu$R`g>50t84FrvIsWDb%I&jkh~mm;$kXKch7Ltst=^FZVb3#AJzafIU6zym2UXH z!QGivnj2SKp^1K>YVstP1Fb-!V9Vu#9qNyXNdk;IeK54=!p6{>HOdZ;!WQ-Z176Pa z{fjxUJR$jgKErNOOpq!o&iMjRKh-E)&mr7{oh`hqtY1*6-8(tlNOR-$KB`+k?P(d? z5U0)h1>HWFBU8D#t)D|_@0b&FP_or)nXyC-Etrn9PiWOk09*6_6u+iSZyENb?e;)6 z_r{90`GKem_NP=i=z&ys&HQc6@9GM(!DD8jRca(8X!&Ah6TU0qP=nl)KDD%!N_?ui z%U+C3U_3kHuQI+x64~l>ZvOMhT{31fhIbR8yC)oE%$*-kTM&^>_IA`LEoxi7v%&M#ArB)N@q7IWiLeiO9Xi1U zLu2j+JVkgnSRZT(j%$b8h`xpRx(=Ss`;>IbvinC>3*CdfIk)OgUJZ!AaJZ~QNgthI z8hr{1)?TjYPH#C>gTo_eXw1YqHqT!O4de-A5pXW}NZmGSO%c&fAF56j{gIyj5*5pr zTOY(f#J#)un0c4-F*WDI0P(*<$Yq`9qPXu&wOD_l4hr9W-!tw|?Fe&509N;8b8x45 z`;KEec1@s{o30zKbz?(^`vx2O{RSH+qo=lGMcaxmj|^uT4yhWeq06@T(Om{`)2>zi zNPko>qS(i43D%pfv_Tlsoi48vok?!bp6m}lgsr zshsCY&ID_9MEL8gzyYO?SVY*OuCnE-mz~$UZe}fgdv4C~LVA^$*GmjHqDC=1bfTY7 zkkD9=D7Rsw3l_0s>+H-%o=B*&cb~GE9|{~o^rU?Rt++x68k^@0f_?s8$OF=kbsE!} zn}mDrVC4A`1qaUJDU^d@F9fY$mGd8=xe>SSQVpOeYtNUqo zmX+-lf`xA{>hv{kD+_TLXr+6$bI=hqDdVpjIjeBUX~fxZwld4XW@Cm6bv;BSE%%cK z`HMK&wiD{4WM*-W)8(fGslJmevpZ+Igs)Yztgggw^JhPO5XP`}P^}eytfRhU{I0i` zJq2vj?p40h@lQ)hB}L-Npb`gH_rdf*0n)`@u=2OP^d_I{ALDeGDS6Y{5y>^tfvaUV zWyfbugjE0f!~@`*<s!!nt zzRR~Agi2A8B4S=6Oe(Rll7-3zAH-ZyKcpR$+zT@ujf8xkan-jh256&EkA6^7=gO5X z1sdw0>l}vP3OFsJd0}FQxe?CJ&)IToiEVSul0Z%BK|VDf4k{(*&F?@ETly-Zc0vVu za%ELaI)*TRQv@7VwMDY$e@!1}L$+}wv~|bJ6o6izCEIk}6uR3ee7M)X8=0~jZA;e# ztt9Gp()i6Rf9uQ@x>Q=s!Y1R$>IYmI8ZS5;;3M=rT=WcxZk9Lg;QYS6VN!2!BEOg} zuXN(4R8L$zbAj$Lw{Y95LJ!8K%Ds=gg1ZGw#C>JuT0+GPq#h*U5}Um3=b(#<`C})2 zw)mM{l4|x{xuw%xw%(@0px%02BmpNao7y$b4B1u84_4Zq7)hiS-blK1GEVSn&6o09 zUCCOk9;=3pY;`vDVk2Ah&X~eAbDQL(!jR?-nKo4v#3p;_{b|ognq=unPmz-$Etc=YN(TquYkoT z6icy&u`%61&|k(D?@ZP?!_i=FR4a8__eJ)aL~+5Pup);hQ6R7qEHR zQl?sy`}ber<#w0CjNCi2tF9zdFg;*;Fb)M8fD42lBC|qq5plYUmAcr(nmNv$*qlPn z`5&h%=1-~NH5-q@7&_HZ>Lv?q%K>(oy~ab`T-B_vKqpmP#OFm~2Bo8%@ma6m$9_Zu(6>>5wA_>>?ulq3uY4UhyL2aQ+Xutii{vrT& zZDificf=MCYQ(|uoz=#5;s9;1eLzWba7Q*R+pTgELyL~mLN?d{VFE=1!~pA?+mTI< zt`<-f+7Ki?vy0u{_UpU~>HH2`WKZU6w6a6V@g1CwZo4gPGe-b_>ca-dnNxZxw}?|( zmQqKY%ZIp=jHYiXA-HNkubitJ<|?^azXFFtFFABNTnp{sKwjIe<9ssu%To_9)a>E(fGz*%d&&dL9y1_?j@VUs90oGWUY0rqzKIZ1eJA%Cy0iwdvgC= zHEoLHXECVRC~xFj-CeRSfRp8vdr?#P=wDW_L}#g?$A5w&T!gVE!BLit(^aMPljGv){C+m#I~*4 zvYG_evKOzaO(kO!W@9L3+y1G{e5MUxW3A0C?H-3(!0atWxTp-r2y6!B)4YY861=e7R@C z%5Sr-{koi~_s_%Yqs`#0%QIg_jkA9pn>U%&o#vBiGy&Qgn;{}SbVDU96JkMrCz1|c zI$!jNIvtM+zGamzdT7dZzt|jTlDxUc*UP!D9-b8AY-h+A=`5Laxc^mQF*MbRZX-98 zSD#U7(S}i;x6^*doFTRMhG21rtrl_I)ntw2?lgU_m}~fkp{}M;bf6$11H9Ht--nZyxEp&0kdeQ57VFj*_)~7j5QI`!&_f*TkXH& zNVYzAd6aGaIWDeXWje9n9j1 zH%ziY-_M7BtVniYRMepn)k~TmHma|2k103fDsM3hc(hyYB&9i}AhyR{q_||DVlHK#8HTNtSN)yAGCT%;{LEZuNcQ#zv$ z=92zz2KTq867$bD3*aru91NjG3W#!rI>N4q8V=ExP?!7++$XY2VF1 zu)FH@~xE-f-k0T%4D3YbP0I1N1Ob7=pK zg>yzF?2=bdj8BZvoJ5FrN119z@AENcNb-jFax$Nq5lvB&Mr6&Q%ic(+6`lQhudP0M ziUS7sTwy2rm+I7{|C2cW{d1=*80RkG)<+0NW%H}CoBO(7cijvT$p`5hgH!1aRsx(< z2+bM@Rq8E}_$jh))(<_NR_oHgJ})ABR_{PS%gy2wd|m;gqMrNwe7Pv?;5&j;$4)*c zdD2bAeBCB{oF^1Xtjr(T;HpDLW!I}~tc(Bgg@32mze34e0|%+ z#LDE;JqfgK$xnr@Zat)FRh9eT_14vqTauPBUZWl~rlTXpmEnBC(mt=lT6>dfm{WWR z1+zpK3bzlpn>yxMIsu6_EoL~gSmSpQKgO~X+y~Qc@r9XlmZHQc`deQ2a651~!S1US zQc`v&NqH?Zsx%9Tn3dySoYoC|87+u3vJ=F6Htx?Z?aoFQFE*9$Q$(3LPXALBc$4+_ zTnb<95IEjV@Iq?={2jmuUn`yQGRx;;dVrR&>FyLy40NzZH@~{c#?|+j)p;iBrO(>< z+#wsNoJAy6e)Z5t>d3OyV1|&DKcd@cSy^}XC^Zmo(m%^FIhJGgziy9KTC=Q_mBR`a z;@oxO)yDK~F@D?t+8x#}7M7~<*W^loAsw4KiQv8$8!KC+?65x^WX9pztJ0d!?iB*j zSQRjltR0oK6f))SU~CPFqMsFT*kQjFdC#3;WjtJUvTgjGa%!U3CWA>BU$_d29p5#GB*XHDi0|b#`uAevilN66rHLlbwhX>Yk8CNfl|TCqf`+P4f56o ztJI{LxaxDJ*MWQObE{;G)vBgDt{iRb3N=QO#}!t9B<?OipQh$uiwqYEw z4xO_M!=M>`B2SsdHf3wK{@bWOm+|lWQ0-2}caQ){#>{KXCvQ)#_t@5k=4fheX!9Q8 zPkr{^TES%rl~umWbEzO4D)(fW^ft1wsRYd(6QAf*_nrBG+rp~H%=!mCj7cQ*crytl zwy_$B@HHWjumL(YW?MDNeJP9X4ya+Bb*#GDy?vyz2?@n5hi%kHCOZ}xIM^PAW&wMx zwi^#-G{}orgXm-vg$sWa&er`2k^T9X*w46bcKon~RRPl5Oy}aByGHq#Ao-MJ9SrSS z+vV%J3cE z#j*C(9LFLf_mx{r=vD&>u(9j>Gc7-hNYN(f6ZLUwNSn`(HfouXN2F{2jp z#qq>0ZJO)mz%bX<#+KMcaQ%NSyvBnUp_I_N!y;2!0kc$UsbbSuMYnawjLeJ{MDPD^ zw)syjetIc)TG!>s1Tx6<=6&{@fG&$04rfPNm z_Opjl{ym8ZeS|h(ExXYb38>$C%eMNokL7htMbQ2=<0m!^e-8TpIm2ozvMIwAPS@)o zR9?j5(Ff*;ZEm&R6VKY2Gbt|PM_UCZE8RV(eY+!Mh8gFjzb2bf5F*;|v z04v(vYmnDRUK^*i-O-Qw%zl^~3%aeaX;8~EUG5A_l7&AoF*n`$xYyk(jqsXu8H7BS z4PJ`LPYMQYY{c3DCfUVcZk(;t6ZYS9#dA!H&WzX;@Ei))Hk(=(tql);m$qOsCJ{j6 zf!R}7j0xf(GB(z0e@`72D124gqC+hsn_v#tL;pYP`tzq=O7kWWNX(=o-M$IA`m?Pb z{YnuJ{0N)^Nttv|TxxYNTgb4b4f&j<1gtTB|_FtDVo zBppIVErP~cs3Sa6qMx`PTcLB?0pQ;{-28N|8k`y#Nwi&|AgOA z)Ab81u!d@khOWsSGoJw|Gs2;E9d^kQuGd?B!+GnFvG_!S()WXV`wpW9TO__T!a~W1 zMIwi|pyA#ejcTnrm172lSQshY?Xh%76D-BH&A&hd@vp6B_hQJ~25N6O1E~?bFrUeO zc4sJ&SJJZYPF-O-pz5S;a5xVy?f^dO>1UUT&jAXJ(Y(SHRIeDE<$2)_-hDWZ9u-(X;R|95#{`;kOHTd#Y%boJq%!~DN;3sRYSoYK7F zj@k6dA`uI&Z;_-K_`Q|nm`ZV%Ax=M(R!)^FWh^0;AiRDGr1p-}Mz&BVyXoUi5QOM5 zrp^Z{do}s4F)Auua_%-09H0=@M$xds+^V)@-+&#_j3)z5XZd+3V@N?SY zHZuO$v1Oy)Fm=HG-~hYKHpx4=Z=e6?GI|b>6OQDMT~HD>fYOz#j6iwWamkL@oruel zw$p5d6aSx;4=~DflGjwDV7Aitpt&g`K9wU4arkBXk>uiD7ZfSGd|Kq}lx3QHCD?1` zjE}a%-}vytWJ`e~oR!nmC|$BpvHnbH1Cdm#uj}&zf^!c_?@)9OOQ+DHc6PgQH8`k{ zjt|ntP->utyzns<{^Q9G|2G)=QLYrsKZ>rTl9SC1);?5C0btS9{5Yjl68_cZ~XRh9`QG2wx7(2uD8_ zJ?}or^8WzZ|HrKNHRn8#Md3a@GmiTgOMH#*9TYVBrI$7&7N$FIH}$Uvgl00pHYH_{ z;~*oXq68hSOmIV6NsD4kBGl^xet^I4T|;cS`2m_~h zH#17BJ=GE(I^Qg&1zC|XzHYeg=)Sv9fqFOn>`$7o6?tjr_=cmY;@D@{XGPtio5izY zaq36#kHwkY$;65L&Hs@f{4w#G4L&D%&_M(Zr^96*$GRE6(Ss2IlB@FSV}D9(uzT9% zyjyS{qy#b5XF|CfYNRWO+3Af{hW2}1FL!9)mBr(TB7K^0KB*0$PG%;QL}t>a9k&W<_x(^aWwl z!U)fOf#Yi%MPBqXKZ}I7XV#)@dUmURr^}v4$D8?$#8pI$@Od9PNRi2rDf4lc#eX7+}#jN-CJO+{@HuP!|DNNnV?so2ad=5UxFb z&!);GZ1lR^I(azy&xuSuVytmn8?seUi@bg`?7b><>Me!vj$Q3L0_=bIAFKIYHc!j> z?{b~hR--iEY|Fadv)Nc}bX!=MB>A2j9IG5{46XWrw@uu)V;|OW$={ z=gGvX_j!aZBlg;3bivSer0q@tH=Xg=Ek}@_nLcIel$}{3-Yt;Nk@&@!(F!2lLNrz= z@4i3!%iVgS$-S)Be*l#fXBt~|z5*+yoo;CKx5dWnq0Y>m6;owm%V_YwE4bgq?>}p9 zzG6;xn1X$Uz!J(ikbzdC-%=|8mboV(ck~q%Qye+ zNQ9ByI3LUwg^ZSDg6mZlQabqEhq`qH``jy1gR#np*=_+i`NukF3R1D1t~K2FrC8wB zR9s$|UDJQAwUwLzywV`yUf$vggg!N#ThIw9!8$C9EV#4OeyRH3GrqYk zL~|ijQ$MHGZl$zoQQoWX-G#ZAB_isB<+|;mExQ@vRkiT~l;Ec{9h?-kk4L|b2bH4x z+0BM~Cl_AwQKFHyiv-i*0o}0NZi%tFwz%-n&5_mVxi@b@4A31Lb8wNR7W~@};KpH_ zR+R+NKC`MI7FCWTHc;M`F}=y_J+hYJ#5KFI(_z(+p4>^VbvvLUe)!_sK$kXSL5Co) z6qxRn-Cuuh*VgzY1(GfUU#h&|V9pQQsK-Hl&Qhn?63q#o;{cR=h{LMLGTOajqAia26FNWg7-5T5AwYL`@tK&wS6+6S>C*pcBDDHB(cC>FNsfu zv`vBnPAPWFRk};K>RK@jW&BNoHn`5#lyIF97}2QfVrI%E#*|VO_O*8I33e?}471nW z!WVo2-OC19;H|g;TYNiC>}V;~SqkZ`d3{})E?sPcxs$I5)i+b?i3x- zbO(l+b3t+K%NY!dB$QrqV})pWB2YcbJxJJyYqZ~Nd-2%9af0uaG zg<+h8%{x0w)`-3+*(NP;8p!Apl457TYWdwHgj<`svXn zmIML#lx@%T{xpnISeTG)6L;9V*k*eMiGtDSOpjf{q@)_6CXJ=Z)TLJqt(#uT;&+2@ z>=?zM!zfWCmEd05zHFgj)|OAFd;Hyt9xEG4+0JtmV!!XC^MQs_%KN`ggp;)9YuvH> zp4SvG%9#y0=glN< zO#g5-;T<9Cc(O9zYKGs37hHS*IZ^fYaQJiI|400pB3|0@jv9+*uf|o*QYsOYPZO8o zWm=)j7?{nr85^T?@6q&#G_Zjk6l-SEQ5n%K@qgHR)3~P2wSBa$Rd#npRBD+b z>`EoOA|OSEKp@-FN-2|yf{amOi4taH2qdIR6_H7$jDe&|l_HRcAWxGu+R8U-xz0kAD=F_cvOLlCg3? zx>CHn&1$|NY_&t%SR{Xnuk)Cmhm7Rz`=~eK?*WnQy+`A)(iLV^)#`0s*PNJkFH6PD zcT|cWW1wH7DEg8gU@z^QEs62;0^v;|N~#M+)qlc#Y(4|7ewFERRTd6=Tb(@n{Kn{} zX^=encjv+R8sPG`2MG&^n5%2_@`Yic{F8VJc*z2RSjz4T;RVw$=+(-JqWIbX*;?t@ zaMd5~(O)8f*e0(ZI8;^-_y~4phsg}0d@E;lTrC<`OF%KqA$u$M;PtrepiZ}u_)&u( zT_4&d(6>a#i5VqZOR7m@)bC3ey&x#lA$je7-vf$m-uyx-dq>*DED(* zM&y(3nh=#PU5UiWksMh-M9UWqmvBNGVnED#^Rxe3(rDQ1nMfC>946-FenPM;JUqF1 zu>v=^M?Rigx>z5S4}Uc-C{$dHIn$vkxB^TX!iU$r$<27ThC2C~iKw*K4_{5hn83Xi}lwC(7;~MHm z7;}}Zgl!YrJ?gVX%8&TulU5cpyH`Jap}W&@7F2E^q3IZDj>!kOyT2TEvX3uv zIIt}M!&*|6^Oc$bAFrrCck8CBA8hU48fUpQs-Qg-{@JxJl8c|TWl@4=7HfX}~M7Ea%PuvOLL0f1YuvZW+)R@zJc^p}$9)q~KZ*HoBn%n&)QUAHUP9F658G1FterPFB;2%t9^n|1_ zdS-q|n@PKiFeP{h5!qySz6Yacgzb};lsg-wnrOaq6^$vMFggD=92HHd@9WYjEBa$# zr@qi_PFfmY-QXF+ofQIICy%v{_8+rH%GKaZ!O|yA{7W*M&ToEb8i%*1#EC*q_HGEE zB(j8e-SICVz@LsAOYz~R&NbGka1R)^{KdAWnL6MFw@Yc)@_O68K}QdjDMt2o`Q0ms zi~Z0d&kx9s`A=;LF6-i#Z1y(6gSL>YkFHFr$c8_zowgVA{hz#u@Xa0o07yL)4 z<;yCUty!Jzc_Z#7W8UpqtnV$aGS{cwJCI<7E^)Ja;eMuZ;Jcz4ncpS;iCY0P1WI;Z z?dBsgMD?Q`8$w^?M9Yu2{c-)ylF*msxJDNf4#O!-Lf_VmW`|zoIxIWCX|6VMZ~=qU zB^?S}yq);_J$>VZ9z`7@LZRxW5#rBxCUj163TzK15LWW;A|jUXnTo#qG0vGrv&@L` zE?S{06d~6l$KOJdpi&geDa$^{NW5zUdL%Q20X10xK7=oA=<@c0l*Fjo7E(;sj^Yx` z){()mtlt~>a~Ne}WsyT{arlYdai4m$PoN4C6L6YS6hc?-dL8vwxY!~tI2&lxeTOhU zEAAba4U~V)ige1#okLiV?;2=D&Rc_FK!m3s=t-zoN@u)zqg3V~B5OwzvQc5lk<3>d zv!NH`4-nJ~iMNHJ=6EL%tMC|Qwdu|F)pcA12)b|WD?3>%C%vP-mV7gF^Q-3Q2j}&? z>vV3G1fh6%iW#HWAT;enQxfBKqhPmb5mxZC6uJu8tGN6%h95<>EqgSYy=zie^r%g0dWmyQTEDT>MtPwx*Abnqia9*#aj~(?tN>$e(cbiOZ z`qEd8=&RPi#$B{|>7p~n9!-0jO}i|6T}&G}CH`~Tvp)j%>v2|kQhS1^ZC|_-g%&G~XuLw`0tp<&OM~0UJD=R~@2beqD9_n;f{sul?#OtgLCP@h{urpDCy$ zpJ$x-=(n#-+KijhLMZ8UjhL=ky$09U!XKcW5$-&G&+3;q1Md}Q7JW?8CSX=_t^lsi zJIrqJ9RE&E)R&F$x+~>VwZ+tC`f{LdRT*TI;Z{p7%Ex(HC~THnJL}^# z1%Dg10@@3TJhrDBB+jat{Us`ID<|k=BDDU%0kJ$1ug4rD>-m^FQhbZJ3jd?GKQu-9FlozX{b;$`dimh+H zNah+(L1!x83~Vw(RZF#QRy|z$$V|GVC?z(&12|H{vOU@34cI#-rwds4HI zIpqyY2!buE%gHSH&AK4lIhHzFm`OyHug=`6Jis}}=f%s+b-2@4vP=EbkW=UDu%4EX zm-ij}x9HSa) ze&1m?$XPIY%mZ~Nv(YRtF2vT-(x1MzvQ*Jnf~F=jaz`h61@|gJj|-rS4{cw#2IoI`)ZJMA+E8%6F3T_2KNsjCG8B_mWf2~_R1t@u z%B@=j|IA$YTt`)6TasWupG;T1iChi_X>s2!Srr7qbDB34J-e=!fgce@ZHUmX_ZV91 zF`eTSj8&$A@NDhHJuYs-rR>wk6%$#g%Idk+{r2HFR`0Yya#ZXAYjuZX_VQulzlB#o z<6f_epAT5mMxJZ$<#|AO@)AW@fSc!%;rfugSAKyx(`REh<2x1HVnaiF)IT(2w@a>R z8E-z;Nngp>?%W(JPTt(%#SA;Yxar=_p)PiR8hfj+M$;cEe>z$dDto-T&&Dc{vuO3F z$8k<~MsbUNu?zR*%t5Hp7e$7BBD&8>V@{%mv7X`3Ss-DurLzr|S(66u{?*J5=`yY#q9+oI-R zh%){aW4|sq+#85U_DQL}2-6YXr`Kdd%CH@dxw=O)rz9}BU|3B(}m7T*L81n9m< zyX!}q)PIk|HF`*p$Y{ZNEPBiYtS^3q=B=Q|h~p}D1>Y+?505Z!WTISwvoTEb=wcKE-j=vg`~ zU0Fhs(&Ke0w3Z0=h1>yvia;KSFAkeosjFyVyt-AM+q5Es8bQZ%bo;Iicn=iW`e9Q> zk~+H!GII5~DQ#-x>g@oepHoYBfjN#%EV21K+F15j-=nS~_(^wtb%lEFMH&y8E<_sl z8U5=DGHwxpSh*Jz<#I&iOH__547r(vY_k?7s{YamDV#kxlxWBeR-d{RmoA$6&c$SP zy;&@UHVwQvnS>r0FId_8jnHhEhkeqS zi`E!q`hMdQNYa1zpK^g?%fll178vTxSDRB$WKSVGzJ=%YWF5X4V%?G%7649oV)Lj% zw!gqCyiUpd+|tbnyEbqdY}Jy52j3(+4{zk>f0x#!;%;l`irfC}Jc(i`BI4fN^kS7_KijnW$5i`cyL;#MrObN% z!1*cPSw6<1&uYhP!pNZ=%4=~#f5xnt&V~S~wc~mQ$jFD(a$#cR#0cp#YlP~!b?CJJ zU~S&{wa&e3sJg@%LADGPExdFz3i8wI!Bif&Zm^29q4VpLf9*LOb&SuutVed{qr(^j zoj&!n5^Ojv7e)~dvypM}Qpkz!@SfN4N6(8EArc!!8`h$k!`2KX^+JH^5 zKTyVNT?zRy`G$-7IF27@mN@+V2IO|t0Os~fk<|w-_s^igNephC4IjW-?gS=hMAMeD z566TTq?sxxWx4+e)Z?Io{C|-GzaiVnN?E zJPm|8OJ7?pD4@Q+SpZ%8>7_1^;_^`NE~73cXbg;&4f@J$IuY;VL0w$Vs}dRX3RQ+| z&$)=qT}MSTJuI=~@0H4mkYQlEQYhpXRo5-r8vXW@qHoUL&HZmV@5lw$(Mo z?SjMR({G0De=R@zZ?|gYdHFNoEG~vyT4-QM>(w}0P4BA+%(6sT>9Vn1^@A(kvTc>Z zvQ_cgtO-vOD&N+!HtOQ-xcwBYG!4pfKS|x-)GYqTl=v~?dt@tO3NH(uI*gxQr|0H> zy*=ESnhKh>Omf|YOFDHNa>c5ryDl?^o^v=FQ{;=7GD$Y=DM{?06T}~8AP0=I`m4MT zBrJVHP#56imH^V2;Cq}RAcldxAa;l$(%eRQaCNq!!^M~Z^2?106# zcJ5G|Z4TY&YGp*8R5Ln4T2`~r!d$Jn(*_evv^`7S*tBBR$vD$D(bv4m3EugEQtVe!P*wsk_7Vp%^ zSoG790$Om|QH3DZQuw&fb%0!^KZR`=>-N7&~5!h1uWOE1Q^p4-?|S zcyEuQH=f-CmUa7b2-6KU&5&*g+vqEBV@XS_R{u}`MmlC50T5n+>``GG;_vn78CJ+u zc`yGdi==><>Lb(l-A_<|{9MZGsP+N7c-No@SZH54F#*!J+7^ z!#ERyb>!#bM={&BS7tqgW^~>ouw_zo$F_HOJVdYgmp?MUS%bGj*Q+fUty!0!an`PMVPi1C7l|Pm9OX4^c1guK}I&xzEERQBT4j! zS|kcHyidNcl6oq}w5=#k7QJ2z@K0(yQ(PQg`u^+Tw9@NGSzx0N4f*NbXW?(&-%SY{ zty*)>_Tt5E#qBty5XpRQFU!woJe1sQmQv*tA6YtZ3Mi)@{|C$|<(l^e%u_~8dVdq9 zpQV<^Y|FJ6e=~M6aD6j18=a~3$r1v+<{PAy+x*clOWGeNuzy)SjE($yDb?=nr#^WK zHuz=~Zn+78EC*qF(s|W$XQTEsV<7VVJ{E2k{w4~KAB=z77V#QITuA$pdT#Ff zcE4pV zDo5}iE$sME%p5h6A#FKhX3sbY?jfv}d-$o}(+Sfbj(y)Um|QVnXPeh~M0AJcD;f-c zWq>=D^pP0CdP1Ql(GN?@Lk0&XbLvS6jL84!nIOT(Tz1Z{FjjoYvVQ%IXCJUb-7am)iWUQjG3>GBTx6}%1BCh+z)&i6Yp8RF z_uS0CgI5<6%gZp`#T6ht=&t?4^GC(aV^_Xx{n2?xfKT*6T z`c58oedN3>AfYFE1or3=<#9(h()P=woDQh~k#9!~ zkC$KMZS4)X-F4-Uzw=C^okNj?madv7g%Tyt@0T0&NQknMtqg!F*^c0(VyldauXb;|FY>sx7wuOVx-9cOz}QA}=X z%jx>h5*vmr|20|C-ktDXw~ZdWue|#Sg=Q^&JS(_pBBk7fBC6~6IYcwg(x|V-iO_^6 zb6I`GNNCI0-|7wZ+P)ObZ?ub?{b{pCwAmdx&g-v&I0mZ^r*i^Tae5zdyBZcUh+%il zNz=2R7?=OPJEmL&lu{WZ6dNuhxpL-%ces%ywTk92;H8PQ)|ALs!mq{|QVmu1Zb#=J=KojrLw z8o> zOZ*uW9w;P&mE=sH@ zNUUH(A8e1m%>A7taM1c%0dZE5;Iib3`Y8zQv6Js`(+#F=p&M1q))}&9I3%O z3Xs|<-}1)VtR|Wu!h3u}!DD9ABWV0j-A@Ye&I11dOv3|hdz7OdnlV?CRb{dLGmZ31 zK{!F*wjnBIy47RLz_O^TL{?mk`oKmf*gJxMAl& z8uMTnwmB%-8l>x+^fR22$ENz2Mv==tX)901o9o}N1ka6y}dJwHd%i$7zExbml+(VPBot>rx@ zbvffq&fd=#<7$z`?7lpDN-k(Jq5e;v*K4&&uGdzXlJ zjxHH#Wq)oDu-ka@bI2Tr55m3BGZVsJduDH46otO;a>%~|!yDCd`i|rjcNWaqdH=4s zx){QyG}`uXyyWZkehcFhUqc}VGmCo7>lw++S)oLM0+Fa0s^N;@B5Vxg% zVBcC_e|3%0%E=CiA)xScMy@8e!A%o_we}QK+X&`=h+SqBw(rAj(%-t8C^NYmSndXx zE_I?ySL1Hx=kZJ9VhctQC8)OO@)T3Q;PjrX?1!Pe>`DJ96D;alf{v5)o~h1mcUZy^ z+Qk_91k$fd6C`K9Yz?}K+Q%)n8g}gS3Ys1&6W~8%_w78x(Z$PNfT9{~Bl1A2>(r&< z#GGmyxbZ}ngJVK`m-lhj6}cA;jqv|)aR(qW zKa=I%_*sv31HIapw5^w3M5uY!xvX~U(${@qGGB>$$V5HF z3hhXh-R(q&f&6=Cos$~yM-F(HOd?90AbtITeH?GEgP$j?%>APM=n`mPY_}G_Fd=?m z^#E1fIrmb_H9T>ET<^sYiqCjLQJnU5@?_FoPRPvXL!G}~qmGx%{CH=A%o`zHwwX?5wMQO#Wz7YObo|^1^xd0!)|G3X`qBxVZwne!^-9R zh5@~aE71U-BGh^ssPG-5d=!&9pN#2E#;k4{Ipfraty!oFuyBl8CkLIeL@nR<(`YO zSil#T2P~h-LmSw`y@(BSemP7+aUOqegNxfXpWbBHyKLqqxAQxjI+mi~TPs~UxSmb@ zCbCgICl6skN#4|VrMM3p*+TCAP9vLn_2HTx=ZlRO`Il^(*fpB{lD*!TYPNMte0W(a z6leSx)*tmBVh4aOx|qgHUTa;kB4F0~0CifOv9$G|$!Tw}WSm+o0krvW)iYG6v`kM2I5)AKcfblg z4rCi%Yh^-Lp6#$|k5yCMR{K(6uMG(SI}9DQ;#n4pL??}K)U&72_nZ(eh5imV5Go$3VD*NvsUv5euu3Ww_GAP z2C2@&iw`TaL_J>G#0?)6yP2fmO?7z0{vmLVoQWE-F@@ z3XWcDP$|XYeAJ26)>9c(7FM$R%~OIa8!`^Zgmayjcz>5qP-p~S7WkbvqhaWlVocPr zU8rF1#JkI@8!@pxseOlwKrPj%V0cCFVt0b+2O#1OCv4pMXo0>VF&7l6!!0eqLp+@O z+;S!pGNL)}6EY#aVe)D;Z=|oJal&O&AfR5#6+~3tE!$CKTQ61l1jj{+`0gd0=CUfQxK^24GS-RyUW$WHOADad*Z@X9p0^|J~twBal@?c|qO=3^-Wx-ySJ10Fp^!_etu@ zVOC;Sug^6df0tJF4@7kQK%cQ~a$l91LJ&^~z%^H)zBJkGL}x8JWCS2ekPFRr;t`h_ zQkV2WUNbr(>{|x4hx6m=VX>hHsYFCnXU&>Z=?)WR01^tQqgv1vS(PFA6D71j%ZbGO zuECRxNgy#y4kX#G)MY#K`wNR{^81eL8<`+{@zgTi_|5#HQia<}9N}=sdlkY6$LzEa zrg4mHHD!_CEW#xXI&U*SY#(fIR4ON3bewb>64tCm<+na#)MMMvdF`&>C8xCuUfMLN zOki$wodMmrn`49Lrdn?IS11^JM&~t1(ZIl7(e0)3k+93?K@i-DKPL3|+6}R@YI%cm zZXF(%ZROMR+V|M&LS4vY`ckcOm6K0brZ~t&n|0}1=qMq7l9*pz%;TNI_bWTNT5d2& zOrI@@Sf+nQ^eDeb$0rE18{Z|n@M9Y#<@Z_urt$T2Z7z`Ry;$_+`W%F>=}u#P^^h$q zu(nFL=Q7h?D}-aAm3zrKN?Mx_|DFvGjYzq5UU)^f>tvd~(JO;K|FJCF<;JC!B0XW^>lGfG-_{xJ^O-967AC%(JgAz1`zUbsujT91(e)Qo6S|@C zSz>$@v1Nj!W8#F{`?*_Cg>7+U%ej6xBre6E20h>3UmgL5MJ2T1SahIs5thI)@F&;e z3X&Mbi-IZ(lQ&X{BF#BA_i~N2)!m8jk+e2kl)o&FaY_jPiPBekE+|xZwoUjJKPi=n z$tJkT-e8w>OwMLWwIlFd=1_6|vSMSa!?@X{VKmg{91_z&Y`r%zvhryc(WLM&6^KI3~`rSh(;ya6C z9rjSyR%~{092dF;W`Lt}BDi|B8-k>}U+J>;G2&`$i$IYN*H(I7K@y^3Rf{#Q1E~SN zlT#y%a8aZujTVR@hVmxJ3_wRyN9uS+IVrO_NlF}H3=_vMki5K{yA8*LW`vSP#{?!I zFt0BK-A1Yb5n!Tp>b1A`gh!&_Dh^zq7IlYk!3M(>VFllMDsxBI=G_P)G<429#`IG%&< zX;<Ls z%bc95ilcG$>+=Qa6Wu=vI<1Sg8koLFU@aTQzv}bA3<1Jd;NZn5pR>Uo%|AT7tYClU zv)c%2f24aR7N~>L6he?LwCXBT&o@3?~p^Dvt^bDciL-odG8_x2CR|YzNo2 zOlEV>3sL@F=_F_II5{F>%v8Z+tlV7yOaNz@3#^71>G@ytDThrO^Q+UhqQdWT?oh@( z6P?V}BWh_CP9vZew;%H>T@4%a>)R9}GB-KVIR@vQLSi^?mw}@Rj?(b*KsSvi zE8-=^F8$?aL{02dZ=ouWP)lLi`Ptfbc2jzH7dOS2_Liw40^FjN7a-fUl>i^Z(ACLA zbh%c(k9ehd4W$!{GV&m;282k%t*udhTw}I>zgrOCokz4NFN<&W)tfY*pL<(l9+T^H z!X|HI2JwW6Zx zT1Z_Q;fr1$Cu~AzFsjaVcm2)OjA+pvG@JS;xB<{lGR*zN;~wq8ELQ5RYLpcU94hYH zC(+;~H8u&B6axSNIPDaKy;=u$1Lck7=sX(pw;&BVhRLnn@*JSnk#UL(w@U(pD-ydS zoFTlG?k7D+=kAde-=}#g@0t+w8#ik+OAOP$WA7u&1h;_Fou3kAdwsin`W$&w0w^ve zY>Y=S4vX0QBEYSkU0}M$XLk^W?dquwJ1oA%NsaHG&AOQV?$u_iE*)GA^!e>aR|9mc zZMS}^HGTK4nc$liF5=G~-6Y;i>_+|XOZ=bj31q$@t3)97+54l`b0fFA{i;}!$F_y)SB;D_=%nd~Am zoVxnh*+h1fa6W{L6}a&cWvtG8o_~SpYEu^3j8r9oQZ|n z`_9=*HRI}JG8IdSZ;U|Zu?aoT7Ru-TdRwI;!cZF_=Al6mWJrVj=q^99jp6{em)huv zy37hwMI>$0G%DrBY08ky`m{;V)1ILTioX78Ic4j%gumaT&v1ev^G(K8QPk=GC*QPX zgzHENeuBZgJmDV~0u;xnBA}|L7VxH|#$9psBL-yKFHi1qxgM2kdrWZ#P_LL(vmduI zBDQPK6cxrK)d<7_|Em*D!ZaUr-Yu700bFpW1kX9`z7Soj@NGZN^P*c?w8T&VPncGoYc)* zQ@KqtU7`#ejT66}w5NiO%RYh3`=_yCkdc2qh0!+eg(y7Q7p*dbmqtdXMI6J}1BlIX zH)SDz_nZLT?-kYYlH+69xOLl~MpKUp1KdL5)Q=0uUgQa~G8TDg58Q~LDBZ!>fF;Xw zfv?yCQa;`aHLKLhr&hJGrBXVnHh<06!E#r;UV6bTTo_xX5E zmdKt}x11%fNw;jmu??I1PeLJtf|eFz^xJZn-5J!i?*ZzRqfrb$ZIDs>MU`-z+l*EU zS+UlTQoe!>=r;P^_ygocls>tvENt97p?-FZ&d8I;T+PV*Mi54+Pq92pv)*LnW<6y1 zZFbg_@c%KwTYI&q==|;Ug~NEL5^2#wHEV{3d7z}28PSP60Ar+`Uou^Gl!bV(KQ{wx zO<9(1aemam#D&|o>&1gy!*d1TBHO3*<_Y7?ag(X@><{}>4JsL)Pc0j1vQgg1d;Ir& zk60mM1$Y!85vZ==$}Woq>NtTBE7Gmp`;<><_Y&*(wM0A-%))(e;sWxe5Wf6emzQz+ z2J-JladrbJ?gm#;mTBj2v@|u!cr8)b6y`c~5pZyvdUH~b2S4dVe=6m1Oc~sY!ztv4e5t^|pkVPG? zexvo008#a}CifvZN(TdI=q?{?;f3{OCj1Qy_hvsI#4IkB+66~!N*!BBy~ehzsR8$+ zQo*gxw&+p|LF(<(y*uw0c2nm%_qm#uX6uAPW&(C_F)d-r%Tb7kh*dA&r*;s9_6@{A z)b&!GN0*>LNyRm$y+5&8t=n%n)?J&GKN6f~;6bATI(eMpGV+p_RK^^21Hy`uvi46_ z7Kzr8(h*9E+>}HNmS&y14}+bW+e@~M*uCe2&=&bIFrUHh1HJ!V%XTD zvit2HEo;0Vh$PhKU$=+mb+~-V$qFVx&6yd%6 z^OY0gnZ9C#*p+3>wgZSo#TmrLxHxs~XIy2hyvHWo88uTC6&wshy^v_Ut3-5(@1Z$Sg0#7(5&tDPupGEE!U-n_qZ@zx%c+gcry0VKo(jX zU11R?Ku%53H09oKoQjm61FDFjw|7e~kyBahmN`L1N_jB!AfyckjO_|4WnPE)vS?mi?(jKl$<137na zYkf|?*KK9~qJ^#X;-b|q(l6S6Vir&Ci>!M|1~nHV(sREj*|m&)r=+wB`(VYiyU8np zLzF8$;ty;{73JgM*MR3S4>w*i>hH7|{UQ4moekIWj$M4%T#ra3^?+D#le%Ya!F)!_p17)KIU2#C08~a~gqe5#Cy2}4iC3~~dWLL1qsI@k$^|d`q?zV< z7AAH2ZVCDxaBpU({UbX#3B-RZ_&oZkb+eM~2@i^j+G?=z2Ms_QAX$mqOF8j3N0Y(_ z*#XaO9$C1-0Wrrymun6{?T<<*sQm2$^|6kQHKDPD%Jj->1YxNV_G1@lcgjQ<+s+;` z0aR%dp081^?B!p{2I{m4F82@l;}LcL`;h4DgJshP8A@=tyrF z=?=qN=VP1`hNv*xTDJl1kD3{^2pBMFw{n}rMhUs{;+mqWqN;qtI1qAnBhlT9617iD zfG)wo?m@nH8)L;cJlGmdq4uvr1=o!{1`N-2m0l#ktn-e@$MpI^X}6eb_cEOMB{)kg z0BhRCTUQSkW$sG;*8zJ%vmIIm#F$CID^Yd@A6~sZ%Sr9?nbZh>A@tlb4M1cp${XlV z2NKNc+q4(HLBs90f!vP=Ca$67vb6h_Imthd7T17|&&ir}1xQ0E!k8!cX5C_t9iH>(yy%S%VSr zIeq=9jCa?bK||B1z3NERkZf;Gl^lSuM~%fnrP*% z>bh%Ieu-bSB}5Aq*!s|gR85~30gFU2L1|?uW0wb3EX{&8s@PvDI2)B4kS_?IqT*|G zVD$k&AwI3$B!G5=tQGQrDiX}H8D;mqOx&;_JaR=47M#+v;`~u!*aV@$v86DB_(9WJ zmT1>4Ov~D6H`SM7{CWL4r_&t@DaFf=CeLrp1r|G!EUcHX6X%!aCUPn%TAF($cns&V zrCP@VyuRT)!T;*Vw@0sQ8hWHjp2ESP{4R#oA(FeM21{D8aEaR59w4XWf80 zOgNBoGyZ z`J)Au5DZxu82$Z$|N9F6Ul@oHgJF_#8!1|DGL?BFw}0)}bq?mJeHJ&k73n8&3q=mI{4!EtF)3oWGA=&E1q^pFsPMX%47g9A5Wd^YBSWVgxUbw4r# zj-Ojyy*0P``7*S8cx&rM%i3F?jCtK$%POB=HU`p*HrxC;KJepHk8iS_yXy`wV^S~Q zG47Uabwe7=)3&Drd4rHR-T4y}rMRU-DhCxk`c_-q_Y!W9#}ot{eaQJ+rwz#zed-3L zV#6wip^gq7S0zid;iB^9tgF;csRp>b@i|$r?|u)xJ*W~HS8Pa9UE7V+v|B+G`#`$KY|3YF6y=fg z!78_Qx|B<&tw{%M)}<^(!}5VWTv>sK7tM@lSVfJk*q}7v)@*!qumiUr91 z`SJm8FEKQ=kM0QTNMYVgE#*jo=)kst)Z0_sOwF6*bcB1U_V>4)$l%lLPcD;2r3p6Qup0TunqV950Z z&!vH;yDH@M`8P9$$uJy2gB}cR5XLP8b=eXW;tf__Dlwt>_X}#Gnw-AfW{M>WLmt@X z`*ICQt5fuZ?LoEJp69&0afRjqe6_XVCJHLyz8eEhOn2IpWEfL?naRI;MVpf{O@BA4 zWbUnvW^R?ja;U6#{x$FroI*`88cX}A_|3YDiqOcGE&0$3*~ZqMOiO}PX5VGgU+Gkr zxczpR{+d6pc;k;{U3RvvLzmN(-MW^nA=c~E&2r&-*Ula*X>U`&WTJ4^k=SuL)yEk+ zI1n2axL41)s->Iuphs+u@m?dL@5<^_*~F~|c|@kveh22xE|p^Q!CZgNicQrlzt5eZ zTR!2jSsFuEY8mT%pCmfy^CtdzZ?TmL^q+FKdod&8tE`jqG1KDHos+U;5aF zW>zSz!_3dEgW^sNRE5ilG_oLdzM@Q_Sij$c*C#?nZqgAbGoLVw<@?(x2H`hMxSRgv z>CpMlqUj~D7PJGpp~|?f$to^&^RSf!`S+^uH5*p>n;}HlR&z+*_Aw^fhC8~EGg{l1 z$Q>alIN@nlEa$g!B8;8&owe-wrM<-nx_{D!`*cSuOtQYB3c>CP(VKHMdJg zcU^vQ#gps@ zTxwLF92~FQUOLa6LuwL}lT_oY30z>1yflm3i?C#o8>>CWW;^1y1p-*Qnwb72ykv49 zMwD>%-|Il4I2ceZ#o`r@!+QW@)s7RXgE|aYQy6ZzCKy}u+lb-Bs*S>Ao)35X+_unh zFbE=5d13Q~$e=m+l0ATBc}?s7DEf$l=B&ILt+`vH*gZOr^pAJkZITb0xQdHw_m#9` zvsC8PtF{g<5JBcFfcm`T_jP8|udfPfQ$t?X^&qNh%I1ruNl^(0Sq7AFpo&~Arg*J@ zi<9Fz3$*&K`O68zW@~}hT`(yxbQB|Ai>-zJCW+8f*jFYtBi&t9={L;jjt*iouJp6M=J4)oUwAYfN%_?zC ze$_M6w@b^}7rH4=_RMS;)a}2B$zm=z1bPE&;<^;7@WY-VjyuDq9{WJCBggH<54=c3 zSD%gtS#2@BAsM*Gc&Tp}F_c#317($)i#%v$-w-cbo^?_UwpxjZwzs3-`r{v8s}5pz zKE%-k3)guuv*N3SW*u#-d@W8~LV^p?xc!L?*qyT)R_gkeI3@)Xx`UL}DtKPIdKO9S zW46A9D6cw4AEJk%PqHRt>ct2%>NKJIxOC)% zF>c_wt7ErT&(Im7t|i4$GIM@iambNIOTO5|Y3n(mD76o6|Aa1oDTw73`Ng5JD1i{vMrgU+??J z{$pS7zV`R+Z}0a%uEkpSTFc|D5@(O&le?%f!#8~o$t z-&8R%w1kIkQd1tAoi?e^?j{-k0@_YA8BYz8tK2YZq{BGjGWsBR$QY~hZ;A(WqH6sc z=>4ofzc*wI3NbE^Uf)-o>iOme8odVE|6GAx2_6~M)x0hLQ*z)ze`AtAD~7U(fg`$h z0x<;Qdg1W%HOG?PdtG5{xq=N7GG-tw3oleNe5|d3e9WDbd;8e=ta~ zM>{H%W8Xn{)OjB+J=lo1d)R^B?js=M@qy%Z)kIAs!%}IdDJK~^qHsxYxufZ=OV$=H z!w$=%ji*}rqw`e6t=K6Px{&Vu>VrIUS9Rn)oQpDeAQr7KNDc>~)cq&XDfzfTCdNQx z6MEVQXG*$;&HK|WuhWOcygv*R0v#dLh|}aGKg|TscCqGECJN)VRSUsmlWrSvc8+u6 ze5bD#JaBcKCN$DXacUc2cPrthQhlLu^21^|V5B=GKgT(LW|*C7>7?C_E%oA2 zLqY6CQuya-n_y#UpMH|7*SI_bIPmQ^%aBrEBR|Aw`v%%PI3izOt+?vFX+wF_j4GIr z%&^BMt&<7dG$!Jy$Uo2zwc~f=WvYcwqR=#G%8t?}p{8T%?a;)Q+Fi(K;5k+y&*Lib zH`L)gg<>+apt>JA*AUu~XA?^SqOt}SuF!4HQ)FL`jY9HkvU%yIX79{pVxw8z_A=P#b+%-14Tn6LOa6IyS;6Bk-i<4Dbb}%3Zh10=L=_eiA;oWen&BQ0Ao|FD)uW~4Dv>kFW@r~8H=8@A>K z-kTESL;SSK^k?`Id2Y^1H59w7;@{0%A9<)-2u@@X22a8DcGXXa z!>Crga8vH;i%2;!!>-#Y{QcnHmaD2|gk%S%xIMicAzyn`YEa?a_#dIt<&K1!`0WJy z67Agjy8VqbC`~%Gv1oXcMJbYOyoa0k+%Ns$MdK7EO|5;Q7rX8=-IFb;-;dC87`n@rUE5vmB|_PFP;OVN`bSkBH*5W9Tf$+MlIM zl1kp^f(EM9DBWl&K%QzOjl4#v#f5r~N4zq<{#UgoOE0({y0NMWOx3(b7hS=ik*C`! zig&2Qz&>j_A=<9ijrea-MJqSg!etieEPj zz12P(sr6&l06~fLk=nXpd^2;nBY!!b*WA{jN)?8diZ?5*9SL;FYtQ?(fBIrNUU(yR z52BOzt!W}fx)NYkCUZ8+;C}RZnrx{5aA#~!bzo7~(ow*N-AlT5TMFLKEy=J}@%`vA zyV8LXK_zY%FAOda>Hof!RNB8;IJE_H(D0ROt(TEO3uyF}=tnZU1Gy0I#u32SaA9+f zE`>KGmB&k^OWlTm>d-(2Tt0YeyK$tYj}SqeT*Gh^QZFD&PhpX(QbLm&!hnWEIdL70 zpqXPn0iS4HS)F|8Q=6oEk17KBoeUANednH(981<=e@2o2+e2Io3eHPEK5zR8N*6iTuL) zbW|J=^g)x>^9YejNTw{?HXO8)v-YjIxcAx4fb zKqlT`IRw#;e@sQo*N(b>L>)}sfegLqT^{0e9Y^Fm4@P$|>QXNrKq6+L#S)Zc<0(5R zgpmQvrP@xLh{HGIASwB!4FRFD`?+`e@@5h{=%TQZFf}gd@D%pEttq9@LaxG= zig9V?u$jE|b;IyBfP7|muFi>d_T6#P z&J*+c-M%jdkD2-4%H@0R|UmYB|@u}pf|Ed%MAh9f_9fgXG?)h53J+FUdG z*Y}lgR+K~&28i4zUDPv!#`o{quAaF~VRq+B%Kd0=*_kfrb$TpJcp5ptoQjZ`9iS8*mTP7@1pR9yDcQmZ6 z`s&`)BY%2U78{^^hq_K~KvA`qkVC|X=X*wjgQ|V58v7}7c;rRO6G=I5U~^dAPAaEk zWvQW(p}C(s}&WJJJb$xZ?2Qq+#7# z%@MG~?O=%1tEWm2+kPL_gZ2J=)25_oB@d!bb}y;jPEYk*{MsTW zj2t6E|LXh^fL(UUem@1LCl!*y#l#x{F%iwf+l zQlJ@v2Oo6gdaj`h99yvy&87)BgEkoe+$4KkbVs}Fc1jp2F?$7cSsGH+bxJ?(-t}z< z)9)aD`^NjZivs!W@iJ6-DD~pQ6WhKRuSG<4Hd>#Z75^RkxZTX(0iJuQ+WZPalTn?; zb!#u5rw5fBtVVCYXiQeIXm>Cl0+ZD2&9gwfzMDZQ`dGKyQB*T_Cw=w$@*`IBhEz~< zL|p{fQ(M}r&?k(66@q_5rHZxU;;xcqep^!%313?LP+hJgpFEa~RR7Xixp(@gTQR0_ zP4G(amsE~iWWTh7VtNo>{E#D$5!dt;FJ?cv&%d8+gCV^+t?iPzV&gWP)$3u;A$|@j zXyrVT;`)WjxLZsv$!z{V85U1(U}bN39){v3x`;2pvfgk`daZTjM{Ep1E{~;WuAGnL=Hg;+|wKoG- zTkQ9*djC1_r8Bh$3p<4yCcVZ%NzFowa{Kdw_T8~b@m0}Uh9ATZ--Zk@WC~*3QyNAf z#BN`69Po?0D)znF6o(G9|HAj}pkQ;?RfCCWizrxKw#jU@zxGj10H)OYW*lp(k`QAI z475$8Hw)-rXc+}Osgz{J$L=lcHErvSk1K?5G+)d>k*eSmdw934)g|Kq8 zfV5M&P}apdOAA8kZm99hU^e~aC7befEvz&2P=_ui(MXeZebE$}s-16&Em!}NixMYv z(A!D(zt--t3$B=o9>jf?5L-(pl6Jy~|5%fZV^Ru+o?)Npf*V`QV|Ru4ToX_#f(AVu zZD-!iwSF7f8(9E+1M!)@f972#rz>bz0{%9g!%PGcAl$+v0x z54lGDLJD7m3AvbezH86uY76Cz4)2(_vYK%5RBQi#P5Qs)^&UpdqRFcb{@Z1oSpGHL z;0*6i$Uuu?sX@$nyc{kDJ|s10&$t}-SE<84y{}1qL#c@xP>)0&u)Y;4aM@j^XY;HO z&x*PJ5wylw(F90K!(v;9obppo>(p=g2;LA%CFNUN_s_I*DlF-ysK8kc0d#FV$N$Y} zkDY8D>p=z*KYL)UTSK|NW(55Kq8t8(@|&Pv-`B-Z|I>{G+hlY`=GGQxaLCh*)Z zlKLVIsieI>Q{$%%m7N3BlOm7l=$@bK53(m9*9hl^+U=7#_jE4}p*rq23{9k4pCEy$ z=~2HbL7sl+Jq7>q^? zcU)h9VMbxmo*!sos@p(=pbsa!mRIOHO39o!1~GtN!s)gKf9hwzZu7G;c0UJuD*FIG zXbSrzcH>1zuCe)MK@2>ldYur7*8XirL(Q3|Ry&hlf;vORVcxu=$#X?TV*pSS`iouJyXI-D!x+w27U4I4SO zo4-WaxUGg9J`ZQ`)bAy3H|oVb0ZnfvcGN@i0=X1bxiZPG2m~}W^~emsQCwz!S$`jUBCCK$w2`ZJntJ2iZHK( zz_O|^e@kACc6vRz3rQu)qU$*z`mu;Ko|fI@`kA@!)gatt7)?5h&1_LOdX`LyNLe)_ z@=1>H!7z%tj%U#G_@cea2+WL}fg}uxfIg+B%G4O9TNBY^r5g2uY2yiA&``XoK?NE& z%&T}}#*k_v#zPb3 zP|yGBV`NVk{q&^e>m(6)G27;g>kB!(d-j~T1P1>vS0bWQ4xy7!+tU{b{muD_{Qe(+ zKSx$Foa-Ov&?4`lK_t>M*5vCG(Cps}OI#UxIH zGOhI0RA;o&>x4JpRP$5I4KM%Gi?*!eU-m!m$LXt1W|I_|t1tUft@Q2v+bF0QZf}t> zJA1527j?2dc5#3@C!FK4pV@v==ERF_Ye`LupQ0@wHYUv~nI!4(J?wlAPxA>g?z8JC zsiobXWSk%A5N$M=e^ldd-Q+5m_nmg9OjhEa`g0h}IGeibU;&~M@D1UUr9W(bbuSP9 z@uxMa5hA}1-y_3QM(aeyer8Xa_n~HBorSf?T=$=8_OXvEL#2kHP6{a&0oKt%ucZf>1YPCi1;;A>cS?IY3H(tc}S980y+ zCf9H~fO;fZLAHc`K7?sZ+3=?zhQ~P`+I;hbHjLDJt6z5)r)p0z52Bph=dJD%%imo@ zDALU8*d$B@SeO@%l7``{6zfVVJxq2Ww0qwsljdeeS_=)bVkpgeHkrcEn}(>p*xLb* zaF!vep^6hLVGj%oEzvgM0N@_qy7=ZMx5exs5=be!uk%dNz=Ly>F;>E~-vj!f$;En~zCuZeqTPl;o$i34+ zN52q9oR4Th64d14G?6(uCSz_I zWpEo;24Xj-ikf2qM&7zV?JPI-kL1|sa5573RDI^%#I!>gz9{z0dQbyPs77(ZFze5k zP5TYa(2w(S*UjqIy2iAc&AYc2Piwk=K>snA&J8};BTsI$PZr*Al0`sSO_1%T-K4(v z$xtK87@gLq5Y&Xm)dZ7()=5FKh;j-$FXphT%MoTU6yOEj{naR=%zfsuaWC$e&@@7q zA#KL*?amU_Tx%N5sV+%_X-Gu|ncIudz`Ez-jUAj`9d~j`?U{QvKsDTCzuR{k>RIGD zaf7%CX(kOmzfABN4i4m%>{H_vfSYZc0x1Q*CTrJ?0#j6na^u_K(~&tEIn3agc?<-ONsz^# z0ZU!gp;gW@i~Vg07ePSnoPkH+d?02z!1%nfz%CzMT#e?(JmF;~B&U@M%P6LN*jVrsjcTHXR9ZY`^6vx1&!r!%(>MAu+3Ak86|0$n`# zbeh1QtOY=X%nfU|eU%I%_>p&U=aau}H&?ep>FSr{uSMT_n1b1CGnQr$p(R@eVvPN` zU-rHtfGzsY;=pgqws6C}q?a~az?QeWN7Z_w4AShEHOOHP;;jwfJ17W00rPn5n!+!ds{!`@j-}l^qhut6??mQcq==M$vT8c$lTD}t-F_k+ zwX4O)ZzAhbgtu$ZjvXA7%Gk(W($!iVOT}iw+u{u?`|_5yUt=c^g&9kebW+|yPm&ip ze+qJ;;ArRQnvI&8KQv}Pms4TN=3OTKdere$1TDY=vnd;E+8f5|7(M_QAU-q7~2nbjxewVpKVXgN|QwlVLUxD>21m1aM3N5W!W!2 z)j61QxD)B5+a61vO2#y)iy(T%F}C4E&KzkV;KWIJgwVw*-6@dRXnWVt@`{%V7;O4# zT#fMMR`gNp-Ybb@_G#gaVgX1AxRl+~WcEmG4CD2*e|8@7Gd$7SfTcpJ!-kSUDSH;0 z(p`?N_JT0JPZEnSEQbi~ny>TFo6Y%nLVj^(P~Z^q?|&DE0cHG0O!R2fO3k0r=uv2_ zaAW1opW13gG0A?_JaE(PCC-|>Y=>p2I;pmHaLpxm)XSO?*<~v8s$=r@pjD}OG|a3F zb!ks{f2noQde;B$yr!nl2mQ&LWa)W_qxLZn!WXk&?(<*7p9oy7*SXm*+FvO5hO7`y#W39gaj0q~ zAEgKSpFd~NuN%7~7bh@O0`iPFT;^7MzPA*&`6Hi2-@SgkvGFV&Z*fnI*Eyyd zYGdQ1vk|7E5ZW$!ZF(@ATxx%|SyuY~{#*{J=ZS9-`Kr+V_#-so?h#T+&COem=95My z+$@Iu40E1Y-TZ`f@TD1n^pn4a#elkvhXwT_&gjbbu)1jv&2-?!+1BY!U8(@nZ$rZ3_x}9^6UtF?C!SufRmonY_|N zgROnBv)mQOhq_spYQ9Vid7@l<`YvL&pojn%rIRq@o*sE&W@%?+5C^_)K!I_q3Pz3~ z=b~h2W)vP85#3c%xPF#CrI{Ssoz#TAOAAbE`ZD36Tk*uo@H^Pqip-0(-w-t=InS8D zC>f^oZ1l#jmJr=Tmh@jEp6+d?<%2Y~cdJ!JRWy${%v8inWBTM}WZp$bnKhce7?fFQ zbc_`CYj=m3v8NCzMP_(jKO(avK^JzUhN?1&cE+KkshbVP{g!aZfqa+Gj@ z*BEg~o{N2I5qQi(0f`r@8#T#{NQxS5p*N>@_0g(Sf<1wQv9qR6>71ps@}y9RYVG;* zqv~X$7%FTij=a^7}SUxpg7Clr%c&NN7 zwN!x4d?F{dK4WVd!ueo>NsVx>h~fCD@dbLlv z4JE#{Bav)+;A;11KvR$g~l!d(du;tI`dYt1Oq3{v{t zbH`T6a%b7KWKV#2+c@?qJV{&914anIlCrdl1%U0iZE91$F5?G%vGx!iU@mWx+M@?^ z8JfeLZW;%31e1u>hzb1ed_;|1lEc@0R5!e_vU}`IJk3|=T5{}95AfJ4lk@85qj@l#?%^2l2P@9-FsX!h%zU zFF7-b{Yi!of2(HxgS9sF2Wi`m?kdh1`{$IzwnTzi9ok8kM*k{83>}wC-_?k zW#~uyPYbm{=#CNBSU~EbxGMj2?O^#H+7eaonpDYXF>cBQ z@J`;(ic<2%m-UzNEqlm_YCSKE%V&f7zj(yO16$q5D9T!1d`*1kF5cTjUAW z$WRwjHZrvw&Wii3G3=MUS&pZKOrhVzZS@(yWhy2q?~?j;AX0ZG-qkwDZ7Ze`W3$@4pSvgeEPLrCn?JR< z=}ud#O$oY4Bq(uSUR(0gK6kIUqm1-E!xKgTBI{KSK#jBpv=@ynD_P~JSGi6993&n5 zrxcq}X7?-yJO!prVYhs6G);okTT(Z8x~VkHkAw28egTQC8T{dxE;c4l7ggUlQybR= z@-5NuJgq-*eWVLX$tJhcROXEjQa`(N2)g)Sd7DGAUHe@W1HN9jW?KD(-sqV4VT-dK z@a=$Cv_^*yrE;2ioe>r|y^qrW!|sad;r!^daY!gX&jnHkw$XwD=;eUv-KD4tZxU`V z_)1P&R<4Ztp`5OQW2mRw1j#j!7>70N{x((co{-{fVhDF&YH5Y@JpX9tX|0Ks8N|JL z*QZLxy#b`h!lYemn#r&)f{pzHQ<^J~x-w%*?CMt^81+X{HLl0wU&{*zlh4B&)!S4n z1z(A6v^Ve4*%5A1scVxdA%MIFVBNsFOTwKHhxJ4YM2+zfd;8g?@YyifT^|!zzO7>* z%q#uedNTtVpw!QV5LN`DcPrZOc#w(fl7qz`HVtzx@v) z@8Q;~HG=;z!aDJC75^^sfB!{DmeY)~m)d``@W+Pl$i$_|LOjSbF0a2k<64Q9Q^por zs~Ju{eewEIboNfsloRx$B=Or3J=vKbfd2a>wFC)#N2bx_UEO)sL<%;0ZA{bu1H8z% zmY6-Yl@S^PFb}vMQh!{0%rz(^tjliAnS7sg9O=pP<0-npvWKc2C8gwtzGIE4J+RaXGb#tpZRnV0eH_X>?X2Iv}J6M6eAY>B_7V|zF z%CuLv;)3@46mfj~QAKSf;IhFcNt!5_4*vX|j>9QC5}Q-WFQd}V7l|93m3pXc^m9?l zdE9-97T?+v*;$4P*>P=we=O&stbuxIIB-<}{BbCwd~8&!|8DC71Jmu_7&TDuCnobJ z*^uqe_p~m*7#SM{J?0>oh69?FwvWrYpInHJDkwC~dFQBxGT5Z;#|+w{UtB^?g`~~e zrmUKgj_g1TMExN*2-49>0f%lUbw?uG*Qx^!__cS%?YT&&O%`5IES*nJH3!5Q5#b-_ zT)$Q33-zPh#ijb6Y|jfer2GDTYA?n+05OadhcS)82;1oG_TswB9(Tp9#_C$lGfS}{)qb~$0=>q+vJ95l7p3O&+J!UcJ(!p*Q6Y5U-`%OEZwS@b}( z(_G#+uG(b#qpHpG{Tx_av97H|;LG=Lh7UUx38!>@$AU(OQoybBloS=t2d?Xzi=xb!MdR zI>>PDuR*|DD)*YNgIsWga!HttIOryOpoaE6K_`qfBxbZ+hk3nDX)XaHi!>fT$MZ{r z$J6?;%^y@SNI6J7={ay!<)c>1;K#DDo4z{n(=yV!sTXR}HrvIggdXF9ygK5zpgMnS zv`UWE*Oqk3s5P`<`j-j&Acisi0&S!n3qmEJ6P;HMo7rVq^g1OI2qLn?7s00}24;=C zI6#hiaQ8bO+miAUN--S`hT)stvcBPfoa@@^g_FAQw7Wh?Fc&mupY`U&zGRq6Vt<}N zeB2=fz3{i3AS+)7QvaG5@Q=Ds>^J&iK%IG}ll8ZfnO$J8mlTO2{oHPSFTDkfc;Ti? z9nyh1v0sHs>VOn_@XawJfeOlr&XblZRQU8gVutr3OE$@EZGj9m(sY@40u1 z_OFL88nk%AisrC)?ZZl5&l-#>exL|Yhy86v=z9=KbfTAhyg!+aVlNL+ORgJtJMNyE z@C%8P7T5jk5eA*yzF443t{d)3s+Rc7b>=hM^6PbBq;$Q7 zGR?D83l4=f?#_>_L^#JZU0`n7bTcB#UGh{+N2Z&nGz$a-Z*U|$wJ`OND;G1le&@KW ziU@ODX?{s`E(K4?!6g^5`w8TXE~-aMkZ;J(>Eug}h~r`7>C27;{T_}&6GK~5%#4DF zL?wE}2kPnAgnIu`3%MZ*`q=+>yc0o$e*f9SJGj^P8kr$I?qk2TJyvRVXRp`&nPJIq zL3uyj#*ZX1yQ4EsifEoxRgtVZNz5bPJ%SlK=Mr8gv0`Zlr6b%GI6X27!o>8(c~v`g zpP&p^YM6A7d?b6AQnFEQVkrPs``4PTv*BkRy98{#+Kby?3TG zrkT663T{}!+$Vo3cvc!Bc5`~Hvg+VQuvr{b_s4>71G%W2)jX6!6E7`w7i7N!C(!32 zQ*19|lfvoD@W=cH}5=6VcJbgIBz4vGCiz-dLh!$}ULCaE=@1 zgpQn@eTiiq#mH9^+wA#mzCIcdPMYyp-=n>nld<)At*wF5S`3kD;)Rht%ug0yuGGDf z@3_$?QxD%s^#7^cC`xgHaX7FAO>N%uF-nTDR?WcijL>M=)Zl>vUHEK@t#$b2lIf7T znE!f+|64nu`Bf5(GDi2f895uTU*lb2wY;ZxU(bOTc)>ctnG;ge#ISGr;?o*syeG_@ z)E6VDJm;$DVvxVeEi|9eHRjzCXC;E?&SP~uLAp6INhp{c?mKYRv~=%v<2S7pttODJ z#0WumWfp28P~vr;78O{PVF#~WgJ~?zE;F0&g<*xybbT4rZ)H-l=pl0H$vSWuZ$A}% zFkbJCezEbyZ$}V0W_7tK0%f0i-bxZ8cUkUSV9oUl+59OIcUN!UfXWx3^oqGkYzk`8 z4;JWn(2~x+Kovu2@Tm_MS`5(YJ~i$jaNo9+$po%JB5`|jX&_S-2yDB=Q5q^C);U2< z`CZlfc?lO2#g$p6t4Siq5^Wt+i7UI)PYkzZQ3^ptc|L68jnKRDscysoV<@6?H}R^U zC_g)ezL+F!oP7g6T$vRW(Sb6&lya3O9}RDAoPpZD?>lhh7_fGJ4_Kz5mh{UR-=^Cb z{Ne44yOuHdaz};WS=dnhe@*v4{bfGd*e-JqBMGhQdkOwj@7`1WGqpxxGg7xwYb=eG z?^HidJYt<|7CWbP4R74t01T#;uhRBByZjb{)-HK<;^@JZ%+z|v?K7iuAjs6_l|+_Z)7SM z0hjnF$~fIjdVwqZ!um|3h)uV%HU6)6Ti5uIv!ab7*g&7;M(dC(Ng@#QBEUj zNHI-#Q#qc+T6DE>{uROPP??9n6r5a0=|72x?s@5vwFZ)DuL0~|p!|hdu-E`uEsCIGZ*0_#NtcchVgCFC(yPpN40w`*|3^ch;^d|7wea*= zvU4ZhZZoJt^sLDc5^j>jT4l)R#qd*|jZZcU=R+BsH!L0Yk@Xj@iH)`PuKQIeNs?fr z#g6fUNU%}3I4WXK8HHq4W(%&wG06WTjWTr%2nKlq3*_^J&uUJBkK8_gL7p}A&~623 z{YHr(Z5G{{W;Oh1OJ6_@_pnG0&PP<4mb=l3q}|#x=8EM<_6809(tLbb_T}i!V78ia zt6fwc^nBSDSL~@f=n~b%q8+HTv<(8@QcnaE>V@&f#jY1Ge%X5|5;+90j?B7Ej$dON zQOr!mFMC6v@CnkJK?A!IA&4k?nJT)3wh~^Tme{g9)5{K*;s^V~2;yhP(yi&Kq!$xE%+kneEFvJPabtH1v$yY>t zvi*LZBY~n;THXjo_s`|2lOf66w$ZX}Ot5m$6K1@tXoF6pP1Dx6Ux={7sJvL>qx|SF zzQ+Ei>Ap>8@E1cKH$@DAB-Pa}nx7xwUZ?67Se~!d7e5%@`(E@;2^-)O!VN)e5EjkkqZ zUde3?5_AMBs(X2YY4OQ!d-JBoZrfevG`=?6A0b^ioeD$`w7^;VvFtI?!(z4Vi`E@ClM{9?q z)wQf0kn3^un{>nO5*k|NWqJM)7PRQo@>ET8tsboB*Fu*;7|#nP#!rhc`#S4vUf9Ca~}j?Yoe zgh&1Z4FYtvk;hjCX9LMB^hSP5Irc)B5iz->Sn8(*aZt|3P$T9$TvdP1NOW+lnI(C^ z#h^>xhJ#TIj<54+t}08gBN=@8i;FEU+mDzAsJ2A?K6V2m0+uQtpklE&8fEVE>BX)Z$50GhV>*ARJRx zqy&S&g>x**a`_owA5or-|64Atfrj5DG(%}nE?KirC5nSY2PAT_J(*7lm-`K3&rRXN zy*laSRAMS&LyJfglWnJL$)-H-*Zki*jwwC>kKZV7rGLcaf(T?XCr*f)>$jS;H!2BB zRiUE3ywxl?*+wfZRuy;DGt8=u=2=>`B`ch|ye-aV{uXG!Q>K2=Xit%`4UD*KFbCR} zFtlDAR7_4oHBoLjU9tHmWgOTk-;3!rs-5bbJ9iMV9iKx239*U`)hUF0;&MB&xE&D= zhxxIz6FI0%y8XyHoN1k9wr~{y2!=FLnw{cEEj(S)TB6^0D^I3f#(4j|%jy}9OD{Xl zv<5iJs+Tp!93>MybDirDL`_5RGnADc?vz&ZMRRDV;%5wK#IM@(QMp(Sw*6qlvzbdjFKm@`L@(H>_lGmR?FeMKis@~^>4R^Iyn{CQ(gJ1kJ3)!(nvpox z2BFz)TUVDerL8lo>ym=6$lu0oN8qh_Ftvy6XFCoyOYY$KH%&(aBQ{?QfUHgfom7yw z1kaYF5pk)zgO)xAML02F_ksV1x_g=obl^?BIu}82L!xs~bhIQJs(s#Gj9vR}kbX8y zSten7XMYHRW2aK*#7L^x@&Vl0Q2JFVlC_JN`3=MxCbxq@VzH^6{;?65=ZtDMm*F|1 z2}lUyLT~!Fn3KK-$t3$mk}SGr9>22IRvi~4Jx)_0Dyer>U9@;N4&(&P;lFi%z4OeM z=l5_2y5+0Lzx^HEVt9+9>Nm_`hXH%rSe9&b(T&Mv4wjZs{*&-@f~O4FETcgm{3eOH0#te3e`> zn{pmD3M$G=KibaY`pO}q z{@x@PSjXc4SQDpwn@T4GuLE!xL*3C`Rdzeh>#2>gL5rhH?!@im9PU&`$0WJZcEXVLg$U(9}>#~tUNVj8TT=p~w4I2KYTHR2F`*A{gpz9(c&vs^1 z?pQBD!&O5Kx^1oPE$$oYXPBXNfUwS-?i(1P42BHFuEYw|pVtj##DMm2&P~AXIN|9c zpDZtP+w4Zv5T+j0WO$gEu-507HQrw7Zf<3p$>St zO@DyRfgxL=yUCWpJysN3#E3C&f_%lRKi5iL8KEk7z45mJ5J{U5hA_%{ZtMSs135h) zTMns$eaJtCyKk-r*>kVNysXfbC#|vXm^3|W(GDrWs%L8KmSiLU8XZB0OZ6iSWOXdv zPU5#|hB7!v9VR5zvJ&0Vt~q^vwx`0xMhMIX;@^QR`mXe9opb3F^(RG5pPQ||#-pUw zMHTM|Dg{Z2(H#Ic9J>NbwQqc!pu_j;qIEYI2N=$@3AD@8=kbemf4BaKl7JYmZ~SPB zCavzv?Qhr`A_E!J-w^fv)7X2HkgLGg3L*L`1eK|(IXJ0yfwcgi4aO-v*A81m?OUJJ zW!$n0IBx{WPQeRS7pBeiGVJt{ITDD^Yc42^t69=aMnituq9)VMZp>|qq)57u$DBL) zed|Y9nd(XeX6^o!Ri!D}vBU;|CPaYqN(b^HB&5GlCS574A50^wc*bz{FB(eP1X!5M zE4>=<=ntT|fn(Tyu6)Hp^t32ewa&}t(lNq2X*-6EikF)MvjKaHGkBqq&eCN3S+bf( zwHX_w;~`+ZD5>##_KfrK0J<>nC%{Ova-@!y-jG%!ObDZaX{rZ78L z{K;{@Om)J$grPY$^oRgH(yY4hXpTV%lP*g#rrAhj8f)gUKvarttPEm-ANH^h`}iBm z)hNP_L`qaa#wMa|yh7d1e_&Nk{3u_3L^l<=|9FH!!aX>Ux`X;`E~_1pRvYN(=~G&v zD$pfYam%og?eP0QwtW|8>~~k#K_ft=N80vdq*c@K!Dd@Pl1N&;z-xTdFv08nTb)!e z9T=*f<4I;47AZduOOwxgWxug~X$>H>$F0>dbmsuKt7pF?Y@wYyu0??&$N6E=>KEcg{v#A~8Rolf8Fs z^!xkpuo5;@;s5%3|8iqz@Xz|ybO=@V5_V~1Yg*>_{q!H#?edIM#u{)L?6^8JHzRv~ zp}^UreGdI z)wDo0bxrg6uwppcG+9U#CP|iuq=d_aWh|^P#jL1+BO3#2ll|a62mvp(4~3W$7vf>1YUdwZ zrdy7=Ge9zhmc22fJW2D|n;gxwh@4jC+5YB(#&lDCn4OuI0H`)@?*|&}qv^)U=ld{E ziRLFZ-wc z;zr>7KaxzX;VfJo$bmezz$M};)YZdnO?wc5m<7ud6RJ7v$EL6dvTZi=QmVKp7V}{k zDDku`q5^Qe>>sjRN{3bd2(Ft=lvzOV?)D`#hdqMj%cl~y2i0_~5|x`!;qFPn?fv2| zor&BHUTm@~8)XctU^9MxMGn%5mKo2KN%N~FVVL3*wVu}4Y*eA##Jps_&OIihjVzGiV0yVdHx@-np+`(kT?(7_+}Xsr zQQgb&)}5-KmyWX1C##%AA!h=@lAg9u0Q{p|v`wLSR8dx48ap=q7wJ2^FC`Px>*Gq@F%-RdX=v@( zrs)a&`)b{g((1Wj4*iUzLI;l_h&b!{bJm;xoxOK~YVyqYM)&NQj=P&ms!XLSglVlZ z-43D?ky|cfZKaMv+R{oz2wrB0fDkca?#WcDNKw!-$|aE0qC`Z94j{K&ihvO%L<|tF zi4aIgLK4DD5^_HecJF=Gcg{Lzedk-}eCzCQ&04O-dY|`wp7-@l@;v|N|NmVC3DaY$`QvSiRY-%+eCtG}2jJuu)$$#(c zd>syJObfjO3)>y?Vtk2B|4S?WeG%11TOXF2SWpMj_0NGZo$-+JQXVaw5N82)3e;K zcPu^WNl@s&QGYWX%sB>8dnEFRnU%BTO}%AmCd|C}tJvb=gQxv*{@t0> zG<+R)8}*Nl|AQ~*e(9QCqZJ=IxE}h6e6$GfT)rHMAKAuD$#lQ*iTxlW!4`4~0ZL;gZmFyW4ZmpiKldOtIQ#WtgjTqX4t8<>TT ze2TPtADiV>dA@iad6F@~k6cLh78(!S-;m$~04Wz1~whj)HR12x%bpIuFC5%}>W@y6VdIq32^mRWp4KuhcL+ z+A${G>R%FoHOC6^=O^=|MY_J;u4pbdTqX826v?~Oex-}^t7Y0Q!z48uLaI^(1F_ZN zckvRlzQ*NE<-#HNm4VH4yJx^Hv*S&vIlQI9h9a3)=82W5thdSAob7Ltn5$Bm?Q14H z<)k~%Mv^d!%n@fLo_|U6BXPu#dk%iueo}d306%G+c|`#U$FT$Eut|z{04k$Bm@1(p z#c*>KMfqAs=bpcW3R}-;9kH@BQ`dQnCRHa;HwJ3k4V*%4Q(LYMBw9L>Sl%0(;^NOT zdXS5;Q~@fj!Tf$?;Q4royURSFHI8p&`*l8{b1SsNZnC38QMH{b}mrF2|p33Q?&pu&il|NQR>?R90UW%5fjwOz@A- z_U@gZFRg+ty&&fY%NTRVQI9#Ib21+}`^G-BJW53y7TG5Z4>gKCXx3dUOB1>3%^^~I zU}$R*<}o%d9QQuc6cWPSG+GrEMf;YxoL`!>xqrGlZNY=a9Q+$u3-K<9t){8mOi`>D z|6P9cl$_28muREgj?u9Z&dM4*)Ml#V$Gj`@xhuj)IkVBI(1)=Kca=)@3AUW${XHVL zm2q*jMeHXNN(f4!6umKnX6`(CB+ay?l>D6EFKz-nU zsU}i^%XRfIzDW#0^Q%an9SXZ!K&=etu|0oNcjk=r)UaIa#8UKTZVci_sK8u<4q}~P z#$37Cq$7_PJQOSyy3;?9J=d=59wJpuzR6AEUS(6Yh!NQSKv#d}Vl}q-*E-#uG-9Ep zZe1&eUfi+WRmn?-M>Nk$x9&l-%={4bbDIQHvI%g}*V};t{e4~s59y^0z4$(|tWA44 z{{(6nHD{64T)HV}??J@{{l-vd`mluc^B|_^nIFE!=3yyr=NgIaO;5|ij>ip> z6A?6&^_8O5kj$pLT%C0pELv}uR4%|tx0(>NyA^cBWr`D$U!X=5a3{HaDk)aR>$KoC z*%1?@o~{Oe3G^*}bL}<>N$_`?nL2YTrk$(WK5OJSs~oS@0AzZF);6pJ@m_!yaQkSB zIdN~pjPXpH&q}&9wYO70372`As{M@r!aOX4%*xT{tMi!l2<0QvMGn|Jh*_t#AH`na z4$}xLkh@wdOMQI?nG5E-MijYq%jE*wHjGR~@lM_dJ(o1!H&p|<$5u53F!grjB1-|; zGaF?#|5o#5zZ{m=*{F@3VjT1ZsnpLJNkKr9%XMFxZAs+vfF3t%NiZXJjV&(*eu(8F zJTpcJL2*_NqIz_5P2aMGk;N=1LG0LDY5tQR#;S`qm2=%X#A4+w46cM^bpvt1DFA0o z8NGS*#7%h&dY)kV{Z2Hs4JZ^d>pQCyt_6f)Zf~wEzHCuLfX4Z8dcgXhi)J9q$%uS_ zBx*&LceC5tZN2Kn7nZ#U>lGd&Q*Hd3RfV>os!g4gYdFqd3U;e#^a|?7CFA=_mNAmH#h?z@Ir=JwW`rHnh&r!<#hI@P_ zh=Nf~iy;>_yCx>Z&iGE9Ev2JoA#Un4u|w(Z3pH;HCNb#IeCM+EyH>-nWx1+Hv=2(< zGNYXz)bbutl6Qg#Tb)lvCoj3%|MH@OIP`KeS5M8nd;Zh^&;szs@VyA_#5pB--n|nk zrRPltXy;@ZJX^tX?(%$9WQw7bVEk~z9^Nf>g_CiN!Qc0-ryZ|5P@F$qt>FlapDRYG zC%9WVrm=_!2MBY^miLpFe>L=qyQGp0@K7ZhT1tpW_j~eCjQJEJe zKHof4LU>L~Fr?4?fZN-`zLak%O62)^Y?p_hN!Mavu-mdA-?!+pm{G5h*lhmL1P^Wn z3VWua>YtQ~F`(Z69Sw`MDDLrFR;iL@F13G`C|2t*WYZa!sQ6%3gEN`-I_er|i+o@P zUwi82H0~|s5lLFTXoRyGDzqa^YZp3+9I^6=0)Lk@^7CM?gRU#IU%E_HT7Ij=x=~-9 z=Wfww8GVnTvg+mFzi$yBCl37H40dHrm+W7NM<&9D^2LrG@Au!r-@=r%U*iOo#dwa> zmwWvEXY$P&Qv8enC>Sq4%kT{y?VMD&GzfLwwi``5Qd~6?(S(zL7u2%Tod}fshJbx3 ziszByZwA@iM*^{mW={EzOPN2?J~14bW)(u)0YE7H>HEib7n#UA_O$mF@j|T$0>@D_ zhqG>=o>qGko7&dneexNQDo0xv&!(E?2ceC##%`&@>@?IRxpJw{GaejW1yAJF!3H=D z(l+4h!`s-Iw^Vsr} zx(r^Dc&#FiLn6UBHJIuNwC(b|j=Cv5=Jmrx<4TL%B=dV&F`L&bvCeREZ)lQuS|46eI?Ou{K=Q zR=+FEih*Gwtj6v)Tr#l~TVj)Ou+cb%Y#oH0TM@sdUE_TI>+pQ~&EI1r@24H7GrzWE z`=XB`qo=edOv%nC>I)Uafp3&4odrN;9h!F!NP$#+aIIYOaTqh5ltl%nvW;Q#AOAHANupC0|A6$uXEb^dIYkDtCcZyu7^{8_R~&_ z>77*nPD~CvAY1)@T|f?u=1$2)_;#rB3W@!`0ejoO znP}SzoRRwvqQ$-{ew=z?U-$F;={@LV?<6!#XYJTTphh_(0<$&7z({?Qv`-ny9Fa}R z{J0x6uYSuM7|e%H4r~|F7Nv0VyQtg*eQ!t)f6-R&3q)cMLfudO#Q_s}G*vG1GV@g3 zS0T66%lT5t^N>_w)M$Z{RUX1v>Vx!hjwS$F+O4I{(3P4RFi+1%Fjk&hTl@ieZ|)j~ zlBo=4IEEtjtHEo9nR{J$4X>;QyHw2hb)e395lH|C|qg{ybGlC4w=pA{NU%tMhIkQa znFoaV_Veba{`p!jL;3tsr0ct;la5vR{v3|n4ukApn+_Jo{st*iN&bXZQdyBS^LAhq zRXRaZs2!WE|HAR8*gDVDg0^}h807#-+!`fUIGR`!{A*Bhh?KiJ$AD@}*~0CUj@NyWY2VX;?O zv6Z58dDWpBL;=j{Wj7{WD?X^I>PuTlVmiNfozA>K&dn+uF89qQO2T0?$Fj~BHxk1euh1Rb+4_JJxEF9DW>Lc%kaWOopRl0(Qqr{vK-C(CE8! zB@&K)SDKNa`k_X|06<>W9J`V-wZ&3}h1E*#%LA7}2?;?98{J(anyNZOAkz?6U@Y?0 zZ4>{d`p5)@#-aAs)DF_CoU_f1@j)E#?TfNO^D`5PF8krphJ*yxWA7nkoptIALggg! z8wzlHaig0U`$RxhDrW((Xj#H;d+mUSm~_m%EqA4=FtF3d)Zswkt+T0Vf9HjUtsGhz zRILJ*1t-l*0FCEAwYg(U=Y`g@pO_{-76IMknJ3D*)enzy-n98_oatW$H@1HfdmSv2 zuX`X_S_iZ+897@#`3`w|((Uu_gTV21ABxvI4t}LoWZyYXjic%1$-}SmPrxZP_)yLw z1Cv~|BME3dtW8BTmI{-~%+jQ+#^g^6(0-^-{ha*`m|o-XmLPboDDNR4FG6K_X~_wR!$ zr8-|8t_Zki+4vsD^QNPQbRV6?^_bWQucT%}Jg0X*9jOC<;k+vQ?CCndm z9b#pHU&@rWp79q_Vk?PkQ$;QqM9C<-*}&9zfO`|CgSG~!M++Xd^ACf+R4&d45*B>d z(qtFpwg%Yp(i%Y6VqgwHcB}8^LM+0rZU@OCLpDSB?`Qs-VRpIx`X%jKTO8~0iZ6iW z-R+`nSVUtVoaC0lmOcRdjv(@1TGw!?xk%?58CNYmD$yB#0^n%|SO*i~U#dP;#F=6j zUs{%q(b5GDvK#Y^fJ)THUfvv_y?c=wcW_}o;<`Vmqiqh$^R%YQZPO44D`-@x zAn1{uP{isLztX*tclyAz`=1`?nbur@4b+4Z6c`Fy79t=uFq>eatnLUd+8M#u+`zy) zWWTh2&*E`6DNUGY#_-cy$&}BKEz6f{lg?=i4LHlQ<57$N`(SAqOr_k&dy*#jII$-1 zcAoNK#kAW!{L?9C0dZ&>c9N3Wu_HGDqP`qb^S|??5?WHuwplVW_6D8KE^=I8%wF3D z(?p23_}`;_BsvxneY-E8QtjA7yjA@Z*l=A5AC2?RSUQFS5yF4rrZF-17h%!HlEpN< z`u(M%QdiMGp)#sTV29&{_(Q@Nx5lDh8_Bsj7TpIqP3}hX*Ze0v(R76OZPxtxZy-mE z8O>Iq$IF}p0ldS$S&GBk;MvOxO0mDmOFFdFV?3ygi+6**;~GQXW>ztLXHYn*JReAW z3#s0?y+YsvQ*pB@!8NzII#=SxQ@+RwmXy(5$6HI_#h8}pB`LQfDEYHVz|I`LDAPHr zLq}i($($q}_;q5ZLxT+01z~{BmV; zO|@g}DdSP_ek1BE*TZ#{(WY}wlL~Ie?kgAsSy<_$BqvAn9kryH+%12UoSZqoa~#;b z5JNiKE4J%VFK5U}esAed) zgee!B8*bj*6m#Xgjr%`!;ChdNJ8pa-eL;dQ6%7QqD=@4->pb_!%*5B^9K0shdVN_4{Bh) zZz1Qt(4~ErnZf*RY6yk{TLQ4b_r3_=R*vO2D)EVOM7nW^`eb{2$Y>r>Bn!N4f=pk^ zX_LMv{dFRDR2LN#!n7S2kfT;=l{mOiDvxW7TWUOTsGGEwC0qDfTEUG^<&oAs5iJUv zdMH2yQ0^GwJ@I|MQgir_d<$hJh;eFVWIZ-D_$sD6KnTMqgWL<;(T-s1Q)wRSt)zI zg;2uT3vJR#^Mp$J0}oq*pN5^64rN#>%v%1Q`NcJmb56!z0hP{|xUiugL(hk7%6Z-$ zFY+{OJ%1$SvWC3bArJ5kiBWn$8iZyV<(&@=+kE%-u!JF_b!T3nVXZ$BapCpxit$Z4|&>hgImY&=}pv8>vEOnO( zOtjOWL}UPR#KM|lWAkbg)23nzPORz`uG$ELWtXd(Dtp4)1b0%rX!GCgXE|b*vf5?0 za*iPrubS4uW^aLwPkK%>$jDV|!%6S0!HsE2_B*e~;)rFP3qnxo5RpJMAq;(2_GQhg zVbQ$S(NwY7IB%wVmol9AQdx8LBATFHHVku?yF-gLHzw`cZ>T+pl1+lj**aH+T*%2} z;BZfUnM`EE>U{Z2%B#}In5*`}8uqOL(&w#=k&z)8v#(Pz)GDIJf7yAQraMa5}Ro?sX9 zGXWd5-D`YPrLC@wQ=FT$7BX7N>q&6a@UD8=3~u-n1Rf%Z8(^t0ju)M%{-&Y6Xaq@k z(XW}2W~?QBm?ZAOB17nvSi%sIjV%(Z2ekI$aK0(fhtat8tS+ee(;^-L^FU|m_A|2* zuk#GOdm}V|%wsNQ&R;do8ANSEyD>yGoI)?;qW!orjNw5xudaeKOR*k$IQ~Nbzq%lc za8_6;d4qTiIkSj>MPl6^?hgae?&*xWb@Ke_A02Nko#H3B($ktMVOoStgo>@CiYf|# z4qjl1?1wl5vQ2lDvrqhYgQs6?KS3ZSO=sYJT=V_T=BX{6GpmBNIg_>xEhK<@1zR>V z*HB@Jy~8c}-2}0R_7#&^d**0rvx&8ulB?F5sV9($9{R^)oGr@wB?xhGLjPl)@AVlZ zOA(;1&}+9mvjtgjH@MsnCl3cUxVWnsJ5UX!RK+9!K#}!sL8QSV#o zZ}>{R7kGi0j++PkUT#vW*U3xmus_g!Nf`YP)Cg%DadEHm)CnrFu)B4`4!o^>)KDE# zIhYp=>2`V2FOtqQ-Gracb{!Lob2ucnA|g4|&%-H1si>c&gM4u)EP)IH3*N zrHckQ@XGb+7vIp{y2#sy5_Dt1OhWt9WV+HCSl3UGgr#nF8Mh9YisT6(!(M&|6*Lfuy48Q)NKrV^dU%YX^oW^b&EM9nGPADeDq}9MPGtxo0wYvpr zJ}26b8hY7(Z4KpACPk^EU!~r?Q}G_C!VfJ8 zU*dBpL7O$SFHHItOmn;%-55<;JDo!s5eZvDN&~VJ*86vwPu{$(;XZH%yeX zyaCy^IWAr6IOKinL+|XMwyS$S7$mSY0Cl-uyC_@P=eBH+b(;CD%qdJZZmu~*?VXF~ zfYJn1NvvyCQf6$rb>2E`R$+BxcB8ug4+H~-_LS0D7Uen15tKO{uEjMBconl+<`~rM z5>rwXh7yCLu9{+ZZJlAg1QTNBapv2W50qyyf8@ME>W?XUCZe$`yr|>^!&%`4s3(L| zfF`;ZLPXKKzKqP(W4R43i8`Fxk!JtXq%gg)G3#-j^d@HbqQbAXEUH7fa}t@zj%L}j zi&^@<4EJ8-mALE^?a6HpIUkVJ_a(am3?*FAY^geXcj)}Q=iVBuq92a;GU668X2yI9 znmz|C;dzm!lHfch2Q$%TJO6qW@f?~2nmRyXl`lT&&H>Ad*z`pDux7y3C>*b@1c~xA z(&<+I`KKq#`anus?S{<5Q|+ziz%031P#R;BG#e?_w>~j6S<6#gy*`6Ioc4gXwtH?F zGXbP^=G+eqR0W%ZLl&k5TagG@NTU|oQ)&O!nGnoZ++>F=e9a%)#^C{qOUJfobZ&wo zrQblZ61`Q3&P8^dSwLHaBKFtRe`CqR=DE*~Doqa^K>b}f^pU5OHth{4=dhkTc-}Wk zE@qb>ytc3N?|e$y25)0^j4XBmo{l+=u93Y-%W13N1roM|T;apQbDaI(?chZ0Mm-X= zjNth^$4Y3GN6dC580{6u(lv`S-45`m)ffXJ5jC0aNVygVqo}usp*!057TiSU`lp?U zc}x51w`gDrRM{7sOC8P@l{~>vUH6@>duY!(_p_3(6_*kaxD37ZZzN#aXq?Dd(7WAD zg^-(qe${fr5WI$W6Pa9$FC(2m8s8y^$V6oZvI{u0u5=(`Z@=MT_VgKd(u^}ASFFFRaWMcRa2?3Zm2 znfm=R_F@QClm6Wx6%t4j7CiqZlMt3{ zZ(wgn4&VU(lAf92M9z_)`ux@ABsX7Uus0EhJaa1~5G;0n;@OxQ|6;DkdI5TS+VP{T z!}|@%lXzddAordE_}bq;{iXGX=bP1cfaNS>Nwb3Pw~h$E!*$zi?go;KAT*3O`MdLX zBRa_Mhed%R0J?h*_k6TUEOQ)XAW@wtJ>o$B<{e6#dVF&#Txck@>u{;|smkTbyy_yF z=8C#+`eLBVTFredey^Cc&qJQptd(H3s<$Pbx0r%6&?PkwB3xEaeTKocQMxU1M`VvB z=Wa;&q+ohQ=iWR+jvOip%u$|kpYyKG6>Qc^{2~ca%oyLLDCJtK`XW0r2vg147i7NV zv^F6IvW<2L{AzO;8`B;W7xBRoJj4yE82yR8IY>3M8WJse+4%klBw)Mbw( zhKXF?x)9LtABCYd{1QVP%T1FFw2GocvpC&1uuEn2MLb!l(mKV<>YX|&ZY<%W^cUQN z+MtNfWR2L#j;dCdtb_HXcl9eP?)*LG1I!PzSj-243g+d^_i*9NrsaxHRnBkK3R#eM z?ZgB(ZgQmwvYOhZd6V2!qy?|F+wB|aAr#uOx!uyIn-jevix$}m6omw6^g!}g3P=M}EgKuyV&KubFhIKiTN5f<^NQ;DYy zfD6W5fA1#xY^hd8<-;i}dICg>BDt~*)OA|T_ssGu#zy-X2V78X6DYuGe>tRpOPdnI}1uwrsKRJL70GRPPo zDmusioVi|N7B|1#LibnIbLg3o1p72B#xpjwkF$2Ti_FoF%XhJM@{O;C;}5OH?sO7} z-Va$_>NVGTLrrd7!5|tlMD7I`LEo`hm9u}`h&Y`$K^OLyK{nN=1zAG;#|C+&IY_9U zb$Z4ey1_W^nW@f`%#@`gWyo;fop*#;UnmMfCriUQbz5cOe+s40DV~11wQG4N55LVM z=PWMu=+7*jS`~9pS_ut?o(A3*Qw#5em`Rzf=%X^tdO{vi*>9a6FVt^mnQ17t0}%Ru;U>JDKX7HBmzu-rv)sEA`6OWK^HPCfJm4z91w~Tr znvzG=z_mnxe!fuC=&ByP3x=xP&%X-1^AVScwJrjZ4aspv>;+T>T#U++bXA`0X|9 zZuJ+keWk6Epix}PnUVS4ngs8^;`uhT^>aBjDtZA|NJ&-{dB2o*RF1{@bEz$jNp^D# zw>>YSsU+xph;{J)e6|C?z*>J@=)7z zcT0jOXV@W1_k5FNp?gBK{4^tHpta0fjpcA5K813^t#;`Q4G7`(_-K_F1 zFP*+*_I%R4bpTYl8||jnVaYI(MGPhpTBLQ{Aj0zU^DM77A`~8)0^r1*DqXpGphOi! zyoKBAkro(rUt?32G($WBi$!f3ef-?PD_UvXr9Vo5hW)l-&`va4QH2JL6Q_ zCsfiu(1_WLm6{e4^pPjV9M$3Mi<^j|?+ms2v$k9FDs9dh?KNddk@nzKbv;B|Op8+<62ukMJ3VlmG$~u_q*~g+Xow;!yo; zGQ@u9I8|r-$F2W+UpPCE>x`~}iW9rJR%GSADRbV0C3BS+l)!1^T65d9qat0W4Q7C&dgtbl0N06Y4~BkD&2V*)AL>jqQA%;MMFbRhZmpS z8Z&B#i%2J2L-p6|r*Cv4d~WyDFG!D5bITS3CbXiu)z*DY6SDe1bC0bqX-iV~_5!@O z-Dmo1>~v$>!IeTIQT2Z@(j<%YQ}vmo$*t}lTRS0hHj_N}V!;OKdt)Cm^uw!npRQn; z#Idgu+P0h4Gf%iCBO}g62+p25@1j^|sz=e**L@cIF?Ln(nb661NN-{uGED4E?VE7X zyE{DsswLqxm-@O7S>qGhRkB-yvVWV`US^Bt<-Bb;swA;QbGwYWGa2f$UYxEvgKHZi z6ok(&4mi$zs+EZKebBeMVTLtREQ?`SUZtn580RBe7OC-J6vI?(uFuiro$}*hmo((# z^g`mwg>%WvJ$y~Q4qZ5>8`KsOWSDK-~zj1arBxit1f1j1HPDY4p1iV5cJu(h>~ zYLmP&+W1c7JuOVr(^Rd?!YURA=ibKbq9)io$_=Tgw5-%_1$8ErgH@S6F;GP#9h!`R z0Dg&Rs_48%g~8DDQ_BM!o4dzQL$Ln{^x-|77}EjORS|;TVE0rAQvS1Bzsk39sX36= ztWa(R4(&*vsf6~DRAYWC&A?!73s3Ap`6TChmhMe@k;RV{t3PMZ{mAeb@#=1ukbaoU&Ne^my< zG42(Q!msHOs#)}_!a3)Y*5PSS!%1W`^#e{Gaxe(`zJ5yYgzkP7uu#bZtNYBDLYu*K zO*U~t^D-IRDpQQH%SVO?Ud|_~wz{nOtj3 zrWdmc>I^ktYbd-Ci(VxFEL|ZdOkSx_tB&iP^Q&m+XTh(FEtLJp(3~gz7W2+L#&WbQ zjWAa%g8-2YxrGxDc~Y}ND(^r$-CxPlWTur^NXzw|6OwHej_s<+ctM?nG+D*Dc2l6O zFDVX`FH+yIX2qwv*04gh|_ zM_Hn=OzMmKPZp_Z0~efA}rfBn}PeMAlZdqcQ*lIxl70Pv&{c_<%%s`Pxt zP@q^V2 z@T(14?x<&|xqySF^ik4T?YOhvLT~}?9~b=3c@O-PB8^gNK7wM|J|%QSPqBf86lZ96 znLs$RnBY!rqCBqX+B}eU^VLfP(4!2=(SSwS*~{b@h#$Ku9MpP0=jpvMJE$Q|{XoBe zsy8JC$~<#4Y;A2>M={$^2FqP4q*}V9fzrN7N0UkRBih@8>jV0nvffEEe|MvqO!j@@ z7K_h~vk2uOe+xPNAi6YnX@863xMeRo`Q+}FYpjvy#}(U{9lvYhJ2IEm@--o8#Z@pK zw*y8LwqSN+o{vOs;=mLFw*ZB`8_*SrqTMTDiAdZJTlfXLtt6y8WY5%GC61NWCEyv zEe`gs^v$x$sxVFj(fgIdn#zB*ur4z7j%;l=X%g-G>tob$J(y<7xvNqzf;OHkGOt~> zWVz)fBeu8W9<=u)EPEa5$OYV>iwL}|v5Is3fhN371;p6J2-RW2LN%!$*aNSY6K$$s z&blZr7t|Efcl0wgy6QY|?IciCeAKBf{)xgGfba;At6!+jyZ?vR+~d}%VA8J!Ttp6r z-F{}`xcUCc8`A@;^Ssg2w&jeH3us~e7bpB__~81tNT9MszDi{AO(Efjw8ioNTISJy zz~N=}ppt^Vgs}r4!yAZJ^=xL3qv)R=qL&UjQUV%j=leq%#lD5jC<*>eThWHucS!NX zU;_6;=XtVJd%$!qC_#F~aTGufoF=QRTQOS7KhWte-2mTVp_ZOH1vlYmKaQ6jl#u7JuCv@;HQm z>^s`Mj|wn~!3n5n!p?#~*27jlN-#YX`p7r$`A%~;BJ_7TCC)R!vXpFOFgDFFNY0NQ ztS)x^I6b}G8aeKEu!r;7mJcCm=W=!|pbL#5ED!@VE%Y=RB?F~JG}Ux$E9qTS9Mi@! zcDsP$;?&aw0K`V@Snl5%V23t{h_a1WI9mYKt_5aZ-8Jt&f0l!Z1SGJOKjdNv)3Nrd zuKDOC$erq1WCA2m&YwfIj{mXlUa`$>P3`l?F<3x2A$Ipk5lmjvN_Ob_VvAcCZn|J^ zZsytX?TYR5G+nRS3$)faRi_5-%d}53Kt<{tr*Zn~O+}TA4Hratek|M^K!T?gqY()M z+|dj`w>3vGsb@w$0fqBlXUB{JP&5xzj2{Erb{uPN|Ko#PJIyZ&}%#xUeJhPzAyA3 zQAOb((j_|v z^t>9vqZvd^RfGZG7*gfz=b8I`ZV2U)U2W%F-0l=`&j`2J-%Ma=eZ4TOJ5(ag6v zYP9{13Q$*f9CxbY!zpLfdxZGr9l+uKNPa-*MSZB~`jdmDk^2p1U^_*T=I65;AE9PA!!66^ zGg#CYS&!O;gE1wcy!M`GG&W1hDu*kF9tm=>9Toh{AA7YB*jIV+ClMV3`0-}jRt~2E z>+6qXwN=Ffk6H#bof&IC1rqUWv~4P8HN1PQA9rKt7rz>73i0XVh`n@Byz{I-NhIK1=sfdK60A2RYRn znpwc{APQ3N+EU3uA8iX#y|)VkEG+>v_-d0+X0HW4oj`j60&&u$7z-U*sirc0OyzTj z7Mml<8^Ey4sL_j4zmkbrDHBmXZ?4xXz4G=H{#d-H_*MeZL^2y5h_To@b$e-Hh zpQwoAYI@8dWMGU8>Bl-aSST_)XTn!?T;#1bsGA(WUm7{uy++GrwGx;cD6}4QnpQ{H zfW8c?ZFGGH&=y>Z({oc2=nWH37KP8zWPUHU?l=H6>1eSDvXqq{ybYloNN0@nTSMu@ zo}iwjEl!Jw{Uxm@9f>6zd9Dlao(UWdkOkM{q(~dkTBdRthcmf6R`Zv;}gZp?bV! z58nTDNd@}}U?{rqBd$MHoh&P4t1k``W6b5Y8<_*oWI!?Z#7O zn~?y{i?RR8mKrTnd7A%>iT3oT^aE|PQJ4BueIR`8Tm)-ry(Z`Rjs{&HzF!u1XdSw{rA&@0brrkwOUWRaafd7TKVbUd*B1WdjKF>sZmSu~PO# z8)|rljAL&w)fIHq{U=_t)^Yl@tXz9a{upKbEYkWP7*F|b?p5PPC@4F*ZS|HQ^m%=T zTB&Jzh&susiT6{W79!kd{u1@3hGJejCtectP|m-cPq zuhLB< zvR*^e-7GQOm$=fo%5udV3jC?JTr|Jq`S}C5Vfm{C6uxp89Rvti<^hmhv_E!;bej{< zjE188f%`Y&B8yt1p)+TpP!;MCncb^MW}#!~FBkV(?pM&4&lH=jvlAlmxM>T=vsjlA z4;zJsU%gshx@i8|)Kq^E9bHM~=Gw?Jc!rjEc&V=iW06;dGDk>g{8ny?D*ywi$^SU@ zU+-<)gnRE_jC{8-ujQ&SDPK-Btb;K}rfEz&J(8OvN?z%a$-1=AT`b2};K#}cNW*D> z{0knM&p!OG>;Ty%YP|QW#wWg}PX$h2g~Kcob5L7$F*@Wjepy7yG&g8z0Tp)l55&~q6&P%N; zXwtmHkIU?^FTBTEDj%e_nZgx*_u>cC1RiCR_1k7%rAZZ$KA3S;7az&X+jQkobv%rh zlsU8~l4hBYE0bFu|IY`PZa+#XF zuUl4k_0F8->hT#-Y=hV^NVP|;a!f$_oA;>AoM13ho0X{5%rD=(UsV@o>XbV>;SHpc z)y2~A-!T+l%wpy^D*8Q`+{_D^$J&PGZiqkq7n_bg0-V!Ftvc6ju?uQlK43&niPch2 zzU7$?XbU+>Zc3r=UwrSVk2M>cy*W%-q8$NI5`mQteL&T`Qi8l4PU)!&wZAM`QyaG`$I?si zsO3a?2KBkM096n<>TO^tP`ZlgJ8AlU4v_9oJh^|SYG~h!qM((d*+_m~edE%Y;+wp##| z@)-ADqECxRKytokC!mmIZ6@-LhlUm;&CMCANt5thhq!<(|DTOxEZZQdQLViG?!AL( zQb#WGjIE0c(pMRg=hMYnhj`CYGq*jQ#-;;5RtLw)^`vd4j+c1ep!_z>;Uj4M%V+nT z-TI5TNukeI8a|L=vd661u?PQTY5e=o*Dd_&4*|d1)A4Ecr=1fBa~tZ!-5rhv$_)9{ zLcYr5i^4YTLO@dxD}FWyO~h&TIMBpkXv(T`qy==aOB}1WpvZs(=w;w(*Q6~}f71l> zs@hmG!?H(uZx{4kWD=fjwkz)|%_kaVeO#M%umEoxQ7F&m zUEM8w&-<0Dl{r(Jf{Dg4c?9nAeJ3)+O$1 z;=`x$SMnRwlSj3Mm?oA}x6voJV^z4!?mT{9oY{36vsO|DkGgztU=8Jad{>WY%{_{~ zY#b+NRhBW1>+z{(tX~;3?MPHphfE951;+ypDKi<}!TCv@P11sd2k3D<=IobEp3%(ry_%Y*M!3c5pnX z|E;|*k83K+_w3ppZKKjHRpJ7qs_in}PbJ!bEZNGoO3Fe=bzw_^5G<`CEJ}z7*^^dF zDN2E=q7+$@xJLv*1!T!4f+9i^F+fB}B8v$jB$sf>zRjh2-b}w)J~Q)X-kbM6pW?6F zbI*1U_nvcp-}C!@zYAz{Np?xIn(6B&dFL=_1mmfAD`%s|HMY#ptlA%38gRN9cgVh3 zd|)5S8QB|$v^Ygw>{-G2s94M$d`UAcAT?SS5Y!a?`;|?8%Y)KGTROvnakk|UF8A4( znzH!U2}+=?T3D?mL9#N@ox{|F_*mhT-uEl_FeFkVz|IOfM`C5K?Kb5Xan}T(KL&5# z^v`VNj&paA>`@95SKCO1XUZV-ta!2{LTGz%lCuVUliaS!# zb{es$j+UhTVTInEKZX>^Pe6$nmbZVL{kACDqg-;WASI(Tx5jj z#E8j9Qdh;x8>TqE-qFPdt2-UHS9Ye5jGyUZdQI}Z+GdDdQFkDdMCMvO61Laqio!j% zh}$o_bf-ecZ9p&iaON{$yv*hSN!!u&Oz$5{nO-Z_m#%x4M+VMR9)fmYI*6k&Qa26Q zLAXmhm+5)zajEhPeH5>8ca6MU2=sgE&h>U{s@1pA4EUB{V0ZGE=6m1O!hmgaz^@ZU z*h7vJ!j>kJM$Th)vJaxJl38t7#GK2&GE}_NHl@oxoNxqa!r2m~P?*i5`Y;CMGA#}E zHFaeeVH8$RK;=#ndFun@ZDSX~*F#>1zA#+q)b5yZYD#^MmjUC{91d$Y9JcVOSW*7Lh4|l`^NpfT(m3cyS zhVNKQmNogUs6Mo4-PHy$v+`<3JUz!^n#7CR?i9viADnLqJ=j^BoIwL8Hbd@06$)Cw zwscuNLgdI_y~Hh&Eh@ecrW>wQGosIwV;s{h>YaNk!P$5sruJbRk8v~=c<*{Y)p9Kg zCY!v1!^GUO{aW!#=zLZaKrjz3HAnwOe-zKuON*QBGZnZ*1N!IY|Dy~(HSxue1&Ugh z8WgR@Y&;`*r|&l!wi=w%huYUcu?rS)@_b$^BGhqqc#NzS#nD$OUe*=mpaQ4DYqFYU z9`Hlm@w)y`WY|{CisFFCt4Zl}h%2_yGwaRqoon~q2RnG809C^`+NU2C{2mu+w0v;w z5jN*{m|IB*v1x4>b+z!Wp@5c+bM=yEi?K|0>eE>dA;CsW*i&p5lWRTevcKD2;Qr9X zrJ!GOl8r+Inco!+^}$$_*D9_rQReViEeC9ex!Y|zy*N6O>@fMv0bhc&sD6&m;FyUi zWRTSZm0}%Hp26kgV*&x$GYq@Qu~-|+1%>@d%^;wk<4OKL-4qzn0m5?h(e^C=tXi6L^T`W4d0^ch_eUKtPY03F3JiPVsOoT%YZy`o|Q z)^&fRTUy&>mIbQCw+%fJkiLrMz3n`TQ{~4Rc}Cz(gLrD^>Ei2+=%gtU?iQ}p@7en7 z9d7w;A3M+1pKnu%$7gu^ZbM_}4RXu|$bqhp$>Skn!5fhP>Xun!1iFmXWqh@#lb}2n z>|50DsNm;45@8cUe0_mi;u8+qE^+^1s$;(>4%KH7)Gx!*`I+9=o?1+|I?4!=5lo;Q zxU?%{4Ssn|lI`m{PQff|mb6v4X7UF)cQDZ~ZDi%-|8xm>s~&-|(wn-vH&&hw+L^Y% zVP7{36PstLvwuA~@$lD`3>_~U)ud>kabsT|pls`TU*jOGlN%!Hx%`#UQ2nGn^1po* zhZ9xF+a&vKN#*`B&H2^D-W<)uqQs-LZ0=iW}wE<2|-0@qzO-Uf#3s^GR?ivL*8WZ0d4WTGE(z)hAlC# zu7vxL{#6q*>lnIoWe_lq3k}F9Xg<9f6Q3|SvT8qH-O^Z9tA+<4a0}ML;4R|(4q8G+ zM6G(EvF47K9J#3QHdlH~v;_8150En>@b&7Y)DKk-2)HwCX4bwu7n1>HiUFzsx6N$? z+vFMQATsa+)8{6=u5KcSUy<9412&HU&@g=_R}^qYK<u;h~sV2WnTshqr#oFwgIx&=fV2inXDv96h4tSt=A+B1O;f^BAkenUhu5~#`~NT zy~Z;=amv_z4O0*Hq^Q7yCMLWolxFj`;Y z*(JJf&%0{lVV+m!!UkFBt@mY@(?@&dSq#{@P0haD`%T!u`KB7=ce-VZ$Dec|Loj~U z#Qw0s7fR9GYg29cw{7>kMm{6T%cfdwi}Hd&OF;mYW_vIOr+lkGB39X+icOUl_*3>< zS zg7^Gxv3Fr6d}W)9@T(@xvu8*1xi;ll>a=+vdR&H0dhS5R&sRUOl$?~E7m8$S z%2C|4#baRQALbkd=U+yiGX(l^wovJuZIC(`RFMvm^c>V}?#lf~C46P<{sn97A=CmT zGdNG4as9SVo^nFDw-Fb7?B2Ao@Db&wHn@^KU&wjQZ#LDX@uFuA_l+6OnjcS9k=oJh zss~&wVHrND14DW``a_#??bP?Z;Zyk%r=y=70oPzV94IC`vKglfF+g!?A|ot-NB_F6 z|FR!{ggTk#mYnhl?29ks)!w9l*gcA}BY(8r?;T@49K2$2??02LUtvU){8kNOt8>W@4UJNLeGEnl}A`)C36?g*u9FTpW(g`z`Kv zvaJhzI>g$=Qx6@(-ocMv$xQ`3e74s34mgvIaDUk8`o4{Llq3IKWnw2>)*aejy2$Za z7&X1wyV|V-7YK4lID%U~8u1MJ3>^I_`Jst~HbXi+WK`aNA)kXjP* zwB%lHM!VzPW3sVYOd!>4g$U1YkX_jo6$*iF=tTwEbl#)qkOQ0{iA}C5ufE2a&bpbK z7`zygsG&RW!enaNV}3FA`L+xIOHaTOU9m+0vvY$nD`!WeT{m=kG?H6r{S;f+8i*6; z3w(vA2R4Q4qpAC%H<5G`uXcnVISa36_ECq-Ujx^|(k5l3PvwuYQfA-99i3<%6 zzq}DcJ)dUm>9-69<=NQM0v(&PiqKoNEH(qm{j@6Q?D=ae7k;O4_%N3>gfCYIfz|sL z2A;UD=anrriS#K^(($>0&CkKaaR^X{KdQL4(zIlj`OD6PPj22QKZ@_+OkE5gUb7`W zWO{d=yo`;w**QHp443~<&!Kc+oDYoNCaTHZlr%XP9lk>sKOVC(HmP**?$8eIG}5Pu zTXdZrm^_Fti07tMX@;bv$-baGov)f-Rl})zi>@v~64Q-6l)FP+SR|Xd&T?2-#AYh( zF4wb@w9)h1J($wlDbMA}P(Us@A~Ds}HOe+g9*y^o!q1f8IRr~%w@0hnK z`$EbZa20Rsc*C;FQ%b)1Xc`ZC(f$YB<$dApP>l2GrzV*4o|Fh7YR$?=H6P&`{sB>( zGtsb{`%#`F&2(*cp7U%A(74#I0GQ=#Q+z0jv^ZBY>^hS@DCnKOLa2+M zLrxvYE!jew<%-$LZ&c91=oV)4fk`Xsp&4*$-}D-N{#?v4P4EQl$>P`St?pePUO~QO zOmw$~X|vI_s0+p6@hgl6GkAkzJ0Vx1&9n`rGR?OzCs za4>A8oR6dT@IFFM%+=u*tuNQ>rRaw_Cq~D}hR!U;#MqTE2K@(l;WLu+7|}9l*P?Hp zsf<(gRFpwr2ro&X%}GT1&_2&uO5V|&+V8R4i)Ui=(ag>^%%I&0O`?YI$?@ri=nXRI zQV~AAzWhxDw0;S%U0asEIwOpBi;$F??3AvZ^-oZS~nz z?4r8k`Yk3%*HwfKQ2kFhO<0n5 znRCm*$fk>HtJeyr=rUB7*7Dr(FY1uwE3X*n@p>mqGNW?=`_O)JXs76hGw@wVD2S%F z@*Jw3ivKuZ(hgsUDEB`t*-!Ix#B$M=C51mHQjMXtwb9KJ*L`8ULMCp#uX5v(!J}Lm z8*s{R1G4Ziq1Nx9v$L0Rfl>oJ4}FTCt;QN*VZPfHu{2G&Gw_}qZSm&ht9aWD(9Hi< z4O6sBt!2XkqJP#&gv7sfoaA(U|t-R&U$?rZr1J#Dmq6V`G`U&DA**PO-oTp64K zq8;NB3)yVq>C^jbi@a=|Gsw46w4jmvM{3D;B z!MeO=FNM61ax`-l;EJkfKR-I>f)u4(Udvt~cZEFeLRkgC!!}iYxgE_To5kz`TH{xV zF0Y3yVtY*Ui!NW4g#ARnz`EPZE*tkPEL7O`y3S$v+*ylvz-zuSh2w_qI~po_h1xOR zaLy18nn*$Q*Wf(cGuIghKRJ;oQQt}sfyfMdMLFB-ANZX8((&MSUV|p)Y+Y4hxV)&H z)sFu1=@Ih-NDzJYHT_Z1JluUYE`<2$cxtpQgzFbaoTHJhgifp?o9GWHbLZMcM?0%4 z;CS(jkahzi^hh}>h5*n+oX+_{2xb1eFkLq{p%2C;`w7ah7al6sh+UA8Rv$z9)Gf%Kwq6uJ&_)xk8l=`YNW zp!8v*JK>;?2S&;-ppsT~E2r^;kaW%J%wslh)E%aG&q1D~cC9Y+;PqpZc!l6H)7uzx zVHm@PY(?81UX?aHyrAYnb)ZtT3UCNE9^AJCi@(~uSWv|I&d}_zLo+;y*IwUmDBvws z+A7yz*fIW|S`qhrIfDVMB15(9rgL@z)yt^l#zTQ})$X==_7wCC0o&v%kdKvkXJ-~> z^yh}t7EIqq2jR9R(^>Jp%3QH19mZa5deX>k#^=dRYZJJkeVoeal-b6)DMAb0`YZTI zIdu4xY*7DD4|p~P@lwSy%WhR)eWuxO&qY7q8!wKWAtv4j@@b!=e))7YN8U+EM0dAV z#>o%Zj<7)^@Hvo_Ax?s^EJADX1ivk^5Dv>T9Zw$XRF@hH5EGqYF}JA9%eKiCQ69zw zpQsfA_EF!Etx-OQ1O=U1GF#Ekf_6SIdFwJMX!%hy94XPsBcQ=SEm`CmMib>v8+|_| z12DyNn_SGcdIW6m91jc1-yuHk!@eRHN}(y_`kkK=AuKz?tiy4)0yh;dt>sPpZ-{p* ze5Tr)hIJxHKn*oNUHT}1w1a-{v=ZS+tE-{evP6zi-H$f(ARJ!a$kxa?q26glH%rq6 z8=OMAybF<@lb(ePD{SE{y4JI`L!|g3dFs8I!ei(eS^@__(X}d}P#?3D{oaVJg;-!U zi53ASE?8u1L$o9-rzndPmjrDyQgdA{+S~xD4k%SrLAi*8bAfMB1#xz~=?hwo&K8no zALU`_3sGunjV^!>4{LYXBJhN#4O+$vRl#=6j1*L4Ls`VGjDlKlTiZ)jL$xk|aJ~KI zoTfGBg~rTjqq0OlP8+l%A48jUb0&2uw0%Xvn$%4GTi$LFvg`autZ#1z7T3k>Wb~KvQH7dy+ zZjnqOiJ+S{IKT9LWnozLF}$LsGD}Y!?IPc*wvrjTBiszcI+iV}#9!J=jMOPiOJyb& zd)^}W8vmm3mMuM);iGPLCc8D~gsRu}EH}r^P{pkX=pnBt@8&NW-3e zXJFXo-0zg6K@_VM?}YV>WSB}CQ%yBH-!u-t7^;x$XCj*Ag3e*_w&Om>F6nu9$1+sN ztmD_zkBy(;!bTL`Z%q9;pxcrIgb-o)HSB}F@V-7cnP|?GqH1GbG{m#H_GZdO`qi%a z2vQ4PwSfVAG^O0s5uH_c#56q>aC7%S&GQ`7+r|CQ{P1)2aF{qZU*#)9S^zv8J#Hdi zMhI($`^`>IKEFDP@)(FxIcgsJ1DTeib8ZeSJVv^CUFbr+1|up`1tf0z zp2Ue}Z(MjFND&3oy|w@Eva+Wf{hOiVHtv2Xc6MI@Kf3muXRahkfl2+2#~r`iXZb`H z(9OviesgR+8<7fBwL@NcG)lKzl+8z18#+hfm|)o15&Fw73`T!qYgDZ$m6-P^$9~d! z;?^~mlAZlJ*y}+Y5sZ!RdAaz(_~+QCtT-slQr~_iG4dF5dWW~i^BufxBNnV^LX&MT zLeZF$o*{1%8f-oZtfG) zgtjUM;c47R%W=fYe2hEb;>*B(op-Q#CfRx?Bgc*V9iQ9TXhhv{O;)+uGJp~h+eX5* z4;4y!3M7>Aq)96ryM?s|H%WF0`1ZTg$yVo_2S8a*)u}yXFWuXyyTMy856t69u(Fwh zcwtJ{NFW{fU>sV$K0~+lgcbbi9=u~%jV$lz9@?mOWF*aXRKddvp8Sw8YN+sWddI&I zLbeWc$eS+zGj=~0K8|6tYX=_+Da|Kt!L91!5UQrUO3N!r*S>uiceGwa4lRJ(v4x=I z`tyQtT$=XB_azW;<6EkqveX}MALOd#-XNE7c`-g=fv?I2R#q!!38kTlM<7}-`>Hm? zc(!j|buvKdimH766>lihEN!z3bsi zo8qXIzDxr-VA%?8s!);W&95_`_*4^|fR;DB%H_lzxt+23V5|2)t=ANDs5NJXHuVLV zGm*_M{M0vHGR!@eHbsVJ?LAQ7AHMih2k1iQ8KURf?mno$mO*oY!IZ&V}F4{8wGLY^5B z$r|Ch$Not>lVGKxS9hkm4~p{(TH{dYzU=ww6ca4sxW|vnep+sZ=eT{fkh3j;!K{G&51=K*;Df{%#nfI;^_$jxstmDTeh z;3;U2`iKrOa~9vcEWfsq(aV@9@?JNGO6B91Zq5|cErX~9+c}bKVH_Av{@1U@^&3zw zTJ%~^j5bY8r%ZVN;F7zL(x^0W^1$pC(E)oIAJ>?16iu3~n6jTp$x%O)tnWwCzv4BR z3b(GBjMR-iOz)Z8b)27E787k;A>gt!aV`R*3d+ZoK8t)s0=OaXlR4VF}%gc*yKK+Zt?oYc+G)* zj1u$2-B_i6qGywfUu5cVv1@I$OJfIIwqC5`NzdI8$ZRhlJRjHS`7)sNHt5}6uo z)#F^qQ^Sj8fBA_EVx%DYsuXwlSrC&e;W0fZa~B%&#)yp!GC?$bMYZR+PsMDTXAJTk z;8d_A6yO8GCt?7WB*@obZ2(MnQ=Znlv9EGG=Hx`G?};NRXy6k$qz#r54t=&{jIF#$ zWc{R6+-@!0gDZt%yh}z%5Kc#92t&X(n?I9B(LH(ga#j#8XCuLv6foY?GuO#@X>Usdz!w`!j10t zq>UPyMPCqPqr&Iz>&4ziO~dz^i8`H$?ZIbe?%E2yR;9RDqN@k#(9n+je8FqoAqDtHekTmp3d zH>zT}9pU>6ilt|;NZ;Z&wwA@qQg@F8oF7A|H#^RWFoY&Ozk6?ydv?*>c3YDqsc0n7 zp4T(m?ejU}GgfDwXTdFH0; z!%Db`+maH5sTY|#=;@70-P{%LE6PV1=9@Gng4?uMi>C{_`5x8I%pW)Tj#MgyS!Uki zye8c=7|Qpy%#of+1mxKwU+(oxMm1s!7^|O<2#UN&U+o_VbH^asqC;?xfPg6cX>j($ z9O8o?^;2V(GA$uq{Z&UFCF;(c4=;Kqp<6%u3GI^o7+w^c(NbGk5$YA>E+JR{%c?L1 z-e*X0L(^Q7?JtgA`6$ToZNei(h9G$|jWt{o!?6OG5T418pS*x)`MZSOjWr}&wp4t( zbuA7Gon(UsQ6Pe;gDNlOM}c3 zfFt4z6U}p7O&Ph8^=#LLbz+gTr6^g)I*>!Le9vo9A7Yh{bQX)9h3S*-sXePRl;37o zf}I3re(CIq^i9Qe6R#k(=utKV-Zv5y;l`LLsWF1ceU}%Vr8n5Rc0xdu)8tj|9hi+M zuj6RH$=%xqh4GgcoC7CNAEbRJAKk4cq0ZA{Lnj^8N?S_?BggT;yixY7(gp#U6wJ55 zr**Ay&{@=_>p)Xv>`)u1@>yzRYauT?`E&Qot*Y=Pa92?f9u$sxm87V1y<9hJ9-Q8a z0-%GQI^E!%wbd!wkBFr!rLEx5geCe_QhfPl%iZ4n;9y*>zg~N^Iv$L5qirO{ZM#I+Bq#K zdL4N@a_TUrM*iC!&o-xa@}sBfWgy3&&7 z&g+M&neU1JJZ^Ef!-qCx6$X%6M*WL{VB6O@C-&uN-#KD^FoEnvU#h-%uA2H$jVRwP zBjIjr%(|9|AIwAqiwnjBZ!Sx%t4jX4*niw1!Evwc8@~`;pBsB!|C+gUQb42SH#X|q znO3fIK(O&nta%8|Rs!|zY~Cx@#Io^_?=tM0eD&f~R)#OtwLxr8lGKsa=49agR*^}p z7>9zl74a)AxV%w*M-~M`nSDs-Ppr4ZLtIjc=rJ;XN&$qsjL`InNtRtIm|h-(!*#}b zsbcN|--~mah<|dqkpiX|0?-&5DK#3+-4MPUtNR8?-Ct7(EDU|cp~*V!4>(J&J()Ut zHxW%pX9#@MedwB)wxxt3uQFKc=zQ*ST-eXZ(MXZr5uOvP7f6;FA$Nv!c{Vl!q}FsO zreglsJ>MK)nm%%5MAV;DSvVVGnDi$v+}mzYzpCqxwbT}xjb2@f<*;^qDdB}9qu_$h za1hWP$}`t7qX7GU_N?zJ6bft%I>zIpXW-J{#b@vsc7e41I3KUt8H_~?U5OmexFb<# zbSXqdo*^XAp6h*L2cCmXZVWaZ@PP`Ixry0LeU~*o8}x$gvZAkL=v3h1R`yrEAs&sa z8Ex_~cDNU9o@X!9IpVrk3F9p4qIL|1LsVC1)kz@_hfPFoCEt)`BxcZS*f$Lmq2}Fm2m!)-P8_Qi zq9-e?dzFzw=Ue&+D2@wmtZU4rSp1)5FId09y+}$|&d&y2RZJUy!)xJpHckv9KK{9( zf3u;hrZ}LmAfxVh%f)q`Ec5A#ohXTrekzx}fRC67og9SU@pPL{%VUk~KPYvJZQG~R zl2-K?-Gs2)Gk z?GCtRNO1+xss1&rr%TIaB;m@%GqjzIUqjTM3khhn^Ri*Z&xQW|4@6p0yqf-$G`|Uh z?$kED(BPT8b~XDEnX4s8RiTO~I_eeR#0)oz1D`K*uL!ggu`Sqx5;8g~u(W6)T$elD zCF;*Eog6v?+(z?8iB24oWPF%#Sgz@ixSX?|8@X?j5#t|*3Q<{*^j!hzO1r4N1Vy1f z&DoNso7_dBlLD#p3m1n|+hq?+C#{nk7hb;FQQw-+IkWyDRL^u*|H*y1OR>P;j-9D_ ze6rH-*2sgxu)Me1f}+0nLjs;$MHWm`2TfC@4-o{ z<>y3l>iUN&|ER&xQdB!R=E!6Nr?a++loO7nYN&}`?RNFDxi^bm_q8q?7d4pdg7vOO z_DJ7^idDg0z@@LWRP1C-?apmHR0xIG=xb1D%Cl<2=c?)He5c8-V(YN-N2ov?&Bae% zsq2_aeK8GbLm_$im=?%NV8>}Z8SXnl#)^@&-W(`wNfAY*&0poTlOx^VC9gE&?9-4Y+bkrU{*ZG& z@c?{Yk@!;Of2*|&{EC3_drIpC7(mPD5}!|2WdzkwqO&iYY5lp8 zf4$)fcV-6!&xu3W*V!)Q$a>bk8nFzCv7q&En2B(otkDzNeWG6I9eD|_zMqVb288TW z+k2yJGr}o;=ZI#w6=7a1Qs0RU?uimB?39<&6}Vd+6-BehYi@)-Ljsgp_z~JPd~X0X z_UGUKj>h4_N=ZEwz6!YogWW*R?8Kac+UuSdR6BVgkaIXh?`ZS@(5x<*e^V_Inp%+J z-o>>zh#e8WWxNEy11Phl)9{XbH(god3lFtj)c%N*qB)dxjD=cj5}iNDqs6fo#*L8p zQJb$v5M`g%vktZ{B$emG#ktt2jjjBWyd@ZG)~@8CRJewHtfiY|BLPLG9|Ow9*ptv<25=W-OCNL` z2j_(SeC^qvy28-1644Jh6xRc|9D$loB14&*hLEL$!ATaVK$HNY%M6u04>LVV`!inE-mXAf{>q%-sws{k)Go zmgQoDD@8+~ACr`lAuxw?9~XI?ImqvP$|0*ge_o9as04%atQ;F_L0~uJIQM5CJLb{i;QQf=I~zVfPFp?a)}e#|0UID9lVkMi(kC)_U;dN?EP16>OXk(#p&Rv zT|Oj3v%YK^rGtN4H2e1)$T-jT^4$W09jEr`)!aq7I~Je`70+C|H69*(KJPTp!trq> ze9+8rs^#-_z6!Ami+ibBuE}<}C0K#HLJ|yQx)aA7fSV`lCCFY1LV=bgA4;yQmn+dN z6V^;1kMJbSrE5@6$9DgOw)m=+jnlbW*HsM}{}uc;w5y+cll5ZRT)$7}&|BM_R93x6 z@lz-Nc5ex0{AZW!hi_VeV(+(gdGfzK%bCRcuyyl6o@!U?f0y~cDf@4F*%W=;EBV1- zPj)xDIR8gI%X!^P`sMk>_s)8!9iQIrgLXOpld<^ed6w2UuSbbnJY>A(tqrvM-mOqw WxsEzf@eAm0_eY5zHvZ|riT?z2fCIAt diff --git a/website/assets/visustruct-app-swift-german.png b/website/assets/visustruct-app-swift-german.png deleted file mode 100755 index 9c3f581c3d8b1b52af51e15c398845c518abcaa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602014 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 z 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 TQ=G|J? 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%0De3|b7_v)_aduRH<6S_78SVCD?B>$ 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 O!C+P}_^_$A!uFlPxt~ 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 z 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

    r1U2mO;ZtZ|5iD0A8rxV+-d?J*(bY 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∨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 IjYrS_2OGbh1^@s6 diff --git a/website/assets/visuobject/visuobject-en.png b/website/assets/visuobject/visuobject-en.png deleted file mode 100644 index 0675b808e61d29778982668ac72f23b0874b5c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134206 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 z 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%0AC>%Bmm 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ⅇX5ae}72{>#;5iebik(>E>-%~uoV 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

    r1U2mO;ZtZ|5iD0A8rxV+-d?J*(bY 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

    - VisuFlow ${w(h("web_visuflow_subtitle"))} -
    - ${t("new",h("toolbar_new"),I.newFile,h("web_visuflow_new_tip"))} - ${t("open",h("menu_open"),I.open,h("web_visuflow_open_tip"))} - ${t("save",h("menu_save"),I.save,h("web_visuflow_save_tip"))} - ${t("undo",h("toolbar_undo"),I.undo)} - ${t("redo",h("toolbar_redo"),I.redo)} - ${t("delete",h("web_visuflow_delete"),I.trash,h("web_visuflow_delete_tip"))} - - -
    -
    - - -
    -
    - - -
    -